2014年12月15日月曜日

Pythonのメタプログラミング (メタクラス)

メタクラスを簡単に説明すると,「本来コードを書かなければ実現できないような処理を黒魔術的な処理でなんとかしちゃう」ためのテクニックです。コード量を(時には劇的に)減らすことができたり,すっきりした見通しの良いクラス設計を実現できます。

JavaScriptのPrototypeのような継承が可能なPythonのクラスを作ることにしましょう。Pythonのクラス設計とJavaScriptのそれの間には異なる部分があるので,魔法を使ってこの差を埋める必要があります。

まずはコードを見てみましょう。これがPythonでJSのPrototypeを実現するメタクラスです。コードをproto.pyというファイル名で保存しておきましょう。

#!/usr/bin/env python
## -*- coding: utf-8 -*-

class PrototypeStore(dict):
""" x.prototype.XXXの値を保存するためのクラス """
def __setattr__(self, name, value):
self[name] = value

def __getattr__(self, name):
return self[name]

class PrototypeMeta(type):
""" Prototypeメタクラス(クラス生成時に呼ばれる) """
def __new__(metacls, cls_name, bases, attrs):
cls = type.__new__(metacls, cls_name, bases, attrs)
cls.prototype = PrototypeStore()
return cls

class Prototype(object):
__metaclass__ = PrototypeMeta

def __getattr__(self, name):
if name == 'prototype':
getattr(self.__class__, name)
else:
try:
getattr(object, name)
except AttributeError:
return self.__class__.prototype[name]

class TestClass(Prototype):
def __init__(self):
pass

ProtoMetaの__new__()メソッドとPrototypeの__metaclass__アトリビュートがキモ。
objectを継承した新スタイルクラスに__metaclass__というアトリビュートが設定されていると,クラスは特別な動きをします。クラス生成時に,__metaclass__のアトリビュートに設定されたクラスを起動し,__new__()メソッドを呼び出すのです。

__new__()メソッド内部を見ると,type.__new__()メソッドを呼び出してクラスを生成したあと,クラスのプロパティにprotopypeというアトリビュートを代入していることが分かります。代入されているのはProtoStoreクラスのインスタンス。ProtoStoreクラスは辞書型を継承したクラス。__setattr__()と__getattr__()を継承していて,アトリビュートの読み書きを辞書のキー操作に置き換え,任意の名前を持つアトリビュートを定義,値を保存して読み出せるオブジェクトが作れるようになっています。

type.__new__()で作ってクラスアトリビュートを割り当てられたクラスは,Prototypeクラス,およびそのサブクラスの実体として機能します。

インタラクティブシェルで「from proto import *」して,次のコードを実行してみましょう。JSのPrototypeの挙動をエミュレートした,期待通りの動きになっていることを確認します。

first = TestClass() # オブジェクトを作る
first.prototype.x = 7 # 'x'をprototypeに割り当てる
second = TestClass() # firstと同じTextClassからインスタンスを作る
print second.x # first.xと同じオブジェクトを指しているので7になる
first.x = 9 # first(インスタンス)の'x'アトリビュートに代入
print first.x # これは7でなく9を返す
del first.x # インスタンスのアトリビュートを消去
print first.x # prototype.xの返す7になるはず

禅問答

Q:Protytyoeクラスの__init__()で「self.prototype=PrototypeStore()」ってやればいいんじゃないの?
A:インスタンスごとにprototypeが定義されてしまって期待通りの動きにならない。

Q:クラスアトリビュートとして「prototype=PrototypeStore()」を定義すれば?
A:Prototypeクラス,および全てのPrototype由来のクラスで同じprototypeを共有することになり,同じく期待通りに動かない。すべてのサブクラスで「prototype=PrototypeStore()」ってやらないとならない。

Q:じゃあ__init__()で「self.__class__.prototype=PrototypeStore()」では?
A:それでもできるけど,Pythonではクラスを継承したときに__init__()が上書きされてしまうので,__init__()を定義したすべてのサブクラスで「super(XXX, self).__init__(...)」ってやらないといけない。面倒だしはまる原因になる。

2014年12月10日水曜日

仕事で使えるオープンソース・プロダクト10選

かつて有償パッケージが主流だったジャンルのソフトウェアでもオープンソースのプロダクトが増えてきています。最近では業務向けのもので、動きが顕著です。オープンソースだからといって、必ずしも機能的に劣るということはなく、むしろソースコードが未公開のパッケージ製品と比べて公開されていることから、機能追加やエラーの原因を追いやすいというメリットもあります。プロダクトによってはサポートだけ有償で提供するというライセンスモデルもあり、導入時はオープンソースライセンスを選択し、本格的に使う場合に商用ライセンスに切り替えるといった使い方ができるプロダクトもあります。ソースコードが公開されていることから、柔軟なカスタマイズが可能な上、エンジニアとして開発プロセスに貢献することができれば、スキル向上や実績にもなるという側面もあり、今やエンジニアにとってオープンソースのプロダクトとの付き合いは欠かせないものといっていいでしょう。

今回は、そんなオープンソースのプロダクトで、他のアプリケーションとの組み合わせも考慮して、比較的導入しやすい定番のものをカテゴリーごとに紹介します。

・CMS

WordPress

世界トップ1000万Webサイトの内、20%以上で採用され、全てのCMS中で60%を超えるシェアを有します。開発者が多いので進化、つまりバージョンアップされていくスピードが速く、欲しい機能がどんどん増えていきます。また、プラグインも豊富なので、自分で開発しながら新しい機能を取り込むことも容易と言えそう。そのためか、日本でも多くの企業が導入しています。

シェアが高いことにも関係しますが、デザインテンプレートが多数提供されており、開発者のイメージ通りにデザインできることも強みのひとつ。なお、テンプレートはPHPで記述されているので、カスタマイズにより機能追加も可能です。

■活用シーン……WordPressと言えば、"ブログ作成"のイメージが強いですが、本格的なECサイトとして活用することももちろん可能です。よく利用される買い物カゴ、予約管理、会員管理、カスタマイズ可能なフォーム機能などもプラグインで実現できるのはエンジニアにとって大変有益なことと言えるのではないでしょうか。

・販売管理

SalesCube

基本機能が充実しており、かつソース提供型なので、自在にカスタマイズできる販売管理システムとして、評価の高いオープンソースです。しかも、販売管理に関するアプリケーションの数は比較的少ないため、ある種、貴重とも言えます。

販売管理に必要とされる機能は、在庫管理・入出金・仕入れの管理など、ほぼ網羅されているのではないでしょうか。さらに発注面では海外仕入先も想定し、外貨にも対応。そうした機能面での充実が、今回のセレクトの理由になりました。

■活用シーン……エンジニアが悩むポイントですが、クライアントの業態や業務は企業により変わったり、同じ社内でも媒体や扱う商品によって違うこともあります。そのため、市販の販売管理パッケージとの業務マッチングが難しいケースも多く、一般的には「パッケージに業務を合わせる」ことになってしまいます。その点、「SalesCube」ならオープンソースなので、実務に合わせてカスタマイズしたシステムを構築することができます。

・CRM/顧客管理

SugarCRM

顧客の状態管理をするとき(データべースマーケティング:見込み客から始まって得意客に成長するまでのプロセス)にその真価を発揮するオープンソース。オープンソース版と有償版があり、有償版は確かに優秀ですが、少々高額です。オープンソース(Sugar Community Edition)版でも、取引先/取引先担当者管理・商談管理・メールマーケティング・会議管理・プロジェクト管理・従業員管理などの機能を持つので、スキルさえあるのであれば、わざわざ有償版を選ぶ必要はなさそう。

ほかにもいくつか顧客管理をするオープンソースは存在しますが、メルマガ配信サービスに機能を補足した程度のものが多く、日本では一部でしか活用例を見ない貴重なオープンソースでしょう。

■活用シーン……潜在顧客との関係性を深めていくために必要な情報を収集する機能があり(Web to Lead機能など)、それを活用することでメールサーバと連携し、メールマーケティングを実現することも可能。また、会議システムとの連携や販売代理店管理機能もあり、高度な営業支援を実現できます。

・プロジェクト管理

Redmine

中小企業がプロジェクト管理をする際に、もっとも適しているアプリケーションのひとつがこれ。複数のプロジェクト、あるいは多人数がかかわっているプロジェクトにおいて、細部まで管理できるようにしたい、といった要望には見事にマッチします。

中でも、ワークフローを見るだけで業務の進捗がわかる点は、管理者には大変好評な機能のひとつ。これに似たものの有償版も存在しますが、大企業向けに開発されているため、中小企業には使いづらい面も。中小企業には不要な機能と思われるものは排除されているため、エンジニアとしても使い勝手が非常にいいと言えます。

■活用シーン……社内の制作プロジェクトはもちろんのこと、業務をアウトソースした場合でも、作業の進捗や情報共有が容易。「プロジェクト管理ツールは使いたいが、機能が多すぎて煩雑」という事業者にRedmineを導入するケースも。

・グループウェア

Aipo

社内の情報共有管理に適したカスタマイズ可能なオープンソースグループウェア。製品版として、有償なものも数多くあるのですが、無償版のオープンソースのものでも手頃な機能が網羅されているためオススメです。TODO・掲示板・スケジュール・ニュース・ブログ・Webメール・ファイル共有機能など、グループウェアとしての十分な機能があり、それらをタイムライン形式で表示することもできます。

特徴的なのは、Aipoの機能を拡張できるソーシャルアプリが、専用ストアで公開されていること。数は少ないものの、外部デベロッパーが独自に開発したソーシャルアプリを組み込むことで、機能を追加することが可能です。

■活用シーン……既に公開されているソーシャルアプリには、女性の画像と時計を組み合わせた「美人時計」や、"飲み"へのお誘い機能「飲みイコ」なども。
ソーシャルアプリの開発手順も公開されているので、独自視点でのグループウェアの提案にも活用できます。

・Eコマース

EC-CUBE

EC構築オープンソースとして国内No.1(2010年調べ)の、ECサイト構築パッケージ。推定10,000 店舗以上で利用されている。Wordpress同様、シェアが高く、開発者が多いので進化、バージョンアップされていくスピードが速いです。つまり、欲しい機能がどんどん増えていくと言えます。また、プラグインも豊富なので、自分で開発しながら新しい機能を取り込むことも容易と言えそう。社内システムとの連携もしやすく、取り扱いやすいとも言えるでしょう。機能は、ECサイトの基本機能に加え、マイページ機能・決済機能・モバイル対応・商品管理・受注管理・顧客管理・メルマガの配信などの機能を網羅。

Eコマースは規模が拡大すると、ECサイト単体だけではなく、社内外のさまざまなサービスとの連携が必要になるため、高い拡張性が求められます。EC-CUBEは、連携に必要なプラグインを多数用意することにより、それを実現しています。

■活用シーン……ショッピングモールや、ASP型サービスから移行する際に、コストや機能面から候補として検討する事業者が多いようです。

・SNS

OpenPNE

Webコミュニティをオープンソースで立ち上げることができます。数多くあるCMSに比べてSNSは割と数が少ないので貴重なオープンソースとも言えます。

PC・スマートフォン・フィーチャーフォンのマルチデバイス対応した、オープン・クローズドで利用できるSNS。現在30,000以上のコミュニティに活用されています。コミュニティの新規作成・日記・メッセージ・あしあと・フレンドリンクなどの機能があります。

■活用シーン……Facebookなどのマス型SNSに対し、OpenPNEは地域・教育機関・企業・趣味のファンクラブなど、さまざまな組織に合ったSNSを始めることができます。

・Web会議システム

BigBlueButton

遠隔教育、講義を前提としたオープンソースのWeb会議システム。機能は、講義の配信・リアルタイムのデスクトップの共有・プレゼンテーション・チャット機能など。他のe-ラーニングシステムと組み合わせると有用性は高まります。

一般のWeb会議システムとは異なり、1対多の講義形式に適しており、他のオープンソース会議システムのベース機能としても採用されています。

■活用シーン……少人数であればSkypeやGoogle+ハングアウトも使えますが、参加者がIDやアカウントを持っていなければなりません。BigBlueButtonは接続先アドレスがわかればブラウザで会議が可能なので、使い勝手が良いでしょう。

・ファイル共有

ownCloud

簡単に言えば、Dropboxのようなツール。フォルダイメージでファイルをドラッグ&ドロップすることで、複数PC間でのファイルの移動、同期ができます。
自分のローカルPC内のフォルダをownCloud用フォルダに指定し、そのフォルダ内のファイルを更新すれば、ownCloudサーバ内のファイルが自動更新されます。また、Dropbox同様、違うPCにあるownCloud用フォルダも自動で同期可能。さらに複数ユーザ用の共有フォルダも作成できます。

■活用シーン……オンラインストレージツールは、容量やファイルサイズ制限、保持期間など、制約があることが多いですが、ownCloudを自前のサーバにインストールすれ無く活用することができます。

・動画配信プラットフォーム

Kaltura

マルチデバイスに対応した、動画配信専用のプラットフォーム。既に多数のメディア・広告・教育・エンタメ分野の150,000を超える企業サイトで、Kalturaの動画ソリューションが活用されています。
動画のアップロード・マルチプラットフォーム用の動画変換機能・暗号化・独自プレーヤーの作成・動画編集まで、動画配信に特化した一連の機能と、カスタマイズ用のAPIが用意されているため、柔軟な展開が可能。

■活用シーン……動画配信のプラットフォームとして、多くの場合「YouTube」が利用されていますが、CMなど、不必要な動画が入る場合があります。Kalturaを活用すれば、そういった制約なしに、課金型の動画配信や、会員制の教育などの、動画ビジネスを展開することができでしょう。

コストメリットや拡張性など、さまざまなメリットのあるオープンソース。初期導入は簡単でもカスタマイズに手間がかかるケースもああります。事業者の業態に向いているアプリケーションを選択することが必要です。オープンソースを使用した比較的安価なインテグレーションを提供している企業もあるので、それらを利用するのも手段のひとつかもしれませんね。