星期二, 5月 28, 2013

[Git] 讓你的 Github跟公司的 Git分開

  平常我自己會用 Github放一些我做實驗的網頁工具,而公司也用 Git來做版本控管。當然第一次執行git commit的時候, git會請你輸入你的電子郵件跟姓名,這時候就兩難了。輸入公司的,Github就沒辦法有自己的紀錄在,就是在 github的 Your Contribution (很多塊綠色點點)就會是以公司的帳號而不是以你個人的帳號了,用自己的電子郵件,在公司看git 紀錄應該會被釘。

  所以可以在第一次 git commit輸入自己的,然後再到公司的下面輸入個別的公司的帳號。其指令就是。

  git config [--global | --local] user.name "Your Name"
  git config [--global | --local] user.email "yourmane@domain.com"

  --global就是全體的設定值, --local的就是個別的設定值。  你也可以手動到各個 repository的 .git下面修改config檔案。在最後加上:

  [user]
          name = Kevin Zhuang
          email = kvzhuang@gmail.com

每個 repository就有不同的帳號了。



星期一, 5月 27, 2013

[JavaScript] typeof memo

  可以使用 typeof來判斷變數宣告,以避免在某些情況下不確定此變數或 Member存在導致 JavaScript中斷。


  • if (window.android.changeId) {} 
    • 若window沒有 android或是 底下沒有changeId的方法時候,JavaScript會中斷執行
  • if (typeof window.android !== "undefined" &&typeof window.android.changeId !== "undefined") {}
    • 可正常判斷是否有此 Member或是變數。
  也可使用 typeof(window.android),作用一樣。

[Closure] JavaScript使用 Closure模擬出 Private Member

  JavaScript裡面其實並沒有 Private Member的概念,(至少在EMCAScript 4),那如果我們要實作Private Member要怎樣實作呢? 可透過 Closure來完成。

function person (){
  this.age = 10;
  this.name = "Kevin";
};
var p = new person();
console.log(p.age + ":" + p.name);

function person_closure (age, name) {
  this.getName = function () {return name; };
  this.setName = function (newName) {name = newName; };
  this.getAge  = function () {return age;};
  this.setAge  = function (newAge) {age = newAge;};
  
}
var p_c = new person_closure(10, "Kevin");
console.log(p_c.age + ":" + p_c.name);
console.log(p_c);
p_c = null;Check out this Pen!


  如上方例子第一個例子由於沒有使用 Closure來達成 Private,只要打開瀏覽器的 debugger都可以觀察的到裡面的欄位。而第二個 person_closure透過參數傳入 age以及 name也只能使用 getter以及 setter方式存取變數值,進而達到 private 變數。

  最後稍微提醒一下,Closure容易造成記憶體無法釋放的問題,在此例 age,name會一直存在記憶體。所以我最後設定 p_c = null讓瀏覽器回收記憶體。

  這是我參考MSDN JavaScript: 使用物件導向技術來建立進階 Web 應用程式所做的案例探討,也歡迎大家來信更正。

延伸閱讀: [JavaScript] Closure 概念


星期日, 5月 26, 2013

[JSDC] 【JavaScript忍之道特別企劃】JSDC心得分享

  小弟我有上報耶,雖然只有一小段而已還是很開心就是。

【JavaScript忍之道特別企劃】JSDC心得分享


小莊
JSDC志工/前端工程師

前端開發是未來的趨勢,而JSDC在促進JavaScript的產業、人才、社群的結合很努力,因此認同這些想法,才會想要投入擔任志工。這次擔任場控,雖然很忙很累,但也因此認識許多國際級的大師,收獲很多。

星期六, 5月 25, 2013

[Linux] Amazon EC2 Step-by-Step 試玩心得




  最近小莊電台一直有問題,總覺得快差不多了。加上我自己也想找個雲端放我一些實驗性的程式碼,就看 Amazon Web Sevice打廣告打很兇就來玩看看了。主要目標,架設 apache2,php5,以及把 github上面的 nodejs抓回來編譯就好了。

  申請到還蠻簡單的,我稍微列出幾點要注意的地方就好了。我是使用 ubuntu 13版32位元,由於怕被收費請記住開 Micro就好,如果你要在 Conference Demo再開到 Extra Large。

  • 架設過程會產生一組  pem的 key,可透過 puttygen的 Import Key匯入轉換為 ppk檔案讓 ssh能夠和 AWS連線。

  • 開啟 putty 輸入你的 aws 分配給你的 domanin name或是ip,然後選擇 private key進行驗證。



  • ubuntu請使用 ubuntu帳號登入,登入後請用 sudo passwd更換密碼。(這應該是常識吧)
  • 在 AWS的 console有一個 ec2-xxx-xxx-xxx-xxx.us-west-2.compute.amazonaws.com,那個xxx-xxx-xxx-xxx則是你的 IP,為浮動的,請到左邊功能列的Network & Security -> Elastic IPs進行調整。 (感謝 Study提醒)
  • AWS預設只有開 SSH 22 port,請到 Network & Security -> Security Group調整。(80 或其他port)

  • 然後使用 sudo apt-get install build-essential安裝編譯工具。 (感謝 Study提醒)
  • sudo apt-get update, sudo apt-get upgrade。
  • sudo apt-get install apache2,sudo apt-get install php5。
  • sudo apt-get install git ,抓nodejs回來編譯即可。
 另外推一下我們公司的 linux-config: https://github.com/kvzhuang/linux-config。只要執行一行程式都幫你的zsh設定安裝好好的。






星期三, 5月 22, 2013

[CSS] pointer-events

  今天在 Front-End Developers Taiwan社群看到有人問 css3 的 pointer-events,感覺還蠻有趣的,就稍微研究一下。

  我自己實作了一下有點像是透過 css 達到 JavaScript的 preventDefault或是拖拉效果的功能。其主要常用的兩個屬性為 auto 以及 none,若設定 pointer-events: none主要達到下面四點功能:


  • click 功能失效。
  • 指標重置回預設樣式。
  • hover以及 active樣式均失效。
  • JavaScript 點擊功能失效。


JS Bin

  各位也可以去玩玩 google map的地圖圖層的控制項。原本下方這一塊 div是無法拖拉的,只要設定 pointer-events為 none就可以拖動下方圖層。不過上方控制項也不能夠操控了。(感覺是有點無力的豆知識就是。)

  目前 pointer-events在 ie支援不甚理想,有人列出整理表 - Can I use pointer-events?


星期二, 5月 21, 2013

[Tools] 挑色碼不求人好工具 Kuler

  這次在 JSDC聽到 UP Chen介紹了一款由 Adobe 出的挑色碼好工具 - Kuler。使用方法很簡單,輸入一個色碼或是上傳一張圖挑選其中一區塊得色碼。此工具會根據你輸入的色碼找出連續的色票出來。這樣我們很多時候再選取色票就不求人啦!

  我拿我們公司首頁基本常用色塊舉例,我取出色碼#78D5DC

  
  然後到 Kuler點選 Create,在下方 Base Color輸入色碼選擇一個你想要的 Rule即可取得一連串相關色票,其他還有許多功能大家快去嘗試阿。






星期一, 5月 20, 2013

如何跟老闆推廣前端團隊

  最近在 Front-End Developers Taiwan 有人問到如何在台灣跟老闆推廣前端團隊,這真的是超級大哉問阿,我稍微分享一下小弟的一些想法給各位參考。

  首先是向上管理,你要知道老闆或高階主管的屬性,他們是屬於傾聽者(Listener)呢? 還是閱讀者(Reader) 或是簡報瀏覽者。知道他們的偏好吸收知識的屬性才能夠投其所好讓他們慢慢接受你的觀念跟建議。(當然如果你的老闆是不聽者,我會建議你快點跑。)

  第二步老闆們考慮的往往是成本與績效問題,導入前端工程師對團隊有什麼好處? 如果結論只是增加成本,那應該沒有老闆會願意推動的。我建議可以舉幾個例子給老闆們看。
  小弟還在陸陸續續收集各種案例,都顯示台灣前端界是越來越受到重視的一個產業。在技術上有助於橫向的工程師以及視覺設計師溝通,成立前端團隊的確對公司產值有正面幫助。

  第三步你就是前端傳教士,我自己除了公司有前輩教學,自己也非常要求自己學習前端各種領域,並且盡力和同事分享,並且和公司視覺設計師溝通,傳教設計與開發的等好用工具不要把自己局限在工程師這個範圍當中。千里之行始於足下,你不做也沒人會開始做啊! 

  一些心得和大家共勉之。

[Language] 語言的特性- 談論前端致勝

  今天在跟前同事 Ash Wu吃飯聊到為啥感覺做前端寫 JavaScript的工程師好像比較熱血? 例如 Josephj , Node.JS 台灣的招集人 Caesar Chi 還有我好像都有一股熱情存在?

  很好奇的原因為什麼? 是語言的特性? 是什麼原因呢? 我思考後之後提出一個可能的原因。前端工程師創造出來的成果本身是要感動人心。因為你的成果可能直接的感動到看網頁的另一端的使用者,進而創造出價值,也因此往往相對比較其來更直接的面對到使用者的感受。


  我舉個例子 - 歐巴馬募款網站的製作過程,裏頭提到 :
競選總部決定,網站必須改版,盡一切可能爭取捐款。於是,技術團隊開始大規模的擴充,全職的前端工程師從1個人擴充到了14個人,其中6人專門負責製作募款頁面。
 透過前端工程師的技術達成了感動人心進而改變了世界的成果,還有比這更有成就感的軟體工作麼? 或許這也前端工程師的一種小小特性吧,願大家共勉之!

  最近朋友獻給我四個字,我也獻給大家就是"前端致勝"。


[JSDC] 擔任義工的心路歷程

  大家好,我是小莊。就是那個國際會議廳站在角落看著講者議題的小小工作人員之一。這次為什麼會來 JSDC呢? 原因沒有別的,就是想要燃燒自己的前端魂。

  志工總共有兩個行前會,第一個行前會算是總召強哥希望大家聚再一起介紹一下場地以及職務,第二次是布置場地行前會。第一個行前會嘩啦啦的雨下超級無敵霹靂世界大,還大清早的從被窩裡爬起來。幹部還來信請大家務必路上小心再過來,出席率也還是很高。

  五月十七號第二個行前會就是搬東西大會以及整理名牌大會,很令我懷念起大學時代的營隊生活就是。男生就是這時候好用阿!

  五月十八號早上六點半準時出發! 小弟跟負責國際會議廳,基本上開場大部分都會是由 TonyQ或是強哥開頭所以就是讓他們安心上場。

朋友遠拍我跟TonyQ


 國際會議廳最爽的就是有 Keynote拉,馬上就見到國際級的大師,目前現任 Amazon Web Service的 Joe Ziegler (第二天趁地利之便還跟他拍了照片)。


  第二天的 Keynote 是由的 Josephj (Awoo),雖然在工作常常碰面,但是特殊場合還是要拍張照片紀念一下的!

  Josephj的 Keynote老實說只有一個精彩可以形容,很值得身在軟體業界的各位一看! 我轉貼一下連結如下 - F2E, the Keystone 前端工程師 - 軟體開發與設計不可或缺的角色。前端產業正如 Josephj投影片敘述的在一些資訊產業當中還沒有被真正的被意識到其重要性,也因此我們也義無反顧的站出來推廣前端技術。像是 JSDC.tw 以及下面的三個大型技術社團- JavaScript.tw, Node.JS台灣以及 HTML CSS3台灣,都是很努力地在推廣前端技術。

  而小弟我也建立了一個 Front-End Developers Taiwan 的社群並且邀請了上面三大技術社團的幹部擔任管理員。原因是我希望除了從社群帶動技術的角度去推廣給開發者以外,也能夠讓產業,企業看到有一群開發者在前端凝聚了一股力量並且持續成長中。

  這次 JSDC讓我感覺到產業跟社群以及開發者更緊密的結合再一起了,這是良性的循環。企業透過社群能夠找尋到優質的開發者以及做到的技術的傳教,開發者透過社群能夠把技術跟產業結合再一起,社群也能運作得越來越健康成熟。

  最後尾巴是遇到輔大好久不見的朋友 Allen Own以及在他介紹下認識的設計大師 Even Wu。我很常拜讀 Even Wu先生的文章,這次能夠見到本人留下紀念也是非常開心。



星期日, 5月 19, 2013

Front-End Developers Taiwan

  這幾天參加JSDC, 相信這一兩天我會貼上完整心得敘述整個心路歷程。

  不過在這邊我先推廣一下Front-End Developers Taiwan!

  我們努力推動台灣的前端產業,歡迎大家加入啊!

星期四, 5月 16, 2013

[browser] DOMReady, DOM Load - window.onload

  今天跟同事討論到瀏覽器的觸發事件 DOM Ready 跟 DOM Load - window.onload以及若有子模組的時候應該安排在何時觸發?

  我先稍微解釋一下 DOMReady以及 window.onload。


  • DOM Ready : 瀏覽器上面的 DOM 物件建立完成。
    • 適用時機: 適合那些只需要對 DOM 做基本增刪修改操作的。(TonyQ補述)
  • DOM Load - window.onload: image, css等頁面物件載入完成。
    • 適用時機: 適合圖片或之類會有內容大小二次變動的 需要在特定時間抓,或是像 iframe 需要讀取頁面完成做事件。(TonyQ補述)
  • 正常情況下 DOMReady會比window.onload, 不過在老瀏覽器若有快取情況似乎 windows.onload有可能會比 DOMReady來的早,此情況目前應該是不太可能會發生了。


  若有子模組的話 YUI有 ContentReady的事件可使用,子模組DOM TREE建立完成就觸發事件,所以其執行順序就是 ContentReady -> DOMReady -> window.onload。

  如果其他框架如 jQuery相信也有其他的事件可使用,也歡迎來信留言指點。


星期二, 5月 14, 2013

[Music] 卡比牌手工USB音效盒

  我喜愛音樂! 所以在經濟可以容許的範圍內偶爾也會買些小裝備,滿足自己耳朵音感的慾望。 之前買了 Denon c400,最近在朋友卡比的友情贊助下請他手工幫我製作了一個全世界獨一無二的 USB音效盒。

  只要插上USB就有很不錯人聲以及配樂,鼓聲的感覺也很清楚分明。其內容是使用飛利浦荷蘭製老電容還有首次嘗試的銀膜雲母電容,濾高頻雜訊用。下面貼照面炫耀一下內容,還有 LED燈! 可惜外殼是塑膠殼,一包覆起來就看不到內包裝了。


  目前不接受預訂,這也算是製作者的堅持吧。若商業化就會失去了一些靈魂了。


星期一, 5月 13, 2013

[Category] 我的前端文章彙總

  近期我在公司指導新進 F2E員工, 途中參考 Awoo (Josephj)的 f2eclass.com. 但是後來發現, 在做很多教材補充的時候, 我的部落格儼然也成為一段心路歷程.

  由於在接受 Awoo前端指導的時候我自己也下很多工把所有認為該知道的東西我都自己補充上來, 才老王賣瓜的會把這些連結寄給新同事吧.這邊我自己也做個分類分享給大家, 雖然是一些基礎.但是就像我說的前端就在細節與基礎當中.
  Keep writing!


[JavaScript] Conditions of this object

  各位好, 又再一次介紹 this 物件. 這是重點放在 this 物件會出現的情況. 我列出我常使用的四種情況.

出現情況 this 說明 範例程式
 物件方法的呼叫  呼叫方法的物件
 (Caller)
 var obj = new Object();
 obj.id = "test";
 obj.findThis = function(){ alert(this.id)};
 obj.findThis(); // this is obj.
 Global Function 呼叫  window,
 strict mode is   undefined.
 Caller is window
 function test(){
 alert(this);
 }
 test(); 
 使用 new產生一個 instance  就是 這個物件本身  function test(){
  alert(this)
 }
 var o = new test(); //this is o
 使用 Apply, Call呼叫函數
 帶入第一個參數值改變
 Context.
 被改變的 Context值  function test(){
    alert(this.id);
 }
 var m = {id: "m"};
 var n = {id: "n"};
 var o = {id: "o"};
 o.fn = test;
 o.fn.apply(m); // this is m
 o.fn.call(n);    // this is n

  我們可以說, this 物件重點在於 caller. caller代表著 context, 在大多數情況下也代表著 this.如果有缺的部分或是我有敘述錯誤的地方歡迎來信補述!

  補充說明: [JavaScript][OO] this object memo

Reference

星期三, 5月 08, 2013

[Java] Set, Map and List


   在Java當中的資料型態Set 以及Map,以及Linked List 跟ArrayList的差別 
首先我先列出Collection 跟Map的大致架構

Collection 
├List 
│├LinkedList 
│├ArrayList 
│└Vector 
│ └Stack 
└Set 
Map 
├Hashtable 
├HashMap 
└WeakHashMap 

  • Collection 為基本的介面, 定義了一些基礎操作, 一個 collection代表一組物件 (objects). 有些物件可以重複有些不行. 有些可以排序有些不行.

          不過基本上又分做兩類, 一個是 List一個是 Set.

  • List 為有順序性的 Collection, 也因此允許重複的物件存於其中.
  • LinkedList 繼承 List, 他是雙向的 List(FIFO, FILO), 也因此可透過他實作 Stack, Queue,不過 LinkedList並沒有使用 synchronize方式存取.
          可用此方式操作 List   list   =   Collections.synchronizedList(new   LinkedList());
  • ArrayList 實作了 List, 然而也提供了動態陣列大小的操作 (這邊我自己覺得有點類似C++的動態陣列),如 size, isEmpty, get, set, iterator, listIterator operations均是常數時間,然而add則是O(n).
          同樣他也是沒有使用synchronize方式存取.
  • Vector 跟 ArrayList類似, 不過他是有進行同步處理的,因此要處理 ConcurrentModificationException,此exception.
  • Stack 繼承 Vector, 並且提供了一些額外的方法, 如 peek.
  • Set 不能包含重複的物件, 即是兩個物件 objec1, object2同時存在此set的話, 則o1.equals(o2)則為false.
  下面則是 Map分類.
  • Map 提供Key->Value的對應關係, key不能重複, 一個 key對應一個 value(object), 這邊我們常用所謂的 keySet(), 就是代表 Map當中的 key只能唯一.
  • HashTable 實作了 Map,提供了 Key-> Value的方式, 而且他是同步(synchronize)的!
  • HashMap 跟 HashTable類似, 不過他是非同步可進行存取的.
  • WeakHashMap 跟 HashMap類似, 如果他其中的 key不再被引用,他將會被回收.

  如果要使用 Stack, Queue等實作, 若要快速插入, 刪除元件,應該使用 LinkedList, 若要快速存取其中物件,應該使用 ArrayList.

  而若沒有同步存取問題, 可以使用非同步的型態如 HashMap, 如果有就要用同步的資料型態.


星期四, 5月 02, 2013

[grid system] why grid system is 960?

  在前端界有個頁面設計寬度的共識, 叫做 960 Gird System. 主要目標若原型設計是根據 960 Grid System來設計, 實做或是整合到產品時, 這些排版設定跟 CSS可以很快速地符合原有的原型設計.我們這群前端工程師就不用很苦工的調來調去了!

  然而這就帶到第二個問題, 為何是960呢? 從 Nathan Smith 960 Grid System [ref.1] 這篇文章有提到 960是 根據 1024*768 以下的 magic number. 他是 1024寬度底下合理使用的大寬度, 又能夠被整除 ( 12等分, 16等分)的一個數值, 也因此選定了 960這數值.





Reference

星期四, 4月 18, 2013

[CSS3] How to make marquee by CSS3 animation

  這次要來探討如何使用 CSS3的 animation達成跑馬燈效果, 原因是原本的 HTML的 marquee標籤是非標準標籤 (refer from wiki), W3C也不建議使用囉. 所以乾脆自己用 CSS3的動畫效果刻一個.分享出來給大家玩看看.

  主要規格是當我  focus到一個連結後底下的字樣會進行跑馬燈的效果.使用到 CSS3的 animation跟 keyframe來呈現.當然有設定文字呈現最基本的 white-space以及overflow: hidden (這樣才有跑馬燈效果阿) .


Check out this Pen!

  透過 keyframes可以設定在動畫的秒數內文字的位置來做到跑馬燈效果, 算是很彈性的作法!

星期四, 4月 11, 2013

[JavaScript] Closure 概念

  最近跟 Vexed在討論 JavaScript的 Closure概念, 就參照了他的投影片加上自己參考 Nicholas C. Zakas的 Professional JavaScript for Web Developers以及 wiki當中的 Closure概念.自己試著講解了一次什麼是 JavaScript Closure.


  其實 Closure的定義就是一個方法能夠存取到非同一個scope的方法的變數. Closure在很多語言都有使用到, 而在 JavaScript當中是透過 Scope Chain去達成.

  下面這個例子很有趣, 很明顯的表達出 Scope Chain是 Lexical 分析時候決定, 而非 Execution time決定.
var arg = 1;   
 function funcTest() {   
      alert(arg);   
      var arg = 2;   
 }   

 funcTest(); 
 function funcTest2() {   
      alert(arg);   
      //var arg = 2;   
 }  
funcTest2();
Check out this Pen!



星期二, 3月 19, 2013

Mobile App Simple Classification

  引用Matt Legend Gemmell 的看法, Mobile App 分作下列四種


  1. 明確在瀏覽器內運行的應用。
  2. 由 home screen 啟動,運行在特定瀏覽器中的應用 (在啟動上有 native app 的味道)。
  3. 運行在 native app 當中的 web view 的應用。
  4. 純 native app,沒有 HTML / CSS 的介面。

  從這個角度來看,PhoneGap屬於第3類,而Titanium Mobile屬於第4類。 [ref.1]


  而PhoneGap跟Titanium的開發的實際差別在於:

  PhoneGap就是透過提供一個可以執行 HTML5 + CSS + Javascript 的 Container 來執行開發者所撰寫的程式,然後透過 和 PhoneGap 各自所提供的 API 來存取各手機作業系統提供的 API.

  而Titanium則是透過編譯的技術將程式碼編譯成 Native Code.

  以效率上 PhoneGap執行多一層會較慢,而 Titanium快.
  可是以相容性應該是 PhoneGap會比 Titanium好(因為要有各家的 SDK)

Reference