2014-01-29

RailsでSQL Serverを使っているときにエンコードエラーが出たとき

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsでSQL Serverを使っているときに

incompatible character encodings: ASCII-8BIT and UTF-8 (RuntimeError)

みたいなエラーが出てマジックコメント書いてささっと解決さと思ったのにすでにマジックコメントが書いてあってどういうことだろう・・・と思ったわけです。

こんなエラーが出ていますが、ただ単に利用するテーブルに権限がないだけで、権限を振ればOKだったりすることがあります。

私の場合既存システムのDBのデータをselectしたいなぁと思ったときに、そのテーブルへのselect権を付け忘れていてエラーが出たのでした。

紛らわしいエラーですね。





      
      

2014-01-15

Railsのmigrationにchangeとup/downの両方を書いてみると

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsのmigrationにchangeとup/downの両方を書いてみると
changeの方しか実行しませんでした。

そういうものらしいです。

2014-01-14

gemを作成したけどrubygemsに登録を行うrake releaseをしないようにガードする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
gemを作ったら、gemのディレクトリでrake releaseをするとrubygemsに登録がされます。
(rubygemsにアカウントがなかれば、登録はされません)

とてもお手軽でよいのですが、ローカル用で公開する気がないものをうっかり登録してしまう可能性もなくはないです。

うっかりrake releaseを防止するためにrake releaseで行われる動作を変更しておけば安心です。

手順は以下のとおりです。

gemのディレクトリのRakefileに以下を追加します。

Bundler::GemHelper.install_tasks
#以下を追加
t = Rake.application.lookup('release')
t.clear
t.instance_variable_set('@full_comment', nil)
desc 'Please keep this for internal use only.'
task :release do
    puts "Please keep this for internal use only."
end

これでうっかりrake releaseを行ってもputsされるだけになります。

本当は、rake release自体を削除したかったのですが、やり方がわかりませんでした・・・

2014-01-13

Raspberry Pi上でrubyでOCR

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
先日、CentOS上でrubyでOCRを試しました。
試した内容は、rubyでOCRをご覧ください。

なので、今度はRaspberry PiでrubyでOCRをして見ます。

CentOSと同じようにtesseract-ocrを利用します。

ということで、まずtesseract-ocrをインストールします。
CentOSより簡単で以下でOKです。

sudo apt-get install libtesseract3 libtesseract-dev tesseract-ocr 
sudo apt-get install tesseract-ocr-eng tesseract-ocr-jpn

以下でインストールされたことを確認できます。
tesseract -v


で、お次はrubyで使えるようにするtesseract-ocrをインストールするわけですが、こちらを利用するには、leptonicaが必要になりました。tesseract-ocrを単独で動かす分にはなしでもOKでした。


なのでleptonicaをインストールします。
コンパイルに結構、時間がかかります。

wget http://leptonica.googlecode.com/files/leptonica-1.69.tar.gz
tar xvzf leptonica-1.69.tar.gz
cd leptonica-1.69
./configure
make
sudo make install

ここまで済んだら、gemをインストールします。

gem install tesseract-ocr


これでCentOSで実行した以下のテストコードが実行できるようになりました。



ちなみにleptonicaをインストールしないでtesseract-ocrを利用したら

なんかエラーが起きたよ
/tmp/.ffi-inline-1000/87da260298e169d1e5d4e8952649b2811b81311e.log
を見てね。みたいなことを言われて、logを見ると以下のようにleptonicaのヘッダーがないといわれてしまいました。

g++ -shared -fPIC    -o /tmp/.ffi-inline-1000/87da260298e169d1e5d4e8952649b2811b81311e.so /tmp/.ffi-inline-1000/87da260298e169d1e5d4e8952649b2811b81311e.cpp -llept 2>>/tmp/.ffi-inline-1000/87da260298e169d1e5d4e8952649b2811b81311e.log
/tmp/.ffi-inline-1000/87da260298e169d1e5d4e8952649b2811b81311e.cpp:1:34: fatal error: leptonica/allheaders.h: そのようなファイルやディレクトリはありません
compilation terminated.


2014-01-12

xperiaでgoogleカレンダーの同期に失敗するときの対策

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
xpeiraで複数のgoogleカレンダーを同期させているときに、
googleカレンダー同期が失敗しました
しましたとか言われてしまいました。

カレンダーデータを初期化して再読み込みすればOKみたいなことが紹介されていることが多いのですが、私の場合はダメで、ある特定のカレンダーを同期すると問題になっていました。

その特定のカレンダーの同期をはずせば、問題なく動作していたのです。
さらにgaraxyでは、まったく問題なく同期できていたのです。

ちょっと家族もxperiaを使うようになって、まったく同じ現象だったので、どうも私の端末特有の問題ではなさそうなので、ちゃんと調べてみました。

根本原因かどうかわからないのですが、
カレンダーに繰り返し設定がされているイベントがあって、その繰り返しイベントで特定の日を除外設定をしているものがあるとダメなことがわかりました。

なので、繰り返し設定だけで除外日がまったくないようにイベントを変更したら問題なく動くようになりました。

xperiaの問題なのか、androidのバージョンの問題なのかはわからないのですけどね。

2014-01-09

rubyでOCR

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyで画像上の文字を取得するOCRをやってみした。

OCRのライブラリとしてtesseract-ocrを利用します。

なので、まずはtesseract-ocrを導入する必要があります。

環境は、CentOS6の場合です。

まず必要となるものをyumで入れておきます。

yum -y install autoconf automake libtool
yum -y install libpng-devel libjpeg-devel libtiff-devel zlib-devel


そしてLeptonica という画像解析ライブラリが必要なようなので、これをダウンロードしてコンパイルします。

wget http://leptonica.googlecode.com/files/leptonica-1.69.tar.gz
tar xvzf leptonica-1.69.tar.gz
cd leptonica-1.69
./configure
make
make install
cd ..


いよいよtesseract-ocrと解析に利用する辞書(?)をダウンロードしてコンパイルします。
辞書は英語と日本語のものを入れます。

wget http://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.02.tar.gz
tar xvzf tesseract-ocr-3.02.02.tar.gz
wget http://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.eng.tar.gz
wget http://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.jpn.tar.gz
tar xvzf tesseract-ocr-3.02.eng.tar.gz
tar xvzf tesseract-ocr-3.02.jpn.tar.gz
cd tesseract-ocr
./autogen.sh
./configure
make
make install
mv tessdata/*.traineddata /usr/local/share/tessdata/


利用できるかどうか試してみます。
tesseract-ocrの中にphototest.tifという画像ファイルがあるので、これから文字を取得してみます。

tesseract phototest.tif out
cat out.txt

out.txtになんか文字が出ていればOKです。
なんかいい感じに文字が認識されているように見えます。

日本語辞書も入っていることを確認します。
tesseract phototest.tif out -l jpn
cat out.txt

こちらも何か文字がでればOKです。
こちらは内容は、いけてない感じになります。

ここまでは以下が参考になりました。
http://www.psi-net.co.jp/blog/?p=1080



そしてrubyで使うためのgemをインストールします。

gem install tesseract-ocr


rubyから使ってみます。

以下の画像をOCRにかけてみます。



rubyでocrを使うサンプルは以下のとおりです。



実際の出力は、以下のとおりです。
==== 画像全体から文字を取得します
加順ス 卜ですー
メイリ赫すー ーF^ゴシックを
使ってみました〝
ーF“明朝で†〟
ヒロシで†〟 メ
赤し丶字での 古 琶
メイリ祀す〟 茗 で
麦


==== 画像のメイリオの部分のみ
伽R折ス 卜です〟
メイリ祀す〟


==== 画像のゴシックの部分のみ
ーP^ゴシツクを
使ってみましナこ〝


==== 画像の明朝の部分のみ
ーPA明朝です〟
ヒロシです〟


==== 画像の赤いメイリオの部分のみ
赤し`字での
メイリ祀す〟


==== 画像の縦書きメイリオの部分のみ
メ縦
ィ管
リ實
オで
で
麦


==== 画像の富士山の上のメイリオの部分のみ
\ ` '/ f
~

j での

丿 イリ村す~

/


==== 認識した一文字ずつの情報
0 | text=加 pos=(x:28 y:44 w:23 h:12)
1 | text=順 pos=(x:52 y:44 w:42 h:13)
2 | text=ス pos=(x:94 y:44 w:16 h:13)
3 | text=卜 pos=(x:115 y:43 w:11 h:14)
4 | text=で pos=(x:126 y:45 w:16 h:12)
5 | text=す pos=(x:143 y:43 w:15 h:14)
6 | text=ー pos=(x:159 y:53 w:5 h:4)
7 | text=メ pos=(x:29 y:76 w:14 h:13)
8 | text=イ pos=(x:45 y:75 w:14 h:14)
9 | text=リ pos=(x:63 y:75 w:11 h:14)
10 | text=赫 pos=(x:76 y:75 w:32 h:14)
11 | text=す pos=(x:109 y:75 w:15 h:14)
12 | text=ー pos=(x:125 y:85 w:5 h:4)
13 | text=ー pos=(x:385 y:84 w:6 h:11)
14 | text=F pos=(x:393 y:84 w:7 h:11)
15 | text=^ pos=(x:400 y:84 w:8 h:11)
16 | text=ゴ pos=(x:410 y:83 w:14 h:13)
17 | text=シ pos=(x:426 y:84 w:13 h:12)
18 | text=ッ pos=(x:443 y:87 w:10 h:9)
19 | text=ク pos=(x:458 y:84 w:12 h:13)
20 | text=を pos=(x:474 y:83 w:13 h:14)
21 | text=使 pos=(x:384 y:106 w:16 h:14)
22 | text=っ pos=(x:402 y:111 w:12 h:8)
23 | text=て pos=(x:417 y:108 w:14 h:11)
24 | text=み pos=(x:433 y:107 w:15 h:13)
25 | text=ま pos=(x:450 y:106 w:12 h:13)
26 | text=し pos=(x:468 y:107 w:10 h:13)
27 | text=た pos=(x:481 y:106 w:14 h:13)
28 | text=〝 pos=(x:496 y:116 w:6 h:4)
29 | text=ー pos=(x:122 y:137 w:4 h:11)
30 | text=F pos=(x:128 y:137 w:8 h:11)
31 | text=“ pos=(x:136 y:137 w:8 h:11)
32 | text=明 pos=(x:145 y:136 w:14 h:14)
33 | text=朝 pos=(x:160 y:136 w:16 h:14)
34 | text=で pos=(x:177 y:137 w:15 h:12)
35 | text=† pos=(x:193 y:136 w:15 h:14)
36 | text=〟 pos=(x:208 y:146 w:5 h:4)
37 | text=ヒ pos=(x:122 y:161 w:12 h:12)
38 | text=ロ pos=(x:138 y:162 w:12 h:10)
39 | text=シ pos=(x:154 y:161 w:13 h:12)
40 | text=で pos=(x:169 y:161 w:15 h:12)
41 | text=† pos=(x:185 y:160 w:15 h:14)
42 | text=〟 pos=(x:200 y:170 w:5 h:4)
43 | text=メ pos=(x:506 y:170 w:13 h:14)
44 | text=赤 pos=(x:301 y:189 w:15 h:15)
45 | text=し pos=(x:318 y:192 w:7 h:11)
46 | text=丶 pos=(x:328 y:192 w:4 h:9)
47 | text=字 pos=(x:333 y:189 w:15 h:15)
48 | text=で pos=(x:349 y:192 w:15 h:12)
49 | text=の pos=(x:365 y:192 w:15 h:12)
50 | text=古 pos=(x:506 y:185 w:14 h:31)
51 | text=琶 pos=(x:537 y:169 w:16 h:46)
52 | text=メ pos=(x:302 y:223 w:13 h:13)
53 | text=イ pos=(x:318 y:222 w:14 h:14)
54 | text=リ pos=(x:336 y:222 w:10 h:14)
55 | text=祀 pos=(x:349 y:222 w:31 h:14)
56 | text=す pos=(x:382 y:222 w:14 h:14)
57 | text=〟 pos=(x:398 y:232 w:5 h:4)
58 | text=茗 pos=(x:506 y:217 w:14 h:31)
59 | text=で pos=(x:538 y:219 w:14 h:13)
60 | text=麦 pos=(x:506 y:249 w:14 h:22)

==== 認識した文字ブロックの情報
0 | text=加順ス 卜ですー
メイリ赫すー ーF^ゴシックを
使ってみました〝
ーF“明朝で†〟
ヒロシで†〟 メ
赤し丶字での 古 琶
メイリ祀す〟 茗 で
麦

 pos=(x:0 y:0 w:607 h:476)

==== 認識した文字段落(ブロックとの違いがよくわからない)の情報
0 | text=加順ス 卜ですー
メイリ赫すー ーF^ゴシックを
使ってみました〝
ーF“明朝で†〟
ヒロシで†〟 メ
赤し丶字での 古 琶
メイリ祀す〟 茗 で
麦

 pos=(x:28 y:43 w:525 h:228)

==== 認識した文字の行ごとの情報
0 | text=加順ス 卜ですー
 pos=(x:28 y:43 w:136 h:14)
1 | text=メイリ赫すー ーF^ゴシックを
 pos=(x:29 y:75 w:458 h:22)
2 | text=使ってみました〝
 pos=(x:384 y:106 w:118 h:14)
3 | text=ーF“明朝で†〟
 pos=(x:122 y:136 w:91 h:14)
4 | text=ヒロシで†〟 メ
 pos=(x:122 y:160 w:397 h:24)
5 | text=赤し丶字での 古 琶
 pos=(x:301 y:169 w:252 h:47)
6 | text=メイリ祀す〟 茗 で
 pos=(x:302 y:217 w:250 h:31)
7 | text=麦

 pos=(x:506 y:249 w:14 h:22)

==== 認識した単語のごとの情報
0 | text=加順ス pos=(x:28 y:44 w:82 h:13)
1 | text=卜ですー pos=(x:115 y:43 w:49 h:14)
2 | text=メイリ赫すー pos=(x:29 y:75 w:101 h:14)
3 | text=ーF^ゴシックを pos=(x:385 y:83 w:102 h:14)
4 | text=使ってみました〝 pos=(x:384 y:106 w:118 h:14)
5 | text=ーF“明朝で†〟 pos=(x:122 y:136 w:91 h:14)
6 | text=ヒロシで†〟 pos=(x:122 y:160 w:83 h:14)
7 | text=メ pos=(x:506 y:170 w:13 h:14)
8 | text=赤し丶字での pos=(x:301 y:189 w:79 h:15)
9 | text=古 pos=(x:506 y:185 w:14 h:31)
10 | text=琶 pos=(x:537 y:169 w:16 h:46)
11 | text=メイリ祀す〟 pos=(x:302 y:222 w:101 h:14)
12 | text=茗 pos=(x:506 y:217 w:14 h:31)
13 | text=で pos=(x:538 y:219 w:14 h:13)
14 | text=麦 pos=(x:506 y:249 w:14 h:22)


認識レベルは、なんかちょっとザンネンな感じです。

認識レベルを上げるにはどんな調整をすればよいのかは、よくわかっていません。

rubyでocrを利用することに関しては、以下が参考になりました。
http://schima.hatenablog.com/entry/2013/10/16/203616