傳送“令人感動的畫面“的網路服務 一
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端,貼附在原本的影像上,
增強原本的影像所以表達的資訊,所以才稱為擴增實境。
這些雲端網路應用的最小要求,需要無所不在的網路連接,才有辦法達成。
這些雲端應用在背後有各種強大的資料庫、及搜尋演算法、影像、聲音資料快速辨認演算法,
有快速及高容量儲存設備,有為了要作高速辨認演算法,所需要的分散式高速計算網路等等,
組成一個網路、或經由數個不同功能的網路所組成的雲,再加上在背後為這些設備提供運轉的電力雲,
及網路連接架構設備的網路雲來提供這些資料服務雲。


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

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

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

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

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%了。


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

取名字時工程師用的解決方法(更新)
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);




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

Upgrade to Mac OS X 10.6.6
01/10/2011, 13:02 - Apple
照例更新後的報告。

就是加了MacAppsStore而已。

不過這次的MacBook Pro 2007,因為顯示卡的問題,送到蘋果優仕修理,從12/24/2010至1/8/2011拿回來,因為是nVadia GeForce 8600-M顯示卡的問題,已列在召回名單之內,所以免費維修,算是逃過一"劫"。不過電池好像到底了。果然是福不是禍,是禍躲不過啊!


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

MacBook Pro 15" 2007 Crash
12/21/2010, 14:10 - Apple
MacBook Pro 15" 2007最近經常會跑一跑之後,會發生螢幕快閃兩下,
之後就停了,Mouse還可以動,但是一切都停下來不動了.
重開機也沒效,開機畫面會停在這個畫面.

黃色線應該是照相機的關係,不過那個Apple Logo可以看到有綠色的斜線.
而且系統開不起來.
開機按Command-S切換到Single User Text Mode開機之後,

就可以清楚的看出來應該是顯示卡或VRAM有問題了.

前幾天還可以用Cmd-Option-R-P重置PRAM,之後就可以用了,
但不知哪天神經不對,又會來,所以就要一直Reset.
到了今天,終於Reset PRAM也無效了.不知道是不是
MacBook Pro: Distorted video or no video issues TS2377 這個 NVIDIA GeForce 8600M GT 問題,
又要走一趟Apple Service Center了.

PS:好像是中獎了 有Nvidia 8600M機器的人請注意,蘋果保固4年
發表回應 發表回應 ( 877預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.9 / 546 )

工時、時程、開會
12/15/2010, 19:59 - 生活
不知道有那一家公司,將每個人參加開會的時間做統計,並排除在工時計算之外呢?沒有的話,如果參加的會議很多,時間很長,那工時計算有用嗎?那排定時程有真實反應嗎?那麼多高級管理人才,沒人做過嗎?一天八小時,用一半時間開會,一半工作,還要符合時程,難怪加不完的班,但公司是不付加班費的。
發表回應 發表回應 ( 758預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 511 )

圖書館的額外服務
12/13/2010, 14:54 - 有的沒的
在位於桃園蘆竹鄉南崁的鄉立圖書館的三樓藏書室一角,提供了“筆電電源區“,提供充電服務,這個所謂的電源區的電源插座是位於座位的最下方,也就是說為了要使用這個電源,使用者需要趴到地上,才可以將電源接上,而不是直接和桌子上的日光燈電源連接在一起,反正要用到插座的,先面向座位行“跪拜禮“就對了,一般而言應該還會念個一兩句咒語,問候一下設計者的家人,不然就不要插電。不過整個總圖書館卻沒有提供無線網路連接,雖然在牆上明明寫著有網路服務可以用,但就是沒有辦法找到,可能是因為附近有太近住宅區,怕被充份的利用這個免費資源,或者是有人利用免費的網路作了什麼壞事,總之就是沒有無網網路服務。這和常去的另一個同樣是蘆竹鄉立圖書館的大竹分館卻有著有趣的不同。大竹分館,是兩層的建築,一、二樓分別有兩個無線網路可以使用,不過可以充電的座位只有五個,而且藏在讀書室的最深處,一般人不會看見的角落,而且一大早就被知道的人占光了,反正管理人員也看不到,所以占用一整天也是很正常的事。而相對於分館的總館,在三樓的一角,也是五個電源區,但卻是在管理人員的座位旁,雖然管理人員完全不在座位上,但人來人往的,應該比較不會發生整天占用的事,不過卻沒有無線網路可以使用。而在二樓有提供四部公用電腦,可以連上網路,可是有些事是不好在公共電腦上做的啊,會有洩露秘密的風險。當然這類免費的服務,對於公家單位的服務人員來說根本是可有可無,不過對於上門有使用需求的使用者而言,感受卻是非常不同的。看來是有提供兩三種服務可選,事實上,每一種都只提供“有服務“,但有很大的改善空間的功能,可能是很差的使用環境及使用經驗,或只是簡單的"Out of Service"。



在公家單位工作的人,對於“服務“的認知,經常流於表面,表面功夫做得一流,但實際上卻是令人感到,做這樣半調子的服務,就像是特意從台灣搭三十多小時的飛機,到非洲野地,想要看到獅子和羚羊的生死追逐,結果卻是人大老遠的到了非洲,卻是在當地地的動物園看一頭老獅子吃牛排一般,這種令人牙癢癢的服務不如不要做,反正沒得用,大家死心,還好一點。

所以若想要使用這類的公共資源,沒電、跑得再快、再好用的電腦也是沒用,但現在使用電腦,大都會使用網路上的資源,沒有有網路,好像斷手斷腳一樣,除非自已準備了3G網路之類的服務,或是隨身太陽能板來提供電力,而在公用電腦存取私密的資料,使用期間就像一直拿刀捅自已的肚子一樣,用得越久、越多,就死得越快,當然不列入考慮。所以使用電腦時是電力重要呢?還是網路重要呢?我認為是電力重要,至少還沒死透,但是抱著沒電力供應的電腦就像在山𥚃抱著死了的獸屍沒有兩樣啊。

附上一些圖書館中收藏的舊書。


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

應用Multi-Thread模擬AutoNegotiation測試
12/01/2010, 10:48 - Open Source
應用Multi-Thread模擬AutoNegotiation測試。
只是因為工作上的需要,試看看如果這樣作自動CO/RT切換的演算法,順便用Multi-Thread由一支程式搞定。

程式有四個Thread,一個主程式,一個作Monitor,另兩個模擬兩個Node作自動連接交換資料。


#import <Foundation/Foundation.h>
#import <stdlib.h>
#import <time.h>

//#define DEBUG
#define timeRange 60
#define sizeINT sizeof(int)

@interface randGen : NSObject {
unsigned long seed;
}
-(void)seed:(unsigned long)s;
-(unsigned long)getSeed;
-(unsigned long)Random;
-(unsigned long)Random:(unsigned long)s;
@end

@interface randGen (Private)
unsigned long rSeed;
-(void)initRandom;
@end

@implementation randGen
-(id)init
{
if(![super init]){
return nil;
}

[self initRandom];
[self seed:1L];
return self;
}
-(void)seed:(unsigned long)s
{
seed=(s?s:1L);
}
-(unsigned long)getSeed
{
return seed;
}
-(void)initRandom
{
srand(time(NULL));
rSeed=rand();
}
-(unsigned long)Random
{
srand(rSeed);
rSeed=rand();
return(rSeed%seed);
}
-(unsigned long)Random:(unsigned long)s
{
[self seed:s];
return([self Random]);
}
@end

@interface myThread : NSObject
+(void)aThread:(id)param;
+(void)bThread:(id)param;
int txQueue[2];
int rxQueue[2];
@end

@implementation myThread
+(void)aThread:(id)param
{
int i=0;
int rs=0;
int j=100;
time_t Timer;
time_t oldTimer;
BOOL flag=YES;
BOOL tMode=NO;
BOOL oldMode=NO;
randGen *rRand=[[randGen alloc] init];
int *tq;
int *rq;
int connectCounter=0;
int modeCounter=0;
int oldKey;

while(flag){
connectCounter=0;
j=[rRand Random:j];
#ifdef DEBUG
NSLog(@"%@:%d",param,j);
#endif
for(i=0;i<j;i++){
rs=[rRand Random:j];
#ifdef DEBUG
NSLog(@"%@:%d %d",param,j,rs);
#endif
}

tMode=rs%2?YES:NO;
if(tMode==oldMode && modeCounter<=3){
modeCounter++;
}else{
tMode=!oldMode;
modeCounter=0;
}

NSLog(@"%@:%s",param,tMode?"CO":"RT");
tq=(int *)(tMode?&txQueue:&rxQueue);
rq=(int *)(tMode?&rxQueue:&txQueue);

Timer=time(&Timer);
oldTimer=Timer+timeRange;
#ifdef DEBUG
NSLog(@"%@:%d",param,Timer);
#endif

while(Timer<=oldTimer){
Timer=time(&Timer);
if(tMode){ // CO
switch (*(rq)){
case 0:
break;
case 'H':
*(tq)='A';
*(tq+1)=(*(rq+1))+1;
connectCounter=0;
oldTimer=Timer-1;
break;
case 'A':
if(connectCounter<100){
*(tq)='A';
*(tq+1)=(*(rq+1))+1;
connectCounter++;
}else{
oldTimer=Timer;
}
break;
default:
connectCounter=0;
Timer=oldTimer;
break;
}
}else{ // RT
switch(*(rq)){
case 0:
if(connectCounter<100){
*(tq)='H';
*(tq+1)=Timer;
oldKey=Timer;
}
break;
case 'A':
if(*(rq+1)==oldKey+1){
*(tq)='A';
*(tq+1)=Timer;
oldKey=Timer;
connectCounter++;
if(connectCounter>=100){
oldTimer=Timer;
}
}else{
connectCounter=0;
Timer=oldTimer;
}
case 'H':
default:
break;
}
}
if(connectCounter>100){
flag=NO;
}
#ifdef DEBUG
NSLog(@"%@:Connected %d tq=%c%d rq=%c%d",param,Timer,*tq,*(tq+1),*rq,*(rq+1));
#endif
}
NSLog(@"%@: Connected %d %d %d",param,Timer,oldTimer,connectCounter);
}

[rRand release];
NSLog(@"%@: Thread end",param);
[NSThread exit];
}
+(void)bThread:(id)param
{
time_t time1,time2;
time1=time(&time1);
while(1){
time2=time(&time2);
if((time2-time1)>=2){
NSLog(@" tx=%1c %d rx=%1c %d",txQueue[0],txQueue[1],rxQueue[0],rxQueue[1]);
txQueue[0]=txQueue[1]=rxQueue[0]=rxQueue[1]=0;
time1=time2;
}
}
}
@end

int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int delayTime;
// Start thread to read the queues
[NSThread detachNewThreadSelector:@selector(bThread:) toTarget:[myThread class] withObject:nil];

// Start first thread
[NSThread detachNewThreadSelector:@selector(aThread:) toTarget:[myThread class] withObject:@"a"];

// Random delay time
randGen *r=[[randGen alloc] init];
int j=[r Random:10];
for(int i=0;i<j;i++){
delayTime=[r Random:j];
}
NSLog(@"Delay start %d seconds",delayTime);
sleep(delayTime+1);
[r release];

// Start second thread
[NSThread detachNewThreadSelector:@selector(aThread:) toTarget:[myThread class] withObject:@"b"];

sleep(timeRange*4);

[pool drain];
return 0;
}

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

iPod Touch 64GB 入手
11/23/2010, 23:42 - Apple
其實昨天就到貨了,但因為拿到的時間已晚,所以就今天才開封。和舊的iPod Touch相比,好像重了一點,小了一點,而且反光更嚴重,更容易留下指紋。而正反兩面都有鏡頭,不知道可不可以包膜,還是包膜的師父有技術可以處理!一拿到就正好遇到新的iOS 4.2.1軟體更新。接下來要看有沒有人要接手舊的iPod Touch了,其實舊的32GB狀況很好,電池很充足,平常只有拿來打棒球Game,就有沒有緣份了。
發表回應 發表回應 ( 424預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.9 / 406 )


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