2012年9月13日木曜日

jquery mobile + backbone サンプル(1)

jquery mobileを使っていろんな情報を見て覚えて使ってみて、やっぱまともじゃない。jqmは使えない!って何度も思ったことか。ほんとWeb周りの技術ってごちゃごちゃしてて苦難の道のりである。
  • jquery mobileをそのまま使ってみると、ページ遷移やajax周りで泣く。(過去記事参照)
  • なんとか普通に動くようになったからコード整理しようと思いテンプレートエンジンの導入を考える。
  • angularJSを使ってみるとjqmと相性が悪くて使えない。angularJS-jquery-adapterなるものを使ってみる。
  • イベント周りとかテンプレートが強力でほんとjqmバイパス感が強いけど使えるんだけど、adapter側の情報が少ないし、画面遷移周りでフリーズすることもあり次を探しに出る。
  • クライアントサイド側のMVCフレームワークで一番情報が豊富と書かれていたbackbone.jsに手を出してみる。←今ココ!

というわけで行き着いた先はbackbone.jsであった。
チュートリアルを見てもちんぷんかんぷんで、なんじゃこりゃー!と思いつつ1つ1つ解いていくことにする。

Backbone.JSって何?
 Javascriptで書かれているMVCフレームワークである。
フレームワークの構成はRouter、Model、Collect、Viewの4構成で出来ている。
各々の説明すると、

 ・ページ単位で切り分けるRouter、
 ・データ定義するModel 、
 ・複数のデータを管理するCollect、
 ・画面周りを担当するView

という感じになる。


次にフレームワークの基本的な流れ。

 ページアクセス
  ↓
 Routerで振り分け
  ↓
 Viewでページ作成
  ↓
 Collect、Model必要なデータを引っ張ってくる。
  ↓
 画面表示

MVCフレームワークを使った事がある人であれば馴染みやすいと思う。

またこの他に、
 HTMLを吐き出すテンプレート「underscore」
 画面のデコレーション担当「jquery mobile」

があって今回のサンプルプログラムで使ったコードを張っておく。


ここまで頭の中を文章に吐き出してみた。
あとは使って覚えて知識の補強を繰り返していけば、実用投入ができるかもしれない。
ちなみに、このbackbone.jsは軽量って謳ってるけど、軽量という言葉は最近の流行なのだろうか。
体重100kg軽量級とか軽量ってタイトルが付くと、一瞬だけ軽そうって気分になるけど。


準備するもの

 jQuery mobile + backboneするのに今回は以下のライブラリを用意する。

http://jquery.com/http://documentcloud.github.com/underscore/
https://github.com/douglascrockford/JSON-js
http://backbonejs.org/
http://jquerymobile.com/


いよいよ Hello, Bavkbone! を書く
 
ベースのHTMLコードはjquery mobile サイトのデザイナツールで作りました。
それに加えてbackboneのViewとunderscoreを今回使用してます。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <title>example</title>
        <link rel="stylesheet" href="./jquery.mobile-1.1.1/jquery.mobile-1.1.1.min.css" />
        <link rel="stylesheet" href="my.css" />
        <style>
        </style>
        <script src="underscore.js"></script>
        <script src="json2.js"></script>
        <script src="jquery-1.7.1.min.js"></script>
        <script src="backbone-min.js"></script>
        <script src="./jquery.mobile-1.1.1/jquery.mobile-1.1.1.min.js"></script>
        <script src="my.js"></script>
    </head>
    <body>
        <div data-role="page" id="page1">
            <div data-theme="a" data-role="header"><h3>sample1</h3></div>
            <div data-role="content" style="padding: 15px">
        <!-- content start -->
        <div id="myview"></div>
        <!-- content end -->
            </div>
            <div data-theme="a" data-role="footer" data-position="fixed"><h3></h3></div>
        </div>

    <!-- underscore template start -->
    <script type="text/template" id="hello-template">
        <h3><%= part1 %>, <%= part2 %>!</h3>
        </script>
    <!-- underscore template end -->

    <!-- backbone start -->
        <script>
            MyView = Backbone.View.extend({
            el: '#myview'
            ,initialize: function(){
                this.render();
            }
            ,render: function(){
                var data = { part1: 'hello', part2: 'backbone!' }
                var tmpl = _.template($("#hello-template").html(), data);
                this.$el.html(tmpl);
            }
        });

        var myview = new MyView();

    <!-- backbone end -->
    </script>
    </body>
</html>


簡単に解説

   タグで囲った部分が3ブロック構成、コンテンツ、テンプレート、backboneで出来てます。 上から、

    1.コンテンツ部分。
    動的にしたい部分divタグにidを付けたものを挿入します。
   2.テンプレート部分。
    動的に表示させるHTMLをunderscoreの記述にしたがって記述します。
   3.Backbone部分
     どういったデータを加工して表示させるのかを記述します。
     ・elが対応する1のdivタグのID
     ・Viewの定義、initializeと、renderを記述。


動作の説明





実行画面


 できたら最後にビューのインスタンスを作成して終えてます。
 これをやるとどうなるかというと、 Myviewのinitialize()が呼び出されてrender()を呼ぶ。
render()内で今回用意したデータとテンプレートを使ってHTMLを作って、 elにデータセットして終えてます。
 最初に説明したフローで説明すると、


 ページアクセス
 ↓
Routerで振り分け (スキップ)
 ↓
Viewでページ作成
 ↓
Collect、Model必要なデータを引っ張ってくる。 (スキップ)
 ↓
画面表示
だいぶ省略してますが、backboneのViewとテンプレートを使ったHTMLレンダリングの仕組みが見えてくると思う。

2012年9月10日月曜日

jquery mobile のページ切り替えの挙動(イラッ

とにかくajaxの挙動がおかしい!それでも使いたい!って方用にメモを残しておく。

ページ切替イベントに
http://dev.screw-axis.com/doc/jquery_mobile/api/events/page_transition/about/

pagebeforehide
pagebeforeshow
pagehide
pageshow
の4つがあると記載してあるけど、実はもう一つあって
ページ遷移先のdiv[data-role="page"]タグ内にある<script>タグがある。

scriptタグはページを読込んだ直後に実行されるので、
pagebeforchangeよりも早く実行される。
data-prefetchした場合は裏でajax通信した時に読込む。
これが一番の問題。

どういうことかというと、ページ切替前にscriptが解釈されてしまうので、
当然ページ切替後に反映される事はない。

リロードしたときはうまくいくのに、ページ移動だとうまく行かないっていうのは
ここが原因となっているので、
ウェジット回りのイベント処理などは、素直に

jquery mobileでイベント処理をやらない


これが対策。

jquery mobileでイベント処理をやらない

がとても重要。

  具体的には、
1.ページ切替などそういった処理はヘッダー内scriptに記述して、できるだけ
処理を入れないようにする。
2.ウェジット回りのイベントはhtml内のdiv[page]内scriptタグで記述して、
onclickタグやonchangeタグを使って呼び出すようにする。

これだけ制約すれば素直に動いてくれるはず。

2012年9月7日金曜日

jquery mobileの悪い所

ajaxをONにしてうまく使えないか試行錯誤してたらべからず集ができそうなくらい問題が出てきた。

・DOMキャッシュ機能をPOST先のページがおかしくなる。
・location.hrefだと履歴やハッシュが付かなくなって次表示するとき更新されない。
・ときどきページが巻き戻る。
・ときどきGUIが素の状態になる。
・ときどきscriptタグ内の処理がスキップする。
・ときどきブラウザがフリーズする。
・WEBアプリ側でリダイレクトするとものアウト。
・リダイレクトしちゃった場合はcontent内に正式なURLを埋め込まないとリダイレクト前のURLになる。
・contentタグ内のページ名はユニークにしないとだめ。
・ラジオボタンをクリックしたときとかchangepageでページ遷移できない。


 こんだけ問題に直面すると時間がいくらあっても足りないしストレスとカフェインの量が増えてくる。

.NETとかがものすごく洗練された開発環境だなあと思えてきた。

2012年9月5日水曜日

jquery mobileでajaxを使う。

右も左も知らないまま、jquery mobileを使ってajax通信を使って動的なページを作ろうと思ったときに陥った罠を紹介。

今日の問題テーマ
1.pageinitでsetIntervalを使って定期的にajax通信を行う仕組みを入れると、ページ切り替えた後もajax通信を行っている。
2.ページ遷移先のjavascript(pageinit部分)が処理されない。
3.jquery mobile側のページ遷移で使われてるajaxをoffにすれば解決してしまう。(悪くないがせっかくなので使いたい)
4.ページ内でajaxを使うと時々エラーが発生する。

 これくらいの内容を紹介。
ここからたんたんと書いておく。

 jquery mobileとは  
  基本的な部品とページ遷移するときのアニメーションなどを提供してくれるライブラリでバックエンドにはajaxが使われている。ajaxをオフにするとページ遷移時のアニメーションがしなくなるなどの制限が付く。 あと、jquery mobileを使って自分でもajax通信するときは、多重通信するとエラーが起きるのでそのへんの制御を作りこまないといけないし、ページ遷移前には通信してない状態にもっていかないとだめである。 イベントフック自体はjquery mobileに提供されているものを使うことがリファレンスでも書かれているので目を当しておくこと。

jquery mobileがajaxONだとどうなるの?
 最初に開いたページがベースとなるので、ヘッダ、ボディー共に読み込まれる。ページ遷移はajax通信でリンク先のページデータを読み込んで、ヘッダタグはスキップしてボディータグ内にある
タグで囲まれたページを読み込んで、ページを書き換えるついでにアニメーションをはさむようになる。OFFにした場合は通常のページ移動するのでページ遷移先のヘッダーとボディーを再度読み込む。


自分でもajax使う実装はどうやるの?
 ページ遷移先のDivタグ内にscriptタグを仕込んでおいてそこに自分でajax通信をするプログラムを書いてあげればよい。Divタグ内で完結するscriptタグなので、グローバル変数が他ページとかぶっても置き換わる事もないし、引き継がれない。もしグローバル変数を使うならdivタグで囲まれたページタグ以外のエリアにメモしておけばいいと思う。もし、定期タイマーでajax通信する場合は、pageshow、pagehideでタイマーのON/OFF制御してあげればアクティブなときだけ通信するようになる。ちなみにjquery mobile公式ページにある画面レイアウト作成できるのでソースをエクスポートした場合、scriptタグがdivタグの外側にはみ出してるので厳重に注意しておくこと。

ここまでで1~4の解決策は書けた。
最後に、jquery標準のreadyじゃなくpageinitを使え!ってリファレンスに書かれてるからどこの記事でもpageinitで解決って感じに書かれているけど著者の意図通りに使われてないケースをよく見かける。
そもそもpageinitを使うケースは共通の初期化を行う時くらいなもんだろう。delegateとかするときはinitで、より使うほうはページ切り替え時の処理がメインなんじゃないかなと思う。でもまあ、このあたりは必要とされる技術を適材適所に使っていればいいので、どういうイベントがあるのかは頭の隅にでも覚えておくと良いと思います。

あとは全体の実装方法なんだけど、すっきりしたやり方がまだまとまってないので今日はここまで。

2012年8月31日金曜日

jquery mobileでpageinitするときの注意点

見事にはまった。

jquery自体始めて使うので、右も左も分からない事もあるんだけども
ドキュメント通りにコピペしてもpageinitは動かない!という問題にずっぽりはまってしまった。
色々足掻いてたら解決したのでメモっておく。

まずjquery mobileは通常ajaxがONになっていて、ページ切り替え時は
ajaxで次のページを読込んでからアニメーションして画面が切り替わる仕組みになっている。
こいつが動いてると初めに読込んだscript以外は読込まない挙動っぽい。

つまり対策方法は、
 ・どのページでもヘッダーに共通のスクリプトを読込むようにしておき、スクリプト内に画面の設定を記述しておく。
 ・ページ切り替えるタグにパラメータで「data-ajax="false"」を付け加えておく。

この2つに絞られる。

前者のがページ切り替わる時のアニメーションが付いてお手ごろなのだが
ページ数が多くなると厄介なので、今のところはsubmitやタグのところに後者のdata-ajax=falseを入れて対応しておいた。


django + jquery mobileで組込みアプリを作る(準備編)

産業関係で未だにMS-DOSで動くシステムなどがありますが、
20年続いたシステムでもハードウェア面でメンテナンスが出来なくなって
最新のシステムに置き換える事例などがあるかと思います。
今から作るなら.NETを使って実装が王道だけど、今回はWindows、Linux両方で動く
Pythonを使った方法を考えてみました。

 仕様イメージは組込み開発でWindowsやLinuxが動くパソコンを使って装置を動かすというもの。
パソコンに求められるものといえば、
 ・シリアルポートやLANを使う
 ・画面で運転状況を表示する
 ・リアルタイム制御を求める

この3点くらいだと思います。
どういったものを使えば出来るかというと、
 1つ目、シリアルポートやLANは、pyserial、twistedなどを使うことで解決。
 2つ目、最近の流れに沿って、スマートフォンで操作できるように、WEBアプリ開発でDjango、jQuery mobileを使えば対応できる。
 3つ目、WEBフレームワークDjangoのバックグラウンドにハード制御を行うスレッド又はプロセスを常駐させることで対応できる。

今回はDjangoを使うので、管理画面が最初からついてきます。しかもデータ操作が可能なものです。
それを使えばパラメータ設定などはDjangoの機能を使えば簡単に出来るし、データベースをSqlite3に
すれば1ファイルで管理できるメリットずくめ。後はWEBサーバが必要になるのでnginxを使うとします。

ここまでの構成をまとめると、
 nginx + django + jquery mobile + pyserial + twisted + sqlite3


だいぶ使うものが増えてきました。

[画面周り]
 ・ブラウザ経由(ネットワーク経由で遠隔操作なども可能)
 ・スマホ対応のライブラリjquery mobileを使うことで幅広くなる
 ・リアルタイム性はajaxを用いて、常時ハードウェアのステータスを拾うようにする。

[制御]
 ・WEBアプリ(画面周り)と切り離してバックエンドで動かすドライバ的なものにする。
 ・URL経由でハードを動かしたり、ステータスを取得できるようにする。

[パラメータ]
 ・sqlite3で管理する。DB操作はdjangoを使って楽する。
 ・ログなどもdjangoを使って楽をする。

画面周り+ハード制御用ドライバを実装して、これらをURL経由で操作できるようにすれば
WEB系を取り入れた組込み開発になる。

こんな感じになると組込み系の醍醐味?だと思うLCDにキャラクターパターンをUART経由で送信して表示するというような事はしなくなりそうです。

今日はここまで。

2012年8月28日火曜日

Python製Wikiエンジンmoinmoinを使ってみた。

ローカルで簡単に使えるWikiエンジンがほしかったので探してみたらMoinMoin
というものを発見。

さっそく使ってみた。
(今回はWin環境で行った。)

Step1 ダウンロード&インストール。
http://moinmo.in/MoinMoinDownload

公式ページから最新版をダウンロードして解凍ファイルをどこかに展開する。

Step2 起動

Wikiserver.pyを実行。
(ローカルにPythonがインストールされている事が前提)


Step3 スーパーユーザ作成

トップページが出てきたらまず、Login画面に移動して新規アカウント作成する(メールアドレスまできっちり入れる事)

次に「HelpOnConfiguration」ページを開き、ページの新規作成

superuser = [u"YourLoginName", ]

を入れて(YourLoginNameには先ほど作ったユーザ名が入る)

サーバ再起動→ログインする。


Step4 言語設定

「install help and system page packages」ページを開き、Japaneseを選択。

全体を日本語にしたければ、「All page」をクリック。

Step5 フロントページ設定
# Choose this, if most wiki content is in a single language.
# If English is not your wiki's main language, choose something in YOUR wiki language
page_front_page = u"MyStartingPage"

「FrontPage」ページを開き、上記文字を入れる。

節電方法について

いよいよ電気代の値上げが始まります。
家庭にもよると思いますが、普段通りに使うと月平均でおおよそ2000円前後値上がりすると思います。
そこで節電についてまとめてみました。

従量電灯について
http://www.tepco.co.jp/e-rates/individual/menu/home/home02-j.html

深夜電灯について
http://www.tepco.co.jp/e-rates/individual/menu/home/home04-j.html

三段階料金制度とは
 電気の使用料によって料金が変わるもの。
 ケータイの通信料みたいなもので3段階に分けて値段が変わるらしい。
 1段階:120kWhまで    18.89円
 2段階:300kWhまで    25.19円
 3段階:300kWh超え    29.10円

1段階と3段階を比べれば電気料金は54%UP。
もし3段階に到達していたらまず基本料金を下げる前に必要ない家電をコンセントから外すようにした方が良いと思う。

節電のコツは、まず3段階で使う電気使用料を減らすことである。これをするにはまず、
常時使う家電(B)、都度使う家電(A)の2つに分ける。
常時使う家電(冷蔵庫など)は24時間稼動するので、電気料金のベースとなり、
都度使う家電(洗濯機やIHなど)は、ベースからプラスアルファの部分になる。

これを数式にすると、
 Y = AX + B

 Y=電気料金
 A=都度使う家電(総ワット数)
 B=常時使う家電(総ワット数*1ヶ月分)
 X=使用時間

となり、
Aのカーブは大きくても使用時間を短くする事で電気使用料は減り、
Bは、使わない家電をコンセントから抜く事で電気使用料が減る。

あと温調機(エアコン、冷蔵庫)などは、廃熱部分が室外機、背面部分にあります。
温調機の仕組み的に、廃熱部分が常温に近いほど稼働時間が減るので結果的に電力が下がります。
この部分のスペースを空ける事で節電とTVでいってますが、より効率的にするならファンで強制的に風を送ってあげるのがいいと思います。
こういった部分はエアフローといい、空調や自作パソコンに詳しい方がいれば、パソコン用のDCファンやダクトの取り付けなど詳しいアドバイスがもらえると思います。


ここまでの話をまとめると、
・使ってない家電はコンセントから外す。
・W数の大きな家電は使用時間を出来る限り短くする。
・温調機の廃熱部分は風通し良くする。(DCファンなどで風冷もOK)

こういった努力の結果が翌月の電気使用料に反映されます。

2012年8月17日金曜日

debian コンソール画面で文字化け

debianでデスクトップ環境を入れなかった場合、
最初のコンソール画面で日本語の文字が発生する問題を解決する方法は以下の通り。
LANG=C
su
 パスワード入力して、rootになる
aptitude update
aptitude install jfbterm
echo vga16fb >> /etc/modules
exit
LANG=ja_JP.UTF-8

動作確認でmanコマンドを実行してみる。

参考サイト:
 http://www005.upp.so-net.ne.jp/develop-tom/console-deb.html

スマホの活用方法

最近、「白ロム」という言葉を良く聞くけど、これは一体何?
SIMカードの色が白いから「白ロム」っていうの?って思ってる人もいるだろうw
ちなみにそれ、間違ってます!

正しくは、SIMロックフリーという意味です。
SIMロックフリーだと何ができるの?という質問については、
まず、
・海外SIMが使える
・別のSIMが使える

というメリットがある。

通常は、SIMロックされているので、解除するにはキャリアの店舗に持っていって3150円の手数料を払うとやってくれるそうです。

しかし白ロムを手に入れたからといって、全部のSIMは使えないので注意が必要。
電話というのは周波数と通信方式が決められていて、900MHz帯とか1.8GHz帯、3G、CDMA、Xiなど聞いた事があると単語がそれにあたります。
つまり、AU端末は3G対応してないので、AUのスマホでDocomoやソフトバンクのSIMは使えないって事である。

最近の流行っているMVNOなSIMはDocomo回線使っているので、docomoのスマホ使えばまず間違いないです。

あと1つ良い点はSIMを入れなくてもワンセグ見れたりWifiが使えるので、
へたな中華パッドを買うより、中古のスマホのほうが性能もいいってことである。
もし、古いケータイ使ってるけど、スマホアプリが使いたいって方には中古スマホで遊んでみてはどうだろう。

pythonでGUIプログラミング(1)

最近組込み用のARMボードが沢山売られるようになってきた中、ホビー用に買って自分でLinuxカーネルをビルドしたりする人が増えてるんじゃないだろうか。
こういった組込みボードは、スマホよりIOやUSBホスト機能などが豊富な資源が使えるようになっていて、 便利なんだけど、RAMが少ない!っていう状況に出くわしてる方も増えていると思う。

そこで、解決方法として専用機として仕上げる方法があって以下にまとめてみた。


・xfceを動かしてその中でアプリを起動(メモリー使用:多い)
・ブラウザOSというようにフレームバッファでブラウザnetsurfを動かして、ハード制御はWebサーバ経由で操作する(メモリー使用:普通)
・ブラウザの代わりにcruseを使って操作(メモリー使用:少ない)
・PythonでGUIアプリ(メモリー使用:多い)


まずxfceを起動してアプリを起動する方法は、起動が遅い。そしてメモリーも沢山使うけど汎用性はある。 xfceの代わりにawesomeなどを使ってもやはりxfree86を使う時点で重くなる。

そこでフレームバッファ直接操作するアプリを起動させて早くしようとしたのが2番目。
起動速度は速く、netsurfというブラウザも速度が速くて快適。しかしjavascriptに対応してないので、リアルタイムに処理するようなものはできない。

3番目のcruseを使って操作は日本語問題があって、まだいい結果が出せてない。

最後にPythonを使ってGUIからすべてやってしまおうというのが今回。


まずはどのようなモジュールがあるのか調べてみたところ、Qtが一番よさそう。

今日はここまで。

参考サイト:
http://ginstrom.com/scribbles/2008/02/26/python-gui-programming-platforms-for-windows/

2012年8月2日木曜日

[python]multiprocessingとthreadingについて

threadingだとGIL問題があって遅くなる!っていう話をネット上でちらほら見かけるので
multiprocessingというものを使ってみた。
使い方はthreadingとほぼ互換なんだけども、pickle化できないといけない制約が付いてくる。
あともう一つ、プロセス間通信するのにManagerクラスを使ったりしたりしなかったり。

それにforkしたようなものなので、
メインプロセスがいて、そこにCTRL+ALT+DELETEで出てくるプロセス一覧に
multiprocessingで作ったプロセスが出てきて、その中にthreading処理が動いて・・・っていう
スコープになるし、単純に置換えすると逆に共有メモリ回りで慣れて無いと
ローカルでやればすぐ済む作業もプロセス間通信を使ってやらないといけないとか、色々めんどくさくなる。

もし使うなら、工場で一連の作業が円滑に回ってるんだけど依頼が多くて困る!
別の工場を作って仕事を振り分けたいなーって場合のときに有効な手段だとおもう。

2012年6月13日水曜日

vmware上debian(squeeze)でマウスの挙動がおかしい

左クリックしてドラッグなんかすると左クリックが離れなくなる問題がある。
ALT+TABを2回押せば直るけど、今まで不便に感じてたし、
なんとかならないものか調べてみた。


参考サイト:http://communities.vmware.com/thread/391797

アンインストールして、apt経由でvmwareToolを入れるというやり方。


Step.1 手動でインストールしたVMWARE Toolをアンインストールする。
/usr/bin/vmware-uninstall-tools.pl 


Step.2 ソースリストにcontribを加える
vim /etc/apt/source.list

deb
 http://xxxx/debian/ squeeze main contrib

deb-src
 http://xxxx/debian/ squeeze main contrib

...


Step.3 インストールする
apt-get update
apt-get install open-vm-toolbox open-vm-tools


Step.4 再起動
再起動


これでおk。
完全には解決してないけどマシになった気がする。

Androider