JAVA端:
byte[] iv = new byte[]{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
private String encrypt(String plaintext, String key){
String ret ="";
try{
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec spec = new SecretKeySpec( key.getBytes(), "AES");
cipher.init( Cipher.ENCRYPT_MODE, spec, paramSpec);
byte[] encryptData = cipher.doFinal(plaintext.getBytes());
ret = ByteTransfer.toHex(encryptData);
}
catch (Exception e)
{
e.printStackTrace();
}
return ret;
}
Silverlight端:
private string decryptAES_Silverlight(string encryptedContent)
{
string AES_key = MY_KEY;
byte[] iv = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
string decryptedContent = "";
byte[] b_encryptedContent = HexStrToByteArray(encryptedContent);
AesManaged aes = new AesManaged();
aes.BlockSize = 128;
aes.KeySize = 128;
aes.Padding = PaddingMode.PKCS7;
aes.Key = UTF8Encoding.UTF8.GetBytes(AES_key);
aes.IV = iv;
ICryptoTransform decryptTrans = aes.CreateDecryptor();
MemoryStream decryptStream = new MemoryStream();
CryptoStream decryptor = new CryptoStream(decryptStream, decryptTrans, CryptoStreamMode.Write);
decryptor.Write(b_encryptedContent, 0, b_encryptedContent.Length);
decryptor.FlushFinalBlock();
//解密後的byte[]
byte[] decryptBytes = decryptStream.ToArray();
decryptedContent = UTF8Encoding.UTF8.GetString(decryptBytes);
return decryptedContent;
}
Note:
1. 看起來JAVA的預設應該是使用Rijndael,不需要設定Initialization Vector;只是Silverlight端不支援Rijndael,而AES的另一個class - AESManaged卻必須設定IV,為了配合在Silverlight使用AESManaged類別,所以在JAVA加密端也要加入IV的設定。
2. Cipher.getInstance()內若不傳入參數,預設應該是AES/ECB/NoPadding;AES/CBC/PKCS5Padding的設定是為了配合Silverlight端,因為AESManaged只能用CBC mode;至於padding的部分,因為要加密的資料不一定會是16 bytes的倍數,padding就少不了了,JAVA端設定PKCS5,C#端相對的必須設定PKCS7,這兩個mode運作方式在此情況下是一樣的。
3. JAVA端的String.getBytes()若不指定Encoding,預設應該為UTF-8或ISO-8859_1(此處看來是UTF-8),在silverlight端必須將Key以及解碼結果的byte陣列也做UTF-8的編碼處理。
4. HexStrToByteArray、ByteTransfer.toHex()方法均為另外寫的十六進位陣列轉換。
2013年7月30日 星期二
2013年6月3日 星期一
程式Memo - C# HTTP POST
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(Url);
ASCIIEncoding encoding = new ASCIIEncoding();
String postData = "data";
byte[] data = encoding.getByte(postData);
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.ContentLength = data.Length;
Stream reqStream = webRequest.GetRequestStream();
reqStream.Write(data, 0, data.Length);
HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
string responseStr = new StreamReader(response.GetResponseStream()).ReadToEnd();
ASCIIEncoding encoding = new ASCIIEncoding();
String postData = "data";
byte[] data = encoding.getByte(postData);
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.ContentLength = data.Length;
Stream reqStream = webRequest.GetRequestStream();
reqStream.Write(data, 0, data.Length);
HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
string responseStr = new StreamReader(response.GetResponseStream()).ReadToEnd();
2013年1月30日 星期三
系統Memo - Silverlight Player影片起始載入問題
為了這個DRM專案被Silverlight搞了好久,菊花都痛了。
自行開發的Silverlight player一直有個問題,就是載入影片"有時候"會卡住,player狀態就停在manifest_ready和media_open中間不上不下。其實困擾有一大半都來自這個"有時候"出現的錯誤,說一是一說二是二程式有錯就不給跑簡單多了,所以我們花了滿多時間在釐清這個問題的原因。
最後從wireshark抓封包以及IIS server log發現,卡住的時候,player不會再送出任何request去抓video / audio fragment,大約是在第六秒和第八秒,切換抓取不同bitrate的時候就出了問題。
What the....!!!!!! How the hell would this happen
所以在載入影片的時候不能切換bitrate? Fuck!!! 這沒有道理啊!!! (後來發現切換bitrate真的跟卡住無關,因為測試用的silverlight player載入影片的時候切bitrate一點他媽的問題也沒有!!)
呼,真是太氣憤了。
我花了一下午新轉了一部低bitrate的影片,讓它容易切換,然後在測試player上卻捅出另一個樓子= = 太過頻繁的切換似乎會讓認證的cookie塞不進去(這只是猜測,實際讓認證抓不到cookie的原因不明),然後我又針對認證裡cookie null的處理作修改之後回來正式環境測試,一試就中,卡住的瞬間有夠想屎!!
所以下午他媽的白忙,player卡住不送request跟cookie null而被認證踢掉根本是兩個問題。
而且照這個情況看來,不送request對silverlight player或是IIS認證來說都不算是個錯誤,單純只是類似thread卡住而便秘又不敢講而已。
既然測試player沒問題,那就把正式player的流程改成跟它一樣吧!
所以我們把正式player的AutoPlay改成true,然後就跟喝了通樂一樣一路順暢............
What the F!!!!!!!!!!
至於為什麼會這樣到現在還沒搞懂。
另外,在載入影片的時候,如果預先載入的30秒都是同一個bitrate(ex. 1200k),什麼問題都沒有,所有的request也都會順利出現在wireshark以及server log裡;但只要載入的時候去抓另一個bitrate的fragment(ex. 2000k),就只會出現抓那個bitrate的request,也就是說,如果第六秒去抓,那就只看到第六秒的request(有時候會有第八秒的)。
為什麼其他的request都消失了,原因一樣不曉得,說不定跟cache有關係?
Update:
(冷靜)
1. 消失的request的確跟cache有關。
2. AutoPlay改成true之後,在第八秒卡住的問題依然存在,雖然無法確定跟AutoPlay無關,但至少不是唯一的原因。又做了一些測試後,我們猜測或許跟解析度有關,因為嵌在網頁上的player大小是400x300(4:3),所以在載入同樣是4:3的1200K影片(640x480)時一切正常,直到bitrate切換16:9的2000K影片(960x540),就立刻爆炸。這也是為什麼一開始在測試player沒有出現過這問題的原因,測試player一直是全螢幕打滿的,不會有比例不符合的錯誤。
但是網頁上的player牽涉到版面設計,沒辦法為了技術問題改變大小,所以我們改成在一開始載入的階段(manifest_ready -> media_opened)限制player抓取影片的bitrate,載入完成後才恢復成原先的multi-bitrate。
問題總算是解決了。
自行開發的Silverlight player一直有個問題,就是載入影片"有時候"會卡住,player狀態就停在manifest_ready和media_open中間不上不下。其實困擾有一大半都來自這個"有時候"出現的錯誤,說一是一說二是二程式有錯就不給跑簡單多了,所以我們花了滿多時間在釐清這個問題的原因。
最後從wireshark抓封包以及IIS server log發現,卡住的時候,player不會再送出任何request去抓video / audio fragment,大約是在第六秒和第八秒,切換抓取不同bitrate的時候就出了問題。
What the....!!!!!! How the hell would this happen
所以在載入影片的時候不能切換bitrate? Fuck!!! 這沒有道理啊!!! (後來發現切換bitrate真的跟卡住無關,因為測試用的silverlight player載入影片的時候切bitrate一點他媽的問題也沒有!!)
呼,真是太氣憤了。
我花了一下午新轉了一部低bitrate的影片,讓它容易切換,然後在測試player上卻捅出另一個樓子= = 太過頻繁的切換似乎會讓認證的cookie塞不進去(這只是猜測,實際讓認證抓不到cookie的原因不明),然後我又針對認證裡cookie null的處理作修改之後回來正式環境測試,一試就中,卡住的瞬間有夠想屎!!
所以下午他媽的白忙,player卡住不送request跟cookie null而被認證踢掉根本是兩個問題。
而且照這個情況看來,不送request對silverlight player或是IIS認證來說都不算是個錯誤,單純只是類似thread卡住而便秘又不敢講而已。
既然測試player沒問題,那就把正式player的流程改成跟它一樣吧!
所以我們把正式player的AutoPlay改成true,然後就跟喝了通樂一樣一路順暢............
What the F!!!!!!!!!!
至於為什麼會這樣到現在還沒搞懂。
另外,在載入影片的時候,如果預先載入的30秒都是同一個bitrate(ex. 1200k),什麼問題都沒有,所有的request也都會順利出現在wireshark以及server log裡;但只要載入的時候去抓另一個bitrate的fragment(ex. 2000k),就只會出現抓那個bitrate的request,也就是說,如果第六秒去抓,那就只看到第六秒的request(有時候會有第八秒的)。
為什麼其他的request都消失了,原因一樣不曉得,說不定跟cache有關係?
Update:
(冷靜)
1. 消失的request的確跟cache有關。
2. AutoPlay改成true之後,在第八秒卡住的問題依然存在,雖然無法確定跟AutoPlay無關,但至少不是唯一的原因。又做了一些測試後,我們猜測或許跟解析度有關,因為嵌在網頁上的player大小是400x300(4:3),所以在載入同樣是4:3的1200K影片(640x480)時一切正常,直到bitrate切換16:9的2000K影片(960x540),就立刻爆炸。這也是為什麼一開始在測試player沒有出現過這問題的原因,測試player一直是全螢幕打滿的,不會有比例不符合的錯誤。
但是網頁上的player牽涉到版面設計,沒辦法為了技術問題改變大小,所以我們改成在一開始載入的階段(manifest_ready -> media_opened)限制player抓取影片的bitrate,載入完成後才恢復成原先的multi-bitrate。
問題總算是解決了。
2013年1月11日 星期五
系統Memo - IIS Root Module 設定
指掛在Default Web Site層級的Module,掛載方式如一般應用程式(application)層級,
將DLL檔放在bin資料夾裡,讓web.config去讀取即可。
要注意的是,在這個層級的module,會影響底下所有應用程式的module,
必須額外加上不讓底下應用程式繼承本身設定的宣告,如下:
web.config內容:
< ?xml version="1.0" encoding="UTF-8"? >
< configuration >
< system.web >
< customErrors mode="Off"/ >
< /system.web >
< location path="." inheritInChildApplications="false" >
< system.webServer >
< modules >
< add name="DomainRedirect" type="DomainRedirect.Redirect"/ >
< /modules >
< /system.webServer >
< /location >
< /configuration >
將DLL檔放在bin資料夾裡,讓web.config去讀取即可。
要注意的是,在這個層級的module,會影響底下所有應用程式的module,
必須額外加上不讓底下應用程式繼承本身設定的宣告,如下:
web.config內容:
< ?xml version="1.0" encoding="UTF-8"? >
< configuration >
< system.web >
< customErrors mode="Off"/ >
< /system.web >
< location path="." inheritInChildApplications="false" >
< system.webServer >
< modules >
< add name="DomainRedirect" type="DomainRedirect.Redirect"/ >
< /modules >
< /system.webServer >
< /location >
< /configuration >
2013年1月1日 星期二
系統Memo - Cookie的使用
串流服務的http request分兩種,一種是manifest request,一種是chunk request;(manifest request: http://myserver.com/videopath/sample.ism/manifest?queryString,chunk request: /videopath/sample.ism?QualityLevels(128000)&Fragments(audio=460683900))
queryString只有在manifest request裡才會出現,也無法用程式加在接下來的chunk request上,所以為了辨別連線是屬於哪一個使用者,想到的最好解法就是使用cookie。
cookie的限制有以下幾點:
1. 無法即時改變cookie的值:cookie儲存在client端,在server端建立並設定值之後,由response帶過去client,下一次的request才會抓的到cookie;要改變其中的值或是刪除它,都必須由response通知client端,也就是cookie的變更一定存在request和response的時間差。
2. 瀏覽器的安全設定不相同:由於服務是由兩台不同domain的server提供,認證程式發給的cookie屬於第三方,這方面Chrome比較開放,並不禁止任何第三方cookie寫入,對認證沒有什麼影響;IE有限制第三方cookie,必須在cookie header中加入P3P設定 - HttpContext.Current.Response.AddHeader("P3P", "CP=\"CAO PSA OUR\""); Safari一樣有限制第三方cookie,且對於Domain的認定並不是看cookie內的設定來決定,而是直接看來源,這就很麻煩了,代表為了Safari一種瀏覽器,我必須將兩種服務放在同一個domain下。
3. 相同的request url不會更新cookie:也就是說,如果我要把cookie的值當作session用,我必須確定不同session的request url不會一樣,所攜帶的cookie值才會不一樣;經測試,相同的url無視於response的更新指令,而被瀏覽器視作cookie無須更新。
4. cookie允許設定string以外的值,但是request只取的到string的值
總而言之,cookie並不好用,
如果能夠像Wowza那樣將sessionid加在url上就不用被cookie搞了。
2012年10月17日 星期三
系統Memo - IHttpModule 中使用Session State
這個問題其實挺弔詭的,沒有什麼文件清楚的寫出來(該死的微軟)
要在IHttpModule中使用Session有非常多的限制:
1. 網路上眾說紛紜,有人說只在AcquireRequestState和PreRequestHandlerExecute兩個事件中,才有辦法使用Session,但也有人說http module根本沒辦法使用session,造成不少困擾。
2. 經測試,即使是在上述兩個事件中,HttpApplication.Context.Session依然為null,我的猜測是這樣的方法只適用於.aspx之類的http request,其餘一律行不通。(我發的http request是抓.png或是manifest這類的行為)
最後採用的解法是:
http://forums.asp.net/t/1098574.aspx/1
我看不太懂裡面針對handler物件繞來繞去的原因是什麼,只大概猜說是要自己宣告一個Handler類別,產生handler物件,然後用原本的Application.Context.Handler傳進來,藉此啟動SessionStateModule,讓SessionState成為avaliable狀態。
以下只擷取相關部分,RequestBegin之類的事件省略,
Code snippet:
public void Init(HttpApplication application)
{
// following two event handler are both required
application.PostAcquireRequestState += new EventHandler(OnPostAcquireRequestState);
application.PostMapRequestHandler += new EventHandler(OnPostMapRequestHandler);
}
/**
* for the usage of SessionState, replace the original handler with ours, force SessionState to be valiable
**/
public void OnPostMapRequestHandler(Object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
if (application.Context.Handler is IReadOnlySessionState || application.Context.Handler is IRequiresSessionState)
{
// no need to replace the original handler
return;
}
// swap the original handler
application.Context.Handler = new TempHandler(application.Context.Handler);
}
public void OnPostAcquireRequestState(Object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
TempHandler handler = HttpContext.Current.Handler as TempHandler;
if (handler != null)
{
HttpContext.Current.Handler = handler.myHandler;
}
// from this moment, SessionState is valiable
HttpSessionState session = application.Context.Session;
}
/**
* A temp handler used to force the SessionStateModule to load session state
**/
public class TempHandler : IHttpHandler, IRequiresSessionState
{
internal readonly IHttpHandler myHandler; // store original application context handler
public TempHandler(IHttpHandler originalhttpHandler)
{
this.myHandler = originalhttpHandler;
}
public void ProcessRequest(HttpContext context)
{
throw new InvalidOperationException("InvalidOperationException");
}
public bool IsReusable
{
get { return false; }
}
}
另外,module類別除了繼承IHttpModule以外,必須再繼承IRequiresSessionState。
Anyway,這個方法讓我成功取到Session.SessionID,原理之後再慢慢思考。
要在IHttpModule中使用Session有非常多的限制:
1. 網路上眾說紛紜,有人說只在AcquireRequestState和PreRequestHandlerExecute兩個事件中,才有辦法使用Session,但也有人說http module根本沒辦法使用session,造成不少困擾。
2. 經測試,即使是在上述兩個事件中,HttpApplication.Context.Session依然為null,我的猜測是這樣的方法只適用於.aspx之類的http request,其餘一律行不通。(我發的http request是抓.png或是manifest這類的行為)
最後採用的解法是:
http://forums.asp.net/t/1098574.aspx/1
我看不太懂裡面針對handler物件繞來繞去的原因是什麼,只大概猜說是要自己宣告一個Handler類別,產生handler物件,然後用原本的Application.Context.Handler傳進來,藉此啟動SessionStateModule,讓SessionState成為avaliable狀態。
以下只擷取相關部分,RequestBegin之類的事件省略,
Code snippet:
public void Init(HttpApplication application)
{
// following two event handler are both required
application.PostAcquireRequestState += new EventHandler(OnPostAcquireRequestState);
application.PostMapRequestHandler += new EventHandler(OnPostMapRequestHandler);
}
/**
* for the usage of SessionState, replace the original handler with ours, force SessionState to be valiable
**/
public void OnPostMapRequestHandler(Object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
if (application.Context.Handler is IReadOnlySessionState || application.Context.Handler is IRequiresSessionState)
{
// no need to replace the original handler
return;
}
// swap the original handler
application.Context.Handler = new TempHandler(application.Context.Handler);
}
public void OnPostAcquireRequestState(Object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
TempHandler handler = HttpContext.Current.Handler as TempHandler;
if (handler != null)
{
HttpContext.Current.Handler = handler.myHandler;
}
// from this moment, SessionState is valiable
HttpSessionState session = application.Context.Session;
}
/**
* A temp handler used to force the SessionStateModule to load session state
**/
public class TempHandler : IHttpHandler, IRequiresSessionState
{
internal readonly IHttpHandler myHandler; // store original application context handler
public TempHandler(IHttpHandler originalhttpHandler)
{
this.myHandler = originalhttpHandler;
}
public void ProcessRequest(HttpContext context)
{
throw new InvalidOperationException("InvalidOperationException");
}
public bool IsReusable
{
get { return false; }
}
}
另外,module類別除了繼承IHttpModule以外,必須再繼承IRequiresSessionState。
Anyway,這個方法讓我成功取到Session.SessionID,原理之後再慢慢思考。
2012年10月16日 星期二
系統Memo - IIS Server網站掛載HTTP Module
1. 將C#程式編譯成.dll檔,放置在網站目錄下bin資料夾,與web.config層級相同。
2. web.config設定方式如下:
< configuration >
< system.web >
< customErrors mode="Off" />
< /system.web >
< system.webServer >
< modules >
< add type="NameSpace.ModuleName" name="NameSpace" />
< /modules >
< /system.webServer >
< /configuration >
3. 採用介面為IHttpModules。
2. web.config設定方式如下:
< configuration >
< system.web >
< customErrors mode="Off" />
< /system.web >
< system.webServer >
< modules >
< add type="NameSpace.ModuleName" name="NameSpace" />
< /modules >
< /system.webServer >
< /configuration >
3. 採用介面為IHttpModules。
系統Memo - IIS Server 掛載網路位置的磁碟機 Update
承上一篇筆記,
去改AppPool的設定,使得.NET Framework的版本與DefaultAppPool不一樣,
可能導致之後無法在這個應用程式上掛任何.NET程式。
後來嘗試了另一種方法,其實很直觀,
只是當初沒想到。
1. 一樣新建立一個應用程式,使用DefaultAppPool的設定即可。
2. 注意上一篇講到的帳號密碼部分,這會影響到存取權限。
3. 在應用程式下建立新的虛擬目錄,將路徑指向目標網路磁碟機。
這樣就可以讓.NET程式運作正常,也可以讓程式和網站儲存內容分開。
去改AppPool的設定,使得.NET Framework的版本與DefaultAppPool不一樣,
可能導致之後無法在這個應用程式上掛任何.NET程式。
後來嘗試了另一種方法,其實很直觀,
只是當初沒想到。
1. 一樣新建立一個應用程式,使用DefaultAppPool的設定即可。
2. 注意上一篇講到的帳號密碼部分,這會影響到存取權限。
3. 在應用程式下建立新的虛擬目錄,將路徑指向目標網路磁碟機。
這樣就可以讓.NET程式運作正常,也可以讓程式和網站儲存內容分開。
2012年10月2日 星期二
系統Memo - IIS Server 掛載網路位置的磁碟機
紀錄一下,
這個問題困擾了我兩天,連公司的MIS都覺得莫名其妙,結果看了這篇網誌瞬間解決!
http://maxtellyou.blogspot.tw/2010/02/iis-7.html
大致上有幾點:
1. 在設定實體路徑時必須使用"//磁碟機網路位址/xxx",不能設定為"磁碟機代號:\xxx",因為IIS只支援UNC路徑而不支援網路磁碟機路徑。
2. 雖然說是要在預設網站(Default Web Site)下建立虛擬目錄,但其實是建立一個新的應用程式(Application),並搭配新建立的應用程式集區(ApplicationPool)。
3. 新建立的應用程式集區必須設定為"沒有Managed程式碼"。
4. 在IIS server上必須要有一個與網路磁碟機一模一樣帳號密碼的使用者帳戶,比如說網路磁碟機上開的存取帳號為 testUser / 1234,那麼IIS server上也要有一個帳號 testUser / 1234,只要存在就好,IIS端不一定要用此帳號操作。
5. IIS端建立的新應用程式需設定連線身分為此組帳號密碼,登入類型為clearText即可。
這個問題困擾了我兩天,連公司的MIS都覺得莫名其妙,結果看了這篇網誌瞬間解決!
http://maxtellyou.blogspot.tw/2010/02/iis-7.html
大致上有幾點:
1. 在設定實體路徑時必須使用"//磁碟機網路位址/xxx",不能設定為"磁碟機代號:\xxx",因為IIS只支援UNC路徑而不支援網路磁碟機路徑。
2. 雖然說是要在預設網站(Default Web Site)下建立虛擬目錄,但其實是建立一個新的應用程式(Application),並搭配新建立的應用程式集區(ApplicationPool)。
3. 新建立的應用程式集區必須設定為"沒有Managed程式碼"。
4. 在IIS server上必須要有一個與網路磁碟機一模一樣帳號密碼的使用者帳戶,比如說網路磁碟機上開的存取帳號為 testUser / 1234,那麼IIS server上也要有一個帳號 testUser / 1234,只要存在就好,IIS端不一定要用此帳號操作。
5. IIS端建立的新應用程式需設定連線身分為此組帳號密碼,登入類型為clearText即可。
2010年1月9日 星期六
In The End
I still lost you.
其實我真的不知道該怎麼反應了。
也許是腦袋裡早就描繪過今天的結果,我並沒感受到想像中的錐心刺骨;
也許我根本沒有自以為的這麼喜歡你,雖然只要一想到心臟就跟著糾結。
好麻吉們知道了都紛紛打電話來問我還好嗎,但我該怎麼回答?
我還好?
擺明了騙人,我一點都不好。
我很難過?
但我沒哭,一滴眼淚都流不出來。
所以我實在回答不出我到底好不好。
事情總是已成定局,多想無用,育質也這麼說,
於是我開始試著不去想,把它鎖在盒子裡,加上大鐵鍊。
有時腦袋放空,會有一點點從盒子邊緣溢出,瞬間充滿整個腦袋、整個心臟,
然後又是一陣劇痛,
我不得不喚出理智將它再度封閉。
而我似乎越來越熟練了...
這是逃避,沒錯!
那麼誰來告訴我,面對這種事情,要怎麼樣才叫勇敢呢?
其實我真的不知道該怎麼反應了。
也許是腦袋裡早就描繪過今天的結果,我並沒感受到想像中的錐心刺骨;
也許我根本沒有自以為的這麼喜歡你,雖然只要一想到心臟就跟著糾結。
好麻吉們知道了都紛紛打電話來問我還好嗎,但我該怎麼回答?
我還好?
擺明了騙人,我一點都不好。
我很難過?
但我沒哭,一滴眼淚都流不出來。
所以我實在回答不出我到底好不好。
事情總是已成定局,多想無用,育質也這麼說,
於是我開始試著不去想,把它鎖在盒子裡,加上大鐵鍊。
有時腦袋放空,會有一點點從盒子邊緣溢出,瞬間充滿整個腦袋、整個心臟,
然後又是一陣劇痛,
我不得不喚出理智將它再度封閉。
而我似乎越來越熟練了...
這是逃避,沒錯!
那麼誰來告訴我,面對這種事情,要怎麼樣才叫勇敢呢?
2009年2月7日 星期六
痞子蔡
這次過年,照例的回到嘉義老家團圓,
也照例"難得"的跟表哥聊了一下,
我說我以後想學室內設計,
他卻回答:"你很喜歡小室哲哉喔?"
我:"蛤?"
表哥:"小室哲哉啊!唱片製作人。"
我: "我知道啊!但這跟室內設計有什麼關係?"
表哥:" '小室 ' 哲哉啊,哈哈!"
我:"..."
這時我終於確定,寫小說的人腦子裡裝的都跟平常人不一樣,
幽默感也自不同...
不過跟表哥的幽默感比起來,九把刀的比較接近我的tone,
像是把海蔘放到褲襠裡露一截出來之類的...
好吧,順便幫他的新書打打廣告好了,
雖然沒幾個人在看這網誌,我總是盡人事了,
把網誌搞得這麼無聊我也不願意啊....
回眸
寫的是三段小故事,
個人覺得最好看的是第一段,
雖然前半部的敘事不怎麼樣,搭上後半部的發酵倒是效果不錯!
第二段應該是憑空想像的吧!表哥厲害歸厲害,無厘頭歸無厘頭,
這種天馬行空的故事還是無法比那種在周遭會發生的愛情小品寫的好。
第三段呢...是遊記,不予置評,
因為看完就真的僅僅覺得它是篇遊記...
哈哈,
說這麼多,真的要我掏錢買我還會猶豫咧~幸好他都會拿來送~
也照例"難得"的跟表哥聊了一下,
我說我以後想學室內設計,
他卻回答:"你很喜歡小室哲哉喔?"
我:"蛤?"
表哥:"小室哲哉啊!唱片製作人。"
我: "我知道啊!但這跟室內設計有什麼關係?"
表哥:" '小室 ' 哲哉啊,哈哈!"
我:"..."
這時我終於確定,寫小說的人腦子裡裝的都跟平常人不一樣,
幽默感也自不同...
不過跟表哥的幽默感比起來,九把刀的比較接近我的tone,
像是把海蔘放到褲襠裡露一截出來之類的...
好吧,順便幫他的新書打打廣告好了,
雖然沒幾個人在看這網誌,我總是盡人事了,
把網誌搞得這麼無聊我也不願意啊....
回眸
寫的是三段小故事,
個人覺得最好看的是第一段,
雖然前半部的敘事不怎麼樣,搭上後半部的發酵倒是效果不錯!
第二段應該是憑空想像的吧!表哥厲害歸厲害,無厘頭歸無厘頭,
這種天馬行空的故事還是無法比那種在周遭會發生的愛情小品寫的好。
第三段呢...是遊記,不予置評,
因為看完就真的僅僅覺得它是篇遊記...
哈哈,
說這麼多,真的要我掏錢買我還會猶豫咧~幸好他都會拿來送~
2008年7月20日 星期日
放棄
有點猶豫要怎麼開始...那麼,讓我想想...
這篇文章只是紀錄某段歲月的標的罷了。
以我遲鈍的感覺及認知來看,
我是喜歡妳的,一直到現在依然沒變。
我對追女生這件事很笨拙,我只知道要在校園傳情時送個小東西,再附上卡片一張,
表演活動時或新電影上檔時邀請妳一起去看,
妳上線時找妳聊聊天,
但妳我都不是擅於找話題的人,出去時走在一起卻聊不上幾句,連msn對話都乏善可陳,
這讓我覺得我們的相處似乎永遠不會有火花,
我感到挫折,在我對妳說我喜歡妳之前就常常這樣絆住我的腳步。
妳說我們還是適合當朋友,坦白說,是預料中的結果,
I don't deserve that.
膽小的我不知道被拒絕後該怎麼面對妳,因此我選擇逃避,
神奇的是,在這段時間裡,我沒有刻意迴避,但我們真的連在校園裡也不曾碰見過。
忘記什麼時候了,我們又開始像普通朋友一樣相處,
好像我們的生命曲線終於從平行而再度交會一樣。(雖然難免多了點疙瘩 ^^")
只是,我不再積極的邀約妳,在妳上線的時候還是會點開對話框,然後盯著發呆。
我卻步了,當我沒有收到回應時我那該死的自尊心所自動張開的防禦網,
簡而言之,我害怕再受傷。(也許不是受傷,但我總是怕)
一直到現在,認識妳的第六年,我還沒能逃脫這樣的牢籠。
曾經,
我為了妳傳情時送我的小蛋糕及卡片雀躍不已;
只要妳回我的簡訊不是冷冷的語氣,我就會存下來一看再看;
妳第一次答應跟我去看電影時,我好緊張,話都說不出來,但電影票根我卻一直留著。
現在,
我想也該是時候跳脫出來了,
真正的,放棄妳。
這篇文章只是紀錄某段歲月的標的罷了。
以我遲鈍的感覺及認知來看,
我是喜歡妳的,一直到現在依然沒變。
我對追女生這件事很笨拙,我只知道要在校園傳情時送個小東西,再附上卡片一張,
表演活動時或新電影上檔時邀請妳一起去看,
妳上線時找妳聊聊天,
但妳我都不是擅於找話題的人,出去時走在一起卻聊不上幾句,連msn對話都乏善可陳,
這讓我覺得我們的相處似乎永遠不會有火花,
我感到挫折,在我對妳說我喜歡妳之前就常常這樣絆住我的腳步。
妳說我們還是適合當朋友,坦白說,是預料中的結果,
I don't deserve that.
膽小的我不知道被拒絕後該怎麼面對妳,因此我選擇逃避,
神奇的是,在這段時間裡,我沒有刻意迴避,但我們真的連在校園裡也不曾碰見過。
忘記什麼時候了,我們又開始像普通朋友一樣相處,
好像我們的生命曲線終於從平行而再度交會一樣。(雖然難免多了點疙瘩 ^^")
只是,我不再積極的邀約妳,在妳上線的時候還是會點開對話框,然後盯著發呆。
我卻步了,當我沒有收到回應時我那該死的自尊心所自動張開的防禦網,
簡而言之,我害怕再受傷。(也許不是受傷,但我總是怕)
一直到現在,認識妳的第六年,我還沒能逃脫這樣的牢籠。
曾經,
我為了妳傳情時送我的小蛋糕及卡片雀躍不已;
只要妳回我的簡訊不是冷冷的語氣,我就會存下來一看再看;
妳第一次答應跟我去看電影時,我好緊張,話都說不出來,但電影票根我卻一直留著。
現在,
我想也該是時候跳脫出來了,
真正的,放棄妳。
2008年5月26日 星期一
大爛車掰掰
終於跟這台大爛車說掰掰了,
從大三還是大四那時候停在九舍停車場常常變成昆蟲王國開始我就懷疑它是不是受了詛咒 = =+
怎麼旁邊的車都沒事,就我的車有蜘蛛結網、螞蟻做巢、鳥類便溺,
還三不五時壞這壞那的....
自己騎就算了,載女生就不太好意思了@@
後來到台北唸書後,住的地方跟學校實在是沒很遠,騎機車說實在的浪費了點,
但一直下不定決心把它處理掉,畢竟有時候還是會需要用到。
直到前一陣子,它開始任性的難以發動,有時候踩一下就ok,有時候卻得踩上半小時搞的滿身大汗,
而且昆蟲王國的情形也沒改善....orz
我心一橫,效法那時被智齒在痛弄得整LP火隔天就衝去拔掉的狠勁,
這禮拜快刀斬亂麻想把它脫手~不然我想可能會再度猶豫很久,
聽了鄉民推薦後跑到辛亥隧道那邊的二手車店,老闆卻說我的車太老賣不好因此不想收,
哭哭了,上網賣又得拖很久,
想起早上買早餐時看到家裡附近一家車行有代辦監理站事務,說不定也會收二手車!
姑且一試吧!
於是又從辛亥隧道騎回木新路,這次老闆估了3000,
第一家的老闆要我上網賣的時候也說賣個3、4000塊,所以我想3000應該ok了~
剛剛去拿回證件以及過戶費收據,明天再去買台腳踏車,
我就是陽光少年了,哈哈
從大三還是大四那時候停在九舍停車場常常變成昆蟲王國開始我就懷疑它是不是受了詛咒 = =+
怎麼旁邊的車都沒事,就我的車有蜘蛛結網、螞蟻做巢、鳥類便溺,
還三不五時壞這壞那的....
自己騎就算了,載女生就不太好意思了@@
後來到台北唸書後,住的地方跟學校實在是沒很遠,騎機車說實在的浪費了點,
但一直下不定決心把它處理掉,畢竟有時候還是會需要用到。
直到前一陣子,它開始任性的難以發動,有時候踩一下就ok,有時候卻得踩上半小時搞的滿身大汗,
而且昆蟲王國的情形也沒改善....orz
我心一橫,效法那時被智齒在痛弄得整LP火隔天就衝去拔掉的狠勁,
這禮拜快刀斬亂麻想把它脫手~不然我想可能會再度猶豫很久,
聽了鄉民推薦後跑到辛亥隧道那邊的二手車店,老闆卻說我的車太老賣不好因此不想收,
哭哭了,上網賣又得拖很久,
想起早上買早餐時看到家裡附近一家車行有代辦監理站事務,說不定也會收二手車!
姑且一試吧!
於是又從辛亥隧道騎回木新路,這次老闆估了3000,
第一家的老闆要我上網賣的時候也說賣個3、4000塊,所以我想3000應該ok了~
剛剛去拿回證件以及過戶費收據,明天再去買台腳踏車,
我就是陽光少年了,哈哈
2008年5月7日 星期三
煩心
3/29,我在香港設計學院台北分校上了第一堂室內設計課,
雖然只是一點點觀念,
還是讓我很期待接下來會有什麼樣的課程。
這家短期補習班在香港頗有名氣,也不是什麼非常年輕的補習班,
常坐木柵線的人或許會發現在靠中山國中站附近的幾站有這家補習班的大幅廣告,
當初不疑有他,畢竟又是阿姨介紹的。
然後4/5號清明節補習班放假,正常;
4/12號櫃臺小姐打來說房東欲調漲房租,與補習班意見相左,
使得補習班原本的裝修工程停擺,並承諾會另找教室上課,
過幾天,網站上公告新的教室在光復南路;
4/17一大早七點多收到了一封簡訊,補習班負責人辭職,將所有權責交回給香港本校,
至此,我只覺得怪怪的,要跑路又何必多此一舉辭職?
直到晚上接到同學的電話才驚覺事態嚴重,
看樣子這傢伙是真的捲款潛逃了。
接下來兩天,同學及老師(老師也是受害者)間互相商量聯絡的結果是,
老師會不拿薪水繼續教,但教室什麼的就得克難。
昨天跑了一趟光復南路那邊,發現新教室的地址原先就是一家兒童補習班,
原來新教室也是幌子~
一樓警衛大哥跟我說,之前已經去過一批人,說要提告,
要他告知其他也找到那邊去的學員。
第一次遇到這種事,還要老爸提醒才知道得去警局備案,
雖然備了案但也是不抱什麼期望的,
畢竟以台灣的條盃盃素質來看能唬唬交通違規的就不錯了還抓別的咧~呿
雖然只是一點點觀念,
還是讓我很期待接下來會有什麼樣的課程。
這家短期補習班在香港頗有名氣,也不是什麼非常年輕的補習班,
常坐木柵線的人或許會發現在靠中山國中站附近的幾站有這家補習班的大幅廣告,
當初不疑有他,畢竟又是阿姨介紹的。
然後4/5號清明節補習班放假,正常;
4/12號櫃臺小姐打來說房東欲調漲房租,與補習班意見相左,
使得補習班原本的裝修工程停擺,並承諾會另找教室上課,
過幾天,網站上公告新的教室在光復南路;
4/17一大早七點多收到了一封簡訊,補習班負責人辭職,將所有權責交回給香港本校,
至此,我只覺得怪怪的,要跑路又何必多此一舉辭職?
直到晚上接到同學的電話才驚覺事態嚴重,
看樣子這傢伙是真的捲款潛逃了。
接下來兩天,同學及老師(老師也是受害者)間互相商量聯絡的結果是,
老師會不拿薪水繼續教,但教室什麼的就得克難。
昨天跑了一趟光復南路那邊,發現新教室的地址原先就是一家兒童補習班,
原來新教室也是幌子~
一樓警衛大哥跟我說,之前已經去過一批人,說要提告,
要他告知其他也找到那邊去的學員。
第一次遇到這種事,還要老爸提醒才知道得去警局備案,
雖然備了案但也是不抱什麼期望的,
畢竟以台灣的條盃盃素質來看能唬唬交通違規的就不錯了還抓別的咧~呿
2008年4月16日 星期三
生日
我人生中前18年頭其實是不習慣有人幫我慶祝生日的,
只有某幾年老爸老媽突然想到,會買個蛋糕到外公外婆家一起吃當作慶祝,
或是出門逛街時我買的東西稍微貴了點,那麼它就會自動成為我今年甚至明年的生日禮物^^"
高中畢業後我考上中壢的學校,開始自己一個人離開家在外面唸書,
也頭一次嚐到幫同學慶祝生日會是多瘋狂,
以及同學、朋友們聚在一起幫你慶生是什麼樣的滋味。
大一,那時候剛剛認識了中文系的學伴,雅涵,
更連帶認識了學伴的一些同學,燕子、阿甘、映臻、阿熊、小黃。
(神奇的是,跟這些人的感情甚至比一些同班同學來的好^^)
記得那次燕子生日,姜胖跟透抽跑遍中壢市買了好吃的蛋糕,
下課後我們就在中大湖畔幫燕子唱生日快樂歌,
中間發生什麼事我已經記不清楚,
我只知道所有與會的人通通瘋狂地跳到噁心的中大湖裡了。
直到大四,才第一次有朋友幫我慶生。
那天好像剛補完習回到寢室,隔天是台科大的研究所考試,我正坐在電腦前發呆,
突然寢室燈熄了,一群人從門口冒出來大聲喊了:"生日快樂!"
有大二的系排學弟妹、同班同學還有我貼心的三個室友 :)
哈哈,我嚇傻的表情一定很好笑吧!
大陣仗的結果就是會吵到別間寢室的同學,噗,我們就移駕到了交誼廳,
沒想到子嘉卻又突然出現..
我再一次嚇傻,但這一次大概像個白癡吧,哈!
好吧,我承認我超感動,嘴角快裂到太陽穴了吧我想~
後來上了研究所小小的慶生過一次,成員是怡萱、小火和隔壁的學長任偉,
怡萱特地搭公車跑出去買黃湘怡那家蛋糕店的蛋糕,結果回來迷路了 = =
值得一提的是,蛋糕真的超好吃!
如果大四那次是熱鬧party的話,這個算是走溫馨小品路線吧~!哈哈
只有某幾年老爸老媽突然想到,會買個蛋糕到外公外婆家一起吃當作慶祝,
或是出門逛街時我買的東西稍微貴了點,那麼它就會自動成為我今年甚至明年的生日禮物^^"
高中畢業後我考上中壢的學校,開始自己一個人離開家在外面唸書,
也頭一次嚐到幫同學慶祝生日會是多瘋狂,
以及同學、朋友們聚在一起幫你慶生是什麼樣的滋味。
大一,那時候剛剛認識了中文系的學伴,雅涵,
更連帶認識了學伴的一些同學,燕子、阿甘、映臻、阿熊、小黃。
(神奇的是,跟這些人的感情甚至比一些同班同學來的好^^)
記得那次燕子生日,姜胖跟透抽跑遍中壢市買了好吃的蛋糕,
下課後我們就在中大湖畔幫燕子唱生日快樂歌,
中間發生什麼事我已經記不清楚,
我只知道所有與會的人通通瘋狂地跳到噁心的中大湖裡了。
直到大四,才第一次有朋友幫我慶生。
那天好像剛補完習回到寢室,隔天是台科大的研究所考試,我正坐在電腦前發呆,
突然寢室燈熄了,一群人從門口冒出來大聲喊了:"生日快樂!"
有大二的系排學弟妹、同班同學還有我貼心的三個室友 :)
哈哈,我嚇傻的表情一定很好笑吧!
大陣仗的結果就是會吵到別間寢室的同學,噗,我們就移駕到了交誼廳,
沒想到子嘉卻又突然出現..
我再一次嚇傻,但這一次大概像個白癡吧,哈!
好吧,我承認我超感動,嘴角快裂到太陽穴了吧我想~
後來上了研究所小小的慶生過一次,成員是怡萱、小火和隔壁的學長任偉,
怡萱特地搭公車跑出去買黃湘怡那家蛋糕店的蛋糕,結果回來迷路了 = =
值得一提的是,蛋糕真的超好吃!
如果大四那次是熱鬧party的話,這個算是走溫馨小品路線吧~!哈哈
2008年4月2日 星期三
第二顆智齒
這次可不是痛的死去活來才拔掉的,
而是我一點心理準備都沒有的情況下....
有過第一次的經驗,我發誓要是智齒若不犯我則我也不會去拔它,
但我失約了....
上禮拜五去做第二次的根管治療,牙醫師是隔壁實驗室同學的哥哥,
總是很溫柔的"會痛舉個手,我們隨時可以停下來休息一下",這是在鑽牙齒;
"這會有點不舒服喔,來~深呼吸",這是在打麻藥;
哈哈,可惜結婚了,不然介紹給黃黃她一定很高興~!
言歸正傳,等他上了麻藥,把我原本補牙的銀粉清掉之後,才說:
"哦~似乎還沒蛀到神經,那就先補回來,
若是接下來吃冰的東西會酸痛再考慮抽神經做牙套。"
"那既然麻藥都打了,乾脆把後面的智齒拔了吧,
反正都是要拔免得之後還要多挨一針"
咦?什麼?
天啊,那我的誓言算什麼!!
喔,不是啦,是拔智齒超痛耶~你也給我點心理準備嘛~
我想我那時的笑容一定很僵硬...不停的問他會不會很痛,
雖然他一直很溫柔誠懇,
但我承認我那時很懷疑他說的不會很痛可信度有沒有超過政客說的話,也就是0。
哼,拔就拔!老子是男子漢豈會怕拔牙齒這種小事,
人家關雲長刮骨療傷的時候連麻藥都沒打咧~
結果,
整個拔牙的過程,
20秒
...
還要他跟我說,已經拔完囉,現在要把剛剛的臼齒補回來,
我才驚覺原來我的智齒已經跟我say goodbye了,不是很痛嗎怎麼會沒感覺?
看在他溫柔又誠懇的份上我把它歸因於他技術比較好吧!哈哈
現在這顆智齒躺在我實驗室的桌上,用一種有漂白水味道的藥劑泡著封在袋子裡,
我現給學弟看但他說很噁心 = =+ 也對啦,蛀牙真的很噁...
而是我一點心理準備都沒有的情況下....
有過第一次的經驗,我發誓要是智齒若不犯我則我也不會去拔它,
但我失約了....
上禮拜五去做第二次的根管治療,牙醫師是隔壁實驗室同學的哥哥,
總是很溫柔的"會痛舉個手,我們隨時可以停下來休息一下",這是在鑽牙齒;
"這會有點不舒服喔,來~深呼吸",這是在打麻藥;
哈哈,可惜結婚了,不然介紹給黃黃她一定很高興~!
言歸正傳,等他上了麻藥,把我原本補牙的銀粉清掉之後,才說:
"哦~似乎還沒蛀到神經,那就先補回來,
若是接下來吃冰的東西會酸痛再考慮抽神經做牙套。"
"那既然麻藥都打了,乾脆把後面的智齒拔了吧,
反正都是要拔免得之後還要多挨一針"
咦?什麼?
天啊,那我的誓言算什麼!!
喔,不是啦,是拔智齒超痛耶~你也給我點心理準備嘛~
我想我那時的笑容一定很僵硬...不停的問他會不會很痛,
雖然他一直很溫柔誠懇,
但我承認我那時很懷疑他說的不會很痛可信度有沒有超過政客說的話,也就是0。
哼,拔就拔!老子是男子漢豈會怕拔牙齒這種小事,
人家關雲長刮骨療傷的時候連麻藥都沒打咧~
結果,
整個拔牙的過程,
20秒
...
還要他跟我說,已經拔完囉,現在要把剛剛的臼齒補回來,
我才驚覺原來我的智齒已經跟我say goodbye了,不是很痛嗎怎麼會沒感覺?
看在他溫柔又誠懇的份上我把它歸因於他技術比較好吧!哈哈
現在這顆智齒躺在我實驗室的桌上,用一種有漂白水味道的藥劑泡著封在袋子裡,
我現給學弟看但他說很噁心 = =+ 也對啦,蛀牙真的很噁...
2008年3月3日 星期一
有關blog名稱
"海邊的咖啡店 "
其實是我的夢想之一,希望能在老了之後到海邊開間小小的咖啡店,
木造的那種,旁邊有個小花園,
裝潢也不用很多,但要夠酷,那種簡簡單單的酷!
哈哈~
嚮往歸嚮往,
先賺點錢比較實際。
其實是我的夢想之一,希望能在老了之後到海邊開間小小的咖啡店,
木造的那種,旁邊有個小花園,
裝潢也不用很多,但要夠酷,那種簡簡單單的酷!
哈哈~
嚮往歸嚮往,
先賺點錢比較實際。
Good words!
Life is one fucking beauty contest after another. You do what you love, and fuck the rest.
聽學妹說是出自一部電影,叫"做小太陽的願望",
乍聽之下是部溫馨片,居然也有這麼酷的台詞~哈哈
聽學妹說是出自一部電影,叫"做小太陽的願望",
乍聽之下是部溫馨片,居然也有這麼酷的台詞~哈哈
牙齒爛光光
上禮拜六去給比比的哥哥看牙齒,盛大哥人超好超溫柔,雖然戴著口罩但應該也很帥,
診所還有很正的護士,哈哈。
給醫生檢查過後,驚覺我的一口牙齒真的已經快爆光了 @@
盛大哥說要根治我的蛀牙得做根管治療,也就是抽神經..
歐,好吧,抽就抽..
但需要抽到5顆是怎麼回事..= =+
後來看了我牙齒的X光片,就知道盛大哥其實沒誇張..
那些黑黑的陰影(就是蛀牙)都快碰到神經哩~
吼
現在一直很擔心抽神經會很痛,怎麼辦啦~
診所還有很正的護士,哈哈。
給醫生檢查過後,驚覺我的一口牙齒真的已經快爆光了 @@
盛大哥說要根治我的蛀牙得做根管治療,也就是抽神經..
歐,好吧,抽就抽..
但需要抽到5顆是怎麼回事..= =+
後來看了我牙齒的X光片,就知道盛大哥其實沒誇張..
那些黑黑的陰影(就是蛀牙)都快碰到神經哩~
吼
現在一直很擔心抽神經會很痛,怎麼辦啦~
訂閱:
文章 (Atom)