2009年12月16日星期三

什么是 socket?

什么是 socket?
  你经常听到人们谈论着
"socket",或许你还不知道它的确切含义。现在让我告诉你:它是使用 标准Unix
文件描述符 (file descriptor) 和其它程序通讯的方式。
什么?

struct sockaddr.。这个结构 为许多类型的套接字储存套接字地址信息:
struct sockaddr {
   unsigned short sa_family; /* 地址家族, AF_xxx */
   char sa_data[14]; /*14字节协议地址*/
   };
sa_family 能够是各种各样的类型,但是在这篇文章中都是 "AF_INET"。
sa_data包含套接字中的目标地址和端口信息。这好像有点 不明智。
为了处理struct sockaddr,程序员创造了一个并列的结构: struct sockaddr_in
("in" 代表 "Internet"。)
struct sockaddr_in {
   short int sin_family; /* 通信类型 */
   unsigned short int sin_port; /* 端口 */
   struct in_addr sin_addr; /* Internet 地址 */
   unsigned char sin_zero[8]; /* 与sockaddr结构的长度相同*/
   };
用这个数据结构可以轻松处理套接字地址的基本元素。

一个指向 sockaddr_in结构体的指针也可以被指向结构体sockaddr并且代替它。这
样的话即使 socket() 想要的是 struct sockaddr *,你仍然可以使用 struct
sockaddr_in,并且在最后转换。同时,注意 sin_family 和 struct sockaddr 中的
sa_family 一致并能够设置为 "AF_INET"。最后,sin_port和 sin_addr
必须是网络字节顺序 (Network Byte Order)!
htons()--"Host to Network Short"
  htonl()--"Host to Network Long"
  ntohs()--"Network to Host Short"
  ntohl()--"Network to Host Long"
为什么在数据结构 struct sockaddr_in 中, sin_addr 和 sin_port
需要转换为网络字节顺序,而sin_family 需不需要呢? 答案是: sin_addr 和
sin_port 分别封装在包的 IP 和 UDP 层。因此,它们必须要
是网络字节顺序。但是 sin_family 域只是被内核 (kernel) 使用来决定在数
据结构中包含什么类型的地址,所以它必须是本机字节顺序。同时, sin_family
没有发送到网络上,它们可以是本机字节顺序。

IP 地址和如何处理它们
现在我们很幸运,因为我们有很多的函数来方便地操作 IP 地址。没有
必要用手工计算它们,也没有必要用"<<"操作来储存成长整字型。
首先,假设你已经有了一个sockaddr_in结构体ina,你有一个IP地
址"132.241.5.10"要储存在其中,你就要用到函数inet_addr(),将IP地址从
点数格式转换成无符号长整型。使用方法如下:
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用
函数htonl()。
我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。
显而易见,当inet_addr()发生错误时返回-1。记住这些二进制数字?(无符
号数)-1仅仅和IP地址255.255.255.255相符合!这可是广播地址!大错特
错!记住要先进行错误检查。
好了,现在你可以将IP地址转换成长整型了。有没有其相反的方法呢?
它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数
inet_ntoa()("ntoa"的含义是"network to ascii"),就像这样:
printf("%s",inet_ntoa(ina.sin_addr));
它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一
个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的
指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用
inet_ntoa(),它就将覆盖上次调用时所得的IP地址。

微软的面试题

第一组
  1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?
  2.你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻?
  3.如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀,问你如何才能准确称出4公升的水?
  4.一个岔路口分别通向诚实国和说谎国。来了两个人,已知一个是诚实国的,另一个是说谎国的。诚实国永远说实话,说谎国永远说谎话。现在你要去说谎国,但不知道应该走哪条路,需要问这两个人。请问应该怎么问?
  5.12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)
  6.在9个点上画10条直线,要求每条直线上至少有三个点?
  7.在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的?
  8.怎么样种植4棵树木,使其中任意两棵树的距离相等?
  第二组
  1.为什么下水道的盖子是圆的?
  2.中国有多少辆汽车?
  3.将汽车钥匙插入车门,向哪个方向旋转就可以打开车锁?
  4.如果你要去掉中国的34个省(含自治区、直辖市和港澳特区及台湾省)中的任何一个,你会去掉哪一个,为什么?
  5.多少个加油站才能满足中国的所有汽车?
  6.想象你站在镜子前,请问,为什么镜子中的影象可以颠倒左右,却不能颠倒上下?
  7.为什么在任何旅馆里,你打开热水,热水都会瞬间倾泻而出?
  8.你怎样将Excel的用法解释给你的奶奶听?
  9.你怎样重新改进和设计一个ATM银行自动取款机?
  10.如果你不得不重新学习一种新的计算机语言,你打算怎样着手来开始?
  11.如果你的生涯规划中打算在5年内受到奖励,那获取该项奖励的动机是什么?观众是谁?
  12.如果微软告诉你,我们打算投资五百万美元来启动你的投资计划,你将开始什么样商业计划?为什么?
  13.如果你能够将全世界的电脑厂商集合在一个办公室里,然后告诉他们将被强迫做一件事,那件事将是什么? 

第三组
  1.你让工人为你工作7天,回报是一根金条,这个金条平分成相连的7段,你必须在每天结束的时候给他们一段金条。如果只允许你两次把金条弄断,你如何给你的工人付费?
  2.有一辆火车以每小时15公里的速度离开北京直奔广州,同时另一辆火车每小时20公里的速度从广州开往北京。如果有一只鸟,以30公里每小时的速度和两辆火车同时启动,从北京出发,碰到另一辆车后就向相反的方向返回去飞,就这样依次在两辆火车之间来回地飞,直到两辆火车相遇。请问,这只鸟共飞行了多长的距离?
  3.你有四个装药丸的罐子,每个药丸都有一定的重量,被污染的药丸是没被污染的药丸的重量+1。只称量一次,如何判断哪个罐子的药被污染了?
  4.门外三个开关分别对应室内三盏灯,线路良好,在门外控制开关时候不能看到室内灯的情况,现在只允许进门一次,确定开关和灯的对应关系?
  5.人民币为什么只有1、2、5、10的面值?
  6.你有两个罐子以及50个红色弹球和50个蓝色弹球,随机选出一个罐子,
随机选出一个弹球放入罐子,怎么给出红色弹球最大的选中机会?在你的计划里,得到红球的几率是多少?
  7.给你两颗6面色子,可以在它们各个面上刻上0-9任意一个数字,要求能够用它们拼出任意一年中的日期数值
  第四组
  第一题 .
五个海盗抢到了100颗宝石,每一颗都一样大小和价值连城。他们决定这么分:
  抽签决定自己的号码(1、2、3、4、5)
  首先,由1号提出分配方案,然后大家表决,当且仅当超过半数的人同意时,按照他的方案
  进行分配,否则将被扔进大海喂鲨鱼
  如果1号死后,再由2号提出分配方案,然后剩下的4人进行表决,当且仅当超过半数的人同
  意时,按照他的方案进行分配,否则将被扔入大海喂鲨鱼
  依此类推
  条件:每个海盗都是很聪明的人,都能很理智地做出判断,从而做出选择。
  问题:第一个海盗提出怎样的分配方案才能使自己的收益最大化?
  第二题 . 一道关于飞机加油的问题,已知:
  每个飞机只有一个油箱,
  飞机之间可以相互加油(注意是相互,没有加油机)
  一箱油可供一架飞机绕地球飞半圈,
  问题:
  为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场)第三题.
汽车加油问题
  一辆载油500升的汽车从A开往1000公里外的B,已知汽车每公里耗油量为1升,A处有无穷多的油,其他任何地点都没有油,但该车可以在任何地点存放油以备中转,问从A到B最少需要多少油
  第四题. 掷杯问题
  一种杯子,若在第N层被摔破,则在任何比N高的楼层均会破,若在第M层不破,则在任何比M低的楼层均会破,给你两个这样的杯子,让你在100层高的楼层中测试,要求用最少的测试次数找出恰巧会使杯子破碎的楼层。
  第五题. 推理游戏
  教授选出两个从2到9的数,把它们的和告诉学生甲,把它们的积告诉学生乙,让他们轮流猜这两个数
  甲说:"我猜不出"
  乙说:"我猜不出"
  甲说:"我猜到了"
  乙说:"我也猜到了"
  问这两个数是多少
  第六题. 病狗问题
  一个住宅区内有100户人家,每户人家养一条狗,每天傍晚大家都在同一个地方遛狗。已知这些狗中有一部分病狗,由于某种原因,狗的主人无法判断自己的狗是否是病狗,却能够分辨其他的狗是否有病,现在,上级传来通知,要求住户处决这些病狗,并且不允许指认他人的狗是病狗(就是只能判断自己的),过了7天之后,所有的病狗都被处决了,问,一共有几只病狗?为什么?
  第七题.
U2合唱团在17分钟内得赶到演唱会场,途中必需跨过一座桥,四个人从桥的同一端出发,你得帮助他们到达另一端,天色很暗,而他们只有一只手电筒。一次同时最多可以有两人一起过桥,而过桥的时候必须持有手电筒,所以就得有人把手电筒带来带去,来回桥两端。手电筒是不能用丢的方式来传递的。四个人的步行速度各不同,若两人同行则以较慢者的速度为准。BONO需花1分钟过桥,EDGE需花2分钟过桥,ADAM需花5分钟过桥,LARRY需花10分钟过桥,他们要如何在17分钟内过桥呢?
  第八题.
监狱里有100个房间,每个房间内有一囚犯。一天,监狱长说,你们狱房外有一电灯,你们在放风时可以控制这个电灯(熄或亮)。每天只能有一个人出来放风,并且防风是随机的。如果在有限时间内,你们中的某人能对我说:"我敢保证,现在每个人都已经至少放过一次风了。"我就放了你们!问囚犯们要采取什么策略才能被监狱长放掉?如果采用了这种策略,大致多久他们可以被释放?

第五组
  1.某手机厂家由于设计失误,有可能造成电池寿命比原来设计的寿命短一半(不是冲放电时间),解决方案就是免费更换电池或给50元购买该厂家新手机的折换券。请给所有已购买的用户写信告诉解决方案。
  2.一高层领导在参观某博物馆时,向博物馆馆员小王要了一块明代的城砖作为纪念,按国家规定,任何人不得将博物馆收藏品变为私有。博物馆馆长需要如何写信给这位领导,将城砖取回。
  3.营业员小姐由于工作失误,将2万元的笔记本电脑以1.2万元错卖给李先生,王小姐的经理怎么写信给李先生试图将钱要回来?
  4.给你一款新研制的手机,如果你是测试组的组长,你会如何测试?
  5.如何为函数int atoi(const char * pstr)编写测试向量?
  第六组
  1.链表和数组的区别在哪里?
  2.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?
  3.编写实现数组排序的一种算法。说明为什么你会选择用这样的方法?
  4.请编写能直接实现char * strcpy(char * pstrDest,const char *
pstrSource)函数功能的代码。
  5.编写反转字符串的程序,要求优化速度、优化空间。
  6.在链表里如何发现循环链接?
  7.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。
  8.写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码
  9.给出一个函数来输出一个字符串的所有排列。
  10.请编写实现void * malloc(int)内存分配函数功能一样的代码。
  11.给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
  12.怎样编写一个程序,把一个有序整数数组放到二叉树中?
  13.怎样从顶部开始逐层打印二叉树结点数据?请编程。
  14.怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?
--
  15.请编写能直接实现int atoi(const char * pstr)函数功能的代码
答案:
第一组题答案:
  1)三根绳,第一根点燃两端,第二根点燃一端,第三根不点
  第一根绳烧完(30分钟)后,点燃第二根绳的另一端,第二根绳烧完(45分钟)后,点燃第三根绳子两端,第三根绳烧完(1小时15分)后,计时完成
  2)根据抽屉原理,4个
  3)3升装满;3升-〉5升(全注入);3升装满;3升-〉5升(剩1升);5升倒掉;3升-〉5升(注入1升);3升装满;3升-〉5升;完成(另:可用回溯法编程求解)
  4)问其中一人:另外一个人会说哪一条路是通往诚实国的?回答者所指的那条路必然是通往说谎国的。
  5)12个球:
  第一次:4,4 如果平了:
  那么剩下的球中取3放左边,取3个好球放右边,称:
  如果左边重,那么取两个球称一下,哪个重哪个是次品,平的话第三个重,是次品,轻的话同理
  如果平了,那么剩下一个次品,还可根据需要称出次品比正品轻或者重
  如果不平:
  那么不妨设左边重右边轻,为了便于说明,将左边4颗称为重球,右边4颗称为轻球,剩下4颗称为好球
  取重球2颗,轻球2颗放在左侧,右侧放3颗好球和一颗轻球
  如果左边重
  称那两颗重球,重的一个次品,平的话右边轻球次品
  如果右边重
  称左边两颗轻球,轻的一个次品
  如果平
  称剩下两颗重球,重的一个次品,平的话剩下那颗轻球次品
  13个球:
  第一次:4,4,如果平了
  剩5颗球用上面的方法仍旧能找出次品,只是不能知道次品是重是轻
  如果不平,同上 
6)
  o o o
  o o o
  o o o
  7)
  23次,因为分针要转24圈,时针才能转1圈,而分针和时针重合两次之间的间隔显然>
1小时,它们有23次重合机会,每次重合中秒针有一次重合机会,所以是23次
  重合时间可以对照手表求出,也可列方程求出
  8)
  在地球表面种树,做一个地球内接的正四面体,内接点即为所求
  第二组 无标准答案
  第三组
  1.
分成1,2,4三段,第一天给1,第二天给2取回1,第3天给1,第4天给4取回1、2,第5天给1,第6天给2取回1,第七天给1
  2. 求出火车相遇时间,鸟速乘以时间就是鸟飞行的距离
  3.
四个罐子中分别取1,2,3,4颗药丸,称出比正常重多少,即可判断出那个罐子的药被污染
  4.
三个开关分别:关,开,开10分钟,然后进屋,暗且凉的为开关1控制的灯,亮的为开关2控制的灯,暗且热的为开关3控制的灯
  5. 因为可以用1,2,5,10组合成任何需要的货币值,日常习惯为10进制
  6. 题意不理解...*_*
  7. 012345 0126(9)78
  第四组 都是很难的题目
  第一题:97 0 1 2 0 或者 97 0 1 0 2 (提示:可用逆推法求出)
  第二题:3架飞机5架次,飞法:
  ABC
3架同时起飞,1/8处,C给AB加满油,C返航,1/4处,B给A加满油,B返航,A到达1/2处,C从机场往另一方向起飞,3/4处,C同已经空油箱的A平分剩余油量,同时B从机场起飞,AC到7/8处同B平分剩余油量,刚好3架飞机同时返航。所以是3架飞机5架次。第三题:需要建立数学模型
  (提示,严格证明该模型最优比较麻烦,但确实可证,大胆猜想是解题关键)
  题目可归结为求数列 an=500/(2n+1)
n=0,1,2,3......的和Sn什么时候大于等于1000,解得n> 6
  当n=6时,S6=977.57
  所以第一个中转点离起始位置距离为1000-977.57=22.43公里
  所以第一次中转之前共耗油 22.43*(2*7+1)=336.50升
  此后每次中转耗油500升
  所以总耗油量为7*500+336.50=3836.50升
  第四题:需要建立数学模型
  题目可归结为求自然数列的和S什么时候大于等于100,解得n> 13
  第一个杯子可能的投掷楼层分别为:14,27,39,50,60,69,77,84,90,95,99,100
  第五题:3和4(可严格证明)
  设两个数为n1,n2,n1> =n2,甲听到的数为n=n1+n2,乙听到的数为m=n1*n2
  证明n1=3,n2=4是唯一解
  证明:要证以上命题为真,不妨先证n=7
  1)必要性:
  i) n> 5 是显然的,因为n <4不可能,n=4或者n=5甲都不可能回答不知道
  ii) n> 6
因为如果n=6的话,那么甲虽然不知道(不确定2+4还是3+3)但是无论是2,4还是3,3乙都不可能说不知道(m=8或者m=9的话乙说不知道是没有道理的)
  iii) n <8 因为如果n> =8的话,就可以将n分解成 n=4+x 和
n=6+(x-2),那么m可以是4x也可以是6(x-2)而4x=6(x-2)的必要条件是x=6即n=10,那样n又可以分解成8+2,所以总之当n>
=8时,n至少可以分解成两种不同的合数之和,这样乙说不知道的时候,甲就没有理由马上说知道。
  以上证明了必要性
  2)充分性
  当n=7时,n可以分解成2+5或3+4
  显然2+5不符合题意,舍去,容易判断出3+4符合题意,m=12,证毕
  于是得到n=7 m=12 n1=3 n2=4是唯一解。第六题:7只(数学归纳法证明)
  1)若只有1只病狗,因为病狗主人看不到有其他病狗,必然会知道自己的狗是病狗(前提是一定存在病狗),所以他会在第一天把病狗处决。
  2)设有k只病狗的话,会在第k天被处决,那么,如果有k+1只,病狗的主人只会看到k只病狗,而第k天没有人处决病狗,病狗主人就会在第k+1天知道自己的狗是病狗,于是病狗在第k+1天被处决
  3)由1)2)得,若有n只病狗,必然在第n天被处决
  第七题:(提示:可用图论方法解决)
  BONO&EDGE过(2分),BONO将手电带回(1分),ADAM&LARRY过(10分),EDGE将手电带回(2分),BONO&EDGE过(2分)
2+1+10+2+2=17分钟
  第八题:
  约定好一个人作为报告人(可以是第一个放风的人)
  规则如下:
  1、报告人放风的时候开灯并数开灯次数
  2、其他人第一次遇到开着灯放风时,将灯关闭
  3、当报告人第100次开灯的时候,去向监狱长报告,要求监狱长放人......
  按照概率大约30年后(10000天)他们可以被释放
  第五组无标准答案
  第六组部分题参考答案:
  4.
char * strcpy(char * pstrDest,const char * pstrSource)
{
assert((pstrDest!=NULL)&&(pstrSource!=NULL));
char * pstr=pstrDest;
while((*(pstrDest++)=*(pstrSource++))!= '\0 ');
return pstr;
}

  5.
char * strrev(char * pstr)
{
assert(pstr!=NULL);

char * p=pstr;
char * pret=pstr;
while(*(p++)!= '\0 ');
p--;
char tmp;
while(p> pstr)
{
tmp=*p;
*(p--)=*(pstr);
*(pstr++)=tmp;
}
return pret;

浅析PC机串口通讯流控制

我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解一点这方面的知识是有好处的。那么,流控制在串行通讯中有何作用,在编制串行通讯程序怎样应用呢?这里我们就来谈谈这个问题。


1.流控制在串行通讯中的作用
这里讲到的"流",当然指的是数据流。数据在两个串口之间传输时,常常会出现丢失数据的现象,或者两台计算机的处理速度不同,如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发送来的数据就会丢失。现在我们在网络上通过MODEM进行数据传输,这个问题就尤为突出。流控制能解决这个问题,当接收端数据处理不过来时,就发出"不再接收"的信号,发送端就停止发送,直到收到"可以继续发送"的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。
PC机中常用的两种流控制是硬件流控制(包括RTS/CTS、DTR/CTS等)和软件流控制XON/XOFF(继续/停止),下面分别说明。


2.硬件流控制
硬件流控制常用的有RTS/CTS流控制和DTR/DSR(数据终端就绪/数据设置就绪)流控制。
硬件流控制必须将相应的电缆线连上,用RTS/CTS(请求发送/清除发送)流控制时,应将通讯两端的RTS、CTS线对应相连,数据终端设备(如计算机)使用RTS来起始调制解调器或其它数据通讯设备的数据流,而数据通讯设备(如调制解调器)则用CTS来起动和暂停来自计算机的数据流。这种硬件握手方式的过程为:我们在编程时根据接收端缓冲区大小设置一个高位标志(可为缓冲区大小的75%)和一个低位标志(可为缓冲区大小的25%),当缓冲区内数据量达到高位时,我们在接收端将CTS线置低电平(送逻辑0),当发送端的程序检测到CTS为低后,就停止发送数据,直到接收端缓冲区的数据量低于低位而将CTS置高电平。RTS则用来标明接收设备有没有准备好接收数据。
常用的流控制还有还有DTR/DSR(数据终端就绪/数据设置就绪)。我们在此不再详述。由于流控制的多样性,我个人认为,当软件里用了流控制时,应做详细的说明,如何接线,如何应用。


3.软件流控制
由于电缆线的限制,我们在普通的控制通讯中一般不用硬件流控制,而用软件流控制。一般通过XON/XOFF来实现软件流控制。常用方法是:当接收端的输入缓冲区内数据量超过设定的高位时,就向数据发送端发出XOFF字符(十进制的19或Control-S,设备编程说明书应该有详细阐述),发送端收到XOFF字符后就立即停止发送数据;当接收端的输入缓冲区内数据量低于设定的低位时,就向数据发送端发出XON字符(十进制的17或Control-Q),发送端收到XON字符后就立即开始发送数据。一般可以从设备配套源程序中找到发送的是什么字符。
应该注意,若传输的是二进制数据,标志字符也有可能在数据流中出现而引起误操作,这是软件流控制的缺陷,而硬件流控制不会有这个问题。

顺便说明一下,有不少朋友问到,为什么不在我编写的软件串口调试助手中将流控制加进去,我最初将这个调试工具定位在各种自动控制的串口程序调试上,经过计算和实验验证,在设置的特定采样周期内可以完成通讯任务,就干脆不用流控制。而且在工控中您即使不懂流控制,也能编写出简单的串口通讯程序来,就如我写的串口调试助手。

北京免费DNS服务器

Google免费DNS服务器是8.8.8.8,辅助服务器是8.8.4.4
OpenDNS的主DNS服务器是208.67.222.222,辅助服务器是208.67.220.220

北京地区DNS

北京地区免费DNS:
北京 ns.bta.net.cn 202.96.0.133
ns.spt.net.cn 202.96.199.133
ns.cn.net 202.97.16.195
202.106.0.20
202.106.148.1
202.106.196.115

北京的DNS是:
DNS首选:202.106.46.151
DNS备用:202.106.0.20

DNS首选:202.106.193.115
DNS备用:202.106.0.20

北京DNS地址:
202.96.199.133
202.96.0.133
202.106.0.20
202.106.148.1
202.97.16.195

北京网通DNS:
202.106.46.151
202.106.195.68
ns.bta.net.cn 202.96.0.133
ns.spt.net.cn 202.96.199.133
ns.cn.net 202.97.16.195
202.106.0.20
202.106.148.1
202.106.196.115

北京电信DNS:
202.96.199.133
202.96.0.133
202.106.0.20
202.106.148.1
202.97.16.195

北京铁通dns :
主211.98.4.1 或 211.98.2.4
备 210.52.207.2

注: 南电信北网通,因此在北方要熟知北方网通DNS

如北京DNS为:主DNS:202.106.196.115

次DNS:202.106.0.20


河北DNS

网通 202.99.160.68 202.99.166.4

铁通 211.98.2.4 211.98.4.1

电信 219.150.32.132 219.146.0.130

全河北省通用的

在UNIX或Linux中TTY是什么意思

在UNIX或Linux中TTY是什么意思,TTYN跟TTYP分别具体指的是什么意思,二者有什么差别?
在Linux中,TTY也许是跟终端有关系的最为混乱的术语。TTY是TeleTYpe的一个老缩写。Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,和古老的电报机区别并不是很大。之后,当计算机只能以批处理方式运行时(当时穿孔卡片阅读器是唯一一种使程序载入运行的方式),电传打字机成为唯一能够被使用的"实时"输入/输出设备。最终,电传打字机被键盘和显示器终端所取代,但在终端或TTY接插的地方,操作系统仍然需要一个程序来监视串行端口。一个getty"Get
TTY"的处理过程是:一个程序监视物理的TTY/终端接口。对一个虚拟网络沮丧服务器(VNC)来说,一个伪装的TTY(Pseudo-TTY,即家猫的TTY,也叫做"PTY")是等价的终端。当你运行一个xterm(终端仿真程序)或GNOME终端程序时,PTY对虚拟的用户或者如xterm一样的伪终端来说,就像是一个TTY在运行。"Pseudo"的意思是"duplicating
in a fake
way"(用伪造的方法复制),它相比"virtual"或"emulated"更能真实的说明问题。而在现在的计算中,它却处于被放弃的阶段。

点阵汉字显示

DOS下的点阵汉字

  你是否碰到过用启动盘启动系统后用DIR命令得到一串串莫名其妙的字符?有经验的朋友会告诉你:那是汉字。汉字?你不禁会问:怎么一个我一个也不认识。但那确确实实是汉字,如果你启动UCDOS或其他的汉字系统后,就会看到那是一个个熟悉的汉字。同样是汉字,为什么前后会看到不同的结果?呵呵,其实在电脑硬件中,根本没有汉字这个概念,也没有英文的概念,这铁玩意认识的概念只有——内码。

汉字的内码

  点头表示什么?是"对"、"YES",偏偏有的地方表示的意义却恰恰相反。一个动作,有不同的诠释;一个问题,有不同的答案;而一个符号,却有不同的意义,关键在于:你是如何地理解。在电脑中亦如此,所有的数据都是以0和1保存的,按不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有5000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。不信,你可以用记事本写一C文件:

main()
{
unsigned char *s,*e="ABcd",*c="你好";
clrscr();
printf("English char =");
s=e;
while(*s!=0) /*C的字符串以0为结束符*/
{
printf("%3d,",*s);
s++;
}
printf("\nChinease char=");
s=c;
while(*s!=0)
{
printf("%3d,",*s);
s++;
}
getch();
}

再用TC输入*.txt打开运行,看见了没有,那些数值即英文和汉字的各字节内码。

汉字字模

  得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模中是这样记载的:

而中文的"你"在字模中却是这样记载的:


  在硬件系统内,英文的字模信息一般固化在ROM里,即使在没有进入系统的CMOS里,也可以让你看到英文字符。而在DOS下,中文的字模信息一般记录在汉字库文件HZK16里。

汉字库文件

  了解字母和汉字是按字模位信息显示的原理后,那如何得到汉字的字模信息呢?难道要我们自己去做?NO。DOS前辈们经过艰辛的努力,将制作好的字模放到了一个个标准的库中以免去后辈的麻烦,这就是点阵字库文件。一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。减1是因为数组是以0为开始而区号位号是以1为开始的。这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。汉字库文该从该位置起的32字节信息即记录了该字的字模信息。

汉字库文件

  了解点阵汉字及汉字库的构成原理后,显示汉字就变得简单。以16*16点阵字库为例,通常的方法是:将文件工作指针移到需要的汉字字模处、将汉字库文件读入一2*16数组再用for循环一位位地显示。以使用VGAHI模式显示"我"字为例,程序如下:
#include "graphics.h"
#include "stdio.h"
main()
{
int i=VGA,j=VGAHI,k;
unsigned char mat[16][2],chinease[3]="我";
FILE *HZK;
if((HZK=fopen("hzk16","rb"))==NULL)
exit(0);
initgraph(&i,&j,"");
i=chinease[0]-0xa0;j=chinease[1]-0xa0; /*获得区码与位码*/
fseek(HZK,(94*(i-1)+(j-1))*32l,SEEK_SET);
fread(mat,32,1,HZK);

for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k=0;k<8;k++)
if(mat[j][i]&(0x80>>k)) /*测试为1的位则显示*/
putpixel(i*8+k,j,WHITE);

getch();
closegraph();
fclose(HZK);
}
怎么样?只要掌握了正确的方法,显示汉字并不复杂。

打印字库文件和HZK12

  如果你有UCDOS的HZK24S(宋体)、HZK24K(楷体)或HZK24H(黑体),你还可以使用不同字体的大字模汉字了。HZK24系列是24*24的点阵字库,每字模占用3*24字节。如果你按照HZK16的显示方法的话,你会看到......呵呵,字被放倒了。这是因为该类字库与一般的汉字库不同,这类大字模汉字库是专供打印的打印字库,为了打印的方便将字模都放倒了,你使用时,只要将字模的位信息纵横转置显示即可。例如你如果定义为mat[24][3]则应该这样输出:
for(i=0;i<24;i++)
for(j=0;j<24;j++)
if((0x80>>i%8)&mat[j][i/8]) /*转置显示*/
putpixel(j+x,y+i,color);
  还有一类字库HZK12,虽然属于标准字库类型,但如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。因为字库设计者为了使用的方便,字摸每行的位数均补齐为8的整数倍,于是实际该字库的位长度是16*12,虽然每行都多出了4位,但这4位都是0(不显示),并不影响显示效果。

用wxWidgets写跨平台UI界面

一般写跨平台的UI,都是用QT。但QT的界面在不同的平台下显示都像Linux的。因此,Windows用户用起来不是很习惯。另一个是开源的QT使用是有限制的。而wxWidgets同QT类似,可以实现跨平台UI。同样,也是开源,而且完全免费,不受限。最大的好处,就是wxWidgets的图形表现和相关平台是一致的。Windows下就像Windows程序,Linux下像Linux程序,Mac
OS下像Mac OS X程序。

wxWidgets使用一套代码,就可以实现Win32,Mac OS
X,GTK+,X11,Motif,Wince和更多的平台界面。而且还支持C++,C#/.net,
Perl,Python等多种语言。由于使用本地平台的组件,而不是模拟出来,所以它能够和本地平台表现完全一致。wxWidgets是开源,免费,可扩展,成熟的库。

在Linux下打开32位I/O和DMA

Linux下的32位I/O和DMA默认是关闭的,可是现在电脑的硬盘不会那么落伍吧!Linux好是好,但如果用的是16位I/O的话,电脑的性能就无法得到充分发挥,你心里一定会觉得很冤!没关系,跟我来吧。

  要打开32位I/O和DMA,需要以Root身份进行设置。为了降低因出错而重启系统对文件系统的损害,最好以单用户模式进行。可以先用下面的命令检查硬件驱动器的I/O情况。

  #hdparm -t /dev/hda

  屏幕显示如下:

  /dev/hda:

  Timing buffered disk reads:64MB in 30.93 seconds=2.07MB/sec

  如果要显示当前I/O、DMA配置,命令分别如下:

  #hdparm -c /dev/had (注:显示I/O配置命令)

  屏幕显示如下:

  /dev/hda:

  I/O support=0(16bit)

  # hdparm -d /dev/had (注:显示DMA配置命令)

  屏幕显示如下:

  /dev/hda:

  using_dma=0(off)

  在确定32位I/O和DMA是关闭的以后,用下面的命令将其打开:

  #hdparm -c 1 /dev/hda (注:打开32位I/O的命令)

  屏幕显示如下:

  /dev/hda:

  setting 32-bit I/O support flag to 1

  I/O support= 1 (default 16-bit)

  #hdparm -d 1 /dev/had (注:打开DMA的命令)

  屏幕显示如下:

  /dev/hda:

  setting using_dma to 0(on)

  hda:DMA inabled

  using_dma=1 (on)

  然后执行下面的命令以使配置生效:

  #hdparm -k 1 /dev/hda

  屏幕显示如下:

  /dev/hda:

  setting keep_settings to 1(on)

  keepsettings=1(on)

  然后,可以再用命令:hdparm -t /dev/hda 来看看效果:

  /dev/hda:

  Timing buffered disk reads:64MB in 14.53 seconds=4.40MB/sec

  怎么样,性能提高了一倍多!

  上面的方法,可以实现在一次开机中生效,而下一次开机又要重新设置。如果要实现每一次开机时都生效,应该在文件/etc/rc.d/rc.local的结尾加入以下命令:hdparm
-c 1 -d 1 -k 1 /dev/hda,它可以使设置在每次重新启动系统时生效。

利用linux处理网络流量数据

网络压力测试,需要处理原始数据,将原始的Byte/s
处理为Mbps,并通过直观曲线图表展示出来。

1.统计网卡流量
sar -n DEV 1 100 > net

得到网卡流量,原始数据如下:
10:32:41 IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s
txcmp/s rxmcst/s
10:32:42 lo 0.00 0.00 0.00 0.00
0.00 0.00 0.00
10:32:42 eth0 0.00 0.00 0.00 0.00
0.00 0.00 0.00
10:32:42 eth1 0.00 0.00 0.00 0.00
0.00 0.00 0.00
10:32:42 sit0 0.00 0.00 0.00 0.00
0.00 0.00 0.00

10:32:42 IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s
txcmp/s rxmcst/s
10:32:43 lo 0.00 0.00 0.00 0.00
0.00 0.00 0.00
10:32:43 eth0 79164.00 79161.00 8581912.00 8574255.00
0.00 0.00 0.00
10:32:43 eth1 0.00 0.00 0.00 0.00
0.00 0.00 0.00
10:32:43 sit0 0.00 0.00 0.00 0.00
0.00 0.00 0.00
...
10:34:19 IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s
txcmp/s rxmcst/s
10:34:20 lo 0.00 0.00 0.00 0.00
0.00 0.00 0.00
10:34:20 eth0 0.00 0.00 0.00 0.00
0.00 0.00 0.00
10:34:20 eth1 0.00 0.00 0.00 0.00
0.00 0.00 0.00
10:34:20 sit0 0.00 0.00 0.00 0.00
0.00 0.00 0.00
10:34:20 IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s
txcmp/s rxmcst/s
10:34:21 lo 0.00 0.00 0.00 0.00
0.00 0.00 0.00
10:34:21 eth0 79657.00 79657.00 8602734.00 8606166.00
0.00 0.00 0.00
10:34:21 eth1 0.00 0.00 0.00 0.00
0.00 0.00 0.00
10:34:21 sit0 0.00 0.00 0.00 0.00
0.00 0.00 0.00

Average: IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s
txcmp/s rxmcst/s
Average: lo 0.00 0.00 0.00 0.00
0.00 0.00 0.00
Average: eth0 40091.69 40091.51 4329888.64 4331543.93
0.00 0.00 0.00
Average: eth1 0.00 0.00 0.00 0.00
0.00 0.00 0.00
Average: sit0 0.00 0.00 0.00 0.00
0.00 0.00 0.00
其中rxbyt/s 表示每秒接受的byte数,txbyt/s
表示每秒发送的byte数。我们可以将其加工成Mbps

2. 我们需要处理 eth0网卡的流量,将其余流量去掉
cat net | grep eth0 > net1

我们得到数据如下:
10:32:42 eth0 0.00 0.00 0.00 0.00
0.00 0.00 0.00
10:32:43 eth0 79164.00 79161.00 8581912.00 8574255.00
0.00 0.00 0.00
...
10:34:20 eth0 0.00 0.00 0.00 0.00
0.00 0.00 0.00
10:34:21 eth0 79657.00 79657.00 8602734.00 8606166.00
0.00 0.00 0.00
Average: eth0 40091.69 40091.51 4329888.64 4331543.93
0.00 0.00 0.00
3.我们需要处理rxbyt/s ,txbyt/s 将其余的列去掉
gawk '{print $5,$6}' net1 > net2
gawk 命令的执行格式:
gawk '模式匹配|命令语句 {动作}' 处理文件
我们这里没有模式匹配和语句,直接执行动作,打印第5第6列。

得到数据如下:
0.00 0.00
8581912.00 8574255.00
0.00 0.00
8723086.00 8726654.00
0.00 0.00
8718490.00 8721642.00
0.00 0.00
8558670.00 8562184.00
...
0.00 0.00
8602734.00 8606166.00
4329888.64 4331543.93
4.以上的数据,每行代表1秒,但网卡流量每2秒才能取到一次数据。所以是奇偶相间的数据。第0行开始的偶数行都是0.
我们将偶数行的 0 去掉。
这里方法很多。
a.) sed -n '{n;p}' net2 > net3
该命令表示用sed,隔一行打印一行。单引号里大括号的n表示跳到下一行,分号分隔命令,p表示打印命令。
-n表示安静模式,只打印输出。否则会读一行打印一行。
b.) gawk '$1 != 0.00 ' net2 > net3
gawk
可以带if表达式,循环,功能很强。因为数据很有规律,我们可以偷点懒,直接将第一列是0.00的数据行删掉。该命令表示第一列不等于0.00就打印出来。

5.将byte/s 处理为Mbps,并求2秒的均值。
gawk 'a=$1*8/(2*1024*1024), b=$2*8/(2*1024*1024){print a,b}' net3 > net4
将每一列的值*8,得到bit数,除以1M,得到Mbps,除以2得到均值,并赋给变量a,b。再打印出a和b的值。

6.将文件处理为csv文件,再通过excel程序来生成统计图表
用vi将最后一行平均值去掉。并可以在vi中用:%s/ /,/g 将空格替换为逗号,:w
net.csv

7.用winSCP将net.csv传到windows,用excel 2007打开。
选中这两列数据,点插入,折线图,得到如下的图。可以调整一下标题和坐标说明。

ubuntu 9.10 gnome 终端vi 的esc键失效?

ubuntu使用中发现gnome终端vi的esc键有时失效。如果是插入模式,再也回不到命令模式,非常为难。只好直接关闭终端,留一下一个在编辑的垃圾文件。而CTRL+ALT+F1切换到字符界面,vi没有该问题。
后面有人提示,说是QQ的问题。
我从腾讯官网下载了QQ beta1的deb包安装的。一打字就导致QQ退出。而使用
Empathy则经常登不上QQ,修改client版本为qq2008也不行,以致引起QQ被锁死。采用编辑/usr/bin/qq,添加export
GDK_NATIVE_WINDOWS=true才解决QQ死的问题,如下。
zhouhh@zhhofs:~$ cat /usr/bin/qq
#!/bin/sh
export GDK_NATIVE_WINDOWS=true
cd /usr/share/tencent/qq/
./qq

QQ问题解决了,又引起Vi的问题。编辑文件后ESC不起作用。
因此,只好安装一个虚拟机或采用远程桌面的方式来使用QQ。
而ubuntu9.10缺省安装的vim-tiny非常不好用,缺省是与vi兼容模式,没有色彩。方向键会变成A
B C D。直接安装vim增强版
sudo apt-get install vim即可解决该问题。

比亚迪:巴菲特打破常规的投资

巴菲特为什么要投资比亚迪(1211.HK)?按照此前人们总结的规律,比亚迪绝非巴菲特青睐的企业。然而,巴菲特最终还是向王传福投了赞成票,给价值投资者们上了很好的一课:不要墨守成规。

  险些失之交臂

  从目前的结果来看,巴菲特投资比亚迪成绩斐然。巴菲特旗下的中美能源(MidAmerican
Energy)于2008年9月26日与比亚迪签订协议,以每股8港元的价格认购比亚迪2.25亿股H股。以12月1日比亚迪收盘价74.1港元计算,1年多的时间里这笔投资净收益高达826.25%。从图1来看,巴菲特选择的投资时机可以称得上完美。如果考虑到由于等待中国证监会的批准,中美能源完成购股实际出资的时间为2009年7月30日,这笔投资的资金使用效率相当高。

  不过,巴菲特做出投资比亚迪的决定并不轻松。据报道,巴菲特是在朋友和长期合作伙伴、伯克希尔-哈撒韦公司(Berkshire
Hathaway)的副董事长查理·芒格的推荐下,打破了一贯遵循的原则,投资于比亚迪。芒格对记者称,经营比亚迪的企业家王传福,是一位兼有爱迪生的能够解决科技问题能力和GE杰克。韦尔奇能够办到所有需要完成事情的人物。在巴菲特征询了另一位值得信赖的合作伙伴David
Sokol的意见,并请他到中国考察了比亚迪的实际情况后,才最终做出了投资决定。与仅看了两份年报就断然出手中石油(13.78,-0.13,-0.93%)相比,巴菲特此次投资显然更加慎重。

  芒格由于经常说"不"而曾被巴菲特这样开玩笑:"如果你向查理询问某些事情,而他给出的回答是'不',我们就会倾囊进行投资。如果他的答案是'那是我所听说过的最愚蠢的事情',我们就会进行适量投资。"既然连芒格都如此欣赏王传福,巴菲特似乎就不用多考虑了。此外,此次投资比亚迪只需18亿港元,与伯克希尔两千多亿美元的资产相比微不足道,似乎也不必太认真。

  虽然如此,我相信巴菲特还是认真地看过了比亚迪年报,确认这家公司有过人之处才敢下决心。人们评论这起投资时往往认为巴菲特打破了不投资高科技企业的常规,其实,从财务方面来看巴菲特也是打破了常规。

  打破财务常规

  此前,人们总结的巴氏投资原则中财务原则有4条,分别是:

  1. 注重权益回报而不是每股收益;

  2. 计算"股东收益";

  3. 寻求高利润率的公司;

  4. 公司保留1美元都要确保创立1美元市值。

  比亚迪乍看上去并不符合这几条原则。

  先看第一条原则。比亚迪的净资产收益率并不是非常出色,与竞争对手富士康国际(2038.HK)相比略逊一筹,而且资产负债率偏高,巴菲特偏爱资产负债率低的企业也是有名的。如果仅从这两个财务指标作判断,比亚迪使用了更多的财务杠杆,股东权益回报却仍然不如竞争对手,显然不是一家值得投资的企业。事实上,比亚迪曾经在2006年年报中披露公司2007年3月与多家银行订立延长贷款协议,其中7亿元的长期贷款获延续超过1年,这足以说明公司财务压力之大。需要说明的是,本文很多时候只分析比亚迪2007年及以前年度的报表,是因为巴菲特在做出投资决定时只能看到这些。

  再来看第二条。所谓"股东收益",或者称"所有者收益",代表(a)报告收益(即会计利润),加上(b)折旧费用、折耗费用、摊销费用和其他非现金费用,减去(c)企业为维护其长期竞争地位和单位产量而用于厂房和设备的年平均资本化开支,等等。其重点在(c),巴菲特不喜欢资本开支大的企业。

  近来颇为流行的《巴菲特教你读财报》一书对此有更为具体的陈述,"巴菲特发现,如果一家公司将净利润用于资本开支的比例一直保持有50%之下,那么你可以把它列入具有持续竞争优势公司的候选者名单。如果该比例保持低于25%的水平,那这家公司就很可能具有于之有利的持续性竞争优势。"

  比亚迪的资本支出却是惊人的大,请看表1,我们以投资活动产生的现金流量净额(负数)来估计资本支出。比亚迪经营活动产生的现金流,根本负担不起庞大的资本支出,不得不高度依赖筹资活动。

  比亚迪的毛利率也不高,而且逐年下滑。按《巴菲特教你读财报》一书中的说法,"相对于我们所熟知的这些优质企业(可口可乐、穆迪、伯灵顿北方圣太菲铁路运输公司、箭牌公司),那些长期经济运行情况不太良好的公司,其毛利率就相形见绌了。例如:濒临破产的美国航空公司,它的毛利率仅为14%;陷入困境的汽车制造商——通用汽车制造公司,其毛利率只有21%;曾经陷入困境,但现在已经扭亏为盈的美国钢铁公司的毛利率为17%;一年四季都在运营的固特异轮胎公司,在经济状况不太良好时,毛利率也只有20%。"显然,比亚迪的毛利率水平和那些"长期经济运行情况不太良好的公司"在同一个档次。

  此外,比亚迪2007年研发支出高达6.95亿元,占毛利的16.37%。我们再次引用《巴菲特教你读财报》的说法,"这是巴菲特的一个原则:那些必须花费巨额研发开支的公司都有在竞争优势上的缺陷,这将使它们的长期经营前景置于风险中,意味着它们并不太保险。如果不是一项比较保险的投资,巴菲特是不会对其产生兴趣的。"

  第4条原则我们就不讨论了,市值问题相对复杂,仅从上面所分析的内容来看,比亚迪似乎已经可以确认为没有持续性竞争优势的公司了。

  读财报无定法

  然而,巴菲特最终还是投资了比亚迪。那么,人们此前的总结错了么?《巴菲特教你读财报》的作者之一是巴菲特的前儿媳,她也没有学全老人家的财务分析技能?

  说实话,我对《巴菲特教你读财报》这类书颇有些不以为然,财报分析并非简单地算几个比例就能做好的,否则,全世界会有成千上万个巴菲特了。在拙著《年报掘金》一书中我主张"读年报要灵活",并举了巴菲特的例子:2007年,央视记者在采访巴菲特曾经问过这样一个问题:"您最关心年报中的哪些方面?"巴老的回答是:"学生们总是问我这个问题,但是所有的年报都是不同的,如果你要找个男人的话,什么样的吸引你?是有体育才能的,还是帅的,还是聪明的?同样看企业也有不同的方法,一个企业到另外一个企业,我看的是不同的东西。"

  在书中那一节里,我还强调了分部数据的重要性,其实,巴菲特早就有过这样的阐述,"我们在伯克希尔准备合并数值的唯一原因是为了达到外部的要求。另一方面,查理和我一直在研究我们的分部数据。"

  然而,《巴菲特教你读财报》一书中却没有涉及到分部数据的内容,而恰恰是业务分部数据能够让我们发现比亚迪其实是具有一定竞争优势的。

  2005至2007年,比亚迪各业务分部的营业收入均有所增长,而汽车及相关产品增速尤其迅猛。但是,汽车及相关产品业务对比亚迪的利润却贡献甚微。2005至2007年,比亚迪汽车业务的利润率分别只有-14.53%、3.59%和5.28%。在这里,我们用经营利润(比亚迪财报中称之为分部业绩)除以营业收入(比亚迪财报中称之为分部收益)计算出利润率,需要说明的是经营利润(分部业绩)没有扣除融资成本,可以大致认为是息税前利润。

  之所以会这样,无非是因为比亚迪的汽车业务尚未形成规模,但是,如果其汽车业务继续高速成长,规模效应一旦形成,盈利情况就会有一个飞跃。事实上,比亚迪汽车业务2009年上半年的利润率已经上升到14.41%。

  也就是说,在比亚迪2007年以前的年报中,如果投资者只看合并数据,那么颇具价值的汽车业务其实是扮演了"价值杀手"的角色,这显然是一种误读。

  再来看手机部件业务,与2006年相比,2007年比亚迪这块业务的营业收入增长了78.92%,经营利润却只增长了18.99%,利润率为11.68%,同比下降了5.88个百分点。虽然比亚迪的数据有美中不足之处,但竞争对手富士康国际的数据就更不能令人满意,2007年营业收入增长了3.38%,经营利润却下降了1.50%,且利润率只有7.33%。

  从利润率指标来看,比亚迪可能比富士康更具成本优势。在2007年年报中,两家公司都认为手机行业竞争加剧,产品价格压力加大,在这种情况下,显然比亚迪的日子会更好过些。2009年上半年,比亚迪的手机部件业务的利润率跌至3.14%,而富士康国际竟然亏损了1870万美元。

  尽管从合并报表数据来分析,比亚迪的竞争优势不如富士康,然而具体到分部数据后,结论却是相反的。这一案例再次证明,分部数据的重要性理应受到投资者的重视。

  还有别的理由么?

  对巴菲特投资比亚迪,人们还可以找出更多的理由,如巴老看好新能源的发展前景等。事实上,我们也可以把比亚迪的电动车业务看做一项期权来估值,尽管这一业务目前还没有产生什么效益。然而,我认为这一案例给我们最大的启示还是要不拘泥于常规。

  以2007年的净利润计算,巴菲特是以10.18倍市盈率投资比亚迪的,对于一家成长型企业来说,这样的市盈率是很低的。价格低廉,应该也是巴菲特敢于打破常规的一个重要原因。

  比亚迪是一家周期性企业,但是,就连芒格这样擅长说"不"的人都认为,"我们并不期待它(收购的候选企业)直线型地增长,只要价格适中,周期性增长亦可以。"由此来看,买入价格低对价值投资的重要性无论如何强调都不为过。

  不过,在巴菲特的思考过程中,如果比亚迪将要发行A股也是一个重要因素,那就值得内地的投资者警惕了。众所周知,巴菲特当年卖出中石油股票后,国内一片哗然,不少人对他不等到中石油回归A股后再卖出颇有些不屑,想来巴菲特也听到了这些声音。其实,上市公司高价发行新股总是对老股东有利的,这似乎也可以为巴老投资比亚迪增添安全边际。不过,还没等到比亚迪高价发行A股,10月22日,港交所披露,国际大投行巴克莱以近10倍于巴菲特认购价的78.145港元的高价斥资25.26亿港元增持比亚迪。由此来看,比亚迪高价回归A股是大概率事件。

  以芒格的性格,我相信他不会同意在短期内抛售比亚迪的股票,即使股价已严重透支。如果我的判断正确,伯克希尔长期持有比亚迪这样一只周期股,恐怕又会让国内一些"价值投资者"们吃惊了!

遭遇SIGPIPE

我写了一个服务器程序, 在Windows下在cygwin环境编译后执行,
然后用C#写了多线程客户端进行压力测试. 程序一直运行正常.
但当在Linux下测试时, 总是莫名退出. 最后跟踪到是write调用导致退出.
用gdb执行程序, 退出时提示"Broken pipe".

最后问题确定为, 对一个对端已经关闭的socket调用两次write,
第二次将会生成SIGPIPE信号, 该信号默认结束进程.

具体的分析可以结合TCP的"四次握手"关闭. TCP是全双工的信道,
可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时,
虽然本意是关闭整个两条信道, 但本端只是收到FIN包. 按照TCP协议的语义,
表示对端只是关闭了其所负责的那一条单工信道, 仍然可以继续接收数据.
也就是说, 因为TCP协议的限制,
一个端点无法获知对端的socket是调用了close还是shutdown.


截图来自: UNPv1

对一个已经收到FIN包的socket调用read方法, 如果接收缓冲已空, 则返回0,
这就是常说的表示连接关闭. 但第一次对其调用write方法时, 如果发送缓冲没问题,
会返回正确写入(发送). 但发送的报文会导致对端发送RST报文,
因为对端的socket已经调用了close, 完全关闭, 既不发送, 也不接收数据. 所以,
第二次调用write方法(假设在收到RST之后), 会生成SIGPIPE信号, 导致进程退出.

为了避免进程退出, 可以捕获SIGPIPE信号, 或者忽略它,
给它设置SIG_IGN信号处理函数:

signal(SIGPIPE, SIG_IGN);

这样, 第二次调用write方法时, 会返回-1, 同时errno置为SIGPIPE.
程序便能知道对端已经关闭.

PS: Linux下的SIGALRM似乎会每1秒钟往后偏移1毫秒,
但Windows下经过测试完全准时, 不差1毫秒.

忽略SIGPIPE信号的方法
http://hi.baidu.com/greathongjian/blog/item/2f695643091885139213c65a.html
struct sigaction sa;
sa.sa_handler = SIG_IGN;//设定接受到指定信号后的动作为忽略
sa.sa_flags = 0;
if (sigemptyset(&sa.sa_mask) == -1 || //初始化信号集为空
sigaction(SIGPIPE, &sa, 0) == -1) { //屏蔽SIGPIPE信号
perror("failed to ignore SIGPIPE; sigaction");
exit(EXIT_FAILURE);
}

pthread线程里如何屏蔽SIGPIPE异常
hi.baidu.com/ailacy/blog/item/a7eb65f8b8b55707d8f9fdd5.html
http://bbs2.chinaunix.net/viewthread.php?tid=985166&extra=&page=1
在pthread中,可能会遇到Program received signal SIGPIPE, Broken
pipe的问题,解决方法是每一个线程启动之前时,先执行下面代码:

#ifndef WIN32
sigset_t signal_mask;
sigemptyset (&signal_mask);
sigaddset (&signal_mask, SIGPIPE);
int rc = pthread_sigmask (SIG_BLOCK, &signal_mask, NULL);
if (rc != 0) {
printf("block sigpipe error\n");
}

Which Is the Top Tech Company to Work For?

Looking for a tech job? Well read on for the results of a new poll from
Sausalito, Calif.-based Glassdoor.com as to the best — and worst — tech
companies from which to draw a paycheck.

I had expected Google to take top honors given its stock performance, not
to mention what it spends on food and other amenities for its employees. I
guess money really doesn't buy happiness — the search giant ranked No. 3
on the list, while Apple came in at No. 5. The top-ranked company? Router
maker Juniper Networks. (Full results of the survey will be released
tomorrow.)
Highest-Rated Tech Companies for 2009
Rank Company Company Rating CEO CEO Approval Rating
1 Juniper Networks 3.9 Kevin Johnson 65%
2 National Instruments 3.9 James J. Truchard 85%
3 Google 3.9 Eric E. Schmidt 87%
4 NetApp 3.9 Dan Warmenhoven 78%
5 Apple 3.8 Steve Jobs 91%
6 QUALCOMM 3.7 Paul E. Jacobs 65%
7 Novell 3.7 Ron Hovsepian 59%
8 Adobe 3.7 Shantanu Narayen 60%
9 EMC 3.7 Joe Tucci 64%
10 Rackspace 3.6 A. Lanham Napier 67%


As for the lowest-rated, it looks like Dell hit a home run by buying Perot
Systems — it has the dubious honor of coming in at No. 10.
Lowest-Rated Tech Companies
Rank Company Company Rating CEO CEO Approval Rating
1 Xilinx 2.3 Moshe Gavrielov 12%
2 Affiliated Computer Services 2.4 Lynn R. Blodgett 21%
3 Hewlett-Packard 2.4 Mark V. Hurd 22%
4 Avaya 2.5 Kevin Kennedy 24%
5 Real 2.5 Rob Glaser 12%
6 NVIDIA 2.5 Jen-Hsun Huang 52%
7 Infosys 2.6 Kris Gopalakrishnan 35%
8 Nortel Networks 2.7 Mike S. Zafirovski 2%
9 Perot Systems 2.7 Peter A. Altabef 35%
10 Dell 2.8 Michael S. Dell 28%

putty的复制和粘贴

本文是putty/pietty操作的tips,可以让操作提高效率。因为复制粘贴经常使用,比重新敲入要方便许多。putty的粘贴可以配置为鼠标中键或右键,此文假设为右键。(某些环境下配置不一样,对应本文中的右键和中键切换)

1.在windows中复制往putty中粘贴
windows中复制:直接选中文本,按Ctrl+C。
putty中粘贴:鼠标右键

》vi 中的复制粘贴问题
但对于vi编辑有点特殊。粘贴前应位于插于模式,不像vi快捷键P,是命令模式下的粘贴。粘贴的位置是光标所在的位置,而不是鼠标点的位置。
如果vim里有set ai (auto indent)或者set
cindent,对于格式化文本,粘贴时可能导致前面不断叠加空格,使格式完全错乱。那么在.vimrc里加一句set
paste,即可正确粘贴格式化文本。

2. putty 复制
putty用鼠标左键选中即已经放到剪贴板。选中后即可在windows的其他编辑器或输入栏按Ctrl+V
粘贴。往putty粘贴直接点鼠标右键。

》putty选择并复制小技巧
鼠标左键按住拖拉选择,即已经复制。
双击鼠标左键,选择复制一个单词,支持中文。双击并在第二次按下时不放,拖动鼠标左键,会按单词选择。
鼠标三击,会选择并复制一行。鼠标三击并在最后一击时拖动,会按行选择。
按住左Alt,拖动鼠标左键,会选择方块。但putty菜单的windows(窗口)->move
hotkey(移动热键)的左Alt+左键拖动应取消。
选择完了要补选复制,可以按下中键并拖动。补选方式和此前的选择方式一样,单击的补选是按字母,双击的补选是按单词。三击的补选是按行。窗口选择的补选是窗口选择。

好用的convmv(献给所有转向FC的,或从gb转向utf8的人)

由于FC将字符编码统一成了UTF8,原来在gb18030下建立的ext3分区中的文件和目录,一挂载到FC上就显示成乱码。google遍整个互联网,说对于目录名和文件名,有一个叫convmv的软件可以对其进行自动转换。
今日下载了convmv,摸索了一套使用方法如下:
convmv -f code1 -t code2 -r <dir>
code1:分区原来使用的字符集编码。支持gb2312、gbk、big5,不支持gb18030和big5-hkscs。
code2:预转换到的字符集编码。对于FC,这里填写utf8
-r 参数:转换子目录。
dir:要转换的目录,当前目录用./表示。
回车执行,这个时候convmv会显示执行的结果,但不会真正对文件进行修改。并提示使用--replace参数进行修改。

文件名编码转换convmv

经常遇到要把GBK或者UTF-8编码的文件转成其它编码的情况。(例如:在utf8的locale中,要把文件复制到windows的分区中,或打包发送给使用Windows的用户,通常要把文件名转换成gbk码。而如果要把gbk的locale转成utf8的,则需要对文件名做编码转换。又或者您使用的发行版默认编码不同,红旗是GB18030,红帽是UTF-8等,这就需要转换编码了。)
手动操作文件夹很麻烦,工具convmv解决了这一问题。并支持批量转换。
注意:
不要在NTFS或FAT文件系统上做此种操作,否则可能产生意外结果。如果要在Linux中正确显示NTFS和
FAT的中文件名,请参阅挂载Windows分区。
convmv存在于常见操作系统的源中。如果当前没有工具,可以直接安装。

实时股票数据接口大全

股票数据的获取目前有如下两种方法可以获取:
1. http/javascript接口取数据
2. web-service接口
1.http/javascript接口取数据

1.1Sina股票数据接口

以大秦铁路(股票代码:601006)为例,如果要获取它的最新行情,只需访问新浪的股票数据
接口:
http://hq.sinajs.cn/list=sh601006

这个url会返回一串文本,例如:
var hq_str_sh601006="大秦铁路, 27.55, 27.25, 26.91, 27.55, 26.20, 26.91,
26.92,
22114263, 589824680, 4695, 26.91, 57590, 26.90, 14700, 26.89, 14300,
26.88, 15100, 26.87, 3100, 26.92, 8900, 26.93, 14230, 26.94, 25150,
26.95, 15220, 26.96, 2008-01-11, 15:05:32";

这个字符串由许多数据拼接在一起,不同含义的数据用逗号隔开了,按照程序员的思路,顺序号从0开始。

0:"大秦铁路",股票名字;
1:"27.55″,今日开盘价;
2:"27.25″,昨日收盘价;
3:"26.91″,当前价格;
4:"27.55″,今日最高价;
5:"26.20″,今日最低价;
6:"26.91″,竞买价,即"买一"报价;
7:"26.92″,竞卖价,即"卖一"报价;
8:"22114263″,成交的股票数,由于股票交易以一百股为基本单位,所以在使用时,通常把该值除以一百;
9:"589824680″,成交金额,单位为"元",为了一目了然,通常以"万元"为成交金额的单位,所以通常把该值除以一万;
10:"4695″,"买一"申请4695股,即47手;
11:"26.91″,"买一"报价;
12:"57590″,"买二"
13:"26.90″,"买二"
14:"14700″,"买三"
15:"26.89″,"买三"
16:"14300″,"买四"
17:"26.88″,"买四"
18:"15100″,"买五"
19:"26.87″,"买五"
20:"3100″,"卖一"申报3100股,即31手;
21:"26.92″,"卖一"报价
(22, 23), (24, 25), (26,27), (28, 29)分别为"卖二"至"卖四的情况"
30:"2008-01-11″,日期;
31:"15:05:32″,时间;

一个简单的JavaScript应用例子:
<script type="text/javascript" src="http://hq.sinajs.cn/list=sh601006"
charset="gb2312"></script>
<script type="text/javascript">
var elements=hq_str_sh601006.split(",");
document.write("current price:"+elements[3]);
</script>

这段代码输出大秦铁路(股票代码:601006)的当前股价

current price:14.20

如果你要同时查询多个股票,那么在URL最后加上一个逗号,再加上股票代码就可以了;比如你要一次查询大秦铁路(601006)和大同煤业(601001)的行情,就这样使用URL:
http://hq.sinajs.cn/list=sh601003,sh601001

查询大盘指数,比如查询上证综合指数(000001):
http://hq.sinajs.cn/list=s_sh000001

服务器返回的数据为:

var hq_str_s_sh000001="上证指数,3094.668,-128.073,-3.97,436653,5458126";

数据含义分别为:指数名称,当前点数,当前价格,涨跌率,成交量(手),成交额(万元);

查询深圳成指数:
http://hq.sinajs.cn/list=s_sz399001

对于股票的K线图,日线图等的获取可以通过请求http://image.sinajs.cn/…./…/*.gif此URL获取,其中*代表股票代码,详见如下:

查看日K线图:
http://image.sinajs.cn/newchart/daily/n/sh601006.gif

分时线的查询:
http://image.sinajs.cn/newchart/min/n/sh000001.gif

日K线查询:
http://image.sinajs.cn/newchart/daily/n/sh000001.gif

周K线查询:
http://image.sinajs.cn/newchart/weekly/n/sh000001.gif

月K线查询:
http://image.sinajs.cn/newchart/monthly/n/sh000001.gif

1.2 Baidu&Google的财经数据
在baidu,
google中搜索某只股票代码时,将会在头条显示此股票的相关信息,例如在google搜索601006时,
第一条搜索结果如下图:
通过点击左边的图片我们发现会将此图片链接到sina财经频道上,也就是说google股票数据的获取也是从sina获取。后经抓包分析,发现google也是采用1.1中介绍的接口。

Baidu的股票数据来自baidu的财经频道
http://stock.baidu.com/

1.3 其他方式
除了sina,baidu等网站提供股票信息外,其他网站也有类似的接口。我们分析了一款论坛上采用的股票插件,
其中有关于实时股票数据获取的介绍,详见如下代码,其中可以看到有些数据来自sina。
以下是ASP示例:
<%
'==========================
' file: stock_getdata.asp
' version: 1.0.0
' copyright (c) czie.com all rights reserved.
' web: http://www.czie.com
'==========================
function gethttp(rurl)
dim xml
on error resume next
set xml=server.createobject("Microsoft.XMLHTTP")
xml.open "get",rurl,false
xml.send
if not xml.readystate=4 or not xml.status=200 or err
then gethttp="":exit function
gethttp=xml.responsetext
set xml=nothing
end function
function getstockdata(code)
'0=股票名称,1=开盘价格,2=昨收盘价格,3=当前价格,4=最高价,5=最低价,30,31=更新时间
dim checkcode,stockdata,stockdatasplit
if len(code)<5 then
stockdata="0,0,0,0,0,0,0,0,0,0,0,0":exit function
checkcode=mid(code,len(code)-5,1)
if int(checkcode)<=4 then
stockdata=gethttp("http://hq.sinajs.cn/list=sz"&code&"")
if not len(stockdata)=0 then
stockdata=split(stockdata,chr(34))(1)
end if
if int(checkcode)>=5 then
stockdata=gethttp("http://hq.sinajs.cn/list=sh"&code&"")
if not len(stockdata)=0 then
stockdata=split(stockdata,chr(34))(1)
end if
if len(stockdata)=0 then
stockdata="0,0,0,0,0,0,0,0,0,0,0,0"
else
stockdatasplit=split(stockdata,",")
stockdata=""&exstock.checkstr(stockdatasplit(0))&","&stockdatasplit(1)&","&stockdatasplit(2)&","&stockdatasplit(3)&","&stockdatasplit(4)&","&stockdatasplit(5)&","&formatdatetime(""&stockdatasplit(30)&"
"&stockdatasplit(31)&"",0)&""
end if
'0=股票名称,1=开盘价格,2=昨收盘价格,3=当前价格,4=最高价,5=最低价,6=更新时间
getstockdata=stockdata
end function

function getstockimg(code)
dim rndnum,addnum,checkcode,imgsource
if len(code)<5 then exit function
addnum=4
randomize:rndnum=cint(rnd*addnum)
select case rndnum
case 0
getstockimg="http://www.10jqka.com.cn/curve/kline/?code="&code&""
imgsource="http://www.10jqka.com.cn"
case 1
getstockimg="http://stock.jrj.com.cn/htmdata/KLINE/"&code&".png"
imgsource="http://stock.jrj.com.cn"
case 2
checkcode=mid(code,len(code)-5,1)
if int(checkcode)<=4 then
getstockimg="http://image.sinajs.cn/newchart/daily/n/sz"&code&".gif"
end if
if int(checkcode)>=5 then
getstockimg="http://image.sinajs.cn/newchart/daily/n/sh"&code&".gif"
end if
imgsource="http://finance.sina.com.cn"
case 3
getstockimg="http://hq.gazxfe.com/stockchart/realline.chart?"&code&"&1003&SZ
500 330"
imgsource="http://hq.gazxfe.com"
case 4
getstockimg="http://chartse.stockstar.com/chartserver?code="&code&""
imgsource="http://www.stockstar.com/"
end select
getstockimg=split(""&getstockimg&"||"&imgsource&"","||")
end function

function getastockimg()
dim rndnum,addnum,checkcode
dim getastockimgb,imgsource
addnum=6
randomize:rndnum=cint(rnd*addnum)
select case rndnum
case 0
getastockimg="http://202.109.106.1/gifchartse/gif/000001.gif"
getastockimgb="http://202.109.106.1/gifchartse/gif/399001.gif"
imgsource="http://www.stockstar.com/"
case 1
getastockimg="http://money.163.com/special/100.gif?C39"
getastockimgb="http://money.163.com/special/101.gif?HrS"
imgsource="http://www.163.com"
case 2
getastockimg="http://www.10jqka.com.cn/curve/realtime/index2.php?code=1a0001&w=180&h=140"
getastockimgb="http://www.10jqka.com.cn/curve/realtime/index2.php?code=399001&w=180&h=140"
imgsource="http://www.10jqka.com.cn"
case 3
getastockimg="http://chart.cnlist.com/stockchart/realline.chart?1a0001&1002&SZ
180 140"
getastockimgb="http://chart.cnlist.com/stockchart/realline.chart?399001&1002&SZ
180 140"
imgsource="http://chart.cnlist.com/"
case 4
getastockimg="http://image.sinajs.cn/newchart/small/ish000001.gif?1189176558328"
getastockimgb="http://image.sinajs.cn/newchart/small/isz399001.gif?1189176558328"
imgsource="http://www.sinajs.cn"
case 5
getastockimg="http://218.1.72.66/cgi/pic/sh/realtime/JA000001164143.png"
getastockimgb="http://218.1.72.66/cgi/pic/sz/realtime/JA399001164143.png"
imgsource="http://www.cnstock.com/"
case 6
getastockimg="http://222.73.29.85/img/000001.png"
getastockimgb="http://222.73.29.85/img/399001.png"
imgsource="http://www.eastmoney.com/"
end select
getastockimg=split(""&getastockimg&"||"&getastockimgb&"||"&imgsource&"","||")
end function
%>
2. web-service接口

2.1 CHINAstock的web-service:
http://www.webxml.com.cn/WebServices/ChinaStockWebService.asmx

中国股票行情数据 WEB
服务(支持深圳和上海股市的全部基金、债券和股票),数据即时更新。输出GIF分时走势图、日/周/月
K
线图、及时行情数据(股票名称、行情时间、最新价、昨收盘、今开盘、涨跌额、最低、最高、涨跌幅、成交量、成交额、竞买价、竞卖价、委比、买一
- 买五、卖一 - 卖五)。此WEB服务提供了如下几个接口:

2.1.1 getStockImageByCode
GET 股票GIF分时走势图
INput:theStockCode = 股票代号,如:sh000001
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1
Host: www.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/getStockImageByCode"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getStockImageByCode xmlns="http://WebXml.com.cn/">
<theStockCode>string</theStockCode>
</getStockImageByCode>
</soap:Body>
</soap:Envelope>

Output:

2.1.2 getStockImageByteByCode
获得中国股票GIF分时走势图字节数组

INput:theStockCode = 股票代号,如:sh000001
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1Host:
www.webxml.com.cnContent-Type: text/xml; charset=utf-8Content-Length:
lengthSOAPAction: "http://WebXml.com.cn/getStockImageByteByCode" <?xml
version="1.0" encoding="utf-8"?><soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body>
<getStockImageByteByCode xmlns="http://WebXml.com.cn/">
<theStockCode>string</theStockCode> </getStockImageByteByCode>
</soap:Body></soap:Envelope>

返回的数据如下:


R0lGODlhIQIsAfcAAAAAAAwLBxkGBQ4ODhAQEBsSChUVFS4TDB8eGQkA9koPCDAAzy4mFVgAp2UYC0IqEUYuBVwiDEAsI1QnFX8AgDU1NUozFlgxD6cBWVY5FnIwEmQ4Gc0AMlhDHPEADlVJMEpKSm1IHOUBWpY3FZMyVY9IGXRWIEFmWGNYUmpdPXJgHQB8HK9EGGBgX4lXIACoAHhkMyt4m4VkJtstbv8A

2.1.3 getStockImage_kByCode
直接获得中国股票GIF日/周/月 K 线图(545*300pixel/72dpi)
INPUT: theStockCode = 股票代号
theType = K 线图类型(D:日[默认]、W:周、M:月),
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1Host:
www.webxml.com.cnContent-Type: text/xml; charset=utf-8Content-Length:
lengthSOAPAction: "http://WebXml.com.cn/getStockImage_kByCode" <?xml
version="1.0" encoding="utf-8"?><soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body>
<getStockImage_kByCode xmlns="http://WebXml.com.cn/">
<theStockCode>string</theStockCode> <theType>string</theType>
</getStockImage_kByCode> </soap:Body></soap:Envelope>

比如按照下图所示输入:
返回的结果就是周K线图:

2.1.4 getStockImage_kByteByCode
获得中国股票GIF日/周/月 K 线图字节数组
Input:theStockCode = 股票代号,如:sh000001
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1Host:
www.webxml.com.cnContent-Type: text/xml; charset=utf-8Content-Length:
lengthSOAPAction: "http://WebXml.com.cn/getStockImage_kByteByCode" <?xml
version="1.0" encoding="utf-8"?><soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body>
<getStockImage_kByteByCode xmlns="http://WebXml.com.cn/">
<theStockCode>string</theStockCode> <theType>string</theType>
</getStockImage_kByteByCode> </soap:Body></soap:Envelope>HTTP/1.1 200
OKContent-Type: text/xml; charset=utf-8Content-Length: length <?xml
version="1.0" encoding="utf-8"?><soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body>
<getStockImage_kByteByCodeResponse xmlns="http://WebXml.com.cn/">
<getStockImage_kByteByCodeResult>base64Binary</getStockImage_kByteByCodeResult>
</getStockImage_kByteByCodeResponse> </soap:Body></soap:Envelope>

比如按照下图输入:
返回的结果就是周K线图字节数组


R0lGODlhIQIsAfcAAAAAAAwLBxkGBQ4ODhAQEBsSChUVFS4TDB8eGQkA9koPCDAAzy4mFVgAp2UYC0IqEUYuBVwiDEAsI1QnFX8AgDU1NUozFlgxD6cBWVY5FnIwEmQ4Gc0AMlhDHPEADlVJMEpKSm1IHOUBWpY3FZMyVY9IGXRWIEFmWGNYUmpdPXJgHQB8HK9EGGBgX4lXIACoAHhkMyt4m4VkJtstbv8A

2.1.5 getStockInfoByCode
获得中国股票及时行情
input:theStockCode = 股票代号
POST /WebServices/ChinaStockWebService.asmx HTTP/1.1Host:
www.webxml.com.cnContent-Type: text/xml; charset=utf-8Content-Length:
lengthSOAPAction: "http://WebXml.com.cn/getStockInfoByCode" <?xml
version="1.0" encoding="utf-8"?><soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body>
<getStockInfoByCode xmlns="http://WebXml.com.cn/">
<theStockCode>string</theStockCode> </getStockInfoByCode>
</soap:Body></soap:Envelope>

返回的值一个一维字符串数组
String(24),结构为:String(0)股票代号、String(1)股票名称、String(2)行情时间、String(3)最新价(元)、String(4)昨收盘(元)、String(5)今开盘(元)、String(6)涨跌额(元)、String(7)最低(元)、String(8)最高(元)、String(9)涨跌幅(%)、String(10)成交量(手)、String(11)成交额(万元)、String(12)竞买价(元)、String(13)竞卖价(元)、String(14)委比(%)、String(15)-String(19)买一
- 买五(元)/手、String(20)-String(24)卖一 - 卖五(元)/手。

Web
service的方法类似于现在concurrent项目的DBWS数据的获取,都是通过SOAP协议向DBWS服务器获取相关的数据。

利用雅虎查中国股票
http://quote.yahoo.com/d/quotes.csv?s=MSFT&f=slc1wop

返回微软的股票价格

"MSFT","4:00pm - 30.70",+1.04,"21.46 - 30.75",29.77,29.66
http://quote.yahoo.com/d/quotes.csv?s=000969.SZ&f=slc1wop

这个返回安泰科技的,一般有半个小时的延迟。

但是s=000969.sz 这个后面的sz是深圳的意思, 沪市是SS后缀

ubuntu9.10 使用

ubuntu 9.10
号称可以叫板windows7,功能方面相当强悍。比如可能引起下一波屏幕手写浪潮的多点触摸,ubuntu9.10也同样具有,而且还有ubuntu
one云计算2G 免费空间。
至于3D桌面等炫酷功能,也是更早版本就已经带了。不过由于本人电脑一直比较破,还没有试用过这些功能。

在参加linux
内核大会时,坐旁边的是canonical上海公司的员工,看到他把苹果笔记本装了ubuntu
9.10 beta版,很是羡慕。因此一直翘首等待9.10正式版发行。

-------------------------------
1. 下载ubuntu9.10和在windows下安装
-------------------------------
在ubuntu 刚刚发布当天,我就下载来最新官方正式版。

国内下载比较快的地址是sohu和163的镜像,推荐一下。

http://mirrors.sohu.com/ubuntu-releases/karmic/

http://mirrors.163.com/ubuntu-releases/9.10/

ubuntu.com网站上并没有列举国内的镜像。

下载完毕,可以用ultraiso 虚拟到光驱,如下图:

虚拟光驱完成后点开相应的盘,看到一个wubi.exe,双击看到安装提示界面:

该版本非常人性化。可以用虚拟光驱在windows下面安装,并可以选择liveCD
方式进入再全面安装,也可以直接安装在windows分区。我选择后一种方式,提示是硬盘访问会稍微慢一点。但实际上感觉不到。

点了"在windows中安装"后,奇怪的是语言包里各种语言都有,包括Japanese,居然没有Chinese的选项,只好选English(US),挺郁闷的。如下图,一共提供了110多种语言选项,居然没有中文,害得我反复寻找,以为自己看花眼了。

用English(US)选项安装,不仅安装过程是英文的,安装完毕的系统也是英文的,没有切换为中文的选项。必须手动从网上下中文语言包。

系统解压,重新启动,会看到启动菜单里除了原来windows的选项,还有一个ubuntu的选项,选择该选项。系统自动安装,非常简单,没有指定安装任何驱动,即全部支持,包括网卡和声卡显卡。大概10多分钟就装完了。重启。

------------------
2.缺省安装没有中文支持
------------------
进入后,全是英文界面,当然也不会有中文输入法。在System的Preferences(首选项)的Network
Connections(网络链接)里,不是dhcp, 配好wired/wireless的 IP 和DNS
,即可上网,可以浏览中文网页。

进入System->administrator->Language support,
里面可选的语言也只有English,没有中文。

-------------
3.配置大陆更新源
-------------
先配一下大陆的下载源。可以将sohu和163的作为主要的。

cd /etc/apt
sudo cp sources.list sources.list.bk
sudo gedit /etc/apt/sources.list

将原来的us源清空,配置sources.list如下:
view plaincopy to clipboardprint?
#搜狐Ubuntu 9.10更新源
# Ping平均时长:40ms
deb http://mirrors.sohu.com/ubuntu/ karmic main restricted
deb-src http://mirrors.sohu.com/ubuntu/ karmic main restricted
deb http://mirrors.sohu.com/ubuntu/ karmic-updates main restricted
deb-src http://mirrors.sohu.com/ubuntu/ karmic-updates main restricted
deb http://mirrors.sohu.com/ubuntu/ karmic universe
deb-src http://mirrors.sohu.com/ubuntu/ karmic universe
deb http://mirrors.sohu.com/ubuntu/ karmic-updates universe
deb-src http://mirrors.sohu.com/ubuntu/ karmic-updates universe
deb http://mirrors.sohu.com/ubuntu/ karmic multiverse
deb-src http://mirrors.sohu.com/ubuntu/ karmic multiverse
deb http://mirrors.sohu.com/ubuntu/ karmic-updates multiverse
deb-src http://mirrors.sohu.com/ubuntu/ karmic-updates multiverse
# 网易163 Ubuntu 9.10更新源
# Ping平均时长:60ms
deb http://mirrors.163.com/ubuntu/ karmic main restricted universe
multiverse
deb http://mirrors.163.com/ubuntu/ karmic-security main restricted
universe multiverse
deb http://mirrors.163.com/ubuntu/ karmic-updates main restricted universe
multiverse
deb http://mirrors.163.com/ubuntu/ karmic-proposed main restricted
universe multiverse
deb http://mirrors.163.com/ubuntu/ karmic-backports main restricted
universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic main restricted universe
multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic-security main restricted
universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic-updates main restricted
universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic-proposed main restricted
universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic-backports main restricted
universe multiverse

保存。

sudo apt-get update更新源。

----------------
4.解决中文界面问题
----------------
然后,进入System->administration->Language Support
Install/Remove Languages,安装语言,选Chinese
simplified.装完注销,选界面语言为中文简体,进入即看到了熟悉的中文界面。

系统会提示是否将此前缺省的英文目录改为相应的中文目录,我选择了否。

系统会自动安装huang peng的基于python的
ibus中文输入法,而不是苏哲的scim。我第一次用该输入法。本文也是ibus输入法输入的,非常好用。ibus输入法源码地址:http://code.google.com/p/ibus/

ibus输入法支持多种双拼方案,但双拼全拼不能同时支持,这是和搜狗拼音不一样的地方,也不太习惯。我用自然码输入本文时,碰到"安"字,不知如何输入。偶然发现是字母"o"可以作为元音开头,终于解决了这一问题。使用中又碰到输入法的面板突然变成了竖排,非常不习惯,后面发现可以在"系统"->"首选项"->"ibus"里面选候选表是横排还是竖排。

系统自带的软件也相当好用。openoffice 3.1功能强大,支持ms office
2007的格式。自带字典软件不是胡正写的stardict,功能没有胡正的强大。

-----------------
5.解决即时通讯客户端
-----------------

empathy是一款IM 客户端软件,支持windows
live,gtalk,jabber,yahoo,icq,irc等多种服务协议,甚至还支持QQ,不过我试用QQ
登录失败,用windows live(msn)成功。

qq deb包下载:


http://im.qq.com/qq/linux/download.shtml

http://softdl1.tech.qq.com/soft/21/linuxqq_v1.0.2-beta1_i386.zip
http://ppa.launchpad.net/portis25/ppa/ubuntu/pool/main/l/linuxqq/

下载完毕双击即可安装,试用登录OK。

--------------
6.ubuntu one试用
--------------
在 应用程序->internet->ubuntu one
进入了https://login.launchpad.net/+openid
如有launchpad.net的用户,可以直接登录,没有则需要注册。
登入后,提示是否将本计算机加入 ubuntu
one帐号,我将计算机改名为zhouhh,点"Subscribe and Add This Computer"

进入https://one.ubuntu.com/
有files,notes,contacts,account四个标签页。但系统提示客户端比较新,因而不支持,说正在更新服务端,不日可用。
在files下可以创建目录,上传文件时报
Service Temporarily Unavailable
错误。
notes
里添加了一份备忘,但不支持中文,保存后会将中文直接抹去。下面是用Alt+print
screen键直接抓的图。

设置完,在 位置->ubuntu one
可以打开一个窗口,该窗口里面的文件应该可以和网上保持同步。由于我的系统总报兼容性问题,所以没有自动同步成功。

--------------
7.音乐和电影播放
--------------
由于自由软件的版权问题,linux发行版一般不分发私有版权和版权或法律受限的软件,因此播放音乐和看电影经常不是自带的功能。
缺省的ubuntu 9.10也有同样的问题。
为来测试,本人下载了 "陶喆 蔡依林"的
"今天你要嫁给我.mp3"。但双击播放时,movie
player提示不能播放,需要下载插件。同意后,自动下载了具有不同版权协议的gstream
3个插件。重启后即可播放
mp3音乐了。但mplayer的播放列表中的中文歌名却变成了乱码了。但通过菜单打开乱码又变正常。而拖动时间条,会导致屏幕影像停滞不动。下载插件后同时对wma格式也支持。
播放mts高清视频,同样自动下载gstreamer0.10-plugins-bad后可以播放,但停顿严重,并且有很严重锯齿。

7.1 解决播放网络在线视频和flash的问题
firexfox3.5自动下载flash
播放器,可以下载adobe或gnu或gnome的,都可以。下载完后重启firefox,即可播放flash。测试http://v.youku.com/上的视频OK。

--------------------
8. 解决sudo输密码的问题
--------------------
zhouhh@ubuntu:~$ sudo visudo
找到
root ALL=(ALL) ALL
依样画葫芦,在下面添加一行
zhouhh ALL=(ALL) ALL
其中zhouhh是我的用户名。

%sudo ALL=NOPASSWD: ALL

至此,体验了一下最新版的ubuntu9.10,
除了中文问题以及没有单独的中文发行版,其余都很满意。使用起来和windows一样,没有什么障碍。

一直以来伴随我的一些学习习惯

这篇主要写一些学习(尤其是阅读)的基本方法。

1. 趁着对一件事情有热情的时候,一股脑儿把万事开头那个最难的阶段熬过去 。
万事开头难,因为从不了解到了解基本的一些事实,是一个新知识暴涨的阶段,这个时候的困难是最大的。有人熬不过去,觉得困难太大就放弃了。不过,狂热的兴
趣可以抵消对困难的感觉,所以趁着对一件事情有热情的时候,开一个好头是很重要的。(当然,这并不是说持之以恒就不重要了)。当然,也许这个是因人而异
的,对我来说我会在对一件事情有浓厚兴趣的时候非常专注地学习,把很多
groundworks 做掉。后面就会顺利一些了。

2. 根据主题来查阅资料,而不是根据资料来查阅主题 。以前读书的时候是一本一
本的读,眼里看到的是一本一本的书,现在则是一章、甚至一节一节的读,眼中看到的不是一本一本的书,而是一堆一堆的章节,一个一个的知识主题,按照主题来
阅读,你会发现读的时候不再是老老实实地一本书看完看另一本,而是非常频繁地从一本书跳到另一本书,从一处资料跳到另一处资料,从而来获得多个不同的人对
同一个主题是如何讲解的。比如最近我发现在看蒙特卡罗算法时就查了十来处资料,其中有三四篇
paper
和六七本书;这是因为即便是经典的书,你也不能指望它对其中每一个主题的介绍都是尽善尽美的,有些书对某个主题(知识点)的介绍比较到位,有些书则对另一
些知识点介绍得比较到位。而有时候一篇紧凑的 paper
比一本书上讲得还要好。我硬盘里面的书按主题分类,每个主题下面都有一堆书,当我需要学习某个主题的知识时(譬如贝叶斯学习或者神经网络),我会把里面涉
及这个主题的书都翻开来,索引到相关章节,然后挑讲得好的看。那么,如何判断一个资料是好资料还是坏资料呢?

3. 好资料,坏资料 。好资料的特点:从问题出发;重点介绍方法背后的理念(
rationale
),注重直观解释,而不是方法的技术细节;按照方法被发明的时间流程来介绍(先是遇到了什么什么问题,然后怎样分析,推理,最后发现目前所使用的方法)。
坏资料的特点是好资料的反面:上来就讲方法细节,仿佛某方法是从天上掉下来的,他们往往这样写"我们定义...
我们称... 我们进行以下几个步骤...
"。根本不讲为什么要用这个方法,人们最初是因为面对什么问题才想到这个方法的,其间又是怎样才想出了这么个方法的,方法背后的直观思想又是什么。实际上
一个方法如果将其最终最简洁的形式直接表达出来往往丢失掉了绝大多数信息,这个丢掉的信息就是问题解决背后的思维过程。至于为什么大多数书做不到这一点,
我在这里 试着分析过。

4. 学习一个东西之前,首先在大脑中积累充分的"疑惑感" 。即弄清面临的问题
到底是什么,在浏览方法本身之前,最好先使劲问问自己能想到什么方法。一个公认的事实是,你对问题的疑惑越大,在之前做的自己的思考越多,当看到解答之后
印象就越深刻。记得大学里面的课本总是瀑布式地把整个知识结构一览无余地放在面前,读的过程倒是挺爽,连连点头,读完了很快又忘掉了,为什么?因为没有带
着疑问去学习。

5. 有选择地阅读 。很多人觉得我读书速度很快,其实我只是有选择地阅读。这里
的选择体现在两个地方,一是选择一本书中感兴趣的章节优先阅读。二是对一本书中技术性较弱或信息密度较低的部分快速地略读。一般来说,除了技术性非常强的
书之外,大多数书的信息密度很低,有很多废话。一般来说在阅读的时候应该这样来切分内容:1.
问题是什么?2. 方案是什么?3.
例子是什么?如果是需要解释一个现象的(譬如《黑天鹅》),那么1.
现象是什么?2. 解释是什么?3. 支撑这个解释的理由是什么?4.
例子是什么?一般来说,这一二三四用不了多少字就可以写完了(如果假设只举一到两个精到的例子的话),这样的无废话著作的典型是《合作的进化》;那为什么
有些书,明明核心观点就那点东西(顶多加上几个精要的例子罢了)却写得长得要命呢?因为人的思维都有一个"联想"的特点,写着写着就容易旁逸斜出,而且作
者自己也往往觉得引申出去挺牛逼,有时候很多与主题无关的废话就掺和进来了;那么,阅读的时候就应该有选择性地滤掉这些不相干的废话;此外还有一种可能性
就是大量冗余的例子。一般来说组织得比较好的书会有详细且一目了然的目录和索引,根据目录首先就可以滤掉一部分(比如某个子章节的内容你以前是看过的),
然后有时候作者还会举很多冗余的例子,如果你已经觉得印象够深刻了这些例子完全可以不看(一些书就非常厚道地对每个观点只辅以一两个最最经典的例子,譬如
《与众不同的心理学——如何正视心理学》,这样的书我最是喜欢)。

6. 为什么看不懂 ?如果看不懂一个知识,一般有如下几个可能的原因:1.
你看得不够使劲。对此古人总结过——书读百遍其义自现。虽然这个规律不是任何时候都成立的,但是从认知科学的角度看是完全可以解释的,我们在阅读的时候,
注意力往往会有选择性地关注其中的某一些"点",而忽略了另一些"点",于是一遍看下来可能因为某一些忽略导致无法理解整体。或者干脆看的时候就没注意其
中一些细节但重要的东西。此外,大脑理解一个东西需要一定的处理时间,人脑的处理速度很慢,神经冲动每秒传输速度不过百米,所以不能指望看到哪懂到哪。最
后,我们可能因为思维定势的原因会从某个特定的角度去看一句话而忽略了从不同角度去理解的可能性。对于这类情况,仔仔细细地再多读两遍,多试着去理解两
遍,往往会"哦!原来这样。"地恍然大悟。2.
其中涉及到了你不懂的概念。这是技术性的不理解。这种情况就需要 Cross
Reference
。如果一句话中用到了你不懂的概念,那就去查,现在很多书都是电子书,直接搜索一下,或者,对于纸书,看一下书后面的索引就行了。奇怪的是很多人看不懂也
不分析一下为什么不懂,就直接放弃了。正如解决问题一样,问题卡住解决不了,第一时间要做的就是分析到底为什么解决不了,而不是直接求救。3.
作者讲述的顺序不对,你接着往下看,也许看到后面就明白了前面的了。

杂项

7. 如何在阅读之前就能获得对一本书质量的大致评估 。在深入阅读之前能够迅速
评估一本书的质量可以节省很多时间。基本上有几个线索:1.
看作者。牛作者写的书一般都不错。2.
看目录和简介。一份好的目录和简介能够透露这本书质量的相当一部分信息。目录结构是否清晰,是否直白(而不是装神弄鬼),都是衡量的线索。3.
看 Amazon
上的评价,这里要注意的是,除了看整体打分之外,更要看打分最低的人是怎么说的,因为小众意见往往有可能来自那些真正懂行的人(除了来踢馆的),如果在打
分最低的意见里面看不到真正有价值的反驳意见的话就相当肯定书是不错的了。4.
看样章。Amazon
上一般都可以随机浏览一些章节的,表达是否清晰,论证是否严谨,内容是否深刻,基本是几页纸就能看出来的。

8. 如何搜寻到好书 。几个线索:1. 同作者的著作。2. Amazon
相关推荐和主题相关的书列(类似豆瓣的豆列)。3.
一本好的著作(或一份好的资料——不管是书还是网页)在参考资料里面重点提到的其他著作。4.
有时对于一个主题,可以搜索到好心人总结的参考资源导引,那是最好不过的。