RubyMotionのアレコレ

詰まりそうなところ。

・app.provisioning_profileの指定

XcodeのOrganizerでプロファイルなど作っているとどこにあるのか、また誰のデバイスを登録してあるのかわからなくなることがありますが、Provisioning Profilesの適当なプロファイルを右クリックして、Reveal Profile in Finderとかクリックすればファイルの場所がわかります。

ちなにみOrganizerで更新するとファイル名が変わったりすることがあり混乱。

・testflightappでテストアプリをインストール出来ない

デバイス登録ができてないはず。
testflightappからテスター登録した人のデバイスIDのメールが来たら、iOS Provisioning PortalのDevicesからAdd Devicesで追加し、それが反映したProvisioning Profileをapp.provisioning_profileで指定してあげればよい。
ワイルドカードだとうまくいかない?のかもしれないので、App IDsから新しいID作って、それからProvisioning Profileを作るといいかも。
Portal上でApp ID作ったらProvisioning ProfileはそのままPortalで作りダウンロードしてもいいし、XcodeのOrganizerで作ってもいい。

・Rakefileまわりのひな形

bundle install –path vendor/bundleした時にbundle exec rakeは面倒なのです。
なので自分テンプレ

これでbundle execしなくても、ちゃんとvendor/bundleを見てる。

・app.podsで指定したライブラリが読み込まない?

pod ‘NanoStore’とかで指定したのにNanoStoreクラスないよとかエラーがでたらrm -rf vendor/Podsしてrakeすればよい。

・AppStoreへのリリース時

rake archive:releaseでできた.ipaをアップするんだとおもうが、これOrganizerからできるのかな。
TODO: リリースしたら書く
続きを書いた。

あまりメモってなかったな。。

OpenCV, osxでopencv(とruby)

ちょいと駆け足でインストールからrubyで実行まで。

XQuartzのインストール
http://xquartz.macosforge.org/

numpyが必要っぽかったのでインストール

> pybrew install 3.2.3 (or 2.7.3)
> pybrew switch 3.2.3
> pip install numpy

homebrewでopencvインストール

> brew install opencv

rubyから利用する準備

> mkdir test
> vim Gemfile
gem 'opencv', :git => 'git://github.com/ruby-opencv/ruby-opencv.git'

> bundle install --path vendor/bundle
#coding: utf-8
require 'opencv'

image = OpenCV::IplImage.load(ARGV[0])

detector = OpenCV::CvHaarClassifierCascade::load('/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt2.xml')

detector.detect_objects(image) do |rect|
  image.rectangle!(rect.top_left, rect.bottom_right, color: OpenCV::CvColor::Blue)
end

image.save_image('output.jpg')

顔認識テスト

bundle exec ruby app.rb test.jpg

顔傾けてる写真だとあまり認識してくれないみたい。
あとでProcessingとかiOSとかでも試してみよう。

Ruby, rbenv

最近はrbenv使っているので。

homebrewでインストール。

brew install rbenv

簡単な使い方。

rbenv install
usage: rbenv install VERSION
       rbenv install /path/to/definition

Available versions:
  1.8.6-p420
  1.8.7-p249
  1.8.7-p334
  1.8.7-p352
  1.9.1-p378
  1.9.2-p180
  1.9.2-p290
  1.9.3-dev
  1.9.3-p0
  1.9.3-preview1
  1.9.3-rc1
  2.0.0-dev
  jruby-1.6.3
  jruby-1.6.4
  jruby-1.6.5
  jruby-1.7.0-dev
  rbx-1.2.4
  rbx-2.0.0-dev
  ree-1.8.6-2009.06
  ree-1.8.7-2010.02
  ree-1.8.7-2011.03

rbenv install 1.9.2-p290
rbenv install 1.9.3-p0

プロジェクトのRAILS_ROOTとかで、

rbenv local 1.9.3-p0

などすれば、.rbenv-versionというファイルができます。
このファイルがある場所に移動するだけでrubyのバージョンが変わります。

この時gem install capistranoとかすると、
~/.rbenv/versions/1.9.3-p0
以下にインストールされるのですが、capifyコマンドが見つからない場合があります。
なので、

rbenv rehash

と実行すると、~/.rbenv/shims以下を更新してくれるのでコマンドが利用できるようになります。

ただ、railsに限ったことではないですが、rubyのスクリプト書くときはだいたいGemfileでbundle execなので、あまり気にすることもないのかな。

Rails, capistranoの設定メモ

rails3.2で色々な環境にデプロイしようとしたcapistrano設定のメモ
もっとよい設定があると思うけど、動くのでこれで。

Gemfileには書かない。

gem install capistrano capistrano-ext

group :developmentから:productionに変更。

vim Gemfile
 gem 'therubyracer'

capifyは実行済み。

mkdir config/deploy
touch config/deploy/production.rb
touch config/deploy/staging.rb

共通設定をconfig/deploy.rbに記述
config/deploy.rbの先頭に、require “capistrano/ext/multistage” を記述する。

ステージング環境(結合環境)は自分自身にデプロイしたい。

vim config/deploy/staging.rb
 set :deploy_to, "/path/to/dir"
 set :ssh_options, { :forward_agent => true }
 role :web, '127.0.0.1'
 role :app, '127.0.0.1'
 #role :db, '127.0.0.1', :primary => true

本番環境config/deploy/production.rbはいつもどおりに記述。

deploy:assets:precompileやcleanを実行できるようにする。

vim Capfile
 load 'deploy/assets' #コメントアウトを外す

deploy時にbundle installを実行したい。
config/deploy.rbにrequire “bundler/capistrano” を記述する。
deploy:update_code→bundle:installの順番に実行される?

deploy:assets:precompileをbundle:installの後に実行する。

vim config/deploy.rb
 before('deploy:assets:precompile', 'bundle:install')

deploy時にbundle execがうまく動かないことがあるので、cap deployを実行している.bundle/configのシンボリックリンクを作ったりする。shared_pathにファイルを置いておく。
(cap bundle:installしたときの.bundle/configファイル)

vim config/deploy.rb
 namespace :deploy do
   task :bundlesymlink do
     run "cp #{shared_path}/config/bundle_config #{release_path}/.bundle/config"
   end
 end
 before('bundle:install','deploy:bundlesymlink')

ステージング環境でのデプロイ方法は、

cap staging deploy

node.js, nodebrew環境設定などなど

homebrewだとバージョン管理ができず、nvmはzshでおかしな挙動をし、naveはうまく動かず、nodeenvはがっつりすぎる、な状況のなか、nodebrewというものを設定してみました。

https://github.com/hokaccha/nodebrew

READMEにある通りにすすめてみます。
事前にhomebrewでインストールしていたnode.jsは削除してます。

> cd ~
> curl https://raw.github.com/hokaccha/nodebrew/master/nodebrew | perl - setup
> la .nodebrew
.  ..  current  default  node  node brew  src

> echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zsh/mine.zsh
> nodebrew install latest
> nodebrew install v0.6.11
> nodebrew ls
v0.6.11
v0.7.5

current: none
> node brew use v0.6.11
use v0.6.11
> nodebrew ls
v0.6.11
v0.7.5


current: v0.6.11> which node
~/.nodebrew/current/bin/node
> which npm
~/.nodebrew/current/bin/npm
> npm install coffee-script -g
> npm install cloud9 -g
> npm install express -g
> npm install ejs -g
> npm install socket.io -g

-gを付けないとカレントディレクトリのnode_modulesにインストールされてしまったのでグローバルに使えるようにしました。
実際は-gを付けずにプロジェクト毎のほうがいいのかな。

nodebrew useを実行してべつのバージョンに切り替えるとnpmも切り替わるので、インストールしたモジュールもそれぞれのnodejsに依存することになるみたい。

cloud9をローカルで実行してみたかったのだけれど、なんかエラーでてしまい、まだ検証できてないです。

socket.ioを使ったチャットとかも動かすことが出来ました。

C++でつくるWebアプリケーション TreeFrog Framework

C++でWEBアプリが作れるフレームワーク

http://www.treefrogframework.org/ja/

ダウンロードからソースを取得

> wget http://www.treefrogframework.org/wp-content/uploads/2011/11/treefrog-0.80.tar.gz
> tar zxvf treefrog-0.80.tar.gz
> cd treefrog-0.80
> ./configure -h
Usage: ./configure [OPTION]... [VAR=VALUE]...

Configuration:
  -h, --help          display this help and exit
  --enable-debug      compile with debugging information
  --enable-gui-mod    compile and link with QtGui module

Fine tuning of the installation directories:
  --framework=PREFIX  install framework files in PREFIX [/Library/Frameworks]
  --bindir=DIR        user executables [/usr/bin]
  --datadir=DIR       read-only architecture-independent data [/usr/share/treefrog]

> ./configure
qmake: command not found

http://qt.nokia.com/downloads-jp
http://qt.nokia.com/downloads/qt-for-open-source-cpp-development-on-mac-os-x
ここからosxのdmgファイルを取得してインストール
qt-mac-opensource-4.7.4.dmg

> which qmake
/usr/bin/qmake
> ./configure
...
First, run "make" and "sudo make install" in src directory.
Next, run "make" and "sudo make install" in tools directory.

> cd src
> make
> sudo make install
> cd ../tools
> make
> sudo make install

treefrogのドキュメントからチュートリアルをひと通りチェック
http://www.treefrogframework.org/ja/ドキュメント/チュートリアル

> tspawn new blogapp
  created   blogapp
  created   blogapp/controllers
  created   blogapp/models
  created   blogapp/models/sqlobjects
  created   blogapp/views
  created   blogapp/views/layouts
  created   blogapp/views/mailer
  created   blogapp/views/partial
  created   blogapp/views/_src
  created   blogapp/helpers
  created   blogapp/config
  created   blogapp/config/environments
  created   blogapp/config/initializers
  created   blogapp/public
  created   blogapp/public/images
  created   blogapp/public/js
  created   blogapp/public/css
  created   blogapp/db
  created   blogapp/lib
  created   blogapp/log
  created   blogapp/plugin
  created   blogapp/script
  created   blogapp/sql
  created   blogapp/test
  created   blogapp/tmp
  created   blogapp/blogapp.pro
  created   blogapp/appbase.pri
  created   blogapp/controllers/applicationcontroller.h
  created   blogapp/controllers/applicationcontroller.cpp
  created   blogapp/controllers/controllers.pro
  created   blogapp/models/models.pro
  created   blogapp/views/views.pro
  created   blogapp/views/_src/_src.pro
  created   blogapp/views/mailer/.trim_mode
  created   blogapp/helpers/helpers.pro
  created   blogapp/helpers/applicationhelper.h
  created   blogapp/helpers/applicationhelper.cpp
  created   blogapp/config/application.ini
  created   blogapp/config/database.ini
  created   blogapp/config/logger.ini
  created   blogapp/config/routes.cfg
  created   blogapp/config/validation.ini
  created   blogapp/config/initializers/internet_media_types.ini
  created   blogapp/public/404.html
  created   blogapp/public/413.html
  created   blogapp/public/500.html

mysqlもしくはsqliteデータベースの作成

> mysql -u root
mysql> create database blogdb;
mysql> use blogdb;
mysql> create table blog (id int PRIMARY KEY, title varchar(20), body varchar(200), created_at timestamp, updated_at timestamp, lock_revision int);
mysql> quit
> sqlite3 db/blogdb
sqlite> create table blog (id int PRIMARY KEY, title varchar(20), body varchar(200), created_at timestamp, updated_at timestamp, lock_revision int);
sqlite> .quit

lock_versionってなんだ?と思ったらドキュメントに書いてあった。

また、lock_revision フィールドは、楽観的ロックを実現するためのもので、integer 型で作っておきます。

楽観的ロック (Optimistic Lock)
レコードにはあらかじめロックリビジョンを記録しておき、ロックリビジョンが変わっていないことを検証しつつデータを保存すること。ロックはかけないので、処理速度の向上がちょっとだけ期待できるでしょう。

> cd blogapp
> tree
.
├── appbase.pri
├── blogapp.pro
├── config
│   ├── application.ini
│   ├── database.ini
│   ├── environments
│   ├── initializers
│   │   └── internet_media_types.ini
│   ├── logger.ini
│   ├── routes.cfg
│   └── validation.ini
├── controllers
│   ├── applicationcontroller.cpp
│   ├── applicationcontroller.h
│   └── controllers.pro
├── db
├── helpers
│   ├── applicationhelper.cpp
│   ├── applicationhelper.h
│   └── helpers.pro
├── lib
├── log
├── models
│   ├── models.pro
│   └── sqlobjects
├── plugin
├── public
│   ├── 404.html
│   ├── 413.html
│   ├── 500.html
│   ├── css
│   ├── images
│   └── js
├── script
├── sql
├── test
├── tmp
└── views
    ├── _src
    │   └── _src.pro
    ├── layouts
    ├── mailer
    ├── partial
    └── views.pro

※なんかmysql用のなにかが足りないようでDriverType=QMYSQLが失敗しているので、sqliteで試します

> vi config/database.ini
[dev]
DriverType=QSQLITE
DatabaseName=db/blogdb
HostName=
Port=
UserName=
Password=
ConnectOptions=

> tspawn scaffold blog
DriverType: QSQLITE
DatabaseName: db/blogdb
HostName: 
Database open successfully
  created   controllers/blogcontroller.h
  created   controllers/blogcontroller.cpp
  updated   controllers/controllers.pro
  created   models/sqlobjects/blogobject.h
  created   models/blog.h
  created   models/blog.cpp
  updated   models/models.pro
  created   views/blog/index.html
  created   views/blog/index.otm
  created   views/blog/show.html
  created   views/blog/show.otm
  created   views/blog/entry.html
  created   views/blog/entry.otm
  created   views/blog/edit.html
  created   views/blog/edit.otm

> qmake -spec macx-g++ (linuxならlinux-g++) #最初の一回だけ実行してMakefileを作成している
> make

※ -spec オプションについては、Windows では win32-g++ を、Mac OS X では macx-g++ を指定すればよいでしょう。
ビルドが成功すると、4つの共有ライブラリ(controller, model, view, helper)が lib ディレクトリに作られます。

だそうです。

アプリケーションの起動

> treefrog -e dev

ブラウザでhttp://localhost:8800/Blog/indexにアクセスする
なんか見慣れたscaffoldの画面が出てくればOK
日本語もばっちりでした。

irc, ircd-hybridでパスワード認証とSSL接続

ものすごく思いつきでやりました。
パスワード認証のSSL利用で立ち上げたいと思います。

yum install ircd-hybrid

## 変更箇所だけ
cp /usr/share/doc/ircd-hybrid-7.2.3/simple.conf /etc/ircd/ircd.conf

vi /etc/ircd/ircd.conf
serverinfo {
name = "irc.runeleaf.net";
# [0-9][A-Z0-9][A-Z0-9]
sid = "101";
description = "IRC Server";
rsa_private_key_file = "/etc/secure/ircd/rsa.key";
ssl_certificate_file = "/etc/secure/ircd/cert.pem";
}

administrator {
name = "runeleaf";
email = "メールアドレス";
}

auth {
/*
* /usr/libexec/ircd/mkpasswd -m
* plaintext:
*/
password = "上記で生成された文字列";
encrypted = yes;
}

operator {
name = "runeleaf";
user = "*@runeleaf.net";
password = "パスワード";
encrypted = yes;
}

listen {
flags = ssl;
port = 6667;
}

rsa.keyとかつくります。

mkdir -p /etc/secure/ircd
cd /etc/secure/ircd
openssl genrsa -out rsa.key 2048
openssl rsa -in rsa.key -pubout -out rsa.pub
chown ircd:ircd *
chmod 600 *
openssl req -new -days 365 -x509 -key rsa.key -out cert.pem

サービス起動

service ircd start

portを開けてサーバ側はおわり。
limechatからsslで接続確認してクライアント側はおわり。

ブログ書いたの久しぶりだなー