SlideShare a Scribd company logo
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.
Ad

Recommended

iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine
iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine
GMO GlobalSign Holdings K.K.
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
 
UE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろう
エピック・ゲームズ・ジャパン Epic Games Japan
 
200人での対戦も可能!?Photon 新SDKについて
200人での対戦も可能!?Photon 新SDKについて
Photon運営事務局
 
Software design as a cooperative game with EventStorming
Software design as a cooperative game with EventStorming
Alberto Brandolini
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
UnityTechnologiesJapan002
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Yuichi Ito
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
Kohei Tokunaga
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Yoshifumi Kawai
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
ota42y
 
C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話
信之 岩永
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
 
Unityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
torisoup
 
UE4のためのより良いゲーム設計を理解しよう!
UE4のためのより良いゲーム設計を理解しよう!
Masahiko Nakamura
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Shin Ohno
 
Cocos2d-xを用いた "LINE タワーライジング" の開発事例
Cocos2d-xを用いた "LINE タワーライジング" の開発事例
gree_tech
 
Spark MLlibではじめるスケーラブルな機械学習
Spark MLlibではじめるスケーラブルな機械学習
NTT DATA OSS Professional Services
 
ZOZOTOWNのCloud Native Journey
ZOZOTOWNのCloud Native Journey
Toru Makabe
 
GPU Container as a Serviceを実現するための最新OSS徹底比較 - OpenStack最新情報セミナー 2017年7月
GPU Container as a Serviceを実現するための最新OSS徹底比較 - OpenStack最新情報セミナー 2017年7月
VirtualTech Japan Inc.
 
UniRx完全に理解した
UniRx完全に理解した
torisoup
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Masahito Zembutsu
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 
Unityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechcon
DeNA
 
メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例
メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例
エピック・ゲームズ・ジャパン Epic Games Japan
 
Parser combinatorってなんなのさ
Parser combinatorってなんなのさ
cct-inc
 
WCCF最新作、アーケードゲームWCCF FOOTISTA 2019はこうやって進化した
WCCF最新作、アーケードゲームWCCF FOOTISTA 2019はこうやって進化した
エピック・ゲームズ・ジャパン Epic Games Japan
 
Micro Python で組み込み Python
Micro Python で組み込み Python
Hirotaka Kawata
 
小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話
Ransui Iso
 

More Related Content

What's hot (20)

BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
Kohei Tokunaga
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Yoshifumi Kawai
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
ota42y
 
C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話
信之 岩永
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
 
Unityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
torisoup
 
UE4のためのより良いゲーム設計を理解しよう!
UE4のためのより良いゲーム設計を理解しよう!
Masahiko Nakamura
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Shin Ohno
 
Cocos2d-xを用いた "LINE タワーライジング" の開発事例
Cocos2d-xを用いた "LINE タワーライジング" の開発事例
gree_tech
 
Spark MLlibではじめるスケーラブルな機械学習
Spark MLlibではじめるスケーラブルな機械学習
NTT DATA OSS Professional Services
 
ZOZOTOWNのCloud Native Journey
ZOZOTOWNのCloud Native Journey
Toru Makabe
 
GPU Container as a Serviceを実現するための最新OSS徹底比較 - OpenStack最新情報セミナー 2017年7月
GPU Container as a Serviceを実現するための最新OSS徹底比較 - OpenStack最新情報セミナー 2017年7月
VirtualTech Japan Inc.
 
UniRx完全に理解した
UniRx完全に理解した
torisoup
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Masahito Zembutsu
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 
Unityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechcon
DeNA
 
メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例
メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例
エピック・ゲームズ・ジャパン Epic Games Japan
 
Parser combinatorってなんなのさ
Parser combinatorってなんなのさ
cct-inc
 
WCCF最新作、アーケードゲームWCCF FOOTISTA 2019はこうやって進化した
WCCF最新作、アーケードゲームWCCF FOOTISTA 2019はこうやって進化した
エピック・ゲームズ・ジャパン Epic Games Japan
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
Kohei Tokunaga
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Yoshifumi Kawai
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
ota42y
 
C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話
信之 岩永
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
 
Unityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
torisoup
 
UE4のためのより良いゲーム設計を理解しよう!
UE4のためのより良いゲーム設計を理解しよう!
Masahiko Nakamura
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Shin Ohno
 
Cocos2d-xを用いた "LINE タワーライジング" の開発事例
Cocos2d-xを用いた "LINE タワーライジング" の開発事例
gree_tech
 
ZOZOTOWNのCloud Native Journey
ZOZOTOWNのCloud Native Journey
Toru Makabe
 
GPU Container as a Serviceを実現するための最新OSS徹底比較 - OpenStack最新情報セミナー 2017年7月
GPU Container as a Serviceを実現するための最新OSS徹底比較 - OpenStack最新情報セミナー 2017年7月
VirtualTech Japan Inc.
 
UniRx完全に理解した
UniRx完全に理解した
torisoup
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Masahito Zembutsu
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 
Unityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechcon
DeNA
 
Parser combinatorってなんなのさ
Parser combinatorってなんなのさ
cct-inc
 

Viewers also liked (20)

Micro Python で組み込み Python
Micro Python で組み込み Python
Hirotaka Kawata
 
小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話
Ransui Iso
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
 
Playing with curses
Playing with curses
Ransui Iso
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
Ransui Iso
 
PyPro2の読みどころ紹介:Python開発の過去と現在
PyPro2の読みどころ紹介:Python開発の過去と現在
Takayuki Shimizukawa
 
Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014
Yoshiki Shibukawa
 
PyConJP Keynote Speech (Japanese version)
PyConJP Keynote Speech (Japanese version)
nishio
 
PyCon JP 2014 plone terada
PyCon JP 2014 plone terada
Manabu Terada
 
Pyconjp2014_implementations
Pyconjp2014_implementations
masahitojp
 
"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach
Daisuke Miyakawa
 
Effective Numerical Computation in NumPy and SciPy
Effective Numerical Computation in NumPy and SciPy
Kimikazu Kato
 
Pycon2014 django performance
Pycon2014 django performance
hirokiky
 
Deep Learning for Image Recognition in Python
Deep Learning for Image Recognition in Python
Hideki
 
Pythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクター
Ransui Iso
 
Pythonによる非同期プログラミング入門
Pythonによる非同期プログラミング入門
Hironori Sekine
 
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Shinichi Nakagawa
 
ソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミング
Ransui Iso
 
Micro Python で組み込み Python
Micro Python で組み込み Python
Hirotaka Kawata
 
小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話
Ransui Iso
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
 
Playing with curses
Playing with curses
Ransui Iso
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
Ransui Iso
 
PyPro2の読みどころ紹介:Python開発の過去と現在
PyPro2の読みどころ紹介:Python開発の過去と現在
Takayuki Shimizukawa
 
Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014
Yoshiki Shibukawa
 
PyConJP Keynote Speech (Japanese version)
PyConJP Keynote Speech (Japanese version)
nishio
 
PyCon JP 2014 plone terada
PyCon JP 2014 plone terada
Manabu Terada
 
Pyconjp2014_implementations
Pyconjp2014_implementations
masahitojp
 
"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach
Daisuke Miyakawa
 
Effective Numerical Computation in NumPy and SciPy
Effective Numerical Computation in NumPy and SciPy
Kimikazu Kato
 
Pycon2014 django performance
Pycon2014 django performance
hirokiky
 
Deep Learning for Image Recognition in Python
Deep Learning for Image Recognition in Python
Hideki
 
Pythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクター
Ransui Iso
 
Pythonによる非同期プログラミング入門
Pythonによる非同期プログラミング入門
Hironori Sekine
 
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Shinichi Nakagawa
 
ソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミング
Ransui Iso
 
Ad

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

20200807勉強会~gRPCに入門しよう~
20200807勉強会~gRPCに入門しよう~
TatsuyaKono1
 
Protocol Buffers 入門
Protocol Buffers 入門
Yuichi Ito
 
PythonによるOPC-UAの利用
PythonによるOPC-UAの利用
Kioto Hirahara
 
PyPy 紹介
PyPy 紹介
shoma h
 
次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発
shoma h
 
エコなWebサーバー
エコなWebサーバー
emasaka
 
RakSulのInternal API開発で gRPCを導入した話
RakSulのInternal API開発で gRPCを導入した話
nixiesan
 
gRPC入門
gRPC入門
Kenjiro Kubota
 
Teclab3
Teclab3
Eikichi Yamaguchi
 
Riak Source Code Reading #2: Erlang Client
Riak Source Code Reading #2: Erlang Client
nobu_k
 
gRPC入門
gRPC入門
ssuser0f153f
 
about Thrift
about Thrift
Naoya Ito
 
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
fukuoka.ex
 
libpgenでパケット操作
libpgenでパケット操作
slankdev
 
Restful Web Service Ch2
Restful Web Service Ch2
kunit
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)
Toru Furukawa
 
XenServerによるお手軽開発サーバ運用
XenServerによるお手軽開発サーバ運用
Shinya Okano
 
Wrapping a C++ library with Cython
Wrapping a C++ library with Cython
fuzzysphere
 
Yapc2012ltthon
Yapc2012ltthon
Junya Murabe
 
20200807勉強会~gRPCに入門しよう~
20200807勉強会~gRPCに入門しよう~
TatsuyaKono1
 
Protocol Buffers 入門
Protocol Buffers 入門
Yuichi Ito
 
PythonによるOPC-UAの利用
PythonによるOPC-UAの利用
Kioto Hirahara
 
PyPy 紹介
PyPy 紹介
shoma h
 
次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発
shoma h
 
エコなWebサーバー
エコなWebサーバー
emasaka
 
RakSulのInternal API開発で gRPCを導入した話
RakSulのInternal API開発で gRPCを導入した話
nixiesan
 
Riak Source Code Reading #2: Erlang Client
Riak Source Code Reading #2: Erlang Client
nobu_k
 
about Thrift
about Thrift
Naoya Ito
 
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
fukuoka.ex
 
libpgenでパケット操作
libpgenでパケット操作
slankdev
 
Restful Web Service Ch2
Restful Web Service Ch2
kunit
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)
Toru Furukawa
 
XenServerによるお手軽開発サーバ運用
XenServerによるお手軽開発サーバ運用
Shinya Okano
 
Wrapping a C++ library with Cython
Wrapping a C++ library with Cython
fuzzysphere
 
Ad

More from Ransui Iso (9)

「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~
Ransui Iso
 
アドテクを支える人と技術
アドテクを支える人と技術
Ransui Iso
 
Introduction of ToySynth
Introduction of ToySynth
Ransui Iso
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
Ransui Iso
 
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 6
Ransui Iso
 
Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5
Ransui Iso
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
Ransui Iso
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
Ransui Iso
 
「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~
Ransui Iso
 
アドテクを支える人と技術
アドテクを支える人と技術
Ransui Iso
 
Introduction of ToySynth
Introduction of ToySynth
Ransui Iso
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
Ransui Iso
 
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 6
Ransui Iso
 
Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5
Ransui Iso
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
Ransui Iso
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
Ransui Iso
 

Recently uploaded (8)

Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
 
色について.pptx .
色について.pptx .
iPride Co., Ltd.
 
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
Protect Your IoT Data with UbiBot's Private Platform.pptx
Protect Your IoT Data with UbiBot's Private Platform.pptx
ユビボット 株式会社
 
OWASP ASVS5.0 overview 20240607_owaspnagoya
OWASP ASVS5.0 overview 20240607_owaspnagoya
OWASP Nagoya
 
Vibe Codingを始めよう 〜Cursorを例に、ノーコードでのプログラミング体験〜
Vibe Codingを始めよう 〜Cursorを例に、ノーコードでのプログラミング体験〜
iPride Co., Ltd.
 
勉強会_ターミナルコマンド入力迅速化_20250620. pptx. .
勉強会_ターミナルコマンド入力迅速化_20250620. pptx. .
iPride Co., Ltd.
 
AI技術共有会2025-06-05_DeepResearchの理解と実践.pdf
AI技術共有会2025-06-05_DeepResearchの理解と実践.pdf
Takuma Oda
 
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
 
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
Protect Your IoT Data with UbiBot's Private Platform.pptx
Protect Your IoT Data with UbiBot's Private Platform.pptx
ユビボット 株式会社
 
OWASP ASVS5.0 overview 20240607_owaspnagoya
OWASP ASVS5.0 overview 20240607_owaspnagoya
OWASP Nagoya
 
Vibe Codingを始めよう 〜Cursorを例に、ノーコードでのプログラミング体験〜
Vibe Codingを始めよう 〜Cursorを例に、ノーコードでのプログラミング体験〜
iPride Co., Ltd.
 
勉強会_ターミナルコマンド入力迅速化_20250620. pptx. .
勉強会_ターミナルコマンド入力迅速化_20250620. pptx. .
iPride Co., Ltd.
 
AI技術共有会2025-06-05_DeepResearchの理解と実践.pdf
AI技術共有会2025-06-05_DeepResearchの理解と実践.pdf
Takuma Oda
 

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.