Python/Flask と Backbone.js で Markdown エディタを作った
Atom はまだいまいちだし、Sublime Text は使ってると金を要求してくるし、emacs はそろそろ引退かな。Markdown 書くのに Mou とかは便利だけど、長い文章を書いてるとだんだんもっさりしてくる。と、普段使いのテキストエディタをどれにすればいいかここのところずっと考えている。
それとは別に、保存したテキストファイルたちをどう管理すればいいかもよく考える。ファイル名を考えるのがめんどくさい。どこに保存したのか忘れる。ファイルツリーをたどるのがめんどくさい。⌘+s を押すのすらめんどくさい。正直エディタのほうでなんとかしてほしい。
Evernote とか便利だけど、勝手にフォーマットされて困る。コードとか貼付けられない。
というわけで少し前に自分用の Markdown エディタを作った。
左側にエディタ、右側にリアルタイムプレビューが表示される。Markdown エディタとしてはよくある UI。左上にあるプルダウンでメモを選択することができる。メモはサーバーのポスグレに保存される。保存は左側のエディタに書き込みをした時点で自動で行われる。保存ボタンはない。
簡単な Web アプリだけど自分の用途としては必要十分な感じ。 UI のほうは Backbone.js で API は Python/Flask で作った。Python にしたのは Pygments が使いたかっただけ。
Pygments は py-gfm というライブラリと一緒に使うことで Github Flavored Markdown も扱えるようになる。それについては、「Python で Github Flavored Markdown をレンダリングする」 で書いた。
Backbone.js については使うのほぼ初めてで苦戦したけれど、慣れると確かにきれいに書けるなってことで気に入った。Angular よりいいんじゃないかな。(Angular 使ったことない人のご意見です)
あと _.debounce を覚えたので使った。(こういうの毎回自分で実装してた...) javascriptで発生するイベントを間引く - 終わる世界とコンテンツ
Fluid でネイティブアプリ化する
Web アプリとして作ったのでアクセスするには当然 Web ブラウザでアクセスするんだけど、ネイティブアプリにしたほうがよくわからないけどなんかかっこいい気がする。
node-webkit とか試してみたりもしたけど、モチベーションに対して頑張り過ぎな気もしたのでやめた。
そうこうしてたら Fluid という Web アプリをネイティブアプリっぽくみせかけるアプリを見つけたのでこれで適当にネイティブアプリ化した(ことにした)。
先のスクリーンショットは Fluid を作ったので Web アプリなのにネイティブアプリっぽい見た目になっている。あと、アプリケーションのアイコンも設定できるようになる。iconfinder でフリー素材落としてきてつかった。
これでだいたい目的は達成できた。めでたしめでたし。
ヘッダーを見て cut するコマンド作った
データ処理でヘッダーがついてるtsv形式のデータファルを扱うことがあるんですが、フィールドが何番目か数えてから cut コマンドをするのがめんどいし、cut -f 1,3,12 みたいなのが暗号めいてていやなので、ヘッダーを指定して cut できるコマンドを作りました。地味っすね。
こんな感じ。
$ cat a.txt USER_ID NAME AGE 1 Sato 10 2 Suzuki 30 3 Abe 20
$ hcut -f USER_ID -f NAME a.txt 1 Sato 2 Suzuki 3 Abe
PyPI に挙げたので easy_install hcut で入ります。
spring-python メモ
python で DI する方法がよくわからなかったのですが、spring-python というのが StackOverflow で紹介されていました。
Python Dependency Injection Framework - Stack Overflow
Welcome to Spring Pythonâs documentation! — Spring Python v1.2.1.FINAL documentation
その名の通り、使い方はあの Java の spring まんまなので、spring 使ったことのある人は違和感なく使えるのではないでしょうか。
Python の fileinput モジュール便利
python の fileinput モジュール知らなかった。便利ですねこれ。
10.2. fileinput — Iterate over lines from multiple input streams — Python v2.7.6 documentation
pythonスクリプトを呼び出す際、コマンドライン引数にファイルを指定していればそのファイルから、
指定していなければ標準入力を読み込みます。
典型的なUNIXコマンドと似た動きですね。
だからちょっとしたフィルターコマンドを作るのに重宝します。
例 count_lines.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import fileinput count = 0 for line in fileinput.input(): count += 1 print count
実行
$ ./count_lines.py count_lines.py 7 $ cat count_lines.py | ./count_lines.py 7
複数ファイルを指定するとまとめて処理されます。
$ ./count_lines.py count_lines.py count_lines.py
14
input の引数にファイルのリストを渡すこともできます。
#!/usr/bin/env python # -*- coding: utf-8 -*- import fileinput import glob files = glob.glob("*.txt") count = 0 f = fileinput.input(files) for line in f: count += 1 f.close() print count
Pythonでsqliteを使う
標準で使える!ステキ!
使いかたは簡単で、
- connectする
- cursorオブジェクトを取得
- cursor.executeでクエリを発行。プレースホルダとかも使える。
- commitしたりcloseしたり
# モジュールをインポート >>> import sqlite3 # 接続 >>> conn = sqlite3.connect('python.db') # カーソルオブジェクトを取得 >>> c = conn.cursor() # クエリを発行 >>> c.execute("create table test (id integer, name text)") <sqlite3.Cursor object at 0x00000000026F9880> >>> c.execute("insert into test values (1, 'homuhomu')") <sqlite3.Cursor object at 0x00000000026F9880> # クエリを発行(プレースホルダ使用) >>> c.execute("insert into test values (?, ?)", (2, u'ほむほむ')) <sqlite3.Cursor object at 0x00000000026F9880> # SELECTの結果はイテレータになっている >>> res = c.execute("select * from test") >>> for i in res: ... print i[0], i[1] ... 1 homuhomu 2 ほむほむ >> conn.commit() >> conn.close()
みんpy
- 作者: 柴田淳
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2009/04/11
- メディア: 単行本
- 購入: 23人 クリック: 572回
- この商品を含むブログ (87件) を見る
EmacsでPython
EmacsのPythonモードも便利そうだねっていうメモ。
Pythonシェルとの連携ステキ。
- C-c !
- Pythonシェルの起動
- C-M-x
- カーソル位置のクラスやメソッドを実行(評価)
- C-c |
- 選択範囲を実行
- C-c C-c
- カレントバッファを実行
それからデバッグもEmacsから楽々。
http://jones.ling.indiana.edu/wiki/Debug_Python_in_Emacs
ちょっと設定を書けばGUDでもっと便利に。
http://www.emacswiki.org/emacs/PdbNotes
あとはシンタックスチェックをしてくれるこれも便利そう
http://tech.lampetty.net/tech/index.php/archives/category/python
追記 2010/08/17
このエントリで言及しているのは
EmacsのデフォルトのPythonモードではなく、
python-mode.elについてです。
『python-mode.el』と『pymacs』と『pycomplete.el』と - 牌語備忘録
http://d.hatena.ne.jp/CortYuming/20090328/p1Emacs の Python-mode は2種類あったりする。
たしか現在のEmacsデフォの『python.el』と、それ以前からあってこっちの方が使ってる人多そうな『python-mode.el』。