Friday, March 30, 2007
Akina - After Half A Year
Akina@四四南村
半年前左右的我參加了Akina的外拍活動
那是我第二次的DCView外拍
只有用Tamron A16一顆鏡頭
因為Akina的表情、動作比一般模特兒豐富太多
所以狂照了1072張
選了72張用Photoshop的Camera Raw修了修放上Flickr
其中interestingness、favorite最高的是下面這張
我個人最喜歡的是這張 (但其實現在看起來也不是說很滿意)
Akina@城市舞台
半年後左右的我又參加了Akina的外拍活動
這是我第八次的DCView外拍
用了Tamron A16與Canon 85mm f/1.8兩顆鏡頭
因為Akina的表情、動作還是比一般模特兒豐富太多
所以狂照了418張
同樣選了72張用Photoshop Lightroom修了修放上Flickr
其中interestingness、favorite最高的是下面這張
我個人最喜歡的是這張 (現在看起來也是很滿意)
這半年來的攝影應該是沒有白學了吧!
Labels: Akina, me, photo, photography, 小貓
Monday, March 26, 2007
Paper Note: FormCreationAspect.aj
原本在Execution Code裡面需要跟使用者取得資料時
會產生一個Form物件
並且把一些跟目前Activity有關的資料塞進去這個Form中
如此才能夠讓Form正確地submit回來
public class ActivityExecutionCode extends ActivityExecutionCode {
public void call(Message reqMsg) {
...
Form form = new Form("Activity Form");
form.add(new HiddenField("action", "FormSubmit"));
form.add(new HiddenField("pid", reqMsg.get("pid")));
form.add(new HiddenField("aName", reqMsg.get("aName")));
form.add(new HiddenField("taskId", reqMsg.get("taskId")));
form.add(new Label("message", "Message"));
form.add(new TextField("message", ""));
form.add(new LineBreak());
form.add(new Button(Button.ButtonType.SUBMIT, "Send"));
Message result = form.submit();
String message = result.get("message");
...
}
}
但其實我們不想讓寫Execution Code的設計者管這些其實跟本身Execution Code邏輯無關的東西
所以我們用FormCreationAspect來讓它自動塞入資料
public aspect FormCreationAspect {
pointcut formCreation(Form form): initialization(Form.new(String)) && target(form);
pointcut activityCall(Message reqMsg):
execution(public void ActivityExecutionCode+.call(Message)) && args(reqMsg);
after(Form form, Message reqMsg):
formCreation(form) && cflowbelow(activityCall(reqMsg)){
// action=FormSubmit
form.add(new HiddenField("action", "FormSubmit"));
// pid={pid}
String pidString = reqMsg.get("pid");
if (!ParamUtil.noValue(pidString)) {
Long pid = Long.parseLong(pidString);
form.add(new HiddenField("pid", "" + pid));
}
// aName={aName}
String aName = reqMsg.get("aName");
if (!ParamUtil.noValue(aName)) {
form.add(new HiddenField("aName", aName));
}
// taskId={taskId}
String taskId = reqMsg.get("taskId");
if (!ParamUtil.noValue(taskId)) {
form.add(new HiddenField("taskId", taskId));
}
}
}
原本的Execution Code就變成下面這樣
少了原本塞資料的四行程式碼!
public class ActivityExecutionCode extends ActivityExecutionCode {
public void call(Message reqMsg) {
...
Form form = new Form("Activity Form");
form.add(new Label("message", "Message"));
form.add(new TextField("message", ""));
form.add(new LineBreak());
form.add(new Button(Button.ButtonType.SUBMIT, "Send"));
Message result = form.submit();
String message = result.get("message");
...
}
}
Labels: aop, aspectj, java, note
Friday, March 23, 2007
Five Years Ago...
一直都想要找時間把很久很久以前的照片都放在Flickr上整理一下
就可以讓我的家人、朋友們想到時
有個地方去回憶一下自己從前的蠢樣子
看看自己與別人這些年來改變了多少
雖然現在放上去的只是我電腦中所有舊照片的冰山一角
還不夠讓人拿來寫成一本自傳或是成長史
不過我會再找時間慢慢放的
今天放的是五年前我大一時
趁著寒假全班去阿里山班遊的照片
其實那時數位相機不是很普遍
很多我的舊數位照片都沒有把時間調準
造成後來很難去對照到底是什麼時候照下
這個set是難得有記得先調準時間的
那時候用的是跟我爸借來的Konica Minolta Q-M200
也是我用過的第一台數位相機
只有一百萬畫素
配上我那時去FNAC買快要一千塊的64MB CF卡
就可以讓我隨便亂照好幾百張
這個習慣的養成其實也讓我視用底片照相是種較為奢侈的行為
雖然現在我的相機比當時好很多了
可以照出更漂亮的照片、更美的人物景色
雖然現在我的記憶卡比當時大很多了
可用近似機關槍掃射的速度一秒內連拍好幾張
這樣照個上千張也不是問題
但我再也無法照出五年前那個比現在年輕五歲的我與當時的朋友們
一看到心裡就會浮現出那段無憂無慮的年代
Labels: me
Thursday, March 22, 2007
Worker Object Creation Pattern
這是拿AspectJ in Action裡8.1 The worker object creation pattern中程式碼修改過的進化版本
我加了Annotation與Java 5新的Concurrent API
public @interface AsynchronousExecution {
}
=============================================================================
public class CachePreFetcher {
@AsynchronousExecution
static void fetch() {
System.out.println("Fetching in thread " + Thread.currentThread());
}
@AsynchronousExecution
static String fetchValue() {
System.out
.println("Fetching Value in thread " + Thread.currentThread());
return "fetchValue";
}
}
=============================================================================
public class ProjectSaver {
@AsynchronousExecution
static void backupSave() {
System.out.println("Saving backup copy in thread "
+ Thread.currentThread());
}
}
=============================================================================
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public abstract aspect AsynchronousExecutionAspect {
public abstract pointcut asyncOperations();
public abstract pointcut asyncValueOperations();
private static final ExecutorService exec = Executors.newCachedThreadPool();
public static void shutDownExecutorService() {
try {
exec.awaitTermination(10, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
System.err.println(e);
}
exec.shutdown();
}
void around(): asyncOperations(){
Runnable worker = new Runnable() {
public void run() {
proceed();
}
};
exec.execute(worker);
}
Object around() : asyncValueOperations(){
Callable<Object> worker = new Callable<Object>() {
public Object call() {
return proceed();
}
};
Future<Object> future = exec.submit(worker);
Object result = null;
try {
result = future.get();
} catch (Exception e) {
System.err.println(e);
}
return result;
}
}
=============================================================================
public aspect SystemAsynchronousExecutionAspect extends
AsynchronousExecutionAspect {
public pointcut asyncOperations():
call(@AsynchronousExecution void *.*(..));
public pointcut asyncValueOperations():
call(@AsynchronousExecution * *.*(..));
}
=============================================================================
public class Test {
public static void main(String[] args) {
CachePreFetcher.fetch();
String value = CachePreFetcher.fetchValue();
System.out.println("CachePreFetcher.fetchValue() returns " + value);
ProjectSaver.backupSave();
AsynchronousExecutionAspect.shutDownExecutorService();
}
}
Labels: aop, aspectj, java, pattern
Wednesday, March 14, 2007
Flickr New Layout And Collections
Flickr今天生了兩個新功能出來囉!
其一是你個人首頁的版面配置
可以有小照片、大照片 + 不顯示、顯示Set、顯示Collection等六種排列組合
我選的是Medium + collections
Size Does Matter!
我是那種喜歡看大張圖片的人
之前我最想要Flickr改進的功能就是用全頁面照片來放映slideshow
而現在個人首頁
也只有個人首頁能夠用Medium尺寸來放照片
感覺還有蠻大的改進空間
畢竟用什麼尺寸來顯示照片這檔事
會用Flickr API寫程式的人都弄得出來
而新功能之其二:Collections
就讓我眼睛比較亮了
通常如果一張照片是人像或是風景
我都會加上tag
但是用tag顯示照片的介面不如Set那樣可以經過排序整理
因此要選一些比較滿意的照片放到Set中
或依主題、或依時間、或依不同的人等等因素
導致Set數量暴增是像我這樣愛整理照片的Flickr使用者的通弊
Set數量太多就導致主題分散
別人也很難瀏覽他想要看的的東西
Collection可以說是這種現象的解藥
但從另一種觀點來看
也可以說是提供另一種powerful的工具讓我們更加瘋狂地整理照片...
像我一樣會寫程式的人
聽到Collection一定不會陌生
Collection就是種容器的概念
容器是拿來裝東西用的
你可以說Flickr原本就有提供的Set是種用來裝單張照片的Collection
而今天Flickr所提供的Collection
有稍微玩過的人會知道其實它還分為兩種
一種是專門裝Set的Collection
另一種是專門裝Collection的Collection
並不存在那種又能裝Set又能裝Collection的Collection (所以說Flickr不是用Composite Design Pattern來實作的?)
你可以用它來建一個五層的Collection樹狀結構
依照一般人分類照片的情形
通常一兩層應該就夠用了
會分到五層的...我還真想去看看他是怎麼分的~
我目前已經就現有的Set建了一些Collection了
也有很多人開始討論怎麼應用這個新功能來做更有意義的分類
像是什麼美女分類、Show Girl分類等等的...
如果有什麼其他分類的方式、意見
也可以跟我分享一下囉 :)
但最近我連加照片title、description、tag都快沒時間啦...
等我有空會再好好整理的...
延伸閱讀:
Labels: flickr
Sunday, March 11, 2007
Higher Than My Home
今天從Page One逛完走出來Taipei 101門口時
聽到有個小鬼仰望著101
然後跟他爸說:「爸,這棟比我們家還高耶!」
那時我心中產生了很多聯想
小鬼頭說的絕對是實話
在小孩子的視野中
任何的建築物應該都很高
看到101覺得高不稀奇
但是會拿來跟自己家比較我倒是第一次聽見
所以...說不定他家住很高...就這樣子