星期日, 一月 14, 2007

google interview: 1st by phone

从原来的公司辞职的时候,其实还没有考虑过再找什么样的工作,只是觉得再那样做下去不会有什么长进了,因为自己产生的很多新的设想都没有办法去实现,工作变成了朝九晚六的坐班,每天就做着那些数据搬运工和系统救火员的 IT 民工事业,提出的想法和意见也没人听,和维护组的那位 Partner 也不太投契,也许有点犯相吧,倒是和其他组的几位比较合得来。

而且象这种游戏公司,做 IT 维护自然会非常了累,加上我这个人对于重复性的劳动本来就没有多少疲劳强度,感觉身体也是一日不如一日。

再者,游戏这种东西,总是难逃圈钱和毒害青少年之嫌,如果可以有别的选择,我想我还是应该做出改变了。

所以,虽然这时候还没有找到下家,但我还是毅然辞职了。因为心里的设想也已经渐渐趋于成熟了。一个是关于 Enterprise Architecture 的架设,另一个是从网上看到一个德国人写的基于用户的包管理方法的原理,觉得可以写成一个软件。于是我打算从这个地方入手,先做点东西出来,可以拿得出手,这样再找工作也有点资本。

于是回家休息了一段时间,然后开始设计基于用户的包管理器。这时候还没有想过要在找什么工作、什么公司。后来覃建议我投到 google,因为那种文化比较适合我的个性吧。

在完成了 0.1.1alpha 版本的时候就回上海了,时间是 11 月了。然后投了简历到 google,以及其他在 51job 上的一些公司。开始文本格式有问题,结果是石沉大海,其他公司也没有消息。无论如何,生计问题不能不解决。后来也投了几次其他公司,跑了两次面试,基本上没什么效果,在面试时也谈到了自己的设想和目标,但似乎不能引起对方的关注。

其实这也很正常。现在想来,是当时在定位上有问题。

后来在 11 月下旬左右又投了一次,这次大概在 12 月中旬收到 google HR 的电话,问了一些诸如大学成绩之类的问题,然后安排的第一次面试,是从美国打过来的越洋电话,因为时差的关系,很早就得爬起来。

这次只是问了一些很基础的问题。例如:

问: IP, HTTP, TCP, 以太网,按协议由低到高排列?
答: 以太网, IP, TCP, HTTP。

问: 子网掩码为 255.255.128.0,问可以容纳多少个 IP 地址?
答: 128 * 256 个。

问: (提示)有没有什么特殊的地址?
答: 是网络地址和广播地址,所以应该是 128 * 256 - 128 * 2 - 2 个。

问: 那么为什么这两个地址不能作为 IP 使用?
答: 广播地址是用来发送广播报文,这样子网中所有的主机都能够接收到;网络地址...
正解: 网络地址可以用来计算路由。

问: traceroute 的工作原理是怎样的?
答: 它首先发送一个报文,设置其 TTL=1,这样在第一个路由器就会返回报文并被 traceroute 记录;然后它设置 TTL=2,一次类推,直到到达目标的所有路由都被记录。

问: 那么它使用的是什么协议?
答: ICMP。

问: 下面是一些 UNIX 的基础问题。请将这些服务和端口号对应起来:
...(省略,比较简单)

问: 如果不知道某个服务的端口号应该怎么办?
答: 查看 /etc/services 文件。

问: DNS 的 TTL 是做什么的?
答: ...(答错,和备份 DNS 的序列号弄混淆了)
正解: 缓存的 Time To Live,即只缓存服务器过多长时间更新一次记录。所以域名解析的变更通常不是立即生效的。

问: id 为 1 的进程(init)是做什么的?(印象中大概是这样的)
答: 是系统中所有进程的父进程,用来 fork 其他进程。

问: 如果父进程中止,那么子进程会怎样?(不记得是否有这个问题,但答案的话是说过的)
答: 子进程由 init 接管。

问: 僵尸进程是怎么回事?
答: 僵尸进程是指父子进程已经中止,而父进程却没有的到其退出状态的进程。

问: 那么为什么要这样设计?
答: 这样至少保证如果一个进程有问题,那么会显示出来。(回答得不是很好,但大体意思答出来了)

问: uptime 的输出是什么意思?
答: 表示1分钟、5分钟和15分钟之内的平均负载。

问: 那么负载是什么意思?
答: 即单位时间内在等待队列中等待执行的进程的数量。

问: 那么进程有几种状态?
答: 运行、等待、睡眠和挂起等。

问: Linux 中做 RAID5 至少需要几块磁盘?
答: 3 块。

问: 如何保证和提高 UNIX 系统的安全性?
答: 首先保证操作系统本身的文件权限和用户的安全性,设置正确的防火墙规则,还有可以添加 tripwire 这样的工具来保证系统的完整性...(回答得不是太好)
补充: 增加良好的认证如 PAM 规则以及 Kerberos,还有 IDS(入侵检测系统)如 snort,并加强监控和日志审查。

可能还有一两个问题记不起来是什么了。

总体上,当时个人感觉还可以。

不过后来回想起来,当时的简历实在是写得太差劲,用语、结构都有问题。用朋友的话说,就你那种简历,竟然还面了几次,简直是奇迹。

一个好的简历是非常关键的,在心理学上称之为定位调整偏见,又称“锚定”,在这里就是给考官的第一印象。基本上每个考官在谈话之前都要看过你的简历的。

所以后来我找了本专门介绍写简历的书,按上面的原则重写之后,效果奇好。不过那时已经失掉 google 的机会了...

know IP/netmask, ask for net address

例如,已知 IP/netmask: 124.74.193.210/255.255.255.224,则网络地址应该是:124.74.193.192。

计算方式如下:
IP: 124.74.193.210 --> 11010010(最后8位)
netmask: 255.255.255.224 --> 0xffffffe0 --> 1110000(最后8位)
在最后8位中,根据掩码取前3位,即 210 中的 110,后面补 0 即得 11000000 --> 192。所以网络地址是 124.74.193.192

ssh forwarding

本地转发:
client$ ssh -L $local_port:server:$server_port forwarder sleep 60
client$ telnet localhost $local_port
例如托管的网络有一台主机拥有外网地址,假设是 123.45.67.89,而另外一台是内网的数据库 192.168.0.3,没有外网地址,并且也没有做防火墙的映射,那么可以通过如下方式来登录内网数据库以进行维护:
$ ssh -L 2022:192.168.0.3:22 123.45.67.89 sleep 60
$ ssh $user@localhost 2022
注意第一个也必须登录,如果第一个登录退出,则第二个也会中断链接。

远程转发:
forwarder$ ssh -R $client_port:server:$server_port client
client$ telnet localhost $client_port
限制和禁止转发:
forwarder:/etc/hosts.deny
ALL:ALL

forwarder:/etc/hosts.allow
sshdfwd-$port: client
/etc/ssh/sshd_config:
AllowTcpForwarding yes/no

这将禁止通过该服务器的所有端口转发,不禁止端口转发尝试的调用。比如,如果禁止 client 上的端口转发,仍然能从 client 上使用 ssh 的 -R 标记建立 forwarder 上的转发端口。

--disable-client-port-forwardings, --disable-client-server-forwarding 编译参数。

星期五, 一月 12, 2007

recompile kernel remotely

有时侯可能不得不远程编译和升级内核,但问题是,如果在启动管理器的配置中设置了新内核为默认选项,而新内核启动失败,那么通常你就只能跑到机房去实地调试了(我不知道机房的管理人员在帮忙重启机器的时候,除了按一按开关之外还能有什么别的帮助?),那么远程编译还有什么意义?

如果本地有和远端一样的主机,那么不妨先在本地进行编译和配置,确保可以启动之后再将内核拷贝到远端或直接在远端编译。在拷贝时注意确保3样东西:
1. kernel
2. Red Hat Linux(如果是)或自己配置的 initrd
3. 所有的内核模块:/lib/modules/$kernel-version

之后最好再运行一下 /sbin/depmod -ae -F System.map-$kernel-version $kernel-version 以确保内核模块都没有问题。

拷贝之后再更改 /boot/grub/grub.conf,添加新的条目。

对于远程的重启操作,关键是 grub 的 grub-set-default 程序和 savedefault & fallback 选项!但目前都不行,不知道为什么?

星期三, 一月 10, 2007

sshd DNS

默认情况下登陆 ssh 时反应很慢,要很长时间才出现 password: 提示。这是因为 sshd 默认会做域名的解析,即将一个 IP 地址作为域名先解析一遍,如果没有成功再作为 IP 使用,而通常是没有的。

要禁止这一点,更改 /etc/ssh/sshd_config:
UseDNS yes --> no

星期五, 一月 05, 2007

SSL 及电子商务在线支付

CLI md5sum for "string"

很多网站数据库的用户表里的密码都是使用的 MD5 值。如果需要比较一个用户的密码设置是否正确,知道明码当然是可以得到 MD5 值的,当然可以编写 PHP 等脚本来生成,但最简单的是使用命令行的 md5sum 命令:
# echo -n "password" | md5sum
注意这里必须使用 -n 选项,否则'\n'被自动加入串,最后的结果就不对了。

同时,MySQL 本身是有一个 MD5() 函数。

但为什么 grub-md5-crypt 每次生成的值都不同呢?

Apache basic configuration for PHP

# Apache Configuration for PHP
LoadModule php4_module modules/libphp4.so
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
DirectoryIndex index.php
"<"Files *.php">"
SetOutputFilter PHP
SetInputFilter PHP
LimitRequestBody 9524288
"<"/Files">"

星期二, 一月 02, 2007

root sudo?

以 root 身份运行 sudo 命令没有不需要输入密码,这与普通用户不同。所以如果在 crablfs 中对 upm(userpack)使用 sudo来进行进程间通信的方式以 root 身份运行某些命令,在换成 preload(LID_PRELOAD)方式后,不需要进程间通信的方式了,但被记录的 sudo 命令不会产生影响。

这意味着被 upm 使用的 installation profiles,如果使用 preload,也是可以使用的!

google talk for gaim

如何为 Google Talk 配置 Gaim?

# 在添加账户窗口中输入下列信息:

* 协议:Jabber
* 用户名:您的 Google Talk 用户名(不包括 @ 符号或网域)。
* 服务器:gmail.com

* 如果您要使用未链接到任何 Google 电子邮件服务的 Google 帐户登录,请输入 gmail.com
* Google Mail 帐户应输入 googlemail.com
* 对于 Google 应用服务企业版用户,请访问应用服务支持中心获取说明。

* 密码:为增加安全性,建议您将此字段留空,但是如果您想自动登录,请输入您的密码
* 别名:请将此字段留空
* 记住密码:如果希望 Gaim 记住密码,请选中此框(选择此选项后,每次登录时系统将不会提示您输入密码)
* 自动登录:如果想在每次使用 Gaim 时连接到 Google Talk 服务,请选中此框

* Jabber 选项:选中如果可用的话请使用 TLS 并取消选中其他框。
* 端口:5222
* 连接服务器:talk.google.com
* 代理类型:使用全局代理设置

网线制作

主要是线头的顺序为,如果左手握住水晶头,将有弹片的一面朝下,带金属片的一面朝上,线头的插孔朝向右手一侧时,可以看到连接头中的8个引脚:
橙白、橙、绿白、蓝、蓝白、绿、棕白、棕

用压线钳剥线时只需要先转一圈,割出裂口,然后用手剥除,不要用钳直接剥除外皮,因为可能切坏里面的线路。排好顺序之后,剪除多余的线,保留大约一厘米多一点的样子,插入水晶头,用压线钳压紧,再用仪器测试,所有的8个 LED 都亮过即可。

双机直接,网卡互联的双绞线和普通的网卡连接集线器的网线不同,它需要进行错线(双绞线),进行错线后,一边是:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕;一边是:绿白、绿、橙白、蓝、蓝白、橙、棕白、棕。这时候测试仪的 LED 灯两边的顺序会不同,只要保证两边的8个灯都亮过就可以了。

有时侯可能会出现接触不好的情况,导致时效,这时可以先尝试用压线钳再压紧一下,通常都会有效,而不必报废一个水晶头。

http://www.pcbookcn.com/article/1917.htm