8年ほど勤務した株式会社ビープラウドを退職しました。
11月から株式会社オープンコレクターに入社します。 www.open-c.jp オープンコレクターという会社は、もりよしが代表で1人の組織でしたが、私とあおだぐが新しく加わって3人になります。
開発や技術支援の案件あればご相談ください。
8年ほど勤務した株式会社ビープラウドを退職しました。
11月から株式会社オープンコレクターに入社します。 www.open-c.jp オープンコレクターという会社は、もりよしが代表で1人の組織でしたが、私とあおだぐが新しく加わって3人になります。
開発や技術支援の案件あればご相談ください。
Pythonのsubprocessモジュールでサブプロセスを実行するときに、親プロセス側で開いたファイルのファイルディスクリプタを渡す方法。
subprocess.Popenのpass_fds引数を指定すると、指定したファイルディスクリプタは閉じられないようだ。
試したPythonのバージョンは3.5。
send_fd.py:
import sys import subprocess # ファイルを開く(readで全部読まれるのを避けるのでバッファをOFFにしとく) input_file = open('spam.txt', 'rb', buffering=0) # ファイルディスクリプタを取得 fd = input_file.fileno() # 5バイト読む print('send_fd: ', input_file.read(5)) # receive_fd.pyに引数でFDを渡して子プロセスとして実行 process = subprocess.Popen( [sys.executable, 'receive_fd.py', str(fd)], pass_fds=[fd]) # プロセスが終了するまで待つ process.wait() # ファイルを閉じる input_file.close() print('end')
receive_fd.py:
import os import sys # 引数で渡されたFDを取得 fd = int(sys.argv[1]) # FDからファイルオブジェクトを作る input_file = os.fdopen(fd, 'rb') # 最後まで読み込んで表示 print('receive_fd: ', input_file.read()) # ファイルを閉じる input_file.close()
spam.txt:
Hello World!
tokibito@ubuntu:~/sandbox$ python3.5 send_fd.py send_fd: b'Hello' receive_fd: b' World!\n' end
親プロセス側で5バイト読んで、子プロセス側で残りを読んでいる。
PyConJP 2016に参加してきました。 スピーカーとして、トーク1つ、ビギナーセッション1つ、オープンスペース2枠で話してきました。
ビギナーセッションは、講師の応募がなかったそうで、お願いされたのを引き受けて話しました。
www.slideshare.net os.path、this、antigravityモジュールのコードを読んでみましょう、というものです。Pythonコードの追いかけ方、pdbの使い方について話しました。 資料は6ページしかないですが、画面上で実際に操作しながら説明しました。
CfPを出して採用されたので話しました。
www.slideshare.net GitHub - tokibito/soloftpd: FTP server application. www.youtube.comオープンスペースは、1日目の午後の時点では、2日目の枠が半分ほど埋まっていたのですが、1日目はスカスカでした。
なにかやろうと思い、過去にブログに書いたネタを引っ張り出してきてやってました。
dulwichモジュールでgitリポジトリを読んでみたり、それをgitのサブコマンド化したりしてました。 tokibito.hatenablog.com
2日目でもオープンスペースの枠が埋まりきっておらず、空いてたので話しました。
今回はネットワーク周りの初心者向けのセッションはなかった?みたいだったので、socketでHello, world!でもやってみようと思い、話してました。
PythonのsocketモジュールでHello, world! · GitHub
こちらは5,6人ほど来てくれて盛り上がってました。
サーバーを起動してngrokを使ってインターネットからアクセスできるようにし、参加者からメッセージを投稿してもらったりしていました。 コードを変更して、HTTPのレスポンスを返すようにしてみたりもしました。
普段システムやアプリケーションを作るのに、どういう手順でやるっけかなーというのを書き出してみた、というものです。
必ずしもこの通りにすればうまくいく、というものではなく、一例だと考えてください。
大雑把に次のような流れになります。
各工程で、アウトプットしたものを後工程で使ったりします。
システムやアプリケーションに限らないですが、そもそも何をするのか決めていないと、始まらないので、やりたいことをまとめます。
システムが解決したい課題は何か、文章や図でまとめます。
次のようなことを書き出してみればいいです:
この工程でのアウトプット:
ポイント:
前工程で何をしたいのかを明らかにしたので、システムが扱う部分をもう少し具体的にします。
次のようなことを書き出してみればいいです:
この工程でのアウトプット:
ポイント:
前工程で機能と入出力を明らかにしたので、この工程では具体的にどうやって作るのかを考えます。
機能、入出力をつないで、1つのシステムとして整合性のとれた状態にする必要があります。
次のようなことを書き出してみればいいです:
この工程でのアウトプット:
ポイント:
前工程の設計に従い、システムの実装、構築をします。
設計が適切であれば、実装は楽に進められます。
この工程でのアウトプット:
ポイント:
実装が終わったら、最後に要件や仕様を満たしているのか、確認(試験)をします。
試験の方法は、要件と仕様を元に、試験項目書を作ってテストしたり、ざっくり動かしてみて問題なかったらOKとしたり、プロジェクト毎に異なります。
試験の結果、問題がある場合は修正して再試験します。問題がなければこの工程は終了します。
この工程でのアウトプット:
ポイント:
試験が完了したら、システムは完成となります。
必要であれば利用者向けのドキュメントを作成したり、納品物にまとめたりします。
企画、要件定義→仕様策定→設計→実装→試験、という流れになります。
書いてから思ったけど、ウォーターフォール・モデルですね、これ。
自分の中で、開発の手順を意識できていれば、次に何をすればいいのかわからず戸惑う、という状況は減るのではないかと思います。
記事中のイラストは、いらすとやのものを使ってます。
ngrokはNATやファイヤーウォール以下にあるローカルサーバーを、インターネット越しにアクセス可能にしてくれるサービス。 便利だよと教えてもらったので、試してました。
無料版の機能はアカウント登録等不要で、ngrokコマンドをダウンロードして実行すると、すぐに使えました。 ngrokコマンドは依存ライブラリ等なしの単一バイナリで、Windows, MacOSX, Linux用のものが配布されています。
お試しなので、とりあえずPython3に組み込みのhttp.serverを使ってみます。
$ python3.5 -m http.server
カレントディレクトリにはindex.htmlを配置済み。これでlocalhostの8000番ポートでHTTPサーバーが起動します。 このサーバーをngrokで外部から接続できるようにしてみます。
localhostの8000番ポートをhttpで公開するのであれば次の通り。
$ ngrok http 8000
起動すると、ngrokのサービスのサーバーと、公開対象のサーバーにクライアントが接続し、「bf9fddc6.ngrok.io」のようにドメイン名が割り当てられます。 表示されたURLにWebブラウザ等で接続すると、対象のサーバー(この例だとPythonのhttp.server)につながります。
開発中のWebアプリなどを、ちょっと外部に見せたりするのに便利そうな感じですね。 有料プランだとカスタムのドメインを使えたりするそうなので、そのあたりも試してみたいところです。
英語ドキュメントが整備されていて、使い方もわかりやすかったです。
ちなみに「えん-ぐろっく」と読むらしい
Raspberry Piを買ったのはかなり前だったりするんですが、放置してたのを動かしてみました。
とりあえずはLチカ
main.py
from RPi import GPIO import time def main(): GPIO.setmode(GPIO.BOARD) GPIO.setup(12, GPIO.OUT) try: state = True while True: GPIO.output(12, state) time.sleep(1) state = not state finally: GPIO.cleanup() if __name__ == '__main__': main()
$ sudo python main.py