ラベル 四十の手習い の投稿を表示しています。 すべての投稿を表示
ラベル 四十の手習い の投稿を表示しています。 すべての投稿を表示

2014-02-22

Angular JS のチュートリアルを写経

Python 旅館 2014.02 なる寄り合いに参加した。会議室を借りて、だべったりコード書いたりする。今回は Angular JS のチュートリアルを写経した。

このチュートリアルは、各ステップで、すべてのソースコードが文書に書かれていない。git checkout step-8 を実行すると、ステップ8でのすべてのファイルの変更が分かる。この方式だと、私はステップをきちんと入力せずに、なんとなく解説を読んで分かったような気になる。もちろん分かっていない。

というわけで、写経してチュートリアルを読み進めていった。結果として有効だったと思う。モジュールの基本的な考え方がなんとなく見えたし、コントローラ、フィルタ、サービスを追加するイディオムらしきものも分かった。「写経」は定義のゆれが大きい言葉なので、具体的にやったことを書いておく。


  • チュートリアルのリポジトリを git clone する。
  • git checkout step-1 とかしながら、ステップを進めていく。
  • 別のディレクトリに、チュートリアルのコードを写していく。
    • npm install は使わない。
    • index.html から写経し、必要なファイルを追加していく。
  • これは何が起こっているのだ?という箇所があったら、チュートリアルのドキュメントを読む。
  • 次のステップへ。

を、繰り返した。スマホのカタログサイトを作るというチュートリアルで、スマホのスペックが書かれたJSON ファイルは、1ファイルをちょっとだけ写経したあとは、ファイル郡を丸ごとコピーした。CSS や HTMLテンプレートで、似たような繰り返しはコピペで済ませた。

2014-02-08

pyenv と tox で複数バージョンの Python に対応したライブラリ開発

生まれてはじめて PyPI にコードを登録した。Python 2.7 と 3.3 で使えるようにするにあたり、ライブラリの実装とは直接関係ないところで、とまどった。現時点での手順を記録しておく。

以下を前提とする。

  • OS X 10.9.1 (Mavericks)
  • homebrew でパッケージを管理
  • pyenv, pyenv-virtualenv で OS 上の Python 環境を管理
  • PyPI に登録するライブラリは Python 2.7 と 3.3 に対応

まず始める

shimizukawa によるハンズオン資料公式ドキュメントを併読しながら進める。基本的な作業はハンズオンでだいたい分かる。とはいえ、あなたが持っているライブラリは、必ずしもチュートリアルどおりではないだろうから、公式ドキュメントのガイドが必要になるだろう。

ところで、ナウなヤングは egg じゃなくて wheel を使うらしい

pyenv と pyenv-virtualenv をインストールする

pyenv は先週まで存在すら知らなかった。肉の日生まれの wozozo が使っているらしいので、試すことにした。まずインストールする。

$ brew install pyenv pyenv-virtualenv
$ cat >> ~/.zshrc
export PATH=$HOME/.pyenv/bin:$PATH
if which pyenv > /dev/null; then eval "$(pyenv init - zsh)"; fi

pyenv は複数の Python インタプリタをインストール/アンインストールするツールだ。pyenv-virtualenv は、pyenv と virtualenv を一緒に使いやすくする。実際に使ってみる。

$ pyenv install 2.7.6
$ pyenv virtualenv 2.7.6 foo-27

ひとつめのコマンドで Python 2.7.6 をインストールする。通常 ~/.pyenv/versions/2.7.6/bin/python にインストールされる。他にも pip なんかも入る。

ふたつめのコマンドで、Python 2.7.6 をベースに virtualenv を作る。通常 ~/.pyenv/versions/foo-27/bin/python に構築される。pip の他に activate なんかも入る。

同様に Python 3.3 をインストールして、仮想環境を作る。

$ pyenv install 3.3.3
$ pyenv virtualenv 3.3.3 foo-33

普段は Python 2.7 で作業しているので、おそらく foo-33 環境は不要だ。Python 3.3 については、tox が virtualenv を別途作ってくれる。けれど、カジュアルに pip とかしてしまうと、元の環境を壊してしまう。元の環境は綺麗にしておきたいので foo-27 と foo-33 環境を作る。

つづいて、プロジェクトで foo-27 と foo-33 う使うように設定する

$ cd /path/to/foo
$ pyenv local foo-27 foo-33
$ cat .python-version
foo-27
foo-33

pyenv local X Y を実行すると、そのディレクトリで使う Python 環境を設定する。ここでは foo-27 と foo-33 だ。

順序には意味がある。python コマンドを発行した時には、foo-27 環境の Python が呼び出される。

そして foo-27 と foo-33 の両方を指定する必要がある。後述する tox は python2.7 や python3.3 というコマンドを実行する。このとき pyenv local で指定された環境を探しに行くからだ。pyenv local foo-27 だと python3.3 が見つからないというエラーがでる。

ref. Using tox with pyenv #92



tox を設定する


$ pip install tox pytest
$ pip freeze | grep -v wsgiref > requirements.txt

wsgiref を含まないようにしている。理由は後述。

tox を使うための設定ファイルは以下のとおり。

$ cat > tox.ini
[tox]
envlist = py27,py33

[testenv]
deps = -rrequirements.txt
commands=py.test


envlist で py27 と py33 を指定しているため、このディレクトリ以下で、ビルドやテスト時に python2.7 と python3.3 を呼び出す。

tox.ini ファイルで、Python 2.7 インタプリタをフルパスを指定できる。だが、やらない。小さなプロジェクトだけれど、自分のところでしか動かないような設定にしたくないからだ。

tox を実行


$ tox

Python 2.7 用に virtualenv して、インストールして、ビルドして、テストを実行。Python 3.3 も同じ。

requirements.txt に wsgiref が含まれていると Python 3.3 で以下のようなエラーが出る。


Downloading/unpacking wsgiref==0.1.2 (from -r requirements.txt (line 7))
(...)
  File "./ez_setup/__init__.py", line 170

    print "Setuptools version",version,"or greater has been installed."

                             ^

SyntaxError: invalid syntax


PyPI へ登録する


$ python2.7 setup.py sdist bdist_egg upload
$ python3.3 setup.py bdist_egg upload

これで登録はできるが、こういう呼び出し方でいいのか自信がない。


まとめ


  • はじめて setup.py を書いた。
  • ヤク刈り、とは言わないけれど、地味に解決すべきことがことがあった。
  • 明日は肉の日である。 

2014-01-26

git log --graph --decorate=full

git を使っていて、ブランチやコミットがどうなっているのか知りたくなる。SourceTree を使っていると、グラフを可視化してくれるんだけど、git log と入力しただけだと、ずらずらっとシーケンシャルに出てくるだけで、わかりにくい。hg の glog エクステンションみたいなのはないのか、と探した。

git には標準で、そんな機能はついている。

git --graph --decorate=full

decoreate を full にするのは、ブランチ名を表示させたいから。デフォルトの short では、コミットのハッシュしか表示されない。

--pretty=format:xxx を使うと、より細かく設定できる。

[alias]
 glog = log --graph --date=short --decorate=short --pretty=format:'%h %Cblue%d%Creset %cd %cn %s'

けど、もうこんなことやるのだるいので、 --graph --decorate=full だけをエイリアスにしておいた。

2014-01-10

Vagrant のチュートリアルをやった

Vagrant のチュートリアルをやった。仕事で使うツールが、間接的に Vagrant を使っている。基本的なことくらい知っておこうと考えた。

Vagrant は virtualbox、VMWare Fusion、AWS EC2 の操作をラップする、と理解している。チュートリアルでは virtualbox が操作対象である。

vagrant init は、Vagrantfile を作る。Vagrant レイヤでの仮想マシン設定項目が、 Ruby で記述されている。vagrant init はひな形を作る。ユーザが用途に合わせて編集する。

vagrant box add は、box(仮想マシンイメージ)を取得して、~/.vagrant.d/boxes ディレクトリに保存する。

vagrant up はVagrantfile の box を読み取り、box を使って virtualbox 上で仮想マシンを起動する。このとき、.vagrant/machines/ 以下に仮想マシン情報が書き込まれる。

プロジェクトディレクトリは、仮想マシンの /Vagrant ディレクトリにマウントされる。ローカルで好きなツールを使って編集すればよい。

Vagrantfile にプロビジョニングの方法を記述しておくと、最初に vagrant up したときや、vagrant reload --provision したときに実行される。チュートリアルでは、/Vagrant ディレクトリ以下に Apache をインストールするシェルスクリプトを配置した。

なるほど。なるほどですね。

2014-01-08

bpython をインストールした。まだ使っていない

bpython をインストールした。Python のインタラクティブシェルを拡張したもの、と理解している。たとえば、入力中に関数やメソッド名の候補が表示される。パス名や、引数のヘルプも出る。

$ bpython
>>> import os.path
>>> os.path.e
┌──────────────┐
│exists     expanduser             │
│expandvars extsep                │
└──────────────┘

オリジナルの環境にはできるだけ入れたくない。しかし、プロジェクト毎の環境に入れるのもちょっと違う気がする。時雨道場に、シェルでログインしたときに、virtualenv を適用した環境にする、という教えがあった。bpython をインストールした環境を作り、 ~/.zshrc.local に以下のように書いておいた。

export VIRTUAL_ENV_DISABLE_PROMPT=1
source ~/.virtualenvs/default/bin/activate
unset VIRTUAL_ENV_DISABLE_PROMPT