Makefile : ヘッダファイルの更新を考慮する
1つのCソースファイルから1つの実行ファイルを作る ただしヘッダファイルの更新も考慮する
※ヘッダファイル中のヘッダファイルの変更などに対応なし
C=gcc #CC=i686-w64-mingw32-gcc CFLAGS=-O2 -g -lm SRC=$(wildcard *.c) TARGET=$(basename $(SRC)) DEP=$(addsuffix .d,$(TARGET)) OBJ=$(addsuffix .o,$(TARGET)) .PHONY: all all:$(DEP) $(TARGET) # @rm -f $(DEP) $(DEP):%.d:%.c @gcc -MM $^ | sed -e s/\.o// > $@ @echo -e "\t$(CC) $(CFLAGS) -o $* $^" >> $@ -include *.d .PHONY: clean clean: rm -f $(TARGET) rm -f $(DEP) rm -f $(OBJ)
tex : algorithmパッケージで擬似コードを書く(for...do を for...do in parallel にする方法)
プリアンプルに以下のように書く
ただし, algorithmicと併用しないようにする(なんかおかしくなった)
\usepackage{algorithm} \usepackage{algcompatible} \algblockdefx{FORP}{ENDFORP}[1]% {\textbf{for}#1 \textbf{do in parallel}}% {\textbf{end for}}
以下の例の結果を見る
\begin{algorithm}[!h] \caption{parallel substitution} \label{alg1} \begin{algorithmic}[1] \FORP{ $i\leftarrow 0$ to $n-1$} \STATE $A[i]\leftarrow i$; \ENDFORP \end{algorithmic} \end{algorithm}
結果は以下のようになる
tex : Tableの等幅コラムの作り方
Latexにおいて, tableのコラムの幅を統一する方法(tabularx環境)
以下をプリアンプルに書く
\usepackage{tabularx} \newcolumntype{C}{>{\centering\arraybackslash}X} \newcolumntype{L}{>{\raggedright\arraybackslash}X} \newcolumntype{R}{>{\raggedleft\arraybackslash}X}
\begin{tabularx}{100mm}{rclRCL}
で横幅100mmのテーブルをつくる
C,L,Rはそれぞれ等幅のコラムにしてくれる
tabular環境のcrlも使える
ただし, 等幅コラムにならない
つまり, 指定した長さのテーブルをL,{r,c,l}で指定したコラムの長さの総和をS, {R,C,L}指定のコラムの数をNとすると, 等幅コラムの横幅は, (L-S)/Nとなる(予想)
これつかって,
こんな感じでtableを書く
\begin{table}[!h] \begin{center} \caption{世界の大学進学率(2012年)} \label{tab:univ} \begin{tabularx}{100mm}{rCr} 順位&国名&大学進学率(\%)\\ \hline 1 & ギリシャ&113.98 \\ 2 & 韓国 & 98.38 \\ 3 & アメリカ & 94.28 \\ \multicolumn{3}{c}{{\bf $\vdots$}}\\ 41&日本 &61.46 \\ \multicolumn{3}{c}{{\bf $\vdots$}}\\ 89&メキシコ&28.99\\ \hline \end{tabularx} \end{center} \end{table}
以下のようになる これじゃ違いわからなくね?
まぁいいや
c : ポインタのcast [1]
gettimeofdayを用いた時間計測のメモも兼ねて
castによる初期化時間の差を見てみる.
char型80000要素の初期化
long long int型にキャストすると, 80000*(8bit/64bit)=10000回の代入操作が必要
ソース
#include <stdio.h> #include <sys/time.h> double get_time_sec(void){ struct timeval tv; gettimeofday(&tv,NULL); return((double)(tv.tv_sec)+(double)(tv.tv_usec)*0.001); //ms } int main(int argc,char **argv){ int i; double time[3]; char A[80000]; long long int *p; p=(long long int *)A; time[0]=get_time_sec(); for(i=0;i<80000;i++) A[i]=0; time[1]=get_time_sec(); for(i=0;i<80000/8;i++) p[i]=0; time[2]=get_time_sec(); printf("%f ms\n",time[1]-time[0]); printf("%f ms\n",time[2]-time[1]); return 0; }
実行結果
0.181000 ms 0.024000 ms
7.6倍くらいはやい
辻褄はあう
c : ポインタのcast [0]
ポインタをcastしてみる
いざ...
//cast.c #include<stdio.h> int main(int argc,char **argv){ int A[4]; long long int *p; p=(long long int *)A; A[0]=1; A[1]=2; A[2]=3; A[3]=4; printf("%x %x %x %x\n",A[0],A[1],A[2],A[3]); *p=0; printf("%x %x %x %x\n",A[0],A[1],A[2],A[3]); *(p+1)=0; printf("%x %x %x %x\n",A[0],A[1],A[2],A[3]); return 0; }
実行結果
$ ./cast 1 2 3 4 0 0 3 4 0 0 0 0
エンディオンに注意!
1を代入するとどうなるかな...
A[0]=1; A[1]=2; A[2]=3; A[3]=4; printf("%x %x %x %x\n",A[0],A[1],A[2],A[3]); *p=1; printf("%x %x %x %x\n",A[0],A[1],A[2],A[3]); *(p+1)=1; printf("%x %x %x %x\n",A[0],A[1],A[2],A[3]);
実行結果
$ ./cast 1 2 3 4 1 0 3 4 1 0 1 0
python : 正規表現(re)のメモ
reの使い方メモ finditer さえ使えればなんとかなる
#re.py import re string=u"Hello, world!" print u"pattern1" pattern1 = re.compile(u"H(.*)l") iterator1 = pattern1.finditer(string) for match in iterator1: print u" match.group( ) : "+match.group() print u" match.group(1) : "+match.group(1) print u"pattern2" pattern2 = re.compile(u"H(.*?)l") iterator2 = pattern2.finditer(string) for match in iterator2: print u" match.group( ) : "+match.group() print u" match.group(1) : "+match.group(1)
実行結果
$ python re.py pattern1 match.group( ) : Hello, worl match.group(1) : ello, wor pattern2 match.group( ) : Hel match.group(1) : e
python 2.xと3.xの違いは勉強中...
Makefile : 1つのCソースファイルから1つの実行ファイルを作る
1つのCソースファイルから1つの実行ファイルを作る
そんなMakefile
CC=gcc CFLAG=-g -Wall SRC=$(wildcard *.c) TARGET=$(basename $(SRC)) all: $(TARGET) $(TARGET):%:%.c $(CC) $(CFLAG) -o $@ $^ #static pattern rule #targets... : target-pattern : dep-patterns... .PHONY: clean clean: rm -f $(TARGET)