2009-08-07 (2)
補睡了一個小時,吃了點東西,
終於拿出 Plants vs Zombies 記錄試試,
果然 mac 版的記錄就可以進去 Zen Garden 嗎?
又到了要睡覺的時間了..
What have you found for these years?
補睡了一個小時,吃了點東西,
終於拿出 Plants vs Zombies 記錄試試,
果然 mac 版的記錄就可以進去 Zen Garden 嗎?
又到了要睡覺的時間了..
Author:
Lin Jen-Shin (godfat)
at
8/07/2009 09:35:00 PM
0
retries
沒想到睡了 14 個小時左右。
睡醒後覺得還好,想起來做點事,不過躺久了之後又...
趕快爬起來之後,又...
沒胃口怎麼辦啊(苦惱)
繼續睡算了...
Author:
Lin Jen-Shin (godfat)
at
8/07/2009 01:51:00 PM
3
retries
今天是一片空白。
完。
趴在電腦前等時間到,不如先去睡好了...
Author:
Lin Jen-Shin (godfat)
at
8/06/2009 09:15:00 PM
0
retries
我發現好像滿多人對 ruby 有怨言卻不願意說... XD
不知道,不過我向來是有什麼好,有什麼壞沒什麼好隱藏的。
我實在很討厭後來才發現,原來你早知道有什麼問題,
卻沒告訴我,像是被騙上賊船似的... 偏偏好像很多人都會這樣做。
我覺得這樣實在不怎麼誠懇...
anyway.
ruby 最大的毛病就是,很多的 lib 都寫得很隨便,
除了版本間的相容問題,change log 不寫,
git/svn tag 不加,gem 不用 rubyforge release,
諸如此類一大堆......
這真的就意味著,如果你需要用很多 lib,
很可能就需要不斷測試與實驗各個版本間的相容,
而且由於沒什麼 change log, 也沒有 tag,
很可能要一個個慢慢試,甚至去看 commit history.
然後很多人解決了問題也不會放出來,
或是只把自己的放出來,也不管別人能不能用,
反正自己能用就好了。這造成了另一個嚴重問題:
無止盡的 fork...
我覺得 rails plugin 就是在加速這個問題的成長。
rails plugin 鼓勵你用開發版本,永遠更新到最新,
或是你自己維護一份你自己的版本。
上次找 tag 的支援,超瘋狂,找不到官方版本,
無止盡的 fork, 每個更新進度都不同.....
有個改了這個,有的加了那個,根本不知道要用什麼好...
拜託!不要用 github 放 gem, 用 rubyforge,
保留所有歷史版本,git/svn 記得下 tag,
change log 要寫,不要 fork 要放 patch,
不要在 lib 裡 monkey patch!!!
幸好最後這點,已經很少人這樣做了。
不過其他狀況仍然很多,仍然有很大的改進空間...
我有稍微看過 mogilefs-client 和 memcache-client 的
source code. 這兩個應該都可以算是典範之一,
雖然維護者都曾經換過,但是該有的記錄都有,
程式也沒有寫得很髒... rmagick 之類的老牌則更穩。
facebooker 就很慘了,上面提到的一堆問題他都有。
will_paginate 亦然。一開始是架在 rails 上的東西,
很多很多都有這些毛病...... 不過是有好轉的跡象啦?
希望如此 XD
*
但是如果要做什麼事,我仍然第一個會選 ruby.
原因也很簡單,寫 ruby 比寫其他的東西有趣。
寫小東西,碰到一堆毛病其實也還好,就想辦法繞掉就好了。
寫大東西,就少用點東西,全部自己刻最穩了...
這也是為什麼我後來寫了 pagify :(
不過另一方面其實是為了 datamapper.
也很可惜很多自己刻的東西,並不足以拿出來當 lib.
要拿出來當 lib, 多多少少需要一點考驗的...
而大部份的東西,寫到後來為了快,都是客製過的 :s
這樣就沒有拿出來當 lib 的價值了。
Author:
Lin Jen-Shin (godfat)
at
8/06/2009 11:25:00 AM
0
retries
updated: 哈哈,漏掉 plumm. 太平常反而會忘記。
也是很多討論。還有以前寫得超複雜的三層迴圈,
居然看得懂... 太厲害了 @@ 也常常忽然間就聽到,
又用什麼奇怪的東西完成奇怪的東西... XD
*
開機來打,避免睡一覺之後又忘了
程式路上的感謝
想睡,所以簡單說..
想先感謝高中社團的學長,是你教我 C 的基礎,
也是程式的基礎。還有一些關於社團的想法。
等等...
另兩位是社團同學,後來的社長和教學組長。
不好意思對你們一直很愧咎,從不知道什麼時候開始,
就幾乎沒有踏進社團過了。原因的話,我覺得踏進去,
就有一股沉重的氛圍撲鼻而來...
那時候我不太有辦法在下課累得要死之後,還踏入那種氣氛之中...
我也不是個能把社團當成家,在那邊吃晚餐 blah blah 等等的人。
這可能跟我沒補過習有關... 習慣在家裡渡過晚上。
其他印象很深的小事暫時不提了...
接著感謝大學同學老林 XD
從你那學到很多東西,互相討論也很愉快。
尤其是聽到一些趣事之類的... XD
可惜我不太有辦法複述一次,大部份聽過就變成一種感覺了。
中間的一點爭執,其實也不是什麼大不了的事啦...
高中同學 Jaiyalas... XD 也是互相討論。
不過更多是跟程式無關的事... XD
李老師的 flash, 名字忘記的 cygwin,
前者是我頭一次玩 oo (雖然都自己摸的,不過還有其他的)
後者是讓我後來想起來可以用 cygwin 做很多事...
reader, 雖然沒什麼交談,但你的文章讓我體會很多
也是 csse 板讓我知道其實世界是很大的..? XD
不多看多聽,有時候真的會像個笨蛋。
雖然有時候我也覺得,看太多聽太多,會失去創造力...
trade off 吧...
PsMonkey, 雖然那段時間好像滿短的,不過我覺得很愉快。
還有促成 ruby 與 plt 板等事。也能聽到一些有趣的想法。
有機會再來寫 java 吧... XD
lukhnos, b6s, ihover 那次 hackathon 很有趣,
也聽到很多東西,雖然覺得好像沒幫上什麼忙.. XD
giive, 感謝你提供的很多機會。尤其是現在的工作機會 @@
怎麼說,有點百感交集吧... XD
穆老師,Luke, 耀賢,Josh, Xoo.. 等?
同樣是大大開了眼界 XD 還有很多很多 haskell 的練習。
感到抱歉的是好像幫不了什麼忙... @@
agda 似乎完全超出我的能力了... XD
bluce, 很多 rails 和其他的心得,
雖然有時候你的語氣是讓我不太高興.. XD
只好想辦法避開一些敏感話題 @@
scrazy, 也是聽到一堆東西,尤其是架構上的事,
我完全沒概念.. XD 還有跟 ada 的討論
==
不知道有沒有漏,先列到這...
每次列這種東西就不想漏,但有的又是太小的事情
全部寫出來好像太囉嗦而失焦了
Author:
Lin Jen-Shin (godfat)
at
8/06/2009 12:12:00 AM
2
retries
#1AUImR0z (java) [ptt.cc] 這一篇文章值 567 元
順便加點註解... 引文也拿掉
作者 godfat (godfat 真常) 看板 java
標題 Re: purely functional (原 [問題] SCJP6.0)
時間 Wed Aug 5 14:52:08 2009
───────────────────────────────────────
果然出去吃個飯回來就斷線了 orz
(註:中午的事還是別寫了... XD)
p 幣看來會少很多 :s
我想 side-effect 的涵蓋範圍應該不太可能能被定義..?
如果是 side-effect 本身要怎麼定義的話,大概就是不能有 state,
然後 function/expression 本身具有感染性,只要用上任何有含
side-effect 的東西,本身就會變得具有 side-effect.
*
我覺得這個就可以去找特定的資料來看,例如 Haskell.
Haskell 本身是 purely functional, 但同樣允許 side-effect,
也可以做 IO, 因此並不是只能處理純數據的工作...
這靠 monad 來達成這件事。這是借自 category theory 的詞:
(註:monad 該怎麼解釋,好像真的是個大疑問?重點是我連自己
的想法到底對不對,都不是很確定...)
很不幸的是 XD 雖然我一直想把他讀完,不過到現在還是一直沒找到
機會把他讀完,所以細節都不是很清楚... 雖然聽說這是 haskell 裡,
會第一個碰到的障礙,甚至也有文章副標題是: "Don't Panic"
(註:希望可以找點力氣來看)
噫,我應該想辦法找時間來把這些看完的。
最早我是看 Yet Another Haskell Toturial
這篇我之前看的時候還沒寫完,很多地方是空白的,現在不知道寫完了沒?
總而言之,我可以大概提一下目前的理解。很可能有錯,就大概看看.....
跟下面的 stream 一起說好了。
*
我稍微查了一下,在 haskell 中,拿來對付類似的東西,好像大多是用
Data.ByteString.Lazy
(註:這個 ghc 已經內建了,不知道有沒有必要跟 stream 共用?)
效率好不好嘛,上面是說效率很好,有人說效率有 C 的 1/2
我覺得像是這種本身就具有大量 state 的問題,
purely functional 本身是不太可能比得贏 C 之類直接的操作啦...
這跟架構有關,在別人的地盤上,先天上就輸了不是嗎 XD
我個人覺得類似的效能評比,應該用在其他架構上,例如 distributed
最近很紅的 Erlang, 實作 CouchDB, 諸如此類從「架構上」尋求的解答。
或許沒什麼關係,不過有個類似的語言,也是寫在 JVM 上:
不過這個沒怎麼維護了的樣子?或許直接看 Erlang 即可...
回到 monad, 大抵上的概念就是我們把「狀態」視為一種值,
而每一次狀態改變,則會產生新的值,再把這個值繼續傳遞下去。
就像 Schelfaniel 在推文裡提到的:
(註:我知道他不會介意,推文就留著了 XDDD)
: → Schelfaniel:函數式語言的變數,都是不變的吧,但物件導向有可能變 08/04 20
: → Schelfaniel:也就是說,如果process1要變,變化會放在它的傳回值 08/04 20
: → Schelfaniel:像是這樣 (process2 (process1 java-object)) 取其變 08/04 20
我們假設現在的系統狀態是 X, 則兩次對螢幕輸出 Hello, World! 則可看成:
puts("Hello, World!", puts("Hello, World!", X))
而不是:
puts("Hello, World!")
puts("Hello, World!")
也就是說,puts 這個 function, 他會回傳一個新的系統狀態,假設叫 Y,
就可以看成是:
Y = puts("Hello, World!", X)
Z = puts("Heelo, World!", Y)
因為第二個 puts depend on 第一個 puts 的 return value,
也就是新的系統狀態,因此兩者的順序是不可以被顛倒的,
這邊不是兩個各自獨立的 statement, 而是一個不可分割的 expression.
haskell 的 monad 就是把這件事包裝起來。很多 IO function 的回傳
都是 IO (), 表示他是一個 IO monad.
Prelude> :t putStr
putStr :: String -> IO ()
putStr 本身是一個 String -> IO () 的 function.
來看剛剛 ByteString 的範例:
module Test where
import Data.ByteString.Lazy.Char8 as L
test = do
s <- L.readFile "/dev/zero"
-- 這邊就是把 /dev/zero 這個檔案的內容,讀到一個 IO ByteString 裡面:
-- L.readFile :: FilePath -> IO ByteString
-- 前面 IO () 是表示我們不關心這個 IO monad 究竟存有什麼狀態,
-- 比方說,我們並不關心螢幕(or remote)被輸出了什麼資料,
-- 但這邊我們關心我們讀入了什麼資料,因此是 IO ByteString
return (L.unpack (L.take 10 s))
-- 這邊從剛剛的 s 裡,讀取前面前 10 個 Char8
-- 而 L.unpack 則是把這個 ByteString, 轉成 haskell 原本的 String,
-- 也就是 [Char], 字元串列。最後再把整個結果回傳回去。
-- return 是用在 monad 裡面,他會把現在的「狀態」包起來。
-- test :: IO [Char]
-- 我們最後是回傳 String (等同於 [Char]), 因此整個 test 的結果,
-- 就是一個 IO String
main = do
s <- test
Prelude.putStr s
-- 這邊我們把 test 的結果,也就是剛剛的 IO String,
-- 存到 s 裡面,然後再把這個 s 印出來。
也就是說,monad 本身是有感染力的,只要你用到 monad,
整個 function 也會變成 monad. 要讓你的 function 不成為
monad, 只能完全避開任何的 monad, 也就是任何 IO.
接著再由其他 monad function 去使用你其他的 pure function.
這邊也可以參考 Eiffle, 在昨天 referential transparency 的連結裡:
提到 command-query separation
command 有 side-effect, 而 query 沒有,因此是 referential transparency.
這邊其實有點類似這樣的味道,像在上面的 main 裡有:
s <- test
Prelude.putStr s
但是不能簡寫成:
Prelude.putStr test
因為 test 是回傳 IO String, 而 putStr 是要吃 String 的。
透過 s <- test 把 IO String 裡的 String 抓出來,放在 s 裡,
才能把這個 s 丟給 putStr 把結果印出來。
在這邊由於使用了 do notation, 因此寫起來的感覺跟一般
imperative 的程式差不多:逐次執行,可以有 side-effect.
但實際上這其實是 syntactic 上的 sugar
看起來是一行一行的,也沒有牽涉到 state 間的轉換,是底層幫你做好了。
如果要全部自己來的話,寫起來是會很可怕,很複雜的結構,例如上面的範例:
a = do x <- [3..4]
[1..2]
return (x, 42)
會被轉成:
a = [3..4] >>= (\x -> [1..2] >>= (\_ -> return (x, 42)))
沒有人會想這樣寫程式的... XD
簡單地說,利用 monad, 我們在 pure function 的世界裡,
做出一種模擬 side-effect 的結構,然後讓你把 pure function
跟其他 side-effect 做一層切割,有點像是防火牆這樣的味道...
因此如果寫 haskell 程式只用 monad 和 do notation 的話,
感覺就沒什麼用 pure function (thus haskell) 的意義在了...
然而如果談到效率的話,當然不可能會有最底層那樣來得好。
當然是越接近機器架構會越快,這是當然的。不過這也不表示說
用這種 monad 的方式會很慢很慢,因為很顯然,大部份的時候
那些 state 根本不需要真的被 evaluate 出來,既然不需要被觀察,
這些 state 也不會影響到其他 state, 那在 compile 時,
基本上就可以完全捨棄掉。這就是最佳化要解決的問題了...
理想上當然是能把抽象化程式,依照目前機器架構,做最好的最佳化。
把所有多餘也不關心的操作都拿掉。GHC 本身就有很多很多的最佳化.. XD
==
我打太久了,不能再花時間在這上面,就暫時不校稿了...
(註:...應該挑時間寫的,不過至少稍後程式寫得很順)
--
Hear me exalted spirits. Hear me, be you gods or devils, ye who hold
dominion here:
I am a wizard without a home. I am a wonderer seeking refuge.
Sacrifice
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.128.121.85
Author:
Lin Jen-Shin (godfat)
at
8/05/2009 09:13:00 PM
0
retries
之前說要把旋轉搬到 queue 和 daemon 裡面做,
一直一直沒有做,因為覺得是個有點吃力不討好的事...
沒想到剛剛兩三下就完成了 @@
丟上去試,修掉幾個 require 和 name error 的問題,
居然就能動了耶...
會這麼意外是因為之前把縮圖從 web node 移到
queue 和 daemon 裡面,花了我非常多的時間和精神 @@
測了非常久,最後才總算確定目前的可以動,
而且應該還有一點毛病是應該修掉,暫時還沒動的。
所以預期旋轉可能也要花點時間。
不過或許是之前的經驗足了,也少掉測試 kestrel 的動作...
active mq 也確定要怎麼用,而不像一開始,丟 job 進去,
測半天才發現一定要丟 /queue 開頭才會有反應,不然
像是丟到黑洞一樣,完全沒有反應也沒有錯誤...
patch 如下 @@ 裡面有些垃圾晚點再清...
現在明明就不是用 thin 了 XD
From * Mon Sep 17 00:00:00 2001
From: Lin Jen-Shin
Date: Wed, 5 Aug 2009 17:09:26 +0800
Subject: [PATCH]
fixes #1281, now rotation is back. use only one rotator for t2
---
Rakefile | 2 +-
app/controllers/management_controller.rb | 4 ++--
app/datamapper/photo.rb | 4 ++++
app/models/photo.rb | 4 ++++
app/views/management/_management.html.erb | 3 ---
daemon/bin/rotator_stomp.rb | 16 ++++++++++++++++
daemon/rotator.rb | 20 ++++++++++++++++++++
daemon/rotator_stomp.yaml | 10 ++++++++++
8 files changed, 57 insertions(+), 6 deletions(-)
create mode 100644 daemon/bin/rotator_stomp.rb
create mode 100644 daemon/rotator.rb
create mode 100644 daemon/rotator_stomp.yaml
diff --git a/Rakefile b/Rakefile
index 00b1b48..03e7f68 100644
--- a/Rakefile
+++ b/Rakefile
@@ -151,7 +151,7 @@ namespace :my do
"resizer_stomp_#{label}"
}
- (%w[cron sync] + resizers).each{ |kind|
+ (%w[cron sync rotator_stomp] + resizers).each{ |kind|
ENV['config'] = Roodo.expand("daemon/#{kind}.yaml")
# be ware, execute ignore dependent task
Rake::Task["app:daemon:#{cmd}"].execute
diff --git a/app/controllers/management_controller.rb b/app/controllers/management_controller.rb
index 717e62a..c4a5a25 100644
--- a/app/controllers/management_controller.rb
+++ b/app/controllers/management_controller.rb
@@ -43,13 +43,13 @@ class ManagementController < ApplicationController
def photos_rotate_clockwise
each_photo{ |photo|
- photo.rotate! 90
+ photo.rotate_enqueue(90)
}
end
def photos_rotate_counterclockwise
each_photo{ |photo|
- photo.rotate! -90
+ photo.rotate_enqueue(-90)
}
end
diff --git a/app/datamapper/photo.rb b/app/datamapper/photo.rb
index f243f9c..c4a4488 100644
--- a/app/datamapper/photo.rb
+++ b/app/datamapper/photo.rb
@@ -174,6 +174,10 @@ class Photo
save
end
+ def rotate_enqueue angle
+ Queue.enqueue('rotate', "#{id}_#{angle}")
+ end
+
def create_thumbnail_original
create_thumbnail(thumbos[:original])
end
diff --git a/app/models/photo.rb b/app/models/photo.rb
index 1fa6c55..0734277 100644
--- a/app/models/photo.rb
+++ b/app/models/photo.rb
@@ -154,6 +154,10 @@ class Photo < ActiveRecord::Base
save
end
+ def rotate_enqueue angle
+ Queue.enqueue('rotate', "#{id}_#{angle}")
+ end
+
def create_thumbnail_original
create_thumbnail(thumbos[:original])
end
diff --git a/app/views/management/_management.html.erb b/app/views/management/_management.html.erb
index 73506f9..5a25e47 100644
--- a/app/views/management/_management.html.erb
+++ b/app/views/management/_management.html.erb
@@ -51,14 +51,11 @@
<% end %>
</select>
-<% if false %>
-<!-- no more rotation on multiple photos -->
<select size="1" onchange="zzz(this)" class="short_s">
<option selected="selected">旋轉方向</option>
<option value="<%= rotate_counterclockwise_path(*with_format) %>">向左旋轉</option>
<option value="<%= rotate_clockwise_path(*with_format) %>">向右旋轉</option>
</select>
-<% end %>
<select size="1" onchange="zzz(this)">
<option selected="selected">設定瀏覽權限</option>
diff --git a/daemon/bin/rotator_stomp.rb b/daemon/bin/rotator_stomp.rb
new file mode 100644
index 0000000..a6b1ebb
--- /dev/null
+++ b/daemon/bin/rotator_stomp.rb
@@ -0,0 +1,16 @@
+# encoding: utf-8
+
+require(File.expand_path(File.dirname(__FILE__) + '/../../init'))
+
+require 'daemon/rotator'
+require 'daemon/queue/queue_stomp'
+
+require 'app/datamapper/abstract/extract_config'
+
+# select environment according to web server's thin config.
+environment = Roodo.yaml_load('config/thin.yml')['environment']
+DataMapper.setup(:default, Roodo.extract_config(environment))
+
+config = Roodo.yaml_load("config/stomp.yml")
+
+Roodo::Rotator.new(Roodo::QueueStomp.new(config)).start
diff --git a/daemon/rotator.rb b/daemon/rotator.rb
new file mode 100644
index 0000000..f7f00ab
--- /dev/null
+++ b/daemon/rotator.rb
@@ -0,0 +1,20 @@
+# encoding: utf-8
+
+require 'app/datamapper/photo'
+require 'app/datamapper/photo/info'
+
+module Roodo
+ class Rotator
+ attr_reader :queue
+ def initialize queue
+ @queue = queue
+ end
+
+ def start
+ queue.start('rotate'){ |id_angle, dummy|
+ id, angle = id_angle.split('_').map(&:to_i)
+ Photo.get(id).ergo.rotate!(angle)
+ }
+ end
+ end
+end
diff --git a/daemon/rotator_stomp.yaml b/daemon/rotator_stomp.yaml
new file mode 100644
index 0000000..c14e18e
--- /dev/null
+++ b/daemon/rotator_stomp.yaml
@@ -0,0 +1,10 @@
+---
+pid: tmp/pids/daemon.pid
+log: log/daemon.log
+chdir: /home/photos
+servers: 1
+user: photos
+group: photos
+ruby: ruby
+script: daemon/bin/rotator_stomp.rb
+args:
--
1.6.3.3
Author:
Lin Jen-Shin (godfat)
at
8/05/2009 05:40:00 PM
0
retries
回來的路上,和昨天晚上都想了一堆有的沒的,
有些還蠻想打出來的... 不過真奇怪,坐到電腦前,
就會開始發呆(呆)
上一個是在想下午看到的莫名其妙的漫畫裡的遊戲,
簡單地說就是暴力者贏,結束。
經過一段時間,在回來的路上才開始想這件事,
在想個體與族群之間的關係,族群或許可以看成一種個體等等...
bah, 不重要,只是走在路上不知不覺就會開始想起事情,
以致於常常很多認識的人從旁邊經過,我卻渾然不覺。
又搞不好,只是我不想去拍別人的肩,因此養成這種習慣?
昨天晚上是在想什麼倒是想不起來了。
大多都只是很簡短的一兩句話,嗯,
好像還有對留言裡的 "Why So Serious?" 有反應吧?
哈哈... 真的是 why so serious
不過要真想刻這種東西,那更是 why so serious 的諷刺了...
還有一些 database normalize 和 denormalize 的心得
想得起來的是這些,不過又累又懶,連 soma bringer
打開打了一下,覺得新技能組用得不是很順手,
覺得好累又關掉了(呆)
呃,我也確實是不斷在找理由(呆)
搞不好是因為這樣才會變這樣的。
但尋找原因和經過,本來就一直是我的習慣
不要太執著,說是這樣說,想是這樣想...
但具體上到底要怎麼做?(呆)
在想要怎麼做本身,不也就太執著,這樣好諷刺 XD
於是最後就會開始覺得,看來隨緣才是一切吧(遠目)
那個誰誰,居然給我打(一起看)
害我覺得一整個可愛 XDD
沒看過這種反應的 XD
soma bringer ost 第二三片也還沒聽完
移動時,audiofire 2 + er4s, 缺點就是 er4s
會導致聽不到旁人的聲音,這很造成困擾 :s
但是攜帶 ms-pro 的話,這漏音有點嚴重,
我怕打擾到其他人,而且這樣簡直是攜家帶眷似的 XDDD
因此還在考慮,就變成很少有機會聽音樂了...
bah 我詞窮了
end
updated: 更正,我要保留 map.resources, 因為大多都用得上
全部改用手寫的 routes generator 後,
下一個步驟是把 named routes 全部拿掉看能不能動
接著幹掉 route helper, 這是拿來 monkey patch
rails 的 named routes 用的。
再幹掉 map resources, 一律用手寫的 routes 去對應,
最後修改 in_place_editing, 不要用 default routes...
最後的最後,default routes 就可以拿掉了,可喜可賀。
這樣就不會看到一堆莫名其妙的 action...
寫大網站,千萬別用 rails routes 啊
fancy 的東西還是留給玩具用吧
p.s. 還有不要用 with_options 了,hash merge 才是王道
Author:
Lin Jen-Shin (godfat)
at
8/04/2009 10:58:00 AM
0
retries
深深覺得自己是個白痴
深深覺得自己被當成笑話
不過不知為何,沒有像以前那樣激動
或許只是因為事情很多吧..
沒有意識到,原來那篇沒貼出來,怪不得找不到
Author:
Lin Jen-Shin (godfat)
at
8/04/2009 01:52:00 AM
官方網站
Tokyo Cabinet
之前在 datamapper mailing list 上看到的,
發現最近有個 ruby binding (透過 ruby ffi) 釋出 1.0
rufus-tokyo
試了一下,感覺不錯。
用 Tokyo Cabinet 可以當 sqlite3 那種 file store,
再用 Tokyo Tyrant 可以做 server 存取,很單純。
裡面還一堆雜七雜八的,可能要花點時間看,
各 table store, b+ tree store, hash store 等等...
趕快丟掉 RDBMS 吧 XDXD
有機會想試寫 datamapper adapter,
之前有人說要寫,不過寫很少,而且快一年沒動靜了...
事實上 datamapper 是以 RDBMS 為基礎發展的沒錯,
不過我覺得只要不要用太多 relation 之類的東西,
應該是有可以嘗試的地方,因為我覺得 datamapper 介面很方便...
比方說,可以快速把 RDBMS 的 data 透過 datamapper,
快速 dump 到 Tokyo Cabinet, 然後當成某種 cache.
p.s. 安裝很容易,sudo port install tokyocabinet
(不支援 windows ~~~ get a real OS!! XD)
gem install rufus-tokyo
他讀 .so (.dylib) 檔,所以不需要 tokyocabinet 也能灌 rufus-tokyo
Author:
Lin Jen-Shin (godfat)
at
8/03/2009 10:42:00 PM
0
retries
soma bringer 裡面主角講了好幾次 XD
稍微爬了一下文,大部份的人是說 soma bringer 劇情老梗,
那麼跟我的猜想就差不多了... 不過也看到有人說,其實劇情不錯,
在第六章開始劇情就會明朗化,前面就有點混亂...
well, 雖然很多人覺得我看(聽)不懂玩(聽)屁啊
不過對我來說有時候真的是感覺對了就好,沒什麼關係
各人各有各自的解讀,自取所需即可。
曾經看過有人說當作品完成後,那作品就不會再是原本作者的。
我不同意這種說法,我認為作品理所當然仍然是原作者的,
他有權對他的東西做任何修改與調整。
我覺得比較恰當的說法是,每個人心中都有一套 fork :p
then use it at your own risk
唔,一直是這樣,也不是想說對太執著有什麼辯解 :s
方向與事情的不同,我想不該混為一談
無奈倒是一直會想起這件事,足見... :s
但換個角度,也許想爽就不會想了... orz
小時候不斷會期望有 feedback,
不過要得到 feedback, 對我而言,似乎是一件非常困難的事
更遑論希望別人給 feedback, 更是會造成很多很多的困擾
於是也漸漸不再期待能有什麼 feedback,
有的話也只當意外的驚喜(雖然不一定是喜)
其實也沒什麼影響。
想做喜歡做的還是會做,只是三分鐘熱度更嚴重而已...
覺得有點累的就不會考慮再做,只是另一個未完成的遺憾
也許是好事吧
Author:
Lin Jen-Shin (godfat)
at
8/03/2009 07:23:00 PM
0
retries
i love this
manyd: 再忙,也要跟你玩小遊戲!!
*
想說 soma 打好久了休息一下,不過一靜下來就..
但也想把剛轉好檔的 soma bringer ost 聽完
總不能邊聽 ost 邊打遊戲吧 XD
或是說看能不能遊戲音樂關掉,只留音效?
還是去睡算了?
Author:
Lin Jen-Shin (godfat)
at
8/02/2009 11:02:00 PM
8
retries
第四章結束 ~ 正式升到 Rank 4, 來記錄一下目前狀態。
放在最後好了,先講別的。原本隊友都是帶聖騎士,
Rank 2 那個有快速補 SP 的支援技能,超強... 完全用不完。
雖然他使用的時機很怪,有時候就是偏偏不放,只好猛吃藥水 @@
然後第二個隊友帶法師,個人因素 XD
不過打到後來,有些敵人,甚至是第三章的英靈,
一定得換成肉搏的,不然擋不住敵人...
打英靈和冰龍就換上看起來最壯的大叔,HP 也最高。
其他時候就隨意... 看看其他角色用起來如何這樣。
不過剛剛才注意到,其實 Rank 3 的聖騎士超威的啊 XDD
放的支援居然是魔法攻擊強化,原本閃電傷害約 1200,
buff 一下去會跳到 1600! 原本要電兩下的小敵,變成一下就清掉了。
再加上其實現在 SP 超過 800, 本來就用不太完,
用完就跳回城鎮補滿再回來,又可以撐好幾張地圖...
因此乾脆就換成 Rank 3 聖騎士,然後換回法師 XD
Rank 4 的法師打人也滿痛的,又換成冰魔法,
會用凍結、丟冰塊、 Frost Nova... 靠,連技能都抄 Diablo 2...
可惜好像沒看到他放古代魔法。
古代魔法真的強到有點誇張,好幾次還沒放完魔王就趴了...
倒是上面寫不能共用不知道是什麼意思?我明明每個古代魔法都裝了 XD
真想知道我現在用的這隻,讓電腦操作會用什麼技能.....
跑劇情時也很無言,像路人一樣 XDDD
在講話的幾乎都是隊長和男女主角...
這遊戲這樣做其實還滿怪的 XD 進入戰鬥也只有三個人,
其他人是怎麼消失的,對話還會再跑出來 XD
這點可以的話還真希望做得合理些,例如仍然會出來幫忙打一下...
不然感覺真的很怪,真不知道到底誰才是隊長 XD
Lv 33
HP 820
SP 852
腕力 13
魔力 115 (132)
體力 25
器用 16 (28)(敏捷之類的)
攻擊力 右 18
攻擊力 左 0
防禦力 40
基本命中 49
迴避 9
攻擊速度 131%
移動速度 112%
火抗 5%
水抗 5%
風抗 20%
土抗 35%
光抗 5%
暗抗 5%
技能第一頁:
X 閃電 消費 30 傷害 1360
A 古代 土 消費 44 傷害 434
B 古代 水 消費 44 傷害 750
Y 古代 風 消費 57 傷害 1063
技能第二頁:
X 土盾 消費 9
A 古代 火 消費 44 傷害 860
B 補血 單 消費 10
Y 補血 圈 消費 16
技能是裝三個加技能的裝備,所以最低技能是 4 級
火:
古代 4, 魔法會心攻擊 23
水:
古代 4, 單補 4, 圈補 4
風:
古代 17, 連鎖 23, 閃電 23, 風技術 23
(根本就是 Diablo 2 的 Mastery...)
土:
古代 4, 加速補 SP 4, 土盾 4
物品:
X 空
A 單補 SP
B 魔法石,補 HP+SP
Y 單補 HP
Author:
Lin Jen-Shin (godfat)
at
8/02/2009 09:42:00 PM
0
retries
ソーマブリンガー 特典 ミニサントラCD付き
原來還有一片特典 CD 喔... 買一下好了 XD
不過記錄能轉移嗎? @@
記得聽說特典才能選那個一開始不能選的角色...
欸電腦的好處就是轉移容易啊。記錄在卡匣上不知道怎麼轉移...
重打是休想 = =
要的話順便進貨好了... XD 之前都是 TODO 在 phpbb 上
這邊有一部份: CDCD!!
還有一些記在別的地方,跟其他東西混雜在一起就不弄出來了。
30minutes night flight 這個的 CD?
nico 三則 (2) 裡的 坂本真綾 ユニバース(高画質版)
先記這樣,一時沒想到其他的。
第三章應該也快打完了。越打越覺得其實這真的是 Diablo 2 的 clone...
一樣的點:
1. 傳送點(waypoint)與城鎮傳送(town portal)
2. 任務進行方式,一次一個
3. 存檔離開,敵人全部重生
4. 物品屬性全部隨機(藍、黃、綠)
5. 但還是有一些獨特(unique)的物品(紅)
6. 物品掉落也是隨機的
7. 每個裝備都有洞,可以塞寶石,寶石等級 1~3 或 1~5
8. Act 0~6 huh? 連章節用語都一樣。
9. 全破繼承之後可以選難度?Nightmare + Hell?
10. 隊友,算傭兵?(henchman)
11. 隊友死掉的話,用錢復活
12. 每個職業技能樹不同,每次升級有基本能力和技能點
13. 不過 Soma Bringer 比 Diablo 2 友善得多,技能可以亂點
14. 死了留下墳墓,重新回戰場拿回來可以取回經驗值...
15. 存檔不記錄地點,讀檔一律重城鎮開始(不過存檔不會離開,
這點也是比 Diablo 2 還要來得友善得多)
16. 每次都會撿一堆垃圾回來賣
17. 但累積一堆錢也不知道要幹嘛... Guild Wars 至少還是有用的
18. 各種屬性都有抗性,靠裝備加
19. 藥水都慢慢補的
20. 族繁不及備載
不同的點:
1. 地圖不是隨機的
2. 地圖一開始就幫你畫好,各種重要的東西全部都先標上了
3. 角色間的物品可以交換
4. 撿垃圾不用怕拿不動,可以傳送至倉庫...
5. 倉庫裡的東西可以直接賣掉
6. 隊友可以選模式(前、中、後),也可以選技能組
7. 族繁不及備載
簡單地說,這款遊戲真的跟 Diablo 2 沒什麼兩樣...
但是比 Diablo 2 還要來得友善很多,而且介面設計得很好!
算是個玩起來滿輕鬆的遊戲吧... 沒打過 D2 可以試試。
打過的話,嗯,音樂很好聽.. XD
但其實我也有點膩了,因為地圖越來越大,
重複的音樂就越來越多了...
而且這種遊戲都會陷入一種困境,就是打久真的很空虛。
你會發現你一直在重複做差不多的事情...
玩到後面會像傀儡一樣,你會感覺不到 RPG 應有的劇情...
因為整個流程會搞得非常制式化,就像一關一關的關卡。
其實我已經有點不耐煩了 O_o
不過 Rank 4 的技能還沒看到,再怎麼樣也要先打到那 ~
*
為何不做個 Guild Wars clone 算了?(敲碗)
不過 GW 技能很多,做起來可能比較複雜?
Author:
Lin Jen-Shin (godfat)
at
8/02/2009 01:07:00 AM
0
retries
反正也沒什麼好看的 XDD 早就如此。
雖然剛開始時我是覺得滿不錯的。
只是後來不斷 loop 就失去耐心,更別提後面根本暴走。
其他的少年格鬥漫也半斤八兩。
如今只有鋼鍊值得期待,也有評論的意義..
要批評還真的至少得要有點愛啊。
就算是因為浪費了很多時間在不爽,
會去浪費時間這件事本身多多少少就有點愛了...
有時候這種事真的是一體兩面啊。
我沒有在影射什麼 XD
Author:
Lin Jen-Shin (godfat)
at
8/01/2009 04:23:00 PM
0
retries
打到第二章了 @_@
其實本來只想看看長什麼樣子而已,
因為實在很懶得打很花時間的 RPG, 近幾年,
再加上日文看不懂,那感覺很討厭啊...
不過音樂太好聽 O_Q
搭上一些畫面,感覺有點昔日 Chrono Cross 的樣子啊
光田很久很久沒有作出特別讓我感興趣的音樂,
Soma Bringer 應該是這幾年來,覺得比較滿意的一個吧?
雖然其實我也不是很確定還聽過哪些........
總覺得光田也是個怪人,會替什麼遊戲配樂,
還滿不一定的... 想想,連第七封印,台灣的遊戲,都參一腳
再看看其他的遊戲,我幾乎沒有一個是聽過的... XD
到現在也還不知道箱の庭到底是什麼鬼遊戲... XD
反之大多數的作曲者,應該都很固定吧?
例如梶浦就配了一堆 Seed 的... 大多我也沒啥興趣 XD
因為給我很 jpop 的感覺,我對所謂「動漫 OP/ED」興致也不高。
當然這是平均而言,像電腦線圈的 OP/ED 我就都滿喜歡的。
扯遠了,總之不知不覺就一直打下去了 XDDD
其實中間在寫 friendly_format 啦,上一篇在講的。
那時候好像差不多剛把第零章打完。
friendly_format 寫完之後才繼續打,就一路打到第一章結束了。
怎麼說呢,雖然日文看不懂,但漢字很多,片假名也很多。
如果念出來能夠想像到某個英文字,那就看得懂了 XD
劇情感覺也滿單純的,大概就古代遺跡,神秘種族,
神秘力量,有惡勢力想取得神秘力量之類的...
當然啦,對話看不懂,很可能都是搞錯。
但看劇情發展感覺就差不多是這樣。
雖然這讓我想到可笑的銀髮的阿基(米)德... XD
不過是想到前面,曾讓我覺得好像不錯的那段。
除此之外大概是 ICO 吧,但不是那麼陰森...
基本上還是山山水水的。
所以感覺是滿傳統的日式 RPG.
*
一開始要選角色,有點愣到,挑了好久,
原本有點想選個魔武雙修的 XD
不過最後還是決定選魔力最高的角色。
嗯,最高的不能選,那選次高的好了。
接著是選職業(class)...
既然都選魔力型了,當然也沒啥理由選其他職業了!
再來還要選武器,不過法師看來只有拐杖可以用 XD
還有,那劍大到太噁心了啦,怎麼可能拿得動,拿得動,
又怎麼可能能保持平衡... 幸好不可能選劍,不用煩惱這個。
*
結果不能用魔法,只能用拐杖敲人 XD
當然敲不太痛,而且自己會一直被打到,
於是乾脆全部交給隊友出招。兩個隊友都是肉搏的,
看起來是六人(去掉一開始被玩家選掉的)中隨便挑出的兩人?
打了好一陣子之後總算可以用魔法了,
技能點數可以亂配,也隨時可以記錄,
地圖傳送又到處都是,後來錢又根本用不完...
應該算是滿甜的遊戲吧。敵人也不強。
一開始覺得系統好像滿複雜的,不過大概還是脫不出那幾個型。
漢字搭配一點嘗試,不用多久差不多就能掌握所有系統了。
就差那一堆狀態我搞不太懂有什麼差就是了。
*
結果沒想到第零章結束時,一開始不能用的角色就登場了 XD
也不奇怪啦,哪有可以選七人,只有一人隱藏的道理?
要真隱藏,一開始就不應該讓玩家看到了。
不過也沒想到才沒打多久,也就可以讓他上戰場了 XD
於是我現在的配置是,玩家當然就是法師,
再讓這隻看起來像女主角的隱藏角色登場,也是法師,
最後就是拿槍的魔武雙修角色? XD
因為他會補血魔法,又是肉搏的。
10 級後,還可以用補 SP 的技能,簡直是...
魔法亂轟都沒關係 XD 把閃電點滿,
一發帳面上就 750, 連 boss 都劈一下就快趴了 XD
不過可能是那隻特別弱,後來的要連發才打得死。
只是呢,原本 boss 都要打一小段時間,有閃電之後幾乎全秒殺 XD
Rank 1 的魔法和 Rank 2 的也差太多了吧?
很難想像 Rank 3 會有多強?不過現在升級很慢了,
或許還要很長一段時間吧。只是我以為這個 Rank,
是要接受什麼訓練,或是任務才可以提昇的,
沒想到看來是每 10 級就會自動加一級。
*
其實後來遊戲我幾乎都選法師,可能跟之前打 Dungeon Siege
有關。因為 Dungeon Siege 的戰士,幾乎從頭到尾只能砍砍砍,
沒啥變化.... 好在 Guild Wars 完全不是這樣 XD
對 Dungeon Siege 真的超失望的。
*
另一方面,打完第一章進入第二章,也隨時可以回第一章。
現在 RPG 真的是越做越給玩家方便了 ~~
我想應該是好事吧?
==
不知道要不要也打 Xenosaga I+II ... XD
啊 Plants v.s. Zombies 記錄還沒試 @@
真好能打發時間的東西真多...
Author:
Lin Jen-Shin (godfat)
at
8/01/2009 04:26:00 AM
0
retries