Category Archives: OSX

[メモ] Windows, OS X(Mac)でフォルダ/ファイルのパスをクリップボードにコピーする

Pocket

たとえば仕事上、共有サーバにあるフォルダのパスを知らせたい、ということがある。
こういう時のために、フォルダのパスを簡単にクリップボードへコピーする方法を示す。
Windows, OS Xの両方向け。大盤振る舞いである。
OS Xでは追加のツールも要らない方法です。

Windowsでの方法

こちらは簡単。
対象フォルダをSHIFT+右クリックして出てくるメニューからコピーを選べばよい。
ただの右クリックでは出てこないところが憎らしい。
ただ、ダブルクオーテーションで括られる点に注意。

pathcopywindows

OS X(Mac)での方法

Automatorを使う。
Launchpadの「その他」の下にある。

Automatorの設定方法

起動時の選択では「サービス」を選ぶ。

CopyPathToClipboardOSX
「アクション」では「クリップボードにコピー」を探す。
「クリップボード」あたりで検索するとよい。
「クリップボードにコピー」を、画面右側にドラッグ・アンド・ドロップ。
「サービスは、次の選択項目を受け取る」では「ファイルまたはフォルダ」を。
「検索対象」では「Finder」を選ぶ。
メニューバーの編集から保存で「Copy Path to Clipboard」とでも名前を付けて保存。

使いかた

Controlキーを押しながらフォルダをクリックでメニューが開く。
さっき追加した「Copy Path to Clipboard」があるはず。

OSXCopyPath

以上。

[メモ][OS X] Sublime textでShift-JISを扱うには

Pocket

Sublime textはOS Xで使えるテキストエディタ。
Shift-JISが読めないが、Pluginで対応できる。
Pluginの名前はConvertToUTF8。
「import」などせず、Pluginをダウンロードして突っ込む古式ゆかしい方法を示す。

なお、sublime text3の場合はcodec33も必要。

方法

公式サイトからダウンロードする。
伸長(解凍)後、Sublime textのパッケージフォルダにコピーする。
Sublime textを再起動。

公式サイト

https://github.com/seanliang/ConvertToUTF8

画面右にあるDownload ZIPをクリックしてダウンロード。

パッケージフォルダへのコピー

ConvertToUTF8-master.zip を展開、フォルダをConvertToUTF8に変更し、パッケージフォルダにコピーする。
パッケージフォルダは、Sublime textのpreferences.. から Browse Packagesで確認できる。
私の例で言えば、パッケージフォルダは以下のとおり。

/Users/<user name>/Library/Application Support/Sublime Text 2/Packages

Sublime Textを再起動

以下のようにShift-JISで開けるようになる。
sublimeTextShiftJIS

[メモ] MacのパッケージマネージャHomebrewのインストール

Pocket

Homebrewとは、Macのパッケージマネージメントツールで、UNIX系ソフトウェアのインストールを管理してくれるもの。
Rubyで作られている。

インストールは
http://brew.sh/index_ja.html
ここの手順に沿う。

インストール

githubからダウンロード、インストールする。
http://brew.sh/index_ja.htmlの下の方にあるコマンドをそのまま実行すればよい。
以下が実行例。

$ which ruby
/usr/bin/ruby
$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
==> This script will install:
/usr/local/bin/brew
/usr/local/Library/...
/usr/local/share/man/man1/brew.1

Press RETURN to continue or any other key to abort
==> /usr/bin/sudo /bin/mkdir /usr/local
(略)
From https://github.com/Homebrew/homebrew
 * [new branch]      master     -> origin/master
HEAD is now at 17eceb1 pdf2htmlex: upstream patch to fix build with latest poppler
==> Installation successful!
==> Next steps
Run `brew doctor` before you install anything
Run `brew help` to get started
$

まずbrew doctorをせい、ということなので。

$ brew doctor
Your system is ready to brew.

以上はうまくいった場合。
少しでも気を抜くとこんな風に怒られる。
24時間updateしてないだけで。
brewで作業するならまずbrew updateしてから、にしたほうが良さそう。

$ brew doctor
Warning: Your Homebrew is outdated.
You haven't updated for at least 24 hours, this is a long time in brewland!
To update Homebrew, run `brew update`.

update。

$ brew update
Updated Homebrew from 17eceb1a to 8510ebcd.
==> New Formulae
aces_container		   libltc	
(略)

PATHの変更

せっかくbrewでソフトウェアをインストールするなら、それを使ってくれるようPATHを修正する。
profileに以下の一行を加える。

$ vi ~/.bash_profile

export PATH=/usr/local/bin:$PATH

試してみよう
ドット「 . 」に続けてprofileを指定すれば読み込んでくれる。
そのあとにPATHの中身を確認。

$ . ~/.bash_profile
$
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

/usr/local/binが二回続けて出てくるけど、まあよしとする。

使い方

使い方は以下のとおり。
まあ、一般的ですよね。

  brew [info | home | options ] [FORMULA...]
  brew install FORMULA...
  brew uninstall FORMULA...
  brew search [foo]
  brew list [FORMULA...]
  brew update
  brew upgrade [FORMULA...]
  brew pin/unpin [FORMULA...]

[UNIX tips] 復活祭(イースター)の日付に神代の遊び心を見た(2014年のイースターは4/20です)

Pocket

cal/ncalにはイースター(復活祭)を表示するオプションがある。
私はキリスト教徒ではないのですが、コマンドにこういったオプションが自然に入っていることに感銘したので記録する。

結論

ncal -e (西方教会向け)
ncal -o (東方教会向け)

* Linux(GNU cal)ならcal -e/cal -oでOK。

calコマンド

UNIXにはcalコマンドという、カレンダーを表示するコマンドがある。
手許のMacにもきちんと入っていて(MacなのでFreeBSD由来です)、実行してみると以下のように表示される。

$ cal

2月 2014
日 月 火 水 木 金 土
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28

 

復活祭とは

wikiがこちら。
http://ja.wikipedia.org/wiki/復活祭

「復活祭は基本的に「春分の日の後の最初の満月の次の日曜日」に祝われるため、年によって日付が変わる移動祝日である。」ということなので、コンピュータに計算させるニーズは、それなりにあるというわけですな。

コマンド実行例

OS XやFreeBSDで復活祭の日付を表示させるには、calコマンドではできず、ncalコマンドを使う必要がある。
GNU calなら問題なし、つまり大半のLinuxでも問題なし。
ncalコマンドは、calコマンドにさらにレイアウトやオプションを追加したもの。

-e、つまりeaster、で復活祭の日付を表示する。
-o、つまりOrthodox(正教)での復活祭の日付を表示する。

$ ncal -e
4月 20 2014

$ ncal -o
4月 20 2014

東方、西方、同じようですな。

おわりに

マニュアルを見ると、calコマンドはAT&T UNIXのVersion 5で現れたとのこと。
1975年ごろ。
まさに神代である。

そして、そんな時代でターミナル上にカレンダーを豪快に表示させるという、ロックなコマンドが生まれてるんである。
「真面目にやれよ」とか怒られなかったんですかね。
そしていつごろか、そこに復活祭のような移動祝祭日を計算するオプションが入ってくる。
のびのびしているというか、融通無碍というか。
気持ちよくて、駄文を記した次第でございます。

zfs snapshotの差分send/recvについて

Pocket

 

zfs snapshotの差分send/recvについて

zfsのバックアップは、snapshotを撮っておいて、自ホストの別zpool、あるいは他ホストの別zpoolに移すことで行われる。
バックアップは定期的に行われるものであるが、ではそのsnapshotを移す際、毎回毎回まるまる送っていたんでは帯域も時間もディスク寿命も無駄である。
zfsはそこも考慮していて、差分だけを送ればいいようにincrementalオプションがきちんと用意されている。

書式は以下の通りsendに-iオプションを与えるだけ。
(recv側にはsnapshotAがすでに転送済みの前提)

zfs send -i <snapshotA> <snapshotB> | zfs recv <target pool>

 

よろしい。では次回からは…?

ふむ。
では二回目以降はどうするのだろう?
上記の書式例でsnapshotCが出来たらどうするのだろう?
まさかsnapshotA, B, Cを全部並べるのか?と思ったけどそれは間違いで、snapshotB, Cだけでよい。

recv側にはsnapshotAがすでにあるとき。
zfs send -i snapshotA snapshotBでAとBの差分のみが送られる。
つぎにzfs send -i snapshotB snapshotCでBとCの差分のみが送られる、というわけ。

では早速試してみる。が。

「転送先が更新されているため差分を転送できません」

こんなエラーがでる。

cannot receive incremental stream: destination warehouse/dir has been modified
since most recent snapshot

まあ文字通りなんですが。
バックアップ用の転送先が更新されるのはなぜか分からないが(atimeだろうか?)。

こういう場合には、recv側で-Fオプションを与えればよい。
-Fオプションによりrecv側は最新snapshotに強制rollbackして、それからsnapshotを受け取る。

下記の例だと、recv側は@20131226にいったんrollbackしてから受け取る。

$ sudo sh -c "zfs send -i vault/chamber@20131226 vault/chamber@2014010
2 | zfs recv -F warehouse/chamber"

 

atimeのoff

recv側がなぜ更新されてるのか、atimeが怪しいのでoffにしておく。
recv側のzpoolに対してzfs set atime=offするだけ。
(zpoolから切り出されたzfsすべてに適用される)

$ zfs get atime warehouse
NAME       PROPERTY  VALUE  SOURCE
warehouse  atime     on     default
$ sudo zfs set atime=off warehouse
$ zfs get atime warehouse
NAME       PROPERTY  VALUE  SOURCE
warehouse  atime     off    local
$ zfs get atime warehouse/chamber
NAME               PROPERTY  VALUE  SOURCE
warehouse/chamber  atime     off    inherited from warehouse

 

[メモ] grepでコメント行、空行以外の行を表示させるには

Pocket

 

いつも忘れるのでメモ。
あるファイルから、コメント行と空行を除いて表示させるには。

コメント行なら”^ *#”がマッチ。
空行なら^ *$”がマッチ。

egrepに -v “^ *#|^ *$” を与えればよい。
冒頭タブとかは漏れてしまうけど、ひとまずはこれでいいかな。

以下、実行例。

$ egrep -v "^ *#|^ *$" ./nginx.conf
user  www;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   /usr/local/www/nginx;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
    }
}

 

iCalにGoogleのカレンダーを表示するには

Pocket

 

メモ。
iCalにGoogleカレンダーの内容を表示させる方法について

事前準備

googleの二段階認証を有効にしている場合には、googleのアカウントでiCal向けのパスワードを作っておく。
icaladdgoogle2stepauth20140110

 

登録

流れ。

  1. iCalからカレンダー、アカウントの追加を選ぶ
  2. Googleを選ぶ
  3. アカウント情報を入れる。

 

二段階認証を有効にしている場合には、Step3で、Googleアカウントで作ったical向けのパスワードを入力。

Step 1
icaladd
Step 2
icaladdgoogle20140110

Step 3
icaladdgoogleauth20140110

以上

Pythonアプリに引数を渡そう

Pocket

PythonでWindowsアプリケーションを作ったとする。
たとえばファイルを引数に取り、整形するものだとする。
せっかくWindowsアプリケーション、というかGUI上のプログラムなんだから、アプリケーションにドラッグ&ドロップしたいじゃないか。
どうしたらできるか。
…まあ普通にargvで受け取ればいいんですがね。
以下、Pythonにおけるargvの使い方メモ。

sys.argv

sys.argvは、コマンドラインで渡される引数が入ったリスト。
sys.argv[0]にはスクリプト自身が入る。
len(sys.argv)で引数の数をカウントできる。
できるが、スクリプト自身も含めての数であることに注意。sys.argv[0]に自分が入っているからね。

サンプルスクリプト

サンプルスクリプトである。

import sys

print "the name of script is :", sys.argv[0]
print "the number of arg is :", len(sys.argv)

for arg in sys.argv:
    print arg

この実行結果は、たとえば以下のようになる。

$ python ./argv.py a b c
the name of script is : ./argv.py
the number of arg is : 4
./argv.py
a
b
c

sys.argvはリストなのでforなどで中身を一つ一つ参照できるが、自分自身からまず始まるのは美しくない。

引数一つ目から扱うには

以下のようにする。

import sys

def main(argv):

    print "the name of script is :", sys.argv[0]
    print "the number of original arg is :", len(sys.argv)
    print "the number of altered arg is :", len(argv)

    for arg in argv:
        print arg

if __name__ == "__main__":
    main(sys.argv[1:])

端的に言えば、一枚レイヤを入れる。
一番下のif文部分でsys.argvを受けたら、リストの一つ目以降、つまりスクリプト自身を除いた残りをmain()に渡すというわけ。
出力は例えば以下のようになる。

$ python ./argv.py a b c
the name of script is : ./argv.py
the number of original arg is : 4
the number of altered arg is : 3
a
b
c

ベリーナイス。

シャレオツな使い方(引数の数を担保したい)

さて。もうちょっと頭のいいことをやってみたい。
具体的には、引数を一つだけ取るようにしたい。
さてサンプル。

def main(argv):

    print "the name of script is :", sys.argv[0]
    print "the number of original arg is :", len(sys.argv)
    print "the number of altered arg is :", len(argv)

    if len(argv) != 1:
        sys.exit("Usage: %s <filename>" % sys.argv[0])

    print argv[0]

if __name__ == "__main__":
    main(sys.argv[1:])

出力例

$ python ./argv.py a b c
the name of script is : ./argv.py
the number of original arg is : 4
the number of altered arg is : 3
Usage: ./argv.py <filename>

 

シャレオツな使い方(引数の内容を担保したい)

さらに。
ファイルを引数に取るとして(さあ冒頭の話につながってまいりました!)、そのファイルの有無を確認したい。
サンプル。

import sys
import os

def main(argv):

    print "the name of script is :", sys.argv[0]
    print "the number of original arg is :", len(sys.argv)
    print "the number of altered arg is :", len(argv)

    if len(argv) != 1:
        sys.exit("Usage: %s <filename>" % sys.argv[0])
    if not os.path.exists(argv[0]):
        sys.exit('ERROR: file %s was not found!' % argv[0])

    print argv[0]

if __name__ == "__main__":
    main(sys.argv[1:])

出力例

$ python ./argv.py a
the name of script is : ./argv.py
the original number of arg is : 2
the altered number of arg is : 1
ERROR: file a was not found!

以上でござる

[メモ]zpoolのVersionについて(Versionナンバはもう使われない)

Pocket

 

過日、zpool v28のアップグレードをして、いくつかのfeature flagsを有効にした。
したのだが、よく分からないことがいくつかあった。

すなわち、最新のはずのv28なのにアップグレードを促されたこと、アップグレードしたら zpool get allの結果からバージョンが消えてしまったこと、である。

WikipediaのZFSやOpenZFSを眺めてみて分かったのは、zpool((Open)ZFS)はv28以降、バージョンナンバの使用を止めてしまったせいとの由。
http://en.wikipedia.org/wiki/OpenZFS
http://en.wikipedia.org/wiki/ZFS#RELEASEHISTORY

以下に調べた結果を示す。
なお、ご覧の通り情報の出所はwikipediaである。
問題ないとは思うが、各位においてはご留意されたい。

ZFSの歴史

もともと、zpoolやZFS filesytemに機能が追加されるたび、バージョンナンバがインクリメントされてきた。
しかし2010年、OpenSoralisの開発が停止され、ZFSはオープンソースではなくなった。
本家(Oracle)のZFSはプロプライエタリとなって、2013/12/24現在、ZFS filesystemはv6, ZFS Poolはv34まで進んでいる。

それはそれとして、illumos(OpenSolaris後継)やBSD/Linux/OSX関連の方々は、オープンであったzfs v5, zpool v28をベースに本家とは別の開発が進める。
これが2013年にOpenZFSとなる。

バージョンナンバとフィーチャーフラグ

OpenZFSはいろんな所でいろんな人々が開発を続けている。
こういった状態で、単一のバージョンナンバを付与することは不可能である。
そこでフィーチャーフラグ(feature flags)という考え方を導入する。
機能ごとに個別の名前を与える、というもの。

個別の名前は、feature@<org-name>:<feature-name>という書式で表される。
org-nameは当該機能を開発した組織名。一意の名前。もちろん、勝手につけることは許されない。
org-nameが明らかな場合には、feature@<feature-name>と短縮してもよい。
feature@async_destroyというように。

フィーチャーの状態

フィーチャーの状態には三つある。
disabled, enabled, activeである。

  • disabled: 無効。機能を使えない状態。
  • enabled: 機能を使える状態。有効にはなっていない。
  • active: 機能が有効。旧バージョンとの互換性がなくなっている。

フィーチャーの種類

  • features for write : 書き込みには必須の機能。読み込みのみであれば不要。
  • features for read : 読み込み、あるいはpoolを開くために必須の機能。

たとえばasync_destroyはデータ書き込みの時だけ必要な機能なのでfeatures for write。

バージョンについて

一つでもフィーチャーを有効にするとpoolのバージョンは1000になる。
1000とはめちゃくちゃな数に見えるかもしれないが、本家のバージョンと被らないようにするため。

おわりに

ここで改めてzpoolの出力を見てみると、poolのバージョンがハイフンになっていることや、フィーチャーの記載など、なるほどと理解できることがありますな。

$ zpool get all|grep vault
vault size 2.27T -
vault capacity 64% -
vault health ONLINE -
vault version - default
(略)
vault feature@async_destroy enabled local
vault feature@empty_bpobj enabled local
vault feature@lz4_compress enabled local

 

Graphvizでカックいいグラフを描こう

Pocket

Graphvizとは、AT&T研究所の作ったグラフ描画ソフトである。
ここでのグラフとは棒グラフのグラフではなく、ソーシャルグラフとかのグラフである。
点(ノード)と線(エッジ)で表されるもので、例えば、何らかの状態遷移や、路線図や、ネットワークなどの「関係」の表現に使われる。

もともとオイラーの一筆書きのような経路探索の分野があって、それを視覚的に表現するためのツールとしてこういったソフトがある(たぶん)。
そんな分野はとても手に負えない。
しかし、グラフ描画に注目するだけでも、とても面白いんである。

例えば、ふだん利用する路線の、各駅の関係と乗降数をグラフに書いてみるだけでも、表で見たときは比べ物にならないくらいのインパクトがある。

keikyu
これは、京浜急行の駅の繋がりと乗降者数をグラフにしてみたもの。
隣り合う駅は繋ぐし、特急などで途中の駅をすっ飛ばす場合も繋ぐ。
乗降者数に応じて駅の大きさを変えてみた。
(何気なく作ったら一辺が10,000ピクセルを超える巨大画像になったので泣く泣く縮小した。)

そういったわけで、この記事では(Python経由で)graphvizのグラフ描画についてまとめた。

以下、特に指定のないかぎり、グラフと記載があれば、それは上記の意味でのグラフである。

Graphvizについて

手っ取り早くどんなグラフが描けるのかを知りたければこちらのサンプルグラフなどを。

関連のwebsiteは以下のとおり。

Graphviz(公式) http://www.graphviz.org/
Graphviz(wiki) http://ja.wikipedia.org/wiki/Graphviz

Graphvizでは、DOTという形式でグラフを描画する。
しかしDOT形式をそのまま扱うのはちょっと難しい。
そこで他の言語を通して使う。
具体的にはpygraphviz。
PyGraphvizはGraphvizのpythonインタフェースである。

PyGraphvizのインストール

FreeBSD, OS Xでのインストールは確認済みである。
しかし意外や意外、WindowsのActivePythonではPyGraphvizをインストールできない。PyPMにないのである。
素のPythonなら出来るのかもしれないが。

しかし、Graphviz単体ならインストールできる。DOT形式のファイル(以降、DOTファイル)を別マシンからもらえば、WIndows上でもグラフ描画は可能。

FreeBSDでのインストール

portsでもpkgでも、pygraphvizで探せば出てくるのでそれをインストールすればよい。
以下はpkgでの例。
gccを連れてきてダウロードサイズが100MBを超えた。驚いた。
ついでnumpyも入れた。

$ pkg search graphviz
graphviz-2.34.0
py27-graphviz-1.1_1
rubygem-graphviz-1.0.9
trac-graphviz-0.7.4_6
$ sudo pkg install py27-numpy py27-graphviz
Updating repository catalogue
The following 12 packages will be installed:

        Installing mpc: 1.0.1
        Installing gcc-ecj: 4.5
        Installing binutils: 2.23.2
        Installing py27-nose: 1.3.0
        Installing libgd: 2.1.0_1,1
        Installing gcc: 4.6.4
        Installing graphviz: 2.34.0
        Installing blas: 3.4.2_1
        Installing py27-graphviz: 1.1_1
        Installing lapack: 3.4.2_1
        Installing suitesparse: 4.0.2_2
        Installing py27-numpy: 1.7.0_2,1

The installation will require 685 MB more space

110 MB to be downloaded

 

OS Xでのインストール

graphvizをインストールし、そのあとPython上でpygraphvizをインストールすればよろし。
以下の例ではbrewでgraphvizを、そのあとpipでpygraphvizをインストールしている。

$ brew install graphviz
==> Downloading http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.3
######################################################################## 100.0%
==> Downloading patches
<snip>
==> make install
/usr/local/Cellar/graphviz/2.30.1: 462 files, 10M, built in 3.1 minutes
$

$ pip install pygraphviz
Downloading/unpacking pygraphviz
  Using download cache from /Users/xxx/.pip/cache/https%3A%2F%2Fpypi.python.org%2Fpackages%2Fsource%2Fp%2Fpygraphviz%2Fpygraphviz-1.2.tar.gz
  Running setup.py egg_info for package pygraphviz
    Trying pkg-config
    library_path=/usr/local/Cellar/graphviz/2.30.1/lib
    include_path=/usr/local/Cellar/graphviz/2.30.1/include/graphviz
<snip>
    no previously-included directories found matching 'doc/build'
Successfully installed pygraphviz
Cleaning up...
$

 

Windowsでのインストール(graphvizだけ)

WindowsのActivePythonではpygraphvizが使えない。
素のgraphvizをインストールする。
以下あたりからダウンロードする。

http://www.graphviz.org/Download_windows.php

インストーラがよければmsiを、レジストリを汚したくないならzipをダウンロード。
zipは展開するとreleaseというフォルダが出来る。
リネームしてどこにでも置けばよい。
実行ファイルはbinの下にある。
必要ならパスを通しておく。

実際に使う実行ファイルはdot、circo、neatoあたりでしょう。

pygraphvizインストールの確認

pygraphvizをimportしてみてエラーの出ないことを確認しておこう。
たとえばIDLEで。

Python 2.7.5 (default, Oct 17 2013, 07:35:17)
[GCC 4.2.1 Compatible FreeBSD Clang 3.3 (tags/RELEASE_33/final 183502)] on freebsd10
Type "copyright", "credits" or "license()" for more information.
>>> import pygraphviz
>>>

 

PyGraphvizを使ってみよう。

基本はここのチュートリアルに沿えばよい。
http://networkx.lanl.gov/pygraphviz/tutorial.html

pygraphvizをimportし、AGraphクラスを作る。

import pygraphviz as pgv
G = pgv.AGraph()

ノードの追加

G.add_node('a')
G.add_node('b')

エッジの追加

G.add_edge('c','d')
G.add_edge('e','f')

そして描画。
layoutを指示すると各ノード、エッジの配置がなされ、drawで画像に書き込める。

G.layout()
G.draw('sample01.png')

dotファイルを書き出すには。

G.write("sample01.dot")

 

サンプルスクリプト

以下、サンプルスクリプトとその結果つくられるグラフを列挙する。
先述の通りWindowsではpygraphvizが使えない。
Windowsでグラフを描こうとするなら、MacやFreeBSD他、pygraphvizで生成しておいたdotをWindows上のgraphvizで読みこむしかない。
その方法は最後に触れる。

サンプル1

#!/bin/env python

import pygraphviz as pgv

G = pgv.AGraph()

G.add_node('a')
G.add_node('b')

G.add_edge('c','d')
G.add_edge('e','f')

G.layout()
G.draw('sample01.png')

sample01

サンプル2

ノードの追加は、リストでまとめてできる。

#!/bin/env python

import pygraphviz as pgv

G = pgv.AGraph()

nodelist = ['g','h','i']

G.add_nodes_from(nodelist)

G.add_edge('c','d')
G.add_edge('e','f')

G.layout()
G.draw('sample02.png')

sample02

サンプル3

同じエッジを二回追加しても変わらない。

#!/bin/env python

import pygraphviz as pgv

G = pgv.AGraph()

nodelist = ['g','h','i']

G.add_nodes_from(nodelist)

G.add_edge('h','i')
G.add_edge('h','i')

G.layout()
G.draw('sample03.png')

sample03

サンプル4

しかし、最初のクラス作成時にstrict=Falseと指定すれば。

#!/bin/env python

import pygraphviz as pgv

G = pgv.AGraph(strict=False)

nodelist = ['g','h','i']

G.add_nodes_from(nodelist)

G.add_edge('h','i')
G.add_edge('h','i')

G.layout()
G.draw('sample04.png')

sample04
二本になる。

サンプル5

さらにdirectを指定すれば。

#!/bin/env python

import pygraphviz as pgv

G = pgv.AGraph(strict=False, directed=True)

nodelist = ['g','h','i']

G.add_nodes_from(nodelist)

G.add_edge('h','i')
G.add_edge('h','i')

G.layout()
G.draw('sample05.png')

sample05
矢印になる。

サンプル6

ここまでは殺風景であったが、色だって形だって変更できる。

#!/bin/env python

import pygraphviz as pgv

G = pgv.AGraph(strict=False, directed=True)

nodelist = ['g','h','i']

G.add_nodes_from(nodelist)

G.add_edge('h','i')
G.add_edge('h','i')

G.layout()
G.draw('sample05.png')

sample06

 

参考

ここから先は、以下を参考にして各自素敵なグラフを作ってくれたまえ。
https://github.com/pygraphviz/pygraphviz/blob/master/examples/miles.py

pygraphviz attrの一覧
http://www.graphviz.org/doc/info/attrs.html

Windowsでdotからグラフを描画する。

インストールしたdot, circo, neatoのいずれかに、-Tで出力形式を、-oで出力ファイル名を指定したうえで、dotファイルを与えればよい。

dot -Tpng -o filename.png filename.dot
circo -Tpng -o filename.png filename.dot
neato -Tpng -o filename.png filename.dot

 

 

No tags for this post.