<?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>2009-05-06T06:55:43Z</updated>
    <subtitle>海外ブログなどで紹介されている技術情報を気まぐれに翻訳するブログ</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.14</generator>

<entry>
    <title>パフォーマンスチューニングの応用概念 Part 3</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2009/04/advanced-performance-tuning-concepts-part3.html" />
    <id>tag:randomtranslations.com,2009://1.73</id>

    <published>2009-04-28T03:00:03Z</published>
    <updated>2009-05-06T06:55:43Z</updated>

    <summary>※このエントリーは、developerWorks : AIX and UNIXの「Advanced performance tuning concepts」を翻訳したエントリーのPart 3です。 【訳注】 「パフォーマンスチューニングの応用概念 Part 2」の続きのエントリーです。 ガーベジ・コレクションの情報収集 ガーベジ・コレクションがアプリケーションにどの程度影響を与えているかを理解するための第一歩は、いつ、どのくらいの頻度でガーベジ・コレクションが実行されているかを知るための情報を集めることです。JVMで冗長ガーベジ・コレクション・ログ出力を有効化することで、ガーベジ・コレクションのログ出力が開始されます。IBM WebSphere Application Serverでは、管理コンソールから[アプリケーション・サーバー]→[サーバー名]→[プロセス定義]→[Java仮想マシン]と移動し、統合管理コンソールの[冗長ガーベッジ・コレクション]の箇所を選択します。...</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="garbagecollection" label="Garbage Collection" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="performancetuning" label="Performance Tuning" 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-aixperformancetuning/index.html">Advanced performance tuning concepts</a>」を翻訳したエントリーのPart 3です。</p>
<p>【訳注】 「<a href="http://randomtranslations.com/archives/2009/04/advanced-performance-tuning-concepts-part2.html">パフォーマンスチューニングの応用概念 Part 2</a>」の続きのエントリーです。</p>
<h3>ガーベジ・コレクションの情報収集</h3>
<p>ガーベジ・コレクションがアプリケーションにどの程度影響を与えているかを理解するための第一歩は、いつ、どのくらいの頻度でガーベジ・コレクションが実行されているかを知るための情報を集めることです。JVMで冗長ガーベジ・コレクション・ログ出力を有効化することで、ガーベジ・コレクションのログ出力が開始されます。IBM WebSphere Application Serverでは、管理コンソールから[アプリケーション・サーバー]→[サーバー名]→[プロセス定義]→[Java仮想マシン]と移動し、統合管理コンソールの[冗長ガーベッジ・コレクション]の箇所を選択します。</p>]]>
        <![CDATA[<p>あるいは、JVMを「-verbose:gc」パラメータで開始することでも可能です（どちらにせよ、これも統合管理コンソールでやるんですが）。どちらにせよ、JVMの出力にガーベジ・コレクションの情報が含まれるようになります。</p>
<p>冗長ガーベジ・コレクション・ログ出力の残念な点としては、ベンダー間でファイルフォーマットが違うことです。さらには、同じベンダーでもバージョンによって異なっていることさえあります。例えば、IBMのJava Runtime Environment （JRE） 6.0では、冗長XMLファイルフォーマットです。サン・マイクロシステムズのHotSpot JVMでは、簡易一行フォーマットを用い、追加情報が必要な場合は追加コマンドラインパラメータが必要になります。</p>
<h3>ガーベジ・コレクション・データの理解</h3>
<p>通常の負荷でアプリケーションを実行した場合の、ガーベジ・コレクションの情報をログ出力するようになりました。それでは、ガーベジ・コレクションのログを確認してみましょう。ヒープサイズが初期の割り当て時から大きくなり、最終的には一定値に落ち着く様子が確認出来ると思います。この値を初期のヒープサイズに利用することが可能です。これにより、初期状態から安定状態になるまでヒープサイズを増やす際の処理の遅れを回避することが出来ます。</p>
<p>ガーベジ・コレクションのログでは、いつコレクションが実行され、どのくらいの時間を費やしたかを確認することが出来ます。もし、ガーベジ・コレクションの実行に長い時間がかかっているのでしたら、JVMが異なるガーベジ・コレクション・アルゴリズムを使うようにチューニングすることが出来ます（アルゴリズムについては、JVMのバージョンやベンダーによって異なります）。このタイムスタンプから、ガーベジ・コレクションに費やしている時間のパーセントが計算出来、JVM設定の比較に利用することが出来ます。</p>
<p>ガーベジ・コレクションプロセスが定期的に拡張と圧縮を繰り返しているのであれば、JVMが拡張と圧縮の判定をするための比率を変更するが出来ます。これは、MinHeadFreeとMaxHeapFreeという値として知られています。</p>
<p>JVMが進化するほど、ガーベジ・コレクションのパフォーマンスは改善する傾向にあります。お手元のJVMのマニュアルがチューニングパラメータの最高の情報源となります。</p>
<p>IBMでは、UNIXサーバー上のWebSphere Application Serverのチューニングの際にチェックすべき項目の推奨があります。</p>
<p>最初に、お使いのサーバーにCPU、ディスク、メモリー、ネットワークの十分なリソースがあることを確認して下さい。これは全ての基礎となります。</p>
<p>次に、アプリケーションのガーベジ・コレクションの必要条件を理解し、それに従いJVMをチューニングして下さい。ここで、一つ前のステップに立ち返り、アプリケーションが必要とするだけの十分なメモリーがあるかを確認する必要が出てきます。</p>
<p>アプリケーションサーバーのキューが、アプリケーションが処理出来るリクエスト分だけであるかを確認しましょう。ウェブサーバーに入ってきたリクエストが、アプリケーションに受け渡される際、キューを通過します。ここでアプリケーションへのコネクションが多数発生していた場合、パフォーマンスの低下が発生してしまいます。ウェブサーバーに過剰なコネクションが張られた場合でも、WebSphere Application Serverまでは到達しないようにすることが出来ます。</p>
<p>最後に、使用されているキャッシュが多数存在しており、データベースへの定型句からEJBテクノロジーとスレッドキャッシュまでが挙げられます。新しいエントリーのために定期的にキャッシュがパージされているならば、それを増やしてみましょう。</p>
<h3>まとめ</h3>
<p>コンピューターのリソースは、CPU、メモリ、ディスク、ネットワークに分けることが出来ます。あなたのチューニングの挑戦は、これらのリソースを計測し、リソースのネックが生じないようにアプリケーションやアプリーケーションサーバー、サーバーを調整することに注力すべきです。</p>
<p>JVMは独自にヒープを管理し、ガーベジ・コレクションとして知られるプロセスを通じてそれを掃除します。この分野のチューニングでは、ヒープがアプリケーション側の要求に応じて増加することを確認し、重いガーベジ・コレクションが発生しないようにガーベジ・コレクションのパラメータをチューニングすることが必要になります。</p>
<p>ガーベジ・コレクションのチューニングの最適なツールは、冗長ガーベジ・コレクション・トレースの有効化です。これを有効化することで、ガーベジ・コレクションの活動状態がログされます。このログから、どのくらいの頻度でコレクション・サイクルが実行され、なぜコレクションが実行されたかを突き止めることが出来ます。</p>]]>
    </content>
</entry>

<entry>
    <title>パフォーマンスチューニングの応用概念 Part 2</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2009/04/advanced-performance-tuning-concepts-part2.html" />
    <id>tag:randomtranslations.com,2009://1.72</id>

    <published>2009-04-28T03:00:02Z</published>
    <updated>2009-05-06T06:58:01Z</updated>

    <summary>※このエントリーは、developerWorks : AIX and UNIXの「Advanced performance tuning concepts」を翻訳したエントリーのPart 2です。 【訳注】 「パフォーマンスチューニングの応用概念 Part 1」の続きのエントリーです。 ディスク ディスクはメモリーと比べると遅いため、過剰なディスクアクセスはアプリケーションのレスポンス低下を招きます。ディスクアクセスの原因は上述したスワッピングかもしれませんし、アプリケーションやOSからの要求によるものかもしれません。過剰なログ書き出しもディスクアクセスの渋滞を招きます。...</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="garbagecollection" label="Garbage Collection" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="performancetuning" label="Performance Tuning" 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-aixperformancetuning/index.html">Advanced performance tuning concepts</a>」を翻訳したエントリーのPart 2です。</p>
<p>【訳注】 「<a href="http://randomtranslations.com/archives/2009/04/advanced-performance-tuning-concepts-part1.html">パフォーマンスチューニングの応用概念 Part 1</a>」の続きのエントリーです。</p>
<h3>ディスク</h3>
<p>ディスクはメモリーと比べると遅いため、過剰なディスクアクセスはアプリケーションのレスポンス低下を招きます。ディスクアクセスの原因は上述したスワッピングかもしれませんし、アプリケーションやOSからの要求によるものかもしれません。過剰なログ書き出しもディスクアクセスの渋滞を招きます。</p>]]>
        <![CDATA[<p>ディスクのボトルネックを探し出すのに最適なツールはiostatです。このツールを使えば、ある一時点でどのくらいの読み書きが発生しているかが分かり、どれくらいディスクコントローラが混雑しているかが把握出来ます。複数のディスクが搭載されているならば、負荷をディスク分散するのは非常に有効な方法です。なぜなら、ディスクの待ち時間のうち最も大きなものがシークタイムだからです。ログファイルやデータベース・ジャーナルなどのように継続的にファイルが肥大化するものは、アプリケーションやデータベースのディスクとは別のディスクに配置すべきです。</p>
<p>vmstatとiostatのどちらでも、システムがiowaitに費やしている時間のパーセンテージが表示されます。iowaitとは、CPUはアイドル状態ですが、システムとしてはIOのリターンが来るのを待っている状態を指します。高いiowaitの値は、ディスクが遅い、または過負荷になっていることを示唆しています。</p>
<p>ディスクの密接に関係している部分では、オープンすることが出来るファイル・ディスクリプターの数が挙げられます。ファイル・ディスクリプターが枯渇すると、ファイルを開こうとしても失敗します。一般的には、ulimitコマンドでファイル・ディスクリプターの数を増やす事が出来ますが、OSにカーネルの制限があった場合、ulimitコマンドがうまく動作しないかもしれません。</p>
<h3>ネットワーク</h3>
<p>ネットワークは大部分のアプリケーションで大きな比重を占めるものです。それはデータが、サーバーとクライアント間を移動するものだからです。低速なネットワークでは、アプリケーションのレスポンスが悪いように見えます。最初になすべきことは、すべてのサーバーとのスイッチのポートが正しく設定され、可能な限り最高速度かつ全二重通信に固定されていることを確認することです。サーバーとスイッチ間の速度と二重通信設定の設定間違いは、しばしばネットワークの問題の原因となります。</p>
<p>OSはネットワークリソース向けのバッファを複数割り当てています。例えば、OSはTCP接続ごとにTCP送信キューを保持しています。このキューは、アプリケーションが送信したが、相手先からAckが返ってこない場合にデータを保持します（Ackされていないパケット数によってはネットワークに送信されていないかもしれません）。このキューがいっぱいになると、未処理のデータが捌けるまではアプリケーションはこれ以上のデータを送信出来なくなります。</p>
<p>バッファの混雑の予兆は、netstat -aコマンドで確認することが出来ます。このコマンドでは、ネットワークカウンターのリストが表示されます。「queue」や「overflow」という言葉はTCPキューと関連があり、監視対象とすべきものです。これらのカウンターは、一般的にはブート時にのみリセットされます。そのため、徐々に増加しているようならば、注意をすべきです。</p>
<p>netstat -anで待ち状態（CLOSE_WAITやFIN_WAIT_1）になっているコネクションが多数表示されるようならば、それらの新鮮でないコネクションのためにシステムリソースが使用状態になっているため、新しい接続の確立に問題が発生する恐れがあります。このケースでは、タイムアウト値を減らすことにより、OSが保持するコネクションの時間をコントロールすることが出来ます。Solarisではnddコマンド、AIXではnoコマンドで変更可能です。</p>
<h3>Javaメモリー</h3>
<p>これまでのセクションでは、システムでチューニングが必要な広範囲の領域について述べてきました。その一つがメモリーです。Javaアプリケーション環境では、サーバーはJavaプロセスにメモリーを割り当て、アプリーケーションコードはその上で実行されます。JavaプロセスとはJVMであり、それ自身でアプリケーションにメモリーを割り当てています。</p>
<p>OSのレイヤーから見ると、Javaプロセスに対してギガバイトのメモリーを割り当てているように見えるかもしれません。そのプロセスの内部では、JVMはヒープを管理しています。ヒープは、新しく入ってくるオブジェクトのためのメモリー領域のことです。オブジェクトが作成されると、ヒープに配置されます。そして、そのオブジェクトが破棄されても、それらはヒープに残ります。JVMによって実行されるガーベジ・コレクションというプロセスは、認知されているオブジェクトをマークし、ヒープの残りの部分を次回の割り当てに使うために掃除してしまいます。ガーベジ・コレクションで十分な空きが確保出来なかった場合、次のメモリー割り当ての際にヒープが広がってしまいます。また、JVMがヒープが大き過ぎると判断する水準まで達した場合には、圧縮されてしまいます。</p>
<p>ガーベジ・コレクションの最も単純な定義からは、ガーベジ・コレクションが実行されている間はどんなアプリケーションも実行出来なくなると考えられます。JVMは、ガーベジ・コレクション実行中は効果的に静止します。それゆえに、Javaのチューニングというのは、最適なヒープのメモリーサイズを決定することと、ガーベジ・コレクション・プロセスのチューニングが大部分を占めます。</p>
<p>ガーベジ・コレクションのチューニングに関する大まかな考えとしては、どのくらいの頻度で実行し、どんな状態になれば実行される必要があるかを判断した上で、ガーベジ・コレクションの影響を最小限にするためにJVMの設定変更をすることです。</p>
<p>【訳注】 「<a href="http://randomtranslations.com/archives/2009/04/advanced-performance-tuning-concepts-part3.html">パフォーマンスチューニングの応用概念 Part 3</a>」に続きます。</p>]]>
    </content>
</entry>

<entry>
    <title>パフォーマンスチューニングの応用概念 Part 1</title>
    <link rel="alternate" type="text/html" href="http://randomtranslations.com/archives/2009/04/advanced-performance-tuning-concepts-part1.html" />
    <id>tag:randomtranslations.com,2009://1.71</id>

    <published>2009-04-28T03:00:01Z</published>
    <updated>2009-05-06T04:15:43Z</updated>

    <summary>※このエントリーは、developerWorks : AIX and UNIXの「Advanced performance tuning concepts」を翻訳したエントリーのPart 1です。 最高のアプリケーションがあっても、それが適切に構成されていないホストの上で動いているのでは十分なパフォーマンスを出す事は出来ません。この記事では、パフォーマンスチューニングの4つの主要分野とそれぞれ何を見ればいいかを紹介したいと思います。それに加えて、Javaベースのアプリーションではガーベジコレクション・サイクルのようにパフォーマンスチューニングに影響を与える前提が存在します。この記事では、ガーベジコレクションに関して知っておくべきことについても紹介しようと思います。...</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="performancetuning" label="Performance Tuning" 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-aixperformancetuning/index.html">Advanced performance tuning concepts</a>」を翻訳したエントリーのPart 1です。</p>
<p>最高のアプリケーションがあっても、それが適切に構成されていないホストの上で動いているのでは十分なパフォーマンスを出す事は出来ません。この記事では、パフォーマンスチューニングの4つの主要分野とそれぞれ何を見ればいいかを紹介したいと思います。それに加えて、Javaベースのアプリーションではガーベジコレクション・サイクルのようにパフォーマンスチューニングに影響を与える前提が存在します。この記事では、ガーベジコレクションに関して知っておくべきことについても紹介しようと思います。</p>]]>
        <![CDATA[<p>あなたのサーバーには負荷をうまく処理するために変更出来る設定が多数あります。ただし、ファイルサーバーとデータベースサーバーではチューニングする箇所は異なりますし、2種類のアプリケーションサーバーがあったとしても、サーバーへの負荷の性質によってはチューニング方法が異なるかもしれません。チューニングには、サーバーの限られたリソースをOSやアプリケーションの別の部分に割り当てることにより、アプリケーションレスポンスを改善するという性質があります。次に紹介するのが、考慮すべき領域です。</p>
<ol>
<li>CPU（中央処理装置）</li>
<li>メモリー</li>
<li>ディスク（ディスクスペースとアクセス速度の両方）</li>
<li>ネットワーク</li>
</ol>
<p>これらの領域はしばしば相互に影響を与え合っています。例えば、メモリーをキャッシュに割り当てることでディスクアクセスを減らすことや、ローカルディスクから読み出すのではなくネットワーク越しにリソースアクセスをすることもあり得ます。この記事では、メモリについては、JVM（Java Virtual Machine）に特に焦点を当てたいと思います。JVMには独自のメモリ管理システムが存在し、あなたはそれを監視・構成しなければなりません。</p>
<h3>CPU</h3>
<p>サーバーのCPUは大部分の時間を処理の待ち時間に費やしています。その中でも最も多いのが、ディスクからデータが返されるのを待つことです。マルチタスキングでは、CPUが待ち状態の時間に他のことを処理させるようとします。そのため、より早いCPUを購入することは、CPUの処理待ちに費やしていた時間を有効活用することが出来ます。</p>
<p>vmstatコマンドは、システムがどの作業に時間を費やしているかをリアルタイムに分解して表示してくれます。また、sarコマンドは長期のモニタリングに適したツールです。これらのツールにより、CPUが大部分の時間をユーザー時間に費やしており、アイドルサイクルが低下し続けているのが確認出来たのであれば、次の一手を考えるべき時です。このシチュエーションでは、負荷を他のサーバーに振り分けるか、CPUのキャパシティを増やす必要があります。</p>
<p>負荷によっては、パラレルに処理させることが不可能な場合があり、複数サーバーに負荷を分散させたり、CPUを追加することでは解決しない場合があります。その場合は、より高速のCPUを投入し、問題になっている処理のコードをより少ないサイクルで動くように最適化するのに時間を費やして下さい。</p>
<h3>メモリー</h3>
<p>メモリーチューニングにはいくつかの項目が関連してきます。最も単純な方法は、アプリケーションがスワップ領域を使用することがないだけの十分なRAMを搭載することです。OSの仮想メモリではアプリケーションに対して実際にシステムに搭載している以上のメモリを割り当てることを可能にします。そして、メモリが不足した場合には、ディスク上の一時的な保存領域で補おうとします。メモリのページアウトとディスクからのページインはRAMに直接アクセスした場合と比べて著しく遅くなります。そのため、この動作は出来るだけ回避すべきです。</p>
<p>仮想メモリについては、チューニングが必須だと言われています。それは、システムがメモリを使い切る前に、ディスクへ書き出すことが出来るためです。そして、問題が発生した時にスワップ領域を調べなくてはならなくなるのです。重要なことは、いつ仮想メモリが使われているかを突き止めることです。UNIXでは、フリーなメモリーが割り当てられる際、スワップアウトさせる候補となるメモリーページを探し出すことをカーネルは最終的には決断せざるを得なくなります。そしてその直後、処理するためにメモリへの割り当てが必要なプロセスの存在をカーネルが検知し、スワップ候補となったページのいくつかをディスクにスワップさせます。もし負荷を処理出来るだけの十分なメモリが搭載されていたら、スワップによる遅れを排除することが出来ます。</p>
<p>Solarisでは、/etc/systemファイルでチューニングが可能です。IBM AIXでは、vmoコマンドが利用出来ます。Linuxでは、/etc/sysctl.confです。これらの挙動はOSの進化に従い絶え間なく変化しています。そのため、設定変更の前には十分な調査を実施して下さい。</p>
<p>最後に、余計なメモリが手元にあるならば、ファイルシステムのファイルキャッシュやメモリのメタデータに使う事が出来ます。大部分のUNIXでは、空いたメモリはキャッシュに使おうとします。これが、システムに空きメモリがないように見える原因です。これによりディスクアクセスが減るので、ウェブサーバーへの負荷に重要な影響を与えることとなります。</p>
<p>【訳注】 「<a href="http://randomtranslations.com/archives/2009/04/advanced-performance-tuning-concepts-part2.html">パフォーマンスチューニングの応用概念 Part 2</a>」に続きます。</p>]]>
    </content>
</entry>

<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>

</feed>
