2013/12/31

禁比特幣?

今天看到這則新聞「央行下禁令 第三方支付禁比特幣

雖然我一直弄不清楚比特幣的實際價值在那裡,(不過我想,應該有比我更聰明的人瞭解它的價值與潛力),但實在不太認同央行用「禁止」的方式來對待比特幣。我猜想,央行的出發點也許是好的。我們的政府官員常有父母官的天性,會用其「大學問」的角度出發與思考,建立許多制度來「保護」人民, 避免人們受到傷害。

台灣在2012年提出自由經濟示範區,並於2013年開始實施。很多人都認為自由經濟示範區的設置,是一種新加坡成功經驗的移植。政府對自由經濟示範區所下的slogan就是「自由、開放、前瞻」,其精神在於鬆綁人流、物流、金流、資訊流等限制,以活絡經濟活動

回到比特幣,我們看看新加坡,新加坡央行並未禁止比特幣,而是宣稱比特幣交易是商業考量,政府無權過問,也不會干涉比特幣的交易與使用

我們決定設立自由經濟示範區,不也是希望能引發經濟貿易的創新嗎?而創新不就是種冒險,充滿了失敗與機會
但當央行管控的大環境已經劃出這樣的框框,是否已經宣告關上這個方向的路了。所有關於比特幣的未來在台灣就到此為止?政府高官以大學問來劃框框,是否也代表了政府想要的「自由、開放、前瞻」是有條件與限度的?這樣的姿態,是否會阻礙國外想追求創新的動能進入?

2013/12/28

台中市部分區域2021年後禁行機車,環保?

25日在議會三讀通過「台中市發展低碳城市自治條例」。原本市府規劃指定公告區域內禁止行駛二行程機車,議員修正為「自110年1月1日起,市府府得公告指定區域內,禁止行駛燃油機車;並於105年1月1日前訂定相關獎勵汰換辦法。」
 http://www.ettoday.net/news/20131228/310985.htm

從環保的觀點,很欽佩台中市的勇氣,但也從低碳的觀點,也質疑這樣的作法

低碳,燃油機車是當務之急?
一般我們在解決問題時,會從首要問題先解決。
我不知以台中市來說,碳排放的首惡是不是機車?我不知台中市是不是有做過這個研究?
這篇報告來說,私人交通工具佔10%,不是前三名,而且機車是10%裡的部份。

這篇報導中還指出
看來,汽車的單為排放量,是機車的4倍多。
先拿機車開刀,是正確的選擇嗎?

也許,上述那篇文章是已開發國家的資料,台灣不知道差距多少?

民眾的因應
這篇統計來看,台中市約一半(49.5%)的日常使用運具是機車,到101年九月的統計,台中市有1,752,195部機車。
當這法令開始實施的初期,「只有」部份區域禁機車,影響到的應該只有「少數人」,也就是會進出這些「禁區」的民眾要做應變。假設,「只有」兩成的民眾會受影響,那就約有35萬部機車。這些民眾要怎麼辦?
我想,民眾應該有幾種選擇:
  • 公車
    在台中生活過的朋友應該很瞭解,台中的公車很可怕,市區也許好一點,路線密集,班次也多,但是非市區的部份 (請記得還有以前的台中縣), 等車可能要等 等 等 等 等 等... 
  • 步行 or 自行車
    如果短距離也許還可行

  • 電動機車
    家裡有一部電動機車。以自身的經驗,目前的電動機車續航力不算遠,充電6~8hr約可走20Km(而且隨著電池的蓄電能力衰減,這數字應該還會往下走)。對外務為主的上班族,我想他們應該會很猶豫吧
    更何況,電動車真的能減碳嗎?連國科會的報告也有質疑

  • 汽車
    如果上面都沒有合適的解決方案,那...這就是唯一的方案了

如果實施範圍擴大,影響的機車就越多

交通衝擊
上面假設初期有35萬部機車受影響,再假設,有三成改成以汽車做為交通工具,那台中市應該會多出約10萬部汽車。10萬部,也就是多了10%。
多10%的車子在台中的路上跑,不知道現有的駕駛人會怎麼想?如果是我,我大概會#$&(&^@
多這麼多車子塞在路上,我不知這樣算不算是減碳了...
另外,台中有沒有這麼多的停車位能容納這麼多的小客車?
很多熱門地點的停車場是嚴重不足,車子排到停車場入口之外,回塞到馬路,讓整個區域的交通更塞...

商業衝擊
希望劃入禁區的區域,在停車的規劃上是足夠的
台中市中區,一個沒落的商圈,目前到此消費的,大概就是搭公車或騎機車的年輕族群或過往客,以及外勞。開車族大概很少會進來。
就像我,我就不太會考慮開車進中區買東西,因為停車太不方便了。要不就是沒停車位,要不就是停車場遠了點。如果要進中區買東西,我大概都會騎機車。
如果,中區被劃入禁區,我想我大概不會進中區買東西吧。

期待
  • 希望,在民國110年時,台中市的大眾運輸系統可以更完善,讓公車捷運族所要付出的金錢與時間成本,都是騎機車的兩倍以下 (超過的話,能接受的人可能就不高了),最好是低於騎機車,這樣更讓機車族有動機轉變為公車族
  • 希望,目前就已不足的停車空間能加油,足以容納未來會大量成長汽車數
  • 希望,交通局能「主動」「積極」的檢討交通動線,交通大隊也能 「 嚴格疏導」交通,如果有開車到三民路一中商圈附近,就知道這種痛。三個車道都還能塞車,不是因為車多,而是動線混亂,「大虎」們為所欲為 (我每天都能看到這景象),這樣才能讓汽車行駛更順暢,減少走走停停,也減少二氧化碳的排放
  • 希望,在百萬機車族的犧牲下,台中的「低碳」目標可以達成




2013/12/26

IBM的五年五大預測


IBM剛公布的五年五大預測
主題幾乎都是在透過大資料與運算能力,提供智慧化的生活體驗



  • 個人化的教室
    「教室」會觀察學習者的動態,提供更適性的資源來幫著學生與教師
  • 零售店將會擊敗網上商店
    在網購獨霸的今天,這一點應該很不可思議吧。不過這裡的零售店可是變形過的零售店。零售店將整合現場實體、電腦協助的個人化與室內定位等等技術,提供出全新的實體購物經驗。
  • DNA層次的醫療
    透過更快速與廉價的計算能力,經以基因剖析確定治療方案的時間,從數周降至數分鐘,協助醫療人員針對病人的DNA特徵,提供個人化的治療方案
  • 整體的安全防護
    通過背景、環境及歷史資料分析,來全方位學習用戶的使用習慣,對超出常規的行為做出推斷、警告與處置
  • 智慧城市
    市民透過smart phone來取得城市的生活資訊,也透過smart phone回饋各種資料到城市系統,城市會消化吸收市民免費提供的那些訊息,經分析後成為新的生活資訊,並能自動調配資源到所需的地方


透過大量即時蒐集個人資料,並配合超級的計算能力,確實可以提供更好的生活體驗。不過,科技是兩面刃,這些能力若是有心人士之手,恐怕也會有意想不到的災難。

2013/12/21

你真的需要Big Data嗎?


Big Data大概是這兩三年來流行的buzzword了。企業或組織都思考著怎麼從現有的資料中去找出商機,或是想著建立什麼機制來搜集更大量的交易與來往資料,然後丟進去分析器去。而設備與軟體商則是想盡辦法,弄些商品或項目出來,好趁著這波浪潮,把產品賣出去,好賺一票。

對不少組織來說,他們在Big Data的洗腦下,不管有沒有目標與方向,都開始從倉庫裡挖出陳年的資料,希望那些軟硬體設備能像哈利波特的魔杖,輕輕一揮,就能找出那個族群客戶貢獻度最高的、那些特質的客戶最有忠誠度...

不過,真的凡事都要靠Big Data嗎?沒有Big Data就行不通嗎?

在這篇“Little Data” Matters, Too 裡,提出了一些經驗。作者分享了一些實際案例,告訴我們在現實世界中,有不少企業,一直用著 "Little Data",用著很少的經費與設備(甚至不花錢),就找出了很多能改善績效或產品的方案。
例如,直接與各地的客戶聊聊,是不是比透過資料來認識客戶更直接、更透徹?

在思考是否要採用Big Data?也許先想想你的目的是什麼?想得到這些解答有那些途徑?真的只有Big Data才能做到嗎?

2013/12/18

比特幣?

比特幣最近超夯
大概一年前吧,我也裝了挖礦程式,也試著去瞭解這個生態
可是,真的是沒有慧根,完全無法想像它的價值在那裡
只知道為挖礦所付出的實際電費成本

比特幣真的有價值嗎?看了這篇「比特幣真的存在合理價值嗎」,讓我更懷疑它的價值了

2013/12/09

ElasticSearch中token filters的順序

在ElasticSearch中,一個analyzer可以有多個token filters。而這些filters的順序有時會很重要。
這兩天在玩一個案例,我有一自訂的analyzer,其filters定義為 [standard, lowercase, stop, snowball, synonym],並定義 spanning tree protocol 與 stp為synonym,期望當用spanning tree protocol去搜尋時,也能找到內容中也有stp的文章,反之亦然

但是玩了老半天卻一直失敗,用spanning tree protocol一直無法把文章中有stp的documents給找出來

再用其他之前試驗過的同義字卻是可以成功的,顯然ElasticSearch的機制是OK的,但不知在那個環節出了錯

不斷的try-error,不停的思考,總算悟出了道理。filter的順序是 standard -> lowercase -> stop -> snowball -> synonym
用 "spanning tree protocol" 去搜尋時,從standard到stop都還不會有問題,但到了snowball filter時,filter會把spanning轉變為span,這讓我們的query string從"spanning tree protocol"變成"span tree protocol",當再進到synonym filter時,就無法轉變成同義字stp了,所以同義字的搜詢就會失敗

將filter改成[standard, synonym, lowercase, stop, snowball],把順序調者一下,這樣就解決問題了

2013/11/21

ElasticSearch

ElasticSearch是架構在Apach Lucene上,提供了

  • 更簡便的設定方式
  • distributed, cluster架構
  • RESTful介面 (JSON over HTTP)
  • schema free
  • 依舊是open source (Apache 2)
  • 很容易安裝/移除的plugins (就像是apt-get/yum般)


可以參考的電子書
http://exploringelasticsearch.com

2013/11/20

馬雲的一句話「我說台灣沒希望了,假如七八十歲的人還在創新」

最近很多人在談馬雲的一句話「我說台灣沒希望了,假如七八十歲的人還在創新」
年齡真的是創新的瓶頸嗎?如果空有二十歲的軀殼,卻少了openmind呢?

還是,這句話大家的解讀錯了
他是想說,如果台灣的年輕人創新能力都輸給七八十歲的人,那台灣真的沒希望了

2013/11/19

清掉Solr中所有資料

偷空玩Solr,當然照著 Solr Tutorial跑一次,瞭解一下它有那些features,以及熟悉一下它的界面
然後開始要做些正事了,得把之前測試的資料清掉,拜了一下Google,找到了幾種方法,可是怎麼有些是無效或有問題的

最後用了這個,解決!記錄下來,也許未來用得到
http://192.168.10.66:8983/solr/update?commit=true&stream.body=%3Cdelete%3E%3Cquery%3E*:*%3C/query%3E%3C/delete%3E

2013/11/15

SVG裡的以title來顯示tooltip

很多人都會使用HTML tag裡的title attribute來顯示tooltip
今天有一個新需求,要用tooltip來顯示動態的資料,找到server的資料來源,加點code好讓這資料能透過AJAX傳回browser端,再餵進title attribute中,打開FireFox測試,good,正確!收工!

在deploy到正式機前,心血來潮,打開Chrome再試一下
咦,怎麼沒出來?是JavaScript給cache住了嗎?清掉cache,還是一樣。不信邪,再開Opera, IE 9/10,都出不來。這就怪了,在最不會出錯的地方竟然有錯!

仔細思考一下,今天這個是SVG,難道問題在這裡?Google一下,果然已經很多前輩踩著這條足跡死在沙灘上了,真的就只有Firefox可以,其他的browsers有問題

有問題就解決吧
找了一下,是有不少tooltip framework可以用,不過我只是想show簡單的資料,不用太美觀,也不想動用太大的framework
後來找到這一篇,簡單明瞭,瞭解了它的工作原理,把概念套進我的頁面,再調調位置顏色,deploy到正式機也確定OK!收工!

2013/11/06

Ubuntu 12.04 on ThinkPad R51e 挑硬碟?

為了建開發環境,找了一台ThinkPad R51e來當測試主機
原來的硬碟是XP,我需要Ubuntu,找好從家裡找來一顆2.5" IDE的硬碟
Hitachi Travelstar 40G

灌了好幾次都失敗,每次都卡在file system error, can't create partition這樣的錯誤
找了很多資料,有說是硬碟壞了
可是用Ubuntu Live CD的check disc for defects查也沒問題
用外接盒接回windows系統也都能正常使用
後來找到一些說是Ubuntu不能灌在不支援PAE(Physical Address Extension)的CPU上,要改用Lubuntu或Xubuntu之類的
下載了Lubuntu 12.04(最後支援non-PAE的版本)來安裝,還是一樣的問題

回家,東翻西找了一番,又找到了一顆Fujitsu 的40G老硬碟
果然一次就OK

看來還真的會挑硬碟,不過這樣就浪費掉一天了

2013/10/17

避免AJAX的結果被cached

動態網頁如果被cached住,就無法取得即時的資訊
如果AJAX的資料被cached,那也是一樣

你用jQuery寫AJAX嗎?記得加上下面這行,就可以避免被cached了

$.ajaxSetup({ cache: false });

2013/10/16

HTTP compression for Jetty

HTTP compression可以將web server在將資料傳回browser前,先進行壓縮;browser收到壓縮後的資料後,先做解壓縮後再呈現出來。這好處是可以減少傳遞的資料量,讓網路的傳輸速度加快,而缺點則是要耗用兩端的CPU資源來進行壓縮。

當然,web server並不是隨意進行壓縮,必須視browser有支援何種解壓縮功能,才用合適的壓縮方法進行壓縮。一般browser在送出request時:
GET /the-page HTTP/1.1
Host: www.the-web-site.com
Accept-Encoding: gzip, deflate


在Accept-Encoding這個header parameter中,就描述了browser可以處理的解壓縮方法。Web server則會視雙方都有支援的壓縮方法來進行壓縮。

目前市面上的browsers與web servers多已經支援HTTP compression的功能(HTTP compression測試工具)。一般web server並未開啟compression的功能,這裡以 Jetty 8/9來說明如何開啟這項功能。

首先找到web.xml,然後加入下列這段code:
  <filter></filter>
      <filter-name>GzipFilter</filter-name>
      <filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class>
      <init-param></init-param>
          <param-name>mimeTypes</param-name>
          <param-value>text/html,text/plain,text/xml,application/xhtml+xml,text/css,application/javascript,application/x-javascript,application/json,image/svg+xml</param-value>
     
  <filter-mapping></filter-mapping>
      <filter-name>GzipFilter</filter-name>
      <url-pattern>/*</url-pattern>


這段設定是使用Jetty中所附的GzipFilter,可支援gzip與deflate的壓縮。
在init-param中定義了有那些MIME types是需要被壓縮的。一般而言,圖片、音樂(mp3...)、PDF等等都已經是經過壓縮的,所以並不建議再列入。
而在 url-pattern中則是定義了那個目錄要被壓縮,這裡設定整個網站目錄都列入範圍。

那要怎麼知道傳回來的是不是壓縮的格式。
可以打開browser的開發者工具,看看response headers的Content-Encoding是否為gzip等的壓縮方式。

後記:個人的測試,在Jetty 8上,好像request method只能用GET,如果用POST,則回傳資料不會壓縮。在一些文件中並沒有看到說POST的response不會壓縮。就不知是Jetty的因素?還是規格有這樣的限制了。等有空時再來研究這問題了。

2013/09/28

藍天,逐漸地被叢起的大樓切割竊佔

國美館,每個角落都值得細細品味

2013/09/06

在IE中遇到innerHTML的錯誤

工作紀錄

在寫AJAX式的網頁程式時,常會使用innerHTML來置換掉某部份內容。例如:
document.getElementById("someid").innerHTML = "xxxxxx";

今天遇到一個問題,在HTML中有
    <div id="mydiv">
        <table id="mytable" style="width: 99%px;"></table>
    </div>

然後用下列的JavaScript來填入table的內容:
      var s = "<tr><td>AAA</td><td>BBB</td></tr>";
      document.getElementById("mytable").innerHTML = s;

這樣的方式在Firefox, Chrome, Opera等都正常,唯獨 IE (8 & 9) 有問題,會出現"未知的執行階段錯誤" (unknown runtime error) 或 SCRIPT600 error。

後來發現,必須要用下列的方式才能滿足這四種browsers。
      var s = "<table id="mytable" style="width: 99%px;"><tr><td>AAA</td><td>BBB</td></tr></table>";
      document.getElementById("mydiv").innerHTML = s;
 
猜測:IE在填值到innerHTML時,可能會檢查所填入的內容。前面的例子只填入table的內容,沒有包含<table></table>的tag,IE可能認為這是不完整的內容而發生錯誤。後者則因包含了<table></table>tag,是完整的語法,因此就能接受。

後來也試了<select> tag,如果只給innerHTML一堆<option> tags,也是會有這樣的錯誤,若是包含select tag就OK了。

呼叫SVG裡的javascript method

工作筆記

A.html中用下面的tag包含了一個SVG

在B.svg中有一個JavaScript function: myfunction()

如果要從A.html呼叫B.svg裡的這個function,可以用下面的方法來進行
document.getElementById("svg").getSVGDocument().defaultView.myfunction();

2013/08/17

如何在關掉SqlDataReader時也關掉SqlConnection

在C#中以ADO.NET連接資料庫,遇到一個應用是method A去呼叫method B,B開啟一個SqlConnection物件後,執行select statement,將獲得的SqlDataReader傳回給A使用。

在method A中使用SqlDataReader後,可以將SqlDataReader關閉(close),來加速回收此物件的速度。可是,在method B中的SqlConnection就沒有辦法做close了。

當然我們不能在離開B時就把SqlConnection就close掉,因為在method B中執行SqlCommand.ExecuteReader時,並不是一次就把所有的result set都放進SqlDataReader中,而是以stream的方式透過SqlConnection傳進來。所以如果先把SqlConnection關了,SqlDataReader也就讀不到資料了。若是SqlConnection不關閉,又會在一段時間中佔用database connection與相關資源。

後來在網路上找到了這一篇
http://codes.codedigest.com/CodeDigest/164-Implicitly-Closing-the-Connection-object-when-SqlDataReader-is-returned-from-a-Function.aspx

特別注意到這一行
SqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);

如果在ExecuteReader加入參數CommandBehavior.CloseConnection,則當對SqlDataReader進行close時,也會將其底層的SqlConnection也關掉。這樣,就可以適時地把SqlConnection關閉,儘早釋放出資源。這對尤其是server-side的系統來說,相當重要。

2013/08/13

在Chrome中,iframe中呼叫parent function的問題

在開HTML發網頁時,Page A以iframe的方式包含了Page B,而B則會下列方式呼叫A的function。
parent.test('abc');

當執行到這行呼叫時,chrome會丟出錯誤
Blocked a frame with origin "null" from accessing a frame with origin "null". Protocols, domains, and ports must match.

一直無法瞭解這錯誤的成因,也不知怎麼解決。
但後來發現,如果把Page A, B放進server (如Tomcat),瀏覽器是以http://的方式去執行,就可以正常作業;而原來是以瀏覽器直接開檔案的方式來測 (用file://),就會有前述的問題。

嗯...這個問題花了我5小時...

2013/08/08

Drools Expert 6.0 beta 試玩

前言
最近可能會接觸expert system,經過一些study,焦點放在三個
參考了一些評比
  • http://illation.com/banking-benchmark-performance-jess-vs-drools/
  • http://www.integratingstuff.com/2010/07/18/rule-engines-in-java-jboss-drools/
由於Drools是open source,且效能並不遜於其他兩個商業軟體,所以就先從Drools開始玩起了

下載與安裝
Drools的下載頁 http://www.jboss.org/drools/downloads
由於目標是在Drools Expert上,依據description的描述,就下載Drools。我下載的是6.0.0 beta 5,大小約114M。6.0版與前版之差別可以參考這裡。解開壓縮檔後,裡面包含開發所需要的jar files, 還有原始碼、javadoc、參考文件與範例等。
如果要安裝eclipse的plug-in,

  1. 參考http://docs.jboss.org/drools/release/5.5.0.Final/droolsjbpm-introduction-docs/html_single/index.html#d0e95,先以2.1.3.1方式安裝GEF
  2. 安裝Drools plug-in:以eclipse的 Help | Install New Software,在Location輸入 http://download.jboss.org/drools/release/6.0.0.Beta5/org.drools.updatesite 來進行安裝。(或是先用瀏覽器到http://download.jboss.org/drools/release去尋找相對應的版本目錄)
  3. 在 http://www.jboss.org/drools/downloads.html 下載  Drools and jBPM tools,解壓縮至硬碟
  4. 再以1.中文件 2.1.3.4 所述方法,設定 drools runtime
程式開發
接下來我們來進行程式的開發。先在eclipse中建立新的專案,記得在專案的properties之Java Build Path裡,新增一個library,把上圖中binaries下所有的jar files都加進來。

首先我們來撰寫rule的部份:
colorRule.drl 

rule "red"
when
color:Color(color=='red')
then
System.out.println("#ff0000");
end

rule "green"
when
color:Color(color=='green')
then
System.out.println("#00ff00");
end

rule "blue"
when
color:Color(color=='blue')
then
System.out.println("#0000ff");
end
這裡我們定義了三個rule,讓三種顏色的名稱對應到其color code。

接下來Java來開發程式。首先需要一個entity object

Color.java

public class Color {
private String color;

public Color(){}
public Color(String color) {
this.color = color;
}

public String getColor() {
return color;
}

public void setColor(String color) {
this.color = color;
}
}
然後再一個帶有main()的可執行程式
DrColor.java

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;

import org.drools.compiler.compiler.DroolsError;
import org.drools.compiler.compiler.DroolsParserException;
import org.drools.compiler.compiler.PackageBuilder;
import org.drools.compiler.compiler.PackageBuilderErrors;
import org.drools.core.RuleBase;
import org.drools.core.RuleBaseFactory;
import org.drools.core.StatefulSession;


public class DrColor {
private RuleBase rbase = RuleBaseFactory.newRuleBase();
private PackageBuilder pbuilder = new PackageBuilder();
private String DRL_FILE = "colorRule.drl";

private void initDrools() {
// read DRL file and add to package builder
try {
Reader reader = new InputStreamReader(DrColor.class.getResourceAsStream(DRL_FILE));
pbuilder.addPackageFromDrl(reader);
} catch (DroolsParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

PackageBuilderErrors errors = pbuilder.getErrors();
if (errors.getErrors().length > 0) {
System.out.println("ERROR:");
for (DroolsError err: errors.getErrors()) {
System.out.println(err);
}
throw new IllegalArgumentException("Could not parse knowledge");
}

// add package to rule base
rbase.addPackage(pbuilder.getPackage());
}

private void determineColor(String col) {
Color c = new Color(col);
StatefulSession session = rbase.newStatefulSession();
session.insert(c);
session.fireAllRules();
}

public static void main(String[] args) {
DrColor m = new DrColor();
m.initDrools();
m.determineColor("blue");
m.determineColor("red");
}
}

當執行時,若能看到#0000ff與#ff0000,就表示Drools Expert可以正常執行了。
接下來,就要由你來發揮想像力,讓這專家系統發揮效力了。

參考文件:
Drools Expert User Guide 6.0 beta
Drools Documents

2013/07/22

the type or namespace name "xxxxxxxxxx" could not be found

[PROBLEM]
在Visual C# 2010,有project B的程式中使用到project A的class AA。AA有設為public,且project B的reference也有加A。
Design time時,在B的程式中用到AA,auto-complete都沒問題。
但是要執行時做build,就出現 the type or namespace name "xxxxxxxxxx" could not be found的錯誤

[SOLUTION]
錯誤主要是來自各project的target framework不一致。剛查了一下,project A的target framework是 ".NET Framework 4",而project B的則是 ".NET Framework 4 Client Profile"。
將project B也設為".NET Framework 4"就沒問題了。

target framework要在那裡設?點選你的project後,主選單 Project | xxxxxx Properties,在Application tab中就可以找到了。

2013/07/09

Visual Studio為什麼不會提醒我要加try/catch

最近使用Visual Studio 2010寫些C#的程式,有一點不太習慣的地方是,VS不會要求你那裡要加try/catch (用慣VS的人應該不會覺得不習慣啦,是我這種用過Java的人才這麼感覺吧)
這好處是可以忘了有exception這回事,就暢快的跟著happy path寫下去;可是,人生總是不會如此美好,該出錯的地方一定會出錯的
那開發者就很難去預想run-time時那裡會出錯,就算有心想去加try/catch,也不知道那些method會丟出exception,又會丟出那個exception class (除非去翻文件,可是,這不是IDE應該幫PG減輕負擔的地方嗎?)
結果,就加了一堆都是catch Exception的code

有Java開發經驗的人,應該會知道method後面會定義要丟那些exception,如:
public void foo() throws IOException, ParseException

在Eclipse, NetBeans等這些免費的tools裡寫程式,IDE總會提醒你那個method會丟出exception,你必須加try/catch或是在目前的method中加上throws。

一直在想,為什麼Java的工具可以做得到,Visual Studio卻沒這功能,而且VS經過這麼多代了,難道VS的users都不用這些功能?或是不抱怨VS沒有這樣的功能?
查了一下,確實還有些users在抱怨,可是...就是做不到

後來研讀了一下,推測了VS為什麼沒有這樣的功能 (對.NET我還不是很熟,所以有說錯敬請見諒,也請指教)

因為像在C#裡method的定義,並沒有像Java的throws的宣告
在Java的工具中要做到這樣的功能很容易,tool只要去查你叫用methods的宣告,就可以知到這些methods有沒有丟exceptions,丟怎樣的exceptions,然後再提醒PG要處理,但是.NET中method並沒有這樣的宣告,如果VS要做到這樣的結果,就必須去scan所有使用到的methods的內容,然後一層一層往上追上去,即使已經翻成MSIL的library也必須要去追

Java只要追你叫用到的那些methods的宣告;.NET則要追你叫用到的那些methods的內容,還有他的祖宗八代、親戚五十等等所有相關到的內容

這也可以體諒為什麼VS/.NET不提供這樣的功能了,實在是做不到 (應該說很難做到,如果要做,用VS寫程式應該會lag蠻嚴重的)

所以,用VS寫程式,就先當個happy PG吧
exception,等被丟出來再說吧

2013/07/06

賈伯斯的 10 個簡報技巧


賈伯斯的 10 個簡報技巧

  1. 圍繞主題 :賈伯斯在2008年發表MacBook Air時,一開場就說:「今天的空氣裡有些不同的東西。」是個相當巧妙又點出主題的隱喻。

  2. 展現熱情 :賈伯斯總是用awesome、cool的字眼來感染全場的情緒。

  3. 列出大綱 :賈伯斯的演說段落分明,一張簡報搭配一個主題,段落間的安排與串連也十分流暢,給予觀眾層次感,可以跟著演說節奏前進。

  4. 提供有意義的數字 :例如iPhone在200天總共賣了400萬支,這樣的說法對觀眾沒有太大的意義,但是當賈伯斯進一步解釋:iPhone每天可以賣出2萬支。這數字背後的意義代表著Apple是美國的市場龍頭。

  5. 打造令人難忘的一刻 :賈伯斯從牛皮紙袋裡拿出超薄MacBook Air的那一幕,是許多人終生難忘的場景。

  6. 視覺化的呈現 :很多人喜歡在簡報中放滿複雜的文字與圖表,但賈伯斯則讓投影片只呈現簡單的字詞與圖片,讓大家把焦點集中在產品身上。

  7. 簡報是一場表演 :通常賈伯斯的簡報,會穿插圖片與影片,再加上產品展示與現場來賓,就像一場電影或舞台劇一樣精采。

  8. 不要因為小錯誤而壞了大局 :發生狀況時,記得用幽默化解尷尬就好。

  9. 推銷產品的好處 :別忘了科技突破的目的,是要帶給消費者價值與好處。例如:MacBook Air是最輕薄的筆記型電腦,iTunes是下載音樂與電影的更佳方式,而不是容量、速度或輕薄等技術面的突破。

  10. 不斷練習 :賈伯斯能做出精采的簡報,並不是因為他是天才,而是因為他在每一場簡報前都經過長時間練習並測試每個細節。

[摘自 http://www.master60.com.tw/book.php?mg_pk=551]

2013/06/15

登山有感

走在大坑的十號步道
有人快步疾行,很快就到了山頂
有人徐徐而行,有人走走停停,有人氣喘噓噓
但只要不放棄回頭,堅持走下去,一定都可以到山頂

而不管你登頂快或慢,最後也都要下山
回到最初的起點,結束這個旅程

我還是喜歡陪著老婆,慢慢的走到山頂
一邊品味那新鮮的空氣,一邊發掘步道旁小花小草小蟲小鳥
而且到了山頂,沒有人可以一起分享那種愉悅,那到山頂的快樂就少了

2013/06/10

jQuery AJAX的怪現象

在使用jQuery,以下列AJAX方式來取得回應時,如下程式,browser發出request後,進入到error的error handler。檢視xhr這個回傳物件,發現status是200 OK,responseText裡也有回傳回來的JSON物件。但一直沒有頭緒這樣為何會進入到error handler。

var url = "";
$.ajax({
    url: url,
    type: 'GET',
    dataType: 'json',
    error: function(xhr) {
      alert('Ajax request error.');
    },
    success: _display
  });


後來查了資料發現,如果dataType定義為 'json',jQuery會去檢查responseText的內容是否符合JSON的語法定義,並將responseText的內容轉變為JavaScript的物件(Evaluates the response as JSON and returns a JavaScript object. )。所以,如果回應的內容有JSON syntax error的情況,便無法順利轉成JavaScript物件,也就會去trigger error handler了。

所以我的問題就應該是在回傳的JSON內容有問題。使用JSON validator去檢查,果真如此
(網路上有不少JSON validator,可以查一下。我常用的是 http://jsonlint.com/) 。修改一下server side的回傳程式,就OK了。

2013/03/09

千萬損失的慘痛教訓


這是一個蠻慘痛的case study,值得借鏡
很多人會有「這麼衰的事不會發生在我身上」,其實這就是一個組織對「萬一」的代價的忍受程度了
也所以有那麼多的公司會願意引入發展流程,來降低「萬一」的發生機率
因為「萬一」如果發生,除了這個case有危機造成損失外,賠上的聲譽更是難以估算,甚至還丟了長期客戶的忠誠度

文章共六篇,有點長,但是蠻值得花些時間看

千萬損失的慘痛教訓(一)
http://ideas.esast.com/?p=422

千萬損失的慘痛教訓(二)
http://ideas.esast.com/?p=475

千萬損失的慘痛教訓(三)
http://ideas.esast.com/?p=576

千萬損失的慘痛教訓(四)
http://ideas.esast.com/?p=576

千萬損失的慘痛教訓(五)
http://ideas.esast.com/?p=709

千萬損失的慘痛教訓(六) –完結篇
http://ideas.esast.com/?p=770

2013/01/05

好文,留個紀錄

最近看到兩篇關於投資概念的文章,留個記錄

來自巴菲特、博格爾和佛陀的投資智慧
http://cn.wsj.com/big5/20130104/inv072020.asp

一部曲-人棄我取篇/賈乞敗-窒息量出現該買進嗎?新低量必有新低價嗎?
http://www.wretch.cc/blog/phigroup/16553240