<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Unauthorized Random Translations</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/" />
    <link rel="self" type="application/atom+xml" href="http://randomtranslations.com/atom.xml" />
    <id>tag:randomtranslations.com,2008-05-04://1</id>
    <updated>2008-09-12T11:52:16Z</updated>
    <subtitle>海外ブログなどで紹介されている技術情報を気まぐれに翻訳するブログ</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.14</generator>

<entry>
    <title>シェルスクリプト作成のテクニック Part 4</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/09/more-shell-scripting-techniques-part4.html" />
    <id>tag:randomtranslations.com,2008://1.67</id>

    <published>2008-09-09T03:00:04Z</published>
    <updated>2008-09-12T11:52:16Z</updated>

    <summary>※このエントリーは、developerWorks : AIX and UNIXの「Speaking UNIX: More shell scripting techniques」を翻訳したエントリーのPart 4です。 【訳注】 「シェルスクリプト作成のテクニック Part 3」の続きのエントリーです。 デバッグする スクリプトを書き終えたら、プログラムを動かしてみる時間です。ところが、スクリプトを実行したところ、予期しないエラーが表示されてしまいました。原因はなんでしょう？この世の中に完全無欠な人なんていません。スクラッチからスクリプトを書き始め、エラーが出なくなるようにするまでに多くの時間と試行錯誤を要します。たいていの場合、文字が抜けていたり、間違った文字になっていたりしているのが原因で、どうしても見逃してしまうようです。それでもご安心下さい。AIXを含むUNIXやLinuxのシェルには、デバッグを助けてくれる機能があります。...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="AIX" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="aix" label="AIX" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="shellscript" label="Shell Script" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="unix" label="UNIX" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは、<a href="http://www.ibm.com/developerworks/aix/">developerWorks : AIX and UNIX</a>の「<a href="http://www.ibm.com/developerworks/aix/library/au-speakingunix_shellscripttech/">Speaking UNIX: More shell scripting techniques</a>」を翻訳したエントリーのPart 4です。</p>
<p>【訳注】 「<a href="http://randomtranslations.com/archives/2008/09/more-shell-scripting-techniques-part3.html">シェルスクリプト作成のテクニック Part 3</a>」の続きのエントリーです。</p>
<h3>デバッグする</h3>
<p>スクリプトを書き終えたら、プログラムを動かしてみる時間です。ところが、スクリプトを実行したところ、予期しないエラーが表示されてしまいました。原因はなんでしょう？この世の中に完全無欠な人なんていません。スクラッチからスクリプトを書き始め、エラーが出なくなるようにするまでに多くの時間と試行錯誤を要します。たいていの場合、文字が抜けていたり、間違った文字になっていたりしているのが原因で、どうしても見逃してしまうようです。それでもご安心下さい。AIXを含むUNIXやLinuxのシェルには、デバッグを助けてくれる機能があります。</p>]]>
        <![CDATA[<p>例えば、Listing 10でご紹介するmake_errorsという名前のシェルスクリプトは、たった今書き上がり、実行を待っている状態です。</p>
<p><strong>Listing 10</strong>: エラーを含むスクリプトの例</p>
<pre>
#!/bin/bash

_X=1
while [[ ${_X} -le 10 ]]
do
  [[ ${_X} -lt 5 ]] && echo "X is less than 5!

  _Y=`expr ${_X) + 1`

  if [[ ${_Y} -eq 6 ]]
    echo "Y is now equal to ${_Y}"
  fi

  _X=${_Y}
done
</pre>
<p>しかし、最初にこのスクリプトを実行してむると、以下のようなエラーが表示されます。</p>
<pre>
# ./make_errors
./make_errors: line 11: unexpected EOF while looking for matching `"'
./make_errors: line 16: syntax error: unexpected end of file
</pre>
<p>あなたがすでに使っている可能性があり、それにも関わらずあまり知られていない優れたデバッグツールがVimです。Vimは強力なテキストエディターであると同時に、デバッグでも非常に役に立ってくれます。もし、あなたが.exrcや.vimrcファイルを設定し、特定のエラー状況をカラーで表示してくれるようにしているならば、Vimは図1で表示されるようにあなたの仕事の大部分をやってくれるでしょう。
</p>
<p><strong>図1</strong>: Vimでデバッグする</p>
<p><a href="http://www.ibm.com/developerworks/aix/library/au-speakingunix_shellscripttech/figure1-vim.jpg" target="_blank">:::画像1:::</a></p>
<p>最初のエラー「line 11: unexpected EOF while looking for matching `"'」は、11行目で何かが起こっていると言っていますが、その行を見てみても、何が悪いかよく分かりません。それでは6行目を見てみましょう。ダブルクオーテーションマーク（"）がechoされている文字列の最後から抜けています。これはデバッグの際に実際にスクリプトを見ないといけないという典型的な例です。エラーとして表示される列が必ずしも実際のエラー発生行とは限りません。11行目がエラー発生行として表示されているのは、6行目でダブルクォーテーションで囲まれ始めて、11行目まで閉じられなかったからです。エラーを修正するには、6行目の最後にダブルクオーテーションを追加します。</p>
<p>それとは別にエラーがあると表示されているのは8行目です。ここでは、変数_Xの閉じる丸括弧「)」が赤くハイライトされています。ここではVimがあなたの代わりに何が悪いか表示してくれました。変数_Xは波括弧「{」で始まっているのに正しく閉じられていません。「)」から「}」に変更しておきましょう。</p>
<p>今のところ2つのエラーを修正するのによい仕事をしてくれています。それではスクリプトを再実行してみましょう。</p>
<pre>
./make_errors: line 12: syntax error near unexpected token `fi'
./make_errors: line 12: `  fi'
</pre>
<p>別のエラーがあるようです。エラーは12行目に問題があると言っていますが、そこにはif文を閉じるfiしかありません。何が駄目なんでしょうか？前のエラーの時はどんなだったか思い出して下さい。必ずしもすべてのエラーがシェルが問題があると指摘した行にあるわけではありません。シェルは単純にエラーが発生したと言っているだけで、実際のエラー原因はシェルが失敗を報告した行以前にある可能性があります。この小さなスクリプトではほぼ間違いなく、if文自体に問題があると思われます。シェルスクリプトの基本ロジックに立ち戻り、if文がifとthenとfiから構成されていることを思い出しましょう。それでは見直してみましょう。どうやらthenが抜けているようです。単純にthenをスクリプトに追加するだけです。それが完了すると、Listing 11のようなスクリプトになります。</p>
<p><strong>Listing 11</strong>: Listing 10のスクリプトを修正したもの</p>
<pre>
#!/bin/bash

_X=1
while [[ ${_X} -le 10 ]]
do
  [[ ${_X} -lt 5 ]] && echo "X is less than 5!"

  _Y=`expr ${_X} + 1`

  if [[ ${_Y} -eq 6 ]]
  then
    echo "Y is now equal to ${_Y}"
  fi

  _X=${_Y}
done
</pre>
<p>それではもう一度スクリプトを実行してみましょう。</p>
<pre>
# ./make_errors
X is less than 5!
X is less than 5!
X is less than 5!
X is less than 5!
Y is now equal to 6
</pre>
<p>おめでとうございます！スクリプトは想定通りに動くようになりました。</p>
<h3>set -xオプション</h3>
<p>しかしながら、シェルスクリプトのトラブルシューティングの方法は上記の例のように単純にはいかないことがあります。予想外の失敗が発生し、壁に頭を叩きつけても、失敗の原因が分からない時、最終手段として銃を取り出すしかないのでしょうか。kshとbash、それ以外の最新のシェルにはsetコマンドに-xオプションが含まれています。このset -xオプションを使うことにより、展開や評価されるすべてのコマンドが標準出力に表示されるようになります。評価されたコードを標準出力に出力する際、set -xはPS4変数の値を使用し、すべての行が出力されているかのように表示します。大量のテキストが出力されるので、辛抱強く内容を追いかけないといけないことは覚えておいて下さい。</p>
<p>以前取り上げたスクリプト例のループカウント数を少し減らし、set -xをスクリプトの冒頭に追加し、コメントも付けてみました。その後、これを実行してみます。Listing 12が修正したスクリプトです。</p>
<p><strong>Listing 12</strong>: set -xの例</p>
<pre>
#!/bin/bash

set -x

# loop through and display some test statements
_X=1
while [[ ${_X} -le 4 ]]
do
  [[ ${_X} -lt 2 ]] && echo "X is less than 2!

  _Y=`expr ${_X} + 1`

  if [[ ${_Y} -eq 3 ]]
  then
    echo "Y is now equal to ${_Y}"
  fi

  _X=${_Y}
done
</pre>
<p>スクリプトを実行する前に、PS4変数の値を標準出力に表示させたいものに変更します。</p>
<pre>
# export PS4="DEBUG => "
</pre>
<p>次に、Listing 13のようにおそらく有益であろう情報の爆撃を自分自身に向かって送り付けてあげましょう。</p>
<p><strong>Listing 13</strong>: set -xの出力例</p>
<pre>
<strong># ./make_errors</strong>
DEBUG => _X=1
DEBUG => [[ 1 -le 4 ]]
DEBUG => [[ 1 -lt 2 ]]
DEBUG => echo 'X is less than 2!'
X is less than 2!
DDEBUG => expr 1 + 1
DEBUG => _Y=2
DEBUG => [[ 2 -eq 3 ]]
DEBUG => _X=2
DEBUG => [[ 2 -le 4 ]]
DEBUG => [[ 2 -lt 2 ]]
DDEBUG => expr 2 + 1
DEBUG => _Y=3
DEBUG => [[ 3 -eq 3 ]]
DEBUG => echo 'Y is now equal to 3'
Y is now equal to 3
DEBUG => _X=3
DEBUG => [[ 3 -le 4 ]]
DEBUG => [[ 3 -lt 2 ]]
DDEBUG => expr 3 + 1
DEBUG => _Y=4
DEBUG => [[ 4 -eq 3 ]]
DEBUG => _X=4
DEBUG => [[ 4 -le 4 ]]
DEBUG => [[ 4 -lt 2 ]]
DDEBUG => expr 4 + 1
DEBUG => _Y=5
DEBUG => [[ 5 -eq 3 ]]
DEBUG => _X=5
DEBUG => [[ 5 -le 4 ]]
</pre>
<p>ご覧の通り、大量の情報が表示されます。すべてのコマンドが評価され、実行されています。また、デバッグ情報ではコメント行の内容が出力されていないことにも気付くはずです。これはコメント行の文字列といのは評価はされるけど、実行されていないからです。ありがたいことに、最初に修正して以降もスクリプトには問題はないようです。</p>
<p>一つだけ覚えておいて欲しいのは、set -xを使用した際、そのスクリプトに内部関数がある場合に、set -xオプションは子供の関数にも引き継がれるということです。しかし、set -xが内部関数にしか含まれない場合、その内部関数で実行されるコードとその子供の関数にしかデバッグオプションは引き継がれず、親のスクリプト部分には影響を及ぼしません。そのため、子供の関数が呼び出したルーチンが何をしているのか分からなくなります。</p>
<h3>結び</h3>
<p>私たちはシェルスクリプトであれ、Cであれ、Javaであれ、その他の言語であれ、プログラミング技術を向上させようとしています。コードは簡潔にし、明快かつ柔軟性を持ち、文書化を怠らないという基本ルールを守っていれば、あなたが学んだデバッグ手法から学ぶことがほとんどないような優れたシェルスクリプトを書けるようになるはずです。頑張ってください！</p>]]>
    </content>
</entry>

<entry>
    <title>シェルスクリプト作成のテクニック Part 3</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/09/more-shell-scripting-techniques-part3.html" />
    <id>tag:randomtranslations.com,2008://1.66</id>

    <published>2008-09-09T03:00:03Z</published>
    <updated>2008-09-12T11:53:25Z</updated>

    <summary>※このエントリーは、developerWorks : AIX and UNIXの「Speaking UNIX: More shell scripting techniques」を翻訳したエントリーのPart 3です。 【訳注】 「シェルスクリプト作成のテクニック Part 2」の続きのエントリーです。 文書化、文書化、文書化 自分のキャリアを振り返ってみた時、この問題の犠牲にならなかった人がいないはずがありません。もしかしたらあなたも、すでに退職された方が書いた10年前のスクリプトを調べてもらえないかとお願いされたことはありませんか？その時、「ええ、いいですよ」と快諾出来ましたか？問題ない場合もあるでしょう。しかし、そのスクリプトが複雑だったり、あなたにとって馴染みのないコマンドが使われていたり、あなたが慣れ親しんだものとはまったく異なるスタイルだったり、単純に動かなかったりした場合、作者がスクリプトを作成した時に何を意図していたかヒントが記述されていれば、本当に助かるものです。あるいは、貴方がスクリプトを作成し、それは一回限りのもので二度と使うことはないとします。その場合も文書化は必要ないと言い切れるでしょうか。また、数週間の用途で巨大なスクリプトを作成し、あなたはその動作のすべてを把握している場合でも、他の人がそれを見ることになった場合、その人は困惑してしまうかもしれません。ここではスクリプトの文書化がユーザーだけでなく開発者にとっても重要である理由をいくつかの例から紹介していきたいと思います。...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="AIX" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="aix" label="AIX" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="shellscript" label="Shell Script" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="unix" label="UNIX" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは、<a href="http://www.ibm.com/developerworks/aix/">developerWorks : AIX and UNIX</a>の「<a href="http://www.ibm.com/developerworks/aix/library/au-speakingunix_shellscripttech/">Speaking UNIX: More shell scripting techniques</a>」を翻訳したエントリーのPart 3です。</p>
<p>【訳注】 「<a href="http://randomtranslations.com/archives/2008/09/more-shell-scripting-techniques-part2.html">シェルスクリプト作成のテクニック Part 2</a>」の続きのエントリーです。</p>
<h3>文書化、文書化、文書化</h3>
<p>自分のキャリアを振り返ってみた時、この問題の犠牲にならなかった人がいないはずがありません。もしかしたらあなたも、すでに退職された方が書いた10年前のスクリプトを調べてもらえないかとお願いされたことはありませんか？その時、「ええ、いいですよ」と快諾出来ましたか？問題ない場合もあるでしょう。しかし、そのスクリプトが複雑だったり、あなたにとって馴染みのないコマンドが使われていたり、あなたが慣れ親しんだものとはまったく異なるスタイルだったり、単純に動かなかったりした場合、作者がスクリプトを作成した時に何を意図していたかヒントが記述されていれば、本当に助かるものです。あるいは、貴方がスクリプトを作成し、それは一回限りのもので二度と使うことはないとします。その場合も文書化は必要ないと言い切れるでしょうか。また、数週間の用途で巨大なスクリプトを作成し、あなたはその動作のすべてを把握している場合でも、他の人がそれを見ることになった場合、その人は困惑してしまうかもしれません。ここではスクリプトの文書化がユーザーだけでなく開発者にとっても重要である理由をいくつかの例から紹介していきたいと思います。</p>]]>
        <![CDATA[<p>Listing 6はあるコードに含まれる関数を表示しています。</p>
<p><strong>Listing 6</strong>: コメントのないスクリプトの例</p>
<pre>
confirm_and_exit() {
  [[ ${_DEBUG_LEVEL} -ge 3 ]] && set -x
  while [[ -z ${_EXIT_ANS} ]]
  do
    cup_echo "Are you sure you want to exit? [Y/N]  
        \c" ${_PROMPT_ERR_ROW} ${_PROMPT_ERR_COL}
    ${_TPUT_CMD} cnorm
    read ${_NO_EOL_FLAG:+${_READ_FLAG:-'-n'}} ${_NO_EOL_FLAG} _EXIT_ANS
    ${_TPUT_CMD} civis
  done

  case ${_EXIT_ANS} in
    [Nn])  unset _EXIT_ANS; return 0;;
    [Yy])  exit_msg 0 1 "Exiting Script";;
       *)  invalid_selection ${_EXIT_ANS}; unset _EXIT_ANS;;
  esac
  return 0
}
</pre>
<p>あなたがスクリプトに精通されている方なら、これを読むことが出来ると思います。しかし、スクリプトの勉強中の方がこれを見た場合、この関数が何をしているのか分からないかもしれません。数分間の時間を確保してスクリプトにコメントを追加するだけで、状況は一変します。Listing 7ではコメントを付けた同じ関数を表示しています。</p>
<p><strong>Listing 7</strong>: コメントの付いたスクリプトの例</p>
<pre>
#########################################
# 関数名 confirm_and_exit
#########################################
confirm_and_exit() {
  # デバッグレベルが 3 以上に設定されている場合は、評価されたすべての行が標準出力に出力されます
  [[ ${_DEBUG_LEVEL} -ge 3 ]] && set --x

  # ユーザーが正しい回答を入力されるまで、プロンプトを表示し続ける
  while [[ -z ${_EXIT_ANS} ]]
  do
    # スクリプトを抜けるかどうかユーザーにプロンプトを表示する
    # 関数 cup_echo は tpu cup <x> <y> をコールします
    # 構文:
    # cup_echo <表示させる文字列> <表示させる行番号> <表示させる列番号>
    cup_echo "Are you sure you want to exit? [Y/N]  
        \c" ${_PROMPT_ERR_ROW} ${_PROMPT_ERR_COL}

    # tput を使ってカーソルを通常に戻す
    ${_TPUT_CMD} cnorm

    # ユーザーが入力した値を読み取る
    # 変数 _NO_EOL_FLAG が設定されている場合は、_READ_FLAG の値か、"-n"を使う
    # 変数 _NO_EOL_FLAG が設定されている場合は、read から読み込まれた値を文字列として用いる
    # ユーザーが入力した値を変数 _EXIT_ANS に設定する
    read ${_NO_EOL_FLAG:+${_READ_FLAG:-'-n'}} ${_NO_EOL_FLAG} _EXIT_ANS

    # tput を使ってカーソルを非表示にする
    ${_TPUT_CMD} civis
  done

  # ユーザーが"n"を入力した場合は、リターンコード 0 を返し、コードの一個前のブロックに戻る
  # ユーザーが"y"を入力した場合は、スクリプトを抜ける
  # ユーザーがそれ以外の値を入力した場合は、関数 invalid_selection を実行する 
  case ${_EXIT_ANS} in
    [Nn])  unset _EXIT_ANS; return 0;;
    [Yy])  exit_msg 0 1 "Exiting Script";;
       *)  invalid_selection ${_EXIT_ANS}; unset _EXIT_ANS;;
  esac

  # リターンコード 0 を返して関数を抜ける
  return 0
}
</pre>
<p>こんな小さな関数に対してやるには極めて退屈で過剰な作業かもしれませんが、コメントに記載されている内容は、初心者のシェルスクリプターや関数の内容を調べる人間にとって極めて有益な情報と言えます。</p>
<p>他にシェルスクリプトのコメントの有効活用の例としては、リターンコードと変数の説明が挙げられます。</p>
<p>Listing 8はあるシェルスクリプトの冒頭部分です。</p>
<p><strong>Listing 8</strong>: 文書化されていない変数の例</p>
<pre>
#!/usr/bin/bash
trap 'exit_msg 1 0 "Signal Caught. Exiting..."' HUP INT QUIT KILL ABRT
trap 'window_size_changed' WINCH

_MSG_SLEEP_TIME=3
_RETNUM_SIZE=6
_DEBUG_LEVEL=0
_TMPDIR="/tmp"
_SP_LOG="${0##*/}.log"
_SP_REQUESTS="${HOME}/sp_requests"
_MENU_ITEMS=15
LESS="-P LINE\: %l"
export _SP_REQUESTS _TMPDIR _SP_LOG _DB_BACKUP_DIR 
    export _DEBUG_LEVEL _NEW_RMSYNC _RMTOTS_OFFSET_COL
</pre>
<p>繰り返しになりますが、これらの変数が何を目的として、どんな値が入るのかを理解するのは極めて困難です。スクリプトを全部読んでみない限り、これらの変数だけでは何も分かりません。それに加えて、このスクリプトで使われているリターンコードに関する言及はありません。こうなるとシェルスクリプトのトラブルシューティングは必要以上に難しいものとなります。Listing 8にリターンコードの意味を説明したセクションを追加して、紛らわしさをなくしましょう。Listing 9を見て下さい。</p>
<p><strong>Listing 9</strong>: 文書化された変数の例</p>
<pre>
#!/usr/bin/bash
#########################################################################
# trap
#########################################################################
# ユーザーがスクリプトを抜ける際のtrap
trap 'exit_msg 1 0 "Signal Caught. Exiting..."' HUP INT QUIT KILL ABRT
trap 'window_size_changed' WINCH                # ユーザーがウインドウをリサイズした時のtrap
#########################################################################

#########################################################################
# 定義済み変数/export された変数
#########################################################################
_MSG_SLEEP_TIME=3             	       # すべてのメッセージで使われる sleep の秒数
                                      # (未定義の場合、デフォルトは 3 秒になる)
_CUSTNUM_SIZE=6                       # この場所での顧客番号の長さ
                                      # (未定義の場合、デフォルトは 6 になる)
_DEBUG_LEVEL=0                        # デバッグメッセージをログする。ログレベルは累積
                                      # (例： 1 は 1、2 は 1 と 2、3 は 1 と 2 と 3 )
                                      # (未定義の場合、デフォルトは 0 になる)
                                      # ログレベル:
                                      #  0 = メッセージなし
                                      #  1 = 簡単なメッセージ (スクリプトの開始やエラーなど)
                                      #  2 = 環境の設定 ( set や env )
                                      #  3 = set -x を実行 (しつこいくらいメッセージが出る)
_TMPDIR="/tmp"                        # 作業ファイルや一次ファイルを格納するディレクトリ
                                      # (未定義の場合、デフォルトは /tmp になる)
_SP_LOG="${0##*/}.log"                # スクリプトファイルのログ
_SP_REQUESTS="${HOME}/sp_requests"
			               # 顧客レコード要求のファイル
                                      # 開始時に読み込まれる
_MENU_ITEMS=15                        # ページ単位に表示するアイテムのデフォルト数
                                      # (未定義の場合、デフォルトは 10 になる)
LESS="-P LINE\: %l"                   # 'less'プロンプトをフォーマットする。詳しくは MAN less を参照


# 上記で定義した変数を export する
export _MSG_SLEEP_TIME _CUSTNUM_SIZE _DEBUG_LEVEL _TMPDIR 
    _SP_LOG _SP_REQUESTS _MENU_ITEMS
#########################################################################
</pre>
<p>分かりやすくなりましたか？すべての変数が組織化と詳細化されたため、初めてこのスクリプトを読む人でもこのプログラムが何であるか判断しやすくなったはずです。</p>
<p>【訳注】 「<a href="http://randomtranslations.com/archives/2008/09/more-shell-scripting-techniques-part4.html">シェルスクリプト作成のテクニック Part 4</a>」に続きます。</p>]]>
    </content>
</entry>

<entry>
    <title>シェルスクリプト作成のテクニック Part 2</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/09/more-shell-scripting-techniques-part2.html" />
    <id>tag:randomtranslations.com,2008://1.65</id>

    <published>2008-09-09T03:00:02Z</published>
    <updated>2008-09-12T03:32:48Z</updated>

    <summary>※このエントリーは、developerWorks : AIX and UNIXの「Speaking UNIX: More shell scripting techniques」を翻訳したエントリーのPart 2です。 【訳注】 「シェルスクリプト作成のテクニック Part 1」の続きのエントリーです。 スクリプトは柔軟に 初心者がプログラミングする際に直面する別の問題が、プログラムやシェルスクリプトの中に静的な値をハードコードしてしまうことです。これはスクリプトの柔軟性を損なってしまい、要するに悪いプログラミングだとみなされます。スクリプトを動かすためにシステム管理者や開発者がその都度スクリプトを修正するのではなく、他の値を与えた場合にもスクリプトが動くように、変数と引数をスクリプトや関数に追加しておきましょう。...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="AIX" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="aix" label="AIX" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="shellscript" label="Shell Script" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="unix" label="UNIX" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは、<a href="http://www.ibm.com/developerworks/aix/">developerWorks : AIX and UNIX</a>の「<a href="http://www.ibm.com/developerworks/aix/library/au-speakingunix_shellscripttech/">Speaking UNIX: More shell scripting techniques</a>」を翻訳したエントリーのPart 2です。</p>
<p>【訳注】 「<a href="http://randomtranslations.com/archives/2008/09/more-shell-scripting-techniques-part1.html">シェルスクリプト作成のテクニック Part 1</a>」の続きのエントリーです。</p>
<h3>スクリプトは柔軟に</h3>
<p>初心者がプログラミングする際に直面する別の問題が、プログラムやシェルスクリプトの中に静的な値をハードコードしてしまうことです。これはスクリプトの柔軟性を損なってしまい、要するに悪いプログラミングだとみなされます。スクリプトを動かすためにシステム管理者や開発者がその都度スクリプトを修正するのではなく、他の値を与えた場合にもスクリプトが動くように、変数と引数をスクリプトや関数に追加しておきましょう。</p>]]>
        <![CDATA[<p>それでは例題です。Listing 3は柔軟性のない品質の低いスクリプトの例です。</p>
<p><strong>Listing 3</strong>: 柔軟性のないスクリプトの例</p>
<pre>
#!/bin/bash

if [[ -f /home/cormany/FileA ]]
then
  echo "Found file '/home/cormany/FileA'"
elif [[ -f /home/cormany/DirA/FileA ]]
then
  echo "Found file '/home/cormany/DirA/FileA'"
else
  echo "Unable to find file FileA"
fi
</pre>
<p>このスクリプトは一つのファイルを2つの場所から探すことしか出来ない用途の限定的なスクリプトです。</p>
<p>もっと考え方を広げてみましょう。Listing 4では同じような動作をしますが、どんなファイルでも、どんな場所からでも探すことが出来るようにしてみましょう。</p>
<p><strong>Listing 4</strong>: より柔軟性の増したスクリプト</p>
<pre>
#!/bin/bash

exit_msg() {
  [[ $# -gt 1 ]] && echo "${0##*/} (${1}) - ${2}"
  exit ${1:-0}
}

[[ $# -lt 2 ]] && exit_msg 1 "Usage: ${0##*/} <file name> <location>"

_FNAME="${1}"
_DNAME="${2}"

[[ ! -d "${_DNAME}" ]] && exit_msg 2 "Unable to read or find directory '${_DNAME}'"

if [[ -f "${_DNAME}/${_FNAME}" ]]
then
  exit_msg 0 "Found file '${_DNAME}/${_FNAME}'"
else
  exit_msg 3 "Unable to find file '${_DNAME}/${_FNAME}'"
fi
</pre>
<p>この例ではより柔軟になりました。ユーザーは探して欲しいファイルと探したい場所を入力できるようになりました。</p>
<h3>オプションを追加する</h3>
<p>シェルスクリプトを作成する際、ある人が「これがあれば便利だよね！」とか「これもやってくれるなんて凄いよね！」と言っている一方で、他の人はそんなものはいらないと思っていたり、そんな余計な動作はして欲しくないと思っていたりします。人々は選択出来ることを喜びます。それならば彼らにオプションを与えましょう。ビルトインされているシェルコマンドのgetoptはこの役割をしてくれます。</p>
<p>Listing 5は、AIXでgetoptがどのように動作するかを説明した例です。</p>
<p><strong>Listing 5</strong>: getoptの例</p>
<pre>
#!/usr/bin/ksh

_ARGS=`getopt -o x --long xxxxx -n ${0##*/} -- "$@"`
while [[ $# -gt 0 ]]
do
  case "${1}" in
    -x|--xxxxx)  echo "Arg x hit!"; shift;;
            --)  shift; break;;
             *)  echo "Invalid Option: ${1}"; break;;
  esac
done
</pre>
<p>getoptを含むスクリプト（ここでは仮にopttestとします）を実行する際、-xまたは--xxxxxという有効な引数を与えると、getoptはswitch判定を行い、case switchの中のコードを実行します。</p>
<pre>
# ./opttest -x
Arg x hit!
</pre>
<p>今度は無効なswitchオプションを与えて実行してみます。</p>
<pre>
# ./opttest -a
Invalid Option: -a
</pre>
<p>【訳注】 「<a href="http://randomtranslations.com/archives/2008/09/more-shell-scripting-techniques-part3.html">シェルスクリプト作成のテクニック Part 3</a>」に続きます。</p>]]>
    </content>
</entry>

<entry>
    <title>シェルスクリプト作成のテクニック Part 1</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/09/more-shell-scripting-techniques-part1.html" />
    <id>tag:randomtranslations.com,2008://1.64</id>

    <published>2008-09-09T03:00:01Z</published>
    <updated>2009-01-04T06:16:19Z</updated>

    <summary>※このエントリーは、developerWorks : AIX and UNIXの「Speaking UNIX: More shell scripting techniques」を翻訳したエントリーのPart 1です。 他のUNIXやLinuxと同じように、IBM AIXにはシステム管理者や開発者、そしてユーザーが日時タスクや業務の効率化に取り組む際に味方となる強力なツールが存在します。その一つがシェルスクリプトです。 とはいえ、UNIXと数年付き合い、シェルスクリプトに手を出してきた人でも、オペレーティングシステムの裏側については勉強中で、まだまだスクリプトをマスターとしたとは言えない人も多いと思います。この記事では、シェルスクリプトとは何かから始まり、より高度なスクリプトを書く方法をご紹介します。一般的なプログラミングの基礎から簡潔なスクリプトの書き方、より柔軟性のあるスクリプトの書き方、明快なスクリプトの書き方、スクリプト内のドキュメンテーション方法、そしてスクリプトのデバッグがその内容です。...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="AIX" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="aix" label="AIX" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="shellscript" label="Shell Script" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="unix" label="UNIX" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは、<a href="http://www.ibm.com/developerworks/aix/">developerWorks : AIX and UNIX</a>の「<a href="http://www.ibm.com/developerworks/aix/library/au-speakingunix_shellscripttech/">Speaking UNIX: More shell scripting techniques</a>」を翻訳したエントリーのPart 1です。</p>
<p>他のUNIXやLinuxと同じように、IBM AIXにはシステム管理者や開発者、そしてユーザーが日時タスクや業務の効率化に取り組む際に味方となる強力なツールが存在します。その一つがシェルスクリプトです。</p>
<p>とはいえ、UNIXと数年付き合い、シェルスクリプトに手を出してきた人でも、オペレーティングシステムの裏側については勉強中で、まだまだスクリプトをマスターとしたとは言えない人も多いと思います。この記事では、シェルスクリプトとは何かから始まり、より高度なスクリプトを書く方法をご紹介します。一般的なプログラミングの基礎から簡潔なスクリプトの書き方、より柔軟性のあるスクリプトの書き方、明快なスクリプトの書き方、スクリプト内のドキュメンテーション方法、そしてスクリプトのデバッグがその内容です。</p>]]>
        <![CDATA[<h3>スクリプトは簡潔に</h3>
<p>シェルスクリプト学習の世界に入ってきた人々が直面する問題の一つが、すでにスクリプト内に記述した処理をもう一度記述しようとしてしまうことです。それらの処理をコピーして、ハードコードされた値を変更するのではなく、関数を作って両方の処理を扱えるようにすることで、スクリプトを簡潔にすることが出来ます。関数を一箇所に集めれば、スクリプトが標準化され、一定の形式を保つことが出来ます。スクリプトのある箇所から呼び出された関数が正常に動くならば、他の箇所から呼び出されても正しく動く可能性がある程度保障されます。</p>
<p>それでは例題です。Listing 1のスクリプトを凝縮させ、短くより明快なプログラムへと簡潔化させて下さい。</p>
<p><strong>Listing 1</strong>: より簡潔に記述できるスクリプトの例</p>
<pre>
#!/usr/bin/ksh

if [[ $# -lt 2 ]]
then
  echo "Usage: ${0##*/} <file name #1> <file name #2>"
  exit 0
fi

if [[ ! -f "${1}" ]]
then
  echo "Unable to find file '${1}'"
  exit 1
fi

if [[ ! -r "${1}" ]]
then
  echo "Unable to read file '${1}'"
  exit 2
fi

gzip ${1}
ls -l ${1}.gz


if [[ ! -f "${2}" ]]
then
  echo "Unable to find file '${2}'"
  exit 1
fi

if [[ ! -r "${2}" ]]
then
  echo "Unable to read file '${2}'"
  exit 2
fi

gzip ${2}
ls -l ${2}.gz
</pre>
<p>このスクリプトは本当にひどいと思います（有難いことにこれはただの例題です）。スクリプトは出来るだけ凝縮させましょう。読者の目の疲労も考えて、Listing 2ではより明快なバージョンのスクリプトを掲載します。</p>
<p><strong>Listing 2</strong>: Listing 1のスクリプトを凝縮させたもの</p>
<pre>
#!/usr/bin/ksh

exit_msg() {
  [[ $# -gt 1 ]] && echo "${0##*/} (${1}) - ${2}"
  exit ${1:-0}
}

[[ $# -lt 2 ]] && exit_msg 0 "Usage: ${0##*/} <file name #1> <file name #2>"

for _FNAME in $@
do
  [[ ! -f "${_FNAME}" ]] && exit_msg 1 "Unable to find file '${_FNAME}'"
  [[ ! -r "${_FNAME}" ]] && exit_msg 2 "Unable to read file '${_FNAME}'"

  gzip ${_FNAME}
  ls -l ${_FNAME}.gz
done
</pre>
<p>違いに気付かれましたか？メッセージの表示とリターンコードを返すための簡単な関数を追加しました。また、すべての引数をforループで処理させることにより、より簡潔で理解しやすくしました。</p>
<p>【訳注】 「<a href="http://randomtranslations.com/archives/2008/09/more-shell-scripting-techniques-part2.html">シェルスクリプト作成のテクニック Part 2</a>」に続きます。</p>]]>
    </content>
</entry>

<entry>
    <title>歴史上、簡単かつ最も効果的なコラボレーションツールとは</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/06/the-most-effective-collaboration-tool-in-history-is.html" />
    <id>tag:randomtranslations.com,2008://1.63</id>

    <published>2008-06-10T14:00:00Z</published>
    <updated>2008-08-30T14:02:57Z</updated>

    <summary>※このエントリーは、LepoLand - A Blog by Alan Lepofskyの「Easily The Most Effective Collaboration Tool In History Is...」を翻訳したエントリーです。 それはフェイス・トゥ・フェイス（対面）のコミュニケーションです。 もちろん、コラボレーションソフトウェアを販売しているベンダーの人間がこんなことを言うことに奇異な感じがするのは分かります。でも、私の言うことを聞いてください。...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="Miscellaneous" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="collaboration" label="Collaboration" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="communication" label="Communication" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは、<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/">LepoLand - A Blog by Alan Lepofsky</a>の「<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/the-most-effective-collaboration-tool">Easily The Most Effective Collaboration Tool In History Is...</a>」を翻訳したエントリーです。</p>
<p>それはフェイス・トゥ・フェイス（対面）のコミュニケーションです。</p>
<p>もちろん、コラボレーションソフトウェアを販売しているベンダーの人間がこんなことを言うことに奇異な感じがするのは分かります。でも、私の言うことを聞いてください。</p>]]>
        <![CDATA[<p>Eメールやチャット、ブログ、Wiki、会議室、マイクロブログ、共有ブックマークなどのコラボレーションツールにはそれぞれ大きな価値があります。それらを使えば、情報の共有やノウハウの蓄積、人間関係の構築、連絡、組織化、販売などなど、といったことが可能になります。とはいえ、それらがどれだけ優れていようと、同じ部屋の中で会話することの重要性は揺らぐことはありません。</p>
<p>この数週間、いつも以上に出張をする中で、このことを何度も考えさせられました。会うのがお客様やビジネスパートナー、家族や友達の誰であろうと、それらはどんなソフトウェアを使っても置き換えられない素晴らしい経験となりました。</p>
<p>もちろん、フェイス・トゥ・フェイスのコミュニケーションはお金が掛かりますし、ちっともエコじゃないですね（最近うるさい話です）。しかし、ソフトウェアではこんなことは出来ません。</p>
<ul>
<li>あなたの語る内容にお客様が関心を持った瞬間の目の輝きに気付く</li>
<li>不満を持ったパートナーの苦情の声を直接聞く</li>
<li>家族の喜ぶ顔を見る</li>
<li>ハグする</li>
<li>笑顔を交わす</li>
</ul>
<p>私はこのことを、これからの3日間で行われるEnterprise 2.0で述べようと思います。このカンファレンスでは、"Web 2.0世界"の優れたビジネスソリューションが一同に会します。ただし、みんながボストンという場所に地理的に集結しないといけません。もちろん、ブログやPodcast、スライドショーやTwitterの更新通知などを通じて、イベント参加者以上の人々が"参加"するでしょう。しかし、一番優れた参加方法は、セッションを直に聴き、廊下で会話し、ライブデモを観賞する、あるいは夜のバーに飲みに行く、といったことであると私は知っています。</p>
<p>何が言いたいのかって？コラボレーションソフトウェアは世界を小さくする素晴らしいツールです。しかし、現実の触れ合いの代わりになるものではありません。証明しろって？オンラインでこんなこと言われたことないです。「あれ、もっと背が高いのかと思ってましたよ」</p>
<p>フェイス・トゥ・フェイスのコミュニケーションは素晴らしいものです。</p>]]>
    </content>
</entry>

<entry>
    <title>Lotus Notesの基礎--チェックボックスとラジオボタン</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/05/lotus-notes-basics-checkboxes-and-radio-buttons.html" />
    <id>tag:randomtranslations.com,2008://1.62</id>

    <published>2008-05-06T13:45:00Z</published>
    <updated>2008-07-12T06:03:52Z</updated>

    <summary>※このエントリーは、LepoLand - A Blog by Alan Lepofskyの「Lotus Notes Basics - Checkboxes and Radio Buttons」を翻訳したエントリーです。 テキストフィールドとリッチテキストフィールドでは、フォームに情報を記入する際、どうやって文章や画像や添付ファイルを入力するかについてご説明しました。一方、あなたが情報を入力するのではなく、事前に選択肢が定義されているリストから選ぶ場合もあります。事前定義の選択肢は、情報の一貫性を保ち、スペリングミスなどのヒューマン・エラーを回避したり、フォームのワークフローの制御のために使われることがあります。例えば、「はい」か「いいえ」の質問にあなたが答えると、それによって次の質問が変わるといったケースです。 ...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="Lotus Notes/Domino" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="basics" label="Basics" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="lotusnotesdomino" label="Lotus Notes/Domino" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは、<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/">LepoLand - A Blog by Alan Lepofsky</a>の「<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/lotus-notes-basics-checkboxes-and-radio-buttons">Lotus Notes Basics - Checkboxes and Radio Buttons</a>」を翻訳したエントリーです。</p>
<p><a href="http://randomtranslations.com/archives/2008/05/lotus-notes-basics-text-fields-and-rich-text-fields.html">テキストフィールドとリッチテキストフィールド</a>では、フォームに情報を記入する際、どうやって文章や画像や添付ファイルを入力するかについてご説明しました。一方、あなたが情報を入力するのではなく、事前に選択肢が定義されているリストから選ぶ場合もあります。事前定義の選択肢は、情報の一貫性を保ち、スペリングミスなどのヒューマン・エラーを回避したり、フォームのワークフローの制御のために使われることがあります。例えば、「はい」か「いいえ」の質問にあなたが答えると、それによって次の質問が変わるといったケースです。</p>
]]>
        <![CDATA[<p>下のフィールドには同じ値が記入されています。どちらのケースでもRed、Yellow、Blue、Greenの選択肢から選ぶことが出来ます。ところで、両者の違いに気付かれましたか？</p>
<p><a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/lotus-notes-basics-checkboxes-and-radio-buttons/content/M2?OpenElement" target="_blank">:::画像1:::</a></p>
<p>左側のフィールドはチェックボックスと呼ばれており、リストの中から一つ以上の値を選択することが出来ます。</p>
<p>右側のフィールドはラジオボタンと呼ばれており、一時点で一つだけ値を選択することが出来ます。あなたが他の選択肢をクリックすると、現在の選択されているものは解除されてしまいます。例えば、Blueをクリックすると、Yellowは選択状態にはならなくなります。</p>
<p>ラジオボタンとチェックボックスは複数の形式で表示することが出来ます。このレイアウトはフォームの設計者がコントロールすることが出来ます。</p>
<p><a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/lotus-notes-basics-checkboxes-and-radio-buttons/content/M3?OpenElement" target="_blank">:::画像2:::</a></p>]]>
    </content>
</entry>

<entry>
    <title>Lotus Notesの基礎--テキストフィールドとリッチテキストフィールド</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/05/lotus-notes-basics-text-fields-and-rich-text-fields.html" />
    <id>tag:randomtranslations.com,2008://1.61</id>

    <published>2008-05-05T14:00:01Z</published>
    <updated>2008-07-12T06:04:10Z</updated>

    <summary>※このエントリーは、IBM Lotus Notes Hints, Tips, and Tricksの「Lotus Notes Basics - Text Fields and Rich Text Fields」を翻訳したエントリーです。 前回のエントリーで、Lotus Notesのフォームには、情報を入力するためのフィールドが存在していると説明しました。今日からは、いろんな種類のフィールドについて見ていきましょう。まずはプレーンテキストとリッチテキストです。...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="Lotus Notes/Domino" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="basics" label="Basics" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="lotusnotesdomino" label="Lotus Notes/Domino" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは、<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/">IBM Lotus Notes Hints, Tips, and Tricks</a>の「<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/lotus-notes-basics-text-fields-and-rich-text-fields">Lotus Notes Basics - Text Fields and Rich Text Fields</a>」を翻訳したエントリーです。</p>
<p><a href="http://randomtranslations.com/archives/2008/05/lotus-notes-basics-fields-on-a-form.html">前回のエントリー</a>で、Lotus Notesのフォームには、情報を入力するためのフィールドが存在していると説明しました。今日からは、いろんな種類のフィールドについて見ていきましょう。まずはプレーンテキストとリッチテキストです。</p>]]>
        <![CDATA[<p>プレーンテキストフィールドは、文字入力ができるフィールドです。しかし、このフィールでは文字色や文字サイズやフォントの種類の変更、その他装飾を施すことが出来ません。また、画像や表、添付ファイルの貼付けも出来ません。テキストフィールドの具体例として、メールのタイトル行が挙げられます。</p>
<p>リッチテキストフィールドには何でも入力出来ます。これは良い面と悪い面があります。良い面としては、話を伝わりやすくするために画像を用いたり、データを表示するのに表を使ったり、表示内容をセクションで区切ることも出来ます。悪い面としては、リッチテキストには20MBのプレゼンテーションファイルが貼付けられるので、それを100人にメール送信してしまうことがあるということです（泣）。リッチテキストフィールドの具体例として、メールの本文が挙げられます。</p>
<p>フィールドの種類というのは、開発者がアプリケーション開発時に決定します。ですので、あなたが変更出来るものではありません。</p>
<p>こちらはプレーンテキストとリッチテキストの比較例です。</p>
<p><a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/lotus-notes-basics-text-fields-and-rich-text-fields/content/M2?OpenElement" target="_blank">:::画像1:::</a></p>]]>
    </content>
</entry>

<entry>
    <title>Lotus Notesの基礎--フォームとフィールド</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/05/lotus-notes-basics-fields-on-a-form.html" />
    <id>tag:randomtranslations.com,2008://1.60</id>

    <published>2008-05-05T14:00:00Z</published>
    <updated>2008-05-06T04:02:22Z</updated>

    <summary>※このエントリーは、IBM Lotus Notes Hints, Tips, and Tricksの「Lotus Notes Basics - Fields on a Form」を翻訳したエントリーです。 フォームについて理解しようとするならば、紙のことを考えてみるといいと思います。買い物リストやチェックリスト、履歴書や雑誌の購読申込書、納税書があるとします。フォ ームには、あなたが情報を書き込むフィールドが存在しています。 ...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="Lotus Notes/Domino" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="basics" label="Basics" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="lotusnotesdomino" label="Lotus Notes/Domino" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは、<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/">IBM Lotus Notes Hints, Tips, and Tricks</a>の「<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/lotus-notes-basics-fields-on-a-form">Lotus Notes Basics - Fields on a Form</a>」を翻訳したエントリーです。</p>
<p>フォームについて理解しようとするならば、紙のことを考えてみるといいと思います。買い物リストやチェックリスト、履歴書や雑誌の購読申込書、納税書があるとします。フォ
ームには、あなたが情報を書き込むフィールドが存在しています。</p>

]]>
        <![CDATA[<p><a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/lotus-notes-basics-fields-on-a-form/content/M2?OpenElement" target="_blank">:::画像1:::</a></p>
<p>それでは、Lotus Notesのメールメッセージをフォームと考えてみましょう。あなたはフィールドに情報を記入しています。例えば、送り先の名前やメールのタイトルとか。</p>
<p><a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/lotus-notes-basics-fields-on-a-form/content/M3?OpenElement" target="_blank">:::画像2:::</a></p>
<p>アドレス帳の連絡先も一種のフォームです。あなたはそこに、氏名やメールアドレス、電話番号などを入力しています。</p>
<p><a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/lotus-notes-basics-fields-on-a-form/content/M4?OpenElement" target="_blank">:::画像3:::</a></p>
<p>カレンダーのエントリーもフォームです。そこには日時や時間、タイトルや場所が入ります。To Doもそうですし、ブログのエントリーもそうです。会議データベースの質問もそ
うですし、ヘルプデスクアプリケーションの質問票もそうです。あなたの会社のLotus Notesで使われているその他の事例も同じことです。</p>
<p>【訳注】続きのエントリー「<a href="http://randomtranslations.com/archives/2008/05/lotus-notes-basics-text-fields-and-rich-text-fields.html">Lotus Notesの基礎--テキストフィールドとリッチテキストフィールド</a>」もご覧下さい。</p>]]>
    </content>
</entry>

<entry>
    <title>みんな新しくてキラキラしたものが好き</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/04/its-new-its-shiny-and-you-want-one.html" />
    <id>tag:randomtranslations.com,2008://1.55</id>

    <published>2008-04-25T14:00:00Z</published>
    <updated>2008-05-03T19:55:50Z</updated>

    <summary>※このエントリーは、IBM Lotus Notes Hints, Tips, and Tricksの「Its new. Its shiny. And you want one.」を翻訳したエントリーです。 ここ最近、ブログやTwitterやIMで私が議論してきたのは、新しくて流行っているものに人々がどれほど興味を惹かれるかということです。別にこれは批判しているわけではありません。むしろ私なんかがそんな傾向を持った人の最たるものですから。私の上司はこれを“ヒカリモノ症候群”と呼んでいます。「Freindsterを見てみろよ」「いや、これからはMySpaceだ。」「はぁ？Facebookだろ。」「これからはSecond Lifeの時代だよ。」「いやいや、Twitterでしょ。」なんてことを何度も何度も繰り返しているんです。Web 2.0の世界というのは、この「新しくてクールなもの」というミームで成り立っています。Go2Web2.0をちょっと見てください。私が何を言いたいか分かると思います。...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="Lotus Notes/Domino" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="lotusnotesdomino" label="Lotus Notes/Domino" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="trend" label="Trend" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="web20" label="Web 2.0" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは、<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/">IBM Lotus Notes Hints, Tips, and Tricks</a>の「<a href="http://www.alanlepofsky.com/alepofsky/alanblog.nsf/dx/enthused">Its new. Its shiny. And you want one.</a>」を翻訳したエントリーです。</p>
<p>ここ最近、ブログやTwitterやIMで私が議論してきたのは、新しくて流行っているものに人々がどれほど興味を惹かれるかということです。別にこれは批判しているわけではありません。むしろ私なんかがそんな傾向を持った人の最たるものですから。私の上司はこれを“ヒカリモノ症候群”と呼んでいます。「Freindsterを見てみろよ」「いや、これからはMySpaceだ。」「はぁ？Facebookだろ。」「これからはSecond Lifeの時代だよ。」「いやいや、Twitterでしょ。」なんてことを何度も何度も繰り返しているんです。Web 2.0の世界というのは、この「新しくてクールなもの」というミームで成り立っています。<a href="http://www.go2web20.net/">Go2Web2.0</a>をちょっと見てください。私が何を言いたいか分かると思います。</p>]]>
        <![CDATA[<p>問題は、こんなことを続けていると、いつかしか壁に追突したり、トラップに嵌ったり、疲れてフラフラになってしまうことです。例えていうならこの動画の猫みたいに。</p>
<div><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/Af-yMbZwaTA&hl=en"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/Af-yMbZwaTA&hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object></div>
<p><a href="http://randomtranslations.com/archives/2008/04/introducing-a-revolutionary-software-platform-lnd.html">先日のエントリー</a>は、この現象をちょっと皮肉めかして書いたみたというわけです。もし今日、Lotus Notesが初めて発表されたとしたら、現在話題になっている機能なんて簡単に実現することが出来るんだよ、ということをちょっと強調して書いてみました（それに加えて、セキュリティ面やオフライン機能、複製機能、ディレクトリ機能などについても、今日まで発表されてきたどの製品よりも優れていると個人的には思っていますが、それはまた別の話ということで）。しかし、どの製品も成功するためには、話題性と勢いが必要です。私のIBMの同僚である<a href="http://cooney.typepad.com/lauren_cooneys_blog/">Lauren Cooney</a>（彼とはTwitterで知り合いました）が教えてくれた、<a href="http://harvardbusinessonline.hbsp.harvard.edu/b02/en/common/item_detail.jhtml;jsessionid=TWYOMJ2S0NZZQAKRGWCB5VQBKE0YOISW?referral=7855&id=R0710J&_requestid=83849">ハーバードビジネスレビュー</a>のクチコミマーケティングに関する記事のように、製品の成功というのにはユーザの助けというのが不可欠なものです。</p>
<p>【訳注】原文はジョークに走ったところがあるので、後半部分は割愛し、それ以前のエントリーも訳者の意図で一部内容を再構成しています。純粋な翻訳ではありませんので、ご了承下さい。</p>]]>
    </content>
</entry>

<entry>
    <title>ソフトウェアプラットフォームのLNDが凄すぎる件について</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/04/introducing-a-revolutionary-software-platform-lnd.html" />
    <id>tag:randomtranslations.com,2008://1.53</id>

    <published>2008-04-23T10:30:00Z</published>
    <updated>2008-05-03T19:55:50Z</updated>

    <summary>※このエントリーは、IBM Lotus Notes Hints, Tips, and Tricksの「Introducing a revolutionary software platform... LND」を翻訳したものです。 革新的なソフトウェアプラットフォームを紹介します。これを使えば、複数のマシンの間で自動的にコンテンツを同期することが出来ます。それは複数OS間でも問題ありません。それがAppleのMacintoshでも 、MicrosoftのWindowsでも、いくつかのLinuxディストリビューションでも。 それではLNDを紹介しましょう。...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="Lotus Notes/Domino" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="lotusnotesdomino" label="Lotus Notes/Domino" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは、<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/">IBM Lotus Notes Hints, Tips, and Tricks</a>の「<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/introducing-a-revolutionary-software-platform">Introducing a revolutionary software platform... LND</a>」を翻訳したものです。</p>
<p>革新的なソフトウェアプラットフォームを紹介します。これを使えば、複数のマシンの間で自動的にコンテンツを同期することが出来ます。それは複数OS間でも問題ありません。それがAppleのMacintoshでも
、MicrosoftのWindowsでも、いくつかのLinuxディストリビューションでも。</p>
<p>それではLNDを紹介しましょう。</p>]]>
        <![CDATA[<p>LNDが提供するのはコラボレーションアプリケーション、メッセージング、ブログ、ディレクトリーサービス、ウェブサーバのプラットフォームです。全ての機能が簡単にインストール出来るパッケージとして提供されています。さらに、世界中のLNDビジネスパートナーコミュニティとオープンソースコミュニティが数千個の追加アプリケーションやサービスを提供しています。</p>
<p>LNDクライアントはオープンなEclipseプラットフォームの上で構築されており、尽きることないカスタマイズと機能強化の可能性を秘めています。LNDサーバには、LNDクライアントだけでなく、一般的によく使われているFirefoxやSafari、Internet Explorerのようなウェブブラウザでもアクセスすることが出来ます。</p>
<p>もしあなたの会社で従業員が一カ所で働いていないとどうでしょう？問題ありません！LNDはリモートで働く人のことも考慮されており、ネットワーク接続のないオフライン環境でもアプリケーションとデータにアクセスすることが出来ます。そして、ネットワークに再接続すると、あなたが加えた変更点はLNDサーバに送信され、他の人が加えた変更はあなたのマシンに反映されます。今ではホテルも空港も地元のコーヒーショップもオフィスにしてしまえるということです。</p>
<p>モバイル環境についても触れておくと、数多くのモバイルデバイスからLNDの機能にアクセスすることが出来ます。</p>
<p>でも、そうなるとセキュリティ面での懸念が沸き上がってきませんか？もちろん問題ありません。LNDではビルトインの暗号化機能でデータの同期時と保存時の両方で同時進行的にセキュリティが保たれます。</p>
<p>ストレージについてお話しましょう。従業員個人のマシンに閉じ込められたコンテンツを解放し、“クラウド上”にデータを集中管理することも出来ます（出た！流行言葉）。LNDでは貴社のデータセンターやアプリケーションサービスプロバイダにストレージをホストさせることが出来ます。</p>
<p>アクセスコントロールはどうでしょうか？LNDでは、コンテンツを誰が読めて、誰が編集出来るかを簡単に管理することが出来ます。アクセスコントロールはアプリケーションレベルから個々のドキュメント上のフィールドレベルでも強制することが出来ます。</p>
<p>最後に、LNDクライアントとサーバは中小企業から世界最大級の企業までどんなサイズの企業でも利用可能です。</p>
<p>でもちょっと待って下さい。これで全部ではありません。LNDはビルトインのインスタントメッセージングや中央管理のストレージ、添付ファイル管理機能、オープンなインダストリスタンダードをサポートしたフルセットの表計算、文書作成、プレゼンテーションスイートも含まれます。しかも、それらが追加コストなしで手に入れられます。</p>
<p>凄すぎて信じられないですって？でも、それは<a href="http://www-306.ibm.com/software/lotus/products/notes/" target="_blank">今すぐ手に入れられます</a>。さぁ、急げ！</p>
<p><a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/introducing-a-revolutionary-software-platform/content/M2?OpenElement" target="_blank">:::画像1:::</a></p>]]>
    </content>
</entry>

<entry>
    <title>講演する際のいくつかの注意点</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/04/some-advice-on-public-speaking.html" />
    <id>tag:randomtranslations.com,2008://1.51</id>

    <published>2008-04-12T02:30:00Z</published>
    <updated>2008-05-16T13:19:54Z</updated>

    <summary>※このエントリーは、IBM Lotus Notes Hints, Tips, and Tricksの「Some advice on public speaking」を翻訳したものです。 自分のことを講演のプロだと言うつもりはありませんが、ここ数年の経験から、優れた講演者になるための方法について多少は学ぶところがありました。ここでは私が実践しているいくつかのルールを紹介します。このリストは固定的なものではありません。当然のことながら、イベントごとにトピックは違いますし、聴衆の数や参加者の立場、開催地などによって条件は変わるものですから。 トップ10にしようかと思いましたが、11件になってしまいました。。。...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="Miscellaneous" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="presentation" label="Presentation" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは、<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/">IBM Lotus Notes Hints, Tips, and Tricks</a>の「<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/some-advice-on-public-speaking">Some advice on public speaking</a>」を翻訳したものです。</p>
<p>自分のことを講演のプロだと言うつもりはありませんが、ここ数年の経験から、優れた講演者になるための方法について多少は学ぶところがありました。ここでは私が実践しているいくつかのルールを紹介します。このリストは固定的なものではありません。当然のことながら、イベントごとにトピックは違いますし、聴衆の数や参加者の立場、開催地などによって条件は変わるものですから。</p>
<p>トップ10にしようかと思いましたが、11件になってしまいました。。。</p>]]>
        <![CDATA[<ol>
<li>これから話すトピックを知ること。自分が精通していないことを話そうとしないで下さい。聴衆を煙に巻くこうとするほど馬鹿げたことはありません。数えられないほど企業経営者がこの失態を冒し、それにどれほどうんざりとさせられたことか。</li>
<li>知識を共有し、会話をして、出来るなら楽しませましょう。でも、"講義をしよう"なんて思わないで下さい。講義は教育や指導のために行うもので、クラスルームのためにとっておくべきです。講演と講義は違います。</li>
<li>スライドに頼らず、具体例や物語で話のポイントを理解してもらうこと。スライドを使用する場合でも、それが<abbr title="OverHead Projecter">OHP</abbr>に過ぎないということを覚えておいて下さい。</li>
<li>自信を持って、慌てないで下さい。専門家のように振舞うのです。でも押し付けがましくはならないで下さい。傲慢は嫌われます。人を馬鹿にしたような話をする人がいた場合、やむを得ないことですが、注意を促す必要が出てきます。</li>
<li>何を知ってもらいたいのか、聴衆に情報を与え、導きたい方向に彼らを連れて行ってあげて下さい。ただし、結論は聴衆がそれぞれ到達するものです。法廷の最終弁論を考えてみましょう。判断材料を陪審員に提供しても、結論を出すのは貴方ではなく彼ら自身です。</li>
<li>準備はちゃんとすること。ただし、状況の変化は受け入れてください。そして、奴等が来ても決してパニックにはならず、気を鎮め、乗り越えるのです。聴衆は分かってくれます（これはブログのエントリーにも言えるかもしれません。私たちは論点がずれてしまった話を何度立て直してきたことか）。 </li>
<li>あなたが講演することが聴衆にとって有益だという事実は忘れないで下さい。トピックを変更したくなったり、横道にそれた質問をしたくなったら、それも仕方ありません。とはいえ、コースを大幅に外れないように心に留めておいて下さい。</li>
<li>知らないことがあるならば、それを自分は知らないという事実を受け入れて下さい。嘘を付かないこと。その情報を見つけたり、その分野の専門家が見つかった場合にはお知らせします、と回答しましょう。</li>
<li>簡潔に。講演時間に収まりきらないほど話したい内容があっても、それを無理やり話そうなんて思わないで下さい。話す内容が少なくても、それをうまく話せばいいんです。10分程度のPodcastや短いブログエントリー、要点を絞ったメールがどれほどいいことか。</li>
<li>主要なポイントは繰り返し、講演の最後に話の流れを振り返ることで、講演をまとめあげて下さい。どれほどの数の優れた本、映画、演劇でそれまで与えられていた情報を呼び返しているか気付いたことがありますか？「<a href="http://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%B8%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%BB%E3%82%B5%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%84">ユージュアル・サスペクツ</a>」のエンディングを考えてみて下さい。</li>
<li>これが一番重要なことなんですが、ゆっくりやりましょう。いや、本当にペースを落としなさいって。あなたは話している内容についてすでに知っていますが、聴衆にとっては初めて聴く内容ですので、彼らは言葉や映像を理解しようと頭をフル回転させています。主要なポイントを説明したら一呼吸をおいて、彼らが理解するだけの時間を与えるべきです。</li>
</ol>
<p>このリストには発声法や、体のポジショニング、手のしぐさや何を着ていくかなどといった核となるプレゼンテーション技術については触れていません。</p>]]>
    </content>
</entry>

<entry>
    <title>ちょっと待って</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/04/give-me-a-break.html" />
    <id>tag:randomtranslations.com,2008://1.50</id>

    <published>2008-04-11T00:00:00Z</published>
    <updated>2008-05-03T19:55:50Z</updated>

    <summary>※このエントリーはIBM Lotus Notes Hints, Tips, and Tricksの「Give Me A Break」を翻訳したものです。 昨日、読者さんからこんな素晴らしい質問を頂きました。「巨大なデータベースの検索を開始したんですが、途中で止めたくなりました。どうやれば止められますか？」 ビューの検索や巨大なデータベースを開くなどといったNotesのアクションを止めるには、Ctrl + Breakキーを押せば、アクションがキャンセルされます。コンピュータが本当にビジー状態で、キーボードからの入力に反応してくれない時は、何度か押さないといけないかもしれません。...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="Lotus Notes/Domino" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="lotusnotesdomino" label="Lotus Notes/Domino" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="operation" label="Operation" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/">IBM Lotus Notes Hints, Tips, and Tricks</a>の「<a href="http://www.alanlepofsky.net/alepofsky/alanblog.nsf/dx/give-me-a-break">Give Me A Break</a>」を翻訳したものです。</p>
<p>昨日、読者さんからこんな素晴らしい質問を頂きました。「巨大なデータベースの検索を開始したんですが、途中で止めたくなりました。どうやれば止められますか？」</p>
<p>ビューの検索や巨大なデータベースを開くなどといったNotesのアクションを止めるには、Ctrl + Breakキーを押せば、アクションがキャンセルされます。コンピュータが本当にビジー状態で、キーボードからの入力に反応してくれない時は、何度か押さないといけないかもしれません。</p>]]>
        
    </content>
</entry>

<entry>
    <title>TSMでjava.lang.OutOfMemoryErrorが発生するケースについて</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/02/the-case-of-the-java-lang-outofmemoryerror.html" />
    <id>tag:randomtranslations.com,2008://1.48</id>

    <published>2008-02-22T03:39:00Z</published>
    <updated>2008-05-03T19:55:49Z</updated>

    <summary>※このエントリーはTSMBLOG.orgの「The case of the java.lang.OutOfMemoryError」を翻訳したものです。 TSMで「java.lang.OutOfMemoryError」が発生する原因については2つのシチュエーションが考えられます。 ケース#1：管理センターでヘルスモニターが選択されたタイミングで以下のエラーが表示される。 :::画像1::: ケース#2：ISCコマンドラインで負荷の高いQuery（例えば「q content」）が発行され、以下のANR2963Wメッセージが表示される。 ANR2963W This SQL query may produce a very large result table, or may require a significant amount of time to compute. Do you wish to proceed ( Y/N )? ここでYを選ぶと、発行したQueryはエラーになって終了してしまいます。 :::画像2:::...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="Tivoli Storage Manager" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="integratedsolutionsconsole" label="Integrated Solutions Console" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tivolistoragemanager" label="Tivoli Storage Manager" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="troubleshooting" label="Trouble Shooting" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは<a href="http://tsmblog.org/serendipity/">TSMBLOG.org</a>の「<a href="http://tsmblog.org/serendipity/index.php?/archives/68-The-case-of-the-java.lang.OutOfMemoryError.html">The case of the java.lang.OutOfMemoryError</a>」を翻訳したものです。</p>
<p>TSMで「java.lang.OutOfMemoryError」が発生する原因については2つのシチュエーションが考えられます。</p>
<p>ケース#1：管理センターでヘルスモニターが選択されたタイミングで以下のエラーが表示される。</p>
<a href="http://tsmblog.org/serendipity/uploads/ISC_java_lang_outofmemoryerror_3.JPG" target="_blank">:::画像1:::</a>
<p>ケース#2：ISCコマンドラインで負荷の高いQuery（例えば「q content」）が発行され、以下のANR2963Wメッセージが表示される。</p>
<blockquote>
ANR2963W This SQL query may produce a very large result table, or may require a significant amount of time to compute. Do you wish to proceed ( Y/N )?
</blockquote>
<p>ここでYを選ぶと、発行したQueryはエラーになって終了してしまいます。</p>
<a href="http://tsmblog.org/serendipity/uploads/ISC_java_lang_outofmemoryerror_2.JPG" target="_blank">:::画像2:::</a>]]>
        <![CDATA[<p>TSMBLOG.org Knowledge Baseの<a href="http://tsmblog.org/kb/?View=entry&EntryID=49">記事</a>を参照して、ISCを再起動させて下さい。</p>
<p>ISCインスタンスが占有していたメモリ領域が解放されます。ケース#1に関しては、ISCを再起動して、メモリを解放するだけで解決することが分かっています。しかし、ケース#2はこれだけでは直らないようです。</p>
<p>ケース#2の対応や、今度も同様の問題が起こらないようにするためには、上記の手順を参照してISCを停止させ、以下のコマンドを実行して下さい。</p>
<pre>
/Tivoli/dsm/bin/supportUtil.sh ISC_Portal [ISC管理者ID] [ISC管理者パスワード]
</pre>
<p>管理センターSupport Utilityメニューが表示されるので、“4”を選択し、管理センターが使用出来る最大メモリサイズを変更します。ヒープサイズのデフォルト値は128MBで、最大ヒープサイズのデフォルト値は512MBです。管理センターが使える領域を増やすために、最大ヒープサイズを1024MBに増やしましょう。1024MBは推奨値です。なお、AIXでは最大2048MB、それ以外のプラットフォームでは1536MBまで設定出来ます。</p>
<p>管理センターのセッションによるメモリ使用量を減らすために、“5”を選択して、管理センターのセッションタイムアウト値をデフォルトの30分からそれ以下に減らします。</p>
<p>以上の情報は<a href="http://www-1.ibm.com/support/docview.wss?rs=663&context=SSGSG7&q1=1286462&uid=swg21286462&loc=en_US&cs=utf-8&lang=en">こちら</a>のIBM Technoteでも参照出来ます。</p>
<p>IBMの文書でもISCと管理センターはメモリ使用の大きい他のアプリケーションと同居させないように記述されています。必要なのはメモリで、プロセッサはそれほど必要ではありません。</p>]]>
    </content>
</entry>

<entry>
    <title>破損したプライマリーストレージプールボリュームを交換する</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/02/replacing-a-damaged-primary-storage-pool-volume.html" />
    <id>tag:randomtranslations.com,2008://1.49</id>

    <published>2008-02-04T01:52:00Z</published>
    <updated>2008-05-03T19:55:49Z</updated>

    <summary>※このエントリーはTSMBLOG.orgの「Replacing a damaged primary storage pool volume」を翻訳したものです。 IBM Technoteの「Replacing a damaged primary storage pool volume」では、破損したプライマリーストレージプールボリュームのデータを復旧するための手順がリスト化されています。最も重要な点は、“backup stgpool”コマンドを使ってデータをコピーストレージプールにコピーしている点です。これはどのTSM環境でも当てはまる点です。 私が見る限り、これは完璧な手順です。この文書では必要な手順が網羅されており、間違った手順によってデータを失う危険性を回避することが出来ます。 最後の#10はプライマリーストレージプールボリュームの削除を行っています。この手順が最後にリストされているのは、もし最初に“delete volume ボリューム名 discard=yes”を実行してしまうと、ボリューム上のデータをコピープールから復旧出来なくなるからです。 こういうことを書くと、何て馬鹿なこと書いてんだ、と思うかもしれませんが、こういうことを考える人も実際にいます。まずプライマリーストレージプールを削除して、それからコピープールからリストアしようと。なのでこのエントリーは注意事項だと思って下さい。 “del vol ボリューム名 discard=yes”をプライマリストレージプールボリュームに対して発行すると、コピープール上の対応するエントリーも削除されてしまいます。このコマンドを実行する時は必ず再確認して下さい。...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="Tivoli Storage Manager" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="storagepoolvolume" label="Storage Pool Volume" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tivolistoragemanager" label="Tivoli Storage Manager" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="troubleshooting" label="Trouble Shooting" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは<a href="http://tsmblog.org/serendipity/">TSMBLOG.org</a>の「<a href="http://tsmblog.org/serendipity/index.php?/archives/62-Replacing-a-damaged-primary-storage-pool-volume.html">Replacing a damaged primary storage pool volume</a>」を翻訳したものです。</p>
<p>IBM Technoteの「<a href="http://www-1.ibm.com/support/docview.wss?rs=663&uid=swg21219227">Replacing a damaged primary storage pool volume</a>」では、破損したプライマリーストレージプールボリュームのデータを復旧するための手順がリスト化されています。最も重要な点は、“backup stgpool”コマンドを使ってデータをコピーストレージプールにコピーしている点です。これはどのTSM環境でも当てはまる点です。</p>
<p>私が見る限り、これは完璧な手順です。この文書では必要な手順が網羅されており、間違った手順によってデータを失う危険性を回避することが出来ます。</p>
<p>最後の#10はプライマリーストレージプールボリュームの削除を行っています。この手順が最後にリストされているのは、もし最初に“delete volume ボリューム名 discard=yes”を実行してしまうと、ボリューム上のデータをコピープールから復旧出来なくなるからです。</p>
<p>こういうことを書くと、何て馬鹿なこと書いてんだ、と思うかもしれませんが、こういうことを考える人も実際にいます。まずプライマリーストレージプールを削除して、それからコピープールからリストアしようと。なのでこのエントリーは注意事項だと思って下さい。</p>
<p>“del vol ボリューム名 discard=yes”をプライマリストレージプールボリュームに対して発行すると、コピープール上の対応するエントリーも削除されてしまいます。このコマンドを実行する時は必ず再確認して下さい。</p>]]>
        <![CDATA[<p>※上記のエントリーに関係があるため、以下に<a href="http://www-1.ibm.com/support/docview.wss?rs=663&uid=swg21219227">IBM Technote #1219227</a>で記述されている手順を翻訳しておきます。</p>
<p>この手順ではプライマリーストレージプールにコピーストレージプールが存在している必要があり、ボリューム上のデータが“backup stgpool”コマンドでコピーされている必要があります。破損したデータがコピーストレージプールにコピーされていなかったり、コピーの前にデータ破損が発生した場合は、データ復旧が出来なくなります。リストア出来ないファイルはクライアントから再度バックアップすることが出来ます。</p>
<ol>
<li>破損したボリュームをDESTROYEDとしてマークして、アクセスされないようにする。</br><pre>UPDATE VOLUME ボリューム名 ACCESS=DESTROYED</pre></li>
<li>ボリュームをライブラリからチェックアウトさせる。RESTOREコマンドが実行されると、事前にチェックアウトしていない限り、DESTROYEDとなったボリュームはTSMデータベースから削除され、TSMから物理的にボリュームを削除出来なくなります。<br /><pre>CHECKOUT LIBVOLUME ライブラリ名 ボリューム名</pre></li>
<li>このコマンドではリストアのプレビューのみ行い、物理データの移動は行いません。これを実行することで、リストアで必要になるボリュームがリストアップされます。<br /><pre>RESTORE VOLUME ボリューム名 PREVIEW=YES</pre></li>
<li>活動ログを確認し、オフサイトのストレージから戻さないといけないボリュームのリストを確認し、ライブラリにチェックインします。<br /><pre>QUERY ACTLOG</pre></li>
<li>上記のステップで確認したボリュームをライブラリのBULK I/Oドアに配置し、ライブラリにチェックインします。BULK I/Oドアがない場合は、ライブラリ内の空スロットに配置し、SEARCHパラメータをYESにして下さい。<br /><pre>CHECKIN LIBVOLUME ライブラリ名 SEARCH=BULK CHECKLABEL=BARCODE</pre></li>
<li>チェックインされたボリュームは処理対象とならないようにREADONLYにマークしなければなりません。上記のプレビュー実行時にリスト化されたすべてのボリュームをACCESS=READONLYにすることは極めて重要なことです。<br /><pre>UPDATE VOLUME ボリューム名 ACCESS=READONLY WHERESTGPOOL=コピープール名</pre></li>
<li>次のコマンドでボリュームのリストアが開始されます。“MAXPROCESS”の数は少なくとも2が必要です。1つはコピープールボリュームから読み取りを行い、もう1つは新しいプライマリーストレージブールボリュームに書き込みをするからです。十分な数のスクラッチボリュームがあることを確認しておいて下さい。<br /><pre>RESTORE VOLUME ボリューム名 MAXPROCESS=プロセス数</pre></li>
<li>リストアが完了すると、コピーボリュームはオフサイトに送り返す必要があります。まず、ステップ5で使用したすべてのボリュームをACCESS=OFFSITEに変更します。こうすることで、レクラメーション実施時にサーバーが使用することがなくなります。<pre>UPDATE VOLUME * ACCESS=OFFSITE WHERESTGPOOL=コピープール名</pre></li>
<li>コピープールボリュームをチェックアウトします。これで安全な場所に配送することが出来ます。<pre>CHECKOUT LIBVOLUME ライブラリ名 ボリューム名 CHECKLABEL=NO</pre></li>
<li>このコマンドは、破損したプライマリーボリュームにファイルがまだ存在するとTSMサーバが報告した時に、破損したボリュームにのみ実行する必要があります。これは、前回のバックアップストレージプールコマンドに問題があった場合や、このボリューム上のデータがまだコピーストレージブールにコピーされていなかった場合に生じます。これらのファイルがまだクライアントにあるのであれば、次回の増分バックアップ時にバックアップされてくるはずです。<br /><pre>DELETE VOLUME ボリューム名 DISCARD=YES</pre></li>
</ol>]]>
    </content>
</entry>

<entry>
    <title>Kornシェルスクリプト入門 Part 3</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2008/01/korn-shell-scripting-part3.html" />
    <id>tag:randomtranslations.com,2008://1.70</id>

    <published>2008-01-17T03:00:03Z</published>
    <updated>2008-10-11T15:15:08Z</updated>

    <summary>※このエントリーは、developerWorks : AIX and UNIXの「Korn shell scripting」を翻訳したエントリーのPart 3です。 【訳注】 「Kornシェルスクリプト入門 Part 2」の続きのエントリーです。 標準入力、標準出力、標準エラー これらを理解するのは必須です。基本的に入出力には3つの出力元が存在します。AIXでは、STDIN、STDOUT、STDERRと呼ばれています。STDINは、キーボードを通じてあなたが入力した内容を参照します。STDOUTはコマンドが実行された時にスクリーンに表示される出力のことです。STDERRはコマンドが失敗した時にスクリーンに表示されます。STDINとSTDOUTとSTDERRファイルディスクリプターはそれぞれ、1、2、3という番号にマッピングされています。 コマンドの実行結果が成功か失敗かを確認したい場合は、Listing 9のようなやりかたをします。...</summary>
    <author>
        <name>Hiroshi Tomioka</name>
        <uri>http://tomiokahiroshi.com/</uri>
    </author>
    
        <category term="AIX" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="aix" label="AIX" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="shellscript" label="Shell Script" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="unix" label="UNIX" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://randomtranslations.com/">
        <![CDATA[<p>※このエントリーは、<a href="http://www.ibm.com/developerworks/aix/">developerWorks : AIX and UNIX</a>の「<a href="http://www.ibm.com/developerworks/aix/library/au-kornshellscripting/">Korn shell scripting</a>」を翻訳したエントリーのPart 3です。</p>
<p>【訳注】 「<a href="http://randomtranslations.com/archives/2008/01/korn-shell-scripting-part2.html">Kornシェルスクリプト入門 Part 2</a>」の続きのエントリーです。</p>
<h3>標準入力、標準出力、標準エラー</h3>
<p>これらを理解するのは必須です。基本的に入出力には3つの出力元が存在します。AIXでは、STDIN、STDOUT、STDERRと呼ばれています。STDINは、キーボードを通じてあなたが入力した内容を参照します。STDOUTはコマンドが実行された時にスクリーンに表示される出力のことです。STDERRはコマンドが失敗した時にスクリーンに表示されます。STDINとSTDOUTとSTDERRファイルディスクリプターはそれぞれ、1、2、3という番号にマッピングされています。</p>
<p>コマンドの実行結果が成功か失敗かを確認したい場合は、Listing 9のようなやりかたをします。</p>]]>
        <![CDATA[<p><strong>Listing 9</strong>: STDOUTとSTDERRの出力をリダイレクトする</p>
<pre>
$date  /dev/null 2&gt;&1  # このコマンドのすべての出力を見られないようにする

if [[ $? = 0 ]]; then
      print "date コマンドは成功しました"
else
      print "date コマンドは失敗しました"
fi
</pre>
<p>このコードでは、AIXのdateコマンドを実行しています。STDOUT（ファイルディスクリプター1）またはSTDERR（ファイルディスクリプター2）の出力は見られないようにすることが出来ます。続いて、条件付きif文でこのコマンドのリターンコードを確認しています。以前に学んだように、コマンドが「0（ゼロ）」を返せば、成功です。ゼロ以外では失敗となります。</p>
<h3>関数</h3>
<p>Kornシェルスクリプトでは、functionという言葉は予約語になっています。関数はスクリプトをセグメントに分割するための手法の一つです。これらのセグメントは、関数をコールした時のみ実行されます。これまで作ってきたコードにエラーチェックの関数を作成しましょう。Listing 10をご覧下さい。</p>
<p><strong>Listing 10</strong>: エラーチェック関数</p>
<pre>
##################
関数 if_error
##################
{
if [[ $? -ne 0 ]]; then # 関数に渡されたリターンコードをチェックする
    print "$1" # リターンコードがゼロより大きい場合にはエラーメッセージを出力し、処理を抜ける
exit $?
fi
}
</pre>
<p>もし、スクリプト内で単純にコマンド実行させたいと考えたならば、上記のように$?でエラーチェックするようなコードを簡単に作成することが出来ます。処理が失敗したかを確認したい場合は、その度にif_error関数を呼び出すだけで済みます。Listing 11をご覧下さい。</p>
<p><strong>Listing 11</strong>: if_error関数をコールする</p>
<pre>
rm --rf /tmp/file #ファイルの削除
if_error "エラー: /tmp/file の削除に失敗しました"

mkdir /tmp/test #ディレクトリー作成
if_error "エラー: /tmp/testの作成に失敗しました"
</pre>
<p>上記のコマンドを実行する度に、if_error関数がコールされます。エラーチェックの際に特定のメッセージを表示させたい場合は、if_error関数にメッセージを渡すことも出来ます。これが優れている点は、一度シェルコードを書いてしまえば、何度も何度も同じエラーチェック機能を使いまわし出来る点です。こうすればシェルスクリプトの作成は早くかつ簡単になります。</p>
<h3>case文</h3>
<p>case文は、if文を使っていた場所に使うことが出来る別の条件判定文です。case文は、caseという文字で始まり、文字を逆さまにした「esac」という文字で閉じられます。case文を使えば、スクリプトを発展させ、他のタスクを実行させる際などに素早く開発することが出来ます。Listing 12はcase文の仕組みの例です。</p>
<p><strong>Listing 12</strong>: case文</p>
<pre>
case 値 in 
"パターン1")
 値が「パターン1」と合致した際に実行されるコマンド
 ;; 
esac
</pre>
<p>それでは、同じ日の異なる時間にファイルを削除したいとします。現在時刻をチェックするための変数はこのように設定できます。</p>
<pre>
TIME=$(date +%H%M)
</pre>
<p>Listing 13で紹介しているコードは、午後10時と午後11時にファイルを削除してくれます。そのため、該当時間帯にこのコードが実行されると、$TIMEの現在時刻とcase文の時間が合致しているかを確認します。そして、時間が合致していればコードは実行されます。</p>
<p><strong>Listing 13</strong>: 時間をチェックするcase文</p>
<pre>
case $TIME in
                 "2200") #午後10:00の意味
                  rm ?rf /tmp/file1
                        ;;
                  "2300")#午後11:00の意味
                  rm ?rf /tmp/file1
                        ;;
                    "*")
                        echo "何もしない" > /dev/null
                        ;;

esac
</pre>
<h3>すべてのスクリプトを一つに</h3>
<p>これまであなたが作ってきたスクリプトヘッダーと変数と式を組み合わせて、Listing 14のものを作ってみましょう。</p>
<p><strong>Listing 14</strong>: Kornシェルスクリプトの例</p>
<pre>
$<strong>vi my_second_script.ksh</strong>
#!/bin/ksh
###################################################
# 作者： Jason Thomas
# 目的： ユーザーに初めてのスクリプトの作成方法を見せるためのスクリプト
# 2008年5月1日
###################################################

#変数定義
HOME="/home/jthomas" #ホームディレクトリー 
TIME=$(date +%H%M) # DATEにシェルコマンドのdateの出力結果と同じものを代入
HOSTNAME=$(hostname) # HOSTNAMEにhostnameコマンドの出力結果と同じものを代入する

##################
関数 if_error
##################
{
if [[ $? -ne 0 ]]; then # 式に渡されたリターンコードをチェックする
    print "$1" # リターンコードが0以外ならば、エラーメッセージを表示して処理を抜ける
exit $?
fi
}

if [[ -e /tmp/file ]]; then  #ファイルが存在するか最初に確認する
   rm ?rf /tmp/file #ファイルを削除する
   if_error "エラー： /tmp/fileの削除に失敗しました。"
else
   print "/tmp/fileは存在しません。"
fi

if [[ -e /tmp/test ]]; then
     mkdir /tmp/test #testディレクトリを作成する
     if_error "エラー： /tmp/testディレクトリの作成に失敗しました。"
else
     print "ディレクトリがすでに存在します。ディレクトリを作成する必要はありません。"
fi

case $TIME in
                 "2200")
                  rm ?rf /tmp/file1
                        ;;
                  "2300")
                  rm ?rf /tmp/file1
                        ;;
#スクリプト終了
esac
</pre>
<p>スクリプトを実行するには、単純に「./スクリプト名.ksh」とタイプするだけです。</p>
<pre>
$<strong>./my_second_script.ksh</strong>
</pre>
<h3>コマンドラインからの入力内容をスクリプトに渡す</h3>
<p>コマンドライン上であなたが入力した内容をスクリプトが受け取るようにすることが出来ます。Listing 15をご覧下さい。</p>
<p><strong>Listing 15</strong>: スクリプトに入力内容を渡す</p>
<pre>
$<strong>vi scriptname.ksh</strong>
#!/bin/ksh

OPTION=$1

print "I love $OPTION"

$<strong>./scriptname.ksh milk</strong>
I love milk
$<strong>./scriptname.ksh tea</strong>
I love tea
$<strong>./scriptname.ksh "peanut butter"</strong>
I love peanut butter
</pre>
<p>スクリプトに値を引き渡す時、スクリプト名の後ろの最初のオプションは$1と呼ばれます。同じく2つ目以降のオプションは$2、$3と続きます。これを知っていれば、スイッチやオプションを持つUNIXコマンドと同じようにスクリプトを作成することが出来ます。</p>
<h3>スクリプトからEメールを送る</h3>
<p>スクリプトでいくつかの種類のレポートを作成するようにすることが出来ます。例えば、システムに新しいユーザーが登録されたかどうかを毎日トラッキングするスクリプトがあります。このスクリプトはファイルに結果を出力し、それをあなた自身に送信します。こうすることで、あなたは毎日、システムに追加された全ての新ユーザー情報のコピーを受け取ることが出来ます。これを実現するには、以下のようなコマンドを実行します。</p>
<pre>
$REPORT="/tmp/users"

cat $REPORT | mailx ?s "User admin report from server XYZ" Jason_Thomas@kitzune
</pre>
<p>これにより、$REPORTファイルのコンテンツがEメールであなたに送られます。「-s」はEメールの件名を表しています。これはとても使い勝手のいいスクリプトです。</p>
<h3>最後に</h3>
<p>Kornシェルスクリプトを作成すれば、多くの無駄な時間が省かれ、あなたの仕事はより簡単になると思います。最初は躊躇するかもしれませんが、簡単なものから始め、一行一行積み重ねていくことです。いつでもこのステップは忘れないで下さい。スクリプトヘッダーを作成し、変数を定義し、作品のエラーチェックを行う。いつか、あなたは自分がやっている全てのことをスクリプトで書こうとしているかもしれません。</p>]]>
    </content>
</entry>

</feed>
