ラベル Mac の投稿を表示しています。 すべての投稿を表示
ラベル Mac の投稿を表示しています。 すべての投稿を表示

2015年2月9日

Mac OS X で porg を使って "make install"したソフトを管理する

Porgは「make install」でインストールされるファイルの記録を取り、後で削除したりするのを簡単にするためのソフトです。
以前は Paco と言う名前でしたので、Paco に関する記事を見ると良いです。

"make install"したソフトウェアを管理できる超便利ツール「Paco」 - 元RX-7乗りの適当な日々

こういうのは MacPortsとかHomebrewとかを使うのが普通なのですが、make install も結構してしまうので使うと便利です。

porgのインストール

porg の最新版をダウンロードします。この記事を記述している時点だと「0.7」です。

curl -LO http://downloads.sourceforge.net/project/porg/porg-0.7.tar.gz

Mac で正常に動作させるにはパッチが必要ですのでダウンロードします。

curl -LO https://trac.macports.org/raw-attachment/ticket/46702/adapt-to-osx.patch
curl -LO https://trac.macports.org/raw-attachment/ticket/46702/patch-doubleDESTDIR.diff

コンパイルします。gropというGUIツールを一緒にインストールしようとしますが、わたしは使わないのでdisable しておきます。ためしたい人は gtkmm をインストールすると使えるはずです。

tar xvf porg-0.7.tar.gz
cd porg-0.7

# パッチを当てます
patch -p0 < ../adapt-to-osx.patch
patch -p0 < ../patch-doubleDESTDIR.diff

# disable-grop します
./configure --disable-grop
make
sudo make install

「/usr/local/bin」にインストールされるので PATH を通しておいてください。

動作確認をします。動作確認には、porg に porg 自身を登録します。

sudo make logme
porg -a

「-a」で管理パッケージ一覧が表示できます。無事 porg 自身が表示できていればインストールに問題ないです。
パッチを当てれば Mac でも動作します。

2015/02/09 追記

どうやら上手く追加できない物が結構あるみたいなので確認中。

パッチを追記。

2012年11月6日

アスキーアートロゴを作成してみる

概要

現在「tweepy のAPI 1.1 対応フォーク」を作成している。
変な所が無いか知人に見てもらった時、いくつかの指摘の中で、READMEファイルのアスキーアートロゴに関して質問があった。
そこで、このようなアスキーアートロゴの作成方法に関してメモしておく。

bannerコマンド

Mac OS Xで標準的に利用できるコマンドだと「banner」が存在する。「-w」オプションで幅を指定する。

banner -w 30 Hello

「banner」コマンドは自由度がほとんど無いので、あまり便利ではない。

FIGlet

FIGlet」はこの分野でかなり利用されていると思われる。MacPorts や Homebrew で簡単にインストールできる。

sudo port install figlet

brew install figlet

使い方は簡単。

figlet Hello

フォントの変更も可能なので、参考サイト参照。

FIGletのPython実装「pyfiglet」が存在する。

pip install pyfiglet

pyfigletはモジューで提供されて、コマンドがインストールされない。
以下のようにするとコマンドでも利用できるが、普通は import して利用する物だと思われる。

/path/to/pyfiglet/__init__.py "Hello"

TOIlet

色付きでアスキーアートロゴが生成できる。名前やサイトデザインが結構酷いが、品質に問題はないようだ。
これも MacPorts や Homebrew で簡単にインストールできる。

sudo port install TOIlet

brew install TOIlet

使い方は FIGlet とほとんど同じで、色を付けるパターンが存在している。

参考サイト

以下のサイトが詳しい。

2012年11月5日

pyobjc 2.4 のインストール

概要

Python の Objective-C ブリッジライブラリ「pyobjc」の 2.4 が 2012/11/01 にリリースされたのでインストールメモ。

インストール

以下は pip でのインストール手順。core を先にインストールしないと依存性が解消されないので注意。

pip install -U pyobjc-core
pip install -U pyobjc

ドキュメント

各種ドキュメントは以下にある。

サンプルソース

pip でインストールするとサンプルがインストールされないので、以下のURLから取得する。

サンプルの内容は Mac での Objective-C の知識が無いと意図が理解はできないと思われる。
Python から Objective-C の API が簡単に利用できるというのが便利。

2012年10月17日

プロセス管理に daemontools ではなく Supervisor を利用してみませんか

概要

サーバでは様々なプロセスを実行する必要があるが、これをどう管理するかは悩み所になる。
ここでは強力で柔軟なプロセス管理ツール「Supervisor」に関して記述する。

Supervisorに関して

Supervisor」は Python で記述された、プロセス管理ツール。
プロセス管理ツールと言うと「upstart」や「daemontools」が利用されていると思われる。
「upstart」は強力ではあるが、柔軟性がまだそれほど無いため、高度なプロセス管理はまだ難しい状況だと思われる。
「daemontools」は ノウハウが蓄積されており、強力で柔軟性が高いツールだが、2001年以降公式では更新されておらず、動作が不安定にってしまう環境も存在している。パッチを当てれば良いが、環境によって動作が変化してしまう場合もあり、安心して利用できない状況になってしまった。
Supervisor」は積極的に開発され、非常に安定したツールとなっている。
機能的には「daemontools」とほぼ同様の事が可能。
Python で記述されることで、Unix互換システムにおいて、快適に動作する。当然 Mac でも動作する。
現在の Linux サーバは Python はほぼ必須でインストールされている、という状況なので、ツールが Python で記述されていることは利点の一つになりえる。

Supervisorの利点は以下となる。全機能はマニュアル「Supervisor」を参照。

  • 積極的に開発されている
  • 設定ファイルが比較的簡単
  • プロセスのグループ化が容易
  • プロセスの状態により処理を実行することが可能
  • サブプロセスの管理も可能
  • ログを高度に処理できる
  • Webインターフェースが存在する
  • XMP-RPCインターフェースが存在する

インストール

Supervisorをインストールする場合、通常virtualenvにより環境を構築する。
参考に、以下インストール手順を示した fabfile を配置した。以下のスクリプトはインストールディレクトリは「/opt/python」で、作業ディレクトリは「/opt/supervisor」として記述してある、また、この fabfile はあまり、汎用的には記述していない、あくまで参考である。

実行は「fab install」で実行可能

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from fabric.decorators import task
from fabric.api import (
    sudo,
    run,
    cd,
    put,
    env,
)
from fabric.contrib.files import exists


@task
def install():
    """
    Supervisor
    """
    setup_venv()
    install_supervisor()
    setup_bin()
    setup_conf()
    setup_upstart()


@task
def setup_venv():
    """
    virtualenv による Python 環境構築
    """
    with cd(env.path):
        run('wget https://raw.github.com/pypa/virtualenv/master/virtualenv.py')
        sudo('python virtualenv.py --distribute /opt/python')


@task
def install_supervisor():
    """
    Supervisor インストール
    """
    run('source /opt/python/bin/activate')
    sudo('/opt/python/bin/pip install Supervisor')


@task
def setup_bin():
    """
    実行ファイル設定
    """
    work_dir = '/opt/supervisor/bin'
    if not exists('{0}'.format(work_dir)):
        sudo('mkdir -p {0}'.format(work_dir))
    put('./fabfile{0}/*'.format(work_dir),
        '{0}/'.format(work_dir), use_sudo=True)
    sudo('chown root:root {0}/*'.format(work_dir))
    sudo('chmod 755 {0}/*'.format(work_dir))


@task
def setup_conf():
    """
    設定ファイル
    """
    work_dir = '/opt/supervisor'
    if not exists('{0}'.format(work_dir)):
        sudo('mkdir -p {0}/etc'.format(work_dir))
        sudo('mkdir -p {0}/var/log'.format(work_dir))
        sudo('mkdir -p {0}/var/run'.format(work_dir))

    work_dir = '/opt/supervisor/etc'
    conf_file = '{0}/supervisord.conf'.format(work_dir)
    if not exists('{0}'.format(work_dir)):
        sudo('mkdir -p {0}'.format(work_dir))
    put('./fabfile{0}'.format(conf_file),
        '{0}'.format(conf_file), use_sudo=True)

    work_dir = '/opt/supervisor/etc/supervisor.d'
    conf_file = '{0}/*.conf'.format(work_dir)
    if not exists('{0}'.format(work_dir)):
        sudo('mkdir -p {0}'.format(work_dir))
    put('./fabfile{0}'.format(conf_file),
        '{0}'.format(conf_file), use_sudo=True)


@task
def setup_upstart():
    """
    upstart 設定
    """
    conf_file = '/etc/init/supervisor.conf'
    put('./fabfile{}'.format(conf_file),
        '{0}'.format(conf_file), use_sudo=True)
    sudo('chown root:root {0}'.format(conf_file))

管理用スクリプトの配置

Supervisor をインストールすると、インストール場所の「bin」以下に「supervisord」と「supervisorctl」の2ファイルが生成される。
これを直接利用しても良いが、自分は、一つのサーバで複数のSupervisorを起動する要件が発生する場合があるため、以下のようにスクリプトを作成している。
このスクリプトは実行する Python の指定と、設定ファイルの指定をしているだけだが、用途によっては便利だろう。

以下が「supervisord」と同じ機能のファイル

#!/opt/python/bin/python
# -*- coding: utf-8 -*-
import os
import sys

SRC_DIR=os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
sys.argv.extend(['-c', '{0}/etc/supervisord.conf'.format(SRC_DIR)])

import supervisor.supervisord

if __name__ == '__main__':
    supervisor.supervisord.main()

以下が「supervisorctl」と同じ機能のファイル。

#!/opt/python/bin/python
# -*- coding: utf-8 -*-
import os
import sys

SRC_DIR=os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
sys.argv[1:1] = ['-c', '{0}/etc/supervisord.conf'.format(SRC_DIR)]

import supervisor.supervisorctl

if __name__ == '__main__':
    supervisor.supervisorctl.main(sys.argv[1:])

設定ファイル

設定ファイルの雛形は「echo_supervisord_conf」プログラムによって生成可能。
とりあえず以下のように記述すると最低限の動作はする。「%(here)s」は設定ファイルのあるディレクトリを示す。
「include」の「file」は現在のバージョンではまだ「%(here)s」が使えない。

[supervisord]
childlogdir = %(here)s/../var/log
logfile = %(here)s/../var/log/supervisor.log
logfile_maxbytes = 50MB
logfile_backups = 10
loglevel = info
pidfile = %(here)s/../var/run/supervisor.pid
umask = 022
nodaemon = false
nocleanup = false

[inet_http_server]
port = 127.0.0.1:9001
username =
password =

[supervisorctl]
serverurl = http://127.0.0.1:9001
username =
password =

[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface

[include]
files = /opt/supervisor/etc/supervisor.d/*.conf

upstartの設定

Supervisor自身をSupervisorで管理することはできないので、Supervisorは upstartで管理する。
以下のようなファイルを「/etc/init」以下に「supervisor.conf」として配置する。

description     "supervisor"

start on runlevel [2345]
stop on runlevel [!2345]

respawn

chdir /opt/supervisor
exec sudo -i /opt/python/bin/python /opt/supervisor/bin/supervisord -n -d /opt/supervisor

pre-stop exec sudo -i /opt/python/bin/python /opt/supervisor/bin/supervisorctl stop all

プロセス管理設定

これで Supervisor は起動している。「supervisorctl status」を実行するとまだ管理対象が存在しないことがわかる。
とりあえず、nginx の管理を設定してみる。

管理対象のプロセスはフォアグラウンドで起動させる必要がある。nginx の設定を変更する。

daemon off;

Supervisor の設定ファイルで「include」の「files」で指定したディレクトリに以下のようなファイルを「nginx.conf」のような名前で配置する。

[program:nginx]
command=/opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf
redirect_stderr=true
stdout_logfile=%(here)s/../var/log/%(program_name)s_stdout.log
stderr_logfile=%(here)s/../var/log/%(program_name)s_stderr.log
autostart=true
autorestart=true

ここで注意すべきなのは「%(here)s」は、元設定ファイルのカレントディレクトリになるということ。パスには注意する。
以下のようにすることで、有効になる。

# 設定読み込み
supervisorctl reread
# 設定反映
supervisorctl update
# 確認
supervisorctl status

設定を反映するまでは、有効にならない。

以下のように、起動、終了、再起動が可能。

supervisorctl stop nginx
supervisorctl start nginx
supervisorctl restart nginx

「autostart=true」を設定しているので、Supervisor が起動すると自動起動する。
「autorestart=true」を設定しているため、異状終了しても管理対象プロセスは復旧してくる。kill などして、確認してみると良い。

Webインターフェース、XML-RPC

SupervisorはHTTPのWebインターフェエースをもっている。また XML-RPC による管理も可能。
HTTPSを利用したい場合は、nginx などの HTTPサーバを経由させれば良い。
上の設定ファイルを利用している場合はポート9001になる。

その他機能

他の機能はマニュアルを読むのが良い。機能は高機能なので、いろいろできる。

2012年10月11日

RRDtool の使い方

概要

RRDtool」は時系列データを高速にロギングしたり、グラフ化するためのオープンソースのツール。
Munin」等のツール経由で利用する機会が多い。
ほとんどコマンドラインから利用しないので使い方をちゃんと調べた事がなかったのだけど、Munin で高度なグラフが必要になる機会が増えてきたので、ちゃんと調査してみることにした。

インストール

Mac であれば MacPorts なり homebrew なりでインストールするのが楽。この記事を書いている時点では「1.4.7」がインストールされる。

# MacPorts
port install rrdtool
# homebrew
brew install rrdtool

記録用ファイル作成

最初に記録用のファイルであるRRD(Round Robin Database)を作成する。
「rrdtool」コマンドを利用する。ファイルの作成は「rrdcreate」を参照すると詳細が記述されている。

rrdtool create filename \
        [--start|-b start time] \
        [--step|-s step] \
        [--no-overwrite] \
        [DS:ds-name:DST:dst arguments] \
        [RRA:CF:cf arguments]

コマンドの引数は以下。

  • filename:ファイルの名前。通常拡張子を「rrd」にするが、特に拡張子は関係ない。
  • --start:記録開始とする時刻。指定しないと、RRDファイル作成時間の10秒前に設定される。
  • --step:RRDファイルへの記録間隔。指定しないと300秒(5分)に設定される。
  • --no-overwrite:同じファイル名があったら上書きしない。
  • DS:データソース(data sources)の定義。複数定義でき、一定義がグラフ画像を生成する時の一つの線になる。
    • ds-name:参照用のデータソース名。1文字以上19文字以下で、[a-zA-Z0-9_]で定義する
    • DST:データソースのタイプ(Data Source Type)定義。(DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max もしくは DS:ds-name:COMPUTE:rpn-expression)
      • GAUGE:取得した値をそのまま記録
      • COUNTER:前回の記録に加算していく。減算は考慮されていない。そのため、いつかオーバーフローするが、適切に処理される。
      • DERIVE:前回との差を記録。オーバフローは考慮されない。マイナス値もありえる。
      • ABSOLUTE:読み取るごとに0になる、もしくは0にしたい場合で、マイナスにならない物を記録。
      • COMPUTE:計算式を記述して、その結果を記録
    • arguments(heartbeat:min:max もしくは rpn-expression)
      • heartbeat:指定秒数を越えてデータが取得できない場合、UNKNOWNと記録する
      • min or max:必須ではない。最大値、最小値を定義。不明な場合は「U」を記述。最大最小が判明している時は明記すること。
      • rpn-expression:逆ポーランド記法の数式。COMPUTEの時のみ利用可能。
  • RRA:RRDへのRRA(round robin archives)の保存定義。(RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows)
    • CF:統合関数(consolidation function)
      • AVERAGE:平均
      • MIN:最小
      • MAX:最大
      • LAST:最後
    • xff:統合関数の結果、UNKNOWNがどの程度だったら、UNKNOWNにするかを定義。0から1の間の数を指定。0.5だと半分以上がUNKNOWNだと結果をUNKNOWNにする。
    • steps:統合関数にて統合するステップ数
    • rows:記録するレコード数

コマンドの引数は、実際の例を見た方が速いかもしれない。サンプルとして「load average」を取得してみる。

rrdtool create load.rrd \
    --step 300 \
    DS:load1:GAUGE:600:0:U \
    DS:load5:GAUGE:600:0:U \
    DS:load15:GAUGE:600:0:U \
    RRA:AVERAGE:0.5:1:600 \
    RRA:AVERAGE:0.5:6:700 \
    RRA:AVERAGE:0.5:24:775 \
    RRA:AVERAGE:0.5:288:797 \
    RRA:MAX:0.5:1:600 \
    RRA:MAX:0.5:6:700 \
    RRA:MAX:0.5:24:775 \
    RRA:MAX:0.5:288:797 \
    RRA:MIN:0.5:1:600 \
    RRA:MIN:0.5:6:700 \
    RRA:MIN:0.5:24:775 \
    RRA:MIN:0.5:288:797

この例だと以下のようになる。

  • 「load.rrd」というファイル名
  • 1ステップ5分
  • 「load average」は1分、5分、15分の3つの値があるので、DSをその数定義。
  • Daily用に、1ステップを600個、つまり5分×600個なので、50時間(2日2時間)の平均、最小、最大を保存
  • Weekly用に、6ステップを700個、つまり5分×6×700個なので、350時間(2日2時間×7)の平均、最小、最大を保存
  • Monthly用に、24ステップを775個、つまり5分×24×775個なので、1550時間(2日2時間×31)の平均、最小、最大を保存
  • Yearly用に、288ステップを797個、つまり5分×288×797個なので、18600時間(2日2時間×372=31×12)の平均、最小、最大を保存

Dailyは前々日ぐらいまでと比較したいので、50時間にしてある。48時間ぴったりだと同時刻が上手く比較できないため2時間を加算。
この50時間を単位として、週、月、年を定義してある。
週は7倍、月は31倍、年は31×12倍になるように定義。この定義で2年間はデータが記録可能ということになる。

データの記録

実際にデータを記録する。データ記録は「rrdupdate」を参照すると詳細が記述されている。

今回は「load average」を取得してみる。Mac で load average を取得する場合は以下のコマンドで可能。

uptime | awk -F\  '{print $(NF - 2)":"$(NF - 1)":"$NF}'

rrdtoolで記録する場合は時刻と同時に記録するように作成。

rrdtool update load.rrd \
    --template load1:load5:load15 \
    `date +%s`:`uptime | awk -F\  '{print $(NF - 2)":"$(NF - 1)":"$NF}'`

cron 等でしばらく動作させておく。step が 300 に指定してあるが、それより短い時間で記録してもそれなりに処理する。

記録内容の確認

内容確認は「fetch」を利用する。「rrdfetch」を参照すると詳細が記述されている。

rrdtool fetch load.rrd AVERAGE

グラフ画像の生成

グラフ生成は「graph」を利用する。「rrdgraph」を参照すると詳細が記述されている。
グラフの色は自動ではないので、自分で考える必要がある。

rrdtool graph load.png \
    --title "Load Average" \
    --vertical-label "Load Average" \
    --width 500 \
    --upper-limit 10.0 \
    --lower-limit 0 \
    --rigid \
    --imgformat PNG \
    DEF:load1=load.rrd:load1:AVERAGE \
    DEF:load5=load.rrd:load5:AVERAGE \
    DEF:load15=load.rrd:load15:AVERAGE \
    LINE1:load1#00FF00:"CPU Usage 1" \
    GPRINT:load1:LAST:"cur\: %2.2lf /" \
    GPRINT:load1:AVERAGE:"ave\: %2.2lf /" \
    GPRINT:load1:MAX:"max\: %2.2lf /" \
    GPRINT:load1:MIN:"min\: %2.2lf\n" \
    LINE2:load5#0000FF:"CPU Usage 5" \
    GPRINT:load5:LAST:"cur\: %2.2lf /" \
    GPRINT:load5:AVERAGE:"ave\: %2.2lf /" \
    GPRINT:load5:MAX:"max\: %2.2lf /" \
    GPRINT:load5:MIN:"min\: %2.2lf\n" \
    LINE3:load15#FF0000:"CPU Usage 15" \
    GPRINT:load15:LAST:"cur\: %2.2lf /" \
    GPRINT:load15:AVERAGE:"ave\: %2.2lf /" \
    GPRINT:load15:MAX:"max\: %2.2lf /" \
    GPRINT:load15:MIN:"min\: %2.2lf\n"

まとめ

とりあえず、グラフまで生成できるようになったが、オプションが一部の動作が良くわかっていないので、さらに細かい事項は使いながら調べることにする。

参考資料

いくつかの資料を参照した。本家のチュートリアルはそれなりに説明されているが、わかりずらい気がする。

2012年9月24日

Mac OS X で クロスプラットフォームGUIツールキット Qt を利用してみる

2012/09/24 21時ごろ修正

概要

Qt(キュート)」はノキア digia が開発している、クラスプラットフォームなGUIツールキット。
ライセンスは「GPL」と「LGPL」から選択できる。
Linux で GUI アプリを作成する場合、GTK か Qt を利用することが多い。GTK は Mac 上だといまいちなので、Qt を Mac 上で利用方法を簡単にメモしておく。

注意点

最初からちょっとがっかりだが、Qt は Mac OS X 10.8 Mountain Lion にまだ完全対応していない。10.8対応はもうしばらく待つ必要がある。 4.8.3 から Mac OS X 10.8 に対応した。

インストール

Download Qt for Open Source C++ development on Mac OS X — Qt - A cross-platform application and UI frameworkQt Developer Network」から最新版 dmg をダウンロードする。この記事を書いている時点では「4.8.2」 記事修正時点での最新版は「4.8.3」。

インストール場所の確認

以下のように様々な物がインストールされる。

  • Qt Creator, Qt Designer, Qt Linguist:「/Developer/Applications/Qt」
  • Qt Documentation:「/Developer/Documentation/Qt」
  • Qt Examples:「/Developer/Examples/Qt」
  • Qt Plugins:「/Developer/Applications/Qt/Plugins」
  • Qt Frameworks:「/Library/Frameworks」
  • Qt Libraries:「/usr/lib」
  • qmake, moc, uic, etc.:「/Developer/Tools/Qt (symlink to /usr/bin)」
  • Uninstall script:「/Developer/Tools/uninstall-qtsdk.py」

ドキュメント

Getting Started Programming with Qt | Documentation | Qt Developer Network」とか「Qt Creator」とかを見るとアプリの作成方法が書いてある。

動作確認

動作確認のために簡単なアプリを作成してみる。
Qt Creatorを使うのが本来は簡単だが、ここではソースからビルドしてみる。
以下のようなソースを書く。

#include <QApplication>
#include <QTextEdit>

int main(int argv, char **args)
{
    QApplication app(argv, args);

    QTextEdit textEdit;
    textEdit.show();
    return app.exec();
}

ビルド、起動は Terminal で以下のようにする。

qmake -project
qmake
xcodebuild
open build/Release/sample.app

以下のようにウィンドウが起動する。
文字は後で入力している。
Qt sample

まとめ

簡単にインストールと使い方だけ書いた。
さらに詳細を知りたい場合は、本家のドキュメントがかなり充実しているので、そちらを見ると良い。

2012年9月22日

Mac OS X で OpenCV 2.4.2 を Python サポート付きでソースからコンパイルする(簡易メモ)

概要

Mac OS X で OpenCV をソースからコンパイルする簡易メモ。

cmake 、その他インストール

CMake - Cross Platform Make」から cmake をダウンロードしてインストールしておく。
OpenCVは依存が結構あるので、「Mac_OS_X_OpenCV_Port - OpenCV Wiki」あたりを参考に入れておく。

Python と numpy のインストル

Python は 自分が利用するバージョンのPython をインストールし、numpy をインストールしておく。

OpenCVのコンパイル

Pythonサポートを正常にコンパイルするには Python 関連のパスを指定して cmake した方が良い。

curl -L http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.2/OpenCV-2.4.2.tar.bz2/download -o OpenCV-2.4.2.tar.bz2
tar xvfj OpenCV-2.4.2.tar.bz2
cd OpenCV-2.4.2
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D BUILD_NEW_PYTHON_SUPPORT=ON \
      -D PYTHON_EXECUTABLE=/path/to/bin/python2.7 \
      -D PYTHON_LIBRARY=/Library/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib \
      -D PYTHON_INCLUDE_PATH=/path/to/include/python2.7 .
make -j2

わたしは都合によりOpenCVを複数バージョン使い分ける必要が出る場合があるので、make install しない。

PYTHONPATHを通す

Python から利用するために、cv2.so があるディレクトリにPYTHONPATH を通す。

export PYTHONPATH=$PYTHONPATH:/path/to/OpenCV-2.4.2/lib

確認

Python を起動して「import cv2」で、import が正常に動作するか確認。「help(cv2)」等してみると良い。

2012年9月19日

Mac OS X で数式(mathematical expression)作成環境構築

概要

数学の勉強をしている場合、Keynote とか Evernote とかに数式を書くために、コンピュータ上で数式を作成したくなる場合がある。
ここでは綺麗な数式を作成するための、数式作成環境を構築する。

LaTeXiTのインストール

Mac OS X で数式作成する場合、「LaTeXiT」を使うと簡単。
ダウンロードしてdmgの中にある「LaTeXiT.app」を「アプリケーション」フォルダに移動。

LaTeXのインストール

LaTeXiT は数式生成に LaTeX のコマンドを利用するので、LaTeX をインストールする。

JIS X0212 for pTeX」から「Drag & Drop UpTeX(UTeX20111010.dmg)」と「ESP Ghostscript 7.07.1(espgs090829.dmg)」をダウンロードする。
「Drag & Drop UpTeX」のdmbの中に「UpTeX.app」があるので、「アプリケーション」フォルダに移動。
「ESP Ghostscript」は「ESPGhostscript.pkg」があるので、これをダブルクリックしてインストール。

X11のインストール

LaTeXiT が利用する gs コマンドが X11 を要求するので、「XQuartz」から dmg をダウンロードし、中にある「XQuartz.pkg」をダブルクリックしてインストールする。

LaTeXiTの設定

LaTeXiT.appを起動する。
LaTeX関連ファイルが見付からないダイアログが出るが、とりあえず全部キャンセル。
Latexit start

「環境設定」の「プログラム」でパスを設定する。
Latexit setting

  • pdfLaTeX:「/Applications/UpTeX.app/teTeX/bin/pdflatex」
  • Ghostscript(gs):「/usr/local/bin/gs」
  • ps2pdf:「/usr/local/bin/ps2pdf」
gs を設定する際に X11 を要求された場合、「アプリケーション」「ユーティリティ」の中に「XQuartz.app」が存在するか確認。存在しない場合は X11のインストールをする。

数式を生成してみる

「y=f(x)」のような簡単な数式を入力して、「LaTeX it!」ボタンを押すと、設定に問題なければ、数式が生成される。
Latexit
数式の部分をドラッグ&ドロップすると保存できる。保存のフォーマットも選択可能。

まとめ

あとは、LaTeXの数式表現を覚える必要がある。
LaTeXの数式はかなり高度な数式を簡単に記述できるし、かなり将来まで使える知識なので、勉強しておいて損はない。

2012年9月3日

ps の出力を grep する時「grep -v grep」しないで grep 自身のプロセスを取り除くには "[プ]ロセス名"

概要

psの出力をgrepする場合、grep 自身が含まれる。取り除く場合「grep -v grep」を利用するが他の方法もある。

"[プ]ロセス名"

zsh のプロセスを grep する場合は以下のようにする。

ps aux | grep "[z]sh"

簡単な解説

[ ] は囲まれた文字のリスト中の一文字にマッチする。
「grep "[z]sh"」とダブルクォートで囲み[ ]を使うことで grep の プロセスは「grep "[z]sh"」になる。
実際のプロセスの検索は「z」一文字と「sh」という意味で検索されるため、grep のプロセスは一致しなくなる。

課題

これは手で grep する時用な気がしている。スクリプトの中で grep 対象が変数に格納されている場合は「grep -v grep」の方が書くのは楽。

元ネタ

結構昔から利用しているので元ネタはすっかり忘れたが、おそらく元ネタはこのあたり。ps -ef | grep hoge | grep -v grep ではなく、ps -ef | grep [h]oge - hogehoge @teramako

2012年9月2日

OS X で tmux のバッファをクリップボードでも使う

概要

OS X で tmux を利用していると tmux のバッファをクリップボードでも使いたくなる。 tmux の標準機能にはないので、設定する。

設定

OS X の tmux のバッファをクリップボードでも使えるようにするソースがGitHubで開発されている。
ChrisJohnsen/tmux-MacOSX-pasteboard · GitHub

マニュアル通りにコンパイルしても良いが MacPorts や homebrew でもインストールできる。

MacPortsの場合

sudo port install tmux-pasteboard

homebrewの場合

brew install reattach-to-user-namespace

tmux.confは以下のように記述する。

set -g default-command "reattach-to-user-namespace -l zsh"
unbind ^y
bind ^y run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
unbind ^p
bind ^p run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"

残課題

この設定だと Mac と Linux で tmux.conf を共有する場合は工夫しないとだめそう。

2012年8月14日

TextMate がオープンソースとして公開

gitbubで公開されている。https://github.com/textmate/textmate
ライセンスはGPL2

#37 の pull Request が 一部で話題になっていた。
Pull Request #37: Fix many bugs by ieure · textmate/textmate · GitHub
バグらだけ、という pull Request で、Emacs24.1のソースコードで入れかえる、という一種のネタ。
まあ、あまり良い行為ではないと思うが、明確にネタだとわかるから許容範囲かな。

2012年7月30日

dyld: DYLD_ environment variables being ignored because main executable (/usr/bin/sudo) is setuid or setgid

Mountain Lion で bashrc や zshrcに「export DYLD_LIBRARY_PATH」が書いあると sudo する時に警告が出る。
バグの模様。


追記

「export DYLD_LIBRARY_PATH」の設定が必要な人には正当な対応策は存在しない。 無理矢理回避する方法はあるが、それほど意味がないので、無視するのが良いと思われる。

2013年12月29日追記

Mac OS X 10.9 Mavericks ではこの問題は解決しています。

2011年11月5日

Mac OS X 10.7(Lion) でコンパイル中に error: stdarg.h: No such file or directory でコンパイルが停止した場合の対処(暫定)

現象

コンパイル中に「error: stdarg.h: No such file or directory」のエラーが発生してコンパイルが停止することがあります。これに対して対処します。

原因

コンパイル対象が gcc-4.2 に対応していないのが原因。Lion でインストールする XCode4.2 は gcc-4.2 しかインストールされないが、これに対応していない。

対処方法1

根源的に対処するのはMakefile等を修正する必要があるかもしれません。これはとりあえず暫定的な対処になります。

コンパイラを gcc でなく clang に変更するとコンパイルが通る場合があります。

export CC=/usr/bin/clang

対処方法2

gcc-4.0 をインストールしてしまう手もあります。
XCode3をインストールすれば gcc-4.0 をインストールすることが可能です。以下のサイト等を参考にすればインストールできるでしょう。
LionにXcode3をインストールする | Smartphone-Zine

2011年8月3日

企業で Apple ソフトウェア(Mac OS X Lion など)を大量導入(20以上)する場合 はボリュームライセンスが存在する

Mac OS X Lion などを企業で大量に購入する必要があり場合、Appleソフトウェアボリュームラインセンスが利用できる。
ボリュームライセンスの詳細は以下から見ることができる。
アップル - Mac - Appleソフトウェアボリュームライセンス
20ライセンス以上でないと購入できないという制限はあるが、纏め買いできるので、企業での大量アップデートなどに利用できる。
Apple Online Sotre を利用して購入することができるので結構手軽だと思われる。

2010年5月16日

Mac OS X におけるファイル名に関するメモ(NFC, NFD等)

Mac OS X で ファイルシステムのフォーマットに HFS+ を利用している場合、ファイル名の取り扱いが、 Windows や Linux と異なります。

具体的には濁点や半濁点の扱いが異なります。これは Unicode の正規化に関係しています。

「Unicode の正規化」とは簡単に言うと、どの文字を同じ文字として処理するか、という問題への対処で、「が」を「が」として扱うか「か + ゛」として扱うか、ということです。 「Unicode の正規化」を実施することで「が」で入力されても、「か + ゛」で入力されても、どちらか一方に統一して、同じ文字として扱えるようにします。

こうした正規化形式には4種類存在します。

  • Normalization Form D(正規化形式 D, NFD)
  • Normalization Form C(正規化形式 C, NFC)
  • Normalization Form KD(正規化形式 KD, NFKD)
  • Normalization Form KC(正規化形式 KC, NFKC)

D が Decomposition(分解)、C が Composition(合成)、KがCompatibility(互換性) を意味するようです。つまり NFC が文字を合成側に正規化し、NFD が文字を分解側に正規化します。

Windows や Linux は NFC で正規化されていると考えらますが、動作的には積極的に正規化した結果で NFC になっているのではなくて、合成済みの文字のみしか扱かわないので偶然 NFC になっているように見えます。

Mac の場合は積極的にファイル名に NFD を利用して正規化を実施します。ただし Mac の 正規化は NFD と同じではないため、単純ではありません。NFD の仕様で正規化対象になるべき文字の一部が正規化対象になっていません。

その結果 Mac のファイル名の正規化関しては「UTF-8-MAC」(iconv)や「UTF-8-HFS」(Emacs)等の呼称で扱われています。

ファイル名の正規化は様々な問題を引き起しますが、各アプリケーションで対応されていたりいなかったりします。

Samba は対応されていますが、 PHP や Subversion 等は標準では NFD に対応していません。

Subversion 等のバージョン管理システムを利用して共同作業を実施すると、濁点半濁点を含むファイル名が存在すると別のファイルとして管理されてしまいます。一番簡単なのは処理する時に一時的に NFC にしてしまうことのようです。

MacPorts を利用している場合は、以下のようにインストールするとパッチがあたった Subversion がインストールされます。

port install subversion +unicode_path

Emacs は 23.2 から「ucs-normalize.el」という Mac のファイル名正規化等を扱うためのプログラムが追加されたため、以下のような設定をすることで対応可能です。

(require 'ucs-normalize)
(setq file-name-coding-system 'utf-8-hfs)
(setq locale-coding-system 'utf-8-hfs)

PHP などで作成されたアプリケーションは独自で対応するしかまだ方法がないようです。

今後改善されるかは不明です。

参考資料

2009年11月18日

Mac OS X での Universal Binary で ライブラリ非対応 architecture のバイナリを生成しない方法

例えば Python の easy_install や MacPorts、Fink等の自動インストール系ツールを利用した場合以下のようなエラーが発生することがあります。

ld: warning: in //usr/lib/bundle1.o, missing required architecture ppc64 in file
ld: warning: in //usr/lib/libgcc_s.10.5.dylib, missing required architecture ppc64 in file
ld: warning: in //usr/lib/libSystemStubs.a, missing required architecture ppc64 in file
ld: warning: in //usr/lib/libSystem.dylib, missing required architecture ppc64 in file
ld: symbol dyld_stub_binding_helper not defined (usually in crt1.o/dylib1.o/bundle1.o) for architecture ppc64

これはリンクしようとしているライブラリが ppc64 に対応していないにもかかわらず、ppc64対応バイナリを生成しようとするために発生しています。

この場合は 環境変数に ARCHFLAGS を設定することで回避します。

export ARCHFLAGS='-arch i386 -arch x86_64 -arch ppc'

リンクするライブラリによっては当然 ppc 非対応だったりするため ARCHFLAGS の内容を変更してください。

2009年11月11日

Mac OS X 10.6 で Goをコンパイルして動作させてみた

Google が 11/10 に新言語 Go を発表したので取り敢えず動作させてみました。

難しいことはなにもない。とりあえず 32bit でコンパイルしたけど、64bitでもコンパイル可能です。テストが一部通過しない物があるみたいですが、後で調べます。

以下の手順でコンパイルと動作確認しました。ソースの取得には Mercurial が必要です。

export GOROOT=/path/to/go
export GOOS=darwin
export GOARCH=386
hg clone -r release https://go.googlecode.com/hg/ $GOROOT
cd $GOROOT/src
./all.bash
cat >hello.go <<EOF
package main
import "fmt"
func main() {
   fmt.Printf("hello, world\n")
}
EOF
8g hello.go
8l hello.8
./8.out

この他にも基本的な物を動作させてみたけど、文法は簡単ですしライブラリもそれなりにあります。

言語的には Limbo とかの影響下にあるように見えるけど、まだちゃんとさわってないので不明です。

2009年9月23日

Cyberduck 3.3b3 が起動するけどウィンドウが出ない件

2009/09/21にリリースされた Cyberduck 3.3b3 ですが Snow Leopard 利用者がアップデートすると起動はするけれどもウィンドウが表示されません。

Cyberduck の beta 版は http://update.cyberduck.ch/beta/ 以下に置いてありますので、ウィンドウが表示されない人は、 3.3b2 等の旧バージョンを取得して上書きすると良いでしょう。

原因ですがバグで現在 nightly build で修正されていますので次のリリースでは問題ないでしょう。

2009/10/12追記:2009/10/09にリリースされた Cyberduck 3.3b4 にてこの問題は解消されています。
一部の人が 3.3b4 を起動すると接続先に接続しに行く問題(?)が発生しているようですが、設定を確認してください。
環境設定の「一般」に「接続先を記憶し、再起動後に接続」という設定が存在しますので、チェックを外してください。

2009年9月12日

Snow Leopard で mod_wsgi を設定する

Snow Leopard で mod_wsgiをコンパイルして動作させてみます。

curl -O http://modwsgi.googlecode.com/files/mod_wsgi-3.0c4.tar.gz
tar xvfz mod_wsgi-3.0c4.tar.gz
cd mod_wsgi-3.0c4
./configure

もし Python2.6.2 を独自インストールしている場合は Makefile の修正が必要です。以下の修正を実施しないと、デフォルトでインストールされている 2.6.1 の方を参照しようとします。

--- Makefile.org        2009-09-12 20:35:02.000000000 +0900
+++ Makefile    2009-09-12 20:35:44.000000000 +0900
@@ -20,8 +20,8 @@

 CPPFLAGS =  -I/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -DNDEBUG
 CFLAGS =  -Wc,'-arch x86_64' -Wc,'-arch i386' -Wc,'-arch ppc7400'

-LDFLAGS =   -L/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/config  -arch x86_64 -arch i386 -arch ppc7400
-LDLIBS =  -lpython2.6 -ldl
+LDFLAGS =   -L/Library//Frameworks  -arch x86_64 -arch i386 -arch ppc7400
+LDLIBS =  -framework Python -ldl

 all : mod_wsgi.la

コンパイルしてインストールします。

make
sudo make install

Apache の設定ファイルにモジュール設定を記述します。特にこだわりがないなら「/etc/apache2/httpd.conf」に追加してください。

LoadModule wsgi_module libexec/apache2/mod_wsgi.so

Trac を wsgi で動作させてみます。

「/Users/ユーザ名/Sites/trac/index.wsgi」として以下のようなファイルを作成します。

import sys
sys.stdout = sys.stderr

import os
os.environ['TRAC_ENV_PARENT_DIR'] = "/path/to/trac"
os.environ['PYTHON_EGG_CACHE'] = '/path/to/trac/eggs'

os.environ["HGENCODING"] = "UTF-8"

import trac.web.main

application = trac.web.main.dispatch_request

「/private/etc/apache2/other」以下に「wsgi.conf」のファイル名で以下のようなファイルを作成します。

WSGIScriptAlias /trac /Users/ユーザ名/Sites/trac/index.wsgi


<Directory /Users/ユーザ名/Sites/trac>
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>

設定ファイルの文法が正しいことをチェックします。

apachectl configtest

Apache を再起動します。

sudo apachectl restart

「http://localhost/trac」にアクセスして動作が確認できれば成功です。

Snow Leopard を上書きインストールした場合の fink の update 手順

以下の手順は 32bit モードで起動している場合の手順です。

  • 「/sw/etc/fink.conf」ファイルを開いて末尾に「NoAutoIndex: true」を追加
  • sudo fink index -f
  • sudo fink reinstall fink
  • sudo fink update fink
  • sudo fink install perl588-core

必要に応じて設定を変更します。設定の変更は以下のコマンドで実施します。

  • sudo fink configure

パッケージに関してはテストがまだ完全ではないため一部は上手く動作しない物も存在しますが徐々に対応されるでしょう。