改め Objective Technician

はぐれ技術者のやりたい放題

略すと他の意味と紛らわしいネットワーク用語集

2010-09-30 22:30:42 | 勉強
DNS
 Domain Name System:ホスト名とIPアドレスとを対応付ける仕組み
 Did Not Start:レースを棄権すること


ATM
 Asynchronous Transfer Mode:データを53バイト固定長パケットに分割して通信を多重化するプロトコル
 Automated Teller Machine:現金自動預け払い機
 atm:圧力の単位


PVC
 Permanent Virtual Circuit:接続先を固定してパケット通信をすることで専用線みたいなことをする方式
 PolyVinyl Chloride:ポリ塩化ビニル
 Pole Vault Club:佐沼にあるよね!


RSVP
 Resource reSerVation Protocol:ネットワーク資源を予約してリアルタイム通信の品質を確保するプロトコル
 Rapid Serial Visual Presentation:視覚研究で、文字や図形を数10msオーダーで入れ替えながら連続短時間呈示する実験パラダイム


POP
 Post Office Protocol:メールを受信するプロトコル
 pop:スタックやキューから要素を取り出すこと


CA
 Certificate Authority:公開鍵を登録、ディジタル証明書を発行する認証局
 Cabin Attendant:正しくはFlight Attendant
 Cellular Automaton:格子状セルでいろんなシミュレーションをするためのモデル


AS
 Autonomous System:共通のポリシーで運用されるネットワークの集合、自律分散システム
 Asperger Syndrome:アスペルガー症候群


IR
 Investor Relations:企業が投資家に情報を開示する活動
 Instruction Register:フェッチした命令を保持するレジスタ
 InfraRed:赤外線

今頃になってシーズン開幕

2010-09-29 22:37:38 | 陸上競技
今後の出場予定競技会。

10/3 世田谷区選手権 100m
10 北区選手権 100m, 200m
11 関東学連秋季オープン 100m
16 日体大競技会 100m



昨日、転入届を出しに役所に行ったら今年の全日中の垂幕があった。

いつからそんなに強豪になったんだこの市は。







ここにはなんと24時間いつでもフリーで走れる400mタータントラックがあるので練習環境には不自由しない。しかも図書館の近く。


さぁまずは4日後。

バイバイ仙台!

2010-09-28 23:56:11 | ムダ話
無事に修了できました。


学位授与式のあと引越しをした。



なんと言うかもうモノが多すぎる。本やノートだけでダンボール12箱(非活字も含む)。あとはサーバ機やら電子ピアノやらヨーヨーバッグ×3やら。
今度新しい家に住むときはモノを極限まで減らして部屋を広く使おうと心に決めた。





ここ数ヶ月の間、練習でY教さんやN野くんと走ったり、バイトで知り合った工大陸上部の人と練習したり、飲み会や連日のバイトなどでまたいい思い出ができた。

就活中の病んでいた時期がウソみたいだ。





あと野球が好きになった。

最後にスタッフではなく観客としてKスタへ。











思い出してみれば、これまですごい数の人にお世話になった。

また行こう仙台。




べっ、別に仙台が恋しいとかじゃないんだから!

楽天イーグルスの応援に行きたいだけなんだからね!

WiiリモコンでSDの反応時間測定

2010-09-15 19:16:33 | 陸上競技
久しぶりのWiiリモコンネタ。



あまりにも秋晴れのいい天気だったので、今日くらいは図書館に引きこもるのをやめて、宮城野使えないしサイクリングを兼ねて利府に行った。



前からやろうと思っていた、Wiiリモコンでスタブロからの反応時間を測るのを実際にやってみた。





左足首に巻いてるのがWiiリモコン。Bluetooth接続で、(プログラム上)10[ms]毎に加速度の大きさを三軸方向まとめて記録。

いつもどおりActionScript3.0からWiiFlash0.4.5を使っている。


結果は下図。





これを見る限り、60[ms]付近で反応できてしまっている…。



と思ってビデオをよく見直したら、タイマーの進みが明らかに遅い。

手元のストップウォッチと比べると、約15.7秒で向こうは5.0秒しか進んでない。

ということは上の図の横軸は、15.7/5.0 = 3.14 倍した数値が正しい値(別に狙ってやったんじゃない)。


なので、左足が動き出した時間は 60×3.1 = 180 [ms]。



ちょっと遅い。




国際大会でよく出てくるReactionTimeのアレはスタブロにかかる圧力を測って閾値より上か下かを見てるらしい。それと今回の測定方法で結果がどう違うかはやってみないと分からないけど、力と加速度だから時間差はほとんどないはず。


それよりもActionScriptの時間制御がテキトーだということをもっと考えてソースを書くべきだった。

タイマー呼び出しのとこがまずかった。100Hzであの処理はムリだ。









そのあとは利府のトラックを独り占めしてだばだばと走りまわってた。



平日の昼間にまったくどこのニートだよ

ハッカーと画家

2010-09-14 23:57:15 | ムダ話
だいぶ日が空いてしまったけれど。




送別会を開いていただきました。



これまでほとんどこういう場に参加してきませんでしたが、今更ながら、飲み会という場、というかそもそも人と話をすることの意義のようなものを理解しつつあります。








就活のとき、ある会社の社長が「仕事に満足しているかと聞かれてYESと答えるようではダメだ」みたいな話をしていたのを思い出した。





人付き合いがヘタだというのは痛いほど自覚してるけど、なるほどこういう場でそういう話をすればいいのかとひとつ学習した。








それにしても会話そのものについてはたとえ語学を身に付けたところで結局同じことになるのはたぶん明らかなので、こういう動き(にったち製作所、新入社員は海外赴任が前提)もあることだし、さぁどうしようかと思ってるところでピッタリの本をプレゼントしてもらった。









これで留学先でたっぷり勉強してこようw





そして「ハッカーと画家」を今日読み終わった。


こんな良書を教えてくれて本当に感謝。

情報の勉強をしてきながらこれを読んでなかった自分はモグリである。

どの章も非常に刺激的だけど2章、3章、6章、特に7章が秀逸。


これから技術者として働くにあたって、バイブルとしていつも手元に置いておこうと思う。




というか著者にここまで言われたらもうLispに手を出すしかないじゃないか。






あとはF澤くんの太ももや胸に触れたので大満足でした。


SQLで素数サーチ

2010-09-10 00:44:31 | プログラミング
「割り切る数が存在しない」ことをEXISTS述語で表現する


自然数を,順序のない単なる数の集合として扱うところがいかにもSQLらしい.

import sqlite3

db = sqlite3.connect(":memory:");
c = db.cursor();

c.execute("CREATE TABLE Digits(n)");
c.executemany("INSERT INTO Digits VALUES(?)", [
    (0,), (1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), (9,),
]);

numbers = "SELECT D1.n + 10 * D2.n AS n \
             FROM Digits D1 CROSS JOIN Digits D2";
c.execute("CREATE VIEW Numbers AS " + numbers);

divisor = "(SELECT * \
              FROM Numbers Divisor \
             WHERE Divisor.n <= Dividend.n / 2 \
AND Divisor.n != 1 \ AND Dividend.n % Divisor.n = 0)"; primeNumber = "SELECT n AS primeNumber \ FROM Numbers Dividend \ WHERE n > 1 \ AND NOT EXISTS " + divisor; c.execute(primeNumber + "order by primeNumber"); for row in c: print(row); c.close(); db.close();















Python だと1行で書けるけどな!
print([p for p in range(2, 100) if [1 for d in range(2, 1 + p // 2) if p % d == 0] == []]);

自己非等価結合2

2010-09-02 19:20:14 | プログラミング
自分メモ.




メディアンを求めるSQL.




母集合を上位と下位の2つの部分集合に分けて,その共通部分を探す.という考え方だとエレガントに書ける.

自己結合とCASE式,HAVING句の合わせ技.


import sqlite3

db = sqlite3.connect(":memory:");
c = db.cursor();

c.execute("CREATE TABLE 名簿(名前, 収入)");
c.executemany("INSERT INTO 名簿 VALUES(?, ?)", [
    ("A", 400),
    ("B", 30),
    ("C", 20),
    ("D", 20),
    ("E", 20),
    ("F", 15),
    ("G", 15),
    ("H", 10),
    ("I", 10),
    ("J", 10),
]);


sql = "SELECT org.収入 AS median FROM 名簿 org, 名簿 cp 
        GROUP BY org.収入 
       HAVING SUM(CASE WHEN cp.収入 >= org.収入 THEN 1 ELSE 0 END) >= COUNT(*) / 2 
          AND SUM(CASE WHEN cp.収入 <= org.収入 THEN 1 ELSE 0 END) >= COUNT(*) / 2";

c.execute("SELECT AVG(DISTINCT median) FROM (" + sql + ")");

for row in c:
    print(row);

c.close();
db.close();




結果は 17.5.





これを全く同じ考え方でPythonで書くとこんな感じになる.


Python組込みのset型を使った集合演算とリスト内包表記で4行.


income = {("A", 400),
          ("B", 30),
          ("C", 20),
          ("D", 20),
          ("E", 20),
          ("F", 15),
          ("G", 15),
          ("H", 10),
          ("I", 10),
          ("J", 10)
};


s0 = set([org for org in income if len([1 for cp in income if cp[1] >= org[1]]) >= len(income) / 2]);
s1 = set([org for org in income if len([1 for cp in income if cp[1] <= org[1]]) >= len(income) / 2]);

median = set([v[1] for v in s0.intersection(s1)]);

print(sum(median) / len(median));




















ちなみに,極めて素朴な方法で手続き的にメディアンを求めるPythonコードはこんな.

s = [org[1] for org in income];
s.sort();

idx = len(s) // 2;
print((s[idx] + s[idx - 1 + (len(s) % 2)]) / 2);








自己非等値結合

2010-09-01 18:29:39 | プログラミング
SQL自分メモ




例えば記録に基づく順位表を作るときに,同記録の人を同順位として次の順位は飛び石にするケース.


下はPythonからSQLite3を使った場合の例.


import sqlite3

db = sqlite3.connect(":memory:");
c = db.cursor();

c.execute("CREATE TABLE 走高跳(記録, 名前)");
c.executemany("INSERT INTO 走高跳 VALUES(?, ?)", [
    (1.98, "tatsushi"),
    (1.85, "tatsushi"),
    (1.90, "ok"),
    (1.85, "ok"),
    (1.85, "ok"),
    (1.85, "ok"),
    (1.80, "ok"),
    (1.80, "ok"),
    (1.80, "ok"),
    (1.86, "F"),
    (1.80, "F"),
    (1.80, "masato"),
    (1.80, "masato"),
    (1.75, "masato"),
    (1.75, "masato"),
    (1.75, "masato"),
    (1.60, "showhey"),
    (1.50, "sbt"),
    (1.35, "ed"),
]);

sql = "SELECT  (SELECT COUNT(記録) FROM 走高跳 WHERE 記録 > cp.記録) + 1 AS rank, \
               記録, \
               名前 \
         FROM  走高跳 cp \
        ORDER BY rank";

c.execute(sql);

for row in c:
    print(row);

c.close();
db.close();




実行結果

1 1.98 tatsushi
2 1.9 ok
3 1.86 F
4 1.85 tatsushi
4 1.85 ok
4 1.85 ok
4 1.85 ok
8 1.8 ok
8 1.8 ok
8 1.8 ok
8 1.8 F
8 1.8 masato
8 1.8 masato
14 1.75 masato
14 1.75 masato
14 1.75 masato
17 1.6 showhey
18 1.5 sbt
19 1.35 ed




このSQL文がミソ↓.
sql = "SELECT  (SELECT COUNT(記録) FROM 走高跳 WHERE 記録 > cp.記録) + 1 AS rank, \
               記録, \
               名前 \
         FROM  走高跳 cp \
        ORDER BY rank";




こういう集合指向的な書き方には萌えますなぁ.


再帰集合を使う "SELECT COUNT(記録) FROM 走高跳 WHERE 記録 > cp.記録" の部分とか,これだけでご飯三杯いける.





SQLを書くときは,Cみたいな手続き型言語の世界とは違う思考に頭を切り替えないといけない.


staticな書き方をする関数型言語MLの考え方と根っこが共通している.