utkstring
μTool Kit
大学のプログラム課題で楽をするためにノリで作った。いわゆるC言語入門みたいな類の講義ではひたすら文字列と格闘したりするわけで、C++のstringもどきを作っておくと劇的に作業が減ったりする。実際のところ実用的なものを作るならC++のstringクラスを使えば良いわけで、あくまでC言語の講義中に使うことしか考えないでテキトーに作ったから実用には激しく向かない。
大学のプログラム課題で楽をするためにノリで作った。いわゆるC言語入門みたいな類の講義ではひたすら文字列と格闘したりするわけで、C++のstringもどきを作っておくと劇的に作業が減ったりする。実際のところ実用的なものを作るならC++のstringクラスを使えば良いわけで、あくまでC言語の講義中に使うことしか考えないでテキトーに作ったから実用には激しく向かない。
begin 664 utk.tar.gz
M'XL(`#%D*$<``^U9;6_B.!#FZ^97>-4OA<!=$BB<E*42O:5[Z%!7@O:^5!5*
MP=!HTP0E3K5[J_WO-W;>G,0)))2]JPY7*#"V9\:>9UXR]<F77QM''@J,P>""
M/M7!A<(_H]%0E8&J*7U-4;L-157ZJMI`%\=6C`[?(X:+4&-MK$RO9-VN^3<Z
M?+`_?#SBFO;FE^519%`#]_N]`ONK:K?7#^W?Z_?5/MB_JVB#!E*.HDUF_,_M
M?V;:2\M?8?0A0<'3I23=W?YYY3@6`NJ<42>V2<X1D(.?J+4PW,T"[FZ#"6JB
M[Q)"YOH<<=3.Y:/A831$SX9E.4NV>3&_G4UN/BUFX_EX]M=X,;FYA>=HBEK(
M,__&#G!8/H$]FNR/,D5IEA:V-^0)F"IZ?M+%'G9?\`JF2V0)-E)%[X6"'B)1
M/^"#+0^SS2XFOFLS(=>CZ7RL2S\DZ<4Q5\E]79NV8>VXL+6+L>C*FHR?;WOF
MQH;3F#9)^'["9`XWM8-SJ*#@1(PUN^-6BNE'@Q@UF%)]&<MXYX1@UR".FW"_
MPAO3/A+OL;VJR1G)A=>3`_\,>R5WWD8I4[$9NCYR"Z`1_+RE*%H[[CG[P6`5
M?/LP3+:$)+D4P!0?*/"3EF.M%EOBHJ'HZ@0HAX4N#OTQ-]D.I.=]42_T;J&3
M<GX8';S(C9.3U_+*E"O>SN[&O*N*5`OO(+RV'(O0FRF/R$UB$(P*XY\(`,8N
M_-W'ZQ[$H!MMM]A>_0XZ%,ME&C+*BV'YD3DJW&*R-P>78)4L"XV?F'@HY!WA
M8B^45L>I6!>Y8HH)9+/#O2^&]CX0$N.[TQ'/[@7L`F"B`-^(RT:%[E<>1B)7
MJ:I:SN.*P1M\+X9OELZ#.!_TS?!+'$@C`FB6338\.SU9^'Z821WB=;*,4%.*
ML2%TR=1!6K&$9KA1;+V][F[L@A%V9+5LG9%:H?,+@L(M,R\TF4=C6$FL<6R/
MA`X=A&WB1MKPX6_K>"D%PN/D-&0FA,5!*HPXWC/2@TX?8(9*5LCP>`U;3&SP
M)5(I"(NR`=4G4R13TJ4X=HJT/87F8X7FDBA+/\_X^=EY$=;I<F))&:GMTA5M
MH2TZ'#R$]9HX%G>0*LC>%0!=*S!7`+;,J19K70'MQRANBX#):QJ3XY*W!'TU
M"\O](96_PP,Q!B@-3@8:++??RA5HI^1SSIVV:AZWX80\%"POP6G1*QYDN,)W
MO$-*B/PL6-^WR-[E19S,=M47^84TLX4HHB!+RH?A,/W"P7N?PC5%R@ZGZ7'6
MH^<!]?ECTY$ZGG9H^90_GB;+;=%9XY#>2H1'_I]</HK+V\SE@'A^XR,X^Y=H
M0U`41T$[Y'ES-YU2>/W;7;;_[DCW?Y^.(J.\_ZMH%UTU[O\.!@KK_P+IU/_]
M">/,7-LKO&;1)"C._AB//HYGTAE031OG)Z2D9>R1E>G0=G&*9)F/65K45DYO
MM4F:!CA\A%J%]9\Y\455X[NN)DGDVQ93_4&&OR1<-O@>5Q%1N9`J7I)LE")'
M^1^"1L)+3\10CJU\Z-4K-\SUBOUBO78_6*_1[M4/Z>>6;RYMV(KNL6[O53^\
M?R=2IU97KIA1S0Z)B.&.MH%0AUJO_&*TO]Y[<C'_UWUM*0=JK;(36)Z!5<WU
M6RDYPOP?Q-TCR=B1_Q5-T\+\WU7Z/17RO];KGO[_^U,&E_^O/G^>"K(_3Q8F
M\"@W^O#[MP7+P=1W]702IV]Z[Y2OU]<I*GLM!K*BO#7'.8W3.(W3>./C'YAH
&%68`*```
`
end
M'XL(`#%D*$<``^U9;6_B.!#FZ^97>-4OA<!=$BB<E*42O:5[Z%!7@O:^5!5*
MP=!HTP0E3K5[J_WO-W;>G,0)))2]JPY7*#"V9\:>9UXR]<F77QM''@J,P>""
M/M7!A<(_H]%0E8&J*7U-4;L-157ZJMI`%\=6C`[?(X:+4&-MK$RO9-VN^3<Z
M?+`_?#SBFO;FE^519%`#]_N]`ONK:K?7#^W?Z_?5/MB_JVB#!E*.HDUF_,_M
M?V;:2\M?8?0A0<'3I23=W?YYY3@6`NJ<42>V2<X1D(.?J+4PW,T"[FZ#"6JB
M[Q)"YOH<<=3.Y:/A831$SX9E.4NV>3&_G4UN/BUFX_EX]M=X,;FYA>=HBEK(
M,__&#G!8/H$]FNR/,D5IEA:V-^0)F"IZ?M+%'G9?\`JF2V0)-E)%[X6"'B)1
M/^"#+0^SS2XFOFLS(=>CZ7RL2S\DZ<4Q5\E]79NV8>VXL+6+L>C*FHR?;WOF
MQH;3F#9)^'["9`XWM8-SJ*#@1(PUN^-6BNE'@Q@UF%)]&<MXYX1@UR".FW"_
MPAO3/A+OL;VJR1G)A=>3`_\,>R5WWD8I4[$9NCYR"Z`1_+RE*%H[[CG[P6`5
M?/LP3+:$)+D4P!0?*/"3EF.M%EOBHJ'HZ@0HAX4N#OTQ-]D.I.=]42_T;J&3
M<GX8';S(C9.3U_+*E"O>SN[&O*N*5`OO(+RV'(O0FRF/R$UB$(P*XY\(`,8N
M_-W'ZQ[$H!MMM]A>_0XZ%,ME&C+*BV'YD3DJW&*R-P>78)4L"XV?F'@HY!WA
M8B^45L>I6!>Y8HH)9+/#O2^&]CX0$N.[TQ'/[@7L`F"B`-^(RT:%[E<>1B)7
MJ:I:SN.*P1M\+X9OELZ#.!_TS?!+'$@C`FB6338\.SU9^'Z821WB=;*,4%.*
ML2%TR=1!6K&$9KA1;+V][F[L@A%V9+5LG9%:H?,+@L(M,R\TF4=C6$FL<6R/
MA`X=A&WB1MKPX6_K>"D%PN/D-&0FA,5!*HPXWC/2@TX?8(9*5LCP>`U;3&SP
M)5(I"(NR`=4G4R13TJ4X=HJT/87F8X7FDBA+/\_X^=EY$=;I<F))&:GMTA5M
MH2TZ'#R$]9HX%G>0*LC>%0!=*S!7`+;,J19K70'MQRANBX#):QJ3XY*W!'TU
M"\O](96_PP,Q!B@-3@8:++??RA5HI^1SSIVV:AZWX80\%"POP6G1*QYDN,)W
MO$-*B/PL6-^WR-[E19S,=M47^84TLX4HHB!+RH?A,/W"P7N?PC5%R@ZGZ7'6
MH^<!]?ECTY$ZGG9H^90_GB;+;=%9XY#>2H1'_I]</HK+V\SE@'A^XR,X^Y=H
M0U`41T$[Y'ES-YU2>/W;7;;_[DCW?Y^.(J.\_ZMH%UTU[O\.!@KK_P+IU/_]
M">/,7-LKO&;1)"C._AB//HYGTAE031OG)Z2D9>R1E>G0=G&*9)F/65K45DYO
MM4F:!CA\A%J%]9\Y\455X[NN)DGDVQ93_4&&OR1<-O@>5Q%1N9`J7I)LE")'
M^1^"1L)+3\10CJU\Z-4K-\SUBOUBO78_6*_1[M4/Z>>6;RYMV(KNL6[O53^\
M?R=2IU97KIA1S0Z)B.&.MH%0AUJO_&*TO]Y[<C'_UWUM*0=JK;(36)Z!5<WU
M6RDYPOP?Q-TCR=B1_Q5-T\+\WU7Z/17RO];KGO[_^U,&E_^O/G^>"K(_3Q8F
M\"@W^O#[MP7+P=1W]702IV]Z[Y2OU]<I*GLM!K*BO#7'.8W3.(W3>./C'YAH
&%68`*```
`
end
iMac LinuxBox化進捗メモ
perl-5.8.8
Python-2.5.1
lzo-2.02
pkg-config-0.22
sysfsutils-2.1.0
hotplug-ng-002
udev-116
expat-2.0.1
freetype-2.3.5
libpng-1.2.22
jpeg-6b
lcms-1.17
libmng-1.0.10
libxml2-2.6.30
libxslt-1.1.22
xcb-proto-1.0
libxcb-0.9.93
inetutils-1.5( rshのみ )
fontconfig-2.4.2
libdrm-2.3.0
pixman-0.9.6
Xorg-7.3
従来のXは/usr/X11R6にインストール先が固定されていたが、X.org-7.0以降のモジュール化されたXはインストール先は自由になっている。いちおう/usrにインストールすることが推奨されているが、出来ればXは不必要そうだったら簡単に消せるようにしておきたい。というわけで/opt/X11にインストールすることにした。ちなみにモジュール化されたXではあらかじめ要らないパッケージのディレクトリを削除しておくことで簡単にインストールするパッケージを限定出来る。多種多様なビデオカードのドライバが1つのマシンで必要になることは稀なので必要なものだけに絞ってしまおう。TWM上にいつもxbiffが居座っているようなレトロなデスクトップが好みでなければこの手のパッケージも消してしまって問題ない。KDEとかGNOMEとか使う人にはあまり必要なさそうなアプリケーションパッケージは以下の通り
逆に簡素なウィンドウマネージャを好むひとはX.orgのソースツリーのアプリケーションパッケージからいつのまにかxtermが消えていることに注意しよう。
xmltoを入れていないのでマニュアルはインストールされないのだが、libXcompositeがxmltoが見付からないにもかかわらずマニュアルのビルドを試みるのでxorg_source_dir/lib/libXcomposite/Makefile.amの24行目のSUBDIRSからmanを外しておく。
Python-2.5.1
lzo-2.02
pkg-config-0.22
sysfsutils-2.1.0
hotplug-ng-002
udev-116
expat-2.0.1
freetype-2.3.5
libpng-1.2.22
jpeg-6b
lcms-1.17
libmng-1.0.10
libxml2-2.6.30
libxslt-1.1.22
xcb-proto-1.0
libxcb-0.9.93
inetutils-1.5( rshのみ )
fontconfig-2.4.2
libdrm-2.3.0
pixman-0.9.6
Xorg-7.3
従来のXは/usr/X11R6にインストール先が固定されていたが、X.org-7.0以降のモジュール化されたXはインストール先は自由になっている。いちおう/usrにインストールすることが推奨されているが、出来ればXは不必要そうだったら簡単に消せるようにしておきたい。というわけで/opt/X11にインストールすることにした。ちなみにモジュール化されたXではあらかじめ要らないパッケージのディレクトリを削除しておくことで簡単にインストールするパッケージを限定出来る。多種多様なビデオカードのドライバが1つのマシンで必要になることは稀なので必要なものだけに絞ってしまおう。TWM上にいつもxbiffが居座っているようなレトロなデスクトップが好みでなければこの手のパッケージも消してしまって問題ない。KDEとかGNOMEとか使う人にはあまり必要なさそうなアプリケーションパッケージは以下の通り
bitmap editres ico oclock
twm xbiff xcalc xclipboard
xclock xdm xedit xeyes xgc
xkill xload xlogo xmag xman
xmh xmore
twm xbiff xcalc xclipboard
xclock xdm xedit xeyes xgc
xkill xload xlogo xmag xman
xmh xmore
逆に簡素なウィンドウマネージャを好むひとはX.orgのソースツリーのアプリケーションパッケージからいつのまにかxtermが消えていることに注意しよう。
xmltoを入れていないのでマニュアルはインストールされないのだが、libXcompositeがxmltoが見付からないにもかかわらずマニュアルのビルドを試みるのでxorg_source_dir/lib/libXcomposite/Makefile.amの24行目のSUBDIRSからmanを外しておく。
iMac LinuxBox化進捗メモ
glibc-2.7
ncurses-5.6
busybox-1.7.2
bash-3.2
binutils-2.18
gcc-3.4.6
gawk-3.1.5
m4-1.4.10
bison-2.3
groff-1.19.2
gettext-0.16.1
texinfo-4.11
autoconf-2.61
automake-1.10
libtool-1.5.24
make-3.81
kbd-1.12
pcre-7.2
file-4.21
gcc-4.2.2
zlib-1.2.3
flex-2.5.33
perl-5.8.8 ( error )
perlのビルドがうまくいかず今日のところは時間切れ。明日はperlビルド時のログを調べるところから始める。PowerPC版gccというとMacOSXのXcodeの挙動が怪しくて昔苦労したので不安定なイメージがあったが、あれから2年半の間に改善したのか、Xcode特有の問題だったのか、Linux上でのPowerPC版gccは今のところx86版に負けないくらい安定している。
ncurses-5.6
busybox-1.7.2
bash-3.2
binutils-2.18
gcc-3.4.6
gawk-3.1.5
m4-1.4.10
bison-2.3
groff-1.19.2
gettext-0.16.1
texinfo-4.11
autoconf-2.61
automake-1.10
libtool-1.5.24
make-3.81
kbd-1.12
pcre-7.2
file-4.21
gcc-4.2.2
zlib-1.2.3
flex-2.5.33
perl-5.8.8 ( error )
perlのビルドがうまくいかず今日のところは時間切れ。明日はperlビルド時のログを調べるところから始める。PowerPC版gccというとMacOSXのXcodeの挙動が怪しくて昔苦労したので不安定なイメージがあったが、あれから2年半の間に改善したのか、Xcode特有の問題だったのか、Linux上でのPowerPC版gccは今のところx86版に負けないくらい安定している。
iMacのゆくえ
学祭で買ったジャンクiMac、コンパクトフラッシュでも搭載しようかと思っていたのだが、4GBのハードディスクが余っていたので試しに付けてみた。
PowerPCなLinux環境をインストールするのはこれが初めてで、自信が無かったので実機の蘇生に先立ってPearPCでPowerPC版Debianのインストールを試みた。
エミュレータ固有の問題かもしれないが余計不安になったのでとりあえずは手堅くOpenDarwinをインストールすることにした。pdiskでパーティションを切って、インストール開始。次々パッケージがインストールされていく。内蔵電池がきれているらしく、時計が1969年になっていたため( なんで1970じゃないんだろう )、「ファイルの更新日が未来です」エラーが画面に流れていく。エラーを出しているのはtar。
ただのtarボールですか...
OpenDarwinに妙な親近感をおぼえた。
流れるパッケージ名のなかにはLinux環境でおなじみのモノも多々、gccも入ってるしだんだんこのままDarwinでも良いような気がしてきた。
PowerPCなLinux環境をインストールするのはこれが初めてで、自信が無かったので実機の蘇生に先立ってPearPCでPowerPC版Debianのインストールを試みた。
しかし、うまくブートしてくれなかった。自信が3ダウンした。
エミュレータ固有の問題かもしれないが余計不安になったのでとりあえずは手堅くOpenDarwinをインストールすることにした。pdiskでパーティションを切って、インストール開始。次々パッケージがインストールされていく。内蔵電池がきれているらしく、時計が1969年になっていたため( なんで1970じゃないんだろう )、「ファイルの更新日が未来です」エラーが画面に流れていく。エラーを出しているのはtar。
ただのtarボールですか...
OpenDarwinに妙な親近感をおぼえた。
流れるパッケージ名のなかにはLinux環境でおなじみのモノも多々、gccも入ってるしだんだんこのままDarwinでも良いような気がしてきた。
OpenGL流のオブジェクト指向
OpenGLはオブジェクト指向である。
一般にC言語でオブジェクト指向ごっこをする場合構造体とそれをポインタで受け取る関数群を用いる。この方法を採用したもので有名なのがC言語標準のファイル入出力だ。しかしこの方法はオブジェクト指向において大変重要なカプセル化が全くなされていないため、オブジェクト指向による保守性の向上の効果は半減してしまう。
そこで、かどうかはわからないがOpenGLは違う方法を採用している。OpenGLでは任意個数保持できるオブジェクトについて、「現在のオブジェクト」という概念があり、「現在のオブジェクト」を選択してから関数を呼び出すことで意図したオブジェクトに対して処理を行う。これはファイルシステムにおけるカレントディレクトリの考え方に似ている。
が
現在のオブジェクトは当然グローバル変数で指し示されるわけで、このインターフェースはマルチスレッドのことを全く考えていないと言える。複数のスレッドからつつかれると結果が未定義になってしまう。この問題に対してOpenGLが取った対応は驚くべきものであった。
OpenGLを複数のスレッドからつつくの禁止
まぁ、マルチスレッドのことを考えずに作られたプログラムをあとからマルチスレッドに対応させるのは、マルチスレッドを考慮して一からプログラムを書くより大変だということは有名な話ではあるし、一度定まった標準規格のインターフェースを全面的に変更すれば混乱を招くのは確実だ。問題は解かっていても今更変更など出来ないのだろう。
OpenGL似のインターフェースでライブラリを作ろうと思ってる人はちょっと考え直そう。ちなみに、OpenGL似のインターフェースを採用したオーディオライブラリ、OpenALはこの点だけはしっかり変更されている。
一般にC言語でオブジェクト指向ごっこをする場合構造体とそれをポインタで受け取る関数群を用いる。この方法を採用したもので有名なのがC言語標準のファイル入出力だ。しかしこの方法はオブジェクト指向において大変重要なカプセル化が全くなされていないため、オブジェクト指向による保守性の向上の効果は半減してしまう。
そこで、かどうかはわからないがOpenGLは違う方法を採用している。OpenGLでは任意個数保持できるオブジェクトについて、「現在のオブジェクト」という概念があり、「現在のオブジェクト」を選択してから関数を呼び出すことで意図したオブジェクトに対して処理を行う。これはファイルシステムにおけるカレントディレクトリの考え方に似ている。
が
現在のオブジェクトは当然グローバル変数で指し示されるわけで、このインターフェースはマルチスレッドのことを全く考えていないと言える。複数のスレッドからつつかれると結果が未定義になってしまう。この問題に対してOpenGLが取った対応は驚くべきものであった。
OpenGLを複数のスレッドからつつくの禁止
まぁ、マルチスレッドのことを考えずに作られたプログラムをあとからマルチスレッドに対応させるのは、マルチスレッドを考慮して一からプログラムを書くより大変だということは有名な話ではあるし、一度定まった標準規格のインターフェースを全面的に変更すれば混乱を招くのは確実だ。問題は解かっていても今更変更など出来ないのだろう。
OpenGL似のインターフェースでライブラリを作ろうと思ってる人はちょっと考え直そう。ちなみに、OpenGL似のインターフェースを採用したオーディオライブラリ、OpenALはこの点だけはしっかり変更されている。