2015年8月26日 星期三

Profiling tool: gprof (分析程式執行的時間)

gprof 是一個可以分析程式個function使用多少次的工具
(包含執行次數、消耗時間等等)

。使用方式:

1. 在用gcc compile時,加上-pg選項:

$ gcc  -pg test.c -o test_gprof

2. 執行程式:

$ ./test_gprof

執行後會發現產生一個gmon.out檔

3. 利用gprof 打開gmon.out和原本的執行檔:

$ gprof test_gprof gmon.out

。結果:



Ref:
http://www.thegeekstuff.com/2012/08/gprof-tutorial/

2015年7月10日 星期五

vi/vim筆記

模式:

  指令模式:
  輸入模式: 在指令模式按i或a進入輸入模式;按Esc離開輸入模式

指令:

 <模式切換>

  i: 進入輸入模式(文字在指標前)
  a: 進入輸入模式(文字在指標後)
  [Esc]: 離開輸入模式

 <指標移動>

  $: 移到行末
  0: 移到行首
  :[num]: 跳到第num行
  %: 跳到對應的括號
  gg: 跳到檔案底一列
  G: 跳到檔案最後一列
  [num][Enter]: 往下跳num行

<修改>

  u: 復原
  [Ctrl]+r: 重作指令
  d [num]: 刪除num行
  dd: 刪除一行
  y [num]: 複製num行
  yy: 複製一行
  p: 從緩衝貼上(刪除或複製的均會存在緩衝)
       (剪下可用刪除+貼上達成)
  v: 字串標記
  V: 行標記

<搜尋與取代>

  /[str]: 往下找出str字串
  ?[str]: 往上找出str字串
  n: 往下搜尋相同字串
  N: 往上搜尋相同字串
  *: 找出指標所在的字串
  :[範圍]s/[比對字串]/[取代字串]/[g,c,i]: 將比對字串取代為取代字串。gic為控制選項。g表示整行全部;c表示取代前確認;i表示不分大小寫
   e.g.
    :%s/abc/def/  :把abc換成def
  :nohlsearch: 暫時關掉highlight
  :noh: 暫時關掉highlight

<存檔>

  :w: 存檔
  :q: 關閉vi

<行首插入>

游標移動到要插入的地方
[Ctrl]+v: 標記行(區塊)
I: 插入文字
[Esc]: 結束插入,標記的行(區塊)會插入文字

e.g.:在行首插入";"
按下[Ctrl]+v標記行

按下I並插入文字

按下Esc,完成插入。

<行尾插入>

  同行首插入,但利用A進入輸入模式,而不是用原本的I

<視窗>

  :new [filename]: 在新視窗開啟filename
  :only: 只保留當前視窗,其餘關閉
  [Ctrl]+w 切換視窗;再按箭頭下切換到下方視窗,再按箭頭上切換到上方視窗。
  :q 同樣也用q關閉視窗

<分頁>

  :tabe [filename]: 在新分頁中開啟檔案
  :tabN: 切換上一個分頁
  :tabn: 切換下一個分頁
  :tabclose: 關掉分頁
  :tabonly: 只保留當前分頁
  另外,在開啟vim時可以將多個檔案開在不同視窗:(利用-p)
  e.g.:
   vim -p <file1> <file2>

<排版>

  =: 自動排版
  e.g.
    ggVG=
    (檔案首行,列模式,檔案底行,自動排版)
  e.g.
    =[num]
    排版num行
Ref:
http://www2.nsysu.edu.tw/csmlab/unix/vi_command.htm
http://awei791129.pixnet.net/blog/post/29353976-%5Blinux%5D%5Bvi%5D-vi-or-vim-%E7%9A%84%E6%90%9C%E5%B0%8B%E5%8F%96%E4%BB%A3%E5%8A%9F%E8%83%BD
http://www.vixual.net/blog/archives/234

2015年7月8日 星期三

Image processing:seam carving

一、簡介:

Seam carving是content-based的image resiz時,也就是在image放大縮小時,對不重要的部份進行調整,影像重要的部份則不更改。如此,影像較重要的部份較不會有變形的問題。

二、方法:

1. 影像縮小:

  1-1. 找出每個pixel的energy。

  1-2. 找出圖片的seam
利用類似DP

  1-3. 刪除seam

2. 影像放大:

  2-1. 利用和影響縮小一樣的方式找出多條seam

  2-2. 對於每一條seam複製一次,並和周圍平均,插入在原seam右邊(左右放大)或下面(上下放大)

3. 左右及上下同時ressize:

  應該找一個順序,輪流移除col和row。順序取決於energy大小。
  這時候應該計算移除col和移除row比較energy大小,選擇移除後較小的。
  可參考原文:


三、延伸

1. specify object:

  由於有些情況背景太過複雜,有可能導致計算seams時,會通過重要的物體,因此讓使用者
點出物體,並將物體的energy調為最大,如此在計算Seams時便不會經過物體

  1-1. 讓使用者點出物體

  1-2. 讓在物體內部的pixel energy調整為最大

  1-3. 紀錄energy,之後更改(如放大縮小)以這個energy map為主

2. object remove:

  讓使用者點出物體,將所有在物體內部的pixel把energy調到最小,再利用多次的影像縮小即可以移除物體。若要讓影像恢復原本大小,再做影像放大,調整回原大小即可。
  2-1. 讓使用者點出物體

  2-2. 讓在物體內部的pixel energy調整為最小
    這裡是計算整張圖片最大的energy再做負數當作最小值。

  2-3. 移除等於物體寬度(或高度)的seams

3. content amplify:

  利用多次的縮小再放大,可以把比較不重要的東西消除,達到內容加強的效果。


Ref:
 wiki: https://en.wikipedia.org/wiki/Seam_carving
https://compvisionlab.wordpress.com/2013/03/24/seam-carving-matlab/
http://kirilllykov.github.io/blog/2013/06/06/seam-carving-algorithm/

2015年6月20日 星期六

jquery-Slider


Ref: https://jqueryui.com/slider/#range
包含多個jquery套件
可以參考內容去更改
以下只以range slider作為範例

1. 在html中加入link:
<link href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet"></link>
<script src="//code.jquery.com/jquery-1.10.2.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
2. 在html裡加一個id=slider-range的div
<div id="slider-range"></div>

3. 在script裡initial bar:
$(function() {
    $("#slider-range").slider({
      range: true,
      min: 0,
      max: 500,
      values: [ 75, 300 ],
      slide: function( event, ui ) {
        // do somethong when value change
        // ui.values[0]: left value
        // ui.values[1]: right value
      }
    });
    

2015年4月6日 星期一

Makefile

ref: http://tetralet.luna.com.tw/?op=ViewArticle&articleId=185

Makefile語法:

● 語法:

target: dependencies
<tab>Commands

target:  要建立的檔案
  make在編譯時,會比較檔案時間,決定是否重新建立target
  若該項目並非檔案,則為fake項目,而不會建立target檔案。(利用 .PHONY來指定fake項目)

dependencies: make根據這些項目決定是否重新編譯
  建立target前,必定先檢查的項目。可以不指定。

commands: 建立的指令
  必定以 \Tab 開頭(Tab開頭的都會被視為Shell script)
  每條command會啟動一個新的Shell,可以用; 將指令寫在同一行,或是 &&

● PHONY:

.PHONY: clean
clean:
<tab>rm *.o

  不論檔案時間必定執行,不會建立target

● 特別字元:

  @: 不顯示執行的命令
  -:   即使指令出錯,也不中斷make

.PHONY: clean
clean:
    @echo "Clean..."
    -rm *.o

● 隱性法則:

foo.o: common.h
    gcc -c foo.c

由於產生foo.o的指令就是foo.c,因此在make中可以簡化為:

foo.o: common.h

也可以用空白指令避免make利用隱性法則編譯
foo.o: common.h
<tab>

● 註解:

以#開頭即為註解

● 變數宣告:(macro)

利用=指定
target = foo
$(target): command
<tab>gcc -o $(target) foo.c

●Make參數:

可以用參數蓋過makefile裡的參數
make CFLAGS="-g -O2"

可以在make後接要重新建立的target
make clean



2015年3月31日 星期二

[OpenGL]Visual studio 環境設定與Error隨手記


1. visual studio 製作執行檔:
將debug模式調整為release模式


ref: https://sites.google.com/site/sjdsalg/materials/program/generateexe


2. 增加library和 link:


ref : https://social.msdn.microsoft.com/Forums/vstudio/en-US/a494abb8-3561-4ebe-9eb0-6f644a679862/visual-studio-2010-professional-how-to-add-include-directory-for-all-projects?forum=vcgeneral

3. Error: 'C:\Windows\SysWOW64\ntdll.dll'。找不到或無法開啟 PDB 檔案。



ref: http://vs-imaxlive.blogspot.tw/2013/06/cwindowssyswow64ntdlldll-pdb.html


4. Error: error LNK2001: unresolved external symbol __imp____glewBindBuffer

確定glew.lib在有在library中
(glew32.lib)

ref : http://stackoverflow.com/questions/16390078/build-error-when-trying-to-run-an-opengl-example-in-vc

2015年3月22日 星期日

jquery-flip


Reference link:
http://nnattawat.github.io/flip/

利用jquery可以達到flip的效果
1. 下載套件
網站最上方下載
或是在Github
https://github.com/nnattawat/flip

2. 在html 載入需要的連結和檔案
 <script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
 <script src="dist/jquery.flip.js"></script>

(第一行為jquery,第二行為flip套件)
(第二個套件要注意檔案位置)

3. 對於需要翻轉的block,需設成下列形式:
    <div id="card-2" class="card">
      <div class="front">
         Front content
      </div>
      <div class="back">
         Back content
      </div>
    </div>

即需要翻轉的block內容必須包含兩個<div>,一個class為front,一個class為back


4. 設置flip()
    <script type="text/javascript">
    $(function(){
      $("#card-2").flip({
        axis: "y",
        reverse: true,
        trigger: "click"
      });
    });
    </script>


5. 其他Option:
Attribute Possible value Default Description
axis y, x y The axis that you want to rotate around
trigger click, hover, manual click Event that activates the flip action. Using manual means that you have to activate it via javascript.
reverse true, false false Set to true if you want to reverse the direction of the flip.
speed any integer 500 Duration in milisecond for flipping dom

若將trigger設為manual,則需要在javascript呼叫flip(),如:
$("#card-2").flip(true);  //back side

$("#card-2").flip(false);  //front side

6. demo
http://m100.nthu.edu.tw/~s100062209/hw3.html