Rubellum fly light

ほぼPHP日記

OS X Lionをインストールした

購入だけしてインストールはしてなかったOS X Lionを今更ながらインストールした。
クリーンインストールしようと思ったのだが、予想以上に難航したので、Snow LeopardクリーンインストールしてからLionにアップデートした。

新しい環境は、とても清々しい。

Lionは新しい機能だけでなく、変更点もいくつかあるようだ。
トラックパッドのスクロールの向きが変わったのは知っていたのだが、マウスのホイールによるそれも変わっていたのは驚いた。
トラックパッドの方はすぐに慣れたが、マウスの方は馴染めなかったので、マウスの方だけ元の動作に戻した(追記:片方だけ変えるというのはできないみたいだ。トラックパッドの方も戻ってしまっていた)。
幸い、設定画面を見たらすぐに変更できた。さすがに予想されてるのだろう。

これらの機能は、不自然だが広まってしまった悪しき慣習だ(ってばっちゃが言ってた)。
それらを容易にぶっ壊してしまうところはさすがだなと思う。
受け入れられないようなら、元の機能に戻せるようにすればいいしね:-)

環境を整えてる途中、XCodeのインストールで困ったことがあった。
コマンドラインgccが使えないのである。これは多くの開発者が困ると思う。
もちろん、Webは解決策を教えてくれる
これは、古臭いコマンドラインツールなんて捨てて、みんなカッコイイXCodeを使おうよ!ってことなのかな。

Chromeの拡張機能に「Minus」をインストールしているとTumblrのダッシュボードの表示がひどいことになる

ChromeでのTumblrのダッシュボードの表示がおかしくなっていた。
Tumblr側がChromeの表示チェックをしていないわけがないので、拡張機能が悪さをしているのだろうと検討をつけて、ひとつずつ無効にしてみたところ、「Minus(Ver 1.7.98)」のせいだということがわかった。
頻繁に使うわけでもないので無効にすることで解決した。
原因を突き止める気はなかったり。

今日からVimmer!

Vim、それは選ばれし者の指で膨らむ奇跡のエディタ
ある者は清浄のエディタを咲かせ、ある者は毒のエディタを咲かせる
大エディタ時代、美しさを競いあう二つのエディタ
その名をVimEmacsといった...

MacVimをインストールした。
quickrun, neocomplcache, surround.vim ... などなどのプラグインが気になってたので。
普段はemacsを使っているが、ここ一週間はVimで落ち着いている。

MacVim インストール

ここからダウンロードして、インストール。
GUIの方を使ってみるみる。

Vimキーバインドには、しばしば<leader>というのが出てくる。
これはMacVimでは\(バックスラッシュ)に割り当てられている。
バックスラッシュは「Option(alt)+¥」で入力するのだが、これはちょっと面倒くさい。
なので、キー入力のマッピングの方を「¥」から「\」に変えることにした。
あとescを入力するのに小指を伸ばすのがちょっと億劫だったので、escを右⌘(Command)にもした。

キーのリマップにはKeyRemap4MacBookを使った。
以下の項目を変更。

  • JIS (¥) to Backslash(\)
  • Command_R to Escape

問題があるようなら対策を考える。
「お兄ちゃんは¥に縁がないから大丈夫だよ」「やかましい」

Vundle インストール

git cloneするだけ。簡単すぎて笑った。
(追記:インストールしたあとに知ったのだが、NeoBundleというのもあるらしい)

$ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

「.vimrc」にVundleの設定を追加する。

set nocompatible
filetype off

set rtp+=~/.vim/bundle/vundle/
call vundle#rc()

" ここにプラグインを列挙
" Bundle 'Shougo/necomplcache'  # 後述

filetype plugin indent on

プラグインのインストール

BundlerではGemfileにgem群を書く。
Vundleでは「.vimrc」にプラグインを列挙していく。
とりあえず「neocomplcache」「unite.vim」「vim-ref.vim」「vim-quickrun.vim」「surround.vim」をインストールしてみた。

" ここにプラグインを列挙
Bundle 'Shougo/necomplcache'
Bundle 'Shougo/unite.vim'
Bundle 'thinca/vim-ref'
Bundle 'thinca/vim-quickrun'
Bundle 'surround.vim'

設定ファイルにプラグインを列挙した後、「:BundleInstall」することでインストールが始まります(一度Vimを閉じる必要があるかも?)。
インストールが完了すると、Done!と出ます。Done!

neocomplcacheの設定として「.vimrc」に以下を追加。
設定の詳細についてはhttp://vim-users.jp/2010/10/hack177/をみるといいみたいですよ。

let g:neocomplcache_enable_at_startup = 1  # 起動時に有効化
let g:neocomplcache_enable_smart_case = 1
let g:neocomplcache_enable_camel_case_completion = 1
let g:neocomplcache_enable_underbar_completion = 1
let g:neocomplcache_min_syntax_length = 3

colorscheme - 色、テーマ

色が味気ないので「molokai」というテーマをインストールしました。
これもVundleからできます。Vundle万歳!

「.vimrc」

Bundle 'tomasr/molokai'

Vim上で「:BundleInstall」。

「.gvimrc」に設定追加。

" molokai theme
set background=dark
colorscheme molokai

vimshell インストール

vimshell、そんなものもあるのか。

ついでにvimshellをインストールしてみた。
vimshellはVim上でシェルできちゃうというもの。Vimはエディタです。
vimshellを動かすのにvimprocが必要になるのでそちらもインストール。
vimprocは、BundleInstall後に別途makeする必要があります。

「.vimrc」に追加。

Bundle 'Shougo/vimproc'
Bundle 'Shougo/vimshell'

Vim上で「:BundleInstall」。

次にvimprocをmake。

$ cd ~/.vim/bundle/vimproc
$ make -f make_mac  # MacVim!

これでインストールが完了。
vim上で「:VimShell」するとシェルが立ち上がります。

その他設定

ちょっと触ってみて気になるところを変えてみた。

「.vimrc」

set number       # 行番号
set nobackup     # バックアップファイル作らない
set smartindent  # スマートインデント
set tabstop=4    # タブ関連
set shiftwidth=4 # 
set expandtab    # タブをスペースで

「.gvimrc」

set guifontwide=Monaco:h12  # フォント
set guifont=Monaco:h12

set lines=45    # 縦幅
set columns=80  # 横幅

set guioptions-=T  # ツールバー隠す

感想

GitHubとか使っちゃうあたり、Vundleから"モダン"な雰囲気が漂っています。
NeoBundle(作者はShougoさん)なるものもあるらしいので、そっちも試してみようかなぁなんて思っています。

quickrunがすごく便利でした。
ちょっとしたスクリプトを書く→実行って流れが、シェルに戻らずできるの良い。
そういえば、vim-quickrunでRubyのラムダ構文を実行したら謎のエラーが出た。

->(x) { x + 1 }.call(1)

これを実行すると、

/var/folders/nh/nhUeVY1YF70ejCARqfMkJ++++TI/-Tmp-/vRvtnds/2:1: syntax error, unexpected '>'
->(x) { x + 1 }.call(1)
  ^
/var/folders/nh/nhUeVY1YF70ejCARqfMkJ++++TI/-Tmp-/vRvtnds/2:1: syntax error, unexpected '{', expecting $end
->(x) { x + 1 }.call(1)

となる。
自分の環境のせいかもしれないのと、quickrunがどんな風にプログラムをしてるのかなどよくわかってないので、あとでちゃんと原因を調べてみるみる。

Vim楽しいね!
(強制まとめ)

いちおう

最終的な設定ファイル。
.vimrc

set nocompatible
filetype off

set rtp+=~/.vim/vundle.git/
call vundle#rc()

Bundle 'Shougo/neocomplcache'
Bundle 'Shougo/unite.vim'
Bundle 'thinca/vim-ref'
Bundle 'thinca/vim-quickrun'
Bundle 'gtags.vim'
Bundle 'surround.vim'
Bundle 'Shougo/vimproc'
Bundle 'Shougo/vimshell'
Bundle 'TwitVim'
Bundle 'altercation/vim-colors-solarized'
Bundle 'tomasr/molokai'

filetype plugin indent on

set number
set nobackup
set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

let g:neocomplcache_enable_at_startup = 1
let g:neocomplcache_enable_smart_case = 1
let g:neocomplcache_enable_camel_case_completion = 1
let g:neocomplcache_enable_underbar_completion = 1
let g:neocomplcache_min_syntax_length = 3

imap <C-k> <Plug>(neocomplcache_snippets_expand)  # snippets的な何からしい
smap <C-k> <Plug>(neocomplcache_snippets_expand)

set splitbelow
set splitright

let $PATH=$HOME."/dmd2/osx/bin:".$PATH  # quickrun - D lang

.gvimrc

set guifontwide=Monaco:h12  # フォント
set guifont=Monaco:h12

set showtabline=2

set lines=45
set columns=80

set guioptions-=T  # ツールバー消す

set background=dark
colorscheme molokai

Countableの悪夢

count($obj);

ってサポートするべきなのだろうか、
とRubyのEnumerableをtraitとmix-inで実装してみるときに思ったのである。

<?php

trait Enumerable
{
  public function count()
  {
    return 2;
  }

  public function all() {}
  // 略                                                                         
  abstract public function each();
}

class Test
{
  use Enumerable;

  public function each() {}
}

class Test2 implements Countable
{
  use Enumerable;

  public function each() {}
}

$test = new Test;
echo count($test) . PHP_EOL; // => 1                                            

$test2 = new Test2;
echo count($test2) . PHP_EOL; // => 2

なお、実際に実装はしてない模様(ぇ

Countableの悪夢

count($obj);

ってサポートするべきなのだろうか、
とRubyのEnumerableをtraitとmix-inで実装してみるときに思ったのである。

<?php

trait Enumerable
{
  public function count()
  {
    return 2;
  }

  public function all() {}
  // 略                                                                         
  abstract public function each();
}

class Test
{
  use Enumerable;

  public function each() {}
}

class Test2 implements Countable
{
  use Enumerable;

  public function each() {}
}

$test = new Test;
echo count($test) . PHP_EOL; // => 1                                            

$test2 = new Test2;
echo count($test2) . PHP_EOL; // => 2

なお、実際に実装はしてない模様(ぇ

Play framework with Scalaのデモでハマった

ふとScalaでWebアプリケーション作りたいなーと思ったので、Play frameworkをいじってみることに。
チュートリアルを参考にしてたのですが、いろいろハマったのでメモ。
とりあえず初期のプロジェクトが動作するところまでです。
(あと正直よくわからないことが多いので、とりあえずぼくはこれで動いたよってスタンスです)

環境

OS Arch Linux
Scala 2.9.1-1 (pacmanで確認)
Play framework 1.2.4-9 (yaourtで確認)
Scalaモジュール 0.9.1

インストール

$ sudo pacman -S scala
$ sudo yaourt install -S playframework
$ sudo play install scala-0.9.1  # 「~ install scala」だけだと上手く動かなかった

「$ play install scala」だと、(現状では)バージョンが「0.9.0」のモジュールがインストールされるみたい。
これだと上手く動かないので「0.9.1」を指定してインストールする。

プロジェクト作成

$ play new hello --with scala-0.9.1  # helloはアプリケーション名
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.4, http://www.playframework.org
~
~ The new application will be created in /home/lib2/www/hello
~ What is the application name? [hello] 
~
~ Resolving dependencies using /home/lib2/www/hello/conf/dependencies.yml,
~
~ 	play->scala 0.9.1 (from playLocalModules)
~
~ Some dependencies have been evicted,
~
~	play 1.2.2 is overriden by play 1.2.4
~
~ Installing resolved dependencies,
~
~ 	modules/scala-0.9.1 -> /usr/share/playframework-1.2.4/modules/scala-0.9.1
~
~ Done!
~
~ OK, the application is created.
~ Start it with : play run hello
~ Have fun!
~

なんか1.2.2のフレームワークがほしいけど1.2.4がインストールされてるからそれ使うねって言われてるような気がするが、結果動いたのでよしとする(ぇ

プロジェクト起動

$ cd hello
$ play run

ポート9000番で起動します。
初回のアクセス時にはコンパイルなどが行われるので、起動がちょっと遅いです。
あと、自動で作成されたプロジェクトには間違いがあるので、Template execution error
が出ると思います。
起動自体はできているので、実際にアクセスしてみると綺麗にエラー箇所を表示してくれます。


f:id:rubellum:20120310175419p:image:w640


エラーメッセージ(上のやつから要約したもの)。

Template execution error
Execution error occured in template /app/views/main.scala.html: No route found

In /app/views/main.scala.html (around line 9)


どうやらテンプレートファイル(app/views/main.scala.html)に記述されているjqueryのバージョンが、実際に存在するものとで違っているようです。
(追記:もしかして Playの1.2.2 or 1.2.4, scalaモジュールの0.9.0 or 0.9.1 の整合性がおかしくなってる…?)


調べてみると、1.6.4が用意されています(バグ?)。

$ ls public/javascripts
jquery-1.6.4.min.js


そのため、テンプレート(app/views/main.scala.html)のソースコードを「1.6.4」に書き換えます。

@@ -6,7 +6,7 @@
-        <script src="@asset("public/javascripts/jquery-1.5.2.min.js")" type="text/javascript"></script>
+        <script src="@asset("public/javascripts/jquery-1.6.4.min.js")" type="text/javascript"></script>


再度アクセスしなおすと、うまく表示できると思います。

f:id:rubellum:20120310175418p:image:w640

感想

htmlの参照するjsファイルがないのをエラーで表示できるのすごい。
以前Liftをいじったときより(デモの時点では)簡単だなーという印象を受けた。
まだ初期のデモプロジェクトしかいじってないので、とりあえず矢部がんばる。

あとScala書くときってエディタ何がいいんだろか。
いまemacsなんだけど。

Play framework with Scalaのデモでハマった

ふとScalaでWebアプリケーション作りたいなーと思ったので、Play frameworkをいじってみることに。
チュートリアルを参考にしてたのですが、いろいろハマったのでメモ。
とりあえず初期のプロジェクトが動作するところまでです。
(あと正直よくわからないことが多いので、とりあえずぼくはこれで動いたよってスタンスです)

環境

OS Arch Linux
Scala 2.9.1-1 (pacmanで確認)
Play framework 1.2.4-9 (yaourtで確認)
Scalaモジュール 0.9.1

インストール

$ sudo pacman -S scala
$ sudo yaourt install -S playframework
$ sudo play install scala-0.9.1  # 「〜 install scala」だけだと上手く動かなかった

「$ play install scala」だと、(現状では)バージョンが「0.9.0」のモジュールがインストールされるみたい。
これだと上手く動かないので「0.9.1」を指定してインストールする。

プロジェクト作成

$ play new hello --with scala-0.9.1  # helloはアプリケーション名
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.4, http://www.playframework.org
~
~ The new application will be created in /home/lib2/www/hello
~ What is the application name? [hello] 
~
~ Resolving dependencies using /home/lib2/www/hello/conf/dependencies.yml,
~
~ 	play->scala 0.9.1 (from playLocalModules)
~
~ Some dependencies have been evicted,
~
~	play 1.2.2 is overriden by play 1.2.4
~
~ Installing resolved dependencies,
~
~ 	modules/scala-0.9.1 -> /usr/share/playframework-1.2.4/modules/scala-0.9.1
~
~ Done!
~
~ OK, the application is created.
~ Start it with : play run hello
~ Have fun!
~

なんか1.2.2のフレームワークがほしいけど1.2.4がインストールされてるからそれ使うねって言われてるような気がするが、結果動いたのでよしとする(ぇ

プロジェクト起動

$ cd hello
$ play run

ポート9000番で起動します。
初回のアクセス時にはコンパイルなどが行われるので、起動がちょっと遅いです。
あと、自動で作成されたプロジェクトには間違いがあるので、Template execution error
が出ると思います。
起動自体はできているので、実際にアクセスしてみると綺麗にエラー箇所を表示してくれます。

f:id:rubellum:20120310175419p:image:w640


エラーメッセージ(上のやつから要約したもの)。

Template execution error
Execution error occured in template /app/views/main.scala.html: No route found

In /app/views/main.scala.html (around line 9)


どうやらテンプレートファイル(app/views/main.scala.html)に記述されているjqueryのバージョンが、実際に存在するものとで違っているようです。
(追記:もしかして Playの1.2.2 or 1.2.4, scalaモジュールの0.9.0 or 0.9.1 の整合性がおかしくなってる…?)


調べてみると、1.6.4が用意されています(バグ?)。

$ ls public/javascripts
jquery-1.6.4.min.js


そのため、テンプレート(app/views/main.scala.html)のソースコードを「1.6.4」に書き換えます。

@@ -6,7 +6,7 @@
-        <script src="@asset("public/javascripts/jquery-1.5.2.min.js")" type="text/javascript"></script>
+        <script src="@asset("public/javascripts/jquery-1.6.4.min.js")" type="text/javascript"></script>


再度アクセスしなおすと、うまく表示できると思います。

f:id:rubellum:20120310175418p:image:w640

感想

htmlの参照するjsファイルがないのをエラーで表示できるのすごい。
以前Liftをいじったときより(デモの時点では)簡単だなーという印象を受けた。
まだ初期のデモプロジェクトしかいじってないので、とりあえず矢部がんばる。

あとScala書くときってエディタ何がいいんだろか。
いまemacsなんだけど。