<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>BLOG</title>
    <link>http://www.tom-gs.com/blog/</link>
    <description></description>
    <!-- optional tags -->
    <language>ja</language>           <!-- valid langugae goes here -->
    <generator>Nucleus CMS v3.41</generator>
    <copyright>ｩ</copyright>             <!-- Copyright notice -->
    <category>Weblog</category>
    <docs>http://backend.userland.com/rss</docs>
    <image>
      <url>http://www.tom-gs.com/blog//nucleus/nucleus2.gif</url>
      <title>BLOG</title>
      <link>http://www.tom-gs.com/blog/</link>
    </image>
    <item>
 <title><![CDATA[ウェブベースのMySQLアドミニストレーションツール「SQL Buddy」]]></title>
 <link>http://www.tom-gs.com/blog/index.php?itemid=255</link>
<description><![CDATA[<p>
	<a href="http://www.phpmyadmin.net/home_page/index.php" target="_blank">phpMyAdmin</a>が有名ですが、他にも<a href="http://www.mysqlquickadmin.com/" target="_blank">MySQL Quick Adminと</a>いうのや<a href="http://www.flashmyadmin.org/original/flashmyadmin.org.php" target="_blank">FlashMyAdmin</a>がありますが、軽量なMySQL Quick Adminがなんかダウンロードできなかったので、他のを探してみると<a href="http://www.sqlbuddy.com/" target="_blank">SQL Buddy</a>というのがありました。</p>
<p>
	phpMyAdminほど高機能ではありませんが、軽量で基本的な機能はすべて備えているので、SQLレベルで困ることはないと思います。しかも、日本語には100%対応しています。</p>
<p>
	インターフェースも今では当たり前のモーダルウィンドウやアコーディオンメニュー、テーブルのスプレッド表示にはデータ部分だけスクロールするように見やすくなっているのは、嬉しい限りです。phpMyAdminとかに、こんな機能があればいいなって思います。</p>
<p>
	でも、データの作成フォームのインターフェースにもう少し工夫できる余地があるのではないかと思います。</p>
<p>
	しかし、これらのインターフェースを実現しているのがJavaScript、まさかとは思いましたが<a href="http://mootools.net/" target="_blank">Mootools</a>が使用されていました。やはり、こういったインターフェースを提供するのはMootoolsがいいんですかね。確かにこれをjQueryでって選択は私もしないと思いますけど。Mootools使いとしてはちょっと嬉しい現実です。</p>
]]></description>
 <category>WEB、WEBシステム関連</category>
<comments>http://www.tom-gs.com/blog/index.php?itemid=255</comments>
 <pubDate>Sun, 5 Sep 2010 22:59:01 +0900</pubDate>
</item><item>
 <title><![CDATA[TinyMCEにCKFinderを実装する（完全版？）]]></title>
 <link>http://www.tom-gs.com/blog/index.php?itemid=254</link>
<description><![CDATA[<p>
	<a href="http://www.tom-gs.com/blog/index.php?itemid=235">以前、ブログに書いたこと</a>だけど、半年振りに見直してみた。<br />
	CKFinderも新しいバージョンに変えて、コードを見直してみて、できるようになったので、その方法を紹介。</p>
<p>
	まずなぜ、前回できなかったのか。<br />
	それは、TinyMCE中心に構築していたからだ。ファイルブラウザを開く仕組みはTinyMCEで提供されている方法を使用していた。もう一度記述するが、それは以下の通り。</p>
<p>
	まずTinyMCEの初期化オプションで、callback用の関数名を指定する。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">tinyMCE.init({
    ・・・

    file_browser_callback : &#39;ckfinder&#39;,
  
    ・・・
});
</pre>
<p>
	で、次のようなCKFinderの起動に関する処理を書いていた。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">function ckfinder(field_name, url, type, win){
    var cmsURL = &quot;/tinymce/examples/ckfinder/ckfinder.html&quot;;
    var searchString = &quot;?&quot;;

    // Overwrite variable that CKFinder can read
    switch (type) {
        case &quot;file&quot;:
            type = &quot;Files&quot;;
            break;
        case &quot;media&quot;:
            type = &quot;Flash&quot;;
            break;
        case &quot;image&quot;:
            type = &quot;Images&quot;;
            break;
        defaul:
            type = &quot;&quot;;
            break;
    }

    // Create request parameters
    var query = &quot;&quot;;
    if (type.length &gt; 0){
        query = searchString + &quot;Type=&quot; + type;
    }

    // newer writing style of the TinyMCE developers for tinyMCE.openWindow
    tinyMCE.activeEditor.windowManager.open({
        file           : cmsURL + query,
        title          : &quot;CKFinder&quot;,
        width          : 800,
        height         : 400,
        close_previous : &quot;no&quot;
    }, {
        window : win,
        input  : field_name
    });
    return false;
}
</pre>
<p>
	これが間違い。実はこの29行のコードは必要なかった。では実際の実装方法に入ってみよう。</p>
<p>
	まずは上記のTinyMCEの初期化の前にCKFinderのJavaScriptを読み込んでおく。ファイルの配置は前の記事と同じ。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">&lt;script type=&quot;text/javascript&quot; src=&quot;./ckfinder/ckfinder.js&quot;&gt;&lt;/script&gt;
</pre>
<p>
	で、同じようにTinyMCEの初期化オプションを記述する。もちろんcallback用の関数も忘れずに！<br />
	そして、そのcallbak関数を記述するのだが、それは以下のようになる。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">function ckfinder(field_name, url, type, win){
    var finder = new CKFinder();
    finder.basePath = &#39;/ckfinder/&#39;;
    finder.selectActionData = &#39;src&#39;;
    finder.selectActionFunction = function(fileUrl, data) {
        window.parent.document.getElementById(&#39;mce_31_ifr&#39;).contentWindow.document.getElementById(data[&#39;selectActionData&#39;]).value = fileUrl;
    }
    finder.popup();
}
</pre>
<p>
	20行も減って、たった9行になってしまった。<br />
	実はこれが「TinyMCE中心に構築していた」の逆で、こちらはCKFinderの公式で紹介されている記述方法になっている。</p>
<p>
	CKFinderオブジェクトを生成して、basePathを設定します。<br />
	そしてselectActionDataで、画像パスをセットする要素のID属性値を指定する。<br />
	selectActionFunctionは、CKFinder上のファイルをダブルクリックしたときに実行する処理を無名関数で記述しておく。この内容だが、図を見てもらうとわかるように、TinyMCEの画像ダイアログは結構込み入っている。ので、こんな書き方になってしまう。<br />
	data[&#39;selectActionData&#39;]にはselectActionDataで指定した値が入ってくる。</p>
<p style="text-align: center;">
	<a href="/blog/media/blog/20100812002b.png" rel="lightbox"><img alt="" height="169" src="/blog/media/blog/20100812002a.png" width="300" /><br />
	</a></p>
<p>
	これでできた！ と思ったけど、動きが怪しいかも。でも前よりはうまく動く。たぶん大丈夫なはずだ！</p>
]]></description>
 <category>WEB、WEBシステム関連</category>
<comments>http://www.tom-gs.com/blog/index.php?itemid=254</comments>
 <pubDate>Thu, 12 Aug 2010 03:06:09 +0900</pubDate>
</item><item>
 <title><![CDATA[CKFinderバージョンアップ]]></title>
 <link>http://www.tom-gs.com/blog/index.php?itemid=253</link>
<description><![CDATA[<p>
	見ないうちにCKFinderが少しバージョンアップしていたので、私が使っているNucleusとJoomla!のCKFinderもバージョンアップしてみた。<br />
	そこで、設定を見直して結構大丈夫な感じにしたので記録。</p>
<p style="text-align: center;">
	<a href="/blog/media/blog/20100812001b.png" rel="lightbox"><img alt="" height="186" src="/blog/media/blog/20100812001a.png" width="300" /></a></p>
<p>
	CKFinderの設定で一番困るのが、config.phpの$baseUrl。ここにはサイトのルートとなるディレクトリを記述する。<br />
	たとえば、http://www.example.com/mysite/なら、以下のようになる。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">$baseUrl = &#39;/mysite/&#39;;
</pre>
<p>
	私のローカルのVMではサブディレクトリに自分のサイトを設置しているので、本番に持っていくとパスがあわなくなる。<br />
	だから、これを自動で生成するようにしてみた。<br />
	設定については<a href="http://www.tom-gs.com/blog/index.php?itemid=228">前にこのブログで紹介した</a>ので、ここまでできていれば後は1行書き換えればいい。</p>
<p>
	いろいろ相対パスとかがんばってみたけど、全然使えないみたいなので、$baseUrlの部分は以下のようにする。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">$baseUrl = str_replace($_SERVER[&#39;DOCUMENT_ROOT&#39;], &#39;&#39;, $DIR_MEDIA);
</pre>
<p>
	これで問題ないみたい。</p>
]]></description>
 <category>WEB、WEBシステム関連</category>
<comments>http://www.tom-gs.com/blog/index.php?itemid=253</comments>
 <pubDate>Thu, 12 Aug 2010 00:53:09 +0900</pubDate>
</item><item>
 <title><![CDATA[Mootoolsで作るTwitterプラグイン]]></title>
 <link>http://www.tom-gs.com/blog/index.php?itemid=252</link>
<description><![CDATA[<p>
	jQueryとかはあるんですけど、Mootoolsベースでいいやつってあんまりないんですよね。ってことで、とあるコードを参考に作ってみました。</p>
<p>
	まぁ割とそれっぽく作りました。</p>
<p>
	@の制御とかはひとまずおいておいて、ツイートをとってきて新しいものが上に挿入されるようにする。で、作ったはいいんですけど、配布するには少々よくないつくりになっているので、公開するなら、整理してからになります。</p>
<p>
	よくある自動スクロールとかはなく、完全に垂れ流す感じです。一応ツイート4つまでとか制限が付けれます。</p>
<p>
	まぁ機会があればお見せします。</p>
]]></description>
 <category>WEB、WEBシステム関連</category>
<comments>http://www.tom-gs.com/blog/index.php?itemid=252</comments>
 <pubDate>Tue, 13 Jul 2010 00:07:03 +0900</pubDate>
</item><item>
 <title><![CDATA[MySQLの直観的な使用～OracleやPostgreSQLで困ること]]></title>
 <link>http://www.tom-gs.com/blog/index.php?itemid=251</link>
<description><![CDATA[<p>
	MySQLのイケてない仕様だの、いろいろあるもののやはり今の主流には変わりない。<br />
	私も仕事で使うのはMySQLが比率的に8割ぐらいとなっている。<br />
	ほかはOracleやPostgreSQL。DB2やSQL Serverは使ったことすらない。</p>
<p>
	で、まぁウェブで主流の3大DBベンダーを使っててふと気付いた小さいことだけど、物理名（列別名や表別名）ってそれぞれのベンダーで違う。<br />
	たとえば、Oracleでは次のSQLは列別名はすべて英大文字になってしまう。<br />
	対して、PostgreSQLではすべて小文字になってしまう。<br />
	MySQLはそのままの形で返してくれる。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">SELECT col1 AS name, col2 AS ADDRESS FROM sample_table;

-- Oracleの場合
col1 AS name &gt;&gt; NAME
col2 AS ADDRESS &gt;&gt; ADDRESS

-- PostgreSQLの場合
col1 AS name &gt;&gt; name
col2 AS ADDRESS &gt;&gt; address

-- MySQLの場合
col1 AS name &gt;&gt; name
col2 AS ADDRESS &gt;&gt; ADDRESS
</pre>
<p>
	これはプログラムなんかで扱う場合は非常に困る。<br />
	一応これは回避策があって、別名を引用符で囲むことでその通り表示される。ちなみにスペースも入れられる。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">SELECT col1 AS &#39;name&#39;, col2 AS &#39;ADDRESS 1&#39; FROM sample_table;
</pre>]]></description>
 <category>WEB、WEBシステム関連</category>
<comments>http://www.tom-gs.com/blog/index.php?itemid=251</comments>
 <pubDate>Fri, 2 Jul 2010 17:35:20 +0900</pubDate>
</item><item>
 <title><![CDATA[MySQLのイケてない仕様 - トランザクション編]]></title>
 <link>http://www.tom-gs.com/blog/index.php?itemid=250</link>
<description><![CDATA[<p>
	前回に続きMySQLのイケてない仕様を紹介。<br />
	今回はトランザクション。DBをよく使う肩ならご存知かと思う。<br />
	トランザクションとはシステムの分野では、「分ける事の出来ない一連の情報処理の単位」とWikipediaに書いてある。</p>
<p>
	たとえば、DBテーブルにデータを追加しようとする。<br />
	すると次のプロセスが同じようにデータを書き込んでしまうと、ひとつ前に追加したデータを何らかの理由ですぐに元に戻したいときに特定できなくなってしまう。</p>
<p>
	トランザクションという仕組みを使うと、データを追加（INSERT）したり、変更（UPDATE）したり、削除（DELETE）したりするSQLの結果を、明示的に確定（COMMIT）しない限り反映されないし、トランザクション中の変更は元に戻す（ROLLBACK）ことができる。<br />
	これは非常に重要な機能で、何万件ものデータを取り扱うときには取り返しが付かなくなる前にとりあえず元に戻すこともできる。</p>
<p>
	老舗のOracleをはじめPostgreSQLなどは、INSERTやUPDATE、DELETEを実行すると自動的にトランザクションが開始され、COMMITがROLLBACKが実行されるまで維持される。</p>
<p>
	この仕様がDBでは一般的なはずだが、MySQLではそれがない。正確にはトランザクション自体は存在する。</p>
<p>
	MySQLではそのまま、INSERT、UPDATE、DELETEを実行するとデータは確定されてしまう。これをAUTOCOMMIT（自動コミット）というらしい。<br />
	MySQLではトランザクションを実行する際は明示的にトランザクションの開始を実行しなければならない。</p>
<p>
	参考URL　<a href="http://dev.mysql.com/doc/refman/4.1/ja/commit.html" target="_blank">http://dev.mysql.com/doc/refman/4.1/ja/commit.html</a></p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">START TRANSACTION;
-- または（どちらも同じ）
BEGIN;
</pre>
<p>
	トランザクションの終了はもちろんCOMMITかROLLBACK。<br />
	だからプログラムで書くときはこれを忘れがちなので、気をつけよう。</p>
<p>
	この仕様はOracleみたいに自動的にトランザクションを開始するように変更できる。つまり自動コミットをOFFにできる。</p>
<p>
	SQLレベルでやるなら以下の方法。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">-- 現在の設定値を確認（0：自動コミットOFF　1：自動コミットON）
SELECT @@autocommit;

-- 自動コミットをOFFに設定
SET AUTOCOMMIT = 0;
</pre>
<p>
	ちなみにmy.cnfにも記述できるみたいだ。</p>
<p>
	参考URL　<a href="http://open-groove.net/mysql/autocommit/" target="_blank">OpenGroove - MySQLのAUTOCOMMIT（オートコミット）覚え書き</a></p>
<p>
	っていうか、何でなんでしょうね。<br />
	Oracleに買収されたからこの辺も変わってくるのかな？</p>
]]></description>
 <category>WEB、WEBシステム関連</category>
<comments>http://www.tom-gs.com/blog/index.php?itemid=250</comments>
 <pubDate>Fri, 11 Jun 2010 01:52:25 +0900</pubDate>
</item><item>
 <title><![CDATA[MySQLのイケてない仕様 - VARCHAR編]]></title>
 <link>http://www.tom-gs.com/blog/index.php?itemid=249</link>
<description><![CDATA[<p>
	今日、MySQLは「LAMP」という言葉が示すように非常にその存在感は強い。<br />
	高速性が売りだったり、オープンソースということもあいまって非常に人気のあるベンダーのひとつだ。</p>
<p>
	今も今後も、ウェブシステムはMySQLが主流になるだろう。<br />
	個人的にはSun Micro SystemsがOracleに買収され、さらにDBベンダーのOracleがMySQLを買収して、そのオープン性が失われやしないかが心配だ。<br />
	また、MySQLがさらにOracleに近い仕様へバージョンアップするのではという期待もあったりする。</p>
<p>
	今回の問題はこの人気のMySQLのイケてない仕様について。<br />
	普通に使っていては気づかない、とてもマニアックな仕様ともいえるが、これが結構ハマるんではないだろうか。<br />
	皆さんは知っているかな？</p>
<h3 style="border-bottom: 1px dotted rgb(51, 51, 51); color: rgb(51, 51, 51); font-size: 15px; font-weight: bold; margin: 1.5em 0pt -5px;">
	文字列型は英大文字・小文字を区別しない。</h3>
<p>
	参考URL <a href="http://homepage.mac.com/kurusaki/iblog/C1305251996/E138576755/index.html" target="_blank">http://homepage.mac.com/kurusaki/iblog/C1305251996/E138576755/index.html</a></p>
<p>
	どういうことかわかるだろうか？<br />
	実はVARCHAR型などの文字列型はデフォルトでは英字の大文字・小文字を判別するような仕様になっていない。だがデータ的には大文字・小文字はそのまま出力される。<br />
	たとえば条件句に「WHERE data = &#39;abcdef&#39;」としたとする。この条件ではdataというフィールドに格納されている「abcdef」はもちろん、「ABCDEF」や「Abcdef」、「abCdEf」といったデータも条件対象になってしまう。<br />
	感覚的には「WHERE data = &#39;abcdef&#39;」は「abcdef」にしかヒットしないと考えるがデフォルトはそうでない。</p>
<p>
	これを回避する方法はいくつかあるが、CREATE TABLEの段階で回避できていたほうがいいだろう。</p>
<p>
	それにはフィールドにBINARY属性を付与する。たとえば以下のような書き方になる。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">CREATE TABLE sample_table (
  id SERIAL,
  char1 VARCHAR(120),
  char2 VARCHAR(120) <span style="color: rgb(255, 0, 0);">BINARY</span>,
  modified_date TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  INDEX char1_index (char1),
  INDEX char2_index (char2)
) ENGINE=InnoDB CHARACTER SET &#39;utf8&#39;;
</pre>
<p>
	この例ではフィールドchar1は大文字・小文字を区別しない、フィールドchar2は区別することになる。ちなみにBINARY属性を使用しなかった場合でも、条件に指定して精度を高めることができる。実際にデータをいくつか投入してみて確認してほしい。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">INSERT INTO sample_table (char1, char2) VALUES
(&#39;test&#39;, &#39;test&#39;),(&#39;TEST&#39;, &#39;TEST&#39;),(&#39;tEST&#39;, &#39;tEST&#39;),(&#39;Test&#39;, &#39;Test&#39;);

-- 1.取得件数は4件
SELECT * FROM sample_table WHERE char1 = &#39;TEST&#39;;

-- 2.取得件数は1件（条件で処理する場合）
SELECT * FROM sample_table WHERE BINARY char1 = &#39;TEST&#39;;

-- 3.取得件数は1件
SELECT * FROM sample_table WHERE char2 = &#39;TEST&#39;;
</pre>
<p>
	ちなみにどちらのフィールドにもインデックスを張っているが、2のSELECT文のように条件でBINARY指定しちゃうとインデックスは効かないみたい。<br />
	explainの結果の見方は以下のサイトを参考に。「type」が「ALL」はフルテーブルスキャン。インデックス使わないので、VARCHAR型のフィールドにインデックス張る場合やもちろんデータ件数が多くなることが予想され、このフィールドを条件対象にする場合は、CREATE TABLEで指定しておくのが必須でだろう。</p>
<p>
	参考サイト　<a href="http://nippondanji.blogspot.com/2009/03/mysqlexplain.html" target="_blank">漢(オトコ)のコンピュータ道　MySQLの EXPLAINを徹底解説!!</a></p>
<p>
	&nbsp;</p>
<table border="1" cellpadding="1" cellspacing="1">
	<tbody>
		<tr>
			<th bgcolor="#cccc99">
				<span style="font-size: 10px;">id</span></th>
			<th bgcolor="#cccc99">
				<span style="font-size: 10px;">select_type</span></th>
			<th bgcolor="#cccc99">
				<span style="font-size: 10px;">table</span></th>
			<th bgcolor="#cccc99">
				<span style="font-size: 10px;">type</span></th>
			<th bgcolor="#cccc99">
				<span style="font-size: 10px;">possible_keys</span></th>
			<th bgcolor="#cccc99">
				<span style="font-size: 10px;">key</span></th>
			<th bgcolor="#cccc99">
				<span style="font-size: 10px;">key_len</span></th>
			<th bgcolor="#cccc99">
				<span style="font-size: 10px;">ref</span></th>
			<th bgcolor="#cccc99">
				<span style="font-size: 10px;">rows</span></th>
			<th bgcolor="#cccc99">
				<span style="font-size: 10px;">Extra</span></th>
		</tr>
		<tr>
			<td colspan="10">
				<span style="font-size: 10px;"><strong>explain SELECT * FROM sample_table WHERE char1 = &#39;TEST&#39;;</strong></span></td>
		</tr>
		<tr>
			<td>
				<span style="font-size: 10px;">1</span></td>
			<td>
				<span style="font-size: 10px;">SIMPLE</span></td>
			<td>
				<span style="font-size: 10px;">sample_teble</span></td>
			<td>
				<span style="font-size: 10px;">ref</span></td>
			<td>
				<span style="font-size: 10px;">char1_index</span></td>
			<td>
				<span style="font-size: 10px;">char1_index</span></td>
			<td>
				<span style="font-size: 10px;">363</span></td>
			<td>
				<span style="font-size: 10px;">const</span></td>
			<td>
				<span style="font-size: 10px;">2</span></td>
			<td>
				<span style="font-size: 10px;">Using where</span></td>
		</tr>
		<tr>
			<td colspan="10">
				<span style="font-size: 10px;"><strong>explain SELECT * FROM sample_table WHERE BINARY char1 = &#39;TEST&#39;;</strong></span></td>
		</tr>
		<tr>
			<td>
				<span style="font-size: 10px;">1</span></td>
			<td>
				<span style="font-size: 10px;">SIMPLE</span></td>
			<td>
				<span style="font-size: 10px;">sample_teble</span></td>
			<td>
				<span style="font-size: 10px;">ALL</span></td>
			<td>
				<span style="font-size: 10px;"><br />
				</span></td>
			<td>
				<span style="font-size: 10px;"><br />
				</span></td>
			<td>
				<span style="font-size: 10px;"><br />
				</span></td>
			<td>
				<span style="font-size: 10px;"><br />
				</span></td>
			<td>
				<span style="font-size: 10px;">4</span></td>
			<td>
				<span style="font-size: 10px;">Using where</span></td>
		</tr>
		<tr>
			<td colspan="10">
				<span style="font-size: 10px;"><strong>explain SELECT * FROM sample_table WHERE char2 = &#39;TEST&#39;;<br />
				</strong></span></td>
		</tr>
		<tr>
			<td>
				<span style="font-size: 10px;">1</span></td>
			<td>
				<span style="font-size: 10px;">SIMPLE</span></td>
			<td>
				<span style="font-size: 10px;">sample_teble</span></td>
			<td>
				<span style="font-size: 10px;">ref</span></td>
			<td>
				<span style="font-size: 10px;">char2_index</span></td>
			<td>
				<span style="font-size: 10px;">char2_index</span></td>
			<td>
				<span style="font-size: 10px;">363</span></td>
			<td>
				<span style="font-size: 10px;">const</span></td>
			<td>
				<span style="font-size: 10px;">1</span></td>
			<td>
				<span style="font-size: 10px;">Using where</span></td>
		</tr>
	</tbody>
</table>
<p>
	当然ながらOracleやPostgreSQLといったものはデフォルトで大文字・小文字は区別してくれる。</p>
<p>
	ちなみにphpMyAdminで見てみると、ちゃんと書いてくれていた・・・。</p>
<p style="text-align: center;">
	<img alt="" height="105" src="/blog/media/blog/20100609001.png" width="400" /></p>
]]></description>
 <category>WEB、WEBシステム関連</category>
<comments>http://www.tom-gs.com/blog/index.php?itemid=249</comments>
 <pubDate>Wed, 9 Jun 2010 01:50:59 +0900</pubDate>
</item><item>
 <title><![CDATA[Gvimの設定（まあまあLinux版に近づいてきた）]]></title>
 <link>http://www.tom-gs.com/blog/index.php?itemid=248</link>
<description><![CDATA[<p>
	最近はWindowsのGvimで作業するようにしている。効率は上がらないけど、Linux操作するときの勉強にもなるし、使い慣れれば効率的な作業もできるはずなので、とりあえずがんばってみてる。ただ、記号やコマンドっぽいキーをとことん間違えて打っているのでさらに効率は上がっていないので、本当の意味でのキーボードの練習にもなっている。</p>
<p>
	今回はこのWindows版のVim、「Gvim」をLinux版のようにする設定のまとめ。</p>
<p>
	とにかくC:\Program Files\Vim\_gvimrcの設定内容。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">&quot; vi互換をOFF
set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim

&quot; UTF-8対応設定
set fileencoding=utf-8
set fileencodings=utf-8,sjis,iso-2022-jp

&quot; ファイルフォーマット
set fileformat=unix

&quot; ステータスバーの表示フォーマット
set statusline=%F%m%r%h%w\%=[TYPE=%Y]\[FORMAT=%{&amp;ff}]\[ENC=%{&amp;fileencoding}]\[LOW=%l/%L]

&quot;カラープロファイルを設定
colorscheme Slate

&quot;行番号を設定
set number

&quot;バックグラウンドの色を設定
set background=dark

&quot;右端での改行しない
set nowrap

&quot;スクロール量を設定
set sidescroll=1

&quot;フォントとフォントサイズの設定
set guifont=ＭＳ_ゴシック:h9

&quot;ウィンドウの高さ（行数）の設定
set lines=50

&quot;ウィンドウの幅（文字数）の設定
set columns=150

&quot; スワップファイルを作成しない
set noswapfile

&quot; バックアップファイルを作成しない
set nobackup

&quot; タブやインデントの設定
set tabstop=4
set softtabstop=4
set shiftwidth=4
set autoindent
set smartindent
set noexpandtab

&quot; IMEの設定
set iminsert=0

&quot; Ctrl+Vの挙動を変更
nmap &lt;C-v&gt; &lt;C-v&gt;
cmap &lt;C-v&gt; &lt;C-v&gt;
</pre>
<p>
	地味に苦労したのが、Ctrl+Vの設定。Ctrl+Vは通常Vimでは矩形ビジュアルモードで、矩形選択が可能になるとっても便利なもの。プログラムで処理をコメントアウトするときに使うので、使えないと困る。</p>
<p>
	が、WindowsではCtrl+Vはクリップボードデータの貼り付けなので、競合している。実際は貼り付けとして動いてしまう。設定の最後nmapとcmapを設定しておくと、Gvimでのキーマッピングを変更できる。</p>
<p>
	この場合、コマンドモードの際は矩形ビジュアルモードに、挿入モードのときは貼り付けになる。</p>
<p>
	最初はこの設定がうまくいかなかったが、設定の一番最後に書くとうまくいく。</p>
]]></description>
 <category>コンピュータ</category>
<comments>http://www.tom-gs.com/blog/index.php?itemid=248</comments>
 <pubDate>Thu, 3 Jun 2010 01:10:58 +0900</pubDate>
</item><item>
 <title><![CDATA[その年がうるう年かどうかを判定する式]]></title>
 <link>http://www.tom-gs.com/blog/index.php?itemid=247</link>
<description><![CDATA[<p>
	プログラマでは割と当たり前なのかな？　私は学生のとき、プログラムの勉強をしたときに習った。</p>
<p>
	うるう年は4年一度という周期で訪れる。これをアルゴリズムで分析すると、こんな簡単な式になってしまう。<br />
	&nbsp;</p>
<p>
	うるう年を判定する条件は以下の通り。</p>
<ul>
	<li>
		<strong>その年数を400で割ったときのあまりが0または4で割ったときのあまりが0、かつ100でわったあまりが0でないものはうるう年である。</strong></li>
</ul>
<p>
	この法則を元にうるう年を判定するプログラムを作ってみる。たとえばPHPの関数なら以下の通り。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">function is_leap($year) {
    return $year % 400 == 0 || $year % 4 == 0 &amp;&amp; $year % 100 != 0;
}
</pre>
<p>
	でもPHPには実はうるう年かどうかを判定する仕組みが用意されている。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">$timestamp = strtotime(&#39;2010-06-02 00:00:00&#39;);
$is_leap = date(&#39;L&#39;, $timestamp); // うるう年なら1、それ以外は0
</pre>
<p>
	date()関数の第1引数に「L」を指定するとうるう年の場合は1、それ以外は0が返ってくる。</p>
<p>
	なぜ真偽値でないか。真偽値でないほうが使い安かったりする。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">/**
 * うるう年を判定する
 * @param $year
 * @return Integer 0 or 1
 */
function is_leap($year) {
    // date()関数を使う場合
    $timestamp = strtotime($year . &#39;-01-01 00:00:00&#39;);
    return date(&#39;L&#39;, $timestamp);

    // 式を使う場合
    return ($year % 400 == 0 || $year % 4 == 0 &amp;&amp; $year % 100 != 0) ? 1 : 0;
}

/**
 * 月の日数を求める
 * @param $year
 * @param $month
 * @return Integer
 */
function get_day_of_month($year, $month) {
    switch ($month) {
        case  1:
        case  3:
        case  5:
        case  7:
        case  8:
        case 10:
        case 12:
            return 31;
            break;
        case  4:
        case  6:
        case  9:
        case 11:
            return 30;
            break;
        case 2:
            return 28 + is_leap($year);
            break;
        default:
            return null;
            break;
    }
}
</pre>
<p>
	0か1を返すことで、2月のときのみ28に返り値を足し算することで、うるう年の場合の2月の日数を求めることができる。まさに一石二鳥！</p>
]]></description>
 <category>コンピュータ</category>
<comments>http://www.tom-gs.com/blog/index.php?itemid=247</comments>
 <pubDate>Wed, 2 Jun 2010 02:25:52 +0900</pubDate>
</item><item>
 <title><![CDATA[CygwinからSSHログインするためのシェル]]></title>
 <link>http://www.tom-gs.com/blog/index.php?itemid=246</link>
<description><![CDATA[<p>
	あまりよろしくないことだが、Cygwinを使ってログインを省略するためのシェルを作ってみた。</p>
<p>
	具体的にはputclipというCygwinに用意されたクリップボードへコピーするための仕組みを使う。これでパスワードをクリップボードにコピーしといて、sloginコマンドを実行させておいて、パスワードを聞かれたらCtrl+Insertで貼り付けでログイン。パスワードをクリップボードに記憶してしまうので、セキュリティは低い。</p>
<p>
	Cygwinのhomeディレクトリにremoteというディレクトリを作ってみた。そこにconnect.shを作成した。内容は以下の通り。作成後はパーミッションに気をつけること！</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">#!/bin/bash

cd `dirname $0`

SERVER=$1
ACCOUNT_SET=$2
ACCOUNT_SET_LIST=./.account_list

while read i;
do
        FIELD1=`echo $i | cut -f1 -d&#39; &#39;`
        if test &quot;$FIELD1&quot; = &quot;$ACCOUNT_SET&quot;
        then
                USERNAME=`echo $i | cut -f2 -d&#39; &#39;`
                PASSWORD=`echo $i | cut -f3 -d&#39; &#39;`
                PORT=`echo $i | cut -f4 -d&#39; &#39;`
                break
        fi     
done &lt; $ACCOUNT_SET_LIST

if test &quot;$PORT&quot; = &quot;&quot;
then
        PORT=22
fi

echo $PASSWORD | putclip
slogin -p $PORT $USERNAME@$SERVER
</pre>
<p>
	7行目の.account_listというファイルを作る。これはアカウントセット（名前）、ユーザー名、パスワード、ポート番号をスペース区切りで記述したテキストファイル。たとえばこんな感じ。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">websvr1 webmaster webmaster_password 22
websvr2 webmaster 123456
dbsvr1 dbmaster abcdefg 1022
</pre>
<p>
	で実際はそれぞれのサーバー用のシェルを作成する。たとえば以下の内容のファイルをwebsvr1という名前で作っておく。作成後はパーミッションに気をつけておくこと！</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;">cd `dirname $0`
./connect.sh websvr.yourdomain.com websvr2
</pre>
<p>
	ログインの際はこのシェルをたたくと、.account_listからアカウントセットを拾ってきて、sloginコマンドを作ってパスワードをクリップボードにコピーする。</p>
<p>
	だから使い方はこんな感じ。</p>
<pre style="background: none repeat scroll 0% 0% rgb(228, 239, 252); border-left: 5px solid rgb(124, 177, 237); color: rgb(23, 92, 169); font-family: ｍｓ ゴシック; font-size: 12px; padding: 5px 10px;"># ./remote/websvr1
</pre>
<p>
	かなり説明を省略しているので、スクリプトはがんばって読んでね。</p>
]]></description>
 <category>コンピュータ</category>
<comments>http://www.tom-gs.com/blog/index.php?itemid=246</comments>
 <pubDate>Tue, 1 Jun 2010 03:07:06 +0900</pubDate>
</item>
  </channel>
</rss>