blog.handlena.me

コード書いたりゲームしたり

  • ファイルがなければ作ってemacsで開くコマンド

    ※MacのCocoa Emacsを使っている場合のはなし alias e="open -a emacs" いままでは .zshrc に↑のようなエイリアスを作ってファイルを開くショートカットにしていた。 $ e hoge とすればカレントディレクトリの hoge というファイルを emacs で開けるという寸法。 ただ、ファイル hoge が無い場合は開けない。 $ e hoge The file /path/to/hoge does not exist. これはちょっとイヤなので、存在しないファイルは touch してから開くようにした。~/bin に e という名前でシェルスクリプトを作成。 #!/bin/sh if [ ! -e $1 ] ; then touch $1; fi open -a emacs $1; そのまんま、ファイルがなければ touch してから開いている。だけ。 (ファイルが存在しないときだけ処理を行う場合ってもっとスマートな書き方がありそうだけど、まあいいか) → 「!」付ければいいだけか!というわけで修正しました(2011-06-05 19:44)。 ※注意 .emacs で (server-start) としていないと新しいウィンドウが開いちゃいます。たぶん。

  • Ark::Plugin::Session::State::URIは携帯以外で無効になる

    Arkのプラグイン、Session::State::URI。 ark-perl/lib/Ark/Plugin/Session/State/URI.pm at master · typester/ark-perl · GitHub Session IDをURIにのっけて管理するためのものだけど、これはPC(携帯以外)でアクセスすると勝手に無効になるので注意。 60〜67行目あたりを抜粋。 if ($self->uri_rewrite_mobile_only) { my $agent = $self->context->can('mobile_agent') or $self->log( debug => q[Require MobileAgent plugin for this feature] ); if ($agent && $self->context->mobile_agent->is_non_mobile) { $self->uri_session_disabled(1); return; } } uri_rewrite_mobile_onlyが真の時のみ、携帯以外のAgentで無効になるようにはなっているものの、uri_rewrite_mobile_onlyは常に真になるようなのであまり意味ない。 21〜28行目。 has uri_rewrite_mobile_only => ( is => 'rw', lazy => 1, default =>sub{ my $self = shift; $self->class_config->{mobile_only} || 1; }, ); 携帯サイトをPCからプレビューしてて、「あるぇ、URLにSession IDが入んないぞ???」ときれいにハマった結果でした。携帯サイトつくるならおとなしくFireMobileSimulator使っときましょう。 追記: っていうのをTwitterでつぶやいたら id:sfujiwara さんが Sessionが無効になる場合にwarningを吐くようにしてくれました。感謝。

  • string-widthをインタラクティブに呼び出せるようにする

    emacsでリージョン内の文字数をしらべる場合は、リージョン選択時に M-x count-lines-regionとすればいい。count-lines-regionはデフォルトでは M-=に割り当てられている。 文字数ではなく文字幅を知りたい場合はstring-widthを呼び出せばいいのだが、これはコマンドとしては呼び出せない。 ので、リージョン内の文字幅をしらべる関数を定義してみた。 調べたい文字列をリージョンで選択して、 M-x string-width-in-regionとすればミニバッファに結果が表示される。

  • Teng で on_connect_do したい場合

    Tengをnewするときには、接続に必要な情報のほかに、オプションをいくつか渡すことができる。 で、そのオプションの中に on_connect_do というのがあって、その名のとおり、データベースに接続した際に実行するSQLを指定することができる。 on_connect_do の処理は Teng::connect() の中で行なわれているのだが、 new で dbh を渡すと Teng::connect() が呼ばれない(その時点で既に接続されているので)。 connect() が呼ばれないので on_connect_doで指定した処理は実行されない。 # これだとon_connect_doは実行されない my $teng = Admin::DB->new( dbh => DBI->connect( 'DBI:mysql:database=hoge;host=localhost;', 'username', 'password', ), [ on_connect_do => [ 'set names utf8' ] ] ); dbh ではなく conenct_info を渡すようにすれば Teng::connect が呼ばれるので、 on_connect_do も実行される。 # これならon_connect_doが実行される my $teng = Admin::DB->new( connect_info => [ 'DBI:mysql:database=hoge;host=localhost;', 'username', 'password', ], [ on_connect_do => [ 'set names utf8' ] ] ); サンプルのとおり、DB内のマルチバイト文字が化けるのをなんとかしたいというのが目的だったのだけれど、 set names utf8 は使わないほうがいいらしい・・・。

    Read more…
  • iTerm2 で "login: No such file or directory"

    いつからかiTerm2を起動すると ## exec failed ## login: No such file or directoryと出てすぐに終了するようになってしまっていた。 まあいいや、と思って標準の Terminal.app を使っていたが、iterm2のalpha17のアップデートが神 - soh335 memo らしいので、再び使えるようにちょっとググってみた。 で、引っかかったのがこちら。 mac - iTerm2.app stopped working - Ask Different 設定ファイル (~/Library/Preferences/com.googlecode.iterm2.plist) を削除する方法は効果がなかった。 ~/.MacOSX/environment.plist を preference list editor で見ると PATH の部分が空欄になっていたので、この項目を削除したら起動するようになった。

  • perltidyをPerl Best Practiceに即した形式にしてくれるパラメータ

    perltidy、便利ですね。なにも考えなくても(見た目が)きれいなコードになおしてくれます。 で、最近読んでるPerlベストプラクティスに、こんな設定例が書いてありました。 <blockquote> <pre class="code" data-unlink>perltidy -q -l=78 # Max line width is 78 cols -i=4 # indent level is 4 cols -ci=4 # Continuation indent is 4 cols -vt=2 # Maximal vertical tightness -cti=0 # No extra indentation for closing brackets -pt=1 # Medium parenthesis tightness -bt=1 # Medium brace tightness -sbt=1 # Medium square brace tightness -bbt=1 # Medium block brace tightness -nsfs # No space for semicolons -nolq # Don't outdent long quoted strings -wbb="% + * / x !

    Read more…
  • カタカナだけを半角に変換するelisp

    ケータイサイトではカタカナを半角で表示するのが慣習ですが、ぼくはこの変換をしょっちゅう忘れてしまいます。カタカナの書き直しのためだけにデプロイし直すのはなんともむなしいです。 そんなむなしさを解消するためにカタカナを半角カタカナに変換するelispを書きました。 最初から入っている japanese-hankaku-region を使ってカタカナを変換しています。japanese-hankaku-region はひらがなも半角カタカナに変換してしまうため、一度カタカナの文字列を検索してそれらを対象に処理をおこなうようにしています。 ファイル保存時に ktai-hankaku-katakana-buffer を実行すれば、変換し忘れミスはなくなるはずです。 今回初めてまともに elisp を書いたんですが、そもそもバッファの文字列を読み取る方法がわからなかったり、デバッグ方法がわからなかったりして(デバッグ方法はまだわかってなかったり)結局3時間くらいかかった気が…。 もっと身近な不便を解決するものを書いていきたいですね。

  • Macでsudo-ext.elを使う場合

    maeshimaさんの記事と、それに対する rubikitchさんの記事を見てMacでsudo-ext.elが使えるか試してみた。 たしかに、ただsudo-ext.elを入れただけでは使えない(emacsがフリーズ)。 で、最終的に使えるようになった手順は以下の通り。 portでsudoをインストール sudoeditを使うため。 $ sudo port install sudo sudoersを編集 visudoでsudoersファイルを編集する。 このときファイルを指定して編集するようにする。 $ sudo sudoedit -f /etc/sudoersファイルを指定しない場合、/opt/local/etc/sudoersが編集対象となる。emacsからsudoeditする場合はこちらのファイルは見ていないようなので、先ほどのようにファイルを指定して編集する必要がある。 sudoeditを起動したら「User privilege specification」の下に自分のユーザー名(またはグループ)を追加する。 # User privilege specification root ALL=(ALL) ALL %admin ALL=(ALL) ALL handle ALL=(ALL) ALL # <= 追加これでemacs上で M-x sudoedit が動くようになった。

  • クラスメソッドの引数は参照渡し?

    調べてみた。 適当なクラスを作って検証。 function Test(hoge) { this.hoge = hoge; } Testクラスのコンストラクタに値を渡してみる。 数値 値渡し(オブジェクト内の値は変化しない)。 var hoge = 4423; var test = new Test(hoge); console.log(test.hoge); // => 4423 hoge = 3244; console.log(test.hoge); // => 4423 文字列 値渡し(オブジェクト内の値は変化しない)。 var hoge = 'hogehoge'; var test = new Test(hoge); console.log(test.hoge); // => hogehoge hoge = ‘hugahuga’; console.log(test.hoge); // => hogehoge 論理値 値渡し(オブジェクト内の値は変化しない)。 var hoge = true; var test = new Test(hoge); console.

    Read more…
  • URLにアンダースコアが入っているとTwitterでshareできない

    http://twitter.com/share にurlというパラメータを渡すと、短縮URLが入力されたツイートウィンドウがひらく。 例: http://twitter.com/share?url=http%3A%2F%2Fd.hatena.ne.jp/handlename/20101223/1293114125&text=%e8%aa%ad%e3%82%93%e3%81%a7%e3%82%8b このurlパラメータのドメイン部分にアンダースコアが入っていると、エラーになる。 例: http://twitter.com/share?url=http%3A%2F%2Fd.hate_na.ne.jp/handlename/20101223/1293114125&text=%e8%aa%ad%e3%82%93%e3%81%a7%e3%82%8b ちなみに、RFCではアンダースコアも使っていいことになってるみたい。 An example HTML document