2012年10月17日

Learning Perl 1


數值字面值(literal)
l   123_456_789 用來代表123,456,789 因為逗號在Perl裡有別的意義,所以用底線來分辨數值,方便!
l   一律背精度浮點數
l   -6.5e24 代表 -6.5乘上1024次方
l   0開頭8進位,0x開頭16進為,0b開頭2進位

字串字面值:
l   單引號內只有 \\ \’ 才有意義,分別代表反斜線和單引號,\n \b等等無意義
l   雙引號才有 \n \b \r,還有變數安插(variable interpolated) 這個大絕招!
l   字串運算符「.」可以連接單引號或雙引號的字串。「x」後接數字可重複字串。

純量變數:
l   錢字號「$」開頭,後接Perl識別字,以底線、字母、數字組成,但不以數字開頭,區分大小寫。

PerlBoolean
l   數值:0為假,其餘為真
l   字串:空字串為假,其餘為真
l   若非數值也非字串,就先轉換為數值或字串再判斷
l   字串’0’ 因為跟數值 0 一樣,所以也為假
l   因為perl沒有代表boolean的純量值,所以用「!!」將變數二度轉換成01

其他
l   <STDIN> 讀取鍵盤輸入值
l   chomp函式 將字串結尾的換列字符移除,回傳值為被移除的字符數,也就是1
l   純量變數尚未給值時即為undef,當成數值為0,當成字串為’’,但undef既非數值也非字串
l   defined函式 對變量做判斷,為undef傳回false,非undef則傳回true

2012年9月20日

ArrayList V.S. LinkedList

如標題看到的這兩種JAVA集合物件的比較可以在google搜尋到一堆
不過找到的內容通常都是說
ArrayList因為是用陣列索引值來紀錄
因此在檢索的時候可以很快取得對應位置
但是在插入刪除的時候為了其後續的資料搬移則會影響效能

而LinkedList因為用的是節點之間的pre post來記錄
因此與ArrayList相反的是檢索耗時
插入刪除只需要將其pre post的指標指到另一個新節點
故其在插入或刪除的效能會來的比ArrayList要好

就在剛才做了一個實驗
分別將ArrayList和LinkedList都先置入50萬筆Integer的資料
接下來用list.add(int index, new Integer())的方式隨機置入1萬筆資料
結果如下圖所示















LinkedList完全就沒有比ArrayList快,反而慢了五倍以上


接下來用list.get(random.nextInt())隨機挑選兩集合中的物件
一樣是反覆1萬次,結果如下















可以看出來ArrayList在取得索引位置確實比插入來的快許多
而LinkedList一樣是..........

原因或許是因為ArrayList搬移複製資料的速度非常之快以至於對效能影響不大
而LinkedList光是要找出某個指定位置的值就不知道要靠pre post尋到何時了
等到他費了好大的功夫終於找到所要的位置時
才正要開心的將其pre post指標置換時
ArrayList早八百年前就結束了工作!!!

以下為測試原始碼

import java.util.*;

public class LinkedListVSArrayList{
 public static void main(String[] args){
  int VALUE_NUMBER = 500000;
  ArrayList<Integer> array = new ArrayList<Integer>();
  LinkedList<Integer> linked = new LinkedList<Integer>();

  for(int i=0; i<VALUE_NUMBER; i++){
   Integer integer = new Integer(i);
   array.add(integer);
   linked.add(integer);
  }

  //ArrayList
  computeTimeWaste(array, VALUE_NUMBER);

  //LinkedList
  computeTimeWaste(linked, VALUE_NUMBER);
 }

 public static void computeTimeWaste(List<Integer> list, int VALUE_NUMBER){
  Random random = new Random();
  int temp = 0;
  long beforeTime = System.currentTimeMillis();

  for(int i=0; i<10000; i++){
   //插入
   list.add(random.nextInt(VALUE_NUMBER), new Integer(5));

   //取得
   //temp = list.get(random.nextInt(VALUE_NUMBER));
  }
  long wasteTime = System.currentTimeMillis() - beforeTime;
  System.out.println(list.getClass().getName() + " random many times: " + wasteTime/1000F);
 }
}

2012年9月6日

是打口號還是真正內化

剛才突然想到才又去google了一下正規化這東東
才發現以前大學的時候怎麼看都看不懂的東西
現在竟然覺得怎麼好像都講一些本來就該這樣的道理
想想碩一上的Data Model那堂課上不斷的在辯論ERD
但是老師從未提到正規化這個名詞
雖然老師一再強調說以他的方式根本不需要正規化
但現在想想其實是在建模的過程中把那些不該出現的問題都屏除了
只是我們不遵照正規化的步驟來一步一步做罷了

那麼正規化這個名詞和那五個步驟看來應該就是前人專家們
因為在關聯資料庫的發展當中看見了一些不太好的問題
所以把那一系列問題已規則的方式流程化出來
讓之後要建模的人有一個流程可以遵照著做
大概也是因為這樣所以大學在教關聯資料庫的教科書上都會有正規化部分
讓他有一個看起來正式的流程使學生比較有系統的學習

但是只是背背甚麼1NF、2NF和他裡面的甚麼重複性、遞移性的blabla...
根本無法真正理解到其中的奧妙之處
除非不斷的以實際操作和真實問題來思考這些東西才能漸漸的將他內化成感覺
等到有了這種感覺的時候根本也就不需要這些步驟了

另外最近在接觸的物件導向設計模式看來也是類似的發展
前人在實戰中遇到的不良問題和解決方法把他創造出了那堆模式
如果學習的人只是看看口號想想書中的範例程式應該很難將他內化成感覺
其實身旁的開源程式碼中就有很多模式的案例
有事沒事就想想SE或某開源框架的實作方式是在實現哪種模式也是很好的學習

2012年8月14日

JSON格式

最近在學JavaScript
也是第一次接觸JSON這個東西
基本上它就好像是XML
不過看起來比XML更簡單明瞭
而且JavaScript內建API可以將它轉成物件
然後我就開始來實作看看囉~

我用XMLHttpRequest來取得他並想要將它顯示到頁面上
可是Chrome在我執行到
JSON.parse(request.responseText)
這段程式碼的時候總是給我顯示
Uncaught syntaxerror unexpected token n 的錯誤
本來一直想說會不會是JavaScript在每個瀏覽器上不一致的問題
可是Chrome怎麼想應該都是進度不落於人後的
而且用window.JSON測試了一下也是有這類別
直到剛剛才發現原來是JSON的格式出了問題......

原本我是這樣打的
{
     name: "lucky",
     color: "brown",
     age: 2,
     sound: "woof"
}

到JSON官網看了一下發現JSON物件是要以字串組成對
那麼我上面那樣打的話就是組成對了
所以把JSON改成

{
     "name": "lucky",
     "color": "brown",
     "age": 2,
     "sound": "woof"
}
才終於跑成功了
原來是因為property一定要加上雙引號才代表字串

昨天下午發生的問題
經過了24小時以上才解決......
不過有問題才是好事情!!! XD

2012年8月5日

總是會被小到不行的bug給搞死

就在剛才用Servlet要讀取表單<form>傳值的時候
又被一個小到不能再細節的問題卡住
原因是因為我把某個欄位設成以下這樣

<input type="text" name="name" />

想了老半天都快想破頭了才發現這樣是不是會造成URL的讀取問題
最後把name改成username後才沒問題了


之前mysql的TABLE的名稱設定上也有一個問題
就是TABLE名稱不能設成ORDER
原因是因為ORDER是mysql內建的一個TABLE
然後這種問題總是會消耗我一堆時間去找它......

2012年7月27日

重回部落格亂講一堆有的沒的

部落格這東東其實在國中就有用過了
通常都是用來打一些廢文之類的東西 XD
現在又重新開始想回來打點東西了
主要是想把一些程式的學習過程紀錄一下
當然特別是我現在接觸最多的JAVA囉~
記錄下來一來可以增加自己的印象
二來呢等到哪天再回來看的時候可以看自己又進步多少
當時的觀念有沒有不大正確之類的...

上個星期五(7/20)到台北參加了JavaTwo的研討會
這是當天的RFID學員證和兩人同行送的杯子 XD













本來就知道自己應該是個小嫩嫩去了應該也是狀況外居多
研討會結束後也讓我找到許多該發展的方向
不過明年還有機會參加的話一定要慎選講師 XD
選會講的且內容準備夠吸引人的講師
當天覺得最棒的一場就屬Big Java Big Data那場了
之後回家也立即將Ubuntu Linux裝上並配置好了Hadoop
待改天再找時間來碰碰這個Big Data在JAVA上的東東囉

暑假過到現在也有一個月了
基本上每天一整天時間都是自己自由配置實在是很痛快
也利用了這一個月好好的溫故並知新一些東西
像是將Head First Servlets & JSP看了一遍
在看的過程中會想到某種機制就是在實現某種Pattern
就會找出該Pattern再給他複習一下
往後的學習紀錄中應該也會出現在SE或某框架看到的Pattern吧
另外也開始碰觸了JavaScript這個腳本語言
也希望能在這邊PO上一些jQuery的學習紀錄

最後附上一張資策會訓練中心網站看到的JAVA學習路線圖
我目前的程度大概只能到中間紫色那塊吧
而且還有必要繼續針對不熟的部分加強
其他旁邊的部分雖然有些也有約略接觸
但是絕對不敢跟別人說我蠻懂的這樣
JAVA這個領域真的是一輩子都學不完
不過這樣也好讓我生命中多了一件可以專心的事磨磨時間 XD