Android NDKでSTLを使う

Androidでなんかやりたいなーと思いながら,土日でAndroid再入門 - Twitterクライアントを作ってみようを読みながらtwitterクライアントのようなものを作りました.

そのままだとUIがちょっとさみしいのでActionBarShaerlockという素敵なライブラリを使ってもっと頑張ろうというのはまた別の話.

Why NDK

この間つくったBackPropagationのプログラムをAndroid上で動かせないかなというのが事の始まりでした.
完全にJavaに移植しても良かったのですが,書きなおすのめんどくさいこれを機にNDKに触ってみようと思い試してました.

Download SDK


まず,Androidの開発環境の構築ですが,AndroidSDKでぐぐってトップに出てくるページにアクセスして,
Download the SDKをぽちっと押し,適当なフォルダに展開すればそれで8割終わりです.

Eclipseが入ってるのでそれを使って開発します.

次にNDK

Android NDKを使った開発環境の構築 - Yahoo!知恵袋が詳しいので,これにそってやってれば概ね問題ないです.

NDKのダウンロードはここから.

  • NDKをダウンロードして,適当なフォルダに展開
  • Window > Android > NDKでパスを設定
Androidプロジェクトの作成 > プロジェクトエクスプローラでプロジェクトを右クリック > AndroidTools > Add Native Support

jniディレクトリとかができます.

関数名は指定された形式である必要があるので,javahとかいうやつを使ってヘッダファイルを作成するんですが,
微妙にエラーが出たりします.

ここでちょこっと設定

jniディレクトリに,Application.mkファイルを追加.

APP_PLATFORM := android-10 #Android2.2でも動かしたいなら8

これで,テキストエディタにフォーカスした状態でcreate header file for NDKを動作させればヘッダファイルができるはず.

ヘッダができたら,宣言部分を.cppファイルの方にコピーして実装していく.

そしてSTL

STLを使う場合は,Application.mkに追記

APP_STL := stlport_static

ただ,ビルドが通ってもYour project contains error(s)とか言いやがってAndroidアプリケーションとして実行できない事案が発生していて辛い.

追記
ググったら解決できた.
Project->Properties->C/C++ General->Includesで以下3つを追加して,Application.mkを変更

PATH_TO_NDK/sources/cxx-stl/gnu-libstdc++/include
PATH_TO_NDK/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include
PATH_TO_NDK/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/include

APP_STL := gnustl_static

に変更

2013/06/09追記

APP_STL := gnustl_staticさえApplication.mkを作成して記述しておけばSTLが使えた感じある.

C++11の機能を使う場合は,Android.mkに LOCAL_CFLAGS := -std=c++11 を追加.

参考

Passengerを使ってRailsアプリケーションを複数動かす

Railsでなんか作ってサーバーで動かしたいなあと思ってるのでその下準備を。
OSはUbuntu12.04Serverです。
サーバーへのRailsのインストールはRails本番環境構築ガイドが詳しいです。

app.example.comというサブドメインRailsで遊ぶために割り当てます。DNSレコードの設定はお名前.comだと簡単に済ませられます。

hogeというアプリを作った場合、app.hoge.com/hogeで動くように設定していきます。

Passengerの設定

LoadModule passenger_module /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.19/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.19
PassengerRuby /usr/local/bin/ruby

Apacheの設定

設定ファイル

<VirtualHost *:80>
    ServerName app.example.com  #Railsアプリケーションを動かすドメイン。ご自由に。
    DocumentRoot /var/www/rails #シンボリックリンクを張っておくディレクトリ。適当に。
    <Directory /var/www/rails>
        Options Includes ExecCGI FollowSymLinks MultiViews
        AllowOverride all
        DirectoryIndex index.html index.php index.py inedx.cgi index.shtml
        Order allow,deny
        allow from all
    </Directory>
    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/rails-error.log
    CustomLog ${APACHE_LOG_DIR}/rails-access.log combined env=!no_log

    #アプリ毎の設定
    <Directory /var/www/rails/hoge>
        RailsBaseURI /hoge
        RailsEnv development
    </Directory>

    <Directory /var/www/rails/fuga>
        RailsBaseURI /fuga
        RailsEnv development
    </Directory>

</VirtualHost>

設定の有効化

sudo a2ensite app
sudo service apache2 reload

作成したRailsのアプリケーションのpublicディレクトリのシンボリックリンクを、DocumentRootに指定したディレクトリに置けば動くはず。
RailsEnvのとこを、developmentからproductionにすれば本番環境として動かせます。

参考

ソースファイル、実行ファイルのディレクトリを指定したmakefileを書く

ゴールデンウィーク誤差逆伝播法のコーディングに捧げたんですが、今もコーディングを続けてます。

https://github.com/crakaC/back_propagation

それで、今までmakefileはソースファイルと同じディレクトリに突っ込んでたけど、SublimeTextでmakeするときうまく行かなかった。
srcディレクトリを開けばSublimeTextからmakeできるんだけど、それだと.gitignoreとかREADME.mdを編集できないので、プロジェクトのルートにmakefileを移して、色々参考にして書き直した。

CC=g++
CFLAGS=-Wall -O3
.SUFFIXES = .cpp
SRC_DIR = src
BUILD_DIR = bin
SRCS:=$(wildcard $(SRC_DIR)/*.cpp)
OBJS:=$(SRCS:.cpp=.o)
TARGET = backpropagation

.PHONY: all clean

all: $(BUILD_DIR) $(patsubst %,$(BUILD_DIR)/%,$(TARGET))

$(BUILD_DIR):
	mkdir $(BUILD_DIR)

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp
	$(CC) -c $(CFLAGS) -o $@ $&^;

$(BUILD_DIR)/$(TARGET): $(patsubst $(SRC_DIR)/%,$(BUILD_DIR)/%,$(OBJS))
	$(CC) $(CFLAGS) -o $@ $^

clean:
	$(RM) -r $(BUILD_DIR)

#依存関係(5/15再編集)
$(BUILD_DIR)/mylib.o: $(patsubst $(SRC_DIR)/%,$(BUILD_DIR)/%, mylib.hpp struct.hpp Net.hpp)
$(BUILD_DIR)/Net.o: $(patsubst $(SRC_DIR)/%,$(BUILD_DIR)/%, Net.hpp struct.hpp)
$(BUILD_DIR)/Net_setter_and_getter.o: $(patsubst $(SRC_DIR)/%, $(BUILD_DIR)/%, Net.hpp struct.hpp )
$(BUILD_DIR)/struct.o: $(patsubst $(SRC_DIR)/%,$(BUILD_DIR)/%, struct.hpp)

今時makefile書いてmakeするくらいだったらVisualStudioでさくっと作れよって話。
でもSublimeText軽いし便利だしXubuntuならgitでバージョン管理も楽だし便利だしなかなかむずい。

参考

誤差逆伝播法を書いてみた

ニューラルネットについて、研究室で少し調べてみたら誤差逆伝播法(バックプロパゲーション)というものがあることを知り、テキストのサンプルを見つつ、適当に実装してみた。

処理の流れとしては、

  1. 訓練データをセット
  2. 入力に対する出力を、ニューラルネットを通して求める
  3. 目標値と出力の誤差を求める
  4. 誤差をニューラルネットの出力側から入力側へ伝えつつ、結線の重みを修正
  5. 誤差が十分小さくなるまで繰り返し
という感じです。

https://github.com/crakaC/back_propagation

サンプルだと、訓練データの入力と、誤差逆伝播法による結線重みの修正しかできなかったので、コマンドラインから色々操作出来るように改良した。

主な機能は、

もうちょい付け加えたいこともあったけど今回はもういいや。

さくらのVPSにMuninをインストールしてみる

サーバー管理やってみようということでMuninをインストールしてみた。

以下メモ

sudo apt-get install munin

これだけでインストールされます。素敵。

/etc/muninに設定ファイルやらが出てくるので、ちょっと設定。

まず、apache.conf。これはapacheの設定ファイルの中にコピペして使う。

Alias /munin /var/cache/munin/www
<Directory /var/cache/munin/www>
&#160;&#160;&#160; Order allow,deny
    #自分とこのIPアドレスを最後に追加
&#160;&#160;&#160; Allow from localhost 127.0.0.0/8 ::1 xxx.xxx.xxx.xxx
&#160;&#160;&#160; Options None

&#160;&#160;&#160; <IfModule mod_expires.c>
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ExpiresActive On
&#160;&#160;&#160;&#160;&#160;&#160;&#160; ExpiresDefault M310
&#160;&#160;&#160; </IfModule>
</Directory>

もともと、Allow from 以下で許可したIP以外からはアクセスできない設定になってる。xxx.xxx.xxx.xxxに、自分のPCが使ってるIPアドレスを入力すればおk.Basic認証でもよい。

sudo -u munin munin-cron
sudo service apache2 restart
sudo service munin-node restart

これで、hogehoge.com/munin にアクセスすると動いてる。すげー。

参考

Redmineへの接続を常にHTTPSにする

前回はWordPressの管理画面をHTTPSで接続できるようにしたので、今回はRedmineの方もHTTPSにしようということでそのときのメモを。

手順としてもだいたい一緒で、証明書を作ってApacheの設定をうまい具合にやるだけ。適当なディレクトリ(/etc/apache2/ssl)で以下のコマンドを打ち込んで公開鍵証明書と秘密鍵を作成。

openssl genrsa -aes128 1024 > redmine.key
openssl req -new -key redmine.key > redmine.csr
openssl x509 -in redmine.csr -days 365 -req -signkey redmine.key > redmine.crt
mv redmine.key redmine.key.bk
openssl rsa -in redmine.key.bk > redmine.key

Apacheの設定を追加。

<VirtualHost *:80>
    ServerName redmine.example.com
    ServerSignature Off
    RewriteEngine On
    RewriteCond "%{SERVER_PORT}"    "^80$"
    RewriteRule "^(.*)$"            "https://%{SERVER_NAME}$1" [R,L]
</VirtualHost>

<VirtualHost *:443>
    ServerName redmine.example.com
    DocumentRoot /usr/local/redmine/public

    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/apache2/ssl/redmine.crt
    SSLCertificateKeyFile /etc/apache2/ssl/redmine.key

    Header onsuccess append Cache-Control public
    ExpiresActive On
    <FilesMatch "\.(txt|css|js|jpeg|jpg|png|gif)$>
        ExpiresDefault "access plus 3 days"
    </FilesMatch>

    <Directory /usr/local/redmine/public>
       # This relaxes Apache security settings.
       #AllowOverride all
       AllowOverride none
       # MultiViews must be turned off.
       Options -MultiViews
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/rm-error-ssl.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/rm-access-ssl.log combined env=!no_log
    RailsBaseURI /
</VirtualHost>

これでhttp://〜でアクセスしても、https://~に飛んでくれます。

参考