Vagrantで開発環境

http://www.vagrantup.com/
ここからdmgをダウンロードしてインストールする。

.zshrcに
export PATH=/Application/vagrant/bin:$PATH
を追加しておく。

VirtualBoxは導入済み。

vagrantで使うboxのリスト。
http://www.vagrantbox.es/

適当なものをチョイス。

> vagrant box add centos_64_nocm http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210-nocm.box
> vagrant box list
centos_64_nocm (virtualbox)

サーバ起動の準備

> mkdir develop
> cd develop
> vagrant init centos_64_nocm

Vagrantfileを編集する。
今回は自分のmacから開発環境をつくるのが目的なのでブリッジ接続することにした。

> vi Vagrantfile
config.vm.network :public_network

固定にするなら

config.vm.network :private_network, ip: "192.168.0.124"

メモリの設定をする。

config.vm.provider :virtualbox do |vb|
  vb.customize ["modifyvm", :id, "--memory", "1024"]
end

起動する。

> vagrant up

途中で、

[default] Available bridged network interfaces:
1) en1: Ethernet 2 (AirPort)
2) en0: Ethernet 1
3) p2p0
What interface should the network bridge to? 1

と聞かれるので1を入力。

サーバに入る。

> vagrant ssh
[vagrant@localhost ~]$ pwd
/home/vagrant
[vagrant@localhost ~]$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:B1:58:9A
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:feb1:589a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:569 errors:0 dropped:0 overruns:0 frame:0
          TX packets:356 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:56092 (54.7 KiB)  TX bytes:46757 (45.6 KiB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:94:8D:7F
          inet addr:192.168.0.124  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe94:8d7f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:408 errors:0 dropped:0 overruns:0 frame:0
          TX packets:97 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:52461 (51.2 KiB)  TX bytes:13714 (13.3 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

macからsshしてみる。パスワードはユーザ名と一緒みたい。

> ssh vagrant@192.168.0.124

ここにansible-playbookで環境を流す。
vagrant pluginでansibleと連携できるみたいだけど、今回は以前つくったplaybookを流す。

(ansible-env)> ansible-playbook -i develop develop.yml -K -v

環境ができたらvagrantのboxを作成しておく。

> vagrant package

package.boxというファイルができるのでこれをdropboxかどこかで開発者に共有してもらって、

> vagrant add develop http://共有したURL/package.box

みたいな感じで環境がすぐできる。

次回はvagrantでAWSとvSphere(切実)の連携を予定。

nginx + spdy + pagespeed + passenger + ruby2.0 + rails4 + varnish

という構成のログ。

nginxのconfigure –hlepとpassenger-install-nginx-mobule –helpをみるとこんな感じ。

passenger-install-nginx-module --help
Usage: passenger-install-nginx-module [options]

Options:
        --auto                       Automatically confirm 'Press ENTER to
                                     continue' prompts.
        --prefix=DIR                 Use the given Nginx install prefix instead
                                     of asking for it interactively.
        --auto-download              Download and install Nginx automatically,
                                     instead of asking interactively whether to
                                     download+install or to use an existing
                                     Nginx source directory.
        --nginx-source-dir=DIR       Compile and install Nginx using the given
                                     Nginx source directory, instead of
                                     interactively asking to download+install
                                     or to use an existing Nginx source
                                     directory. Conflicts with --auto-download.
        --extra-configure-flags=STRING
                                     Pass these extra flags to Nginx's
                                     'configure' script, instead of asking for
                                     it interactively. Specify 'none' if you
                                     do not want to pass additional flags but do
                                     not want this installer to ask
                                     interactively either.
./configure --help

  --help                             print this message

  --prefix=PATH                      set installation prefix
  --sbin-path=PATH                   set nginx binary pathname
  --conf-path=PATH                   set nginx.conf pathname
  --error-log-path=PATH              set error log pathname
  --pid-path=PATH                    set nginx.pid pathname
  --lock-path=PATH                   set nginx.lock pathname

  --user=USER                        set non-privileged user for
                                     worker processes
  --group=GROUP                      set non-privileged group for
                                     worker processes

  --builddir=DIR                     set build directory

  --with-rtsig_module                enable rtsig module
  --with-select_module               enable select module
  --without-select_module            disable select module
  --with-poll_module                 enable poll module
  --without-poll_module              disable poll module

  --with-file-aio                    enable file AIO support
  --with-ipv6                        enable IPv6 support

  --with-http_ssl_module             enable ngx_http_ssl_module
  --with-http_spdy_module            enable ngx_http_spdy_module
  --with-http_realip_module          enable ngx_http_realip_module
  --with-http_addition_module        enable ngx_http_addition_module
  --with-http_xslt_module            enable ngx_http_xslt_module
  --with-http_image_filter_module    enable ngx_http_image_filter_module
  --with-http_geoip_module           enable ngx_http_geoip_module
  --with-http_sub_module             enable ngx_http_sub_module
  --with-http_dav_module             enable ngx_http_dav_module
  --with-http_flv_module             enable ngx_http_flv_module
  --with-http_mp4_module             enable ngx_http_mp4_module
  --with-http_gunzip_module          enable ngx_http_gunzip_module
  --with-http_gzip_static_module     enable ngx_http_gzip_static_module
  --with-http_random_index_module    enable ngx_http_random_index_module
  --with-http_secure_link_module     enable ngx_http_secure_link_module
  --with-http_degradation_module     enable ngx_http_degradation_module
  --with-http_stub_status_module     enable ngx_http_stub_status_module

  --without-http_charset_module      disable ngx_http_charset_module
  --without-http_gzip_module         disable ngx_http_gzip_module
  --without-http_ssi_module          disable ngx_http_ssi_module
  --without-http_userid_module       disable ngx_http_userid_module
  --without-http_access_module       disable ngx_http_access_module
  --without-http_auth_basic_module   disable ngx_http_auth_basic_module
  --without-http_autoindex_module    disable ngx_http_autoindex_module
  --without-http_geo_module          disable ngx_http_geo_module
  --without-http_map_module          disable ngx_http_map_module
  --without-http_split_clients_module disable ngx_http_split_clients_module
  --without-http_referer_module      disable ngx_http_referer_module
  --without-http_rewrite_module      disable ngx_http_rewrite_module
  --without-http_proxy_module        disable ngx_http_proxy_module
  --without-http_fastcgi_module      disable ngx_http_fastcgi_module
  --without-http_uwsgi_module        disable ngx_http_uwsgi_module
  --without-http_scgi_module         disable ngx_http_scgi_module
  --without-http_memcached_module    disable ngx_http_memcached_module
  --without-http_limit_conn_module   disable ngx_http_limit_conn_module
  --without-http_limit_req_module    disable ngx_http_limit_req_module
  --without-http_empty_gif_module    disable ngx_http_empty_gif_module
  --without-http_browser_module      disable ngx_http_browser_module
  --without-http_upstream_ip_hash_module
                                     disable ngx_http_upstream_ip_hash_module
  --without-http_upstream_least_conn_module
                                     disable ngx_http_upstream_least_conn_module
  --without-http_upstream_keepalive_module
                                     disable ngx_http_upstream_keepalive_module

  --with-http_perl_module            enable ngx_http_perl_module
  --with-perl_modules_path=PATH      set Perl modules path
  --with-perl=PATH                   set perl binary pathname

  --http-log-path=PATH               set http access log pathname
  --http-client-body-temp-path=PATH  set path to store
                                     http client request body temporary files
  --http-proxy-temp-path=PATH        set path to store
                                     http proxy temporary files
  --http-fastcgi-temp-path=PATH      set path to store
                                     http fastcgi temporary files
  --http-uwsgi-temp-path=PATH        set path to store
                                     http uwsgi temporary files
  --http-scgi-temp-path=PATH         set path to store
                                     http scgi temporary files

  --without-http                     disable HTTP server
  --without-http-cache               disable HTTP cache

  --with-mail                        enable POP3/IMAP4/SMTP proxy module
  --with-mail_ssl_module             enable ngx_mail_ssl_module
  --without-mail_pop3_module         disable ngx_mail_pop3_module
  --without-mail_imap_module         disable ngx_mail_imap_module
  --without-mail_smtp_module         disable ngx_mail_smtp_module

  --with-google_perftools_module     enable ngx_google_perftools_module
  --with-cpp_test_module             enable ngx_cpp_test_module

  --add-module=PATH                  enable an external module

  --with-cc=PATH                     set C compiler pathname
  --with-cpp=PATH                    set C preprocessor pathname
  --with-cc-opt=OPTIONS              set additional C compiler options
  --with-ld-opt=OPTIONS              set additional linker options
  --with-cpu-opt=CPU                 build for the specified CPU, valid values:
                                     pentium, pentiumpro, pentium3, pentium4,
                                     athlon, opteron, sparc32, sparc64, ppc64

  --without-pcre                     disable PCRE library usage
  --with-pcre                        force PCRE library usage
  --with-pcre=DIR                    set path to PCRE library sources
  --with-pcre-opt=OPTIONS            set additional build options for PCRE
  --with-pcre-jit                    build PCRE with JIT compilation support

  --with-md5=DIR                     set path to md5 library sources
  --with-md5-opt=OPTIONS             set additional build options for md5
  --with-md5-asm                     use md5 assembler sources

  --with-sha1=DIR                    set path to sha1 library sources
  --with-sha1-opt=OPTIONS            set additional build options for sha1
  --with-sha1-asm                    use sha1 assembler sources

  --with-zlib=DIR                    set path to zlib library sources
  --with-zlib-opt=OPTIONS            set additional build options for zlib
  --with-zlib-asm=CPU                use zlib assembler sources optimized
                                     for the specified CPU, valid values:
                                     pentium, pentiumpro

  --with-libatomic                   force libatomic_ops library usage
  --with-libatomic=DIR               set path to libatomic_ops library sources

  --with-openssl=DIR                 set path to OpenSSL library sources
  --with-openssl-opt=OPTIONS         set additional build options for OpenSSL

  --with-debug                       enable debug logging

で以下ログ。002_pagespeed.shと005_nginx_passenger.shがちょっと詰まりそうなところ。

varnishがちょっと宙ぶらりん。

Ansible on OSX

Chefがゴツいというか大げさな感じがしてきたので、Ansibleにしようかなと。
ドキュメントは以下。
http://www.ansibleworks.com/docs/

感覚的にはcapistranoでシェルスクリプトとかコマンドをリモートに実行させたり、レシピを書いてゴニョゴニョできる感じなのかな。
そういうのわりとすき。

コマンドラインではなくブラウザからできそうな、AnsibleWorks AWXというのもある。
http://www.ansibleworks.com/ansibleworks-awx/

コマンドラインからやってみよう。

https://weluse.de/blog/installing-ansible-on-os-x.html
大体上記に書いてあるやり方でOSXに設定できるのですが、うまくいかないことがあるので以下。

pythonのバージョンは、ansibleを実行するOSX上は2.7
サーバー側は2.6以上でないとそのまま実行できないっぽい。
centos5とかだと2.4なので、以下をインストールしておく

remote$ yum install python-simplejson

sshの鍵認証でログインできるようにしておく。
別にパスワードでもいいみたいだけど、あまりないかな。

osxで作業。

> python --version
Python 2.7.5

> easy_install virtualenv
> virtualenv ansible-env
> source ansible-env/bin/activate
(ansible-env)> easy_install pip
(ansible-env)> pip install paramiko PyYAML jinja2
(ansible-env)> pip install ansible
(ansible-env)> export ANSIBLE_HOSTS=~/.ansible/hosts

準備完了。hostsを作成して実行先を書く。centosとかなら/etc/ansible/hostsでいいみたい。

(ansible-env)> vim ~/.ansible/hosts
localhost

[testserver]
192.168.100.5
192.168.100.6:22222
192.168.100.7:22222

[hoge]
hoge.runeleaf.jp

sshのポートが22以外ならそれも書く。
.ssh/configの設定をみてくれてると思ったのだけれど、微妙に見ていないところがある?
サーバーの実行ユーザーは、ansibleコマンドを実行するユーザーと合わせておくとよいかも。
ユーザーの指定もできる。

(ansible-env)> ansible
Usage: ansible <host-pattern> [options]

Options:
  -a MODULE_ARGS, --args=MODULE_ARGS
                        module arguments
  -k, --ask-pass        ask for SSH password
  -K, --ask-sudo-pass   ask for sudo password
  -B SECONDS, --background=SECONDS
                        run asynchronously, failing after X seconds
                        (default=N/A)
  -C, --check           don't make any changes, instead try to predict some of
                        the changes that may occur
  -c CONNECTION, --connection=CONNECTION
                        connection type to use (default=smart)
  -f FORKS, --forks=FORKS
                        specify number of parallel processes to use
                        (default=5)
  -h, --help            show this help message and exit
  -i INVENTORY, --inventory-file=INVENTORY
                        specify inventory host file
                        (default=/Users/kawashima/.ansible/hosts)
  -l SUBSET, --limit=SUBSET
                        further limit selected hosts to an additional pattern
  --list-hosts          dump out a list of hosts matching input pattern, does
                        not execute any modules!
  -m MODULE_NAME, --module-name=MODULE_NAME
                        module name to execute (default=command)
  -M MODULE_PATH, --module-path=MODULE_PATH
                        specify path(s) to module library
                        (default=/Users/kawashima/works/srv/ansible-
                        env/bin/../share/ansible/)
  -o, --one-line        condense output
  -P POLL_INTERVAL, --poll=POLL_INTERVAL
                        set the poll interval if using -B (default=15)
  --private-key=PRIVATE_KEY_FILE
                        use this file to authenticate the connection
  -s, --sudo            run operations with sudo (nopasswd)
  -U SUDO_USER, --sudo-user=SUDO_USER
                        desired sudo user (default=root)
  -T TIMEOUT, --timeout=TIMEOUT
                        override the SSH timeout in seconds (default=10)
  -t TREE, --tree=TREE  log output to this directory
  -u REMOTE_USER, --user=REMOTE_USER
                        connect as this user (default=kawashima)
  -v, --verbose         verbose mode (-vvv for more)
  --version             show program's version number and exit

pingモジュールを実行してみる。

(ansible-env)> ansible testserver -m ping
192.168.100.5 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.100.6 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.100.7 | success >> {
    "changed": false,
    "ping": "pong"
}

コマンド送ってみる。

(ansible-env)> ansible testserver -a "uptime"
192.168.100.5 | success | rc=0 >>
 14:07:20 up 35 days,  8:08,  1 user,  load average: 0.00, 0.00, 0.00

192.168.100.6 | success | rc=0 >>
 14:07:20 up 35 days,  8:48,  2 users,  load average: 0.00, 0.00, 0.00

192.168.100.7 | success | rc=0 >>
 14:06:50 up 141 days,  3:54,  1 user,  load average: 0.08, 0.08, 0.08

yum install vimしてみる。

(ansible-env)> ansible testserver -m yum -a "name=vim-enhanced state=installed"
192.168.100.5 | FAILED >> {
    "changed": true,
    "msg": "You need to be root to perform this command.\n",
    "rc": 1,
    "results": [
        ""
    ]
}

192.168.100.6 | success >> {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "vim-enhanced-2:7.2.411-1.8.el6.x86_64 providing vim is already installed"
    ]
}

192.168.100.7 | success >> {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "vim-enhanced-2:7.2.411-1.8.el6.x86_64 providing vim is already installed"
    ]
}

.6と.7にはインストールされてたみたいですが、.5にはなくてrootで実行しろ的な。

(ansible-env)> ansible testserver -m yum -a "name=vim-enhanced state=installed" -K
192.168.100.5 | success >> {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "\n================================================================================\n Package              Arch         Version                   Repository    Size\n================================================================================\nInstalling:\n vim-enhanced         i386         2:7.0.109-7.2.el5         base         1.2 M\n\nTransaction Summary\n================================================================================\nInstall       1 Package(s)\nUpgrade       0 Package(s)\n\nTotal download size: 1.2 M\n\nInstalled:\n  vim-enhanced.i386 2:7.0.109-7.2.el5                                           \n\n"
    ]
}

192.168.100.6 | success >> {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "vim-enhanced-2:7.2.411-1.8.el6.x86_64 providing vim is already installed"
    ]
}

192.168.100.7 | success >> {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "vim-enhanced-2:7.2.411-1.8.el6.x86_64 providing vim is already installed"
    ]
}

1台だけ実行したければ、testserverの部分を192.168.100.5にすればOK。
デフォルトで並列実行が5のようなので、もっと台数があるなら-fで指定する。

これら一連の作業を自動的に構成するのがplaybookと。
ヘルプはansible-playbook -hで、各モジュールのヘルプはansible-doc yumとかansible-doc commandとかで確認できる。

実行する。

(ansible-env)> ansible-playbook develop.yml -K -v

make && make installみたいにコンパイルしているところはモジュールにしてしまうのがいいのかな。

playbookの中身はこんな感じ。

Infrastructure as Code!

[追記]
Best Practicesみてちょっと変えてみたり。
https://github.com/runeleaf/ansible-playbook

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で接続確認してクライアント側はおわり。

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

CentOS, MySQL Clusterを楽々設定したい

苦労して色々試してみた結果、さっくり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)

おー

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

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

Linux, yumの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

remiはenabled=0なので1にしておきました。