Sphinx と MeCAB でナレッジベース風ツールを作る

これは Sphinx Advent Calendar 2012 6日目です。@togakushi さんから受け取りました。

@togakushi さんのテーマに関するテーマ(私の表現がアレですね..)を今後参考にしながら社内のsphinxサイトをリニューアルしたいなと思う今日この頃です。

さて、@goingmywaynet です。Python使えない自称エンジニア(本業は事務屋)ですが、面白くてSphinxを利用させて頂いています。ネタの使い回しになりますが、ちょっと変わった Sphinx の使い方のご紹介です。 Tipsや技術的な内容は薄いと思いますが、お付き合い頂ければと思います。

1.Sphinx とは

Advent Calendar からこられた方には説明の必要はないと思いますが、Sphinxは元々は Python というプログラミング言語のメンテナンスやAPIのためのドキュメントを作成するツール(ドキュメントツール)でした。私が興味深いと思う以下の様な特徴があります。

コードハイライト機能やBlockdiagなどの多彩な機能やアドインがあることから、主にエンジニアの間でドキュメントを書く為のツールとして活用されてますが、これを非エンジニアの領域で使ってみました。

2.Sphinxの活用環境と動機

windows 端末と windows共有フォルダ が組まれたごくごく一般的な事務屋さんの環境において、私たちは以下の様な課題を抱えていました。

  • 共有フォルダがカオス(「新しいフォルダ〜コピー」「新○○」「New○○」..)
  • 情報が分散(紙、doc、xls、PDF、誰かの頭の中.. )
  • 情報の出自がバラバラ(課内文書、社内文書、社外文書、色々なクリップ)
  • 書式が統一されていない(まあ、いろいろ書き方有るよね..)
  • 経緯がわからない。結論が分からない。更新されない。

ちなみに、”マニュアル”という名の「何となく判るけど、実施するには情報が足りないモノ」をかなり目にしてきました。(特にQMSとかISOとかで作らされる資料に多い気がする)

さらに、人的環境として以下の様な課題を抱えていました

  • 人は異動するもの
  • 技術継承は OJT! OJT! OJT!
  • ノウハウを最も持っている者から離れていく
  • ある日、中心人物が食中毒になったら業務が止まる

そこで、各人が自分の資料やPCや脳裏や共有フォルダの奥深くに溜め込んだ情報やノウハウを手軽に洗い出し、その情報を集約/整理する環境を必要としていました。( ちなみに、運用ドキュメントにおけるsphinxの可能性については @tcsh さんの Operation Document Model がとてもとても参考になります )

ただし、

  • 文書管理システムとか導入するのも管理するのもめんどい
  • 滅多にない作業やすでに終わった仕事の手順書とか書くの面倒いし頼み難い
  • 決済書類とか書くのめんどい
  • すでにある情報を決まった形式に書き換えるのめんどい
  • 情シス部門じゃないので Admin 権限もってない

ということで、制約の中で出来る限りの事をしようということで、Sphinxを活用して情報の整理に取り組んでいます。(これを仮に Knowledge Base と呼びます)

利用者も、”make html” とかコマンドを叩く事にすら抵抗がある(の割りには Microsoft Word / Excel / PowerPoint なら使いこなす)メンバーが多いので、とにかく簡単に情報を集約できる仕組みを目指しました。

3.Sphinx による仕組み

Sphinx を活用して、共有フォルダに分散している、各種情報に対するインデックを持つWebページを作ってしまう事にしました。機能的にはざっくり以下の様な通りです

  1. 特定Window共有フォルダ配下を再帰検索
  2. 指定のファイル名(アンカーファイル)を見つけたらそのファイルを.rstとして扱う(もちろん、アンカーファイルは reST 形式で記述)
  3. SphinxでHTMLを生成する際にアンカーファイルの有ったディレクトリへのリンクを自動挿入(実際は.rstファイル生成時に記述している)
  4. 上記の繰り返しで、共有フォルダ内の必要な情報(のインデックス)をHTMLに集約していく
  5. sphinx のお陰でHTML内での検索も可能

生成されるHTML / ここから各種情報へ辿れる

各情報へのリンクは自動で生成

各情報へのリンクは自動で生成

ここでいう「アンカーファイル」とは特定のファイル名を持つSJISのCR/LF改行コードファイルです。課員には自分の持つ情報について、

  • 共有フォルダに既にあるものについては、そこに「アンカーファイル」を置いて、ざっくり(数行の)概要を書いてもらう。
  • 頭の中にある情報についても、適当なフォルダに「アンカーファイル」を置いて、そのファイルにreSTで情報を記述してもらう。

という対応をお願いすることで、情報やノウハウの集約をし、一覧性を持たせたり、整理することが出来る様になるのでは無いかと期待しています。

 

4.仕組みを実現するために

アンカーファイルを検索し、.rst化し、sphinxでビルドする為のスクリプトを作成しました。また、日本語検索のためにMeCABも合わせて導入しています。これらの詳細については以下のリンクをご覧下さい。(使い回し .. 汗)

5.状況と今後の課題

実はすでに半年ほどこのSphinxによる情報整理に取り組んでおります 。事務屋さんな環境において、以下の様な状況になっております。

  • 今まで個人資料だったものが集約されて、結構な数 のページが生成されている
    • いまも週に数ページのペースで増えている
  • だんだんと reST 記法が浸透してきている
  • 足りない機能が出てきた
    • たとえば、.. figure:: の画像ファイル添付などは.rst に変換後にファイルを移動してしまうためにリンクが切れてしまう
  • 検索機能は期待したほど助けになってない
    • MeCABのユーザ辞書を活用しているが、どうも英数字周りが弱い
    • ページ内検索と検索ツールを併用してどうにか見つかる程度

とりあえず、来年まで活用を続けてみて、なにか良い結果になればと思っております。

さて、明日は @takanori さんです。

Mac OS X 10.7 (Lion) で Inkscape 0.48.2 r9819 の エクステンションが使えない

Mac OS X Lion で Inkscape 0.48.2 r9819 のエクステンションを利用する際に
libxml2ライブラリが不足していると言われた場合は以下のようにpatchを当てる事で利用できるようになる。

まずは、 https://launchpadlibrarian.net/88914942/819209-python-extensions-lion.diff よりパッチファイルを入手しておく。

以下は仮にカレントディレクトリ配下で ~/819209-python-extensions-lion.diff として上記のパッチファイルを配置しておいた場合と仮定して続きを書きます。

$ cd /Applications/Inkscape.app/Contents/Resources/bin
$ cp inkscape inkscape.org
$ patch inkscape ~/819209-python-extensions-lion.diff

なお、これはInkscapeがバンドルしているpythonのバージョン(2.6)がMac OS Xのデフォルトバージョン(2.7)と合わないのが原因で、次のリリースである0.48.3では直っている予定みたいです。

パッチも、単にInkscapeの実行ファイルに

$export VERSIONER_PYTHON_VERSION=2.6

を追記しているだけです。

参考:Extensions do not work with Mac OS X Lion

iPhone 非破壊的自炊 用スタンド(光源付き)をつくってみた

勉強している嫁が参考書文献を借りてきてScanしたり、写真に取っていたりしているのだが、書籍を裁断せずにScanするのは地味に手間がかかるので、なにか楽できないかなと思っていたところ、

最速自炊カメラ「Jucie」(仮)が電子書籍の自炊の常識を覆すほどのポテンシャルを秘めていた件 – もとまか日記乙

で @sumihiro  さんがものすごい勢いで作った Jiucie がかなり良さそうだったので、自宅に有ったスタンドに透明なアクリルで台を繋いで自炊用スタンドを作ってみました。

Stand

事前に、SourceをGItHubよりcloneして、ビルドしてみて、これは行けそうなだなという感触を得たので、あとはiPhoneをどうやって固定するかが問題でした。

文庫版から雑誌まで対応させたいので、高さ調整機能は必須です。あと、陰もなるべくつけたくない。

丁度自宅に可動式のライトスタンドがあったではないかと思いつき、休日にホームセンターへ走ってアクリル板を購入&カッティングして取り付けてみました。

材料

・アクリル板 透明 厚3mm/幅130mm/奥行き80mm

・ネジ (スタンドのネジ穴に合う径で、長いやつ)

工具

糸のこ/充電式ドライバ+ビット/紙ヤスリ

どうでしょう?なかなかいい感じでないかい(笑)

アクリルをカットして、ネジ穴あけて、スタンドに取り付けるだけ!

コストはアクリル板の800円。(アクリル板が意外に高かった..)

ただし、切る為の糸のこと2.3mmのドライバービットを追加購入しているので、もうちょっとコストは掛かっています(汗)

とった写真ですが、文字が5mm以下のハードカバーでもきちんと読める様にとれていました。あとはOCRにつっこんでみようかなと。

それにしても、 最速自炊カメラ「Jucie」にまつわる色々。 をみると、やっぱ自分の手を動かす技術者ってすごいなと思います。憧れちゃいます。俺も頑張るぞー!!

Apple の SSD TRIM 機能について

Apple Macbook Air の 搭載SSDによって、I/O性能に差があることが話題になったが、MacBookProでもなんだろうなぁ。

自分のMBPをみたところ、見事にSSDが”APPLE SSD TS256C”(遅い方だった)で凹む訳だが、ところでMacBookProは2011EarlyからTRIM機能が有効となっているみたい。

システムプロファイラでSSDのプロファイルから”TRIM サポート: はい”を見つけられたら、SSDはTRIM機能が有効となっていると思って良い様だ。そんな訳で、ちょっと遅いSSDを掴んでしまった僕はTRIM機能がONだからいいやと、自分を励ますことにした。

TRIMってなに?って方はこちらをどうぞ -> SSDの性能低下とTrimの効き具合を大検証!

MacBookPro 新環境準備 ( Homebrwe+pip+Sphinx+blockdiag 編)

無料でLionをゲットできる1週間前に購入してしまったMacBook Pro ですが、まあ、気を取り直して環境構築をちまちまやっております。

ひとまず、macports から Homebrewに浮気して、Python系のパッケージ管理ツールを入れながら、Sphinxまで整備してみました。

PILでだいぶハマったので、ひとまずここまでのメモをまとめてみました。

note.sicafe.net > Homebrew + pip and sphinx + blockdiag

このblogも2004年から続いていますが、環境の更新で、ドキュメントが wiki やら xoops やら、wordpress と環境をいろいろ移り変わっています。

ある程度の長さのドキュメントは、やはりxoopsやblogやwikiなどのような、アプリケーションが必要な環境で書いてしまうと後からの移行が大変なので、しばらくsphinxを利用させてもらいながら、HTML & TEXT化していってみようかと思います。

手抜きgit更新スクリプト

本来の目的とは違ったりしますが、自分の書いたTextのメモやら.rstやら、PDFなどのバイナリも含めた色々な情報を複数の端末で同期するのにgitを活用していたりします。
イマドキ(cloudとか、SaaSとか?)っぽくないよねと言われるかもしれませんが、オフラインな環境や状況も多々有るわけで、やっぱり最後はローカルにデータが欲しいのですよね。
そこで、 /gitpath/hogehgoe  , /gitpath/fugafuga とか複数のディレクトリでメモを管理しているのですが、pushをするのにいちいち
$ cd ./gitpath/hogehoge
$ git add .
$ git commit
$ git push
とかやっていたりするのが難儀になったので、コマンド一発でカレントディレクトリ配下のgitをまとめて commit したり push したりする script を書いてみた。
美しくない部分が多々有るかと思いますが、そこは暖かい目で見過ごしてください (汗
#! /bin/bash

#
# Auto git update tool
#  2011/06/05 Ver:1.3 joey chen
#

#
# check depend commands
#
_dependCommands="git expect"
for _COMMAND in ${_dependCommands}; do
 if [ ! `whereis ${_COMMAND} |grep ${_COMMAND}` ]; then
  echo "ERROR!! 必要なコマンドが見つかりません : ${_COMMAND}"
  exit 1
 fi
done

#
# check args
#
if [ $# -eq 0 ]; then
  cat <<_EOF_

  Auto git pull/push Tool 

  実行中のディレクトリ配下にある複数あるgitディレクトリを一気に
  更新(commit/pull/push)するツールです。

  使い方
   sh ./updateGit.sh [commit|pull|push|status] [remote name] [branch name]
    各ディレクトリの ./*/.git を探して、有る場合に指定の git のコマンドを実行します。
    オプションは以下のいずれかを選ぶ必要があります。
    commit : add を実行してから commit します。
    status : git status 処理を実施します。
    pull   : 指定した remote からpullします。初回のみパスワード入力を促されます。
    push   : 指定した remote からpushします。初回のみパスワード入力を促されます。
    ※ branch name を指定していない場合は、自動で master で処理します。

_EOF_
  exit 1
fi

#
# check args 2nd
#
if [ \( $1 != 'pull' \) -a \( $1 != 'push' \) -a \( $1 != 'commit' \) -a \( $1 != 'status' \) ]; then
  echo "ERROR!! 正しい引数を指定してください。"
  exit 1
fi

if [ \( \( $1 = 'pull' \) -o \( $1 = 'push' \) \) -a \( $# -eq 1 \) ]; then
  echo "ERROR!! push か pull を実行する際は、第2引数(remote 識別子)を指定してください。"
  exit 1
fi

#
# Get git dirs
#
_GITDIRS=`find . -name ".git" | sed "s/\(\.\/.*\)\/.git/\1/g"`

#
# show status
#
if [ $1 == 'status' ]; then
  for _DIRS in ${_GITDIRS}; do
    echo -e "\n  -- ${_DIRS} -- ";
    cd $_DIRS;
    git status;
    cd ../
  done
fi

#
# Update Git Dirs
#

## COMMIT
if [ $1 == 'commit' ]; then
  # update dirs
  for _DIRS in ${_GITDIRS}; do
    echo -e "\n  -- ${_DIRS} -- ";
    cd $_DIRS;
     git add -u;
     git add .;
     git commit -m "auto Update by Script at `date`";
    cd ../
  done
fi

## PUSH or PULL
if [ \( $1 == 'push' \) -o \( $1 == 'pull' \) ]; then
  if [ $# -eq 2 ]; then
    _COMMAND=$1
    _REMOTE=$2
    _BRANCH="master"
  fi
  if [ $# -eq 3 ]; then
    _COMMAND=$1
    _REMOTE=$2
    _BRANCH=$3
  fi
  # get password
  stty -echo
  read -p "Password: " _PW; echo
  stty echo

  # update dirs
  for _DIRS in ${_GITDIRS}; do
    echo -e "\n  -- ${_DIRS} -- ";
    cd $_DIRS;
    expect -c "
      set timeout 10
      spawn git ${_COMMAND} ${_REMOTE} ${_BRANCH}
      expect password:\  ; send \"${_PW}\r\"
      interact
    "
    cd ../
  done
fi

 

2013/07/15 渋川氏のアドバイスで一部修正

diff --git a/updateGit.sh b/updateGit.sh
index ab53aa9..c0e2a0b 100755
--- a/updateGit.sh
+++ b/updateGit.sh
@@ -58,7 +58,7 @@ fi
 #
 # Get git dirs
 #
-_GITDIRS=`find . -type d -name ".git" | sed "s/\(\.\/.*\)\/.git/\1/g"`
+_GITDIRS=`find . -name ".git" | sed "s/\(\.\/.*\)\/.git/\1/g"`

 #
 # show status

Blog引っ越し (XPressME to WordPress3.1)

twitterばかりで、Blogをほとんど更新していなかったのですが、心機一転っていうことで、久しぶりにBlogアプリケーションまわりのメンテをしました。

古くなったBlogツール(XPressME – WordPress for XOOPS 1.07) から サーバとアプリケーションを新環境に移設します。

新Blogツールは、移行を考慮して、これまでと同系列のwordpress 3.1.2 です。

しかし、DBの構造が結構変わったので ALTER TABLE したりとなかなか難儀でした。この辺のメモは後日UPしたいと思います。(世界のどっかに同じ事を考えている人がいるかもしれないので)

ところで、新サーバ環境は sakura VPS 512 の月額980円最安環境ですが、 512M メモリで Apache , MySQL , PHP , Ruby on Rails も動作させているので、正直かなーりメモリ管理厳しいです。

デフォルトで上記のデーモンをすべて動かすとメモリ不足でmysqlがダウンしたりしました。特にRubyは想像以上にメモリを食いました。

とりあえず、512Mのメモリをなんとかやりくりしながら試行錯誤しています。(これが意外と勉強になったりする。MySQLのメモリ設定はしたことあっても、案外ApacheやPHP、Railsの設定はした事なかった)

が、サイトが落ちる事も有るかもしれません、悪しからず。

#今後は他のサーバ機能も移行したいと思っているのですが、この調子だとsakuraのプラン変更が必要そうだな…

MacBook (13-inch Late 2006) HDD装換

写真素材 PIXTA自宅のMacBook (13-inch Late 2006)のHDD容量がそろそろヤバくなってきたので、HDDを純正の120Gから320G 7200rpm(WD3200BJKT-00F4T0) に取り替えました。
作業は[を] MacBook の HDD を交換した話を参考に進めたのですが、HDDデータの移行はTime Machineからやろうか、USB接続してコピーしようかと迷いました。
結局時間節約しようっていうことで、980円で2.5inch SATAのHDDケースを買ってきて、フリーウェアのディスクユーティリティの復元タブでデータを移行させました。

今回調達したのは
・WD3200BJKT-00F4T0 from Amazon(EC-JOY)
・精密星形ドライバT-8 from ダイソー
・精密プラスドライバ #00 from ダイソー
・USB2.0 2.5inch HDD SATAケース from その辺のPC屋さん

ところで、AmazonのEC-JOYさん、発送連絡も無いのに、メールでいきなり納品書を送付してくるわ、届いてみたらなぜか3.5インチの全然違うHDDだったりするわで、かなりグダグダな感じでした。
通販でトラブったのは初めてです。幸い、連絡したらすぐに正しい商品を発送してくれましたので、問題がややこしくならずに済みましたが、今度からAmazonでの買い物も要注意だなと思った今日この頃です。
取り替え自体は道具さえ揃っていれば、あとは時間かけてコピーし、さくさく差し替えるだけです。
取り替え後はMac OS Xがよりサクサク動く様になっている様な気がします

#ふと、気がついたら2カ月以上Blogサボってました(汗)

写真素材は ヤユヨ写真素材 PIXTA より

夫婦の会話

夕食後の会話は「molの計算方法」についてでした。(笑)
明日は化学のテストらしい。
昔やったずだけど、思い出せない。
最近急に化学やら物理やらの質問が振られたり、暗記に付き合ったりと、楽しい日々(?)が続いております。
今日は必須アミノ酸(トロリーバスフメイ)を覚えた。

トリプトファン/ロイシン/リシン/バリン/スレオニン/フェニルアラニン/メチオニン/イソロイシン

らしい…

あと、FUJITSU ScanSnap S1500M FI-S1500Mを購入しました。MacでOCRっぽい事が出来るスキャナはこれまでなかなか無かったのでかなり助かります。読み込みスピードも、取り扱いのし易さもなかなか優秀。
活字のOCRはまあまあ使える程度だが、手書き認識についてははっきり言って使えない。まあ、手書きなんで仕方ないと割り切ってます。
我が家の書類のスキャンに大活躍中。今後は名刺管理にも導入予定だが、まずは嫁の学校のプリントスキャンに大活躍してもらう予定です。

Google SyncでiPhone同期

Google、iPhone/Windows Mobileに予定表・連絡先プッシュ同期サービスGoogle Sync/engadgetJapan
で知ったのだが、google CalenderでiPhoneとsync出来るようだ。
早速Sync: Set Up Your iPhone or iPod Touchみながら設定してみると、「既存のカレンダーのデータはすべて削除されます」という怖いメッセージが・・・
データのバックアップを確認しつつ、えいやと設定を進めてみました。

気づいた事
・ログイン用のIDがGmailと異なる場合、gmailのアドレスで登録しないと利用できない(gmail優先?)
・iPhoneのPush同期をDisableしている場合はEnableする必要あり

さすがPushサービス、同期がめっちゃ素早いです。というか、iPhone側で表示が出ないもんだから、何時データ同期してんだか判らない…
そしてiPhoneの電池が減るのも素早くなりました orz

しばらく使ってみます。