Wednesday, September 30, 2009
2009-10 Wallpaper
感覺很快地2009年過了四分之三
像移軸世界一樣
除了我所專注的視線外
不分前後左右都是模模糊糊地
與周圍的人事物之間的連結顯得很鬆散
似乎從小就是這樣
很不容易與人熟識卻又很快生疏
聽說蕭邦四首敘事曲中降A大調的第三號有著這麼樣的故事:
有位騎士在湖畔邊邂逅了一位正妹
因為那正妹太正了所以這騎士馬上向她求婚
正妹就說:「若三天後你的對我的愛依舊不變,我便答應你的求婚。」
騎士隨即立下誓言暫別離去
翌日夜裡騎士可能太心急還是怎樣又再度來到湖邊
這時他又遇見了另一位正妹
而且比昨天的妹更正
騎士為之心動,立即上前追隨想要搭訕
只見那正妹慢慢走向湖中
騎士也尾隨著她走到湖心
剎那間那正妹變成昨天騎士求婚過的正妹的模樣
斥責騎士之背誓,轉眼消逝無蹤
這時月白風清的夜晚
卻突然狂風怒號波濤洶湧
騎士就這麼樣死在湖裡
Labels: calendar wallpaper, me, photography, 月曆, 桌布
Tuesday, September 29, 2009
XML Encryption with Apache XML Security
這幾天在弄這個東西搞得很煩不過還是弄好了
所以在這裡記錄一下以免之後忘掉還是怎樣
很奇怪他library裡面對於encryption與decryption附的sample code
是用secret key(symmetric key)加密內容後再用另一把secret key加密那把secret key
然後傳來傳去的就是那把secret key
我不是很了解其中的原因
所以把它改成我知道比較ok的方式就是
使用public key加密那把加密內容的secret key
傳過去後再用自己的private key解開
但這小小的變更卻是麻煩的開始
之前總是出現一些奇怪的Exception像是
org.apache.xml.security.encryption.XMLEncryptionException: decryptElement called without a key and unable to resolve
或是
javax.crypto.BadPaddingException: Given final block not properly padded
不過弄了幾天後
在我下面這個例子裡面是沒有出現啦~
首先是我拿來測試用的XML檔案
swanky.xml
<?xml version="1.0" encoding="UTF-8"?>
<Test>
<Name>Swanky Hsiao</Name>
<Blog>http://swanbear.blogspot.com/</Blog>
<Flickr>http://www.flickr.com/photos/swanky-hsiao/</Flickr>
<Plurk>http://www.plurk.com/swanky</Plurk>
<Facebook>http://www.facebook.com/swanky</Facebook>
<FacebookFansGroup>http://www.facebook.com/pages/0e801f0a/172447000328</FacebookFansGroup>
</Test>
然後用keytool產生keystore
輸入後除了一開始要你指定key的密碼是打password之外都可以亂打
keytool -keystore swanky.keystore -genkey -alias swanky-key -keyalg RSA -keypass password
XML檔案跟keystore準備好後就可以測試了~
我這裡是都寫在一個class裡面方便使用!
除了可以直接用encryElement()指定要加密的Element外
也可以像我這例子裡面放多個xpath進行多個Element的加密
import java.io.CharArrayWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.xml.security.encryption.EncryptedKey;
import org.apache.xml.security.encryption.XMLCipher;
import org.apache.xml.security.keys.KeyInfo;
import org.apache.xml.security.utils.EncryptionConstants;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
public class ApacheXMLSecurityTest {
static {
org.apache.xml.security.Init.init();
}
static private String keystoreName = "swanky.keystore";
static private String keystorePassword = "password";
static private String keyAlias = "swanky-key";
public static void main(String[] args) {
Document doc = parseXML("swanky.xml");
String[] xpaths = new String[] { "Test/Plurk", "Test/Facebook" };
encryptXPaths(doc, xpaths);
System.out.println("Encrypt:\n" + serialDoc(doc));
decryptDoc(doc);
System.out.println("Decrypt:\n" + serialDoc(doc));
}
public static Document parseXML(String uri) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document doc = null;
try {
DocumentBuilder docBuilder = factory.newDocumentBuilder();
doc = docBuilder.parse(uri);
} catch (Exception e) {
e.printStackTrace();
}
return doc;
}
public static Writer serialDoc(Document doc) {
CharArrayWriter writer = new CharArrayWriter();
OutputFormat format = new OutputFormat(doc);
format.setLineWidth(65);
format.setIndenting(true);
format.setIndent(2);
XMLSerializer serializer = new XMLSerializer(writer, format);
try {
serializer.serialize(doc);
} catch (IOException e) {
e.printStackTrace();
}
return writer;
}
public static void encryptXPaths(Document doc, String[] xpaths) {
try {
for (int i = 0; i < xpaths.length; i++) {
String xpath = xpaths[i];
NodeList list = evaluateXPath(doc, xpath);
for (int j = 0; j < list.getLength(); j++) {
Node node = (Node) list.item(j);
Element element = (Element) node;
encryElement(doc, element);
}
}
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
private static NodeList evaluateXPath(Document doc, String expression)
throws XPathExpressionException {
NodeList nodes;
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile(expression);
Object result = expr.evaluate(doc, XPathConstants.NODESET);
nodes = (NodeList) result;
return nodes;
}
public static void encryElement(Document doc, Element element) {
try {
SecretKey symmetricKey = generateDataEncryptionKey();
XMLCipher xmlCipher = XMLCipher.getInstance(XMLCipher.AES_128);
xmlCipher.init(XMLCipher.ENCRYPT_MODE, symmetricKey);
PublicKey pubKey = getKeyStore(keystoreName, keystorePassword)
.getCertificate("swanky-key").getPublicKey();
XMLCipher keyCipher = XMLCipher.getInstance(XMLCipher.RSA_v1dot5);
keyCipher.init(XMLCipher.WRAP_MODE, pubKey);
EncryptedKey encryptedKey = keyCipher.encryptKey(doc, symmetricKey);
KeyInfo keyInfo = new KeyInfo(doc);
keyInfo.add(encryptedKey);
xmlCipher.getEncryptedData().setKeyInfo(keyInfo);
xmlCipher.doFinal(doc, element, true);
} catch (Exception e) {
e.printStackTrace();
}
}
static KeyStore getKeyStore(String keyStoreFileName, String password) {
KeyStore store = null;
try {
store = KeyStore.getInstance("JKS", "SUN");
InputStream in = new FileInputStream(keyStoreFileName);
store.load(in, password.toCharArray());
in.close();
} catch (Exception e) {
e.printStackTrace();
}
return store;
}
private static SecretKey kek;
private static SecretKey generateDataEncryptionKey() {
if (kek == null) {
try {
String jceAlgorithmName = "AES";
KeyGenerator keyGenerator = KeyGenerator
.getInstance(jceAlgorithmName);
keyGenerator.init(128);
kek = keyGenerator.generateKey();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
return kek;
}
public static Document decryptDoc(Document doc) {
try {
XMLCipher xmlCipher = XMLCipher.getInstance();
xmlCipher.init(XMLCipher.DECRYPT_MODE, null);
PrivateKey privateKey = (PrivateKey) getKeyStore(keystoreName,
keystorePassword).getKey(keyAlias,
keystorePassword.toCharArray());
xmlCipher.setKEK(privateKey);
NodeList list = doc.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_ENCRYPTEDDATA);
while (list.getLength() > 0) {
Node node = (Node) list.item(0);
Element encryptedDataElement = (Element) node;
xmlCipher.doFinal(doc, encryptedDataElement);
}
} catch (Exception e) {
e.printStackTrace();
}
return doc;
}
}
執行結果是像這樣的
Encrypt:
<?xml version="1.0" encoding="UTF-8"?>
<Test>
<Name>Swanky Hsiao</Name>
<Blog>http://swanbear.blogspot.com/</Blog>
<Flickr>http://www.flickr.com/photos/swanky-hsiao/</Flickr>
<Plurk>
<xenc:EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Content" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:EncryptionMethod
Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"/>
<ds:KeyInfo>
<xenc:EncryptedKey xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:EncryptionMethod
Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"/>
<xenc:CipherData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:CipherValue xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">n0VFmIo5y+Ra+0Qnd0zQIbNK2N8QuLz6rQAd2UgHKjfLnhjAzFy9lX+wpcLdk31F5zvxw+G4yFKt
VFZaQn7/bW1tOUoHmoepdIZ9ZsQHWS7NZRsaKUjaLjIj777Rt5paCQUGOhI6yf7QyPh+zGkUwoPI
lbIyZeEXO9w6MjetnI0=</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedKey>
</ds:KeyInfo>
<xenc:CipherData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:CipherValue xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">Vo/J6LhCT8wA8ohdgo0g2CgmDnFznQ/hz3GkpMxJZu5ELTA6Paj+FVR9hgEicDSg</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</Plurk>
<Facebook>
<xenc:EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Content" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:EncryptionMethod
Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"/>
<ds:KeyInfo>
<xenc:EncryptedKey xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:EncryptionMethod
Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"/>
<xenc:CipherData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:CipherValue xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">OY5WBZW/aFssBJ/ZaHkSo+UncYCQF/fdnOnLsXrZBZVtKKvfVZkVEMzKNYmtdquqZKcOd5FYfet7
3SW7P6GNEhuTGPmA3L/+tlKroONg50ATe6HBb5CbkPhArfDJmtEu8zvQCxOkXUACO3KCYc2RQ7/g
Ri3BH+q3M9YLpDT/GVE=</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedKey>
</ds:KeyInfo>
<xenc:CipherData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:CipherValue xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">8UufIfFlEUXHhQ+l1owFOq1m/MDEW+4Psn/kCqY5Y2RDLWRZu7smOPfveYUAJmJA</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</Facebook>
<FacebookFansGroup>http://www.facebook.com/pages/0e801f0a/172447000328</FacebookFansGroup>
</Test>
Decrypt:
<?xml version="1.0" encoding="UTF-8"?>
<Test>
<Name>Swanky Hsiao</Name>
<Blog>http://swanbear.blogspot.com/</Blog>
<Flickr>http://www.flickr.com/photos/swanky-hsiao/</Flickr>
<Plurk>http://www.plurk.com/swanky</Plurk>
<Facebook>http://www.facebook.com/swanky</Facebook>
<FacebookFansGroup>http://www.facebook.com/pages/0e801f0a/172447000328</FacebookFansGroup>
</Test>
Labels: code, encryption, example, java, security, XML
Monday, September 21, 2009
2009-08-30 果子@華山藝文中心+西門町
前一篇跟大家分享了我新買的移軸鏡
現在就來分享一下我用移軸拍的果子吧!
雖然我覺得我買的這顆45mm標準焦段對於拍人像來說有點尷尬
要廣不廣要遠也不遠的
不過也正因如此我要拿它來拍全身、半身、特寫都很OK
下面就依據我最近用的情形
分別對Tilt、Shift、Rotate這三種功能提供一些個人意見~
Tilt功能可以讓鏡頭往左往右轉一些角度
藉此扭曲一般人對於正常鏡頭對焦成像的看法
普通鏡頭對到焦之後會有個平面是清楚的
記得我一開始學習使用DSLR時
有個有點拗口難記的東西就是「光圈越大(光圈數值越小)、景深越淺」
但這種景深因為跟你與鏡頭面對的方向一致所以很直覺可以用距離的遠近來判斷
可是用了移軸鏡的Tilt就不一樣了
這個畫面中對到焦而顯得清楚的平面會因為你轉了Tilt旋鈕而有了個角度
所以你可以在下面的照片中發現到有些照片果子的臉是清楚的同時
後面某個遠遠的背景也一樣很清楚
有時候背景很亂的時候反而是一種困擾!
必須要特別注意所有入鏡東西的畫面~
Shift功能會把整個鏡頭往上或往下平移
我到目前還沒有去深入了解這功能的成像原理
只知道對於拍人來說
轉動這個Shift旋鈕會讓身體的比例變得跟原來不一樣
就算是用輕微的俯角來拍攝
還是可以把腿的比例拉得很長
這下子終於能夠了解到為什麼那麼多牛仔褲廣告的女明星腿的比例跟現實狀況不太一致了!
不是用修的就是用移軸鏡拍的~
Rotate功能簡單地說就是把Tilt跟Shift做個旋轉而已
搭配Tilt可以讓對焦清楚的平面做個旋轉
像是拍橫幅人像時因為人是直的可以直接拍
但拍直幅人像時由於鏡頭要跟著轉個九十度
若要Tilt一樣的效果就必須把鏡頭Rotate個九十度
跟Shift搭配也是以此類推
不過這顆鏡頭的Rotate是以45%為一個單位來固定~
最後由於我也才拿移軸鏡拍過兩次人像
只能得出一個要點就是「至少要把眼睛對到焦」
其他的就隨緣吧! XD
下面也挑一些照片來分享我第一次全部用移軸鏡拍的外拍囉~
另外特別放送廣告工商時間!
果子Facebook粉絲專頁已經開張了!!!
歡迎大家加入~!!!
Labels: beauty, lens, mikako, photo, photography, 外拍, 果子, 正妹, 移軸鏡, 美女, 華山藝文中心, 西門町, 鏡頭
Monday, September 07, 2009
Canon TS-E 45mm f/2.8 新鏡入手!
其實是上上個禮拜去億華買的
買之前有做了一些研究
因為想要拍出一些比較特別的效果
所以決定買下這顆鏡頭!!!
但在之前想要先描述一下我目前的器材概況
我之前有下面這三顆鏡頭可以在5D2上面使用
Tamron 28-75mm f/2.8 A09是我最常用的一顆
之前用30D時是以A16當作主力,升級成5D2之後自然就是換這顆當主力!
從小廣角到小望遠都很好用
28mm可以拿來自拍或是拍風景
35mm、50mm、75mm都很適合用來拍人
也因為如此而導致我現在很少帶我之前用30D的另一顆Canon 85mm f/1.8
只有要求景深特別淺或是一定要大光圈時才會拿出來用
Canon 70-200mm f/4.0 L IS小小白是今年六月買的
真的是很棒的一顆鏡頭
四級的防手震配上5D2的高ISO可以讓我在很暗的地方拍照
而且因為夠長所以不太會被人查覺而能拍出很自然的照片
加上之前因為我那顆85mm的關係
很習慣用135mm的焦段拍人物
其實A09加上這顆小小白就可以拍超多東西
這兩顆鏡頭還是2009鏡頭年鑑中五顆星評價的超值鏡頭!!!
我買東西向來都是覺得夠用就好
原本是打算買一顆蔡斯50mm的手動鏡玩玩
但想想我有了A09,可能並不是真的很必要
若是想拍出比較不一樣的東西
Canon TS-E 45mm f/2.8更值得我去玩玩,而且也同樣是手動的!
說明書上是這樣子介紹它
Canon's TS-E lenses are tilt-shift lenses designed for EOS cameras. The tilt-shift mechanism enables photographers to control the depth of field and the area photographed and to correct image distortion, making it possible to take sophisticated pictures that cannot be shot using a conventional lens.關於移軸鏡的詳細技術其實我到現在也不是很清楚
什麼改變焦平面、光軸之類的術語很難用容易理解的方式向大家解釋
有興趣可以看看Wiki上面的Tilt-shift photography、別人寫的移軸鏡攝影(Tilt-shift photography)
還有移軸技術常使用的建築攝影領域
現在Canon有的移軸鏡頭有下面四款
17mm f/4 L、24mm f/3.5 L II、45mm f/2.8、90mm f/2.8
評估了一下我常拍照的主題還有我自己的習慣
最後還是選擇了45mm
它具有tilt、shift、rotate三種功能
這顆也是魚住純一在他的美女寫真攝影訣竅完全解說中常使用的鏡頭
用它來拍全身人像時,可以使用shift技術來修飾模特兒的身型
關於shift的功能我還在摸索當中...
我現在只對tilt與rotate功能比較能夠運用
下面也零零散散分享一下我找到的相關資訊~
使用移軸鏡的大師首當日本的本城直季 Naoki Honjyo
可以把景物拍得像是模型般真的很妙
有一家叫做Lensbaby的公司也有出一種很特別的移軸鏡
有興趣可以看一下486的介紹
比較便宜但功能以及畫質也反應在價格上
幾年前我去日本秋葉原有見過
看起來還真的蠻好玩的
台灣楔石攝影怪兵器有在賣但我其實沒有去那裡逛過
當然萬能的PS也可以用後製的方式達到類似的效果
事實上目前Flickr上或是線上找的到的移軸照片
有大多數都是用後製的!!!
不會用PS也沒關係
最令人開心的免錢方式大概就是下面這些網站的功能
TiltShift maker與這個窮人的移軸鏡,線上移軸後製-TiltShift Generator
我自己是沒玩過,請想玩的自己去試試...
用它來拍人的話我下一篇再介紹
下面先給大家看看我買這顆鏡頭當天回家時隨手拍拍的照片~ :)
Labels: lens, photography, 移軸鏡, 鏡頭
Wednesday, September 02, 2009
2009-08-23 果子白色圓舞曲x黑色執念@陽明山竹子湖
今年的鬼月是因為日蝕的緣故特別恐怖嗎?
據說是這場拍完後果子出去玩就出車禍了
還提到了小安的夢境、剛維修好的車故障、原本要同行的朋友被老鼠咬
一連串的事件讓這件事顯得更加詭譎
不過幸好最後平安無事了
然後這次外拍iMage 01站方有想個主題
早上是白禮服、下午是黑禮服
我就突發奇想可以試著拍一次全都是黑白照的作品!
然後這個故事是這樣子的...
古老的音樂盒 似乎隱藏著不可思議的力量
好像是這股力量在驅使我 我慢慢的上緊發條
當柔和的弦律響起 我的身體不自覺動了起來
原來
它等到了最重要的缺件...
(文案by iMage01)
昏暗的森林中 我注意到遠方的燈火
那是 傳說中的精靈嗎?!
她徘徊在這裡 不知道有多少日子
卻一直找不到 那個屬於她的東西
是不是一定要完成這個執念
她才會回到原來的地方...
(文案by iMage01)
還有個花絮是早場要結束時轉圈圈最後一次錄的~
大家的快門聲真是驚人...
Labels: beauty, mikako, photo, photography, 外拍, 果子, 正妹, 竹子湖, 美女, 陽明山