OS X 10.6.2 Update
11/10/2009, 12:28 - Apple


OS X server 10.4.11 upgrade to 10.6 問題解決
11/06/2009, 21:35 - Apple
看來是 Apache 和 PHP5 之間的問題,Snow Leopard Server 的 PHP 是
root# php -v
PHP 5.3.0 (cli) (built: Jul 19 2009 00:34:29)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
但是在系統中並沒有 Zend,而查看 Sample CPU load of httpd 時,發現 load 是在作 zend debug 時最多,所以在 /etc/php.ini 中加上兩行:
report_zend_debug = 0
mbstring.script_encoding=""
CPU load 就下來了。不過要試個幾天確定一下!
root# uptime
21:41 up 5 days, 10:57, 2 users, load averages: 0.03 0.08 0.52
Snow Leopard hosts.allow and hosts.deny
11/06/2009, 15:00 - Apple
新裝好的 Snow Leopard Server, 一直收到有人用字典攻擊,在測試密碼. 先用 /etc/hosts.allow 和 /etc/hosts.deny 過濾掉沒有正確 IP 正反解的連線, 到時再用 sshdfilter 來擋!/etc/hosts.allow
#
# hosts.allow This file describes the names of the hosts which are
# allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
#in.identd:ALL:ALLOW
#
smtpd:KNOWN,LOCAL,192.168.0.0/255.255.242.0:ALLOW
smtpd:UNKNOWN,PARANOID:DENY
#
httpd:KNOWN,LOCAL,192.168.0.0/255.255.2242.0:ALLOW
httpd:UNKNOWN,PARANOID:DENY
#
vsftpd:LOCAL,KNOWN,192.168.0.0/255.255.242.0:ALLOW
vsftpd:UNKNOWN,PARANOID:DENY
#
##in.telnetd:LOCAL,KNOWN,host,192.168.0.0/255.255.242.0:ALLOW
##in.telnetd:KNOWN,UNKNOWN,PARANOID:DENY
#
ipop3d:KNOWN,LOCAL,192.168.0.0/255.255.242.0,:ALLOW
ipop3d:UNKNOWN,PARANOID:DENY
#
imapd:KNOWN,LOCAL,192.168.0.0/255.255.242.0,:ALLOW
imapd:UNKNOWN,PARANOID:DENY
#
sshd:KNOWN,LOCAL,192.168.0.0/255.255.242.0:ALLOW
sshd:UNKNOWN,PARANOID,173.183.250.38:DENY
#
named:ALL:ALLOW
#
ALL:KNOWN,LOCAL,192.168.0.0/255.255.242.0:ALLOW
ALL:UNKNOWN,PARANOID:DENY
#
/etc/hosts.deny
#
# hosts.deny This file describes the names of the hosts which are
# *not* allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
#ALL:UNKNOWN,PARANOID:DENY
OS X server 10.4.11 upgrade to 10.6 問題暫解
11/03/2009, 11:59 - Apple
最近將原本在 iMac G5 上的 OS X Server 從 Tiger 10.4.11 昇級並換裝至 Mac Mini 的 Snow Leopard Server 10.6. 從 PowerPC 換成 Intel 的 CPU, 因為 Apple 在這兩種 CPU 上使用的 HDD Partition 格式不同, 無法直接以原來PowerPC的硬碟在Intel機器上開機. 所以將 iMac G5 放到 Target Disk Mode, 用 Firewire 連至 MacMini, 當成資料硬碟, 就可以無痛昇級,Snow Leopard Server 系統在一安裝好之後,第一次開機會有 Server Migration 可以自動作昇級,並自動作資料的搬移及轉換, 不過時間要等有點久, Snow Leopard Server 安裝約一個小時,但需要3個小時作 migration, 最多時間用在作原本的 user 所存放的 mail 格式轉換. 10.6 server 的 postfix 己經由原本的 UNIX mailbox 格式, 換成 QMail 的 maildir 可以加快信件的處理速度. 經過 Server Migration 之後, 所有的的資料都在, 密碼及SSL的CA設定也都沒有改變, 在外部的人根本無法察覺到 Server 己經換了.跑了兩天發現系統的 loading (uptime) 會上昇到 40 以上, CPU 100% 滿載, (一般的 UNIX 系統在 3 至 5 就不得了了), 讓系統反應變慢. 檢查的結果應該是 apache2 的關係, 原因還不明, 因為有使用 Squirrel webmail, 無法停掉 apache, 先作一個 shell script 放在 crontab 中定時檢查若 load 大於 8, 就重新起動 apache. 作為暫時解決的方案.
#!/bin/sh
AP_PS=`ps -ax|grep httpd|grep -v grep|wc -l|awk '{printf("%d\n",$1)}'`
LOAD=`uptime|awk '{printf("%d\n",$11)}'`
if [ $LOAD -ge 8 ]; then
if [ $AP_PS -ge 10 ]; then
/usr/sbin/apachectl restart
fi
fi

Parallels Windows 7
10/30/2009, 16:08 - Apple
用 Parallels4 在 Snow Leopard 上跑 Windows 7,得到的測試結果,Graphics 還要再加強啊!
寫好一份文件
10/02/2009, 16:00 - 想到的
經常需要讀一些說明文件,發現好的文件很少,要舉例的話,我只想到 Cisco IOS Configuration Guide 和 Apple Developer Library,這兩者的文件在例子及詳細說明,完完整整都會放在同一份文件中,不需要再參考別的文件,而所需要的答案都可以在看過一至兩份文件之後得到,進而還可以完整了解整個工作的方法及流程。但是其他很多公司的文件就沒有這麼好了,這些文件大都需要參照來參照去的,不在同一份文件中詳細說明,而是用了大量的參考連結,通常的結果就是看了半天,連來連去,結果不知所云。像Microsoft MSDN的文件就是這樣。不直接給答案,而是用連結回答問題,結果弔發更多問題。
不過像Cisco和Apple,也因為將所有的資料都放在一起,並詳細說明,所以文件一般都比較大,但大都可以解決讀者的問題,而且因為太大,所以都提供可下載的版本,拿回去慢慢看。而Microsoft分成無數個小檔案的文件,就是每個文件只有寫一部份,再用連結連起來,其他的請參考某編號文件,經常在轉了一大圈之後回到原點,而問題還是沒有解決,而且因為檔案內容太少,大都沒有提供可下載的版本,不然就是需要拿一堆檔案,自已再從中看看可不可以找到答案。
有一個問題可以找到很多不同的版本,但是以 Cisco 和 Apple 而言,大都會有新舊版本之間的說明可看。而Microsoft的話,就只有看當時的運氣,以及個人的修為而定了。
Open Source 的話,我認為 GNU Project的文件算是很好的,而wxWidget 的也不錯,不過像Qt,GTK+,GNOME及X.org,都太分散了,就很不好。
所以就創造了很多人,利用這些寫得不好的文件,而自己再寫一份來賣錢!
Apple Store updating
09/29/2009, 15:28 - Apple
新東西要來了吧!
rpm2targz
09/16/2009, 13:26 - Open Source
我使用 Slackware Linux作為工作平台,但要找應用程式時,經常看到只有 Debian或是只有rpm的格式。今天要用Google Desktop時,就發現 Linux 版本,只有包裝成 rpm 及 deb,所以就想到用 rpm2targz/rpm2tgz 這個工具轉檔一下,再自已搬到 /usr 下,就可以用了。為何最簡單的格式反而沒有人要用呢?更新更新更新
09/11/2009, 10:58 - 想到的
最近很多東西都作了更新:OS X Leopard 10.5 -> Snow Leopard 10.6 -> Snow Leopard 10.6.1
iPhoto8 -> iPhoto9
iTune8 -> iTune9
iPod Touch 3.0 -> iPod Touch 3.1.1
XCode 3.1 -> XCode 3.2 for Snow Leopard
iPod 5G 更新電池
Slackware 12.2 -> Slackware 13.0 -> Slackware64 13.0
Linux Kernel version 2.6.24 -> version 2.6.30.5
還有一堆東西啊...
工作上也是幫客戶更新了一些東西。
就連台灣的行政內閣也換了新人呢。

所以呢這是一個隨時在更新的年代,有什麼東西是不可以變的呢?
好讀 PDB 檔案轉 TXT
09/07/2009, 16:37 - Open Source
因為想要用 BeBook電子書讀一些從好讀網站的繁體中文電子書。但好讀的檔案格式是用Palm Pilot 的 pdb 格式,BeBook正好就沒有支援pdb,也沒有好的轉換程式可以在Macintosh及Linux上作pdb至text的檔案轉換,用過pdb2txt,但是中文好像有問題,所以呢?男子漢要看電子書就自已作個轉換程式吧。 程式非常簡單,所以就不加說明了。這個程式可以將好讀的電子書轉成純文字格式,並將原來直式的標點符號改成橫式,其他的像是章節分段等好像用不到,所以就不管了。網路上說好讀的格式有加密,不過現在看來是沒有,只是加 pdb的表頭及分段而已。這個程式應該可以用任何版本的 C compiler,若要大量轉換的話,請自已作個 batch script吧。
/*
Translate Palm Document pdb to text in zh_TW.Big5
Programmer : Tasuka Hsu
Date : 2009/Sep/04
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DoubleWord(a) \
a[0]*256*256*256+ \
a[1]*256*256+ \
a[2]*256+ \
a[3]
#define SingleWord(a) \
a[0]*256+a[1]
struct pdbHeader {
unsigned char name[32];
unsigned char attributes[2];
unsigned char version[2];
unsigned char creationDate[4];
unsigned char modificationDate[4];
unsigned char lastBackupDate[4];
unsigned char modificationNumber[4];
unsigned char appInfoID[4];
unsigned char sortInfoID[4];
unsigned char type[4];
unsigned char creator[4];
unsigned char uniqueIDseed[4];
unsigned char nextRecordListID[4];
unsigned char numberOfRecords[2];
} PDB;
int main(int argc, char *argv[])
{
FILE *fp;
int i=0,j=0;
unsigned char c;
char *filename;
if(argc>=2){
filename=(char *)malloc(sizeof(char)*(strlen(argv[1])+1));
strcpy(filename,argv[1]);
}else{
printf("PDB Filename is required.\n");
return(1);
}
if((fp=fopen(filename,"r"))==NULL){
printf("Can not open %s file\n",argv[1]);
return(1);
}
while(!feof(fp)){
c=fgetc(fp);
if(i<32)
PDB.name=c;
if(i>=32 && i<34)
PDB.attributes[i-32]=c;
if(i>=34 && i<36)
PDB.version[i-34]=c;
if(i>=36 && i<40)
PDB.creationDate[i-36]=c;
if(i>=40 && i<44)
PDB.modificationDate[i-40]=c;
if(i>=44 && i<48)
PDB.lastBackupDate[i-44]=c;
if(i>=48 && i<52)
PDB.modificationNumber[i-48]=c;
if(i>=52 && i<56)
PDB.appInfoID[i-52]=c;
if(i>=56 && i<60)
PDB.sortInfoID[i-56]=c;
if(i>=60 && i<64)
PDB.type[i-60]=c;
if(i>=64 && i<68)
PDB.creator[i-64]=c;
if(i>=68 && i<72)
PDB.uniqueIDseed[i-68]=c;
if(i>=72 && i<76)
PDB.nextRecordListID[i-72]=c;
if(i>=76 && i<78)
PDB.numberOfRecords[i-76]=c;
if(i>=78 && i<78+(SingleWord(PDB.numberOfRecords)*8));
if(i>=78+(SingleWord(PDB.numberOfRecords)*8)){
if(c!=0x0d){
if(c==0x1b)
c=0x0a;
if(c==0x00){
c=0x0a;
printf("\n");
j--;
}
if(c==0xa1){
i++;
printf("%c",c);
c=0;
if(!feof(fp)){
switch(c=fgetc(fp)){
case 0x55:c=0x56;break;
case 0x56:c=0x55;break;
case 0x57:c=0x58;break;
case 0x58:c=0x57;break;
case 0x59:c=0x5a;break;
case 0x5a:c=0x59;break;
case 0x5b:c=0x5c;break;
case 0x5c:c=0x5b;break;
case 0x5d:c=0x5f;break;
case 0x5e:c=0x60;break;
case 0x5f:c=0x5d;break;
case 0x60:c=0x5e;break;
case 0x61:c=0x63;break;
case 0x62:c=0x64;break;
case 0x63:c=0x61;break;
case 0x64:c=0x62;break;
case 0x65:c=0x67;break;
case 0x66:c=0x68;break;
case 0x67:c=0x65;break;
case 0x68:c=0x66;break;
case 0x69:c=0x6b;break;
case 0x6a:c=0x6c;break;
case 0x6b:c=0x69;break;
case 0x6c:c=0x6a;break;
case 0x6d:c=0x6f;break;
case 0x6e:c=0x70;break;
case 0x6f:c=0x6d;break;
case 0x70:c=0x6e;break;
case 0x71:c=0x73;break;
case 0x72:c=0x74;break;
case 0x73:c=0x71;break;
case 0x74:c=0x72;break;
case 0x75:c=0x77;break;
case 0x76:c=0x78;break;
case 0x77:c=0x75;break;
case 0x78:c=0x76;break;
case 0x79:c=0x7b;break;
case 0x7a:c=0x7c;break;
case 0x7b:c=0x79;break;
case 0x7c:c=0x7a;break;
case 0x7d:c=0x5f;break;
case 0x7e:c=0x60;break;
case 0x1b:c=0x0a;break;
case 0xa1:ungetc(c,fp);c=0;i--;break;
default:break;
}
}
}
if(c!=0)
printf("%c",c);
}else {
j++;
}
}
i++;
}
printf("\n");
fclose(fp);
printf("\n\nFilename : %s\n",filename);
printf("\nPDB Header\n");
printf("Name : %s\n",PDB.name);
printf("Attributes : %d\n",SingleWord(PDB.attributes));
printf("Version : %d\n",SingleWord(PDB.version));
printf("Creation date : %ds\n",DoubleWord(PDB.creationDate));
printf("Modification date : %ds\n",DoubleWord(PDB.modificationDate));
printf("Last backup date : %ds\n",DoubleWord(PDB.lastBackupDate));
printf("Modification number : %d\n",DoubleWord(PDB.modificationNumber));
printf("Application Info ID : %d\n",DoubleWord(PDB.appInfoID));
printf("Sort Info ID : %d\n",DoubleWord(PDB.sortInfoID));
printf("Type : %d\n",DoubleWord(PDB.type));
printf("Unique ID Seed : %d\n",DoubleWord(PDB.uniqueIDseed));
printf("Next Record List ID : %d\n",DoubleWord(PDB.nextRecordListID));
printf("Number of records : %d\n",SingleWord(PDB.numberOfRecords));
printf("File Size : %d bytes\n",i-78-(SingleWord(PDB.numberOfRecords)*8)-j);
free(filename);
return(0);
}
有了這個程式就可以用 BeBook 的電子紙看書,而不用再用小小的 iPod Touch 看小小的字了。
下次再來作個修改文章的程式給Macintosh用吧,前提是如果我想要作的話。















