JSDoc 形式のコメントを追記する Vim スクリプトを書きました

JavaScript の関数に JSDoc 形式のコメントを追加する Vim スクリプトを書きました。

tanabe/WriteJSDocComment.vim - GitHub

実行例

JavaScript の function が書かれている行にカーソルがある状態で :call WriteJSDocComment() を実行すると下記スクリーンショットのように JSDoc 形式のコメントブロックが挿入されます。

対応しているタグ (ver 0.2)

  • @name
  • @function
  • @param
  • @return

インストールの前に

WriteJSDocComment.vimPerl で書かれているため、Vim が +perl オプション付きでコンパイルされている必要があります。VimPerl インタフェースに対応しているか確認するには、下記のコマンドを実行します。1 が表示されれば Perl インタフェースに対応しています。

:echo has('perl')

0 が返ってきた場合は、Vim を +perl オプション付きで再コンパイルしてください。

#ソースからの場合 (例)
$ ./configure --enable-perlinterp --enable-multibyte --with-features=huge

#MacPorts の場合 (例)
$ sudo port install vim +perl +multibyte +huge 

インストール

  1. GitHub のリポジトリから WriteJSDocComment.vim をダウンロードします。
  2. ~/.vim/ftplugin/javascript/ に WriteJSDocComment.vim をコピーします。
  3. 適当なキーに WriteJSDocComment() をマッピングします。

私は C-c で関数を実行するようにしました。.vimrc に下記を追記しています。

au FileType javascript nnoremap <buffer> <C-c> :<C-u>call WriteJSDocComment()<CR>

Yahoo!路線情報の「出発地」「目的地」を保持する user script

Yahoo!路線情報で、「出発地」と「目的地」の入力値を保持する user script を書きました (以前書いた物の改修)。

インストール

AutoFillYahooTransit.user.js

主な内容

  • ブラウザの「戻るボタン」で出発地/目的地が消えなくなります。
  • Firefox/Chrome で動きます。
  • 「駅の候補」が表示されなくなります。

jslint.vim を入れた

CentOSjslint.vim を入れました。コーディング中にリアルタイムで文法チェックをしてくれます。それほど重くもないですし便利です。

インストール

JavaScriptインタプリタ (SpiderMonkeyRhino、node.js) が必要なのでインストールはそこから。CentOSリポジトリSpiderMonkey があったので、yum で入れます。

$ sudo yum install js
$ git clone git://github.com/hallettj/jslint.vim.git
$ cd jslint.vim/ftplugin
$ cp -r javascript ~/.vim/ftplugin/

JavaScript/ActionScript プログラマによる Perl メモ

JavaScripter/ActionScripter 視点での Perl 入門メモ。ハマりどころというか。追記するかもしないかも。識者の方はツッコミください。

括弧省略

基本的に括弧は省略できる。演算子に見えて関数呼び出しだったりする。

print("hello");
print "hello";

$_ や @_

デフォルトという概念。

my @hoge = qw/apple banana orange/;
for (@hoge) {
      print $_ . "\n";
}

コンテキストという概念

カラコンテキストとリストコンテキスト。文脈によってスカラになったりリストになったりする仕組み。

my @hoge = qw/apple banana orange/;
my @foo = @hoge;
my $bar = @hoge;

print @foo;
print $bar;

リファレンス / 参照

サブルーチンに変数を渡す際は値渡しとなるので、リファレンスを使用する。

my @hoge = qw/apple banana orange/;
sub foo {
      my $items = shift;
            push @{$items}, "grape";
}
foo \@hoge;
print join ", ", @hoge;
#apple, banana, orange, grape

無名サブルーチン

JavaScript と変わらない。

my %hoge = (
 foo => sub {
   print "foo";
 },
);

$hoge{'foo'}();

モジュール

OOP

デバッグ

use Data::Dumper;
warn Data::Dumper $hoge;

参考書籍

Vim で「■」や「●」を正しく表示させる

ターミナルの Vim で「■」や「●」といった記号を入力すると、記号が半分になったりカーソル移動ができなくなったりと色々面倒な現象が起こります。これを解決するには .vimrc に以下を記述します。

if exists('&ambiwidth')
  set ambiwidth=double
endif

ambiwidth は Ambiguous Width の略語。ヘルプを引くと "East Asian Width Class Ambiguous" と書いてある。

また、 exists(&option-name) でオプションが存在するか判断できるそうです。

Flash ゲーム用のスコアランキングライブラリを作りました

Flash ゲーム用のシンプルなスコアランキングライブラリを書きました。先日作った「さめがめ」でも使っています。

ダウンロード

パッケージを GitHub のリポジトリからダウンロードしてください。

確認済みの動作環境

PHP のバージョンは 5.2 でも動作すると思います。

インストール方法

サーバへのインストール方法を解説します。

  1. データベース、ユーザを作成する。
  2. パッケージを解凍した htdocs 内の config.php を編集する。
  3. htdocs 内のファイルをサーバにアップする。
  4. ブラウザで setup.php にアクセスし、ゲームの設定を行う。
  5. サーバから setup.php を削除する。

1. データベース、ユーザを作成する。

下記の SQL は、データベース名 "score_ranking"、ユーザ名 "score_ranking"、パスワード "ranking" で作成しています。
SQL ファイルはパッケージの sql ディレクトリにもあります。

CREATE DATABASE IF NOT EXISTS score_ranking CHARACTER SET utf8;
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON score_ranking.* TO game_score@localhost IDENTIFIED BY 'ranking';

2. パッケージを解凍した htdocs 内の config.php を編集する。

config.php をエディタで開き、先のデータベース作成時の設定と同じ値を記述します。

define("DB_NAME", "score_ranking");
define("DB_USER", "game_score");
define("DB_PASSWORD", "ranking");

3. htdocs 内のファイルをサーバにアップする。

下記のファイルをウェブサーバにアップロードします。

4. ブラウザで setup.php にアクセスし、ゲームの設定を行う。

ブラウザで setup.php にアクセスし「ゲーム名」「シークレットキー」を入力してゲームのテーブルを作成します。ゲームは複数作成できます。

5. サーバから setup.php を削除する。

ウェブサーバから setup.php を削除します。

Flash ゲームからの呼び出し方法

次に、Flash ゲームからの呼び出し方法を解説します。

  1. ランキングの取得
  2. スコアの登録

パッケージの docs 内に API リファレンスが、sample 内には ActionScript 3 のサンプルライブラリが含まれています。

例では、アップロードした ranking.php の URL を "http://example.com/ranking.php"、ゲーム名を "ActionGame"、シークレットキーを "secretKey" としています。

1. ランキングの取得

ranking.php に固定引数 ?action=ranking を付けて、ゲーム名とスコアの数 (上位 N 個) を POST で送信します。

var urlLoader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("http://example.com/ranking.php?action=ranking");
var variable:URLVariables = new URLVariables();
variable.gameName = "ActionGame";
variable.total = 10;
request.method = URLRequestMethod.POST;
request.data = variable;
urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
urlLoader.load(request);

2. スコアの登録

ranking.php に固定引数 ?action=add を付けて、ゲーム名、ユーザ名、スコア、トークンを POST で送信します。

トークンは、ゲーム名、スコア、シークレットキーを結合した文字列の MD5 ハッシュ値です。ActionScript 3 用の MD5 ライブラリは as3corelib がおすすめです。

var urlLoader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("http://example.com/ranking.php?action=add");
var variable:URLVariables = new URLVariables();
variable.gameName = "ActionGame";
variable.userName = "testUser";
variable.score = 12345;
variable.token = MD5.hash("ActionGame" + "testUser" + 12345 + "secretKey");
request.method = URLRequestMethod.POST;
request.data = variable;
urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
urlLoader.load(request);

注意点

不正防止のためにシークレットキーやトークンを採用していますが、Flash の SWF ファイルは解析可能なため、完璧な対策ではありません。