Sabel DIContainer

Sabel DIContainerでannotationによるインジェクション設定を追加。

<?php

class TargetClass
{
  /**
   * @injection Profile
   */
  public function setProfileMethod($profile)
  {
  }
}

interface Profile
{
}

class ProfileImpl implements Profile
{
}

class DIConfig extends Sabel_Container_Injection
{
  public function configure()
  {
    $this->bind("Profile")->to("ProfileImpl");
  }
}

$target = load("TargetClass");

?>

というコードで、依存を注入できる。

フレームワークの必要性

とある開発案件で、一次受けの大手SIerから「フレームワークを使用しないでください」とのコーディング規約を頂戴した。
この規約の真意は判らない。(判るべきなのだけど)

SIerは何を考えての規約なのだろうか?

フレームワークを使用することによるデメリットを考えてみた。

1. 学習コストが高い
2. ソフトウェアを保守する上でフレームワークが足枷になる
3. フレームワークそのものを保守するコストが馬鹿にならない

学習コストについては、実際のSIerが開発を行なう案件ではないので、関係はない。
しかし、実際にどのようにソフトウェアが動作しているか理解できないというのは、SIerとしては許せないのだろう。
これは単純にSIerが技術の習得に力を入れていないか、ただのバカかのどちらかだろう。

2については、もし保守しているソフトウェアが数年後に大規模な改修が必要になった場合、
どこのだれがフレームワーク部分を理解していて、改修できるか。という話になる。
その時に開発した下請けが存在しないかもしれない。

3はフレームワークそのものの不具合や、セキュリティホールをどこのだれがメンテナンスするか。ということになる。
これも2と同様の問題で、SIerはそこまでのコストはかけられない。


これらの問題は、SIerがとるべき責任を放棄し、全て丸投げしていることが原因になる。
SIerは技術の習得を怠り、自の利しかみえていないようだ。
本来技術屋であるべきSIerは意味の無いドキュメントを作成し、そこで利益を発生させる。
そして*面倒*な技術は全て丸投げといった寸法だ。

このような体制がまかり通る社会では、日本のソフトウェア産業が活発になるはずがない。

Samba on CentOS 5.2

CentOS5.2でSambaを設定した覚書

まず、sambaのインストール

yum install samba

iptablesの設定
/etc/sysconfig/iptables

-A INPUT -p tcp -m tcp --dport 139 -j ACCEPT
-A INPUT -p udp -m udp --dport 137 -j ACCEPT
-A INPUT -p udp -m udp --dport 138 -j ACCEPT
  • A INPUTの部分は適切読み替えて下さい。

Sambaの設定(サンプル)

[global]
        workgroup = WORKGROUP
        server string = server name

        unix charset = UTF-8

        security = user
        hosts allow = 10.0.1.

        netbios name = name

        ;interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
        ;hosts allow = 127. 192.168.12. 192.168.13.

        ;log file = /var/log/samba/%m.log
        ;max log size = 50

        ;passdb backend = tdbsam

[www]
        path = /usr/local/www/data
        comment = www directory
        writable = yes
        public = yes

自動起動設定

chkconfig smb on

起動

service smb start

Starting SMB services: で停止してしまう場合は、
iptablesのOUTPUTを見直すと良いかも。

ユーザの追加

 % sudo smbpasswd -a {$username}

OpenVPN on Windows Vista

まずconfigに

route-method exe

を追加する。

ROUTE: route addition failed using CreateIpForwardEntry: One or more arguments are not correct. [if_index=12]
Route addition via IPAPI failed

という様なエラーが発生している場合は、うまくルーティングテーブルに追加できていない。
このCreateIpForwardEntryが失敗する理由はhttp://support.microsoft.com/kb/947216/jaが詳しい。

コマンドプロンプトでroute PRINTとすると、ルーティングテーブルが表示できる。

"OpenVPN GUI for Windows"を使用している場合は、上記エラーが発生するが、
本家の"OpenVPN 2.1"を使用すればこの問題は発生しない。

UACを有効にしている場合は、openvpn-gui.exeとopenvpn.exeに特権実行をチェックする。

Multiple DNS implementations vulnerable to cache poisoning

CentOSを更新。
yum update bind*

BIND 9.3.4-P1に更新された。
CentOSのアナウンスによると
http://lists.centos.org/pipermail/centos-announce/2008-July/015102.html
となっているので、
RedHatのアップデート情報を見ると、
https://rhn.redhat.com/errata/RHSA-2008-0533.html
どうやら、CVE-2008-1447は修正されている。

% dig +short porttest.dns-oarc.net TXT

とすると,
porttest.y.x.w.v.u.t.s.r.q.p.o.n.m.l.k.j.i.h.g.f.e.d.c.b.a.pt.dns-oarc.net.
"***.***.***.*** is GREAT: 26 queries in 3.1 seconds from 26 ports with std dev 17702"
となるので、確かに修正されている。

ISCの公式アップデートは9.3.5だが、CentOS(RHES)は独自にpatchしているみたいだ。
内部バージョンは"9.3.4-6.0.2.P1.el5_2"となっている。

SabelAspect機能を使うと、簡単にAOPが可能になる。

PHPAOPだと、http://www.phpaspect.org/とかもあるが、この方式は少々大袈裟なかんじがする。
SabelAspectは完全にProxy方式。

AOPAlliance に準準拠している。

<?php
// コンテナ設定
class Config extends Sabel_Container_Injection
{
  public function configure()
  {
    $this->aspect("Target")->advice("Advice");
  }
}

// target
class Target
{
  public function getState()
  {
     return "state";
  }
}

// Advice
class Advice
{
  /**
   * @before get.+
   */
  public function beforeGet($method, $arguments, $target)
  {
    // メソッドが実行される直前に、このメソッドが実行される。
  }
  
  /**
   * @after get.+
   */
  public function afterGet($method, $arguments, $target, $result)
  {
    // メソッドが実行された後に、このメソッドが実行される。
  }
  
  /**
   * @around get.+
   */
  public function aroundGet($invocation)
  {
    // メソッドが実行される前に、このメソッドが実行される。
    
    // $invocationのproceed()メソッドを実行しなければ、ターゲットの対象メソッドが実行されることは無い
    $result = $invocation->proceed();
    
    return $result;
  }
  
  /**
   * @throws get.+
   */
  public function throwsGet($method, $arguments, $target, $result, Exception $exception)
  {
    // メソッドが実行され、例外が発生したらこのメソッドが実行される。
  }
}

// main
load("Target", new Config());

この機能はSabel 1.1からだが、1.1は7月リリース予定。