NJS Developers

日本情報システム株式会社の開発ブログ

手書きの内容をデータ化する「Tegaki」をPHPで実装

みなさんはじめまして。日本情報システム株式会社 ICTソリューション部の真野です。
北風吹きすさぶこの季節、皆様いかがお過ごしでしょうか。
私事ですが、先日嬉しい事に若い女の人から声をかけられました。

・・・宗教の勧誘でした。

とりあえず煩悩を取り払う為に除夜の鐘を打ちにいこうと思います。
さて今回のお題ですが、最近私が従事しているTegakiについてご紹介いたします。

手書きの内容をデータ化する「Tegaki」をPHPで実装

Tegakiとは

キヤノンマーケティングジャパンとAI関連サービスを手掛けるCogent Labsが協業して開発した、「手書き AI OCRソリューション」です。

Tegakiが何をしてくれるのか

もう少し簡単にTegakiを説明すると、「画像データ内の文字をテキストデータとして返却してくれるサービス」になります。
例えばTegakiが力を発揮してくれそうなケースとして次のようなものがあります。

  • 手書きのアンケート用紙をまとめてデータ化したい
  • 手書きの申込用紙をまとめてデータ化したい

こういった定型フォーマットの手書き書類、それはもうTegakiの絶好の捕食対象であり、なされるがままにデータ化されていきます。
そしてこのTegaki、なんと学習するんです。怖いですね。
取り込む度にどんどん経験を積んで行きますので、その潜在能力たるや底知れぬものを感じます。
OCR(読み取りサービス)市場ではメーカーがさぞ戦々恐々としている事でしょう。
認識率99.22%達成という高い研究結果を持つTegakiですが、AI搭載ということで、ここからさらに成長していくとなれば、まさに鬼に金棒、虎に翼、竜に翼を得たる如しですね。
※ちなみに有料です。

Tegakiを使ってみる

それでは実際にどうやって使うかという所ですが、画像データを決まった形にして渡してあげないとTegakiは受け取ってくれません。
ぶっきらぼうに現物だけ渡すような事はせず、ちゃんと綺麗に包装し、体裁よくTegakiに渡す。まさに我々紳士が女性にプレゼントするときと同じことを行います。簡単ですね。
後述するPHPコードがその役割を担います。
PHPコード以外に用意するものとして次のものが挙げられます。

  • 画像データ・・読取対象のデータです。
  • APIキー・・・Tegakiを契約すると貰えます。
  • テンプレートファイル・・・Tegakiの専用エディターから作成します。

APIキーを渡す事によって、ちゃんとお金を払って利用している人なのかを判別します。
お金を払っていない人はお断りされます。
テンプレートファイルは、画像データ内の文字位置の情報が入っています。

処理の流れ

処理の流れ

サンプルコード

ここからはプログラマー向けになります。 範例としてPythonBashでの実装方法は載っていたのですが、PHPで実装したかったのでサンプルを作成しました。 何かしらのお役に立つことができれば幸いです。

上図の①と②で示した部分のコードです。 JSON形式で画像を送信し、最終的に認識された文字がJSON形式で返ってきます。

①の処理

まず①のPOST処理です。
画像ファイルをTegakiに送信し、Tegakiから返却されるリクエストIDを取得する処理になります。


    tegakiPost												
{												
												
	//--------------------------------------------------											
	// POST処理											
	// $fileName・・・・・読取対象の画像ファイルのパス											
	// $templateName・・・テンプレートファイルのパス											
	// $apiKey・・・・・・APIキー											
	//--------------------------------------------------											
	public function post($fileName, $templateName, $apiKey)											
	{											
		//Tegaki.aiが待ち構えている場所です										
		$url = 'https://api.tegaki.ai/hwr/v1/form';										
		$key = $apiKey;										
												
		//jsonテンプレートファイルを読み込み										
		$jsonData = file_get_contents('./template/' . $templateName);										
												
												
		//文字コードをUTF8にエンコード										
		$jsonData = mb_convert_encoding($jsonData, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');										
		//連想配列にする										
		$arr = json_decode($jsonData,true);										
												
		//画像データをbase64エンコード										
		$data64 = base64_encode(file_get_contents($fileName));										
												
		//配列にイメージ項目を追加し、画像データを入れる										
		$arr['imageData'] = json_encode(mb_convert_encoding($data64, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'));										
		$arr = json_encode($arr);										
												
		//ヘッダー情報を設定										
		$headers = array(										
	    	'Authorization: apikey '.$key,		// APIキーを使った認証								
	    	'Content-Type: application/json', 	// json形式のデータをpostするので必要									
	    	'Accept: application/json',			// 利用可能なアプリケーションタイプ							
		);										
												
		//コンテキストのオプションを生成										
		$options = array(										
		  'http' => array(										
		    'method'  => 'POST',					// POSTで送信					
		    'header'=>  implode(PHP_EOL, $headers),	// ヘッダー情報を連結									
		    'content' => $arr,						// テンプレートデータ・画像データ				
		    )										
		);										
												
		$context  = stream_context_create( $options );			// コンテキストの生成							
		$result = file_get_contents( $url, false, $context );	// コンテキストを指定してTegaki.aiのURLへ送信									
												
		//成功した時										
		if ($result != false)										
		{										
			//連想配列にする									
			$result = json_decode($result,true);									
			//fields項目を追加(画像の位置等がふくまれる)									
			$arr = json_decode($arr, true);									
			$result['fields'] = $arr['fields'];									
			//JSON形式に戻す									
			$result = json_encode($result);									
			//文字コードをUTF8にエンコード									
			$result = mb_convert_encoding($result, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');									
		}										
		return $result;										
	}											
}												

②の処理

次に②のGET処理です。
①のPOST処理で取得したリクエストIDを使用し、認識した文字がJSON形式で返却されます。


class tegakiGet												
{												
	//--------------------------------------------------											
	// GET処理											
	// $requestID・・・リクエストID											
	// $apiKey ・・・・APIキー											
	//--------------------------------------------------											
	public function get($requestID, $apiKey)											
	{											
		//Tegaki.aiが待ち構えている場所です。アドレスの最後にリクエストIDを加えます。										
		$url = 'https://api.tegaki.ai/hwr/v1/form/' . $requestID;										
		$key = $apiKey;										
												
		//ヘッダー情報を設定										
		$headers = array(										
	   	'Authorization: apikey '.$key,								// APIキーを使った認証		
	    	'Content-Type: application/x-www-form-urlencoded' 		// URLエンコード(既定値)								
		);										
												
												
		$options = array(										
		  'http' => array(										
		    'method'  => 'GET',										// GET送信
		    'header'=>  implode(PHP_EOL, $headers),					// ヘッダー情報を連結					
		    )										
		);										
		 										
		$context  = stream_context_create( $options );				// コンテキストの生成						
		$result = file_get_contents( $url, false, $context );		// コンテキストを指定してTegaki.aiのURLへ送信								
		return $result;										
										
	}											
}

Tegakiの認識結果

Tegakiが返却する認識文字はJSON形式になっています。
JSON形式とはどんなものかと申しますと、 キーがあり、そのキーに対する値が存在するといった形です。

例えば 「魚」といったキーがあり、それに対する値が サバ、イワシ、カツオ、マダイ、カンパチ、ヒラメ、アナゴ、ブリ、マグロ・・・ といった具合です。 古今東西ゲームみたいなものですね。

これらが記号を含んで一文で連なっているわけですから、 そのままだと非常に見にくいです。 目当ての情報を探すのにウォーリーを探せ状態になってしまいますので、 ここは整えて見やすくします。

以下は見やすいように一部分を切り取ったサンプルデータになります。

処理結果

このサンプルの結果は 1段目が認識対象の画像です。(指定した範囲を切り取っています)
2段目以降がTegakiから返ってきた回答になります。
「10といったテキストデータで認識しました。」 「96.2%ぐらい自信があります。」 とTegakiがおっしゃっています。 100%にしない謙虚さ、何だか日本人として親近感を覚えます。

こういった数値の精度は非常に高いです(私調べによる)。 一方漢字やひらがな、カタカナが含まれているものについてはまちまちですね。 クセの強い字は特に精度が低いです。

昔小売業でアルバイトしている時、お客様に会員情報を手書きして貰う事がありましたが たまに達筆すぎて読めないんですよ。 なのでTegakiがとんちんかんな回答を出しても同情してしまう所もありますが。
やはり世界の難しい言語ランキングにランクインしている日本語は 一筋縄ではいかないです。

まとめ

いかがでしたか。 今回はTegakiについてご紹介しました。
結局のところ使えるのか。というところですが、Tegakiを使用する事により、画像ファイルを一括で文字化してくれるので、人的な入力作業を大幅に減らし、確認作業に時間を割くことができるので、データ入力業務においてかなりの効率化が図れるはずです。
今後のTegaki自身の学習で精度が上がる事を考えると、非常に楽しみなサービスになりそうです。

Yubi Plus追加機能

みなさん、こんにちは。日本情報システムの進藤です。
今回は、Yubi Plusの二要素認証オプションとしていくつか機能を作りましたので、ご紹介したいと思います。

1.リモート機能

自宅または外出先からインターネットを経由して、対象となるパソコンを遠隔操作をする機能です。
画面転送のみ行われる為、情報漏えいなどの心配はありません。
この機能を利用するには、必ず利用者本人のYubiKeyが必要になります。

※上記は、学校利用時のイメージ図になります。

画像

※上記は、学校利用時のイメージ図になります。

利用するにはいくつかの条件が必要ですが、「アプリ起動」→「YubiKeyタッチ」→「リモート開始」のように、利用者の負担をギリギリまで減らしております。
シングルサインオンのようにビューンと行きたい気持ちもあるかもしれませんが、やはりワンクッションあることでセキュリティの高さは全然違いますので、そのワンクッションをYubiKeyタッチだけでいいから!という仕様としております
この機能は、弊社の営業も利用中です!

2.連携先システムの改修不要!二要素認証アプリ

二要素認証を導入したいが、既に稼動しているシステムのプログラムを改修したくない!と言った要件から作ったアプリです。

画像

※上記は、弊社サービスのグループウェアでの例になります。(WebAPI、DB処理は省略)

簡単に言うと、ログイン画面を差し替えてるだけということです。
上記の例は、3つ目に説明する機能によりクライアントアプリに差し替えていますが、もちろんWebのインタフェースでも可能です。
このアプリは1つだけ懸念点がありログイン時は二要素認証しても、ログアウトで従来のログイン画面に戻ってしまうと従来通りの認証になってしまうので、どうしても運用面でカバーする必要がでてきます。
やはり、確実な二要素認証ログインを運用するには、ある程度のプログラム改修は避けては通れないと思います。
そんなときの為に、簡単に連携できるようにYubiPlusAPI(サンプルコード付)も作ってますので、ちょっとだけ手加えさせてくださいって感じです。

3.ネットワーク切り替え機能

  •     通常時・・・対象システム ⇒ NG / インターネット ⇒ OK
  • システム利用時・・・対象システム ⇒ OK / インターネット ⇒ NG
画像

近年の教育現場での話になりますが、セキュリティを高める動きが少しずつですが出てきました。
文部科学省の公式ページでも「教育情報セキュリティのための緊急提言」がとりまとめられたことをお知らせしております。その提言の中に以下のような内容があります。
以下、抜粋

1.情報セキュリティを確保するため、校務系システムと学習系システムは論理的又は物理的に分離し、児童生徒側から校務用データが見えないようにすることを徹底すること。

簡単に言うと、生徒の成績表を管理するようなシステムは外部のネットワークに触れないようにしましょう。ということです。
まぁ、個人情報を扱うので当然ですね。
しかし、セキュリティを徹底しようとすると、運用面、コスト面でとても大変なことになります。
そこで、Yubi Plusのコンセプトである「まずはここから」を元に、個人情報を扱うような(校務系)システムを使っている時だけは、インターネットは我慢しましょう。それ以外は大丈夫ですから。
という感じで考えた結果、こういう仕様になりました。

まとめ

いかがでしたか。
まだまだYubi Plusでやれることはあると思うので、今後も機能追加にご期待ください。
また、こんな機能は作らないの?など、気になることがあったらお気軽にお問い合わせください。

地方自治情報化推進フェア2016にて出展・講演いたします

地方知事情報化推進フェア

地方自治情報化推進フェア2016

みなさんこんにちは。日本情報システムの大阿久です。
来る11月8日(火)・9日(水)東京ビックサイトにて地方自治情報化推進フェア2016が開催されます。
弊社も出展・講演いたしますので、本日は内容についてご案内をさせていただきます。

【日本情報システムHP】
2016年11月8日(火)・9日(水)地方自治情報化推進フェア2016にて出展・講演いたします

開催概要

出展概要

使い慣れたシステムを入れ替えせずに、情報の連携を実現する『福祉コミュニケーションサーバ(福祉CS)』を中心に、多要素認証ソリューション『Yubi Plus』、暗号化オンラインストレージ・サービス『NJS eStorage』をご紹介致します。現地では実機を用いたデモンストレーションもご覧になれます。

■出展ご紹介ページ・チラシ
https://www.j-lis.go.jp/spd/fair/event/fair2016/tenji02.html#46
地方自治情報化推進フェア2016のご案内・会場マップ (PDF:878.26KB)

出展製品

特別講演

当社ベンダプレゼンテーションブースにて、狭山市総合政策部次長 兼 行政推進課長 宮崎昌美様による特別講演を行って頂きます。

講演概要

  • 日時:11月8日(火)10:30~11:15 D会場
  • タイトル:総合窓口・災害時の支援...福祉情報のポテンシャルを引き出そう
    ~シンプルな情報連携が拓く新たな住民サービス~
  • 内容:福祉情報を連結すれば、「人をキーにした横断的支援」、「ライフイベントに応じたワンストップ&プッシュ型の窓口案内」、「部局間での情報共有」などが可能に。さらに「災害時に援護が必要な市民」を事前に把握することや「被災者支援システム」との連携も。システムを入れ替えずに実現した狭山市の事例をご紹介します。
  • 講演ご紹介ページ:https://www.j-lis.go.jp/spd/fair/event/fair2016/benpure02.html#D1

まとめ

本ブログでご紹介しているYubi Plusも出展します。
皆さまのご来場を心よりお待ち申し上げております。

Yubi Plus × Active Directory

Yubi PlusがActive Directory(以下、AD)と連携しました

挨拶

 みなさんこんにちは。ここのところブログの更新をしないがため、各方面からクレームを受けている日本情報システムの進藤です。

こわいメール はてなさんからもちょこちょこ「1年前のブログをふりかえりませんか」というメールが届きます。
はい、ごめんなさい。更新します。

Yubi PlusがActive Directory(以下、AD)と連携しました。

Yubi PlusがActive Directory(以下、AD)と連携しました。

Active Directory (アクティブディレクト) とはマイクロソフトによって開発されたディレクトリ・サービス・システムであり、Windows 2000 Serverから導入された、ユーザとコンピュータリソースを管理するコンポーネント群の総称である。
引用:Active Directory - Wikipedia
https://ja.wikipedia.org/wiki/Active_Directory

簡単に言うとパソコンを使う人を管理するシステムですね。
その他にもメリットがたくさんありますが、ここでは省略します。(スミマセン)
ADと連携することで何が便利になったかというと、今までは、使うパソコン全台にそれぞれYubiKeyを登録していましたが、サーバー側でユーザーとYubiKeyの管理を行うため、その作業がいらなくなりました。

1台ずつセットアップ
1台ずつYubiKeyを登録するのは結構大変です。

楽ちんセットアップ


サーバで集中管理すればらくらく。

ちょっと専門的な話ではありますが、AD連携といいつつ、実は別建てした認証サーバーがADと同期をとる仕様にした為、既存のADを直接いじることはなく導入することができます。
導入作業自体なるべく手間をかけないよう設計した為、既設の環境への影響を気にする管理者にとっては都合のいい作りとなっております。

はいおわり


AD連携ならさくっと終わります。

お知らせ

2016年11月8日(火)、9日(水)に東京ビックサイトで開催される『地方自治情報化推進フェア2016』にYubi Plusを出展することになりました。前回のInteropに続き、Yubi Plusを多くの方に紹介できるチャンスだと思っております。
お時間がある方は是非、足を運んでみてください。

まとめ

いかがでしたか。
今後もYubi Plusの機能にご期待ください。

Yubi Plusに自動暗号化機能が追加されました

 みなさんこんにちは。日本情報システム株式会社 ICTソリューション部の進藤です。

自動暗号化機能

Yubi Plusに新たに自動暗号化機能が追加されました。
この機能を利用するかしないかはユーザーが任意で選べます。
ユーザーがパソコンにログオンしているときは平文状態で、ログオフしているときは暗号化状態といった至ってシンプルな作りになっています。
ログオフ処理で特定のフォルダを暗号化し、ログオン後のスタートアップ処理にて自動複合を行います。

ハードディスクを抜き取って、中身を見ようとするが見れなくて困っている悪い人の絵
ハードディスクを盗まれても、暗号化されているので盗み見ることは出来ません!

今までのYubi Plusによくある質問で、
Windowsログオンをセキュアにしたところで、ハードディスク抜き取られたらどうするの?」
という質問をよくされました。 今までは、
「落とさないでください」
「そういう状況にならないでください」
といった、質問をされているのに注意をするといったありえない回答をしておりましたが、暗号化機能を追加したことで、
「Yubi PlusでWindowsにログオンしないと複合されない為、ハードディスクを抜き取っても覗き見ることはできません。」
と言い切れるようになりました。
Windowsログオンのセキュリティといっても、やはり最低限の暗号化機能はあったほうがいいですね。

お知らせ

2016年6月8日(水)~10日(金)に幕張メッセで開催される『Interop Tokyo 2016』にYubi Plusが出展することになりました。
3日間で来場予定数が14万人といった大きな展示会なので、Yubi Plusの魅力を多くの人に伝えるべく頑張ります。
お時間がある方は是非、足を運んでみてください。

まとめ

いかがでしたか。
今後もYubi Plusの機能にご期待ください。

特権IDとログの大切さについて考える

 みなさんこんにちは。日本情報システム株式会社 ICTソリューション部の大阿久です。
「最近、特権IDの管理が厳しくなった」という声を多く耳にするようになりました。日常的に特権IDを使っているIT技術者も少なくないでしょう。内部関係者しか利用しないはずの特権IDが注目されるのは、最近の情報漏えい事件が関係しているからだと考えられます。せっかく築いた信用を一撃で失うことを考えれば当然の流れです。そして特権IDの管理とワンセットで検討されるのが操作記録(=ログ)です。
システムに大きな変更を与えることができる「特権ID」とログの重要性について改めて考えてみます。

特権IDとは

特権IDは、システムの起動や停止、設定変更など、管理者がシステムを運用する際に使用する。さらにユーザーの新規作成や更新、削除などアカウント管理のほか、システム設定の変更、サーバーの起動や停止、アプリケーションのインストール、内部データの閲覧や操作など、システム上でのあらゆる作業が可能な高い権限が与えられている。
出典:http://canon-its.jp/eset/malware_info/term/ta/008.html

変わり始めたセキュリティ対策

 考えるにあたり、例として新たな通販サイトを立ち上げるとしましょう。配送先情報には少なくとも住所、氏名、電話番号が必要であり、購買履歴からは顧客の趣味趣向を得ることができます。盗み取る価値のある個人情報が保管されることになります。この情報を守るため様々な対策を施し、情報漏えいの脅威に対抗しなければなりません。まずは外部(インターネット)側からの攻撃に備え、舌を噛みそうな数々の対策を一通り実施することでしょう。これまでも外部からの侵入対策は必須と認知されてきました。
続いて内部側からの脅威に備えます。映画の世界なら建物に潜入して情報を盗み取る、ミッションインポッシブルなスパイ対策でしょうか。現実には従業員、内部関係者が犯人になると仮定しますから「ウチは大丈夫!」として先送りにされてきた対策です。
そんな「性善説」ありきのセキュリティが昨今の事故で見直されてきました。今や誰もがスパイや窃盗犯になると想定しなければなりません。今回のテーマは内部側の脅威について深掘りしていくことになります。

変わり始めたセキュリティ対策

どこに脅威が潜んでいるのか

 内部側の脅威について具体的に考えてみましょう。先ほどの通販サイト開発なら、商品の紹介画面を作り、決済の内部処理を作って、購買情報のデータベースを管理するなど、多くの工程が必要です。運用においても安定稼働のためには複数の技術者が必要です。この例に限らず、多くのシステムで専門職や外部委託など、複数の人が関わっていることでしょう。
「特権ID」の課題はIDを複数人で共有することにあります。過去の情報漏えい事件からも、このような共有IDの運用が危険であることは明らかです。すでに一人ひとりにIDを付与する運用が浸透していますが、特権IDには共有もやむを得ないといった風潮が残っています。この運用では誰が特権IDを使用したかを把握できず、事故発生時に原因の特定が難しくなります。なんらかの方法で特権IDを使用した人を特定できる仕組みを検討しなければなりません。
もうひとつの問題は「特権が及ぶ範囲」です。データベースの管理者は顧客情報を閲覧して良いかという問いです。データベースシステムの特権IDなら、格納されているすべての情報にアクセスできます。この場合、顧客情報部分を暗号化し、特権が及ぶ範囲を限定するといった対策が考えられます。システム管理者と顧客情報の特権を分ければ、顧客情報が不正にエクスポートされる行為に対抗できます。

どこに脅威が潜んでいるのか

本来の目的を考える

 特権IDを管理する目的は、情報漏えい対策にあります。情報が漏れる状況を総合的に検討しておきたいところです。外部側からの攻撃は、インターネット越しに得られる情報しか利用できません。これに対して従業員、内部関係者は内情を熟知しているわけですから、抜け穴を見つけやすい立場です。「スマートフォンを接続して個人情報を持ち出した」という事例は、USBストレージへの対策を行っていたにかかわらず発生しました。スマートフォンを充電したときに抜け穴に気づいたと言われています。抜け穴対策が不足していたのでしょうか?売買目的で個人情報を盗みだしたのですから「従業員教育」が不足していたと考えるべきでしょう。
従業員教育においては、組織として安全管理を行っていることを示すことが重要だといわれています。業務ルールを明確にし、誰が何をしたのかという記録(=ログ)を残すこと、これを継続的にチェックできる体制が求められます。特権ID管理とともに、ログを検討しておくべきでしょう。

何を記録するべきか

 システムの利用開始日時、終了日時を記録するのもログです。しかしこれではマルウェア(ユーザーの意思に関係なく不正な動作を行うソフトウェア)に感染していた場合、原因の特定が困難になります。
いつ、どの端末から、どのソフトウェアが、どのような動作をしたのかを強制的に記録できなければ原因の特定ができなくなります。とはいえ細かすぎるログもまた状況を把握に専門知識が必要となってしまいます。「詳細な記録ができる」「自動的に分析して概要を把握できる」この双方の機能を兼ね備えたログツールを検討するべきではないでしょうか。

まとめ

  • 特権IDはITシステムに強力な権限がある
  • 誰が権限を行使したのか記録するのは当然のこと
  • 権限は本来の業務範囲を超えないように限定する
  • 継続的なチェック体制を整える

最後はざっくりとまとめました。できれば記録だけでなく、不正な動作に対してアラートが上がる仕組みも欲しいところです。

 

YubiPlus好調です

新年あけましておめでとうございます。
日本情報システム株式会社 ICTソリューション部の進藤です。
お正月はいかがお過ごしでしたか? 本年も宜しくお願い申し上げます。

画像

このブログを始めた頃から開発を始めたYubi Plusですが、少しずつ売れ始めました。
まだまだYubi Plusの機能拡張などやらなければいけないことが山積みで、心配事が多いですが、 もう売れ始めているので立ち止まることはできないですね・・・。

またちょっとしたお知らせですが、来週にも展示会に出展する予定があります。
技術の人間が、展示会に出展者として立てることはすごくいいチャンスで、販社様の意見やエンドユーザーの声を直接聞けるので、 それを参考にいいものづくりができるではないでしょうか。
こういった機会を少しでも広げていけるようもっと頑張っていこうと思います。

今年の抱負

今年もトレンドなキーワードを誰でもわかるようにご紹介していきます。
また、Yubi Plusでもそうですが、需要に見合った製品、ありそうでなかったもの、痒いところに手が届くもの、 そういった製品の企画、開発を行って行きたいと思っております。

まとめ

いかがでしたか。

ほぼ個人的な心情ばかり綴ってしまい申し訳御座いませんが、
今年も頑張ります!ということでご容赦ください。

PAGE TOP