関数ポインタやプロセス起動
今日は、専攻科の特別研究中間発表のある日で、短縮授業。 時間短いしテキパキやろうと授業に乗り込んだけど、発表準備があるためか、 電子情報の学生さん2人のみ。 このまま授業を進めると、来週復帰してくる学生さんがワケワカメになるので、 講義内容を変更する。
通常、電子情報以外の学科の人には、C言語の基本が知らなかったりするので、 話を省略している、関数ポインタについて紹介する。
関数ポインタ
オブジェクト指向が多用されるGUIなプログラミングでは、マウスが押されたときに動かす処理… といったように、GUIライブラリに自作処理を渡すコールバック関数が多用される。 また、後々のオブジェクト指向の講義で話す、仮想関数の実装でも関数ポインタが使われる。 典型的な使い方は、以下のとおり。
int add( int x , int y ) { return x+y ; } int mul( int x , int y ) { return x*y ; } void main() { int (*f)( int , int ) ; // fは関数へのポインタ。 // (2つのint引数を持ち、intを返す関数) f = add ; printf( "%d" , (*f)( 2 , 3 ) ) ; // 2+3が表示 f = mul ; printf( "%d" , (*f)( 2 , 3 ) ) ; // 2*3が表示
プロセス起動
説明の中で、お二人さんから特別研究に関係するC言語のテクニックとして、質問がでたので 回答する。
(( main は、どう書くのが正しいか? )) int main( int argc , char* argv[] ) { : return 0 ; } // argcはコマンドライン引数の数(プロセス名を含む) // argvはコマンドライン引数の実体 // mainのreturn値は、プロセスの実行結果 // 0:正常終了 // それ以外:異常終了
(( 自分で書いた処理から、gnuplot を起動したい...)) 表示させる処理を書いたscriptを作って、 system( "gnuplot スクリプト" ) ; みたいに呼び出せばいい。ただし、gnuplot の処理が終わるまで、 呼び出し側は処理ができない。呼び出し側で凝った処理をしたい ならば、fork() + exec() で gnuplot を呼び出し、必要に応じて gnuplot とパイプで処理を渡すなどのテクニックを使うべきかも。
Moodleサーバへのユーザ登録
新しい年度ということで、創造教育開発センターで管理しているMoodleサーバ (大学連携f-leccs.jpの認証サーバ兼務)に、新一年生のデータを登録する。 と言いながらも、LDAPへの認証登録・Moodleサーバへのユーザ登録・f-leccs.jpへのユーザ登録 の3段階の登録をしないといけない。
情報処理センターからもらったデータを、CSV形式保存、 自作PerlスクリプトでLDAP用、Moodle用のデータを生成させる。 簡単な処理といいたいけど、 元データの姓名に旧字体が含まれコード変換中に文字化けするものがポロポロでてくるので、 その修正もあって、何かと面倒。 さらに、工学基礎コースで2年進級時に転科する学生さんがチラホラいるので、 その修正なども必要だったりする。
Perlスクリプトで、漢字氏名が旧字体で文字化けするのは、1データごとにコード判定するような 書き方をしているからかな… 元データの文字コードが分かっていれば、 誤認識しなくなるかな…
Arduinoイーサネットシールドを使ってみた
創造工学演習でハードウェア系を作るネタの導入として、 Ethernet シールド付き Arduino を動かしてみた。単なるメモなので…
// 雛形のスケッチは、 // ..PATH../Arduino.app/Contents/Resources/Java // /hardware/libraries/Ethernet/examples/WebServer/WebServer.pde #include <ethernet.h> byte mac[] = { 0x02 , 0x11 , 0x22 , 0x33 , 0x44 , 0x55 } ; byte ip[] = { 192 , 168 , 2 , 88 } ; // byte gateway[] = { 192 , 168 , 2 , 1 } ; // byte subnet[] = { 255 , 255 , 255 , 0 } ; // Class-C Server server = Server( 80 ) ; void setup() { Ethernet.begin( mac , ip , gateway , subnet ) ; server.begin() ; Serial.begin( 9600 ) ; // 動作確認用に受信データを表示 } void loop() { Client client = server.available() ; if ( client ) { // an http request ends with a blank line boolean current_line_is_blank = true; while( client.connected() ) { if ( client.available() ) { char c = client.read(); Serial.write( c ) ; // 動作確認用に、受信データを表示 // if we've gotten to the end of the line (received a newline // character) and the line is blank, the http request has ended, // so we can send a reply if ( c == '\n' && current_line_is_blank ) { // send a standard http response header client.println( "HTTP/1.1 200 OK" ) ; client.println( "Content-Type: text/html" ) ; client.println(); // output the value of each analog input pin for (int i = 0; i < 6; i++) { client.print("analog input "); client.print(i); client.print(" is "); client.print(analogRead(i)); client.println("<br />"); } break; } if (c == '\n') { // we're starting a new line current_line_is_blank = true; } else if (c != '\r') { // we've gotten a character on the current line current_line_is_blank = false; } } } // give the web browser time to receive the data delay(1); client.stop(); } }
上記プログラムを検証&書き込みの後、ブラウザで http://192.168.2.88/ にてアクセスする。すると、シリアルモニタには下記の出力が得られた。 後半は、ブラウザがfavicon.icoを取得しようとしたアクセスが行われている。 しかし上記のプログラムは、何をGETしようとしたのか判別せずに、リクエスト末尾の 『空行』を見つけたら、アナログ値を出力しようとするだけ。 このため、Reload する度に、2回アナログ値サンプリングが行われる。
GET / HTTP/1.1 Host: 192.168.2.88 Connection: keep-alive User-Agent: Mozilla/5.0 ...Safari/532.5 Cache-Control: max-age=0 Accept: application/xml,application/xhtml+xml,text/html;... Accept-Encoding: gzip,deflate,sdch Accept-Language: ja,en-US;q=0.8,en;q=0.6 Accept-Charset: UTF-8,*;q=0.5 GET /favicon.ico HTTP/1.1 Host: 192.168.2.88 Connection: keep-alive User-Agent: Mozilla/5.0 ...Safari/532.5 Accept: */* Accept-Encoding: gzip,deflate,sdch Accept-Language: ja,en-US;q=0.8,en;q=0.6 Accept-Charset: UTF-8,*;q=0.5
ブラウザで、http://192.168.2.88/ で表示された結果は、下記の通り。 ちなみにアナログポートは、実験だし開放のまんまで、ゴミデータ。
analog input 0 is 393 analog input 1 is 331 analog input 2 is 282 analog input 3 is 286 analog input 4 is 269 analog input 5 is 284
創造工学演習・導入実験part2
昨日に続いて、創造工学演習の授業にて、ものづくりのために必要な予備知識を得るための、 導入実験2日目。
私の担当のPHPの実験では、Web応用においてPHPと自分で書いたC言語との データのやり取りといった必要性が出てくるため、system() 関数を使って、 プログラムを呼び出したり、C言語側でint main( int argc , char*argv[] ) ; によって、 コマンドライン引数を取得したり、プロセス帰り値の話をして、簡単な呼び出し実験。
そろそろ体育祭
そろそろ体育祭。 担任クラスの4年も下の学年の指導とか頑張ってるみたい。 苦労はあるけど体育祭が終わった後の、達成感は大きいし、 後少し頑張って下さい。
創造工学演習・導入実験
4年実験の最初の2回は創造工学演習の導入も兼ねて、 プロコンなどの参加に必要となりそうな子ネタ系の実験を行う。 ということで、私の担当は、PHPでの実験を行った。
まずは、インターネットの原理として、ブラウザのリクエストから、サーバからのHTMLが帰ってきて、 ブラウザが整形して画面表示といった基本を説明。 その後、CGIなどの原理を説明する。 この際に、実際にプログラムを作る場合には、 サーバ側のプログラム言語とブラウザ内で動くプログラム言語の違いとして、 Perl(CGI)、PHP、ServerSide-Java(Servlet)、ClientSide-JavaScriptの言語を紹介。 (そういえば、クライアント側言語としてのJavaを紹介し忘れてるなぁ…)
この後、PHPの基本文法を説明して、簡単なチャットプログラムを作ってもらう。 ファイル入出力は、簡単に説明できるようにということで、 file_get_contents() , file_put_contents() などを使ったもので説明を行った。
簡単なチャットができちゃったし、明日の後半(創造工学演習)では何を話そうかなぁ… 事例ということで、自分のドアの前の掲示板や自宅のリモコン制御環境の話を交えながら、 system() あたりで、別プログラムとの連携の話をしようかな….
変数と関数のデータ受け渡し
先週の制御構造の話の中で、説明できなかった、break , continue , switch-case 文について 解説を行う。break,continue では、forループのとび先などを交えて話した。
次に、変数の解説ということで、大域変数が原因で変になるプログラムの例として、 下記のようなネタを紹介しながら、大域変数が問題視される事例を紹介。
int i ; void foo() { for( i = 0 ; i < 2 ; i++ ) printf( "A" ) ; } void main() { for( i = 0 ; i < 2 ; i++ ) foo() ; }
この例を受けて、局所変数の重要性を説明し、 大域変数の寿命(起動から終了まで)、スコープ(プログラム全域)の話と、 局所変数の寿命(通常、ブロック突入から抜けるまで)、スコープ(該当ブロックの範囲内)といった 解説を行う。さらに、局所変数で static 宣言した場合の説明を行う。
次に、関数の引数の取り扱いということで、実引数・仮引数の値で一般的には、 『値渡し(Call by Value)』の原則を話す。この値渡しだけを使っていれば、 関数実行による呼び出し側への影響(副作用:side effect)を最小限にできることを説明する。 しかしながら、「大域変数は極力使いたくない」、「関数で共通に使うデータの受け渡し」 といった場合には、時として副作用も必要ということで、 ポインタを経由した書き換え『ポインタ渡し(Call by Pointer)』の話を説明する。
時間が中途半端に残ってしまったので、 C言語が、B言語→C言語→C++→Java/C#と発展していった経緯を紹介する。 特に、C++は、"Better C"(よりよいC言語)としても使われており、 今後の授業でも便利なC++の機能を織り交ぜて話をすることを前置きしておく。
話のネタで、C++の由来やC#の由来を雑談で話した。改めて、WikipediaのC#を見ると、 C#は「音楽の半音上げる」の意味や、「#は、++(改行)++の4つの+」の意味… とのネタが記載されている。ふーん….
2010年4月18日(第160回)
スタジオお休みにつき収録でお送りしました!
払下げPCのセッティング
情報処理センターの払下げPCのセッティングを行う。 払下げ時のパスワードを変更し、 ウィルス対策ソフトを入れ、Microsoft Updateとなった。 最後に、BIOSのNetworkBootを停止させる。 でも、実験で必要そうなソフトを追加インストールしないといけないし、 Sambaのドメインに登録して、使えるようにしたいしな…
10台まとめてセッティングだけど、きびきびと動かないマシンじゃ、 待ち時間が長い。んで、複数台並行作業なんだけど、どのマシンはどこまでやったのか… という状態で、作業のヌケがありそう…
創造教育開発センターのサーバ移転
創造教育開発センターにて、授業アンケート用に構築したサーバ(erd.ip.fukui-nct.ac.jp), 学内向けMoodleサーバ(兼f-leccs.jpのLDAPサーバ:moodle.ip.fukui-nct.ac.jp)を、 e-Learning室ができ、その中にサーバ室ができたことで、場所の移転となった。 移動とともに、ネットワークアドレスの変更などを行い、 情報処理センターにはNATテーブルや学内向けDNSの変更作業などをお願いする。
電子情報の無線LANのルータFERECでは、ユーザ認証にmoodleを使っているので、 その変更などを行い、ひとまず無事に移転完了。
午後からは、情報処理センターにて緊急連絡システムのPC群と同じラックに 入れていたので、配置変更に応じてラックの組み換え作業を行おうかな。 さすがに普通のPCラックに5台乗っけていたのは、元々異常だったし…