2013年10月5日 星期六

Bootstrap 2.x to 3 升級小札

 

最近從 Bootstrap 2.x 換到 3,不過倒不是因為功能性的問題,而是我比較喜歡 3 的風格。

 

這是一個直接將 HTML 轉換的線上工具,左方表格也標註了大部分需要轉換的 class

http://upgrade-bootstrap.bootply.com/

 

當然我也以為這樣就好了,但沒想到還是遇到陷阱(目前發現兩個)

 

class alert 取消 alert-error class,必須統一使用 alert-danger

image

 

2.x row 的 span 效果與 3.0 row 的 col 效果不同,3.0 並沒有在左右加上一點 margin

2.x

image

 

3.0

image

 

以上,有遇到再紀錄。

2013年9月30日 星期一

IE 測試工具 IETester

SNAGHTML22107d5

 

IE 是所有網頁設計師的惡夢,這應該不用多說,但網站若不支援到 IE7,仍是會引起眾怒…

而 IETester 可以同時建立不同的 IE 環境,方便開發者們檢視,介紹給大家。(甚至到 IE 5.5 都可以,是要逼死誰…)

http://www.my-debugbar.com/wiki/IETester/HomePage

2013年7月15日 星期一

「學習新技術」有感



學習新技術的同時,你必須清楚知道自己究竟為何而學,新技術究竟幫你解決了什麼問題?而同時會帶來什麼問題?

如此一來,這才是有效學習。

摸新技術通常為潮流、為酷炫,這是程式人的通病,我也是,對任何新技術都非常好奇,但,這只能當做你接觸他的理由。

尤其是實際使用他、選擇他時,你不應該像個信徒一樣,一昧的只是想用。

當我問起:「他好在哪?」,你可以興致勃勃的說出十幾個理由;但當我問起:「他不好在哪?」,你卻連五個理由都擠不出來。

那麼,他真的這麼好嗎?

每種技術都有其優缺,絕沒有完美解決問題的技術,隨時保持自己中立清明的立場與態度,你才能真正學習到這個技術。

畢竟,技術存在的本質終究在解決問題上,如果新技術完美的解決了十個問題,卻引發了十個更難的問題,那真是本末倒置了。

當然,如果你摸新技術完全只為興趣,未來絕不會有用到的一天,那麼此篇文章對你來說沒有任何意義。

2013年7月9日 星期二

使 mac 左方 command key 成為 windows(in VirtualBox) 裡面的 windows key

若要使 mac 左方的 command key 成為 windows(in VirtualBox) 裡面的 windows key,那麼我們必須置換 VirtualBox default 的 host 位置,請參考下方連結。

http://helpdeskgeek.com/virtualization/change-the-host-key-in-virtualbox/


2013年7月1日 星期一

找軟體工程師,筆試、上機、面試之我見

(本篇談的主要是寫伺服器端的軟體工程師)

 

不敢說自己當面試官的經歷真的很豐富,詳細數字我不清楚,但應該有近百位,節錄一下自己的心得。

每間公司都缺人才,要怎麼找到好的軟體工程師便是一個課題。當然每間公司也都有其預算限制,但這不在本文的討論範圍內,本文主要是探討怎麼「找到好的」,而非怎麼成交。

最近剛好自己也成了求職者,因此更有所體悟。

 

關於筆試

我同意筆試,但筆試內容應該盡可能是原理題或是觀念題之類的,而非語法題。大部分的情況,程式語言只是完成任務的工具,而若語法只是翻翻書本便可以查到的,那麼這不應該成為試題的一部份,你必須考慮 Google 威能。

筆試要考的,是那些非一時半刻可以查到的,甚至要查都不知道如何下手的問題,有沒有辦法順利作答,必須取決於經驗值,應掌握此原則出題。

了解原理並能用於解答題目,勢必得經過一段時間的磨練,才能較容易找出問題的癥結點,或是用較為理想的方式進行,而非只會土法煉鋼。(當然,某些情況下,土法煉鋼不見得一定是壞事)

而觀念題可以知道一個人有沒有思考自己曾經做過的事情,如果僅談教科書上的那些,或是對此沒有什麼想法,那麼此人肯定無法自己成長,任何事情都要有自己的見解,才有辦法修正與成長,也才有辦法言之有物,言之有理。通常在觀念題我會較著重於如何整理程式碼。

 

關於上機

我題目主要測驗三種能力。事前需詢問求職者熟悉的語言(多種也無妨),並準備好執行環境:

  • Google 能力:出幾題經典,艱深,非正常人有辦法在短時間內解開的演算法,只要input跟output正確即可,當然並不會特別告知求職者要去 Google。
  • 邏輯能力:出幾題 Google 不到,也不需要太過困難的演法算題目。
  • 閱讀能力:給一段可以input, output的程式碼、執行環境與應用情境,把debug會用到的語法都寫在題目上,並請求職者找出問題關鍵。

已經是上機考了,是否靠自己想出,完成並不重要,畢竟實際工作環境下,沒人不讓你 Google 的。與其你很天才的,在30分鐘內想了一個80分的解法,不如你花10分鐘,Google 個 99分的解法給我。

不要重新發明輪子,這在業界是非常出名的一句話,但許多有點料的工程師偏偏就是喜歡靠自己,魔鬼永遠藏在細節裡,你再聰明都比不上過去前人所累積的智慧結晶。

如果用80/20定律來解釋,80分的解法其實只需要20%的時間,剩下的20分得花你80%的時間,相信有經驗的工程師都知道這並不誇張…甚至還低估了它…

 

關於面試

面試也能判斷出一個人的專業能力,我也會嘗試在這關探出個所以然(雖然面試最容易嘴砲),畢竟你準備的筆試與上機,不一定完全等於一個人的實力。

當然面試主要是了解個人特質,更進一步的透過互動,了解每個人對工作的認知,對公司文化的認同,對責任的觀念…等,這就不多提。

 

如果這次的找人任務,主要是找出可以訓練的工程師,而非即戰力,那麼我會只面試就好,前兩項只是浪費彼此時間而已…

 

結語

廣義來說「人才」,指的是解決事情的能力優於常人,犯錯的頻率低於常人…等,如果能掌握這些原則,並思考「實際工作環境」下的狀況,便會知道該如何找到你期望的,不管你要找哪方面的人才。

 

當然,怎麼成交,怎麼留住人才,又是另一門藝術了。

2013年6月27日 星期四

在 Android 裡產生 barcode (Android barcode generator)

 

image

 

一開始,我以為找到 Android barcode generator 的 library 是一件簡單的事情。

的確,如果用 Android barcode generator 作為關鍵字 google,馬上就可以看到 onbarcode 這個支援多平台的 barcode generator。整合起來也很簡單,花不到 10分鐘就完成了搜尋加上整合的動作。

問題是,仔細回頭看 onbarcode 官網的授權費用,高得嚇人!

image

 

要用這個當 solution,至少也得是夠大的案子才划算...

 

好了,如果不用 onbarcode,那麼這個搜尋任務,變得十分困難,你會發現大半是在談 online generator。

我第二個找到的是 IDAUTOMATION [Android 下載連結],同樣要收費不說,他的 Android Sample build 起來後,隨便點一個 Item 還會 crash!

 

於是,我只好把腦筋動在 html/javascript 上(在開發 APP 的世界裡,無論是 iOS 還是 Android,這招都是萬靈丹呀!)

果然馬上找到一狗票的資源可用。

接著只是挑選適合的套件以及授權方式的問題,在 Android 端應用 Local WebView 即可,這就不多做說明了。

2013年3月17日 星期日

一個簡單範例解釋多型(Polymorphism)


所有的人(Human),都有體重(weight)與威力(power),且體重等於威力

Human.java
public class Human {
    public double weight = 0;
    
    public double getPower() {
        return this.weight;
    }
    
    public Boolean isEqualToPower(Human h) {
        // 只要是人,都有取得自己威力的 method,叫做 getPower。
        // 但是骨子裡,不同人種 getPower 的方式卻不一定相同。
        // 這就是多型的應用。
        
        return this.getPower() == h.getPower();
    }
}

黑人天生的肌肉就比較強韌,可以發揮體重 1.5 倍的威力。(也可以擁有屬於黑人獨有的行為(black_method))
Black.java
public class Black extends Human {
    public double getPower() {
        return this.weight * 1.5;
    }
    
    public void black_method() {
        // only for black
    }
}

白人天生的肌肉也比一般人強韌些,可以發揮體重 1.2 倍的威力。也可以擁有屬於白人獨有的行為(white_method))
White.java
public class White extends Human {
    public double getPower() {
        return this.weight * 1.2;
    }
    
    public void white_method() {
        // only for white
    }
}

我們黃種人,體重跟威力,跟所有人類一樣,體重就等於威力。(不需要override getPower)
Yellow.java
public class Yellow extends Human {
    public void yellow_method() {
        // only for yellow
    }
}

PolymorphismExample.java
public class PolymorphismExample {
    public static void main(String[] args) {
        Human y = new Yellow();
        Human b = new Black();
        Human w = new White();
        
        y.weight = 12;
        b.weight = 10;
        w.weight = 10;
        
        System.out.println(y.isEqualToPower(w));
        System.out.println(b.isEqualToPower(w));
    }
}

從 PolymorphismExample.java 可以知道,不同的人種,也可以進行威力的比較。
而從 Human.java 知道比較威力時,我們也只是站在人的立場,使用 getPower 來取得各自的威力。
可是雖然都是人,但是骨子裡的 getPower 卻會依據不同人種有不同的計算方式。這就是多型 (Polymorphism)

範例程式下載
PolymorphismExample.zip