monoの開発ブログ

プログラミングに関するメモ書きなど

GTKのキーバインドを変更する

キーバインドをEmacs風にする、という記事はそこら中にありますが、任意のキーバインドにする方法はなかなか見つからなかったのでメモ。

以下は、gtk-2.0でのやり方です。gtk-3.0の場合は参考のページを読めばできると思いますが、確認していません。

~/.themes 以下にテーマを作成し、作成したテーマを利用するように設定するという流れです。おなじみのEmacsという設定は、/usr/share/themes にデフォルトで用意されているEmacsというテーマを選択していたわけです。

$ mkdir -p ~/.themes/MyTheme/gtk-2.0-key
$ vi ~/.themes/MyTheme/gtk-2.0-key/gtkrc
gtkrc
1
2
3
4
5
6
7
binding "gtk-mytheme-text-entry" {
  bind "<ctrl>d" { "delete-from-cursor" (chars, 1) }
  bind "<ctrl>h" { "delete-from-cursor" (chars, -1) }
}

class "GtkEntry" binding "gtk-mytheme-text-entry"
class "GtkTextView" binding "gtk-mytheme-text-entry"
$ gconftool-2 -s /desktop/gnome/interface/gtk_key_theme --type string "MyTheme"

テーマの詳細な記述方法や詳しい話は、参考のリンク先やEmacsのテーマを参照してください。

参考

LaTeX用のMakefile

最近レポートをLaTeXで書くようになったので、Makefileを作ってみました。

Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
TEX = master.tex
DVI = $(TEX:.tex=.dvi)
PDF = $(TEX:.tex=.pdf)
AUX = $(TEX:.tex=.aux)
PRN = $(wildcard *.prn)
EPS = $(PRN:.prn=.eps)
 
.PHONY: all clean watch
 
all: $(PDF)
 
watch:
	pxdvi -watchfile 5 $(DVI)
 
clean:
	rm $(PDF) $(DVI) $(AUX) $(EPS)
 
$(PDF): $(DVI)
	dvipdfmx $<
 
$(DVI): $(TEX) $(EPS)
	platex $<
	platex $<
 
%.eps: %.prn
	epstool --copy -b $< $@

make でPDFを吐きます。make watch を使えば、dviファイルの更新を監視してプレビューを自動で更新します。

図はPowerPointあたりで作ることを想定していて、prnファイルを置いておけばepstoolでトリミングし、結果をepsファイルとするようにしています。

このMakefileはエディタに依存するものではありませんが、Vimでunite-build使うと便利ですよ。

Ruby 2.0.0-p0でOctopressを高速化

Ruby 2.0.0-p0でOctopressを動かしたらgenerateが速くなりました!やった~ o(^▽^)o

みたいな記事を書こうと思ったのですが、計測してみたところ、そういったことはありませんでした。requireはかなり速くなり、その他も若干改善したと聞いていたのですが、requireの速度は長時間処理を行う今回のような場合にはあまり影響しないでしょうし、その他の部分はそこまで劇的に変わるものではないのでしょうね。

Ruby 2.0.0-p0すげー!!!!11 的な記事を書きたかったので、高速化を確認できなかったのは少し残念ではあるのですが、大規模な変更で手元のコードがいろいろぶっ壊れるよりはいいかなと思います。

一応結果も貼っておきますね。対象はこのブログ (並列化gzip生成などの改造をした状態) で、計測に使ったマシンはMacBook Air (11-inch, Mid 2011)、CPUはCore i5 1.6GHzです。

こちらは2.0.0-p0。

## Generating Site with Jekyll
unchanged sass/screen.scss
Configuration from /Users/mono/work/blog.monoweb.info/_config.yml
Building site: source -> public
Successfully generated site: source -> public
noglob bundle exec rake generate  54.68s user 11.34s system 212% cpu 31.004 total

比較用の1.9.3-p392。

## Generating Site with Jekyll
unchanged sass/screen.scss
Configuration from /Users/mono/work/blog.monoweb.info/_config.yml
Building site: source -> public
Successfully generated site: source -> public
noglob bundle exec rake generate  53.94s user 11.26s system 213% cpu 30.595 total

誤差の範囲ですが、微妙に1.9.3のほうが速いという……。

HSPTVAPP betaを使ってみる

HSPTVのランキング機能を通常のアプリから利用できるHSPTVAPPのbetaバージョンが公開されました。HSPTVAPPを利用すると、通常のアプリからもHSPTVと共通のランキングを利用できるので、HSPをインストールしていないユーザーにもアプリで遊んでもらいやすくなります。

今回は、HSPTVAPPを組み込んでみたのでその方法を紹介します。ただし、公式に従って hsptv_up を使うと容量が膨らんでしまうので、非公式な使い方をしています。将来的に動かなくなる可能性がありますので、あらかじめご了承ください。

私は、HSPTV_STANDALONE という定数がある時は通常のアプリとして振る舞い、ない時はHSPTVのプログラムとして振る舞うようなヘッダファイルを用意しています。このヘッダファイルには hsptv_up の定義は含めておらず、内部的に利用している hsptv_send を直接利用することを想定しています。

スタートアップコードは別ファイルに分離しておき、#addition を使ってファイルが存在する時のみ自動で読み込むようにします。今回初めて #addition が便利だなと思いました。

myhsptv.as
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef MYHSPTV_AS_INCLUDED
#define global MYHSPTV_AS_INCLUDED

#define global HSPTV_RANK_MAX 30

#ifdef HSPTV_STANDALONE
# addition "startupcode.hsp"
# uselib "hsptvapp.dll"
# func hsptv_start hsptv_start $202
# func hsptv_send hsptv_send $202
# func hsptv_setini hsptv_setini $202
# func hsptv_getini hsptv_getini $202
# func hsptv_saveini hsptv_saveini $202
# ifdef HSPTV_STARTUP_CODE
    hsptv_start HSPTV_STARTUP_CODE
# endif
#else
# runtime "hsptv"
# regcmd 18
# cmd hsptv_send $00
#endif

#endif
startupcode.hsp
1
#define global HSPTV_STARTUP_CODE "..."

あとは、アプリ本体でmyhsptv.asを #include し、hsptv_send を使ってランキングを操作すればOKです。簡単ですね。もっとも、本格的に使うには名前入力などのUIを追加する必要がありますが。

去年のコンテスト応募作品であるまっすぐをHSPTVAPP対応にしてみました (ただし、名前はguestのみ) ので、参考にしてみてください。

巨大ファイルを作成する

巨大なファイルを高速に作るメモ。

実行結果はさくらのVPS 1GにUbuntu 12.10を入れた環境でのものです。

中身をゼロで埋める場合

埋めるというか空っぽのsparse fileですが。

1
2
3
4
5
$ time dd if=/dev/zero of=temp.bin bs=1 count=0 seek=1G
0+0 records in
0+0 records out
0 bytes (0 B) copied, 1.1289e-05 s, 0.0 kB/s
dd if=/dev/zero of=temp.bin bs=1 count=0 seek=1G  0.00s user 0.00s system 0% cpu 0.002 total

比較用

真面目に書き込む場合の結果です。

1
2
3
4
5
$ time dd if=/dev/zero of=temp.bin bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 29.3218 s, 36.6 MB/s
dd if=/dev/zero of=temp.bin bs=1G count=1  0.00s user 10.84s system 36% cpu 29.666 total

中身をランダムにする場合

擬似乱数でも気にしないのであれば、/dev/random/dev/urandom を流し込むより openssl rand コマンドを使うのがいいみたいです。

1
2
$ time openssl rand 1073741824 > temp.bin
openssl rand 1073741824 > temp.bin  35.07s user 1.35s system 99% cpu 36.524 otal

比較用

/dev/urandom を流し込んだ場合の結果です。

1
2
3
4
5
$ time dd if=/dev/urandom of=temp.bin bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 134.728 s, 8.0 MB/s
dd if=/dev/urandom of=temp.bin bs=1G count=1  0.00s user 105.87s system 78% cpu 2:14.98 total

参考

Google Chromeでニコニコ動画を観られない (Pepper Flashの件)

うちのGoogle Chromeでは、デフォルトの状態だとニコニコ動画の動画を視聴できません。

この問題自体は結構有名で、同梱されているPPAPIのFlash Playerを無効化し、NPAPIのFlash Playerを利用するようにして対応されてきました。しかし、少し前から無効化しても再起動すると復活するようになり、起動オプションの --disable-bundled-ppapi-flash も無視されるようになってしまいました。

しかし、抜け道はあります。pepflashplayer.dllを削除するなり移動するなりしてしまえば、ロードされることはありません。chrome://plugins を開いて場所を確認し、ファイル名を適当に変更すればOKです。バージョンアップすると復活してしまいますが、同じ作業を行えばまた次のアップデートまでは黙ってくれます。

chrome://plugins

ただし、PPAPIのほうがセキュリティは優れていますし、勝手にアップデートしてくれなくなってしまうので、そのあたりは自己責任でお願いします。個人的には、きちんとアップデートするのに加えて、プラグインをブロックすることをオススメします。勝手に動いてイライラすることもなくなるので一石二鳥だと思います。

プラグインをブロックする

# いくら推奨環境から外しているとはいえ、今時Google Chromeで閲覧できないのはどうにかしてほしいなと思います。誰が悪いのか知りませんが、早く解決してもらいたいですね。

Migemo Server for Google Chrome™を公開

Migemo Server for Google Chrome™という拡張機能を公開しました。

この拡張機能は、edvakfさんが開発されていたChromeMigemoからforkしたものです。ChromeMigemoは単体では他の拡張機能に対してAPIを提供する拡張機能で、拡張機能の開発者はChromeMigemoを利用することでMigemoを利用した高度な検索機能を簡単に実現することができました。しかし、Chrome 24ではChromeMigemoが拡張間通信に利用していたsendRequestonRequestを利用した拡張機能を作成できなくなり (呼び出すとエラーになります)、ChromeMigemoを利用できなくなってしまいました (ただし、すでにパッケージ化された拡張機能は動作するようです)。

この問題を解決したバージョンがMigemo Serverです。非推奨だったsendRequestonRequestの代わりにsendMessageonMessageを用いるようにしたほか、manifest_version: 2への対応など最近のChromeで動かすために必要な変更を行なっています。

forkという形をとっているのは、従来のバージョンと互換性がなくなってしまうことと、edvakfさんが現在ChromeMigemoを利用していないということが理由です。名称を変更したのは、ChromeMigemoと区別できるようにすることと、Branding Guidelinesに引っ掛かっていそうな感じがした (自信なし) ことが理由です。

利用時の注意点

先ほど述べたとおり、ChromeMigemoとの互換性はありません。ChromeMigemoに対応した拡張機能を利用する場合はChromeMigemo、Migemo Serverに対応した拡張機能を利用する場合はMigemo Serverをインストールする必要があります。

開発時の注意点

利用するAPIと拡張機能のidは変わっていますが、基本的な使い方は変わりません。注意点と言うほどのことは特になく、以下のようなコードで簡単に正規表現を取得できます。

1
2
3
4
5
6
7
8
9
10
var query = '...';
var params = { action: 'getRegExpString', query: query };

chrome.extension.sendMessage('dfccgbheolnlopfmahkcjiefggclmadb', params, function(response) {
  if (chrome.extension.lastError) {
    console.log(chrome.extension.lastError);
    return;
  }
  console.log(new RegExp(response.result));
});

今後の予定

特に機能拡張の予定はありませんが、今回の更新に伴う不具合の修正や、今後のChrome本体のバージョンアップに追従するための更新は行いたいと考えています。よろしくお願いします。

Windows 8のリセットを使う

リフレッシュしても調子が悪いので、今度はWindows 8の目玉機能の1つであるリセットを使ってみました。

リセット機能は、ざっくり言うとOSの再インストール機能なのですが、リフレッシュとは異なり何も残さず完全な初期状態に復元してくれます。ほとんどの場合リフレッシュすれば十分だとは思いますが、リフレッシュで解決しない場合には試してみるのも悪くないんじゃないかなと思います。ストレージの内容を完全に消去するオプションもあるので、PCを売ったり捨てたりする場合にも便利なのではないでしょうか。

リセットするとファイルが完全に削除されてしまうので、事前にバックアップをとっておく必要があります。バックアップには、Windows 8で追加されたファイル履歴機能を利用するのが便利です。ファイル履歴とは、Time Machine1時間ごとにユーザのデータのバックアップを自動で作成してくれる機能のことです。Time Machineと異なるのは、バックアップの対象がライブラリ、デスクトップ、連絡先、お気に入りに限定されていることでしょうか。リフレッシュを利用した場合にはUsersのファイルはほとんどがそのまま残りますが、ファイル履歴の対象はリフレッシュ機能で残る範囲とは異なるので注意が必要です。

リセット機能自体は問題なく動作し、15分程度でまっさらな環境にすることができたのですが、うちの場合はリセットしてもだめだったので、結局トラブルの原因はハードにあるっぽいです。こればっかりはどうしようもないので、地道に原因を特定するしかないですね……。とりあえずNVIDIAを疑ってます。

Windows 8のリフレッシュを使う

PCの調子が悪くなったので、Windows 8の目玉機能の1つであるリフレッシュを試してみました。

リフレッシュ機能は、ざっくり言うとOSの再インストール機能なのですが、いろいろ賢くなっていて気軽に使えるようになっています。具体的には、リフレッシュ前のユーザディレクトリの内容 (AppData以外) やアカウント、一部の設定などをそのまま残してくれますし、開始ボタンを押してから完了するまで人間が操作する必要は一切ありません。

Program FilesやProgramDataは削除されてしまう (というか別の場所に移動されてしまう) ので、従来のデスクトップアプリケーションは再インストールする必要がありますが、削除されたアプリケーションの一覧を出力してくれるようになっているので、それを見ながら作業すればそこまで苦ではありません。レジストリを使わないような小さなツールは、ファイルが残っているのでリフレッシュ後もそのまま使えます。他にもWindows 8スタイルのアプリはそのまま残るようですが、私は使っていないので未確認です。

これだけでも従来の再インストールより便利なのですが、使ってみて驚いたのはその速度。手元のマシン (Core i7 920、メモリ12GB、Intel SSD 510 120GB) ではリフレッシュ開始のボタンを押してからデスクトップに戻るまで約11分30秒でした。最低限使うアプリケーションをインストールし直すところまで30分も掛かりません。

しかも、なんと1月31日までなら古いWindowsをお使いの方も格安でWindows 8にアップグレードできます!!今ならまだ遅くないのですぐに買いましょう。7と比べてもかなり高速かつ細部が使いやすくなっていますし、Vistaからなら迷う理由はないはずです。XPは論外なので、もしWindows 8にアップグレードするつもりがないのであればLANケーブルを引っこ抜いてインターネットに接続しないようにしてください (正しい使い方がわかり、かつ実践できる人を除く)。

# リフレッシュするきっかけとなったトラブルがWindows 8のせいで起きたという可能性もゼロではありませんが、今のところ原因がわかっていないので何とも言えません (個人的にはWindows NTのトラブルはだいたいサードパーティのせいだと思います)。

2012年の記事を振り返る

2012年に投稿した記事の中で、人気のあった記事をまとめてみました。順番は古い順です。

アクションゲームを作ろう

作ろうというタイトルとは裏腹に、クソみたいなゲームが置いてあるだけに近い記事。かなりアクセスが多いので申し訳ないです。実はここにバージョン2が置いてあるので死ぬほど暇ならどうぞ。

HerokuでStreaming APIを使うTwitter Botを作る

Herokuを無料で使い倒すための記事です。ありがたく使わせてもらっているのですが、こんなに太っ腹で大丈夫なのかと若干不安になりますね。

Rubyで安全なWebアプリを作るためのメモ

その2ともども爆発的に伸びた記事。今年のアクセス数1位でした。

JavaScriptで一時的にスクロールを無効化する

予想外にアクセスが多い記事。ありがちっぽいのに意外と検索しても出てこないネタだからかもしれません。その2が結構進化しているつもりなのですが、検索の順位的な理由で先に投稿した記事のほうが人気みたいです。

最近のRubyなWebアプリの構成

うちで使っているミドルウェアやライブラリのリンク集的な記事。個人の小規模なWebアプリをどうやって構築すればよいのか、という情報がなかなか見つからないので書いてみました。他の人の記事が見たいです。

Windows 8の感想と設定メモ

Windows 8の感想を率直に書いただけ (+申し訳程度の設定紹介) の役に立たないタイプの記事なのですが、アクセスはやたら多いです。一般人が検索して飛んできているのでしょう。

まとめ

今年はかなりはてブを稼げたので、楽しく更新することができました。来年もよろしくお願いします。