More servicesWindows Live
Sign in
 
 
Spaces home  Wolfsecond -- loser's re...PhotosProfileFriendsBlog Tools Explore the Spaces community

Blog

June 10

天津人的幽默

端午期间回了趟天津,参见朋友的婚礼。

刚下火车,就见一大爷在一辆破面包车前招揽生意

“塘沽——,塘沽——,大哥去塘沽嘛?”

我拒绝了就要走,这时身边走过一个女生,那个大爷忙凑前:“姐姐,去塘沽嘛?”

那女生白了他一眼,嘴里挤出两个字“有病!”,然后抽身而去。

再看那大爷面色紫青,嘴角抽搐,五官都要挤到一块了,然后说出了我们意想不到的话:

“说嘛呢?说嘛呢?你看我这像是有病的样子的嘛?这孩子”

April 03

程序我会写,瓦工我也会

今天早上在公司上厕所,发现马桶抽水坏了。

想要找物业来修,可是等不及了,于是就试着自己修一下,结果居然修好了。

坐在自己的“劳动果实”上,突然发现我也比较有才~~~

January 25

“全盘格”

讲个笑话吧:

这几周const很不爽,电脑中毒了,而且中的很厉害,总是杀也杀不净。基本上就是周末发现电脑中毒了——》周六,日格盘——》周一至周五装软件——》然后周末又发现中毒了——》然后再格盘……

const说:完了,废了,废了,这下真得“全格盘”后,才能杀的干净了!

我说:那哪够啊!至少得“格全盘”,那才行!

……

const说:恩,说得没错,最后还得来个“全盘格”。

然后我俩都笑得不行了,感觉自己太幽默了。

……

……

……

感谢各位看完了这个冷笑话。

January 24

IE果然依旧很烂

看下面这张图,蓝色的是IE6的,红色的是firefox的。IE6的垃圾回收时间复杂度是O(n)的,firefox基本是O(1)。这只是IE6烂的烂山一角,启动慢,安全漏洞多,开发不友好(firefox有firebug),多得我都懒得敲。

gc_graph 

出处:http://pupius.co.uk/log/2007-03-07/

难怪我们的team leader说,ms的人这几年都干啥了,干了那么多年还不如一个开源的软件,都下岗算了。

可是面对商业政治,我还是无可奈何。仍然有大量的用户“习惯性”的使用IE,程序员仍然要写一些为了兼容IE的非标准、垃圾代码。:)

December 24

25元的六头钉开张!

昨天终于在一家杂货店里找到了我梦寐以求的软木板。我使用了我从来都擅长的"砍价绝招",以25元买下。

为什么说“梦寐以求”?因为我做梦都想在office里有那么一块木板,上面钉买了我的计划,闪过脑中的话丝,牢骚。。。,呵呵,that's my plan. according  to the plan.这样,我就可以在公司里“越狱”。

为什么说“六头钉”?鉴于对老板娘的对我的勒索,没有杀到20元,所以赌气没有买她的2元一盒的按钉。幸运的是,我在office里的抽屉里dig out了6个,不错啊。那就将这个软木板起名为“六头钉”板吧。于是我就将“六头钉”写在板上。恩,不错啊,好名字,恩。正自我欣赏,自我陶醉的时候,我突然发现……我数错了按钉的数目,不是6个!而是7个!

为什么说“为什么说\“[w]+\””?

Exception in thread "main" java.lang.StackOverflowError
    at 25元的六头钉开张.as(25元的六头钉开张.java:9)

    at 25元的六头钉开张.as(25元的六头钉开张.java:9)

    at 25元的六头钉开张.as(25元的六头钉开张.java:9)

……………………………………………………

December 13

ms的blog真是烂啊!

都憋了一个月了,今天终于上来了~~~

October 10

灵异事件:取消电梯请点击右键

昨天和const做电梯回家,进电梯后不小心点击了十层,我们本想去一层的。银科有些电梯是可以取消所按的电梯的。const就尝试了一下:

左键单击按住?。。。。不行

双击呢?。。。。不行

靠!拖曳呢?。。。。不行

这时我待不住了:“你砸就这么笨呢?还有右键单击你砸不试试呢!?”。这时我换成中指单击按住(左键单击是用的食指),灵异事件发生了,十层的按钮灭了,取消成功了!?。。。。。。

September 26

CodeGenerator--一个我写的代码生成软件

CodeGenerator 是基于数据库的代码生成器(目前版本只支持sqlserver环境),可以生成C#和VB两种语言的源代码。该工具基于MVC设计思想,生成开发中需要的 M、C 两层的基础类。用户可以通过向导,轻松地生成基础存储过程、DataRow实体类、DataTable实体类和数据库帮助类。代码清晰,便于维护。Code Generator当前版本是0.642. 该工具100%使用C#编写,目前仍然处于完善中。欢迎大家批评指正!

由于个人的目光短浅,只图眼前利益,CodeGenerator目前只支持sqlserver。
希望路人能提出颇有营养的建议,CodeGenerator今后的发展定为CodePatterner。
希望,在我有时间的时候继续开发,当然也不排除open source的可能性。

下载链接:http://www.box.net/shared/ezxeszmyv5

August 30

咦?!b4,又见b4!

奇怪了,最近为什么我b4的人越来越多了?就拿const来说吧,本来我们轮着买早餐的。

前天,我自己吃蛋糕,他先我借了2块钱,结果不还了!我也好睁一只眼,闭一只眼了。

昨天,8点40下的车,他愣说还是早点上去吧,结果只买了两块钱的包子(他买单)。晕

今天,8点56下的车,他说算了,还是吃了再上去,结果不但吃了包子,还要喝豆浆!还加蛋!什么?废话,这次当然是我付钱~~~。

你说这种人是不是b4一下?      ---__--- !!!   

August 17

常用正则表达式(Mark)

正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字

匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位

匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用

匹配特定数字:
^[1-9]\d*$    //匹配正整数
^-[1-9]\d*$   //匹配负整数
^-?[1-9]\d*$   //匹配整数
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

下表是元字符及其在正则表达式上下文中的行为的一个完整列表:
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’\n’ 或 ’\r’ 之前的位置。
* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。? 等价于 {0,1}。
{n} n 是一个非负整数,匹配确定的n 次。
{n,} n 是一个非负整数,至少匹配n 次。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 ’\n’ 在内的任何字符,请使用象 ’[.\n]’ 的模式。
(pattern) 匹配pattern 并获取这一匹配。
(?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
(?!pattern) 负向预查,与(?=pattern)作用相反
x|y 匹配 x 或 y。
[xyz] 字符集合。
[^xyz] 负值字符集合。
[a-z] 字符范围,匹配指定范围内的任意字符。
[^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。
\B 匹配非单词边界。
\cx 匹配由x指明的控制字符。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
\W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。
\num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。
\n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。

今天我花了一个下午的时间去找一个逗号?!

看来真是不要相信任何人的代码。

tapestry这么牛X的东西都是有bug的。

恩,是啊,牛人也是先有卵细胞和精子,然后是胎儿,然后是牛犊子,然后才那啥那啥。。。。

你崇拜他简直是自我封闭神学社会主义者。恩

August 02

今天博客突破2 pv大关!

太高兴!!被tapestry蹂躏的这么久,从来没有这么爽过哈。

计划将大踏步向“好几个pv”的宏伟目标迈进~~~~

路过的也帮我锄锄草呵~~

July 19

我画的一副画

这幅画的名字叫做《正方形》,大家看看,好看不?呵呵

正方形

July 18

谁说Java不用synchronized就锁不死对象哩?

如果我们不使用synchronized关键字,还可以进行线程同步吗?能!

首先介绍两个概念,硬件同步原语和CAS。

硬件同步原语

大多数现代处理器都包含对多处理的支持。当然这种支持包括多处理器可以共享外部设备和主内存,同时它通常还包括对指令系统的增加来支持多处理的特殊要求。特别是,几乎每个现代处理器都有通过可以检测或阻止其他处理器的并发访问的方式来更新共享变量的指令。

比较并交换 (CAS)

支持并发的第一个处理器提供原子的测试并设置操作,通常在单位上运行这项操作。现在的处理器(包括 Intel 和 Sparc 处理器)使用的最通用的方法是实现名为 比较并转换或 CAS 的原语。(在 Intel 处理器中,比较并交换通过指令的 cmpxchg 系列实现。PowerPC 处理器有一对名为“加载并保留”和“条件存储”的指令,它们实现相同的目地;MIPS 与 PowerPC 处理器相似,除了第一个指令称为“加载链接”。)

CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该位置的值。(在 CAS 的一些特殊情况下将仅返回 CAS 是否成功,而不提取当前值。)CAS 有效地说明了“我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。”

通常将 CAS 用于同步的方式是从地址 V 读取值 A,执行多步计算来获得新值 B,然后使用 CAS 将 V 的值从 A 改为 B。如果 V 处的值尚未同时更改,则 CAS 操作成功。

类似于 CAS 的指令允许算法执行读-修改-写操作,而无需害怕其他线程同时修改变量,因为如果其他线程修改变量,那么 CAS 会检测它(并失败),算法可以对该操作重新计算。清单 3 说明了 CAS 操作的行为(而不是性能特征),但是 CAS 的价值是它可以在硬件中实现,并且是极轻量级的(在大多数处理器中):

基于 CAS 的并发算法称为 无锁定算法,因为线程不必再等待锁定(有时称为互斥或关键部分,这取决于线程平台的术语)。无论 CAS 操作成功还是失败,在任何一种情况中,它都在可预知的时间内完成。如果 CAS 失败,调用者可以重试 CAS 操作或采取其他适合的操作。清单 4 显示了重新编写的计数器类来使用 CAS 替代锁定。

JDK1.5中将这些通往硬件同步原语暴露出来了(sun.misc.Unsafe),对于我们来说真是一大幸事。在大并发环境下,基于锁定的线程同步算法的代价是很昂贵的(这个我就不论证了,n多牛人都拜活过),那么,现在我们就可以写无锁定、无等待的算法了。

无锁定且无等待算法

如果每个线程在其他线程任意延迟(或甚至失败)时都将持续进行操作,就可以说该算法是无等待的。与此形成对比的是,无锁定算法要求仅某个线程总是执行操作。(无等待的另一种定义是保证每个线程在其有限的步骤中正确计算自己的操作,而不管其他线程的操作、计时、交叉或速度。这一限制可以是系统中线程数的函数;例如下面的代码,如果有 20 个线程,每个线程都执行一次 CasCounter.increment() 操作,最坏的情况下,每个线程将必须重试最多19次,才能完成增加。) 下面的例子就是通过无锁定且无等待的方式,实现index++的同步(index++可不是原子的哦,:))。核心思想是一句话:“将这个变量更新为新值,但是如果从我上次看到这个变量之后其他线程修改了它的值,那么更新就失败”,细节就自己看代码吧。

package concurrent;
import
java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import sun.misc.Unsafe; 
public class NonSynTest{
    static class IncMan implements Runnable{
       private String fID;
       public IncMan( String id){
           this.fID = id;
}
       public void run(){
           try{
              NonSynTest.begin.await();
              for (int i = 0; i < 2000000; i++){
                  nosyn.incIndex();
              }
           } catch (InterruptedException e){
           }
           finally{
              NonSynTest.end.countDown();
              System.out.println("Thread"+fID+" finished!");
           }
       }
    }
    static final int threadlen = 20;
    static CountDownLatch begin = new CountDownLatch(1); 
    static CountDownLatch end = new CountDownLatch(threadlen);
    static NonSynTest nosyn = new NonSynTest();   
    private static Unsafe unsafe = null;
    private static long valueOffset;
    static{
       try{
           unsafe = UnsafeTest.getUnsafe();
           valueOffset = unsafe.objectFieldOffset(NonSynTest.class
                  .getDeclaredField("index"));
       } catch (Exception ex){
           throw new Error(ex);
       }
    }
    public static void main(String[] args) throws InterruptedException{
       ExecutorService exec = Executors.newFixedThreadPool(threadlen);
       for (int index = 0; index < threadlen; index++){         
           exec.submit(new IncMan(index+""));
       }
       System.out.println("Game Start");
       begin.countDown();
       end.await();
       exec.shutdown();
       System.out.println("Game Over");
       System.out.println("Count: "+nosyn.getIndex());
    }
    private int index = 0;   
    public int getIndex(){
       return index;
    }
   
    public void  incIndex(){
       for (;;) {
            int current = index;
            int next = current + 1;
            if(unsafe.compareAndSwapInt(this, valueOffset, current, next))
              return;
        }
    }
}
July 13

地上有人掉下的钱,你会捡吗?

一毛钱?

切~~一毛钱都懒得我弯腰!

 

 

一块钱?

一块钱也太少了吧?!

 

 

 

十块钱?

多丢人啊,叫人看到你贪小便宜,多不好意思?

 

 

一百块钱?

是个圈套吧,是不是旁边有个骗子正盯着的。还是不冒这个风险了。

 

 

一叠钱?

假钞!绝对是假钞!你当我是傻子啊,这还看不出来?!

 

 

结论:无论地上掉了多少钱,都不会有人捡。

July 09

何为形而上?(selfmark)

《易经·系辞》:“形而上者谓之道,形而下者谓之器,化而裁之谓之变;推而行之谓之通,举而措之天下之民,谓之事业。”。通常的理解是,大道无形,故旧形而上,器用之物为有形,是为形而下。“形而上学”一词与传统用法中的玄学、理学大体相通,现在则通指我们今天所说的哲学或人文学科,“形而下学”则相当于我们今天所说的自然科学,近代中国学人将西文metaphysics翻译为“形而上学”,在学术上精细的理解和分析一直纷争无定论。
“上”“下”当然不会有争论,“形”上“形下”之分虽有不同的解释,但大体无异,但是何谓“形”,却无深究,“形”即不是道,也不是“器”,而是两者的中间,但也不是一条明确可用的分界线,没有这个“形”,当然无从论上下了,但是我们先人却没有直接说出“形”是什么,实际上他们是在更深的意义上把“形”作动词便用,“见乃谓之象,形乃谓之器,” 意思是说,可见则为象,具形则成器,“在天成象(天象可见),在地成形(形,名词,同器),”因此“形”的深层意义就是“成”或“化”:即“化而裁之谓之变;推而行之谓之通,举而措之天下之民”中诸动词的用法,但“形”的这种意义与“易”有区别,“形”不是指事物的自身变易,而是人对事物的观点、方法和行为,它的主体就是人的理性,因此“形而是学”无论是作为思想、观点、方法或者是学术,其中的“形”的本义都是中国理性的体现,“形”就是广义的阐释,这是中国文化中最精粹最深遂的学术理性,“形而上学”一词也就是中国理性在学术思想和学术方法上最贴切的表达,这是近代中国学人在吸收西方学术思想后对中国文化思想的活化。在这种理解上,“形而上学”即是中国的传统学术思想,也是中国传统学术活动,就是说中国的学术思想(即中国思想在学术方面)是以阐释的观点和方法从事工作的,“形而上学”熔铸了思想、观点、方法和结论于一身,是中国的学术典范,这是一种没有先入之见的实事求是的理性,正是在这个关键点上,它区别于西方理性的从前提出发的演绎方法,中国的形而上学是自身阐释的,它同时是自身的元学,所以它是自足的,无矛盾自我完成的,所以它也不会有“哥德尔不完全定律(Godel's Incompleteness Theorem)” 的灭顶之灾,它自身不是一个定律,某个理论,甚至不是一种即成的思想则范,而是人的理性自身,所以你也不能用科学证伪之类理论来捕获它,因为你无法去证伪理性,你无法证伪你自己!“我思故我在”就是不可怀疑的,但笛卡儿和笛卡儿之后,西方理性只有这种灵光乍泄、绝响无回的一瞬,当然中国思想自身是不能形式化的幽灵,所以说,儒学站在科学的肩膀上,就是因为儒学是中国思想的具体化即学术化和社会化,它的阐释精神和阐释学方法形成了它的自身,在现代化潮流中它也将通过科学的自身元学化贯彻到科学中去。
“形”是中国的“形面上学”的表达核心,宋代的理学家由没有把握住对“形”的本义的理解,因此在对“气”“象” “器”等概念的争论中无法形成一致意见。在“形而上学”的这种真正的本义理解上,“形而上学”也就是“中国哲学”,中国哲学就是自为元学的真正哲学——元哲学,而不是永远无法逃脱被定义宿命的“哲学学”,由于“形而上学”一词还在不同的其它意义下使用,