Time Machine で 別のモデルのバックアップからリストアするのは要注意?

13-inch MBP (late 2011) で作った Time Machine のバックアップから、Mac mini (late 2014) へリストアして使っていたのだが、どうにもパフォーマンスが悪い。Chrome で幾つかタブを開いている状態で、さらに新しいタブを開く操作 (⌘-t) を押すと開くまでに数秒かかるなど、ストレスのある状況が続いていた。

ダメ元で一度再セットアップしてみようと思い、Yosemite をインストールしなおしたところ、これまでの症状が嘘のように改善。Mac は Time Machine による移行が簡単なところが売りなんだと思っていたけど、パフォーマンスに関してはやっぱり再セットアップしたほうがいいらしい。

/var/spool/mail/ に届いたメールを処理する方法

概要

cron で処理した結果がメールで送られてくるときに /var/spool/mail/username に届く。mbox 形式で書き込まれて、これは mailx で読んだり消したりできる。だけど、mailx は対話式のプログラムで自動で中身を見て処理したりできない。

メールの数が大量になると(例えば毎分スクリプトを回してたりすると)チェック不能になるし、かといってメールを送らないようにするのはちょっと・・・みたいな時に使えます。

procmail とかで受信時に処理するという手もあると思うけど、今回はまとめてバッチ処理する方法を探してみた。

動作環境は CentOS 7 + Python 2.7。

大雑把な手順

  1. GNU Mailutils の movemail で /var/spool/mail/username を別のディレクトリ(ホームディレクトリ)に移動
    • /var/spool/mail/ はユーザ権限で新しいファイルを作れないので、mbox ファイルを編集するときにロックが取れないという問題があるので、予めメールを移動
  2. mbox を解釈できるライブラリ等を使って mail を解釈して処理
    • 使えるツールはいろいろあると思うが今回は python を使用
    • cron から送られてくるメールに対してテストケースを書いて特定の条件(エラー等)を満たすメールだけを残す、とか特定のファイルに書き出す、とかの使い方を想定

GNU Mailutils のインストール

CentOS のリポジトリにはなさそうだったので公式サイトからダウンロードしてコンパイル・インストール。configure -> make -> make install のいつもの流れで OK。

メール処理スクリプトの例

  • $MAIL が設定されていることを前提(/var/spool/mail/username とかになっているはず)
  • $HOME/mail/INBOX をメールの移動先とした(予め $HOME/mail を作っておく)
  • GNU Mailutils のツールにはパスを通しておく
  • このままは動かないのでご注意
#!/usr/bin/env python

import os
import subprocess
import mailbox

def chkMsg(msg):
    subject = msg["subject"]
    body = msg.get_payload()

    # メッセージの内容によって返り値を変える
    if 削除:
        return 0
    else:
        return 1

mboxpath = os.environ["HOME"] + "/mail/INBOX"
subprocess.call(["movemail", os.environ["MAIL"], mboxpath])

mbox = mailbox.mbox(mboxpath)
to_remove = []
for key, msg in mbox.iteritems():
    if chkMsg(msg) == 0:
        print "Removing: ", key
        to_remove.append(key)

mbox.lock()
try:
    for key in to_remove:
        mbox.remove(key)
finally:
    mbox.flush()
    mbox.close()

subprocess.call(["mail", "-f", mboxpath])

参考

スクリプト言語で環境変数を取得する方法

シェルスクリプト(Bash)

普通の変数と同様に参照すれば良い。

変数が設定されているかどうかの確認:

[ -z "${HOGE+x}" ]

変数の取得:

echo $SHELL

Python

準備:

import os

変数が設定されているかどうかの確認:

os.environ.has_key("SHELL")

変数の取得:

os.environ["SHELL"]

R

変数が設定されているかどうかの確認:

Sys.getenv("SHELL") が "" かどうかをチェックする。

変数の取得:

Sys.getenv("SHELL")

R で igraph を使うための Tips

graph 構造を持つデータの処理をしたくて、R + igraph を使おうと思ったけど、一部ハマったことがあるのでメモ。

igraph は Ubuntu では標準のリポジトリにはないので、R の中で、

install.packages("igraph") 

してインストールする。すると igraph の最新版が入るわけだけど、読み込んで使おうとするとなんか変なエラーで止まってしまう。igraph のページに明示的には書かれていないけど、 Ubuntu でデフォルトのリポジトリで入れられる R のバージョンは古いらしい。

そこで、CRAN が提供している Ubuntu 向けのリポジトリを apt-get の source に追加して、apt-get で R を最新版にアップデートすると無事に使えるようになる。

ちなみに、R でパッケージをインストールする際には、一般ユーザで install.packages() を実行すると、ユーザディレクトリの中にインストールされ、特権ユーザで実行するとシステムにインストールすることができる。

Samba で別サーバで稼働している LDAP を認証に使う方法

Microserver に CentOS 7 を入れてファイルサーバとして使えるようにした。その時に Samba でアクセスできるようにしたかったのだが、LDAP サーバはすでに別のサーバで動かしている。 「Samba LDAP」 とかで調べると、LDAP が動いているサーバで Samba も動かす方法が書いてあったりしてなかなか欲しい情報に辿りつけない。しかも、Samba は Windows の認証の機能(ドメインコントローラとかいうそうな)もあるようで、Active Directory 関連の情報も出てきたりしてさらにわけがわからなくなってくる。つまりはググラビリティが低い。

このサイトこのサイトがかなり参考になる。設定をスムーズに行うために理解しなければならないのは、以下の点と思う。

  1. Samba の認証を LDAP で行うためには、Samba の認証に使う情報を LDAP の各ユーザのエントリに持たせる必要があり、そのためにスキーマの追加が必要。
  2. Samba パスワードを pbdedit や smbpasswd コマンドで変更できるようにするためには、自分の LDAP アカウントを書き換えられるように LDAP サーバのアクセス制御をしておく必要がある。
  3. Unix アカウントのパスワードと、Samba のパスワードは LDAP においては別の Attribute として保持される。Unix アカウントのパスワードと、Samba パスワードを同期させるためには、/etc/smb.conf で
    ldap passwd sync = yes
    

    とすればよいが、これは Samba からパスワードを変更した時に Unix アカウントのパスワードも変更するというものであって、その逆をすると(つまり passwd コマンド等で Unix アカウントのパスワードを変えると)別々のパスワードが設定されることになる。

  4. CentOS 7 でも
    yum install samba-client
    

    とすれば smbpasswd コマンドを使うことができる。

それにしてもディレクトリサービスは複雑すぎる。できることが多いのはわかるけど、もっと扱い易くないと簡単にわけわからんくなってしまうよ。

Yoga Tablet2 で Play Movie の再生ができない、Hangout や Skype での通話時に音声が入力されない問題の解決方法

Lenovo の Yoga Tablet 2 を買ったのだけれど、Play Movie で購入した映画が再生できないという問題があった。これは購入時は Android 4 だったものを Android 5 にアップデートしていた端末。ダメ元で一度初期化したら映画を再生できるようになった。これと同時に通話時の音声が入力されない問題も解決した。

是非ともアップデートがうまくできるように作ってほしい。

HP ProLiant MicroServer N54L 購入

最終ロットの文言に後押しされて買った。
ファイルサーバにして、データ置き場に使う。

FreeNAS とかもいいなと思ったけど、メモリが 4GB しか搭載してなくて要求 8GB に届かなかったのでやめた。とりあえず CentOS 7 をインストールしてみた。

内部 USB ポートに 16GB のフラッシュメモリを挿して、そこに OS をインストール。
それ以外に 3GB SATA HDD を 2 本挿して LVM でミラー。コンパクトな筐体ながらディスクを 4 本も挿せるのがいい。手狭になったら拡張できる。

RAC 付きのモデルを購入したので、Web UI から電源の入/切もできるし、ビデオリダイレクションもできる。値段を考えると素晴らしい。
インターフェース拡張のために RAC を挿してももう一つ PCIe のスロットがあるというのもいけてる。NIC を増設してルータにする、とかもできそう。

CPU は 2 コアで今のところ力不足は感じていない。
メモリも 4GB もあれば十分に感じる。
研究上の実験データをこの中に突っ込んで DB で参照できたりしたら最高だけど、そこまでのスペックではないなぁ、と思ったり。

このモデルはもう販売停止で、後継のGen8 は価格帯が上がっているので、他に新たな安鯖が登場してくれるといいんですが。

OpenVPN client on CentOS 7

CentOS 7 を OpenVPN client にする話。
うまい説明が見つけられなかったのでメモしておく。

tun の場合は openvpn を起動するだけで OK だけど、 tap の場合には openvpn を起動するだけでは繋がらない。
この場合、あらかじめブリッジを作成しておいて (br1とする) 、openvpn が作った tap デバイス (tap1 とする) する。

# brctl addif br1 tap1

とした上で、

# ifconfig tap1 up

とし、 br1 に振った(振られた) IP アドレスで VPN につながるようになる。