ご注意ください

  • 当ブログのコメントやトラックバックに、アカウントハックサイトや、そのようなサイトへリダイレクト(転送)される可能性が高いサイトへのリンクが時々貼られているようです。
    そのようなサイトへのリンクが貼られたコメント・トラックバックは、見つけ次第削除・禁止ワード登録していますが、今後も危険なサイトへのリンクが貼られる可能性がありますので、安易にリンク先へ飛ばないよう充分ご注意ください。

オンラインゲーム関連

著作権表示

  • 当ブログに記載されている
    会社名・製品名・システム名などは、
    各社の登録商標、もしくは商標です。

    当ブログ上の文章・写真・画像の
    無断転載、無断転用、直リンクなどは
    行わないでください。

    (C) 1998-2016 Vertex.
    (C) 2002-2016 SQUARE ENIX CO., LTD.
    (C) CAPCOM CO., LTD. 2007, 2016

    All Rights Reserved.
無料ブログはココログ

トップページ | 2006年10月 »

[Tomcat] WebDAVを使う Part.2

昨日は断念したApache制御のWebDAVを試すべく、今一度立ち上がりました(笑)

昨日より突っ込んで情報を集めてみると、Apacheとの連携をさせている場合、Tomcat制御下に置くディレクトリを指定しているファイルがあるらしい。ディレクトリを指定しているとすれば・・・Apacheのconfフォルダに新規追加した workers2.properties というファイルだったはず!早速そのファイルを開いてみると、
# cat /usr/local/apache2/conf/workers2.properties
[channel.socket:localhost:8009]
[shm:]
disabled=1
[uri:/*]

ありました、urlという指定が、どうやらTomcat制御下に置かれるディレクトリを指定している様子。とりあえずマネージャー画面と、作成中のアプリだけがTomcatで動いてくれればいいので、以下のように設定してみました。
[channel.socket:localhost:8009]
[shm:]
disabled=1
[uri:/manager/*]
[uri:/APP_HOME1/*]
[uri:/APP_HOME2/*]

ApacheとTomcatを再起動してみると・・・マネージャー画面とアプリケーションは問題なくTomcatで動き、Tomcat経由のWebDAVは「アクセス権限がありません」ということで、動かなくなりました。どうやら、これでApache制御下のWebDAVが動くようになりそうです。

[Tomcat] WebDAVを使う

ファイルのやり取りをするために、TomcatサーバにWebDAVを入れることになりました。管理のしやすさから、Apacheから制御するWebDAVがいいのではないか、と言われたので、Apache制御でのWebDAV導入に挑戦してみました。

まずは、WebDAVを使うためにApacheをコンパイルし直します。
# ./configure --enable-suexec --with-suexec-caller=apache --with-suexec-docroot=/var/www --enable-ssl --enable-dav=yes --enable-dav-fs=yes
# make
# make install

そして、WebDAV用にディレクトリを作ります。
# mkdir /home/dav
# chown nobody.nobody /home/dav
# mkdir /usr/local/apache2/var/lock
# chown nobody.nobody /usr/local/apache2/var/lock

次に、httpd.confに設定を追記します。
Alias /dav "/home/dav"
<Location /dav>
  DAV on
</Location>
DAVLockDB /usr/local/apache2/var/lock

これでApacheを再起動すればOKらしいのですが・・・再起動してもつながりません。試しに、Webブラウザでアクセスしてみると、Tomcatのエラー画面が・・・!?

どうやら、Apache+Tomcatで動かしていると、Apache制御のWebDAVはうまく使えない様子(使う方法はあるかもしれませんが、そこまで調べていません(苦笑))。
しょうがないので、時間もないことですし、Tomcat制御でWebDAVを動かしてしまおうという話になり、さっそく情報収集。

・・・5分もしないうちに、こんな記事を発見。え・・・Tomcatにはもともとついてるの?(笑)
そう言えば、マネージャー画面でWebDAVって文字を見かけたような・・・。ということで、マネージャー画面を開いてみると、アプリケーションの一番下にありました、WebDAV。開いてみると、ディレクトリが見えます。早速ネットワークプレースに追加してみると、何の問題もなくつながりました。ポカーン(´Д`)

何か、とても無駄な時間を過ごしたような気がするのは気のせい、ということにしておいて、脱力感は200%突破です。でも、無事動いてよかった・・・のかな。

[PostgreSQL] テーブルの拡張

一般的に、DBのデータを他のマシンにコピーしたい場合は、dataディレクトリをまるごと持っていくか、pg_dumpを使うと思われる。しかし、DBのデータを他のマシンにコピーするときに、ついでにテーブルの拡張をしたいときは、どうすればいいだろう・・・。データの件数が少なければ、手作業で書き換えてもいいけれど、数千件もあるものを手作業で書き換えるのはちょっと考え物。

そんな作業をしなくてはいけなくなったので、ちょっと調べてみた。

やりたいこと
既存のDBにあるテーブルのいくつかに、カラムを追加する。
追加したカラムには、他のテーブルの値をセットする。
具体的には、tblAに新たにclmDを追加して、そのカラムの値には、tblBのclmCを入れたい。その際に、tblAのclmAと、tblBのclmBが同じものに限る。といった感じ。(なんか解り辛いかも・・・)


ただ単にカラムを追加するだけなら、エディタのマクロとかでも何とかなるけれど、他のテーブルからデータを引っ張ってくるなら、それは無理。そこで、こんな方法をとってみた。

既存DBからデータを取ってくるシェル
psql -U postgres OLD_DB -q -t -A -F ',' -c "SELECT DISTINCT grp.uid, grp.uname, grp.upass, usr.grpid FROM grp, usr WHERE grp.uid = usr.uid" > grp.db.out

psql -U postgres OLD_DB -q -t -A -F ',' -c "SELECT DISTINCT usr.uname, usr.uid, usr.grpid, usr.add, usr.tel FROM usr, grp" > usr.db.out


新規DBに書き込むシェル
psql -U postgres NEW_DB -c "copy grp from '/var/lib/pgsql/grp.db.out' using delimiters ',' with null as ''"

psql -U postgres NEW_DB -c "copy usr from '/var/lib/pgsql/usr.db.out' using delimiters ',' with null as ''"


さて、新しいアプリからDBにアクセスしてみると・・・ちゃんとカラムが追加されていて、データもちゃんと入っているみたい。あっさり終了しました(笑)
・・・このやり方で間違っていないよなぁ・・・データがちゃんと入ってるから、大丈夫なんだよなぁ・・・(←あっさり出来てしまって、かなり不安(笑))

[Red Hat Linux] ネットワークカードにハマる

仕事で使うために、RedHatのES4を使い古しのPCにインストールしたのはいいけど、ネットワークにつながらない。設定はちゃんとできているし、認識もしている。なのに、pingを投げると「Network is unreachable」というエラー。どうやらデフォルトゲートウェイが見つからない様子。でもIPは間違っていないぞ・・・。

もしかしたらネットワークカードが壊れているのかもしれない・・・と、別のカードを使ってみる。ギガビット対応の、比較的新しめのものなので、これならいけるだろう!ということで差し替え、Linux起動。kudzuがカードを認識し、IPを設定して起動完了。これでいけるだろうけど、一応確認・・・ifconfigの結果はOK。ちゃんと認識してるし、IPも当たってる。デフォルトゲートウェイも大丈夫だし、サブネットマスクも間違いない。さてping・・・Network is unreachable。なにぃぃぃ!

ちょっとコーヒーブレイクして、落ち着いて考えてみた。何かが間違えているのかもしれない。
・・・何気なく、最初にPCに刺さっていたネットワークカードを見てみる。カニさんマークのチップ。RealTekのチップだ。RTL8139Dか・・・前の会社で、よくこのチップを使ってハードを作ったっけ・・・。ん?カニ!?

気になって、新しくPCに刺したネットワークカードのチップを見てみると、RTL8169。カニだ・・・。相性問題が結構多いと言われるチップだから、もしかしたらこれが原因かもしれない!

そんなわけで、古いPCからやっとのこと、IBMのチップを使ったネットワークカードを見つけてきて差し替える。Linux起動、kudzuで設定完了。認識もされ、IPも大丈夫。さてping・・・

[root@localhost etc]# ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=0 ttl=128 time=0.237 ms
64 bytes from 192.168.0.1: icmp_seq=1 ttl=128 time=0.228 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=128 time=0.230 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=128 time=0.224 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=128 time=0.222 ms

キタワァァァァ(ノ∀`)

苦節4時間の末、やっとサーバマシンのベースができた・・・。

ということで、教訓。カニには十分注意しましょう!(笑)

[Fedora core] vsFTPdの設定

今まで RedHat Linux ES4 で動いていたシステムを、急遽 Fedora5 に移植することになりました。既存の Fedora5 システムを流用しての作業のため、ほぼゼロからの設定になりました。その際の作業手順ということで、特に苦戦したしたFTPdの設定。

まず、FTPdが入っていないので、インストールから。 yum を使ってインストールします。

# yum install vsftpd

画面の指示に従っていけば、そのままインストールが完了します。
次に、自動起動設定をします。

# chkconfig vsftpd on

これで、ランレベル2~5のときに自動起動するように設定ができました。確認は、

# chkconfig --list vsftpd

でOKです。

TCP_Wrapper の設定をします。

# vi /etc/hosts.allow
  vsftpd: 192.168.0.0/255.255.255.0  < 追加

# vi /etc/hosts.deny
  vsftpd: ALL  < 追加

全ての接続を拒否させて、192.168.0 のネットワークからの接続のみ許可します。
これで vsftpd を立ち上げれば接続できる!・・・はずが、できません・・・。FTPクライアントのログには、以下のようなエラーが・・・。

ホストに接続しています - 192.168.0.*** (192.168.0.***:21)
220 (vsFTPd 2.0.4)
>USER ******
331 Please specify the password.
>PASS ******
500 OOPS: cannot change directory:/home/******
500 OOPS: child died
< ホストから切断されました。 >
< エラー : コマンドを送信できませんでした。 (1013-0) >
< ホストにログインできませんでした。 >

どうやら、ユーザーディレクトリに入れない様子。権限を確認したら、所有者のみ全て許可になっています。念のため chmod で 777 にしてみましたが、状況は変わらず。

これはおかしい!何かが違う!ということで、さっそくグーグル様に頼ることに。いろいろ調べていると、こんな記事がありました。
FC5上のvsFTPD設定

どうやら、SELinux の仕業じゃないかとのこと。はて、SELinux ってナンダロウ?新しいディストリビューションの名前かと思ったら、どうやら Linux のファイルシステムを監視?しているセキュリティ関係らしいです。う~ん、ES4にはこんな機能なかったような・・・見落としてたのかな(汗)
どうせ社内の開発に使うだけのPCだし、そこまで強固なセキュリティはいらない、ということで、この SELinux を Permissive モードにしてみました。

# getenforce  < モードの確認
Enforcing

# setenforce 0  < Permissive モードに変更

Permissiveモードに変更して、FTPで接続を試みると・・・つながりました!どうやら SELinux が悪さをしていたようです。
(ちなみに、Enforcing モードに戻すには、setenforce 1 とすれば良いらしい)

今まで、RHLは6~9、ESは1~4、FCは1~2しか触っていなかったので、FC3から追加されたという、このSELinuxの存在は全く知りませんでした。全く、お恥ずかしい話です・・・。

[Java] マジックナンバー

Javaでプログラムを組んでいて、よくCheck Styleで警告を出されるマジックナンバー。アプリの実行などには特に影響がないので、今まで放置してきたのですが、なんとなく警告が残ってしまうのはイヤなので、調べてみました。

どうやら、プログラム中に突然出てくる整数をマジックナンバー(謎の数字?)と言うらしいです。例えば、以下のようなプログラム。
private boolean checkUserCount(int argUserCount) {
  boolean status = true;
  if (argUserCount >= 10) {
    this.setMessageOfError = "ユーザー数が最大です";
    status = false;
  }
  return status;
}

こんな処理があったとします。argUserCountが10以上だったらエラーとする処理ですが、この「10」というのがマジックナンバーというようです。

1回しか登場しない数字だったり、今後も一切変更なしの完全固定な数字だったりする場合は、よくこういう書き方をしてしまいますが、Check Style的にはあまりよろしくない様子。確かに、100%絶対変更がない数字だ、とは言い切れないですしね。

そんなわけで、定数に置き換えてあげることで警告は出なくなります。
private final int MAX_USER = 10;

private boolean checkUserCount(int argUserCount) {
  boolean status = true;
  if (argUserCount >= MAX_USER) {
    this.setMessageOfError = "ユーザー数が最大です";
    status = false;
  }
  return status;
}

たとえ1度しか登場しない数字でも、定数にすることで数字の意味がわかりますし、マジックナンバーを使わないということは、大事なことなんだなぁ、と再認識しました。
・・・でも、あまりよくないって解っていても、直接数字で書いちゃうことって結構あるんですよね(笑)

[JavaScript] 子ウィンドウを開く最大数を指定し、ウィンドウを使いまわす

ヘッダ内に以下を記述。もしくは外部ファイルで用意し、ヘッダ内で読み込む。
<SCRIPT LANGUAGE="JavaScript">
<!--
  // ------ ページロード時の初期処理
  function setValue(){
    maxWinNo = 5;
    winNo = 0;
    subWin = new Array();
  }

  // ------ サブウィンドウを開く処理
  function openWindow(){
    windowCount = 0;
    if( winNo > 0 ){
      for( i = 0; i < winNo; i++ ){
        if( ! subWin[i].closed ) windowCount++;
      }
    }

    if( windowCount == 0 || winNo >= maxWinNo ) winNo = 0;

    winWidth = screen.width / maxWinNo;
    winLeft = ( winWidth * ( winNo + 1 ) ) - winWidth;
    if( winLeft + winWidth > screen.width ){
      winLeft = screen.width - winWidth;
    }

    subWin[winNo] = window.open( "",
                                 "Child" + winNo,
                                 "width=" + winWidth +
                                 ", height=" + ( screen.height - 30 ) +
                                 ", left=" + winLeft +
                                 ", top=0, scrollbars=no" +
                                 ", location=no, alwaysRaised=yes" );
    var subWinHtml = "<HTML><HEAD><TITLE>Child</TITLE></HEAD>\n"
                   + "<BODY TEXT=White BGCOLOR=Black>\n"
                   + "<TABLE BORDER=0 WIDTH='100%' HEIGHT='100%'><TR>\n"
                   + "  <TD ALIGN=center VALIGN=middle>Child<BR><BR>\n"
                   + "    Window Width: " + winWidth + "<BR>\n"
                   + "    Window Left : " + winLeft  + "<BR>\n"
                   + "    Screen Width: " + screen.width + "\n"
                   + "  </TD></TR></TABLE>\n"
                   + "</BODY></HTML>\n"
    subWin[winNo].document.write( subWinHtml );
    subWin[winNo].document.close();
    subWin[winNo].focus();
    winNo++;
  }

  // ------ 親ウィンドウを閉じるときの後処理
  function closeWindow(){
    for( i = 0; i < winNo; i++ ){
      if( ! subWin[i].closed ) subWin[i].close();
    }
  }
//-->
</SCRIPT>

BODYタグに、ページを読み込んだときと、ページを閉じるときの処理を入れる。
<BODY onLoad="setValue()" onUnload="closeWindow()">

最後に、子ウィンドウを開くためのアクションを入れる。
<INPUT TYPE="button" NAME="btnWinOpen" VALUE="表示" onClick="openWindow()">

[HQL] DBのレコード数を取得

SQLでの「select count(*) from AAA」をHQLで行う方法は、
int count = ( (Integer) session.iterate( "select count(*) from AAA" ).next() ).intValue();

とすることで可能。

上記のコードを分割すると、
Iterator it = session.iterate("select count(*) from AAA");
Integer numberOfInstance = (Integer)it.next();
int count = numberOfInstance.intValue();

となる。

[SQL] 文字列比較 like文とワイルドカード指定

一般的に使われるワイルドカードは「*」と「?」だが、SQLで使われるワイルドカードは「%」と「_」になる。
「*」に相当する文字が「%」で、「?」に相当するのが「_」となるが、意味は一緒で、前者は「任意の長さ(ゼロ含む)の文字列」、後者は「任意の1文字」になる。

ワイルドカードを使うためには、where句の後にlikeを用いる。

例:「データベース」で始まる書籍を検索
db=# select * from 書籍在庫状況 where 書籍名 like 'データベース%'

例:「徹底解析」で終わる書籍を検索
db=# select * from 書籍在庫状況 where 書籍名 like '%徹底解析'

例:「携帯」という文字を含む書籍を検索
db=# select * from 書籍在庫状況 where 書籍名 like '%携帯%'

例:書籍名が6文字の書籍を検索
db=# select * from 書籍在庫状況 where 書籍名 like '______'


[Tomcat] Broken Pipeで致命的エラー

うーん、100%出力されるエラー、どうしていいかわからず・・・。

2006/09/15 15:31:47 org.apache.jk.server.JkCoyoteHandler action
致命的: Error in action code
java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
    at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:446)
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:654)
    at org.apache.jk.server.JkCoyoteHandler.action(JkCoyoteHandler.java:444)
    at org.apache.coyote.Response.action(Response.java:183)
    at org.apache.coyote.Response.finish(Response.java:305)
    at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:301)
    at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:372)
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:673)
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:607)
    at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:786)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:644)
    at java.lang.Thread.run(Thread.java:595)
2006/09/15 15:31:47 org.apache.jk.common.HandlerRequest invoke
情報: Unknown message 0

とある一覧表示のページに「詳細」ボタンを設け、その詳細ボタンが押されると、DBから詳細情報を読み出して別ウィンドウに表示する仕組みを作ったのですが・・・この別ウィンドウを閉じると、上記のような致命的エラーが出てしまう・・・。

ちょっとネットで調べてみると、IEに原因があるかもしれません、との情報が。試しにOperaで同じ操作をしてみると、Operaでは上記エラーが出ない。さらに謎だ~(;´Д`)

ひとまずこの件は保留にするので、忘れないようにメモメモφ(..)

[JavaScript] Enterキー無効化

忘れないように・・・。

<SCRIPT LANGUAGE=javascript>
    <!--
    document.onkeypress = enter;
    function enter(){
        if( window.event.keyCode == 13 ){
            return false;
        }
    }
    //-->
</SCRIPT>

この処理を思いつくのに数時間・・・ネットで検索すれば早かったかもなぁ・・・。

遠い宇宙まで想像旅行

すばる望遠鏡が、128億8000万光年先にある銀河系を発見したらしい。この銀河は観測史上最も遠い銀河で、宇宙誕生から約7億8000万年後に生まれた銀河とされる。

さて、128億8000万光年という数字を見て、仕事の息抜きにいろいろと計算をしてみました。この銀河まで行くとしたら、一体どれくらいかかるだろう、と。

光の速度は、毎秒約30万kmとされています。ということは、1光年は約9兆4608億km。この速さで128億8000万光年先ということは、kmに換算すると、なんと1218京5510兆4000億kmにもなります。全部数字で表すと、12,185,510,400,000,000,000km!おぉぉ、目がかすむような数字の羅列になってしまった(ノ∀`)
この距離を、徒歩、車、新幹線、ジェット機で進んだとして、かかる年数を割り出してみました。(こんなことしてる自分は、暇人ということなのか・・・(笑))

まずは徒歩で旅行してみましょう。徒歩の時速は約6kmとして、休憩なしで到着まで231兆8400億年。
次に車。ずっと高速道路がひいてあって、時速120kmで走り続けたとして11兆5920億年。
時速300kmの新幹線で向かったとして、4兆6368億年。
有人では世界最速と言われるマッハ2.6(※)のジェット機に乗って行くと、4864億年。
無人で世界最速と言われるマッハ9.6(※)のジェット機に乗れたとすると、1317億年。

※マッハ1を時速1100km(高度約1万m)として計算

ちなみに、人間の寿命約80年として、生まれてから死ぬまでの間にたどり着くとしたら、時速15京2318兆8800億kmという速度を出さないといけない計算になります。

・・・想像もつかない世界、と言う以前に、頭が痛くなってきました(笑)

トップページ | 2006年10月 »

フォト
2017年5月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

最近のトラックバック