Android 4.4以降のSDカード書き込みについて

タグ: | 投稿日: 投稿者:

こんにちは、kikuです。

GoogleはAndroidの4.4からSDカードへの書き込みの仕様が変わって、大勢の開発者達を泣かせていますね。ひどい男です。

現状どのような状況になったのかまとめてみました。

まず今回の対象端末はプライマリストレージ本体のものでセカンダリストレージSDカードの端末、つまり大容量の内部ストレージを所持しつつSDカードにも対応している端末です。

しかし、全くSDカードに書き込めないというわけではありません。
全く書き込めなければSDカード対応という存在意義がなくなってしまいますよね。
下記パスにならアプリ側から書き込みが可能なようです。
[SDカードのroot]/Android/data/[パッケージ名]/[ここから書き込みできます]

しかし!アプリ側から上記階層の[パッケージ名]のフォルダを作成する事はできませんでした。
これは恐らく [SDカードのroot]/Android/data/ のディレクトリに書き込み権限がないからでしょう。
少なくとも私が色々試したところできませんでした。(何かできる方法があれば教えてください)

つまりこういうこと
[SDカードのroot]/Android/data/[ここへは書き込めません]
[SDカードのroot]/Android/data/[パッケージ名]/[ここに書き込めます]

開発者を泣かせすぎです。許しがたいです。よっぽどSDカードは使わせたくないんですね。

ちなみにアプリをアンインストールすると[パッケージ名]フォルダごと消されます。そこらへんも怖い仕様です。

端末にプリインストールされているファイルマネージャアプリは[パッケージ名]フォルダを作成することが出来るようですので、ユーザ側からすると色々と弄くれるみたいですね。

詳しくは、Android.comの「外部ストレージ技術情報」をご覧下さい。

2015/12/8 追記
APIレベル19以降(4.4)であれば、Context.getExternalFilesDirs()という便利なものが使えました!
これをアプリ内で呼べば下記フォルダを作成した上にパスの取得も可能です。
[SDカードのroot]/Android/data/[パッケージ名]

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

FuelPHPで管理画面のベースを爆速で作成してみる

タグ: , | 投稿日: 投稿者:

こんばんは、ベッチです。

タイトル通り、FuelPHPで管理画面のベースを爆速で作成してみたいと思います。
Mac前提ですので、Windowsの方は便宜読み替えて下さい。

1.まずはoilコマンドをインストールします。

※CakePHPでいうbakeコマンドみたいなものです。

curl get.fuelphp.com/oil | sh

2.oilコマンドを使ってFuelPHPプロジェクトを作成します。

プロジェクト作成には思ったより時間かかりますので気長に待って下さい。

oil create SampleSite

作成されたFuelPHPプロジェクト内のpublicディレクトリをドキュメントルートにしてアクセスするとちゃんと画面が表示されます。

fuelphp1

3.データベース設定を書き換えます。

ファイルは「fuel/app/config/development/db.php」です。
デフォルトでは以下となっていますが、ご自分の環境に合わせて便宜変更して下さい。

<!--?php /**  * The development database settings. These get merged with the global settings.  */ return array(     'default' =--> array(
        'connection'  => array(
            'dsn'        => 'mysql:host=localhost;dbname=fuel_dev',
            'username'   => 'root',
            'password'   => 'root',
        ),
    ),
);

4.アプリケーション設定ファイルを書き換えます。

ファイルは「fuel/app/config/config.php」です。
always_loadにてauthとormを有効にします。

/**************************************************************************/
/* Always Load                                                            */
/**************************************************************************/
'always_load'  => array(
     'packages'  => array(
        'auth',
        'orm',
     ),
),

whitelisted_classesにてValidationを設定します。

'whitelisted_classes' => array(
    'Fuel\\Core\\Response',
    'Fuel\\Core\\View',
    'Fuel\\Core\\ViewModel',
    'Fuel\Core\Validation',
    'Closure',
),

タイムゾーンを設定します。

'default_timezone' => 'Asia/Tokyo',

5.SimpleAuthライブラリの設定を変更します

ファイルは「fuel/packages/auth/config/simpleauth.php」です。
グループ設定を有効にします。

'groups' => array(
    -1 => array('name' => 'Banned', 'roles' => array('banned')),
    0 => array('name' => 'Guests', 'roles' => array()),
    1 => array('name' => 'Users', 'roles' => array('user')),
    50 => array('name' => 'Moderators', 'roles' => array('user', 'moderator')),
    100  => array('name' => 'Administrators', 'roles' => array('user', 'moderator', 'admin')),
),

6.ユーザモデル、ユーザテーブル、ユーザアカウントを作成します

以下のコマンドでユーザモデルが自動的に作成されます。

oil generate model users username:varchar[50] password:string group:int email:string last_login:int login_hash:string profile_fields:text
	Creating model: /Volumes/DATA/DocumentRoot/SampleSite/fuel/app/classes/model/user.php
	Creating migration: /Volumes/DATA/DocumentRoot/SampleSite/fuel/app/migrations/001_create_users.php

上記で作成された「fuel/app/migrations/001_create_users.php」からユーザテーブルを作成します。

oil refine migrate
Performed migrations for app:default:
001_create_users

次に実際のユーザアカウントを作成します。

oil console
Fuel 1.1-rc1 - PHP 5.3.6 (cli) (Sep  8 2011 19:31:33) [Darwin]
>>> Auth::create_user('admin', 'password', 'demo@example.com', 100);
1

Ctrl+Cでぬけて下さい。

7.管理画面用のビューを作成

管理画面用のビューを作成するのですが、管理画面で操作する用のモデルを1つつくらないといけないのでとりあえずpostsというダミーのモデルを作成します。
この過程で管理画面のビューが作成されます。(存在していれば作成されません)

oil generate admin posts title:string slug:string summary:text body:text user_id:int

8.管理画面にアクセスしてみましょう

/adminにアクセスすると以下のようになります。

Login

ちゃんと認証画面が表示されました。

6で作成したアカウントでログインできます。

この後はCakePHP同様oilコマンドを利用する事でCRUD画面は即座に作成できます。

FuelPHPはCodeIgniterの派生系なので使い勝手良さそうです。

これからちょっとずつさわってみようかと思います。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

WordPressデータのXMLインポート

タグ: , , | 投稿日: 投稿者:

こんにちは、モリです。

暑がりなので夏が近くなるにつれて、嫌になってきます。。。。

早く夏過ぎないかなぁ~~~(笑

WordPressのインポート機能を使用した際の備忘録です。

ちなみにXMLでインポートで移行しても設定変更しないといけない設定があるんですね~

  • 一般設定
  • 投稿設定
  • 表示設定
  • ディスカッション
  • メディア
  • パーマリンク設定
  • プラグインの新規インストール&設定

ブログ1

サーバ移転等の場合、テーマ情報などはFTPでそのままテーマ配下に配置しないといけません。

    • テーマ

/wp-content/themes/テーマ名/

    • 画像

/wp-content/uploads/

でわ!

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

WordPressプラグイン開発のポイント

タグ: , , | 投稿日: 投稿者:

こんにちは。ニタです。

前回、WordPressプラグインのリリース報告後、まともに開発する時間が取れなくて、プラグインの更新が出来ずにおります。
今回は、WordPressプラグインを開発する際の要点、ポイントをまとめてみます。

ディレクトリ、ファイル構成

プラグインは、WordPressのwp-content/plugins/内に格納されます。
プラグインファイルのみを格納するだけでも、WordPressは認識しますが、管理面も考慮して個別のディレクトリに格納しておくのが良いでしょう。
ディレクトリ名は、管理面も考慮して、プラグイン名と同じにするのが一般的です。
他のプラグインと重複しないよう予め調査するか、プレフィックスなどで唯一性を持たせるのもひとつの手です。
もし、開発したプラグインを、一般公開する場合、プラグイン名は特に考慮しておくべきでしょう。

rc_directory

また、プラグインのメインとなるファイル名(そのプラグインのメインとなる処理などが書かれたPHPファイル)は、プラグイン名にするのがWordPress界隈の慣例のようです。
ですが、ファイルの先頭に、プラグインの説明文をコメントアウトで記述していると、WordPressが勝手にメインとなるファイルとして判断するようです。

コメントアウトでプラグインの説明を記述

前述した、プラグインの説明文についてです。WordPressのプラグイン、テーマファイルは、コメントアウトでプラグインやテーマファイルの名称、バージョン、作者名、ライセンスなどを記述する必要があります。

/*
Plugin Name: (プラグインの名前)
Plugin URI: (プラグインの説明と更新を示すページの URI)
Description: (プラグインの短い説明)
Version: (プラグインのバージョン番号。例: 1.0)
Author: (プラグイン作者の名前)
Author URI: (プラグイン作者の URI)
License: (ライセンス名の「スラッグ」 例: GPL2)
*/

特に、プラグインに関しては、このような説明がないと、いくらpluginsディレクトリに格納しても、管理画面のプラグインページで表示されず、プラグインの有効化ができません。
最低でも、プラグイン名「Plugin Name」の項目だけは記述する必要があります。

フックについて。アクションとフィルタ

プラグインを開発すると言いましても、ざっくり言いますと「WordPressのコアファイル群で走っている処理の間に、自作の処理を挟ませて、処理結果を変える。その処理を作る」のが、WordPressプラグインの主な仕事です。
その自作の処理を挟ませることを、WordPressではフック(hook)と呼びます。

フックは、アクションとフィルタに分けられます。

アクションは、投稿を追加した時、テーマを切り替えた時などに走ります。

add_action('publish_post','hoge');

上記の場合、publish_postというアクションをフックに、hogeというfunctionを実行させています。
publish_postアクションは、投稿が公開された時のアクションですので、投稿が公開されたタイミングで、管理者にメールを送信する、ということも可能です。

フィルタは、WordPressのデータベースからデータをブラウザへ表示させる際、ブラウザからのデータをデータベースへ追加するタイミングなどに通る関数を指します。
僕が開発したプラグイン「Rucy」では、以下の様な使い方をしています。

add_filter('post_updated_messages','addRcMessage');

コアファイル群がpost_updated_messagesという、投稿内容を追加・更新した際に編集画面にメッセージを表示する関数に、addRcMessageという自作の関数を通しています。
addRcMessageでは、予約更新日時に関するメッセージを追加させています。
その結果、編集画面では、以下の様なメッセージが表示されるようになります。

rc_addmessage

アクションとフィルタの一覧はWordPress公式のWikiに掲載されていますので、参考にしてみてください。

アクションフック一覧
フィルターフック一覧

プラグインのインストール、アンインストール時のフック

プラグインを、管理画面で有効にした際、プラグイン独自の設定項目などをデータベースに登録したい場合があると思います。
その場合、以下のコードによってプラグインを有効にした際に、関数fugaが実行されます。

// fugaという独自関数を有効化時にフックさせる。
register_activation_hook( __FILE__, 'fuga' );

同様に、アンインストール、無効にした場合に実行させたい処理は以下のようにフックします。

// goodbyeRucyという独自関数をアンインストール時にフックさせる。
register_uninstall_hook(__FILE__, 'goodbyeRucy');

「Rucy」によってデータベースに追加された、予約更新内容や、設定内容を削除しています。
飛ぶ鳥跡を濁さずと言いますか、データベースなどに残したデータによって、アンインストール後のシステムに影響を与えないようにしています。

ざっと書きましたので、まとめますと、

  • プラグインはディレクトリ名、ファイル名は合わせる。
  • プラグイン名は唯一性を持たせる。
  • ファイルの先頭に、プラグインの説明文をコメントアウトで記述する。
  • プラグイン開発の基本はアクションとフィルターのフックを活用する。

こんな感じでしょうか。

このエントリーが、皆様のプラグイン開発の一助になれれば幸いです。
Enjoy, WordPressLife!

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

ffmpegの音声フォーマットがFLTPですって!?

タグ: | 投稿日: 投稿者:

私が自分のアプリケーションに利用していたffmpegのライブラリなんですが、そろそろ最新のffmpegに入れ替えようとしました。
すると、今まで符号付き16ビットとして利用出来ていた動画の音声パケットフォーマット(s16xx)が、FLTP(?)とかになっていました

このタイプをチェックしていたためアプリはパケットを処理せず終了していました。

そこで、

「そんなチェックハズしゃええやん」

とチェックを単に外すと音パケットが全然足りなくなりました。google先生に尋ねるとフォーラムとかで私と同じ境遇の人々がいて質問していました。
その回答で英語で

You need to remember that AV_SAMPLE_FMT_FLTP is a planar mode. If your code is expecting an AV_SAMPLE_FMT_S16 (interleaved mode) output, you need to reorder the samples after converting. Considering 2 audio channels and using interleaved mode, the samples are ordered as “c0, c1, c0, c1, c0, c1, …”. Planar mode is “c0, c0, c0, …, c1, c1, c1, …”.

プラナーって映像とプラナーしてるわけ?
だとしたらどうしたら良い?
と思っていたら。どうやらこれは(例えばステレオなら)
ch0(R)0,1,2,3,4,5,6,7,8…….
ch1(L)0,1,2,3,4,5,6,7,8…….
と音声チェネルがプラナーしてるってことが分かった。そしてさらに、
音声の値もフローティングポイント、すなわちfloat型で値の範囲が-1.0~1.0であることが分かった

フロートの値は符号付き16ビットに変換するのでそれぞれ32768を乗算してやれば、
-32768~32768
になる。そして、
右の1個めを最初に、左の1個めを次に、右の2個めをその次、左の2個めをその次・・・・・・・
とやって元の16bitのフォーマットが取り返せる

で、そのプラナーな要素は以下に格納されている
デコード結果(AVFrame)のextended_data[n] //チャネルnの音声パケット
ということで以下にコード例(ここではステレオ限定で)

//デコードが終わってから
avcodec_decode_audio4(audioCodecCtx, decodedAudio, &decodedSize, &packet);
if(audioCodecCtx->sample_fmt == AV_SAMPLE_FMT_FLTP){
        short *audioPkt   = NULL;					// パケット格納域
        size_t packetSize = 0;						// パケットバイト長
        int    sampleCnt  = audioCodecCtx->decodedAudio->nb_samples;	// サンプル数
        float *channel0   = (float*)decodedAudio->extended_data[0]; // 元の型はuint8_tな
        float *channel1   = (float*)decodedAudio->extended_data[1];
        packetSize        = sampleCnt * 2 * sizeof(short);    // バイトサイズ(ステレオ2ch*sizeof(short)*サンプル数)
        if(packetSize){
            audioPkt = (short *)av_mallocz(packetSize);       // ffmpegなんで・・・
            for(int i=0;i < sampleCnt;i++){       // サンプル数分
                audioPkt[i*2]   = (short)(channel0[i] * 32767.0f);
                audioPkt[i*2+1] = (short)(channel1[i] * 32767.0f);
            }
        }
        // この'audioPkt'が今までの16ビットデータなので。これを使う
} else {
..................
}

※エラーチェックとか、領域の開放とかが抜けてますからね。このままコピペはダメですよ

これ、最初
audioPkt[i*2] = (short)(channel0[i] * 32767.0f);
のところを
audioPkt[i*2] = (short)channel0[i] * 32767.0f;
としてたら全然音が出なかった。
良い子の皆さんなら何故だかわかるよね(私は馬鹿でした)

なぜffmpegがこの様に変更したかとかは知りませんが、以下参考までに
ffmpegを新しくするのに私が遭遇したのは、その他では
・フレームのアロケーションで
avcodec_alloc_frame()を使わないでav_frame_alloc()を使う
・フレームの初期値設定
avcodec_get_frame_defaults()を使わないでav_frame_unref()を使う
・AVCODEC_MAX_AUDIO_FRAME_SIZEの定義が無くなった
→1秒分を想定した長さを入れとけってことで別名で(ここでは)192000を定義しました
以上で動くには動きました。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

vimで分割表示

タグ: | 投稿日: 投稿者:

こんにちは。kikuです。

vimは使っていますか?サーバーにssh接続しての操作等でよく使いますよね。

最近のディスプレイは大きいですが、vimを使ってる際に画面を持て余していませんか?
そんな持て余している人は分割表示しちゃいましょう!

まずは左右分割。:vs (:vsplitの略)。
スクリーンショット 2014-06-03 19.45.20

そして上下分割。:sp (:splitの略)。
スクリーンショット 2014-06-03 19.46.11

カーソルを別の分割先に移動させるには、 <c-w>w (コントロール押しながらw → w)。
基本的にはこれだけ覚えておけばOKです。
最近の画面はワイドが基本なのでもっぱら左右分割(:vs)がメインとなるでしょう。
:vs [filename] と開きたいファイルを指定することで、分割しながらファイルを開けます。

分割に分割を重ねるとこんな事も可能です!
スクリーンショット 2014-06-03 20.15.41

ではvim分割ライフをお楽しみ下さいませ。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

UISwitchのOn/Offにオリジナル画像の設定ってできないのね

タグ: | 投稿日: 投稿者:

こんにちは。

最近またiOSアプリにどっぷりつかり始めて「おっ、やっぱりiOSアプリ楽しいじゃん」って思ってる脂がのって水がはじいちゃうベッチです。

iOS7からUISwitchの見た目が変わりましたね。これ結構好きです。

uiswitch

このUISwitch、アトリビュートインスペクタで確認すると「On Image」「Off Image」っていう項目があるので画像設定できるのか!って思ってワクテカで設定してみました。

・・・・・

・・・・・

実行しても変化なしです。アトリビュートインスペクタで設定した画像が表示されません。

とりあえずUISwitchの公式リファレンス確認しました。

「iOS7では効果がない」って書かれていました。

そんな事あんの?!って思っちゃいましたよ。

プロジェクトのDeployment TargetがiOS7.1になってんだからアトリビュートインスペクタの「On Image」「Off Image」は消しといてよって感じです。

という事でiOSのバージョンがあがって使えなくなったプロパティでも設定だけはできるっていうケースがあるので今後気をつけたいと思います。

え?何が悪いの?でも設定できるんだからどうにかすれば表示できるよね?っていろいろやってみて時間を浪費しないようにしましょう。

時は金なりです。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

background-sizeが効かない

タグ: | 投稿日: 投稿者:

こんにちはモリです。

今回は最近ハマったスタイルについて書いていこうと思います。

背景画像のサイズを変更した時にbackground-sizeを適用したかったのですが

デベロッパー・ツールで確認すると適用されていない。。。

CSSにはスタイルが適用される以下のような優先順位ですが、

1.important
2.インライン(style指定)
3.idセレクタ
4.その他セレクタ
5.ユニバーサルセレクタ(*{})

適用される条件は以下。

・backgroundプロパティの後に記述する事。
・IEはバージョンをIE9以上にすること。

backgroundプロパティの前に記述すると[background-size:auto auto;]で上書きされてしまうらしい。。。

CSS3のブラウザ対応は以下のサイトで確認できます。
HTML5 & CSS3 Support

スタイルはハマるな~。。。でわでわ

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

[WordPress]公開済みの記事を時限更新するプラグインを公開しました

タグ: , | 投稿日: 投稿者:

こんにちは、ニタです。
CMS、ブログのプラットフォームとしてWordPressは取っ付き易く、WordPressで管理している企業サイトも多いと思います。
「WordPress カスタマイズ」などで検索すると、結構な数の紹介記事などがヒットしますし。

そんなWordPressで、新規作成した投稿には日時指定での公開設定が可能ですが、公開済みの投稿への日時指定更新は、標準機能として備わっていません。
商品ページの価格や、キャンペーンページの時間指定更新がある場合、時間に合わせて更新する必要があります。
これが深夜0時更新だったり、複数ページの更新だとしたら…。ちょっと面倒ですよね。

そんな公開済みの投稿に対して、自動更新してくれるWordPressのプラグインが、既にあるのかと思ったのですが、なかなか見つからなかったので、自分で作ってみました。
WordPressの公式サイトからダウンロード、インストールできます。

img_plugin_rucy
WordPress › Rucy « WordPress Plugins

概要

「Rucy」というプラグインです。当初は「Reservation Update Content」という名前だったのですが、安直だし長いなと思い、頭文字から「Rucy」としました。
「るーしー」と読みます。

管理画面の投稿、固定ページ編集画面で予約更新分の記事内容、更新日時を登録できるようになります。
予約更新すると、指定された日時に記事内容が更新されます。…そのままですね。

利用環境

    • WordPress3.5以上
    • wp_cron()が実行できること(新規投稿で予約公開が正常動作できること)

インストール方法

方法は2つあります。
1. 直接ダウンロード

      • プラグインをこちらのダウンロードボタンからダウンロード
      • ダウンロードしたzipファイルを解凍し作成されたディレクトリを、お使いのWordPressのwp-content/pluginsディレクトリにコピー
      • WordPress管理画面「プラグイン」で「Rucy」を有効化

2. 管理画面から

      • WordPress管理画面「プラグイン」 > 「新規追加」に移動
      • 検索のテキストフォームから「Rucy」で検索
      • Rucyが表示されるので、インストール
      • インストールが成功したら、有効化

使用方法

有効化すると、編集画面に以下のような項目が追加されます。

rucy_sc003

「予約更新を行う」のチェックボックスをチェックすると、チェックボックス横の日時に、更新されます。
更新日時は、更新日時横の「編集」リンクから編集できます。
更新する記事内容は、WordPress標準のテキストエリアで編集できます。
更新日時、予約更新記事内容を編集し、「予約更新を行う」のチェックボックスをチェックして、公開項目の「更新」ボタンから記事を更新すると、指定日時に更新されるようになります。

設定

Rucyには、予約更新を実行する投稿タイプを設定できる設定画面があります。
有効化すると、管理画面の「設定」に Rucyというサブメニューが追加されます。
ここで投稿タイプ別に予約更新項目の追加設定ができます。

rucy_sc001

WordPress標準の、投稿、固定ページのほか、カスタマイズして追加したカスタム投稿タイプも、追加できます。

随時更新していきます

この記事を書いている今日現在(2014/05/06)、Rucyのバージョンは0.1.2です。
今後、アイキャッチ画像を更新可能にしたり、更新日時のUIの変更などの更新を予定しています。
また、Githubでもソースを公開しています。
ご意見、不具合などありましたら、ご連絡ください。可能な限り対応していきたいと思います。

※さくらクラウドにて期待通りの動作をしないという報告をいただいています。
同環境での動作検証ができておりませんが、同環境でご使用予定の方は、予めご考慮いただきインストールしてください。
(2014/09/11追記)

※バージョン0.4.0にアップデートし、ロールバック機能を追加しました。
指定日時に予約更新前の投稿内容に再更新(ロールバック)します。
(2015/10/22追記)

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

tesseract-ocrをためしましたが何か?

タグ: | 投稿日: 投稿者:

tesseract-ocrという画像から文字を認識する処理を試しました
かなりお手軽に実験できます

・ソースコードを取ってくる
# wget http://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.02.tar.gz
・日本語の翻訳ファイルと英語のファイル(これがないと怒られる)
# wget http://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.jpn.tar.gz
# wget http://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.eng.tar.gz

・解凍
tar -zxvf tesseract-ocr-3.02.02.tar.gz
tar -zxvf tesseract-ocr-3.02.jpn.tar.gz
tar -zxvf tesseract-ocr-3.02.eng.tar.gz

・ビルド(INSTALLを読んでの手順)
#./autogen.sh
・おっと、私の環境では(ubuntu 13.10)
libtool とかleptonicaが無いと怒られましたので

# apt-get install libtool libleptonica-dev
・再度ビルド
# ./autogen
# ./configure
# make
# make check
・上手くいったっぽいので
# make install
・で早速sampleを(eurotext.tif)をキャプチャしようとすると
# tesseract ./eurotext.tif testDoc
Error opening data file /usr/local/share/tessdata/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your “tessdata” directory.
Failed loading language ‘eng’
Tesseract couldn’t load any languages!
Could not initialize tesseract.

・で、/usr/local/share/tessdata/ に英語と日本語の翻訳ファイルを置きます
# sudo cp -i tesseract-ocr/tessdata/jpn.traineddata /usr/local/share/tessdata/.
# sudo cp -i tesseract-ocr/tessdata/eng.traineddata /usr/local/share/tessdata/.

・実行してみました
# tesseract ./eurotext.tif testDoc

こいつが
eurotext
こんな風に
testDoc

ただブラウザでみると壊れてるっぽくみえますが、これヨーロッパ系文字なのね
結構変換してます。

で。今度は日本語じゃん!
こんなのを
mokkai

# tesseract mokkai.tiff testText -l jpn

こうなった
testText
ダメダメじゃん

と思ったら学習ってあるのね。今度しっかり勉強させた奴を紹介しますね。

* 画像は本当はtifを使ったのですが、なんか表示されないのでjpegに変換してます
** tesseract-ocrはgoogle先生が開発してるんですって

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook