【Python】ログを読み取りやすく作る長期にわたって動かすプログラムを運用する際ログは重要です。ログがないと何が起こったかもさっぱりわからず想定しない動作の対応もとても困難です。そんなわけでログを作るわけですが、ただファイルに記録を書きだすだけならログ機能なんて使わず、ファイルの書き込み機能だけで十分です。Pythonのログ機能にはログを書きこむ際にあらかじめ用意された変数の様なものがあり、それを用いることで労せず情報の濃いログを作れます。やることはログフォーマットの指定です。一度書きだされるログの形式を定めます。フォーマットは次のようにロガーに渡します。dt.now().date()))handler.setFormatter(logging.Formatter(FORMAT))logger.addHandler(handler)上の様に好きな文字列をフォーマットとしてロガーに渡せます。この時のasctimeやmessageの様な%()sとprintf的に定義されている部分にログ書き込み時の状況に応じた値が書き込まれます。属性として次の部分にまとめられています。多くの人が凝ったロギング機能をGitHubやpypiで公開してくれていますが、どうにも必要な分が足りない時には自作する必要が出てきます。大体、スレッドやプロセスの分岐とどこからどこまでが一連の流れか、一連の流れであることをどう示すか、外部サービスとの連携ログはどうするか、とシステムに特化した部分を考え出すようになると自作した方がお得です。(1)2210月,20190著者:杉浦.envファイルの読み方色々.envは環境変数を定義するファイルとしてよく使われているファイル名です。この記事はいくつかの言語、フレームワークにおける.envの読み方の紹介をします。今どきの環境は.envがあることを前提として作られている機能があります。PHPのフレームワークであるLaravelやJavaScript実行環境であるNode.jsです。PHP_VERSION=${PHP_VERSION}AltJSをコンパイルする環境ならば特定の接頭辞の環境変数を定数をあてはめる形で実装されていることが多いです。process.env.MIX_VERSION;Pythonの様にdotenvというパッケージがある場合もあります(Rubyもそうらしい)。環境変数から値を取得ちょっと手間ですがbashの中で読むこともできます。【Python】対話型アプリケーション自動化ツールPexpectの紹介Linux端末などにアクセスしてコマンドライン上で操作を行うことはよくあります。何かの作業で定型化した操作を行うこともままあります。Pexpeectでコードを組むと自動化処理を作れます。PexpectはLinuxコマンドのexpectの様なことをするPythonモジュールです。documentation接続コードはシンプルです。使うだけなら次のコードで大丈夫ですが、gitやら何やらに上げると大惨事です。passwordは設定ファイルなり実行時の引数なりで渡すようにしましょう。documentationとりあえずの作りなら対話は次の様になります。コマンドを送る、入力可能状態になるまで待つ、の繰り返しです。コマンドを送るあくまで対話なので対話先で改めて対話先のローカル線用対話プログラムを開始することもできます。いうかかなり広範囲のことができます。Linuxを深く知らない自分の範囲では何でもできるぐらいの感じです。Pexpectはコマンドライン上のプログラムのテスト、サーバやマイコン設定のデプロイ、ncとか使ってペネトレーションテストなど様々な使い道があります。documentationにはプログラムとしてほぼ完成の状態の例があるのでそれを改造すると理解が早まり、すぐ実践ができます。【Python】誤った引数に値を渡さないためのキーワード引数キーワード引数は造語という程ないにしろ正式な語ではありません。可変長引数の一種です。ググれば多く出るのでそう間違いでない通称の一つです。長大な引数の関数を用いる際、時々引数の順や数え間違いで事故が起こります。何かしらの構造体を使うのが一つの解決策です。構造体中に引数への正しい接続を埋め込み、使用する際には簡単にするAdapterパターンは構造体を用いる接続方法の典型的な解決策の一つです。使いたい関数hogeMember。'bar',...)と大量の引数を正しい順序で用意することになる。何度も繰り返したり、変更が行われればミスが起きる。Member();として初期化した後に、$member->name='tarou';などと名前毎にプロパティをセット、$member->callHogeMember()とすることで誤りなくhogeMember()を呼び出せる。}}ですが、ただ誤りなく関数を呼ぶためだけのオブジェクトは無駄な気がしてしまいます。パラメータが疎な時はなおさらです。キーワード引数はそういった問題を解決します。Pythonのキーワード引数は例えば次の様に使います。↑と同じ結果になる値に名前をつけて関数を呼ぶことによって、対応したキーの引数に値が渡せます。大体のライブラリは適切にキー名をつけてくれています。キーワード引数を用いることによって、わざわざ準備することなく適切に多様な引数を持つ関数を呼び出せます。【Python】PowerPointのファイルをpythonで作るpython-pptxの紹介Pythonは様々なライブラリを組み合わせて、多様な作業をプログラミングできます。pptxファイル(PowerPointのファイル)の作成も、またできます。python-pptxはこれを実現します。documentation何ができるかはpptxファイルの構造を知ると少しわかりやすいです。pptxファイルはその実zipファイルと同じ形式です。pptxをzipに変えると例えば、次の様になります。pptxファイルとは特定のファイル構造のファイル群を圧縮したzipファイルのことであり、zipファイル⊃pptxファイルとなっているわけです。この中から、どのページに、どのテンプレートが使われて、テンプレート中のある空欄に、何が、どう埋まっているか、が読み取れます。python-pptxではこの構造の指定に従ってページを構成していきます。テンプレート構造から細かく作っていく方法はGUIからpptxを作る場合、おそらくあまりしないでしょう。必然python-pptxは普段使いからかけ離れた理解の難しいものになります。いった際にはpython-pptxを用いたhogehogeな関数を作った、というwebページを探すとよいでしょう。python-pptxは例えば、次の様に記述できます。'上部の検索ボックスに検索対象の語を入力し、検索ボタンを押すことで検索ができます。\nいずれの検索画面でも同様に検索ができます。slide上記のコードはtemplate.pptxというテンプレートに従ってpptxファイルオブジェクトを生成。それに画像を追加して保存する、というコードになります。これだけでも画像を更新する度にpythonを走らせるだけでpptxを更新できます。特定の形式のpptxを高頻度で変更する場合、多少わかりにくくともpptx生成をプログラミング化すると作業が大きくはかどります。SoupとSeleniumPythonは次の標語にある様に、様々なことを簡単なコードで実現することが主目的の言語です。この目的は、多様なライブラリの中から目的に沿ったライブラリを呼び出す、という方法で実現されています。Python.orgこの記事では3種類のHTTP通信用ライブラリを目的別に紹介します。ひとつはRequestsです。documentationRequestsはとても簡易なHTTP通信用ライブラリです。次の様にパラメータと宛先を用意してメソッド指定するだけで動きます。これはAPIが用意してある様な、GUIを用いないことを想定している相手との通信で有効です。これはHTMLを始めとした構文解析を活用することができます。大体Requestsと組み合わせて静的なwebページを扱う時に使います。ブラウザを介さないため後述のSeleniumより遥かに高速です。u'head'3つ目はSeleniumです。webページのテストでよく使うものでPythonにも用意されています。ブラウザを介する正式な手順を踏むことによってセキュアなページでも手間取ることなくアクセスできます。代わりにブラウザを介する分けっこう重いです。任意の関数の出力値が最大、もしくは最小となる引数は何か、という問題です。任意の関数が単純な形、例えば次の図の様なきれいな谷の場合は解を陽に求める(試行することなく一発で求められる)ことが出来ます。現実の問題はもっと複雑です。引数は多く、関数の出力は多峰性を持ちます。それでもとりあえず関数と引数さえ用意できれば(深く取り組むなら関数を考えること、関数を作ることに相当労力がかかります)、関数の出力を評価することはできます。今日まで考えられてきた機械学習手法はより正確な関数を用意し、より早くに正確に最大、最小となるパラメータを見つけるためのものです。この記事で考えるのは、より早くに正確に最大、最小となるパラメータを見つける、という部分を無視し、単純な乱数で最大、最小に近づく方法です。なにか値を引っ張ってくる。具体的な関数の中身は書いていませんがこれを拡張すると機械学習らしいことができます。最終的に最も良いものを選んでいますが、このままだと引数がランダムなので学習感ないですね。Webhookとライブラリslackwebを繋げることでとても楽にSlackへ通知を送ることが出来ます。どのくらい簡単かというと次のコードで実装できるくらいです。設定を追加で移動した画面からインテグレーションの追加を押すと、URLが発行されます。後は先のコードの様に通知を送るだけです。(1)123月,20190著者:杉浦Pythonのグローバル変数の命名における慣習Pythonはファイル全体をスコープとした記述が出来、例えば次の三行だけのファイルを動かせます。World!')print('---')インタプリタらしく一行一行コマンドを読み込み、実行していく感じです。この一行一行がくせもので必ずファイル全体をスコープとしたグローバル環境にコードを記述する必要があります。関数を定義して呼び出す際、最後はグローバルから呼び出すことになります。World!'hello_world()この仕様によるグローバル汚染を防ぐためにPythonにはいくつか慣習があります。実行ファイル以外のコードが不意に走ることを防ぐためのif文があります。hello_world()同じ様にグローバル変数には命名の慣習があり、ローカル内で誤ってグローバル変数を参照することを避けます。内容はいたってシンプル、先頭の_です。print(_msg)この様にすることで複数ファイルを連携させた際に参照したい変数、参照したくない変数を操りやすくします。この慣習は根付いており、Python実行ファイル上において_hogeな変数とfugaな変数は同等に扱われるにもかかわらず、IDE等のPython対応のエディタにおいて_hogeな変数はグローバル変数用の扱い、fugaな変数はローカル変数用の扱いと区別されます。(0)12月,20190著者:杉浦Pythonのrequestsでmultipart/form-data形式通信を行うmultipart/form-dataは文書、ファイル、またはバイト列の性質や形式を示す標準の一つです。multipart/form-dataは複数の部分から成るHTMLフォームのデータです。#multipartform-datamultipart/form-dataはごちゃまぜの種類のデータをまとめて送る時に便利です。これをどうやって使うかですがJavaScriptならば描画しないフォームを作り、それを送ることができます。次のコードはある画像ファイルとその画像ファイルの加工データを送信するのコードの一部です。JavaScriptはHTMLを扱う機能が数多く備わっており、フォーム形式の通信もJavaScript単独でパパっと書けます。'通信に失敗しました。';});pythonにはrequestsというHTTP通信用ライブラリがあります。これは人間に優しいを謳い文句にするくらい簡単に動かせることが特徴です。どのくらい楽かというと次の読みやすいインデント、改行の10行ないコードだけのファイルでpostを投げられるくらいです。params=request_data)print(response)便利なrequestsでmultipart/form-dataで送る方法を調べたところ次のコードで実現できました。files=files)print(response)filesの様に色々形式毎の引数を用意して渡せば、まとめてよしなに送信してくれます。Playerに頻繁にクラッシュする不具合が発生。現在修正済みで公開待ち状態。