2010年11月26日金曜日

[MA-10-3] フリーの画像制作環境

Adobe IllustratorやCorel DRAWと同種の,Windows向けベクター形式のグラフィックエディタとして,Inkscapeがリリースされている.

また,Adobe Photoshopと同種の,Windows向けビットマップ形式のグラフィックエディタとしては,GIMPが有名である.

どちらもフリーソフトウェアな為,気軽に導入できるメリットがある.
ただし,業務用途においてはやはりAdobeの製品が一般的であるため,あくまでも補佐的な役割となるであろう.


ここで,Suzukaで使用される画像形式にPDRが存在するが,同じ作者がSVG形式をPDR形式に変換するSVG2PDRというツールをリリースしている.

こちらを利用すれば,フリーのソフトウェアのみで
  1. InkscapeでSVG形式のファイル作成
  2. SVG2PDRでPDR形式にコンバート
  3. PDRをsuzukaに読み込み,SWF出力
を行う事が可能となる.

2010年11月25日木曜日

[SA-4-4] メール送信(Shell Script)

サーバは管理者の傍らではなく,遠隔地に置かれることが多い事から,ディスク使用量/プロセス死活監視/ネットワーク疎通確認等で問題が起きた際に,サーバの画面上にアラートを表示するだけでは不十分である.
そこで,アラートが発生した際にそのメッセージをメールとしてサーバから管理者に送信する事で,トラブルの見落としを防ぐ事が可能となる.

※下記サンプルをCentOS上で動かすために,
1.sendmailのインストール
yum install sendmail
service sendmail start
chkconfig sendmail on
2.スクリプト中のsendmailのパスを変更
/usr/local/sendmail → /usr/sbin/sendmail
3.MAIL_TOを自分のメールアドレスに変更
4.iconvの記述を変更
iconv -f EUC-JP -t ISO-2022-JP → iconv -f UTF-8 -t ISO-2022-JP


mail_plain.bash
#!/bin/bash
# メール設定
MAIL_FROM="foo@example.com"
MAIL_TO="bar@example.com"
MAIL_SUBJECT="テストメール"
MAIL_ID="<$(date +%Y%m%d%H%M%S).$(id -ru).$$@$(hostname)>"
SENDMAIL=/usr/lib/sendmail

# 共通関数の読み込み
FILE_UTIL=util_common.bash
. "${FILE_UTIL}" 2> /dev/null \
    || . "${0%/*}/${FILE_UTIL}" 2> /dev/null
if [ $? -ne 0 ]; then
    echo "Can't load ${FILE_UTIL}!" 1>&2
    exit 1
fi

# 文字コードを英語に
unset_linguas

# 作業ディレクトリの作成
tmpdir=$(make_tmp_dir 2>/dev/null)
if [ $? -ne 0 ]; then
    echo "Can't create temporary directory!" 1>&2
    exit 2
fi

# trap の設定
SIGNALS="HUP INT QUIT PIPE TERM"
trap "{ clean_tmp_dir; exit; }" ${SIGNALS}

# サブジェクトを Base64 エンコーディング
subject=$(echo -n "${MAIL_SUBJECT}" |
             iconv -f EUC-JP -t ISO-2022-JP |
             perl -MMIME::Base64 -ne 'print encode_base64($_)')

# メールの作成
mail_data="${tmpdir}/mail_data"
cat <<EOF > "${mail_data}"
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
From: ${MAIL_FROM}
To:   ${MAIL_TO}
Subject: =?ISO-2022-JP?B?${subject}?=
Message-Id: ${MAIL_ID}
Date: $(date +"%a, %e %b %Y %H:%M:%S %z")

--------------------------------------------------------
UPTIME
--------------------------------------------------------
$(uptime)

--------------------------------------------------------
W
--------------------------------------------------------
$(w)

--------------------------------------------------------
FREE
--------------------------------------------------------
$(free)


EOF

# メールの送信
iconv -f EUC-JP -t ISO-2022-JP "${mail_data}" |
    "${SENDMAIL}" -oi "${MAIL_TO}" > /dev/null 2>&1

# 作業ディレクトリの削除と trap 解除
clean_tmp_dir
trap ${SIGNALS}

[SA-4-3] プロセスの死活監視(Shell Script)

サーバが稼働しているからと言って,特定のアプリケーション(プロセス)も正常に動作しているとは限らない.
そこで,プロセス一覧に指定したアプリケーションが表示されているか確認し,プロセスレベルで動作している事をもって正常とみなす.
ちなみに,アプリケーションレベルでの動作確認方法としては,例えばWEBサーバであれば特定のWEBページをHTTPを用いて表示させる,等がある.

check_proc_alive.bash
#!/bin/bash
# usage: check_proc_alive.bash

# 監視対象を記述したファイル
PROGLIST=/usr/local/etc/check_progs.conf

# util_common.bash(ucb_ps) を読み込む
# 1. PATH が通っているところから読み込む
# 2. このスクリプトがディレクトリ指定付で実行されていれば、
#    このスクリプトと同じ場所から読み込む
# 3. 1., 2. でダメならエラー
FILE_UTIL=util_common.bash
. "${FILE_UTIL}" 2> /dev/null \
    || . "${0%/*}/${FILE_UTIL}" 2> /dev/null
if [ $? -ne 0 ]; then
    echo "Can't load ${FILE_UTIL}!" 1>&2
    exit 1
fi

# 指定されたプログラムのプロセス ID を取得する
#
# 使い方
#   pidof [-s] 
#
# 引数:
#   -s
#     一つでもプロセスが見つかったら、そこで処理を終える
#   prog_name
#     探すプログラムの名前
#
# 出力
#   プロセスID_1 プロセスID_2  ...
#   (プロセスが見つからない場合は空行を 1 行出力する)
#
# 終了ステータス:
#   0: プロセスが見つかった
#   1: プロセスが存在しなかった
pidof () {
    local cmd_target            # 探すコマンド
    local is_single             # -s オプションが指定されたか

    # 引数の処理
    is_single=false

    case "$1" in
      -s)
        is_single=true
 shift
 ;;
    esac

    cmd_target="$1"

    # 以下のコマンド(パイプライン)の戻値が、関数の戻値になる
    ucb_ps ax | (
 # ここからサブシェルなので、変数の設定は呼び出し元には
 # 影響しません。よって local 定義もありません
 # ただし、変数の初期化は必要です。
 pids=""

 # へッダ行は捨てます
 read line

 # 2 行目以降の処理
 while read pid tty stat time cmd args; do
     # 対象行が求めるものであるか
     was_found="false"

     if [ "${cmd}" = "${cmd_target}" ]; then
  # そのまま一致
  was_found="true"
     elif [ "${cmd##*/}" = "${cmd_target}" ]; then
  # ベース名が一致
  was_found="true"
     fi

     if ${was_found} ; then
  pids="${pids} ${pid}"
  if ${is_single}; then
      # -s が指定されていればここで終わり。
      # 終了ステータス 0
      break
  fi
     fi
 done

 # 結果の表示
 echo ${pids}

 # 終了ステータスの設定
 [ "${pids}" != "" ]
    )
}

# プロセス生存監視
# 引数なし
check_alive_procs () {
    # PROGLIST 存在チェック
    if [ ! -r "${PROGLIST}" ]; then
 echo "Can't read ${PROGLIST}"
 return 1
    fi

    # PROGLIST の行ごとのループ
    cat "${PROGLIST}" | while read prog ; do
 case "${prog}" in
     "")   continue ;;
     "#"*) continue ;;
 esac
 pids=$(pidof ${prog})
 if [ $? -ne 0 ]; then
     pids="DOWN"
 fi
 echo "${prog}: ${pids}"
    done
}

check_alive_procs

2010年11月24日水曜日

[memo] 安全なウェブサイトの作り方 (IPA)

情報処理推進機構(IPA)が公開している,サイト開発者・運営者が適切なセキュリティを考慮したサイトを作成するための資料をベースに,SQLインジェクションやOSコマンドインジェクション、クロスサイトスクリプティング(XSS)など、IPAへの届け出の多かった脆弱性や、攻撃による影響が大きい脆弱性を取り上げ、生じうる脅威や対策について解説する.

ダウンロード(PDF)

[MA-10-2] フリーの制作環境を使った作例 (Suzuka)

  1. Suzukaをここからダウンロードし,インストールする.
  2. サンプルをダウンロードする.
  3. Photoshop Elements,もしくはParaDrawを使って画像を作成.
  4. 作成した画像を使って,2のサンプルの画像を差し替え