2015年12月26日土曜日

ゆめしテロ(夢屋 Advent Calendar 2015 18日目)

はじまらない

実を言うとこの記事はもうだめです。
突然こんなこと言ってごめんね。
でも本当です。

2,3章後にものすごく
夢屋な写真があります。

それが終わりの合図です。
程なく飯テロが来るので
気をつけて。
それがやんだら、少しだけ間をおいて
終わりがきます。

はじめに

これは夢屋 Advent Calendar 2015 - Adventarの18日目の記事です。え、今日26日?

・・・ごめんなさい。

注意

この記事の公開を躊躇った理由でもありますが、 以下には「飯テロ」という非人道的行為について書かれています。 書いた本人は自爆しました。

飯テロを受けてもなおも正気を保っていられるのであれば以下の文章を読むといいでしょう。

飯テロについて

飯テロとは無防備な市民に対し、視覚や嗅覚など人間の五感などを刺激し、 脳内に飯を想起するように仕掛ける暴力的かつ非道極まりない行為である。 特にTwitterやよくあるSNSでは写真を共有する機能を用い、視覚的に刺激する手法がよく使われている。

これの防衛手段はその五感を閉じることしかない。

・・・いや、それでいいのか?

「汝平和を欲さば、戦への備えをせよ!」そう!市民よ立ち上がれ!武器を取れ! 飯テロには飯テロで応戦するのだ!

夢屋はおいしい料理店であるからにして、飯テロの武器は揃いやすい。 今回は夢屋で良い飯テロ写真を撮るために幾つか解説する。

夢屋で良い飯テロ写真を撮るための三箇条

以下の三箇条を守ればだいたい美味しそうな飯テロ写真が撮れます。 写真のとり方はしらん。

明るい席の下に座る

言わずもがな、写真を撮るためには良い光が必要です。 できれば照明が付いている席の真下に行きましょう。

サラダが付いているものを選ぶ

サラダさえ隠してしまうと夢屋のおかずは100割茶色いです。 全部茶色い写真はあまり強力な武器とは成り得ないでしょう。 これを回避するためにも変なものは頼まずにサラダを付いているものを選ぶようにしましょう。 まあ大抵の定食にはついていますが。

開店直後に行く

これは特に揚げ物の場合に言えます。 油が新しいと、揚げ物の発色はとても良い物になります。 閉店間際にいくとやはり油がだんだん劣化してくるらしく、多少酸化したような色になります。 飯テロ写真には発色の良いほうが良いわけですので、開店直後に行くのがもっともよいでしょう。

また、上記との明るい席を確保するためにも開店直後は特に空いているので良いと言えるでしょう。

これらを守ればあなたは強力な飯テロ写真を手に入れることでしょう。

おわりに

要するに何が言いたかったかといいますと、夢屋美味しいからガンガン行こうやってことです。

遅れたことについては今度おしょーゆにハイパースライディング土下座ラムアタックをするので許してください。

2015年12月9日水曜日

ゆめいやー(夢屋 Advent Calendar 2015 9日目)

はじめに

これは夢屋 Advent Calendar 2015 - Adventarの9日目の記事です。

夢屋のメイヤーの取り方について適当なことを言いたいと思います。

メイヤー is 何

自己位置暴露と記録のためのスマホアプリ「Swarm」はご存知でしょうか。 あいぽんアンドドイドに提供されています。 このアプリは、「チェックイン」という機能で自分の位置を友達に暴露することができます。

また、同時にTwitterにその情報を垂れ流すこともできます。

で、メイヤーとは、このアプリを使いその場所で過去30日間最もチェックインした人間に授けられる称号です。

現在のメイヤーとメイヤーを取る上で障害となってくること

こちらが、現在のメイヤー、メイヤーを取る上での最大の障害になる男、 夢屋アドベントカレンダーのオーガナイザー、 蒸しタオルを作るだけでフォロワーの腹筋を破壊する男、 ボゴソートで他人の進捗を阻害する男、 ドリンクバーを払い忘れて他の人に2人分のドリンクバーを払わせる男、 フロントガラスの曇りをなんとかしようとしてさらに曇らせる男、 駐車場で絶対にまっすぐに駐車できない男、 骨折して医者に激しい運動をするなと言われているのに激しい音ゲーをする男、 夢屋のメイヤーになっただけで写真を晒される男、など、様々な異名を持つJCの おしょーゆ 氏です(夢屋にて撮影)。

タッチパネルが下半分壊れているスマホッホにキーボードを繋げてツイッターをしています。 おたくっぽいですね。 そして、彼はプロなので、私がチェックインするとこんな感じにコメントを付けてくれます。

完全にプロですね。これはいよいよ彼を超えなければなりません。さあどうしましょう。

取り方1:物量戦術

至って簡単です。お財布に物を言わせ、JCのおしょーゆを超える回数行きましょう。

例えば今、アプリを開いて確認した所、今月おしょーゆは月に10回しか行っていません。

彼にしてはちょっと少ないように思えます。まあいいや。 では、それを超える10+1回行くとしましょう。 生卵定食(260円)を毎回頼んだとして、かかる料金はたったの月2860円です。 生卵定食おかず大(340円)にしても、たったの月3740円です。

簡単ですね。でも飽きそうです。

取り方2:鬼のいぬ間に戦術

おしょーゆもJCです。たまにはパパやママの顔が見たくなるので実家に帰るでしょう。 この時が狙い目です。 夢屋代は娯楽費と割りきっておしょーゆが実家から戻るまでの間、夢屋に通いつめましょう。

ただ、1ヶ月間実家に帰っていたと言っている間にもなぜかおしょーゆは夢屋に現れる事があります。 ココらへんの見極めですが、完全におしょーゆの気まぐれですので予測は無理でしょう。 大丈夫大丈夫大丈夫とつぶやきながら夢屋に行くべきでしょう。

大丈夫大丈夫メイヤー取れるって大丈夫だからヘーキヘーキ

おわりに

要するに夢屋美味しいからガンガン行こうやってことです。

おっと手が滑った

唐揚げ親子丼定食、(通称からおや)。通常の親子丼と違い、鶏が唐揚げになっている。 なにも増さずともボリューミー。おいしい。お気に入り。完食。ごっそさん

2015年12月7日月曜日

ロボット用ラインセンサーについての知見

はじめに

諸々思うところありまして、ライントレースをするロボットを作る上で必須となる、 「ラインセンサー」について、適当に書き散らすことにしました。

多くの人は漠然と「フォトリフレクタか何かを並べて使えばラインセンサーとして良い」と考えるでしょうが、 そのフォトリフレクタの使い方一つとっても大量の方式があります。 以下には1ヶ月ほどライントレースの製作だけを意識して行えば行き着く結論が書かれていますが、 何かと時間との戦いになるロボコン屋にはそんな無駄な作業を余裕はないでしょう。 思考を整理し加速させる材料となれば幸いです。

なお、ライントレースの入門自体は下に示す綺麗にまとめてくださった方の一連の記事を参照すると良いでしょう。

それと本記事は上記の一連の記事を一通り呼んだことを前提に書きたいと思います。 めんどくさいから。w

アナログ値をつかうか、二値化するか

ライントレースするロボットを用いる競技には、ランサー、マイコンカーラリーを始め、多種多様なものがありますが、 やはりその究極とはロボトレース競技に違いないでしょう。 あの上位陣のロボットが見せるなめらかな動きというのは、フォトトランジスタをAD変換した8bitから12bit程度のAD変換によって得られた値を うまいことゴニョっとして比例制御なりPID制御なりの操作量としてモニョっと入れてできているのですから、 究極の速さを求めるためのライントレースならアナログ変換値をつかうことは必須でしょう。

しかしながら、この手法はある程度以上競技台の質が確保されていないと調整しきれない場合が多いです。 例えばロボトレーサやランサーなどはかなりの質が確保されていますが、 大学ロボコンや適当な私設ロボコンなどでは競技台ごとや同じ競技台の中でも場所によって塗りが微妙に違ったり、 紙の上に印刷したりビニールテープを張ったりするだけだったりします。 この場合はアナログ値を使ったものではうまくいかないことが多いので二値化する方が良いでしょう。 また、そういう競技ではそこまで速度を追い求めるわけでもないはずですのでこれで十分なはずです、

基礎中の基礎

大抵のラインセンサというのはLEDで対象面を照らし、その反射光をフォトトランジスタやフォトダイオードで拾うという、 フォトリフレクタをいくつか並べた方式を用います。この方式は例えば白と黒で光の反射率が違うのを利用しています。

LED側の回路について

基本的なこと

基本的には、というか大抵の場合は以下の様になるでしょう。

とても単純です。抵抗値ですが、おそらくLEDの許容電流ギリギリになるように設定する場合が多いです。 これはLEDから発せられる光が十分に強くないと外乱光によるノイズの影響を受けやすくなるためです。

LEDをON/OFFできるようにする

このように回路を組むことでLEDをON/OFFできるようにする方法もあるでしょう。

ON/OFFできるようにするといくつかいいことがあります。例えばご利益が得やすい状況順に

  • 一瞬だけ光らせるのであれば定常的に光らせるより大きい電流を流すことができる(=明るく光らせることができる)
  • ON時とOFF時の差を取ることである程度外部の定常的な外乱光の影響を減らすことができる(特性が線形であればあるほど)
  • 節電できる
  • センサー同士が干渉している時、一つづつ動かすことで干渉しないようにできる

などがあります。ちなみに図ではFETでON/OFFしていますが、特に複数個数がある場合は、 シンクドライバIC とかを使うと回路がすっきりできます。

何色のLEDをつかうべきか?

何色の(どのくらいの波長の)LEDをつかうべきかということに関して、 まず考慮されるべきは、相方のフォトトランジスタ感度特性にあった波長であるかどうかです。 感度特性のピークに近くないと、どんなにLEDを光らせても反応しないなんてことがあるかもしれません。 また、予想される外乱光の波長とは別の波長であるかどうかが重要となってきます。 これは考えればせやなってなると思いますので特には書きません。

以上を鑑みると可視光でない波長が最適なように思えます。 現在、可視光でない波長を扱えるフォトトランジスタやLEDは赤外線のものが安価であるので、 特に赤外線が用いられるようです。

余談ですが、赤外線に近い赤色も動作や照射範囲を確認しやすいなどの理由で採用されることもあります。 照射範囲を調整しなければいけない場合は候補に入れても良いかもしれません。

余談:凝ってみた

LEDを品質よく光らせたいのであれば以下の様な回路を組んでも良いでしょう。

この回路はオペアンプで基本的な定電流回路を組み、その上で大電流がドライブ可能な様に FETでバッファを組んでいます。詳しくは解説しませんが、 LEDに流れる電流は

I = R1 × Vref

になります。([定電流回路 オペアンプ]とでもググればよろし)

多分こういうのが一番凝っている回路になるでしょうが、こんなに凝らずとも、 よほどのことがない限りソフト側で負担すべき程度の誤差になるでしょう。

フォトトランジスタ側の回路について

基本的にはこんな感じになるでしょう。

これで明るければ電圧がVcc寄りに、暗ければGND寄りに触れます。 出力電圧については、ほぼ

 =  × R

になります。抵抗値の選定などはこれを目安にやると良いでしょう。 しかしながら抵抗値を大きくし過ぎると反応速度が悪くなったり、 AD変換に必要なインピーダンスより大きくなったりするので 次の図のようにオペアンプを適切に挟んでやるといいでしょう。

非反転増幅回路による倍率は、

R1/R2

で定められます。

よく使われる抵抗値は、オペアンプを挟まない場合は1~10kΩ、 オペアンプを挟む場合は100~470Ωくらいになる場合が多いようです。 オペアンプの増幅は1(ボルテージフォロワ)~5倍程度が多い気がします。

ちなみにもっと反応速度が必要な場合、フォトダイオードを使う必要が出てきますが、 そんなもの使う人はこんな解説ページは必要ないので割愛します。

2値化前提の回路

上記のLED回路とフォトトランジスタ回路にコンパレータをつけるだけでもいいかもしれません。

しかし、そんなめんどくさいことをするよりも専用ICを使い (例えばこういうの)、 もっと簡単に回路を組み、ノイズ耐性も良好にする方法があります。

以下に光変調型フォトIC、S4282-51を使った回路を例示します。

この半固定抵抗は感度調整用です。 お前マジかみたいな気分になるけどこれ以外にやり方が思いつかない・・・。 半固定抵抗以外にも固定抵抗がついていますが、半固定抵抗が0Ωになってしまった場合の 最低限の保険のためについています。

そういえば現地での感度調整は回路屋の仕事です(半固定抵抗回すだけだけど)。 ソフト屋の仕事でゎなぃ。

その他の方式

画像処理

あらゆる意味で速度との勝負です。できるもんならやってみやがれ。

???「それも経験、さ。」

ラインイメージセンサ

要するにバーコードのあれですかね。面白そうではある。

カラーセンサ

床がカラフルであるときにそこまで速度が必要でないのであれば、 そこまで応答速度が早くないカラーセンサが候補に上がります。 ただ、照明の色相や競技台による微妙な差異をどうやって取り除くかは十分考える必要があります。

センサーの配置や距離について

使用するフォトリフレクタやLEDとフォトトランジスタの組み合わせによって、 ラインが書かれている面とセンサー間の距離には適正値が違います。 フォトリフレクタを使用する場合は、適正距離が書かれていますので、よく呼んで「わかり」を得ましょう。 LEDとフォトトランジスタの組み合わせをするのであればLEDの指向性(何度広がるか)を見て、 よく考え、実験して決めましょう。

また、距離によって床に当たる光量、床から帰ってくる光量が大幅に変わってくるのは周知の事実ですから、 これを一定にする努力も周知の事実であります(でも行われない)。 例えば、坂道のあるフィールド(ロボカップジュニアのレスキュー・ラインや大学ロボコンの特定のルール)や、 紙の上のフィールド(ロボットが走るとどんな工夫をしてあってもめっちゃたわむ)では対策が必須となります。 対策例としてはロボットにただネジ止めするのでなく、蝶番や、ちょっと凝って平行リンクを使って、 ロボットからの距離を変えられるようにすることで床からの距離を一定にするという方法があります。

戦うべき外乱光

我々が主に戦う外乱光は以下の通りとなっています。

室内灯

我々が室内にいる時は大抵50Hzとか60Hzの電源で動いている照明の恩恵を受けますが、 ロボットに恩恵をもたらすかというと殆どの場合NOです。 ラインセンサーから発せられる光に比べると光源との距離も鑑みて、十分弱いと思っていると、 大会会場の水銀灯はそれでもとても明るかったりします。 覆いをつけるなりなんなり対策しましょう。

ちなみに室内灯から受ける外乱光は50Hzや60Hzをではなく100Hzや120Hzです。

太陽光など

最悪です。電灯線由来の照明に比べ、すごく強い上に赤外線成分マシマシです。 まあ直射日光の元でロボコンをやったりしないでしょうが、 うっかりうっかりカーテンがあいてたりするとギャーってなります。

フラッシュ

・・・はい。つらい。

時間的にピンポイントすぎるので異常値を取り除くとかの処理が逆にし易いですが、 大抵影響を受けやすいロボコンはフラッシュ禁止になってます。

覆い

外乱光からラインセンサーをお守りするダサいけど効果的な手法です。 つけるに越したことはないです。変なこだわりを持たずに、ダメだと思ったら付けましょう。

余談:そのライントレースはそんなに品質が必要ですか?

どのような種類のロボットでも、綺麗に、速く、ライントレースすればするほど動作は美しく感じられます。 でも、特にライントレース以外の機能を持つロボットは、ある程度以上のライントレース速度や品質を求めるよりも、 他の機能の開発に限られている時間を回したほうがいい場合がかなーりあります。 車のシートにマイクロメートル単位の精度は要りませんね?陸上国家では帆走技術ツリーは要りませんね? 目的的な品質管理を心がけましょう。

とは言え、確実な競技には正確な足回りは必須です。 1000回競技を完遂して1000回とも1回も線を外れないのが最低合格ラインです。 がんばりましょう。

おわりに

Q.君最近よく更新するね。

A.書き溜めてたのを放出してるだけなんやなって

SECCON 2015 Online CTF write-up

はじめに

ロボコン屋がチームTonkatsuNabeに入ってお茶汲み枠でCTF出ようと思ったら すでにいたので文鎮枠で出たお話を書きます。

ぼくが解けた問題

(null)

ぼくが解けそうだった問題

Reverse-Engineering Hardware 1

もうやられてるだろうと思って寝てたら誰もやってなかったので昼前に起きて朝飯食べて そこから始めました。

どんな問題だったのか

写真を見て、回路を想像し、シミュレートするだけの問題です。やるだけの問題ですが、 写真を見るのがとにかくめんどくさかったので400点問題だったのでしょう。 写真でなく回路図やネットリストだったなら50点くらいの問題でした。

おそらくシミュレート方法くらいしか解けたチームのやり方に違いはないはずです。

ICとトランジスタとダイオードと

IC

ICの型番は写真をクワッと目をみると74HC74と書いてあります。7474ですよ皆さん! D-FlipFlopが2つ入ってるだけです。CLKも同じ所につながっています。 何もむずかしいことはありません。

トランジスタとダイオード

おそらくこの問題の唯一の教養部分でしょう。工学系、情報系なら1年生でお話されるはずです。

トランジスタとダイオードをは以下の図の様につながっており、これでOR+NOTでNOR回路となっています。 型番は推測ですが2SC1815と1N4148だったのではないでしょうか。 最初、これはトランジスタかFETどっちかなとか、 日本で一般的なECB配列か海外でありがちなEBC配列のどっちかなとかいろいろ悩みましたが、 ダイオードから伸びている抵抗の接続を見て、まあECB配列のNPNトランジスタかなと決定しました。

LEDですが問題を解くために必要ないので特に考えなくてよいでしょう。 多分NANDの出力にでもつながっていたのでしょう。

そういえば東工5類のAOでこのような問題が出たと聞いたことがあります。 最近の情報系の常識になるべきなのでしょう。

シミュレーション方針1:うおおおん俺はExcel戦士だ

最初、脳筋WindowsマンのぼくはExcelを開き、x方向に論理回路を、y方向に時間をとり、 ベーっと引っ張ってデータをぺっと貼ってシミュレートしようとしました。 ネットリストから想像した論理回路はこの時点で実装されました。 その後、Pythonのコードを読み始めたところ、素直に何かのコードに起こしたほうが楽やなって なったのでこの方法は流れてしまいました。ジャバーッ

シミュレーション方針2:Python書けねぇ

降ってきたぱいてょんのコードを元に、C言語でぱぱっと書きました。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

char c = '@', flag[334];
int x1, x2, x3, x4, x5, x6, DA, DB, FF1, FF2;

static inline int nor(int a, int b){
    return !(a | b);
}

void set_FF(void){
    FF1 = DA;
    FF2 = DB;
}

void set_gpio(void){
    int nor_out1 = nor(DA, !FF2);
    int nor_out2 = nor(nor_out1, !FF1);
    int nor_out3 = nor(DB, FF2);
    int nor_out4 = nor(!FF2, !FF1);
    int nor_out5 = nor(nor_out4, !FF1);
    int nor_out6 = nor(!FF2, nor_out4);
    int nor_out7 = nor(nor_out5, nor_out6);
    x1 = nor_out7;
    x2 = nor_out3;
    x3 = nor_out2;
    x4 = nor_out1;
    x5 = FF2;
    x6 = FF1;
}

char encoder(void){
    set_gpio();
    char v = x1;
    v = 2 * v + x2;
    v = 2 * v + x3;
    v = 2 * v + x4;
    v = 2 * v + x5;
    v = 2 * v + x6;
    return v;
}

int main(void){

    for(int i = 0; i < 10; i++){
        if(c == 'Y'){
            DA = false;
            DB = true;
        }else{
            if((i & 1) == 0)DA = false;
            else DA = true;
            if((i & 2) == 0)DB = false;
            else DB = true;
        }

        c = encoder() + 32;
        flag[i * 2] = c;

        set_FF();

        flag[i * 2 + 1] = encoder() + 32;
    }

    printf("The flag is SECCON{%s}", flag);

}

頭悪そう。

FFのナンバリングはIC内のナンバリングに対応しています。 NORは左上にあるほど番号が若くなっています。 先に来ているのが基本的に左側のダイオード入力(なはず)です。

で、実行すると

The flag is SECCON{PPP9)&"KGPP9)&"KGPP9}

よしもらったぁッ!

>>>Incorrect<<<

ンゴオオオオオオオオオオオオオオオオ

この後、頭を抱えて1時間がすぎ、無事終了を迎えましたとさ。

ちなみに間違えはset_GPIO関数の後半部分で、以下のように直すと正しい答えが得られます

x6 = nor_out7;
x5 = nor_out3;
x4 = nor_out2;
x3 = nor_out1;
x2 = FF2;
x1 = FF1;

noob...

おわりに

2015年12月3日木曜日

coinsLTで発表したよ!

はじめに

coinsLT#11で発表してきましたのでいろいろな報告込で書こうと思いました。

雑用した

12月2日にcoinsLT#11が無事に行われました。 本来なら2038年に行われる予定でしたが、ぼくが先生に書類を書いて頂いてもらいに行ったり、 機材を持ってる人に「動員してくれ~」って頼みに行ったり、 発表者募ったり、宣伝してもらったりしたせいで23年ほど早めてしまいました。

後述の理由も込みで、近いうちにLTのやり方をマニュアル的な感じでまとめたいと思います。

発表した

発表してきました。自慢話とロボコンのシロウトがやりがちなミスをまとめたLTになっています。

coinsLTのこれから

さて、coinsLT#11ですが、けっして盛況だったわけではありませんでした。 実は中継越しに見ている人を込むと前回並みだったんではないかと僕は密かに思っているのですが、 その場に来てくれた聴衆の減り方を見ると、全学的なLTブームの終焉を感じ、これはこれで腑に落ちる部分もあります。 また、発表者の半数が半固定的になってきたのも含め、新鮮味に欠けて来た感じもあります。 つまり、最初我々が楽しんでいた遊び場は寂れ、半ば見飽きたものになってしまったわけです。

以上を鑑みて、coinsLTは基本的に次回以降を考えておりません。

まあただ、本当に新しくLTをやりたい人と聞きたい人が集まってしまった場合はやらざるを得なくなるかもしれません。 その時のために一応今回までぼくがどうやってcoinsLTをセッティングしたかくらいはまとめておこうかと思います。 自分でセッティングしちゃうかもしれないけどね。

おわりに

そういえば明日全学LTだそうですね。 誰が発表するんだろ。

追記:上のスライドで紹介してた「相締め」の正式名称がわかりました。どうも「ダブルナット」というそうです。もっとかっこいい名前をつけて欲しかった。

2015年12月1日火曜日

coinsLT(coins Advent Calendar 2015 - Adventarの1日目)

はじめに

これはcoins Advent Calendar 2015 - Adventarの1日目の記事です。

宣伝を書きます。

宣伝

12月2日にcoinsLT #11をやります!!!みんな来てね!!!

タイムテーブル?今からタイトル回収しに行きます!ごめんちw

ぼくですか?

coinsLTとは

LTとは5分間のショートプレゼンでいかに語りたいことを熱く語れるか争う競技です。 coinsとついているので内容はcoinsに関係があったりなかったりすることになっています。 coinsの人も発表してるしcoinsでない人も発表してます。 14年の6月に記念すべき0回目が行われましたが、 今回はついに11回目の開催となりました。雑用担当としては楽しい限りでしゅ。

そういえば続けていくつもりがあるならそろそろ後輩とっ捕まえてやり方を教えて雑用させたいですね。

余談:coins Advent Calendar 2015作ったンゴね

みんな書いてってくれよな

おわりに

やったぜ

修正報告

coinsLTの初回は#1じゃなくて#0でちた。すまんのw