SlideShare a Scribd company logo
2
Most read
5
Most read
15
Most read
Pythonでpyftpdlibを使って
FTPサーバーを作る際に
使ったテクニックの紹介
Shinya Okano
PyConJP 2016
お前、誰よ
• 岡野 真也
• tokibito
• Pythonを使って10年ぐらい仕事してます
• https://twitter.com/tokibito
• 所属: 株式会社ビープラウド
伝えたいこと
ソフトウェアを開発する際、
闇雲にコードを書いて作っていくのではなく、
手順(工程)を意識すること
アウトライン
1. 題材としたFTPサーバーアプリケーションの紹介
2. ツール(アプリケーション)開発の流れ
3. 要件、仕様、設計を書き起こしてみよう
4. どこから書き始めるか
5. 先に外枠だけ作ってしまう(パッケージング、コマンド化)
6. 実装の仮組み
7. モジュールを分ける
8. テストコードを書く
9. 自動テストを設定する
10. 設定ファイルやログ出力の整備
11. Dockerで動かせるようにしてみる
1.題材としたFTPサーバーアプリケーション
の紹介
• FTPについては詳しくは説明しません
• コンピュータ間でファイルを転送するのに使うプロトコルです
• RFCいくつもあるので調べれば出てきます
• クライアントだとFFFTPなどが有名
• サーバー実装はいろいろあります
• 今回のFTPサーバー
• 1ユーザーのみ
• なるべく設定項目を減らす
• 既存のソフトウェアの設定が面倒なので、目的を果たす単機能なもの
• マスカレードアドレス、パッシブモードとポートは設定できること
• soloftpdという名前でPyPIに登録済み
• https://github.com/tokibito/soloftpd
2.ツール(アプリケーション)開発の流れ
1. 何をしたいのか、まとめる(企画、要件定義)
2. 要件を満たすシステムの入力や出力の詳細、データの流れやシ
ステムの処理をまとめる(仕様策定)
3. 要件、仕様をどうやって実現するのか考えてまとめる(設計)
4. 設計に対応する実装をする、システムを構築する(実装)
5. 実装、構築して出来上がったものが、要件や仕様を満たしている
か確認する(試験)
6. 完成
小さいツールなら、ある程度簡略化、省略するといいです。
参考:
http://tokibito.hatenablog.com/entry/2016/08/01/000820
3.要件、仕様、設計を書き起こしてみよう
• 要件、仕様、設計の一例
• https://github.com/tokibito/soloftpd/blob/master/README.rst
• どんな機能が必要なのか、何を作るのか書き出してみよう
• どのように使うのか、書き出してみよう
• コマンド名やコマンドラインオプション
• 設定ファイル
• 入力ファイル、出力ファイルの仕様など
• ちょっとしたツールなら、簡易的な記述でも十分
• コードをすぐに書けそうな状態=設計ができてる
とても大切な工程です。
これができないまま進めると、完成は遠いです
何を作りたいのか、できるだけハッキリさせておきましょう。
補足. pyftpdlib
• FTPサーバーを実装するためのPythonモジュール
• 認証のカスタマイズ
• ストレージのカスタマイズ
• FTPプロトコルの拡張
4.どこから書き始めるか
• 設計はできました。
• では作りましょう。
• →どこから始める?
• パッケージ設定、ライセンス、README
• あんまり何も考えなくても定型的な部分
• 後回しにすると面倒な部分
• 最初のコミット
• https://github.com/tokibito/soloftpd/commit/80dc9419a97046e5ee
6b148312859ef2c2ed1df3
5.先に外枠を作ってしまう
• まずは外枠のパッケージの部分を用意する
• setup.pyを書く
• わからなければ、他のサードパーティモジュールなどの真似をすればいい
• https://packaging.python.org/distributing/
• コマンドツールであれば、console_scriptsを設定するのが便利
• 誰かに見られて困るものでなければ、PyPIに登録して使えるようにし
とくと楽
• 自分専用のツールだったとしても登録しとけば、便利です
補足. ライセンス
• OSSを利用するのであれば、大雑把にでもライセンス体系は把握し
ておいたほうが良いでしょう
• 自分のツールをどのライセンスで公開するのか、調べるのもいい勉
強になります。
• PythonのライセンスはPSF License(Python Software Foundation
License)です。
• BSDスタイル、GPL互換
• https://docs.python.org/3/license.html
6.実装の仮組み
• 動かしながら作れるほうが、イメージは湧きやすい
• とりあえず入出力できるようにしてみる
• 細かい部分を後回しにして、処理の流れを先に実装する
• 関数やメソッドの呼び出しで、仮の値を返す実装
• 設定によって分岐する部分を固定値にする
• 仮実装の部分はTODOコメントを入れておく
• 後でgrepなどで見つけやすいように
• FTPサーバーの例.
• 設定ファイルの読み込みなどは後で実装
• 認証ハンドラを固定のユーザーで実装
• FTPサーバーを起動して、クライアントから接続できるように
7.モジュールを分ける
• 仮組みができたら、細かい部分の実装をする
• 機能に名前をつけられるなら、モジュール、クラスに分けておく
• 機能単位で実装し、組み込んでいく
• FTPサーバーの例.
• 設定ファイルを読み込むクラスを実装
• 実装したクラスを組み込み
• 認証クラスを実装
• 実装したクラスを組み込み
補足. FTPサーバーのクラス関係
補足. 関数 or クラス
• 関数とクラスのどちらを使うか
• Pythonの関数とクラスの違い
• 関数 = 処理
• クラス = 状態と処理
• 大雑把な経験則:
• 状態(入力)によって処理の分岐が発生するなら、クラスにしたほうがよい
• クラス同士を入れ子にする場合は、役割を文章で説明できる単位にする
• 処理の共通化
• 仕様、設計の上で共通化していないものは、冗長でも分けておく(コピペ上等、設計直
せ)
• クラスの継承は、安易に使わない
• is-a関係とhas-a関係
8.テストコードを書く
• フレームワークは標準のunittestをまずは使う
• テストコードの書き方
• 関数、クラス、モジュール単位でテストコードを書く
• 結合テストは、設計変更に弱いのでなるべく単体から。
• 機能実装時に一緒にやれればなお良い
• テストコードが書きづらい?
• 関数、クラス、モジュール設計の問題
• ほとんどの場合がこれ
• 処理をテストするために準備しないといけない状態が多すぎる
• 処理が大きすぎ
• 結合度が高すぎ
• 対象がテストしづらい場合
• 非同期処理はテストしづらい。気合でやるしかない。つらい。
補足. テストフレームワーク、テストランナー
• テストフレームワーク
• TestCase、TestSuiteやアサーション関数、テストフィクスチャなど、テストコード
を書くための機能、枠組みを提供
• doctest、unittest、pytest、noseなどが提供
• テストランナー
• テストコードを実行し、結果を表示する機能
• テストコードを自動的に見つける機能を持つものもある
• doctest、unittest、pytest、noseなどが提供
• フレームワークとランナーは、別のライブラリを使える
• unittestフレームワークを使ってテストコードを書く
• pytestでテストコードを実行する
補足. テストの実行
• setup.pyのコマンドを使う方法
• python setup.py test
• py.testを使う場合
• py.test tests
9.自動テストを設定する
• 復数のPythonバージョン、実装でテストを実行したい
• toxを使おう
• https://tox.readthedocs.io/en/latest/
• https://github.com/tokibito/soloftpd/blob/master/tox.ini
• 継続的インテグレーション(Continuous Integration, CI)をしたい
• TravisCIやCircleCIを使おう
• Python復数バージョンでのマトリクスであればTravisCIのほうが簡単かも
• https://travis-ci.org/
• https://github.com/tokibito/soloftpd/blob/master/.travis.yml
10.設定ファイルやログ出力の整備
• 設定ファイルのフォーマット
• Pythonの標準モジュールだとJSONやiniファイルが使いやすい
• その他だとXML、YAMLなど。
• 設定ファイルを読み込む処理をどこに持たせるか
• 設定情報を扱うクラスに実装しておくとか
• 設定情報は辞書で扱うこともできるが、属性になっているほうがコードは見
やすい
• コード中の記号を減らせる
• 設定項目が少ないならクラス化しないのもアリ
• ログ出力は、loggingモジュールを使う
• 設定ファイルから設定できるようにしておけば、作り込む必要はさほどない
補足. loggingモジュールでログを出力する
• モジュールのglobalにlogging.getLoggerでオブジェクトを用意してお
いて、infoやerrorなどのメソッドを呼ぶ
• https://github.com/tokibito/soloftpd/blob/master/soloftpd/comman
d.py#L8
11.Dockerで動かせるようにしてみる
• Dockerコンテナで動かせると便利なところ
• OSのバージョン依存から脱却
• インストール手順の省略
• PyPIに登録しているならば、requirements.txtだけ作ればすぐに登録
できるイメージを使える
• https://hub.docker.com/_/python/
• official repository
• python:3.5-onbuild
• 例:
• https://github.com/tokibito/docker-soloftpd
• dockerコマンドのオプション指定が面倒な場合は、docker-compose
を使うと楽
まとめ
• コードを書き始める前に
• 作りたいものを決めて、要件、仕様、設計
• コードを書く
• 外枠(パッケージ)
• 仮組み
• モジュール化
• テストコード
• 使いやすさ向上させる
自分にあった開発手順を持ち、
スムーズに品質良くソフトウェアを作れるようになれるといいですね。

More Related Content

What's hot (20)

PDF
Python札幌 2012/06/17
Shinya Okano
 
PDF
Pythonによるwebアプリケーション入門 - Django編-
Hironori Sekine
 
PPTX
Pynyumon03 LT
drillan
 
PDF
スクレイピングとPython
Hironori Sekine
 
PDF
RubyエンジニアがPythonをdisるためにPythonを勉強してみた
Yusuke Kon
 
KEY
Windowsにpythonをインストールしてみよう
Kenji NAKAGAKI
 
PPTX
勉強会 Cvml python基礎
真哉 杉野
 
PDF
OSSと私
Hattori Hideo
 
PDF
サードパーティパッケージの歩き方
Takesxi Sximada
 
PDF
Python & PyConJP 2014 Report
gree_tech
 
PDF
Python3 プログラミング勉強会
Tetsuya Morimoto
 
PDF
10分でわかるPythonの開発環境
Hisao Soyama
 
PPTX
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
Katsuhiro Morishita
 
PPTX
210630 python
Takuya Nishimoto
 
PDF
言語処理するのに Python でいいの? #PyDataTokyo
Shuyo Nakatani
 
PPTX
Pythonでpdfをいじってみる
株式会社 システムヨシイ
 
PPTX
Stapy#17LT
drillan
 
PPTX
Pythonの環境導入 2014年春季版
Katsuhiro Morishita
 
PDF
Pythonを取り巻く開発環境 #pyconjp
Yoshifumi Yamaguchi
 
PDF
久しぶりのPythonでgoogleのアレを制御してみた
Shohei Tai
 
Python札幌 2012/06/17
Shinya Okano
 
Pythonによるwebアプリケーション入門 - Django編-
Hironori Sekine
 
Pynyumon03 LT
drillan
 
スクレイピングとPython
Hironori Sekine
 
RubyエンジニアがPythonをdisるためにPythonを勉強してみた
Yusuke Kon
 
Windowsにpythonをインストールしてみよう
Kenji NAKAGAKI
 
勉強会 Cvml python基礎
真哉 杉野
 
OSSと私
Hattori Hideo
 
サードパーティパッケージの歩き方
Takesxi Sximada
 
Python & PyConJP 2014 Report
gree_tech
 
Python3 プログラミング勉強会
Tetsuya Morimoto
 
10分でわかるPythonの開発環境
Hisao Soyama
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
Katsuhiro Morishita
 
210630 python
Takuya Nishimoto
 
言語処理するのに Python でいいの? #PyDataTokyo
Shuyo Nakatani
 
Pythonでpdfをいじってみる
株式会社 システムヨシイ
 
Stapy#17LT
drillan
 
Pythonの環境導入 2014年春季版
Katsuhiro Morishita
 
Pythonを取り巻く開発環境 #pyconjp
Yoshifumi Yamaguchi
 
久しぶりのPythonでgoogleのアレを制御してみた
Shohei Tai
 

Viewers also liked (20)

PDF
Python入門 : 4日間コース社内トレーニング
Yuichi Ito
 
PDF
Pythonを含む多くのプログラミング言語を扱う処理フレームワークとパターン、鷲崎弘宜、PyConJP 2016 招待講演
Hironori Washizaki
 
PDF
RaspberryPiで日本の子供たちにプログラミングのパッションを伝えよう!
Antoine Choppin
 
PDF
Djangoフレームワークの紹介
Shinya Okano
 
PDF
Pythonで実現する4コマ漫画の分析・評論
esu ji
 
PDF
マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)
株式会社MonotaRO Tech Team
 
PDF
Djangoのエントリポイントとアプリケーションの仕組み
Shinya Okano
 
PDF
Goji とレイヤ化アーキテクチャ
Shiroyagi Corporation
 
PDF
Synthesijer zynq qs_20150316
Takefumi MIYOSHI
 
PDF
Webフレームワークを作ってる話 #osakapy
Masashi Shibata
 
PPTX
Camp report for_kwskrb
rojiuratech
 
PPTX
Robot Framework (のSelenium2Libraryのお話)
泰 増田
 
PPTX
BPStudy#97 世界に価値を創り出すエンジニアの技術
Haruo Sato
 
PPTX
Taming robotframework
泰 増田
 
PDF
4コマ漫画 Machine Learning 分析データを集めたかった話
esu ji
 
PPTX
ちょっと真面目にPython&Django・基礎編
OMEGA (@equal_001)
 
PPTX
Pythonで入門するApache Spark at PyCon2016
Tatsuya Atsumi
 
PDF
データ分析-の波乗り遅れた気がしてる人のための Python×データ分析の超基礎の基礎 v1.0-20160831
Yusaku Kinoshita
 
PDF
Python入門
Shohei Okada
 
ODP
Djangoアプリの実践的設計手法
Ian Lewis
 
Python入門 : 4日間コース社内トレーニング
Yuichi Ito
 
Pythonを含む多くのプログラミング言語を扱う処理フレームワークとパターン、鷲崎弘宜、PyConJP 2016 招待講演
Hironori Washizaki
 
RaspberryPiで日本の子供たちにプログラミングのパッションを伝えよう!
Antoine Choppin
 
Djangoフレームワークの紹介
Shinya Okano
 
Pythonで実現する4コマ漫画の分析・評論
esu ji
 
マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)
株式会社MonotaRO Tech Team
 
Djangoのエントリポイントとアプリケーションの仕組み
Shinya Okano
 
Goji とレイヤ化アーキテクチャ
Shiroyagi Corporation
 
Synthesijer zynq qs_20150316
Takefumi MIYOSHI
 
Webフレームワークを作ってる話 #osakapy
Masashi Shibata
 
Camp report for_kwskrb
rojiuratech
 
Robot Framework (のSelenium2Libraryのお話)
泰 増田
 
BPStudy#97 世界に価値を創り出すエンジニアの技術
Haruo Sato
 
Taming robotframework
泰 増田
 
4コマ漫画 Machine Learning 分析データを集めたかった話
esu ji
 
ちょっと真面目にPython&Django・基礎編
OMEGA (@equal_001)
 
Pythonで入門するApache Spark at PyCon2016
Tatsuya Atsumi
 
データ分析-の波乗り遅れた気がしてる人のための Python×データ分析の超基礎の基礎 v1.0-20160831
Yusaku Kinoshita
 
Python入門
Shohei Okada
 
Djangoアプリの実践的設計手法
Ian Lewis
 
Ad

More from Shinya Okano (12)

PDF
Djangoエンジニアの観点から見たHue
Shinya Okano
 
PDF
Djangoフレームワークのユーザーモデルと認証
Shinya Okano
 
PDF
Djangoフレームワークの紹介
Shinya Okano
 
PDF
Djangoフレームワークの紹介 OSC2015北海道
Shinya Okano
 
PPTX
Spring4Dの紹介
Shinya Okano
 
PDF
Hadoopとその周辺の紹介
Shinya Okano
 
ODP
Delphi ideを使わない開発スタイルの紹介
Shinya Okano
 
PDF
2011.06.01 和歌山高専
Shinya Okano
 
PDF
電子書籍の話
Shinya Okano
 
PDF
写真共有アプリのバックエンドサーバー
Shinya Okano
 
PDF
XenServerによるお手軽開発サーバ運用
Shinya Okano
 
PDF
mixiアプリ『the Actress』運用にあたっての課題へのチャレンジ
Shinya Okano
 
Djangoエンジニアの観点から見たHue
Shinya Okano
 
Djangoフレームワークのユーザーモデルと認証
Shinya Okano
 
Djangoフレームワークの紹介
Shinya Okano
 
Djangoフレームワークの紹介 OSC2015北海道
Shinya Okano
 
Spring4Dの紹介
Shinya Okano
 
Hadoopとその周辺の紹介
Shinya Okano
 
Delphi ideを使わない開発スタイルの紹介
Shinya Okano
 
2011.06.01 和歌山高専
Shinya Okano
 
電子書籍の話
Shinya Okano
 
写真共有アプリのバックエンドサーバー
Shinya Okano
 
XenServerによるお手軽開発サーバ運用
Shinya Okano
 
mixiアプリ『the Actress』運用にあたっての課題へのチャレンジ
Shinya Okano
 
Ad

Recently uploaded (9)

PPTX
オープンソース界隈の利用者や技術者から見たオープンソースEDAとは? What is open source EDA from the perspecti...
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
 
PDF
第3回デジタル理学療法研究会学術大会シンポジウム「デジタル理学療法の組織活用:教育・管理・研究を繋ぐ新たな地平」の講演資料.
Matsushita Laboratory
 
PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
PDF
2023年版Web3技術の理想と現実
Syuhei Hiya
 
PDF
第3回デジタル理学療法学会のシンポジウム「デジタル理学療法の組織活用:教育・管理・研究を繋ぐ新たな地平」での話題提供
Matsushita Laboratory
 
PDF
go tool と Minimal Version Selection アルゴリズム
Keisuke Ishigami
 
PDF
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
 
PDF
漁船に搭載されている電子装備と漁法について_VRC海洋学研究会_海のLT会発表資料
Yuuitirou528 default
 
PPTX
新卒・中途採用者向け採用ピッチ資料2025年7月版(20250702).pptx
Official74
 
オープンソース界隈の利用者や技術者から見たオープンソースEDAとは? What is open source EDA from the perspecti...
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
 
第3回デジタル理学療法研究会学術大会シンポジウム「デジタル理学療法の組織活用:教育・管理・研究を繋ぐ新たな地平」の講演資料.
Matsushita Laboratory
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
2023年版Web3技術の理想と現実
Syuhei Hiya
 
第3回デジタル理学療法学会のシンポジウム「デジタル理学療法の組織活用:教育・管理・研究を繋ぐ新たな地平」での話題提供
Matsushita Laboratory
 
go tool と Minimal Version Selection アルゴリズム
Keisuke Ishigami
 
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
 
漁船に搭載されている電子装備と漁法について_VRC海洋学研究会_海のLT会発表資料
Yuuitirou528 default
 
新卒・中途採用者向け採用ピッチ資料2025年7月版(20250702).pptx
Official74
 

Pyconjp2016 pyftplib