てみたの不思議空間【後ろ】

フィーリングで感じたことを書く

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
  • Did you change the mountlist? [Yes]
  • Boot device [/dev/sda]
  • fstabはLabel=/bootをLavel=/dev/sdaに変更する
  • mtabはvdaをsdaに変更
  • grub.confはそのまま
  • device.mapはvdaをsdaに変更
  • Label/Identify your ext2 and ext3 paritions if necessary? [Yes]
完了

終わると再起動をかけます。
もし、起動の途中で、
kernel panic attempted to kill init
という恐ろしい表示がでたらモジュール設定が違っていて、initrdに問題ありです。
私はrescueモードでgrubとinitrdを再作成しました。
これで完了です。

ちょっとだけプライバシーを尊重させるブラウザの設定

2012/06/08
タイトル通り、ブラウザのDNT(後で説明)設定を載せるよ。

日常的なネットでのデータ収集

ネットサーフィンをするとさまざまな情報を収集される。
たとえば、どこのリンクから来たのか、どこのIPからなのか、どういった検索をしたのか。
SNS だと誰と誰が繋がっているか、など。
これは、その人に買わせたいモノを選んで提供できるようになるので、
広告を宣伝する上では貴重な情報になる。
これを嫌だと思うひともいるはず。

DNT:"Do Not Track"(トラッキング拒否)機能

情報収集されたくない人のために最近のブラウザではトラッキング拒否機能があります。
これに対応しているサービスはプライバシーを尊重して、情報収集をしなくなります。
現在のブラウザでは、標準でこの機能がONになっていないのがほとんどです。
※IE10では標準でONになるようです。標準でオンにしてしまうと、拒否したい人と区別がつけにくくなるんですが。

これをオンにするにはブラウザの設定を変えます。
この機能はあくまでトラッキングするなというのを宣言するだけなので、
これに従わないサービスには効果はないです。

ブラウザの設定(IE9)

少しだけ分かりにくいです。
1.IE9を起動して右上あたりの歯車のマークをクリック
2.セーフティにマウスを合わせる。
3.追跡防止(k)...をクリック

4.右下の[有効にする]をクリック

以上で完了です。

ブラウザの設定(firefox)

firefox の場合は、オプション→プライバシータブ
→[トラッキングのトラッキングの拒否をWebサイトに通知する]にチェックを入れる。

以上で完了です。

ブラウザの設定(chrome,Safari 5.1)

chrome..今はできない..
なんでも共有しようぜっていうgoogle様だもの。

Safari 5.1
ごめん、使ってない。

以上で完了です。

まとめなんてなかった。
参考リスト:

  • [Do Not Track Test Page]

http://ie.microsoft.com/testdrive/browser/donottrack/default.html

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に入っている。

Javaを使っていた人にとってはスーパークラスの関数を引数に取ることは、
トリッキーにみえるかもしれないです。

WindowsでRspecでautotestする

Rubyでの話。やっぱり保存したら自動でテストを行ってくれて画面隅に結果を出したいよね。
ということです。今回は参考が少なくて戸惑いどころも多いWindowsでやってみたいと思います。
テストって面倒ですよね。

みどころ

Windows環境
rspecの導入
自動でテスト
画面端ポップアップ表示
たぶん他の環境でも動く

導入

使用ライブラリ
  • gem install rspec
    • これはテストに必要
  • gem install ZenTest
    • これはautotestに必要
  • gem install autotest-growl
    • これはポップアップするのに使うが無くてもいい

準備

テスト前に準備作業を強いられているんだ!(集中線)

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 failure

Failed 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 = o

Autotest.add_discovery do
"rspec"
end

Autotest.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:好きな画像ボタンの上にテキストを表示することができた。


後で書く。