macvim生活始めました

vim

Vagrant生活を始めたので、ターミナルで開発サーバにsshしてvimで開発するのをいったんお休みし、Vagrantmacvimを使って開発することにしました。

感想

  • 表示が速い!快適!
  • コマンド叩きたいときにCtrl + zじゃなくて⌘+TABでiTermのウィンドウに移動する操作がちょっとアレ
  • ソースの文法チェックとかでPHP使ってたりするので、結局VagrantVMだけじゃなくてローカルのMacにも少し環境構築する必要があった


まとめると、速くてよいです。

macvimインストール

brewで入れています。更新も楽ですね。

# neocomplete.vimを使っているのでlua入りでインストール
# pythonを有効にしてるのはvdebugを使うため
brew install macvim --HEAD --enable-pythoninterp --with-lua
brew linkapps

# 更新
brew update

macvimの起動

基本ターミナルでコマンド操作しているので、いままでvimと打っていたのをmvimとして起動するだけです。

カラースキーマ探し

gvimにしたら白い背景がいいかもと前から思っていたのでsolarizedのset background=lightにしてみました。
でもちょっとコントラストが低くて目が慣れませんでした。いきなり白くしたので明るすぎる気もしました。

:SolarizedOptions

コマンドで調整値を確認して、

let g:solarized_contrast="high"

にしてみたのですが、やっぱり今までどおり黒系のカラースキーマにすることにしました。

しっくりくるカラースキーマを探すには、unite-colorschemeでプレビューしながらが便利です。

# 俗にいうユナイトビューティフルアタック!!(http://d.hatena.ne.jp/osyo-manga/20130307/1362621589)
:Unite colorscheme -auto-preview


solarizedのdark、大人気のjellybeansと迷ったんですが、最終的にhybridにしました。

GUI用の追加設定

いつものCUIvimも使うので、設定は.vimrcにこんな感じで書きました。
カラースキーマ、マウス、GUIウィンドウ、クリップボード連携、フォントの設定を追加しました。

guioptions=cの設定は次のような意味です。デフォルトはguioptions=egmrLでした。cだけつけています。

  • メニューを表示しない(m)
  • 左右の垂直バーを表示しない(l, r, L)
  • 下のスクロールバーを表示しない(b)
  • ポップアップの確認ダイアログではなくコンソールダイアログを使う(c)

参考:http://vim-jp.org/vimdoc-ja/options.html#'guioptions'

if has('gui_running')

  " カラースキーマ
  set background=dark
  silent! colorscheme hybrid

  " マウスを使う。
  set mouse=a
  set ttymouse=xterm2

  " キータイプ時にマウスポインタを隠す (nomousehide:隠さない)
  set mousehide

  " GUIの設定。m:メニュー、r:右垂直バー、b:下のスクロールバー、l:左垂直バー
  set guioptions=c

  " ヤンクの内容や、選択した内容をクリップボードに格納する。
  set clipboard=unnamed,autoselect
  
  if has('mac')
    " フォントはRicty for Powerlineの13
    set guifont=Ricty\ Regular\ for\ Powerline:h13

    " 起動したときに最大化
    autocmd BufEnter * macaction performZoom:
  endif
else
  " CUIのvimのときに使っているカラースキーマ
  silent! colorscheme mrkn256
endif

カーソルの移動速度を上げる

mvimのカーソル移動速度を上げるために、@ に教えてもらったKeyRemap4MacBookをインストールして、キーリピートの速度を変更しました。

f:id:yuhei_kagaya:20140218211825p:plain
デフォルトの1/10ほどにしました。速すぎです。

Vagrant生活始めました

Vagrant。2013年に単語を聞きまくっていたのに手をつけていなかったものをようやく触り始めました。
とりあえず、登場してくるものの概要を理解。

VirtualBox 仮想マシンを立ち上げるソフト(環境)。他にはVMWareAWS
Vagrant 仮想マシンを立ち上げるソフトのCLIラッパーのようなもの。
Chef 仮想マシンのプロビジョニングツール。他にはPuppet、Ansible、普通のShellスクリプトなど。
Box 仮想マシンのテンプレート。
Vagrantfile 仮想マシンの構築設定ファイル。
Berkshelf Chefのパッケージ管理ツール(yum, apt-get, bundle, Composerのようなものっぽい)

VirtualBoxVagrantをインストール

Mac(10.9.1)にVirtualBoxVagrantをダウンロードしてインストーラでインストールしました。

boxの追加

有志の方々がつくられているVagrantbox.esにいろいろアップされています。
CentOS6.4にしました。

# vagrant box add title url の形式
vagrant box add centos64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box

追加したboxファイルは~/.vagrant.d/boxes/に入っています。

boxの操作

# 一覧
vagrant box list
# 削除
vagrant box remove 名前

boxを使って仮想マシンを起動

mkdir vm
cd vm
vagrant init centos64
vagrant up

実際にVirtualBoxを起動してみると、起動しているのが分かります。

仮想マシンの操作

vagrant upしたディレクトリ内で実行します。

# 確認
vagrant status
# 停止
vagrant halt
# 一時停止
vagrant suspend
# 再開
vagrant resume
# 破棄
vagrant destroy
# 設定再読込
vagrant reload

sshを使って仮想マシンへログイン

vagrant ssh

vagrantという名前のユーザでログインできます。
ホストOSとは、/vagrantを共有しています。

IPアドレスの固定

Vagrantfileの以下の場所のコメントを外します。

config.vm.network :private_network, ip: “192.168.33.10"

設定を再読込します。

vagrant reload

Saharaプラグイン

Vagrantプラグインで、Sandboxモードという仕組みが使えるようになります。
これはRDBMSトランザクションのようなものです。
コミットするまで設定が反映されないのでいろいろやって失敗したらロールバック
これでよければコミット、ということができるようになるようです。

# プラグインのインストール
vagrant plugin install sahara
# プラグインの一覧
vagrant plugin list
# プラグインのアンインストール
vagrant plugin uninstall sahara
# Sandboxモード開始
vagrant sandbox on
# 状態確認
vagrant sandbox status
# ロールバック
vagrant sandbox rollback
# コミット
vagrant sandbox commit
# Sandboxモード終了
vagrant sandbox off

Packer

boxファイルを自分で作りたい場合、Vagrant作者のPackerを使うと良いみたいです。
OSのイメージファイルからboxファイルを作成できます。

参考にさせていただいたサイト

Pakerのインストール

Downloads - Packerからダウンロードしてパスを通せばオッケーみたいですが、
brewの方が楽だったので、brewでインストールしました。

brew tap homebrew/binary
brew install packer

shiguredo/packer-templates

今回Ubuntuが使いたくてjsonファイルを書いていったのですが、たくさん設定があって大変...。
心が折れそうだったとき、時雨堂Packerテンプレートに出会うことができたので、使わせていただきました。
最高です。本当にありがとうございます。

shiguredo/packer-templates · GitHub

git clone https://github.com/shiguredo/packer-templates
cd packer-templates/ubuntu-13.10/
packer build -only=virtualbox-iso template.json
vagrant box add ubuntu-13.10  ubuntu-13-10-x64-virtualbox.box


これで楽に仮想マシンが作れるようになったので、次はChefだなー!

neocomplete-php.vimを作っています

PHPの関数を補完するneocomplete用source

f:id:yuhei_kagaya:20140119234515p:plain
neocomplete-php.vimneocomplete.vimPHP用sourceです。

補完時に、関数と一緒に短い説明が欲しかったので作り始めました。

今のところはPHPの組み込み関数の補完しかできないのですが、
これから次のような機能を実装しようかなぁと思っています。

  • インサートモード時に、statsulineにリファレンスを表示する機能
  • 組み込みクラスの補完
  • メンバ変数やメソッド名や定数の補完
  • CakePHPへの対応

セットアップ

プラグインをneobundleでインストールします。

NeoBundle 'Shougo/neocomplete.vim'
NeoBundle 'violetyk/neocomplete-php.vim'


日本語の説明にする場合には、.vimrcなどにロケールを設定します。
デフォルトは英語のenです。

let g:neocomplete_php_locale = 'ja'

vim起動後に1度だけ、次のコマンドを実行します(以下は日本語の辞書を作成する場合)

:PhpMakeDict ja

この処理は、http://svn.php.net/viewvc/からPHPマニュアルのXMLソースコード
svn checkout(またはsvn update)して辞書ファイルを作成します。
数分かかることがあります。

finish.と表示されたら完了です。
~/.neocomplete-php/配下に辞書のキャッシュが作成されます。

vital.vim

このプラグインで、vimscriptの汎用ライブラリ集であるvital.vimを使い始めました。
すごく便利です。
いままで自分で書いていたプラグインのautoload配下util.vimとかなんだったんだろう。。。
何か処理をしようと思ったとき、まずvital.vimでないかなーと探すようになりました。
vital.vimの導入から使い方までは、こちらのページがとても参考になります。


自分のプラグインにvital.vimを組み込んで使う方法は、ヘルプで確認しました。

:help vitalizer

PHPのtrait

最近PHP5.5を触っています。 5.4からの機能、トレイト。
PHP: トレイト - Manual

今までabstractクラスで実装してた部分を役割分割して実装済みメソッドだけにした、みたいなものかなぁ。
interfaceとセットでtraitを使うとコールする側も保証できてよさそう。
最初からtrait作っていくとただのutil系関数のincludeになりそうなので、
設計や実装の後半で抽象化できそうな共通項部分を抽出してtraitいったらいいかも。

CakePHPだとModelと相性がよさそう。あとControllerも。
ComponentとかBehaviorはそのオブジェクトの生存期間中のコールバックの実装がメインになりそうで、
単純に実装済みメソッドをガッチャンコして足すような用途はあわなそう。
traitについてはそんな感想です。

ポエムを刻め pplogがとてもおもしろい

f:id:yuhei_kagaya:20131227123458p:plain

pplog - ゆるふわインターネットにポエムを刻もう

pplogがおもしろいです。
ひとことでいうと、最新の1件だけ見ることができるブログ、でしょうか。


最新の1件だけという制限以外にも「フォロワーが分からないこと」がいいなぁと思いました。
誰に読まれるんだろうとかを気にしていたら、いい詩は刻めないですからね。

生きている瞬間を詠み、一期一会の詩を読む

画面の下の方にある肉球マークを押すと、適当な誰かのページをジャンプして見られます。
f:id:yuhei_kagaya:20131227125459p:plain
数字はポエマーの数ですかね?


ポンポンとリズムよく人のポエムを読むって意外に楽しかったので、
こんな感じでhttp://www.pplog.net/zappingのリンクをブラウザのアドレスバーに入れてみました。
f:id:yuhei_kagaya:20131227125447p:plain
便利です。

パーマリンクの限界

あとこのpplogで、けんすうさんの記事
パーマリンクの限界 - nanapi社長日記 @kensuu
をふと思い出しました。


pplogのiPhoneアプリでないかなー。

追記:humans.txt

これも知らなかったんですけど、humans.txtていうのがあるんですね。
Humans TXT: 私たちは人間です。機械ではありません。

pplogのhumans.txt
http://www.pplog.net/humans.txt
クレジットかっこいいです。

HHKBのカラーキートップが届いた

PFUダイレクト | カラーキートップセット(HHKB Professionalシリーズ専用) | PFU
が届いたので、さっそく装着しました!

http://instagram.com/p/iVJjMoFds7/

雰囲気変わるー!タイピングが楽しくなりますね!
http://instagram.com/p/iVJ_7YFdt1/

(ちょっと年末に大掃除だな・・・)


裏面は今、こんな感じ。
http://instagram.com/p/iVLZhuldgh/

ギターの裏にシールを貼るような感じでHHKBの裏に貼っています。

CakePHPでセッションハンドラにMemcacheを使おうとしたらハマった

CakePHP2.4、php5.5でセッションハンドラにMemcacheを使おうとしたら、落ちました。

原因はsession.auto_startの指定

セッションの設定を1つずつ見ていったところ、わかりました。

session.auto_startはphp5.5.2と5.4.20からPHP_INI_PERDIRに変わったため、
プログラム側でini_set()できなくなり、CakePHPからセットしてはダメだったのが理由でした。

core.php

<?php

Configure::write('Session', array(
  'defaults' => 'cache',
  'cookie' => 'SESSION_NAME',
  'timeout' => 240,
  'autoRegenerate' => true,
  'checkAgent' => true,
  'ini' => array(
    'session.use_cookies' => '1',
    'session.cookie_lifetime' => '0',
    'session.cookie_path' => '/',
    // 'session.auto_start' => '0', // ←コレを指定したらダメ!
    'session.use_trans_sid' => '0',
    'url_rewriter.tags' => '',
    'session.cookie_domain' => '.hogehoge.com',
    'session.save_handler' => 'user',
    'session.cookie_httponly' => '0',
    'session.cookie_secure' => '0',
  ),
  'handler' => array(
    'engine' => 'CacheSession',
    'config' => 'default',
  ),
));

Cache::config('default', array(
  'engine' => 'Memcache',
  'duration' => '+3 hours',
  'prefix' => 'session:',
  'servers' => array('localhost:11211'),
));