阿呆's profile♡残缺的虚与实♡PhotosBlogListsMore Tools Help

阿呆 布衣

Occupation
Location
Interests
浮生若梦,我爱,何者是实,何者是空,何去何从!

Windows Media Player

♡残缺的虚与实♡

▒▒▒▒▒▒ 生命中所有残缺的部分,本是生命中不可或缺的内容 ▒▒▒▒▒▒

未曾开始

        这里很久没有更新,有时甚至想不起这里了,或许是已经习惯在校内说着写着痛痒无关的话题,或者发着时不时的闷骚,也或许是自己越来越懒,我想更或者的原因,是自己没想过说出或者写出自己的内心。直到真正想说心里话的时候,才会想到这里。突然觉得,这里和校内,其实跟朋友很相似。有的朋友,每天说着闹着,但是都是在谈论一些无关痛痒的事情,没有谁会吐露自己真正的心声。而有的朋友,平时不怎么联系,或者平时也不怎么想起,但是真正想说话的时候,总会首先想起。
        话题扯远了。
        这次更新是为了纪念一下一份心情,未曾开始,却已夭折的心情。我不知道下次更新是何时,不过我想写写的时候,总会来到这里。
        喜欢上一个女孩,第一次碰见是去年入学时的9月,在某区教育超市。后来在宿舍楼下碰到,知道了她住我们对面的宿舍楼。不过故事的开始就这么着,平淡无奇。有时候会在图书馆碰到,甚至有时坐在临近的桌子,不过我还是没有去搭讪的勇气。故事就这么继续着,也许不应该叫做故事。我不知道她的名字,不知道她的学院,我对她一无所知,我对于她,不过是路人乙。只是偶尔碰到时,我会回头多看看几眼,然后转过身,仰望着天空,继续自己的路程。我们就像这个城市里太多的陌生人,偶尔相遇,不过始终是陌路人,擦肩后,还是朝着自己的方向,继续各自的生活和故事。有时候也会偶尔萌发上前搭讪的冲动,不过还是被自己的理智扼杀在萌芽里。
        故事发展到这里,我从来没想过怎么去改变抑或争取。我有想过改变,不过我甚至不知道自己该去改变什么,或者争取什么。这样研究生第一学期的生活很快结束,第二学期又开始。第二学期,课程少了,实验室的事情多起来,开始每天泡实验室。一个意外,在xx食堂看到了那个熟悉的身影,那个在我脑海中驻足了半年我甚至连名字都不知道的身影。我没有任何的不平静,还是像往常一样,远远的多看几眼,仅此而已。漫不经心地,和一个哥们儿提起她,不料却造就了后来的故事。
        这哥们儿以前是x院的,人际关系比较广,问我要不要打听她的联系方式。我淡淡的笑,摇了摇头。其实我心里想,不过不知道为什么,我不想去打破这个局面。人总是有一种恐惧的心理,害怕打破一种僵局,换来的却是另外一种的死局。与其死局给人以绝望,倒不如僵局还可以给人以慰藉的希望。我怀着这种遥远的希望,拒绝看到眼前的绝望,这就是人,不知道是愚钝还是聪明,也不知道该值得悲哀还是庆幸。不过我确信我不是一个人聪明的人,至于值得悲哀还是庆幸,众说纷纭吧。哥们儿骂我缩,我还是笑笑回应。不过这哥们儿特别仗义,和另外一个同样仗义的哥们儿,替我做了决定。当然,凭着他们的关系网,很快知道了这个女孩的几乎所有信息。我虽然嘴里说着,但是心里还是很想知道关于她的一切。于是,她所有的联系方式开始进入我的通讯录,QQ,手机……在哥们儿的怂恿下,我加了她的QQ,不过,开始并没有通过验证,知道后来先加了校内,后来才加上了QQ好友。
         我已经记不得加了几天后才开始和她第一次说话,我是一个犹豫的人,就是那种宁愿揣着遥远的希望,拒绝看到眼前绝望的人,要不是哥们儿们的怂恿,或许我还停留在第一学期那种远远看着她的状态。第一次QQ上聊天的过程很短,她恢复很慢,也很简洁明了,我可以理解,毕竟,我对于她,还是一个陌路人。手机里一直存着她的号码,每次翻开通讯录,都会去看看那个号码,看到甚至能熟记于心,不过我知道,自己是不会拨打出去或者发一条短信的。我觉得还是应该让她自愿的把号码告诉我,才可以在手机上进行通讯,我说了,我是一个古板的人。第二次QQ聊天,终于勇气问了她的手机,虽然我早已经有了她的手机,不过她亲自告诉了我,这样我发起短信来会让我觉得踏实。
          故事几乎还是老样子,不过偶尔发发短信。我们还是陌生人,活在不同的世界。我一直在给自己一个借口,约她出来正式认识一下,因为我觉得好像她在明处,自己在暗处,自己这样很不诚意,也不礼貌。于是终于在某天晚上约了她一起从实验室回宿舍。见面的过程很快,开始我还比较紧张,不过轻松的交谈让我没了压力。她是一个让人感觉很亲切的人,她的一笑一颦,都是那么让人难以忘记。迈出了第一步,并不代表我有了充分的勇气。用我朋友的话来说,我还是一如既往的缩,不过心里开始筹划着怎么去了解,怎么试着改变故事。因为我知道,我应该去争取什么了。
          后来又约过两次晚上一起从实验室回宿舍,路上还是很轻松,我们谈论着无关痛痒的话题。后来送了一份小礼物给她,纸折的一朵玫瑰,用信纸写了几句祝福的话语,折成好看的形状,把纸玫瑰黏在上面,一起送给了她。她收到后发了短信,说礼物很精致,我的字也很漂亮,反正就是感谢的话语。心里还是很开心,虽然不知道她的想法,但是我知道自己的想法,也知道自己在做什么,想争取什么。我计划每个周末给她送一朵纸折的玫瑰,直到某一天,或者可以表白了,也或许不到某一天,就不用再折了,再折也是多余。只是没想到后面这个某一天来得这么快。又是一周后,也就是今天了,我花了一个晚上的心思,折了一朵更完美的玫瑰,特意买了粉色的纸折玫瑰,绿色的纸作为枝叶,为了这些原材料,我忙活了一个下午。不过看到成果,心里的滋味总归是甜的。又现照着教程,折了一个好看的信封,写了一首小诗和一些祝福的话语,放进信封里。做好这些,我对着它们发呆,我有种预感,也许我怀揣的遥远的希望,要被眼前的绝望替代了。不过我跟我朋友说,不过结果如何,我去做我觉得自己应该做的,我做了,我努力争取了,我不会后悔;如果不去做,不去争取,那多年以后想起,都会是遗憾。
          事实证明,我的预感是真的。晚上托人送到她宿舍楼后,一直没有收到她的短信。后来洗过澡准备睡了,在校内上发现了她的留言。内容就不说了,核心意思是她开始不知道我的意思,而她也是一直有男友的,希望和我只是普通的朋友。是的,我从来没有问过她,或许是我根本不想问吧,只想把自己想做部分做完,也算了却一桩心愿,不让思念在心里堵得慌。这个故事基本上到此为止,我的生活,曾经因为她而停顿,现在也会继续。也许在某个天朗气清的早上,抑或阴霾浑浊的午后,更有可能的是,是在某个没有月亮和星星的夜里,我会想起她,想起这段往事。
          再见面,还是朋友,是的。只是,我没有了对看到眼前绝望的恐惧,也不会再因为怀揣一个遥远的梦想暗自伤神,天还是蓝的,一切一如既往,一切云淡风轻。

          后记:我一直是一个犹豫的人,要不是得到一帮哥们儿的怂恿和帮助,也许根本就没有这段故事,也许我还是像以前一样,从遥远的地方看着她的身影足以。不过故事既然有发展,我觉得我应该把它继续下去,不管是一个什么样的结果,总不能半途而废,凡事尽力尽心,这是我的原则,对得起自己,也对得起哥们儿们的一番苦心。这也许就是后面我的勇气的根源。现在故事结束,对自己是一个交待,对朋友的苦心也是一个交待。我从来不强求什么,有些事也强求不来,不过我仍然会为她祝福,也把这段故事留在人生的回忆里。
          下一次的更新不知道是什么时候,不过这里是我的老友,有心事总会来找它诉说的。



彼岸花开的时候

     前两天突然在宿舍楼下发现了几株不起眼的石蒜花,也就是所谓的彼岸花。其实它还有一个更好听的名字——曼珠沙华。刚发现它们的时候,才长出花茎,连花苞都没有。我忽然才意识到这已经是九月,彼岸花开的季节。
     在去年的这个季节,我还从未听说这种花,更是未见过。认识它,因为一个故事,故事有开头,却没有结尾。关于彼岸花,有一个凄美的传说,那是关于曼珠和沙华的故事,我不打算在这里细说了。不过在大多数人的印象中,彼岸花代表着分离,绝望或者死亡——花开叶落,花殒叶生,花和叶永世不得相见。
     每天路过,我都会去特意跑去看一下那生长在石缝边上的生命。昨天一天的阴雨连绵后,突然发现它们已经含苞欲放了,而在早上一场暴雨过后,它们迎来了灿烂的绽放。
     想起自己曾经信誓旦旦的要挖一株回去种养,现在想想,幸好没有这样,它们不属于谁,也不属于我。生长在彼岸,就注定了孤独,注定了等待,它们的妖艳,是不可能被谁占有的。不过总归有一些惋惜,开得如此的妖艳,却抵不过花期的短暂,香消玉殒后,也不过是石缝间一株不起眼的小草。那时,还有谁记得曾经的灿烂。

石缝间的生命,我并不觉得它们代表绝望,相反,我觉得那是一种力量,充满坚强。 20080905387


昨天的雨中,它们已经含苞欲放。
20080905388 20080906393


生命终于绽放,如此的妖艳,却没有绿叶的衬托。
花开了一千年,也无法与叶相见一面,你们还要继续等待吗?
20080906390 20080906391


彼岸花,名字就注定了孤独。如此的美丽,却只能在彼岸观望。
当你的火红散落土壤,谁会记得你曾经的妖艳?
20080906392

如何叫我不想你

如何叫我不想你
只为那次仓促的相遇
我屏住呼吸
可以听见心跳的旋律
脑海中的那个笑容
你是如此的美丽

Windows下学习Perl

Technorati 标签: ,,,

     Advanced Perl Programming看到了GUI部分,突然对Perl/Tk产生兴趣,后面的章节暂时也不想看了,所以就开始看Mastering Perl/Tk。编程这东西,光看是不行的,又嫌每次开虚拟机麻烦,所以就想直接在Windows下搞Perl,以前装过ActivePython,所以理所当然的选择了ActivePerl。
     另外,一个好的编辑器是不能少的,还是喜欢vim,所以装了个Windows下的vim,试了下,跟Linux下的没啥区别,蛮好,而且配置文件基本上都很全,不像我的Ubuntu下还得自己配置。然后又觉得Windows自带的命令行十分的郁闷,支持的命令太少,还很死板,于是找找看有没有类似于Linux的Shell这样东东,没想到人家Microsoft早在06年就做了一个叫PowerShell的命令行解释器,虽然总感觉没有Linux的Shell环境爽,不过能用就好了。貌似2.0还没1.0好用,所以就装了1.0的,还支持中文,哈哈。还在网上下载了一个叫PowerShell Plus的东西,基本上就是PowerShell封装一下,有了个好看的界面。不过感觉有时候会很卡。
     一切准备工作就绪,不过发现用ActivePerl的ppm安装模块时总是出错,我看了下ppd文件,好像配置没什么问题,可是就是会报The PPD does not provide code to install for this platform这个error,Google了一下,终于找到了解决办法。原来我下载的是5.10的模块,需要把含tar.gz包的文件夹MSWin32-x86-multi-thread-5.10改成MSWin32-x86-multi-thread-5.8,并修改ppd配置文件(5.10改成5.8),然后ppm install xxx-xxx-xxx.ppd就行了。要卸载一个模块的话只需要简单的使用ppm uninstall xxx::xxx::xxx就好了。
    把APP中的俄罗斯方块的例子跑了一下,于是也想试着用Perl/Tk做一个GUI的应用程序。以前都是简单的用在脚本上,初步设想是做一个游戏,用TCP/IP实现网上对战,一个选择是俄罗斯方块或者扫雷,另外一个选择是PACMAN(又是PACMAN-_-||)。这纯属个人兴趣,当然,如果能做出来,那Perl很多高级的东西应该都比较熟练了。不过应该等暑假了吧,不知道到时候还会不会这么热情高涨呢。哎,还是先忙毕设吧:(

PERL HACKS学习笔记三——Debugging

Technorati 标签: ,,

20. 快速定位编译错误
在某行前添加__END__标记,这可以使得Perl忽略后面的所有代码。

21. warn()要优于print(),是因为它默认转到STDERR,这使得它可以独立的重定向。

22. 当数据结构比较复杂时,比如有引用存在时,一般的print不能胜任,需要使用FreezeThawData::Dumper两个module
FreezeThaw可以将复杂的数据结构转换成可以打印的ASCII字符串。下面是一个例子,
freeze()函数返回一个简单的字符串,thaw()是freeze()的逆操作:($c, $obj) = thaw ($msg);
---------------------------------------------------------------------------
use FreezeThaw qw(freeze thaw);       # Import freeze() and thaw()
# Create a complex data structure: a hash of arrays
$c = { 'even' => [2, 4, 6, 8],
        'odd' => [1, 3, 5, 7]};
# Create sample object
$obj = bless {'foo' => 'bar'}, 'Example';
$msg = freeze($c, $obj);
open (F, "> test") || die;
syswrite (F, $msg, length($msg)); # can also use write() or print()
---------------------------------------------------------------------------
Data::Dumper可以将复杂数据结构直接以漂亮而简洁的方式打印出来
---------------------------------------------------------------------------
use Data::Dumper ;
# Create a complex data structure: a hash of arrays
$c = { 'even' => [2, 4,],
        'odd' => [1, 3,]};
# Create sample object
$obj = bless {'foo' => 'bar'}, 'Example';
$msg = Dumper($c, $obj);
print $msg;

---------------------------------------------------------------------------
这将打印出这样的形式:
$VAR1 = {
          even => [
                    2,
                    4
                  ],
           odd => [
                    1,
                    3
                  ]
        };
$VAR2 = bless( {
                  foo => 'bar'
               }, 'Example' );

23. 利用注释调试
利用CPAN模块Smart::Comments可以将注释转变成调试语句,具体的讲,就是某些特定的注释可以用来开启或者关闭调试语句。
使用Smart::Comments时,任何由三个或者更多个#开头的注释语句将变成调试语句,并把注释的所有内容都送到STDERR。
---------------------------------------------------------
use Smart::Comments;

my $call = "26,17,22,hun!";
### $call;

my @play_calls = split /\s*,?\s*/,$call;
### @play_calls

---------------------------------------------------------
这样,运行的时候就可以打印出$call和@play_calls。而当你不再需要的时候,只需简单的注释掉use Smart::Comments就可以了。

24. 利用Smart::Comments可以构建断言的注释,如下面这个例子:
---------------------------------------------------------
use Smart::Comments;

my $call       = "26, 17, 22, hut!";
my @play_calls = split /\\s*,?\\s*/, $call;

#### require: @play_calls = = 4
---------------------------------------------------------
这样的断言注释只在断言出错的时候产生报告。注释不仅报告失败,还会自动报告测试中使用了的所有变量,因此可以
查处断言出错的原因。如上述程序将产生一下报告:
$ perl play_book_with_assertion.pl

### @play_calls = = 4 was not true at play_book_with_assertion.pl line 7.
###     @play_calls was: [
###                        '2',
###                        '6',
###                        '1',
###                        '7',
###                        '2',
###                        '2',
###                        'h',
###                        'u',
###                        't',
###                        '!'
###                      ]

注意:上例中的require前面使用了4个#代替3个#作为注释标识。使用不同数目的#使得可以选择开启和关闭smart注释。
你可以在模块加载时明确指定注释标识的#个数。如:
--------------------------------------------------------------------
use Smart::Comments '####';   # Only ####... comments are "smart"
                              # Any ###... comments are ignored

my $call       = "26, 17, 22, hut!";
### $call

my @play_calls = split /\\s*,?\\s*/, $call;
### @play_calls

#### require: @play_calls = = 4
--------------------------------------------------------------------
这样,只有最后一个断言的注释是smart注释。

25. 通过源代码开启或者关闭Smart::Comments比较麻烦,可以在命令行直接使用,或者使用shell别名:
$ perl -MSmart::Comments split_test.pl
如果要自定义#个数
$ perl -MSmart::Comments="####" split_test.pl

26. Perl可以显示警告和错误的行数,但是不能显示出错行的源代码,下面这个SourceCarp模块可以简单的实现这个功能:
--------------------------------------------------------------------
package SourceCarp;

use strict;
use warnings;

sub import
{
    my ($class, %args) = @_;

    $SIG{__DIE__}  = sub { report( shift, 2 ); exit } if $args{fatal};
    $SIG{__WARN__} = \\&report                         if $args{warnings};
}

sub report
{
    my ($message, $level)  = @_;
    $level               ||= 1;
    my ($filename, $line)  = ( caller( $level - 1 ) )[1, 2];
    warn $message, show_source( $filename, $line );
}

sub show_source
{
    my ($filename, $line) = @_;
    return '' unless open( my $fh, $filename );

    my $start = $line - 2;
    my $end   = $line + 2;

    local $.;
    my @text;
    while (<$fh>)
    {
        next unless $. >= $start;
        last if     $. >  $end;
        my $highlight   = $. = = $line ? '*' : ' ';
        push @text, sprintf( "%s%04d: %s", $highlight, $., $_ );
    }

    return join( '', @text, "\\n" );
}

1;
-----------------------------------------------------------------------------
使用这个module方法如下:
-----------------------------------------------------------------------------
#!/usr/bin/perl

use strict;
use warnings;

use lib 'lib';
use SourceCarp fatal => 1, warnings => 1;

# throw warning
open my $fh, '<', '/no/file';
print {$fh}...

# report from subroutine
report_with_level( );

sub report_with_level
{
    SourceCarp::report( "report caller, not self\\n", 2 );
}

# throw error
die "Oops!";
-------------------------------------------------------------------------------

27. $.变量记录文件的当前行。$!记录由系统出现的错误信息

 

       +-------------------+            .:\:\:/:/:.
       |   PLEASE DO NOT   |            :.:\:\:/:/:.:
       |   LOOK AT ME        |           :=.' -   - '.=:
       |   OTHERWISE        |           '=(\ 9   9 /)='
       |   YOU WILL BE       |              (  (_)  )
       |   SWEPT OFF         |             /`-vvv-'\
       +-------------------+            /             \
                   |  |      @@@          /   /|,,,,,|\   \
                   |  |      @@@        /  _//   /^\  \\_ \
@x@@x@      |  |         |/          WW(  (   )  )WW
  \||||/         |  |        \|              __\,,\ /,,/__
   \||/           |  |         |           (______Y______)
/\/\/\/\/\/\/\/\//\/\\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

21天养成一个习惯

     不知道从哪里听来的21天养成一个习惯,于是从4月10号早上开始,每天早上坚持8点起床吃早饭,昨天终于功德圆满。其实差不多在半个月的时候,每天早上已经可以不用闹钟自然醒了,而吃早饭的习惯,也早已养成。以前几乎都是一天只吃两顿,即使偶尔9点或者更早起来,也不回去吃早饭,所以刚开始的时候吃早饭很不习惯,吃了早饭中午就不想吃了。不过一个不到一个星期,终于可以每天吃三顿饭了,慢慢的规律逐渐正常,看来这21天真的有效果。
     21天真的可以养成一个习惯吗?
     其实只要用心去做,有毅力去坚持,用不了21天,一样可以养成一个习惯;相反,如果不用心,更多个21天要养成一个习惯都难。关键在于生活的态度。我也不知道当初怎么来的想法,可能是想让自己生活更健康有规律一点吧,不想浑浑噩噩的度过最后这个学期。
     享受着每天早上踏着阳光去东区食堂吃酸辣粉和油条的乐趣,享受着吃完早饭后去看书的惬意。每天做毕设,隔天下午去打球,这期间还自学了Perl和Python,无聊了就玩玩吉他,唱唱一些老掉牙的歌曲,所有的这些,慢慢的让我的生活充实,没有太多的快乐,也不伤悲,一直这样,很平静,也许这就是我所追求的。
     每次去实验室都喜欢走过去,把mp3的音量开得很大很大,听不到周围所有的声音,然后早上踏着阳关走去,晚上吹着凉风回来。有时候也会难过,总是想起一些人,想知道他们在做什么,有没有像我这样想起我。快乐真的很快就过去了,几个月前我们还每晚熬夜,畅谈良久。不过我一直都很清楚,自己只不过是她寂寞和无聊的时候一个倾听者,在她生命最脆弱的时候给了她那么一点点温暖。虽然早就会想到,可是我还是不介意,陪她熬夜,度过黑夜的海;为了她的生日,学折纸玫瑰;保存着我们所有的聊天记录,网上和手机的……是的,就像她说的,不是没有给我机会,只是自己无法勇敢,无法自信的面对。我给了自己一个套,使劲的往里面跳,而且不想出来,真是可笑。其实应该是可悲!

    21一天可以养成一个习惯?要是21天不思念一个人,那以后真的可以就不思念了吗?只是如何能21天不去思念呢。。。

Another step

     今天终于解决了毕设一个持续多天的问题。
     修正了部分bug后,前仿都比较顺利,除了外设的指令,基本上都进行了仿真,还欠缺的是一个比较完整的测试向量。因为要交中期报告,所以准备把功耗分析跑一遍,把Switching Power,Internal Power及各个模块的power分析一下。可是在进行后仿的时候,总是不行,出现了很多莫名的未知态出现,本以为是频率问题,可是频率一再降低,都只跑10M了,还是不对,没办法,只得一个个模块的分析,看波形。差不多了搞了五六天,很是郁闷,一点进展都没有。后仿通不过,后面的工作都得滞后,那几天,每天坐在实验室电脑前,做着重复性的工作,修改——综合——仿真——看波形——再修改,虽然没什么进展,但是工具倒也熟悉了不少。
     最初是怀疑RTL代码里写的延时语句的问题,后来才发现其实频率已经只有50M左右了,周期是20ns,而所有的延时语句最多不过是2ns,半个周期都不到,应该不会影响到时序的。排除这个问题后,又开始了漫长的signals tracing。一直以为很多国外牛人写代码都是相当规范的,不过看了这个51的RTL,我实在不敢恭维。又修改了几处可疑的地方,终于有了眉目,两个关键的问题是PC模块里的一个寄存器未赋初值和敏感列表的问题。
     上午在实验室再次后仿, ROM的程序终于跑了起来,不过跑到2000ns左右的时候就又出现了问题。再次信号追踪,追踪到了ACC模块里,后来才发现仿真时出现了Timing violation。但是把频率降低到20M后,又出一个看上去更致命的问题,仿真不到100ns就over了。正当想放弃的时候,看着一片红色的波形,突然觉得这个CPU好像根本就没工作起来嘛,连第一个PC值都不对,才想到reset的时间一直没有变。因为以前跑的是100M,周期是10ns,所以rst信号在20ns即两个周期后复位,这样不会出现任何问题,但是频率降到20M后,20ns还不到半个时钟周期,这使得cpu还未完成初始化rst信号就复位了,所以信号全是红色的。把rst信号改在150ns后复位,终于OK了。一个困扰一周的问题终于解决,下面的工作也可以开始起来了:)

     综合是是一种硬件行为,所以不同于RTL仿真,很多在前仿中不会出现的问题,到了后仿里面,就会一个接一个的出来,所以写RTL的时候应该尽量接近硬件行为,写出可综合的代码。
     另外,通常debugging都是一件非常烦的事情,尤其是这样一个大的设计,光波形就好几百条,所以需要一定的耐心,更需要技巧,工具的,编辑器的技巧都要不断的学习。

PERL HACKS学习笔记二——User Interaction

13. 程序中的交互
(I)第一种方法
------------------------------------------
print "> " if -t *ARGV && -t select;
while (my $next_cmd = <>) {
    chomp $next_cmd;
    process($next_cmd);
    print "> " if -t *ARGV && -t select;
}
--------------------------------------------
-t选项检查其文件句柄是否连接到了终端。这种方法存在问题:ARVG文件句柄会在第一次阅读操作时神奇的开放,如果在开始提示前已经至少操作了一次<>,那AVRG句柄就不会再开放,因此-t *AVRG测试就会出错。

(II)使用CPAN模块可以轻松完成
---------------------------------------------
use IO::Interactive qw( is_interactive );

print "> " if is_interactive;
while (my $next_cmd = <>) {
    chomp $next_cmd;
    process($next_cmd);
    print "> " if is_interactive;
}
----------------------------------------------

(III)IO::Interactive模块还有一个接口可以简化用户的操作,不再需要进行显示的相互作用测试
-----------------------------------------------
use IO::Interactive qw( interactive );

print {interactive} "> ";
while (my $next_cmd = <>) {
    chomp $next_cmd;
    process($next_cmd);
    print {interactive} "> ";
}

-----------------------------------------------

14. 使用prompt()进行交互
---------------------------------------------------------
use IO::Prompt;

my $offset = prompt( "Enter an offset: ", -integer );
---------------------------------------------------------
与上述代码等效的基础代码为:
---------------------------------------------------------
my $offset;
print "Enter an offset: " if is_interactive;
GET_OFFSET:
while (<>) {
    chomp;
    if (m/\\A [+-] \\d+ \\z/x) {
        $offset = $_;
        last GET_OFFSET;
    }
    print "Enter an offset (please enter an integer): "
        if is_interactive;
}
---------------------------------------------------------

15. prompt的-req选项
使用-req选项可以自己定制要求的何种输入,比如要求user输入一个16进制数:
----------------------------------------------------------------------
my $hex_num = prompt( "Enter a hex number> ",
          -req => { "A *hex* number please!> " => qr/^[0-9A-F]+$/i }
          );
print "That's ", hex($hex_num), " in base 10\\n";

----------------------------------------------------------------------
可能的输出为:
Enter a hex number> 2B|!2B
A *hex* number please!> C3P0
A *hex* number please!> 124C1
That's 74945 in base 10

测试可以是regexes(必须匹配),也可以是subroutines(以$_开头接受输入满足约束条件时返回真的子程序)。例如:
-------------------------------------------------------------------------
my $factor = prompt( "Enter a prime: ",
                     -req => { "Try again: " => sub { is_prime($_) } }
                   );
-------------------------------------------------------------------------

16. prompt()支持只接受字母y或者n的约束条件
-----------------------------------------------------
if (prompt -YESNO, "Quit? ") {
    save_changes($changes)
        if $changes && prompt -yes, "Save changes? ";
    print "Changes: $changes\\n";
    exit;
}

------------------------------------------------------
第一次调用prompt要求用户输入以Y或者N开头的word,忽略其他类型的输入并返回附带的说明;
第二次调用prompt,使用了-yes参数,可以接受任何输入,但是只有以y或者Y开头,prompt才返回为true,其他情况返回为false
可能的运行结果如下:
Quit? q
Quit? (Please enter 'Y' or 'N') Y
Save changes? n
Changes: not saved

17. 使用prompt的单一字符选项
-one_char选项可以使第一个键入的字符完成整个输入操作(不需要再键入回车键),如
--------------------------------------------------------
for my $file (@matching_files) {
    next unless prompt -one_char, -yes, "Copy $file? ";
    copy($file, "$backup_dir/$file");
}

--------------------------------------------------------
如果想要接受更多范围的单一字符,可以使用-req选项来操作正则表达式,比如:
-----------------------------------------------------------------------
my $drive = uc prompt "Select a drive: ",
                      -one_char,
                      -req => { "Please select A-F: " => qr/[A-F]/i };

-----------------------------------------------------------------------

18. 用prompt进行用户口令的交互
使用-echo选项可以隐藏输入的口令,比如:
------------------------------------------------------
my $passwd = prompt( "First password: ", -echo=>"" );
------------------------------------------------------
上述什么也不输出,也可以选择输出与实际键入不同的东西,下列中输出*号:
--------------------------------------------------------
my $passwd = prompt( "Second password: ", -echo=>"*" );
--------------------------------------------------------

19. 用户交互中的菜单选择
使用prompt的-menu选项可以在创建交互式菜单,主要分为三种情况:
(I)普通的交互菜单
---------------------------------------------------------
my $device = prompt 'Activate which device?',
                    -menu =>
                    [
                        'Sharks with "laser" beams',
                        'Disinhibiter gas grenades',
                        'Death ray',
                        'Mirror ball',
                    ];
print "Activating $device in 10:00 and counting...\\n";
---------------------------------------------------------
可能产生的输出如下:
Activate which device?
  a. Sharks with "laser" beams
  b. Disinhibiter gas grenades
  c. Death ray
  d. Mirror ball
> q
(Please enter a-d) > d
Activating Mirror ball in 10:00 and counting...

(II)菜单索引(关键字)
-----------------------------------------------------------------
my $device = prompt 'Initiate which master plan?',
                    -menu =>
                    {
                        Cousteau => 'Sharks with "laser" beams',
                        Libido   => 'Disinhibiter gas grenades',
                        Friar    => 'Death ray',
                        Shiny    => 'Mirror ball',
                    };
print "Activating $device in 10:00 and counting...\\n";

------------------------------------------------------------------
这种方式下创建交互式菜单只显示keys的选项,而prompt返回的却是key对应的value值。
注意:第二种方式实际上是一个hash,而第一种实际上是一个列表(数组)!
这段代码运行的结果为:
Initiate which master plan?
a. Cousteau
b. Friar
c. Libido
d. Shiny
> d
Activating Mirror ball in 10:00 and counting...

(III)菜单及其子菜单
将第一种(列表)和第二种(hash)结合起来,可以创建交互式的菜单及其子菜单
-------------------------------------------------------------------
my $device = prompt 'Select your platform:',
                    -menu =>
                    {
                        Windows => [ 'WinCE', 'WinME', 'WinNT' ],
                        MacOS   => {
                                     'MacOS 9' => 'Mac (Classic)',
                                     'MacOS X' => 'Mac (New Age)',
                                   },
                        Linux   => 'Linux',
                    };
--------------------------------------------------------------------
注意到列表使用[],而hash使用的是{}!
输出结果如下:
Select your platform:
a. Linux
b. MacOS
c. Windows
> b

MacOS:
a. MacOS 9
b. Mac OS X
> b

Compiling for Mac (New Age)...

总结:用户交互可以使设计的程序更加友好,这些技巧在以后的设计中都是跟有用的

       +-------------------+            .:\:\:/:/:.
       |   PLEASE DO NOT   |            :.:\:\:/:/:.:
       |   LOOK AT ME        |           :=.' -   - '.=:
       |   OTHERWISE        |           '=(\ 9   9 /)='
       |   YOU WILL BE       |              (  (_)  )
       |   SWEPT OFF         |             /`-vvv-'\
       +-------------------+            /             \
                   |  |      @@@          /   /|,,,,,|\   \
                   |  |      @@@        /  _//   /^\  \\_ \
@x@@x@      |  |         |/          WW(  (   )  )WW
  \||||/         |  |        \|              __\,,\ /,,/__
   \||/           |  |         |           (______Y______)
/\/\/\/\/\/\/\/\//\/\\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

PERL HACKS学习笔记(一)

1. 查看函数文档
perldoc -f func_name
例如要查看substr的使用及其参数信息,perldoc -f substr

2. perldoc的-q选项可以用来操作正则表达式,如perldoc -q "Perl ?6"

3. 将perldoc生成HTML格式的文档
perldoc -oHTML -dperldoc.html perldoc
-d
选项是确定目标文件名

4. -l选项可以找到置顶的模块(或者文档),并且以文本显示。
perl -l Test::Tutorial
-m
选项可以在页故障处理程序中显示指定模块或者文档的文本
perldoc -m Test::MockObject

5. bash和tcsh在配置rc文件时,bash中所有的"="在csh中为空格,比如配置环境变量,alias等

6. 需要在自己的用户环境下设定一些特殊命令,只需要在.bashrc或者.cshrc中添加"source ./.aliases"命令,
并在"~"目录下建立".aliases"文件,在该文件中,设定这样的命令:
alias custom_command='shell command'
比如 alias reperl='perl -de0'
注意:在csh中应为 alias reperl 'perl -de0'

7. 当安装多个版本的perl时,可以这样设置
alias newperl='/usr/local/bin/perl5.8.8'
alias lodperl='/usr/local/bin/perl5.6.2'
在不同的perl版本之间切换。不同版本的模块也可以这样使用

8. 需要传递参数的命令。比如需要查找模块的版本信息,以查看CGI::Application模块的版本信息为例,
需要键入 perl -MCGI::Application -le 'print CGI::Application->VERSION'
为了简化工作,有两种方法:
(I)可以在.bashrc里用一个函数来替代这个过程:
function pmver () { perl -M$1 -le "print $1->VERSION"; }
(II)在aliases文件中绑定命令:
alias pmver="perl -le '\$m = shift; eval qq(require \$m)
  or die qq(module \"\$m\" is not installed \\n); print \$m->VERSION' "

采用任何一种方法,然后以pmver开头运行 pmver CGI::Application

9. 在Vim里自动完成Perl标识符
在文件中已经键入过一次某个标识符,下次需要输入这个标识符时,只要输入前几个字幕,然后俺几下CTRL-N就可以找到想要的名称了。
Vim中标识符的定义没有Perl中广泛,所以需要修改.vimrc文件:
set iskeyword+=:

10. 自动查找标识符
向.vimrc中添加如下行:
set complete+=k~/.vim_extras/file_that_lists_every_installed_Perl_module
然后编写perl脚本生成包含模块名的文件file_that_lists_every_installed_Perl_module
---------------------------------------------------------------------------------
#!/usr/bin/perl
use File::Find 'find';

# Where to create this list...
my $LIST_DIR  = "$ENV{HOME}/.vim_extras/"
my $LIST_FILE = "file_that_lists_every_installed_Perl_module";

# Make sure the directory is available...
unless (-e $LIST_DIR ) {
    mkdir $LIST_DIR
        or die "Couldn't create directory $LIST_DIR ($!)\\n";
}

# (Re)create the file...
open my $fh, '>', "$LIST_DIR$LIST_FILE"
    or die "Couldn't create file '$LIST_FILE' ($!)\\n";

# Only report each module once (the first time it's seen)...
my %already_seen;

# Walk through the module include directories, finding .pm files...
for my $incl_dir (@INC) {
    find {
        wanted => sub {
            my $file = $_;

            # They have to end in .pm...
            return unless $file =~ /\\.pm\\z/;

            # Convert the path name to a module name...
            $file =~ s{^\\Q$incl_dir/\\E}{ };
            $file =~ s{/}{::}g;
            $file =~ s{\\.pm\\z}{ };

            # Handle standard subdirectories (like site_perl/ or 5.8.6/)...
            $file =~ s{^.*\\b[a-z_0-9]+::}{ };
            $file =~ s{^\\d+\\.\\d+\\.\\d+::(?:[a-z_][a-z_0-9]*::)?}{ };
            return if $file =~ m{^::};

            # Print the module's name (once)...
            print {$fh} $file, "\\n" unless $already_seen{$file}++;
        },
        no_chdir => 1,
    }, $incl_dir;
}
--------------------------------------------------------------------------------

11. 安装CPAN模块Perl::Tidy,可以自动净化代码;

12. 在Vim里运行测试文件,添加如下行到.vimrc文件中:
map ,t <Esc>:!prove -Iwork/ -v %<CR>
然后可以键入",t"来运行正在编辑的测试文件

PERL HACKS学习笔记之——序言

Technorati 标签: ,

     露营没去成,改成了在紫竹烧烤,不过也还好玩,不过可怜我的手,那天跟思政老师比猛——单手俯卧撑,当我为突破自己纪录做了10个而沾沾自喜的时候,李老师一下做了30+个,硬是让我愣傻了。昨天又做了一天的苦力,逛超市,拿东西。。。现在真是手无缚鸡之力了!
     哎,不知道这毕业旅行要等何年何月了。
     今天没去实验室,下午研究了下昨天借的PERL HACKS,果然很不错啊,Perl学了有段时间了,用了5天时间看完Learing Perl,也写了几个稍微复杂的脚本,把8051内核的仿真平台建了起来,后来就没写过什么程序了。准备研究Advanced Perl Programming,不过在这之间想先研究下Perl的风格与一些工作技巧,用Chromatic(Perl Hacks作者)的话来说,提高生产效率嘛。不过觉得俺也不是专业的程序员,所以风格暂时用看(Perl Best Practices),就先研究一些使用的技巧啦。
     中期报告还没写,五一还得去实验室研究毕设的东西,想真做点什么东西出来了再写,不然都是空谈,嘛意思也没有。郁闷,不过用老师的话来说,嗯,呆在学校是最安全的,哈哈~~~

     下面的日志是一些学习笔记,坚持每天记至少10条吧。

毕业旅行之——行前准备篇

     这几天搞毕设真是郁闷,后仿一直不对,整个周末在实验室没一点进展,可怜我还这么拼命。不过还好,明天要出去玩了,美名其曰毕业旅行,是想给自己一个机会放松一下,后来接着做郁闷的毕设。      本来五一去黄山的,不过想到这是大学里最后一次机会和大家出去玩,在一起的时间不多了,以后真的是各奔东西,所以不能放弃这次毕业旅行的机会。我也不是一个伤感的人,
但是有些东西还是值得珍惜,值得为以后留下一段难忘的回忆。
     另外,露营也是第一次,比较有吸引力:)          
     下午开了个出行前准备会,领队人很nice啊,也比较幽默,希望这次大家都能顺利,玩得开心~

我们的装备

28042008087 

领队示范搭好的帐篷

28042008086

领队在给大家讲解行程安排及注意事项

28042008085 

28042008089

我的包(很沉的,今天下午打了球,不知道明天有没有力气啊-_-|||)

28042008088

晚上去超市买点零食和煮的东西,路上就靠我们老大了:)

不过我可怜的毕设,想起这个就郁闷。。。。不管了

51汇编的一点知识

     这两天做内核的仿真,学习了下51汇编,今天又有一个发现。 

     8051的指令中没有DB这条指令,但是实际上编译器里面有,其实就是一个data table,用来调试蛮方便的。

     另外,又学习到一个地方是51汇编中大于等于A0的所有数前面都必须加0,否则会和标号冲突,直接导致编译通不过!浪费了半个多小时编译一个简单的代码-_-!!

没有感觉的日子

     最近两天真是萎靡,前天突然开始咳嗽,一直咳了两天,喉咙里奇痒无比,尤其是晚上,好难受。
     看了一天的英文文献,头好晕,晚上加了件毛衣,一个人出去走了走。其实心里比较失落,没有人关心,其实也习惯了这么久,而不习惯的只是这种感觉。
     有时我想,自己真的还算是个好人,对人都不错。一直都乐意为别人付出,虽然有时也期望回报,但却从不计较。我想,好人总归有好报吧。
     还是咳嗽的厉害,于是回了宿舍。胡小蝶问我怎么怎么回事(QQ签名),还是她首先注意到,呵呵。她真的是个不错的朋友。
     胡小蝶抱怨了下自己的爱情,每周只能见一面,觉得自己很孤独,我说你知足了吧,像我们还一直光棍着呢。是的,人是贪婪的动物,当得到一些东西的时候看到的只是更好的,而看不到没有拥有的人的苦楚。
     听说樱花开了。而今天发现,玉兰花已经凋谢了。
     听说研究生都毕业了,我们也不远了。

如何追逐你的美丽

     周一是和导师见面的例会,早上起了个早,把衣服洗了,坐上了9点50的校车。
     校车会绕着整个校区基本上转了一周,沿途可以欣赏交大美丽的风景,只是我不用坐这么久,风景,一段即可。每次在校车上都很觉得惬意,尤其是这样阳光的早晨,享受阳光,享受百看不厌的风景。
     经过电信楼群外的桥头,透过校车的玻璃窗,眼前出现一道风景:一个穿着橙色衣服的女生,伫立在桥头写生,左手托着下巴,右手在画板上画着。校车里的人都向女生看去,不知道是在看女孩还是她的画。
     又想起了小番,我想她写生时会不会也是这个样子,那是一道别有的风景,阳光,微笑,画板还有她。没有看到过,却可以想象,只可以想象。
     收起心里的遗憾和嘴角的微笑,应该前行,是的,你也在前行,如何追逐你的美丽,只是一场虚幻而已。

写简历找实习

     毕设开题报告已经完成,还没做PPT。。。
     最近想找点实习来做,主要是想挣点小钱,有机会也出去玩玩,看着有几个同学每天200RMB的实习工资,真是眼馋。
     不过不能拿出太多时间实习,毕竟毕设才是大头,脚本控制没学好,仿真平台也没建好,毕设不好好做,都没脸混下去了!
     花了一天时间做好了中英文的简历,慢慢开始搜寻中意的单位实习,充实一点好,不然每天懒散的作毕设,这样不好不好。
     忽然发现几个月没更新这里,这居然是2008年的第一篇日志,faint~~~我真是太懒了
 
 
感谢访问!微笑
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.
Photo 1 of 24
No list items have been added yet.
No list items have been added yet.