ホーム » 2009 » 10月 (ページ 2)

月別アーカイブ: 10月 2009

2009年10月
 123
45678910
11121314151617
18192021222324
25262728293031

最新の投稿(電子情報)

アーカイブ

カテゴリー

ふくいITフォーラムにてバトリオと同じドットコードによるアンケート

10/22,23の両日、ふくいITフォーラムの展示に参加してきた。 その会場では、ブースを見学すると赤・青・黄のシールをもらえて、3つそろうと景品がもらえるくじ引きができるようになっている。1等20型TV,2等デジカメということもあり、多くの参加者がくじ引きをした。 私も、出展の合間にブース見学でくじ引きに参加し、ティッシュ(;_;)をもらった。 ただ、その際に、見学の感想アンケートをするんだけど、その記入用紙が興味深かった。

微妙に灰色に見えるアンケート記入用紙に、特殊なボールペンで丸をつけるだけで自動集計される。


出展元掲載の拡大されたニセモノバトリオコード

この用紙、整備不良のコピー機でコピーしたようにうっすらと灰色がかったように見えるけど、実はコーディングされたマイクロドットが一面に印刷してあり、小型カメラのついたボールペンが、マイクロドットを読み取りアンケート結果を自動で集計できる優れもの。 一枚のアンケート用紙の回答項目毎に、違うマイクロドットが印刷してあるみたい。 これと同じ技術は、ゲームセンターのポケモンバトリオに使われている。最初これを見かけた時は、100円のパックにRFID内蔵させているものと思っていたけど、実は パック表面に印刷されたマイクロドットを読み込んでいる。

ちょっと疑問だったのは、マイクロドットが印刷されているから、安いコピー機やプリンタ用紙だと、読み取りエラーが多発すると思うんだけど、用紙はボールペン書き込みで使い捨て。逆に考えれば、ちょっと高めの解像度のコピー機?プリンタ?であれば十分、印刷できるということなんだろう。 ITフォーラムの会場なんだし「このアンケート用紙、面白いでしょ!!」と、 もっと説明してもよかったんじゃないかと….

4EI学生作品のプラネタリウム制御の展示

最後に頑張って、GoogleSkyを動かす所まで完成できました。 0910231156_320x240.jpg

ふくいITフォーラム参加中

0910221521_320x240.jpg

10/23追記:昨日の展示では動かない車体でしたが、 急造でライントレースプログラムを書き、動くようにしてみました。 オムニホイールによるタイヤの動きは、見学の方にも興味を持ってもらえたようでした。

オムニホイールによる歯みがきロボット

車体はそれなりに形にはなったかな。後は学生さんにまかせよう。 0910211029_320x240.jpg

HRにてN年後の目標

先日、4年生のインターンシップ報告会があり、将来の自分の仕事を少しでも 考える時間ができたと思い、ホームルームにて、 『{1,3,5,10}年後の目標と、そのためにすべきこと』をA4用紙に記入してもらった。

  • 1年後:3年で進路変更の人もいるだろうし、4年で進路にむけて真剣に考える時期。
  • 3年後:就職した人は1年目、進学なら3年編入直後。
  • 5年後:さらに進学した人は大学院、就職した人は3年目で慣れてきたところ。
  • 10年後:27才頃。OBと話したりすると、転職するひとや、結婚する人も出てくる年齢。 私自身もこの頃に高専に転職したなぁ…

本当は、20年後も書いてということも考えたけど、自分自身の10年後も語れない気がするので、 今回はやめておく。 10年後はかけないなぁ…とか、色々と『書けない』と言う人も多かったけど、 紙に書くだけでなく、考えるきっかけを作ってほしいのが目的なので、無理強いはしない。

いい時期だと思うので、OBに声をかけて、進学や就職に関係するOB談話の時間を、 HRの中でやってもらおうかと考えていたりする。

2分探索木の生成

先週は2分木の操作のプログラミングであったが、今日は入力データを2分木に追加する処理を 説明する。追記すべき場所を末端まで移動しながら探し、追加する処理は、以下の通り。

int key ;
struct Tree* top = NULL ;
struct Tree** tail ;
for( tail = &top ; (*tail) != NULL ; /*none*/ ) {
if ( (*tail)->data == key )
break ;
else if ( (*tail->data > key )
tail = &( (*tail)->left ) ;
else
tail = &( (*tail)->right ) ;
}
if ( (*tail) == NULL )
(*tail) = tcons( key , NULL , NULL ) ;

この処理の動きを説明した後、データが昇順や降順に与えられると、枝が一方向にのみ 成長し、検索処理が O( N ) になってしまい、本来の O( log N ) にならないことを説明する。 このような場合、枝の途中で、繋ぎ換えを行えば枝の深さが減らせることを説明する。 これを全体に施し、最適化を行う方法として、AVL木を紹介する。

このような2分木の欠点としては、1データあたり2ポインタを必要とし、メモリの 利用効率としては悪いことを説明する。

この説明にあたり、32bit = int 、32bit = pointer で 説明をするが、最近のコンピュータであれば、Over 4GB になれば、32bit では不十分で あることを示し、64bit OS などが普及してきたことを関連情報として説明する。 2^64 = 16 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 = 16 EB( Exa Byte )

これらのメモリの使用効率を改善して、2分木と同様の左右の枝の概念を持つ方法として、 2分ヒープを紹介する。

歯みがきロボコンCM

歯みがきロボコンのコマーシャルなどが、 そろそろ始まるらしい。 その一部の写真を見せてもらった。

0910202119_448x267.JPG

歯みがきロボコン画像処理型自律ロボットpart3

歯みがきロボコンに出走させる画像処理による自律ロボットのpart3。 昨年度のロボットは、OpenCVを使って画像処理的には王道みたいなプログラムを書いたけど、 処理が重く移動速度も極めて遅かった。 今年度は、同じくOpenCVを使うけど、基本は画像の3点だけの白黒に注目して、 ライントレース処理を行い、単純な処理で実装させる予定。 また昨年度車体は、車体重心が後輪のキャスターに加わり、駆動輪が空回りしていたので、 この車体は、後輪駆動でパソコンを後輪上に載せ、空回りを防ぐ。

頭の上には、デジタルコンパスを置いて、これで車体の大まかな方向を把握させながら、 動かす予定。当初、パソコン下にコンパスを配置する予定だったけど、駆動モータが近いため、 方向の誤認が激しく、モータから遠いカメラ上に設置とする。 と、言っておきながら、ライントレースプログラムは今から書くんだよぉ~。

手抜きで、ライントレースさせてみた。 ひとまず、画面上の3点に注目すれば、ライントレース動作してくれて、 去年のような遅さは無い。 ただし、白・白でコースからはずれた時の処理が、手抜きなので、 簡単に止まってしまう。明後日のITフォーラムに展示するときまでに、どこまで動いているように見えるようにするのか…それが腕の見せ所。(手抜きコーディング能力ともいう…)

構造体と関数で受け渡し

前回の構造体の説明(基本文法と複合データ)に続いて、第2段。 関数と構造体の説明を行う。

構造体の一括代入

構造体同士の代入文は、要素の一括代入が可能なことを説明する。 この時に、古いC言語(K&R)の文法の話も交えて、古い文法も紹介する。

struct A { char n[10] ; int a ; } ;
struct A a[ 10 ] ;
struct A b ;
// 一括代入の文法を知らないと...
strcpy( a[0].n , b.n ) ;
a[0].a = b.a ;
// ANSI-Cであれば、この書き方ができる。
a[ 0 ] = b ;
// K&Rであれば、
memcpy( &a[0] , &b , sizeof( struct A ) ) ;

値渡しとポインタ渡し

前期の説明での、値渡し・ポインタ渡しを説明し、配列は基本ポインタ渡しであることの復習を行う。

// 値渡し
void foo( int x ) {
x++ ;
printf( "%d" , x ) ;
}
void main() {
int a = 123 ;
foo( &a ) ;
foo( &a ) ;
}
// ポインタ渡し
void foo( int* p ) {
(*p)++ ;
printf( "%d" , *p ) ;
}
void main() {
int a = 123 ;
foo( &a ) ;
foo( &a ) ;
}
// 配列のポインタ渡し
void foo( int x[] ) {
x[0] = 123 ;
x[1] = 234 ;
}
void main() {
int a[ 2 ] ;
foo( a ) ;
printf( "%d %d" , a[0] , a[1] ) ;
}

構造体とポインタ渡し

構造体を使ったプログラムでは、ポインタ渡しが多用される。 下記のように、構造体の中身を触る関数と、利用する関数に分けると、 プログラムで、データ構造の修正が容易になることを説明する。 この後、(*p).name 等を例にとり、型の概念を説明する。 最後に、p->name といったアロー演算子を紹介する。 教科書の中で、式の部分の型を説明してくれているものって少ない!!

struct Person {
char name[ 10 ] ;
int   age ;
} ;
void read_person( struct Person* p ) {
scanf( "%s %d" , (*p).name , &((*p).age) ) ;
}
void print_person( struct Person* p ) {
printf( "%s %d" , (*p).name , (*p).age ) ;
}
void main() {
struct Person data ;
for( int i = 0 ; i < 10 ; i++ ) {
read_person( &data ) ;
print_person( &data ) ;
}
}
&((*p).age) 式の部分のそれぞれの型
p struct Personのポインタ
*p struct Personの構造体
(*p).age int
&((*p).age) intへのポインタ

Googleドキュメントの実験RGB2YUV

Googleドキュメントを使って公開したときの利便性の実験。 画像処理でのRGB2YUVの表計算を公開すると、便利かな…