木匠的微型博客 Charlie Twitter

    follow me on Twitter

    Thursday, December 17, 2009

    SMART Objectives如何分解和设定目标

    如果没有设定目的地,我们只会盲目前行,不知道该去哪里,也不知道能不能到达那里.

    要变成你想成为的人,完成一些辉煌成就,我们必须设定目标,包括职业发展和追求美好生活,家庭/事业/财务/社区/自然环境.

    我们如何设定阶段性里程碑来完成目标呢? 这就有了 SMART Objectives.

    1. Specific: 短期目标应当是非常明确的和具体的. 比如ETL里面,不是构建一个数据仓库, 而是将product_id成批转换成production_name, 冗余数据.

    2 Measurable:怎样知道何时完成了目标? Measurable和Specific亲密相连,通常的和抽象的事物不容易测量,而容易测量具体的明确的使用数字定义的事物.无法测量就是不够明确. 循序渐进,按阶段分解,设定短小目标,走一步,量一步

    3 Achievable: 从你现在所处的位置,制定一个可以实现的短期目标;目标必须是合理的,现实的,客观的.
    比如,在一周之内用新学的编程语言写出"世界,我来了!",是合理的; 但是,在一周之内使用神经元网络优化程序写出一个互联网应用框架和用户界面, 是不太现实和客观的.

    4 Relevant:目标相关性就是,它是对你重要的,充满热情的,可以支配和掌控的.

    5 Time-Boxed:对每个阶段目标设定硬期限. 不然,目标就会枯萎凋零,最终丢弃一边. 总之,设定许多小的里程碑,完成一件,前进一步,倍感鼓舞.

    那么还等什么呢.赶紧试着SMART objectives分解你的目标,设定阶段性里程碑式样的目标吧.

    Monday, December 07, 2009

    Acting Evolved 以进化的高等智能人类的思考来处理变化

    "Act like you’ve evolved: breathe, don’t hiss."

    鄙人的理解就是: 对于一些(反感的,恶心的,烦人的)突发事件,不要急躁,紧张,暴跳,而是做深呼吸,冷清分析处理.不要像变色龙/蛇一样焦躁的嘶嘶作响(以尖利的嘘声驱赶或压倒、嘲弄等). 在热带丛林里面,迅速暴力做出反应,应对凶禽猛兽或许适当. 可是在一个软件开发项目里,如此对待同事,客户,或者服务供应商,就不合适了.

    思考需要时间.




    From 2009_Oct

    Tuesday, November 03, 2009

    我的脚痛 sole of foot

    脚掌终于承受不了每天十公里的负荷.早上看了医生,指出鄙人脚结构的天生缺陷.需要扔掉$50的运动鞋,换了穿每双$150的辅助校正鞋子(Orthotics).还说计算机工程师钱够,显然也是对IT人士有偏见.回头看看公司的福利或者保险公司能不能报销这个处方.

    上传美景.

    From

    Port Renfrew 一家饭馆的外面.
    ..
    From 2009_Oct

    Tide pool.
    ..
    From 2009_Oct

    典型加拿大西海岸风光
    ..
    From 2009_Oct

    欢德福卡海峡 出海口, 外面就是太平洋了.
    ..
    From 2009_Oct

    使鄙人脚痛的朱丽叶.

    Wednesday, September 30, 2009

    2009 Commit and Oracle-L后面的骨干Tim Gorman

    在亚马逊"老巢"参加两天的DBA内部技术交流会.

    Keynote由Oracle-L后面的骨干Tim Gorman开讲.Tim的主题是如何协调后台的System Admin和前台的UI/Application developer.

    可能国内已经有同行知晓Tim的名气,早上一起在亚马逊登记,然后等候入场,基本是尴尬冷场.

    Tim引用了一个案例,是说数据仓库开发人员不清楚BitMap索引是如何工作的,一个fact表,五个位图索引,使用SQL MERGE加载数据,强制使用并行处理. Tim用分布事物来比喻并行处理,结果BitMap索引是锁上加锁,处理时间漫长无比.

    那么解决方案是什么呢? 鄙人马上脱口而出, exchange partition,
    Tim做了补充, union all源数据和目标数据,使用SQL Anylitic function Row_Number()排重(Dedup),然后INSERT进中间表,最终交换表分区.

    这个处理设计和我们正在重建的库存系统的数据加载策略基本吻合. 只是我们的需求更加复杂一些,需要保留同一分区(书商)里面没有匹配的数据,set qty=0.

    最后,更新问题跟踪系统,给developer留个台阶, 备注是这样的: "DBA的责任,已经解决."

    会后我们想谈甚欢,希望以后从他那里接一些分包合同.

    Tuesday, September 29, 2009

    基本数据库存取 Basic data access

    学习了Tom巡回演讲中的一节, 使用索引:

    下面两种引用简单程序逻辑的比喻,非常贴切,这也是鄙人面试时,经常问到的一个题目.

    a) say out loud - full scans are not evil
    b) say out loud - indexes are not all goodness
    c) goto (a) until you actually believe what you are saying out loud.

    参考: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:743251200346166176


    Mythology – why isn’t it using my index
    Loop
    Say indexes are not all goodness
    Say full scans are not evil
    Exit when (you really believe it)
    End loop

    参考: Indexing.ppt , 下载: http://asktom.oracle.com/pls/asktom/f?p=100:8:1413269270550111::NO

    Thursday, September 24, 2009

    为什么不能买日货 why beat rb

    两国相争, 最后拼得是经济.

    鄙人语文差, 下面这篇文章, 正好代表了我的大部分想法, 转贴过来.
    原文: http://www.360doc.com/content/070907/13/36627_725823.html


    春秋战国时期,中国产生了许多思想家,其数量之多,是古希腊、古罗马、
    欧洲文艺复兴时期的总和所望尘莫及,他们的思想光辉,至今还在历史的长河中闪耀。

    诸子百家中,有一子叫“韩非子”,有一家叫“法家”,这个法家思想的集大成者,
    说话结巴子的韩非子,说了三句话却是力贯古今:
    “上古竞于德,中古逐于智,当今争于力”。“当今争于力”成了相对真理,
    被证明了二千二百多年。现今的国家关系,仍旧是争于力,只要国力超强,爱打谁就打谁,
    现实世界, 并无公理可言。国家关系,只认实力,有几个人跟你讲道理,讲交情。

    纪念二战胜利刚过,就以二战为例,二战的胜利,也是争于力,
    拼的是经济,拼的是国力。

    美军在欧洲战场上,无战争艺术可讲,只是“饱和轰炸,一线平推”而已。
    一次德军奇袭了美军的一个机场,把三百多架飞机消灭在地面上,
    不出三天,德国人发现,机场上又出现了四百多架崭新的飞机,
    所有的德国将军都明白,这个仗不用打了。
    即便再多出几个像隆美尔、古德里安、曼斯坦因这样最杰出的将领也无济于事。

    美军在太平洋战场也是一样,以硫磺岛战役为例,美军对日军
    的比例是:空军35:1、海军26:1、陆军5:1,登陆作战前,
    照例对硫磺岛进行了两个多月的饱和轰炸,硫磺岛被犁了多少遍,
    美国人恐怕连自己都搞不清。此种打法,美国人如何能不胜。

    就单兵的素质而言,德、日的士兵高于美、英、前苏联、中国。

    就将领的水平而言,德、日的统帅不逊于同盟国。

    德国的古德里安,在波兰、俄罗斯、包括日本还在崇尚骑兵、
    特别是波兰,真诚地崇尚骑兵的时候,就提出了装甲集群、
    大纵深突击的战争理论,在这个理论的推演下,德国的闪电战、
    德国的坦克部队横扫了欧洲。

    日本的山本五十六,首先提出了海军航空兵的理论。珍珠港一战,
    把美国海军赶回了西太平洋,他的海军制空权的理论,已经管用了六十多年。
    现今的远洋海军,是由航母、巡洋舰、驱逐舰、
    潜艇等构成的航母战斗群,这是美国海军的典型配置。

    但是,士兵的骁勇和将领的优秀,并不能挽救轴心国失败的命运,
    因为,到最后,拼的是经济,拼的是国力,是争于力。
    二战后期,美英年产十万架飞机,主要是美国生产的。美国一家,
    其生产能力,已超出德、意、日生产能力的总和。

    这是二战史上的争于力,当今世界的现实状况是,那个近邻
    日本,世界第二大经济强国日本,2002年,人均gdp就高达36000
    美元。这还不算日本的海外资产,2002年,日本的海外纯资产已
    高达16277亿美元,相当于德国、法国、意大利对外纯债权额总和的六倍。

    可怕的是,日本的政府、媒体、学者共同编造了一个弥天大谎,
    明明日本经济在强劲发展,却说成日本的经济衰退了十年,
    运用谎言重复一百遍就是真理的办法,把满世界的人骗得信以为真、
    晕头转向。中国是“韬晦之计”的故乡,其韬晦之计却被日本人用得炉火纯青。

    可怕的是,日本人在制造一个弥天大谎的同时,尽量夸大中国
    经济的发展,大造“中国威胁论”的舆论,让欧美一起来围堵中国,
    这一点上,日本人的阴谋也得逞了。日本是“中国威胁论” 的策源地和故乡。

    日本人这两招,目的一个,让世界各国把矛头对准中国,
    把中国人置于四面受兵的境地,欧美各国,一再打压人民币升值,
    在长时间的高压之下,中国政府不得不于今年升值人民币。
    而国内,人民币却大幅贬值,仅举一个参照物,去年
    一元钱人民币买半公斤大米,今年要一元六毛五分钱才能买到五百克。
    按照经济学理论,每年通货膨胀在百分之二,是正常的,
    对经济发展有利。到百分之四,就证明有了问题,
    对经济发展不利。到了百分之六,就非常的糟糕......
    日本人笑了,而中国的老百姓却是里外受损、两头吃亏。

    日本学者,还在继续造谣,说下一个十年,日本经济还将继续衰退,
    日本上下,心领神会,连说谎造谣都众口一词。

    日本人万众一心欺压别国,韩国人同仇敌忾对抗别国欺诈。

    世界上许多民族,都有优点和长处,包括日本民族也不例外,
    都有值得我们学习的地方,不重视这一点,只知仇恨,就是愚昧,
    那只是1900年义和团的水平,“师夷以制夷”,学习外国人是
    为了图强,是为了“人不敢侮”。为什么中国人不能学习异民族所长,
    也来个万众一心、同仇敌忾???

    中国威胁谁了?笔者不是学历史的,可是笔者清楚得很,自一八四零年鸦片战争以来,
    别人少欺负一点中国人就很不错了,六十多年前那一场战争,
    中国弄到差一点亡国灭种的地步。直到现在为止,中国人还处于五、四运动时期“外抗强权,
    内惩国贼” 的阶段,正在“抵御外侮”,还没有做到“人不敢侮”。别人
    一不高兴,精确制导的炸弹把你的大使馆炸个底朝天,然后说一声误会就完事了。
    就好比在市中心广场,一个人甩了你几个大嘴巴,朝你脸上啐了几下口水,踹了你几脚,
    然后再说一声对不起、 误会,就完事了。
    尽管全市的人都知道,你也只能擦擦吐到脸上的口水,把打掉的牙齿往肚里咽,
    捂着腮帮子回家,你还能怎么着,除非你准备拼死一战。一百五十五年了,
    笔者只知道中国人受尽屈辱,不过是忙着抵御外侮,威胁别人的事,
    影子气都没有、门都没有。日本人居然能大造“中国威胁论”的谣言,
    真亏日本人想得出来,日本人做事也过于极端了,对中国人也过于阴狠、过于毒辣了。

    从中日关系来看,自建国以来,中日关系现处于最紧张的
    时期,就在17日中国的神六顺利返回,举国欢庆的时候,
    就选在这一天,小泉再次参拜靖国神社,这是今年第二次参拜,
    这是特意向中国人挑衅,或者说警告,你中国人不要高兴,
    我日本横下心来要和你中国为敌到底。

    中国有九亿农民,其中至少有五亿生活在联合国划定的贫困线以下,
    我们的人均产值还很低,中国人节衣缩食,弄几个载人飞船上天,自己花自己的血汗钱,
    自己给自己开一下心,自己给自己提提精神,有什么不可以?
    就好比一户贫苦家庭,过春节的时候,买几个炮仗放放,有什么不可以?
    你日本人有的是钱,可以天天买炮仗放。你日本人为什么要如此的仇恨?
    你日本人的心理为什么要如此的阴暗潮湿??

    五四运动时期,国人抵制日货,前段时期,一些城市抵制日货,
    早在十几年之前,著名作家张贤亮提出抵制日货。日货非抵制不可,
    日本人欺人太甚。购买一件日货,就是增加一分日本人的国力。
    如果中国人像韩国人一样,万众一心不买日货,
    日本人就不会象现在这样嚣张,中国也就多一点国家安全。

    我们写文章时,一般会引用名人名言,以增加说服力。
    今天笔者还要引用一个普通姑娘淼逸冰的话:“让中国人抵制日货成为习惯”。
    韩国人抵制日货已经成为习惯,为什么中国人抵制日货不能成为习惯???

    作为一个清醒的领导人朱鎔基,在当上海市委书记的时候,
    其时日本轿车在中国大行其道,其他省、市政府大买日本车,
    朱鎔基就明确规定,上海市直机关一律不得购买外国轿车。

    在当了总理以后,一次大会上呼吁代表,买一点国货带回去。

    为什么不能买日货?因为:“中国在加入wto以后,要遵守共同的游戏规则,
    政府无法再用关税壁垒的办法,阻挡外国商品的入侵。”
    这个时候,就更需要全体中国人一致的自觉行动, 像韩国人一样一致的自觉行动。

    为什么不能买日货?因为:“日本人将有毒、有害、过时的商品、残次的商品卖往中国。”
    据政府的《国际金融报》十月十四日第一版载,日本人将有毒致癌的食品保鲜膜倾销中国市场,
    已占中国市场的百分之八十。此种保鲜膜,日本国内早已禁止使用,
    国际上早已禁止生产。难道国内连冰箱里用的保鲜膜都不能生产了?
    难道国人连国产的保鲜膜都不能相信了?这样的例子,无法一一列举。
    日人可恨、可气,国人可悲、可叹。

    为什么不能买日货?因为:“日本人有他的心理特点。”
    他在中国赚的钱越多,就越是嘲笑你中国人,鄙视你中国人,仇恨你中国人。
    中国的原当权者不遵从国际惯例,不考虑中国人的生命财产损失和老百姓的生活,
    不取得中国人民的同意,大喊不要日本人的战争赔款,那可是一笔天文数字的战争赔款。
    结果怎么样,非但日本人没有一俩感激的意思,而是相反,中日关系越来越紧张,
    五十年来日本人哪一天忘记了欺侮中国,
    小泉哪一天不是一天二十六个小时在盘算着如何和中国人过不去,就是典型例证。

    为什么不能买日货 ?因为:“安不忘危”。和平时期万众一心抵制日货,
    形成国人的坚定信念和爱国氛围,战争时期才能少有汉奸。
    为了减轻将来中国人可能蒙受的苦难,必须现在就着手铲除滋生汉奸的土壤。
    再说了,中国还没有那么“安”,反而给人的感觉是虎狼环视。
    为什么中国内奸的数量世界第一?
    不能不深思,不把这一层说破,有害无益。不把这一层说破,就是讳疾忌医。
    “知耻近乎勇”,国人焉能不知耻?二战期间,前苏联就没有那么多的俄奸,
    俄国也有投降的个别将军,就无法组织起俄国的“和平军”,这是为什么?
    这一点,也值得国人深思。

    为什么不能买日货?
    因为:“平头百姓、有识之士,反击日人攻势,奔走呼号,
    抵制日货,雪心头之耻、胸中之恨,别无它途。

    为什么不能买日货?因为:“日本人对中国政府每一次成功
    的破坏,所造成的经济损失,归根到底是由基层的群众来承担。”
    那些贪官污吏,动辄收贿贪污几百万、几千万,他们的奢靡生活,
    不论何时都不会受到影响,而明显受到影响的,只会是最广大的平民阶层。
    贪官污吏不会知道,也根本不需要知道,一年之内大米会
    以每市斤百分之六十五的通货膨胀率增长。
    所以,首先要求抵制日货的,不可能是官吏阶层,只能是平民阶层、也只会是平民 阶层。
    而且,由于教育、文化等等方面的原因,也只是平民阶层中的一部分清醒者
    和属于他们的知识分子。这不是平民阶层一个阶层的悲哀,而是一个民族的悲哀。

    为什么不能买日货?因为:“当今争于力”。那个会打仗的
    秃子林彪,倾向于中日还有一战,万一有了战事,
    你今天手底下买进一件日本商品,为日本人增加一分国力,
    你明天头顶上就多出一枚日本炸弹,而炸弹带来的,只能是尸体和废墟。
    没准,落在你头顶上的那枚日本品牌的炸弹,恰好是用你购买日本品牌的商品,
    进而产生的利润生产的。

    为什么不能买日货? 因为:“日货、日货, 日本倭寇之祸。”

    为什么不能买日货?因为:“我们的身后, 三千五百万冤魂在哭诉。”

    Tuesday, September 22, 2009

    Agile 敏捷软件开发学习心得

    上周六在维多利亚IT Club聆听了GuoLei两个小时关于Agile Software Development 的精彩演讲.
    这是维多利亚IT Club挂牌以来不多见的高品质技术交流.
    GuoLei关于Agile Software Design的演讲很成功,内容丰富,观众积极发言,反响热烈. 鄙人也有不小的收获.
    没来的同行一定会后悔的, 读完此文,您一定更后悔, 鄙人就不会后悔.

    这里谈一些鄙人的心得体会.

    . 设计和制造(manufacture)
    GuoLei举了一个宝马制造汽车的例子, 造一辆新汽车, 制造过程占了整个流程的很大比重, 超过50%.
    而软件开发99.9%的时间是在设计, 包括传统的需求分析,设计,编码,测试, 而制造(build)过程在一瞬间就完成了.
    所以鄙人鄙视那些号称软件工人的家伙. 作为软件开发人员,要把自己当作设计师来看待,才能生产出优秀的软件.
    也就是High Available and Scalable application system.

    . Communication over documentation
    代码一定要清晰可读, 多行代码也没有关系, 忌讳使用一个高深的表达式,上午写的,到了下午,自己都看不懂了,窘迫.
    写在代码中间的备注是没有多少人看的,而且很可能已经过期了,说的完全不是代码要做的事.
    尽可能面对面交流, Email/电话 均不提倡. 80%的沟通是通过表情和肢体语言来完成的.比如,当你解释完一个处理模型以后,观众回答听懂了,可是难以掩盖他们木然的表情,依然处在疑惑当中,而打电话时,你是看不到对方表情的.

    . 积累和完善测试案例, TDD(Test Driven Design)
    一开始,不需要覆盖100%的测试案例; 而是使用测试案例帮助设计原型,逐步完善我们的设计方案.
    开发一个新功能,就累积一个新的测试案例,
    发现一个新的bug,就累积一个新的测试案例,逐渐完善测试案例库的涵盖程度.

    . 左脑和右脑
    左脑负责常规约束活动,
    右脑具有创造力,
    也就是为什么工作累了以后,会卡在一个貌似棘手的问题,苦苦找不到解决方案,然后走开喝杯水,上个厕所,散散步,抽根烟,立马就有了解决问题的眉目,好点子不断. 因此,每隔一小时,出去散散步,使用一下右脑,发挥创造力. 即对健康有利,又能提高工作效率,我们出去散步吧.

    . 人是关键
    再好的软件开发流程没有人的积极参与是不行的,而且软件行业人与人之间的差别太大,好的杰出的程序员的开发效率常常高出普通程序员的十倍以上. 点背不能怪社会,只能怪自己天赋不够, 嘻嘻.

    参考: 如何穿越团队协作的五重障碍
    http://hi.baidu.com/sunguangran/blog/item/2ab0e5cce64d121900e9286f.html
    信任缺失
    “第一重机能障碍是团队成员间的信任缺失。这实质上源于他们不愿在团体中轻易受到攻击的心态。团队成员如果不对其失误和弱点真正地开诚布公,就不可能打下信任的基础。”
    惧怕冲突
    承诺不足
    逃避担责
    漠视结果

    未完待续...

    Friday, September 18, 2009

    918国耻日警钟与反省

    cnoug.netaskdba.net 竟然看不到一篇纪念国耻日的贴, 那么鄙人就转摘一篇吧.

    送给那些继续支持日本经济建设的同胞, 醒醒吧.

    引自: http://www.victoriabbs.com/bbs/viewthread.php?tid=19255&pid=99346&page=1&extra=page%3D1#pid99346

    回顾中日历史,与其说是一衣带水,倒不如说是一衣带血倒更为贴切。自龙翔三年(公元663年唐高宗时代),日本占领朝鲜锦江口始,中日间就拉开了兵戈相见的序幕(至于那个携大量珍贵文物东渡的汉奸和尚鉴真,不明白历史书上为什么还要对他大加褒扬),明太祖洪武年,肆虐达七十八年之久。万历年,丰臣秀吉出兵二十一万,攻占朝鲜,明大将李如松出兵援朝,在付出较大牺牲后一举击败日本。然而。从那时起,日本的战略家们就已经开始处心积虑地研究和制订灭亡中国的计划。到了近代,甲午战争的惨败彻底暴露了老大帝国的颓弱本质,倭寇的帝国梦,就是那时开始于中华民族的血泊与白骨之中的。

      56年前的8月6日和8月9日,曾经不可一世的日本在屡受挫败后,遭到的真正的天谴。上帝说:伸冤在我,我必报应。果然,那动人心魄的一瞬间的闪光与冲天而起的蘑菇云,让日本人第一次感到了死亡的恐惧。但今天,当废墟再一次成为繁华的大都市的时候,我们看到的是:今天的日本人,爪牙更锋利,气焰更嚣张,而记忆却更差了。在一部叫《漂流街》的电影里,一个爱打乒乓球的中国黑帮老大,曾对日本人说过这样一段话:从前,一个岛上生活着一群猿猴,后来有中国人去教他们写字,猿猴们学会了,但却不懂得字的含义,不懂得什么叫诚实,什么叫善良,什么叫认罪......(大意)

      日本一直流行这这样一种调子,中国并没有战胜日本。的确,面对"8.15",中国的确不是那么理直气壮。有一篇介绍苏军攻打柏林的文章写到,"巨大的仇恨使苏军进攻柏林时没有溶入丝毫的怜悯,他们动用了所有可以拉到柏林的重武器,而根本不考虑平民的伤亡"。苏军也曾经拒绝一支杀害过卓娅的德军投降,而坚持把他们全部消灭。壮哉!这才是真正的大国之魂!而我们呢,做为战胜国却从未有过一兵一卒踏上过日本的领土,与量浴血奋战的国民党高级将领们,却作为内战的牺牲品与昔日的敌人同处牢狱。据我所知,全国各地的纪念内战的纪念馆要远比抗日的纪念馆数量多,规模也大得多。政府对日本宽厚,一来只是目光短浅的只考虑短期的国际形式,二来无非因为日本自78年以来给中国的两兆多日元的贷款(不用还的吗?)。可有谁想过,与这些低三下四争来的贷款相比,马关条约赔出去的二万万两白银价值几许?仅仅8年抗战中中国600多亿美元的财产损失价值几许?永难重生的文物古迹,自然资源价值几许?而千年来无数在对日战争中牺牲的中国军民的冤魂,一个拥有12亿人口的东方大国的民族尊严又价值几许?!

      总是有人对日本报有幻想,"军国主义是一小部分,广大日本人民对中国是友好的"的声音不时响起,奴才的腔调,自上而发。看过日本兵出征前在街上请路人给他们的吉祥物上缝一针以祈求平安吉祥的资料片吗?看过那些身穿和服的年轻女子,在疯狂地叫喊着反华的口号的资料片吗?看看吧,你可以知道"广大日本人民"的真实嘴脸。中国的一艘考察船去钓岛附近探了一下.随之而来的是日本外交部的警告:未经日本政府允许不得进入日本领海。日本青年纷纷要求与中国一战。日本人对中国的敌意,是全民族的,是发自骨子里的。今天小泉的种种行径,每个中国人都看在眼里,不需冗言。小泉,不仅仅代表他自己,他是两亿日本人一票一票选出来的!日本人聪明、勇敢、坚忍、团结,但他们更变态、畸形、极端、怪异(这些贬义词并非凭空捏造,如果你领略过那些深受日本人喜爱的病态的艺术,你就会感受到,日本人性最深处的丑陋与邪恶),这样一群有着人的思维的高级禽兽,要远比头脑简单,只是知道嗜血的豺狼可怕的多。

      中华民族,不是狭隘的种族,在她的怀抱中,56个民族能够亲密无间,和睦相处;中国人,更不是狭隘的民族主义者,我们在全世界有这数不清的不同语言,不同肤色的朋友。但唯一的例外,就是太平洋上的四个小岛,那里生活着地球上最凶残与可怕的动物,中华民族永远的心腹之患。中日世仇,不共戴天!每一个中国人永远都不应该忘记日本曾经对我们做过什么!对于一个应该在地球上消失的种群,对于一个人人可以诛之的国家,对于一个极端变态的民族,我们永远也不要再对他们抱有丝毫幻想。抗战期间的一首小诗,叫做《假如我们不去打仗》:假如我们不去打仗/那么敌人杀死了我们/还要用刺刀指着我们的骨头说/看哪,这是奴隶!

      中日之间,没有任何友谊可言,有的只有连绵千年的仇恨!先辈的英灵,每天都在半空中凝视我们这些至今依然无所作为的不肖的子孙,他们焦虑,他们失望......但我们忍耐终将会有尽头,厉兵秣马,做好准备吧,犯强汉者,虽远必诛!浑浊的小泉,永远也别想再一次兴风作浪!"巨浪"和"东风"就是我们的怒吼,我们期待着,铭刻着中国制造的蘑菇云再次生起,在东京,在京都,在大版,在每一个孳生着量艿巢穴。中华民族的千年梦魇,永远沉入太平洋底,累劫不复超生!也许很快,也许还要等很久,但血债必用血来还!大直若屈,大巧若拙,大辩若讷。

    "巨大的仇恨使苏军进攻柏林时没有溶入丝毫的怜悯,他们动用了所有可以拉到柏林的重武器,而根本不考虑平民的伤亡"。苏军也曾经拒绝一支杀害过卓娅的德军投降,而坚持把他们全部消灭。壮哉!这才是真正的大国之魂!

    Thursday, September 17, 2009

    维多利亚IT club topic: Agile software development

    本周主题: 敏捷软件开发 (Agile software development).

    时间: Sept 19th 2:30pm, that is 3rd Saturday 2:30pm every month

    地点: EBC church second floor meeting room.
    Address: 2121 Cedar Hill Cross Rd.

    主讲人: GuoLei(Lawrence), 此人来自油都 卡尔加里. Java 开发经验丰富, 搬到维多利亚后,一周内找到了合适的新工作. 然而最牛的是已经走了两次West Coast Trail, 鄙人深表敬仰, 希望五年内有机会走一趟.

    会后,有 GengLi 组织的高尔夫球活动,有兴趣的带上球杆.


    另外, 九一八国耻日到了, 作为国民,自己敲个警钟,反省一下.


    多谢,
    木匠

    Tuesday, August 18, 2009

    生活琐事3则 trifles

    上周末去Parksville的一个私 人capming site露营了,有水有电,设施齐全,就是太过于拥挤,无隐私可言;鄙人还是喜欢在国家公园/省立公园的密林从中露营. 带着朱丽叶狂奔了两个瀑布,周六Little qualicum fall,周日是English man fall.

    刚才跟一伙LAMP(Linux,Apache,MySQL,PHP/Perl/Python)人员开了个会,这伙人个个打扮的像艺术家,感觉他们并非都是Geek, 大多技术粗糙,开发的软件也是稀里糊涂,东拼西凑.

    --
    最近有一个骗局在维多利亚出现了, 号称Advance air supply company, 打着调查空气质量的幌子, 然后送你一个抽奖的卡片,随后两三天,就打电话说你中奖了,然后就要去你家送奖品,比如三天旅馆住宿,后面的骗局还不知道怎么发展,大家留意了,有危险, 就赶紧911报警.

    趁早给大伙提个醒, 谨防受骗! 鄙人因为爱占小便宜,差点上当.

    http://www.chinasmile.net/forums/showthread.php?t=420621

    ...

    Calgary这里有一家类似的Breathe E-Z Home...送奖品的后招 - 据说是,和奖品一起带一台超级吸尘器(有改善空气质量之特殊功效)到你家,如果你开门给他们进来了,就别指望他们把吸尘器带走.他们会极力吹嘘该吸尘器之奇效(据用过的人说确实不错),该吸尘器售价大概是
    $600,会给你免费试用多久,然后骗你签一份免费试用的合约.拿到你的签名后,他们会单方面把合同的一些条款改掉.不久后,你就等着收他们的上千元的欠单了.

    Tuesday, July 07, 2009

    奇怪的Strange PL/SQL complier bug编译臭虫

    今天终于完成了数据上载的智能修改, 就是说只修改数据有变化的列.

    比如我们的库存表, 有50个列, 52% 的UPDATE仅修改"价格/price"一列.

    可是遇到了一个极其古怪的臭虫, 如下所示, 一个简单的Loop循环, 漏掉了End Loop后面的分号";", 程序居然通过了编译,而且运行时也没有报错, 就是 End Loop 后面的语句被当成注释一样给跳过了. 这样的错误太难debug了, 幸好我充分的运用了code instrument技术, 几乎每一行代码都跟了一句debug (类似log4j), 很快找到了错误所在.
    ...

    run_bulk_update;

    FOR i in 1 .. lt_top_pattern.Count
    Loop
    run_bulk_update_tophit(p_hit_cols => lt_top_pattern(i));
    End Loop ;

    run_bulk_insert;
    save_col_upd_pattern;
    ...

    数据库版本是11.1.0.7.0, SunOS 5.10

    Friday, July 03, 2009

    可以少开会吗 Meetings are indispensable?

    鄙人非常讨厌开会, 不过开会的时间是一个很好的打瞌睡休息时间.

    除非你啥都不想干, 就去开会吧.

    "Meetings are indispensable when you don't want to do anything."
    -- John Kenneth Galbraith

    Meetings (usually) suck. The traditional way of doing business includes company meetings throughout the day, taking an hour or more usually. This can eat up half of your day or more. Add to that individual meetings at lunch, or having drinks, or just a one-on-one in the office and you're meeting more than you re producing.

    If you've sat through a lot of meetings, like I have, you know they're almost always useless. Sure, sometimes they're good, but most of the time they're boring, full of chit-chat or useless information, and really can be accomplished through a simple email or phone call. They're a waste of everyone's time, and worse yet, most people know it. And nothing changes.

    有很多情况可以不用开会, 使用有效的替代方案:

    Instead, learn to accomplish the tasks of a meeting through an email, a quick phone call, a quick and focused IM, an online group chat if necessary. Collaborate through online tools, such as those mentioned above. Keep meetings to a bare minimum. Sure, you still need to socialize with people, and have actual conversations, but boring and useless meetings aren't the best way to do that. If you control your company or division, do yourself and your company a favor by eliminating most of your meetings.

    那么啥时候需要开会呢?

    Only meeting after 3 round trip emails and the goal is still not clear.

    以上摘自公司内部Email.

    Wednesday, June 17, 2009

    Cowichan River Tube Trip 漂流

    一年一度的温哥华岛自然水域漂流又要开始啦! 欢迎留言报名. 跟我的http://twitter.com/mujiang也行.
    在这里,您可以接受加拿大成人仪式, 品尝杂草(weed), 根据个人喜好选择,不存在任何强迫. 嘻嘻.

    上甘岭河(Cowichan River)是我平生见到的最好玩的漂流, 水质纯天然,清澈,水量充足,安全,偶然有一些激流(一共两处),有惊无险,赶紧靠岸就行了,胆大的可以冒进. 去年鄙人躲了,今年一定要尝试一下激流速降.

    Cowichan River Tube Trip

    The Date

    June 28th 2009

    The Float

    Skutz Falls to Marie Canyon - 2hr ride, not including optional time spent beached

    Equipment needed

    1. Tube - If you don't have one, we can buy them at the local tire shop in Duncan for $20 or Zellers in Tillicum Mall has These for $24 (BESTEST TUBE EVEEER!!!!)
    2. Beverages - What ever you feel like drinking (NO GLASS BOTTLES ALLOWED)
    3. Cooler(s) - Communal, if anybody has a big cooler that would be great
    4. Cooler Tube - Gets blown up around the cooler to keep it a float and safe (also acts as an emergency spare)
    5. River Shoes - I use a old pair of runners, some sort of footware is a must(IMO)
    6. Rope - Or bungy to tie tubes to the trucks
    7. Sunscreen!!
    8. What ever else you might want to bring

    The Time Line

    • 9 AM - Meet at ABE
    • 9:30 AM - Leave for Duncan
    • 10:15 AM - Buy Tires and Snacks if wanted
    • 10:30 AM - Buy Beverages and head off
    • 11:00ish AM - Start Tube ride
    • Enter time warp time can not be quantified

    The Tubers

    1. Doug - Have Car will drive
    2. Megan - Has Car if needed
    3. Charlie - Will go if I can find someone take care of my puppy and my shin wound recovered.

    Wednesday, June 10, 2009

    scrum 群殴扭打

    如果你们也在实施敏捷(Agile)软件开发,你就知道scrum是啥意思了, 就是在一个开发小组里面,每人每天早晨简短汇报工作进度.

    每天早上的Scrum都会讲昨天干了什么,今天要干什么. 周一早上,我就说昨天我去沃尔玛采购了幼犬用品,今天继续开发在线库存系统的Database API.

    大家沉默了三秒钟,突然开始集体爆笑. 原来每天的Scrum大伙都是来报到凑个数,没几个人关心别人干了什么.
    就是做和尚撞钟,混个工分.

    Friday, May 29, 2009

    PL/SQL代码可以有多大size limit

    PL/SQL程序块的最大尺寸是67108864 (2**26) DIANA节点, 主要是受shared memory pool的限制.
    PL/SQL程序块包括(Package)包头,包体,独立存储过程,或者匿名程序块. eBay好像是统统使用匿名PL/SQL块.

    但是对于DIANA节点,我们只能获取一个大概的数字,通过查询视图USER_OBJECT_SIZE,PARSED_SIZE列里面是"扁平化的flattened" DIANA节点数:


    SQL> SELECT * FROM user_object_size WHERE name = 'PKG1';

    NAME TYPE SOURCE_SIZE PARSED_SIZE CODE_SIZE ERROR_SIZE
    ----------------------------------------------------------------
    PKG1 PACKAGE 46 165 119 0
    PKG1 PACKAGE BODY 82 0 139 0


    根据Tom和Tim(http://oracle-base.com/)的理想境界,去除Java/C/.Net等前端应用代码里面的所有SELECT/INSERT/UPDATE/DELETE/MERGE,把那些丑陋的SQL扔到九霄云外.
    --不是说Java Developer不会写SQL, 而是他们的强项不在数据库. 模块化,专业分工,高效合作,

    鄙人最近三个月奋发图强,努力工作,大力推行Database API, 消灭Java应用里面的SQL代码,书写了很多PL/SQL代码,有一个接近100K,编译一遍耗时数秒, 就开始担心最大尺寸问题. 结果PARSED_SIZE只有6115, 离67108864(64M)还差点远着哩.

    当然鄙人也在认真学习Agile编程里面的Refactoring代码重构, 尽量将重复使用的代码段抽象成子过程,或者工具包.

    参考:
    Oracle® Database PL/SQL Language Reference
    11g Release 1 (11.1)

    Appendix C PL/SQL Program Limits
    .

    Sunday, May 24, 2009

    Give and Take - IT Club聚会主题征集

    眼看五月份要交白卷了, 转一篇我在维多利亚IT俱乐部的帖子:

    鄙人有一个想法:

    就是大伙罗列出你关心/感兴趣的主题, 和你能够共享/贡献的主题.
    把答案发给木匠,然后鄙人整理筛选,协助GengLi 和 老Shan协调安排, 使以后的聚会更加有针对性.

    好了, 举个例子, 比如 木匠的共享和兴趣:

    贡献
    ----
    *) 给IT老兵的六点建议
    *) 数据库应用开发的糟糕模式与实践 Performance Anti-Patterns in Database-Driven
    Applications
    *) JDBC/.Net应用的高效数据库存取
    *) GTD 时间管理

    *) 自由泳 训练
    *) 露营 + 密林狂奔
    *) 训练小狗
    *) Cowichan lake 轮胎漂流

    感兴趣
    -- -- ---
    如和构建易于线性扩展的Web应用系统架构 (Scale out)
    Agile项目管理
    Agile软件开发流程

    户外露营 + 密林狂奔
    小狗训练
    川菜烹饪
    划船 及 安全


    - MJ

    Thursday, April 30, 2009

    今日好图 流感传染途径How swine flu gets transmitted….

    猪流感是这样传染的:

    Wednesday, April 29, 2009

    SQL Server技术讲座-维多利亚IT Club

    [IT Club] IT 技术讲座--5月16日,星期六,下午2:30
    Address: 2121 Cedar Hill Cross Rd.

    欢迎IT及各界人士前来捧场,结交新朋友,拓展人脉网络, 一定会帮助到您的职业发展和生活琐事.


    以下是来自 John 黄 的介绍:

    ***

    大家好!5月份的讲座由我来说说。 N多个月前讲SQL Replication,弄了60多页,讲得口干舌燥,我想听的人也很辛苦。 这一次我准备了30多页和一些Demo, 希望不要太枯燥,也不要给大家和我带来什么负担。。。。。。

    这一次的话题是SQL Server 的 Locking and Blocking。听这个名字就不像一个有意思的话题, 但是只要牵扯到SQL Server 编程就无法逃避。内容还会涉及到由于Locking and Blocking 所引申出的其他话题,如数据库的设计,编程,性能调整,管理, 和SQL Server 2008 新特性等等,但是不会很多,主要还是集中精力论述Locking and Blocking。我真心邀请Orcle或者其他数据库专家们到场能给我们对应的功能实现。这样能让我们的讲座更加丰富一些。最后如果有时间,我给大家演示SQL Serer Application Locks的应用。

    时间:5月16日,星期六,下午2:30
    地点: UVIC大学旁边那个教堂(谁知道具体地址请补充)

    下面的连接是给大家做参考。与讲座关系不大,但是在讲座中有可能会提及但是不会详尽描述。

    Troubleshooting Performance Problems in SQL Server 2005

    [url]http://www.microsoft.com/technet/prodtechnol/sql/2005/tsprfprb.mspx[/url]

    PSS SQL Server Engine Blog

    [url]http://blogs.msdn.com/psssql/default.aspx[/url]

    Performance Stats Script

    [url]http://blogs.msdn.com/psssql/archive/2007/02/21/sql-server-2005-performance-statistics-script.aspx[/url]

    MSDN Webcast: SQL Server 2008 Advanced Troubleshooting with Extended Events

    [url]http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?culture=en-US&EventID=1032356291&CountryCode=US[/url]

    Bob Beauchemin's Blog: Series in August 2007

    [url]http://www.sqlskills.com/blogs/bobb/default,month,2007-08.aspx[/url]


    KB 271509: INF: How to Monitor SQL Server 2000 Blocking


    黄志勇
    John H
    Microsoft Certified Master -- SQL Server 2008

    Friday, April 24, 2009

    Twitter guide使用指南

    自从上个月注册了一个Twitter用户以后,把个Twitter用的不亦乐乎,基本没有功夫更新博客了.
    木匠的鸟鸣: http://twitter.com/mujiang

    这里就引用一篇Twitter使用指南,给鄙人的博客凑个数.

    TrackBack: http://www.yeeyan.com/articles/view/16551/36190

    利用它来与你的同行取得联系

    除了Twitter外网上有一大堆社区和社交网络型站点,但Twitter仍是我的最爱之一!事实上在Twitter上follow我的人数比我那个设计博客的订阅用户数还要多。

    假设你是一位设计师,我确信总有一些网站和博客是你会定期访问的,我也确信你喜欢通过查看他人的作品和个人履历站点来获得灵感。只需找到 Twitter上的徽章或按钮并follow这些人。很可能发生的情况是他们也会follow你。然后就只是加入或开启一段对话的问题了。

    在Twitter上有许多设计师和网络工作者(当然也有很多自由撰稿人和博客发布者)。前段时间来自Vandelay Design的Steven写了“Twitter上值得follow的50名设计师”这篇文章,而NETTUTS的Jeffrey将“你应该follow 的9位网页设计师”汇编到了这一清单中。我想这些信息对你开始使用Twitter都将有所帮助。

    花些时间去帮助他人

    最近Go Media的工作人员开始通过Twitter来给他人提供设计帮助。我认为这是一个绝妙的点子!这是多么好的一种回馈社会和帮助他人的方法啊!

    还有很多其他设计师也在做相同的事情 - 比方说,当我看见某人在CSS,PHP甚至发布博客方面存在疑问时,我会尝试着给出最佳答案!当我有疑问时我知道有些人也会尽量帮助我。如果我们都能互相学习那将是一种双赢的局面。

    添加链接到你的个人简历式站点或博客

    Twitter当然不是一个像Behance或Carbonmade那种能上传以前作品的网站,但你可以添加链接到你的个人站点并发布关于你目前的设计项目的信息并邀请别人对你的设计作品做出评价。

    你可以在侧栏上或你发布的信息中添加你个人站点的链接。当然不是每个人都会点开你的个人站点,但那些点开的人将更有可能会联系你并有可能雇佣你因为他们已经在Twitter“听说过”你了。

    谈论一些和你所在行业相关的话题

    你是否读到了一篇和自由职业、设计、写作或博客相关的好文章?为什么不谈论它并让你的朋友知道你喜欢这篇文章呢?IE6下PNG的兼容问题有了新的解决方法?嘿,我想知道相关的信息!

    如果我在某个时候需要将部分工作外包,我也许会联系Twitter上的那个人,因为他以前帮助过我,他很友善,我也把他视为专家,因为看起来他对自己所在的行业很了解。

    回复他人的信息

    我喜欢收到潜在客户发来的邮件,说他们在Twitter上发现了我并且需要为某个项目寻找一名网页设计师。我认为这真的很棒,因为实际上我并没有在Twitter花太多时间,我只不过是时不时地在上面发布些信息。

    有些人会很直接地给你发信息来询问你是否有时间替他工作。你要确保阅读并回复这些信息!我知道,你已经需要查看电子邮件,也许你并不想在Twitter回复更多的人了,但如果回复这些信息能给你带来一份很酷的设计任务或很棒的薪酬呢?这种好事情已经多次在我身上发生了!

    你也来分享下经验吧

    你是如何利用Twitter来寻找客户的?你是把Twitter视为一个非常酷的营销和客户网络拓展工具还是说纯粹只是把它作为一个消磨时间的站点呢?曾有潜在客户通过Twitter联系过你么?你接到那个项目了么?请利用留言系统和大家分享下你的使用技巧以及在Twitter上发生的成功的案例。:)

    推荐
    ---
    http://www.yeeyan.com/groups/show/twitter 译言twitter小组

    Monday, April 13, 2009

    电影推荐 The god must be crazy

    复活节长周末,看完了电影[The god must be crazy]的一集和二集. 觉得该强烈推荐给各位.
    虽然是九十年代初拍摄的,故事以情节取胜,紧凑,幽默,而且富有教育意义.
    如果您觉得没有[疯狂的石头]好看,鄙人按当地的平均小时工资偿还您,大概三个小时. 瞧瞧,到底是研究数据库的,这么精确的数字和逻辑.

    故事是这样的,在非洲大陆内部依然依然生活着一群原始部落族群 bushman,他们有着极强的自然适应能力,轻松的适应了非洲的干旱季节,而不是现代化人类的破坏能力,让自然适应人.
    电影讲述了一群现代人闯入bushman人的生活,以及后面引发的一系列有趣的故事.

    也暗示的讽刺了人对不能理解事物的盲目崇拜,如第一集里面的一个玻璃可乐瓶子.

    一群现代人的复杂矛盾,却被原始人用极其简单的方法给解决了.

    鄙人无法道出所有精髓,您自己慢慢欣赏吧.

    Friday, April 10, 2009

    swim in wild lake 畅游天然湖泊

    过了下个长周末,五月份的维多利亚日,就正式宣告进入夏季,也是维多利亚的天堂季节和旅游旺季,世界各地人民呼呼涌来.

    为了帮助新来的喜欢游泳的华人少走弯路,鄙人在这里介绍一下维多利亚和温哥华的适合游泳的天然湖泊.
    淡水湖泊里面游泳肯定比游泳池里面舒服,也比海水温暖,不用穿保暖泳衣.

    维多利亚:

    1) Durrance lake

    View Larger Map

    2) Matheson lake

    View Larger Map

    维多利亚的名气大,但是不适合游泳的湖泊:

    1) Elk lake and Beaver lake
    2) Thetis lake

    因为人多,把冷水都给搅上来了,而且脏.

    温哥华

    1) Buntzen lake

    View Larger Map

    2) 可能是Rice lake, 过两天找温哥华的同学确认一下.

    View Larger Map



    Enjoy the swimming in natural wild lake !

    Thursday, April 09, 2009

    Easter day复活节

    在加拿大生活,基本上每个月有一个公众假日.

    明天是美好星期五(Good Friday),下周一是复活节(Easter Day),两个公众假日连在了一起, 还没想好咋玩呢.

    我在加拿大度过的第一个复活节是在2006年四月,四月是加拿大西海岸的雨季,当时下着连阴雨,组织了本地一帮朋友开车4小时去了Tofino,一个著名的冲浪胜地,并且以广阔的海滩著称,最大的一个海滩长11公里. Tofino是加拿大国家公园 Pacific rim的一部分, 我们都不会冲浪,就穿越森林,溜海滩,观巨浪.
    "West Coast lifestyle Victoria" 此句经常出现在各种地处维多利亚的公司的招聘广告上,用来吸引外地人士, 听着是很惬意.

    我是大菠萝迷(Diablo II), 听说3.0 在三月发行了,明天去FutureShop看看有没有到货.

    今天在牙医诊所修理了最后两颗牙冠, 如果您刚从中国国内过来,这里牙医服务会让你倍感震撼 (服务质量过于上乘),下文详解. 牙医给我讲了复活节的缩减版故事: 耶稣出生了,走了,又来了,故事完了.

    祝各位节日快乐,赶紧出门享受好天气, 今年四月份没有下雨,多难得.
    ...

    长滩.
    ...

    长滩北段.
    .

    林中木板路(board walk)
    .

    太平洋西海岸原始森林.
    .

    Monday, April 06, 2009

    Soccer fans needed温哥华岛IT公司足球联赛


    温哥华岛高科技公司的足球联赛在沉寂两年后又开始啦. 各位维多利亚的足球爱好者,赶紧出来,享受阳光,驰骋绿茵场.


    Your very own AbeBooks soccer players have 2 upcoming matches against our friends at Genologics…

    AbeBooks VS. GenoLogics

    Come out and enjoy the weather and support your co-workers for these 2 fun games.

    Game 1

    When: Wednesday, April 8th 2009

    Time: 11:45am kickoff

    Where: Vancouver Island Tech Park turf – Layritz
    behind Camosun College Interurban Campus, accessible from Interurban Rd and West Saanich Rd


    Game 2

    When: Wednesday, April 15th 2009

    Time: 12:15pm kickoff

    Where: Finlayson turfTopaz Park, Blanshard St + Finlayson St.



    周三中午占用上班时间踢球是我们公司的传统,差不多10年了.
    .

    Sunday, April 05, 2009

    Talk to COO 合理化建议和沟通

    2009年初,我们公司开始了重新设计和开发库存管理系统,可以用革命(Revolution)来形容,有点背离了Agile提倡的进化(Evolution)主旋律.

    基调比较简单:

    1) 改变Slow-by-slow(row-by-row)慢之又慢的数据处理模式, 启用(bulk loading)打包成批处理.
    2) 合理denormalization,减少不必要的表连接.
    3) BASE第一步: Function split功能拆分 和 Asynchronous process 异步处理.
    异步处理,必然引出数据复制和消息系统, 我们的消息系统数据量一大,就会僵死. 我选择了数据库staging table(数据驿站)来缓存修改的数据,对于staging堆栈表,根据简单处理过的时间键,做列表分区,做到冗余数据的最高效利用 (我一向认为队列消息属于被复制的冗余数据).
    关于设计时间相关的历史数据模型,数据建模宝典(Data Modeling Essentials - Third Edition)推荐了两种方法,一种是Audit Trail(记录数据偏移,从起点累积),一种是Snapshot(历史镜像),我在不同场景都有采用,以后找机会做细节示范.

    有一个业务逻辑的改革遇到了较大的阻力,最后决定直接找COO商议,结果还是很理想的,清除了数据处理设计的最后一道障碍.
    跟产品经理和项目经理谈了很多次,结果是"多一事不如少一事,事不关己,高高挂起",这伙人才懒得从公司盈利的高度考虑问题,所以要转向那些能做决定,能从大局着眼的人士.

    下面简单介绍一下这个高投入低回报的业务功能:

    就是维护书商的产品分类,上传图书数据的时候,捎带检查图书分类表. 每行图书数据里面,包含了图书分类,一个或者多个,如果是新的分类,就在书商图书分类表里增加一行.
    如果删除了某个图书分类包含的所有书籍,就在书商图书分类表里删除掉这个图书分类.

    经常是上传几百万本图书信息,却对书商图书分类未动毫毛,白白浪费掉系统处理能量 来做无谓的检查.

    为啥雅虎没落了,谷歌兴旺了.因为Yahoo在做分类目录,Google再做搜索.
    这个年代,很少有人再通过分类目录一层一层的下钻去找到感兴趣的内容了,一个关键字查询,结果根据相关性排序,一下找到结果.


    有兴趣的产品经理,数据处理设计师和开发人员, 可以看看这个功能的链接:
    http://www.abebooks.com/servlet/BooksBrowse?vendorclientid=65646&page=CLIENT

    Tuesday, March 31, 2009

    另一种方法显示ROWID扩充信息-table function

    TrackBack: http://www.ningoo.net/html/2009/how_to_get_extent_id_from_rowid.html

    NinGoo的把常用工具打包进工具箱的方法很好.
    然而木匠天生缺乏分类和组织能力,一路坚持学习,持续遗忘,自身却没有留下啥积累;好比猴子搬苞谷,抱在怀里的玉米棒永远也不会增多,郁闷.
    所以鄙人决定依靠GTD方法,每周总结学到的新知识,然后放进自己的便携工具箱.

    好了,鉴于本人不喜欢dbms_output.put_line,索性把NinGoo的RowID工具改造成了Table Function.
    通过简单的查询,可以在任何地方使用.

    后面附的PL/SQL Package源代码,包含了许多PL/SQL编程优秀实践,将来找机会慢慢展开来讲.

    用法:

    SQL> select * from table(UTILITY.tb_obj.rowid_info('AAARUtAAEAAABm2AAA'));

    COLUMN_VALUE
    --------------------------------------------------------------------------------
    rowid: AAARUtAAEAAABm2AAA
    file_id: 4
    block_id: 6582
    data_object_id: 70957
    owner: INVDB
    object_name: BOOK_UPLOAD_LOG
    extent_id: 0

    7 rows selected.

    tb_ 是toolbox的缩写.



    工具用户需要的对象权限:

    grant select on dba_objects to utility;
    grant select on dba_extents to utility;

    源代码:

    注意: 如果你还没有安装捕获错误工具包u$err和(instrument)代码跟踪包debug, 可以先用备注屏蔽掉相关的代码.


    CREATE OR REPLACE PACKAGE UTILITY.tb_obj
    /*
    | Copyright Information Here
    |
    | File name:
    |
    | Overview:
    |
    | Author(s):
    |
    | Modification History:
    | Date Who What
    |
    */
    IS

    TYPE print_tab IS TABLE OF varchar2(200);

    FUNCTION rowid_info (p_rowid in varchar2) return print_tab PIPELINED DETERMINISTIC;
    PROCEDURE subprogram_name;

    END tb_obj;
    /

    CREATE OR REPLACE PACKAGE BODY UTILITY.tb_obj
    /*
    | Copyright Information Here
    |
    | File name:
    |
    | Overview:
    Tool box to get object information.

    | Author(s):
    |
    | Modification History:
    | Date Who What
    31-Mar-2009 Charlie (Yi): Create the package.

    It meets user requirements
    It is maintainable
    It runs fast enough to minimize user frustration

    **) Pl/SQL development workflow, Four steps of preparing an application

    - Validate program requirements
    # ask lots of questions
    # what users ask for is not always the easiest way to solve a problem
    # consider other approaches, include business processes and programming algorithms
    - Implement header of the program
    # good name for the program, accurately represent the purpose of the program
    # inputs and outputs
    # overload sub-procedure ?
    - Define the test cases
    # Verify it works
    # how will I know when I am done with this program
    - Build test code

    |
    |
    */
    IS
    PROCEDURE initialize_pkg
    IS
    BEGIN
    DBMS_APPLICATION_INFO.SET_MODULE( 'tb_obj','init' );
    END initialize_pkg;

    FUNCTION rowid_info (p_rowid in varchar2)
    return print_tab PIPELINED DETERMINISTIC
    /*
    | Copyright Information Here
    |
    | File name:
    |
    | Overview: Display extended rowid information.
    |
    | Author(s): Charlie MuJiang
    |
    | Modification History:
    | Date Who What
    31-Mar-2009 Charlie (Yi): Create the function.

    Privilege:

    grant select on dba_objects to utility;
    grant select on dba_extents to utility;

    Call example:

    SQL> select * from table(UTILITY.tb_obj.rowid_info('AAARUtAAEAAABm2AAA'));

    COLUMN_VALUE
    --------------------------------------------------------------------------------
    rowid: AAARUtAAEAAABm2AAA
    file_id: 4
    block_id: 6582
    data_object_id: 70957
    owner: INVDB
    object_name: BOOK_UPLOAD_LOG
    extent_id: 0

    7 rows selected.

    |
    */
    IS

    ln_block_id number;
    ln_file_id number;
    ln_object_id number;
    ln_extent_id number;
    ls_object_name varchar2(30);
    ls_owner varchar2(30);

    PROCEDURE initialize
    IS
    BEGIN
    DBMS_APPLICATION_INFO.SET_ACTION( 'rowid_info' );
    END initialize;

    PROCEDURE cleanup
    IS
    BEGIN
    DBMS_APPLICATION_INFO.SET_MODULE(Null,Null);
    END cleanup;
    BEGIN
    initialize;
    /*
    Main body of program
    */
    debug.f('start by user %s', user);

    select dbms_rowid.ROWID_BLOCK_NUMBER(p_rowid),
    dbms_rowid.ROWID_RELATIVE_FNO(p_rowid),
    dbms_rowid.ROWID_OBJECT(p_rowid)
    into ln_block_id,ln_file_id,ln_object_id
    from dual;

    select owner,object_name
    into ls_owner,ls_object_name
    from dba_objects
    where data_object_id=ln_object_id;

    PIPE ROW(' rowid: '||p_rowid);
    PIPE ROW(' file_id: '||ln_file_id);
    PIPE ROW(' block_id: '||ln_block_id);
    PIPE ROW('data_object_id: '||ln_object_id);

    for c in (
    select extent_id,
    owner, segment_name,partition_name, segment_type,tablespace_name
    from dba_extents
    where
    owner=ls_owner and
    segment_name=ls_object_name and
    file_id=ln_file_id and
    ln_block_id between block_id and block_id + blocks - 1
    )
    loop
    PIPE ROW(' owner: '||c.owner);
    PIPE ROW(' object_name: '||c.segment_name);
    PIPE ROW('partition_name: '||c.partition_name);
    PIPE ROW(' segment_type: '||c.segment_type);
    PIPE ROW(' tbs_name: '||c.tablespace_name);
    PIPE ROW(' extent_id: '||c.extent_id);
    end loop;

    debug.f('process %s rows', SQL%RowCount);

    cleanup;
    EXCEPTION
    WHEN NO_DATA_NEEDED THEN
    cleanup;
    return;
    WHEN OTHERS
    THEN
    /* Don't forget to clean up here, too! */
    cleanup;

    /* Standard error logging mechanism */
    u$err.err;
    RollBack;
    raise;
    END rowid_info;

    PROCEDURE subprogram_name
    /*
    | Copyright Information Here
    |
    | File name:
    |
    | Overview:
    |
    | Author(s):
    |
    | Modification History:
    | Date Who What
    |
    */
    IS
    PROCEDURE initialize
    IS
    BEGIN
    DBMS_APPLICATION_INFO.SET_ACTION( 'subprogram_name' );
    END initialize;

    PROCEDURE cleanup
    IS
    BEGIN
    DBMS_APPLICATION_INFO.SET_MODULE(Null,Null);
    END cleanup;
    BEGIN
    initialize;
    /*
    Main body of program
    */
    debug.f('update %s rows', SQL%RowCount);

    cleanup;
    EXCEPTION
    WHEN OTHERS
    THEN
    /* Don't forget to clean up here, too! */
    cleanup;

    /* Standard error logging mechanism */
    u$err.err;
    --RollBack;
    raise;
    END subprogram_name;

    BEGIN
    initialize_pkg;
    END tb_obj;
    /


    deprecated ROWID hint 废弃的行标识提示

    在Oracle 10g以后,RowID 这个SQL提示就被废弃了.搜索Google也找不到替代方案.
    在一些应用场景里面利用RowID存取路径,还是很有帮助的. 比如回改, 就是在用户界面显示用户感兴趣的数据,数据被修改以后,再更新回数据库.

    那么怎样强制优化器使用存取路径TABLE ACCESS BY ROWID呢? 我暂时发现了两种方法:

    1) 使用No_Index SQL提示
    2) 使用表达式或者运算符禁止索引扫描.

    关于具体的搭建测试环境和演示, 参考文章NO_INDEX hint and deprecated ROWID hint.

    测试结果
    --
    当查询优化器采用TABLE ACCESS BY USER ROWID存取路径时,我们发现逻辑读(Buffer列)由2降到1.

    Saturday, March 28, 2009

    Earth Hour 关灯一小时

    在维多利亚,地球日被提前到了今天,星期六.

    各种人物提出了多种方式度过 "地球一小时".
    比如看电视,点蜡烛.这不还是继续浪费能源吗? 穿了个马甲而已.

    我有两个计划,8:30pm游泳完以后,直接上床睡觉. 或者在黑暗中静思冥想,想想家庭生活有哪些项目可以改进,修马桶,给外墙刷油漆,屋顶换瓦, 想想工作中的哪些数据处理逻辑可以改进,提高系统的扩展性,可靠性,应用各种11g的新特性.

    去野外看星星 也不错,可惜维多利亚阴天下雨; 维多利亚(BC省西海岸)有个体育活动,夜晚健行(night hiking),可以去中国海滩(China beach) 欢德福卡野径(trail),我的同事老奔驰等人去过好几次了,下次跟上他们;
    或者给多年没有联系的老朋友打电话.


    Enjoy sitting in the dark!

    Thank you for your support!

    参考:
    --
    <http://www.earthhour.org/home/> Saturday March 28th @ 8:30pm!

    What is it?
    Switch off your lights for one hour and send a message to the world.

    Reality check:
    Earth Hour is a symbolic event. Turning off our lights for an hour won’t stop climate change but it does demonstrate that our individual action is important and adds up to make a big difference.

    Results & photos from 2008
    What’s happening in Vancouver
    Here are some simple tips to make Earth Hour a success:
    1. Turn off all non-essential lights on Saturday, March 28 at 8:30 pm.
    2. Encourage family, friends and local businesses to participate.
    3. Sign-up (AbeBooks.com already has!)
    10% Off @ WWF Store
    As a thank you for signing up:
    Enjoy 10%* off at the WWF Store where you will find unique and sustainable products. Visit wwfstore.ca and enter promo code EH2009.
    So let’s get some more businesses to sign up & turn off those lights on Saturday night!


    维多利亚大学(UVic)的图书馆.

    Monday, March 09, 2009

    Troubleshooting Oracle Performance下载文件更新

    TrackBack: http://antognini.ch/2009/03/troubleshooting-oracle-performance-downloadable-files/

    像我一样的TOP书迷们注意了, TOP脚本文件更新了, 这里是下载地址链接: http://antognini.ch/top/downloadable-files/.

    供参考: 我的学习方法是这样的,先读完整本书(每周100页), 然后到附录A, 顺着每一章的脚本目录(page 552~562) ,做练习,依靠实践加深印象,巩固记忆.不然,过不了两天,学到的知识点就会忘掉大半.


    加拿大西海岸三月份又下雪了,维多利亚市也不例外,预计降雪量是5厘米.
    气温: -4°C~2°C. 注意保暖,行车注意安全.
    今天又开始夏时制了,少睡一个小时, 困哉.
    .

    Thursday, March 05, 2009

    Index space management索引空间管理

    这回咱先问个问题, 啥时候数据库自动回收索引的空闲空间?

    这里是我昨天学到的索引空间管理知识:

    一个UPDATE语句,对索引来说,就是一个DELETE和一个INSERT,删掉旧键值,插入新键值.
    如果是唯一索引(unique index),删掉旧键值的空槽位可以被同一个事务里面接下来的操作重用.
    如果不是唯一索引(unique index),删掉旧键值的空槽位,只有在事务提交以后,才可以被重用.
    索引段上,只有INSERT和DELETE操作.

    如果删除了大部分数据,再没有新的数据插入,用alter index coalesce;释放可重用的空间. coalesce应该不会锁住表,我需要进一步确认.

    参考
    ----
    Oracle® Database SQL Language Reference
    11g Release 1 (11.1)

    ALTER INDEX ... SHRINK SPACE COMPACT 等价于 ALTER INDEX ... COALESCE.

    How does insert and delete use space regarding to indexes?

    查看索引空间: SQL>exec segment_space_a(P_SEGNAME=>'INDEX_Name',p_type=>'INDEX');

    Skip unchanged columns when UPDATE时,如何跳过没有改动的列

    现在很难在 AskTom 提新的问题了.
    只好找个类似的问题,然后跟贴评论,问一个新问题. 但是一定要和原帖主要问题紧密相关,不然,Tom兄会毫不留情的删掉你的评论. 嘻嘻.

    好了,我的问题是:
    http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1524420700346152252

    先简述一下业务逻辑, 我们的业务模式类似eBay, B2C, 我们的主要商品是图书, table book, 书商每天上传文件更新他们的库存.
    书商不管三七二十一,送上所有图书的信息,无论是要改动的属性,还是不需要改动的属性.
    大部分情况只是改动一两个短列,比如数量,单价,ISBN;少部分情况修改长列,比如书名,作者,出版社,图书简介...等等.
    这就产生了一个重复(冗余)修改的问题,会浪费PGA内存,产生十倍之多的Redo/Undo.

    如何跳过这些没有修改的列呢?

    今天耗费了一整天跟Tom兄切磋.

    我设计的解决方案都在上面链接里面了. 还没有最后成形,处在演变进化(evolution)当中.

    对了, 我的署名是Charlie MuJiang from Victoria, BC Canada, AskTom不能存中文,所以用拼音MuJiang.


    再来一个维多利亚的BC省议会大楼,2005年我刚到维多利亚时,住的公寓走到议会大楼不到十分钟,每周过来散步数次.

    Monday, March 02, 2009

    PATH in 10053 Trace 的存取路径代码和解释

    越来越多的DBA和Developer开始研究CBO相关的10053 Trace.
    可以参考老刘(Lewis)的Cost Based Oracle Fundamentals第14章 - The 10053 Trace File.

    Oracle 11g之前,PATH 用代码表示,阅读起来极不方便, 因此木匠干脆罗列出来有关表扫描的Access PATH代码含义:

    # PATH in 10053 trace
    -- table access path


    0 parallel hint
    1 no access path spec
    2 table scan
    3 index unique
    4 index range
    5 index and-equal
    6 order by using an index
    7 open cluster
    8 hash cluster
    9 rowid lookup
    10 range scan backwards
    11 rowid range scan
    12 driving_site hint
    14 cache hint
    15 nocache hint
    16 partitions hint
    17 nopartitions hint
    18 anti-join
    19 index rowid range scan
    20 bitmap index
    21 parallel_index hint
    22 noparallel_index hint
    23 index fast full scan
    24 swap inputs to join
    25 fact table
    26 not a fact table
    27 merge of this view
    28 do not push join predicate into this view
    29 push join predicate into this view
    30 no_merge of this view
    31 semi-join

    Thursday, February 26, 2009

    虚拟列分区可能返回错误结果Virtual Column-Based Partition-Chris译客

    TrackBack: http://antognini.ch/2009/02/virtual-column-based-partitioning-might-lead-to-wrong-results/

    Oracle 11g(11.1.0.6 和 11.1.0.7),在虚拟列分区表里面,有许多列,当虚拟列或者源数据列排在后面时,修改数据和查询数据会产生意想不到的错误结果.
    出错的情况是随机的, 比如数据被放进了错误的分区, 或者查询数据,返回错误结果

    这里是测试用例:

    SQL>
    drop TABLE t;
    CREATE TABLE t (
    d1 NUMBER,
    d2 NUMBER,
    d3 NUMBER,
    d4 NUMBER,
    d5 NUMBER,
    d6 NUMBER,
    d7 NUMBER,
    n1 NUMBER,
    n2 AS (CASE n1 WHEN 1 THEN 1 WHEN 2 THEN 2 ELSE 0 END) VIRTUAL
    )
    PARTITION BY LIST (n2) (
    PARTITION zero VALUES (0),
    PARTITION one VALUES (1),
    PARTITION two VALUES (2)
    )
    ENABLE ROW MOVEMENT;

    INSERT INTO t (n1) VALUES (1);
    commit;
    UPDATE t SET n1 = 3;
    commit;

    SELECT rowid, n1, n2 FROM t PARTITION (zero);
    SELECT rowid, n1, n2 FROM t PARTITION (one);

    数据被放进了错误的分区.
    SQL> SELECT rowid, n1, n2 FROM t PARTITION (one);

    ROWID N1 N2
    ------------------ ---------- ----------
    AAAd7XAAEAAABXCAAA 3 0


    查询数据,返回错误结果
    SQL> SELECT rowid, n1, n2 FROM t WHERE n2 = 1;

    ROWID N1 N2
    ------------------ ---------- ----------
    AAAd7XAAEAAABXCAAA 3 0



    昨天在内港Delta酒店参加领导能力培训,南望华盛顿州,奥林匹亚山.

    Tuesday, February 24, 2009

    SQL跟踪文件里面哈希值的变化 - 启动TOP作者博客翻译

    TrackBack: http://antognini.ch/2009/01/execution-plan-hash-value-in-sql-trace-files/

    在征得了Christian Antognini的同意后, 木匠准备近乎实时的(near real-time)跟踪报道他的最新研究成果. 附带的好处是极大的增加了我的博客出版频率,完成年初定的每周一篇技术贴的目标.

    在我理解有误的地方,欢迎各位DBA同仁给予指正. 木匠没有出钱买断Christian Antognini博客的中文翻译版权, 所以您也可以同时翻译相同的文章, 不过, 请一定指明原文的TrackBack.

    我只会讲每篇的主旨和总结. 从2009年一月开始,

    第一篇: SQL跟踪文件里面哈希值的变化(Execution Plan Hash Value in SQL Trace Files)

    在Oracle 11.1.0.7版本, 在PARSE, EXEC 和FETCH这些行里边, 新出现了一个"plh"属性, 我猜是 Plan Hash 的缩写. plh是为了配合ACS(Adaptive cursor sharing), ACS就是根据不同的绑定变量(binding variable)产生不同的最优执行计划.

    参见 http://antognini.ch/2008/12/automatic-evolution-of-sql-plan-baselines/ 第7个木匠的注释.

    这里是一个SQL trace file样例,

    SELECT count(pad) FROM t WHERE id < :id

    PARSE #13:c=0,e=0,p=0,cr=0,cu=0, mis=0,r=0,dep=0,og=1,plh=4270555908
    EXEC #13:c=0,e=0,p=0,cr=0,cu=0, mis=1,r=0,dep=0,og=1,plh=2966233522

    当变量取值发生变化后,优化器决定选择一个不同的执行计划. 我们看到mis=1和plh=2966233522 出现在EXEC(执行)这一行,而且的plh数值不同于PARSE一行plh的数值 SQL优化器对游标(cursor)做了一个硬解析(hard parse), 然而PARSE部分没有硬解析.

    由此改变了我们的传统认识, 不但PARSE部分会hard parse,而且EXEC部分也会hard parse.


    去阿拉斯加的邮轮,在维多利亚Ogden Point港停靠.

    Friday, February 20, 2009

    US vs Canada一位大姐眼中的美国和加拿大

    导读: 已经有很多文章比较了美国和加拿大的华人生活.

    这篇就比较片面, 居住在加拿大的木匠不免要运用一下精神胜利法,分析一下她的论点.

    1. 由于她在加拿大年景差,做了4年家庭主妇,潜意识里对加拿大产生了怨恨.
    - 如果2001~2004年她住在美国, 2005~2009年她住在加拿大,肯定有不一样的感受.
    2. 由于接触面窄,没能对加拿大华人有一个全面的了解.
    3. 我们公司华人同事的年薪均高于美国相同职位.
    4. 美国枪击案件远远超过加拿大, 安全吗?
    5. 加拿大人朴实,憨厚,资源性国家,生活节奏缓慢,惬意舒坦,平均寿命长,生活满意度高.
    6. 美国华人会对加拿大华人提出这样一些(极其片面)问题:
    • 来美国玩吧,我们这里有唐人街.
    • 你们(比如多伦多)出门上街,是不是能撞上北极熊?
    7. 大陆华人很难直接移民美国,除了走留学这条弯路,没别的办法. 所以好多华人学了洋人没兴趣的偏门专业,多数肯定不是自愿的.
    8. 加拿大的社会福利,医疗保障优于美国.
    9. 加拿大中产阶级人群收入低,生活成本高,税收高.
    - 加拿大老百姓平均收入高于美国; 不能老拿东海岸纽约/波士顿和西海岸硅谷湾区说事.
    10. 加拿大最低时薪高于美国.
    11. 移民加拿大后进出自由,五年内住满两年就可以了; 可是在美国, 留学(F1)和工作(H1b)后, 轻易不敢回中国, 不然要丢身份(证)的, 由此引发了不少和父母生离死别的悲惨故事,改天再议.

    总之,若以居住在月球/火星的华人来看的话, 不管搬到美国还是加拿大,都是想过上好生活,等中国富裕强大了,到美国/加拿大只需要落地签证,就不会有那么多华人削尖了脑袋移民美国/加拿大了. 祝福我们的祖国吧.

    我们都是这个时代的特殊产物,以后历史再不会重演,留学美国或者技术移民加拿大只会成为一个历史名词.

    ...未完待续...



    正文

    -- -- -
    http://news.wenxuecity.com/messages/200902/news-gb2312-797788.html

    本人从中国出来后曾先后在加拿大几个不同的城市共居住了四年,然后移居美国中部近四年,对新移民在二个不同国家作了一些比较,体会如下:

      1. 年龄

      一般来说,加拿大移民的年龄偏小一些,多数是90年代后期移民出来的人,年龄在30--40岁左右。而美国移民则年龄偏大一些,多数是80年代后期及90年代前期出来的,这批人年龄多已40出头了。当然也有一批幸运者,他们在30岁前就直奔美国,在这里30而立了。

      2. 技术实力

       我相信在美国的移民都会感到他们自己是各自公司或部门技术上的骨干,事实也基本如此。因为到美国的人,多数是走读书这条路的,尤其是早期出来的人,他们 本身就是国内出类拔萃的人物,到美国后艰苦奋斗,几年后几乎都持有博士学位,最起码也拿个硕士,即便是女的,博士,硕士也比比皆是。他们凭着挣来的学位, 进入各自的公司或大学,凭着他们的聪明以及读书几年闯过的各种关卡,尤其是语言关,大多能够顺利地胜任自己的高薪工作。

      回头看一 看加拿大,在加国的一部分早期留学生有着和美国移民相似的经历,他们的生活也还自在。但大批新移民却没有踏上读博这条“苦船”,他们偏于急功近利,他们比 “长辈”有较多的选择,他们可以利用国内的经验直接进入国外公司。也有迫于生计,选取短,平,快的学业,快速找到了工作,但他们多数难以进入技术“上层 ”,即便工作几年后,也较难得到像美国移民们苦熬几年学业出来的高薪。

      3. 居住

      居住环境的好坏直接反映 出移民的经济实力。由于美国移民的技术实力较强,相应他们的收入便偏高些。我周围的朋友,只要夫妇一方博士毕业,年薪基本是八万以上,这已步入当地中产以 上阶层,更不用说双方都是高学位了。我居住的这个城市中国人不少,主要集中在几个大公司和学校工作。他们几乎都是“一栋房子二部车”一族了。他们大多居住 条件不错,生活比较稳定。拿我本人来说,我的居住环境在我的一批朋友中是属中等的。因为我只持有国内本科文凭,在加拿大时属 “急功近利”一族,没有读学位,来美后由于身份问题,不能工作,后来身份解决了,有了工作,但终究薪水不高,主要靠先生的收入买房。我们量力而行,在较好 的学区内建了一栋不到30万的房屋。二年多前,我们搬进了在新开发小区内的新居。我们小区内住了几十户中国人,个个都对自己的居住条件满意,大家觉得来美 国生活,衣,食,住,行,唯有这“住”还使我们对这里有些留恋,不思“海归”。正当我为自己五个睡房的住宅陶醉时,我的好朋友(她十年前移民来美国)在离 我不远的富人区,一举建造了价值130万的住宅。这在美国中部地区就算“豪宅”了,绝对进入当地居住的上层。

      再看看加拿大的朋 友,他们多数还没有买房,因为有一部分人想往美国走,即使买了房,他们的居住条件也相对小一些。我曾在加拿大的一个小城镇居住过,虽然小城镇的房价偏低, 但也不表示人们住大房子。我的朋友,即使是我公司的老板也居住着比我现在还小的房子。而对于多伦多周围的住房,那就更小一些了。我去过一个朋友在离多伦多 一小时远的城市买的一栋新房,新房在一片新开发区内,给人的感觉是房子比较密集,房子也比较小。

      4. 心境

       美国的移民,由于他们早年的奋斗,现在多数已是苦尽甘来。他们大多已解决身份,生活平静,安居乐业。他们也很忙,忙于工作,忙于培养小孩。闲暇时考虑室 内,室外的改造。夏天更可以看见他们忙碌于前院后院的身影。他们经常聚在一起吃饭,打牌。他们更看国内的新连续剧,新电影,好多国内朋友都没听过名字的电 视剧,在这里已经传得热火朝天了。当然他们也不乏各式各样的烦恼,如何使自己的生活更上一层楼, 如何使自己的奋斗更具价值,“海归”,办公司,小孩读私校, ……… 他们有很多想法。

      而加拿大的移民,则显得要浮躁些。因为他 们当中很多人还有美国梦。他们觉得凭着在加拿大的工作经验,完全有能力在美国得到更好的发展。加拿大的冬天让他们不愿意在那里扎根,他们的目标是美国。而 美国的移民政策难度比加拿大难,这些身份问题会让他们感到心烦。另外,加拿大移民比较愿意了解美国移民的信息,而美国移民对加拿大移民的情形却不太关心。 就像在美国电视里很难见到有关加拿大的新闻一样,他们显得对加拿大比较漠然。加国移民的心情没有那么靚,因为他们还在爬坡,还有很多愿望等着他们去实现。

    Thursday, February 19, 2009

    维多利亚IT Club新技术共享-云计算(cloud晕)

    IT Club新技术共享-云计算(晕)

    给 "开吻" 做个广告,吆喝一声.

    时间是Feb21, 2:30 pm 星期六.
    地址: EBC church second floor meeting room, 2121 Cedar Hill Cross Rd.
    主讲: 开吻.

    Victoria IT Club hold free IT Seminars on 3rd Saturday 2:30pm every month

    这个交流虽然涉及技术层面, 但是我还是打算尽量让不是Developer的一般用户和非IT人士也能分享到.
    因此我这次介绍的内容60%都是非技术的, 主要的目的就是让普通的用户也可以充分利用最新的软件技术在自己的工作生活中, 提高工作效率和生活质量, 降低在IT方面的费用成本. 我相信所有来听的人都会发现原来还有这么方便和廉价(甚至免费)的方法可以让原本花费时间和金钱的工作变得如此容易.
    对于开发者而言, 我也会分享我自己的想法, 关于如何把握这个新技术的方向, 让自己重新屹立在风头浪尖.

    欢迎大家都来, 同时也更欢迎大家把自己的朋友也邀请来. 即使不是IT认识, 也一定会有收获的. 如果哪位在本周日的主日聚会时宣布邀请大家都来就更好了.
    附带的链接是我正在起草的提纲. 还在不停的更改中. 不用说, 限于本人的英文水平, 这个交流会是中文的
    http://docs.google.com/Presentation?id=dws8n3c_ 98chss92tg&invite=hkv7qgr

    当单老板邀请我来讲一下的时候, 说的是讲座, 一下子把我给吓住了. 我的水平肯定是不足以去做一个讲座的, 但是换个名头我就踏实多了, 叫做新技术学习交流与共享. 因为我自己也是正在初学的阶段, 如果大家也有同样的兴趣在这些新玩意儿, 或者自己也在学习过程中, 我很乐意邀请大家一起参加兴趣学习和讨论交流共享. 如果你已经研究了一段时间, 无论好似不是大师级别, 也请光临, 拿出你的玉, 把我这块砖给换了. 根据我的经验, 手里有玉的大师真人一般都是要等拿砖的小丑跳出来才肯露面.

    "开吻"分享的内容主要是"开吻"对于新一代操作系统和网络应用程序设计的理解和预测. 主要的技术点集中在
    RIA Rich Internet Application, 以Silverlight为例.
    Cloud Computing, 与计算, 以Windows Azure为例.
    DotNET 3.5, 以WPF和LINQ为主
    Linux 以Ubuntu为例.

    这个是一个学习分享体会, 顶多算一个走马观花式的技术介绍, 我的目的是提起大家对这些新一代或者未来一代的技术的兴趣, 和一些基本概念, 至少弄个名词清楚. 如果大家有兴趣, 我们以后可以再开专题讨论, 到时候拿着玉的可要真的出山了.

    Kevin Zhang

    读书笔记Oracle Database 10g Performance Tuning Tips & Techniques

    自讽一下: 昨晚LD限制我的上网时间,强行断网,关电脑,拔电源.我一着急,把这篇中文题目发到我的英文博客上了. 再来一遍.

    截至今晚,又读完了下面三章
    8: Query Tuning: Developer and Beginner DBA
    9: Table Joins and Other Advanced Tuning (Advanced DBA and Developer)
    10:Using PL/SQL to Enhance Performance (Developer and DBA)
    和11章 Tuning RAC and Using Parallel Features的一半.

    鄙人(IMHO)猜测这本书就是把多个人(大部分是TUSC员工)的文章,简单拼凑在一起,凑和着出版了一本书,不建议读者购买.

    不过, 第9章介绍了3个新颖的技术.

    1) Block Dump
    教会我开始使用Block Dump, 读trace文件里面的一些基本内容, 比如ITL锁, 列的数据类型和数据内容.
    下一篇文章,关于Fetch Across Commit最差实践,会引用一些Block Dump作为例证.

    2) Tuning Using Simple Mathematical Techniques
    原以为小学数学知识足以支持数据库管理和开发. 这下竟然用到了初中的数学知识.
    这部分知识讲了如何用二元一次线性方程(Simple Linear Equation),和二元二次方程(Quadratic)预测SQL的性能, 真新鲜,找机会试试.

    3) Join Tuning: Relational vs. Object-Relational Performance
    三种表连接(Nested-loop, Sort-Merge, Hash join), 把对象表作为物理存储结构的性能竟然远远好过普通表(heap table), 难以置信. 我认为写的性能比较差, 应该不适合OLTP系统, 找时间Benchmark一下.
    记得Tom的书里面不推荐Object-Relational表存储, 把Object-Relational结构拿来编程还行.

    Richard J. Niemiec 老兄讲了, 读完并理解了第9章,您就是高级数据库调优专家,并且站到了Richard J. Niemiec的高度,探索到无尽的喜悦.

    "If you’ve read and understood this entire chapter, you’re probably among the top-tuning
    professionals and you will see the heights and joys that I’ve seen with tuning Oracle."

    参考我14年的数据库经验(4年学习,10年荒废),鄙人木匠(IMHO)以为, 万里长征才刚刚开始, 读完并理解了第9章, 我才发现好多东西他都没有讲到,或者涉水太浅,要走的路还长着哩.


    BC Ferries 的轮渡缓缓驶离温哥华码头.

    Tuesday, February 10, 2009

    新学到的一些 SQL hints

    今年买了四本Oracle数据库方面的新书,其中Richard J. Niemiec的Oracle Database 10g Performance Tuning Tips & Techniques 比较旧,讲10gR2, 有1000多页,只能走马观花的快速浏览了.

    我刚刚读完前7章, 感觉内容平平,
    Chapter 1: Oracle Database 10g New Features (DBA and Developer) . . . 蜻蜓点水
    Chapter 2: Basic Index Principles (Beginner Developer and Beginner DBA) . . . 跳过
    Chapter 3: Disk Implementation Methodology and ASM (DBA) . . .飞速翻阅
    Chapter 4: Tuning the Database with Initialization Parameters (DBA) . . .没啥新鲜的
    Chapter 5: Enterprise Manager and Grid Control . . .跳过
    Chapter 6: Using EXPLAIN and STORED OUTLINES . . . 过时的内容,跳过
    Chapter 7: Basic Hint Syntax (Developer and DBA) . . .点到为止
    希望在后面这几章里找到一些实用新鲜的知识.
    8: Query Tuning: Developer and Beginner DBA
    9: Table Joins and Other Advanced Tuning (Advanced DBA and Developer)
    11:Using PL/SQL to Enhance Performance (Developer and DBA)
    15:Performing a Quick System Review (DBA)

    下面看看我新学的3个SQL Hint,
    • NO_EXPAND
    当我们的查询条件中有多个OR组合或者IN-list时, 阻止优化器将SQL转换成多个Union All查询.

    select * from emp
    where (emp_no = 1 or emp_no = 2 or emp_no = 3);


    USE_CONCAT Hint的作用正好相反.

    • PUSH_SUBQ
    当子查询返回较少数据时,并且有利于整个SQL的优化(比如降低逻辑读,减少表连接结果集,等等),优先考虑执行子查询,返回子查询的结果集.
    • QB_NAME
    当我们的查询看起来凌乱不堪,丑陋恶心时,QB_Name可以帮助你精确定位和指定需要的Hint.
    SELECT /*+ QB_NAME(qb) FULL(@qb e) */ employee_id, last_name
    FROM employees e
    WHERE last_name = 'Smith';
    参考:
    Oracle® Database SQL Language Reference
    11g Release 1 (11.1)
    Comments一节


    维多利亚的Swartz Bay码头,从这里搭船去温哥华,各种小汽车,货车就这样排着队,开进轮船的肚子里.

    这回坐上了一艘最大渡轮.轮船驶出码头,开往温哥华.


    Vancouver - Victoria (Tsawwassen-Swartz Bay) 这个航道是世界上最美丽的两个线路之一,另一个在欧洲啥地方.
    只可惜是阴天傍晚,拍不出它的壮美.

    Sunday, February 08, 2009

    BC goverment job 2 加拿大政府工作收入详解

    以下言论,纯属道听途说,毫无真凭实据,入职各行各业(三教九流)均有风险, 请谨慎参考.

    序: 上一篇讲了"加拿大政府工作收入简介", 恰好被一位在维多利亚BC省政府的DBA同仁看到,并发表了评论,这是我收到最好的留言了,干脆引用并发表成一篇正文.
    我估测网络博客的留言和阅读的人数比例是 1:100, 新的博客已经吸引了很多读者, 自我感觉良好. 由此看到今年的计划和努力有了回报, 木匠要持之以恒的写出更多实用和有趣的文字.

    下面是正文,来自一位同名的Charlie兄:



    就這標題 提供一些個人經驗

    --薪資部分
    我恰好是現職BC省政府DBA IS30(等同N30)
    政府工每一個大的Level是分為五個次level
    所以新任DBA只會拿到最低的初始薪資 也就是文中的CAD 72380
    這個工資事實上內含前幾年工會與政府協定的temporary salary adjust biweekly 2百多
    所以本薪部分 是不到7萬元的
    稅後biweekly大約可拿到1900元左右
    然後每一年提升一個次level
    也就是服務滿五年 才能拿到CAD 82867的薪資水平
    平均來說較一般private company略低15-25%
    (木匠注解: 全盘考虑退休金计划,年薪的75%; 假想有一位政府职员,年薪8万,25岁开始工作到65岁退休,活到85岁,
    $80,000 x 0.75 x (85-65)/(65-25) = $30,000, 也就是说, 实际年薪会多出大约2万至3万,
    想进商业公司的人,需要拿到比政府同级别职位多20%~30%的年薪,才能平衡.
    因为木匠从事数据库开发太久了,总想用数字说明问题. 纯属个人意见,仅供参考).
    至於management level也不一定就比技術工(staff)來的高(manager lv 1-12) 得看該manager職位的等級
    裁員時manager也因為沒有工會的保護 有可能被列為優先裁撤的對象

    --任職政府工的優點
    文中已經講到pension, flexday off
    如果不要flexday 每天工時7小時
    如果要flesday 每天工時7.78小時 就可以兩週多休一天假
    加班 staff有pay 一般是1.5-2倍時薪 但稅後略等同一般工時薪資 所以一般staff overtime的意願不高
    但DBA很常有overtime機會
    現在budget不足 老闆也就不希望overtime了
    此外的福利有MSP coverage, extend insurance coverage (dentist 80%)
    想深造的可在職進修碩博士 學費書本費幾乎100% cover(每使用一年需多服務一年) 等等
    故在政府工作 無非圖一份穩定
    (木匠注解: 好像病假不发工资,好多人带病上班. 比如从一个在卫生部工作的朋友那里听到一件事, 感冒的同事坚持上班,结果在办公室传染了一大片,上个月感冒大流行,这就是其中一个原因.)

    --缺點
    雖說穩定 還是有裁員的可能 幾年前就曾發生一次大裁員
    政府工呆太久 就很難回到private company
    一方面自我要求不夠的 技術會退步 競爭力也會退步 DBA除了DB之外全不給碰 OS Network Storage 等另有單位專管
    另有一說private company好像不大喜歡政府工做太久的 認為不夠積極
    (木匠注解: 政府论资排辈,裁员从新员工开始,老员工就很稳定啦; 如果老员工的职位被消减,他可以去顶替新员工的职位,新员工只好被挤走靠边站. 所以眼下看到政府的职位,最好不要去,不然你就是菜板上的鱼肉.)

    --怎麼申請
    文中已經有列出公告網頁

    --目前缺哪一類IT相關政府工
    Information Analyst (Lv 21/24/27) 要熟Oracle SQL, PLSQL, SAS 這部分是最常見的空缺
    DBA (Lv 27/30) 這不用多說 空缺時有時無 最近比較少些
    其他如Server Adm, Backup/Storage Adm等支援性的職位一直有缺 但這部分最近被outsource給EDS 前途未明.

    2009-Feb-05
    話才說完, 昨日獲最新消息, BC省政府將開始檢討高階管理人員的職位. 目前據說Deputy Minister/Assistant Deputy Minister江匯市第一波列入裁撤的對象, 目標是減少20%. 至於其他一線管理職或Staff尚未受影響...
    不過在BC省公開招募的website上 以往常有30+以上徵人的空位 近日居然銳減到不足5個職位 大約可預見這波recession對公職帶來的影響了..
    這年代 有工作就是一種幸福


    港口小镇:Port Alice, 在温哥华岛北部,维多利亚北边500公里,人口1000,是最喜欢的城市之一,如果以后有机会全职远程工作,打算搬过去,小住一年.

    小镇街景. 最喜欢就是这里安详宁静的气氛,太适合做软件开发了,可以帮助你最大限度的发挥你的想象力和创造力.

    Friday, January 30, 2009

    BC goverment job salary 加拿大政府工作收入简介

    一位华人老乡问及BC省政府薪酬情况, 如下
    [QUOTE=abc]请问老兄了解省府里面搞IT的工资待遇情况吗?我可能有一个机会,但是不知道是否值得去。[/QUOTE]

    以下言论,纯属道听途说,毫无真凭实据,入职各行各业(三教九流)均有风险, 请谨慎参考.

    政府的工资都是公开的,去政府网站溜达一圈,就都清楚了. BC Public Service - Job Opportunities

    BC省政府设在维多利亚,而不是BC省最繁华拥挤的温哥华,改善交通,增加就业机会,好处多多.
    (人们纷纷建议中国中央政府设在昌平或者通县,一个道理)

    木匠由于住在维多利亚,近水楼台,做过几次不成功的尝试,人家政府的人就是瞧不上俺,看我不像个混混,过于讲究实干和激进,不适合政府工作. 唉, 罢了, 由此断绝了这个想法.

    政府工作职位分级别, 论资排辈, 又臭又硬的门槛和台阶.(精神胜利法;吃不到葡萄,说葡萄酸,发扬阿Q精神). 以后退休可以再考虑混进去.

    R18,21,24 初级 3~5万
    R27 中级 6.5万 ($64,109.53 - $73,329.50)
    N30 高级 8万 ($72,380.24 - $82,867.93)
    在往上就是Manager了. 每个级别会有5%到10%的市场调节. 鄙人没有听说过政府有额外的奖金计划.
    政府有一个Flexible Day, 每两周多休一天假.
    最牛的是政府的退休金计划, 一年加年薪的3%(或者2%), 最多可以达到年薪的75%, 商业公司没有这个计划, 干巴巴的$1400,还是在你没有存款和收入的情况,明摆着领不到.

    我LD他们单位是个大学科研机构(纯属浪费纳税人钱财),属于政府薪资范畴,刚刚给每人追加了$4000~$7500的市场调节,还不错. 干的政府的懒散活,却非要和商业公司员工的收入看齐,不知道他Niang的哪门子道理.

    我们DBA部门2008年夏天刚刚从政府找了一个R30级的, 给了他9.5万.

    感谢这位华枫(ChinaSmile.net)网友提供素材, 素材就是博客的生命线.

    BC省议会大楼(现在成文物了,每天对游人开放参观),在维多利亚 Inner Harbor .

    Thursday, January 29, 2009

    Rocky mountain trip落基山国家公园行程

    我喜欢旅行在路上的感觉.

    这里是2008年陪岳父岳母观赏加拿大落基山脉国家公园的行程, 包括Banff, Jasper, Revelstoke.
    和BC省立公园 Wells Gray, Mt. Robson.

    9/6 Saturday: 赶八点轮渡(8:00 Ferry), 不在温哥华停歇, 到Hope市吃午饭,
    夜宿净水市(Clearwater).Jasper Way Inn Motel, 57 Old North Thompson Hwy East,
    1-250-674-3345, 2bedroom, $105

    9/7 Sunday: 游Wells grep 瀑布,Roberson公园,Mt Edith Cavell 看冰川,
    夜宿Jasper. Accommodation in the Rockies,303 Aspen Avenue,tel:(780)852-4609
    Rates ($CDN, per room, 2 guests) High Season - $60,Low Season -$40, Miller

    9/8 Monday: 自带午餐游 medicine lake/Maligne lake, Miette 泡温泉

    9/9 Tuesday: 穿过 93 号公路, 观看1. Athabasca fall, 2.哥伦比亚冰川, 3. Saskathewan午餐, 4. Mistaya Canyon 5. Bow pass(Bow summit), and Peyto lake 6.乌鸦脚雪原
    夜宿Banff. Rocky Mountain Bed and Breakfast,223 Otter Street,
    1 (403) 762-4811,www.rockymtnbb.com $100-$125, sheryl

    9/10 Wed. 1.Go throuth 1A (Option), 2.Lake Louise,(自带简餐)
    Yoho:1. Spiral tunnels 2. Takakkaw fall 3. Natural bridge 4. Emerald Lake
    5. Golden 午餐
    夜宿Revelstoke, Alpine Inn & Suites, 1001 W2nd St, 1800-876-8206
    2 bedroom suite three double beds or two double beds and two single beds, $110

    9/11 Thu. 游水库大坝, Naksup (optional)

    9/12 Friday: Vernon (optional)

    9/13 Saturday: 温哥华 中餐 大快朵颐, 夜宿Richmond华人家庭旅馆.
    9/14 Sun.乘轮渡返回 美丽宁静的Victoria.


    应该是5号(Yellow head)高速公路.

    Monday, January 26, 2009

    2009 Chinese new year show维多利亚春节联欢晚会

    给维多利亚华人社区做个广告.
    -------------------------------
    時間: 2009年1月31日晚7:00
    Time: 7:00pm January 31, 2009

    地点: 以馬內利浸信會
    Location: Emmanuel Baptist Church,
    2121 Cedar Hill Cross Rd. (大学南门)

    晚会内容: 中国民歌民乐民族舞蹈京剧话剧
    Content: Chinese Music, Chinese Dancing,
    Beijing Opera and Drama.

    晚会提供少年兒童照顾: Children Program Under Grade 6
    免费入场,会后提供茶点: Free admission and refreshments provided after show

    赞助单位 Sponsors
    Dawa News
    VictoriaBBS.com
    Global Travel
    DFH Realtor: Ms. May / Katherine
    Traditional Chinese Clinic: Dr. Chen

    大华商报
    维多利亚华人网
    环球旅游
    DFH 地产经纪:刘艳梅/李冬妮
    北京传统中医诊所:陈香医生

    -------------------------------
    http://www.news.cn/video/2009chunjie/cw.htm
    推荐给海外华人, 这里您可以看到中央台春节晚会录像.

    Thursday, January 22, 2009

    Solve SQL plan access path issue with 10053 trace CBO小试牛刀解决执行计划突然改变的一个办法

    写完了英文版以后,耗尽了今天的能量,赶在各位回家过农历新年前,再努力一下,完成中文版.

    问题
    ----
    如下SQL查询订单细节表,两个谓词(predicate),每个谓词列上都有索引,
    为什么 SQL optimizer 挑了一个选择性差的索引.

    # SQL
    SELECT /* */ * FROM po_item
    WHERE poid = :a AND STATUS = :b
    ORDER BY poitemid;

    INDEX PO_ITEM_POID ON PO_ITEM(POID)
    INDEX PO_ITEM_STATUS_UPDDT ON PO_ITEM(STATUS, STATUSUPDDT)

    db_file_multiblock_read_count = 32
    optimizer_dynamic_sampling = 2
    optimizer_features_enable = 10.1.0.4
    optimizer_index_cost_adj = 100
    alter system set optimizer_index_caching = 25;
    alter system set optimizer_mode = FIRST_ROWS_10;

    我们的情况是,一般一个订单一本书, 应该选择订单号POID列,基本没有重复. 但是2007年初夏的一个夜晚,CBO突然改用了物品状态STATUS列上的索引, 物品状态总共只有20个不同数值.
    幸运的是,通过构造测试案例,成功再现了当时的情况(好比侦探办案).

    解决方案
    --------
    理解 CBO,试验,观察 and 解释说明.
    With SQL session 10053 trace and dbms_xplan.display_cursor().

    结果及解释
    ------
    当列统计信息包含num_distinct和density时,少数情况下,优化器会考虑使用density.
    比如这个案例,
    根据谓词取值(predicate column value)在数据发布图(histogram)的水桶(bucket)里面结果集大小(cardinality) 和 num_rows * density 做比较, 理论上会取数值大的一个. 但是这个案例CBO挑了数值小的一个. 理论会随着新版本的出现而改变.

    做数据库设计和管理的,英语都不赖,看官您先读一点英文吧,春节后就变成中文啦. ^_^
    When database collect histogram stats on a column, it calculate a new density for the column,
    and it will be extreme smaller, CBO use density as selectivity.
    After we hack the column density, database will clear the histogram stats,
    the CBO will use 1/NumberOfDistinct, ignore density.

    When we check the output of 10053 trace,
    both IO costs are same, but index selectivity (ix_sel) and table selectivity (ix_sel_with_filters)
    on Index: PO_ITEM_STATUS_RANDOM_UPDDT is smaller than than it on Index: PO_ITEM_POID.

    Access Path: index (equal)
    Index: PO_ITEM_POID
    rsc_cpu: 17832 rsc_io: 3
    ix_sel: 1.2670e-05 ix_sel_with_filters: 1.2670e-05

    Access Path: index (index-only)
    Index: PO_ITEM_STATUS_RANDOM_UPDDT
    rsc_cpu: 17632 rsc_io: 3
    ix_sel: 6.2422e-06 ix_sel_with_filters: 6.2422e-06

    *) 修复: 改变列的density统计信息, 使之接近真实值.

    Test case setup link 构造测试案例

    10053 trace output跟踪文件输出和dbms_xplan美化的执行计划.


    后记
    ----
    CBO的水很深, 一环套一环, 好似无底洞. 研究细节和深度需要适可而止,解决完问题,赶紧撤.
    参考Christian Antognini提到的DBA容易犯的强迫调优失调综合症(compulsive tuning disorder)谨防重蹈覆辙.

    FYI,
    Once upon a time, most database administrators suffered from a disease called compulsive
    tuning disorder.3 The signs of this illness were the excessive checking of many performancerelated statistics, most of them ratio-based, and the inability to focus on what was really important.


    回龙观 风雅园 飘在北京住的地方

    Monday, January 19, 2009

    Learn from Oracle book 读书学习数据库

    首先热烈庆祝今天读完了老刘(Lewis)的Cost Based Oracle Fundamentals附录A附录B,就此读完了全书.欢迎客官您将各种SQL执行计划和优化器方面的疑难问题放马过来,让木匠尝试一下新学的功夫.

    开卷有益,静下心来读书是吸取知识的最快途径之一, 再结合试验,进步更是飞快.
    书中自有黄金屋,书中自有颜如玉,对第二点还没啥体会,您有的话,介绍一下.

    2008年上半年读完了Steven Feuerstein的Oracle PL/SQL Best Practices, 2nd Edition: October 2007, ISBN 13: 9780596514105. 感觉PL/SQL功力暴增,从菜牛一跃变为牛人,读完了Doing SQL from PL/SQL: Best and Worst Practices更是进入了超一流选手的行列,充满自信.

    2008年10月11月,花了两个月时间完成了瑞士人Christian Antognini的Troubleshooting Oracle Performance. 读了一半,节奏缓慢,等读完了所有章节,才明白了前半部分铺垫的意义,盖房子要有一个好的根基. 作者虽然母语不是英语,开始读的时候稍有不适,慢慢的,发现他的文章却是平铺直叙,拿捏得体,易于理解,所以读书进度很快.

    扯远一点,1994年偶然在公司(西安思维)捡到一本Code Complete(代码大全)中文译本,爱不释手,但也只是蜻蜓点水,学到一点皮毛.现在我手里正拿着Code Complete的原版.
    代码大全里讲的软件开发有几种比喻(Metaphor), 比如软件书写(Penmanship,写作),软件农场(种庄稼/耕作Farming),软件堆积(养牡蛎Oyster Farming) 和 软件构造(Construction/Building,构建软件).
    我同作者一样,喜欢盖房子这个比喻,房屋的根基和房屋的构造规划都很重要.

    2008年5月开始读CBO Fundamentals,这本书真是难啃,内容不易理解,断断续续,每天大概5页,9月份卡在第十三章Sorting and Merge Joins,圣诞节又拾起这本书,一鼓作气,冲过难关,读完了剩余部分,特别是读完14章The 10053 Trace File,贯穿全剧,对CBO的认识又上了一层台阶.
    我对英国英语不太适应,Doing SQL from PL/SQL: Best and Worst Practices的作者也是英国人,读起来相当吃力,改天我把所有20个要点及示例重新写一遍.

    下一个目标是Richard J. Niemiec的Oracle Database 10g Performance Tuning Tips & Techniques, 1000页,每天十页,计划100天(3个月)读完.粗粗翻了一下,此人标准美国英语,文笔通俗易懂,按时完成目标问题不大.


    2005年7月刚到加拿大时,从旅馆到办公室的路上, 距离办公室有300米,中午常到这里散步.

    Friday, January 16, 2009

    Kicks 近期动态

    除了生活八卦以外,好像我的技术文章大伙都没兴趣,难道是我讨论的主题太偏太生僻,还是社区里面做Development DBA的同仁较少,激发不起共鸣.

    这里是我的学习动向,
    宏观研究易于线性廉价扩展的数据库系统,BASE解决方案,依据功能组拆分数据库,异步处理.
    微观研究SQL Optimizer是怎样工作的.弄清楚了Oracle优化器,你会发现以前各种SQL方面的疑难杂症迎刃而解,加个SQL hint,调整隐含参数,修改对象统计信息之类的技术,都是菜鸟级的功夫,但是牛人也得用.
    中间层面,研究各种典型场景中处理数据的设计模式,以及SQL和PL/SQL优秀实践和糟糕实践,找出规律,重构模型. 通常我们讲最佳实践,木匠不喜欢"最佳"这个词,它也是个封闭端口,感觉不允许别人挑战你的权威一样. 质疑权威是我的行事准则之一. 而且喜欢开放端口的描述.

    生活方面, 耳朵感染了,旱了两个月,这个周末开始恢复游泳锻炼,健康始终排在个人目标前三位.
    2009年的密林狂奔和(国家公园)露营野游计划也该详细制定了.
    股市在低谷震荡,2月底以前需要找准机会抄底,买足去年RRSP(退休金计划)的余额.
    房屋贷款利率降到了2.8%,诚如玉面飞龙所述,现今房奴的日子比较舒服,不急于还本金.

    职业发展方面,前CIO介绍了一个挑战性的工作,2月初确定.
    还有个加州的华人中介介绍了中国的机会,如果前一个尝试失败,加拿大移民监坐完了,我可以自己回国.如果前一个尝试顺顺当当,我就把它介绍个国内的朋友.
    我平均18个月换一个工作,最短的只干了一天半,1993年10月在西安用AutoCAD绘制电路图.
    目前这个工作是我做的最久的,已经3年7个月了,一来就是6级工程师,我们的CIO/CTO才7级,基本没有发展空间了. Tom讲过,10年做10个项目,远远好过10年做一个项目,积累更多经验,学到更多知识.
    参考木匠的座右铭,我最不缺少的就是探索尝试新技术的兴趣,好奇心,创新精神和想象力.

    博客方面,一下萌发了好多主题,可是哪个也不能专心深入的展开写出来.
    老爸讲过咱天生就是发散型思维,缺少组织才能,缺少的是自律和专注,排在我的座右铭前面.
    人生35岁,看清了自己的优点和缺点,不容易.路漫漫其修远兮,吾将上下而求索.
    突然觉得英文写起来快,中文已经慢了几节,下周赶紧把异步处理系列翻译完.


    我们家苏菲 和 回龙观的冰糖燕窝家的 ??,对不起,浅棕色可卡犬的名字忘了.

    Tuesday, January 13, 2009

    Why to generate test data and how. 为什么要生成测试数据?如何做?

    在学会生成测试数据之前,我仅仅知道select * from scott.emp;
    加上
    create table t(a number);
    insert t values(1);
    这就是我知道的所谓测试,幼稚吧.

    为啥需要测试数据呢?
    情况太多了,我的经验是,等到你需要的时候,就是找不到,干着急.

    测试数据可以用来把灵感转化为实践,验证原型是否工作(可用性,可靠性,可扩展性),性能测试,提问题和重现问题 等等. 随后有一篇介绍我是如何用完善的测试数据发现了使用MERGE SQL产生的臭虫.
    还支持TDD, 测试驱动开发, 用过以后你就知道甜头了, 和异步处理一样美妙!

    关于提问题, 引自Tom: You would better supply very very simple create tables and insert statements.
    The SMALLEST create table possible (no tablespaces, no schema names, just like I do in my examples for you)

    解决方案.
    --------

    *) 产生多个不同数值, 得到一定的数据分布

    Mod(rownum,500)
    dbms_random.value(1,500)
    dbms_random.normal()

    *) 产生字符串

    rpad('x',500,'x')
    lpad(RowNum,200,'*')
    dbms_random.string('l',500)
    # 'u', 'U' - returning string in uppercase alpha characters
    # 'l', 'L' - returning string in lowercase alpha characters
    # 'p': any printable char. this one is slow

    *) 数据源

    # dual connect by level <= 3000 # all_objects # WITH subquery factor *) 随机排序 ORDER BY dbms_random.random; *) 点击进入具体示例

    *) 参考
    1. Tom, from dba_object
    2. Jonathan, + materialize subquery
    3. Christian Antognini, dbms_random.string()
    4. Tanel, dual join dual connect by level <= 3000
    维多利亚市的天鹅湖, 湖对岸右边一点是Hatley Castle城堡, 电影X-Man(X战警)三部都是在这里拍摄的.

    Wednesday, January 07, 2009

    cross rows comparing行间数值比较

    回应eagle的一篇帖子,介绍一下多种方法做行间数值比较.

    方法
    --------
    1. Hash Join
    eagle’s home http://www.dbafan.com/blog/?p=176

    2. Lead()/Lag() Analytic function

    3. SQL Model

    结果
    -------
    Hash Join表连接是一个好的方法, Lead() 分析函数效果更佳, 更短时间, 使用前者八分之一Latches锁,1/4逻辑读.
    SQL Model可以工作, 但是数据量一大,效果就很差,惨不忍睹, :)
    SQL Model 需要更多的 PGA内存和临时表空间来存储Model单元和排序.
    减少Measure部分的列数有一定帮助, 需要进一步学习和调整. SQL Model的效率理应匹配Lead() 分析函数.

    您有更好的手段来调优 SQL Model 吗? 请发表高见.

    详细性能测试步骤和代码

    PL/SQL ADT collection usage比较自定义类型数组与PL/SQL数组的性能

    从今天开始, 木匠开始介绍BASE架构中数据库部分的基础部件.
    有了这些基础准备知识以后, 我们再来谈(big picture)整个画面: 异步处理 和 数据复制.

    PL/SQL 是最好的Oracle数据库数据处理和编程语言, 这里讲讲如何提取数据并放进用户数据类型数组ADT/UDT collection. 我仅知道3种方法, 我们通过一组Benchmark找到每个方法的优缺点,帮助指导实践.

    先写了英文的,然后翻译成中文. 详细初始化设置和Benchmark的代码, 请参考英文版链接, 很多关键字看英文版会更清楚.
    你可以暂时忽略create table里面的list partition分区部分, 以后会用到.

    欢迎提出更多更有效的方法.

    Benchmark方案
    -- -- ---
    * RunStats
    * SQL trace, 推荐使用Christian Antognini的TVD$XTAT trace 分析工具 , 读过TOP的人都知道, ^_^.

    测试结果
    -------
    PL/SQL 内置数组(Associative Array and Nested Table) 是从数据库获取结果集的最省资源的方法.
    但是有些时候,你需要把数组当作表(table),来跑一个查询, 你就必须用到ADT/用户数据类型数组.
    比如:

    Declare
    lt_item_tab item_tab;
    Begin
    select item_name, qty, price from TABLE(lt_item_tab);
    End;


    3种方法 和 他们的优缺点:

    1) 将多个列转换成用户数据类型数组, 成批放进数组.
    优点: 代码简洁.
    缺点: 和第二种方法相比, 多消耗50%的CPU时间; Latch锁数差不多.

    2) 使用multiset, 在SQL里面直接构造出用户数据类型数组, 作为一行/一个单元放进数组.
    优点: 使用较少资源, 在我的测试案例里面, 比第一种方法CPU时间少50%.
    缺点: 代码有点复杂; 在版本10.1中,不支持SQL Returning语法. (明天试一下11.1.0.7).

    3) 成批放进 PL/SQL 内置数组, 然后复制数据到用户数据类型数组.
    优点: 使用较少资源, 67% better than approach 1 in my test case; Latch锁数少一半.
    缺点: PGA内存多一倍, 合乎逻辑, 代码有点复杂, 维护性较差.

    注释: ADT: Abstract Data Type, 也叫作 User Define Datatype.

    鄙人以为, 以上所有代码都很简单, 复杂只是相对而言. 嘻嘻.

    Sunday, January 04, 2009

    Amazon.com aquired AbeBooks.com公司被亚马逊收购

    上文书提到要写收购的事儿,今日成行,

    2008年早些时候就开始谣传,先是说要被Chapter(加拿大最大实体书店)收购,
    后来夏天漂流的路上听"老奔驰"说在两周以后要被亚马逊收购,而且全世界的人都知道了,这才倍感震惊,恍然知晓.
    公司有3个华人同事,我是第一个得知,难道这"全世界"不包括我们,因此学了一课,没事多找同事聊天,即提高口语,又快速了解本公司花边新闻.

    7月31日,公司宣布第二天有重要消息发布,同事们顿时感到黑云压境,不知是祸是福.
    第二天亚马逊来了几个VP,宣布了收购意向,十月底完成交易,现金收购.
    他们提到了三个不变: 业务,人员和办公地点.这下大伙的心才放了下来,松了一口气.
    在QA问答时段,席间好多同事积极表示了去西雅图亚马逊工作的兴趣,他们的回答是公司鼓励应聘内部职位,优先考虑.本地西人同事真是直爽!

    收购并不是一帆风顺,期间受到了加拿大政府遗产部门的刁难,区区一个十年历史的创业型公司,咋样也不能算作一个加拿大遗产呀!!? "老憨"(德国CEO老大)多次亲自跑到渥太华,同政府官员进行激烈的争论,终于在11月底得到政府批准,(而接待我们CEO的竟然是刚毕业的实习生毛头小伙,他知道啥呀).

    结果12月1日成交,亚马逊趁机压价10%,好过收购失败,以后有大树做依靠,确保安然度过本次经济危机. 还好加币跌了,收购按美元结算,基本没有亏损.

    在说说股票和期权,这是木匠第一次从期权里面得到实惠,味道不错;在Dell工作的时候,发了600股,每股标价$60,结果到走的时候,2001年IT泡沫,每股跌倒$30,味儿都没闻着.
    原来的公司AbeBooks.com每人##股期权(Stock option),人人均等,共产主义.
    到了亚马逊好了,发的是股票Share,而且根据职务轻重差异化,终于显示出来DBA的重要性,还是大公司规范.股票分四年兑现,算下来每年差不多一万块.这年代,要求加薪五千,难于蜀道,股票发下来倒是轻松.

    号称维持三不变,其实日常工作还是受到了影响,稍微大点的项目,都要报亚马逊审批.希望今年有机会南下100公里,到西雅图亚马逊短期轮换工作.


    注释1: "老奔驰", 原名Peter, 因为他有一辆80年代造的奔驰汽车,就给他起了这个绰号.在办公室用中文议论别人是不礼貌的,所以给每个同事都起了中文外号,比如沃尔沃,豆腐丝,老汤唯,二号,研究生...etc.

    河狸湖(Beaver Lake)结冰了,1996年以来首次,记录一下.

    Saturday, January 03, 2009

    Data accuracy and consistency分布式异步数据处理的可行性

    2009年定下一个实在的目标: 坚持每周一篇博客. 主要写个人在加拿大的生活趣事, 以及数据库开发和设计模式作为辅助.
    -- '大多数的事例告诉我们,我们不因才干、天赋、美丽的帮助下取得成功。反而,成功来自于最简单的"坚持"'.

    好了,言归正传,谈谈当下如火如荼BASE设计架构中异步处理的可行性.
    BASE (basically available, soft state, eventually consistent)

    很久以来,产品经理和软件开发人员都把维护数据的一致性和准确性作为首要目标.
    要想构建一个scalable线性扩展的数据库系统,必须牺牲一些数据一致性,来创造出更高的可用性和减少网络依赖性(Network Partition Tolerance, or Isolation and Loose coupling).

    鄙人认为(IMHO - in my humble opinion), 除了信用卡系统和订单系统, 其余功能模块都可以异步处理,比如库存,搜索,财务,物料,后勤运输,发货...etc.
    这里提供两个真实生动的素材,帮助你说服产品经理,证明构建异步数据库系统的可行性.

    a) 航班订票系统
    某天你去国航订票,要求买靠窗户的座位,系统里显示只有3个走道的座位,但是实际上有两个靠窗户的座位.
    你会去国航找他们领导投诉吗? 答案是否定的.

    b) 网上购物-在亚马逊买书
    Doug(倒戈)刚刚出版了一本新书: "如何冬季漂流?".
    我们快乐的客户登录亚马逊主页,输入关键字"漂流", 找到3本书,但是没有Doug那一本,客户才不在乎呢.
    他们买了一本评分高的, 然后带着汽船去享受冬季漂流了.

    我猜只有作者Doug非常气愤,他会打电话给亚马逊客户服务热线,要求更新库存,将他的书上线.

    同样, Tom 刚刚出版了一本新书: "如何3分钟优化你的数据库?"
    ... ... 您自己编后边的故事吧, 嘻嘻.


    以下是我发给我们产品经理的原文.

    *) Air flight booking ticket system

    As a passenger, if you ask a seat close to window, but system shows only 3 seats available in aisle, and actually there are 2 more seats close to window.

    Will you call airplane company to complain? No.

    *) Amazon book search

    Doug published a book: “how to tube in winter?”

    If you search the book title with keyword “tube”, show 3 book, but not Doug one, the end user won’t care. They will buy one of them, and then enjoy the tube in Winter…

    I guess only editor Doug will be angry, he will call Amazon to refresh his book in Inventory.

    您有什么更好的应用场景故事呢? 欢迎留言介绍.

    注解1: Doug 是我们公司一个年轻贪玩的Web Developer, 每年夏天组织我们去Duncan市Cowichan 河漂流,而且可以观赏hot girl, 并且引诱你吸大麻(Weed).
    注解2: Scalability - 更具体点,就是Scale Out, 这个词我翻译的不好, 欢迎批评指正.
    注解3: network Partition tolerance, CAP三原则中的P, 也翻译的不好,请指正.

    p.s. 参考:

    1) BASE: An ACID Alternative
    http://acmqueue.com/modules.php?name...owpage&pid=540

    2) Scalability Best Practices: Lessons from eBay (Partition and Asynchronously)
    http://www.infoq.com/articles/ebay-s...best-practices

    *) Fenng 的 系统架构方面的文章汇总.
    http://www.dbanotes.net/arch


    从客厅窗户看我家后院.

    Friday, January 02, 2009

    Life quality beside salary 生活质量和生活成本

    上一篇讲了美国高科技公司的收入, 这里续写一篇, 生活成本, 然后您就能估算出生活质量了.

    如果你今年在硅谷湾区找到了一份满意的工作,
    开始找公寓租住,
    一房一厅 $1200 ~ $1500
    两房一厅 $1500 ~ $2200
    如果你是单身,一个月$8000,不少了吧,基本吃住生活开销,就得花掉$4000, 还有30%缴税,
    各种奢侈娱乐你就别指望享受了,闲暇时间,就在家上网溜溜花边新闻得了.
    或者休长假,去中西部偏僻省份长途旅游.

    Santa Clara中等价位房屋 $500,000
    稍微好点,中上等价位房屋 > $ 1 million.
    在硅谷的IT华人,基本赚着中上等的收入,住着中上等价位的房子.
    维多利亚的IT华人也一样; 中等价位房屋 $40万, 中上等价位房屋 > $60万.

    比如在湾区,一个家庭年收入在15万到25万,不少了吧, 每月大概一万二到两万.
    上缴30%个人所得税, 每月6千.
    然后谈房子, 基于正常贷款利率, 借十万,月供$500, 那么买个一百万的房子,
    多年的积蓄交了20万首付,咋整也得借八十万,月供$500 * 8 = $4000, 日常生活开销, 每月2k~3k.
    一般一家两个小孩, 上学加上各种知识培训(钢琴,国际象棋,游泳...等等)一个费用在1k~2k, 两个算3k,不包括玩具.
    一眨眼,每月一万六千块钱没了. 该谈玩耍娱乐了, 就在自己后院陪小孩玩玩过家家娱乐吧.

    最近半年房屋价格剧烈震荡, 半年前中等价位房屋 $70万.
    但是好地段的房子,价格基本没变, 老道理 Location, location, location!
    买房主要看位置,位置,还是位置.

    总之, 硅谷湾区生活成本高, 一个家庭里边, 夫妇双方都要工作,才能生存下去.

    以上素材来自一个我的客户,在硅谷湾区工作生活了15年,如今在 Mountain View 上班.

    注释1: 写的有点悲观, 给一些盲动的人一个清醒的认识,比如我, 全盘考虑以后再做决定. 嘻嘻 硅谷的人们依然快乐的生活着.
    Have a nice day!