2014/04/29

Tesseract-OCRでMNISTのデータを用いて手書き数字認識をしようとしてみた

MNISTの手書き数字データベースのデータから
Tesseract-OCR用に学習データを生成し、手書き数字をオフライン認識してみます。

先に言い訳とお断りをさせていただきますと....
今回はとりあえずそのまま作るとどうなるかという実験のつもりでしたので
私の処理が「思いっきり手抜き」であり、数字しか認識できず認識率も低いですが、
とりあえず学習データができたというレベルの自分用メモとして記しておきます。
Tesseract-OCRもMNISTのデータベースも、正しく使えば、本来は相当な認識率となるはずです
 より正しい方法をご存知の方や、学習データの情報をご提供いただける方は是非教えていただければ幸いです
 ご指摘等をお待ちしております。 (記事のタイトルの歯切れが悪いのはそういうことです(汗;))


利用した環境は Linux (Arch Linux x64)であり、
Tesseract-OCR および engの学習データがインストール済みである事が前提です。
(Arch Linuxのpacmanでは tesseract, tesseract-data-eng でインストール可能。)

尚、Tesseract-OCRでの学習に関する手順は Tesseract-OCRの学習 - はだしの元さん を参照、引用させていただきました。感謝申し上げます。


1. MNISTのデータを取得

まずは 学習モデルの素となる MNISTのデータを取得...といきたいところですが、
今回はそのままでは使いづらい(もとい、使い方がよくわからない(^^;))ので
JPEG化されたデータを使わせていただくことにします。
http://www.cs.nyu.edu/~roweis/data.html

上記URLのページにある"MNIST Handwritten Digits"の
"training pictures"を0〜9までダウンロードします。
各々はJPEGファイル(mnist_train*.jpg)であり、その数字の手書き画像が大量に結合された巨大な画像ファイルとなっています。
training picturesの"0" (抜粋)
手書きされた数字の0が大量に結合されている。
さらに前処理として...これらのJPEGファイルを二値化してノイズを取り除き、PNGファイルとして保存しておきます。
この時、tesseractのboxファイルの命名規則に応じたファイル名にすると楽です:
(3文字の言語名).(フォント名(任意)).exp(インデックス番号)
という規則になっています (引用元)。  今回は数字だけですので...
  • 言語名: "eng"
  • フォント名:  "hand" (適当)
  • インデックス番号: PNGファイルの数字にあわせて0〜9
    (例: eng.hand.exp0.png 〜 eng.hand.exp9.png)
とします。
convertコマンドを使えば、二値化とPNGファイルとしての保存が一発ですね。
$ convert -threshold 30000 mnist_train*.jpg eng.hand.exp%d.png

2. boxファイルを生成

次にtesseract コマンドを用いて、PNGファイルからboxファイルを生成します。
$ tesseract eng.hand.exp0.png eng.hand.exp0 -l eng batch.nochop makebox &&\
tesseract eng.hand.exp1.png eng.hand.exp1 -l eng batch.nochop makebox &&\
tesseract eng.hand.exp2.png eng.hand.exp2 -l eng batch.nochop makebox &&\
tesseract eng.hand.exp3.png eng.hand.exp3 -l eng batch.nochop makebox &&\
tesseract eng.hand.exp4.png eng.hand.exp4 -l eng batch.nochop makebox &&\
tesseract eng.hand.exp5.png eng.hand.exp5 -l eng batch.nochop makebox &&\
tesseract eng.hand.exp6.png eng.hand.exp6 -l eng batch.nochop makebox &&\
tesseract eng.hand.exp7.png eng.hand.exp7 -l eng batch.nochop makebox &&\
tesseract eng.hand.exp8.png eng.hand.exp8 -l eng batch.nochop makebox &&\
tesseract eng.hand.exp9.png eng.hand.exp9 -l eng batch.nochop makebox
尚、処理には1時間程度かかりました。

3. boxファイルを修正

次にテキストエディタを用いて、boxファイルに対して修正を行います。
ここではまず、"0"の分のboxファイル(eng.hand.exp0.box)を見てみます:
o 2134 2132 2150 2152 0
o 2135 2104 2149 2124 0
o 2133 2075 2153 2095 0
a 2133 2048 2153 2066 0
a 2133 2021 2153 2037 0
o 2132 1992 2152 2012 0
o 2134 1964 2152 1984 0
o 2132 1936 2152 1956 0
o 2133 1907 2153 1927 0
o 2133 1880 2151 1900 0
o 2133 1853 2153 1869 0
o 2133 1825 2153 1842 0
o 2133 1797 2153 1815 0
n 2131 1770 2151 1784 0
o 2135 1739 2150 1759 0
....
先頭は認識された文字ですが、"0"ではなく"o"や"a"、"n"になってしまっています。
これをすべて"0"に置き換えます。(正規表現置換でs/^./0/すると良いですね。)
(※本当は行頭のあとの座標データも修正しなければならないようですが、今回は見逃しておきますw
本当はデータ数減らしてでもちゃんと修正すべきだと思います。)

この処理も0〜9のすべてのboxファイルに対して行います。

4. trファイルの生成

PNGファイルと修正したboxファイルから
tesseractコマンドを用いてtrファイルを生成します。
$ tesseract eng.hand.exp0.png eng.hand.exp0 nobatch box.train.stderr
これにより eng.hand.exp0.tr というファイルが生成されます。

この処理も0〜9のすべてのファイルに対して行います。

5. trファイルおよびboxファイルの結合

生成された 0〜9の分のtrファイル、boxファイルを各々結合します。
$ cat eng.hand.exp*.tr > eng.hand.exp.tr
$ cat eng.hand.exp*.box > eng.hand.exp.box
これ以降はほぼ参照させていただいたページのとおりですが、
丸投げもいけませんので、自分用メモとして掲載させていただきます m(_ _)m

6. 学習データの下準備

まず、boxファイルに対してunicharset_extractorコマンドを実行します。
$ unicharset_extractor eng.hand.exp.box
これにより、"unicharset"ファイルが生成されます。
※ この時、boxファイルの指定はこのように拡張子をつけます。

次に、テキストエディタで"font_properties"ファイルを作成します。
$ vim font_properties
hand 0 0 0 0 0
※ 先頭の文字列は最初に適当に決めたフォント名です。0 0 0 0 0はフォントの種類を表しますが、今回は特に何もないので0です。(詳しく参照ページをご覧ください。)

7. 学習データの生成

まず、先ほど作成したファイルをもとに、mftrainingコマンドを実行します。
$ mftraining -F font_properties -U unicharset eng.hand.exp.tr
これにより、"inttemp"、"shapetable"、"pffmtable"の3ファイルが生成されます。
※ この処理に約20時間要しました (Core i5 2520M @2.50Ghz, RAM8GB にて)。

さらに以下のコマンドを実行します。
$ mftraining -F font_properties -U unicharset -O eng.unicharset unicharset eng.hand.exp.tr
※ この処理にも約20時間要しました...(^^;)

続けて、cntrainingコマンドを実行します。
$ cntraining eng.hand.exp.tr
これにより、"normproto"ファイルが生成されます。
※ 以降の処理は数秒で行えます。

次に、本章で生成されたファイルのファイル名を変更し、
各々の先頭に言語名(今回は"eng")を付与します。
$ mv inttemp eng.inttemp
$ mv shapetable eng.shapetable
$ mv pffmtable eng.pffmtable
$ mv normproto eng.normproto

最後に、combine_tessdataコマンドを実行します。
$ combine_tessdata eng.
※ 最後のドットを忘れないようにしましょう。
これにより、"eng.traineddata"が生成されます。これが学習データです。

あとは...tesseractコマンドや、先日の記事のTesseract-OCRを用いたAndroidアプリケーションでこの学習データを利用できます。

8. 学習データを利用して認識してみる

生成した学習データを /usr/local/src/tesseract-ocr あたりにコピーしてもよいのですが、今回は環境変数で学習データのパスを指定してみることにします。
まず"tessdata"というディレクトリを作成し、学習データを入れておきます。
$ mkdir tessdata
$ mv eng.traineddata tessdata/
次に認識させたい画像をPNGファイルなどとして用意しておきます。(やはり2値化しておくと良いようです。)

あとは環境変数をつけて、tesseractコマンドを実行するだけです。
$ TESSDATA_PREFIX=. tesseract foo.png out.txt -l eng
これにより、out.txt に手書き数字の認識結果が得られます。

認識率は...私の手抜きの分、うーん(´・ω・`)...という感じです。
認識結果は参考までに...

  • 元画像(MNISTのデータをPNG化したもの)から適当な行を抜き出して認識させてみると、そこそこ満足できる認識率が得られました。
    (これで一応、学習データがそれらしく生成できていることは確認できました。)
  • 数字4桁を紙に手書きして、スマートフォンのカメラで撮影したものは...
    そのままでは全く認識できませんでしたが、
    数字部分を切り抜き、2値化と膨張を施すと、後ろ2文字は認識できました。さらに1文字目の数字の間隔を広げたところ、4文字すべて認識できました。

恐らくデータをもっと丁寧に前処理して、boxファイルの修正も丁寧に行えば、精度は向上すると思います...。
素晴らしいデータベースオープンソースソフトウェアであるにも関わらず、私の手抜きでこんな記事になってしまい大変失礼いたしました m(_ _;)m

もう一回、データ数を減らしてまじめに作りなおしてみようかな...とも思ったり...。


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

2014/03/16

Let's note CF-S10上のLinuxで正常にサスペンドするために (Arch Linux用カーネル再ビルドスクリプト)

Let's note CF-S10シリーズではLinux環境でサスペンドすると、内蔵キーボードやトラックパッドが認識されなくなる不具合があります。(知っている人は知っていると思いますが...。)
参照: Ubuntu 日本語フォーラム - サスペンドから復帰後キーボードが認識されません

Ubuntuに限らず、Arch Linuxなどの他ディストリビューションでもこの問題が発生します。 (i8042に関する問題ですが、他のi8042搭載マシンでは問題ないらしく、CF-S10シリーズのみ発生します。)
カーネルのドライバを書き換えてビルドしなおせば対策できますが、アップデートの度に自分で書き換えるのはあまりにも面倒です。
(ちなみに先日、東京で学会発表する機会があって CF-S10を持っていったのですが、何日か前にカーネルのアップデートをしてから再起動せずにサスペンドして使っていたところ、この問題の影響で一部デバイスが認識されなくなり焦りましたw)

...ということで...ちょっと今更ですが、
Arch Linux環境向けにカーネルを自動で書き換えてビルドしなおすスクリプトを書きました。
行っている内容としては...
  1. Arch Linuxの公式リポジトリからPKGBUILDやpatchを取得。
  2. makepkgを用いてPKGBUILDから最新カーネルのソースコードを取得。
  3. 上記参照ページと同様に drivers/input/serio/i8042.c を書き換え。
  4. makepkgでビルドを実行してパッケージ化し、システムに上書きインストール。
    (尚、ビルドは4コア使うように設定してありますが、数十分を要します。)
となっています。

わざわざこの機種のためにAURにカスタムカーネルとしてパッケージを登録するのもよろしくないのかな...と思いつつ、このような方法を取ってみました。
今後、Linuxカーネルがアップデートされたときにもこのスクリプトを実行すれば、不具合対策済みカーネルで上書きできます(...できるはずです)。

尚、このスクリプトは特に自己責任でご利用ください
また間違いやもっと良い方法がありましたら、ご指摘をお待ちしております m(_ _)m

それでは♪

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 ♪!