遅れてきた人によるメモ

遅れてきた人は危険がいっぱい

プロジェクトでまとめられている画像達の差分を少しだけ簡単に調べる方法

お分かりいただけただろうか?

差分が気になるのはコードだけではないはず。たとえば、画像。画像の差分ほど分かりにくいものはないです。1枚程度であれば、ほへーって見比べたり、ImageMagick使って直接「2枚の画像のdiff(差分)を超簡単に調べる方法 - 昼メシ物語」をやれば良いのだけど、プロジェクトで大量に上がってきた修正画像の見比べとかなんだか面倒。というわけで、前のリンク先の方法とVimDirDiffに触発され、階層間での画像比較画像ができるコードを書いてみた。Bashとか完全にnoobなので改善の余地大いにありです。見るに耐えない箇所は教えてね。

注意事項: 今のところ拡張子が大文字のPNGとか想定外です

ImageMagickが必要なので、Macならbrew install imagemagick をしてください。で、パスの通っているところに置いて、chmod +x make-diff-img ってやってください。そしたら、make-diff-img Path1 Path2 Path3とすると、Path3の階層にPath1ディレクトリとPath2ディレクトリの比較で差分のある画像が作られちゃいます。

使用例: make-diff-img img/ver1/ img/ver2 img/diff

├── ver1
│   ├── imgA
│   │   ├── display-setting.jpg
│   │   └── point.jpg
│   ├── imgB
│   │   ├── hasami.jpg
│   │   ├── hashi.jpg
│   │   ├── iphone1.jpg
│   │   └── iphone2.jpg
│   └── lunch.jpg
└── ver2
    ├── imgA
    │   ├── display-setting.jpg
    │   └── point.jpg
    ├── imgB
    │   ├── hasami.jpg
    │   ├── hashi.jpg
    │   ├── iphone1.jpg
    │   └── iphone2.jpg
    └── lunch.jpg

こんな感じにver1とver2で比較する画像があったとしても、

$ make-diff-img img/ver1 img/ver2 img/diff
Start make-diff-img!
Checking difference...
1(1): /imgA/display-setting.jpg is difference.
2(2): /imgA/point.jpg is difference.
3(3): /imgB/hasami.jpg is difference.
4(4): /imgB/hashi.jpg is difference.
5(5): /imgB/iphone1.jpg is difference.
6(6): /imgB/iphone2.jpg is difference.
7(7): /lunch.jpg is difference.
End make-diff-img.

再帰的に調べてくれます。

f:id:jiroukaja:20140207215907p:plain

ちょっとの違いなら背景が真っ黒になります(上)が、全然違う写真だとすぐ分かります(下)。Macだと、ここまで作られれば、あとはQuickLookで流し見すれば大丈夫。

ちなみに、差分なしの真っ黒な画像は、diffさんが優秀なので作られません。

おまえんとこのGoogle、検索結果ショボくね?

ん?

MacのSafari電卓と単位変換 - ウェブ検索 ヘルプのリンク先が、私の環境だとちゃんと動かない。どうやら言語を英語などにしているとGoogleさんのドヤ顔が滑ってしまうらしい。なんだかショボい。というわけで、言語を「英語」にして検索した結果を見てみましょう。

Googleの設定言語を日本語にしていると異なった表示になる可能性があります

環境: OSX 10.9, Safari 7.0.1(9537.73.9)

100ドルを日本円に

f:id:jiroukaja:20131208103732j:plain

素直に検索結果を教えてくれます。

あれ?

100USDを日本円に

f:id:jiroukaja:20131208104245j:plain

お、おう…

仕方ないので

100 USD to yen」で検索

f:id:jiroukaja:20131208104516j:plain

英語で聞くと、2009年からのチャートもおまけにだしてくれます(「100 dollars to yen」でも結果は同じ)。

というわけで、安定のKeySearch - A Keyword Search Extension for Safariで、「https://www.google.com/search?q=@@@%20to%20yen」を登録。私は登録のキーワードをyとしてるので、これで思う存分「y 100USD」とか「y 100 DKK」とか「y 100 SEK」が出来るようになりました。

ちなみに…

言語を日本語にすると問題ないようですね。

f:id:jiroukaja:20131208105756j:plain

でも、前々から思っていたのだけどチャートがなく変化が分からないので要らない子です。本当にありがとうございました。

結論

日本語の仕様が追いついていないような感じがするので、不都合がなければGoogleの設定言語は英語にしましょう。

ついでに

17インチが何センチか知りたくなったりするので、長さの単位変換も「https://www.google.com/search?q=@@@%20to%20cm」で登録。キーワードはlで登録したので、これで17インチは何センチだ? と思っても「l 17 inch」とすれば、cm単位限定で変換できます。

f:id:jiroukaja:20131208114308j:plain

SafariのFlash周りとか

Terminal.appで環境変数の一覧が表示できるprintenvをやってみたら、$TMPDIRというものがあった。

echo $TMPDIRは、/var/folders/ls/******************************(任意の30文字)/T/

どうやらファイルを一時的に保存するところらしい。

ためしに、ブラウザでニコニコ動画のファイルを表示状態にしたら、

WebKitPlugin-******(任意の6文字)に、FlashTmp.******(任意の6文字)に保存されてた。

Flashの素材は入っていなかったので、そこらへんの仕組みは不明。

ここまで書いて2013/10/31にFlash Cache Saver - hetima.comが、Mavericksに対応したことを知る。

ためしにファイル名を見てみると完全に一致を確認。そういうことらしい。

 

余談: この変化は、Mavericksより前のMountain Lion、正確には10.8.4からあったような気がする。記憶だけで検証してません。devでSafari 6.1入れたのは後だったはず…

Safariのアドレスバーで日本の古本屋の古書検索

■検索方法変わった?

最近、日本の古本屋を使用する機会が減ったのだけど、久々に使ってみたら古書検索の結果が変わったらしく、アドレスバーで検索結果が入力できるようになってました。

■やりかた

まず、SafariのプラグインのKeySearchを入れます。ここらへんは、Mac Tips その8 〜Safari6 Extensions〜をみてください。追加したら新規で、日本の古本屋を登録します。

Keyword: k
Name: 日本の古本屋
URL: http://www.kosho.or.jp/book/keyword/@@@/1,100,1,0,0/

古書なので「k」で登録しました。

/@@@/の次の1はページ数、100は表示結果、1は書名(0は価格、2は著者、3は出版元、4は刊行年)、最後の0は昇順(1は降順)のようです。

f:id:jiroukaja:20130720074119j:plain

この状態で、

k 石灰工場

とタイプすると…

f:id:jiroukaja:20130720074658j:plain検索結果が表示されます。

Google Chromeだったら、アドレスバーを右クリックして登録するところで、 http://www.kosho.or.jp/book/keyword/%s/1,100,1,0,0/ とすればいいだけ。ただし、Chromeの場合は、日本の古本屋では複数単語の際は「+」らしいので、空白ではなく「+」で入力しましょう。

おしまい

moclを購入したのでiOS用のサンプルを動かす手順をまとめてみた(Common Lisp)

moclについて

moclとは、iOSとAndroid(現在)を開発するためのCommon Lispの実装です。moclを利用することで、iOS, Androidのアプリの一部をCommon Lispで開発できるようになります。つい最近のECLM 2013で発表が行われました。Common LispGUIが一昔前な印象を持っていたのでどんな感じなのかと思ったら、画面の表示周りはXcodeAndroidだとeclipse (今だとAndroid Studio?) に任せてしまうようです。で、どうやらllvm/clangでコンパイルして、それをアプリで使ってビルドするらしい。ちなみに、Androidだとndkに渡します。REPLに関しては、#-mocl (declaim (declaration call-in 関数名)) というようにmocl専用のコードはそれ以外の環境で読み込まれないようにして、Common Lispのプログラミング箇所は普段使ってるCommon Lispの環境で試してね、というスタンスらしい。moclと似たようなものにGambit Schemeというものがあるみたいですが、Scheme界隈は全く知らないため詳細不明。moclって、MObile Common Lispっていうことだろうか。moclについての情報は、公開されたばかりで現在全くありませんが、今後、本家のWukixがヘルプを作ってくれたり、色々な情報がウェブで賑わったらいいなと思うので1つ増やしてみました。

唐突にサンプルプログラムを動かすまで

ECLIM 2013のPDFとかmoclを買ったときについてきたMANUAL.pdfとかを見たり、twitterでエラー書いてたらWukixの人がそれとなく教えてくれたりしたので、iOSでサンプルプログラムを動かすまでの手順を書きます。

Xcode: version 4.6.3, iOS: 6.1, mocl: 13.06

まず、moclを購入します。個人で$199。今が買いかはちょっと不明。個人的には、値段よりmoclのソースコードが見えない&ヘルプがない(分からない)ため、今後、そこらへんが充実してほしいという期待を込めてご祝儀的な感じで買っちゃいました。

ターミナルのターン

前提条件としてダウンロードして展開したmoclフォルダはホームディレクトリーにあります (*username*はユーザー名)。とりあえずデフォルトでやってみることに。

$ pwd
/Users/*username*
$ sudo install mocl/bin/mocl /usr/local/bin/mocl
$ mocl
Could not find .moclconfig.lisp in your home directory. Create now? (y or n) y
mocl root directory location? [/Users/*username*/mocl/] 
ASDF registry location? mocl will search here for .ASD links [/Users/*username*/mocl/systems/] 
/Users/*username*/.moclconfig.lisp created.
mocl 13.06 Copyright (C) 2013 Wukix, Inc. (http://wukix.com)
usage: mocl [options] <file>
   or  mocl repl [options]
   target options:
    --android <dir>        Set target OS to Android. <dir> is an ADT (Android
                           Developer Tools) project directory for output
    --ios <dir>            Set target OS to iOS. <dir> is an Xcode project
                           directory for output
   general options:
    --help                 Print this help message 
    -O0                    Disable optimization
    -v, --verbose          Verbose mode
    --version              Print mocl version

これで、$ mocl で真っ先に呼ばれる .moclconfig.lisp が作られます。

次に、サンプルをgithubから取得します。moclの中には mocl/example/contacts/app.lisp があったのですが、これだけではどうしようもないのでgithubからとってきます。とういか、これで何をやるのだろう…

$ pwd
/Users/*username*
$ git clone https://github.com/Wukix/mocl-example-lisp-contacts-ios.git

しかしながら、このサンプルもこれだけでは動きません。

これはエラーが出るのでやる意味ないです
$ mocl --ios /Users/*username*/mocl-example-lisp-contacts-ios/LispContacts/ /Users/*username*/mocl-example-lisp-contacts-ios/app.lisp 
(app.lisp:2) Error in form (REQUIRE :VECTOMETRY)
 -> Don't know how to REQUIRE :VECTOMETRY

というわけで、これからasdfのターン。asdfに詳しくないので作法としていいのかどうかは不明。

$ pwd
/Users/*username*
$ cd mocl/systems
$ git clone https://github.com/xach/vectometry.git
$ ln -s vectometry/vectometry.asd vectometry.asd
$ git clone https://github.com/xach/geometry.git
$ ln -s geometry/geometry.asd geometry.asd
$ git clone https://github.com/Wukix/vecto.git
$ ln -s vecto/vecto.asd vecto.asd
$ git clone https://github.com/xach/zpb-ttf.git
$ ln -s zpb-ttf/zpb-ttf.asd zpb-ttf.asd
$ git clone https://github.com/xach/zpng.git
$ ln -s zpng/zpng.asd zpng.asd
$ git clone https://github.com/xach/salza2.git
$ ln -s salza2/salza2.asd salza2.asd
$ git clone https://github.com/fjolliton/cl-vectors.git
$ ln -s cl-vectors/cl-vectors.asd cl-vectors.asd
$ ln -s cl-vectors/cl-paths.asd cl-paths.asd
$ ln -s cl-vectors/cl-aa.asd cl-aa.asd

ここまでやると、Warningsが20個くらいでるけど通りました。

$ mocl --ios /Users/*username*/mocl-example-lisp-contacts-ios/LispContacts/ /Users/*username*/mocl-example-lisp-contacts-ios/app.lisp 

ここでは完全にmocl用でgit clone, ln -sの嵐ですが、asdfを普段のCommon Lispの環境で使っているなら、.moclconfig.lispasdf-registryに追加してもいいんじゃないですかね(適当)

Xcodeのターン

次に、mocl-example-lisp-contacts-ios/LispContacts/LispContacts.xcodeproj を開きます。

f:id:jiroukaja:20130628004621j:plain

すると、早速、エラーでお出迎え。

f:id:jiroukaja:20130628004622j:plain

#include "mocl.h"が見つからないというわけです。

プロジェクト内に専用のmoclフォルダが作成されている(mocl-example-lisp-contacts-ios/LispContacts/LispContacts/mocl)のですが、Xcodeのプロジェクトには認識されていないので、位置的にRunの下にあるタブ(Show the project navigator)をクリックして、File > Add Files to "LispContacts"からファイルを追加します。

f:id:jiroukaja:20130628004623j:plain

moclフォルダを選択します。

f:id:jiroukaja:20130628004624j:plain

補足moclのフォルダが表示される他に、libz.dylibが必要です。このサンプルにはありますが、自分でハローワールド的なものを作る場合は追加する必要があるようです。左のプロジェクト、targetsのアプリ名(LispContacts)、Build Phasesを順にクリック、Link Binary with Libraliesの[+]からlibz.dylibを選択して追加します。

f:id:jiroukaja:20130628004625j:plain

iOS Simulatorのターン

待ちに待ったRunのお時間です。

f:id:jiroukaja:20130627230122j:plain

こうなります。サンプルでは文字も画像にしているのか少し気になります。ちなみに、RetinaのiPhoneシミュレーターだと全然気になりませんでした。

f:id:jiroukaja:20130627230817j:plain

Email欄が、選択候補で隠れちゃうなー(実機では未確認)

f:id:jiroukaja:20130627230909j:plain

日本語は、

f:id:jiroukaja:20130627230926j:plain

だめでした…(ここらへんはutf-8とかで何とかなる?) <--- 設定変えたら表示された

■2013.06.28 am2:22 追記

日本語を表示できるようにするために

というわけで、Wukixの人から再度twitterでお告げが。

使用しているフォントのDejaVuSans.tffをArial Unicode.tffに変更するだけでいいらしい。テストなので /Library/fontsからArial Unicode.ttfをコピーしてlibz.dylibを追加した要領でファイルを追加します。

WuViewController.m 44行目

-    NSString *fontpath = [appFolderPath stringByAppendingString:@"/DejaVuSans.ttf"];

+    NSString *fontpath = [appFolderPath stringByAppendingString:@"/Arial Unicode.ttf"];

 あと、念のため、Product > Clean とシミュレーターのアプリも削除して入れ直しました。

f:id:jiroukaja:20130628021734j:plain

やったね!

まとめ

moclのサンプルをiOSで動かす手順なため、#include "mocl.h"とか、AppDelegate.mファイルの - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions内にcl_init();が必要とか、Objective-C内で呼び出すためには、(declaim (call-in 関数名))のように宣言する必要があるとかは飛ばしました。細かい箇所では何かしらトラップがありそうですが、Common Lispが使えるというだけでワクワクしますね。

MacVimでtagsを設定する話

Vimで&filetypeによってtagsを変えるには

set tags+=で言語別に作成した複数のctagsファイルを設定していたため、unite-tagで :Unite tag して言語関係なく全てが読み込まれてしまいどうしたものかと思ったら、

と暗黒美夢王からお告げが。

こうすると、&filetypeがvimでは、./tags,tags,.vim/tags/vim.tags が、&filetypeがlispでは、./tags,tags,.vim/tags/lisp.tagsが、それぞれ適用されるようになるようです。基本的なことが分かっていなかったためにプラグインを無理矢理変えてしまおうという発想しか思い浮かばなかったので反省。

単発: MacのVimでLand of Lisp

ビックウェーブに乗り遅れました

Land of Lispの翻訳が発売されて3ヶ月くらい経ってしまいましたが、Common Lisp使いたいけどVim派なんだよねの人用です。以前それっぽいものを投稿しましたが、今回はclispを使う場合で、MacのVimでLand of Lispです。

 Macが必要です

Macがない場合はMacを買ってきます。MacBook Airがおすすめです。キーボード配列はUS配列がいいと思います。最近では、Apple StoreではFr配列も買えます。UK配列はお勧めしません。

Windowsの場合は、下の .vimrc を適当に変えたらいいと思います。

環境はclispです

Land of Lispは、clispで説明されているのでhomebrew使ってclispを入れます。

brew install clisp

ついでにbrew install git, brew install mercurialも使うので忘れずに入れてください。

neobundleを入れます

$ mkdir -p ~/.vim/bundle

$ cd ~/.vim/bundle

$ git clone https://github.com/Shougo/neobundle.vim.git

上記操作を行った後に、MacVimとかVimを起動して :NeoBundleInstall!すれば準備は完了です。

.vimrcの設定

slimv

ファイル形式がLISPの場合に反応します。 ,cで接続します。,dでカーソルがあるS式を評価します。

let g:paredit_electric_return = 0 は、初期値の1だと (|) のときにReturnすると、) だけ次の行になるのが嫌なのでこうしました。

let g:slimv_repl_split = 4 は、connected swank serverの際、対話窓が縦分割の右側に出てきます。

let g:slimv_repl_simple_eval = 0 にしてるので、評価する画面ではCtrl-Returnをすることで評価されます。Returnで評価したい場合は、コメントアウトしてしまうか0以外にしてください(改行されたりされなかったりしたのでこうしました)。

slimvにctagsの設定があったので、:GenerateLispTagsRecursive を定義して現在のディレクトリから再帰で .vim/tags/lisp.tags に追加するようにしました。:GenerateLispTags では、そのファイルだけが追加されます。<Esc><C-]>で、カーソルが上にある文字列が定義された文字列の場合、定義箇所に移動します(複数ある場合のために<C-]>をg<C-]>にするのがいいかも)。ctags の戻る方法が<C-t>と書かれているものが多いのですが、別件で使っているためか効かないので、<C-o>の戻る、<C-i>の進むを使っています。

アップした .vimrc は他のものが何もないので、MacVimで表示するとこんな感じになります。

f:id:jiroukaja:20130506004615j:plain

 

最新のslimvだと、分割画面が複数存在していてもちゃんと表示されるようになっています。作者さんすごいです。Unite.vimでjumpするとかneocomplcacheでctagsの補完候補を表示させるようにするとかありますが、VimでLand of Lispを動かすにはこれが一番楽だと思います。slimvのhelpが充実しているので、分からないことがあったら :help slimv, :help paredit してみると良いと思います。