Hatena::ブログ(Diary)

零客痩地 このページをアンテナに追加 RSSフィード Twitter

2012-04-09

JavaScriptをロケーションバーから実行

この同人サークルさんのWebサイトをたまに見に行くのですが、ここってWeb拍手を分かりにくいところ(そうでもないかも…)に仕込んでいるんですね。それでこの前初めてWeb拍手をしたときに「これってJavaScriptで簡単に見つけられんじゃね?」と思いましたのでさっそく書いてみました。(そんなもんFirebug的なもので一発だろ、とかいう野暮なツッコミはなしで)

javascript:var elements = document.getElementsByTagName("a");var max = elements.length;for (var i = 0; i < max; i++) {if (elements[i].getAttribute("href").match(/http:\/\/webclap.simplecgi.com/)) {elements[i].focus()}}

これをロケーションバーから実行すればWeb拍手へのリンクが選択済みになるので、あとはエンターキーを叩いてやればOKです。

以上、初めてのJavaScriptのエントリとなります。これからはJavaScriptの時代らしいので(遅っ!)、ぼちぼちとJavaScriptのエントリも増やしていきたいですね。

2012-03-31

やっぱりSDIはおもしろいわ

先日こんなコメントを頂きましたので、

鈴風つかさ 2012/03/22 17:19

秋葉原Heyの2階でSDI稼働をお知らせ♪(3/22現在)

http://d.hatena.ne.jp/Hoshi-KN/20100316/1268783522#c

さっそくSDIをプレイしてきました

結果はご覧の通り。

20120330_SDI_6343340

スコアは素点(残機ボーナスが入る前の点数)で343340点。ミスは1,2回だったと思います。二日間プレイして上記のスコアを出せたときは、ようやく腕が戻ってきたなあと思いましたが、過去のエントリを見て驚愕。なんと過去の私は素点で212万。まさに桁違い。俺、こんなに高いスコア出せてたのか…。

原因はわかっていて、暫くやってなかったので隠しボーナスの場所を忘れてしまっているんですね。以前はこれを上限値の10万点まで出せてたんですけど、今回は1万点までしか出せていませんでした。パーフェクト取得率(敵全破壊)や死亡率は以前より良くなっていると感じたので、隠しボーナスの場所を覚え直せば以前の点数は簡単に抜けるはず。まあ、これからやり込んでいこうと思います。

ちなみに設定の方は以前のように残機無制限、残機ボーナスなし、ではなく、残4開始(プレイ中の自機含む)、5万エブリ(だったような…自信なし)、残機ボーナスあり(1機100万)です。

積みゲーが増えてきた

EDFとラピッドヒーローもやり込みたいし、バースもクリアしたい。家庭用だと鬼哭街(途中までやった)、シュタゲPSPまどマギシャイニングブレイド、Project mirai(一応クリア)、邪聖剣ネクロマンサーNR(あとは隠しボスのみ)、洞窟物語も残っててどうしたらいいものやら…。

2012-03-20

久しぶりのゲー戦果

つい先日の土曜日、久しぶりにゲーセンでがっつりと遊んだのでエントリを書いてみました。場所はおなじみ秋葉原Heyです。

EDF

5面まで。当たり判定が大きくて無茶するとすぐ被弾する。音楽が非常に良いのでクリアまでやり込む予定。

サイバリオン

クリアできたものの内容はへたれ

プチカラット

シーモンドたんがかわいかったのでプレイするも2面でゲームオーバー。ムズイっす。

雷牙

数年ぶりのプレイでしたがなんとか1コイン目で2周ALL。2周目3ボスで地形に突っ込んで自爆(当たり判定が消えてると思ってた)してしまい、それまでノーミスだったのが一気に地獄の展開に。自分でもよくクリアできたなと思います。

20120319_raiga_1740630

ラピッドヒーロー

2P側(難易度低い)で初のノーミスクリア。1P側でもがんばる予定。昔のエントリでも書いた気がするけど、やっぱり2〜7面の音楽はランダムみたいですね。

20120319_rapidhero_2916220

2012-03-02

Vimスクリプトの初心者がコマンドを定義してみた

仕事でとあるログを調査する機会が多いのですが(なんのログかはナイショだよ!)、grepで見やすくフィルタリングするための検索ワードをいちいち他のテキストからコピペで持ってくるのが面倒くさい。

そんなわけで、今回はVimスクリプトでコマンドを定義してどうにかしてみようと思います。とはいえVimスクリプトはまったくと言っていいほどの初心者(コピペオンリー)なので、まずはコマンドの定義から、ですかね。

コマンドを定義してみる

まずは決まったテキストから決まった検索ワードでgrepするだけのプロトタイプを作成してみます。grepにはvimgrepを使います。

下記の内容をgrepLog1.vimというファイル名で~/testに保存。

command GrepLog vimgrep /hoge/g ~/test/test.txt | copen

検索対象となるテキストとして~/test/test.txtを用意します。

hoge
fuga
hogehoge
hogefuga

それでは実行してみます。

まずはVimから:sourceで保存したスクリプトを読み込んで、続いて:GrepLogで実行。

:source ~/test/grepLog1.vim
:GrepLog

上手く動きました。(結果は明白なので割愛)

引数でファイルパスを指定できるようにする

コマンドの定義は上手くいったものの、ファイルパスを指定できないのでは実用には程遠いため、次はこの点を改善してみたいと思います。

command -nargs=1 -complete=file GrepLog vimgrep /hoge/g <args> | copen
  • nargs=1で引数を1つ受け取るように設定。-complete=fileで引数にファイルとディレクトリの補完が効くように設定。<args>が引数となります。これらの詳細は:help commandを参照。

これも上手く動きました。ワイルドカードで複数のファイルを指定しても問題ナッシングです。(例えばこんな感じ:GrepLog ./**/*.{log,txt})

引数により動作を変えてみる

先ほどの内容でも検索ワードをコピペしなくて済むため当初の目的は達成できたように思われますが、実は十分ではありません。というのも、私が調査するログは実行するオペレーションによって内容がかなり違ってくるため、検索ワードもそれに合わせて変える必要があるからです。(もちろんどんなオペかはナイショだよ!)

function GrepLogFunc(kind, filepath) abort
    if a:kind == 'alpha'
        let l:pattern = '/hoge/g'
    elseif a:kind == 'beta'
        let l:pattern = '/fuga/g'
    elseif a:kind == 'ganma'
        let l:pattern = '/geso/g'
    else
        let l:pattern = '/hoge/g'
    endif

    execute 'vimgrep' l:pattern a:filepath
    copen
endfunction

command -nargs=+ -complete=file GrepLog call GrepLogFunc(<f-args>)

ついに関数も初体験。行数も増え、少し本格的になってきたような気がします。今回は引数にログの種類(この例では'alpha', 'beta', 'ganma')を指定することにより検索ワードを変更できるようにしています。

特に難しいことはしていないため問題なく動くだろうと思っていたところ、vimgrepを実行するところでかなりハマってしまいました。最初はvimgrep l:pattern a:filepathのようにしていたのですが、引数が展開されない現象が発生。仕方がないのでexecuteを使うようにしたところ上手くいきました。なぜexecuteなしでは上手くいかなかったのか謎ですが、こういう解決方法もあるということで勉強になったので、まあよしとします。

あと、functionにabortを付け、||を使用して実行していたcopenをvimgrepが終わった後に実行するように変更しました。これでvimgrepでファイルが見つからない場合やマッチする検索ワードがない場合、すぐ関数を抜けるためcopenが実行されないようになります。

変数の前のa:やl:、コマンドから関数引数を渡すときの<f-args>は、それぞれ:help internal-variablesと:help commandを参照。

とりあえず動くようになったので今回はここまでとします。次回はユーザー定義の補完を使ってコマンド入力を簡単にできるようにする予定です。

2012-01-29

シェルスクリプトでPATHの追加と削除

会社である社内ツールのバージョン違い(2バージョンある)を併用することになった。このツールはバージョンごとに違うディレクトリインストールされているんだけど、両方のパスを通すと実行ファイル名が同じため被ってしまう。そんなわけで、使用するツールのバージョンを切り替えるために、PATHの追加と削除を行うシェルスクリプトを書いてみた。

#!/bin/sh
path_tool1=/opt/tool1
path_tool2=/opt/tool2

#PATHにtool1があれば削除
if [ `echo $PATH | grep -e $path_tool1` ] ; then
    PATH=`echo $PATH | sed -e "s@$path_tool1:\{0,1\}@@"`
    export PATH
fi

#PATHにtool2がなければ追加
if [ ! `echo $PATH | grep -e $path_tool2` ] ; then
    PATH=$path_tool2:$PATH
    export PATH
fi

unset path_tool1
unset path_tool2

逆バージョン(tool2からtool1)は省略。

sedの置換条件で:の量指定子を\{0,1\}(0回以上1回以下)に設定しているのは、PATHの最初だけでなく最後に追加されていた場合にも対応させるため。これは\?と等しいのですが、Macでは使えなかったため\{0,1\}という書き方にしています。会社のUbuntuでは使えたんですけどね。あと、量指定子でn回以下を指定するとき\{,n\}という書き方を見かけますが、これもMacで確認したところ使えませんでした。

最後になりますが、実行はsourceか.(ドット)コマンドで。じゃないとシェルスクリプトを抜けた後、環境変数シェル変数が元に戻っちゃいます。