こんにちわ。今日から10月が始まります。nginxでbasic認証ためのパスワードを生成するときに、通常Apacheに 付属しているhtpasswdを使うことになる。けど、私の環境ではApacheはいれてない。opensslで生成することも可能 なんだけど、docoptというCLIを簡単に作成できるライブラリ があるので、それを使って実装します。pythonにはhtpasswdという ライブラリがすでにあるのでwrapするだけの実装です。もう一つ、車輪の再発明ですがpypiにもuploadします。 そういえば、CLIというと、paverも気になりますね。

docoptでCLIを作成

docoptはmoduleにコメントを書いておけばそれをparseして、結果をdictで返します。それで どんな引数があるかわかる。下記のコードは動作しているもので、htpasswd-cli hogeとコンソールから入力すると、 <password>に、引数としてhogeが入ります。今回の要件はpasswordをhashして、htpasswdに渡すだけ なので簡単でした。argparseを使ったことがないからわからないけど、もう少し複雑になるんでしょ。

パッケージングに何をつかうの?

pypiへuploadするために必要なことは、パッケージングすることです。パッケージングするには、 何を使えばいいのか。Distutils, setuptools, distributeがありますが、2013年10月時点では、 setuptoolsです。経緯についてはdistribute と setuptools がマージされた をご覧ください。公式のPython モジュールの配布を 見るとdistutilsを使ってますが、setuptoolsです。documentは英語しかないので、 Building and Distributing Packages with Setuptools を読みました。あまり読めなかったけど。

何をかけばいいの?

何をかけばいいのかわからなかったので、 httpiesetup スクリプトを書くを参考にしました。 大まかに二つあり、何をインストールするかとメタデータです。何をインストールするかとは、 パッケージをインストールするかスクリプトをインストールするかなどです。依存関係も含まれます。 メタデータは、パッケージ名やバージョンや著者などがあります。詳しくは Additional meta-data をご覧ください。

メタデータで困ったのは、licenseとclassifiersでした。licenseに関してこの際に調べようと思い、 ライセンスの選択を恐れる必要はありません を参考にして、MIT LICENSEにしました。classifiersはhttpielist_classifiersを参考にして、 以下の項目を記しました。

  • Development Status
  • Programming Language
  • Environment
  • Intended Audience
  • License
  • Topic

それで、要件はscriptです。scriptsで書けますが、 entry_points で書くことにしました。moduleを指定したあとに:で区切って関数を指定します。メタデータと 合わせて書いています。

localで試す

pypiにあげる前に、localでうまく動作するか試したいですね。調べるとありました。pipでローカルの ファイルをinstall, uninstallできます。

# install
pip install -e .

# uninstall
pip uninstall htpasswd-cli

大丈夫であれば、pypiにuploadして完成です。

問題だったとこ

moduleの命名規則とパッケージの配布物ではまりました。htpasswd-cliと名付けているんですが、このままつけると python setup.py sdistでエラーが起きるんですよね。 moduleの名前規則 を見ると当然のことで、-は使えませんでした。そういえば、-とかいままで一切使わなかった。scriptの名前として はこのまま利用できます。次へすすんで、setup.pyのlong_descriptionのところをみると、markdownを読み出して います。python setup.py sdistでパッケージしても、markdownをパッケージしてくれません。そのため、 エラーになります。 パッケージに直接関係のない配布物を含めるには、MANIFEST.inを利用します。

最後に

これにて、toenobu.nameのblogは終わります。読んでいただいた方がいたら、幸いです。

Read and Post Comments

こんにちわ。こんにちわ。連日の猛暑をいかがお過ごしでしょうか。ニートのとおのぶです。 answer.pythonpath.jpというpythonの質問サイトがあったんですが、 いつのまにかなくなっていました。pythonに紛れてphpの質問もいくつかあったことが原因なのでしょうか。 プアグラマーな僕にとって面白かったので悲しんでたところ、新しく面白いサイトが出てきました。 pythonhackers.comです。flask制っぽい。そのコンテンツの一つが redditのpythonカテゴリーから引用していて、その中で pythonの面接時の質問事項 がおもしろそうだなと思ったので、日本語でも書いてみようと思います。なお、答えはありません。

誤っているところは、そっと教えていただけると助かります。

Pythonの面接時の質問事項

はじめてPythonの面接を受けようと思って、可能な限り下記のように質問をまとめてみた。参考の元となるのは、 redditからで、この他に何かあったら教えてほしい。

初級/中級

  • Pythonのデコレータって何?どうやって使うの?
  • Pythonのバージョンが違ったりライブラリのバージョンが異なるたくさんのプロジェクトをどうやって管理する?
  • PEP8って何?プログラムを書くときにPEP8に従って書く?
  • 引数ってどうやってわたってるの? 参照の値渡しとは?
  • リスト内包表記・辞書内包表記って知ってる?一つ例を教えてくれないか?
  • リストの3番目のアイテムを取り出す方法を3つ教えてください。
  • リストとタプルの違いを知ってる?一つ例を教えてくれないか?
  • rangeとxrangeの違いを知っていますか?
  • 2系と3系の違いをいくつか教えてください。
  • with statementの利用の仕方について
  • インポート文を並びかえることなくインポート文の循環参照をさけますか?
  • import all の何が誤っていますか?
  • GIL(global interpreter lock)の重要性とは?
  • <foo>のような特殊メソッドは何?どんな風に動くの?
  • ファーストクラスオブジェクトとして関数を使いますか?
  • "class Foo"と"class Foo(object)"の違いって何?

ちょっと難しい

  • 8GBのファイルをどうやってreadしますか?
  • Pythonの好きではないところはどこですか?
  • string.atoi や int()といった元々ある関数を使わずに、ascii文字を正数に変換できますか。

主観的

  • tabとspaceどちらを使ってますか。どっちがいいと思いますか。

感想

GILとかはじめて聞きました。循環参照の問題は意図を汲み取れてないと思うんだけど、循環参照 になるような関数を外に出して依存性をなくすとかでいいんやろうか。なんとなくわかっている つもりでも言葉に出して説明するのは難しいということを再認識しました。わかってないだけか。笑 redditでは、 追加質問や回答を見られるので、そちらもご覧になってください。

Read and Post Comments

はじめてのweb serviceの作り方

いつも、ニートです。前回、はじめてのweb servicesというログを書きました。あいかわらず、誰も来ないサービス になってるけどな!今回は、環境構築を書こうと思います。こっちでも、書いたけどな!

構成

  • server
    • 言語 python 2.7.5
    • web frame work flask
    • 永続化 redis
    • nginx
    • uwsgi
    • amazon ec2 micro
  • front
    • jquery
    • twiiter bootstrap, bootswatch, awesome font
    • full calendar
    • coffeescript
    • less
  • 管理
    • yeoman(grunt)
    • bitbucket
    • hg

自分が毎日使うようなサービスを目指す

自分が毎日使うようなサービスを目指しました。人に使ってもらうということをあまり意識しないようにしました。 もちろんたくさんのユーザに使ってもらいたいですが、小さいところにこだわり過ぎてサービスイン できないことが怖かったからです。途中で挫折しかけたときに、これが功をそうしました。自分が不便だな と思ったら、その段階で直せばいいんです。修正できるような仕組みにしておくことが大切なんじゃないのかな。

自分が好きな言語で、小さいフレームワークを選択する

書いてて楽しい方がいいですよね!python 2.7.5とflaskを選びました。pythonで有名なframe workは、djangoとか pyramidとかあるけど、flaskを選びました。microと名乗っていたからです。micro frameworkなので求めている機能 がない場合もあります。そういう場合、extensionがあるかもしれないので、そちらを使います。snippetも 役立ちます。今回、sessionの実装や、メッセージキュー を参考にしました。
日本語ドキュメントもあります。ググるとこれと違うのが 出てきますが、こちらの方が新しいですね。翻訳してくれた方に感謝!他のわからないところは、stack over flow 頼みでなんとかいけました。

デザインが苦手だったので、巨人の肩にのろう

cacooを使って、ワイヤーフレームを書きました。それから、ガシガシhtmlやcssを書き始めました。はじめから htmlを書き始めると小さいところにとらわれすぎて可能性があるので、大枠から埋めていく作戦です。 twitter bootstrapを使うことによってワイヤーフレームどおりかけると見込んでいましたが、うまくいきません でした。ある程度のhtmlやcssのことが理解できていないと、デザインのとおりにかけませんね。 簡素すぎるところに、bootswatchawesome font をつかうことで華やかなが増します。

2013年10月01日 追記
startbootstrapは、デザイン初心者の助けになるかもしれない。

構成管理を楽にしたい

ソースコード管理はhg・bitbucket、ホスティングはaws、自動化ツールはgruntを使いました。gitとgithubはどうも 苦手で、hgとbitbucketはそれよりも楽です。hgの方がsubversionのコマンド体系と似ていたためしっくりきてたり、 bitbucketは日本語訳があったため楽でした。
gruntは、lessやcoffeescripのビルドやったり、ファイルコピーしたり、小さなタスクをまとめておけるので便利です。

まとめ

他の人の構成管理を知りたいので、書いてみました。
私のソースコードはここだす。早く働きたい!

参考にしたサイト

Read and Post Comments

fizzbuzzっぽいの

3の倍数と3が含まれる数字のときに、(・∀・)vになります。

実装

>>> for i in range(1, 31):
...     if i % 3 == 0 or "3" in str(i):
...          print "(・∀・)v"
...     else:
...          print i
...

1
2
(・∀・)v
4
5
(・∀・)v
7
8
(・∀・)v
10
11
(・∀・)v
(・∀・)v
14
(・∀・)v
16
17
(・∀・)v
19
20
(・∀・)v
22
(・∀・)v
(・∀・)v
25
26
(・∀・)v
28
29
(・∀・)v
Read and Post Comments

closureを理解していたつもりが、理解していなかった。
+1する関数を作ろうヽ(´Д`)ノ

javascript

//chromeのjavascriptコンソール
function def(p){
    return function(){
               return p++;
           };
}

> def10()
  10

> def10()
  11

> def10()
  12

python2.7

http://gihyo.jp/dev/serial/01/pythonhacks/0001の記述にあるとおり、外側の変数へ代入ができないため、エラーとなる。

>>> def function(p):
...     def plus():
...             p += 1
...             return p
...     return plus
...

>>> f10 = function(10)
>>> f10()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in plus
UnboundLocalError: local variable 'p' referenced before assignment

リストを利用するでエラーを回避する。

>>> def function(p):
...     list = [p]
...     def plus():
...             list[0] += 1
...             return list[0]
...     return plus
...

>>> f10 = function(10)
>>> f10()
11

>>> f10()
12

>>> f10()
13

python3.0

python3.0以降は、nonlocalでできる(っぽい)

#実行したのは、python3.2
>>> def function(p):
...  def plus():
...      nonlocal p
...      p +=1
...      return p
...  return plus
...

>>> f5 = function(5)
>>> f5()
6

>>> f5()
7

>>> f5()
8

lambdaを利用して短く書くこともできるようですが、ここで一旦終了です。

Read and Post Comments

Next Page »