在linux 下运行PowerDesigner 15 Beta 2

PowerDesigner 是Sybase 的一款优秀的数据库辅助设计软件,目前没有开发Linux 版本,同时我在Linux 下也找不到可替代的产品。经过尝试,通过wine 可以在Linux 下将PowerDesinger 版本15 很好的运行起来,加上一些额外的努力,还可以启用PowerDesigner 对VB Script 以及数据库连接的支持。 我把主要步骤列出来,供有兴趣的朋友参考。 测试环境: Gentoo...

PowerDesigner 是Sybase 的一款优秀的数据库辅助设计软件,目前没有开发Linux 版本,同时我在Linux 下也找不到可替代的产品。经过尝试,通过wine 可以在Linux 下将PowerDesinger 版本15 很好的运行起来,加上一些额外的努力,还可以启用PowerDesigner 对VB Script 以及数据库连接的支持。 我把主要步骤列出来,供有兴趣的朋友参考。

测试环境:

  • Gentoo Linux 2.6.24-r3
  • wine-1.1.0
  • PowerDesigner 15 Beta 2

由于缺乏VC80的支持,PowerDesigner 15 Beta 2 的安装程序默认在wine 下面无法正常运行,安装会失败。一种解决方法是移植已有的Windows 安装版本。

移植已有的Windows 安装版本

在Windows 下安装好PowerDesigner,然后将以下目录copy至Linux :

  • 程序的安装目录
  • 将存放License的目录:C:\\Documents and Settings\\All Users\\Application Data\\PowerDesigner 15

然后在Windows 运行注册表,将以下keys 分别导出:

  • [HKEY_CURRENT_USER\Software\Sybase\PowerDesigner 15]
  • [HKEY_LOCAL_MACHINE\SOFTWARE\Sybase\PowerDesigner 15]
  • [HKEY_USERS\.Default\Software\Sybase\PowerDesigner 15]

在Linux 下运行wine regedit 导入以上keys, 如果出错,那么可能需要先对文件的编码进行转换:

$ recode UCS2..  *Sybase*.reg

NOTE:如果没有recode 命令,$ emerge -av1 recode

导入成功之后,在Linux 下运行注册表工具,修改key :[HKEY_LOCAL_MACHINE\SOFTWARE\Sybase\PowerDesigner 15\License\LicenseDirectory],将目录修改为License 在Linux 下存放的目录,例如 "C:\\Documents and Settings\\All Users\\Application Data\\PowerDesigner 15"

如果一切顺利,就可以用以下命令来运行PowerDesigner了。

env WINEPREFIX="$HOME/.wine" wine "C:\Program Files\Sybase\PowerDesigner 15\pdshell15.exe"

另外一种方法是在Linux wine 下安装VC80 支持,然后在Linux 下运行安装程序。

在Linux 下进行安装

NOTE: 命令中跟在#后面的是注释文本 

在运行安装程序之前,按照自己的需求先准备好如下环境:

  • 隔离的wine 环境
  • .Net FrameWork 2.0 Support
  • VB Script Support
    • VBScript 5.6
    • Vitual C++ 2005 support
  • VC80 dll support (必需)
    • Microsoft.VC80.CRT.manifest
    • msvcm80.dll
    • msvcp80.dll
    • msvcr80.dll
  • Connection Profile Support(可在安装完成之后进行)
    • Sun JRE 1.4.2
    • DB2 JDBC Type 4 Driver - db2jcc.jar
隔离的wine 环境

此步为可选。

NOTE:如果省略这一步,请替换下面各节命令中的路径.winePD/ 为.wine/

如果不希望影响原有的wine 环境,或者用于测试,可以为PowerDesigner 新建一个独立的wine 目录。

$ wineprefixcreate --prefix $HOME/.winePD  
$ export WINEPREFIX="$HOME/.winePD" 
.Net FrameWork 2.0 Support

这一步是可选。

PowerDesigner 在Beta 2中引入了.Net FrameWork 2.0 支持,用于更漂亮的模型自动排版功能,如果希望使用需要先安装.Net 2.0 ,但.Net 2.0需要IE 5.0以上支持,安装IE 6 可以参考 Wine AppDB - Internet Explorer 6.0,经过尝试是可行的。

IE 6.0安装好之后到MS 网站下载.Net 2.0 安装文件 dotnetfx.exe,放至 $HOME/.winePD/drive_c/,运行安装文件完成安装。

$ wine "c:\dotnetfx.exe"
VB Script Support

这一步是可选。

首先到MS 网站下载合适版本的VB Script 安装文件:WindowsXP-Windows2000-Script56-KB917344-x86-chs.exe

安装过程参考 Wine AppDB - Visual Basic 6.0 Enterprise Edition,所不同之处是安装的文件不一样。

NOTE: 下面的/win/目录是我的 Windows XP安装分区。

$ winecfg # add libraries overwrite; set OS to Windows ME; 
$ cd .winePD/drive_c/windows/system32/
$ for i in riched20.dll riched32.dll oleaut32.dll urlmon.dll hhctrl.ocx ; do mv $i $i.bak; done	
$ for i in riched20.dll riched32.dll oleaut32.dll urlmon.dll hhctrl.ocx ; do cp /win/windows/system32/$i .; done
$ cp /win/windows/system32/mfc42.dll .winePD/drive_c/windows/system32
$ wine "c:\WindowsXP-Windows2000-Script56-KB917344-x86-chs.exe"
$ winecfg # set OS back to Windows XP
VC80 dll support

这一步必需完成以运行PowerDesigner 15 Beta 2 安装程序。

在网上下载msvbvm60.dll 和MS-VC80.MSI ,还需要去MS 网站下载Vitual C++ 2005 support 安装文件 vcredist_x86.exe。然后参考以下步骤完成安装。

$  cp Desktop/msvbvm60.dll .winePD/drive_c/windows/system32
$  msiexec /i "c:\MS-VC80.MSI"
$  wine "c:\vcredist_x86.exe"
$  ls .winePD/drive_c/windows/winsxs/ # 确认vcredist_x86.exe 安装成功
Connection Profile Support

这一步是可选。

PowerDesigner 当中支持对数据库的连接,这是通过ODBC 驱动程序实现的,此外,PowerDeisnger也加入了对JDBC 驱动程序的支持,其称作Connection Profile。在Linux 下为wine 程序配置ODBC,我没有经验,可能需要安装MDAC,而通过JDBC则比较容易实现。对于DB2 类型的数据库,IBM 提供一种TYPE 4的JDBC 驱动程序,可以不需要在连接的客户端安装DB2 Client,仅仅拥有TYPE 4驱动程序以及JRE 支持即可。下面的配置就是通过在wine 中配置JRE 以及DB2 JDBC TYPE 4 驱动程序来实现在PowerDesigner 中对DB2 数据库的访问。

NOTE:Linux 世界中的libiodbc 和unixODBC 并不适用这个场景,其提供的ODBC 数据源并不是为wine 程序使用的。

首先需要下载Sun 的JRE安装程序(1.4.2 for windows) 和IBM 的DB2 JDBC TYPE 4 驱动程序(跨平台)。

NOTE:IBM 的JRE 安装程序会检测ibmpc 系统兼容性,我在wine中无法通过检测(甚至在vmware 这样的虚拟机中也不行),具体原因不知道,导致安装失败,因此选择Sun的JRE。

$ winecfg # 在Libraries 中将 urlmon 临时改为 Builtin
$ wine "c:\j2re-1_4_2_18-windows-i586-p.exe"
$ winecfg # 在Libraries 中将 urlmon 改回 Native
$ mkdir ~/.winePD/drive_c/db2java
$ cp /opt/IBM/db2/V8.1/java/db2jcc_license_cu.jar ~/.winePD/drive_c/db2java/
$ cp /opt/IBM/db2/V8.1/java/db2jcc.jar ~/.winePD/drive_c/db2java/

运行wine regedit,找到key:

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environmen]

添加或者修改以下2个键值:

CLASSPATH=C:\db2java\db2jcc.jar;C:\db2java\db2jcc_license_cu.jar;. 
PATH=C:\windows\system32;C:\windows;C:\Program Files\Java\j2re1.4.2_18\bin 
$ regedit #add values to CLASSPATH , PATH
开始安装PowerDesigner 15 Beta 2

下面开始真正安装PowerDesigner。

$ winecfg # 在Libraries 中将 oleaut32 临时改为 Builtin
$ wine "c:\PowerDesigner15.exe"
$ winecfg # 在Libraries 中将 oldaut32 改回 Native
$ wine "C:\Program Files\Sybase\PowerDesigner 15\pdshell15.exe"

整个安装过程应该很顺畅,如果遇到问题,可以重头检查一下必需的步骤。

测试VB Script

执行Tools - Execute Commands - Edit/Run Script,在代码编辑框中写入一句简单的VB Script代码,比如: "dim s",然后点击Run,如果没有任何错误弹出,说明VB Script 支持正常。

测试Connection Profile

在File 菜单中点击 Revers Engineer - Databases,选择IBM DB2 UDB 8.x Common Server - Using a datasource,浏览datasource,选择Connection Profile,Configure 一个新的数据库连接。

点击Test Connection,如果出错,查看output (alt+1)中的messages,有助于解决问题。

TroubleShooting

Could not find dependent assembly L"Microsoft.VC80.CRT" (On running PowerDesigner.exe)

解决方法:安装VC80 dll support。

Runtime error: R6034 - An application has made an attempt to load the C runtime library incorrectly (On running PowerDesigner.exe)

解决方法:安装VC80 dll support。

Failed to load DLL: pdflm15 (On running PowerDesigner.exe)

解决方法:安装VC80 dll support。

err:module:import_dll Library MSVBVM60.DLL (which is needed by ...

解决方法:在Windows 安装中复制msvbvm60.dll 或者网上下载到wine 的system32 目录。

err:module:import_dll Library MFC42.DLL (which is needed by L"C:\\windows\\system32\\vbscript.dll") not found (On Installing VBScript.exe)

解决方法:在Windows 安装中复制mfc42.dll 或者网上下载到wine 的system32 目录。

Required property "serverName" is unknown host

解决方法:检查网络连接,服务器设置,服务器地址,端口,数据库名称等。

Non SQL Error : Could not load class com.ibm.db2.jcc.DB2Driver。

解决方法:检查wine 注册表中CLASSPATH 是否包含正确的db2jcc.jar 全路径,注册表修改之后,应该重新运行PowerDesigner 应用程序。

Could not Initialize JavaVM!

解决方法:检查wine 注册表中PATH 是否包含正确的到JRE bin 路径,注册表修改之后,应该重新运行PowerDesigner 应用程序。

参考资料

延展阅读

 

mysqld 启动失败一例

启动mysql server 失败,查看/var/log/mysqld.err 080329 16:01:29 [ERROR] Can't start server : Bind on unix socket: No...

启动mysql server 失败,查看/var/log/mysqld.err

080329 16:01:29 [ERROR] Can't start server : Bind on unix socket: No such file or directory
080329 16:01:29 [ERROR] Do you already have another mysqld server running on socket: /var/run/mysqld/mysqld.sock ?
080329 16:01:29 [ERROR] Aborting
080329 16:01:29  InnoDB: Starting shutdown...
080329 16:01:30  InnoDB: Shutdown completed; log sequence number 0 4646872
080329 16:01:30 [Note] /usr/sbin/mysqld: Shutdown complete

百思不得其解,后来查看/var/db/pkg/dev-db/mysql-5.0.56/CONTENTS 文件,或者执行equery f mysql(两种方法非Gentoo Linux 发布不适用),得知安装文件中包含/var/run/mysqld,而这个目录不存在,回忆起之前曾清空过/var/run目录,一直以为这下面的内容都是动态创建,删除之后重启系统即可,看来对mysql 来说还不是这么回事。

创建此目录,并chown,问题解决。

# mkdir /var/run/mysqld
# chown mysql:mysql /var/run/mysqld

Gentoo Linux: Subversion

安装 添加需要的USE 标记:(如果愿意加入到/etc/make.conf 中作为全局配置也可以) # echo 'dev-util/subversion svnserve apache2' >> /etc/portage/package.use emerge subversion 服务器与客户端程序: # emerge...

安装

添加需要的USE 标记:(如果愿意加入到/etc/make.conf 中作为全局配置也可以)

# echo 'dev-util/subversion svnserve apache2' >> /etc/portage/package.use

emerge subversion 服务器与客户端程序:

# emerge subversion
[ebuild   R   ] dev-util/subversion-1.4.6-r1  USE="apache2 berkdb emacs java nls perl python ruby svnserve* -bash-completion -debug -doc -extras -nowebdav -vim-syntax" 0 kB  

注意:subversion 依赖于apache 服务,如果系统中没有apache,会自动添加入emerge 列表。

安装好后产生以下主要的文件:

/usr/bin/svnadmin   		用于建立一个repository,也就是一个svn版本库服务
/usr/bin/svn   			svn客户端命令行程序
/etc/init.d/svnserve		svn后台服务程序
/etc/conf.d/svnserve    	svn服务配置文件

配置

默认的配置文件使用/var/svn 作为repository 的根目录,不做修改。

使用root 建立/var/svn 目录,然后建立独立的repository目录: prj。

# mkdir /var/svn
# mkdir /var/svn/prj

现在使用前面创建的路径建立一个repository。

# svnadmin create /var/svn/prj 

这会生成一些目录结构与文件在/var/svn/prj 下面,编辑配置文件/var/svn/prj/conf/passwd,加入svn 授权连接用户与密码。

myusername - mypassword 

接下来编辑repository配置文件/var/svn/prj/conf/svnserve.conf,去除掉以下行的注释:

anon-access = read
auth-access = write
password-db = passwd

注意:行首不要留有空格。 

下面还需要给svn root 目录/var/svn 以及下面的repository 正确的授权,以使以apache用户运行的svnserver 能够正确的存取它们。执行以下命令:
# chown -R apache:root /var/svn 

 现在repository 已经准备好了,可以启动svn 服务,并设置为跟随系统自动启动。

# /etc/init.d/svnserve start
# rc-update add svnserve default 

至此,svn server已经在运行,并且为一个叫做prj的项目建立了一个repository,同时为这个repository设置了连接用户。

下面我们选择一个路径作为保存working copy 的目录,比如位于$HOME ,进入此目录,并首先将prj 项目check out,执行以下命令:

$ cd $HOME
$ svn checkout svn://localhost/prj

第一次执行此命令,svn会提示输入用户名与密码,然后保存在$HOME/.subversion 目录中。以上会在HOME 中目录建立目录$HOME/prj ,并包含$HOME/prj/.svn 用于保存版本控制的文件。

现在可以向$HOME/prj 中copy 项目文件。使用svn add PATH 命令加入版本控制信息,svn -m "message" commit PATH 命令进行提交。

参考信息

IBM HTTP Download - ibmdl tool

如果经常使用ibm.com或者w3 的HTTP Download 功能,下面的脚本可能会有用,在ibm.com下载的文件名称很多都是采用编码方式,下载得多了从名字很难区分文件内容,一种方法是在IBM HTTP Download 的applet 查看历史记录,另外一种是直接查看IBM HTTP Download 自动维护的dlmgr.pro 文件,这个文件一般与下载文件位于相同的目录。 写了一个简单的脚本ibmdl ,用于列出dlmgr.pro,也可以查询一个文件名,给出内容描述 $...

如果经常使用ibm.com或者w3 的HTTP Download 功能,下面的脚本可能会有用,在ibm.com下载的文件名称很多都是采用编码方式,下载得多了从名字很难区分文件内容,一种方法是在IBM HTTP Download 的applet 查看历史记录,另外一种是直接查看IBM HTTP Download 自动维护的dlmgr.pro 文件,这个文件一般与下载文件位于相同的目录。

写了一个简单的脚本ibmdl ,用于列出dlmgr.pro,也可以查询一个文件名,给出内容描述

$ ibmdl
Usage: ibmdl path [FILE]
Example: 
List all content in ./download/dlmgr.pro :
ibmdl ./download
Query C541WML.tar in ./download/dlmgr.pro :
ibmdl ./download C541WML.tar

Download file

emacs 学习笔记

如何阅读  以下emacs 命令中 C 代表Contral 键,M 代表Alt 键,ret 是回车。C-x 的含义是按住Contral 再按x 空格用于分隔控制字符和命令,其它字符是emacs 命令,按顺序输入。 尖括号<> 当中的内容不是emacs 命令,按语义输入。...

如何阅读 

以下emacs 命令中

  • C 代表Contral 键,M 代表Alt 键,ret 是回车。C-x 的含义是按住Contral 再按x
  • 空格用于分隔控制字符和命令,其它字符是emacs 命令,按顺序输入。
  • 尖括号<> 当中的内容不是emacs 命令,按语义输入。
  • 斜杠/用于隔开多个类似的命令和描述。

常用命令

打开文件
C-x f <FilePath> ret
多窗口间切换(窗口1... 窗口N)
C-x 1...<N>
多窗口间切换(上一个/下一个)
C-x 左/右箭头键
关闭当前Buffer 
C-x k ret
保存
C-x C-s
退出
C-x C-c
光标上、下、左、右移动
C-p/C-n/C-b/C-f
光标移动到行首、行尾 
C-a/C-e 
光标前/后移动一个单词
 M-f/M-b
光标前/后移动一个句子
 M-a/M-e
光标前/后移动一个段落
 M-{/M-}
光标到buffer 首/尾
 M-</M->
光标到第N行
 M-g-g N ret
删除后一个字符
 Del/C-d
删除前一个单词
 M-Del/M-Backspace
删除后一个单词
 M-d
删除到句首/尾
 M-k/C-x Backspace/Del
删除到行尾
 
C-k
将当前行与上一行进行合并,空格分隔
M-^ 

类似于vi 的Shift+j ,不过合并的方向相反。

向前/后搜索
C-r/C-s 
向上/下翻页
M-v/C-v 
光标行居中
C-l
选择一个范围 
C-空格

或者

C-2个空格 

上面的命令将当前光标所在位置设为选择起始点,然后移动光标,移动到那就选择到那,直接执行命令即可。后面的用法,会高亮选中的区域,更利于识别。

也可以用鼠标滑亮所选区域。

注:如果输入法占用了“C-空格”的快捷键,最好改成其它。

复制所选文本
 M-w
剪切所选文本
C-w
插入^G或其它控制字符
C-q C-G
dos2unix
C-x ret f unix ret
刷新一个文件内容的tricky 方法(reload)
C-x C-v ret
字符替换
M-x replace-string ret <OldStr> ret <NewStr> ret
替换行尾为换行(正则表达式)
M-x replace-regexp ret $ ret C-q C-J ret

以上2个命令作用范围是当前光标至buffer 末尾。

范围替换
 高亮选中范围 M-x replace-string ret <OldStr> ret <NewStr> ret
列替换
选中范围 C-x r t <NewStr> ret
列删除
选中范围 C-x r d
列剪切 
选中范围 C-x r k
列粘贴
C-x r y
替换Tab为空格
选中范围 M-x untabify ret
删除文件所有行尾空格 
M-x delete-trailing-whitespace ret
批量大小写转换 
选中范围 C-x C-u/C-l
光标后一个单词大小写转换
M-u/M-l
光标所在单词首字母变为大写
M-c
版本比较 diff
C-x v =
版本提交 commit
C-x v v <"message here"> C-c C-c
命令帮助搜索 
C-h a <CmdStr>

DB2 相关命令

建立一个db2 进程,并将当前emacs 实例中的buffers 与其关联
M-x sql-db2 ret 
将当前buffer 与emacs实例中已经存在的db2 进程进行关联
M-x sql-set-sqli-buffer ret

在db2 进程已经建立并且关联之后,可以使用以下命令执行db2 CLP命令或SQL语句。

执行整个buffer的语句
M-x sql-send-buffer 
执行选中的语句
选中范围 M-x sql-send-region
执行光标所在段落的语句
M-x sql-send-paragraph

段落的默认分隔符是空行(或者仅含有空格和TAB)。

在命令编辑区编辑新语句并执行
M-x sql-send-string

以上执行语句的部分命令有快捷键可调用,也可以使用global-set-key 命令将其更改为自己习惯的按键。

延展阅读

Subversion 安装笔记

subversion 是一个开源的版本控制软件,虽然在稳定性方面较cvs还有些距离,不过很受追捧,牛顿顿说,这主要得益于subversion在处理大项目效率方面的优势,目前版本是1.4.4。 安装subversion 服务 在这里 下载subversion 的windows 平台软件包,解压缩即可。 然后打开一个DOS 命令行,进入到解压缩的bin目录,运行以下命令创建一个repository(存放版本控制信息的地方)。把PROJECT_NAME 替换为你需要的项目名称。 C:\svn\bin> mkdir \repository\subversion\PROJECT_NAME C:\svn\bin>...

subversion 是一个开源的版本控制软件,虽然在稳定性方面较cvs还有些距离,不过很受追捧,牛顿顿说,这主要得益于subversion在处理大项目效率方面的优势,目前版本是1.4.4。

安装subversion 服务

这里 下载subversion 的windows 平台软件包,解压缩即可。

然后打开一个DOS 命令行,进入到解压缩的bin目录,运行以下命令创建一个repository(存放版本控制信息的地方)。把PROJECT_NAME 替换为你需要的项目名称。

C:\svn\bin> mkdir \repository\subversion\PROJECT_NAME
C:\svn\bin> svnadmin create \repository\subversion\PROJECT_NAME

然后参照这里的安装指南 把subsersion安装为windows系统服务,并在启动时加载。意等号后面必须留有空格。

C:\svn\bin> sc create svn binpath= "C:\svn\bin\svnserve.exe --service -r C:\repository\subversion" displayname= "Subversion Server" depend= Tcpip start= auto

注意:执行命令时,需要把subversion 的安装路径以及repository 的路径替换成你自己的路径。svn 是服务名称,你也可以随便命名。

这个系统服务可以通过 sc delete svn 命令删除,服务的启动有两种方式:sc start svn 或者 net start svn 。具体可以参考windows 的sc  以及net 命令。

配置版本库权限

配置文件位于 .\repository\subversion\PROJECT_NAME\conf\ 目录

passwd 文件定义了存取版本库的用户名与密码,格式为:

myusername - mypassword 

svnserve.conf 文件需要添加如下几行:

anon-access = none
auth-access = write
password-db = passwd 

如够希望匿名用户可以checkout 版本库,那么修改第一行为 anon-access = read。 下面一行用于复杂一些的权限配置,如果添加此行,需要配置authz 文件,在这里我把此行注释掉。

# authz-db = authz 

另外还有一行用于定义Project名称,但经过实验,这行可以省略。

# realm = PROJECT_NAME 

至此,subversion 服务安装完成,并且创建了一个版本库。如果已经安装了subversion客户端,则可以通过svn://localhost/PROJECT_NAME 进行访问。

subversion 客户端

subversion 的客户端在windows 可以使用tortoiseSVN 或者subversion eclipes plugin. 

tortoiseSVN 是一个基于subversion服务的windows GUI,并集成了tortoiseMerge 版本比较工具。它和Windows 资源管理器紧密地结合在一起,以插件形式出现,来进行版本控制操作,当前版本也是1.4.4。

使用subversion eclipes plugin 需要先安装eclipes,然后通过插件更新安装subversion plugin,安装完成后,就可以像使用cvs 一样在eclipes 中使用subversion。

在这里下载 tortoiseSVN 1.4.4,安装完成之后,在资源管理器中点击右键,就会看到相关菜单。可以在资源管理器找到要管理的源代码,在目录上点击右键,选择TortoiseSVN 菜单中的Import ,并在Url of repository 下来菜单中选择刚才创建好的repository 即可。然后在working copy 目录中将代码checkout,就在working copy 目录中实现了代码的版本管理。

版本库备份

如果需要对项目版本库备份,只需要把整个.\repository\subversion\PROJECT_NAME 目录备份即可,如果需要在另一台还原备份,需要先安装好subversion服务与客户端(不必创建repository),然后把上述目录copy到svn服务所引用的目录中即可(本例为 c:\repository\subversion)。然后刷新subversion client,通过认证即可看到版本库。

参考信息

Firefox Extension 思维导图

因为图片太宽,要完整显示,请点击这里暂时禁止样式单。 恢复样式单,请点击这里,或者刷新本页。 最近几天看有关Firefox Extension 的开发,有很多知识链接,使用MindManager 做了这个思维导图,链接可以点击。 更新了链接,增加了浏览指引小图标...

因为图片太宽,要完整显示,请点击这里暂时禁止样式单

恢复样式单,请点击这里,或者刷新本页。

Firefox Extension Why use XUL? Why use XUL? http://www.mozilla.org/js/spidermonkey/ http://www.mozilla.org/js/spidermonkey/ http://kb.mozillazine.org/Setting_up_extension_development_environment http://kb.mozillazine.org/Setting_up_extension_development_environment http://xulplanet.com/tutorials/xultu/ http://xulplanet.com/tutorials/xultu/ http://developer.mozilla.org/en/docs/About_JavaScript http://developer.mozilla.org/en/docs/About_JavaScript http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide http://www.cat-snow.com/post/146.html http://www.cat-snow.com/post/146.html http://www.cat-snow.com/post/137.html http://www.cat-snow.com/post/137.html http://www.xulplanet.com/references/elemref/ http://www.xulplanet.com/references/elemref/ http://www.cat-snow.com/post/140.html http://www.cat-snow.com/post/140.html http://www.cat-snow.com/post/145.html http://www.cat-snow.com/post/145.html http://www.mozilla.org/js/scripting/ http://www.mozilla.org/js/scripting/ http://kb.mozillazine.org/Extension_development http://kb.mozillazine.org/Extension_development http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference http://developer.mozilla.org/en/docs/Creating_Custom_Firefox_Extensions_with_the_Mozilla_Build_System http://developer.mozilla.org/en/docs/Creating_Custom_Firefox_Extensions_with_the_Mozilla_Build_System http://developer.mozilla.org/en/docs/Extensions http://developer.mozilla.org/en/docs/Extensions http://developer.mozilla.org/en/docs/XMLHttpRequest http://developer.mozilla.org/en/docs/XMLHttpRequest http://developer.mozilla.org/en/docs/Building_an_Extension http://developer.mozilla.org/en/docs/Building_an_Extension http://developer.mozilla.org/en/docs/Code_snippets http://developer.mozilla.org/en/docs/Code_snippets

最近几天看有关Firefox Extension 的开发,有很多知识链接,使用MindManager 做了这个思维导图,链接可以点击。

更新了链接,增加了浏览指引小图标

Javascript 的噩梦可以结束了

Firebug 是针对Firefox 的一个插件,它与Firefox 很好的集成到了一起,帮助你分析与网页在客户端的一切行为,当然,获益最大的大概就是Javascript 的调试了。 下面是一个例子,红色部分代表遇到了一个脚本错误。 点开后,Firebug 指示出了错误文件与相关代码行。  再继续查看,就直接定位到了相关上下文,这里我们可以看到,是在line 22 多了一个额外的注释标记 "*/",导致此错误。 修复后,显示正常状态。 如果错误不太容易找到,还可以设置断点进行调试,直接在行号部分点击即可设置断点,然后刷新一次网页重新执行脚本,执行到断点处会自动停下,可以像通常调试工具一样选择执行进度,观察并设置变量。 Firebug...

Firebug 是针对Firefox 的一个插件,它与Firefox 很好的集成到了一起,帮助你分析与网页在客户端的一切行为,当然,获益最大的大概就是Javascript 的调试了。

下面是一个例子,红色部分代表遇到了一个脚本错误。

firebug status

点开后,Firebug 指示出了错误文件与相关代码行。

firebug interface

 再继续查看,就直接定位到了相关上下文,这里我们可以看到,是在line 22 多了一个额外的注释标记 "*/",导致此错误。

firebug interface

修复后,显示正常状态。

firebug status

如果错误不太容易找到,还可以设置断点进行调试,直接在行号部分点击即可设置断点,然后刷新一次网页重新执行脚本,执行到断点处会自动停下,可以像通常调试工具一样选择执行进度,观察并设置变量。

Firebug 是完全免费的,要了解更多的功能,请参考考官方网站 。 

Google 之三人成虎

这两天查找有关彻底清除硬盘数据的信息,Google帮了不少忙,很多资料都引用了美国国防部的DoD 5220.22-M 标准,类似以下的文字在中文互联网上广泛流传 。 美国国防部在《国家工业安全程序操作手册》中对硬盘数据清除作了专门的描述,这个安全标准被称为DOD 5220.22-M(www.dss.mil/isec/nispom_0195.htm)。该手册建议对所要清除的数据区进行三次覆盖,第一次使用一个8位的字符,第二次使用该字符的互补字符(即将二进制位的0、1互换),最后再使用随机字符进行覆盖。 注:NISPOM 是国家工业安全程序(NATIONAL INDUSTRIAL SECURITY PROGRAM)的缩写。 国内外的各种数据清除工具,也有很多按上述类似说法引用了此标准,比如有名的开源软件Darik's Boot and Nuke。出于兴趣,我找到了这个...

这两天查找有关彻底清除硬盘数据的信息,Google帮了不少忙,很多资料都引用了美国国防部的DoD 5220.22-M 标准,类似以下的文字在中文互联网上广泛流传

美国国防部在《国家工业安全程序操作手册》中对硬盘数据清除作了专门的描述,这个安全标准被称为DOD 5220.22-M(www.dss.mil/isec/nispom_0195.htm)。该手册建议对所要清除的数据区进行三次覆盖,第一次使用一个8位的字符,第二次使用该字符的互补字符(即将二进制位的0、1互换),最后再使用随机字符进行覆盖。

注:NISPOM 是国家工业安全程序(NATIONAL INDUSTRIAL SECURITY PROGRAM)的缩写。

国内外的各种数据清除工具,也有很多按上述类似说法引用了此标准,比如有名的开源软件Darik's Boot and Nuke。出于兴趣,我找到了这个 DoD 5220.22-M 文档(前文的链接无法访问),但无论如何有没有找到被大量资料所提及的数据清除方法。我开始怀疑这个引用的权威性,最后,在wikipedia 找到的文字证实了我的猜测。国内一直无法访问wikipedia ,下面的链接使用了网站代理

Misunderstanding as a data sanitization standard

DoD 5220.22-M is sometimes cited as a standard for sanitization to counter data remanence. This is incorrect. The NISPOM covers the entire field of government-industrial security, of which data sanitization is a very small part (about two paragraphs in a 100 page document)[4]. Furthermore, the NISPOM does not actually specify any particular method. Standards for sanitization are left up to the Cognizant Security Authority. The Defense Security Service provides a Clearing and Sanitization Matrix[5] which does specify methods; access to the current C&SM is restricted here.

DoD 5220.22-M 一度被作为数据清除的标准进行引用,这是错误的。这个文档覆盖了全部的政府与工业的安全领域,描述数据清除的内容仅占很小的一部分(100页文档中仅有2段文字)。此外,文档中并没有定义任何具体的数据清除方法。数据清除的标准是由Cognizant Security Authority(不知如何翻译)来决定的,可以在国防安全服务(Defense Security Service)提供的一个名为“Clearing and Sanitization Matrix的文档中找到。

以下是有关硬盘数据的那部分内容,与前述相符,但不同的是,这不属于DoD 5220.22-M 标准。

d. THIS METHOD NOT APPROVED FOR SANITIZING MEDIA THAT CONTAINS TOP SECRET INFORMATION.

1. Before any sanitization product is acquired, careful analysis to the overall costs associated with overwrite/sanitization should be made. Depending on the contractor’s environment, the size of the drive and the differences in the individual products time to perform the sanitization, destruction of the media might be the preferred (i.e., economical) sanitization method.

2. Overwrite all addressable locations with a character, then its complement. Verify “complement” character was written successfully to all addressable locations, then overwrite all addressable locations with random characters; or verify third overwrite of random characters. Overwrite utility must write/read to “growth” defect list/sectors or disk must be mapped before initial classified use and remapped before sanitization. Difference in the comparison lists must be discussed with the DSS Industrial Security Representative (IS Rep) and/or Information System Security Professional (ISSP) before declassification. Note: Overwrite utilities must be authorized by DSS before use.

值得注意的是,文档中注明:这种数据清除方法并不适用于绝密信息。可见对于美国以外,甚至其它非政府控制机构,其安全性仍然有限。

Google就像快餐,速食并且方便,但食得不干净却容易拉肚,很多人不再关心信息的来源,瞧!Google到这么多相同的搜索结果,就是它了!正所谓三人成虎。

硬盘:一次写入,永不消失

像大多数人所了解的,我知道计算机内部使用二进制1和0传输和存储数据,硬盘也不例外,磁盘片上布满了用磁格式记录的1和0。这些1和0是磁盘上数据的最小组成单位,数据包括文件分配表(FAT)以及实际文件内容等。从前我认为,删除文件之后(在文件分配表中删除),只要利用工具使用其它数据覆写一遍原文件所在区域(实际存储区域),就会使这个文件无法恢复。 但实际情况可不是这么简单,磁盘上记录了代表1和0的磁信号,对个人计算机上的磁头来说,这是数字信号,但对于专用的设备,它们却还是模拟信号,每一个数据位磁信号的强弱,或者数据位深层遗留的磁信号,以及由于定位误差在数据位边缘留下的信号(称为影子数据),在这样的设备看来,都是线形的。 目前网上广泛流传的说法是,使用专用的设备可以把覆写过多次的硬盘一遍又一遍的依次还原回来,理论上可以高达7次。 当然这种方法的成本也很高,可能一般只用于解决国家安全级别的问题。 美国国防安全服务(Defense Security Service)在一个名为“Clearing and Sanitization Matrix ”的文档中,定义了一般密级数据的清除标准,但并不适用于绝密数据。有关这个标准,网上一直存在着广泛的误解,我在“Google 之三人成虎 ”文中予以了澄清。 对于硬盘的一般性物理损坏,以及非彻底消磁等手段,也无法保证数据的安全性,在现今普遍的高密度磁记录水平下,一小片底层仍含有微弱磁信号的磁盘碎片足以包含大量的敏感信息,并可能被恢复。 前述的理论已经形成多年,在技术日益更新的今天,发达国家当今最先进的数据恢复技术如何,还不得而知,但我们可以想象,对于一个普通用户来说,“一次写入,永不消失”这个说法一点也不为过。...

Destroy your data像大多数人所了解的,我知道计算机内部使用二进制1和0传输和存储数据,硬盘也不例外,磁盘片上布满了用磁格式记录的1和0。这些1和0是磁盘上数据的最小组成单位,数据包括文件分配表(FAT)以及实际文件内容等。从前我认为,删除文件之后(在文件分配表中删除),只要利用工具使用其它数据覆写一遍原文件所在区域(实际存储区域),就会使这个文件无法恢复。

但实际情况可不是这么简单,磁盘上记录了代表1和0的磁信号,对个人计算机上的磁头来说,这是数字信号,但对于专用的设备,它们却还是模拟信号,每一个数据位磁信号的强弱,或者数据位深层遗留的磁信号,以及由于定位误差在数据位边缘留下的信号(称为影子数据),在这样的设备看来,都是线形的。

目前网上广泛流传的说法是,使用专用的设备可以把覆写过多次的硬盘一遍又一遍的依次还原回来,理论上可以高达7次。 当然这种方法的成本也很高,可能一般只用于解决国家安全级别的问题。

美国国防安全服务(Defense Security Service)在一个名为“Clearing and Sanitization Matrix的文档中,定义了一般密级数据的清除标准,但并不适用于绝密数据。有关这个标准,网上一直存在着广泛的误解,我在“Google 之三人成虎 ”文中予以了澄清。

对于硬盘的一般性物理损坏,以及非彻底消磁等手段,也无法保证数据的安全性,在现今普遍的高密度磁记录水平下,一小片底层仍含有微弱磁信号的磁盘碎片足以包含大量的敏感信息,并可能被恢复。

前述的理论已经形成多年,在技术日益更新的今天,发达国家当今最先进的数据恢复技术如何,还不得而知,但我们可以想象,对于一个普通用户来说,“一次写入,永不消失”这个说法一点也不为过。

煎蛋 的blog找到这个很酷的图片用作本文配图。

DoD 是Department of Defense(国防部) 的缩写,这里指美国国防部。

Reference 

UltraEdit 对UTF-8文件的自动处理

关于Unicode 编码,这里有篇文章 可以参考。Unicode是几种多字节编码格式的统称,其中使用广泛的有UTF-8与UTF-16,而通常人们说Unicode时,实际是在指UTF-16编码,UltraEdit 就是这样,为了避免混淆,下面都按照标准引用名字。  使用UltraEdit 打开一个UTF-8 编码的文件,然后按ctrl+h 进入16进制模式查看文件内码,你会发现文件已经被转换成UTF-16 编码,并添加了UTF-16 little endian 的BOM :FF  FE,UltraEdit 状态栏文件的尺寸也增加了不少。其实大可不必担心,可以回到正常模式继续编辑并保存,保存后的文件并没有改变编码格式,只是在编辑时使用UTF-16格式而已。...

关于Unicode 编码,这里有篇文章 可以参考。Unicode是几种多字节编码格式的统称,其中使用广泛的有UTF-8与UTF-16,而通常人们说Unicode时,实际是在指UTF-16编码,UltraEdit 就是这样,为了避免混淆,下面都按照标准引用名字。 

使用UltraEdit 打开一个UTF-8 编码的文件,然后按ctrl+h 进入16进制模式查看文件内码,你会发现文件已经被转换成UTF-16 编码,并添加了UTF-16 little endian 的BOM :FF  FE,UltraEdit 状态栏文件的尺寸也增加了不少。其实大可不必担心,可以回到正常模式继续编辑并保存,保存后的文件并没有改变编码格式,只是在编辑时使用UTF-16格式而已。

因此,如果通过UltraEdit打开文件查看BOM 来确定文件格式,并不是安全的。UltraEdit 下方状态栏则真实的显示了当前打开文件的实际编码格式,而不是当前编辑的编码格式。 对于一个普通Ascii 格式的文件,它显示为DOS 或者UNIX,对于一个包含有UTF-8编码字符的文件,它显示为U8-DOS 或者U8-UNIX,对于UTF-16编码的文件,它显示为U-DOS 或者U-UNIX。

我们知道,UTF-8 对于Ascii 字符的编码与原有的Ascii 编码一致,因此假如我们删除了一个UTF-8 DOS文件中所有Ascii 以外的字符,保存后再打开,UltraEdit 将显示为DOS(Ascii)。

如果我们不希望UltraEdit 在打开UTF-8 文件时自动转为UTF-16 格式编辑,我们可以修改配置。如下图,确保“自动检测 UTF-8文件”不被选中。

 UltraEdit configuration

需要注意的是,如果取消了这个选项,UltraEdit打开包含UTF-8编码的文件会产生乱码。

UltraEdit 在File-Convertions 菜单中提供了多种编码格式之间的转换,这将影响到保存的文件编码,转换后,在状态栏也能看到相应变化。在有些选项后标明有(Unicode Editing) 或者(ASCII Editing),这指定了编辑时显示用的编码,并不影响保存文件所用的编码,要区分开。

工具WinHex 可以用来查看文件16进制内码。

在Perl 中如何按字节操作字符串

从版本5.6,Perl 内部开始支持Unicode编码,一些字符串操作函数,比如length、substr,默认基于字符操作,而不是bytes 操作。在Perl中,如果希望使substr() 函数基于bytes 操作怎么办, 在Oracle 8i数据库中有个对应的函数,叫做substrb(),在DB2 8.2中,字符串函数默认就是基于bytes 操作,并不识别字符编码。而对于perl,没有提供相应的函数,而是用了另一种方法,bytes 关键字,用法如下: use bytes; substr(); no bytes;...

从版本5.6,Perl 内部开始支持Unicode编码,一些字符串操作函数,比如length、substr,默认基于字符操作,而不是bytes 操作。在Perl中,如果希望使substr() 函数基于bytes 操作怎么办, 在Oracle 8i数据库中有个对应的函数,叫做substrb(),在DB2 8.2中,字符串函数默认就是基于bytes 操作,并不识别字符编码。而对于perl,没有提供相应的函数,而是用了另一种方法,bytes 关键字,用法如下:

use bytes;
substr();
no bytes;

更多信息,请参考Perl 文档。 

在Dreamhost自动备份mysql数据库

今天准备在Dreamhost 上自动备份blog的DB,MySQL是Dreamhost唯一提供的关系数据库服务,当前版本5.0 我了解很少(这里有个学习笔记 ),已知可以在命令行使用mysqldump 命令备份整个数据库,备份时似乎无需了解数据库的当前状态(比如是否正在运行事务),它会自行处理,从备份出的文件看,mysqldump实现的是冷备份,也就是说,仅采用这种备份方法,数据仅能恢复到最后一次运行mysqldump的时间点。 MySQL也介绍了一个热备份工具mysqlhotcopy,不过文档中有以下声明,我不清楚什么是MyISAM 与ARCHIVE tables,也不大明白MySQL 热备份的恢复机制(如何前滚日志)。还好,我的数据库目前很小,而我的空间很大很大,每次全备份只花费很少的时间,也占用很小的空间。 mysqlhotcopy works only for backing up...

今天准备在Dreamhost 上自动备份blog的DB,MySQL是Dreamhost唯一提供的关系数据库服务,当前版本5.0 我了解很少(这里有个学习笔记 ),已知可以在命令行使用mysqldump 命令备份整个数据库,备份时似乎无需了解数据库的当前状态(比如是否正在运行事务),它会自行处理,从备份出的文件看,mysqldump实现的是冷备份,也就是说,仅采用这种备份方法,数据仅能恢复到最后一次运行mysqldump的时间点。

MySQL也介绍了一个热备份工具mysqlhotcopy,不过文档中有以下声明,我不清楚什么是MyISAM 与ARCHIVE tables,也不大明白MySQL 热备份的恢复机制(如何前滚日志)。还好,我的数据库目前很小,而我的空间很大很大,每次全备份只花费很少的时间,也占用很小的空间。

mysqlhotcopy works only for backing up MyISAM and ARCHIVE tables. It runs on Unix and NetWare.

使用mysqldump备份出来的文件,是一个包含了sql语句的文本文件,含有建表语句以及Insert语句。我采用这种方式恢复:连接到mysql进入mysql提示符,创建一个db(如果不存在),连接到此db,执行备份文件,如:

mysql> source ./mybackup.sql 

执行结束则恢复完毕。这里有篇日志 介绍了另外一种恢复方法(如下),不过我没有尝试过。 

$ mysqldump -u root -p'123456' test2 < samp.db.txt 

言归正传,我准备采用crontab 自动运行mysqldump 来自动备份数据库。写了一个shell脚本如下,备份文件使用当前系统时间(到分钟)作为文件名,备份成功后进行压缩。

backupdb.sh 

bakfile=~/xxx/mt-db_`date '+\%Y\%m\%d\%H\%M'|tr -d '\\\'`.sql
mysqldump -hmysql.mydomain.com -umyname -pmypasswd mt > $bakfile
gzip $bakfile
exit 0

然后在crontab中加入条目,定时自动运行此脚本。这里设置为每4个小时,在整点运行一次,每天产生一份日志。

00 0-23/4 * * * ~/xxx/backupdb.sh >> ~/xxx/logs/backupdb_`date '+\%Y\%m\%d'|tr -d '\\\'`.log 

经试验`date '+\%Y\%m\%d'|tr -d '\\\'`部分似乎不能被cron命令成功替换,但是在shell中是可以成功执行的。

$ echo backupdb_`date '+\%Y\%m\%d'|tr -d '\\\'`.log
backupdb_20070127.log

MySQL Notes

Connect to db mtmysql> use mtList DB or tablesmysql> show databases;mysql> show tables;Backup DB mtdos> mysqldump...

Connect to db mt

mysql> use mt

List DB or tables

mysql> show databases;
mysql> show tables;

Backup DB mt

dos> mysqldump -u root -p mt > dbname.sql;

Query table mt_entry structure 

mysql> show create table mt_entry;

 

 

Convert MT from Berkeley DB to MySQL

最近决定把MT的后台数据从Berkeley的文件DB转到MySQL。原因之一是使用关系数据库可以获得更多的灵活性,比如运行一条sql来变更 所有entry的某一个属性;另外一个原因是为了提前熟悉一下这个数据库,牙牙网站使用虚拟主机,DreamHost提供的数据库是MySQL,而我从前 主要使用了SQL Server,Oracle和DB2,Postgresql也只了解了一点,而MySQL则几乎没有接触过。下载了5.0.27安装文件,安装顺利,使用了第一个默认端口3306,UTF-8的数据库字符集。安装完成,运行了命令行客户端,输入help,给出的帮助命令不多,也没见到有关数据库创建的命令,便查了安装的帮助文件,组织的还算不错,很齐全,很快找到相关的命令:查看已有数据库show databases;连接数据库 testuse test;创建数据库 mtcreate database mt;接下来寻找把已有DB转化到MySQL的方法,很快找到一个第三方的工具mt-db-convert.cgi ,可以实现MT支持的几种不同的DB之间的转换。下载回来放到cgi-bin的mt目录,在浏览器访问运行,输入新创建的MySQL数据库名称mt,用户名root,密码,主机填入localhost,开始Convert。转换过程很快就完成了,不到1分钟,没有出现错误提示,转换信息如下:mt-db-convert.cgi($Rev: 173 $): Converting your MT...

最近决定把MT的后台数据从Berkeley的文件DB转到MySQL。原因之一是使用关系数据库可以获得更多的灵活性,比如运行一条sql来变更 所有entry的某一个属性;另外一个原因是为了提前熟悉一下这个数据库,牙牙网站使用虚拟主机,DreamHost提供的数据库是MySQL,而我从前 主要使用了SQL Server,Oracle和DB2,Postgresql也只了解了一点,而MySQL则几乎没有接触过。

下载了5.0.27安装文件,安装顺利,使用了第一个默认端口3306,UTF-8的数据库字符集。

安装完成,运行了命令行客户端,输入help,给出的帮助命令不多,也没见到有关数据库创建的命令,便查了安装的帮助文件,组织的还算不错,很齐全,很快找到相关的命令:

查看已有数据库
show databases;

连接数据库 test
use test;

创建数据库 mt
create database mt;

接下来寻找把已有DB转化到MySQL的方法,很快找到一个第三方的工具mt-db-convert.cgi ,可以实现MT支持的几种不同的DB之间的转换。

下载回来放到cgi-bin的mt目录,在浏览器访问运行,输入新创建的MySQL数据库名称mt,用户名root,密码,主机填入localhost,开始Convert。转换过程很快就完成了,不到1分钟,没有出现错误提示,转换信息如下:

mt-db-convert.cgi($Rev: 173 $): Converting your MT data between DB engines (for MT 3.2)

Loading database schema...

Loading data...
MT::Author
.
(1 objects saved.)

MT::Blog
..
(2 objects saved.)

MT::Trackback
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......
(327 objects saved.)

MT::Category
.......... .......... .......... .......... ..........
(50 objects saved.)

MT::Comment
..
(2 objects saved.)

MT::Entry
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... ....
(514 objects saved.)

MT::IPBanList

(0 objects saved.)

MT::Log
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......
(437 objects saved.)

MT::Notification

(0 objects saved.)

MT::Permission
....
(4 objects saved.)

MT::Placement
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......... .......... .......... .......... .......... .......... .......... ..........
.......... .......... .......
(527 objects saved.)

MT::Template
.......... .......... .......... .......... .......... .......... .......... .......... ...
(83 objects saved.)

MT::TemplateMap
..........
(10 objects saved.)

MT::TBPing

(0 objects saved.)

MT::Session
.......... .......... .........
(29 objects saved.)

MT::PluginData

(0 objects saved.)

MT::Config
.
(1 objects saved.)

MT::FileInfo

(0 objects saved.)


Done copying data from DBM to DBI::mysql! All went well.

Your recommended setting
-------------------------------------
# DataSource R:/SITE/mt-db
ObjectDriver DBI::mysql
Database mt
DBUser root
DBHost localhost
DBPassword comein
-------------------------------------

然后修改mt-config.cgi文件,把数据源改成MySQL。 

再次访问MT,看起来一切正常,甚至原有的session都没有丢掉,只是后台使用的数据已经改变了位置。
不过发现了中文乱码问题,Google到了这个方法 ,按文修改后,需要再次执行mt-db-convert.cgi,把数据重新导入MySQL,再访问MT,乱码没有了,所有中文显示正常。

转换后又发现了一个新的问题,原DB中的Tags全部丢失,原因是mt-db-convert.cgi仅支持到MT 3.1,3.3的新功能带来的数据变化可能还会有其它信息丢失。

NOTE

This script is compatible with Movable Type version 3.1x. I didn't test it at any other versions.


其实MT自身已经提供了转换工具mt-db2sql.cgi,与mt.cgi在同一目录当中。使用方法是,安装好MySQL数据库服务,并创建好用于MT的DB,将MySQL数据库的配置信息加入mt-config.cgi,并同时保留原Berkeley DB的路径配置,即保持两种DB的配置同时生效,然后通过浏览器运行mt-db2sql.cgi,转换会自动开始,显示如下信息:

Loading database schema...

Loading data...
MT::Author
1

MT::Blog
1
3

MT::Trackback
...

Done copying data from Berkeley DB to your SQL database! All went well.

确认转换成功后,再修改mt-config.cgi,注释掉Berkeley DB的配置即可。

这里是官方的帮助文档:

 

Unicode Byte Order Mark

Unicode file always set the first byte as certain content to indicate the file format. We...

Unicode file always set the first byte as certain content to indicate the file format. We could use edit tools like UltraEdit open the file in Hex mode to see the byte.

Byte order mark Description
EF BB BF UTF-8
FF FE UTF-16, little endian
FE FF UTF-16, big endian
FF FE 00 00 UTF-32, little endian
00 00 FE FF UTF-32, big-endian

Note: Microsoft uses UTF-16, little endian byte order.

More refer to Byte-order Mark

 

batch for forlders synchronization

 synfolders.bat@echo onrem Save the current dir, [d] is disk letter, [p] is path namepushd %~dp0rem Change...

 synfolders.bat

@echo on

rem Save the current dir, [d] is disk letter, [p] is path name
pushd %~dp0

rem Change into my work dir
e:
cd \My Documents\My Company\ÈÕ¿¯\Code\pub

rem Coping my files to the public server
xcopy * l:\pub /s/e/y

rem Create the new dir with current system date in the pravite dir
rem [%DATE:~-10%] is get the last 10 ascii from the system date
md l:\zhangy\pub\%DATE:~-10%

rem Coping my file to the new dir in the pravite dir
xcopy * l:\zhangy\pub\%DATE:~-10% /s/e/y
xcopy * l:\zhangy\pub\whole /s/e/y

rem Resume the old dir
popd

@echo off 

batch of operation under DOS

How to get a list of files name without path, size and datetime.rem '/b' is short...

How to get a list of files name without path, size and datetime.

rem '/b' is short list, '/on' is sort by name, '/a-d' is list all except dir.
dir /b/on/a-d/s > list.txt

How to add string to each of a batch of files name. 

rem add double '@' into the start of each file name with full path and extension.
FOR /R %I IN (*.fnc *.prc *.sql *.bdy *.spc) DO echo @@%~fnxI

for command reference

dos> for /? (part of)

 %~I         - expands %I removing any surrounding quotes (")
 %~fI        - expands %I to a fully qualified path name
 %~dI        - expands %I to a drive letter only
 %~pI        - expands %I to a path only
 %~nI        - expands %I to a file name only
 %~xI        - expands %I to a file extension only

How to rename a bench of files name

FOR /R %I IN (*.*) DO ren *.* *.bak

 

Execute batch file before windows shutdown

click start -> run.enter gpedit.msc, then click OK.find the path of  Computer Configuration -> Windows Settings...

click start -> run.

enter gpedit.msc, then click OK.

find the path of 

Computer Configuration -> Windows Settings -> Scripts(Startup/Shutdown)

then add the path of batch files which you want to be executed before shutdown to the Shutdown item. 

Reference 

 

translate Latin-1 in UTF-8 back to ASCII

Latin-1 characters (0x80 - 0xFF) are encoded as two-byte by UTF-8.UTF-8 ASCIIHEX BIN DEC DEC C2 A0 1100-0010 1010-0000194 160 160 C3 801100-0011 1000-0000195...

Latin-1 characters (0x80 - 0xFF) are encoded as two-byte by UTF-8.

UTF-8 ASCII
HEX BIN DEC DEC 
C2 A0 1100-0010 1010-0000194 160 160 
C3 80
1100-0011 1000-0000195 128192 
C3 81 1100-0011 1000-0001195 129193

In some case, we might need to translate the Latin-1 characters encoded by UTF-8 back to one-byte.

First we need to know how UTF-8 encodes the Latin-1 from one-byte to two-byte. All two-byte UTF-8 characters have the following fixed encoding format. the value of 'x' depends the character being encoded.

110x,xxxx 10xx,xxxx 

In the first byte, the first two '11' means that this is a two byte character. the closest followed '0' is a fixed flag for spliting the first two flag bits with the rest bits.

In the second byte, the first '10' is fixed flag to make a difference with the leading byte, for example, 110x,xxxx is a leading byte for a character. All ASCII characters is leading by a 0xxx,xxxx, so if the application reads a byte like 10xx,xxxx and can not read the byte before it, then it can abandon this byte to read next.

For an ASCII encoded Latin-1 character 0xC1, its binary encoding is:

11000001

Fowlling shows how it maps to the two-byte in UTF-8 encoding.

11000011 10000001 

110 and 10 is fix flag.

000 is the fillers.

Way one 

Following is the implement by DB2 SQL PL.

SET h_s = SUBSTR( str, i, 1 ) ;
SET l_s = SUBSTR( str, i + 1, 1 ) ;

SET h_s = CHR( MOD( ASCII( h_s ) * 64, 256 ) ) ;
SET l_s = CHR( MOD( ASCII( l_s ) * 4, 256 ) / 4 ) ;

RETURN CHR( ASCII( h_s ) + ASCII( l_s ) ) ;

In the code above, we use the operators *(multiple), /(divide), +(plus) and 'mod' instead of the bit-operators in C language, <<, >> and 'or'. It's the same with following C code.

h_s = h_s << 6 ;
l_s = l_s << 2 ;
l_s = l_s >> 2 ;

return h_s or l_s ;

Way two 

SET h_s = SUBSTR( str, i, 1 ) ;
SET l_s = SUBSTR( str, i+1, 1 ) ;

ELSEIF (h_s = 194) THEN -- latin-1
-- 0xC2 0x80 - 0xC2 0xBF ==> 0x80 - 0xBF
RETURN l_s ;

ELSEIF (h_s = 195) THEN -- latin-1
-- 0xC3 0x80 - 0xC3 0xBF ==> 0xC0 - 0xFF, 0xC0 - 0x80 = 0x40(64)
RETURN CHR( ASCII( l_s ) + 64 ) ;

END IF;

A summary for UTF-8 and Unicode FAQ

ASCII and ISO-8859-1  There're 2 Character Sets most widely-used for computers. ASCII (Basic Latin) ISO-8859-1 (Latin-1)...

ASCII and ISO-8859-1 

There're 2 Character Sets most widely-used for computers.

  • ASCII (Basic Latin)
  • ISO-8859-1 (Latin-1)

The table in below shows the internal code range in computer for the 2 Character Sets.

Charset  Hex
Dec  Bin 
ASCII (Basic Latin) 0x00 - 0x7F  0 - 127  00000000 - 01111111 
ISO-8859-1 (Latin-1) 0x80 - 0xFF  128 - 255  10000000 - 11111111 

All ASCII and Latin-1 characters are encoded in one byte(8-bit).

People also refers ISO-8859-1 as the superset of ASCII. there's a little mess. 

ISO-10646 and Unicode 

In around 1991, ISO-10646 and Unicode merged their work, and will keep the 2 Character Sets consistent in the future.

Commonly, people say "unicode" when they are refering to encoding method, it's truly meaning UTF-16.

UTF-7
relatively unpopular 7-bit encoding, often considered obsolete
UTF-8
8-bit, variable-width encoding
UCS-2 and UTF-16 16-bit, fixed-width encoding, difference is that UCS-2 only supports the BMP
UCS-4 and UTF-32
functionally identical 32-bit fixed-width encodings
UTF-EBCDIC
unpopular encoding intended for EBCDIC based mainframe systems

Now Unicode 2.0 is widely used. 

Reference

 

operators in C Language

bit operators Example for bit operators且奇偶位已经被置位。    C语言运算符http://www.ddvip.net/program/c/index1/10.htm...

bit operators 

Example for bit operators

且奇偶位已经被置位。

 

 

special characters in programming

  space or blank -  minus sign  " quotation mark or double quote or double...
 
space
or blank
minus sign 
"

quotation mark
or double quote
or double quotation mark 

period
percent  /
slash
ampersand
:
colon

apostrophe
or single

semicolon