matplotlibことはじめ

仕事でmatoplotlibを使ってログデータを可視化する作業があったので、とりあえずざっくりとしたメモ。

環境

Windows7 64bit
Python 2.7.x

準備

numpy,scipy,matplotlibを入手
64bit版はUnofficial Windows Binaries for Python Extension Packagesからwheelで入手できる。ファイル名のcp以下の番号がPythonのバージョンであることに注意。(2.7ならcp27を選択)

インストール

wheelがない場合は事前にpipでwheelをインストールしておく。
numpy,scipyをインストール後,matplotlibをインストール

$pip install scipy‑0.15.1‑cp27‑none‑win_amd64.whl
$pip install numpy‑1.8.2+mkl‑cp27‑none‑win_amd64.whl
$pip install matplotlib&#8209;1.4.3rc1&#8209;cp27&#8209;none&#8209;win_amd64.whl</pre>

やりたかったこと

単一グラフの描画

  • 複数の系列データを1つのグラフにまとめて描画
  • 複数グラフの描画
  • 複数の系列データごとにグラフで描画

まあexcelとかでやれば、セルを選択して描画とかできる簡単な作業なのだけど、描画するのにデータを加工したりする作業が発生するので、バッチ処理で一気にグラフまで生成したいというのが目的。

matplotlibのインポート

import matplotlib.pyplot as plt

単一グラフの描画

グラフのタイトル

plt.title('title')

x軸・y軸のラベル

plt.xlabel('x')
plt.ylabel('y')

x軸・y軸の範囲

plt.xlim(0, 100)
plt.ylim(0, 50)

描画
x軸のデータとそれに対応するy軸のデータをリスト形式でplot()に渡す。
系列データを重ねて描画したい場合は、新たなデータをplot()に渡せばOK

plt.plot(x, y)

グラフの保存

plt.savefig('hoge.png')

凡例
複数の系列データを描画した場合、どのグラフが何を示しているかわからんので凡例を入れます
plot()を呼ぶ際に引数にラベル名を渡して,最後にlegend()を呼べばOK

plt.plot(x, y, label='a')
plt.plot(i, j, label='b')
plt.legend()

Muninインストールメモ on ubuntu 13.10

リソース監視用サーバをたてるため、muninをインストールした際のメモ。

パッケージインストール

munin - Webインターフェース
munin-node - モニタリングデーモン
munin-plugins-extra - 拡張プラグイン

$sudo apt-get install munin munin-node munin-plugins-extra

公開先変更

デフォルトでは/var/cache/munin/www以下が公開されるようなので、/var/www/html以下に変更

sudo cp -r /var/cache/munin/www /var/www/html/munin

設定ファイルのバックアップ

$sudo cp /etc/munin/munin.conf /etc/munin/munin.backup
$sudo cp /etc/munin/apache.conf / etc/munin/apache.backup

apache用の設定ファイルにリンクを張る

$sudo ln -s /etc/munin/apache.conf /etc/apache2/site-available/munin

munin.confの修正

htmldirをコメントアウトして、公開先のパスに変更。(デフォルトは/var/cache/munin/www)


htmldir /var/www/munin
念のためTLSを無効化

tls disabled

apache.confの修正

/etc/munin/apache.confを開いて、以下を修正する。
エイリアスの指定


Alias /munin /var/www/munin
Directoryを/var/www/munin/に変更
デフォルトではローカルからしかmuninのサイトを参照できないので以下のように修正
以下のように修正しない場合はapacheのエラーログにclient denied by server configurationが吐かれる。

Allow from all
Require all granted

これで接続しようとすると、Forbiddenとなってページが見られない。
apacheのエラーログを見ると、Options FollowSymLinks and SymLinksOwnerMatch are both offといったエラーが出るので、
/etc/munin/apache.confを以下のように修正


Alias /munin /var/www/munin #エイリアスを修正
Options FollowSymLinks #シンボリックリンクの追加

パーミッション・所有者の設定

グラフの更新はmuninのperlスクリプトによって行われる。グラフが書き込みされるディレクトリはchmod g+wしておく。

$sudo chown -R munin:munin /var/www/munin

更新時間の変更

/etc/cron.d/muninを編集する。デフォルトは5分で更新する。間隔が短すぎると、ロック処理が間に合わずにエラーを吐くので注意。

fabricをWindowsにインストールしてみた

Python製デプロイツールのfabricをインストールメモ。

準備

setuptoolはeasy_installを使うため。ここからセットアップ用スクリプトをダウンロードして、以下のコマンドを叩く

$python ez_install.py

pipのインストール

$easy_install pip

pywinpycryptのインストール
pycryptoはコンパイル済みのバイナリが必要なようですので、上記からダウンロードできます。

macとかLinuxの場合は,pip install pycryptoだけで良い模様。

fabricのインストール

$pip install fabric
Downloading/unpacking fabric
  Running setup.py (path:c:\pidekazu\hoge\appdata\local\temp\pip_build_pidekazu\fabric\setup.py) egg_info for package fabric

    warning: no previously-included files matching '*' found under directory 's
tes\docs\_build'
    warning: no previously-included files matching '*' found under directory 's
tes\www\_build'
    warning: no previously-included files matching '*.pyc' found under director
 'tests'
    warning: no previously-included files matching '*.pyo' found under director
 'tests'
Requirement already satisfied (use --upgrade to upgrade): paramiko>=1.10 in c:\
ython27\lib\site-packages (from fabric)
Installing collected packages: fabric
  Running setup.py install for fabric

    warning: no previously-included files matching '*' found under directory 's
tes\docs\_build'
    warning: no previously-included files matching '*' found under directory 's
tes\www\_build'
    warning: no previously-included files matching '*.pyc' found under director
 'tests'
    warning: no previously-included files matching '*.pyo' found under director
 'tests'
    Installing fab-script.py script to C:\Python27\Scripts
    Installing fab.exe script to C:\Python27\Scripts
Successfully installed fabric
Cleaning up...

実行

$fab
Traceback (most recent call last):
  File "C:\Python27\Scripts\fab-script.py", line 5, in <module>
    from pkg_resources import load_entry_point
  File "build\bdist.win-amd64\egg\pkg_resources.py", line 2867, in <module>
  File "build\bdist.win-amd64\egg\pkg_resources.py", line 432, in _build_master
  File "build\bdist.win-amd64\egg\pkg_resources.py", line 728, in require
  File "build\bdist.win-amd64\egg\pkg_resources.py", line 622, in resolve
pkg_resources.DistributionNotFound: ecdsa>=0.11

なんかecdsaがないって言われたから、これをインストールする。
ecdsaは暗号化キーを生成するライブラリ。

$pip install ecdsa

かくにん

$fab --version
Fabric 1.10.0
Paramiko 1.15.1

よかった。

homebrewを使う際に行った設定とエラー対処

プロキシ環境下でhomebrewを使う

パッケージを取得する際に、どうやらcurlを用いてダウンロードするようなので、
プロキシ環境下では.curlrcをホームディレクトリ以下に作成して、プロキシ設定を記述しておけば良い模様

~/.curlrc


proxy-user="username:password"
proxy="http://proxy.xxx.yyy:8080"

brew doctorで吐かれたエラー対処

homebrewをインストールしたら,以下のコマンドで確認。

$ sudo brew doctor

すると以下の様なエラー。


Warning: /Library/Frameworks/Mono.framework detected
This can be picked up by CMake's build system and likely cause the build to
fail. You may need to move this file out of the way to compile CMake.

Warning: Some directories in your path end in a slash.
Directories in your path should not end in a slash. This can break other
doctor checks. The following directories should be edited:
/

1個目のMono.frameworkによってCMakeが失敗するかもというエラー対処は、ここに詳しく書かれていました。

2個目のエラーは、~/.bashrcのPATH設定でバックスラッシュで終端している記述があるので、それを消すなり修正すれば解決。

管理者権限のチェック

pythonで管理者権限かどうかをチェックするには、ctypesをインポートしてwin32APIを直接叩くしかないようだ。

import ctypes
is_admin = ctypes.windll.shell32.IsUserAnAdmin()

UACで管理者権限に昇格させるにはちょっと大変そう。

How to run python script with elevated privilage on windows
Request UAC elevation from within a Python script?

C#でJsonシリアライズについてのメモ

C#を触り始めて、Jsonシリアライズする必要があったのでいくつかライブラリを調べたのでメモ.
C#ははじめてまだ数日なので全然慣れてないけど、なるべく直感的に扱えそうなのを探してみた。

標準でサポートされているJsonライブラリ

System.Runtime.Serialization.Json

.Net Framework 3.5以上でサポート.
最初に使ってハマったのが、参照の追加でSystem.ServiceModelを追加しなければならないこと.
その後using System.Runtime.Serialization.Json;と定義すればOK.名前を統一してほしい...

JavaScriptSerializerクラス

.Net Framwork 4.5からサポート
System.Web.Extensions.dllを参照して使用することができる.


すべて調査したわけではないけれど、標準ライブラリの場合は、基本的にオブジェクトのプロパティがJsonのキーになり,その値がそのままJsonの値に変換されるといった感じ。動的にキーを追加したい場合は使いにくい印象。

3rdパーティ製Jsonライブラリ

DynamicJson

Ms-PLライセンス
候補の一つで使ってみたJsonライブラリ. C#4.0のdynamicを用いたJsonライブラリ.軽量.

JSON.NET

MITライセンス
.Net Framework 2/3.5/4

やりたかったこと

とりあえずJsonの配列を動的に作成できること。Pythonの辞書のように、dic["foo"] = "bar" としてリストにいれて,シリアライズしたらそのままJson文字列になるようなことがやりたい。 下記のような感じで,配列に動的に生成した要素を入れたい。


{ "hoge" : [ { "key1" : "val1" }, { "key2" : "val2" } ] }

DynamicJson

まだきちんと理解していないので、使い方が間違っているかもしれないです。
DynamicJsonを用いる場合は、参照の追加からダウンロードしたDynamicJson.dllを追加し、行頭で以下を定義する。


using Codeplex.Data;

DynamicJsonはオブジェクトからJson変換もできるけど、Jsonオブジェクトを直接生成することもできるようだ。


dynamic fac1 = new DynamicJson() {};
dynamic fac2 = new DynamicJson() {};

fac1["key1"] = "val1";
fac2["key2"] = "val2";

ただ、このfac1,fac2をあるキーの値として代入したり、配列の要素にしようとするとシリアライズができない。

dynamic test = new DynamicJson() {};

test["hoge"] = fac1;
test["geho"] = fac2;

Console.WriteLine(test.ToString());

結果は以下のようになった.

{ "hoge" : { "IsObject" : true, "IsArray" : false }, "geho" : { "IsObject" : true, "IsArray" : false } }

以下のように配列に入れた場合も、オブジェクトの内容がシリアライズされない。


test["array"] = new [] { fac1, fac2 }

辞書オブジェクトを入れた場合だと、辞書のキーが値として展開されてシリアライズされる。


IDictionary dic = new Dictionary();

dic.Add("foo", "bar");
var json = DynamicJson.Serialize(dic);

Console.WriteLine(json);

結果は以下のようになり、辞書のキーと値がJsonのキーと値に対応するわけではないようだ。


{ "Key" : "foo", "Value" : "bar" }

JSON.NET

JSON.NETを用いる場合は、参照の追加からダウンロードしたNewtonsoft.Json.dllを追加する。
そして以下を定義。


using Newtonsoft.Json;

辞書オブジェクトをJsonシリアライズしてみる.


string json;
IDictionary dic = new Dictionary();

dic.Add("foo", "bar");

json = JsonConvert.SerializeObject(dic);

Console.WriteLine(json);

結果は、辞書のキー/値がJsonのキーと値に対応されてシリアライズされた。

{ "foo" : "bar" }

辞書オブジェクトを配列にいれてシリアライズしてみる.


string json;
IDictionary dic = new Dictionary();
IDictionary[] array = new Dictionary[1];

dic.Add("foo", "bar");

array[0] = dic;

json = JsonConvert.SerializeObject(array);
Console.WriteLine(json);

結果は以下のようになり、Jsonの配列がシリアライズされた.


[ {"foo" : "bar"} ]



macでのEclipse環境設定

・日本語化手順
主に以下を参考にしました.
MacでPleiadesを使ってeclipseを日本語化する

1. eclipseをダウンロード
最新版を入手. (現在4.4 Luna)


http://www.eclipse.org/downloads/

2. pleadesをダウンロード
JREが無いパッケージを選択.上記と同じ4.4を取得.


http://mergedoc.sourceforge.jp/

3. pleadesのフォルダをコピー
pleadesのフォルダ内にあるdropinsフォルダを,eclipseの同じフォルダに上書き

4. eclipse.iniを編集
- eclipseのアプリケーションファイルを選択し,[右クリック]->[パッケージの内容を表示]
- [Contents]->[MacOS]と辿ると,eclipse.iniがあるので,以下を追記する


-Dfile.encoding=UTF-8"
-javaagent:../../../dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

5. ターミナルからeclipseを起動
初回のみ以下コマンドで起動


% /Applications/eclipse/eclipse -clean