Android NDKでSTLを使う
Androidでなんかやりたいなーと思いながら,土日でAndroid再入門 - Twitterクライアントを作ってみようを読みながらtwitterクライアントのようなものを作りました.
そのままだとUIがちょっとさみしいのでActionBarShaerlockという素敵なライブラリを使ってもっと頑張ろうというのはまた別の話.
Why NDK
この間つくったBackPropagationのプログラムをAndroid上で動かせないかなというのが事の始まりでした.完全にJavaに移植しても良かったのですが,
Download SDK
まず,Androidの開発環境の構築ですが,AndroidSDKでぐぐってトップに出てくるページにアクセスして,
Download the SDKをぽちっと押し,適当なフォルダに展開すればそれで8割終わりです.
Eclipseが入ってるのでそれを使って開発します.
次にNDK
Android NDKを使った開発環境の構築 - Yahoo!知恵袋が詳しいので,これにそってやってれば概ね問題ないです.NDKのダウンロードはここから.
- NDKをダウンロードして,適当なフォルダに展開
- Window > Android > NDKでパスを設定
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でバージョン管理も楽だし便利だしなかなかむずい。
参考
誤差逆伝播法を書いてみた
ニューラルネットについて、研究室で少し調べてみたら誤差逆伝播法(バックプロパゲーション)というものがあることを知り、テキストのサンプルを見つつ、適当に実装してみた。
処理の流れとしては、
- 訓練データをセット
- 入力に対する出力を、ニューラルネットを通して求める
- 目標値と出力の誤差を求める
- 誤差をニューラルネットの出力側から入力側へ伝えつつ、結線の重みを修正
- 誤差が十分小さくなるまで繰り返し
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>     Order allow,deny #自分とこのIPアドレスを最後に追加     Allow from localhost 127.0.0.0/8 ::1 xxx.xxx.xxx.xxx     Options None     <IfModule mod_expires.c>         ExpiresActive On         ExpiresDefault M310     </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://~に飛んでくれます。
参考