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

<channel>
	<title>RapidExp</title>
	<atom:link href="http://www.rapidexp.com/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rapidexp.com/wordpress</link>
	<description>Just another WordPress site</description>
	<lastBuildDate>Sat, 19 May 2012 02:16:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>HTML5 フォームバリデーション</title>
		<link>http://www.rapidexp.com/wordpress/2012/05/18/html5-form/</link>
		<comments>http://www.rapidexp.com/wordpress/2012/05/18/html5-form/#comments</comments>
		<pubDate>Fri, 18 May 2012 13:04:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[LAMP]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://www.rapidexp.com/wordpress/?p=313</guid>
		<description><![CDATA[HTML5のフォームバリデーションはもう使ってますか？ HTML5では、javascriptを書かずただHTMLタグに以下のような属性を追加するだけで、フォームのバリデーション機能が付加されることになっています。対応ブラ [...]]]></description>
			<content:encoded><![CDATA[<p>HTML5のフォームバリデーションはもう使ってますか？</p>
<p>HTML5では、javascriptを書かずただHTMLタグに以下のような属性を追加するだけで、フォームのバリデーション機能が付加されることになっています。対応ブラウザでは、確認した範囲でDOCTYPE宣言はHTML4のままでも機能します。</p>
<table class="solid">
<tr>
<th>属性/タイプ</th>
<th>バリデーション内容</th>
</tr>
<tr>
<td>required</td>
<td>必須入力のチェック</td>
</tr>
<tr>
<td>placeholder=&#8221;表示文字列&#8221;</td>
<td>空の場合の表示文字列</td>
</tr>
<tr>
<td>type=&#8221;email&#8221;</td>
<td>メールアドレスバの妥当性</td>
</tr>
<tr>
<td>type=&#8221;url&#8221;</td>
<td>URLの妥当性</td>
</tr>
<tr>
<td>textarea maxlength</td>
<td>textareaの最大文字数</td>
</tr>
</table>
<p>これらを使うとどんなUIになるか、テストフォームを作成してみました。</p>
<p><iframe src="/lib/test_html5.php" width="580" height="300"></iframe></p>
<p>Firefox, ChromeなどIE以外のブラウザで（IEしかないならインストールして）、このテストフォームの「確認」ボタンをクリックしてみてください。</p>
<p>required属性を加えたテキストボックスをFireFoxで空打ちすると次のメッセージがポップアップします。</p>
<p align="center"><img src="/lib/html5_firefox.png"></p>
<p>Chromeでは・・・</p>
<p align="center"><img src="/lib/html5_chrome.png"></p>
<p>素晴らしい！ こんな便利な拡張を使わない手はないですよね。</p>
<p>しかし、<a href="http://www.findmebyip.com/litmus/#html5-forms-inputs" target="_black" title="HTML5 &#038; CSS3 Support">IEがこの体たらく</a>では、使いたくても使えないと言ったところでしょうか。</p>
<p>基本バリデーションに対応したIE10がリリースされた後、これらの使用は次第に広まるのでしょう。<br />
とは言え、以前のIEに対する互換性問題は相も変わらずついて回るわけで、IE10が出たところで何ら状況は変わらないとも言えます。(´・ω・`)</p>
<h2>jquery.html5form-1.5ja.js</h2>
<p>ということで・・・実は、上記テストフォームはIEでも機能する仕込みを入れてあり、IEで確認ボタンを押すとちゃんとフキダシが開きます。ここからがこのエントリーの本題です。d( ･`ω･´) えへん</p>
<p align="center"><img src="/lib/html5_msie.png"></p>
<p><span style="color:white;">.</span></p>
<p>ネタ元としては <a href="http://www.matiasmancini.com.ar/jquery-plugin-ajax-form-validation-html5.html" target="_blank">こちらで配布している</a> jQuery プラグイン <strong>html5-form</strong> を組み込んでいます。</p>
<p>ただしhtml5-formそのままでは問題があったので以下を修正しました（ベースは v1.5 / 12-04-2011）。</p>
<ol>
<li>submitに成功したときに遷移しないバグを修正</li>
<li>select required が機能してなかったバグを修正</li>
<li>valueがnullでない場合もplaceholderが表示されてしまうバグを修正</li>
<li>button type=&#8221;sumit&#8221;でも機能するように機能追加</li>
<li>requied 属性を持つフォーム部品のclassにrequired を追加</li>
<li>textarea の maxlength において、IME を介した入力にも擬似的に対応</li>
<li>responseDiv の１文字目が &#8220;.&#8221; のときは部品の後ろに指定クラスを自動追加</li>
<li>以下のオプションのデフォルトを変更<br />
responseDiv : &#8220;.html5form-response&#8221;,<br />
allBrowsers : false</li>
<li>オプションasync と機能を削除</li>
<li>オプション messages と各国語メッセージを削除</li>
<li>デフォルトのメッセージを日本語とし、select requied を別メッセージに</li>
<li>オプション unselectedMessage を追加</li>
<li>IE10をモダンブラウザと判定追加f</li>
</ol>
<p>修正版はこちらからダウンロードできます。<br />
オリジナルと同じく MIT と GPL のデュアルライセンスで扱ってください。</p>
<p><a href="/lib/jquery.html5form-1.5ja.js" target ="_blank">jquery.html5form-1.5ja.js</a><br />
<a href="/lib/jquery.html5form-1.5ja-min.js" target ="_blank">jquery.html5form-1.5ja-min.js</a></p>
<h3>組み込み方</h3>
<p>1. HTMLヘッダでjQuery本体とhtml5-formを読み込みます。</p>
<pre class="source">
&lt;script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="jquery.html5form-1.5ja-min.js"&gt;&lt;/script&tg;
</pre>
<p>2. フォーム要素に対して.html5form()を指定します。<br />
jquery.html5form-1.5ja.js ではオプション初期値を修正していますので通常はオプション指定の必要ありません。また、オリジナル版のようにid指定ではなくform一般に指定して構いません。</p>
<pre class="source">$(function() {
  $('form').html5form();
});</pre>
<h3>requiredクラス</h3>
<p>修正版ではrequired属性をクラスに複写します。<br />
必須項目を色分けしたいときには擬似クラスと通常クラスの両方を指定してください。この２つは１つにまとめることはできません。擬似クラス指定でエラーになると通常クラス指定も無視されてしまうからです。</p>
<pre class="source">
:required { background-color: lightyellow; }
.required { background-color: lightyellow; }
</pre>
<h3>IME入力のmaxlength</h3>
<p>IME入力そのものをキャンセルする方法がないので、オーバーした文字を末尾から削除してカーソルも末尾に飛ぶ仕様で機能追加しました。新規入力に問題はないですが、段落途中にIMEで文字を追加したとき予想外の動きで違和感あるかと思います。<br />
IE使いの苦情は無視する方向で、文字数を制限することを優先しました。</p>
<h3>responseDivの自動挿入</h3>
<p>オリジナルの html5-form はid指定のコンテナをエラー出力用に用意する必要がありました。<br />
１ページにformが１つとは限りませんから、オリジナルの仕様ではページごとにjavascriptを書き換える必要がありました。あくまでIEのHTML5代替に過ぎないので、できるだけメンテナンスフリーとしたく、共通の初期化スクリプトにform汎用指定ができるようにしました。<br />
エラー出力は、該当のフォーム部品の後ろにdiv要素を自動追加して出力します。従来通りに特定のコンテナに出力したいときは、responseDiv オプションをid指定としてください。</p>
<h3>cssによるフキダシ</h3>
<p>フォーム部品の直後に挿入されるエラーメッセージは、次の単純な構造です。</p>
<pre class="source">
&lt;input type="text" name="name" value="" requied&gt;
<span style="color:red;">&lt;div class="html5form-response"&gt;&lt;p&gt;このフィールドを入力してください&lt;/p&gt;&lt;/div&gt;</span>
</pre>
<p>これを css 記述だけでフキダシ表現にすることできます。<br />
次を css に加えてください。p要素がフキダシ本体で、divコンテナは色違いの上ボーダと左ボーターにより生じる三角コーナーでヒゲを表現するのに使われています。</p>
<pre class="source">.html5form-response {
  position: absolute;
  margin: -2px 0 0 10px;
  border-left: 10px solid silver;
  border-top: 10px solid transparent;
  -border-top-color: white; /* for IE6 */
}
.html5form-response p {
  float:left;
  margin: 0 0 0 -40px;
  background: white;
  color: black;
  padding: 10px;
  border: 1px solid silver;
  border-radius: 8px;
  -position: relative; /* for IE6 */
}</pre>
<p>表示されたフキダシが画面クリックで消えるように、jQueryスクリプトを加えます。</p>
<pre class="source">  // フキダシをクリア
  $('body').click(function() { $('.html5form-response').remove(); });
</pre>
<h3>カスタムメッセージ</h3>
<p>使わないデータを内蔵するのは趣味でないいので、日本語以外のメッセージは全て削除しました。<br />
メッセージを変えたい場合はカスタムメッセージオプション（emptyMessage, unselectedMessage, emailMessage）を利用してください。inputとselectで異なるrequiredメッセージが指定できるように、unselectedMessageを加えてあります。</p>
<h3>IE10の判定</h3>
<p>allBrowsersオプションをfalseにすると、HTML5フォームバリデーション対応ブラウザでは何もせずにブラウザに任せるようになりますが、この判定はブラザの種別とバージョンで判断しており、v1.5のコードではIEは全バージョン制御対象となっていました。</p>
<p>IE10のプレリリースを見る限りこのプラグインと重複する部分は対応しているようですので、判定にIEを加えてバージョン10からはモダンブラウザと判定するようにしました。</p>
<h3>その他の修正点</h3>
<p>削除したオプションasyncはデフォルがtrueでしたが、これは追加のエラーをajaxで取得するもので応答するサーバープログラムが必要ですし、その結果でsubmitを制御する仕組みが正しく機能しているようには思われませんでした。</p>
<h2>フレームワークのバリデーションを統合する</h2>
<p>ウェブアプリケーションを作成する場合、HTML5のフォームバリデーションだけでは到底完結しません。</p>
<p>フレームワークによる画面遷移後のエラーメッセージはどのように処理していますか？</p>
<ol>
<li>フォームの上部または下部の一箇所に、とりあえず１つだけエラー表示</li>
<li>フォームの上部または下部の一箇所に、すべてのエラーをまとめて表示</li>
<li>該当するフォーム部品ごとに、それぞれのエラーを表示</li>
</ol>
<p>パターン１の処理を未だにしているような化石フレームワークは、すでに及びじゃないですね。</p>
<p>パターン３の処理をしてるなら、その出力を <b>&lt;div class=&#8221;html5form-response&#8221;&gt;&lt;p&gt;エラーメッセージ&lt;/p&gt;&lt;/div&gt;</b> に変えるだけです。<br />
先に設定した css がこのエラーメッセージを同じフキダシ書式で表現してくれます。</p>
<p>画面遷移後のエラー表示で、エラー箇所にフォーカスが移動するように次を加えておきましょう。</p>
<pre class="source">  // 最初のエラーをフォーカス
  $('.html5form-response').eq(0).prev().focus().select();</pre>
<p><span style="color: white; ">.</span></p>
<p>いかがですか、IE10の普及を待たずに HTML5 のフォームバリデーションを導入する気になりましたでしょうか？</p>
<p>繰り返しますが、たとえIE10が普及しても古いバージョンのIEへの対策は避けて通れませんから、結局はここで述べたような代替を用意しなければなりません。</p>
<p>ならば、とっとと HTML5 の恩恵を受けて、時代の最先端を駆けましょうぞ！ ( ･`ω･´)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rapidexp.com/wordpress/2012/05/18/html5-form/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu 11.10へFreeNXインストール</title>
		<link>http://www.rapidexp.com/wordpress/2011/11/25/ubuntu-11-10%e3%81%b8freenx%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/</link>
		<comments>http://www.rapidexp.com/wordpress/2011/11/25/ubuntu-11-10%e3%81%b8freenx%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/#comments</comments>
		<pubDate>Fri, 25 Nov 2011 02:38:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.rapidexp.com/wordpress/?p=4</guid>
		<description><![CDATA[Ubuntuフォーラムの投稿にインストール方法が記述されていたので試してみました。 惜しむらくは、投稿者がタイプミスして”10.11″と書いてしまっていて、11.10での解決方法かどうかが曖昧になってしまってることです。 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ubuntuforums.org/showthread.php?t=1840679" target="_blank"><strong>Ubuntu</strong>フォーラムの投稿</a>に<strong>インストール</strong>方法が記述されていたので試してみました。</p>
<p>惜しむらくは、投稿者がタイプミスして”10.11″と書いてしまっていて、11.10での解決方法かどうかが曖昧になってしまってることです。</p>
<p>また、投稿者は64bitでのダウンロードパスを書いていますが、自分のデスクトップは32bitだったので、パスを読み替えました。</p>
<p>ちなみに、<strong>インストール</strong>されている<strong>Ubuntu</strong>が64bitか32bitかは、次のコマンドで確認できます。</p>
<pre>uname -a</pre>
<p>出力の最後に “x86_64 GNU/Linux” とあれば64bitで、そうでなければ32bitです。</p>
<p>.</p>
<p><strong>FreeNX</strong>のダウンロードライブラリは <a href="http://de.archive.ubuntu.com/ubuntu/pool/main/e/esound/" target="_blank">http://de.archive.<strong>ubuntu</strong>.com/<strong>ubuntu</strong>/pool/main/e/esound/</a> で、すでにフォーラム投稿のバージョンより新しいものが登録されていましたが、今回はフォーラム投稿とバージョンを合わました。</p>
<p>ダウンロードしたのは次の3ファイルになります。</p>
<ul>
<li>esound-common_0.2.41-8_all.deb</li>
<li>libesd0_0.2.41-8_i386.deb</li>
<li>esound-clients_0.2.41-8_i386</li>
</ul>
<p>ということで、手順はフォーラム投稿のままですが・・・</p>
<pre>wget http://de.archive.<strong>ubuntu</strong>.com/<strong>ubuntu</strong>/pool/main/e/esound/esound-common_0.2.41-8_all.deb
wget http://de.archive.<strong>ubuntu</strong>.com/<strong>ubuntu</strong>/pool/main/e/esound/libesd0_0.2.41-8_i386.deb
wget http://de.archive.<strong>ubuntu</strong>.com/<strong>ubuntu</strong>/pool/main/e/esound/esound-clients_0.2.41-8_i386.deb
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:<strong>freenx</strong>-team
sudo sed -i 's/oneiric/lucid/g' /etc/apt/sources.list.d/<strong>freenx</strong>-team-ppa-oneiric.list
sudo apt-get update &amp;&amp; sudo apt-get upgrade
sudo dpkg -i esound-common_0.2.41-8_all.deb
sudo dpkg -i libesd0_0.2.41-8_i386.deb
sudo dpkg -i esound-clients_0.2.41-8_i386.deb
sudo apt-get install <strong>freenx</strong></pre>
<p>これで無事<strong>FreeNX</strong>を<strong>インストール</strong>することができました。</p>
<p>.</p>
<p>そして、11.10の<strong>FreeNX</strong>サーバーにログインするためには <a href="../2011/10/19/ubuntu-11-10-nx/">以前のエントリー</a> で書いたように、Windows版のnomachineクライアントから接続するにはRun the following commandにUnity-2Dを指定する必要があります。</p>
<pre>gnome-session <strong>ubuntu</strong>-2d</pre>
<p>.</p>
<p><strong>■ <strong>Ubuntu</strong> to <strong>FreeNX</strong> （追記）</strong></p>
<p><strong>Ubuntu</strong>のNXクライアントQtNXからのアクセスする場合も、カスタムコマンドを指定しなければなりません。<br />
しかし、TypeでCustomを選択することはできますが、Settingsボタンを押しても編集ダイアログが開かないのでカスタムコマンドをUIで設定することができません。</p>
<ol>
<li>QtNXのConfigure画面を開きます。</li>
<li>PlatformをUNIX、TypeをCustomとします。</li>
<li>Settingsを押して次のように設定したいのですが・・・
<pre>/usr/bin/gnome-session --session <strong>ubuntu</strong>-2d</pre>
</li>
<li>Settingsを押しても何も開かないので仕方ないのでOKですべて閉じます。</li>
<li>設定ファイル ~/.qtnx/(設定名).nxml をエディタで開き、Custom Session Commandの値を直接編集します。</li>
</ol>
<p>nomachineのクライアントとは記述に仕方が異なるので注意が必要ですが、これで<strong>Ubuntu</strong> 11.10のUnity-2dへログインすることができました。</p>
<p>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rapidexp.com/wordpress/2011/11/25/ubuntu-11-10%e3%81%b8freenx%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQueryで吸収できないIE仕様の備忘録</title>
		<link>http://www.rapidexp.com/wordpress/2011/11/22/ie/</link>
		<comments>http://www.rapidexp.com/wordpress/2011/11/22/ie/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 02:41:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.rapidexp.com/wordpress/?p=7</guid>
		<description><![CDATA[wiki代わりの備忘録なので編集や加筆の制限なしエントリーです、あしからず。 また、以下はIEに特化することが目的ではなく、W3C勧告のHTML標準なページ作成を目指す中で、標準を理解しない（くせにトップシェアの）IEの [...]]]></description>
			<content:encoded><![CDATA[<p>wiki代わりの備忘録なので編集や加筆の制限なしエントリーです、あしからず。</p>
<p>また、以下は<strong>IE</strong>に特化することが目的ではなく、W3C勧告のHTML標準なページ作成を目指す中で、標準を理解しない（くせにトップシェアの）<strong>IE</strong>の仕様を何とか回避するが主題です。</p>
<p>cssテクまで考慮するともっとたくさんになると思いますが、それはデザイナーさんに任せます（笑）</p>
<p><span style="color: white;">.</span></p>
<p><strong>■ <strong>IE</strong>互換モード</strong></p>
<p>イントラネットでは互換モード優先が<strong>IE</strong>のデフォルト設定のため、企業イントラネットではIE7の配慮が必要です。ローカルPCでの開発では互換モードを再現できないので注意が必要です。</p>
<p>強制的に互換モードを排除するには、.htaccessに次を記述してHTTPヘッダを出力するか、</p>
<pre>Header set X-UA-Compatible "<strong>IE</strong>=edge"</pre>
<p>メタタグでページごとに指定します。</p>
<pre>&lt;meta http-equiv="X-UA-Compatible" content="<strong>IE</strong>=edge"/&gt;</pre>
<p>しかし、企業イントラネットではどちらも禁止されることがあり、そうなるとブラウザシェアに関わらず今後もIE7を切り捨てることができません。</p>
<p>なお、edgeはその時点での最新バージョン対応のことで、MS自身は使用を避けるべきとしていますが、HTML標準を目指すので当然edgeをポリシーとします。</p>
<p><span style="color: white;">.</span></p>
<p><strong>■ UA判定</strong></p>
<p>できればUAによるコード分岐はしたくないのですが、回避できないケースが多々あります。</p>
<pre>var _ua = (function(){
 return {
  ltIE6:typeof window.addEventListener == "undefined" &amp;&amp; typeof document.documentElement.style.maxHeight == "undefined",
  ltIE7:typeof window.addEventListener == "undefined" &amp;&amp; typeof document.querySelectorAll == "undefined",
  ltIE8:typeof window.addEventListener == "undefined" &amp;&amp; typeof document.getElementsByClassName == "undefined",
  mobile:/android|iphone|ipad|ipod/i.test(navigator.userAgent.toLowerCase())
 }
})();</pre>
<p><span style="color: white;">.</span></p>
<p><strong>■ nameによるエレメント指定</strong></p>
<p><strong>IE</strong>では以下の書き方はできません。</p>
<pre>$('[name="Test"]')</pre>
<p>かならず、indexかselectを指定する必要があります。</p>
<pre>$('select[name="Test"]')</pre>
<p><span style="color: white;">.</span></p>
<p><strong>■ optionの非表示</strong></p>
<p>display:noneを指定しても<strong>IE</strong>では消えません。</p>
<p>これが必要なケースでは、ページ起動時にオリジナル選択肢を複写しておき、</p>
<pre>$('body').append('&lt;select id="copyTest" style="display:none;"&gt;&lt;/select&gt;');
$('select[name="Test"]').eq(0).children().clone().prependTo('#copyTest');</pre>
<p>select要素の再描画が必要なときに、非表示条件を除外して複写することで、ブラウザ共通コードとできます。</p>
<pre>var cur = $('select[name="Test"]').val();
$('select[name="Test"]').children().remove();
$('#copyTest').children().each( function () {
    if (非表示の条件) return;
    $('select[name="Test"]').append($(this).clone());
});
$('select[name="Test"]').val(cur);</pre>
<p><span style="color: white;">.</span></p>
<p><strong>■ trの非表示</strong></p>
<p>trをdisplay:noneとしたとき、互換モードでは枠線が残ります。</p>
<p>2、3行の非表示なら気になりませんが、数十行を非表示にするとその分の枠線が重なり真っ黒となります（笑）</p>
<p>メタタグが禁止され互換モードを排除できなかったイントラネット案件では、非表示にするtrをtbodyでくくるhtml文法的には不適切な方法で回避しました。</p>
<p><span style="color: white;">.</span></p>
<p><strong>■ rowSpanの値変化</strong></p>
<p>上記枠線が残るのと同根ですが、rowSpanが変化するような行単位の表示・非表示を行ったとき、IE7以前では考察不能な値での調整が必要です。</p>
<p>IE7以前を切り捨てられない場合は、UA判定で別コードを書かざるをえません。</p>
<p><span style="color: white;">.</span></p>
<p><strong>■ Array.indexOf</strong></p>
<p><strong>IE</strong>にはArrayにindexOfが実装されていません。使用する場合は自分で追加します。</p>
<pre>if(!Array.indexOf){
    Array.prototype.indexOf = function(target){
        for(var i = 0; i &lt; this.length; i++){
            if(this[i] === target){
                return i;
            }
        }
        return -1;
    }
}</pre>
<p><span style="color: white;">.</span></p>
<p><strong>■ trim</strong></p>
<p><strong>IE</strong>にはtrimが実装されていません。使用する場合は自分で追加します。</p>
<pre>if(typeof String.prototype.trim !== 'function') {
    String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g, '');
    }
}</pre>
<p><span style="color: white;">.</span></p>
<p><strong>■ date.getYear()</strong></p>
<p>通常のブラウザでは getYear = getFullYear &#8211; 1900 ですが、<strong>IE</strong>のみは getYear = getFullYear です。</p>
<p>よって、必ずgetFullYear を使用します。</p>
<p><span style="color: white;">.</span></p>
<p><strong>■ Chrome Frame</strong></p>
<p>許されるなら、以下のメッセージで現実逃避したいですね（笑）</p>
<pre>&lt;?php
if (!defined('MSIE') &amp;&amp; isset($_SERVER['HTTP_USER_AGENT'])) {
    if (preg_match('/chromeframe|Opera|Lunascape/', $_SERVER['HTTP_USER_AGENT'])) {
        // これらはUAにMSIEが入るが<strong>IE</strong>ではないので無視する
        // Lunascapeはエンジン切り替え可能である
        // SleipnirもMSIEを含むが、エンジンが<strong>IE</strong>であるので警告する
    }
    elseif (preg_match('/MSIE [4-8]\./', $_SERVER['HTTP_USER_AGENT'])) {
        // <strong>IE</strong> 9は除外する
        define('MSIE', 1);
    }
}

if (defined('MSIE') {
  echo 'お使いのブラウザは古いバージョンの<strong>IE</strong>です。';
  echo 'IE9以上にアップデートするか、';
  echo '&lt;a href="http://www.google.com/chromeframe/?hl=ja&amp;quickenable=true" target="_blank"&gt;';
  echo 'パフォーマンス向上のためのプラグイン&lt;/a&gt; のインストールを推奨します。';
}
?&gt;</pre>
<p>インストールしたChrome Frameを有効にするには、ページに次のメタタグを入れます。</p>
<pre>&lt;meta http-equiv="X-UA-Compatible" content="chrome=1"&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.rapidexp.com/wordpress/2011/11/22/ie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UbuntuのEmacs化のまとめ</title>
		<link>http://www.rapidexp.com/wordpress/2011/11/21/ubuntu-emacs/</link>
		<comments>http://www.rapidexp.com/wordpress/2011/11/21/ubuntu-emacs/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 06:06:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.rapidexp.com/wordpress/?p=10</guid>
		<description><![CDATA[以前にも書きましたが、UIのEmacs度はUbuntuよりもWindowsのほうがはるかに上でした。 なにしろ、yamy（Yet Another Mado tsukai no Yuutsu: 「窓使いの憂鬱」のキー入力置 [...]]]></description>
			<content:encoded><![CDATA[<p>以前にも書きましたが、UIのEmacs度はUbuntuよりもWindowsのほうがはるかに上でした。</p>
<p>なにしろ、yamy（Yet Another Mado tsukai no Yuutsu: 「窓使いの憂鬱」のキー入力置換をドライバベースからユーザモードフックベースに変更した派生プロジェクト。Windows7やリモートデスクトップでも 動作する）を導入すれば、ダイアログだろうがメニューだろうが果てはエクセルだろうワードだろうが、ありとあらゆるものがEmacs操作体系になりまし た。</p>
<p>例えばVisual Stadioは添付のEmacsキー定義で使うより標準キー定義のままyamyの管理下に置くほうがEmac的だし、その他アプリケーションでも存在しないはずのインクリメンタルサーチがなぜかできてしまったりするのでした。</p>
<p>しかし今の自分はUbuntuです。</p>
<p>GnomeからUnityへの移行に伴い、できることができなくなったり仕様がコロコロ変わっているようですので、自分用備忘録としてまとめます。</p>
<p>.</p>
<p><strong>■ gtk_key_theme</strong></p>
<p>よく知られているカスタマイズ法ですが、Gnome2アプリ（Nautilusやgedit）は基本操作系をEmacs風にすることができます。</p>
<ol>
<li>gconf-editorを起動</li>
<li>desktop/gnome/interfaceを開く</li>
<li>gtk_key_themeに（なければ作成して）、”Emacs”を指定</li>
</ol>
<p>しかし、Ubuntu 11.10ではこの指定が働かず、gsettingsを使う必要があります。</p>
<pre>$ gsettings get org.gnome.desktop.interface gtk-key-theme
'Default'
$ gsettings set org.gnome.desktop.interface gtk-key-theme Emacs
$ gsettings get org.gnome.desktop.interface gtk-key-theme
'Emacs'</pre>
<p>.</p>
<p>しかも、このキーテーマはEmacsには程遠いものです。</p>
<table>
<tbody>
<tr>
<td>１行テキストボックス</td>
<td>○</td>
<td>C-f, C-b, C-a, C-eでのカーソル移動が可能</td>
</tr>
<tr>
<td>メニュー操作</td>
<td>○</td>
<td>C-f, C-b, C-n, C-pでのメニュー移動が可能</td>
</tr>
<tr>
<td>ダイアログリスト</td>
<td>△</td>
<td>C-n, C-pでのカーソル移動がCtrl+上下（複数選択）になってしまう</td>
</tr>
<tr>
<td>gedit</td>
<td>△</td>
<td>基本操作はEmacsになっているが、C-n、C-pなどメニューアクセスキーが優先される</td>
</tr>
<tr>
<td>Nautilus</td>
<td>☓</td>
<td>メニューアクセスキーが優先され、基本操作もEmacsにならない</td>
</tr>
</tbody>
</table>
<p>.</p>
<p><strong>■ can_change_accels</strong></p>
<p>キーテーマの変更の不足を補うには、メニューアクセスキーを変更する必要があります。</p>
<p>Gnome2アプリはキーテーマと同じような方法で変更することが可能です。</p>
<p>アクセスキーを削除または変更することで、geditではC-f, C-nのEmacs操作系が使用できるようになります。Nautilusではアクセスキーを削除してもEmacs操作系になりませんが、意図せず新規ウィンドウを開くより無反応のほうがマシです。</p>
<ol>
<li>gconf-editorを起動</li>
<li>desktop/gnome/interfaceを開く</li>
<li>can_change_accelsをチェックする</li>
<li>変更したいメニューをマウスで開き、希望のショートカートを実際に押す</li>
<li>ひと通りのカスタマイズが終わったら、can_change_acceslのチェックを外す</li>
</ol>
<p>この方法は、Ubuntu 11.04あたりから機能しません。</p>
<p>前述のgsettingsを試してみましたが、それでも11.04では変更できませんでした。11.10は確認する前に削除してダウングレードしたのでは不明です。</p>
<pre>gsettings set org.gnome.desktop.interface can-change-accels true</pre>
<p>.</p>
<p><strong>■ accelsファイルの直接編集</strong></p>
<p>GUIでメニューアクセスキーが変更できない場合には、他のマシンで変更した定義ファイルをコピーするか直接編集することなります。</p>
<p>幸い、私はVPSサーバーが10.04でGUIもいれていたので、そちらでカスタマイズした定義ファイルをコピーすることにしました。</p>
<p>定義ファイルは、~/.gnome2/accels 以下です。</p>
<p>geditの定義ファイルはGUI環境でコピー可能ですが、Nautilusの定義ファイルをコピーするにはNautilusが起動していないCUI環境で行う必要があります。</p>
<ol>
<li>他のマシンでカスタマイズ済みの定義ファイルを ~/ にコピーしておく</li>
<li>GUIをログアウト</li>
<li>Ctrl+Alt+F4でCUIログイン</li>
<li>mv ~/nautilus ~/.gnome2/accels/</li>
<li>CUIをログアウト</li>
<li>Ctrl+Alt+F8でGUIログイン</li>
</ol>
<p>.</p>
<p><strong>LibreOffice (OpenOffice.org)</strong></p>
<p>Emacsキー定義セットってあってもよさそうですが既存のものはないですね。</p>
<p>新しいPC環境を作るときに困らないように、キー定義を変更したらその都度エクスポートファイルをDropboxに出力するようにして、Emacs度を高めることにしています。</p>
<p>.</p>
<p><strong>FireFox</strong></p>
<p>KeySnailは他のどのアドオンよりFireFoxをEmacsにしてくれますが、なぜかFireFoxのアドオンライブラリには登録されていません。</p>
<p><a href="https://github.com/mooz/keysnail/wiki/keysnail-japanese" target="_blank">配布サイト</a>からダウンロードしたxpiファイルを、FireFoxにドラッグアンドドロップすることでインストールします。</p>
<p>.</p>
<p><strong>Google Chrome</strong></p>
<p>最近は、Emacs-mode を入れてます。</p>
<p>基本的には、gtk_key_themeによりメニュー、アドレス欄、テキストボックス編集はEmacsキーバインドが実現されています。アプリごとに補完する必要があるのは、Ctrl+Sで保存ダイアログで出さないことですがEmacs-modeでそれは実現できます。</p>
<p>しかし、残念なのはCtrl+Sが「リンクのインクリメンタルサーチ」であることです。<br />
インクリメンタルサーチの実現に固執した開発者のマスターベーションでしかありません。普通にCtrl+Sでテキスト検索となってくれるだけで充分だったのに。その点、FireFoxのKeySnailはよくできてます。</p>
<p>.</p>
<p><strong>Thunderbird</strong></p>
<p>KeySnailはThunderbird用もあるのですが、試したときのバージョンが古かったのかインストールできませんでした。最新バージョンは試してません。</p>
<p>.</p>
<p><strong>WordPressプラグインTinyMCE</strong></p>
<p>最近になりようやく気付きました。ビジュアル編集モードのCtrl+Fが検索窓になってしまうのはこいつの所為で、WordPressオリジナルのビジュアルモードであれば、gtk_key_themeにしたがってCtrl+Fでカーソル右を保持していました。</p>
<p>テーブル編集のために導入したものの、ついCtrl+Fを打ち検索窓を開いてしまうのでほとんど生HTMLモードでテキスト編集していました。まったく本末転倒です。</p>
<p>プラグインはjavascriptで記述されているので修正は可能です。</p>
<p>wp-content/plugins/tinymce-advanced/mce/searchreplace /editor_plugin.js から”ctrl+f”を探して”ctrl+s”に書き換えるだけです。でも、バージョンアップの度に書き換えるは面倒かな・・・</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rapidexp.com/wordpress/2011/11/21/ubuntu-emacs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubuntu NautilusにsvnのGUI環境</title>
		<link>http://www.rapidexp.com/wordpress/2011/11/20/svn-gui/</link>
		<comments>http://www.rapidexp.com/wordpress/2011/11/20/svn-gui/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 06:08:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.rapidexp.com/wordpress/?p=13</guid>
		<description><![CDATA[すでに私はUbuntuは11.04に戻していますが、11.10では未だRabbitVCSが使えないようです。 では11.04でRabbitVCSを再び使うかというと、どうにもその気にはなれません。Nautilusでフォル [...]]]></description>
			<content:encoded><![CDATA[<p>すでに私は<strong>Ubuntu</strong>は11.04<strong>に</strong>戻していますが、11.10では未だRabbitVCSが使えないようです。</p>
<p>では11.04でRabbitVCSを再び使うかというと、どうにもその気<strong>に</strong>はなれません。<strong>Nautilus</strong>でフォルダを開く動作が遅くなりすぎるんですよね。</p>
<p>そもそも私の場合、サーバーの開発ディレクトリをローカル<strong>に</strong>sshfsでマウントしていますから、ディレクトリ一覧もレポジトリもssh経由なため、RabbitVCSのようなUIではアイコンを描画<strong>に</strong>とてつもない時間がかかってしまうわけです。</p>
<p>仕方なく、しばらくコマンドラインでsvcと付き合いましたが、やっぱりGUIが欲しい・・・</p>
<p><span style="color: white;">.</span></p>
<p><strong>■ <strong>nautilus</strong>-script-collection-svn</strong></p>
<p>改めてググってみるとRabbitVCSをはじめTortoiseSVNクローンのGUIツール<strong>に</strong>混じって、<strong>Nautilus</strong>のスクリプトという、とってもシンプルなものを見つけたのでインストールしてみました。</p>
<pre>sudo apt-get install <strong>nautilus</strong>-script-collection-svn</pre>
<p>スクリプトを<strong>Nautilus</strong>の個人フォルダへ移します。</p>
<pre>cp -r /usr/share/<strong>nautilus</strong>-scripts/Subversion ~/.gnome2/<strong>nautilus</strong>-scripts/</pre>
<p>こんな感じ<strong>に</strong>コマンドを選択できるよう<strong>に</strong>なりました。</p>
<p align="center"><img src="../../images/wp/nautilus-svn.png" alt="" /></p>
<p>フォルダやファイルのアイコン<strong>に</strong>インジケータはありませんが、必要なとき<strong>に</strong>Updateをすれば良いだけのことです。どうせRabbitVCSだってUpateをしてあげなければ信用できない情報でした。</p>
<p>スクリプトの中身はZenityを使ったコマンドの結果をダイアログ<strong>に</strong>表示するだけの単純なものです。自分でスクリプトを追加するときのサンプル<strong>に</strong>もなりますね。</p>
<p><span style="color: white;">.</span></p>
<p><strong>■ Commitスクリプトの修正</strong></p>
<p>しかし、さっそくCommitを試して硬直しました。<br />
テキスト編集ダイアログが表示されるのは良いのですが、ここでコミットをキャンセルする<strong>に</strong>はどうすれば良いのだろうかと小一時間 www</p>
<p>スクリプトを確認すると、返り値$?で0を判定していますが、表示させているダイアログが複数行テキスト編集の –text-info –editableなのでキャンセルする方法がありません。OKを押そうがEscで閉じようが0が返ります。</p>
<p>そこで、以下のよう<strong>に</strong>１行入力ダイアログ<strong>に</strong>変更しました。LOGMESSAGEの取得もifブロックの中<strong>に</strong>移す必要があります。</p>
<p>~/.gnome2/<strong>nautilus</strong>-scripts/Subversion/Commit （部分）</p>
<pre>zenity --entry --title "Subversion: Commit" --width=600  --window-icon="$ICONPATH" &gt; $LOGMESSAGEFILE

if [ $? -eq 0 ] ; then
    LOGMESSAGE=`cat $LOGMESSAGEFILE`
    svn commit -m "$LOGMESSAGE" "$@" &gt; $LOGFILE</pre>
<p><span style="color: white;">.</span></p>
<p><strong>■ Meld の追加</strong></p>
<p>svnコマンドの結果を表示するだけのDiffは苦手なので、以下のスクリプトを作成して追加してみました。</p>
<p>~/.gnome2/<strong>nautilus</strong>-scripts/Subversion/Meld</p>
<pre>#!/bin/bash
if [ $# -ne 0 ]; then
    if [ -d $1 ]; then
        # サブディレクトリ選択時
        cd $1
    fi
fi
meld .</pre>
<p>Meldは.svnフォルダを認識するので、 “meld .” とするだけでそのディレクトリ以下を再帰的<strong>に</strong>比較してくれます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rapidexp.com/wordpress/2011/11/20/svn-gui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rooted Xperia arc 2.3.4への道のり</title>
		<link>http://www.rapidexp.com/wordpress/2011/11/15/rooted-xperia-arc-2-3-4%e3%81%b8%e3%81%ae%e9%81%93%e3%81%ae%e3%82%8a/</link>
		<comments>http://www.rapidexp.com/wordpress/2011/11/15/rooted-xperia-arc-2-3-4%e3%81%b8%e3%81%ae%e9%81%93%e3%81%ae%e3%82%8a/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 06:11:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.rapidexp.com/wordpress/?p=16</guid>
		<description><![CDATA[結論から言うと、とっても苦労しましたw 前提は、Rooted な2.3.3で、ディザリングとカメラ無音化をしていたもの。 作業環境はUbuntuのVirtualBoxにインストールしたWindows XPにて。 Tita [...]]]></description>
			<content:encoded><![CDATA[<p>結論から言うと、とっても苦労しましたw</p>
<p>前提は、<strong>Rooted</strong> な2.3.3で、ディザリングとカメラ無音化をしていたもの。<br />
作業環境はUbuntuのVirtualBoxにインストールしたWindows XPにて。</p>
<ol>
<li>Titanium Backupで凍結していたシステムアプリをすべて解凍</li>
<li><a href="http://zinizumi.blog29.fc2.com/blog-entry-783.html" target="_blank">こちら</a>を参考にbuild.propをもとに戻す</li>
<li>2.3.4へアップデート！</li>
</ol>
<p>で済めばよかったのですが、プログレスバーの最後でケラれました。</p>
<ol start="4">
<li>ディザリングのために追加したhostapdを削除</li>
<li>2.3.4へアップデート！</li>
</ol>
<p>としてもダメ。</p>
<p>仕方がないので<a href="../2011/08/18/xperiaarc/">前回と同じように</a>ちゃぶ台返しを決行 (ノ｀Д´)ノ彡┻━┻</p>
<ol start="6">
<li>Titanium Backupでアプリとデータをフルバックアップ</li>
<li>FlashToolで2.3.2へ初期化</li>
<li>2.3.4へアップデート・・・しかし、このあたりで23時を超え、サーバーが人大杉状態に</li>
<li>辛抱強く再ダウンロードをくり返して何とかアップデート完了</li>
</ol>
<p>あとは、<a href="http://forum.xda-developers.com/showthread.php?t=1320350" target="_blank">これで</a>さくっとrootをとってTitanium Backupでアプリやデータを復元すればおしまい・・・</p>
<ol start="10">
<li>とはいかず、PCにUSBつなげてrunme.batを実行するも途中で止まる Σ(´Д｀；)</li>
</ol>
<p>ええっと思って「adb shell」を実行してみるとデバイスを認識してない。ああ、USBドライバが必要なのか・・・どこ？ 最近のSDKってusbフォルダがない？</p>
<p>「<strong>Xperia</strong> <strong>arc</strong> USBドライバ」でググるとSony Ericsson PC Companiaonに同梱とのこと。<br />
あの手の自動インストール画面を見ると（特にSonyのは）拒否反応を起こし、インストールしたことも触ったこともなかったのが悪かった・・・</p>
<ol start="11">
<li>Sony Ericsson PC Companionをインストール（後で、アンインストールすればいいや）</li>
<li>adb shellを試す・・・が、プロンプトが返ってこないΣ(´Д｀；)</li>
</ol>
<p>人様のブログでは、いとも簡単にrootが取れるようなことが書いてあり、ROMから復元したスマホに環境の違いはあり得ない。</p>
<p>ということで、私のPC環境・・・UbuntuのVirtualBoxでWindows xpのどこがネック？</p>
<p>と悩んでも仕方ないので、翌日・・・</p>
<ol start="13">
<li>Windows 7 マシンを用意</li>
<li>Windows 7 にSony Ericsson PC Companiaonをいれる</li>
<li>Windows 7 を再起動</li>
<li>USBでつなぐ</li>
<li>adb shellを試す・・・と、つながる (´∀｀)</li>
<li>runme.batを実行</li>
</ol>
<p>でやっとこさrootが取れました。</p>
<p><span style="color: white;">.</span></p>
<p>rootさえ取れれば、Titanium Backupでデータごと復元できる。<br />
ああ～、root取っててよかったあ（苦労の原因がrootであることはry）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rapidexp.com/wordpress/2011/11/15/rooted-xperia-arc-2-3-4%e3%81%b8%e3%81%ae%e9%81%93%e3%81%ae%e3%82%8a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>11.10から11.04へのダウングレード！</title>
		<link>http://www.rapidexp.com/wordpress/2011/11/05/11-10%e3%81%8b%e3%82%8911-04%e3%81%b8%e3%81%ae%e3%83%80%e3%82%a6%e3%83%b3%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89%ef%bc%81/</link>
		<comments>http://www.rapidexp.com/wordpress/2011/11/05/11-10%e3%81%8b%e3%82%8911-04%e3%81%b8%e3%81%ae%e3%83%80%e3%82%a6%e3%83%b3%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89%ef%bc%81/#comments</comments>
		<pubDate>Sat, 05 Nov 2011 06:13:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.rapidexp.com/wordpress/?p=18</guid>
		<description><![CDATA[ダウングレードと言っても、初期化しての11.04新規インストールです。 仕事に必要なエディタ環境はプログラムごとDropboxフォルダにインストールして起動していましたし、編集対象のプログラムもクラウドなので、ノートPC [...]]]></description>
			<content:encoded><![CDATA[<p>ダウングレードと言っても、初期化しての11.04新規インストールです。</p>
<p>仕事に必要なエディタ環境はプログラムごとDropboxフォルダにインストールして起動していましたし、編集対象のプログラムもクラウドなので、ノートPCを初期化することに躊躇いはありませんでした。</p>
<p><span style="color: white;">.</span></p>
<p>Ubuntu 11.10を見限った理由を列挙すると・・・</p>
<ol>
<li>Touchpad-indicatorがまともに機能しない。USBマウスを抜き差しすればタッチパッドは無効になる。</li>
<li>Unityアイコンの右クリックメニューが表示の１回目は選択できない。一度閉じると選択できる。</li>
<li>xyzzy via wineで日本語フォントが指定できない。同名フォントが英語→日本語の順でリストされるので、手で指定しても再起動で非日本語となる。</li>
<li>何かのはずみで突然Xが終了する。</li>
<li>Canon MG5130で印刷ができない。インストーラがUSB接続のプリンタを見つけることができない。</li>
</ol>
<p>11.04に戻しても３の同名フォントは並んでいましたが、先頭が日本語フォントなので顕在化してませんでした。</p>
<p>4はグラフィック的な「何か」を表示しようとしたタイミングで落ちることがあるということで、まあ、安心して作業できないわけですが、プログラム仕事の最中はテキストエディタだけなので、痛い目には合わずに済みました。</p>
<p>こんな状態でも我慢して使っていたのですが、月末でもろもろ印刷する要件があり5に気づきました。印刷しなければお金をもらえないものありますので、ちゃぶ台返しの決心につながった次第です。</p>
<p><span style="color: white;">.</span></p>
<p>これまでもアップデートで失ったものは少なくありませんが（笑）、今回ほどひどいのは初体験でした。</p>
<p>次の長期サポートLTS版までに何とかなってくれるんでしょうか？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rapidexp.com/wordpress/2011/11/05/11-10%e3%81%8b%e3%82%8911-04%e3%81%b8%e3%81%ae%e3%83%80%e3%82%a6%e3%83%b3%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89%ef%bc%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taskerその9: フェードアウト・スリープタイマー</title>
		<link>http://www.rapidexp.com/wordpress/2011/10/29/tasker-speep-timer/</link>
		<comments>http://www.rapidexp.com/wordpress/2011/10/29/tasker-speep-timer/#comments</comments>
		<pubDate>Sat, 29 Oct 2011 06:14:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.rapidexp.com/wordpress/?p=20</guid>
		<description><![CDATA[利用しているミュージックプレーヤのPowerAMPにはスリープタイマー機能がついていますが、いろいろと不満があります。 メニューの奥なので設定が面倒くさい。残り時間の確認も同じ。 60分までは10〜15分きざみなのに、次 [...]]]></description>
			<content:encoded><![CDATA[<p>利用しているミュージックプレーヤのPowerAMPには<strong>スリープタイマー</strong>機能がついていますが、いろいろと不満があります。</p>
<ul>
<li>メニューの奥なので設定が面倒くさい。残り時間の確認も同じ。</li>
<li>60分までは10〜15分きざみなのに、次はいきなり120分しか設定できない。</li>
<li>いきなりブツっと切れるので、結局目が覚めてしまう。</li>
</ul>
<p>ということで、<strong>フェードアウト</strong>して音楽再生を止めてくれるアプリを <strong>Tasker</strong> で作ってみました。</p>
<p>せっかくなので任意の時間も設定したい。</p>
<p><strong>Tasker</strong> の Variable Queryを試したところ、 UI で入力した値を変数に受け取ったところでタスクが終了してしまい、それ以降の記述は実行されません。</p>
<p>困ったな〜〜と十数分。おっと、思いつきましたよ！ ( ･`ω･´)</p>
<p><span style="color: white;">.</span></p>
<p><small>色付きの文字はマウスオーバーで説明が表示されます</small></p>
<ol>
<li><strong><a title="独立したタスクはツールバーの稲妻ボタンから作成します。">[Task] Sleep Timer</a></strong><br />
ホームにショートカットを作成して<strong>スリープタイマー</strong>の開始するためのタスクです。１回押すと初期値の30分がセットされ、さらにくり返して押すと10分ずつ加算されます。カウントダウン途中での追加にも使用できます。Task &gt; If &gt; %SLEEP !Set<br />
<a title="初期値に30分をセット">Variable &gt; Variable Set &gt; %SLEEP to 30</a><br />
Task &gt; Else<br />
<a title="二度押しで10分を加算">Variable &gt; Variable Set &gt; %SLEEP to %SLEEP+10 (Do Maths)</a><br />
Task &gt; End If<br />
Alert &gt; Flash &gt; Text: Set to %SLEEP min<br />
Alert &gt; Notify &gt; Title: Sleep Timer / Text: Set to %SLEEP min<br />
<strong>Tasker</strong> &gt; Profile Status &gt; <strong>“Sleep Timer”</strong> Set On<br />
<strong>Tasker</strong> &gt; Profile Status &gt; <strong>“Sleep Timer Notification”</strong> Set On</li>
<li><strong>[Profile] Sleep Timer</strong><br />
５分おきに通知バーの残り時間を更新し、0分を切るとボリュームを少しずつ下げて最後に音楽再生を停止するタスク本体です。普段はステータス状態を無効にしておき、1のショートカットで動き出します。[Context]<br />
<a title="通知バーの残り表示を更新させるため、5分おきのくり返しタスクを作ります">Time &gt; Repeat 5 min</a></p>
<p><a title="Profileに紐づくタスクは空のまま名前を付けません。1のSleep Timerタスクと混同しないよう注意してください。">[Task]</a><br />
Task &gt; If &gt; %SLEEP &gt; 0<br />
<a title="残り時間変数から5を減じて通知バーを再表示させます">Variable &gt; Variable Set &gt; %SLEEP to %SLEEP-5 (Do Maths)</a><br />
Alert &gt; Notify &gt; Title: Sleep Timer / Text: Last %SLEEP min<br />
Task &gt; Stop<br />
Task &gt; End If<br />
<strong>Tasker</strong> &gt; Profile Status &gt; <strong>“Sleep Timer”</strong> Set Off<br />
<strong>Tasker</strong> &gt; Profile Status &gt; <strong>“Sleep Timer Notification”</strong> Set Off<br />
<a title="音量調整する前の値を変数に記憶しておきます。大文字のグローバル変数を使っているのは、他の似たような音量調整タスクでも同じ変数を使うことで調整中の値を記憶させないためです。">Vaiable &gt; Variable Set &gt; %VOLM0 to %VOLM If %VOLM0 !Set</a><br />
<a title="UserGuideには16:1:-1という書き方も載っていましたが機能しませんでした。">Task &gt; For &gt; %idx = 1:16</a><br />
<a title="仕方ないので逆順になるように引き算しています">Variable Variable Set &gt; %vol To 17-%idx (Do Maths)</a><br />
<a title="音量が上がってしまわないように、初期音量より大きい値はスルーさせています。">Audio &gt; Media Volume &gt; %vol If %vol &lt; %VOLM0</a><br />
<a title="1分ごとにゆっくりと音量を下げています">Task &gt; Wait &gt; 1 min if %vol &lt; %VOLM0</a><br />
Task &gt; End For<br />
<a title="PowerAMPならば、SETTINGS &gt; Headset Options &gt; Respond To Headset Button をチェックするとコントロールできます。また、Beep は必ず消しておきましょう（笑）">Media &gt; Media Control &gt; Stop</a><br />
Alert &gt; Notify Cancel &gt; Title: Sleep Timer<br />
<a title="プレーヤーが完全停止する前に音量を戻してしまわないようウェイトを入れます。">Task &gt; Wait &gt; 5 sec</a><br />
Audio &gt; Media Volume &gt; %VOLM0<br />
Variable &gt; Variable Clear &gt; %VOLM0<br />
Variable &gt; Variable Clear &gt; %SLEEP</li>
<li><strong>[Profile] Sleep Timer Notification</strong><br />
通知バーの残り時間表示を選択するとカウントダウンをキャンセルできます。[Context]<br />
Event &gt; UI &gt; Notification Click &gt; Title: Sleep Timer</p>
<p>[Task]<br />
<strong>Tasker</strong> &gt; Profile Status &gt; <strong>“Sleep Timer”</strong> Set Off<br />
<strong>Tasker</strong> &gt; Profile Status &gt; <strong>“Sleep Timer Notification”</strong> Set Off<br />
Variable &gt; Variable Clear &gt; %SLEEP</li>
</ol>
<p><span style="color: white;">.</span></p>
<p>5分きざみのリピートを利用しているので、設定した残り時間は最大５分の誤差が生じますし、最後の<strong>フェードアウト</strong>（10分前後）も考慮していません。</p>
<p>意識を失っているときの利用が前提なので、このくらいのアバウトさで十分ではないかと・・・・</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rapidexp.com/wordpress/2011/10/29/tasker-speep-timer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taskerその8: Keyguard Off は利用不可</title>
		<link>http://www.rapidexp.com/wordpress/2011/10/22/tasker-keyguard/</link>
		<comments>http://www.rapidexp.com/wordpress/2011/10/22/tasker-keyguard/#comments</comments>
		<pubDate>Sat, 22 Oct 2011 06:17:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.rapidexp.com/wordpress/?p=23</guid>
		<description><![CDATA[ようやく標題の結論に達しました（笑 以前から「原因不明」として書いてきた現象は、Taskserで画面オフ後のキーガード（画面ロック）を制御をしていると、Homeボタンを押したときにときどきロック解除画面が現れてしまい、そ [...]]]></description>
			<content:encoded><![CDATA[<p>ようやく標題の結論に達しました（笑</p>
<p>以前から「原因不明」として書いてきた現象は、Taskserで画面オフ後のキーガード（画面ロック）を制御をしていると、Homeボタンを押したときにときどきロック解除画面が現れてしまい、それを解除すると、電源オンの度にロック解除が必要になる（<strong>Tasker</strong>でロックを遅延させているはずなのに）と言うものでした。</p>
<p><strong>Tasker</strong>標準の<strong>Keyguard</strong> <strong>Off</strong>はAndroid 2.2以降、画面オフ時には機能しないので、Secure Settingsプラグインに差し替えて利用してましたが、この現象はどちらでも同じように発生します。</p>
<p>自分の作ったタスク設定にどこか穴があるのではないかと試行錯誤してきたのですが、どうもこれは回避できない問題であると、ようやく自分自身を納得させることができました。</p>
<p><span style="color: white;">.</span></p>
<p>そう思えるようになったのは、「Homeボタンを押したときにときどき」という曖昧な状況を、「<strong>ホームアプリがメモリから消えてるときにHomeボタンを押したとき</strong>」と把握したからです。</p>
<p><span style="color: white;">.</span></p>
<p>現象の再現には、おそらく Widget Lockerの併用が必要です。</p>
<p>Widget Lockerはシステムに画面ロックがかかっていても、画面オンで（ロック画面より先に）自分自身を表示し、カスタムロック画面に配したウィジットやショートカットからアプリをはじめて起動したときにロック画面を表示させます。</p>
<p><strong>Tasker</strong>の<strong>Keyguard</strong> <strong>Off</strong>も本来ならシステムにロック画面がかかってる状態を何らかの方法で覆しています。具体的に何をやっているか知りませんが、いずれもAndroidシステムの正規APIではないと（OSバージョンにより動作しないことからも）想像できます。</p>
<p>使用メモリが溢れてホームアプリが消えたときにHomeボタンを押すと、改めてホームアプリが起動しようとします。その起動がWidgetLockerの制御にかかってロック画面の出現を呼んでいると考えられます。</p>
<p><strong>と、ここまで推察したとこで、どうにもならないと結論付けるしかありません。</strong></p>
<p>いずれも非正規な（と考えられる）制御がバッティングしているわけですから、<strong><strong>Tasker</strong>の<strong>Keyguard</strong> <strong>Off</strong>とWidgetLockerの相性</strong>（この言い訳用語、Windows登場当時にはよく使われましたね）としか言いようがないからです。</p>
<p><span style="color: white;">.</span></p>
<p><strong>■Password/PIN制御ならOK!</strong></p>
<p><strong>Keyguard</strong>の代用になる画面ロック機能を探さなければなりません。<strong>Tasker</strong>に備わっている独自のLock機能はシンプルでよいのですが、解除されたかどうかを<strong>Tasker</strong>自身で感知することできないので代わりにはなりません。</p>
<p><a href="../2011/10/22/tasker-keyguard/wordpress/2011/10/22/tasker-3g-www/">３G切断もあきらめ</a>、画面ロックの制御もあきらめてしまったら、自分が<strong>Tasker</strong>を導入した動機のすべてを失ってしまいます（笑）</p>
<p><span style="color: white;">.</span></p>
<p>まて！ <strong>Keyguard</strong> <strong>Off</strong> は「本来ならシステムにかかってる画面ロックを何とかする」機能だけど、<strong>Password/PIN はロックのかかっていないシステムをパスワード指定でごく当たり前にロックする</strong>機能では？</p>
<p>ということで、Android のセキュリティ設定をロックしない状態に戻し、<strong>Tasker</strong> プラグイン Secure Settings の Password/PIN を利用してみました。はい、OKでした。</p>
<p><span style="color: white;">.</span></p>
<ol start="5">
<ol start="5">
<li><strong>[Task] Delay Lock</strong><br />
[Properties]<br />
Collishion Handling &gt; Abort Existing Task[Task]<br />
<a title="WidgetLocker Unlockedから呼ばれたときWait監視を終了">Task &gt; Stop If %SCREEN ~ on</a><br />
Task &gt; Wait 10m<br />
<a title="職場では4時間、それ以外では10分でロック。変数%LOCATIONは別途Cell Nearでセット">Task &gt; Wait 4h, If %LOCATION ~ work</a><br />
<a title="事前にAndroid側でロック設定するのではなく、パスワードを含めたセットをここで行う">Plugin &gt; Secure Settings &gt; Password/PIN &gt; パスワードを設定</a></li>
<li><strong>[Profile] Display <strong>Off</strong></strong><br />
[Context]<br />
Event &gt; Display &gt; Display <strong>Off</strong>[Task]<br />
<a title="WidgetLockerをロック解除せずに画面オフしたときを除外">Task &gt; Stop &gt; If %WIDGETLOCKER ~ locked</a><br />
<a title="WidgetLockerをアイコン非表示で運用するためのおまじない">3rd Party &gt; WidgetLocker &gt; Activate</a><br />
<a title="自宅以外では、画面オフしてしばらくすると画面ロックさせるめのWait監視をスタートする">Task &gt; Perform Task &gt; “Delay Lock” if %LOCATION !~ home</a></li>
<li><strong>[Profile] Display On</strong><br />
[Context]<br />
Event &gt; Display On[Task]<br />
<a title="WidgetLockerのカスタムロック画面表示中であることを判別するための変数をセット">Variable &gt; Variable Set &gt; %WIDGETLOCKER to locked</a></li>
<li><strong>[Profile] Widget Locker Unlocked</strong><br />
[Context]<br />
Event &gt; 3rd Party &gt; Widget Locker &gt; Unlocked[Task]<br />
Variable &gt; Valiable Clear &gt; %WIDGETLOCKER<br />
<a title="WidgetLockerのロックを解除したら、Wait監視タスクを終了させる">Task &gt; Perform Task &gt; “Delay Lock”</a></li>
<li><strong>[Profile] Display Unlocked</strong></li>
</ol>
</ol>
<p>[Context]<br />
Event &gt; Display &gt; Display Unlocked</p>
<p>[Task]<br />
<a title="Keyguard Offは目眩ましですが、これはシステムのロックを正しく解除する">Plugin &gt; Secure Settings &gt; Password/PIN &gt; Disable</a></p>
<p><span style="color: white;">.</span></p>
<p><strong>追記</strong></p>
<p>Password/PINを利用したこの設定でも、ホームアプリがメモリから消えてるときにHomeを押すとロック解除画面が出現しました。しかし、<strong>Keyguard</strong>と違うのはこのロック画面を無視すれば（電源ボタンでオフにするとか）、もうロック画面は出てきません。Password/PINならOKというのはこれで証明されました。</p>
<p>この「ホームアプリがメモリにないときにHomeを押すとロック画面が出現する」のは、純粋にWidgetLockerのバグと言えますから、進言すれば解消されるかもしれませんね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rapidexp.com/wordpress/2011/10/22/tasker-keyguard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taskerその7: 画面オフで3G切断の効果(www</title>
		<link>http://www.rapidexp.com/wordpress/2011/10/22/tasker-3g-www/</link>
		<comments>http://www.rapidexp.com/wordpress/2011/10/22/tasker-3g-www/#comments</comments>
		<pubDate>Sat, 22 Oct 2011 06:00:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.rapidexp.com/wordpress/?p=25</guid>
		<description><![CDATA[タイトルに草を生やした時点でもう結果は見えていますね(www 結果は以下の通りです。 グラフは青=常時接続、黄=メール通知監視、緑＝15分に1分の定期接続で、それぞれ４日分の使用の平均で曜日はバラつくように配慮したつもり [...]]]></description>
			<content:encoded><![CDATA[<p>タイトルに草を生やした時点<strong>で</strong>もう結果は見えていますね(www</p>
<p>結果は以下の通りです。<br />
グラフは青=常時接続、黄=メール通知監視、緑＝15分に1分の定期接続<strong>で</strong>、それぞれ４日分の使用の平均<strong>で</strong>曜日はバラつくように配慮したつもりです。</p>
<p align="center"><img src="../../images/wp/battery-log.png" alt="バッテリーログのグラフ" /></p>
<p>なるべく同じような使用状況になるように気をつけましたので、日ごとを見ると変動はバラバラ<strong>で</strong>したが４日平均は十分に均一化されました（笑</p>
<p><span style="color: white;">.</span></p>
<p>利用環境の詳細は以下です。</p>
<table>
<tbody>
<tr>
<td>機種/OS</td>
<td>Xperia arc / Android 2.3.3</td>
</tr>
<tr>
<td valign="top"><strong>3G</strong>オフ</td>
<td>Dispaly Offの30秒後に<strong>3G</strong>をオフ<br />
Display Onでは<strong>3G</strong>オンにしない（WidgetLocker使用）<br />
WidgetLocker Unlocked <strong>で</strong><strong>3G</strong>オン</td>
</tr>
<tr>
<td valign="top">使用状況</td>
<td>仕事中も音楽プレーヤーとして使用<br />
通勤往復1時間半はBluetoothも使用<br />
GPSは常にオン（ただしGPSを利用するアプリは全く使用せず）<br />
Googleリーダーなどのネットはほどほどに利用<br />
<strong>Tasker</strong>の設定変更は禁止（没頭して電力を消費するから・笑）<br />
夜明けに目覚めたときに充電開始して二度寝し、充電完了してから出勤</td>
</tr>
<tr>
<td>spモード</td>
<td>不使用（Titanium Backup<strong>で</strong>凍結）</td>
</tr>
<tr>
<td>GMailアプリ</td>
<td>不使用（Titanium Backup<strong>で</strong>凍結）</td>
</tr>
<tr>
<td valign="top">K-9 Mail</td>
<td>GMailをIMAP<strong>で</strong>利用<br />
同期フォルダの同期間隔: しない<br />
プッシュ接続時の同期: する<br />
<small>※頻繁にメールがあるなら同期設定は逆にしたほうが省電力かもしれません</small></td>
</tr>
<tr>
<td valign="top">メール通知</td>
<td>GMail → Yahoo転送 → spモードに携帯通知<br />
「spモードメール」は使用せず「メール通知Free」<strong>で</strong>監視<br />
メール通知の通知音やLEDはすべてオフ<br />
メール通知のNotification<strong>で</strong><strong>3G</strong>を1分間オンにすること<strong>で</strong>K-9 Mailが受信<br />
K-9 Mail側の通知音とLEDを利用</td>
</tr>
<tr>
<td valign="top">定期監視</td>
<td>15分に１分のタスクを作成<br />
%SCREEN ~ off なら１分間<strong>3G</strong>をオンにする</td>
</tr>
</tbody>
</table>
<p><span style="color: white;">.</span></p>
<p>K-9 MailのGmailプッシュは<strong>3G</strong>回線による信号<strong>で</strong>、「メール通知」が監視しているspモードメールのプッシュは通常電話回線の信号なわけですが、ほとんど差がないようです。もしくはその差を「メール通知」アプリの監視が相殺してるかです。<br />
プッシュ待ちでは双方向の通信をしているわけではないから？電力を消費していないのでしょうか。</p>
<p>とにもかくにも、Xperia arcは十分に省電力チューンされているということですね。</p>
<p><span style="color: white;">.</span></p>
<p>これ<strong>で</strong>晴れて<strong>3G</strong>オフの呪縛から解放され、<strong>Tasker</strong>の設定が簡単になりました（笑</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rapidexp.com/wordpress/2011/10/22/tasker-3g-www/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

