投稿日:

Android の Service は常駐しない


検索で Android の Service 関連の情報を探していると、しばしば「常駐」というキーワードが出てきます(2011年5月現在)。そしてそれはどちらかというと「Serviceは常駐するものだろうに、よく落ちるよー。ちゃんと落ちないようにするには工夫が必要だよー。やっかいダヨネー」という雰囲気のものが多いように思います。

私も最初はそう思っていたのですが、よくよく Service 周りを調べてみると、どうもちょっと違うようです。で、今は次のような考えが正しいと思っています。

「Android の Service は、何らかの常駐的な機能を提供するコンポーネントでは無い」

で、それでそう考えると、例えば次のような、Service の仕様もしっくり納得できます。

  • startService は別スレッドで実行されるわけじゃない
  • stopSelf しなくても、いつの間にか kill されて落ちてたりすることもあったりする
  • Service が kill されて再起動した時、onCreate は呼ばれるが、onStart は呼ばれない

まぁ、そう気付いてから↓改めてリファレンスを見ると、なんとなくそういうことが書いてあったりして、ちょっとお恥ずかしい感じです……。(*^ ^*;

http://developer.android.com/intl/ja/reference/android/app/Service.html#WhatIsAService

(↓What is a Service? の部分の翻訳が含まれている記事もありました)
http://d.hatena.ne.jp/adsaria/20100914/1284435095

でもちょっと遠まわしな記述ですよね?(私、最初は意味がわからずに読み飛ばしてました)

で、そんなことに気付いたところで、あんまり意味も無いものかも知れませんが、私個人的には、最初にどう作ろうか考えている時点で、早めに正しい方向性を見出せるような気がいたします。

では常駐はどう作るか?

ってか、そもそも「常駐」って言葉の定義も結構曖昧ですが(笑)、例えば、定期的なプログラムの実行であれば AlarmManager を利用するのが良さそうです。また、外部からの何らかのアクションに対応するには、BroadcastReceiver を使うのが良さそうです。

以上でーす。久しぶりの記事がこんなんですみません。(^ ^;

でも、とりあえず、Service が「常駐」のための正しい手段だと思ってると、ちょっぴり問題のある設計をしていまいそうにも思ったので、それだけです。

ではー。

追記です。

ブックマークしてくださった方のコメントに、「 『Android の Service は、何らかの常駐的な機能を提供するコンポーネントでは無い』 メモリが足りなくなったりしない限り、サービスは残ると思っていた。」とありましたので、補足ですが、基本、startService すれば、stopService しない限り、service は起動していると思います。

ただ、再起動したらサービスは落ちてますし、メモリが足りなくなってキルされたりしたときの挙動とか見ていると、「『Serviceが常駐の為の機能』と思っていると、間違った設計をしてしまう可能性がある」ことや「Serviceそのものを有効に利用できない」ということを記事には書いているつもりでした。誤解のありませんように、です♪

投稿日:

IE8 で white-space:nowrap が指定範囲の外まで影響する問題の回避方法


すこしはまったので、メモ&情報共有です。
この問題、Webで調べると、よく float:left; での解決が示されていますが、今回の自分の事例ではレイアウト的にそれができなくて、困りました。

で、結局、色々試した結果、display:inline-block; で解決でした!

具体的には次の css を書きました。

1行目が、white-space:nowrap の指定で、2行目で、ハックを用いて IE8 のみに、display:inline-block を適用しています。

以上、ご参考まで。

投稿日:

eepy – Python コード埋め込み形のシンプルなテンプレートエンジン


Python コードを埋め込む形式のシンプルなテンプレートエンジンです。Ruby の ERB のような感じです。まだ検討したいところも多々ありますが、もしお役に立ちそうに思われた方はご自由にお使いください。で、何か不具合があれば教えてください♪

特徴

  • Ruby の ERB 風の記法
  • Python のインデントブロックを意識せず、テンプレートを記述可(”end” キーワードの使用)
  • フィルタ。値の埋込み時に、html クォートなどのフィルタを自動的・全般的に適用可
  • キャッシュ。Renderer 利用時に利用可
    • メモリ保持で揮発性の1次ファストキャッシュ(1トランザクション内でのテンプレートの繰り返し利用の為)
    • 2次キャッシュ。コンパイル済みのテンプレートの永続化。現在、File ベースと、Gae Memcache ベースのストレージを準備。他の DB ストアなど、必要に応じてストレージを追加可
  • ヘルパ。幾つかの便利なヘルパを提供
    • extends と block。Django のような、テンプレートを継承・拡張するスタイルを利用可
    • include。テンプレート中で、他のテンプレートを読み込み

なお、eepy は、yuin さんの embpy をベースとした派生ライブラリです。
また、キャッシュのストレージ仕様は、kuwata-lab.compyTenjin を参考にさせて頂いています。

embpy との主な相違点(2010.02.10時点)

  • ブロックの終わりの明示は end キーワードでのみ可
  • インラインでブロックを記述する時に、{: ~ :} の記述が不要(普通に書けます)
  • 複数行のコードパートにブロックを書く時は、end キーワードは不要(普通に書けます)
  • 三項演算子が利用可
  • render の戻り値は、unicode

ドキュメント

モジュール、クラス、メソッドに記載の doc を参照してください。

テンプレート(template.html/utf8):

Python コード:

出力結果:

ソースコード

次の URLにて公開しています。

https://github.com/yuka2py/eepy

 

 

 

投稿日:

cnvk – Python で全角・半角・ひらがな・カタカナ等を変換する


Python で半角・全角の変換やカタカナとひらがなの変換などを行う簡単なモジュールを作ったので貼っておきます。他にも似たライブラリがありますがその一つとして。もしお役に立ちそうに思われた方はご自由にお使いください。で、何か不具合があれば教えてください♪

特徴

  • unicodedata よりは色々細かく指定できます。
  • 追加の変換テーブルを指定するのも簡単です。
  • 変換しない文字を指定できます。
  • 変換方法は単純に replace です。正規表現ほか色々と試したんですが、たぶん早い方です。

ドキュメント

モジュール、関数に記載の doc を参照してください。

ダウンロード

https://github.com/yuka2py/cnvk

コード

 

投稿日:

ファイル内に子モジュールを作る


時々、子モジュールに収めたい機能があるけどファイルは一つにしたいとか、同じモジュールファイル内に子のモジュールを作りたい時があるので、やってみました。

関数からモジュールを作る(デコレータ利用)

モジュール定義用の関数の中で、最後に return locals() ってのがイケていないですが、色々考えても回避できませんでした。orz…

クラスからモジュールを作る(メタクラス利用)

Python 3 なら、クラスデコレータを使えるでしょうかね。

なお、特にクラス定義を使いたい理由がなければ、上の関数定義を利用する方が、モジュールコンテンツのコーディング上便利だと思います。

定義したモジュールのインポート

例えば上述の定義を hoge モジュールに書いている場合、次のような感じで通常のモジュールのように呼び出せるようになります。

どうでしょうか?