「Deep Learning Javaプログラミング」で気になったこと

昨日(12/17)、Java読書会BOF:『「Deep Learning Javaプログラミング 深層学習の理論と実装」を読む会』に参加しました。その本に載っているコードについて読書会中に考えていたことを自分用メモをかねてまとめました。

pp.45-46にある、Perceptronsクラスの一部
p.46のtrain()メソッド

public int train(double[] x, int t, double learningRate) {

    int classified = 0;
    double c = 0.;

    // check if the data is classified correctly
    for (int i = 0; i < nIn; i++) {
        c += w[i] * x[i] * t;
    }

    // apply gradient descent method if the data is wrongly classified
    if (c > 0) {
        classified = 1;
    } else {
        for (int i = 0; i < nIn; i++) {
            w[i] += learningRate * x[i] * t;
        }
    }

    return classified;
}

と、p.45のmain()内処理

while (true) {
    int classified_ = 0;

    for (int i=0; i < train_N; i++) {
        classified_ += classifier.train(train_X[i], train_T[i], learningRate);
    }

    if (classified_ == train_N) break;  // when all data classified correctly

    epoch++;
    if (epoch > epochs) break;
}

です。
Continue reading ‘「Deep Learning Javaプログラミング」で気になったこと’ »

FuelPHPのログをfluentdの入力に

FuelPHPのログをfluentdに渡したいと考えたのですが、FuelPHPはログを日毎に別ファイルに書き出すので、apacheなどのようにtailではとれません。
最終的にはtailでとれるようになりましたが、そこまでの過程の方が勉強になったのでそれも含めてまとめました。

使用したFuelPHPは 1.7.2 です。

Continue reading ‘FuelPHPのログをfluentdの入力に’ »

PoderosaからCygwin接続できず

あたらしくPoderosaとCygwinをインストールして、PoderosaからCygwin接続するとcygtermがアプリケーションエラーになりました。

cygterm.exe – アプリケーションエラー
アプリケーションを正しく起動できませんでした(0xc000007b)。
[OK]をクリックしてアプリケーションを閉じてください。

Cygwin起動時の[cygwinへの接続]ウィンドウの下の方に、

シェルがうまく起動できないときはCygTermをコンパイルしなおして下さい。

とあるので、CygTermをコンパイルしなおしたら起動できるようになりました。CygTermのソースはPoderosaについていたので、単にCygwin上でmakeを実行するだけです。

試した環境

  • Windows 7 Pro. SP1 64bit版
  • Poderosa Version 4.3.8b
  • Cygwin 1.7.32-1

やったこと

  • Cygwin Terminal起動
  • cd [Poderosaインストールディレクトリ]/Protocols/Cygterm
  • make

これで、PoderosaからCygwin接続できるようになりました。

makeできないときは、Cygwinに下記パッケージ(及び依存パッケージ)をいれれば出来ると思います。

  • make: The GNU version of the ‘make’ utility
  • binutils: GNU assember, linker, and similar utilities
  • gcc-g++: GNU Compiler Collection (C++)

DockerでCentOSのsshdを試す

Dockerが面白そうなので少しさわっています。dockerのページにあるsshdの例(Dockerizing an SSH service)を基にしてCentOS用Dockerfileを作ってみました。

# sshd
#
# VERSION               0.0.1

FROM     centos
MAINTAINER IMAI "imai@example.com"

# make sure the package repository is up to date
RUN yum update -y

RUN yum install -y openssh-server
RUN echo 'root:screencast' |chpasswd

RUN sed -i '/pam_loginuid\.so/s/required/optional/' /etc/pam.d/sshd
RUN /sbin/service sshd start
RUN /sbin/service sshd stop

EXPOSE 22
CMD    ["/usr/sbin/sshd", "-D"]

最終的にはログインできるようになったのですが、結構手こずったのでここまでの経緯を書いておきます。

CentOS6.5で動かしていて、Docker本体はEPELから持ってきたものです。 Continue reading ‘DockerでCentOSのsshdを試す’ »

カレンダーウィジェットの今日の日付がおかしい

WordPressのサイドバーにカレンダーウィジェットを表示しています。今日の日付のセル(<td id=”today”>)は、cssで背景色を変えています。でも時々今日の日付ではないところの背景色が変わっていることに気がつきました。

APC(Alternative PHP Cache)とAPC Object Cacheを入れているのですが、日付が変わってもカレンダー部分のキャッシュが更新されず、昨日のセルにid=”today”が付いた状態だからでした。WordPressのソースコードを調べてみると、wp-includes/general-template.phpdelete_get_calendar_cache()をコールすれば良いようです。現状のコードでは記事の保存/削除、週の始まりやタイムゾーンの設定を行ったときにはカレンダーキャッシュが削除されるのですが、それ以外にトリガーはなさそうです。

どのようにすれば良いかはわかったのですが、コアファイルに手を入れるのもいやなので、簡単なプラグインを作ってみました。 Continue reading ‘カレンダーウィジェットの今日の日付がおかしい’ »

clamscan用logwatch設定

ClamAVのclamscanを定期的に動かすために、下記のようなスクリプトを/etc/cron.weekly/に置いています。

#!/bin/bash

LANG=C
QUARANTINE_DIR="/var/lib/clamav/virus"
LOG_FILE="/var/log/clamav/clamscan.log"
if [ ! -e "$LOG_FILE" ]; then
    touch "$LOG_FILE"
    chmod 644 "$LOG_FILE"
    chown clam.clam "$LOG_FILE"
fi

/bin/echo -e "\n---- `date`" >> $LOG_FILE
/usr/bin/clamscan -i --move=$QUARANTINE_DIR -r --exclude-dir=^/dev --exclude-dir=^/proc --exclude-dir=^/sys --exclude-dir=^$QUARANTINE_DIR / 2>&1 | /usr/bin/tee --append $LOG_FILE | /bin/grep -E 'FOUND$|^WARNING:|^ERROR:'

これで/var/log/clamav/clamscan.logに実行時の出力が記録されますし、ウィルスファイル発見時などにはcronの仕組みでrootにメールが送られます。(clamscan.logはlogrotateでローテートしています。)

数年動かしていて、今までメールがあったのはテスト時のEicarだけです。

もちろんこれ以外に見つかったら困るのですが普段本当に動いているかどうかも気になるので、他のアプリのlogwatch設定ファイルを参考にclamscan用のlogwatch設定ファイルを作りました。 Continue reading ‘clamscan用logwatch設定’ »

bashのチルダ展開、~ と ~name の違い

今までbashのチルダ展開で、~ はシェル実行ユーザーがnameの時の ~name と同じだと思っていたのですが、違うということに気がつきました。

  • ~name
    ユーザー name のホームディレクトリ。つまり、/etc/passwdにかかれているディレクトリ。
  • ~
    $HOMEの値。$HOMEがなければシェル実行ユーザーのホームディレクトリ。

通常、$HOMEはそのシェル実行ユーザーのホームディレクトリが設定されているので、今まで違いに気がつきませんでした。
なぜ気がついたかというと、 Continue reading ‘bashのチルダ展開、~ と ~name の違い’ »

Android ActivityのLifecycle図を書き換えてみた

Android APIのActivityに書かれている”Activity Lifecycle”の図って、何かわかりにくいなぁと思っていました。

  • アクションが状態のように見える。
    本文中には、「長方形はコールバックメソッドを表す、色つき長円形は主な状態である」とは書いてあるのですが、でもやっぱりわかりにくい。
  • 本文中にでてくる状態が図にでてこない。
    本文中に「Activityは基本的に4状態を持つ」と書いてあるが、そのなかのpaused, stoppedが図にてでこない。
  • 階層化して書かれていない。
    本文には「3つのキーループを持つ」と書かれているが、それが図からわかりにくい。

ということで、自分の整理もかねて図を書き換えてみました。 Continue reading ‘Android ActivityのLifecycle図を書き換えてみた’ »

Windows 7の時刻同期間隔をregeditせずに短くしたい

初期状態のWindows 7では時刻同期は毎週日曜日に実行されるようになっています。これだと分オーダーで時刻がずれていることがあるので、同期間隔を短くしたいと思ったのですが、(たぶん)Windows 7から仕組みが変わったようです。

  • Windows 7まで(?)
    OS起動時にWindows Time (W32Time)が自動で起動されて常駐する。同期間隔はレジストリに最大値と最小値などが設定されていて、同期先NTPサーバーとの時刻のずれにより、この最大値、最小値の範囲内で同期間隔が調整される。(設定により固定の間隔にすることも可能。)
    つまり、W32Timeが常駐してW32Timeの仕組みで同期間隔を調整しながら時刻同期を行う。
  • Windows 7以降(?)
    Windows Time (W32Time)のスタートアップは手動に設定されており、OS起動時には起動されない。
    タスクスケジューラのSynchronizeTimeが一週間ごとにW32Timeを起動し、W32Timeが時刻同期を行う。時刻同期を行った後W32Timeは終了する。
    つまり、W32Timeは常駐せずに時刻同期を行うだけで終了し、同期間隔はSynchronizeTimeが管理する。

Windows 7を使っていて同期間隔を短くしたいと考える人が多いようで、ネット上にはWindows 7より前と同じように、OS起動時にW32Timeが自動で起動されて常駐するようにし、レジストリをいじって同期最大間隔や最小間隔などを設定して以前と同様の動きにする方法がよく見つかります。

でも、レジストリをいじるのは不安だし、そんなに厳密に時刻があって無くてもいい、でも分オーダーでずれるのはさすがにいやだ、という人が多いのではないかと思います。そこでW32Timeは今まで同様手動起動のままで常駐せず、SynchronizeTimeがW32Timeを起動する間隔を短くすればよいのではと思って試してみました。以下自己責任で。 Continue reading ‘Windows 7の時刻同期間隔をregeditせずに短くしたい’ »