Pythonでソケットのバッファサイズを変更する

バッファサイズを変更する。
コードは以下の通り:

# -*- coding: utf-8 -*-                                                                                                                                                                            
import socket


def modify_buf_size(send_buf_size=1024, recv_buf_size=1024):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    bufsize = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)  # 送信バッファサイズの取得                                                                                                     
    print 'SEND Buffer size [Before]:%d' % bufsize
    bufsize = sock.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)  # 受信バッファサイズの取得                                                                                                     
    print 'RECV Buffer size [Before]:%d' % bufsize

    # バッファサイズの変更                                                                                                                                                                         
    sock.setsockopt(
        socket.SOL_SOCKET,
        socket.SO_SNDBUF,
        send_buf_size)
    sock.setsockopt(
        socket.SOL_SOCKET,
        socket.SO_RCVBUF,
        recv_buf_size)

    bufsize = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
    print 'SEND Buffer size [After]:%d' % bufsize
    bufsize = sock.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)
    print 'RECV Buffer size [After]:%d' % bufsize


if __name__ == '__main__':
    modify_buf_size(send_buf_size=4096, recv_buf_size=4096)

実行結果は以下の通り:

bash-3.2$ python bufsize.py 
SEND Buffer size [Before]:131072
RECV Buffer size [Before]:131072
SEND Buffer size [After]:4096
RECV Buffer size [After]:4096

Beforeの欄の値は環境によって変わるはず。

Macでコマンドを使ってパスワード付きzip圧縮ファイルを作成する

Unix系のOSならたぶんできる方法。
手順は以下の通り:

  1. ターミナルを開く
  2. ファイルの場合、「zip -e 圧縮後のファイル名 圧縮したいファイル名」と打ち込む。

 ディレクトリの場合「zip -e -r 圧縮後のファイル名 圧縮したいディレクトリ名」と打ち込む。

  1. 設定するパスワードを聞かれるので、同じパスワードを2回入力する

Pythonでパスワード付きのzipファイルを解凍する

Pythonでzipファイルを解凍する - 珠玉の誤訳で、Pythonでの単純なzipファイルの解凍方法を書いた。
今回はパスワード付きのzipファイルの解凍方法について書く。
とはいっても、基本的には同じ。コードは以下の通り。

import zipfile


def unzip_with_pwd(filename, path='.', pwd=''):
    with zipfile.ZipFile(filename, 'r') as zip_file:
	try:
            zip_file.extractall(path=path, pwd=pwd)
            print 'extraction is successful!'
        except:
            print '%s is wrong password!' % pwd


if __name__ == "__main__":
    unzip_with_pwd(filename="test.zip", pwd="nya")

謝ったパスワードに対しては、例外処理で対応している。

Pythonでzipファイルを解凍する

Pythonでのzipファイルの解凍は、zipfileを使うだけで簡単にできる。

import zipfile


def unzip(filename, path='.'):
    with zipfile.ZipFile(filename, 'r') as zip_file:
        zip_file.extractall(path=path)

if __name__ == "__main__":
    unzip("test.zip")

単純にやっているだけ。
事前に中身のチェックを入れるた方がいいかもしれない。

django.contribってなんなの?

Djangoをいじっていると、importするときによく出てくるdjango.contrib。
気になったので、調べてみた。

Djangoの標準ライブラリ

Chapter 16: django.contribを見ると、どうやらdjango.contribはDjangoの標準ライブラリのようだ。
機能別にサブパッケージにまとめられている。
以下のパッケージから構成されているようだ:

  • admin
  • admindocs
  • auth
  • comments
  • contenttypes
  • csrf
  • databrowse
  • flatpages
  • formtools
  • gis
  • humanize
  • localflavor
  • markup
  • redirects
  • sessions
  • sitemaps
  • sites
  • syndication
  • webdesign

各パッケージの日本語での簡単な説明は、
http://www.djangoproject.jp/doc/ja/1.0/ref/contrib/index.html
にあった。

gisとadmindocsの説明だけ日本語ではなかったので英語を訳す。
admindocsは、DjangoのAdminサイトのためのドキュメント自動生成のパッケージ。
gisは、Geographic Information Systemsの略。地理情報システムをサポートするためのパッケージ.

PythonのWebアプリケーションフレームワークについてまとめる

PythonのWebアプリケーションフレームワークについて簡単に紹介してみる。
WebFrameworks - Python Wikiを参考にした。


Bottle(ボトル)
http://bottlepy.org/

Bottleは高速でシンプルなフレームワーク
URLパラメータによるリクエストディスパッチ、テンプレート、key/valueデータベース、組み込みのHTTPサーバ、サードパーティWSGI/HTTPサーバとテンプレートエンジンへのアダプタを提供している。
すべてが「bottle.py」という一つのファイルの中にあり、依存性がない。


CherryPy(チェリーパイ)
http://www.cherrypy.org/

CherryPyはPythonicでオブジェクト指向なHTTPフレームワーク。


Django(ジャンゴ)
http://www.djangoproject.jp/

人気のあるフルスタックのWebフレームワーク。
Webアプリを高速かつ、少ないコードで開発することができるようだ。


Flask(フラスク)
http://flask.pocoo.org/

Werkzeug(WSGIユーティリティライブラリ)、Jinja2(テンプレートエンジン)を基にしたマイクロフレームワーク


Pylons(パイロンズ)
http://www.pylonsproject.org/

柔軟性と迅速な開発に重きを置いた、軽量なWebフレームワーク。


Pyramid(ピラミッド)
http://docs.pylonsproject.org/projects/pyramid/en/latest/

小さく、高速で、堅実なオープンソースのWebフレームワーク。


Tornado(トルネード)
http://www.tornadoweb.org/en/stable/

オープンソースのスケーラブルでノンブロッキングなWebサーバ。


TurboGears(ターボギアーズ)

【wxPython】フレームの作成

フレームは代表的なウィンドウオブジェクトです。
以下のコードでは「Test Frame」と言う名前の最小限の空のアプリケーションウィンドウが表示されます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wx


class MyApp(wx.App):
    def OnInit(self):
        self.frame = MyFrame(None, title="Test Frame")
        self.SetTopWindow(self.frame)
        self.frame.Show()
        return True


class MyFrame(wx.Frame):
    def __init__(self, parent, id=wx.ID_ANY, title="",
                 pos=wx.DefaultPosition, size=wx.DefaultSize,
                 style=wx.DEFAULT_FRAME_STYLE,
                 name="MyFrame"):
        super(MyFrame, self).__init__(parent, id, title, pos, size, style, name)
        self.panel = wx.Panel(self)
        
if __name__ == "__main__":
    app = MyApp(False)
    app.MainLoop()

同じことは以下のコードでもできます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wx

app = wx.App()
frame = wx.Frame(None, -1, "Test Frame")
frame.Show()
app.MainLoop()

実行すると、以下のように表示されます。
f:id:hiron_tn:20140721083758p:plain

どのように動くか

フレームは最も重要なコンテナウィジェットで、他のウィジェットを含むことができます。
上記のクラスで大事なことは、フレームの子供としてパネルオブジェクトを作成したことです。
パネルは他のウィジェットを含むことができます。


まず、OnInitメソッドの中でフレームのインスタンスを作ります。そのとき最初のパラメータとして「None」を渡しています。これはフレームの親ウィンドウを指定するために使われます。「None」は親を持たないことを示しています。また、2番目のパラメータとして「Test Frame」を渡しています。これはウィンドウのタイトルを指定しています。

次に、SetTopWindowメソッドを呼んでいます。これは新しく作ったMyFrameインスタンスをアプリケーションのトップウィンドウとしてセットするために呼んでいます。

最後にフレームに対して、Showメソッドを呼んでいます。これによりフレームを表示します。