文字列の型と問題提起
過去の資料を使いながら、文字列の取り扱いで見落としがちな問題点を説明する。 特に、未初期化ポインタのトラブルと、バッファオーバフローについて説明を行う。
void foo( char s[] ) { : } void main() { char s[ 20 ] ; char *p ; scanf( "%s" , s ) ; foo( "1+2" ) ; // たぶん正しい。 foo( 1+2 ) ; // 文字と数式の区別がついていない foo( '1+2' ) ; // シングルクオートと、ダブルクオートの区別がついていない。 foo( s[ 100 ] ) ; // 配列サイズと添え字の区別がついていない人もいる。 foo( s ) ; // たぶん正しい。(バッファオーバフローの可能性あり) scanf( "%s" , p ) ; // 未初期化のポインタで入力 // (1) 多プロセスのメモリを触ってメモリエラー // (2) 自プロセスの多データを触って、変な動き。 }
バッファオーバフローとセキュリティ
バッファオーバフローとして、下記のようなプログラムの危険性を解説。 s[]が局所変数であれば、付近には関数からの戻り番地(PC)が保存されている。 あふれる領域で、PCを書き換え、PCの飛び先をあふれる領域の中のプログラムに してやると、想定外のプログラムを実行できる。
char s[ 10 ] ; // s[ | | | | | ] PC ウィルスプログラム scanf( "%s" , s ) ;
C言語では配列の範囲外アクセスチェックは行われない。
(1)はみ出さないようにチェックする。
(2)まちがったプログラムは修正する。
(3)既存のソフトでも間違いがあれば、アップデートを行うこと。 特にWindows Update。ただし、通常Microsoftは1ヶ月毎のアップデートなので、 1月以内に作られたウィルスには効き目が無いかも。
(4)ウィルス対策ソフトを入れること。 ただしウィルスが発見されてワクチンやウィルス情報が作られるまでには数日かかる。 数日以内に作られたウィルスには効き目が無いかも。
(5)こういったバッファオーバフローなどの危険性を理解して、 不用意にプログラムを実行することの危険性を理解すること。
2010年5月30日(第166回)
- メールテーマ:ザ・ルーズドックスの皆さんへの質問受付中!
- 故郷戦士(ふるさとせんし) ザイゴマンについて
放送前の様子です。
高久・斉藤研合同ゼミ報告会
自分の卒研室だけで中間報告会をしていても、 お互い甘えがあったりして、報告資料作りやそのための成果準備も、 おざなりになりがち。 ということで、高久先生の卒研室と合同で卒研の報告会を行った。
斉藤研では、少し前に宿題ネタ的な内容で成果報告会をやっていたので、 今日は卒研の目標を整理して発表を中心に行ってもらった。 ただ、具体的な物を作るにあたっての事前実験などが不十分ということが判明。 講評として「最終目標の検討をしたとはいえ、いきなり作ることはできないし、 必要となるネタの部分的な実験をこなし、少しづつ動くことを確認しながら、 卒研をすすめよう。その方が成果がでている達成感もあって卒研も楽しいよ…」 とアドバイスを行う。
UPKIオープンドメイン証明の申請
学術研究機関を対象とした、無償のSSL認証キーの発行サービスの申請のTSVファイル生成を行う。 手順が長いので、肝心な所は記載しないが、その入力などの内容をメモ。 最終的に、電子情報工学科のTSVファイルと、緊急連絡システム用のTSVファイルを作った。
# mkdir /etc/apache2/ssl.key/ # cd /etc/apache2/ssl.key/ # cp 大きいファイル1 randfile1.txt # cp 大きいファイル2 randfile2.txt # cp 大きいファイル3 randfile3.txt # openssl genrsa -des3 -rand randfile1.txt:randfile2.txt:randfile3.txt 2048 > maisy.key Enter pass phrase: [passphrase] Verifying - Enter pass phrase: [passphrase] # lv maisy.key -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,xxxxxxxxx : -----END RSA PRIVATE KEY----- # openssl req -new -key maisy.key -sha1 -out maisy.csr Enter pass phrase for maisy.key: [passphrase] Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []:Academe2 Organization Name (eg, company) [Internet Widgits Pty Ltd]:Fukui National College of Technology Organizational Unit Name (eg, section) []:Electronics and Information Department Common Name (eg, YOUR name) []:www.ei.fukui-nct.ac.jp Email Address []:. Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:. An optional company name []:. maisy:/etc/apache2/ssl.key# lv maisy.csr -----BEGIN CERTIFICATE REQUEST----- : -----END CERTIFICATE REQUEST----- maisy:/etc/apache2/ssl.key# openssl req -noout -text -in maisy.csr Certificate Request: Data: Version: 0 (0x0) Subject: C=JP, L=Academe2, O=Fukui National College of Technology, OU=Electronics and Information Department, CN=www.ei.fukui-nct.ac.jp Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (2048 bit) Modulus (2048 bit): https://tsvtool.nii.ac.jp/cgi-bin/tsvtool.cgi TSV作成ツール:発行申請TSV ・CSRファイルから maisy.csr [CSR送信] CSR 主体者DN CN=www.ei.fukui-nct.ac.jp,OU=... サーバFQDN www.ei.fukui-nct.ac.jp dNSName なし 加入者Email 自分のメール 加入者氏名 斉藤 徹 加入者所属 福井工業高等専門学校電子情報工学科 ソフトウェア名等 Apache 2.2.9 [完了] [ダウンロード] issue-YYYYMMDD.tsv
実際に鍵を登録
UPKIの事務局に、issue-YYYYMMDD.tsv を送ったら、 鍵を入手するための「UKPI-ODCert]Webサーバ証明書発行受付通知」なるメールが 送られてきた。指定されたURLをアクセスして、サーバ証明書を受け取る。 ファイル名は、"サーバFQDN.cer"であった。(Apacheへの登録では"*.crt"に直す)
これに加えて、別途 "nii-odca2.crt" を入手しておく。
# cd /etc/apache2/ssl.key # mv ...PATH.../サーバFQDN.cer ./maisy.crt # vi /etc/apache2/sites-enabled/100-default-ssl : SSLCertificateFile /etc/apache2/ssl.key/maisy.crt SSLCertificateKeyFile /etc/apache2/ssl.key/maisy.key SSLCertificateChainFile /etc/apache2/ssl.key/nii-odca2.crt : # /etc/init.d/apache2 restart 起動すると、鍵作成時のパスフレーズを聞かれるので、入力する。
継承を説明
データを拡張してプログラムを作成することを通して、継承の概念を説明する。
C言語での限界
struct Person { char name[ 10 ] ; int age ; } ; void print( struct Person* p ) { printf( "%s %d\n" , p->name , p->age ) ; } struct Jyoshi { struct Person person ; int size ; // 部下の人数 struct Person* table[ 10 ] ; // 部下へのポインタ } ; void print_jyoshi( struct Jyoshi* p ) { print( &p->person ) ; for( int i = 0 ; i < size ; i++ ) // 本人と部下のデータを表示 print( p->table[ i ] ) ; } void main() { struct Person saitoh ; // 初期化も適度に行うとする struct Jyoshi ashida ; print( &saitoh ) ; // print( &ashida ) ; // saitohと同じ様にprintしたいけど、できない print( &ashida.person ) ; print_jyoshi( &ashida ) ; // 部下の表示が不要だとしたら // わざわざJyoshiバージョンを作るのが面倒。 }
unionを使えば…
union PERSON { // 初期化の処理は省略 struct Person person ; struct Jyoshi jyoshi ; } ;
こういう方法を使えば、jyoshi の先頭部分はpersonであり、 共用体によって、同じ部分に person が配置されている。 こういった共用体を使って、拡張部分のあるデータを同じように扱うテクニックは、 unix のグラフィックシステム X11 に見られる。 例年は、共用体を使うテクニックまでは解説しないけど、 今年度は受講者が電子情報出身者だけになったので、解説を行った。
派生と継承
データを拡張しても同じように扱うテクニックとして、派生があることを説明。 前の例みたいなことは、C++であれば以下のように行う。
class Person { // データの共通部で元になるものを private: // 基底クラスと呼ぶ。 char name[ 10 ] ; int age ; public: Person( char s[] , int a ) { strcpy( name,s ) ; age = a ; } void print() { printf( "%s %d\n" , name , age ) ; } } ; class Jyoshi : public Person { // 派生クラス private: int size ; Person* table[ 10 ] ; public: Jyoshi( char s[] , int a ) : Person( s , a ) // 基底クラスの初期化 { size = 0 ; } void buka( Person* p ) { table[ size++ ] = p ; } } ; void main() { Person saitoh( "saitoh" , 45 ) ; Jyoshi ashida( "ashida" , 60 ) ; ashida.buka( &saitoh ) ; saitoh.print() ; ashida.print() ; // ここがミソ:基底クラスのメソッドを流用 }
最後のJyoshiのデータ ashida において、print メソッドは存在しないが、 基底クラスのprintメソッドを流用してくれる。これを継承と呼ぶ。
void Jyoshi::print() { Person::print() ; for( int i = 0 ; i < size ; i++ ) table[ i ]->print() ; }
上記のような、Jyoshi専用のprintを定義してもいい。
2010年5月23日(第165回)
- メールテーマ:雨の日のすごし方
- 英語の囃子 第36回 吉田三先生、電子情報5年丸山さん
福井高専のeラーニング室に入っているソフトについて
学生さんの英語の発音をチェックできます!
eng100523.mp3
- ブラックサンダーにあうものを探そう! 第4弾
駄菓子のカツ、にぼし、瓦せんべい
ロボット技術講習会のプラットフォーム
ロボット系の技術講習会を開催予定だけれど、その実験環境を選別中。 ライントレース実験をしたいのだけれど、 昨年度は車体に4chリモコンロボット製作セットDX(TAMIYA)約7,000円を使ったけれど、 ギアボックスの組立などで手間もかかるし、別途光センサーなども必要だったりする。 そこで、実習も簡単に行うために自分の子供用に購入したKIROBO(ELEKIT)約5,700円 の方が便利そう。
KIROBO(ELEKIT)
KIROBOは、CPUにPIC16F88を使って動くロボット。IconWorks なるソフトで、 ブロック状のコマンドを並べてプログラミングもできる。IconWorksのプログラム転送には、 音声ジャックを用いている所なんかも特徴的。 タイヤのギアボックスも、サーボモータのギアボックスみたいに既に完成しているから、 子供でも1時間ほどで組み立てられる。光センサーや触覚センサーも付いているし、 IconWorks を使えば、小学生でも自律ロボットを簡単に扱える。
しかし、技術講習会では、Arduinoなどを用いてC言語のプログラミングなどを経験して もらうのが目的としているので、CPUボードは使わずに、センサー周りの回路をブレッドボード で組んで、Arduinoで動かすほうがより実践的な講習会にできる。
ということで、添付の回路図を確認。 周辺の光センサーとはブレッドボードのジャンパピンで簡単に配線できそう。 モータ用の電池ボックスなども入っているし、便利。 難点とすれば、車体前輪のタミヤ模型ならボールキャスタが使うんだろうけど、 KIROBOは、ツルツルした丸みのあるプラスチック。 ライントレースのコースに、黒のガムテープだと滑りが悪そう。 極力車体は軽くしたい。
Arduinoの電源周りの確認
車体を軽くしたいので、KIROBOの電池ボックス(単3×4=6V)をArduinoで有効活用したい。 ArduinoのホームページのHardware にて、Duemilanove の回路図を見ると、 Vinなる端子から5V3端子レギュレータを通して5Vを生成している。ここに乾電池をつなげばいいだろう。
ということで、KIROBOの車体と光センサーを使い、この車体上に小さいブレッドボードと、 Arduino(Duemilanove)をつんで動くライントレーサロボットを作るという目標で、 材料の見積もりを取ろう。
必要機材
全員各1つ | |
Arduinoをはじめようキット | 4,200円 |
USBケーブル(A-Bタイプ) | 100円 |
グループで1つ | |
KIROBO | 5,775円 |
TA7291P×2個 | 110円×2 |
220Ω×2個,47KΩ×2個 | 10円×4 |
2人1グループであれば、1人あたり7,320円。LEDやCdsがArduinoはじめようキットに入っているから、細々と部品を買い集めなくっても揃うから、簡単。 光センサーもアナログポートに直結し、閾値調整はソフトで行えばいい。
Arduinoなどを考慮して作られた、初心者向けの回路図エディタ Fritzing も試しにつかってみた。 初心者向けのブレッドボード回路図をそれなりに簡単に作れるなぁ…
合同ゼミ中間発表
高久先生と合同でゼミの中間発表をしようと相談。 例年になく斉藤研では、宿題ネタの途中結果の発表会を実施しているが、 合同中間発表だし最終目標の発表としたい。 卒研で目指す最終目標のシステムは、どんな構成で・どんな処理をするの かを発表して欲しい。