PythonでFTPを使った送受信アプリを作成した

Moi!
こんにちは、ロニーです。

 

4月に1ヶ月弱ほどかけて、あるデスクトップアプリを作りました。

それが「FTP xloader」です。
「エフテーピー エックスローダー」と呼びます。

「で、それ何よ?」という質問が飛んできそうです。

要は、パソコン端末とレンタルサーバとの間でファイルを自動送受信するツールです。
特定のディレクトリ(フォルダ)を常に見張って、置かれた特定のファイルを自動で転送してくれます。
(特定のファイルは今回はjpgやPNGのようなバイナリファイル限定です。)

 

このアプリ、
ランサーズで仕事を受注して作成し、納品しました。

Lancers(ランサーズ)というのはフリーランスの仕事とクライアントを結ぶオンラインプラットフォームです。
仕事を発注したいクライアントと、仕事を受注したいフリーランスの両者を繋げるマッチングサービスを提供しています。

そう、念願のプログラミングのお仕事です!
これをゼロから自分でPythonを使って作成しました。

 

さて今回のブログでは、
自分が作ったそのアプリ、
FTP xloaderについて紹介します。

あと受注とかの経緯についても後半で触れます。

キーボードと封筒の画像

自作のFTP自動送受信アプリ、「FTP xloader」とは

まずは名称からですが、

「FTP」というのは「File Transfer Protocol (ファイル転送プロトコル)」の略で、
サーバとクライアント間でファイルをやり取りする、シンプルで基本的な方法です。

クライアントというのは例えばPC端末などを指し、
サーバに対してアクセスをする、アクセスの方のコンピュータを指します。

 

「xloader」というのは僕の造語ですが、
ファイルをサーバ上にアップするUploader(アップローダー)と、
ファイルをサーバ上からダウンロードするDownloader(ダウンローダー)の両方を含むという意味で、Xを変数的に置いた名称です。

まとめてFTP xloaderと呼んでいますが、基本的にはアップローダーとダウンローダーそれぞれを別々に使います。

つまり「FTPを用いて送受信する奴」って意味です。

今回僕が作ったこのアプリ(ツール)の特徴は、

送受信する指定のディレクトリ(フォルダ)を24時間監視して、
事前設定した特定の拡張子がついたファイルが格納されたら自動で転送する機能です。
拡張子はjpg、jpeg、png、pdf、mp5と、
それぞれの大文字表記までサポートしています。

 

単にFTPでファイルを送受信するツールと言えば「Filezilla」や「FFFTP」などが有名です。
じゃあなぜわざわざ作ったのか?

それは、以下の要件のような、パーソナライズされた要望があったからです。

今回依頼が来た要件としては、ざっくり以下な感じです。

「指定のディレクトリを常に監視する」
「FTPを用いて自動で特定の拡張子のファイルを送受信する」
「ネットワーク切断などが生じたらリトライするような例外処理を含める」
「同時に複数のアプリなどが動いても同じファイルを取り合ってエラーにならないようにする」

既存のFilezilla等が備えているのは、基本的にこのうちの2番目だけなのです。

なので、FTP xloaderはシンプルではありますが、
僕のアプリならでは、の独自性は一応備えているわけです。

 

FTP送信するとか、フォルダ監視をするといった基本的な動作自体はすぐに実装できましたが、
エラー時に処理が中断してしまわないようにする例外処理の適用に一番時間がかかりましたね。

ファイルが他のアプリなどから処理途中に奪われないようにロックさせたり転送が失敗したらやり直す、簡易的な、いわゆる「トランザクション処理」の実装。

またネットワークが切れた場合などにリトライし、続きから送受信を再開する機能も入れました。

色んなエラーパターンが想定されるので、それを想定した造りに組み上げていくのに苦労しました。

本来であればMD5チェックサムを使って送受信前後の照合をしたかったのですが、
FTPではそれが出来ないため断念しました。

今回作ったやつ、仕事で受注・納品したものなのでGithub公開は差し控えます。。
仕様や技術面での質問、作ってほしいですといったご依頼などありましたら
コメントorお問い合わせください。 (コメント欄はページ下の方にあります。)

クラサバ

ランサーズで仕事を受注してから納品するまでの流れと経緯

もう結構長いこと独学でPythonなどを勉強してきましたが、
一向に業務でガッツリプログラミングできる機会が得られないので自分個人で受注しちゃいました。

「すぐ参画できる開発案件がいくつもあるよー」と太鼓判押されたのでわざわざ転職したものの、
その複数案件が見事に全部立ち消えるし、
ようやく見つけた、開発業務を確約してくれた案件に入ったら実は口約束だけで全くやらしてもらえないとか。

もう正攻法ではこの壁を越えられないのはほぼ明確になったので、
戦略を変える必要がありました。

 

さて、個人で仕事を受注するとなると、方法としては主に二つ。

・ランサーズなどの受発注プラットフォームの利用
・直接知り合いから受注する

知り合いで実際にお金をもらえる人が現時点で居ないのでランサーズを使ってみたわけです。

 

ランサーズを活用してPython開発を探そう

ランサーズ(Lancers)というのはクラウドソーシングサービスの一つで、
色んなジャンルの業務を委託できるマッチングサービスです。

ライティング、デザインからプログラミングまで、多様な仕事があります。
妻クルタさんもロゴ作成、服飾デザイン、キャラクターデザインなど色々やってます。

 

ランサーズと並行してクラウドワークスでも同様に、Pythonを用いたプロジェクトでできそうなものがないかは毎日常にチェックしています。

普段の本職側でフルタイムの時間は取り押さえられてしまうほか、
それ以外も家事育児があるのでほとんど時間を割けないのですが、
ほどよい難易度で、かつ納期に余裕があるものだったので今回は即応募しました。

 

気になる報酬額ですが、
初めてだったので、相場の10分の1以下、まさに二束三文で受け付けました。

実績を作るのが第一目標だったので、金額はこの際いくらでもいいわけです。
本来は自分の安売りも、相場を崩すような極端な安値も絶対に避けるべきですが、背に腹は代えられません。

プログラミングについて、基礎的な技術や知見はありますが、
直接エンドユーザ(アプリの使用者)と交渉したり要件を聞き出すのは初めてですし、
プログラムを納品するときの手順とか方式というのは、書籍の類にもWebサイトにも全く触れられていないので手探りで進めざるを得ず、内心ビクビクでした。

今回の案件は納期はふわっとしていて、
「特に納期設定していないけど1ヶ月くらい」という形だったので、余裕があったんです。

早朝とか休日を使って作成し、なんとか納期に間に合って提出、
直後に2か所、修正が入ったものの、無事プロジェクトを終えて代金と良い評価を受け取れました。

 

なおランサーズのPython開発の依頼ってあまり多くなく、
良く見るものとしては、

・ヤフオクなどのECサイトをスクレイピングして情報を自動取得・集約してほしい
・Pythonを勉強(とか自主開発とか)してるけどよくわからないから教えてほしい
・機械学習を使った株やFXの自動トレードツール作ってほしい
・ChatGPTを組み込んだツール作ってほしい
・出会い系マッチングサービスを作ってほしい

といったもの。
欲望ダダ漏れって感じで面白いですが、難易度が高く自分が受けるには厳しいものがあります。
スクレイピングなら基本的なことはできますが、
Twitterしかりメルカリしかり、
多くのサービスがスクレイピング禁止しているところをすり抜けてやってほしいって感じのものがあって、
それは受けられん、とスルーしています。

pythonドット絵

実務で仕事をしてみての学び

開発実務をしてみて、やはり学習とは違う、実践ならではの学びが非常にありました。

例えば、クラスとインスタンスについてだとか。

 

オブジェクト指向プログラミングの代表的な特徴でもある概念、「クラス」と「インスタンス」。

教則本や資格を取る際にその仕組みや使い方などは学んでいたものの、
正直いつどんな風に使うのか全然イメージが湧いてませんでした。

自分でちょっとした機能のプログラムを作ろうと思った時、
簡易的なスクリプトでデータ定義も処理もズラズラズラーって書けちゃえます。

また同じ処理を再利用する程度なら自作関数で事足りちゃいます。

ただ、いざ実務でやりたいことをどのように効率的に作り上げていくか考えていったとき、
ある時にクラスを使うべきタイミングが出てきました。

アハ体験ですねこれは。

こういうことかー!って目から鱗でした。
クラスとインスタンス、別ファイルをインポートしていく仕組み、カプセル化、コンストラクタっていう、
「オブジェクト指向プログラミング」の意味が全部一気に繋がった感じでした。

と同時に、その深さが現実的に目の前に広がってちょっと慄きました。
今まで見えていたのって氷山の一角だったんだなって。

まぁ今回のプログラムは規模が小さいものだったので、
ちょこっと触れた程度だったんですけどね。
正直なところまだクラスの理解も活用スキルもまだまだで恥ずかしいレベルです。
もっと色々やってみたいですね。

あと今回でFTPの仕様にはかなり精通した気がします。
今時FTPなんてそんな使わんだろうけど…。

あ、Python標準ライブラリにあるftplibライブラリの、FTP_TLSを使っているので通信は安全にしてはあります。
流石にリモートでFTPを平文でやり取りするのはマズいですからね。

 

終わりに

今回やってみて、とにかく終始楽しかったですね。
ほんと、これ仕事でずっと出来たら最高だなって思います。

コロナ影響でしょうか、
テスラから始まって、シリコンバレーの多くのメガテック企業が雪崩のようにエンジニアの大量解雇を実施しました。

日本でも、それらの企業に勤めていた優秀なプログラマーが一気に市場に溢れました。
しかもそのメガテック企業だけでなく、派生的に日本国内のIT企業にも解雇の波が来るとか来たとか。
その具体的な事実については未確認なんですが、
どうやらPHPについてはかなりプログラマーがあぶれているとのこと。(弊社社長談)

今年の3月に僕、PHPをやっていて自社のメールフォームの改修とかをやりました。
昨年から少しずつ学習は進めていたんです。PHPのLaraveフレームワークとか。

PHPはPythonのように統計とか機械学習のような高度な知識を追加で求められないですし、
JavaやC++と比べても学習コストが低く、身につけやすい。

なので戦略的にPHPに的を絞って深堀りしていたんですが、
ここにきて風向きが一気に変わってしまって愕然としました。

PHPやった上でPythonやると、
やっぱりしっくりくるというか、やりたいことがスラスラコーディングできる感じがPythonにあって、改めて惚れ込んじゃいましたね。

ランサーズの他のPython案件、
実際に触ったことがないサードパーティ製ライブラリを活用するものが多くて、
それをまず初めて使ってみた上で完成させるには納期が厳しいことがほとんど。

なのでなかなか次の案件を見つけられずにいます。

自分で事前に色々触ってみた経験がないと受注しにくいというのも、最近の悩みですね。
隙間時間とかで新しいライブラリとか色々試していこう。

さて、今回は以上です。

また次のプログラミング実務機会を期待して、モイモイ!

コメント

タイトルとURLをコピーしました