Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
XML-RPC : Pythonが電池付属と呼ばれる理由
Search
Ransui Iso
September 13, 2014
Technology
190
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
XML-RPC : Pythonが電池付属と呼ばれる理由
Ransui Iso
September 13, 2014
Other Decks in Technology
See All in Technology
子育てエンジニアの可処分時間が減っても成長を諦めない戦い方
sudoakiy
6
4.6k
PagerDuty Tech Hub-鳴らすけれど、人は動かない
ezaki
0
170
Claude Code本は、どのように執筆チームで書かれたか
oikon48
1
380
二歩目のフロントエンド・ウェブアクセシビリティ
camiha
2
570
実践! SRE × AI - ABEMA における AIOps -
tetsuya28
8
3.1k
Claude の新機能を、 出た日に触って社内に届けるまで
rfdnxbro
1
170
『SAR衛星データ解析入門』のご紹介とその応用
syuchimu
0
120
初海外で注意すべきこと12選!!!安全快適なre:invent生活にするために
yuuuuuuu168
1
160
AI コーディングと人間の認知スループット / CTO Night & Day 2026 Morning Session / AI Coding and Human Cognitive Throughput
prog893
4
1k
Rust で関数型ドメインモデリング
takonda
0
140
オントロジーって 結局なにもの? AI エージェントに「意味」を渡す知識設計の話
greenmidori
0
190
分析の民主化を支えるメタデータ整備の実践
kakehashi
PRO
4
1.4k
Featured
See All Featured
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
310
Crafting Experiences
bethany
1
380
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
Speed Design
sergeychernyshev
33
2.2k
WENDY [Excerpt]
tessaabrams
14
40k
Mobile First: as difficult as doing things right
swwweet
225
10k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Into the Great Unknown - MozCon
thekraken
41
2.8k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
The SEO Collaboration Effect
kristinabergwall1
1
590
Transcript
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.
Copyright (c) 2014 Ransui Iso, All rights reserved. おまえ誰よ? http://www.facebook.com/ransui
@ransui 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. Remote Procedure
Call 昔からあるんです
Copyright (c) 2014 Ransui Iso, All rights reserved. 有名どころ •
Sun RPC – NFSの基盤として開発された – XDRという形式で情報をシリアライズする • なんとPython標準モジュールにでXDRを取り扱える – 現役で色々と使われている • その他にも – DCE/RPC – OMG CORBA – DCOM
Copyright (c) 2014 Ransui Iso, All rights reserved. そも、RPCとは? •
言語が提供する「呼び出し規約」を拡張する – 利用者はRPCをサポートする言語でプログラミングをす るとき、ほとんどRPCの存在を意識する必要がない。 Local Remote ham spam egg ham spam egg この時ローカルから result = spam(args) という感じでリモート のメソッドを呼び出せるということ
Copyright (c) 2014 Ransui Iso, All rights reserved. Client もうすこし細かく見てみる
• 魔法は存在しないのでタネがある – インタフェースの定義からStubライブラリを作成しそれ を利用することでリモート呼び出しの詳細を隠蔽する RPC Library IDL Client Stub Server RPC Library Server Stub IDL Compiler Application Code Server Code
Copyright (c) 2014 Ransui Iso, All rights reserved. XML-RPC
Copyright (c) 2014 Ransui Iso, All rights reserved. メッセージ形式がXMLなRPC •
通信そのものはHTTPが使われることが多い – HTTPのbody部分に呼び出しや戻り値についての情報を XML形式で記述してメッセージとして交換する – 当然のことながらXMLの冗長性のおかげでオーバーヘッ ドが大きくてパフォーマンス的には不利 – バイナリプロトコルに対してHuman Readableだという 部分くらいしか利点が思いつかない……
Copyright (c) 2014 Ransui Iso, All rights reserved. PythonでのXML-RPC •
標準ライブラリにある – クライアント・サーバモデル – xmlrpc.servsr サーバ側 – xmlrpc.client クライアント側 • PurePythonによる実装 – cPythonが動く環境であればまずどこでも使える – 改造も簡単。色々できる。
Copyright (c) 2014 Ransui Iso, All rights reserved. Hello World
: Server側 • まずはサーバを準備 • SimpleXMLRPCServerを継承したクラスを作る • このクラスは通信担当で公開メソッドとかに関与しない import xmlrpc.server class HelloServer(xmlrpc.server.SimpleXMLRPCServer): allow_reuse_address = True request_queue_size = 1024 def __init__(self, *args, **kw): super().__init__(*args, **kw) import xmlrpc.server class HelloServer(xmlrpc.server.SimpleXMLRPCServer): allow_reuse_address = True request_queue_size = 1024 def __init__(self, *args, **kw): super().__init__(*args, **kw)
Copyright (c) 2014 Ransui Iso, All rights reserved. Hello World
: Server側 • 公開する機能を準備する • SimpleXMLRPCRequestHandlerを継承したクラスを作る • このクラス内で「メソッド名」と「機能」の対応を作る class HelloRequestHandler(xmlrpc.server.SimpleXMLRPCRequestHandler): def __init__(self, *args, **kw): super().__init__(*args, **kw) def _dispatch(self, method_name, args): return getattr(self, method_name)(*args) def greeting(self, name): return "Hello, %s" % name class HelloRequestHandler(xmlrpc.server.SimpleXMLRPCRequestHandler): def __init__(self, *args, **kw): super().__init__(*args, **kw) def _dispatch(self, method_name, args): return getattr(self, method_name)(*args) def greeting(self, name): return "Hello, %s" % name
Copyright (c) 2014 Ransui Iso, All rights reserved. Hello World
: Server側 • 組み合わせてサーバとして起動する • サーバクラスとハンドラクラスのインスタンスを作成して組み 合わせる。その後、サーバインスタンスのループを開始。 def main(): server = HelloServer(("127.0.0.1", 9999), requestHandler=HelloRequestHandler, logRequests=None, allow_none=True) server.serve_forever() def main(): server = HelloServer(("127.0.0.1", 9999), requestHandler=HelloRequestHandler, logRequests=None, allow_none=True) server.serve_forever()
Copyright (c) 2014 Ransui Iso, All rights reserved. Hello World
: Client側 • ServerProxyクラスを使うだけ • サーバ側に比べてとっても簡単 import xmlrpc.client def main(): proxy = xmlrpc.client.ServerProxy("http://127.0.0.1:9999/", allow_none=True) print(proxy.greeting("spam")) import xmlrpc.client def main(): proxy = xmlrpc.client.ServerProxy("http://127.0.0.1:9999/", allow_none=True) print(proxy.greeting("spam"))
Copyright (c) 2014 Ransui Iso, All rights reserved. もう少し使いやすく 日々の道具として使うための工夫
Copyright (c) 2014 Ransui Iso, All rights reserved. ServerとClient分離問題 •
見通しの悪さを改善する – サーバもクライアントも1つのモジュールをimportする – 下のような状態を維持しやすくする ServiceClient RequestHandler ham spam egg ham spam egg
Copyright (c) 2014 Ransui Iso, All rights reserved. もっと結合性を上げる •
Pythonの動的な性質をもっと使う – MetaClassを使うなどして、サービスの定義を行うとと 自動的にStubが生成されるようにして、コードはそれを 継承して書くとかする Client RPC Library Service Definition Client Stub Server RPC Library Server Stub Metaclass Application Code Server Code
Copyright (c) 2014 Ransui Iso, All rights reserved. 使いこなし
Copyright (c) 2014 Ransui Iso, All rights reserved. サーバのスレッド化 •
簡単にスレッド化ができる – SimpleXMLRPCServerはSocketServerを利用して構築 されていることを利用する。 import xmlrpc.server import socketserver class HelloServer(Socketserver.ThreadingMixIn, xmlrpc.server.SimpleXMLRPCServer): allow_reuse_address = True request_queue_size = 1024 def __init__(self, *args, **kw): super().__init__(*args, **kw) import xmlrpc.server import socketserver class HelloServer(Socketserver.ThreadingMixIn, xmlrpc.server.SimpleXMLRPCServer): allow_reuse_address = True request_queue_size = 1024 def __init__(self, *args, **kw): super().__init__(*args, **kw)
Copyright (c) 2014 Ransui Iso, All rights reserved. 複雑なデータ •
インスタンスとかの送受信 – デコレータ化すればもっとかっこよくできる import pickle from xmlrpc.client import Binary def encode_to_binary(target_object): return Binary(pickle.dumps(target_object, protocol=2)) def decode_from_binary(binary_image): return pickle.loads(binary_image.data) import pickle from xmlrpc.client import Binary def encode_to_binary(target_object): return Binary(pickle.dumps(target_object, protocol=2)) def decode_from_binary(binary_image): return pickle.loads(binary_image.data) def server_side_method(self, args): return encode_to_binary(blahblah(decode_from_binay(args)) def client_side_method(self, args): result = decode_from_binary( self.proxy.server_side_method(encode_to_binary(args)) def server_side_method(self, args): return encode_to_binary(blahblah(decode_from_binay(args)) def client_side_method(self, args): result = decode_from_binary( self.proxy.server_side_method(encode_to_binary(args))
Copyright (c) 2014 Ransui Iso, All rights reserved. 事例 弊社では使いまくってます
Copyright (c) 2014 Ransui Iso, All rights reserved. Application Viewer
Search MonkeypodTreeServer MonkeyPod ディレクトリ • データベースと検索に使用 Tree maintainer Get Node Get Review etc. SiteData Data Manage
Copyright (c) 2014 Ransui Iso, All rights reserved. Application Rule
Builer RuleEngine Stats / Report RuleServer ターゲティングルール • 広告配信のターゲティングルールの管理 Object Storage Create New Rule Get Rule Set Rule Storage File Remove Rule
Copyright (c) 2014 Ransui Iso, All rights reserved. まとめ
Copyright (c) 2014 Ransui Iso, All rights reserved. 使い所と注意 •
ちょっとしたサービスが必要なときに – とにかくPythonがインストールされていれば使える – 変な設定ファイルとかサーバプロセスとかいらない – サービス側のコードを書く際に、お作法とか無いので何 でもやり放題 • 気をつけたいところ – pickleとか無節操に使うとPython縛りに – 真の意味でパフォーマンスが必要なときは使っちゃダメ
Copyright (c) 2014 Ransui Iso, All rights reserved. Thank you
for listening. Happy Hacking with Python!