Friday, March 30, 2007

 

Akina - After Half A Year

Akina@四四南村
半年前左右的我參加了Akina的外拍活動
那是我第二次的DCView外拍
只有用Tamron A16一顆鏡頭
因為Akina的表情、動作比一般模特兒豐富太多
所以狂照了1072張
選了72張用Photoshop的Camera Raw修了修放上Flickr
其中interestingness、favorite最高的是下面這張
Akina
我個人最喜歡的是這張 (但其實現在看起來也不是說很滿意)
IMG_0127


Akina@城市舞台
半年後左右的我又參加了Akina的外拍活動
這是我第八次的DCView外拍
用了Tamron A16Canon 85mm f/1.8兩顆鏡頭
因為Akina的表情、動作還是比一般模特兒豐富太多
所以狂照了418張
同樣選了72張用Photoshop Lightroom修了修放上Flickr
其中interestingness、favorite最高的是下面這張
Akina
我個人最喜歡的是這張 (現在看起來也是很滿意)
Akina


這半年來的攝影應該是沒有白學了吧!

Labels: , , , ,


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: , , ,


Friday, March 23, 2007

 

Five Years Ago...

五連拍之其一

五連拍之其二

五連拍之其三

五連拍之其四

五連拍之其五


一直都想要找時間把很久很久以前的照片都放在Flickr上整理一下
就可以讓我的家人、朋友們想到時
有個地方去回憶一下自己從前的蠢樣子
看看自己與別人這些年來改變了多少
雖然現在放上去的只是我電腦中所有舊照片的冰山一角
還不夠讓人拿來寫成一本自傳或是成長史
不過我會再找時間慢慢放的

今天放的是五年前我大一時
趁著寒假全班去阿里山班遊的照片
其實那時數位相機不是很普遍
很多我的舊數位照片都沒有把時間調準
造成後來很難去對照到底是什麼時候照下
這個set是難得有記得先調準時間的

那時候用的是跟我爸借來的Konica Minolta Q-M200
也是我用過的第一台數位相機
只有一百萬畫素
配上我那時去FNAC買快要一千塊的64MB CF卡
就可以讓我隨便亂照好幾百張
這個習慣的養成其實也讓我視用底片照相是種較為奢侈的行為

雖然現在我的相機比當時好很多了
可以照出更漂亮的照片、更美的人物景色
雖然現在我的記憶卡比當時大很多了
可用近似機關槍掃射的速度一秒內連拍好幾張
這樣照個上千張也不是問題
但我再也無法照出五年前那個比現在年輕五歲的我與當時的朋友們
一看到心裡就會浮現出那段無憂無慮的年代

Labels:


Thursday, March 22, 2007

 

Worker Object Creation Pattern

這是拿AspectJ in Action8.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: , , ,


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:


Sunday, March 11, 2007

 

Higher Than My Home

101大樓


今天從Page One逛完走出來Taipei 101門口時
聽到有個小鬼仰望著101
然後跟他爸說:「爸,這棟比我們家還高耶!」

那時我心中產生了很多聯想
小鬼頭說的絕對是實話
在小孩子的視野中
任何的建築物應該都很高
看到101覺得高不稀奇
但是會拿來跟自己家比較我倒是第一次聽見
所以...說不定他家住很高...就這樣子


Monday, March 05, 2007

 

Celebrity Look-alikes

My Celebrity Look-alikes

My Celebrity Look-alikes

My Celebrity Look-alikes

My Celebrity Look-alikes

My Celebrity Look-alikes

My Celebrity Look-alikes

My Celebrity Look-alikes

My Celebrity Look-alikes

My Celebrity Look-alikes


傳一張照片上去
它就可以分析你像是哪個名人喔~
超有趣的
有些人是我想都沒想過的呢!
有flickr的人一定要來玩玩看!

Labels: