2015年5月3日 星期日

SASS 吐槽第二彈

又要來吐槽 SASS 了:
案例一: 既然 expression 可以在 property value 計算, height: (500px/2); width: 10px + 20px, width: $width/2; 變成 expression,那為何 font: 10px/8px; 跟 10px * px 就變成 string?
案例二: 承上,既然除法不能算,那我多加一個加法,就突然可以算了耶 e.g., 5px + 8px/2px
案例三: 長度除以長度不是應該是純量嗎? 5px + 8px/2px,5px 可以跟 4 相加耶。 重新試了一下 5px + 4 這樣也會變成 9px. squint 表情符號
計算行為真是有夠不一致的,不過認真說,到底要怎麼樣讓語法可以相容 font: 10px/22px 這種寫法又可以支援 expression? 強迫都用 interpolation ?

2015年5月1日 星期五

一些 SASS 的詭異編譯行為

最近在研究 SASS 的 Syntax 跟 Behaviour 發現相當多詭異的地方,根據這篇文章 All You Ever Need to Know About Sass Interpolation 探討 SASS 的 Interpolation:

其中像是:

width: calc(10px + 10px);

會被當成 string 編譯成:

width: calc(10px + 10px);

所以為了安插 Expression,就要寫成:

width: calc(#{ 10px + 10px });

而:

$some: 20px;
width: calc(100% - $some);

會變成

width: calc(100% - $some);

但:

 -webkit-transition: all 10s + 1s cubic-bezier(.1 + .1, .10, .25, .90);

Function 裏頭的 Expression 還是會照常編譯,變成:

-webkit-transition: all 11s cubic-bezier(0.2, 0.1, 0.25, 0.9);

根據該文 linear-gradient 也是把 function params 當成 string,但是在新版 SASS 行為卻又不同了;

background: linear-gradient( 10deg + 45deg, blue, #000000 + #010101);

直接編譯成:

background: linear-gradient(55deg, blue, #010101);

啥?

再來看一些例子.. SASS Reference 內提到 expression 之間如果有空白或者逗號就是 List 表示,那麼我假設下面這樣是 List:

>> abc blacc abc
("abc" "blacc" "abc")

這樣是沒錯的,那再來試試看別的:

>> abc blacc a#{test} abc
"abc blacc atest abc"

居然變成 String 了,好吧文件上寫說可以用圓括號將 List 括起來,那這樣呢?

>> (abc blacc a#{test} abc)
"abc blacc atest abc"

居然還是 String .... WTF?





2015年4月26日 星期日

SASS 開發團隊

SASS 一開始是 Hampton Litorn 所設計的,但他現在已經不負責這個專案,現在 SASS 專案的主要執行者是 Natalie Weizenbaum 小姐,據 Twitter 上的 Profile 知道是位 trans coder lady,目前在 Google 工作並參與 DART 專案。好強啊! 據說也是 HAML 專案的開發者之一,她應該也是 libsass 的幕後最主要的推手。

至於 Chris Eppstein 則是 Compass 的作者,Compass 是 SASS 的第一個 framework,而 Chris Eppstein 目前在 Linked-in 工作。

2015年4月20日 星期一

PHP - Deprecation notice

在開發函式庫時,免不了會修正 Class API 或是做一些重新命名, 重構等動作,接著做下一個版本的釋出。

Minor 版本的修正還好,但是 Major version 釋出時,如果你沒有先警告 User 哪些東西已經 deprecated 的話,是會遭到抱怨的。

這邊基本上有幾種做法:


  1. 針對 Critical Deprecation 的,可以 throw 出一個客製的 DeprecationException extends from LogicException
  2. 另外一種做法是比較 soft failure 的,使用 trigger_error,但把 message type 設定成 E_USER_DEPRECATED

以下是使用 trigger_error 的 snippet:


trigger_error("Deprecated class, please use MetadataRevisionSchema instead.", E_USER_DEPRECATED);


2015年4月10日 星期五

胃脹氣怎麼辦?

其實網路上討論脹氣的文章還挺不少的,如康健雜誌也有一系列討論胃脹氣的文章,可見脹氣真的是大多數人的困擾。脹氣原因其實很多,但主要原因還是在腸胃的主人沒有好好照顧自己的腸胃... 康健雜誌 - 為什麼會脹氣呢?

而筆者自己也是,前一天去拜訪長輩時其實已經吃過飯了,晚餐時禮貌上還是跟長輩們一起用餐,儘管已經聲明幾十次「已經吃過了」、「飽了」、「吃不下了」,某長輩還是一直不斷地問把這盤吃完吧。 據說,朋友們的長輩也都是這樣,讓我不禁懷疑台灣人是否是太沒同理心?要不就是相當遲鈍?結果最後吃到腸胃相當難受....

隔天,沒注意自己腸胃的狀況,中餐就在台中吃了客家本色,本以為應該是家好餐廳,但在點了一碗豬油飯、一碗蔥油飯和難吃的蒼蠅頭與滿滿可果美番茄醬味道的蝦球之後,就不覺如此了...豬油拌飯不像豬油拌飯就不說了,感覺用油不太新鮮,所以加了一堆醬油,蒼蠅頭使用的豬肉也不新鮮,比我吃過 KiKi 老媽的蒼蠅頭還難吃... 最後除了蝦球 60 分還可以接受以外,其他幾乎都沒吃完。

後來搭車回台北後,好戲就上場了,先感到腹脹 (這時候還只是覺得吃太飽而已),後來就開始連續胃脹氣疼痛五天... (現在進行式)

所以以下就是我這五天痛苦不斷上網查資料的心得:

1. 首先,台灣人的飲食習慣就是油炸、酒精、油膩食物、大魚大肉,雖然胃脹氣原因很多,但胃脹氣首要成因就是因為食用了過多的油膩食物,導致腸胃蠕動緩慢停滯,胰液和脂肪酸產生過量的二氧化碳導致脹氣。

2. 通常胃脹氣伴隨小腹腫脹,這樣代表你的小腸已經沒有力氣消化更多食物,沒辦法將消化中的食物送往大腸去,偏偏又產生出大量二氧化碳... 如果有白目的內臟主人,可能在發病期間還繼續用時,那就更不可能會好了

所以首要解決的就是消除胃脹氣,該怎麼辦?

1. 讓你的腸胃休息超過至少兩餐,但看症狀決定,一般來說脹氣至少要停兩餐,讓你的腸胃慢慢消化那些無法消化的食物

2. 先服藥緩解痛楚,台廠的藥我已經不信任了,不僅有廠商使用工業用碳酸鎂 (我相信這只是冰山一角),甚至像香港保濟丸放入會致癌的物質... 哎 台灣人真是有夠沒良心的。日本人製藥我比較安心,雖大家都推薦御岳百草丸,但這藥台灣買不到,我買了一瓶正露丸來服用,還蠻有效的。

正露丸是一種主成分為木餾油的非處方藥,主治腹脹腹瀉。最早是在中國戰場的日俄戰爭時,大日本帝國陸軍的軍用藥品,舊名為「征露丸」。 其成分包含:  木餾油、阿仙粉、黃柏粉、甘草粉、陳皮粉。 成分也是我考量使用正露丸的原因... 其中據我所知,陳皮粉就是用來消除脹氣用的。

木餾油是從1830年時,德國人從木焦油中分離出來的,在當時是作為治療化膿傷口與外用消毒藥來使用。由於具有殺菌的作用,也被當成是食用肉品的防腐劑、鎮咳劑、治療肺結核的用藥,之後,才運用在腸胃疾病的治療上。所以切記不要服用過多! 簡單認識正露丸

而木餾油,嘿嘿又可分工業防腐劑用跟醫藥用,如果不小心買到台廠的,說不定又是給你放工業用木餾油???? 總之我對台灣人製作產品已經沒有信心也感受不到他們的信用了。  詳情見此: 對於木餾油的誤解


3. 胃部按摩: 首先就是要先將胃部的氣體透過打嗝的方式緩慢排出啦,以肚臍為中心,往上方四個指節處,使用食指按壓 2-3 秒放鬆,重複 10-20 次後休息

4. 腸道按摩,腸道按摩很簡單,依照肚臍的位置為圓心,三指左右為半徑的部分都是小腸,面對肚臍做一個 ㄇ 字型做順時鐘按摩,每個點停頓 2-3 秒。 接下來按摩大腸,由右手邊小腸外側的升結腸起按到橫結腸,再按到降結腸為止.. 反覆十次左右休息,應該可以聽到腸胃開始慢慢蠕動的聲音


這邊有詳細步驟說明: 腸道按摩

5. 接下來就是不吃東西等腸胃好起來了,但不吃東西也不行,如果超過四餐狀況沒改善,身體撐不下去,所以建議吃一些消氣食物,真的只是 "一點" 喔,不然你胃部消氣了,小腸也消化不了又會復發,這邊我嘗試了好幾種,首先列出有用的: 熱薄荷茶 (不加糖),白蘿蔔,紅蘿蔔,對胃部脹氣很有效...  

這邊注意,重點是要減輕腸胃負擔,所以用餐時,以少量緩慢飲食為主,茶水喝太快會沖淡胃酸,消化更不良。

網路上文章寫說早起喝一整杯溫開水清腸胃,這是身體狀況好的時候才可以這樣做。


6. 胃部脹氣消掉了,再來就是小腸了.. 小腸比較難搞,要讓小腸好,就是不能給他太多工作,只能採用低渣飲食,所謂低渣飲食就是所有有粗纖維、油類、乳類製品都不可以吃...這是為了排除機械性的刺激及任何刺激物質,以減少蠕動,使腸胃道獲得充分休息,以及減少食物在消化後,於腸胃消化道留下殘渣,以減少糞便量。

奇美醫院這邊有份資料可以參考: http://www.chimei.org.tw/main/cmh_department/59012/health_info/DP_others/A5600217.html 請注意這份清單上的食物必須過濾掉易產氣食物、乳類製品、肉類製品及油膩食品.. (其實根本沒剩下幾種可選了 ...zzz)


7. 注意身體要休息放鬆,因為緊張的時候,交感神經興奮,使得腸道活動降低,消化液分泌量減少,排便不順。

8. 身體逐漸好了之後呢?一定要清淡飲食幾天,不然腸胃是一定會罷工的


但是你以為腸胃脹氣只是小 Case 嗎?錯!

有七成以上的免疫細胞,如巨噬細胞、T細胞、NK細胞、B細胞等,集中在腸道,有七成以上的免疫球蛋白A,由腸道製造,而且用來保護腸道。

很多人以為癌症是機率問題 (腦袋有洞?) 其實腸道不好,正是癌症之源啊!

台灣大腸直腸癌發生率不斷攀高,根據國民健康局統計,台灣平均每天有〺人得到大腸癌,十三人因此死亡。台中榮民總醫院大腸直腸外科主任王輝明說,大腸癌發生率不只居高不下,近來且年輕化,推測可能與環境汙染、吃太多肉、動物油有關。 
王輝明表示,汽機車排放廢氣中,致癌物苯芘含量高,消化道癌症風險也高。另外,食用燒烤、油炸以及醃漬類食品,也是大腸直腸癌的危險因子。肉類經高溫處理,例如燒烤或油炸後,會釋放出環胺,與醃漬食品內產生的二甲基亞硝酸胺,同為致癌物質。
參考:

消化不良、腹脹 竟是大腸癌搞的鬼

吃燒烤比菸恐怖600倍 20歲罹腸癌

國人平均每五人 一人有高度癌化腸瘜肉

腸道是會思考,有情緒的第二大腦 - 談腸道神經系統

腸道是免疫最前線-談腸道免疫系統

照顧腸道健康








2015年3月31日 星期二

iOS 8 地雷地圖

最近為了做 PM2.5 監測用 App - 肺欲清,著手開始了 iOS 的開發,這兩個禮拜來大致上瞭解了 iOS development 如何不踩到地雷的大邏輯。


只要是 Apple 預先幫你用現有元件另外組好的元件都不要用,譬如說:

1. iOS 7 的時候提供了 UISearchDisplayController & Search Bar ,他基本上就是 Search Bar 加上一組隱藏好的 Search Display Controller 幫你處理一些隱藏邏輯,在 iOS 8 的時候 UISearchDisplayController 就被 deprecate 掉了, Apple 建議改用 UISearchController,該元件幫你處理好了 UISearchBar 跟 Search Logic 的部分。但其中自動產生的 SearchBar 如果用了 Scope,Layout 會整個爛掉... 所以這種情況下,倒不如自己手動用 UISearchBar 跟客製化的 Search Controller 會比 UISearchController 或 UISearchDisplayController 來得穩且透明。

2. UITableViewController 就是內建 UITableView 的 Controller,在 ExtendedEdge 會有 Bug .. TableView 會被畫在 StatusBar 底下...

另外建議新的東西如果沒有特別需要,盡量都不要用,舊的被 Deprecated 的反而可以盡量多留久一點,原因是: 舊的會比新的被建議的方式穩定 XD 俗話說 If it's not broken, don't fix it.

#iOSMineMap

2015年3月4日 星期三

柴靜霧霾调查:穹頂之下

中國現在 32 種行業中,有 22 種行業生產過剩,其中鋼筋這類低階產品因為白熱化,大家都在做,導致生產過剩,全部都在削價競爭。
「都跟我講環保跟我講環保,我問你誰敢把中國的經濟掉下來?!」某書記說
中國人都說你敢為了環保賠上中國的經濟嗎?對不起,中國現在 2014 鋼筋的利潤,一噸鋼只能賺一顆茶葉蛋,不到兩塊錢。河北的鋼鐵公司鋼鐵都賣不出去呢
而這些鋼鐵上市公司,政府還給予他們補助,其中有一家公司為了避免他們退市,政府每年給予補助二十億
更扯的是,這公司拿了補助卻拿來做削價競爭,在辦公室裡頭掛了一個條幅:「貼身肉搏,刺刀見紅,誓比X鋼便宜100塊錢」

2015年3月2日 星期一

Lars Bak 談 JavaScript V8 virtual machine 的設計

Lars Bak 談 JavaScript V8 virtual machine 的設計:
其中 Lars 有談到 V8 不使用 byte code,你能夠執行 JavaScript 唯一的方式就是透過 native code,所有的程式都是先編譯後執行,沒有解譯:
"There is no interpretation and no bytecode."
V8 不像其他 VM 是透過 bytecode 或是像 JVM 有 HotSpot 有多種方式執行程式,如在 interpreter 或 native code 之間切換。Lars Bak 開玩笑的說,Developer 在改 V8 compiler 的時候,他們看到這些 native code ... will be horrified.
直接在執行期間 compile 成 native code 執行的這個設計與一般 VM 大相逕庭,因為不管是 JVM, PHP, Python, Ruby, C# 都是透過 Byte code 做 interpretation,而這點引起了 Erik Meijer 不理解而提出質疑。
Lars Bak 解釋道 「若我們設計了 IR (Intermediate Representation) 中介表示,我們就必須對這些 IR 做驗證 (validation),然而驗證 IR 是非常複雜的,譬如驗證 Byte code 是否有 Violation 等等。 譬如說 JMP,你必須驗證 JMP 的位址是正確的,否則會有安全顧慮。 」
而我認為這是沒錯的,一般 Interpreter 儲存 op list 於 HEAP 中,只需 RW 權限即可竄改 op list,但 V8 是在用戶端執行的,你很難保證在用戶端的環境的安全性是足夠的,我猜這是 Lars Bak 過去在 Sun microsystem 做 JVM 以來的經驗。 Lars Bak 不僅為了高效能設計 V8 而也兼顧了安全性。
話說,翻了幾個 VM 的 source code,不管是 cpython, perl, cruby ,目前覺得還是 V8 的架構最優、workaround 最少、最簡潔,完全是不同等級的實作

同步刊載於 C9S 開源電台

2015年2月27日 星期五

asmjit 與 libjit

大略翻了 asmjit [1] 與 libjit [2] 的實作,大概簡介一下兩者差異:
asmjit 是針對 x86 平台所做的 just-in-time toolkit,可以在 runtime 進行組語編譯並執行,分成兩種 compilation method:
.
1. Assembler: 直接使用 x86 instruction 撰寫編譯,必須寫清楚 register, memory 等 operand。
2. Compiler: 使用抽象化語法進行編譯,不需自己管理暫存器。
.
其中抽象化語法可直接使用 Variable 並且由 Compiler 自行分配暫存器,超出的部分會自動使用 Stack 的空間。

而其語法其實就是 C++,通過調用 FunctionBuilder 來建置 Function ,最後丟給 Compiler 編譯後即可使用,但 Register Allocation 的部分分析能力不強,因此作者建議若有自己做 Analysis 的話,建議還是直接使用 Assembler。 由於是 C++ 實作,asmjit 語法簡潔有力。對 x86 機器的實作算很完整。

而 libjit 較為複雜些,libjit 使用 C 語言實作,編譯單元為 Function,用法類似 asmjit 定義 Function 的方式,但定義起來較為繁瑣。 除了抽象化 opcode 來達到跨平台的目的 (目前支援 arm, x86, x86-64),還實作了 data flow analysis, control flow analysis 來做優化,優化的部分則可以指定等級。

其中 CodeGen 的部分,居然自己定義了一套 DSL 的 parser 來產生類似 LLVM Instruction Table 的定義檔... 完全不容小覷。 據我與 Marttia Barbon 通信內容了解,libjit 產生的 machine code 並不太優。

libjit 中 x86 instruction assembler 的部分,是直接使用 C function 來達成 position independent instruction 的編譯:

    x86_mov_reg_reg(buf, X86_EBP, X86_ESP, 4);

要使用 libjit 來建置一套 language VM 應該是足夠的,只不過 libjit 最近較無積極開發,最近一年的 commit 幾乎都是修正。

2015年2月25日 星期三

CLIFramework - Table Generator

CLIFramework 現在內建 Table Generator,只要輸入 Array,可自動依照不同的 Style 產生 Console 用表格,甚至能輸出成 Markdown 格式表格 (使用 MarkdownStyleTable class)

此套件是參考 Symfony/Console 的 Table Helper 部分功能的重寫及加強,除了 Symfony/Console 現有功能之外:

還可透過指定格屬性 (Cell Attribute),針對單一格或一整列設定色彩、文字對齊或數字格式 (Currency, Number, Duration .. etc)

至於超出欄寬的文字,也可指定使用切斷 (clip), 省略符號 (ellipsis) 或換行 (wrap)

請見範例程式:
https://github.com/c9s/CLIFramework/blob/master/example/table.php


畫面:


2015年2月10日 星期二

閒暇時大致研究了幾個 JIT compiler 實作:

V8 當然不用說,不僅實作了好幾種 CPU 架構的 runtime assembler ,還做了 dynamic re-compilation (Crankshaft engine) 針對 hot code 做 re-compilation。

而 Steffen Müller (@tsee) 的 jit-experimental for Perl 則是將 Perl5 op tree 建構成 libjit 看得懂得 AST,接著丟改 libjit 翻譯回來拿到 machine code,細節沒有看很多,但我猜這個 runtime overhead 一定是很高...
其他使用的 libjit 的 project 則幾乎都是 experimental projects,沒有看到其他使用 libjit 成功的案例。

Reini Urban (@rurbanJit.pm 實作,是把固定幾個 x86 instruction 的 machine code 直接寫成 macro 來使用 (如: x86 prolog, epilog, call, jmp, pushl, popl 等等),然後在模組載入後,把 Perl 的 run op 函數指標 (function pointer) 換成 Jit.pm 自己的實作,接下來就是把一些簡單的 op code 換成預先準備好的 machine code 執行。 但 Jit.pm 一執行就 crash 了..... orz

不過 Jit.pm 也教我幾件事情:
1. memalign 要處理好,不然沒有辦法設置 memory protection
2. self-modifying code 需要呼叫 sys_mprotect 這個修改 page 的 flags ,才能在調用來的記憶體上執行 machine code。
3. Perl 5 有 ASYNC flag (看起來是做 JIT 特別難處理的地方)

現階段看起來,JIT 實作的最佳參考還是 V8
就這樣,有其他細節再繼續做整理...

(以前實在太弱,寫什麼 SIC/XE assembler... 現在覺得當時應該接著練習自幹 x86 assembler 比較實際...)

2015年2月8日 星期日

Getting Merged

昨天在 livehouse 的簡報。但有些內容是現場講的,沒報名到的朋友搜瑞了


libjit 的作者 Rhys Weatherley (dotGNU 的 member) 2009 年時寫到:
"LLVM seems to have been started as a "glorified" static compiler....which aims to (略).... It has been started in 2000, and as of today it is technologically outdated. "
哇....這不是睜眼說瞎話嗎? XD

2014年9月25日 星期四

HHVM 及 Hack 的相容性

最近筆者開始嘗試 HHVM 應用於 Production 環境,一些心得如下:


1. Linux

現有的 Linux Distribution 幾乎都有 pre-built 套件,可直接安裝,就算要自行編譯也沒有太大的問題。 Facebook 的 HHVM Team 主要都還是 Focus 在 Linux Server 上的相容性。在 Linux 平台上編譯,可參考官方的 WIKI 文件


2. Mac OS X

Mac OS X 上 HHVM 的相容性比以往提昇許多,過去要自行 patch 許多套件編譯,現在只需要 patch jemalloc 即可。且幾乎所有相依套件皆可用 Homebrew 或 Macports 安裝。

目前 HHVM 的版本 HHVM 3.2 確定可於 Mac OS X 上編譯,只不過需透過 GCC 4.8 而非 Mac OS X 內建的 clang,相依的 Boost 套件也需由 GCC 4.8 編譯才行。

至於 master branch 目前 third-party 的 folly package 由於使用了 Linux 上的 Futex,因此目前唯一可在 Mac OS X 上編譯的版本就只剩 3.2。 不過也有人開始了 Mac OS X 平台上的編譯修正,可參見 @mcuelenaere 的 HHVM osx-fixes 分支,以及 @bsampathfolly 修正

至於 3.2 版本 Mac OS X 上的編譯步驟,可參考此處


3. Hack Programming Language

至於 Facebook 的 Hack programming language 幾乎與 PHP 相容,原本的 PHP source code 只需要修改標頭,將 <?php 改為 <?hh 即可當做 Hack 執行,因此由 PHP 換用到 Hack 幾乎是無痛轉移。

至於使用 Hack 有何好處?一來是提供型別檢查,方便開發時及早發現問題,二來依照型別資訊可大幅提昇 VM 效能,三來可以提供準確的自動補齊並與編輯器或 IDE 做整合。

Hack 的剖析工具是用 OCaml 寫的,可直接和 IDE 整合,如 Vim plugin 有 vim-hack (https://github.com/hhvm/vim-hack) 可使用。Emacs 則有 hack mode 可用 (https://github.com/facebook/hhvm/tree/master/hphp/hack/editor-plugins/emacs)。

待續


2014年8月27日 星期三

談 Git 的 Graft Points 及 git-replace

git merge --squash [branch] 可以將分支的修改全數合併至同一個 commit 但不會保留合併資訊,不過若是該分支持續開發,勢必會再次合併至主幹,這時如果重新使用 git merge --squash ,則已經合併過的 commit 也會因為重新被合併而造成衝突。

這時,要讓 squashed commit 同時也有 merged commit 的性質,可以利用 .git/info/grafts 這個檔案或利用 git-replace 來手動定義合併資訊製作造假的合併資訊!

好用的地方在哪個? 假設你有兩個 perforce branch,分支之間不斷大量修改合併,但使用 git-p4 clone 後,你希望這兩個 branch 的合併基底 (merge base) 重新計算,減少合併衝突,就可以利用這個 graft point 來定義合併節點。

甚至是 git-svn 在處理樹狀目錄的合併資訊,也可以利用 graft points 來定義合併節點減少合併衝突。

當儲存倉越來越大時,你也可以將某個 commit 之前的 history 全數壓縮到另外一個儲存倉並把古老的 commit history 全數壓起來 (squash) 來節省空間...要查看細節時,再用 git-replace 將 commit history 接回來即可。

但 .git/info/grafts 只存在 local 端,並不會被 push 出去,因此若要能修改整個 commit tree 可利用 git replace --graft […] 直接將 commit 換掉 parent。

參見:

git-replace: http://git-scm.com/docs/git-replace.html

Graft Point: https://git.wiki.kernel.org/index.php/GraftPoint

#ThePowerfulGit