知っているUnixのコマンドで一番シンプルなものは何ですか? 例えば echo という、stdoutに文字列を出力し true を返す – すなわち常に0の終了コードで終了するシンプルなコマンドがあります。 シンプルな、と言えば yes もそうでしょう。引数なしで実行すると、改行されたyが無限に出力され続けます。

今回はソケットプログラミングについて。 ソケットというのは Unix 系のシステムでネットワークを扱うとしたら、ほぼ必ずといっていいほど使われているもの。 ホスト間の通信やホスト内での IPC など、ネットワークを抽象化したインターフェースになっている。 そんな幅広く使われているソケットだけど、取り扱うときには色々なアーキテクチャパターンが考えられる。 また、比較的低レイヤーな部分なので、効率的に扱うためにはシステムコールなどの、割りと OS レベルに近い知識も必要になってくる。 ここらへんの話は、体系的に語られているドキュメントが少ないし、あっても鈍器のような本だったりする。 そこで、今回はそれらについてざっくりと見ていくことにした。 尚、今回はプログラミング言語として Python を使うけど、何もこれは特定の言語に限った話ではない。 どんな言語を使うにしても、あるいは表面上は抽象化さ
Pythonは、習得が容易で、より大きく複雑なアプリケーションの開発にすぐに適用していけることから、コンピューティング環境に広く普及し、勢いを強めています。ただ、あまりに明瞭で親しみやすい言語なので、ソフトウェアエンジニアやシステムアドミニストレータが警戒を解いてしまい、セキュリティに重大な影響を及ぼすコーディングミスを誘発する可能性はあるかもしれません。主に、初めてPythonを使う人を対象とするこの記事では、この言語のセキュリティ関連のクセに触れます。ベテラン開発者にとってもその特異性を意識するきっかけになればと思います。 入力関数 Python 2に多数存在するビルトイン関数の中で、 input はセキュリティの面で完全に難点です。この関数をひとたび呼び出すと、標準入力から読み込んだものが即座にPythonコードとして評価されます。 $ python2 >>> input() dir
パイプライン は、最近のソフトウェアエンジニアリングにおいて、非常に便利な(そして驚くほど活用されていない)アーキテクチャパターンです。ソフトウェアでデータの流れを制御するためにパイプとフィルタを用いる考え方は、最初のUNIXシェルが作られた1970年代からあります。もしターミナルエミュレータでパイプ” | ”を使ったことがあるなら、”パイプとフィルタ”を活用できていることになります。以下の例を見てみましょう。 cat /usr/share/dict/words | # Read in the system's dictionary. grep purple | # Find words containing 'purple' awk '{print length($1), $1}' | # Count the letters in each word sort -n | # Sort l
そこまでおっしゃるなら、というわけで書いたのが以下。 #!/usr/bin/env python3.2 # -*- coding: utf-8 -*- import sys, os if 'PYTHONIOENCODING' in os.environ: for line in sys.stdin: chars = list(line.rstrip()) print('☆'.join(chars)) else: os.environ['PYTHONIOENCODING'] = 'UTF-8' sys.argv.insert(0, sys.executable) os.execvp(sys.argv[0], sys.argv) …強引さが増してるぞおいwllevalのようなsandbox環境では余計動かないしww http://blog.livedoor.jp/dankogai/archiv
備忘録 - #python3 で sys.std(in|out|err) の encoding を強制するについて C言語の教科書にでも出てきそうなこんな基礎的なスクリプト import sys for l in sys.stdin: print l が動かない!って文句を言いたくなる気持ちは、非常によく理解できる。Unix的なというかC言語的には伝統的かつ完璧なイディオムで、これが正常に動作しないなんてどうかしてる。どんなプログラミング言語でも、Hello Worldの次ぐらいにはこんなプログラムを書いて、IOの使い方を試してみるものだ。 しかしながら、現代はもうUnicode時代なわけで、いや、少なくともPython3はUnicode時代であると定めてしまったわけで、K&R時代ならなんの問題もなかったこんな処理でもエラーになってしまう、そんな時代に我々は生きているのである。 何が問題か
Pythonからコマンドを操るモジュールをsubprocessの使い方を整理してみた。前半はマニュアルをなぞっている http://docs.python.org/library/subprocess.html subprocessはos.system, os.spawn, os.popen, popen2, commandsなどのモジュールに取って代る位置付けだとは知らなかった。マニュアルは読んでみるものだ。コードはreplにコピペすると(Unix的OSなら)動くはず。 準備 import sys,os from subprocess import * コマンドからの出力を捕える 標準出力、標準エラー出力はcommunicate()で perlだと`cmd args` output,_=Popen(['/bin/ls', '/etc/hosts'], stdout=PIPE).commu
5.1 getc()とputc()を用いて標準出力へコピーする import sys while True: c = sys.stdin.read(1) if not c: break sys.stdout.write(c) 5.2 fgets()とfputs()を用いて標準出力へコピーする import sys for line in sys.stdin: sys.stdout.write(line) Pythonにはgetc()/putc()/fgetc()/fput()がないので、ここでは似たような機能で再実装してみた。 サンプル5.1 はsys.stdin.read()を使って、一文字ずつ読み込んでいる。サンプル5.2では、sys.stdinをfor文を使って読み込み、一行ずつ出力している。 5.3 さまざまな標準入出力ストリームのバッファリング方式を表示する 残念ながら、Pyth
1.1 ディレクトリ内の全てのファイルをリストする import sys, os if len(sys.argv) != 2: sys.exit("a single argument (the directory name) is required") try: filenames = os.listdir(sys.argv[1]) except OSError: sys.exit("can't open {0}".format(sys.argv[1])) for filename in filenames: print filename sys.exit(0) Pythonでは、opendir()/readdir()/closedir()を個別に呼び出す必要はなく、os.listdir()だけでファイル一覧を取得することができる。ただし、readdir()と違って、os.listdir(
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く