Mac を使っているなら必ず使うべき2つの機能 "Automator" と "サービス"


Automator ってなんか超高機能なマクロみたいなイメージがありますが、とても便利なのでご紹介。

もともとは、会社の上司が Windows から Mac に移行したのだけれど、"秀丸みたいに選択範囲を ruby で evalできないの" とおっしゃっており、しかも Emacs は微妙とのことなので、Automator でどうにかしてみた。Service でできるんじゃないかねと教えてくれた同僚に感謝。

追記(2013/02/24)

デバッグ方法を別エントリに書きました

できること

文字列選択して Ctrl+= を押すと選択文字列が ruby で実行されます。編集可能なテキストエリアならだいたい何処でも。

作り方

  • アプリケーション ディレクトリにある Automator を起動します。
  • 新しくサービスを作ります

  • "ruby -Ku" と書く

  • ドロップダウンリストで選べるオプションは画像のとおりに。
  • 名前をつけて保存する。たとえば "doRuby"
  • ショートカットーキーを設定する
    • "システム環境設定" を開いて、"キーボード"項目の、キーボードショートカットタブをクリック
    • 左カラムのサービスを選ぶと、さっき保存した右カラムに doRuby があるので、すきなショートカットキーを設定


  • テキストエリアで、ruby のコードを選択する。さっき決めたショートカットキーを押す。コードが実行される。

  • Ctrl-z で動作を取り消して、もとのコードに戻せるのもポイント高いですね。

ポイント

  • シェルスクリプトの標準入力になんでも渡せる。ファイル名を渡したりも出来る。ほとんどなんでも出来るじゃん。
  • つくったサービスは、コンテキストメニュー出るようになる!
  • つくったサービスは、ショートカットキーがセットできる。
  • Ctrl-z でやりなおしできる。


ショートカットキーが設定できるのが、とても重要で、画面ロックのショートカットキーも簡単にできます。

画面ロックの作り方

  • 途中まではさっきの例と同じ

  • こんな感じで"スクリーンセーバーの開始" をするだけのサービスを作成
  • 名前つけて保存
  • 上の例と同様に、ショートカットキーを設定

とすれば、画面ロックのための service になります。

発展型

スクリーンショットを撮って、fotolife に upload する。という gyazo みたいなスクリプトが一時期はやりましたが、これもショートカットキーから呼べるとかなり便利です。

use strict;
use warnings;
use Config::Pit;
use WebService::Hatena::Fotolife;
use IPC::Run qw(run);

my $conf = Config::Pit::get("hatena.ne.jp");
my $file_name = $ARGV[0];
my $tmp_filename = '/tmp/screencapture.png';

if ($file_name || run(['screencapture', '-i', $tmp_filename])) {
    my $hatena = WebService::Hatena::Fotolife->new;
    $hatena->username($conf->{user});
    $hatena->password($conf->{pass});

    my ($date) = $hatena->createEntry(
        filename => $file_name || $tmp_filename,
        folder   => 'work',
    ) =~ /(\d{14})$/;
    my $url = sprintf "http://f.hatena.ne.jp/%s/%s", $conf->{user}, $date;

    run(['open', $url]);
}

こんなスクリプトを書いておいて、

こうやってサービスを作ると、ショートカットキー一発で、スクリーンショット取得と fotolife への upload まで完了できます。

MeCab の辞書に単語を追加して利用する

いつも忘れるのでまとめておこう。
辞書と言ってもきちんとコストを計算して複雑な形態素解析をするわけではなく、
Wikipediaの項目名などを名詞として文章から抜き出すために追加するとかそういう例。
単語の活用も考えない。

1.もとになる単語のリストをつくる

上達の法則,0,0,-8944,名詞,一般,*,*,*,*,*,*,*
ツブカラカサタケ,0,0,-18101,名詞,一般,*,*,*,*,*,*,*
旗艦・三笠,0,0,-8944,名詞,一般,*,*,*,*,*,*,*
マルシェ志摩,0,0,-11757,名詞,一般,*,*,*,*,*,*,*

まあこんな感じのCSVを作る。カラムは左から順に

表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音

http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html

となっているのだけれど、左文脈ID,右文脈IDは今回は利用しないので0でよい。品詞から右は品詞,品詞細分類1ぐらいが書いてあれば実用に困らない。

問題なのはコストで、これが小さいほどその単語としてきり出されやすくなる。
今回は正規表現の最長一致のようになるべく長い単語切り出してほしいので、文字列の長さに応じてスコアが小さくなるような設定をしている。
なので1行目と3行目は同じ長さがなのでスコアが同じだし、"ツブカラカサタケ"は長い文字列なのでスコアが小さくなっている。

このへんのスコアの付け方の感覚はイマイチわかっていなくて、詳しい人がいたら教えていただきたい。

2.csv から dic ファイルへ変換

さてこのcsvを直接mecabは読みこんでくれないので、独自形式に変換する。csv ファイルが words.csv、 作る辞書ファイルを original.dic とする。

$ /usr/local/Cellar/mecab/0.98/libexec/mecab/mecab-dict-index -d /usr/local/Cellar/mecab/0.98/lib/mecab/dic/ipadic -u original.dic -f utf8 -t utf8 words.csv

これは osx で homebrew を使って mecab を入れている場合の例。自分の環境に合わせて変更すると良い。
mecab-dict-index が辞書を変換する実行ファイルで、-d のオプションがシステム辞書のある場所、 -u オプションが作る辞書の名前, -f が csv ファイルの文字コード、-t が作る辞書ファイルの文字コートになる。

3.作った辞書の利用

mecab -u original.dic

と -u オプションで作ったファイルを渡せば、ユーザー辞書も有効になる。システム辞書も有効なので注意。

Text::MeCab から利用する場合は、コンストラクタ

my $userdic = '/PATH/TO/original.dic';
my $mecab = Text::MeCab->new({ userdic => $userdic });

と指定してあげればよい。

MeCabさん、登場から随分たつけどやっぱり便利ですね。

詳しい解説は http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html も参考に。

ペパボのSQALEでsinatraしてみた

paperboy さんの、SQALE のbetaテストに参加できたので、Sinatra を動かしてみた。GettingStartrails なんで面食らってしまったけれど、要は rackup のための config.ru がリポジトリのトップレベルにアレばいいようだ。(参考 http://docs.komagata.org/4927)

用意するもの

ということで、Sinatra で書かれたアプリと、最低限の設定ファイルを用意する

config.ru
require './app'
run Sinatra::Application
app.rb
require 'sinatra'
get '/' do
  'Hello World'
end
Gemfile
gem "sinatra"

bundle install

上記の3つのファイルを用意したら、

$ bundle install

として、Gemfile.lock も作る。

あとは

SQALE のダッシュボードで作成した、アプリケーションのリポジトリに入れて、push するだけ!反映されないようだったら、

$ /etc/init.d restart

するとよいかも。しなくても反映されていたりする。

まとめ

config.ru と Gemfile を用意するだけで rack アプリが動くので便利!

ついでなので、ab してみた

ちゃんと対策されてた><

kurai-no-MacBook-Air:r_kurain% ab -H "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" -c 10 -n 100 "http://bench-kurain.sqale.jp/"
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking bench-kurain.sqale.jp (be patient)...Send request failed!
Send request failed!
Send request failed!
Send request failed!
apr_socket_recv: Connection reset by peer (54)
Total of 23 requests completed

nginx はデフォルトで merge slash する

久しぶり技術ネタを一つ。

問題

nginx を reverse proxy として使っていると

original http://example.com/hoge/huga//path
proxied http://example.com/hoge/huga/path

みたいな感じに重なったslash を merge してから proxy される。path最後の '//path' が '/path' となって、状況によってはありがたい。これが default なのが良いかは分からないが。slash は 2 以上連続していると、1つになる。

さらに、

original http://example.com/entry/http%3A%2F%2Fwww.hatena.com%2F
proxied http://example.com/entry/http%3A%2Fwww.hatena.com%2F

と、パーセントエンコーディングされている slash もmerge されてしまう。

backend で http://www.hatena.com/エンコードした文字列が来ると期待しているとはまる。

解決策

で、これを解決するには nginx.conf の設定に

Syntax: merge_slashes on | off
Default: on
Context: http, server
Reference: merge_slashes

http://wiki.nginx.org/HttpCoreModule#merge_slashes

というのがあるので、これを設定すればよい。

しかし!'Context: http, server' と書いておきながら、この設定は、default server の設定に書くか、http context に書かないと有効にならない。see(http://nginx.org/en/docs/http/ngx_http_core_module.html#merge_slashes)

default server の設定に書くと、すべての virtual host で有効になるようである。ある virtual host だけ有効/無効 にというのが出来ないわけだ。

まとめ

nginx を使っていると、スラッシュの数がバックエンドで少なくなってるということがある。設定で直せるけど、設定場所にも罠があるよ!!!

初めてのTOEICでスコア 830 を取るためにやったこと

3月にTOEICなるものを初めて受けたところ、先ごろその結果が郵送されてきた。
スコアは合計830で、内訳は リスニング 450、リーディング380 で、リーディングがちょっとお粗末な感じである。

そう酷い点数でもないので、使った教材を晒したうえで評価してみようと思う。
基本的にずぼらなので、なるべく教材は増やさない。頑張らないというスタンスである。


また、[英語]実質2ヶ月でTOEICを340点アップさせた、私の勉強法を公開します を参考にして、教材を決めたので選び方結構似通っている。

書いた順はほぼ実際に使った順である。勉強期間は実質1ヶ月くらい。
一番最後に、自分が思う最強の教材を載せたので、興味があるひとは最後だけ見ると良いかもしれない。

良かった教材

TOEIC Test 「正解」が見える【増補改訂第2版】

TOEIC Test 「正解」が見える【増補改訂第2版】

TOEIC Test 「正解」が見える【増補改訂第2版】

とりあず、TOEIC がどういう試験なのか全く把握してなかったので購入。TOEICの概要を掴むのに便利な本。サンプル問題が付いているので part1 から part7 までがどういう内容なのかわかりやすい。
練習問題も結構ついてるし、必須単語リストとかもあったけれど、ほとんど使ってない。TOEICに慣れているひとは不要だと思う。
一番役に立ったのは時間配分についてのアドバイスの

  • part 5, 5分
  • part 6, 25分
  • part 7, 45分

を目安にしたいという話だった(実際これを目安に練習している)。

リスニングセクションで How で始まる疑問文は Yes, No で答えられない。とか、質問文に出てきた単語は回答に出てこないとか、ノウハウぽいのは慣れてくるにつれて不要になるけれど、なかなか聞き取りが難しい練習初期には役に立った。

TOEICテスト リスニング 練習問題300問

新TOEICテスト リスニング 練習問題300問

新TOEICテスト リスニング 練習問題300問

リスニングは絶対苦手だと思っていた、というか上記の"「正解」が見える" の練習問題がわかんなすぎて焦って最初に買った本。
難易度としては、本番のTOEICより少し難しいかも。というくらい。(Amazonのレビューもそう書いてる人が多い)
300 問と書くと多いけれど、TOEIC3回分でしかない。この本は2周やった。
桐原書店は高校時代から安心の英語教材ブランドというイメージがあって買ったのだが、解説もしっかりしてるし難易度も適当でよい教材だったと思う。

TOEICテスト 文法・読解 練習問題300問

新TOEICテスト 文法・読解 練習問題300問

新TOEICテスト 文法・読解 練習問題300問

上記の本の、リーディング版。これも本番のTOEICより少し難しいかもという感じ。リスニングの方もそうだけれど、各partが3回練習出来るようになっている。
一日2part をこなすぐらいの分量で、これも2周やった。

TOEICテスト新公式問題集〈Vol.4〉

TOEICテスト新公式問題集〈Vol.4〉

TOEICテスト新公式問題集〈Vol.4〉

定番も定番なので、わざわざ書くことも無いとは思うけれど、本試験前にきちんと練習しておくのは大切だと思う。一冊に2回分の模試が入っているので、上の2冊の1周目が終わるくらいで1回、本試験直前に2回目を解いた。解き終わったあとにスコアの予測(+-50ぐらいの幅はある)が出るので楽しい。

VOA Special English News

Voice of America - Learn American English with VOA Learning English
アメリカ合衆国国務省が運営する、音声付きネットニュース。1500単語しか使わないで文章が構成されているので、Word Book(Voice of America - Learn American English with VOA Learning English) を覚えてしまえば辞書なしで読める事になっている。
速度もTOEICの試験と似たようなもので聴きやすい。多少プロバガンダなのを我慢して聞けるならとても良い教材。毎日2,3本のコラムぽい記事が公開されるので、面白そうなものを毎日昼休みに聞くようにしている。

  • 慣れるまでは 英文を目で追いながら聞いて
  • 慣れてからは 耳だけで理解出来るように

心がけた。
Googleのプライバシーポリシー変更とか、デジタルミレニアム著作権法改正についてのコラムなど、IT系の話も多いので面白い。コラムが面白くない日は、30分ニュース(http://www.voanews.com/mp3/voa/english/spec/SPECIAL_ENGLISH_NEWS.mp3 [mp3])を聞くようにしていた。こちらはスクリプトの英文が無いのが残念なのだけれど、時事ネタが英語で聞けて面白い。勉強中は大体シリアの話で鬱々とした気分ではあったけれども。
ちなみに、Special English ではない、普通の英語のニュース(VOA - Voice of America English News)もあるが、速いし語彙も多いのでかなり難しい。

ここまでは、やって良かった編。これ以降はなくても良かったかも。

まあまあだった教材

DUO 3.0

DUO 3.0

DUO 3.0

定番の単語帳。高校生のころやってる同級生がいっぱいいたなあ。などと思いつつひと通り読んだ。読んだだけなので効果の程はよくわからない。正直例文は全然覚えてないし、単語も7割ぐらいしか分からないのではないかとおもう。780点レベルとか書いてるけど、DUOを完璧に覚えてたらもう少し上の点になりそう。

TOEICテスト 特訓!文法・読解300問

新TOEICテスト 特訓!文法・読解300問

新TOEICテスト 特訓!文法・読解300問

上で紹介した本に超似ているけれど違う本(著者の方は同じ)。各partが3回づつ入っているという構成は同じなのだが、語彙がだいぶ高度になっていて難易度が高い。時間もなくて、結局2/3ぐらいしか解かなかった。とにかく難しくて、本番前に焦った。正解率が70%ぐらいで750点程度という難易度らしい。

TOEICテスト 特訓!リスニング300問

新TOEICテスト 特訓!リスニング300問

新TOEICテスト 特訓!リスニング300問

上記の本のリスニング版。これも難しい。リスニングは参考書を2周もすると回答を覚えてしまうので、もう一冊くらいやるかと思って買ったのだが、出来が悪くて本番前に焦る。しかし、難しい問題に慣れておくと本番レベルの問題が簡単に聞こえてよい。という効果は確実にある。

ユ・スヨンのブレークスルー990 TOEIC TEST 語彙・熟語・コロケーション1000問ドリル

自分の最も不得意なpartが、part5 の語彙熟語だったので、これは!と思って購入。しかし、一回8問のドリルを 125 回 + 復習を 4周というのは、僕の性格的に無理だった。最初の10回分で挫折。問題そのものは悪くないし、スコア 990 を目指すには必要なのかも。

ラングリッチ

http://langrich.com/
最近よく見る、フィリピンとskype でつないで行う英会話教室。先に上げた VOA を教材として知ったのはこちらのサービスで利用していた為でその点でとても感謝している。

VOAを教材にした場合、発音をチェックしてもらいつつ、音読して、内容のサマライズをその場するという授業になる。この授業はかなり面白いのでよかったのだが、無精な自分には毎日予約して英会話を続けるという事が出来なかった。リスニングの得点にもそんなに直結しなそうだったし。

ただ、ラングリッチに入会するにあたって、この手のサービスをいくつか比較したけれど、その中では群を抜いてよいサービスだった。よかったのは次の点

  • 回線が一番安定していた
  • 基本的にビデオチャットにしてくれる
  • 先生の後ろで犬が吠えていてうるさい。ということもなかった。(他社だとこういう信じられないケースがある

いろいろ余裕ができたら、TOEICとは関係なく利用したいサービスではある。

僕の考えるさいきょうのえいご教材

さて、僕が今まで使ったなかで最強の英語教材は、公文のSRSである。

公文式が嫌いでなければ、是非おすすめしたい。
最後に書いたのは、実際にやっていたのがもう10年以上前なので、今回の試験にどれほど影響しているか分からないからだ。週に2,3回、公文の教室に90分ぐらい通えば1年で完結する。自分の場合は大学受験英語のために使ったのだけれど、かなり役に立った。リーディング教材なので、もう少しリーディングスコアが良くないと説得力がないわけだが、少なくとも part 7 の長文読解問題にはとても効果があるし、長文英語への恐怖感がなくなる。大学在学中の論文よみなどにも役に立っていたと思う。本人の英語レベルにあわせて最初の教材を選んでくれるので、公文の先生に従って始めればそうそう失敗もないと思う。問題は近くに教室があるかどうか、というのと若干高めな月謝だろう。

勉強法など

これで教材の紹介はおしまい。これからTOEICを受ける人の助けになればと思う。ここに書いた以外の教材は全く利用していない。ある理由から、目標点数は850に設定しているので、今回のスコアでは足らなくて 5 月の試験も申し込み済みである。ライフハック的な勉強法もいろいろ試したのでいずれ書いてみようとおもう。

HTMLとJSとCSSだけでスクリーンセーバーが作れるHTMLScreenSaverBuilderを作った

作った


表題のとおりで、HTML と JavaScriptCSS の知識があればMacスクリーンセーバーを作れるツールを作りました。Xcode も不要です。
html でできることは大概できるので、flash 貼るとか audio ダグで音をならすとか、WebGLで3Dで遊ぶとかかなり何でも出来るのではナイかと思っています。

ダウンロード

下のリンクからどうぞ!HTMLScreenSaverBuilder 本体と、サンプルで作った ScreenSaver が入っています。
HTMLScreenSaver.zip 直

作り方

HTMLを準備

全画面表示されても、綺麗に表示されるような HTML を書きます。必ず名前は index.html にしてください。例として、はてなフォトライフの人気の写真を表示する HTML を書きました。

https://github.com/kurain/HotFotolifeSlideshow

HTML だけでなく、JSとCSSを使って実装します。上記の例だと、CSSで画像の中央寄せを行なって、jQuery + YQL で最近人気の写真一覧を取得しています。

一つのディレクトリに

HTML と付随する必要なファイルをひとつのディレクトリ以下に収めます。index.html より下位にあれば、ディレクトリをつくっても大丈夫です。

.
├── index.html
├── jquery-1.6.4.min.js
├── main.css
└── main.js
buildする

ダウンロードした、HTMLScreenSaverBuilder を起動します

こんな画面なので、名前を決めて、Local HTML file を選んで、上で用意したディレクトリを選択します。
あとは "build" をクリックするだけです。できた screen saver は ホームディレクトリ以下の、~/Library/Screen Saver に格納されるます。システム環境設定を起動して、スクリーンセーバーの設定画面にいけば、作ったスクリーンセーバーが一覧に出ているはずです。あとは、テストするなり、設定して楽しむなりご自由に。

ほかのHTMLの例


https://github.com/kurain/HatenaTweets

これは、Twitter 検索APIで、"はてな"を含む Tweet を全画面で表示する例。JSで実装できると、各種WebAPIとの連携が簡単にかけるのが非常に便利です。また、jQuery も当然使えるのでアニメーションなども plugin を駆使することでかなり簡単に書くことができます。

終わりに

webデザイナーさんとか、綺麗なサイトを作れる方々に遊んでいただけたら幸いです。このツールで作成されたスクリーンセーバーの再配布について制限は特にありません。有償で配布されても結構です。

ダウンロード(再掲)

下のリンクからどうぞ!HTMLScreenSaverBuilder 本体と、サンプルで作った ScreenSaver が入っています。
HTMLScreenSaver.zip 直

ではでは。どうぞご利用ください。

AA(アスキーアート)を読みやすくする Chrome 拡張をつくりました

AAReadable という Chrome 拡張を作りました


急になるべくどうでも良いものが作りたくなってChrome拡張を作りました。
名前の通りの拡張でブラウザで開いているページあるいは、選択している部分のフォントを変更してアスキーアートを見やすくする拡張です。

フォントを別途インストールする必要が無いところと、閲覧中のページに適切なCSSが無くても動くとこなんかがポイントです。

フォントについては textar webfont(http://font.textar.tv/) さんが、IPA Font License Agreement v1.0(http://ossipedia.ipa.go.jp/ipafont/index.html#LicenseJP)でfontを配布していらっしゃるのでそれを利用させていただいています。

使い方

https://chrome.google.com/extensions/detail/omooelimgkbkdfnnciofhjoopichcbok?hl=ja
からインストール。

AAを選択して、右クリックすると AAReadable のメニューがあるので"選択範囲を変更"すると、選択範囲内のフォントが変更されます。

"画面全体を変更" を選択すると、選択範囲に関係なく画面全体のフォントを変更します。

技術的ポイントなど

webfont面白いけど日本語フォント配布するのは重いし chrome 拡張に突っ込んだら googleホスティングしてくれないカナーと思って作ってみました。

無事ホスティングしてもらえたわけですが、2つポイントがあって、

すべての 'ttf' が webfont に使えるわけではない

AA用のフォントというと、モナーフォント(TK)とか、IPAモナーフォントなどが有名なのですが、これらに含まれているttf はどちらも chrome では利用出来ませんでした。僕のかいたCSSが間違っている可能性もありますが、おなじCSSでも、美咲フォントの最新アウトライン版に含まれる MisakiGothic_Outline.ttf は使えるのに、古い misaki.ttf は使えなかったりとルールが全然わかりません。

ttf にも色々種類があるんだろうなと思いつつそこまで追いきれていません。

chrome 拡張でページのコンテンツにアクセスする

chrome拡張はBookmarkletGreasemonkeyに比べると格段にセキュリティが意識されていて、メインとなる background_page から 現在開いているwebページのDOMに直接アクセスすることが出来ません。

しかし、

chrome.tabs.executeScript(null, {file:'file_name_of.js'}, function(){
      chrome.tabs.executeScript(null, {code:'functionInJs()'});
});

という感じのメソッドで、JS のファイルをアクティブなタブに読み込ませることはできるのでこいつがかなり便利です。第3引数のコールバック関数がなんのためにあるのか最初分からなかったのですが、これがかなり便利で、JSファイルの読み込みが終わったあとで呼ばれるのでJSファイルの中で定義している関数などが呼び出せます。逆にこう書かないで、chrome.tabs.executeScript を連続的に呼び出すとそれらは、非同期に実行されてしまうので、まえに読み込んだファイルにある関数を利用してというような事ができません。

という点ではまったりしたわけですが、chrome拡張は割と簡単につくれる上に色々使いではありそうなので、みなさんも何か作ってみてはいかがでしょうか。