2014年5月24日土曜日

cordovaでandroidにアプリをインストールするまで

環境設定

手順はhttps://github.com/MobileChromeApps/mobile-chrome-apps/blob/master/README.mdにある。
  • androidSDKをインストールする。
  • .bash_profileにsdk/toolsとsdk/platform-toolsにpathを通す
  • brew install antでantを入れる。入らなかったらbrew updateしてから再度行う
  • npm install -g cca
  • cca checkenvで怒られないことを確認

Projectの作成

以下のコマンドを実行する
cca create APP_NAME

実行

作成したプロジェクトディレクトリで以下を実行
cca run android
これでアプリがdeviceにインストールされる。

プロジェクトの構造

以下のような形になっている。
.
├── config.xml
├── hooks
│   ├── README.md
│   ├── after_prepare
│   └── before_prepare
├── merges
│   └── android
├── platforms
│   └── android
├── plugins
│   ├── android.json
│   ├── org.apache.cordova.file
│   ├── org.apache.cordova.inappbrowser
│   ├── org.apache.cordova.keyboard
│   ├── org.apache.cordova.network-information
│   ├── org.apache.cordova.statusbar
│   ├── org.chromium.bootstrap
│   ├── org.chromium.common
│   ├── org.chromium.i18n
│   ├── org.chromium.navigation
│   ├── org.chromium.polyfill.CustomEvent
│   ├── org.chromium.polyfill.blob_constructor
│   ├── org.chromium.polyfill.xhr_features
│   ├── org.chromium.runtime
│   └── org.chromium.storage
└── www
    ├── assets
    ├── background.js
    ├── index.css
    ├── index.html
    ├── manifest.json
    └── manifest.mobile.json
www以下がwebviewで使用されるファイル。

2014年5月8日木曜日

vimscript書いてて詰まったところのメモ

pyfileで引数を渡す方法

pythonであれば
python sample.py test
という形で実行するがvimではpyfileでpythonファイルを実行できるが、以下の様なやり方ではダメ。
pyfile sample.py test
こうではなく、以下の様にして引数を渡す
:python import sys
" pythonではsys.argvの0番目はスクリプトのファイル名
:python sys.argv = ["sample.py", "test"]
:pyfile sample.py
こうすると想定どおりに引数がpython側で受け取れる。

python側でvimで定義した変数を受け取る

vimscriptの変数をpython側で受け取るにはvim.evalを使用する。
let tmp = "Test"
python << EOM
import vim
print(vim.eval("tmp"))
EOM
こんな感じ

vimでの文字列連結

文字列連結でつい"sample"+"test"とか書きがちだが、.(ドット)でつなげる。
let a = "sample"
let b = "test"
echo a.b

ユーザ定義commandの引数を関数に渡す

<f-args>を使う。
詳細は:h <f-args>で。

Gvimかどうかの判定

has("gui_running")でできる
echo has("gui_running")
1

こんな感じかな。
とりあえず今日一日触ってつまったところをメモした。
初心者過ぎて泣けるな。。。
vimpluginを書くときはまず、:h vim-scriptと:h write-pluginあたりを読むほうがその後が楽だなと思った。

2014年5月7日水曜日

VimScriptをちょろっと調べた時のメモ

vim pluginを開発したいと考えているが、まずはvimscriptについて知らないといけない。
ということでちょっと調べてみた。

http://mattn.kaoriya.net/software/vim/20111202085236.htm
この記事が素晴らしすぎたので、こっちを読むとよいと思います。

あとこことか
http://vim-users.jp/2010/04/hack136/ http://vim-jp.org/tips/start_vimscript.html
とりあえず、備忘録的にやったことを残しておこうと思います。

変数宣言

こんな感じ。
" 数値
let foo = 1
" 文字列
let foo = "bar"
" リスト
let foo = ["foo", "bar"]
" 辞書
let foo = {"bar": "bar"}

関数定義

こんな感じ。
function Foo()
    echo "foo"
endfunction

コマンドラインから実行すると以下のようになる。
:call Foo()
foo

同じ関数名を定義するにはfunction!を指定する
function! Foo()
    echo "foo"
endfunction

スコープ

関数内で有効なローカルスコープ l:、スクリプトファイル内で有効なスコープ s:、グローバルで有効なスコープ、 がよく使う。

こんな感じ。
function! s:Foo()
    let l:foo = "foo"
    echo foo
endfunction
call s:Foo()

Pythonインターフェース

vimscriptではPythonを使用することが出来ます。

まずは使用できるかどうかの確認。
echo has("python")
1

echo has("python3")
1
であればpython2もpython3も両方使えます。

ではvimscriptで実際にpythonを使用してみます。
function! s:Foo()
    python3 << EOM
print("foo")
EOM
endfunction

call s:Foo()
このような形で使用します。

外部ファイルを実行する際は:pyfileコマンドを使用します。

map

基本的なコマンドについては知っているので割愛。

インサートモードにおいて、関数の評価結果から入力文字列を挿入させるためには<expr>を使用する。

inoremap <expr> <c-x> Foo()

command

コマンドモードから実行できるコマンドを定義する。

名前の戦闘は大文字である必要がある。

command! Foo :call Foo()

詳しくは help :command-args を参照。

autoloadとautocmd

http://mattn.kaoriya.net/software/vim/20111202085236.htm
ここ見たほうがよいです。

vimscriptの組み込み関数

機能別に分類してあるヘルプは以下で見れる。

:help function-list

アルファベット順は以下

:help functions

ということで最後の方はだいぶ適当になったけど、これで最低限vimscriptが読めるように
なった気がします。

あとは色々見たり作ったりしながら覚えていこうかと思います。

2014年5月6日火曜日

pythonのデコレータについて

pythonにデコレータについて忘れた部分があったので、メモ書き。


デコレータとは

pythonのデコレータとは関数をラップしたもの。
デコレータを使用せずに関数をラップすると以下のようになる。
def func1():
    print("func1")

def func2():
    func1()
    print("func2")
これはデコレータを使用すると以下のようになる。
def func1(func):
    def wrapper(*args, **kwargs):
        print("func1")
        func(*args, **kwargs)
    return wrapper

@func1
def func2():
    print("func2")
ただこのままだとfunc2.__name__とやったときにwrapperと表示されてしまうので,functools.wrapsを使用する。
def func1(func):
    from functools import wraps
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("func1")
        func(*args, **kwargs)
    return wrapper

@func1
def func2():
    print("func2")
こうすることでfunc2.__name__やfunc2.__doc__が失われることがなくなる。

デコレータで引数を受け取る方法

デコレータとして定義した関数を引数を受け取る関数でさらにラップすることで 引数が受け取れる。
def f1(a=None, b=None):
    def receive_func(f):
        from functools import wraps
        @wraps(f)
        def wrapper(*args, **kwargs):
            if a is not  None and b is not None:
                print("{0} {1}".format(a, b))
            print("f1")
            return f(*args, **kwargs)
        return wrapper
    return receive_func

@f1(a=1,b=2)
def f2():
    print("f2")
ここまでやるとコードの見通しがだいぶ悪くなるなぁ。。。 とりあえず今回はここまで。

2014年5月5日月曜日

djangoでカスタムmiddlewareを作成する

middlewareとはviewの処理を行う前後に処理を挟むためのフレームワークの事を言う。

setting.pyのMIDDLEWARE_CLASSESに使用するmiddlewareを設定する。

middlewareを作成するには以下のメソッドを定義したクラスを用意する。
  • process_request
  • process_view
  • process_response
  • process_exception
  • process_template_response

公式によると以下のような流れで処理が行われる模様。

とりあえず、gistに自分が作成した簡単なmiddlewareを残しておいた。

2013年12月18日水曜日

pythonで標準出力(print)のテスト

簡単なのはdoctestでやれって感じですが。

StringIOを使用すればいけるらしい。
documentはこの辺り。
http://docs.python.jp/2.7/library/stringio.html

サンプルは以下の通り。

import unittest 
import StringIO 
import sys

class Hello: 
    @classmethod 
    def say(cls): 
        print "test",

    @classmethod
    def world(cls):
        print "World"
    
class TestHello(unittest.TestCase): 
    def setUp(self): 
        dumout = StringIO.StringIO() 
        self.sysout = sys.stdout 
        sys.stdout = dumout

    def testSay(self):
        Hello.say()
        sys.stdout.seek(0)
        self.assertEqual("test",sys.stdout.getvalue())

    def testWorld(self):
        Hello.world()
        sys.stdout.seek(0)
        self.assertEqual("World\n",sys.stdout.getvalue())

    def tearDown(self):
        sys.stdout = self.sysout

if __name__ == "__main__": 
    unittest.main()

2013年12月11日水曜日

vimの起動時間を調査する

--startuptime <出力先ファイル名>とつけて起動すると 以下のような形で表示される。
times in msec
 clock   self+sourced   self:  sourced script
 clock   elapsed:              other lines

000.012  000.012: --- VIM STARTING ---
000.085  000.073: Allocated generic buffers
000.365  000.280: locale set
000.373  000.008: window checked
000.810  000.437: inits 1
000.817  000.007: parsing arguments
000.818  000.001: expanding arguments
000.832  000.014: shell init
047.956  047.124: Termcap init
047.975  000.019: inits 2
048.074  000.099: init highlight
062.254  000.168  000.168: sourcing $VIM/vimrc
106.266  000.397  000.397: sourcing /usr/share/vim/vim73/colors/desert.vim
とりあえず自分が遅いのは$HOME/.vimrcの読み込みが遅い模様。 ネットワークドライブから読み込んでるからの可能性が高いな。。。
vimrcの無駄な設定とかなくせば早くなりそうだけど、起動したら基本起動しっぱだからしゃあないってことにしよう。
原因深追いするほど時間もないので。。。