数据安全:备份,备份,再备份

最近看到一个Tag丢失事件,想到最近随着Wordpress的不断升级, 各位blogger或许都在考虑着将自己的blog升级吧。但是又有几人考虑到自己数据的安全性呢?

相信okevin就是因为太过于自信而直接在正式服务器上运行升级程序而造成的惨剧吧。 插件本身没有错,自由软件免费提供的前提就是“as-is”,作者不需承担责任的。 当然,作者肯定会尽力让自己的程序没有bug,但谁都不能保证程序不出错。 所以在对你的blog进行改造或升级之前,请务必要备份,备份,再备份。

我采用的方法是:

  1. 在自己的电脑上安装Apache、PHP和MySQL,并搭建好blog程序,数据也要和正式blog相同。在升级blog或安装插件之前,要先在本机上测试并验证没有错误之后才能上传到正式服务器上。
  2. 在自己的电脑上安装subversion来管理blog的代码。这样万一升级导致代码错误,能够轻松地恢复到升级之前的内容。
  3. 修改插件、模板时,先在自己的机器上调试通过后再传到服务器上。不要使用wordpress的模板在线编辑功能。
  4. 服务器上要定期备份数据库,可采用phpMyBackupPro,设置每天自动备份并将备份文件发送到自己的信箱里。
  5. 写个php脚本每个月备份当月的 wp-content/uploads 下的文件。
  6. 如果在正式服务器上有shell权限,上面的备份就可以通过cron来进行。

如果你能做到上面这几点,你的blog的程序和数据基本上就万无一失了。不过它的缺点也是显而易见的——升级一次程序会花掉你几天的时间。所以,没事儿就不要去无休止地升级啦。

(Read More)

BlackBerry 7230之不常用技巧

常用的那些技巧,论坛的帖子上都有,相信也是众所周知的内容了,就不再多说。 这里介绍一些不常用的技巧——虽然比较偏僻,但记住之后能让你事半功倍。

本文的部分内容参考了《BlackBerry Hacks》这本书,其他的都是作者自己的使用经验。

(Read More)

Servlet/JSP学习笔记(7)-Session和作用域

几乎所有的Web开发语言都支持Session功能,Servlet也不例外。 Servlet/JSP中的Session功能是通过作用域(scope)这个概念来实现的。

作用域分为四种,分别为:

page 在当前页面有效(仅用于JSP中)
request 在当前请求中有效
session 在当前会话中有效
application 在所有应用程序中有效

(Read More)

关于BlackBerry 7230刷机的几点心得

看到论坛上经常有人问刷机是怎么回事,如何瘦身等问题。 或许对于非计算机专业的人来说,“刷机”这个貌似深不可测的问题 确实难于理解了吧!不过作为一个程序员来说,这个问题似乎不难理解。

刷机的两个必要程序:Desktop Manager和相应的ROM,我想大家都不陌生吧。 我这里使用的ROM是4.0.2.53版。删掉 vender.xml 之后可以在AppLoader中看到好多程序,如下图:

blackberry-erase-01.png

(Read More)

Servlet/JSP学习笔记(6)-从配置文件获取参数

前两节(1, 2) 分别介绍了 GenericServlet 和 HttpServlet 的用法。 这一节将介绍 ServletContext 和 ServletConfig 这两个接口。 通过这两个接口,我们可以在web.xml中设置一些参数,如数据库地址、用户名密码等,供 Servlet 使用, 这样每次参数值变动时,不用重新编译Servlet了。

(Read More)

BlackBerry 7230刷机后的三篇欢迎邮件

BlackBerry 7230刷机之后第一次开机,短信收件箱里面会有三封初始邮件,标题分别是《Welcome》、《Top 20 Tips》、《Top 10 Phone Tips》。其中后两篇提到了很多连老手都不知道的应用技巧。可是又有谁真正认真地读过呢?

刚刚刷完ROM,准备删除这三封邮件,立此存照。

(Read More)

Windows下架设自己的DNS服务器

相信有很多人都想架设自己的DNS服务器。我们知道世界上最好用的DNS服务器软件就是BIND; 但是我辈使用Windows操作系统的人就无福享用这Unix下的顶级软件了。

或者可以用Windows Server自带的DNS服务器试试? 需要安装Server版的Windows不说,麻烦的配置和令人迷惑的图形界面就够受的了。

难道就没有一个解决方案了吗?

柳暗花明又一村,突然发现BIND居然有Windows版,这这这………… 赶快下载下来试一下,居然成功地配好了DNS。

(Read More)

Servlet/JSP学习笔记(5)-HttpServlet

上一节我们介绍了 javax.servlet.Servlet接口和继承javax.servlet.GenericServlet抽象类生成Servlet的方法。 而实际上,直接继承GenericServlet并不方便也不实用, 更多的情况下是继承javax.servlet.http.HttpServlet来生成Servlet。

(Read More)

ffmpeg: 免费的视频格式转换利器

昨天因为要将相机拍摄的视频刻录成VCD,于是上网找了好多MPEG的相关工具, 如切割、合并、格式转换等,大部分都是共享软件并且还有功能限制。 后来实在没办法了,想到了ffmpeg这个工具,抱着试试看的心情看了看帮助, 才发现原来真正的工具在这里!支持绝大多数常见的视频音频格式, 可以在各种格式之间随意转换,支持视频切割。所以说,真正好用的东西其实都是免费的。

ffmpeg的命令行格式如下:

ffmpeg [输入参数] -i 输入文件 [输出参数] 输出文件

这里仅举几个我用到的例子。

截取1分30秒到1分50秒的视频,格式不变。-ss指定起始时间,-t指定截取长度,-vcodec 和-acodec指定为copy表明不对源视频音频流做任何处理直接复制。

ffmpeg -ss 0:1:30 -t 0:0:20 -i input.mpg -vcodec copy -acodec copy output.mpg

mpg转换成vcd所用的视频格式。-ac 2表示将单声道音频转换成立体声。

ffmpeg -i input.mpg -target pal-vcd -ac 2 output.mpg

VCD要求视频大小为 352x240,而我们的视频大小为320x240,需要在两边加上黑边凑足352像素:

ffmpeg -i input.mpg -padleft 16 -padright 16 -padcolor 000000 -target pal-vcd -ac 2 output.mpg

将字幕合并到视频中,可以利用AviSynth,首先制作好srt格式字幕, 然后利用DIO’s RelProducer GUI加载视频和字幕生成avs文件,再利用ffmpeg转换此avs文件:

ffmpeg -i input.avs output.mpg

合并视频流和音频流,可以先利用ffmpeg将mp3转换成wav:

ffmpeg -i input.mp3 output.wav

然后再利用VirtualDub合并之。

(Read More)

[Perl]利用XML::DOM生成XML文档

Perl的XML::DOM功能很强大,利用它可以轻易地分析XML文档,也可以建立XML文档。

常用的类包括:

  • XML::DOM::Node:所有类的基类,表示一个XML节点。
  • XML::DOM::Parser:XML解析器,将XML字符串解析成XML::DOM::Document对象。
  • XML::DOM::Document:指向XML文档的根节点。
  • XML::DOM::Element:指向一个元素,通常由XML::DOM::Document->createElement元素生成。

其他的类可以查看CPAN上关于 XML::DOM 的说明。

建立XML文档的通常做法是:首先通过 XML::DOM::Parser生成一个Document对象, 再通过这个Document对象的 createElement、createTextNode 等方法生成各个节点, 最后通过 XML::DOM::Node->appendChild 方法将节点添加到Document对象中, 最后再通过 toString 方法将 Document 转换为字符串输出。

下面是建立XML文档的一个例子:

#!/usr/bin/perl

use XML::DOM;
use XML::Twig;

# 创建XML的最外层元素
my $xml = "<MyXML/>";

# 通过XML::DOM::Parser解析外层元素,创建基础XML文档
# XML::DOM::Parser::parse函数的返回值为 XML::DOM::Document 类
my $parser = new XML::DOM::Parser;
my $dom = $parser->parse($xml);

# 生成Book节点
# createElement的返回值为 XML::DOM::Element 类
# XML::DOM::Element 的父类是 XML::DOM::Node 类
my $book = $dom->createElement("Book");
# 设置节点属性
$book->setAttribute("title", "My First Book");
$book->setAttribute("author", "charlee");

# 生成Chapter节点
my $chapter = $dom->createElement("Chapter");
$chapter->setAttribute("id", "1");
# 生成一个文本节点
my $title = $dom->createTextNode("My First Chapter");
$chapter->appendChild($title);

# 添加Chapter到Book
$book->appendChild($chapter);

# 添加Book到XML文档
$dom->getDocumentElement->appendChild($book);

# 利用XML::Twig整理格式
my $twig = new XML::Twig;
$twig->set_indent(" "x4);
$twig->parse($dom->toString);
$twig->set_pretty_print("indented");

# 输出
print $twig->sprint;

最后一段使用XML::Twig的程序只是为了整理XML输出结果的格式, 如果不需要整理格式,不调用XML::Twig,直接使用$dom->toString也可以。

(Read More)