rroonga でインデックスカラムから転置インデックスを参照しようとしたが出来なかった
2012/08/16 groonga 1.0.0
rroonga でわかち書きされた文章を取りだして、それを集計しようと考えてたけど、転置インデックスが見つからなかったので苦戦。未解決です。
rroongaはgroongaのrubyバインディング。転置インデックスで高速に検索できるらしい。転置インデックスから分割された文章が参照できるはずと予想。
groongaにデータを登録してからインデックスが更新されるまでの流れ - ククログ(2011-10-05)を参考にインデックスカラムに転置インデックスの場所を探す。
転置インデックスを見つけて一番目の中身を返してみる。
~~ irb(main):116:0> terms = Groonga["Terms"] => #<Groonga::PatriciaTrie id: <276>, name: <Terms>, path: </tmp/tmpdb/test3.db.0000114>, domain: <ShortText>, range: (nil), flags: <KEY_NORMALIZE|WITH_SECTION>, encoding: <:utf8>, size: <198048>> irb(main):117:0> terms.columns => [#<Groonga::IndexColumn id: <277>, name: <Terms.Comments_comment>, path: </tmp/tmpdb/test3.db.0000115>, domain: <Terms>, range: <Comments>, flags: <>>] irb(main):118:0> terms.columns[0][1] => 472
期待した動作では、転置インデックスの配列が返ってくると思ってたけど、なにかのIDひとつが返ってきた。
インデックスカラムのデータ構造がさっぱり分からない。。
さくらVPS環境をMondorescueでバックアップしてVmwareにリカバリする
2012/06/09 環境:centos5.7 さくらVPS 1Gモデル
さくらVPSで作った環境を手元にもほしいときの作業メモ
サーバで開発も行なっていたけど手元のVM環境にフルバックアップして移したい
ってことありますよね。
リカバリはkernel panicから復帰して完了したもので、ところどころ手抜きしてます。mondorescue と助け舟のさくらVPSと同じバージョンのConetOSイメージ(rescueモードのため)を用意してください。
mondrescueのインストール
まず、さくらVPS上でmondorescueをインストールします。
ここを参考にインストール
【さくらのVPS】さくらのVPSでmondo rescueを使ってCentOS全体を丸ごとバックアップしようとしてみました その2→少し起動成功
mondorescue のバージョンは3.0.2-1.rhel5を使いました。3.0.1だと失敗します。
いったん削除
# yum erase mondo # yum erase mindi mindi-busybox afio buffer
レポジトリ指定をしてインストール
# yum --enablerepo=dag install mondo
バックアップ
バックアップを作成する。/bacは保存先 -E /bac は保存先を除く
# mondoarchive -Oi -g -N -s 4200m -d /bac -E /bac
リカバリ
操作はノートPCに移る。サーバの/bac に作成されたisoファイルがあるので、
scpか何かで手元のノートPCに持ってくる。vmwareでisoファイルを指定して起動する。
Mondorescue では lvm まで柔軟に構築してくれないので、ハードディスク構成が違うとnukeモードでは失敗する。
なので、手動でパーティションとlvmの作成を行なうのがよいらしい。
安心してほしいのが、さくらVPSはHDDを100GB持っているがそれに合わせる必要はなく20Gでも作成できたこと。
パーティション作成
mondorescue の OS が起動したら白い boot:選択画面になる。
選択の種類は、自動のnuke,手動のinteractive,コマンドのexpertがある。
今回は、パーティションから作るのでexpertを指定する
boot:expert
をタイプするとコマンドラインに移行する。
vmware は仮想HDDがあってSCSIの場合 /dev/sda にある。
まずパーティションの作成を行なう。
fdisk で作成画面に入る
fdisk /dev/sda
ここではいろいろ作成コマンドが使える。
- mはヘルプのようなコマンド一覧と説明
- aはブートフラグを立てる
- nは新しいパーティションの作成
- tはシステムタイプの設定
システムタイプ
まずnでボリュームを作成する。
さくらVPSと出来るだけ同じ環境を作る。さくらVPSでは/dev/vda1にbootのパーティションがある。
さくらVPSの環境
Command(m for help):p デバイス Boot Start End Blocks Id System /dev/vda1 * 1 13 104391 83 Linux /dev/vda2 14 13054 104751832+ 8e Linux LVM
パーティションを1番目に作って、ブロックは1から13までにして、
ブートフラグを立てる。
Command(m for help):n p 1 1 13 Command(m for help):a 1
さくらVPSの/dev/vda2にはLVMがある。
パーティションを2番目に作って、ブロックは14から2610(VMの容量)までにして、
システムタイプをLinux LVMにする。
Command(m for help):n p 2 14 2610 Command(m for help):t 2 8e
出来上がった環境
Command(m for help):p デバイス Boot Start End Blocks Id System /dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 2016 20860402+ 8e Linux LVM
LVMの作成
16Gで作成して、スワップ2Gとしました。
# lvm pvcreate /dev/sda2 # lvm vgcreate VolGroup00 -s 32m /dev/sda2 # lvm lvcreate -L 16000m -n LogVol00 VolGroup00 # lvm lvcreate -L 2000m -n LogVol01 VolGroup00
フォーマット
# mkfs.ext3 -j /dev/hda1 # mkfs.ext3 -j /dev/VolGroup00/LogVol00 # mkswap /dev/VolGroup00/LogVol01
これでパーティションの作成は終わりです。
mondorestore
あとは、mondorestoreでリストアを行ないます
# mondorestore
- 手動のinteractiveを選択
- 最初のmountlistは/dev/vdaのところを全部/dev/sdaに変える。
- サイズは0MBにそれぞれすることでさくらVPSとあわせなくて済む。
- Are you sure you want to save your mountlist and continue? [Yes]
- Do you want to erase and partition your hard drives? [No]
- Do you want to format your hard drives? [No]
- Do you want me to restore all of your data? [Yes]
- Initialize the boot loader? [Yes]
- ここが大事そうだが未確認:"You will now be able to re-generate your initrd...初期化するためのinitrdを再作成しますか?VM環境では必要かもよ。他のサイトでは[No]
[Yes]を選ぶとコマンドラインに戻る。
モジュール環境が違うので再作成したほうがいいと思う。けど、わからなければ後からrescueモードで再作成するか、ここまで戻ってきて修正するのもあり。
モジュールの設定を変更
aliasの追加を行なう。
■SCSIコントローラーが"LSI Logic"の場合
alias scsi_hostadapter mptscsih
■SCSIコントローラー が"Bus Logic"の場合
alias scsi_hostadapter BusLogic
# vi /etc/modules.conf
initrdの再作成
# cd /boot # mv initrd-2.6.18-XX.XX.X.el5.img initrd-2.6.18-XX.XX.X.el5.img.org # mkinitrd -f -v initrd-2.6.18-XX.XX.X.el5.img 2.6.18-XX.XX.X.el5
完了
終わると再起動をかけます。
もし、起動の途中で、
kernel panic attempted to kill init
という恐ろしい表示がでたらモジュール設定が違っていて、initrdに問題ありです。
私はrescueモードでgrubとinitrdを再作成しました。
これで完了です。
ちょっとだけプライバシーを尊重させるブラウザの設定
2012/06/08
タイトル通り、ブラウザのDNT(後で説明)設定を載せるよ。
日常的なネットでのデータ収集
ネットサーフィンをするとさまざまな情報を収集される。
たとえば、どこのリンクから来たのか、どこのIPからなのか、どういった検索をしたのか。
SNS だと誰と誰が繋がっているか、など。
これは、その人に買わせたいモノを選んで提供できるようになるので、
広告を宣伝する上では貴重な情報になる。
これを嫌だと思うひともいるはず。
DNT:"Do Not Track"(トラッキング拒否)機能
情報収集されたくない人のために最近のブラウザではトラッキング拒否機能があります。
これに対応しているサービスはプライバシーを尊重して、情報収集をしなくなります。
現在のブラウザでは、標準でこの機能がONになっていないのがほとんどです。
※IE10では標準でONになるようです。標準でオンにしてしまうと、拒否したい人と区別がつけにくくなるんですが。
これをオンにするにはブラウザの設定を変えます。
この機能はあくまでトラッキングするなというのを宣言するだけなので、
これに従わないサービスには効果はないです。
Arctic.jsのクラス継承の挙動が分からなかったのでメモ
JavaScriptはprototypeベースのクラス継承なんだけど、
Arctic.js とか enchant.js ではJavaのように
クラスベースのクラスが用意されてます。
Arctic.jsのコンストラクタの挙動が分かってなかったので簡単メモ。
これはスプライトを継承したクラスを作っています。
var Player = arc.Class.create(arc.display.Sprite, { initialize:function(name){ console.log(name); } });
これをnewしたときにスーパークラスのコンストラクタは呼ばれるか?
これは Yes.
継承先のコンストラクタは呼ばれるか?
これも Yes.
nameには何が入っているのか?
これは new したときの引数がそのままnameに入っている。
なんで勝手にスーパークラスのコンストラクタが呼ばれるんだと、
分からなくなっていました。
じゃあスーパークラスをどうやって制御するかというと
Arctic.js には $super という引数があるそうです。
$superを使ったクラス継承を作ります。
var Player = arc.Class.create(arc.display.Sprite, { initialize:function($super, name){ console.log(name); } });
スーパークラスのコンストラクタは呼ばれるか?
これは No. 引数に$superを取ると呼ばれなくなるようです。
nameには何が入っているのか?
これも new したときの引数がそのままnameに入っている。
$superには何が入っているのか?
スーパークラスの関数を呼び出す関数が入っている。
$superの使い方はこうです。
var Player = arc.Class.create(arc.display.Sprite, { initialize:function($super, name){ $super(name) console.log(name); } });
これは$superを省略した時と同じ動作になります。
nameには何が入っているのか?
これも new したときの引数がそのままnameに入っている。
WindowsでRspecでautotestする
Rubyでの話。やっぱり保存したら自動でテストを行ってくれて画面隅に結果を出したいよね。
ということです。今回は参考が少なくて戸惑いどころも多いWindowsでやってみたいと思います。
テストって面倒ですよね。
導入
準備
テスト前に準備作業を強いられているんだ!(集中線)
Growlの準備
ポップアップ表示だけのソフトウェアです。
これがあるとツイッター風にテストを表示できます。
GrowlforWindows
からダウンロードしてsetup.exeを実行してください。いらないなら飛ばしてもおkです。
Rspecの準備と実行
Rspecを使う為にはテストファイルを作る必要がある。
foo.rb でファイルを作っているならば、foo_spec.rb というテストファイルを作る。
では手動で実行。rspecで検索をかければ foo_spec.rb の書き方は分かると思う。
こことか参考に
慣れていなければ、同じフォルダに一緒だと失敗しにくい。かも。
PS P:\kusoge\myProject> rspec .
〜〜〜〜
Finished in 0.038 seconds
2 examples, 1 failureFailed examples:
rspec ./spec/foo_spec.rb:10 # Main test arue
Finished in 0.038 seconds
2 examples, 1 failure
あらら、2個実行して1個テスト失敗してますね。成功です。
autotestの準備
次にautotestでファイルを書き換えるたびに自動でテストを実行します。
自動テストは当然先程のRspecのテストを使ってくれないと困ります。
まず、.autotest という自動実行の設定ファイルを作ります。
in MyProject/.autotest
# -*- ruby -*-
# require 'autotest/autoupdate'
# require 'autotest/bundler'
# require 'autotest/isolate'
# require 'autotest/once'
# require 'autotest/rcov'
# require 'autotest/restart'
# require 'autotest/timestamp'
require 'autotest/growl' #ポップアップしたいなら必要# Autotest::AutoUpdate.sleep_time = o
# Autotest::AutoUpdate.update_cmd = o
# Autotest::Isolate.dir = o
# Autotest::RCov.command = o
# Autotest::RCov.pattern = o
# Autotest::RCov.options = oAutotest.add_discovery do
"rspec"
endAutotest.add_hook :initialize do |at|
at.add_mapping(/([\w0-9]+)\.rb$/) do |f, matched|
"#{matched[1]}_spec.rb"
end
end
使いたいプラグインをここで決めるらしいです。
add_hookでは _spec.rb ファイルをすべてテスト実行させると書いてます。
自動実行
さぁ自動実行ですよ。ここでWindowsでは注意が必要です。
ちょっと前では
autospecとかいう機能があったのですが廃止されました。
なのでautotestにRspecテストだということを教える必要があります。
linuxではautoテストで実行する前には
RSPEC=true autotest
とかでも出来たのですが、Windowsでは
autotest --style rspec2
でうまく動きます。
まとめ?
ファイルを書き換えるたびに自動でテストしてポップアップ表示ができる?。
テストってこんなに簡単?。
使用ライブラリはgemとGrowlなので、少し書き換えたら他の環境でも動きます?。
なにか足りてない気がするけど、気にしない。
ACTION_SEND を使って facebook に URL とテキストを混ぜる方法
Android の Intent の話。ここではテキストとURLを区別する。
やってみた人は分かると思うんだけど、
facebook に送る時、 ACTION_SEND で
Intent.EXTRA_TEXTにテキストを入れるとなぜか削除されてしまう。
URL のみを入れた場合はうまくいく。
ではURLとテキストを混ぜるとどうなるかというと、
テキスト部分のみが削除されてしまう。ゴミ仕様。
今度はURLにテキストをスペースなしに繋げてみた。
ちゃんと全部送信される。だけど、URLが開かない。
繋げ方が悪いと思い、「URL + "?これでどうだ"」 としてみた。
こんどは文字部分がすべてURLエンコードしてくれてやがる。
これでは読めない。
なんとかURLを開けて文字を一緒に送れる方法がないかと考えた。
解決ソースはこれ
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,url + "?#上手くいった?" );
startActivity(intent);
バグで無い場合は修正される可能性あり。?は削除しても上手くいくかもしれない。
もっと賢い、SDK 以外の方法ないですか?
追記:ごめんなさい。1日で修正されてしまいました。くうう。
Androidで独自画像ボタン上にテキストを表示[Android]
Trouble:UIの ImageButton を使うと文字が表示できない。
solved:Buttonで作成してBackgroundに@drable/XXXを指定する。
result:好きな画像ボタンの上にテキストを表示することができた。
後で書く。