<< 8月 2006 | Home | 10月 2006 >>

Python 修行 - 4 / アンチョコ探し

チュートリアルを最初から読んでいくのは早速飽きました。
まぁ文法さえわかればあとは API リファレンスを見れば良いだろうということでアンチョコ(Cheat Sheet)を探しました。
パッと見つかったのは以下の2つ。
・Python 101 cheat sheet
http://www-128.ibm.com/developerworks/library/l-cheatsheet3.html

・Python Cheat Sheet
http://www.yukoncollege.yk.ca/~ttopper/COMP118/rCheatSheet.html

ざっとコレを見ながら何か作ってみれば覚えも早いかな?

ついでに見つけたのが Java や HTML、vi、Oracle などエンジニアに役立ちそうなアンチョコへのリンクが 30 以上も掲載されているページ。
良く触る言語・製品のはプリントアウトして手元に置いておくと良いかもしれません。
・Cheat Sheet Roundup - Over 30 Cheatsheets for developers
http://www.petefreitag.com/item/455.cfm

タグ :
このエントリーをはてなブックマークに追加   

Java - スレッドダンプの取り方 その3 / Windows サービスとして登録している場合は?

その1 / スレッドダンプの取り方
その2 / Linux だと java プロセスがいっぱい!?
→その3 / Windows サービスとして登録している場合は?
その4 / WebLogic Server とスレッドダンプ
スレッドダンプの読み方 その1 - VM 内部スレッドと main スレッド

Windows 環境で、サーバサイドのプログラムは Windows サービスとして登録して運用することが多いです。

例えば Tomcat 5.5 であれば
%TOMCAT_HOME%¥bin¥service.bat install [サービス名]
でサービス登録、
> net start [サービス名]
で起動できます。(もちろんサービスコントロールパネルでもOk)


Tomcat5.5 が Widnows サービスとして起動した様子

しかし、このコマンドプロンプトは Tomcat のプロセスに直接絡んでいないため、Ctrl+Break は効きません。
そんなときに便利なのが SendSignal です。
これは指定したプロセスに Ctrl+Break を押下したのと同じ信号を送る、まさにスレッドダンプを取るために作られたプログラムです。
使い方は簡単、
> SendSignal [プロセスID]
とするだけ。

プロセスID は Windows のタスクマネージャで確認できます。
ただし、デフォルトではプロセスIDは表示されないため、[表示>列の選択]より[PID(プロセスID)]を選択しておく必要があります。
Tomcat をサービスとして起動している場合は java.exe ではなくtomcat5.exe として表示されます。
この↓例だと 1204 が Tomcat のプロセスID になります。

tomcat5.exe のプロセスID を確認中

プロセスID が確認できたら後は SendSignal の出番です。
> SendSignal.exe 1204 で Ok。

tomcat5.exe の出力は %TOMCAT_HOME%¥logs¥jakarta_service_yyyymmdd.log に記録され、スレッドダンプもここに出ます。
余談ですがこのファイルは改行コードが CRLF になっていないみたいで、メモ帳で開くとTSV形式(Tofu Separated Value - 豆腐区切り)の長い一行に見えてしまいます。
少し洒落たエディタとかとかで開きましょう。
さらに余談ですが標準出力・標準エラー出力は stderr|out_yyyymmdd.log というファイルに記録されています。これは(たぶん) Tomcat がアプリケーションレベルで補足して出力しているもので、JVM のもっと低レベルなところで出力されるスレッドダンプは記録されないことに注意してください。



SendSignal でスレッドダンプが出力された様子

SendSignal はスレッドダンプを取得するためだけに Windows サービス化をためらっていた人には非常にカユい所に手がとどく便利ツールなのですが、別のカユい制限があります。
バッチの中で呼び出すと "バッチ ジョブを終了しますか (Y/N)?" とバッチが停止してしまうのです。
どうやら Ctrl+Break の信号を自身も感知してしまう(?)ようで・・・。
一応回避策はあって、"start" を介して別のコマンドプロンプトをキックすれば大丈夫です。こんな↓感じで。
-send.bat

echo スレッドダンプを取得します。
start SendSignal [pid]
echo スレッドダンプを取得しました。


スレッドダンプの取得にはもう一つお勧めのツールがあります。
その名もズバリ、StackTrace。StackTrace とは各スレッドのメソッド呼び出し順のことです。NullPointerException とか発生したときにずらずらっと表示されるアレ。
Java Web Start としてパッケージされているので、JDK がインストールされている環境ならば起動は簡単、起動用のリンクをクリックするだけです。
よく使う場合はショートカットをデスクトップに配置することもできます。
使い方は簡単。起動したらメニューより [Process>Thread Dump...] を選んでプロセスID を入力するだけ。プロセスID がまだわかっていなければ一覧から選択することもできます。
StackTrace が賢いのはスレッドダンプがプロセスの向こう側に吐かれるのではなく、StackTrace のアプリケーション内で直接スレッドダンプを確認できることです。


StackTrace でスレッドダンプを取得している様子

ただ、かなりトリッキーな事をしているようで、スレッドダンプを取得する際、解析対象 JVM 内に勝手に "StackTrace Remote Thread" という名前のスレッドを作ってしまいます。
ちょっと使ってみた限り不安定になるようなことはありませんでしたが、どの程度の実績がある製品なのかは知りません。
動作中の JVM に影響を与えずに中身を確認できるのがスレッドダンプの良いところですので、やや気持ちが悪いといえば気持ちが悪いです。
冗長化していない環境では念のため、運用前に十分に検証しておきましょう。

ちなみに StackTrace は一部ネイティブライブラリを使っており、Pure Java のプログラムではありません。Mac OS X、Linux、Windows にのみ対応しています。

次回は WebLogic Server を利用している環境でのスレッドダンプの取り方について説明します。

タグ :
このエントリーをはてなブックマークに追加   

Java - スレッドダンプの取り方 その2 / Linux だと java プロセスがいっぱい!?

その1 / スレッドダンプの取り方
→その2 / Linux だと java プロセスがいっぱい!?
その3 / Windows サービスとして登録している場合は?
その4 / WebLogic Server とスレッドダンプ
スレッドダンプの読み方 その1 - VM 内部スレッドと main スレッド

前回説明した通り、スレッドダンプを取るのは簡単です。解析にはちょっと慣れがいるのですが・・。

さて、運用環境でフリーズしたぞ!ってときにスレッドダンプを取ろうと思うと困ることがあります。一つは Linux 環境でやたらとプロセスが表示されてしまい、どのプロセスIDを指定すれば良いかわからない場合です。
一部の Linux ではスレッドの実装の違い(※)から、ps コマンドを実行した際、Java アプリケーションが一つしか起動していなくても大量に Java プロセスが表示されてしまいます。
その場合は pstree コマンドで一番親となるプロセス(一番左上に表示されるもの) の PID を確認して kill コマンドを実行します。
$ pstree -p | grep java

例)
$ pstree -p | grep java
|-java(344)---java(347)---java(348)
| |-java(349)
| |-java(350)
:
:
$ kill -3 344

※ Linux Threads というスレッドライブラリを使っているカーネルの場合こうなります。NPTL(Native POSIX Thread Library) と呼ばれる新しいスレッド実装では他の Unix 系 OS と同様、Java プロセス一つに付き一つだけ表示されます。

タグ :
このエントリーをはてなブックマークに追加   

Python 修行 - 3 / WebLogic と Python と Jython

WebLogic Server 9.x には Java ベースの Python 実装、Jython が含まれています。
Jython は Python のコードを Java のバイトコードに変換して実行します。結果的には Python コードが (JVM の実装、判断次第では)ネイティブコードで動くことになります。
使い方は簡単、setEnv.sh/cmd で環境変数を整えて weblogic.WLST クラスを起動するだけ。引数を指定しなければインタラクティブモードになり、Pythonコードが書かれたファイルを指定すれば直接起動します。

~/bea92/weblogic92/samples/domains/wl_server$ . bin/setDomainEnv.sh 
-bash: Don't know how to set the shared library path for Darwin.
~/bea92/weblogic92/samples/domains/wl_server$ java weblogic.WLST

Initializing WebLogic Scripting Tool (WLST) ...

Welcome to WebLogic Server Administration Scripting Shell

Type help() for help on available commands

wls:/offline> 1+2
3
wls:/offline> _
3
wls:/offline> hello = "hello"
wls:/offline> hello[0:2]
'he'
wls:/offline> ^D
~/bea92/weblogic92/samples/domains/wl_server$ cat hello.py
print "hello"
~/bea92/weblogic92/samples/domains/wl_server$ java weblogic.WLST hello.py

Initializing WebLogic Scripting Tool (WLST) ...

Welcome to WebLogic Server Administration Scripting Shell

Type help() for help on available commands

hello$ cat hello.py
print "hello"
~/bea92/weblogic92/samples/domains/wl_server$ java weblogic.WLST hello.py

Initializing WebLogic Scripting Tool (WLST) ...

Welcome to WebLogic Server Administration Scripting Shell

Type help() for help on available commands

hello
~/bea92/weblogic92/samples/domains/wl_server$


Jython について詳しくはこちら。
http://www.jython.jp/
http://www.jython.org/Project/index.html
http://sourceforge.net/projects/jython/

タグ :
このエントリーをはてなブックマークに追加   

Python 修行 - 2

今回は 3. An Informal Introduction to Python
斬新な文法だらけでほとんど丸写しに近いメモになってしまいました。

インタラクティブモードでは式を評価した結果が即座に表示されます。

$ python
Python 2.3.5 (#1, Mar 20 2005, 20:38:20)
[GCC 3.3 20030304 (Apple Computer, Inc. build 1809)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+1
2
>>> "hello"
'hello'
>>>


最後に評価された値は "_" で参照できます。
>>> 2*3
6
>>> _*4
24
>>> "hello"
'hello'
>>> _+" world"
'hello world'
>>>


ダブル(シングル)クオーテーション3つで囲むと改行やダブル(シングル)クオーテーションをエスケープせずに記述できます。
>>> """
... This
... is
... "a"
... sentence
... """
'\nThis\n is\n "a"\nsentence\n'
>>> _
'\nThis\n is\n "a"\nsentence\n'
>>> print _

This
is
"a"
sentence

>>>


ダブルクオーテーションで囲むとシングルクオーテーションをエスケープせずに掛けます。逆も然り。
>>> "It's a SONY"
"It's a SONY"
>>> 'It\'s a "SONY"'
'It\'s a "SONY"'
>>> print _
It's a "SONY"


r" で始めると Raw text として認識され、エスケープが行われません。
>>> hello = r"This is a raw text\
... '\n' won't be converted."
>>> print hello
This is a raw text\
'\n' won't be converted.
>>>


サブストリングの抽出はこんな感じ。
>>> hello = "hello"
>>> hello[0]
'h'
>>> hello[10]
Traceback (most recent call last):
File "", line 1, in ?
IndexError: string index out of range
>>> hello[0:2]
'he'
>>> hello[:2]
'he'
>>> hello[2:]
'llo'
>>> hello[-2]
'l'
>>> hello[-2:]
'lo'
>>> hello[:-2]
'hel'
>>>

タグ :
このエントリーをはてなブックマークに追加   

Python 修行

Python に手をつけてみました。
とりあえず本家のチュートリアルベースに勉強しながら忘れそうなことをメモしていくことにします。
・Python Tutorial
http://docs.python.org/tut/tut.html

- Mac OS X の Python
Mac OS X は標準で Python がインストールされてます。

$ py[tab]
pydoc pydoc2.4 python2.3 pythonw
pydoc2.3 python python2.4 pythonw2.3
$ whereis python
/usr/bin/python
$ ls -la /usr/bin/python
lrwxr-xr-x 1 root wheel 9 May 1 2005 /usr/bin/python -> python2.3
$ python2.3
Python 2.3.5 (#1, Feb 19 2006, 00:26:06)
[GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> quit
'Use Ctrl-D (i.e. EOF) to exit.'
>>> ^D
$ python2.4
Python 2.4.2 (#1, Feb 18 2006, 23:37:11)
[GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> ^D

どうやら Python2.3.5 / 2.4.2 がインストールされていて、python は python2.3 へリンクが張られてるらしい。

というわけで 2. Using the Python あたりを実践。

- Python の実行方法
・インタラクティブモード
コマンドラインから python とうつだけ
$ python
Python 2.3.5 (#1, Mar 20 2005, 20:38:20)
[GCC 3.3 20030304 (Apple Computer, Inc. build 1809)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print "hello"
hello
>>> ^D

・ファイルに保存して
$ cat hello.py 
print "hello"
$ python hello.py
hello

・直接実行
$ cat hello.py 
#! /usr/bin/env python
print "hello"
$ chmod +x hello.py
$ ./hello.py
hello


- エンコーディングの指定方法
$ cat hello.py 
#! /usr/bin/env python
# -*- coding: Shift_JIS -*-
print "こんにちは"
$ ./hello.py
File "./hello.py", line 2
SyntaxError: 'unknown encoding: Shift_JIS'

そんなエンコーディングは知らないとエラーがでた。
"SyntaxError" ってのはなんかニュアンスがおかしいけど・・。
調べてみるとJapaneseCodecsっていうパッケージ(?)が必要らしい。
日本語環境でのPython (for Python 2.3 or later)
Python2.4 ではデフォルトで含まれているそう。
また、エンコーディングの指定はもうちょっとシンプルに、
# coding: エンコーディング名
で良いらしい。
使えるエンコーディングの一覧はこちら
http://docs.python.org/lib/standard-encodings.html

というわけで Python2.4 で動かしてみる。
$ cat hello.py 
#! /usr/bin/env python
# -*- coding: shiftjis -*-
print "日本語"
$ python2.4 hello.py
Bus error

バスエラーが発生。なんとなく euc にしてみたら・・
$ cat hello.py 
#! /usr/bin/env python
# -*- coding: eucjp -*-
print "日本語"
$ python2.4 hello.py
日本語

動いた。

タグ :
このエントリーをはてなブックマークに追加   

Java Web Start / 侍 - デスクトップ ショートカットの作り方

Java Web Start とは Web ページ上のリンクをクリックするだけで Java アプリケーションのダウンロード、インストール、起動を行ってくれる便利な仕組みです。
Java SE の高機能化、高速化に伴い現在では Java アプリケーションはネイティブのアプリケーションと遜色ないルック&フィールとパフォーマンスを獲得しています。
アプリケーションの自動更新にデフォルトで対応している分、ある意味通常のデスクトップアプリケーションよりも強力と言えるかもしれません。

以前の Windows の Java Web Start の実装ではアプリケーションの2回目の起動時にショートカットを作成するかどうか尋ねて来ましたが、最近のバージョンではデフォルトで無効になっているようです。
今回は毎回 Web ページをクリックしなくても済むように、デスクトップにショートカットを作成する方法を説明します。


まず、JRE のインストールディレクトリ¥bin¥ 以下の javaws.exe を探して起動します。多くの環境では C:\Program Files\Java\jre1.5.0\bin あたりになります。

JRE_HOME/bin/javaws.exe

すると Java アプリケーション キャッシュ ビューア というウインドウが開きます。

Java アプリケーション キャッシュ ビューア

ショートカットを作成したいアプリケーションを選択し、[アプリケーション>ショートカットをインストール]を選びます。


以上でデスクトップにショートカットが作成されます。
もちろんショートカットをスタートアップに登録したり、クイックランチャに登録したりもできます。


今後新しい Java Web Start アプリケーションを起動した時、同じ操作をしなくても済むよう、 Java アプリケーション キャッシュ ビューアの[編集->設定->詳細タブ->ショートカットの作成]より[ユーザに尋ねる]に設定しておくと便利です。


すると、以降 Java Web Start アプリケーション起動時に以下のようなダイアログが表示されてショートカットを作成するか尋ねてくれます。



Mac OS X ではショートカットではなくアプリケーションが作成されます。
アプリケーションといっても実質は Java Web Start がキャッシュしている jnlp を参照する仕組みですので、Java Web Start の大きな強みである自動更新も有効です。
アプリケーションを作成するかどうかはデフォルトで尋ねるようになっていますが、手動で設定したい場合は[アプリケーション>ユーティリティ>Java>Java Web Start.app]を起動して[Java Web Start>環境設定>デスクトップアプリケーションオプション]より設定します。

このエントリーをはてなブックマークに追加   

Java - スレッドダンプの取り方

→その1 / スレッドダンプの取り方
その2 / Linux だと java プロセスがいっぱい!?
その3 / Windows サービスとして登録している場合は?
その4 / WebLogic Server とスレッドダンプ

スレッドダンプの読み方 その1 - VM 内部スレッドと main スレッド

スレッドダンプの取得方法、解析方法について網羅的に説明した資料はあまりないのでちょっと書いてみました。まとまったらのドキュメントに追加するつもりです。


スレッドダンプとは、 Java のプロセス内部で動作している各スレッドがそれぞれ何をしているか確認できるものです。
Java のプログラムがフリーズした場合や、パフォーマンス低下が見られる場合などに取得すると、どのスレッドが停滞しているのか、プログラム中具体的にどこで止まっているのかを解析できます。

スレッドダンプは任意のタイミングで SIGQUIT シグナルを送る(Unix)、または キーボードで Ctrl+Break を押下する(Windows)ことで取得できます。
JVM のベンダやバージョンにより異なりますが、多くの場合スレッドダンプは標準出力、または標準エラー出力に記録されます。
簡単にまとめるとスレッドダンプは以下のような手順で解析することになります。
1. 標準出力/標準エラー出力のファイルへのリダイレクト
2. プロセスIDの確認
3. シグナルの送信
4. リダイレクト済みファイルよりスレッドダンプの確認

以下に手順の内容を具体的に説明します。

1. 標準出力/標準エラー出力のファイルへのリダイレクト
スレッドダンプはターミナルアプリケーションやコマンドプロンプト等から直接確認することもできますが、過去のログが流れて見えなくなってしまったり、検索操作ができなかったりと、大変苦痛を伴うのでアプリケーション起動時にファイルへリダイレクトしておくことをお勧めします。
例えば bash や Windows では以下のようにします。

$ [javaアプリケーションの起動スクリプト] > console.log 2>&1

例) > startWebLogic.cmd > console.log 2>&1

Windows の Tomcat など、起動スクリプト内で start コマンドを使って別DOS窓を起こしている場合は起動スクリプトそのものの出力をリダイレクトしてもだめです。
Tomcat の場合、具体的には catalina.bat の
----------
set _EXECJAVA=start "Tomcat" %_RUNJAVA%
goto gotTitle
:noTitle
set _EXECJAVA=start %_RUNJAVA%
----------
という部分を以下のように書き換えて、start コマンドを潰してから、
----------
set _EXECJAVA=%_RUNJAVA%
goto gotTitle
:noTitle
set _EXECJAVA=%_RUNJAVA%
----------


%CMD_LINE_ARGS% %ACTION% 以降に ">console.log 2>&1" を追加する必要があります(4箇所)。
----------
.... %CMD_LINE_ARGS% %ACTION% >console.log 2>&1
----------


なお、IBM 製の JVM ではスレッドダンプは標準出力、標準エラー出力とは別にファイルに記録されるため、スレッドダンプ取得の目的ではこの操作は必要ありません。

2. プロセス ID の確認、シグナルの送信
Unix 系OS (Mac OS X, Solaris, HP-UX, Linux, AIX等) の場合、SIGQUIT 信号を送るためにプロセス ID を確認する必要があります。
$ ps |grep java

例)
$ ps |grep java
344 p1 S+ 4:32.83 /System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Home/bin/java -Xms32m -Xmx200m
2787 p2 R+ 0:00.00 grep java

3. シグナルの送信
・Unix 系OS (Mac OS X, Solaris, HP-UX, Linux等) の場合
スレッドダンプを取得したいタイミングで kill コマンドを使いシグナルを送信します。"-3" オプションを付けるのを忘れずに!
$ kill -3 [プロセスID]

例) $ kill -3 344

・Windows の場合
スレッドダンプを取得したい Java アプリケーションが起動しているコマンドプロンプトを最前面に持ってきて、キーボードの Ctrl と Break を同時に押下します。
Break キーは多くの場合キーボード上部右側辺りに位置しています。
ノートパソコンなどでは Fn キーと同時に押す必要がある場合があります。

4. リダイレクト済みファイルよりスレッドダンプの確認
スレッドダンプは決まったヘッダから始まります。スレッドダンプが記録されたファイルをエディタで開いて、以下のヘッダを確認してください。
・Sun / HP / Apple の JVM の場合
Full thread dump:
・BEA JRockit の場合
===== FULL THREAD DUMP ===============
・IBM の JVM の場合(※)
1XMTHDINFO Thread Info


※IBM 製の JVM ではスレッドダンプは JVM の起動ディレクトリに javacore.YYYYMMDD.nnnnnn.[pid].txt というファイル名で記録されます。


JRockit のスレッドダンプを確認している様子

次回はちょっと例外的な状況(Linux Threads を使っている場合Windows サービスとして起動している場合)でのスレッドダンプの取得方法について説明します。

タグ :
このエントリーをはてなブックマークに追加   

文葡両萄

近所のアーチェリー場で管理人さん達が一生懸命育てている葡萄が綺麗に実っていました。

市販されている葡萄みたいな強烈な甘さはないですがちょっと酸っぱくて素朴な味わいです。
もちろん無農薬。

タグ :
このエントリーをはてなブックマークに追加   

Pebble - JavaScript でコメントスパム対策 Round 2

Pebble - コメントスパム対策
・Pebble - コメントスパム対策 Round 2
Pebble - トラックバックスパム対策

先日 JavaScript の埋め込みでロボットのスパムコメント対策をしました。
毎日60〜100件のスパムコメントがあったのが、大幅に減りましたがその後も多いと日に10件程度の投稿があります。
コメントをくださっているのは以下の6人の方々。
Jeff : simpsons@yahoo.com
Andreos : support@greenworld.com
Pharmacy : john1980@hotmail.com
Andreos : support@greenworld.com
Online : lover87@mail.ru
Loan : gorodok@hotmail.com

考えられる理由は3つくらいあります。
1. スパム業者が対策を施した
非常にシンプルな防止策なので、JavaScript は解釈しなくても正しい POST 先さえ人間がロボットに教えてあげれば投稿できます。
しかし費用対効果を考えるとウチのサイトごときに特化した対策をいちいち施すことは考えにくいです。

2. JavaScript を解釈するロボットがいる
本当だとすればやはり JavaScript による対策は本格的なCAPCHAにはかなわないということでしょう。
しかし、技術上無理な話ではありませんが、そこまで凝ったロボットをいちいちスパム業者が作るとは考えにくいです。
何しろ非常に安いコストで大量のメッセージをばらまけるというスパムの本筋から離れてしまいますから。

3. POST 先の URI をキャッシュしている
毎回 HTML をクロールしてコメント投稿の URI をパースするのはスパム投稿のスループット上効率が悪いです。
単位時間あたりのスパム投稿数をあげるには前回スパム投稿が成功した URI をキャッシュしておく実装が考えられます。


というわけで、現実的には 3. が正解ではないかと思います。
なのでコメントの投稿先の URI を変えてまた様子を見ることにします。
目指すはコメント投稿をする人間に負担を掛けないスパム対策!
#とはいえ人間からのコメントはあんまないんですが・・・。トホホ

で、Pebble ではコメント投稿に使うパスは classes/action.properties で指定されているので以下のようにテキトウに書き換えて、対応する JSP(common/jsp/commentForm.jspf) も修正して再デプロイすれば Ok です。
< 11: addComment=pebble.controller.action.AddCommentAction
> 11: noSpamAddComment=pebble.controller.action.AddCommentAction

これでもダメなら JavaScript を解釈するロボットがいる可能性が高いでしょう。
それはそれで対策を考えてありますが・・・。
スパム業者との知恵比べのようでなんだか楽しくなってきました。

追記 12/26:
この対策以降コメントスパムは来なくなりました。

タグ :
このエントリーをはてなブックマークに追加   

iPod ゲーム - Votex 購入

iTunes 7 にアップデートしてから iPod を接続したら新しいファームウェアがありますとのお知らせが。
いままで別途用意されていた iPod アップデータが iTunes に統合されたみたい。
新しいバージョンは iPod ゲームに対応した v1.2!
そんなに遊ばないかもしれないけど早速ゲームを購入してみました。
iTunes StoreでiPod ゲームをダウンロード

買ったのは Apple オリジナルのゲーム - Votex。
ゲームを購入・ダウンロードすると iTunes の iPod ゲームという項目内に表示されます。
Mac/PC 上でゲームは遊べないので、iTunes 上では遊び方が読めるだけ。


iPod と Sync すると無事ゲームを遊ぶ準備が完了。iPod のゲームメニュー内にソリティアとかと並んで Votex が現れました。
選択して起動すると、読みこみにややまたせながらもそこそこカッコイイ画面が現れプレイ開始っ。日本の iTMS で購入したためかちゃんとローカライズされてます。
ゲームの内容はいわゆるブロック崩し。特徴的なのは円筒を下から見上げるような形でパドルの移動できる場所がループしていること。
パドルの操作はもちろんホイールで。
そこそこキレイな画面とカッコイイエフェクト、効果音でなかなか雰囲気を盛り上げてくれます。

一面の壁面をよく見てみると、さりげなくアップル本社の所在地である "Infinite Loop" の文字が。
#スクリーンショット中、左の黄色いラインの中に微妙に見えます



携帯ゲームとしてちゃんと考えられていて、ゲームの最中でも保存/中断して普通の iPod のメニューに戻ることもできます。

Apple Store(Japan)

タグ :
このエントリーをはてなブックマークに追加   

iTunes 7 - アートワークビュー

9/12発表の新製品群はこれだっ!と衝動買いしてしまうようなものはなかったのでおとなしくQuickTimeとiTunesのアップデートだけしました。

ゲームは Mac/PC/iPod で楽しめるなら実行環境は Java なのでは?と期待したけれども iPod でしか動作しないらしい。たぶん iPod ネイティブのバイナリなんでしょう。残念。

iTunes を起動して目に付いたのがいままでになかった表示切りかえボタン。


右側のボタンを押すとアートワークがずらずらずらっと並んでパラパラっと選べるビューになります。

静止画じゃわかりにくいけどレコード盤をパラパラっと物色する感じというと雰囲気つかみやすいかも。こりゃステキ!
ちょっとLooking Glassを彷彿させます。

アートワークがないアルバムはグレーに表示されます。自分の環境ではアートワークが貼り付けてあるアルバムが少なくてちょっと寂しいです。

あと細かな機能としてギャップレス再生もいいですね。CD では2つの曲なんだけど曲間が0秒で音が繋がっている曲同志を自動的に判別してブツッと言わせずに再生してくれるみたい。今までは曲を取り込む前に手動で曲同志をくっつける必要があったはず。

なんだかかゆいところに手が届いて満足!

Apple Store(Japan)

Apple Store(Japan)

タグ :
このエントリーをはてなブックマークに追加   

Pebble - JavaScript でコメントスパム対策

・Pebble - コメントスパム対策
Pebble - コメントスパム対策 Round 2
Pebble - トラックバックスパム対策

最近コメントスパムがひどいです。
以前 Pebble のバグデータベースに CAPCHA の実装例が載っていたけど、Pebble2.0 の公開にあわせてか過去のバグ情報が一切合切消されてしまった様子で見あたりません。

で、あんま凝った対策をするのも面倒なので、/common/jsp/commentForm.jspf にちょっと工夫をしてみました。

デフォルトでは form のアクションに存在しないダミーのアクションを設定しておき、サブミット時に動的に正式なアクションへ書き換えるというものです。
具体的にはこんな感じ。
<form name="addComment" action="dummy.action#form" method="POST" accept-charset="<c:out value="${blog.characterEncoding}" />">
.
.
.
<input name="submit" type="submit" onclick="this.form.action='addComment.action#form'" Value="<fmt:message key="comment.previewButton"/>" />
<input name="submit" type="submit" onclick="this.form.action='addComment.action#form'" Value="<fmt:message key="comment.addCommentButton"/>" />
<noscript>JavaScript を有効にしていないブラウザでは投稿出来ません。</noscript>

コメントスパムを登録するロボットの多くは JavaScript に対応していないだろうという仮定に基づいた対策です。
つまり、ロボットはダミーの URL に対して POST してしまうだろうということ。
JavaScript まで解析、実行してくれる利口なロボットには無意味だし、正しい POST 先はハードコードされているので対応するのは簡単ですが、個人レベルのサイトではそれなりに効果があるんではないでしょうか?

実際の効果の程は明日中にはわかるでしょう・・。

追記(9/11):
とりあえず効果があるみたい。
毎日数十件あったスパムコメントが0件にっ!

タグ :
このエントリーをはてなブックマークに追加   

エンドレスサーフィン

ミュンヘンでみつけたエンドレスサーフィン。
川の流れを使って失敗しなければ永遠にサーフィンできます。

失敗して川に落ちたら急いで泳いで岸に戻ってまた並ぶという具合。


初めて YouTube に動画をアップしてみました。

タグ :
このエントリーをはてなブックマークに追加