2014/02/09

Arch Linuxでカーネルを更新したのにバージョンが古いままだった件 (環境の問題)

Arch Linuxのpacmanでアップデートを行ったところ、
linuxのアップデートがあったのですが...
再起動後、コンソールで表示が遅い、Xも起動しない、...という問題が。
(結論からいうと、環境の問題というか設定ミスでした m(_ _;)m)

lsmodすると...読み込まれているモジュールが明らかに少ない様子です。
$ lsmod
Module                  Size  Used by
ext4                  474251  3
crc16                   1367  1 ext4
mbcache                 6082  1 ext4
jbd2                   83504  1 ext4
dm_mod                 82469  9
sr_mod                 14898  0
cdrom                  34848  1 sr_mod
sd_mod                 30821  2
rtsx_pci_sdmmc         14332  0
ahci                   23056  1
libahci                21674  1 ahci
libata                170856  2 ahci,libahci
sdhci_pci              12146  0
sdhci                  29116  1 sdhci_pci
scsi_mod              130701  3 libata,sd_mod,sr_mod
mmc_core               95691  3 sdhci,rtsx_pci_sdmmc,sdhci_pci
rtsx_pci               32209  1 rtsx_pci_sdmmc
ehci_pci                4000  0
ehci_hcd               59220  1 ehci_pci
usbcore               180136  2 ehci_hcd,ehci_pci
usb_common              1656  1 usbcore
正常時は 116行なのに対して、22行しかありませんでした(笑)

mkinitcpioで確認してみようとしたところ...。
$ sudo mkinitcpio -M
 ==> ERROR: 'lib/modules/3.12.5-1.ARCH/' is not a valid kernel module directory.
カーネルモジュールのディレクトリが正しくないというエラーが。
しかも、バージョンが違うような?
(でも、アップデートでは何もエラーは表示されていませんでした。)

まずは、カーネルのバージョンを調べます。
$ uname -r
3.12.5-1-ARCH
アップデートされたはずのカーネルのバージョンがどうも古いままでした。

では、/lib/modulesは...というと...
$ ls /lib/modules/
合計 8
drwxr-xr-x 3 root root 4096  2月  9 13:25 3.12.9-2-ARCH
drwxr-xr-x 2 root root 4096  2月  9 13:25 extramodules-3.12-ARCH
こちらは新しいカーネルのバージョンでした。

さてここで原因が分かりました。
参照: [Solved] Uname doesn't changes after linux-3.9.5 upgrade

私のPCでは、/(ルート)や/homeはLVMボリュームであり
/boot は分割して通常のパーティションに割り当てています:
  • /(ルート) - LVMボリューム (/dev/sda8, /dev/VolGroup00/lvolroot)
  • /home - LVMボリューム (/dev/sda8, /dev/VolGroup00/lvolhome)
  • /boot - ext4 (/dev/sda10)

/bootパーティションがマウントされているか確認してみると...
$ mount -l | grep boot
空ということで、何も/bootにマウントされていないようです。

しかし、/bootには最新のイメージが書き込まれていました。
$ ls /boot -l
合計 xxxxx
-rw-r--r-- 1 root root 17758784  2月  9 13:25 initramfs-linux-fallback.img
-rw-r--r-- 1 root root  4344657  2月  9 13:25 initramfs-linux.img
-rw-r--r-- 1 root root  3867632  1月 31 18:24 vmlinuz-linux
※ でも、あるはずのgrubディレクトリが無いのです。

つまり...どういうことかと言いますと...
pacman -Syu でLinuxカーネルのアップデートがあった場合、
自動的にmkinitcpioが実行されますが、
この時、 /boot パーティションがマウントされていなかったため、
空の/bootディレクトリに最新のイメージファイルが書き込まれたようです。

GRUBから起動するときは /bootが/dev/sda10から起動されますが、
起動した後は、/bootがLVM上の/(ルート)下にあるものに置き換わっているため、
不整合となっていたようです。(そのため、必要なモジュールが読み込まれない。)

とりあえず、処置として...
コンソール上で /bootをマウントした上で
downgrade を使ってlinuxのカーネルを再インストールしました。
(pacman -Uでカーネルを再インストールしたり、mkinitcpioを手動実行してもいいはず。)

あとは再起動すれば正常に起動します。

さらに、fstabに/bootを追記しておきます。
$ sudo vi /etc/fstab
# /dev/sda10
/dev/sda10 /boot ext4 rw,relatime,data=ordered 0 2
これでOKです。たぶん(^^;)

とりあえず、一件落着です ε-(´∀`*)

2014/02/01

AndroidでTesseract-OCRを用いてカメラで光学文字認識をしてみた

AndroidでTesseract-OCRを使って、カメラで撮影した画像からOCR(光学文字認識)をしてみました。

"Tesseract-OCR"はOCRエンジンであり、元々HPによって開発され、OSS化されて今はGoogleがメインメンテナとなっています。
このTesseract-OCRをAndroidでNDKとして利用するためのライブラリが "tesseract-android-tools"です。

尚、本記事は Android SDK、GNU make、Awk、Gitがインストールされていることが前提です。また、OS環境としてLinux(Arch Linux x64)を使っています。

まずは、"Android NDK"をダウンロードします。
(すでにAndroid NDKをセットアップしていれば、この手順は不要です。)
今回は、Linux x64向けの最新版である "android-ndk-r9c-linux-x86_64.tar.bz2"を用いました。
さらにダウンロードしたアーカイブを展開し、これに含まれる"ndk-build"コマンドを利用できるようにPATHを通しておきます。
$ wget android-ndk-r9c-linux-x86_64.tar.bz2
$ tar jxf android-ndk-r9c-linux-x86_64.tar.bz2
$ sudo mv android-ndk-r9c/ /opt/
$ echo 'export PATH=$PATH:/opt/android-ndk-r9c' >> ~/.bashrc
$ echo 'export NDKROOT=$PATH:/opt/android-ndk-r9c' >> ~/.bashrc
$ source ~/.bashrc

次に、"tesseract-android-tools"を...
...のはずですが、執筆現在、Android NDK r9 でうまくビルドできませんでした。

代わりに、rmtheis 氏によってForkされたプロジェクトが公開されていますので、そちらを使わせていただくことにします。尚、このプロジェクトにはTesseract、Leptonica、その他の必要なファイルが同梱されています。
$ git clone  https://github.com/rmtheis/tess-two.git
$ cd tess-two/tess-two/

あとは READMEファイルのとおりにビルドを進めていきます。
但し、ここでAndroid SDKのAPI level 8がインストールされていないとエラーが発生しましたので、project.propertiesを書き換えることで対処しておきます。(自分のPCにインストールしておいたAPI levelに書き換えてください。)
--- project.properties
+++ project.properties
@@ -9,4 +9,4 @@
 android.library=true
 # Project target.
-target=android-8
+target=android-10
さらにコマンドを実行します。
$ ndk-build
$ android update project --path .
$ ant release

次に、Eclipseでプロジェクトをインポートします。
先ほどndk-build した "tess-two"プロジェクトを、Eclipse上で"Androidプロジェクト"としてインポートします。
インポートされたら、プロジェクトのプロパティで"ライブラリ"扱いになっているかを確認します。
Eclipse上でプロジェクト"tess-two"をインポートしたら、
プロジェクトのプロパティで"ライブラリー"にチェックが入っていることを確認する。

あとは、Androidアプリケーションを書きます。
今回は、最低限の簡単なサンプルアプリケーションを作ってみましたので、
一式をGitHubのリポジトリとして公開しておきました:
https://github.com/mugifly/android_tesseract-ocr_test
ご自由に git cloneして、動作を試したり改変したりしてご利用ください。

尚、このAndroidアプリケーションプロジェクトのほうでは、先ほどのライブラリプロジェクト"tess-two"をライブラリーとして追加しておきます。
Androidアプリケーションプロジェクトのプロパティで
使用するライブラリーとして先ほどの"tess-two"プロジェクトを追加する。
さらに、"tesseract-ocr"の学習データをダウンロードします。
日本語の学習データは http://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.jpn.tar.gz です。
これをダウンロードして展開すると"jpn.traineddata"というファイルがあります。

このファイルを、先ほどのAndroidアプリケーションプロジェクト内の"assets"ディレクトリ内にコピーしておきます。
Androidアプリケーションプロジェクトに"assets"フォルダを作り、
そこに"jpn.traineddata "をコピーしておく。
※ assets内の学習データを直接Tesseract-OCRで読み込めるようにするには、
tess-two (tesseract-android-tools)を改変する必要がありそうでしたので、
代わりに私が作成したサンプルアプリケーションでは、起動時にassets内の学習データをSDカード上にコピーする処理を実装しておきました。

尚、学習データがないと当然ながらOCR処理でエラーが発生します。ご注意下さい。

あとはAndroidアプリケーションプロジェクトをビルドするだけです。
NDKを用いたアプリケーションなので、ビルドに少し時間がかかります。

さて、写真を撮って文字認識をしてみます...。
尚、今回は面倒くさかったので、実機ではなくAndroidの開発用エミュレータを用いました。カメラは適当にあったWebカメラ QCam S7500 で、解像度はVGAに落として撮影しています。


OCRをかける前に二値化処理を行い、さらに数字だけに絞ってOCRをかけています。
適当に写真を撮った割には、まあまあの認識精度だと思いますが、
やはり、前処理(傾き、歪みとか、二値化とか...)について改良する余地がありそうです。

また、手書きした文字についてはうまく読み取りできませんでしたが、手書きの文字ばかりを集めて学習データを生成すれば、不可能ではないようです。
(参照: tesseract for handwriting recognition)

それでは (^ ^)♪

参考にさせていただいたページ (感謝♪):

2014/01/30

Arduino Pro Mini + Felica Plug でNFC-F/Type3としてAndroid端末から読み書き

Felica Plug (RC-S802) を Arduino Pro Mini (328 3.3V/8Mhz) で制御して
仮想的な NFC-F/Type 3カードとし、
NFC対応のAndroid端末(GALAXY NEXUS)から読み書きしてみました。

(今回使用したAndroidアプリは、NXPの"NFC TagWriter"です。)

今回用いたモノ:
  • "Arduino Pro Mini 328 8Mhz 3.3V"
    Felica Plugは1.8~3.7V動作の為、5VのArduinoボードだとレベル変換が必要となります。その点、このボードは3.3V動作なのでそのまま使えます。クロックも8Mhzで省電力です。
  • "Felica Plug RC-S802"
    マイコンと接続して、Felicaカードとして振る舞えるモジュール。
  • "FeliCa Plug ピッチ変換基板 (フラットケーブル付)"
    便利なピッチ変換基板があるので使うことにしました。FFC付きです。
  • ジャンパワイヤ、ピンソケット 等々...
尚、Arduino Pro MiniにはUSB端子がないので、アダプタとして
今回はスイッチサイエンスのFTDI USBシリアル変換アダプターを使いました。

以下、手順を簡単に説明します。

2014/01/19

進数計算のAndroidアプリ bin.Calc を公開しました

このブログでAndroidの話ははじめてかもしれないですね。
今日、"bin.Calc"という進数計算のAndroidアプリを公開しました。


bin.Calcの特徴は、シンプルで実用的かつAndroidらしいUIデザインを目指した事と
小数に対応している事、進数変換の手順を表示できる事です。


進数変換の手順表示はあとづけ感満載ですが (^^;)

実はbin.Calcのコードを書き始めたのは2012年の秋だったのですが、
途中、他の開発に取り組んでいて放置していた時期もあり...右往左往があって...
先日からまた少しずつコードを書き足し、やっと公開することができました。
しばらく間をあけても必ずいつか形にする。それを一つの目標にしています(笑)

テストはしていますが、もしかしたらまだ不具合が隠れているかもしれません。
また、タブレットへの最適化や横画面への対応、計算精度など
不足している点も少なからずあるとは思います。
皆さまからのフィードバックをお待ちしております m(_ _)m
(Google Playや、このブログ、Twitter、... どこからでも構いません。)

オープンソース・ソフトウェアとして公開しておりますので
Pull Requestもお待ちしております: GitHub - bin.Calc_android

bin.Calc
https://play.google.com/store/apps/details?id=info.ohgita.bincalc_android

2013/09/23

YAPC::Asia Tokyo 2013 に参加してきました

9月20日〜23日に開催された "YAPC::Asia Tokyo 2013" に参加してきました。
YAPCは、PerlをはじめとするLL(Lightweight Language)のお祭りです。
尚、今回の会場は、慶應義塾大学 日吉キャンパスでした。
YAPCと関係ありませんが、日吉キャンパスは大きいキャンパスで綺麗ですね。
学内にローソンとか薬局とかバーとか、色々あって羨ましいですw


実は私自身、YAPCにはいつか参加したいなーと思っていながら...
今回が初参加だったりします。

また、Perlを始めたばかりの友人たちも引き連れて行ってきました。
学生なので、無料で参加させていただくことができました。

朝一から移動の都合で少し遅れつつ会場入りしましたが..
皆さん、PCを開きつつ静かに話を聞いていらっしゃいました。

関係ないと思うけれど、Mac率が高かったですw
YAPCといえば、やはり、まずはトークですね!
初心者向けのトークから、技術的・ディープなトークまで...何でもありな感じが楽しかったです。
PerlやLLに一見関係のないトークもあったり。英語のトークも頑張って聞いてみましたww
@papixさん、@yusukebeさん、@goccyさん、... 特に面白く興味深いトークをありがとうございました。
”特別座談会「Rubyの良いところ語ってください 〜そんなPerlで大丈夫か?〜」"の様子。
いつイスの投げ合いが始まっちゃうんだろうとドキドキしましたが、大丈夫でしたw
適材適所。それにPerlだって影響しあって進化し続けていますよね。
ネタありマジメあり...両日のLTも楽しかったです!
(そういえば...ドラ娘さんの居るLT、はじめて実際に見ましたw
その日の都合で5分という持ち時間が3分に短縮...!! となってしまうのもLTの醍醐味ですかねw
)

ノベルティも色々もらえました♪ (一部別途いただいたものも。)
YAPC::Asia Tokyo 2013でいただいたノベルティの数々。
YAPC Tシャツ, タオル, mixiさんのストラップ, Planning Porker,
DeNAさんのうちわ, GaiaX さんの水, 各種シール,  ファイル, など...
こんなにもらえるとは思っていませんでしたw
さくらのクラウドの無料券も入っていました (...これはOSCで既に頂いたので使いませんが。)
今回は(図々しく)、20日に行われた お昼の"ランチセッション"と、"懇親会"にも参加させていただきました。

まず、ランチセッションは、スポンサー企業 (Six Apart さん、Microsoft さん)のお話を聞きながら、お弁当をいただくという企画です。学生には特にありがたいです。
お話を伺いながらお弁当をいただきました。美味しかったです♪
Six Apartさんといえば、Movable Type。使いこなしていきたいものですね!
また、懇親会では、スポンサー企業 (DeNA さん)による出資で、無料で会食がいただけるという...。リッチでびっくりしました。
(懇親会を含め、今回は何かと興奮して写真を撮り忘れてしまいました(^^;))
誰に話しかけようかなーなどと思いつつ、軽いコミュ症っぷりが発揮されかけてしまったのですが(笑)・・・
でも、他のエンジニア/非エンジニアの社会人の参加者や、学生さん、またフォロワーさんとも個別にお話することができ、とても有意義に時間を過ごせました。

今回のYAPCに参加して。
自分個人の今後や趣味においても、プロジェクトにおいても、モチベーションや今後やるべきことのヒントが得られたように思います。

同行してくれた友人たちにも、PerlとYAPCの魅力が理解できたと思いますし、学び得られるものがあったはずです。

早速、友人たちと立ち上げている開発プロジェクトでも、
トークを聞いて学んだことや気づいたこと(マネジメントのこと、開発のこと、その他諸々...)を存分に取り入れていきたいです。
より良いチームのコミュニケーションとかも、まさに必要なことだったりして。

次回は、是非とも、ボランティアスタッフか、トーク/LTとして参加したいです!
ああ...来年が待ち遠しい...(><)/ YAPC::Tohokuも楽しみにしています。

スタッフの皆さん、トークしてくださった皆さん、お話してくださった皆さん、企業スポンサーの皆さん...
総じて、Perl Mongerの皆さん、ありがとうございました m(_ _)m ♪!

2013/09/09

Linuxの /var をルートから別パーティションに移動した

Arch Linuxのルート(/)パーティションの容量が足りなくなってきました。
nacl_sdkのアップデートをしようとして気づいたという(^^;)
整理も限界があるので、思い切って、/var を別のパーティションに移しました。
※ /var には、ログファイル、キャッシュ、その他諸々のファイルが保存されます。
消してもいいファイルもあるのですが、いずれにせよ日頃から拡大したいと考えていたので(汗;)
ちなみに /home はインストール時に別パーティションにしておいたのですがw

特にどのLinux環境でも大凡同じで、簡単に行えますが、一応メモしておきます。
ちなみに、 今回は /var ですが、/boot あたりはちょっと追加手順が必要かもしれません。

まずは、LiveCDなどから作業用にLinuxを起動します。
今回は、手元にあった Ubuntu 12.04 (i386) のUSBメモリからブートしました。

早速、GPartedを用いて、/var のための"新しいパーティション"を作成します。
最近は GPartedが標準で入っているんですね。GUIでなんとも便利です。...Windows98でfdiskを使っていたときが懐かしい...。
  • 容量: 20GiB (8〜12GBが最適らしい。参照: Partitioning - ArchWiki)
  • ファイルシステム: ext4
  • デバイス名: /dev/sda9 (今回の場合)
として作成されました。

ここで確認しておきますが、以降、
  • "対象システムのルートパーティション": /dev/sda7
    Arch Linuxのルートパーティション (/)。既存の /var やその他ディレクトリが含まれる。
  • "新しいパーティション":/dev/sda9
    今作成したパーティション。Arch Linuxの新しい /var となる予定。
とします。

次に、"対象システムのルートパーティション"(/dev/sda7)と、
"新しいパーティション"(/dev/sda9)を、それぞれ適当にマウントします。

$ mount /dev/sda7 /mnt/arch-root/
$ mount /dev/sda9 /mnt/arch-var/
今回は以下のようにマウントしました:
  • 対象システムのルートパーティション: /mnt/arch-root/
  • 新しいパーティション: /mnt/arch-var/

次に、対象システムのルートパーティション下にある 既存の "/var" を
"新しいパーティション"下にコピーします。

(パーミッションを維持するようオプションをつけることをお忘れなく.)
$ sudo cp -av /mnt/arch-root/var/* /mnt/arch-var/

既存の /var は、念の為にリネームしてとっておきます。
$ sudo mv /mnt/arch-root/var /mnt/arch-root/var-

次に、"新しいパーティション"のUUIDをコピーして...
$ blkid /dev/sda9
/dev/sda9: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4"
さらに、対象システムのルートパーティション下の"/etc/fstab"に項目を追加します。
(新しいパーティションを /var としてマウントするように設定するわけです。)
$ sudo vi /etc/fstab
~~~~
# UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
/dev/sda9  /var  ext4rw,relatime,data=ordered  0  2
~~~~
"<デバイス名> <マウント位置> <オプション> <Dump> <Pass>"
参照: fstab - ArchWiki

あとは再起動して、対象システム(今回は、Arch Linux)を起動します。
問題がなければ、既存の/var- (リネームしたもの)を削除して終わりです♪

p.s.
全然関係ないですが、最近、GitHub上のプロフィールに表示される使用言語が
"Perl, JavaScript, CSS"だったり、"Perl, JavaScript, C"だったり...。
C/C++/Assembly成分ももっと増やして行きたいところです(><;)

2013/08/27

32bit Linux上のperlで64bitを扱う

友人たちと起こしているプロジェクトでのこと。
私の環境は ArchLinux 64bitなどですが、メンバーには Ubuntu 32bit使いが居ます。
先日、プロジェクトで使うデータベースドライバを一部置き換えるために、"Mango"というNon-blockingなMongoDBドライバをcpanでインストールしようとしたところ、"Perl with support for quads is required!" とエラーが表示されて、インストールできなかった...という報告を受けました。

MangoのMakefile.PLを見ると、$Config{use64bitint}が定義されていて、かつ、${longsize}が8以上である必要があるようです。
即ち、64bitモードのperlでなければならないという事ですね。たぶん。
しかし...次からは、事前にもっときちんとチェックしないと(...反省)

さて...。perlは、32bit環境のOSでも、64bitとしてシミュレートができます。
http://search.cpan.org/~rjbs/perl-5.18.1/INSTALL#64_bit_support
ついては、perlをビルドする際に、"-Duse64bitint" または "-Duse64bitall" オプションを付けると良いようです。

perlbrewを用いてビルド&インストールする場合は、以下のように行います。
(以下は、Redhat系での例。Ubuntuの場合は、yumの代わりに、apt-getで"build-essential"をインストールすると良いはず。)
$ sudo yum install glibc-devel.i686 libgcc.i686 make gcc
$ curl -L http://install.perlbrew.pl | bash
$ source ~/perl5/perlbrew/etc/bashrc
$ perlbrew install 5.18.1 -Duse64bitint
$ perlbrew switch 5.18.1
$ echo source ~/perl5/perlbrew/etc/bashrc >> ~/.bashrc
$ source ~/.bashrc

perl -v すると、i686-linux-64int という表示が確認できます。
$ perl -v
This is perl 5, version 18, subversion 1 (v5.18.1) built for i686-linux-64int

Copyright 1987-2013, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

これでとりあえず問題なく、Mangoもインストールすることができるはずです。