2010年01月14日

WaveのURLからWaveエンベッド用HTML生成ツールを作りました

Waveを一般のWebサイトに貼り付けることができるWave Embed APIと言う物があります。
Waveを貼り付けるだけなのに、そんなAPI勉強してられないYO!!!と言う方のためにWaveURLを入力するとWaveを埋め込むためのHTMLを生成するツールを作成しました。

WaveのURLを入力すると、そのWaveを貼り付けるHTMLを生成します。
高さや幅も指定することができます。

Google Waveにログインしていると、下にWaveが表示されます。

2009年12月27日

Google Wave Hackathonで1位!

昨日はGoogle Wave Hackathon in Kyotoに参加してきました。

Google Wave上で動作するアプリを1日で作り上げるというイベントで、朝から6チームで様々なアプリを作り、夕方から発表しました。

俺はToolチームと言うことで、GoogleWave上でマインドマップを描くことができるガジェットを作成しました。
GoogleWave 20091227 233830.jpg

画面はGWTで作り、グラフはHTML5のCanvasを使って描画。
データの永続化は独自形式のテキストフォーマットを作成し、そのテキストをSharedStateに保存するようにして作成しました。

そして見事1位!!
ちなみにアイデアのおもしろさを競うアイデアソンでは2位でした。

Hachathonは相変わらず激しく疲れるイベントだけど、同時に激しく楽しいイベントでもあります。
また近々別のHackathonが行われるので興味がある方は是非。

ちなみにHachathonのコツは、事前にアプリを設計しその設計で思うように作ることができるか技術を検証しておくことだなー。
しっかり調べたつもりでも、当日「うまくいかねー!!どうしよ・・・」と言うことがよく起こるし。
昨日も思っていた通りに動かない事があって焦った焦った。
でも自分が担当した部分では問題なくスムーズに事は進んだおかげで無事に完成!
前日4時までがんばって調査した甲斐があったぜ・・。


と言うことで1位の賞品としてGoogleが出した新しいプログラミング言語GoのTシャツもらってきました。
DSCF1122.JPG
いわゆる淫獣ですw

とりあえず近頃Google Wave勉強会の講師やHackathonの準備で疲れすぎた。
しばらくゆっくりするかー。

2009年12月02日

ノンブロッキングモードのsocket

ちょいとメモ。

bind
bzero((char *)&_srcAddr, sizeof(_srcAddr));
_srcAddr.sin_port = htons(port);
_srcAddr.sin_family = AF_INET;
_srcAddr.sin_addr.s_addr = INADDR_ANY;

// ソケットの生成(ストリーム型)
serverSocket = socket(AF_INET, SOCK_STREAM, 0);

int sock_option = 1;
setsockopt(serverSocket,SOL_SOCKET,SO_REUSEADDR,&sock_option ,sizeof(sock_option ));

// ソケットのバインド
if( bind(serverSocket, (struct sockaddr *)&_srcAddr, sizeof(_srcAddr)) == -1 ){
  LOG4CXX_ERROR( logger , "Socket Bind Error !!");
  return false;
}

LOG4CXX_DEBUG( logger , "Socket Bind success.");

accept
ここでノンブロッキングモードの設定
_dstAddrSize = sizeof(_dstAddr);  // これ必要
dstSocket = accept( serverSocket , (struct sockaddr *)&_dstAddr, &_dstAddrSize);

// TEST ノンブロッキングモード
u_long val=1;
ioctl(dstSocket, FIONBIO, &val);

LOG4CXX_DEBUG( logger , "accept!! socket=" << dstSocket);

if( errno != EINPROGRESS ){
  LOG4CXX_DEBUG( logger , "SOCKET ERROR! " << errno);
}
データ受信
int length = recv( sock , buff , BUFFER_SIZE , 0);

if (errno == EAGAIN){
  // 何も無し
}

2009年11月26日

Brand New Wave Upper Ground

と言うわけでGoogle Waveですよ。

ちょいとGoogle Wave Gadgetsで三目並べ作ってみました。
wave_tic_tac_toe1.png

基本GoogleガジェットにWave用のAPIが追加されてる感じです。
データの永続化が簡単にできるので楽。

Google的にはGoogle Waveのページ自体より、それを構成するGoogle Wave Federation ProtocolとそのWaveサーバの方に力を入れている気がするな。

もうちょっといろいろドキュメントを読んで理解を深めねば。


つかJavascriptはデバッグだるいよー。

2009年04月05日

Niconico Live Checker バージョンうp

ニコ生の仕様が変わって、番組リストの取得に失敗していたので対応。
以下からダウンロードしなおしてください。
Niconico Live Checker

なんだかカテゴリとか増えて、カテゴリごとにページが分かれているようになった。
同じ番組でも複数カテゴリに登録できる模様。

次のバージョンアップの時はニコ生のページと同じようにタブを増やしてカテゴリごとに表示できるようにするか。
あと番組数が多くなって、リスト取得に時間がかかるようになってしまったので、読み込み進捗の表示とか必要かもしれない。

それと突貫工事で修正したのであんまりテストしてません。
バグがあったら報告お願いします。

-----------------
追記
バージョンアップ時はfavorite.datファイルを新バージョンのexeファイルと同じ場所にコピーしておくと、お気に入りデータが引き継がれます。

2009年03月30日

PerlでCSV

PerlでCSVを読む必要が出てきて、解決したのでそれのメモ。
Text::CSV_XSの扱い方と、Root権限が無い環境での一般ユーザ環境へのCPANを使用したライブラリのインスコ。


まずText::CSV_XS
perl - CSVはText::CSV(_XS)?で

Text::CSV_XSがインスコされていれば良いんだけど、無い場合はインスコする。
Root権限が無いので一般ユーザ環境へインスコする。

一般ユーザ環境におけるCPANモジュールの使い方

$perl -MCPAN -e shell
install Text::CSV_XS
してソースコードにインスコしたライブラリを参照するよう設定を記述する。
use lib '/home/USER/perl/lib/perl5';
use lib '/home/USER/perl/lib/perl5/site_perl';
use Text::CSV_XS;
みたいな感じで。

日本語を扱う場合は以下のように{binary=>1}が必要とのこと。
my $csv = Text::CSV_XS->new({binary=>1});

CPANのライブラリはPerlのバージョン毎にインストールされるようなので、自分でPerlをインストールし、そのバージョンのライブラリを入れたい場合は以下のようにする。
$/home/USER/bin/perl -MCPAN -e shell
みたいな感じで。

2009年01月12日

Niconico Live Checkerうpしました

つーことでNiconico Live Checkerうp。

Windows、Linux、MacOS共通です。
Windows版はexeファイル。Linux、MacOSは付属のスクリプトを実行してくださいな。
MacOSは動作確認していません。

オプションにより放送開始を音声でも通知してくれるようにしておきました。
音声は"ゆっくりボイス"です。

アプリのアイコンはニコニコ動画のfavicon.icoからぱくらせてもらいました。さーせん。

2009年01月09日

ニコニコ生放送チェッカー作った

突然だけどニコニコ生放送はとてもおもしろい。
生放送ばっかり見て最近は普通の動画をあまり見ていない。
ゲームプレイ実況をラジオ的に流しつつ、プログラミングなどをするのが良い感じだ。

が!!!

お気に入りの放送がいつ始まるのか知るのが難しい。
かといって放送一覧のページに張り付いてリロードばかりするのもバカらしい。

よって自動でチェックしてくれるプログラムを作った。
キーワードをあらかじめ設定しておき、そのキーワードが含まれる放送が始まると通知してくれるプログラムだ。これで好きな動画が始まったらすぐチェックすることができる。

動作中画面。放送一覧が表示され、お気に入りに登録しているキーワードが含まれている放送が赤く表示されている。
niconicolivechecker1.png

放送が始まるとバルーンで通知してくれる。これで別の作業をしていても安心。
niconicolivechecker2.png

二晩で作ったものなのでもうちょっとデバッグして日曜あたりにうpするか。
生放送厨にはある程度需要があると思うんだけどどうだろうか。

2008年07月27日

インタラクションデザイン

ユーザインターフェイスについて興味深い本が紹介されていた。

るいもの戯れ言
ユーザインターフェイスの設計
「インタラクションデザイン」という言葉は初めて聞いた。インタラクションデザインは、ユーザインターフェイスよりも広い範囲を扱い、動的なユーザと機械との間との相互作用を含む言葉なのだそうだ。500ページ以上に及ぶ本書の内容は、前半が理論的な解説、そして後半は実践的な設計の解説で構成されている。
とのこと。


これはなかなか面白そうだ。また、この分野に関し、この著者のAlan Cooper氏がペルソナ法というデザイン手法を提案しているそうだ。架空のユーザを複数定義し、そのユーザ達がどのようにそのソフトを使うかをシミュレートし、このユーザはPCに不慣れだからここで躓くんじゃないか。このユーザはPCを扱い慣れているのでこのような使い方をしたいのではないか、などと現状の欠点を洗い出し、改善するという感じ。

ペルソナ法のより詳しい説明は以下がよいようだ。(まだ買ってない)

使いやすいアプリを作ろうと多少工夫をすることがあってもここまで深くは考えたことはなかったな。
「使いやすいインターフェイス」というのはボタンの大きさがどうとか、どの機能に何クリックでたどり着けるかなどではなく、あらゆるユーザに、さまざまな"シナリオ"上で、一定以上の快適さを提供することなんかな。
それを実現するのがペルソナ法か。


今作っているWebアプリでも、ユーザインターフェイスは気をつけないとな。
Webアプリは、いかに一見さんに使ってもらえるかがカギだと思っているので、Windowsのノートパッドぐらい一瞬で見て使い方をわかるぐらいのものにしないとな。
ジョブズが言っていたように、"完成"とは機能を追加して達成するのものではなくて、取り去るモノがすべて無くなって、これ以上シンプルにできなくなったら完成、なんだろうな。

2008年07月21日

とりあえずリリース

ここ数週間、土日、通勤の電車の中、家帰ってからひたすらプログラミングを続け、作成してきたWebアプリがある程度形になった。
構想はずいぶん前からあったけど、設計上の壁というか"問題"をクリアできたので一気に進むことができた。

モノはこちら。
Anime Freaks

どんなサイトかという、アニメの感想などを投稿し合って、情報交換とコミュニケーションができたらいいなと言うサイト。
日本には個人のブログに感想を書くという文化はあるけど、情報が発散しすぎてどうも有効活用できていない。自分と同じ嗜好の人のブログを見つけるだけでも大変だ。
感想やアニメに対する点数付けの情報が1カ所に集約していると、自動で今日見たアニメの感想一覧を見ることができるのでいちいちブログを探す必要がない。
また、そこで見つけた同じアニメを見ている人はおそらく同じ趣味の人なので、その人がほかに感想をつけているアニメがあるとそのアニメももしかしたら面白いと感じるかもしれない。

ということで感想を書くことでコミュニケーションが生まれるようなサイトを目指す。
感想:コミュニケーション:情報の重みは3:2:1ぐらいの予定。
情報はWikipedia、コミュニケーションは2chがあるしね。

人が集まり出すほどのコンテンツ(感想、情報)が蓄積するまで1年ぐらいかかると思っているので、それまでは気長にゆっくり開発を続けよう。今の段階ではまだまだやりたいことの1割ぐらいしか実装できていないし。

開発のモチベーションというかおもしろみはJavaを使った本格的なWebアプリケーション。
SAStrutsとH2Databaseによる開発はさくさく開発ができて面白かった。
現在のところクラス数は150ほどで、画面数は40画面ほど。やはりユーザから見える画面よりも管理画面の方が複雑で時間がかかってしまった。まぁプログラミングより画面デザインの方がさらに時間がかかったわけだけど。

サーバはIBMのいつもの自宅サーバ。
CPU Celeron2G メモリ256Mの今となっては超非力マシンになったけど今JMeterでベンチマークを計ってみたら1分間に470回ほど、1秒間に7,8回のアクセスが可能だった。
同じページを何度もリロードなのでDB検索キャッシュが効き過ぎているのかもしれないが結構速度は出ている。もしこのサイトが人気が出たらもっと強力なマシンを導入してもいいかもなぁ。


とりあえず今年の春に始まったアニメをがんばって全部入力してみた。
ふと思うと、アニメのサイトを作っているのに全くアニメを見ていない自分に気がつく。
やっぱりプログラミングの方が面白いしね。

2008年05月20日

Eclipseのアイコン画像だけ収集

プログラムのアイコンの画像が欲しいときにEclipseのアイコンは非常に助かる。
が、アイコンの画像だけを取り出したいと思ってもちょっとめんどくさい。
ググってみるとEclipseのCVSからアイコンだけ取り出してくるスクリプトが公開されているのを発見した。
Eclipse Icons - follow up post
具体的には以下のような感じ。
これでアイコンだけzipにまとめてくれる。

#!/bin/sh
CVSROOT=:pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse
export CVSROOT

mkdir -p eclipse
cd eclipse
cvs -q co org.eclipse.debug.ui/icons
cvs -q co org.eclipse.pde.ui/icons
cvs -q co org.eclipse.jdt.ui/icons
cvs -q co org.eclipse.vcm.ui/icons
cvs -q co org.eclipse.team.ui/icons
cvs -q co org.eclipse.ant.ui/icons
cvs -q co org.eclipse.help.ui/icons
cvs -q co org.eclipse.ui/icons
cvs -q co org.eclipse.ui.views/icons
cvs -q co org.eclipse.ui.console/icons
cd ..
rm -f ~/public_html/eclipse-icons.zip
find eclipse -name "*.gif" -print | zip ~/public_html/eclipse-icons.zip -@


2008年05月12日

H2 Database Engine

仕事で使用するDBとしてH2 Database Engineを使っている。
H2を使う上でのちょっとしたメモ。

Linux版のインストールは単にファイルを解凍するだけ。bin/h2.shを実行すればOK。
設定はservice/wrapper.confをいじる。

ローカル以外からのWebコンソール画面の表示を許可するには以下のように設定。
h2server.shとか作って

#!/bin/sh
cp=h2.jar
if [ -n "$H2DRIVERS" ] ; then
cp="$cp:$H2DRIVERS"
fi
if [ -n "$CLASSPATH" ] ; then
cp="$cp:$CLASSPATH"
fi
java -cp "$cp" org.h2.tools.Server -tcpAllowOthers -pgAllowOthers -webAllowOthers

とオプションを付ける。

RubyからH2にアクセス。日本語英語ともに情報が少なくちょっと苦労した。わかればなんてことはない。
-pgAllowOthersを付けて実行し、postgreSQLプロトコルをONにする。
サーバ起動時に以下のようにPGサーバがothers can connectになればOK。
PG server running on pg://localhost:5435 (others can connect)
ログにでると思うが、デフォルトで5435ポートで待ち受ける。

RubyはPostgres(Ruby PostgreSQL 拡張モジュール)を使うのでそれを入れる。

H2デフォルトのパスワード無しのユーザでログインしようとすると以下のように怒られる。
fe_sendauth: no password supplied (PGError)

パスワード無しユーザーでのログインはRubyのPGモジュールで対応していないようだ。
よってパスワード有りユーザを作成する。
CREATE USER user PASSWORD 'hoge';
ALTER USER user ADMIN TRUE;
みたいな感じに作って管理者権限も与える。

後はRubyで以下のように実行。

require "postgres"
conn = PGconn.connect("123.456.789.123", 5435, "", "", "DB","user","hoge")
res = conn.exec("select * from TABLE;")

numFields = res.num_fields
numTuples = res.num_tuples
numTuples.times{ | i |
text = ""
numFields.times{ | l |
if res.getvalue( i , l ) != nil then text = text + res.getvalue( i , l ) end
text = text + ","
}
puts(text)
}


2008年04月19日

MovableTypeでスパム防止

コメントスパムがうざいので今更ながら対応。 mt-comments.cgiの先頭ぐらいに以下を追加。
小文字英数などだけでコメントが構成されていればエラーメッセージを送信して終了。
適当に作ったので精度も適当だがすり抜けたスパムがあればその都度対応しよう。

require CGI ;
my $q = new CGI();
my $text = $q->param("text");
if( $text !~ m/[^a-zA-Z ()=\[\]\:\;\/\.,0-9\n\r<>\"\'|\-!?]/){
print "Content-Type: text/html\n\n";
print "ERROR MESSAGE";
die;
}

そしてトラックバックも廃止。

2008年04月17日

Rubyで文字コード変換

Rubyで任意の文字コードから任意の文字コードへの変換をメモ。

require "iconv"
iconv = Iconv.new('UTF-8', 'EUC-JP')
while( line = gets )
utf8 = iconv.iconv(line)
puts(utf8)
end

2007年07月12日

Domain-Driven Design

最近会社でプログラミング、家でもプログラミングと言う生活が加速してる。
とはいえ技術的に新しいことにチャレンジしてるわけでもないので特に書くことは無い。淡々とコードを書く。

最近ネットで見つけた記事。
Domain-Driven Designのエッセンス 第1回
ま~た新しい開発手法か?と思ったけどそうではない様子。パターン的なものか。
今の俺にはあまり関係ない話だけど続きが楽しみだ。

"TDD Anti-Patterns" TDD のアンチパターン
Test-Driven Development (テスト駆動開発)でのアンチパターン。
あるあるwwwww と思ってしまうとダメな証拠。

TDDでのイイ本って無いかなぁ。
今のところJUnitイン・アクションが一番良かったけど、もうひとつ何かこうヒラメキというかスッキリと言うか欲しいところ。


最近買った本
C++実践プログラミング
まだ最初のほうしか読んでないけどこれはなかなかよさげかも。
"実践"とあるようにプログラミング入門には難しいかもしれないけど、プログラミング経験者がC++勉強するにはいい感じだ。
それぞれの章に演習問題があるんだけどその問題が多少工夫されていて、「以下のプログラムは○○のように動くことが期待されるがそのようにはならない。なぜか。そして修正せよ。」と言った感じにバグ修正をメインとした問題が多いのが面白い。
6000円と値段は高めだけど、結構期待できる1冊の予感。


C++クックブック
C++で○○するにはどうすればいいんだっけ?と言うときにググらずに済む便利な一冊。

さて、本読んで寝よっと。


あ、そうそう。
絶望した!! ぱにぽにっぽい絶望先生に絶望した!!

プログラムその他のエントリー