スタッフブログ
拡張現実(Augmented Reality、AR)というものがあります。
似たような単語に仮想現実(Virtual Reality、VR)というものがありますが、VRは完全な仮想空間に対して現実のデバイスでアクセスするのに対し、ARは現実空間に対して仮想空間を「拡張」するものです。
わかりやすい例だと、テレビ番組で実際の人間とCGのキャラが喋っているようなものです。
なにやら難しそうに見えますが、これを手軽に作るARToolKitというものが存在します。
このサイトのトップページに出ている画像がサンプルそのものなのですが、これは特定の現実空間にあるマーカー(実際はカメラから取り込んだ動画)上に3Dオブジェクトを配置するという処理を簡略化するためのライブラリです。
このようなものが簡単に作れてしまいます。
WindowsでOpenGLのプログラミング経験のある方ならすぐ作れると思います。
実際の使用方法などは、「攻殻機動隊」「電脳コイル」の世界を実現! - ARToolKitを使った拡張現実感プログラミングで詳しく紹介されているので、興味のある方は読んでみてください。Visual C++ 2008 Express Editionでビルドができるので、無料で一通りの環境は揃います。(カメラは自前で用意してください)
またこのARToolKitは、WindowsMobileやiPhoneにも移植されています。
若干処理は重そうですが、持ち運びできるデバイスでARを簡単に実現できるのはいろいろ使い道がありそうです。(例えば、展示品をiPhoneを通して見ると3Dキャラクターが解説してくれるとか)
ARを扱うライブラリは他にもあるので(マーカー不要のものとかも研究されています)、いろいろ試してみてください。
こんにちわ。なおとです。
日に日に秋が深まっていくようなこの頃ですが、私は風邪をひいてしまったようです。 皆様もご自愛ください。
バージョン管理の秘訣は、自分でバージョン管理しないこと!
バックアップなどはバージョン管理システムに任せましょう。
「自分でバージョン管理」とはなにかというと、例えば自分のところで抱え込むことが挙げられます。 複数の修正内容をいっぺんにコミットするような事態があると、「いつ(順序)、だれが、どこを」修正したかの情報を、 リポジトリではなく、自分で持ってしまうことになります。
ほかにもいろいろあるのですが、言いたいことは楽をしましょう、そのためにシステムはありますよということです。
最近開発環境はすっかりvimに移行してしまったので、なんでもvimで開発したいのですが、pluginとかが充実していないファイルタイプには不便だったりします。
今回はvimでActionScript(AS3)の開発をする方法をまとめてみます。
■syntax
ActionScript - ActionScript syntax highligting : vim onlineからダウンロードできます。しかしAS2レベルっぽいので、AS3のsyntaxを自力で追加する必要があります。class周りとか、importとかそのあたりが抜けているので適当に追記しましょう。
■rascut
id:secondlife氏が開発した、fcshをwrapして自動コンパイルとかをしてくれるものです。前はfcwrapとか呼ばれていたやつです。
詳細に関しては、ActionScript やるなら入れとけ。rascut 導入と使い方。 - てっく煮ブログが詳しいです。
rascutはいくつか問題があるので修正します。
・fcshが日本語版だとおかしくなる
rascutとFlex3 SDK beta - holidays-l開発ブログが詳しいです。
trunkだと修正されているようなので、trunkから持ってくるのが早いと思います。
・swfobject.jsが読まれない
lib/rascut/httpd.rbの27行目で
@path = env["PATH_INFO"] == '/' ? @root : F.join(@root, env['PATH_INFO'])
としていて、PATH_INFOが空の際にF.join(@root, env['PATH_INFO'])が呼ばれるため、無駄な/が末尾についてしまい読めなくなっているようです。
同じ行を
@path = (env["PATH_INFO"] == '/' or env["PATH_INFO"].empty?) ? @root : F.join(@root, env['PATH_INFO'])
とすることで対応できました。
ちなみにこちらもtrunkでは修正されているようです。最初からtrunkを使ったほうがいいと思います。
・画像が出ない
rascutのhttpdは、swf関係のファイルを/swf以下に配置するので、画像パスも/swf以下から読むように設定する必要があります。(rascut側の設定で対応できるのかもしれません)
親のasファイルと同じ場所にswfと画像を置くようにしておいて、as側でパスを/swf以下にしておけば大丈夫です。
[Embed(source='〜')]で埋め込む画像はもちろん関係ありません。
Eclipse周辺だと便利なツールはいろいろあるのですが、どうしても重くなりがちなので、自分の使いやすい環境で開発できるのが一番だと思います。
こんばんわ。なおとです。
つい最近の仕事のことですが、CRONを使った自動実行について手間取ってしまったので、復習をしておきます。 以下はあくまで一例で、OSの違いなどでバリエーションがありえます。
CRONTAB
- ユーザ毎のCRONTAB
- /var/spool/cron/∗ など
- システムのCRONTAB
- /etc/crontab [600 or 644] root
- /etc/cron.d/∗ [600 or 644] root
あるCRONのジョブを実行するタイミングと、その内容を登録するところです。/etc/crontabはできるだけ編集しないのが作法です。
典型的なタイミング(毎日深夜、など)で実行する処理は、ここで登録しなくても用意されているディレクトリにスクリプトを置いておけば、実行されます。
システムのCRON用スクリプト
実際にはCRONTABの中では複雑なことは書きづらいので、シェルスクリプトなどを登録しておきます。目的の処理をする実体は、そのスクリプトの中に記述します。
- /etc/cron.daily/∗ [755] root
- /etc/cron.hourly/∗ [755] root
- /etc/cron.monthly/∗ [755] root
- /etc/cron.weekly/∗ [755] root
- ほか [755] ∗ など
CRONTABをユーザーに持たせるとどこにいったのか分かりにくくなることがあるので、できれば避けます。今回もその辺を整理してすっきりしました。
CRONとapacheで共通の処理対象があるとき
CRONのジョブからなにかファイルを生成するとき、apache httpdからも同じディレクトリ/ファイルを操作することがある場合には、ファイルやディレクトリの所有者、実行権限に気をつけます。具体的には次のような仕込みをします。
共用するユーザは、ある共通のグループ(たとえば、apacheグループ)に参加させておきます。 生成されるファイルを置くディレクトリには、セットグループIDをつけておきます。
CRONのジョブは、rootではなくapacheユーザで実行します。 システムのCRONTABでは、実行時のユーザを指定するようになっているので、/etc/cron.d/を使います。
そこに登録しておいたスクリプトの実行時ユーザはapacheになり、生成されるファイルの所有者とグループもapacheになります。 以上です。
ここにFTPやファイル共有なども絡むともう少し考えることが多くなるかもしれませんが、だいたいこれでOKです。 こういうことは忘れやすいので、ときどきは実際に手を動かしておかないと身につかないものですね。
PHPは、昨日のほとんどが組み込み関数によって実装されているため、各関数の命名規則はprefix等で統一されていることが多いです。
しかし、中には命名規則が一致してないのに似たような挙動をするものがあったり、一致しているのに微妙に挙動が違うものがあります。今回はsatoが気になった例を紹介します。
・array_pop/array_shift
配列の最後の値を取り出すarray_popと、配列の最初の値を取り出すarray_shiftですが、若干挙動が違います。
array_popはそのままなのですが、array_shiftは
array_shift() は、array の最初の値を取り出して返します。配列 array は、要素一つ分だけ短くなり、全ての要素は前にずれます。 数値添字の配列のキーはゼロから順に新たに振りなおされますが、 リテラルのキーはそのままになります。とあります。 つまり、
PHP: array_shift - Manual
array(100=>'a', 110=>'b', 120=>'c');という配列があった場合、array_popの結果は
array(100=>'a', 110=>'b');ですが、array_shiftは
array(0=>'b', 1=>'c');となってしまいます。 array_popと対象の動作を行いたい場合は、array_sliceの$preserve_keysをTRUEにして動作させるとうまく行きます。ただしPHP5専用なので、PHP4では他の方法で行う必要があります。
他にも似たような例は存在すると思うので、気になる場合は必ずPHPマニュアルを参照するようにしましょう。
Linuxをメインで使うようになると、WindowsやMacにあるPhotoshopのような優秀なレタッチツールがない事に気づきます。
「LinuxにはGIMPがあるじゃないか!」とよく言われるのですが、あれをPhotoshopと同じように使いこなすのは私には無理でした。
自分がレタッチツールを使う時はプレゼン資料を作る程度なのでレイヤー機能と基本的な画像編集機能、各種メジャーフォーマットへのかきだし機能がついていれば満足。というわけでその条件を満たすソフトを探していたら、paintgraphic2にあたりました。
http://www.sourcenext.com/titles/hob/76440/
Windows用のソフトですが、wineを使えば普通に使えます。まだあまり使いこなせていませんがPhotoshopにインターフェイスがにているので簡単な事ならすぐにできるようになります。Photoshopのようなプロのツールと比べて値段が安いのも素敵です。
linuxにはwineという裏技があるのでLinuxで良いソフトがない時はWindowsの便利なソフトをLinuxで使ってみると良いと思います。
弊社では毎週金曜日に何か発表とかがあるのですが、今回はOpenIDのRPの実装方法について話しました。
プレゼン資料を置いておきますので、参考になれば幸いです。(カーソルキーで操作します)
OpenID RPの作り方
isEnabled()
canGet()
hasCanged()
contains()
containsKey()
こんにちわ。なおとです。
今日はいつもよりも開発よりの話題をしたいと思います。 それは、Subversionからチェックアウトしたディレクトリ以下から、.svnディレクトリを削除する方法です。
.svnディレクトリには、バージョン管理のためのメタデータが格納されていて、プログラムそのものの動作には影響しないものです。 これを綺麗に消してしまう方法を検索してみると、LinuxなどのUNIX系の環境では、シェルからワンライナー1発で解決する方法が見つかります。
それでまたくOKなのですが、Windowsユーザーでも使えるようなPerlスクリプトを書いてみました。 きっと誰が書いても同じようなことになると思います。
こういった短いスクリプトを「書き捨て」にできるのが、できるエンジニアと言われる条件のひとつのようです。 しかし私は書き捨てにせず、こうしてブログのネタに再利用しています^^;;。
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
use File::Path;
# rmtree .svn dirs
# 検査したいディレクトリの親のpath
use constant BASE_DIR => '/var/www/';
# 検査したいディレクトリ名のリスト
use constant TARGET_DIRS => ('html', 'xoops_trust_path');
for my $dir (TARGET_DIRS) {
find(\&del_svn, BASE_DIR . $dir);
}
sub del_svn {
rmtree($_, 1, 1) if (-d $_ and $_ eq '.svn');
}
OpenIDまわりの用語は結構多いのですが、どれもわかりづらいものが多いのでここでまとめてみます。
・OP
認証を行うサーバ。OpenID Provider。IdPとも。
・RP
OPを使って認証をするサービス。Relying Party。Consumerとも。「Relaying」ではないので注意。
・Claimed Identifier
ユーザが自分のものだと主張するID。いわゆる「あなたのID」。
・SREG
OpenIDに付随するユーザの情報を取得するためのプロトコル。OpenID Simple Registration Extension。
・Yadis
URIからその対応するプロトコルを取得するためのプロトコル。OpenIDに限ったものではない。
・nonce
なりすまし防止のための文字列。
・Diffie-Hellman鍵共有
一般経路で暗号鍵の安全な共有を行うアルゴリズム。PGP等でも使用されている。
・XRDS
Yadisで使われるXML文書の形式。
その他に関しては、OpenIDドキュメントの和訳(他にもあります)などを見るとわかると思います。
このあたりの用語と、セキュリティ問題とかを覚えておくと、実装の話以外では大体理解できると思います。