米米的博客

做了一点微小的工作

JavaScript 函数有多种调用方式,每种方式的不同在于函数内 this 的初始化。对 this 关键字有解释:一般而言,在 JavaScript 中,this 指向函数执行时的当前对象。注意 this 是保留关键字,你不能修改 this 的值。

作为一个函数调用

先看一个最简单的实例,在浏览器中:

1
2
3
4
function myFunction() {
return this;
}
alert(myFunction()); // [object Window]

而当函数没有被自身的对象调用时,this 的值就会变成全局对象。在 Web 浏览器中全局对象是浏览器窗口(window 对象)。该实例返回 this 的值是 window 对象。也就是此函数即为 window 对象的函数,myFunction() 等同于 window.myFunction()。但是此处在使用内部函数时存在一个 this 指向的问题,看下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 注意此处在Node环境和浏览器环境下值不同,
// Node环境下必须去掉var使value成为全局变量。
value = 4;

var myObject = {
value: 1,
double: function() {
//var that = this;
var helper = function() {
this.value = add(this.value, this.value);
};
helper();
}
};

function add(a, b) {
return a + b;
}

myObject.double();
alert(value); // 8
alert(myObject.value); // 1

在这里的 myObject 对象中,我们在 double 这个函数中使用了内部函数并赋值给 helper但是此处的 this.valuethis 指向了全局对象,所以在执行这个函数后全局变量 value 的值变了但 Object 中的 value 属性值仍然是 1,这不是我们想要的结果。《JavaScript 语言精粹》中指出这里是语言设计上的一个错误,this 应该仍然绑定到外部函数的 this 变量中。这个设计错误的后果就是方法不能利用内部函数来帮助它工作,因为内部函数的 this 被绑定了错误的值,所以不能共享该方法对对象的访问权。但是我们可以有一个很容易的解决方案去解决这个问题,对 myObject 进行修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var myObject = {
value: 1,
double: function() {
var that = this;
var helper = function() {
that.value = add(that.value, that.value);
};
helper();
}
};

myObject.double();
alert(value); // 4
alert(myObject.value); // 2

这里使用了一个 that 变量来指向 double 方法中 this 的值即 myObject 本身,这样就可以对 myObject 对象的属性 value 进行修改。

函数作为方法调用

这种方式即为,一个函数被保存为一个对象的属性,在此时此函数被成为一个方法。调用时 this 关键字被绑定到该对象,即:函数作为对象方法调用,会使得 this 的值成为对象本身。实例如下:

1
2
3
4
5
6
7
8
var myObject = {
firstName: "John",
lastName: "Doe",
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
myObject.fullName(); //返回 "John Doe"

另一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
var myObject = {
value: 0,
increment: function (inc) {
this.value += typeof inc === 'number' ? inc : 1;
}
};

myObject.increment();
console.log(myObject.value); // 1

myObject.increment(2);
console.log(myObject.value); // 3

在此例中,increment 方法对 myObject 对象中的 value 属性进行增加操作,increment 函数中的 this 即指向 myObject 对象本身。

阅读全文 »

2018 年的暑期,诸多天文奇观轮番上演:火星冲日、日偏食、英仙座流星雨,这对天文爱好者来说是绝佳的观测机会。在好基友的怂恿下,笔者也正式踏入了天文摄影的巨坑。
笔者在小学时曾拥有一台 700/60 入门级伽利略式天文望远镜,但是其使用的经纬仪是纯手动的,调节精度较差;且望远镜本身存在明显的色差,成像效果不佳。为了满足行星摄影的要求,需要入手一台更为可靠的天文望远镜。目前市面上常见的天文望远镜,一般由三部分组成:三脚架(底座),赤道仪(经纬仪),以及望远镜镜筒。镜筒主体根据成像原理划分,有牛顿反射式、马克苏托夫 - 卡塞格林式和复消色差(APO)式等等。基于其他成像原理的望远镜也能在市面上买到,不过从销量和评价上来看,前文提到的这三种望远镜占主流。在查阅了大量资料,并参考了天文相关贴吧、论坛后,笔者决定入手信达小黑天文望远镜。这是一款入门级牛顿反射式望远镜,其焦距 750mm,口径 150mm,等效光圈较大,适合摄影;赤道仪采用 EQ3D,搭配双轴电跟,在通过北极星校准极轴后,即可进行长时间曝光。
这是望远镜组装完成的状态:

信达小黑天文望远镜

安装 EF 卡口转接环,就可以连接单反相机了:

挂上单反相机

8 月 11 日拍摄的日偏食:

日偏食

由于望远镜自带的巴罗镜只适用于目镜,为了增加拍照的放大率,笔者还购买了一个 EF 卡口的增倍镜。这是使用增倍镜后拍摄的月球:

使用增倍镜打月亮

由于视宁度不佳(以及可能的对焦问题),虽然也成功拍摄了土星,但是土星环的辨识度较差:

土星!

仙后座(以及划过天空的飞机航行灯):

仙后座


本文更新于 2018 年 9 月 28 日:
与学校的青年天文爱好者协会部分(矿里有家的)前辈交流后,发现 EQ3D 赤道仪和双轴电跟仍有许多不足,可能并不是天文摄影的入门首选。如果有足够多的预算,可以购买 NEQ6 搭配 GOTO,该赤道仪的稳定性与鲁棒性都更胜一筹(当然价格也略高)。

在对称加密学当中,恩尼格玛机绝对是承前启后的存在。它将密码学研究从以前的语言文字学中心完全转移到了数学身上。在这里牵涉的密码并不是我们平时邮箱、银行帐号那种狭义概念,那种顶多叫做口令。这里说的密码就是通过某种映射方式,把一篇文章变得面目全非,以达到保密效果;只有特定的转换规律才能将其解密。这篇文章适于电脑控、军事控、历史控、数学控阅读,请做好烧脑准备。

EDIT: This Instructable has won Second prize in the 2013 Radio Shack Microcontroller Contest. Thank You to all who voted!
按:这个作品是 2013 年无线电单片机竞赛的亚军。感谢所有支持这个作品的你们!
EDIT2: An Open Enigma with fake Standup Nixie Tubes like the ones pictured in this Instructable will soon be available as a Special Kickstarter edition.

This is our very first Instructable and this step by step guide will show you how to build a fully functional electronic replica of the world famous German Enigma machine. This Arduino based Open Source project is able to encrypt & decrypt any Enigma M4 encoded message.
这是我们的初号机。以下教程将手把手教你如何完美复刻史上著名的德国恩尼格玛密码机。这个基于 Arduino 的开源程序能够加解密任何 Enigma 机 M4 型(海军型)的信息。
This first ever fully functional Open Source Enigma "exact" Replica was inspired by the Kid's Game to Arduino Enigma Machine by sketchsk3tch.
这个第一台全功能开源完美 Enigma 机复制品是根据 sketchsk3tch 写的《Kid's Game to Arduino Enigma Machine(从儿童玩具到 Arduino 恩尼格玛机)》所作。
Using Multiplexing for the LEDs, this circuit with 115 light emitting diodes uses only 38 pins and the 36 push buttons use only 4 pins total thanks to properly placed resistors (and the P-Channel MOSFETs) in the keyboard loop. These 4 16-Segment displays & an LED for each keyboard button would add up quickly the total number of pins required and even the Arduino Mega would have ran out of pins without the 2 methods mentioned above....
采用多路复用 LED 电路,仅用 38 个针脚的 115 个发光二极管和 4 个针脚的 36 个按键所连接的整个电路,全靠在键盘回路里准确放置的电阻以及 P 沟道场效应晶体管得以实现。要不然,4 个 16 段显示器,以及每个按键上的 LED 将大幅增加所需针脚总量 —— 即使用了 Arduino Mega 板,但如果没用上述两个方法,电路也不能如此简洁。
In response to the overwhelming demand, we designed the PCB and made it available through www.stgeotronics.com. Skip to Step 10 & beyond for more info. We also offer it as a complete electronics kit & an assembled & tested complete product.
面对电路的超额需求,我们在 http://www.stgeotronics.com 设计了专用的 PCB 板。直接跳到第 10 步和以后的步骤可以找到更多信息。同时,我们也发布了测试过的完整电子组装套装。

Step 1: Proof of Concept on Breadboard

第一步:面包板上的论证


Before going all out on the development of this electronic Enigma replica, we wanted to make sure we could properly drive the 16 Segment LEDs. If we can do that, than we will be able to do everything as the rest is only Math...
在开始制作电子 Enigma 机之前,我们先要确保能驱动 16 段 LED 显示。如果成功,我们就能做接下来的所有步骤 —— 除了数学上的问题,一切都是浮云。

阅读全文 »

在 7 月下旬,笔者和同学前往江西萍乡的武功山露营,计划观看火星冲日、月全食等天文现象。笔者携带了 Canon EOS 50D 相机,搭配 17-40mm f/4L 镜头,用以记录登山过程中的美景;还向朋友借了一个 70-200mm f/2.8 的长焦镜头,以备不时之需。下面就来用照片分享这次旅途的经历。

先上三组「AN 对比图」。

优胜美地国家公园 vs 武功山金顶


Mac Sky 壁纸 vs 日出前的云海


阅读全文 »
0%