開発」カテゴリーアーカイブ

Python で “error: Unable to find vcvarsall.bat” が出た場合。

どうもみむらです。

今回は Windows で Python 使ってて、
setup.py install とかしたときに、 “error: Unable to find vcvarsall.bat” とか出た場合について。

下記のウェブサイトにて記述を見つけたのですが、一応自分向けのメモとして書き直し。
街角のリブロガー pythonでvcvarsall.batエラーが出る。



1.使っている Python のビルドされた環境を確かめる。

起動直後に現れる “MSC v.1500” というような表記からバージョンを判定しても良いのですが、
( Visual Studio を使っている人なら分かるかも・・? )

次のコードを実行して判定します。

from distutils.msvccompiler import *
get_build_version()

出力結果に “9.0” や “10.0” と出るかと思います。

 

2.レジストリに値を書き込む

値を次の場所に書き込みます:

キー名: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\(Python の MSVC のバージョン)\Setup\VC

値名:ProductDir

値:(現在使っている Visual Studio の VC フォルダへのパス)

 

例として、私の環境で使っている Python 2.7 が MSVC 9.0 環境でビルドされており、

一方で私自身は Visual Studio 2013 を使っています。

この場合値は次のようになります:

キー名: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\Setup\VC

値名:ProductDir

値:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC

image

 

また、1で 10.0 と出た場合は、

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\Setup\VC に。

その他 x86 (32bit) 環境の場合は、

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Setup\VC になって、

パスも C:\Program Files\Microsoft Visual Studio 12.0\VC

等になるかと思います。

・・取り急ぎ、メモ。

CentOS 6.5 に Snorby と Suricata をインストール

どうもみむらです。

IDS というと Snort というイメージも多いかと思いますが、
ふと Google なページをさまよっていたら Suricata というものを見つけましたので、
これを入れてみようかと。

環境としては CentOS 6.5 で Hyper-V 環境。
Windows Server 2012 (Windows 8) 以降の Hyper-V であればポートミラーリングが使えますので
その辺を使いつつ。

今回の環境では eth0 をミラーポートからのデータ受け付け用に
eth1 を管理用に構築してみます。

参考にしたところ:

http://n40lab.wordpress.com/2013/06/02/snorby-in-centos-6-4/
http://n40lab.wordpress.com/2013/05/31/installing-suricata-ids-from-source-centos-6-3/
https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Suricata_Snorby_and_Barnyard2_set_up_guide
https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Basic_Setup

 

Snorby が稼働するとこんな感じの画面が出ます:

image

 

かなりの長文なので「続きを読む」を使っていったん切ります・・

続きを読む

Windows で easy_install と pip を使えるようにする

みむらです。ちょっとメモ。

 


1.事前に PATH に C:\Python27 と C:\Python27\Scripts を通しておく

私の環境だと、Python 2 系と Python 3系が入っていますが、
どっちかに通しておけば、 “py” で 2系、 “py –3” で 3系 を起動できるので良い感じ。

“python” を実行したときに 2 を使う人か 3 を使う人かでどっちかに通しておけば良いかなと。

・・私は 2 系の方をまだ使うので 2.7 に通しました。 

 

ちなみに PATH を通すには:

1.「システムとセキュリティ」を選択
image

 

2.「システム」を選択

image

 

3.「システムの詳細設定」を選択

image

 

4.「詳細設定」タブ内の「環境変数」を選択

image

 

5.Path を追記する

“PATH” という項目が無い場合は、「新規」をクリック

image

 

”PATH” という項目がある場合は、その項目をダブルクリック

image

 

でもって、こんな感じで設定する。

image

すでに項目がある場合は、そのパスの後ろに “;” 書いてパスを追記する。

複数の場所に PATH を設定したい場合は、”;” で区切って書いていく。

 


2.easy_install をインストールする。

https://bootstrap.pypa.io/ez_setup.py

ここから ez_setup.py をダウンロードしてきて、ダブルクリックで実行
勝手にファイルをダウンロードしてインストールしてくれる。

・・もし、ダブルクリックしても動かない場合は
コマンドプロンプトを開いて、

python ez_setup.py

と打ち込むと動きます。

 

また、コマンドプロンプトを開いてそこまで移動するのが面倒・・という場合は、

Shift キーを押しながら右クリックをしますと、下図のような項目が出ますので、

わざわざ移動せずともコマンドプロンプトを指定したフォルダをカレントディレクトリとして起動することが出来ます。

image

image

 


3.pip をインストール

コマンドプロンプトを開いて、

easy_install pip

を実行すると導入されます。


後は PATH を通してありますので、

image

こんな感じで、いきなり “pip” と入力しても動くようになります。

 

・・ひとまず、参考まで。

C# で ini ファイルの内容を任意のクラスに格納するコードを書いてみた。

どうもみむらです。

C# で ini ファイルを操作するとなると、
よくあるのが GetPrivateProfileString あたりを叩いて取得することになります。

でもその場合、いちいち要素を指定して取得しなければならず、
特に複数のキー(フィールド)がある場合に複数回コードを書くのも面倒です。

特に ini ファイルの項目が多くて、こんな状態になった日には・・。

image

 

・・ということで、 Reflection を使用して
この辺をすごく楽に出来るような感じでコードを書いてみました。

 

コード:

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;

public static class Ini
{
    [DllImport("KERNEL32.DLL")]
    public static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName);

    [DllImport("KERNEL32.DLL")]
    public static extern uint GetPrivateProfileInt(string lpAppName, string lpKeyName, int nDefault, string lpFileName);

    [DllImport("KERNEL32.DLL")]
    public static extern uint WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);

    public static T Read<T>(string section, string filepath)
    {
        T ret = (T)Activator.CreateInstance(typeof(T));

        foreach (var n in typeof(T).GetFields())
        {
            if (n.FieldType == typeof(int))
            {
                n.SetValue(ret, (int)GetPrivateProfileInt(section, n.Name, 0, Path.GetFullPath(filepath)));
            }
            else if (n.FieldType == typeof(uint))
            {
                n.SetValue(ret, GetPrivateProfileInt(section, n.Name, 0, Path.GetFullPath(filepath)));
            }
            else
            {
                var sb = new StringBuilder(1024);
                GetPrivateProfileString(section, n.Name, "", sb, (uint)sb.Capacity, Path.GetFullPath(filepath));
                n.SetValue(ret, sb.ToString());
            }
        };

        return ret;
    }

    public static void Write<T>(string secion, T data, string filepath)
    {
        foreach (var n in typeof(T).GetFields())
        {
            WritePrivateProfileString(secion, n.Name, n.GetValue(data).ToString(), Path.GetFullPath(filepath));
        };
    }
}

 

使い方:

ini ファイルの読み取りたいセクションに合わせたクラスを用意します。

    public class Human
    {
        public string name;
        public int age;
    }

でもって次のような ini ファイルを用意して

[01]
name=TARO
age=20

あとはこんな風に呼び出します。

        static void Main(string[] args)
        {
            var h = Ini.Read<Human>("01", "DATA.INI");

            h.age = 15;
            h.name = "JIRO";
            Ini.Write("02", h, "DATA.INI");
        }

 

実行しますと、

image

こんな感じでデータが読み出されます。

でもって、 ini ファイルは

[01]
name=TARO
age=20
[02]
name=JIRO
age=15

こんな感じに、ちゃんとセクション 02 が書き込まれます。


躓きそうなところ:

データを格納するクラスが、こういう感じに {get; set;} な状態になっている場合:

    public class Human
    {
        public string name { get; set; }
        public int age { get; set; }
    }

上記コード内の GetFields を GetProperties に換え、 FieldType を PropertyType に変えれば動作します。


・・そんなわけで、もし良ければ自己責任でご利用ください-。

Python の内包表現と演算子と。

みむらです。

最近ちょっと Python を触ってみようかとということで、
しばらくぶりに触っています。

ってことで忘れそうなことのメモ。

・・・Python をよく使っている人からするとぶん殴られそうな気がしますが、
とりあえず、勉強ということで躓いたところをメモしていきます。

 

内包表現:

[追加要素 for 変数 in リスト if 条件]

使い方としては、

l = ((0,1),(2,3),(4,5))
m = [i for (i,j) in l]
>> (0,2,4)

みたいな。

なんとなく、C# だと、

var l = new[] { new[] { 0, 1 }, new[] { 2, 3 }, new[] { 4, 5 } };
var m = l.Select(i => i[0]);

みたいな感じ・・ですかね。

あとは条件式を加えて、

[i for (i,j) in l if i > 0]

みたいなやつに関しては

var l = new[] { new[] { 0, 1 }, new[] { 2, 3 }, new[] { 4, 5 } };
var m = l.Where(i => i[0] > 0).Select(i => i[0]);

みたいな感じ。

 


演算子のメモ:

割り算において “/” と “//” 演算子があって、

3.0/2.0 = 1.5

3.0//2.0 = 1.0

というように、”//” 演算子だと結果が整数に丸められる。

丸め方としては、

math.floor で丸めた時と同じ動作となるっぽい。

1.5 → 1.0

-1.5 → -2.0

考え方としては「負の無限大」方向に丸める。

データとして考えるなら、 0x0 の方向に丸める、と考えると良いのかもしれない。

(負数は2の補数表現で表現されることを考えてみると。)

逆に、 “0” 方向に丸める場合は、 int で括ると良い感じ。

ex. int(1.5 / 1.0)

1.5 → 1.0

-1.5 → –1.0

あとは round 関数で丸める方法なんてのもありますが、

これは昔書いた「銀行丸めと四捨五入。」を参照してください。

 

それと、 “**” 演算子が存在し、

これは C# で言うところの Math.Pow (べき乗計算)に該当。

ex.)

2**10 = 1024


要素数を数える:

私自身、ちょっとはまったのですが・・(汗

C++ だと hoge.size() とか書いて、

C# だと hoge.Length だったり、動的に求める必要がある物については hoge.Length() だったり。

Python の場合は、 len(hoge) で求まる。

また、 hoge.count() と叩くと「引数が足りない!」と怒られるんですが、

これは C# の hoge.Count(1) と同じで、要素内に指定されたものがいくつ入っているかを返すメソッド。

ただし、C# の hoge.Count() のように、引数なしだと要素数が返ってくるということはなく、

「引数が足らない!」としかられるだけなので注意。