RubyからGrowlに通知

最近Rubyistに転向してます。

Python、Scalaが大好きですけど、モテ言語のRubyに口説かれました。

 

色々ライブラリを眺めているところで、RubyからふとGrowlに通知させたくなったのでメモ。

 

 
Growlのバージョンは1.2.3です。
まずはhomebrewのパッケージの中にGrowlnotifyが見つからなかったので、Growlの公式サイトから1.2.3のdmgファイルを落としてきて、中にあるExtraのgrowlnotifyをインストールします。
これは必ず必要なわけじゃないですけど、ノリです。

次にGrowlの環境設定 > ネットワークを開いて

  • 受信される通知を聞く
  • リモートアプリケーション登録を許可

にチェックを入れます。
そして、サーバーパスワードに任意のパスワードを登録してください。

あとはgemで必要なライブラリを入れて、簡単なコード書くだけで通知が出来ます。

gem install ruby-growl
require 'ruby-growl'
app_name = 'ruby-growl' # Growlに登録されるアプリ名

all_notifications = ['ruby-growl'] # Growlに登録される通知名

default_notification = 'ruby-growl' # デフォルトで使用される通知名

password = 'tekitoudesuyokoremajide' #さっき設定したパスワード

growl = Growl.new 'localhost',app_name, all_notifications, default_notification, password

growl.notify default_notification, 'タイトル', '内容'

以上のコードを実行すると、タイトル、内容と書かれた通知が現れます。
アプリ名、通知名に関しては、Growlの環境設定みれば分かると思いますんで、省略します。

あとは上のコード参考にして煮るなり焼くなりしてください。

CakePHPのFixtureをFulltextIndex対応させる

もう年の暮れ、本当はこの一年間で悟ったN個の事みたいなエントリ書くべきかもしれないけども、今日ハマったポイントに付いて書くべきと天の声があったので書く。

CakePHP + MySQL + Groongaを使って全文検索をサクっと実装していて、Fixtureの中にGroongaのFULLTEXT INDEXを突っ込みたかったのに、

var $fields = array(
		'id' => array('type' => 'integer', 'null' => false, 'default' => NULL, 'key' => 'primary'),
		'body' => array('type' => 'text', 'null' => true, 'default' => NULL, 'key' => 'index', 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
		'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL),
		'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL),
		'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1), 'FULLTEXT' => array('column' => 'body(1024)')),
		'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'groonga')
	);

みたいな感じでFixtureのfieldsに書いたらエラー出たんですよ。

Google先生に聞いたところ、CakephpのFixtureがFULLTEXT INDEXに対応してないという旨を発見したので、じゃあ俺が対応させるか、ということで対応させてみた。

というわけで、その方法。
CAKEHOME/cake/libs/model/datasources/dbo_sources.php の2808行目付近のbuildIndex関数に以下を追記。

/*2808行目あたり*/
	function buildIndex($indexes, $table = null) {
		$join = array();
		foreach ($indexes as $name => $value) {
			$out = '';
            /* 追記 */
            if($name == 'FULLTEXT') {
                $out = 'FULLTEXT INDEX('.$value['column'].')';
                $join[] = $out;
                continue;
            }
            /* 追記ここまで */

こんな感じに書いておくと、Fixtureからテーブルを作る際に、FULLTEXT INDEXをちゃんと生成してくれます。
ちょっと強引な対応かもしれないけどこんな感じです。

こうすることで、

$fields = array(
                /*******省略******/
                indexes' => array(/*******省略******/, 'FULLTEXT' => array('column' => 'body(1024)')),
                /*******省略******/
                );

とfixtureに書いておけばFULLTEXT INDEXが生成される。
お役に立てれば幸い。

もっといい手があれば教えて欲しい。

MacでPDFからテキスト抽出

有価証券報告書の中からテキスト抽出したいなあと思ったのだけど、その時につまずいた部分のメモ。

XPDF使えばいいはずだったのに、そうでもなかった。

brew install xpdf
brew install poppler

でpdftotextコマンドが日本語に対応する。
というか多分後者だけで良いのかもしれない。
popplerはxpdfから派生したものなので。

後はよしなに。