iMac Core i5 21"
12/26/2011, 00:39 - Apple
因為iMacG5 17" 又開始不正常,拆開一看電容又爆了,反正也夠本了,而且又要再請朋友換二十多顆電容也很不好意思,因為電路板中間的接地面積大,需要的温度高,實在不好控制,也不好拆。直接到Apple Store買了一部iMac Core i5,四核心,網路訂貨,一週到貨。看MacTracker說記憶體可以加到32G,不過還沒看到有人在賣204 pin的DDR3 1333 8GB一條的模組,創見或勝創都只看到一條4GB的。目前是用原廠兩條2GB的共4GB,考慮看是要先加兩條4GB,還是再找8GB,一次加到滿。所以PowerPC就此從我的桌面上退休了,也好啦,這樣就不用再跑VirtualPC,而可以改用Parallels Desktop或VirtualBox來跑Linux或Windows了。

這部iMac買時可選擇使用USB KeyBoard和Mouse或是Wireless Keyboard和TrackPad,因為手上還有兩組USB KeyBoard和Mouse,所以就選了Wireless看會不會方便一點,不過這兩個Wireless設備都是用BlueTooth,是很好用啦,使用時的聲音小很多,但是因為是用藍牙,所以若和WiFi網路同時使用,就有時會有網路連不到,或是找不到硬體的問題出現了。
方法是先關掉一種,再打開,重新找一下就好了。不過最好是只選用其中一種。我因為iMac是接網路線,所以就關掉WiFi。

再來是Apple的Migration Assistant實在是太好用了,新系統一裝好,就可以用它來從TimeMachine的備份,或是從舊的機器將以前的系統連同應用程及環境一起搬到新系統上,直接就可以工作,雖然Copy的時間有點久,不過比起M$的好太多了。



PS:很久沒有更新,是因為最近時間少,而且在做的事也不能在網路上講太多。

1 回應 1 回應 ( 4752預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 835 )

OS X 10.7.2及iOS5更新
10/13/2011, 15:52 - Apple
就是更新版本啦,iPod Touch和iPad都上到iOS5,而OS X Line換到10.7.2,都出現了iCloud,不過都連不上,好像是因為網路太忙,流量太大吧。


iOS多了一個書報攤,有一些免費的雜誌可以看,而iMessage和iCloud一樣連不上。
發表回應 發表回應 ( 658預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.9 / 862 )

Steve Jobs 1955-2011
10/06/2011, 08:34 - Apple
Steve Jobs@Apple
發表回應 發表回應 ( 601預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 863 )

Mac OS X 10.7 Lion Upgrade
08/23/2011, 01:30 - Apple
昇級到Mac OS X 10.7.1 Lion了。過程很順利,先用Yasu清除空間,
再用Time Machine備份整個系統,也順便將Lion作了DVD備用。
目前還不錯。只有SpotLight要重作需要一點時間。
還有TouchPad使用方式好像有改變方式,還要再研究研究。



發表回應 發表回應 ( 1235預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 834 )

Max OS X 10.6.7 Upgrade
03/22/2011, 12:20 - Apple


同場加映

發表回應 發表回應 ( 10640預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.9 / 882 )

USB Disk with Rsync backup script
02/18/2011, 12:57 - Open Source
公司買了兩顆USB 750GB的硬碟要作資料備份,
但要備份的資料分散在不同的機器中,而且兩顆硬碟的資料還要作sync,
想想就用Rsync來作是最方便的了.
因為rsync可以在同步備份時只備份改變的資料.可以很快的備份.
又可以用ssh備份遠端的資料,太方便了.
在用ssh備份時因為每次都要輸入密碼,沒辦法經由cron自動,
這當然可以由expect script來作,不過這次參考
交給ssh經由預先交換public key的方式自己來處理.

第一個 script是備份各主機內需要備份的資料.
rsync_backup.sh

#!/bin/bash
# This script is automatic backup Tailyn information include SVN and others
# By Tasuka Hsu, Feb/15/2011
#
DATE=`date +"%m-%d-%Y"`
START_TIME=`date +"%D %H:%M:%S"`
TOP_DIR="/media/Backup"
DESTINATION_DIR="$TOP_DIR/data"
MOUNTED=`cat /proc/mounts|awk '{if($2==topdir) print $1 }' topdir=$TOP_DIR`
RSYNC=/usr/bin/rsync
LOG=$DESTINATION_DIR/backup-$DATE.log
USAGE=`df -m|awk '{if($1==device) print $5 }' device=$MOUNTED`
REMOTE_IP1=172.16.200.33
REMOTE_IP2=172.16.200.254
REMOTE_USER=rsync
REMOTE1=$REMOTE_USER@$REMOTE_IP1
REMOTE2=$REMOTE_USER@$REMOTE_IP2

if [ $MOUNTED ]; then
echo "The backup require minutes to hours..."
if [ ! -e $DESTINATION_DIR ]; then
mkdir $DESTINATION_DIR
fi

pushd .
cd $DESTINATION_DIR
find . -maxdepth 1 -name backup-*.log -ctime +30 -exec rm -fr {} \;
popd

if [ ! -e $LOG ]; then
echo "Start: $START_TIME" > $LOG
else
echo "Start: $START_TIME" >> $LOG
fi

echo "0.Backup script self"
$RSYNC -a -v --delete ./rsync_backup.sh $DESTINATION_DIR
$RSYNC -a -v --delete ./svn_backup.sh $DESTINATION_DIR
$RSYNC -a -v --delete ./rsync_copy.sh $DESTINATION_DIR
echo "> Backup /etc"
TAR=`tar -jcf /home/backup/desktop-etc-$DATE.tar.bz2 /etc`
echo "$TAR" >> $LOG

echo "> rsync /home/svn"
SVN=`$RSYNC -a -v --delete /home/svn $DESTINATION_DIR/svn`
echo "$SVN" >> $LOG

echo "> rsync /home/backup"
SVNBackup=`$RSYNC -a -v --delete /home/backup $DESTINATION_DIR/SVNBackup`
echo "$SVNBackup" >> $LOG

echo "> rsync $REMOTE_IP1:/home/share"
# rsync via ssh without password reference to
# http://blogs.sun.com/jkini/entry/how_to_scp_scp_and
SHAREBackup=`$RSYNC -a -v --delete -e ssh $REMOTE1:/home/share $DESTINATION_DI
R/share`
echo "$SHAREBackup" >> $LOG

echo "> rsync $REMOTE_IP1:/home/doc"
DOCBackup=`$RSYNC -a -v --delete -e ssh $REMOTE1:/home/doc $DESTINATION_DIR/do
c`
echo "$DOCBackup" >> $LOG

echo "> rsync $REMOTE_IP1:/home/from"
FromADCBackup=`$RSYNC -a -v --delete -e ssh $REMOTE1:/home/from $DESTINATIO
N_DIR/from`
echo "$FromADCBackup" >> $LOG

echo "> rsync $REMOTE_IP1:/home/tools"
ToolsBackup=`$RSYNC -a -e ssh $REMOTE1:/home/tools $DESTINATION_DIR/tools`
echo "$ToolsBackup" >> $LOG

echo "> rsync $REMOTE_IP1:/home/release"
ReleaseBackup=`$RSYNC -a -v --delete -e ssh $REMOTE1:/home/release $DESTINATIO
N_DIR/release`
echo "$ReleaseBackup" >> $LOG

echo "$SHAREBackup" >> $LOG
SHAREBackup=`$RSYNC -a -v --delete -e ssh $REMOTE1:/home/tasuka $DESTINATION_D
IR/share`
echo "$SHAREBackup" >> $LOG


# echo "> rsync $REMOTE_IP1:/home/pictures"
# PicturesBackup=`$RSYNC -a -v --delete -e ssh $REMOTE1:/home/pictures $DESTINA
TION_DIR/pictures`
# echo "$PicturesBackup" >> $LOG

echo "> rsync virata compiler@$REMOTE_IP1"
VirataBackup=`$RSYNC -a -v --delete -e ssh $REMOTE1:/usr/local/virata $DESTINA
TION_DIR/virata`
echo "$VirataBackup" >> $LOG

echo "> rsync virata compiler@$REMOTE_IP2"
VirataBackup=`$RSYNC -a -v --delete -e ssh $REMOTE2:/usr/local/virata $DESTINA
TION_DIR/virata`
echo "$VirataBackup" >> $LOG

echo "> rsync samba @$REMOTE_IP2"
SambaBackup=`$RSYNC -a -v --delete -e ssh $REMOTE2:/home/samba $DESTINATION_DI
R/samba`

echo "$SambaBackup" >> $LOG
SambaBackup=`$RSYNC -a -v --delete -e ssh $REMOTE2:/home/tasuka $DESTINATION_D
IR/samba`
echo "$SambaBackup" >> $LOG

END_TIME=`date +"%D %H:%M:%S"`
echo "End: $END_TIME" >> $LOG
echo " " >> $LOG
echo " "
echo "Summary:"
echo "Start Time: $START_TIME"
echo "End Time : $END_TIME"
echo "Disk usage before backup $USAGE" >> $LOG
echo "Disk usage before backup $USAGE"
USAGE=`df -m|awk '{if($1==device) print $5 }' device=$MOUNTED`
echo "Disk usage after backup $USAGE" >> $LOG
echo "Disk usage after backup $USAGE"
echo " " >> $LOG
echo " "
echo "Backup Done. Backup detail please check log file."
else
echo "NOTICE: No mounted backup driver found, backup abort. Please check"
fi
#


第二個script是兩顆硬碟之間的同步備份,
因為Ubuntu會將同LABEL名的硬碟在 /media 中的Label後自動加上一個"_",
所以兩顆硬碟可以使用同樣的Label,以簡化script.

rsync_copy.sh

#!/bin/bash
# By Tasuka Hsu, Feb/15/2011
#
DATE=`date +"%m-%d-%Y"`
START_TIME=`date +"%D %H:%M:%S"`
TOP_DIR="/media/Backup"
DESTINATION_DIR="/media/Backup_"
MOUNTED1=`cat /proc/mounts|awk '{if($2==topdir) print $1 }' topdir=$TOP_DIR`
MOUNTED2=`cat /proc/mounts|awk '{if($2==destdir) print $1 }' destdir=$DESTINATIO
N_DIR`
RSYNC=/usr/bin/rsync

if [ $MOUNTED1 ] && [ $MOUNTED2 ]; then
echo "Sync Backup Drivers"
echo "The backup require minutes to hours..."
$RSYNC -a -v --delete $TOP_DIR/data $DESTINATION_DIR

echo "Summary:"
echo "Start Time: $START_TIME"
END_TIME=`date +"%D %H:%M:%S"`
echo "End Time : $END_TIME"
echo "Backup Done."
else
echo "NOTICE: No mounted backup driver found, backup abort. Please check"
fi
#


不過因為資料量太大,檔案太多,有些又要經由網路傳輸,所以第一次就花了五六個小時,不過以後就快了,因為rsync會先比對,只備份修改的部份.
這樣子就會點跟上Apple TimeMachine的樣子了.
發表回應 發表回應 ( 648預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.9 / 909 )

傳送“令人感動的畫面“的網路服務 一
01/28/2011, 21:28 - Open Source
己經過了一段時間,所以我想應該可以寫出來吧。上次和某公司的研發人員談話,
中間談到很多東西,不過我只對:經由網路及雲端處理,送出"令人感動的畫面"。
這一句話令我印象深刻及感到在意,因為利用網路傳送畫面及聲音,
不管是不是即時傳送,以現在的技術並不難,像是YouTube或Skype及某些SIP Phone
或是PolyComm等其他的網路服務和設備都可以傳送畫面及影像,但是要令人感動,
這可就不簡單了。當時談到可以用到的技術可能會有H.264、SIP、雲端網路等,
而這個架構目標是準備放在企業內部,或是網路服務商,用來提供給企業內部,
或網路服務商的使用者,做加值的影音傳送服務。不過不管使用何種技術,
令人在意的還是“感動“兩字。

席間談到Apple的Facetime,可以利用網路,傳送即時動態而且相當清楚的影像及聲音,
但這樣就令人感動了嗎?有很多服務都可以做到相同的服務,像是Skype也可以在iPhone及PC上提供相同的影音通訊,
但使用者有感動嗎?我個人認為要談到Facetime如何和Skype等網路服務的不同,
應該是Facetime是電話製造商第一次試著將電話賣給失聰、失語的族群
(目前失明者還是被排除在視訊通訊之外,不過倒是可以使用傳統電話溝通。)。
以前的電話服務對於失聰、失語的族群根本就是放棄不管,
當作這群人沒有使用電話的需求,而行動電話也只提供了SMS簡訊服務給這個族群使用,
但當Apple的iPhone4加上Facetime服務經由3G或WiFi網路的頻寬加持之後,
這原本被電信服務商放棄的族群,終於可以用電話了,可以在電話前使用慣用的手語交談,
而不會拿起電話卻有口難言或是有聽沒有懂了,這樣的產品及服務才算令人感動吧。

還談到影像在傳送時可依據頻寬大小,自動動態調整使用的codec方式,以達到最佳的視覺和聽覺效果,
這個功能在H.264是可以經由更改區塊大小及編碼,達到動態調整影像的解析度,
不過我認為人類在視覺和聽覺上會自動調整,這種調整大可不必,
只要在合理不中斷影音之下就可以了。
而因為可能會選擇SIP作為Singling的方式,所以會影像和聲音分開處理、傳送,
這個就見仁見智了,因為大部份的SIP Singling通訊是發生在Call Setup的階段,
等到通話雙方交換完資料並選定通訊方式,真正的通話是直接由兩個通話方自行傳送,
而SIP Server只有作簡單的Call Stream Maintenance而已,當然也可以設定為一定要經由Server代為傳送的方式
(例如要經由NAT位址轉換或是受限制的網路),不過還是不多見,而且也不太符合SIP Server定義的規範。
因為在SIP中,codec設定一但要改變,需要經過通話雙方的SIP client同意,
所以經常性的更改codec可能會造成通話品質不良,或中斷,
這樣就沒有達到原本不中斷服務又可能會令人感動的本意了。
再者到現在為止,除了Apple的Facetime應該是有用到雲端網路處理之外,
SIP應該是不太需要應用雲端技術,除非是利用Web Phone直接通話,才有可能,
但也不是一定就需要。

談到Apple iPhone不能談到的兩個Apps,Whatsapp和Viber。
Whatsapp是即時通訊軟體,加上PUSH Notification可以取代SMS簡訊,
Viber是VoIP語音通訊軟體,而且兩者直接使用iPhone的電話號碼作為使用者代號,
使用起來和原本的電話一樣。當雙方都登錄在Viber和Whatsapp雲端網路時,
優先使用Whatsapp和Viber作通訊,若對方沒有登錄才會轉至一般電信網路送出SMS或撥出電話號碼。
令人感到窩心的是直接使用電話碼號這個方式,而不是像Skype需要另外使用別的ID作為識別代號,
非常方便。由此可見,當網路的連接變得無處不在時,原本提供傳統電信服務網路的業者可生存的空間就縮小了,
當大家都使用3G或下一代更高速、更方便的網路在任何地方、任何時間都可以連接、存取資料,
並將原本電信網路的獨特功能,轉換並架構在這個資料網路之上時,
電信網路業者就只可以每個月收收固定的網路使用費一條路而已了。
談到iPhone Apps,有兩個Apps也可以順便參考,Word Lens和Place。
這兩個都是可以即時翻譯鏡頭前的影像中的文字短句。
就是直接用手機的照相機照下文字,然後就直接翻譯,目前只有西班文和英文雙向翻譯。

最近Microsoft開發出一個代號Kinect鏡頭給XBox360使用,以增加體感遊戲的樂趣,
讓使用者可以不用傳統的搖桿、控制器,由身體直接和遊戲程式互動。
有趣的是和一般用在辦公室視訊會議的PolyComm,或是電腦的Webcam不同的是Kinect使用了二個鏡頭,
外表看到的是三個,但其中一個並不是鏡頭,而是紅外線光源。
一個是一般的Webcam,取得非常一般的VGA解析度的全彩影像,再利用紅外線光源,
及一個只感應紅外線的鏡頭,取得影像的深度,再和全彩的影像合併在一起,
就可以取得較立體的影像,所以可以較一般Webcam取得精細的動作資料,
加以計算。有了景深之後,鏡頭前”看到”的影像就不再是平面的東西了,
原本單一鏡頭取得的平面資料,是很難區分出影像中的不同物品,
無法分辦出每個物品在影像中的範圍和邊界,但有了景深作為對照和過濾的依據,
就可以經由程式對距離計算,很容易分離出不同物品在影像中的範圍和邊界了,
而加以區分是不同的物品,這就可以拿來作出不同的應用了。

雲端網路的應用除了可以提供大量的儲存空間、複雜的網路資料處理、高速計算、超高容量及快速的網路連接等,
最重要的是可以提供無縫資料轉換及背景處理。有了這些功能,
可以大大的簡化使用者端的軟體及硬體效率的處理需求提供單一介面,
就可以整合眾多不同的服務。不過談到雲端技術,大家都以為是新的技術,
很多人以為雲端就是虛擬機器的應用,但這也是雲端的應用和達成雲端應用的手段之一而已。
而任何的服務都可以經由群聚在一起,經由單一介面,提供一種服務,而些服務架構,
對服務使用者而言,不需了解,也不需詳細描述網路內部架構,就以簡單一朵雲做為代表,
非由單一設備所提供的服務。例如電力會將火力發電、水力發電、核能發電、太陽能發電、海洋力發電,
經由電力傳輸及控制網路組成電力雲。電信網路經由電話線路、電話交換機、海底電纜、通訊衛星架構出電信雲。
資料網路經由各種電信網路,如ISDN、Frame Relay、ADSL、VDSL、PON、
Ethernet、WiFi、3G Mobile組成的WAN及LAN以及Router和Switch、利用各種網路軟體Protocol,
如RIP、OSPF、BGP、MPLS架構出資料網路傳輸雲。事實上我們早就在雲端了,從最平常的Web、FTP/P2P檔案傳輸、
網路NAS、Online Game、Skype、MSN、或是分散式處理的X-Window GUI、
或是簡單的電話訂位也都算是雲端應用的一種。比較令人感到有趣的雲端網路應用,
是MIT的Pranav Mistry在TED發表過的第六感實境(Sixth Sense),類似無所不能的網路虛擬隨身助手。
還有就是擴增實境(AR:Augmented Reality) ,在現實的影像上,經由雲端網路依據從Client傳送來的資料,
經過查訽資料後,將處理過的資料,傳送回Client端,貼附在原本的影像上,
增強原本的影像所以表達的資訊,所以才稱為擴增實境。
這些雲端網路應用的最小要求,需要無所不在的網路連接,才有辦法達成。
這些雲端應用在背後有各種強大的資料庫、及搜尋演算法、影像、聲音資料快速辨認演算法,
有快速及高容量儲存設備,有為了要作高速辨認演算法,所需要的分散式高速計算網路等等,
組成一個網路、或經由數個不同功能的網路所組成的雲,再加上在背後為這些設備提供運轉的電力雲,
及網路連接架構設備的網路雲來提供這些資料服務雲。


好了,那要如何架構出“令人感動的畫面“呢?

發表回應 發表回應 ( 1555預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 853 )

會議室
01/21/2011, 12:58 - 想到的
會議室是一種時光精神屋,因為進去四個小時之後出來,會議室外面的時間還是停留在進去之前。
開會之後,平常工作上的東西還是要按照時程交出來,可是若一天用了一半以上的時間在開會,
那還有時間可以做東西?所以有人就想辦法進時光精神屋,想練一下功力,
但是有些完全生活在會議室之間的平行世界生物,並不知道會議室之外的世界時間軸和會議室內完全不一樣。
人家說天上方七日,地下已千年,難怪人要成仙很難,成了仙,要不被貶下界也很難,
在天上練習六十甲子的功力,地下可是要花幾萬年啊!
還有地獄的時間應該也和地上不同,地獄方七日,地上已千年,這樣才有懲罰作用吧,
君不見人死後只要四十九日就可以準備投胎了,可是中間有經過閰羅王review一生功績耶,
就算快轉,六七十年的日子,也不是一下子就可以快轉完畢的吧,
還有在review時發現你三歲時尿床,而造成了一隻正好經過床邊,
要去工作的螞蟻死於非命,這要罰個下油鍋三十年,但地獄三十年在地上也只是彈指之間的事吧。
也難怪神仙老是打不過魔鬼啊。在地獄人家練一天就等於你在天堂練幾萬年啊,
一根小指頭讓你就可以了吧。

所以七龍珠的時光精神屋,就是地獄沒錯。也就是說會議室等於地獄,當然了,
生活在這個平行世界的生物,一般就叫做魔鬼吧,而對魔鬼而言,會議室這個時空異常的空間,
就算不是天堂,也只是日常生活空間而已。
下次走過會議室時要注意一下,是否可以查看到時空扭曲力場的交接隙縫。
不過查看是可以的,但要小心別被吸進這個異常力場之中啊,
進了平行宇宙,要回來可沒有那麼容易啊,不死也去了半條命,
何況回來之後,還是一樣要如期完成工作啊,要小心喔!
發表回應 發表回應 ( 1220預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.9 / 812 )

Newer Tech NuPower Battery for 15" MacBook Pro
01/20/2011, 10:53 - Apple
因為MacBook Pro 2007的原廠電池已經用了約四年了,現在也還可以有一個多小時,
不過依經驗,鋰電池的死亡不是慢慢的死,而是有一天突然就從滿格,變成沒電,再起不能,所以先買個保險,因為出來跑,還是非常需要電池來提供行動力。

不過查了一下Apple Store一個電池4700NTD免運費,但底下的評語大家好像對Apple的電池沒有太好的評價,為了避免將來出現問題的麻煩,
還是不要向Apple買好了,雖然免運費,這時記起了上次PowerBook G4及PowerBook G3向NewerTech買的電池,很好用,也沒有問題,
就轉向代理商OWC(Other World Computing)經由Amazon代收付費買到的
NewerTech NuPower for Mac Book Pro 15"電池,99USD加上運費,拜台幣對美金升值之賜,還是比Apple Store便宜1000NTD左右。

以下是第一次充電的結果。數字當然很好看啦。


Battery Information:

Model Information:
Manufacturer: Newer Tech
Device name: ASMB012
Pack Lot Code: 0001
PCB Lot Code: 0021
Firmware Version: 0010
Hardware Revision: 001f
Cell Revision: 7a3e
Charge Information:
Charge remaining (mAh): 5616
Fully charged: Yes
Charging: No
Full charge capacity (mAh): 5616
Health Information:
Cycle count: 3
Condition: Normal
Battery Installed: Yes
Amperage (mA): 139
Voltage (mV): 12596


對照一下原廠的電池

Battery Information:

Model Information:
Manufacturer: SMP
Device name: ASMB012
Pack Lot Code: 0002
PCB Lot Code: 0000
Firmware Version: 0102
Hardware Revision: 0500
Cell Revision: 0200
Charge Information:
Charge remaining (mAh): 3519
Fully charged: Yes
Charging: No
Full charge capacity (mAh): 3519
Health Information:
Cycle count: 654
Condition: Replace Soon
Battery Installed: Yes
Amperage (mA): 149
Voltage (mV): 12609


不過CoconutBattery測出來卻是這樣。


我想信這是程式的問題。果然換了新版CoconutBattery2.7就變成104%了。
而原廠的電池是這樣,只有65%了。


等新電池充電十個小時之後再試看看可以撐多久吧。
發表回應 發表回應 ( 1127預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3.1 / 864 )

取名字時工程師用的解決方法(更新)
01/16/2011, 00:37 - Open Source
幫兒子取名字,是件大工程,因為這是事關他一輩子的事。可是請了老師算過八字及姓名學之類的之後,給的參考列表,實在是太糟了,
但又因為是認識的人的家長,所以就只好自已來選個別的字試試,
但實在是受不了了,
所以就用工程師可以想到的方式,用Perl script,利用已知的筆劃要求,通通列出來,給大家來選。
因為只要用個兩三次,所以就不要求執行的效率了。

一般人的姓名全部大都是三十五劃,而姓是固定,所以只要選名字就好,
我選的12x12,BIG5有一千多字是十二劃,混合列出來有一百三十多萬行。
當然中間有很多字是不適合拿來當名字的。

還有這個程式表面是不支援複姓及單名,不過調整一下,應該還是可以用的。

更新:因為130萬筆資料還是太多了,而且有很多字不適合當作名字用,
所以就再加一段過濾不想要的字放在檔案noname.txt中,一行一個字。
如果不知道會產生多少字,可以先產生一次,再將不要的字放到noname.txt中,
再產生一次就好了。執行效率還是老話一句,用一兩次的程式,
就不要再去調整了。不過說一下好的,在查完姓的筆劃後,
會開始產生第一和第二字,在這之前先用筆劃反查BIG5的範圍,
拿來當廻圈的參數,就可以加快了。



#!/usr/bin/perl -w
# The Chinese BIG5's word of handwrite pens is reference to
# http://bbs.ecstart.com/thread-15553-1-1.html and correct the error of the information.
# And the BIG5 code table is reference to http://en.wikipedia.org/wiki/Big5
#
use Switch;

sub pensNumber
{
my $inArg=$_[0];
my $ret=0;

switch($inArg){
case [0xa440..0xa441] {
$ret=1;
}
case [0xa442..0xa453,0xc940.0xc944] {
$ret=2;
}
case [0xa454..0xa47e,0xc945..0xc94c] {
$ret=3;
}
case [0xa4a1..0xa4fd,0xc94d..0xc95c] {
$ret=4;
}
case [0xa4fe..0xa5df,0xc95d..0xc9aa] {
$ret=5;
}
case [0xa5e0..0xa6e9,0xc9ab..0xc959] {
$ret=6;
}
case [0xa6ea..0xa8c2,0xca5a..0xcbb0] {
$ret=7;
}
case [0xa8c3..0xab44,0xcbb1..0xcddc] {
$ret=8;
}
case [0xab45..0xadbb,0xcddd..0xd0c7,0xf9da] {
$ret=9;
}
case [0xadbc..0xb0ad,0xd0c8..0xd44a] {
$ret=10;
}
case [0xb0ae..0xb3c2,0xd44b..0xd850] {
$ret=11;
}
case [0xb3c3..0xb6c3,0xd851..0xdcb0,0xf9db] {
$ret=12;
}
case [0xb6c4..0xb9ab,0xdcb1..0xe0ef,0xf9d6..0xf9d8] {
$ret=13;
}
case [0xb9ac..0xbbf4,0xe0f0..0xe4e5] {
$ret=14;
}
case [0xbbf5..0xbea6,0xe4e6..0xe8f3,0xf9dc] {
$ret=15;
}
case [0xbea7..0xc074,0xe8f4..0xecb8,0xf9d9] {
$ret=16;
}
case [0xc075..0xc24e,0xecb9..0xefb6] {
$ret=17;
}
case [0xc24f..0xc35e,0xefb7..0xf1ea] {
$ret=18;
}
case [0xc35f..0xc454,0xf1eb..0xf3fc] {
$ret=19;
}
case [0xc455..0xc4d6,0xf3fd..0xf5bf] {
$ret=20;
}
case [0xc4d7..0xc56a,0xf5c0..0xf6d5] {
$ret=21;
}
case [0xc56b..0xc5c7,0xf6d6..0xf7cf] {
$ret=22;
}
case [0xc5c8..0xc5f0,0xf7d0..0xf8a4] {
$ret=23;
}
case [0xc5f1..0xc654,0xf8a5..0xf8ed] {
$ret=24;
}
case [0xc655..0xc664,0xf8e9..0xf96a] {
$ret=25;
}
case [0xc665..0xc66b,0xf96b..0xf9a1] {
$ret=26;
}
case [0xc66c..0xc675,0xf9a2..0xf9b9] {
$ret=27;
}
case [0xc676..0xc67a,0xf9ba..0xf9c5] {
$ret=28;
}
case [0xc67b..0xc67e,0xf9c6..0xf9d5] {
$ret=29;
}
else{
$ret=0;
}
}
return $ret;
}

sub pensRequire
{
my $pen=$_[0];
my $code;
my $pensCode=0;

switch($pen){
case 1 {
printf("Total pens require :");
}
case 2 {
printf("Second pens require : ");
}
case 3 {
printf("Third pens require : ");
}
else {
printf("Error pens require : ");
exit;
}
}

chomp($code=<>);

if(length($code)!=0){
$pensCode=(((ord(substr($code,0)))-0x30)*10+ (ord(substr($code,1)))-0x30);
}else {
if($pen==1 && $pensCode==0){
printf("Default is 35 Pens\n");
$pensCode=35;
}
}

return $pensCode;
}

sub findWordsByPens
{
my $pens=$_[0];
my $i;
my $index=0;
my @Words=();

for($i=0xa440;$i<=0xf9dc;$i++){
if(($i<=0xc67e)||(($i>=0xc940)&&($i<=0xf9d5))){
if(((($i&0x00ff)>=0x40)&&(($i&0x00ff)<0x7f))||((($i&0x00ff)>0xa0)&&(($i&0x00ff)<0xff))){
if(pensNumber($i)==$pens){
$Words[$index]=$i;
$index++;
#printf("0x%x: %c%c\n",$i,$i>>8,$i&0x00ff);
}
}
}
}
return @Words;
}

sub findInNoNames
{
my $i;
my $In=$_[0];

if($#noNames!=0){
for($i=0;$i<$#noNames;$i++){
if($noNames[$i]==$In){
return 1;
}
}
}
return 0;
}

my $i;
my $j;
my $totalPens;
my $secondPens;
my $thirdPens;
my $lastName;
my $lastNamePens;
my $lastNameCode;
my $flag;
my @secondWords=();
my @thirdWords=();
@noNames=();

printf("LastName : ");
chomp($lastName=<>);

if(length($lastName)<2){
printf("Error length!!");
exit;
}

$lastNameCode=(ord(substr($lastName,0))<<8)+ord(substr($lastName,1));
$lastNamePens=&pensNumber($lastNameCode);
printf("%s BIG5 Code is 0x%x, %d pens\n",$lastName,$lastNameCode,$lastNamePens);

$flag=1;
while($flag==1){
$totalPens=&pensRequire(1);
if(($totalPens<=87) && ($totalPens >=3)){
$flag=0;
}else{
printf("Error Total Pens Input, Try Again!!\n");
}
}

$flag=1;
while($flag==1){
$secondPens=&pensRequire(2);
if(($secondPens<=(($lastNamePens+$totalPens)/2)-1)&&($secondPens>=3)){
$flag=0;
}else{
printf("Error Second Word Pens Input, Try Again!!\n");
}
}

$thirdPens=$totalPens-$lastNamePens-$secondPens;

printf("Pens\nTotal:%d\nLastName:%d\nSecondWord:%d\nThirdWord:%d\n",$totalPens,$lastNamePens,$secondPens,$thirdPens);

printf("Calculating second words...\n");
@secondWords=&findWordsByPens($secondPens);
printf("Second Word Pens is %d\n",$#secondWords);

printf("Calculating third words...\n");
if($secondPens!=$thirdPens){
@thirdWords=&findWordsByPens($thirdPens);
printf("Third Word Pens is %d\n",$#thirdWords);
}else{
@thirdWords=@secondWords;
printf("Third is equal to Second Word %d\n",$#thirdWords);
}

if(-e "noname.txt"){
if((-s "noname.txt")!=0){
open(INPUT,"<noname.txt")||die "Could not open file noname.txt\n";
$i=0;
while(<INPUT>){
chop;
$noNames[$i]=(ord(substr($_,0))<<8)+(ord(substr($_,1)));
$i++;
}
close(INPUT);
}
}

open (OUTPUT,">nameout.txt");
printf(OUTPUT "%s BIG5 Code is 0x%x, %d pens.\n",$lastName,$lastNameCode,$lastNamePens);
printf(OUTPUT "Total:%d, LastName:%d, SecondWord:%d, ThirdWord:%d pens\n",$totalPens,$lastNamePens,$secondPens,$thirdPens);

$flag=0;
if($#secondWords!=0 && $#thirdWords!=0){
for($j=0;$j<$#secondWords;$j++){
if((&findInNoNames($secondWords[$j]))==0){
for($i=0;$i<$#thirdWords;$i++){
if((&findInNoNames($thirdWords[$i]))==0){
$flag++;
printf(OUTPUT "%d %c%c%c%c%c%c\n",$flag,$lastNameCode>>8,$lastNameCode&0x00ff,$secondWords[$j]>>8,$secondWords[$j]&0x00ff,$thirdWords[$i]>>8,$thirdWords[$i]&0x00ff);
}
}
}
}
}

close(OUTPUT);

printf("Total %d Lines output!\nDone!\nPlease Check nameout.txt.",$flag);




發表回應 發表回應 ( 1138預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.9 / 794 )


<<開始 <前一頁 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 下一頁> 最後>>