2010年12月24日金曜日

[MA-11-5] トグル操作による表示窓のON/OFF

Windowレイヤーに配置した表示窓を,キー操作によりON/OFFさせる.
具体的には,Windowレイヤーの表示窓オブジェクトをMCとし,そのMCを2フレームに分割する.
1フレーム目は空とし,2フレーム目に表示窓オブジェクトを配置する.
そして,ActionScript側でキー操作を受け取り,MCの1フレーム目~2フレーム目の移動を交互に行う.

サンプル
var key_obj:Object = new Object();
key_obj.onKeyDown = function():Void {
 var code = Key.getCode();
 if (code == Key.SPACE) {
  mcInfo.gotoAndStop(mcInfoNum + 1);
  stop();
 }
}
Key.addListener(key_obj);


※もちろんvisible使ってもOK
サンプル
var key_obj:Object = new Object();
key_obj.onKeyDown = function():Void {
 var code = Key.getCode();
 if (code == Key.SPACE) {
  _root.mcInfo._visible = true;
  //_root.mcInfo._visible = false;
 }
}
Key.addListener(key_obj);

2010年12月22日水曜日

[MA-11-4] HTMLからSWFへの引数渡し


20101217.swf

1.FLAファイルにwindowレイヤー追加
ActionScript(windowレイヤー)
user = _root.user;
money = _root.money;

2.windowレイヤーにダイナミックテキストを2つ設置
(それぞれ変数名を「user」「money」とする)

3.SWFファイルをパブリッシュ

4.SWFと同時に生成されたHTMLファイルを編集
(修正箇所:2)
<param name="movie" value="20101217.swf" />
→
<param name="movie" value="20101217.swf?user=sato&money=100" />
<embed src="20101217.swf" quality="high" bgcolor="#ffffff" width="300" height="200" name="20101217" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
→
<embed src="20101217.swf?user=sato&money=100" quality="high" bgcolor="#ffffff" width="300" height="200" name="20101217" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />

5.SWFとHTMLをアップロードし,動作確認

ダウンロード1
ダウンロード2

2010年12月16日木曜日

[SA-5-1-4] Perlを用いたCGIを使ってWEBアプリ化(完成)

index.html
<HTML>
<HEAD>
 <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=UTF-8">
 <TITLE>Connect MySQL(Perl) 1</TITLE>
</HEAD>

<BODY>
<FORM ACTION="/cgi-bin/connectDB3.cgi" METHOD="get" ENCTYPE="application/x-www-form-urlencoded">
 num       :<INPUT TYPE="TEXT" NAME="num" SIZE="4"><BR>
 host_name :<INPUT TYPE="TEXT" NAME="host_name" SIZE="12"><BR>
 ip_address:<INPUT TYPE="TEXT" NAME="ip_address" SIZE="24"><BR>
 <INPUT TYPE="hidden" name="command" value="insert">
 <INPUT TYPE="SUBMIT" NAME="Submit" VALUE="実行"><BR>
</FORM>
</BODY>

</HTML>

connectDB3.cgi
#!/usr/bin/perl

use DBI;
$user = '[user]';
$passwd = '[pass]';
$db = DBI->connect('DBI:mysql:sa:localhost', $user, $passwd);

if( $ENV{'REQUEST_METHOD'} eq "GET" ) {
    $std = $ENV{'QUERY_STRING'};
} else {
    read( STDIN, $std, $ENV{'CONTENT_LENGTH'} );
}
print "Content-Type: text/html\n\n\n";

print <<HEADER;
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=UTF-8">
<title>Connect MySQL(Perl) 2</title>
</head>
<body>
HEADER

print "Method :", $ENV{'REQUEST_METHOD'},"<br>\n";
print "Data   :", $std, "<br>\n";

print "<br>";

my @pairs = split(/&/,$std);
foreach $pair (@pairs){
    my($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
#    print "$name : $value<br>";
    $form{$name} = $value;
    print "\$form{$name} = $value<br>"
}

print "<br>";

if($form{command} eq 'insert'){
 if($form{num} eq '' || $form{host_name} eq '' || $form{ip_address} eq ''){
  print "登録できません";
 }else{
  $sth = $db->prepare("INSERT INTO server_list (num,host_name,ip_address) VALUES ('$form{num}','$form{host_name}','$form{ip_address}')");
  $sth->execute;
  print "登録完了";
  $sth->finish;
 }
}
$db->disconnect;

print <<FOOTER;
</body>
</html>
FOOTER

[SA-5-1-2] PerlでCGI

1.Hello World!
#vi /var/www/cgi-bin/hello.cgi

hello.cgi
#!/usr/bin/perl

print "Content-type: text/html\n";
print "\n";
print "Hello World!";

#chmod 755 hello.cgi
ブラウザから
http://(サーバのIPアドレス)/cgi-bin/hello.cgi
を確認.


2.GET/POST
connectDB3.cgi
#!/usr/bin/perl

# GETメソッドの場合
if( $ENV{'REQUEST_METHOD'} eq "GET" ) {
    $std = $ENV{'QUERY_STRING'};
# POSTメソッドの場合
} else {
    read( STDIN, $std, $ENV{'CONTENT_LENGTH'} );
}
print "Content-Type: text/html\n\n\n";
print "Method :", $ENV{'REQUEST_METHOD'},"<br>\n";
print "Data   :", $std, "<br>\n";

my @pairs = split(/&/,$std);
foreach $pair (@pairs){
    my($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    print "$name : $value<br>";
}

ブラウザから,[SA-5-1-2]で作成したファイル
http://(サーバのIPアドレス)/index.html
を確認.
(Method, Data, num, host_name, ip_address, num, host_nameの各項目の値が表示されます)

[卒業研究] Visual BasicからのXMLファイル入出力

以下サンプルコード(一部抜粋)

書き込み
Dim i As Integer
i = 1
Dim xml = XDocument.Load(savedXmlFileName)
For Each op In outputPictList
    Dim str1 = xml.Descendants("Objects").FirstOrDefault()
    str1.Add(New XElement("Pict"))
    Dim str2 = xml.Descendants("Pict").LastOrDefault
    str2.Add(New XElement("pictNum", pictList(i, 0)))
    str2.Add(New XElement("indexNum", pictList(i, 1)))
    str2.Add(New XElement("viewFileName", pictList(i, 2)))
    str2.Add(New XElement("fileFullPath", pictList(i, 3)))
    str2.Add(New XElement("rotateDegree", pictList(i, 4)))
    str2.Add(New XElement("statusOfMarker", pictList(i, 5)))
    str2.Add(New XElement("pictTitle", pictList(i, 6)))

    xml.Save(savedXmlFileName)
    i = i + 1
Next

読み込み
Dim doc1 = XDocument.Load(savedXmlFileName)
Dim query1 = From c In doc1.Descendants("Pict")
                Where c.Element("fileFullPath") IsNot Nothing

Dim i As Integer
i = 1
For Each c In query1
    pictList(pictNum, 0) = pictNum
    pictList(pictNum, 1) = c.Element("indexNum").Value
    pictList(pictNum, 2) = c.Element("viewFileName").Value
    pictList(pictNum, 3) = c.Element("fileFullPath").Value
    pictList(pictNum, 4) = c.Element("rotateDegree").Value
    pictList(pictNum, 5) = c.Element("statusOfMarker").Value
    pictList(pictNum, 6) = c.Element("pictTitle").Value
    CheckedListBox1.Items.Add(pictNum & " : " & c.Element("viewFileName").Value)
    i = i + 1

    pictNum = pictNum + 1
Next

XMLファイル
<?xml version="1.0" encoding="utf-8"?>
<Objects>
  <Pict>
    <pictNum>1</pictNum>
    <indexNum>1</indexNum>
    <viewFileName>Chrysanthemum.jpg</viewFileName>
    <fileFullPath>C:\Users\username\Desktop\pict\Chrysanthemum.jpg</fileFullPath>
    <rotateDegree>0</rotateDegree>
    <statusOfMarker>0</statusOfMarker>
    <pictTitle>pict1</pictTitle>
  </Pict>
  <Pict>
    <pictNum>2</pictNum>
    <indexNum>2</indexNum>
    <viewFileName>Desert.jpg</viewFileName>
    <fileFullPath>C:\Users\username\Desktop\pict\Desert.jpg</fileFullPath>
    <rotateDegree>0</rotateDegree>
    <statusOfMarker>0</statusOfMarker>
    <pictTitle>pict2</pictTitle>
  </Pict>
  <Pict>
    <pictNum>3</pictNum>
    <indexNum>3</indexNum>
    <viewFileName>Hydrangeas.jpg</viewFileName>
    <fileFullPath>C:\Users\username\Desktop\pict\Hydrangeas.jpg</fileFullPath>
    <rotateDegree>0</rotateDegree>
    <statusOfMarker>0</statusOfMarker>
    <pictTitle>pict3</pictTitle>
  </Pict>
  <Pict>
    <pictNum>4</pictNum>
    <indexNum>4</indexNum>
    <viewFileName>Jellyfish.jpg</viewFileName>
    <fileFullPath>C:\Users\username\Desktop\pict\Jellyfish.jpg</fileFullPath>
    <rotateDegree>0</rotateDegree>
    <statusOfMarker>0</statusOfMarker>
    <pictTitle>pict4</pictTitle>
  </Pict>
  <Pict>
    <pictNum>5</pictNum>
    <indexNum>5</indexNum>
    <viewFileName>Koala.jpg</viewFileName>
    <fileFullPath>C:\Users\username\Desktop\pict\Koala.jpg</fileFullPath>
    <rotateDegree>0</rotateDegree>
    <statusOfMarker>0</statusOfMarker>
    <pictTitle>pict5</pictTitle>
  </Pict>
  <Pict>
    <pictNum>6</pictNum>
    <indexNum>6</indexNum>
    <viewFileName>Lighthouse.jpg</viewFileName>
    <fileFullPath>C:\Users\username\Desktop\pict\Lighthouse.jpg</fileFullPath>
    <rotateDegree>0</rotateDegree>
    <statusOfMarker>0</statusOfMarker>
    <pictTitle>pict6</pictTitle>
  </Pict>
  <Pict>
    <pictNum>7</pictNum>
    <indexNum>7</indexNum>
    <viewFileName>Penguins.jpg</viewFileName>
    <fileFullPath>C:\Users\username\Desktop\pict\Penguins.jpg</fileFullPath>
    <rotateDegree>0</rotateDegree>
    <statusOfMarker>0</statusOfMarker>
    <pictTitle>pict7</pictTitle>
  </Pict>
  <Pict>
    <pictNum>8</pictNum>
    <indexNum>8</indexNum>
    <viewFileName>Tulips.jpg</viewFileName>
    <fileFullPath>C:\Users\username\Desktop\pict\Tulips.jpg</fileFullPath>
    <rotateDegree>0</rotateDegree>
    <statusOfMarker>0</statusOfMarker>
    <pictTitle>pict8</pictTitle>
  </Pict>
</Objects>

2010年12月15日水曜日

[SA-5-1-3] Perlを用いたCGIを使ってWEBアプリ化

index.html(sample)
<HTML>
<HEAD>
 <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=UTF-8">
 <TITLE>Connect MySQL(Perl) 1</TITLE>
</HEAD>

<BODY>
<FORM ACTION="cgi-bin/sample3.cgi" METHOD="POST" ENCTYPE="application/x-www-form-urlencoded">
 num:<INPUT TYPE="TEXT" NAME="num" SIZE="4"><BR>
 host_name:<INPUT TYPE="TEXT" NAME="host_name" SIZE="12"><BR> ip_address:<INPUT TYPE="TEXT" NAME="ip_address" SIZE="24"><BR>

 <SELECT NAME="command">
  <OPTION SELECTED VALUE="insert">INSERT</OPTION>
 </SELECT>

 <INPUT TYPE="SUBMIT" NAME="Submit" VALUE="実行"><BR>
</FORM>
</BODY>

</HTML>



connectDB3.cgi(sample)
#!/usr/bin/perl
use DBI;
$user = '[user name]';
$passwd = '[password]';
$db = DBI->connect('DBI:mysql:sa:localhost', $user, $passwd);

# FORMからデータを読み込む
$len = $ENV{'CONTENT_LENGTH'};
read(STDIN, $std, $len);
@args = split(/&/, $std);
foreach $arg ( @args ){
 ($name, $val ) = split(/=/, $arg);
 $val =~ s/\+/ /g;
 $form{$name} = $val;
}

print <<HEADER;
Content-type: text/html
<html>
 <head>
 <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=UTF-8">
 <title>Connect MySQL(Perl) 2</title>
 </head>
 <body>
HEADER

if($form{command} eq 'insert'){
 if($form{name} eq '' ){
  print "<h1>nameが空白では登録できません</h1>";
 }else{
  $sth = $db->prepare("insert into list (num,host_name,ip_address) values ('$form{num}','$form{host_name}','$form{ip_address}')");
  $sth->execute;
  print "<h1>登録完了</h1>";
  $sth->finish;
 }
}

$db->disconnect;

print <<FOOTER;
</body>
</html>
FOOTER

WebサーバのCGI関連の設定確認
vi /etc/httpd/conf/httpd.conf
AddHandler cgi-script .cgi .pl

[memo] Adobe CS5 Edition比較

Edition Design Standard Design Premium Web Premium Production Premium Master Collection
定価 \198,450 \249,900 \236,250 \261,450 \397,950
単体合計価格 \334,530 \591,450 \554,385 \633,255 \928,085
アカデミック定価 \67,830 \100,380 \100,380 \83,370 \125,790
アカデミック参考価格(amazon) \54,827 \91,245 \82,111 \75,702 \102,888
CLP価格(参考) \49,800 \73,277 \73,277 \60,860 \91,827
Photoshop CS5 Extended * * * * *
Illustrator CS5 * * * * *
InDesign CS5 * *     *
Acrobat 9 Pro * * *   *
Flash Catalyst CS5   * * * *
Flash Professional CS5   * * * *
Flash Builder 4 Standard     *   *
Dreamweaver CS5   * *   *
Fireworks CS5   * *   *
Contribute CS5     *   *
Adobe Premiere Pro CS5       * *
After Effects CS5       * *
Soundbooth CS5       * *
Adobe OnLocation CS5       * *
Encore CS5       * *
Bridge CS5 * * * * *
Device Central CS5 * * * * *
  Dynamic Link       * *

※お勧めはInDesign CS5まで含まれるDesign Premiumです.

2010年12月10日金曜日

[MA-11-3] DBと連携したFlash(キャラクタの動作作り込み)

前回作成したキャラクタは,前後左右の4面しか用意していないが,よりリアルな動作を実現する為に,キャラクタの各方向に対してモーションを付与する.
具体的には,characterレイヤーの各フレームに配置したムービークリップ「front」「back」「right」「left」に対して複数のフレームを用意し,実際にキャラクターが動いているように見せかける仕掛けとする.



20101208.swf

ダウンロード

2010年12月9日木曜日

[SA-5-1-1] PerlからDBへの接続

Perlを用いてDBに接続する.

[user name]
[password]
[DB name]sa

DBIの導入
$ cpan
CPAN> install DBI

DBに値を挿入する.
[insert value]'','13','sa012','10.2.3.112'

connectDB.pl
#!/usr/bin/perl
use DBI;

$user = '[user name]';
$passwd = '[password]';
$db = DBI->connect('DBI:mysql:[DB name]:localhost', $user, $passwd);
$sth = $db->prepare("INSERT INTO server_list VALUES ([insert value])");
$sth->execute;
$sth->finish;
$db->disconnect;


DBに格納されている値を取り出し,全て表示する.
connectDB2.pl
#!/usr/bin/perl
use DBI;

$user = '[user name]';
$passwd = '[password]';
$db = DBI->connect('DBI:mysql:[DB name]:localhost', $user, $passwd);
$sth = $db->prepare("[検索条件]");
$sth->execute;
$num_rows = $sth->rows;
print "該当 $num_rows 件\n";
for ($i=0; $i<$num_rows; $i++) {
 @a = $sth->fetchrow_array;
 print "[値の表示]";
}
$sth->finish;
$db->disconnect;

[検索条件]
SELECT * FROM server_list

[値の表示]
id=$a[0], num=$a[1] host_name =$a[2] ip_address =$a[3] \n

2010年12月8日水曜日

[memo]cookieもしくは,それに類する手法を用いたユーザートラッキングの方法と懸念

cookieもしくは,それに類する手法を用いたユーザートラッキングの実装
(倫理的問題,技術的問題が存在する)

[用途]
行動ターゲティング広告
オプトアウト(opt-out)(*1)

[使用される技術]
データの永続化
Flash:Local Shared Object
HTTP:cookie
Silverlight:ローカルストレージ
HTML5:ローカルストレージ
HTTP:HTTPレスポンスヘッダであるETagの利用
PNGキャッシュクッキー:セッションデータをRGBのパラメータとしてエンコードしたPNGファイルを生成(*2)

[実際の事例]
楽天:ad4U(*3) [参考]

(*1)ユーザの許諾無く、一方的に広告メールを送りつけること.また,それを拒否して広告を送付しないよう企業に依頼すること.
(*2)期間20年指定でキャッシュさせる.再アクセス時には304 Not Modified を返して表示させ,HTML5のCanvasタグでピクセルを読んで復号.
(*3)閲覧履歴を直接取得するのではなく,ブラウザの過去に閲覧した事のあるリンクの色を変える機能を流用し,楽天側で予め用意した(ユーザーが見ていそうな)リンクのリストをユーザー側に送り,そのリンクの色が何色に変化したかを取得する事で,ユーザーがリスト中のどのリンクを閲覧していたかを把握する方法. [参考]

データの永続化DEMO
[参考]

[MA-11-2] DBと連携したFlash(基礎部分作成)

最終的にはDBと連携したFlashファイルを作成するが,まずはステージ上を上下左右キーで操作できるキャラクタを作成し,配置する.



20101201.swf

ダウンロード

2010年12月2日木曜日

[memo] システム開発関連

SIerの責任について
参考

ソフトウェア開発手法:アジャイル
参考

オープンソースとは?(伽藍とバザール)
参考

[SA-4-6] FTPによるファイル送信(Shell Script)

バックアップしたファイルは,そのままサーバ上に保管するのではなく,ロケーションの異なるサーバにコピーすると,より安全である(ディザスタリカバリ).
そこで,定期的にファイルの転送をサーバに行わせるために,ファイルの転送を自動的に行うShellScriptを作成する.

内部でFTPクライアントを使用しているため,事前にFTPクライアントをインストール
#yum install ftp

また,ファイルの送信先サーバがFTPサーバとしてもどう際してる必要がある為,ローカルで動作確認を行う為には,FTPサーバをインストールする必要がある.
#yum install vsftpd
#service vsftpd start
#chkconfig vsftpd on

転送試験に使用するファイル用意
$vi ~/script/test.txt

転送試験の際の受信用ディレクトリ用意
$mkdir ~/script/receive


ftp_put.bash
#!/bin/bash

################################################
# 設定
################################################
# 送信するファイル
L_FILE="/home/(ユーザー名)/script/test.txt"
# 送信先ホスト
R_HOST="localhost"
# 送信先ディレクトリ
R_DIR="/home/(ユーザー名)/script/receive"

################################################
# 関数
################################################
# ファイルを FTP で送信する
# 入力
#   $1: 送信するファイル名
#   $2: 送信先ホスト名
#   $3: 送信先ディレクトリ
#   $4: 一時作業ディレクトリ
# 終了ステータス
#   0: 成功
#   1: 失敗
ftp_put_file () {
    local l_file="$1"
    local r_host="$2"
    local r_dir="$3"
    local tmpdir="$4"

    local filename="${l_file##*/}"
    local r_file="${r_dir}/${filename}"
    local log="${tmpdir}/ftp_put.log"

    local status

    # FTP を実行
    ftp -v -g "${r_host}" <<-EOF > "${log}" 2>&1
 quote NOOP
 put "${l_file}" "${r_file}"
 quote NOOP
 EOF

    # 結果チェック(1)
    status=$?
    if [ "${status}" -ne 0 ]; then
 return "${status}"
    fi

    # 結果チェック(2)
    ftp_chk_transfer "${log}"

    # 失敗した場合にはエラーメッセージ(かもしれないもの)
    # の最後の3行を標準エラー出力に表示
    if [ $? -ne 0 ]; then
 grep -v '^[123][0-9][0-9]' "${log}" | tail -3 1>&2
 return 1
    fi

    return 0
}

# FTP によるファイル送受信を、ログからチェックする
# 入力
#   $1: 転送ログ
# 終了ステータス
#   0: 転送成功
#   1: 転送失敗
ftp_chk_transfer () {
    local state="START"
    local code
    local msg_first
    local msg_rest

    # ログファイルを読みながらのループ
    while read code msg_first msg_rest; do
 case "${state}" in
 # 最初の NOOP 実行前
 START)
     if [ "${code} ${msg_first}" == "200 NOOP" ]; then
  state=TRANS_START
     fi
     ;;
        # PASV/PORT でのコネクション確立中
 TRANS_START)
     case "${code}" in
     125 | 150)
  state=TRANS_DATA
  ;;
     200)
  if [ "${msg_first}" == NOOP ]; then
      # 想定外
      state="ERROR"
      break
  fi
  ;;
     esac
     ;;
 # データ転送中
 TRANS_DATA)
     case "${code}" in
     226 | 250)
  # 転送成功
  state=SUCCESS
  break
  ;;
     200)
  if [ "${msg_first}" == NOOP ]; then
      # 想定外
      state="ERROR"
      break
  fi
  ;;
     esac
     ;;
 esac
    done < "$1"

    # 以下の test の結果が関数の終了ステータス
    [ "${state}" == "SUCCESS" ]
    return
}

################################################
# メイン処理
################################################
# util_common.bash を読み込む(make_tmp_dir/clean_tmp_dir)
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

# 作業ディレクトリの作成
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}

ftp_put_file \
    "${L_FILE}" \
    "${R_HOST}" \
    "${R_DIR}" \
    "${tmpdir}"

status=$?

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

# スクリプトの終了ステータスを
#  ftp_put_file の終了ステータスに
exit ${status}

.netrc(設定ファイル)
machine localhost login <ユーザー名> password <パスワード>

[卒業研究] 卒業論文の書き方

卒業論文は卒業研究の単なる作業メモではなく,文章として「読める」ものでなければならない.

つまり,行った事や結果の羅列ではなく,まず卒業研究として行った事の,そもそもの妥当性や事情を説明した上で,内容の説明を行い,最後に結果や今後の展望について纏める必要がある.

これによって卒業研究が世の中でどのような位置付けにあるかが,読者に伝わる.

具体的には,起承転結を意識して記述すると良い.

また論文を書く際の心構えについては,こちらのサイトが参考になる.

2010年12月1日水曜日

[SA-4-5] ファイル差分バックアップ(Shell Script)

内部でrcsコマンドを使用しているため,事前にrcsをインストール
#yum install rcs

backup_etc.bash
#!/bin/bash
# usage:
# 1. BACKUP_ROOT(/var/tmp/backup) に、バックアップをとりたいファイルへの
#    シンボリックリンクを張ります
#    例: cd ${BACKUP_ROOT}; ln -s /etc/nsswitch.conf
# 2. backup_etc.bash を引数なしで実行します

# バックアップ作成用ディレクトリ
BACKUP_ROOT="/var/tmp/backup"

# バックアップ作成用ディレクトリ内の最大の深さ
MAX_DEPTH=2

# RCS のチェックインメッセージ(空白/タブを入れないこと)
CHECKIN_MSG="Automatic_RCS_backup"

# 引数に応じて、
#   「ディレクトリの深さ + 1」
# を表す glob パターンを生成する
# usage: make_pattern <depth>
# ex. make_pattern 1 → "*/*"
make_pattern () {
    local -i i=$1
    local pattern="*"

    while [ $i -gt 0 ]; do
        pattern="${pattern}/*"
        let "i--"
    done

    echo "${pattern}"
}

# RCS の ci (チェックイン)コマンドを使って差分バックアップをとります
# 引数: なし
make_rcs_backup () {
    local dir
    local pattern=$(make_pattern ${MAX_DEPTH})
    local lock_user
    local file
    local msg

    # CHECKIN_MSG が設定されている場合だけ
    # msg 変数の内容を -m"メッセージ" とします
    msg=${CHECKIN_MSG:+"-m${CHECKIN_MSG}"}

    # BACKUP_ROOT に移動
    pushd "${BACKUP_ROOT}" > /dev/null

    # RCS という名前以外のディレクトリを探す
    # ※BSDシステムでは find -x . -type d ... とすること
    find . -xdev -type d \( -name RCS -prune -o -print \) | \
        while read dir; do
            case "${dir}" in
                ${pattern})
                    # MAX_DEPTH を越えたものは対象外
                    continue
                    ;;
            esac

     # 対象ディレクトリに移動
            cd "${BACKUP_ROOT}/${dir}"
     if [ ! -d RCS ]; then
  mkdir RCS
            fi

     # ファイルごとに ci を実行
            for file in *; do
  if [ -d "${file}" ]; then
      continue
  fi

  ci ${msg} -l "${file}" < /dev/null > /dev/null 2>&1
  if [ $? -ne 0 ]; then
      echo "backup FAIL: ${file}" 1>&2
  fi
     done
        done            

    # 最初いたディレクトリに戻る
    popd > /dev/null
}

make_rcs_backup

もしくは,rsyncを用いて差分バックアップを取る方法もある.
この場合,変更なきファイルはハードリンクとし,前回のバックアップから変更があったファイルのみ実際のコピーを行う為,バックアップの容量圧縮する事が可能となる.
rsync -av --delete --link-dest=../[過去] [現在]/ [保存名]

[MA-11-1] 新uploader

今後は,こちらのアップローダーを利用してください.

[memo] 安全なSQLの呼び出し方 (IPA)

情報処理推進機構(IPA)が公開している,SQLインジェクション攻撃等を回避する為のWebアプリケーションの安全な実装方法を解説した資料をベースに,深刻な被害が発生しがちなSQLインジェクション等について解説する.

ダウンロード(PDF)