No wait for email sending via slow SMTP

sunnavy
2011-07-13 07:39:59 +0000

How many seconds do you usually wait after typing 'y' in Mutt to send an email? I wait for 10 seconds or so normally, sigh.

So I chose to speed this up by sending emails to a directory first via sendmail-todir, then doing the real sending via sendmail-fromdir.

First tell mutt to use sendmail-todir

# in .muttrc
set sendmail="sendmail-todir --dir /home/sunnavy/.mail_to_send"

sendmail-fromdir is a bit complex, so we need a config file:

dir: /home/sunnavy/.mail_to_send
smtp_options:
    sasl_username: 'alice@example.com'
    sasl_password: '*******'
    host: 'smtp.example.com'
    ssl: 1
    port: 465
refresh: 3 # loop forever and wait 3 seconds after each loop; 0 means no loop
on_error: /path/to/notify/cmd # the only argument is the error msg
die_on_error: 1 # die on sending error
sendmail-fromdir --config /path/to/config

With this, I don't need to wait any more ;)

Feed RT emails via IMAP

sunnavy
2011-07-12 13:05:45 +0000

RT has a great email interface so users can create/update tickets with their favorite email clients, which requires admin to configure email server somehow to feed emails from users back to RT.

But you may use remote email servers like gmail or alike, in which case you can't do that kind of configuration, this is the situation I'm gonna talk about.

Here comes script rt-imap, which makes use of Mail::IMAPClient and rt-mailgate so you can run it anywhere as long as you have perl and modules rt-imap and rt-mailgate require.

Let's take a simple example (assuming email server supports email aliases):

We use rt@example.com to correspond to and rt+comment@example.com to comment to.

Here is what the config file(default is ~/.rtimaprc) looks like:

imap_options: # args for Mail::IMAPClient->new
    Server: 'imap.example.com'
    User: 'rt@example.com'
    Password: '******'
    Port: 993
    Ssl: 1
    Uid: 1
    Keepalive: 1
    Peek: 1
    IgnoreSizeErrors: 1
rt_map:
    'rt@example.com':
        queue: 'General'
        action: 'correspond'
    'rt+comment@example.com':
        queue: 'General'
        action: 'comment'
rt_url: 'http://rt.example.com'
rt_mailgate: '/path/to/rt-mailgate'
refresh: 3 # loop forever and sleep 3 seconds after each loop; 0 means no loop

after creating the config file, you can run rt-imap:

rt-imap -c /path/to/config

Good luck!

make wireless work by updating r8192e_pci.ko

sunnavy
2010-10-24 02:21:10 +0000

I updated to ubuntu 10.10 64bit recently, and found wireless didn't work any more like it does in 32bit.

after updating r8192e_pci.ko, it works again!

It's sad that I couldn't find updated driver in realtek's official page, luckily I found one via google (thanks, johnfoshay!)

I also attached it here just in case.

here is what I did:

  • tar xvfz rtl8192e_linux_2.6.0014.0401.2010.tar.gz
  • cd rtl8192e_linux_2.6.0014.0401.2010
  • make
  • sudo cp HAL/rtl8192/r8192e_pci.ko /lib/modules/`uname -r`/kernel/drivers/staging/rtl8192e/
  • reboot

Good luck to you too!

Comments
"sunnavy" <sunnavy@gmail.com>
2011-03-29 19:22:11 +0000

if you use a samsung notebook, another way to fix this is adding ppa:voria/ppa and install samsung-wireless, which adds r8192e_pci_realtek.ko.

remember to block r8192e_pci.ko

actually, my wireless gets more stable in this way.

拼音的声调表示

sunnavy
2010-09-11 12:39:11 +0000

前几天写文章的时候突然发现不能很方便地输入拼音的声调,所以写了个小模块来干这件事。

用法很简单,下面是一个输出拼音的例子:

 use encoding 'utf8';
 use Lingua::Han::CanonicalPinYin 'canonicalize_pinyin';
 print canonicalize_pinyin( $_ ), "\n" for @ARGV;

如果输入"wen1", 就会输出"wēn",同理还可以输出"wén"(wen2),"wěn"(wen3)和"wèn"(wen4)

datetime input with jquery.ui.datepicker and jquery.timep...

sunnavy
2010-07-28 05:25:03 +0000

jQueryUI has a great date picker, and there is a great time picker based on jQueryUI.

Sadly, I haven't seen a great datetime picker yet, where the UI is simple and people don't need to click a dozen of times.

I'm not gonna to write a brand new one( I don't have that much of time, and I'm not a js master yet either ;), so I chose to combine the 2 js lib above, and seems that's good enough for me at least for now.

Demo is Here

Perl6之九 - cross and zip operators

sunnavy
2010-07-26 06:06:44 +0000

二者都是元运算符(metaoperator),参数均为列表。

corss的符号是X,后接一个二元运算符,操作类似于集合中的笛卡尔积。

zip的符号是Z,后接一个二元运算符,与corss的区别见例子

e.g.

 1,2 X+ 3,4     # (1+3, 1+4, 2+3, 2+4), i.e. 4, 5, 5, 6
  X~  # 'ac', 'ad', 'bc', 'bd'

 1,2 Z+ 3,4     # (1+3, 2+4), i.e. 4, 6
  Z~  # 'ac', 'bd'

Perl6之二 - sigil

sunnavy
2010-07-25 04:52:39 +0000

与Perl5很不相同的是,sigil不会变化,scalar永远是$,array永远是@,hash永远是%。

e.g.

Perl6:

 my $scalar = [1,2,3];
 $scalar[0];     # return 1
 my @array = (1,2,3);
 @array[0];      # return 1
 my %hash = ( one => 1, two => 2 );
 %hash;      # return 1, equal to %hash{'one'}

等价的Perl5:

 my $scalar = [1,2,3];
 ${$scalar}[0];     # return 1
 my @array = (1,2,3);
 $array[0];      # return 1
 my %hash = ( one => 1, two => 2 );
 $hash{one};      # return 1

同时,sigil的意思也扩展了:

@x可以绑定任何实现了Positional role的对象,%x对应Associative,%&x对应Callable,::x对应Abstraction。$x没有对应的role,所以可以绑定任何对象.

另外,Perl6还增加了secondary sigil (twigil),以用来指代不同作用域的变量:

 $.foo       # object attribute public accessor
 $^foo       # self-declared formal positional parameter
 $:foo       # self-declared formal named parameter
 $*foo       # dynamically overridable global variable
 $?foo       # compiler hint variable
 $=foo       # Pod variable
 $\      # match variable, short for $/{'foo'}
 $!foo       # object attribute private storage
 $~foo       # the foo sublanguage seen by the parser at this lexical spot

Perl6之一 - 注释

sunnavy
2010-07-25 00:12:54 +0000

除了在引号里,"#"总是意味着注释,所以不能再像Perl5一样用作分隔符:

 qq#ok#    # wrong in Perl6

Perl6增加了内嵌注释:

'#`'后跟一对括号

e.g.

 say #`( I'm a comment ) "howdy world"
 say #`(( I'm a comment too )) "howdy world"
 say #`[ I am another comment] "howdy world"
 say #`{{
    multiple line comments
 }} "howdy world"

App::moduleshere

sunnavy
2010-04-23 21:26:25 +0000

used to copy module files(.pm) in @INC to current working directory or somewhere.

it's on CPAN

Perl第二纪

sunnavy
2010-04-21 14:35:52 +0000

昨天JT Smith发表了一篇博文: the second age of perl,宣称Perl 5的第二纪已经开始, 如下是此文的翻译.

Perl的第二纪

多少年了,人们一直在说,Perl已经死了或者说正在死。 我甚至也这么说过,虽然我的意思和字面上的并不一样。

今天我自作主张在此宣布,我们已经在Perl的第二纪了,不过这和Perl 6没有关系!

这并不是说我不喜欢Perl 6/Rakudo,实际上我很喜欢,只是现在我还并不依赖它工作。Perl 5是我们现在所依赖的,我想这种情况还将持续好些年。

我们进入第二纪其实已经有段日子了,只是没有意识到罢了。Tatsuhiko Miyagawa, Ovid, Brian Foy, Stevan Little, MST, DaveRolsky,还有好些巨人(当然,也不能忽略我们这些小人物的贡献,我是说整个社区),他们的工作(以Class::MOP, Perl::Critic, DBIx::Class, DateTime, and Moose作为开端)构成了第二纪的基础。真正带领我们进入第二纪的是在这些基础之上创造的新东西,比如Padre, Plack, MooseX,Mojolicious和Dancer,还有cpanminus,Starman和Dist::Zilla,更别说Strawberry Perl了。

我坐在这里写这篇文章的时候,脑袋里充满了我能列出来的模块和程序,但是第二纪并不只是代码。它也包括各种各样的推广比如PerlBuzz,blogs.perl.org以及Ironman Blogathon,还包括世界各地数不清的YAPC和MiniYAPC。这是Perl Mongers的再次振兴,这是新的Task::*规则,这是新的Perl 5.12的发布规则。这也是Enlightened Perl之类正在做的。

我们现在正在未来的悬崖边上,自然不能吃老本,但是可以抽点时间来赞美一下在过去这几年里我们所做出的成绩。我们成功避免了成为“过时语言”的危险,并且再次成为主流。是时候该做更多的创新了,是时候去创造一些让Ruby,Python和其他语言想抄的工具和应用了。这就是Perl的正则表达式成为事实标准的原因,也是这些语言极力想建立自己的“CPAN”的原因。让我们做更多的创新让它们去抄吧。

Perl6之十六 - closure traits

sunnavy
2006-12-07 16:54:03 +0000

``trait"是一个比较新的词汇(起码对于我来说),Perl6里有好几个地方都用到这个词。中文直译过来是“特性”,我觉得也差不多是这个意思。通常在说明一个东西某方面的性质时便会用到这个词。在OO中,我们还将看到这个词。

之前我们看到的CATCH block就是它所在的block的一个trait。此外还有好些,比如BEGIN, INIT,LEAVE,NEXT,END等等都是block traits

之前说的Perl6中模拟Perl5 continue {}便可以使用NEXT block来完成

Perl6之十五 - exception

sunnavy
2006-12-06 16:08:05 +0000

先说一下eval。Perl5中的eval接受两种参数,一个是EXPR,一个是BLOCK。Perl6中eval只接受前一种形式(EXPR),后一种形式将有个新名字try。

Perl6的exception和别的语言不太一样。对于一个block,如果你需要进行异常处理,那么就在这个block里面放上一个CATCH block(其实它也是个closure trait)。

异常处理其实是个switch语句,只不过这里的主题是那个异常对象(Exception object)$!(还记得么?之前说过switch是个主题化的方法)

Perl6之十四 - switch

sunnavy
2006-12-05 16:20:29 +0000

Perl6将有``switch"语句,但keyword可不是switch和case,而是given和when。因为``switch"其实一种主题化(topicalizing,语言学里的概念)的方法。

e.g.

 given EXPR {
     when EXPR { ... }
     when EXPR { ... }
     default { ... }
 }

when后面跟的EXPR是smart match(更强大的模式匹配)。given block里并不要求全是when。

跟C语言的switch还有一个很大的不同:在满足一个条件,执行完对应的语句后就直接退出given block,而不是向下继续执行。(还记得在C语言的switch里我们要写多少break么?呵呵)。

Perl6之十三 - loop

sunnavy
2006-12-04 17:06:58 +0000
  1. continue block没有了。

新方法:在loop block里放一个NEXT block(其实是个closure trait,以后会讲,;-)

  1. do while没有了。

改用repeat while。跟do while不同的是,repeat while可是真正的loop block,因此可以使用next, last,redo等等。

e.g.

 repeat {
     say 'bla,bla';
 } while $foo > 0;

还可以这样:

 repeat while $foo > 0 {
     say 'bla,bla';
 }

do {} 这种形式将被当做do-once loop,和Perl5中的bare block等价。

  1. for分叉了。

类似于C中的for的用法被loop取代,for只有剩下的那一种意思(即和foreach等价),于是,foreach就被舍弃了(我不用foreach已经很多年了,嘿嘿)。

Perl6之十二 - if

sunnavy
2006-12-03 18:02:16 +0000

if和Perl5里的基本没什么区别,除了在Perl6中条件部分的括号可以省略了。其实不止if,绝大部分控制语句中相应的“条件部分”的括号都可以省略了。

e.g.

 if $foo eq 'Bilbo' {
     say 'Bilbo loves smoke-rings';
 }

Perl6之十一 - block

sunnavy
2006-12-02 16:05:56 +0000

我们最常看到的block就是被{}包起来的那部分,一个文件也是一个block。block都是闭包(closure)。

在block里声明的lexical变量(比如my声明的)不会泄漏到block外面去(除非你做一些手脚)。

Perl5里的local函数被改名作temp,而且行为上还有些细微差别:temp声明时不会undef变量。

e.g.

 $_ = 3;
 {
     temp $_;    # $_ still is 3
 }

Perl6里增加了一个let函数,和temp基本一样,区别在于只有在block非正常退出后变量才会恢复之前的值(比如抛出异常,Scalar环境中返回undef),否则将会保持这个新值。

Perl6之十 - feed operator

sunnavy
2006-12-01 16:28:13 +0000

feed operator就像UNIX里的管道(pipe),只不过这个管道里面流的是列表。符号是==>或==

e.g.

 @result = map { floor( $^x / 2 ) },     # It's Perl6 where comma is needed.
           grep {/^ \d+ $/},             # so is this
           @data;

也可以这样写:

 @result == map { floor( $^x / 2 ) }
         == grep {/^ \d+ $/}
         == @data;

或者这样:

 @data ==> grep {/^ \d+ $/}
       ==> map { floor( $^x / 2 ) }
       ==> @result;

Schwartzian Transform应该能用的上这个,;-)

Perl6之九 - cross operator(obsolete)

sunnavy
2006-11-30 15:49:10 +0000
newer version is here

cross operator也是metaoperator的一种。符号是XX参数为列表,对它们进行permutation操作,类似于集合中的笛卡尔积。

e.g.

 1,2 X+X 3,4     # (1+3, 1+4, 2+3, 2+4), i.e. 4,5,5,6
  X~X  # 'ac', 'ad', 'bc', 'bd'

Perl6之八 - reduction operator

sunnavy
2006-11-29 16:46:17 +0000

reduction operator也是metaoperator。符号是[],作用有点像FP中的fold函数。

e.g.

 [+] 1,2,3       # 1+2+3, so we get 6
 [-] 1,2,3       # 1-2-3, get -4
 [~] 'foo','bar' # 'foo' ~ 'bar', get 'foobar'
 [] 1,2,3       # 1  2  3, get True;

Perl6之七 - hyper operator

sunnavy
2006-11-28 16:44:17 +0000

首先解释一下metaoperator。就我的理解,它就是可以和别的运算符一起协作来干些事情的运算符。

今天要说的Hyper运算符就属于metaoperator

符号是>>或者,它对列表中的每一个元素在标量环境中操作,返回新生成的列表。e.g.

- (1,2,3) # (-1,-2,-3)

(1,2,3,4,5) >>+ (1,2,3,4,5) # (2,4,6,8,10)

1 2