生活得有多么艰难

生活得有多么艰难

前两天回通化,见了初中刘同学和高中于同学,听他们讲了一些同学目前的状况。我妈还给我讲了一些亲戚的现状。总得来看,我的初中同学过得普遍比较惨淡,高中同学回到或留在通化的都是一方牛人,小康生活,离开通化的都老牛了。留在通化的,牛到我大致提提他们是干啥的,就非常容易人肉出来;在外的牛到,遍布世界各大城市和北大广。亲戚们的状态普遍不咋地,过得比较咋地的亲戚,早在我上小学以前就基本断联系了。

想同学们过得好的好坏的坏,从通化到长春以后,抑郁了几天。然后大学郭同学从四川来长,大家一聚再聚,他们喝酒我看着。大学同学普遍过得不错,像小建早在好几年前已经达到很多人心中的人生巅峰,不过,他本人的巅峰可能还远没有达到。当时学习最好的男生和女生两两结合,现在都过得非常不错。学习其次好的那些散在各研究所和高校,还有的在中学或者教育局成为骨干或领导了。当时的牛人还是牛人,当时像我这样排在最后的还是排在最后。

我突然就明白了思考了十来年的一个问题,为什么成年人要求孩子们好好学习,而自己成天就打麻将,甚至也不是为了应酬,就只是享受。因为在学业告一段落以后,社会阶级就定了型(至少大家这样以为),无论如何努力,再无希望。现在,甚至有不少人认为,一旦出生,社会阶级就已经定型了。这样的时代,以前也有过,倒是不稀奇,比如魏晋南北朝。不过,咱们还是别在这里讨论了,有些人甚至相信中国不存在阶级呢。说起来伤心。

今天下午跟李同学和小牛同学聊天。李同学特意穿了我们结题电化学工作站时的半袖,我们的左袖口上有个循环伏安的图,好像是铂电极扫描铁氰化钾的,我记得。但是当时我神情恍忽,竟然没有注意到李同学用心良苦,虽然我也恰巧穿了这件。不过后来晚上我和李同学在西兰花雕塑喷泉下面遇到了,合了影,算是补了遗憾。下午,我们谈到各种未来和计划。小牛同学说,有些人在很多年里逐渐就忘掉了自己的理想。一叹。

希望我们都能记得自己最初的理想。希望李同学也能够完美实施他的计划。

另一个体会。到长春,开网页,看看新闻和douban,觉得通化的现实与小资们的生活体系,是完全隔离的两个世界。先前在通化的时候,电视的新闻正重复着大约一周前网上的消息,我还以为自己穿越了呢。后来在长春的时候,看到douban上小资们依然故我,又继续推出各种新鲜消息,保持着对他们自己的情怀,也顺便对广大受苦受难的劳苦大众充满了同情的态度。这么伟大的同情,却在这么久的时间里没看到产生什么值得一提的效果,也是奇迹。

我又回到了小资们中间,喝咖啡写代码,提心吊胆怕下岗。生活真是艰难。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

与建一的讨论

建一:

>老师,我因为工作原因又出差来集中开发了…

你总是集中开发,可真得注意身体了。岁数一大,就不如年轻的时候扛造了。

你对于技术的思考和总结,已经越来越有高度,令我欣慰。有你这样的讨论,即
使我在小山村里也不孤独。

>简述的是在2006年到2013年我接触的web开发技术路线变化。

你提到的几种技术,我的体会是这样的:

1.J2EE SSH 与 orm/sessionbean 它们都不矛盾,算是不同的方面吧。它们不能
比较,互相作为补充吧。

2.在你所讨论的角度上,web service 与 SSH 一样,都是一种框架 (或架构) 手
段,它们在软件工程上的原则是相通的,比如倾向于你提到的封装、抽象、约
定,只不过是在这些方面的实现机制和强调的程度不同。就像XP和RUP其实并无本
质不同。

3.no sql 和 mongodb又是与orm/sessionbean类似的技术方向,数据留存。

我的感想:1.框架(和数据留存)都有不少技术,它们无所谓好坏,而是有各自不
同的优缺点 (包括学习曲线的陡峭程度、现有人员的技术程度也算特点,要作为
采用时的考量);工程师的责任,是针对具体项目,根据这些特点优缺点选择合适
合的技术。 2.如果不建立更全局和高度的观点来看待这些技术,是危险的。

4. 框架一直在试图解决一个问题,就是如何"约束"使用者的行为,而不是增加他
们的自由,以保证他们能够以更"正确"的行为使用框架所规范的底层机制,比如
语言。在一定程度上,框架的创造者们成功了。但是同时,使用框架真正的方
法,是理解和构造它们,而不是单纯被动地被约束。理解和构造框架,需要更深
层次的理论知识,更多地探索这些成型的框架的构造原则和动机。

5. nosql一类的数据留存技术,一直在试图解决两个问题。一是提高性能,降低
负载,采用的技术手段包括分布式 (集群、云,全算分布吧) ,二是与现有技术
的结合 (动机是方便程序员使用),比如与OO的结合,比如脱离sql。性能和负载
方面,似乎卓有成效,而与现有技术结合的方向,一部分技术似乎有这样的目
的,即能让傻瓜程序员 (我指的不是那种KISS的S,而是受到培训很少,不希望投
入时间和精力、智力)也编程序。后面这个目的,早在COBOL时代就已经有了,无
论他们取得了多少成果,我仍深感怀疑。我怀疑的原因是,创造性的工作是所有
智力活动之所以有价值的特性,而创造性工作需要严格精确地描述--没有适当的
工具和训练,我不相信正常人类可以使用正常人类语言精确描述任何意图。计算
机又不是神仙,焉能知道你想得是啥,甚至很多人自己都不明确自己想的是啥。
如果自己也不清楚,就变成了希望计算机代为决定,这涉及人是否要放弃自由意
志了。

> 曾经以为走在软件开发的路上,必须不断地在自己身上增加各种砝码,针对于具
> 体技术的砝码。然后你的重量就大了,力量就强了。结果一边走一边发现有些东
> 西慢慢变成负担,又开始甩脱直到轻松,留下的是对于负重的承受力和感知。"在
> 任何一组东西中,最重要的只占其中一小部分,约20%,其余80%的尽管是多数,
> 却是次要的。"

确实,增加的东西,一部分只是暂时的奇技淫巧、眩目的名词,短期可能效果不
错;应该减少的东西,也正是这些。应该留下来的,是基础理论。而所有的新知
识,都应该建立在自己的现有知识结构之上,是现有知识结构的一个演绎结果。

如果突然来了些新名词,却无法用我们现有的知识解释,要么,那就是我们要变
更知识结构了,要么就是这些新名词是骗人的。变更知识结构的,我遇到过的情
况是读《计算机程序的构造和解释》, (1) lamda运算与图灵机等价,所以,这
是一套不同的思考方法; (2)这很接近于Johan Linus以前对我说的,物理或电子
出身的人难以理解"模型",可能正是因为物理和电子工程师构造出的不是数据而
是物理模型,不是对问题的认识,然后建模,而是太早套用到了似乎唯一的既定
的解决方案上。这种什么跟什么是"同构"的,在《GEB》这本大书里有深刻讨论。
确认或猜想某个问题与某个模型同构,非常重要,因为我们可以选择一个更容易
解和对条件依赖更不那么苛刻的模型。

新名词骗人的,那就太多了,大多数新名词我都先归到这一类,如果不是一眼就
能看出来好的,等它著名了再说吧。

> 集大成的东西内部未必单一。平台级的产品,就应当能兼容并包多种形式、各尽
> 其能的模块或子系统,朴素的脚本是利器。这部分是联想到你设计的仪器软件平
> 台,以前没觉得是因为眼界小。

你这一段总结,让我想起了linux内核。这两天我配置linux内核,哗哗失败,一
次又一次。解决不了的困难,如同跟高手过招,屡屡被缠住,不要说攻击,连自
守都困难得很。不过,与高手同行,毕竟收获也很大--如果能幸存下来。linux内
核的结构,我看到的只是make的配置,正有点你说的这个意思。

我的另一个体会,针对你提到的"眼界"。这几天哪位同学来着,重提到一个问
题,研究了一六十三招以后,发现别人早就实现了。前几年Johan Lilius来长春
的时候,我请教他关于整个体系性能的问题,他给我篇论文,198X的。我看了以
后拍大腿,正是我想要的。另一个问题,我当时请教的,他从理认上否定了解决
的可能性。对198X年的论文,我当时提到,这多么令人沮丧,我们头疼很久的问
题,不仅有人解决了,而且解决了三十多年,而且,我们还不知道它已经解决了。
他说,你在博士阶段 (或者做科学研究) 所受到的训练,正是为了提高这种能力。

我们经常看到我们过去的不足,甚至憎恨过去的技术选择,那正是成长的结果。
当然同时,也说明我们那个时候多么幼稚。幼稚,我并不是指经验少,而是指理
论太差。我们一般所说的知识,要么来自基本理论的演绎,要么来自经验的归
纳,别无他途。也正因为别无他途,所以一切新名词都是唬人的。而靠从经验中
归纳,你得活多少年才能有结果啊。所以,基本理论的修养,和从基本理论中经
过漫长的过程推导出结论来的能力,都尤其重要。

本来这只是回复你一个人的邮件,写着写着,痛感我们为幼稚啊什么的所付出的
代价,想着很多别人也可能有同样的经历,或者会有同感。所以,我把回信发到
博客里了。

>以上。保重身体!

请在集中开发中保重,这样过不了多久,你身体就会不如我了。

重申,一切不利于人类繁衍的规章都是扯淡的。

请教:tiny210 linux,尝试s3c-udc与gadgetfs一起使用,失败

请教各位专家。
- 问题:tiny210 linux,尝试s3c-udc与gadgetfs一起使用,失败。
- 错误现象:
1.把usb.c(gadgetfs官方测试程序,我修改过)编译为可执行程序 usb。执行usb时,到向文
件描述符write后死机.
我对usb.c的修改,是为了使之识别 s3c-ucd。按s3c-hsudc.c注释,
   The S3C24XX USB 2.0 high-speed USB controller supports upto 9 endpoints.
   Each endpoint can be configured as either in or out endpoint. Endpoints
   can be configured for Bulk or Interrupt transfer mode.
我试着进行了几种配置,均导致死机。


2. 执行前usb运行前,执行了下述操作,控制台均无报错。
mkdir /dev/gadget
insmod gadgetfs.ko
mount -t gadgetfs none /dev/gadget
此时,
[root@FriendlyARM plg]# ls /dev/gadget
ls /dev/gadget
s3c-udc

3. dmesg的出错信息:
[  299.539226] gadgetfs: USB Gadget filesystem, version 24 Aug 2004
[  353.895836] s3c-udc: bind to driver nop --> error -120
其中第二行是mount操作后出现的。
我猜测,usb.c死机的原因在这里,即gadgetfs加载失败。
请教原因何在?

- 操作系统:
[root@FriendlyARM plg]# uname -a
uname -a
Linux FriendlyARM 3.0.8-FriendlyARM #9 PREEMPT Tue May 7 22:56:46 CST 2013 armv7l GNU/Linux

- 内核配置:
  │ │      --- USB Gadget Support                                                       │ │  
  │ │      [*]   Debugging messages (DEVELOPMENT)                                       │ │  
  │ │      [*]   Debugging information files (DEVELOPMENT)                              │ │  
  │ │      (500) Maximum VBUS Power usage (2-500 mA)                                    │ │  
  │ │            USB Peripheral Controller (S3C HS USB OTG Device)  --->                │ │  
  │ │            *** NOTE: S3C OTG device role enables the controller driver below ***  │ │  
  │ │      <*>   S3C high speed(2.0, dual-speed) USB OTG device (NEW)                   │ │  
  │ │              S3C OTGD transfer mode (enabled DMA MODE)  --->                      │ │  
  │ │      <M>   USB Gadget Drivers                                                     │ │  
  │ │      <M>     Gadget Zero (DEVELOPMENT)                                            │ │  
  │ │      < >     Audio Gadget (EXPERIMENTAL)                                          │ │  
  │ │      < >     Ethernet Gadget (with CDC Ethernet support)                          │ │  
  │ │      < >     Network Control Model (NCM) support                                  │ │  
  │ │      <M>     Gadget Filesystem (EXPERIMENTAL)                                     │ │  
  │ │      < >     Function Filesystem (EXPERIMENTAL)                                   │ │  
  │ │      < >     File-backed Storage Gadget                                           │ │  
  │ │      <M>     Mass Storage Gadget                                                  │ │  
  │ │      <M>     Serial Gadget (with CDC ACM and CDC OBEX support)                    │ │  
  │ │      < >     MIDI Gadget (EXPERIMENTAL)                                           │ │  
  │ │      < >     Printer Gadget                                                       │ │  
  │ │      < >     CDC Composite Device (Ethernet and ACM)                              │ │  
  │ │      < >     Nokia composite gadget                                               │ │  
  │ │      < >     Multifunction Composite Gadget (EXPERIMENTAL)                        │ │  
  │ │      < >     HID Gadget                                                           │ │  
  │ │      < >     EHCI Debug Device Gadget                                             │ │  
  │ │      < >     USB Webcam Gadget                                                    │ │ 

- 其他信息:
1. g_serial.ko与s3c-udc配合,可以与PC的HOST端通信;
我的理解,这表明 tiny210的ucd 确实是 s3c-udc.

2. gadgetfs.ko载入内核(with dummy_hcd + usb.c),dmesg无错误信息。
我的理解,这表明gadgetfs.ko与dummy_hcd可以配合工作。

# lsusb -v
lsusb -v

Bus 3 Device 7 ID 0525a4a4 Netchip Technology, Inc. Linux-USB user-mode bulk source/sink
Device Descriptor
   bLength                18
   bDescriptorType         1
   bcdUSB               2.00
   bDeviceClass          255 Vendor Specific Class
   bDeviceSubClass         0 
   bDeviceProtocol         0 
   bMaxPacketSize0        64
   idVendor           0x0525 Netchip Technology, Inc.
   idProduct          0xa4a4 Linux-USB user-mode bulk source/sink
   bcdDevice            1.00
   iManufacturer           1 Licensed to Code, LLC
   iProduct                2 My Source/Sink Product
   iSerial                 3 1.3
   bNumConfigurations      1
   Configuration Descriptor
     bLength                 9
     bDescriptorType         2
     wTotalLength           39
     bNumInterfaces          1
     bConfigurationValue     3
     iConfiguration          4 The Configuration
     bmAttributes         0xc0
       Self Powered
     MaxPower                2mA
     Interface Descriptor
       bLength                 9
       bDescriptorType         4
       bInterfaceNumber        0
       bAlternateSetting       0
       bNumEndpoints           3
       bInterfaceClass       255 Vendor Specific Class
       bInterfaceSubClass      0 
       bInterfaceProtocol      0 
       iInterface              5 Source/Sink
       Endpoint Descriptor
         bLength                 7
         bDescriptorType         5
         bEndpointAddress     0x87  EP 7 IN
         bmAttributes            2
           Transfer Type            Bulk
           Synch Type               None
           Usage Type               Data
         wMaxPacketSize     0x0200  1x 512 bytes
         bInterval               0
       Endpoint Descriptor
         bLength                 7
         bDescriptorType         5
         bEndpointAddress     0x03  EP 3 OUT
         bmAttributes            2
           Transfer Type            Bulk
           Synch Type               None
           Usage Type               Data
         wMaxPacketSize     0x0200  1x 512 bytes
         bInterval               1
       Endpoint Descriptor
         bLength                 7
         bDescriptorType         5
         bEndpointAddress     0x8b  EP 11 IN
         bmAttributes            3
           Transfer Type            Interrupt
           Synch Type               None
           Usage Type               Data
         wMaxPacketSize     0x0008  1x 8 bytes
         bInterval               6
Device Qualifier (for other device speed)
   bLength                10
   bDescriptorType         6
   bcdUSB               2.00
   bDeviceClass          255 Vendor Specific Class
   bDeviceSubClass         0 
   bDeviceProtocol         0 
   bMaxPacketSize0        64
   bNumConfigurations      1
Device Status     0x0000
   (Bus Powered)

Bus 3 Device 1 ID 1d6b0002 Linux Foundation 2.0 root hub
Device Descriptor
   bLength                18
   bDescriptorType         1
   bcdUSB               2.00
   bDeviceClass            9 Hub
   bDeviceSubClass         0 Unused
   bDeviceProtocol         1 Single TT
   bMaxPacketSize0        64
   idVendor           0x1d6b Linux Foundation
   idProduct          0x0002 2.0 root hub
   bcdDevice            3.00
   iManufacturer           3 Linux 3.0.8-FriendlyARM dummy_hcd
   iProduct                2 Dummy host controller
   iSerial                 1 dummy_hcd
   bNumConfigurations      1
   Configuration Descriptor
     bLength                 9
     bDescriptorType         2
     wTotalLength           25
     bNumInterfaces          1
     bConfigurationValue     1
     iConfiguration          0 
     bmAttributes         0xe0
       Self Powered
       Remote Wakeup
     MaxPower                0mA
     Interface Descriptor
       bLength                 9
       bDescriptorType         4
       bInterfaceNumber        0
       bAlternateSetting       0
       bNumEndpoints           1
       bInterfaceClass         9 Hub
       bInterfaceSubClass      0 Unused
       bInterfaceProtocol      0 Full speed (or root) hub
       iInterface              0 
       Endpoint Descriptor
         bLength                 7
         bDescriptorType         5
         bEndpointAddress     0x81  EP 1 IN
         bmAttributes            3
           Transfer Type            Interrupt
           Synch Type               None
           Usage Type               Data
         wMaxPacketSize     0x0004  1x 4 bytes
         bInterval              12
Hub Descriptor
   bLength               9
   bDescriptorType      41
   nNbrPorts             1
   wHubCharacteristic 0x0001
     Per-port power switching
     Ganged overcurrent protection
     TT think time 8 FS bits
   bPwrOn2PwrGood        0 * 2 milli seconds
   bHubContrCurrent      0 milli Ampere
   DeviceRemovable    0xff
   PortPwrCtrlMask    0xff
  Hub Port Status
    Port 1 0000.0503 highspeed power enable connect
Device Status     0x0003
   Self Powered
   Remote Wakeup Enabled

Bus 2 Device 1 ID 1d6b0001 Linux Foundation 1.1 root hub
Device Descriptor
   bLength                18
   bDescriptorType         1
   bcdUSB               1.10
   bDeviceClass            9 Hub
   bDeviceSubClass         0 Unused
   bDeviceProtocol         0 Full speed (or root) hub
   bMaxPacketSize0        64
   idVendor           0x1d6b Linux Foundation
   idProduct          0x0001 1.1 root hub
   bcdDevice            3.00
   iManufacturer           3 Linux 3.0.8-FriendlyARM ohci_hcd
   iProduct                2 EXYNOS OHCI Host Controller
   iSerial                 1 s5p-ohci
   bNumConfigurations      1
   Configuration Descriptor
     bLength                 9
     bDescriptorType         2
     wTotalLength           25
     bNumInterfaces          1
     bConfigurationValue     1
     iConfiguration          0 
     bmAttributes         0xe0
       Self Powered
       Remote Wakeup
     MaxPower                0mA
     Interface Descriptor
       bLength                 9
       bDescriptorType         4
       bInterfaceNumber        0
       bAlternateSetting       0
       bNumEndpoints           1
       bInterfaceClass         9 Hub
       bInterfaceSubClass      0 Unused
       bInterfaceProtocol      0 Full speed (or root) hub
       iInterface              0 
       Endpoint Descriptor
         bLength                 7
         bDescriptorType         5
         bEndpointAddress     0x81  EP 1 IN
         bmAttributes            3
           Transfer Type            Interrupt
           Synch Type               None
           Usage Type               Data
         wMaxPacketSize     0x0002  1x 2 bytes
         bInterval             255
Hub Descriptor
   bLength               9
   bDescriptorType      41
   nNbrPorts             1
   wHubCharacteristic 0x0002
     No power switching (usb 1.0)
     Ganged overcurrent protection
   bPwrOn2PwrGood        2 * 2 milli seconds
   bHubContrCurrent      0 milli Ampere
   DeviceRemovable    0x00
   PortPwrCtrlMask    0xff
  Hub Port Status
    Port 1 0000.0100 power
Device Status     0x0003
   Self Powered
   Remote Wakeup Enabled

Bus 1 Device 1 ID 1d6b0002 Linux Foundation 2.0 root hub
Device Descriptor
   bLength                18
   bDescriptorType         1
   bcdUSB               2.00
   bDeviceClass            9 Hub
   bDeviceSubClass         0 Unused
   bDeviceProtocol         0 Full speed (or root) hub
   bMaxPacketSize0        64
   idVendor           0x1d6b Linux Foundation
   idProduct          0x0002 2.0 root hub
   bcdDevice            3.00
   iManufacturer           3 Linux 3.0.8-FriendlyARM ehci_hcd
   iProduct                2 S5P EHCI Host Controller
   iSerial                 1 s5p-ehci
   bNumConfigurations      1
   Configuration Descriptor
     bLength                 9
     bDescriptorType         2
     wTotalLength           25
     bNumInterfaces          1
     bConfigurationValue     1
     iConfiguration          0 
     bmAttributes         0xe0
       Self Powered
       Remote Wakeup
     MaxPower                0mA
     Interface Descriptor
       bLength                 9
       bDescriptorType         4
       bInterfaceNumber        0
       bAlternateSetting       0
       bNumEndpoints           1
       bInterfaceClass         9 Hub
       bInterfaceSubClass      0 Unused
       bInterfaceProtocol      0 Full speed (or root) hub
       iInterface              0 
       Endpoint Descriptor
         bLength                 7
         bDescriptorType         5
         bEndpointAddress     0x81  EP 1 IN
         bmAttributes            3
           Transfer Type            Interrupt
           Synch Type               None
           Usage Type               Data
         wMaxPacketSize     0x0004  1x 4 bytes
         bInterval              12
Hub Descriptor
   bLength               9
   bDescriptorType      41
   nNbrPorts             1
   wHubCharacteristic 0x0009
     Per-port power switching
     Per-port overcurrent protection
   bPwrOn2PwrGood       10 * 2 milli seconds
   bHubContrCurrent      0 milli Ampere
   DeviceRemovable    0x00
   PortPwrCtrlMask    0xff
  Hub Port Status
    Port 1 0000.0100 power
Device Status     0x0003
   Self Powered
   Remote Wakeup Enabled
[root@FriendlyARM plg]# 

3. g_zero.ko载入内核,dmesg无错误信息,如下:
[  495.979552] zero gadget: adding config #3 'source/sink'/bf1fad28
[  495.979569] zero gadget: adding 'source/sink'/d9c30080 to config 'source/sink'/bf1fad28
[  495.979586] zero gadget: dual speed source/sink: IN/ep2-bulk, OUT/ep1-bulk
[  495.979596] zero gadget: cfg 3/bf1fad28 speeds: high full
[  495.979605] zero gadget:   interface 0 = source/sink/d9c30080
[  495.979615] zero gadget: adding config #2 'loopback'/bf1fada8
[  495.979625] zero gadget: adding 'loopback'/d9c30880 to config 'loopback'/bf1fada8
[  495.979637] zero gadget: dual speed loopback: IN/ep2-bulk, OUT/ep1-bulk
[  495.979646] zero gadget: cfg 2/bf1fada8 speeds: high full
[  495.979655] zero gadget:   interface 0 = loopback/d9c30880
[  495.979664] zero gadget: Gadget Zero, version: Cinco de Mayo 2008
[  495.979724] zero gadget: zero ready
[  495.998990] Registered gadget driver 'zero'
4. usb.c我修改的那一段,某个版本如下:

/* s3c-udc, high speed. by Young */

} else if 
                (stat (DEVNAME = "s3c-udc", &statb) == 0) {
HIGHSPEED = 1;
device_desc.bcdDevice = __constant_cpu_to_le16 (0x0100);
                fs_source_desc.bEndpointAddress
                    = hs_source_desc.bEndpointAddress
                    = USB_DIR_IN | 2;
EP_IN_NAME = "ep2-bulk";
                fs_sink_desc.bEndpointAddress
                    = hs_sink_desc.bEndpointAddress
                    =USB_DIR_OUT | 1;
EP_OUT_NAME = "ep1-bulk";


source_sink_intf.bNumEndpoints = 3;
                fs_status_desc.bEndpointAddress
                    = hs_status_desc.bEndpointAddress
                    = USB_DIR_IN | 3;
EP_STATUS_NAME = "ep3-int";
}

少年派 vs. 哈尔罗杰

少年派 vs. 哈尔罗杰
今天,看完了哈尔罗杰历险记,十四册。这是很多八零九零后小朋友小时候的读物,不少人盛赞过,陪伴过他们的童年。
哈尔和罗杰是两兄弟,大的十九岁,小的十三四岁。都身强力壮,在历险记里的主要职业是替他们的爸抓各种动物--活捉,然后卖给动物园。这些动物包括,虎、狮子、象、各种灵长类、爬行类、鲨鱼、鲸。凡是能想起来的凶猛的,全抓了。我一度非常奇怪,这些看哈尔罗杰长大的八零九零后们,怎么就会出了那么多环境保护的,比如不用方便筷子,不吃狗肉,不穿动物皮毛的,没有买卖就没有杀害的。看了大半历险记的时候,我开始逐渐明白了。
原因之一是,八零九零后们看哈尔罗杰的可能不算太多。
原因之二是,时代不同了。前两天我听高晓松的青春无悔,月亮,白衣飘飘的年代,什么的,听得我心旷神怡的。然后我就跑到DOUBAN上去搜,看看别人都啥看法。赫然看到一贴评论,原文忘记了,大体意思是 "那个直男横行的时代"。高的歌里也充满了各种文艺的意像,当然也噫噫呀呀了。不过,按二猫妈的说法,歌曲里主要是积极向上和励志的。白衣,充满了向往和留恋,月亮,大气滂薄,风雨欲来。这两首歌,据说都是纪念诗人海子的。诗人海子并非战士,所以他 (不知道为什么)自杀了。不过,那个年代的人选择的是决绝的抗争,死也好,怎么也好。现在的人们,不少会选择哭喊,没人听的话,就哭喊为什么没有人听。
哭喊这种事,少年派也干过。少年派,就是李安导演的那个印度少年。不管是老虎还是lie狗要咬他,还是天上下雨海里浪大,他都叫喊,为什么啊,为什么,或者在猩猩一巴掌把lie狗打趴下的时候大喊,好哎,加油啊。
我看片子的时候,一直在给他出主意,"应该往狗嘴里捅,别来回扫,那样没劲","傻啊,那是老虎,跳啊"。就跟少年派一直在跟上帝商量讨论一样,他也不理我。不过,我在这喊是秉承"大喊大叫是看电影的一部分"这样一个低俗原则,少年派一个劲地想跟上帝对话,是遵循哪条精神病法则呢?果然,上帝一次也没有理过他。大暴雨以后出了太阳,少年派顶礼膜拜那次,并非上帝答理他了,他自作多情而已。他应该学学中国古文,"天地不仁 以万物为刍狗"。
如果光看李安,会以为西方普遍是这种调调,打算靠臣服跟上帝结盟缔约的呢。看了哈尔罗杰以后,我们会了解到,李安只是西方一个流派而已。还存在像哈尔罗杰这样,活捉动物,打算开发亚马逊森林的人们。想想 lengends of the fall,就会知道,还有那种跟上帝绝不合解,最后上帝妥协,或者干脆战死的。此外,李安在西方人眼中,十有八九是个东方人。而此"东方",值得注意,在西方语境中,一般并不指中国及东亚,而是指印度,有时候还包括土耳基伊朗一带。特意提到这点,是希望小资们对西方人讨论李安时提到的"东方"二字不要太自恋,Raj说,这是一部分非常印度的片子。
每当我上面提到"李安"二字,总想说"安"。网上有故事说,说李安当年靠老婆为生,快放弃的时候,他老婆说"安,不要忘记你的理想。"我对他们夫妻俩的对话非常震惊。这段加了引话,在很多中语言里称为直接引语的话里,他老婆称他为"安"而不是"李安"。这是非常有毛病的称呼方法。欧美人才这样称呼别人的名字,不带姓吧,比如简,比如静云 (不是静香,静云全称柳生静云),比如安。中国人似乎只对名字三个字的,才能去掉名字称呼,比如贵福。
直接引语现在越来越多地被记者篡改其中的名词,民工大哥经常使用大学教授才知道的术语,没想到李安或者报道李安的家伙也这么不老实。这让我对他们及他们所报道的电影中引用的上帝说的话也产生了怀疑。上帝可能一声没吱,他们吱吱了半天。
哈尔罗杰在遭遇各种动物袭击时,都没有想到那是大自然或者动物们报复,在吃各种动物的肉时都没有过心存内疚。如果他们像少年派那么吱吱歪歪,估计死多少回了。少年派在海上漂流中的种种,让我想起另一个家伙,作为参照。有个叫 wild 的片子。那里面有个小子,想去阿拉斯加或者类似的地方,远离都市--是不是有小资的汗毛立起来了?他放弃学业攒了些钱买装备,然后去图书馆看了本书,自认为学会了腌肉,然后就去了荒野。爽了半个夏天以后,这家伙遇到个问题就是吃的不够了。好不容易打到一头牛,腌肉的时候因为动作不够快,苍蝇在上面产了卵,失败了,后来他就饿死了。
我看到腌肉的时候忍不住大喊,傻啊,不能把整头牛全腌了的话,腌一半也行啊,腌三五斤也行啊。看了书以后事先没有演练一下要花多少时间么,一头牛需要多少盐,算过没有,试过没有,有脑子没有。
这位兄弟一边赶苍蝇,一边哭 (我记得),一边跟上帝讨论命运为什么如何残忍(我记得)。
对少年派和上面这位兄弟,我想请他们对着哈尔罗杰照照镜子。想对他们说一句,你们对生活哪那么多态度,哪那么多感受哩?谁TM希望关心你们的感受啊。
前一阵子流行弃学辞职走遍哪哪的风,同学们纷纷打算见识一下真实的世界。一位青年旅舍的老板对此吐糟了一段。他说,不少小年轻的,胳膊腿都全乎的,对他说,老板,你看这是我打算走遍中国/世界的计划,已经走过哪哪和哪哪了。老板说,好。然后小年轻的说,住宿费能便宜点么。老板吐的就是这个槽,他说:你乐意走遍哪走遍哪,为什么我应该给你减住宿费呢,你的理想跟我有个P关系。你如果没钱,我可能给你提供打工的机会,挣了钱付住宿费。
直男时代以后,大家都比较乐意叫喊,期待这个世界 (除了他本人以外的其他部分)倾听和乐于倾听他的声音。这个世界如果很忙没工夫听的话,他们就希望上帝能够倾听一下。其实,上帝和这个世界一样都没空。换句话说,这个世界也有很多想发言的,你拿出一秒钟听一下了没?啥都没听,你就敢断言这个世界需要以你的方式拯救,你就去拦运狗的大货车,去当志愿者,去指责别人没有"爱心"啦。
罗素指责他那个时代的教育时提到,有些人认为教育应该有专门给贵族的,教育如何享受生活,另一些教育是专门给非贵族的,教育如何饲候贵族们。少年派与哈尔罗杰的分野,不在对生活有多小资上,而在于,有些人认为自己是不必创造价值,只要感受这个世界就可以了。他们应该去搬砖头扛麻袋,去和真正的自然和谐相处那么一段时间,然后再来讨论这个世界应该如何。
我想起了小资们怀念一个时代抨击另一个时代的一些文章,其中提到,那些了不起的知识分子以及他们的孩子被下放到农村,过的日子有多么惨淡,天理如何不公平。我每读到这些的时候就特别想问他们,那些出生在他们下凡的地方的农村孩子,天理有多么公平。如果说知识分子由于社会分工能够远离生产,那他们的孩子哪个细胞长得与众不同了?
小资们是不是真地信奉"人生而平等"?所以,每个人都应该像哈尔罗杰一样与自然斗争,争得人类包括其他人类生存的权利。所以,有时候我恶意地想,少年派们就应该扔到海里去,而且不必每次都那么幸运,还给他们机会YY与神相处过。
--------------------
博客会手工同步到以下地址:

为什么我们要学习基本理论

为什么我们要学习基本理论
想说这件事很久了,就是我们为什么学习基本理论。我的基本理论非常差劲,很多时候拖了后腿,这也是我对这一点感受很深的原因。
很多同学提到,计算机是个日新月异的学科,每年甚至每个月都在产生新的技术、新的名词。去年可能还很难解决的问题,今年就非常容易了。当年用记事本做个网页那个费劲,现在随便用dreamweaver之类的工具就能画一个来,成了最没技术含量的工作。同学们说,在这种情况下,为什么我们还要学习195X年发明的那些技术,甚至学习电子学这样194X年的技术。
1. 基础理论过时很慢
幸好,我没有听到有同学问,为什么我们还要学习3000年前的数学。一个学科赖以存在的基础,不像新科电视剧,它的出现和消失都是非常缓慢的。即使计算机这样的学科,那些影响到软件工程的理论,也大多在195X年就已经出现了。比如模块化、信息隐藏、编译原理、操作系统。更基本的算法,在电子计算机1946年以前早就出现了。比如世界上第一个计算机程序的作者生活于18XX年,是拜伦的女儿,就是那个诗人拜伦。有人可能会说,她怎么能为计算机这样不存在的东西写程序呢?她当然不是为"电子"计算机写程序,而是个数学家。这倒不是计算机科学为了显得自己有历史,而是她的工作确实是计算机的理论基础--而且对软件工程等有确实的影响。
为什么要学习基本理论,有很多理由。其中一个理由是前一段时间跟建一长聊之后想到的。建一要做一些不止是计算机的工程--事实上,这是一个普遍的现象,我们很少从事纯粹的计算机工作。他遇到的困难之一是,那个领域里充满了各种复杂的细节,其中很多是陌生的。我后来想到,这时基础理论在一定程度上能有帮助。一方面,很多工程类学科都依赖数学,这是共通的那一部分;另一方面,许多工程方法具有相似性,有时候,接近的学科,即使你没有接触,也能猜测到可能会有什么样的机制支持你。这两种情况下,更深刻地理解学科的基础就有意义了。
基础理论的学习,也能帮助学习"方法"。不少同学都提到,大学应该学习"方法",而不是"知识"。 (我略过了另一些观点,有人认为大学应该学习与人交往或者做人什么的。这种观点的价值观估且不讨论,我对它的困惑主要在于,还有一半没上大学的,他们就不需要与人交往或者做人了么?)而"方法"是很难传授的,只有在学习某个东西的过程中才能体悟。学习基础理论,动机之一就是通过它学习"方法"。
这些理论,以及学习这些理论过程中了解到的"方法",在学科的历史中长久地不过时。而你的一生,比学科要短很多,没有见到它们过时的可能。换句话说,那些十年以后就消失了的东西,并非基础理论。
2. 硬件进步的影响呢?
对基础理论的另一种质疑,由学科本身的成长导致。比如,莫尔法则指出,计算机硬件aoao地成长。所以,有人据此认为,程序的优化是没有必要的,又进一步推得,程序优化的技术是没有必要学习的。
我最近在精读CSAPP 就是这本[http://book.douban.com/subject/1896753/]。第四章读了两遍,还有很多没记住,正准备看第四章。这时看到网上有贴子提到,第四章的优化是毫无用处的。他的理由是,你优化了半年,程序效率可能才提高20%,而你这半年啥也不干,或者就只是玩,半年之后你的程序性能自然就达到指标了--因为硬件性能的提高。
这贴子听起来很有诱惑力。如果这个世界以这样的方式运作,那生活简单太美好了,美好到可能很多人都不想活了。你想,如果衣来伸手,饭来张口,啥也不用干,想要啥有啥,所有人都听你的...而根据康德的理论,人类之所以能感受到美,就是因为在过程中感受到自身的力量。
这贴子还有其他的问题,这种美好的生活是不会存在的。没有工作过,没有为别人创造过价值的人,可能难以理解这一点。你工作的意义不仅是实现某个效果(比如你那个程序,没有优化快20%的),而且在于在特定的时间完成这个工作。
我要对每一届进实验室做项目的研究生同学反复说,你的工作不仅是完全某个任务,而是必须在规定时间前完成。凡是在规定时间以后完成的,基本就没有意义了。这跟降落伞差不多,需要你的时候如果你不在,你就永远也不用在了。
为什么。
在万恶的旧社会,有一个时代,叫做486时代。那个时候的主流计算机型叫做486。那时候著名的奔腾还没有出生,像CS这样的游戏还没有它们能运行的硬件。那个时代看碟 (对,基本是碟,而不是AVI) 需要使用硬件解压卡。没有硬件的帮助,CPU的速度还不足以完成播放。那个时代著名的播放器叫做xing,能不用解压卡,但是它是英文的。后来。后来的事件太重要了,我另起一段。
后来,有一个重要的软件出现了,它不需要解压卡就能播放影碟,而且,它是中文的。它叫做金山影霸。是先前和后来著名的金山公司的重要产品。是的,后来有了586,有了奔腾,有了你现在用的这样的机器。这些机器的性能高到不仅不需要解压卡,连声卡和网卡的运算都免了,全在CPU里完成。但是,在金山影霸存在的那个时代,它们全、都、不、存、在。
这就是金山影霸存在的价值,也是你的工作的意义。我在课堂提到的一个比喻这样说,一个将军有多么牛,靠什么度量?如果敌人很牛,天气很差,我方装备非常缺乏,地理环境也不熟悉,而且身陷死地,自己的军队士气低落,全是老农军事素养低下。如果在这样的情况下,你带兵打了胜仗,你就是很牛的将军。如果反过来,敌人全很完蛋,天时地利都利于我方,你的士兵个个特种兵,你也打胜了。那打胜了有什么好说的,应该的啊。
你存在的意义就在于,你能够克服各种困难,完成人所不能。不仅做出来,而且在那个时候就要实现,它们都是你的工作的意义。如果要等半年硬件进步,你的老板为什么要付给你钱?
不仅硬件进步,厂商们,比如MS或GOOGLE还会封装底层的各种机制,让你调用它们的API。它们越封越多,越封越严。一方面,没有对底层的深刻理解,用它们的API做简单的程序非常容易,做难的程序比以前更难;另一方面,如果三两行就能写一个程序了,还是那个问题,你的老板为什么要付你钱。所以,你必须在它们还没封完以前把程序做出来。等它们封完了,你的工作就不值钱了。
3. 有人质疑,那他的聪明呢
这也是跟同学们讨论的一个话题。A同学如果学习了基础理论,才设计出某个程序,和另一种情况比,B同学完全没有学习基础理论,也设计出了某个程序,哪个更牛?
有些人认为,天赋异禀的B同学更牛,他更聪明,更有智慧,更富有创造力。你看,他没看理论,独立地就设计出了与某大公司相同的框架。
不过须知,做工程项目和科学研究,不是奥运会比赛,你聪明不聪明对公司和工资都没啥影响。你徒手或者用弓箭射杀鬼子也没有加分。完全自己设计,不遵循现成的基本理论,不参考 (或否定) 别人的设计,基本是小农经济时代的思维吧。证明你是本小镇最聪明的人又怎么样,你织的布就更好了,就比大机器生产的质量更高更便宜了么?
深入学习基础理论,能避免前人和别人早就做过的蠢事,也更容易重复牛人的成果。你没得到独创的机会,实在是得归疚于生得晚了,要创造也只能创造些别的了。无论你是否知道,是否把耳朵眼睛全睹起来,别人已经创造完了的,总归是创造完了。
有些人误认为古龙莫言之类的创造者,都全身心投入到女人和地方特色中去,两耳不闻窗外事。细读一下他们别的言论你就会知道,他们对于西方文学各种流派和文学基本理论的概念都熟悉得很呢。只是,写小说的时候,跟听故事的读者说不来这些东西就是了。你会跟你的客户说你很了解汇编语言么,有意义么。你应该展示汇编语言的威力。
4. 再说硬件
说到硬件,还有两点。一是,即使半年后硬件进步了,你的优化也还是有意义。如果你优化了20%,你仍然比同样的硬件下别人的东西快20%。就像在列车上奔跑,停步的那个人,还是会落后,不是落后于地面,而是落后于不停奔跑的那个。二是,算法的理论 (和实践) 告诉我们,算法与算法之间性能的差别,比硬件和硬件的性能差得如此之大,以致于一个差的算法,即使运行在银河机上,而好的算法运行在当年的日立小计算器甚至算盘上,好的算法仍然快得多。这个说起来话就长了。
又想起来前一段时间某段对话。某人说,这些东西的技术某公司都有前期研究,所以...言下之意这些工作是不是可以便宜一些。
不能。
有些工作就是体力活,就跟给你家刮大白似的。你会刮也白扯,我给你家装修的时候也不会便宜。不过,问题的另一方面是,如果你不会刮,或者我由于基础理论好,刮得格外好或者格外快,那铁定得加钱了。
5. 最后一段
关于基本理论,齐同学当年提到过一件事。他对考基本概念很反感。我对动手能力强的同学希望考理论的应用,而不考理论,非常理解。
那么为什么还要考察基本概念呢。尤其齐同学还提高,如果按自己的话答,老师就给扣分,老师就希望背下来。
事情是这样,按自己的话答,是不会扣分的。为什么齐同学有此误解呢?估计是他答的知识点不全。基本概念的考核在我做学生的时候,也非常头疼。现在想来,是我理解得不够深刻,所以答得不完整,以后应用的时候也受到负面影响。当然,我并不是说背也来就高超很多,大家都不咋地。
正确地做法是,深刻理解,理解到可以复述,就像背下来一样。你女朋友的电话号码记得那么清楚,为什么用来谋生 (也包括她的生?)的工具,怎么能随手就忘呢?
所以我等读完CSAPP,我还会再次重读第四章。直到能用手把图里的节点以及它们的连接画下来。那个时候,才是真正掌握的开始。
--------------------
博客会手工同步到以下地址:
----
杨贵福
东北师范大学 计算机科学与信息技术学院
--
Sincerely,
YANG Guifu
School of Computer Science and Information Technology
Northeast Normal University
Changchun, P.R.China

重剑无锋,大巧不工。

无不大工。

契约精神,姜戈里的医生为什么要杀奴隶主 (标题有剧透),及编程等乱七八糟的

契约精神,姜戈里的医生为什么要杀奴隶主 (标题有剧透),及编程等乱七八糟的

我看到传闻,说很多人不理解姜戈里的医生为什么要杀奴隶主。他们说,明明已经忍气吞声了那么久,钱也付了,人也赎回来了,只剩了单单一个握手而已,为什么医生要大动干戈把对方杀了,而且甚至没有准备杀完之后的应对措施。

我还看到网上有人答复了这些困惑的同学,并且深以为然。医生为什么这么干,精神病一样,我想先讲个我的经历。就是今天的。

我经常去家附近的一家火锅店吃饭,今天发现手里还有一些代金券,快过期了,所以今天去吃,还带了二猫妈和二猫。整个吃的过程都很顺利,豆腐皮很难吃,而且一煮就碎,我按一般的流程处理,放在那不吃,不讨论,钱照付。到了付钱的时候,出了麻烦。

服务员说,代金券不能想花多少就花多少,限额要按当初领代金券的时候相同比例来,好像是100现金对20元券。二猫妈付钱,跟服务员柔声细语地讨论,领券的时候没说啊。领班路过,一口认定,说了。我对领班说,你别跟她说了,跟我说。

这时候貌似女经理的路过,拦下来。我说,券上没写你们说的这些附加条款。她说,也不能什么都写啊。我说,这个必须写上,我只按写的执行。她说,那也不能你想付100券就付100券啊。

我就喜欢这样的,我就喜欢不讲理的。我本来想说,那也不能你们口头说每次只可以用一块钱的,那就用一块钱的啊,得按协议来。但是我太喜欢不讲理的人了,所以我拍桌子站起来说,我不付钱了,一分钱也不付。然后告诉二猫妈和二猫,你们收拾东西走人,告诉女经理,你赶紧叫保安堵住门口,我不付钱。

女经理拉我袖子,说咱们到吧台说,这里有顾客。我说,对啊,这里有顾客,我就要让大家知道你们不讲信用。我对别人靠近和拉扯我有特别的反感,但是这只有熟悉我的人才知道,所以我不能对此发火,我只能说,你给我念念上面写着什么,我又不是不认识字。然后我态度不错地告诉她,你别碰我啊,你真别碰我。我得承认,这段话很容易令人误解,好像她要打我似的,但是我又不能推她,只好语言通知。

二猫问我,怎么了。我说,他们不讲信用,我跟他们讨论一下。我想起了园长说的话,父母是子女的表率。我想,我得用行动告诉二猫,如果什么东西是你的,如果你还想要,即使一分钱,那么别人谁也不能动,谁动杀谁。

随后我和二猫妈达成一致意见,算了。好吧,我告诉女经理,我准备付现金。女经理又同意我用券,想用多少用多少。我说,我不打算用了,准备留着发网上。女经理说,那也行,用也行,不用也行。我说,你能承认你们企业违背约定这么干是错的么。她鞠躬道歉,说这都是为了维护企业。我躲开不按受,说,你们企业太不讲信用了。背信的人理应承认,守信的人毫无义务原谅。

我想起了很多年前,大学还没毕业的时候,给一些地方干活,拖欠我工资的事。你当初答应我的,每一件事,都要兑现。你现在有困难,关我P事,你的困难是你的困难,不是我的,我有困难的时候也不会求助于你。你以为这是公事,这在我就是纯粹的私事。我会把你的设备抬走,我会跟你吵翻脸,我还可能会放弃工资从而换得痛骂你一顿让你的员工知道你是什么样的人。但是,即使粉身碎骨,没有我的同意,忘记了或者想试图忘记诺言的,都应该被整死。这样的原则,绝对不会变。如果你背弃这个原则,就由我来贯彻。

这些年来,我看到过很多视承诺和协议如无物的人,说完话转脸就忘。我就按他们的原则提醒他们,他们期待用暴力提醒的,我就用暴力提醒,他们期待用强权提醒的,我就用强权提醒。如果我是农民工,绝对不会爬塔吊,我更可能告诉老板,我是讲道理的人,所以我提前通知你,你什么时间前必须还我钱,不然就整死你。

好了,现在谈谈姜戈里的那位医生。网上那位兄弟说,医生的阵营是"守序善良"。善良容易理解,就是好人,比如很多大妈,还有悲惨世界里的超人冉阿让。守序是什么呢?网上那位兄弟提到,守序是中国人特别缺乏的精神,所以咱们不太容易理解医生的做法。守序就是悲惨世界里的沙威的世界观,他认为世界按某一规则工作,他是守序邪恶。这是医生和沙威信仰的共同部分。我信仰的核心部分也包括秩序,集中体现为承诺。医生杀奴隶主的原因,既不是因为羞辱,也不是因为他特别地憎恨奴隶主,并非因为这些积累到了最后一根稻草,而是因为奴隶主攻击了他的三观中的核心部分,秩序中的承诺。奴隶主在最后时刻变更或者说附加了条款,并且认为自己能占到便宜。这也正是我见到咱们中国人常干的一件事,"我再试试多得一点如何,不行就拉倒呗,反正也没损失。"他们不知道有人会在这一刻翻脸,就像女经理可能没想到有人会突然决定不讨论了,而是不付钱。他们不懂,承诺属于信仰,是不能讨论的。所以你想再多得那一星半点的利益可能真的不重要,但是你多于我们既有的协议所索要的,无论多么微小,都是在攻击我的信仰,在叫喊我的信仰是个P。

有人可能会说,这太教条了,难道承诺了你就不能再讨论一次吗?当然能,但是再讨论之是否可以实施,要单纯地取决于我的同意与否。如果我不同意,那么,连讨论也不必,我只要求你兑现诺言。

而且,从你试图背信的一刻起,契约本身就不再存在,我可以任意攻击。当初民国政府与满清末代皇族达成的协议是保留紫禁城,小皇帝在里面仍然是小皇帝。但是后来张勋复辟,溥仪再登基,协议就全部撕毁了,所以张勋倒了以后,皇帝只好去天津当平民。有人可能会说,那孩子都是被逼的。那孩子怎么样咱们不得而知,但是皇位的追求者是在试图投机。投机,就可能失败,就要付出代价。你可以拒绝,或者逃亡,唯独不能背约,背约就准备失去约定中的一切利益。

所以承诺要小心,所以承诺才值钱。所以,有些人一辈子也编不了程序,也学不了自然科学和工程,也无法与西方仍然是列强的民族平等讨论,也无法与任何人平等讨论,只有威逼和被威逼的命运。因为他们不平白,谁也不是谁的奴才,我们大家是诺言的奴隶。因为他们不明白,协议、约定、契约这种东西,是金子做的,只要你轻轻触碰一下,它就分文不值,垃圾一样臭不可闻。被期待遵守这一契约的人,与他们的契约等价。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

解析解和有些人那么值钱的原因,及解决ORACLE加了索引还是非常慢

解析解和有些人那么值钱的原因,及解决ORACLE加了索引还是非常慢

昨天长春的天气让人倍感生活丰富多彩。早上的时候是阴天,然后下了场小雨,小雨还没停,转成下雪。大雪,全年无休,春天以后每天一场,大家正期待这场有能耐的大雪持续到五一节。先是小雪,然后开始刮风,等风把雪吹成斜斜的线条的时候,转成了大雪片子。中午以前,大雪停了,出太阳。太阳晒了一会,起风,终于开始了正常的春天,沙尘暴开始了。

沙尘暴一直没停,到晚上九十点钟,PM10飙升至重度污染。尚未结束供暖期,但是暖气早就停了好几天,大家宅在家里,穿上羽绒服唱热水,透过玻璃看灯光照亮的满天沙子,听外面鬼哭一样的风声。

不过毕竟还是有过阳光,有点阳光,不然这日子可怎么过下去。今天和包师弟还有ZHUMAO分别讨论,解决了两个很有意思的小问题。

一. 解析解

跟包师弟先是听大李yang同学报告stm32的板子加以太网,与PC机间进行socket通信。然后去包师弟家,包师弟给我讲循环伏安法的实验参数间的约束关系,我把它们写成方程。我们打算把方程给偶像,然后看看是否可以有些合作。偶像当时问过我,你们的方程都要求什么计算。我说,有加减乘除,有指数对数啥的,没有找一堆数的最大值最小值。实践表明,有找最大值最小值这种运算。而且在最后一个方程里,我还看到了递代。

我说,这算什么运算,可咋写成方程啊。我还不知道偶像他们是否接受不是方程的东西。

包师弟说:是啊,原理就是这样,我也不知道用方程怎么表示。

我说,迭代啊,然后我讲了段故事。

故事的背景是大李yang同学每周五跟我讨论SICP上的题目,半个小时。那个时间正好是我七八节课和九十节课的课间,我们共进晚快餐,并讨论SICP上他感兴趣的题目。前两周有道题目,是证明斐波那契数列的递归或迭代算法,其结果等价于一个公式。当时我也不知道怎么证,只知道他给出的穷举测试是不够强有力的。回家查了下google,有位牛人给出了不到半屏的证明,提到一个词,我们都熟悉,但是似乎又忘记了,齐次线性方程的特征根。我又查了一下wikipedia,发现前人们早有结论,迭代算法可以等价于齐次线性方程的特征根的什么什么。

所以,我说,至少我们可以用齐次啥啥的把这个迭代法的公式写出来,是一堆指数和lambda什么的。

然后我俩闲扯了一会儿,我说,这个东西估计是个经典算法,就是咱们不知道它的名字啊……然后包师弟给我讲了一下这个迭代的原理是咋出来的。

这时,这一天的阳光时刻到了。我指着其中一行说,这个就是个公式啊,这不就是什么什么然后再什么什么吗。包师弟说,听着倒是像,不知道是不是等价。我请大李yang同学把包师弟的代码和我的公式分别实现一下。此时,包师弟在厨房开始炒菜,一边跟我们说,mvs设成多少多少,rs设成多少多少,再试一次;大李yang同学靠墙坐地板上,本子搁腿上pilipala敲键盘;我在包师弟找到一个木鱼,做成青蛙的形状,它嘴里叼个小木棍,拿这个小木棍刮它的后背,就发出蛙鸣,声音还非常像,我这个时候就负责刮它的后背,感叹,"真是什么牛人都有啊,这也能做出来。"

目前为止,我的公式与包师弟的迭代看起来还是等价的。这个公式的价值不在于让代码从五六行缩为一行,或者执行效率有多么高。让我兴奋的是,这是一个实例,我十多年前考研究生的时候寻找的东西,问题的解析解。虽然只是一个实例,正如阳光虽然只露了那么一下头,也足够令人高兴一下。

二. 有些人那么值钱的原因

跟包师弟讨论其间,给ZHUMAO打个电话,说,你们啥啥服务器坏了啊,我从什么什么链路上去,估计哪哪的用户也访问不到了啊,你们赶紧修吧,别让人投诉了啊。

ZHUMAO片刻之后说,修好了,然后说,你在哪呐。我说我在包师弟家,他说,你回不回家啊。我说,回,我没跟包师弟"在一起"。他说,那你吃完饭到我这来吧,我十点才走。然后,我和包师弟"分手"以后,就去找ZHUMAO。

去找ZHUMAO的过程挺现代化的。我在图书馆门口掏出一卡通,嘀,然后推三脚滚闸进门,上电梯,穿过阅览室,来来往往很多同学,空气里全是人味。刷卡,嘀,通过东北特色馆藏,灯明瓦亮空间开阔,一个工作人员对着墙沉思,画什么图。往里走,再刷卡,嘀,进门,看见大间办公室,办公室里很多小隔间,很多机器,嗡嗡地响,ZHUMAO一个人缩得小小的,坐在角落里。

我俩跟谁也没看见谁似的,我卸护膝护腰,他在那pilipala摘键盘。我说,你整啥呢。他给我看,你看,这个东西整差不多了。

我说,咋这么慢捏。

他说,是啊,在mysql里也没这么慢呢。

我凑过去看屏幕,他用JSP写的东西,从oracle里select东西。

我说,是,oracle值钱,值钱的都这样?

值钱的东西倒底比不值钱的东西好在哪里,有很多个故事,以后再说。

1. 你用 sqlplus 执行一下你那几个语句试试。

还是慢。

这个测试的动机是,分离性能问题的原因,到底是JSP,还是数据库部分。

我又抻头过去看,如果不贴到显示器上,我基本上啥也看不到。我说,哎呀,你用的不是我给你的select语句啊。他说,都一样。我说,别扯了,我看好几个字母都不一样,你查下我邮件,试试我的。

试了,还是慢。

2。我说,你加索引了吗?

加了啊。

在哪呢,你给我看看。

这呢。他展示了两个索引。

我说,那就是索引名字,我也不知道你索引的是哪个字段啊。

怎么显示索引的是哪个字段啊。

我也不知道。

重建一个吧。

好。

ZHUMAO又建了个索引,用我的SQL语句,在sqlplus上执行。啪,结果就出来了,瞬间。

ZHUMAO指着结果,但是数据不对啊,这都些什么玩意。

3. 对比一下我的语句和他的语句,啊,我没加 order by

所以顺序是乱的。加上,结果对了。

然后他用JSP一跑,完了,速度又下来了。JSP里一共两条SQL语句,一个升序排列的,一个降序排列的。我们刚才只测试了升序的,再单独在sqlplus下跑了一下降序的,非常慢。原来是降序那句把整个速度拖下来了。

4. 降序

也建索引了啊,这二分法查找,升序和降序还不一样吗。我自言自语,这建的都是啥索引呐。我的意思是,这都是些什么糟烂索引。ZHUMAO很正经和权威地回答,建的是B+树索引。

我突然想起来,B+树升序和降序好像根本不一样。我也不确认,不过,再建一个没有啥负面影响。

我们又建了降序的索引,select速度还是不行。至此,我算陷入绝境了,唯一知道的是,要么索引没建上,要么没用上。于是,我转去研究桌上的一根 不锈钢棍子,以前从来没见过。有不到20厘米长,直径二三厘米,上机标着USA。我说这是值更的时候砸坏人的么。ZHUMAO说,不是,这是签到的。我说做成这样干啥。他说,怕值更的人把它破坏了。我哈哈笑,脑海中浮现出ZHUMAO穿着教父里美国警察的制服,手里拎着个大手电筒一样的,银光闪闪的家伙,一边走,一边往沿墙的一排暖气片上嗑,当当当当地走过走廊。

我说,还是google吧,索引这玩意可能没那么简单。ZHUMAO说,不用了,我有书。一会他指着一行字给我看,优化器不知道你建立了索引,然后给我念一行代码,让我加在select里,告诉它用哪个索引。

瞬间,结果就出来了。性能问题完全没有了。

ZHUMAO拿的那本书一点也不厚,估计也就100页左右,名字叫《Oracle索引技术》。

我说,我现在知道为什么有些人那么值钱了,oracle dba的存在是有原因的啊。他们不会花费大半个晚上,才解决这种加上一行就能解决的问题,他们都是在问题上瞄上一眼,然后说,在这个位置锯开,把线圈去掉三匝。

新拍的照片和画在这里 [http://www.douban.com/photos/album/100752322/]。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

用graphviz画机房拓扑的几个关键词

用graphviz画机房拓扑的几个关键词

我准备用graphviz画机房的拓扑图。用excel或txt记录机器和VLAN什么的信息,用antlr写个工具解析,然后生成dot文件,最后用graphviz把dot画出来。

想到有这么几个基本技术,今天试了一下。下面的这段代码就是例子。行号是我加的,为了说明方便。执行结果如图所示。

建一同学提到用graphviz画UML,请参考 plantuml。不知道为什么被墙了。

1 // dot -Tpng test.dot -o test.png; eog test.png
2 digraph a
3 {
4     node1 [label="NODE1", shape=none, image="pc.png", labelloc=b]; // color=white,
5     node2 [shape=box3d];
6     node3;
7     node4;
8
9 //    edge [weight=100, arrowhead=none];
10     node1 -> node2 [taillabel="tail", headlabel="head", labeldistance=3, labelangle=-45 ,label="label", sametail="a"];
11 //    edge [weight=0.5, arrowhead=none];
12     node1 -> node3:se [sametail="a", weight=100];
13     node3 -> node4;
14    
15     {rank = same; node2; node4; };
16    
17    
18 }

1. 定制节点

默认的节点是矩形圆形多边形这样规则的形状。可以使用图片,人类看起来漂亮一些。

参见第4行,image="pc.png"。

2. 线连接的位置

有些节点要连出去很多线,线连接的位置如果散开,有时候比较难看。sametail可以让它们都聚在一起,参见第10和第11行。

也许,有时候想从特别的角度连到节点上,可以指定方向,参见第12行node3:se,表示从东南方向连接。

3. 题注的位置

用了定制的图片以后,题注标在节点正中就有些不合习惯,可以用labelloc指定位置。参见第4行,lableloc=b,b表示底部。

线的题注 (这东西叫题注么?) 除了label本身以外,可以用taillabel,headlabel,分别标在箭尾或箭头。标在箭尾或箭头的题注,可以用labeldistance=3, labelangle=-45进一步修订,参见第10行。

4. 节点的位置

某个节点,如果希望它跟别的节点平级,用rank,参见第15行。rank不仅能same,还可以起名字。这一技术还可以用于水平的图,让时间与事件对齐。

还可以用node的属性pos指定节点位置。实验表明,1.需要给出所有的node的位置,2.要使用neato引擎,不能用dot本身。而且,我在实验中发现,想指定一个合理美观的节点位置实在太难了。如果想强调某个结点的核心位置,请参见下一条。

5. 连线的位置

如果想强调某根线,用weight。weight越大,线越直,线连接的节点间距离越近。参见第9、11、12行。

weight是edge的属性,因此既可以加在某条线的后的"[]"里,也可以如第9行的写法,从此向下的edge都具有这样的属性。

更多细节,请参考[http://www.graphviz.org/doc/info/attrs.html]。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

今天我生日

今天我生日

今天我生日,不过亲爱的各位请别祝贺了。前两天我下半夜睡着睡着,突然想
到,还有20年多一点我就退休了,如果按工作年限,就只有15年了。悚然一惊,
从梦里醒过来,翻来覆去想了很久。

也许15年或20年对有些人来说还很远,可是对我来说不太一样。从能够独立计
划,不必按老师安排学习以后,我一般订计划是以五年为期的。而今发现,这样
的周期只有三四次而已了,令人叹息。三次四计划,又能完成些什么呢。

我想起初中还是小学读到的一个日本作家的话。他当时确诊为癌症,医生说还能
活一年半吧,他写了本书,叫做《一年有半》。他说:一年半确实非常短暂,不
过无论谁,所余的生的日子与死后的无穷岁月相比,都不仅是短暂,而且趋近于
无。读到这一篇的时候,我只是感叹而已,心里倒是确认需要数日子的人里肯定
不会有我的。如今,各位,所余无多,当好好珍惜。

最近拍的照片,还有画的画,在
[http://www.douban.com/photos/album/100275452/]。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

创意,有时候啥也不是

创意,有时候啥也不是

那天和李记者喝酒,我说,你注没注意我跟你说话的时候从不注视你的眼睛,没有眼神交流,就盯着桌子或者墙。他说,我还一直以为你那是眼神空洞,表示睿智呢。我说,那是因为反正我也看不见,看哪都差不多。有的时候,只是傻看着这个世界,想说的很多,却不知从何说起。

今天说说创意吧。说说创意啥也不是的时候。当今之世,有人说这是个"创意"的时代。他有证据的,你看乔布斯吧,他的创意就好,手机啊MP3什么的,到了他的手里,就成了流行元素。这是"有人"最近的观点,他们在早些年举的例子是比尔盖茨。不过,他们刻意或无意地,回避了乔布斯其实很多年前就出过传记,那时候他还没死,还不是传说的时候。他创意过苹果和苹果II,最早的个人计算机,流行一时。不过如果你这就得出了创意无敌,还早点,他在苹果II以后还创意过好像叫Lisa的电脑,用据说第一款鼠标,还创意过一个NETX或者类似名字的公司,二者基本上都被认定为不怎么成功,如果避免用输得一塌糊涂这样的形容的话。

你只看到了贼偷,没看着贼挨打。

往远了说。春秋战国有个国君想拉拢人才,贴了告示,有啥能耐都用。来了个老头。问他会啥,说,我会小九九,就是九九乘法表。国君说你玩我呐。老头说,你想啊,大王,如果连像我这样会小九九的都能得到您的赏识和重用,那更有能耐的人不就接着来了吗。国君重用了老头,果然来了很多有能耐的人。这老头够有创意吧,故事的结局也不错,不过那老头后来呢?那老头从此淡出了历史。

再说。汉高祖刘邦对知识分子不礼貌,呼来喝去的。又来个老头,知识分子,说有大政方针指点。刘邦正洗脚呢,我忘了是一边擦脚还是坐那撇着腿了,就说,"啥事,说吧。"老头说,这可不是国君应该有的态度啊。刘邦然后就正式接见,然后就厉害了。故事又完了,那老头呢?这个老头后来倒是历史有点记载,不过跟洗脚这事没关系,他去当死间被人家烹了。

再说。李自成还是朱元璋进京以前,一片农民起义军。这个时候总会跳出来个人指点他,毛主席也遇到过这样的神仙,叫李鼎铭。他们说,"广积粮,缓称王"。然后大事遂成。怎么样,这个家伙也有创意吧。但是历史上,后来就没有他的事了。

这些有创意的人,他们都没有后来。

乔布斯的创意与这些才高八斗指点江山的家伙有所不同。乔布斯能在自己家车库(相当于仓房?)里把苹果机焊出来,而这些家伙的创意都是由别人去实现的。在这个世界上,创意从来不重要,除非你不把他拿出来。只要你拿出来,那就是全人类的,专利也只保护你那么几年。如果你不拿出来,那它就是不存在的,甚至也不属于你。没验证过的,不是创意,是吹牛。

所以,老板,如果你真的觉得自己的创意很好,那就亲自动手去干,或者出钱,证明它很好。老板们是不是脑袋都进水了,以为忽悠大家一起创意,然后这个世界就和谐了。没有一群工程师出力,谁替你把创意带到世界上来。

非老板们也以为自己一个创意就能救了自己。那是老板忽悠你的。上述春秋战国某王、刘邦、李自成的谋士的故事都告诉我们:未来的公司是属于跟老板一起光膀子打天下的。那个当初指指点点这么干能成的家伙,早就被大家忘光了。

别说,有一个人,他倒是例外。他当初指点他爹造反,建立了唐朝。他爹说过,要不是你那句话,咱们哪有今天。这位爹是李渊,儿子是李世民大帝。不过,他爹可不是没事回忆和感谢这位儿子当年的创意呢。李世民先是亲手跟老爹和兄弟们打了天下,后来杀了两个哥,逼李渊退位当太上皇。他爹对这位牛人的好评,可不是凭创意得到的。

《创世纪》里,上帝说,要有光。他老人家可不是说,我看有光不错,你们几个整一个试试。如果成了算我的,整出毛病来,反正也不是我整的。

作为工程师,少整点创意,多点实现创意的能力吧。

最后,我想起来十来年前给一位老板修机器时候的对话。他说,你为什么不考虑一下市场需求,创意很重要啊。不是原话,大致如此。我说,手头的活儿都干不过来,没工夫整创意。

有资本的人是有资本谈创意的,因为他有钱支持创意。如罗素所说,有闲阶级的太太们可以养活一大群无聊和不咋地的艺术家。没资本的人少扯点创意,多点实现别人创意的本事吧。

即使我有一千个创意,倒也不见得非得讲给无关的人听,又不是想拉他的投资。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]