标签/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 IDAPP 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/

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

use strict;
use warnings;

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

1   2   3