読者です 読者をやめる 読者になる 読者になる

認証に xAuth を使う Web API を Python で呼び出すメモ

requests と標準ライブラリだけを使って書いてみた。 パラメータの指定、特に oauth_signature の作成がシンドイ。 Authorization の指定も。 # -*- coding: utf-8 -*- from random import getrandbits from time import time import hmac import hashlib im…

Elasticsearch でバルクインサート

Elasticsearch の Python クライアントを使って、 CloudWatch からダウンロードしたメトリクスの データポイントを 1 件ずつ登録していたけど、さすがに遅い。 遅すぎる。 我慢して使えるレベルではなかったので、 Elasticsearch のバルクインサートを使って…

動的に Kibana のダッシュボードを作成する

CloudWatch からダウンロードした RDS インスタンスのメトリクスを、 Elasticsearch に突っ込んで、 Kibana のダッシュボードで可視化するところまではできた。 tnakamura.hatenablog.com RDS インスタンスは今後増えていく予定で、 Kibana のダッシュボード…

Python の Elasticsearch クライアントを使えばいいことに気付いた

CloudWatch のメトリクスを Elasticsearch に突っ込むスクリプトを Python の標準ライブラリだけ使って書いたけど、 Elasticsearch クライアントを使えばよかったことに今さら気付いた。 pip install elasticsearch でインストールしたら、スクリプトはこん…

さくら VPS 1G の CentOS で Apache + gunicorn のベンチマークをとってみた

はじめに 前回、さくら VPS 1G の CentOS に Apache と mod_wsgi をインストールしてベンチマークをとってみた。 さくら VPS 1G の CentOS に Python と Apache と mod_wsgi をインストールしてベンチマークとってみた - present いろいろな構成でベンチマー…

さくら VPS 1G の CentOS に Python と Apache と mod_wsgi をインストールしてベンチマークとってみた

はじめに Python2.7 で開発した Web サービスをホストする予定なので、CentOS に Python2.7 をインストールする。Web サービスを動かす構成としては nginx + gunicorn が流行りだけど、まずはド定番の Apache + mod_wsgi を試してみる。 Python2.7.3をインス…

内製ライブラリのリビジョン情報を整形して Wiki に投稿するスクリプトを書いてみた

内製ライブラリのビルド担当者になっているので、ビルド依頼が来るたびに Jenkins のリリースビルド用ジョブを実行 Wiki に書いているライブラリのリビジョン情報を更新 という作業を行っている。ビルド自体は Rake と Jenkins で自動化したけど、Wiki の更…

ForeinKey のフィールドをもつモデルのフォームを ModelForm で定義してちょっと困ったこと

例えば、Django で下記のモデルを定義したとする。 from django.db import models from django.contrib.auth.models import User class Category(models.Model): user = models.ForeinKey(User) name = models.CharField(max_length=255) class Entry(models…

Python で Product Advertising API を試そうとしたら嵌った件

「Product Advertising API を使った Web サービスを作って小遣いを稼いでやる!」っていうのは半分冗談で、半分本気。Web サービスを作るってのが本気で、小遣い稼ぎが冗談。そんなに甘いモンじゃないからね。Python で Product Advertising API を呼び出す…

pip bundle コマンドを実行すると Cannot find command 'hg' っていうエラーが発生するときの回避方法

pip bundle -r requirements.txt project.pybundleを実行すると Cannnot find command 'hg'っていうエラーが出るときがある。中身に .hg ディレクトリが混入しているパッケージをバンドルしようとすると発生するみたいだ。pip の不具合として報告されてた。 …

やる夫で学ぶ WSGI

____ / \ /\ キリッ . / (ー) (ー)\ / ⌒(__人__)⌒ \ <Webアプリケーションフレームワーク(以下 WAF)を公開したお。 | |r┬-| | これでやる夫もギークの仲間入りだお。 \ `ー'´ / ノ \ /´ ヽ | l \ ヽ -一''''''"〜〜``'ー--、 -一''''''…

Django のクラスベース汎用ビューで FormSet を使う方法

Django のクラスベース汎用ビューの CreateView や UpdateView で、下のような FormSet を使いたくなりました。 from django.forms import ModelForm from django.forms.models import inlineformset_factory from receipts.models import Receipt, Detail c…

Django で OR を使ったクエリを実行する方法

データベースから「A OR B」っていう条件で絞り込んでデータを取得するのって、Django ではどうやるんだろう。「A AND B」なら filter や exclude でいいんだけど…。困ったときは Django の公式ドキュメントを見るべし!ってことで調べてみたら、ちゃんと書…

git submodule でサードパーティ製 Django アプリケーションを管理する

Django で新しく Web サービスを作成する場合、タグやユーザー登録といった汎用的な機能は、自分で実装しなくても PyPI や GitHub を探せば Django アプリケーションが見つかります。ただ、そのままでは使えなくて多少の修正を加えることがあるので、 Django…

クラスベースの汎用ビューを使って高品質プログラミング

Django の汎用ビューの使い方を調べるために公式ドキュメントを読んだんですが、今更ながら Django1.3 で汎用ビューが関数からクラスに変わっていることを知りました。1.3 リリースは今年の3月23日だから、8か月近く知らなかったことになるかな。ハズカシイ…

django-taggit と django-taggit-templatetags の組み合わせが便利すぎる

django-taggit を使ってモデルにタグをつけたり、タグでモデルを検索したりが、簡単に実現できました。これだけでも便利なんですけど、django-taggit-templatetags というアプリを使えばさらに便利になります。 というのも、taggit の Tag クラスは、タグが…

Django で簡単にタグ機能を実装できる django-taggit が便利

Web アプリケーションにタグ機能を実装したくて、いい Django アプリケーションがないか探したみたら、django-tagging っやつが真っ先に挙がってきました。でも、あまり評判よくないっぽい? さらに調べてみたら django-taggit というのも発見。日本語の情報…

Python と Java で AppEngine アプリを開発してみて

はじめに Python と Java でそれぞれ AppEngine アプリを何個か作ってきましたが、AppEngine の利用方針を変更したことだし、このタイミングでそれぞれの開発を振り返ってみます。 Python での開発 フレームワークは AppEngine に特化した Kay Framework を…

AppEngine 用の Flask 拡張作ってみた

先日、AppEngine 向けには自分用のツールだけを開発すると宣言しました。 AppEngine 新料金体系を受けて方針変更 - present 自分用のツールなら Kay みたいなヘビー級のフレームワークを使うまでもないです。なので、Flask を使っています。 ただ、Flask は…

Pjax を使ってフォームの submit で非同期にページを更新してみた

前回、非常に苦労して Pjax を試しました。 Pjax に挑戦したら思っていた以上に苦労した話 - present ページ移動を非同期で行えるようになったので、次はフォームの submit 後も同じようにページを移動したい、と考えてしまうのは当然ですよね。これも Pjax …

Pjax に挑戦したら思っていた以上に苦労した話

GitHub が採用している、非同期でぬるぬる動く画面遷移、これ pushState と Ajax を組み合わせたテクニックで実現されているんですね。その名も Pjax。HTML5 の history.pushState を使うからブラウザの履歴にも対応でき、しかも URL がキレイ。Pjax につい…

Flask にフォームがないから WTForms 使ってみた

AppEngine/Python では長らく Kay Framework を使っていたんですが、最近は Flask に浮気気味です。Flask は URL マッピングをビューのデコレーターで記述できるのがステキですよね。Kay だと作成したビューに割り当てる URL パターンを urls.py に書き忘れ…

Appstats を Flask で使う方法

App Engine アプリ用のプロファイラである Appstats は、Django 用ミドルウェアだけでなく、WSGI 用ミドルウェアも提供していました。考えてみれば、webapp フレームワークで使えないと SDK で提供しても意味無いですしね。だから Flask でも使えます。 apps…

Trac 月 1.6.0 から Trac Lightning 3.1.1 にアップグレードしたら Subversion へのコミットでエラー

先日に引き続き、Trac 月 1.6.0 から Trac Lightning 3.1.1 にアップグレード中です。 Trac 月 1.6.0 から Trac Lightning 3.1.1 にアップグレードしたけどマルチリポジトリが使えない - present 上書きインストールだと上手くいかなかったので、 Trac 月の…

trac.ini を更新するスクリプト書いてみた

Trac 月から Trac Lightning にアップグレードする際、すべてのプロジェクトの trac.ini に、inherit セクションの追加と、チケットのカスタムフィールドの修正をしないといけません。プロジェクトが1個ならまぁ手作業でもいいんですが、10個くらいあるので…

Jinja2 のインクルード機能を使ってより DRY に

Jinja2 って、テンプレート内で他のテンプレートを読み込めるんです。テンプレートを共通化する方法は継承だけじゃないんですよ。私も最近調べて知ったんですけどね。 Template Designer Documentation — Jinja2 2.7-dev documentation この機能を使えば、ペ…

Kay のページング機能を使ってみた

はじめに AppEngine/Python で CGM 系の Webサービスを作っているんですが、運営しているうちにデータ数が多くなりそうです。いや、なりますね。1ページに何百何千もデータを表示すると、見づらいし表示が遅いので、ページングを実装しなければいけません。 …

Jinja2 で for ループのインデックスを取得する方法

リストに詰めたデータを、Jinja2 を使って 5列×n行*1 のテーブルで出力しなければいけなくなりました。 インデックス付きループを使って「横に5個出力したら次の行へ」という処理を書けばいいんですが、インデックス付きループに必要な enumerate が Jinja2 …

PyQuery で再びスクレイピング入門

Python でスクレイピングするときに便利なライブラリで、BeautifulSoup の他によく見かけるのが PyQuery。名前から想像つくと思いますが、HTML を jQuery と同じ感覚で操作できるライブラリです。 前回、BeautifulSoup を使ってはじめてのスクレイピングに挑…

Python と BeautifulSoup でスクレイピング入門

何個か Web アプリを作ったけど、そういえば、まだスクレイピングをやったことがありませんでした。ふり返っても、サービス内で処理が完結するものや、外部 API を呼び出すものばかり。今考えている Web サービスを実装するには、どうやらスクレイピングが必…

Windows のレジストリを読み書きするサンプルを書いてみた

ここのところ Python や Java ばかり触っています。たまには .NET の記事も書かないと怒られそうです。誰に怒れられるのかはわかりませんけど。.NET のネタが無いか考えていたら、Windows のレジストリ操作が必要な場面に遭遇したので、読み書きを行うサンプ…

ファイルをコピーしたりフォルダのシンボリックリンクを作成したりするスクリプト

「フォルダの場合はシンボリックリンクを作成し、ファイルの場合はコピーする」という作業が必要になったので、Python でスクリプトを書いてみました。自分用にメモ。 # -*- coding: utf-8 -*- import os import glob import shutil SRC_DIRS = [ "C:/Projec…

Python で LINQ to Object を実現する python-linq を書いてみた

仕事では C# を使っているせいか、Python でコレクションを操作するコード書いてるとき「LINQ 使えたらな〜」ってたまに思います。そういえば Python にはジェネレータとラムダ式があったな…。LINQ のメソッド構文なら Python で出来るかも。 LINQ to Object…

関数の引数に渡された値の型をチェックするデコレータを書いてみた

C# 暦の長い私が動的言語の Python に初めて触れたとき、関数の引数にいろんな型の値を渡せることを気持ち悪く感じました。今では慣れましたけど。 Python は動的言語なので、正常に動くかどうかは別として、関数の引数に何でも渡せます。その値が使えるかど…

Web アプリに Wiki 記法を簡単に導入できる Python の textile モジュール

Wiki 記法が好きです。Wiki 記法に似た、はてな記法も好きです。ドキュメントは出来れば Wiki に書きたいと常々思っています。実際、私がドキュメントを書くときはたいてい Wiki です。 Word は苦手です。出来上がるものは HTML で書いた方がマシだと思える…

Python で月末の日付を取得する方法

Python で、指定した月の月末の日付を date オブジェクトで取得する必要があって、実装してみたのでメモしておきます。 from datetime import date from calendar import monthrange def get_last_date(year, month): # monthrange は月の1日の曜日と日数を…

Python のマイクロフレームワーク『Flask』を試してみた

今更なんですか… 最近になって、『Flask』という Python のマイクロフレームワークの存在を知りました。フリスクじゃないよ。ずっと Kay や Django みたいなフルスタックフレームワークを追っていたから、Flask に気付くのが遅れました。…って、これは言い訳…

Kay Framework でも Blobstore を使ってみる

先日、App Engine で提供されている Blobstore を、webapp フレームワークで使っていました。 Google App Engine で Blobstore を使ってみる - present でも、実際のアプリ開発では Kay Framework を使っているわけで。 その Kay Framework ですけど、ちゃん…

Google App Engine で Blobstore を使ってみる

Google App Engine(以下 GAE) で画像とかファイルをアップロードするのどう実装しようか迷っていたら、「Blobstore 使えばいいよ〜」というアドバイスをもらいました。そういえば、Blobstore が提供されたことは知っていたけど、試したこと無かったな。 さっ…

Kay の Form を使った RESTful API でのリクエストチェック方法

Google App Engine + Kay Framework で RESTful な Web API を作成するとき、データの更新は HTTP メソッドの PUT を使っています。PUT では、更新に必要なデータがリクエストのボディで渡されてきます。データは JSON 形式を使うことが多いです。 リクエス…

Kay Framework でログイン必須のビューをテストする方法

Kay Framework に同梱されている werkzeug の Client クラスを使えば、ビューの単体テストができます。ただし万能ではなく、login_required デコレータがついたログイン必須のビューはテストできません。仕方ないので、テストしたい処理をログイン不要なメソ…

GAEのモデルからSilverlightのモデルを生成するスクリプト作った

最近実験しているのが、GAE/Python + Silverlight という構成のアプリ。GAE/Python で WebAPI を作って、それを Silverlight から呼び出すイメージです。近いうちにこのブログで連載する予定。 この構成で開発していると、GAE/Python のモデルと Silverlight…

0から1000までの0の数を数える

わんくま内でプチ祭りになっているので参戦。出遅れた感は否めないけど、気にしたら負けかな、と。C# は出尽くしたっぽいので、Python で挑戦。リスト内法表記を使って変態チックに書いてみた。 print(sum([str(n).count('0') for n in range(0, 1001)])) #=>…

Django-nonrel 事始め

Django-nonrel というプロジェクトがあるらしい Django-nonrel は「Django を NoSQL/NoRDB に対応させよう」というプロジェクト。Google App Engine のデータストアをはじめ、SmipleDB・MongoDB・CouchDB といった有名どころをサポートする予定みたい。Djang…

Google App Engine でタグ機能の実装を簡単にする taggable-mixin

昨今のソーシャルアプリではタグ機能はあたりまえ。そのタグ機能を Google App Engine で実装するのを助けるモジュールに、taggable-mixin があります。 taggable-mixin - A mixin class that adds taggability to Google AppEngine Model classes. - Google…

認証必須の URL は app.yaml ではなくデコレータで記述

Google App Engine(以下 GAE)で、ある URL をログイン必須や管理者専用にする方法として、app.yaml で指定する方法があります。でもこの方法だと、RequestHandler のコードを見たとき、ログイン必須なメソッドなのかが分らないので、好きじゃないです。「ロ…

Kay Framework に RESTful な API を実装するための機能が追加されていた

以前 appengine-rest-server を紹介したときに「Kay Frameworkに追加されないかな」なんて書いていたら、本当に追加されました。 23. 汎用ビューグループ — Kay v3.0.0 ドキュメント ソースコードを見たところ、appengine-rest-serverのソースコードをKayに…

Kay Framework で Model を JSON に変換する方法

以前 Google App Engine でモデルを JSON に変換する方法を紹介しました。 Google App Engine の Model を JSON に変換する方法 - present この時はわざわざ simplejson のカスタム Encoder を自作していましたが、Kay Framework を使う場合はもっと簡単な方…

appengne-rest-server で作る簡単 Web API

はじめに リッチな UI を持つ Web アプリを作るなら、クライアントは Ajax か Flash、または Silverlight を使うと思う。そうすると、表示するデータを非同期に JSON または XML で取得するために、Web API を実装することになる。でも、リクエストパラメー…

Kay Framework で Twitter につぶやきを投稿する方法

先日、Kay Framework で認証に Twitter の OAuth を使えるようになったので、今度はつぶやきを Twitter に投稿してみた。Twitter への投稿を urlfetch を使って一から実装するのは面倒なので、 Google App Engine 用の Twitter ライブラリ『AppEngine-OAuth-…