2015-05-09 Saturday 21:30:58

Node.js

  • 看了《深入浅出Node.js》,理解是Node.js是一个基于V8引擎的JavaScript解释器,主要用来实现Web服务器,亮点是异步I/O,单线程,是一种处理 C10k问题 的解决方案。

  • Node之所以用JavaScript来实现,部分原因是其它语言中已经存在了同步I/O的库,而JavaScript没有类似的包袱。

  • npm -g install 安装后可以用相应的命令行调用包。安装位置 /usr/lib/node_modules

  • 可以用来实现简单的HTTP服务器,与 python -m http.server 类似。

C++

  • Cpp 中可以在程序的任意位置声明变量是因为声明是 Cpp 中的合法语句,而C中声明语句与其它语句是不同的。

  • vector的初始化。

vector<int> a(100, 0);
vector<vector<int> > matrix(M, vector<int>(N, 0));

2015-05-10 Sunday 18:55:51

A re-introduction to JavaScript (JS tutorial)

  • JS的解释器

    • Mozilla SpiderMonkey 的 js ,用 print() 来打印。

    • Node.js 的 node ,用 console.log() 来打印。

    • 浏览器中的 Firebug , 用 alert() 来打印。

  • 数字类型是双精度浮点数,

  • 两个字符串相加是字符串合并。数字与字符串相加时,会先转换为字符串,再做字符串合并。把数字转换成字符串的一种做法是加上空字符串。

"big" + "east" // "bigeast"
3 + 4 + "5" // "75"
"3" + 4 + 5 // "345"
  • 三个等号与两个等号判断相等的区别

1 == true # true
1 === true # false
true === true # true
  • if…​else, for loop, do…​while, while, switch…​case, 以及短路表达式。与C的语法类似。

  • JavaScript中的对象可以看作简单的名字-值对,与Python中的字典、C\++中的map类似。类的定义类似于给字典赋值的函数。

var obj = new Object();
var obj = {} # really like dict in Python!
function Point(x, y) {
	this.x = x;
	this.y = y;
}

成员变量的访问其实就是访问哈希表。有两种方式:

p = new Point(3, 4);
p.x += 1;
p['x'] += 1;
  • 数组是一个特殊的对象,有length成员。越界访问会返回"undefine"。除了用类似C的for循环遍历数组外,还可以用Python类似的for语法来遍历,只不过 变量是数组的下标,而不是数组的元素

for (var i in a) {
	// process a[i]
}
a.push(3);

数组其实可以看作一种键值限制为整数的哈系表,在JavaScript中,Array对象也是用哈希来实现的。数组长度为3的情况下,可直接对a[10]赋值,a[3…​9]的值是未定义的。这在其它语言中是不行的。

数组可以当作vector(push),双端队列(pop, shift)。

  • 函数。

    • 每个函数的参数都可以通过 arguments 访问到,据此可实现可变参数函数。

    • 函数也是一个特殊的对象,每个函数都有 apply 方法。

    • 可以像给变量赋值一样定义函数:

var avg = function() {
  var sum = 0;
  for (var i = 0, j = arguments.length; i < j; i++) {
    sum += arguments[i];
  }
  return sum / arguments.length;
}
  • 递归函数需要命名。

  • JavaScript是基于原型的,它的类其实是用函数对象来实现的。通过给函数对象的prototype增加新的值,可以动态地为对象增加方法。

function makePerson(first, last) {
  return {
    first: first,
    last: last,
    fullName: function() {
      return this.first + ' ' + this.last;
    },
    fullNameReversed: function() {
      return this.last + ', ' + this.first;
    }
  };
}
s = makePerson("Simon", "Willison")
s.fullName(); // "Simon Willison"
s.fullNameReversed(); // "Willison, Simon"
  • 函数嵌套,可以缓解全局变量的问题。

  • JavaScript的函数引用与C语言中的函数指针的区别在于,函数引用除了指针之外,还包含函数内部的变量,它们在函数返回后依然可以被访问到。

Thu 21 May 2015 11:14:47 AM CST

文件大小排序

du -sh * | sort -h

sort的 '-h' 选项在 coreutils 7.5中加入。

2015-05-22 Friday 14:07:24

Mon 25 May 2015 04:54:20 PM CST

Python

  • 函数的参数列表

    • 教程

    • 函数的参数已经存放在list中,但直接把list传给函数是不行的,需要加上星号对list进行unpacking。

  • 最大元素的位置

    • a.index(max(a))

    • index只返回第一个等于max(a)的元素的下标。

Wed 27 May 2015 09:39:37 AM CST

/etc/resolv.conf

  • 用53端口连VPN,如果用自动分配的DNS服务器则无法上网,用Google DNS则无问题。但是 'dhcpcd' 或者 'dhclient' 会经常更改 /etc/resolv.conf,如果要始终使用 Google DNS,如果是 'dhcpcd' ,最简单的方法是将其放入到 '/etc/resolv.conf.head' 中。

  • 还有其它方法,例如配置 '/etc/dhcpcd.conf' ,或者写保护 'chattr +i /etc/resolv.conf' 。

  • 'drill(1)' get information of DNS.

Thu 28 May 2015 02:17:52 PM CST

OpenVPN IPv6

  • 目前应该是路由有问题。而且53端口不能在实验室的电脑上连VPN。

  • 现在是登录系统后,在 'startx' 之前加上 'proxychains' 整个系统的流量都通过ss走。测了一下速度,还可以,因为是IPv6。 my speed

  • 可以开两个tty, tty1是正常的 'startx' ,而 tty2 是 'proxychains startx' 。只是发现在tty2中,zsh会卡住,把zshrc disable掉之后就可以,但很不方便!应该是oh-my-zsh有联网的模块在与proxychains通信?