Archive

今晚折腾久违了的weblog

很久没上来了,终于想要记下点东西了。

顺手升级了wordpress到2.5.1,用dreamhost的one click install,很方便。但访问升级页面时,得到了错误:
“Cannot redeclare is_tag()”

这里找到了原因,是ultimate-tag-warrior.php重复定义了is_tag()函数。

K2主题也升级到了最新版,很多东西都需要重新调整,慢慢弄吧。

今天新加了一个分类“Symbian”,准备把自己使用Symbian程序(都是开源或者freeware)的心得记一下,呵呵,注意不是编程心得哈。

升级到Ubuntu 8.04

五一假期用了一晚时间升级了笔记本电脑上装的Ubuntu,注意到一些变化:
1. 启动过程中如果检查硬盘不会显示纯终端界面了
2. 登录xfce后无线网自动连接,不用再输入keyring的密码,很方便
3. Firefox 升级到3.0
4. 中文字体显示效果似乎比以前好了

升级后原来的vmware-player不能用啦,按照这里的说明即可解决。

Web页面自动打印PDF文件的实现

借助iText和Adobe Acrobat的Javascript支持,可以实现PDF文档的自动打印(可以做到不显示打印对话框)

  1. ......
  2.  
  3. PdfReader reader = new PdfReader(pdfStream); [1]
  4.  
  5. StringBuffer script = new StringBuffer(); [2]
  6. script.append("this.print({bUI: false,bSilent: true,bShrinkToFit: false});")
  7.   .append("\r\nthis.closeDoc();");
  8.  
  9. ByteArrayOutputStream bos = new ByteArrayOutputStream(pdfStream.length);
  10. try {
  11.   PdfStamper stamp = new PdfStamper(reader, bos); [3]
  12.   stamp.setViewerPreferences(PdfWriter.HideMenubar 
  13.     | PdfWriter.HideToolbar | PdfWriter.HideWindowUI);
  14.   stamp.addJavaScript(script.toString());
  15.   stamp.close();
  16. } catch (DocumentException e) {
  17.   logger.error(e.getMessage(), e.getCause());
  18. }
  19.  
  20. return new StreamingResolution("application/pdf"
  21.   new BufferedInputStream(new ByteArrayInputStream(bos.toByteArray()))) ;
  22.  
  23. ......

代码说明:
1、pdfStream是用iText生成的PDF文档字节流
2、script是要加入到PDF文档里的Javascript代码。这段Javascript代码先调用PDF文档对象的print方法,然后用closeDoc方法关闭文档。print方法的参数指定了不要显示打印对话框,参数含义参考Acrobat JavaScript Scripting Reference
3、bos用来保存加入Javascript后的PDF文档字节流,它作为PdfStamper对象的输出流。PdfStamper对象调用addJavaScript方法将Javascript代码加入到PDF文档中。

Web页面嵌入PDF文档:

  1. <embed type="application/pdf" src="/PrintPdf.action" width="1" height="1"></embed>

升级系统导致Postfix的SMTP认证失败(Cyrus-SASL + MySQL)

日志里这样的错误信息:
warning: SASL authentication problem: unable to open Berkeley db /etc/sasldb2: No such file or directory

最终发现原因:main.cf里smtpd_sasl_path的设置错误,可能是更新修改的。
把smtpd_sasl_path=/etc/postfix/sasl:/usr/lib/sasl2改成smtpd_sasl_path=smtpd后,重启postfix和courier-authdaemon,问题解决。

同时运行两个mysql实例

运行环境: Ubuntu 6.06 server

1. 修改/etc/mysql/my.cnf

加入

[mysqld_multi]
mysqld     = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user       = multi_admin
password   = multipass

把原来的[mysqld]改成[mysqld001],并加入[mysqld002],分别配置两个实例,主要是下面这些设置要不同:

  • pid-file
  • socket
  • port
  • datadir

2. 设置用户

$ mysql -u root -S /var/run/mysqld/mysqld.sock -p
> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
$ mysql -u root -S /var/run/mysqld/mysqld2.sock -p
> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';

3. 测试启动停止命令

$ mysqld_multi --no-log --config-file=/etc/mysql/my.cnf start 001,002
$ mysqld_multi --no-log --config-file=/etc/mysql/my.cnf stop 001,002
$ mysqld_multi --no-log --config-file=/etc/mysql/my.cnf report 001,002

4. 新建启动脚本 /etc/init.d/mysql-multi替换原来的启动脚本/etc/init.d/mysql

5. 修改/etc/phpmyadmin/config.inc.php,配置如何连接这两个服务器

$i = 0;
$i++;
$cfg['Servers'][$i]['host']          = 'localhost';
$cfg['Servers'][$i]['socket']        = '/var/run/mysqld/mysqld.sock'; 
$cfg['Servers'][$i]['connect_type']  = 'socket';
$cfg['Servers'][$i]['verbose']       = 'localhost:3306';
$i++;
$cfg['Servers'][$i]['host']          = 'localhost';
$cfg['Servers'][$i]['socket']        = '/var/run/mysqld/mysqld2.sock'; 
$cfg['Servers'][$i]['connect_type']  = 'socket';
$cfg['Servers'][$i]['verbose']       = 'localhost:3307';