Category: 小小草

IT 技术领域学海无涯。其实任何领域都学海无涯,无非 IT 发展太快了,让我有更多嘘唏。希望我掌握的技术有如小小草,虽然渺小,却有旺盛的生命力。

  • FreePBX auto reboot

    FreePBX 上线运行近一个月,被我观测到若干次所有 peers (包括 trunks 和 extensions)都失去连接的情形,但 FreePBX web 界面里还是显示 asterisk 正常绿色。

    目前我无法判断这究竟是 FreePBX 的硬件问题,抑或是 FreePBX 的软件问题,还是参数配得不对。我也没找到什么现成的命令可以判断 asterisk 是否在正常工作。

    好羡慕一些人说 FreePBX 几年都不用重启也跑得很稳定。我也不想经常重启我的 FreePBX,但我得面对现实的商业化环境。

    现实是我们不是 24 小时工作,电话也不会 24 小时响个不停,但工作时间我们不能容忍 FreePBX 无缘无故停止响应。所以我做了两项调整:

    1. FreePBX 每天在伦敦时间 6AM 重启一次 OS,保证它有活力运行在大部分人的工作时间。
    2. 我还写了一个每分钟检测一次的小程序。如果检测到所有 peers 失去连接,就重启 OS。如果重启没有解决问题,则不再重启,这是为了不为非 FreePBX 自身的原因(比如说网络原因)陷入重启循环;当然,如果重启解决了问题,也不用重启了。
  • I almost forgot how to use Apache

    我不用 Apache 很多年,几乎忘了该怎么完整地配一台 Apache server。最近上线了一台 FreePBX,我想加强 web server 的安全系数,要修改一些默认参数。因为对 FreePBX 还不是很了解,所以不敢贸然把它的 web server 用我喜欢的 Nginx 代替,只好沿用元配的 Apache,捣腾它的 conf 文件。

    首先,我想弄个 VirtualHost,把 FreePBX admin 界面隐藏到不公开的 ServerName 上。我忘了在使用 name based virtual host 前要先使用 NameVirtualHost 先声明一下。

    1
    NameVirtualHost ip_address:port_number

    其次,启用了 VirtualHost 以后,VirtualHost 之外的 main DocumentRoot 就不起作用了。我在 VirtualHost 之外定义了一个 DocumentRoot 并想当然地认为它是 default server (未经任何一个 VirtualHost 定义的 server)的 DocumentRoot。事实上,VirtualHost 的 default server 是由 _default_ 显式定义,或在 _default_ 缺失的情况下,第一个 VirtualHost 就是 default server。

  • PEAR Mail.php

    我想在服务器上用 Gmail SMTP 代替 sendmail 发送邮件,并不想用 Zend_Mail,只想找一个轻量级的解决方案。

    一找就找到 Pear Mail。提示说只要用

    1
    pear install Mail

    然后在程序里

    1
    include_once "Mail.php";

    我照着做了,可是提示:

    Warning: include_once(Net/SMTP.php): failed to open stream: No such file or directory in mail/Mail/smtp.php on line 348
    PHP Warning: include_once(): Failed opening ‘Net/SMTP.php’ for inclusion (include_path=’.:/usr/lib/php’) in mail/Mail/smtp.php on line 348
    PHP Fatal error: Class ‘Net_SMTP’ not found inmail/Mail/smtp.php on line 349

    原来还需要安装一个依赖包

    1
    pear install Net_SMTP
  • Tips for printing on Avery Quick&Clean™ Business Cards

    Avery C32026 cover
    Avery C32026 cover

    It is my second time using Avery Quick&Clean™ DIY business cards. The first time was very smooth so I did not remember any caveats.

    This time I had printed 5 pages before I got a nice one. So I decide to write some tips for future reference.

    The paper I use is Avery C32026, 270g satin finish, the thickest I can find in store. The printer is Lexmark C544dn, a colour laser printer with auto duplex feature.

    Tip 1. Do not load paper in Tray 1. It is not suitable for thick paper like this. Load it in Manual Feeder.

    Tip2. Do not use auto duplex. If the business card design is double sided, print one side and manually feed paper again for the other side. The auto duplex roller is a small cylinder that may snap the cards away from the frame.

    Tip 3. Use the template provided by Avery and do not convert to any other format. C32026 template is a Word document. After editing, I converted it to a PDF file (I was thinking of portability). The position was changed slightly and some text was printed across the border.

  • Job for mariadb.service failed bug fixed

    Last month I set up a development server using Fedora 20. On that server I wanted to change MySQL socket file from /var/lib/mysql/mysql.sock to /dev/shm/mysql.sock. Basically I wanted to move MySQL socket file to shared memory for performance gain.

    I made the change in /etc/my.cnf, but when I tried to start mysqld, I got the error message:

    Job for mariadb.service failed. See ‘systemctl status mariadb.service’ and ‘journalctl -xn’ for details.

    That was my first time heard about mariadb. I did some background research on mariadb and the relationship between mysqld and mariadb. But that did not help to solve the problem. So I had to revert to the default MySQL socket file /var/lib/mysql/mysql.sock.

    Today I had some free minutes and recalled this unresolved issue. To my surprise, I just changed

    1
    socket=/var/lib/mysql/mysql.sock

    to

    1
    socket=/dev/shm/mysql.sock

    in /etc/my.cnf. And this time mysqld can start without any errors.

    What changes have I made to the system? Nothing but a yum update.

    So I assume there was a bug in mariadb (or mysqld) which is fixed by the recent release.

    Mariadb updated
    Mariadb updated
  • Play Blu-ray ISO images on Fedora 20

    买了新电视 SAMSUNG UE46F6100,总想试一下它的 3D 效果。我没有 Blu-ray player,也没有 Blu-ray disk,于是下载了一个 Blu-ray ISO 镜像格式的文件。怎么放呢?

    我一开始想在 Sony NSZ-GS7 机顶盒上播放,可是没有可用的 App。Windows 下倒有很多解决方案,可惜它不是我的首选。

    我想的是怎么在 Fedora 20 下播放 Blu-ray disk?如果可行,就可以用 Fedora 20 配一台 HTPC 去客厅播放 Blu-ray disk。

    做之前,我以为这有点难,不太会有现成的 yum package。事实上,很简单。

    首先得有 libbluray,用 yum install 一下就可以。但我的机子也装有 libbluray,不知是 Fedora 20 默认安装的库,还是我装别的软件时带进来的。

    然后加载 rpmfusion repo,装一下 vlc 就可以用 VLC 来播放 Blu-ray disk。

    1
    yum install vlc

    HTPC 又多一个新功能。但是 SAMSUNG UE46F6100 电视的 3D 效果实在一般,要令我赏心悦目的 3D 技术还没有到来啊。

  • FreePBX working with an unstable router

    办公室里的 FreePBX 经过多次调试,初步可以稳定运行。无奈物业管理公司配送的 ZyXEL AMG1302-T10A ADSL router 是个家用系列产品,用起来非常糟糕:设置了一批端口转发至 FreePBX,但会莫名其妙地失效。这种失效是个别端口转发失效,最要紧的是 Asterisk bind port 失效,这样外网的 SIP 分机就注册不了,运行若干天定会发生这样的事故。联想到外网分机通话时经常出现的单向语音或干脆无语音,估计也是路由器无法稳定地转发 RTP port 造成的。

    物业管理公司外包 IT support 给一个外地的公司,虽然离得不远,但英国公司本身就效率低下,又不是在同一个城市,根本就指望不上。本来我也不指望别人来做 IT support,但物业管理公司和 IT support 公司不愿告诉我 ADSL 上网密码,我就无法换掉它的路由器;它也不愿告诉我路由器管理密码,搞得我在路由器端口转发失效的情况下,也无法远程重启路由器。

    我已经跟物业管理公司要求独立装宽带,并自己管理。在没有得到答复前,怎么解决外网分机无法在特定端口注册的问题?我想了个办法,就是开启多个 Asterisk bind ports。严格地说,Asterisk只能有一个 bind port,而多个 bind ports 的效果,其实是在 FreePBX OS 层面的防火墙上达到。

    1
    iptables -t nat -A PREROUTING -i eth0 -p udp --dport (another port number) -j REDIRECT --to-ports (original port number)

    这条规则把 (another port number) request 转给 (original port number)。我一口气添了 10 条同样的规则,这下有 11 个 SIP 注册端口可用,希望 ZyXEL ADSL router 不会一夜全坏掉吧?!

    1
    /etc/init.d/iptables save

    保存路由规则,让重启后不丢失。

    顺便说一下,我对 ZyXEL 的质量没有信心,它的家用系列产品不稳定不是个别现象,它的商用系列我也不敢去尝试。

  • Aptana Studio 3.4.2 crashes on JDK in Fedora 20

    最近重拾 Aptana Studio,下载了最新版 3.4.2,可一编辑代码就无故崩溃。Fedora 20 提示 JDK crashed。

    我一开始没注意到我用的是 OpenJDK,Aptana 说不支持 OpenJDK,赶紧去下 Oracle/Sun JDK,还换了两次版本,1.7.0_51、1.6.0_45 都试过,都不成。

    搜了一下此类问题,给我感觉 2010 年以来在各版本的 Aptana Studio 和 JDK 时有发生,坏也不知道什么原因,好也不知道什么原因。大概我之前人品好,没碰到此类问题。

    换用 Netbeans,当前环境没有问题,但实在不熟悉 Netbeans,仍纠结着想用 Aptana Studio。想了个办法,切换回 Oracle/Sun JDK 1.7.0_51,安装 Eclipse 4.3.1,再装 Aptana Studio plugin for Eclipse,嘿,不再无故崩溃了。

    Eclipse with Aptana Studio plugin
    Eclipse with Aptana Studio plugin
  • Change MySQL socket path for FreePBX

    FreePBX 12 alpha 如果掉电重启,已多次发生 DB error,改装 FreePBX 11 仍有发生。虽然我已查明这是 MySQL socket 被锁定造成的,删除 /var/lib/mysql/mysql.sock 即可,但嫌 MySQL 不能自行修复,于是想到将 socket 移入内存 /dev/shm,掉电即不复存在,重启时每次都是重新生成 socket,不再有被锁定之忧。

    怎么更改 MySQL socket path 呢?其实也不复杂,只需更改三个文件。

    1. /etc/my.cnf
    MySQL 自身的配置文件

    1
    socket=/var/lib/mysql/mysql.sock

    更改为

    1
    socket=/dev/shm/mysql.sock

    2. /etc/freepbx.conf
    告诉 FreePBX socket 的新位置

    1
    $amp_conf['AMPDBHOST']  = 'localhost';

    更改为

    1
    $amp_conf['AMPDBHOST']  = 'unix(/dev/shm/mysql.sock)';

    你可能觉得 ‘unix(/dev/shm/mysql.sock)’ 的写法很奇怪。我摸索了好久才找到 PEAR DB 所用的 dsn 字符串中 MySQL socket path 的格式。

    3. /etc/amportal.conf
    告诉 asterisk socket 的新位置

    1
    AMPDBHOST=localhost;

    更改为

    1
    AMPDBHOST=unix(/dev/shm/mysql.sock)

    重启 MySQL 和 asterisk,确认 FreePBX System Status 是不是一片优雅的绿色(主要看 Server Status 块中的 Asterisk 和 MySQL 是否正常)?

    FreePBX server green status
    FreePBX server green status

  • Change Grub timeout seconds

    Grub menu
    Grub menu

    Changing Grub timeout seconds is not as many people said, by edit /etc/default/grub. At least with Fedora 20, I can proove it is not the right place to make the change. The corresponding file is /boot/grub2/grub.cfg. In the file look for

    1
    set timeout=5

    5 seconds is the default timeout. Change it to any seconds you want it to be.

    1
    set timeout=0

    0 seconds means no waiting at all.

    1
    set timeout=-1

    -1 means wait infinite seconds until you make a choice.

    (My updated knowledge on 06 Feb 2014) /boot/grub2/grub.cfg 是针对 BIOS systems 的,UEFI systems 要修改 /boot/efi/EFI/fedora/grub.cfg。修改 grub.cfg 文件后直接生效,但是不建议直接修改 grub.cfg 文件。grub.cfg 的文件头上就有一段这样的提示:

    #
    # DO NOT EDIT THIS FILE
    #
    # It is automatically generated by grub2-mkconfig using templates
    # from /etc/grub.d and settings from /etc/default/grub
    #

    因为系统在某些情况下会覆写 grub.cfg 文件。这样又回到之前很多人说的 /etc/default/grub 文件,在这里修改参数是对的,只是修改后不直接生效,还要运行一遍

    1
    grub2-mkconfig -o /boot/grub2/grub.cfg

    1
    grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

    覆写 grub.cfg 才生效。