ページ

2012年6月1日金曜日

UbuntuにGithub連携Redmineサーバを立てる

とにかく急いでRedmineと戯れたい人向けです。

目標は
  • Ubuntu 12.04上にとにかく簡単に構築する
  • Webricを使い、Redmineをport 80に立ち上がらせる
  • githubで公開しているrepositoryと連携させる
構築のポイントは
  • redmineのインストールと設定
    インストール方法が乱立しておりますが、簡単なaptで入れます。
  • redmineのgithub対応設定
    githubと連携するためのpluginを入れます。
  • githubからredmineサーバへ更新情報転送設定
    上記pluginへの入力として、githubから更新情報を自動的に送信するgithub側の設定をします。
の3点です。
それでは、行きます。

1.  Redmineをサーバにinstall 
aptで必要なファイルをインストール
$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:ondrej/redmine
$ sudo apt-get update
$ sudo apt-get install redmine redmine-mysql

起動スクリプト作成
/etc/init/redmine.conf
-----
# Redmine
description "Redmine"

start on runlevel [2345]
stop on runlevel [!2345]

expect daemon
exec ruby1.8 /usr/share/redmine/script/server webrick -e production -b 0.0.0.0 --port 80 -d 
-----

起動
$ sudo service redmine start

この段階でredmineのWeb serverがport 80 (HTTP)に立ち上がっています。
browserにサーバのIPを入力すれば、見えるはずなので確認してください。

参考: http://www.redmine.org/projects/redmine/wiki/HowTo_Install_Redmine_in_Ubuntu

2. Redmine上でプロジェクト作成
github上のrepositoryに対応したredmineのプロジェクトを作成します。
管理者権限などredmine の使い方は、ここでは説明しません。
redmine helpなどを参考にしてください。
  • Projects -> New Projectで、新しいプロジェクトを作成します。
  • 中身は適当で良いですが、Identifierの値は後で使います。
3. Redmineのgithub対応設定
 redmine server用github hookを設定することにより、githubからの更新情報を受けとることができるようにします。
githubから自動的に更新情報を送信させる設定は、もう少し下でします。
$ sudo gem install json
$ cd /usr/share/redmine
$ sudo ruby1.8 script/plugin install git://github.com/koppen/redmine_github_hook.git
$ Redmine を再起動

4. Redmineがローカルで管理するgithubのremote repository設定
githubのrepository内容のミラーリングです。redmineは上記hookでgithubから送られてきた更新情報を元にこのremote repositoryを更新します。
$ cd /var/redmine/git_repositories
$ git clone --mirror git://github.com/<git_user>/<project>.git

次に、ミラーリングした/var/redmine/git_repositories/<project>.git ディレクトリをRedmineで管理するプロジェクトのリポジトリとして設定します。
  • 2.で作成したプロジェクトのSettingsを表示します。
  • Repositoryタブを選択します。
  • SCM: Gitを選択
  • Path to Repository: /var/redmine/git_repositories/<project>.git
この段階で、プロジェクトにRepositoryタブが現れ、中身が見えるようになるはずです。

5. Githubからredmineサーバへ更新情報転送設定
  • github のプロジェクトのAdmin->Service Hooks->WebHook URLsを選択
  • URLに、http://<redmine server ip>/github_hook?project_id=<project id>を入力
  • Update Settings
上記のようにURLには、Redmine の URL に "/github_hook" をくっつけたものを入力します。また、オプションとして?project_id=<project id>をつけておけば間違いないです。
<project id>には、2.でIdentifierに設定した値を入れます。

設定は以上です。

以後、Github へのpush は自動的にredmine serverへ転送され、redmineが管理しているremote(mirror) repositoryが更新されます。更新されない場合は、5.の設定が正しくない可能性があります。

2012年5月29日火曜日

さくらVPSのUbuntuを10.04から12.04にアップデート

さくらVPSのUbuntu10.04アップデートメモです。
ポイントは2点。
  1. grubの設定アップデートを確実に
  2. resolv.conf自動生成の再設定

1. grubの設定アップデートを確実に

Ubuntuのアップデートは、基本的には
sudo do-release-upgrade -d
を実行後、ひたすらYesで問題はありません。が、唯一grubの設定だけはさくらサーバ向け(VPS向け?)設定をしておかないとreboot後立ち上がりません。
(grub promptがさびしく表示される事になります)

このgrubの設定とは

  1. "grubを最新にする" or" 既存のままにする"など4択ぐらいの選択肢が出た際、上位2つのどちらかを選択します。
  2. "Continue without installing GRUB?"と聞かれますので、ここで"No"を選択します。
  3. その後、grubのインストール先を聞かれるので、"/dev/vda"を選択します。


参考: http://d.hatena.ne.jp/tilfin/20120330/1333108053


2.  resolv.conf自動生成の再設定


アップデート後、普通に再起動させると名前が引けなくなっていると思います。原因は、/etc/resolv.conf設定が消えているためです。

Ubuntuは、resolv.confを起動スクリプトでごにょごにょ置き換える仕組み(/etc/init/resolvconf.conf)を導入しているようなのですが、その際使用する設定値が消えているために本現象が起きています。よって、これを再設定します。

設定するファイルは"/etc/resolvconf/resolv.conf.d/base"
内容は
---
search sakura.ne.jp
nameserver 210.188.224.10
nameserver 210.188.224.11
---
再起動、または再読み込み("sudo resolvconf -u")すれば、/etc/resolv.confが復活します。


参考: http://blog.libero-tecnologia.net/?p=6

2012年3月31日土曜日

MiniatureGarden using Ogre

IrrlichtからOgre3Dへの移行を始めてはや半年。
やっといろいろ遊べる形になってきました。
まずは、サッカーでも作って基本的な機能を揃えたいところです。



CPU: Intel(R) Core(TM) i3 CPU  530  @ 2.93GHz
Mem: 2G
Video: GeForce 7600 GS
OS: Ubuntu

Ogre3Dは、影を使った時の性能がIrrlichtより圧倒的に良いですね。
まだ速度的な最適化をやっていないのに、影を入れたまま11vs11で遊べそうです。



2012年3月29日木曜日

シャギーなアニメーションになったら

Boneに関連付けられていない(Vertex Groupに所属していない)浮いているVertexがあるMeshをOgre Mesh Exporterなどでexportさせてアニメーションさせると下図のように飛び出ることがあります。



対策: どこかのVertex GroupにAssignさせてあげると解決します。


2012年3月21日水曜日

blender 2.62 で ogre mesh を exportする

Blender 2.5 exportの最新版を使ってmeshを出力する事に少し手間取ったのでメモ。

1. 最新のexporterは、最新のtreeにあるので
 hg clone https://bitbucket.org/sinbad/ogre
2. Tools/Blender2.5Export/の下にある全ファイルをblenderのaddonを置く場所にコピー
    例えば、blender/blender-2.62-linux-glibc27-i686/2.62/scripts/addons/ogre_mesh_exporter/
3. blender起動
4. File->User Preference->addonsで、Ogre Mesh Exporterを有効にする
5. 再立ち上げ (いらないかな)
6. cube作る
7. cubeにMaterialを作り、名前をOgre/SkinなどのOgre環境上のMaterial Nameにしておく。
6. cubeを選択して、"T"を押す。
7. 出たメニューの下の方に、Ogre Mesh Exporterがある。
8. 書き出すパス(Export Path)指定。
8. exportボタンをぽちっと押す。
9. できたmesh.xmlをOgreXmlConverterで.meshにする

という手順で作成したmeshをOgre Engineで表示できるところまで確認。
また、Properties->ObjectData にもなにやらメニューがあるが、今のところ使い方がよく分からない。

P.S.
どうやら、Textureを適切に貼るには、UV設定にして出力する必要があるようなのですが、現在のscriptでは対応していないようです。なので、お急ぎの方はblender-2.49bとTools/BlenderExportで出力させるのが無難なようです。


参考

Good work, lf3thn4d



2012年3月19日月曜日

blenderで3D Viewにテクスチャが表示されない

プログラムの基盤環境の方の目処が立ってきたので、素材作りのためにBlender 2.6を入れてみた。1年ぶりぐらいなのですがI/Fが変わって、格好良くなっている!
(まぁ、どんなにツールが良くなっても、私のセンスじゃどうしようもないのですが...)

ところで、Texture張っても、3D Viewに表示されない (1年前もハマった気が =)ことで
1時間ぐらい浪費したので、メモ。

ググったところ、対策の7番目
7.3D View画面でNキーを押してShadingをGLSLにする
が今回の原因でした。




2012年3月4日日曜日

Swig対処メモ

Swig 2.0.4を対象としています。
  • privateコンストラクタだから生成できない
    %templateでそのクラスのwrapperを作成している。(wrapper作るとinstantつくるので)
    対策: wrapperを作らない。必要なら、コンストラクタをpublicに置いたclassをswig用interfaceファイル内で再定義。
  • allocate がかぶる
    wrapper作成対象クラスにallocate関数があると、swigが内部生成するallocate関数とかぶる模様。
    対策: クラスのallocate関数を%rename。
  • typedefで定義された別名クラス名でインスタンスは作れない
    そもそも、その別名クラス名のwrapperが作成されない。(元の型と別名型の共通性はswig内で管理されている)
    対策: 元の名前のクラスを使う。
  • template内typedefを利用した何か
    概ねswigでうまく扱えない。もしかしたらできるのかもしれないが、%templateの展開地獄と型不一致地獄に延々巻き込まれるので、精神衛生上swigのversion upを待った方が良い。(2.0.5でtypedef絡みのpatchがありそうなので)。
    対策: そのクラスのwrappingを諦める。伝家の宝刀 %extendを使い、その諦めたクラスを使っているクラスに諦めたクラスに対する代替I/Fを追加する。
    • 例1: map::mapped_typeを使ってごちゃごちゃするOgre::MapIterator
      対策: Managerクラス内のデータ参照に使っているので、Managerクラスにeach_datatypeを作る。
    • 例2: Ogre::vector::typeを使うStringVector
      対策: StringVector自体は、RubyのArrayと等価。なので、StringVectorの代わりにArrayを受け取る/返す操作をするI/Fを追加する。もしくはArrayの代わりに別途StringVectorを内部で使用している新しいクラスを自作、それ向けのI/Fを同様に追加。
  • Listener/Handler対策
    C++側にListenerクラスを継承したRubyクラスを登録し、C++側からRuby側のクラスを呼び出すタイプの話。SwigのドキュメントのCross language polymorphismに対策が書いてある。
    対策
    1. トップの%moduleにdirectors="1"
      %module(directors="1") "MyNameSpace"
    2. Ruby側で継承するListenerクラスwrapperにdirector
      %feature("director") Ogre::FrameListener;

2012年2月25日土曜日

再びswigと戦う

もう単純な手動ラッパー生成作業など、いやじゃぁ!
もっとおもしろいことしたいんじゃ。

前回の敗因は、「対処が綺麗じゃない」みたいな軟弱さにちがいない。
今回は手段を問わず、生成コードにパッチをあててでも完遂させていただきます。

2012年2月3日金曜日

ruby 拡張ライブラリのクラス定義の一部をrdocが認識してくれない時のメモ そ の2

以前書いた、C++コードで書いたruby wrapperのrdocに関する話の続き。

同じファイルに
ogre = rb_define_module_under(mg, "Ogre");
klass_= rb_define_class_under(ogre, "AnimationBlender", rb_cObject);

と書いていたものを、別々のファイルに置いて
-- fileA.cc ---
ogre = rb_define_module_under(mg, "Ogre");
AnimationBlenderWrapper::init(ogre);
----------------

--- fileB.cc ---
void
AnimationBlenderWrapper::init(VALUE module) {
klass_= rb_define_class_under(module, "AnimationBlender", rb_cObject);
}
-----------------

とした途端、
Enclosing class/module 'module' for class AnimationBlender not known
と言われた時のメモ。

rdocのcのパーサ(c.rb)のmoduleやclassの認識で気をつけておくべき点は以下3つ。

  1. moduleやclassの定義は、その名前と返り値を格納した変数名がセットで覚えられている。なにを言っているのか自分でもよく分からないが、つまり
    ogre = rb_define_module_under(mg, "Ogre"); と記述した場合。
    "Ogre"と言う名前と"ogre"という返り値がまずセットで覚えられる。

  2. class定義などで指定する上位class/module objectのVALUE変数名は、1の返り値を格納した変数名と同じである必要がある。klass_= rb_define_class_under(module, "AnimationBlender", rb_cObject);と書くと、rdocは上位のclass/module名を特定するために"module"という変数名とセットになっている名前を探しに行く。該当する変数名に返り値を格納した定義が無いとそのセットは記録されていないので、上記のようなエラーになる。正しく認識させるためには
    --- fileB.cc ---
    AnimationBlender::init(VALUE ogre) {
    klass_= rb_define_class_under(ogre, "AnimationBlender", rb_cObject);
    }
    -----------------

    として、そのclass/moduleを定義した時の変数名と一致させる必要がある。

  3. パーサは、判断を先送りにはしない男らしい設計
    上記を対処しても、fileA.ccより、fileB.ccを先にパーサが読み込んでしまうと
    Enclosing class/module 'ogre' for class AnimationBlender not known
    と言われる。なので
    rdoc   fileA.cc fileB.cc
    と順序性を指示してあげる必要がある。

2012年1月29日日曜日

Ogre3Dのruby wrapper

Swig


Swigを使って自動生成を試みたところ、以下の2点の対処が困難。途中からSwigのコード解析をする羽目になり、人力で必要な部分だけwrapperを書いた方が早い気がしてきたので断念。

  • ネストされたネームスペースがうまく扱えない。

  • ネストされたテンプレートの展開が大変


それぞれ暫定対処があるものの、Iterator関係で両方絡んでくると、なかなか思い通りのwrapperコードが生成されず、発狂しそうになる。コードの自動生成ではよくあること。自動コード生成の試み自体は好きなので、嫌いになる前に、そっと距離を置くことにした...

Ogre.rb


Rice及びgccxmlを使ったruby wrapper生成プログラム(Rb++)を作成した作者自身が、それらのツールをOgre1.7.1に適用して生成したもの。とても便利なツール群を使った自動生成環境なのですが、Ogre1.7.4で試した際に以下の問題があり断念。

  • 使用しているRiceの制限で、コンストラクタを一つだけ選択する必要がある。

  • gccxmlのtr1 parse問題のためにOgre3Dのコードにパッチを当てる必要がある。

  • template系でコード生成エラーが出るため対象から外さないといけないlass/methodあり。

  • ネストされたtemplateクラス用wrapperコードのファイル名が254バイトを超え、書き出せない。

  • 単一ファイル生成モードによる回避を図ったが、gccxmlのファイル書き出し最中にError。


こちらもコード生成ツールのデバッグモードに突入。また、コード生成に必要なツールが多く、それぞれの動作を追いかけるのが少々面倒くさい。こちらも、再び気が向くまでそっとしておくことにした...

Libogre-ruby


普通に人力wrapperを作成しているが、まだ完成していない。進捗度は自作のwrapperと大差なく、開発も止まっているようなので、遠くから見守ることにした...

まとめ


ざっとググってみたが、意外に少なく、また今のところ決定打が見当たらない。C++からのruby wrapper自動生成に関しては、Ogre3Dで多用しているtemplateとネストの対処が鬼門のようで、皆さん苦労しているように見受けられる。人力生成は途中で飽きてくるため、各自必要な部分だけ作ったら止めてしまっているようだ。 どれかを手伝うのが世の中的には良い気がするが、シャイな私には無理のようだ。