2015年1月4日 星期日

[Raspberry Pi] PCSC-Tools 試玩心得。


背景知識


Answer To Reset (ATR)


把一張智慧卡插入終端機端後,智慧卡的接腳會連結至終端機端的接腳;第五支接腳會啟動正確的順序,接著智慧卡會自動執行 power-on 的reset 動作,同時送 ATR(Answer To Reset)給終端機端(電腦上的程式);終端機端會評估這個 ATR,看出智慧卡裡面紀錄的各項參數資訊和資料傳送內容(例如傳輸的方式是否使用加密,或是協定為T=0 或T=1)。

網路上有人把目前常見的ATR收集後,便可輕易的知道,此張卡是那一個單位發出來的。

http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt

參考網址

http://140.134.131.145/upload/paper_uni/911pdf/910139.pdf

-----------------------------------------------------------------------------------------------------------

環境設定


首先我們來先來裝pcscd (PC/SC Smart Card Daemon)

sudo apt-get install pcscd


接下來安裝PCSC-Tools

sudo apt-get install pcsc-tools


現在可以來試看看卡片能否被正確讀取(放入健保卡一張)

輸入 pcsc_scan



































列出了卡片的ATR ,以及針對ATR內容所做的分析。 最後跟據smartcard_list.txt 分析出這張卡是 National Health Insurance Card, Taiwan (台灣國民健康保險卡,也就是健保卡)




接下來我插入郵局的提款卡






































沒錯,ATR 分析出來,是台灣中華郵政ATM卡。

可惜新辦的自然人憑證並沒有被識別出來 ,台灣銀行的卡也被視為是ATM card for Chunghwa Post , Taiwan  。

關於ATR 的List,可以參考下列網址
http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt

以下為smartcard_list 中 華郵政卡ATR截圖




以上為試玩心得。

2015年1月3日 星期六

[postgresql] 移除 carriage return value的方法

今天在嘗試用 NpgsqlCopyIn  時,遇到了語法錯誤,因為內容含有  carriage return 。















wiki 這樣說
電腦早期引用了許多電信概念與技術。早期制定的代碼如ASCII(現今仍沿用)和EBCDIC與後期的Unicode都包括「歸位」控制字元。計算機和印表機的文字排列與電傳印表機幾乎相同。 在電腦上,編輯軟體中歸位鍵一般用於結束一行文字輸入,並將游標移到下一行的開始位置,選單或選項窗口中一般用於確認當前選項。
ASCII編碼中,歸位的編碼是十進位的13,或十六進位的\0x0D。
C語言或部份其他語言,會用\r來表示這字元。依照作業系統的不同,有時會配合換行字元\n使用。在不少文字編輯器中,有時也會用 ^r 或 ^M (相當於 Ctrl-M) 來表示。
簡單來說就是你的資料中含有換行符號,在生成SQL語法時會出現錯誤(使用NpgsqlCopyIn)時才會。順手查了一下要怎麼查出含有NpgsqlCopyIn 的資料呢?請參考以下語法

select regexp_replace(field, E'[\\n\\r]+', ' ', 'g' ) from Table

field  指的是欄位名稱 (column name)


資料來源Stack Overflow


以這個資料表為例














select regexp_replace(name, E'[\\n\\r]+', ' ', 'g' ) from animal




[HTML5] 撥放MP4

前一陣子忽然想起之前去上的HTML5 課程,HTML5 可以撥放影片格式如下 ;











資料來源W3Schools


我們要撥放一個Mp4檔案的話,最直接的方式是在<Body>....</Body> 中放了一個

<video> Element


並指定source 來源。


<video width="480" height="320" controls>
  <source src="movie.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>


你會看到如下的結果














video element 中的width指的是播放畫面的寬度,height是高度。

假如你的影片是1920 x 1080 , 當指定width及height後,就會將影片

畫面縮放至480 x 320 ,而不是截到某一區塊而以,當然如果你不指定width及height,

影片有多大,撥放區塊就會放到多大。

controls 表示要顯示控制工具列,如果沒有打這個,只會有撥放的區域而以。

結果如下:














Your browser does not support the video tag.
如果您的瀏覽器不支援HTML5 或是video element 則會看到這個。
下圖是IE 6 執行結果。



























今天我要實作一個可以選置檔案來撥放的HTML5網頁,我必須另外實作一個
檔案選擇器,其實也是用一個<input> tag 就可以達成。


 <input type="file" id="files" name="files" accept="video/*"/>  

結果如下圖,會出現一個檔案選擇器 ,不過每一種瀏覽器出現的場子會不太一樣。下面這個是chrome的。






IE 6 會長這樣





I
E 11 長這樣






FireFox 長這個樣子




accept="video/*"/


其實是一種檔案過濾器,只能選擇video 類型的檔案,不加就可以任意選擇所有類型的檔案,但不一定能播放就是了。


當你點下瀏覽(選擇檔案) ,會跳出檔案選擇對話框。





選擇檔案完成後會顯示剛才所選的檔案。






選擇檔的功能到這裡算完成50%了,接下來是當我選擇好檔案後要如果把它指定給video撥放,必須透過javaScript寫一個fucnction來實作這段功能。


  <script type="text/javascript">  
       function handleFileSelect(evt) {  
         var files = evt.target.files; // FileList object  
         var file = files[0];//First File in FileList object  
         var video = document.getElementById('myVideo');  
         var myURL = window.URL || window.webkitURL;          
         var fileURL = myURL.createObjectURL(file);  
         video.src = fileURL;  
       }  


一步步來解釋每一行程式碼。


 var files = evt.target.files;  

當選擇完畢檔案後,取得所選擇的檔案清單。(input可以設定成多選)

  var file = files[0];  

取得所選取的第一個檔案,實際上我們沒有設定多選,所以只能選擇一個檔案。

 var video = document.getElementById('myVideo');   

以video的id 取得video element

 var myURL = window.URL || window.webkitURL    

這行是用來取得URL物件,判定瀏覽器是否要使用prefixed ,chrome必須用window.webkitURL ,firefox則使用window.URL  , 這也寫是為了相容於多種瀏覽器。

 var fileURL = myURL.createObjectURL(file);   

我們要撥放檔案,必須要把它轉換成URL的格式。

 video.src = fileURL;   

指定video 的src (相當於在source 中指定src)。

將input設定一個change事件(選擇的檔案改變後要執行的function)

  function init()  
       {  
         document.getElementById('files').addEventListener('change', handleFileSelect, false);  
       }  

記得在 body 中寫一個事件在網頁載入後去執行init註冊input的change事件。
 onload="init()"  



最後是完整程式碼

 <html>  
   <head>  
     <title>Html5 Mp4</title>  
     <meta charset="UTF-8">  
     <meta name="viewport" content="width=device-width, initial-scale=1.0">  
     <script type="text/javascript">  
       function handleFileSelect(evt) {  
         var files = evt.target.files; // FileList object  
         var file = files[0];//First File in FileList object  
         var video = document.getElementById('myVideo');  
         var myURL = window.URL || window.webkitURL;                       
         var fileURL = myURL.createObjectURL(file);  
         video.src = fileURL;        
       }  
       function init()  
       {  
         document.getElementById('files').addEventListener('change', handleFileSelect, false);  
       }  
     </script>  
   </head>  
   <body onload="init()">  
     <input type="file" id="files" name="files" accept="video/*" />  
     <br>  
     <br>  
     <video id="myVideo" src="" autoplay controls width="480" height="320" >  
       <p>Your browser does not support H.264/MP4.</p>  
     </video>      
   </body>  
 </html>  

執行結果


















當然你也可以按下控制列上的全螢幕鍵享受全螢幕撥放