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を定義してもいい。
ロボット技術講習会のプラットフォーム
ロボット系の技術講習会を開催予定だけれど、その実験環境を選別中。 ライントレース実験をしたいのだけれど、 昨年度は車体に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 も試しにつかってみた。 初心者向けのブレッドボード回路図をそれなりに簡単に作れるなぁ…

合同ゼミ中間発表
高久先生と合同でゼミの中間発表をしようと相談。 例年になく斉藤研では、宿題ネタの途中結果の発表会を実施しているが、 合同中間発表だし最終目標の発表としたい。 卒研で目指す最終目標のシステムは、どんな構成で・どんな処理をするの かを発表して欲しい。
atoi(),itoa()にて演習
N進数・文字列・数値の範囲・文字コードとデータの基本が理解出来たところで、 文字列から整数値を取り出すatoi() , 数値を文字列に変換する itoa() のプログラムにて、 演習を行う。 演習用の雛形プログラムを示し、そのプログラムの挙動を示し、以下の課題とする。
int my_atoi( char s[] ) { int ans = 0 , i ; for( i = 0 ; s[i] != 'int my_atoi( char s[] ) { int ans = 0 , i ; for( i = 0 ; s[i] != '\0' && s[i] >= '0' && s[i] <= '9' ; i++ ) { ans = ans * 10 + (s[i] - '0' ) ; } return ans ; } char* my_itoa( char ans[] , int x ) { int i ; ans[ 5 ] = '\0' ; for( i = 0 ; i < 5 ; i++ ) { int d = x % 10 ; ans[ 4 - i ] = '0' + d ; x /= 10 ; } return ans ; }' && s[i] >= '0' && s[i] <= '9' ; i++ ) { ans = ans * 10 + (s[i] - '0' ) ; } return ans ; } char* my_itoa( char ans[] , int x ) { int i ; ans[ 5 ] = 'int my_atoi( char s[] ) { int ans = 0 , i ; for( i = 0 ; s[i] != '\0' && s[i] >= '0' && s[i] <= '9' ; i++ ) { ans = ans * 10 + (s[i] - '0' ) ; } return ans ; } char* my_itoa( char ans[] , int x ) { int i ; ans[ 5 ] = '\0' ; for( i = 0 ; i < 5 ; i++ ) { int d = x % 10 ; ans[ 4 - i ] = '0' + d ; x /= 10 ; } return ans ; }' ; for( i = 0 ; i < 5 ; i++ ) { int d = x % 10 ; ans[ 4 - i ] = '0' + d ; x /= 10 ; } return ans ; }
課題
my_atoi() については、 (a) 8進数・2進数・16進数で動くように、 (b) より一般的にN進数で動くように、 (c) 小数点を含む値が処理できるように (d) C言語の定数のように先頭の"0x(16進数)","0(8進数)"で 自動的に基数を判別するように、といった改良のいずれかを行うこと。 また、my_itoa については、同様に、(e) 8,2,16進数、(f) N進数、(g) 浮動小数 といったテーマより、それぞれ1つづつを選んで取り組むこととした。
レポートには、プログラム・説明・動作検証(異常動作の検証)・異常動作についての考察 を記載することとする。
課題に取り組んでもらっている中で、関数のプロトタイプ宣言を説明を行う。
インターンシップ(夏季実習)依頼中
4年担任として、インターンシップの受入れを企業にお願いする作業を、連日行っています。 現在、20名分(4EI=38名)の企業から、OKもしくはたぶんOKといった内諾をもらえている。 豊橋や長岡のオープンキャンパスの申し込みもたぶんOKとなるだろうし、 検討中のところも含めれば、山場を越えたあたりかな。
企業を選ぶにあたって、楽そうな雰囲気で選んでいる人もいるけど、 報告会だったり、実際に就職の際には、楽なインターンシップを選んだ人は、 ちょっと後悔するんじゃないかと思うのだが….
どちらにしろ、数社からはお断りだったり、寮無し自己負担だったりで、 受入れを再検討してもらっている人も出てきている。まだまだ調整は大変だけど、 慣れない電話仕事をもう少しがんばろう。
薬物乱用防止講習会
近年、大学生による大麻などによる逮捕といった事例として、 身近なところでも薬物乱用が広がっており、数年前より全4年を対象に 「薬物乱用防止講習会」が行われている。
今日は、保護師の方が、取り扱った人の事例を交えながら、薬物乱用の 怖さを語ってくれた。 当初、PRビデオの上映を予定していたが、事前動作確認はされていたものの、 年期の入った古いビデオであるためか、急に動かなくなってしまった。 このため、お話し主体の講演となった。
# おかげで話の繋がりが分かりにくかったかな…
隠蔽化(Complex)の解説+演算子オーバライド
例年どおり、複素数のクラスを直交座標系で記述して、 隠蔽化を考慮してプログラムを書けば、後でデータ構造を極座標系に変更しても 利用者側のプログラムは一切変更不要…というネタで解説する。
今年度は、すでに受講者が電子情報のみになっているので、 例年説明をしていない演算子オーバーライドや"cout<<…<<endl" といった、iostream系の紹介(詳しい解説はしない)を行った。
途中にて、Complex::add( Complex& ) といった宣言で、「引数を参照宣言するのはなぜ?」 といった質問がでる。例で示した複素数といったオブジェクトであれば、関数呼び出しで コピーを伴う「値渡し」でも実行効率は悪くならないが、巨大オブジェクトではコピーを避けるために 「参照渡し」が一般的であるため、実務で見かける機会の多い「参照渡し記述」をしていると説明する。