<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>あいそるニュース</title>
    <link>http://isol.pro-s.co.jp/news/</link>
    <language>ja</language>
    <ttl>40</ttl>
    <description>株式会社プロフェッサＩＴソリューション部 あいそるニュース</description>
    
    
        <item>
          <title>TeraStationファームウェアのアップデート</title>
          <description>&lt;p&gt;
弊社の本社には40人弱の社員が作業しておりますが、ファイルサーバはTeraStationを使用しております。
価格がリーズナブルな上、Active Directoryと連携できるので重宝していました。
&lt;/p&gt;

&lt;p&gt;
先日、2年間使用していた&lt;a href=&quot;http://buffalo.jp/products/catalog/item/t/ts-htgl_r5/&quot; target=&quot;_blank&quot;&gt;TS-H1.6TGL/R5&lt;/a&gt;のHDDにエラーが検出された為、これを機会に新しく&lt;a href=&quot;http://buffalo.jp/products/catalog/storage/ts-xl_r5/&quot; target=&quot;_blank&quot;&gt;TS-X4.0TL/R5&lt;/a&gt;を購入しました。
&lt;/p&gt;
&lt;p&gt;
ファイルサーバのデータ量が既に500GB近くに達しており、新ファイルサーバへのデータ移行の時間が予測できなかったのでゴールデンウィークを利用してファイルの移行を行ったのですが、バックアップ機能を利用して5～6時間でデータの移行が出来ました。
&lt;/p&gt;
&lt;p&gt;
連休明けから新しいファイルサーバで運用していたのですが、ちょっとした不具合があって、原因を調べてみたらファームウェアのバグとのことで、本日は休日出社でファームウェアのアップデートを行いました。
&lt;/p&gt;
&lt;p&gt;
ファイルサーバのファームウェアのアップデートなんてのは、自宅のファイルサーバなら簡単なことですが、会社の最も重要な機器の一つであるファイルサーバのファームウェアですから、やはり非常に気を使います。アップデート後に起動しなくなったなんてことになったら、血の気が引くわけです。
&lt;br /&gt;
というわけで当然、事前に全てのデータをバックアップしてからファームウェアをアップデートしました。
&lt;br /&gt;
今回はTS-X4.0TL/R5のファームウェアをVer.1.0から&lt;a href=&quot;http://buffalo.jp/download/driver/hd/ts-xl_fw.html&quot; target=&quot;_blank&quot;&gt;Ver.1.04&lt;/a&gt;にアップデートしました。アップデートはＰＣから行うのですが、この瞬間に停電が起きないかと余計な心配をしてしまうものです。&lt;br /&gt;
幸いにして何事もなく無事に完了しました。
&lt;/p&gt;
&lt;img src=&quot;/images/news/terastation/teraweb.png&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;
アップデート後に気づいたのは、上記のWebの管理ツールが改善されていたことです。ファームウェアVer.1.0の共有フォルダのアクセス権限の設定は、ハッキリ言って最悪でした。Active Directoryと連携してユーザのアクセス権限を設定しようとする場合、ユーザが多いと設定画面が遅くて使い物になりませんでした。しかしこの辺りは大幅に改善されてました。
&lt;/p&gt;
&lt;p&gt;
しかし、逆に考えると購入直後の初期の状態では管理ツールの一部が使い物にならなかったり、明らかなバグが含まれているというのも考え物です。
&lt;br /&gt;
いかなる製品も出荷直後はバグが多いもので、時間と共に次第に枯れた利用しやすい製品になるものですが、それでも出荷時点では最高の製品であって欲しいです。
&lt;br /&gt;
私たちはソフトウェア開発者であり、お客様にシステムをリリースするときは常にその時点では最高の製品であり、バグは出尽くしたという気持ちで納品しています。（無論TeraStationの開発者の方もそんな気持ちでリリースしているとは思います。）
&lt;/p&gt;
&lt;p&gt;
その気持ちを今後も忘れずに、がんばっていこうなんてことを改めて感じました。
&lt;/p&gt;
&lt;img src=&quot;/images/news/terastation/terastation.jpg&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;
というわけで上記の通り弊社ではTeraStationが3台ありますが、写真手前のTS-X4.0TL/R5はメインファイルサーバとして、写真後ろの2台のTS-HTGL/R5はバックアップ機としてがんばっています。
&lt;/p&gt;
          &lt;p&gt;&lt;br /&gt;株式会社プロフェッサＩＴソリューション部&lt;br /&gt;&lt;a href=&quot;http://isol.pro-s.co.jp&quot;&gt;http://isol.pro-s.co.jp&lt;/a&gt;&lt;/p&gt;
          </description>
          <pubDate>Sat, 09 May 2009 23:44:29 GMT</pubDate>
          <guid>http://isol.pro-s.co.jp//news/2009/05/09/terastation/</guid>
          <link>http://isol.pro-s.co.jp//news/2009/05/09/terastation/</link>
        </item>
    
        <item>
          <title>開発サーバの導入作業</title>
          <description>&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/radservx/radservx1.jpg&quot; alt=&quot;radservX&quot; class=&quot;img-left&quot; /&gt;
弊社で新しいサーバが必要となりまして、久々に開発用のサーバを新規に購入しました。
&lt;/p&gt;
&lt;p&gt;
最近では弊社で開発サーバを購入するにはSupermicro社製を採用することが多かったのですが、
今回は思うところがあって&lt;a href=&quot;http://online.atworks.co.jp/&quot; target=&quot;_blank&quot;&gt;A.T.WORKS&lt;/a&gt;社製のを購入してみることにしました。
&lt;/p&gt;

&lt;p&gt;
今回購入したのは写真にある&lt;a href=&quot;http://online.atworks.co.jp/product/server/1u/radserv_x/index.html&quot; target=&quot;_blank&quot;&gt;radservX(ラッドサーブＸ)&lt;/a&gt;というサーバです。
私のようなガンダム世代では、どうしてもシャア専用に見えてしまいます。
&lt;/p&gt;

&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/radservx/radservx2.jpg&quot; alt=&quot;radservX&quot; class=&quot;img-right&quot; /&gt;
開封して弊社環境向けに少々設定をカスタマイズしてから、下記の写真の通り弊社サーバルームのラックに収めました。
&lt;/p&gt;

&lt;p&gt;
用途は開発サーバですが、最近流行りの仮想化技術であるXenの利用を前提として購入しました。
メモリは4GBと結構積みました。さすがシャア専用です。
&lt;/p&gt;

&lt;p&gt;
仮想化技術には以前から興味がありましたが、実際に社内の開発サーバに本格的に適用したのは今回が初めてです。
私はJava技術者でもありますので仮想化自体は珍しい事ではありませんが、それでもサーバの仮想化は素晴らしく感動しました。
&lt;/p&gt;

&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/radservx/radservx3.jpg&quot; alt=&quot;radservX&quot; class=&quot;img-left&quot; /&gt; 
弊社にて開発したシステムは、そのシステムのリリース後も保守やメンテナンスでその開発サーバなどの環境が引き続き必要となります。
よって開発するシステムが増えれば増えるほど、弊社のサーバルームには開発・保守用のサーバがどんどん増えておりました。
&lt;/p&gt;

&lt;p&gt;
また１つのシステムで必要なサーバは１台ではなく、開発中はチーム毎に開発サーバを用意して開発効率を上げたり、
またステージングサーバも必要だったりと、サーバ管理者としては今まで何台もサーバを構築するのが大変でした。
&lt;/p&gt;

&lt;p&gt;
これがサーバの仮想化により、開発環境の構築が敏速且つ楽になり消費電力も削減できるなどメリットは沢山あります。
&lt;/p&gt;

&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/radservx/vmmanager.jpg&quot; alt=&quot;radservX&quot; class=&quot;img-left&quot; /&gt; 
早速VNC経由で自分のPCから新サーバへログインし、Virtual Machine ManagerというXenの管理ツールを使用して、まずは試しにゲストＯＳとしてCentOSをインストールしてみました。
&lt;/p&gt;
&lt;p&gt;
見慣れたCentOSのインストーラが、デスクトップ上に現れるのは少々違和感がありましたが、スムーズにインストールが出来ました。
試しにインストールしてみたゲストＯＳのCentOS5.2は僅か15分でインストールが出来ました。あまりにも簡単で感動しました。
&lt;/p&gt;

          &lt;p&gt;&lt;br /&gt;株式会社プロフェッサＩＴソリューション部&lt;br /&gt;&lt;a href=&quot;http://isol.pro-s.co.jp&quot;&gt;http://isol.pro-s.co.jp&lt;/a&gt;&lt;/p&gt;
          </description>
          <pubDate>Mon, 12 Jan 2009 17:21:15 GMT</pubDate>
          <guid>http://isol.pro-s.co.jp//news/2009/01/12/vmdev-server/</guid>
          <link>http://isol.pro-s.co.jp//news/2009/01/12/vmdev-server/</link>
        </item>
    
        <item>
          <title>広尾まで散歩</title>
          <description>&lt;p&gt;
昼休みに広尾まで行ってみました。この散歩シリーズは基本的には駅を目的地としていますが、
徐々に会社から歩いていける距離の駅が少なくなってきました。でも、いける駅がなくなるまでもう少し頑張ってみます。
&lt;/p&gt;
&lt;p&gt;
さて、前回の&lt;a href=&quot;/news/2008/12/01/walking-at-shinagawa/&quot;&gt;品川&lt;/a&gt;から、
散歩の経路で絵や文字を描くことを宣言しましたが、これがなかなか難しいです。
&lt;/p&gt;
&lt;p&gt;
歌を作る順序として、「歌詞」を作ってから「曲」を作る場合と
「曲」を作ってからそれに合わせて「歌詞」を作る場合があると聞いたことがあります。
&lt;/p&gt;
&lt;p&gt;
というわけで、今回もまずは「歩いて」からそれに合わせて「絵・文字」を決めようと
無理やり決め込んで歩いてみたのですが、下記の通り極めて微妙な絵になってしまいました。
&lt;/p&gt;
&lt;p&gt;
とりあえず「万歳をしている人を横から見たところ」ということにしました。
丁度「く」の字になっているところがオシリということで。。。
&lt;/p&gt;
&lt;p&gt;
&lt;iframe width=&quot;580&quot; height=&quot;560&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; src=&quot;/news/2009/01/09/walking-at-hiroo/map/&quot;&gt;&lt;/iframe&gt;
&lt;/p&gt;

          &lt;p&gt;&lt;br /&gt;株式会社プロフェッサＩＴソリューション部&lt;br /&gt;&lt;a href=&quot;http://isol.pro-s.co.jp&quot;&gt;http://isol.pro-s.co.jp&lt;/a&gt;&lt;/p&gt;
          </description>
          <pubDate>Fri, 09 Jan 2009 13:07:52 GMT</pubDate>
          <guid>http://isol.pro-s.co.jp//news/2009/01/09/walking-at-hiroo/</guid>
          <link>http://isol.pro-s.co.jp//news/2009/01/09/walking-at-hiroo/</link>
        </item>
    
        <item>
          <title>休日に鍋パーティ</title>
          <description>&lt;p&gt;
夏に&lt;a href=&quot;http://isol.pro-s.co.jp/news/2008/08/30/gyoza/&quot;&gt;餃子パーティ&lt;/a&gt;を開きましたが、今回は季節に見合った鍋パーティを社員の自宅を借りて開きました。
&lt;/p&gt;
&lt;p&gt;
人数が多いので、下記の通り水炊きとキムチ鍋の２種類を用意しました。
&lt;/p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/nabe/nabe1.jpg&quot; alt=&quot;&quot; /&gt;

&lt;p&gt;
下の写真は今回のパーティの目玉食材である&lt;a href=&quot;http://tokyox.net/&quot; target=&quot;_blank&quot;&gt;東京X&lt;/a&gt;という豚肉です。
購入したのはしゃぶしゃぶ用の肉でしたが、これは大好評でした。
&lt;/p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/nabe/nabe2.jpg&quot; alt=&quot;&quot; /&gt;

&lt;p&gt;
若者が多いので肉がてんこ盛りの鍋となってしまいましたが、値段は店で食べるよりも破格の安さで済みました。
&lt;/p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/nabe/nabe3.jpg&quot; alt=&quot;&quot; /&gt;

&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/nabe/nabe4.jpg&quot; alt=&quot;&quot; class=&quot;img-left&quot; /&gt;
お腹いっぱいになった後はみんなでトランプに興じました。
最近はトランプといえばオンライン上でのゲームばかりで物理的にトランプをする機会が少なくなってきましたので、久しぶりで新鮮でした。
&lt;/p&gt;

&lt;p&gt;
トランプに負けた人はお酒の買出しに行ったりして罰ゲームも楽しみました。
&lt;/p&gt;

&lt;p&gt;
がしかし、この頃になるといつもは冷静な男性が酒に酔って故障し始めました。&lt;br /&gt;
いや、故障という程ではなかったのですが、誤作動が多く生じていました。今回は独身女性の部屋を借りてのパーティだったので、テンションが上がり過ぎてしまったようです。ヤレヤレでした(ーー;)
&lt;/p&gt;

&lt;p&gt;
次は新年会を予定しています。楽しみです。
&lt;/p&gt;
          &lt;p&gt;&lt;br /&gt;株式会社プロフェッサＩＴソリューション部&lt;br /&gt;&lt;a href=&quot;http://isol.pro-s.co.jp&quot;&gt;http://isol.pro-s.co.jp&lt;/a&gt;&lt;/p&gt;
          </description>
          <pubDate>Mon, 29 Dec 2008 07:45:11 GMT</pubDate>
          <guid>http://isol.pro-s.co.jp//news/2008/12/29/nabe/</guid>
          <link>http://isol.pro-s.co.jp//news/2008/12/29/nabe/</link>
        </item>
    
        <item>
          <title>Webアプリケーションの排他制御</title>
          <description>&lt;p&gt;
Webに限ったことではありませんが、オンラインシステムにて排他制御をしたい場合はよくあります。
例えばWebオンライン上で複数のユーザが同じデータを更新することが出来るシステムは、なんらかの排他制御の仕組みを取り入れた方がよいでしょう。
&lt;/p&gt;
&lt;p&gt;
今回は私たちがWebシステムを開発してきた中でのこのようなケースで有効な排他に関するテクニックをいくつかご紹介したいと思います。
&lt;/p&gt;

&lt;h4&gt;前提&lt;/h4&gt;
&lt;p&gt;
Webシステムで最も排他制御が必要な対象リソースはデータベースです。ここで申し上げる排他制御を行う対象はデータベースに存在するデータとします。
&lt;/p&gt;

&lt;h4&gt;楽観的ロック&lt;/h4&gt;
&lt;p&gt;
楽観的ロックとはデータそのものに対してはロックをせずに、更新するときにアプリケーションの方でデータ取得時と同じ状態であることを確認してから更新する仕組みです。
&lt;/p&gt;
&lt;p&gt;
例えばWebオンライン画面にて下図のようにデータベースからデータを取得した後「編集」→「確認」→「更新」のように複数画面の遷移を伴う一連の処理では、この楽観的ロックを行います。
&lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/exclusive/exclusive1.png&quot; alt=&quot;&quot; class=&quot;img-left&quot; /&gt;
具体的には、左図の「編集」でデータベースからデータを取得する際に、そのデータの最終更新日も取得しておきます。
&lt;/p&gt;
&lt;p&gt;
そして「更新」する際にデータベースに存在するデータの最終更新日を比較し、異なっていたら編集中に他のユーザが先に更新したと見なしてその更新は無効である旨をユーザに伝えます。
&lt;/p&gt;
&lt;p&gt;
最終更新日を比較する方法で手っ取り早いのは、更新する条件に最終更新日を含めてしまうことです。SQLで表現すると以下のようになります。
&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot; class=&quot;table_black&quot; width=&quot;550&quot;&gt;
  &lt;tr&gt; 
    &lt;td&gt;
      UPDATE table SET field1 = 'date1', field2 = 'date2', &lt;font color=&quot;#ffaaaa&quot;&gt;last_update = SYSDATE&lt;/font&gt;&lt;br /&gt;
      　　WHERE id = 1000 and &lt;font color=&quot;#ffaaaa&quot;&gt;last_update = '2008/12/25 23:41:11'&lt;/font&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
このように更新する条件に最終更新日を含めてしまえば更新した際に更新件数が0件であった場合は、他のユーザが先に更新（もしくは削除）したと判断できます。
&lt;/p&gt;
&lt;p&gt;
また上記のように手動で実装しなくても、自動的に楽観的ロックを行ってくれるデータベース関連のＡＰＩやミドルウェアも存在するので、そちらを利用する方法もあります。
&lt;/p&gt;

&lt;h4&gt;悲観的ロック&lt;/h4&gt;
&lt;p&gt;
悲観的ロックとはデータを取得する際にロックをかけ、他のプロセスから更新を許さないという仕組みです。
&lt;/p&gt;
&lt;p&gt;
例えば一度のトランザクションで、関連する複数のテーブルのデータを抽出し、その抽出結果を基にして更新する場合があります。その場合、複数のテーブルからデータを抽出し、各テーブルに対して更新が終わるまでは、それらのデータのまとまりは他のプロセスから抽出と更新がされていないと保障される必要があります。
&lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/exclusive/exclusive2.png&quot; alt=&quot;&quot; class=&quot;img-left&quot; /&gt;
具体的な例を挙げます。左図のような伝票テーブルとそれに紐付く明細テーブルを更新するアプリケーションがあったとします。
&lt;/p&gt;
&lt;p&gt;
伝票テーブルの情報はWebオンライン上の複数の画面から同時に更新される可能性があり、併せてそれに紐付く明細テーブルのデータも自由に追加・更新・削除できる仕様とします。
&lt;/p&gt;
&lt;p&gt;
また、伝票テーブルには明細の合計金額を保持する項目があるとします。つまり、明細の情報が変更されたり増減した場合は、伝票テーブルのレコードの合計金額もそれに合わせて更新する必要があるとします（このテーブル設計の良し悪しはまた別の話ということで。。）。&lt;br /&gt;
つまり、伝票テーブルと明細テーブルは常に整合性を取って更新する必要があるわけです。
&lt;/p&gt;
&lt;p&gt;
更に厄介なことに、これらのデータはWebオンライン画面からだけではなく、日中に定期的に実行される&lt;strong&gt;バッチ処理&lt;/strong&gt;でも抽出・更新される可能性があるとします。
&lt;/p&gt;
&lt;p&gt;
このような場合に、悲観的ロックを行います。
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;特にバッチ処理では先に申し上げた楽観的ロックを行うのは適切ではありません。&lt;/strong&gt;オンライン画面での楽観的ロックであれば、競合を検出したエラー時にユーザに通知し再入力を促すことは出来ますが、バッチ処理ではエラーとなった場合は再実行をするなりの面倒な考慮が必要となるからです。
&lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/exclusive/exclusive3.png&quot; alt=&quot;&quot; class=&quot;img-right&quot; /&gt;
具体的な悲観的ロックの方法は、右図の通りアプリケーションが伝票または明細テーブルを処理する際に、Webもバッチ処理でも最初に伝票テーブルの対象レコードのロックを取得してから処理を行うという&lt;strong&gt;ルール&lt;/strong&gt;を決めます。
&lt;/p&gt;
&lt;p&gt;
重要なのは更新する直前にロックをするのではなく、そのトランザクション内で伝票データを抽出する前に、伝票テーブルの対象レコードのロックを取得することです。
&lt;/p&gt;
&lt;p&gt;
悲観的ロックを実現するには、データベースのロック機構をそのまま利用します。例えば、Oracleの場合はFOR UPDATE句でありSQL ServerやDB2の場合は、更新ロック(Uロック)等が適当です。&lt;br /&gt;
以下はOracleのFOR UPDATE句でロックを取得する例です。
&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot; class=&quot;table_black&quot; width=&quot;550&quot;&gt;
  &lt;tr&gt; 
    &lt;td&gt;
      SELECT * FROM table WHERE id = 1000 &lt;font color=&quot;#ffaaaa&quot;&gt;FOR UPDATE&lt;/font&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/exclusive/exclusive1.png&quot; alt=&quot;&quot; class=&quot;img-left&quot; /&gt;
先の楽観的ロックの例に出た左図のような「編集」→「確認」→「更新」のように遷移するWebオンライン画面のシステムで、バッチ処理も存在する場合は、オンラインでの「更新」の際に悲観的ロックも併用するようにします。&lt;br /&gt;
またバッチ処理では常に悲観的ロックを使用して更新します。
&lt;/p&gt;
&lt;p&gt;
このようにWebでもバッチでも必ず伝票テーブルの対象レコードのロックを取得してから処理をする、というルールを徹底すれば正常に排他制御が働き不整合データができることはありません。
&lt;/p&gt;
&lt;p&gt;
ただし、悲観的ロックでは&lt;strong&gt;デッドロック&lt;/strong&gt;に注意する必要があります。
先ほどからの例で言うと、&lt;b&gt;一度のトランザクションで複数の伝票データを更新する可能性がある場合&lt;/b&gt;は注意が必要です。
&lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/exclusive/exclusive4.png&quot; alt=&quot;&quot; class=&quot;img-left&quot; /&gt;
具体的な例として左図の通り、①でWebオンラインが伝票テーブルのレコード1に対してロックを取得した後、②でバッチ処理が伝票テーブルのレコード3に対してロックを取得したとします。
③でWebオンラインが同一トランザクションで伝票テーブルのレコード3に対してロックを取得しようとするのと、④でバッチ処理が伝票テーブルのレコード1に対してロックを取得しようとするのが重なり、デッドロックに陥る可能性があるということです。
&lt;/p&gt;
&lt;p&gt;
デッドロックを防止する有効な手段としては、ロックを取得する際に順番付けのルールを決めるというのがあります。上記の例でいうと、伝票のレコード番号が小さいものからロックを取得するというルールを決めれば、バッチ処理は伝票テーブルのレコード3からではなくレコード1から取得しなければならず、デッドロックが発生しません。
&lt;/p&gt;
&lt;p&gt;
上記のルールが徹底されればそれに越したことはありませんが、私たちがよくやる方法はロックを取得する際にタイムアウトを設けてしまうことです。こうすれば、上記のような状態に陥ってもタイムアウトが発生してデッドロックにはなりません。&lt;br /&gt;
以下はOracleのFOR UPDATE句でロックを取得する際に8秒のタイムアウトを設けた例です。
&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot; class=&quot;table_black&quot; width=&quot;550&quot;&gt;
  &lt;tr&gt; 
    &lt;td&gt;
      SELECT * FROM table WHERE id = 1000 &lt;font color=&quot;#ffaaaa&quot;&gt;FOR UPDATE WAIT 8&lt;/font&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
ただし、バッチ処理から行うロックにはタイムアウトは設けません。先に申し上げた通りバッチ処理でエラーとなった場合は再実行をするなりの面倒な考慮が必要であり、オンラインのように安易にエラーを発生させる事は出来ません。&lt;br /&gt;
よって私たちは、バッチ処理からのロックはタイムアウトを設けずに、オンラインからのロックだけにタイムアウトを設けます。つまりバッチ処理を最優先させるということです。&lt;br /&gt;
ただし、バッチ処理は複数同時に実行されることは無いというのが前提です。
&lt;/p&gt;
&lt;h4&gt;まとめ&lt;/h4&gt;
&lt;p&gt;
以上となりますが、私たちが排他制御を行う際のポイントをまとめると下記の通りとなります。
&lt;/p&gt;
&lt;ul class=&quot;list&quot;&gt;
  &lt;li&gt;複数のユーザが同じデータを同時に更新可能なWebオンラインでは楽観的ロックを行う&lt;/li&gt;
  &lt;li&gt;Webオンラインと同時にバッチ処理で更新される可能性がある場合は悲観的ロックも併用する&lt;/li&gt;
  &lt;li&gt;悲観的ロックでは対象データの主となるテーブルのレコードのロックを取得する&lt;/li&gt;
  &lt;li&gt;同一トランザクションで複数のデータに対して悲観的ロックを取得する場合はデッドロックに注意する&lt;/li&gt;
&lt;/ul&gt;

          &lt;p&gt;&lt;br /&gt;株式会社プロフェッサＩＴソリューション部&lt;br /&gt;&lt;a href=&quot;http://isol.pro-s.co.jp&quot;&gt;http://isol.pro-s.co.jp&lt;/a&gt;&lt;/p&gt;
          </description>
          <pubDate>Sun, 28 Dec 2008 11:15:21 GMT</pubDate>
          <guid>http://isol.pro-s.co.jp//news/2008/12/28/web-exclusive/</guid>
          <link>http://isol.pro-s.co.jp//news/2008/12/28/web-exclusive/</link>
        </item>
    
        <item>
          <title>Javaの仮引数と実引数</title>
          <description>&lt;p&gt;
前回Javaというオブジェクト指向言語で初心者が犯しやすいポイントとして、&lt;a href=&quot;/news/2008/12/14/java-stack-heap/&quot;&gt;Javaのスタックとヒープ&lt;/a&gt;というお話をしました。&lt;br /&gt;
これに関連する話として、本日はJavaの引数に関して仮引数と実引数の動きを簡単にご説明したいと思います。
&lt;/p&gt;

&lt;p&gt;
尚、以降の内容はJavaのスタックとヒープに関して理解していただいた方を前提として記述しております。まだ御覧になってない方は、先に、&lt;a href=&quot;/news/2008/12/14/java-stack-heap/&quot;&gt;こちら&lt;/a&gt;をご確認いただければと思います。 
&lt;/p&gt;

&lt;h4&gt;実引数とは&lt;/h4&gt;
&lt;p&gt;
実引数とは下記のサンプルコードでの、&quot;st&quot;と&quot;sb&quot;の変数を指します。つまりメソッドに渡す呼び出し元の引数のことです。
&lt;/p&gt;

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot; class=&quot;table_black&quot; width=&quot;350&quot;&gt;
  &lt;tr&gt; 
    &lt;td&gt;
      private void func1( ){&lt;br /&gt;
      &lt;br /&gt;
      　String st = new String(&quot;ＩＴ&quot;);&lt;br /&gt;
      　StringBuffer sb = new StringBuffer(&quot;ソリューション&quot;);&lt;br /&gt;
        &lt;br /&gt;
      　func2( &lt;font color=&quot;#ffaaaa&quot;&gt;st&lt;/font&gt;, &lt;font color=&quot;#ffaaaa&quot;&gt;sb&lt;/font&gt; );&lt;br /&gt;
      }
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;h4&gt;仮引数とは&lt;/h4&gt;
&lt;p&gt;
仮引数とは下記のサンプルコードでの、&quot;st&quot;と&quot;sb&quot;の変数を指します。
&lt;/p&gt;

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot; class=&quot;table_black&quot; width=&quot;350&quot;&gt;
  &lt;tr&gt; 
    &lt;td&gt;
      private void func2( String &lt;font color=&quot;#ffaaaa&quot;&gt;st&lt;/font&gt;, StringBuffer &lt;font color=&quot;#ffaaaa&quot;&gt;sb&lt;/font&gt; ){&lt;br /&gt;
      &lt;br /&gt;
      }
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;


&lt;h4&gt;Javaでは引数の渡し方は、すべて「値渡し」&lt;/h4&gt;
&lt;p&gt;
引数の仕組みは「参照渡し」や「値渡し」という言い方がありますが、Javaの場合は「&lt;strong&gt;値渡し&lt;/strong&gt;」になります。
Javaの引数は「参照渡し」であると誤解していらっしゃる方が多いようですが、これらの言葉の定義は別にして
まずはどのように動作しているかを以下にご説明いたします。
&lt;/p&gt;

&lt;h4&gt;StringBufferを引数にした場合の例&lt;/h4&gt;
&lt;p&gt;
まずはStringBufferを引数とした場合を例に、どのような動きをしているかをご説明します。
&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot; class=&quot;table_black&quot; width=&quot;350&quot;&gt;
  &lt;tr&gt; 
	&lt;td&gt;private void func1( )&lt;/td&gt;&lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
	&lt;td&gt;　StringBuffer &lt;font color=&quot;#ffaaaa&quot;&gt;sb1&lt;/font&gt; = new StringBuffer( &quot;ＩＴ&quot; );&lt;/td&gt;&lt;td&gt;------ (1)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
	&lt;td&gt;　func2( &lt;font color=&quot;#ffaaaa&quot;&gt;sb1&lt;/font&gt; );&lt;/td&gt;&lt;td&gt;------ (2)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
	&lt;td&gt;　System.out.println( &lt;font color=&quot;#ffaaaa&quot;&gt;sb1&lt;/font&gt; );&lt;/td&gt;&lt;td&gt;------ (5)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
	&lt;td&gt;}&lt;/td&gt;&lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;

  &lt;tr&gt; 
	&lt;td&gt;private void func2( StringBuffer &lt;font color=&quot;#ffaaaa&quot;&gt;sb2&lt;/font&gt; ){&lt;/td&gt;&lt;td&gt;------ (3)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
	&lt;td&gt;　&lt;font color=&quot;#ffaaaa&quot;&gt;sb2&lt;/font&gt;.append( &quot;ソリューション部&quot; );&lt;/td&gt;&lt;td&gt;------ (4)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
	&lt;td&gt;}&lt;/td&gt;&lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;
下図の通り、(1)でヒープ上にStringBufferのインスタンスが生成され、そこへのアドレスがスタック上の変数sb1に格納されます。
&lt;/p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/paramarg/param-arg1.png&quot; alt=&quot;&quot; /&gt;

&lt;p&gt;
(2) (3) でfunc2メソッドが呼び出されます。&lt;strong&gt;Javaではこの時に実引数sb1のアドレスが仮引数sb2にコピーされます。&lt;/strong&gt;&lt;br /&gt;
重要なのは、実引数sb1と仮引数sb2はスタック上では別の領域に存在しているが、格納されているアドレスは同じという事です。&lt;br /&gt;
実引数のアドレスの&lt;strong&gt;値&lt;/strong&gt;が仮引数にコピーされるので、「&lt;strong&gt;値渡し&lt;/strong&gt;」なのです。
&lt;/p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/paramarg/param-arg2.png&quot; alt=&quot;&quot; /&gt;
&lt;p&gt;
(4)でsb2の変数を使用して値を追加すると、sb1の変数から参照するインスタンスも値が追加される。
&lt;/p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/paramarg/param-arg3.png&quot; alt=&quot;&quot; /&gt;

&lt;p&gt;
(5)でsb1の値を出力すると下記の通り、&quot;ＩＴソリューション部&quot;と出力されます。
&lt;/p&gt;

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot; class=&quot;table_black&quot; width=&quot;350&quot;&gt;
&lt;caption&gt;&lt;font color=&quot;#000000&quot;&gt;サンプルプログラムの実行結果&lt;/font&gt;&lt;/caption&gt;
  &lt;tr&gt; 
    &lt;td&gt;ＩＴソリューション部&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;h4&gt;Stringを引数にした場合の例&lt;/h4&gt;
&lt;p&gt;
Stringを引数にするとStringBufferとは異なった挙動を見せます。これはStringは不変オブジェクトであることに起因します。
&lt;/p&gt;
&lt;p&gt;
サンプルプログラムの前に、Stringで重要な性質を以下にご説明します。
&lt;/p&gt;
&lt;p&gt;
String st = &quot;ＩＴソリューション部&quot;; (1)&lt;br /&gt;
String st = new String(&quot;ＩＴソリューション部&quot;); (2)&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
上記の(1)と(2)は同じ結果になります。つまり、(1)のようにStringクラスに文字列を代入するということはヒープ上に新しいインスタンスを生成するということになるのです。&lt;br /&gt;
※ただし、正確には(1)と(2)は結果に至るまでの挙動が異なります。(1)のように記述したほうがパフォーマンスは良いです。 
&lt;/p&gt;
&lt;p&gt;
上記のStringの性質を踏まえて、以下のサンプルプログラムをご説明します。
&lt;/p&gt;

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot; class=&quot;table_black&quot; width=&quot;350&quot;&gt;
  &lt;tr&gt; 
	&lt;td&gt;private void func1( )&lt;/td&gt;&lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
	&lt;td&gt;　String &lt;font color=&quot;#ffaaaa&quot;&gt;st1&lt;/font&gt; = &quot;ＩＴ&quot;;&lt;/td&gt;&lt;td&gt;------ (1)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
	&lt;td&gt;　func2( &lt;font color=&quot;#ffaaaa&quot;&gt;st1&lt;/font&gt; );&lt;/td&gt;&lt;td&gt;------ (2)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
	&lt;td&gt;　System.out.println( &lt;font color=&quot;#ffaaaa&quot;&gt;st1&lt;/font&gt; );&lt;/td&gt;&lt;td&gt;------ (5)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
	&lt;td&gt;}&lt;/td&gt;&lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;

  &lt;tr&gt; 
	&lt;td&gt;private void func2( String &lt;font color=&quot;#ffaaaa&quot;&gt;st2&lt;/font&gt; ){&lt;/td&gt;&lt;td&gt;------ (3)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
	&lt;td&gt;　&lt;font color=&quot;#ffaaaa&quot;&gt;st2&lt;/font&gt; = st2 +  &quot;ソリューション部&quot;;&lt;/td&gt;&lt;td&gt;------ (4)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
	&lt;td&gt;}&lt;/td&gt;&lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;
Stringで文字列の代入はインスタンスを生成することになりますので、下図の通り(1)でヒープ上にStringのインスタンスが生成され、そこへのアドレスがスタック上の変数st1に格納される。
&lt;/p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/paramarg/param-arg4.png&quot; alt=&quot;&quot; /&gt;

&lt;p&gt;
(2) (3) でfunc2メソッドが呼び出され、実引数st1のアドレスが仮引数st2にコピーされます。
&lt;/p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/paramarg/param-arg5.png&quot; alt=&quot;&quot; /&gt;

&lt;p&gt;
先に説明したStringの性質を踏まえると、(4)に見られる仮引数st2への代入はヒープ上に新しいインスタンスが生成され、スタックのst2はそこへのアドレスが上書きされてしまいます。
よって、下図の通りst1とst2はヒープ上の別のインスタンスを指すことになります。
&lt;/p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/paramarg/param-arg6.png&quot; alt=&quot;&quot; /&gt;

&lt;p&gt;
(5)でst1の値を出力すると下記の通り、&quot;ＩＴ&quot;とだけ出力されます。
&lt;/p&gt;

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot; class=&quot;table_black&quot; width=&quot;350&quot;&gt;
&lt;caption&gt;&lt;font color=&quot;#000000&quot;&gt;サンプルプログラムの実行結果&lt;/font&gt;&lt;/caption&gt;
  &lt;tr&gt; 
    &lt;td&gt;ＩＴ&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;h4&gt;Javaは「参照渡し」ではない&lt;/h4&gt;
&lt;p&gt;
上記でご説明した通り、Javaの仮引数と実引数ではスタック上の物理的な領域は異なります。
仮引数と実引数はスタック上の同じ領域を指していると勘違いすることにより、大きなバグを生んでしまうことがあるので十分な注意が必要です。
&lt;/p&gt;

&lt;h4&gt;補足&lt;/h4&gt;

&lt;p&gt;
上記で説明した「実引数の値が仮引数にコピーされる」というのは、プリミティブ型の場合も同様です。
プリミティブ型の変数にはアドレスではなく値そのものが保持されていますので、値そのものがコピーされるということになります。
&lt;/p&gt;

          &lt;p&gt;&lt;br /&gt;株式会社プロフェッサＩＴソリューション部&lt;br /&gt;&lt;a href=&quot;http://isol.pro-s.co.jp&quot;&gt;http://isol.pro-s.co.jp&lt;/a&gt;&lt;/p&gt;
          </description>
          <pubDate>Fri, 19 Dec 2008 17:02:35 GMT</pubDate>
          <guid>http://isol.pro-s.co.jp//news/2008/12/19/java-param-arg/</guid>
          <link>http://isol.pro-s.co.jp//news/2008/12/19/java-param-arg/</link>
        </item>
    
        <item>
          <title>Javaのスタックとヒープ</title>
          <description>&lt;p&gt;
私達はJava言語を得意とした部隊ですが、このオブジェクト指向言語で初心者が犯しやすいポイントがいくつかあります。
&lt;/p&gt;
&lt;p&gt;
その一つは&lt;strong&gt;「変数にはインスタンス自体ではなく、インスタンスへの参照先（アドレス）が保持されている」&lt;/strong&gt;ということが理解できていないことにより、オブジェクトの属性値がいつの間にか変わってしまうといったような不可解なバグを生み出してしまう事です&lt;br /&gt;
このようなバグを入れてしまうのはJavaのスタックとヒープの動きが理解できていない為です。
&lt;/p&gt;
&lt;p&gt;
そういう私も新人の頃に同様のバグを起こして大変苦労した経験があります。
よって弊社での新人研修では私は必ずこのスタックとヒープの動きを説明します。また、新人の記述したソースコードをレビューする際は忘れずにこの点をチェックしています。
&lt;/p&gt;
&lt;p&gt;
以下に、Javaのスタックとヒープに関しての説明と犯し易い間違いを簡単に説明します。
&lt;/p&gt;

&lt;h4&gt;スタックとヒープ&lt;/h4&gt;
&lt;p&gt;
Javaのメモリ領域は、大きく分けて「スタック」と「ヒープ」の２つが存在します。
&lt;/p&gt;
&lt;pre&gt;
&lt;b&gt;スタック&lt;/b&gt;
　・主にローカル変数が扱われ、その中にはインスタンスへのアドレスが保持される。
　　※変数はアドレスを入れる箱を考えてください。
&lt;b&gt;ヒープ&lt;/b&gt;
　・インスタンスそのものが保持される。
&lt;/pre&gt;

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot; class=&quot;table_black&quot; width=&quot;350&quot;&gt;
  &lt;tr&gt; 
    &lt;td&gt;SampleClass sclass = null;&lt;/td&gt;
    &lt;td&gt;------ (1)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;sclass = new SampleClass();&lt;/td&gt;
    &lt;td&gt;------ (2)&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
上記のサンプルコードを下図と共に説明します。&lt;br /&gt;
まず(1)で変数を定義した際にはスタック上にアドレスを入れる箱が生まれます。&lt;br /&gt;
次に(2)でインスタンスを生成した際にはヒープ上にそのインスタンスが生成され、そこへのアドレスが(1)で定義した変数の中にセットされます。
&lt;/p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/stackheap/stack-heap1.png&quot; alt=&quot;スタックとヒープ&quot; /&gt;

&lt;h4&gt;間違えやすいコードの例&lt;/h4&gt;
&lt;p&gt;
先の説明を踏まえて、初心者が間違えやすいコードは以下の通りとなります。
&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot; class=&quot;table_black&quot; width=&quot;350&quot;&gt;
  &lt;tr&gt; 
    &lt;td&gt;StringBuffer sb1 = null;&lt;/td&gt;
    &lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;StringBuffer sb2 = null;&lt;/td&gt;
    &lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;sb1 = new StringBuffer(&quot;あ&quot;);&lt;/td&gt;
    &lt;td&gt;------ (1)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;font color=&quot;#ffaaaa&quot;&gt;sb2 = sb1;&lt;/font&gt;&lt;/td&gt;
    &lt;td&gt;------ (2)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;sb1.append(&quot;い&quot;);&lt;/td&gt;
    &lt;td&gt;------ (3)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;System.out.println(sb1);&lt;/td&gt;
    &lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;System.out.println(sb2);&lt;/td&gt;
    &lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;
最初に変数sb1とsb2を宣言します。この時点ではスタック上にsb1とsb2の変数の領域だけが確保されます。中身に入るべきアドレスは空の状態です。
&lt;/p&gt;
&lt;p&gt;
次に(1)でStringBufferのインスタンスを生成します。ここで、ヒープ上にStringBufferのインスタンスが生成され、そのインスタンスへのアドレスが変数sb1に保持されます。
&lt;/p&gt;
&lt;p&gt;
次に(2)でsb1をsb2に代入しています。&lt;strong&gt;ここで初心者は勘違いを起こす事があります。&lt;/strong&gt;
初心者はsb2にStringBufferのインスタンスそのものをコピーしたと思ってしまいます。具体的には
&quot;あ&quot;という値を持つStringBufferのインスタンスがもう一つ出来たと思ってしまうのです。
&lt;/p&gt;
&lt;p&gt;
しかし、実際は下図の通り先にヒープ上に生成されたStringBufferのインスタンスへのアドレスがコピーされたに過ぎません。
同じアドレスがsb1とsb2に保持されますので、そのアドレスが指すヒープ上のインスタンスは同じものなのです。
&lt;/p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/stackheap/stack-heap2.png&quot; alt=&quot;スタックとヒープ&quot; /&gt;
&lt;p&gt;
(3)でsb1変数を使用して&quot;い&quot;という文字列を追加します。
&lt;/p&gt;
&lt;p&gt;
最後にsb1とsb2の値をSystem.out()で出力しています。&lt;br /&gt;
&lt;strong&gt;このプログラムの作成者はsb1は&quot;あい&quot;でsb2は&quot;あ&quot;と出力されることを期待したとしても、実際には下記の通りどちらも&quot;あい&quot;と出力されます。&lt;/strong&gt;
&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot; class=&quot;table_black&quot; width=&quot;350&quot;&gt;
&lt;caption&gt;&lt;font color=&quot;#000000&quot;&gt;サンプルプログラムの実行結果&lt;/font&gt;&lt;/caption&gt;
  &lt;tr&gt; 
    &lt;td&gt;あい&lt;br /&gt;あい&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;
上記のようなバグはソースを一見しただけでは気づきにくく、また状況によって不具合の現象も一定ではない為、原因の特定に時間のかかるバグです。&lt;br /&gt;
私が新人の頃に同様のバグを出した当時はJavaが生まれて間もない頃だった事もあり、
ここで説明したスタックとヒープの動きを理解している人が少なかった為、
恥ずかしながら原因の究明に何日もかかってしまったのを憶えています。
&lt;/p&gt;

&lt;h4&gt;補足&lt;/h4&gt;
&lt;p&gt;
上記で説明した「変数にはアドレスが格納される」というのは、オブジェクト型の変数に限ります。
プリミティブ型の変数には、値そのものが保持され代入した際には値そのものがコピーされるので上記のような不具合は発生しません。&lt;br /&gt;
このオブジェクト型とプリミティブ型のメモリの管理方法の違いが初心者を混乱させてしまう一つの原因のようです。
&lt;/p&gt;
&lt;p&gt;
このスタックとヒープに関連して初心者が陥りやすい同様の間違いとして、仮引数と実引数の話があります。
2008年12月19日に&lt;a href=&quot;/news/2008/12/19/java-param-arg/&quot;&gt;Javaの仮引数と実引数&lt;/a&gt;という記事も書きましたので、是非御覧ください。 
&lt;/p&gt;
          &lt;p&gt;&lt;br /&gt;株式会社プロフェッサＩＴソリューション部&lt;br /&gt;&lt;a href=&quot;http://isol.pro-s.co.jp&quot;&gt;http://isol.pro-s.co.jp&lt;/a&gt;&lt;/p&gt;
          </description>
          <pubDate>Sun, 14 Dec 2008 19:30:14 GMT</pubDate>
          <guid>http://isol.pro-s.co.jp//news/2008/12/14/java-stack-heap/</guid>
          <link>http://isol.pro-s.co.jp//news/2008/12/14/java-stack-heap/</link>
        </item>
    
        <item>
          <title>システム開発とネーミング</title>
          <description>&lt;p&gt;
システム開発という仕事をしていると、何かに名前をつけなければならない事が多々あります。
何事も名前をつけるという行為は難しく悩ましいものです。&lt;br /&gt;
今回はシステム開発に纏わる「命名」という行為に関して少しお話したいと思います。
&lt;/p&gt;

&lt;h4&gt;システム名&lt;/h4&gt;
&lt;p&gt;
大規模なシステムではそのシステム自体に名前をつけることがよくあります。
「原価管理システム」とか「業務管理システム」というのではなく
アメリカ人やイタリア人のような名前のついたシステムの開発に携わったことは何度かあります。&lt;br /&gt;
ジャストシステムの製品では「一太郎」とか「花子」等あえて日本人の名前を採用していたりするのは、日本企業ならではのこだわりが感じられ結構好きです。
&lt;/p&gt;
&lt;p&gt;
ちなみに難易度が高い名前は、そのシステムの目的や理想のような英単語の頭文字をつなげて、最もらしい名前にすることだと思います。&lt;br /&gt;
これらの類では個人的にJSON（ジェイソン、JavaScript Object Notation）というデータフォーマットの名前が好きです。
&lt;/p&gt;
&lt;p&gt;
開発しているシステムに名前をつけるということはいくつか利点があります。
例えば、「ディック」と命名されたシステムがあったとしたら「ＸＸＸシステム」とわざわざ呼ぶよりも「ディック」の方が会話がスムーズになりますし、何よりシステムに対して開発者の深い愛着が生まれます。
&lt;/p&gt;

&lt;h4&gt;コードネーム&lt;/h4&gt;
&lt;p&gt;
開発中の製品には名前とは別にコードネームが付いたりします。元々コードネームとは開発中の製品の機密保持が目的だったようですが、近年ではあえて一般に公開されることも多く、システムのバージョンを表す別名という意味合いが強くなってきています。
&lt;/p&gt;
&lt;p&gt;
コードネームに限った事ではありませんが、一定のルールに則ってつけられる名前があります。コードネームで私が好きなのは２つあります。
&lt;/p&gt;
&lt;p&gt;
一つはLinuxのディストリビューションの一つDebian GNU/Linuxのコードネームです。
Debianのコードネームは、下表の通り映画の「トイ・ストーリー」のキャラクタとなっています。woodyやsargeはよく利用しました。
&lt;/p&gt;
  &lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; summary=&quot;Debianのコードネーム&quot;&gt;
    &lt;tr&gt;
      &lt;th&gt;バージョン&lt;/th&gt;
      &lt;th&gt;コードネーム&lt;/th&gt;
      &lt;th&gt;説明&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1.1&lt;/td&gt;
      &lt;td&gt;buzz&lt;/td&gt;
      &lt;td&gt;バズ・ライトイヤー。主人公の宇宙飛行士。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1.2&lt;/td&gt;
      &lt;td&gt;rex&lt;/td&gt;
      &lt;td&gt;レックス&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1.3&lt;/td&gt;
      &lt;td&gt;bo&lt;/td&gt;
      &lt;td&gt;ボー・ピープ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2.0&lt;/td&gt;
      &lt;td&gt;hamm&lt;/td&gt;
      &lt;td&gt;ハム&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2.1&lt;/td&gt;
      &lt;td&gt;slink&lt;/td&gt;
      &lt;td&gt;スリンキードッグ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2.2&lt;/td&gt;
      &lt;td&gt;potato&lt;/td&gt;
      &lt;td&gt;ミスターポテトヘッド&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3.0&lt;/td&gt;
      &lt;td&gt;woody&lt;/td&gt;
      &lt;td&gt;ウッディ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3.1&lt;/td&gt;
      &lt;td&gt;sarge&lt;/td&gt;
      &lt;td&gt;軍曹&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4.0&lt;/td&gt;
      &lt;td&gt;etch&lt;/td&gt;
      &lt;td&gt;エッチ・ア・スケッチ&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;p&gt;
もう一つ好きなのはJava開発者なら身近なEclipseのコードネームです。Eclipseのコードネームは木星の衛星の名前からつけられています。木星の衛星というチョイスはかなりナイスです。
&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; summary=&quot;Eclipseのコードネーム&quot;&gt;
    &lt;tr&gt;
      &lt;th&gt;バージョン&lt;/th&gt;
      &lt;th&gt;コードネーム&lt;/th&gt;
      &lt;th&gt;説明&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3.2&lt;/td&gt;
      &lt;td&gt;Callisto&lt;/td&gt;
      &lt;td&gt;カリスト&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3.3&lt;/td&gt;
      &lt;td&gt;Europa&lt;/td&gt;
      &lt;td&gt;エウロパ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3.4&lt;/td&gt;
      &lt;td&gt;Ganymede&lt;/td&gt;
      &lt;td&gt;ガニメデ&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.eclipse.org/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/naming/eclipse.png&quot; alt=&quot;Eclipse&quot; class=&quot;img-right&quot; /&gt;&lt;/a&gt;
ちなみにEclipseはもともとはIBMが開発した製品がベースとなっています（現在はオープンソースです）。
有名な話ですがEclipse（日食）というネーミングは、IBMがライバルのSun(太陽)との対立を表しているといわれていますが、
当然IBMは公式には否定しているようです。
&lt;/p&gt;

&lt;h4&gt;ホスト名&lt;/h4&gt;
&lt;p&gt;
私は社内にある数十台のサーバの面倒を見ていますが、以前は新しいサーバを立ち上げる際のホスト名の命名に悩みました。
例えば新しくWindowsＰＣを購入した際に、初期設定で「コンピュータ名」を何にしようか悩む方もいらっしゃると思います。しかしＰＣは後から簡単に変えられますが、サーバのホスト名の変更は、ＰＣほど容易には出来ません。
&lt;/p&gt;
&lt;p&gt;
一般的に多数のサーバのホスト名の命名には選択肢が豊富なシリーズものが好まれ、例えば「太陽系の惑星」、「星座」、「動物名」、「ギリシャ神話の神」等はサーバ管理者の間ではよく使われています。
&lt;/p&gt;
&lt;p&gt;
まだ私がサーバ管理者になりたての頃に、これらサーバのホスト名の命名で失敗したことがあります。
ある大規模プロジェクトで開発サーバを何台も構築する必要が発生した際に、
理由は忘れましたが何故か「北斗の拳」のキャラクターから名前を拝借したことがありました（多分疲れていたのです）。
かなり前なので、全てを思い出せませんが以下のような感じだったと思います。
&lt;/p&gt;
&lt;pre&gt;
・raou（ラオウ）
・kokuou（黒王号）
・kaiou（カイオウ）
・ken（ケンシロウ）
・yuria（ユリア）
・jagi（ジャギ）　　←ジャギと命名されたサーバはかなりスペックが低い
&lt;/pre&gt;
&lt;p&gt;
今思うとかなり痛々しい名前でしたが、当時は名前を考える時間も勿体無いくらい忙しかったわけです。
&lt;/p&gt;
&lt;p&gt;
幸い、開発プロジェクトが終了したらこれらのサーバも別の開発サーバに転用されていった為、
再インストールでホスト名も消えていったのですが、諸事情により「kokuou」サーバだけは
ついこの間まで弊社の中で現役で稼動しておりました。
&lt;/p&gt;
&lt;p&gt;
最近は社内のサーバのホスト名は、それなりの命名規則に則ってつけていたのですが
この「kokuou」だけは数年間もずっとこの規則から外れたサーバとしてがんばっていました。
&lt;/p&gt;
&lt;p&gt;
この「kukuou」サーバにログインする度に、「ああ、やっぱり名前は慎重に考えないとイカン」と身に染みていました。。。
&lt;/p&gt;

&lt;h4&gt;開発資源のネーミング&lt;/h4&gt;
&lt;p&gt;
システム開発者が日常的に悩むのは、設計時のデータベースの「テーブル名」や「フィールド名」、コーディング時の「変数名」「メソッド名」「クラス名」等の命名でしょう。&lt;br /&gt;
「ああー、こんなクラス名をどうするかで悩んでいる暇ねーのに！」という思いは誰もが経験した事があると思います。
&lt;/p&gt;
&lt;p&gt;
これらの命名は英語にするか日本語にするかという選択や、言語によっても文化が異なり意外と奥深い話題です。&lt;br /&gt;
また大規模システム開発ではこれらは命名規約によって左右されますので、その規約を作る人の手腕によって大きく左右されます。（テーブル名やクラス名がＩＤ形式の命名規約は最悪です。）
&lt;/p&gt;
&lt;p&gt;
この辺の話は書き出すとまた長くなってしまうので、また別の機会に続きを書きたいと思います。
&lt;/p&gt;

          &lt;p&gt;&lt;br /&gt;株式会社プロフェッサＩＴソリューション部&lt;br /&gt;&lt;a href=&quot;http://isol.pro-s.co.jp&quot;&gt;http://isol.pro-s.co.jp&lt;/a&gt;&lt;/p&gt;
          </description>
          <pubDate>Thu, 11 Dec 2008 06:56:28 GMT</pubDate>
          <guid>http://isol.pro-s.co.jp//news/2008/12/11/naming/</guid>
          <link>http://isol.pro-s.co.jp//news/2008/12/11/naming/</link>
        </item>
    
        <item>
          <title>IPv6のIPアドレス数はどのくらい多いのか</title>
          <description>&lt;p&gt;
IPとはインターネットプロトコル(Internet Protocol)のことで、インターネットの中核の技術です。ネットワークに参加している機器に割り振られる「IPアドレス」という言葉は、ネットワークに詳しくない方も聞いた事があると思います。
&lt;/p&gt;
&lt;p&gt;
現在主流のIPのバージョンは4であり後継バージョンは6であることも有名です。それぞれ、IPv4（あいぴーぶいよん）、IPv6（あいぴーぶいろく）などと呼ばれています。
&lt;/p&gt;
&lt;p&gt;
私のような業務アプリケーション開発を主にしているＳＥでもIPv6をよく見かけるようになりました。
家庭用のブロードバンドルータにも搭載していたり、Windows XPやVistaでも普通にIPv6を設定できます。しかし、未だに使用したことがありません。
&lt;/p&gt;
&lt;p&gt;
かなり前からIPv4のIPアドレスが枯渇しそうだと言われておきながら、なかなかそのような状況になっていません。といいつつも、いよいよもうすぐ無くなるという話もチラホラ耳にします。&lt;br /&gt;
以前、社外のネットワーク研修を受けた際に講師の方がこの話題を取り上げていましたが、DHCP等のIPの動的割り振りやNATやIPマスカレードなどのアドレス変換技術が普及してIPアドレスが減るペースが落ちた事が、なかなか枯渇しない理由の一つだとその時にはおっしゃってました。&lt;br /&gt;
とはいっても地球の石炭や石油と一緒でいずれ無くなるだろうと思われるIPv4のIPアドレスですので、本日は後継バージョンのIPv6に関して少し書いてみたいと思います。
&lt;/p&gt;
&lt;h4&gt;IPv6のIPアドレスはどのくらい多いのか&lt;/h4&gt;
&lt;p&gt;
IPv6の仕様に関してはあらゆるサイトで説明されていますので、その辺は他のサイトにお任せして、月並みな話ですが現状のIPv4と最も大きな違いである数に関して比較してみたいと思います。
&lt;/p&gt;
&lt;table width=&quot;570&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
  &lt;tr&gt;
    &lt;th scope=&quot;row&quot;&gt;IPv4&lt;/th&gt;
    &lt;td&gt;2&lt;sup&gt;32&lt;/sup&gt;個&lt;/td&gt;
    &lt;td&gt;4294967296個&lt;/td&gt;
    &lt;td&gt;約43億個&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th scope=&quot;row&quot;&gt;IPv6&lt;/th&gt;
    &lt;td&gt;2&lt;sup&gt;128&lt;/sup&gt;個&lt;/td&gt;
    &lt;td&gt;340282366920938463463374607431768211456個&lt;/td&gt;
    &lt;td&gt;約340澗（かん）個&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
それぞれの仕様上、定義できるIPアドレスの数は上記の表の通りとなります。
IPv6となると澗（かん）という聞いた事の無い桁が出てきます。兆という位の次は京（けい）というのは聞いたことがありますが、澗（かん）はその京の５つ上の位になります。
&lt;/p&gt;
&lt;p&gt;
私が初めてIPv6の存在を知った当時に、新しいIPは地球上で人間が目に見える全ての物体に対してIPアドレスを割り振っても十分な数であると聞いた事があり、その時のインパクトが大きくて未だにその話は覚えております。
&lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/ipv6/earth.gif&quot; alt=&quot;地球上で1cm四方で割り振れるIPv6のアドレスの数&quot; class=&quot;img-left&quot; /&gt;
&lt;b&gt;実際IPv6は、地球の表面積1cm&lt;sup&gt;2&lt;/sup&gt;当たり約6670京個のIPアドレスを割当てることができます。&lt;/b&gt;&lt;br /&gt;
※京（けい）は兆の次の位
&lt;br /&gt;
つまり地球上の目に見える全ての物体に対してIPが割り振れるというのは本当で、
いやそんなもんではく地球上の全てのチリやホコリにＩＰを振っても十分だということです。
&lt;/p&gt;

&lt;h4&gt;なぜIPv4の次がIPv6なのか&lt;/h4&gt;
&lt;p&gt;
よく疑問に思うこととして、IPv4の次がv6で一体&quot;v5&quot;はどこへ行ってしまったのかという事です。実はIPv5もちゃんと存在しています。&lt;br /&gt;
IPは実験的に開発されたプロトコルでも、そのバージョンが割り当てられます。
つまり、IPv5は実験的なプロトコルで実用化されずに終わってしまったプロトコルということです。
具体的にはIPv5はST-II（stream protocol-II）という音声や動画を電送するためのプロトコルのようです。
&lt;/p&gt;

&lt;h4&gt;IPv6はいつごろ生まれたのか&lt;/h4&gt;
&lt;p&gt;
IPv6の原案が固まったのは1995年末、その後実用化に向けて動きが本格化したのは1998年ですので、その頃から既に10年以上前経過していることになります。&lt;br /&gt;
ちなみにIPv4は考案されたのが1970年代ですので、既に30年以上経っても現役バリバリの恐ろしい技術です。&lt;br /&gt;
※TCP/IPというプロトコルはもはや芸術と言っていいほど素晴らしいプロトコルであり、個人的に感動した仕組みがいくつかあるのでそれは別の機会でご紹介したいと思います。
&lt;/p&gt;

&lt;h4&gt;現在の最新バージョンは&lt;/h4&gt;
&lt;p&gt;
IPは実験的に開発されたプロトコルでも、そのバージョンが割り当てられると先ほど言いましたが、
実はv7、v8、v9も同じように割り当て済みです。
つまり、IPv6の後継バージョンはIPv10以降になる見込みとなります。
&lt;/p&gt;

&lt;h4&gt;十分なIPアドレスの数は時代によって変わる&lt;/h4&gt;
&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/ipv6/space.jpg&quot; class=&quot;img-right&quot; alt=&quot;宇宙に飛び出した人類に必要なIPアドレスの数は想像を絶する&quot; /&gt;
IPアドレスの数は、IPv4が生まれた当時の状況では40億個で十分と考えられていただけに、
それを踏まえると340澗（かん）個という数が将来ずっと十分であるかは分かりません。
少なくともIPv6が現役の間はこの数で十分でしょうが、その先の未来では十分なＩＰアドレスの数は時代によって変わってくるのは当然です。
&lt;/p&gt;
&lt;p&gt;
今の私たちの感覚ではIPv6のIPアドレスは無限に近い数です。上記では地球の表面積を例に表現しましたが、
現代のインターネットを中心とした科学技術のレベルでは地球を舞台にするのが適切だからです。
&lt;/p&gt;
&lt;p&gt;
しかし人類の科学技術がずっと発達した未来、例えば医療のナノテクノロジーが更に進み、また宇宙開拓時代に突入している時代には必要なＩＰアドレスの数は想像を絶します。
&lt;/p&gt;
&lt;p&gt;
このような考えは、1994年エープリルフール発行のRFC1606で取り上げられています。&lt;br /&gt;
※RFC1606ではIPv6ではなくIPv9に関しての話ということになっています。
&lt;/p&gt;
&lt;p&gt;
RFC1606 「IPバージョン9の利用の歴史的概観」 ： &lt;a href=&quot;http://www.ietf.org/rfc/rfc1606.txt&quot; target=&quot;_blank&quot;&gt;原文&lt;/a&gt;
　&lt;a href=&quot;http://www8.ocn.ne.jp/~yama-b/rfc1606j.txt&quot; target=&quot;_blank&quot;&gt;日本語訳&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
エープリルフール等に発行されるRFCはジョークRFCと呼ばれ、他にも沢山あり結構内容が面白いので、また別の機会にでも取り上げたいと思います。
&lt;/p&gt;

          &lt;p&gt;&lt;br /&gt;株式会社プロフェッサＩＴソリューション部&lt;br /&gt;&lt;a href=&quot;http://isol.pro-s.co.jp&quot;&gt;http://isol.pro-s.co.jp&lt;/a&gt;&lt;/p&gt;
          </description>
          <pubDate>Sun, 07 Dec 2008 01:07:13 GMT</pubDate>
          <guid>http://isol.pro-s.co.jp//news/2008/12/07/ipv6/</guid>
          <link>http://isol.pro-s.co.jp//news/2008/12/07/ipv6/</link>
        </item>
    
        <item>
          <title>MXレコードとスパムメール２</title>
          <description>&lt;p&gt;
2008年12月3日に公開した&lt;a href=&quot;/news/2008/12/03/mx-spam1/&quot;&gt;MXレコードとスパムメール１&lt;/a&gt;という記事の続きになります。&lt;br /&gt;
&lt;/p&gt;

&lt;h4&gt;実際にスパムメールの件数を調査した結果&lt;/h4&gt;
&lt;p&gt;
実際、MXレコードにて最も優先度の低いサーバにどのくらいスパムメールがダイレクトに届いているのか確認してみました。
&lt;/p&gt;
&lt;p&gt;
ちなみに、確認を試みたメールサーバ環境は以下のような構成でした。
&lt;/p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/mxspam2/mailserver1.png&quot; alt=&quot;調査対象のメールサーバ構成&quot; /&gt;
&lt;table width=&quot;570&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot;&gt;
  &lt;tr&gt; 
  &lt;td bgcolor=&quot;#000000&quot;&gt;
  &lt;font color=&quot;#ffffff&quot;&gt;
  MX preference = 10, mail exchanger = mail1.example.jp ・・・優先度「高」のメールサーバ&lt;br /&gt;
  MX preference = 20, mail exchanger = mail2.example.jp ・・・優先度「中」のメールサーバ&lt;br /&gt;
  MX preference = 30, mail exchanger = mail3.example.jp ・・・優先度「低」のメールサーバ
  &lt;/font&gt;
  &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/mxspam2/benzu.png&quot; alt=&quot;優先度最低のメールサーバに届くスパムメールの割合&quot; class=&quot;img-left&quot;/&gt;
３日間調査を行ったのですが、上図の通り３台メールサーバが存在する環境にて、１つの公開メールアドレス宛に届いた「スパムメール」の件数と、そのスパムメールのうち最も優先度の低いメールサーバ（上図で緑の丸がついたサーバ）にダイレクトに届いたメールの件数は左図の通りでした。
&lt;/p&gt;
&lt;p&gt;
左図の通り、スパムメールのうち約30%が直接優先度が最も低いメールサーバにダイレクトに届いていたことが分かりました。
もはやスパムメールを送信するサーバは、優先度（preference）は見ていないと思ったほうがよいでしょう。
&lt;/p&gt;
&lt;h4&gt;更にMXレコードに最も優先度の低いメールサーバを追加した結果&lt;/h4&gt;
&lt;p&gt;
実際に業務で使用しているメールサーバなので、現状のメール送受信業務に影響を与えないように下図のように、更に優先度が低いMXレコードを追加しました（追加したMXレコードのメールサーバは、下図の優先度「中高」と同じものとしました。）。
&lt;/p&gt;
&lt;p&gt;
これも同様に３日間調査を行い、公開メールアドレス宛に届いた「スパムメール」の件数と、先の調査と同じメールサーバ（下図の緑の丸がついたサーバ）にダイレクトに届いたスパムメールの件数をカウントしました。&lt;br /&gt;
※無論MXレコードを追加した後に、設定したDNS情報が世界に浸透するまでしばらく期間を置いてから調査しました。
&lt;/p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/mxspam2/mailserver2.png&quot; alt=&quot;更にMXレコードを追加したメールサーバ構成&quot; /&gt;
&lt;table width=&quot;570&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;10&quot;&gt;
  &lt;tr&gt; 
  &lt;td bgcolor=&quot;#000000&quot;&gt;
  &lt;font color=&quot;#ffffff&quot;&gt;
  MX preference = 10, mail exchanger = mail1.example.jp ・・・優先度「高」のメールサーバ&lt;br /&gt;
  MX preference = 20, mail exchanger = mail2.example.jp ・・・優先度「中高」のメールサーバ&lt;br /&gt;
  MX preference = 30, mail exchanger = mail3.example.jp ・・・優先度「中低」のメールサーバ&lt;br /&gt;
  &lt;font color=&quot;#ffaaaa&quot;&gt;MX preference = 40, mail exchanger = mail2.example.jp ・・・preference=20と同じサーバを追加&lt;/font&gt;
  &lt;/font&gt;
  &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;img src=&quot;http://isol.pro-s.co.jp/images/news/mxspam2/benzu2.png&quot; alt=&quot;緑の丸がついたメールサーバに届くスパムメールの割合&quot; class=&quot;img-left&quot;/&gt;
結果は左図の通り、約30%から約13%に減少しました。
&lt;/p&gt;
&lt;p&gt;
以上の結果から、MXレコード追加型のスパムフィルタサーバを導入したら、優先度が最も高いMXレコードにだけではなく
最も低いMXレコードにも設定しておくことが非常に有効であると考えられます。
&lt;/p&gt;
&lt;p&gt;
しかし、完全にスパムメールの裏をかくことは出来ないようです。
恐らくですが、例えば３つ以上の優先度の異なるMXレコードが存在したら中間のメールサーバを狙うとか、MXレコードに登録されているメールサーバをランダムに選んで送信するとか、最近のスパムメール業者は色々な手を打っていると思います。
&lt;/p&gt;
&lt;h4&gt;MXレコード追加型のスパムフィルタを導入したらこの設定をしないと損&lt;/h4&gt;
&lt;p&gt;
というわけでMXレコード追加型のスパムフィルタを導入したら、上記のような設定をしないと損だということです。
100%の効果はありませんが、なんといってもノーコスト＆ノーリスクハイリターンです。&lt;br /&gt;
もちろん弊社のメールサーバでもこの設定は取り入れています。
&lt;/p&gt;
          &lt;p&gt;&lt;br /&gt;株式会社プロフェッサＩＴソリューション部&lt;br /&gt;&lt;a href=&quot;http://isol.pro-s.co.jp&quot;&gt;http://isol.pro-s.co.jp&lt;/a&gt;&lt;/p&gt;
          </description>
          <pubDate>Fri, 05 Dec 2008 07:14:18 GMT</pubDate>
          <guid>http://isol.pro-s.co.jp//news/2008/12/05/mx-spam2/</guid>
          <link>http://isol.pro-s.co.jp//news/2008/12/05/mx-spam2/</link>
        </item>
    
    
  </channel>
</rss>


