別に大したエントリでもなく。私的なメモ程度。

osxでやってます。vimは7.1。PrivatePortfileのvimを使っています。7.2にしてもいいかも。
http://lapangan.net/darwinports/index.php?PrivatePortfile%2FVim
http://lapangan.net/darwinports/index.php?PrivatePortfile%2FVim72

ポリシーとして、あまり追加でプラグインやシンタックスなどを入れないようにしてます。
project.vimとかrails.vimも入れてなかったり。

早速。

この2つがあれば基本的にしあわせです。。

  • snipMate
  • ctags

すでに以下の3つのsyntaxがある。

  • ruby.vim
  • actionscript.vim
  • mxml.vim

新たにsyntaxを導入する。
javaid.vim
http://www.fleiner.com/vim/download.html

docとautoloadに設置する。vimrcも修正。
javacomplete
http://www.vim.org/scripts/script.php?script_id=1785

zshrcに記述する。

export _JAVA_OPTIONS=-Duser.language=en
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
export PATH=$JAVA_HOME/bin:$PATH

あとはscreenも併用していけば、eclipseとか要らないですな。(eclipseは便利だけどね)

プライベートなgitサーバーを立てたいのだけど、git:// とかではなく、ssh:// でやりたいなーと思いまして。

なのでgit-daemonは使わず、gitosisを使ってみたいと思います。
つまり、公開鍵だけもらってユーザー毎にアクセス権限管理とかしたいわけです。

個人的用途なのにアクセス権限とか・・どういうことなの・・・

webのインターフェイスは今のところ考えていません。

“%”がリモートサーバーで“$”がローカルPCのプロンプトです。

サーバーにyumからインストールしてgitosisの初期設定をします。

% yum update git
% yum install gitosis
% useradd git
% passwd git
% cd /home/git
% sudo -H -u git gitosis-init < id_dsa.pub
Initialized empty Git repository in ./
Reinitialized existing Git repository in ./
% ls -la
gitosis/
.gitosis.conf
repositories/
.ssh/

自分のPCでgitosis-adminをgit cloneします。

$ git clone ssh://git@example.com/gitosis-admin.git
$ cd gitosis-admin
$ ls
gitosis.conf keydir

リポジトリ管理者を追加します。基本的に自分だけ。複数ユーザを設定できます。必要なものは公開鍵で、これをpushすることになります。

$ vi gitosis.conf
[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = runeleaf fuga

$ cp id_rsa_fuga.pub keydir/fuga.pub
$ git add .
$ git ci -m 'add admin'
$ git push

うまいことhooks/post-updateで.sshに公開鍵を追加しているんですね。

個人で使うリポジトリを追加してみます。

$ vi gitosis.conf
[group fuga]
writable = foo/bar/baz
members = fuga

$ git add .
$ git ci -m 'add private repo'
$ git push

自分のPCで試しに作ってpushしてみます。

$ cd ../
$ mkdir my-repo
$ cd my-repo
$ git init
$ cat > README
test
$ git add .
$ git ci -m 'init'
# gitosis.confにwritable(foo/bar/baz)を追加しておく
$ git remote add origin ssh://git@example.com/foo/bar/baz.git
$ git push origin master

ここまでやれば大体良かったのですが、gitサーバー自身にgit cloneしようしてもうまい事できなかったので(なんかもっと良い方法がありそうだけど)、自分自身でも同じようにgit cloneしたりpushしたりできるようにしてみます。

ようはローカルでしか使わない鍵をつくっただけ。

% ssh-keygen -P "" -t dsa -f id_dsa_local
% mv id_dsa_local .ssh/
% vi .ssh/config
Host example.com
  User git
  Hostname localhost
  IdentityFile ~/.ssh/id_dsa_local

作成した公開鍵、id_dsa_local.pubの内容をコピーするかローカルマシンにダウンロードして追加。

$ cd gitosis-admin
$ cp ~/id_dsa_local.pub keydir/local.pub
$ vi gitosis.conf
[group fuga]
writable = foo/bar/baz test/lib
members = fuga local
$ git add .
$ git ci -a -m 'add local'
$ git push origin master

これでgitサーバー自身にログインしてローカルマシンと同じようにcloneしたりpushしたり。

% git ssh://git@example.com/test/lib.git test-lib
% cd test-lib
% touch test.txt
% git add .
% git ci -a -m 'add test.txt'
% git push

こんなんでいいのかなぁ・・

自分しか使わないし、いいよね。

今更感のある。

基本的に、iPhone Developer ProgramのPortalにあるHow Toの通りにやれば出来るのですが、最後のビルドでこけたのでー。

XcodeのオーガナイザーからProvisioningを追加するのですが、これDeviceのところのProvisioningの+ボタンから追加するだけではダメらしく、IPHONE DEVELOPMENTのProvisioning Profileにファイルをドラッグ&ドロップすると追加できるのです。

こうしておくとコード署名IDのところで証明書を選択できて、「ビルドして実行」した時に証明書エラーが出なくなり実機で動かす事が出来るのでした。

というかAndroidアプリも調べねばー

モバイル系のアプリは作るの楽しいんだよね!

背景の前提で、ログインしている状態にしておくメモ。

steps.rb

Given /^"(.*)"でログインしていること$/ do |login|
  @current_user = Admin.create!(
    :login => login,
    :password => "testtest",
    :password_confirmation => "testtest",
    :email => "foobar@example.com")
  visit "/session/new"
  fill_in("ログインID", :with => login)
  fill_in("パスワード", :with => "testtest")
  click_button("ログイン")
  response.body.should =~ /ログインしました。/m
end

feature

背景:
  前提 "foobar"でログインしていること

シナリオ:
 ....

苦労して色々試してみた結果、さっくりyumでインストールできる方法を見つけたのでやってみる。

yumかわいいよ。

RPMでやっても同じなんだけどね。

epelとremiのrepoを設定。

wget http://ftp.iij.ad.jp/pub/linux/fedora/epel/5/x86_64/epel-release-5-3.noarch.rpm
rpm -Uvh epel-release-5-3.noarch.rpm
wget http://rpms.famillecollet.com/el5.x86_64/remi-release-5-7.el5.remi.noarch.rpm
rpm -Uvh remi-release-5-7.el5.remi.noarch.rpm

インストール。

yum install mysql-server mysql-cluster

=================================================================================================================================================================================================================
 Package                                               Arch                                         Version                                                 Repository                                      Size
=================================================================================================================================================================================================================
Installing:
 mysql-cluster                                         x86_64                                       5.1.34-1.el5.remi                                       remi                                            14 M
 mysql-server                                          x86_64                                       5.1.34-1.el5.remi                                       remi                                            10 M
Installing for dependencies:
 mysql                                                 x86_64                                       5.1.34-1.el5.remi                                       remi                                           3.7 M
 mysql-libs                                            x86_64                                       5.1.34-1.el5.remi                                       remi                                           2.1 M
 mysqlclient15                                         x86_64                                       5.0.67-1.el5.remi                                       remi                                           1.3 M
 perl-DBD-mysql                                        x86_64                                       4.010-1.el5.rf                                          rpmforge                                       225 k
 perl-DBI                                              x86_64                                       1.607-1.el5.rf                                          rpmforge                                       871 k
 perl-Net-Daemon                                       noarch                                       0.43-1.el5.rf                                           rpmforge                                        44 k
 perl-PlRPC                                            noarch                                       0.2020-1.el5.rf                                         rpmforge                                        33 k

Transaction Summary
=================================================================================================================================================================================================================
Install      9 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

remiだけだったぽい。

ここにある、mysqlとmysql-serverは普通にmysqlをインストールする時のパッケージ。mysqldとmysqlクライアント。
MySQL Clusterには、管理ノード、データノード、SQLノードとあるのですが、そのうちSQLノードがmysqldとかです。

管理ノードは所謂管理ツール。クラスタ状態だとかmysqldだとかを管理してる。

データノードがデータを保存する場所。メモリ上に保存している模様。ファイル保存しないのかな?

SQLノードがmysqld。データノードからデータを取得したりSQLを解析したり、それをプログラムに渡してあげたり。
いつもだとテーブルのエンジンはMyISAMやInnoDBですが、これをNDBCLUSTERにするだけでいいのです。

さくっとインストールを終えて簡単に設定。

vi /etc/my.cnf

[mysqld]
ndbcluster
ndb-connectstring="127.0.0.1"

default-character-set=utf8

[ndbd]
ndb-connectstring=127.0.0.1

[mysql_cluster]
ndb-connectstring=127.0.0.1

[mysql]
default-character-set=utf8

vi /var/lib/mysql-cluster/config.ini

[NDBD DEFAULT]
NoOfReplicas: 1
IndexMemory=30M

[MGM DEFAULT]
PortNumber: 1186

[NDB_MGMD]
Id: 1
HostName: 127.0.0.1
ArbitrationRank: 1
DataDir: /var/lib/mysql-cluster

[NDBD]
Id: 21
HostName: 127.0.0.1
DataDir: /var/lib/ndb/data

[NDBD]
#Id: 22
#HostName: 192.168.0.12
#DataDir: /var/lib/ndb/data

[MYSQLD]
Id: 31
HostName: 127.0.0.1

[MYSQLD]
[MYSQLD]
[MYSQLD]

必要なディレクトリを作っておく。

mkdir -p /var/lib/ndb/data
chown -R mysql:mysql /var/lib/ndb

これじゃあまりMySQL Clusterの実感ないけどとりあえず起動。

service ndb_mgmd start
service ndbd start
service mysqld start

状態を見てみる。

ndb_mgm
> show
Connected to Management Server at: 127.0.0.1:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	1 node(s)
id=21	@127.0.0.1  (Version: 5.1.34, Nodegroup: 0, Master)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@127.0.0.1  (Version: 5.1.34)

[mysqld(API)]	4 node(s)
id=31	@127.0.0.1  (Version: 5.1.34)
id=32 (not connected, accepting connect from any host)
id=33 (not connected, accepting connect from any host)
id=34 (not connected, accepting connect from any host)

おー

次回は複数のサーバーで複数のノードを設定してみよう。

まだまだ調べることいっぱいあるね。

Passengerがnginxで使えるみたい。

nginxモジュールをインストールする際にnginxをダウンロードするかどうか聞かれました。
ソースからnginxをインストールしているなら、そのディレクトリを指定すればよいらしいけど、ちょっと前にnginxをyumからに変えていたので一旦削除。

sudo gem install passenger
passenger-install-nginx-module

(略

Automatically download and install Nginx?

Nginx doesn't support loadable modules such as some other web servers do,
so in order to install Nginx with Passenger support, it must be recompiled.

Do you want this installer to download, compile and install Nginx for you?

 1. Yes: download, compile and install Nginx for me. (recommended)
    The easiest way to get started. A stock Nginx 0.6.37 with Passenger
    support, but with no other additional third party modules, will be
    installed for you to a directory of your choice.

 2. No: I want to customize my Nginx installation. (for advanced users)
    Choose this if you want to compile Nginx with more third party modules
    besides Passenger, or if you need to pass additional options to Nginx's
    'configure' script. This installer will  1) ask you for the location of
    the Nginx source code,  2) run the 'configure' script according to your
    instructions, and  3) run 'make install'.

Whichever you choose, if you already have an existing Nginx configuration file,
then it will be preserved.

Enter your choice (1 or 2) or press Ctrl-C to abort: 1

(略

ほとんどreturnキー押して終了。

/opt/nginx以下にファイルができます。

conf/nginx.confに以下が記述されてます。

http {
    ...
    passenger_root /usr/local/ruby/lib/ruby/gems/1.8/gems/passenger-2.2.4;
    passenger_ruby /usr/local/ruby/bin/ruby;
    ...
}

あとはvirtual.confとか作って、

server {
   listen 80;
   server_name www.yourhost.com;
   root /somewhere/public;   # <--- be sure to point to 'public'!
   passenger_enabled on;
}

こんな風に書けばいいようで。

passengerのモジュールインストール中に説明してくれるので親切。

で、今回はSinatraを使っているのでSinatraアプリ以下にconfig.ruをつくり、publicとtmpディレクトリを用意。

起動ファイルはyumでインストールした時のものを流用します。

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/opt/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"

# [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

起動したり終了したりが楽。

/etc/init.d/nginx start
/etc/init.d/nginx stop
/etc/init.d/nginx restart

わぁー

やっぱメモリは喰うのね。。

ぼくもまだよくわかりませんが、ProcessingとはiTunesとかMediaPlayerとかスクリーンセーバーみたいな視覚的なものをプログラミングで簡単にデザインできる環境みたいです。

とにかくやってみた方が早い気がする。

http://processing.org/

DownloadからMac OSXをダウンロードします。

インストールしたら早速起動。

こんな画面が立ち上がる。

mainwindow

予備知識もないのでサイトのドキュメントからちょこっと試す。
そのままエディタ上にコードを書くだけ。

まるを描いてみる。

size(400, 400);
ellipse(100, 100, 200, 200);

draw1

線を引いてみる。

size(400, 400);
background(192, 64, 0);
stroke(255);
line(150, 25, 270, 350);

draw2

マウスを動かすと放射線みたいな線が引かれる。

void setup(){
  size(400, 400);
  background(192, 64, 0);
  stroke(255);
}

void draw(){
  line(150, 25, mouseX, mouseY);
}

draw5

マウス動かす毎に背景かえてみる。

void setup(){
  size(400, 400);
  stroke(255);
}

void draw(){
  background(192, 64, 0);
  line(150, 25, mouseX, mouseY);
}

マウスをクリックとか。

void setup(){
  size(400, 400);
  stroke(255);
}

void draw(){
  line(150, 25, mouseX, mouseY);
}

void mousePressed(){
  background(192, 64, 0);
}

いっぱいまるができる。

size(400, 400);

for(int i=0; i&lt;400; i++){
  fill(128, random(256), 255);
  float size = random(10, 20);
  ellipse(random(width), random(height), size, size);
}

draw3

なんか永久ループはいったぽいまるを描いてみる。

void setup(){
  size(400, 400);
  background(192, 64, 0);
}

void draw(){
  for(int i=0; i&lt;400; i++){
    fill(128, random(256), 255);
    float size = random(10, 20);
    ellipse(random(width), random(height), size, size);
  }
}

draw4

とまあ試してみましたが、やっている間はちょっと面白くて色々と調べてたりしました。

3Dとかもコードでかけるようです。(まだ試してませんが。。

最近ではARToolKitとかで表現できるみたい。
ライブコードをマーカーの上に3Dで表示するとかってことなのかな??

as3とかrubyでもかけるようなのでもう少し調べてみよう。
rubyでっていうのは気になるところ。

WEB+DB PRESS Vol.51

Rails特集記事のお手伝いをしましたー

いつも忘れてしまうので、とりあえずの国際化メモ。

sudo gem install amatsuda-i18n_generators
./script/generate i18n ja
./script/generate i18n en

生成されたファイル。

config/locales/translation_ja.yml #モデルまわり
config/locales/translation_en.yml

config/locales/action_view_en.yml
config/locales/active_record_en.yml
config/locales/active_support_en.yml

config/locales/ja.yml #上記の3ファイルがまとめて生成されてる?

バリデーション関係は特に弄らずそのまま。

コントローラーとかでflash[:notice]やる場合に、

flash[:notice] = t(:created_success, :model => Post.human_name)

こんな感じ。

たぶんこんなのが出る。

translation missing: ja, created_success

出たら、


vi config/locales/ja.yml
ja:
created_success: "{{model}}を作成しました。"

みたいに追加しておく。

すると、「記事を作成しました。」と表示される。

やっぱりgrowlにも通知しておきたい。

以前rspecに設定した.autotestを編集します。

# -*- ruby -*-
 require 'autotest/redgreen'
module Autotest::Growl
  def self.growl title, msg, img="~/.rails_ok.png", pri=0, sticky=""
    msg += " at #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}"
    system "growlnotify -n autotest --image #{img} -p #{pri} -m #{msg.inspect} #{title} #{sticky}"
  end

  Autotest.add_hook :ran_command do |at|
    results = [at.results].flatten.join
    ex = results[/(\d+)\s+example?/].to_i
    fa = results[/(\d+)\s+failure?/].to_i
    er = results[/(\d+)\s+error?/].to_i
    num = fa + er
    if ex &gt;= 0
      if num.to_i &gt; 0
        output = "#{fa} failures, #{er} errors"
        growl "RSpec Failed", "#{output}", "~/.rails_fail.png", 2, "-s"
      else
        growl "RSpec Passed", "#{ex} examples passed", "~/.rails_ok.png", -2
      end
    else
      growl "RSpec Errored", "errors", "~/.rails_fail.png", 2, "-s"
    end
  end

  Autotest.add_hook :ran_features do |at|
    results = [at.results].flatten.join
    sc = results[/(\d+)\s+scenario?/].to_i
    sk = results[/(\d+)\s+skipped?/].to_i
    pe = results[/(\d+)\s+pending?/].to_i
    un = results[/(\d+)\s+undefined?/].to_i
    fa = results[/(\d+)\s+failed?/].to_i
    pa = results[/(\d+)\s+passwd?/].to_i
    st = results[/(\d+)\s+step?/].to_i
    num = sk + pe + fa + un
    if sc &gt;= 0
      if num.to_i &gt; 0
        output = "#{sk} skipped, #{un} undefined, #{pe} pending, #{fa} failed"
        growl "Cucumber Failed", "#{output}", "~/.rails_fail.png", 2, "-s"
      else
        growl "Cucumber Passed", "#{sc} scenarios, #{st} steps passed", "~/.rails_ok.png", -2
      end
    else
      growl "Cucumber Errored", "errors", "~/.rails_fail.png", 2, "-s"
    end
  end
end

いい感じ。