标签/Tag为[Perl]的文章 [ 1/3 ]

Perl eval 和 $SIG{__DIE__} ,

一般来说, Pel 中的 eval 可以捕获异常。 至少我是这样用的: 用来尝试运行一些操作,要是出错了也不会退出。 比如我经常用 Image::Info 来判断一个图像文件是否真的是图像,但是服务器上是否有 Image::Info是个问题。 简单概念代码如下:

code eval("use Image::Info qw(image_info);");
if ($@ eq "")
{
my $info = image_info("$tmpfilename");
if ($info->{error} eq "Unrecognized file format"){
$esB::base->error("该文件不是合法的图片文件。");
}
}

由于 eval 的存在, 如果系统没有 Image::Info ,那么简单的跳过判断,并不影响程序的继续执行。。

直到有一天, 我决定用 $SIG{__DIE__} 来自定义程序的的出错信息。 一样,概念代码如下

code $SIG{__DIE__} = \&esb_die;
sub esb_die {
my $error = shift;
$error =~ s!$ENV{'DOCUMENT_ROOT'}!/{you_root_dir}/!i;
my ($msg, $path) = split " at ",$error;
print "Content-type: text/html\n\n";
print qq~
<html>
<head><title>Easun CGI Error</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
</head>
<body >
<font size='6' color='#333366'>Easun CGI Error</font>
<hr size='1' color='#000000' noshade>
<font size='3' color='#00000'>
很抱歉,程式因为以下错误而异常退出:
<br><br><b>$msg</b><br><br>错误大概发生在: <font color='#000099'>$path</font><br><br>
<font size='3' color='#990000'><b>请注意,为了保证您的安全,您的程序的真实路径已经被程式自动过滤。</b></font>
</font>
</body></html> ~;
exit();
}

该操作也达到预期目的。

但是,当这两者同时运行时,$SIG{__DIE__} 居然捕获到了 eval 内的 $@ 。当系统没有找到Image::Info 时候,程序不再默默跳过继续执行。而是直接跳出到自定义错误页面。
信息如下

很抱歉,程式因为以下错误而异常退出: Can't locate Image/Info.pm in @INC (you may need to install the Image::Info module) (@INC contains: ./config ./ShareLib ./ D:/usr/site/lib D:/usr/lib .) 错误大概发生在: (eval 10) line 1.

如何协调这两者,是个问题。。。

记录下来,作为备忘。

--EOF--

Warning: Default SSL_verify_mode deprecated 的解决办法 ,

由于 Vultr VPS 默认是禁止程序通过 sendmail 发邮件的。另外 sendmail 发的邮件通常是被一些邮箱当作 spam 处理的。

所以, 我的 MT 是通过设定 stmp 服务器和用户名、密码认证登陆到 mail.qq.com 发送邮件。 简单配置如下:

config # in mt-config.cgi
EmailAddressMain UserName@QQ.com
MailTransfer smtp
SMTPServer smtp.qq.com
SMTPUser UserName
SMTPPassword MyPassword
SMTPAuth ssl

这个配置可以正常工作。。。

[MT Plugin]全新改写的 Markdown 解析插件 ,

一直在用 Markdown 写Blog。
总觉得貌似解析效率有点不高。何况引入 代码高亮 后,处理代码显示是个问题。

检查了 MT 自带的 Markdown 解析插件 ( plugins/Markdown/Markdown.pl ) , 原来是 John Gruber 2004 写的第一版。

My God , so oooold。。。

John Gruber 这个原代码写的很经典, 但是究竟很老了。。

[JS随笔]网站评论、显示界面细微调整和杂谈 ,,

随笔写下一些东西,作为 SiteLog 和备忘。

都是一些评论、显示界面的调整,一个意图:用户体验。 说的不好听的就是"路杨的强迫症又犯了",反正是折腾无极限。。

这两个月, 整个 Blog 的 js 估计被我修改过不下10次,有些是纯粹为了闭包,有些是为了美观和清晰流程。。。

简单记下曾经的修改吧。

先说前端:

  1. ajax提交优化。 所有流程彻底闭包为一个函数,和 json 显示本地评论互动,增加了提交成功后如果通过审查的话,动态加载新评论及动画,并同时重置评论提交表单。
  2. 多说评论界面优化。 绑定了原来系统的显示/隐藏评论、 显示/隐藏评论框的函数,让原来界面的操作同时操作两个系统的界面。 在 SOTHINK 的提示下,虽然依然设置多说评论框为默认,但是登录本地系统(包括QQ等本地系统支持的社交帐号)的朋友则显示"本地评论系统评论框"。 代码片段为:

    codevar check_mt_user = function(u) {
    if(typeof duoshuoQuery.is_ds_hide =='undefined') {
    if (!u) u = w.mtGetUser();
    if (u && u.is_authenticated) { duoshuoQuery.is_ds_hide=true;}
    else duoshuoQuery.is_ds_hide=false;
    }
    };
    
  3. 本地json评论界面优化。 彻底完成本地评论js的闭包。进一步和多说评论界面糅合, 增加了刷新 和 重载 两个操作界面,前者从本地文本静态json cache中重新获取本地评论,后者读取 MySQL 库实时获取本地评论。

  4. 延迟加载图片重写。 也完成了一次JS闭包。 美化了延迟加载图片时候占位的动画,因为目前本站仅在评论者头像上使用延迟加载图片技术,也许大家并不能彻底体验到界面的加载过程(因为加载的太快了)。。。

上面的所有修改,均可以查看本站现有 JS 来获得代码。 本站的 JS 并无加密 :P

再说后台:

  1. 彻底解决了QQ头像、Gravatar 头像显示问题。 并缓存Gravatar 头像到本地。 不同原来的做法。这次写 插件,直接 hook 了 MT::Author::userpic_url 。 比较极端的做法。 代码如下:

    codeour($old);
    {
    no warnings 'redefine';
    no strict 'refs';
    require MT::Author;
    If ($old = MT::Author->can('userpic_url')) {
    *MT::Author::userpic_url = sub{
    my ($author) = @_;
    if ( ($author->auth_type =~ m/^QQ/ ) && $author->hint && ($author->hint=~ m!^https?://!) ) { return $author->hint. '#QQ' ;}
    my ($oldurl) = $old->(@_);
    return $oldurl if ($oldurl);
    my $email = $author->email;
    return &_hdlr_gravatar_url_mail($email);
    };
    }
    }
    
  2. 更换了后台插入图片后的显示,适应 HTML5。 这个没有写插件,直接Hacklib/MT/Asset/Image.pm 中的 can_html 。 更加的简单粗暴。 代码片段如下:

    code$text = sprintf(
    '<figure class="post-image"><img title="%s" src="%s" %s %s /></figure>',
    MT::Util::encode_html( $asset->label ),
    MT::Util::encode_html( $asset->url ),
    undef,undef,
    );
    

要查看详细的修改文件,可以移步到我的 GitHub。

其他:

话说,多说 服务器维护了。 貌似以为会好一点,结果似乎结果一样? 另外,多说评论加载不出来时候,下面的加载动画一直显示的时候, 这个时候刷新就OK了,觉很奇怪, 查看了一下 log。 结果,100% 的在出现这个状态的时候,浏览器报错:

17:24:55.691 Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://easun.duoshuo.com/api/threads/listPosts.json?thread_key=301&author_key=1&url=http%3A%2F%2Feasun.org%2Fblog%2Farchives%2Fgodaddy_cpanel_perl_dbdmysql.html&title=Godaddy%20cPanel%20%E4%B8%BB%E6%9C%BA%E5%92%8C%20Perl%E6%A8%A1%E5%9D%97%20DBD%3Amysql&require=site%2Cvisitor%2Cnonce%2Clang%2Cunread%2Clog%2CextraCss&site_ims=1442293934&lang_ims=1442293934&referer=http%3A%2F%2Feasun.org%2Fblog%2F&v=15.4.27. (Reason: CORS header 'Access-Control-Allow-Origin' missing).1

干啥子嘛~~
明显的服务器响应问题。。。
判断跨域的服务端脚本的得到没有执行。。
其实listPosts.json 返回数据了,可惜被浏览器拒绝了。 难怪不显示。。。。。。
话说,抛开 服务器 判断跨域的服务端脚本的问题。 listPosts.json 难道一定要用 JSON 模式? 又不是 POST, GET 而已,换成 JSONP 模式不就万事大吉了,而且也能节省服务器的判断跨域,输出 Access-Control-Allow-Origin header。。。。。。

另外,服务器维护了, 貌似脚本的版本还是 2015-04-27 。。。。

--EOF--

Godaddy cPanel 主机和 Perl模块 DBD:mysql ,

纯粹是手闲惹的祸。

Godaddy cPanel 主机已经用了几个月了,越发觉得慢了。。 又看见别人的 MT 貌似都很快? 于是决定: Reset cPanel hosting account to its origina 。 也就是删除所有文件重新建立一次。。。

于是乎,备份, 重置。。 重设管理员账号,MySQL账号,重新绑定域名。。
嗯,焕然一新,cPanel 的地址变了, IP 地址也变了。 空空如也的空间貌似感觉快了????

恢复 MySQL 数据库,恢复 Movable Type 文件。。。准备进 Movable Type 后台。。等等。。。居然出错了:

Your server does not have DBD::mysql installed..

怎么可能? Linux 服务器没有安装 DBD::mysql 模块? 这个不是标配嘛? 上次安装一点问题都没有的。 看来这次的主机真够*干净*的。。
算了,自己装吧, 进 cPanel 安装。 继续运行,依然报错。查看了一下 @INC,呃,不包含自己安装的 Perl 路径 。查看帮助:

Using Your Perl Module(s)

您的 Perl 脚本需要知道如何查找您的路径中的模块。 可通过将以下两选项之一添加至脚本顶部来完成此操作:

#!/usr/bin/perl use cPanelUserConfig;

或者

#!/usr/bin/perlml

My GOD,让我一个个修改文件吗? 算了,还是换个思路,修改 MT.pm,写入@INC,一劳永逸 。

打开 lib/MT.pm, 增加

codesub set_cpanel_lib
{
my $mt = shift;
my $g_path = '/MYPATH/TO/SITE/';
my @mylib = (
$g_path.'perl5/lib/perl5',
$g_path.'perl5/lib/perl5/x86_64-linux-thread-multi',
$g_path.'perl/usr/local/lib64/perl5',
$g_path.'perl/usr/local/share/perl5',
$g_path.'perl/usr/lib64/perl5/vendor_perl',
$g_path.'perl/usr/share/perl5/vendor_perl',
$g_path.'perl/usr/lib64/perl5',
$g_path.'perl/usr/share/perl5',
);
push @INC, @mylib;
}

找到 sub init_paths,在其中增加 $mt->set_cpanel_lib();。 OK,运行之,准备进了后台, MT 一切正常。。。。

既然在 Cpanel 后台,绑定子域名,设定 Cron 作业 等等, 慢着,又不对了。 在面板上明显的写着: 资源等级 1 。。

我的神捏,记得很清楚上次我化15$升级到了 资源等级 2 呢。。。。

只能找客服了,可惜居然没有 Email 客服, 在线 Chat 又一直显示Offline, 越洋电话? 算了吧。。 直接发 Email 到 support@godaddy.com ,很快自动回复。大意:我们不在接受 Email 咨询。。

GoDaddy Customer, it looks like you emailed our team with a question or comment. We no longer provide support via email. Please try one of these two support options.

• Visit our Help Center for guides, articles and more. • Call our support team around the clock at (480) 505-8877

只好改天看看是否可以 在线 Chat 了。。

流水账,写下一次不是很愉快的重置账号过程。

--EOF--

[Perl]缓存 Gravatar 头像到本地服务器 ,

This is a sitelog of Easun.org.

Logo_Gravatar.png

一直在用 多说 的 Gravatar 头像镜像服务器, 最近不知道怎么的。 这个服务器经常返回 503 ,于是乎,本地评论的朋友头像又不显示了。

虽然最近貌似检测到 cn.gravatar.com 显示正常。 但是为了安全,还是选择最后一招吧: 缓存头像到本地服务器。。。。。

Perl 代码貌似很简单, 机制: 缓存7天,7天后删除重新下载。。 当然,因为CDN 的存在,也许你换了头像,14天后本站才会更新:(7天本地缓存。7天CDN缓存)。

记录下修改的 Perl 代码片段:

[MT Plugin]QQ互联插件-用QQ账号登陆您的MT ,

QQ互联插件-用QQ账号登陆您的MT

( QQ Connect Commenters Plugin for Movable Type )

Authors: 路杨 (EasunLee) Copyright 2015 Easun.org. License: Artistic, licensed under the same terms as Perl itself

qq_login.png

概述

MT QQ互联插件 (QQ Connect Commenters plugin for Movable Type) 允许用户用 QQ 号码登陆你的 Movable Type 博客。
本插件严格使用 QQ互联 的 Open API 编写。安全可靠。 它可以给您的博客带来良好的用户体验。 一旦使用这个插件,评论者可以自动获取QQ昵称、头像等资源。

请注意: QQ互联 (QQ Connect)官方使用的机制是审核制度,并不是使用这个插件就直接可以使用QQ登陆。 您需要去 QQ互联 (QQ Connect) 官方注册您使用本插件的网站并获取属于自己的 APPID 并提交审核。审核过程可能需要1周或者更长时间。

关于 QQ互联 (QQ Connect) 的注册,请 百度 之。或者读取官方资料: http://wiki.connect.qq.com/。

运行环境

  • Movable Type 4.2 或者更高版本
  • JSON::XS 2.0 或者更高版本
  • jQuery (非必需,建议)

Movable Type 的 extlib 中已经包含了必需的 JSON:XS 版本。

安装

  1. 下载并解压本插件。

  2. 复制(上传) QQCommenters/mt-static 下的内容到 /path/to/mt/mt-static/

  3. 复制(上传) QQCommenters/plugins 下的内容到 /path/to/mt/plugins/

  4. 登陆您的 Movable Type 后台 -> Plugin Settings 去设置您的 QQ APP ID 和 APP KEY。

  5. 在 后台->Registration Settings -> Authentication Methods 中选启用 QQ 。
  6. 在前台选择登陆,您会看见 QQ 登陆 的选项已经有了。 如果您的网站通过审核,可以之直接使用了。

关于 QQ互联 功能的申请

关于 QQ互联 功能的申请,简单减少一下流程:

  1. 用您的QQ账号登陆 http://connect.qq.com/intro/login 并申请网站接入。
  2. 详细描述您要接入的网站信息。请注意 回调地址 一定要填写为*您的Movable Type 后台 CommentScript 的完整地址,并且带上 http:// 或者 https:// 的前缀*。比如 (http://your_domain/cgi-bin/mt/mt-comments.cgi)。
    可以设置多个回调地址,用 分号 分开即可。 QQ互联 (QQ Connect) 的官方APP帮助文档 写的像浆糊一样,而且处处错误。这个地方官方文档写就是有问题。
  3. 腾讯 的QQ 登陆审核一个要求,就是登陆页面要设置 醒目的QQ登录入口。而我们的前端如果不做修改的话,会很简洁,这个就需要自己在前台放端代码。 简单的分享一下我的一些前端 JS 代码:

[随笔]Movable Type 的数据库瓶颈与多说评论反向同步 ,

随笔 而已,能力所限,只是个人看法。

就向大家看见的这样,由于多说服务器的原因,路杨正在逐步把 多说的评论写回本地 Movable Type 的数据库。

过程不算难。通过 API 获得 JSON 数据,分析后写入MT评论数据库罢了。 为了区分和拓展,给 MT 数据库的评论表增加了3行,分别记录 远程服务器名(remote_service),远程服务器ID (remote_id) 和 UA ( agent)。

mt_db_table_comment.png

开始直接 Perl 脚本。核心代码为

[JQ+Perl]JQ AJAX跨域请求HTML/JS页面内容总结 ,

路杨有2个域名,easun.org easunlee.org 统统指向同一个地址。
而小站的 blog 主页 的分页获取是通过 jQuery 的AJAX完成的。 见抓图。
index_15_6_5.png

核心代码为自写。如下:

codefunction ajax_get (url, mode,callback)
{
var sdiv = $("#search-results");
if (!sdiv) return true;
$.ajax({
url:url,
data: {'format':'js'},
success: function(data){
if ( data.error == null ){
if (mode == 'append') sdiv.append(data.result.content);
else sdiv.html(data.result.content);
if (data.result.next_url) { next_url = data.result.next_url; }
else { $('#show-more').hide(); }
return false;
}else { location.href = url;return true;}
},
error:function(req, status, obj){ location.href = url; return true;},
beforeSend: function(xh){ /*do sth before send*/ },
complete: function(xh){ /*do sth for complete*/ } ,
});
}

其中url 为本站后台地址,大致为:
http://easun.org/{path-to-mt}/mt-search.cgi?IncludeBlogs=2&archive_type=Index&template_id={main_index_tmp_id}&page={num}

加上format=js参数则为JSON结构, 返回的数据大致为

code{"error":null,"result":{"next_url":"下一页的地址","content":"本页展示数据"}}

如果出错,则在本页面打开没有 format=js 参数的完整 HTML 版本。

但是,这个脚本还是有问题的。

如果以域名 http://easun.org/blog/ 访问,则毫无问题, 一旦用 http://easunlee.org/blog/ 则基本上不能完成。 不用说后期路杨打算给后台设置不同的子域名。
原因很简单: ajax 不能跨域。(当然某些BT 的 ie 版本正常跨域,汗。)

有没有办法解决这个问题呢?

研究了一番,发现使用 jQuery 的 JSONP 方式即可完成。
即让后台返回的数据为

codemycallback( {"error":null,"result":{"next_url":"下一页的地址","content":"本页展示数据"}} );

当然需要修改核心代码,让 $.ajax 工作在 JSONP 下:

codefunction ajax_get (url, mode,callback)
{
var sdiv = $("#search-results");
if (!sdiv) return true;
$.ajax({
url:url,
data: {'format':'js'},
dataType: "jsonp", /*定义dataType*/
jsonpCallback:"mycallback", /*定义jsop 回调函数*/
success: function(data){
if ( data.error == null ){
if (mode == 'append') sdiv.append(data.result.content);
else sdiv.html(data.result.content);
if (data.result.next_url) { next_url = data.result.next_url; }
else { $('#show-more').hide(); }
return false;
}else { location.href = url;return true;}
},
error:function(req, status, obj){ location.href = url; return true;},
beforeSend: function(xh){ /*do sth before send*/ },
complete: function(xh){ /*do sth for complete*/ } ,
});
}

不用担心返回的 JSONP 数据在 success: function(data) 中无法解析,只要定义了
dataType: "jsonp",jsonpCallback:"mycallback", 则 success: function(data)中的 data 自动为 JSONP 中包含的 JSON数据。 而不是 JSONP 数据串。
现在的问题,是后台的 mt-search.cgi 不具备输出 JSONP 格式的能力, format=js 只能输出 JSON 格式,这个时候如果不想修改 mt 代码。则只能通过自己写的脚本(Perl)来中转了。

[Perl]本站使用的文本缓存Tag搜索的Perl脚本 ,

Movable Type 的资源瓶颈基本上都是mt-search.cgi 。

不管是站内自定义搜索,还是按照Tags进行查询,都调用的是这个脚本。

本站灵感来之 AnySQL 的文本缓存。 但是不同于 AnySQL 的一直是独立的cgi文件进行缓存,配合.htaccess 和默认搜索慢板完成。

这次更新后台,这个独立cgi脚本也做了小的逻辑修改。

特共享之,供有动手精神的同好自我完善。

代码如下:

[Perl]一段cookie操作的封装代码

顺手写下,防止忘掉。
草稿,估计定稿不会是这个 :D
原因: 网站下同时存在多个相同的程序的副本,但是并不想 cookie 相互影响;
代码如下

###---- cookie By EasunLee 2012-03-11--------###
sub get_cookie_path
{
if ($esB::INFO->{'COOKIE_USED'} eq 1) { $esB::INFO->{'cookiepath'} ='';}
else {
my $boardurltemp = $esB::INFO->{'BBS_URL'};
$boardurltemp =~ s/http\:\/\/(\S+?)\/(.*)/\/$2/;
$esB::INFO->{'cookiepath'} = $boardurltemp;
$esB::INFO->{'cookiepath'} =~ s/\/$//;
}
$esB::INFO->{'cookiepath'} ;
}
# 设定cookie
sub set_cookie_str
{
my ($name,$value,$expires) =@_;
&get_cookie_path() unless ( defined ( $esB::INFO->{'cookiepath'} ) ) ;
my $prefix = $esB::INFO->{'cookie_prefix'} ;
$esB::CGI->cookie(-name => $prefix.$name, -value => $value, -path => $esB::INFO->{'cookiepath'}.'/', -expires => $expires);
}
# 读取cookie
sub get_cookie_str
{
my $name =shift;
&get_cookie_path() unless ( defined ( $esB::INFO->{'cookiepath'} ) ) ;
my $prefix = $esB::INFO->{'cookie_prefix'} ;
$esB::CGI->cookie (-name => $prefix.$name) ;#, -path => $esB::INFO->{'cookiepath'}.'/');
}
#### End cookie subs

[Perl]关于 NDBM_File 的奇怪事

准备把本站的 Tag索引 写入 DBM ,折腾了一段Perl 小程序,使用了 NDBM_File 模块, 结果稀奇古怪。

代码如下;

#!/usr/bin/perl -w
use strict;
use CGI;
my $tagdir ='/blog/tag';
my $q = CGI->new;
print $q->header(-charset => 'utf-8');
use NDBM_File;
use Fcntl;
&do_tag_db();
sub do_tag_db
{
my $all_tag_text = $tagdir .'/tag.txt';
return 1 unless (-s $all_tag_text);
my $all_tag_db = $tagdir .'/tag.db';
return 1 if (-s $all_tag_db);
if (open my $fh, $all_tag_text) {
tie (my %DB, 'NDBM_File', $all_tag_db,O_RDWR|O_TRUNC|O_CREAT, 0666);
my @list =split ',', <$fh>;
close $fh;
foreach my $tmp (@list) { $DB{$tmp} = &getCacheFileName($tmp) ; }
untie %DB;
}
return 0;
}
sub getCacheFileName {
my($str) = @_;
$str =~ s!([^a-zA-Z0-9_.~-])!lc sprintf "%02x", ord($1)!eg;
$str;
}
1;
程序正常运行。但是在目标目录并没有发现所需要的 tag.db 文件, 而是一对文件,名字为 tag.db.dir 和 tag.db.pag 。

把上述文件的
use NDBM_File;
...
tie (my %DB, 'NDBM_File', $all_tag_db,O_RDWR|O_TRUNC|O_CREAT, 0666);
换成
use DB_File;
...
tie (my %DB, 'DB_File', $all_tag_db,O_RDWR|O_TRUNC|O_CREAT, 0666);
即改用 DB_File, 则一切正常。 tag.db 正常生成。

是什么原因呢?? 难道 NDBM_File 模块还有啥意外的用法? 看来 Perl 真的荒废很久了。。。

--EOF--

Beijing Perl Workshop 2011

由 PerlChina 主办,2011 年 7 月 2 号星期六举行的 Beijing Perl Workshop 是一个免费的开源技术交流会,大会全天,向所有对开源技术感兴趣的朋友开放。

大会的主题为 Perl, Database, Javascript, , 分布式,集群,Lua等开源软件。演讲会在两个厅同时进行,其中一个厅以 Perl 内容为主,另一个厅是所有其他的主题。

报名参加大会的朋友请先注册新用户(注册过2008 或 2009大会的朋友无需再注册新用户,直接登录后登记参加本次大会即可),演讲的朋友登录后即可提交演讲主题和介绍。

--EOF--

北京 Perl Workshop 2008 网站开张 - 接受大会注册,演讲报名

logo_2008pw.png
网站开张了, 地址是 http://conference.perlchina.org/bjpw2008/

由 PerlChina 和 Postgresql China 合办,2008 年 11 月 8 号举行的 Beijing Perl Workshop 是一个免费的 Perl 交流会,向所有对 Perl 感兴趣的朋友开放。大会将包括众多 Perl 和 Postgresql 的演讲,我们也邀请到了国外的 Perl 和 Postgresql 高手参加做演讲。报名参加大会的朋友请在本站注册用户,有意演讲的朋友请先注册,登录后提交你的演讲主题和简介。 

下面是 Qiang 的宣传 :D

你可以注册大会 和 报名演讲。注册后如果有事不能参加别忘记在本站取消大会注 册。因为场地的限制(150左右),如果你决定参加,请及时注册。
这次演讲的宗旨是尽可能给更多人演讲的机会,共享 Perl 的知识。 有意报名演讲的朋友请注册后在本站提交演讲的主题和简介。如果你的演讲被接受,你会收到确认的 email. 我们会在10月中下旬把演讲定下来。

目前已经收到 7 个演讲,请大家再接再厉!
另外,这次 Perl 6 项目主管和 RT, Jifty 的创始人 Jesse Vincent 也会来参加 大会。


--EOF--

[Sitelog]Perl Forum 正式迁移到 MT 平台 ,,

在 Test Forum 测试了几天,解决了用户和帖子转移问题,今天,正式把 Perl Forum 迁移 到了 MT 4.21 pro 平台,也算整个 Site 统一进了数据库时代:)

利用 Community Pack 1.6 搭建的  MT Forum 说起来实际上并不是完整的 Forum ,和真正的 Forum 对比起来,貌似少了很多功能,但是全静态化对小规模,小用户群的准 Forum 还是很有吸引力的。究竟它有完整的 注册用户发/回帖功能,满足自己的需求了:)

所有的原 Perl Forum (Base on LB_ES Lite) 用户全部转到 MT 的数据库,大家可以用 旧 ID,密码 登陆本站,这个ID不但可以在新建立的 Perl Forum 中发表帖子和回复评论,而且也可以在 包括本 Blog 在内的所有的文章/帖子发表评论。

当然,转移也不是全部转移过来了。由于静态页面,貌似加密权限之类帖子无法体现,所以 "[ 测试私密区 ]"依然保留在旧的文本Perl BBS 程序之上,地址不变,原来的有权限的朋友也可以正常访问和发回帖子:)

收尾问题: 对原Perl Forum 里面的 帖子均做了重定向,最大可能的减少了因为地址改变带来的麻烦:) 新 Perl Forum 的地址为 http://easun.org/perl/forum ,欢迎大家访问。

--EOF--

Perl Forum User -> MT User, 密码问题原来很简单 ,

This is a SiteLog of Easun's WebBlog。

装了自带 Community Pack 1.6 的 Movable Type 4.21 Pro,也用 Community Pack 功能建立了测试的 MT Forum,初衷是想用这个MT Forum 取代 基于 LB5000 ES Lite 建立的本站半废弃状态的 Perl Forum 。
简单的作了测试,帖子的转移很简单,用Perl写个小玩意,导出成 MT 系统能认识的文本就足够了。而User的转移貌似出现的密码问题上了。
当初匆匆检测功能,没有细思量,总之, Perl Forum 采用的 MD5 加密密码,而 MT User 的密码则是采用随机数和原始密码用 Unix crypt function 来加密的。貌似转化起来很是有点问题。
好久没有看原代码了,今天晚上有点时间,看了看 MT 关于 Auth 的代码。发现其实很简单,在用户输入的时候多一重判断就是。

[PerlChina]11月8号 北京 Perl Workshop -- 征集演讲 ,

Qiang 的 征集演讲,这里发一次:)

大家好,
Perlchina 正在准备北京 Perl Workshop,向所有对 Perl 感兴趣的朋友免费开放, 大会定于11月8号(星期六)举行,时间为 1 天,地点在黄庄地铁站附近。 大会注册会在一个星期后开放,届时会在此向大家通知。
现在的工作是开始征集演讲。提交演讲的截至日期是 10月27号。
演讲的时间有四种:20,40,60分钟,第四种是 5 分钟的闪电演讲。闪电演讲的介绍请看 http://xrl.us/oqs8c
大会演讲没有高手,低手之分,对于第一次演讲的朋友,5 分钟快速演讲会是个锻炼的好机会。 希望大家踊跃报名,积极参与,一起来 push, unshift, slice 演讲到我们的 @talks 里。
有意演讲的朋友请在 10 月 27 号前把演讲主题和演讲简介发到 conference@perlchina.org。

这里也提供一些演讲的主题,供大家参考。

* 你的 Perl 成功故事
* 你有在别人意想不到的地方或领域使用 Perl 吗?让我们惊奇一下!
* 我是 xxx 语言程序员,但 Perl 让我完成了 xxx 语言不可以实现的功能。
* 为什么你喜欢模块 X。
* 我用 Perl 实现了 yyy, 我从中学到了 ....
* 你的公司使用 perl 吗? 讲讲 Perl 在公司里的应用。
* 讲讲如何用 Perl 解决了某个问题。
* 结合某个领域: Perl 和 垃圾邮件, Perl 和 生物学, Perl 和中文, Perl 和测试 等等。

--EOF--

[随笔]小骆驼,地铁,牛皮癣广告和其它

貌似又是好久没有写Blog :) 今天随便写写最近的一些琐事,也算随笔吧?

第一就是周末去了一趟 西单图书大厦,惊奇的发现了有 小骆驼第四版(中文) 出售.貌似这本书一直是 缺货缺货再缺货 , 呵呵,难得见到,激动之余抓拍了一张照片,见下:
perl.png

小骆驼 是 Perl 入门的经典图书,我这里有它的第3版,关于它的介绍,似乎不用我多费口舌:) 只是要说的是:书不多,有需要的要抓紧哦。

第2说的就是另人郁闷的事情了,久不坐地铁,居然在地铁上也发现了牛皮癣--办证广告,苦笑ing,也顺手抓拍了两张(电话号码作了模糊处理):
sw1.png
sw2.png

最近单位事情颇多,不多的上网时间也给了 起点中文网 ,Blog的事情也就放在一边了。自Blog系统换用 MT4.1 后主页的界面也再没有统一,DreamHost 上登陆MT4.1后台也慢的厉害,恩。。。只好等有空再满满整合了:)

--EOF--

Foorum v0.07, a Perl forum system by Fayland

什么是 Foorum?这个是 Fayland 使用Perl语言写的一个基于 Catalyst + DBIx::Class + Template 的论坛系统:)

国内基于 Perl 语言的论坛系统很少,除了原来曾经名气冲天的 LeoBBS(LB),LB的框架和编程思想都太古老了,界面和代码混在一起不说,编码风格也一团糟,要改进需要动大手术,加上国内的主机服务商对 Perl 的支持和文本论坛的弊端以及混乱无序的code带来的低下的性能,让大家对 Perl 论坛望而却步。说起来,对 LB 的2次开发或者吸收 LB 的优点来改进性能和界面 DIV+CSS 化的 Perl 论坛,前几年似乎好象还有N个版本,但是坚持下来的很少,因为工作量实在太大了,这个包括我的 LB5000 ES Lite版本,现在依然停留在 2004.03.29。

另外的国内的原创的 Perl 论坛是 麻辣 的 CCB, 因为不怎么喜欢这个的界面的风格,一直没有怎么测试过,但是很多编程的理念还是不错的。

Fayland 原来的野文论坛使用的是 NiBoard,的一个基于 LB 和 CCB 二次开发的变种系统,觉得界面很清淡,但是依然基于文本,界面和代码也没有分开。

这次的 Fayland 写的 Foorum,基于 Catalyst 框架,代码和界面全部分开(使用 Template),存储使用了 MySQL,告别了文本结构,精练严谨的代码让速度运行和性能也不在是问题了:)
界面延续了 NiBoard 的淡雅,非常不错。

目前 Foorum 的版本是 0.07,是 Fayland 利用国庆假日推出的版本,大家可以在http://www.fayland.org/blog/labels/Foorum.html看到这个系统的界面抓图。

如果有人有兴趣,可以到 http://www.fayland.org/blog/2007/10/foorum-v007.html下载源代码。

另外,如果有朋友对这个系统的开发有兴趣,还可以联系 Fayland :)

--EOF--

[路杨Perl随笔]为什么你的Perl程序维护困难

提记:最近老有人抱怨自己的Perl程序越来越难维护,也在抱怨Perl的执行效率低下,特写下自己的不成熟的体会,和同好者共勉之。

1。你的程序使用 use strict 和 use warnings 了吗?
不得不承认,Perl语法的随意性虽然很灵活多变,但有时间给维护和效率都带来了很大麻烦,如果碰见自己的糟糕的编程习惯和随意的语法,那么太长的代码就意味着一场噩梦,但是幸好我们有 use strict 和 use warnings . 有了这个,我们可以很快的找到变量的拼写错误(类似“$xxx 只使用了一次”的提醒),use strict 迫使你的语法变的严谨。当然如果你是维护别人的旧代码,而原始作者又是习惯使用 全局变量(Global symbol ) 的家伙,那么,加上 use strict 将让你陷入更大的维护危机(除非你想全部重写他的代码)。加 use strict 和 use warnings 困难吗? 不,你只需要在 你的程序的开头 '#!/usr/local/bin/perl' 后面加上下句就行:

use strict;
use warnings;

我的建议:
养成良好的编程习惯,尽管 Perl 语法允许你灵活和随意,新写的程序一定要加上use strict 和 use warnings .这样可以迫使你定义变量的范围,免避以后出现的效率低下和变量污染(一般都是Global symbol惹的祸 )

1   2   3