2013年7月9日 星期二

關於腳本語言

常見的腳本語言:

Java Script

Unix/Linux Shell
本來就是在Linux系統上面常用的腳本語言

Python/Jython
最大的特性就是簡潔,但是在企業應用上比較沒那麼好
學習曲線短

Ruby/JRuby
非常棒的語言,語法非常強大
但是學習曲線比較長(吸收了python&Perl的優點)&標準庫不夠多(目前來說)
Ruby->Rails
是一種網頁開發的架構,把模型、外觀、控制器分離

Perl
在CGI(common gateway interface)常用的語言
特點是本文處理強悍
雖然不是很難懂
但是短時間內寫不出像樣的東西,學習曲線比較長
非面嚮對象語言、語法醜陋

Groovy
Java平台上的原生語言,完全使用JAVA的API庫


原始資料:
http://tc.itkee.com/developer/detail-129.html


在windows上執行GCC的工具-Cygwin&Mingw的比較

Cygwin
是一種可以直接把Linux上面的code直接拿到windows上跑的環境
方法是利用cygwin1.dll模擬Linux上會使用到的API,所以基本上是不需要修改任何程式碼的
當然,因為是模擬Linux API,所以效率上面就別要求太多了
另外,因為是轉接,所以這個程式只能在有cygwin1.dll的環境才能執行

minGW+msys
minGW則是直接利用Win32 API來提供一個Unix-like Shell的環境
雖然程式碼需要修改,但因為是直接利用Win32 API,在執行效率和可移植性都大於Cygwin
可以直接換到其他Windows環境下執行,不需要.dll來當中介層

而msys的功用則是提供使用者介面,通常會搭在一起使用

2013年7月1日 星期一

Linux-文字編輯器疑難雜症

Ubuntu:

在剛安裝完的Ubuntu上使用文字編輯器時,若按到上下左右鍵會出現亂碼的問題,很不方便
關於這個問題有三種解法:
1.編輯/etc/vim/vimrc.tiny
sudo vi vimrc.tiny
文件裏面的倒數第二句話是“set compatible”
只要改成"set nocompatible"就可以解決方向鍵的問題
而back slash的問題只要在剛剛那句話下面再加一句"set backspace=2"就可以解決了

2.重新安裝vim
剛灌完Ubuntu時,預設安裝的是vim-common(tiny版本),在這版本下無法使用方向鍵以及數字鍵,需要使用舊型的文字編輯方式。要解決這個問題只要重新安裝就可以了。
sudo apt-get remove vim-common
sudo apt-get install vim

3.在個人家資料夾下修改".vimrc"檔案
在個人家資料夾下的".vimrc"是針對單個用戶的設定檔
只需要在這個檔案裡面新增
set nocompatible          //以非兼容模式工作
set backspace=2
這兩行就可以了
但是這種方式只能對同一個用戶,如果是多個用戶就要一個一個來,很麻煩

2013年4月27日 星期六

C語言-檔案I/O


general:
    fopen( )       開啟一個檔案
    fclose( )       關閉一個檔案
   -ferror( )       測試檔案操作是否正常
    -remove( )   檔案的刪除
for binary file:
    fwrite( )        輸出一串byte到檔案
    fread( )        從某一個檔案讀取一串byte
    putc( )          輸出一個byte到檔案
    getc( )          從某一個檔案讀取一個byte

    feof( )          測試是否到了檔案結束位置
    ftell( )           以byte為單位回傳目前檔案指標位置
    fseek( )        以byte為單位設定準備讀取檔案資料的位置
    rewind( )      將準備讀取檔案資料位置,設定在檔案起始位置

for text file:
    fprintf( )       輸出資料至某檔案
    fscanf( )       從某檔案讀取資料


function prototype:
    FILE* fopen( char* FileName , char* OperationType )
    FILE* fclose( FILE* )

    unsigned int fread( void* Variable , int* Size , int* NumbersOfDataToRead , FILE* FilePointer )
    unsigned int fwrite( void* Variable , int* Size , int* NumbersOfDataToWrite , FILE* FilePointer )
        Size:以byte為單位;回傳成功讀取的單位數量

    int ftell( FILE* FilePointer )
    int fseek( FILE* FilePointer , int OffsetNum , Base )
        Base只能是SEEK_SET,SEEK_CUR,SEEK_END其中一種
        ftell( ) 的回傳值放在Offset搭配SEEK_SET可以指到之前存下的位置









2013年3月26日 星期二

有用的程式設計網站

GNU's Document:http://www.gnu.org/manual/manual.html
    有GCC、GNU Scientific Library(有FFT的library)

make file


粗體:語法
一般:範例


VARIABLE_NAME = VARIABLE_VALUE
$( VARIABLE_NAME )

若:
targets = foo
$(targets): common.h
    gcc -o $(targets) foo.c
則等同於:
foo: common.h
    gcc -o foo foo.c

VARIABLE_NAME := VARIABLE_VALUE
如果用"="的話,make file會將整個檔案展開後再決定最後的變數值,若中途要變更則要用":="


x = foo
y = $(x) bar
x = xyz
# y 的值為 xyz bar



x := foo
y := $(x) bar
x := xyz
# y 的值為 foo bar


Q1:如果混用會發生什麼事?

VARIABLE_NAME ?= VARIABLE_VALUE
如果未定義,則此assign成立,否則無效。

若:

targets ?= foo1
$(targets): common.h
    gcc -o $(targets) foo.c

則等同於:


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




若:
targets = foo0  或  targets := foo0

targets ?= foo1
$(targets): common.h
    gcc -o $(targets) foo.c

則等同於:


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




VARIABLE_NAME += VARIABLE_VALUE
把變數值加到變數的最後端


CFLAGS = -Wall -g
CFLAGS += -O2


最後  CFLAGS  為  "-Wall -g -O2"

define  ...  endef
跟"="功能類似,但可以多行

若:

define foo
uname -a
echo $$SHELL
endef

all:
        $(foo)
則等同於:
foo = uname -a; echo $$SHELL

all:
        $(foo)

上面利用了"$$",讓 "$" 能傳到 Shell 中。

Q2:是類似於"="還是類似於":="?

Q3:"target"  是什麼?為什麼要用all:在裡面重新指定?


echo $(VARIABLE_NAME)
@echo $(VARIABLE_NAME)

把值輸出到  shell
從環境變數中尋找同 VARIABLE_NAME  的變數

wildcard
一般而言,make file中的通用符號會自動展開。
但是在變數定義或函數呼叫時就會失效,所以需要用到wildcard來強制展開。

objects=$(wildcard *.o)

規則(Rule):
make file會依此決定要如何compile

主要架構:

target: dependencies
<Tab>Commands


或:
target: dependencies; Commands
<Tab>Commands



target:所要建立的檔案< /td>
dependencies:相依項目。 make 會據此決定是否要重新編譯 target。
Commands:建立 target 的指令。


target
目標檔案,必須以" : "結尾


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


若非檔案,則為  fake  項目,建議用"  .PHONY  "來指定他是  fake  。
如果未指定,make file會去找這個檔案。
若不巧檔案中又剛好有同名的,make file就會一直以為是up-to-date,此項目永遠不會被執行!


.PHONY: clean
clean:
    rm *.o

另外,如果某個非 fake 項目的 target 的 dependencies 包含了 fake 項目的話,因為 make 一定會執行 fake 項目,這樣一來,這個非 fake 項目的 target 一定也會被執行。這可能不是理想的做法。


dependencies
是指定在建立 target 之前,必須先檢查的項目。可以是任意檔案類型(.o,.h...),也可以不指定。
會檢查他們的日期是否比target晚,如果是,就會compile target。

Commands
必須以<tab>開頭。使用 Shell Script 語法。在 Makefile 裡,只要以 <Tab> 開頭都將會被視為 Shell Script 執行。
每條法則必須寫在同一行。每條 Command 會啟動一個新的 Shell,預設為 /bin/sh。若執行完某條 Command 但傳回了錯誤值,make 就會中斷執行。
因為每條 Command 會啟動一個新的 Shell,所以有時執行的指令必須寫在同一行,像是使用 if 來進行條件判斷,此時可以用 ; 來分隔指令。


all:
    if [ -f foo ]; then rm foo; fi


錯誤示範:


all:
    cd subdir; $(MAKE)



這時因為 make 只會檢查最後一個指令的傳回值,所以在以上指令中,即使 subdir 不存在,但 make 並不會因而中斷執行,並會繼續執行 $(MAKE) 指令,而產生了不可預期的結果。

為了避免這個問題,可以利用 && 來檢查其中某個指令是否成功執行,再決定是否執行下個指令。



all:
    cd subdir && $(MAKE)


@
不要顯示執行的指令。
-
表示即使該行指令出錯,也不會中斷執行。



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


特殊規則:


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

因為是用gcc來編譯,所以可以簡化為:

foo.o: common.h


若不想啟動這個規則,則使用空白命令放在最後一行


foo.o: common.h
<tab>


內部變數:


$?: 代表已被更新的 dependencies 的值。也就是 dependencies 中,比 targets 還新的值。
$@:代表 targets 的值。
$<:代表第一個 dependencies 的值。
$* :代表 targets 所指定的檔案,但不包含副檔名。

內部函數:
使用make時所支援的函數
http://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/Functions.html

條件判斷:
ifeq
比較變數1&2是否相等
ifneq
ifdef
檢查此變數是否為空
ifndef



ifeq (value1, value2)
    ...
else
    ...
endif




ifdef variable
    ...
else
    ...
endif


引入檔案:
把此檔案內容全部插入此make file中
可以同時引入多個檔案,也可以使用萬用字元。
include foo.in common*.in $(MAKEINCS)

子目錄:
如果該專案有多個目錄,且每一個目錄中都有 Makefile,則利用以下指令來進入子目錄並進行編譯。
cd dir && $(MAKE)

範例:

SUBDIRS = dir1 dir2 dir3

all:
        for i in $(SUBDIRS); do
                (cd $$i && make);
        done

clean:
        for i in $(SUBDIRS); do
                (cd $$i && make clean);
        done

install:
        for i in $(SUBDIRS); do
                (cd $$i && make install);
        done



呼叫Make時可用的參數:
可以在shell呼叫make時直接用指令改變參數:
make CFLAGS="-g -O2"

若不想被改變,可在make file中加入:
override CFLAGS = -Wall -g

也可以指定要編譯的 target
make clean





A1:
A2:
A3:



參考資料:
今天的 Tetralet 又在唧唧喳喳了:http://tetralet.luna.com.tw/?op=ViewArticle&articleId=185