admin on 5月 18th, 2012

HTML5のフォームバリデーションはもう使ってますか?

HTML5では、javascriptを書かずただHTMLタグに以下のような属性を追加するだけで、フォームのバリデーション機能が付加されることになっています。対応ブラウザでは、確認した範囲でDOCTYPE宣言はHTML4のままでも機能します。

属性/タイプ バリデーション内容
required 必須入力のチェック
placeholder=”表示文字列” 空の場合の表示文字列
type=”email” メールアドレスバの妥当性
type=”url” URLの妥当性
textarea maxlength textareaの最大文字数

これらを使うとどんなUIになるか、テストフォームを作成してみました。

Firefox, ChromeなどIE以外のブラウザで(IEしかないならインストールして)、このテストフォームの「確認」ボタンをクリックしてみてください。

required属性を加えたテキストボックスをFireFoxで空打ちすると次のメッセージがポップアップします。

Chromeでは・・・

素晴らしい! こんな便利な拡張を使わない手はないですよね。

しかし、IEがこの体たらくでは、使いたくても使えないと言ったところでしょうか。

基本バリデーションに対応したIE10がリリースされた後、これらの使用は次第に広まるのでしょう。
とは言え、以前のIEに対する互換性問題は相も変わらずついて回るわけで、IE10が出たところで何ら状況は変わらないとも言えます。(´・ω・`)

jquery.html5form-1.5ja.js

ということで・・・実は、上記テストフォームはIEでも機能する仕込みを入れてあり、IEで確認ボタンを押すとちゃんとフキダシが開きます。ここからがこのエントリーの本題です。d( ・`ω・´) えへん

.

ネタ元としては こちらで配布している jQuery プラグイン html5-form を組み込んでいます。

ただしhtml5-formそのままでは問題があったので以下を修正しました(ベースは v1.5 / 12-04-2011)。

  1. submitに成功したときに遷移しないバグを修正
  2. select required が機能してなかったバグを修正
  3. valueがnullでない場合もplaceholderが表示されてしまうバグを修正
  4. button type=”sumit”でも機能するように機能追加
  5. requied 属性を持つフォーム部品のclassにrequired を追加
  6. textarea の maxlength において、IME を介した入力にも擬似的に対応
  7. responseDiv の1文字目が “.” のときは部品の後ろに指定クラスを自動追加
  8. 以下のオプションのデフォルトを変更
    responseDiv : “.html5form-response”,
    allBrowsers : false
  9. オプションasync と機能を削除
  10. オプション messages と各国語メッセージを削除
  11. デフォルトのメッセージを日本語とし、select requied を別メッセージに
  12. オプション unselectedMessage を追加
  13. IE10をモダンブラウザと判定追加f

修正版はこちらからダウンロードできます。
オリジナルと同じく MIT と GPL のデュアルライセンスで扱ってください。

jquery.html5form-1.5ja.js
jquery.html5form-1.5ja-min.js

組み込み方

1. HTMLヘッダでjQuery本体とhtml5-formを読み込みます。

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script type="text/javascript" src="jquery.html5form-1.5ja-min.js"></script&tg;

2. フォーム要素に対して.html5form()を指定します。
jquery.html5form-1.5ja.js ではオプション初期値を修正していますので通常はオプション指定の必要ありません。また、オリジナル版のようにid指定ではなくform一般に指定して構いません。

$(function() {
  $('form').html5form();
});

requiredクラス

修正版ではrequired属性をクラスに複写します。
必須項目を色分けしたいときには擬似クラスと通常クラスの両方を指定してください。この2つは1つにまとめることはできません。擬似クラス指定でエラーになると通常クラス指定も無視されてしまうからです。

:required { background-color: lightyellow; }
.required { background-color: lightyellow; }

IME入力のmaxlength

IME入力そのものをキャンセルする方法がないので、オーバーした文字を末尾から削除してカーソルも末尾に飛ぶ仕様で機能追加しました。新規入力に問題はないですが、段落途中にIMEで文字を追加したとき予想外の動きで違和感あるかと思います。
IE使いの苦情は無視する方向で、文字数を制限することを優先しました。

responseDivの自動挿入

オリジナルの html5-form はid指定のコンテナをエラー出力用に用意する必要がありました。
1ページにformが1つとは限りませんから、オリジナルの仕様ではページごとにjavascriptを書き換える必要がありました。あくまでIEのHTML5代替に過ぎないので、できるだけメンテナンスフリーとしたく、共通の初期化スクリプトにform汎用指定ができるようにしました。
エラー出力は、該当のフォーム部品の後ろにdiv要素を自動追加して出力します。従来通りに特定のコンテナに出力したいときは、responseDiv オプションをid指定としてください。

cssによるフキダシ

フォーム部品の直後に挿入されるエラーメッセージは、次の単純な構造です。

<input type="text" name="name" value="" requied>
<div class="html5form-response"><p>このフィールドを入力してください</p></div>

これを css 記述だけでフキダシ表現にすることできます。
次を css に加えてください。p要素がフキダシ本体で、divコンテナは色違いの上ボーダと左ボーターにより生じる三角コーナーでヒゲを表現するのに使われています。

.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 */
}

表示されたフキダシが画面クリックで消えるように、jQueryスクリプトを加えます。

  // フキダシをクリア
  $('body').click(function() { $('.html5form-response').remove(); });

カスタムメッセージ

使わないデータを内蔵するのは趣味でないいので、日本語以外のメッセージは全て削除しました。
メッセージを変えたい場合はカスタムメッセージオプション(emptyMessage, unselectedMessage, emailMessage)を利用してください。inputとselectで異なるrequiredメッセージが指定できるように、unselectedMessageを加えてあります。

IE10の判定

allBrowsersオプションをfalseにすると、HTML5フォームバリデーション対応ブラウザでは何もせずにブラウザに任せるようになりますが、この判定はブラザの種別とバージョンで判断しており、v1.5のコードではIEは全バージョン制御対象となっていました。

IE10のプレリリースを見る限りこのプラグインと重複する部分は対応しているようですので、判定にIEを加えてバージョン10からはモダンブラウザと判定するようにしました。

その他の修正点

削除したオプションasyncはデフォルがtrueでしたが、これは追加のエラーをajaxで取得するもので応答するサーバープログラムが必要ですし、その結果でsubmitを制御する仕組みが正しく機能しているようには思われませんでした。

フレームワークのバリデーションを統合する

ウェブアプリケーションを作成する場合、HTML5のフォームバリデーションだけでは到底完結しません。

フレームワークによる画面遷移後のエラーメッセージはどのように処理していますか?

  1. フォームの上部または下部の一箇所に、とりあえず1つだけエラー表示
  2. フォームの上部または下部の一箇所に、すべてのエラーをまとめて表示
  3. 該当するフォーム部品ごとに、それぞれのエラーを表示

パターン1の処理を未だにしているような化石フレームワークは、すでに及びじゃないですね。

パターン3の処理をしてるなら、その出力を <div class=”html5form-response”><p>エラーメッセージ</p></div> に変えるだけです。
先に設定した css がこのエラーメッセージを同じフキダシ書式で表現してくれます。

画面遷移後のエラー表示で、エラー箇所にフォーカスが移動するように次を加えておきましょう。

  // 最初のエラーをフォーカス
  $('.html5form-response').eq(0).prev().focus().select();

.

いかがですか、IE10の普及を待たずに HTML5 のフォームバリデーションを導入する気になりましたでしょうか?

繰り返しますが、たとえIE10が普及しても古いバージョンのIEへの対策は避けて通れませんから、結局はここで述べたような代替を用意しなければなりません。

ならば、とっとと HTML5 の恩恵を受けて、時代の最先端を駆けましょうぞ! ( ・`ω・´)

Tags:

admin on 11月 25th, 2011

Ubuntuフォーラムの投稿インストール方法が記述されていたので試してみました。

惜しむらくは、投稿者がタイプミスして”10.11″と書いてしまっていて、11.10での解決方法かどうかが曖昧になってしまってることです。

また、投稿者は64bitでのダウンロードパスを書いていますが、自分のデスクトップは32bitだったので、パスを読み替えました。

ちなみに、インストールされているUbuntuが64bitか32bitかは、次のコマンドで確認できます。

uname -a

出力の最後に “x86_64 GNU/Linux” とあれば64bitで、そうでなければ32bitです。

.

FreeNXのダウンロードライブラリは http://de.archive.ubuntu.com/ubuntu/pool/main/e/esound/ で、すでにフォーラム投稿のバージョンより新しいものが登録されていましたが、今回はフォーラム投稿とバージョンを合わました。

ダウンロードしたのは次の3ファイルになります。

  • esound-common_0.2.41-8_all.deb
  • libesd0_0.2.41-8_i386.deb
  • esound-clients_0.2.41-8_i386

ということで、手順はフォーラム投稿のままですが・・・

wget http://de.archive.ubuntu.com/ubuntu/pool/main/e/esound/esound-common_0.2.41-8_all.deb
wget http://de.archive.ubuntu.com/ubuntu/pool/main/e/esound/libesd0_0.2.41-8_i386.deb
wget http://de.archive.ubuntu.com/ubuntu/pool/main/e/esound/esound-clients_0.2.41-8_i386.deb
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:freenx-team
sudo sed -i 's/oneiric/lucid/g' /etc/apt/sources.list.d/freenx-team-ppa-oneiric.list
sudo apt-get update && 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 freenx

これで無事FreeNXインストールすることができました。

.

そして、11.10のFreeNXサーバーにログインするためには 以前のエントリー で書いたように、Windows版のnomachineクライアントから接続するにはRun the following commandにUnity-2Dを指定する必要があります。

gnome-session ubuntu-2d

.

Ubuntu to FreeNX (追記)

UbuntuのNXクライアントQtNXからのアクセスする場合も、カスタムコマンドを指定しなければなりません。
しかし、TypeでCustomを選択することはできますが、Settingsボタンを押しても編集ダイアログが開かないのでカスタムコマンドをUIで設定することができません。

  1. QtNXのConfigure画面を開きます。
  2. PlatformをUNIX、TypeをCustomとします。
  3. Settingsを押して次のように設定したいのですが・・・
    /usr/bin/gnome-session --session ubuntu-2d
  4. Settingsを押しても何も開かないので仕方ないのでOKですべて閉じます。
  5. 設定ファイル ~/.qtnx/(設定名).nxml をエディタで開き、Custom Session Commandの値を直接編集します。

nomachineのクライアントとは記述に仕方が異なるので注意が必要ですが、これでUbuntu 11.10のUnity-2dへログインすることができました。

.

admin on 11月 22nd, 2011

wiki代わりの備忘録なので編集や加筆の制限なしエントリーです、あしからず。

また、以下はIEに特化することが目的ではなく、W3C勧告のHTML標準なページ作成を目指す中で、標準を理解しない(くせにトップシェアの)IEの仕様を何とか回避するが主題です。

cssテクまで考慮するともっとたくさんになると思いますが、それはデザイナーさんに任せます(笑)

.

IE互換モード

イントラネットでは互換モード優先がIEのデフォルト設定のため、企業イントラネットではIE7の配慮が必要です。ローカルPCでの開発では互換モードを再現できないので注意が必要です。

強制的に互換モードを排除するには、.htaccessに次を記述してHTTPヘッダを出力するか、

Header set X-UA-Compatible "IE=edge"

メタタグでページごとに指定します。

<meta http-equiv="X-UA-Compatible" content="IE=edge"/>

しかし、企業イントラネットではどちらも禁止されることがあり、そうなるとブラウザシェアに関わらず今後もIE7を切り捨てることができません。

なお、edgeはその時点での最新バージョン対応のことで、MS自身は使用を避けるべきとしていますが、HTML標準を目指すので当然edgeをポリシーとします。

.

■ UA判定

できればUAによるコード分岐はしたくないのですが、回避できないケースが多々あります。

var _ua = (function(){
 return {
  ltIE6:typeof window.addEventListener == "undefined" && typeof document.documentElement.style.maxHeight == "undefined",
  ltIE7:typeof window.addEventListener == "undefined" && typeof document.querySelectorAll == "undefined",
  ltIE8:typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined",
  mobile:/android|iphone|ipad|ipod/i.test(navigator.userAgent.toLowerCase())
 }
})();

.

■ nameによるエレメント指定

IEでは以下の書き方はできません。

$('[name="Test"]')

かならず、indexかselectを指定する必要があります。

$('select[name="Test"]')

.

■ optionの非表示

display:noneを指定してもIEでは消えません。

これが必要なケースでは、ページ起動時にオリジナル選択肢を複写しておき、

$('body').append('<select id="copyTest" style="display:none;"></select>');
$('select[name="Test"]').eq(0).children().clone().prependTo('#copyTest');

select要素の再描画が必要なときに、非表示条件を除外して複写することで、ブラウザ共通コードとできます。

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);

.

■ trの非表示

trをdisplay:noneとしたとき、互換モードでは枠線が残ります。

2、3行の非表示なら気になりませんが、数十行を非表示にするとその分の枠線が重なり真っ黒となります(笑)

メタタグが禁止され互換モードを排除できなかったイントラネット案件では、非表示にするtrをtbodyでくくるhtml文法的には不適切な方法で回避しました。

.

■ rowSpanの値変化

上記枠線が残るのと同根ですが、rowSpanが変化するような行単位の表示・非表示を行ったとき、IE7以前では考察不能な値での調整が必要です。

IE7以前を切り捨てられない場合は、UA判定で別コードを書かざるをえません。

.

■ Array.indexOf

IEにはArrayにindexOfが実装されていません。使用する場合は自分で追加します。

if(!Array.indexOf){
    Array.prototype.indexOf = function(target){
        for(var i = 0; i < this.length; i++){
            if(this[i] === target){
                return i;
            }
        }
        return -1;
    }
}

.

■ trim

IEにはtrimが実装されていません。使用する場合は自分で追加します。

if(typeof String.prototype.trim !== 'function') {
    String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g, '');
    }
}

.

■ date.getYear()

通常のブラウザでは getYear = getFullYear – 1900 ですが、IEのみは getYear = getFullYear です。

よって、必ずgetFullYear を使用します。

.

■ Chrome Frame

許されるなら、以下のメッセージで現実逃避したいですね(笑)

<?php
if (!defined('MSIE') && isset($_SERVER['HTTP_USER_AGENT'])) {
    if (preg_match('/chromeframe|Opera|Lunascape/', $_SERVER['HTTP_USER_AGENT'])) {
        // これらはUAにMSIEが入るがIEではないので無視する
        // Lunascapeはエンジン切り替え可能である
        // SleipnirもMSIEを含むが、エンジンがIEであるので警告する
    }
    elseif (preg_match('/MSIE [4-8]\./', $_SERVER['HTTP_USER_AGENT'])) {
        // IE 9は除外する
        define('MSIE', 1);
    }
}

if (defined('MSIE') {
  echo 'お使いのブラウザは古いバージョンのIEです。';
  echo 'IE9以上にアップデートするか、';
  echo '<a href="http://www.google.com/chromeframe/?hl=ja&quickenable=true" target="_blank">';
  echo 'パフォーマンス向上のためのプラグイン</a> のインストールを推奨します。';
}
?>

インストールしたChrome Frameを有効にするには、ページに次のメタタグを入れます。

<meta http-equiv="X-UA-Compatible" content="chrome=1">
admin on 11月 21st, 2011

以前にも書きましたが、UIのEmacs度はUbuntuよりもWindowsのほうがはるかに上でした。

なにしろ、yamy(Yet Another Mado tsukai no Yuutsu: 「窓使いの憂鬱」のキー入力置換をドライバベースからユーザモードフックベースに変更した派生プロジェクト。Windows7やリモートデスクトップでも 動作する)を導入すれば、ダイアログだろうがメニューだろうが果てはエクセルだろうワードだろうが、ありとあらゆるものがEmacs操作体系になりまし た。

例えばVisual Stadioは添付のEmacsキー定義で使うより標準キー定義のままyamyの管理下に置くほうがEmac的だし、その他アプリケーションでも存在しないはずのインクリメンタルサーチがなぜかできてしまったりするのでした。

しかし今の自分はUbuntuです。

GnomeからUnityへの移行に伴い、できることができなくなったり仕様がコロコロ変わっているようですので、自分用備忘録としてまとめます。

.

■ gtk_key_theme

よく知られているカスタマイズ法ですが、Gnome2アプリ(Nautilusやgedit)は基本操作系をEmacs風にすることができます。

  1. gconf-editorを起動
  2. desktop/gnome/interfaceを開く
  3. gtk_key_themeに(なければ作成して)、”Emacs”を指定

しかし、Ubuntu 11.10ではこの指定が働かず、gsettingsを使う必要があります。

$ 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'

.

しかも、このキーテーマはEmacsには程遠いものです。

1行テキストボックス C-f, C-b, C-a, C-eでのカーソル移動が可能
メニュー操作 C-f, C-b, C-n, C-pでのメニュー移動が可能
ダイアログリスト C-n, C-pでのカーソル移動がCtrl+上下(複数選択)になってしまう
gedit 基本操作はEmacsになっているが、C-n、C-pなどメニューアクセスキーが優先される
Nautilus メニューアクセスキーが優先され、基本操作もEmacsにならない

.

■ can_change_accels

キーテーマの変更の不足を補うには、メニューアクセスキーを変更する必要があります。

Gnome2アプリはキーテーマと同じような方法で変更することが可能です。

アクセスキーを削除または変更することで、geditではC-f, C-nのEmacs操作系が使用できるようになります。Nautilusではアクセスキーを削除してもEmacs操作系になりませんが、意図せず新規ウィンドウを開くより無反応のほうがマシです。

  1. gconf-editorを起動
  2. desktop/gnome/interfaceを開く
  3. can_change_accelsをチェックする
  4. 変更したいメニューをマウスで開き、希望のショートカートを実際に押す
  5. ひと通りのカスタマイズが終わったら、can_change_acceslのチェックを外す

この方法は、Ubuntu 11.04あたりから機能しません。

前述のgsettingsを試してみましたが、それでも11.04では変更できませんでした。11.10は確認する前に削除してダウングレードしたのでは不明です。

gsettings set org.gnome.desktop.interface can-change-accels true

.

■ accelsファイルの直接編集

GUIでメニューアクセスキーが変更できない場合には、他のマシンで変更した定義ファイルをコピーするか直接編集することなります。

幸い、私はVPSサーバーが10.04でGUIもいれていたので、そちらでカスタマイズした定義ファイルをコピーすることにしました。

定義ファイルは、~/.gnome2/accels 以下です。

geditの定義ファイルはGUI環境でコピー可能ですが、Nautilusの定義ファイルをコピーするにはNautilusが起動していないCUI環境で行う必要があります。

  1. 他のマシンでカスタマイズ済みの定義ファイルを ~/ にコピーしておく
  2. GUIをログアウト
  3. Ctrl+Alt+F4でCUIログイン
  4. mv ~/nautilus ~/.gnome2/accels/
  5. CUIをログアウト
  6. Ctrl+Alt+F8でGUIログイン

.

LibreOffice (OpenOffice.org)

Emacsキー定義セットってあってもよさそうですが既存のものはないですね。

新しいPC環境を作るときに困らないように、キー定義を変更したらその都度エクスポートファイルをDropboxに出力するようにして、Emacs度を高めることにしています。

.

FireFox

KeySnailは他のどのアドオンよりFireFoxをEmacsにしてくれますが、なぜかFireFoxのアドオンライブラリには登録されていません。

配布サイトからダウンロードしたxpiファイルを、FireFoxにドラッグアンドドロップすることでインストールします。

.

Google Chrome

最近は、Emacs-mode を入れてます。

基本的には、gtk_key_themeによりメニュー、アドレス欄、テキストボックス編集はEmacsキーバインドが実現されています。アプリごとに補完する必要があるのは、Ctrl+Sで保存ダイアログで出さないことですがEmacs-modeでそれは実現できます。

しかし、残念なのはCtrl+Sが「リンクのインクリメンタルサーチ」であることです。
インクリメンタルサーチの実現に固執した開発者のマスターベーションでしかありません。普通にCtrl+Sでテキスト検索となってくれるだけで充分だったのに。その点、FireFoxのKeySnailはよくできてます。

.

Thunderbird

KeySnailはThunderbird用もあるのですが、試したときのバージョンが古かったのかインストールできませんでした。最新バージョンは試してません。

.

WordPressプラグインTinyMCE

最近になりようやく気付きました。ビジュアル編集モードのCtrl+Fが検索窓になってしまうのはこいつの所為で、WordPressオリジナルのビジュアルモードであれば、gtk_key_themeにしたがってCtrl+Fでカーソル右を保持していました。

テーブル編集のために導入したものの、ついCtrl+Fを打ち検索窓を開いてしまうのでほとんど生HTMLモードでテキスト編集していました。まったく本末転倒です。

プラグインはjavascriptで記述されているので修正は可能です。

wp-content/plugins/tinymce-advanced/mce/searchreplace /editor_plugin.js から”ctrl+f”を探して”ctrl+s”に書き換えるだけです。でも、バージョンアップの度に書き換えるは面倒かな・・・

admin on 11月 20th, 2011

すでに私はUbuntuは11.04戻していますが、11.10では未だRabbitVCSが使えないようです。

では11.04でRabbitVCSを再び使うかというと、どうにもその気はなれません。Nautilusでフォルダを開く動作が遅くなりすぎるんですよね。

そもそも私の場合、サーバーの開発ディレクトリをローカルsshfsでマウントしていますから、ディレクトリ一覧もレポジトリもssh経由なため、RabbitVCSのようなUIではアイコンを描画とてつもない時間がかかってしまうわけです。

仕方なく、しばらくコマンドラインでsvcと付き合いましたが、やっぱりGUIが欲しい・・・

.

nautilus-script-collection-svn

改めてググってみるとRabbitVCSをはじめTortoiseSVNクローンのGUIツール混じって、Nautilusのスクリプトという、とってもシンプルなものを見つけたのでインストールしてみました。

sudo apt-get install nautilus-script-collection-svn

スクリプトをNautilusの個人フォルダへ移します。

cp -r /usr/share/nautilus-scripts/Subversion ~/.gnome2/nautilus-scripts/

こんな感じコマンドを選択できるようなりました。

フォルダやファイルのアイコンインジケータはありませんが、必要なときUpdateをすれば良いだけのことです。どうせRabbitVCSだってUpateをしてあげなければ信用できない情報でした。

スクリプトの中身はZenityを使ったコマンドの結果をダイアログ表示するだけの単純なものです。自分でスクリプトを追加するときのサンプルもなりますね。

.

■ Commitスクリプトの修正

しかし、さっそくCommitを試して硬直しました。
テキスト編集ダイアログが表示されるのは良いのですが、ここでコミットをキャンセルするはどうすれば良いのだろうかと小一時間 www

スクリプトを確認すると、返り値$?で0を判定していますが、表示させているダイアログが複数行テキスト編集の –text-info –editableなのでキャンセルする方法がありません。OKを押そうがEscで閉じようが0が返ります。

そこで、以下のよう1行入力ダイアログ変更しました。LOGMESSAGEの取得もifブロックの中移す必要があります。

~/.gnome2/nautilus-scripts/Subversion/Commit (部分)

zenity --entry --title "Subversion: Commit" --width=600  --window-icon="$ICONPATH" > $LOGMESSAGEFILE

if [ $? -eq 0 ] ; then
    LOGMESSAGE=`cat $LOGMESSAGEFILE`
    svn commit -m "$LOGMESSAGE" "$@" > $LOGFILE

.

■ Meld の追加

svnコマンドの結果を表示するだけのDiffは苦手なので、以下のスクリプトを作成して追加してみました。

~/.gnome2/nautilus-scripts/Subversion/Meld

#!/bin/bash
if [ $# -ne 0 ]; then
    if [ -d $1 ]; then
        # サブディレクトリ選択時
        cd $1
    fi
fi
meld .

Meldは.svnフォルダを認識するので、 “meld .” とするだけでそのディレクトリ以下を再帰的比較してくれます。

admin on 11月 15th, 2011

結論から言うと、とっても苦労しましたw

前提は、Rooted な2.3.3で、ディザリングとカメラ無音化をしていたもの。
作業環境はUbuntuのVirtualBoxにインストールしたWindows XPにて。

  1. Titanium Backupで凍結していたシステムアプリをすべて解凍
  2. こちらを参考にbuild.propをもとに戻す
  3. 2.3.4へアップデート!

で済めばよかったのですが、プログレスバーの最後でケラれました。

  1. ディザリングのために追加したhostapdを削除
  2. 2.3.4へアップデート!

としてもダメ。

仕方がないので前回と同じようにちゃぶ台返しを決行 (ノ`Д´)ノ彡┻━┻

  1. Titanium Backupでアプリとデータをフルバックアップ
  2. FlashToolで2.3.2へ初期化
  3. 2.3.4へアップデート・・・しかし、このあたりで23時を超え、サーバーが人大杉状態に
  4. 辛抱強く再ダウンロードをくり返して何とかアップデート完了

あとは、これでさくっとrootをとってTitanium Backupでアプリやデータを復元すればおしまい・・・

  1. とはいかず、PCにUSBつなげてrunme.batを実行するも途中で止まる Σ(´Д`;)

ええっと思って「adb shell」を実行してみるとデバイスを認識してない。ああ、USBドライバが必要なのか・・・どこ? 最近のSDKってusbフォルダがない?

Xperia arc USBドライバ」でググるとSony Ericsson PC Companiaonに同梱とのこと。
あの手の自動インストール画面を見ると(特にSonyのは)拒否反応を起こし、インストールしたことも触ったこともなかったのが悪かった・・・

  1. Sony Ericsson PC Companionをインストール(後で、アンインストールすればいいや)
  2. adb shellを試す・・・が、プロンプトが返ってこないΣ(´Д`;)

人様のブログでは、いとも簡単にrootが取れるようなことが書いてあり、ROMから復元したスマホに環境の違いはあり得ない。

ということで、私のPC環境・・・UbuntuのVirtualBoxでWindows xpのどこがネック?

と悩んでも仕方ないので、翌日・・・

  1. Windows 7 マシンを用意
  2. Windows 7 にSony Ericsson PC Companiaonをいれる
  3. Windows 7 を再起動
  4. USBでつなぐ
  5. adb shellを試す・・・と、つながる (´∀`)
  6. runme.batを実行

でやっとこさrootが取れました。

.

rootさえ取れれば、Titanium Backupでデータごと復元できる。
ああ~、root取っててよかったあ(苦労の原因がrootであることはry)

admin on 11月 5th, 2011

ダウングレードと言っても、初期化しての11.04新規インストールです。

仕事に必要なエディタ環境はプログラムごとDropboxフォルダにインストールして起動していましたし、編集対象のプログラムもクラウドなので、ノートPCを初期化することに躊躇いはありませんでした。

.

Ubuntu 11.10を見限った理由を列挙すると・・・

  1. Touchpad-indicatorがまともに機能しない。USBマウスを抜き差しすればタッチパッドは無効になる。
  2. Unityアイコンの右クリックメニューが表示の1回目は選択できない。一度閉じると選択できる。
  3. xyzzy via wineで日本語フォントが指定できない。同名フォントが英語→日本語の順でリストされるので、手で指定しても再起動で非日本語となる。
  4. 何かのはずみで突然Xが終了する。
  5. Canon MG5130で印刷ができない。インストーラがUSB接続のプリンタを見つけることができない。

11.04に戻しても3の同名フォントは並んでいましたが、先頭が日本語フォントなので顕在化してませんでした。

4はグラフィック的な「何か」を表示しようとしたタイミングで落ちることがあるということで、まあ、安心して作業できないわけですが、プログラム仕事の最中はテキストエディタだけなので、痛い目には合わずに済みました。

こんな状態でも我慢して使っていたのですが、月末でもろもろ印刷する要件があり5に気づきました。印刷しなければお金をもらえないものありますので、ちゃぶ台返しの決心につながった次第です。

.

これまでもアップデートで失ったものは少なくありませんが(笑)、今回ほどひどいのは初体験でした。

次の長期サポートLTS版までに何とかなってくれるんでしょうか?

利用しているミュージックプレーヤのPowerAMPにはスリープタイマー機能がついていますが、いろいろと不満があります。

  • メニューの奥なので設定が面倒くさい。残り時間の確認も同じ。
  • 60分までは10〜15分きざみなのに、次はいきなり120分しか設定できない。
  • いきなりブツっと切れるので、結局目が覚めてしまう。

ということで、フェードアウトして音楽再生を止めてくれるアプリを Tasker で作ってみました。

せっかくなので任意の時間も設定したい。

Tasker の Variable Queryを試したところ、 UI で入力した値を変数に受け取ったところでタスクが終了してしまい、それ以降の記述は実行されません。

困ったな〜〜と十数分。おっと、思いつきましたよ! ( ・`ω・´)

.

色付きの文字はマウスオーバーで説明が表示されます

  1. [Task] Sleep Timer
    ホームにショートカットを作成してスリープタイマーの開始するためのタスクです。1回押すと初期値の30分がセットされ、さらにくり返して押すと10分ずつ加算されます。カウントダウン途中での追加にも使用できます。Task > If > %SLEEP !Set
    Variable > Variable Set > %SLEEP to 30
    Task > Else
    Variable > Variable Set > %SLEEP to %SLEEP+10 (Do Maths)
    Task > End If
    Alert > Flash > Text: Set to %SLEEP min
    Alert > Notify > Title: Sleep Timer / Text: Set to %SLEEP min
    Tasker > Profile Status > “Sleep Timer” Set On
    Tasker > Profile Status > “Sleep Timer Notification” Set On
  2. [Profile] Sleep Timer
    5分おきに通知バーの残り時間を更新し、0分を切るとボリュームを少しずつ下げて最後に音楽再生を停止するタスク本体です。普段はステータス状態を無効にしておき、1のショートカットで動き出します。[Context]
    Time > Repeat 5 min

    [Task]
    Task > If > %SLEEP > 0
    Variable > Variable Set > %SLEEP to %SLEEP-5 (Do Maths)
    Alert > Notify > Title: Sleep Timer / Text: Last %SLEEP min
    Task > Stop
    Task > End If
    Tasker > Profile Status > “Sleep Timer” Set Off
    Tasker > Profile Status > “Sleep Timer Notification” Set Off
    Vaiable > Variable Set > %VOLM0 to %VOLM If %VOLM0 !Set
    Task > For > %idx = 1:16
    Variable Variable Set > %vol To 17-%idx (Do Maths)
    Audio > Media Volume > %vol If %vol < %VOLM0
    Task > Wait > 1 min if %vol < %VOLM0
    Task > End For
    Media > Media Control > Stop
    Alert > Notify Cancel > Title: Sleep Timer
    Task > Wait > 5 sec
    Audio > Media Volume > %VOLM0
    Variable > Variable Clear > %VOLM0
    Variable > Variable Clear > %SLEEP

  3. [Profile] Sleep Timer Notification
    通知バーの残り時間表示を選択するとカウントダウンをキャンセルできます。[Context]
    Event > UI > Notification Click > Title: Sleep Timer

    [Task]
    Tasker > Profile Status > “Sleep Timer” Set Off
    Tasker > Profile Status > “Sleep Timer Notification” Set Off
    Variable > Variable Clear > %SLEEP

.

5分きざみのリピートを利用しているので、設定した残り時間は最大5分の誤差が生じますし、最後のフェードアウト(10分前後)も考慮していません。

意識を失っているときの利用が前提なので、このくらいのアバウトさで十分ではないかと・・・・

admin on 10月 22nd, 2011

ようやく標題の結論に達しました(笑

以前から「原因不明」として書いてきた現象は、Taskserで画面オフ後のキーガード(画面ロック)を制御をしていると、Homeボタンを押したときにときどきロック解除画面が現れてしまい、それを解除すると、電源オンの度にロック解除が必要になる(Taskerでロックを遅延させているはずなのに)と言うものでした。

Tasker標準のKeyguard OffはAndroid 2.2以降、画面オフ時には機能しないので、Secure Settingsプラグインに差し替えて利用してましたが、この現象はどちらでも同じように発生します。

自分の作ったタスク設定にどこか穴があるのではないかと試行錯誤してきたのですが、どうもこれは回避できない問題であると、ようやく自分自身を納得させることができました。

.

そう思えるようになったのは、「Homeボタンを押したときにときどき」という曖昧な状況を、「ホームアプリがメモリから消えてるときにHomeボタンを押したとき」と把握したからです。

.

現象の再現には、おそらく Widget Lockerの併用が必要です。

Widget Lockerはシステムに画面ロックがかかっていても、画面オンで(ロック画面より先に)自分自身を表示し、カスタムロック画面に配したウィジットやショートカットからアプリをはじめて起動したときにロック画面を表示させます。

TaskerKeyguard Offも本来ならシステムにロック画面がかかってる状態を何らかの方法で覆しています。具体的に何をやっているか知りませんが、いずれもAndroidシステムの正規APIではないと(OSバージョンにより動作しないことからも)想像できます。

使用メモリが溢れてホームアプリが消えたときにHomeボタンを押すと、改めてホームアプリが起動しようとします。その起動がWidgetLockerの制御にかかってロック画面の出現を呼んでいると考えられます。

と、ここまで推察したとこで、どうにもならないと結論付けるしかありません。

いずれも非正規な(と考えられる)制御がバッティングしているわけですから、TaskerKeyguard OffとWidgetLockerの相性(この言い訳用語、Windows登場当時にはよく使われましたね)としか言いようがないからです。

.

■Password/PIN制御ならOK!

Keyguardの代用になる画面ロック機能を探さなければなりません。Taskerに備わっている独自のLock機能はシンプルでよいのですが、解除されたかどうかをTasker自身で感知することできないので代わりにはなりません。

3G切断もあきらめ、画面ロックの制御もあきらめてしまったら、自分がTaskerを導入した動機のすべてを失ってしまいます(笑)

.

まて! Keyguard Off は「本来ならシステムにかかってる画面ロックを何とかする」機能だけど、Password/PIN はロックのかかっていないシステムをパスワード指定でごく当たり前にロックする機能では?

ということで、Android のセキュリティ設定をロックしない状態に戻し、Tasker プラグイン Secure Settings の Password/PIN を利用してみました。はい、OKでした。

.

    1. [Task] Delay Lock
      [Properties]
      Collishion Handling > Abort Existing Task[Task]
      Task > Stop If %SCREEN ~ on
      Task > Wait 10m
      Task > Wait 4h, If %LOCATION ~ work
      Plugin > Secure Settings > Password/PIN > パスワードを設定
    2. [Profile] Display Off
      [Context]
      Event > Display > Display Off[Task]
      Task > Stop > If %WIDGETLOCKER ~ locked
      3rd Party > WidgetLocker > Activate
      Task > Perform Task > “Delay Lock” if %LOCATION !~ home
    3. [Profile] Display On
      [Context]
      Event > Display On[Task]
      Variable > Variable Set > %WIDGETLOCKER to locked
    4. [Profile] Widget Locker Unlocked
      [Context]
      Event > 3rd Party > Widget Locker > Unlocked[Task]
      Variable > Valiable Clear > %WIDGETLOCKER
      Task > Perform Task > “Delay Lock”
    5. [Profile] Display Unlocked

[Context]
Event > Display > Display Unlocked

[Task]
Plugin > Secure Settings > Password/PIN > Disable

.

追記

Password/PINを利用したこの設定でも、ホームアプリがメモリから消えてるときにHomeを押すとロック解除画面が出現しました。しかし、Keyguardと違うのはこのロック画面を無視すれば(電源ボタンでオフにするとか)、もうロック画面は出てきません。Password/PINならOKというのはこれで証明されました。

この「ホームアプリがメモリにないときにHomeを押すとロック画面が出現する」のは、純粋にWidgetLockerのバグと言えますから、進言すれば解消されるかもしれませんね。

admin on 10月 22nd, 2011

タイトルに草を生やした時点もう結果は見えていますね(www

結果は以下の通りです。
グラフは青=常時接続、黄=メール通知監視、緑=15分に1分の定期接続、それぞれ4日分の使用の平均曜日はバラつくように配慮したつもりです。

バッテリーログのグラフ

なるべく同じような使用状況になるように気をつけましたので、日ごとを見ると変動はバラバラしたが4日平均は十分に均一化されました(笑

.

利用環境の詳細は以下です。

機種/OS Xperia arc / Android 2.3.3
3Gオフ Dispaly Offの30秒後に3Gをオフ
Display Onでは3Gオンにしない(WidgetLocker使用)
WidgetLocker Unlocked 3Gオン
使用状況 仕事中も音楽プレーヤーとして使用
通勤往復1時間半はBluetoothも使用
GPSは常にオン(ただしGPSを利用するアプリは全く使用せず)
Googleリーダーなどのネットはほどほどに利用
Taskerの設定変更は禁止(没頭して電力を消費するから・笑)
夜明けに目覚めたときに充電開始して二度寝し、充電完了してから出勤
spモード 不使用(Titanium Backup凍結)
GMailアプリ 不使用(Titanium Backup凍結)
K-9 Mail GMailをIMAP利用
同期フォルダの同期間隔: しない
プッシュ接続時の同期: する
※頻繁にメールがあるなら同期設定は逆にしたほうが省電力かもしれません
メール通知 GMail → Yahoo転送 → spモードに携帯通知
「spモードメール」は使用せず「メール通知Free」監視
メール通知の通知音やLEDはすべてオフ
メール通知のNotification3Gを1分間オンにすることK-9 Mailが受信
K-9 Mail側の通知音とLEDを利用
定期監視 15分に1分のタスクを作成
%SCREEN ~ off なら1分間3Gをオンにする

.

K-9 MailのGmailプッシュは3G回線による信号、「メール通知」が監視しているspモードメールのプッシュは通常電話回線の信号なわけですが、ほとんど差がないようです。もしくはその差を「メール通知」アプリの監視が相殺してるかです。
プッシュ待ちでは双方向の通信をしているわけではないから?電力を消費していないのでしょうか。

とにもかくにも、Xperia arcは十分に省電力チューンされているということですね。

.

これ晴れて3Gオフの呪縛から解放され、Taskerの設定が簡単になりました(笑