検索エンジンの作り方を調べた

はじめに

プライベートで、簡易的な検索エンジンを作る仕組みを考えたので、
その時勉強したことのメモ。

メモ

検索エンジンの仕組み

参考

連載 検索エンジンを作る
http://gihyo.jp/dev/serial/01/make-findspot

形態素解析

自分で形態素解析器を作るのは無いので、既存の仕組みを調べてみた

キーフレーズ抽出ではYahooAPIが手軽でいいなと思った。 独自でカスタマイズするにはMecab使っていくのが良さそうです。

オープンソース検索エンジン

既に検索システム自体もオープンソース化されていて、こういうのを活用したほうがよさそう

まとめ

  • オープンソースを使って簡単に検索エンジンが作れそう
    • カスタマイズしたい所だけに専念したほうがいい
  • ただのモックを作るだけなら、YahooAPIとか活用するのもよい

vim 環境を大幅に改善したった

最近、新しいプラグイン試したりvimrcを見なおしたりしてなかったので、色々リニューアルしました

やったこと

  • プラグイン管理
    • Vundle から NeoBundle に移行
  • ステータスライン
    • vim-powerline から lightline.vim に変更
  • neocomplcache
  • unite
    • bookmark / vimfiler でファイラー機能の強化
    • キャッシュデータの場所をRamDiskに変更
    • ファイルを開く時にタブを使うように変更
  • neocomplete導入

プラグイン管理

Vundle から NeoBundle に移行

面倒臭がってやっていなかったのですが、移行しました。
新しい環境にvimを設定していくのが楽になりました。
LazyLoadとかはまだ。

参考にした記事

http://sugilog.hatenablog.com/entry/20111101/1320158226

ステータスライン

vim-powerline から lightline.vim に変更

vim-powerlineメンテされてないので、 後継のpowerlineかvim-airlineに乗り換えようと検討したのですが、 lightline.vimにしました。
作者のステータスラインにかける熱いエントリーに感化されましたw

参考にした記事

http://d.hatena.ne.jp/itchyny/20130824/1377351527

neocomplcache

キャッシュの場所をRamDiskに変更

高速化に効果があるとの事なので

スニペット補完

IDEでよくあるやつですね、vimでどうなのか使ってみたいと思います。

参考にした記事

http://www.karakaram.com/neocomplcache

unite

bookmark / vimfiler でファイラー機能の強化

開きたいファイルが履歴に無くてもここから辿れるようにしました。
grep、find も出来そうなので使っていきたい

キャッシュデータの場所をRamDiskに変更

高速化のため。これに伴い履歴を1000件に増やしています。

ファイルを開く時にタブドロップを使うように変更

これ前からやりたかったのですが、既にタブで開いている場合とかで悩んでいたのですが解決しました
ファイルとバッファ開くときのデフォルトアクションでタブを開くようにして、既にタブを開いているファイルの場合はそのタブに移動するようにしました。

参考にした記事

http://www.karakaram.com/vimfiler
http://d.hatena.ne.jp/osyo-manga/20130808/1375890336

neocomplete導入

neocomplcacheの設定改善とかしていたのですが、neocompleteを入れるとこまでやってしまいました。
luaインターフェイスの有効化に手間取りました。

luaインターフェイスを使えるようにvimをビルド

debian に sudo apt-get install lua で lua5.0 がインストールされたのですが、 vimの./configureでこけてしまってハマりました、、
色々見てたら luaのversionは5.0なのに /usr/include/lua5.1 みたいなディレクトリしかなくて、失敗していました。
sudo apt-get install lua5.1 で 5.1系が入れられたので、とりあえず./configureが通るようになりました。

細かい話

  • --enable-luainterp の他に --with-lua-prefix=/usr が必要でした
  • --enable-fail-if-missing するとビルドする前にわかるので便利
  • ソースはpatch当てるのではなく、mercurial使うようにしました

最終的にはこんなスクリプトになりました
https://github.com/watanabe0621/dotfiles/blob/master/install_vim74.sh

感想

  • キャッシュ周りの高速化とunite/vimfinder の改善なんかで日頃の作業がかなり効率化されそう
  • 1つのvimを開きっぱなしで作業していくことになりそうなので、unitテストの実行なんかもやっていきたい
  • tmuxとの使い分けなんかを整理していきたい

vim jsプラグイン

はじめに

前回の続きをやろうと思ったのだけど、抽象的なのはモチベーションが続かないので
フロントサイド作りながら進めていくことにしました。

jsライブラリ、フレームワーク

SPブラウザで、アプリケーション作るのに楽しようとすると
下記jsライブラリ、フレームワークが有力候補らしい

  • backbone.js
  • angularjs.org
  • SenchaTouch2

サンプルアプリケーションを触った感じ、Senchaがさくさくしていたので、
今回はSencha触って見ようかなと思います。

で、エディタ

javascript 書いていくのに、「これからはSublimeTextでしょ」と意気込んでいたのですが、やっぱりなんか使うようにならないので、素直にvimで書くことにしました。

なのでまず vim pluginを整えるところを進めました。
参考にした記事はこちら。
http://layzie.hatenablog.com/entry/20130122/1358811539

とりあえず、jsはこの布陣で戦ってみたいと思います。

syntastic

紹介されていた設定はdeprecatedだったので、設定を下記のようにしました。

let g:syntastic_javascript_checkers = ['gjslint', 'jshint']

gjslint はGoogle の Closure Linter でコーディングスタイルをチェックしてくれるみたいですね。
今まではjslint にしていてうるさかったので、結局offにしていたのですが この2つがいい感じなので使っていこうと思います。

simple-javascript-indenter

インデントが賢くなるらしいが、ちょっとよくわからないので、とりあえず入れておきます

vim-javascript-syntax

コレはいい、見やすくなるなりますね

jscomplete-vim

いい感じに補完してくれる! addEventListenerとかもう打たなくてよくなる

余談

まだNeoBundle導入していなかったのですが、LazyLoadとかできるんですね>< 移行したい、、がこうしてvimの設定だけして時間が過ぎていく。。。

MacBookAir で Hadoop擬似分散環境構築

はじめに

Apache Mahoutで遊んでみたいので、MacBookAirにHadoopの環境を構築することにしました。
情報がたくさんありそうで、バージョンや環境の問題でまとまってなかったのでメモを残します。

参考

以下のページが参考になりました。
http://lizan.asia/blog/2012/11/13/mountain-lion-setup-hadoop/
http://shayanmasood.com/blog/how-to-setup-hadoop-on-mac-os-x-10-9-mavericks/
http://www.ayutaya.com/ops/os-x/hadoop-pdist
http://metasearch.sourceforge.jp/wiki/index.php?Hadoop%A5%BB%A5%C3%A5%C8%A5%A2%A5%C3%A5%D7

環境

手順

hadoopのインストール

brew install hadoop

hadoop設定

設定ファイルは /usr/local/Cellar/hadoop/1.2.1/libexec/conf 以下に全てあるらしい
設定内容は参考ページを真似して。

  • hadoop-env.sh
    • ここでJAVA 6を使うようにしています。
export HADOOP_OPTS="-Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk"
export JAVA_HOME=`/usr/libexec/java_home -v 1.6`
  • core-site.xml
<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>
<configuration>
    <property>
        <name>dfs.name.dir</name>
        <value>/Users/${user.name}/hdfs/name-node</value>
    </property>
        <name>dfs.data.dir</name>
        <value>/Users/${user.name}/hdfs/data-node</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>
  • mapred-site.xml
<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>localhost:9001</value>
    </property>
    <property>
        <name>mapred.tasktracker.map.tasks.maximum</name>
        <value>2</value>
    </property>
</configuration>

ssh の設定

擬似分散環境では localhostsshするので設定する
「システム環境設定」→「共有」→「リモートログイン」にチェックを入れてから

ssh-keygen -t rsa -P ""
cat id_rsa >> authorized_keys
ssh localhost

でログインできればOK

hostname

sudo hostname localhost

で作業する必要がありました。。
このへんは後でちゃんと設定したいなと思います。

hadoop起動

いよいよhadoopを起動していきます

初期化

hadoop namenode -format
14/01/19 20:25:51 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = localhost/127.0.0.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.2.1
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152; compiled by 'mattf' on Mon Jul 22 15:23:09 PDT 2013
STARTUP_MSG:   java = 1.6.0_65
************************************************************/
Re-format filesystem in /Users/junji/hdfs ? (Y or N) Y
14/01/19 20:25:54 INFO util.GSet: Computing capacity for map BlocksMap
14/01/19 20:25:54 INFO util.GSet: VM type       = 64-bit
14/01/19 20:25:54 INFO util.GSet: 2.0% max memory = 1039859712
14/01/19 20:25:54 INFO util.GSet: capacity      = 2^21 = 2097152 entries
14/01/19 20:25:54 INFO util.GSet: recommended=2097152, actual=2097152
14/01/19 20:25:54 INFO namenode.FSNamesystem: fsOwner=junji
14/01/19 20:25:55 INFO namenode.FSNamesystem: supergroup=supergroup
14/01/19 20:25:55 INFO namenode.FSNamesystem: isPermissionEnabled=true
14/01/19 20:25:55 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
14/01/19 20:25:55 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
14/01/19 20:25:55 INFO namenode.FSEditLog: dfs.namenode.edits.toleration.length = 0
14/01/19 20:25:55 INFO namenode.NameNode: Caching file names occuring more than 10 times
14/01/19 20:25:55 INFO common.Storage: Image file /Users/junji/hdfs/current/fsimage of size 111 bytes saved in 0 seconds.
14/01/19 20:25:55 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/Users/junji/hdfs/current/edits
14/01/19 20:25:55 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/Users/junji/hdfs/current/edits
14/01/19 20:25:55 INFO common.Storage: Storage directory /Users/junji/hdfs has been successfully formatted.
14/01/19 20:25:55 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/127.0.0.1
************************************************************/

hadoop-env.sh での設定がちゃんとできていないと、Unable to load realm info from SCDynamicStore のエラーが出ます

起動

start-all.sh
starting namenode, logging to /usr/local/Cellar/hadoop/1.2.1/libexec/bin/../logs/hadoop-junji-namenode-localhost.out
localhost: starting datanode, logging to /usr/local/Cellar/hadoop/1.2.1/libexec/bin/../logs/hadoop-junji-datanode-localhost.out
localhost: starting secondarynamenode, logging to /usr/local/Cellar/hadoop/1.2.1/libexec/bin/../logs/hadoop-junji-secondarynamenode-localhost.out
starting jobtracker, logging to /usr/local/Cellar/hadoop/1.2.1/libexec/bin/../logs/hadoop-junji-jobtracker-localhost.out
localhost: starting tasktracker, logging to /usr/local/Cellar/hadoop/1.2.1/libexec/bin/../logs/hadoop-junji-tasktracker-localhost.out

確認

実行サンプル

hadoop jar /usr/local/Cellar/hadoop/1.2.1/libexec/hadoop-examples-1.2.1.jar pi 2 100
Number of Maps  = 2
Samples per Map = 100
Wrote input for Map #0
Wrote input for Map #1
Starting Job
14/01/19 21:22:11 INFO mapred.FileInputFormat: Total input paths to process : 2
14/01/19 21:22:11 INFO mapred.JobClient: Running job: job_201401192119_0001
14/01/19 21:22:12 INFO mapred.JobClient:  map 0% reduce 0%
14/01/19 21:22:18 INFO mapred.JobClient:  map 100% reduce 0%
14/01/19 21:22:25 INFO mapred.JobClient:  map 100% reduce 33%
14/01/19 21:22:26 INFO mapred.JobClient:  map 100% reduce 100%
14/01/19 21:22:27 INFO mapred.JobClient: Job complete: job_201401192119_0001
14/01/19 21:22:27 INFO mapred.JobClient: Counters: 27
14/01/19 21:22:27 INFO mapred.JobClient:   Job Counters
14/01/19 21:22:27 INFO mapred.JobClient:     Launched reduce tasks=1
14/01/19 21:22:27 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=8154
14/01/19 21:22:27 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
14/01/19 21:22:27 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
14/01/19 21:22:27 INFO mapred.JobClient:     Launched map tasks=2
14/01/19 21:22:27 INFO mapred.JobClient:     Data-local map tasks=2
14/01/19 21:22:27 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=8750
14/01/19 21:22:27 INFO mapred.JobClient:   File Input Format Counters
14/01/19 21:22:27 INFO mapred.JobClient:     Bytes Read=236
14/01/19 21:22:27 INFO mapred.JobClient:   File Output Format Counters
14/01/19 21:22:27 INFO mapred.JobClient:     Bytes Written=97
14/01/19 21:22:27 INFO mapred.JobClient:   FileSystemCounters
14/01/19 21:22:27 INFO mapred.JobClient:     FILE_BYTES_READ=50
14/01/19 21:22:27 INFO mapred.JobClient:     HDFS_BYTES_READ=480
14/01/19 21:22:27 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=165610
14/01/19 21:22:27 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=215
14/01/19 21:22:27 INFO mapred.JobClient:   Map-Reduce Framework
14/01/19 21:22:27 INFO mapred.JobClient:     Map output materialized bytes=56
14/01/19 21:22:27 INFO mapred.JobClient:     Map input records=2
14/01/19 21:22:27 INFO mapred.JobClient:     Reduce shuffle bytes=56
14/01/19 21:22:27 INFO mapred.JobClient:     Spilled Records=8
14/01/19 21:22:27 INFO mapred.JobClient:     Map output bytes=36
14/01/19 21:22:27 INFO mapred.JobClient:     Total committed heap usage (bytes)=454238208
14/01/19 21:22:27 INFO mapred.JobClient:     Map input bytes=48
14/01/19 21:22:27 INFO mapred.JobClient:     Combine input records=0
14/01/19 21:22:27 INFO mapred.JobClient:     SPLIT_RAW_BYTES=244
14/01/19 21:22:27 INFO mapred.JobClient:     Reduce input records=4
14/01/19 21:22:27 INFO mapred.JobClient:     Reduce input groups=4
14/01/19 21:22:27 INFO mapred.JobClient:     Combine output records=0
14/01/19 21:22:27 INFO mapred.JobClient:     Reduce output records=0
14/01/19 21:22:27 INFO mapred.JobClient:     Map output records=4
Job Finished in 16.776 seconds
Estimated value of Pi is 3.12000000000000000000

まとめ

次回はmahoutと絡めて動かしていきたいと思います。

Xperia acroHD SO-03D (ICS) 文鎮復旧 root化成功

前回のエントリーでは起動画面の無限ループで、しかも電源落ちてもFlashtool など使えない状況でした (^_^;)

この機種は電池が一体型で、無限ループに入ったらどうしようもないと思っていたんですけど、
強制終了の仕方が判明しました。
電源ボタンとVolume Upボタン長押しで強制的に電源を落とせて、電池を外したのと同じ状況に持ってこれます。

この状態であれば、FlashtoolなりSony Bridge for Mac なりで復旧することが可能です。

前回のエントリーで libusbを入れたので、Flashtoolも正常に動作し、無事rootがとることができました♪

root取得の方法や、root後についてはいろいろ情報あるのでそちらを参考にして進めるのがいいと思います〜

思ったより root奪取後にできる事が楽しくて嬉しです☆

作業で使った .batを.shに変換したものあるのでどっかに上げておこうかと思いますー

Xperia acroHD SO-03D (ICS) でroot失敗

はじめに

Xperia acroHD SO-03D (ICS) root奪取について
結構Windowsでの手法はたくさんみつかるのですが、
Macでのやりかたはほとんど見つからないので手法をまとめました。

そして、未だチャレンジ中で成功していないです。
アプローチや失敗の原因だけ参考にして頂いて、これ以上不幸な人が増えなければと思います。

あと、どのエントリーにも書いてありますけどコピペで。

  • 端末のroot化は自己責任となります。
  • キャリアやメーカーの保証期間内であっても、保証対象外となります。
  • 作業に失敗した場合など端末の動作が不能となる場合もあります。 ← 今自分はココ

なぜやるの?

  • 出荷時で 残りメモリ100M はヤバイでしょ。プリインを消したい。
  • 今のパフォーマンスだと、iPhone買う選択肢しかないから、壊れてもいいからHackしてパフォーマンス上げたい。
  • スマートにしたい
    とかとか

必要なもの

tool

Sony Bridge for Mac
... XperiaiTunesみたいなもの、ファームウェア修復機能があり、Sonyからちゃんとしたファームウェアを取得してくれるのでそのファイル取得に利用します。

Flash tool
... これはXperiaにシステムを焼いてくれる。

ファイル

LT26wのftfファイル (6.1.A.2.50以下 )
... root奪取可能なkarnelを含んだ他のXperia ファームウェア 。ネットから頑張って取得してくる

SO-03D 6.1.F.0.106 のftfファイル
... SO-03Dオリジナルのファームウェア。Sony Bridge for Macで取得する。

root 奪取可能な別のXperia karnel と Sony Bridge for Mac で取得したオリジナルを混ぜたキメラ?と呼ばれているシステムを組む感じのようです。

専用バッチ
... こちらのサイトで runme.bat というものが用意されており、よく見ると簡単にshに変換できるので、今回は手でshell書きました。
http://blog.huhka.com/2012/11/xperia-acro-hd-docomo-so-03d.html

注意点

バッチを公開しているサイトの通りに進めるだけ、と思い進めてすぐつまずきました。
のでここでは注意点を先に。

  • flashtool の書き込みが失敗しているっぽいとき、途中で中断した時は電源入れない。
    • 起動画面無限ループします
  • 文鎮化してもいいように、予備端末用意しておく
    • 携帯潰れると何かと不便かと思うんで。まじ軽く見てました。
  • パズドラのデータ引き継ぎもちゃんと確認しておく
    • これも迂闊に端末初期化して、ユーザーID入力しても紐付けしてくれなくてやばい。

失敗の原因

今回の失敗は flashtoolでerror吐いていたのに起動しようとして、無限ループに陥ったこと。
今回の端末は防水仕様で電池が外せないために、電池無くなるまでループします。やばす。
で、そもそもflashtoolの失敗の原因ですが、おそらく libusb をインストールしないといけないらしんですよね。

Try

そこで

brew install libusb

今、また無限ループしているので電池尽きるのまっています。 また進捗報告します!