網頁

2012年8月30日 星期四

還沒成為標準,就已經鬧分家的HTML5

原本在HTML5標準制定上合作的標準制定組織WHATWG和W3C 分手了。
WHATWG宣佈正在為HTML制定一個 living standard ,它將隨著新技術的加入而不斷進化,但也變得更複雜。
而 W3C 依舊採用傳統的方法來制定標準,將需要耗費許多時間來完成 HTML 標準訂定。
看起來不是個良性發展,因為以後開發者要討論時,要先確認是那個版本?
閱讀全文...

2012年8月28日 星期二

NFC給人便利的同時,卻也隱藏著很大的危險

當下 NFC 技術的主要作用於快速的傳輸檔案、簽到、執行預定的動作,進行行動支付等等,可以說在很大程度上方便我們的生活,但往往也成為駭客想覬覦利用,入侵智慧手機的最佳途徑。

今年舉行的黑帽技術大會(Black Hat)上,來自安全諮詢公司(Accuvant)的首席顧問 Charlie Miller 發表了如何利用 NFC 技術以及智慧手機上相應了漏洞,完成對智慧手機的入侵攻擊。

第一個腳中了一箭的是 Android。Miller 通過使用一個定制的 NFC 標籤,讓 Android 手機與該標籤連接之後,便會向手機發送一段惡意代碼,讓手機打開惡意檔案或惡意的網頁,進而完全控制手機。目前大部分的 Android 手機上都有部分的 NFC 漏洞,並且在Android 4.0系統中,Google 還為具有 NFC 功能的手機添加了一項 Android Beam 功能。利用 NFC 漏洞以及 Android Beam 功能在接觸或者靠近 NFC 標籤時可以自動下載檔案或打開網頁鏈結。利用此一漏洞,便可以使用特製的 NFC 標籤,在沒有用戶進行任何操作以及未經用戶許可的情況下,打開手機流覽器,並且訪問惡意網頁。

另一個因 NFC 而腳上也中了一箭是 Nokia 推出的 N9Miller 表示利用 NFC 技術攻擊 N9 比 Android 更簡單。其中 N9 第一次通過 NFC 連接藍牙設備時完全不需要人工配備,這是最為危險的地方。

Miller 已經向 Google 和 Nokia 報告了相關問題。基本上這類問題應可以通過系統升級的方式解決,此外養成良好的軟體使用習慣更是杜絕駭客攻擊的最好方法。
閱讀全文...

Java 7 漏洞危及 Mac 機用戶

根據 computerworld 的消息指出安全專家又發現新的 Java 危機,可能會危發許多 Mac 用戶了!
這次是從 Java 7 中找到的,此 Bug 可以透過 Browser 操控電腦。暫時尚未有 Patch 推出,但對 Mac OS X Lion 及 Mountain Lion 用戶可能影響比較少,因為自 Lion 起已經沒有內置 Java 於系統裡。
但是,Lion 之前的版本就要小心了!安全專家表示,現在最佳的防護方式是刪除 Java,等待修正版推出才重新安裝。
閱讀全文...

2012年8月23日 星期四

Read Excel(xls) with Java

這原本是客戶的需求,產出的文件希望從pdf改成excel,雖然最後需求被否決了,還是花了點時間了解一下,避免到時回馬槍,殺得措手不及。

沒想到用 java 還蠻幸福的,Apache 提供了一組 API 來操作微軟的文件,所以相關的 jar 檔和文件都可以在 官網 Apache POI - the Java API for Microsoft Documents 找到,這時最新版本是3.8。

接下來就來小小的測試一下:
仔細看了文件,不同的 excel 版本所需的 API 不同,Office 2007(+) 包含了 xml ,至於之前的版本使用OLE2,因此提供不同的 API 來處理不同版本的文件。

事前準備:Book1.xls 文件(即2007以前的版本),內容如下:


從官網下載下來那一整包裡面包含一堆jar檔,這次範例只用到poi-3.8-20120326.jar,記得將它加到CLASSPATH裡面。

如果沒有用IDE之類的編輯器,可以像我一樣,使用bat file,做些設定就可以編輯測試,這樣就不用每次測試個小程式,還要搬出每隻大怪獸。
build.bat 內容如下(請改成你自己使用的相關目錄):
@echo off set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_14 set PATH=%PATH%;%JAVA_HOME%\bin set CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\jre\lib;D:\Study\java\apache\poi-3.8\poi-3.8-20120326.jar echo ***** Compile %1.java Start ***** javac %1.java pause
run.bat 內容如下(請改成你自己使用的相關目錄):
@echo off set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_14 set PATH=%PATH%;%JAVA_HOME%\bin set CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\jre\lib;D:\Study\java\apache\poi-3.8\poi-3.8-20120326.jar echo ***** Run %1 Start ***** java %1
ReadXls.java
import java.io.FileInputStream; import java.io.IOException; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFRow; public class ReadXls { public static void main(String[] args) { try { POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("Book1.xls")); HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFSheet sheet = wb.getSheetAt(0); System.out.println("LRM="+sheet.getLastRowNum()); System.out.println("PNOR="+sheet.getPhysicalNumberOfRows()); for (int idx=0; idx<sheet.getLastRowNum(); idx++) { HSSFRow row = sheet.getRow(idx); System.out.println( String.format("%s\t%s\t%s\t", row.getCell(0).toString(), row.getCell(1).toString(), row.getCell(2).toString() ) ); } System.out.println("============================================"); for (int idx=0; idx<sheet.getPhysicalNumberOfRows(); idx++) { HSSFRow row = sheet.getRow(idx); System.out.println( String.format("%s\t%s\t%s\t", row.getCell(0).toString(), row.getCell(1).toString(), row.getCell(2).toString() ) ); } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
編譯:
D:\Study\java\apache\poi-3.8\test>build.bat ReadXls ***** Compile ReadXls.java Start ***** 請按任意鍵繼續 . . .
執行及結果:
D:\Study\java\apache\poi-3.8\test>run.bat ReadXls ***** Run ReadXls Start ***** LRM=3 PNOR=4 日期 姓名 電子信箱 21-八月-2012 Apple apple@test.com 19-八月-2012 Bill bill@test.com ============================================ 日期 姓名 電子信箱 21-八月-2012 Apple apple@test.com 19-八月-2012 Bill bill@test.com 18-八月-2012 Cat cat@test.com
後記:
無意間發現了API在取得Row個數時,提供了不同的method,getLastRowNum()和getPhysicalNumberOfRows(),這兩者差異,需要再仔細的研究研究。

閱讀全文...

紙模:Hello Kitty 麥麥幫


好久沒玩紙模,趁現在爭議不斷的麥麥幫,趕潮流做了hello kitty,左邊是原本的版本,另兩隻麥麥幫是用小畫家改圖紙再製作完成。
原本版本

漢堡神偷裝扮

麥當勞叔叔裝扮

三隻一起來

閱讀全文...

別再留戀Flash了

火紅的flash經歷了各網站都要用flash來展示其所有內容的全盛時期後,現在慢慢的已經被網路洪流給淘汰掉了。
這隻又大又充滿bug的巨獸,在這智慧型手機當道的時代,在使用者的眼中完全是個用起來會lag,還會造成手機當掉的怪物。
從apple開第一槍,慢慢個平台都不支援flash,轉而支援html5,別跟潮流過不去,別再製作flash網站。
閱讀全文...

2012年8月9日 星期四

Use java to list all directorys and files in directory 列出目錄下的所有根目錄和檔案

列出目錄下的所有子目錄和檔案是個很常用的功能,底下是個 java sample
1. 先用 list() 取得該目錄裡的所有檔案和子目錄
2. 用 isFile() 檢查是否為檔案或用 isDirectory() 檢查是否為目錄
其中 list() 與 listFiles() 差別,在於list()只會列出檔名,listFiles()會將完整的路徑和檔名顯示出來

import java.io.File; import java.lang.SecurityException; class FileT { public static void main(String args[]) { String path = "C:\\temp\\"; File fd = new File(path); try { File f; String fileNames[] = fd.list(); System.out.println("總共有"+fileNames.length+"個檔案"); for (int i=0; i<fileNames.length; i++) { f = new File(path + fileNames[i]); if (f.isFile()) { System.out.println("File="+fileNames[i]); } if (f.isDirectory()) { System.out.println("Dir="+fileNames[i]); } } File[] files = fd.listFiles(); for (int i=0;i<files.length;i++) { if (files[i].isFile()) { System.out.println("File="+files[i]); } if (files[i].isDirectory()) { System.out.println("Dir="+files[i]); } } } catch(SecurityException e){ System.out.println(e.getMessage()); } } } 結果顯示:
File1 File2 File3 C:\temp\File1 C:\temp\File2 C:\temp\File3

閱讀全文...

2012年8月8日 星期三

網頁文章的程式碼區塊

用 css 幫 blog 的文章裝扮一下,為了好區分文章的內文和程式碼,最後將寫好的 css 加入 BLOG 的範本裡,以後就很方便用了。

使用方式就是將程式碼用 <code></code>包起來,就用 css 的 code 當內容來顯示成果吧
code { display: block; font-family: Courier New; font-size: 80%; color: white; background-color: navy; padding: 10px 5px 5px 20px; white-space: pre; } code.cmd { background-color: black; }
又加了一個 cmd 用來顯示命令,unix用太多了,常會有這需求。
使用方式 <code class="cmd">command</code>,顯示如下
command

css 說明:
將 <code> 改成區塊元素(block element),字型設定成 Courier New,字型大小為文章的 80%,字型顏色則是白色,背景改為深藍色(cmd改為黑色),另外給上下左右都增加一些空間,最重要是加上 white-space: pre 將元素內的空白保留。
閱讀全文...

2012年8月6日 星期一

How to add column from exist table with SQL Server(如何在SQL Server以存在的Table中新增欄位)

SQL SERVER在已存在的資料表新增一欄位
指令:
ALTER TABLE table_name ADD column_name datatype
閱讀全文...

How to remove column from exist table with SQL Server(如何在SQL Server的Table中刪除欄位)

SQL SERVER 從存在的資料表刪除一個欄位
指令:
ALTER TABLE table_name DROP COLUMN column_name
閱讀全文...

How to resize column from exist table with SQL Server(如何在SQL Server中調整table的欄位大小)

Resize column from exist table with SQL Server
指令:
ALTER TABLE table_name ALTER COLUMN column_name datatype(size)

NOTE:如果現有欄位資料大於要調整的大小,指令將不會被執行
閱讀全文...