2008年5月19日(月曜日)

symfony+sfModalBoxPluginで簡単ダイアログ

カテゴリー: - sato @ 12時32分52秒

satoです。
今回はsymfonyフレームワークで、簡単にダイアログボックス的なものを表示してみます。
sfModalBoxPluginを利用します。

・sfModalBoxPluginのインストール
sfPrototypePluginが必要なので、先にインストールします。

$ symfony plugin-install http:⁄⁄plugins.symfony-project.com/sfPrototypePlugin
$ symfony plugin-install http:⁄⁄plugins.symfony-project.com/sfModalBoxPlugin

細かい設定は特に必要ありません。

・ダイアログ側作成
まず、ダイアログとして表示したいactionを作成します。
apps/frontend/modules/dialogtest/actions/actions.class.php

  public function executeDialog()
  {
  }

apps/frontend/modules/dialogtest/templates/dialogSuccess.php

<p>hello dialog box</p>
<p><a href="#" onclick="Modalbox.hide();return false;">close</a></p>

・呼び出し元作成
apps/frontend/modules/dialogtest/actions/actions.class.php

  public function executeTest()
  {
  }

apps/frontend/modules/dialogtest/templates/testSuccess.php

<?php use_helper('ModalBox') ?>
<?php echo m_link_to('show dialog', 'dialogtest/dialog') ?>

・実行
dialogtest/testをブラウザで表示すると、

このような画面になります。ここで「show dialog」をクリックすると

このような画面になります。「close」をクリックすると元の画面に戻ります。

例えばselectタグでは多すぎるような項目を選択させる際に、ダイアログを出して選択させて、選択結果をJavaScriptで元の画面に挿入するようにすると、操作性が上がると思います。
デザインの都合上、管理画面などに利用するのが向いていると思います。
actionがそのままダイアログとして利用できるのは便利だと思うので、是非試してみてください。

ModalBoxの詳しい説明は、ModalBox | Wildbitをご覧下さい。sfModalBoxPluginについてはsfModalBoxPlugin - symfony - Tracをご覧下さい。


2008年4月21日(月曜日)

Passenger(mod_rails)で簡単Rails環境構築

カテゴリー: - sato @ 18時50分17秒

satoです。今回はRubyを代表するフレームワークRuby On Railsの話です。
通常Ruby On Railsを動かす場合、mod_rubyやwebrickとかは使わず、fastcgiやmongrel(cluster)といった環境を用意することが多いです。しかしどちらも設定が煩雑で、簡単に利用できるとは言い難いものでした。
しかし最近、Passengerなるものが出てきて話題になっています。これは「a.k.a. mod_rails」の名の通り、Rails専用のApacheモジュールとなっています。
インストールも非常に簡単で、RubyGemsがインストールされている環境なら、

% gem install passenger
% passenger-install-apache2-module

で完了します。
passenger-install-apache2-moduleを実行すると、足りない環境や、Apacheの設定方法まで詳しく表示されるので、インストールに失敗して困るということもないと思います。
passenger-install-apache2-moduleが無事終了すると、

The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-1.0.1/ext/apache2/mod_passenger.so RailsSpawnServer /usr/lib/ruby/gems/1.8/gems/passenger-1.0.1/bin/passenger-spawn-server RailsRuby /usr/bin/ruby

After you restart Apache, you are ready to deploy any number of Ruby on Rails applications on Apache, without any further Ruby on Rails-specific configuration!

のようなメッセージが出ます。(環境によってパスは変わります)
ここに書いてある3行をそのままhttpd.confに追記し、Apacheを再起動すればインストール完了です。
httpd.confでDeny from allが記述されている場合は消すといいようです。
あとは普通にRailsアプリケーションを作成し、実行するだけです。DocumentRootがRailsのpublicであれば他の設定は不要です。(そうでない場合は少し設定が必要のようです)
開発用サーバとしての機能は備わっていないので、開発中はruby script/serverでWebrickを起動することになります。
Passengerの再起動は、touch tmp/restart.txtしておくと勝手に再起動するようです。

環境面で敷居の高かったRailsですが、これで手軽に導入できるようになるのでしょうか。
パフォーマンスは良好のようなので、安定性に期待したいところです。


2008年4月14日(月曜日)

Propelを単体で使う

カテゴリー: - sato @ 18時09分58秒

PHP5専用のO/RマッパーにPropelというものがあります。
PHPのフレームワーク「symfony」の標準のO/Rマッパーとして有名ですが、単体で使っている人はあまり見かけない気がします。
今回は単体で使う方法を軽く説明しようと思います。

1.インストール
PEARコマンドでインストールするのが簡単です。

# pear channel-discover pear.phpdb.org
# pear install phpdb/propel_generator
# pear install phpdb/propel_runtime

なお、phingが必要なので、入っていない場合は事前に

# pear install channel://pear.phing.info/phing

で入れておいてください。
ログを記録する場合はLogが必要なので、

# pear install Log

で入れておいてください。(今回は不要です)
執筆時点でのPropelの安定バージョンは1.2です。

2.テーブル定義
PropelではXMLでテーブル構造を定義します。これにより、リレーションを含めたPHPオブジェクトが全て自動で生成されます。
今回は仮にbookmarkという簡単なアプリケーションにします(実際にアプリケーションは作成しません)。bookmarkというフォルダを作り、以下のファイルを作成します。
schema.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<database name="bookmark" defaultIdMethod="native">

<table name="bookmark" description="bookmark"> <column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="bookmark id"/> <column name="title" type="varchar" size="255" required="true" description="bookmark title"/> <column name="url" type="varchar" size="255" required="true" description="bookmark url"/> </table>

</database>

3.基本設定
ビルドに関する設定は以下のファイルで設定します。
build.properties

propel.project = bookmark
propel.database = mysql
propel.database.url = mysql://root@localhost/bookmark

また、これとは別に、実際のアプリケーションからの接続時の設定は以下のファイルを使用します。
runtime-conf.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
 <propel>
  <datasources default="bookmark">
   <datasource id="bookmark">
    <adapter>mysql</adapter>
    <connection>
     <phptype>mysql</phptype>
     <database>bookmark</database>
     <hostspec>localhost</hostspec>
     <username>root</username>
     <password></password>
    </connection>
   </datasource>
  </datasources>
 </propel>
</config>

このような仕様になっているのは、Propel自体がgeneratorとruntimeで分離しているからだと思われます。

ファイルを作成したら、mysqlでbookmarkという名前のデータベースを作成しておいてください。

4.オブジェクト作成

bookmarkフォルダで以下のコマンドを実行します。

% propel-gen .

するとbookmarkフォルダ以下に多数のファイルが生成されます。
実際にデータベースに投入するSQLファイルは、build/sql/schema.sqlになります。そのままmysqlに投げてもいいですが、

% propel-gen . insert-sql

でもデータベースに投入できます。(実際に行っていることは手動での挿入と同じだと思います)

propel-genの際に、

Execution of target "convert-props" failed for the following reason: /usr/share/pear/data/propel_generator/build-propel.xml:534:12: Cannot write parsed template: Unable to parse template ./templates/conf/Control.tpl: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead
[phingcall] /usr/share/pear/data/propel_generator/build-propel.xml:534:12: Cannot write parsed template: Unable to parse template ./templates/conf/Control.tpl: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead

のようなエラーが出た場合は、

% export TZ=Asia/Tokyo

としてください。

5.実際に使う

index.php

<?php

require_once('propel/Propel.php');

// $dir = dirname(__FILE__); // ルートフォルダであればこれでも取得できます $dir = '/path/to/bookmark'; set_include_path($dir.'/build/classes' . PATH_SEPARATOR . get_include_path());

Propel::init($dir.'/build/conf/bookmark-conf.php');

これが初期化部分になります。$dirは適宜変更してください。

require_once('bookmark/Bookmark.php');

使用するテーブルに対応するファイルを読み込みます。

この後に実際のコードを記述していきます。

・データを追加/保存する

$bookmark = new Bookmark();
$bookmark->setUrl('http://ryus.co.jp/');
$bookmark->setTitle('XOOPS Webサイト/イントラサイト制作、XOOPS モジュール開発/カスタマイズを専門に行っています。 - XOOPS専門-株式会社RYUS');
$bookmark->save();

これでINSERTになります。DBから取得したデータであればUPDATEになります。両者を特に気にする必要はありません。

・データを読み込む

$bookmark = BookmarkPeer::retrieveByPk(1);
$url = $bookmark->getUrl();
$title = $bookmark->getTitle();
echo $url,$title,PHP_EOL;

読み込み系は"テーブル名Peer"クラスで行います。
retrieveByPkは、主キーからデータを取得します。
# 表示が化ける可能性があるので、適当な文字コードで表示してください。

・複数データ取得

$bookmarks = BookmarkPeer::doSelect(new Criteria());
foreach($bookmarks as $bookmark) {
  $url = $bookmark->getUrl();
  $title = $bookmark->getTitle();
  echo $url,$title,PHP_EOL;
}

doSelectは条件付きで複数レコード取得します。引数のCriteriaは条件を指定するクラスなのですが、今回は無指定なので単にnewしたものをそのまま渡しています。
条件を指定する例としては、

$c = new Criteria();
$c->add(BookmarkPeer::URL, 'http://ryus.co.jp/');
$bookmarks = BookmarkPeer::doSelect($c);

のような感じになります。Criteriaの条件設定は細かいところまで手が届くようになっています。

6.まとめ
詳しくは公式のドキュメントが充実しているので、そちらを参照してください。
次期バージョンであるPropel1.3(symfony1.1で載る予定)ではcreoleからPDOになり、更なる機能強化が期待できます。
PHPのO/Rマッパーは他にもS2Dao.PHP5Doctrineなど多数あるので、好みのものを利用するのがいいと思います。


2008年4月8日(火曜日)

知らなかったTortoiseSVNの便利な機能

カテゴリー: - gusagi @ 14時27分19秒

暖かくなったかと思えば、昨日からの雨で気温が下がったりといった気候で、体調管理に不安を覚えているgusagiです。

ファイルのリリース作業を行う際に、ある時点から現在までに変更したファイルを取得したい、なんてことがあったりします。
今までは、"svn log"でログを確認しては、変更のあったファイルを個別に"svn export"していたんですが、これだとミスが発生する可能性が高いため、調べてみました。
そこで、初めて知ったのですが、実はTortoiseSVNにはリビジョン間の差分だけ取得するという、まさに欲しい機能が存在していました :oops:

詳細は、こちらを参照して頂けば判ると思うのですが、SVNのログを表示して、差分を取得したいリビジョン2つを選択した状態で右クリックすると、右クリックメニューの中に、リビジョン比較が存在するので、それを実行します。
リビジョン比較では、差分ファイルの一覧が表示されますので、後はそのファイルを選択してエクスポートすれば、差分ファイルだけの取得が完了です。
今まで、チマチマと時間を掛けてやっていた作業が、1分も掛からないで完了してしまいました :shock:

TortoiseSVNは、結構長い間使っているのですが、こんな便利な機能があることに本日初めて気付きました。
TortoiseSVN以外にも、実は知らないだけで便利な機能がありそうですし、普段使っているアプリケーションについて、改めて使い倒してみるというのも面白いかも知れませんね。


2008年4月7日(月曜日)

Smartyのテンプレートの文字列内変数を拡張する

カテゴリー: - sato @ 17時20分49秒

satoです。
XOOPSでは、テンプレートエンジンにSmartyを使うことになります。
このSmartyは便利なのですが、若干使いづらい部分もあったりまします。

まず前提として、Smartyの文字列定数中に変数を混ぜたい場合、バッククォート(`)で囲むとそれが変数として解釈されるようになっています。
例えば、

{"私は`$name`です。"}

として、$nameに"sato"という文字列がassignされていると、

私はsatoです。

と表示されます。

しかし、このバッククォート内にメンバ関数を指定すると、解釈がうまくいかないようです。

例えば、

私は{$my->show('name')}です。

みたいなものは可能なのですが、

{"私は`$my->show('name')`です"}

とすると、

私は`Object id #2->show('name')`です。

のように、$myの部分だけ変数として解釈され、それ以外は普通の文字列として出力されてしまいます。
通常、こういう場合は、

{assign var=name value=$my->show('name')}
{"私は`$name`です"}

のように1段階assignを追加することになり、若干手間がかかります。
今回はこれの簡易的な対応方法を試してみました。

Smartyのassignされた変数というのは、実際にそのスコープに存在するものではなく、Smartyクラスの_tpl_varsメンバ変数に格納されています。このため、テンプレート側で記述した変数は、Smartyの構文解析を通してSmartyクラスのメンバ変数になるように置換処理が入ります。具体的には生成されたテンプレートキャッシュを見ればわかると思います。
そのため、Smartyでは正規表現を利用して構文解析を行っているのですが、この正規表現に手を入れることで、上記の対応が可能になります。

バッククォート内を解釈しているのは、Smarty_Compiler#_expand_quoted_textで、変数の解析をしている正規表現は_obj_ext_regexpに格納されています。
このため、Smarty_Compilerに手を入れればいいのですが、Smarty_CompilerはSmarty#_compile_sourceで生成され、すぐ破棄されるので、途中からアクセスすることはできません。Smarty_Compiler.class.phpを直接書き換えればいいという話もありますが、それでは汚くなってしまいます。
幸い、Smartyクラスが生成するSmarty_Compilerクラスは別のものに変更ができるようになっています。Smartyクラスのcompiler_fileとcompiler_classにそれぞれ読み込むファイルとクラス名が格納されているので、それを自前のものに変更します。

具体的にやってみます。
以下のファイルを作成します。パス等は適宜変更してください。
MySmartyCompiler.class.php


	

require 'Smarty-2.6.19/libs/Smarty_Compiler.class.php';

class MySmartyCompiler extends Smarty_Compiler { function MySmartyCompiler() { parent::Smarty_Compiler();

$this->_obj_ext_regexp = str_replace(’(?:[$?[w.]+])*’, ‘(?:[($?[w.]+)])*(?:(($?[w"’.]+)))*’, $this->_obj_ext_regexp); } }

呼び出し側を作成します。
index.php


	

require 'Smarty-2.6.19/libs/Smarty.class.php';

class myClass {

function show($var) { return 'sato'; }

}

$smarty = new Smarty(); $smarty->compiler_file = ‘MySmartyCompiler.class.php’; $smarty->compiler_class = ‘MySmartyCompiler’;

$smarty->template_dir = ‘templates’; $smarty->compile_dir = ‘templates_c’; $smarty->config_dir = ‘config’; $smarty->cache_dir = ‘cache’; $smarty->plugins_dir = ‘plugins’;

$smarty->assign(’my’, new myClass()); $smarty->display(’index.tpl’);

テンプレートを作成します。
templates/index.tpl

<html>
<body>

{"私は`$my->show('name')`です。"}

</body> </html>

実行すると、

私はsatoです。

のように正常に表示されているのが確認できると思います。
全てのパターンでテストを行っているわけではないので、不具合があったらコメント欄等でよろしくお願いします。

XOOPSからこれを利用する場合は、各RenderSystem内に存在するSmartyオブジェクトを取得して書き換える必要があります。
モジュールの場合は通常はLegacy_RenderSystemなので、

    $root =& XCube_Root::getSingleton();
    $renderSystem = $root->mContext->mModule->getRenderSystem();
    $renderSystem->mXoopsTpl->compiler_file = 'MySmartyCompiler.class.php';
    $renderSystem->mXoopsTpl->compiler_class = 'MySmartyCompiler';

のような感じで対応が可能です。(表示処理の実行前に記述してください)
管理画面はLegacy_AdminRenderSystemなので、mXoopsTplではなくmSmartyを参照することになります。

しかしこの方法でも、

{"私は`$pattern[$foo->bar()]`です"}

のようなパターンには対応できません。このパターンに対応するには_expand_quoted_text自体を大幅に改変する必要がありそうです。興味のある方は挑戦してみてください。


2008年4月1日(火曜日)

iモードIDについて調べてみました

カテゴリー: - gusagi @ 23時54分01秒

4/1で新卒っぽいスーツ姿を沢山見かけ、何となく懐かしさを覚えたgusagiです。
RYUSでも、haltさんやsatoさんという新しいメンバーが増え、ブログに技術ネタを相次いで投稿してくれましたし、私もちょっと書いてみようと思います。

3/31にiモードIDの仕様が公開されたので、少し調べてみました。
あちこちで書かれているように、SSL通信時に取得できないとか、guidって変数名を使ってるシステムはどうするんだとか、色々と問題があるのは知っていたのですが、個人的に一番「なんじゃこりゃ」と思ったのは、こちらにあるformでの送出パターン。
携帯対応とかやる際は、さらに注意すべき点(というか、バッドノウハウ)が増えた気がするのは私だけでしょうか・・・ :neutral:


2008年3月31日(月曜日)

外部ライブラリを使わないJavaScriptプログラミング

カテゴリー: - sato @ 18時38分02秒

初めまして、入社2日目のsatoです。

現在、JavaScriptで開発といえばprototype.jsjQueryといったライブラリを使用することが多いですが、ちょっとした開発では直接書いたほうが早い場合もあります。
普段外部のライブラリを使っていると忘れがちになるので、基本的なものをまとめてみました。

・クラスの作成

function Class() {}
Class.prototype.foo = 1;
Class.prototype.hoge = function() {
  this.foo = 2;
}

var c = new Class(); c.hoge(); alert(c.foo); // 2

・XmlHttpRequest

// オブジェクト作成
var xhr = null;
if (window.ActiveXObject) {
  xhr = new ActiveXObject("Microsoft.XMLHTTP");
} else {
  xhr = new XMLHttpRequest();
}

// アクセス xhr.open("GET", "foo.xml", true); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200) { var xml = xhr.responseXML; // 読み込み完了時の処理を記述する } } } xhr.send(null);

・DOM操作

var elem = document.getElementById("foo"); // #fooの要素を取得
var nodes = elem.childNodes;
for(var i=0;i<nodes.length;i++) {
  // elemの子要素全てに対して何かする
  var node = nodes[i];

// 要素の値を取得する // barなら"bar"が返る alert(node.nodeValue); }

// 中身を全て取得する場合はinnerHTML alert(elem.innerHTML);

elem.appendChild(document.createElement("br")); // タグを追加

外部ライブラリを使うか使わないかは、規模と書きやすさで考えればいいと思います。書きやすさだけで考えれば何らかのライブラリを使用したほうがいいのですが、巨大なものが多いので(今時そんなの気にしないかもしれませんが)、こういうのも覚えておくと便利です。
かと言って、全部直接書いていくのも面倒なので、例えばprototype.jsのような

function $(e) { return document.getElementById(e); }

こんな関数を用意しておくと多少は楽になると思います。

ただしそのまま書いていくと、外部ライブラリを使用するのに比べコード量は増えると思いますので、規模が大きくなりそうだと思ったら使い慣れたライブラリに切り替えるのをお勧めします。


2008年3月28日(金曜日)

要望を教えてもらいながら開発する

カテゴリー: - Ryuji @ 14時54分31秒

XOOPSのモジュールを開発しているときに、ある程度開発が進んだ段階で、お客さんに見ていただくようにしています。

これは、
・開発の方向性が間違っていないか?
・日常的に使いやすいようになっているか?
などを確認していただき、使いにくい部分があれば要望をだしていただくためです。
もちろん、開発費用、開発期間の関係で、いただいご要望をすべて満たすことは困難ですが、お客さんにも当社にとっても良い解決策を必死になって考えるようにしています。

幸いなことにRYUSではこれまで、まったくご意見いただけないまま開発してしまったということはなかったのですが、お客さんによっては、要望を出すことを非常に遠慮される方もおられるので、気をつけていきたいなと思っています。


2008年3月27日(木曜日)

プログラマのお役立ちツール

カテゴリー: - mik @ 22時48分56秒

概要仕様を設計していて、ER図がいい感じに描けるツールはないかな、と探していたところとてもよいフリーソフトを発見しました。

A5:SQL Mk-2
http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/index.html

A5:SQL Mk-2は複雑化するデータベース開発を支援するために開発されたフリーのSQL開発ツールです。
高機能かつ軽量で、使い方が分かりやすいことを目標に開発されています。
SQLを実行したり、テーブルを編集するほかに、SQLの実行計画を取得したり、ER図を作成したりすることが出来ます。

これをダウンロードしてER図を書いてみたところ、直感的に利用方法がわかりすぐに使い出せました。いいなと思えるところは論理名、物理名という名称で日本語名、英語名が両方とも書けるところです。以前別のツールを使ってER図を書いたことがあるのですが日本語もしくは英語のみしか書けなかったため、不便に感じました。

また、ER図だけ描ければよいと思って落としたものだったのですが色々な機能がついていて実データベースとADOやODBCを介在して接続させて実際のテーブルとER図を同期させることができます。DBを元にしてER図を起こしたり、ER図を元にしてテーブルを作ったりできるのです。その他にテーブル定義をエクセルファイルに出力したり、テスト用データを自動生成する機能までついています。

まさに「プログラマにとってすごく役立つフリーソフト」って感じです。
作者の 松-booleanさん、良いソフトをありがとうございます♪


2008年3月19日(水曜日)

1人で3ヶ月かかる開発を3人で1ヶ月にできるのか?

カテゴリー: - Ryuji @ 03時04分38秒

結論から書いてしまうと、1人で3ヶ月かかる開発を3人で開発したからといって、1ヶ月に期間短縮できるとは限りません。

工数÷人数が開発期間となるには、
1.開発者の作業がすべて平行してすすめられること
2.開発者同士のコミュニケーションにかける時間がゼロでも開発できること
の二つの条件が満たされなければいけません。

でも、2のコミュニケーションにかける時間をゼロにすることはできません。
作業分担を決めたり、システム上の重複を排除するためにもコミュニケーション時間をゼロにすることはできません。

しかし、じゃぁ3人で開発したときに必ず1ヶ月以上かかるかというと、そうとも限りません。

システム開発をしていると、思いこみや勘違いなどで、お客さんの求めるシステムと違うものを開発してしまうということが、少なからず発生します。(手遅れにならないように、途中途中で開発中のシステムを確認してもらいますが、それでも部分的に「こうじゃ無い!」ということはあります)

一人で開発していると、仕様書や要求書を見る「目」が一人になってしまうので、勘違いを正すチャンスが少なくなってしまうので、開発してから「こうじゃないんだよねぇ」というのが発生しやすくなります。

その点では、複数で開発に当たった方が、「○○って□□でいいんだよね」「え?○○って××でじゃないの?」という解釈の違い(思いこみ、勘違いの元)を開発者同士のコミュニケーションで発見でき、開発してから「違うよ!」という事態を防げるので、全体として開発期間が短くなる可能性はあります。

かといって、開発者が多すぎるとプラス面(勘違いの早期発見による工期短縮)よりも、マイナス面(分担調整、空き時間の発生)の方が増えそうだなぁと思っています。
# 残念ながら私はまだ10人、20人で数ヶ月かけて開発するようなケースの経験は無いので検証できてませんが。。


2008年2月9日(土曜日)

デブサミ2008に出展します

カテゴリー: - mik @ 11時35分21秒

デブサミ2008
http://codezine.jp/devsumi/2008/gaiyo/

2月13日(水)、14日(木)に東京の目黒雅叙園でデベロッパーズサミットという催しがあり、RYUSのスタッフもXOOPS Cube デブサミ委員会 として参加します。

13日は天野、gusagi
14日は天野、兎本

が常駐しています。オープンソースの無料講演やオープンソースコミュニティのブース展示など行っていますので是非おいで下さい。


2008年1月23日(水曜日)

WebDAV+SVNの設定で苦戦

カテゴリー: - gusagi @ 18時47分10秒

gusagiです。
今日は、WebDAV+SVNの設定に苦戦した一日だったので、はまった部分と設定方法について書きたいと思います。

RYUSでは、スタッフが増えてきたこともあり、作業の効率化のために色々と取り組んでいたりします。
ソースの管理についても、LAN内部でSVNを使うか、インターネット経由でもSVNを利用可能にするか検討中なのですが、実際に使ってみようということで、svn+sshでのアクセスや、WebDAV+SVNでのアクセスなど試してみました。
元々、svn+sshでの設定方法は判っていたのであっさりと実験出来たのですが、この場合サーバアカウントが必要になるなど、SVN利用者が増えるに従って管理が複雑になってきます。
逆に、WebDAV+SVNの場合は、アカウント管理はかなり単純になります。
ただし、暗号化やアクセス制御などは必要なので、こちらの設定が多少複雑化も知れません。

例として、http://example.com/repos でSVNにアクセス出来るようにしようと思います。
ドキュメントルートは /var/www/html、リポジトリは /home/project/svn とします。
WebDAV+SVNを利用する場合、mod_dav_svnやmod_authz_svnが必要なので、これらのモジュールを事前にインストールしておきます。
次に、apacheの設定ファイルで

<Location "/repos">
    DAV svn
    SVNPath /home/project/svn
    AuthzSVNAccessFile /var/www/html/svn/.authz
    AuthType Basic
    AuthName "Authentication"
    AuthUserFile /var/www/html/svn/.htpasswd
    Require valid-user
</Location>

と記述します。
上記の設定をした場合、/var/www/html/svn/.htpasswdに記述されたユーザのみ、/var/www/html/svn/.authzに記述された権限に従って、リポジトリにアクセスが可能になります。
なお、上記2ファイルはドキュメントルートの外に置いた方が安全です。

ここまで設定したら、apacheを再起動して、設定を有効にしてからブラウザでアクセスが出来るか確認します。
私も、ここまでは問題なく出来たのですが、この先ではまりました。
(続き…)


2008年1月18日(金曜日)

シングルサインオンについて考えてみる

カテゴリー: - gusagi @ 17時50分02秒

gusagiです。
しばらく前から、XOOPS Cube関連のコミュニティでもLDAP認証や、TypeKey認証などのサインオン系機能について、ちょくちょくと書き込みが出ている気がします。
シングルサインオン自体には興味があったので、ちょっと調べてみたところこういう記事を拝見しました。
HTTPまたはSOAPを基本としていて、OpenIDやLDAPにも対応しているとのことなので、時間を作って弄ってみようかと思います。
XOOPS Cubeにも応用できるかどうか、それ以前に自分に使いこなせるのか不安ではありますが、やってみないことには何も始まらないので、まずは試してみようと思います。
この結果は、後日の記事にも書くつもりですので、気長にお待ち頂けますと幸いです^^;


2008年1月16日(水曜日)

サーバの知識もあると便利

カテゴリー: - gusagi @ 18時02分59秒

gusagiです。
明けましておめでとうございます。本年もよろしくお願いいたします。

ウェブサイトを長く運営していると、アップロードしたファイルなどにより特定のディレクトリの容量が大きくなりすぎることがあると思います。
そのディレクトリに対してブラウザからアクセスさせていなければ問題ないのですが、画像やPDFファイルなどの場合、そのまま移動させるのが難しい場合が出てきます。

たとえば、/home/www/example.com/htdocs/photo というディレクトリに画像をアップロードしていたところ、/homeを含むパーテーションの使用率が100%になってしまいました。
使用量のほとんどは、上記のディレクトリにアップロードした画像が占めています。
/home/www/example.com/htdocs/photo/xxx.png へは、現在のところhttp://example.com/photo/xxx.png でアクセス出来ています。
画像のアップロードは今後も行う予定なので、example.com配下を別のディレクトリに移動に移動したいのですが、プログラム側の修正が発生するため、example.com配下の全てを移動させる訳には行きません。
こんな場合、一番工数を少なくして解決する方法は、apacheの設定ファイルで解決することだと思います。

(続き…)


2007年12月20日(木曜日)

昔書いたプログラムへの機能追加。

カテゴリー: - Ryuji @ 18時14分16秒

過去に書いたプログラムを見返すと「なんでこんなことしてるんだ?」「こうした方が断然いいのに。。」というようなことを感じることが多々あります。

たいていは書き直す時間もないので、そのままなんですが、仕事上、以前書いたプログラムの機能追加という仕事が入ってくることもあります。

そんなとき、過去に自分が書いたプログラムと真正面から対峙することになるのですが、気になる箇所があっちこっちに見つかり、書き直したい衝動に駆られます。

でも、ここで書き直してしまうと、全面的にテストのやり直しが発生しかねないので、書き直したい衝動をグッとこらえてます(^^;

ただ、機能追加するにあたり、どうしてもそのままでは手を加えにくいなぁと思えるところは、変更を加えます。
難解なつくりになっていて変更しにくいプログラムに強引に手をいれると、バグを発生させやすいので、先に機能はそのままで、変更しやすいような構造に変更するわけです。
それから、機能を追加します。
できるだけこの手順でやることを心がけて居るんですが、時々どうにもならないような状況になっちゃうこともあるんですけどね(^^;


2007年11月5日(月曜日)

軽量PHPフレームワークちいたん

カテゴリー: - Ryuji @ 18時51分34秒

いたれりつくせりの重量級フレームワークが多い中、総ファイルサイズ38kバイトという超軽量のPHPフレームワークがあることを先日知りました。

ちいたん

作成動機にすごく同意してしまいます。
引用:

ちなみに私は普段CakePHPを使用していますが、それを使用するほど大きなプロジェクトではなく、でも多少手のかかる物の場合に使えるフレームワークがほしい… そんなときに使えるフレームワークを目指して作成しました。

cubsonでのモジュール開発に慣れてしまうと、ちょっとしたものでも、一から作る気にはなれない。
でも、XOOPS Cubeを入れるほどでも無い。

そんなときに、XOOPS Cubeのモジュールとして開発するのか?
それとも、一からコツコツと書くのか?

これ、けっこう悩みます。

そんな、どっちでいこうかなぁと悩むようなプログラムを作成するときに、自分が使い慣れているフレームワークの軽量版があれば確かに便利だと思います。

ただ、今度は、どこまでその軽量版で開発して、どっからメインのフレームワークで開発するのか、その使い分けに悩みそうな気もしますが(^^;

それでも、ちょっとしたことにサクッと使える軽量フレームワークという考え方はいいなぁと思います。


2007年10月17日(水曜日)

Zend StudioでSubversion

カテゴリー: - gusagi @ 18時05分27秒

10/16からRYUSに入社したgusagiと申します。
以後、よろしくお願いいたします。
今日は、タイトルにもあるように、Zend Studioで開発する際にSubversionを利用する方法について、書かせて頂きます。

現在の最新バージョンであるZend Studio 5.5 日本語版では、標準でSubversionの利用が可能です。
ただし、Commitを実行しようとすると、
—-
Non-ASCII character detected (see above), and unable to convert to/from UTF-8
—-
といったエラーが出てしまうことがあります。
これは、コミットログに日本語を使用する際に発生するエラーです。
また、Logを実行して過去のコミットログを表示しようとしても、表示できない文字が”?\xxx"という形式で出力されます。
TortoiseSVNなどを用いている場合は、TortoiseSVNがUTF-8に変換してコミットしてくれるので問題はありませんが、せっかくZend StudioにもSubversionの機能があるのですから、Zend Studioだけで完結するようにしてみました。

(続き…)


14 queries. 0.060 sec.
Powered by WordPress Module based on WordPress ME & WordPress

〒104-0061 東京都中央区銀座1丁目3番3号 G1ビル7階
お問い合わせ TEL 03-3524-8860

Copyright(c) 2012 RYUS.All Rights Reserved.