聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

二月 22, 2015

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 6to5 JavaScript Transpiler 重新命名為 Babel

es6-logo

先前寫了一篇 CoffeeScript 轉 ES6,裡面有提到 6to5 專案,此專案幫助開發者可以直接寫 JavaScript ECMAScript 6,該專案則會將 ES6 轉成 ES5,但是目前瀏覽器對於 ES6 的支援度還沒有很高,可以直接參考 ECMAScript 6 compatibility table,但是看到專案名稱 6to5,就會覺得如果之後 ES7 出來,不就要多開一個 7to6 專案,果然官方在 Blog 宣佈將名稱正式轉為 BabeljsBabel 也會持續使用最新 JavaScript Standard 開發 JavaScript transpiler 相關工具,讓各種平台程式都可以使用。

現在就可以透過 Babel 來開發 ES6

$ npm install --global babel

ES6 轉 ES5

$ babel script.js

一些來自 Mozilla, Esprima, jQuery Foundation, Acorn, 6to5, ESLint 組織成員,也合力開了 ESTree,而 Babel 以 ESTree 為基底來開發相關 Tool,所以最新的 Standard 也可以直接參考 ESTree。

二月 21, 2015
» 2015 農曆年刮刮樂 怎麼買?

過年的時候常常想趁著好彩頭試試手氣,除了加碼的樂透彩之外,台灣彩卷也加碼推出幾款新的刮刮樂。新的產品勝率比平時還高一點,機率都可以透過獎金結構計算得出 。

以下依照彩卷價格提供 2015 的購買攻略

  • 一百元 – 純粹想買,小試身手,請買「旺旺來」,31.09% 會贏回賭資。
  • 兩百元 – 五成機會不花錢試試手氣!請買「開春大吉」有 50.285% 贏回賭資,還有 15.285% 機率賺錢。
  • 五百元 – 保證中獎!「新年快樂」是 100% 中獎率,保證不貢龜,38.17% 贏回賭資、14.17% 賺錢。(「金羊獎」也 100% 中獎率,中大獎機會稍高)
  • 一千元 – 最有機會獲利!「$1,200萬大吉利」70.1% 高中獎率、37.3% 贏回賭資、18.9% 賺錢,還有 0.0021% 機率贏得十萬以上彩金。(「大麻將」的機率差不多)
  • 兩千元 – 最有機會贏大獎!「$2,600萬超級紅包」超過十萬中獎率高達 0.10005%。有 20.83% 贏回賭資。

最基本的概念是千萬不要相信「發正念」、「秘密」、「吸引力法則」 之類狗屁倒灶的購買秘訣。

你贏不了機率。

下注越多次,越接近台灣樂透所設定之期望值,以兩千元的「$2,600萬超級紅包」為例子,買了越多彩卷,越接近每注損失 25.5% 也就是 510 台幣。這還不加上中獎時的稅金,也就是百分之二十所得稅稅款,外加千分之四印花稅。

記得,購買彩卷不是一項投資,而是購買一個短暫的喜悅。小賭怡情,買的更多只會抵銷喜悅的快感唷!

祝您中獎。

品名 金額 中獎率 回本機率 賺錢機率 十萬以上機率 期望值 House Edge
$2,600萬超級紅包 2000 80.83% 20.8300% 5.0300% 0.100050000% 1,489.97 25.50%
$1,200萬大吉利 1000 70.10% 37.3000% 18.9000% 0.002100000% 720.02 28.00%
大麻將 1000 70.33% 36.3300% 22.3700% 0.002000000% 735.13 26.49%
五福臨門 500 42.21% 42.2100% 16.1200% 0.000700000% 340.00 32.00%
新年快樂 500 100.00% 38.1700% 14.1700% 0.000085714% 335.02 33.00%
棋王 500 45.10% 45.1000% 15.1000% 0.000600000% 335.05 32.99%
金羊獎 500 100.00% 37.9800% 13.9800% 0.000100000% 330.02 34.00%
三羊開泰 300 35.54% 35.5384% 12.5342% 0.000690000% 194.88 35.04%
紅包一把抓 300 35.41% 35.4142% 13.0169% 0.000590000% 195.03 34.99%
金幣大作戰 300 35.72% 35.7200% 12.9212% 0.000098039% 194.85 35.05%
羊羊得意 200 32.25% 32.2465% 16.3620% 0.000980392% 125.96 37.02%
花開富貴 200 33.25% 33.2533% 11.6521% 0.000098039% 125.94 37.03%
超級年終獎金 200 50.16% 50.1600% 13.8800% 0.000300000% 125.98 37.01%
金玉滿堂 200 30.96% 30.9606% 12.2443% 0.000085714% 123.96 38.02%
開春大吉 200 50.29% 50.2850% 15.2850% 0.000450000% 127.96 36.02%
黃金連線 200 31.11% 31.1100% 12.9100% 0.000267380% 125.96 37.02%
天生一對 100 30.26% 30.2606% 11.4863% 0.000147959% 59.99 40.01%
好彩頭 100 30.04% 30.0351% 11.7170% 0.000144175% 59.99 40.01%
年年有魚 100 30.13% 30.1280% 10.6650% 0.000098039% 60.99 39.02%
幸福滿天 100 30.04% 30.0407% 12.8866% 0.000147059% 59.99 40.01%
旺旺來 100 31.09% 31.0862% 12.5980% 0.000161480% 59.99 40.01%
聚寶盆 100 30.00% 29.9984% 14.1581% 0.000163399% 60.00 40.00%
迎財神 100 30.10% 30.1028% 8.1714% 0.000065359% 60.99 39.01%

詳細的原始資料列於 Google Drive.

二月 11, 2015

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 您不可不知的 io.js

9950313

io.js 至今已經成立了快三個月,目前也快速推出到 1.2.0 版本了,相信很多人都不太知道為什麼會多一個 io.js 組織,這組織是 fork 自 Joyent’s Node.js 相容於 npm 原始平台。

為什麼 fork Node.js

這就是大家所好奇的地方,iojs 團員皆來自於 Node.js 核心開發團隊,在去年八月,內部成立了 Node Forward 社群組織來試圖改善 Node.js。

A broad community effort to improve Node, JavaScript, and their ecosystem through open collaboration.

然而總是事與願違,底下就是為什麼要 fork Node.js 主因

Some problems require broader ownership and contributorship than have traditionally been applied, while others are so dispersed between tiny projects that they require new collaborative space to grow. Node Forward is a place where the collaboration necessary to solve these issues can take place.

最終因為商標版權的限制下,核心團員才決定直接 fork Node.js,這就是 io.js 的誕生。Isaac Schlueter (核心開發團員之一) 在部落格發表了一篇心得提到為什麼要這麼做,一個關鍵點,就是未來 io.js 還是希望能夠跟 Node.js 專案合併,而不是現在這樣分成兩個專案。

io.js 新變化

io.js 使用 semantic versioning (semver) 釋出 1.0.0 版本,用此版本來區分 Node.js。jQuery 官方部落格也指出使用 semver 的重要性

One of those best practices is semantic versioning, or semver for short. In a practical sense, semver gives developers (and build tools) an idea of the risk involved in moving to a new version of software. Version numbers are in the form of MAJOR.MINOR.PATCH with each of the three components being an integer. In semver, if the MAJOR number changes it indicates there are breaking changes in the API and thus developers need to beware.

最新 V8 Engine

io.js 更新內部 V8 Engine 到 3.31.74.1 版本,讓開發者可以直接使用 JavaScript ES6 新功能,而不需要加上 --harmony 參數

ES6 新功能

底下的新功能都不用加上任何 Flag 就可以正常使用

新模組

io.js 內建了兩個實驗性新模組

  • smalloc: 讓您透過 allocation/deallocation/copying 存取外部記憶體。
  • v8: 暴露 iojs 中 v8 的 events and interfaces。

更多資料可以直接參考 io.js 版本紀錄.

執行 io.js

執行 io.js 就如同執行 node.js 一樣,只是名稱變了而已

Node.js

$ node app.js

io.js

$ iojs app.js

Node 版本管理

相信大家都是使用 Node version manager (nvm) 工具來管理多個 node 版本,您可以透過底下指令來找到 io.js 版本列表

$ nvm ls-remote v1
    iojs-v1.0.0
    iojs-v1.0.1
    iojs-v1.0.2
    iojs-v1.0.3
    iojs-v1.0.4
    iojs-v1.1.0
    iojs-v1.2.0

個人建議一定要裝上 nvm 工具,此工具可以讓您隨時切換 node 版本,包含 iojs 各版本,確保測試無誤

開始使用 io.js?

這問題很多人一定會問自己,現在要把專案換到 io.js 上了嗎?我個人覺得,舊有專案如果在 Node.js 跑的很順,就不建議切換,如果是新專案,又想跑 JavaScript ES6 Feature,就可以直接嘗試看看跑 io.js 1.2.0 版本。本文翻譯自 Getting to know io.js。如內容有誤,請儘速告知。

二月 9, 2015

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 成立 iojs 台灣群組

9950313

昨天在 node.js 台灣群組討論對岸已經成立 iojs-cn,不多說我們也請官方幫忙成立了 iojs-tw,目前的工作只有兩項,就是負責將[ iojs 官網]翻譯成中文,這部份 @cfsghost 已經送 PR 給官方了,另外就是翻譯官方的 Weekly Notes,iojs 每週五都會發布一篇 iojs 的最新動態,我們就是負責將其中文化,上週五已經翻譯好了請參考如下:

io.js 週報 – 2015.02.06

Atom & nw.js 開始採用 io.js, Linux Tracing .. 等等。

每周五我們都會發布關於 io.js 的最新發展。

回顧整個一月份的社群貢獻,io.js 共有 294 次提交,是 Node 近三年來第三活耀的月份,(2012 年 2 月份有 308 次提交)。随着社群貢獻的成長,預計二月份會有更多產出。

  1. 發布 v1.1.0,詳細資訊請參考更新紀錄
  2. Sam Newman lands 簡化了 Stream 建構方法
  3. 正在進行 加入 Linux Tracing (LTTNG) 的工作
  4. 隨著我們加強在 io.js debugging 工作,Google 分享了部分在 V8 和 Chrome 中應用的追蹤技術
  5. Travis CI 增加了 io.js 的支援
  6. Codeship 支持 io.js
  7. Atom 編輯器轉移到 io.js
  8. nw.js(前身是 node-webkit)轉移到 io.js
  9. Tessel 硬體新產品將支援 io.js
  10. Chris Dickinson 增加了 6 位新的貢獻者,活躍的貢獻者目前共有 23 名
  11. 正在制定穩定兼容性策略,歡迎踴躍參加。
  12. 我們開始接受各大公司的反饋意見。如果您有我們遺漏掉的的公司的聯絡方式,請告知我們。
  13. 下週舉行 Node summit,將會有許多演講和與會者。
  14. 技術委員週會
  15. 網站工作群組會議
  16. 追蹤工作會議

原文:io.js Week of February 6th 2015,作者:@iojs,翻譯 @iojs-tw

如要加入 iojs 翻譯請直接到這裡申請

二月 6, 2015

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Laravel 5 PHP Framework 釋出

Laravel PHP Framework

很開心看到 Laravel 作者 Taylor Otwell 能在年前公開 Laravel 5 is Released!,這次連官網也順道一起改版了,經過幾天努力,Laravel Taiwan 也將官網換成新的了,這次 Laravel 5 共釋出 22 個新功能,前端部份也導入新功能叫做 Elixir,另外也將 Scheduler 納入主功能了,非常開心能看到作者開發了好多新功能。由於 Laravel 5 出來了,那接下來就是要翻譯新的文件,請大家可以到 Hackpad 登記翻譯,翻譯完成後送 PR 到 Laravel Taiwan documentation Repo,基本上翻譯過 4.2 版本,把差異性部份補上即可。

Laravel 5 新功能可以直接到 Laracastslaravel 5 Fundamentals 教學影音。

一月 31, 2015

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» CoffeeScript 轉 ES6

es6-logo

開始嘗試 ES6

最近有時會看看 JavaScript ECMAScript 6 的相關文件,今年也是時候將新專案用 ES6 來撰寫,在還沒使用 ES6 以前,我個人比較偏好使用 CoffeeScriptLiveScript,如果嚐試過 CoffeeScript 後,你會發現轉換成 ES6 是相當容易。網路上可以直接看 6to5 專案,提供 Sprockets, Broccoli, Browserify, Grunt, Gulp, Webpack ..等,要嘗試 ES6 語法轉成 Javascript 可以透過 ES6 repl 介面來嘗鮮。

Classes

來看看用 CoffeeScript 怎麼寫 JavaScript Class:

class Person
  constructor: (@firstName, @lastName) ->

  name: ->
    "#{@first_name} #{@last_name}"

  setName: (name) ->
    names = name.split " "

    @firstName = names[0]
    @lastName = names[1]

boy = new Person "Bo-Yi", "Wu"
boy.setName("Boy Apple")
console.log boy.name()

在 ES6 可以使用 classes, getters, and setters

class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  get name() {
    return this.firstName + " " + this.lastName;
  }

  set name(name) {
    var names = name.split(" ");

    this.firstName = names[0];
    this.lastName = names[1];
  }
}

var boy = new Person("Bo-Yi", "Wu");
boy.name = "Boy Apple";
console.log(boy.name);

從上面可以發現 2 點不一樣的地方

  • 可以忽略 function 字串
  • 每個 function 後面不需要分號(;)

Interpolation

ES6 開始支援 Template String,詳細可以參考 Addy Osmani 最新寫的 Getting Literal With ES6 Template Strings

CoffeeScript:

"multi-line strings with interpolation like 1 + 1 = #{1 + 1}"

JavaScript:

"multi-line strings with interpolation like 1 + 1 = " + (1 + 1)

ES6 template strings:

// 這邊需要注意的是,兩邊並非是雙引號或單引號,而是 ` 符號
`multi-line strings with interpolation like 1 + 1 = ${1 + 1}`

注意 ES6 並非用雙引號了。所以上面的 get name function 可以改成底下

get name() {
  return `${this.firstName} ${this.lastName}`;
}

Fat Arrows

在寫 Javascript 要如何把目前的 this 綁定到現在函式內,可以透過 CoffeeScript 的 => 符號,現在 ES6 也支援了

純 JavaScript 寫法

var self = this;

$("button").on("click", function() {
  // do something with self
});

CoffeeScript:

$("button").on "click", =>
  # do something with this

ES6:

$("button").on("click", () => {
  // do something with this
});

Default arguments

CoffeeScript 可以定義函式傳入預設值

hello = (name = "guest") ->
  console.log(name)

ES6 現在也可以了

var hello = function(name = "guest") {
  alert(name);
}

Splats functions

PHP 5.6 開始也支援了 Variadic functions,而 CoffeeScript 也有此功能

PHP 5.6:

<?php
function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1, 2, 3, 4);
?>

CoffeeScript:

awards = (first, second, others...) ->
  gold = first
  silver = second
  honorable_mention = others

ES6:

var awards = function(first, second, ...others) {
  var gold = first;
  var silver = second;
  var honorableMention = others;
}

Destructuring

Destructuring 讓變數可以直接對應物件或陣列內容

CoffeeScript:

[first, _, last] = [1, 2, 3]

ES6:

var [first, , last] = [1, 2, 3];

我們可以將 set name 函式改成底下

set name(name) {
  [this.firstName, this.lastName] = name.split(" ");
}

結論

更多學習資源可以直接參考 6to5 專案,從現在開始擁抱 ES6 吧。

參考: Replace CoffeeScript with ES6

一月 20, 2015

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Debian 7.x Install PHP 5.5 或 5.6 版本

screen

Debian 目前預設的 PHP Stable 版本是 5.4.x,由於 Laravel PHP Framework 關係,所以希望升級到 PHP 5.5 或 5.6 版本,只要透過底下操作就可以直接裝 PHP 5.6 版本了

echo "deb http://packages.dotdeb.org wheezy-php56 all" >> /etc/apt/sources.list.d/dotdeb.list
echo "deb-src http://packages.dotdeb.org wheezy-php56 all" >> /etc/apt/sources.list.d/dotdeb.list

完成後請加入 apt key,如果是要安裝 PHP 5.5 請將 wheezy-php56 改成 wheezy-php55

$ wget http://www.dotdeb.org/dotdeb.gpg -O- | apt-key add -

接著更新 apt repository 及安裝 PHP 5.6

$ aptitude update
$ aptitude install php5-cli php5-fpm

如果有安裝 php5-memcached 時,會遇到找不到 libmemcached11 套件,這時候請在 repository list 加入

deb http://packages.dotdeb.org wheezy all

接著再重新安裝一次 php5-memcached 即可

一月 7, 2015
» 七分鐘瘦一身

由於出差的關係,已經好一段時間沒有認真運動,體脂上升頗快,相較稍早之前認真做 Insanity Workout,代謝明顯變慢。但是 Insanity Workout 運動需要很大的空間,很不適合在旅館房間內進行,更別說需要額外工具的 P90X Workout[2]

於是需要找一套簡單、不需要工具只使用自我體重的訓練方法。查到了 2013 年美國運動協會的一篇利用高強度循環訓練(High-Intensity-Circuit-Training, HICT) 的研究論文 HIGH-INTENSITY CIRCUIT TRAINING USING BODY WEIGHT: Maximum Results With Minimal Investment,這篇研究設定了在七分鐘內做完的十二個簡單動作,只需要一把椅子與一面牆,也沒有太多的跳躍或跨步動作,不會再狹小的房間中施展不開。

注意事項

  • 開始前記得暖身三分鐘,不要隨意敷衍運動,動作必須確實以免受傷。
  • 重點是降低運動的間隔時間,這篇論文建議是每三十秒運動,間隔十秒。大約一回合花去七分鐘。
  • 應該要盡可能加快運動速度,但是也不用過於勉強,剛開始可以依照體能慢慢調適。
  • 心跳率應該要衝到極限 (Maximum Heart Rate, MHR) 的 65% 以上 ,以我而言是一定是超過 80%, 也就是每分鐘超過 150.
  • 雖然一回合是七分鐘,但是建議的運動量是二十分鐘以上,也就是應該要做兩個回合到三個回合。

以下是一個回合的示範影片

為了設定訓練目標,我用 Andriod App 7 分鐘鍛煉來提醒並紀錄訓練次數。

十二月 28, 2014

csw-dawn
csw-dawn
csw.dawn
» Install Node.js on ubuntu 14.04

1. sudo apt-get update
2. sudo apt-get install gcc
3. sudo apt-get install make
4. sudo apt-get install g++
5. sudo apt-get install libssl-dev
6. wget http://nodejs.org/dist/v0.10.35/node-v0.10.35.tar.gz
7. mv node-v0.10.35.tar.gz /usr/local/
8. cd /usr/local
9. tar zxvf node-v0.10.35.tar.gz
10. cd node-v0.10.35
11. ./configure
12. make
13. sudo make install
14. vim helloworld.js
      console.log('Hello World! Node.js');
15. node helloworld.js
      Hello World! Node.js
16. enjoy!

十二月 24, 2014

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» GitLab 快速安裝

gitlab_logo

最近想安裝新版的 GitLab,竟然發現 GitLab 推出快速懶人包,終於可以不用打很多指令來安裝了,大幅降低了安裝困難度,目前支援 CentOS, Ubutnu, Debian 等安裝包,GitLab 各版本也可以從這邊列表找到,另外安裝前請確保你的硬體環境是符合 GitLab 所要求,來看看有沒有這麼簡單安裝。

安裝方式

底下是 Debian 7 安裝方式

wget https://downloads-packages.s3.amazonaws.com/debian-7.7/gitlab_7.6.1-omnibus.5.3.0.ci-1_amd64.deb
sudo apt-get install openssh-server
sudo apt-get install postfix # Select 'Internet Site', using sendmail instead also works, exim has problems
sudo dpkg -i gitlab_7.6.1-omnibus.5.3.0.ci-1_amd64.deb

完成後,你會看到畫面要求您執行 gitlab-ctl reconfigure 來啟動所有服務,檢查服務是否都正常啟動可以透過 gitlab-ctl status 看到底下就代表啟動成功

run: logrotate: (pid 29315) 2180s; run: log: (pid 25339) 2699s
run: nginx: (pid 29886) 2148s; run: log: (pid 25324) 2701s
run: postgresql: (pid 29334) 2179s; run: log: (pid 16414) 3353s
run: redis: (pid 29342) 2179s; run: log: (pid 16313) 3360s
run: sidekiq: (pid 2542) 1282s; run: log: (pid 25303) 2703s
run: unicorn: (pid 2598) 1279s; run: log: (pid 25278) 2704s

如果系統本身有安裝 Nginx,請將 GitLab 預設 80 port 改掉,請修改 /etc/gitlab/gitlab.rb 設定檔,找到底下

nginx['redirect_http_to_https_port'] = 80

修改成

nginx['redirect_http_to_https_port'] = 8088

儲存設定檔後,請重新跑 gitlab-ctl reconfigure 即可,另外對外網址也請設定正確 external_url。另外官方也有寫出 Digital Ocean 也直接推出 One-click install and deploy GitLab,一個月才 10 美金,真是太超過了。

十二月 12, 2014

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Parse 支援台灣繁體中文文件

parse-logo

Parse 月初宣佈將支援簡體、繁體、日文、韓文等語系的文件,為什麼宣佈此消息呢?其實原因最大就是在 Parse 內部統計,全世界亞洲區的流量成長率高達 90 %,加上全球 15 個最大用戶內,亞洲區就佔了六個 India, Japan, Australia, China, Taiwan, Korea。沒看錯,台灣也是榜上有名。雖然不知道台灣有哪些網站用到了 Parse,我自己最主要用 Parse 的原因就是 Push Notification,公司就不用架設兩套伺服器 AppleGoogle GCM。Parse 提供了 JavaScript, PHP SDK, .NET SDK 等。台灣開發者可以直接線上看繁體中文文件了。

十二月 10, 2014

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 解決在 Ubuntu 系統下 Chrome 瀏覽器亂碼

Screenshot from 2014-12-10 22:15:27

UbuntuChrome 瀏覽器一陣子後,突然發現全部的中文介面都變成亂碼,就像上面這張截圖一樣,除了網頁可以正常顯示外,其他像是 Tab 或書籤都變成亂碼,在百度找到這篇解答,解決方式很容易,但是就是不知道原因為什麼這樣改就可以,底下紀錄如何解決此問題。

打開 /etc/fonts/conf.d/49-sansserif.conf 可以看到底下內容

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!--
  If the font still has no generic name, add sans-serif
 -->
        <match target="pattern">
                <test qual="all" name="family" compare="not_eq">
                        <string>sans-serif</string>
                </test>
                <test qual="all" name="family" compare="not_eq">
                        <string>serif</string>
                </test>
                <test qual="all" name="family" compare="not_eq">
                        <string>monospace</string>
                </test>
                <edit name="family" mode="append_last">
                        <string>sans-serif</string>
                </edit>
        </match>
</fontconfig>

找到倒數第四行的 sans-serif 換成 ubuntu 字串,關閉瀏覽器重新開啟即可。

十二月 3, 2014

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 加速 PHP Composer 執行效率

logo-composer-transparent

早上剛起床就看到 DK 發表一篇增加一行程式碼讓 PHP Composer 效率爆增Composer 是 PHP 套件管理工具,現在各大 Framework 都用 Composer 管理套件相依性,但是最讓人擔憂的是,每次執行 composer install 或 update 的時候,機器就會開始哀號,然後等了很久指令才執行完成。今天看到 Github 上 Composer 為了改善執行效率及時間就把 gc disabled。這 commit 引發了很多人迴響,超多搞笑留言圖片。底下有兩種方式可以加速 Composer 執行效率

更新 Composer 到最新版

請透過 composer self-update 將 composer 更新到最新版,因為今天已經將 gc_disable 納入官方程式碼內了。

/**
* Run installation (or update)
*
* @return int 0 on success or a positive error code on failure
*
* @throws \Exception
*/
public function run()
{
    gc_disable();

測試數據如下,原本

$ composer update --dry-run --profile
# Memory usage: 164.29MB (peak: 393.37MB), time: 82.9s

關閉 gc 後

# Memory usage: 163.99MB (peak: 318.46MB), time: 47.14s

如果尚未更新 composer 到最新版,可以透過底下指令:

$ php -d zend.enable_gc=0 composer update --dry-run --profile

其實真正原因是出在 GC,可以參考此留言

This might indeed be a GC issue. If there are many objects created – all of which cannot be cleaned-up. PHP’s GC will kick in frequently trying to clean-up, only to discover that it cannot clean-up anything, and just wastes time/CPU cycles. This might be the reason why you see the effect for big projects (= many objects), but not so much for small projects (= GC is not kicking in frequently). In these cases, disabling GC entirely is a lot faster (at the cost of some more memory consumption ofc). If no-one has checked yet, it might be worth to add gc_disable() to the update/install command.

保留 composer.lock

在還沒有關閉 GC (Garbage Collection) 之前,可以透過 cache 來減少 composer 執行時間,Laravel 本來將 composer.lock 放入 .gitignore 內,現在我們將此行拿掉,也就是不要任意升級版本,避免讓程式 crash 掉。並且透過底下指令來初始化專案,保留 composer.lock 有兩個好處

  • 不會因為 composer update 讓整個專案爛掉
  • Deploy 時 composer install 會直接從本地端抓取相依程式碼

底下為 Deploy 上 Production 時所執行的指令

$ composer install --prefer-dist --no-dev --no-scripts

第一次由於沒有 cache,會比較慢,等到第二次安裝時,就可以減少一大半時間。

十二月 1, 2014

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» CodeIgniter 搭配 Homestead 開發環境

CodeIgniter

HomesteadLaravel Framework 所提供出來的懶人安裝環境,大幅降低學習 Laravel 的門檻,大家都知道初學一套 Framework 最重要的是快速寫出 Hello world,如果初學者卡在環境都架設不來,那就更加不用接著學習 MVC 架構了,所以 Laravel 提供了 Homestead,不管你是用 Linux 或 Windows 都可以快速的把開發環境架設起來。相信很多人也從 CodeIgniter 跳往 Laravel 框架了,但是舊的網站還是要維護阿,所以這次透過 Laravel Homestead 一起來把 CodeIgniter 開發環境無痛架設起來,省去新人安裝 Nginx + PHP + MySQL 的時間。

這次直接用之前在成功大學電算中心講課的專案來搭配 Homestead,專案為 CodeIgniter-App,如果尚未安裝 Homestead 指令,可以直接參考我上一篇教學 Laravel Homestead 2.0 介紹,接下來我們一步一步安裝,架設環境為 Debian 7.4。

設定 Homestead.yaml

先將 CodeIgniter-App 程式碼下載到 /home/git 目錄,此目錄可以任意指定

$ git clone https://github.com/appleboy/CodeIgniter-App.git /home/git/CodeIgniter-App

打開 ~/.homestead/Homestead.yaml,原版您的 Laravel 專案設定如下

---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: ~/.ssh/id_rsa.pub

keys:
  - ~/.ssh/id_rsa

folders:
  - map: /home/appleboy/newProject
    to: /home/vagrant/Code

sites:
  - map: homestead.app
    to: /home/vagrant/Code/public

databases:
  - homestead

variables:
  - key: APP_ENV
    value: local

這次增加 CodeIgniter 專案如下

folders:
  - map: /home/appleboy/newProject
    to: /home/vagrant/Code
  - map: /home/git/CodeIgniter-App
    to: /home/vagrant/codeigniter-app

sites:
  - map: homestead.app
    to: /home/vagrant/Code/public
  - map: codeigniter.app
    to: /home/vagrant/codeigniter-app/public

databases:
  - homestead
  - app

這裡可以發現增加了一組 folders、sites 和 databases,這樣就設定完成了

啟動 Homestead

完成後直接透過底下指令來產生相對應設定

$ homestead up --provision

注意的是,如果之前的 Laravel 專案資料庫存在的話,執行 --provision 則會砍掉 homestead 資料庫,然後重新建立新的,所以這邊建議執行 --provision 之前,先把舊的 database 拿掉會比較好。或者是要把初始化資料寫到 after.sh 內也是可以的。

#!/bin/sh

# If you would like to do some extra provisioning you may
# add any commands you wish to this file and they will
# be run after the Homestead machine is provisioned.

mysql -uhomestead -psecret app < /home/vagrant/codeigniter-app/sql/app.sql

增加 host

打開 /etc/hosts 增加新的 domain

172.21.117.2 homestead.app
172.21.117.2 codeigniter.app

最後打開瀏覽器 http://codeigniter.app:8000 就可以看到結果了喔

上述的 CodeIgniter-App 專案可以參考 https://github.com/appleboy/CodeIgniter-App

十一月 28, 2014
» Raspberry PI IR Receiver With Lirc


sudo apt-get install lirc liblircclient-dev
sudo vim /etc/modules

lirc_dev
lirc_rpi gpio_in_pin=18

vim /etc/lirc/hardware.conf
sudo vim /etc/lirc/hardware.conf
sudo /etc/init.d/lirc stop
mode2 -d /dev/lirc0

irrecord -d /dev/lirc0 ~/lircd.conf
irrecord --list-namespace
sudo cp lircd.conf /etc/lirc/lircd.conf
sudo /etc/init.d/lirc restart

~/.lircrc

begin
prog = irexec
button = KEY_0
config = echo "You pressed one"
repeat = 0
end

begin
prog = cc
button = KEY_0
config = 0
repeat = 0
end

cc.py

import RPi.GPIO as GPIO
import lirc


sockid = lirc.init("cc",blocking = False)
#"myprogram", "mylircrc")
#a="/etc/lirc/lircd.conf"
#lirc.load_config_file(a)

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(7, GPIO.OUT)
while (1):
	try:
		c=lirc.nextcode()
		if '0' in c:
			print(c,GPIO.input(7))
			GPIO.output(7, not GPIO.input(7))
	except:
		break

"""
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
#GPIO.output(7, False)
#GPIO.output(7, True)

GPIO.output(7, not GPIO.input(7))
GPIO.output(7, True)
"""
GPIO.cleanup()

The post Raspberry PI IR Receiver With Lirc appeared first on Kevinwatt's Blog.

十一月 24, 2014

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Laravel Homestead 2.0 介紹

Laravel PHP Framework

在九月寫了 Laravel Homestead 的基礎介紹,最近 Laravel 推出 Laravel Homestead 2.0,在 1.0 套件是沒有支援 homestead 指令,現在 2.0 可以直接使用 homestead 指令,前置安裝 Vagrant + Virtualbox 就不在此介紹了。

安裝 Homestead

如同上面所說,以前是直接 clone homestead 專案下來就包含了全部 config 檔案,2.0 則是直接支援 homestead 指令,可以直接透過 composer 來安裝

$ composer global require "laravel/homestead=~2.0"

完成後可以在使用者目錄發現 ~/.composer/vendor/bin 目錄,此目錄內會含有 homestead 指令,所以只要把 ~/.composer/vendor/bin 寫入到 PATH 變數即可,直接寫到使用者 .bashrc.zhsrc 設定黨內即可,接著如何產生 Homestead 設定檔,請執行底下指令

$ homestead init

到使用者目錄可以看到 ~/.homestead 裡面就含有 Homestead.yaml 設定檔,將此檔案打開

---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/Code
      to: /home/vagrant/Code

sites:
    - map: homestead.app
      to: /home/vagrant/Code/Laravel/public

databases:
    - homestead

variables:
    - key: APP_ENV
      value: local

可以發現跟 1.0 不一樣的地方在於,現在 2.0 可以直接指定 Databases,以及區域變數。另外在 ~/.homestead 下可以發現多了 after.sh,詳細說明如下

If you would like to do some extra provisioning you may add any commands you wish to this file and they will be run after the Homestead machine is provisioned.

意思是說,中途要增加任何 command 可以將指令寫到 after.sh 後,直接執行 vagrant provision 即可,而不用登入 vagrant ssh。2.0 變化大致如下

  • 支援 homestead 指令
  • 增加 database 及 variables 設定
  • 增加 after.sh

詳細介紹可以參考 Introducing Laravel Homestead 2.0,更多介紹可以參考 Laravel Homestead 官方文件,或者直接看 Laracasts 教學影片

十一月 2, 2014

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 自動修復 JavaScript Linting-errors 好工具 Fixmyjs

前端工程師撰寫 JavaScript 程式碼後一定會透過 JSHint 驗證程式碼品質,但是 JSHint 只會提醒各位開發者哪些代碼需要修正,工程師還是需要手動去修復這些錯誤,這有點麻煩,所以今天來介紹一套自動修正 JSHint 錯誤的好工具 Fixmyjs,如果大家有寫過 PHP,一定有聽過 PHP-FIG 制定了 PSR-0, PSR-1, PSR-2 等標準,希望 PHP 工程師可以遵守這些規則,而 PHP-CS-Fixer 就是根據 PHP-FIG 來自動修復 PHP 程式碼,讓程式碼可以遵守這些共同制定的標準。

Fixmyjs 的出現解決了 JSHint 的問題,但是大家會問 FixMyJS 幫我們解決了哪些問題,請看底下

  • 自動幫忙補上分號 semicolons
  • 強制轉換 camelCase
  • 幫忙移除 debugger 程式碼
  • 執行雙引號或單引號
  • 自動補上空白
  • Mixed spaces/tabs
  • 去除行尾空白
  • 自動轉換 array literal 和 object literal

更多支援請參考這裡,給個範例大家比較有感覺,可以看一下底下程式碼

var a = Array();
var b = Object();
var c = [];
var d
debugger;
delete c;
a == null;
var e = undefined;
var foo = new Foo;
foo([1, 2, 3,]);
a = 1;
a++;
var x = 1;;
a == NaN;
a != NaN
var q = .25;

透過 fixmyjs 指令轉換,可以得到底下結果

var a = [];
var b = {};
var c = [];
var d;
c = undefined;
a == null;
var e;
var foo = new Foo();
foo([
  1,
  2,
  3
]);
a = 1;
a++;
var x = 1;
isNaN(a);
!isNaN(a);
var q = 0.25;

透過命令列可以直接轉換 JavaScript 檔案

$ npm install fixmyjs -g
$ fixmyjs app.js

另外如果有使用 Sublime Text 編輯器可以直接找 sublime-fixmyjs,當然也可以透過 gulp-fixmyjs 來導入自動修復流程。gulp 可以參考底下

gulp.task 'jshint', ->
  gulp.src 'app/assets/js/**/*.js'
    .pipe $.fixmyjs
      legacy: true
    .pipe gulp.dest 'app/assets/js/'
    .pipe $.jshint()
    .pipe $.jshint.reporter 'jshint-stylish'
    .pipe $.if !browserSync.active, $.jshint.reporter 'fail'

如果你將 legacy 設定為 false,你會發現 JavaScript 的空白 Line 會被移除,這已經回報到官方 Issue,所以現在建議大家還是將 legacy 設定為 true 會比較好,否則程式碼會擠成一團 XD

更多介紹可以直接參考 Explorations In Automatically Fixing JavaScript Linting-errors

十月 7, 2014