<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>tonextone.com/type/</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/" />
   <link rel="self" type="application/atom+xml" href="http://tonextone.com/type/atom.xml" />
   <id>tag:tonextone.com,2008:/type//1</id>
   <updated>2008-12-04T08:40:53Z</updated>
   
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.32-ja</generator>

<entry>
   <title>店舗情報の版管理 (skypefind の場合)</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2008/11/29-1311.html" />
   <id>tag:tonextone.com,2008:/type//1.26</id>
   
   <published>2008-11-29T04:11:54Z</published>
   <updated>2008-12-04T08:40:53Z</updated>
   
   <summary> ...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="おもう" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[<img src="http://tonextone.com/type/2008/11/29/1.search_result.png" /><br />
<img src="http://tonextone.com/type/2008/11/29/2.spot_detail.png" /><br />
<img src="http://tonextone.com/type/2008/11/29/3.spot_try_to_conflict.png" /><br />
<img src="http://tonextone.com/type/2008/11/29/4.spot_conflict.png" /><br />
<img src="http://tonextone.com/type/2008/11/29/5.spot_revise.png" /><br />
<img src="http://tonextone.com/type/2008/11/29/6.spot_revision_log.png" /><br />
<img src="http://tonextone.com/type/2008/11/29/7.spot_review.png" /><br />
<img src="http://tonextone.com/type/2008/11/29/8.spot_flag.png" /><br />
]]>
      
   </content>
</entry>
<entry>
   <title>The Art of SQL「10 章 戦力の結集」「11章 計略」から読み取ったこと。</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2008/10/05-1616.html" />
   <id>tag:tonextone.com,2008:/type//1.25</id>
   
   <published>2008-10-05T07:16:50Z</published>
   <updated>2008-11-29T04:32:06Z</updated>
   
   <summary>        スキーマのモデリング技法のうち重要なものは、以下の 2 つ。  ...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="21" label="sql" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[<ol>
  <li>
    スキーマのモデリング技法のうち重要なものは、以下の 2 つ。
    <dl>
      <dt>第3正規形(3NF)</dt>
      <dd>
        汎用的な(最適化されていない、中立的な)スキーマ。<br />
        マスター/ディテールもこっち。
      </dd>
      <dt>スタースキーマ</dt>
      <dd>
        データ・ウェアハウス用スキーマ。<br />
        分類のキーとなる「ディメンジョン」表。<br />
        各種「ディメンジョン」の組み合わせに対応する集計可能な値「メジャー」だけを含む「ファクト」表。<br />
      </dd>
    </dl>
  </li>
  <li>
    メタ設計よりも、サブタイプを使おう。<br />
    まだ、ピンと来ないので、引き続き、調べ中。
  </li>
</ol>

<dl>
  <dt>参考URL:</dt>
  <dd>
    <a href="http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19217-02/schemas.htm">スキーマのモデリング化技法</a>
  </dd>
  <dd>
    <a href="http://homepage2.nifty.com/mnakamura/dw/dwwords.html">データウェアハウス関連用語　解説</a>
  </dd>
</dl>
]]>
      
   </content>
</entry>
<entry>
   <title>The Art of SQL「4 章 策略」から読み取ったこと。</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2008/09/15-2320.html" />
   <id>tag:tonextone.com,2008:/type//1.24</id>
   
   <published>2008-09-15T14:20:34Z</published>
   <updated>2008-11-09T06:14:29Z</updated>
   
   <summary> 効果的なフィルターとして働くカラムを見つける。 なるべく早い段階で、そのフィル...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="21" label="sql" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[<ol>
<li>効果的なフィルターとして働くカラムを見つける。</li>
<li>なるべく早い段階で、そのフィルターを適用する。</li>
</ol>

<h3>例1: 結合する前にフィルター</h3>

結合する前にフィルタリングできるならば、そうしたほうが速いに決まっている。<br />

<textarea name="code" class="sql" cols="50" rows="50">

-- before
SELECT A.x
 FROM ( A JOIN B ON A.a_id = B.a_id )
 WHERE B.y = 'foo' ;

-- after (faster)
SELECT A.x
 FROM ( A JOIN B ON B.a_id = A.a_id AND B.y = 'foo' ) ;

</textarea><br />

旧来の結合構文でも、同様。<br />

<textarea name="code" class="sql" cols="50" rows="50">

-- before
SELECT A.x
 FROM A, B
 WHERE A.a_id = B.a_id
 AND B.y = 'foo' ;

-- after (faster)
SELECT A.x
 FROM A, ( SELECT * FROM B WHERE B.y = 'foo' ) AS C
 WHERE A.a_id = C.a_id

</textarea><br />

<h3>例2: IN か EXISTS か？</h3>

サブクエリの内側のフィルターが効果的な場合は IN (非相関サブクエリ)<br />
サブクエリの外側のフィルターが効果的な場合は EXISTS (相関サブクエリ)<br />

ただし、相関サブクエリの結合キーには、インデックスを張るべし。<br />

<textarea name="code" class="sql" cols="50" rows="50">

-- A.z = 'bar' が効果的なフィルターである場合、
-- ( B.a_id にインデックスを張るのを忘れずに )
SELECT A.x
 FROM A
 WHERE A.z = 'bar' ;
 AND EXISTS( SELECT * FROM B WHERE B.a_id = A.a_id AND B.y = 'foo' ) ;

-- B.y = 'foo' が効果的なフィルターである場合、
SELECT A.x
 FROM A
 WHERE A.z = 'bar' ;
 AND A.a_id IN( SELECT B.a_id FROM B WHERE B.y = 'foo' ) ;

-- この場合、以下のようにも書ける、
SELECT C.x
 FROM (SELECT * FROM A WHERE A.z = 'bar' ) AS C, (SELECT * FROM B WHERE B.y = 'foo' ) AS D
 WHERE C.a_id = D.a_id ;

-- あるいは、
SELECT A.x
 FROM ( A JOIN B ON A.a_id = B.a_id AND A.z = 'bar' AND B.y = 'foo' );

</textarea><br />
]]>
      
   </content>
</entry>
<entry>
   <title>Re: Emacs の moccur-grep-find で特定のファイルを無視したい</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2008/07/18-0038.html" />
   <id>tag:tonextone.com,2008:/type//1.23</id>
   
   <published>2008-07-17T15:38:01Z</published>
   <updated>2008-07-18T01:12:57Z</updated>
   
   <summary>ずっと dmoccur を使ってたんだけど、 ( moccur-grep(-fi...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="15" label="emacs" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[ずっと dmoccur を使ってたんだけど、
<blockquote>
( moccur-grep(-find)は、) find-file でファイルを開くことをしないので，dmoccur よりもはやく検索できますし，バッファが氾濫することもありません．
</blockquote>
だそうで試してみることにしました。<br />
<br />
で、まずは .svn/* とかを検索対象から省いてから速さを比較しようと思ったんだけれど、この「省き方」の情報が無い。<br />
<br />
そんな中、 id:higepon さんが moccur を愛用しているようだったので質問させていただいたところ、<br />
 <a href="http://d.hatena.ne.jp/higepon/20080717/1216264518" target="_blank">elisp を書いていただきました</a>。ありがとうございました!!!<br />
<br />
で、結論を言うと、<br />
どうやら、 moccur-grep(-find) でも、 dmoccur の設定(dmoccur-exclusion-mask)を、利用してくれるようです。<br />
 color-moccur.el を読めないなりに読んでみると、どうもそのようです。<br />
<br />
現在、以下のような設定で、試用中です。<br />
<textarea name="code" class="xml" cols="50" rows="50">
(setq moccur-grep-default-mask "\\.\\(html\\|php\\|js\\|css\\)$")
(load "color-moccur")
(setq dmoccur-recursive-search t)
(setq dmoccur-exclusion-mask (append '("\\~$" "\\.svn\\/") dmoccur-exclusion-mask))
(setq dmoccur-mask '("\\.\\(html\\|php\\|js\\|css\\)$"))
</textarea>
<br />
もともと dmoccur の設定があったせい(おかげ)で、<br />
id:higepon さんから教えていただいた設定を追加しても(しなくても)状況が変化せず、ちょっと混乱してしまいましたが、<br />
id:higepon さんの elisp も、期待どおりの動作をしています。<br />
<br />
まだ、試用を開始したばかりなので、もしかしたら、この結論も正しくないかもしれません。<br />
間違いなどあれば、ご指摘いただければ幸いです。<br />]]>
      
   </content>
</entry>
<entry>
   <title>和訳してみた</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2008/01/03-2052.html" />
   <id>tag:tonextone.com,2008:/type//1.19</id>
   
   <published>2008-01-03T11:52:23Z</published>
   <updated>2008-01-03T13:36:20Z</updated>
   
   <summary>&quot;Higher-Order JavaScript&quot; by Sean M. Bur...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[<a href="http://interglacial.com/hoj/hoj.html" target="_blank">"Higher-Order JavaScript" by Sean M. Burke</a> を和訳した。
<a href="/neta/hoj/hoj.html">"Higher-Order JavaScript"(ja)</a><br />
<br />
"Higher-Order" という表現に何か高尚なものを感じ、
JavaScript のすごいことが書いてあると期待し del.icio.us したものの、それっきりになっていたので。<br />
<br />
最初に斜め読みした段階で、実は、期待していたものではなく、
 Perl の人が「JavaScript で Perl を書く」ためのものであることがわかったのだが、<br />
 trivial なことでも良いので、何か吸収できるだろうと信じて、区切りの良いところまで訳してしまうことにした。<br />

以下、その過程で脳裏をよぎった物事:
<ul>
<li>
x.func = function() { return this; } ならば、<br />
x.func() の this は x 。<br />
x.func.apply(y) の this は y 。<br />
Function#apply(object, [arg, ..]) は、 prototype.js でいうと、Function#bind(object, arg, ...) 
</li>
<li>
<a href="http://prototypejs.org/api/" target="_blank">Prototype API Documentation</a> を読もう。要所でソースコードも。
</li>
<li>
Perl のリストという概念とか、 $arrayref = \@arrayref; $hashref = \%hashref とか、やっぱり変態的。
</li>
<li>
lisp のリストは俺的にしっくりくるか？ emacs lisp で hello world してみるか。
</li>
</ul>
]]>
      
   </content>
</entry>
<entry>
   <title>Google Maps API を SSL で使えるようにしてみる。</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2007/10/02-0112.html" />
   <id>tag:tonextone.com,2007:/type//1.18</id>
   
   <published>2007-10-01T16:12:31Z</published>
   <updated>2008-07-25T07:14:33Z</updated>
   
   <summary> 2008/03 : /maps?file=api を書き換えるための正規表現の...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[<p style="border: 1px #cc6666 dotted; padding: 0.2em; color: #999999; font-size: 120%; font-weight: bold;">
2008/03 : /maps?file=api を書き換えるための正規表現のパターンを微調整しました。
</p>

<p style="border: 1px #cc6666 dotted; padding: 0.2em; color: #999999; font-size: 120%; font-weight: bold;">
2008/05/15 : 通りすがりさんの報告を受けて、正規表現のパターンをさらに微調整しました。
</p>

<p style="border: 1px #cc6666 dotted; padding: 0.2em; color: #999999; font-size: 120%; font-weight: bold;">
2008/07/25 : また API に変更があったようで、機能しなくなったので、
正規表現のパターンを緩めに調整しました。
</p>

Google Maps API は HTTPS では提供されていないらしい。<br />
(Google Analytics には HTTPS 版もある。というのは先日知りました。)<br />
<br />
しかし、HTTPS なページに、HTTP なリソースを読み込むと IE 曰く、<br />
「このページにはセキュリティで保護されている項目と保護されていない項目が含まれています」と。</br>
<br />
この問題を何とかしなければならない機会があったので、<br />
HTTPS な proxy をかまして何とかしてみた。<br />
<br />
要するに、 Ｇoogle Maps API を使うためには、普通
<p>http://maps.google.com/maps?file=api&amp;v=2&amp;key=...</p>
っていう JavaScript を読み込むけれども、<br />
まずこの JavaScript を https://(自前の proxy )経由でリクエストし、<br />
この JavaScript にハードコードされている http://... を<br />
https://(自前の proxy )経由でリクエストするように書き換えれば良いだけ。<br />

以下は PHP での例。

<p>
デモ: <a href="https://ssl.tonextone.com/neta/gmap_over_ssl/">https://ssl.tonextone.com/neta/gmap_over_ssl/</a> 
</p>
# SSL の証明書を買っていないので、その旨の警告は出ます。<br />
<br />

./rewrite_gmaps_api.php<br />
<textarea name="code" cols="50" rows="10" class="php">
require_once 'HTTP/Request.php';

if ($_SERVER["HTTPS"] == 'on') {
  $url_base = 'https://ssl.tonextone.com/neta/gmap_over_ssl/';
} else {
  $url_base = 'http://tonextone.com/neta/gmap_over_ssl/';
}

$url = 'http://maps.google.com/maps';
$url .= ($_SERVER["PATH_INFO"]) ? $_SERVER["PATH_INFO"] : '';
$url .= ($_SERVER["QUERY_STRING"]) ? '?'.$_SERVER["QUERY_STRING"] : '';

$proxy =& new HTTP_Request($url);
$proxy->setMethod(HTTP_REQUEST_METHOD_GET);
$status['proxy'] =& $proxy->sendRequest();

if (PEAR::isError($status['proxy'])) { $response = ''; }
else {
  $response = $proxy->getResponseBody();
  $response_header = $proxy->getResponseHeader();
}

$pattern = array(
                 '<"(http://[^/\.]+\.google\.com)">',
                 // '<"(http://[^/\.]+\.google\.com/intl/en_ALL/mapfiles/[0-9a-z]+/maps2)" *\+ *"(\.api/main\.js)">',
                 '<"(http://[^/\.]+\.google\.com/intl/en_ALL/mapfiles/)>',
                 '<"(http://(kh|mt)[0-9]+\.google)>',
                 );
$replacement = array(
                     '"'.$url_base.'proxy.php/\\1"',
                     // '"'.$url_base.'proxy.php/\\1\\2"',
                     '"'.$url_base.'proxy.php/\\1',
                     '"'.$url_base.'proxy.php/\\1',
                     );

$response = preg_replace($pattern, $replacement, $response);

header("Content-Type: {$response_header['content-type']}");
// header("Content-Length: {$response_header['content-length']}");
echo $response;
</textarea><br />
<br />
./proxy.php<br />
<textarea name="code" cols="50" rows="10" class="php">
require_once 'HTTP/Request.php';

$url = ($_SERVER["PATH_INFO"]) ? preg_replace('<^/>', '', $_SERVER["PATH_INFO"]) : '';
$url .= ($_SERVER["QUERY_STRING"]) ? '?'.$_SERVER["QUERY_STRING"] : '';

$proxy =& new HTTP_Request($url);
$proxy->setMethod(HTTP_REQUEST_METHOD_GET);
$status['proxy'] =& $proxy->sendRequest();

if (PEAR::isError($status['proxy'])) { $response = ''; }
else {
  $response = $proxy->getResponseBody();
  $response_header = $proxy->getResponseHeader();
}

header("Content-Type: {$response_header['content-type']}");
// header("Content-Length: {$response_header['content-length']}");
echo $response;
</textarea>]]>
      
   </content>
</entry>
<entry>
   <title>UserPrivateGroup の使いどころ</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2007/09/23-0115.html" />
   <id>tag:tonextone.com,2007:/type//1.17</id>
   
   <published>2007-09-22T16:15:31Z</published>
   <updated>2007-09-22T17:23:26Z</updated>
   
   <summary> unix 系のサーバにアカウントを作成する際に、 $ id someone ;...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[<p>
unix 系のサーバにアカウントを作成する際に、<br />
<textarea name="code" cols="50" rows="10" class="js">
$ id someone ;
uid=1001(someone) gid=1001(someone) groups=1001(someone),500(project),10(wheel)
</textarea><br />
というように 'someone' のプライマリグループとして 'someone' を設定する事がある。<br />
このようなポリシー、またはこのような 'someone' グループを User Private Group というらしい。<br />
<br />
なんか意味無くグループ増えるだけじゃん…と思って、ここ最近では避けるようにしていたんだけど、<br />
本日ようやく使いどころがわかった。<br />
</p>
<p>
プロジェクトチームでファイルを共有する場合、
<ol>
<li>同じグループ 'project' に 'someone1', 'someone2' が参加している状態にして、</li>
<li>共有したいファイルの所有グループを 'project' にし、</li>
<li>グループ読み書き権限を付与しておく</li>
</ol>
…というのは良くあるケースだと思う。<br />
2,3 を実現するためには、それぞれ、 setGID, umask(002) を使ったりする。
</p>
<p>
このようなケースで、<br />
User Private Group ポリシーを採用していない場合、つまり<br />
<textarea name="code" cols="50" rows="10" class="js">
$ id someone1 ;
uid=1001(someone1) gid=500(project) groups=500(project),10(wheel)
$ id someone2 ;
uid=1002(someone2) gid=500(project) groups=500(project),10(wheel)
</textarea><br />
のような場合、共有したくないファイルを作成するのが難しい。<br />
普通にファイルを作成するだけで someone1:project の所有物となり、<br />
umask(002) の効果で、自動的に project グループで共有されてしまう。
</p>
<p>
一方、User Private Group ポリシーを採用していれば、<br />
普通にファイルを作成した場合は、 someone1:someone1 の所有物となり誰とも共有されず、<br />
project グループで共有されるのは setGID されたディレクトリ内だけになる。
</p>
<p>
この違いが、重要な場合もあるだろう。<br />
例えば、共有レンタルサーバの管理とかする場合は必須だろうと思う。
</p>

# umask のほうをディレクトリ毎に設定するのも一案だが、その方法は、まだ知らない。
]]>
      
   </content>
</entry>
<entry>
   <title>Apollo 雑感</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2007/03/23-0029.html" />
   <id>tag:tonextone.com,2007:/type//1.14</id>
   
   <published>2007-03-22T15:29:16Z</published>
   <updated>2007-03-24T15:49:37Z</updated>
   
   <summary>Adobe Labs - Apollo 面白そうなので、HTML + JavaS...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="9" label="javascript" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="18" label="presentation" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="19" label="userinterface" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[<a href="http://labs.adobe.com/technologies/apollo/" target="_blank">Adobe Labs - Apollo</a>
面白そうなので、HTML + JavaScript + CSS なウィジェットを作ってみた。<br />
<br />
まずは普通に、HTML + JavaScript + CSS で、<br />
GoogleBase のデータを JSONP で展開して入力を補完するっていう単純なものを作った。<br />
<a href="http://tonextone.com/neta/GDataCompletions/" target="_blank">http://tonextone.com/neta/GDataCompletions/</a><br />
<br />
で、これをウィジェットにする。<br />
全く変更なしで、さくっとウィジェット化できた！<br />
<a href="http://tonextone.com/neta/GDataCompletions/GDataCompletions.air" target="_blank">http://tonextone.com/neta/GDataCompletions/GDataCompletions.air</a><br />
<br />
↑この .air ファイルの実体は zip 書庫で、<br />
展開すると、HTML, JavaScript, CSS がそっくり入っている。<br />
確か Konfabulator(現 Y! widget) も、こういう設計だったと思う。<br />
(今は違うみたいですね)<br />
<br />
端的に言えば、Apollo は、<br />
これまでもいろいろあった Flash 系、HTML 系ウィジェット実行環境を統合する、<br />
Yet Another なウィジェット実行環境、という印象。<br />
]]>
      
   </content>
</entry>
<entry>
   <title>Firebug Lite の console.*(); の出力が改行されて欲しい件。</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2006/12/08-1452.html" />
   <id>tag:tonextone.com,2006:/type//1.10</id>
   
   <published>2006-12-08T05:52:11Z</published>
   <updated>2006-12-25T07:35:32Z</updated>
   
   <summary>早速、IE で Firebug Lite を使ってみているのだけれど、 cons...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[早速、IE で <a href="http://www.getfirebug.com/lite.html" target="_blank">Firebug Lite</a> を使ってみているのだけれど、<br />
console.log(); などによる、コンソールへの出力が、改行されない。<br />
オシイ。とりあえず応急処置。<br />

<textarea name="code" class="js" cols="50" rows="10">
--- firebug.js  2006-12-08 14:43:38.750000000 +0900
+++ firebug_patched.js  2006-12-08 14:45:05.093750000 +0900
@@ -419,7 +419,7 @@
             }
             return "?";
         };
-        return String(value).replace(/[<>&"']/g, replaceChars);
+        return '<pre>' + String(value).replace(/[<>&"']/g, replaceChars) + '</pre>';
     }

     function objectToString(object)
</textarea><br />

追記: 12/25<br />
コメントでご連絡いただいた、
<a href="http://webos-goodies.jp/" target="_blank">WebOS Goodies</a>の歩行者さんによる <br />
<a href="http://webos-goodies.jp/archives/51017768.html" target="_blank">firebug Lite ブックマークレット</a>での修正箇所を参考に、以下のように変更した。<br />

<textarea name="code" class="js" cols="50" rows="10">
--- firebug.js  2006-12-25 15:11:05.750000000 +0900
+++ firebug_patched.js  2006-12-25 15:05:32.156250000 +0900
@@ -312,7 +312,7 @@
     {
         var row = consoleBody.ownerDocument.createElement("div");
         row.className = "logRow" + (className ? " logRow-"+className : "");
-        row.innerHTML = message.join("");
+        row.innerHTML = '<pre>' + message.join("") + '</pre>';
         appendRow(row);
     }

</textarea><br />

<a href="http://webos-goodies.jp/" target="_blank">WebOS Goodies</a>の歩行者さんは、
<blockquote>
var row = consoleBody.ownerDocument.createElement("pre");
</blockquote>
としているのだけど、<br />
これだと row.className に指定されているであろうスタイル等と干渉する気がしたので、<br />
innerHTML だけ、pre で囲んでみた。<br />
結果として IE6 でも改行反映された。]]>
      
   </content>
</entry>
<entry>
   <title>MT をもう少しちゃんと使ってみる。</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2006/12/03-0106.html" />
   <id>tag:tonextone.com,2006:/type//1.9</id>
   
   <published>2006-12-02T16:06:47Z</published>
   <updated>2006-12-02T23:22:46Z</updated>
   
   <summary>MT を使って何本かエントリを書いてみて: 本文中の改行の br タグへの変換が...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="おもう" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="3" label="movabletype" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[MT を使って何本かエントリを書いてみて:<br />
<ol>

<li>
本文中の改行の br タグへの変換が直感に反する。<br />
でも、そういうものとして定着してしまったのでしょう。<br />
郷に従います。<br />
</li>

<li>
サイドバーとかに表示させる、<br />
汎用性のある HTML のブロックを 'module' と呼び、<br />
その 'module' をまとめたものを 'widget' と呼ぶらしい。<br />
 'widget' 単位で管理することにした。<br />
</li>

</ol>
<br />
MT は、使い勝手よりも、カスタマイズの自由度が優先された、玄人向けの設計だと思う。<br />
それが、結局は、受け入れられたんだろうなぁ…と、いまさら思う。<br />
<br />
で、Vox は、そうじゃない市場向け、と。<br />
]]>
      
   </content>
</entry>
<entry>
   <title>svn 入門(その2)</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2006/11/30-1644.html" />
   <id>tag:tonextone.com,2006:/type//1.8</id>
   
   <published>2006-11-30T07:44:53Z</published>
   <updated>2007-12-12T15:55:51Z</updated>
   
   <summary>前エントリから続き。 前の構成では、衝突の解消がうまく扱えてなかったので、 「極...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="15" label="emacs" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="14" label="svn" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="13" label="versioning" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[前エントリから続き。<br />
<br />
前の構成では、衝突の解消がうまく扱えてなかったので、<br />
「極力フロントエンドで調整する」という方針にしたがって、<br />
フロントエンドを変えてみた。<br />
<br />
現在の構成は以下の通り、<br />
<ul>
 <li>Subversion 1.3.2 (cygwin 版)</li>
 <li><u>meadow 3.00 (based on GNU Emacs 22.0.90.1)</u></li>
 <li><u>vc-svn.el (FSF 版)</u></li>
</ul>
<br />
.emacs の変更などはほとんど必要なかったはずだが、結局いろいろいじった。<br />
使っていないのに JDE やら、ECB までも最新にした(汗)。<br />
<span style="color: #999999;">
#<br />
# meadow の変更点について、蛇足。<br />
# <br />
# MULE-UCS は使わない前提になったようなので、該当部分をコメントにした。<br />
# <br />
# ;;; (load "un-define");; unicode<br />
# ;;; (load "un-tools");; unicode<br />
# <br />
# <br />
# ファイルを dired バッファにドロップすると、そのディレクトリにコピーされる!<br />
# (meadow 2 系までは、ドロップしたファイルが開いていた)<br />
# で、undo すると、dired 上でだけ消えるが、実際は消えない。<br />
# 逆に dired からはドラッグできない(一方通行)。<br />
# ちょっとキモイので、前の挙動に戻す設定がきっとあるはず。<br />
# <br />
# <br />
# w32-symlinks( Windows のショートカットを良きに計らってくれるやつ)<br />
# が無効っぽくなってたけど、w32-symlinks.el のコメント読んだりして、<br />
# 結局 (load ) の前に (setq ) したら上手くいった。<br />
# <br />
# (setq w32-symlinks-handle-shortcuts t)<br />
# (load "w32-symlinks")<br />
#<br />
</span>
<br />
これで、vc 経由の svn が、満足できるレベルで使えるようになった。<br />]]>
      <![CDATA[<h3>◆ vc の基本操作</h3>

<dl>

 <dt>M-x vc-update</dt>
 <dd>=> <i>svn update</i><br />

  作業コピーに、最新のリビジョンでの変更を反映する。<br />
  ※ 現状の vc-svn.el では、 vc-update で<br />
  ※ レポジトリでのファイルの出没(追加 / 削除)までは追従できないようだ。<br />
  ※ つまりディレクトリの内容の変更は反映できないようだ。<br />
  ※ したがって svn update は必要。<br />

 </dd>

 <dt>
  M-x vc-next-action
  (あるいは C-x v v)
 </dt>
 <dd>=> <i>svn add, svn ci</i><br />

  状況に応じて、次のアクションを行う。<br />
  未追加ファイルなら、追加フラグ( vc-register )。<br />
  編集前なら、ロック。<br />
  編集後なら、チェックイン。<br />
  ※ svn では「ロックしない」ので、<br />
  ※ 編集前に v v しても、実質何も起こらない。<br />
  ※ 編集前に自動で vc-update されるとうれしいかもしれないが、されない。<br />

 </dd>

 <dt>
  M-x vc-merge
  (あるいは C-x v m)
 </dt>
 <dd>=> <i>svn merge</i><br />

  リビジョンの異なる作業コピーをマージする。<br />
  衝突(バックエンドが解消しきれない差分)があれば、<br />
  該当部分を衝突マークで囲む。<br />
  つまり閲覧中のファイルが書き換えられるわけだが、<br />
  emacs は通常、バッファを自動で再読み込みしないので注意。<br />
  (当然、*.mine, *.rA, *.rB というバックアップファイルもできる。)<br />

 </dd>

 <dt>M-x resolve-conflicts</dt>
 <dd>=> <i>svn resolved<br />
  　      …しているわけではないようだ。<br />
  　      *.mine, *.rA, *.rB みたいなファイルは自動削除されないので。
  　      </i><br />

  衝突の解消を ediff でステキに支援する(以下で図説)。<br />

 </dd>

 <dt>M-x vc-delete-file</dt>
 <dd>=> <i>svn delete</i><br />

  作業コピーに削除フラグをたてる。<br />
  ※ その後 svn ci でレポジトリに反映する必要がある。<br />

 </dd>

 <dt>M-x vc-rename-file</dt>
 <dd>=> <i>svn rename</i><br />

  作業コピーに削除フラグをたてて、別名で複製したものに追加フラグをたてる。<br />
  ※ その後 svn ci でレポジトリに反映する必要がある。<br />

 </dd>

</dl>
<br />
以下、work, work2 という 2 つの作業コピーで、衝突の解消を図説。<br />
<br />
▼オレンジ色でマークされている行を変更します。<br />
<img src="http://tonextone.com/type/start.png" width="649" height="544" /><br />
<br />
▼work で変更し、v v (チェックイン)。<br />
<img src="http://tonextone.com/type/checkin_from_work.png" width="649" height="544" /><br />
<br />
▼work2 でも同じところを変更し、v v (チェックイン)。<br />
<img src="http://tonextone.com/type/checkin_from_work2.png" width="649" height="544" /><br />
<br />
▼work2 のチェックインは失敗(work のチェックインによって、レポジトリのリビジョンが更新されているため)。<br />
マージが必要。<br />
<img src="http://tonextone.com/type/conflict.png" width="649" height="544" /><br />
<br />
▼work2 で、v m (マージ)。衝突した。<br />
<img src="http://tonextone.com/type/merge.png" width="649" height="544" /><br />
<br />
▼M-x vc-resolve-conflicts (衝突の解消)。<br />
<img src="http://tonextone.com/type/resolve.png" width="649" height="544" /><br />
<br />
▼衝突を解消して、*.mine, *.rA, *.rB とかのファイルを削除して、改めてチェックイン。<br />
(ここでは、敢えて「衝突しない変更」を加えてみたが、無事チェックインできた。)<br />
<img src="http://tonextone.com/type/resolved.png" width="649" height="544" /><br />
<br />
▼work のほうに戻って、M-x vc-update (アップデート)。<br />
上で加えた「衝突しない変更」も、更新された。<br />
<img src="http://tonextone.com/type/update.png" width="649" height="544" /><br />
<br />
こんな感じで良いんだろうか?<br />
<br />
<h3>◆ vc のここが便利(emacsen ユーザにとって)</h3>

<h4>その1. <b>v v, v m</b></h4>
　日常的には、v v 、たまに v m だけで済みそう。<br />
<br />
<h4>その2. <b>ediff の支援</b></h4>
　ediff は 3 年ほど使ってるので、ありがたい。<br />
<br />
<h4>その3. <b>vc dired</b></h4>
　emacs で複数のファイルを一覧したり一括操作したい場合、<br />
emacs 上のファイラーである dired(ディレクトリエディタ)を使うんだけど、<br />
vc では dired に vc の機能を追加した、vc dired モードを使える。<br />
基本的に、diredo と同様の操作方法で、マーク(m)したファイルを対象に一括操作する。<br />
<br />
<table border="1">
 <caption>
  vc の機能のキー操作の比較
 </caption>
 <thead>
  <tr>
   <th>機能</th>
   <th>通常のファイルバッファ</th>
   <th>vc dired バッファ</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <th>詳細/簡易表示のトグル</th>
   <td>なし</td>
   <td>v t</td>
  </tr>
  <tr>
   <th>'next-action'</th>
   <td>C-x v v</td>
   <td>v v</td>
  </tr>
  <tr>
   <th>マージ</th>
   <td>C-x v m</td>
   <td>v m</td>
  </tr>
  <tr>
   <th>ログ閲覧</th>
   <td>C-x v l</td>
   <td>v l</td>
  </tr>
  <tr>
   <th colspan="3">
    以下、同様。
   </th>
  </tr>
 </tbody>
</table>
<br />
<br />
とりあえず、そんな感じ。<br />]]>
   </content>
</entry>
<entry>
   <title>svn 入門</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2006/11/16-1708.html" />
   <id>tag:tonextone.com,2006:/type//1.7</id>
   
   <published>2006-11-16T08:08:28Z</published>
   <updated>2007-06-18T07:08:40Z</updated>
   
   <summary>   運用中の最新ファイルでローカルの作業コピーを更新    emacs(mea...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="15" label="emacs" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="14" label="svn" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="13" label="versioning" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="16" label="文字コード" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[<ol>
  <li>運用中の最新ファイルでローカルの作業コピーを更新</li>
  <li> emacs(meadow) で編集</li>
  <li> ediff で差分確認</li>
  <li>更新</li>
</ol>
<br />
というのを手作業で繰り返すのはもうイヤだ。<br />
いい加減バージョン管理システムが必要だ。<br />
<br />
つーわけで、Subversion にスムーズに移行すべく調査、検討した。<br />]]>
      <![CDATA[現在の構成は以下の通り、<br />
<ul>
  <li>Subversion 1.3.2 (cygwin 版)</li>
  <li>meadow 2.10 (based on GNU Emacs 21.4.1)</li>
  <li>vc-svn.el (Jim Blandy 版)</li>
</ul>
<br />
方針として、極力フロントエンドで調整する。<br />
バックエンドの設定項目にも、ざっと目を通しておくけど、デフォルト前提で。<br />

<h3>◆ Subversion </h3>
cygwin の setup.exe でインストール。<br />
いつのまにか、~/.subversion/ ができている。<br />
/.subversion/ 以下のファイルでいろいろ設定できるので、要チェック。<br />
参考: <a href="http://subversion.bluegate.org/doc/book.html#svn.advanced.confarea.opts">http://subversion.bluegate.org/doc/book.html#svn.advanced.confarea.opts</a> <br />
<br />
今回は、とりあえず、日本語でログ書けるように設定した。<br />
<textarea name="code" class="ruby" cols="50" rows="6">
[miscellany]
log-encoding = UTF-8
enable-auto-props = yes

[auto-props]
* = svn:eol-style=CRLF
</textarea><br />
このあと、emacs の設定で utf-8-dos をデフォルトにするので、これで良い。<br />
<br />
ついでに、locale も UTF-8 に合わせないと端末でログなどの表示が化ける。<br />
<textarea name="code" class="ruby" cols="50" rows="7">
# ja_JP.utf8 とか、それっぽいのを探す。
locale -a | grep jp;
# .bash_profile に以下を追加、または修正。
export LC_ALL=ja_JP.utf8;
export LANG=ja_JP.utf8;
# 反映。
source .bash_profile;
</textarea><br />
<br />
svnadmin, svn のメモ:<br />
<textarea name="code" class="ruby" cols="50" rows="30">
cd /home/master/;
mkdir -p ./svn_test/work/;

# レポジトリを作る。
svnadmin create \
--config-dir ~/.subversion/ \
--fs-type fsfs \
/home/master/svn_test/REPOSITORY/;

# /path/to/source/ からレポジトリへインポート。
svn import \
--config-dir ~/.subversion/ \
--message 'start' \
/path/to/source/ \
file:///home/master/svn_test/REPOSITORY/;

# レポジトリから作業コピーへチェックアウト。
svn checkout \
--config-dir ~/.subversion/ \
--revision 'HEAD' \
file:///home/master/svn_test/REPOSITORY/ \
/home/master/svn_test/work/;

# 困ったら…
svnadmin help;
svn help;
</textarea><br />
<br />
<h3>◆ emacs の日本語の扱いを調整</h3>
久しぶりに、 .emacs を整理した。<br />
meadow なので、sjis-dos デフォルトで無問題だったんだけど、<br />
Subversion は UTF-8 前提だし、まー今後の事も考えて、<br />
utf-8-dos をデフォルトに変更した。<br />
(ただし Windows なら、入力と出力だけは、japanese-shift-jis-dos ですよと)<br />
<br />
以下、日本語環境部分を .emacs より抜粋。<br />
<textarea name="code" class="xml" cols="50" rows="50">
;;;;;;;;;;;;;;;;;;;;;;
;;; 日本語環境設定 ;;;
;;;;;;;;;;;;;;;;;;;;;;
(load "un-define");; unicode
(load "un-tools");; unicode
(load "jisx0213");; unicode
;;; ↑これらを↓これより先に書く。
(set-language-environment "Japanese")
(prefer-coding-system 'utf-8-dos)
;;;
;;; 言語環境を日本語にすると Meadow は自動的に次のように設定するらしい。
;;; (set-clipboard-coding-system 'japanese-shift-jis-dos)
;;; (set-w32-system-coding-system 'japanese-shift-jis-dos)
;;; (setq default-file-name-coding-system 'japanese-shift-jis)
;;; (set-default-coding-systems 'japanese-shift-jis-dos)
;;;
;;; さらに、set-default-coding-systems で次のように設定される。
;;; (setq-default buffer-file-coding-system 'japanese-shift-jis-dos)
;;; (setq default-file-name-coding-system 'japanese-shift-jis-dos)
;;; (setq default-terminal-coding-system 'japanese-shift-jis-dos)
;;; (setq default-keyboard-coding-system 'japanese-shift-jis-dos)
;;; (setq default-process-coding-system '(japanese-shift-jis-dos . japanese-shift-jis-dos))
;;;

(set-default-coding-systems 'utf-8-dos)                      ;; default
;;; (set-keyboard-coding-system 'japanese-shift-jis-dos)         ;; IN
;;; (set-terminal-coding-system 'japanese-shift-jis-dos)         ;; OUT
(setq default-keyboard-coding-system 'japanese-shift-jis-dos);; IN    (default)
(setq default-terminal-coding-system 'japanese-shift-jis-dos);; OUT   (default)
(setq default-buffer-file-coding-system 'utf-8-dos)          ;; buffer(default)
;;; (setq-default buffer-file-coding-system 'utf-8-dos)          ;; buffer(default)

(set-w32-system-coding-system 'japanese-shift-jis-dos)
(set-clipboard-coding-system 'japanese-shift-jis-dos)
(setq default-file-name-coding-system 'japanese-shift-jis)
(setq default-process-coding-system '(utf-8-dos . utf-8-dos))

(mw32-ime-initialize)
(setq default-input-method "MW32-IME")
</textarea><br />
<br />
しかし、<br />
(setq default-buffer-file-coding-system '...)<br />
とか、<br />
(setq-default buffer-file-coding-system '...)<br />
とか、<br />
(set-default-buffer-file-coding-system '...)<br />
とか、紛らわしいので勘弁して欲しい。<br />
<br />
ちなみに、<br />
「PuTTY 上の emacs」と meadow のモードラインの違いを、始めてちゃんと見た。<br />
<blockquote>
…文字端末を使っている場合、csは3文字になり、それぞれ、<br />
キーボード入力のコーディングシステム、<br />
画面出力のコーディングシステム、<br />
編集中のファイルのコーディングシステムです。<br />
</blockquote>
、だそうです。<br />
参考: <a href="http://www.bookshelf.jp/texi/emacs-20.6-man-jp/emacs_4.html#SEC11">http://www.bookshelf.jp/texi/emacs-20.6-man-jp/emacs_4.html#SEC11
</a><br />
このおかげで、<br />
<ul>
<li>keyboard-coding-system</li>
<li>terminal-coding-system</li>
<li>buffer-file-coding-system</li>
</ul>
という 3 つのパラメータを意識したら気のせいかスッキリした。<br />
<br />
あと、何となく Customize とかで設定しちゃってた部分とバッティングして苦労した。<br />
<br />
<h3>◆ vc-svn </h3>
vc-svn を入手。Subversion のソースツリーの中の、/contrib/client-side/vc-svn.el です。<br />
vc は標準でバンドルされてるので、vc-svn.el を load-path に置いて、
<textarea name="code" class="xml" cols="50" rows="1">
(add-to-list 'vc-handled-backends 'SVN)
</textarea><br />
って書くだけで良い。<br />
<br />
以降、 vc 経由で cygwin の svn が呼ばれる。<br />
<br />
vc のメモ:<br />
参考: <a href="http://www.bookshelf.jp/texi/emacs-20.6-man-jp/emacs_15.html#SEC118">http://www.bookshelf.jp/texi/emacs-20.6-man-jp/emacs_15.html#SEC118</a><br /> 
チェックアウト、チェックイン、追加は、<br />
<textarea name="code" class="xml" cols="50" rows="1">
C-x v v
</textarea><br />
コレだけ(!)で済む。<br />
衝突したら、vc-merge( C-x vm ), vc-resolve-conflicts とかするんだと思う(あとで試す)。<br />
困ったら、<br />
<textarea name="code" class="xml" cols="50" rows="2">
C-h a (or M-x apropos-command)
vc-(Enter)
</textarea><br />
で、調べる。<br />
<br />
<h3>◆ linux とかではどうなの?</h3>
emacs の設定さえ頑張れば、linux でも問題ない(ように見える)。<br />
<br />
<h3>◆宿題</h3>
<ul>
  <li> vc で削除ってどうやるの?</li>
  <li>
    M-x ediff-revision
    で差分が見れるけど、<br />
    vc-merge, vc-resolve-conflicts<br /> 
    と、どう絡んでくれるか?<br />
    上手く絡んで欲しい。ediff 最強。
  </li>
  <li>
    ログの書き込みは問題ないが、<br />
    locale を UTF-8 に合わせないと表示が化ける。<br />
    だけど、cygwin の locale は腐っている。ﾀｽｹﾃ。
  </li>
  <li>
    実は TortoiseSVN も入れているんだけど、<br />
    cygwin のパスが Windows 的に素直じゃないので、<br />
    共有とか難しいんだろうか?<br />
    それ以前の問題として、Subversion のバージョンが違うので、<br />
    レポジトリとかのフォーマットが互換性が無い模様。しばらく様子見。
  </li>
</ul>]]>
   </content>
</entry>
<entry>
   <title>JSONP / JSONScriptRequest</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2006/09/18-1440.html" />
   <id>tag:tonextone.com,2006:/type//1.5</id>
   
   <published>2006-09-18T05:40:45Z</published>
   <updated>2006-12-02T23:22:02Z</updated>
   
   <summary>最近 JSONP って呼ばれているものは: 1. JavaScript で sc...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="9" label="javascript" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[最近 JSONP って呼ばれているものは:<br />
<br />
<dl>
<dt>1. JavaScript で script タグを生成する。</dt>
<dd>
<textarea name="code" class="xml" cols="50" rows="1">
<script src="/foo.cgi?callback=showResult&args=..."></script>
</textarea><br />
この例の場合は、script タグが生成されたタイミングで、<br />
<textarea name="code" class="xml" cols="50" rows="1">
/foo.cgi?callback=showResult&args=...
</textarea><br />
がリクエストされ、リクエスト変数に応じた動的な結果が返ってくる。
</dd>
<dt>2. 結果は JSON で返す。</dt>
<dd>
<textarea name="code" class="js" cols="50" rows="1">
{ results: [ {name: 'hoge'}, {name: 'fuga'}, ... ] }
</textarea><br />
</dd>
<dt>3. どうせなら…という事で、コールバック関数で wrap して返す。</dt>
<dd>
<textarea name="code" class="js" cols="50" rows="1">
showResult({ results: [ {name: 'hoge'}, {name: 'fuga'}, ... ] });
</textarea><br />
</dd>
</dl>
<br />
…で、showResult は別途実装…という一連の考え方のようだ。<br />
XMLHttpRequest になぞらえて JSONScriptRequest と呼ばれたりもしている。 <br />]]>
      <![CDATA[ここでの革新(核心)は、1,3 であって 2 ではない。<br />
XMLHttpRequest 使わないで、Ajax するっていう部分が重要なのであって、<br />
XMLHttpRequest の「XML」と同様、JSONScriptRequest の「JSON」も大して重要でない。<br /> 
<br />
なので、JSONP っていうネーミングには、あまり感心しない。<br />
<br />
私は昔、Google suggest で遊んでいたのだけれど、実はあれも JSONP 的に使える。<br />
<a href="http://www.google.co.jp/complete/search?hl=ja&js=true&qu=test">http://www.google.co.jp/complete/search?hl=ja&js=true&qu=test</a>
<br />
それに、XMLHttpRequest の場合でも、<br />
サーバクライアント間のデータは JSON でやり取りしたほうが便利だと思う。<br />
<br />
例えば、以下のような JSON を リクエスト変数に突っ込んで、XMLHttpRequest する。<br />
<br />
<textarea name="code" class="js" cols="50" rows="11">
{
  "_requests":
  {
    "action": "fetch",
    "param1":
    {
      "key1": "value1",
      "key2": "value2"
    }
  }
}
</textarea><br />
<br />
結果も、 同様の形式で以下のように返す。<br />
<textarea name="code" class="js" cols="50" rows="16">
{
  "_requests":
  {
    "action": "fetch",
    "param1":
    {
      "key1": "value1",
      "key2": "value2"
    }
  },
  "_responses":
  {
    "_result_set": [...],
    "_MESSAGE": null
  }
}
</textarea><br />
とか。<br />
<br />
いろいろ似たようなテクニックが出てくると、<br />
どれが良いとか悪いとか、(もしかしたら不毛な)議論に煩わされかねない。<br />
テクニックを駆使しているつもりで逆に使われてしまわないように、気をつけたい。<br />]]>
   </content>
</entry>
<entry>
   <title>XMLHttpRequest と セッション</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2006/08/29-2047.html" />
   <id>tag:tonextone.com,2006:/type//1.4</id>
   
   <published>2006-08-29T11:47:14Z</published>
   <updated>2006-12-02T23:21:51Z</updated>
   
   <summary>PHP におけるセッション管理では、 $_GET ではなく、$_POST でもな...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="10" label="ajax" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="9" label="javascript" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="12" label="security" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="11" label="session" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[PHP におけるセッション管理では、<br />
$_GET ではなく、$_POST でもなく、$_COOKIE からセッションID を受け取り、<br />
さらに、$_COOKIE 以外で半券(チケット)を受け取って、<br />
セッションID と照合して正当性を確かめるのが定石だ。<br />
<br />
1. $_COOKIE による受け取りが必要な理由:<br />
<blockquote>
1.1 悪意の第三者は、あなたのリクエストに含まれる $_GET, $_POST を、自由自在に変更する罠を作れる。<br />
1.2 PHP ではリクエスト変数($_GET, $_POST, $_COOKIE)によってセッションID を指定できる。<br />
</blockquote>
<br />
したがって、<br />
$_GET, $_POST でセッションIDを受け取るようなシステムでは、<br /> 
悪意の第三者が仕掛けた罠によって、<br />
悪意の第三者が指定したセッションID で、<br />
あなたのセッションが開始される可能性がある。<br />
<br />
2. $_COOKIE 以外での半券の受け取りが必要な理由:<br />
<blockquote>
2.1 悪意の第三者は、あなたのリクエストに含まれる $_GET, $_POST を、自由自在に変更する罠を作れる。<br />
2.2 ブラウザは、リクエストの際に、ドメイン・パスが一致する Cookie を、自動的に付加する。<br />
</blockquote>
<br />
したがって、<br />
半券による照合のないシステムでは、<br />
$_COOKIE だけでセッションが再開してしまい、<br />
悪意の第三者が仕掛けた罠によって、<br />
悪意の $_GET, $_POST が、あなたのセッションに混入する可能性がある。<br />]]>
      <![CDATA[さて、最近は、XMLHttpRequest を使った、所謂 Ajax がアチコチで活用されているが、<br />
get, post, cookie を上記のように駆使する事の有意性に何ら変わりない。<br />
<br />
主要なブラウザの XMLHttpRequest では、<br />
ちゃんと cookie が送信されるようなので、問題なし。<br />
半券は、高木式を採用し、JavaScript で cookie を読んで、<br />
XMLHttpRequest に追加して送信する。<br />
<br />
ここまでは問題ない。<br />
<br />
問題は、さらにワンタイムセッションを導入している場合だ。<br />
<blockquote>
【前提】リクエスト毎にセッションID を変更している。<br />
</blockquote>
ユーザの1クリックをトリガーとして、<br />
複数の XMLHttpRequest を連続して実行する場合もある。<br />
(例えば、データ登録フォームと登録済データ一覧とが、同一ページにある場合など)<br />
そういう場合、当然、cookie も XMLHttpRequest の数だけ送信される。<br />
<br />
通常の同期通信では、リクエスト毎に逐次セッションID が変わって無問題なのだが、<br />
非同期の XMLHttpRequest では、非同期であるが故か? どうもそうならない。<br />
<br />
送信内容を監視してみると、<br />
連続する XMLHttpRequest の間 cookie の値(セッションID)が変わらない。<br />
しかし、サーバ側では、最初のリクエストの時点でセッションID は切り替わっている。<br />
つまり、途中でセッションが切れている?<br />
<br />
というか、実は、<br />
クライアント側には cookie が、<br />
サーバ側にはセッションデータ(及び、その抜け殻)がウジャウジャ出来て、<br />
挙動がつかみきれなくて、イヤになった。<br />
<br />
ひとつだけ言える事は、<br />
上記【前提】を見直したほうが良さそうだということ。<br />
Ajax 使わないセッションならリクエスト毎にセッションID を変更してもまぁ良いかと思っているけど、<br />
Ajax 使うと、1つのブラウザから非同期でリクエストがあるわけだから、<br />
リクエスト毎よりはユーザのアクション毎とか、あるいはタイマーでセッションID 変えるほうが賢いかもしれない。<br />]]>
   </content>
</entry>
<entry>
   <title>VMWarePlayer で FreeBSD 5.5</title>
   <link rel="alternate" type="text/html" href="http://tonextone.com/type/2006/08/29-0000.html" />
   <id>tag:tonextone.com,2006:/type//1.3</id>
   
   <published>2006-08-28T15:00:00Z</published>
   <updated>2006-12-02T23:21:40Z</updated>
   
   <summary>ムチャしても良い開発専用サーバが自宅に欲しくなったので、 ちょうど手近に空いてい...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="やりくりする" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="5" label="VMware" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="7" label="coLinux" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="8" label="開発環境" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://tonextone.com/type/">
      <![CDATA[ムチャしても良い開発専用サーバが自宅に欲しくなったので、<br />
ちょうど手近に空いていた PC<br />
(3年以上前に買って、一回故障した ThinkPad R40 ,Win XP 入り)<br />
に、仮想開発サーバを導入した。<br />
<br />
最初は、coLinux を試したが、ネットワーク接続などの設定が面倒なのと、<br />
自宅の無線 LAN に、普通に参加させるのが難し(無理?)そうだったので、<br />
結局、VMWarePlayer にした。<br />]]>
      <![CDATA[<a href="http://nhh.mo-blog.jp/ttt/2005/11/vmware_freebsd__743b.html" target="_blank">http://nhh.mo-blog.jp/ttt/2005/11/vmware_freebsd__743b.html</a><br />
を大いに参考させていただきました。ありがとうございます。<br />
<br />
大まかな流れ:
<ol>
<li>hoge.vmdk (ディスクイメージ)を作成。</li>
<li>hoge.vmx (設定)を作成。</li>
<li>OS をインストール。</li>
</ol>
<br />
今回は、ISO イメージファイルから OS をインストールしたかったので、<br />
ISO イメージファイルが CD-ROM として認識されるように vmx ファイルを調整し、<br />
VM が起動しはじめた直後に、BIOS に入って、ブートデバイスを選択した。<br />
<br />
[<a href="http://tonextone.com/type/2006/08/29/FreeBSD_5.5-RELEASE-i386.vmx" target="_blank"> 作成した vmx ファイル</a>]<br />
<br />
# BIOS に入るのが難しかった。<br />
# ホスト OS 側に、マウスのフォーカスがある状態では、VM のほうの制御はできない。<br />
# まず、VM の窓の中をクリックして、それから、'F2' などを押す必要がある。<br />
<br />
ネットワークの設定も簡単で、<br />
Bridged、NAT、Host-only の 3 種類のうち、Bridged を選択し、<br />
「普通に」 DHCP で無線 LAN に参加させた。<br />
<br />
というわけで、この仮想自宅サーバでは、<br />
版管理(Subversion,svk), Perl(catalyst, sledge) などを試しまくる予定です。<br />]]>
   </content>
</entry>

</feed>
