vimでRSenseの補完ができない件で悩んでいたけどとりあえず解決できた
環境はWinXP/香り屋さんのvim7.3/RSense3.0/Ruby 1.9.3です。
RSenseをセットアップして、vimからRSenseVersionできるのに、補完が効かない。
C-x C-o でオムニ補完すると、「パターンは見つかりませんでした」と出る。
実は2週間だらだらとできないなーと悩んでいたのですが、腰を据えてトラシューしてみたら、原因が判明して、動作するようにできた。
状況の整理
調べたこと
ログは次のように出ているわけです
recv: code-completion --file=C:\DOCUME~1\ZZTSAS~1\LOCALS~1\Temp\VID331.tmp --location=5:5 --prefix= --detect-project=test.rb
test.rb
# RSense completion test def test str = "testdesu" str. end
で、vim->RSenseへの処理を調べてみた。この時点ではvimからRSenseに補完のリクエストが出ているけど、受け取るときとかに問題が出ているのではないかと予想
オムニ補完すると、rsense.vim の RSenseCompleteFunction が呼ばれるらしいのでそこを見る
function! RSenseCompleteFunction(findstart, base) if a:findstart let cur_text = strpart(getline('.'), 0, col('.') - 1) return match(cur_text, '[^\.:]*$') else let result = split(s:rsenseCommand(['code-completion', \ s:rsenseCurrentBufferFileOption(), \ s:rsenseCurrentLocationOption(), \ '--prefix=' . a:base]), \ "\n")
となっていて、rsenseCommand を呼び出している。
function! s:rsenseCommand(args) for i in range(0, len(a:args) - 1) let a:args[i] = shellescape(a:args[i]) endfor return s:system(printf('ruby %s %s %s', \ shellescape(s:rsenseProgram()), \ join(a:args, ' '), \ shellescape('--detect-project=' . bufname('%'))))
これをみると、s:system でコマンド実行しているようだ。
ということは、ログに出ていたのはこの部分で、コマンド実行されているだけってことか。ということで、ログの出力の先頭にs:rsenseProgramから戻ってくる結果をくっつけて、%RSense_HOME%で実行してみた
FileNotFoundException とは。。。
そして、エラーメッセージのファイル名に「¥」が無い。。。そうか!!エスケープシーケンスが悪さしているんじゃね?
で、コマンドラインをちょっと細工(¥→¥¥に。RSenseはJavaだからねー)
おー。補完されてるっぽい!
ということで、rsense.vimに細工
ぐぐると文字列の置換はsubstituteを使えばいいっぽい。
http://route477.net/w/?VimScriptMemo
--- C:/Program Files/vim73-kaoriya-win32/vim73/plugin/rsense.vim.original Tue Sep 25 23:14:19 2012 +++ C:/Program Files/vim73-kaoriya-win32/vim73/plugin/rsense.vim Sat Sep 29 05:00:41 2012 @@ -37,7 +37,7 @@ function! s:rsenseCurrentBufferFile() let buf = getline(1, '$') - let file = tempname() + let file = substitute(tempname(), "\\", '\\\\', 'g') call writefile(buf, file) return file endfunction
やっとできて、すっきりしました~
いやーRSenseステキ〜!!vimステキ〜!!
GDD11JP DevQuiz解答晒し祭り:WebGame用ChromeExtension 意味なく公開
巷で流行っているそうですので、わたくしも晒します。
分野別クイズはWebGameとGoをやりました。
スライドパズルは519個しか解けませんでした。幅優先検索をスタートとゴールから実施して、マンハッタン距離(壁無視)でコストを出して、コストが低いものから解くようにしたという感じです。60秒で解けないものはあきらめるという作戦で、一晩動かしてそんなスコアです。よってこれは晒さない。
TF枠で当選していたこともあり、スライドパズルはその辺でやめてしまいました。
TF枠なんで当選したのかは等の本人も首をかしげる状態です。何基準なのでしょうか。
GO!
GOははじめて書きましたが、こんなのでいいのでしょうかね。。
package main import ( "fmt" "io" "strings" "image" _ "image/png" ) func CountColor(png io.Reader) int { img, _, _ := image.Decode(png) rect := img.Bounds() //Rectangle //Colorを記憶するMap colors := make(map[string] string) for x := 0; x < rect.Max.X ; x++ { for y := 0; y < rect.Max.Y; y++ { //fmt.Println(img.At(x, 3)) r, g, b, _ := img.At(x, y).RGBA() srtRgb := string(r) + "," + string(g) + "," + string(b) colors[srtRgb] = srtRgb } } //fmt.Println(len(colors)) return len(colors) }
コンパイラのインポートエラーがよくわからなかった(_ "image/png")のところ。今もちょっと良くわかってないw
あと、Try&Errするのに、以下が役に立ちました。特に環境がなくてもブラウザで動かせたので。
http://golang.org/doc/play/
Web Game
ChromeExtensionは以下に公開してみました
https://chrome.google.com/webstore/detail/hchabofhnbmpbeoocneocmlehpcflmbh?hl=ja
中身は結構かんたんです。
こんなの書きました。jqueryを使ってます。
solver.js
//[id1, id2]を格納していく。キーはcolorの値を使ったHash var colors = {}; //カードを1枚ずつあけていく処理 var elements = $("div.card"); elements.each(function(){ var self = $(this); self.click(function(){ var _color = self.css("backgroundColor"); var _id = self.attr("id"); console.log("id=" + _id + ", color=" + _color); if (!colors[_color]) { colors[_color] = []; } colors[_color].push(_id); }); clickEvByDom(this); }); //console.log(colors); //同じ色ごとにクリックしていく for (var arr in colors) { console.log("arr:" + arr); elem0 = $("#" + colors[arr][0]).get(0); elem1 = $("#" + colors[arr][1]).get(0); clickEvByDom(elem0); clickEvByDom(elem0); clickEvByDom(elem1); } //jQueryのClickではNGなのでDOM経由でClickする function clickEvByDom(elem) { var clickEv = document.createEvent("MouseEvents"); clickEv.initEvent("click", false, true); elem.dispatchEvent(clickEv); }
とりあえず、1枚ずつあけていって色とIDを記憶して、同じ色同士をクリックしていくという単純な戦略です。この程度であっさりといけてしまった。
これをExtensionとして組み込むために、マニフェストを書きます。
{ "name": "GDD11JP Web Game Solver", "version": "1.0", "description": "google developer day 2011 jp Web Game solver.", "content_scripts": [ { "matches": [ "http://gdd-2011-quiz-japan.appspot.com/webgame/problem*" ], "js": [ "jquery-1.4.4.min.js", "solver.js" ], "run_at": "document_end", "all_frames": true } ] }
JSON形式ですね。ポイントは
-
- matchesのところに、実行したいURLを指定
- jsのところに、jquery.js -> solver.js の順番で指定(逆は駄目)
ぐらいですね。
マニフェスト書く上での注意点は、コメントアウトしては駄目とか、余分なカンマを打たないとかですね。
実際にローカルで作るときは、マニフェストとJSを同じフォルダに置いてchrome://extensions/ で、デベロッパーモードにして、そのフォルダ読み込めば動きます。Greasemonkeyと違って、Extensionを修正したら、chrome://extensions/再読み込みしないと駄目で、これをいちいち手でやるのが面倒ではありますが、結構手軽に作れますね。
それにしても、Chrome Web Storeに公開するときに、1280x800のスクリーンショットが必須とか、128x128のアイコンが必須とか、メンドクサイなと思います。デフォルトの何かを提供してくれたり、適当にリサイズしてくれればうれしいんですけれどね。こんなことぼやくとガイドラインに反するって怒られたりして。。。
夏の節電に向けてLinux物理サーバーを直接仮想化する
政府が電気の大口需要者に対して夏のピーク時の電力使用量を前年比25%減らすように言われているようで、うちの会社でも、サーバーの消費電力削減という話がありました。
そこで複数台のサーバーを1つの仮想サーバーにまとめると結構いい節電対策になりますのでやってみます。
移行時に1からインストールして、環境を復元しても出来ますがかなり手間です。
ということで、P2Vします。物理サーバーを直接仮想化することをP2Vとか言ったりします。
VMware vSphere Hypervisor(ESXi)とVMware vCenter Converter Standalone 4.3の環境でLinuxサーバー(CentOS5)をP2Vしてみます。
注意点としてLinux LVMで構成されている物理サーバーをConverterを利用してP2Vすると、問答無用に非LVMなパーティションに変換されてしまいます。
LVMをパーティションサイズの拡大を後から行えるようにという要件で設定している場合があると思いますが、オンラインでのサイズ拡大にこだわらなければ、LVMでなくてもGpartedなどのフリーなパーティション操作ツールを使ってオフラインで拡大すれば良いという判断も出来ます。
ハードディスクがESXiによって仮想化されているので、複数のディスクを束ねて一つにまとめられるというLVMの利点は薄れていますね。直接仮想ディスク(vmdkファイル)の容量を拡大してしまえるので、仮想ディスクの容量を拡大したあとにオフラインでGPartedでパーティション拡大してしまえます。
極力サーバを運用したまま容量を増やしたい要件がある場合は、この手順ではなく、Mondo Rescueなどを使って一旦ディスクイメージのバックアップを取ってから、仮想マシンへリストアしてLVMを維持するなどの方法を検討したほうが良いです。またLVMのスナップショットが必要という要件もあるかもしれませんが、同様ですね。。
必要なもの
- ESXiサーバー
あらかじめESXiを導入しておきます
- VMWareConverter4.3を導入した別WindowsPC
ConverterはVMWare社からダウンロードします info
注意点として、VMWareConverter 4.3へ4.0.xからアップグレードインストールすると、LinuxのHotP2Vが動かない問題があります(LinuxソースをConverterで指定すると[ライブ Linux ソース マシンをクエリできません]というエラーメッセージが出て先に進めない)。必ず4.0.xをアンインストールしてから4.3を新規インストールします。 デスクトップ、アプリケーション、データセンター仮想化のための VMware のサポートとダウンロード
変換を行っているときに、ヘルパーサーバーというのが裏で起動するらしいです。おそらくそれが利用するものです。DHCP環境なら意識する必要はありませんが、そうでないときはIPアドレスやサブネットマスク、デフォルトゲートウェイアドレスの指定が必要です
- 変換対象の物理サーバー(今回はCentOS5)
サポートされるゲストOS(デスクトップ、アプリケーション、データセンター仮想化のための VMware のサポートとダウンロード )に直接の記載はありませんがRedHatがサポート対象なので、良しとしています。
移行元サーバーと移行先を並行運用する場合に必要に応じて用意します
作業手順
VMware Converterを適当なWindowsPCに導入します
移行元サーバーの前準備
- 移行元CentOSで外部から更新が起きないようにhttpdやNFSなどのサービスを停止します。また、可能な限りサービスを停止させます
- 特にデータベースはとめておいたほうが良いです。
- ただし、移行時に必須なのでSSHは停止しません
- SSHでrootユーザのログインを許可する
#vi /etc/ssh/sshd_config
-
- SSHを再起動させる
#service sshd restart
Converterで変換する
- マシンの変換をクリック
- まずソース(変換元)のIPアドレスやrootアカウント情報を入力する
- 次にターゲット(ESXi)のIPアドレスやアカウント情報を入力する
- 仮想マシンの名前をつけます
- 仮想マシンのファイルを格納するデータストアを指定する
- オプションの画面で大事な設定が2つあります
- 仮想ディスクファイルの容量をあらかじめ確保しないようにする(フラット→シンにする)。詳細のリンクをクリックして、タイプを「シン」にする。フラットのばあい、100GBの仮想ディスクを作った時点でデータストアの容量を100GB消費しますが、シン(シンプロビジョニング)にすると、実際にファイルとして使用した容量が消費されます。
-
- もう一つがヘルパーVMネットワークの設定。この設定を間違えると変換タスクが1%から先に進まなかったりします。。
- 内容を確認して終了をクリックする。変換作業が始まる。
- しばらく待つと仮想化されます。
CentOS5の開発機(HDD使用量47GB)が1時間40分で仮想化されました。
以上で終わりです。
Converterのアップグレードインストールの件と、ヘルパーVMの設定に気づかなくて多少時間をロスしてしまいましたが、それ以外はすんなりと変換できてよかったですよ。
HT-03A +Cyanogenmod 6.1 + Maps5.0hack版 で Maps5.0の新機能(3Dやコンパスぐりぐり)を有効化する
先日公開されたGoogle Maps 5.0ですが、すばらしい機能がついてますね。
以前、ヘッディングアップのGoogle Mapsのサンプルを作ってみたこともありましたが、もうそんなもの要らなくなりました。
一部新機能はAndoroid2.0以上みたいでしたが、自分はCM6.1だからね。へへん!って思ってたのです。
で、Updateが来て!やったー!!!とおもった数分後に絶望が。3Dはどこ行った?
気を取り直して、CMのForam見ると、情報が・・・
http://forum.cyanogenmod.com/topic/12628-map-50-update/page__view__findpost__p__107221
どうもGoogle Maps 5.0の新機能はデバイス情報から3Dなどの新機能の有効・無効を切り替えているらしいです。
強制的に追加機能を有効にするHackがXDAにありましたので、試してみました。
でも、やっぱりパフォーマンス不足らしく、新機能は動作しますが重いです。とくに3Dで渋谷を表示すると激重です。。
前提
- Root化し、ROMをCyanogenMod6.1などAndroid2.0以上にする必要があります。
- PCでの作業が必須のようです。開発環境を整備し、USBケーブル経由でadbが使えるようになっている必要があります(Hack版のAPKを端末上でインストールすると何故かインストール不可でした。)
- すべて自己責任になります。操作を誤ると端末が使えなくなる可能性が考えられます。また端末の保障もなくなると思いますのでご注意を。
手順
- 万一のためにバックアップを取得します。ROMごとバックアップするとか、Titanium BackupでMapsをバックアップするとか。
- HackバージョンのGoogleMaps5.0をPCにダウンロードします
http://forum.xda-developers.com/showpost.php?p=9868137&postcount=2079 にある、maps5.0.0.5014-brutdev.apk です。
adb remount adb shell "find /system /data -name *com.google.android.apps.maps.apk* -o -name Maps.apk | xargs rm" adb uninstall com.google.android.apps.maps
- adb経由でHack版をインストールする
cd [ダウンロード先フォルダ] adb install maps5.0.0.5014-brutdev.apk
- 端末でGoogle Mapsを開く
- 通知バーに△マークの通知が出たら、クリックしてGoogleアカウントへのアクセスを承認する
- GPSをONにして、現在地が特定されると画面右上の現在地ボタンがコンパスのような見た目に変わります。タップすると3D表示でコンパスよってグリグリ動きます。
迷惑電話対策Androidアプリケーション MeiwakuBaster を公開しました
不動産投資の勧誘電話、かかってきませんか?
以前から会社の電話にはかかってきていましたが、いつからか私用の携帯電話にもかかってくるようになりました。心当たりといえば、知らない電話番号からの着信に出る際に自分の名前を先に名乗り、直後に切断されたことがあったということ。録音でもされていたのかも。。。電話に出るときには先に名乗ってはいけないというのが常識になりそうで、いやな世の中ですね。。
とにかくいろいろな番号から、市外局番で言えば、東京、横浜、大阪などからたまにかかって来ます。
せっかくスマートフォンを持っているのだから、何かアプリは無いかと探してみると、あるにはあるのですが、あらかじめ着信拒否の電話番号を登録する必要がありました。という事は一回は電話に出なければいけないということです。
そこに問題点を感じ、今回公開したMeiwakuBasterを作りました。電話着信時にGoogleで検索し、その結果から迷惑電話かどうかの判定を通知バーに表示します。
詳しい機能説明やインストールについては MeiwakuBaster サポートページ を参照ください。
もしよろしければ、使ってみてください!
shibuya.trac 第8回勉強会に参加してきました
ブログ書くまでが勉k(ry とか言われていたりしますが、最近は、次の勉強会でLTするまでが勉強会らしいです。。。
前回に引き続き、2回目の参加でしたが、楽しかったです。ビールのみながら、まじめな話と楽しい話と、同じことに問題意識を持った人が集まっていて、共感できて。そういう雰囲気でした。
以下、私なりのメモです
前説: Ruzeeさん
- Shibtraとは
- 企画会議なし!
- しゃべりたい人がしゃべる!
- 初心者歓迎!
- 2、3ヶ月に1回は開催!
発表
分散開発におけるTrac: こんぴろさん
- 個人的な意見です
- 言いたいこと = はさみとツールは使いよう
- 下手に使うと足かせだと
- 現在のプロジェクト
- 東京都福井で分散開発(320km離れている)
- 地理的に離れた場所=分散開発
- ところで、アジャイルマニフェスト
- プロセスやツールより個人との対話
- けど、320kmはなれたら
- 個人との対話をプロセスとツールで補う!
- ★なるほど
- 個人との対話をプロセスとツールで補う!
- Tracはマクロ、プラグインが豊富でいい
- FullBlogPlugin
- 主に朝会
- 画面見ながら、Skypeで
- 昨日やったこと、今日やること、連絡を”事前に”書いておく
- TagsPlugin
- Wikiにタグを付ける
- Blogにカテゴリの機能がつく
- TracWysiwygPlugin
- Wysiwyg!
- ★うちも愛用してます!
- Mikogo (http://www.mikogo.com/)
- フリーのデスクトップ画面共有ツール
- 朝会で活躍中
- デモ
- ChromeのExtensonでチケットにログを書く
- Mikogoで共有
- 最後にもうひとつ
- いいやり方を知ると、原理主義になりがちだけど、自分たちのコンテキストに合わせて変えていく!が重要だね
HudsonとAutoItで自動テスト: こかわさん
- 初参加
- アンケート
- Hudson知ってる?
- みんな手が上がる。
- Hudsonつかってる?
- 半分ぐらい
- 自動操作テストを導入している?
- すくない
- クライアント系?Web系?
- Web系多し
- Hudson知ってる?
- Hudson自体の説明は省略
- 自動操作テストをHudsonでやりましょうという話をする
- (っと、ここでピザ到着。そして中断)
- AutoItで自動操作テスト
- AutoItでできること
- デモ
Tracで今日からはじめるスクラム/アジャイル開発: kawaguchiさん
TracでAgile開発
LT
神速さん: 5分でわかるTracPluginの作り方
- いきなりの敗北宣言!(5分じゃ無理!)→爆笑
- Pluginの仕組み
- 実例
- ねたを決める
- WorkFlowEditorPlugin
- Web上からTrac.iniを弄る
- ステータス変更以外はできない→できたらすごくない?
- WorkFlowEditorPlugin
- ねたを決める
(っと、ここで時間切れ!)
ゆかわさん: Tracのソースを呼んでみたー
とらっくじら: ショーンさん
(TracとJIRA)
引越しのタスクをBTSで: ikikkoさん
RedminでもTracLightnig: かおるんさん
WikiMacro3分間クッキング: riskさん
後説
- Ruzeeさん
- 次回未定
- 年末か年始
- 会場、発表者募集
- かえってブログ書くまでが勉強会
- ていうか、次回LTやるまでが勉強会
- TracLightnig3.0
- アルファ版テストご協力を!
- 次回未定
trac 0.12 のマルチリポジトリでrefs #1をうまく動かす Multi Repository Helper Plugin を作りました
Tracはバージョン0.12でマルチリポジトリに対応しています
設定はこんな感じですね。
- Trac0.12の配布アーカイブ内にある contrib/trac-svn-hook スクリプトを適当な場所に配置する
- この例では、/opt/trac-0.12/hooks としています。環境に合わせて読み替えます。
- #{SVN_ROOT}/#{PROJECT}/hooks/post-commit を作成します
#!/bin/sh # REPOS=$1 REV=$2 export TRAC_ENV=/var/www/html/trac012/proj1:/var/www/html/trac012/proj2 /opt/trac-0.12/hooks/trac-svn-hook $REPOS $REV
上記のように複数のTracプロジェクト(プロジェクトAとプロジェクトB)が同じSVNリポジトリ(リポジトリ1)を参照している場合に、困ったことがおきます
ふつう、チケットとタスクは1対1ですから、どちらかのプロジェクトの1番チケットに対してのタスクを行ってコミットしているはずですよね(たとえばプロジェクトAの1番チケットのタスクとして、このようにコミットする場合)
共通ライブラリ的なものは、別リポジトリになりがち(え、違いますか?すみません)とおもいますので、このようなことがおきてしまいがちと思います。
ということで、次のような書式のrefsを受け取った場合に、目的のプロジェクトのチケットにコメントを残すようにできるPluginを作りました
- refs #projectA/1
また、#projectA/1がリンクとして機能するようにもしています。
shibya-tracのリポジトリに置かせていただきました。
インストールはソースをチェックアウトしてEGGファイルを作って、プラグイン保存ディレクトリに配置してください。
$ svn checkout http://svn.sourceforge.jp/svnroot/shibuya-trac/plugins/MultiRepositoryHelperPlugin/trunk/ multiRepositoryHelperPlugin $ cd MultiRepositoryHelperPlugin/ $ python setup.py bdist_egg $ cp dist/TracMultiRepositoryHelperPlugin-0.1-py2.4.egg /path/to/trac-plugindir
Trac0.12からはプラグインのディレクトリが変わっていて/usr/share/tracとか無くなっています。
ですので、site-packages か、各プロジェクトのpluginsに入れてください。管理画面からアップロードできるようになっています。
また、EGGを配置したらTrac0.12の管理画面でプラグインを有効化します。
なお、次の制限があります。
- refs #プロジェクト名/チケット番号の書式のみの対応です
- 複数のチケットにリンクする場合は、とりあえずのところは refs #projectA/1 refs #projectB/5 などとrefsを省略せずに書いてください(refs #projectA/1, #projectB/5のような記載には対応していません)
- fixes #hoge/1というように、fixesにも対応していません
※参考にしたページ
http://coders.g.hatena.ne.jp/bellbind/20070420/p1
http://trac.edgewall.org/wiki/TracDev/PluginDevelopment
http://trac.edgewall.org/wiki/TracDev/ApiChanges/0.12#IRepositoryChangeListener