08/10/31
Ikariam 的農夫攻略
Travian 是我開始玩的第一款 Browser Game。不是當狼的料, 所以玩 Travian 的結果就是不怎麼樣...最後就是不玩了...。後來改玩 Ikariam 後, 由於加入的算是早, 所以積分一直都還算是不錯, 所以就給他一直玩下去。從最早的 3000 多名, 現在已經晉升到 100 名內了。
由於玩 Travian 的結果很慘, 所以對於 Web Game 的玩法一直不太有信心。不過玩了這幾個月的 Ikariam 後, 名次不斷前進, 表示策略應用得宜。所以就來分享一下我的攻略。
Browser Game 最簡單的方法區分職業, 就是狼跟羊。我還是不知道怎麼做一隻大狼。只能做做下階層的清道夫...清理 i 羊。所以這篇的攻略主要是針對想要做一個武裝農夫的策略。如果你是一隻狼, 部分邏輯是相通的, 但是部分是相衝突的。
在開始正式說明前, 先說明一下 Ikariam 的狀況。如果玩家有稍微注意一下, 目前遊戲的版本是 0.2.7。也就是目前還是 Beta 版試玩階段啦。很多的建築物、機制都還沒有開放。所以在可見的 2008 年結束, 我相信不可能變成正式版。這段時間你打算好要怎麼做好準備, 在下一個階段開始時可以有機會拿到好位置呢?
首先, 就先來討論一下軍事的部分 (這要是被我的盟內將軍看到, 大概會想要殺了我...)。在 Ikariam 其實一般來說是很和平的。因為有太多的方法可以降低狼的興趣了。所以, 你為什麼要花大量的硫磺及黃金去養兵呢!! 所以我建議的兵力及總分比是不超過 1%。也就是如果總分是 1 萬分, 不能有超過 100 分的軍事。這部分的影響是黃金。黃金太重要了, 因為運輸船要很多錢; 買資源要很多錢。另一個觀察你兵力是否太超過了, 是檢視你所有城的黃金收入是否太少。如果有 5 個城, 每小時收入小於 3000, 就真的應該要好好檢視一下為什麼了。(例外狀況: 地區極不穩定或被狼盯上)
其次, 討論一下假期這東西。假期這東西就是不要開就對了啦。為什麼要開假期...怕狼來搶, 那就給他搶呀。一般來說, 如果 4 城大約會有 400 個科學家。開 2 天的假期損失差不多 2 萬的研究點數。如果更多的科學家, 或是開更多天呢? 我寧可被搶 5 萬的貴資源, 也不願損失 2 萬的研究點數。原因很簡單, 後期的升級資源以倍數成長的, 隨便就是 10 萬的資源。想要省, 就要靠研究。(例外狀況: 離開非常久會有被刪帳號的可能)
再來, 討論一下資源的重要性。資源共有六種:黃金、木頭、大理石、水晶、葡萄、硫磺。簡單的二分為資本財及消費財。資本財有木頭、大理石、水晶, 就是你蓋下去會轉成分數, 除非你去拆它, 不然分數就是你的。黃金、葡萄、硫磺是消費財, 葡萄吃下去就沒有了; 硫磺生兵會有很高的分數沒有錯, 但是只有一次的分數, 兵被殺了, 分也沒有了, 還會影響黃金的收入。所以, 我的原則很簡單, 除非你的資本財多到爆, 要被搶, 或是任何可能會讓你失去它的原因, 不然絕不拿出去交換或是賣了。而葡萄、硫磺就可以視情況去交換或是出售。
最後, 談研究, 目前 Beta 版的狀況, 在還沒有新的建築出來以前。最重要的就是研究、研究與研究。寧可花費大量的資源升 17 級, 18 級 甚至 19 級的學院。要很多資源, 請一定要忍痛升下去。後期想要贏, 想要逆轉成功, 研究一定是關鍵。
初級的應用就先寫到這了, 未來有空再來寫一個進階的應用。
08/10/30
瓶蓋打不開怎麼辦
是說, 小時候如果家中發生了打不開蓋子時, 要不就是大家輪流比誰力氣大。要不然就是開始敲瓶蓋。也有一些人會建議用塑膠水管繞在瓶蓋上用力旋扭。打火機燒蓋子之類的。
不過我們做什麼事都要「優雅」, 對吧。想像你穿的美美的, 因為打不開蓋子, 需要弄的面紅耳赤, 或是拿一條塑膠水管嗎...
不管是鎖太緊、壓力、熱漲冷縮。只要用一點點科學的方法, 就可以優雅的打開來喲。
首先用一個小容器裝一點點熱水, 將 "瓶蓋" 的部分放進去。大約 5 秒後, 就可以輕鬆轉開來了。因為瓶蓋通常是金屬材料, 而瓶身多是玻璃。而金屬的熱漲冷縮反應較明顯, 就會讓瓶蓋變的大一點點。雖然只是很小的一點點, 但是已經足夠打開蓋子了。
附帶一提, 玻璃的部分盡量不要弄到熱水。因為玻璃的延展性不夠, 接觸太熱的水, 有可能會讓玻璃破掉喲。
再附帶一提, 如果是保特瓶打不開, 用這方法的功能就不太大啦。找一條較粗糙的布, 或是紙張也可以。套在上面轉, 增加摩擦力, 一樣可以用比較輕鬆的方式轉開來喲。
最後, 介紹一個必殺技......請身邊的朋友幫忙開。
08/10/29
CSS 的優先順序
網頁編輯的時候, 現在常常會大量使用到 CSS Style 的方式。一般我們常見的方式有三種:
2. 在 header 加入 style, 像下面這樣
3. 直接在 html tag 中加入 style
如果我們都只選用了一個方法, 那問題就很簡單了。但如果我們同時用了上述三種方法, 並且都針對同一個屬性設定時, 到底 css 會如何判斷使用那一個呢。
答案是 3 -> 2 -> 1。簡單的說, 就是愈晚被讀取, 優先性就愈高。
下面舉一個簡單的例子, 大家可以自己試著去改改看就知道結果了。
首先, 建一個 my.css 檔
再建一個 my.htm 檔
<head>
<title>Title</title>
<link href="my.css" rel="stylesheet" type="text/css" />
<style type="text/css">
p {color:#00ff00;}
</style>
</head>
<body>
<p style="color:#0000ff;">文字</p>
</body>
</html>
所以上面的例子結果是 文字。
另一個棘手的問題來了。有時我們用 include 的方式或是在 head 中加入 style 中的部分屬性是不希望因網頁中其他的設定而改變。有時候更要進到每一頁去找可能衝突的設定。這時可以利用 ! important 來讓優先權變高。
使用的方法就是直接加在屬性的後面。例如我們現在把 my.css 改一下變成這樣:
重新執行上面例子的結果就會變成 文字。
08/10/24
每項顯示 3 筆細目的查詢
星期天是家人聚會的日子, 老爸與哥哥一家及哥哥多年的朋友到家中來打麻將。哥哥的朋友在工作上遇到一個 SQL 查詢的瓶頸, 說要順便來問我。朋友一到, 就開始想解決方法。又是翻書又是直接連上 SQL Server 測試, 一時腦塞竟然完全沒有辦法想出方法。
最後, 老爸無聊的受不了, 趕緊先陪著打麻將再說。問題就被丟到九霄雲外去了。直到晚上 8 點多, 突然想到一早洗的衣服還沒有晾, 才跑到後陽台去晾衣服。突然閃過朋友的問題還沒有解決。沒有想到解答也隨著問題一起來了。真是踏破鐵鞋無覓處, 得來全不費功夫。
| 客戶 | |
| PK | 客戶編號 |
| 客戶姓名 | |
| 統一編號 | |
| ... | |
| 訂單 | |
| PK | 訂單編號 |
| 客戶編號 | |
| 產品 | |
| ... | |
需求是要列出所有的客戶, 及最多三筆該客戶訂單。
select a.客戶編號, a.客戶姓名, a.統一編號, b.訂單編號, b.產品, ...
from 客戶 as a left outer join 訂單 as b on a.客戶編號 = b.客戶編號
select a.客戶編號, a.客戶姓名, a.統一編號, b.訂單編號, b.產品, ...
from 客戶 as a left outer join 訂單 as b on a.客戶編號 = b.客戶編號 where b.訂單編號 in (select top 3 訂單編號 from 客戶 as c where c.客戶編號 = a.客戶編號)
也許還有人有更好的方法, 也歡迎提出來喲。
可能大家會覺得我能力也太差了吧, 連這點小問題都沒有辦法在第一時間找出解決方案...不過, 能力差歸能力差啦。就像電影「當幸福來敲門」裡的一段話。
"I'm the type of person...
...if you ask me a question,
and I don't know the answer...
...I'm gonna tell you that I don't know.
But I bet you what.
I know how to find the answer, and I will find the answer.
Is that fair enough?"The Pursuit of Happyness 當幸福來敲門
結論就是, 有時候工作上遇到瓶頸, 到處走一走動一動換換心境有時候比留在原地鑽牛角尖來的好。像我在公司如果突然有什麼地方邏輯不通、流程不順、寫不出來, 我就會起身去上個廁所伸展一下。往往回到位子上麻煩就解決了。
08/10/17
Google 化 (Googlization)
2008 年 4 月號的「數位時代 Business Next」雜誌的主題是「讓年薪增加 20 倍的 Google 達人煉金術」。內容提到許多全世界最大搜尋引擎公司提供了許多免費又實用的東西。除了原本就已經非常強大的搜尋引擎外, 其他如空間超大的 Gmail, 網路分析 Analytics, 網站管理員 Webmasters 等一堆服務。而最重要的是, 這些都是免費的。
幾年前與另外二個親友一起組個小工作室。說是小工作室, 其實並不知道營利的來源是什麼。所以一開始只是把這個小工作室當成是一個 Lab 在玩。我負責架伺服器。另一美編負責設計工作室的網頁。另一個人負責營運管理。每個人僅出資 2500 元。
一開始沒有什麼錢, 所以很多東西都要用 "免費" 的。像是...ㄜ...泡麵。最初使用的 Email 伺服器是大陸開發的 CMailServer。整體來說是還不錯用啦。以小型組織來說算是很足夠了。不過那時取得的版本最多 25 人。並且只能單一 Domain。後來也真的找到一些客戶要用 Email。所以就改用 Merak Mail Server。更改的過程不太容易, 新舊的資料也不通, 常常要想辦法幫其他的使用者從舊資料轉到新 Server 上。功能上就強很多了, 支援無限個 Domain、無限個使用者、更完整的設定...。唯一的缺點就是他是泡麵版, 有一些無解的狀況...。
先前就想要轉換到 Google 應用服務上。不過實在很怕轉換的代價。所以遲遲不敢動。看了「數位時代」後, 決定放手搏一搏...舊信的轉換當然還是很不方便啦, 不過可以利用設定 DNS 的方式, 輕鬆解決轉換的問題。Gmail 還有一個非常好用的地方, 就是可以當網路硬碟。只要搭載一個外掛後 (例如 GMail Drive shell extension), 就可以上下載 20 MB 的檔案。也解決了像我們這樣小型團體需要的異地備份功能。
Google 還有很多好用的功能, 像是 Docs, 可以直接在線上使用類似 Word, Excel, PowerPoint 等。泡麵真的可以慢慢少用一點了。
現在很多的事情都變的只需要瀏覽器加上網路就可以完成。Google 在今年推出了自己的瀏覽器 Chrome, 9 月份瀏覽器的市場上大約 3% 左右。我想未來 Google 出自己的作業系統, 以最精簡的架構, 只需搭載 Chrome 瀏覽器應該是可以期待的事。並且, 最令人期待的是「免費」...。
08/10/9
ASP 清除 HTML tag 全記錄...
那時候很笨...技巧也很差...所以就寫出了一個像是這樣的 "東西"...
第一代
for i = 1 to len(str)
if right(left(str, i), 1) <> "<" then
if j = 1 then
if right(left(str, i), 1) = ">" then
j = 0
end if
else
str = str & right(left(str, i), 1)
end if
else
j = 1
end if
next
看了這段程式, 就可以知道有多笨了吧。最可怕的地方是這個的迴圈執行次數是隨字串的長度來增加的。以一篇 500 字的文章來說好了。加上 HTML code 後, 長度變成 1000 很正常。有些用戶還直接貼 word 檔。可能變成 2000 個字元。而列表頁的需求是一頁顯示 10 筆資料。所以平均每頁要跑 10000 ~ 20000 左右的迴圈。網頁的效率有多差, 可想而知。想像一個頁面要開 1~2 分鐘, 有多少人會等...
終於, 連我自己都看不下去了。所以大約半年後, 新學了一個 instr 就現學現用, 寫出了比較像樣的程式。
第二代
a = 1
b = 2
while a <> b
a = InStr(1, str, "<")
if a <> 0 then
b = InStr(a, str, ">")
if b <> 0 then
str = left(str, a - 1) & right(str, len(str) - b)
else
str = left(str, a - 1)
end if
else
b = a
end if
wend
第二代的效率就好很多了, 一樣是用迴圈做, 不過迴圈執行的次數取決在 HTML tag 的數量。一樣以 500 字的文章來說, 就算從 word 貼過來, 也不會超 100 個 tag 吧, 一頁 10 筆迴圈執行次數只要 200~800 次就完成了。整體執行效率提升了至少 15 倍。一個網頁開 60 秒跟開 4 秒的差別。成績算是很不錯了吧。後來又過了一年吧, 發現其實還有更好的方法。於是寫出了...
第三代
Function ReplaceRegExp(strString, strPattern, strReplace)
Dim RE: Set RE = New RegExp
With RE
.Pattern = strPattern
.IgnoreCase = True
.Global = True
ReplaceRegExp = .Replace(strString, strReplace)
End With
End Function
str = ReplaceRegExp(str, "<[^>]*>", "")
第三代有二個重點:
1. 重覆使用: 寫成 function 了, 可重覆使用
2. 效率更高
有人說寫程式是一種藝術, 我覺得這樣說有點 "太超過"。不過, 肯定是一門需要不斷學習鑽研的專業技術。這篇看起來應該可以算是一個程式設計的笑話吧。希望有一天我可以變成正面的教材...哈。
08/10/4
Ikariam 遊戲 Diors 盟旗
有在玩 Ikariam 遊戲, 並且在 s1 服務器的, 請記得來加入 Diors 喲。
黑色背景版
<embed loop="true" menu="false" quality="high" width="400" height="180" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" src="http://www.taiwanngo.tw/uploadfile1/Diors_black.swf"></embed>
Gif 版

白色背景版
<embed loop="true" menu="false" quality="high" width="400" height="180" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" src="http://www.taiwanngo.tw/ad/Diors.swf"></embed>
Gif 檔

08/10/3
escape、encodeURI 與 encodeURIComponent 的比較
很多情況下, 我們需要將資料傳送到別的網頁, 都需要先將資料編碼後送出。由於使用者輸入的資料千奇百怪, 如果沒有編碼, 很可能在接收頁面就出現錯誤。尤其在現在的網站幾乎都大量運用 Ajax, 使用 Ajax 來傳值幾乎是家常便飯。所以這三個 javascript 的 method 就一定要知道如何運用及使用時機了。
一般情況下, 最好選擇 encodeURIComponent()。
以下就簡單說一下差異點:
方法一: escape()
不編碼的符號包括: @*/+
escape 不編碼 + (加號), 將使表單欄位資料中有空白的處理(用 + 連結字串)造成問題。且 escape 在處理非 ASCII 語系的字元會有問題。所以, 除非特例, 應盡量避免使用 escape()。
方法二: encodeURI()
不編碼符號包括: ~!@#$&*()=:/,;?+'
用 encodeURI() 會比使用 escape() 轉換 URI 正確。比較要注意的是這個方法不處理 ' (單引號)。
方法三: encodeURIComponent()
不編碼符號包括: ~!*()'
encodeURIComponent() 是適合大部分單一 URI 的編碼方法。這個方法通常可以正確的編出正確的編碼, 例如要編碼一段有 flash 的 html(參數有 & 符號), 如果用其他的方法, 大概解碼後 flash 也不能看了。比較要注意的是這個方法也不處理 ' (單引號)。
奇怪, 我總是一開始都用了最不合適的方法。最早的時候我開始處理 encoding 我就用 escape(), 不過 escape 在 utf-8 的網頁中, 很容易就會出錯。後來就改用 encodeURI(), 沒有想到就又遇到要傳有 & 符號...終於, 最後用了 encodeURIComponent()。不過, 從錯誤中也可以學習到很多的東西。















