ARGENTO CUORE

Category : 未分類

--.--.--[--] スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2010.07.18[日] モジュールのロード

reallocって、古いメモリにあったデータを可能な限りコピーすると書いてあるけど、可能じゃないときって捨てるのかな、可能じゃないときってメモリ不足とかなのかな、他にも色々原因となる要素はあるのかな……と一抹の不安を覚えつつ、これは便利だ。
今まで、バラバラにmallocしてたからそれの管理をするためにメモリ参照のデータ構造を作ってメモリリークを監視するようなものを用意してたんだけど、reallocで再確保すれば、そのポインタだけ保持してれば良い。良かった。

そもそもC言語、大学時代に勉強したけど、そのあとJavaやったし、そのあとPHPやったりScalaやったりRubyやったりで、真髄的な部分まできちんと理解してない。けど、他の言語をやってたおかげで、めちゃくちゃC言語触るの楽しい。なんかこう、ハードウェアを身近に感じられるのが新鮮。
勝手にメモリ確保するな、勝手にGC走らせるな、遅いよ遅いよどうしよう的な状態から一気解放された。

インタープリタ自作にあたって、構文はBASICを参考にする予定だけど、全ての処理はライブラリをロードして、それを使って行うようにしたかった。算術演算には算術演算のモジュールをロードする感じにしておけば、算術演算の処理だけを精度が高いものにゴッソリ変更したりしつつ、プログラムは一切手を加えなくて済むみたいな……いや、既にいっぱいそういうのはあるだろうけど……。車輪の再発明、結構じゃないか。とか、そんなノリで。

で、俺言語モジュールをロードする際、インタープリタ側では以下のような情報を得られないといけない。
・読み込んだモジュールの名称
・モジュールに実装されているインターフェース(関数)名と、その処理へのポインタ
このためには、モジュールを定義&処理定義のためのモジュールを作るためのライブラリを作る必要がある。のだろうか、他に良い方法あるだろうか。そんなことはとりあえず置いておいて、書く。

typedef struct{
処理名
関数へのポインタ
 引数の数
}tModuleFunction;
typedef struct{
 モジュール名
関数の数
 tModuleFunctionへのポインタ
}tModule;

みたいなのを用意して、それぞれに値をセットしていくようにする。モジュールのコードには、ロード時に必ず読み込まれる関数を定義しておき、そこで各データ構造体に値をセットする関数を呼び出すようにする。

インタープリタ側では、
void* module_objects;
みたいな感じで、モジュールのポインタを保持しておくための変数1つを持っておき、モジュールの初期化関数の戻り値=モジュールのポインタにしておいてインタープリタ側で受け取るようにする。

あとは、インタープリタ側で読み込んだモジュール名とその数をテーブルにして管理しておき、必要に応じて処理を呼び出す。
ように作った。けど、こんな作りで良いのかわからない……&C言語使ってる知り合いがいないので助言も聞けない。
良いのか、良いのかな。まぁ、問題が起きたら変えよう。たぶんこれで上手くいくはずだ。

変数の命名で悩む。授業で習ったときには、グローバル変数にg_とか、そういうのを付けると習ったんだけど、いまいち、自分はそんなコードをみたことがない。typedefしたものにtは付けるようにしているけど、それ以外はものすごく適当。ただ、Javaとかやってたせいで、省略記法を使う頻度は減ったと思う。getFrmMdlCntとかよりも、getFromModuleCountのほうが健全だよね……とか思うのは、Javaに毒されたからかな……。というか、今時の言語で英単語を省略しているのはあまり見たことないような気もする。悪習?

個人的に、関数やメソッド名は、ラクダで書くけど、変数名やメンバ変数はアンダーバーでつなげて書く派(そんな派閥があるのかは不明だけど……調べてみたら、アンダーバーでつなぐのはスネークケースというらしい。強そう)。
スポンサーサイト

2010.07.10[土] stdinを調べる

$hogehoge < inputfile
で標準入力を得ることができるけれど、
$hogehoge
で実行したときにはきちんと、ファイルないよ!って言いたかったので、調べてみた。

sys/stat.hをincludeして、fstatを使うとOK。
↓みたいな感じにする。
struct stat st;
fstat(fileno(stdin), &st);
if(S_ISREG(st.st_mode)){
/*stdinはファイル*/
}else[
fprintf(stderr, "error");
return 1;
}

2010.06.26[土] ライブラリの動的呼び出し

任意精度数演算とdouble,int等を使ったネイティブ演算の処理を切り分けるついでに、各演算を別個共有ライブラリにして、デフォルトはネイティブ、任意精度数演算を行う場合に、それ用のライブラリをロードするようにしてみた。

以下、そのメモ?的な何か。

共有ライブラリは、
$gcc -shared lib1.c -o lib1.so

で作れるが、-fPICオプションを付けたほうが早いらしいので、以下のコマンドで作る。
$gcc -shared -fPIC lib1.c -o lib1.so


以下のような関数を持つライブラリを作って、
void print(char *str){
printf("lib1: %s\n", str);
}


以下のようなコードでロードし呼び出す。
int main(void){
void *handle;
void (*func)(char* str);

handle = dlopen("./lib1.so", RTLD_LAZY);
if(handle == NULL){
/*エラー処理*/
}
func = dlsym(handle, "使用する関数名");
if(func == NULL){
/*エラー処理*/
}
func("hello");

dlclose(handle);
return 0;
}

2010.06.25[金] 泥沼にハマる

「プログラムは思ったとおりに動かない。書いたとおりに動く」

とどこかで聞いたことがあるけど、書いた通りに動かないこともあります。

浮動小数点演算。

int main(void){
int i;
double d = 0;
for(i=0;i<10;i++){
d += 0.1;
}
if(d == 1.0f){
printf("hoge\n");
}
return 0;
}


と書く。d に0.1ずつ10回加算すれば1.0のはずなのだが、そう上手くは行かない。
二進数とか二進数とか二進数のせいで。

で、絶対に正確な計算をしたいと思ったので、正確な計算方法はないのかと調べてみると、二進化十進表現という方法を使うと良いらしい?のかなぁと思いつつも、これを実装するの面倒そうで、もっと他に方法がないか調べていたら、GMP - The GNU Multiple Precision Arithmetic LibraryMPFRというのを発見する。大きな数を扱うためのライブラリみたい。

で色々やってたんですが……mpfr_cmpという関数で値を比較するらしいけど、0.1ずつmpfr_addで加算して1.0にしたmpfr_t変数と1.0のmpfr_t変数を比較しても同じ値として扱ってくれない……。丸め誤差というのをどうにかしたら良いのだろうか……。ドキュメントを流し読みすると、大きな値を使えることはわかるんだけど、正確な値を使えるとかどこにも書いてないのに気付いた……。無限に続く値をどこかで切って比較すれば良いのかな。切り方がわからない……。

そして泥沼へ。

- 追記 -

勝手に切ることにした。正しいのかどうか不明……。

2010.06.05[土] おもしろいーと思って見てたら、深いなー……

「もしも神がコンピュータを使って天地創造していたら」
http://labaq.com/files/god-ja.html

2010.06.04[金] DS

DSとはDual Screenの略で合ってるんだろうか。

久々にウェブアプリケーションの構築をしているんですが、画面が二枚以上欲しくなる。
普通のアプリケーションとかであれば、コマンドだけで起動し実行&確認できるけど、ウェブアプリだとコンソールとブラウザを行ったり来たりするのが非常に面倒です。
調べ物用ブラウザで1枚、コンソール用に1枚、動作確認用ウェブブラウザに1枚、液晶3枚あったら嬉しい(なんて無駄使い)。

パソコン新しく買うーってなったとき、たぶん次もノートPCを選びそう……。
ノートPCは、1つで完成されたものって感じがして良い。ごちゃごちゃ配線したくない。

と、そういうことを考えてたら、以前パソコンショップで変なノートを見かけたのを思い出した。

http://jp.kohjinsha.com/store/dz/index.html

↑工人舎っていうところから出てる、液晶を二枚搭載したノートPC。
すごい。かっこいい。でも、CPUが遅そう……。NeoはAtomより早いけど、Core2Duoよりは遅い。

普通にgccやScalacとか使って開発するには良さそうだけども、Android向けにコードをビルドして転送すると、Core2Duo2GHzで完了までに大体1分かかってしまうので、今より更に遅いCPUを使いたくはない……。

高速でコンパクトでデュアルスクリーンなものないかなー……。

2010.06.01[火] ネットワーク接続

やっとネットにつながった……。
ここに来るまでなんと長い道のりであったことか……。

いつものようにPCを立ち上げると、なぜかネットに接続できない。

で、昨日、ローカルサーバーの設定とか、バーチャルホストとか、/etc/hostsとか、/etc/network/interfacesとか色々書き換えていたので、もしかしたらそのせいかなと思った。起動しなおした際、何かよからぬものを呼び覚ましてしまったのではないかと。

で、ひとつひとつチェックして、

/etc/init.d/networking restart

ってやって頑張る。も、改善せず。というか、pingがルーターにも届かない!
networking restartじゃだめなのかなと思って、再起動かけまくってたら今度はeth0がないよと言われはじめる。

おかしい。これはおかしい。
いや、俺の頭がどこかおかしいのはいつものことだ。慌てるようなことじゃない。

そして先ほど、原因がわかりました。

原因は……LANケーブルが死んでました。
あるんですねこういうこと。思えば、きしめんのケーブルだから断線しそうな、そんな構造をしているような気がします。

とりあえず、ネットワーク関係のメッセージってわかりにくいと思う。
もっとこう、ユーザーに対する愛にあふれているべきだ。Ubuntu(訳:他者への思いやり)だし。

「ちょっとLANケーブル変えてみなさいよ!べ、別にあんたのために言ってるわけじゃないんだからね。私が最新のアップデートを入手できないと困るのよ!」

とか言ってください(でも、それはそれでむかつきそうだ)。

2010.05.25[火] Deb系、Apacheの設定

Debian/Ubuntu系ディストリビューションのApacheって、サーバー方面の知識に疎くて、いつも設定ファイルを睨んではググってる自分にとってすごく使いやすい。以下、そのメモ。

dev.hogehoge.netという新しい開発用のバーチャルホストを設定したいとする。

$cd /etc/apache2/sites-available/
$sudo cp default dev.hogehoge.net
$sudo vim dev.hogehoge.net

<VirtualHost dev.hogehoge.net:80>
-省略-
DocumentRoot /var/www/hogehoge/

と変更して、保存。

$sudo a2ensite dev.hogehoge.net
で、新しく作ったサイトの設定を有効にする。

$sudo vim /etc/hosts
127.0.1.1 dev.hogehoge.net localhost

$sudo /etc/init.d/networking restart
で/etc/hostsの内容を反映させる。

最後にApacheをリロード。
$sudo /etc/init.d/apache2 reload

a2ensiteっていう便利なコマンドが、サイト設定の有効無効を勝手にしてくれました。
無効にするには、a2dissiteを使う。
a2enmod, a2dismodという、モジュールに対するコマンドもある。

なんか、すごくわかりやすい。 deb系使ってて良かった!

Scala Feed

scala feed

FC2カウンター

プロフィール

RoNor

Author:RoNor
得意呪文はScalaですって言えるようになるのが夢です。
デスマーチ中、パーティメンバーの防御力を向上させたりさせなかったり。

検索フォーム

QRコード

QRコード

Copyright © 2009-2010 ARGENTO CUORE and RoNor All rights reserved.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。