新型インフルエンザが高専にも
ニュースを見ていたら、どうも高専でも新型インフルエンザの感染者が出た様子。 紙面では生徒という表現もあり、3年以下の学生さんなのだろう。 該当高専のHPを見ると、5/17〜5/24までの臨時休校と記載されている。
潜伏期間的にはやむおえない対応だろうけど、水際封鎖があれだけあったのに、 この2日ほどでこれだけ感染者が出るというのだから、感染力だけは強そう。
その一方で、我が家は奥さんが実家より「ウィルス性胃腸炎」をもらってきたみたい。 最初38℃越えの熱も出てるし、 妹家族での同様の症状から「新型」じゃないとは思うけど、 『こりゃ、病院いったらまずA型の検査だな….』と話しているけど、 当人(奥さん)は、下痢&吐き気(この時点でたぶん新型じゃない)で Jokeに付き合ってくれない….
複素数によるオブジェクト指向レポート2回目
複素数をテーマにした、隠蔽化を体験するレポートの2回目。 引き続き課題に取り組んでもらっているため、そのまま演習。
LinuxでTimeMachineサーバ構築
Macを使い始めたけど、簡単なバックアップ環境でTimeMachineが便利らしい。 だけど、外付けのハードなり、TimeCapsule のようなものを購入するのはもったいない。 しらべてみると、やっぱりそーゆーネットワークサービスは、Linuxマシンで代用できるらしい。
追記:うーん、うまくいかない…ディスクイメージをコピーした先をTimeMachineが うまく参照していない様子。
追記:ようやくうまくいった。ディスクイメージを移動しディスクイメージサイズを変更した後、 パーティションの情報も広げてやらないとダメ。
追記(2009/5/18):TimeMachineの最初ということで、バックアップを開始するが、 いつも使っているWi-Fiで動かして、半日放置でも20GBのうちの2GBほどしか 保存されていない。まあ、Wi-Fiなんだからそんなもんか…
ということで、初回バックアップくらい有線に切り替えてやり直し。
malloc/freeの使い方
メモリー利用の問題点として、C言語の固定配列サイズの 問題点を紹介し、その対応として、malloc/freeを紹介。
たとえば、複数の名前を配列に記憶する場合、
char name[ 100 ][ 20 ] ;
では、平均名前長が8文字ぐらいだと、12文字/件の無駄が 発生するし、ジュゲムのような長い名前は覚えられない。
そこで、その対応として、
char heap[ 2000 ] ; char* name[ 100 ] ;
として、
↓name[1] ↓name[3] heap: t-saitoh$tomoko$mitsuki$jugemujyugemu......$ayuka$ ↑name[0] ↑name[2]
といった、最初に巨大配列を一括して確保しておき、 データに応じて細切れにして使う手法を説明する。 こうすれば、メモリ空間は「詰めて」保存ができ、 無駄が排除できる。 でも、この領域で、途中途中のデータが不要になったら、 その隙間の管理は面倒。
malloc/free
そこで、malloc/free はこれらをうまく活用してくれる。
int size ; //サイズが入っているとする。 int* p ; // size*sizeof(int) byte のメモリを確保。 // その先頭アドレスを返してくれる。 // 型キャストののち、p に代入。 p = (int*)malloc( size * sizeof( int ) ) ; // 処理後に領域が不要になったら、freeで解放。 // 必要に応じて再利用してくれる。 free( p ) ;
ただし、通常は、malloc はメモリ確保時に、NULL を返すので、 if でチェックの必要がある。一般的な使い方は、
int size ; int* array ; scanf( "%d" , &size ) ; array = (int*)malloc( size * sizeof( int ) ) ; if ( array != NULL ) { for( int i = 0 ; i < size ; i++ ) scanf( "%d" , &array[ i ] ) ; : free( array ) ; }
ただし、free を忘れると、メモリリークが発生し、メモリの無駄な利用は、 仮想記憶の利用から、補助記憶への読み書きを発生させ、処理速度低下を 招くかもしれない。その他の内容は、以下の通り。
- 終了直前のfreeならなくてもよい。
- ネットワークプログラミングでは、子プロセス終了時に自動解放がよく使われる。
- スタック領域を使うんなら、alloca() という関数もある。
- C++なら new / delete 演算子を使う。
- ガベージコレクタのある処理系(java/C#)なら、freeは不要…
担任クラスの個人面談
担任クラスの個人面談を開始する。 本当は、手始めに10人位…と思っていたが、昨日の資源回収の疲労もあり、 「個人面談するぞ!」の話の瞬間にトーンダウン。「ひとまず今日は5人ね…」
放課後には、学生さんの都合で翌日1名になり、ちょっと拍子抜け。
個人面談の前に、昨年までの試験成績席次を表計算に書き込み、 各学生さんの成績傾向を確認しておく。 ただし面談時には、今後の目標を見据えているかを中心に、話をする。
浮動小数点の扱いと文字列の扱い
N進数表現と数値範囲の説明の続きとして、 実数型(float,double)の取り扱いについて説明する。
実数の取り扱い
実数の取り扱いとして、double/float型の内部データ保存形式の説明を行う。 (参考:IEEE 754 wikipedia.jp)
型 | 符号(s) | 指数(e) | 符号(d) | |
float | 1[bit] | 8[bit] | 23[bit] | |
double | 1[bit] | 11[bit] | 52[bit] |
double型の精度は、 より、約52*0.301=15.6桁相当といった説明。
実数型の計算のトラブル事例もいくつか紹介。
int sum , cnt ; // 合計とデータ数で、平均を表示 printf( "%f" , sum / cnt ) ; // めちゃくちゃな答が表示される。 // sum / int は、整数同士の計算で3となる。 // 小数点以下はも止まらない。 // "%f" は、浮動小数点用。第2引数に3があっても、 // 正しく表示できない。 printf( "%lf" , (double)sum / (double)cnt ) ; // 型キャスト double a , h // 三角形の底辺と高さとする。 double s ; s = (1/2) * a * h ; // 面積を計算したい // この答は常に0が表示される。 // 1/2 は、整数同士で計算され、0.5は0として扱われる。 s = 0.5 * a * h ; s = (1.0/2.0) * a * h ; // 2.0と書けば実数どうし s = a * h / 2 ; // 実数/整数は、2.0 に自動的に型拡張される
文字列の扱い
C言語における文字列の扱いを説明するために、 ASCIIコード表(JISコード表)などの説明をする。 配布資料中の例題で、10進、8進、16進変換、 文字コード間の加減算を行う。 制御文字'\n','\r','\f'などを、タイプライタの動き を例にしながら、説明を行う。
2009年5月10日 (第111回)
- ゲスト 電子情報4年 丸山さん
Geocodingなど
Perlで地名から緯度経度を簡単に求めるのに使えそう
- http://www.geocoding.jp/api/
- XML::Simple