you21979の日記

実験ネタとか。仮想化とかnodejsで嵌った所とかおもしろかったところとかいろいろ

python

テンプレートエンジンいまだにgenshi使ってるけど

djangoのほうがよいのだろうか。

 

外部DSLのコード生成に何使うか再検討してるので。。。

あとでコード書いて試してみよう

 

#ぱいそんは俺俺ツールとクローラ以外作ったことないからあまりモジュール詳しくない

おれ、djangoがsupportしてくれればpython3にいけるんだ。。。

xmlとtemplateエンジンとwindows用のexe化あればpython3へ。。。

リアルタイムサーバーでのリソース管理

nodejsで大量のオブジェクトを管理する方法

WEB系のPHPerの人は意外にしらないようなので普通のサーバーアプリケーションのリソース管理方法を記載してみる

下のようにシングルトンのマネージャを作成しマネージャ経由でオブジェクトを生成する

削除もマネージャ経由でやる

この方法だと10000個くらいは管理できる

100000個以上管理するなら自前でハッシュを実装したほうが幸せかも

なぜならdeleteのとき100000個中の一個消すとくっそ遅いから。

var util = require('util');
var events = require('events');
var cls = function(){
    this.n = 0;
    this.h = {};
};
util.inherits(cls, events.EventEmitter);
cls.prototype.fire = function(){
    this.emit('fire');
};
cls.prototype.create = function(){
    var w = new X(++this.n);
    this.h[w.id] = w;
    return w;
};
cls.prototype.delete = function(w){
    delete this.h[w.id];
    w.finalize();
};
cls.prototype.lookup = function(id){
    return this.h[id];
};
var Singleton = (function(){
    var instance = null;
    var getInstance = function(){
        if(instance !== null){
            return instance;
        }
        instance = new cls();
        instance.setMaxListeners(10000);
        return instance;
    };
    return {
        instance : getInstance,
    };
})();
var X = function(id){
    this.initialize(id);
};
X.prototype = {
    initialize : function(id){
        this.id = id;
        this.cb = function(){
            console.log("hoge %d",this.id);
        }.bind(this);
        Singleton.instance().on('fire',this.cb);
    },
    finalize : function(){
        Singleton.instance().removeListener('fire',this.cb);
    },
};
var w = Singleton.instance().create();
var p = Singleton.instance().lookup(w.id);
Singleton.instance().delete(p);

※lookupいらないならハッシュで管理する必要ないけどサーバだとあったほうが便利。

サーバーまたぐときIDベースでやり取りできるし。

freenasのvirtioドライバ

freebsdのvirtioドライバはぐぐってみつけたのだけど

http://people.freebsd.org/~kuriyama/virtio/

shellからpkg_addコマンドでインストールしても再起動すると元に戻るようだ

 

どうにかして入れられないものだろか

 

関数型慣れてきた

というか

オブジェクト指向言語オブジェクト指向じゃないものが

だいたい関数型パラダイムなんだなぁ

C言語のマクロとかで関数合成みたいのやってたし

ファイバーとかマイクロスレッドとかの継続はモナドの一種だし

デザインパターンモナドだし

 

オブジェクト指向でやってる人がストラテジパターンとか拒否反応示す人いたりするし

そういった場合は関数型のパラダイムでもあったりするだなぁ

 

node.js

node.js触ってて職業プログラマが仕事で触るにはまだ早いかもなぁと思ってしまう。

 

以下の2つを何かの言語で習得してないならnode.jsはきついと思う

リアルタイムプログラミング

ネットワークプログラミング

 

オンラインゲームを支える技術を読んで理解できるなら

node.jsの習得に必要な技術を持ってることになる

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

 

これとjavascript勉強すればnode.jsが自動的に使えるようになる。

JavaScript 第6版

JavaScript 第6版

 

オンラインゲームを支える技術が理解できないなら今はまだきついと思う。

(リアルタイム通信フレームワークがないので)

 

まあ、こんなどうでもいいこと書いたのは単にamazonの商品紹介機能がはてなブログにあったから試してみたかっただけなんだけども。

 

KVMでデスクトップ仮想化でやったことリスト

UBUNTU12.04の場合

grub

 kernelパラメータの設定

  IOMMUを使えるようにする

  /etc/default/grub

  GRUB_CMDLINE_LINUX="amd_iommu=on iommu=on,pt,noaperture pass-through"

kvm

 /etc/modprobe.d/kvm.conf

 options kvm allow_unsafe_assigned_interrupts=1

・modprobe

 modprobe kvm

 modprobe kvm_amd

 問題ないなら

 /etc/modulesに

 kvm

 kvm_amd

 を追加

 pci_stubがなければそれも追加

・virsh

 virt-managerからできない機能が多いのでいろいろ手動設定

  VMVGAがKVM-SPICEで使えないのでKVMに変更(VMVGAが使えないと糞遅い)

  仮想マシンのバージョンがKVMのほうが古いので下げる

  RAWディスクをマッピング

・準仮想化ドライバのダウンロードとゲストへのインストール

 VirtIO

  http://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers

 VMWARE VGAドライバ

  http://www.linux-kvm.com/content/using-vmware-vga-kvm-windows-guests

virt-manager

 PCIパススルー

 VMの起動

 

 ※追記

ubuntu12.04のKVMはPCIパススルーするときにlspciとかでデバイス一覧だして

スタブドライバに登録する必要はなくなってて

virt-managerで一覧から選んでポチポチやれば簡単にパススルーできるようになってる

 

GPUパススルーでディアルディスプレイ使うならUSBで二台キーボードとマウスつなげてパススルーするか

synergy使って共有するかなんか考えるしかない

synergy使う場合はiptablesでパケット通さないとならんけど

そういやubuntuiptablesいじったことないんだけど正式な手順あるのだろうか。

自分はめんどくさいかなとおもって余ってたキーボードとマウスつけた

 

※追記2

dmesgでAGPのエラーでてたのでカーネルパラメータ直した

不安定な場合はGRUBのパラメータ微調整する

症状はGPUパススルーが一度は大丈夫だがwindowsを再起動すると二度目でBSODがでるなど。