2016年4月8日

タイトル変更

タイトル変更しました。
ついでに、一部bootstrapを利用してレイアウト崩れを防ぐようにしてみました。
記事はまた思いついた時にでも投稿してみます。

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 追記

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

パッチを追記。

2015年2月7日

github から https 経由の clone 時にエラーが発生する場合の対処

github で git clone 等を実施した時に以下のようなエラーが発生した場合の対処。

fatal: unable to access 'https://github.com/xxxx/yyyy': SSL certificate problem: Invalid certificate chain

キーチェンアクセスの確認

「アプリケーション」->「ユーティリティ」->「キーチェンアクセス」を起動。

「システムルール」の中から「DigiCert High Assurance EV Root CA」を探して「有効期限」を確認します。

おそらく有効期限が切れていると思います。

証明書の更新

以下のサイトにアクセスします。
https://www.digicert.com/digicert-root-certificates.htm#roots

「DigiCert High Assurance EV Root CA」の「Download」リンク先を「右クリック」で保存してください。リンクを単純にクリックすると、ブラウザにインストールしようとしていまい、エラーが出てしまうので注意。

ダウンロードできた「crt」ファイルをダブルクリックすると、証明書が更新されます。有効期限が更新された事を確認してください。

git clone を実施して、問題ない事を確認してください。

以上です。

2013年4月22日

Tumblr API v2 を利用する

概要

TumblrのAPIを突然利用したくなったので、利用方法をメモする。

OAuth Key の取得

API を利用するには Twitter 等と同様 アプリケーションを登録して OAuth Keyを取得する必要がある。
プリの登録は、「http://www.tumblr.com/oauth/apps」で行なう。

Tumblr Register application

「Register application」ボタンで登録。

Tumblr reg app name

「Application name」、「Administrative contact email」、「Default callback URL」が必須なので入力する。
登録内容は後でも変更できる。callback URL はとりあえず自分のサイト等にしておけば良い。

登録が完了すると、「OAuth Consumer Key」、「Secret Key」が取れる。

クライアントアプリケーション作成

クライアントアプリケーショを作成する。
Python で rauth を利用して認証と表示までしたサンプルが以下。実際に利用する場合は「OAuth Consumer Key」、「Secret Key」を自分の物に変更する。
rauth は OAuth を簡単に処理する外部ライブラリでかなり便利。「pip install rauth」などであらかじめインストールしておくこと。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import unittest

import os
import re
import webbrowser
from ConfigParser import SafeConfigParser

from rauth import OAuth1Service


class TumblrClientTest(unittest.TestCase):
    """
    Tumblr クライアントサンプルテスト
    """

    def test_sample(self):
        """
        テスト
        """
        client = TumblrClient()

        # sessin の取得
        session = client.get_session()

        # user/info 取得
        response = session.get('user/info').json()
        self.assertEqual(response['meta']['status'], 200)
        self.assertEqual(response['meta']['msg'], 'OK')

        # blog/info 取得
        path = 'blog/scipsy.tumblr.com/info?api_key={api_key}'
        response = session.get(path.format(
            api_key=client.get_api_key())).json()
        self.assertEqual(response['meta']['status'], 200)
        self.assertEqual(response['meta']['msg'], 'OK')
        self.assertEqual(response['response']['blog']['name'], 'scipsy')


class TumblrClient(object):
    """
    Tumblr クライアントサンプル
    """
    def get_api_key(self):
        """
        API key = OAuth Consumer Key
        """
        return 'OAuth Consumer Key'

    def get_consumer_secret(self):
        """
        Secret Key
        """
        return 'Secret Key'

    def get_session(self):
        """
        session の取得
        """
        # 設定ファイルのパス
        config_file = os.path.abspath(os.path.join(
            os.path.dirname(__file__), 'tumblr.cfg'))

        tumblr = OAuth1Service(
            name='tumblr',
            consumer_key=self.get_api_key(),
            consumer_secret=self.get_consumer_secret(),
            request_token_url='https://www.tumblr.com/oauth/request_token',
            access_token_url='https://www.tumblr.com/oauth/access_token',
            authorize_url='https://www.tumblr.com/oauth/authorize',
            base_url='https://api.tumblr.com/v2/')

        if os.path.exists(config_file):
            # 設定ファイルが存在する場合、設定ファイル読み込み
            config = SafeConfigParser()
            config.read(config_file)

            access_token = config.get('account', 'access_token')
            access_token_secret = config.get('account', 'access_token_secret')

            session = tumblr.get_session((access_token, access_token_secret))
        else:
            # 設定ファイルが存在しない場合、初回認証
            session = self.auth(tumblr)

            # 設定ファイル出力
            config = SafeConfigParser()
            sec_name = 'account'
            config.add_section(sec_name)
            config.set(sec_name, 'access_token', session.access_token)
            config.set(sec_name, 'access_token_secret',
                       session.access_token_secret)
            with open(config_file, 'wb') as configfile:
                config.write(configfile)

        return session

    def auth(self, tumblr):
        """
        ブラウザでの初回認証
        """
        request_token, request_token_secret = tumblr.get_request_token()
        authorize_url = tumblr.get_authorize_url(request_token)
        print '表示されたURLをブラウザで開きます: ' + authorize_url
        webbrowser.open(authorize_url)

        authed_url = raw_input('ブラウザアドレスバーのURLをペースとしてください: ')
        verifier = re.search(r'\oauth_verifier=([^#]*)', authed_url).group(1)

        # session 取得
        session = tumblr.get_auth_session(
            request_token,
            request_token_secret,
            method='POST',
            data={'oauth_verifier': verifier})

        return session

if __name__ == '__main__':
    unittest.main()

正しく認証されていると、設定画面の「Apps」に登録したアプリが表示される。

Tumblr apps

API のドキュメント

公式 APIドキュメントが「http://www.tumblr.com/docs/en/api/v2」に存在するので、あとは必要な物を利用するだけ。

2013年4月2日

matplotlib 1.2.1 コンパイル時に Tk 8.5 must be compiled with tcl.h from Tcl 8.5 のエラー

現象

「Tk 8.5 must be compiled with tcl.h from Tcl 8.5」のエラーは Tcl 8.4 と 8.5 が同居している場合に発生する。
Mac OS X の場合、MacPorts や Homebrew、ActiveTck なんかをインストールしている環境で発生しやすい。
Linux 系の場合、パスの設定が変になっている可能性がある。

対処

Mac OS X の場合は、tkagg を利用しないのが一番簡単だと思う。
setup.cfg に以下のように設定してコンパイルすれば良い。

[gui_support]
tkagg = False

本来は根源的に解決すべきだが、とりあえずはこれでも大体の場合は困らない。
ただ tkagg を必要とする場合は、別途考える必要があるかも。

2012年12月5日

Riak コンパイルメモ

概要

Erlang で実装されたNoSQL系のデータベース「Riak」の先端をコンパイルする手順メモ。

手順

コンパイルする場合 Erlang と Git コマンドが必須なのでパスに存在するか確認しておく。

Riak はビルドに「rebar」を利用している。最新である必要は特にないが、これもコンパイルしておく。

git cline git://github.com/basho/rebar.git
cd rebar
./bootstrap

Mac OS Xでコンパイルしているが、環境変数に UNICODE が含まれていると認識されコンパイルエラーになった。
Support environment vars with unicode characters · 61c353d · l4u/rebar-1 · GitHub」のパッチをあてたら通過した。

Riak 本体をコンパイルする。rebar のコピーを忘れないようにする。

git clone git://github.com/basho/riak.git
cd riak
cp /path/to/rebar .
make rel

関連ライブラリが Git で clone されてコンパイルされるので、環境によっては時間かかる。
途中でコンパイルエラーにたまになったので、rebarのバイナリコピーしてから再度 make するとちゃんと継続してコンパイルしてくれた。
「rel」ディレクトリの下にコンパイルされた。

使い方は確認中なので、また後で書く。

2012年12月4日

XML ファイルから PO ファイル を作成する

概要

XML ファイルを翻訳することがそれなりの頻度である。翻訳するなら PO ファイルを生成するのが便利。
XML から PO ファイルを生成するには「xml2po」か、「ITS Tool」を使う。両方ともGnomeのドキュメント国際化でも使われている Python で作成されたツール。
両方とも XML から PO を生成したり、PO から XML に戻したりできる。
ITS Tool の方が新しい。

xml2po

sudo port install gnome-doc-utils
xml2po --version

POファイルの作成と、XMLへの戻しは以下のようにする。

xml2po -o sample.pot sample.xml
cp sample.pot ja.po
mkdir ja
xml2po -p ja.po sample.xml > ja/sample.xml

ITS Tool

# 依存ライブラリインストール
pip install ftp://xmlsoft.org/libxml2/python/libxml2-python-2.6.21.tar.gz
# ダウンロード
curl -O http://files.itstool.org/itstool/itstool-1.2.0.tar.bz2
tar xvfz itstool-1.2.0.tar.bz2
cd itstool-1.2.0
./configure
sudo make install
# バージョン確認
itstool --version

POファイルの作成と、XMLへの戻しは以下のようにする。

itstool sample.xml -o sample.pot
cp sample.pot ja.po
msgfmt -o ja.mo ja.po
mkdir ja
itstool -m ja.mo -o ja/ sample.xml

まとめ

翻訳対象の XML にもよるだろうが、自分は xml2po の方を普段は利用している。