LINGVA LATINA PER SE ILLVSTRATA

今自海盗湾下载到了 LINGVA LATINA PER SE ILLVSTRATA 这本经典奇书。全书以拉丁语授拉丁语,却写得通俗易懂简单明了,甚是可爱。读者好评如潮,我看了前面几章,亦有同感。我决定,先把这本书看完,然后再开始Wheelock那本的学习。

今天先把 Cap I 的 PENSVM A 给做掉。

Nilus fluvius est.  Nilus et Rhenus fluvii sunt. Creta insula est. Creta et Rhodus insulae sunt. Brundisium oppidum est. Brundisium et Tusculum oppida sunt.

Rhenus fluvius magnus est. Tiberis est fluvius parvus. Rhenus et Danuviius non fluvii parvi, sed fluvii magni sunt. Sardinia insula magna est. Melita insula parva est. Sardinia et Sicilia non insulae parvae, sed insulae magnae sunt. Brundisium non oppidum parvum, sed oppidum magnum est. Tusculum et Delphi non oppida magna, sed oppida parva sunt.

Creta insula Graecae est. Lesbos et Chios et Naxus sunt insulae Graecae. In Graecia multae insulae sunt. In Gallia sunt multae fluvii. In Italia multae oppida sunt. In Arabia sunt paucae fluvii et paucae oppida.

A et B litterae Latinae sunt. C quoque littera Latinae est. Multi et pauci vocabulum Latinae sunt. Ubi quoque vocabulum Latinae est. I et II numeri Romani sunt. III quoque numerus Romanus est.

 

==============

Check:

Nilus fluvius est. Nilus et Rhenus fluvii sunt. Creta insula est. Creta et Rhodus insulae sunt. Brudisium oppidum est. Brundisium et Tusculum oppida sunt.

Rhenus fluvius magnus est. Tiberis est fluvius parvus est. Sardinia et Sicilia non insulae parvae, sed insulae magnae sunt. Brundisium non oppidum parvum, sed oppidum magnum est. Tusculum et Delphi non oppida magna, sed oppida parva sunt.

Creta insula Graeca est. Lesbos et Chios et Naxus sunt insulae Graecae. In Graecia multae insulae sunt. In Gallia sunt multi fluvii. In italia multa oppida sunt. In Arabia sunt pauci fluvii et pauca oppida.

A et B litterae Latinae sunt. C quoque littera Latina est. Multi et pauci vocabula Latina sunt. Ubi quotue vocabulum Latinum est. I et II numeri Romani sunt. III quoque numerus Romanus est.

 

=============

总结:形容词的形态貌似紧跟所描述的名词,而不用考虑太多别的东西。名词单复数的变化大致有:

  us -> i  : numerus -> numeri

  a -> ae:   insula -> insulae

  um -> a:  oppidum -> oppida

Wheelock's Latin Homework -2

Capvt II

SENTENTIAE ANTIQVAE

> Ancient sentences

1. Salve, O patria! (Plautus)

>Farewell, oh fatherland!

2. Fama et sententia volant. (Vergil)

>Rumor and opinion fly.

3. Da veniam puellae, amabo te. (Terence)

>Please give pardon to that girl.

4. Clementia tua multas vitas servat. (Cicero)

>Thy clemency saves many lives.

5. Multam pecuniam deportat. (Cicero)

> Carries away a lot of money.

6. Et fortunam et vitam antiquae patriae saepe laudas sed recusas. (Horace)

>Thou often praisest both fortune and life of the ancient fatherland but refusest them.

7. Me vitare turbam iubes. (Seneca)

>Thou orderst me to avoid the crowd.

8. Me philosophiae do. (Seneca)

>I give myselft to philosophy.

9. Philosophia est ars vitae. (Cicero)

>Philosophy is the art of life.

10. Sanam formam vitae conservate. (Seneca)

>Keep a sane form of life.

11. Immodica ira creat insaniam. (Seneca)

>Immoderate anger creates insanity.

12. Quid cogitas?--debemus iram vitare. (Seneca)

>What doest thou think?--We ought to avoid anger.

13. Nulla avaritia sine poena est. (Seneca)

>No avaricious is without penalty.

14. Me saevis catenis onerat. (Horace)  

>Thou opressest me with cruel chains.       note: * (Abl. pl.)

15. Rotam fortunae non timent. (Cicero)

>They do not fear the wheel of fortue.

16. The girls save the poet's life.

>Pullae servant poetae vitam.

17. Without philosophy we often go astray and pay the penalty.

>Sine philosophia saepe erramus et poenas damus.

18. If your land is strong, nothing terrifies the sailors and you(sg.) ought to praise your great fortune.

>Si tua patria valet, nihil terret nautas et debes laudare tuam magnam fortunam.

19. You(pl.) often see the penalty of my anger and warn me.

>Saepe videtis poenam meae irae et monetis me.

20. The ancient gate is large.

>Porta antiqua est magna.

 

Catullus Bids His Girlfriend Farewell

Puella mea me non amat. Vale, puella! Catullus obdurat: poeta puellam non amat, puellam non vocat, formam puellae non laudat, puellae rosas non dat, et puellam non basiat! Ira mea est magna! Obduro, mea puella--sed sine te non valeo.

>My girl does not love me. Goodbye, girl! Catullus is tough: The poet does not love the girl, dost not call the girl, doest not praise the girl's beauty, doest not give roses to the girl, and does not kiss the girl! The anger of mine is great! I am tough, my girl -- but without thou I can not live.

 

Wheelock's Latin Homework -1

决定今天开始把课后作业给做掉。用的是Wheelock's Latin 7th edition的,比网上流传的6th要新一点点。全部都是翻译题。英文的You单复数同形不直观,单数改成thou吧,动词也略微改改。改错也无所谓了,毕竟不是研究古英语。

Capvt I:

SENTENTIEAE:

1. Labor me vocat.

>Work calls me.

2. Mone me, si erro--amabo te!

>Warn me if I am wrong - please!

3. Festina lente.

>Haste slowly.

4. Laudas me; culpant me.

>Thou praisest me; they blame me.

5. Saepe peccamus.

>We often sin.

6. Quid debemus cogitare?

>What shall we think?

7. Conservate me!

>Save me!

8. Rumor volat.

>Rumor flies.

9. Me non amat.

>She does not love me.

10. Nihil me terret.

>Nothing terrifies me.

11. Apollo me saepe servat.

>Apollo often guards me.

12. Salvete!--quid videtis? Nihil videmus.

>Greetings!--what do you see?We see nothing.

13. Saepe nihil cogitas.

>Thou often think'st nothing.

14. Bis das, si cito das.

>Thou givest twice if thou givest in time.

15. Si vales, valeo.

>I am well if thou art well.

16. What does he see?

>Quid videt?

17. They are giving nothing.

>Nihil dant.

18. You ought not to praise me.

>Debetis non laudare me.

19. If I err, he often warns me.

>Si erro, me monet.

20. If you love me, save me, please!

>Si amatis me, conservate me, amabo te!

 

The Poet Horace Contemplates an Invitation

Maecenas et Vergilius me hodie vocant. Quid cogitare debeo? Quid debeo repsondere? Si erro, me saepe monent et culpant; si non erro, me laudant. Quid hodie congitare debeo?

>Maecenas and Vergilius are calling me today. What shall I think? What shall I reply? If I err, they often advise me and criticize me; if I do not err, they praise me. What shall I consider about today?

 

职业路线的矛盾抉择

经历:两年的电信SP行业打杂,主发垃圾短信,使用的技术方案是PL/SQL,Java。这两年现在回过头来看,起点确实太低了,无论是薪资还是企业层次还是别的什么。但是要说这两年完全是浪费时间却也不能这么讲。从毕业时的一无是处到两年后的略有水准,毕竟有了一个过渡,并且打下了一定的基础。然后又是将近两年的金融IT行业半打杂,使用的技术方案是纯PL/SQL,主要精力花在数据的匹配和核对上。对于金融业务,从完全不懂到略微懂得一些,但在真懂的人面前估计连皮毛都没有。

现状:熟悉PL/SQL,然而并不精通。熟悉Oracle,但是不能处理常见的数据库故障,不曾在DBA路线上投入过什么。熟悉Java,但是基本功不扎实,并且以后也不想再使用Java。其他杂七杂八的知识有不少,但都只是皮毛。会一些Perl,做过一些逆向,对加密解密有些兴趣。因为股票投资收益,对金融也有兴趣。数学功底基本处于没有的状态,算法知识奇缺。

感觉可以走的路线:

1. BI,Data warehouse, Data Mining.

2. Machine Learning,Nature Language Processing.

3. 黑道的外挂,破解,挂马等

4. Quant.

从目前的现状看,这四条路线我都还差距较远。难度从上到下依次排列。Quant 感觉更多的是个美好的梦想,实现可能性甚微。路线2是我兴趣非常浓厚的一个方向,然而目前的基础也欠缺非常多,至少暂时没有可能弥补。这条路线求职的话,甚至可能还需求一个硕士学位。路线3的难度我看不到,没有真正进入这个领域,难以看清深浅,但是至少来说可能得补上一个系统性的Windows软件开发基础。路线1从目前看是最适合我的,需要补充的知识和技能也比较容易补足。でも、本当にそう?

我似乎必须得做出选择,否则各方面牵扯的精力实在太多。要说兴趣的话,我似乎都有兴趣,并没有哪个特别强烈一些哪个特别反感一些。常年的维护性工作已经培养出在随便什么繁琐无味的事情中找出乐趣的能力了。那么就看钱吗?也不是不可以。哪份工作能获得的薪资以及相应所需要的补全的内容以及补完这些所需要的时间之间得作个权衡。可是我所掌握的信息无法支持我做出判断……

另外还有一个路线5,

5. 破罐破摔,发挥民工风格,哪里钱多就去哪,随便做点啥。经历过招聘的都知道,企业招人并不是非要怎样才招的,我现在的水平虽然被自己鄙视,但要找个工作并不难,只不过不理想而已。破罐破摔的话,就往薪资高的去处聚集,彻底无视在“工作中积累”这一条,钱多就去,然后自己抽点时间做点别的。

这似乎也是一个可选项……

 

PLS-00801: Type xxxxxx has no MAP method 这到底是啥啊……

前段时间把一个查询效率很低的视图给改成了 带一个日期参数的函数,输入一个日期,返回相应的结果集。但是这样没能完整地复制视图原有的功能,比如给定一个日期区间的查询就做不到了。于是今天给扩充了一下,然后就遇到了这个该死的莫名其妙的PLS-00801.

代码呢是这样的:

create table stockstructure (
     oc_date         NUMBER(10) ,
     exchange_type   CHAR(4) ,
     stock_code      CHAR(12) ,
     total_amount    NUMBER(20,3),
     turnover_amount NUMBER(20,3) ,
     remark          VARCHAR2(2000 )
  );

create or replace type rec_stockstructure is OBJECT(
     oc_date         NUMBER(10 ) ,
     exchange_type   CHAR(4 ) ,
     stock_code      CHAR(12 ) ,
     total_amount    NUMBER(20 ,3),
     turnover_amount NUMBER(20 ,3) ,
     remark          VARCHAR2(2000 )
  );

create or replace type ty_stockstructure is table of rec_stockstructure;

create or replace function fn_get_stockstructure(
     p_oc_date hstype.HsDate,
     p_end_date hstype.hsdate default 0
  )
return ty_stockstructure
is
    tmp_stockstructure ty_stockstructure := ty_stockstructure();
    rs_stockstructure ty_stockstructure := ty_stockstructure();
begin
    if p_end_date = 0 then
       select rec_stockstructure(p_oc_date,a.exchange_type,a.stock_code,a.total_amount,a.turnover_amount,a.remark)
          bulk collect into rs_stockstructure
         from stockstructure a
       where (a.oc_date,a.exchange_type,a.stock_code) in
                   ( select max (t.oc_date),t.exchange_type,t.stock_code from stockstructure t
                    where oc_date<=p_oc_date
                      group by t.exchange_type,t.stock_code
                   )
              ;
    else
         for xdate in 0..(to_date(p_end_date,'yyyymmdd' )-to_date(p_oc_date,'yyyymmdd')) loop
                select rec_stockstructure(to_char(to_date(p_oc_date,'yyyymmdd' )+xdate,'yyyymmdd'),a.exchange_type,a.stock_code,a.total_amount,a.turnover_amount,a.remark)
                  bulk collect into tmp_stockstructure
                 from stockstructure a
               where (a.oc_date,a.exchange_type,a.stock_code) in
                           ( select max (t.oc_date),t.exchange_type,t.stock_code from stockstructure t
                             where oc_date<=to_char(to_date(p_oc_date,'yyyymmdd' )+xdate,'yyyymmdd')
                            group by t.exchange_type,t.stock_code
                           )
                ;
               rs_stockstructure := rs_stockstructure multiset union tmp_stockstructure;    --------------------- 报错位置
          end loop ;     
    end if;        
   return rs_stockstructure;
end;

然后就在我标着的位置给抛出了一个错误。错误原文如此:

Error: PLS-00801: internal error [*** ASSERT at file pdw4.c, line 2079; Type 0x0x2b89f96a66e0 has no MAP method.; 

于是我就纠结了,这到底说的是啥呢?这几个关键字我连搜索都没法搜。而且更纠结的是,在Oracle 11g 上不报错,在 Oracle 10g 上报错。那么是版本问题嘛?我查了下,10g multiset 的支持完全没问题啊。我又在报错的这个数据库上做了个这样的测试:

select * from table( 
   ty_stockstructure(rec_stockstructure(1234,'1','1234',1,1,'1')) 
  multiset union 
   ty_stockstructure(rec_stockstructure(2234,'2','2234',2,2,'2')) 
)

结果也是好好的,完全符合预期。真是无厘头啊,这都什么情况啊……

跪求一个证明我错了的用例……

这两天无聊刷HDOJ,各种不爽啊。C语言果然是忘记光了。

今天遭遇1003题。这题网上一搜倒是一堆讨论的,全是不知道自己死在哪的。而回复则大多是“这是一道典型/经典/简单的动态规划题”,然后给个AC的代码。我不知道动态规划是什么,当年学的时候没注意听就算听了现在也早忘记掉了,但是你给个正确的代码并不能表示我的就是错的啊…… 如果说错了,那么到底错哪里呢…… 跪求一个能证明我错了的测试用例……

HDOJ 1003 题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003

我的代码:

 

#include <stdio.h>

int main(){
    int times, numbers;
    long a, result, pretend;
    int i,j,s,e;

    scanf("%d",&times);
    for(i=1;i<=times;i++){
        scanf("%d",&numbers);
        scanf("%ld",&a);
        result = a; 
        pretend = a; 
        s = 1; 
        e = 1; 
        for(j=2;j<=numbers;j++){
            scanf("%ld",&a);
            pretend += a; 
            if(pretend>result){
                result = pretend;
                e = j; 
            }  
            if(a>result){
                result = a; 
                s = j; 
                e = j; 
            }  
        }  
        printf("Case %d:\n%ld %d %d\n",i,result,s,e);
        if(i!=times){
            printf("\n");
        }  
    }  
    return 0; 
}

 

----- 2013.02.01 P.S.-------------------

因为不知道DP具体是个啥,今天抽空查了些资料,草草研究了下DP究竟是怎么回事,并参考了别人的一些代码,虽然错误用例还是没能找到。 我的代码的算法大致可以这样描述吧:

          MaxSum[1] = ValueN[1];

          MaxSum[n] = (MaxSum[n-1]+ValueN[n]>MaxSum[n-1]? MaxSum[n-1]+ValueN[n]: MaxSum[n-1]) > ValueN[n] ? $1: ValueN[n]

$1 表示 前一个判断得到的结果。

第一个判断 MaxSum[n-1] + ValueN[n] > MaxSum[n-1] ?  只要 ValueN[n] >0就能成立

第二个判断 MaxSum[n-1] + ValueN[n] > ValueN[n],成立条件是 MaxSum[n-1] > 0,第二个判断的另一个分支 MaxSum[n-1] > ValueN[n] 则不能直接看出正负关系,但是因为要走到这个分支,必然要求ValueN[n]为负,要小于一个负数的话,MaxSum[n-1] 必然也得是负数,这样才能让条件不成立从而得到ValueN[n]。换句话说,只要 MaxSum[n-1] >0, 第二个判断得到的结果都是 MaxSum[n-1] + ValueN[n] 或者 MaxSum[n-1]。

写成这样了之后,看上去好像也是个DP吧…… 不知道有没有高人能给分析分析。

   

要注意Perl系统变量值的变化

忘了专业点的说法怎么叫了,这里说的系统变量就是指那些 $_, $1, $# 之类的默认设置了的变量。一直以来被告诫要注意的是$_这个变量,一个while循环一个if判断什么的,有可能改变它的值。因为一直注意,倒也没遇到太大障碍。

今天栽在另一个变量上了,$1。语句是这样的:

s/$1/$hash{$1}/gi if /(\w+)/;

执行后发现总是被替换为空字符串。难道是 hash里面没值?我于是改成了:

 s/$1/$hash{$1}/gi if (/(\w+)/ && defined $hash{$1} );

结果还是一样。

进行调试,把相关的值都打出来,发现各个值都取得完全没问题,唯独在 s/xxx/yyyy/gi 这步上出错了。

仔细观察了下substitution的形式特征,我想起来xxx这部分可以是regex的,比如我常用来交换位置的那种做法:

  s/(xxx)(yyyy)/$2$1/g

在这样一句中,很明显 $1,$2的值由前面所决定。回到我出错的这句,估计也是这个原因了。第一个 $1,它取的if中的regex捕捉到的内容,第二个 作为hash的key的$1,它取的是xxx这个位置捕捉的内容。(话说xxx这个位置专业点的叫法是啥来着……)。做个实验验证下:

if (/(\w+)/ && defined $hash{$1} ){

  $replacement = $hash{$1};

  s/$1/$replacement/gi;

}

实验通过,这样果然管用。

 

 

Perl的 IO 操作太繁琐了

看来看去,所有提到 Perl  IO操作的地方,都说要用 FILEHANDLE。每次都是 filehandle,用之前要绑定,用完了要解除,烦都烦死了。总共代码没几句,读一个文件就是两句,open一句close一句。读入之后还有个奇葩的 chomp…… 不明白当初设计这样的读取方式是何意。语法糖都这么多了,顺手就把这个换行给去了嘛,非得让人手动来一下。偏偏这个chomp还不返回截掉尾巴后的字符串,只返回截掉了几个。不爽不爽,真心不爽。

还有那个if 后置,既然这样设计了,为啥不到位点呢,直接把 if .... else 都给弄进去得了,比如 xxxxx if yyyyy or else zzzzzz。 那样写起来多流利。如果 or else 这样两个字合起来的不好做,那就搞一个 oresle 这样的嘛。xxx?yyyy : zzzzz 这样虽然也能用,但一看就是抄C的,而且一点也不自然。

如果让我设计 IO 操作的部分,我绝对会设法把 <$filename> 给弄成直接读取文件。现在这表达式给了从命名文件handle中读文件,简直让人吐血。既不容易记忆又没多少人用。反正我看到的大多还是沿用 BARE WORD那种大写字母当 filehandle的形式。至于那个 typeglob,更是捣乱。 <$hash{$file}> 这样就是 typeglob, <$file  > 这样也是typeglob,<$file>却是从名字句柄读文件,这存心就是挖坑让人跳啊。而且 $ 这符号实在是滥用了。 标量用这个,各种reference也用这个,filehandle也要用这个。虽然说后面这些都可以认为是标量,但标量跟标量毕竟是不同的啊,操作方式都不一样,你都凑一起,搞的好像类型很少的样子,掩耳盗铃么?

个税的Oracle一句SQL算法

没啥技术含量,其实就是一个对 model 用法的练习……

WITH AAA AS (
  select 0 AS start_value, 3500 AS end_value, 0.0 ratio from dual
  union select   3500 , 5000, 0.03 from dual
  union select   5000 , 8000, 0.1 from dual
  union select   8000 , 12500, 0.2 from dual
  union select   12500 , 38500, 0.25 from dual
  union select   38500 , 58500, 0.3 from dual
  union select 58500 , 83500, 0.35 from dual
  union select 83500 , NULL, 0.45 from dual
)
SELECT (XX -start_value)*ratio + quick_num FROM (
   SELECT start_value,decode(end_value, 0 , NULL ,end_value) AS end_value,ratio, quick_num FROM (
      select row_number()over(order by start_value) rn,
              nvl(lag(end_value-start_value)over( order by start_value),0)*nvl(lag(ratio)over(order by start_value),0) quick_num,
              start_value, end_value,ratio
        from AAA
) a
  model
   dimension by (rn)
    measures (quick_num,start_value,end_value,ratio) IGNORE NAV
   RULES
     (quick_num[ ANY ] ORDER BY rn = quick_num[cv(rn)- 1] + quick_num[cv(rn)],
      start_value[ ANY ] = start_value[cv(rn)],
      end_value[ ANY ] = end_value[cv(rn)],
      ratio[ ANY ] = ratio[cv(rn)])
)
WHERE XX >= start_value AND ( XX < end_value OR end_value IS NULL )

XX为工资收入扣除各种保险和住房公积金后的数目。总共出现了三个XX,都需要替换。其实做个函数比较好,不过那就不是一句了。

做好第一件事

我曾做过很多计划,结果都成为了泡影。后来我坚持同一时间只做一件事,以免被过多的思绪所阻挠,但是很遗憾,依然失败了。

现在我依然有许许多多的想法,有许许多多的事情想要做,但是我不敢安排了。然而总是躲避这个性格缺陷也终究不是办法,我的人生会虚度的。

那么,就从做好第一件事情开始吧:早睡早起。

这个作息制度对目前的我来说只有好处,没有坏处。如果我想变得健壮一些,活得长一些,生活更正常一些,就应该尽我所能地实现这个作息。

早睡也许做不到,首先就早起吧。天天早起,必然会早睡的。

设定闹钟,不留贪睡时间!第一次听到就起来,以此作为对拖延症的第一战。

Gentoo的udev-mount

编译内核后,发现开机时OPENRC报错,说udev-mount 不能加载啊失败啊之类的。这个问题上次遇到过了,后来上网查了后解决了的,然后又忘记了。于是这次又遇到了,又无解了,只能再查。

现在果断记一笔:

 CONFIG_ DEVTMPFS  = y

mplayer在Gentoo下的默认显示语言

在Gentoo中使用mplayer遇到一个莫名其妙的问题,我的locale一律全是en_US.UTF-8, 输入 "mplayer" ,它给出的回显文字却全是中文的。查看了一下 mplayer 的USE标记,里面也没有任何跟 语言 有关的,安装时也没说要 LINGUAS 的。

我的LINGUAS设置的是“zh_CN zh_TW jp en”,看来看去就这里可能是原因所在,不然的话难道会是 时区? 于是实验了一下,把 LINGUAS 改成了 “en zh_CN zh_TW jp”,然后重新emerge 了一次,再输入mplayer,这次它给的回显就正常了,全是英文了。

这个特性很坑爹,记录一下。

改了个WOW插件-法师自动补全施法材料

开始重操旧业玩起了WOW,只不过这次玩的是法师。法师有三种施法材料:魔粉,传送符文,传送门符文。用光了会被人质疑为不够专业。材料在包裹里20个一组占一个格子,所以一次买的时候最好买齐20个,省的老是回来补。手动买其实也没啥不方便的,不过能自动还是自动吧,懒人自然有懒想法。

这个功能倒是很常见的功能了,从古到今,带这功能的各种插件和宏都流传了不少。不过我这不是没装嘛。特地去为了这点事情而找个东西,实在太费劲了,不如自己直接添上。我在已经装了的一个叫AutoRepair的插件上开始修改。AutoRepair,顾名思义就是自动修理装备用的,修理装备会需要打开商店界面,用到MERCHANT_SHOW这个事件,这样就省得我自己去注册了。

Read more

NLP随手笔记

虽然说记笔记应该有更好的方式,不过懒得折腾了。先在这随便记下吧。

 

Lemma, Wordform  : 一句话中的WORD可以用两种不同的标准来区分。一种是Lemma,一种是wordform。 wordform就是词的形状,而lemma则是词意。比如 am   is  are ,都是一个lemma,但是3个wordform。

Type, Token :倘若以wordform的形式来界定一个词,那么一句话中WORD的数目还可以用两种不同的标准来区分。Type是相同的词都算一个,Token是每个词出现几次都算。所以 "no no no .... it is not possible" 这样的一句话,Type 有5个,Token 有7个。

token常用N来表示,(number of tokens), type 常用V来表示,(|V| 就是 size of vocabulary),Church and Gale 1990年有个统计公式  |V| > O(N 1/2)

这里它还展示了一个 Tokenization, 统计莎士比亚作品中的Token数。 tr 这个命令看上去不错,虽然 依云 说给出的指令组合比较低效,不如awk版的。但是我问他awk版的长什么样,他让我自己去翻wiki……

(note: 翻了下wiki,在词频统计这里,发现了Awk的方法:

 

BEGIN {
    FS="[^a-zA-Z]+"
}
{
     for (i=1; i<=NF; i++)
          words[tolower($i)]++
}
END {
    for (i in words)
         print i, words[i]
}

  这个可能效率上会快些,不过我也没实际time过。但是思路上完全就是两个不同的方向,更类似于专门来解决一个词频统计问题,而不是在遇到一堆文字时顺手所做。tr 的这个结合了管道和多钟工具的方法在思路上就自然多了 )

 

简单的通过正则匹配的 Tokenization 方式 还存在很多问题,比如一些词不好切分,一些词中间带了杂七杂八的符号但却又是同一个。更不用说中文分词这个东西了。 关于中文分词,这边认为,使用Greedy的方式来匹配很有效,不过同样的方法对英文又不适用。

 

Normalization,就是把各种形状的词,按意义统一起来。实际上就是找Lemma。或者说,Lemmatization是一个很好的Normalization的方法。把am is are 都转换成be,那自然就normal了。具体Lemmatization的方法很复杂,不过也有些可以解决部分问题的手段。比如说对于那些一个主干加了不同前缀后缀的词,就可以去掉前后缀,抓住主干。主干叫Stem,各种缀叫Affix。对于英文,有个Porter's algorithm 用于处理各种Affix。可惜这个办法没有任何通用性,而且容易找到例外。

 

Sentence Segmentation, 就是断句。这里讲了一些常用的断句方法,不过我觉得只适用于严肃的英文文本中。它主要基于标点和大小写来判断。通过“决策树”的方式。 决策树是一堆嵌套的if ... else, 这个目测就知道效率不会高。所以实际中也会用到不少其他方法。决策树的效果直接取决于判断条件,也就是features,这里需要记住几个看上去比较有技术含量的Numeric features:

 Length of word with "."

 Probability(word with "." occurs at end-of-s)

 Probability(word after "." occurs at beginning-of-s)

近期的几个在线课程

coursera 2012年的课程开始了。因为同时参加了好多门,所以得列个清单,以免遗忘:

早就开始的:

 Modelthinking https://www.coursera.org/modelthinking/

SAAS https://www.coursera.org/saas/

 

3.12 开始的:  

  NLP  https://www.coursera.org/nlp/

  ALG https://www.coursera.org/algo/

CRYPTO https://www.coursera.org/crypto/

 

3.19 开始:

 PGM https://www.coursera.org/pgm

 Gametheory https://www.coursera.org/gametheory

 

 

大丈夫当如是也

秦王怫然怒,谓唐雎曰:"公亦尝闻天子之怒乎 "唐雎对曰:"臣未尝闻也."秦王曰:"天子之怒,伏尸百万,流血千里."唐雎曰:"大王尝闻布衣之怒乎?"秦王曰:"布衣之怒,亦免冠徒跣,以头抢地尔."唐雎曰:"此庸夫之怒也,非士之怒也.夫专诸之刺王僚也,彗星袭月;聂政之刺韩傀也,白虹贯日;要离之刺庆忌也,仓鹰击于殿上.此三子者,皆布衣之士也,怀怒未发,休祲降于天,与臣而将四矣.若士必怒,伏尸二人,流血五步,天下缟素,今日是也."挺剑而起. 秦王色挠,长跪而谢之曰:"先生坐!何至于此!寡人谕矣:夫韩,魏灭亡,而安陵以五十里之地存者,徒以有先生也."

 

大丈夫当如是也

遇到一段跑起来费解的代码

今天校准数据库的时候,发现了一个执行结果不同的现象。经过定位,发现问题出在下面这段代码上。这段代码的执行结果被一个v_request_num的变量所左右。 v_request_num 越小,最后的结果就越少, v_request_num 越大,最后的结果就越多。如果说单次执行的话,这个是废话。但多次执行,直到将表中数据计算完毕后的结果也是这样,着实费解。

 

Read more

Fundjour的数据结构

先设计好数据结构,然后在数据库里把表建立起来。这样即使前端部分还在写,我一样可以通过直接操作SQL来记录需要记录的东西,可以给前端部分的开发更多的时间。

一条记录的字段应当大致有这样几个:

ID     作为每笔收支的真正的标识符

DATE  日期

TIME   时间

BALANCE  数额

TYPE  币种

IO   收或支,标记一个方向

FT   From/To,记录从哪里来或者到哪里去

USAGE  用途,缘由

日期和时间那里是分开还是合并呢?各有优劣。暂时先决定分开吧,以后看情况。

以上是一条记录应当有的结构。如果建表的话,还需要加入两个字段,一个是表主键,一个是记录的时间。加入表主键而不使用记录的那个ID是因为我想让记录的ID保持紧凑中间不要跳号。表主键就无所谓了。不过这点也许还需要再考虑。 加入记录时间则是因为发生时间和记录时间肯定会不一致的。都在当天也就罢了,要是隔天记录的话,只有一个时间会让统计失去意义的。

最后应当大致如此:

CREATE TABLE fundjour (

  ID  int ,  --- primary Key

  RID int,   -- record id

  DATE  date ,

  TIME  date,

  BALANCE number,

  TYPE varchar,

  IO  int,

 FT  varchar,

 USAGE varchar,

RECORD_TIME date default sysdate  -- 记录时间

)

 

 

准备写个记账用的东西

准备写个记账用的东西,不然不利于培养理财意识。已经半只脚在金融界的了,总得专业点吧。

带图形界面的编程是我的弱项,短时间内根本没法解决,索性回避吧。直接写个命令行操作的,用起来也能更省事更随心所欲一些。

这个东西的要求首先得要足够简洁和方便。每次打字一定要足够少。不然我直接往数据库里写SQL,功能还能更强大更灵活一些。然后得足够地灵活,不要太死板地限制我的输入。虽然多数时候我要求打字少,但也应当支持我话痨的时候。这个东西的功能暂时不需要太多,太多我也想不出来,只要基本的吧。大致应该有以下几个:

1. 资金来往记录的增删查改。

2. 各种分类统计功能。

技术选型还没想好。是把账目都写在文本里面还是弄到数据库里面去也没想好。这个一边做一边考虑吧。先描绘下想要的效果:

1.名字初定为fundjour,命令行输入fdj可调出。

2.调出来的当以 fdj > 打头,其后可输入具体指令操作。

2.1. 操作的指令不要写死,应当有一张列表,可随时修改。

2.2. "fdj > got 3000RMB: expense of Sep."  类似这样的一条表示入账了3000块。冒号后面为原因。这个冒号后面为因由就定死吧,太灵活的话写起来会比较困难。

2.3. 因为操作指令不写死,那么自然应当支持多种同义词。比如说 "fdj > add 3000RMB" 

2.4. 应当支持多点废话,比如说"fdj > I got 3000RMB from company for expense of Septempber"。 这里应当能够正确识别出关键字"got","from","for"。 当然这个要先写到操作指令列表里面去。最前面那个纯废话的"I",应当能被无视。

2.5. 是否应当支持颠倒的顺序呢?还在犹豫…… 比如说 "From company I got 3000RMB as expense of September", 这样的应当可以支持吧,但是那个"I" 在这里会比较碍事。 而另一种比如说"Company paid me 3000RMB as expense of September" 这样的,我暂时没办法解析了。算了,颠倒顺序这点就先砍掉吧,等我在自然语言处理上有所成了再回炉。

3. 应当支持直接以命令方式使用,不需要先行进入fdj > 的shell。 命令方式的格式如下:fdj [detail]。比如说" fdj got 3000RMB "。 如果 [detail]为空白,那么默认显示当前月份的账目。

4. 上面写的时候设想的场景都是增加一条记录的,但这个是最简单的。其他的查删改都要难一些。查的话,关键操作符还是一样,由列表指定,具体查询条件应当支持 (1)时间和时间段,(2)缘由的模糊匹配,(3)大致的类别,(4)金额区间,(5)入账出账,(6)分类统计的输出。 具体怎么实现是个问题,就连怎么区分这6类也是个需要考虑的问题。给六类分别指定个不同的指令么?还是带参数?还是统统写在一起让它自己解析?

5.删除功能不需要太灵活。删除的作用本质上是删掉误输入的记录。就给两种格式吧:(1)删除上N条。或者删除上N至M条,或者删除上N,M,X,Y,Z条,或者多个区间。(2)删除记录的某个ID号,某个ID区间,某几个ID号,某几个ID区间。

6.修改功能还没想好。感觉这东西要按命令行的方式来操作的话有点类似在ed中编辑一样,会很憋屈。要不要考虑把那要改的记录搞进vim里,然后改完保存了再提交回去呢?

7. 各种查询统计,也放到指令列表里,对应到具体的统计方式。这货应当是个不断扩展的,光凭现在想必然没法想全了。到时候想到一个加一个进去吧,方便扩展。

 

从上面看,似乎不用数据库不太现实了。那就弄个数据库吧。前端把字符处理完后,将真正的内容都整进数据库里,然后到数据库里编辑各种统计的业务逻辑,给前端调用,大致就这么个方式吧。只不过这样一来,跨数据库平台就不太好跨了。算了,反正也就我自己用用,不跨也不要紧。SQLite不知道支不支持存储过程,要足够强大的话就用它;要是不行的话就用PostgreSQL。 Oracle虽然好并且我熟悉,但是Gentoo上安装会有麻烦。

前端的输入字符处理会是个难点,具体怎么实现我还得好好想想……

 

 

要有更好的RPG环境设计

玩过很多RPG游戏,网游中2005年后玩的最多的就是WOW了,这一款也足够经典,可以代表很多类似的作品;而单机的,近年的大作基本都没怎么错过。总的来说,游戏是越做越好了,但是总觉得还有不少可以改进的地方。有些可能会耗费很大的成本,乃至当前技术难以实现;有些则完全是设计上的问题。

这里说的RPG,专指欧美类型的。主要特点是想要营造出一个世界的氛围。我对日式RPG那种所谓剧情流完全不屑一顾。要剧情我何必玩游戏,直接看小说/动漫/电影不就得了,还省时省力。而且还老是烦得要死的回合制,非得回合的话,战斗场景做成战棋类的不更好么……

当前的主流游戏,对于环境的互动还是远远不够。各个游戏中,环境的作用基本上还仅仅只是局限在地形限制上,并且单就这一点,做的也并不完美。地形的限制大体可分三种:禁止移动,减速移动,高处落下。其中高处落下这一点在很多游戏中还并未实现,即便是3D游戏。比如说Dragon Age 和 Wizard 。我称之为“伪3D”。既不能跳,又不会掉下去。断绝了某些地方走捷径的念头,也根除了走路不慎直接摔死的危险,让真实性大打折扣。禁止移动则比较常见了,一堵墙,一块石头之类的,都可以做到类似效果。减速移动算是很能体现“地形”的一点,但是实现这一点的游戏也并不多。当然这里说的是地形,要除开中了陷阱之类的意外状况。WOW里面,能体现减速移动的,好像只有在水里,至于雪地之如冬泉谷,泥泞地之如尘泥沼泽,沙漠之如塔纳利斯,以及各种常见的上下坡,对于移动速度都没有任何影响。其他游戏中,完全不能下水的就有一大把,能下水的那些还好基本上都有实现移动速度上的变化,然而其他的地形却一样没能看到什么影响。既然水中能实现,那么这个完全不是个技术问题,而是个设计问题。倘若能实现这一点,那将更有真实感和代入感,玩家在战斗时也会更注意选择有利地形之类的东西。

说到有利地形,不得不吐槽下WOW中脑残的怪物寻路设定。站在山上打山下,怪物居然完全无视地形可以直接穿过山岩来到你面前的。偶尔找到一个通过发挥自己的优势,比如远程之于近身,站在某个怪物无法攻击到的位置,却会被判为bug,着实让人扫兴。我觉得一个好的RPG游戏,应当鼓励玩家通过利用周遭环境而获得尽可能大的优势,因为现实中人们也是这么做的!

 

环境不仅包括地形,还有些别的什么,比如说天气。非常多的游戏还没有天气系统,这些落伍于时代的就不提了。但是拥有天气系统的游戏,也大多只是将其当作一种装饰品,而没有什么实际作用。下雨了,刮风了,下雪了,沙尘暴了……不过是自然景观罢了,对穿行于之中的人物没有任何影响。这未免太假了点。我期望能有这样一个游戏,各种天气状况都会产生实际的作用,下雪了,能让人物受到寒冷的影响;刮大风了,能影响相应的行动;下雨了,能把人打湿…… 可惜到目前为止,还从来没有玩到过。要实现这些,技术上完全没有难度,只是增加几个人物属性维度的问题,当然,也会增加整体复杂性倒是真的。

 

环境中还有各种各样的物品。如何实现与物品的互动算是个大难题。现今的不同游戏有不同的实现方式,直接造成了自由度上的不同。不过受限于技术难度,完美的物品互动没有办法实现。即便自由度如 上古卷轴 这样可以除了主线人物外见谁砍谁的游戏,也没法操作人物用斧子劈了一扇随处可见的门。WOW中,与物品的互动主要通过Loot这一动作来引导实现。开尸体,开箱子,开…… 而其他一些在这点上更主流一些的游戏,会选择 “拾取” 这样一个动作,比如打死怪,地上掉出东西然后捡起来,比如箱子上有个碗,见到后捡起来。也有些是杂糅的,开尸体和开箱子用Loot,捡东西则用拾取,比如上古卷轴。然而无论如何,能互动的物品终究是有限的,划定在一定范围之内的。没打算让你动的东西,是绝对没法动的。这个是RPG游戏中让人沮丧的失真感的主要来源。设想一下,倘若所有的物体,乃至高山乃至地面,都成为可以互动的objects,会是多么让人振奋的事情啊。可惜似乎技术难度太大了点。现今的计算能力也许不足以实现呢。而且还有一个很致命的问题:同一件物品,在现实中可以有很多种不同的使用方式,比如一根棒子,可以当武器进行攻击和防守,可以当延长物去够那些够不着的东西,可以当烤肉架…… 而这个在游戏中会很难实现。特别是要将这世界的所有东西都这么来一下的话,那会是个噩梦。