ワード境界とビットフィールド
構造体を使った演習も終わってるので、ワード境界とビットフィールドについて説明する。
32bitコンピュータであれば、CPUとメモリのデータのデータのやり取りは、4byte=32bit単位で 一括して行う。このため、ワード境界にまたがったデータの配置が行われると、 処理速度の低下につながる。授業では、構造体で"char a[9] ;" があった場合の説明を行う。
処理速度重視ならワード境界配置、メモリの効率よい利用であればワード境界無視(Visual C++なら"#pragma pack"らしい)だけど、年月日のデータをy=int,m=int,d=int なら、96bitになるけど、 y=0..2047,m=1..12,d=1..31で考えれば、20bitで表現も可能となる… ということを説明して、ビットフィールドを説明する。 授業では、組み込み系プログラミングなどでは相変わらずシフト演算や&(AND)や|(OR)を 使った計算も理解の必要もあるし、2進数計算の例も説明する。
Arduinoで3軸加速度センサーを使ってみた
今日から、専攻科1年の4週実験が始まった。 Arduinoを使って制御をテーマに実験をおこなってもらう。 実験の概要説明の後、歯みがきロボコンで使ったオムニホイールやら、 興味があったら触ってもらおうと購入しておいた、3軸加速度センサーの 説明を行い、自分たちのテーマを決めてもらった。 簡単なArduinoの実験後の相談で、オムニホイールの車体制御に決まったようだ。
3軸加速度センサーの実験
学生さんが3軸加速度センサーを使わないことが決まったので、 プロコンなどでも使ってもらうために、こちらで実験してみる。 購入しておいたセンサーは、MMA7260Q搭載三軸加速度センサモジュール。 データシートを見ると、Vcc=3.3[V]となっているので、以下のように配線した。
(( MMA7260Q )) Vcc : 3.3[V] GND : GND(0V) X : A0 Y : A1 Z : A2 GS1 : GND // 1.5Gまでの測定の場合 GS2 : GND *SLP: 3.3[V] // SleepさせないのでHIGH

動作確認のためのプログラムで、以下を記述。
void setup() { Serial.begin( 9600 ) ; } int x = 0 , y = 0 , z = 0 ; void loop() { x = analogRead( 0 ) ; y = analogRead( 1 ) ; z = analogRead( 2 ) ; Serial.print( x ) ; Serial.print( "," ) ; Serial.print( y ) ; Serial.print( "," ) ; Serial.println( z ) ; }
このプログラムを動かすと、加速度なしの状態で330〜350ぐらいの範囲で 激しく変動している。1G加速度方向では500ぐらいの値が出ている。 このままではノイズが激しいし、オフセットを引いてノイズ除去を行った。 指数移動平均 の手法(α=1/16)を使用。
int base = 335 ; // 中心値 int x = 0 , y = 0 , z = 0 ; void loop() { x = (15 * x + (analogRead( 0 ) - base) ) / 16 ; y = (15 * y + (analogRead( 1 ) - base) ) / 16 ; z = (15 * z + (analogRead( 2 ) - base) ) / 16 ; Serial.print( x ) ; Serial.print( "," ) ; Serial.print( y ) ; Serial.print( "," ) ; Serial.println( z ) ; }
この状態で、平置きするとZ軸方向で165の値が得られた。 様々な方向にブレッドボードを移動して、方向に応じた加速度の変化も確認できた。
# それにしてもノイズ変動が大きいなぁ…
Processing + Firmata
試しに、Processing でデータを収集しながら、表示するプログラムを手抜きで 書いてみた。
Arduinoには、"SimpleAnalogFirmata"を書き込んでおく。
[開く]-[Firmata]-[SimpleAnalogFirmata] で Compile & Writeしておく。
(( Processing )) import processing.serial.* ; import cc.arduino.* ; Arduino arduino ; color black = color( 0 , 0 , 0 ) ; color white = color( 255 , 255 , 255 ) ; void setup() { size( 400 , 400 ) ; println( Arduino.list() ) ; arduino = new Arduino( this , Arduino.list()[ 0 ] , 57600 ) ; } int m = 335 ; int x = 0 , y = 0 , z = 0 ; void draw() { background( white ) ; stroke( black ) ; x = arduino.analogRead( 0 ) - m ; y = arduino.analogRead( 1 ) - m ; z = arduino.analogRead( 2 ) - m ; //println( x + "," + y + "," + z ) ; int xx = int( x * sqrt(3.0)/2.0 - y * sqrt(3.0)/2.0 ) ; int yy = int( - x * 0.5 - y * 0.5 + z) ; line( 200 , 200 , 200 + xx , 200 - yy ) ; }
もっとサクサク動くかと思ったが、カクカクだなぁ。 draw() だと、リアルタイムに描画処理の中から呼び出されないかな… Processingを使い込んでいないからなぁ…
ビューテーブルとデータベース設計の導入説明
データベースのSQLの説明の最後としてビューテーブルを説明し、 次章のデータベース設計の導入として、ERモデルの説明を行う。
ビューテーブルと外部スキーマ
データベースでは、3階層スキーマアーキテクチャ(内部スキーマ・概念スキーマ・外部スキーマ) で扱う場合が多い。 特に、"CREATE VIEW … AS " は、概念スキーマから外部スキーマを構成する 時に使われる重要な機能。 "CREATE TABLE"で作られた実テーブルから、"CREATE VIEW"で作り出された ビューテーブルを 使うと、SQLを簡潔に表現できるようになったり、不要なカラムなどを隠蔽化してデータ保護を 実現できるようになる。 その一方で、VIEWを使うことで更新異常を発生する場合もある。
この他にも、GRANT文によるアクセス制限や、COMMIT/ROLLBACK文によるトランザクション処理の紹介を行う。
最後に、COBOLなどで使われる埋め込み型SQLの事例を、教科書例で簡単に紹介。
データベース設計の基礎
教科書の3章のデータベースの設計の導入部を説明する。
データベースでは、設計が悪いと、更新不整合が発生する。 (a)修正不整合(1項目修正が、全レコード修正が必要となる場合)、 (b)挿入不整合(項目の1つに追加があっても、他項目がそろわない) (c)削除不整合(1レコード削除で、関連する項目が消えてしまう)
データベース設計では、実体関連モデル(ERモデル:Entity-Relation model)が使われる。 実体とは、モデル化しようとする対象で独立した存在となれるもの。 実体が持つ色々な特性は属性と呼ばれる。 属性の取りうる値の集合を定義域、同一種類の実体の集まりを実体集合と呼ぶ。 関連とは、実体同士の相互関係をモデル化したもの。
実体関連図(ER図)では、実体を長方形、関連をひし形、属性を楕円で表現する。 属性で、キーとなるものには下線をつけて表す。

ER図で調べると、実際にはもっと細かい規定で表現が行われている。 参考:IDEF1X表記とIE表記
Xcode使い始め…gccのバージョン
画像処理の応用で、簡単に済ませられそうなネタは、 ARToolkitでやらせてみようと、実験を始める。 といっても、MacでXCodeを使う機会がなかったので、 コンパイルしたらすぐさま、gccのバージョンが違うとのつれないメッセージ。

"Xcode gcc バージョン"でググったら、 Xcode Tools Tipsなるサイトで、設定の変更方法をみつけた。
- プロジェクトを開きグループとファイルの一覧。
- 右上の情報ボタンを押してビルドタブを選ぶ。
- 設定の中のコンパイラのバージョンの中に、 「C/C++コンパイラのバージョン」の項目があるので、gcc-4.2をgcc-4.0に修正。
その後はあっさり動き出す。 といいながら、ここからが使いこなす肝心な所なんだけどね。 ひとまず、同様事例日本語のページですぐに見つからなかったし、 メモだけ残す。
そういえば先日、調べ物してたら後ろで子供(小5)が「英語よめるの?」と聞いてきた。 「Webの調べ物で目的の部分を見つける程度なら、 ざら読みできなきゃ恥ずかしいって…」と思うが、 多少なりとも「ソンケーの眼差し…」という雰囲気だったし、 「全部は読めてねぇよ…」という言葉はしまっておいた…
割り込みとOSの機能
半期を2名で分担している計算機システムの授業だけど、 自分の担当の残り回数からすると、早々にOSネタを終わらせる必要あり。 ということで、今日は割り込みの内容の紹介に絞って話を説明した。
割り込み
最初に、割り込みが処理待ちで別仕事をしている状態から復帰する例を説明しながら、 割り込みの内容を説明する。 割り込み時には、優先順位判定・復帰時の処理番地の保存・現在のレジスタ保存・処理の切り替えが行われる。復帰時には、レジスタを戻し、保存しておいた処理番地に復帰する。
割り込みは、 (a)入出力割込み、 (b)タイマー割り込み、 (c)不正命令割り込み(0除算・不当命令・不当メモリアクセス等) (d)ソフトウェア割り込み がある。 まず、CPUには特権モードとユーザモードがある点を説明し、 セキュリティ的に問題になるハードウェア直接アクセスする抜け道をふさいでいる。
入出力割込み
入出力割込みの使われ方: ユーザがハードディスクを触る場合、 ユーザはソフトウェア割り込み(システムコール)を用いて、ディスク操作を行おうとする。 特権モードになったOSでは、最初にディスク操作要求が正しいものか判断の後、 ハードディスクに入出力命令を送る。 この後、OSは処理待ちの別プロセスに処理を切り替える。
別プロセスの処理中に、ハードディスクからの返答が入出力割込みとして、 CPUに伝えられる。この割り込みでOSは元処理に処理を切り替える。
タイマー割り込みとマルチタスク
タイマー割り込みは、一般的にマルチタスクのために使われ、 タイムスライス時間後に、周期的に割り込みがかかるようになっている。 OSはタイマ割り込みが発生すると、処理を切り替えスケジューラが 適当な別プロセスを選んで、処理が切り替わる。
仮想メモリ
OSにおける、主記憶管理機能(メモリ割り付け・動的再配置・記憶領域保護・仮想メモリ) などを説明する。 特に、仮想メモリ機能は、主記憶が不足した場合、並列処理で一時停止している プロセスのメモリを補助記憶装置に退避・復帰を行うことで、 見かけ上のメモリ量を増やしていることを説明する。
メモリ階層の話が抜けてしまった。次週説明が必要だな…
レポート課題
私の担当分のレポート課題のテーマを説明する。 例年通りなんだけど、コンピュータに関係する技術で、 現在の技術と様々な実装方法の比較を、過去の事例なども交えながら、 現状の問題点を踏まえ将来の予想を自分の視点でまとめる…
新手のspam…?
うーむ、外人女性のplala.or.jpドメインのFrom欄に、Undisclosed-RecipientなTo欄、 んで、リンク埋め込み無しで、以下の文章。 Reply-To: にも何もなし。 サーバのエラー返信か、善意の間違い返事を待つパターンなんだろうけど…
Subject: Re:Re:Re: おはようさっちゃん きょうやすみなんやね うち9:00やよ あいつまたいってるみたいやよ ぼんぼんやしあのこときみたいにまいかいプレゼント渡しては とりいってるんやよ なんかいやーなかんじ あしたのおひるどーするん
さっちゃんって誰やネン…
返信後にエロサイトに誘導するパターンなら、 大抵はエッチな雰囲気の文章だったりするけど、 そんな雰囲気ナシ。 さすがにこの「のほほん」な文章&リンク埋め込み無しでは、spamフィルタも普通に通過してくる。