正则表示汉字的问题

昨天有人跟我说可以用正则表示汉字,当然,是限于Unicode编码的,准确地说,是UCS2编码的汉字.然后给出了正则式:/[\u4e00-\u9fa5],或者[\x00-\xff]+  

我读过《正则表达式》那本书,知道不同的程序对于正则的实现方式会略有区别,于是就问了,这是哪里的正则.同时,打开了我的VIM开始尝试.那边回答说这是Ultra Editor的.果然,VIM中两者都无法工作.

今天又琢磨了一阵,将第二个改为[\x00-\xff],去掉了最后的+号,在VIM中输入:%s/[\x00-\xff]/1/g,结果有效,成功地替换了汉字成1。但是却又发现一个神奇的现象:有个字始终替换不了,那个字就是"犯",UCS2编码72af.

而[\u4e00-\u9fa5]则一直没能成功.我想到原生的UE里面试试,但是不知道UE的正则如何启用.在查找里面打开了正则表达式的开关,然后输入这个式子,那是毫无作用,仅仅等于[4e009fa5].

 

 

===================== 以上写于2010-10-21=======================

今天又翻出这篇来,是因为最近做了次正则的汉字匹配,突然发现以前好像写错了。我必须用[^\x00-\xff]才能匹配到汉字,跟原来的正好相反!!

难道是当初笔误了吗?当时有两个人一起试验的啊,按理说没理由都看错的啊……

2011.7.15

Memo for Oracle

Oracle 9i Data Guard: http://download.oracle.com/docs/cd/B10501_01/server.920/a96653/toc.htm

Oracle 9i RAC: http://download.oracle.com/docs/cd/B10501_01/rac.920/a96598/toc.htm

让less行号左对齐

用vim习惯于显示行号,用less也想要显示行号.没行号找东西太麻烦了.开始连能不能显示行号都不知道.看了man手册,发现可以用 -N ,只是在打开大文件的时候会略微拖慢点速度. 拖慢点就拖慢点了,无所谓. 于是设置了 "alias less=less -N". 然后又发现一个问题.这行号显示得也太别扭了.前面空了老大一块空白,后面跟个行号,然后一个空格之后就是正文了,很容易搞混.我于是想把行号分开点,如果能彩色那更好了.

查遍了man,除了看到个没效果的 -R 之外,没看到什么关于颜色的东西. 上网查了下, -R 是用来支持解析ANSI颜色代码的,而不是less自己能用颜色.至于对齐之类的,我都不知道怎么查......

于是就想着反正开源嘛,改源码吧. 从GNU上下载了最新的less,2008年产的418版.机器上原来用的是394版,略微升级了.解压后,看到好大一堆文件.然后开始找.都不知道关于打印行号的这段在哪个文件的哪个部分.在Linuxsir上也发帖问了,不过还没人给出答案. 好在看了数个文件后,机缘巧合之下,让我翻到了 line.c 这个文件.没翻几行,就找到了关键的地方.它的关键部分是这样写的:

 

if (linenums == OPT_ONPLUS)
        {    
                char buf[INT_STRLEN_BOUND(pos) + 2];
                int n;

                linenumtoa(linenum, buf);
                n = strlen(buf);
                if (n < MIN_LINENUM_WIDTH)
                        n = MIN_LINENUM_WIDTH;
                sprintf(linebuf+curr, "%*s ",n, buf);
                n++;  /* One space after the line number. */
                for (i = 0; i < n; i++) 
                        attr[curr+i] = AT_NORMAL;
                curr += n;
                column += n;
                lmargin += n;
        }  

 

要点在"sprintf(linebuf+curr, "%*s ",n, buf);"这一句.这句打印出了行号,并给不足最小长度MIN_LINENUM_WIDTH的地方填上了空白.如果我要单纯地去除这些空白,只需要把前面的"n = MIN_LINENUM_WIDTH" 这一整个条件判断去掉,然后改成"sprintf(linebuf+curr, "%s " buf);". 只是这样一来,在行号从一位变成两位,从两位变成三位等类似的时候,正文整体都会偏移一个字符,看上去很不美观.所以还是需要保留那些空白,最多把MIN_LINENUM_WIDTH改小一点.然而靠右对齐实在不可忍耐.所以我最后改成了"sprintf(linebuf+curr, "%-*s ",n, buf);" 在前面加一个"-",使之左对齐.

这样修改后,对齐问题算是解决了.就是颜色依然没法搞定.

DOS格式结尾有隐藏字符

 最近想完成一个脚本,实现不通过数据库而直接把号码按地区分类的功能.脚本用bash写的,内容如下:

#!/bin/bash
LIST=`grep $1 head|awk '{print $2}'`
for i in $LIST;
do 
grep $i $2 
done

 但是,"grep $1 $2"确始终不能正常执行.我打印出$LIST,一切正常,打印出$i,也一切正常.

后来有人提示,DOS格式的文本会以'\n\r"结尾,而我的awk并不能识别这一点,会把末尾一并截取,使得grep时错误.改成

awk -v RS='(\n|\r)+' '{print $2}'

即可.

我的文本文件的确是从windows传过去的,于是修改后试验了下.果然问题解决了.

最终脚本如下:

 

#!/bin/bash
LIST=`grep $1 head|awk -v RS='(\n|\r)+' '{print $2}'`
for i in $LIST;
do 
grep $i $2 
done

荒腔走板,别具风格

 最近没事喜欢听虾米上的音乐,因为音质比较好,然后专辑比较全,速度也还可以。今天随便点进了某人打的一个包,一路听下来,有喜欢的,有不那么喜欢的,但是都没有留下太多印象。直到听到一首名字叫《夕日坂》的歌时,感觉很是奇特。那种唱着唱着,突然飘起来的曲调,让我很是着迷,又觉得似曾相识。

后来嘛,突然想到干脆查一下来源吧,然后猛的看到边上写着演唱者是大名鼎鼎的初音ミク!!我就说怎么这么耳熟,原来是初音…… 没吃过猪肉也见过猪跑,没好好听过初音的歌,也被熏染了不少了,难怪接受起来毫无障碍。

又干脆在虾米上搜索了一下初音的专辑。也许是关键字不对,我输入“初音ミク”并没有得到我想要的匹配结果。但是依然地,还是能找到几张精选集。

电子合成音的特色非常明显。音调很滑。起落也是说来就来,没有一丝拖泥带水。这种怪异的风格让我十分喜爱。

技术宅拯救世界啊。

Everything has a price

 这句话是地精的口头禅之一。当然,它们是精明的生意人,任何东西都可以被量化成一定数目的货币。而我,只看到“代价”二字。

 

代价是一种制约。正如我在合租中水电费分配方案上的意见一样,无论多么同情照顾怜悯对方,依然不可以独自承担所有的费用。费用必须按一定比例分担。这样才能让对方在使用的时候有所顾忌,不能随心所欲。

代价也能让人慎重。除去机会成本这种必然存在却经常难以评估的代价,一个明确并且价值相当的代价,会使人更加地深思熟虑,仔细选择。

代价更使人珍惜。免费的培训经常是收效甚微的,因为受众大多不珍惜,除了时间之外什么也不用付出,而有的人正好不缺时间。收费的培训则效果好得多,并不仅仅因为教员更努力了,更多的是因为受众更专心了。越是价格高昂,就越是让人刻骨铭心。考试也一样。十几块钱的六级我也考了两三次,100多的软考我就不敢造次。

 

这世界上会有很多情况下的最优解,然而总的来看,任何时候都存在着选择,在各个“way”的代价与收益中取舍。

grep,sed的祖宗ed

 ed,行编辑器,现在看上去很简陋,但是一举一动却透显着各种辉煌后继的渊源.

使用ed,每次可以处理一行.用ed打开文件时,它会定位于最后一行,并显示文件中的字符数.

比如我在电脑上有一份安装时的log:

 

 

[root ~] ll

total 304

...

-rw-r--r-- 1 root root  44611 Feb 22 23:44 install.log

...

 

 

现在用ed打开:

 

 

[root ~] ed install.log

44611

 

 

没有任何提示符,甚至没有告诉你现在所处的行号.虽然说知道是最后一行,但是最后一行是第几行却不知道.直接输入数字,可以跳到相应的第几行,这个采用绝对行号;也可以使用"-","+"来使用相对行号,也就是相对当前行的行号.如"-3",就是往前数三行的内容,不带数字则等于数字为1.  要查看当前行的内容,可以使用"p"命令. man手册上说,"."能显示当前行的address,我实在不明白这个address是什么意思,因为我输入"."后,回显结果跟"p"没有任何区别.

 

 

	[root ~]$ed install.log
44611
.
Installing zsh - 4.2.6-1.i386
p
Installing zsh - 4.2.6-1.i386
 

 

ed既然作为sed跟grep的祖先,自然支持正则表达式,以及正则表达式下的查找替换删除等等操作,甚至连语法也基本一样.所不同的是,它默认只针对当前行进行操作,如果要扩大范围,则需要加地址.比如"g",比如正则表示的地址.它的替换命令"s"的完整格式是:

 

[address]s /pattern/replacement/flag

 

pattern是个正则表达式,replacement则是所要替换成的字符串,flag倘若为"g"的话,则表示会替换这一行内所有出现的pattern,如果没有"g",则默认只替换第一个.

grep实际上就是将"g/re/p"给抽离了出来,单独做成了一个工具."re"表示正则.

sed命令跟ed命令一个很大的不同就是,sed命令如同grep一样,默认带有"g"属性.它加的"[address]"是为了缩小操作范围,而ed的"[address]"是为了扩大操作范围. 当然,从结果上来看,两者可以说没有区别,除非未指定address.

完整的ed命令,都可以在man文档中找到.我个人觉得在vi,sed,awk大行其道的今天,单纯的ed编辑器本身并没有太大必要关注了.但是"行编辑"这个概念,倒是可以给刚开始学习grep,sed之类的人解决不少疑问.

 

WOW 3.3.5 US client 好友名单中文显示问题

今天WOW的台湾服务器也随着上周美服的脚步,更新到3.3.5了。翻看了下patchnote,在UI方面一个主要改动是好友列表那里跟战网进行了组合,当然这个改动对台湾服务器而言是没有作用的。全世界都用战网ID登录,甚至依然停留在TBC阶段的CWOW都用的战网ID,台湾服务器依然固守原样。

实质作用虽然没有,但是晚上还没上线更新剑杰就在QQ上跟我说好友列表不能显示中文了。我第一判断是:字体文件。美服客户端自带的字体文件都不包含中文字符。之前都使用在安装目录下另建Fonts文件夹,然后放入同名文件的方法,先于MPQ包中的字体文件被系统调用,达到显示中文的目的。然而系统中对字体文件的调用并不是铁板一块所有地方都一致的,而是根据各个Frame的不同,各个出现位置的不同,调用了多个不同的字体文件,并且各有scale大小之分。这种不同调用的具体规则定义在MPQ包的一个XML文件中。

Read all

To deal with such a mass

 大约三个月以前,我设想了每天的生活该是个怎么样子。三个月过去了,略有改观,但是并没有被坚决地贯彻,实际上,是被自己忘记了. My life is still a mass! 我甚至无法预测我的下一顿将出现在哪里,将在何时进行。

我觉得我需要一个较为详细点的计划和安排,规范一下作息习惯。虽然不用像Sheldon那样固化到不可改变,但一定程度上的强化的确有好处,也许还可以增加自己的“执行力”。类似的计划和安排曾经做过不少,当然实际结果是一个也没有被执行过。随便吧,哪怕是写归写做归做,写一下也没什么坏处,起码真的要做的话也有个基础。

1.每周的周五周六周一,晚上需要洗衣服。

2.每周三周日,需要抽时间打扫房间卫生。

3.一周内吃早饭次数不少于三次。

4.一周内吃午饭次数不少于五次。

5.一周内吃晚饭次数不少于六次。

6.一周内练习小提琴或者处理小提琴相关事务的时间不少于三小时。

7.周二周四晚上阅读技术类书籍。

8.周五晚上阅读文艺类书籍。

9.一周玩WOW时间限制在14小时以内。每次计时。

10.每次玩全面战争游戏限制在2小时以内。设置闹钟报时,这个太容易超了。

11.开始俯卧撑锻炼。由10个开始。每三天增加一个。初步到三十个为止。之后见机行事。前21天内不得中断。

12.早上喝咖啡,晚上尽量不要喝。

13.早点睡。午夜12点之后尽量不要再活动。

14.每个月去一次图书馆。这个时间初步决定在每月中旬。

15.每天看一遍这个计划,并回想设计好的生活。确保不要忘记。

Software Maintenance is a Solution, Not a Problem

Is software maintenance a problem?

Today's standard answer is "You bet it is."

The standard rationale for that standard answer is "Look how much of our budget we're putting into software maintenance. If we'd only built the software better in the first place, we wouldn't have to waste all that money on maintenance."

Well, I want to take the position that this standard answer is wrong. It's wrong, I want to say, because the standard rationale is wrong.

The fact of the matter is, software maintenance isn't a problem, it's a solution!

What we are missing in the traditional view of software as a problem is the special significance of two pieces of information:

The software product is "soft" (easily changed) compared to other, "harder," disciplines.

Software maintenance is far less devoted to fixing errors (17 percent) than to making improvements (60 percent).

In other words, software maintenance is a solution instead of a problem because in software maintenance we can do something that no one else can do as well, and because when we do it we are usually building new solutions, not just painting over old problems. If software maintenance is seen as a solution and not as a problem, does that give us some new insight into how to do maintenance better?

Read all

艰苦的世界杯

世界杯已然开打了,我也已经忙碌了三星期了。未来还有4周 为了满足这次的活动要求,整个短信系统可以说是从头到尾里里外外大做手术。作为直接负责人,从前台到后台,从数据库到网页,从与电信的技术人员商讨衔接细节到给公司的市场人员提取各种数据,乃至做数据分析……每天从上班到下班,不得一丝空闲,加班也真成了惯例,以后还得值班…… 而这两天的短信上行量并不理想,看来那边肯定不会满意,整个短信流程必然要改。而这个改动非我不能做。计划了几个月的17,18两日请假去世博会看来是无望了。即使上司同意,我自己也难以放心下来。今天给姐姐打了个电话,看看能否提前到15号出发,然后我16号下午回来,他们接着在上海逛逛。可是15,16是端午假期中,这个时候去恐怕只是专程去排队的了。

Read all

怎么安排呢

很多年以来,我一直没有专心地做过正经事。这应该就是每况愈下的原因了。自从接触了电脑之后,几乎都在廉价的游戏娱乐之中了。一直很有想法要做点什么,可一直迈不开实质性的脚步。 我突然觉得,我费这么大劲地武装我的电脑,一个部件一个部件地升级,结果并不是什么好事情。我很明白,我的升级完全是为了更好地玩游戏服务的。如果不玩游戏,本来的电脑已经足以完成我所有的工作了。也因为不能摆脱游戏,我一直没能把Linux作为自觉的桌面。我并不在乎什么网银什么在线播放,事实上越来越多的网站都开始支持火狐支持chrome了,可是我不得不在乎那许许多多的专为windows量身定做的游戏。

Read all

Java File类rename时的错误

 前段时间准备把录音文件改名,很自然地,用到了File类里的renameTo方法。这个方法的用法遍地都是,无外乎如是:

 

File oldf=new File(oldpath);
File newf=new File(newpath);

if(oldf.exists){

 if(oldf.renameTo(newf)){
    
    Log.println("修改成功");

  }else{

    Log.println("修改失败");

  }
}

但是,运行之后,发现全部都是修改失败。 上网找了下原因,有人列出renameTo失败的三种情况:

1.源文件不存在

2.目标文件存在

3.文件系统不对

当然,还有人补充了别的一些原因,比如没有修改权限等等。然而,这些对我的情况来说,都不成立。首先我是windows系统的administrator,不存在权限不足的问题;其次,我是在同一个分区的同一个文件夹里改名,也不存在磁盘分区问题;再次,源文件存在而目标文件不存在。这些可能的原因一个都不是,那到底问题出在哪呢?

这个折腾了我很久。直到有一天我想手动改名实验下的时候,发现症结所在了。我的newpath,也就是要改的名字,里面带了“*”号!! 我原本是想用这个作为分隔符的,没想到这个恰好是windows禁用的符号……早知道如此,我直接用“#”号不就完了!!

困倦

 还是没能改掉作息习惯,今天周一也是极度困倦。上午根本做不了什么事。中午稍微睡了会才感觉好点。下午在修改外呼系统的代码,又是该死的前台ajax!怎么调都不对。我要显示一个datalist,于是在一个tr后面加了个div,以这个为标记,在里面写innerHTML。可是结果这个div出现的位置完全没有道理,跑到上一个tr的上边去了。

 

下午下班回来,困倦至极,倒头便睡。中间汗液打来电话,说了那个asp网站还需略微修改。主要就是点击图片时要加入预览显示大图的功能。这个应该不难,明天搞一下就行了。接完电话后接着睡。10点半左右,婷婷来敲门了,告诉我说这两个月电费降下来了,恢复正常了,两个月才200多。涨也涨得离谱,降也降得离谱,完全不合逻辑。算了,懒得计较,也就几块钱电费罢了,能降点总是好事。

最近变得忙碌

最近又懒了起来,博客懒得写,连每周的工作周报也懒得写了。 上周五一放假,但是为了准备端午过后的那几天里能请出假来陪爸妈与姐姐一起去上海看看世博会,五一主动申请电话值班了。下午的时候,剑杰打电话过来叫我过去玩,他也一个人,顺便带点食物。我于是拿着前一天买的一堆联华超市的还算不错的食物过去了,还带着小提琴。几天没拉,感觉居然有进步了,也许是潜意识的功劳哈。晚上我准备去运河广场那的联华超市转转,那边比较大。于是跟剑杰骑着自行车出去了。

Read all

HP大中华区总裁孙振耀退休感言

你工作快乐么?你的工作好么?

  

  有没有觉得干了一段时间以后工作很不开心?有没有觉得自己入错了行?有没有觉得自己没有得到应有的待遇?有没有觉得工作像一团乱麻每天上班都是一种痛苦?有没有很想换个工作?有没有觉得其实现在的公司并没有当初想象得那么好?有没有觉得这份工作是当初因为生存压力而找的,实在不适合自己?你从工作中得到你想要得到的了么?你每天开心么?

  

  天涯上愤怒的人很多,你有没有想过,你为什么不快乐?你为什么愤怒?

  

  其实,你不快乐的根源,是因为你不知道要什么!你不知道要什么,所以你不知道去追求什么,你不知道追求什么,所以你什么也得不到。

  

  我总觉得,职业生涯首先要关注的是自己,自己想要什么?大多数人大概没想过这个问题,唯一的想法只是——我想要一份工作,我想要一份不错的薪水,我知道所有人对于薪水的渴望,可是,你想每隔几年重来一次找工作的过程么?你想每年都在这种对于工作和薪水的焦急不安中度过么?不想的话,就好好想清楚。饮鸩止渴,不能因为口渴就拼命喝毒药。越是焦急,越是觉得自己需要一份工作,越饥不择食,越想不清楚,越容易失败,你的经历越来越差,下一份工作的人看着你的简历就皱眉头。于是你越喝越渴,越渴越喝,陷入恶性循环。最终只能哀叹世事不公或者生不逢时,只能到天涯上来发泄一把,在失败者的共鸣当中寻求一点心理平衡罢了。大多数人都有生存压力,我也是,有生存压力就会有很多焦虑,积极的人会从焦虑中得到动力,而消极的人则会因为焦虑而迷失方向。所有人都必须在压力下做出选择,这就是世道,你喜欢也罢不喜欢也罢。

Read all

一个大机箱

今天买了个机箱,很大的一个。原本一直想买酷冷开拓者或者联力的,结果跑遍整个卖场都没见到一个样机。最后在颐高三楼的一个大的店铺,看到了一个联力K58。料真的不错,作工也好,非常坚实。然而销售人员居然不知道价格。后来七搞八搞。我就被忽悠了,买了边上的一个振华SF1000。忽悠我的那人说这个要比联力的K58贵一些。然后一口报了个680。我随口减了他50块。我现在很后悔,每次还价都手太软,明明知道这东西不值这个价,却就是不好意思杀狠点。然后630成交了。付了款,等机箱的时候,越想越后悔啊,这材料作工怎么看都是联力的强,这款的优势在于硬盘架的设计,以及更多的散热风扇,以及更大,以及带个eSATA口。联力K58的京东价格是499,卖场卖的话会贵一些,但也就500多,再贵我就不要了。这个却要了630。回来后查了下价格,果然,这个跟K58就是一个价位的东西,淘宝普遍售价在499。SF1000有三个款式,还有两种是侧板也带大风扇的,并且硬盘架有两个。我这个侧板不透,硬盘架也就一个。630的价格却足以买到SF1000中最好的红色类型。被忽悠了130了,还费了老大的劲把个22斤重的东西扛回来。MLGBD,以后要坚持网购,即使不网购也要看准了再买,坚决不要任何奸商推荐的货!

Read all

骑车上班——糟糕的红绿灯设计~!

给A卡开通了租用公共自行车的功能后,开始尝试骑车上下班,以减少公交费用并在某些时候节省时间并适当锻炼身体。总的来说,还是很怡人的。然而,下班后经过公司门口那个十字路口时,那红绿灯着实让我愤怒啊。我自行车要左转弯,它居然切到绿灯时,自行车前进左转,汽车前进左转全部同时亮起。你这让自行车怎么转嘛!!我一直奇怪那个路口为什么老是堵住,原来问题出在这红绿灯上。绿灯一亮,各种车辆抢道抢的厉害,然后就挤作一团。

What a life should I take?

I am wondering what a life should I take. I do not have a clear imagine of my future.

Read all

若有所失

今天看完了《异界变身狂想曲》,没想到居然是如此雷人的结局,这么突然地,就羽化成神飞升了,而后交代了一下几个配角的后事就匆忙结束了。看完后,感觉堵得慌,好像一个很亲近的人,突然就离去了,好像少了什么东西,空落落的。

Read all