在问题没出现之前,能不能不把事情整得太复杂?
是不是所有做软件的人都有这种天生的冲动,把系统设计得所有人都看不懂?
究竟是不是需要一开始就把一切都考虑清楚,然后做出复杂无比的方案,去应对你根本无法确定会不会出现的问题或异常?
难道所谓的商用级别的软件都一定要极度复杂、无法维护、一般水平的人根本读不懂,才能称得上是好的软件?
是不是所有做软件的人都有这种天生的冲动,把系统设计得所有人都看不懂?
究竟是不是需要一开始就把一切都考虑清楚,然后做出复杂无比的方案,去应对你根本无法确定会不会出现的问题或异常?
难道所谓的商用级别的软件都一定要极度复杂、无法维护、一般水平的人根本读不懂,才能称得上是好的软件?
一边听着世界杯,一边在网上闲逛。近来《一九八四》又火了起来,个中原因大家也都清楚,于是很想读一下。到当当一搜,发现了村上的新书《1Q84》,跟《一九八四》一起买,便宜不少。但是很意外,居然不是林少华译的,顿感遗憾。读了林少华的博客,不译的原因大概是版权之类,当然也不排除其它什么乱七八糟的隐情。
从《挪威的森林》开始,大学时代几乎读遍了当时村上所有的作品,小说、随笔、散文。那时候读的小说可以说是很不少,但是印象最深、影响最大的却也无非就是村上和王小波。村上小说中瑰丽的想象、莫名其妙的虚空感、人与人之间纠缠不清的关系,构成了他的整体风格;王小波的纵横开阖、天马行空,确实无愧于他行吟骑士的称号。
有时候会想,如果小波现在还在世,会写些什么样的文章呢?如果他有博客,点击率是不是秒杀韩寒呢?可惜英年早逝……
没有了林少华的村上,还会是村上么?我已经习惯了林氏的文学气息浓郁的长句,个人风格强烈的用词,深陷得不行,还能接受他人的译作么?我不想骗自己,还是决定不读了。
最近两天,二奶机经常过热关机,毕竟是老机器了,经不起过高的温度。什么原因呢?top一下发现apache占用CPU高达30%。这就诡异了,我的网站啥时候也没有这么高的访问量啊。查了下access_log,居然有无数的IP来访。whois加上Google,原来是一堆的蜘蛛,大部分来自腾讯和搜狗。简直是疯狗,同时放出几十个蜘蛛来爬,这哪受得了!
我的路由器没有防火墙功能,所以只好在二奶机上弄了。还好上次编内核的时候把iptables编进去了,否则我估计这种天气,内核都编不下去就要关机了。折腾了一番,终于搞定。Gentoo对iptables的支持还不错,emerge了之后/etc/init.d里面就有了启动脚本,简单地看了一下也就会用了。现在我的iptables里面是这种状况,列出来给需要的人参考一下(基本上我把IP在中国的都给踢出去了,谁知道它们在找什么):
# iptables -LChain INPUT (policy ACCEPT)target prot opt source destinationall – anywhere anywhereDROP all – 124.115.4.0/24 anywhereDROP all – 124.115.0.0/24 anywhereDROP all – 122.194.170.0/24 anywhereDROP all – 114.80.93.56 anywhereDROP all – 122.81.25.8 anywhereDROP all – 123.125.66.0/24 anywhereDROP all – 218.5.3.149 anywhereDROP all – 220.181.94.222 anywhereChain FORWARD (policy ACCEPT)target prot opt source destinationChain OUTPUT (policy ACCEPT)target prot opt source destination
iptables -A INPUT -s <ip> -j DROP
买了个ssh,淘宝上到处都是,就不说具体哪家了。价格还可以,一个月3块,先来了一个月尝尝。
速度还行,就是有一点比较讨厌,没法保持连接,一段时间idle之后就被断开了,尝试设了一些参数,还是不行,还是写个脚本来干。
#!/usr/bin/expect -f set timeout 30 spawn ssh wall match_max 100000 expect -re ".*password:.*" send -- "xxxxxx\r" send -- "\r\r\r\r" expect timeout for {} 1 {} { send "ls\r" expect timeout } exit 0 |
其实很简单,就是登录之后每隔30秒就ls一下。估计这样就行了。
使用Lift的SHtml.a()设计ajax调用的时候,老版本的Lift不支持给onclick加入用户自己定义的javascript方法,新版本的有了。
/** * Create an anchor tag around a body which will do an AJAX call and invoke the function * * @param jsFunc -- the user function that will be executed. This function will receive as last parameter * the function that will actually do the ajax call. Hence the user function can decide when * to make the ajax request. * @param func - the function to invoke when the link is clicked * @param body - the NodeSeq to wrap in the anchor tag * @param attrs - the anchor node attributes */ def a(jsFunc: Call, func: () =>; JsCmd, body: NodeSeq, attrs: (String, String)*): Elem = { attrs.foldLeft(fmapFunc(contextFuncBuilder(func))(name =>; <a onclick="{deferCall(Str(name" href="javascript://">{body}</a>))(_ % _) } |
对于jsFunc可以这样理解:
用户定义了一个方法:
function delete(toDelete) { if (confirm("Delete?")) toDelete() } |
那么jsFunc可以这样定义:Call(“delete”),Lift会把它生成的ajax方法作为最后一个参数传递给delete方法。
其实也不是多大的问题,只是方向不对,搞了很久才解决。
移植MAC的这哥们儿提供了一个configure,当然,是根据Leopard生成的,或者更早Tiger,然后对于SL就不工作了。问题在于port里面的yasm不再接受-fno-common这个选项,只能用-fmacho32或者-fmacho64。
我满心欢喜地统统配成64位,结果一跑就core;不过还好开源,直接gdb上,调了半天才发现很多指针直接cast成int,而SL里int仍然是32位的,所以用截了一半儿的地址肯定会core。统统改成32位再来,就好了。
顺便改了一下configure.in,然后重新autoconf一下,貌似这样比较完美。
SL里面看core文件生成在什么地方用这个命令:sysctl kern.corefile;生成core文件么,同样也是:ulimit -c unlimited。
买了个山寨版的这个玩意儿,软件不爽,随即hack之。libusb+pyusb,搞定。不过Mac下面还不行,kernel的module直接claim设备,不知道怎么unclaim。
然后封装了一个简单的库:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #!/usr/bin/python from Queue import Queue from threading import Thread import usb.core import usb.util class Singleton(type): def __init__(cls, name, bases, dict): super(Singleton, cls).__init__(name, bases, dict) cls.instance = None def __call__(cls, *args, **kw): if cls.instance is None: cls.instance = super(Singleton, cls).__call__(*args, **kw) return cls.instance class Lamp(object): GREEN = 0x01 RED = 0x02 BLUE = 0x03 PURPLE = 0x04 X = 0x05 Y = 0x06 WHITE = 0x07 __QUIT = -1 __metaclass__ = Singleton def __init__(self): self.t = None self.q = None self.dev = usb.core.find(idVendor = 0x1294, idProduct = 0x1320) import os if os.uname()[0] == 'Linux': self.dev.detach_kernel_driver(0) self.dev.set_configuration() def __worker(self): item = self.q.get() while item != Lamp.__QUIT: if item >= Lamp.GREEN and item <= Lamp.WHITE: print item data = (item, 0x04, 0x04, 0x04, 0x04) self.dev.write(2, data, 0) self.q.task_done() item = self.q.get() def plug(self): if self.q is None: self.q = Queue() self.t = Thread(target=self.__worker) self.t.start() def unplug(self): if self.q is not None: self.q.put(Lamp.__QUIT) self.t.join() self.q = None self.t = None def on(self, color): self.q.put(color) def off(self): self.q.put(0x00) if __name__ == '__main__': lamp1 = Lamp() lamp2 = Lamp() lamp3 = Lamp() lamp1.plug() lamp2.plug() lamp3.plug() lamp1.on(Lamp.GREEN) lamp1.on(Lamp.RED) lamp1.on(Lamp.WHITE) lamp1.on(100) lamp1.unplug() lamp2.unplug() lamp3.unplug() |
忘记还有其它什么颜色了,暂时用X、Y代替吧。
接到季老师的电话,强化部成立十周年,让我写点东西。
电话挂断,愣了半天神儿,掰开手指头算算,真的已经十年了。这个占据了到目前为止我的人生三分之一还要多的十年,居然这么一晃就过来了。大学毕业、读研、上班、结婚,再过几个月将为人父;那些不同时代的同学、朋友,也都有了自己的家庭和事业,过去的十年,梦一般。
贵国要办世博会之前,我相信大部分人根本就不知道它是个什么玩意儿;贵国要办世博会之后,我还是不知道它是个什么玩意儿,唯一了解的就是:又一个劳民伤财的东西。
城市让生活更美好,某世博承办城市的宣传口号。不好意思,我实在没看出来。
很不幸,我住在这个城市里,看着这个曾经干干净净的地方变得污秽不堪,像一个垃圾场,不下雨漫天灰尘,一下雨满地淤泥。整个城市六千多处工地在施工,道路铺好了拆,拆完了补,补好了再拆,居然还干得很有兴致。脏还不说,施工车辆横冲直撞,一天不知道要死几个人,有人说贵国的世博馆是用屁民的鲜血染红的,很有道理。
为了给世博让道,所有的一切都得靠边。家门口道路拓宽,本来以为是好事,没想到好好的一个路口居然被封了,过个马路要走很远。以前听说某城市办奥运的时候道路封锁,本来5分钟就可以回到家,结果需要绕上个把小时,看来这并不是传言。我一向是很遵守交通规则的,但是这次没办法,我一定要横穿马路,去你妈的规则。况且,这个承办世博会的城市,开车的都是大爷,他们从来不管规则,从来不知道礼让行人,所以是否从人行横道过马路并不重要,重要的是你的脖子转得够不够快。顺便提醒一下那些来自靠左行的国家的人民,过马路时一定要小心,你们是来这里看世博会的,不是送死的。
我不会去看所谓的世博会,也不会让我老婆去(其实她也根本不想去),而且我很希望所有人都不去。
Recent Comments