サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
iPhone 16
momijiame.tumblr.com
Python で並列処理をするにはどうするのか調べたところ、どうやらマルチプロセスにするのが一般的らしい。 Python はマルチスレッドにしても CPU の並列度を上げられないので、大抵は使わないそうな。 そして、マルチプロセスのアプリケーションを作るには multiprocessing モジュールというのが便利らしい。 ということで、今回は以前作った neetd (ニートディー・デーモン) をマルチプロセス化して neetsd (ニーツディー・デーモン) にしてみた。 #!/usr/bin/env python # -*- coding: utf-8 -*- import time import multiprocessing import daemon class NeetsDaemon(object): def __init__(self, processes): self.pro
最近の Python パッケージは大抵 setuptools で管理できるように作られてる。 その場合 Python パッケージから RPM を作るのも比較的楽にできる。 今回使う環境は以下の通り。 $ cat /etc/redhat-release CentOS release 6.5 (Final) $ uname -r 2.6.32-431.11.2.el6.x86_64 どの Python パッケージをサンプルにしようか悩んだけど、試しに自分で作ったものにしてみる。 $ sudo yum -y install git $ git clone https://github.com/momijiame/cmonkey.git $ cd cmonkey setuptools に対応した Python パッケージの場合、トップディレクトリに setup.py というファイルがある。 $ l
前回は SQLAlchemy で ActiveRecord パターンを実装してみた。 今回は同様にデータベースに関わるアーキテクチャパターンとして DataMapper パターンを実装してみる。 まず、あらかじめシステムに SQLAlchemy をインストールしておく。 $ pip install sqlalchemy DataMapper パターンではデータソースとドメインの分離に主眼が置かれている。 データベースのスキーマとドメインオブジェクトの間に、両者をマッピングするレイヤを入れることで抽象度を高めるパターンと理解した。 以下のサンプルコードではドメインオブジェクトの User とデータソースの UserRecord 及び AddressRecord を UserMapper で変換して扱っている。 #!/usr/bin/env python # -*- coding: utf-8
factory-boy はテストで使うオブジェクトを生成するためのファクトリークラスを作るためのパッケージ。 Ruby の factory-girl というライブラリにインスパイアされたものらしい。 factory-boy を使うと、依存関係が多いのにそれらをモックにしづらい、データベース周りのテストを書くのが楽になる。 今回は、その factory-boy を使って実際にテストを書いてみた。 テストする対象は Python の O/R マッパ SQLAlchemy で作ったモデルにした。 あらかじめ、SQLAlchemy と factory-boy (fake-factory)をインストールしておく。 $ pip install SQLAlchemy fake-factory テストする対象として以下のようなモデルを作った。 ユーザ (User) とそれに付随するメールアドレス (Ema
SQLAlchemy は pip でインストールしておく。 $ pip install SQLAlchemy 今回例にしたのはユーザとメールアドレスの関係。 One to Many (1 : 多) from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.schema import Column, ForeignKey from sqlalchemy.types import Integer, String from sqlalchemy.orm import relation from sqlalchemy.engine import create_engine from sqlalchemy.orm.session import sessionmaker Base = declarative_base
今回紹介するのは Libvirt/KVM で管理している動作中の VM に NIC を追加する方法。 NIC を追加する VM は Libvirt/KVM でインストールしておく。 Libvirt/KVM の使い方に関してはこちらやこちらの記事が参考になると思う。 今回使う環境は以下の通り。 $ uname -r 2.6.32-431.5.1.el6.x86_64 $ cat /etc/redhat-release CentOS release 6.5 (Final) 以下の VM に NIC を追加することを考える。 $ sudo virsh list Id 名前 状態 ---------------------------------------------------- 3 libvirtvm 実行中 VM にログインしてインターフェースの状態を確認する。 現状は eth0 しか存在
前回は ipvsadm コマンドを直接使って LVS を冗長化せずに使ってみた。 今回は keepalived を通して LVS を冗長化して使ってみる。 構成は前回と同様、方式は DSR でバランスアルゴリズムは rr を使う。 ただし LVS の IP アドレスは 192.168.33.{11,12} で Web サーバの IP アドレスは 192.168.33.{101,102} に変更している。 LVS 用のホストをセットアップする x2 まずは必要なパッケージをインストールする。 $ sudo yum -y install keepalived ipvsadm インストールできたら keepalived のコンフィグを編集する。 keepalived は LVS をラップする機能がデフォルトで組み込まれているので、コンフィグを変更するだけで動作する。 $ sudo cp /etc
今回は実践機械学習システムの第七章を参考にして、線形回帰分析について学んでみる。 使用する Boston データセットというのは、ボストンの物件の価格にその物件の人口統計に関する情報が付随したものだ。 つまり、ある物件の人口統計に関する情報を元に、その物件の価格を予測することになる。 線形回帰というのは説明変数を元に応答が一次関数で表されると仮定したモデルを回帰に使用するものだ。 ようするに、例えば部屋の数が多い住宅はその分価格も高いのではないか、という感じで説明変数が目的変数といい感じに比例する関係にあるんじゃねと考える。 今回は線形回帰分析に scipy と scikit-learn を、グラフ描画に matplotlib を使う。 $ pip install scipy scikit-learn matplotlib まずは、一つの説明変数を元にした (一次元の) 回帰から取り掛かる
Vagrant の VM にハードディスクを追加したい場合、VirtualBox の GUI を使って手動でハードディスクを追加して、その VM を元に Box ファイルを作るというやり方がまず考えられると思うけど、面倒なのでぶっちゃけやりたくない。 できれば Vagrantfile の設定から追加できると良いなと思い、探してみたところ以下の Gist が見つかった。 https://gist.github.com/leifg/4713995 早速、上記の内容を元に Vagrantfile API v2 っぽく書きなおしてみた。 $ vagrant --version Vagrant 1.3.5 $ cat Vagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : VAGRANTFILE_API_VERSION = "2" Vagrant.c
Python で CLI のコマンドを実行したいときは subprocess モジュールを使う。 subprocess モジュールを使う以外にもやり方はあるみたいだけど、それらは obsolete らしい。 本題だけど subprocess モジュールを使ってコマンドを実行したときに、返り値を見ながら標準出力、標準エラー出力の内容も得る方法が意外と見つからなかった。 subprocess.check_call() 関数を使えば返り値が見られるけど標準出力、標準エラー出力が得られなさげ。 subprocess.Popen クラスを使うと標準出力、標準エラー出力は得られるけど返り値はどう得られるんだろう? ドキュメントを読んだりソースコードを見ていった結論が以下。 #!/usr/bin/env python # -*- coding: utf-8 -*- if __name__ == '__m
作図をするときに使うソフトというと PowerPoint とか Visio とか色々あるけど、大抵は GUI で素材をチマチマとドラッグアンドドロップしていく系が多いと思う。 ただ、保存形式がバイナリだとバージョン管理なんかと相性悪いし、なにかをひとつ追加するだけで周りを全部移動させたりーとか考えると結構めんどいこともある。 それに対して blockdiag シリーズはテキストベースの設定ファイルを図に変換することができるツールだ。 blockdiag シリーズは作成する図に応じて blockdiag、seqdiag、nwdiag、actdiag と分かれていて、それぞれブロック図、シーケンス図、ネットワーク図、アクティビティ図を作成することができる。 まずはブロック図を作成できる blockdiag から使ってみよう。 OS X だと、まずは Homebrew で依存パッケージを入れてお
まだ全然理解してないけど、自分で書いた Python のコードを配布できる形にするには setup.py を書けばいいみたい。 サンプルは helloworld ライブラリをインストールすると共に greet コマンドを使えるようにするというもの。 ディレクトリ構成は以下。 . ./helloworld ./helloworld/__init__.py ./helloworld/hello.py ./setup.py hello.py #!/usr/bin/env python # -*- coding: utf-8 -*- def greet(): print 'Hello, world!' def main(): greet() if __name__ == '__main__': main() setup.py from setuptools import setup, find_p
NIC についてる IP アドレスとか MAC アドレスを調べるのって、自前でやるとかなり大変そう。 netifaces は、そんな大変そうなことを代わりにやってくれるモジュール。しかもプラットフォーム非依存。 インストールは pip (PyPI) から。 # pip install netifaces 論よりコードということで早速以下サンプル。 #!/usr/bin/env python # -*- coding: utf-8 -*- import netifaces def print_dict(d): for item in d or []: print '\t\t', for key, value in item.items(): print '%s: %s,' % (key, value), print '' def print_ifaces_data(): for iface_
リレーショナル・データベースで、あるテーブルがあるテーブルを参照するような親子関係にあるテーブルを作るとき、親側のレコードが削除されたときは、それを参照している子も一緒に削除してほしい、という場面がある。 今回は、それを Python の O/R マッパの SQLAlchemy で実現する場合の書き方について書く。 まずは何はともあれ SQLAlchemy をインストールする。 $ pip install SQLAlchemy 早速サンプルコードを示す。 前提として、親のテーブルを表すクラス User と、子のテーブルを表すクラス Email がある。 Email は User を参照しているため、User のレコードが削除されたときは、それに従属した Email も一緒に削除されてほしい。 尚、リレーショナル・データベースには Python に組み込みで入っている SQLite3 のオン
プログラムのなかでテーブルを表示したいとき、自分で文字列処理をチマチマやるのはめんどくさい。 Python なら PrettyTable を使うと楽ができる。 インストールは pip から。 # pip install prettytable まず最初に、行単位でデータを入れていくやり方。 #!/usr/bin/env python # -*- coding: utf-8 -*- from prettytable import PrettyTable if __name__ == '__main__': # 項目 'City', 'Area', 'Population' でテーブルを作る table = PrettyTable(['City', 'Population (people)', 'Area (km^2)']) # 'City' 列を左詰めする table.align['City
Python には標準のデバッガとして pdb が付属してるけど CUI ツールなのでゆとりとしてはちょっとつらい。 そんなとき GUI で使えるデバッガの winpdb を使ってみて勝手が良かったのでメモっておく。 動作には wxPython が必要。 wxPython のインストールはプラットフォームによって異なるので省略。 wxPython さえあれば、後は PyPI から winpdb をインストールすることでクロスプラットフォームで使える。 # pip install winpdb あとは pdb と同様に使えば良い。 $ winpdb [pythonfile] Eclipse + PyDev を使っても GUI でデバッグできるけど、それだけのために Eclipse を入れるのはちょっと…っていう状況で便利かも。
PyMongo は Python の MongoDB クライアント。 以前の記事では MongoDB を CLI で操作したけど、今回は Python からやってみる。 とりあえず MongoDB の環境が無ければインストールしておく。 OS X であれば Homebrew でサクサクと入る。 $ brew install mongodb $ mongod --config /usr/local/etc/mongod.conf 次に PyMongo をインストールする。 現在のバージョンは 3.0 で、以前のバージョンとは API が微妙に異なるようだ。 $ pip install pymongo $ pip list | grep pymongo pymongo (3.0) ここからは Python の REPL を使って操作する。 $ python --version && pytho
複数のスレッドから同時に実行されると困るパート (クリティカルセクション) を保護するのに Lock を試してみる。 サンプルは複数のスレッドから共有されるオブジェクトで、ロックあり・なしで挙動の違いを確認する。 #!/usr/bin/env python # -*- coding: utf-8 -*- from threading import Thread, Lock import time # スレッドセーフでないオブジェクト class NoLockedSharedObject(object): # 複数のスレッドから並列に実行されうるメソッド def count(self): # 以下をクリティカルセクションに見立てる for i in range(10): print i, time.sleep(0.1) print # スレッドセーフなオブジェクト class LockedS
セッションの管理は、愚直に書くとコミット漏れとか閉じ忘れがどうしても出る。 だから with 文を使って必ずセッションがコミット・クローズされるようにする。 #!/usr/bin/env python # -*- coding: utf-8 -*- from sqlalchemy.engine import create_engine from sqlalchemy.orm.session import sessionmaker from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.schema import Column from sqlalchemy.types import Integer, String Base = declarative_base() class SessionFactor
Docker ではイメージからコンテナを起動する。 反対に様々な操作を加えたコンテナからイメージを作り直すこともできる。 今回は SSH サーバが動作するイメージを作ってみる。 ただし、作成を自動化するための Dockerfile は使わない。 まずは CentOS のイメージからコンテナを起動する。 $ sudo docker run -i -t centos /bin/bash yum で OpenSSH サーバをインストールする。 bash-4.1# yum -y install openssh-server PAM が有効になっているとログインできないようなので無効にする。 bash-4.1# sed -i -e "s:^UsePAM yes$:#UsePAM yes:" /etc/ssh/sshd_config bash-4.1# sed -i -e "s:^#UsePAM no
今回は Libvirt/KVM のマシンをセットアップしている最中に遭遇したトラブルを紹介してみる。 まず、KVM の動作には CPU が仮想化支援機能 (Intel-VT または AMD-V) をサポートしている必要がある。 なので、それを /proc/cpuinfo から確認した。 Intel CPU の場合は vmx が、AMD CPU の場合は svm が flags の中にあれば良い。 この機能は最近の CPU であれば、よほどの廉価版でない限り付いている。 $ egrep -c '(vmx|svm)' /proc/cpuinfo 8 上記を確認した上で virt-install コマンドでドメインのインストールを試みた所 WARNING が出た。 KVM による高速化が使えないので QEMU を使いますと言っている。 端的に言うと、この状況では壮絶に遅くなる。 $ sudo v
自力で Python2 のコードを Python3 にも対応させようとすると、なかなか泥臭いコードを書くことになる。 例えば、文字列一つとっても Python2 には str, unicode があって、それらは basestring を継承していたのに対し Python3 では unicode, basestring が廃止されて str の実装が unicode になっている。 つまり、対象が文字列か判別するためのクラスを取り出すにしても、両対応するためには以下のようなコードを書く必要に迫られる。 >>> import sys >>> basestring if sys.version_info < (3, 0, 0) else str こんなコードがそこかしこに登場するとしたら辟易するけど Six にはバージョン間の差異を埋めるための変数がある。 まずは Six を PyPI からイ
プログラミング言語でとっつきにくい関数の一つに reduce があると思う。 説明を読んで動作が理解できても、どういう場面に使うのかイマイチよく分からない。そんな感じ。 でも、使い方と有効な場面さえ分かってしまえば、とても強力。 まずは、一番簡単なサンプル。 複数の値が入ったリストの合計値を計算するのに reduce を使ってみる。 #!/usr/bin/env python # -*- coding: utf-8 -*- if __name__ == '__main__': values = [1, 2, 3, 4, 5] result = reduce(lambda total, value: total + value, values) print(result) 実行結果は以下の通り。 15 次に、辞書の内容を URL の QueryString にするのに reduce を使って
仮想マシンの上で更に仮想マシンを動かすことを Nested Virtualization とか Nested VM と呼ぶみたい。ようするに仮想マシンのマトリョーシカ状態。これができるとテストがはかどったりする場面もあったりなかったりするわけです。 今回はホスト OS の Mac 上でゲスト OS として Linux を動かして、更にその Linux 上で KVM を使って Linux を動作させることを目指してみる。つまりこういうこと → Linux / (KVM) / Linux / (Hypervisor) / OSX 前提として OSX が動作している Mac の CPU が Intel-VT/EPT もしくは AMD-V/RVI に対応している必要がある。更に、ゲスト OS 上で KVM が動作するには Intel-VT もしくは AMD-V が有効になっている必要がある。 ゲス
Python にはデコレータという特徴的な構文がある。 この構文を使うと GoF のデザインパターンの一つ、デコレータパターンが作りやすくなる。 デコレータパターンは、ある関数やメソッドの処理内容のラッピングや、関数やメソッドのマーキングを通して様々な用途に使える。 まずは、デコレータの最も基本的な使い方を以下に示す。 デコレータを使って修飾対象の処理をラッピングする。 サンプルコードでは ‘main’ 関数を 'decorator’ デコレータで修飾することで、元の処理内容に 'print’ 関数の実行を挿入している。 #!/usr/bin/env python # -*- coding: utf-8 -*- def decorator(func): def _decorator(*args, **kwargs): print('decorate') return func(*args,
Vagrant の VM は大抵 CUI で操作するけど、たまに GUI のアプリケーションをどーしても使いたくなることってあると思う。 今回は SSH の X11 転送を使って Vagrant の VM 上で動く X を使ったアプリケーションを操作できるようにしてみる。 まず Vagrant を動かすホストには X Server が必要なのでインストールする。 OS X の場合 10.8 (Mountain Lion) 以降 X Server はバンドルされなくなってしまったので、別途 XQuartz を入れる。 http://xquartz.macosforge.org/ さて、以下が肝心の Vagrantfile だけど、ポイントは config.ssh.forward_x11 を true にすることだけ。 $ cat Vagrantfile # -*- mode: ruby -*
同じ入力に対して常に同じ結果を返すような冪等性を持った関数であれば、計算結果をキャッシュすることで高速化を図れる。 そのために、元の関数を変更することなく計算結果をキャッシュできるようにするデコレータを書いてみる。 #!/usr/bin/env python # -*- coding: utf-8 -*- import time # 計算時間を測るストップウォッチ class Stopwatch(object): def __init__(self): self.start_time = None self.end_time = None self.processing_time = None # 計測開始 def start(self): self.start_time = time.time() # 計測終了 def stop(self): self.end_time = time.t
Ansible は Python で実装された IT インフラの自動化ツールだ。 乱暴に言えば Chef や Puppet の親戚みたいなもの。 特筆すべき点としては、対象に SSH さえ届けば使えるという手軽さがある。 上記は同じく Python で実装された自動化ツールの Fabric にも言えることだが、それとの違いは冪等性への考慮が手厚いことが挙げられる。 今回は、その Ansible を Vagrant と上手いこと連携させるまでの軌跡を紹介したい。 動作確認は以下の環境で行った。 Mac OS X Mavericks (10.9.2)Vagrant 1.4.3Ansible 1.4.5 まずは Vagrant を実行するマシンに Ansible をインストールする。 $ pip install ansible 次に Ansible で管理する VM を Vagrant で作る。
これまで公開鍵ってディレクトリを作って scp してパーミッションを変えてーみたいにかなり面倒くさいことをしてたけど ssh-copy-id コマンドを使うと楽できるみたい。 Linux ディストリビューションなら最初から入ってるものも多そうだけど Mac OS X には入ってなかったので Homebrew から入れる。 $ brew install ssh-copy-id 何はともあれ公開鍵ペアを作る。 $ ssh-keygen -t rsa 作った公開鍵を、目的のホストに設置する。 以下のコマンドを叩くとパスワードでログインを促される。 $ ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<host> 上手くいけば公開鍵を使ってログインできるようになっているはず。 $ ssh <username>@<host> めでたしめでたし。
次のページ
このページを最初にブックマークしてみませんか?
『CUBE SUGAR STORAGE』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く