Author Archive: hiratake55

ギリシャ文字のチートシート (一覧表) を作った

greek.png
英語表記も入れてあるので、Tex や プログラムの変数名も間違えずに書けますね。
Greek Letters Cheat Sheet (PDF)
念のためライセンスですが、Creative Commons – 表示 2.1 日本 としておきます。

ふたたびの高校数学
ふたたびの高校数学
posted with amazlet at 16.08.26
永野 裕之
すばる舎 (2016-08-23)
売り上げランキング: 2,892

JavaScript で逆行列と行列式の値を求める

JavaScript で逆行列と行列式の値を求める
逆行列と行列式の値を求める C のソースをブラウザ上から実行できるよう、JavaScript で書きなおしたもの。

以前、行列式の値の求め方、逆行列の作り方の C 言語プログラム | BlueSky Lab. というプログラムを公開したのですが、最近になって再び話題になったので、今度はコンパイラ不要で Web ブラウザ上から実行できるよう、JavaScript で書き直しました。
工学部や理学部の 1 年生がこの時期に必ず習うものですね。
逆行列も行列式の値も、画像処理やパターン認識などでよく利用されるものなので、JavaScript より C で公開したほうが価値があるのですが、デモのときにはやはり JavaScript のほうが勝ります。

APU へ行ってた

今日は、某研究関係の用事で別府の APU 立命館アジア太平洋大学に行ってた。
学生なのに出張で地元に帰るとか、考えたこともなかった。
20081201135805
キャンパスがとてもインターナショナルな雰囲気。
20081201132536
講義棟とか事務局とか。ポールからぶら下がっている旗を見てテーマパークかと思った。
20081201134008
標高が高いから眺めもよい。寒くて風が強いけど。
20081201125222
ジャークチキン。留学生が多いので、食堂のメニューも多国籍。
宗教上の理由で肉が食べれない人でも大丈夫なように、配慮している、らしい。ハラルっていうのかな。
今まで、国立や私立の大学を訪問したなかでも、APU だけは他とは全く違った雰囲気だった。
設備や環境はもちろんだけど、オフィスの方とお話した印象が全くビジネスマンだったので驚かされた。

地方国立大、情報系学生の就活のしかた

最近、毎日のように後輩から就活の仕方を聞かれてて、同じことをいちいち答えるのが面倒臭いし、常識もないようなアホとかもいて疲れるから、少し参考になればと思ってアップしておく。

ちなみに、私は大学院に進学するけど、実は元々就職する予定で某大手 SIer にほぼ内定してたんですよ。(実際には、大学院へのオファーが来る少し前で、内定出すから推薦書出して、って流れになったので辞退した。)

就活の仕方には、学校や学部ごとに違う点が多々あるので、あくまで地方国立大、情報系学科男子、ソフトウェア・IT・情報通信関連志望の場合と思って読めばよいです。できるだけ主観的にならないように、基本的なことをまとめてみた。予算がなかったので、たくさん企業を受けたわけじゃないけど、知ってる限りで書く。あくまで体験談です。

就活のしかた プレゼン版もあります。

企業研究とか

  • どういう会社があるかは、前年や前々年の学科の先輩の就職先を見ればわかる。
  • 大学に説明会に来る企業、求人票がきている企業は狙われている訳なので受かりやすい。
  • 求人票や先輩の就職先は、多くの場合、学内の Web や学科で公開している。
  • 会社の上下関係とか横のつながりとか重要だったりする。
    • デンソーはトヨタの車の部品作ってる会社、とか。
    • アイシン AW はアイシンの子会社だけど実は親会社と同じくらい大きな規模、とか。
    • 電通国際情報サービスは電通の子会社というより分社化された電通の IT 部門、とか。
    • ヤフーはソフトバンクグループとか、JR と日立は仲良しとか。
    • 富士通○○○、とか富士通○○○□□□、とか NTT ○○○とか NTT ○○○□□□とか。
  • 外資やベンチャーはどちらかといえば何でもありな雰囲気、地銀や元国営企業などはどちらかといえば保守的な雰囲気。
  • 説明会では、自分の会社の良いところしか言わないし、都合の悪いところは上手に説明するので安易に騙されないように注意。
    • 残業代が出ません、とか、実は住居手当がありません、とか、転勤は全国各地です、とか企業にとって不都合なことは言うわけがない。
  • 企業のトップページ→企業情報/会社案内→採用情報→新卒 のところに採用条件や募集要項はほぼ必ず載ってるので目を通す。
  • 大事なことは、自分にとっても会社にとっても、ぴったりな会社を見つけること、だと思う。

推薦応募と自由応募

  • 推薦: 教授の推薦状を提出するので、内定が出やすいし、面接回数も少なく決まる場合が多い。基本的に学科・学部あてに求人票が来ている企業。ただし、内定が決まったら辞退することはできないし、当然、同時に受けることができる会社は 1 人 1 社まで。
  • 自由: ナビや Web からエントリーする。求人票が来ていない企業でもエントリーできる。内定後に辞退することもできる。
  • 自由で応募して、途中から推薦に切り替えることも可能。
    • 会社から推薦状を持ってくるように言われる場合も。(内定後に逃げられるのを防ぐため)

服装とかバッグとか髪型とか (男性の場合)

  • 当たり前だけど、黒または濃いグレーのスーツ、白無地のカッターシャツ。
  • スーツの一番下のボタンは移動中とかは外していても、面接中は必ず留めておく。
  • ベルトと靴の色は黒で統一するのがビジネスマナー。
  • シャツはスーツの袖から 1cm くらい見える感じで。
  • 腕時計はつけたほうがいいけど、つけなくてもいい。G-SHOCK とか、安物のスポーツウォッチをつけるくらいならつけないほうがいい。
  • 靴下は黒や紺。白の靴下とか中学生ですか。スニーカーソックスとか何考えてるんですか。
  • 赤のネクタイは挑戦的、青のネクタイは知的に見えるとか。
    • 金融関連では黒のネクタイを避けたほうがいいとか。
  • バッグは A4 の書類が折り曲げずに入るサイズがちょうどよい。
    • 説明会とかで会社案内とかパンフ・資料・ノベルティーなどを大量に渡される。
    • あと、地面に置いたとき、まっすぐ立つタイプのものがスマートなのでよい。
  • 髪型は当然短めで清潔に。
    • 美容院で「就活しているので短めにお願いします」といっておけば、美容師がハイパー級のチャラ男とかでない限り、おそらくそれなりの髪型にしてくれる。
    • 美容院じゃなくても、お爺さんが 1 人でやっているような床屋でもたぶん大丈夫。
  • 女性の場合はまたいろいろあるらしい。あまり詳しくないので割愛。

メールの送り方

  • 就活関係は全てパソコンのメール。間違っても絶対に携帯から送らない。
  • 主に、企業の採用担当や、就職担当の教授、OB 宛てに送る機会などが挙げられる。
  • 特に事情のない限り大学のアドレス (***@***.ac.jp) を使う。
  • パソコンのメールをタイムリーに確認する文化がない人は、可能であれば携帯に転送設定しておく。
  • 件名は具体的に。空にせずに絶対書く。スパム判定されても知らない。
  • 受信したときに表示される送信者の名前のところにも自分の名前が表示されるよう設定しておく。
  • 明らかに機械的に送信されたメールは返信する必要はないけど、明らかに手作業で送られたメールには返信を書く。
  • 敬称は会社には「御中」、人には「様」、先生には「先生」。
  • 例えば、こんな感じで。

    ○○株式会社 ○○部 ○○○係 ○○○○様
    はじめまして、私は○○大学○学部○○学科の○○○○です。

    -本文-

    それでは、どうぞよろしくお願いいたします。


    ○○大学○学部○○学科 ○○○○
    ***@***.ac.jp 000-0000-0000

会社説明会 /OB 訪問 (第 1 段階)

  • 合同説明会が 11 月頃から始まる。学校に来たり、会場(ドームやイベント会場)へ出向いたり。
  • 会場へ出向くものは「私服でお越しください」と書いてあってもみんなスーツで来るので恥をさらさないように。
  • 平日に行う場合もあるけど、基本的に授業優先。
  • 質疑応答の時間があるので、いくつか質問を用意しておくとよい。
    • 選考方法、勤務地、職種など。
    • 学生が大勢いる中で質問するときは所属と名前を名乗る。
    • 「○○大学の○○です。本日は貴重なお話ありがとうございました。○○の点について…」
  • 会社によっては OB 訪問やリクルーター訪問で担当の方と仲良くなっておくことがすごく重要だったりする。
  • 1 社だけで行う通常の会社説明会は実際、ES 記入や適性検査を兼ねている場合が多いので選考も兼ねているので注意。

履歴書とか ES (エントリーシート) とか (第 2 段階)

  • エントリー = 入社したいです、試験受けます、という意思表示。まあ願書みたいなもの。
  • 市販の履歴書は使わず、大学のものを使う。
  • 封筒に入れて持って行き、封筒から出して手渡す。
  • 証明写真がスピード写真とかありえない。写真屋で撮ってもらう。
    • 僕はお金がもったいないので、三脚+デジカメで撮って Photoshop で補正したのを印刷した。
    • ニキビとか熱の花とかアホ毛なんかは簡単に消せる。
  • 趣味・特技は、なんでもいいから絶対書くけど、読書とか旅行とか音楽鑑賞とかつまんないこと書かない。
  • 資格は、基本情報技術者とか TOEIC とか。
    • TOEIC は大学生の平均が 430 点だから、それ以上なら書くべき、と誰かが言ってた。
    • 運転免許すら持っていないどうしようもない人は、「基本情報技術者の取得に向けて勉強中です」などと書いておけば、何も書かないよりはマシだと思う。
    • 情報系に限っては基本情報やソフ開など IPA 系の資格を持っていると必ず有利になる。
  • 必ずといっていいほど聞かれる内容は、一度書いたら使いまわすためにパソコンに保存しておくし、内容も憶えておく。
    • 「当社の志望動機」
    • 「この業界/職種を志望した理由」
    • 「自己 PR」
    • 「研究テーマ」
    • 「学生時代に頑張ったこと」
    • 「入社してから実現したいこと」
    • 「興味のある事業とその理由」
  • 1 つの文にだらだらと書くのではなく、適度に文章を区切る。
  • 一人称は男の子でも女の子でも「私」。
  • 文字数カウントは Word 2007 が便利。選択した部分の文字数が画面下に表示されるから。
  • ES や履歴書の例文集などは本屋に売ってあるので一度は読んでおくべき。

Web テスト・適性検査 (第 3 段階)

  • SPI と呼ばれるテスト。企業によってバラバラだけど、多くは一般教養や読解力、論理的思考力などを検査するもの。制限時間があるので注意する。
  • 意図的に必要以上に難易度の高いものにしている場合もある。有名なところでは、マイクロソフトや KNT が採用している TG-WEB とか。
  • 必ずといっていいほど最後に意味のわからないアンケートが大量にあるけど、それらは性格判断 (リーダーシップ性、協調性、厳しさ、優しさなど) やメンタルヘルスのチェック (うつ傾向や人格障害などがないかの検査) を行うもの。
    • 希望の職種に向いている性格かどうか把握できるので、普通に答えていれば問題ないと思われる。
  • しかしながら、多くの場合は適性検査は単なる足切りにすぎず、最も重視されるのは面接なので、必要以上に頑張る必要はない。

面接 (第 4 段階)

  • グループ面接、1対1での面接、複数の面接官による面接、リクルーター面接、などと会社によって形態はさまざま。
  • 雑談に近いような感じの面接から圧迫面接まで雰囲気もさまざま。
  • 面接官も人事の方だったり、エンジニアの方だったり、役員だったり。
  • 一般的には、人事面接→技術面接→役員面接→内定の順で進む。
  • あらかじめ、質問されるであろう内容には、想定問答集みたいなのを作って何でも答えられるようにしておく。
    • 志望理由、自己 PR、研究テーマ、大学生活で頑張ったこと、入社後の抱負など。
  • 質問したい内容もいくつか用意しておく。
    • 入社後のこと、実際の仕事の内容とか。
  • 姿勢正しく、目を大きく開いて、前を向いて、堂々と話す、時には少し笑みを浮かべる。4 秒以上沈黙しない。とにかく好印象を持ってもらう。
  • きちんと受け答えできるか、まともに話ができるか、を評価されている。
  • 受験番号的な ユーザー ID はメモしておいていつでも出せるようにしておく。
  • 学部生で名刺を作っている人は周りにはいなかったけど、もし、面接官やリクルーターから名刺を頂く際は両手で受取り、名前を読んで確認して、机の上に置いておく。帰るときにそっとしまう。

その他の選考方法

  • グループワーク
  • グループディスカッション
  • プレゼン面接
  • 一発芸的な何か
  • 英語面接
  • 外資系企業や一流企業、特殊な職種になるほど変わった選考が多い気がする。

移動とか

  • 合同説明会とかは自由だけど、面接や予約した説明会には必ず公共の交通機関。常識。
    • 宇部→博多だと高速バスが一番安くて早い。けど要予約。
    • 宇部→東京だと飛行機が一番安くて早い。けど要予約。
    • 面接に自動車で行くとかどこの田舎者ですか。
  • 集合場所にはどんなに遅くても 10 分前には着く。30 分前でも誰かいる。
  • 交通費はだいたい 2 次面接から会社が負担してくれる。
  • メールや Web の内容は必ず印刷して持っていく。
    • 僕は Gmail にすべてのメールを転送させて、無くした場合でも携帯から一発検索で取り出せるようにしてた。
    • 特に、担当者の名前とかビルの号室とか集合時間とか受験番号とか忘れたら困るから。
  • 道に迷わないように、周辺の地図を印刷して持っていくとか、GPS ケータイなどを使う。
  • 遅れそうな場合は事前に電話で連絡する。
  • 意外と汗をかくので必ず事前に洗顔したり、ハンカチを持っていく。
  • 東京や大阪に行くことが多いなら Suica や ICOCA を買っておくと便利。
  • 面接の前にラーメンとか食べない。

正直、何がウケるのか

  • 部活・サークルに入ってた、とかが無難で一番ウケがいい。
    • 体育会系は確実にウケが良い。キャプテンとか部長とか役員をしていたら、最高に良い。
    • 体育会系 = 人並み以上の体力と精神力、チームワークがあると思われる。
    • 役員経験 = イベントの計画や人付き合いなど、仕事を効率的にこなせると思われる。
  • バイトの経験
    • 接客をしてて、笑顔で振る舞うようにしたら、お客さんからの評判が良くなって、嬉しかった、とか。
    • 力仕事をしてたので、体力には自信があるとか。
    • 毎日休まずに授業とバイトと両立させたので、就職後も毎日規則正しく仕事できる、とか。
  • 留学・海外経験
    • 英語圏じゃなくても OK。
    • 今までとは違った文化に触れて、世界を舞台に働くことに興味を持った、とか。
    • 渡航したことはなくとも、留学生と触れ合ったというだけでもネタになる。
    • 事業を国際展開している会社ほど効果的な気がする。
  • 研究の話
    • 配属される研究室での研究が就職した後で御社の事業に生かせる、とか。
    • 研究開発や技術職を志望しているなら特に。
  • 学部 3 年生はまだ研究室に配属されてないし研究テーマとか決まってない
    • 配属希望の研究室の研究テーマとか学生実験で行ったことを言えばいい。
    • 研究内容は研究室の WEB に載ってる。
    • 研究の背景 (なぜこの研究を行うに至ったか) と研究計画 (どんな理論が使われるか、どんな手順で進めるか)、それによって社会へもたらす効果 (今までは○○だったことが△△になって便利な世の中になる) を言えればほぼ合格。
    • 学生実験でも、話し方次第では卒論レベルの研究になる。
  • サークルにも入ってないし、バイトもしてなかった、研究とか論外って人は…
    • 例えば、仮に 1 年間でもサークルに入ってたら、それをネタにすればよい。
    • 辞めたとか途中から入ったとか言わなければいい。苦労したこととか、達成感をあげたこととか、吸いだせば沢山あるはず。
    • 部員数が 3 人のサークルとかでも、他のキャンパスや他大学と一緒にやってたら、その一番多かった時期の合計の人数を言えばいい。
    • 1日でもバイトしてたら、そこで得たものや感じたことを言えばいい。 1 日でやめたとか言わなければよい。
    • 本当にサークルやバイトもしてなくても、勉強や実験・実習はしたんじゃないかな。
    • なんでもいいから何か自分のウリになるネタを見つけて、それをいかに上手に説明できるか。
    • 0 を 100 にするのはアウトだけど、1 を 100 にするのは工夫次第。
    • 説明会だって同じ。残業が多いとかわざわざ言わない。少しでもプラスになるところがあったらそれをよりプラスに説明できるかが勝負。
  • 触れてはいけない内容もあるので注意したい。
    • 居酒屋・キャバクラ・ホストなどのバイト→学生としてふさわしくないから。
    • 建設業・港湾関係の派遣バイト→建設・港湾関連の派遣は労働者派遣法違反。
    • パチンコ・パチスロ店でのバイト→そもそも賭博自体が違法行為。摘発されないのが異常。
    • でも、飲食店でホールの接客をしていました、とか、イベント会場で設営のバイトをしていました、などと拡大解釈して説明すれば全然問題なかったりするから、言葉を選べば全く問題ない。
    • 恋愛とか→論外。触れることすら NG。学生の視点からみた恋愛と社会人の視点から見た恋愛は同一にしてはいけないという理由で。

情報源

  • リクナビマイナビ・○○ナビ
    • 適職診断、会社検索、プレエントリー、エントリー、合同説明会、会社説明会などすべてを仲介してくれる用心棒であり、就活に不可欠な存在。
    • ほとんどの場合、リクナビとマイナビのどちらかまたは両方に希望の会社が掲載されている。たまに日経ナビとか。
    • なので、リクナビとマイナビの両方に登録しておけば多くの場合問題ない。
    • 10 月から登録できるようになっているのでなるべく早く登録するべき。
  • 2ch 就活板
    • 裏事情とかくだらないランキングとか。
    • 嘘もたくさん書かれているので、全部嘘だと思って読めば問題ない。
  • みんしゅう(みんなの就職日記)
    • 試験内容とか詳細にバラしてくれる人がたくさんいるので非常に参考になる。
  • 先輩に聞く
    • 結局、これが一番かも。
    • でも、人それぞれ考え方が偏ってたり、考えが偏った先輩もいるからたった一人の意見を鵜呑みにするのは危険。
    • 同様に、学者一本で生きてきて社会を全く知らないような大学教授が偉そうに、「就活は全員推薦で受ければよい。だから就活はしなくてよい。大学の勉強だけしておけばよい。」などとふざけたことを平気で言うのも鵜呑みにしてはいけない。
    • 最終的な判断は自己責任で。
  • 朝日新聞とかは読まなくていいから、情報系なら ITmedia とか、ITPro日経とかを見てたほうが 100 倍勉強になる。

ためになる本とか

  • 頑張って書いたので、参考になったら、ぜひ、下のリンク経由でオススメの就活本を買ってください。
内定者はこう書いた!エントリーシート・履歴書・志望動機・自己 (2009)
坂本 直文
高橋書店
売り上げランキング: 93743
おすすめ度の平均: 2.5

5 後輩にプレゼントしたい!就活本
1 完全版は名ばかり?
2 レイアウトは見やすいけど、極端すぎる!!

 

 

就職四季報 2009年版 (2009)
東洋経済新報社
売り上げランキング: 4839
おすすめ度の平均: 4.5

5 あったほうがいいでしょ
5 企業選びにはこれ!
3 データが多少貧弱
5 企業の雇用条件をチェック!
4 就職活動必需品

 

必勝・就職試験! 【玉手箱対策用】8割が落とされる「Webテスト」完全突破法【1】 2009年度版
SPIノートの会
洋泉社
売り上げランキング: 13303
おすすめ度の平均: 5.0

5 出題傾向を掴むには良書
5 某外資証券会社で玉手箱の超ハイレベル版出ました

 

この業界・企業でこの「採用テスト」が使われている! 2010年度版
SPIノートの会
洋泉社
売り上げランキング: 847
おすすめ度の平均: 5.0

5 便利な情報
5 筆記対策の1冊目
5 1200社の筆記情報

 

就活のやり方[いつ・何を・どう?]ぜんぶ![2010年度版] (就職の王道BOOKS 3) (就職の王道BOOKS 3)
就職情報研究会
実務教育出版
売り上げランキング: 235830
おすすめ度の平均: 4.0

4 就活の全体像

 

会社四季報業界地図 (2009年版)
東洋経済新報社
東洋経済新報社
売り上げランキング: 28360
おすすめ度の平均: 4.0

4 地図というよりは羅針盤

 

 

わがSE人生に一片の悔いなし (技評SE新書 16)
清水 吉男
技術評論社
売り上げランキング: 13633
おすすめ度の平均: 4.0

4 共感できるSE人生です

 

SEのためのうつ回避マニュアル 壊れていくSE
株式会社ピースマインド 田中 貴世 渡辺 眞里子 石川 賀奈美
翔泳社
売り上げランキング: 25559
おすすめ度の平均: 5.0

5 実践的な内容で参考になりました
5 うまくいかないときは
5 タイトルにドキっとして

 

こんなSEはいらない!
こんなSEはいらない!

posted with amazlet at 08.11.03
岩井 孝夫
日経BP社
売り上げランキング: 125184

「宅配便の配達状況 API」が 雑誌 Web Creators に掲載されました

Webデザインとグラフィックの総合情報サイト – MdN Interactive – web creators最新号 – 2008年8月号

宅配便の配達状況 API」が Web デザイナー向け情報誌の「Web Creators 8 月号 (6 月 28 日発売) 」に掲載されました。
P.144 から始まる、「WEB API PROGRAMMING!」という、WEB API とその使い方を紹介する連載内で掲載されています。
記事をかいてくださったのは、なんとウノウの中澤直也氏で、まるまる 1 ページも割いて紹介してくださっています。(中澤氏のブログ Carpe Diem)
ページ下部には「歌詞リーダー」や「Amazon リンク作成」も紹介してくださってます。しかも実名入りだったのでちょっとびっくり。
他には、「お菓子の虜 Web API:お菓子の虜」や、「姓名判断API」が掲載されていました。
「お菓子の虜」はマッシュアップに頼らずすべて自力でデータベース化してて凄いと思う。

Web creators (ウェブクリエイターズ) 2008年 08月号 [雑誌]
インプレスコミュニケーションズ

大学の生協売店にも並んでいたのでなんだか嬉しかった。

行列式の値の求め方、逆行列の作り方の C 言語プログラム

なぜかこの時期に「行列式の値」と「逆行列」を作成するプログラムを毎年書いている気がして、その都度作るのが非常に面倒臭いので、今後も困らないようにアップしておく。
行列式の値の求め方
・2 次の場合
たすきがけで簡単に解ける。

double a[2][2]={{1,2},{4,-1}};
double det=0.0;

det=a[0][0]*a[1][1];
det-=a[0][1]*a[1][0];
printf("%f\n",det); // -> -9.000000

・3 次の場合
サラスの方法で簡単に解ける。

double a[3][3]={{1,8,9},{-3,2,1},{4,1,5}};
double det=0.0;

det=a[0][0]*a[1][1]*a[2][2];
det+=a[1][0]*a[2][1]*a[0][2];
det+=a[2][0]*a[0][1]*a[1][2];
det-=a[2][0]*a[1][1]*a[0][2];
det-=a[1][0]*a[0][1]*a[2][2];
det-=a[0][0]*a[2][1]*a[1][2];
printf("%f\n",det); // -> 62.000000

・4 次以上の場合
通常の計算では 3×3 以下の余因子行列を作成して、符号を掛けた上で足し合わせるやり方を使うと思う。
これをプログラムで実装するには、再帰または多段ループが必要になり計算量も多い。
特に 5 次以降になると面倒。
でも、上三角行列を作って、対角部分 (左上から右下) を掛け合わせれば、簡単に行列式の値を求めることができる。
このやり方だと非常に簡単。

double a[4][4]={{2,-2,4,2},{2,-1,6,3},{3,-2,12,12},{-1,3,-4,4}};
double det=1.0,buf;
int n=4;  //配列の次数
int i,j,k;

//三角行列を作成
for(i=0;i<n;i++){
 for(j=0;j<n;j++){
  if(i<j){
   buf=a[j][i]/a[i][i];
   for(k=0;k<n;k++){
   a[j][k]-=a[i][k]*buf;
   }
  }
 }
}

//対角部分の積
for(i=0;i<n;i++){
 det*=a[i][i];
}

printf("%f\n",det); // -> 120.000000

逆行列の求め方
何といってもやはり掃き出し法が簡単。2 次から n 次まで対応。
掃き出し法の他に、LU 分解で解く方法もあります。

double a[4][4]={{1,2,0,-1},{-1,1,2,0},{2,0,1,1},{1,-2,-1,1}}; //入力用の配列
double inv_a[4][4]; //ここに逆行列が入る
double buf; //一時的なデータを蓄える
int i,j,k; //カウンタ
int n=4;  //配列の次数

//単位行列を作る
for(i=0;i<n;i++){
 for(j=0;j<n;j++){
 inv_a[i][j]=(i==j)?1.0:0.0;
 }
}
//掃き出し法
for(i=0;i<n;i++){
 buf=1/a[i][i];
 for(j=0;j<n;j++){
 a[i][j]*=buf;
 inv_a[i][j]*=buf;
}
for(j=0;j<n;j++){
 if(i!=j){
  buf=a[j][i];
  for(k=0;k<n;k++){
   a[j][k]-=a[i][k]*buf;
   inv_a[j][k]-=inv_a[i][k]*buf;
  }
 }
}
}
//逆行列を出力
for(i=0;i<n;i++){
 for(j=0;j<n;j++){
  printf(" %f",inv_a[i][j]);
 }
 printf("\n");
}

/* 出力
2.000000 2.000000 -1.000000 3.000000
-4.000000 -5.000000 3.000000 -7.000000
3.000000 4.000000 -2.000000 5.000000
-7.000000 -8.000000 5.000000 -11.000000
*/

プログラムは Microsoft Visual Studio 2008 および Fedora 9 の gcc で実行確認済み。
手元に Linux のマシンがなかったので、稼働中の Web サーバを使って動作確認した。

最強最速アルゴリズマー養成講座 プログラミングコンテストTopCoder攻略ガイド
SBクリエイティブ (2013-08-14)
売り上げランキング: 79,620

PEAR::Net_Whois で IP アドレスから国名を調べる関数

アクセス元のホストの国籍を Apache のログからアクセス解析して、って頼まれたけど、どうしたらいいのかわからなくてスクリプトを書いてみた。
いろいろ調べたら、PHP の PEAR::Net_Whois を使えば、Whois 情報を取得できることがわかった。
サーバーに PEAR::Net_SocketPEAR::Net_Whois をインストールする。

$ pear install Net_Socket
$ pear install Net_Whois

でも、$whois->query() を行うときに、検索先の Whois サーバを指定しないといけない。
InterNIC のサイトを見る限り、IP アドレスの第 1 オクテット目ごとに、地域インターネット レジストラ (RIR) が決まっているらしい。(IP アドレスの割り当て状況)
それを参考に IP アドレスから、PEAR::Net_Whois を行う関数を作った。以下の通り。

function getWhoisFromIPAddr($ipaddr){
//Include PEAR::Net_Whois
require_once("Net/Whois.php");
$whois = new Net_Whois;
//Split IPaddr into 4 octets.
preg_match("/^(\d{1,3}).(\d{1,3}).(\d{1,3}).(\d{1,3})(.*)/",$ipaddr,$oct);
//Choose WHOIS server by 1st octet.
if($oct[1]<=40){ $server="whois.arin.net"; }
elseif($oct[1]==41){ $server="whois.afrinic.net"; }
elseif($oct[1]<=57){ $server="whois.arin.net"; }
elseif($oct[1]<=61){ $server="whois.apnic.net"; }
elseif($oct[1]==62){ $server="whois.ripe.net"; }
elseif($oct[1]<=61){ $server="whois.apnic.net"; }
elseif($oct[1]<=76){ $server="whois.arin.net"; }
elseif($oct[1]<=95){ $server="whois.ripe.net"; }
elseif($oct[1]<=113){ $server="whois.arin.net"; }
elseif($oct[1]<=126){ $server="whois.apnic.net"; }
elseif($oct[1]<=132){ $server="whois.arin.net"; }
//  elseif($oct[1]==133){ $server="whois.apnic.net"; }
elseif($oct[1]<=140){ $server="whois.arin.net"; }
elseif($oct[1]==141){ $server="whois.ripe.net"; }
elseif($oct[1]<=144){ $server="whois.arin.net"; }
elseif($oct[1]==145){ $server="whois.ripe.net"; }
elseif($oct[1]<=149){ $server="whois.arin.net"; }
elseif($oct[1]==150){ $server="whois.apnic.net"; }
elseif($oct[1]==151){ $server="whois.ripe.net"; }
elseif($oct[1]==152){ $server="whois.arin.net"; }
elseif($oct[1]==153){ $server="whois.apnic.net"; }
elseif($oct[1]==154){ $server="whois.afrinic.net"; }
elseif($oct[1]<=162){ $server="whois.arin.net"; }
elseif($oct[1]==163){ $server="whois.apnic.net"; }
elseif($oct[1]<=170){ $server="whois.arin.net"; }
elseif($oct[1]<=171){ $server="whois.apnic.net"; }
elseif($oct[1]<=185){ $server="whois.arin.net"; }
elseif($oct[1]<=187){ $server="whois.lacnic.net"; }
elseif($oct[1]<=188){ $server="whois.ripe.net"; }
elseif($oct[1]<=191){ $server="whois.lacnic.net"; }
elseif($oct[1]==192){ $server="whois.arin.net"; }
elseif($oct[1]<=195){ $server="whois.ripe.net"; }
elseif($oct[1]==196){ $server="whois.afrinic.net"; }
elseif($oct[1]<=199){ $server="whois.arin.net"; }
elseif($oct[1]<=201){ $server="whois.lacnic.net"; }
elseif($oct[1]<=203){ $server="whois.apnic.net"; }
elseif($oct[1]<=209){ $server="whois.arin.net"; }
elseif($oct[1]<=211){ $server="whois.apnic.net"; }
elseif($oct[1]<=213){ $server="whois.ripe.net"; }
elseif($oct[1]<=216){ $server="whois.arin.net"; }
elseif($oct[1]<=217){ $server="whois.ripe.net"; }
elseif($oct[1]<=222){ $server="whois.apnic.net"; }
elseif($oct[1]<=255){ $server="whois.arin.net"; }
else;
//Exec query to chose WHOIS server.
if($server){ return($reply=$whois->query($ipaddr,$server)); }
else{ return(0); }
}

133 で始まる IP アドレスといえば専ら、日本政府の機関、日本の国立大学法人 (うちの大学もそう)、日本の IT 企業のアドレスだから、APNIC なはずだけど、エラーがでるので、ARIN に問い合わせしている。
本来なら、エラーメッセージをもとに 2 次検索すべきなんだろうけど面倒なので省略する。
Whois 情報が返ってくるので、それを引数にしてに以下の関数を実行する。

function getCountryByWhois($result){
preg_match("/country:( )*([a-zA-Z]{1,3})/i",$result,$country);
if($country[2]){ return($country[2]); }
else{ return(0); }
}

2 つの関数は、以下のようにして使える。

echo("Who is 133.62.198.174 ?<br />\n");
$result=getWhoisFromIPAddr("133.62.198.174");
echo("Country: ".getCountryByWhois($result));

実行すると、「Country: JP」とカントリーコードが出力される。
蛇足だけど、IP アドレスから会社名や法人名を調べるには、JPNIC のサーバ (whois.nic.ad.jp) に対して、$whois->query() を行えばよい。海外の企業も各国の下位レジストラの Whois サーバに置き換えれば検索できる。

erf, erfc (誤差関数, 相補誤差関数) を求める PHP の関数を作った

erf, erfc (誤差関数, 相補誤差関数) を求める PHP の関数
PHP には erf(), erfc() がなかったので、Ruby に Math.erf(), Math.erfc() として実装されている C のソース を PHP に移植しました。

関数には困らないはずの PHP に統計処理に必要な関数がなかったので、 Ruby 本体のソースコード (C 言語) を探してきて PHP で書き直した。
数値計算を伴うプログラムでは言語を選ぶときに、数学関数の豊富さも考慮したほうがよさそう。Ruby 勉強しようかな。

JavaScriptでスマートにダイアログを表示するライブラリを作りました

smartdialog.js
「Yahoo!画像検索」や「Lightbox」のように、画面全体にレイヤーを重ねてダイアログを表示するJavaScriptのライブラリです。
他のライブラリと比較して、任意の色を背景色に選ぶことができ、CSSファイルや透過画像が不要だという長所があります。

必要だったから作ったので、ついでに公開。
JavaScriptのライブラリを作ったのも、JavaScriptでオブジェクト指向プログラミングを実践したのも初めてなので、バグが残っているかも。glayer.jsを一部参考にさせていただきました。
Yahoo!画像検索では、LightBox風UIを実装してから使い勝手がよくなった。
Flickrに登録されている画像が優先されて表示されるっぽいけど、日本語版も登場する予兆かな。しかし、FlickrでCCライセンスで公開している画像を「(C) All right reserved.」と著作権表示するのはまずい気がするんだが。