May 27

美国大学的零售店精神

在FT中文网上看到一篇 不错,帖出来共享。

美国的义务教育一到大学就嘎然而止。因此大学教育,不论私立公立,都有些类似奢侈品 —— 是个烧钱的所在。如果不看统计数字只凭直觉,似乎这个奢侈品在美国人人共享。其实美国只有大约27%的人拥有学士学位。不过因为高低不同的大学实在数不胜数,所以想要上大学,智力上的挑战对正常人几乎可以忽略不计。总而言之,美国的大学教育非常具有零售店的囊括精神:进来的都是客。

好些人都是几张录取通知书攥在手心,然后掂量掂量荷包的实力来选择学校。这个时候,中产阶级的父母已经指望不上太多。绝大多数人上大学都要自己买单,或者至少部分买单,并且支付自己的生活费。一般的州立大学学费在一万美金左右一年,本州人大约减半。如果在快餐店赚6.55美金最低时薪,学费折算一下将是一笔很可观的工时。因此对他们而言,大学生活可以很浪漫很浪漫,但是绝对不休闲。一天要分成三截:上半截上课考试,下半截兼职工作,还有一截深夜开派对。

繁忙的学习与工作催熟着这些大学生小青年。他们待人接物开始变得更加礼貌得体,有头有脸。18岁是一个非常令人扬眉吐气的年龄。小青年们正式从父母手中接管自己。即使父母此时不忍心把他们扫地出门,他们也会迫不及待地卷起铺盖租个自己的小窝。18岁的大学生一般会有一辆车,一本驾照,一张选票,一个兼职工作,一个银行账号,一些助学贷款,一个独立住所,一个男朋友或女朋友。他们感觉自己已经熟透,再等三年就可以合法喝酒了。

大学生活是“属于自己的生活”真正的开始。有自由打理自己的一切也意味着更大的责任,从此要为自己的行为与选择负责。好在这个责任并不是对他人或家庭的责任,而是对自己的责任。因此来自外界的压力很小。并且美国社会极强的兼容性,让大学生在就职上也没有太大的压力。只要自己觉得有意义,大学毕业了,开个小店可称为有想法,做家庭主妇很雍容,背起行囊去流浪也无所谓。

其实从申请大学开始就是一个水到渠成的过程,没有像中国高考这样骤然而至的高压。临时抱佛脚的努力很少能奏效。类似于中国高考的SAT成绩只是大学录取的一个因素。平时的功课表现,老师的推荐,以及自荐书都很关键。等到申请时刻,心中已经非常有底,大致会知道自己能去读什么大学。没有经过高压的煎熬,美国的大学生大都表现出来不识愁滋味的轻松。对于他们,大学不是一个用来担心未来的地方,而是一个享受当下的开始。每张脸在青青校园下都显得阳光灿烂,似乎能听到他们心里面吹着口哨来上课。

大学教育虽然是个奢侈品,所费不菲,但是也是一件体面人要穿的衣服。不过既然这件衣服要自己花钱买,自己就是主人。如果衣服不合身,可以换一件,可以修修补补,也可以扔掉。美国大学生转学,转专业,或者退学手续都非常简便易行。所以大学这个“零售店”的售后服务堪称一级棒,换货退货都不需要理由。很多人进入大学因为五花八门的原因不能坚持到毕业,无法拿到学位:比如要结婚生孩子成为全职太太,比如对校园生活实在不来电,又比如自己做的小生意突然风生水起 ——像比尔·盖茨这样。我带的班级里面,有过几个中年学生。这样的学生很多是多年前学分没有修够,现在来回炉拿学位。也有些是无聊了或者失业了来充电。不论学生抱着什么目的坐在教室里,大学一律有教无类。

学生是顾客,顾客是上帝。

大学教授,无论如何大牌,即便是诺贝尔奖获得者,也难逃期末被学生打分写评语的下场。学生对他们所受的教育内容,教授的服务态度,教室的舒适度等等都会作全方位的评定。学生的评语非常能体现他们在大学里的爱恨情仇。作为一名大学老师,我看这些常常看得如痴如醉,就像看武侠小说。这些评定的威力有时候可以将一个研究天才型的助理教授扼杀在他职业的摇篮里。研究型的大学,表面上似乎不在乎本科生教育,其实骨子里都很在意他们顾客的感受。

大学里的课程也很体现这种零售店与顾客的关系。进入大学通常要修一些语文数学公共课。这些公共课都细分为不同的程度,由不同的教授带。学生可以根据自己的程度与兴趣来挑挑拣拣。通不过可以重修。二年级的时候,一般学生都可以确定自己想读什么专业。一旦选好一个专业与这个专业所有的学生就是天下一家亲,没有像中国高校这样固定的班级。大集体被分化成小团体,小团体又被个人化。美国的大学生活的确有点像零售店为你量身定做的一件衣服。

(本文作者吴绢为美国明尼苏达大学设计∙房屋∙ 服装系终身制助理教授及博导。近作为Chinese Fashion from Mao to Now 《中国时尚1978至今》)

May 21

以史为鉴

        今天在网上看到一篇帖子讲的很好,并且有数据作为支持。

        美国1929年股市崩溃,但股市跌幅最大却发生在1932年,因为1932年美国房地产崩溃了。也就是说:30年代的美国是股票崩溃将近3年的时候,房地产才崩溃。再看看日本的情况,日本1990年股票崩溃,1992年房地产才崩溃,时间跨度也是两年。这主要是因为股票崩溃的金融危机要一年的时间才能转化成实体经济危机,而实体经济危机需要又一年的时间才能消灭光有钱人的现金,而有钱人缺乏现金后,就不得不变卖房子换成现金来维持他们正常的生活所需。这就表明中国房子爆跌的次序是:2008年股票崩溃,2009年实体经济崩溃导致大批企业倒闭和出现大量失业房奴。2010年,倒闭企业老板和失业房奴因为缺乏现金去购买生活必须品,不得不把他们唯一剩下的资产房子卖掉,而没有房子却打算买房的钢需也因为失业而丧失了购买房子的能力,这导致房地产在2010年全面崩溃,不论国家如何救市,都无法阻挡这个过程的发生。当年的美国和日本都是这样发生的,中国也不例外。

        另外,美国房地产崩溃后,连续底部横盘了几十年都没涨,一直到2001年才开始上涨,而在此期间,美国股票上涨超过200倍。日本房地产连续下跌18年,连反弹都未曾出现过,而日本股票在过去18年还是有过两次大反弹的。

        香港股票在1997年金融危机后,于2007年达到1997年历史高点的两倍,而香港房地产反弹的高点却远远低于1997年的历史高点,现在香港股票和房地产又开始同步下跌了。

        从以上三个历史数据可以看出:房地产泡沫一旦破裂,就很难再上涨回去,而股票这点就比房地产强多了,不过房地产上涨的时候,往往比股票泡沫大,这也可能就是房地产再次上涨的力度远小于股票的原因。

        所以,想买房的话,还是耐心等5年到10年后再说吧。不要在最近几年买到中国房地产的头部去。

        还有要说明的是:不要相信那些中国人很有钱的鬼话,我在证券公司工作,能清楚看到上万个股民的资产情况,中国的有钱人,他们的现金都在股票上亏光了。他们所谓的财富基本都是以企业和房子的形式存在,他们根本没有多少现金了,所以当他们缺乏现金去维持正常的生活所需的时候,就不得不去卖房子和企业来换取现金。而2009年的经济危机会让这一切在2010年都变成活生生的现实。

    

May 20

Process waitFor无法返回原因分析

    今天做一个mysql数据恢复的小程序,采用Runtime.exec的方式来执行mysql命令。主要用来恢复一些由定时程序自动备份出来的数据库文件,有时候可能会出现恢复的数据在数据库中还存在,于是会出现主键重复的错误,于是我在恢复的时候加入–force参数,手动在cmd控制台下执行可以很明显看到mysql返回了一些duplicate的error,按道理在java app中也能正常执行过去,可在执行java app的时候看控制台中打印的日志显示,程序阻塞在了waitFor这一步。我的程序片段如下:
……   
p = Runtime.getRuntime().exec(cmd);
……
    p.waitFor();
……
    百思不得其解,最后在google了下,找到一片最早分析该原因的文章是在javaworld上。原因是操作系统这一层对输入输出流有一个buffer,由于受到这个buffer的大小限制,当buffer满了而又没有线程去读,则当前执行的线程就会阻塞掉,于是修改一下程序,开辟两个线程专门用于读取输出流,一个用于读取返回消息流,一个用于读取异常消息流,于是修改程序如下:
……
p = Runtime.getRuntime().exec(cmd);
   
new PrintStream(p.getInputStream()).start();
new PrintStream(p.getErrorStream()).start();
p.waitFor();
……
此处PrintStream为一个读取inputstream的线程。

May 14

Java串口通信总结

    串口通信这词儿听上去跟java似乎有点儿沾不上边儿,因为java大多是拿来做大规模企业应用的,像串口通信这种很底层的东东一般都会用比较低级别的语言来做,但最近就遇到了这么一事儿,于是google了下,没想到还真能用java做,要用到的是javax扩展类库javacomm,它是一系列的标准,该类库在sun的官网上只提供linux版本。由于我所应用的平台是win32,所以还得去其他地儿找win32的实现,找了好久终于找到了。下面对其用法做一个简要说明。

    1.首先在下载到了javacomm包后,需要将其解压,解压后需要做的就是将java扩展库安装到本地开发环境以及运行环境中。对于开发环境需要做的就是将win32com.dll复制到%jdk install dir%/bin下,然后将comm.jar和javax.comm.properties拷贝到%jdk install dir%/lib下,对于运行环境要做的就是将这些文件拷贝到相应的jre下即可。

    2.javacomm API

    其API相当简单,下面看如下代码
   CommPortIdentifier serialPortId = CommPortIdentifier.getPortIdentifier(portName);
   log.info(“open serial port COM1 …”);
  SerialPort  port = (SerialPort) serialPortId.open(appName, timeout);
   log.info(“serial port COM1 configuration : ” + baudrate + ” , ” + dataBits + ” , ” + stopBits + ” , ” + parity);
   port.setSerialPortParams(baudrate, dataBits,stopBits, parity);
   port.enableReceiveTimeout(IOTIMEOUT);
   OutputStream out = port.getOutputStream();
   InputStream in = port.getInputStream();
   Request req = Request.getInstance();
   req.setIn(in);
   req.setOut(out);

    第一行取得一个名为portName的串口描述(看这个用法,这个地方有点儿像是单例跟工厂模式)。然后从串口描述中打开串口得到一个串口对象,注意这个地方的timeout参数是用来设置打开串口的超时时间,往后看可以看到还有一个receiveTimeout的设置,这个设置害我冥思苦想了好长时间。一开始没有注意到打开串口时可以设置这个timeout时间,使用的是一个单appName参数的方法,结果后来出现无法设置io超时时间的问题,而java API中也没有提供io超时时间的方法,最后终于一天晚上在给我的她打完电话后发现了这个苦苦期盼了好久的方法,问题迎刃而解了。之后就是设置通信的一些参数诸如波特率,数据位,停止位,校验方式等。然后就可以从串口中得到输入输出流了,这个地方要注意的是串口通信是全双工的,输入流跟输出流相互没有什么关系。

May 02

又一个第一次

      下午五点半第一次来到黄州,下午五点四十在景福门口见到阔别以久的胖子,激动到以至与没有注意今天的主要角色——大款,先被鄙视了一顿,坐定下来又见到了加兵、享伟、阿黄跟b哥,让我一下子有点不敢相信他们都坐在我对面,好半天说话都有点语无伦次。之前也有在厦门参加过同事的婚礼,感受颇多。这回本该也还好,可看到大学同寝的哥门儿——那个曾今为了没人跟我们抢boss半夜一块儿上神舰,那个住我下铺一年总把车到山前必有路挂在嘴边的兄弟结婚了,心中甚是为他高兴。席间跟几个寝室弟兄聊了很多,突然间觉得自己有些莫名的失落。十一国庆节压阵我下铺两年,喜欢听“睡我上铺的兄弟”还有“knocking on the heaven’s door”的哥们儿也要走进围城了,真为他们高兴,看到他们一个一个走过又或是即将走过这个人生的转折使我对自己所拥有的将来有了些许期待,同时对未来的不确定性又有了很多分担忧。人生的不同阶段思想跟观念以及所追求的东西肯定有所不一样,只有经历过才会有所感受,每个人将来将要经历的事情又存在着很大的不确定性。也许这些都起老生常谈的杞人忧天了,想远了想多了只会让人更加焦虑,有一句话我很赞同,讲的大概意思是你只要做好每天该做得想好第二天要做的就一定可以很成功。我尝试这样做,可当看到别人的第三天正在发生,我想只有圣人才能做到完全的平静。写了一堆凌乱的东西也该睡觉了.Good night my indefinite future,good night my love!

Mar 13

回归

     星期二下午到的武汉,算一下回来差不多又三天了,星期二上午火车开到江西南昌附近接到了第一个面试电话,一下子觉得阳光好明媚,空气好新鲜,到老姐家后心情也还不错。第二天去面试了,虽然有些失望,下午托运的东西到武汉,一人把几百多斤的东西从一楼一步一步的挪到七楼,差点儿累爬下….. Continue reading

Feb 03

牛年

      今年春节跟以往过的有些不一样,既不是因为08年发生了很多大事儿,也不是因为从阴历上来说08年是我的本命年。去了以前没有去过的地方,发生了些以前没有发生过的事儿,于是多了些牵挂。本来想在上班前就记录些东西的,可总是没有大片的相对安静的环境让我有思绪去想这些东西。昨天算是坐汽车来厦门最糟糕的一次了,早晨到家的时候整个人都有种晕晕乎乎的感觉,自己都难以相信自己是怎么熬过来的,给该报平安的人都报了平安后,就打算在床上躺会儿,一躺下脑袋里浮现的全是些过年发生的点滴。想起22号早晨到武汉下车那一刹那的激动,想起23号早晨在车站等车时忐忑的心情,想起23号中午下车看到毛毛虫的那一瞬间的微笑,想起在逛潜山被冻的打哆嗦,想起在市府门前用枯树枝下棋,想起在世纪打电动,想起大冬天在青龙湖踩船,想起在公园做云霄飞车,想起老妈送我上车的那一瞬间的眼神,想起晚上10点多在汉口江滩看焰火跟放孔明灯,想起路过户部巷时肚子饿的打咕噜,想起晚上边听电视边聊天到一点钟,想起初六去归元寺数罗汉,想起送毛毛虫上车时的背影……一个个从眼前浮过,还没等睡着就被下午上班的闹钟给闹醒了,多么希望时间就一直停留下那这一刻,让我有足够的时间去回味这一个个瞬间。可无论如何,还是有很多事情是我们自己没有办法去左右的,我们能做的只有去努力的改变自己能够改变的东西,努力做好自己手头该做的事情,毕竟每个人都还是有自己的责任需要承担。
      最后希望大家都能够在牛年过的牛一点儿。

Jan 18

婚宴后感想附年终总结

       大概还有不到一个星期的时间就能放假回家了,昨天(星期六)去参加一同事的婚礼,也算是我第一次参加同时代人的婚礼以及来厦门参加的第一个婚礼,有颇多感受。以前都只有跟老爸老妈去参加过一些长自己不少的人的婚礼,也没有什么感觉,只是抱着一种看热闹又或者是蹭饭的心态去,这次却有着本质的区别,说实话可能会或多或少的去学习一些经验,因为自己以后肯定会有经历。自己会不自然的就把自己安插到主角的角色中去,想像自己在那种状况下会有怎样一种心态,发现很多事情对于自己来说可能会比较困难,需要学习的东西还有很多。从酒店大厅一直到宴席开席司仪开始举行仪式,所有的一切都是那么的喜庆,甚至有一种比过年还喜庆的感觉。在这边再衷心祝贺一下一对新人。 Continue reading

Jan 09

Java位运算

      Java算是一门很高级的语言了,平时使用一般不会用到位运算这种很低级的特性,但在有些地方有很高的性能或者空间的要求可能会用到,比如说手机平台。今天偶尔看了下,发现一些基础只是很长时间没有搞都忘记了,今天看到相关的东西以至于想了很久才想通。就从今天看到的一段代码来回顾些基础知识,是一段将int转换为byte数组的代码。

———————————————————–
//cout为自己包装的打印方法
  int a = 645765765;
  cout(a);
  cout(Integer.toBinaryString(a));
  byte[] b = new byte[4];
     b[0] = (byte)((a>>24)&0xff);
     cout(Integer.toBinaryString(b[0]&0xff));
     b[1] = (byte)((a>>16)&0xff);
     cout(Integer.toBinaryString(b[1]&0xff));
     b[2] = (byte)((a>>8)&0xff);
     cout(Integer.toBinaryString(b[2]&0xff));
     b[3] = (byte)((a>>0)&0xff);
     cout(Integer.toBinaryString(b[3]&0xff));
    
     int decodeA ;
     decodeA = b[0]&0x000000ff;
     decodeA = (decodeA<<8) + (b[1]&0xff);
     decodeA = (decodeA<<8) + (b[2]&0xff);
     decodeA = (decodeA<<8) + (b[3]&0xff);
     cout(decodeA);
//自己写的另外一种转换方法
     int decodeA2 ;
     decodeA2  = ((b[0]&0xff)<<24);
     decodeA2 += ((b[1]&0xff)<<16);
     decodeA2 += ((b[2]&0xff)<<8);
     decodeA2 += ((b[3]&0xff)<<0);
     cout(decodeA2);
——————————————————————–

      一开始看到的黑体部分。于是写了下面红色的版本,但之前不是现在这个正确版本,之前是这样的。
     int decodeA2 ;
     decodeA2  = b[0]<<24;
     decodeA2 += b[1]<<16);
     decodeA2 += b[2]<<8;
     decodeA2 += b[3]<<0;
     cout(decodeA2);
    结果只要a的值一超过128就会出错,百思不得其解,之后查了有关移位的资料。右移在java中有两种方式,一种是带符号的,一种是不带符号的,带符号的会根据最高位的值来判断用1还是0来补足,若最高位为1则用1来补,若为0则用0来补,无符号的则全部用0补,而对于左移则全部用0补。想了很久这个似乎也没有关系,最后偶然间看到byte的最高位是用来表示正负的,就是说byte的值为-128到127,所以只要在遇到了某一byte的最高位为1的情况下就会出现该值变为了一负值,但其实这个时候它里面存的位信息还是对的,用Integer的int到二进制的一个方法将其打出来便可以发现是一个32位的高位全为1的二进制形式,及是一个负数,于是对它在进行一次“与运算”去掉高位的“1”就可以得到正确的结果了。