Python/Flask と Backbone.js で Markdown エディタを作った

Atom はまだいまいちだし、Sublime Text は使ってると金を要求してくるし、emacs はそろそろ引退かな。Markdown 書くのに Mou とかは便利だけど、長い文章を書いてるとだんだんもっさりしてくる。と、普段使いのテキストエディタをどれにすればいいかここのところずっと考えている。

それとは別に、保存したテキストファイルたちをどう管理すればいいかもよく考える。ファイル名を考えるのがめんどくさい。どこに保存したのか忘れる。ファイルツリーをたどるのがめんどくさい。⌘+s を押すのすらめんどくさい。正直エディタのほうでなんとかしてほしい。

Evernote とか便利だけど、勝手にフォーマットされて困る。コードとか貼付けられない。

というわけで少し前に自分用の Markdown エディタを作った。

tototoshi/gfm-editor

左側にエディタ、右側にリアルタイムプレビューが表示される。Markdown エディタとしてはよくある UI。左上にあるプルダウンでメモを選択することができる。メモはサーバーのポスグレに保存される。保存は左側のエディタに書き込みをした時点で自動で行われる。保存ボタンはない。

簡単な Web アプリだけど自分の用途としては必要十分な感じ。 UI のほうは Backbone.js で APIPython/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 アプリをネイティブアプリっぽくみせかけるアプリを見つけたのでこれで適当にネイティブアプリ化した(ことにした)。

http://fluidapp.com/

先のスクリーンショットは 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 使ったことのある人は違和感なく使えるのではないでしょうか。

インストール

 $ sudo pip install springpython




... Java くせえ


Yaml-based configuration

PyYAML に依存しているのでインストールします。

 $ sudo pip install PyYAML



XMLよりはこっちのほうが良いかな。


Python-based configuration

Spring の Java-based configuration に対応するものですね。

4. The IoC container



Java の Spring では Java-based で書くことでコンパイル時に設定ミスに気づけるというメリットがあるのですが、
Python動的言語だし、好みですかね。

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

みんなのPython 改訂版

みんなのPython 改訂版

読んだ。
Python文字コード関係のとこ頭がこんらんしてたけどこんらんとけました。

EmacsでPython

EmacsPythonモードも便利そうだねっていうメモ。
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/p1

EmacsPython-mode は2種類あったりする。

たしか現在のEmacsデフォの『python.el』と、それ以前からあってこっちの方が使ってる人多そうな『python-mode.el』。