"プログラム" カテゴリのページ

Django: 強制的にINSERTする方法

Djangoでは、save()を使ってレコードを作成したり更新したりすると思います。

オブジェクトが新規作成される場合はINSERT。そうでない場合はUPDATEとDjango側が自動的に切り分けてくれます。

これは、DBレイヤーでは、

  • オブジェクトが持つ主キーがDB中に存在しない=INSERT
  • オブジェクトが持つ主キーがDB中に存在する=UPDATE

ということをしてくれています。

 

でも、毎回必ずINSERTしたい場合はどうでしょう?

Django: キャッシュ(memcache)を設定して超高速化を実現する方法

Djangoには、キャッシュバックエンドとして様々な機構をサポートしています。

  1. メモリキャッシュ
  2. データベースキャッシュ
  3. ファイルキャッシュ

また、バックエンドとは別に、キャッシュ化できるデータの単位も様々です。

  • サイト全体をキャッシュ化
  • ビュー単位でキャッシュ化
  • テンプレートの一部をキャッシュ化
  • オブジェクトの単位でキャッシュ化

特に「オブジェクト単位」でキャッシュ化できるため、原理的には変数ひとつだけをキャッシュデータ化することも可能で、まさに究極の粒度をもったキャッシュ機能であると言えます。

また、もっと上流のキャッシュ機能とDjangoベースのWebサーバーを連携させることも可能です。例えば、squidなどのProxyベースのキャッシュ機能との連携がそれに該当します。

まさに、なんでもあり、のDjangoキャッシュ機能ですが、今回はその中でも最も高速なメモリベースのキャッシュを中心に、キャッシュの設定方法を見ていきましょう。

Django: サイトマップの生成方法

サイトマップを作成すると、Google, Bingなどの検索エンジンに効率的にクローリングしてもらえるようになるだけでなく、ホスティングしているページ全体に対して、何割がインデックスされているのか?検索エンジンの進捗を確認することが可能となり、SEO効果が期待できます。
しかし、サイトマップ一つとっても、そのフォーマットを覚えたり、XMLを整形したりするために多分の労力を払う必要があり、容易ではありません。

しかし、Djangoにはサイトマップを簡単に作成する機能が組み込まれています。
この機能を提供するのが、 django.contrib.sitemap クラスです。

開発者は、モデルに対するサイトマップクラスを定義するだけで、サイトマップ用のビューを生成することが可能です。

簡単なアプリを例にとり、サイトマップの作成方法を見ていきましょう。

Django: ミドルウェアの実装方法(全てのビューに処理をフックする方法)

Djangoでは、アプリ、context_processorsなど様々なプラグイン機能が提供されており、画一的なフレームワークの中でソフトウェアを実装することで効率化・高可搬性を実現しています。

しかし、一旦システムを実装開始すると、システムは様々な環境が依存しあうもので、一つの関数を書き換えると様々なビューやテンプレートファイルに修正範囲が波及する。。。なんてことがよく起こります。

せっかくMVCフレームワークを提供しているのに、それを正しく使わないのが悪い!などと怒られそうですが、理想と現実は異なる訳で、プラットフォームにはそのどちらもフォローできる柔軟な環境が求められます。

既存のシステム全てに共通で処理をフックしたり、テンプレート変数を追加したい。。。などということを実現するにはどうしたら良いのでしょうか?

これを簡単に実現できる方法がDjangoにはあります。
それがミドルウェアです。

Django: URLの逆引き方法

Djangoでは、ビュー関数名やビューに付けた名前(=名前付きURLパターン)から対応するURLを逆引きする機能をサポートしています。

これを URLの逆引き と呼びますが、この機能を使うとHTML上でURLを直接記述する必要がなくなり、アプリケーションの可搬性が高まります。つまり、通常URL設計を変更する場合、テンプレートやビュー内で変更対象となる部分を書き換える必要が出てきますが、このような書き換え作業から開放されるのです。

それでは、URLの逆引き方法を見てみましょう。

Django: context_processorsの使い方

Djangoには、テンプレートファイル内でのみ利用できるテンプレート変数と、グローバル変数のように、どのテンプレートファイルからも利用できるテンプレート変数も存在しています。

そのようなグローバル変数的なテンプレート変数のことをcontext_processorと呼びます。settings.pyにて、TEMPLATE_CONTEXT_PROCESSORS変数に、テンプレート変数を返すメソッドを登録しておくと、どのビューからでも当該変数をコンテキストに追加することが可能となります。

    $ emacs settings.py
      TEMPLATE_CONTEXT_PROCESSORS = (
         "hogeapp.context_processors.user_name",
         ...,
      )
    $ emacs hogeapp/context_processors.py
      def user_name(request):
         if ( request.user.is_authenticated() ):
            return {"uname": request.user.username}
         else:
            return {"uname": None}

上記の例は、ログインしている場合に、アカウント名を常に「uname」というテンプレート変数に格納するような設定です。

Django: モデルクラスから自動的にフォームクラスを生成する方法

Djangoでは、モデルを定義するとそのままフォームを生成してくれる機能があります。
ModelFormという機能で、以下のように自動生成したいフォームクラスのメタクラスに、実際にデータが保存されるモデルクラス名を指定するだけです。

Django: モデル間のリレーションを定義する方法

RDBの世界では、正規化の際にテーブルとテーブルの対応関係を定義することがあります。 Djangoが採用しているO/Rマッパの世界でもリレーションを定義することが可能で、以下2つの メソッドが用意されています。

例として、Djangoの既存んモデルクラスであるUserを拡張する例を記述いたします。

Python: BeautifulSoupで、HTML/XMLをらくらくパージング

BeautifulSoupとは、HTML/SGML/XMLをパージングするPythonライブラリです。 ネーミングにセンスを感じさせるこのライブラリは、実用として考えても大変有用なライブラリです。 これを使い始めると、ありとあらゆるHTML/XMLをいじり倒したくなります。

Python: ファイルロックによる排他制御(サンプルソース)

回は排他制御について説明しました。
Python: ファイルロックによる排他制御(fcntl編)

今回は排他制御を体感するためのサンプルソースを紹介します。

Python: ファイルロックによる排他制御(fcntl編)

PythonでCGI実装していると、CGIからいろんな資源にアクセスすることになります。
RDBとかファイルとか。。。
RDBに対するR/Wは、RDB管理モジュールが同時書き込みに対する排他制御を行ってくれるので 何も意識することはありませんが、ファイルに対するR/Wとなるとそうはいきません。

ファイルで特に問題になるのは、書き込みです。

Python: 関数ポインタの渡し方(汎用ハンドラの作成法)

C言語では関数ポインタと引数を渡してコールバック関数を実現するなんてことが よくありますよね。Pythonでもそれが可能で、要は可変個の引数の渡し方さえ 分かってしまえば簡単に実現可能です。

Python:多次元配列(タプルの配列)のソート方法

前回の記事で辞書配列、リストなどに対する基本的なソーティング方法を紹介しました。
Pythonでのソーティング方法(リスト、辞書配列・連想配列編)

今回は、もうちょっとこだわって、多次元配列(正確にはタプルのリスト)に対するソート方法を 紹介します。

Pythonで簡単にRSSを取得・パース可能なライブラリ:feedparser

Universal Feed Parser は、Pythonで簡単に RSSを取得・パースするためのライブラリとして有名です。
RSSを取得するAPI自体も非常に簡素ですし、 Atom, RSS1.0, RSS2.0など本来XMLフォーマットが全く異なるものを統一的に扱うことができます。

Pythonで簡単にコマンドライン引数をパースする方法(optparse.OptionParser編)

Pythonで値付き引数(ex> --prefix "/hoge/path"など)を簡単に実現したいと思ったことは ありませんか?そんなとき活躍するのがoptparseモジュールのOptionParserクラスです。

Pythonでのソーティング方法(リスト、辞書配列・連想配列編)

Pythonでソーティングをする方法を紹介します。
Pythonでソーティングと対象となるのはリスト型、配列型と辞書配列(連想配列)型です。
ですので、タプル型と集合型はソーティングすることはできません。

Python: popen2を用いた子プロセスの生成方法(Popen3/4, popen3/4メソッドの違いについて)

Pythonプログラム中から他のプログラムを実行する際最も簡単な方法は、

 import os  os.system("ls")

上記例のように、 os.system(cmd) を使用することです。
これは、os.system(cmd)を実行している親プロセスが子プロセスを同期実行(cmdによって実行 されたプロセスが終了するまで親プロセスも停止)することで実現しているのですが、 これでは、非同期実行もできませんし、cmdで実行された子プロセスの結果(標準出力、標準エラー出力) も取得できません。

そんなときに使うとよいのが popen2 クラスです。

Python Image Library (PIL:画像処理ライブラリ)の使い方(画像編集・データ操作編)

PIL記事シリーズも今回がひとまず最終回となります。
以前の記事は以下にありますので、よかったらご覧になられてみてください。
【PIL過去記事】
Python Image Library (PIL:画像編集ライブラリ)のインストール
PILにおけるファイル操作
PILのエフェクト関数

・画像編集操作

画像を拡大したり回転させたりするためには以下のような操作をすればOKです。

import Image im = Image.open("hoge.gif") size = (64, 64) im.resize(size, NEAREST) im.rotate(45)

Python Image Library (PIL:画像処理ライブラリ)の使い方(エフェクト編)

前回に引き続き、PILの基本操作を説明していきたいと思います。
PILの過去記事については以下をご参照ください。

【PIL過去記事】
Python Image Library (PIL:画像編集ライブラリ)のインストール
PILにおけるファイル操作

C言語のファイル入出力関数fscanf()とfprintf()の注意点

ファイルに配列のデータ内容を書き込んで、それを再度プログラム実行する際などに そのままバイナリのように読み込んで利用することがよくあると思います。そんなとき、 型を指定してファイル書き込み・読み込みできるfscanf(), fprintf()は非常に有用です。

C言語のmmap()関数を使ってマップしたファイルで読み書きを行う方法

mmapはいつも引数が多すぎて使い方忘れてハマッてしまうので、メモ。
mmapした領域を読み込むだけなら、PROT_READだけでよいが、読み書きを同時に行うなら 「PROT_READ | PROT_WRITE」としてあげる必要がある。マクロがビットフラグだから当たり前か。。。 あと、当然、mmapに渡すファイルディスクリプタ(open()にて生成される返り値)も、 open("hogehoge", O_RDWR)として、読み書きモードでオープンしてあげる必要があります。

Pyblosxomで各エントリにエントリタイトルを表示させる方法

Pyblosxomでは、デフォルトの環境ではhead.html内で$title変数を使えないため、 エントリファイルで書いたタイトルを<head> ... </head>内の<title&gtタグ に反映することができません。でも、タイトルはGoogleなどの検索エンジンにとっても 重要なファクターなので、ブロガーとしてはここは何とかしたいところです。

Pythonでうるう年や月末日(28日/30日/31日)を簡単に求める方法

Webなどで日時情報(7月1日〜7月31日までなど)を表示するとき、月末日が 30日の月なのか、31日の月なのか?など計算に困ることがありますよね。 そんなとき、Pythonのtimeクラスを用いると簡単に月末日を求めることができます。
まずは、以下に例を記述します。

Pythonでの文字コードでのノウハウ

Pythonで文字定数の値を出力したいときは以下のようにすることで実現可能です。

In [6]: print ord(" ")
32

In [7]: print ord("a")
97

カテゴリー