2015年11月29日(第451回)
学生さんがテスト期間中につき、教員による収録でお送りしました。
- 高専ロボコン全国大会について
- 高専デザコンについて 環境都市工学科 江本先生のインタビュー
- ジャスバー歴史 22杯目「グローバルの意味」 社会科 手嶋先生
担当:中村(国語科教員、MC)、千徳(機械工学科教員)、清島(国語科教員)、西(電子情報工学科教員、MIX)
RSSを使った情報活用(専攻科実験)
RSSを使った情報活用の実験で、 学生さんが、RSSフィードの作成に興味を持っているので、 PerlでHTMLソースを扱うためのプログラミングの説明。
HTMLのソースをダウンロードするのであれば、 Perlであれば、"LWP::Simple"が便利。
#!/usr/bin/perl use Jcode ; # 文字コード変換用に use LWP::Simple; # # ダウンロードしたいURLをget()に渡すだけで、 # 全ソースをとってきてくれる。 $content = get( "http://www.ei.fukui-nct.ac.jp/" ) ; # 行単位の処理をするほうが判りやすいので... my $c = 0 ; # split で行ごとに分割 foreach my $line ( split( /\n/ , $content ) ) { # 今回は、EUC-JPに変換して出力 $le = Jcode->new( $line )->euc ; printf( "%04d: " , $c++ ) ; print "$le\n" ; }
2015年11月22日(第450回)
学生さんがテスト期間中につき、教員による収録でお送りしました。
- 新任教員紹介 国語科 清島先生
- ジャズバー歴史 21杯目「西暦について」
- 国語のテストについて
- 高専ロボコン、イングリッシュカフェのお知らせ
ゲスト:国語科 清島先生
担当:中村(国語科教員、MC)、原口(英語科教員)、小越(電子情報工学科教員)、西(電子情報工学科教員、MIX)
2015年11月15日(第449回)
収録でお送りしました。
- 研修旅行、校外研修、遠足の話
- 授業参観の話
- 数学の部屋(再放送:平成20年度2月10日放送分) 「アキレスと亀」
担当:松島(4C)、川﨑(2EI)、島脇(2B)、水島(1C、MIX)、中村(教員)
IchigoJamでモンテカルロ法
IchigoJam で真面目にπを計算させるというのを、 松田さんがBlogに書かれていて、面白かったので、 追加でちょいとお遊び。
元プログラムは、1000回ループのモンテカルロ法で、 精度をあげるには…というお話なんだけど、 1000回ループを10倍で….なら、100×100のマス目で x^2 + y^2 < 100^2 の判定と同じということで、 超簡単なプログラムで答えを比べてみた。
たった、4行のプログラムだけど、精度をあげようと 思うと奥が深いかな。
vmwareサーバの認証鍵問題
vmware の Webリモートコンソールの画面に接続しようとしたら、 『サーバーは短い一時 Diffie-Hellman 公開鍵を使用しています』といった 警告メッセージが表示されて接続に失敗する。 「IEだったらうまくいく」とのことだったけど、こっちはMacなので対応できず。
調べてみると、下記のような設定をすれば、Firefox なら接続できた。
(( Firefox にて )) address bar にて、"about:config" を入力 検索で"dhe_rsa_aes"を検索すると、 o security.ssl3.dhe_rsa_aes_128_sha ユーザ設定 真偽値 true o security.ssl3.dhe_rsa_aes_128_sha ユーザ設定 真偽値 true が表示されるので、項目をクリックして、false に修正すればいい。
ビットフィールドと共用体と列挙型
出張の都合により、今日は授業を入替え、3年の授業。
構造体の理解については、明日の授業で演習を行う。今日は、振替えで演習室も使えないので、 普通の講義。
ビットフィールド
例えば、生年月日を記憶する場合、構造体を使えば以下のように宣言できるが、 int型(32bit=4byte)であれば、12byteを要する。
struct YMD { int year ; int month ; int day ; } ;
しかし、生年月日の比較などをする場合であれば、 年月日を10進数の桁に合わせて、日付を 20151109 といった数値で表すことも多い。 この場合であれば、int 型 2^31-1 = 2,000,000,000 にも収まる。 プログラムも解りやすくするのであれば、以下の様な補助関数を準備すれば良い。
int ymd10_year( int ymd ) { return ymd / 10000 ; } int ymd10_month( int ymd ) { return (ymd / 100) % 100 ; } int ymd10_day( int ymd ) { return ymd % 100 ; }
しかし、このプログラムでは、日の1〜31までの数字のために、0〜99の10進2桁を使う。 月の1〜12のために0〜99の10進2桁を使う。 また、各桁を抜き出すために、除算を使うため処理も手間がかかる。
そこで、年月日を2進数の桁の組合せで保存することを考える。こうすれば、2進数のビットシフト命令で機械語では扱いやすくなる。
// 年(12bit),月(4bit),日(5bit) = Y,YYYY,YYYY,YYYM,MMMD,DDDD int ymd2( int y , int m , int d ) { return (y << 9) | (m << 5) | d ; } int ymd2_year ( int ymd ) { return ymd >> 9 ; } int ymd2_month( int ymd ) { return (ymd >> 5) & 0xF ; } int ymd2 _day( int ymd ) { return ymd & 0x1F ; }
しかし、この方法でデータを扱うと、月の値を1つ増やすといった処理を書こうと思うと、2進数の扱いに慣れていないと プログラムも間違いやすい。
int ymd = ymd2( 2015 , 11 , 9 ) ; // ymd の月を12月に変更したい。 ymd = (ymd & 0x1FFE1F) | (12 << 5) ;
このような処理のために、ビットフィールドを使用する。使い方は、構造体の要素の宣言の後ろに、": bit数"をかけばいい。 こうすれば、構造体の要素の参照の式をかけば、必要に応じて2進数を使った機械語命令をコンパイラが書いてくれる。
struct YMD { unsigned int year : 12 ; unsigned int month : 4 ; unsigned int day : 5 ; } ;
共用体
構造体と同じような文法の一つに共用体がある。 構造体では、異なる型の各要素のメモリの領域を準備するが、共用体では全要素が同じ場所を使う。 このため、どれか1つの値を覚えるだけでいい場合に使う。
union int_str4 { int data ; char str[4] ; } ; union int_str4 a[4] ; a[0].data = 1234 ; strcpy( a[1].str , "ABC" ) ; a[2].data = 2345 ; strcpy( a[3].str , "BCD" ) ; printf( "%d¥n" , sizeof( a ) ) ; // 4byte×4 = 16
この異なる型を同じ場所に覚えるための文法は、最近のオブジェクト指向のプログラム言語では、仮想関数という考え方 が利用できるので、あまり利用することは少なくなっている。
列挙型
プログラムの中で週のような情報を覚える時、日付の処理を考えると、 日=0,月=1,火=2,水=3,木=4,金=5,土=6 といった割り当てをすることも多い。 しかし、水曜の処理だったら…という時に、if ( week == 3 ) という書き方では、分かりにくい。
int wd = 1 ; // 月初めが月曜の場合... int day ; for( day = 1 ; day <= 31 ; day++ , wd = (wd + 1) % 7 ) { if ( wd == 3 ) { 水曜日の処理... } } // マジックナンバーを使わない場合 #define SUN 0 #define MON 1 #define TUE 2 #define WED 3 : (略) int wd = MON ; // 月初めが月曜の場合... int day ; for( day = 1 ; day <= 31 ; day++ , wd = (wd + 1) % 7 ) { if ( wd == WED ) { 水曜日の処理... } }
上のプログラムの後半のマジックナンバーを使わない例であれば、プログラムの意味も解りやすくなる。 しかし、#define を7つも書き並べるのは面倒だし、対応する数値を1つづつ増やしながら書くのは、 間違って修正するかもしれない。 こういう場合には、列挙型を用いる。
enum Week { SUN , MON , TUE , WED , THR , FRI , SAT } ; enum Week wd = MON ; int day ; for( day = 1 ; day <= 31 ; day++ ) { if ( wd == WED ) { 水曜日の処理... } // wd 型は int ではないので、週番号を増やすのはちょっと面倒 wd = (enum Week)( ( (int) wd + 1 ) % 7 ) ; }
データベース(SQLの演習)
SQLの説明も大体終わったので、演習を行う。
SQLの演習
学内のアカウントでログインすれば、SQLite3 を使った簡単な演習ができる環境を 準備しているので、それを使って演習。 教科書で示されるデータなども、簡単に読み込めるようにしてある。
演習内容は、SQLでデータを検索する処理を2つ考え動かしてみる。 最低でも、2つのテーブルにまたがった処理であること。 できれば、副問い合わせなどを含んだ処理などにチャレンジすること。 また、そのSQL命令をC言語で記述したものを作り、 直積処理などの意味を考える。
提出は、SQL命令、C言語、説明、動作確認、考察が記載されていること。
2015年11月8日(第448回)
- 福井高専創立50周年記念式典、コンサートについて
- 研修旅行について
- ジャズバー歴史 20杯目「年表の意味」
- 高専カフェについて
担当:田嶋(3C)、山田(2B)、木下(2EI)、西島(1E)、中村(教員)