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

11月 18, 2011

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接続

2月 16, 2011

ものすごく思いつきでやりました。
パスワード認証の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で接続確認してクライアント側はおわり。

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

Android, 開発環境構築メモ

8月 22, 2010

メモ。

JDK6(OSX default)
AndroidSDK

http://developer.android.com/sdk/index.htmlEclipse

Eclipse IDE 3.6
http://www.eclipse.org/downloads/Eclipse IDE for Java Developers

workspace
  help -> install new software
    add
Google Android Plugin
  https://dl-ssl.google.com/android/eclipse/eclipse restart
  preferences java compiler compiler compiance settings
    1.6
  環境設定 -> android -> SDK location
  Window -> Android SDK and AVD manager
    Available Packkeges
      all check
eclipse restart
  Window -> Android SDK and AVD manager
    Vitual Devices
      New

Mercurial, webからリポジトリ見れるようにした

7月 25, 2010

普段はsshで十分なのですが、だれかにcloneさせたいとか、pushもいちいち秘密鍵作ってもらったりとかめんどくさい。エンジニアならそうでもないんだけど。

とりあえずブラウザから見れて、hg clone http://example.com/hg/repo-name な感じにできるところまで。

mkdir -p /var/www/hg
cd /var/www/hg
cp /usr/share/doc/mercurial-1.5/contrib/hgwebdir.wsgi ./
vi /etc/httpd/conf.d/hg.conf

<VirtualHost *:80>
Servername hg.runeleaf.net
ErrorLog logs/hg.runeleaf.net-error_log
CustomLog logs/hg.runeleaf.net-access_log combined

WSGIScriptAlias /hg "/var/www/hg/hgwebdir.wsgi"

<Location /hg>
  AuthUserFile /path/to/.htpasswd
  AuthGroupFile /dev/null
  AuthName "Mercurial Server"
  AuthType Basic
  require valid-user
</Location>

<Directory /var/ww/hg>
  Options ExecCGI FollowSymlinks
  AddHandler wsgi-script .wsgi
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>
</VirtualHost>

ベーシック認証などを実際にpushするユーザー名で設定しておくと幸せになれるって話らしい。

mkdir -p /var/hg/repos/hoge
cd /var/hg/repos/hoge
hg init
cd /var/hg
vi hgweb.config

[web]
allow_push = username
push_ssl = true

[paths]
/ = /var/hg/repos/**

allow_pushでpushユーザーを制限したり、push_sslでhttps経由じゃないとだめとか。falseにするとhttpでpushできるけどオススメしているサイトはなかった。

hgweb.configの設定をwsgiスクリプトにする。

vi /var/www/hg/hgwebdir.wsgi

# コメント外す
import os
os.environ["HGENCODING"] = "UTF-8"

application = hgwebdir('/var/hg/hgweb.config')

httpd再起動して完了。

http://hg.runeleaf.net/hg にアクセスするとリポジトリの一覧がみれたり、
hg clone http://hg.runeleaf.net/hg/hoge
とかでcloneできたり。

まあpush権限なんて普通に考えたらssh経由でいいよねぇ・・

Python, rubyのsinatraっぽいjuno入れた

7月 25, 2010

インスタンスをcentos5.4から5.5に変更してたらすべて消えてしまったので、じゃあ今度はsinatraじゃないものでやろう!とポジティブシンキングで涙を飲んだ記録です。

ちなみにpythonは2.7を入れてます。/usr/local以下です。記憶してない。

easy_install juno

とすると、まず他にインストールするものがあるだろうと言われるので、それらを入れます。

easy_install Jinja2
easy_install SQLAlchemy
easy_install Mako
easy_install Werkzeug
easy_install juno

アプリケーションを作成します。

mkdir -p /var/www/runeleaf.jp/juno
cd /var/www/runeleaf.jp/juno
vi application.py
#!/usr/local/bin/python
from juno import *

init({
  'use_debugger': True,
  })

@route('/')
def index(web):
  template('home.html', title="runeleaf")

config("mode", "wsgi")
application = run()

mkdir -p static/css
mkdir templates

vi static/css/_.css
vi templates/home.html

mod_wsgiを使ってapache2で見れるようにします。

yum install mod_wsgi
vi /etc/httpd/conf.d/wsgi.conf
LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonPath /usr/local/lib/python2.7/site-packages

バーチャルホストに設定します。

NameVirtualHost *:80
<VirtualHost *:80>
    ServerName runeleaf.net
    WSGIScriptAlias / /var/www/runeleaf.jp/juno/application.py
    ErrorLog logs/runeleaf.net-error_log
    CustomLog logs/runeleaf.net-access_log combined
</VirtualHost>

httpd再起動して完了。

Subversion Mercurial, hgとsvnを連携できるようにした

6月 12, 2010

いくらMercurialを個人的に導入しても、世間はSubversionの波に逆らえず・・・

ということで連携できるようにしました。

osxなのでMacPortsでなんとかがんばる。

いきなりsudo port install py26-hgsubversionでこけたので順番にいきます。
mercurialはもうはいっている前提です。
途中でsvnが1.5から1.6になったり、Pythonが2.6になったり。注意。

すでにSubversionチェックアウト済のディレクトリは・・どうするの?
hg initして、.hg/hgrcに

[paths]
default = svn+ssh://example.com/trunk

とかいけるかな?

まあいいや。インストールと設定。

sudo port install py26-hgsubversion
#なんだかいろいろとエラーでた

sudo port -f uninstall cyrus-sasl2
sudo port install cyrus-sasl2
sudo port install subversion-python26bindings
sudo port install py26-hgsubversion

ホームディレクトリの.hgrcに

rebase = 
hgsubversion = /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/hgsubversion

適当なディレクトリで

hg clone svn+ssh://example.com/trunk example

あとはコマンドを気にせずできる。

コミット

touch test.txt
hg add .
hg ci
(hg outgoing)
hg push

取り込み

(hg incoming)
hg pull
hg update

ね。簡単でしょ?

Mercurial, mercurialでgitosisみたいなことができるmercurial-serverを入れた

5月 5, 2010

アクセスコントロールとかリポジトリ管理とかを簡単にやりたくて調べていたら見つけました。

http://www.lshift.net/mercurial-server.html

ソースコードがあったのでダウンロード&インストール

wget http://dev.lshift.net/paul/mercurial-server/mercurial-server_1.0.1.tar.gz
tar zxvf mercurial-server_1.0.1.tar.gz
cd mercurial-server_1.0.1.orig
python setup.py build
python setup.py install

root(管理者?)の公開鍵を設定しておく

mkdir -p /etc/mercurial-server/keys/root
cp pubkey /etc/mercurial-server/keys/root/admin.pub
chmod 644 /etc/mercurial-server/keys/root/admin.pub

hgユーザになって(なければ作って)初期化

su - hg
/usr/init/hginit
cp: cannot stat `/init/dot-mercurial-server': No such file or directory
/usr/init/hginit /usr

repos/hgadminが出来ている。

設定を反映する。

sudo -u hg refresh-auth

hgユーザーの~/.ssh/authorized_keysにcommand=”hg-ssh…”が追加されている。

cat .mercurial-server
# WARNING: a .mercurial-server file in your home directory means
# that refresh-auth can and will trash your ~/.ssh/authorized_keys file.

[paths]
repos = ~/repos
authorized_keys = ~/.ssh/authorized_keys
keys = /etc/mercurial-server/keys:~/repos/hgadmin/keys
access = /etc/mercurial-server/access.conf:~/repos/hgadmin/access.conf

[env]
# Use a different hgrc for remote pulls - this way you can set
# up access.py for everything at once without affecting local operations

HGRCPATH = /etc/mercurial-server/remote-hgrc.d

ディレクトリはrepos/projectnameだけど、リモートアクセスはssh://hg@example.com/projectnameとかになるのかな。

/etc/mercurial-server/access.confにルールを記述

init user=root/**
deny repo=hgadmin
write user=users/**

試しにローカルからリモートに向けてclone

mkdir hoge
cd hoge
hg init
hg clone . ssh://hg@example.com/hoge
ssh example.com
remote$ ls repos
hgadmin  hoge

OKですね。

hoge/.hg/hgrcとか編集してupdateするとかhooks設定とかできます
例えばこうとか。

[hooks]
changegroup.aaaab_update = hg update -C default > /dev/null

hgadminをcloneしてユーザー追加。さっきcloneしたhogeプロジェクトに書き込めるようにする。

hg clone ssh://hg@example.com/hgadmin
cd hgadmin
mkdir -p keys/users
touch access.conf
cp hogeuser.pub keys/users/hoge.pub
vi access.conf
write repo=hoge user=users/hoge.pub
hg add
hg ci -m 'add user'
hg push

もっといろいろ設定できるし、しなきゃいけない気がするけど、あとは下記URL参照ってことで。
http://dev.lshift.net/paul/mercurial-server/docbook.html

Mercurial, bitbucket.orgを使う

5月 1, 2010

githubのmercurial版ですね。見た目も似てる。

http://bitbucket.org

登録時にID/PASSとOpenIDのどちらか選べるので、OpenIDで登録。

http://bitbucket.org/runeleaf

githubと違ってfreeでもプライベートなリポジトリが1つ作れるようです。

windowsならhttp://tortoisehg.bitbucket.org/というTortoiseSVNのようなGUIクライアントがあるのですぐにでも試せるかと。

適当なリポジトリを作ってhg cloneします。

が、OpenIDで登録したためなのかわかりませんが、httpsでのcloneができない・・・

なので

hg clone ssh://hg@bitbucket.org/runeleaf/helo

としてcloneします。

たぶんID/PASSなら

hg clone https://runeleaf@bitbucket.org/runeleaf/helo

とかできるんじゃないカナ

sshで落とすには、これまたgithub同様公開鍵の登録が必要なので登録しておきます。
既存のアプリケーションを登録するには、

cd railsapp
hg init
hg add .
hg ci -m 'init'

vi .hg/hgrc
[paths]
default = https://runeleaf@bitbucket.org/runeleaf/helo

hg push

これで登録できた。

やりたいようなことは大体揃っているし、gitほど高機能はいらないかなって思うときはmercurial試してみるといいかもね。

Mercurial, mercurialで開発したい

4月 29, 2010

そんなわけでサクサクっとね。

osxならMacPorts、CentOSとかならyumで入れられるっぽい。

sudo port install mercurial
sudo yum install mercurial

colordiffを使ってhg diffとかに色つけておきます。

vi ~/.hgrc
[ui]
username = runeleaf
editor = /Applications/vim-app/vim

[defaults]
cdiff = -q

[extdiff]
cmd.cdiff = colordiff
opts.cdiff = 

[extensions]
hgext.color =
hgext.extdiff =
color =

[color]
status.modified = green bold underline
status.added = magenta bold underline
status.removed = red bold blue_background
status.deleted = red underline
status.unknown = blue bold
status.ignored = black bold

diff.diffline = none
diff.extended = cyan bold
diff.file_a = red bold
diff.file_b = green
diff.hunk = yellow bold
diff.deleted = blue bold
diff.inserted = green bold
diff.changed = white
diff.trailingwhitespace = bold red_background

早速試す。

mkdir test
hg init
touch README
hg add README
hg ci -m 'add'

ブランチの一覧

hg branches
default

現在のブランチ

hg branch
default

ブランチをつくる

hg branch hoge
hg branch
hoge
touch hoge.txt
hg add hoge.txt
hg ci -m 'hoge' hoge.txt
hg branches
hoge                           7:b2f824c55a16
default                        5:81220be8f479 (非アクティブ)

ブランチ切り替え

hg update default
hg branch
default

簡単ですなー

Subversion, svn statusにもcolorをつけたい

4月 29, 2010

gitとかmercurialでは色がつくのに、svnだと色がつかないのが気になって気になって・・・

http://colorsvn.tigris.org/

tar zxvf colorsvn-0.3.2.tar.gz
cd colorsvn-0.3.2
./configure
sudo make && make install
cp /etc/colorsvnrc ~/.colorsvnrc
vi .zsh/mine.zsh
alias svn=colorsvn

自分のホームに設置した.colorsvnrcで他の色に変更できるので、自分がわかりやすく編集しておくといいよ。


フォロー

Get every new post delivered to your Inbox.