systemdについてちょっと調べた

参考文献を並べて重要な箇所だけ引用する。 参考になった順にならべる。

なぜsystemdなのか? (翻訳 Why systemd(2014-07-23)by Jorgen Schäfer)

http://postd.cc/why-systemd/

SysV initサービスを起動したり停止したりするのに用いられる一般的な方法は”service”コマンドを用いることです。多くの人はinitスクリプト/etc/init.d/$nameを直接使いますが、実はこれには問題があります。initスクリプトをカレントの環境で起動するのですが、ブート時に有効な環境とは違う可能性があるからです。影響としてコマンドラインから実行させた時はソフトウェアが正しく起動するのに、ブート時の起動では失敗してしまう、というようなことがあります。

sysinitの場合はスクリプトに依存関係がある場合にうまく起動できない場合がある。

似たように、SysV initは、機能をinit自身に実装することはせず、それぞれ全てのサービスに対して、共通の機能を実装するように求めています。

daemon化がそれぞれのスクリプトで実施する必要があるのは確かに面倒くさい。 それにforkが2回実行されると祖父プロセスとの関連性を失うのも良くない。

GNU/LinuxにとってDebianUbuntuがsysytemdに乗り換えたという決定は、まぎれもなくsystemdが勝ったということを意味しています。使い手の好みに関わらず、systemdは、いまやGNU/Linuxのinitシステムなのです。

systemd同様にsysinitを置換する候補としては以下のように多くのソフトウェアがあるらしい。しかし勝者はsystemd。 * eInit * Upstart * OpenRC * initng * busybox-init * s6 * procd

systemdと連動するためにサービスをデーモン化する必要はありません。supervisorを使った時と同じように、プロセスは通常通り実行できます。syslogにログメッセージを記録する時でさえ、stdoutとstderrに書き込むだけでよいのです。

syslogとの連携が標準出力だけなんて楽だな。 しかも、ログをありかを覚えておく必要はなく、systemdのコマンドを使えば良いらしい。 知らないシステムを調査しなければならない時にログの在処を探し当てるのが面倒くさいんだよね。

CentOS 7実践ガイド (古賀 政純)

http://www.amazon.co.jp/dp/484433753X centos7からsystemdが採用されるそうだ。操作方法などがまとめられている。

systemd超入門(佐々木 大輔)

http://dev.classmethod.jp/cloud/aws/systemd-getting-started/

PIDではなくcgroupによってプロセスを管理する

cgroupを使っているから、コンテナ関連の話でsystemdが出てくるのだろう。 Dockerのコンテナはsystemdにおけるユニットとして実行されることでリソースが制限されるのだろうか。

without systemd

http://without-systemd.org/wiki/index.php/Main_Page systemd反対派(?)のWiki systemdのどこがわるいのかはよくわかっていない。 少なくとも多くのディストリで標準になりつつある現状を見ると、反対派のちからが及ばない程度にsystemdは優れているのだろう。

systemd-nspawn (Arch Linux wiki)

https://archlinuxjp.kusakata.com/wiki/Systemd-nspawn

systemd-nspawn は chroot コマンドに似ていますが、chroot を強化したものです。

Dockerより柔軟なコンテナ型仮想化 systemd-nspawn を使ってみた

http://www.geeks-dev.com/docker%E3%82%88%E3%82%8A%E6%9F%94%E8%BB%9F%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E5%9E%8B%E4%BB%AE%E6%83%B3%E5%8C%96systemd-nspawn%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/

まぁね。ArchWikiに書いてあるしね・・・別にいらん世話かとは思いますけど、DockerやRocketみたいなコンテナ型の仮想化機構です。

ステッドラー アバンギャルド 927AG-S をJETSTREAMに換装

自分はJESTREAM厨なのだが、JESTREAMの高級モデルはデザインが今ひとつ。 (なぞの宝石がついているところとか。)

したがって、他社のボールペンにJETSTREAMのリフィルを入れて使うことになる。

しらべてみると、ステッドラーアバンギャルドはJETSTREAMが入るらしい。 色とか値段がちょうどいいので購入したので紹介する。

以下の2つの商品をアマゾンで購入した。

アバンギャルドの包装が高級感があって、ワクワクさせる。

開けて取り出すと、かなり軽い。使ってみないとわからないが、この軽さは微妙かもしれない。

換装する前に少し試し書きしてみたところ、なんとなくかすれる感じがする。

日頃JETSTREAMに慣れているとカサカサ感が否めない。

f:id:KYudy:20150407215232j:plain:w300f:id:KYudy:20150407215235j:plain:w300

3色のボールペンとシャープペンシルが入っているのだが、どれを出すかは、ペンのどこが上を向いているのかで変わる。

ペンの上部に「Black」「0.5mm」「●」「Red」と書かれていて、それぞれが書かれている部分を上に持ってきて、ノック部を押すと対応するペン先が出てくる。 ちなみに0.5mmはシャープペンシル、●は青色に対応している。多分●は他の色を入れてもいいよってことなんだろう。

この仕組みのためか、中でシャカシャカ音がなる。

f:id:KYudy:20150407215241j:plain:w300f:id:KYudy:20150407215243j:plain:w300

ペンを開けてペン先を入れ替えるのは非常に簡単だ。完全にJETSTREAM互換だ。

f:id:KYudy:20150407215237j:plain:w300f:id:KYudy:20150407215239j:plain:w300

やはりJETSTREAMはいい。 書いたときの滑らかな感じ、この一言に尽きる。

OpenCVとWebカメラで動画像処理を始める。

やりたいこと

ビリヤードのテーブル上のたまの動きを撮影して、自動的にスコアをつけたり、あとで試合の運びを確認できるようにしたい。 そのために、opencvで動画を解析するのが今回の目的。 * 動作環境: Ubuntu 14.04.2 LTS * Webカメラlogicool c920t

カメラの動作確認と設定

Linuxで使うのだが、とりあえずキャプチャ(動画じゃなくて、一枚の画像)を取得することにした。 コマンドや使い方は以下を参考にした。 http://atelier-orchard.blogspot.jp/2014_05_01_archive.html

opencvのサンプルコードを動かす

ここまででWebカメラが正常に動いていることを確認できたので、実際にopencvを動かす。

$ sudo apt-get  install python-opencv libcv2.4

次に以下のサンプルを実行して動体(動くもの)を検知してみた。 特に画像処理の仕組みを理解したわけではないが、実行できるものを手元で動かすってのは重要だ。できた感があるからね。 http://python-gazo.blog.jp/opencv/%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E9%96%93%E5%B7%AE%E5%88%86%E6%B3%95

サンプルコードをtest.pyという名前で保存して実行する。

$ python test.py

実行結果は以下の通り、手を振ると、動いている部分のエッジが白くなる。 今日の目的はとりあえず達成。(部屋の物がいろいろ見えてしまうので、ぼやかした。)

f:id:KYudy:20150329192743p:plain

ビリヤード台がほしい

ビリヤード台がほしい

ほしいと思ったきっかけ

仕事忙しい・・・ビリヤード場いけねぇ・・・

条件

  • 1LDKのアパートにおける
  • それなりに本格的
  • 折りたためること

一般的なビリヤード台の大きさ重さ

  • 大きさ: 9フィート
  • 重さ: 300kg

自分の部屋に置くのはムリだ。いや実際の大きさを図るまでもなく、ムリなのはわかる。

したがってビリヤード台の中でも家庭用ビリヤード台と呼ばれるジャンルの台を探すことになる。

家庭用ビリヤード台

ググってみるといろいろ出てくるが、気に入ったものだけをリストアップしてみた。

ES-1800が6フィートなので、大きさがちょうどいいなと思った。 5フィートは小さすぎる感じ。

しかしRileyの台が本格的で良い感じ。悩む。

6フィート以上のRiley社の台が国内で売ってない・・・?

国内でRiley社の台を売っているところを探してみた。

ジャストドゥイット ニューアート フォックス

FP-5BとJL-2Cは見つかるのだが、それ以外の台が見つからない。 6フィートの台がほしいのに。

ということで、とりあえず問い合わせてみることにする。

どの台を買ったとしても、レビューしようと思う。

CentOSでpymilterをインストールしたメモ(2)

以下のエントリの続き
CentOSでpymilterをインストールしたメモ - いわゆる備忘録

持ってきたpymilterのは以下にはサンプル(sample.py)が含まれている。
それを簡単に書き換えて使ってみる

設定

  • sample.pyを書き換える
# A simple milter.

# Author: Stuart D. Gathman <stuart@bmsi.com>
# Copyright 2001 Business Management Systems, Inc.
# This code is under GPL.  See COPYING for details.

import sys
import os
import StringIO
import rfc822
import mime
import Milter
import tempfile
from time import strftime
#import syslog

#syslog.openlog('milter')

class sampleMilter(Milter.Milter):

  def log(self,*msg):
    pass

  def __init__(self):
    pass

  def envfrom(self,f,*str):
    if f == 'hogehoge@example.com':
      self.setreply('500', '5.7.1', 'go home')
      return Milter.REJECT
    return Milter.CONTINUE

  def envrcpt(self,to,*str):
    return Milter.CONTINUE

  def header(self,name,val):
    return Milter.CONTINUE

  def eoh(self):
    return Milter.CONTINUE

  def body(self,chunk):
    return Milter.CONTINUE

  def eom(self):
    return Milter.ACCEPT

  def close(self):
    return Milter.CONTINUE

  def abort(self):
    return Milter.CONTINUE

if __name__ == "__main__":
  socketname = "/tmp/sample.sock";
  Milter.factory = sampleMilter
  Milter.set_flags(Milter.CHGBODY + Milter.CHGHDRS + Milter.ADDHDRS)
  sys.stdout.flush()
  Milter.runmilter("pythonfilter",socketname,240)
  print "sample milter shutdown"
  • Postfixの設定を修正する。

vi /etc/postfix/main.cf

smtpd_milters = unix:/tmp/sample.sock
/etc/init.d/postfix restart
  • sample.pyを起動する
nohup sudo -u postfix python sample.py &

確認

[root@localhost pymilter-0.9.8]# telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 localhost.localdomain ESMTP Postfix
MAIL FROM: hogehoge@example.com
500 5.7.1 go home

go homeと言われてREJECTされたので、カスタマイズに成功したことがわかる。

今日はこれまで。

pythonのデコレータを勉強するためにmemoizedにlruとtimeout機能を追加してみた

Pythonのデコレータって面白い。
メモ化(Memoization)も簡単に、そして美しく実現できる。

何かDBにアクセスして得られる結果をメモ化でキャッシュして、アプリケーションの動作を高速化したりできるだろう。

ただ無尽蔵に引数と結果の組み合わせをキャッシュされても困る。それにキャッシュするなら、期間も指定したい。

ということでちょっと書き換えてそれを実現してみた。

memoizationは以下のページのものを元とした。
https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

ソースコード
import pylru
import time

class memoized_lru(object):
    '''Decorator. Caches a function's return value each time it is called.                                                                                                                                           
    If called later with the same arguments, the cached value is returned                                                                                                                                            
    (not reevaluated).                                                                                                                                                                                               
    '''
    def __init__(self, func, cachesize=1024, expire=1):
        self.func = func
        self.cache = cache = pylru.lrucache(cachesize)
        self.expire = expire

    def __call__(self, *args):
        if not isinstance(args, collections.Hashable):
            # uncacheable. a list, for instance.                                                                                                                                                                     
            # better to not cache than blow up.                                                                                                                                                                      
            return self.func(*args)
        if args in self.cache:
            (value, ts) = self.cache[args]
            now_ts = time.time()
            if (now_ts - ts) < self.expire:
                return value
        # no valid cache! call function.                                                                                                                                                                             
        value = self.func(*args)
        ts = time.time()
        self.cache[args] = (value, ts)
        return value

    def __repr__(self):
            '''Return the function's docstring.'''
            return self.func.__doc__

    def __get__(self, obj, objtype):
        '''Support instance methods.'''
        return functools.partial(self.__call__, obj)

CentOSでpymilterをインストールしたメモ

pymilterを使ってみたかったのでインストールしてみた。
サンプルが同梱されているので、それが動くまで試してみた。
MTAにはsendmailではなくPostfixを使用した。

$ cat /etc/redhat-release
CentOS release 6.4 (Final)

以下必要だったパッケージを記載する。

# yum install python-devel
# yum install sendmail-milter
# yum install sendmail-devel

pymilterを以下のURLから落とし解凍する。
http://downloads.sourceforge.net/project/pymilter/pymilter/pymilter-0.9.8/pymilter-0.9.8.tar.gz

$ tar xzf pymilter-0.9.8.tar.gz

後はREADMEの通りに以下を実施

$ cd pymilter-0.9.8
$ sudo python setup.py install

Postfixのmaster.cfを以下のように編集し、9201ポートに待ち受けているmilterを使うようにする。

# emacs /etc/postfix/main.cf
smtpd_milters = inet:localhost:9201
# /etc/init.d/postfix restart

サンプルを少し書き換えて9201ポートで待ち受けるようにする。

$ emacs sample.py
Milter.runmilter("pythonfilter","inet:9201",451)
$ python sample.py

以上でサンプルを動かすところまでがひと通り完了した。