猫型エンジニアのブログ

プログラム/ネットワーク系の技術関連をまとめたページです 

BaseServerの仕組み

Python上で動作する様々なフレームワークやライブラリを見ていると、よくサーバがつかわれているのがよく見られます。そこで、Python上でサーバがどのように実装されているのかを見てみました。ライブラリのコードを読むと勉強になるといいますが、確かにそ…

WSGIとは

WSGI Servers - Full Stack Python WSGI Servers - Full Stack Python 上のリンクを参照にしました。 Webアプリケーションの構成 一般的な3層モデルのWebアプリケーションは、プレゼンテーション層はWebサーバ(例:Apache)、アプリケーション層はアプリケー…

Ryuのアプリを作る その1

Ryu

上司に「Ryuに何か新しい機能を実装してコミュニティに投稿します」と宣言してしまったために、Ryuで何か新しい機能を実装します。REST経由で設定できるDHCP機能を作成しようと思います。 仕事でよくRyuをいじっているので、動くものを作るだけなくRyuの内部…

カプセル化

Javaやc++に比べると限定的ですが、Pythonもカプセル化の機能を持っています。 _をひとつ先頭に付ける Pythonでは_を先頭に付けた変数や関数はクラスの内部からのみアクセスする、という規則があります。ただしこれは規則というよりは習慣に近く、実際にはク…

Pythonのログ関数の使い方-その2

Level3 リモート端末のファイルにログを出力する # -*- coding:utf-8 -*- import logging logging.basicConfig( # ログレベルを指定 level=logging.DEBUG, # ログの書式を指定 左から時刻、ログレベル、モジュール名、関数名、行数、内容 format="%(asctime)…

Pythonのログ関数の使い方-その1

Pythonの標準ライブラリのlogginモジュールの使い方です。 Level1 ログを書式を指定して表示させる # -*- coding:utf-8 -*- import logging logging.basicConfig( # ログレベルを指定 level=logging.DEBUG, # ログの書式を指定 左から時刻、ログレベル、モジ…

OVSDBの使い方

OVSDBの詳細に関してはRFC7047を参照してください。 スキーマの確認 vswitch.ovsschemaにスキーマの記載があります。以下に一部抜粋しました。 # vi /usr/share/openvswitch/vswitch.ovsschema "sFlow": { "columns": { "targets": { "type": {"key": "strin…

仮想ディスクのフォーマットの変換

KVMで作成した仮想ディスクのフォーマットの変換の仕方です。容量の大きなraw形式のイメージをqcow2形式に変換してみます。 現在のファイルサイズは12Gでraw形式です。 #qemu-img info ubuntu12.04-openvswitch.img image: ubuntu12.04-openvswitch.img file…

Pygameのインストール

Pygameのインストールはソースからコンパイルやパッケージからインストールなど複数の方法があるようです。いろいろ探してみましたが、一番簡単なのはUbuntuを用いる方法でした。 Ubuntu12.04の場合ならば、以下のコマンドで完了します。 # apt-get install …

import済みモジュールの確認

class test_class: def _init_(sele, value): self.value = value >>> import sys >>> import test_modules >>> sys.modules['test_modules'] <module 'test_modules' from 'test_modules.py'> >>> test_modules <module 'test_modules' from 'test_modules.py'> >>> sys.modules {'copy_reg': </module></module>

オブジェクトの名前と値

inspect.getmenbersに関して調べたところ、 inspect.getmembers(object[, predicate])(原文) オブジェクトの全メンバーを、 (名前, 値) の組み合わせのリストで返します。リストはメンバー名でソートされています。 predicate が指定されている場合、 predic…

再帰を用いたループ文

(define (loop n) (cond ((= n 0)(display 'end)) ((display n)(newline)(loop (- n 1))))) > (loop 10) 10 9 8 7 6 5 4 3 2 1 end >

問題1.27〜問題1.29

問題1.27 カールマイケル数はフェルマーテストはパスしますが合成数になりました。 (define (carmichael-test n) (fermat-chrmichael-test n (- n 1))) (define (fermat-chrmichael-test n m) (cond ((= m 0) true) ((= (expmod m n n) m)(fermat-chrmichael…

問題1.24~問題1.26

問題1.24 fast-primeの試行回数に正解はないのですが、ここでは200としています。 比較するのはnが1000近傍の場合と、(1000)^2 = 1000000近傍での処理時間の比較です。そのため、比較結果は試行回数に依存しません。log n^2 = 2log nのため、おおよそ2倍と…

ジェネレータ式

ジェネレータを簡易に生成できるジェネレータ式の使用例です。listからfor文を使ってジェネレータを作成しています。 こういったのを自然に使いこなせるようになるととてもかっこいいのですが… >>> numbers_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> type(…

1.3 高階手続き

1.1および1.2で扱っていた手続きはどれも「引数を用いない」か、「引数としてデータ(数値)」を使用する手続きであった。ここでは「引数として手続き」を用いる高階手続きを扱う。

LVMの設定

CentOSを新規にインストールしたら、/homeにかなり容量が割り当てられていました。インストール後にこれらを/rootに割り当てなおす方法を以下にまとめました。 LVMは使えるようになると、パーティション管理が非常に楽になりとても便利です。 現状の確認 /ho…

gpartedのインストール

CentOS6.4に以下のようにしてgpartedのインストールおよび起動を行いました。 # wget http://sourceforge.net/projects/gparted/files/gparted/gparted-0.9.0/gparted-0.9.0.tar.bz2/download # tar jxf gparted-0.9.0.tar.bz2 # cd gparted-0.9.0 # yum ins…

ディスクサイズ

容量が300GBのqcow形式の場合、7.0GBしか割り当てられていない。 # ls -ahl Controller-1.03-template.img -rw-------. 1 qemu qemu 7.0G 5\u6708 20 11:22 2014 Controller-1.03-template.img容量が200GBのraw形式の場合、200GB割り当てられている。 # ls -…

問題1.21~問題1.23

問題1.21 > (smallest-divisor 199) 199 > (smallest-divisor 1999) 1999 > (smallest-divisor 19999) 7 問題1.22 (define (search-for-primes n m) (cond ((< m n)(newline) 'done) ((timed-prime-test n)(search-for-primes (+ n 1) m)) (else (search-for…

モジュールの読み込み

>>> import itertools >>> app_lists = ['app1', 'app2,app3'] >>> app_lists = [app for app in itertools.chain.from_iterable(app.split(',') for app in app_lists)] >>> print app_lists ['app1', 'app2', 'app3'] >>> type(app.split(',') for app in …

1.2.4~1.2.6

1.2.4 べき乗 べき乗を計算する手続きにおいて、各手続きのステップ数およびスペースの増加に関して4通りが紹介されている。・線形再帰 ステップ・スペースともにO(n) ・線形反復的 ステップはO(n)、スペースはO(1) ・対数的再帰 ステップはO(log n)、スペー…

CentOS6.4のカーネルアップデート(パッケージインストール)

前回のカーネルを新規にコンパイルする方法だととても時間がかかってしまいます。もっとうまい方法がないのかと検索したらありました。 CentOSの標準のリポジトリには3.X系のカーネルはないのですが、代わりにCentOS-Xenのリポジトリを利用する方法です。 # …

CentOS6.4のカーネルアップデート(カーネルコンパイル)

どうしてもCentOS上で仮想マシンの入れ子環境を作る必要があったために、カーネルのアップデートを行いました。カーネルのバージョンを2.6.32-358=>3.6にアップデートするのが目標です。 以下がその際に実施したコマンドになります。make menuconfigでは対話…

問題1.18~問題1.20

問題1.18 (define (double x) (+ x x)) (define (halve x) (cond ((even? x) (/ x 2)) (else 0))) (define (even? x) (= (remainder x 2) 0)) (define (new-times a b ) (times-iter a b b 0)) (define (times-iter a b counter product) (cond ((= counter …

引数の解析

Ryuではoslo.configというモジュールを用いて引数の解析を行っています。manager.pyの該当ソースコードを一部抜粋修正しました。 #test-config.py from ryu import cfg import sys from ryu import version CONF = cfg.CONF CONF.register_cli_opts([ cfg.Li…

問題1.15~問題1.17

問題1.15 問題1.16 (define (expt b n) (expt-iter b n 1)) (define (expt-iter b counter product) (cond ((= counter 0) product) ((even? counter) (square (expt-iter b (/ counter 2) product))) ( else (expt-iter b (- counter 1) (* b product))))) …

アプリケーションモジュール

Ryuのアプリケーションの実体はPythonのモジュール。 モジュール中にryu.base.app_manager.RyuAppを継承したサブクラスが、最低一つは必要になる。 RyuAppの class RestAPI(app_manager.RyuApp): _CONTEXTS = { 'network': network.Network, 'wsgi': WSGIApp…

モジュールとクラス

Pythonでモジュールとクラスの違いです。基本の基本ですが、意外によく分かっていませんでした。 Pythonにおけるモジュールとクラスの違い モジュールはファイルからなり、モジュール中にクラス・メソッド・定数などが定義されている。要するにクラスはモジ…

問題1.9~問題1.15

問題1.9 以下のように前者の式は再帰的プロセスであり、後者の式は反復的プロセスとなる。 この場合も再帰的な手続きのプロセスが、再帰的とは限らない例である。 (+ 4 5) (inc (+ 3 5)) (inc (inc (+ 2 5))) (inc (inc (inc (+ 1 5)))) (inc (inc (inc (inc…

1.2.1~1.2.3

1.2.1 線形再帰と反復 階上計算を行う2つの手続きが紹介されている。 ・線形再帰的プロセス:計算に遅延演算の列を使用するプロセス ・線形反復的プロセス:計算にプロセスを完全に記述する状態変数を使用プロセス 手続きとプロセスは明確に異なる。ここで紹…

問題1.6~問題1.8

問題1.6 (if ⟨predicate⟩ ⟨consequent⟩ ⟨alternative⟩)において、predicateが真ならばconsequentを評価し、predicateが偽ならばalternativeを評価する。 つまり、consequentとalternativeは必ずどちらか片方しか評価されない。しかしnew-ifの場合、consequen…

1.1.7~1.1.8

1.1.7 例:Newton法による平方根 数学の平方根の関数:平方根の定義を与える。(ありようの記述) 計算機科学の平方根の手続き:平方根の計算方法を与える。(なし方の記述) 数学では通常平叙文的(対象が何か)であり、計算機科学では通常命令文的(対象を…

問題1.1〜問題1.5

問題1.1 略 問題1.2 略 問題1.3 > (define (problem1-3 a b c) (cond ((and (>= b a) (>= c a)) (+ (* b b) (* c c))) ((and (>= a b) (>= c b)) (+ (* a a) (* c c))) ((and (>= a c) (>= b c)) (+ (* a a) (* b b))))) > (problem1-3 1 3 5) 34 > (problem…

Ryuの起動プロセス

ryu/cmd/manager.pyのmain関数を読んでみました。 以下のように、ソースコードの一部分のみの実行も簡単にできるので、Pythonは本当に楽です。 >>> from ryu import utils >>> import inspect >>> import itertools >>> from ryu.base.app_manager import Ap…

ryu / ryu / lib / addrconv.py

ライブラリ中のパケット関連のクラスの中によく使用されています。実際にやっていることはライブラリのnetaddrのラッパです。 実行結果 提供されているAPIを実行してみました。 名前の通り、アドレスのバイナリとテキスト表示の変換を行います。 >>> from ry…

1.1.4~1.1.6

1.1.4 合成手続き defineにより合成手続きに名前を付けることができる(前回は数や演算結果に名前を付けていた)。 一度defineで定義された場合、ユーザ定義の合成手続きと、解釈系にあらかじめ備わっている基本演算子の区別はつかない。合成手続きのbodyに…

SICP 勉強メモの目次

コンピュータ関係の書籍の中では、著名な計算機プログラムの構造と解釈を読み進めていきます。昔は書籍版しかなかったのですが、今ではWebで公開されていてとても助かります。 昔院生の時に読みましたが、挫折したもののリベンジです。大学院から情報系に進…

1.1.1 ~ 1.1.3

1 手続きによる抽象の構築 抽象化は、一般的に計算機科学においては対象に関する詳細を捨象すること(Wikipedia) 1.1 プログラムの要素 抽象化:合成物に名前をつけ、単一のものとして扱う。 例: 一番単純な抽象化は、defineを用いて、名前と数の対応付け…

Eventletの使い方(サーバ版)

前回はクライアント版のプログラムで並列化されているのを確認したので、今度はサーバ側のプログラムを作成してみます。 サーバプログラム import eventlet def handle(clientSock, clientAddr): data = clientSock.recv(1024).strip() clientSock.sendall(d…

Eventletの使い方(クライアント版)

PythonのモジュールEventletを触ってみます。並列プログラミング難しいです。基本的にここを参照しています。 とりあえず触ってみる ネットワークを介しての問い合わせはIO処理に時間がかかっているはずです。そのためGETメソッドを逐次処理する場合と、even…

MacBook AirにSICPの環境構築

MacでもSICPの勉強をしたいので、環境構築の仕方についてまとめました。 DrRacketのダウンロード ここからDrRacketをダウンロードしてきます。以前はDrSchemeだったのに変わってしまったのですね。SICP用の環境設定がうまくいきません。どうしたらいいんだろ…

並列処理の用語

Pythonのソースコードを読んで理解する必要があるので、はじめてまともに向き合いました。今まで並列処理が必要になったことなどないので、本当に手さぐり状態です。ライブラリのドキュメントを読んでいても書いてある意味が分からないので、この分野で使わ…

Ryuのソースコード解読メモ

オブジェクト指向のプログラムなので、アプリケーションを作成するプログラマが把握する必要のあるメソッドと、裏で動作するためユーザが意識する必要のないメソッドが混ざっている。比率としては、圧倒的に後者の方が多い。プログラマが把握しているのは氷…

同期処理と非同期処理

それぞれの違い 同期処理では、あるタスクが実行している間、他のタスクの処理は中断される方式です。非同期処理は、あるタスクが実行をしている際に、他のタスクが別の処理を実行できる方式になります。 メリット・デメリット 同期処理の場合は、時間がかか…

Ryu関連のドキュメント

Ryuのソースコードです。何はともあれ、これがないと始まりません。 https://github.com/osrg/ryu日本語で非常に丁寧に書かれています。まず初めによむならこれが一番です。 http://osrg.github.io/ryu-book/ja/Ryubook.pdfRyuのアーキテクチャ全般に関する…

memo

TO READ http://methane.github.io/gevent-tutorial-ja/

WSGIのお勉強 その2

WSGIに準拠したWebアプリケーション例 このページを参考にしました。 #wsgi-test1.py def application(environ, start_response): start_response('200 OK', [('Content-type', 'text/plain')]) return 'Hello, world' from wsgiref import simple_server if…

本物のプログラマかどうかの分岐点

最近Ryuのソースコードを読んでいるのですが、「Ryuのソースコードを読む」というよりも「Pythonのモジュールの使い方を読む」ことの方が多く、ちょっと意外でした。 しかし、既存のモジュールを組み合わせただけで複雑な機能が実装できると考えると、実装の…

vyattaの設定

たまに扱うvyattaの設定のメモです。こちらに詳しい設定情報が記載されています。 IPアドレスの割り当て $ configure [edit] # set interfaces ethernet eth1 address 192.168.10.254/24 [edit] sshの有効化 # set service ssh [edit] # commit [edit] # sav…