發表文章

目前顯示的是 七月, 2013的文章

if and switch -- assemble and C

這篇是if跟switch用在處理流程的時候assemble會是怎樣。

if跟switch的例子行為都是一樣的。就只是當“i”等於多少時“t”就應該等於多少

1. If

  1 #include <stdio.h>
  2 int main(int argc, const char *argv[])                                         
  3 {                                                                              
  4     int i = 2, t = 0;                                                          
  5     if(i == 0){                                                                
  6         t = 0x1;                                                               
  7     }else if(i == 1){                                                          
  8         t = 0x2;                                                               
  9     }else{                                                                     
 10         t = 0x3;                                                               
 11     }                                                                          
 12����������������������������������������������…

利用正規表示法為CSS跟SCSS建立tags -- Vim, Ctags and Taglist, Tagbar

圖片
    看這篇文章前我假設你應該會用Vim和安裝完Ctags和Taslist。

1. 環境
 OS: Ubuntu 13.04 x64 Taglist 4.6 Vim 7.3 Exuberant Ctags 5.9 svn20110310
2. 為Ctags加入新語言parser

    Ctags為新的語言加上parser有兩種方法:

C code的parser,速度會比較快但是跨平台後就重新build Ctags一次。利用Ctags提供的regex來完成parser
    所以如果Ctags沒有內建新語言的parser的話,我個人是偏好使用regex來對新的
語言做parse,這樣比較容易在不同的平台上使用。

3. Example

以下我用css跟scss來做範例:

# 編輯 $HOME/.ctags
--langdef=css
--langmap=css:.css.scss
--regex-css=/^\.([_a-zA-Z0-9]+:?[_a-zA-Z0-9]+)?/\1/c/
--regex-css=/^([A-Za-z0-9_]+[\t\r\n\v\f]?([>:]?[\t\r\n\v\f]?[A-Za-z0-9_]+)?(:{2}[\t\r\n\v\f]?([-][A-Za-z0-9_]+)*)?(\(\[[A-Za-z0-9_]+\]\))?)/\1/s/
--regex-css=/^#(-?[A-Za-z0-9_]+:?[_a-zA-Z0-9]+)?/\1/i/
--css-kinds=+cis
# 編輯 taglist.vim 加入以下的code
" css
let s:tlist_def_css_settings = 'css;c:class;i:id;s:selector'

" scss  
let s:tlist_def_scss_settings = 'css;c:class;i:id;s:selector'
P.S. 我這邊的正規表示法可能沒辦法抓到全部class, idselector所以還是建議要用的人自己寫出自己要的正規表示法,也希望你可以跟我分享你的正規表示法。

    我測試的pattern在githib上(連結如下),如果你有想要parse的pattern,歡迎讓我知道我有空就會把他加上去,還有更新正…

重寫上一筆commit的內容 -- Git

在Git如果要重寫上一筆commit的內容,很簡單只要下:
$> git commit --amend
接著用你的編輯器來重新改寫內容吧

Install vmlinux on Ubunut

Reference: http://superuser.com/questions/62575/where-is-vmlinux-on-my-ubuntu-installation

Why I need install vmlinux ? Because i will use `crash` tool to debug kernel :D   

you can step by step to install vmlinux on below:

1. apt install vmlinux 
echo "deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse deb http://ddebs.ubuntu.com $(lsb_release -cs)-security main restricted universe multiverse deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \ sudo tee -a /etc/apt/sources.list.d/ddebs.list sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01sudo apt-get update sudo apt-get install linux-image-$(uname -r)-dbgsym
2. find out vmlinux : /usr/lib/debug/boot/vmlinux-$(uname -r)

Assmeble code of "for loop" with gcc -- C

References:
1. http://www.cs.mun.ca/~rod/winter2004/cs3724/notes/asm.html
2. http://www.hep.wisc.edu/~pinghc/x86AssmTutorial.htm

OS  : Ubuntu 13.04 x86_64
GCC: version 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1)

最近想說剛好有空閒的時間就想把以前所學的C語言到底經過GCC編譯後的Assemble到底
長的如何?所以我先看了for loop到底編譯後會長怎樣,以下是我的C code他是個很簡單的
for loop ,然後利用以下兩個指令來產生Assemble code來看。

1. gcc -Wall -O0 for.c -o assemble
2. objdump -d --no-show-raw-insn assemble  > for_0.txt

題外話寫C code的時候,其實真的要對每一個語法到底經過GCC編譯後會變成怎樣,到底產
生的assemble對於你的平台是不是最好的結果來去深入理解。當然你是要把每個語法都看完
還滿難的而且還是要有空閒時間或是工作不忙的時候看 XD

以下的說明如果有錯誤請糾正我,謝謝 ^__^

C code

12345678910 #include <stdio.h> intmain(intargc,constchar*argv[]){inti=0,c=10;for(i=5;i<10;i++){c+=i;}return0;}
Assemble

116 00000000004004ec <main>:
117   4004ec:   push   %rbp 
118   4004ed:   mov    %rsp,%rbp   
119   4004f0:   mov    %edi,-0x14(%rbp)                
120   4004f3:   mov    %rsi,-0x20(%rbp)                         
121   4004f7:   movl   $…

Decorator -- AngularJS

References: 
1. http://docs.angularjs.org/api/AUTO.$provide#constant
2. https://groups.google.com/forum/#!searchin/angular/decorator/angular/72ukcZYeWGE/aMwTXCkKw1QJ

剛好在看$provide.decorator在做什麼,然後在AngularJS的官方mail list中有人討論看到範例就記錄下來以防自己忘記(請參考*2)。

If you want to decorate $http:
ng.config(function ($provide) {   $provide.decorator('$http', function ($http) {     // decorate $http     return $http;   }); });
If you want to "extend it" (create a new service which prototypally inherits from $http):
myApp.factory('myHttp', function ($http) {   myHttp = function() {}   myHttp.prototype = new $http();   // add other methods   return myHttp
});

Service, Factory和Provider的不同 -- AngularJS

References: 
http://iffycan.blogspot.tw/2013/05/angular-service-or-factory.htmlhttp://docs.angularjs.org/guide/dev_guide.services.creating_serviceshttp://docs.angularjs.org/api/AUTO.$provide http://docs.angularjs.org/api/angular.Module http://stackoverflow.com/questions/15666048/angular-js-service-vs-provide-vs-factoryhttp://docs.angularjs.org/guide/di
      在剛開始接觸AngularJS的service, factory 和 provider(這三個是$provide提供的方法,請參考*3)很容易搞不清楚這三個的不同,而且官方網站也沒有說得很清楚。然後只好在網路上找了一些這三個有什麼樣不同的文章,然後紀錄整理出自己的想法,所以有任何錯誤歡迎告知 :) 

首先要講一下在AngularJs要註冊Services時有一下兩種方法:
(範例我直接用官方的code,請參考*2)

第一種使用angular.Module的api(請參考*4)
var myModule = angular.module('myModule',[]);myModule.factory('serviceId',function(){var shinyNewServiceInstance;//factory function body that constructs shinyNewServiceInstancereturn shinyNewServiceInstance;});第二種使用$provide service:
angular.module('myModule',[],function($provide){ $provide.factory('serviceId',function(){var shinyNewServiceInstance;//factory function …

$emit , $broadcast and $on的用途 -- AngularJS

References : http://docs.angularjs.org/api/ng.$rootScope.Scope


1. $on:用來接收Events

2. $emit:發送Event, 發送的方向是從目前的scope往上發送到parent $scope.$on
(目前的scope的$on也會有動作)

3. $broadcast:發送Event, 發送的方向是從目前的scope往下發送到child $scope.$on
(目前的scope的$on也會有動作)

但是光看官方的文件真的很難讓人理解,所以我做了一點小實驗來讓自己容易理解。我大概做了以下的實驗:1. 兩個同Level的Controller, 同樣的Event Listener會因為某一個Controller內的emit or broadcast發送Event時,會兩個都會影響嗎?(試試 Call Reset with Emit on Child1 or Call Reset with Broadcast on Child1)2. 最小的child的Controller的$emit會ㄧ直往上傳Event給所有的parent的$on嗎?(試試Call Reset with Emit on inside)3. 最上層的broadcast發送Event真的會往下傳給Child的$on嗎?(試試範例的Reset Broadcast就知道)Check out this Pen!