SlideShare a Scribd company logo
1 of 25
Copyright (c) 2014 Ransui Iso, All rights reserved. 
XML-RPC 
Pythonが電池付属と呼ばれる理由 
2014-09-13 
Python Conference JP 2014 
Ransui Iso 
Strategic Technology Group / X-Listing Co, Ltd.
Ransui Iso (磯 蘭水) 
Work at X-Listing Co, Ltd. 
http://www.xlisting.co.jp/ 
Pythonは1998年から使っています。E-Commerceエンジンやサーチエンジンの開 
発、Zopeを用いたWebサイト開発、その他色々を経て、今はネット広告配信シス 
テムについての研究開発をしています。最近はCommon Lispでシステム開発をし 
ていますが、Pythonもヘビーに使っています。 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
おまえ誰よ? 
http://www.facebook.com/ransui 
@ransui
Remote Procedure Call 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
昔からあるんです
Copyright (c) 2014 Ransui Iso, All rights reserved. 
有名どころ 
● Sun RPC 
– NFSの基盤として開発された 
– XDRという形式で情報をシリアライズする 
● なんとPython標準モジュールにでXDRを取り扱える 
– 現役で色々と使われている 
● その他にも 
– DCE/RPC 
– OMG CORBA 
– DCOM
ham 
spam 
egg 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
そも、RPCとは? 
● 言語が提供する「呼び出し規約」を拡張する 
– 利用者はRPCをサポートする言語でプログラミングをす 
るとき、ほとんどRPCの存在を意識する必要がない。 
ham 
spam 
egg 
Remote Local 
この時ローカルから result = spam(args) という感じでリモート 
のメソッドを呼び出せるということ
– インタフェースの定義からStubライブラリを作成しそれ 
を利用することでリモート呼び出しの詳細を隠蔽する 
Server Code Application Code 
Client 
もうすこし細かく見てみる 
● 魔法は存在しないのでタネがある 
RPC Library 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
IDL 
Client Stub 
Server 
Server Stub 
RPC Library 
IDL Compiler
Copyright (c) 2014 Ransui Iso, All rights reserved. 
XML-RPC
メッセージ形式がXMLなRPC 
● 通信そのものはHTTPが使われることが多い 
– HTTPのbody部分に呼び出しや戻り値についての情報を 
XML形式で記述してメッセージとして交換する 
– 当然のことながらXMLの冗長性のおかげでオーバーヘッ 
ドが大きくてパフォーマンス的には不利 
– バイナリプロトコルに対してHuman Readableだという 
部分くらいしか利点が思いつかない…… 
Copyright (c) 2014 Ransui Iso, All rights reserved.
Copyright (c) 2014 Ransui Iso, All rights reserved. 
PythonでのXML-RPC 
● 標準ライブラリにある 
– クライアント・サーバモデル 
– xmlrpc.servsr サーバ側 
– xmlrpc.client クライアント側 
● PurePythonによる実装 
– cPythonが動く環境であればまずどこでも使える 
– 改造も簡単。色々できる。
class HelloServer(xmlrpc.server.SimpleXMLRPCServer): 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
Hello World : Server側 
● まずはサーバを準備 
● SimpleXMLRPCServerを継承したクラスを作る 
● このクラスは通信担当で公開メソッドとかに関与しない 
import xmlrpc.server 
import xmlrpc.server 
class HelloServer(xmlrpc.server.SimpleXMLRPCServer): 
allow_reuse_address = True 
request_queue_size = 1024 
allow_reuse_address = True 
request_queue_size = 1024 
def __init__(self, *args, **kw): 
def __init__(self, *args, **kw): 
super().__init__(*args, **kw) 
super().__init__(*args, **kw)
class HelloRequestHandler(xmlrpc.server.SimpleXMLRPCRequestHandler): 
return getattr(self, method_name)(*args) 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
Hello World : Server側 
● 公開する機能を準備する 
● SimpleXMLRPCRequestHandlerを継承したクラスを作る 
● このクラス内で「メソッド名」と「機能」の対応を作る 
class HelloRequestHandler(xmlrpc.server.SimpleXMLRPCRequestHandler): 
def __init__(self, *args, **kw): 
def __init__(self, *args, **kw): 
super().__init__(*args, **kw) 
super().__init__(*args, **kw) 
def _dispatch(self, method_name, args): 
def _dispatch(self, method_name, args): 
return getattr(self, method_name)(*args) 
def greeting(self, name): 
def greeting(self, name): 
return "Hello, %s" % name 
return "Hello, %s" % name
server = HelloServer(("127.0.0.1", 9999), 
requestHandler=HelloRequestHandler, 
logRequests=None, 
allow_none=True) 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
Hello World : Server側 
● 組み合わせてサーバとして起動する 
● サーバクラスとハンドラクラスのインスタンスを作成して組み 
合わせる。その後、サーバインスタンスのループを開始。 
def main(): 
def main(): 
server = HelloServer(("127.0.0.1", 9999), 
requestHandler=HelloRequestHandler, 
logRequests=None, 
allow_none=True) 
server.serve_forever() 
server.serve_forever()
proxy = xmlrpc.client.ServerProxy("http://127.0.0.1:9999/", 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
Hello World : Client側 
● ServerProxyクラスを使うだけ 
● サーバ側に比べてとっても簡単 
import xmlrpc.client 
import xmlrpc.client 
def main(): 
def main(): 
proxy = xmlrpc.client.ServerProxy("http://127.0.0.1:9999/", 
allow_none=True) 
print(proxy.greeting("spam")) 
allow_none=True) 
print(proxy.greeting("spam"))
もう少し使いやすく 
日々の道具として使うための工夫 
Copyright (c) 2014 Ransui Iso, All rights reserved.
ServerとClient分離問題 
ham 
spam 
egg 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
● 見通しの悪さを改善する 
– サーバもクライアントも1つのモジュールをimportする 
– 下のような状態を維持しやすくする 
ham 
spam 
egg 
RequestHandler ServiceClient
Server Code Application Code 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
もっと結合性を上げる 
● Pythonの動的な性質をもっと使う 
– MetaClassを使うなどして、サービスの定義を行うとと 
自動的にStubが生成されるようにして、コードはそれを 
継承して書くとかする 
Client 
RPC Library 
Service Definition 
Client Stub 
Server 
Server Stub 
RPC Library 
Metaclass
使いこなし 
Copyright (c) 2014 Ransui Iso, All rights reserved.
class HelloServer(Socketserver.ThreadingMixIn, 
xmlrpc.server.SimpleXMLRPCServer): 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
サーバのスレッド化 
● 簡単にスレッド化ができる 
– SimpleXMLRPCServerはSocketServerを利用して構築 
されていることを利用する。 
import xmlrpc.server 
import socketserver 
import xmlrpc.server 
import socketserver 
class HelloServer(Socketserver.ThreadingMixIn, 
xmlrpc.server.SimpleXMLRPCServer): 
allow_reuse_address = True 
allow_reuse_address = True 
request_queue_size = 1024 
request_queue_size = 1024 
def __init__(self, *args, **kw): 
def __init__(self, *args, **kw): 
super().__init__(*args, **kw) 
super().__init__(*args, **kw)
return Binary(pickle.dumps(target_object, protocol=2)) 
return encode_to_binary(blahblah(decode_from_binay(args)) 
self.proxy.server_side_method(encode_to_binary(args)) 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
複雑なデータ 
● インスタンスとかの送受信 
– デコレータ化すればもっとかっこよくできる 
import pickle 
from xmlrpc.client import Binary 
import pickle 
from xmlrpc.client import Binary 
def encode_to_binary(target_object): 
def encode_to_binary(target_object): 
return Binary(pickle.dumps(target_object, protocol=2)) 
def decode_from_binary(binary_image): 
def decode_from_binary(binary_image): 
return pickle.loads(binary_image.data) 
return pickle.loads(binary_image.data) 
def server_side_method(self, args): 
def server_side_method(self, args): 
return encode_to_binary(blahblah(decode_from_binay(args)) 
def client_side_method(self, args): 
def client_side_method(self, args): 
result = decode_from_binary( 
result = decode_from_binary( 
self.proxy.server_side_method(encode_to_binary(args))
Copyright (c) 2014 Ransui Iso, All rights reserved. 
事例 
弊社では使いまくってます
Viewer 
Search 
Application 
MonkeyPod ディレクトリ 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
● データベースと検索に使用 
MonkeypodTreeServer 
Tree maintainer 
Get Node 
Get Review 
etc. 
SiteData 
Data Manage
● 広告配信のターゲティングルールの管理 
Rule Builer 
RuleEngine 
Stats / Report 
Application 
Copyright (c) 2014 Ransui Iso, All rights reserved. 
ターゲティングルール 
Set Rule 
RuleServer 
Object Storage 
Create New Rule 
Get Rule 
Storage File 
Remove Rule
Copyright (c) 2014 Ransui Iso, All rights reserved. 
まとめ
Copyright (c) 2014 Ransui Iso, All rights reserved. 
使い所と注意 
● ちょっとしたサービスが必要なときに 
– とにかくPythonがインストールされていれば使える 
– 変な設定ファイルとかサーバプロセスとかいらない 
– サービス側のコードを書く際に、お作法とか無いので何 
でもやり放題 
● 気をつけたいところ 
– pickleとか無節操に使うとPython縛りに 
– 真の意味でパフォーマンスが必要なときは使っちゃダメ
Thank you for listening. 
Happy Hacking with Python! 
Copyright (c) 2014 Ransui Iso, All rights reserved.

More Related Content

What's hot

Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかShohei Okada
 
Ethernetの受信処理
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理Takuya ASADA
 
TIME_WAITに関する話
TIME_WAITに関する話TIME_WAITに関する話
TIME_WAITに関する話Takanori Sejima
 
並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門Yoshimura Soichiro
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Preferred Networks
 
Building the Game Server both API and Realtime via c#
Building the Game Server both API and Realtime via c#Building the Game Server both API and Realtime via c#
Building the Game Server both API and Realtime via c#Yoshifumi Kawai
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方Shohei Koyama
 
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解都元ダイスケ Miyamoto
 
PHPでマルチスレッド
PHPでマルチスレッドPHPでマルチスレッド
PHPでマルチスレッドkarky7
 
LinuxのFull ticklessを試してみた
LinuxのFull ticklessを試してみたLinuxのFull ticklessを試してみた
LinuxのFull ticklessを試してみたHiraku Toyooka
 
Ansible勉強会資料
Ansible勉強会資料Ansible勉強会資料
Ansible勉強会資料Makoto Oya
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについてkumake
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングRansui Iso
 
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜 リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜 Yugo Shimizu
 
会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったことRecruit Technologies
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Masahito Zembutsu
 

What's hot (20)

Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
 
Ethernetの受信処理
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理
 
TIME_WAITに関する話
TIME_WAITに関する話TIME_WAITに関する話
TIME_WAITに関する話
 
並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
Building the Game Server both API and Realtime via c#
Building the Game Server both API and Realtime via c#Building the Game Server both API and Realtime via c#
Building the Game Server both API and Realtime via c#
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
Spring AMQP × RabbitMQ
Spring AMQP × RabbitMQSpring AMQP × RabbitMQ
Spring AMQP × RabbitMQ
 
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解
 
PHPでマルチスレッド
PHPでマルチスレッドPHPでマルチスレッド
PHPでマルチスレッド
 
LinuxのFull ticklessを試してみた
LinuxのFull ticklessを試してみたLinuxのFull ticklessを試してみた
LinuxのFull ticklessを試してみた
 
Ansible勉強会資料
Ansible勉強会資料Ansible勉強会資料
Ansible勉強会資料
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
入門 シェル実装
入門 シェル実装入門 シェル実装
入門 シェル実装
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
 
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜 リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
 
会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~
 

Viewers also liked

Micro Python で組み込み Python
Micro Python で組み込み PythonMicro Python で組み込み Python
Micro Python で組み込み PythonHirotaka Kawata
 
小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話Ransui Iso
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
Playing with curses
Playing with cursesPlaying with curses
Playing with cursesRansui Iso
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Ransui Iso
 
PyPro2の読みどころ紹介:Python開発の過去と現在
PyPro2の読みどころ紹介:Python開発の過去と現在PyPro2の読みどころ紹介:Python開発の過去と現在
PyPro2の読みどころ紹介:Python開発の過去と現在Takayuki Shimizukawa
 
Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Yoshiki Shibukawa
 
PyConJP Keynote Speech (Japanese version)
PyConJP Keynote Speech (Japanese version)PyConJP Keynote Speech (Japanese version)
PyConJP Keynote Speech (Japanese version)nishio
 
PyCon JP 2014 plone terada
PyCon JP 2014 plone teradaPyCon JP 2014 plone terada
PyCon JP 2014 plone teradaManabu Terada
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementationsmasahitojp
 
Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築Atsuo Ishimoto
 
"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another ApproachDaisuke Miyakawa
 
Effective Numerical Computation in NumPy and SciPy
Effective Numerical Computation in NumPy and SciPyEffective Numerical Computation in NumPy and SciPy
Effective Numerical Computation in NumPy and SciPyKimikazu Kato
 
Pycon2014 django performance
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performancehirokiky
 
Deep Learning for Image Recognition in Python
Deep Learning for Image Recognition in PythonDeep Learning for Image Recognition in Python
Deep Learning for Image Recognition in PythonHideki
 
Pythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクターPythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクターRansui Iso
 
Pythonによる非同期プログラミング入門
Pythonによる非同期プログラミング入門Pythonによる非同期プログラミング入門
Pythonによる非同期プログラミング入門Hironori Sekine
 
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk SessionPythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk SessionShinichi Nakagawa
 
ソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミングソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミングRansui Iso
 

Viewers also liked (20)

Micro Python で組み込み Python
Micro Python で組み込み PythonMicro Python で組み込み Python
Micro Python で組み込み Python
 
小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
Playing with curses
Playing with cursesPlaying with curses
Playing with curses
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
PyPro2の読みどころ紹介:Python開発の過去と現在
PyPro2の読みどころ紹介:Python開発の過去と現在PyPro2の読みどころ紹介:Python開発の過去と現在
PyPro2の読みどころ紹介:Python開発の過去と現在
 
Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014
 
PyConJP Keynote Speech (Japanese version)
PyConJP Keynote Speech (Japanese version)PyConJP Keynote Speech (Japanese version)
PyConJP Keynote Speech (Japanese version)
 
PyCon JP 2014 plone terada
PyCon JP 2014 plone teradaPyCon JP 2014 plone terada
PyCon JP 2014 plone terada
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築
 
"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach
 
Pyramid入門
Pyramid入門Pyramid入門
Pyramid入門
 
Effective Numerical Computation in NumPy and SciPy
Effective Numerical Computation in NumPy and SciPyEffective Numerical Computation in NumPy and SciPy
Effective Numerical Computation in NumPy and SciPy
 
Pycon2014 django performance
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performance
 
Deep Learning for Image Recognition in Python
Deep Learning for Image Recognition in PythonDeep Learning for Image Recognition in Python
Deep Learning for Image Recognition in Python
 
Pythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクターPythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクター
 
Pythonによる非同期プログラミング入門
Pythonによる非同期プログラミング入門Pythonによる非同期プログラミング入門
Pythonによる非同期プログラミング入門
 
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk SessionPythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
 
ソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミングソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミング
 

Similar to XML-RPC : Pythonが「電池付属」と呼ばれる理由

React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
Openstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verificationOpenstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verificationyukihiro kawada
 
serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例Koichi Shimozono
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますinfinite_loop
 
XPagesDay 2015 RESTの総復習
XPagesDay 2015 RESTの総復習XPagesDay 2015 RESTの総復習
XPagesDay 2015 RESTの総復習Masahiko Miyo
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1Etsuji Nakai
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) Akihiro Kuwano
 
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-靖 小田島
 
JavaScript.Next
JavaScript.NextJavaScript.Next
JavaScript.Nextdynamis
 
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードIbm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードK Kimura
 
20121217 jawsug-yokohama
20121217 jawsug-yokohama20121217 jawsug-yokohama
20121217 jawsug-yokohamaTetsuya Chiba
 
JavaScript.Next Returns
JavaScript.Next ReturnsJavaScript.Next Returns
JavaScript.Next Returnsdynamis
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)Toru Furukawa
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter IntegrationKazuki Nakajima
 

Similar to XML-RPC : Pythonが「電池付属」と呼ばれる理由 (20)

Tottoruby 20110903
Tottoruby 20110903Tottoruby 20110903
Tottoruby 20110903
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
Openstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verificationOpenstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verification
 
serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
Lithium Labo #1
Lithium Labo #1Lithium Labo #1
Lithium Labo #1
 
Aerospike deep dive LDTs
Aerospike deep dive LDTsAerospike deep dive LDTs
Aerospike deep dive LDTs
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
XPagesDay 2015 RESTの総復習
XPagesDay 2015 RESTの総復習XPagesDay 2015 RESTの総復習
XPagesDay 2015 RESTの総復習
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo1
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
 
JavaScript.Next
JavaScript.NextJavaScript.Next
JavaScript.Next
 
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードIbm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコード
 
20121217 jawsug-yokohama
20121217 jawsug-yokohama20121217 jawsug-yokohama
20121217 jawsug-yokohama
 
JavaScript.Next Returns
JavaScript.Next ReturnsJavaScript.Next Returns
JavaScript.Next Returns
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
 
WebRTC on Native App
WebRTC on Native AppWebRTC on Native App
WebRTC on Native App
 

More from Ransui Iso

「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~Ransui Iso
 
アドテクを支える人と技術
アドテクを支える人と技術アドテクを支える人と技術
アドテクを支える人と技術Ransui Iso
 
Introduction of ToySynth
Introduction of ToySynthIntroduction of ToySynth
Introduction of ToySynthRansui Iso
 
PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.Ransui Iso
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5Ransui Iso
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Ransui Iso
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 

More from Ransui Iso (8)

「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~
 
アドテクを支える人と技術
アドテクを支える人と技術アドテクを支える人と技術
アドテクを支える人と技術
 
Introduction of ToySynth
Introduction of ToySynthIntroduction of ToySynth
Introduction of ToySynth
 
PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 

Recently uploaded

自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 

Recently uploaded (9)

自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 

XML-RPC : Pythonが「電池付属」と呼ばれる理由

  • 1. Copyright (c) 2014 Ransui Iso, All rights reserved. XML-RPC Pythonが電池付属と呼ばれる理由 2014-09-13 Python Conference JP 2014 Ransui Iso Strategic Technology Group / X-Listing Co, Ltd.
  • 2. Ransui Iso (磯 蘭水) Work at X-Listing Co, Ltd. http://www.xlisting.co.jp/ Pythonは1998年から使っています。E-Commerceエンジンやサーチエンジンの開 発、Zopeを用いたWebサイト開発、その他色々を経て、今はネット広告配信シス テムについての研究開発をしています。最近はCommon Lispでシステム開発をし ていますが、Pythonもヘビーに使っています。 Copyright (c) 2014 Ransui Iso, All rights reserved. おまえ誰よ? http://www.facebook.com/ransui @ransui
  • 3. Remote Procedure Call Copyright (c) 2014 Ransui Iso, All rights reserved. 昔からあるんです
  • 4. Copyright (c) 2014 Ransui Iso, All rights reserved. 有名どころ ● Sun RPC – NFSの基盤として開発された – XDRという形式で情報をシリアライズする ● なんとPython標準モジュールにでXDRを取り扱える – 現役で色々と使われている ● その他にも – DCE/RPC – OMG CORBA – DCOM
  • 5. ham spam egg Copyright (c) 2014 Ransui Iso, All rights reserved. そも、RPCとは? ● 言語が提供する「呼び出し規約」を拡張する – 利用者はRPCをサポートする言語でプログラミングをす るとき、ほとんどRPCの存在を意識する必要がない。 ham spam egg Remote Local この時ローカルから result = spam(args) という感じでリモート のメソッドを呼び出せるということ
  • 6. – インタフェースの定義からStubライブラリを作成しそれ を利用することでリモート呼び出しの詳細を隠蔽する Server Code Application Code Client もうすこし細かく見てみる ● 魔法は存在しないのでタネがある RPC Library Copyright (c) 2014 Ransui Iso, All rights reserved. IDL Client Stub Server Server Stub RPC Library IDL Compiler
  • 7. Copyright (c) 2014 Ransui Iso, All rights reserved. XML-RPC
  • 8. メッセージ形式がXMLなRPC ● 通信そのものはHTTPが使われることが多い – HTTPのbody部分に呼び出しや戻り値についての情報を XML形式で記述してメッセージとして交換する – 当然のことながらXMLの冗長性のおかげでオーバーヘッ ドが大きくてパフォーマンス的には不利 – バイナリプロトコルに対してHuman Readableだという 部分くらいしか利点が思いつかない…… Copyright (c) 2014 Ransui Iso, All rights reserved.
  • 9. Copyright (c) 2014 Ransui Iso, All rights reserved. PythonでのXML-RPC ● 標準ライブラリにある – クライアント・サーバモデル – xmlrpc.servsr サーバ側 – xmlrpc.client クライアント側 ● PurePythonによる実装 – cPythonが動く環境であればまずどこでも使える – 改造も簡単。色々できる。
  • 10. class HelloServer(xmlrpc.server.SimpleXMLRPCServer): Copyright (c) 2014 Ransui Iso, All rights reserved. Hello World : Server側 ● まずはサーバを準備 ● SimpleXMLRPCServerを継承したクラスを作る ● このクラスは通信担当で公開メソッドとかに関与しない import xmlrpc.server import xmlrpc.server class HelloServer(xmlrpc.server.SimpleXMLRPCServer): allow_reuse_address = True request_queue_size = 1024 allow_reuse_address = True request_queue_size = 1024 def __init__(self, *args, **kw): def __init__(self, *args, **kw): super().__init__(*args, **kw) super().__init__(*args, **kw)
  • 11. class HelloRequestHandler(xmlrpc.server.SimpleXMLRPCRequestHandler): return getattr(self, method_name)(*args) Copyright (c) 2014 Ransui Iso, All rights reserved. Hello World : Server側 ● 公開する機能を準備する ● SimpleXMLRPCRequestHandlerを継承したクラスを作る ● このクラス内で「メソッド名」と「機能」の対応を作る class HelloRequestHandler(xmlrpc.server.SimpleXMLRPCRequestHandler): def __init__(self, *args, **kw): def __init__(self, *args, **kw): super().__init__(*args, **kw) super().__init__(*args, **kw) def _dispatch(self, method_name, args): def _dispatch(self, method_name, args): return getattr(self, method_name)(*args) def greeting(self, name): def greeting(self, name): return "Hello, %s" % name return "Hello, %s" % name
  • 12. server = HelloServer(("127.0.0.1", 9999), requestHandler=HelloRequestHandler, logRequests=None, allow_none=True) Copyright (c) 2014 Ransui Iso, All rights reserved. Hello World : Server側 ● 組み合わせてサーバとして起動する ● サーバクラスとハンドラクラスのインスタンスを作成して組み 合わせる。その後、サーバインスタンスのループを開始。 def main(): def main(): server = HelloServer(("127.0.0.1", 9999), requestHandler=HelloRequestHandler, logRequests=None, allow_none=True) server.serve_forever() server.serve_forever()
  • 13. proxy = xmlrpc.client.ServerProxy("http://127.0.0.1:9999/", Copyright (c) 2014 Ransui Iso, All rights reserved. Hello World : Client側 ● ServerProxyクラスを使うだけ ● サーバ側に比べてとっても簡単 import xmlrpc.client import xmlrpc.client def main(): def main(): proxy = xmlrpc.client.ServerProxy("http://127.0.0.1:9999/", allow_none=True) print(proxy.greeting("spam")) allow_none=True) print(proxy.greeting("spam"))
  • 15. ServerとClient分離問題 ham spam egg Copyright (c) 2014 Ransui Iso, All rights reserved. ● 見通しの悪さを改善する – サーバもクライアントも1つのモジュールをimportする – 下のような状態を維持しやすくする ham spam egg RequestHandler ServiceClient
  • 16. Server Code Application Code Copyright (c) 2014 Ransui Iso, All rights reserved. もっと結合性を上げる ● Pythonの動的な性質をもっと使う – MetaClassを使うなどして、サービスの定義を行うとと 自動的にStubが生成されるようにして、コードはそれを 継承して書くとかする Client RPC Library Service Definition Client Stub Server Server Stub RPC Library Metaclass
  • 17. 使いこなし Copyright (c) 2014 Ransui Iso, All rights reserved.
  • 18. class HelloServer(Socketserver.ThreadingMixIn, xmlrpc.server.SimpleXMLRPCServer): Copyright (c) 2014 Ransui Iso, All rights reserved. サーバのスレッド化 ● 簡単にスレッド化ができる – SimpleXMLRPCServerはSocketServerを利用して構築 されていることを利用する。 import xmlrpc.server import socketserver import xmlrpc.server import socketserver class HelloServer(Socketserver.ThreadingMixIn, xmlrpc.server.SimpleXMLRPCServer): allow_reuse_address = True allow_reuse_address = True request_queue_size = 1024 request_queue_size = 1024 def __init__(self, *args, **kw): def __init__(self, *args, **kw): super().__init__(*args, **kw) super().__init__(*args, **kw)
  • 19. return Binary(pickle.dumps(target_object, protocol=2)) return encode_to_binary(blahblah(decode_from_binay(args)) self.proxy.server_side_method(encode_to_binary(args)) Copyright (c) 2014 Ransui Iso, All rights reserved. 複雑なデータ ● インスタンスとかの送受信 – デコレータ化すればもっとかっこよくできる import pickle from xmlrpc.client import Binary import pickle from xmlrpc.client import Binary def encode_to_binary(target_object): def encode_to_binary(target_object): return Binary(pickle.dumps(target_object, protocol=2)) def decode_from_binary(binary_image): def decode_from_binary(binary_image): return pickle.loads(binary_image.data) return pickle.loads(binary_image.data) def server_side_method(self, args): def server_side_method(self, args): return encode_to_binary(blahblah(decode_from_binay(args)) def client_side_method(self, args): def client_side_method(self, args): result = decode_from_binary( result = decode_from_binary( self.proxy.server_side_method(encode_to_binary(args))
  • 20. Copyright (c) 2014 Ransui Iso, All rights reserved. 事例 弊社では使いまくってます
  • 21. Viewer Search Application MonkeyPod ディレクトリ Copyright (c) 2014 Ransui Iso, All rights reserved. ● データベースと検索に使用 MonkeypodTreeServer Tree maintainer Get Node Get Review etc. SiteData Data Manage
  • 22. ● 広告配信のターゲティングルールの管理 Rule Builer RuleEngine Stats / Report Application Copyright (c) 2014 Ransui Iso, All rights reserved. ターゲティングルール Set Rule RuleServer Object Storage Create New Rule Get Rule Storage File Remove Rule
  • 23. Copyright (c) 2014 Ransui Iso, All rights reserved. まとめ
  • 24. Copyright (c) 2014 Ransui Iso, All rights reserved. 使い所と注意 ● ちょっとしたサービスが必要なときに – とにかくPythonがインストールされていれば使える – 変な設定ファイルとかサーバプロセスとかいらない – サービス側のコードを書く際に、お作法とか無いので何 でもやり放題 ● 気をつけたいところ – pickleとか無節操に使うとPython縛りに – 真の意味でパフォーマンスが必要なときは使っちゃダメ
  • 25. Thank you for listening. Happy Hacking with Python! Copyright (c) 2014 Ransui Iso, All rights reserved.