SimpleReachを表示しないようにするユーザースクリプトを書いた。 Simple Reach Killer — Gist。SimpleReachはブログをスクロールすると右下の方にニョキッとおすすめがスライドされるというWordPressプラグインだ。非常にうっとうしい。
Google BookmarksをエクスポートしたりGoogle ReaderのOPMLをダウンロードするスクリプトを書いた。 Downloader for Google — Gist。中身は昨日のウェブ履歴スクリプトのgetを抜き出しただけ。単に指定URIをGETして指定ファイルに出力する。BookmarksやReaderに依存はしていない。
Googleのウェブ履歴をTSVにダウンロードするスクリプトを書いた。Downloader for Google history — Gist。検索履歴およびそのリンクを出力する。accountとpasswordにGoogleアカウントを指定して初回はmax_page=3などとして試すと良いと思う。0で無限頁。wait_secはGETごとのウェイト秒。たまにGoogleが応答せずにGETで落ちることがあるが失敗したURLをパラメータに指定すれば続きからダウンロードできる。
経緯としては単純で、Googleの検索履歴がウェブ履歴で表示できることは知っていたのだがエクスポートする機能が見当たらなかったので地道にHTMLから抜くことにしたというだけ。正規表現で抜いているのでウェブ履歴のHTML構造に強く依存している。使い捨てスクリプト。Strawberry Perl 5.12 WindowsXP SP3で動作を確認した。
Google Readerをコンパクトにするユーザースクリプトを書いた。 Google Reader Compact ― Gist。rawでインストール。
中身はCSSだけだがCSSだけを抜き出してStylishに組み込むと、ショートカットキー u によるサイドバー(#navi)の開閉がうまく動かない。uでサイドバーを消したときに、エントリーの横幅がサイドバー分だけ広がる、というのが期待する動きなのだがStylishでは広がらなかった。理由がよくわからない。個人的にStylishは必須アドオンではないので無視した。関連: google reader themes and skins - userstyles.org
Firefoxで開いている全てのタブのURLをクリップボードにコピーしたかったのでuc.xulに以下を追加した。
window.ucjs_copyAllUrl = function() {
var clipboard = Components.classes['@mozilla.org/widget/clipboardhelper;1'].getService(Components.interfaces.nsIClipboardHelper);
var tabs = gBrowser.mTabContainer.childNodes;
var txt = '';
for (var i = 0; i < tabs.length; i++) {
txt += gBrowser.getBrowserForTab(tabs[i]).contentDocument.location + '\r\n';
}
clipboard.copyString(txt);
};
Ctrl-Alt-dで呼び出すためのkeysetの例。
<key id="copy-all-url" key="d" oncommand="ucjs_copyAllUrl();" modifiers="accel,alt"/>
userChromeJS 1.4にて確認。
VMware Player 4.0をインストールしたらVMWare関連のサービスが常に4つ走るようになった。たいしてメモリを消費しないのだが、VMWare Playerの使用頻度は低いので4サービスを一気に開始/終了するバッチファイルを書いた。vm.bat:
@echo off
tasklist /FI "IMAGENAME eq vmnat.exe" | find "vmnat"
if "%errorlevel%"=="0" (
echo Stop VMware services.
net stop "VMWare NAT Service"
net stop "VMWare DHCP Service"
net stop "VMWare Authorization Service"
net stop "VMware USB Arbitration Service"
) else (
echo Start VMware services.
net start "VMWare NAT Service"
net start "VMWare DHCP Service"
net start "VMWare Authorization Service"
net start "VMware USB Arbitration Service"
)
exit /b 0
netでなくscでも同じ。
FizzBuzzを書いたことがなかったのでPerlで実装してみた。仕様はこれ。
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
で、まず書いたのがコレ。
#!/usr/bin/perl
use strict;
use warnings;
for my $n (1 .. 100) {
my $val =
($n % 3 == 0 && $n % 5 == 0) ? 'FizzBuzz' :
($n % 3 == 0) ? 'Fizz' :
($n % 5 == 0) ? 'Buzz' : $n;
print $val;
}
__END__
シンプルにfor文のみで書いてみた。だが同じ文字列や条件が重複しているところが気になる。条件演算子も長い。ということで書きなおして第2弾。
sub fizzbuzz {
my ($n, $rv) = @_;
$rv = 'Fizz' unless ($n % 3);
$rv .= 'Buzz' unless ($n % 5);
$rv ? $rv : $n;
}
print fizzbuzz($_) for (1 .. $ARGV[0] || 100);
サブルーチンにして、条件の重複をなくし、コマンドラインで最大数を指定できるようにした。無駄な条件演算子がなくなったのでスッキリした。しかし3や5の固定値がハードコードされているのがまだ若干きもちわるい。で書きなおして第3弾。
my $Data = {
3 => 'Fizz',
5 => 'Buzz',
};
sub fizzbuzz {
my ($n, $rv) = @_;
foreach my $k (sort keys %{$Data}) {
$rv .= $Data->{$k} unless ($n % $k);
}
$rv ? $rv : $n;
}
print fizzbuzz($_) for (1 .. $ARGV[0] || 100);
固定値をハッシュリファレンスに追い出してみた。しかしこれだけだと「Nの倍数」しか条件にできない。もしこのプログラムにユーザーがいるとすれば、条件をわかりやすくカスタマイズできたほうが嬉しいんじゃないだろうか。で再び手を入れて第4弾。
my $Data = {
'$n % 3 == 0' => 'Fizz',
'$n % 5 == 0' => 'Buzz',
};
sub fizzbuzz {
my ($n, $rv) = @_;
foreach my $k (sort keys %{$Data}) {
$rv .= $Data->{$k} if (eval $k);
}
$rv ? $rv : $n;
}
print fizzbuzz($_) for (1 .. $ARGV[0] || 100);
データを条件式・値のペアにしてevalで評価してみた。実行コストはあがるが条件を自由に書きやすくなったと思う。まあここまでやったのだから、もう少し人間が読みやすい形にしてみよう。で第5弾。
my $Data = [
{
'expr' => '$n % 3 == 0',
'data' => 'Fizz',
},
{
'expr' => '$n % 5 == 0',
'data' => 'Buzz',
},
];
sub fizzbuzz {
my ($n, $rv) = @_;
for (@{$Data}) {
$rv .= $_->{data} if (eval $_->{expr});
}
$rv ? $rv : $n;
}
print fizzbuzz($_) for (1 .. $ARGV[0] || 100);
データをハッシュの配列にしてそれぞれexprとdataという名前をつけてみた。evalの行も読みやすくなった。データは大きくなったが、コードはすっきりしたのでこれはこれで良いと思う。
ありがちな「いかにコードを短くするのか」という方向もそれはそれで面白いが、可読性や拡張性・保守性などを主眼においても楽しい課題だと感じた。実はFizzBuzzを初めて知ったとき、脳内コーディングして「簡単簡単」で終わらせてしまっていたのだが、今回コードを実際に書いてみて、どう書いて・どうチューニングして・何に重点を置くのかなど、かなり個人差がでるのではないかと思った。シンプルゆえに思考過程がわかりやすいし、何を毛嫌いしていてどういうスタイルを好んでいるのか、そういった細かいところを端的に知ることもできそうだ。というわけでFizzBuzzの推敲過程をさらしてみたのだが、あまり有益になってないような気もする。FizzBuzzの真価は人とやりとりして思いがけない発見ができる点にこそあるのだと思う。それが良いことでもダメなことでも、洗い出されることの意味はあるにちがいない。 参考: どうしてプログラマに・・・プログラムが書けないのか? FizzBuzz問題を使って社内プログラミングコンテストを開催してみた - ITは芸術だ Acme::FizzBuzz - search.cpan.org
Stack Overflowを見ていたら変数を小文字にする方法 (原題converting string to lower case in bash shell scripting)というのがあった。要は
$a = "Hi all"
を
$a = "hi all"
のように小文字(hi)にしたいときどうするよ? というお題だ。trやawkやperlを使った回答は素直に理解できるのでここでは無視する。つまづいたのはbash4の答え。
echo ${a,,}
だけでいいという。ちょっとまて短すぎる。こんな書きかたあったっけ?と思って手元で試してみたところちゃんとhiになる。この展開は知らない。ということでman bashしてみるとParameter Expansionにしっかり記述があった。
${parameter,,pattern}
Case modification. This expansion modifies the case of alpha-
betic characters in parameter. The pattern is expanded to pro-
duce a pattern just as in pathname expansion.
なるほど。patternにそってlowercaseという変数展開だった。pattern省略時は?になるので文字ごとにマッチする。ちなみにサーカムフレックス(^^)ならuppercaseだ。カンマ(またはサーカムフレックス)が一つのときは最初の文字だけが対象になる。bash 4から追加されていたらしい。
Googleのインスタントプレビューを消すユーザースクリプトを書いた。 Google Instant Previews Killer for Greasemonkey — Gist
Googleのインスタント検索を設定で切ったはずなのに何度もゾンビのように蘇る現象で困っているのなら検索パラメータにcomplete=0を追加すれば幸せになれる。例: tumblr - Google 検索。ただしこれはオートコンプリートをオフにするパラメータなので以下のような候補遊びができなくなる。

インスタント検索の問題は「設定でオフにしてもいつのまにかオンになる」こと。Twitterでインスタント検索を検索すると、勝手に設定がオンに戻って困惑している人が散見される。「オートコンプリートは必要、インスタント検索は不要、勝手に設定がオンに戻らないようにしたい」。これを実現するためにはgoogle.co.jpのcookieであるPREFのexpireを適当に延長してリードオンリーにするのが手っ取り早いのだが、正直とても面倒臭い。結局自分はFirefoxのabout:configのkeyword.URLを以下のように設定している。
http://www.google.co.jp/search?ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox-a&complete=0&q=
普段はFirefoxのロケーションバーで検索してオートコンプリートを使いたいときはCtrl-Kで検索バーを使うかGoogleを普通に開けばいいだけだ。オートコンプリートのメリットよりも、いつもインスタント検索が有効になっていたりいつのまにか設定がオンに戻っているような心理的デメリットのほうがはるかに大きい。参考: Firefox4.0のロケーションバーから検索をしたい