2014年09月12日

iPhone アプリでボタンが押された時にキーボードを隠す

UITextField が active になるとキーボードが表示されますが、そのキーボードを隠す処理は自動では行われません。
キーボードの Enter キーが押されたときにキーボードを隠すという話は検索するとたくさん出てきます。
UITextField の delegate にしたクラスで textFieldShouldReturn: を以下のように実装するだけです。
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
     [textField resignFirstResponder];
    return YES;
}
UIButton が押された時に、表示されているキーボードを隠すという処理は、実はそれよりも相当簡単で、
- (IBAction)handleButtonClicked:(id)sender
 {
    [self.view endEditing:YES];
}
と UIView::endEditing: だけでした。
posted by おちエン at 21:59| Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2014年09月09日

iPhoneアプリでステータスバーを非表示にする方法

今更ながら Objective-C で iPhone アプリの開発をはじめました。
Objective-C は C という名を冠しながらもかなり特殊な構文で、今まで敬遠していました。

相当ビギナーレベルの話ですが、iPhone アプリでステータスバー(時計やらバッテリー残量やらが表示されるところ)を消したい場合の備忘録。
UIViewController もしくはそれを継承したクラスに
- (BOOL)prefersStatusBarHidden
{
    return YES;
}
という実装を追加するだけです。
ラベル:iPhone Objective-C
posted by おちエン at 04:41| Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2014年07月20日

MySQLでMyISAM/InnoDBどちらを使っているか確認する方法

MySQLで、そもそもこのテーブル MyISAM だっけ?InnoDBだっけ?という場合に調べる方法。
使用しているストレージエンジンを把握していないこと自体、若干致命的な気もしないでもないですが。。
use information_schema;
select table_name, engine from tables where table_schema = "dbname";
としてやると、「テーブル名|ストレージエンジン」という風に表示してくれます。
ラベル:MySQL
posted by おちエン at 01:05| Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2014年06月20日

GAE で lxml を使用する方法

Google App Engine で HTML の parse をしたい場合、lxml が使用できます。 GAE で使えるThird-party Libraries はこちらを参照。

lxml を使用するためには、app.yaml に
libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest
- name: lxml
  version: latest
という記述を行う必要があります。こうしておけば、
import lxml.html;

dom = lxml.html.fromstring(content);
という感じで使用できます。

ただし、このままではローカル環境(dev_appserver)で No module named lxmlというようなエラーが表示され、うまく動きません。
ローカル環境では自分で lxml を install する必要があります。
pip を install していない場合は、まず、pip を install してから lxml を install するという手順をふむ必要があります。
$ sudo easy_install pip
$ sudo pip install lxml
ラベル:GAE
posted by おちエン at 02:08| Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2014年04月27日

jinja2でMarkupしたのにescapeされてしまう問題

今回は jinja2 のカスタムフィルターではまった話。

そもそも GAE + jinja2 で autoescape をしたくなければ、main.py などで
application = webapp2.WSGIApplication(
        [
# 省略
        ],
        config = {
                'webapp2_extras.jinja2': {
                        'environment_args': {
                                'autoescape': False,
                                'auto_reload': False,
                                'extensions': ['jinja2.ext.i18n','jinja2.ext.autoescape']
                        },
        }
)
と autoescape を False にしておけば OK ですが、ユーザに投稿させるようなサイトの場合、言うまでもなく autoescape させるべきです。
その場合、autoescape は True にしておいて、escape させたくない jinja2 の変数では、
{{hoge|safe}}
とやればその変数 hoge に関しては escape が行われません。
将来的に問題になる可能性があるので、safe フィルターは使わない方が良いとは思いますが。

カスタムフィルターを作る場合、例えば、入力された文章の改行を <br /> に変更したい場合、
def linebreaksbr(s):
    return Markup('<br />'.join(jinja2.escape(s).splitlines()))
という感じで、戻りを Markup クラスのインスタンスにしてやれば、autoescape が True でもここで追加した<br />はescape されません。
今回、入力された文章の一行一行を <li></li>で囲ったものを出力しようと思い、
def linebreaksli(s):
    result = ""
    logging.error(type(result));
    for line in jinja2.escape(s).splitlines():
        result += u'<li>' + line + u'</li>';
    return result;
というフィルターを作ってみたのですが、肝心の <li> が &lt;li&gt; と escape されるという問題が発生。 若干、ハマってしまいましたが、そもそも jinja2.escape(s) の戻りが Markup クラスのインスタンスになっていて、Markup クラスのインスタンスに + で unicode 文字列を連結しようとすると、unicode 文字列が escape されて連結されてしまうというだけでした。
def linebreaksli(s):
    result = u''
    logging.error(type(result));
    for line in jinja2.escape(s).splitlines():
        result += Markup(u'<li>') + line + Markup(u'</li>');
    return result;
という風にしてしまえば OK でした。
ラベル:GAE jinja2
posted by おちエン at 21:01| Comment(0) | GAE | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。