Jul 02

こんにちは、amo-kです。

天下一プログラマ応募Webページを更新しました。
若干解りづらい部分や説明が不足していた部分等を補足した内容になっております。
詳しくはWebを参照してほしいのですが、更新概要は以下の通りです。

・3位を特別賞に変更
・審査基準
・予選参加の流れ

学生諸君! まだまだ応募できるので是非応募してね!!
コード書こうぜ!!

Jun 22

ご無沙汰しております。amo-kです。

いつもは技術ネタを投稿しておりますが
今回は企画ネタを投稿致します。

学生の皆様っ!!
このたび学生向け天下一プログラマーを開催する事となりました!

企画概要応募方法はWebを参照下さい。

学生同士でプログラミングを競い合えるのは魅力的だと思うんだけど、
それだけでなく、、賞金総額100万円だからみんなどんどん応募しよう!

概要補足

本選参加の流れは以下のとおり
1.エントリー
2.Web予選
     3日(7/5, 15, 25)のうちから1日選択
3.本選
     1泊2日 8/1, 2: 東京

Apr 26

ご無沙汰しております、amo-kです。

さて、みなさん
普段作業をしていて以下のような事を感じることはありませんか?
・いちいちこのコマンドの使い方覚えてねーよ、ぁヘルプ見なきゃ。。
・いちいちターミナルでコマンドを連結させて面倒だな。。

何故こんな事を言うかというと、私が感じるからです(爆
具体的には、先日svnのリビジョンを知りたいというケースがありました。

$ svn info <リポジトリPATH>

これで取得できるのですが、
またいつかこの件で上記ストレスを感じそうだったので
コマンドとして保存しておく事にしました。
また、それだけでは芸が無いのでリビジョン番号のみを抽出する様にしています。
以下、ソースコードです。

#! /bin/bash

if [ ! $1 ]; then
    echo "Usage: $0 <Repository path>"
    exit
fi

svn info $1 | grep "Last Changed Rev:" | sed -e "s/Last Changed Rev: //"

実行例:

$ svn-revision <リポジトリPATH>

また類似する事象に直面したら誰の役に立つか解らなくても
懲りずにレポート、共有していきます〜

Mar 04

# 運用オペレーションの実務を経験された方は身に染みて分かっているし、
# それぞれのノウハウもあると思うけど、ジブンが経験したことを踏まえ、
# 自戒の念を込めて書いてみる。

本番運用中にもしも障害を起こしたら、その後始末はとても大変です。
関係各所へ連絡をして原因や影響範囲を調べ、障害報告書を書いて…あぁおそろしや。
ですから、本番運用でのオペレーションはできる限り慎重にし、手間をかけるべきです。
手間をかけても障害を起こした後の大変さに比べれば大したものではありません。

(ただ、障害発生後の後始末を通して得られる経験値は高く、さまざまなノウハウや文書作成能力の向上などは特典といえるかもしれません。;-)

とはいえ、やはり障害は対外的な信用を低下させ、モチベーションも下がるので起こしたくないもの。
そこで、実際に(運用オペレーション時における)障害を防止するためにはどういうことに気をつければよいかということを挙げてみました。

事前にやること

事前の作業で本番環境でのオペミスを防止

1. 事前の手順書の準備

手順書のレビューも実施し、作業者が気づかなかったリスクが浮上すればそれに対して検討することもできる。
また、できる限りコピペできるような形にしておくと実際の作業時に便利だし安全。

2. 事前に本番環境と同一のテスト環境での実施・確認

このとき、ファイルのデプロイ元はこのテスト環境と本番環境で同一にすべき。
テスト環境で確認したら、以降本番環境に反映するまではリポジトリからアップデートしないこと。

複数の目でチェックする

障害予防の基本。
人間 1 人の注意力には限界があるので、できる限り冗長化することでチェック漏れを防ぐ。

3. screen を利用してオペレーションを共有

複数人で screen セッションを共有し、作業状況を確認する。
また、1 人しかいなくても screen は常に使用したほうがよい。
万が一、接続が切れても screen -r すれば続きを進めることが出来るし、その他いろいろと便利。
GNU Screen - Wikipedia
http://ja.wikipedia.org/wiki/GNU_Screen

4. irc 等でオペレーション状況を実況する(コマンドとその結果をコピペとか)

状況を他のメンバーにも共有することで、問題が起こりそうな場合にも他のメンバーからアラートを出せたり、その解決をスムーズに行うことが出来る。

コマンド実行直前に

5. 指差し確認

ベタだけどオペミス防止効果あり。しかも 1 人でも有効。
実際に指で指すという身体の動作と確認内容を声に出す(そしてそれを耳で聞く)ことで今ジブンがやろうとしているオペレーションを再確認できる。
重要なコマンドを実行する場合などには特にお勧め。
指差喚呼 - Wikipedia
http://ja.wikipedia.org/wiki/%E6%8C%87%E5%B7%AE%E5%96%9A%E5%91%BC

作業を反映後

6. 定型チェックと自由チェック

主にコンテンツサイト系運用でやるチェック。
定型チェックはテスト項目に従って一通りやるチェック。
自由チェックはその名の通り、自由にさまざまな遷移をチェック。
仮に問題が見つかったとしても発見を早めることですぐにリカバーできる。定期的に実施するのも効果的。

その他

7. 油断せず常に注意深くする。

障害の多くは油断から生まれる。
油断していつもの確認手順を省くといったことが日常化してくるとヤバイ

以上、いろいろなシーンを想像して挙げているので場合によっては適当でないものもありますが、なるべく多くを実践したいですね。
また、他に有効な方法やご意見などいただけると幸いです。

(追記)

[2009-03-04]
同僚から意見もらいましたが、ある程度の定型的でまとまった作業はスクリプト化するというのもアリですね。さらに y/n 確認の仕組みがあるとよさげです。


[2009-03-06]
社内で次のような意見をいただきました。
・スクリプトについては dry run する機能を最初から実装するとよい
-> dry run 機能があるコマンドは必ず dry run して意図したとおりであることを確認するようにする

“1. 事前の手順書の準備” について
・手順書には作業目的も書いたほうが良い
-> 本当に *手順のみ* しか書かないとミスしがち
-> 自分でミスに気づき易いという利点もある

“7. 油断せず常に注意深くする。” の補足
よく展開でやらかす要因として、(悪い意味で)「手抜きする」というのがあります。
・テスト環境での確認をとばす
・定型的な展開と思い、確認をとばす など
また、タスクが積みあがっていたり、作業がマンネリ化してくるとやらかしがちなので、
単に “油断しない” というだけでなく、”油断しない” ための何らかの仕組みがあると良いですね。

Mar 01

ども、amo-kです。

先日デプロイ時に実況中継するIRCボットを作ったのでこれについて。

KLabでは通常、
テスト/本番環境に最新のプログラムソースコードを反映する際に
以下のような手順を踏む。

1.踏み台サーバにログイン
2.SVN Export
3.アーカイヴ作成
4.テスト/本番環境にアーカイヴをアップロード
5.テスト/本番環境のコマンドを実行し、アーカイヴ解凍、各Webサーバに同期
6.お掃除

通常はこれを1コマンドで実現するためにデプロイスクリプトを書いて
そのスクリプトを実行する事でデプロイすることとなる。

その際に、デプロイした人はターミナルをチェックしていれば
スクリプトの標準出力で進捗を把握できるが、たの案件メンバは解らない。
そこで、デプロイ実況中継をするIRCボットを作ってみた。

今回は特定のキーワードに反応したり、待機する必要がないので
各ステータス毎にIRCサーバに接続、チャンネルJOIN、レポート、切断ということをする
非常に単純なボットを作った。

以下、IRCクライアント画面サンプルとサンプルソースコード
工夫した点は特に無いが、ライブラリを使わずに
TCPコネクションを張ってIRCサーバと通信している点が若干特徴的かもしれない。
IRCクライアント画面キャプチャサンプル
デプロイ時に実況中継するIRCボット

サンプルコード

#!/usr/bin/ruby

require 'socket'

chan = ARGV[0]
msg  = ARGV[1]

sock = TCPSocket.open("localhost", 6667)
sock.send("NICK DeployBot\r\n", 0);
sock.send("USER DeployBot localhost localhost :DeployBot\r\n", 0);
sock.send(sprintf("JOIN #%s\r\n", chan), 0);
sock.send(sprintf("NOTICE #%s :<-------------- %s -------------->\r\n", chan, msg), 0);
sock.send("QUIT\r\n", 0);
sock.readlines
sock.close

最初はphpでsocket関数を使って実装しようと思ったんだけど
実は踏み台サーバでsocket関数が有効になっていなかったので、設定するのが面倒でもうRubyで杜撰に書いちゃおうと思ってRubyで書きましたww

Feb 22

ども、amo-kです。

今回は、先日RIA的なアプリを作っていて遭遇した
問題について書きます。

IE × SSL × リソースDL

上記が重なった際に生じる問題です。
どうなるかといいますと、
HTTPレスポンスヘッダのキャッシュコントロール系で
意図した動作をしないという問題です。

例えば、

Pragma: no-cache

というレスポンスヘッダを定義していると
逆にcacheファイルを参照しようとするようです。

今回は、HTTPサーバ側でレスポンスの全てを構築していた訳ではありませんでした。
サーバサイドはphpアプリケーションでレスポンスヘッダ/メッセージボディを生成するのですが
phpはデフォルトでレスポンスヘッダを生成してくれます。
その際に

Pragma: no-cache

を入れてくれます。

これは嬉しいのですが、
上記IEのバグに対応するには、ヘッダを書き換える必要があります。
ということで以下のようにヘッダを上書きして対応しました。

header("Pragma: ");

一般的には、Webサイトの管理ツールなどで
SSL通信による集計ファイルのDLサービス等で
同様の現象が再現し得るでしょう。

JavaScriptじゃないんだし、
phpソースコード中にIEの対応を書くなんてと思いましたが
よくよく調べてみると、Microsoftサポートでも公開していたので
まあいっかと思った次第です。

参考: Microsoft サポート オンライン

Jan 12

明けましておめでとうございます!!
ども、amo-kです。

2009年最初の投稿は、JavaScript / ActionScript についての内容です。
個人的にはRIA大好物ですので、この辺りは興味深いジャンルです。
では、本題に入ります。

JavaScript と ActionScript で相互に会話ができることを知った。

…ということは、
ブラウザ操作をトリガーにFlashを操作、
Flash操作をトリガーにブラウザを操作
できるということだ。
これは面白い!!
※厳密には、FlashもブラウザのFlashプレイヤで動作している訳だがそこはおいておこう。

という訳で早速動作確認がてら、簡単なjs, as(Flex用mxml)を書き相互会話サンプルアプリを作ってみた。

サンプルアプリ概要

1.JavaScript(白色部分)からActionScriptの関数を実行
サンプルアプリ上部のボタン「js2as」クリックで
ActionScript側の関数を実行、実行時刻をFlash上に表示。
2.ActionScript(黒色部分)からJavaScriptの関数を実行
サンプルアプリ下部のボタン「as2js」クリックで
JavaScript側の関数を実行、実行時刻をブラウザ上に表示。
※勿論いずれも何度押してもかまわない。

処理概要

上記サンプルアプリは、flash.externalパッケージのExternalInterfaceクラスを利用している。
JavaScriptからActionScriptの関数を実行するには、ExternalInterface.addCallback()メソッドを利用する。このメソッドでは、JavaScriptから呼び出すActionScript関数を定義する。

また、ActionScriptからJavaScriptの関数を実行するにはExternalInterface.call()メソッドを利用する。このメソッドでは、ActionScriptからJavaScriptの関数名を指定する。

サンプルソース

ブラウザ側のサンプルソースコードは、サンプルアプリ白色部分を右クリックしてソースを確認できますので
サンプルソースはFlash側のみ記載します。

import flash.external.ExternalInterface;
import mx.controls.*

// as2jsボタンクリック時実行
private function callFunction():void {
    if (ExternalInterface.available) {
        try {
            ExternalInterface.call("as2js");
        }
        catch(e: Error) {
            Alert.show("error : " + e);
        }
    }
}

// JavaScriptイベントのコールバック関数定義
private function setCallbackFunction():void {
    if (ExternalInterface.available) {
        try {
            //JavaScript から実行
            ExternalInterface.addCallback("js2as", function(): void {
                var date: Date = new Date();
                var dateTime: String = date.getFullYear().toString();
                dateTime += "-" + (date.getMonth() + 1).toString();
                dateTime += "-" + date.getDate().toString();
                dateTime += " " + date.getHours().toString();
                dateTime += ":" + date.getMinutes().toString();
                dateTime += ":" + date.getSeconds().toString();
                myLabel.text = "JavaScript => ActionScript: " + dateTime;
            });
        }
        catch(e : Error) {
            Alert.show("error : " + e);
        }
    }
}

参考情報

Dec 08

どうも、相変わらず暴君なyoshida-kです。

今日はMeCabというオープンソースな形態素解析エンジンをphpから利用して見ましょうというお話です。
MeCabを使うと文章を単語に分割したり、分割された単語がどういったものなのかという情報を取得したりできます。

まずは、MeCabをインストールしてみましょう。
リンク先を見ればインストール方法は明らかですが、とりあえず順を追って説明します。
1.sourceforge.netよりMeCabのソースをDownload
2.任意のディレクトリにDownloadしてきたアーカイブを展開
tar -zxvf ./mecab-x.y.tar.gz 的なw
3.mecabのコンパイルを行う。
普通のアプリと同じでconfigureしてmake , make installな感じです。
ディレクトリ内にあるINSTALLファイルを見るととりあえずやり方が書いてあったりします。

ここまでやるととりあえずmecabがインストールされるわけですが、コレだけではmecabはちゃんと動きません。
mecabを動かすには辞書が必要です。
辞書も先ほどのsourceforgeのところからdownloadできるので同様に展開⇒make installしてください。

さて、この状態でmecabを起動することが可能となりました。
mecabを起動すると形態素解析をしてくれます。

よく使われている例ですが
「すもももももももものうち」と入力すると

すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

このような形に出力してくれます。

さて、いよいよPHPでこのMeCabを利用するためにPHPのExtensionをインストールしましょう。
MeCabのPHP ExtensionはこちらのPage2さんが公開してくださってます。

インストール方法は
phpize ⇒ configure ⇒ make ⇒ make installです。
インストールが完了したらphp.iniのモジュール読み込みの設定にmecab.soを追加しましょう。

さて、以下の内容がテストコードです。
うまくいくと、mecabを起動して実行したものと同じ結果が出力されます。

<?php
   dl("mecab.so");

   $mecab = mecab_new();
   $string = "すもももももももものうち";

   print mecab_sparse_tostr( $mecab , $str );

   mecab_destroy();
 ?>

いかがでしょう?
コレだけではまだ実用性にかけるので次回はもうちょっと実用的な内容を紹介させていただきます。

Dec 04

amo-kです。
ちょっとした覚書です。

ドコモのiモードIDの取得で若干はまったので記録の意味で書いておきます。

通常のリンク(HTTP/GET)だと

任意のURL?guid=ON
例) http://example.com/?guid=ON

といった形でリンクURLにクエリパラメータを付加すれば
ドコモGWでONの部分がiモードIDに置換され
HTTPサーバ側では

任意のURL?guid=iモードID
例) http://example.com/?guid=abcdefg

というリクエストを受ける。

これは何も引っかからない。
しかしformでHTTP/POSTリクエストする際が引っかかった。
POSTメソッドの場合、直感的には
input要素のname属性値にguid、value属性値にON
つまり以下のように指定するように想像する。

<input type="hidden" name="guid" value="ON" />

しかし実は
formタグのaction属性値に

<form method="post" action="path/?guid=ON">

と指定しなければ取得できない。

ということで覚書でしたw

Dec 02

どうも 先日KLab男塾に入塾致しました、yoshida-kです。

初投稿がいきなり技術以外のネタですが、ちょいとデスソースについて語らせていただきます。

デスソース デスソースとはアメリカのBlairという会社から出ているホットソース(タバスコみたいなモノ)で、とにかく辛いソースです。

どれくらい辛いか?

なんか、

とても、

痛いデスw

鍋一杯のスープに味付け程度に3滴たらしただけでデスソースの味しかしなくなるほど強烈です。

あまりコレでは伝わりませんか。

では数値で表してみましょう。

唐辛子の辛さを図る単位が世の中にはあるらしくスコヴィル(SHUと表記する)というらしいです。

通常のタバスコは約2000SHUに対して我々が使用しているアフターデスソースは50000SHUと実に約25倍という脅威の辛さw

しかも、このデスソースはさらに上には上があるらしく、日本国内でも販売されているサドンデスソースは約50000~100000(調べたが結構な開きがあるらしい)とさらに危ない。

すでに、自宅用に購入しちゃいましたがw

そんなデスソースは実は味もしっかり考えられていて、パスタやピザはもちろん焼きうどんやペヤングソースやきそばにもマックのナゲットだろうと何だって合います。

さらに、デスソースにはこんなカッコいいスカルなキーホルダが1つついてきます。
(お徳用パックのmini4本セットには2つついてきます。)
こいつをジャラジャラと提げている人を見かけたら激辛党員だと思って間違いありません。

ちなみにyoshida-kの目標は1年内にこのキーホルダでウォレットチェーンを作ることですw

こんな素敵なデスソースがあれば職場の人間関係も円滑で刺激的なものになると思います。

キーホルダ