Ads by Google 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | トラックバック(-) | コメント(-)

実験用に OpenPNE をインストールしてみた (Subversion で管理) 

実験用に OpenPNE をインストールしてみたの続き。

実験用のソースツリーをいろいろいじって、あとでどこを改変したのかとかがわからなくなるのは、面倒なので Subversion で管理することにした。

まず、OpenPNE 用のリポジトリをつくる。
 → openpne/
ベンダーブランチのディレクトリを作成。
 → openpne/vendor/
ベンダーブランチの current に OpenPNE-2.12.1 のツリーを展開。
 → openpne/vendor/current/
ベンダーブランチの current をバージョン番号のディレクトリにコピー。
 → openpne/vendor/2.12.1/
バージョン番号のディレクトリを trunk へコピー。
 → openpne/trunk
タグ用とブランチ用のディレクトリも作っておく。
 → openpne/tags, openpne/branches

ツリーにするとこんな感じになる。

[openpne]
+-[trunk] トランク。 openpne/vendor/2.12.1 からコピーによって作成。
+-[tags] タグ用。いまのところ空。
+-[branches] ブランチ用。いまのところ空。
+-[vendor] ベンダーブランチ。OpenPNE の公式パッケージを入れるところ。
  +-[current] 最新版の OpenPNE の公式パッケージを入れるところ。
  |               いまのところ 2.12.1。
  +-[2.12.1] OpenPNE 2.12.1 が入ってるところ。


trunk をインストールしたところに、設定ファイルとかが消えないように注意しながらチェックアウトする。
実際には、上書きは怖かったので、一時的なディレクトリに trunk を展開して、インストール済みのディレクトリと比較しながら、trunk を展開したディレクトリを、インストール済みのディレクトリと同じになるように不足ファイルをコピーして、インストール済みディレクトリに置き換えた。

一応、リポジトリで管理するための設定はこれで終わりだが、自動でいろいろとファイルが生成される var/ 以下のファイルが、svn status を実行したときに、Subversion 非管理ファイルとしてやたらたくさん表示されるので、var/ 以下のディレクトリには、svn:ignore 属性をかたっぱしにつけて非管理ファイルに Subversion が反応しないようにした。
[ 2008/06/30 00:39 ] メモ | TB(0) | CM(0)

実験用に OpenPNE をインストールしてみた 

Ubuntu on VMware の環境に、実験用に OpenPNE をインストールしてみた。

OpenPNE-2.12.1 のパッケージをダウンロードしてきて、セットアップドキュメントを見る。

apache はすでにインストール済みだったので、まだインストールしていない PHP5 と MySQL を apt-get でインストール。

MySQL に OpenPNE 用のユーザを作成して、あとはドキュメントどおりにセットアップを行った。
cron は面倒なので、設定しなかった。
最後にセットアップモジュールを実行して終了。

ここで、「えーと、メール送信はどうなってるんかな?勝手に外部にメール送信してほしくないな」と思って、メール送信まわりを調べてみたら、/usr/sbin/sendmail を呼び出してメール送信してるっぽかったので、sendmail 系は全くインストールしていなかったので、つぎのような /tmp にファイル吐くだけのスクリプトを /usr/sbin/sendmail とした。

#!/usr/bin/perl

my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
my $tmpdir='/tmp';
my $filename = sprintf('sendmail.%04d%02d%02d.%02d%02d%02d.%d', $year+1900, $mon+1, $mday, $hour, $min, $sec, $$);
my $path = "$tmpdir/$filename";

open(OUT, ">$path") or die "open error $path";
print OUT "$0 ", join(' ', @ARGV),"\n";
print OUT "============================\n";
while(my $line = ) {
print OUT $line;
}
close(OUT);



これで、招待メールとか他の通知メールは、/tmp にできたファイルの中身をみればわかるようになった。

さて、セットアップ設定が一応終わった。
さっそく、初期メンバーの写真を変更しようとしたら、ファイルをアップロードで画面が真っ白になった。
原因をいろいろ調べてみたら、GD モジュールが入ってなかったからだった。
apt-get php5-gd でインストールしたら、正常にアップロードできるようになった。

とりあえず、ほとんどデフォルト設定でこんな感じになった。

実験用 OpenPNE の画面
[ 2008/06/29 22:30 ] メモ | TB(0) | CM(0)

Ubuntu で alt+shift が効かない 

emacs で、バッファ内の先頭、末尾を行き来するためのコマンド M-<M-> が、ちゃんと動作してくれないなぁとおもってたら、alt+shift が効いてなかったらしい。

[設定]-[キーボード] で[キーボードの設定]のダイアログで、[レイアウトのオプション]タブの [Alt+Shift changes group.] のチェックをはずしたら、ちゃんと alt+shift が効くようになった。

キーボード設定-レイアウトのオプション@Ubuntu

[ 2008/06/29 01:41 ] メモ | TB(0) | CM(0)

[備忘録] 無線LAN設定 

MHP2G のダウンロードクエストをゲットすべく、無線LAN環境をつくるために、買って放置してた WHR-G54Sのセットアップをしてみた。

自宅の LAN 環境には、すでに PC ルータが存在するので、WHR-G54S はルータモードでなく、ブリッジモードで使うことにした。(8 port LAN スイッチのポートがいっぱいいっぱいなので、ついでに LAN ポートを稼ぐためでもあったりする。)

WHR-G54S をブリッジモードで起動すると、デフォルトでは 192.168.11.100 になり、既存の LAN で利用してるネットワークアドレス空間から外れるので、設定で利用する PC には、 192.168.11.100 への通信は、default gateway のほうへ行かないように、直接通信できるように一時的にルーティングの設定をした。

WHR-G54S のほうは、デフォルトゲートウェイ等の設定がないので、返りパケットもちゃんと戻ってきて、PC <-> WHR-G54S の通信ができるようになった。

WHR-G54S にアクセスできるようになったところで、さっそく管理者パスワードを変更した。

…。

そうしたら、ログインできなくなった!!

INIT ボタンで設定を初期化して、ログインして、再びパスワード変更しても、おなじ状態。
ファームウェアか?とおもって、再び初期化後、ファームを最新にしても同じ症状。

アレコレしてるうちに原因がわかった。

入力したパスワードは、9 文字。登録されたパスワードは 8 文字。

…。

そりゃ、ログインできんわな。
警告くらいだしてくれれば、原因究明に時間を無駄に使わずに済んだのに。


そんなこんなで、管理者パスワードの件が解決したので、無線LANのセキュリティを設定する。
無線LANの暗号方式は AESに、ANY接続 OFF、MAC アドレスでの接続制限などなど。

ノートPCのほうで、念のため接続してみたら、うまくいった。

つぎに、当初の目的である PSP で接続してみる。
PSP は AOSS 対応なので、AOSS で繋いでみた。
そうしたら、AES じゃなくて WEP で接続される・・・。
PSP のほうは、AES 対応しているはずなのに。

WHR-G54S のほうで、 AOSS 接続での暗号方式を AES に設定しなおしてもダメだった。

仕方ないので、AOSS で設定するのはあきらめて手動設定でやってみたら、ちゃんと AES で接続できた。

とりあえず、PSP の無線LAN環境が構築できたので、さっそく MHP2G のクエストダウンロードサイトにつなげてみて、ダウンロードできるやつは全部ゲットしといた。
[ 2008/03/31 00:36 ] メモ | TB(0) | CM(0)

[Lua] API 

Lua は C 言語で記述されたコードと連携できるように、API が用意されている。

その API を利用する際に、キーとなる概念がスタックである。
スタックというとアルゴリズムのほう、つまり LIFO (Last In, First Out) が先に頭に浮かぶが、Lua の API では、どちらかというと ABI (Application Binary Interface)の呼び出し規約での利用方法に近い。(アセンブリ言語的といえばいいのだろうか?)

なので、LIFO のイメージで API のドキュメントを読むと、理解がしにくくなる。
とはいえ、後者の呼び出し規約でのスタックのイメージでも、なにげにややこしいところがある。

ということで、いくつかの API 呼び出しについて、そのスタックの状態やその変化を図化してみた。
(図化のもとにした Lua のバージョンは 5.1.2)

スタック操作

lua_gettop(L)
lua_gettop

lua_settop(L, idx)
lua_settop

lua_pop は、lua_settop を呼び出すマクロになっている。

lua_pushvalue(L, idx)
lua_pushvalue

lua_remove(L, idx)
lua_remove

lua_insert(L, idx)
lua_insert

lua_replace(L, idx)
lua_replace


値参照

lua_type(L, idx) / lua_isXX(L, idx)
lua_type / lua_isXX

lua_isXXX … lua_isnumber, lua_isstring, lua_iscfunction, lua_isuserdata など
lua_isfunction, lua_istable, lua_islightuserdata, lua_isnil, lua_isboolean, lua_isthread などは、lua_type を用いて型判断するマクロになっている

lua_equal(L, idx1, idx2) / lua_rawequal(L, idx1, idx2) / lua_lessthan(L, idx1, idx2)
lua_equal / lua_rawequal / lua_lessthan

lua_toXX(L, idx)
lua_toXX

lua_toXX … lua_tonumber, lua_tointeger, lua_toboolean, lua_tocfuntion, lua_touserdata, lua_tothread, lua_topointer など

lua_objlen(L, idx)
lua_objlen


値格納

lua_pushnil(L) / lua_pushXX(L, val)
lua_pushnil / lua_pushXX

lua_pushXX … lua_pushnumber, lua_pushinteger, lua_pushstring, lua_pushboolean, lua_pushlightdata, lua_pushthread など

lua_pushcclosure(L, func, n)
lua_pushcclosure

lua_pushcfunction は、lua_pushcclosure(L, func, 0) のマクロになっている


作成

lua_createtable(L, narr, nrec)
lua_createtable

lua_newtable はマクロで、lua_createtable(L, 0, 0) と定義されている。

lua_newuserdata(L, size)
lua_newuserdata


テーブル参照

lua_gettable(L, idx) / lua_rawget(L, idx)
lua_gettable / lua_rawget

lua_getfield(L, idx, key)
lua_getfield

※ lua_rawgeti と微妙に引数の型が異なる

lua_rawgeti(L, idx, n)
lua_rawgeti

※ lua_getfield と微妙に引数の型が異なる

lua_getmetatable(L, idx)
lua_getmetatable


テーブル格納

lua_settable(L, idx) / lua_rawset(L, idx)
lua_settable / lua_rawset

lua_setfield(L, idx, key)
lua_setfield

※ lua_rawseti と微妙に引数の型が異なる

lua_rawseti(L, idx, n)
lua_rawseti

※ lua_setfield と微妙に引数の型が異なる

lua_setmetatable(L, idx)
lua_setmetatable


呼び出し

lua_call(L, nargs, nresults)
lua_call

lua_pcall(L, nargs, nresults, errfunc)
lua_pcall


[ 2008/03/10 22:32 ] プログラミング | TB(0) | CM(1)

革新的な 3D ゲームエンジン(?) 

Gamasutra を見てたら、こんな記事をみつけた。

Microsoft Excel: Revolutionary 3D Game Engine?
http://www.gamasutra.com/view/feature/3563/microsoft_excel_revolutionary_3d_.php

タイトルに釣られて、思わず記事を見てしまった。
3D Game Engine って書いてあったから、総合的なもの、上位層っぽいものをイメージしてたが、そうではなくて 3D Engine (要は3D描画部分のみ)だった。ちょっとがっかり。

で、実際の内容はというと、いわゆる 3D 描画を Excel でやろうっていうものだった。
3D 描画の基本的な部分は、 一般的に、座標変換(ジオメトリ演算というほうが一般的?)→画面描画 という工程で構成されている。
この記事では、その両方を Excel (+VBA) の機能だけで実装していた。

はじめの座標変換のほうは、さすがは表計算ソフトという感じで、ワークシート内に各種のパラメータを記述し、そのパラメータの計算式もシート内に記述するというかたちで行っていた。
これは、記事の1ページ目に載っている表の画像をみればだいたいの感じはつかめる。

さて、つぎの画面描画に関しては、2通りの方法が説明されていた。(記事の2ページ目〜)
  1. Excel-native Cell Graphics (ECG)
  2. Office-level Graphics Abstraction Layer (OGAL)

1つ目の Excel-native Cell Graphics とは、セルのサイズを小さくして、セルを1つのドットと見立てて描画を行うものらしい。

それをつかった動画あるので、それを見れば一目瞭然。


これは、Excel VBA で作られたゲームでよく見られる手法だ。
"excel ゲーム" でググれば、利用例が見つけられる。

たしか、自分がこの手法を知ったのは、GIGAZINE の記事だったような気がする。

Excelで作られたゲームセンター
http://gigazine.net/index.php?/news/comments/20061002_excel_game/


2つめの Office-level Graphics Abstraction Layer は、よく知らないが VBA の機能を使うらしい。

これも動画があがっているので、どういう感じかはそれを見たほうが早い。


普通の3Dプログラムのサンプルっぽく(これも3Dプログラムか)、立方体がくるくるまわってるのがわかる。
VBA の Shapes オブジェクトの AddPolyline メソッド(→MSDN日本,MSDN本家)を使えば、普通にポリゴンが描けるから、それをつかって描画をおこなっているみたい。

VBA にこんな機能があったなんて、知らなかった。
そもそも、普段 VBA 使わないし、Excel も簡単な作図(表計算じゃなくて!)くらいにしかつかってないからなぁ。
VBA、ちょっと見直した。


実用的かどうかはかなり疑問だが、こういうあんまりやらないようなことをやってるってのが、非常に面白い。


Excel VBAゲーム大作戦〈1〉はじめてのゲームプログラミングExcel VBAゲーム大作戦〈1〉はじめてのゲームプログラミング
(2005/08)
C&R研究所

商品詳細を見る


Excel VBAゲーム大作戦〈2〉実戦!ゲームプログラミングExcel VBAゲーム大作戦〈2〉実戦!ゲームプログラミング
(2005/08)
C&R研究所

商品詳細を見る
[ 2008/03/08 13:26 ] プログラミング | TB(0) | CM(0)

codepad (perl編) 

昨日の codepad の記事(日付的には今日だが…)では Ruby でやってみたが、今日は Perl でやってみる。

というのも、codepad のRecent Pastesをみてたら、Perl だと Ruby でできなかったディレクトリアクセスができるみたいだったから。

http://codepad.org/2L6lu3sR
opendir(DIR, ".");
print join("\n", readdir(DIR));
closedir(DIR);


ディレクトリのリストが取れた。
.
..
lock
t.pl
usr
lib

t.pl ってなんやろ?ということで、スクリプトを書いてみた。

http://codepad.org/tNedTE03
open(FILE, "./t.pl");
print <FILE>;
close(FILE);


…。
自分が書いたコードだった。


さて、Ruby のほうでできなかった socket はどうかな?

http://codepad.org/gKGI6qJW
use Socket;
socket(SOCKET, PF_INET, SOCK_STREAM, 0);
bind(SOCKET, sockaddr_in(0, INADDR_ANY));
$sock = getsockname(SOCKET);
($port, $addr) = unpack_sockaddr_in($sock);
$host = gethostbyaddr($addr, AF_INET);
print "$host:$port";



ああ、やっぱり。
[ 2008/03/06 21:46 ] プログラミング | TB(0) | CM(0)