TokyoVim#14に行って来ました(本当)

TokyoVim#14」に行って来ました。

今回thincaさんに「TokyoVimに来たらドーナツを食べさせてやらないこともない」と誘って頂いたのがきっかけで、何をやる勉強会なのかもわからずに勉強会初参加となりました。結果、Vimの勉強会でした。後になって考えてみるとTokyoVimという名前から推測できましたね。

メンバーは、lingrやTwitterなどで交流があった人が1/3くらい、そうでない人が2/3くらいでしょうか。なので会場までの道中はけっこう緊張していました。

着いた

若干迷子になりつつ開会3分前くらいに会場があるビルに着きました。会場は2階との事だったので半ば緊張しつつ階段をのぼり、深呼吸した後ドアを開けようとして開かなかったので1階に戻ってエレベーターに乗った所でちょうど@kefir_さんと遭遇・仲良く会場入りしました。

13:00 開場

私と@kefir_さんが着いた段階で既に7名が到着されておりました。その後よみさんが到着されて無事開会となりました。

13:00-13:15 自己紹介、やること紹介

全員が揃った所で、自己紹介タイムです。ドーナツはどこですか、と言いたかった所ですがぐっとこらえて自己紹介しました。@kefir_さんに「Shaberuの人ですよね?」と言われた私は「喋る人ですよね?」と聞き間違えたらしく2秒ほど何かを試されているのかとテンパった後、あ、Shaberu.vimかと思い「そうですね」と答えました。

13:30-15:00 もくもく会

「もくもくドーナツを食べる会」だと思っていたのですが、どうやら違ったようで、各自黙々とプラグイン開発などを行なっていました。静かです。仕方がないので私もドーナツを諦めプラグイン開発を行なっていました。静かなのですごい捗ります。Mac率高いですね。

15:00-15:30 休憩

一旦休憩です。ここでthincaさんがドーナツを出してくれました。来てよかったなーと思いながらドーナツを頬張りました。ミスタードーナツです。色んな種類のドーナツがあって、私はいちごチョコのコーティングされたドーナツを食べました。いちごチョココーティングのパリっとした食感とほのかな酸味、そしてドーナツ部分のふわふわした食感、中に入ったクリームのなめらかな舌触りと甘みが口の中に広がりました。「あたし、ついにドーナツになっちゃったよー!」という感じでした。

その後各自トイレ休憩や雑談タイム。隣の席に座っていたよみさんや、lingrでも交流があり今回誘ってくださったthincaさんと楽しくおしゃべりしました。それにしてもtwitterアイコンだけだと思っていたのに、まさかよみさんが本当にクー子で、thincaさんが本当にマンボウだったとは…。

次回ではもっといろんな人とおしゃべりできればいいなぁと思います。

15:30-18:00 フリータイム

もくもく会での成果発表みたいなのをプロジェクタでやることになりました。と思ったらShougoさんの中の暗黒美夢王が顕現し、なんか喋ったあと「残酷な天使のエディタ」歌い出しました。そのあとまたなんか喋り出して結果としてSEGVしていました。

yjw_r1qbl9ju

その後少し談笑も混ざりつつのもくもくタイムでした。

18:00 解散・懇親会

解散後、7名ほどで懇親会を開催されたそうです。私は残念ながら仕事で行けなかったので、次回は懇親会まで含めて参加したいですね。

感想

ドーナツおいしかったです。あともくもく会かなり捗りました。すごく楽しかったです。またよろしくお願いします。

個人プログラマがサイトを32万円で売却してMacBookAirをゲットするという試み

一年まえくらい、ameroadというサイトの売却劇が話題になりました。

「Ameroad」は150万円で売却 ヤフオク活用の「超短期小額バイアウトモデル」

面白そう!ということで、私もサイト売却して、そのお金でMacBook Airの最新版を買ったり、Vimからウガンダに募金したりするという試みをします。

ところでVim Advent Calendar 2012は現在執筆者を募集しています。みなさんも何かしら書いてください。

とりあえず出品した

ヤフオクはなんか手続きとか面倒だったので楽天オークションに出品しました!

ここをクリックすると今すぐ入札することができます。便利。

どんなサイト売るの

ameroadとかと違って話題性はないものの、その分お得感の演出をしてみます。

というわけで既に黒字化してるサイトを売ります。月間で8万円くらいの黒字です。

運営にかかる金銭的コストがサーバー代の1000円くらいで、サイトは自動更新されるデータベース系サイトなので運営工数も0です。あとVim Advent Calendar 2012は現在執筆者を募集しています。そろそろ終わりそうなのでピンチです。

売り上げはクリック報酬型アフィリエイトの報酬です。詳しくはオークションの説明文に書いてあります。

楽天オークションの制限上載せられなかった詳細なデータについても載せておきますね。

サイト開設直後からかなり右肩上がりでアクセスが増えています。ソーシャルゲームの主なプレイ層であるスマートフォンに特化して、攻略データ+便利ツールを開発したのがよかったのでしょう。アフィリエイト広告はよくあるバナーが最下部に表示・追随されるやつで、表示されるのはソーシャルゲーム系広告が多いです。サイト閲覧者と広告の相性が良いらしく、eCPMがかなり高いです。すごい。

個人的には、スマートフォンサイトでのアフィリエイトはあと1・2年くらいかなり稼げる市場じゃないかなと思っています。1・2年というのはソーシャルゲームのバブルが弾けるまでですね。広告出稿者が多い今こそアフィリエイトサイトへの還元が大きくなっています。

何かウェブサービス作るなら、スマートフォンで利用する系、またサイトジャンルもソーシャルゲームユーザーとの相性が良いものを狙うといいかもしれません。

お得感

月間利益8万円のサイトを32万円から出品してるので、かなりお得感(お得オーラ)が出ています。4ヶ月くらいで元が取れますね。お得。

あんまり高く売れてもなんか逆に微妙なので上限として即決価格を設定しておきました。8万円×12ヶ月分の96万円です。妙にリアルな数字。

あと今回売却するサイトはPHP+SQLiteで動いているのですが、これはVimでプログラミングしました。Vimがなければ完成しなかったでしょう。ここからわかることは、Vimを使うことで良い感じのウェブサービスとかを作れて、それを売却することでお小遣いを稼げる可能性が高くなるということです。つまりVimを使うと年収が上がります。

ちなみに最近はもっぱらRubyにハマっているので次なにか作るならRuby(Sinatra)製ですかね。

みんなもっと気軽にサイト売ろう

個人レベルで趣味で作ったウェブサービスとか、もっとオークションとかで気軽に売っちゃえばいいと思います。

あともっと気軽にVim Advent Calendar 2012に参加してもいいと思います

売れたらどうするか

オークション説明ページにも書きましたが、新しいMacBook Airを買って、世界一おもしろいゲームであるPortalとPortal2を高画質でプレイします。これは世界一おもしろいゲームなので、もしプレイしていない人がいたら絶対にプレイしてください。あとVimをインストールしてください。

あと世界で二番目に面白いゲームはMinecraftです。

宣伝力

ブログ記事まで書いて全く売れなかったらなんか残念な雰囲気になるので、Twitterとかで宣伝してください。あとはてブとかしてください。みなさんの宣伝力によって私がPortalを快適にプレイできるかどうかが決まります。

おわりに

Vim Advent Calendar 2012は現在執筆者を募集しています

vimprocでRubyでプロセス通信・ソケット通信しよう

Vim Advent Calendar 2012 123日目の記事になります。昨日は私のVimScript家庭教師ことthincaさんの「Vim を起動したときに Vim Girl に会いたい!」でした。Vim Girlかわいい。

さて風邪で1週間くらい寝込んでいたのですが、布団にこもってなんとかVimで快適に画像や動画などのメディアを表示できないか考えていました。それに対する一つの提案としてあるプラグインを開発しています。残念ながら本日リリースは間に合いませんでしたが、実装にあたって色々と勉強になったので、Tipsを書いておきます。本来Advent Calendarってそういうものですし!問題ない!

VimScriptと外部プログラムとでソケット通信したい

前述の開発中プラグインでは、Vimから独立したソフトウェアを起動・操作するという仕組みを導入しています。今回は例としてvimprocを用いRubyと連携する簡単なプログラムを書いてみます。

socket.vim & socket.rb

let s:ruby_port = 12345
let s:ruby_path = 'ruby'
let s:ruby_script_path = './socket.rb'

function! s:send(command)
	let sock = vimproc#socket_open('localhost', s:ruby_port)
	call sock.write(a:command)
	call sock.close()
endfunction

function! s:start()
  if !s:is_run()
    let s:pid = vimproc#popen2(join([s:ruby_path, s:script_path, s:ruby_port], ' '))['pid']
  endif
endfunction

function! s:stop()
  if s:is_run()
    call vimproc#kill(s:pid, 3)
  endif
endfunction

function! s:is_run()
  if exists('s:pid')
    return vimproc#kill(s:pid, 0) == 0
  else
    return 0
  endif
endfunction
require 'socket'
require 'thread'

Signal.trap(:INT){ exit(0) }
Signal.trap(:QUIT){ exit(0) }

gs = TCPServer.open(ARGV[0])
addr = gs.addr
addr.shift
printf("server is on %s\n", addr.join(":"))
printf("my pid is on %s\n", $$)

loop do
  Thread.start(gs.accept) do |s| 
    puts s.gets
    s.close
  end
end

 

解説

まず、start関数ではvimproc#popen2関数を使いプロセスを開始しています。popen2はプロセスオブジェクトを返してくれ、そのメンバpidにはその名の通り起動したプロセスのIDが格納されています。start関数ではこうして取得したpidをスクリプトローカル変数として保存します。popen2関数には任意のコマンドを渡すことができます。今回の例では’ruby ./socket.rb 12345′というコマンドが渡されます。

次にstop関数では、先ほど取得したpidのプロセスがまだ終了していない場合、プロセスを終了させます。ここではvimproc#kill関数を使用します。kill関数では、任意のpidを持つプロセスにシグナルを送信することができます。ここではプロセスを終了させたいので、SIGQUITを意味する3をシグナルとしてpidに渡しています。

また、start関数とstop関数で使用しているis_run関数についても説明します。is_run関数はstartによって保存されたpidを持つプロセスがまだ終了していないかどうかの判定を行います。先ほど説明したvimproc#kill関数では、のシグナル部分に0を指定することで生死確認を行うことができます。返り値が0の場合はプロセスが生きており、1の場合は終了してしまっています。

最後に、send関数について説明します。この関数はvimproc#socket_open関数を使用しソケット通信を用いてrubyスクリプトに文字列(a:command)を渡しています。vimproc#socket_openの第二引数はportになります。start関数ではs:portをrubyスクリプトに渡しており、rubyスクリプトは指定されたportでsocket通信の待機を行います。

rubyスクリプトも簡単に解説しておきます。このrubyスクリプトは、引数としてソケット通信の待機portを受け取り、ソケット通信のlistenを開始します。vim script側から通信があるたびに、それを文字列として表示させています。

また、Signal.trapを用い指定のSIGNALが送られた時の処理を定義しています。vim scriptのstop関数から送られるSIGQUIT命令を受け取ったらプログラムを終了する、といった形ですね。

このように、vimprocを使用することでとても簡単にプロセスのハンドリングやソケット通信を行うことができます。Vimと外部ソフトウェアとの連携によってより高度な表現が可能になると思いますので、みなさんもぜひ活用してみてください。

Vim Advent Calendar 2012 124日目

Vim Advent Calendar 2012、明日124日目は@cohamaさんです…!

VimScriptでGrowlを簡単に利用するためのライブラリをリリースしました

Vim Advent Calendar 2012 93日目の記事になります。今日はひな祭りなのでVimとひな祭りを掛けた今世紀最大のネタを用意していたのですが、諸事情によってMacBookAirの電源が数日家出することになりバッテリーがあと90分しかないので、急遽先週ごろ作ったVim Scriptの紹介をすることにします。

VimからGrowlを呼び出すShiraseru.vimをリリースしました

https://github.com/supermomonga/shiraseru.vim

VimからGrowlに通知できます!!!

え?車輪の再発明?なにそれこわい…

r~d_01z1oz0-

インストール方法

Growl2.xをAppStoreから、growlnotifyの2.xをダウンロードページから取得・インストールします。次にShiraseru.vimをインストールします。おなじみNeoBundleです。

NeoBundle 'supermomonga/shiraberu.vim', {'depends' : 'Shougo/vimproc'}

つかいかた

このShiraseru.vimにあるshiraser#notify関数は、3通りの呼び出し方があります。

:call shiraseru#notify('Message')
:call shiraseru#notify('Title', 'Message')
:call shiraseru#notify('Title', 'Message', {'appIcon' : '/Applications/MacVim.app'})

Vim Scriptでは可変長引数を取ることが出来るので、それを工夫して引数の個数に合わせて処理を分岐させています。引数を3つ取る場合、growlnoticyのオプション名(ハイフンなし)をキーとした辞書でオプションを指定できます。べんりです。たとえば、appIconになんらかのアプリケーションのパスを指定すれば、通知のアイコンがそのアプリケーションのものになります。

Vim Advent Calendar 2012 94日目

Vim Advent Calendar 2012、明日94日目は@kumack55さんです…!

「つまりVimShellはメイドさんだったんだよ!」vimshell-kawaii.vimをリリースしました

Vim Advent Calendar 2012 87日目の記事になります。

昨日、86日目の記事は@manga_osyoさんの「quickrun-outputter-replace_region つくった」でした。ほむほむほむほむほむほむほむほむ

VimShellかわいい

vimshellに萌えるのはやっぱvimshellと対話してる感、命令に応えてくれるメイドさん感が。siri使ってる時に感じる萌えと似てる。eshellも萌えた
なのでvimshellに音声をしゃべらせたりプロンプトを顔文字にしたりする方向に進むのは自然な流れといえる

つまりシェルという形を取ることによってVimは人格を持ち、あなた専属のメイドテキストエディタへと昇華されるのです。

見た目大事

メイド=かわいい

つまりVimShellの見た目を早急になんとかしなくてはなりません。

なんとかする

元ネタ:

というわけでVimShellをかわいくするvimshell-kawaii.vimをリリースしました

インストール

NeoBundleでおもむろにインストールします。

NeoBundle 'Shougo/vimshell'
NeoBundle 'supermomonga/vimshell-kawaii'

Unite.vimが入ってるなら:Unite neobundle/install、入ってないなら:NeoBundleInstallでインストール完了。特に設定しなくても動きます。おもむろにVimShellを起動しましょう。

結果

スクリーンショット 2013-02-24 21.53.53

コマンド実行時にエラーが返されると混乱した顔になります。かわいい。

Vim Advent Calendar 2012 88日目

Vim Advent Calendar 2012、明日88日目は@syuiさんです…!

VimShellだいすき(エイリアス編)

Vim Advent Calendar 2012 70日目の記事になります。

昨日、69日目の記事は@saitohaさんの「Vimと端末背景色事情」でした。
_人人人人人人人_
> むずかしい <
 ̄YYYYYYY ̄

今日リリースしようと思ってたプラグインが間に合わなかったので、VimShellについて書きます!

VimShellだいすき

Emacsではeshellを愛用していた私にとっては、VimにおいてVimShellは無くてはならないプラグインです。VimShell <3

ひよっこVimmerの私には色々と勉強したいことも多いし、もっとvimrcの設定を色々いじくり回したいのですが、VimShellが快適に使えないと始まらないわけで、なにはともあれVimShellをもっと快適にする設定を模索する日々です。

というわけで、自分なりになんか捗ったVimShellの設定を載せて行きたいと思います。今回はエイリアス編です。

VimShellからさっとファイルを開く

ファイラプラグインとしてVimFilerがありますが、私はEmacsでもdiredやdirexを使わずに、eshellからファイル操作を行なっていました。VimShellでもなるべくそうしたいです。

alias edit = 'vim --split=tabedit $$args'
alias e = edit

このエイリアスを設定しておけば、VimShellからサッとファイルを開くことができますね。私はVimShellを開いているタブを常に1つ置いておきたい派なので、新規タブでファイルが開くようにしています。

.vimshrcをさっとリロード

zshではreloadコマンドで設定ファイル(.zshrc)を再読み込みすることができます。VimShellでもやりたいのでエイリアスを定義します。

alias reload = 'vimsh ~/.vimshrc'
alias rl = reload

ファイルの中身をさっと確認(Mac)

テキストファイルならVimで開けばいいですが、画像ファイルなどをさっと確認したい場合は外部ソフトウェアで開かなければいけません。そこで、MacのQuickLook機能を使ってファイルをさっと確認してみます。

alias quicklook = 'qlmanage -p $$args'
alias l = quicklook

その他短縮コマンド

短縮コマンドの定義はみなさん既にやっていると思いますが、一応。

alias ls = 'ls -a '
alias lsl = 'ls -la '
alias cl = clear
alias op = 'open .'

おまけ(Shaberu.vim)

今作ってるSiri.vimのアイディア段階で定義したエイリアス。かわいい。

alias iloveyou = ':ShaberuSay ほかのテキストエディタにも同じ事を言ってるんでしょう?'

Vim Advent Calendar 2012 71日目

Vim Advent Calendar 2012、明日71日目は@y0sh1kawさんです…!

Shaberu.vimがWindowsに対応しました

Shaberu.vimがWindowsに対応した気がします。あとすこし仕様が変わりました。

手元にWindowsがあるようでない気がするので、誰か動作確認して貰えると助かります。

g:shaberu_user_define_say_commandの仕様が変わりました

実行コマンド中の好きな位置にテキストを挿入することができるようになりました。ダブルクォーテーションで囲ったりできます。

let g:shaberu_user_define_say_command = 'say -v Kyoko "%%TEXT%%"'

WindowsのSAPI(Speech Application Programming Interface)に対応しました

Windowsにデフォルト(多分)で入っているSAPIを叩くようにしました。これで特に何もせずとも、WindowsでVimがしゃべってくれます。

sapi.dllというものがあるのでそれを叩くのが正解な気がしますが、ライセンスがよくわからないので自作vbsを叩いています。誰かこの辺りもっとスマートな実装方法のアドバイスください。

「このVim…しゃべるぞ!」Shaberu.vimをリリースしました

Vim Advent Calendar 2012 67日目の記事になります。

昨日、66日目の記事は@yomi322さんの「Vimで突然の死に備える」でした。みなさん備えてますか?

Shaberu.vimをリリースしました

Vimとおしゃべりできたら素敵だと思いませんか?私は思います。

Sho…某暗黒美夢王ことダークビムマスターさんはこんなものを導入せずともVimの声を聞けてそうですが、まだまだ自分はその域に達していないので、リアルタイム音声合成ライブラリの力を借りることにします。

というわけで、Vimにしゃべってもらうためのプラグイン「Shaberu.vim」を公開しました。

https://github.com/supermomonga/shaberu.vim

Shaberu.vimは、Vimからリアルタイム音声合成ライブラリを操作するためのラッパープラグインです。

動作画面

動作画面を載せておきますね。録画ソフトが重いせいで喋りだすまでタイムラグがありますが、実際には命令があればほぼタイムラグなしで喋ってくれます。

Macの標準コマンド「say」に付属しているKyokoさんの声です。KyokoさんはiOSに搭載されているエージェントSiriの声でもありますね。

let g:shaberu_user_define_say_command = 'say -v Kyoko "%%TEXT%%"'

Open JTalkを利用すれば、よりカワイイ感じの声にもできます。カワイー

let g:shaberu_user_define_say_command = 'say-openjtalk "%%TEXT%%"'

say-openjtalkコマンドはこんな感じです。

インストール方法

NeoBundleとかでいい感じにインストールします。Shaberu.vimはvimprocに依存していますので、vimprocも合わせてインストールします。vimprocは非同期に色々できるやばいやつです。同期的に喋らせると、Vimがしゃべっている間は操作を一切受け付けてくれなくなってしまうので、vimprocを使い非同期に喋らせています。

NeoBundle 'Shougo/vimproc', {
  \ 'build' : {
    \ 'windows' : 'make -f make_mingw32.mak',
    \ 'cygwin' : 'make -f make_cygwin.mak',
    \ 'mac' : 'make -f make_mac.mak',
    \ 'unix' : 'make -f make_unix.mak',
  \ },
\ }
NeoBundle 'supermomonga/shaberu.vim'

設定

Mac OS Xであれば標準でsayというコマンドがインストールされているので、特に設定は必要ないです。日本語を喋らせたい場合は、OS Xのスピーチ設定画面からKyokoさんとかの日本語の音声を別途インストールする必要があります。

WindowsやLinuxでは、標準のリアルタイム音声合成ライブラリがあるかどうかがわからなかったので、残念ですがデフォルトでは動作しません。Windowsなどで良い感じのライブラリがあれば教えて下さい。

(02/06追記:Windows対応しました

上記サンプルのように、g:shaberu_user_define_say_commandを定義して任意のコマンドを実行できるようにすることができます。

しゃべらせる

「:ShaberuSay 喋らせたいテキスト」というコマンドでしゃべります。:ShaberuMuteOnするとミュートになります。出社中とかはおもむろにMuteにしましょう。Mute解除は:ShaberuMuteOffです。:ShaberuMuteToggleでトグルもできます。 g:shaberu_echo_when_muteが1の場合は、Mute時に:ShaberuSayコマンドを実行した際、echoエリアにテキストが表示されます。

HookやAutocmdでVimとイチャイチャする

" Vim core
autocmd MyAutoCmd VimEnter * ShaberuSay 'ビムにようこそ'
autocmd MyAutoCmd VimLeave * ShaberuSay 'さようなら'

" VimShell
autocmd FileType vimshell
      \  call vimshell#hook#add('chpwd'   , 'my_vimshell_chpwd'   , 'g:my_vimshell_chpwd')
      \| call vimshell#hook#add('emptycmd', 'my_vimshell_emptycmd', 'g:my_vimshell_emptycmd')
      \| call vimshell#hook#add('notfound', 'my_vimshell_notfound', 'g:my_vimshell_notfound')
function! g:my_vimshell_chpwd(args, context)
  ShaberuSay 'よっこいしょ'
endfunction
function! g:my_vimshell_emptycmd(cmdline, context)
  :ShaberuSay 'コマンドを入力してください'
  return a:cmdline
endfunction
function! g:my_vimshell_notfound(cmdline, context)
  :ShaberuSay 'コマンドが見つかりません'
  return a:cmdline
endfunction

" .vimrc保存時に自動的にsource
autocmd MyAutoCmd BufWritePost .vimrc nested source $MYVIMRC | ShaberuSay 'ビムアールシーを読み込みました'
" 開発用ディレクトリ内.vimファイルに関して、ファイル保存時に自動でsourceする
execute 'autocmd MyAutoCmd BufWritePost,FileWritePost' s:local_bundle_dir . '*.vim' 'source  | echo "sourced : " . bufname("%") | ShaberuSay "ソースしました"'

こんなかんじで。TweetVimで新規MentionやDMがあった時に通知したりできれば便利な気がするけど、Hookなかった気がする…

Vim Advent Calendar 2012 68日目

Vim Advent Calendar 2012 68日目は@scheakurさんです。もうすぐ70日ですか。すごくアドベントな感じですね。

Unite.vimで突然の死に備える

unite-sudden-death

unite-sudden-death

sudden-death.elのVim版みたいな感じです。NeoBundleで適当にインストールして、:Unite sudden-deathすれば使用することができます。突然の死したい言葉を入力して、あとはUniteのお好みのアクションを実行してyankなりinsertなりできます。TwitVimなんかと相性がいいんじゃないでしょうか?

初めて作ったVimプラグインです。プラグインというよりはUniteのsourceですが。Vim Scriptを書くのは初めてなので、自称VQ(Vim Quotient:Vim指数)1300億の妻に手伝ってもらおうかと思いましたが、なぜか妻は私が知っている事しか知らないため、仕方なくウェブ上の資料やVimテクニックバイブルやhelpを見て仕上げました。

右も左も分からない状況で勘に頼って書いたコードなので、substitudeとかmapの使い方がキモいかもしれません。でもとりあえず何か作って公開するのって大事ですよね。今後も幾つか小ネタ的なものを作ってVim Script力を上げていきたいと思います。