言念君子 温其如玉
对酒当歌,人生几何? 譬如朝露,去日苦多。 慨当以慷,忧思难忘。 何以解忧,唯有杜康。 青青子衿,悠悠我心。 但为君故,沉吟至今。 呦呦鹿鸣,食野之苹。 我有嘉宾,鼓瑟吹笙。 明明如月,何时可掇。 忧从中来,不可断绝。 越陌度阡,枉用相存。 契阔谈宴,心念旧恩。 月明星稀,乌鹊南飞。 绕树三匝,何枝可依? 山不厌高,海不厌深。 周公吐哺,天下归心。
2011年12月27日星期二
迷失--剧评
言念君子 温其如玉
2011年12月22日星期四
Java初始化顺序
初始化(initialization)其实包含两部分:
1.类的初始化(initialization class & interface)
2.对象的创建(creation of new class instances)。
因为类的初始化其实是类加载(loading of classes)的最后一步,所以很多书中把它归结为"对象的创建"的第一步。其实只是看问题的角度不同而已。为了更清楚的理解,这里还是分开来。
顺序:
应为类的加载肯定是第一步的,所以类的初始化在前。大体的初始化顺序是:
类初始化 -> 子类构造函数 -> 父类构造函数 -> 实例化成员变量 -> 继续执行子类构造函数的语句
下面结合例子,具体解释一下。
1。类的初始化(Initialization classes and interfaces),其实很简单,具体来说有:
(a)初始化类(initialization of class),是指初始化static field 和执行static初始化块。
例如:
class Super {
static String s = "initialization static field"; //初始化static field,其中"= "initialization static field" "又叫做static field initializer
// static初始化块,又叫做static initializer,或 static initialization block
static {
System.out.println("This is static initializer");
}
}
btw,有些书上提到static initializer 和 static field initializer 的概念,与之对应的还有 instance initializer 和 instance variable initializer。例子中的注释已经解释了其含义。
(b)初始化接口(initialization of interface),是指初始化定义在该interface中的field。
*注意*
--initialization classes 时,该class的superclass 将首先被初始化,但其实现的interface则不会。
--initialization classes 时,该class的superclass,以及superlcass的superclass 会首先被递归地初始化,一直到java.lang.Object为止。但initialiazation interface的时候,却不需如此,只会初始化该interface本身。
--对于由引用类变量(class field)所引发的初始化,只会初始化真正定义该field的class。
--如果一个static field是编译时常量(compile-time constant),则对它的引用不会引起定义它的类的初始化。
为了帮助理解最后两点,请试试看下面的例子:
public class Initialization {
public static void main(String[] args) {
System.out.println(Sub.x); // Won't cause initialization of Sub, because x is declared by S, not Sub.
// 不会引起Sub类的初始化,因为x是定义在Super类中的
System.out.println("-------------------------");
System.out.println(Sub.y); // Won't cause initialization of Sub, because y is constant.
// 不会引起Sub类的初始化,因为y是常量
System.out.println("-------------------------");
System.out.println(Sub.z = 2004); // Will cause initialization of Sub class
// 将会引起Sub的初始化
}
}
class Super{
static int x = 2006;
}
class Sub extends Super {
static final int y = 2005;
static int z;
static {
System.out.println("Initialization Sub");
}
}
2。对象的创建(creation of new class instances),稍微有点烦琐,具体的步骤如下
(a) 所有的成员变量—包括该类,及它的父类中的成员变量--被分配内存空间,并赋予默认值。(Btw,这里是第一次初始化成员变量)
(b) 为所调用的构造函数初始化其参数变量。(如果有参数)
(c) 如果在构造函数中用this 调用了同类中的其他构造函数,则按照步骤(b)~(f)去处理被调用到的构造函数。
(d) 如果在构造函数中用super调用了其父类的构造函数,则按照步骤(b)~(f)去处理被调用到的父类构造函数。
(e) 按照书写顺序,执行instance initializer 和 instance variable initializer来初始化成员变量。(Btw,这里是第二次初始化成员变量)
(f) 按照书写顺序,执行constructor的其余部分。
*注意*
成员变量其实都被初始化2次,第一次是赋予默认值,第二次才是你想要设定的值。
最后看一个例子:
public class InitializationOrder {
public static void main(String[] args) {
Subclass sb = new Subclass();
}
}
class Super{
static {
System.out.println(1);
}
Super(int i){
System.out.println(i);
}
}
class Subclass extends Super implements Interface{
static {
System.out.println(2);
}
Super su = new Super(4);
Subclass() {
super(3);
new Super(5);
}
}
interface Interface{
static Super su = new Super(0);
}
稍微解释一下:
首先,Java虚拟机要执行InitializationOrder类中的static 方法main(),这引起了类的初始化。开始初始化InitializationOrder类。具体的步骤略去不说。
接着,InitializationOrder类初始化完毕后,开始执行main()方法。语句Subclass sb = new Subclass()将创建一个Subclass对象。加载类Subclass后对其进行类初始化,但因为Subclass有一个父类Super,所以先初始化Super类,初始化块static {System.out.println(1);}被执行,打印输出1;
第三,Super初始化完毕后,开始初始化Subclass类。static {System.out.println(2);}被执行,打印输出2;
第四,至此,类的加载工作全部完成。开始进入创建Subclass的对象过程。先为Subclass类和其父类Super类分配内存空间,这时Super su 被附值为null;
第五,执行构造函数Subclass()时,super(3)被执行。如前面(d)所说,Super类的构造函数Super(int i){….}被调用,并按照步骤(b)~(f)来处理。因此,递归调用Super类的父类Object类的构造函数,并按照步骤(b)~(f)来初始化Object类,不过没有任何输入结果。最后打印输出3;
第六,如前面(e)所说,初始化成员变量su,其结果是打印输出4;
第七,如前面(f)所说,执行new Super(5),并打印输出5;
最后,Subclass虽然实现了接口Interface,但是初始化它的时候并不会引起接口的初始化,所以接口Interface中的static Super su = new Super(0)自始至终都没有被执行到。
① 类属性 (静态变量) 定义时的初始化,如上例的 static String a = "string-a";
② static 块中的初始化代码,如上例 static {} 中的 b = "string-b";
③ 对象属性 (非静态变量) 定义时的初始化,如上例的 String c = "stirng-c";
④ 构造方法 (函数) 中的初始化代码,如上例构造方法中的 d = "string-d";
言念君子 温其如玉
2011年12月20日星期二
GPL VS LGPL
GPL 是 GNU General Public License (GNU 通用公共许可证)的缩写形式;LGPL 是 GNU Lesser General Public License (GNU 宽通用公共许可证)的缩写形式,旧称 GNU Library General Public License (GNU 库通用公共许可证);GFDL 是 GNU Free Documentation License (GNU 自由文档许可证)的缩写形式。它们是自由软件(Free Software)的通用版权认证协议,由自由软件基金会(FSF)制定和发布。
- 基于 GPL 的软件允许商业化销售,但不允许封闭源代码。
- 如果您对遵循 GPL 的软件进行任何改动和/或再次开发并予以发布,则您的产品必须继承 GPL 协议,不允许封闭源代码。
- 基于 LGPL 的软件也允许商业化销售,但不允许封闭源代码。
- 如果您对遵循 LGPL 的软件进行任何改动和/或再次开发并予以发布,则您的产品必须继承 LGPL 协议,不允许封闭源代码。但是如果您的程序对遵循 LGPL 的软件进行任何连接、调用而不是包含,则允许封闭源代码。
GPL(General Public License)和LGPL( Lesser General Public License)是GNU的两种License。越来越多的自由软件(Free Software)使用GPL作为其授权声明,如果对GPL一点都不了解,有可能在使用自由软件时违反了GPL的授权。如果是个人或不正规的公司倒也无所 谓,但如果是有规模的公司,恐怕会有被起诉的风险。
在使用Log4cpp时我想到了授权的事情,于是有了兴趣对GPL做一下了解。这是必要的,因为公司也维护了一个验证过的自由软件库,里面包含的自由软件除了功能上是可靠的,另外就是一定可以被私有使用的,否则后果很严重(黎叔很生气!)。
Log4cpp最初的版本使用GPL作为授权声明的,在0.2.1版本以后改用更为宽松的 LGPL。LGPL最初是Library GPL的缩写,后来改称作Lesser GPL,即为更宽松的GPL。当一个自由软件使用GPL声明时,该软件的使用者有权重新发布、修改该软件,并得到该软件的源代码;但只要使用者在其程序中 使用了该自由软件,或者是使用修改后的软件,那么使用者的程序也必须公布其源代码,同时允许别人发布、修改。也就是说,使用GPL声明下的的自由软件开发 出来的新软件也一定是自由软件。
LGPL是GPL的变种,也是GNU为了得到更多的甚至是商用软件开发商的支持而提出的。与 GPL的最大不同是,可以私有使用LGPL授权的自由软件,开发出来的新软件可以是私有的而不需要是自由软件。所以任何公司在使用自由软件之前应该保证在 LGPL或其它GPL变种的授权下。
以下是Richard Stallman关于GPL和LGPL的论述
为什么你不应该使用LGPL发布你的下一个库
GNU计划在使用库时有两个首要的许可证.一个是GNU LGPL(库GPL);另一个是普通的GNU GPL.选择不同的许可有很大的不同:选择LGPL允许在私有程序中使用该库;选择普通的GPL则只允许在自由软件中使用它.
关于哪一种许可证对指定的库是最好的这一问题实际上是一个策略问题,它取决于实际情况.当前,大多数的GNU库被采用LGPL,这意味着我们只使用着其中的一个策略,而忽略了另一个. 所以现在我们在寻求更多以普通的GPL许可证形式发布的库.
私有软件开发者有金钱上的优势;自由软件开发者需要相互之间利用各自的优势.对一个库采用普通的GPL对自由软件开发者的优势要大于对私有软件开发者: 他们可以使用的库对于私有软件开发者是不可利用的.
使用普通的GPL并不是对于所有的库都有好处.在某些情况下更有理由来使用LGPL.最常见的情况就是当一个自由库的特性可以很容易地被私有软件以其他可替代库来实现.在这种情况下,库不能给与自由软件任何特别的优势,因而最好还是为LGPL发布该库.
这也就是为什么我们为GNU C 库选择LGPL.总之,有很多的其他C库;我们使用GPL发布该库,将迫使私有软件开发者不得不使用其它的库--对他们来说这不成问题,而我们则有了麻烦.
然而,当一个库所提供的功能是非常独特的时候,如GNU Readline, 情况就大不一样了. Readline库可实现输入编辑和记录交互式程序操作,这在别处通常是不可多得. 在GPL下发布它并限制它只能在自由程序中使用, 这我们的社团是一个重要的促进.至少今天某个应用程序之所以是自由软件,只是因为它必需要用到Readline.
如果我们收集一些强大的、私有软件中没有相类似东西的、采用GPL的库,它们将提供一系列有用 的模块用于新的自由软件的构造. 这对于将来的自由软件开发将是一个显著的优势, 一些项目将为了使用这些库而考虑使软件自由化. 大学的项目是易于被影响的;而且今天,随着某些公司开始考虑使软件自由化, 甚至一些商业项目也会由此受到影响.
私有软件开发者试图否认自由竞争的重要性, 他们会拼命说服作者不要将库使用GPL来发布. 例如,他们会呼吁利己主义,信誓旦旦地说如果我们让他们在私有软件产品中使用代码,将有"更多的用户"用到该库. 流行是一种诱惑,它使一个库开发者倾向于相信这种观点:社会首先需要的是促进一种库的流行;.
但是我们不应该听从这种诱惑,因为如果我们联合起来,我们可以做得更好.我们这些自由软件开发 者应该相互支持. 通过发布只能为自由软件使用的库,我们可以互相帮助,使彼此的自由软件包优于其它的私有替代品. 整个自由软件运动将会有更多的机会,因为自由软件作为一个整体将会在竞争中表现更佳.
因为"LGPL(Library GPL)"的称呼传达了关于这一问题的错误观点,我们计划将称呼改为"次级GPL(Lesser GPL)".事实上要更换名称要花一定的时间,但你不必再等--你可以现在就发布应用GPL许可证的库.
言念君子 温其如玉
言念君子 温其如玉
2011年12月16日星期五
面包配方
—、带盖白土司带盖白土司(750g)
配料:高筋面粉1/2杯(385g)温开水1杯(235g)盐3/4小勺(3g)糖1/2大勺(20g)脱脂奶粉2大勺(14.5g)白油1/2大勺(17.5g)酵母3/4小勺(2.1g)做法: 1.按菜单键选择全麦档,选择重量750g,选择烧色(可根据您的不同喜好选择) 2.按下开始键,开始自动搅拌、发酵、烘烤 3.约3个半小时左右,面包机发出"嘀嘀嘀"的提示音,说明烘烤结束 4.最后切片完工
面包机的方子:一、普通咸味面包配料 750克 1000克面包 水 1杯+1大勺 1+2/5杯 植物油 3大勺 4大勺盐1+1/2小勺 2小勺 糖 2大勺 2大勺 面包粉 3+1/4杯 4+1/3杯 干酵母 1+5/6小勺 2小勺添加顺序应与配料表中一致,建议使用精致菜油或调和油适用程序:普通面包
二、全麦面包
配料 750克 水 1杯+3大勺全麦粉 1/4杯植物油 2大勺 盐 1小勺 红糖 4大勺奶粉 3大勺 面包粉 3杯干酵母 1+1/2小勺适用程序:全麦面包
三、快速全麦面包
配料 750克 水 1杯+3大勺全麦粉 1/4杯植物油 2大勺 盐 1小勺 红糖 4大勺奶粉 3大勺 面包粉 3杯干酵母 1+1/2小勺适用程序:快速面包
四、健康面包
配料 750克 水 1杯+3大勺全麦粉 2/3杯植物油 2大勺 盐 1小勺 红糖 1大勺面包粉 2+1/2杯 干酵母 1+1/2小勺适用程序:全麦面包
五、玉米面包
配料 750克 玉米面包预拌浓缩粉 1+2/5杯 面包粉 7/8杯 干酵母 2小勺玉米面包预拌浓缩粉为丹麦KMC公司生产的预拌面粉,适用程序:法式面包
六、菠菜包
配料 750克 鸡蛋 1个 盐 1小勺糖 1/4杯奶粉 2大勺 面包粉 1+1/4杯 干酵母 1+1/2小勺 黄油 3大勺面粉改良剂 2小勺菠菜糊 2/3杯菠菜湖制作方法:取250克洗净、空干水份的嫩菠菜,切成厚约2厘米的段,用搅拌机打成细腻糊状,用量杯称取2/3杯。与其他配料一起放入面包桶,其他操作方法一样。适用程序:普通面包
七、咖啡包
配料 750克 水加鸡蛋(一个) 2/3杯 蜂蜜 1大勺 奶粉 1/2杯盐 3/4小勺 糖 1/3杯 面包粉 2+2/3杯 干酵母 2小勺 黄油 2+1/2大勺速溶咖啡粉 1/5杯适用程序:甜面包
八、提子面包
配料 750克 水加鸡蛋(一个) 2/3杯 蜂蜜 1大勺 奶粉 1/2杯盐 3/4小勺 糖 1/3杯 面包粉 2+2/3杯 干酵母 2小勺 香蕉 1/3根 黄油 2+1/2大勺 葡萄干 1/3杯再面粉搅拌过程中蜂鸣器响时将葡萄干加入到料桶中适用程序:甜面包
九、香蕉面包
配料 750克 水加鸡蛋(一个) 2/3杯 蜂蜜 1大勺 奶粉 1/2杯盐 3/4小勺 糖 1/3杯 面包粉 2+2/3杯 干酵母 2小勺 香蕉 1/3根 黄油 2+1/2大勺香蕉切片后,将所有原料加完以后加到料桶中,然后选择"甜面包"程序,开始操作。最好在开始和面10分钟后加入黄油,味道更佳。
十、波萝吐司
配料 750克 水加鸡蛋(一个) 2/3杯 蜂蜜 1大勺 奶粉 1/2杯盐 3/4小勺 糖 1/3杯 面包粉 2+2/3杯 干酵母 2小勺 黄油 2+1/2大勺波萝糊 1/5杯波萝切片后,放入搅拌机中打成糊状。适合程序:甜面包。
十一、椰丝吐司
配料 750克 水加鸡蛋(一个) 2/3杯 蜂蜜 1大勺 奶粉 1/2杯盐 3/4小勺 糖 1/3杯 面包粉 2+2/3杯 干酵母 2小勺 黄油 2+1/2大勺椰丝 1/5杯适合程序:甜面包。
十二、杂粮健康面包
配料 750克 水 1杯全麦面包预拌粉(KMC) 7/8杯 面包粉 1+2/5杯 蜂蜜 2大勺 盐 1+1/2小勺 干酵母 2小勺 适合程序:全麦面包。十三、燕麦苹果面包 配料 750克 水加鸡蛋(一个) 2/3杯蜂蜜 1大勺 奶粉 1/2杯 盐 3/4小勺糖 1/3杯 面包粉 2+2/3杯 干酵母 2小勺 苹果(糊状) 1个黄油 2+1/2大勺 麦片 1/4杯 适合程序:甜面包。
十四、香橙面包
配料 750克 橙汁加鸡蛋(一个) 2/3杯 蜂蜜 1大勺 奶粉 1/2杯盐 3/4小勺 糖 1/3杯 面包粉 2+2/3杯 干酵母 2小勺 香蕉 1/3根 黄油 2+1/2大勺适合程序:甜面包。
十五、高蛋白面包
配料 750克水加鸡蛋清(约1/4杯) 2/3杯 蜂蜜 1大勺奶粉 1/2杯 盐 3/4小勺糖 1/3杯 面包粉 2+2/3杯 干酵母 2小勺黄油 2+1/2大勺 适合程序:甜面包。
言念君子 温其如玉
2011年12月2日星期五
[转贴]左小雨:2012,真正的崩溃在滞胀中开场
中国这个社会哦,现在很浮躁,不但希望发财的人很浮躁,希望崩溃的人也很浮躁。希望崩溃的那些人他们现在就希望中国一下子完蛋了,然后房价一下子掉下来了,他们可以结婚了。那么今天我就要对这些朋友说,你们想得实在是太好了。如果事情真的是这样发展,出现了美国1929年那样的大萧条的话,那就不叫崩溃了。你们想一想吧,1929年底美国股市崩盘,1945年美国打败法西斯联盟,成为世界上最强大的国家。这当中只有16年的时间。16年就发展成为世界第一强权,如果这样的"崩溃"落到中国的头上,那大概大家晚上做梦都要笑醒了。
所以在这里我很郑重地告诉各位朋友,中国绝对不可能出现苏联式的崩溃,也绝对不可能出现美国式的崩溃,中国的崩溃将是有中国特色的真正的崩溃。
首先,为什么中国不可能出现苏联式的崩溃?大家都知道,苏联崩溃源于轻工业的产能不足,物资紧张,人民生活极其困顿。我还记得苏联崩溃的时候我父亲去莫斯科,带去的牛仔裤子,小电池什么的都成为当地人抢购的紧俏物资。马路上老太太摆个小摊卖东西,卖什么呢?四根胡萝卜。各处的商店空空如也,除了一些刚刚从中国倒卖来的日用品,其他几乎什么都没有。当时苏联就是这么一副惨象。那今天中国会出现这种情况么?不可能,今天你要牛仔裤?你说好了,十万条还是二十万条?随便要。中国现在是什么情况?是严重的产能过剩。根本不是没有东西,而是东西生产出来卖不出去。所以苏联式的崩溃,也就是人民币变冥币,是不可能在中国出现的。
那么美国式的呢?29年大萧条源于贫富差距过大和产能过剩,这和今天中国的情况极其相似,那为什么中国不会出现美国式的崩溃呢?大家要知道,不管是29年的崩溃,80年代的崩盘,还是最近的次贷,都伴随着一个现象出现,那就是大量银行的破产。银行的破产阻碍了金融系统的运作,让整个社会陷入突然性的失血,大量企业纷纷破产。然后人们才看到大崩溃。那么现在大家看看,这在中国可能吗?中国的大银行都是国有的,是国家信用支持的产物。中国的银行破产,几乎等同于国家信用的破产,而国家信用的破产,直接威胁到执政党的地位,这在中国是绝对不会被允许的。因此,中国也不可能出现美国式的大崩溃。
那么中国会是什么样的情况呢?我大概概括一下,那就是小规模危机持续不断,整个社会不断失血,以相当慢的速度,逐渐进入僵尸社会,最后进入真正的崩溃。
以温州为例,温州大家都知道,最近很多老板跳楼跑路。这是什么?这是美国式的崩溃,地下银行崩盘,流动性消失,企业倒闭,老板跳楼,这是经典的1929式的崩溃。但是这个时候哦,你忽然发现,有中国特色的救星到了。跑路的老板,被请回来处理问题。怎么处理啊?他是因为做不下去没有办法了才跑路了,到国外呆了一周就能脱胎换骨解决问题呢?不可能。无非就是国家支持,给你一笔钱,让你把问题解决掉,把厂子维持下去。那么大家想,这些企业,它们是因为经营不下去了倒闭的,你给了它们钱,维持自然可以了,可是利润呢?没有利润,或者利润不足以支付正常的利息的话,那么这些企业就开始变成吸血的僵尸。它们需要你源源不断,小规模地给于支持,同时却不能提供任何值得一提的回报。而更可怕的是,随着国际和国内环境的变化,这些企业只能越来越糟糕。那么民营企业变成僵尸,国企呢?最近的报道说,铁道部获得了2000亿。铁道部自从上次出轨事件后,所有的工程陷入停顿。欠了多少钱呢?据说有两万亿之多。利润呢?1-2亿。大家可以想像,1-2亿的利润如何去支撑2万亿的利息?那给它2000亿能不能解决其债务问题?显然杯水车薪,根本不可能起作用。那这2000亿是干啥的呢?维持。还是维持。
那么这家给2亿,那家给2000亿,这七七八八的维持金到底是从什么地方来的呢?很显然,要么从税收来,要么印。那么税收的情况怎么样呢?从四月份开始,中国各地方政府的城投债,纷纷违约,地方债务的二级市场,几乎死掉。地方政府根本拿不出钱来支付其债务的利息。更不要说,拿出钱来支持那些僵尸企业了。上海等地,已经开始借新债,还旧债。中央政府还算好点,但是要救助这些僵尸企业,那也是心有余而力不足。那么接下来就只有一条路,那就是印。印的结果是什么?大家都知道,那就是通胀。中国的通胀高不高?你们每一个人身受之,比我清楚。所以为什么前面说了半天,都是说维持两个字?那就是因为当局也知道,不能多印啊,多印了这个物价涨起来要死人的。所以今天印一个亿,明天再印一个亿,就只能这么慢慢熬。中国经济就陷入了一放松就通胀,一收缩就破产的死循环,这就是滞胀。
最后会出现什么呢?两个现象,第一个是加税。前几天看谢国忠的谈话。谢先生是我一直很钦佩的一个学者,分析问题非常切中要点,但是这老兄大概是因为美国绿卡没拿到,对中国总是抱着一些不切实际的幻想。他说中国要减税。这话一说出来,恐怕礼堂里要哄堂大笑了。地方政府已经穷到连利息都支付不了了,你还要减税?请问你减税的基础何在?你减税了你的军队还要不要养?稳定还要不要维持?公务员还要不要加薪?地方公债还要不要还?中国绝对不可能减税,即便有,也是名义上的,这里刚减了营业税,那里马上房产税又搞起来了。不管是什么税种,其意义只有一个,那就是从家庭消费部门,和企业生产部门抽钱。钱都叫你们抽去了,那消费还能起来么?内需还能发展么?你们能够干的,不过就是拆东墙补西墙,寅吃卯粮而已。
因为是不断地维持,所以中国不会立马崩溃,但是会缓慢地慢慢地下滑。这个过程会很长,估计超过十年。然后十年以后你们会看到什么?那就是民营经济基本全部死亡。都是一个个靠国家支持的僵尸企业,而生产能力也会逐渐下滑。大量产能闲置,十年后,生锈的生锈,发霉的发霉。这个时候可能会出现一定程度的消费物资短缺。然后还会出现什么?那就是严重的人口老龄化。也就是说,中国改革的时间窗口只有十年,十年之后,天皇老子也救不了,但是这最宝贵的十年,注定会在全社会的稳定中逐渐地失去。所以这才是最严重的危机,这才是真正的崩溃。
言念君子 温其如玉