スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Hotmail [送信済み] フォルダにコピーを保存

Hotmailを使っていて一番不便なのがこれ。
メールの送信時に「[送信済み] フォルダにコピーを保存 」にチェックを入れないと、送信履歴が残らない。いちいちチェックしないといけないし、急いでうっかりして入れ忘れると、もはや自分が何を送ったかわからない。

数年前から、Hotmailへの質問等に便乗して何度も、デフォルトでチェックをオンにしてくれとか、オプションでデフォルトでどっちにするのか設定できるようにしてほしいと依頼してきたが、ことごとく無視された。

いろんな機能を増やすとか、Windows Liveよりもこれを何とかしてほしい。

そうしている理由がなんと、容量の問題だそうだが、私はPlusでお金払っているわけで、そもそもフリーのGバイトメールがある昨今、送信ボックスを制限する意味がわからない。迷惑メールや企業メール等、通常は受信の方が多い。迷惑メールに対してはいろいろ対策を打つのに、どうして高々デフォルトでチェックを入れるということができないのか。

送信済みメールの保存が不要なのは、大量にメールを送るスパム業者ぐらいじゃないのか、と思ってしまう。まあ、スパム業者は、面倒なWebメールは使わないが。

ほかにも同じことを思っている人はいるのだろうかと思い、Googleで検索してみたが、結構いる。

それに対して案の定というか、「毎回チェックを入れろ。いやならYahooメールを使え」というコメントが書かれる。無料ならともかく、あるいは無料であっても、使いにくければ要望するのは当然だ。しかしMSのスタンスなのか、「俺のことがいやなら他行け」という幼稚で高飛車な姿勢は何とかならんものかと思う。

スポンサーサイト

Windows Live

何をどう使えばいいのやら。

Windows Liveをお試しくださいとのメールが来たので、リンクをたどっていったのだがどこを間違えたのか。前にも登録して使えなかったので、今度は使えるかと思ったのだが。



右上にサインアウトとあって、右に「このベータの利用停止」のリンクがあるので、サインインしているのは間違いないのだが、真ん中にあるのは自分のメールボックスではなくダミーの画像。

今使えないなら使えないと書いてくれればいいのに。

今年は厄年か

今年のカレンダを見て欝になった。
祝日が土曜日というのが今年は多すぎる。
前後10年調べても一番多い。

どれだけ損しているか、スクリプトを作ってみた。通常の祝日に加え、12/31-1/3は祝日扱いにした。この辺は人によって違ってくると思うので適宜調整が必要。

saturday.rb で保存して、ruby -Ks saturday.rb <年>で実行


require 'date'

year = Integer(ARGV[0])
if year < 1980 || year > 2099 then
  print "warning: the result may not be correct\n"
end

shubun = "3/" + String(Integer(20.8431+0.242194*(year-1980)-(year-1980)/4))
shunbun = "9/" + String(Integer(23.2488+0.242194*(year-1980)-(year-1980)/4))

#Holidays List
holidays = ["1/1","1/2","1/3","1/15","2/11",shubun,"4/29","5/3","5/4","5/5","7/20","9/15",shunbun,"10/10","11/3","11/23","12/23","12/31"]

#remove happy monday
if year >= 2000 then
  holidays.delete("1/15");
  holidays.delete("10/10");
end

if year >= 2003 then
  holidays.delete("7/20");
  holidays.delete("9/15");
end

#p holidays

#successive holidays (翌日が祝日あるいは代休なしの休日)
sucHolidays = ["1/1","1/2","1/3","5/3","5/4","12/31"]

count = 0

puts "土曜日が祝日になる日付"
holidays.each {|holiday|
  str = String(year) + "/" + holiday
  target = Date.parse(str)
  if target.cwday == 6 then
    puts "  " + str
    count += 1
  end
}

puts "日曜日が祝日で振替休日がない日付"
sucHolidays.each {|holiday|
  str = String(year) + "/" + holiday
  target = Date.parse(str)
  if target.cwday == 7 then
    puts "  " + str
    count += 1
  end
}

puts "自由時間の損失・計: " + String(count) + "日"


まあ、もっとポジティブに考えて3連休になる日を出すようにするのもいいかな。

でも、rubyってそんなに使いやすいと思わないな。++でインクリメントができなかったり、型宣言がないというものの、使うときは厳しく、Stringとintを+で連結できないとか。javaでもできるのに。

cf. 休日について
http://www5a.biglobe.ne.jp/~accent/kazeno/calendar/
http://allabout.co.jp/travel/airticket/closeup/CU20051205A/?FM=rss


ボランティアとビジネス --日本ユニセフ協会の謎

日本ユニセフ協会の謎

ぽち氏のリンクにあってちょっと気になった。
自分自身ユニセフにはよく募金している。なので、こういう記事があると気になる。少し前に話題になった、黄緑のジャンパーを着た謎の募金集団とか、あるいは救援地で募金が横流しにされているとか。ホワイトバンドの悪評も言うに及ばない。
イラク戦争のとき、イラク人がインタビューに答えて、救援物資をフセインの長男が横取りしていたとかいうのを聞いて気になって問い合わせたりもした。

黒柳女史の口座は直接の経費がないと聞くと魅力ある。しかし、税金の控除のことを考えるとそうもいかない。

そもそも論として、わたしはボランティアにもある程度のビジネスセンスは必要だと思う。金を扱う以上、いい加減なことでは出来ない。効率よく集金して効率よく使う必要がある。理想はよくても金をうまく回せなければ頓挫する。

ボランティアはビジネスとは無関係だと多くの人は言う。しかし世の中、金がなければ何も出来ないのである。そこで人が動く以上はどうしても経費がかかる。ボランティアをやっているから電車賃ただにしてくれと言ってもJRは受け入れまい。
スタッフがすべてボランティアであればいいが、それでも経費はかかるし、スタッフすべてがお金持ちでない限りそれは難しいだろう。そのスタッフにも生活があるし、家族もいるかもしれない。

また、もしある有能な人がいて、その人が活動すれば、多額の募金が集まるとしたら、ある程度はその報酬は受けてもいいかもしれない。ただやはり一般的な感覚からいって、善意と金儲けは両立しがたいだろう。

問題は経費の中身だろう。それを詳細にわたって開示する必要があると思う。
東京のど真ん中に事務所を構えることで募金額がその分増えるのならともかく、そうでなければ全く無駄だ。批判されても仕方がない。

アクセス数の増加

今日のアクセス数を見ると、一瞬目を疑った。桁がひとつ多い。
Exciteのバグか、と思っていたが順次増加しているところを見るとそうでもない。
リファラーは見れないので、どこからかというのはわからない。

pochiさん効果かな。
どなたか知ってますか?

Rubyほかスクリプト言語について -- ファイル移動のプログラム

ディフェンシブな開発 ~ SIビジネスの致命的欠陥

先日、Rubyについての記事を読むまで正直Rubyについてよくわかっていなかった。スクリプト言語ということで相手にしていなかった部分もある。しかし、最近何かに付けて話題が出てくるのと、国産だが世界に広がっている点、Martin Fowlerが取り上げている点などから自分も注目してみようかと思っている。

スクリプト言語は手軽にプログラムを作るには便利だ。
ちょっと最近、というか今までも時々だが、ファイル移動のスクリプトを作りたいと思っていた。目的は、単純にサブディレクトリ配下のファイルを上のディレクトリに移動してくる、というだけのものだ。ただし、名前のバッティングを避けるために、単純にファイルを移動するのではなく、「ディレクトリ名_ファイル名」とリネームして移動する。たとえば、

(カレントディレクトリ)
  サブディレクトリ1
   ファイル1
   ファイル2
  サブディレクトリ2
   ファイル1
   ファイル2

これを
(カレントディレクトリ)
  サブディレクトリ1_ファイル1
  サブディレクトリ1_ファイル2
  サブディレクトリ1_ファイル1
  サブディレクトリ1_ファイル2

というようにする。簡単に出来そうだが、DOSプロンプトでXCOPYなどを使ったのではできない。今までこういうとき、ファイルリストをファイルに出力して、エディタで編集して、ren xx yyという非常に原始的なやり方をやっていた。そうしょっちゅうあることではないので、一時的にはこれで十分だが、やはりこの辺のスクリプトはさっと作れるようになっておいたほうがいい、と思い、作ってみた。

まずWSHとして、VBScriptを使って作ってみた。たとえば、c:\hoge\movesub.vbsで保存。

対象のなるディレクトリでDOS窓を開いて、
CSCript c:\hoge\movesub.vbs で実行


Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 
Set wshShell = CreateObject("WScript.Shell")
Set curDir = FSO.GetFolder(wshShell.CurrentDirectory)

For Each srcDir In curDir.SubFolders
    For Each tgtFile In srcDir.Files
        WScript.Echo srcDir.Name & "_" & tgtFile.Name
        tgtFile.Move srcDir.Name & "_" & tgtFile.Name
    Next
Next

続いて、DOSコマンドで実行。確かXPだったからか拡張されている。for /?でヘルプを見ながら作成。結局これが一番シンプルだった。


for /D %x in (*.*) do for /F "delims==" %y in ('dir /B %x') do move "%x\%y" "%x_%y"

Perl版。perl c:\hoge\movesub.plで実行。もっと洗練された書き方ができるかも。


use File::Copy;

opendir(curDir, ".");
@dir = readdir(curDir);
closedir(curDir);

foreach (@dir) {
  if (-d $_ && $_ ne "." && $_ ne "..") {
    $x=$_;
    opendir(srcDir, $x);
    @tgtFiles = readdir(srcDir);
    closedir(srcDir);
    foreach (@tgtFiles) {
      if ($_ ne "." && $_ ne "..") {
        $tgtFile = $x."\\"."$_";
        $dstFile = $x."_"."$_";
       move $tgtFile, $dstFile or die $!;
      }
    }
  }
}

同じくPHP版。php c:\hoge\movesub.phpで実行。


<?php
  if ($handle = opendir(".")) {
    while (false !== $srcDir = readdir($handle)) { 
      if($srcDir != "." && $srcDir != "..") { 
        if(is_dir($srcDir)) {
          if ($handle2 = opendir($srcDir)) {
            while (false !== $tgtFile = readdir($handle2)) { 
              if($tgtFile != "." && $tgtFile != "..") { 
                if(!is_dir($tgtFile)) {
                  rename($srcDir."\\".$tgtFile, $srcDir."_".$tgtFile);
                }
              }
            }
            closedir($handle2); 
          }
        }
      }
    } 
    closedir($handle); 
  }
?>

Java版。コンパイルしてから、java -cp c:\hoge MoveSub で実行。


import java.io.*;

public class MoveSub {
  public static void main(String[] args) throws Exception {
    File curDir = new File(".");
    File[] srcDirs = curDir.listFiles();
    for (int i=0; i<srcDirs.length; i++) {
      if (srcDirs[i].isDirectory()) {
        File[] tgtFiles = srcDirs[i].listFiles();
        for (int j=0; j<tgtFiles.length; j++) {
          File dstFile = new File(srcDirs[i].getName() + "_" + tgtFiles[j].getName());
          tgtFiles[j].renameTo(dstFile);
        }
      }
    }
  }
}

慣れているせいか、Javaが一番作るのが早かった。

そしてRuby。いろいろなやり方があったようにみえたが、やりやすそうなのを選択。
ruby c:\hoge\movesub.rbで実行


require 'find'
require 'fileutils'

Find.find('.') {|tgtFile|
  if File.file? tgtFile
    if tgtFile =~ /\.\/.*\/.*/
      dstFile = tgtFile.gsub(/\.\//,"")
      dstFile = dstFile.gsub(/\//,"_")
      FileUtils.mv(tgtFile, dstFile);
    end
  end
}

exit


こうしてみると、それぞれの違いを検討できる。Rubyだけほかのに比べて、置換を行っている分若干ロジックが違うのだが。
Javaはコンパイルが入ったのだが、慣れている分一番早かった。だがこの程度のことでわざわざJavaを使うというのも気が引ける。

この手のプログラム、まあプログラムというほどのものではないが、のレベルだと、DOSプロンプトの拡張だけで十分できてしまう。Unix上だとシェルスクリプトを覚えておけば大体のことは出来るが、Windows上で手軽にできる技術は持っておいたほうがいい。そういえば、cygwin版をやっていなかったな。

何に精通すべきか。

GETで日本語文字化け -- TomcatのsetCharacterEncoding()

ちょっとしたToDo ListのWebアプリケーションを作ってみた。
簡単に作った後、いろいろと自分で自分に要望を出し作り変えた。
javascriptでテキストボックスの中身を変えたら、サーバーにリクエストを送るようにしたのだが、日本語が入っていると文字化けしてしまう。すぐにエンコードされていないことに気づき、修正したもののうまくいかない。escapeに変えたりとか、サーバー側で、request.setCharacterEncoding()の文字コードを変えたりとかいろいろしたが、駄目。Webで調べても答えが出てこない。
最初、

<input type=text name="category" value="<%= category %>" onchange="location.href='list.jsp?category='+encodeURI(f.category.value)">

としていたが、うまくいかないので、POSTで送ることにした。

<input type=text name="category" value="<%= category %>" onchange="f.submit();">

こうすると、うまくいった。この場合、スニファーすると、Shift_JISで送られていることがわかる。ページのcharsetにあわせているのだろう。一方、encodeURIでは、UTF-8に変換される。
なので、request.setCharacterEncoding("UTF-8")で正しくなるはずなのだがうまくいかない。

調べているうちに、
http://blog.goo.ne.jp/evergreen_1978/e/92e7fb8581476c321407be31bd15ff43

なんと、Tomcat5.0からGetの処理の場合、デフォルトの動作でsetCharacterEncodingが無効になっていました。


とのこと。そんなことか。この問題で、1時間以上無駄にした。

毎日新聞に1億ドルの損害賠償

http://www.asahi.com/business/reuters/RTR200601200010.html

向こうで訴えられると恐いですな。額が日本と桁違い。名誉毀損で110億円の賠償請求なんて日本であったかな。
毎日側がちゃんと優秀な弁護士を用意しないと、そのまま判決が出ちゃうのかな。


あきれる消費者「安全信じられぬ」 米産牛肉に危険部位

http://www.asahi.com/life/update/0120/006.html

さすがはアメリカ。
品質管理が日本と違いすぎる。
向こうの感覚では、このぐらいのことどってことないのだろう。
ソフトウエアも同じ(涙)

サーバーからクライアントへのpush

最近はAjaxのことがしばしば話題に上がる。
リッチクライアントの実現に、既存の技術であるjavascriptを用いる。
GoogleMapで火がついた感じがする。なので、これまた追いかけなければならない流行の技術ということになる。

ポイントは、
・連続した動作(サーバーにリクエストを送っては待ってではなく、通常のアプリを操作している感じに)
・リアルタイムの更新
・より洗練されたGUI

特に注目を置いているのは、サーバーからクライアントに情報をプッシュすること。通常、HTTPではプル型、クライアントからのリクエストによってサーバーが応答する形式なので、クライアントがリクエストをあげない限り、サーバーから通知する仕組みはない。

http://ajaxpatterns.org/HTTP_Streaming

このページを見て、以下のサンプルを作ってみた。

<?
 while (true) {
?>
  <script type="text/javascript">
   news.innerHTML = '<?= time() ?>';
  </script>
<?
  flush(); 
  sleep(10);
 }
?>

これはもっともシンプルな例で、単純に、時刻を表示しているだけなので、クライアントサイドでもできることだが、これはサーバーサイドで実現している。これをニュースとかにすれば、リアルタイムで表示され、利点は大きい。

ところが、30秒たつと、

Fatal error: Maximum execution time of 30 seconds exceeded in xxx

というエラーが出てしまう。ブラウザ側でタイムアウトしてしまうので、定期的にブラウザ側からリロードする仕組みが必要だろう。

http://ajaxify.com/run/streaming/
ここにあった似たようなデモもあまり長い間やっていない。

先のAjaxすのサイトにあるデモをたどってみた。

JotSpot Live
Online Demo

期待して行ったのだが、スニファーすると、PULL型に過ぎなかった。残念。
いいデモと簡単な仕組みの解説はどこかにないだろうか?

やっぱりきちんと勉強しなきゃだめかな。


ディフェンシブな開発 ~ SIビジネスの致命的欠陥


http://d.hatena.ne.jp/kuranuki/20060116/p1

SIerのビジネスモデル(受託開発)がディフェンシブ(防御的)な開発しか許さない


と述べられているが、日本ではアジャイルの実績は少なく、それこそ、XPやアジャイルに対して、ディフェンシブだということができるのではないか、と思う。

大規模ではやはり、実績のある安全なやり方でと考えるのだと思う。アジャイルやXPが軽率な印象を受けるのだと思う。

その点、小規模でPHPなんかで開発している案件は、アジャイルとかいう言葉は使わないが、比較的アジャイルっぽい。客と直でやり取りして、大したドキュメントも作らず、要求に応じてちょいちょいと直してしまう。

大規模だと些細な修正も、わずらわしい限りだが、多くのプロセスを通過しないといけない。

ただ筆者の言っている、なぜRubyでなく、Javaなのかというのについては賛成しかねる。Javaに慣れて、十分ライブラリーの使い方に精通している場合、Javaで生産性が悪いとは思わない。

むしろ、WebやGUIアプリで、.NETの方が、Javaよりも10倍生産性が高いとの風説の流布が気になる。

こういった生産性の比較について、今後掘り下げていきたいと思う。どこかにすでに比較をしたようなサイトや資料はないだろうか?

Windows データの暗号化で気を付けること

昨今、セキュリティについてうるさくなったので、少しでも盗難に遭ったときの被害を食い止めようと思い、ノートパソコンのデータは暗号化することにした。その手の有料の製品も出ているが、とりあえずWindowsOS付属のものでも用は足りるだろうと思う。

それから、会社から支給されているものなので、Administratorのパスワードはわからない。もし簡単なものだったらと思い、自分で作成したデータはすべて自分にしか権限を与えない。また個人情報保護法の対象となるような情報は一切ノートに入れない。ってなことを徹底している。

ただ失敗したのは、既存のデータを暗号化するときだ。
ファイルあるいはフォルダを右クリックし、プロパティ-詳細設定-「内容を暗号化してデータをセキュリティで保護する」にチェックを入れると、そのファイルあるいはそのフォルダにあるファイルを一括して暗号化できるのだが、なんと更新日付が現在日付に変わってしまう。チェックをはずして元に戻っても同じ。階層が深いとかなり時間がかかるのだが、全部現在日時に変わってしまっている。

ところが、暗号化しているフォルダに外から移動してくる場合は問題ない。だから、最初に暗号化フォルダを作ってから、移動するべきだったのだ。

ところで、これさらに問題があった。ApacheのDocumentRootも暗号化していたのだが、読み込めなくなってしまうのだ。
phpではこんなエラーが出る。

「Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0」

最初それがわからなくて、アクセス権限をEveryoneにしたりしたがそれでもだめだった。暗号化を外すとアクセスできた。

ほりえもん想定外

今日はいろんなニュースで目白押しだ。
小嶋社長の証人喚問、宮崎勤最高裁判決、そしてライブドア強制捜査一夜明けてのこと。

個人的に、ホリエモンのことをそれほど好きというわけではなかったが、金儲けのうまさという点で敬意を持っていたのは確かだ。だから今回の出来事はちょっとかわいそうに思えた。若い世代にとっても、目標とする象徴的な存在だっただけに、ショックは大きいだろう。

なんといっても、株ブームに乗ってライブドアの株を買った人のショックは大きすぎるだろう。少し前に読んだ株ブームについての記事で、多くの人が最初に買った株がライブドアで、フジテレビとの争奪戦を繰り広げた頃に比べると跳ね上がったので、儲けたと思った人が多かったようだったが。

少し前に、IT企業は地盤が不安定だからちょっとしたことで落ち込むことはよくあることだとの記事を読んだのだが、まさにそのとおりのことが起きた。検察の手が入ったのは突然だったが、実際にはフジテレビとの争奪戦、あるいはプロ野球参入のときから目をつけていたのかもしれない。自民との関係も、検察には及ばないということだろうか。証人喚問の時期を引き延ばして、まるで質問に答えないでいる小嶋社長とは対照的だ。堀江の場合、政治家との関係が表に出てしまっているから、政治家からの働きかけはあまりできないんじゃないかと思ってしまう。

多分あれこれ穿り出され、まあ、裁判の結果自体は大したものにならないだろうが、社長のカリスマ、ブランドで売上を伸ばしてきた企業が今後どうなるのか、株式がどこまで下がるのか注目していきたい。

ネットワークビジネスと情報起業家

疎遠だった友人が連絡してくるとき、たいていネットワークの勧誘だ。
私は金持ちになりたいと思うが、ネットワークビジネスだけはするつもりがない。

しばしばネットワークにはまる人がいるが、わたしはこれは不健全なビジネスだと思う。
ビジネスは通常の場合、需要と供給がつりあったところで取引が成立し、売った側も買った側も満足する。買う側も支払っただけの価値を得ることになる。しかし売ったものに嘘が含まれていると、買った側は損を被ることになる。ネットワークにはその要素が多分にある。

ネットワークビジネスの基本は商品の紹介料が支払われるところにある。
紹介ビジネスは、広告宣伝料として紹介者に企業が支払うもので別段問題ない。
紹介された者がさらに他の人を紹介していく。そのツリーの上位の人に、孫さらにひ孫以下の分まで支払われるのも、これ自体、その人がいなかったら下に広がらなかったのだから、その分まで報酬があるというのも、問題ない。

しかし、商品を紹介するのではなく、この紹介ビジネス自体を紹介するとなると問題がおきてくる(先ほどそれ自体問題ないと言ったが、その構造自体が結局はネットワークビジネスを生み出す)。このビジネスに参加するのは、商品を買うためでもなければ、売るためでもない。主となる目的は、このビジネス自体を売ることである。つまり、モロにねずみ講の構図が露呈する。

まあ、別にここまで面倒くさい言い方をしなくてもいい。そのビジネスで流れているお金から商品代金・経費を差し引けば、ねずみ講ビジネスが露呈する、とだけで十分だ。

ただ商品代金の比重が大きく、紹介料が少ない場合、ネットワーク的ではなく、またそのビジネスにのめりこんでも十分な不労所得が得られるまでにはいかない。ここは程度の問題だ。

さてねずみ講の問題だが、これは簡単に論破できる。

1.ある時点のスナップショットを取れば、常にピラミッド構造の末端に近い人(大多数)は損をしている。

2.日本あるいは世界全体に広まったとしたら、もはや末端の人は勧誘する相手がいない。

3.閉じられた世界の中で、金が移動しているだけなので、つまり会員間でお金が移動しているだけなので、損をしている人間と得をしている人間と分かれることになる。
 Win-Winなどということは構造上ありえない。多くの人が数千万稼ぐということはありえないし、もしそうだとするとその分他の会員が損したということだ。


ネットワークで儲けませんか、と勧誘するとき、儲けるのは勧める側であり、カモられるのは勧められる側である。

MLMの副業を始めて、これだけ経済的に余裕が出てきたんだ、と話を聞くと、それにつられて「そうか、じゃあ自分も」と思うが、これで儲かるのは話をしてきた人。すでに経済的に余裕ができた上にさらにあなたというカモをゲットしたことになるのだ。場合によっては、その経済的に余裕が出てきたというのは全くの嘘であることもしばしばだ。

実に奇妙だ。
しばしば金儲け方法を教えることで金を儲けている人たちを見ると、何か矛盾を感じる。最近、よく見かける情報起業家についても、ネットワークとの類似点を見出すことができる。

「金儲け」というテーマを自身の金儲けの道具にしている人がしばしばいる。
ナポレオンヒルに始まり、ロバートキヨサキ、最近ではこの間メールが送られてきた平秀信など。
決して悪いとは言わない。しかししばし矛盾を感じる。

金を儲けたいという需要がある。だから供給がある。しかし、「あなたに金儲けさせます」と言っていて、一番金を儲けているのは売った当人で、買った人間の大半は金儲けすることなくカモられていく。この辺の構造は、ネットワークビジネスと共通するものがある。

招かざる客

sshを外にOPENにしたら、お客さんが来るわ、来るわ。
しつこいのは数時間にわたり辞書総攻撃といった感じ。root, admin, tomcat, apache, www, oracle, mysql, pgsql, postgre, backup、そしてdannyなどの人の名前。
中には、企業サイトもあった。ウィルスに感染しているのに気づかないのだろうか。

ここ数日間の訪問者は以下のとおり。大半は中国と韓国だが、日本からは1社、Takano Heart Works様からのありがたくない訪問があった。

211.21.59.105 tw
203.145.174.7 ind
163.32.102.140 tw
202.222.28.22 jp Takano Heart Works
222.73.4.119 cn
219.133.37.2 cn
213.195.169.146 NL
212.227.22.75 NL
221.10.254.7 cn
216.250.47.219 us
218.145.53.114 kr
58.151.22.145 kr
61.138.203.170 cn
24.160.26.32 us
60.4.136.12 cn
71.65.83.197 us
203.101.90.133 ind
24.152.183.143 us
61.189.192.156 kr

なお、IPアドレスから国は以下のサイトで調べた。
APNIC Whois Database
ARIN WHOIS Database

Please consider your environmental responsibility before printing this e-mail

仕事のメールの中で、署名のところに、

P Please consider your environmental responsibility before printing this e-mail

と書いて送ってきた人がいる。
私は、デジタル派で、紙が大嫌いなので、このメッセージには大賛成だ。紙はかさばる上に、検索効率も悪い。昔は、紙のほうが広げられて、画面より多くのスペースをとることができ、机の上において見ることができるので、紙の方が望ましいと思っていたが、最近はよほどのことがない限り、PCの方が使いやすい。今でも気分的にプリントアウトしてみることはあるが、やはり無駄だ。

会議でもできるだけ印刷したくない。無駄に大量に印刷されているのを見ると、資源を無駄に使っている気がして、環境破壊を推進しているようでいい気がしない。9割方は保存することなくすぐにシュレッダーボックスに移動される。皆がノートPCを持ってこれる会議だと、ペーパーレスにできるので楽だ。

というわけでこのメッセージは気に入った。もともとアメリカ政府がe-mailを送る際にそのメッセージを添付つけて、紙の消費量の減少を促そうとしたもののようだ。
http://technology.timesofmalta.com/article.php?id=2022

ところで、今までブラウザで表示できるマークを知らなかった。これらを活用すると、結構手軽にWebページに飾りをつけることができるかもと思った。
http://www.kanzaka.net/htmljava/webdings.html

J

html特殊文字の置換

このブログに入力するとき、ソースコードや設定などを入れるとうまく表示されない。
<pre>や<quote>タグを使うと表示がおかしくなるし、これらのタグでは<などの特殊文字は対象外。<listing>や<plaintext>はHTML4からサポート外となったし、実際使うと表示がおかしくなる。

どこかに自動的に置換してくれるサイトはないだろうかとちょっと検索したがすぐには出てこない。なので自作することにした。

http://hp.vector.co.jp/authors/VA020635/replace.html

単純にjavascriptを使っている。最初 & も置換対象にしようとしていたのだが、単純なロジックだと、これが複数あると最初に置換したものがもう一度置換されて正しく動作しない。なので仕様変更とした。たぶんこの手の置換ロジックは探せばすぐ見つかるだろうが。

とりあえず、このブログに入力する際にはこれで十分。

Tomcat SSL+Basic認証

簡単な認証を行うにはBasic認証が手軽。
しかし、Basic認証は平文で流れるので、SSLと共に使いたいところ。https://にして当人が気をつければいいのだが、強制するにはどうしたらいいか。

Apacheでは以下のようにするとSSLを強制できる。

<Directory /foo>
    AuthType Basic
    SSLRequireSSL
    AuthName "Only for hoge"
    AuthUserFile /etc/httpd/.htpasswd
    Require user hoge
</Directory>

ところがこれで、
JkMount /foo/* ajp13
とやってTomcatに連動させても、Apacheの設定よりも先に、Tomcatへ転送されてしまい、SSLとBasic認証の強制はさせることができない。Locationタグを使うと、最初からAuthenticationエラーとなってしまった。

なので、Tomcatの方で行う。Memoryデータベースを使う場合、server.xmlで,
"UserDatabase"のResourceとRealmのコメントを外し、tomcat-users.xmlでユーザ名とロールの設定をしておく。

そして、web.xmlに

<web-app>
 <security-constraint>
  <web-resource-collection>
   <web-resource-name>Authentication of BasicAuth</web-resource-name>
   <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
   <role-name>hoge</role-name>
  </auth-constraint>
  <user-data-constraint>
   <transport-guarantee>CONFIDENTIAL</transport-guarantee>
  </user-data-constraint>
 </security-constraint>

 <login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>UserDatabaseRealm</realm-name>
 </login-config>

 <security-role>
  <role-name>hoge</role-name>
 </security-role>
</web-app>

のように設定しておく。user-data-constraint/transport-guaranteeでCONFIDENTIALを指定しておくと、SSLにリダイレクトされる。ただ、問題なのはTOMCATのSSLにリダイレクトされ、ApacheのSSLにはリダイレクトしてくれない。

他の方法としては、filterを使って、http://でアクセスしていたら強制的にhttps://にリダイレクトさせるという方法があるだろう。


mixとの連携

mixiの設定をこのブログに連動するようにしたら、
今まで書いた日記がすべて表示されなくなってしまった。
マージして表示されるようになるといいんだけど。

業務アプリケーションにはオブジェクト指向は向かない

前に述べたオブジェクト指向論の続きである。

まず私はアンチ・オブジェクト指向論者でもなく、オブジェクト指向信者でもない。何でもかんでも、オブジェクト指向で組めば生産性が上がるという記述にしばしば疑問を覚えるだけである。

世の解説書で、オブジェクト指向を論じるとき、対比されるのは、手続き型あるいは構造化プログラミング、およびデータ中心思考(DOA)だ。この際、どのようなアプリケーションを念頭に置いているかで全く意味は変わってくると思うのだが、それを意識している本はほとんどない。

データ中心の業務アプリでは、オブジェクト指向を徹底させることは不可能だと思う。オブジェクト指向が有効なのは、制御系・処理系かスタンドアロンのアプリケーションである。

もしメモリ中心のエンティティでオブジェクト指向を行った場合、以下の問題がある。
・大量のデータに対応できない(メモリを逼迫する。ディスクに退避する場合ディスクアクセスが発生する)
・検索およびそのためのインデックスを都度組む必要
・リンク先のオブジェクトも都度生成(遅延ロードなどのメカニズムが必要)
・排他制御、トランザクションのメカニズムを組み込む必要
など、DBMSで実装されている機能をすべて実装する必要がある。

もし、
1. マルチアクセス
2. データ中心

のどちらかであるならオブジェクト指向は使えるが、両方を満たす場合純粋なのは不可能。ORマッピングツールを使って擬似的に行うことになるか、データ中心指向で行くしかない。

メーラーなどのアプリケーションもデータ中心だが、大きな違いはスタンドアロンでメールデータにアクセスするのはシングルユーザという点だ。この場合、排他制御やトランザクションは不要になる。

昔読んだ情報処理試験の解説書では、データ中心指向からオブジェクト指向が現れたとなっているがこれは全くのうそだ。構造化プログラミングから発展して最初のオブジェクト指向言語Simulaが誕生した。DOAとは何の関係もない。

業務アプリケーションとは、会社の業務である、受発注、会計、在庫管理、人事、顧客管理などのシステムのことで、データ自体が重要な意味を持っている。このようなアプリケーションの場合、DBが比類なく重要であり、DB設計を見れば、どんなアプリケーションなのかあらかた見当がつく。

このアプリケーションに、OOAを適用するのは問題があるのだ。
OOAのメリットは、カプセル化、すなわちデータと処理が一体になっているところにある。ところが業務アプリケーションが対象とするデータ、エンティティは情報としての意味があるだけで処理は必要ないここが多くの人が勘違いしている点だ。

例えば顧客を表すクラスとして、Personクラスがあったとしよう。Personクラスに必要な処理とは何だろうか。人だから、歩く、食べる、考える、仕事する、などのメソッドが実装できるだろうか。意味はない。多くのオブジェクト指向の教科書が出すたとえが役立たないのはこの点だ。

Person単体では意味の持たせようがない。属性に対するsetter, getterがあるというかもしれないが、それはPersonに実装する機能ではない。もちろんsetterやgetterで整形したりできるメリットはあるが、publicの単純な実装であるなら構造体となんら変わりない。せいぜい誕生日属性から年齢を割り出すメソッドを実装することができるかもしれない。まあ、それも誕生日クラスを作ってやればいい。

では次にオブジェクト指向が活用される例として、例えば、Stringクラスを見てみよう。これはメンバーに文字列を持ち、その文字列に対して、検索や部分的な取り出し、比較などのメソッドが実装されている。まさにこれは適切なオブジェクト指向の実装だ。
また例えば、Calendarクラスを見てみると、これはメンバーに指定した日時が格納され、それに対してさまざまな処理ができる。ところが、Personクラスでは、その名前から想像されるような機能は何一つない。ある本では、従業員クラスがあって、業務を遂行するというメソッドを例として書いていた。これは全くナンセンスだ。

お分かりのように、業務アプリケーションでは、そのエンティティクラスに機能を実装する意味はほとんどない。構造体を少し便利にすることが可能、というぐらいのものだ。

もしPersonクラスらしい意味を持たせることができるとなると、ゲームアプリのようにそのPersonをゲームの中に登場させることだろう。そうすれば「人」らしい機能を実装できる。社長起立!もこれなら意味を持つ。

業務アプリのデータはそれ自体は現実を反映しているが、オブジェクトというほどには昇格できない。このようなエンティティのクラス図の作成には、正規化されたE-R図とほぼ同様になり、DOAで用いられるデータモデル手法がそのまま適用できる。

Personオブジェクトが集合になったとき、検索や統計の処理が必要になるだろうし、またデータベースに保存する必要が出てきたときにも何らかの処理が必要になる。しかし、それは単体のオブジェクトの中に実装することは勧められない。例えば検索の場合、Personの集合に対して行う処理なので、Personクラスの中で実装するのは不適切であり混乱を招く。そういう実装も可能だが、クラスが、そのクラスのインスタンスの集合を管理するという形になってしまう。EJBのエンティティBeanは、その点論理的に問題がある。インスタンスが一レコードを表すと同時に、検索やDBへの変更・削除を実装することになってしまう。そして結局、DTOやValueObjectを導入するという奇妙な結果になる。

デザインパターンなどの実践でも、エンティティ中心のクラスと処理中心のクラスは分離される。そうなると、エンティティクラスはほとんどオブジェクト指向のメリットは生かせず、よって教科書に出てくる現実のもののたとえは完全に破綻する。エンティティクラスは単なるデータであり、生き物にはなり得ない。
エンティティに処理を加える必要はない。もちろんオブジェクト指向バリバリの処理系でもエンティティクラスは出てくるが、しかし処理系ではエンティティクラスが中心ではないので別段そこに処理が実装されていなくてもよい。UMLの教科書ではわざわざ処理を加えるが、上記の理由から不適切である。

メールやワープロソフトもデータを扱うが、業務アプリケーションのデータとは意味が違う。メールやワープロではどんな内容が入るかは意味がないが、業務アプリケーションでは意味を持ってくる。メールやワープロでは文字を可視化したり処理したりすることに意味があるが、業務アプリではそういうことは関心の中心ではない。

DOAの人にとってドメインはDBそのものであり、エンティティクラスは作るとしても補助的なキャッシュ的な役割でしかない。OOAの人にとってはエンティティクラスがドメインの中心であり、DBは永続ストアで陰に隠れている。

プロフィール

dayan

Author:dayan
小職は、SE(システムエンジニア)を専門としておりますが、技術的な情報を中心に、それ以外に経済関連の日記、たわいもない日記も載せていきます。
[公式HPもよろしく!]

天気予報

-天気予報コム- -FC2-
リンク
ブロとも申請フォーム

この人とブロともになる

カテゴリー
最近の記事
ブログ内検索
最近のコメント
最近のトラックバック
RSSフィード
月別アーカイブ


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。