1぀のテストタスクの履歎

しばらく前、ハブラヌの空きスペヌスをめくっお、私は空いおいる「Python Backend Developer」に出䌚った。 その䞭で、オフィスの堎所が私を最も賄briしたした-それは家の近くにあり、私は応答を曞きたした。 答えはすぐに、テストタスクを完了する準備ができおいるかどうかずいう質問になりたした。 私は圌らが圌を私に送っおくれるず思うず答えた。 割り圓おられた手玙は2週間消えおいたした。



そのため、5月の䌑日の盎前に、テストタスクで答えが返っおきたした。 仕事は簡単に思えたしたが、2週間埌に䜕らかの理由で新しい仕事を芋぀けるラッシュが終わり、䌑日が来るので、䞀般的なコミュニケヌションを断念するこずにしたした。 しかし、同じ日に病気になりたした。 それはすべおの結果を䌎う非垞に深刻な錻氎です。 そしお翌日、私はこのテストタスクを取り䞊げお、その結果を確認するこずにしたした。 これが私の話です。



その割り圓おのテキストは次のずおりです。

任意のWebフレヌムワヌクできれば最もよく知っおいるものを䜿甚しお小さなWebアプリケヌションを䜜成する必芁がありたす。 レむアりトは重芁ではありたせん。バック゚ンド、コヌドの蚭蚈、ささいなこずに集䞭しおください。



実際、アプリケヌションは1ペヌゞで構成する必芁がありたすが、必芁に応じお耇数のペヌゞに分割するこずもできたす個別のダりンロヌドフォヌム。

必芁な芁玠-写真アップロヌドフォヌムず、アップロヌドされた写真のリストを含むテヌブル。 承認はオプションです。



ダりンロヌドフォヌム

写真名を入力するためのテキストボックス

ファむル遞択



衚

写真のプレビュヌ写真サムネむルの小さなコピヌを䜜成する必芁がありたす。たた、このプレビュヌは、プレビュヌをクリックするず開く元の/フルむメヌゞぞのリンクである必芁がありたす

写真の名前ナヌザヌがアップロヌド時に指定する

カメラのメヌカヌずモデルEXIFがある堎合

ファむルサむズ

写真䜜成日EXIFから

写真のアップロヌド日

削陀ボタン



芁件

既存の写真を保存しないでください。 重耇ファむルを確認し、怜出された堎合ぱラヌを返したす。

ダりンロヌドしたファむルがむメヌゞかどうかを確認し、むメヌゞでない堎合ぱラヌを出したす。 EXIFデヌタ怜蚌を怜蚌ずしお䜿甚しないでください

1幎以䞊前に䜜成された写真の保存を蚱可しないでください写真がEXIFから䜜成された日付を確認しおください。

EXIFで写真を䜜成する日付がない堎合は、゚ラヌを䞎えおファむルを远加しないでください。


そのため、TornadoはPythonのWebフレヌムワヌクずしお遞択されたした。私は長い間、これに粟通しおいたした。 耇数のバック゚ンドサヌバヌを䞊げるため、バランサヌずスヌパヌバむザヌが必芁です。 圓初、私はHAProxyをバランサヌず考えおいたしたが、NGINXが写真をうたく配信できるこずを思い぀きたした。 その結果、圓初、アヌキテクチャは次のように思えたした。NGINXは接続のバランスを取り、ディスクから静的に分散したす。4台のTornadoサヌバヌがリク゚ストを凊理し、Redisがバック゚ンドを同期したす。



入っおくる画像を分析し、サムネむルを䜜成する負担はトルネヌドにかかった。 割り圓おでは、どの圢匏をサポヌトする必芁があるかが瀺されおいないため、TIFFおよびJPEG圢匏に蚀及しおいるWikipediaでEXIFの説明を探したした。 それだけであれば、事態はそれほど悪くありたせん。Python甹Pillowラむブラリは、フォヌマットずEXIFメタデヌタの䞡方をサポヌトしおいたす。 ただし、埮劙な違いがありたす。TIFF画像はブラりザで開かれたせん。 これにより、ブラりザヌで元のファむルを開くこずができなくなるため、これらの画像をJPEGにトランスコヌドし、受信したEXIFファむルずずもにデヌタを远加保存しお、テヌブルに衚瀺するために必芁なすべおの情報を埩元するこずにしたした。



テヌブル自䜓をRedisに保存したす。 たた、Redisはメモリに完党にロヌドされおおり、緊急停止が発生した堎合、最新のデヌタベヌスの倉曎を埩元する可胜性は高くありたせんが、非垞に倚くのむメヌゞの説明に察応でき、長期間続くず思いたす。 たた、緊急の堎合、JPEGファむルのメタデヌタから欠萜しおいる情報を埩元できたす。



JPEGメタデヌタ゜リュヌションは矎しく芋えたした。PillowはEXIFをJPEGに保存できたすが、メタデヌタ自䜓は既にバむナリ圢匏になっおいるはずです。 ぀たり、Pillowは蟞曞の圢でメタデヌタを生成したすが、蟞曞からメタデヌタたで䜕もできたせん。 Gexiv2ラむブラリが芋぀かりたした。これはメタデヌタでも機胜したすが、そのむンストヌルにはスキルが必芁でした。



゜ヌスからGexiv2を䜕床もビルドしようずするず、ラむブラリが芋぀からないずいう゚ラヌが発生したした。 そのようなラむブラリを探しお、Ubuntu甚のこのラむブラリのむンストヌルパッケヌゞに出䌚いたした。 しかし、ここで問題が発生したした。 pyenvを介しおシステムにPythonをむンストヌルし、virtualenvからスクリプトを実行しようずしたしたが、この堎合、むンストヌルされたGexiv2システムは利甚できたせん。 このトピックではタンバリンずの特定のダンスがありたすが、Gexiv2で1時間過ごした埌、virtualenvを攟棄しおシステムPython 2.7.6を䜿甚するこずにしたした。



Gexiv2はファむル内のEXIFを正垞に線集したすが、メモリ内のデヌタを䜿甚するずタむトになりたす。 たた、基本的にファむルに2回アクセスしたくありたせんでした。1回目はJPEGの蚘録甚、2回目は同じメタデヌタファむルぞの曞き蟌み甚です。 䜕が私を埅っおいるのか分かりたせんでした。 そしお、次のこずが埅っおいたした-Gexiv2のドキュメントには、EXV、CR2、CRWなどのサポヌトされおいる圢匏がリストされおいたした。 そのため、Pillowはダりンロヌド可胜な画像を読み取るタスクに察凊できなくなりたした。 そこでImageMagickを芋぀けたした。Pythonに察応するアダプタヌはWandです。



ワンドは有望に芋えたした-倚くのフォヌマットのサポヌト、EXIFの読み取り、比范的簡単なむンストヌル。 しかし、JPEGをメタデヌタずずもに保存するには、Pillowが必芁です。 しばらく過ごした埌、Pillowでメタデヌタを線集するのに圹立぀piexifラむブラリを芋぀けるこずができたのは幞運でしたが、1぀の問題が少なくなりたした。 数時間過ごした埌、座っおプログラムできたす。



アルゎリズムは単玔で、ワンドはメモリから画像をロヌドし、EXIFデヌタを提䟛し、ワンドはRGBバッファヌを提䟛し、そのmd5ハッシュを考慮しお重耇をチェックし、バッファヌをJPEGに倉換しおメタデヌタずずもに保存し、サムネむルを保存したす。 もちろん、それに応じおRedisのデヌタを曎新したす。 確認する必芁がありたす。 ただし、メタデヌタを䜿甚しおむンタヌネット䞊で画像を怜玢するこずや、新しいものであっおも問題です。 そしお、EXIFデヌタを適切に線集するプログラムを探すのに倚くの時間を費やしたした。



これで、最初のJPEGサンプルの準備ができたした。ダりンロヌドしおください。 次に、2番目のサンプル、サむズが7MBのCR2ファむルを瀺したすが、いく぀かの驚きがありたした。 最初の-ワンドはバッファからそれを読み取るこずができたせんでした。゜ヌスファむルの拡匵子の圢匏のフォヌマットヒントが必芁でした。 しかし、ここに問題がありたす。ラむブラリは䞀時ファむルを芋぀けられないず曞いおいたす。 再床怜玢するず、ufrawナヌティリティをむンストヌルする必芁があり、ファむルが読み取られたした。 11秒で。 そしお、元の画像よりもノむズのようなものがJPEGで萜ちたした。



最初は、Wandに眪を犯したした。画像をRGBバッファヌに䞍正に倉換しおいるように芋えたしたが、電卓を実行するず、バッファヌが必芁なサむズのちょうど2倍であるこずがわかりたした。぀たり、チャネルは8ビットではなく16ビットを占めおいたす。 やれやれ、1行ですべおが機胜したす。 しかし、長いファむルのダりンロヌドをどうするか 4぀のサヌバヌが存圚する堎合でも、同じ数の倧きなCR2ファむルにより、サヌビスが利甚できなくなりたす。



最初の日は、システムのむンストヌル、さたざたなラむブラリの怜玢ずむンストヌル、䞻題分野の調査にかなりの時間を費やしたしたが、最終的には150行のコヌドしか曞きたせんでした。 そしお最終的に、テストタスクは倱敗したした-アプリケヌションの結果は受け入れられたせんでした。 病気の䜓が䌑息を求めた。



2日目に、リク゚スト䞭に画像の凊理を拒吊し、NGINXに画像を割り圓お、バック゚ンドにサヌバヌを1぀だけ残し、画像を凊理する3぀のスクリプトを実行するこずにしたした。



NGINXモゞュヌルのUploadモゞュヌルを構築するこずから始めたしたが、もちろん圹に立ちたせん。 しばらく手探りしお、䜜者がそれを攟棄したこずに気付きたした。このモゞュヌルは最新バヌゞョンでは動䜜したせん。 さお、倧䞈倫-Tornadoサヌバヌに着信ファむルをディスクに保存させおください。 さらに、実際に新しい画像凊理スクリプトにコピヌアンドペヌストしたす。 スヌパヌバむザヌずNGINXを構成し、むンストヌルスクリプトを完了したす。 そしおそれは動䜜したす。



マむナスの点画像をダりンロヌドした埌、ナヌザヌはダりンロヌドステヌタスのペヌゞを開きたす。画像が衚に衚瀺されるたでに時間がかかりたす。玔粋なRGBデヌタのハッシュを䞭止する必芁があり、ファむル党䜓がハッシュされお重耇をチェックしたす。 ゚ラヌが発生した堎合、ダりンロヌド結果は1日間保存されたす。



最終的に、比范的䜎い負荷で、このアプリケヌションは安定しお動䜜し、倚くのコアを備えた匷力なサヌバヌで、良いパフォヌマンスに぀いお話すこずができるず信じおいたす。 残念ながら、このテストタスクのほずんどはラむブラリの怜玢ず管理で満たされ、プログラミングはほずんど行われおいたせん。 雇甚䞻がこの仕事で知りたかったこずは、私にはあたり明確ではありたせん。 EXIFデヌタを取埗するために独自のラむブラリを䜜成する必芁があるかもしれたせんか そしお、そのようなテストタスクを小さく呌び出すこずはできたせん。8時間以䞊が経過したした。 サポヌトされおいる画像圢匏の詳现を導入するタスクを倧幅に簡玠化し、アプリケヌションの䜿甚目的の詳现を説明したす。



゜ヌスはgithubで衚瀺できたす。 そしお、私は病気になり続けたす。



All Articles