2013年 09月 13日

アカウントが共有のサーバで自分だけの環境を構築する

もろもろの事情でアカウントが共有のサーバで、自分だけの環境を構築するためのメモです

以下は普通にインストール済みの前提 (インストールされてなくても入れればいいけど)

  • zsh
  • screen

screen 初回時

SHELL=$(which zsh) HOME=$HOME/cho45/ script -c "cd $HOME/cho45/ && screen -S main" /dev/null

アタッチ

SHELL=$(which zsh) HOME=$HOME/cho45/ script -c "cd $HOME/cho45/ && screen -r main" /dev/null

これで $HOME が ~/cho45/ 以下になるので、だいぶ自由になる。SHELL も指定して screen を起動しとくと面倒くさくない。script -c してるのは、su してログインユーザと別のユーザから起動するときのため。

このまま、~/cho45/dotfiles とかに dotfiles を clone し、~/cho45/.zshrc とかをつくれば特に問題なく環境ができる。

vim はシステム既存のものだとバージョンが古くてイラっとするので、自分でビルドして ~/app (元の HOME においては ~/cho45/app) とかに入れてパスを通してる。その他、node とかもそのへんに入れてパスを通してる。

2013年 09月 03日

正規表現からそれにマッチするランダム文字列を生成する String_random.js

var randomUrl = String_random(/http:\/\/[a-z]{3,8}\.example\.com\/([a-z]+\/){3}/);
console.log(randomUrl); //=> "http://nsgd.example.com/epij/tmvlh/bkjmsyahwhj/"

正規表現からそれにマッチするようなランダム文字列を生成する String_random.js というのを書きました。

Perl の String::Random みたいなのが JS でも欲しいなあと時々思うことがあったので作りました。括弧によるグルーピング・パイプによる選択も実装してあるのでそれなりに楽しい感じです。

String_random という名前は、String.random = String_random; できる感じのイメージですが、そのまま String に突っ込むと怒る人がいそうなのでこのような感じです。

ランダム文字列生成の活用方法を書きました。

2013年 07月 27日

Teng 0.19

メンテナになってからしばらくパッチあてたりしつつ放っておいたのですが、0.19 として出しました。

Teng::Row が結構書き変えられているので、そのへんちょっと気をつけて使ったほうがいいかもしれないです。inflate/deflate まわりの挙動をまともにしたつもりです。今までなんとなく動いていた感じだったので…… それにともなって set/get というメソッドが追加されています

また、kazeburo さんのパッチにより is_changed メソッドが追加されています。これにより実際は update しなくてもいいケースを簡単に判定しやすくなっています。デフォルトでは今まで通りなので実際にそうするには呼び出し側で判定をする必要があります。

0.19 には入れず、今後やろうとか思っていること

自分で書いたのは以下あたり。ちょっと冷却期間中です。

Teng::Row を Dumper したときに teng オブジェクトを全部入ってきてだいぶウザイのを inside out で消しさるパッチ。

search_by_sql/search_named は引数でテーブル名を指定して、どの Row インスタンスにするかを Teng に伝えることができますが、コピペとかをしていると実際の SQL の FROM に指定しているものと違うものを指定してバグることがあります。delete メソッドとかを呼ぶと、場合によっては間違って意図しない行を削除してしまうことがあり結構こわいです。

このパッチは指定した SQL に、引数で指定したテーブル名が含まれていなそうなとき (単に文字列として含まれているかどうか) に警告を出すようにするパッチです。

2013年 07月 22日

Perl徹底攻略 (WEB+DB PRESS plus) - 大沢 和宏

大沢 和宏

5.0 / 5.0

Perl 再入門の章を書かされもらっている。ベースは以前に WEB+DB PRESS に寄稿したもので、さらに少しアップデートを加えたものになっている。執筆者リストを見ると僕以外はみんなすごい人ばっかりだなーと改めて思う。

2013年 06月 28日

Gmail のメールからクレカ請求を Zaim へ自動入力

ひとまず楽天カードの情報を Zaim に突っ込むまでスクリプトにしてみた。Amazon のも入れれるようにしたい。

動作

初回起動時に OAuth を設定する必要がある

  • 楽天カードの「売上情報」メールをパースして入力している
  • 一度入力された情報は何度スクリプトを動かしても多重登録はされない
    • Zaim 上のコメントに点字符号 [⠃⢶⠒] を埋めこんで管理している (Gmail 上の UID をエンコードしたもの)
    • 同一日付内に該当メールから入力されたエントリが1件でもあれば無視するようになっている
  • カテゴリ・ジャンルは自動で推測して入れてる (payment_guess.conf に定義あり)

Zaim の API のメモ

Zaim の OAuth は oob (out-of-band いわゆるクライアントアプリケーション認証) に対応していない。callback に HTTP HTTPS のURIしか受け付けないので http://oob/ とか適当に指定しておくしかない。それで認証すると http://oob/ から始まるリダクレクト先URLが画面に表示されるので、クエリパラメータを頑張ってコピペしてやる必要がある。

それと Android 版の Zaim しか使っていないと気付かないんだけど、Zaim にはアカウント(口座のほうの意味)機能があって、現金・クレカ・PASMOとかを別々に管理できる。アプリだけを使っているとアーキテクチャを理解できないのでウェブ版を設定項目を含め一通り見たほうが良い。

最初、/v2/{account,category,genre} というデフォルトのものを返すAPIを使っていたが、これらのIDだと POST /v2/home/money/payment は、成功はしつつも、バグってしまう (ウェブ版で 500 がでる)。結局、/v2/home/{account,category,genre} を使うのが正しいみたいだ。(デフォルトを返すAPIはどういうとき使うのを想定してるんだろう)

また /v2/home/money/payment に place を指定すると {"error":true,"message":"This consumer key does not have a permission for the action.","extra_message":null} が返ってきてしまう。何かが悪いっぽいけどどうしたらいいかわかってないので、ひとまず指定しないようにした。

経緯

Google Spreadsheet で家計簿をつけていたが、いかんせん意識が低くなってくるとスプレッドシートを見る気がなくなるという問題があった。また、結構頻繁に辻褄あわせをする必要があるため面倒くさい。

基本的現状の運用だと

  • 現金で「消費したときに記録する」という行動の習慣化はできている
  • 今月あといくら使えるか、今週あといくら使えるか、などをうまく可視化できていない

みたいな感じになっている。それらを解決するために自分でウェブアプリを書いていたんだけど、最近は Zaim の Android アプリも普通に便利に使える感じなので、自分で作るより ASP なものを使ったほうがメリットが多そうと判断した。

本当は、直接 Google App Script から Zaim に OAuth を繋ぎたかったんだけど、どうしても OAuth エラーになって進まないので、諦めて Perl で書きなおした。

Perl で書きなおす途中でGmail を読むのにハマったり、上記の通り Zaim の API で結構ハマったりした。

2013年 06月 22日

任意の文字セットで数値をエンコードできる Encode::BaseN

短縮 URL なんかだと、Base58 (Base64の中から、表示上まぎらわしい文字を削除したもの) を使ってただの数値を短かくする工夫をしていたりするが、それをもうすこし汎用的に使いたいので書いてみた。

実用性に疑問があるので CPAN にあげてはいない。

経緯

ある文字数制限のあるフィールドに、できるだけ邪魔にならないように数値を埋めこみたいと思った。任意の数字なので、特に bigint になると数字そのままでは文字数がばかにならない。そこで Unicode を使ってエンコードすることを思いついた。バイト数的には不利なのだけれど、文字数による制限であれば、Unicode 文字はたくさんあるのでもっと短くなると考えた。

使う文字セットはなんでもいいけど、ぱっと見で脳が読もうとしない、意味を理解しないものがいいと思い探していたところ、点字だと、なんと丁度 256 文字あるし、ぱっと見がかっこいいのでそれでまず Base256 というのを作った。

ちなみにこれだと '9235113611380768826' という数値 (19文字) は、'⢀⠩⢶⣦⡚⢹⣀⠺' という文字列 (8文字) にエンコードできる。

ただ、Base256 だと汎用性がなく、なおかつ Unicode の点字の文字セットを使うというのだとあまりにもニッチすぎるので、任意の文字セットを使えるようなものならまだマシかと思い BaseN を作った。

2013年 06月 19日

Gmail のメールを OAuth で読む (Perl)

Gmail のメールを OAuth 経由で読むことができることを今更ながら知った。なぜかずっと「Gmail はユーザ名・パスワード認証しかできなくて不便だな〜 パスワード書きたくないな〜 OAuth できたらな〜」と OAuth ができないものだと思いこんでいた。

で、簡単に読めるモジュールがあるかなあと思ったけど、ちょっと見た感じではないので自力で書いてみた。

Gmail + OAuth の基礎知識

概要としては

  • OAuth のアクセストークンを得る
  • メールアドレス (アカウント名) + アクセストークンを使って SASL XOAUTH2 フォーマットの文字列を作る
  • IMAP を使い、AUTHENTICATE コマンドで上記文字列を送って認証する

という感じで、OAuth は使うけれど、WebAPI で Gmail が読めるわけではなく、最終的には普通に IMAP を喋る必要がある。

ログインまでは比較的簡単で、ドキュメントを読めばあまり問題なくできた。

日本語で検索をする

SEARCH X-GM-RAW という、Gmail のウェブ版のシンタックスでメールを検索する、という機能があるのだけれど、これを使うのにかなり難儀した。というのも、マルチバイト文字列を使う場合どうすればいいかドキュメントがなく、なんとなく適当に書いても動かない。

結論からいうと、マルチバイト文字列で検索したい場合

  • IMAP の仕様上の「literal」で送る必要がある
    • literal は {bytes} をコマンド引数で指定したあと、任意のバイト列を送れる仕様 (IMAP は 7bit プロトコルだが、ここだけは 8bit が通る)
  • literal の文字コードは UTF-8 でいい
  • CHARSET UTF-8 をつける必要がある

でもって、最終的に該当部分の IMAP のリクエスト/レスポンスは以下のようになる

> NIC4 UID SEARCH CHARSET UTF-8 X-GM-RAW {47}
< + go ahead
> subject:アクティビティ  newer:2013/06/01
>
< * SEARCH 241354 241543 241544 242493
< NIC4 OK SEARCH completed (Success)

答えさえ知ってれば難しくはないけど、かなりハマった……

2013年 05月 31日

CPAN のリリース管理を Minilla に変えてみる

$ cpanm Minilla

で入れると minil コマンドができる。既存レポジトリで (ここでは Test-Name-FromLine) minil migrate すると以下のようになる。

$ minil migrate
[Test-Name-FromLine] $ perl -I/Users/cho45/project/Test-Name-FromLine/lib -I/Users/cho45/lib/perl -I. Makefile.PL
Cannot determine perl version info from lib/Test/Name/FromLine.pm
Writing Makefile for Test::Name::FromLine
Writing MYMETA.yml and MYMETA.json
[Test-Name-FromLine] $ make metafile
Using Module::Build (Because this distribution uses xs)
[Test-Name-FromLine] $ git add cpanfile
Detecting project name from directory name.
Retrieving meta data from lib/Test/Name/FromLine.pm.
Name: Test::Name::FromLine
Abstract: Auto fill test names from caller line
Version: 0.09
[Test-Name-FromLine] $ git add -f LICENSE
[Test-Name-FromLine] $ git rm --quiet Makefile.PL
[Test-Name-FromLine] $ git rm --quiet MANIFEST
[Test-Name-FromLine] $ git rm --quiet MANIFEST.SKIP
[Test-Name-FromLine] $ git rm --quiet .shipit
[Test-Name-FromLine] $ git rm --quiet xt/99_pod.t
[Test-Name-FromLine] $ git rm --quiet README
[Test-Name-FromLine] $ git add .gitignore
[Test-Name-FromLine] $ git add .

既存の xt/podspell.t は消えなかったので消しとく。

Changes のフォーマットを Chagelog 形式にしていたのだけれど (vim で \o で簡単に新規エントリが書けるので……)、この形式だと minil release 時に怒られるので、新しい分からは変えることにする。Changelog 形式にしていたのは日付を手書きするのが面倒だったからなので、Minilla を使えばそれは解消される。フォーマット自体にこだわりはないので主流にあわせられるならあわせる気持ち。

PERL_MINILLA_SKIP_CHECK_CHANGE_LOG=1 にすればチェックを飛ばすことができるけど、気持ちが良くないのでそうしなかった。途中でフォーマットが変わるのもだいぶ気持ちが良くないのでなんともいえない。

すなわち

{{$NEXT}}

        - Append line number to exiting comment

みたいのを冒頭に書く。

$ minil release

すると新規バージョンを訊かれるので答える。これで release される…… はずなんだけど、Minilla は CPAN::Uploader を使っている。これは ~/.pause ファイルを読むのだけれど、cpan-upload-http より厳密なフォーマットを要求するので書きかえた (= があってはダメ)。

無事に upload までうまくいくと、git でタグが打たれて勝手に push された。こんにちは Minilla ありがとう ShipIt。

2013年 05月 30日

GNU screen の最新版を入れる

tscreen の時代はおわったらしい。cjkwidth などは本家に入っていた。

$ git clone git://git.savannah.gnu.org/screen.git
$ cd screen
$ cd src
$ ./autogen.sh
$ ./configure  --enable-colors256
$ make
$ sudo make install
$ screen -v
Screen version 4.01.00devel (GNUc2cd059) 2-May-06
2013年 05月 29日

OS X のマウス《加速》を切りつつスピードも自由に設定する方法

OS X のマウスポインターは加速がついていて、慣れられる人はこれでいいのかもしれないけれど、リニア反応しか受け付けない人間にとっては苦痛でしかない。

OSX のマウスの加速度がムカつく - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。 - subtech で書いたように、一応加速を切る方法はあるが、この場合、速度は変更できず、マウスの仕様に因ってしまう。

ほとんど諦めていて、まぁいいかと思っていたけれど、SmoothMouse というのを使うと、加速を切りつつスピード調整ができるようにもなった。すばらしい。

インストール時に Intelli Mouse をアンインストールしろよと言われるので、前もってアンインストールした。なのでそれらの機能と同時に使えるかはわからない。