Shell's Home

虹桥机场最长的一天

Apr 22, 2006 - 1 minute read - Comments

昨天应该是个高兴的日子,我跑回北京来办理港澳通行证,按后转去香港旅游。不过看来是什么东西觉得我太高兴了,于是我碰到了乘飞机12年来最古怪的一次情况。 我准备乘11点半的飞机起飞的,这个飞机昨天差的时候座位蛮多,而且后面的航班我也查过,座位也非常多。不过因为10点半的飞机机械故障,一支延误到我离开机场的时候。很多人立即买了后面飞机的机票,或者等待候补。于是我的机会就只有当天最晚的9点航班,并且因为飞机晚点导致此班航班的抵达时间到了12天半。换句话说,我头次乘到了午夜航班。 最麻烦的事情还不是在航班上,因为我一直不能确定候补的状况,所以我就只能一直在机场里面等待,而且每个小时要去问一次,然后重新寻找座位。还要自己帖钱吃饭。 民航的免票,你的名字是女人。

时间消费分析

Apr 2, 2006 - 1 minute read - Comments

前面篇文章A同学说看不懂,OK,这次来个看的懂的。再看不懂去看统计学里面IO表去。 上班的时候总觉得时间不够用,上学的时候不明显阿。我的时间哪里去,做个投入产出分析好咯。 首先做消费分析,周期是周(Week)。所以用周是因为休息基本按周算的,平均的话差异最小。 一周的投入是175H,固定的。 一周的基本产出是这样的: 睡觉8*7=56-60H,固定的。当然,特殊情况可以熬夜。不过天天熬夜的就成苦海神龙咯。 吃饭0.5*3*7=10.5H,固定的。有的人边吃饭便做事情,奉劝饭要好好吃,胃是自己的。 上厕所,刷牙洗脸。这个没啥固定时间的,如果你不拉稀不便秘,再加上其他必须做的杂碎事情,每天大概就是花半个小时吧。0.5*7=3.5H OK,这个是固定产出。你可以不上班不上学,但是不能不吃饭睡觉。吃饭可以蹭可以报公帐,但是事情花的时间不能省。去了这些时间,我们还剩下175H-60H-10.5H-3.5H=101H。 顺便讲解下,有的同学听说做软件的有3W的薪水,觉得很高。其实没啥好奇怪的。如果封闭开发,吃饭睡觉都不许走出去,不许上网不许玩的情况下。周工作时间就是100H,最高工作时间,除非压缩吃饭睡觉。同等也要拿人家两个半月的薪水,何况这种工作肯定要加薪的,能不高吗?如果倒算过来,薪水只有12000。差不多咯。 然后我们就要分配100H去上班上课学习娱乐。这里我们先算下理论的标准工作时间。国家一年有10天带薪假期,一个企业一般也给七天带薪假的。都是白给的。这样就是8(H/D)*17(D/Y)/52(W/Y)=2.6(H/W),就是每周2.6小时带薪假期。那么理论上每周工作时间就是37.4H。 基本上来说这是必须上的班,除非工作性质特殊,否则不上足是要出问题的。我们所需要的就是将剩下的101H-37.4H=63.6H发挥最大效率。这是我们的纯投入,前面的投入只是为了产出能正常工作生活的人。OK,作为一个无奈的事实,我们必须将这个投入中的部分用来做无聊的事情。大致来说有这几样: 坐车走路,我是每天1.5*5=7.5H。自主时间的11.8%就这么浪费了。剩下56.1H。 锻炼身体,我是每周6H,自主时间的9.4%就没了。像坐办公室的,不练身体的话,上班等于伤命,不可不练阿。剩下50.1H。 额外加班,说不准多少时间,具体也算不出来,不过每周总会多出6-7个小时。因为毕竟上班要提前到,宁早勿晚。下班要以后走,宁晚勿早。这种时间很无奈的。,占9.4%,剩下44.1H。(Stella同学,如果刚刚你没有感觉神经一紧怎么这么熟悉,那么我可以肯定你做音乐处理没前途咯) 磨磨蹭蹭东张西望不知道在干吗,偶尔有点时间上网逛逛写个博客。这种时间一般人都会有吧,每天愣个20分钟,一周就是2.4H,占3.8%,剩下40.3小时。 换句话说,每周我们的剩余时间就是40H上下,大致和上班一样。在这个时间里面我们要处理各种个人杂事约会见面看同学吃饭请客逛街还偶尔要拿去加班。如果你人不怎么和别人打交道,那么每周处理下个人杂事5-10个小时就够了,剩下30-35H拿去加班,最高可以加班出周工作70-75H的记录。这就是所谓每周正常加班不能超过36H的由来,再多就妨碍个人正常生活了。不过话说回来,国家规定加班是每周多少呢?我查了查,正常状态下是不超过9H!如果说的苛刻的话,我每天光上下班多出来的时间就快让公司违法了(注:这个时间不能算入加班,所以大家不用高兴)。 但是作为计算机程序员来说,我的时间具有特殊性。为什么呢?我需要不断学习。 举个例子来说,如果说翻译学了外语,他基本不用怎么学习新的知识,因为语言变化速度相对比较慢。但是软件业几年就淘汰一代,如果没有相对的学习速度,吃饭减产是注定的。我们下面就无法进行消费分析了,必须用投入产出分析。

整死人

Apr 1, 2006 - 1 minute read - Comments

我在编译mplayer1.0的时候需要xf86vmode.h文件,这应该是安装某个dev包。根据packages的结果,是xlibs-static-dev。不过系统还提示找不到,事实上,他在libxxf86vm-dev。

debian的桌面研究(二)--完美桌面

Mar 31, 2006 - 1 minute read - Comments

一个系统好不好,不是看他崩溃频率(除非崩溃得比9X还欢),也不是看精美程度(除非比MAC还夸张比windows还花哨看界面就像在看美国大片),而是看功能,看应用程序的多少。linux下面要流畅的工作,大致需要以下几个软件。 firefox gaim lumaqq azureus xmule xmms office eclipse 下面逐个讲解安装过程: firefox:著名的浏览器,功能强劲方便安全 1.aptitude里面找,安不上的纯粹RPWT。 2.debian里面firefox的最新版本是1.0.2,不过网络上面出到1.5了,而且还是比较稳定的。如果要自行升级的请看下面流程,当然,首先先下个firefox的包。 tar -zxvf OOXX.tar.gz chmod -R 755 firefox/ mv firefox /usr/share gedit /usr/share/applications/firefox [Desktop Entry] Encoding=UTF-8 Name=firefox Exec=/usr/share/firefox/firefox Icon=/usr/share/firefox/..#你自己看什么合适吧 Terminal=false Type=Application Categories=Application;Network; StartupNotify=true gaim:聊天程序,要上msn/icq的找他 aptitude里面找,安不上的纯粹RPWT。 lumaqq:聊天程序,上QQ4linux的 安装比较麻烦,首先要安装java4linux。下面我要装eclipse,所以用的是jdk,用jre的也差不多处理。 xmms:音频播放,linux下面的winamp aptitude里面找,安不上的纯粹RPWT。 PS,gnome的菜单包是menu-xdg,放置位置/usr/share/applications,模版如下 [Desktop Entry] Encoding=UTF-8 Name=程序名称 Exec=执行代码 Icon=图标 Terminal=false Type=Application Categories=Application;Network;Develope; StartupNotify=true 根据需要修改添加就可以了。 PS,其实还有两个,realplay和mplayer,不过这两个程序正常debian用的话有点小问题,所以放到下篇说了。

debian的桌面研究(一)--精简安装

Mar 31, 2006 - 1 minute read - Comments

debian应该算是一个比较方便的OS,100M的安装盘就可以自动安装。不过最近debian出了点小小的bug,所以安装过程也要有点技巧的好。下面所说的所有系统都指debian3.1sarge,去年五月出品,是目前最新的版本。 问题出在一个系统核心的更新上,如果默认安装的话就全部都会失败。所以应该在安装的时候中断所有安装更新动作,不安装任何桌面和服务,直接完成安装进入系统。然后更改/etc/apt/source.list加入所有你想要的源(这样安装的速度会比原来快很多),然后运行aptitude -o APT::Force-LoopBreak=1。update一下,有什么可以更新的全部更新上,再选中最新的合适使用的内核和源码(对stable和testing来说,debian的最新发布内核已经没有什么瑕疵可能存在了),然后安装。这个过程大约要下载70-100M的东西,端看你什么时候跑的安装。我这里大约是三刻钟就跑完了下载安装。重启下,用最新内核启动,然后卸载旧内核(不重启的话会非常罗嗦,而且不安全)。这样整个可用系统的最小版本就出来了,装机大约是一个钟头。 然后是桌面环境了,在aptitude里面,选择以下包vim gnome mc x-system-core im-switch gaim选中,然后再选择所有中文桌面和环境(不要用的输入法可以去掉点),这样大约有350M上下的文件需要下载,整个过程约会持续三个钟头。其中设置就不具体说了,不过系统还需要做以下更改。 首先在/etc/X11/xorg.conf里面将mouse类型改成ImPS/2,模拟三键去了。然后修改/etc/X11/xinit/xinput.d/default文件,加入以下内容。 GTK_IM_MODULE=SCIM XIM=SCIM XIM_PROGRAM="/usr/bin/scim" XIM_ARGS='-d' 这样基本来说系统就ok了。

补牙

Mar 28, 2006 - 1 minute read - Comments

最近很倒霉,原来补的位置掉了,所以两天不能好好吃东西。而且刚刚牙痛的时候还贪方便吃芬必得,结果其药物反应。上吐下泄,晚上还打抖发冷,次日微烧无力。反正我以后是不敢再吃了。 今天去补了个牙,花了三十,等了一个钟头,禁食六小时,总算是搞定了。哎,希望别再掉咯。

语言

Mar 21, 2006 - 1 minute read - Comments

如果不考虑实现的难度,理论上说只要能输入16进制的编码就可以编程。不过事实上这种事情即使在小说里面也不会有人去做的,毕竟人的精力是有限的。现在人们一般使用某种语言来进行编程,那么语言的到底是什么呢? 就程序语言的发展来说,最初的语言应该是汇编。这种语言严格来说不具备语言的特征,只是转换可理解的代码到不可理解的代码而已。近代首次语言上的重大突破是IBM公司的forturn语言,这种语言基本具备了高级语言的几大特征。而后就是伴随UNIX一起称霸了计算机界半边天的C,以及同属于C系列的C++/Jaca。目前趋势来看,形式化/结构化语言用Java,操作化语言用C已经成为流行。估计在十到二十年内我们会迎来语言的又一大发展。 任何语言基本来说,都要考虑三大要素。语义逻辑解析,程序操作接口,复用。这三大要素的出现顺序是按时间顺序排列的。 首次出现高级语言的时候,着重是在语义逻辑解析上。主要目的是将人类思考的形式以自然语言的方法描述,转换成可以实现的机器语言。这一时期的语言不能说没有考虑后两者,不过在实现上的却比现在差很多。 程序操作接口是我们注意的第二个要素,我不知道C以前的语言是怎么处理和系统交互的问题的,不过C的解决方案的却不算是很理想的方案。C利用相对独立的和系统相关的代码库来实现接口的抽离,这种方式如同舍弃高级语言中的转跳而使得语言结构化增强一样,是一种无奈的取舍。但是如此一来,操作底层的时候就必须舍弃标准代码,而使用标准代码就却不能完全脱离系统。(关于此点,相信所有被TC中16位的unsigned int困扰过的朋友们都深有体会)于是std标准库就成了半个鸡肋,之所以说半个是因为聊胜于无。java在抽离上比C更进了一步,彻底的同系统抽离了,这使得在形式操作的时候我们可以避免考虑系统差异。但是和刚刚一样,java操作底层是非常差劲的。大家可以试试用java在windows中编写一个服务,注册运行。不过jni的开放在一定程度上弥补了这个问题,上有java,下有C。虽然差强人意,不过也算是比较完美的解决了系统接口的问题。 最后一个问题就是当前我们关心的要点,复用。复用的最大意义就是减少劳动的重复,增加劳动的效率。从目前来看,复用主要是两种形式。黑箱接口,同形重用,而这两者又不是完全割裂的。黑箱接口的核心就是将相同部分组成一个黑箱,黑箱外可以任意操作黑箱。只要遵循黑箱的说明原则,就不必关心黑箱内部是怎么实现的。而同形复用也可以相对称为白箱复用,是指将一系列代码组成一个白箱,对外部并不封闭。在应变的时候需要改变箱内的内容,但是这种改变要么是自动的,要么是轻松的。黑箱多数是运行时复用,而白箱多数是编译时复用。例如库技术,接口,COM(这个应该也算接口吧)就是黑箱。在编译前无需假定操作对象是什么。而C++的模板技术就是典型的白箱,编译前必须假定操作对象。如果编译的时候我们没有编译针对某个类的函数,那么运行时就会出错。 复用和接口有着紧密的关系,假定我们有一套操作下层接口的方法,并且经常被用到。那么根据复用的原则,我们就应该把他封装成复用块。这样,复用块成了新程序的基础。也就是说,对在此上写的程序来说,这些复用的代码是接口的一部分。 我前面曾经说,在十到二十年内我们会迎来语言的又一大发展,主要是在说分布和同步上。目前我们的所有程序都已经从单线程转为多线程了(我指支持,如果你硬要写单线程也可以),然而线程间的同步依旧是非常麻烦的事情。如果线程间共享数据,那么我们必须手工操作同步。java算是比较先进的,可以通过形式化的方式来设定同步。然而这不是语言发展的最终目的,我们的最终目的是要使得同步有一系列明确的机制,只要按照机制来做,就可以不考虑同步的问题。这不仅仅是说本地线程的同步,而且是说如果一个程序在两个地方分别有一个线程,到底应该如何操作。如果能完美有效的解决这个问题,相信我们也就同时解决了诸如B/S好还是C/S好,分布资源的调集等等我们现在非常头痛的问题。

妖怪阿

Mar 7, 2006 - 1 minute read - Comments

硕志公司的员工招聘仿佛是被女巫诅咒过一般,完全找不到人。先是来了个余工,共产党员。然后一个月后辞职,原因是要去日本当地下党……后面来了个刘磊,资深IT工程师。结果头天还说要来,第二天神秘失踪,人找不到,手机一直通,没人接……再后面,再后面是顾工(股肱之臣阿……XXX表打偶……),来了一天。在签约前包袱款款跑了……再后面,再后面就是偶许某人辞职了……希望杨总不要因此花轰。 这种怪异情况基本有以下几种可能。一个是被人恶意整蛊,来了就跑,招不到人。一个是招聘范围太窄,开出天价还是招不到合适的。还有就是薪水不合理,这种薪水招不到合适的人。招来的根本不能开发。按照偶的观点,貌似是最后一个。

装机记

Mar 6, 2006 - 1 minute read - Comments

连续叫了两个月的升级,昨天终于升好了。AMD Athlon64 3000+/E6的内核,200x9频率超到233,FSB933。内存是KST512MDDR400,目前在233外频工作。七彩虹镭风x550ct冰封骑士4,PCIE16,在110MHz的外频工作。总共花了3000大洋,加一个机箱。然后剩下一个C1.2G+256M内存,40G SGU6硬盘组linux试验机。另外还剩下了一个256M内存(居然还是BGA封装),一个三内存条的PIII800M,一个SGB4 40G硬盘,没有显卡没光驱,外加一个机箱。准备出货给赵一博同学……谢谢接盘。 下面说说在本次装机中的妖怪事情,AMD64的片子正常应该是可以点32的系统的,但是我这里上32系统就死机。看上去是内存问题,但是XP内核的光盘系统可以运行,内存测试通过。估计是某种体质上的兼容问题吧。反正64系统能跑,我就不管了。64系统上AMDCPU后可以开DEP,我看了看,这个和64程序基本是一致的。现在只有系统的软件是开了DEP的,也只有系统程序是64位的。这样在溢出攻击上恐怕要特殊点。其它程序统统还是32位模式,不开启DEP。估计其中差异在LARGEADDRESS选项打开上。赵一博同学说ND和DT跑不了,用司机和酒精就好了。只是rich8就不用指望了,那个一定要DT加RP才开的起来……BT哦…… 另外就是系统管理模式的完善,开两个用户,一个admin,一个user。然后用XP的账户选项弄成一个受限用户一个管理用户。受限的那个加PowerUser组,然后所有数据目录都加Administrator组F,User组R,PowerUser组RW。这样一般的受限用户在数据上只读,来宾是看不到,高级是正常用,权限归admin管。再把windows下面的权限调整成adminF,PowerUser只读,User只读,这样一般软件都动不了系统了。然后微调服务和策略,基本就可以完成配置。

分布式软件构架的变革

Feb 22, 2006 - 1 minute read - Comments

分布式软件构架由来已久,从最初的并行计算到现在的大规模网络并行计算,再发展到网格计算。这代表了分布软件的一个变革,而另外一个变革则是从数据-程序-界面合一的构架转换到数据-程序-界面分离的构架。MVC大家都很熟悉吧。现在软件界的三大困扰是什么?安全,效率,可复用。其中程序从界面层剥离开造成了当前你用出bug的程序可以对别人施加影响,而程序和数据层间的紧密结合更加剧了这个问题。还有程序到界面的接口是最影响成本和收益的地方,因为界面和程序的可复用是最能降低成本的。 我们现在流行的一种模式是使用网页界面的B/S模式,诚然,这种模式比C/S模式有更大的优点。客户端与系统无关,这样客户端的可复用性非常好。但是这种模式的缺点也是明显的。网络传输效率低(这个现在没有多少人计较了),构架不合理(人家HTTP本来是传输文件的说),而且不安全。 我们相信将来的软件设计模式是基于分布的,那么可能如何分布呢?我个人认为有两种主要模式,一种是平台抽象式分布,一种是组件抽象式分布。 平台抽象式分布是指软件的运行在一个网络平台上,其具体运行在哪个电脑上,如何协调对象,并不是软件关心的内容。平台负责抽象了机器,平衡了性能,增加了效率,但是对于机器间的传输实时性要求比较高。适用于企业内部的发展方向,以多台电脑平衡性能。均衡性能需求峰值,降低硬件成本,并且可以充分利用旧机器。用于这种分布的基础是分布式操作系统,在系统运行后即无条件陷入分布系统的接管中。前台的模拟为纯终端,后台模拟为纯资源。然后终端向资源登陆。这种模式的近似产品是win2k中的AD,不过AD只提供了资源的访问指向和访问控制,还有权限分散管理模型。而没有提供最核心的内存共享和锁定,还有线程分布和游离运行。 组件抽象式的分布其核心是将一个软件分离到不同的组件中,不同的组件在不同的机器上运行。这种模型更适合于自由的广域环境,当然前提是能成功解决组件通讯的问题。现在这种模型相对前种有更广的发展。这种模型和现在的B/S模式中最大的差异是,B/S模式的用户接口是浏览器和服务器程序共同完成的。从来没有人听说过有页面直接驱动后台组件的吧。如果我们可以用一种抽离语言(JAVA的显示效率太低了)来完成前台的接口部分模块,那么我们应该试图用这种方式来发布软件的前台端。这样软件的抽象更为简单明确,而且可复用性更高。