<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>DQNEO起業日記</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/" />
    <link rel="self" type="application/atom+xml" href="http://dqn.sakusakutto.jp/atom.xml" />
    <id>tag:dqn.sakusakutto.jp,2010-06-14://5</id>
    <updated>2012-05-20T01:19:42Z</updated>
    <subtitle>ど素人プログラマの挑戦。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 5.14</generator>

<entry>
    <title>Subversion1.7をソースからコンパイルしてインストールする方法</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/05/subversion17_configure_make_install.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.653</id>

    <published>2012-05-19T22:48:10Z</published>
    <updated>2012-05-20T01:19:42Z</updated>

    <summary>CentOS 5.3 (x86_64)にSubversion1.7をインストール...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="CentOS" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Linux" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Subversion" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[CentOS 5.3 (x86_64)にSubversion1.7をインストールする方法を紹介します。<br />
<br />
svn 1.7からはワーキングコピーの管理方法とHTTP通信のパフォーマンスが大幅に改善されて、いろんな作業が高速になります。<br />
<br />
実はコンパイルに苦労して半日かかりました。<br />
この手順どおりにやればすんなりいけると思います。


]]>
        <![CDATA[<h4>openldap-develをインストール</h4>

<pre><code>sudo yum install openldap-devel</code></pre>

openldap-develを入れずにsubversionをmakeすると、下記のようなエラーが出ます。

<pre><code>/usr/bin/ld: skipping incompatible /usr/lib/libldap.so when searching for -lldap
/usr/bin/ld: skipping incompatible /usr/lib/libldap.a when searching for -lldap
/usr/bin/ld: cannot find -lldap
collect2: ld returned 1 exit status
make: *** [subversion/libsvn_subr/libsvn_subr-1.la] Error 1</code></pre>

<a href="http://q.hatena.ne.jp/1337423880">CentOS5.3でSubversion1.7.5をconfigure & makeしたらエラーが出ました</a>

<h4>neonをコンパイル＆インストール</h4>

最新のneonをインストールしておきましょう。<br />
<br />
<a href="http://www.webdav.org/neon/">http://www.webdav.org/neon/</a><br />
<pre><code>wget http://www.webdav.org/neon/neon-0.29.6.tar.gz
tar xvfz neon-0.29.6.tar.gz
cd neon-0.29.6
./configure --with-ssl
make
sudo make install</code></pre>

これを入れないと、httpプロトコルでの通信ができないです。<br />


<h4>subversion1.7とsqlite 3071200のソースコードを取得</h4>

<pre><code>wget http://www.sqlite.org/sqlite-amalgamation-3071200.zip
wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/subversion/subversion-1.7.5.tar.gz
tar xvfz subversion-1.7.5.tar.gz
unzip sqlite-amalgamation-3071200.zip</code></pre>

ダウンロードして解凍したら、sqliteをsubversionディレクトリの中に移動します。

<pre><code>mv sqlite-amalgamation-3071200 subversion-1.7.5/sqlite-amalgamation</code></pre>

<h4>subversion1.7.5をコンパイル＆インストール</h4>
やっと準備完了です。


<pre><code>cd subversion-1.7.5
./configure --with-neon --with-ssl
make
</code></pre>

makeが成功したら、生成されたバイナリをたたいてバージョンを確認します。

<pre><code>$ subversion/svn/svn --version

svn, version 1.7.5 (r1336830)
   compiled May 20 2012, 07:29:05

Copyright (C) 2012 The Apache Software Foundation.
This software consists of contributions made by many people; see the NOTICE
file for more information.
Subversion is open source software, see http://subversion.apache.org/

The following repository access (RA) modules are available:

* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.
  - handles 'http' scheme
  - handles 'https' scheme
* ra_svn : Module for accessing a repository using the svn network protocol.
  - handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
  - handles 'file' scheme</code></pre>

バージョンが1.7.5、そしてra_neonモジュールがちゃんと組み込まれています！<br />
<br />
動作確認します。
<pre><code>$ subversion/svn/svn log https://path/to/repo/trunk --limit 10</code></pre>
これでログがちゃんと表示されたらOKです。<br />
<br />
ではインストール！
<pre><code>sudo make install</code></pre>

デフォルトでは/usr/local/bin/svnにインストールされます。
<pre><code>/usr/local/bin/svn --version
/usr/local/bin/svn log https://path/to/repo/trunk --limit 10</code></pre>

しばらく触ってみて、問題なければyumのsvnをアンインストールしましょう。

<pre><code>sudo yum remove subversion</code></pre>


<h4>感想</h4>
svnコマンドの動作がめちゃ速くなりました。<br />
svn 1.6では妙なもっさり感がありましたが、svn1.7は本当にきびきび動きます。<br />
特に、svn stの結果が一瞬で表示されるのがありがたいです。<br />
<br />
これで開発がサクサク進むこと間違いなし！<br />

<h4>注意点</h4>
svn 1.7.5で、svn switchのバグに遭遇しました。

<pre><code>svn: E235000: In file 'subversion/libsvn_wc/update_editor.c' line 1583:
 assertion failed (action == svn_wc_conflict_action_edit ||
 action == svn_wc_conflict_action_delete || action == svn_wc_conflict_action_replace)</code></pre>

このバグのようです。<br />

<a href="http://subversion.tigris.org/issues/show_bug.cgi?id=4160">http://subversion.tigris.org/issues/show_bug.cgi?id=4160</a><br />
<br />
この辺に解決策がありそうですがまだ解決できていません。。。<br />
<br />
<a href="http://mail-archives.apache.org/mod_mbox/subversion-users/201201.mbox/%3CCANphOYZLKK+zWD3YN4gsQmyso=t2a1=1eN4=ctMY145g4ArqzQ@mail.gmail.com%3E">http://mail-archives.apache.org/mod_mbox/subversion-users/201201.mbox/%3CCANphOYZLKK+zWD3YN4gsQmyso=t2a1=1eN4=ctMY145g4ArqzQ@mail.gmail.com%3E</a><br />
<a href="http://mail-archives.apache.org/mod_mbox/subversion-users/201204.mbox/%3CC79A20B4A4F1F44697084B7FEAA08E131E4EEE@DubExch.intunetech.local%3E">http://mail-archives.apache.org/mod_mbox/subversion-users/201204.mbox/%3CC79A20B4A4F1F44697084B7FEAA08E131E4EEE@DubExch.intunetech.local%3E</a>

<a href="http://grokbase.com/p/subversion/users/124jj29tq0/svn-e235000-error-when-performin-a-svn-switch-with-svn-1-7-4">http://grokbase.com/p/subversion/users/124jj29tq0/svn-e235000-error-when-performin-a-svn-switch-with-svn-1-7-4</a>]]>
    </content>
</entry>

<entry>
    <title>稼働中のサーバでApacheの再インストールをしたら死んだ</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/05/svn-apache- listening-sockets-available.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.652</id>

    <published>2012-05-18T17:38:59Z</published>
    <updated>2012-05-18T19:00:50Z</updated>

    <summary>当たり前ですがこんなことは絶対にやってはいけません。 これは私のアホな体験談です...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="Apache" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Subversion" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[当たり前ですがこんなことは絶対にやってはいけません。<br />
<br />
これは私のアホな体験談です。<br />
他山の石としていただければ幸いです。

]]>
        <![CDATA[<h4>SVNをバージョンアップしようとしたら、Apacheが再インストールされた</h4>

そもそもApacheを再インストールつもりなどは毛頭ありませんでした。<br />
私がやりたかったのはただsvnコマンドのバージョンアップ(1.6 → 1.7)でした。<br />
<br />
svnクライアントを1.7にすると、.svnディレクトリが１個になったりHTTP通信が高速化されたりその他いろいろメリットがあるという話を聞いたので、下記の自分の記事を参考しながらチャレンジしてみたのです。
<br />
<a href="http://dqn.sakusakutto.jp/2012/05/centos6-subversion17.html">CentOS6にSubversion1.7をインストールする方法</a><br />
<br />
これが悲劇の始まりでした。<br />
<br />
<a href="http://www.wandisco.com/">wandisco.com</a>のサイトでメールアドレスや氏名を登録して、インストーラを落としてきてさあ実行！

<pre><code># bash svn1.7_centos5_wandisco.sh
WANdisco Subversion Installer for CentOS 5
Please report bugs or feature suggestions to opensource@wandisco.com

Gathering some information about your system...
CentOS release 5.3 (Final)
CentOS version 5.x confirmed..
Checking your system arch
Installing for x86_64
Checking to see if you already have Subversion installed via rpm...
Subversion is not currently installed
Starting installation, are you sure you wish to continue?
[y/n]</code></pre>
勢いよく [y] <br />
<br />
ずらずらとsubversionのインストールがはじまります。<br />
次に、<br />

<pre><code>Would you like to install apache HTTPD and the apache SVN modules?
[y/n]

(訳)「apacheとsvnモジュールのインストールをしますか？」
</code></pre>

ここは当然 [n]と答えるべきところですが、<br />
<strong>なんと手元が誤って [y]を押して</strong>しまいました。<br />
<br />
おもむろにApacheの再インストールが始まってしまい、インストール完了と同時にhttpdデーモンが停止。<br />
しゅん。。<br />
<br />
まあ止めてしまったものはしょうがない。<br />
┐(´ー｀)┌<br />
気を取り直してapacheを起動しよう。<br />

<pre><code># /etc/init.d/httpd start
httpd を起動中: [Sat May 19 01:39:47 2012] [warn] module ssl_module is already loaded, skipping
(98)Address already in use: make_sock: could not bind to address [::]:443
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:443
no listening sockets available, shutting down
Unable to open logs
                                                           <strong style="color:red;">[失敗]</strong></code></pre>

(　ﾟдﾟ)<br />

<br />
<strong>Apacheが起動しない！</strong><br />
<h5>Address already in use: make_sock: could not bind to address</h5>
エラーメッセージでぐぐってみると、「<a href="http://gihyo.jp/admin/serial/01/unix/0006">他のプロセスがそのポートを占有してる</a>」「lsofコマンドで調査」などの解説がありそのとおりにやってみました。<br />
しかし、443ポートが他のプロセスに奪われてる気配はありませんでした。<br />
<br />
小一時間格闘したあげく、この記事にめぐりあいました。<br />

<a href="http://blog.livedoor.jp/leaf_hiro/archives/51105888.html">Linuxに使われる日々 : apacheのポートにハマる - livedoor Blog（ブログ）</a><br />

もしかしてhttpd.confの設定ミス？？<br />
<br />
grepで検索してみる。<br />

<pre><code># grep 443 /etc/httpd/conf/httpd.conf
Listen 443

#grep 443  /etc/httpd/conf.d/*.conf
/etc/httpd/conf.d/ssl.conf:Listen 443
</code></pre>
(つд⊂)ｺﾞｼｺﾞｼ<br />
<br />
(((((((( ；ﾟДﾟ)))))))<br />
<br />
<strong>２つあるやんけ</strong><br />
<br />
なんとListen 443の記述が２か所にあります！
<br />
片方を消して再起動したら起動できました。<br />
<br />
そもそもssl.confを置いた覚えがなかったので目を疑いました。<br />
Apacheの再インストールの際に勝手に入ってしまったようです。<br />
<br />
<h5>まとめ</h5>
<br />
<ul>
	<li>稼働中のサーバでApacheの再インストールをしたら死ぬ</li>
	<li>yum(rpm)の芋づる式インストールに注意</li>
	<li>Listenの記述が２箇所あると起動しない</li>
</ul>


<h4>おまけ</h4>
svnコマンドのバージョンアップ(1.7へ)が当初の目的だったので、最終的にそれが達成されてればいいやと思って確認したら、

<pre><code>$ svn --version
svn, <strong style="color:red;">バージョン 1.6.11</strong> (r934486)
   コンパイル日時: May 14 2012, 05:36:18</code></pre>
<br />
死にたい。<br />
<br />
]]>
    </content>
</entry>

<entry>
    <title>subversion(svn)で、過去ログのauthorを一気に変更するワンライナー</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/05/subversion-svn-log-author.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.651</id>

    <published>2012-05-17T19:20:38Z</published>
    <updated>2012-05-18T08:10:30Z</updated>

    <summary>subversionの過去のコミットログのsvn:authorについて、ある人の...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="Subversion" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[subversionの過去のコミットログのsvn:authorについて、ある人の名前だけを一気に置換するワンライナーを紹介します。<br />
<br />
例えば、のび太とジャイアンがsubversionで共同開発していて、<br />
リビジョン10000まで行ったところでジャイアンが<br />
「おまえのコミットはおれのコミット」<br />
と過去ログのauthorを書き換えるという暴挙に出たとします。<br />
<br />
このとき、ジャイアンが打つべきコマンドはこれです。

<code><pre>svn log -q /tmp/svnlog
grep nobita /tmp/svnlog | awk '{print $1}' | sed s/r// | while read line ;do ;  svn ps --revprop -r $line  svn:author gian  $REPO ;  done</pre><code>

ワンライナーと言いながら２行のコマンドになってしまいました。<br />
何かのお役にたてば幸いです。


]]>
        
    </content>
</entry>

<entry>
    <title>[HTML5]世界一インストールが簡単なWikiをリリースしました。 #jswikimini</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/05/jswikimini2-localstorage-javascript.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.650</id>

    <published>2012-05-13T07:30:32Z</published>
    <updated>2012-05-19T02:54:18Z</updated>

    <summary>世界一インストールが簡単(で奇妙)なWikiシステム「JSWikiMini2」 ...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[<h4>世界一インストールが簡単(で奇妙)なWikiシステム「JSWikiMini2」</h4>

(タイトルは若干釣り気味ですがまんざら嘘でもないと思います。)<br />
JSWikiMini2をリリースしました。<br />
<br />
<a target="_blank" href="http://dqn.sakusakutto.jp/files/jswikimini2/">JSWikiMini2</a><br />
<br />
YuiwikiminiのJavaScript実装です。<br />
<h5>たった１個のHTMLファイルで動く</h5>
特徴は、世界一インストールが簡単なことです。<br />
なぜかというと "index.html" ファイルただ１個で動くからです。<br />

奇妙なことに、Webサーバがなくても動きますし、Webサーバ上にアップしても動きます。<br />
Webサーバがない場合は、PCにダウンロードしてオフライン環境で使うことができます。<br />
<br />
IE以外のブラウザ(Firefox, Google Chrome,Safari, iPhone, iPad)をお使いの場合は、上記リンクでデモを触ることができます。<br />
ぜひ遊んでみてください。<br />

]]>
        <![CDATA[<h4>IE6,7,8,9, Firefox, Google Chrome, iPhone, iPadで動く！(たぶんAndroidも)</h4>

このシステムは非常に奇妙なアーキテクチャで、いろんなプラットフォームで動きます。<br />
プラットフォームごとに動作モデルが異なります。(ここが奇妙な点です。)

<h5>IE6,7,8,9で動かす場合</h5>
<br />
PCローカルにHTMLファイルをダウンロードして、それをIEで開いてください。<br />
(セキュリティレベルを下げる必要があるかもしれません。自己責任でお願いします。)<br />
<br />
IEでの動作モデルは前作 <a href="http://dqn.sakusakutto.jp/2009/08/yukiwikiminijscript.html">JSWikiMini</a> と同じです。<br />
データはテキストファイルとしてPC内に保存されます。<br />
<br />
USBメモリや共有フォルダに置いて使うこともできます。<br />
(逆に、Webサーバ上に置いた場合は使えません)<br />
<br />
windows環境では、一種のネイティブアプリとして振る舞います。<br />
この仕組みはActiveXObjectというWinddows98時代からある古い仕組みです。<br />
<br />

<h5>Firefox,Google Chrome, Safariで動かす場合</h5>
<br />
PCローカルにHTMLファイルをダウンロードしてオフラインで動かすこともできますし、<br />
サーバ上のHTMLファイルにブラウザでアクセスして使うこともできます。<br />
<br />
どちらの場合もデータはローカル(localStorage)に保存されます。<br />
<br />
Mac OS X 10.7.4 のSafari、Firefox、Google Chrome でも動作するとの報告をいただきました。<br />

<h5>iPhone, iPad で動かす場合</h5>
<br />
サーバ上のHTMLファイルにアクセスして使います。<br />
データはローカル(localStorage)に保存されます。

<h4>これを作ったきっかけ</h4>
もともと <a href="http://www.tiddlywiki.com/">tiddlywiki</a> というのを見て、ローカルWikiに興味を持ちました。<br />
<a href="http://www.hyuki.com/yukiwiki/mini/">Yukiwikimini</a> をローカルで動くようにしたのが前作 <a href="http://dqn.sakusakutto.jp/2009/08/yukiwikiminijscript.html">JSWikimini</a>(IE限定)です。<br />
今回、<a href="http://dqn.sakusakutto.jp/2012/05/html5-firefox-localstorage-localfile.html">Firefoxのfile://なページでlocalStorage</a>が動くようになったので、HTML5/localStorage機能を実装してみました。


<h4>ご意見・ご感想をお待ちしております。</h4>
ハッシュタグ <a href="https://twitter.com/#!/search/%23jswikimini">#jswikimini</a> にてご意見募集中です！<br />
MacとAndroidが手元にないので動作報告をいただけると嬉しいです。<br />
<br />
よろしくお願いします。<br />
<br />
<script charset="utf-8" src="http://widgets.twimg.com/j/2/widget.js"></script>
<script>
new TWTR.Widget({
  version: 2,
  type: 'search',
  search: 'jswikimini',
  interval: 30000,
  title: '',
  subject: 'jswikimini に関するつぶやき',
  width: 250,
  height: 300,
  theme: {
    shell: {
      background: '#8ec1da',
      color: '#ffffff'
    },
    tweets: {
      background: '#ffffff',
      color: '#444444',
      links: '#1985b5'
    }
  },
  features: {
    scrollbar: false,
    loop: true,
    live: true,
    behavior: 'default'
  }
}).render().start();
</script>]]>
    </content>
</entry>

<entry>
    <title>[HTML5]FirefoxのlocalStorageがfile:// protocol に対応した件</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/05/html5-firefox-localstorage-localfile.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.649</id>

    <published>2012-05-13T04:09:26Z</published>
    <updated>2012-05-19T08:19:03Z</updated>

    <summary>Firefoxでは、localStorage がfile:/// なページでは使...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[Firefoxでは、localStorage がfile:/// なページでは使えない(ブラウザ再起動するとlocalStorageが空になる)というバグがあったのですが、いつの間にか修正されていたようです。<br />
<br />
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=507361">https://bugzilla.mozilla.org/show_bug.cgi?id=507361</a><br />
<br />
最新のFirefoxでは、ちゃんとfile:// protocolでlocalStorageが保持されるようになりました。<br />
<br />
]]>
        <![CDATA[<a href="/files/localStorage_jikken.html" target="_blank">デモはこちら</a><br />
<br />
↑のHTMLファイルをPCに保存してから、Firefoxで開いて何度かリロードしてみてください。<br />
Firefox再起動後にアクセスしても値が保持されていると思います。<br />
<br />
ちなみにGoogle Chromeは当初(?)からちゃんと動いてました。<br />
<br />
これで、Google ChromeとFirefoxはfile://なページでもlocalStorageが使えることが確認できました。<br /><br />
<br />
これの何が嬉しいのかというと、ローカルのHTMLファイルでネイティブアプリのようなものが作れるということです。<br />
そのうち実例を公開しますのでお楽しみに。<br />]]>
    </content>
</entry>

<entry>
    <title>[JavaScript]Function.prototype.bindのブラウザ別対応状況</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/05/javascript-function-prototype-bind.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.648</id>

    <published>2012-05-13T00:28:04Z</published>
    <updated>2012-05-19T02:46:11Z</updated>

    <summary>2012年5月現在の実行環境別対応状況 IE6,7,8が対応していないのはいつも...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[<h4>2012年5月現在の実行環境別対応状況</h4>

IE6,7,8が対応していないのはいつものことですが、<br />
SafariとMongoDBが対応してないのは意外ですね。<br />
<br />

]]>
        <![CDATA[<style>
#tblMain { widht:9em;}
#tblMain th { width:6em;text-align:left; }
#tblMain td { width:3em;;text-align:center; }

</style>
<table id="tblMain">
<tr>
<th>IE6</th><td>×</td>
</tr>
<tr>
<th>IE7</th><td>×</td>
</tr>
<tr>
<th>IE8</th><td>×</td>
</tr>
<tr>
<th>IE9</th><td>○</td>
</tr>
<tr>
<th>Firefox 12</th><td>○</td>
</tr>
<tr>
<th>Google Chrome18</th><td>○</td>
</tr>
<tr>
<th>Safari(iOS5.1)</th><td>×</td>
</tr>
<tr>
<th>Node.js 0.6</th><td>○</td>
</tr>
<tr>
<th>MongoDB shell 2.0</th><td>×</td>
</tr>
</table>

<h4>参考</h4>
<a href="http://dqn.sakusakutto.jp/2012/05/javascript_bind_this_callback_method.html">JavaScriptで、メソッドをコールバックとして渡す方法(コールバック関数でthisをbindさせる方法)</a>]]>
    </content>
</entry>

<entry>
    <title>JavaScriptで、メソッドをコールバックとして渡す方法(コールバック関数でthisをbindさせる方法)</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/05/javascript_bind_this_callback_method.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.647</id>

    <published>2012-05-12T08:01:45Z</published>
    <updated>2012-05-19T08:02:39Z</updated>

    <summary>JavaScriptで、関数の引数として関数を渡す(コールバックと呼ばれる)こと...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[JavaScriptで、関数の引数として関数を渡す(コールバックと呼ばれる)ことはよくあります。<br />
<br />
例えばsetTimeoutがそうです。
<pre><code>setTimeout(function(){alert(1)}, 1000);  // 1秒後にalert</code></pre>

下記のように書くことも当然できます。

<pre><code>var say = function(){ alert('hello');}

setTimeout(say, 1000);  // 1秒後に'hello'と表示</code></pre>

ここまでは簡単ですね。<br />

では問題です。

<h4>問題：オブジェクトのメソッドをコールバックとして渡すにはどうすればよいか？</h4>

これが意外と難しいのです。
]]>
        <![CDATA[
<pre><code>var obj = {
    name : 'pikachu',

    say : function(){
       alert('I am ' + this.name); 
    }
}

setTimeout(obj.say, 1000); // => 'I am'とだけ表示される。</code></pre>

これは期待通りに動いてくれません。<br />
コールバックとしてメソッドを渡した場合、それはオブジェクトと切り離された単なる関数(メソッドではない)となってしまうのです。<br />
つまり下記と等価なのです。

<pre><code>setTimeout(
        function(){alert('I am ' + this.name);}
        , 1000);</code></pre>

関数がオブジェクトと切り離されているため、このthisはグローバルオブジェクト(windowオブジェクト)を指してしまっており、'I am'とだけ表示されます。<br />
<br />
ではどうすればよいでしょうか？<br />
<h5>bindメソッド</h5>
IE9,Firefox, Google ChromeではFunctionクラスのbindメソッドというのが使えます。<br />
これはECMAScript5で追加された新仕様です。<br />

<pre><code>setTimeout(obj.say.bind(obj) , 1000); // 'I am pikachu'と表示</code></pre>

ただ、IE7,8,Safari5,iOS5のSafariなどでは使えません。<br />
どうすればよいでしょう？<br />

<h5>MDN(MOZILLA DEVELOPER NETWORK)から借りてくる</h5>
<a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind">MDNのbindのページ</a> に Function.prototype.bind のJS実装があります。<br />
これを借りてくればよいでしょう。<br />

<pre><code>if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== &quot;function&quot;) {
      // closest thing possible to the ECMAScript 5 internal IsCallable function
      throw new TypeError(&quot;Function.prototype.bind - what is trying to be bound is not callable&quot;);
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP
                                 ? this
                                 : oThis || window,
                               aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
}</code></pre>

上記コードをあなたが実行したいコードの前に張り付けておけば、IE6,7,8やSafariでもbindが実用的に使えるようになります。<br />
しかもFirefox・Chromeのようにあらかじめ組み込みbindがある環境では上記コードは何の副作用ももたらしません。<br />
<br />
(厳密に言うと上記bindはあくまで「bindもどき」で、ECMAScript5組み込みのbindとは微妙に挙動が異なります。<br />
詳細は後述の参考サイトをご覧ください。)


<h4>どういう仕組みでthisを束縛しているのか？</h4>

上記コードはどうやってコールバック関数内のthisをオブジェクトに束縛しているのでしょうか？<br />
<br />
昔のprototype.jsの中に、よりシンプルな実装があります。<br />
<a href="http://www.prototypejs.org/assets/2007/1/18/prototype.js">prototype.js 1.5.0</a>

<pre><code>Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}</code></pre>


これでもまだ難しいですね。<br />
難しい原因は引数(arguments)の処理なのでそこは無視しましょう。<br />
<br />
ポイントはapplyです。<br />
applyはFunctionクラスの組み込みメソッド(Function.prototype.apply)です。

<pre><code>f.apply(o);</code></pre>

このように書くと、"this = o とした上で f を呼び出す" ということができます。

つまり、
<pre><code>var obj = {name : 'pikachu'};
var say = function(){ 
       alert('I am ' + this.name); 
};

say.apply(obj); // =&gt; 'I am pikachu'</code></pre>

このように、任意のオブジェクトを関数のthis値として設定することができます。<br />
<br />
最初の問題に戻ると、

<pre><code>var obj = {
    name : 'pikachu',

    say : function(){
       alert('I am ' + this.name); 
    }
}

setTimeout(function(){obj.say.apply(obj)}, 1000); // =&gt; 'I am pikachu'</code></pre>

これで問題が解けました！<br />
<br />
え？コードが見づらいですか？<br />
<br />
束縛を実現するためのヘルパ関数を作って書き換えるとこうなります。

<pre><code>var obj = {
    name : 'pikachu',

    say : function(){
       alert('I am ' + this.name + counter++); 
    }
}

function bind(f,o) {
  return function(){ return f.apply(o); };
}

var bound_say = bind(obj.say, obj);
setTimeout(bound_say, 1000);</code></pre>

これはクロージャを使った例です。<br />
bindは「関数を返す関数」、bound_sayは「関数bind内で生まれた新たな関数」です<br />
１秒後にbound_say関数が実行された瞬間に、f.apply(o)が実行されます。<br />
<br />
MDNのbindよりは、仕組みとしては簡単ですね。<br />

クロージャについては下記をご覧ください。<br />
<a href="http://dqn.sakusakutto.jp/2009/01/javascript_5.html">[JavaScript]　猿でもわかるクロージャ超入門　まとめ</a>

<br />
<h4>まとめ</h4>
<ul>
	<li>コールバックとしてメソッドを渡したいときはbind</li>
	<li>IE6,7,8,Safari5にはbindがない</li>
	<li>MDNのbindを使うといいかも</li>
	<li>コンパクトにやるなら自前でapply</li>
</ul>


<h4>参考</h4>

もっと知りたい人は下記記事をご覧ください。<br />
<br />
bindのJS実装についてはいろいろやり方がありますが、どうやってもESMAScript5の組み込みのbindを100%再現することはできないそうです。<br />
<ul>
	<li><a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind">bind - MDN</a> MOZILLA DEVELOPER NETWORKのbind解説ページ</li>
	<li><a href="http://d.hatena.ne.jp/Constellation/20110113/1294846327">Function.prototype.bindは何がいいのか - 枕を欹てて聴く</a>　bindの自前実装例</li>
	<li><a href="http://blog.livedoor.jp/dankogai/archives/51758978.html">404 Blog Not Found:javascript - Function.prototype.bindを無理矢理捕縛してみた</a> dankogai氏による実装例</li>
</ul>
<br />
お勧めは下記記事です。<br />
jQueryの作者John Resig氏が、prototype.jsのbindをわかりやすく解説してくれています。ちょっと長いですけど。<br />
<a href="http://ejohn.org/apps/learn/">Learning Advanced JavaScript</a><br />
<br />
それではEnjoy!
]]>
    </content>
</entry>

<entry>
    <title>はてブやTwitterで叩かれてもへこたれないための５つの心構え</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/05/twitter_hatebu_5points.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.646</id>

    <published>2012-05-06T19:25:56Z</published>
    <updated>2012-05-18T02:43:13Z</updated>

    <summary>GW中に何気なく書いた１本の記事がネット上でさんざんな不評を買ってしまい、「アホ...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[GW中に何気なく書いた<a href="http://dqn.sakusakutto.jp/2012/05/javascript-last-comma.html">１本の記事</a>がネット上でさんざんな不評を買ってしまい、「アホ」「気持ち悪い」「これはひどい」などと批判されるという得難い体験をしました。<br />
<br />
普通に生活をしていて多数の人から批判されるというのはめったにないことですが、ネット上で情報発信する場合は、誰でもそのようなリスクと付き合わねばなりません。<br />
<br />
以下、叩かれた時の心構えを紹介します。<br />
叩かれたときは参考にしてみてください。<br />

]]>
        <![CDATA[<h4>「叩かれた」とは絶対思わないこと</h4>
一番大事なことは、「叩かれた」とは絶対に考えないことです。<br />
「指摘してくれた」と考えれば、冷静に対応することができます。<br />
わざわざ時間を割いて指摘してくれた人に対して、感謝の気持ちを持ちましょう。<br />

<br />
マザ－テレサの言葉で、「愛の反対は無関心である」というのがあります。<br />
「批判される」というのは、「関心をもたれている」ということであり、無視されるよりも価値があると考えることもできます。<br />
<br />
また、批判されたということは、発案し提案し発信したことの証しでもあります。<br />
発案せず提案せず発信しない人は、誰からも批判されることはないでしょう。でもそれでは無菌室に閉じこもっているようなものです。<br />
<br />
ドラッカーの言葉でこういうのがあります。<br />
「人は優れているほど多くを試みる。人は優れているほど多くの失敗を犯す。」<br />
<br />
どんどん試みて、どんどん失敗して、成長しましょう。<br />

<h4>常に礼儀正しく低姿勢であること</h4>
一番やってはいけないことは、ムキになって感情的に反論することです。<br />
上から目線で反論するなどもってのほかです。<br />
そのようなことをすると火に油を注いでしまうでしょう。<br />
<br />
叩かれても礼儀正しく低姿勢を貫いていれば、やがて周囲も沈静化して、応援してくれる人も現れるでしょう。

<h4>何も失ってないことに気づくこと</h4>
批判されることで何かを失ったでしょうか？<br />
何も失っていないのであれば、落ち込む必要はありません。<br />
<br />
むしろブクマ数やフォロワーが伸びたことを喜びましょう。<br />
私の場合は、この事件でブクマ数が１５０も増えました。<br />
（叩かれるのを狙って記事を書いたわけではありません）<br />
<br />
<img src="http://dqn.sakusakutto.jp.s3.amazonaws.com/images/hatebu-count-increase.png" />
<br />
それに加えて、批判をきっかけにいろいろな資料に目を通したり実験をしたりして、知識が増加しました。<br />
もし私が何の記事も書かず、発信せず、批判されていなかったら、貧しい知識のままでとどまっていたでしょう。<br />

<h4>応援してくれる人の声に耳を傾けること</h4>
必ず何人かは応援してくれる人がいます。<br />
その人たちの声に耳を傾けていれば、元気がわいてきます。<br />
<br />
今回の場合は、各所から暖かい励ましの言葉をいただき、胸が熱くなりました。<br />
本当にありがとうございました。<br />
<br />
<blockquote class="twitter-tweet"><p>若者よ叩かれてもめげるな。ちなみに私は前カンマですよ RT @<a href="https://twitter.com/piro_or">piro_or</a>: <a href="http://t.co/19PhiXiU" title="http://dqn.sakusakutto.jp/2012/05/javascript-last-comma.html">dqn.sakusakutto.jp/2012/05/javasc...</a> 追記がアツい。こういうバイタリティが今の僕にはなくなってしまってる気がする。</p>&mdash; Iwasaki Teruyuki (@twk) <a href="https://twitter.com/twk/status/198330581745008640" data-datetime="2012-05-04T08:37:50+00:00">May 4, 2012</a></blockquote>
<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<br />

<blockquote class="twitter-tweet"><p>熱すぎて吹いたwww RT @<a href="https://twitter.com/piro_or">piro_or</a>: <a href="http://t.co/Whu57d59" title="http://dqn.sakusakutto.jp/2012/05/javascript-last-comma.html">dqn.sakusakutto.jp/2012/05/javasc...</a> 追記がアツい。こういうバイタリティが今の僕にはなくなってしまってる気がする。</p>&mdash; Taro Matsuzawa (@smellman) <a href="https://twitter.com/smellman/status/198330261564424192" data-datetime="2012-05-04T08:36:33+00:00">May 4, 2012</a></blockquote>
<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<br />

<blockquote class="twitter-tweet"><p>ふと疑問に起こったことをアンケートを取ってこういう記事にまとめ上げる能力・人脈・行動力、しかも妙な単語まで作り出して広める程度の能力、こういう人に私はなりたい &gt; JavaScriptの「 <a href="https://twitter.com/search/%2523ケツカンマ">#ケツカンマ</a> 問題」まとめ DQNEO起業日記 <a href="http://t.co/jgZhEMB5" title="http://dqn.sakusakutto.jp/2012/05/javascript-last-comma-matome.html">dqn.sakusakutto.jp/2012/05/javasc...</a></p>&mdash; 不自然言語！リアノサン Ver7.1.5 (@tacticsrealize) <a href="https://twitter.com/tacticsrealize/status/198807397068832768" data-datetime="2012-05-05T16:12:31+00:00">May 5, 2012</a></blockquote>
<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


<h4>転んでもただでは起きないこと</h4>
注目があつまっているときは、むしろチャンスです。<br />
記念にドメインを取得する、サイトを立ち上げる、などしてネタにしてしまいましょう。<br />
悲劇を喜劇に変えてしまうのはあなた次第です。<br />
<br />
<a href="http://ケツカンマ.com/">http://ケツカンマ.com/</a><br />


<h4>最後に</h4>
くだらない記事でGW休暇中のプログラマーの皆様のタイムラインを騒がせてしまって申し訳ありませんでした。<br />
<br />
]]>
    </content>
</entry>

<entry>
    <title>JavaScriptの「ケツカンマ問題」まとめ</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/05/javascript-last-comma-matome.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.645</id>

    <published>2012-05-03T16:32:01Z</published>
    <updated>2012-05-19T01:39:34Z</updated>

    <summary><![CDATA[「ケツカンマ問題」とは何か 「ケツカンマ問題」&mdash; Sotaro KA...]]></summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[<h4>「ケツカンマ問題」とは何か</h4>

<blockquote class="twitter-tweet"><p>「ケツカンマ問題」</p>&mdash; Sotaro KARASAWA© (@sotarok) <a href="https://twitter.com/sotarok/status/197726558000136192" data-datetime="2012-05-02T16:37:39+00:00">May 2, 2012</a></blockquote>
<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<br />

配列リテラルやオブジェクトリテラルの末尾のカンマを書くのか書かないのか（書くべきか書くべきでないか）という問題です。
<pre><code>var list = ['a' , 'b', ];
var obj  = { a : 1, b : 2, }</code></pre>

]]>
        <![CDATA[<h4>実装を調べてみた</h4>

テストコードを実行して、各環境でどうなるか見てみました。

<ul>
	<li><a href="/lastcomma_array.html" >配列のケツカンマテスト</a></li>
	<li><a href="/lastcomma_assoc.html" >連想配列のケツカンマテスト</a></li>
</ul>

<h5>テスト結果</h5>

<ul>
	<li>〇：ケツカンマがあってもなくても挙動が変わらない</li>
	<li>Ｘ：ケツカンマをつけると挙動が変わる</li>
</ul>

<style>
 table#lastcomma td { text-align:center; } 
</style>
<table id="lastcomma">
<tr>
 <th>ブラウザ</th><th>配列リテラル</th><th>オブジェクトリテラル</th>
</tr>
<tr>
 <td>IE6</td><td>×</td><td>×</td>
</tr>
<tr>
 <td>IE7</td><td>×</td><td>×</td>
</tr>
<tr>
 <td>IE8</td><td>×</td><td>○</td>
</tr>
<tr>
 <td>IE9</td><td>○</td><td>○</td>
</tr>
<tr>
 <td>Google Chrome 18</td><td>○</td><td>○</td>
</tr>
<tr>
 <td>Firefox12</td><td>○</td><td>○</td>
</tr>
<tr>
 <td>Safari(iPhone4S)</td><td>○</td><td>○</td>
</tr>
<tr>
 <td>MongoDB shell 2.0</td><td>○</td><td>○</td>
</tr>
<tr>
 <td>Node.js 0.6</td><td>○</td><td>○</td>
</tr>

</table>

<h4>なぜIE6,7(とIE8の配列)ではケツカンマが正しく動かないのか</h4>
結論からいうと、「それがJScriptの仕様である」ということになるかと思います。<br />
後述のとおりECMAScript3の仕様書はケツカンマなしなので、IE(=Jscript)がそのような仕様になっていても間違いではないということになります。<br />
<br />
ひとつだけ納得がいかないのは、IE(=Jscript)は配列ケツカンマとオブジェクトケツカンマで挙動が異なるのです。

<pre><code>var list = ['a' , 'b', ]; // →　要素３個のarrayが生成される。
var obj  = { a : 1, b : 2, };  // → 文法エラー</code></pre>

この仕様はなんか中途半端な気がします。<br />


<h4>ECMAScriptの仕様はどうなっているのか</h4>

<h5>ECMAScript3</h5>
<a href="http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf">Standard ECMA-262 3rd Edition-December1999</a><br />

「11.1.5 Object Initialiser」という章に記載があります。

<pre><code>Syntax
ObjectLiteral :
{ }
{ PropertyNameAndValueList }
PropertyNameAndValueList :
PropertyName : AssignmentExpression
PropertyNameAndValueList , PropertyName : AssignmentExpression</code></pre>

ケツカンマなしスタイルで書かれています。<br />
<br />
結論としては「ECMAScript3の世界ではケツカンマを書かないほうがよい」と言えるかと思います。

<h5>ECMAScript5</h5>

<a href="http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf">Standard ESMA 262 5.1 Edition</a><br />
<br />
「11.1.5 Object Initialiser」という章に記載があります。<br />

<pre><code>Syntax
ObjectLiteral :
{ }
{ PropertyNameAndValueList }
{ PropertyNameAndValueList , }</code></pre>

ケツカンマが明示的に記載されています。<br />
「ECMAScript5の世界ではオブジェクトケツカンマは堂々と書いてよい」という結論になります。<br />
(余談：ECMAScript5の配列ケツカンマについては、仕様書を見ても扱いがよくわかりませんでした。)

<h4>Node.js</h4>
Node.jsは経験がないのですが、npmモジュールの中にはケツカンマ有スタイルと無スタイル両方あると聞きました。<br />
<br />
nodeguide.comのコーディングスタイルガイドを見ると、オブジェクトケツカンマ有りが推奨されています。<br />

<h5><a href="http://nodeguide.com/style.html#object-array-creation">Felix's Node.js Style Guide</a></h5>

<pre><code>var a = ['hello', 'world'];
var b = {
  good: 'code',
  'is generally': 'pretty',
};</code></pre>

<h4>ケツ論</h4>
ケツカンマがあるとIE6,7,8では正しく動きませんので、IE6,7,8で使われる場合はケツカンマは書くべきではありません。<br />
一方、スマホサイトやサーバサイドJSでは、ケツカンマは書いてもよいです。<br />
実際に書くかどうかは個人・組織・コミュニティのポリシーにゆだねられると思います。<br />
<br />
私個人の意見は、今回は控えさせていただきます。(Perl,PHPを書くときはケツカンマ書く派です)<br />
ツイッター、はてぶコメントなどでご意見いただければ幸いです。<br />


<h4>参考：他の言語ではどうなのか</h4>
連想配列ケツカンマについて調べてみました。


<h5>Perl</h4>
Perlはケツカンマつけるのが主流のようです。<br />

<blockquote>「初めてのPerl」第５章ハッシュ

<pre><code>my %last_name = {
  &quot;barney&quot; =&gt; &quot;rubble&quot;,
  &quot;betty&quot;  =&gt; &quot;rubble&quot;,
}</code></pre>

リストの末尾によぶんなコンマが置かれていることに注目してください。<br />
これは無害であり<strong style="color:red;">便利なものです。</strong><br />
このハッシュに行を追加する必要が生じた場合、その行には、キーと値のペアがあり、末尾にコンマがあることを確認するだけで済みます。</blockquote>
<br />
Plackのソースコードなどを見てみるとケツカンマついてます。<br />
<a href="http://cpansearch.perl.org/src/MIYAGAWA/Plack-0.9986/lib/Plack/MIME.pm">http://cpansearch.perl.org/src/MIYAGAWA/Plack-0.9986/lib/Plack/MIME.pm</a><br />
<a href="http://cpansearch.perl.org/src/MIYAGAWA/Plack-0.9986/lib/Plack/Runner.pm">http://cpansearch.perl.org/src/MIYAGAWA/Plack-0.9986/lib/Plack/Runner.pm</a><br />
<br />
<h5>PHP</h5>
PHPも「ケツカンマ」つける文化な気がします。<br />
<br />
Ethnaは「ケツカンマ」つける文化です。<br />
<a href="https://github.com/ethna/ethna/blob/master/class/Controller.php">https://github.com/ethna/ethna/blob/master/class/Controller.php</a><br />

<pre><code>    /** @protected    array   デフォルトのforward定義 */
    protected $forward_default = array(
        '403' =&gt; array( 'view_name' =&gt; 'Ethna_View_403',),
        '404' =&gt; array( 'view_name' =&gt; 'Ethna_View_404',),
        '500' =&gt; array( 'view_name' =&gt; 'Ethna_View_500',),
        'json' =&gt; array( 'view_name' =&gt; 'Ethna_View_Json',),
        'redirect' =&gt; array( 'view_name' =&gt; 'Ethna_View_Redirect',),
    );</code></pre>

<br />
CakePHPは触ったことありませんが、これを見る限り「ケツカンマ」つける文化のように見えます。

<a href="https://github.com/cakephp/cakephp/blob/master/app/Config/database.php.default">https://github.com/cakephp/cakephp/blob/master/app/Config/database.php.default</a>


<pre><code>	public $default = array(
		'datasource' =&gt; 'Database/Mysql',
		'persistent' =&gt; false,
		'host' =&gt; 'localhost',
		'login' =&gt; 'user',
		'password' =&gt; 'password',
		'database' =&gt; 'database_name',
		'prefix' =&gt; '',
		//'encoding' =&gt; 'utf8',
	);
</code></pre>

最後のコメントアウトされた1行が、「ケツカンマ」の利便性を雄弁に語っています。

<h5>Ruby</h5>
Railsのチュートリアルを見てみました。<br />
<br />
<a href="http://guides.rubyonrails.org/active_record_validations_callbacks.html">http://guides.rubyonrails.org/active_record_validations_callbacks.html</a>

<pre><code>class Person &lt; ActiveRecord::Base
  validates :email, :uniqueness =&gt; true, :on =&gt; :create
  validates :age, :numericality =&gt; true, :on =&gt; :update
  validates :name, :presence =&gt; true, :on =&gt; :save
end</code></pre>

ケツカンマ書いてないですね。<br />
Rubyではケツカンマなしが主流なのでしょうか？<br />
(Ruby初心者なのでよくわかりませんでした。詳しい人がいたら教えてください。)

<h4>まとめ</h4>
<ul>
	<li>JavaScriptのケツカンマは過渡期</li>
	<li>Perl,PHPではケツカンマがわりと普通</li>
	<li>ケツ論て言いたいだけちゃうんかと</li>
</ul>
記念にドメインとりました。　→　<a href="http://ケツカンマ.com/">ケツカンマ.com ┌[ ^o^┐,]┐ ケツカンマァ</a><br />


<h5>関連記事</h5>
<ul>
	<li><a href="http://dqn.sakusakutto.jp/2012/05/javascript-last-comma.html">JavaScriptで、もう連想配列の最後のカンマに悩まない！(※追記あり)</a></li>

<h5>追記</h5>
<ul>
	<li>IE8,9のテスト結果に間違いがあったので修正しました。</li>
	<li>Rubyのケースを書きなおしました。</li>
	<li>ECMAScript3の仕様の解釈についての記述を修正しました。</li>
	<li>「ケツコンマ」と呼ぶべきではないかとのご意見をいただきました。その発想はなかった。</li>
</ul>
<br />


あなたのご意見をお待ちしております。<br />
ハッシュタグは 　<a href="https://twitter.com/#!/search/%23ケツカンマ">#ケツカンマ</a>　です。<br />

<script charset="utf-8" src="http://widgets.twimg.com/j/2/widget.js"></script>
<script>
new TWTR.Widget({
  version: 2,
  type: 'search',
  search: 'ケツカンマ',
  interval: 30000,
  title: 'つぶやき',
  subject: 'ケツカンマについて',
  width: 250,
  height: 300,
  theme: {
    shell: {
      background: '#8ec1da',
      color: '#ffffff'
    },
    tweets: {
      background: '#ffffff',
      color: '#444444',
      links: '#1985b5'
    }
  },
  features: {
    scrollbar: false,
    loop: true,
    live: true,
    behavior: 'default'
  }
}).render().start();
</script>]]>
    </content>
</entry>

<entry>
    <title>CentOS6にSubversion1.7をインストールする方法</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/05/centos6-subversion17.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.644</id>

    <published>2012-05-02T19:19:48Z</published>
    <updated>2012-05-18T09:16:48Z</updated>

    <summary>Subversion1.7はいろいろ新機能が盛り込まれていて便利になっているよう...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="Subversion" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[Subversion1.7はいろいろ新機能が盛り込まれていて便利になっているようです。<br />
レポジトリの構造も大幅に改良されているようです。<br />
<br />
<br />
本記事では、CentOS6.2にSubversion1.7をインストールする方法を紹介します。<br />
途中mod_davモジュールの読み込みに失敗して２時間ほど試行錯誤しましたが、そこさえクリアすればうまく行きました。<br />

]]>
        <![CDATA[<h4>wandisco.comからバイナリを取得</h4>

<a href="http://www.wandisco.com/">wandisco</a>という会社が各OS向けのバイナリを配布しています。<br />
見てみたらちゃんとCentOS6用のものが用意されていました。<br />
<a href="http://www.wandisco.com/subversion/download#centos6">http://www.wandisco.com/subversion/download#centos6</a><br />
<br />
<img src="http://dqn.sakusakutto.jp.s3.amazonaws.com/images/subversion1.7.png" /><br />
<br />
<br />
メアドや氏名などを入力すると、ダウンロード用のURLをメールで教えてくれます。<br />
<br />
事前にyum updateをしてから、インストーラをダウンロードします。
<pre><code>$ sudo yum -y upgrade
$ wget http://www.wandisco.com/get.php?f=YTo0OntzOjEwO.... -o installer.sh</code></pre>

<h4>インストーラを実行</h4>
インストーラはbashスクリプトなのでbashで実行します。

<pre><code>$ sudo bash  installer.sh

WANdisco Subversion Installer for CentOS 6
Please report bugs or feature suggestions to opensource@wandisco.com

Gathering some information about your system...
CentOS release 6.2 (Final)
CentOS version 6.x confirmed..
Checking your system arch
Installing for x86_64
Checking to see if you already have Subversion installed via rpm...
Subversion is already installed on the system.
Do you wish to replace the version of subversion currently installed with the WANdisco version?
This action will remove the previous version from your system
[y/n]</code></pre>

既存の古いsubversionを置き換えるか聞かれるので、迷わずYes。

<pre><code>y
Removing old packages...
Adding repository configuration to /etc/yum.repos.d/
 ------ Installing yum repo ------
Importing GPG key
 ------ Installing yum repo: Done ------

Installing Subversion 1.7.4

....

Complete!

Would you like to install apache and the apache SVN modules?
[y/n]</code></pre>

apache用のSVNモジュールも一緒にインストールするか聞かれるので、これもYES。

<pre><code>y
Installing apache and subversion modules
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.nsc.liu.se
 * epel: mirrors.coreix.net
 * extras: centosv4.centos.org
 * ius: mirror.rackspace.com
 * updates: centosk3.centos.org
Setting up Install Process
Package httpd-2.2.15-15.el6.centos.1.x86_64 already installed and latest version
Resolving Dependencies
--&gt; Running transaction check
---&gt; Package mod_dav_svn.x86_64 0:1.7.4-1 will be installed
--&gt; Finished Dependency Resolution

Dependencies Resolved

==================================================================================================================================================================================================================
 Package                                              Arch                                            Version                                             Repository                                         Size
==================================================================================================================================================================================================================
Installing:
 mod_dav_svn                                          x86_64                                          1.7.4-1                                             WANdisco                                           92 k

Transaction Summary
==================================================================================================================================================================================================================
Install       1 Package(s)

Total download size: 92 k
Installed size: 198 k
Downloading Packages:
mod_dav_svn-1.7.4-1.x86_64.rpm                                                                                                                                                             |  92 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : mod_dav_svn-1.7.4-1.x86_64                                                                                                                                                                     1/1
httpd を停止中: [  OK  ]
httpd を起動中: [  OK  ]

Installed:
  mod_dav_svn.x86_64 0:1.7.4-1

Complete!
Installation complete.
You can find the subversion configuration file for apache HTTPD at /etc/httpd/conf.d/subversion.conf
By default, the modules are commented out in subversion.conf.
To enable the modules, please edit subversion.conf and remove the # infront of the LoadModule lines.
You should then restart httpd (/etc/init.d/httpd restart)
</code></pre>

インストール完了！<br />
<br />
/etc/httpd/conf.d/subversion.conf のコメントアウトを外せば有効になると書いてあるので、そのようにしました。<br />
Apacheを再起動すると、

<pre><code>$ sudo /etc/init.d/httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中: httpd: Syntax error on line 221 of /etc/httpd/conf/httpd.conf: Syntax error on line 23 of /etc/httpd/conf.d/subversion.conf: Cannot load /etc/httpd/modules/mod_dav_svn.so into server: /etc/httpd
/modules/mod_dav_svn.so: undefined symbol: dav_register_provider
                                                           [失敗]</code></pre>
イテテ！<br />
起動に失敗しました。<br />


<pre><code>$ sudo find /  -name &quot;*mod_dav_svn*&quot;
/var/lib/yum/yumdb/m/aa3a030b580a1958a4ddd6fbb87afad8982eaa2b-mod_dav_svn-1.7.4-1-x86_64
/usr/lib64/httpd/modules/mod_dav_svn.so</code></pre>

モジュールは確かに存在するのに、おかしいですね。<br />

２時間ほど格闘したあげく、dav_moduleが読み込まれていないのが原因であることに気づきました。<br />
<br />
 /etc/httpd/conf/httpd.conf を編集して、下記のコメントアウトを解除

<pre><code>#LoadModule dav_module modules/mod_dav.so
↓
LoadModule dav_module modules/mod_dav.so</code></pre>

Apacheを再起動

<pre><code>$ sudo /etc/init.d/httpd restart
httpd を停止中: [  OK  ]
httpd を起動中: [  OK  ]</code></pre>


できました！！]]>
    </content>
</entry>

<entry>
    <title>JavaScriptで、もう連想配列の最後のカンマに悩まない！(※追記あり)</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/05/javascript-last-comma.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.643</id>

    <published>2012-05-01T18:30:50Z</published>
    <updated>2012-05-19T01:43:24Z</updated>

    <summary>ご存知の通り、JavaScriptの連想配列の最後のカンマはやっかいです。 最後...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[ご存知の通り、JavaScriptの連想配列の最後のカンマはやっかいです。<br />
最後の要素の後にカンマがあるとIEでバグになるので、普通はこのように書くと思います。

<h4>よくある書き方</h4>

<pre><code>var x = {
 a : 1,
 b : 2, 
 c : 3  // ←カンマつけない
}</code></pre>

しかしこの書き方は不便だし<strike>バグりやすい</strike>面倒くさいです。<br />]]>
        <![CDATA[<strike>末尾に要素を増やしたい、または減らしたいときに問題が起こります</strike><br />
例えば" c : 3 "の行を<strike>単純に削除するとバグるので</strike>削除したいときに、" b: 2,"のカンマを削除する必要があります。<br />
また、" d : 4 "を追加したいときに、" c : 3 "の後にカンマを入れる必要があります。<br />
これは面倒くさいですね。<br />
<br />
(エンバグについてはjslintなどのツールで防げばよいという指摘があったので修正しました。）

<h4>より良いやりかた</h4>


<pre><code>var x = {
 a : 1,
 b : 2, 
 c : 3,
<strong style="color:red";> dummy : null</strong>
}
</code></pre>


このように最後に "dummy : null" というダミーの要素を書いておきます。<br />
こうすれば、プロパティa, b, cはどれもカンマ付きで平等になります。<br />
<br />
ぜひ一度試してみてください。<br />
(もしかして常識だったらすみません。あとこの手法は for in で走査したいときはよくないかもしれません。)


<h5>私のおすすめ</h5>
クラスのプロトタイプ定義でこのテクニックを使うのがおすすめです。

<pre><code>var MyClass = function(){  };

MyClass.prototype = {
 doFoo : function() {} ,
 doBar : function() {} ,
 doBuz : function() {} ,
<strong style="color:red";> dummy : null</strong>
};
</code></pre>

prototypeをfor in するのは継承のときぐらいで、" dummy : null "を継承しても問題にならないのではないでしょうか。<br />


<h5>参考</h5>
<a href="http://d.hatena.ne.jp/sugyan/20090306/1236313928">連想配列の最後にカンマを入れてはいけない言語もある - すぎゃーんメモ</a>

<h4>追記</h4>
はてぶでたくさんのご意見をいただきました。<br />
反響の大きさにびっくりしています。<br />
ご意見ありがとうございます！！<br />
<br />
みんな普通にやってるテクニックかと思っていたら、「バッドノウハウだ」「気持ち悪い」という意見が結構あってびっくりしました。<br />
<br />

以下、ご紹介します。<br />

<h5>「lengthが変わってしまうじゃないか」</h5>
<br />
確かめてみましたが、連想配列にlengthは（自分で定義しない限りは）ないので問題ありません。

<h5>「気持ち悪い」</h5>
これは見た人がどう感じるかですね。<br />
私はIEのためだけにカンマに配慮しなきゃいけないのが気持ち悪いと思いました。<br />
宗教論争かもしれません。

<h5>「バッドノウハウである」</h5>
そうかもしれません。<br />
しかし、IEのJS仕様がバッド仕様なので、毒をもって毒を制すのもありかなと思いました。

<h5>「前カンマの方がよい」</h5>

<pre><code>var x = {
  a : 1
 ,b : 2 
 ,c : 3
}</code></pre>

SQLでよくやる書き方ですね。<br />
JSでこれをやるというのは斬新ですね。<br />
「先頭の要素はめったに変わらないので問題ない」というのも同意です。<br />
<br />
ありかもしれませんね。<br />

<h5>「IE無視すればよい」</h5>
う、うらやましい・・・

<h5>「知らずに全部カンマつけてた」</h5>
そんな人もいるんですね。

<h5>「{ .., reserved :null}ならアリ」</h5>
"dummy"という名前じゃなければいいんですかね。


<h5>「これで納品されたら2度と頼まないと思うw」</h5>
すいませんでした。<br />
そんなに悪いことだとは思ってませんでした。<br />
<br />
Perlモジュールの最後に1;と書くぐらいの感覚でいました。

<h5>「たたかれてるのがおもろい 信念貫いて変なプログラマーになるのが楽しみ」</h5>
ありがとうございます。<br />
<br />
そんなに変ですかね・・・<br />
普通に考えたらこうなっただけなんです。<br />

<h5>「一瞬だけ良いなと思ったけど、すぐ辞めた。」</h5>
なんで辞めちゃったんでしょう・・？

<h5>「JSで慣れてしまって、Perlで最後の要素にカンマある方が違和感あった。今は使い分けてる。」</h5>
たしかPerlのリャマ本かアルパカ本で、「最後にカンマつけましょう」と書いてた気がします。

<h5>「ちなみにGo言語は最後のカンマが無いと逆にエラーになる素晴らしい言語です」</h5>
素晴らしい！！

<h5> 「俺と同じ事を考えている人がいた。よかった、俺は一人じゃないんだ。」</h5>
おおー！

<h5>「ないわー」</h5>
ないですかねー。<br />
ダメな理由をおしえてほしいです。

<h4>追記２</h4>

引用元のすぎゃーんさんが追加記事を書いてくださいました。<br />
<br />
<a href="http://d.hatena.ne.jp/sugyan/20120503">JavaScriptで、もう連想配列の最後のカンマに悩んでないので</a>

<ul>
	<li><strike>Node.jsで</strike>ECMA Script 5で副作用が出る</li>
	<li>書き手は楽だとしても読み手を混乱させる</li>
	<li>エディタやツールでチェックすべき</li>
</ul>


わざわざありがとうございます。<br />
なるほど。<br />

<h4>追記３</h4>
サーバサイドJS ならむしろ「最後もカンマつける」にしてしまえばいいのにと思いました。<br />
でもサーバサイドjsとクライアントサイドjsでスタイルが変わるからNGなんでしょうか。<br />

<h4>追記４</h4>
ツイッターをみた感じでは、９９％ぐらいの人が { , dummy : null }については否定的でした。<br />
<br />
<ul>
	<li>「気持ち悪い」</li>
	<li>「ない」</li>
	<li>「ひどい」</li>
	<li>「ひどすぎる」</li>
	<li>「醜い」</li>
	<li>「美しくない」</li>
	<li>「IEは悪くない」</li>
	<li>「不要なデータを入れるべきではない」</li>
</ul>

一日でこれだけ多くの人に批判されるというのは実に貴重な体験でした。<br />
本当にありがとうございました。<br />
<br />
「気持ち悪い」については、「主観」「宗教論争」と割り切ることもできますが、<br />
「不要なデータを入れるべきではない」については反論の余地がなさそうです。<br />
<br />
delete obj.dummy ;　で回避するというさらなるバッドノウハウを思いつきましたが、やめておきます。<br />
<br />


<h4>追記５　アンケートにご協力お願いします。</h4>
結局「何がベストか」については意見が割れているように思いました。<br />
はてな人力検索でアンケートを作成してみたので、もしよろしければご回答をお願いします。<br />
<br />
<a href="http://q.hatena.ne.jp/1336047101">JavaScriptの「連想配列の末尾カンマ」についてアンケート</a><br />
（※べつに多数決で一つのスタイルに決めるべきと考えているわけではありません）

<h4>追記６</h4>
この問題について「ケツカンマ問題」という名前が誕生しました。<br />
<a href="http://dqn.sakusakutto.jp/2012/05/javascript-last-comma-matome.html">JavaScriptの「ケツカンマ問題」まとめ</a>

<h4>追記７</h4>
記念にドメインとりました。　→　 <a href="http://ケツカンマ.com/">ケツカンマ.com</a>


<br />
<br />
ご意見をTwitterで教えていただけると幸いです。<br />
ハッシュタグは <a href="https://twitter.com/#!/search/%23ケツカンマ">#ケツカンマ</a>　です。<br />
<br />]]>
    </content>
</entry>

<entry>
    <title>MovableType管理画面をPSGIで動かしたら快適すぎて生きるのがつらい</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/04/movabletype-psgi-starman.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.642</id>

    <published>2012-04-30T01:45:53Z</published>
    <updated>2012-05-19T06:29:44Z</updated>

    <summary>MovableTypeの管理画面(mt.cgi)が遅くて遅くてずっと悩んでいたの...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="MovableType" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[MovableTypeの管理画面(mt.cgi)が遅くて遅くてずっと悩んでいたのですが、開発中のdevelopブランチを拾ってきてPSGI(Starman)で動かしたら劇的に速くなりました。<br />
なんと画面表示時間が半分以下！！<br />
<br />
<img src="http://dqn.sakusakutto.jp.s3.amazonaws.com/images/psgi_benchmark.png" /><br />
]]>
        <![CDATA[<br />
<br />
これはかなりうれしいです。<br />
思わず雄叫びの声をあげてしまいました。<br />
<br />
管理画面が遅いのはSQLがボトルネックかと想像してたのですが、そうではなくCGI(の起動処理？)がボトルネックだったようです。<br />
<h4>測定方法</h4>
<br />
ダッシュボード、ブログ記事作成画面、デザインテンプレート画面の３画面について<br />
Google Chromeでアクセスして、Developper Toolsでmt.cgiのレスポンスタイムを記録しました。<br />
１画面３回アクセスして平均値をとりました。<br />
<br />
<br />
<img src="http://dqn.sakusakutto.jp.s3.amazonaws.com/images/psgi_benchmark_chrome.png" /><br />
<br />
<h4>管理画面をPSGIで動かす方法</h4>
<br />
Githubで開発中のMovableTypeのdevelopブランチを入手します。<br />
<a href="https://github.com/movabletype/movabletype/tree/develop">https://github.com/movabletype/movabletype/tree/develop</a><br />
<br />
Plack関連モジュールを一括でインストールして、Starmanを起動します。
<pre><code>cpanm install Task::Plack
starman --daemonize --pid=/tmp/starman.pid /path/to/mt/mt.psgi</code></pre>
http://hostname:5000/mt/mt.cgi にアクセス<br />

mt-upgrade.cgのところで無限ループみたいになるので、一度Starmanを再起動したらいけました。<br />

<br />
わりとさくさく動いてびっくりしています。<br />
（実は１年前にも挑戦していて、そのときは対して速くならなかったのです。今回はMT本体にPSGI最適化の仕組みが入ったのかもしれません。)
<h4>参考</h4>
<ul>
	<li><a href="http://www.skyarc.co.jp/engineerblog/entry/mt_psgi.html">FastCGIと比べて約1.4倍のスピード！　開発中のmt.psgiを使ってみた - MTエンジニアブログ - スカイアークシステム</a></li>
	<li><a href="http://www.h-fj.com/blog/archives/2012/04/21-121910.php">PSGI版Movable Typeを試してみた - The blog of H.Fujimot</a></li>
</ul>]]>
    </content>
</entry>

<entry>
    <title>MovableType管理画面が遅いのを何とかしたい　その１　ブログ記事の作成画面</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/04/movabletype_investigation_sql.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.641</id>

    <published>2012-04-29T23:12:18Z</published>
    <updated>2012-05-19T06:26:30Z</updated>

    <summary>ブログ記事の作成画面が吐き出すSQLログを調べてみました。 画面表示が遅いと思っ...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="MovableType" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[ブログ記事の作成画面が吐き出すSQLログを調べてみました。<br />
<br />
画面表示が遅いと思ったら、ずいぶんとたくさんのSQLを発行していたんですね。。<br />
(画面表示が遅い原因がこれらSQLにあるのかかどうかは、これから調査します。）<br />
<br />
それにしても複雑ですなぁ。


]]>
        <![CDATA[<pre><code>120430  8:11:01     6 Query     SELECT blog_id, blog_allow_anon_comments, blog_allow_comment_html, blog_allow_commenter_regist, blog_allow_comments_default, blog_allow_pings, blog_allow_pings_default, blog_allo
w_reg_comments, blog_allow_unreg_comments, blog_archive_path, blog_archive_tmpl_category, blog_archive_tmpl_daily, blog_archive_tmpl_individual, blog_archive_tmpl_monthly, blog_archive_tmpl_weekly, blog_archive
_type, blog_archive_type_preferred, blog_archive_url, blog_autodiscover_links, blog_autolink_urls, blog_basename_limit, blog_cc_license, blog_children_modified_on, blog_class, blog_convert_paras, blog_convert_p
aras_comments, blog_created_by, blog_created_on, blog_custom_dynamic_templates, blog_days_on_index, blog_description, blog_email_new_comments, blog_email_new_pings, blog_entries_on_index, blog_file_extension, b
log_google_api_key, blog_internal_autodiscovery, blog_is_dynamic, blog_junk_folder_expiry, blog_junk_score_threshold, blog_language, blog_manual_approve_commenters, blog_moderate_pings, blog_moderate_unreg_comm
ents, blog_modified_by, blog_modified_on, blog_mt_update_key, blog_name, blog_old_style_archive_links, blog_parent_id, blog_ping_blogs, blog_ping_google, blog_ping_others, blog_ping_technorati, blog_ping_weblog
s, blog_remote_auth_token, blog_require_comment_emails, blog_sanitize_spec, blog_server_offset, blog_site_path, blog_site_url, blog_sort_order_comments, blog_sort_order_posts, blog_status_default, blog_theme_id
, blog_use_comment_confirmation, blog_use_revision, blog_welcome_msg, blog_words_in_excerpt
FROM mt_blog
WHERE (blog_id = '20')
LIMIT 1
                    6 Query     SELECT author_meta_type
FROM mt_author_meta
WHERE (author_meta_author_id = '1')
                    6 Query     SELECT author_meta_author_id, author_meta_type
FROM mt_author_meta
WHERE (author_meta_author_id = '1') AND (author_meta_type = 'favorite_blogs')
                    6 Query     SELECT author_meta_author_id, author_meta_type, author_meta_vchar, author_meta_vchar_idx, author_meta_vdatetime, author_meta_vdatetime_idx, author_meta_vinteger, author_meta_vint
eger_idx, author_meta_vfloat, author_meta_vfloat_idx, author_meta_vblob, author_meta_vclob
FROM mt_author_meta
WHERE (author_meta_author_id = '1') AND (author_meta_type = 'favorite_blogs')
LIMIT 1
                    6 Query     SELECT blog_id
FROM mt_blog
WHERE (blog_class = 'blog') AND (blog_parent_id = '20')
                    6 Query     SELECT blog_id, blog_allow_anon_comments, blog_allow_comment_html, blog_allow_commenter_regist, blog_allow_comments_default, blog_allow_pings, blog_allow_pings_default, blog_allow_reg_comments, blog_allow_unreg_comments, blog_archive_path, blog_archive_tmpl_category, blog_archive_tmpl_daily, blog_archive_tmpl_individual, blog_archive_tmpl_monthly, blog_archive_tmpl_weekly, blog_archive_type, blog_archive_type_preferred, blog_archive_url, blog_autodiscover_links, blog_autolink_urls, blog_basename_limit, blog_cc_license, blog_children_modified_on, blog_class, blog_convert_paras, blog_convert_paras_comments, blog_created_by, blog_created_on, blog_custom_dynamic_templates, blog_days_on_index, blog_description, blog_email_new_comments, blog_email_new_pings, blog_entries_on_index, blog_file_extension, blog_google_api_key, blog_internal_autodiscovery, blog_is_dynamic, blog_junk_folder_expiry, blog_junk_score_threshold, blog_language, blog_manual_approve_commenters, blog_moderate_pings, blog_moderate_unreg_comments, blog_modified_by, blog_modified_on, blog_mt_update_key, blog_name, blog_old_style_archive_links, blog_parent_id, blog_ping_blogs, blog_ping_google, blog_ping_others, blog_ping_technorati, blog_ping_weblogs, blog_remote_auth_token, blog_require_comment_emails, blog_sanitize_spec, blog_server_offset, blog_site_path, blog_site_url, blog_sort_order_comments, blog_sort_order_posts, blog_status_default, blog_theme_id, blog_use_comment_confirmation, blog_use_revision, blog_welcome_msg, blog_words_in_excerpt
FROM mt_blog
WHERE (blog_id = '20')
LIMIT 1
                    6 Query     SELECT permission_id
FROM mt_permission
WHERE (permission_author_id = '1') AND (permission_blog_id IN ('0','20'))
                    6 Query     SELECT permission_id, permission_author_id, permission_blog_id, permission_blog_prefs, permission_created_by, permission_created_on, permission_entry_prefs, permission_modified_by, permission_modified_on, permission_page_prefs, permission_permissions, permission_restrictions, permission_role_mask, permission_template_prefs
FROM mt_permission
WHERE (permission_id IN ('15'))
                    6 Query     SELECT author_meta_author_id, author_meta_type
FROM mt_author_meta
WHERE (author_meta_author_id = '1') AND (author_meta_type = 'favorite_websites')
                    6 Query     SELECT author_meta_author_id, author_meta_type, author_meta_vchar, author_meta_vchar_idx, author_meta_vdatetime, author_meta_vdatetime_idx, author_meta_vinteger, author_meta_vinteger_idx, author_meta_vfloat, author_meta_vfloat_idx, author_meta_vblob, author_meta_vclob
FROM mt_author_meta
WHERE (author_meta_author_id = '1') AND (author_meta_type = 'favorite_websites')
LIMIT 1
                    6 Query     SELECT blog_id
FROM mt_blog
WHERE (blog_class = 'blog') AND (blog_parent_id >0)
LIMIT 6
                    6 Query     SELECT blog_id
FROM mt_blog
WHERE (blog_id IN ('20'))
                    6 Query     SELECT blog_id
FROM mt_blog
WHERE (blog_class = 'website') AND (blog_id NOT IN ('20','20'))
LIMIT 2
                    6 Query     SELECT blog_id
FROM mt_blog
WHERE (blog_class = 'blog') AND (blog_parent_id = '20')
                    6 Query     SELECT permission_id
FROM mt_permission
WHERE (permission_author_id = '1') AND (permission_blog_id IN ('20','5'))
                    6 Query     SELECT permission_id
FROM mt_permission
WHERE (permission_author_id = '1') AND (permission_blog_id IN ('20','5'))
                    6 Query     SELECT plugindata_id
FROM mt_plugindata
WHERE (plugindata_plugin = 'Zemanta') AND (plugindata_key = 'configuration:blog:5')
LIMIT 1
                    6 Query     SELECT plugindata_id, plugindata_data, plugindata_key, plugindata_plugin
FROM mt_plugindata
WHERE (plugindata_id IN ('126'))
120430  8:11:02     6 Quit
</pre></code>
]]>
    </content>
</entry>

<entry>
    <title>MovableTypeの画像アップロード作業を劇的に効率化する裏技</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/04/movabletype-image-upload.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.640</id>

    <published>2012-04-29T20:29:47Z</published>
    <updated>2012-05-19T01:19:37Z</updated>

    <summary>MovableTypeの画像アップロード機能、使いにくくないですか？ ずっと前か...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="MovableType" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[<h4>MovableTypeの画像アップロード機能、使いにくくないですか？</h4>

<img src="http://dqn.sakusakutto.jp.s3.amazonaws.com/images/mt_upload_file.png" /><br />
<br />
ずっと前から悩みの種でした。<br />
ブログ記事に画像をはりつけようとすると、下記のような手順がいります。<br />
]]>
        <![CDATA[<br />
「ブログ記事の作成」<br />
　↓<br />
「画像の挿入」をクリック<br />
　↓<br />
ここで数秒待たされる<br />
　↓<br />
「新しい画像をアップロード」をクリック<br />
　↓<br />
ファイルを選択<br />
　↓<br />
フォルダを選択<br />
　↓<br />
「アップロード」<br />
　↓<br />
ここで１０秒ほど待たされる<br />
　↓<br />
サムネイルやらサイズやらのオプションを選択<br />
　↓<br />
ＯＫ<br />
　↓<br />
張り付けられたタグがイマイチなので自分で書きなおす。<br />
<br />
こんな流れです。<br />
ものすごい工数がかかっていました。<br />
１画像アップするのに５分はかかっていました。<br />

<h5>問題点</h5>
<ul>
<li>待ち時間がやたら長い</li>
<li>いくつもの選択を迫られる。「サムネイルは作るのか？」「サイズはどうするのか？」「左右どちらに配置するのか？」</li>
</ul>

非常にストレスになっていました。<br />
特に後者は、「あれ、何ピクセルにすればいいんだっけ」と毎回考え込んでいました。<br />
<br />
しかし今日、立ち止まって考えてみました。<br />
<h5>この画像アップロード機能、使わなきゃいいのでは？</h5>
<br />
サムネイル作成など必要ない。<br />
サイズ指定など必要ない。<br />
アイテム管理など必要ない。<br />
<br />
そう、開きなったのです。<br />
直接FTPでアップロードしてしまえばよいのです。<br />
そう考えると気持ちがすごい楽になりました。<br />
<br />
とにかく画像をWeb上にアップして、あとは&lt;img src="" &gt;にURLを書けばよいのです。<br />
アップ先はMTが入ってるサーバである必要もなく、gyazoでもよいしAmazonS3でもよい。<br />
<br />
というわけで実践してみました。<br />
PCからAmazonS3に画像をアップして、そのURLを張り付けてみました。<br />
それが、上に張り付けた画像です。<br />

<h5>超らくちん！</h5>
<br />
すくわれました。
]]>
    </content>
</entry>

<entry>
    <title>MovableType MTOS5.13を導入してみました。</title>
    <link rel="alternate" type="text/html" href="http://dqn.sakusakutto.jp/2012/04/movabletype_mtos513.html" />
    <id>tag:dqn.sakusakutto.jp,2012://5.639</id>

    <published>2012-04-29T20:01:15Z</published>
    <updated>2012-04-29T20:27:28Z</updated>

    <summary>MTOS(MovableType Open Source )5.13を導入してみ...</summary>
    <author>
        <name>DQNEO</name>
        
    </author>
    
        <category term="MovableType" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://dqn.sakusakutto.jp/">
        <![CDATA[<a href="http://www.movabletype.jp/opensource/">MTOS(MovableType Open Source )5.13</a>を導入してみました。<br />
<br />
<a href="http://www.movabletype.jp/opensource/"><img src="http://dqn.sakusakutto.jp.s3-ap-northeast-1.amazonaws.com/images/mtos.png" /></a><br />
<br />
MTとMTOSの違いは何かと言うと、MTOSには下記機能がないみたいです。
<h5><a href="http://www.movabletype.jp/faq/movable-type-5-mtos.html">Movable Type 5 と MTOS にはどのような違いがありますか</a></h5>

<ul>
	<li>カスタムフィールドがない。</li>
	<li>コミュニティ・ソリューションがない。</li>
</ul>
]]>
        <![CDATA[
どちらも自分にとっては無用の長物だったので、思い切ってMTOSに切替えてみました。


<h4>MTOSはどこから入手するのか？</h4>

入手方法が２通りあるようです。

<ul>
	<li>Zipダウンロード版：<a href="http://www.movabletype.jp/opensource/">MTOSのページ</a>から「今すぐダウンロード Movable Type(Open Source)」をクリック</li>
	<li><a href="https://github.com/movabletype/movabletype">Github</a>: git://github.com/movabletype/movabletype</li>

</ul>
Zipダウンロード版とGithu版の関係がどこにも書いておらず、よくわかりませんでした。＞＜<br />
そもそもGithub版がMTなのかMTOSなのか、確信が持てずさまよってしまいました。笑<br />
Githubに<a href="https://github.com/movabletype/movabletype/blob/master/COPYING">GPLのライセンスファイル</a>が置いてあったので、おそらくこれがMTOSの最新版ということになるのでしょう。<br />
<br />
今後の改修に追従しやすいように、Githubをクローンすることにしました。<br />

<h4>MT 5.12　→  MTOSに切替えるためにやったこと</h4>
レンタルサーバ(DTIの500円VPS)にログインしてサーバ内で作業しました。

<pre><code>git clone git://github.com/movabletype/movabletype.git
mv movabletype mtos
cd mtos
cpanm  JavaScript::Minifier
cpanm  CSS::Minifier
make me</code></pre>

(JavaScript::MinifieとCSS::MinifierはCPANモジュールです。<br />
これを入れとかないと警告が出ます。)<br />
<br />
ここまでやってから、既存のMT5.12のディレクトリとMTOSディレクトリをごっそり入れ替えました。<br />
mt-config.cgiを旧MTディレクトリから新MTOSディレクトリにコピー。<br />
mt-staticも旧ディレクトリから新ディレクトリに引っ越し。(MTOSに同梱されいたmt-staticは不使用)<br />
ブラウザからmt.cgiを叩くと、データベースアップグレード画面が出ます。<br />
次へ次へと進むと正常に終了。<br />
管理画面にも無事ログインできました。<br />

<h4>導入してみた感想</h4>

ほとんど何も変わってない気がします。笑<br />
今後使い込んでいけば、違いに気づくかもしれません。<br />
そのときはまたここで記事を書きたいと思います。<br />
]]>
    </content>
</entry>

</feed>

