<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>smallmake</title>
	<atom:link href="http://www.smallmake.com/wp/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.smallmake.com/wp</link>
	<description>Many small make a great.</description>
	<lastBuildDate>Thu, 03 May 2012 23:46:10 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>CoreData: iCloud同期についての考察 その１</title>
		<link>http://www.smallmake.com/wp/?p=838</link>
		<comments>http://www.smallmake.com/wp/?p=838#comments</comments>
		<pubDate>Tue, 24 Jan 2012 12:47:03 +0000</pubDate>
		<dc:creator>Eiji@smallmake</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.smallmake.com/wp/?p=838</guid>
		<description><![CDATA[Core Dataの iCloud同期について僕は誤解していた。自分でiCloudにあるCoreDataのデータを取得してiPhone本体側のデータにマージするなどは自分でやるものとてっきり思っていたのだ。それはちがって [...]]]></description>
			<content:encoded><![CDATA[<p>Core Dataの iCloud同期について僕は誤解していた。自分でiCloudにあるCoreDataのデータを取得してiPhone本体側のデータにマージするなどは自分でやるものとてっきり思っていたのだ。それはちがって、iPhone本体にあるローカルなデータとiCloud側のデータが自動で同期できる。すごく便利。でも考えておかなければならないことがありそうだということで、今回はその端緒となる話し「その１」です。</p>
<p><span id="more-838"></span></p>
<p>&nbsp;</p>
<div id="attachment_839" class="wp-caption alignright" style="width: 240px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2012/01/fig01.jpg" rel="lightbox[838]" title="goddess-gate.com"><img class="size-full wp-image-839" title="goddess-gate.com" src="http://www.smallmake.com/wp/wp-content/uploads/2012/01/fig01.jpg" alt="" width="230" height="188" /></a><p class="wp-caption-text">goddess-gate.com</p></div>
<h3>■見つけたサンプル</h3>
<p>以下のサイトのサンプルコードと解説のとおりに作ってみたところ、iCloud同期が実際に確認できた。すごく良い記事である。</p>
<p>→ <a href="http://goddess-gate.com/dc2/index.php/post/452">iOS How-To : Using Core Data with iCloud</a></p>
<p>なお、上記の記事にあるように Provisioning Profileが必要なので当然だが、iOSシミュレータではiCloudは使えない。実機が必要。</p>
<p>&nbsp;</p>
<div id="attachment_873" class="wp-caption alignright" style="width: 230px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2012/01/fig03.jpg" rel="lightbox[838]" title="Entitlement"><img class=" wp-image-873 " title="Entitlement" src="http://www.smallmake.com/wp/wp-content/uploads/2012/01/fig03-275x300.jpg" alt="Entitlement" width="220" height="240" /></a><p class="wp-caption-text">Entitlement</p></div>
<h3>■Entitlementの書き方</h3>
<p>上記の記事のように、まず AppIDを取得し、iCloudを Enable にして、Provisioning Profileを作りXCode4にインストールする。</p>
<p>次の手順、XCode4でEntitlementを有効にすると、Entitlementの iCloud-Key-Value や iCloud Containers の値には project bundle identifierだけが自動で追加される。上記のgoddess-gate.comの記事のスクリーンショットでは Individual IDである GBBYECND9 も含めているが、Xcode 4.2.1のデフォルトで生成される設定では、 Individual IDを記述せずbundle identifierだけ書くのでよいようだ。</p>
<p>Xcode 4.2.1 では .entitlements ファイルを見てみると、com.apple.developer.ubiquity-kvstore-identifier は $(TeamIdentifierPrefix)com.xxxxx.AppName のようになっていて$(TeamIdentifierPrefix)が自動で入るようになっているからだ。<br />
これにあわせて</p>
<blockquote><p>- (NSPersistentStoreCoordinator *)persistentStoreCoordinator</p></blockquote>
<p>の中の、cloudURLの値には、</p>
<blockquote><p>NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:<span style="color: red;">@"GBBYECND9.com.xxxx.AppName"</span>];</p></blockquote>
<p>のように設定することになる。</p>
<p>なお、 $(TeamIdentifierPrefix)com.xxxxx.AppName の$(TeamIdentifierPrefix)とcom.xxxxx.AppName の間にはピリオドがないから、 <span style="color: red;">@&#8221;GBBYECND9com.xxxx.AppName&#8221;</span>ではないの？と思ったが、ピリオドは勝手に入るらしい。実はこの誤解で多分30分くらいは無駄にした僕。</p>
<p>&nbsp;</p>
<h3>■iCloud対応はstoreURLの指すデータのoptionなのだなあ</h3>
<p>ここに書かれている、</p>
<blockquote><p>- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {}</p></blockquote>
<p>の中身を改めて読むと、iCloud対応はstoreURLのoptionなのだなあと気づく。</p>
<blockquote><p><span style="color: blue;">options =</span> [NSDictionary dictionaryWithObjectsAndKeys:<br />
[NSNumber numberWithBool:YES],<br />
NSMigratePersistentStoresAutomaticallyOption,<br />
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,<br />
<span style="color: blue;">@&#8221;AppName.store&#8221;, NSPersistentStoreUbiquitousContentNameKey,<br />
cloudURL, NSPersistentStoreUbiquitousContentURLKey,</span><br />
nil];<br />
if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:<span style="color: blue;">storeURL</span> options:<span style="color: blue;">options</span> error:&amp;error]) {}</p></blockquote>
<p>というのはつまり、僕は最初誤解していて、iCloudではiCloud用のsqliteファイルをiCloud上に別途作ってそれはそれで自分で管理するものと思っていたのだが、そうではなく storeURLというローカル（iPhone本体）に作ったsqliteファイルがあくまで主体としてあって、そのオプション設定としてiCloudがあるということが、コードから分かる。</p>
<p>このことが何を意味するかというと、iCloudに通信でつながらないときでも、storeURLが指すローカルのデータベースをガシガシ変更できて、そして後で通信がつながったときに、iOS5 が iCloud側のデータ同期を自動でしてくれるらしいということだ。実際に実験してみたらそのようになっていた。すごい！</p>
<p>&nbsp;</p>
<h3>■CoreDataの設計を変えたり、やり直しをしたい場合</h3>
<p>cloudURLにはどんな値がはいっているのだろう。デバッガでトレースして見てみると、</p>
<blockquote><p>file://localhost/private/var/mobile/Library/Mobile%20Documents/GBBYECND9~com~xxxxx~AppName&#8230;</p></blockquote>
<p>みたいな値が入っている。</p>
<p>iCloud用にローカルにファイルを作っているみたいだ。一時ファイルのようなものだろうか。<br />
CoreDataの設計を変えたり、やり直しをしたい場合にこれを消さなくてもいいのだろうか？というのが真っ先に起こる疑問だ。</p>
<p>実際、やり直しをするときにpersistentStoreCoordinatorの中でクラッシュしてしまうことがあった。そのような場合は、</p>
<ol>
<li>アプリをiPhoneから削除</li>
<li>iOS設定のiCloud設定の「ストレージとバックアップ」＞「ストレージを管理」で「書類およびデータ」のところにある自分の生成されたファイルを削除</li>
</ol>
<div id="attachment_855" class="wp-caption alignnone" style="width: 580px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2012/01/fig021.jpg" rel="lightbox[838]" title="設定＞ストレージ管理"><img class="size-full wp-image-855" title="設定＞ストレージ管理" src="http://www.smallmake.com/wp/wp-content/uploads/2012/01/fig021.jpg" alt="" width="570" height="180" /></a><p class="wp-caption-text">設定＞ストレージ管理</p></div>
<p>というのをするのに加えて、</p>
<blockquote><p>[[NSFileManager defaultManager] removeItemAtURL:cloudURL error:&amp;error];</p></blockquote>
<p>というのをしておいた方がいいのかも知れない。この削除に関しては以下のページに書かれていた。</p>
<p>→ <a href="http://stackoverflow.com/questions/8021753/crash-when-adding-persistent-store-icloud-enabled-in-app-delegate">Crash when adding persistent store (iCloud enabled) in app delegate</a></p>
<p>&nbsp;</p>
<h3>■2台のデバイスで試してみる（つづく）</h3>
<p>2台のデバイスで試してみた。<br />
両方でこの同じアプリを開いて、一方で更新してみると、数秒後にはそれがもう一方に反映される。感動的。</p>
<p>次に、一方を「機内モード」にして通信を遮断し、データを追加してみる。追加はこの上で問題なくできる。「機内モード」を解除して、しばらく待つと、それらのたまった変更が一気にもう一方に反映される。すごい。</p>
<p>しかし、何らかの原因で、双方のデータに矛盾が生じると、とたんに同期が止まる。多分どちらかはiCloudとは同期しているのだろう。iCloudと矛盾のある方が同期しなくなる。</p>
<p>上記のソースコードでは、こういう状況に対して何のエラーメッセージも用意されていない。これが次なる課題。矛盾があるとき、何らかのエラーメッセージを出してユーザーに解消方法を選んでもらうような処理を追加する必要があると思われる。</p>
<p>この課題について「その２」を書く予定です。</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.smallmake.com/wp/?feed=rss2&#038;p=838</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CoreData: Documentsフォルダ以外にsqliteファイルを置く</title>
		<link>http://www.smallmake.com/wp/?p=828</link>
		<comments>http://www.smallmake.com/wp/?p=828#comments</comments>
		<pubDate>Fri, 30 Sep 2011 09:50:21 +0000</pubDate>
		<dc:creator>Eiji@smallmake</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.smallmake.com/wp/?p=828</guid>
		<description><![CDATA[iTunesのAppタブにあるファイル共有を使う場合、アプリのDocumentsフォルダがその共有対象になる。ところが CoreDataを使っている場合、そのデータベースファイルもデフォルトではDocumentsフォルダ [...]]]></description>
			<content:encoded><![CDATA[<p>iTunesのAppタブにあるファイル共有を使う場合、アプリのDocumentsフォルダがその共有対象になる。ところが CoreDataを使っている場合、そのデータベースファイルもデフォルトではDocumentsフォルダに生成されるので、これがiTunesから見えてしまうという問題がある。CoreDataのファイルを別の場所に置く方法について調べたので以下にまとめておく。<br />
<span id="more-828"></span><br />
ちなみに、iTunesのAppタブのファイル共有で共有できるようにする方法は、Xcode4ではTARGETアプリのInfo(XXXX-Info.plist）に&#8221;Application supports iTunes file sharing&#8221;というタグを追加して(Xcode4でポップアップから選ぶだけ）、これをYESにすればよい。</p>
<p>さて、まず Documentsフォルダ以外に置くならどこに置けばよいのか。<br />
<a href="http://stackoverflow.com/questions/4551065/core-data-and-itunes-file-sharing-move-hide-the-sqlite-file-on-app-update">Core Data and iTunes File Sharing &#8211; Move/hide the .sqlite file on app update?</a><br />
の議論によると、そのアプリのフォルダ下の NSApplicationSupportDirectory すなわち /Library/Application Support フォルダがよいようだ。</p>
<p>次に、この変更をプログラムのどこで指定すればいいのか。MyAppというプロダクトなら、最初に動く、MyAppAppDelegate.m があって、この中に storeに関する以下のmethodがある。<br />
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { &#8230; }<br />
この中で、デフォルトでは以下のようにsqliteファイルのURLが設定されている。</p>
<blockquote><p>
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@&#8221;MyApp.sqlite&#8221;];
</p></blockquote>
<p>これの[self applicationDocumentsDirectory] がDocumentsフォルダへのパスを返しているのだとわかる。これを/Library/Application Support フォルダを返すものに変えればいいわけだ。</p>
<p>重要なヒントは以下のサイトに書かれていた。<br />
<a href="http://www.iphonedevsdk.com/forum/iphone-sdk-development/50381-where-store-persistent-files-ios-4-a.html">Where to Store Persistent Files in iOS 4?</a></p>
<p>NSApplicationSupportDirectoryを取得するメソッド applicationSupportDirectoryを作って、上記のデフォルトの [self applicationDocumentsDirectory] を[self applicationSupportDirectory] に差し替えればよいと書かれているのだとわかる(実際はNSStringをNSURLにも変えなければならない：後述）。</p>
<p>ここに書かれているサンプルコードでは、親切にも/Library/Application Support フォルダがまだない場合は生成する処理も書いてある。ところが惜しいことに、ここに書かれているcreateDirectoryAtPathの記述は少しだけ間違っている。また、NSStringもNSURLにしなければならない。</p>
<p>以下のページを参考にさせていただくと下のコードのようになるようだ。<br />
<a href="http://stackoverflow.com/questions/5492070/persistent-store-migration-failed-missing-source-managed-object-model">Persistent store migration failed missing source managed object model</a></p>
<p>ここでは applicationSupportDirectory というメソッドを作らずに直接書く形にした。</p>
<blockquote><p>
NSString *applicationSupportDirectory = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject];<br />
NSError *error = nil;<br />
if ( ![[NSFileManager defaultManager] fileExistsAtPath:applicationSupportDirectory isDirectory:NULL] ) {<br />
&nbsp;&nbsp;if (![[NSFileManager defaultManager]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createDirectoryAtPath:applicationSupportDirectory<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;withIntermediateDirectories:NO<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attributes:nil<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:&#038;error]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;NSAssert(NO, ([NSString stringWithFormat:@"Failed to create App Support directory %@ : %@", applicationSupportDirectory,error]));<br />
&nbsp;&nbsp;&nbsp;&nbsp;NSLog(@&#8221;Error creating application support directory at %@ : %@&#8221;,applicationSupportDirectory,error);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return nil;<br />
&nbsp;&nbsp;}<br />
}<br />
NSURL *storeURL = [NSURL fileURLWithPath: [applicationSupportDirectory stringByAppendingPathComponent: @"MyApp.sqlite"]];
</p></blockquote>
<p>もともとあった</p>
<blockquote><p>
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@&#8221;MyApp.sqlite&#8221;];
</p></blockquote>
<p>を、上記の数行に置き換えることで、/Library/Application Support フォルダにsqliteファイルを置くようにすることができる。</p>
<p>蛇足：NSApplicationSupportDirectoryでのフォルダ生成について調べていたら、以下のようなツールを提供しているサイトを見つけた。<br />
<a href="http://cocoawithlove.com/2010/05/finding-or-creating-application-support.html">Finding or creating the application support directory</a><br />
とても便利なツールで、このサイトから<br />
NSFileManager+DirectoryLocations.h<br />
NSFileManager+DirectoryLocations.m<br />
をダウンロードして、自分のプロジェクトに組み込み、<br />
#import &#8220;NSFileManager+DirectoryLocations.h&#8221;<br />
して、後は、<br />
NSString *path = [[NSFileManager defaultManager] applicationSupportDirectory];<br />
とやるだけで、必要なフォルダのパスが返ってくるだけでなく、もしフォルダがなければ自動生成してくれる。ただし、これはどうもマックのアプリ用だと思う。と言うのも、返ってくるのは/Library/Application Supportにさらにアプリの名前を付けたフォルダ名、例えば/Library/Application Support/MyApp フォルダとなるようにできているからだ。<br />
いつか使う日が来るかも知れないのでここにメモっておく。</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.smallmake.com/wp/?feed=rss2&#038;p=828</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Objective-C: インスタンス変数のアンダースコアについて</title>
		<link>http://www.smallmake.com/wp/?p=798</link>
		<comments>http://www.smallmake.com/wp/?p=798#comments</comments>
		<pubDate>Thu, 26 May 2011 09:30:18 +0000</pubDate>
		<dc:creator>Eiji@smallmake</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.smallmake.com/wp/?p=798</guid>
		<description><![CDATA[インスタンス変数にアンダースコアを付けることで、ローカル変数と見分けやすくするという手法がある。その理屈自体は分かるのだが @synthesize での扱いはどうすべきかとか、いやもっと言えば具体的なメリットはなんなのか [...]]]></description>
			<content:encoded><![CDATA[<p>インスタンス変数にアンダースコアを付けることで、ローカル変数と見分けやすくするという手法がある。その理屈自体は分かるのだが @synthesize での扱いはどうすべきかとか、いやもっと言えば具体的なメリットはなんなのかとか、実はよく分からなかった。逆に、ネットで検索すると、アンダースコアを付けることは勧めない（好みじゃないとか、それは古いやり方だとか）という人もいる。<br />
実際のところ、何か役立つことはあるのか。そもそも、そのガイドラインのようなものは存在するのだろうか、と思って調べてみたら以下のサイトでわりときれいに説明していた。<br />
<span id="more-798"></span><br />
<div id="attachment_810" class="wp-caption alignright" style="width: 160px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2011/05/davemeehan1.jpg" rel="lightbox[798]" title="davemeehan.com"><img src="http://www.smallmake.com/wp/wp-content/uploads/2011/05/davemeehan1-150x150.jpg" alt="davemeehan.comサイト写真" title="davemeehan.com" width="150" height="150" class="size-thumbnail wp-image-810" /></a><p class="wp-caption-text">davemeehan.com</p></div><a href="http://davemeehan.com/">Dave Meehan氏のブログ</a>の<a href="http://davemeehan.com/ios-dev/naming-conventions-for-instance-variables-and-properties">2010年5月19日の投稿</a>である。もう既に知っている方はいるだろうが、自分の記録のために抄訳してここに転載しておこうと思う。</p>
<blockquote><h3>インスタンス変数とプロパティの名付け方</h3>
<p>ここではコード内で変数の名付け方について書いたよ。君のプロジェクトやObjective-Cの理解に役立てば幸甚。このとは僕はあちこち見てまわったたり、アップルのドキュメントも見てみたんだけどぴんとこなかったんだ。だから、サンプルコードとか見ても、どういうことなのか分かるのに時間がかかったことなんだよ。</p>
<h4>インスタンス変数にはアンダースコアを付ける</h4>
<p>クラスでインスタンス変数にプレフィックスとしてアンダースコアを付けるのは<br />
・まず、インスタンス変数はデフォルトでprotectedだから、それはそのクラスとサブクラスからしかアクセスできないものだということ。<br />
・で、インスタンス変数へは、そのクラス（あるいは親クラス）から self. を付けなくても直接参照できることになっているから、見分けがつくのが、面倒くさいことにならなくていいよね。</p>
<pre>@interface MyObject : NSObject {
    NSArray *_arrayOfThings;
}

-(void) myMethod;
@end

@implementation MyObject

-(void) myMethod {
    for (id item in _arrayOfThings) {
        // do something ...
    }
}
@end</pre>
<p>上の例で、インスタンス変数に直接アクセスしてるでしょ。アンダースコアがあるおかげで、これが、このインスタンスに属しているもので、メソッドのパラメータでもローカル変数でもないことがわかるわけだ。もちろん、ほかの方法でインスタンス変数と分かるようにしたってかまわないね。例えば &#8216;member variables&#8217; の頭文字を取って、 mArrayOfThings ってやる人もいるだろう。</p>
<h4>&#8216;Local Declaration of &lt;var&gt; Hides Instance Variable&#8217;というコンパイラ警告の回避方法</h4>
<p>さて、僕が気づいた問題になる状況というのは、デリゲート・メソッドとの競合がある場合だ。SDKのサンプルは明確にしてくれてないので、だいぶ手こずったよ。以下のような場合だ。</p>
<pre>@interface MyTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
    UITableView *tableView;
}

@property (nonatomic,retain) IBOutlet UITableView *tableView;

@end

@implementation MyTableViewController

@synthesize tableView;

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // パラメータの 'tableView' がここではインスタンス変数の 'tableView' をマスクしてしまう

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: @"ident"];

    // だもので、上の行はコンパイラの警告がでる行になってしまうね

    //...
}

@end</pre>
<p>上のはごく普通にあるコードで、インスタンス変数とインターフェース・ビルダーのオブジェクトとしてプロパティを定義している。インスタンス変数の名付け方がデリゲートメソッドのパラメータをマスクしてしまって問題になるのははっきりしてるね。</p>
<h4>プロパティ名とインスタンス変数名は違うものにしたほうがいいんだ</h4>
<p>そこで、インスタンス変数にアクセスするときは、プロパティを使ってドット演算子で記述すればいいじゃんって君は思うだろう（例えば self.myInstanceVariable って感じで）。そのためにドット演算子はあるのさ。普通に @synthesize を使えばmyInstanceVariableとかsetMyInstanceVariableといったgetter/setterメソッドを自動生成できることだし。</p>
<p>そう、@synthesize を使えば getter/setter は生成される。でも、それは普通はインスタンス変数名と同じ名前するものだと思ってたんじゃないかい。実は、君は、@synthesize の名前をリダイレクトするように書くこともできるんだよ。つまり、</p>
<pre>@synthesize myInstanceVariable = _myInstanceVariable;</pre>
<p>って感じ。これで、アンダースコア付きのものはインスタンス変数で、付いてないのはプロパティってことになるわけ！そうすると以下のようにできるんだね。（★印のコメントのところに注目）</p>
<pre>@interface MyTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
    UITableView *_tableView;
}

@property (nonatomic,retain) IBOutlet UITableView *tableView;

@end

@implementation MyTableViewController

@synthesize tableView = _tableView;

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // ★以下はメソッドのパラメータである 'tableView' への参照

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: @"ident"];

    // ★以下はクラスのプロパティである 'tableView' への参照（間接的にインスタンス変数になる）

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier: @"ident"];

    // ★以下は、インスタンス変数である '_tableView' への直接参照

    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier: @"ident"];

    //...
}

@end</pre>
</blockquote>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.smallmake.com/wp/?feed=rss2&#038;p=798</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>宗達にデザイン感覚の現代的原型を見る</title>
		<link>http://www.smallmake.com/wp/?p=785</link>
		<comments>http://www.smallmake.com/wp/?p=785#comments</comments>
		<pubDate>Sat, 14 May 2011 12:56:26 +0000</pubDate>
		<dc:creator>Eiji@smallmake</dc:creator>
				<category><![CDATA[Art]]></category>

		<guid isPermaLink="false">http://www.smallmake.com/wp/?p=785</guid>
		<description><![CDATA[酒井抱一生誕250年ということで、今年の1月から3月にかけて東京の各所で特別展がありました。畠山記念館と出光美術館へ始めて行ってきました。酒井抱一については、またいつか書くとして、今回は、このブログで前に書いた光悦と宗達 [...]]]></description>
			<content:encoded><![CDATA[<p>酒井抱一生誕250年ということで、今年の1月から3月にかけて東京の各所で特別展がありました。畠山記念館と出光美術館へ始めて行ってきました。酒井抱一については、またいつか書くとして、今回は、このブログで<a href="http://www.smallmake.com/wp/?p=170">前に書いた光悦と宗達による「鹿下絵和歌巻」</a>に関連して、その続きを書きたいと思います。<br />
<span id="more-785"></span><br />
ちなみに、酒井抱一は現在のアカデミック的には「琳派」に属すると分類されており、これは尾形光琳がそのスタイルを固めたのでそう呼ばれているのですが、その光琳の先駆けとして俵屋宗達が位置づけられています。もっとも、よく知られているように、宗達、光琳、抱一には師弟関係はなく、それぞれが先達の作品を勝手に見つけて私淑して手法を独自に学んでいる事実があることから、後の世になって（多分大正時代頃）アカデミカルに「琳派」と呼んで系統づけられたということです。そんなわけで、収集家の方もひとつの流れとしてこれを受け止めており、酒井抱一の生誕記念展示では、先達と位置づけられている宗達や光琳の作品も見ることができるわけなのです。なお、宗達は江戸時代前期の京都の人で、抱一は江戸時代後期の江戸の人です。200年くらいの隔たりがあります。</p>
<p>さて、光悦と宗達による金銀泥下絵の和歌巻にはいくつかのシリーズ作品があります。畠山記念館では「金銀泥薄下絵古今和歌巻」を見ることができました。この下絵は宗達本人なのか弟子のものかどうかは不明ですが、本阿弥光悦の書で、彼のディレクションのもとに作成された、とてもシンプルなしゃれた作品です。</p>
<p>他にも、畠山記念館には「金銀泥四季草花下絵古今集和歌巻 」（重要文化財）があり、出光美術館には「蓮下絵百人一首和歌巻」の断簡（後の世の人が掛け軸などにするために長い巻物の部分を切り取ってしまったもの）や、「月に萩・蔦下絵古今和歌巻」「花卉摺絵(かきすりえ)古今和歌巻」といったものがあると図録には載っていました。これらは実際には見ることはできませんでした。<br />
既に見ていたのは、前のログにも書いた神戸市博物館に来た「鹿下絵和歌巻」（シアトル美術館蔵）と京都国立博物館の「日蓮展」で展示されていた「鶴下絵三十六歌仙和歌巻」（京都国立博物館蔵）の一部分でした。</p>
<p>いずれも、一種のグラフィックデザイン的であるという点でとても面白いと僕は感じます。例えば、同じように装飾絵画としての主流であった狩野派の作品とは明らかに違っています。その違いとはなにかというと、例えば、画面構成におけるリズム感であり、リズムを作り出すために空間の切り出し方や物体の抽象化（デフォルメ）についてあえて思い切ったことをしています。そこが絵画というよりグラフィックデザイン的であるゆえんだと思います。</p>
<p>下絵和歌巻ではないですが、それを端的に示しているのが、宗達の「蔦の細道図屏風」だと思います。画面の背景は緑の丘のように見えるのですが、その手前で画面の左上から右下に掛けて空間が裂けて開けているようになって、その中に蔦が向こう側の空間を垣間見るような感じで垂れ下がっている、みたいな構成になっています。もはやSFチックですらあります。</p>
<p>でもそもそも、グラフィックデザインというものは現代的な発想であると僕は思い込んでしまっているのかもしれません。だから、あの時代にこんなものが！と思って面白いと感じてしまうのですが、実際には、人間のデザイン発想は近代的な部分では少なくとも数百年前とはそれほど変わっていないのかもしれません。変わったのは、それを表現する技術（例えばコンピュータ）やそれを生み出す組織力（これも一種の技術ですが）に過ぎないというわけです。そして、例えばこれから千年もすれば、僕らは江戸時代前期、あるいは中世くらいの時代の人間と同じくくりの中で分類されるのかもしれません。ここら辺の人間はほぼ同時代人というわけです。</p>
<p>「金銀泥四季草花下絵古今集和歌巻 」と「月に萩・蔦下絵古今和歌巻」を図録でみると、前者はその冒頭がすごい竹の幹のクローズアップで始まっており、後者は、満月を表すすごく大きな銀の円が冒頭でいきなりどーんと現れ、そして四季の草木や月に照らされた萩へと巻物の絵がまるでカメラがパンしていくかのような構成になっています。現代の映画やアニメーションででもありそうな構成だと感心します。でも、それは現代的であるというより、実際には、ひとつのデザイン的なあるいは音楽的な物語構成について近代人（もしかすると中世も含む）が持つ原型みたいなものなのかもしれないと思うのでした。逆にいうと、宗達の作品にはそういうことを見いだせる要素がいくつもあるように思います。そういうところが宗達を興味深いと思えるひとつの要因なのかもしれません。</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.smallmake.com/wp/?feed=rss2&#038;p=785</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ダウンロード：SimpleXMLによる掲示板ソフト Xmlbulletin &#8211; PHP5.2</title>
		<link>http://www.smallmake.com/wp/?p=691</link>
		<comments>http://www.smallmake.com/wp/?p=691#comments</comments>
		<pubDate>Mon, 09 May 2011 12:48:01 +0000</pubDate>
		<dc:creator>Eiji@smallmake</dc:creator>
				<category><![CDATA[Download]]></category>

		<guid isPermaLink="false">http://www.smallmake.com/wp/?p=691</guid>
		<description><![CDATA[PHP5.2上で動作するXMLを使った電子掲示板ソフトを公開します。SimpleXMLを使っています。あまり大きなファイルは扱えないですが、この記事の中で述べるような方法で「拡張クラス」を作ることで柔軟にいろいろなXML [...]]]></description>
			<content:encoded><![CDATA[<p>PHP5.2上で動作するXMLを使った電子掲示板ソフトを公開します。SimpleXMLを使っています。あまり大きなファイルは扱えないですが、この記事の中で述べるような方法で「拡張クラス」を作ることで柔軟にいろいろなXMLフォーマットに対応させることができます。各HTMLフォーム要素が使え、入力バリデーションも提供しています。また、Cookeiやセッション、JavaScriptを使用しないので携帯電話などでも利用可能だと思います。バグ報告、ご要望などはコメント欄やメールでお寄せください。<br />
<span id="more-691"></span></p>
<h3 class="comments">プログラム構成</h3>
<p>以下の3つのクラスファイルとユーティリティで構成されています。<br />
- xmlbulletin.class.php : いわゆるコントローラにあたります<br />
- xmlbulletin.model.php : XMLへの入出力を担います<br />
- xmlbulletin.view.php : 一覧や入力フォームの表示を担います<br />
- utility.php : 翻訳機能やバリデーションのヘルパー機能を提供します</p>
<p>以下は、同梱されているサンプルです。<br />
- xmlbulletin.php : 利用ページのサンプルです<br />
- xmlbulletin.css : CSSサンプルです<br />
- local.ja : 日本語への翻訳テーブルのサンプルです<br />
- bbs.php : 電子掲示板を拡張する「拡張クラス」のサンプルです<br />
- atom.php : ATOMフォーマットを扱う「拡張クラス」のサンプルです<br />
- rss20.php : RSS2.0フォーマットを扱う「拡張クラス」のサンプルです</p>
<p><a name="startup"></a></p>
<h3 class="comments">起動方法</h3>
<p>上記サンプル xmlbulletin.php を使う場合、以下のように普通にブラウザでURL指定すると、デフォルトの掲示板になります。</p>
<blockquote><p>http://www.example.com/xmlbulletin.php</p></blockquote>
<p>　<br />
いろいろなパタンのXMLに対応させるために「拡張クラス」を使えますが、「拡張クラス」をソースの中でインクルードする必要はありません。下記のように / (スラッシュ）で区切って呼び出せば、インクルードされるようになっています。「拡張クラス」の作り方は後半で詳しく説明します。</p>
<blockquote><p>bbs.phpを使う→ http://www.example.com/xmlbulletin.php/bbs/<br />
atom.phpを使う→ http://www.example.com/xmlbulletin.php/atom/<br />
rss20.phpを使う→ http://www.example.com/xmlbulletin.php/rss20/</p></blockquote>
<h3 class="comments">サンプル表示例</h3>
<p>下図がサンプル「拡張クラス」のbbs.php での表示例です。CSSはデフォルトのxmlbulletin.css を使った表示例を下に示します。（なお、xmlbulletin.cssは &#8216;display:inline-block&#8217; を使っているためIE6, IE7では表示は崩れます。またIE8ではボタンが角丸ボタンになりません）各図はクリックで拡大表示します。<br />
<div id="attachment_701" class="wp-caption alignleft" style="width: 288px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2011/05/fig1-1.gif" rel="lightbox[691]" title="カラム一覧表示"><img src="http://www.smallmake.com/wp/wp-content/uploads/2011/05/fig1-1-278x300.gif" alt="カラム一覧表示例" title="カラム一覧表示" width="278" height="300" class="size-medium wp-image-701" /></a><p class="wp-caption-text">カラム一覧表示例</p></div><br />
<div id="attachment_702" class="wp-caption alignleft" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2011/05/fig1-2.gif" rel="lightbox[691]" title="ページ下部のページ移動ボタン"><img src="http://www.smallmake.com/wp/wp-content/uploads/2011/05/fig1-2-300x97.gif" alt="ページ下部のページ移動ボタン" title="ページ下部のページ移動ボタン" width="300" height="97" class="size-medium wp-image-702" /></a><p class="wp-caption-text">ページ下部のページ移動ボタン</p></div><br />
<div id="attachment_703" class="wp-caption alignleft" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2011/05/fig1-3.gif" rel="lightbox[691]" title="リスト表示"><img src="http://www.smallmake.com/wp/wp-content/uploads/2011/05/fig1-3-300x191.gif" alt="リスト表示" title="リスト表示" width="300" height="191" class="size-medium wp-image-703" /></a><p class="wp-caption-text">リスト表示</p></div><br />
<div id="attachment_704" class="wp-caption alignleft" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2011/05/fig1-4.gif" rel="lightbox[691]" title="新規および編集"><img src="http://www.smallmake.com/wp/wp-content/uploads/2011/05/fig1-4-300x273.gif" alt="新規および編集表示" title="新規および編集" width="300" height="273" class="size-medium wp-image-704" /></a><p class="wp-caption-text">新規および編集</p></div></p>
<div style="clear:both"></div>
<h3 class="comments">翻訳機能の役割</h3>
<p>サンプルには local.ja というファイルがあります。xmlbulletinは基本的に表示は英語で作成されています。クラスファイルと同一ディレクトリにlocal.jaという名前のファイルを置くと、この中に記述されている翻訳テーブルに基づいて自動的に日本語表示になります。試しに、ファイルlocal.jaを削除して起動すると以下のようにボタンなどが英語表示の画面になります。<br />
<div id="attachment_714" class="wp-caption alignleft" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2011/05/fig2-1.gif" rel="lightbox[691]" title="locale.jaを外した表示"><img src="http://www.smallmake.com/wp/wp-content/uploads/2011/05/fig2-1-300x272.gif" alt="locale.jaを外した表示" title="locale.jaを外した表示" width="300" height="272" class="size-medium wp-image-714" /></a><p class="wp-caption-text">locale.jaを外した表示</p></div></p>
<div style="clear:both"></div>
<p>例えば、locale.ja内には以下のような記述があります。</p>
<blockquote><p>&#8220;OK&#8221; = 					&#8220;実行&#8221;<br />
&#8220;Cancel&#8221; = 				&#8220;キャンセル&#8221;<br />
&#8220;Submit&#8221; =				&#8220;登録&#8221;<br />
&#8220;INDEX&#8221; =				&#8220;一覧へ&#8221;<br />
&#8220;Are you sure?&#8221; = 			&#8220;続行しますか？&#8221;<br />
&#8220;ERROR&#8221; = 				&#8220;エラー&#8221;<br />
&#8220;EDIT&#8221; = 					&#8220;編集&#8221;<br />
&#8220;VIEW&#8221; = 				&#8220;詳細&#8221;<br />
&#8220;DELETE&#8221; = 				&#8220;削除&#8221;<br />
&#8220;UP&#8221; = 				&#8220;△&#8221;<br />
&#8220;DOWN&#8221; = 				&#8220;▽&#8221;<br />
&#8220;ADD&#8221; = 					&#8220;新規&#8221;<br />
&#8220;LIST MODE&#8221; =			&#8220;リスト表示&#8221;<br />
&#8220;COLUMN MODE&#8221; =		&#8220;カラム一覧表示&#8221;<br />
&#8220;|&amp;lt;TOP&#8221; = 				&#8220;|≪トップ&#8221;<br />
&#8220;&amp;lt;PREV&#8221; = 				&#8220;≪前へ&#8221;<br />
&#8220;NEXT&amp;gt;&#8221; =				&#8220;次へ≫&#8221;<br />
&#8220;LAST&amp;gt;|&#8221; =				&#8220;最後≫|&#8221;<br />
&#8220;[%d/%d]&#8221; =				&#8220;%dページ/全%dページ&#8221;</p></blockquote>
<p>逆に言えば、これらのボタンなどの表示名を変更したり、何かのスタイルを付加したい場合にはプログラムソースの変更は必要なく、locale.jaを変更していただければよいことになります。<br />
また、locale.ja の .ja はブラウザの言語環境に対応しています。 具体的には、$_SERVER['HTTP_ACCEPT_LANGUAGE']で取得される文字列の最初の2文字に対応させています。日本語環境ではsafariなどでは &#8216;ja&#8217; そのものが、FireFoxなどでは &#8216;ja_JP&#8217; が取得されますので、これらに関して &#8216;locale.ja&#8217; が採用されます。英語環境なら &#8216;en&#8217; あるいは &#8216;en-us&#8217; などが取得されるので、 &#8216;locale.en&#8217; を作れば、英語表示の変更にも使えます。locale.ja と locale.en の両方を設置しておけば、それぞれの環境で違った表示にすることができます。<br />
なお、locale.ja については現状試験的な機能です。将来的にファイルの記述フォーマットや設置位置の仕様変更の可能性があります（WordPressなどで使っているgettext.phpを検討中）。</p>
<h3 class="comments">自分のPHPへのxmlbulletinの組み込み方法</h3>
<p>添付の xmlbulletine.php は、組み込み方のもっともシンプルな一例です。現実問題としては、サイドバーのあるページや、その他いろいろな要素を持つページの中に掲示板を組み込みたいところだと思います。以下のようにPHPコードを挿入すれば、基本的にどんなPHPにもこのシステムを組み込むことができます。<br />
１）ファイルの冒頭に記述<br />
以下のコードを必ず冒頭で行ってください。</p>
<blockquote><p>&lt;?php<br />
&nbsp;&nbsp;include_once(&#8220;utility.php&#8221;);<br />
&nbsp;&nbsp;include_once(&#8220;xmlbulletin.class.php&#8221;);<br />
&nbsp;&nbsp;$xb = new Xmlbulletin;<br />
?&gt;</p></blockquote>
<p>２）タイトルの記述<br />
必須というわけではないですが&lt;title&gt;タグに以下のように記述すれば、「拡張クラス」毎に設定したタイトルになります。</p>
<blockquote><p>&lt;title&gt;&lt;?php echo $xb->error ? __(&#8216;ERROR&#8217;) : __($xb->model->title); ?&gt;&lt;/title&gt;</p></blockquote>
<p>３）&lt;head&gt;内に記述<br />
以下を&lt;head&gt;内に記述することで、デフォルトまたはカスタマイズしたCSSファイルへのlinkを挿入することができます。</p>
<blockquote><p>&lt;?php echo $xb->html_head; ?&gt;</p></blockquote>
<p>４）掲示板の表示<br />
掲示板を表示する場所に以下のコードを挿入してください。</p>
<blockquote><p>&lt;?php<br />
&nbsp;&nbsp;if($xb->error) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo __($xb->error);<br />
&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$xb->display();<br />
&nbsp;&nbsp;}<br />
?&gt;</p></blockquote>
<p>以上のコード挿入を行ってください。<br />
xmlbulletineのセットのファイル群をそのPHPファイルと同じディレクトリにおいて、そのPHPファイルをブラウザで呼び出します。「拡張クラス」を作った場合は / (スラッシュ)で区切って指定します（※<a href="#startup">「起動方法」</a>参照）</p>
<h3 class="comments">「拡張クラス」の作り方</h3>
<p>さて、いよいよいろいろなXMLフォーマットに対応させるための「拡張クラス」の作り方です。「拡張クラス」を適切に記述することで、XMLの構造の指定やアイテムへの属性の付加、入力バリデーション設定、および表示フォームのタイプやオプション項目の指定などを行うことができます。<br />
「拡張クラス」ファイルには2つclassのextendsを記述します。XMLファイルへの入出力を行うclass XmlbulletinModel のextendsクラスの部分と、一覧や入力フォームの表示を行うclass XmlbulletinView の extendsクラス部分です。<br />
bbs.php の全容を見るとざっと下図のような構成です。各変数にいろいろな決まりがある（後述）のですが、要素としてはコレで全部ですので、それほどややこしくはないと思います。<br />
<div id="attachment_731" class="wp-caption aligncenter" style="width: 237px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2011/05/fig3-11.gif" rel="lightbox[691]" title="「拡張クラス」構成例概観"><img src="http://www.smallmake.com/wp/wp-content/uploads/2011/05/fig3-11-227x300.gif" alt="「拡張クラス」構成例概観" title="「拡張クラス」構成例概観" width="227" height="300" class="size-medium wp-image-731" /></a><p class="wp-caption-text">「拡張クラス」構成例概観（クリックで拡大）</p></div></p>
<h3 class="comments">拡張クラス model の書き方</h3>
<p>class XmlbulletinModel の拡張クラスとしてclass modelを作ります。class名は modelでなければなりません。<br />
以下の既定の変数を記述します。必須でないものは省略しても結構です。各変数について、後に詳述します。</p>
<table>
<tr>
<th>変数名</th>
<th>必須</th>
<th>概要</th>
</tr>
<td>$title</td>
<td>&nbsp;</td>
<td>タイトルとなる文字列を指定</td>
</tr>
<td>$xml_file_name</td>
<td>&nbsp;</td>
<td>XMLファイル名(省略:拡張クラスファイル名+.xml)</td>
</tr>
<td>$xml_file_path</td>
<td>&nbsp;</td>
<td>XMLファイルのディレクトリ(省略:クラスと同じディレクトリ)</td>
</tr>
<td>$fore</td>
<td>○</td>
<td>XMLのヘッダ部分となるノード構造を配列で記述</td>
</tr>
<td>$fore_attributes</td>
<td>&nbsp;</td>
<td>上記の構造の中でノード属性を付けるものの設定</td>
</tr>
<td>$item_parent</td>
<td>○</td>
<td>アイテムの親となるノードのタグ名を指定</td>
</tr>
<td>$item</td>
<td>○</td>
<td>XMLのアイテムとなるノード構造を配列で記述</td>
</tr>
<td>$item_attributes</td>
<td>&nbsp;</td>
<td>アイテムの構造の中でノード属性を付けるものの設定</td>
</tr>
<td>$item_validations</td>
<td>&nbsp;</td>
<td>アイテムの各ノードのバリデーションを設定</td>
</tr>
</table>
<p>　</p>
<h4>$title</h4>
<p>ページのタイトルとなる文字列を記述します。翻訳機能の対象になっています。もちろん翻訳機能を使わない場合は日本語でそのまま記述しても結構です。</p>
<blockquote><pre>public $title = "Bulletine Board System";</pre>
</blockquote>
<p>　</p>
<h4>$fore</h4>
<p>XMLにはたいていの場合、データ本体となる繰り返しのアイテムの前に親または同レベルのノードとしてタイトルなどを記述します。その部分の構造を配列で記述します。配列は階層構造になっても大丈夫です。その構造がそのままXMLの構造として反映されます。これは必須です。<br />
配列のkey名がタグに、valueがそのタグの内容になります。<br />
value側には<strong>XML生成時に</strong>設定されるデフォルトの文字列を記述できます。<br />
この文字列には、｛｝（中カッコ）でくくってPHPの何か値を返すファンクションを含めることができます。例えば{date(&#8220;Y-m-d&#8221;)}とすれば、このXMLの生成時の日付が入ります。</p>
<blockquote><pre>public $fore = array(
	'bbs' => array(
		'title' => 'Bulletine Board System',
		'subtitle' => '',
		'updated' => '{date("Y-m-d H:i:s")}',
		'id' => 'tag:smallmake.com,{date("Y-m-d")},{uniqid()}',
		'generator' => 'xmlbulletine'
	)
);</pre>
</blockquote>
<p>　</p>
<h4>$fore_attributes</h4>
<p>$foreで記述したノードに<strong>XML生成時に</strong>XML属性を付加することができます。ここでは構造を表すのには配列を使わず、パス記述でノードを指定します。例えば、ルートであるbbsの下のsubtitleのノードのパスは &#8216;/bbs/subtitle&#8217; となります。このパスをキーとして、その下に配列をつくり、その配列のkeyで属性名、valueで属性値を指定します。</p>
<blockquote><pre>public $fore_attributes = array (
	'/bbs/subtitle' => array('type' => 'html')
);</pre>
</blockquote>
<p>　</p>
<h4>$item_parent</h4>
<p>この後のアイテムノードの親ノードの名前を指定します。親ノードは$foreに記述されていて、それを指していなければなりません。これは必須です。</p>
<blockquote><pre>public $item_parent = "bbs";</pre>
</blockquote>
<p>　</p>
<h4>$item</h4>
<p>アイテムのノード構造を配列を使って記述します。$foreと同様、配列のkey名がタグに、value側には<strong>アイテムの生成時に</strong>設定されるデフォルトの文字列を記述できます。｛｝（中カッコ）での記述は$foreと同様です。</p>
<blockquote><pre>public $item = array(
	'entry' => array (
			'title' => '',
			'id'		=> 'tag:smallmake.com,{date("Y-m-d")},{uniqid()}',
			'published' => '{date("Y-m-d H:i:s")}',
			'author' => array(
				'name' => '',
				'uri'  => '',
				'email' => '',
				'gender' => '',
				'age' => '',
				'pc' => ''
			),
			'content' => ''
		)
);</pre>
</blockquote>
<p>　</p>
<h4>$item_attributes</h4>
<p>$itemで記述したノードに<strong>アイテムの生成時に</strong>XML属性を付加することができます。ここでは構造を表すのには$fore_attributesと同様に配列を使わず、パス記述でノードを指定します。<br />
&#8220;type&#8221;=&#8221;html&#8221;属性はこのシステムでは重要な役割をします。&#8221;type&#8221;=&#8221;html&#8221;属性のノードは、カラム一覧やリスト表示の時にHTML特殊文字をエスケープしないように出力されます。例えば、新規や編集フォームで<br />
「&lt;a href=&#8221;http://www.smallmake.com&#8221;&gt;このサイト&lt;/a&gt;」<br />
と入力して登録すると、カラム一覧やリストでの表示は&#8221;type&#8221;=&#8221;html&#8221;属性のある項目の場合<br />
「<a href="http://www.smallmake.com">このサイト</a>」<br />
と表示され、この属性のないものはそのまま<br />
「&lt;a href=&#8221;http://www.smallmake.com&#8221;&gt;このサイト&lt;/a&gt;」<br />
と表示されることになります。</p>
<blockquote><pre>public $item_attributes = array(
    'entry/content' => array('type' => 'html')
);</pre>
</blockquote>
<p>　</p>
<h4>$item_validations</h4>
<p>バリデートしたいノードをパスで指定します。バリデートしたいものだけ記述すればよいです。そのノードパスをkeyとする配列を作り、その下にさらに配列を作り、そのkeyとしてバリデートしたいルールを、そしてその　valueにバリデーションの結果エラーとなったな場合のメッセージを記述します。ただし、ルールに何らかの条件値を設定しなければならない場合（例えば最大値や最小値の比較バリデーション）は、valueをさらに配列にして&#8217;param&#8217;=>でその条件値、&#8217;message&#8217;=>でエラーメッセージを指定します。つまり以下の2パターンがあるということです。<br />
１） ’ノードパス&#8217; => array(&#8216;ルール&#8217;=>&#8217;エラーメッセージ&#8217;);<br />
２） ’ノードパス’ => array(&#8216;ルール&#8217;=>array(&#8216;param&#8217;=>&#8217;条件値&#8217;, message=>&#8217;エラーメッセージ&#8217;);<br />
バリデーションで指定できるルールと条件値などの一覧は下図を見てください。</p>
<table>
<tbody>
<tr>
<th>ルール</th>
<th nowrap>検証内容</th>
<th>条件値</th>
<th>備考</th>
</tr>
<tr>
<td nowrap>require</td>
<td nowrap>必須入力にする</td>
<td nowrap>なし</td>
<td></td>
</tr>
<tr>
<td nowrap>email</td>
<td nowrap>メールアドレス<br />
の書式</td>
<td nowrap>&#8220;checkDNS&#8221;</td>
<td>”checkDNS”を指定した場合、ドメイン名をネットワークでチェック。</td>
</tr>
<tr>
<td>zip</td>
<td nowrap>郵便番号の書式</td>
<td nowrap>&#8220;jp&#8221;, &#8220;us&#8221;</td>
<td>jp: 日本3桁-4桁、 us: 米国5桁-4桁</td>
</tr>
<tr>
<td nowrap>phone</td>
<td nowrap>電話番号の書式</td>
<td nowrap>&#8220;jp&#8221;, &#8220;us&#8221;</td>
<td>jp:日本[2～5桁]-[1～5桁]-[3～5桁]、 us:3桁-3桁-4桁</td>
</tr>
<tr>
<td nowrap>date</td>
<td nowrap>日付書式</td>
<td nowrap>フォーマット</td>
<td>フォーマットにはPHPのdate関数のフォーマット文字列を使用。フォーマット文字列については <a href="http://jp2.php.net/manual/ja/function.date.php">http://jp2.php.net/manual/ja/function.date.php</a>を参照。指定がない場合、”Y-m-d” とする。”Y-m-d”は例えば “2010-03-14”のような形式を表す。</td>
</tr>
<tr>
<td nowrap>max</td>
<td nowrap>最大数値</td>
<td nowrap>数値</td>
<td>最大値の数字を指定。それより大きい数字が入力されるとエラーとする。</td>
</tr>
<tr>
<td nowrap>min</td>
<td nowrap>最小数値</td>
<td nowrap>数値</td>
<td>最小値の数字を指定。それより少ない数字が入力されるとエラーとする。</td>
</tr>
<tr>
<td nowrap>maxLength</td>
<td nowrap>最大文字数</td>
<td nowrap>数値</td>
<td>最大文字数を指定。それより多い文字数が入力されるとエラーとする。</td>
</tr>
<tr>
<td nowrap>minLength</td>
<td nowrap>最小文字数</td>
<td nowrap>数値</td>
<td>最小文字数を指定。それより少ない文字数が入力されるとエラーとする。</td>
</tr>
<tr>
<td nowrap>alphaNumeric</td>
<td nowrap>半角英数字</td>
<td nowrap>なし</td>
<td></td>
</tr>
<tr>
<td nowrap>numeric</td>
<td nowrap>半角数字</td>
<td nowrap>なし</td>
<td></td>
</tr>
<tr>
<td nowrap>url</td>
<td nowrap>URL書式</td>
<td nowrap>なし</td>
<td>http: https: ftp: で始まるURL書式</td>
</tr>
<tr>
<td nowrap>ip</td>
<td nowrap>IPアドレス書式</td>
<td nowrap>なし</td>
<td></td>
</tr>
<tr>
<td nowrap>creditCard</td>
<td nowrap>クレジットカード<br />
ナンバー書式</td>
<td nowrap>なし</td>
<td></td>
</tr>
<tr>
<td nowrap>ssn</td>
<td nowrap>米国社会保障番号</td>
<td nowrap>なし</td>
<td></td>
</tr>
<tr>
<td nowrap>custom</td>
<td nowrap>ユーザー指定の<br />
文字列検証</td>
<td nowrap>正規表現</td>
<td>正規表現で検証文字列を指定する。</td>
</tr>
</tbody>
</table>
<blockquote><pre>public $item_validations = array(
  'entry/title' =>         array('require'=>'Title is required.'),
  'entry/published' =>     array('date'=>array('param'=>'Y-m-d H:i:s',
                                'message'=>'Invalid Date format(need Y-m-d H:i:s)')),
  'entry/author/name' =>   array('require'=>'Your name is required.'),
  'entry/author/uri' =>   array('url'=>'Invalid Site URL format.'),
  'entry/author/email' => array('require'=>'Your E-Mail is required.',
                                'email'=>'Invalid E-Mail format.'),
  'entry/author/gender' =>   array('require'=>'Select your gender.'),
  'entry/content' =>      array('require'=>'Comment is required.')
);</pre>
</blockquote>
<h3 class="comments">拡張クラス view の書き方</h3>
<p>class XmlbulletinView の拡張クラスとしてclass viewを作ります。class名は viewでなければなりません。<br />
以下の既定の変数を記述します。全て省略可です。省略した場合、デフォルトもしくは無設定になります。各変数について、後に詳述します。</p>
<table>
<tr>
<th>変数名</th>
<th>デフォルト</th>
<th>概要</th>
</tr>
<td>$edit_mode</td>
<td>TRUE</td>
<td>「編集」ボタン等の表示/非表示</td>
</tr>
<td>$sort_mode</td>
<td>descending</td>
<td>カラム一覧/リスト表示の表示順</td>
</tr>
<td>$line_per_page</td>
<td>10</td>
<td>リスト表示1ページの件数</td>
</tr>
<td>$column_per_page</td>
<td>5</td>
<td>カラム一覧1ページの件数</td>
</tr>
<td>$item_styles</td>
<td>無設定</td>
<td>フォームの要素のタイプ、ラベル、オプション値など</td>
</tr>
</table>
<p>　</p>
<h4>$edit_mode</h4>
<p>これは編集用のボタンを表示するかどうかの指定です。閲覧だけする人たちのために用意したページでは「新規」「編集」「削除」といったボタンは不要です。そのような場合、FALSEにすると表示しません。<br />
TRUE : 編集用のボタン等を表示<br />
FALSE : 編集用のボタン等を隠す</p>
<blockquote><pre>public $edit_mode = true;</pre>
</blockquote>
<p>　</p>
<h4>$sort_mode</h4>
<p>カラム一覧やリスト表示の表示順の指定です。<br />
ascending : アイテムを入力した順に表示（古いものから順に表示）<br />
descending : アイテムを入力した順の逆順に表示（新しいものが上）</p>
<blockquote><pre>public $sort_mode = "descending";</pre>
</blockquote>
<p>　</p>
<h4>$line_per_page と $column_per_page</h4>
<p>カラム一覧およびリスト表示のページングをします。1ページに表示する件数を指定できます。<br />
$line_per_page : リスト表示の場合の1ページの件数<br />
$column_per_page : カラム一覧表示の場合の1ページの件数</p>
<blockquote><pre>public $line_per_page = 10;
public $column_per_page = 5;</pre>
</blockquote>
<p>　</p>
<h4>$item_styles</h4>
<p>フォームの要素のタイプ、ラベル、オプション値の一覧などの指定ができます。配列のkeyでノードパスで指定し、そのvalueを配列にして、keyで設定内容、valueで設定値を記述します。</p>
<table>
<tr>
<th nowrap>設定内容</th>
<th>設定値</th>
<th>備考</th>
</tr>
<td nowrap>type</td>
<td nowrap>フォーム要素タイプ</td>
<td>HTMLタグの&lt;input type=&#8221;"で指定するタイプであるtext / radio / checkbox / hidden、あるいはselect, textareaを指定できます。hiddenにしたものはカラム一覧やリスト表示でも非表示になります。</td>
</tr>
<tr>
<td nowrap>label</td>
<td nowrap>表示ラベル</td>
<td>HTMLタグの&lt;label&gt;で付ける表示ラベルを記述します。翻訳機能の対象ですが、翻訳の必要がなければ日本語をそのまま記述しても結構です</td>
</tr>
<tr>
<td nowrap>options</td>
<td nowrap>選択項目（配列）</td>
<td>radio, checkbox, selectの場合の選択項目を配列で指定します。この配列のkeyがフォームのvalueとなり、配列のvalueは表示される文字列となります。表示文字列は翻訳機能の対象ですが、翻訳の必要がなければ日本語をそのまま記述しても結構です</td>
</tr>
<tr>
<td nowrap>readonly</td>
<td nowrap>readonly属性</td>
<td>少し助長ですが&#8217;readonly&#8217;=&gt;&#8217;readonly&#8217;と記述します。設定する場合は必ずこの記述です。また、このフォーム要素にはstyle classとして class=&#8221;readonly&#8221;が付加されます。例えばCSSで .readonly = { background-color:#ccc;} などとすれば、readonlyのフォーム要素の背景をグレーにできます</td>
</tr>
<tr>
<td nowrap>list</td>
<td nowrap>リスト表示指定</td>
<td>カラム一覧はhidden指定以外の項目を全て表示しますが、リスト表示に関してはその対象としたい項目について、この&#8217;list&#8217;=&gt;trueを指定しなければなりません</td>
</tr>
</table>
<blockquote><pre>public $item_styles = array(<br />
 'entry/title' =>     array('type'=>'text',   'label'=>'TITLE', 'list'=>true),<br />
 'entry/id' =>      array('type'=>'hidden'),<br />
 'entry/published' =>   array('type'=>'text',   'label'=>'DATE', 'list'=>true,<br />
                'readonly'=>'readonly'),<br />
 'entry/author/name' =>  array('type'=>'text',   'label'=>'NAME', 'list'=>true),<br />
 'entry/author/uri' =>  array('type'=>'text',   'label'=>'SITE'),<br />
 'entry/author/email' => array('type'=>'text',   'label'=>'E-MAIL'),<br />
 'entry/author/gender'  => array('type'=>'radio',  'label'=>'GENDER', 'list'=>true,<br />
                'options'=> array('1'=>'Male', '2'=>'Female', '3'=>'Other')),<br />
 'entry/author/age'  => array('type'=>'select',  'label'=>'AGE',<br />
                'options'=> array('0'=>'--', '10'=>'10&acute;s',<br />
                '20'=>'20&acute;s','30'=>'30&acute;s','40'=>'40&acute;s',<br />
                '50'=>'50&acute;s','60'=>'60&acute;s','70'=>'70&acute;s',<br />
                '80'=>'80&acute;s','90'=>'90&acute;s')),<br />
 'entry/author/pc'  => array('type'=>'checkbox',  'label'=>'PC', 'list'=>true,<br />
                'options'=> array('Win'=>'Windows', 'Mac'=>'Machintosh',<br />
                'Lnx'=>'Linux', 'Oth'=>'Others')),<br />
 'entry/content' =>   array('type'=>'textarea', 'label'=>'COMMENT')<br />
);</p></blockquote>
<h3 class="comments">CSS作成情報</h3>
<p>CSSに関しては、「拡張クラス」のファイル名と同じファイル名のCSSを設置すればそちらを優先します。例えば、「拡張クラス」bbs.phpを使う場合、bbs.cssというファイルを作って設置すれば、これを優先します。<br />
生成されるHTMLのスタイルclass名には一定の規則がありますので、それを元にCSSを作れば自由にレイアウトをカスタマイズできると思います。スタイルclass名の生成ルールを以下のようになります。 &gt; は 上下関係、| は並列設定です。<br />
カラム一覧： columns > column<br />
リスト表示： columns > table.list<br />
ボタン表示： actions > ul > li > a<br />
フォーム表示： input | text,radio,checkbox,select,textarea | [各アイテムタグ名]<br />
フォーム表示の時、各フォーム要素を囲む divの class名に要素に応じて text,radio,checkbox,select,textarea およびアイテムのタグ名そのものを付けています。CSSでタグ毎の設定することで細かな設定ができるのではないかと思います。</p>
<h3 class="comments">今後の予定</h3>
<p>XMLの構造や属性を「拡張クラス」としてではなく、DTDのようなもので記述できないかと最初模索していたのですが、DTDに関する勉強が追いつかず、後回しにすることにしました。どなたかが実現してくださるとよいのですが。<br />
次期バージョンの予定としては添付ファイルの機能のようなものを考えています。</p>
<h3 class="comments">ここからダウンロードできます</h3>
<h4><a href="https://github.com/eijin/xmlbulletin">&gt;&gt; github : eijin/xmlbulletin</a></h4>
<p><!--</p>
<div style="margin:5px; padding:5px;">
<a href="http://www.smallmake.com/download/xmlbulletin_1_0_x.zip"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/01/btn_download.gif" alt="ダウンロード" title="ダウンロード" width="134" height="43" class="alignnone size-full wp-image-354" border="0" valign="middle"  style="cursor:pointer;" /></a>&nbsp;&nbsp;<a href="http://www.smallmake.com/download/xmlbulletin_1_0_x.zip">：version 1.0.0</a>
</div>
<p>--></p>
<h3 class="comments">リリース履歴</h3>
<h4>version 1.0.0 / 2011.05.09</h4>
<p>最初のリリース</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.smallmake.com/wp/?feed=rss2&#038;p=691</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP: Jquery.uploadのシンプルな利用</title>
		<link>http://www.smallmake.com/wp/?p=671</link>
		<comments>http://www.smallmake.com/wp/?p=671#comments</comments>
		<pubDate>Sun, 10 Apr 2011 12:17:42 +0000</pubDate>
		<dc:creator>Eiji@smallmake</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.smallmake.com/wp/?p=671</guid>
		<description><![CDATA[CakePHPフレームワークを使っています。editビューの中で、ごく簡単にajaxでファイルアップロードしたかったので、シンプルで手軽な Jquery.upload.jsを使って組み込んでみました。コードの中に少しJa [...]]]></description>
			<content:encoded><![CDATA[<p>CakePHPフレームワークを使っています。editビューの中で、ごく簡単にajaxでファイルアップロードしたかったので、シンプルで手軽な <a href="http://lagoscript.org/jquery/upload?locale=ja">Jquery.upload.js</a>を使って組み込んでみました。コードの中に少しJavaScriptも書き足さなくてはいけないので、あまりかっこよくはないのですが、<a href="http://pixelcone.com/tutorial/ajax-file-upload-using-jquery-and-cakephp-media-plugin/">CakePHP Media Plugin</a>のように専用のテーブルを作るほどには大げさでなく、<a href="http://blog.syuhari.jp/archives/178">「CakePHP jQuery を使用した Ajax ファイルアップロード」</a>はsubmitしてしまって少し困るということで、書いたものです。参考になれば幸いです。<br />
<span id="more-671"></span><br />
１）フォーム部分（レコードのidを別途に渡したかったのでJquery.uploadの&lt;div&gt;でフィールドを囲うやり方を使っています）<br />
<blockquote>&lt;?php echo $this-&gt;Form-&gt;create(&#8216;Model&#8217;,array(&#8216;onsubmit&#8217;=&gt;&#8217;return false;&#8217;)); ?&gt;<br />
&nbsp;&nbsp;&lt;div id=&#8221;upfields&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php echo $this-&gt;Form-&gt;hidden(&#8216;upload_id&#8217;,array(&#8216;id&#8217;=&gt;&#8217;upload_id&#8217;, &#8216;value&#8217; =&gt; $this-&gt;data['Model']['id'])); ?&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php echo $this-&gt;Form-&gt;input(&#8216;upload_file&#8217;,array(&#8216;type&#8217;=&gt;&#8217;file&#8217;,'id&#8217;=&gt;&#8217;upload_file&#8217;)); ?&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php echo $this-&gt;Form-&gt;button(&#8216;アップロード&#8217;,array(&#8216;id&#8217;=&gt;&#8217;upload_button&#8217;)); ?&gt;<br />
&nbsp;&nbsp;&lt;/div&gt;<br />
&lt;?php echo $this-&gt;Form-&gt;end(); ?&gt;<br />
&lt;div id=&#8221;upload_msg&#8221;&gt;&lt;/div&gt;</p></blockquote>
<p>２）上記のフォームと同じビュー内に記述（僕の場合、上記のformの直前に書きました。&#8217;inline&#8217;=&gt;falseしているのでブラウザ上はヘッダに入ってくれます。）<br />
<blockquote>&lt;?php<br />
&nbsp;&nbsp;echo $this-&gt;Html-&gt;script(&#8216;jquery.upload&#8217;,array(&#8216;inline&#8217;=&gt;false));<br />
&nbsp;&nbsp;$action_url = $this-&gt;Html-&gt;url(&#8216;attach_upload&#8217;);<br />
&nbsp;&nbsp;$script =&lt;&lt;&lt; EOL<br />
&nbsp;&nbsp;&nbsp;&nbsp;$(function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(&#8216;#upload_button&#8217;).click(function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(&#8216;#upload_msg&#8217;).html(&#8216;処理中&#8230;&#8217;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(&#8216;#upfields&#8217;).upload(&#8216;{$action_url}&#8217;, function(res) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(&#8216;#upload_msg&#8217;).html(res);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, &#8216;html&#8217;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;});<br />
EOL;<br />
&nbsp;&nbsp;echo $this-&gt;Html-&gt;scriptBlock($script, array(&#8216;inline&#8217;=&gt;false, &#8216;safe&#8217;=&gt;true));<br />
?&gt;</p></blockquote>
<p>３）コントローラでのアクション<br />
<blockquote>function attach_upload() {<br />
&nbsp;&nbsp;if (!$this->data['Model']['upload_file']['name']) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$error = &#8216;アップロードするファイルを選択してください&#8217;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->set(&#8216;error&#8217;,$error);<br />
&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if($this->data['Model']['upload_file']['type'] == &#8216;application/pdf&#8217;) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$error = &#8216;アップロードできるのは PDF のみです&#8217;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->set(&#8216;error&#8217;,$error);<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;. $target_path は予めり、ここで $fname をつくる &#8230;..<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rename($this->data['Model']['upload_file']['tmp_name'], $target_path . DS . $filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->set(&#8216;filename&#8217;,$filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;$this->render(&#8216;attach_upload&#8217;,'ajax&#8217;);<br />
}</p></blockquote>
<p>４）ビューに追加するattach_upload.ctp (<a href="http://blog.syuhari.jp/archives/178">「CakePHP jQuery を使用した Ajax ファイルアップロード」サイト</a>のものを例としてそのまままねさせていただきました）<br />
<blockquote>&lt;?php if (!empty($error)): ?&gt;<br />
&lt;p&gt;&lt;?php echo $error;?&gt;&lt;/p&gt;<br />
&lt;?php else: ?&gt;<br />
&lt;p&gt;Upload successful&lt;/p&gt;<br />
&lt;?php //echo $html-&gt;image($filename); ?&gt;<br />
&lt;?php echo $filename; ?&gt;<br />
&lt;?php endif; ?&gt;</p></blockquote>
<p>返す値をjsonに変更するものわりと簡単でした。jsonにする場合は、コントローラ上のアクションで最後にjson文字列をecho すれば、ちゃんとfunction(res) のresに返ってきます。</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.smallmake.com/wp/?feed=rss2&#038;p=671</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle8i+Win2K 更新可能スナップショット設定</title>
		<link>http://www.smallmake.com/wp/?p=624</link>
		<comments>http://www.smallmake.com/wp/?p=624#comments</comments>
		<pubDate>Sun, 30 Jan 2011 11:55:16 +0000</pubDate>
		<dc:creator>Eiji@smallmake</dc:creator>
				<category><![CDATA[Database]]></category>

		<guid isPermaLink="false">http://www.smallmake.com/wp/?p=624</guid>
		<description><![CDATA[2011年となった今日、今さらOracle8i+Windows2000Serverという環境の構築をする方はほとんどいないと思いますが、僕はわけあってつい先日この作業をしました。その中で更新可能スナップショットの設定も行 [...]]]></description>
			<content:encoded><![CDATA[<p>2011年となった今日、今さらOracle8i+Windows2000Serverという環境の構築をする方はほとんどいないと思いますが、僕はわけあってつい先日この作業をしました。その中で更新可能スナップショットの設定も行いました。この設定が自分としては複雑で困難を感じただけでなく、Windows2000との組合せ独自の問題にも悩まされました。しかし、何とか完了することができたので、ここにその全容をまとめておこうと思います。Oracle8i のサンプル ORCL.WORLD を例に以下にまとめます。何かの参考になれば幸いです。<br />
<span id="more-624"></span></p>
<h4>■構成</h4>
<p>サーバは2台とします。データベース作成時は2台それぞれに同じグローバル名ORCL.WORLDですが、これを alter database rename global_name to でそれぞれORCL1.WORLDとORCL2.WORLDに変更ています（手順は後述）。<br />
<div id="attachment_625" class="wp-caption centert" style="width: 370px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2011/01/fig01.gif" rel="lightbox[624]" title="図.01"><img src="http://www.smallmake.com/wp/wp-content/uploads/2011/01/fig01.gif" alt="レプリケーション構成図" title="図.01" width="360" height="270" class="size-full wp-image-625" /></a><p class="wp-caption-text">図１: レプリケーションの構成</p></div></p>
<p>　</p>
<h4>■Windows2000Serverにおける問題</h4>
<p>更新可能スナップショット設定手順の説明に入る前に、Windows2000Serverにおける問題と対処を列記しておきます。</p>
<p>１）ターミナル・サービス経由ではDatabase Configuration Assistantは使えない<br />
　サーバにはモニタを付けずにリモートからいろいろやりたいものですが、そのためのターミナル・サービス経由ではDatabase Configuration Assistantは使えません。Oracle8iの標準インストーラでインストールする時の最後のプロセスでサンプルORCLを生成する場合も同様で、ターミナル・サービス経由だとフリーズしてしまいます。僕の知る限り対処方法はありません。あきらめてサーバのところでモニタを付けて作業するか、もしくは何かほかのVNCを導入するしかありません。</p>
<p>２）システム起動時にOracleServiceORCLを自動起動できない<br />
　Windows2000独自の問題のようです。対処方法はオラクル・サポート知識ベース「<a href="http://support.oracle.co.jp/krown_external/oisc_showDoc.do?id=17714">文書番号：17714</a>」に記載があります。この文書に書かれている orastart.bat に関しては、僕は環境変数の設定を追加しました（下記参照）。またグループ・ポリシーではなく単純にコントロールパネルの「タスク」で「システム起動時」にこのバッチが走るようにしました。（僕の場合、データベースを複数起動したかったので、このバッチを各データベース毎に作り、それぞれ「タスク」スケジュールに追加）<br />
orastart.bat</p>
<blockquote><p>@Echo off<br />
net start OracleServiceORCL<br />
set oracle_sid=ORCL<br />
svrmgrl @f:\startup.sql<br />
exit</p></blockquote>
<p>　</p>
<h4>■実際の設定で引っかかったこと</h4>
<p>もう一点、更新可能スナップショット設定手順の説明に入る前に、この設定でぶつかった問題を先に以下に列挙しておこうと思います。</p>
<p>１）スナップショット・グループへのオブジェクトの追加がうまく行かない<br />
手順の中でスナップショット側でスナップショット・グループへのオブジェクトの追加するところがある。これはあるドキュメントでは、ユーザー snapadmin で行うかのように記述していた。しかし、僕の場合うまく行かなかった。それで、scottでおこなった。なぜなら、オブジェクト追加ではなく、単純にCREATE SNAPSHOT を実行した場合、scottではエラーにならないがsnapadminだとFOR UPDATE AS を指定した時点でエラーになってしうからだ。  最終的にはscottでオブジェクト追加してレプリケーションは正常に動いている。なお、scottにデータベース・リンクも追加している。詳細は下記手順に。</p>
<p>２）LONG型はスナップショットでは使うことができない<br />
LONG型はスナップショットでは使うことができない。代わりにオラクルではLOB型というものが用意されている。オラクルはLONG型の使用は推奨していないとのこと。しかし、oo4oがLOB型に対応していない。以下の説明で使うOracle8iのサンプルORCL.WORLDにはLONG型はないので問題はないが、僕が今回設定をしなければならなかった実際のシステムではこの矛盾にぶつかってしまった。</p>
<p>　</p>
<h4>■更新可能スナップショット設定手順</h4>
<p>まず、まだグローバル名は同じですが、TNS名はそれぞれORCL1.WORLD, ORCL2.WORLDとして tnsnames.ora に記述します。サービス名は変わらないので、これで接続できます。<br />
 tnsnames.ora </p>
<blockquote><p>ORCL1.WORLD =<br />
&nbsp;&nbsp;(DESCRIPTION =<br />
&nbsp;&nbsp;&nbsp;&nbsp;(ADDRESS_LIST =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ADDRESS = (PROTOCOL = TCP)(HOST = Server1)(PORT = 1521))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;(CONNECT_DATA = (SERVICE_NAME = ORCL.WORLD)<br />
&nbsp;&nbsp;)<br />
ORCL2.WORLD =<br />
&nbsp;&nbsp;(DESCRIPTION =<br />
&nbsp;&nbsp;&nbsp;&nbsp;(ADDRESS_LIST =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ADDRESS = (PROTOCOL = TCP)(HOST = Server2)(PORT = 1521))<br />
&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;(CONNECT_DATA =(SERVICE_NAME = ORCL.WORLD))<br />
&nbsp;&nbsp;)</p></blockquote>
<p>以下、各サーバへのコネクションで区切って説明します。</p>
<hr size=1>
connect system/manager@ORCL1.WORLD<br />
select * from global_name;<br />
にて ORCL.WORL を確認。以下で変更、<br />
ALTER DATABASE RENAME GLOBAL_NAME TO ORCL1.WORLD;</p>
<hr size=1>
connect system/manager@ORCL2.WORLD<br />
select * from global_name;<br />
にて ORCL.WORL を確認。以下で変更、<br />
ALTER DATABASE RENAME GLOBAL_NAME TO ORCL2.WORLD;</p>
<hr size=1>
connect system/manager@ORCL1.WORLD<br />
■レプリケーション管理者の作成と権限の付与<br />
CREATE USER repadmin IDENTIFIED BY repadmin;<br />
execute DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (-<br />
USERNAME => &#8216;repadmin&#8217;);<br />
grant comment any table to repadmin;<br />
grant lock any table to repadmin;<br />
grant execute any procedure to repadmin;<br />
■レプリケーション管理者をプロパゲータ、受信者に登録<br />
execute DBMS_DEFER_SYS.REGISTER_PROPAGATOR (-<br />
USERNAME => &#8216;repadmin&#8217;);<br />
execute DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (-<br />
USERNAME => &#8216;repadmin&#8217;,-<br />
PRIVILEGE_TYPE => &#8216;receiver&#8217;,-<br />
LIST_OF_GNAMES => NULL);</p>
<hr size=1>
connect repadmin/repadmin@ORCL1.WORLD<br />
■パージをスケジュール：1時間に1回のパージ<br />
execute DBMS_DEFER_SYS.SCHEDULE_PURGE (-<br />
NEXT_DATE => SYSDATE,-<br />
INTERVAL => &#8216;SYSDATE + 1/24&#8242;,-<br />
DELAY_SECONDS => 0,-<br />
ROLLBACK_SEGMENT => &#8221;);</p>
<hr size=1>
connect system/manager@ORCL1.WORLD<br />
■プロキシ・スナップショット管理者作成と権限付与<br />
CREATE USER proxy_snapadmin IDENTIFIED BY proxy_snapadmin;<br />
execute DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (-<br />
USERNAME => &#8216;proxy_snapadmin&#8217;,-<br />
PRIVILEGE_TYPE => &#8216;proxy_snapadmin&#8217;,-<br />
LIST_OF_GNAMES => NULL);<br />
ロールを追加<br />
GRANT SELECT_CATALOG_ROLE TO proxy_snapadmin;<br />
■プロキシ・リフレッシャの作成と権限の付与<br />
CREATE USER proxy_refresher IDENTIFIED BY proxy_refresher;<br />
GRANT CREATE SESSION TO proxy_refresher;<br />
GRANT SELECT ANY TABLE TO proxy_refresher;</p>
<hr size=1>
connect repadmin/repadmin@ORCL1.WORLD<br />
■同期をスケジュール：10分に1回<br />
execute DBMS_DEFER_SYS.SCHEDULE_PUSH (-<br />
DESTINATION => &#8216;ORCL2.WORLD&#8217;, -<br />
INTERVAL => &#8216;SYSDATE + 10 / (24 * 60)&#8217;,-<br />
NEXT_DATE => SYSDATE);</p>
<hr size=1>
connect system/manager@ORCL2.WORLD<br />
■スナップショット管理者の作成と権限の付与<br />
CREATE USER snapadmin IDENTIFIED BY snapadmin;<br />
execute DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (-<br />
USERNAME => &#8216;snapadmin&#8217;);<br />
■プロパゲータの作成と登録<br />
CREATE USER propagator IDENTIFIED BY propagator;<br />
execute DBMS_DEFER_SYS.REGISTER_PROPAGATOR (-<br />
USERNAME => &#8216;propagator&#8217;);<br />
■リフレッシャの作成と権限の付与<br />
CREATE USER refresher IDENTIFIED BY refresher;<br />
GRANT CREATE SESSION TO refresher;<br />
GRANT ALTER ANY SNAPSHOT TO refresher;<br />
パブリックデータベースリンクの作成（リンク名もORCL1.WORLDとする）<br />
CREATE PUBLIC DATABASE LINK ORCL1.WORLD USING &#8216;ORCL1.WORLD&#8217;;</p>
<hr size=1>
connect snapadmin/snapadmin@ORCL2.WORLD<br />
■データベースリンクの作成<br />
CREATE DATABASE LINK ORCL1.WORLD CONNECT TO proxy_snapadmin IDENTIFIED BY proxy_snapadmin;<br />
■パージをスケジュール：1時間に1回のパージ<br />
execute DBMS_DEFER_SYS.SCHEDULE_PURGE (-<br />
NEXT_DATE => SYSDATE,-<br />
INTERVAL => &#8216;SYSDATE + 1/24&#8242;,-<br />
DELAY_SECONDS => 0,-<br />
ROLLBACK_SEGMENT => &#8221;);<br />
■プッシュをスケジュール：10分に1回<br />
execute DBMS_DEFER_SYS.SCHEDULE_PUSH (-<br />
DESTINATION => &#8216;ORCL1.WORLD&#8217;,-<br />
INTERVAL => &#8216;SYSDATE + 10/(24 * 60)&#8217;,-<br />
NEXT_DATE => SYSDATE,-<br />
STOP_ON_ERROR => FALSE,-<br />
DELAY_SECONDS => 0,-<br />
PARALLELISM => 0);</p>
<hr size=1>
connect propagator/propagator@ORCL2.WORLD<br />
■データベースリンクの作成<br />
CREATE DATABASE LINK ORCL1.WORLD CONNECT TO repadmin IDENTIFIED BY repadmin;</p>
<hr size=1>
connect repadmin/repadmin@ORCL1.WORLD<br />
■マスターグループの作成<br />
execute DBMS_REPCAT.CREATE_MASTER_REPGROUP (GNAME => &#8216;scott_mg&#8217;);<br />
■リフレッシュ可能なスナップショットには主キーが必要なので、ないものは作成<br />
ALTER TABLE scott.bonus ADD (CONSTRAINT bonus_pk PRIMARY KEY(ename));<br />
ALTER TABLE scott.salgrade ADD (CONSTRAINT salgrade_pk PRIMARY KEY(grade));<br />
■マスター・グループにオブジェクトの追加<br />
BEGIN<br />
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (<br />
GNAME => &#8216;scott_mg&#8217;,<br />
TYPE => &#8216;table&#8217;,<br />
ONAME => &#8216;emp&#8217;,<br />
SNAME => &#8216;scott&#8217;,<br />
USE_EXISTING_OBJECT => TRUE,<br />
COPY_ROWS => TRUE);<br />
END;<br />
/<br />
BEGIN<br />
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (<br />
GNAME => &#8216;scott_mg&#8217;,<br />
TYPE => &#8216;table&#8217;,<br />
ONAME => &#8216;dept&#8217;,<br />
SNAME => &#8216;scott&#8217;,<br />
USE_EXISTING_OBJECT => TRUE,<br />
COPY_ROWS => TRUE);<br />
END;<br />
/<br />
BEGIN<br />
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (<br />
GNAME => &#8216;scott_mg&#8217;,<br />
TYPE => &#8216;table&#8217;,<br />
ONAME => &#8216;bonus&#8217;,<br />
SNAME => &#8216;scott&#8217;,<br />
USE_EXISTING_OBJECT => TRUE,<br />
COPY_ROWS => TRUE);<br />
END;<br />
/<br />
BEGIN<br />
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (<br />
GNAME => &#8216;scott_mg&#8217;,<br />
TYPE => &#8216;table&#8217;,<br />
ONAME => &#8216;salgrade&#8217;,<br />
SNAME => &#8216;scott&#8217;,<br />
USE_EXISTING_OBJECT => TRUE,<br />
COPY_ROWS => TRUE);<br />
END;<br />
/<br />
【補足】削除方法<br />
BEGIN<br />
DBMS_REPCAT.DROP_MASTER_REPOBJECT (<br />
SNAME => &#8216;scott&#8217;,<br />
ONAME => &#8216;salgrade&#8217;,<br />
TYPE => &#8216;table&#8217;);<br />
END;<br />
/<br />
■レプリケーション・サポートを生成<br />
BEGIN<br />
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (<br />
SNAME => &#8216;scott&#8217;,<br />
ONAME => &#8216;emp&#8217;,<br />
TYPE => &#8216;TABLE&#8217;,<br />
MIN_COMMUNICATION => TRUE);<br />
END;<br />
/<br />
BEGIN<br />
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (<br />
SNAME => &#8216;scott&#8217;,<br />
ONAME => &#8216;dept&#8217;,<br />
TYPE => &#8216;TABLE&#8217;,<br />
MIN_COMMUNICATION => TRUE);<br />
END;<br />
/<br />
BEGIN<br />
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (<br />
SNAME => &#8216;scott&#8217;,<br />
ONAME => &#8216;bonus&#8217;,<br />
TYPE => &#8216;TABLE&#8217;,<br />
MIN_COMMUNICATION => TRUE);<br />
END;<br />
/<br />
BEGIN<br />
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (<br />
SNAME => &#8216;scott&#8217;,<br />
ONAME => &#8216;salgrade&#8217;,<br />
TYPE => &#8216;TABLE&#8217;,<br />
MIN_COMMUNICATION => TRUE);<br />
END;<br />
/<br />
■アクティブにする。<br />
BEGIN<br />
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (<br />
GNAME => &#8216;scott_mg&#8217;);<br />
END;<br />
/<br />
【補足】停止方法<br />
BEGIN<br />
DBMS_REPCAT.SUSPEND_MASTER_ACTIVITY(<br />
GNAME => &#8216;scott_mg&#8217;);<br />
END;<br />
/<br />
【補足】アクティブにならない場合<br />
以下のエラーが出た場合は、下記対処をする。<br />
エラー：「ORA-23419: レプリケーション・サポート再生成後にマスター・アクティビティを再開してください。」<br />
対処： select * from dba_repobject; を表示する。そして、「NEEDSGEN」と表示されるオブジェクトを再作成してみる。</p>
<hr size=1>
connect scott/tiger@ORCL1.WORLD<br />
■スナップショット・ログ作成<br />
CREATE SNAPSHOT LOG ON scott.emp;<br />
CREATE SNAPSHOT LOG ON scott.dept;<br />
CREATE SNAPSHOT LOG ON scott.bonus;<br />
CREATE SNAPSHOT LOG ON scott.salgrade;</p>
<hr size=1>
connect system/manager@ORCL2.WORLD<br />
■データベースリンクの作成<br />
CREATE DATABASE LINK ORCL1.WORLD CONNECT TO proxy_refresher IDENTIFIED BY proxy_refresher;</p>
<p>【補足】テーブルの削除<br />
ORCL2.WORLD のテーブルは一旦全部削除する。<br />
実は、これはやるべきかどうか曖昧なままである。やらなくてもいいのかも知れないが、僕はdrop tableで全て削除した。例え削除したとしても、最後まで設定を終えると結果的には自動的に生成されているので削除してよいのだと思っている。</p>
<p>【補足】上記テーブル削除の前に主キーを作っておく？<br />
削除するのだから必要なさそうなものだが、それでも僕は上記の削除前にORCL1.WORLDでやったのと同様に、ORCL2.WORLDでも主キーがないものに主キーの追加を行った。<br />
ALTER TABLE scott.bonus ADD (CONSTRAINT bonus_pk PRIMARY KEY(ename));<br />
ALTER TABLE scott.salgrade ADD (CONSTRAINT salgrade_pk PRIMARY KEY(grade));<br />
ヘンだが、一応書いておく。</p>
<p>【補足】もしテーブル削除した場合はインデックスの再作成も注意<br />
drop table ****** CASCADE CONSTRAINTS; で削除した場合、インテックス（索引）も削除されているので、これらを改めて再作成することも忘れてはならない。<br />
create index インデックス名 on テーブル名(カラム名) tablespace テーブルスペース名;</p>
<hr size=1>
connect snapadmin/snapadmin@ORCL2.WORLD<br />
■スナップショット・グループの作成<br />
BEGIN<br />
DBMS_REPCAT.CREATE_SNAPSHOT_REPGROUP (<br />
GNAME => &#8216;scott_mg&#8217;,<br />
MASTER => &#8216;ORCL1.WORLD&#8217;,<br />
PROPAGATION_MODE => &#8216;ASYNCHRONOUS&#8217;);<br />
END;<br />
/</p>
<hr size=1>
connect scott/tiger@ORCL2.WORLD<br />
■スナップショット・グループにオブジェクトの追加<br />
※これをsnapadmin で行うかのように記述したドキュメントがあるが、僕の場合はそれではうまく行かなかった。それで、scottでおこなった。<br />
まず、データベース・リンクをつくる。<br />
create database link ORCL1.WORLD connect to repadmin identified by repadmin;<br />
それからオブジェクト追加。<br />
BEGIN<br />
DBMS_REPCAT.CREATE_SNAPSHOT_REPOBJECT (<br />
GNAME => &#8216;scott_mg&#8217;,<br />
SNAME => &#8216;scott&#8217;,<br />
ONAME => &#8216;bonus&#8217;,<br />
TYPE => &#8216;SNAPSHOT&#8217;,<br />
DDL_TEXT => &#8216;CREATE SNAPSHOT scott.bonus REFRESH FAST WITH<br />
PRIMARY KEY FOR UPDATE AS SELECT * FROM<br />
scott.bonus@orc1.world&#8217;,<br />
MIN_COMMUNICATION => TRUE);<br />
END;<br />
/<br />
BEGIN<br />
DBMS_REPCAT.CREATE_SNAPSHOT_REPOBJECT (<br />
GNAME => &#8216;scott_mg&#8217;,<br />
SNAME => &#8216;scott&#8217;,<br />
ONAME => &#8216;dept&#8217;,<br />
TYPE => &#8216;SNAPSHOT&#8217;,<br />
ddl_text => &#8216;CREATE SNAPSHOT scott.dept REFRESH FAST WITH<br />
primary key for update as select * from<br />
scott.dept@orc1.world&#8217;,<br />
MIN_COMMUNICATION => TRUE);<br />
END;<br />
/<br />
BEGIN<br />
DBMS_REPCAT.CREATE_SNAPSHOT_REPOBJECT (<br />
GNAME => &#8216;scott_mg&#8217;,<br />
SNAME => &#8216;scott&#8217;,<br />
ONAME => &#8216;emp&#8217;,<br />
TYPE => &#8216;SNAPSHOT&#8217;,<br />
DDL_TEXT => &#8216;CREATE SNAPSHOT scott.salgrade REFRESH FAST WITH<br />
primary key for update as select * from<br />
scott.salgrade@orc1.world&#8217;,<br />
MIN_COMMUNICATION => TRUE);<br />
END;<br />
/</p>
<hr size=1>
CONNECT snapadmin/snapadmin@ORCL2.WORLD<br />
■リフレッシュ・グループの作成：10分に1回リフレッシュ<br />
BEGIN<br />
DBMS_REFRESH.MAKE (<br />
NAME => &#8216;snapadmin.scott_mg&#8217;,<br />
LIST => &#8221;,<br />
NEXT_DATE => SYSDATE,<br />
INTERVAL => &#8216;SYSDATE + 10/(24*60)&#8217;,<br />
IMPLICIT_DESTROY => FALSE,<br />
ROLLBACK_SEG => &#8221;,<br />
PUSH_DEFERRED_RPC => TRUE,<br />
REFRESH_AFTER_ERRORS => FALSE);<br />
END;<br />
/<br />
【補足】リフレッシュ設定し直すために削除したい場合<br />
execute dbms_refresh.destroy(&#8216;snapadmin.scott_mg&#8217;);</p>
<p>■リフレッシュ・グループにオブジェクト追加<br />
BEGIN<br />
DBMS_REFRESH.ADD (<br />
NAME => &#8216;snapadmin.scott_mg&#8217;,<br />
LIST => &#8216;scott.bonus&#8217;,<br />
LAX => TRUE);<br />
END;<br />
/<br />
BEGIN<br />
DBMS_REFRESH.ADD (<br />
NAME => &#8216;snapadmin.scott_mg&#8217;,<br />
LIST => &#8216;scott.dept&#8217;,<br />
LAX => TRUE);<br />
END;<br />
/<br />
BEGIN<br />
DBMS_REFRESH.ADD (<br />
NAME => &#8216;snapadmin.scott_mg&#8217;,<br />
LIST => &#8216;scott.emp&#8217;,<br />
LAX => TRUE);<br />
END;<br />
/<br />
BEGIN<br />
DBMS_REFRESH.ADD (<br />
NAME => &#8216;snapadmin.scott_mg&#8217;,<br />
LIST => &#8216;scott.salgrade&#8217;,<br />
LAX => TRUE);<br />
END;<br />
/</p>
<p>【補足】作成ジョブを確認したい場合<br />
 select job,last_date,last_sec,next_date,next_sec,total_time,broken,what from dba_jobs;<br />
※NEXT時刻が時間が経っても更新されない場合は要注意。設定がうまく行っていない可能性がある。</p>
<p>【補足】設定後リフレッシュがうまく行っていない場合<br />
一旦、scott/tiger で<br />
execute dbms_refresh.destroy(&#8216;snapadmin.scott_mg&#8217;);<br />
してから、上記リフレッシュ・グループを再作成するとうまく行くことがあった。</p>
<hr size=1>
connect sys/change_on_install@ORCL2.WORLD as sysdba<br />
■エンキュー失敗対策<br />
僕の場合、スナップショット側でSQLのUPDATEを行うと例外なく以下のエラーがでた。<br />
エラー：「ORA-25207: エンキューに失敗しました。キューSYSTEM.DEF$_AQCALLにエンキューできません。」<br />
対処：以下を実行。<br />
EXEC DBMS_AQADM.START_QUEUE(&#8216;SYSTEM.DEF$_AQERROR&#8217;, TRUE, TRUE);<br />
EXEC DBMS_AQADM.START_QUEUE(&#8216;SYSTEM.DEF$_AQCALL&#8217;, TRUE, TRUE);<br />
参考： <a href="http://www.orafaq.com/wiki/Advanced_Replication_FAQ#How_does_one_fix_ORA-25207_errors.3F">http://www.orafaq.com/wiki/Advanced_Replication_FAQ#How_does_one_fix_ORA-25207_errors.3F</a></p>
<p>　</p>
<p>以上で設定完了。</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.smallmake.com/wp/?feed=rss2&#038;p=624</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>日本画風グリーティングカード案2010</title>
		<link>http://www.smallmake.com/wp/?p=589</link>
		<comments>http://www.smallmake.com/wp/?p=589#comments</comments>
		<pubDate>Fri, 31 Dec 2010 08:18:50 +0000</pubDate>
		<dc:creator>Eiji@smallmake</dc:creator>
				<category><![CDATA[Labo]]></category>

		<guid isPermaLink="false">http://www.smallmake.com/wp/?p=589</guid>
		<description><![CDATA[昨年から日本画風の要素を組み入れてたWeb用年始グリーティングカードの作成を試みている。実際にはあるクライアントのために作成したもので、最終的にFlashアニメーションにしている。花や木の要素はロイヤリティフリーの素材集 [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_591" class="wp-caption alignright" style="width: 160px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2009b.jpg" rel="lightbox[589]" title="日本画風"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2009b.jpg" alt="日本画風" title="日本画風" width="150" height="112" class="size-full wp-image-591" /></a><p class="wp-caption-text">日本画風</p></div>昨年から日本画風の要素を組み入れてたWeb用年始グリーティングカードの作成を試みている。実際にはあるクライアントのために作成したもので、最終的にFlashアニメーションにしている。花や木の要素はロイヤリティフリーの素材集から。<br />
<span id="more-589"></span><br />
ここに上げるのは、その検討用に使ったラフ案画像である。自分で過去にどんなものを作ったかわかるように資料として、ここに表示しておく。<br />
（最後のものはアニメーションで横スクロールさせながら表示するため横長になっている）</p>
<p>主な使用素材集：<br />
『<a href="http://www.amazon.co.jp/gp/product/4774135232?ie=UTF8&#038;tag=smallmakecom-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=4774135232">和 japanese style (design parts collection)</a><img src="http://www.assoc-amazon.jp/e/ir?t=smallmakecom-22&#038;l=as2&#038;o=9&#038;a=4774135232" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />』  田村 嘉章 (著)  技術評論社<br />
『<a href="http://www.amazon.co.jp/gp/product/4837307590?ie=UTF8&#038;tag=smallmakecom-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=4837307590">四季の和風素材CD‐ROM</a><img src="http://www.assoc-amazon.jp/e/ir?t=smallmakecom-22&#038;l=as2&#038;o=9&#038;a=4837307590" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />』　夏木 一美 (著)　マール社<br />
『<a href="http://www.amazon.co.jp/gp/product/4837301657?ie=UTF8&#038;tag=smallmakecom-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=4837301657">名画クラシック素材―花鳥風月</a><img src="http://www.assoc-amazon.jp/e/ir?t=smallmakecom-22&#038;l=as2&#038;o=9&#038;a=4837301657" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> 』マール社編集部 (編集)　マール社</p>
<p>※以下いずれもクリックで実寸に拡大</p>
<p><div id="attachment_590" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2009a.jpg" rel="lightbox[589]" title="金屏風"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2009a.jpg" alt="金屏風" title="金屏風" width="300" height="225" class="size-full wp-image-590" /></a><p class="wp-caption-text">金屏風</p></div><br />
<div id="attachment_591" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2009b.jpg" rel="lightbox[589]" title="日本画風"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2009b.jpg" alt="日本画風" title="日本画風" width="300" height="225" class="size-full wp-image-591" /></a><p class="wp-caption-text">日本画風</p></div><br />
<div id="attachment_595" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2009d.jpg" rel="lightbox[589]" title="浮世絵風"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2009d-300x225.jpg" alt="浮世絵風" title="浮世絵風" width="300" height="225" class="size-medium wp-image-595" /></a><p class="wp-caption-text">浮世絵風</p></div><br />
<div id="attachment_596" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2010a.jpg" rel="lightbox[589]" title="桂離宮風"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2010a-300x225.jpg" alt="桂離宮風" title="桂離宮風" width="300" height="225" class="size-medium wp-image-596" /></a><p class="wp-caption-text">桂離宮風</p></div><br />
<div id="attachment_597" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2009c.jpg" rel="lightbox[589]" title="偽宗達風"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2009c-300x225.jpg" alt="偽宗達風" title="偽宗達風" width="300" height="225" class="size-medium wp-image-597" /></a><p class="wp-caption-text">偽宗達風</p></div><br />
<div id="attachment_600" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2010b.jpg" rel="lightbox[589]" title="日本画風"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2010b-300x225.jpg" alt="日本画風" title="日本画風" width="300" height="225" class="size-medium wp-image-600" /></a><p class="wp-caption-text">日本画風</p></div><br />
<div id="attachment_601" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2010c.jpg" rel="lightbox[589]" title="偽光琳風"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/12/rough2010c-300x71.jpg" alt="偽光琳風" title="偽光琳風" width="300" height="71" class="size-medium wp-image-601" /></a><p class="wp-caption-text">偽光琳風</p></div></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.smallmake.com/wp/?feed=rss2&#038;p=589</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xcode SCM スタンドアロン使い方まとめ</title>
		<link>http://www.smallmake.com/wp/?p=404</link>
		<comments>http://www.smallmake.com/wp/?p=404#comments</comments>
		<pubDate>Wed, 28 Apr 2010 02:10:37 +0000</pubDate>
		<dc:creator>Eiji@smallmake</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.smallmake.com/?p=404</guid>
		<description><![CDATA[XcodeのSCM Subversionのセットアップ方法などについてまとめる。ひとりで開発しているのでSCMは必要ないと思っていたが、今回、あるプロジェクトのコードを試みに大きく変更しようと思い立ち、簡単に元に戻れるよ [...]]]></description>
			<content:encoded><![CDATA[<p>XcodeのSCM Subversionのセットアップ方法などについてまとめる。ひとりで開発しているのでSCMは必要ないと思っていたが、今回、あるプロジェクトのコードを試みに大きく変更しようと思い立ち、簡単に元に戻れるようにするために導入することした（「スナップショット」の方が手軽という話しもあるが）。やり方はいろんなサイトで紹介されており、実際、参考にさせていただいた。一応、僕なりにまとめておく。</p>
<p><span id="more-404"></span><br />
</p>
<h3>概観：スタンドアロンで使用するということは&#8230;</h3>
<p><div id="attachment_456" class="wp-caption aligncenter" style="width: 489px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig111.gif" rel="lightbox[404]" title="図１"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig111.gif" alt="クライアント・サーバでのSubversion利用模式図" title="図１" width="479" height="215" class="size-full wp-image-456" /></a><p class="wp-caption-text">図１</p></div><br />
<div id="attachment_458" class="wp-caption alignright" style="width: 273px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig121.gif" rel="lightbox[404]" title="図２"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig121.gif" alt="スタンドアロンで使う場合の模式図" title="図２" width="263" height="266" class="size-full wp-image-458" /></a><p class="wp-caption-text">図２</p></div>通常は図１のようにサーバにリポジトリ（倉庫）を置いて使う。<br />
これをスタンドアロンで使うということは、図2のようにリポジトリとなるフォルダを開発用とは別にローカルに作るということだ。<br />
　<br />
そして、リポジトリに保管したプロジェクトは「チェックアウト」で最初に1度だけ開発作業用フォルダに書き出す。<br />
その後はこれをXcodeでファイル更新していって、適宜、状態保存したい時点で「コミット」を繰り返していくだけ。<br />
コミットすると履歴に残り、いつでもその時点に戻ることができるわけだ。
<div style="clear:both"></div>
<p>　</p>
<h3>セットアップ手順</h3>
<h4>1. リポジトリ用フォルダを作る</h4>
<p><div id="attachment_462" class="wp-caption alignright" style="width: 170px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig14.gif" rel="lightbox[404]" title="図３"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig14.gif" alt="リポジトリとなるフォルダを作るの図" title="図３" width="160" height="170" class="size-full wp-image-462" /></a><p class="wp-caption-text">図３</p></div>リポジトリとなるフォルダを適当な場所に作る。<br />
例えば、僕の場合は下記を作成。<br />
/Users/eiji/projects/_EijiSubversionRepository<br />
　<br />
　<br />
次に、ターミナル.appを起動して、svnadmin コマンドを下記のように実行。<br />
&#8220;svnadmin create&#8221;の後に、作成したフォルダを指定するのである。
<div style="clear:both"></div>
<blockquote><p>svnadmin create /Users/eiji/projects/_EijiSubversionRepository</p></blockquote>
<p>このフォルダ内にデータベースファイルなどを生成するためのコマンドのようだ。</p>
<h4>2. リポジトリのフォルダをXcodeのSCMに登録</h4>
<p><div id="attachment_474" class="wp-caption alignright" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig013.gif" rel="lightbox[404]" title="画面１"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig013-300x267.gif" alt="Subversion設定の画面" title="画面１" width="300" height="267" class="size-medium wp-image-474" /></a><p class="wp-caption-text">画面１（※クリックで拡大）</p></div>Xcocde起動して、メニュー「SCM」 >「 SCMリポジトリを構成…」を選択。<br />
　<br />
左下の[+]ボタンをクリックして追加。名前を入力し、Subversionを選択。<br />
右の名前、URL、スキームなどを入力。「適用」ボタンをクリックして「認証されました」の表示が出ればOK。
<div style="clear:both"></div>
<h4>3. プロジェクトのフォルダ構成をSCM用に変更</h4>
<p>ひとつのプロジェクトのフォルダ直下にbranches, tags, trunkの3つのフォルダを作る。これはSubversionのお約束のようなもの。<br />
Xcodeで新規にプロジェクトを作るとフォルダ直下にできるファイルやフォルダをtrunkに入れる。<br />
<div id="attachment_470" class="wp-caption aligncenter" style="width: 453px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig131.gif" rel="lightbox[404]" title="図４"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig131.gif" alt="branches, tags, trunk の3つのフォルダ" title="図４" width="443" height="265" class="size-full wp-image-470" /></a><p class="wp-caption-text">図４</p></div></p>
<h4>4. リポジトリに読み込む</h4>
<p><div id="attachment_481" class="wp-caption alignright" style="width: 170px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig151.gif" rel="lightbox[404]" title="図５"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig151.gif" alt="リポジトリへの読み込み模式図" title="図５" width="160" height="170" class="size-full wp-image-481" /></a><p class="wp-caption-text">図５</p></div>上記で作ったプロジェクトのフォルダをリポジトリに読み込む。<br />
Xcodeでメニュー「SCM」 >「リポジトリ」選択。<br />
　<br />
左のカラムからEijiSubversionRepository選択し、左上の「読み込む」ボタンをクリック。上で作ったプロジェクトのフォルダを選択して読み込むと、右のカラムにプロジェクトが追加される。<br />
ここで、このフォルダの中の例えば buildフォルダなど管理が必要ないものは削除してしまう。
<div style="clear:both"></div>
<p><div id="attachment_478" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig03.gif" rel="lightbox[404]" title="画面２"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig03-300x251.gif" alt="リポジトリ 読み込み後の画面" title="画面２" width="300" height="251" class="size-medium wp-image-478" /></a><p class="wp-caption-text">画面２（※クリックで拡大）</p></div><br />
<div id="attachment_488" class="wp-caption alignleft" style="width: 170px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig16.gif" rel="lightbox[404]" title="図６"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig16.gif" alt="読み込み後はプロジェクトフォルダを削除の図" title="図６" width="160" height="170" class="size-full wp-image-488" /></a><p class="wp-caption-text">図６</p></div>読み込み済みの元のプロジェクトのフォルダは、もう不要なので削除してしまってよい。
<div style="clear:both"></div>
<h4>5. 開発作業用フォルダとチェックアウト</h4>
<p><div id="attachment_492" class="wp-caption alignright" style="width: 170px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig18.gif" rel="lightbox[404]" title="図５"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig18.gif" alt="リポジトリからのチェックアウト模式図" title="図５" width="160" height="170" class="size-full wp-image-492" /></a><p class="wp-caption-text">図５</p></div>リポジトリに格納したプロジェクトからフォルダを「チェックアウト」する。以後、これを使ってXcodeで更新して開発を進めるわけだ。<br />
　<br />
例えば画面２で、iPhoneCoredataRecipes を選択し「チェックアウト」ボタンをクリックする。チェックアウト先のフォルダに開発作業用のフォルダを指定して「チェックアウト」。<br />
　<br />
例えば僕の場合、EijiSubversionRepositoryリポジトリの中の、iPhoneCoreDataRecipesを選択して「チェックアウト」ボタンをクリック。<br />
/Users/eiji/projects/iPhone/<br />
をiPhoneアプリの開発作業用フォルダにしているので、ここをチェックアウト先に指定。<br />
チェックアウトすると<br />
/Users/eiji/projects/iPhone/iPhoneCoreDataRecipes<br />
のフォルダができる。これを開発に使う。
<div style="clear:both"></div>
<h4>6. プロジェクトのリポジトリを構成をする</h4>
<p>チェックアウトしたファイルをXcodeで最初に開いたときに、「プロジェクトのリポジトリを構成」の設定を必ず行う。<br />
　<br />
Xcodeでチェックアウトしたプロジェクトのファイルを開く。<br />
Xcodeのメニュー「SCM」 >「 このプロジェクトのリポジトリを構成…」を選択。<br />
開いたプロジェクト設定ウィンドウで、右上の「ルートとSCMを構成」ボタンをクリック。<br />
　<br />
<div id="attachment_494" class="wp-caption alignright" style="width: 260px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig07.gif" rel="lightbox[404]" title="画面４"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig07-250x300.gif" alt="SCMメニュー構成の画面" title="画面４" width="250" height="300" class="size-medium wp-image-494" /></a><p class="wp-caption-text">画面４</p></div>ルート <プロジェクト・ファイル・ディレクトリ＞　のリポジトリ項目をクリックしてポップアップの<br />
EijiSubversionRepository を選択。「OK」ボタンをクリック。<br />
　<br />
すると 「SCM」 メニューに「プロジェクト全体をコミット…」「プロジェクト全体を更新」などのメニューが追加されている（画面４）。<br />
これでセットアップは完了。
<div style="clear:both"></div>
<h3>コミットと履歴</h3>
<p>運用中は変更の一区切り毎に「プロジェクト全体をコミット…」すればよい。<br />
コミットしていった履歴はメニュー「SCM」>「SCMの情報を見る」で確認できる（画面５）。<br />
<div id="attachment_498" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig06.gif" rel="lightbox[404]" title="画面５"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/04/fig06-300x257.gif" alt="SCM情報ウィンドウの画面" title="画面５" width="300" height="257" class="size-medium wp-image-498" /></a><p class="wp-caption-text">画面５（※クリックで拡大）</p></div><br />
このウィンドウで各リビジョンを選択して、「アップデート」ボタンをクリックすれば、そのリビジョンの状態に戻ることができる。（このときXcode上で選択しているファイルがなにか注意すること）<br />
2つのリビジョンを選択して「比較」をクリックすると、２つのソースの違いを示すウィンドウが表示される。<br />
2つのリビジョンを選択して「diff」をクリックすると、２つのソースの違いをdiffの形式で出力したものが見れる。</p>
<p>その他、基本的な運用は下記が参考になった（コマンドをXcodeのメニューに置き換えて読む）。<br />
<a href="http://www.hyuki.com/techinfo/svninit.html">「Subversionの基礎練習」</a><br />
ファイルやフォルダを追加したときは、「リポジトリに追加」を忘れないこと。<br />
　<br />
実際にはSCMの使い方よりも、管理の方針をきちんと定め、のっとることの方が重要だと感じる。それもひとつの技術としての方法論みたいなものがあるだろうが、それは今後の課題。</p>
<h4>参考にさせていただいたサイト：</h4>
<ul>
<li><a href="http://meandmarkpublishing.blogspot.com/2008/01/xcode-3-feature-version-control.html">Me and Mark Publishing&#8217;s Blog: Xcode 3 Feature: Version Control Repository Access</a></li>
<li><a href="http://ishiweb.hio.homeunix.net/2009/11/22/xcodeとscm/">XcodeとSCM « Hiroki Ishiura Online </a></li>
<li><a href="http://www.hyuki.com/techinfo/svninit.html">Subversionの基礎練習</a></li>
</ul>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.smallmake.com/wp/?feed=rss2&#038;p=404</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ダウンロード：フォームメール &#8211; PHP5.2で</title>
		<link>http://www.smallmake.com/wp/?p=326</link>
		<comments>http://www.smallmake.com/wp/?p=326#comments</comments>
		<pubDate>Tue, 19 Jan 2010 13:18:05 +0000</pubDate>
		<dc:creator>Eiji@smallmake</dc:creator>
				<category><![CDATA[Download]]></category>

		<guid isPermaLink="false">http://www.smallmake.com/?p=326</guid>
		<description><![CDATA[このソフトウェアはいわゆるフォームメールの機能を提供します。CookeiやPHPのセッション変数を使用しない仕様になっています。もしよければダウンロードして使ってみてください。バグ報告、ご要望などはコメント欄やメールでお [...]]]></description>
			<content:encoded><![CDATA[<p>このソフトウェアはいわゆるフォームメールの機能を提供します。CookeiやPHPのセッション変数を使用しない仕様になっています。もしよければダウンロードして使ってみてください。バグ報告、ご要望などはコメント欄やメールでお寄せください。<br />
<span id="more-326"></span><br />
このソフトウェアには簡単に上げると以下のような機能があります。</p>
<ol>
<li>データ送信：HTMLフォームで入力されたデータを指定のメールアドレスへ送信します。</li>
<li>入力検証：指定された検証条件に基づきHTMLフォームで入力されたデータを検証させることができます。<br />
検証条件例：郵便番号、電話番号、メールアドレス、日付、数字、最大文字数など</li>
<li>確認ページ：入力内容の確認ページを表示させることができます。</li>
<li>テンプレート：HTMLで作成した検証エラーや確認、送信完了のページのテンプレートを読み込んで表示させることができます。</li>
<li>自動応答：利用者がフォームに入力したメールアドレスに、自動応答メーセージを送信させることができます。</li>
<li>応答編集：自動応答メッセージ（および完了ページ）に、フォームで入力された任意の項目を挿入させることができます。</li>
<li>CSV保存：フォームに入力された内容をCSV形式ファイルにしてサーバ上に保存することができます。</li>
<li>ファイルアップロード：ファイルアップロードしてデータメールの添付として送信します。なお、ファイルアップロード機能を使う場合は「確認ページ」機能は使うことができません。</li>
</ol>
<div id="attachment_529" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.smallmake.com/wp/wp-content/uploads/2010/01/formmail_fig011.gif" rel="lightbox[326]" title="フォームメール遷移図"><img src="http://www.smallmake.com/wp/wp-content/uploads/2010/01/formmail_fig011.gif" alt="フォームメール遷移図" title="フォームメール遷移図" width="300" height="401" class="size-full wp-image-529" /></a><p class="wp-caption-text">遷移図</p></div>
<h3 class="comments">プログラム構成</h3>
<p>このソフトウェアは3つのファイルで構成されています。</p>
<ol>
<li>formmailer.php<br />
フォームのHTMLからactionで呼び出す実行ファイルです。</li>
<li>formmail.class.php<br />
formmailer.php で使用しています。<br />
フォームメールの機能を実現するデータとメソッドのクラスです。</li>
<li>formitem.class.php<br />
formmail.class.php で使用しています。<br />
フォームの入力データを保持し検証する機能を提供します。</li>
</ol>
<h3 class="comments">フォームメール設定ファイル</h3>
<p>フォームメールに必要な設定をXMLファイルで記述しておくことができます。<br />
記述できるのは、例えばデータ送信先、データ件名、確認ページ用テンプレートファイル名、自動応答件名、自動応答内容などです。<br />
なお、設定内容はフォームHTML上で<a href="#htmloverride">オーバーライド</a>することもできます。<br />
<a href="#configxml">詳細は後述</a>します。</p>
<h3 class="comments">使い方</h3>
<h4>[１] プログラムファイル配置場所とその記述</h4>
<p>[1-1] ３つのプログラムファイルの配置場所を決めて設置してください。<br />
3つともフォームのHTMLと同じディレクトリに置いてもよいですが、僕はクラスのみサイトのルートの外にclassというディレクトリを作って以下のように配置しています。</p>
<p>配置例：<br />
/home/smallmake/www/class/formmail.class.php<br />
/home/smallmake/www/class/formitem.class.php<br />
※formmail.class.phpとformitem.class.phpは必ず同じディレクトリに置いてください。</p>
<p>[1-2] このクラスファイルへのパスをformmailer.phpに記述してください。<br />
例えば下記のような形です。</p>
<blockquote><p>require_once(&#8220;/home/smallmake/www/class/formmail.class.php&#8221;);</p></blockquote>
<p>[1-3]formmailer.phpでのオプション設定<br />
[1-3-1]ホスト名設定<br />
指定ホスト以外から実行されないようセキュリティのためにホスト名を設定します。ホスト名のチェックをしなくてよい場合は空欄としてください。</p>
<blockquote><p>define(&#8220;HOST_NAME&#8221;,&#8221;www.xxxxxxxxx.com&#8221;)</p></blockquote>
<p>[1-3-2]オプション設定<br />
いくつかの設定をオプションで行うことができます。オプションは $options 配列で設定します。そのキー名および内容は下表のとおり。</p>
<table>
<tr>
<td nowrap>config_dir</td>
<td>フォームメール設定ファイル（後述）の設置場所ディレクトリ。絶対パスまたはformmailer.php からの相対パス。</td>
</tr>
<tr>
<td nowrap>html_encode</td>
<td>HTMLファイルのエンコード指定。デフォルトはUTF-8。その他ASCII,JIS,EUC-JP,SJIS が指定可。</td>
</tr>
<tr>
<td nowrap>data_email_header</td>
<td>データメールの冒頭にメッセージを付加。date(&#8216;Y-m-d&#8217;), $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']などに使用。</td>
</tr>
<tr>
<td nowrap>data_email_label_prefix</td>
<td>データメールの各アイテムのタイトルの手前に記号や文字を付加。</td>
</tr>
<tr>
<td nowrap>data_email_label_suffix</td>
<td>データメールの各アイテムのタイトルとデータ内容のセパレータの文字を変更。デフォルトは &#8221; : &#8220;。</td>
</tr>
<tr>
<td nowrap>upload_file_max_size</td>
<td>ファイルアップロード（添付送信）を行う場合に、そのファイルサイズの最大バイト数指定。デフォルトは2097152バイト。（php.ini の upload_max_filesize および post_max_size の設定より小さくなければなりません。）</td>
</tr>
</table>
<p>設定例：</p>
<blockquote><p>$options = array(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#8221;config_dir&#8221; => &#8220;&#8221;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#8221;data_email_header&#8221; => &#8220;&#8212;&#8211;\nDate: &#8220;.date(&#8216;Y-m-d H:i:s&#8217;).&#8221;\nIP: &#8220;.$_SERVER['REMOTE_ADDR'].&#8221;\nAgent: &#8220;.$_SERVER['HTTP_USER_AGENT'].&#8221;\n&#8212;&#8211;\n&#8221;<br />
);</p></blockquote>
<h4>[２] フォームHTMLファイルの作成</h4>
<p>まず普通にフォームを作成し、アクションとして formmailer.php を指定してください。そして、それに加えて、以下の情報をフォームの中に記述していただく必要があります。<br />
なお、これらの情報は全て &lt;input type=&#8221;hidden&#8221; &#8230; を使って記述します。</p>
<p>[2-1]フォームメール設定ファイルのファイル名の記述</p>
<blockquote><p>&lt;input id=&#8221;config_xml&#8221; name=&#8221;config_xml&#8221; type=&#8221;hidden&#8221; value=&#8221;フォームメール設定ファイルのファイル名&#8221; /&gt;</p></blockquote>
<p>[2-2]入力内容確認ページ表示の有無の記述<br />
入力内容確認ページを表示したい場合は以下の記述を加えてください。</p>
<blockquote><p>&lt;input id=&#8221;confirm_mode&#8221; name=&#8221;confirm_mode&#8221; type=&#8221;hidden&#8221; value=&#8221;on&#8221; /&gt;</p></blockquote>
<p>[2-3]入力項目設定の記述<br />
入力項目となる要素の全ての要素名をitems[要素名]という形にして、これを要素名とするinput(hidden)を作ってください。これを「入力項目設定」と呼ぶことにします。このitems[要素名] の value には、要素のラベルと検証用の条件を設定できます。</p>
<p>例えば以下のようなフォームを最初に以下のように作成したとします。</p>
<p>[入力項目設定を記述する前の単純なフォーム]</p>
<blockquote><p>&lt;form action=&#8221;formmailer.php&#8221; method=&#8221;post&#8221;&gt;<br />
&nbsp;&nbsp;氏名：&lt;input id=&#8221;pname&#8221; name=&#8221;pname&#8221; type=&#8221;text&#8221; value=&#8221;" /&gt;<br />
&nbsp;&nbsp;性別：&lt;input id=&#8221;gender&#8221; name=&#8221;gender&#8221; type=&#8221;radio&#8221; value=&#8221;女&#8221; /&gt;<br />
&nbsp;&nbsp;&lt;input id=&#8221;gender&#8221; name=&#8221;gender&#8221; type=&#8221;radio&#8221; value=&#8221;男&#8221; /&gt;<br />
&nbsp;&nbsp;メールアドレス：&lt;input id=&#8221;email&#8221; name=&#8221;email&#8221; type=&#8221;text&#8221; value=&#8221;" /&gt;<br />
&nbsp;&nbsp;コメント：&lt;textarea id=&#8221;comment&#8221; name=&#8221;comment&#8221;&gt;&lt;/textarea&gt;<br />
&nbsp;&nbsp;&lt;input type=&#8221;submit&#8221; value=&#8221;確認&#8221; /&gt;<br />
&lt;/form&gt;</p></blockquote>
<p>↓formmailer用に記述を追加</p>
<p>[上記のフォームに入力項目設定を追加したものー赤と緑の部分]</p>
<blockquote><p>&lt;form action=&#8221;formmailer.php&#8221; method=&#8221;post&#8221;&gt;<br />
<span style="color: #008000;">&nbsp;&nbsp;&lt;input name=&#8221;config_xml&#8221; type=&#8221;hidden&#8221; value=&#8221;contact.xml&#8221; /&gt;<br />
&nbsp;&nbsp;&lt;input name=&#8221;confirm_mode&#8221; type=&#8221;hidden&#8221; value=&#8221;on&#8221; /&gt;</span><br />
<span style="color: #993300;">&nbsp;&nbsp;&lt;input name=&#8221;items[pname]&#8221; type=&#8221;hidden&#8221; value=&#8221;氏名,require&#8221; /&gt;<br />
&nbsp;&nbsp;&lt;input name=&#8221;items[gender]&#8221; type=&#8221;hidden&#8221; value=&#8221;性別,&#8221; /&gt;<br />
&nbsp;&nbsp;&lt;input name=&#8221;items[email]&#8221; type=&#8221;hidden&#8221; value=&#8221;メールアドレス,require&amp;email&#8221; /&gt;<br />
&nbsp;&nbsp;&lt;input name=&#8221;items[comment]&#8221; type=&#8221;hidden&#8221; value=&#8221;コメント,require&#8221; /&gt;</span><br />
&nbsp;&nbsp;氏名：&lt;input id=&#8221;pname&#8221; name=&#8221;pname&#8221; type=&#8221;text&#8221; value=&#8221;" /&gt;<br />
&nbsp;&nbsp;性別：&lt;input id=&#8221;gender&#8221; name=&#8221;gender&#8221; type=&#8221;radio&#8221; value=&#8221;女&#8221; /&gt;<br />
&nbsp;&nbsp;&lt;input id=&#8221;gender&#8221; name=&#8221;gender&#8221; type=&#8221;radio&#8221; value=&#8221;男&#8221; /&gt;<br />
&nbsp;&nbsp;&nbsp;メールアドレス：&lt;input id=&#8221;email&#8221; name=&#8221;email&#8221; type=&#8221;text&#8221; value=&#8221;" /&gt;<br />
&nbsp;&nbsp;コメント：&lt;textarea id=&#8221;comment&#8221; name=&#8221;comment&#8221;&gt;&lt;/textarea&gt;<br />
&nbsp;&nbsp;&lt;input type=&#8221;submit&#8221; value=&#8221;確認&#8221; /&gt;<br />
&lt;/form&gt;</p></blockquote>
<p>このプログラムは、この items[]に設定されているvalueの内容を使って、送信するデータのラベルと入力されたデータの検証を行います。valueはカンマ(,)で2つに区切り、1つめがラベル、2つめが検証設定です。<br />
検証設定については後で詳述します（【５】参照）。</p>
<p>[2-4]特別な要素名“email”<br />
email と名付けた要素は自動応答メールの送り先となります。emailという要素名は、そういう意味で特別な要素名であるということにご注意ください。</p>
<p>[2-5]チェックボックス等の作り方<br />
PHPの利用の時にはよく行われることなので書くまでもないかもしれませんが、フォームにチェックボックスなど複数の選択ができる要素を作るときの注意点を書いておきます。<br />
チェックボックス等はPHPでは、配列として扱いたいので、一般に以下のように記述します。例えば利用OSを問うチェックボックス。</p>
<blockquote><p>&lt;input type=&#8221;checkbox&#8221; name=&#8221;useos[]&#8221; id=&#8221;useos[]&#8221; value=&#8221;WindowsXP&#8221; /&gt;<br />
&lt;input type=&#8221;checkbox&#8221; name=&#8221;useos[]&#8221; id=&#8221;useos[]&#8221; value=&#8221;WindowsVista&#8221; /&gt;<br />
&lt;input type=&#8221;checkbox&#8221; name=&#8221;useos[]&#8221; id=&#8221;useos[]&#8221; value=&#8221;Windows7&#8243; /&gt;</p></blockquote>
<p>上記のように要素名の末尾に[]という記号を付け加えます。これでPHPはこの一連の要素を配列として扱うことができます。<br />
なお、この場合でも「入力項目設定」は</p>
<blockquote><p>&lt;input type=&#8221;hidden&#8221; name=&#8221;items[useos]&#8221; id=&#8221;items[useos]&#8221; value=&#8221;利用OS,require&#8221; /&gt;</p></blockquote>
<p>で大丈夫です。name=&#8221;items[useos[]]&#8221; とする必要はありません。</p>
<p>[2-6]ファイルアップロード指定<br />
ファイルアップロードしてこれをデータメールに添付で送信させることができます。ファイルアップロードの項目は複数作ることもできます。<br />
利用するには、まず&lt;form&gt;タグに　enctype=&#8221;multipart/form-data&#8221;　を追加してください。</p>
<blockquote><p>&lt;form class=&#8221;myform&#8221; method=&#8221;post&#8221; action=&#8221;formmailer.php&#8221; enctype=&#8221;multipart/form-data&#8221;&gt;</p></blockquote>
<p>次に、普通に &lt;input type=&#8221;file&#8221; &#8230;/&gt; を追加すればよいだけです。<br />
さらに、これらのファイル名をデータメールの項目として表示したい場合や、ファイルアップロードを必須としたい場合は、既述の　&lt;input type=&#8221;hidden&#8221; name=&#8221;items[...] &#8230; /&gt; 設定をすることも可能です。例えば下記のように記述します。</p>
<blockquote><p>&lt;input type=&#8221;hidden&#8221; name=&#8221;items[atch1]&#8221; id=&#8221;items[atch1]&#8221; value=&#8221;添付ファイル1,require&#8221; /&gt;<br />
&lt;input type=&#8221;hidden&#8221; name=&#8221;items[atch2]&#8221; id=&#8221;items[atch2]&#8221; value=&#8221;添付ファイル2,require&#8221; /&gt;</p></blockquote>
<p>注意点１: ファイルアップロードを利用する場合は「確認ページ」を使うことができません。confirm_mode は off としてください。onにした場合はエラーとなります。<br />
注意点２: アップロードファイルに日本語ファイル名を使う場合は、フォームのHTMLエンコードをUTF-8にすることをお勧めします（シフトJISの場合、日本語ファイル名が文字化けすることがあります）。<br />
注意点３: php.ini の設定のupload_max_filesize および post_max_size はアップロードするサイズより大きくなければなりません。.htaccessファイルにて変更可能な場合は自己責任で設定してください。</p>
<p><a name="configxml"></a></p>
<h4>[３] フォームメール設定ファイルの配置場所とその記述</h4>
<p>[3-1] フォームメール設定ファイルを作成します。<br />
このファイルはXML形式になっています。<br />
[フォームメール設定ファイルの例]</p>
<blockquote><p>
&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;formmail&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;channel&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;問い合わせフォーム&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;link&gt;http://www.smallmake.com&lt;/link&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;description&gt;&lt;/description&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;language&gt;&lt;/language&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;pubDate&gt;12 Jan 2010 13:33:58 +0900&lt;/pubDate&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;params&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dataFrom&gt;nakai@smallmake.com&lt;/dataFrom&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dataTo&gt;nakai@smallmake.com&lt;/dataTo&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dataSubject&gt;[問い合わせフォームより]&lt;/dataSubject&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dataComment&gt;このメールはサイトの問い合わせフォームから送信しています。&lt;/dataComment&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dataCsvPath&gt;/home/smallmake/www/html/form/contact.csv&lt;/dataCsvPath&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dataCsvEncode&gt;sjis-win&lt;/dataCsvEncode&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;htmlValidate&gt;contact_validation.html&lt;/htmlValidate&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;htmlConfirm&gt;contact_confirm.html&lt;/htmlConfirm&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;htmlThanks&gt;contact_thanks.html&lt;/htmlThanks&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;returnUrl&gt;http://www.smallmake.com/form/contact.html&lt;/returnUrl&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;autoReplyFrom&gt;eiji@smallmake.com&lt;/autoReplyFrom&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;autoReplyBcc&gt;eiji@smallmake.com&lt;/autoReplyBcc&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;autoReplySubject&gt;[www.smallmake.com] Thank you for comment.&lt;/autoReplySubject&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;autoReplyMessage&gt;Thank you for your comment to www.smallmake.com.<br />
This is auto reply mail.<br />
Your comment is following &#8230;<br />
&#8212;&#8212;<br />
__%comment%__<br />
&lt;/autoReplyMessage&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/params&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/channel&gt;<br />
&lt;/formmail&gt;</p></blockquote>
<p>各項目の意味は下記です。</p>
<table>
<tbody>
<tr>
<td nowrap>title</td>
<td>このフォームのタイトル（空欄可）</td>
</tr>
<tr>
<td nowrap>link</td>
<td>フォームHTMLのURL（空欄可）</td>
</tr>
<tr>
<td nowrap>description</td>
<td>このフォームの説明（空欄可）</td>
</tr>
<tr>
<td nowrap>pubDate</td>
<td>発行日（空欄可）</td>
</tr>
<tr>
<td nowrap>dataFrom</td>
<td>データメールの送信元メールアドレス</td>
</tr>
<tr>
<td nowrap>dataTo</td>
<td>データメールの送信先</td>
</tr>
<tr>
<td nowrap>dataSubject</td>
<td>データメールの件名</td>
</tr>
<tr>
<td nowrap>dataComment</td>
<td>データメールの行頭に挿入するメッセージ</td>
</tr>
<tr>
<td nowrap>dataCsvPath</td>
<td>データをCSV形式ファイルで保存。そのファイル名のパス。（省略で出力なし）</td>
</tr>
<tr>
<td nowrap>dataCsvEncode</td>
<td>CSV形式ファイルのエンコード指定。EUC-JP, SJIS, UCS-2LE, JIS, eucjp-win, sjis-winなど。（省略時は sjis-win とする）</td>
</tr>
<tr>
<td nowrap>htmlValidate</td>
<td>検証エラーとなった入力フィールドとエラー内容の表示に使用するHTMLのURL（省略可）</td>
</tr>
<tr>
<td nowrap>htmlConfirm</td>
<td>入力内容の確認ページの表示に使用するHTMLのURL（省略可）</td>
</tr>
<tr>
<td nowrap>htmlThanks</td>
<td>送信完了を表示する完了ページのHTMLのURL（省略可）</td>
</tr>
<tr>
<td nowrap>returnUrl</td>
<td>送信完了ページなどで完了後に引き返すページへのリンクのためのURL（省略可）</td>
</tr>
<tr>
<td nowrap>autoReplyFrom</td>
<td>自動応答メールの送信元メールアドレス</td>
</tr>
<tr>
<td nowrap>autoReplyCc</td>
<td>自動応答メールのCCの送信先メールアドレス（省略可）</td>
</tr>
<tr>
<td nowrap>autoReplyBcc</td>
<td>自動応答メールのBCCの送信先メールアドレス（省略可）</td>
</tr>
<tr>
<td nowrap>autoReplySubject</td>
<td>自動応答メールの件名（省略可）</td>
</tr>
<tr>
<td nowrap>autoReplyMessage</td>
<td>自動応答メールの本文内容（省略可）</td>
</tr>
</tbody>
</table>
<p>↓(省略可)項目の省略時の動作</p>
<ul class="ul-list1">
<li>htmlValidate, htmlConfirm, htmlThanks : これらが省略されるとデフォルトの簡易HTMLで表示をします。</li>
<li>returnUrl：戻り先なしとなります。</li>
<li>autoReplyFromなど：自動返信をしたくない場合はこの一連の自動返信のための設定を省略してください。</li>
</ul>
<p>　<br />
[3-2] この設定ファイルのファイル名をフォームのHTMLの中に記述します。</p>
<blockquote><p>&lt;input id=&#8221;config_xml&#8221; name=&#8221;config_xml&#8221; type=&#8221;hidden&#8221; value=&#8221;フォームメール設定ファイル名&#8221; /&gt;</p></blockquote>
<p>という記述をフォーム (&lt;form&gt;) の中に追加してください。</p>
<p><a name="htmloverride"></a>なお、このフォームメール設定ファイルの指定をせずに、フォームのHTML上で全てを設定することも可能です。あるいは、このファイルを指定した上で、全てまたは一部をHTML上でオーバーライドできます。例えば以下のようにHTML上に記述できます。</p>
<blockquote><p>&lt;input id=&#8221;dataFrom&#8221; name=&#8221;dataFrom&#8221; type=&#8221;hidden&#8221; value=&#8221;info@smallamake.com&#8221; /&gt;<br />
&lt;input id=&#8221;dataTo&#8221; name=&#8221;dataTo&#8221; type=&#8221;hidden&#8221; value=&#8221;info@smallamake.com&#8221; /&gt;<br />
&lt;input id=&#8221;dataSubject&#8221; name=&#8221;dataSubject&#8221; type=&#8221;hidden&#8221; value=&#8221;【問い合わせ】&#8221; /&gt;<br />
&#8230;以下省略&#8230;</p></blockquote>
<p>[3-3]自動応答メールのメッセージに利用者の入力した内容を差し込むことができます。<br />
利用者がフォームに入力した内容は、__% （アンダーバー２つとパーセント記号）と %__ （パーセント記号とアンダーバー２つ）の間に要素名（inputのname）を記述した部分に個々に差し込まれます。上の設定ファイルの例で言うと、__%comment%__ の部分にコメントとして入力した内容が差し込まれます。</p>
<h4>[４] テンプレートの配置場所とその記述</h4>
<p>[4-1]テンプレートとなるHTMLファイルを作成してください。<br />
前述の[遷移図]の中の下記3つのページをHTMLで作成して、プログラムからのメッセージやデータ内容を「差し込み印刷」式に挿入して表示させることができます。各テンプレート「差し込み部分」には規定のマークアップを記述してください。</p>
<p>[4-1-1]入力検証エラー表示ページのHTMLテンプレート<br />
HTML内に以下のマークアップ文字を記述してください。そこに入力検証エラーメッセージを表示します。</p>
<blockquote><p>__%ValidationAlert%__</p></blockquote>
<p>なお、入力検証エラー表示ページには、その前のページであるフォームへ「戻る」ボタンやリンクを設けることをお勧めします。<br />
以下のテンプレート例を参考にしてください。</p>
<blockquote><p>入力に下記の誤りがあります。フォームに戻って修正してください。<br />
__%ValidationAlert%__<br />
&lt;form&gt;&lt;input onclick=&#8221;history.back();&#8221; type=&#8221;button&#8221; value=&#8221;戻る&#8221; /&gt;&lt;/form&gt;</p></blockquote>
<p>[4-1-2]入力内容確認ページのHTMLテンプレート<br />
入力確認用ページのHTMLテンプレートには必ず&lt;form&gt; タグを設置してください。action には __%PhpSelf%__ と記述すれば、元のフォームと同じactionが使われます（echo $_SERVER['PHP_SELF']; と同等）。</p>
<blockquote><p>&lt;form class=&#8221;myform&#8221; method=&#8221;post&#8221; action=&#8221;__%PhpSelf%__&#8221;&gt;</p></blockquote>
<p>そしてそのタグの開始直後くらいに以下のマークアップを記述ください。</p>
<blockquote><p>__%HiddenData%__</p></blockquote>
<p>プログラムがデータ送信や設定に必要なデータをすべてこのマークアップ位置に自動的に差し込みます。<br />
次に、入力したものを利用者に確認してもらうための表示を記述してください。利用者がフォームに入力した内容は、__% （アンダーバー２つとパーセント記号）と %__ （パーセント記号とアンダーバー２つ）の間に要素名（inputのname）を記述した部分に個々に差し込まれます。<br />
そして最後に送信ボタンとなる submit も設置してください。<br />
以下のテンプレート例を参考にしてください。</p>
<blockquote><p>入力内容をご確認ください。<br />
&lt;form name=“f” method=“post” action=“__%PhpSelf%__”&gt;<br />
&nbsp;&nbsp;__%HiddenData%__<br />
&nbsp;&nbsp;氏名： __%pname%__<br />
&nbsp;&nbsp;性別： __%gender%__<br />
&nbsp;&nbsp;メールアドレス： __%email%__<br />
&nbsp;&nbsp;コメント： __%comment%___<br />
&nbsp;&nbsp;&lt;input type=&#8221;submit&#8221; value=&#8221;送信&#8221; /&gt;<br />
&nbsp;&nbsp;&lt;input onclick=&#8221;history.back();&#8221; type=&#8221;button&#8221; value=&#8221;戻る&#8221; /&gt;<br />
&lt;/form&gt;</p></blockquote>
<p>[4-1-3]送信完了ページのHTMLテンプレート<br />
送信完了ページもHTMLファイルで作成してテンプレートとすることができます。<br />
この時、入力内容確認ページと同じように、__% と %__ の間に要素名を記述したものを用いて、入力内容からの差し込みができます。例えば以下のようなHTMLテンプレートが考えられます。</p>
<blockquote><p>__%pname%__ 様<br />
送信いたしました。ありがとうございます。<br />
__%email%__ 宛に当方で受信したことをお知らせする自動応答メールをお送りいたしました。<br />
詳細は、個別に改めてご連絡させていただきます。<br />
よろしくお願いいたします。</p></blockquote>
<h4>[５] 入力項目設定の記述の詳細</h4>
<p>「【２】フォームHTMLファイルの作成」で既に述べたように、入力項目となる要素の全ての要素名をitems[要素名]という形にして、これを要素名とするinput(hidden)を作ってください。そして、このitems[要素名] の value には、要素のラベルと検証用の条件を設定します。</p>
<blockquote><p>&lt;input id=&#8221;items[要素名]&#8221; name=&#8221;items[要素名]&#8221; value=&#8221;ラベル,検証条件&#8221; /&gt;</p></blockquote>
<p>となります。「要素名」とは、すでに述べたようにフォーム入力する実際のinputやtextarea, selectなどの要素の名前です。<br />
以下に、ラベルと検証条件について詳述します。</p>
<p>[5-1]ラベル<br />
ラベルは、送られてくるデータメールでの各入力項目のラベルとなります。<br />
[5-2]検証条件<br />
ラベルと検証条件は半角のカンマで区切ります。<br />
検証条件は半角アンド記号（&amp;）で区切って複数指定することができます。<br />
例えば以下のように記述します。</p>
<blockquote><p>&lt;input name=&#8221;items[pname]&#8221; type=&#8221;hidden&#8221; value=&#8221;氏名,require&#8221; /&gt;<br />
&lt;input name=&#8221;items[gender]&#8221; type=&#8221;hidden&#8221; value=&#8221;性別,&#8221; /&gt;<br />
&lt;input name=&#8221;items[email]&#8221; type=&#8221;hidden&#8221; value=&#8221;メールアドレス,require&amp;email&#8221; /&gt;<br />
&lt;input name=&#8221;items[tel]&#8221; type=&#8221;hidden&#8221; value=&#8221;電話番号,phone=jp&#8221; /&gt;</p></blockquote>
<p>上記は、氏名は必須入力、性別は検証しない、メールアドレスは必須入力で、かつメールアドレスに必要な書式（半角英数字であること、＠マークで区切られていること、ドメイン名にはドットを含むなど）であること、電話番号は必須ではないが書式はハイフン区切りの日本の電話番号の書式であることが設定されています。<br />
条件に含まれるイコール記号（=）は、その条件におけるパラメータを指定しています。上記の場合は日本の電話番号の書式を指定しています。phoneの場合は=usの指定もできます。<br />
イコール記号を使うものはそのほかに、最大値（例：max=100）、最小値（例：min=3)、最大文字数（例：maxLength=25)などがあります。<br />
以下に指定できる検証条件の一覧を掲載します。</p>
<table>
<tbody>
<tr>
<th>検証条件</th>
<th nowrap>検証内容</th>
<th>パラメータ</th>
<th>備考</th>
</tr>
<tr>
<td nowrap>require</td>
<td nowrap>必須入力にする</td>
<td nowrap>なし</td>
<td></td>
</tr>
<tr>
<td nowrap>email</td>
<td nowrap>メールアドレス<br />
の書式</td>
<td nowrap>&#8220;checkDNS&#8221;</td>
<td>”checkDNS”を指定した場合、ドメイン名をネットワークでチェック。</td>
</tr>
<tr>
<td>zip</td>
<td nowrap>郵便番号の書式</td>
<td nowrap>&#8220;jp&#8221;, &#8220;us&#8221;</td>
<td>jp: 日本3桁-4桁、 us: 米国5桁-4桁</td>
</tr>
<tr>
<td nowrap>phone</td>
<td nowrap>電話番号の書式</td>
<td nowrap>&#8220;jp&#8221;, &#8220;us&#8221;</td>
<td>jp:日本[2～5桁]-[1～5桁]-[3～5桁]、 us:3桁-3桁-4桁</td>
</tr>
<tr>
<td nowrap>date</td>
<td nowrap>日付書式</td>
<td nowrap>フォーマット</td>
<td>フォーマットにはPHPのdate関数のフォーマット文字列を使用。フォーマット文字列については <a href="http://jp2.php.net/manual/ja/function.date.php">http://jp2.php.net/manual/ja/function.date.php</a>を参照。指定がない場合、”Y-m-d” とする。”Y-m-d”は例えば “2010-03-14”のような形式を表す。</td>
</tr>
<tr>
<td nowrap>max</td>
<td nowrap>最大数値</td>
<td nowrap>数値</td>
<td>最大値の数字を指定。それより大きい数字が入力されるとエラーとする。</td>
</tr>
<tr>
<td nowrap>min</td>
<td nowrap>最小数値</td>
<td nowrap>数値</td>
<td>最小値の数字を指定。それより少ない数字が入力されるとエラーとする。</td>
</tr>
<tr>
<td nowrap>maxLength</td>
<td nowrap>最大文字数</td>
<td nowrap>数値</td>
<td>最大文字数を指定。それより多い文字数が入力されるとエラーとする。</td>
</tr>
<tr>
<td nowrap>minLength</td>
<td nowrap>最小文字数</td>
<td nowrap>数値</td>
<td>最小文字数を指定。それより少ない文字数が入力されるとエラーとする。</td>
</tr>
<tr>
<td nowrap>alphaNumeric</td>
<td nowrap>半角英数字</td>
<td nowrap>なし</td>
<td></td>
</tr>
<tr>
<td nowrap>numeric</td>
<td nowrap>半角数字</td>
<td nowrap>なし</td>
<td></td>
</tr>
<tr>
<td nowrap>url</td>
<td nowrap>URL書式</td>
<td nowrap>なし</td>
<td>http: https: ftp: で始まるURL書式</td>
</tr>
<tr>
<td nowrap>ip</td>
<td nowrap>IPアドレス書式</td>
<td nowrap>なし</td>
<td></td>
</tr>
<tr>
<td nowrap>creditCard</td>
<td nowrap>クレジットカード<br />
ナンバー書式</td>
<td nowrap>なし</td>
<td></td>
</tr>
<tr>
<td nowrap>ssn</td>
<td nowrap>米国社会保障番号</td>
<td nowrap>なし</td>
<td></td>
</tr>
<tr>
<td nowrap>custom</td>
<td nowrap>ユーザー指定の<br />
文字列検証</td>
<td nowrap>正規表現</td>
<td>正規表現で検証文字列を指定する。</td>
</tr>
</tbody>
</table>
<h3 class="comments">ダウンロード・ファイルの構成</h3>
<p>▼プログラム・ファイル（構成は既述）<br />
formmailer.php<br />
formmail.class.php<br />
formitem.class.php</p>
<p>▼サンプル・ファイル</p>
<table>
<tr>
<td>contact.html</td>
<td>フォームHTML</td>
</tr>
<tr>
<td>contact_attach.html</td>
<td>フォームHTML(ファイルアップロード例)</td>
</tr>
<tr>
<td>contact.xml</td>
<td>フォームメール設定ファイル</td>
</tr>
<tr>
<td>contact_validation.html</td>
<td>入力検証エラー表示ページテンプレート</td>
</tr>
<tr>
<td>contact_confirm.html</td>
<td>入力内容確認ページテンプレート</td>
</tr>
<tr>
<td>contact_thanks.html</td>
<td>送信完了ページテンプレート</td>
</tr>
<tr>
<td>form.css</td>
<td>フォームHTML用CSS</td>
</tr>
</table>
<h3 class="comments">ここからダウンロードできます</h3>
<p>最新版：<br />
&nbsp;&nbsp;githubよりダウンロードできます。下記のリンクです。</p>
<h4><a href="https://github.com/eijin/formmailer">&gt; github : eijin/formmailer </a></h4>
<p>&nbsp;</p>
<p>旧版：<br />
&nbsp;&nbsp;<a href="http://www.smallmake.com/download/formmailer_0_4_x.zip">version 0.4.1</a><br />
&nbsp;&nbsp;<a href="http://www.smallmake.com/download/formmailer_0_3_x.zip">version 0.3.0</a><br />
&nbsp;&nbsp;<a href="http://www.smallmake.com/download/formmailer_0_2_x.zip">version 0.2.x</a><br />
&nbsp;&nbsp;<a href="http://www.smallmake.com/download/formmailer_0_1_x.zip">version 0.1.x</a></p>
<h3 class="comments">リリース履歴</h3>
<h4>version 0.4.1 / 2010.07.19</h4>
<p><b>修正：</b><br />
・formitem.class.php でzip, phone, dateチェックにバグがあり修正<br />
<b>追加：</b><br />
・options にデータメールヘッダ付加、データラベルにprefix,suffix変更、アップロード最大サイズ指定追加<br />
・ファイルアップロード機能追加<br />
<b>変更ファイル：</b><br />
・formmail.class.php<br />
・formitem.class.php<br />
・contact_attach.html (サンプルファイル)<br />
　<br />
　</p>
<h4>version 0.3.0 / 2010.05.24</h4>
<p><b>追加：</b><br />
・frommail.class.php に putItemValue($key, $value) という関数を追加。<br />
　formmailer.phpなど外部からitemsの値を変えられるようにした。<br />
<b>変更ファイル：</b><br />
・formmail.class.php<br />
　<br />
　</p>
<h4>version 0.2.0 / 2010.05.08</h4>
<p><b>修正：</b><br />
・「入力内容確認ページ」で生成している hiddenのinput タグ閉じを &#8221; /&gt;&#8221;に修正。<br />
・上記hidden生成でvalueに htmlspecialchars をかけるようにした。<br />
・メール送信でメッセージに htmlspecialchars をかけていたのを取りやめ。<br />
<b>追加：</b><br />
・自動返信メールのコピーを指定アドレス(CC: BCC:)にも送信できるようにした。<br />
・submitした内容をCSVファイルに保存できるようにした。<br />
<b>変更ファイル：</b><br />
・formmail.class.php<br />
・contact.xml (サンプルファイル)<br />
　<br />
　</p>
<h4>version 0.1.0 / 2010.01.19</h4>
<p>最初のリリース</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.smallmake.com/wp/?feed=rss2&#038;p=326</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
	</channel>
</rss>

