2010年12月27日 星期一

一起經營自己的蛋糕店《Bakery Story》

不知大家有沒有玩過 Facebook 中的「Restaurant City」,如果您喜歡這類型遊戲的話,就一定不能錯過這款以經營西餅店為主題的《Bakery Story》。該遊戲畫風可愛,又用上得意有趣的公仔人物,不管是男生或女生都被吸引著。在遊戲中,玩家的身分當然是一名西餅店的老闆,可以根據自己的喜 好,製作出不同款式的西餅,又可以調教不同口味的飲品,這些都是模擬遊戲很典型的玩法。而《Bakery Story》特別之處是一定要求手機網絡連線,讓大家可隨時隨地到朋友的餅店參觀,為遊戲添上更多元化的樂趣。


▲ 畫面與「Restaurant City」很相似,不過此遊戲不能邀請朋友成為員工。

▲玩家可以為店舖進行粉飾,亦有一些限時的裝飾品,如聖誕樹等,可增添一些節日的氣氛。

▲ 遊戲可以隨時轉換自己的人物,店鋪名字等等,但暫不支援為人物替換衣服。

▲ 如果要邀請朋友,雙方都需要有 Storm8 帳戶,甚為不便。

▲ 遊戲中可以製造的食物十分齊全,款式繁多,由蛋糕至麵包都一應俱全,要留意的是每款食物製造時間和數量都不同,而且以真實時間計算。

▲ 除了食物外,亦可預備各式飲料,隨著等級的提升,可以製作的食品便越多。
總結:
《Bakery Story》的確有讓人流連忘返的感覺,很容易令人沉迷,不過邀請朋友的設計有點不方便,如果能夠根據電話號碼或 Facebook 等方式邀請朋友加入,就可以引導更多朋友一起參與,增加遊戲的互動性。另一方面,《Bakery Story》必需在手機連線下才能進入,對於沒有無限數據的朋友,就只能在家中才可經營自己的蛋糕店。
支援系統:Android 2.0 以上
Market: market://search?q=pname:com.teamlava.bakerystory
QR Code:



Source:http://www.android-hk.com/games/bakery-story/

線上德州撲克王《Live Holdem Pro》


紅極一時的德州撲克遊戲《Live Holdem Pro》現已登陸 Android Market,雖然推出時間只短短五日,但已經錄得 >250,000 下載量,可玩性毋庸置疑。該遊戲不設單人模式,必須在 3G/WiFi 連線下進行,玩家每次都可以與世界各地的高手比賽,另外更可挑戰自己參加不同的挑戰賽,贏取豐富的獎品,如果您不太喜歡刺激大賽的話,亦可以與朋友自組一個房間作賽,看看誰是真正撲克王!



▲ 為方便大家,遊戲已經支援 Facebook 帳戶登入,也可以申請官方帳戶開始遊戲。

▲ 登入後,大家可立即開始遊戲,亦可利用信用卡購買更多遊戲金幣。

▲ 想悠閒一點,不妨先進入「Play Texas Hold’em」小試牛刀,如果你有信心的話,也可直接選擇「Play Tournament」參加各樣比賽,但要求金額會高一點。

▲ 於挑戰賽中,都需要支付一定數量的遊戲幣去參加,但勝出者亦會得到一筆可觀的獎金。

▲ 遊戲亦可以讓大家隨時加入一些朋友,方便大家約戰。


▲ 遊戲玩法應該不用多介紹了,較為特別的是玩家圖像旁的星星是玩家的等級,多勝幾場就能不斷提升。
總結:
喜歡這類遊戲的話,《Live Holdem Pro》絕對值得大家一試,遊戲讓大家可以接觸到世界各地的高手,不會像與電腦對戰般沈悶,每次都帶來刺激和驚喜,而且大家只需利用 Facebook 帳戶登入就可以開始遊戲,十分方便,又可以與朋友約個時間對戰,讓您隨時隨地都可以進入撲克牌的世界。
支援機種:所有 Android 系統
Market: market://search?q=pname:com.dragonplay.liveholdempro
QR Code:


Source:http://www.android-hk.com/games/live-holdem-pro/

2010年12月24日 星期五

讓免費的「Comodo系統清理專家 3.0」幫你清掃電腦中的垃圾吧!

Comodo是一間相當知名的英國軟體公司,從早期最有名的防火牆軟體,到防毒、備份、系統還原軟體,在系統軟體界有不錯的口碑。今天阿正老師要介紹的是最新的Comodo System-Cleaner 3.0版,它可以輕鬆幫你清除掉系統的垃圾、隱私資料、或是刪除/粉碎檔案,還有完整的備份及還原點機制,讓你能更安心地清除檔案喔!
Comodo是一家專門設計系統軟體的英國軟體公司,之前阿正老師也介紹過該公司的軟體,如:《免費的「電腦時光機」,幫你輕鬆將系統做快照和還原!》、「Comodo Backup」,都是相當不錯的軟體。

今天要介紹的這套Comodo System-Cleaner 3.0,是一套相當方便的免費系統清理軟體,而且號稱100%安全,如果你的電腦使用了一段時間卻沒常常清理,不妨試試看讓這套軟體幫你好好來個大掃除吧!

image
Comodo System-Cleaner 3.0

* 官方網站:http://system-cleaner.comodo.com/
* 下載點:[官網下載] (10.1MB)
* 支援語系:英、法、德、簡中…等12種語言(無繁中)
* 支援作業系統:Windows XP之後版本

基本使用方式

Comodo System-Cleaner的執行畫面如下,主要的功能一共有五個,顯示在視窗左方,包括了:

* Registry Cleaner:清理登錄檔中不必要的機碼
* Privacy Cleaner:清理隱私資料,包含多種常見軟體存放在本機的暫存資料
* Disk Cleaner:清理磁碟,可清除指定類型的檔案,及Windows的暫存檔或Log檔
* Force Delete:強制刪除檔案或資料夾
* Shredder:檔案粉碎器,以運算法完全破壞掉檔案裡面的資料使之無法復原

image

以登錄檔清理為例,按下左方的「Registry Cleaner」,右邊就會出現Quick Clean(快速清理)、Normal Clean(一般清理)及In Depth Clean(深度清理)三種,畫面中央會出現「x Issues selected!」表示有幾個項目尚待清理,按下右邊的〔▽〕按鈕可張開細部選項,手動勾選要清除的項目。

image

如果你擔心有重要的資料被誤刪,可以按下上方的「Settings」(設定值)頁面,勾選前兩個項目(第一個是在清理前建立還原點,第二個是建立備份檔)

image

以後要是有發現檔案或登錄檔的機碼被誤刪,可以按下上方的「Restore」來找回。

image

如果你希望Comodo System-Cleaner幫你定期清理,可以按下右邊的鬧鐘按鈕,設定清理的頻率、時間及日期,相當方便。

image

如果你想檢視並勾選Comodo System-Cleaner準備幫你清理的項目,只要按下〔▽〕按鈕張開細部選項,就可以清楚地看到會被刪除的項目了。如下圖就是隱私清理的項目,可看到有哪些軟體的暫存檔或紀錄檔(可能會暴露一些私隱資料的),只要打勾起來再按下右上方的〔Clean〕按鈕就可以開始清理了。

磁碟清理

在磁碟清理的部份,分成系統檔案的清理及重複檔案的清理,按下視窗上方的「Clean」可以選擇要清理的類型,包括Windows的紀錄檔及暫存檔。

image

按下上方的「Duplicates」則可以尋找:所有、影片、音樂或相片等四種類型的重複檔案,按下該類型右邊的〔▽〕按鈕可以選擇某個磁碟機或資料夾,Comodo System-Cleaner就會幫你把重複的檔案給搜尋出來,再讓你勾選要刪除的重複檔案。

image
強制刪除功能

我們有時候會遇到一些檔案被系統、軟體甚至是病毒給鎖住而無法刪除時,這時候就可以Comodo System-Cleaner就可以派上用場了。在「Force Delete」功能中可以刪除指定的檔案/資料夾、登錄檔的機碼,或是移動檔案,相當實用。

image


檔案粉碎器

當我們要把某些機密的檔案完全粉碎時,光是靠Windows內建的刪除功能是不夠的,因為被刪除的檔案還是可以透過反刪除軟體給救回來,因此要徹底粉碎檔案的資料必須透過專門的軟體(有專門設計的演算法)來達成。Comodo System-Cleaner 3.0也內建了檔案粉碎器,可以幫你把檔案/資料夾、磁碟分割區甚至是整顆硬碟的資料給粉碎掉。

image
結語

Comodo System-Cleaner 3.0是一套功能相當完整的系統清理軟體,它可以幫你在清理前建立完整的備份及還原點,因此不用擔心檔案遭到誤刪。加上它搭配了強制刪除及檔案粉碎的功能,相信會讓這套軟體更加實用,不過可惜的是目前尚未提供繁體中文的介面,還是建議玩家先選擇英文或是簡體中文的介面來使用看看。

Source:http://blog.soft.idv.tw/?p=842&page=2

[PHP教學]超方便的驗證碼套件Captcha Genie,幫你輕鬆在網頁上製作出圖片驗證碼!

CAPTCHA(英文全名為Completely Automated Public Turing Test to tell Computers and Humans Apart),中文譯為「全自動區分計算機和人類的測試」,我們都常簡稱為「驗證碼」,是為了避免網路上的資源被一些自動程式所浪費,所以會以一些難辨識的圖形、文字、算術來讓使用者輸入,以確認在電腦前的是人類。CAPTCHA有相當多種,而且難度也都不一,越複雜的就越難破解,但是也會造成使用者的負擔,很容易產生一直輸入失敗的挫折感。因此有的 CAPTCHA也加上了語音提示的功能,按下發音按鈕後就會念出圖片中的文字讓你輸入,例如常見的Google「reCAPTCHA」就是一種。

image

今天阿正老師要來介紹的這個Captcha Genie套件,就是一套相當簡單又實用的PHP驗證碼套件,除了可以選擇多種圖片背景、字型之外,還可設定文字的長度、字型大小、顏色,或是以簡單的數學運算式來做驗證。
Captcha Genie

* 官方網站:http://www.captchagenie.com/
* 主程式下載:[官網下載點] (1MB)


一、安裝方式

下載Captcha Genie主程式,解壓縮到網頁中某個資料夾,建議可解到網站的根目錄中。解開後會產生一個captcha的資料夾,裡面有幾個檔案:

image

其中我們需要修改的「configuration.php」這個就是設定檔,其他的皆不用修改。
二、產生設定檔

1.

要修改設定檔我們可以用一般的文字編輯器來編輯configuration.php,裡面有完整的說明可以對照來修改。

image

2.如果你嫌麻煩,可以到官方網站上方點選「Customize」就可進入設定檔的產生器頁面。

畫面左方有多種選項可以設定,完成後按下〔Save and Show〕按鈕就可在畫面右方看到驗證碼的顯示結果,最後再按下「Download configuration file」將設定檔下載下來,下載後取代原來的configuration.php即可。

image

有哪些細部的設定可以修改呢? 請翻到本文的第二頁有介紹。

三、修改網頁檔

完成設定之後,修改你要出現圖片驗證碼的網頁,加上一段HTML碼:


如果你希望讓使用者能重新整理驗證碼圖片,可以加上一段:


重新整理


例如我的HTML寫成這樣:

image

網頁顯示的結果就是:

image

是不是相當簡單呢?

Source:http://blog.soft.idv.tw/?p=844&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+quicktop+%28Software+Player%29&utm_content=Google+Reader

[多螢幕必備] 超輕巧好用的免費工具列軟體 ZBar,讓每個螢幕底下都有Windows工具列!

這篇文章中介紹過MM Taskbar,不過那套軟體還是有一點小bug,有時使用起來不太順手。今天要介紹的這套來自英國的ZBar比MM Taskbar更迷你好用,只有不到400KB的體積,可說是麻雀雖小、五臟俱全啊~絕對是你多螢幕作業的好幫手!
ZBar

* 官方網站:http://www.zhornsoftware.co.uk/zbar
* 下載點:[官網下載] (126KB)

一、為什麼需要多螢幕工具列軟體?

以往我們在接上多螢幕顯示時,即使將視窗移動到另一個螢幕,該視窗的工具列圖示依然會留在主螢幕下方的工具列中,程式開得越多,工具列就越擠,而且分不出哪個程式在哪個螢幕上執行:

如果使用了多螢幕工具列軟體(如UltraMon、MM Taskbar、MultiMon、Display Fusion…),就可以將位於該螢幕的程式,顯示在該螢幕下方的工具列了,不但好找,而且又可節省主螢幕工具列的空間。

以阿正老師的電腦為例,下圖右方是我的主螢幕,左方則是第二螢幕,紅色箭頭所指的區域就是用多螢幕工具列軟體所虛擬出來的工具列。

image
二、ZBar的特點

ZBar除了體積小、免安裝之外,還提供了九種(如下圖)工具列的樣式,從XP到Win 7、Mac OS X都有,可以依照喜好來自訂(包括設定半透明度、寬度…)。

image

此外ZBar還提供了更換桌布的功能,可以在不同桌面套用上自己喜歡的桌布(Windows預設是只能多螢幕使用一樣的桌布),並可在工具列提供視窗的預覽畫面,還可直接呼叫出最近六個月的月曆,是個相當貼心的小功能。
三、操作方式

ZBar的使用方式非常簡單,只要解壓縮下載檔(裡面只有兩個檔案),執行zbar.exe即可。執行後會在右下角的系統列產生一個圖示(如下圖紅色箭頭處),在圖示上方按下滑鼠右鍵即可叫出選單。選單功能主要有「Options」(設定選項)、「Show Calendar」(顯示月曆)、「Wallpaper」(桌布設定)及「Reset」(重置ZBar)等。如下圖中的月曆就是點選【Show Calendar】所產生。

image

※PS:在月曆中可使用滑鼠滾輪來捲動月曆喔!

按下【Options】後會出現以下設定畫面,在Style的地方可選擇工具列的樣式,左下角可設定切換鍵盤的熱鍵,右邊則可設定工具列的效果,例如想要將工具列變成半透明,則將「Glass」打勾,再調整Visibility(透明度)即可。

image

※熱鍵的設定預設是用:Ctrl+Alt + (Z或X或C),也可改用Ctrl+Alt+方向鍵,

作用是可將目前作用中的視窗切換到另一個螢幕。



點選ZBar的【Wallpaper】選項,可以設定桌布的照片。如果是要在每個螢幕擺上不同的桌布,先點選左邊的「One image per screen」,然後點選上方的螢幕,再按下「Image file」右方的〔…〕按鈕來選擇檔案,就可以逐一設定不同螢幕的桌布囉!

image

右下角的Mode 0、1則是設定桌布的縮放模式,左下角則是設定桌面的底色,設定都相當簡單,玩家們相信可以輕鬆上手!

小技巧:

1.如果你的ZBar發生了偵測錯誤程式視窗的問題,只要點選右鍵選單的【Reset】讓ZBar重置一次就會正常了~

2.ZBar所虛擬出來的工具列,上面的程式圖示是可以用滑鼠拖曳來移動位置的喔!

Source:http://blog.soft.idv.tw/?p=847&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+quicktop+%28Software+Player%29&utm_content=Google+Reader

2010年12月23日 星期四

Android版Google Maps 5.0可離線瀏覽

Android版Google Map 5.0地圖改採向量繪圖方式製作,全球一百多個城市中還以3D模型方式建立,用雙指放大縮小幾乎不受限制,還可傾斜不同角度或旋轉方向觀看地圖。

Google為Android版Google Map 5.0推出新功能。新版本改採向量繪製的地圖,支援羅盤模式及離線地圖功能;同時也加入了3D模型。

新版地圖改採向量繪圖方式製作,全球一百多個城市中還以3D模型方式建立,用雙指放大縮小幾乎不受限制,還可傾斜不同角度或旋轉方向觀看地圖。新增的羅盤模式搭配電子羅盤與定位,即可隨著使用者旋轉、移動地圖。由於向量的資料量僅為以往點陣圖模式的百分之一,新版可以將使用者查閱過的地圖儲存在手機當中,因此當手機無法連線時仍可以查閱地圖、導航或做路徑規劃。

該版軟體Google先前介紹Android 2.3時就已經出現,目前可以在Android Market中下載。Android 1.6及更新版本即可安裝使用,但Android 2.0或更新版本才能使用3D、離線等功能,部分功能需要搭配衛星定位、電子羅盤、多點觸控等才能使用。

Source:http://www.ithome.com.tw/itadm/article.php?c=65092

2010年12月22日 星期三

限時免費遊戲:Hero Of Sparta

繼上次《Dungeon Hunter HD》後,GameLoft 再次推出 Android 限時免費遊戲下載,這次是一款 3D 第三人稱動作冒險遊戲《Hero Of Sparta》。該遊戲是以 APRG 形式進行,玩家需要透過虛擬控制桿及按鈕來操控,帶領斯巴達英雄在八大版圖展開刺激驚險的冒險旅程。驟眼看來,遊戲畫面多少有《Dungeon Hunter HD》的影子,若閣下喜歡後者的話,也不要錯過這次免費下載的機會啦!

下載《Hero Of Sparta》的步驟:

1. 以手機進入網站 http://www.gameloft.com/free-hd-game/,按下 “Get it Now!” 進入遊戲頁面,再按 “Free Download” 便會自動下載 apk 安裝檔 。
2. 主程式成功安裝後,首次進入會要求下載遊戲資料檔於 SD Card 中,記得開啟 Wi-Fi 來下載,可大大縮短等候的時間。
3. 大功告成!可開始遊戲。

Source:http://www.android-hk.com/news/hero-of-sparta-free/

簡潔又實用的音樂播放程式《Miui Music》


心水清的朋友,相信一見到名字就會發現,其實這是取自國內高手開發 Miui Rom 的音樂程式,有見程式越來越受歡迎,而且介面吸引,最近有 xda 高手特意從 Rom 中抽出《Miui Music》的 apk 檔案,供大家下載使用,以後,大家便不需刷 Miui Rom 都可以用到這款簡潔又實用的音樂程式了。

▲ 播放介面簡潔,設有三版,只需用手一掃即可轉換,亦設有「favorities list」功能,只需按一按心心圖示便可新增。

▲ 程式設有搜尋歌詞功能,亦支援跟歌詞同步播放,不過搜尋歌詞方面就比較弱,尤其是陳奕迅,但其他歌手就可輕易搜尋得到。

▲ 歌曲列表十分美觀,顯示了喜愛歌曲及各樣資訊。

▲ 唱片搜尋列表可以一次過顯示 9 張唱片,設計亦較內置播放程式更美觀。

▲ 當然少不了音樂播放 Widget 工具,不過目前只有 4 x 1 的尺寸。
總結:
對比原裝內置的音樂播放程式,《Miui Music》無疑帶給用家更優越的體驗,此程式完全補充了原有的不足,而且從介面到 Widget 工具等,都有各方面的改進,更重要的是,程式所佔記憶體不多,各款手機都可以流暢運作。不過如果 Widget 可以有更多尺寸選擇,相信會更方便用家使用,有興趣的朋友,可以按這裡下載。
Share and Enjoy:
Facebook
  • Soruce:http://www.android-hk.com/applications/miui-music/#more-32200

Android Market 類別更新

相信大部份用戶都已經把手機中的 Android Market 更新至 2.2.7 版本,但不知有沒有發現到其實有部份類別亦已作出修改,甚至新增了一些新類別?作為普通用戶,是次更新固然能夠讓大家方便快捷地尋找心水軟件;而對開發 者,就更加需要留意有沒有軟件要註冊至另一個類別之中,增加曝光度。Android Market 類別更新如下:
應用程式新增類別:
  • 圖書與參考資源(Books & Reference)
  • 商業(Business)
  • 教育(Education)
  • 醫療(Medical)
  • 音樂與音效(Music & Audio)
  • 個人化(Personalization)
  • 攝影(Photography)
  • 交通(Transportation)
  • 天氣(Weather)
應用程式修改類別:
  • 健康(Health)→健康塑身(Health & Fitness)
  • 旅行(Travel)→旅行與地方資訊(Travel & Local)
  • 程式庫(Software Libraries)→程式庫與試用程式(Libraries & Demo)
應用程式刪除類別:
  • 參考資源(Reference)
遊戲新增類別:
  • 運動(Sports Games)
via: androidpolice

Source: http://www.android-hk.com/news/android-market-category-update/

內容為王的時代

The era of content is king
你覺得一台 Casio 的計算機和個人電腦相比,差異點有哪些?
這個問題,應該很好回答,隨便都可以找到差異點。但是如果我將個人電腦上的軟體都移除,只剩下 "小算盤" 這個軟體,並且將個人電腦上可自行安裝軟體的功能也關閉。此時,你覺得這台個人電腦和 Casio 計算機的差異在哪?我猜你的回答可能只剩下,螢幕比較大,外型比較漂亮還有價錢比較貴。是嗎?
我相信這你很清楚這計算機與個人電腦相比的例子。我再問你,你覺得 功能性手機 (feature phone)智慧型手機 (smart phone) 相比,他們的差異點又有哪些?
我想多數人的回答都是,智慧型手機可以讓我自行安裝與移除應用程式。這答案絕對不是比較大台或是比較貴就是智慧型手機,更不是有 Apple, Symbian, Microsoft 或 Android 加持的就叫智慧型手機。
沒錯!智慧型手機的重點就在可讓使用者自行安裝其所需要的應用程式。手機只是個載體,在那上面執行的應用才是智慧的來源。舉例來說, 手機就像是人的軀體,裡面的 CPU 是人的大腦。但是光這樣,人還是無法變聰明,你必須要接受教育,讀很多書,才會有智慧。而每個人所讀的書,就像是手機上的應用。所以即使你我都是用 Nexus One 的 Android 手機,但因為每個人的需求不同,安裝的應用也會不同。用了一陣子之後,每台 Nexus One 手機,都會是獨一無二的,除非你只用內建的應用。
不過僅有 "可自行安裝應用" 這點還是不夠的。Windows Mobile 或 Symbian 之類的智慧型手機,好幾年前就有了,問問曾經用過這類智慧型手機的朋友,會自行安裝應用的有多少人?我想這答案應該很清楚,大家都不常自行安裝應用。為什 麼?因為他們不知道要去哪裡下載應用,也就是說他們不曉得書店在哪裡,要去哪裡買書。所以,這些人都將一台兩萬多元的智慧型手機,當 0 元功能性手機在使用。
我想一個智慧型手機的重點應該是,有個單一的入口點,讓使用者找到與安裝應用程式。iPhone 與 Android 手機透過內建的 Market 應用,解決了這個不知道去哪裡下載應用的問題。一個智慧型手機如果沒有了 Market 應用,就算他有 Android 的加持,哪和功能型手機有甚麼兩樣?聯發科依照其在功能性手機時代的成功模式,就算推出了 Android 解決方案,但是沒有了 Market 應用,那 MTK Android 手機和功能性手機的差別在哪?
有 Market 應用還不夠。一個 Market 如果不能像是一個甚麼都有的量販店,只能像是你家旁邊的小雜貨店,那有和沒有這個 Marekt,對使用者而言又有何差別?電信商推出的自家 Market,裡面的應用如果沒有數萬個。對使用者而言,如果手機已內建官方的 Market (如 AppStore 和 Android Market),還需要這個電信商的 Market 嗎?除非你自家的 Market 有獨到的特色。
我並不是說山寨智慧型手機 (沒有內建 Market 應用的智慧型手機),和山寨 Market (沒有貶低的意思,純粹是指非官方的 Markets) 沒有出路。單打獨鬥,我還沒看到成功的機會點。只有互相合作,才有成功的可能。這怎麼說?
會成功的山寨 Market,我個人覺得只有兩種。一種是專門做盜版的市場,那就真的是山寨 Market 了。不過,這只有在特定地區才有生存的空間。另一種會成功的山寨 Market,就是在手機內建應用市場上,能占有最高的市占率。要寫個 Market 應用,不是一件很困難的工作,困難的是如何能擁有數萬個應用,並能持續地更新和成長。如果 Market 的經營者,還想靠寄送 email 的方式,邀請開發者來免費支援的話。我可以說,這方式一點都不可行。我曾經有一個月,收到數十封這樣的 emails,他們的下場全是進了垃圾桶。我會這樣做,多數的開發者也是如此。
這道理,其實 Market 經營者也知道。只不過,他們還是以舊時代 (通路是王) 的思維在經營 Market。他們不知道的是,一個以內容 (應用及應用開發者) 為王的時代,已經悄悄開始了。
山寨 Market 必須結合山寨智慧型手機,才有機會。
對山寨智慧型手機製造商來說,只有內建 Market 應用,才能彰顯這智慧型手機的價值。山寨手機沒機會內建官方的 Market,如果能內建一個內容豐富的山寨 Market ,也算達到目的。對山寨 Market 經營者而言,只要能讓所有的山寨智慧型手機,都內建你的 Markete 應用。你根本不用去一一拜託眾多的應用開發者,只要你的 Market 有一定的市佔率,開發者自然會將應用放上來。要如何才能讓所有的山寨手機內建你的山寨 Market?我想這唯一的控球權,還是掌握在提供山寨手機平台解決方案提供者的那一方。
看完了手機,pad 與電子書也都有同樣的問題。pad 與電子書在硬體功能上,我覺得兩岸的廠商一定可以把他們發揮到極致,這是無庸置疑的。可是一個沒有 Market 的 pad,對使用者而言,這一台 pad 和 Casio 的計算機相比有何兩樣?在深圳,多數的 pads 多是執行 Android 系統。Google 短期內看來也不會將 Android Market 授權給 pad 廠商。所以這些 pad 和山寨智慧型手機都有相同的問題。沒有 Market 和沒有內容是相同的,沒有新應用,使用者很快就玩膩了。就電子書來說,一個只能下載有限書籍的電子書,他能在使用者的手上能用多久?台灣如果沒有一個獨立 的書籍內容發行商來整合眾家的出版社,我不覺得這電子書會有市場。
山寨智慧型手機、pad 與電子書,他們的問題,最終都會在內容上。只有手上握有內容的才是老大。
一個以內容為王的時代,已經悄悄開始了,這是個趨勢。最後的結果會是如何,我也不知道。不過,這世界就是因為有不斷的改變,才變得有趣。就讓我們一起拭目以待,一起走過。

Source:http://ysl-paradise.blogspot.com/2010/08/blog-post.html

2010年12月21日 星期二

考驗您的領導才能《Fuzzies》


「天生我才必有用」,這句話不只是形容人類,就連猴子都一樣有用。《Fuzzies》就是一款需要玩家巧妙運用猴子的各種天生技能,帶領牠們到達終點,當然途中會遇到不同的障礙,如山崖、牆壁等,所以很考玩家的智慧與反應,未知大家有辦法平安帶領更多猴子到達終點呢?

▲ 遊戲並有 28 關,並會根據玩家的表現評分。

▲ 遊戲目標簡單,只需帶領猴子們到達紅旗位置便可,而玩家於每一關也可以運用猴子不同的技能去解決困難,但要留意使用次數是有限的。

▲ 上圖所用的便是挖洞技能,有了它,猴子就能落到下一層的位置,其他技能如:降落傘、建樓梯、爬牆等,都要因應不同場合去好好運用。
總結:
試玩過後,《Fuzzies》的畫面其實不算突出,但玩法卻很有趣,玩家要好好把握運用技能的時機,才可以帶領更多猴子到達終點,可見智慧與反應缺 一不可。筆者覺得,如果遊戲可以改善一下畫面質素,相信可以吸引到一眾女生愛上它,亦可以加入更多技能,讓玩家發揮自己的創意過關。
Market: market://search?q=pname:com.polarbit.Fuzzies
QR Code:

Coca Cola 聖誕 Live Wallpaper

聖誕節即將來到,不知大家準備好歡度聖誕了未?如果想手機都充滿著聖誕氣息,就不妨下載這款可口可樂聖誕節 Live Wallpaper 。該桌布會模擬聖誕球內的情境,當中的雪花及道具更會根據重力感應來擺動,令手機充滿聖誕氣息之餘,又充滿動感。順帶一提,桌布的設計其實源於今年可口可 樂的節日廣告,用家亦可以透過軟件連結到 YouTube 收看這段一分鐘的影片,撇開商業元素來看,也算有不錯的娛樂性。

Coca Cola 聖誕 Live Wallpaper 宣傳片段
Market: market://search?q=pname:coke.snowglobe
QR Code:

via: phandroid bestandroidappsreview

Source:http://www.android-hk.com/wallpapers-live-wallpapers/coca-cola-xmas-livewallpaper/

C# .Net中的類型轉換

1. 裝箱、拆箱還是別名
許多 C#.NET 的書上都有介紹 int -> Int32 是一個裝箱的過程,反之則是拆箱的過程。許多其他變數類型也是如此,如:short <-> Int16,long <-> Int64 等。對於一般的程式員來說,大可不必去了解這一過程,因為這些裝箱和拆箱的動作都是可以自動完成的,不需要寫代碼進行干預。但是我們需要記住這些類型之間 的關係,所以,我們使用“別名”來記憶它們之間的關係。
C# 是全面向對象的語言,比 Java 的面向對象都還徹底——它把簡單數據類型通過默認的裝箱動作封裝成了類。Int32、Int16、Int64 等就是相應的類名,而那些我們熟悉的、簡單易記的名稱,如 int、short、long 等,我們就可以把它稱作是 Int32、Int16、Int64 等類型的別名。那麼除了這三種類型之外,還有哪些類有“別名”呢?常用的有如下一些:
bool -> System.Boolean (布爾型,其值為 true 或者 false)
char -> System.Char (字符型,佔有兩個字節,表示 1 個 Unicode 字符)
byte -> System.Byte (字節型,佔 1 字節,表示 8 位正整數,範圍 0 ~ 255)
sbyte -> System.SByte (帶符號字節型,佔 1 字節,表示 8 位整數,範圍 -128 ~ 127)
ushort -> System.UInt16 (無符號短整型,佔 2 字節,表示 16 位正整數,範圍 0 ~ 65,535)
uint -> System.UInt32 (無符號整型,佔 4 字節,表示 32 位正整數,範圍 0 ~ 4,294,967,295)
ulong -> System.UInt64 (無符號長整型,佔 8 字節,表示 64 位正整數,範圍 0 ~ 大約 10 的 20 次方)
short -> System.Int16 (短整型,佔 2 字節,表示 16 位整數,範圍 -32,768 ~ 32,767)
int -> System.Int32 (整型,佔 4 字節,表示 32 位整數,範圍 -2,147,483,648 到 2,147,483,647)
long -> System.Int64 (長整型,佔 8 字節,表示 64 位整數,範圍大約 -(10 的 19) 次方 到 10 的 19 次方)
float -> System.Single (單精度浮點型,佔 4 個字節)
double -> System.Double (雙精度浮點型,佔 8 個字節)
我們可以用下列代碼做一個實驗:
private void TestAlias() {
    // this.textBox1 是一個文本框,類型為 System.Windows.Forms.TextBox
    // 設計中已經將其 Multiline 屬性設置為 true
    byte a = 1; char b = 'a'; short c = 1;
    int d = 2; long e = 3; uint f = 4; bool g = true;
    this.textBox1.Text = "";
    this.textBox1.AppendText("byte -> " + a.GetType().FullName + "\n");
    this.textBox1.AppendText("char -> " + b.GetType().FullName + "\n");
    this.textBox1.AppendText("short -> " + c.GetType().FullName + "\n");
    this.textBox1.AppendText("int -> " + d.GetType().FullName + "\n");
    this.textBox1.AppendText("long -> " + e.GetType().FullName + "\n");
    this.textBox1.AppendText("uint -> " + f.GetType().FullName + "\n");
    this.textBox1.AppendText("bool -> " + g.GetType().FullName + "\n");
}
在表單中新建一個按鈕,並在它的單擊事件中調用該 TestAlias() 函數,我們將看到運行結果如下:
byte -> System.Byte
char -> System.Char
short -> System.Int16
int -> System.Int32
long -> System.Int64
uint -> System.UInt32
bool -> System.Boolean
這足以說明各別名對應的類!
2. 數值類型之間的相互轉換
這裡所說的數值類型包括 byte, short, int, long, fload, double 等,根據這個排列順序,各種類型的值依次可以向後自動進行轉換。舉個例來說,把一個 short 型的數據賦值給一個 int 型的變數,short 值會自動行轉換成 int 型值,再賦給 int 型變數。如下例:
private void TestBasic() {
    byte a = 1; short b = a; int c = b;
    long d = c; float e = d; double f = e;
    this.textBox1.Text = "";
    this.textBox1.AppendText("byte a = " + a.ToString() + "\n");
    this.textBox1.AppendText("short b = " + b.ToString() + "\n");
    this.textBox1.AppendText("int c = " + c.ToString() + "\n");
    this.textBox1.AppendText("long d = " + d.ToString() + "\n");
    this.textBox1.AppendText("float e = " + e.ToString() + "\n");
    this.textBox1.AppendText("double f = " + f.ToString() + "\n");
}
譯順利通過,運行結果是各變數的值均為 1;當然,它們的類型分別還是 System.Byte 型……System.Double 型。現在我們來試試,如果把賦值的順序反過來會怎麼樣呢?在 TestBasic() 函數中追加如下語句:
int g = 1;
short h = g;
this.textBox1.AppendText("h = " + h.ToString() + "\n");
結果編譯報錯:
G:\Projects\Visual C#\Convert\Form1.cs(118): 無法將類型“int”隱式轉換為“short”
其中,Form1.cs 的 118 行即 short h = g 所在行。
這個時候,如果我們堅持要進行轉換,就應該使用強制類型轉換,這在 C 語言中常有提及,就是使用“(類型名) 變數名”形式的語句來對數據進行強制轉換。如上例修改如下:
short g = 1;
byte h = (byte) g; // 將 short 型的 g 的值強制轉換成 short 型後再賦給變數 h
this.textBox1.AppendText("h = " + h.ToString() + "\n");
編譯通過,運行結果輸出了 h = 1,轉換成功。
但是,如果我們使用強制轉換,就不得不再考慮一個問題:short 型的範圍是 -32768 ~ 23767,而 byte 型的範圍是 0 ~ 255,那麼,如果變數 g 的大小超過了 byte 型的範圍又會出現什麼樣的情況呢?我們不妨再一次改寫代碼,將值改為 265,比 255 大 10
short g = 265; //265 = 255 + 10
byte h = (byte) g;
this.textBox1.AppendText("h = " + h.ToString() + "\n");
編譯沒有出錯,運行結果卻不是 h = 265,而是 h = 9。
因此,我們在進行轉換的時候,應當注意被轉換的數據不能超出目標類型的 範圍。這不僅體現在多字節數據類型(相對,如上例的 short) 轉換為少字節類型(相對,如上例的 byte) 時,也體現在字節數相同的有符號類型和無符號類型之間,如將 byte 的 129 轉換為 sbyte 就會溢出。這方面的例子大同小異,就不詳細說明瞭。
3. 字符的 ASCII 碼和 Unicode 碼
很多時候我們需要得到一個英文字符的 ASCII 碼,或者一個漢字字符的 Unicode 碼,或者從相關的編碼查詢它是哪一個字符的編碼。很多人,尤其是從 VB 程式序轉過來學 C# 的人,會報怨 C# 裏為什麼沒有提供現成的函數來做這個事情——因為在 VB 中有 Asc() 函數和 Chr() 函數用於這類轉換。
但是如果你學過 C,你就會清楚,我們只需要將英文字符型數據強制轉換成合適的數值型數據,就可以得到相應的 ASCII 碼;反之,如果將一個合適的數值型數據強制轉換成字符型數據,就可以得到相應的字符。
C# 中字符的範圍擴大了,不僅包含了單字節字符,也可以包含雙字節字符,如中文字符等。而在字符和編碼之間的轉換,則仍延用了 C 語言的做法——強制轉換。不妨看看下面的例子
private void TestChar() {
    char ch = 'a'; short ii = 65;
    this.textBox1.Text = "";
    this.textBox1.AppendText("The ASCII code of \'" + ch + "\' is: " + (short) ch + "\n");
    this.textBox1.AppendText("ASCII is " + ii.ToString() + ", the char is: " + (char) ii + "\n");
    char cn = '中'; short uc = 22478;
    this.textBox1.AppendText("The Unicode of \'" + cn + "\' is: " + (short) cn + "\n");
    this.textBox1.AppendText("Unicode is " + uc.ToString() + ", the char is: " + (char) uc + "\n");
}
它的運行結果是
The ASCII code of 'a' is: 97
ASCII is 65, the char is: A
The Unicode of '中' is: 20013
Unicode is 22478, the char is: 城
從這個例子中,我們便能非常清楚的了解——通過強制轉換,可以得以字符的編碼,或者得到編碼表示的字符。如果你需要的不是 short 型的編碼,請參考第 1 條進行轉換,即可得到 int 等類型的編碼值。
4. 數值字符串和數值之間的轉換
首先,我們得搞明白,什麼是數值字符串。我們知道,在 C# 中,字符串是用一對雙引號包含的若干字符來表示的,如 "123"。而 "123" 又相對特殊,因為組成該字符串的字符都是數字,這樣的字符串,就是數值字符串。在我們的眼中,這即是一串字符,也是一個數,但電腦卻只認為它是一個字符 串,不是數。因此,我們在某些時候,比如輸入數值的時候,把字符串轉換成數值;而在另一些時候,我們需要相反的轉換。
將數值轉換成字符串非常簡單,因為每一個類都有一個 void ToString() 方法。所有數值型的 void ToString() 方法都能將數據轉換為數值字符串。如 123.ToSting() 就將得到字符串 "123"。
那麼反過來,將數值型字符串轉換成數值又該怎麼辦呢?我們仔細搜尋一下,會發現 short, int, float 等數值類型均有一個 static Parse() 函數。這個函數就是用來將字符串轉換為相應數值的。我們以一個 float 類型的轉換為例: float f = float.Parse("543.21"); 其結果 f 的值為 543.21F。當然,其他的數值類型也可以使用同樣的方法進行轉換,下面的例子可以更明確的說明轉換的方法:
private void TestStringValue() {
    float f = 54.321F;
    string str = "123";
    this.textBox1.Text = "";
    this.textBox1.AppendText("f = " + f.ToString() + "\n");
    if (int.Parse(str) == 123) {
        this.textBox1.AppendText("str convert to int successfully.");
    } else {
        this.textBox1.AppendText("str convert to int failed.");
    }
}
運行結果:
f = 54.321
str convert to int successfully.
5. 字符串和字符數組之間的轉換
字符串類 System.String 提供了一個 void ToCharArray() 方法,該方法可以實現字符串到字符數組的轉換。如下例:
private void TestStringChars() {
    string str = "mytest";
    char[] chars = str.ToCharArray();
    this.textBox1.Text = "";
    this.textBox1.AppendText("Length of \"mytest\" is " + str.Length + "\n");
    this.textBox1.AppendText("Length of char array is " + chars.Length + "\n");
    this.textBox1.AppendText("char[2] = " + chars[2] + "\n");
}
例中以對轉換轉換到的字符數組長度和它的一個元素進行了測試,結果如下:
Length of "mytest" is 6
Length of char array is 6
char[2] = t
可以看出,結果完全正確,這說明轉換成功。那麼反過來,要把字符數組轉換成字符串又該如何呢?
我們可以使用 System.String 類的構造函數來解決這個問題。System.String 類有兩個構造函數是通過字符數組來構造的,即 String(char[]) 和 String[char[], int, int)。後者之所以多兩個參數,是因為可以指定用字符數組中的哪一部分來構造字符串。而前者則是用字符數組的全部元素來構造字符串。我們以前者為例,在 TestStringChars() 函數中輸入如下語句:
char[] tcs = {'t', 'e', 's', 't', ' ', 'm', 'e'};
string tstr = new String(tcs);
this.textBox1.AppendText("tstr = \"" + tstr + "\"\n");
運行結果輸入 tstr = "test me",測試說明轉換成功。
實際上,我們在很多時候需要把字符串轉換成字符數組只是為了得到該字 符串中的某個字符。如果只是為了這個目的,那大可不必興師動眾的去進行轉換,我們只需要使用 System.String 的 [] 運算符就可以達到目的。請看下例,再在 TestStringChars() 函數中加入如如下語名:
char ch = tstr[3];
this.textBox1.AppendText("\"" + tstr + "\"[3] = " + ch.ToString());
正確的輸出是 "test me"[3] = t,經測試,輸出正確。
6. 字符串和字節數組之間的轉換
如果還想從 System.String 類中找到方法進行字符串和字節數組之間的轉換,恐怕你會失望了。為了進行這樣的轉換,我們不得不借助另一個類: System.Text.Encoding。該類提供了 bye[] GetBytes(string) 方法將字符串轉換成字節數組,還提供了 string GetString(byte[]) 方法將字節數組轉換成字符串。
System.Text.Encoding 類似乎沒有可用的構造函數,但我們可以找到幾個默認的 Encoding,即 Encoding.Default(獲取系統的當前 ANSI 代碼頁的編碼)、Encoding.ASCII(獲取 7 位 ASCII 字符集的編碼)、Encoding.Unicode(獲取採用 Little-Endian 字節順序的 Unicode 格式的編碼)、Encoding.UTF7(獲取 UTF-7 格式的編碼)、Encoding.UTF8(獲取 UTF-8 格式的編碼) 等。這裡主要說說 Encoding.Default 和 Encoding.Unicode 用於轉換的區別。
在字符串轉換到字節數組的過程中,Encoding.Default 會將每個單字節字符,如半角英文,轉換成 1 個字節,而把每個雙字節字符,如漢字,轉換成 2 個字節。而 Encoding.Unicode 則會將它們都轉換成兩個字節。我們可以通過下列簡單的了解一下轉換的方法,以及使用 Encoding.Default 和 Encodeing.Unicode 的區別:
private void TestStringBytes() {
    string s = "C#語言";
    byte[] b1 = System.Text.Encoding.Default.GetBytes(s);
    byte[] b2 = System.Text.Encoding.Unicode.GetBytes(s);
    string t1 = "", t2 = "";
    foreach (byte b in b1) {
        t1 += b.ToString("") + " ";
    }
    foreach (byte b in b2) {
        t2 += b.ToString("") + " ";
    }
    this.textBox1.Text = "";
    this.textBox1.AppendText("b1.Length = " + b1.Length + "\n");
    this.textBox1.AppendText(t1 + "\n");
    this.textBox1.AppendText("b2.Length = " + b2.Length + "\n");
    this.textBox1.AppendText(t2 + "\n");
}
運行結果如下,不說詳述,相信大家已經明白了。
b1.Length = 6
67 35 211 239 209 212
b2.Length = 8
67 0 35 0 237 139 0 138
將字節數組轉換成字符串,使用 Encoding 類的 string GetString(byte[]) 或 string GetString(byte[], int, int) 方法,具體使用何種 Encoding 還是由編碼決定。在 TestStringBytes() 函數中添加如下語句作為實例:
byte[] bs = {97, 98, 99, 100, 101, 102};
string ss = System.Text.Encoding.ASCII.GetString(bs);
this.textBox1.AppendText("The string is: " + ss + "\n");
運行結果為:The string is: abcdef
7. 各種數值類型和字節數組之間的轉換
在第 1 條中我們可以查到各種數值型需要使用多少字節的空間來保存數據。將某種數值類型的數據轉換成字節數組的時候,得到的一定是相應大小的字節數組;同樣,需要 把字節數組轉換成數值類型,也需要這個字節數組大於相應數值類型的字節數。現在介紹此類轉換的主角:System.BitConverter。該類提供了 byte[] GetBytes(...) 方法將各種數值類型轉換成字節數組,也提供了 ToInt32、ToInt16、ToInt64、ToUInt32、ToSignle、ToBoolean 等方法將字節數組轉換成相應的數值類型。
由於這類轉換通常只是在需要進行較細微的編碼/解碼操作時才會用到,所以這裡就不詳細敘述了,僅把 System.BitConverter 類介紹給大家。
8. 轉換成十六進位
任何數據在電腦內部都是以二進位保存的,所以進制與數據的存儲無關,只與輸入輸出有關。所以,對於進制轉換,我們只關心字符串中的結果。
在上面的第 4 條中提到了 ToString() 方法可以將數值轉換成字符串,不過在字符串中,結果是以十進位顯示的。現在我們帶給它加一些參數,就可以將其轉換成十六進位——使用 ToString(string) 方法。這裡需要一個 string 類型的參數,這就是格式說明符。十六進位的格式說明符是 "x" 或者 "X",使用這兩種格式說明符的區別主要在於 A-F 六個數字:"x" 代表 a-f 使用小寫字母表示,而 "X" 而表示 A-F 使用大字字母表示。如下例:
private void TestHex() {
    int a = 188;
    this.textBox1.Text = "";
    this.textBox1.AppendText("a(10) = " + a.ToString() + "\n");
    this.textBox1.AppendText("a(16) = " + a.ToString("x") + "\n");
    this.textBox1.AppendText("a(16) = " + a.ToString("X") + "\n");
}
運行結果如下:
a(10) = 188
a(16) = bc
a(16) = BC
這時候,我們可能有另一種需求,即為了顯示結果的整齊,我們需要控制十六進位表示的長度,如果長度不夠,用前導的 0 填補。解決這個問題,我們只需要在格式說明符“x”或者“X”後寫上表示長度的數字就行了。比如,要限制在 4 個字符的長度,可以寫成“X4”。在上例中追加一句:
this.textBox1.AppendText("a(16) = " + a.ToString("X4") + "\n");
其結果將輸出 a(16) = 00BC。
現在,我們還要說一說如何將一個表示十六進位數的字符串轉換成整型。這一轉換,同樣需要借助於 Parse() 方法。這裡,我需要 Parse(string, System.Globalization.NumberStyles) 方法。第一個參數是表示十六進位數的字符串,如“AB”、“20”(表示十進位的 32) 等。第二個參數 System.Globalization.NumberStyles 是一個枚舉類型,用來表示十六進位的枚舉值是 HexNumber。因此,如果我們要將“AB”轉換成整型,就應該這樣寫:int b = int.Parse("AB", System.Globalization.NumberStyles.HexNumber),最後得到的 b 的值是 171。
9. 日期型數據和長整型數據之間的轉換
為什麼要將日期型數據轉換為長整型數據呢?原因很多,但就我個人來說,經常將它用於數據庫的日期存儲。 由於各種數據庫對日期型的定義和處理是不一樣的,各種語言對日期型數據的定義的處理也各不相同,因為,我寧願將日期型數據轉換成長整型再保存到數據庫中。 雖然也可以使用字符串來保存,但使用字符串也會涉及到許多問題,如區域等問題,而且,它需要比保存長整型數據更多的空間。
日期型數據,在 C# 中的參與運算的時候,應該也是轉換為長整型數據來運算的。它的長整型值是自 0001 年 1 月 1 日午夜 12:00 以來所經過時間以 100 毫微秒為間隔表示時的數字。這個數在 C# 的 DateTime 中被稱為 Ticks(刻度)。DateTime 類型有一個名為 Ticks 的長整型只讀屬性,就保存著這個值。如此,要從一個 DataTime 型數據得到 long 型值就非常簡單了,只需要讀出 DataTime 對象的 Ticks 值即可,如:
long longDate = DateTime.Now.Ticks;
DateTime 的構造函數中也提供了相應的,從長整型數據構造 DateTime 型數據的函數:DateTime(long)。如:
DateTime theDate = new DateTime(longDate);
但這樣對於很多 VB6 程式員來說,是給他們出了一道難題,因為 VB6 中的日期型數據內部是以 Double 型表示的,將其轉換為長整型後得到的僅僅是日期,而沒有時間。如何協調這兩種日期類型呢?
System.DateTime 提供了 double ToOADate() 和 static DateTime FromOADate(double) 兩個函數來解決這個問題。前者將當前對象按原來的 double 值輸出,後者則從一個 double 值獲得一個 System.DateTime 對象。舉例如下:
private void TestDateTimeLong() {
    double doubleDate = DateTime.Now.ToOADate();
    DateTime theDate = DateTime.FromOADate(doubleDate);
    this.textBox1.Text = "";
    this.textBox1.AppendText("Double value of now: " + doubleDate.ToString() + "\n");
    this.textBox1.AppendText("DateTime from double value: " + theDate.ToString() + "\n");
}
運行結果:
Double value of now: 37494.661541713
DateTime from double value: 2002-8-26 15:52:37
10. 格式化日期型數據
編程的過程中,通常需要將日期型數據按照一定的格式輸出,當然,輸出結果肯定是字符串。為此,我們需要使用 System.DateTime 類的 ToString() 方法,併為其指定格式字符串。MSDN 中,System.Globalization.DateTimeFormatInfo 類的概述裏對模式字符串有非常詳細的說明,因此,這裡我只對常用的一些格式進行說明,首先請看下表:
d
月中的某一天
一位數的日期沒有前導零
dd
月中的某一天
一位數的日期有一個前導零
ddd
周中某天的縮寫名稱
AbbreviatedDayNames 中定義
dddd
周中某天的完整名稱
DayNames 中定義
M
月份數字
一位數的月份沒有前導零
MM
月份數字
一位數的月份有一個前導零
MMM
月份的縮寫名稱
AbbreviatedMonthNames 中定義
MMMM
月份的完整名稱
MonthNames 中定義
y
不包含紀元的年份
如果不包含紀元的年份小于 10,則顯示不具有前導零的年份
yy
不包含紀元的年份
如果不包含紀元的年份小于 10,則顯示具有前導零的年份
yyyy
包括紀元的四位數的年份

h
12 小時制的小時
一位數的小時數沒有前導零
hh
12 小時制的小時
一位數的小時數有前導零
H
24 小時制的小時
一位數的小時數沒有前導零
HH
24 小時制的小時
一位數的小時數有前導零
m
分鐘
一位數的分鐘數沒有前導零
mm
分鐘
一位數的分鐘數有一個前導零
s
一位數的秒數沒有前導零
ss
一位數的秒數有一個前導零
為了便於大家的理解,不妨試試下面的程式:
private void TestDateTimeToString() {
    DateTime now = DateTime.Now;
    string format;
    this.textBox1.Text = "";
    format = "yyyy-MM-dd HH:mm:ss";
    this.textBox1.AppendText(format + ": " + now.ToString(format) + "\n");
    format = "yy年M日d日";
    this.textBox1.AppendText(format + ": " + now.ToString(format) + "\n");
}
這段程式將輸出結果:
yyyy-MM-dd HH:mm:ss: 2002-08-26 17:03:04
yy年M日d日: 02年8日26日
這時候,又出現一個問題,如果要輸出的文本資訊中包含格式字符怎麼辦?如
format = "year: yyyy, month: MM, day: dd";
this.textBox1.AppendText(now.ToString(format) + "\n");
將輸出:
2ear: 2002, 4on下5: 08, 26a2: 26
這並不是我想要的結果,怎麼辦呢?有辦法——
format = "\"year\": yyyy, \'month\': MM, \'day\': dd";
this.textBox1.AppendText(now.ToString(format) + "\n");
看,這次運行結果對了:
year: 2002, month: 08, day: 26
可以看出,只需要使用單引號或者雙引號將文本資訊括起來就好。

C# 壓縮資料庫

壓縮資料庫
設定引用項目 Microsoft Jet and Replication Objects X.X library
using JRO;

JetEngine x = new JetEngine();
x.CompactDatabase("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\original1.mdb;",

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\aa.mdb"); 

Points of Interest

Interesting, that Jet Engine 5 is used for JET4X databases. Be careful. See the table:
Jet OLEDB:Engine Type Jet x.x Format MDB Files
1 JET10
2 JET11
3 JET2X
4 JET3X
5 JET4X

.NET中 用C#操縱IIS

using System;

using System.DirectoryServices;

using System.Collections;

using System.Text.RegularExpressions;

using System.Text;

/**

* @author 吳海燕

* @email wuhy80-usual@yahoo.com

* 2004-6-25 第一版

*/

namespace Wuhy.ToolBox

{

/// <summary>

/// 這個類是靜態類。用來實現管理IIS的基本操作。

/// 管理IIS有兩種方式,一是ADSI,一是WMI。由於系統限制的原因,只好選擇使用ADSI實現功能。

/// 這是一個遺憾。只有等到只有使用IIS 6的時候,才有可能使用WMI來管理系統

/// 不過有一個問題就是,我現在也覺得這樣的一個方法在本地執行會比較的好。最好不要遠程執行。

/// 因為那樣需要佔用相當數量的帶寬,即使要遠程執行,也是推薦在同一個網段裏面執行

/// </summary>

public class IISAdminLib

{

#region UserName,Password,HostName的定義

public static string HostName

{

get

{

return hostName;

}

set

{

hostName = value;

}

}

public static string UserName

{

get

{

return userName;

}

set

{

userName = value;

}

}

public static string Password

{

get

{

return password;

}

set

{

if(UserName.Length <= 1)

{

throw new ArgumentException("還沒有指定好用戶名。請先指定用戶名");

}

password = value;

}

}

public static void RemoteConfig(string hostName, string userName, string password)

{

HostName = hostName;

UserName = userName;

Password = password;

}

private static string hostName = "localhost";

private static string userName;

private static string password;

#endregion

#region 根據路徑構造Entry的方法

/// <summary>

/// 根據是否有用戶名來判斷是否是遠程伺服器

/// 然後再構造出不同的DirectoryEntry出來

/// </summary>

/// <param name="entPath">DirectoryEntry的路徑</param>

/// <returns>返回的是DirectoryEntry實例</returns>

public static DirectoryEntry GetDirectoryEntry(string entPath)

{

DirectoryEntry ent;

if(UserName == null)

{

ent = new DirectoryEntry(entPath);

}

else

{

// ent = new DirectoryEntry(entPath, HostName+"\\"+UserName, Password, AuthenticationTypes.Secure);

ent = new DirectoryEntry(entPath, UserName, Password, AuthenticationTypes.Secure);

}

return ent;

}

#endregion

#region 添加,刪除網站的方法

/// <summary>

/// 創建一個新的網站。根據傳過來的資訊進行配置

/// </summary>

/// <param name="siteInfo">存儲的是新網站的資訊</param>

public static void CreateNewWebSite(NewWebSiteInfo siteInfo)

{

if(! EnsureNewSiteEnavaible(siteInfo.BindString))

{

throw new DuplicatedWebSiteException("已經有了這樣的網站了。" + Environment.NewLine + siteInfo.BindString);

}

string entPath = String.Format("IIS://{0}/w3svc", HostName);

DirectoryEntry rootEntry = GetDirectoryEntry(entPath);

string newSiteNum = GetNewWebSiteID();

DirectoryEntry newSiteEntry = rootEntry.Children.Add(newSiteNum, "IIsWebServer");

newSiteEntry.CommitChanges();

newSiteEntry.Properties["ServerBindings"].Value = siteInfo.BindString;

newSiteEntry.Properties["ServerComment"].Value = siteInfo.CommentOfWebSite;

newSiteEntry.CommitChanges();

DirectoryEntry vdEntry = newSiteEntry.Children.Add("root", "IIsWebVirtualDir");

vdEntry.CommitChanges();

vdEntry.Properties["Path"].Value = siteInfo.WebPath;

vdEntry.CommitChanges();

}

/// <summary>

/// 刪除一個網站。根據網站名稱刪除。

/// </summary>

/// <param name="siteName">網站名稱</param>

public static void DeleteWebSiteByName(string siteName)

{

string siteNum = GetWebSiteNum(siteName);

string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);

DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);

string rootPath = String.Format("IIS://{0}/w3svc", HostName);

DirectoryEntry rootEntry = GetDirectoryEntry(rootPath);

rootEntry.Children.Remove(siteEntry);

rootEntry.CommitChanges();

}

#endregion

#region StartStop網站的方法

public static void StartWebSite(string siteName)

{

string siteNum = GetWebSiteNum(siteName);

string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);

DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);

siteEntry.Invoke("Start", new object[] {});

}

public static void StopWebSite(string siteName)

{

string siteNum = GetWebSiteNum(siteName);

string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);

DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);

siteEntry.Invoke("Stop", new object[] {});

}

#endregion

#region 確認網站是否相同

/// <summary>

/// 確定一個新的網站與現有的網站沒有相同的。

/// 這樣防止將非法的數據存放到IIS裏面去

/// </summary>

/// <param name="bindStr">網站邦定資訊</param>

/// <returns>真為可以創建,假為不可以創建</returns>

public static bool EnsureNewSiteEnavaible(string bindStr)

{

string entPath = String.Format("IIS://{0}/w3svc", HostName);

DirectoryEntry ent = GetDirectoryEntry(entPath);

foreach(DirectoryEntry child in ent.Children)

{

if(child.SchemaClassName == "IIsWebServer")

{

if(child.Properties["ServerBindings"].Value != null)

{

if(child.Properties["ServerBindings"].Value.ToString() == bindStr)

{

return false;

}

}

}

}

return true;

}

#endregion

#region 獲取一個網站編號的方法

/// <summary>

/// 獲取一個網站的編號。根據網站的ServerBindings或者ServerComment來確定網站編號

/// </summary>

/// <param name="siteName"></param>

/// <returns>返回網站的編號</returns>

/// <exception cref="NotFoundWebSiteException">表示沒有找到網站</exception>

public static string GetWebSiteNum(string siteName)

{

Regex regex = new Regex(siteName);

string tmpStr;

string entPath = String.Format("IIS://{0}/w3svc", HostName);

DirectoryEntry ent = GetDirectoryEntry(entPath);

foreach(DirectoryEntry child in ent.Children)

{

if(child.SchemaClassName == "IIsWebServer")

{

if(child.Properties["ServerBindings"].Value != null)

{

tmpStr = child.Properties["ServerBindings"].Value.ToString();

if(regex.Match(tmpStr).Success)

{

return child.Name;

}

}

if(child.Properties["ServerComment"].Value != null)

{

tmpStr = child.Properties["ServerComment"].Value.ToString();

if(regex.Match(tmpStr).Success)

{

return child.Name;

}

}

}

}

throw new NotFoundWebSiteException("沒有找到我們想要的站點" + siteName);

}

#endregion

#region 獲取新網站id的方法

/// <summary>

/// 獲取網站系統裏面可以使用的最小的ID

/// 這是因為每個網站都需要有一個唯一的編號,而且這個編號越小越好。

/// 這裡面的演算法經過了測試是沒有問題的。

/// </summary>

/// <returns>最小的id</returns>

public static string GetNewWebSiteID()

{

ArrayList list = new ArrayList();

string tmpStr;

string entPath = String.Format("IIS://{0}/w3svc", HostName);

DirectoryEntry ent = GetDirectoryEntry(entPath);

foreach(DirectoryEntry child in ent.Children)

{

if(child.SchemaClassName == "IIsWebServer")

{

tmpStr = child.Name.ToString();

list.Add(Convert.ToInt32(tmpStr));

}

}

list.Sort();

int i = 1;

foreach(int j in list)

{

if(i == j)

{

i++;

}

}

return i.ToString();

}

#endregion

}

#region 新網站資訊結構體

public struct NewWebSiteInfo

{

private string hostIP; // The Hosts IP Address

private string portNum; // The New Web Sites Port.generally is "80"

private string descOfWebSite; // 網站表示。一般為網站的網站名。例如"www.dns.com.cn"

private string commentOfWebSite;// 網站註釋。一般也為網站的網站名。

private string webPath; // 網站的主目錄。例如"e:\tmp"

public NewWebSiteInfo(string hostIP, string portNum, string descOfWebSite, string commentOfWebSite, string webPath)

{

this.hostIP = hostIP;

this.portNum = portNum;

this.descOfWebSite = descOfWebSite;

this.commentOfWebSite = commentOfWebSite;

this.webPath = webPath;

}

public string BindString

{

get

{

return String.Format("{0}:{1}:{2}", hostIP, portNum, descOfWebSite);

}

}

public string CommentOfWebSite

{

get

{

return commentOfWebSite;

}

}

public string WebPath

{

get

{

return webPath;

}

}

}

#endregion

}