About

你好,我叫 Lee ,目前剛入社會的新鮮韌體工程師,常常關注新科技,最近開始自學 Node.js等一些 Web 技術,常常東碰西碰。 XD

這裡記錄我學習程式的一些筆記,歡迎各位不吝指教。

有問題或討論,歡迎留言或者來信至: jessy1092@gmail.com

| Posted by Lee

Resolve Gulp-campass complie sass Error problem on Travis-CI

最近幫 hackfoldr-2.0 加上 Gulp 和使用 Travis-CI 做自動部署,不小心踩了 gulp-campass 在 Travis-CI 上的雷,只好以此篇紀錄一下。

由於 hackfoldr-2.0 是使用 sass 來編寫,因此需要 gulp-campass 這個 gulp plugin 來做處理,在使用 gulp-campass 前,需要先安裝 campass

原先的 .travis.yml 邊寫如下:

.travis.yml
language: node_js

node_js:
  - '0.10'

before_install:
  - gem update --system
  - gem install sass --version "3.3.3"
  - gem install compass --version "1.0.0.alpha.19"

script:
  - gulp build

env:
  global:
    - REPO="git@github.com:hackfoldr/hackfoldr-2.0"

但是如果只做此設置 gulp build 時會一直報出錯誤

LoadError on line ["54"] of /home/travis/.rvm/rubies/ruby-1.9.3-p547/lib/ruby/site_ruby/1.9.1/rubygems/core_ext/kernel_require.rb: cannot load such file -- tilt

原因是因為缺少安裝 tilt 這個 ruby package,所以只要在加上 tilt 就可以了:

.travis.yml
language: node_js

node_js:
  - '0.10'

before_install:
  - gem update --system
  - gem install sass --version "3.3.3"
  - gem install compass --version "1.0.0.alpha.19"
  - gem install tilt  --version "1.3.0"

script:
  - gulp build

env:
  global:
    - REPO="git@github.com:hackfoldr/hackfoldr-2.0"

後記

會使用 sass 3.3.3compass 1.0.0.alpha.19 是因為要 build sourcemap,如果無此需求使用 sass 3.2.19compass 0.12.6 即可。

下回來談談如何在 Travis-CI 上自動部署好了 (欠了許多文章債)

| Posted by Lee

[LiveScript] 不會 JavaScript 也能學 LiveScript (0) - 環境建置

自從參與 g0v 之後,見識了廣大的世界,總是想貢獻點心力,卻發現用的程式語言好像不通(本人是 Java、C 出身 XD),只好自跳坑,幫忙 g0v公報自動化,然後邊學新語言邊貢獻,然後跳坑跳著就踩到了 LiveScript,在高村長鼓舞之下,只好繼續踏上學習之路。

在學習一個多月的 JavaScript 之下,總算可以看懂 LiveScript 官網的教學,官網的教學是以 JavaScript 與 LiveScript 對照的方式來說明各種語法,如果是沒學過 JavaScript 的人可能會有點吃力,因此這系列文章想以沒學過 JavaScript 的人為對象,撰寫一系列介紹 LiveScript 的文章。(不過至少有學過一種程式語言較佳啦。 XD)

LiveScript 是什麼?

LiveScript 最初是 JavaScript 誕生時所被命名的名字,只是之後由於一些商業上的考量才被改名為 JavaScript,有興趣這段歷史的可以 Wiki,後來 George Zahariev受到 Functional languages in general、Haskell、F#、CoffeeScript 等的啟發,發展一個簡單、直覺可編譯成 JavaScript 的語法,並取名為 LiveScript,也為 JavaScript 原本的名字致敬。

所以 LiveScript 編譯過後會變為 JavaScript 來執行,你一定會問,那不就直接看 JavaScript 對照來學就好啦,對!我是這樣做,只是現在編譯做的越來越進步,有時不見得一下就看懂編譯出來的 JavaScript 囧>

因此想藉著重新學習程式的方式,來學 LiveScript 這個語言,有時學著會發現 LiveScript 還比 JavaScript 好懂 XD

由於我也是剛學 LiveScript ,因此萬一文章有誤歡迎各位指正與交流。

環境建置

進入正題,要能編譯 LiveScript 必須要有 Node.js。 (Node.js 提供在 OS 上執行 JavaScript 的環境。)

安裝 Node.js

安裝 Homebrew
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

更新 Homebrew
brew update

檢測 Homebrew 有無安裝錯誤
brew doctor

設定環境變數
export PATH="/usr/local/bin:$PATH"

安裝 node.js
brew install node

檢查有沒有安裝成功就開啟 Command line 視窗,打入 node -v ,有出現 版本號 的話就代表安裝成功了。

安裝 LiveScript

最簡單的方式是經由 npm (一個 node.js 的套件管理系統)
npm install -g LiveScript

注意 -g 是安裝到 global 為了讓任何地方都可以執行 LiveScript 指令。

安裝完成之後,就可以執行 lsc 指令 (詳細指令集,以後我們會常常用到)
打入 lsc -v 如果有出現版本號就代表安裝成功了。

下回預告: 不會 JavaScript 也能學 LiveScript (1) - Hello World!

Reference

| Posted by Lee

Lee's 程式之路

最近幾個月東碰西碰,一直在學習新的技術與程式語言,今天突然好想回顧一下自己寫程式的歷程 (好像很老似的XDD)

國小

不知是四年級還是五年級,當時辦了全校網頁設計比賽,懵懵懂懂之下就去參加了,然後用 photoimpact 畫圖、Frontpage (沒錯,那時候流行不是 DreamWeaver)做網站,得了佳作!!!!

那張獎狀現在好像還躺在我家的某個角落,現在想起來這是我第一次接觸到的 Web技術,但也忘了為什麼那時沒繼續深究。 (小屁孩時期XD)

國中

一個電腦老師帶領學生進入BBS一起宅的年代。 (遠望 呆熊,一天發上千篇文的年代 XD)

高中

忘了何時踏進惠蓀館高達達六樓的電腦教室(登登說是高一),在黃老師的帶領之下,第一次碰到 C/C++,每個禮拜固定某幾天晚上留下來,一起去學校外吃飯、吃89牛排,然後買飲料正大光明帶回電腦教室,在毫無壓力下學程式,解解題目;開啟了我對程式的興趣 (大概大學只有有關程式設計的課程成績比較好.. orz)。

現在想想真是幸運,也有點可惜,幸運的是算是蠻早接觸的自己有興趣的事;可惜的是,那時並沒有在繼續往下專研,似乎純粹解題目就滿足了自我的好奇心。

大學、研究所

大學大概是個混亂的時期,探索自己到底喜歡什麼的時期。

這時期對程式語言來說,比較主要的就新學 Java、寫APP,印象深刻的就是遇到很好的老師,溫教授、菜媽等等,奠定了以後決定要以寫程式為職業的想法。

還有不得不提一下 AppUiverz,在那時校園裡難得的比賽,有幸認識到許多厲害的人,長了見識,也從這時候才慢慢寬了眼界,了解外面世界要學的太多了。

畢業後

我想真正眼界大開應該是從去年七八月,參加 COSCUPg0v hackath4nOpen CampusCode for Tomorrow 開始,第一次接觸到 Open Source 社群,感嘆自己的渺小、新鮮與相見恨晚(!?)。 XD

回顧大學以前時期,大概就是井底之蛙,自以為滿足,跳出井外才知道別有洞天,回憶就到這吧,然後開始學習 Node.jsLiveScript 之旅。

| Posted by Lee

[Play] 解決在 windows 上 Cygwin/mingw 不支援 play command line 的問題

Play 是 Java 的一個 Web Framework,聽聞強者說很強大,昨天就安裝來玩玩看。

昨天在 windows 上灌 play 2.2.1 ,環境變數等等都設定好之後,開啟熟悉的 git bash ,卻發現找不到 configuration file 錯誤如下:

Error during sbt execution: Could not find configuration file 'c:/usr/play-2.2.1/framework/sbt/sbt.boot.properties'.  Searched:
    file:/C:/Users/Lee/workspace/
    file:/C:/Users/Lee/
    file:/C:/usr/play-2.2.1/framework/sbt/

Google 了一下發現 舊版本2.0 就有的錯誤 play mail list

也發現在某一個 Pull Request 被解決了 github issue#1654,只是不懂為何沒有採用,只好自己來了。

修改 build 檔

  • 首先開啟 $playPath\play-2.2.1\framework\build 檔。

  • 在檔案裡找到這行

    build
    "$JAVA" ${DEBUG_PARAM} -Xms512M -Xmx1536M -Xss1M -XX:ReservedCodeCacheSize=192m -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=512M ${JAVA_OPTS} -Dfile.encoding=UTF-8 -Dplay.version="${PLAY_VERSION}" -Dplay.home=`dirname $0` -Dsbt.boot.properties=`dirname $0`/sbt/sbt.boot.properties ${PLAY_OPTS} -jar `dirname $0`/sbt/sbt-launch.jar "$@"
    
  • -Dsbt.boot.properties=`dirname $0`/sbt/sbt.boot.properties
    改為-Dsbt.boot.properties=$BOOTPROP`dirname $0`/sbt/sbt.boot.properties

修改 play 檔

  • 首先開啟 $playPath\play-2.2.1\play 檔。

  • 在程式碼 最前頭 加上這段 (完整檔案有點長就不貼了,詳情請見 github issue)

    play
    case `uname` in
    CYGWIN*)
    function dirname {
      cygpath -m `command dirname $@`
    }
    typeset -fx dirname
    export BOOTPROP="file:///"
    ;;
    MINGW32*)
    function dirname { (cd `command dirname $@`; pwd -W) }
    typeset -fx dirname
    export BOOTPROP="file:///"
    ;;
    *)
    export BOOTPROP=""
    ;;
    esac
    
  • 接著在檔案裡找到這行

    play
    "$JAVA" -Dplay.home=$dir/framework -Dsbt.boot.properties=$dir/framework/sbt/play.boot.properties ${PLAY_OPTS} -jar $dir/framework/sbt/sbt-launch.jar "$@"
    
  • -Dsbt.boot.properties=$dir/framework/sbt/play.boot.properties
    改為-Dsbt.boot.properties=$BOOTPROP$dir/framework/sbt/play.boot.properties

大功告成!!

測試

  • 在 git bash 上打 play help 有出現 play 的歡迎畫面就代表成功啦。

Reference

| Posted by Lee

[Ruby] 在Windows 7上安裝 Ruby on Rails

最近為了 參加Rails Girls聚會 ,只好來學一下Ruby,昨天開始在 Windows 7 上安裝 Ruby 環境,發現要注意的還真不少,藉此紀錄一下。

下載 RubyInstaller

一開始先去 RubyInstaller 官網下載 windows 專門的安裝應用程式。

  • 執行安裝程式。
    (除了一直按 Next 之外,記得安裝途中把 Add Ruby executables to your PATH 勾選起來。)

  • 安裝完後,在 cmd 上測試 ruby -v

  • 成功安裝會出現 ruby 2.0.0p353 (2013-11-22) [x64-mingw32]

恭喜 Ruby 已經成功安裝在你的電腦了。
但如果要安裝 Rails 請繼續看下去。

安裝 DevKit

為了安裝 Rails 原生的一些擴充,必須要有個輔助 toolkit ,這就是 DevKit

一樣先在 RubyInstaller ,左側偏下的地方下載符合你剛剛安裝 Ruby 版本的 DevKit 。

  • 解壓縮到你認得的地方 (像我是放在 C:\DevKit )。

  • 然後開啟 cmd 移到剛剛解壓縮的地方,下指令 ruby dk.rb init
    (這是為了偵測你安裝了哪些 Ruby ,然後會產生 config.yml 這個文件,你可以修改這個文件選擇你要用的 Ruby 版本。)
    (如果沒有偵測到 Ruby 的話,可以直接加上 Ruby 安裝路徑,例如: C:\Ruby200-x64)

  • 確定好 config.yml 之後,下指令 ruby dk.rb install

這時 DevKit 應該會 增加或更新 兩個Ruby的檔案,這時就成功安裝完成了。

安裝 Rails

此時安裝 Rails 就不用那麼麻煩,直接下指令就可以了。

  • 先更新一下gem gem update --system

  • 安裝 sqlite3 gem install sqlite3 --no-ri --no-rdoc
    (--no-ri --no-rdoc 在本地端不要產生 ri 跟 rdoc 文件,現在網路上很容易就可以查詢到這些文件,其實沒必要建立。)

  • 安裝 rails gem install rails --no-ri --no-rdoc

  • 安裝完後測試 rails -v

  • 如果成功會出現 Rails 4.0.2

恭喜你已經成功安裝 Rails ,可以開始參加 Rails Girls聚會

References

| Posted by Lee

[Java] 使用 OAuth 連接 RESTful Web Services

最近為了運用 hackpad 在研究 RESTful Web Services ,由於 JDK 並沒有支援,特地搜尋了一下,發現網路中文資源也很少,特此整理了一下。

主要會需要用到兩個套件

使用 Jersey 建立簡單 RESTful GET 連線

TestREST.java
package org.lee.rest;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;

public class TestREST 
{    
    public void run()
    {
        ClientConfig config = new DefaultClientConfig();
        Client client = Client.create(config);
        WebResource service = client.resource(UriBuilder.fromUri("http://restful").build());
        System.out.println(service.accept(MediaType.APPLICATION_JSON).get(String.class));
    }

    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub

        TestREST test = new TestREST();
        test.run();
    }
}

很簡單的使用 WebResource 去獲取 REST 的 Resouce ,後面的 fromUri 就是 REST services 所在的網址。
service.accept 提供獲取下來以什麼方式呈現 (xml, json等),此處是 json 為例。

經由 OAuth 建立 RESTful GET 連線

那如果要使用 OAuth 連線的 RESTful services 要如何呢? 其實只多加兩行程式碼。

TestREST.java
package org.lee.rest;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.oauth.client.OAuthClientFilter;
import com.sun.jersey.oauth.signature.OAuthParameters;
import com.sun.jersey.oauth.signature.OAuthSecrets;

public class TestREST 
{
    private static final String CLIENT_ID = "YOUR_CLIENT_ID";
    private static final String SECRET = "YOUR_SECRET";
    
    public void run()
    {
        ClientConfig config = new DefaultClientConfig();
        Client client = Client.create(config);
        OAuthClientFilter filter = new OAuthClientFilter(
                client.getProviders(), 
                new OAuthParameters().consumerKey(CLIENT_ID), 
                new OAuthSecrets().consumerSecret(SECRET));       
        client.addFilter(filter);
        WebResource service = client.resource(UriBuilder.fromUri("http://restful").build());
        System.out.println(service.accept(MediaType.APPLICATION_JSON).get(String.class));     
    }

    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub

        TestREST test = new TestREST();
        test.run();
    }
}

增加個 filter 告訴連線的 Client 是使用 OAuth 連線,需要 OAuth 的兩個必要參數 Client id 與 Secret ,如此一來便能在使用 OAuth 連線的 RESTful Web Services 。

POST 部分,請容我脫稿,下次再補上 其實是根本還沒研究好

參考資料

| Posted by Lee

[C] 透過函式記憶體配置 malloc()

前幾天朋友問了有關 C語言 記憶體配置的問題,一直搞不定,只好再次拿出許久的 C語言 講義摸索

特此在這裡記錄一下心得。

常用記憶體配置

一般來說我們記憶體配置標準寫法如下:

malloc.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
    char* ch = NULL;
    ch = (char*)malloc(sizeof(char));
    return 0;
}

我們增加的是指標ch,增加ch指到更多記憶體,就能表示字元陣列。

透過函式記憶體配置

那當我們想模組化,透過函式記憶體配置要怎麼做呢?

常常會以為用平常傳址函式的寫法就可以了,如下:

錯誤寫法
#include <stdio.h>
#include <stdlib.h>
void getMemory(char* s)
{
    s = (char*)malloc(sizeof(char));
}
int main()
{
    char* ch = NULL;
    getMemory(ch);
    return 0;
}

結果試半天是錯的,其實仔細一想既然ch = NULL,丟進去函式裡面,函式怎麼知道ch是位於哪裡然後給ch位置呢?

因此這時就需要用到雙重指標來把ch的位置傳進去

正確寫法如下:

fun_malloc.c
#include <stdio.h>
#include <stdlib.h>
void getMemory(char** s)
{
    *s = (char*)malloc(sizeof(char));
    printf("s = %p\n", s);
    printf("*s = %p\n", *s);
}
int main()
{
    char* ch = NULL;
    getMemory(&ch);
    printf("&ch = %p\n", &ch);
    printf("ch = %p\n", ch);
    return 0;
}

使用printf印出記憶體位置:

s = 0x7fff5d2ebc00
*s = 0x7f943bc000e0
&ch = 0x7fff5d2ebc00
ch = 0x7f943bc000e0

由此可知s == &ch*s == ch,然後函式裡面增加*s的位置,這樣就可以達到我們的目的了。

| Posted by Lee

[Git] Auto Commit by Batch File

最近接觸了 GitHub ,一直想說能不能有隻程式幫忙自動 Commit

這樣對於一些常修改資料就可以自動備份啦。超懶

後來對 Java GitHub API 研究了一番,怎麼也試不出來,感覺要從產生檔案的 Blob 開始做,太複雜了,不符合需求。

因此後來就寫了個 Batch File,簡單的用指令控制 Git 。

Batch Code

@ECHO on 

cd /d folder's path

REM get date and time 
for /f "delims=" %%a in ('date/t') do @set mydate=%%a 
for /f "delims=" %%a in ('time/t') do @set mytime=%%a 
set var=%mydate%%mytime% 

REM add all new files 
call git add . 
call git commit -a -m "Automated commit on %var%" 
call git push
exit

最後在存成 .bat ,然後去 Windows 的自動排程系統裡設定時間定時執行就可以啦。

要在 batch file 裡,執行 Git 指令,要先設定系統環境變數 path: C:\Program Files (x86)\Git\bin
還有使用最高權限執行 batch file。 我就在這裡卡很久阿阿阿阿阿