2016/09/07 (水)

【AI】Kerasで「吾輩は猫である」調の文章を自動生成してみる

こんにちは。やのです。

最近はGoogleのライブラリTensorflowでディープラーニングの検討を行っています。
Tensorflowの上位ラッパーライブラリとしてKerasというものがあり、 そのKerasのサンプルコードが豊富なので1つご紹介します。

Keras Documentation

今回テストしたサンプルは、文章の自動生成を行うものです。
利用したコードはこちらです。

このサンプルは、まずあらかじめ何らかの文章(10万文字~100万文字程度の文章が好ましい)の文字の並びをディープニューラルネットワークで学習しておきます。そして、学習したディープニューラルネットワークに十数文字の文字列を与え、その文字列に続く文字を1文字ずつ逐次的に生成していき、自動で長い文章を生成してみる、というものです。

このサンプルは、もともとはニーチェの文章が付属されており、英語なのですが、今回は日本語の文章を学習させてみました。

日本語を利用する注意点としては2点
(1)日本語のテキストファイルのエンコーディング設定はutf-8としておく
(2)python上で日本語が利用できるように1行目に # -*- coding: utf-8 -*- を追記しておく
以上のようにすると日本語でも問題なく学習できました。

今回は「吾輩は猫である」の全文を学習データとして与え(32万文字程度)、全文を学習後、ディープニューラルネットワークに「吾輩は猫である。名前は」という文字列を与えた後にそれに続く800文字を自動生成してみる、ということを試しました。

それでは、実験結果です。

まず、繰り返し学習1回目のディープニューラルネットワークで文章を自動生成したものです。
 吾輩は猫である。名前はないがであな遝をているにでしていかの刿にしてしたいまないったすいしたいしたも君の逍にするのしてしたかでもって吠ににめたったしていいいすないいいいあいかないっていていていているないえ、こであるないしてあるないいであからこんにに囮鉍でそないにだるないしたないいして蹚ったいまいたあっていかあって形っていたってあって出に君がいしていていていていていかであるないいかを慥ていたこでそうであかかすってかかいはするしど壝の吋札に君していたのそのはそと一人だの事は循って遣たしていかこで徳ったたあかね、吾ななとうったもだいましていたがますいしとはた
まだ学習がすすんでおらず、ランダムな文字の並びという印象を受けます。

次に、繰り返し学習50回目の結果です。学習するのに数時間かかりました。
 吾輩は猫である。名前はこれでは大変形姻の時に妙な人には見ている。この癖にビールを平生の名前である。それだから、そうして来たなと思う。この光当体誔を知らないのから仕方がない。そうしているのではない、悪るいものだが、そうなる。いかに這入ってると云って、この時つではないのである。 「ただてい事は今日はこの後のごとく、そうでございます。この度の方が十入の方ですね」「そうですね。その通りと先へ取りている。その大譂のは本任者はとこの眼もない。その冗談だと云う大従の邒を挨ひ見ているのだから飛んだのだから、実読だのかく大変だ。これも主人は起かい物の上にいいな、あの全
大分日本語のような文字の並びになってきましたが、やはり中身が変です。

最後に、繰り返し学習185回目の結果です。学習するのに丸一日かかりました。
 吾輩は猫である。名前はこれですか。それでは細君である。それでおったので、その寝えばならない。聞いてやめはあると云うのさ。君も、どうしてはないと思って買っていると同じくらしい出来ないもので、そんな事をするやしない。少しはないか」 「バルですよ」と先生とはあまり今していたのである。それである。そんなものでもいい。またはどうだ。そいこの御寄を、主人のようにその希鼩の困りにいるのが、これは黙ましたから、その時じゃさぐ行って見える。この女は返事を取られて、主人をひると、天下の意を調みない。だっては大地能を知れて、その嫌さんの具倅の大具聞があると、僕のところへ引
まだ変ですが、どうでしょう、繰り返し50回よりもなんとなく日本語に近くなっている気がしませんか?文の間の意味的なつながりは自動生成できていませんが、日本語の文章の文字の並びという意味では大分学習できていると思います。さらに、生成される日本語は、吾輩は猫である調の特徴を含んでいるといえます。何かに応用できれば面白いですよね。

続きを読む

2016/07/14 (木)

サーバ室の温度異常を検知して電話をかける

こんにちは。そうまです。

先日、弊社サーバ室のエアコンが故障してしまい、危機一髪で熱暴走を回避した。という事件がありました。
この時、始めの警報メールを朝4時に受信していたのですが、寝ていて全く気づきませんでした。
偶然5時半に起きて気づいたからよかったものの、もし1時くらいに発生して起きるまで数時間気づかなかったらと思うとゾッとします。
電話がかかってくればいいのになーと思って調べたところ、以下の記事を見つけました。


この3つの記事の内容を組み合わせると、図のような流れで実現出来そうです。

プレゼンテーション1 早速やってみました。

メール宛先ドメインのMXレコードをSendGridに向けなければいけなかったので、Route53でドメイン取得しました。AWSなんでも揃ってるなー。
詳しいコードはほぼ参照した記事のままなので、割愛します。

特定のアドレスにメールを送信すると、
メールの画面

電話がかかってきました。
P1210046

これで寝ている間にサーバ室の温度が上がっても安心ですね!
そんなことが起こらないことを祈ります(真剣)

※後日談
IFTTTにPhoneCallチャンネルありますね。。。
まだアメリカの電話番号だけみたいですが、日本の電話番号にも対応したらIFTTTだけでできちゃいそうです。

続きを読む

2016/05/27 (金)

DelphiのFireDACでのSQLiteを高速化

こんにちは。
システムを開発する場合において、高速化は永遠のテーマと私は考えます。
レスポンスは少しでも良い方が気持ち良いです。
今回はそんな高速化の手法をひとつ。

大量のデータを扱うSQLではこのレスポンスが遅くなりがちですよね。
古くから、SQLの高速化については色んな手法、セオリーが存在します。
今回はちょっと違った角度からアプローチです。
しかもDelphiFireDACSQLiteを高速化しようという、かなり限定的な情報です。
しかし!
ニッチな情報だからこそ待ち望んでいる方もいらっしゃると思い紹介させていただきます。

さて本題。
DelphiにはFireDACという強力なデータアクセスコンポーネントがあります。
FireDACを使えばSQLiteも簡単に使えます。
FireDACは高速ですしSQLiteも軽いデータベースで、この組み合わせだけでもかなり高速です。
さらにSQLやテーブル構成も見直した。でももっと高速化したい。
そんな時には最新のSQLiteライブラリを動的リンクしてあげると、高速化がのぞめます。

FireDACに静的リンクされているネイティブのSQLiteは
 ・Delphi XE5 バージョン3.7.17
 ・Delphi XE10 Seattle バージョン3.8.7.4
 ・Delphi XE10.1 Berlin  バージョン3.9.2
これに対し、2016年5月27日時点でのSQLite最新版はバージョン3.13.0です。
SQLiteはバージョンが上がるごとに機能追加やバグフィックスに加え、高速化も行われますので、最新版に変更すれば高速化する場合があるのです。

それでは、具体的にFireDACで最新のsqlite3.dllを動的リンクで使う方法を説明します。
<1.リンクモードを変更するため、FireDAC.incファイルを修正>

場所はコチラ(XE10の場合) C:\Program Files (x86)\Embarcadero\RAD Studio\17.0\source\data\firedac
※Delphiのエディションがエンタープライズ以上しかFireDACのソースがなく、対応できません

{——————————————————————————}
{ SQLite driver }
{——————————————————————————}
{$IF DEFINED(MSWINDOWS) and not (DEFINED(BCB) and DEFINED(CPUX64))}
{$DEFINE FireDAC_SQLITE_STATIC} // Use SQLite3 static linking library
{$ENDIF}
{.$UNDEF FireDAC_SQLITE_STATIC} // remove ‘.’ to enable dynamic linking
ここの「.」を削除すると動的にsqlite3.dllを読み込めるようになります。

<2.最新のSQLite3.dllを取得>
SQLiteホームページより最新のSQLite3.dllを取得、アプリケーションexeと同じフォルダか、パスが通った場所に格納します。

<3.バージョンの確認>
SQLiteのバージョンは、select sqlite_version()といったSQLで取得可能ですので、こんな感じで確認できます。

procedure TForm1.Button1Click(Sender: TObject);
var
  sVersion: string;
begin

  FDQuery1.Open(‘select sqlite_version() vrsn’);
  if FDQuery1.Eof = False then
  begin
    sVersion := FDQuery1.FieldByName(‘vrsn’).AsString;
  end
  else
  begin
    sVersion := ‘不明’;
  end;
  FDQuery1.Close;

  ShowMessage(sVersion);

end;

XE5で静的と動的な最新SQLiteで比較した際、25%程の高速化が確認できました。

さて、最新の機能の利用や高速化が期待できる動的リンクですが、暗号化のサポートがされないという弊害もあります。
機能や動作速度と、セキュリティ条件等を比較考慮して最適な方法を選択すべきでしょうね。
ではでは。

続きを読む

2016/04/12 (火)

bitnami Redmineをインストールする際に気をつけるただ1つのこと

こんにちは。相馬です。

みなさん、プロジェクト管理してますか?

弊社でもプロジェクト管理ツールを使ってみよう!ということでRedmineを使い始めました。
そのインストール時にひとハマりあったので、そのお話を。

弊社は複数拠点あることと、協力会社さんも使えるようにしたい。でも費用は抑えたいので、
サーバはさくらのVPSを使うことにしました。

さっそく、Redmineをインストールするわけですが、Redmineを使うためにはWebサーバ入れて、DB入れて、設定して、と結構めんどくさそう。。。
ちょっと調べてみると、bitnami Redmineというオールインワンパッケージがあり、これを使うことでインストールの手間が省けそうなので使ってみました。

基本的には、インストーラをダウンロードして起動するだけです。あとはウィザードに従うだけでインストールが完了します。
こちらの記事を参考にさせていただきました。

OSSでLinuxサーバ構築 – Bitnami Redmine 3.2.1をさくらのVPS(CentOS 6.7)にインストール

記事では、インストール後にファイアウォールにHTTPでの接続許可を追加されていますが、私の環境では最初から許可されていました。

インストール作業が終わり、Webブラウザから「http://[さくらのVPSの標準ホスト名]」にしてみると、
Bitnami_Redmine_Stack

出ました!
インストール成功!と思って、「Access Redmine」をクリックするも「Internal Error」の表示。
サービスの状態を調べたり、ポートの状態を調べたり、アクセス権を調べたりするものの問題なさそう。。。
調べていくうちにこちらの記事にあたりました。

26歳からの文系プログラマーの備忘録 – redmineインストール
小一時間悩んだ挙句、インストール時のフォルダを
デフォルトの「C:\BitNami\redmine-2.4.2-0」から「C:\BitNami\redmine」に
変更したら無事アクセスできた。

記事にならって、bitnamiインストールウィザードでインストール先のフォルダを「/opt/redmine-3.2.1-0」から「/opt/redmine」に変更したところ、アクセスできるようになりました!!
ドットかハイフンを含んでたのが良くなかったようです。

bitnami Redmineを使う際には、インストール先のフォルダ名に注意です!

※この記事は投稿日時点の情報に基づいて書かれています。

続きを読む

2016/04/04 (月)

VirtualBoxの仮想ディスク容量を圧縮する方法

こんにちは。相馬です。

突然ですが、VirtualBox便利ですね。
弊社でも開発用サーバや社内システムでVirtualBoxを利用しています。

先日、VirtualBoxの仮想マシンを別マシンにクローンしようと思い、操作したところ表示されたのは、「残り時間 4時間」。。。
そんなに容量あるかな?と思いゲストOSでdfコマンド使ってみると、113GB程度しか使っていません。
が、ホストOSで仮想ディスクファイルの容量を確認すると439GB。。。

仮想ディスクを「可変サイズのストレージ」にすると、一度使用した領域は確保されたままとなり、ゲストOSでファイルを削除しても仮想ディスクの容量は減らないようです。。。
このままだとクローンやバックアップ時に効率が悪いので、仮想ディスク容量の圧縮にチャレンジしました。

VirtualBoxで仮想ディスク容量を圧縮するためには、
1.ゲストOSで仮想ディスクの未使用領域にゼロを書き込み
2.ホストOSで仮想ディスクを圧縮
という手順が必要です。

※以下はあくまで、私の環境で行った手順です。ddコマンドは、間違うとデータが上書きされてしまう危険性がありますので、お気をつけ下さい。

環境は以下の通りです。
  • ホストOS:Windows7
  • ゲストOS:Ubuntu14.04

まず、ゲストOSで仮想ディスクの未使用領域にゼロを書き込みます。
ゲストOS(Ubuntu)で、ddコマンドを使います。

$ sudo dd if=/dev/zero of=zero bs=4k; \rm zero

コマンドの細かい解説は省きますが、これで未使用領域にゼロが書き込まれます。
ディスクの容量によって時間がかかります。。。
実行終了後、ゲストOSは一旦シャットダウンしておきます。

続いて、ホストOSで仮想ディスクを圧縮します。
まず、対象の仮想ディスクのuuidを調べます。
ホストOS(Windows7)で、VirtualBoxインストール先に移動して以下のコマンドを実行します。

VBoxManage.exe list hdds

表示される中から、対象の仮想ディスクのuuidを控えておきます。
調べたuuidでディスクを指定して、圧縮します。

VBoxManage.exe modifyhd [仮想ディスクのuuid] --compact

こちらも、ディスクの容量によって時間がかかります。。。

実行終了後、ホストOSで仮想ディスクの容量を確認すると、、、「119GB」!!
無事圧縮出来ました!

続きを読む