2013年3月2日土曜日

gschem 覚書き

(1) 回路図をPDF として出力する。

方法1

gschem のメニューから
ファイル -> Print...
Destination で File を選択。

いったん、ps ファイルとして出力したあと、 ps2pdf コマンドで PDF へ変換する。


方法2

$ apt-get install cups-pdf
で cups-pdf をインストールします。
$ lpstat -p
で printer PDF が表示されればOK。

あとは gschem のメニューから
ファイル -> Print...
Command で  lpr -P PDF
でプリントする。
~/PDF 以下に出力されているはず。



(2) gschem のカスタマイズ

/etc/gEDA/system-gschemrc を直接書きかえてもよいが、
個人の趣向に基づく変更がシステム全体に及ぶのも気が引ける。

そこで
~/.gEDA/gschemrc
もしくは
プロジェクトのディレクトリに gschemrc を置く。

emacs のように LISP で記述する。
どんな設定ができるのかは
/etc/gEDA/system-gschemrc の中身を見ればわかる。


(3) gschemrc に設定しておいた方がよい内容
/etc/gEDA/system-gschemrc を見れば、どんな設定ができるのかわかる。


# デフォルトでは背景が黒なので、色を白に変更する
(load (build-path geda-rc-path "gschem-colormap-lightbg")) ; light background

# プリントアウト用の色も黒から白へ変更する
(load (build-path geda-rc-path "print-colormap-lightbg")) ; light background

# デフォルトでは プリントアウトが白黒なので、カラー化する。
(output-color "enabled")      ; for color PDF output

# 独自コンポーネントを置くディレクトリの設定。
# /usr/share/gEDA/sym/local  に独自のシンボルを置けるようになっているが、rootしかできない。
# プロジェクトの下に mysym というディレクトリを作って、そこに置きたいので、以下のようにする。
(component-library "mysym")


# ネットが勝手に吸い付くのがうっとおしいので、デフォルトでOFFにする。
(magnetic-net-mode "disabled")

# デフォルトのプリント先はPDF 出力にする
(print-command "lpr -P PDF")




(4) さらに色をカスタマイズする

/etc/gEDA/gschem-colormap-lightbg
/etc/gEDA/print-colormap-lightbg
の色では満足できない場合、

上記の2ファイルの中身を gshcemrc へコピペする。
そして自分の所望の色に変更する。

自分は働き始めて最初に使ったのが OrCADだったので、OrCADに愛着があります。
ちょっと OrCAD っぽい色使いに変更してみました。


(display-color-map
 '((background         "#f0f0f0")
   (pin                "#ff0000")
   (net-endpoint       "#cd0000")
   (graphic            "#0000bb")
   (net                "#cd0000")
   (attribute          "#000000")
   (logic-bubble       "#008b8b")
   (dots-grid          "#7f7f7f")
   (mesh-grid-major    "#e1e1e1")
   (mesh-grid-minor    "#e8e8e8")
   (detached-attribute "#ff0000")
   (text               "#000000")
   (bus                "#0000ff")
   (select             "#b22222")
   (bounding-box       "#ffa500")
   (stroke             "#a020f0")
   (zoom-box           "#008b8b")
   (lock               "#666666")
   (output-background  #f)
   (junction           "#ff00ff")
   (freestyle1         #f)
   (freestyle2         #f)
   (freestyle3         #f)
   (freestyle4         #f)
   ))

(print-color-map
 '((background         "#ffffff")
   (pin                "#ff0000")
   (net-endpoint       "#ffffff")
   (graphic            "#0000ff")
   (net                "#cd0000")
   (attribute          "#000000")
   (logic-bubble       "#008b8b")
   (grid               #f)
   (detached-attribute "#ff0000")
   (text               "#000000")
   (bus                "#0000ff")
   (select             #f)
   (bounding-box       #f)
   (zoom-box           #f)
   (stroke             #f)
   (lock               "#666666")
   (output-background  "#ffffff")
   (junction           "#ff00ff")
   (freestyle1         #f)
   (freestyle2         #f)
   (freestyle3         #f)
   (freestyle4         #f)
   ))





2013年2月15日金曜日

zfs のオートスナップショット

Solaris ならば、定期的にスナップショットを取ってくれる機能がついています。

ZFS on Linux を使っていている時に、同じようなことをやりたいな、と思って超簡単なシェルスクリプトを書いてみました。

かなり、やっつけなので、どなたかもっといい感じに書き直してください。


定期的にジョブを実行するのには、crond を使用します。

/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthy/

の下に放り込めばよいです。
hourly より細かいスケジュールを組みたい場合は /etc/crontab
に直接記載します。

以下は、 /rpool/share と /rpool/home の下を定期的にバックアップをとっている場合です。


●/etc/crontab に追加する内容

10  *  *  *  *  root     /usr/local/sbin/zfs-autosnap frequent
20  *  *  *  *  root     /usr/local/sbin/zfs-autosnap frequent
30  *  *  *  *  root     /usr/local/sbin/zfs-autosnap frequent
40  *  *  *  *  root     /usr/local/sbin/zfs-autosnap frequent
50  *  *  *  *  root     /usr/local/sbin/zfs-autosnap frequent

● /etc/cron.hourly/zfs-autosnap-hourly の内容
#!/bin/sh

if [ -x /usr/local/sbin/zfs-autosnap ]; then
        /usr/local/sbin/zfs-autosnap hourly
fi

exit 0

● /etc/cron.daily/zfs-autosnap-dailyの内容

#!/bin/sh

if [ -x /usr/local/sbin/zfs-autosnap ]; then
        /usr/local/sbin/zfs-autosnap daily
fi

exit 0

●/etc/cron.weekly/zfs-autosnap-weekly の内容


#!/bin/sh

if [ -x /usr/local/sbin/zfs-autosnap ]; then
        /usr/local/sbin/zfs-autosnap weekly
fi

exit 0

●/etc/cron.monthly/zfs-autosnap-monthly の内容

#!/bin/sh

if [ -x /usr/local/sbin/zfs-autosnap ]; then
        /usr/local/sbin/zfs-autosnap monthly
fi

exit 0

● /usr/local/sbin/zfs-autosnap の内容

#!/bin/sh

date=`date +%Y-%m-%d-%Hh%M`

snapname=zfs-auto-snap_$1-$date


for fs in rpool/share rpool/home
do
        zfs snapshot -r $fs@$snapname
done

if [ -x /usr/local/sbin/zfs-autosnap-cleanup ]; then
    /usr/local/sbin/zfs-autosnap-cleanup $1
fi

exit 0

●/usr/local/sbin/zfs-autosnap-cleanup の内容

#!/bin/sh

frequency=$1

case $frequency in
    frequent) max=6;;
    hourly)   max=24;;
    daily)    max=7;;
    weekly)   max=4;;
    monthly)  max=12;;
    *)        max=999;;
esac

for fs in rpool/home rpool/share
do
    snapshots=$(zfs list -t snapshot | sed -n "s|$fs@\(zfs-auto-snap_$frequency-[^[:blank:]]*\).*|\1|p" | sort)
    nr_snapshots=$(echo $snapshots | wc -w)

    set $snapshots

    while [ $nr_snapshots -gt $max ]
    do
        zfs destroy -r "$fs@$1"
        nr_snapshots=$(( $nr_snapshots - 1 ))
        shift
    done

done

exit 0
のようになっています。

frequently は 10分おきに 6個まで
hourly は 1時間おきに24個まで
daily は1日おきに7個まで
weekly は1週おきに 4個まで
monthly は1ヶ月おきに 12個まで
スナップショットを取っています。
それ以上の数になると、古いものから消えていきます。


スナップショットを表示されると以下のような感じです。

# zfs list -t snapshot

(中略)

rpool/share@zfs-auto-snap_monthly-2013-01-17-03h22                0      -  20.5G  -
rpool/share@zfs-auto-snap_weekly-2013-01-21-03h04                 0      -  20.5G  -
rpool/share@zfs-auto-snap_weekly-2013-01-28-04h00             98.6K      -  20.5G  -
rpool/share@zfs-auto-snap_weekly-2013-02-04-03h26                 0      -  20.5G  -
rpool/share@zfs-auto-snap_daily-2013-02-09-03h19                  0      -  20.5G  -
rpool/share@zfs-auto-snap_daily-2013-02-10-03h21                  0      -  20.5G  -
rpool/share@zfs-auto-snap_daily-2013-02-11-03h35                  0      -  20.5G  -
rpool/share@zfs-auto-snap_weekly-2013-02-11-03h55                 0      -  20.5G  -
rpool/share@zfs-auto-snap_daily-2013-02-12-03h21                  0      -  20.5G  -
rpool/share@zfs-auto-snap_daily-2013-02-13-03h23                  0      -  20.5G  -
rpool/share@zfs-auto-snap_monthly-2013-02-14-03h11                0      -  20.5G  -
rpool/share@zfs-auto-snap_daily-2013-02-14-04h49                  0      -  20.5G  -
rpool/share@zfs-auto-snap_hourly-2013-02-14-14h01                 0      -  20.5G  -
rpool/share@zfs-auto-snap_hourly-2013-02-14-15h01                 0      -  20.5G  -
rpool/share@zfs-auto-snap_hourly-2013-02-14-16h01                 0      -  20.5G  -
rpool/share@zfs-auto-snap_hourly-2013-02-14-17h01                 0      -  20.5G  -
rpool/share@zfs-auto-snap_hourly-2013-02-14-18h01              125K      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-14-19h01             32.0K      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-14-20h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-14-21h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-14-22h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-14-23h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-00h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-01h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-02h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-03h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_daily-2013-02-15-03h41                  0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-04h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-05h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-06h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-07h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-08h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-09h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-10h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-11h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_frequent-2013-02-15-11h50               0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-12h01                 0      -  40.3G  -
rpool/share@zfs-auto-snap_frequent-2013-02-15-12h10               0      -  40.3G  -
rpool/share@zfs-auto-snap_frequent-2013-02-15-12h20               0      -  40.3G  -
rpool/share@zfs-auto-snap_frequent-2013-02-15-12h30               0      -  40.3G  -
rpool/share@zfs-auto-snap_frequent-2013-02-15-12h40               0      -  40.3G  -
rpool/share@zfs-auto-snap_frequent-2013-02-15-12h50               0      -  40.3G  -
rpool/share@zfs-auto-snap_hourly-2013-02-15-13h01                 0      -  40.3G  -

2013年1月20日日曜日

Shared Object 入門

2013年1月10日木曜日

GitHub 覚え書き

2013年1月9日水曜日

perl の eval 〜 if 0 ってなんだ?

perl で書かれたスクリプトの先頭によくある、以下のようなもの。
最初、いったいなんだろう?と思った。
#! /usr/bin/perl -w

eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac'
    if 0;
ここでの eval というのは perl の関数ではなくて、シェルのコマンドであるというのがポイント。
どうもこれは #! を解釈してくれないような環境用の回避策らしい。

もし、このスクリプトが perl で実行されているのなら、
〜 if 0; という形なので(後置のif)
eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac'
の部分はまるまる無視され、何も起きない。そのまま残りのスクリプトを実行します。

一方、このスクリプトがシェルで実行されているのなら、
eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac'
がシェルによって実行されて、 /usr/bin/perl でこのスクリプトを実行し直すことになる。
    if 0;
にはたどり着きません。

perl の文は「;」区切り、シェルスクリプトは「改行」区切りというのをうまく利用しています。
よくもまあこんなことを考えた人がいたもんだ。

2012年12月19日水曜日

zfs のNFS機能を使ってみた

ZFS は NFS をサポートしているので、一応使えることを確認しました。

zfs-fuse ではなくて、以前 「zfsを使ってみた」で説明したように ZFS on Linux をインストールしています。

NFSサーバー側の設定

例えば、 tank/home パーティションを作り、 /export/home にマウントし、さらに NFS で共有という例でやってみます。

パーティションを作る。
# zfs create tank/home

マウントポイントを変更
# zfs set mountpoint=/export/home tank/home

RHEL/CentOS の場合、NFS server は標準でインストールされていると思いますが、もしインストールされていなければ、
# yum install nfs-utils
でインストールします。

nfs サービスが起動していることを確認しておきます。

ただし、設定自体は ZFS のプロパティで行うので、 /etc/exports の編集は不要です。

あとは、以下のような感じで sharenfs オプションを指定します。
# zfs set sharenfs="rw=@192.168.11.2,root_squash"

192.1681.11.2 の部分はクライアント側のIPアドレスに置きかえてください。/etc/hostsのホスト名でもOKです。
どうも no_root_squash がデフォルトになっているらしく、
root_squash の指定をしておかないと、クライアントのroot が サーバー側でもroot扱いになってしまう。
したがって sharenfs=on はセキュリティ上脆弱なので、やめておいた方がよいでしょう。


あとはクライアント側からは、以下のような感じでマウントできます。
# mount -t nfs 192.168.11.1:/export/home /mnt/

一応やってはみましたが、自分は NFSv4 を使いたいので、zfs の NFS機能は使わないかも。

Kerberos の ticket lifetime を変更する

Kerberos のチケットのlifetime を短くするのは簡単にできるのに、長くするのはできないなぁと思っていたら、チケットの有効期限は以下の4つの minimum 値で決まるらしい。

(1) サーバー側(KDC) のkdc.conf
RHEL/CentOSなら
/var/kerberos/krb5kdc/kdc.conf の
[realms]セクションのmax_life 設定。
Ubuntuなら
/etc/krb5kdc/kdc.conf にあります。

(2)クライアント側 の /etc/krb5.conf
[libdefaults] セクションの ticket_lifetime 設定

(3)ユーザープリンシパル の maxlife
kadmin: modprinc -maxlife 3day user01
などで変更

(4)サービスプリンシパルの maxlife
kadmin: modpronc -maxlife 3day krbtgt/MYDOMAIN.COM
などで変更します。



なお、addprinc で新しくプリンシパルを作成した時の maxlife の初期値は
kdc.conf の max_life 設定で決まるようです。