ディスク容量不足の時の調査

Linuxサーバーでディスク容量が逼迫し始めたとき、どのディレクトリが容量を食ってるか調査する手段。

しょっちゅう使う事がないので、いざというときに忘れているから覚え書きとして...。

#du -h –max-depth=1 /

とすると、ルートディレクトリ配下のディレクトリ毎にどれだけ容量を食ってるかが表示される。

#du -h –max-depth=1 /var

とかで下層を掘っていくことが可能。

モッツァレラーチーズを作ろう!

モッツァレラチーズ作りに挑戦です!

【用意したもの】

0102eb197903fb56fe28f1c63aaf549920b510bb7f

・低温殺菌牛乳・・・2L
・レンネット粉末・・・耳かき1杯程度の粉末を10ccの水に溶かしておく
・クエン酸粉末・・・小さじ1を20ccの水に溶かしておく

1.牛乳を温めてクエン酸水をまぜる

牛乳を鍋で12℃まで最弱火で加熱したあと、クエン酸水を入れてゆっくりと混ぜ5分ほど待ちます。

2.レンネットを投入

牛乳に少しモロモロっとした塊ができ始めるので、最弱火で7分くらいかけて32℃まで温めます。
牛乳があったまったらレンネット水をいれて混ぜ、また5分程度待ちます。

この時に徐々に牛乳が固まり始めます。

3.牛乳を加熱してカード(かたまり)とホエー(水分)に分離させる

牛乳を45℃まで最弱火で加熱します。この時、事前に固まった牛乳(カード)をナイフやスケッパーでサイの目状に切っておきます。

...って、あれ?あんまり固まってないぞ?

4.カード(牛乳の塊)を水切り

01876358a96daf724841db0a11db8c6a95d4260ef0

カードを鍋からお玉などですくい、キッチンペーパーなどで水切りします

5.カードをこねる

鍋に残ったホエーを85℃まで加熱します。
加熱したホエーに水切りしたカードをお玉ですくって入れ、耐熱手袋を手にはめてアツアツのカードをこねます...こねます...

なんだこれ、ボソボソすぎてこねるどころじゃねぇ...砂場の砂握ってるみたいで、指の間から全部こぼれていくし...。
数回こねたら伸びとツヤが出てくるらしいが...いつまでたってもコナゴナのカードが指の間から出ていくばかり!

6.塩水につける

こねてまとまったら、濃い塩水に1時間程度つけて完成!

6.カッテージチーズの完成!

できたー!おいしいカッテージチーズですよ!

01c8a07dc4a0d836499209b4f1e820cff4335b3ea3

え、モッツァレラチーズ?なにそれ?
ウワーン、また再チャレンジしてやるー!

【敗因?】

おそらく、クエン酸の量が多かったのではないかと思います。

2番の手順であまり固まっていなかったため、参考レシピの指示に従いクエン酸を追加したのですが、その時の分量が多かったため急速に水分が分離してしまい、レンネットによる凝固がうまくいかなかったような気がしています。

もしくはレンネットの量が少なかったか...。

何事も、やってみないと分からないものですね。

次こそは、おいしいモッツアレラチーズができたらいいなぁ!

AmazonSNSでKindleFireにPushさせる(ADM)とき実機デバッグで E/ADM: ADM Error INVALID_SENDER – Unable to parse API Key for package [package_name]. Did you forget to embed it? とか言われる場合

Kindle Fire端末向けにPushを組み込もうとしてADMを実装していましたが、Amazonのマニュアルに従いassetsフォルダにapi_key.txtを作り、いざ実機で動作確認しようとしたところ、

E/ADM: ADM Error INVALID_SENDER – Unable to parse API Key for package [package_name]. Did you forget to embed it?
(お前、api_keyファイル埋め込んでなくね?)

って言われて、登録IDすらろくに取得できずに数時間無駄にしました。

ちなみに環境はWindows10上でAndroidStudio2.xを使っての開発です。

以下、原因と修正内容です。

原因:SecurityProfileのSignatureに入力するMD5が、本番リリース用のKeyStoreFileから取得したMD5だった

そもそもですね、恥ずかしながらKeyStoreファイルなんて自分が用意したものしか知らなかったので、それのMD5が必要なんだとばかり思っていたら、USBデバッグとかでは自動的に用意されたKeyStoreファイルが使われてるんですね。知りませんでした。

修正:debug.keystoreからMD5を取得する

ちなみにうちの環境では「C:\Users\[ユーザー]\.android\debug.keystore」に存在していました。これをkeytoolにかけてMD5を取得し、SecurityProfileに登録してAPI keyを取得するとうまくいきました!

keytoolで指定するaliasは「androiddebugkey」。なのでコマンドラインはこんな感じです。

keytool -list -v -alias androiddebugkey -keystore C:\Users\[ユーザー]\.android\debug.keystore

vagrant package で仮想環境を移行するとネットワークアダプタが見つからない

表題の通り、Vagrantの仮想環境を別PCに移行するため、移行元にてvagrant package してできたboxファイルを、移行先PCでvagrant add したあと仮想環境を起動すると、見事にeth1、eth2あたりがなくなっていて、ホストPCから仮想サーバーにアクセスできない状態でした。(vagrant sshは使えた)

移行元と移行先で、ネットワークアダプタに割り当てられるMacアドレスが変わるために仮想環境側ではネットワークアダプタが見つからなくなるようで、以下の通り仮想環境側のファイルを削除した後、vagrant hult -> vagrant up で起動するとネットワークアダプタが復活しました。

rm /etc/udev/rules.d/70-persistent-net.rules

rm /etc/sysconfig/network-scripting/ifcfg-eth1

 

こちらを参考にさせていただきました。

http://d.hatena.ne.jp/nagachika/20140121/vagrant_box_with_centos64

というか、そのままですね…。

elasticsearchを試す

全文検索したいよね。
でも、100万件とかのデータに対してRDBで「like ‘%xxxx%’」とかしたくないよね。

ということで、全文検索エンジンの登場です。

全文検索エンジンは古くからいろいろありますが、elasticsearchの特徴はその名の通りelasticにスケールアウトが簡単なとこでしょうか。

他の全文検索エンジンで有名なところだとSolrやGroongaなんかもありますが、スケールアウトの面ではelasticsearchが秀でているようです。(僕自身は他のを試したことが無いので詳細は不明ですが…)

1.まずはインストール

CentOS6.3で試しています。

elasticsearchはJavaで出来ているので、jdをインストールします。

 

次にelasticsearchのリポジトリを追加します。

 

で、以下の内容をコピペ。(elasticsearch1.4.xを対象としています)

 

んでもって、yumでインストール。

 

1つのノードだけでよければ、elasticsearchのインストールは以上で完了です。

今回は複数ノードを用意して、ドキュメントが各ノードに分散されることを確認したかったので、同じ作業を3台のサーバーに対して行いました。
(実際は勉強用の環境なので、Vagrant+Chefでサクッと3台立ち上げてprovisionしただけですが…)

で、各サーバーは以下のようになりました。

・IP:192.168.33.21(Master & Data ノード)
・IP:192.168.33.22(Data ノード)
・IP:192.168.33.23(Data ノード)

IP192.168.33.21はマスターとして各ノードを管理し、また自ノードでもデータを保持します。
それ以外はマスターに管理される状態で、データだけを保持するノードとする予定ですが、マスターやデータノードの設定は次になります。

今後の作業のために、headプラグインとkuromojiプラグインをインストールしておきます。

headプラグインはクラスターやノード、インデックスの状態を確認するためのプラグイン。なので、マスターにする192.168.33.21にのみインストールしました。

 

kuromojiは日本語の形態素解析用プラグインです。
今回の実験では使いませんが、日本語の全文検索ではほぼ必須となるでしょう。

 

2.設定

CentOSではインストール直後は以下のディレクトリ構成となりました。

/etc/elasticsearch/ ・・・設定ファイルなど
/usr/share/elasticsearch/ ・・・実行ファイルやプラグインなど

設定ファイルは/etc/elasticsearch/elasticsearch.ymlなので、各ノードのファイルを編集していきます。

・IP:192.168.33.21での設定

ノードの名前を”apple”としてみました。また、shardは全部で3、今回はレプリケーションを行わない設定とします。そして連携するサーバー群(elasticsearchの用語ではclusterと言う)にも名前を付けて”tac”としておきます。

clusterの属するサーバーをお互いが見つける仕組みはdiscoveryで指定します。今回はunicastによるdiscoveryを指定しました。

 

・IP:192.168.33.22での設定

ノードの名前を”banana”とし、データノードとして設定します。

 

・IP:192.168.33.23での設定

こちらはノードの名前を”cinamon”とし、bananaノード同様データノードとして設定します。

 

ここまで設定できたら、各サーバーのelasticsearchを再起動します。

 

appleノードのサーバで以下のコマンドを実行し、設定が正しく行われているかを確認します。

 

結果は以下のようになりました。

 

elasticsearchはデータの作成や更新、削除、サーバーへの各種実行など、すべてRestFullなリクエストによって行い、データのやり取りはJSONが用いられます。

上記結果ではstatusがgreenとなっていればOKです。yellowとなっている場合は、shardやreplicaの数の設定が間違っている可能性があります。number_of_nodes、number_of_data_nodes、active_primary_shardsとactive_shardsが3となっており、正しく設定が反映されていますね。

今回の実験では、設定は以上となります。

3.スキーマの登録とデータの作成

elasticsearchはRDBと異なり、スキーマレスなデータを扱うことができます。今回は各ノードに対して自動的にドキュメントが分散配置されることを確認したいので、データ構造を指定せずにデータを入れる箱だけ用意します。

以下のコマンドを実行すると、shopという名前のインデックス(RDBではテーブルに相当する)が作成されます。

 

では、実際に適当なデータをshopインデックスに登録してみます。データの登録は以下のコマンドを実行します。
※今回はデータ登録に関するコマンドの説明は割愛します。

 

登録したデータを確認するには、次のコマンドを実施します。

 

すると以下のJSONが返されます。

 

各ノードに対して、登録したドキュメントが分散配置されているでしょうか?headプラグインを用いて確認してみましょう。

Webブラウザを立ち上げて、http://192.168.33.21:9200/_plugin/head/にアクセスすると、現在のcluster情報が表示されます。

head_plugin

apple、banana、cinamonノード(サーバー)が表示され、緑の四角がshardを表しています。

設定でnumber_of_shardsを3にしたので、合計3つのシャードが自動的に各ノードに割り振られました。

shardを表す四角をクリックして各shardの詳細を表示したのが上の画像です。

各shardのnum_docsが1になっており、登録した3件の文書が各shardに1件ずつ割り振られた状態となっています。

データの登録も読み込みも、マスターノードに対してリクエストを投げれば、あとは勝手にうまい具合に処理されることが確認できました。

以上、elasticsearchのインストールから、複数ノードを使ったclusterの構築でした。

vagrant up できない!

開発マシンを新しくし、今までのようにVirtualBoxとVagrant、chefをインストールしてvagrant upしたら…

と表示されたまま一向に進まず、そのままssh接続でタイムアウトしてしまいchefが全く実行されない現象にあたりました。

いろいろネットを見て回るとVirtualBoxのGuiモードで起動するとヒントがあるかも、ということでVagantfileを見ると次のようなオプションがコメントアウト状態になってるので、コメントを外してGuiモードを有効にします。

vb.gui = true

この状態でvagrant upするとVirtualBoxのGui画面が立ち上がり、Linuxの起動画面が表示されます。

で、しばらく様子を見ているとOSが立ち上がった後にLogin画面になるのですが、突如VirtualBoxのエラーダイアログが表示されました。

仮想化支援機構(VT-x/AMD-V)を有効化できません。64ビットゲストOSは64ビットCPUを検出できず、起動できません。
ホストマシンのBIOS設定でVT-x/AMD-V を有効化してください。

「ハァ?僕、小学校でそんなの習ってません!」

どうやらBIOSから「Intel(R) virtualization technology」をenabledにしないとダメならしく、BIOSの設定を変更するとすんなり起動してchefが動きました。

以前のマシンではこんな設定変更したことなかったので、vagrant upができずに焦りまくり。

ブログに書いた内容は大したことないのですが、原因究明するまですごい時間を無駄にしてしまいました…。

GoogleのOCRライブラリ Tesseract

急遽OCRを利用する必要があったので、フリーのライブラリを探してみた。 Linux(CentOS)で使えるものが無いか物色する中で、GoogleがOSSとして提供しているライブラリTesseractがあったので、導入から使用方法までを簡単に書いてみる。

導入

バイナリでも落ちているようだけど、ひとまずソースをダウンロードしてコンパイル、インストールすることにした。

下準備

デフォルトのCentOSでは入っていないパッケージをインストールする必要がある。

 leptonicaのインストール

Tesseractは内部でleptonicaを呼び出しているようなので、こちらを先にインストールする必要がある。

 tesseractのインストール

いよいよtesseract本体のインストール。 OCRで解析させたい言語ごとに解析用ファイルをダウンロードしておく必要がある。今回は英語と日本語を使う事にした。 この手順でインストールすると、tesseract本体は/usr/local/share/にインストールされるので、言語ごとの対応ファイルは解凍後、/usr/local/share/tessdataに移動させる。

これでインストールは完了。

解析させる

下記のようにコマンドを叩けば画像ファイル[hogehoge.gif]を解析してfugafuga.txtに、テキストファイルとして結果を吐き出す。

精度を上げる

このままでは、日本語はおろか英語であっても惨憺たるありさまなので、何とか精度向上を図る。

  1. 辞書ファイルを指定する
  2. 画像を拡大する
  3. 画像を二値化する

1.辞書ファイルを指定する

せっかくダウンロードしてきて展開した辞書ファイルがあるので、それで何とかなる内容なら積極的につかっていきましょう。 例えば日本語の辞書ファイルを指定する方法は以下の通り。

また、使用されている文字が限定的な場合は、設定ファイルを用意することで精度を向上させることが可能です。 1とlをよく間違って解析したりするのですが、例えば数字が絶対含まれず、アルファベットのみ使用されている画像を解析するのであれば、下記内容の設定ファイルを作成することで誤解析を減らすことが可能です。

上記の設定ファイルを読み込ませるには下記のように指定します。

2.画像を拡大する

解析する画像の文字が小さいと精度が出ません。いろいろ拡大して、精度の出るサイズになるよう調整してみてください。

3.画像の二値化

アンチエイリアスなどでエッジがぼやけている画像では精度が出ません。なので画像を二値化(白と黒にくっきり分ける)することで精度の向上が期待できます。

大いに参考にさせてもらったサイト

http://magiccastanets.blogspot.jp/2012/06/google-tesseract-ocr-os-centos6.html http://www.slideshare.net/takmin/tesseract-ocr WEB-DB-PRESS-Vol-76

http://qiita.com/hatahata/items/4daddebb5e84ea575332

タッチデバイス

新しいデバイスが届きました。

ロジクールのタッチパッド「T650」です。image

真ん中の正方形の物体がブツです。

今まで使っていたマウスが古くなり、ゴム製の部分が削れて手や設置面が黒く汚れてくるようになったため買い替えを決意しました。

購入に当たり色々検討したのですが、なるべくキーボードから手をはなさずにカーソル操作ができるデバイスということで、このタッチパッドにしました。

ひと昔前のタッチパッドは非常に使い辛いシロモノで、ノートパソコンにオマケでついてくるパッドのイメージしかありませんでしたが。
AppleのMagic Trackpad(マジ虎)以来、タッチパッドが大きく進化したように思います。

WinユーザーとしてはAppleのマジ虎は憧れでしたが、T650でようやくそれに近い操作感のデバイスがWinでも使えるようになりました。

二本指タップで右クリック。
二本指スワイプで上下左右のスクロール。
三本指スワイプでアプリケーションの切り替えや、デスクトップの表示、戻る、進む。
ピンチ操作で画面のズームイン、ズームアウト。

この辺の操作ができることで、従来のタッチパッドとは比べ物にならない用な操作性を得ることができるようになっています。

もちろん、使い慣れたマウスの方がしっくり来るし、細かい操作はマウスに軍配が上がる気もしますが、私にとっては十分使えるデバイスのようです。

何より、キーボードの手前に配置することで、マウスに握り変えることなくカーソル操作ができるのがとても素晴らしい点です。

また、写真の通りキーボードアームと併用することで、常に手の位置を膝上付近から離す事なくすべての作業を完結できることで、肩の疲れ方がかなり緩和されることが期待されます。

この辺、気になる方は「膝上キーボード」でググってみてください。

i18n

オープンソース系のコードを眺めているとたまに目にする「i18n」の文字。

国際化が行われているソフトウェアでよく出てくるのですが、翻訳関係のファイルを扱う関数やライブラリなんかにこの文字が冠せられてたりします。

最初はあまり気にも留めなかったのですが、ふとしたきっかけで知った「i18n」の意味は「internationalizationの略」というもの。
最初のiと、最後のnの間に18文字あるから「i18n」…なんて雑な略し方なんだよ。

でも、この略し方だと相当長いのでもOKですよね。

例えばタイの首都、バンコクの正式名称。
英語表記だと「Krung­thep­maha­nakhon­ Amon­rattana­kosin­ Mahinthar­ayutthay­a Maha­dilok­phop Noppha­ratratchathani­burirom­ Udom­ratchaniwet­mahasat­han­ Amon­phiman­awatan­sathit Sakkathatiya­witsanukamprasit」なので、途中のスペースを削ると全部で212文字。

…ということは「k210t」でOK!

いやー、タイの人に怒られそうだわ。