NYC at Boston

Foursquare成立于两年前,现在公司有六十个员工,网站有六百万用户。
Harry, Head of Engineering, 告诉我现在他们有三十五个工程师,
只有几个是最近才从学校招过去,别的都是有工作经验的,像他自己就是从Google(2004 – 2009)跳过去的。
Harry说他们现在拼命招人,计划年底达到一百个员工,我笑问硕士学位是否是必须的,
他说不用不用,我自己就没有硕士学位。
他问我说你在学校有没有特别的方向,我说我现在跟我的老板做人机交互的项目,
他马上说道这个很重要,因为我们的产品不像别的传统的桌面上的产品,
我们大部分的交互都在手机上,手机屏幕这么小,
如何显示用户最关注的信息,如何能够让用户以最快速度的签到,
这是我们很关心的问题。
Foursquare今年夏天招了三个实习生(包括BD),秋季计划至少会招一个实习生,
但还不确定。
我又问了一下他们是否有在未来对数据进行使用机器学习/数据挖掘来进行分析,
他说这是肯定会的,根据用户的签到可以猜到用户潜在喜欢的餐馆(活生生的Collaborative Filtering Recommendation System),
然后联系这家餐馆,可以做到广告的精确投放,
不过现在Foursquare还没有投放广告,还是集中精力在扩大用户群。
最后我走的时候,在用iPhone上的人人客户端,被他看到了,
他笑问你在用Foursquare还是Facebook(因为都是蓝色色调的app),
我说我在用国产的Facebook,叫RenRen,
他看了一眼说道,还挺像Facebook的(笑)。
Tumblr成立已经四年了,现在仍只有三十个员工,八个工程师。
它给我最深的印象是他们招聘页面上一张张大大的纽约鸟瞰图,
上面写着“纽约市最好的工作”。

就这八个工程师维护的网站流量,排在了全美前三十,
每月的页面访问数达到了六十六亿
他们的VP of Engineering,Matt Hackett一身搭配整齐的衬衫仔裤,
见面一上来也是问我在学校做的项目。
我很好奇地问了他作为工程师头头的日常工作,
他说首先是管理这群工程师,确保他们好好工作,
然后是招聘,说这个占用了他三分之一的时间,
还有就是制订未来三个月或者半年的开发计划。
我问了他现在Tumblr的产品计划,
他说了一大串,举了一大堆数据,
核心就是一个词Scalability, Scalability, 还是Scalability,
增长的太快,总是想办法能够让网站跟上用户的节奏。
然后这两家公司都表达出了招聘时对Generalist的倾向,
希望新来的员工什么都懂一些,然后能够迅速学习相关技能开始工作。
我还问了关于开源项目的问题,Tumblr是否有自己的开源项目,
他们说现在还没有,不过将来是有的。
我问说像Facebook,Twitter这样把自己的许多工具开源出来的考虑是什么,
他就说Tumblr一开始的时候使用前两者开源出来的工具,得到了非常大的帮助,
所以现在他们也会把自己的工具开源出去,也可以帮助到后来有需要的人。
Tumblr随行的另外一位工程师Travis,一个月前从Facebook跳槽到了这儿,
我问他是什么让他决定从加利福尼亚飞到纽约来的,
他就说他从小就在加州长大,在那边上学,想换换环境。
我问他说在这边工作感觉如何,他说这一个月来非常好(笑)。
Travis在Facebook的时候是Operation Engineer,来到Tumblr之后听他的描述,
主要还是负责在分析log,建立sitemap之类的工作。
其实我关心的问题有两个,
一是在创业团队工作的时候,真的会或者要如何去使用各种开发模式?
二是他们的工程师有多高的自主权(大家都听说过Facebook的传说)?
所以我也问了他很多关于公司里工程师与工程师之间,工程师与产品经理之间的互动的问题。
可惜没听得和明白,囧。
倒是Foursquare的模式很让人心动,就是任何人对产品有想法都可以写便签纸贴在墙上,
产品经理或者工程师可以去摘下来写上自己的名字,道:
XXXX正在开发这个项目。
最后总结一下,纵观全国,个人感觉还是纽约客们的口音听得最清楚,
稍微说得不清楚一点哥就表示非常不淡定,
不过天宇说暑假实习回来之后口语听力会大大提高,
所以非常期待。
今天去Boston顺便去了趟MIT,上一次是晚上去的,这次是白天。
在Media Lab的老楼(大白方块)里面看了一个艺术展,可惜大部分的研究组已经搬到新楼去了,
新楼门口明确写着谢绝参观,凭借MIT学生卡入内。
于是去参观了一下CSAIL的总部Stata Center,
发现里面一楼还有一个不小的咖啡厅,然后Berkeley来的M. Jordan正在给talk,
稍稍逛了一下就出去了。
还在附近的著名台湾菜馆“木兰”吃了晚饭,
5.95一份的排骨饭,排骨炸的很香就算了,份量还不少,
还配有卤肉就算了,竟然还有一个十分入味的卤蛋,
Cambridge的学生真幸福啊。
最后从开会的地方往地铁站走的路上,偶遇Google Cambridge的大招牌,
想起来当时Pittsburgh HR还问我说要不要forward我的简历到这边,
就这样了。

_vimrc

filetype plugin indent on
set encoding=utf-8
cd E:Project
colo koehler
set guifont=Courier_New:h10
set shiftwidth=4
set sts=4
set tabstop=4
autocmd FileType html,htm,js,php set shiftwidth=2 | set sts=2 | set tabstop=2 | set expandtab
set expandtab
set nu
set autochdir
我要维护一个_vimrc文件…
就放在这里好了

OSC Main Memory Notes

刚刚花了两个半小时把OSC的第八章-Main Memory读完了,在这里用自己的话总结一下记的笔记。
8.1 Background
第一小节是背景知识介绍。
8.1.1首先提到的是基本的硬件,寄存器、内存和高速缓存(Cache)。还介绍了protection,说用户模式(user mode)下,程序访问的内存空间是有限制的,protection的概念贯穿于整个章节。8.1.2介绍了地址转换机制(address binding),程序在执行的时候会把相应的地址读入到内存中。8.1.3介绍了逻辑地址(logical address)和物理地址(physical address)的概念,逻辑地址指的是CPU产生的地址,而物理地址则指的是内存所”见到”的地址。这两个概念很重要,貌似整个一章都在讨论如何在将logical address转换成physical address。8.1.4和8.1.5介绍了动态读取(dynamic loading)和动态链接(dynamic linking),前者是指一段程序只有当被调用时才会读取。后者是跟静态链接(static linking)相对的一个概念,具体看得不是很明白。
8.2 Swapping
swapping技术可以将进程在内存和一个叫做backing store的地方调来调去。比如一个进程所需要的内存不够了,就可以把它swap out到backing store,等到有足够内存时再把它swap in接着执行。
8.3  Contiguous Memory Allocation
首先呢,内存总是被分为两部分,一部分留给操作系统,另一部分则给用户进程所使用。
8.3.1介绍两种寄存器:relocation register, limit register。前者存有物理地址的最小值,后者存储逻辑地址的最大值。8.3.2介绍了内存的分配方式。最简单的一种是把内存分成为几个固定大小(fixed-sized)的区域(partition)。之后还介绍了hole的概念,指的是内存中所有可以被使用的部分。还介绍了三种分配holes的算法:first-fit, best-fit, worst-fit。8.3.3介绍了碎片(fragmentation)。碎片分为external fragmentation和internal fragmentation两种。前者指的是在分配内存的时候,即使有足够大小的空间,可是这些空间不是连续的。而后者指分配给进程的空间可能会大于进程实际需要的空间,这种碎片主要产生在固定区域大小的分配方式时。最后提到了针对碎片的解决方案:分页(paging)和分段(segmentation),这两大技术也是本章剩余部分着重讨论的内容。
8.4 Paging
分页技术允许一个进程跨越不连续的物理空间。
8.4.1首先介绍两个概念:frames, pages。前者是将物理空间划分成相同大小的部分,后者是将虚拟逻辑空间划分成相同大小的部分。最基本的情况是逻辑地址分成两部分:page number, page offset。在将逻辑地址转换成物理地址时,先通过page table查找将page number转换成frame number,则物理地址由frame number,page offset两部分组成。paging的一个特点是将用户所看到的内存与实际物理的内存分开了。8.4.2谈了硬件对分页技术的支持。最简单的情况是用一堆寄存器来做为page table。可是当page数量特别大的时候,这种方法就不可行了。容易想到的方法是把page table放到内存中去,可是这样子效率太低了。现在的标准做法是使用高速缓存,这种技术被称为 TLB。TLB中的每一项(entry)由两部分组成:key, value。这样子,当查找page number的时候会先到TLB中去查找,找不到再去内存中找,同时将该项添加到TLB中以方便下一次查找。此外,TLB还有一个很重要的参数是命中率(hit ratio)。8.4.3介绍了如何使用paging技术来进行保护,大概意思是当对page number进行转换时会判断转换后的物理地址是否是有效的(valid)。8.4.4介绍了shared pages技术,多个进程可以共享同样的pages。
8.5 Structure of the Page Table
该小节介绍了若干种组织page table的方式。
8.5.1介绍了分层法(Hierarchical Paging),当page特别多的时候,可以将page分成两层。通过外层 page number检索到内层page number,再通过内层page number来检索物理地址。8.5.2介绍了利用哈希表来组织 page table。8.5.3介绍一种inverted page tables的技术,不过看得不是很懂。
8.6 Segmentation
分段技术就像我们写x86汇编的时候,把程序分成不同的段。每一段映射到内存的一部分,然后每一段中的偏移在转换成物理地址时要加上段的基地址(base),同时不能超过每一个段的限制(limit)。
8.7 Example: The Intel Pentium
介绍了Intel Pentium中的segmentation和paging技术,没仔细看,也不太明白。
8.8 Summary
貌似外国人写书都喜欢每一章最后一节总结一下~~~
OS第二次实验学长忘记挖空了,要我们分析代码然后写一个详细的报告……还不如填代码呢:(
只好先补一补操作系统关于内存管理部分的知识了。
本来想今晚把虚拟内存一章也看了,不过貌似精力已经不能很集中了

关于vista下apache+php+mysql+phpmyadmin的安装与配置

先说一下动机:今天决定把数据库的大作业从linux下搬到windows来做,原因是实在没剩多少时间了。在windows下,想写的时候就不用重新启动机器了,在某种意义上还是会节省许多时间。
关于网上这方面介绍的文章已经非常多了, 不论是中文的还是英文的,但是因为机器环境也是千变万化,所以每次我配的时候都是东看看西看看。这次把过程记录下来,以后要是再有机会配置的话参照起来也比较方便,当然如果有相同配置的网友看到了,也希望这篇文章能够给一些帮助。
先说一下环境,
操作系统:Windows Vista Ultimate
Apache_2.2.11+php_5.2.8+mysql_5.1.30+phpmyadmin_3.1.1
apache:
先给一个官方的下载页面:http://httpd.apache.org/download.cgi,在页面里选中” apache_2.2.11-win32-x86-openssl-0.9.8i.msi“进行下载。
下载后双击进行安装,我选择的安装位置是”D:/web/apache2.2″,选一个短一些的文件路径,以后配置也比较方便,基本上就一直next直到安装结束,除了domain那个页面填”localhost”。
vista安装会提示出错,需要一些额外的工作,造成错误的原因是因为安全权限的原因服务不能正确安装。
解决方法:在 命令提示符环境下进入”D:/web/apache2.2/bin”,输入”httpd -k install”,就可以安装了,之后在原路径输入”httpd -k start”,启动apache服务器
因为我的机器UAC 是关掉的,所以这一步就忽略了,不过以以防万一还是象征性地敲一下命令
之后貌似还会提示另一个错误,大意是说80端口不能绑定,可能是IIS造成的。在浏览器重输入”http://localhost”,看能不能提示”It works”,可以就说明服务器已经运转起来了。如果可以运转就不用管那个警告了,如果不行的话google一下警告的信息,网上相关的文章跟海一样。
php:
还是先给一个官方的下载页面:http://www.php.net/downloads.php,注意这里不要选择installer,选择zip package下载自行解压安装。
打开下载后的压缩文件,将文件解压到”D:/web/php”。
这里需要配置一下apache服务器
首先新建一个文件夹”www”在”D:web”下,然后在打开d:apache2.2conf下的httpd.conf 文件
找到”DocumentRoot”,把后面跟着的句子改成”D:webwww”,这个代表你在浏览器下输”localhost”,服务器找到的默认目录,当然以后你把localhost改成别的域名,你输入改了的域名就自动会找到这个目录。
在一大群LoadModule下面添上下面两句话:
LoadModule php5_module “D:/web/PHP/php5apache2_2.dll”
PHPIniDir “D:/web/PHP”
另外找到一大娶AddType,在下面添这句话:
AddType application/x-httpd-php .php
这样子你的apache服务器启动以后就可以跑php了。
然后找到”DirectoryIndex index.html”,修改为”DirectoryIndex index.php index.html”
意思是将默认主页的文件名设置为先寻找index.php,再找index.html。什么意思呢?比如你输入http://localhost,apache会先找你网站目录(这里我们设置为”D:webwww”)下的index.php文件并显示结果,如果文件不存在接会去找index.html。也就是为什么我们平常上网只用输入域名而不用输入指定显示哪个文件,因为服务器会自动指向默认的主页文件。
之后保存httpd.conf,然后重启一下apache服务器。
重启方法有两种,第一种打开开始->程序->apache下的apache服务管理器,打开一个图形界面点”restart”,另外一种方法是通过命令提示符来到”D:webapache2.2bin”,输入”httpd -k restart”,感觉后面一些比较专业,我比较细喜欢,因为如果出错的话还可以看到错误提示信息。
我们测试一下,打开D:webwww文件夹,新建一个文件,文件名为:index.php,打开文件,输入:
<?php phpinfo(); ?>
然后打开一个浏览器,输入http://localhost,看能不能显示php的信息,可以的话就代表我们前面一系列的配置都成功了。还没完,接下来配置MySQL
MySQL:
先给一个官方下载页面地址:http://dev.mysql.com/downloads/mysql/5.1.html#win32,选Windows Essential(x86)进行下载。
下载后点击安装文件开始安装,其中路径选择D:webmysql。
安装完毕后选择配置MySQL,选standard,输入你的root账号密码(一定要记得),然后点下一步让它配置完,到此MySQL就配置完毕了。
接下来的工作是要配置PHP让它能够集成MySQL的模块。
首先打开php的目录将php.ini-dist文件复制一份并改文件名为php.ini。
打开该文件,找到extension_dir,将前面的分号(如果有的话)给去掉,代表这句话不被注释,将”=”后面的路径改为”D:webphpext”,这一步是指定php的动态扩展目录。
然后把下面几句的前面的注释分号去掉
extension=php_gd2.dll
extension=php_mbstring.dll
extension=php_mcrypt.dll
extension=php_mhash.dll
extension=php_mime_magic.dll
extension=php_ming.dll
extension=php_mysql.dll
上面是去掉后的样子…
保存php.ini文件
然后要把php目录下的 libmysql.dll文件copy到windows/system32下
重启apache服务…
测试一下,在浏览器输入http://localhost,看phpinfo()是否显示有MySQL模块。在浏览器按ctrl+F,输入mysql看找不找得到,找得到就说明配置成功了。
一般如果你按我的步骤做下来应该是可以的,如果不行的话问题就很复杂了,建议还是上googlegoogle一下
phpmyadmin:
到这儿我们的工作已经完成90%了,OMG你竟然坚持看到了这里。这就是open source,一切都得靠你DIY,虽然麻烦了一些,但还是蛮锻炼能力的,尤其是遇到莫名其妙的问题的时候,如何在强大的搜索引擎上找到你需要的信息,也是需要技巧的,呵呵。
先给出官方下载页面:http://www.phpmyadmin.net/home_page/downloads.php
phpmyadmin其实就是一个图形化的MySQL管理软件,不过是用php写的,所以需要将上面三个步骤都完成后才能使用它。
言归正传,将下载后的压缩文件打开,将里面的文件夹整个解压到D:webwww下,然后将文件夹的名字改成phpmyadmin。
在浏览器中输入http://localhost/phpmyadmin
如果打开就说明OK了,账号输入root,密码输入安装mysql时我让你记住的那一个,就进去了。
如果失败的话…
如果提示的信息是说php没能连接mysql的话,请参照配置MySQL的段落;如果提示的不是上述信息,google吧…
到这里配置就完成了,如果每一步我给的测试条件都通过了,享受用php写网页的快感吧。提示一下北航用jsp写网页的同学,据身在美国的章鱼同学日志的说法,那边是没人用jsp的,大家平常还是尽可能地多接触open source吧。偷偷告诉大家,北航是有一个open source社团的哦,点击链接打开。
欢迎大家与我交流啊,如果有不明白或者拍砖的同学在下面留言就好了,我会尽我这个菜鸟的最大力量给大家解答的。
参考文章:
1.Vista下最新版Apache+PHP+MySQL+phpMyAdmin安装指南
2.Win下配置Apache2,PHP5,MYSQL5,Zend

"有点恐怖"续集

经过一个晚上的折腾,总算基本上把问题解决了。
解决方法如下:
首先插上320G的大硬盘,安装一个ubuntu,这样各路分区就可以识别这块硬盘了。
然后把这块硬盘卸下来装到移动硬盘盒里,拿到一台非XP的电脑上去(这里非常感谢鲍习武同学的慷慨援助)。
接着使用一个叫做Disk Genius的工具恢复原来的分区,记住这款软件的名字:Disk Genius,这次全靠它了。
然后经过好长时间的搜索,“啪啪啪”把这块硬盘格式化前的分区全给找回来了,接着“啪啪啪”把里面的文件恢复了。结果可怜我原来系统盘找不回来了,估计是因为装了ubuntu文件有覆盖的缘故…不过另外两个“SOFTWARE”、“OTHERS”倒是完完全全给我找回来了。系统盘找不回来,只得重装了。
刚装好现在,正在一个一个软件往回装中,还好之前所有的安装文件我都有留着。
总结:不幸中的万幸,主要损失是我firefox辛辛苦苦整理的搜藏夹和插件全都没了,其余都还好。
教训1:backup is very very important
教训2:不要乱格linux的盘…

感到有点恐怖…

前几天装mandriva linux的时候出了点问题,没装完就强行重启了。后来运行mandriva linux的时候打不开window manager,感觉这个操作系统很不友好,当时也没多想。
结果今天想在原来装mandriva的盘上装一个ubuntu把它盖掉的时候,问题来了。安装ubuntu的时候只能识别一整个硬盘,一个区都看不到。
这里先说一下我硬盘上的分区情况:C区,50G,用来放vista操作系统;D区,60G,用来放软件;E区,160G左右,用来放各种文件;剩余的东西都用来放linux了。
然后于是乎我利用一张番茄花园的光盘进入WinPE,想利用里面的磁盘工具把 Mandriva 的区给格了,结果一看吓了一跳。里面整个硬盘的分区乱七八糟的,那个160G的分区显示的是空闲,而linux的区则隔在160G的空间和60G 的软件分区之间。
我想说把linux的区(含swap分区)给格了,然后在上面装上ubuntu,一了百了,结果…
格了以后重启后根本启动不了,屏幕提示:
GRUB Loading stage 1.5
GRUB loading,please wait…
Error 18
我想说利用vista的安装光盘修复启动,结果根本找不到硬盘。
顿时感到情况有些严重,利用昨天Sun给的工具包把电脑硬盘(320G)卸了,安上之前的那块硬盘(120G,还好当时没把这块硬盘格了)。开机进入Windows后,将那块大硬盘安装到我的硬盘盒里,结果插了几台机器都识别不了。比较恐怖的是,连用分区软件都找不到硬盘。
上网搜了一下,有的人说是GRUB文件坏了,我觉得这种解释比较符合我的情况。解决方法说是到dos下敲一个什么命令,我拿出刚刻好的番茄花园进入了dos,可是根本还是找不到那块硬盘,从何来敲命令啊?
这时有另一种说法,重新安一遍ubuntu,然后再输一个什么命令就可以找回来windows了。
可是我在ubuntu安装选分区的过程,根本就找不到windows,提示的是你要安装就得把整个硬盘格了…
呃…怎样都比连硬盘都识别不了强…然后我就把ubuntu装到了我的300+G的空间上。
现在的情况是…在windows下开一个恢复软件来搜索这块硬盘,以期把我丢失的数据找回来。
明天待续…

使用Notepad++和gcc搭建C语言环境

一直都很喜欢notepad++这个文本编辑器,一是它非常丰富的语言支持,二是它非常快的启动速度,三是它非常好看的字体:D
因为之前一直在琢磨着如何脱离VC++系列的环境来进行一些小的c语言程序实现,之前使用过dev-c++感觉不太喜欢,主要是界面方面的原因,就感觉不是很友好。
终上所述,速度快,界面友好,于是想到了notepad++ 加上一个编译器来实现。google了一下,搜到这篇文章:使用Notepad++和gcc搭建C语言环境
在这里总结一下步骤:

  1. 下载并安装notepad++
  2. 下载并安装Dev-C++
  3. 设置环境变量,将Dev-C++安装目录下的bin文件夹加到系统变量PATH中去
  4. Win+R,输入”cmd”,启动命令提示符,输入”gcc -v”,看环境变量是否配置正确,两种情况
    不正确:呃…上网查一下关于系统变量的设置方法
    正确:会显示gcc的相关信息,跳到第5步
  5. 打开notepad++,选择菜单栏”Run”->”Run…”
    在打开的对话框中输入下面一行字:
    cmd /k gcc -o “E:output$(NAME_PART).exe” “$(FULL_CURRENT_PATH)” & PAUSE & EXIT
    点击保存,设置快捷键F7
    再打开同一个对话框,输入下面一行字:
    cmd /k “E:output$(NAME_PART)” & PAUSE & EXIT
  6. 到此,环境就算配置完成了,写一个”hello world”源文件,按一下”F7″,再按一下”Ctrl+F5″试试,成功了不,呵呵(如果不成功见文章最后的问题)

解释一下步骤中的一些句子:
第一句话表示”编译”。”cmd /k”表示打开一个命令提示符,”gcc”表示编译,”E:output”可以替换成任意你想保存的可执行文件位置,”$(NAME_PART.exe)”表示当前编辑文件的文件名,$(FULL_CURRENT_PATH) 代表当前正操作的文件的完整路径。
第二句话表示”运行”。运行刚刚编译时,输出文件夹下,文件名为当前编辑文件文件名的,可执行文件。(这句话加几句逗号看得清楚一点)
问题:我的系统是Vista Ultimate SP1,配置完要重启一次notepad++才能找到gcc,不知道为什么一开始配置好环境变量以后,通过”Win+R”打开的command就可以找到gcc,而通过notepad++打开的cmd就找不到。重启了一下问题就解决了,比较迥异…