2008/4/23 水曜日

hiernate ハマリ道 @Table書き忘れ。

このエントリをはてなブックマークに追加hiernate @Table吾綽のはてなブックマーク被リンク数
Filed under: java — akky @ 16:24:43

Criteria.list()のタイミングで結果を取得できない。第2弾

hibernate.cfg.xmlにmappingのエンティティクラスの名前を書いたけど、エンティティのソースに

@Entity
@Table(name = “テーブル名”)

を書いていなかった。

log4jを使っている場合に、hibernateのログをやったら出して、下のログが出ていればマッピング情報が作られている。

Bind entity エンティティクラス名 on table テーブル名

マッピングの状態を

hiernate ハマリ道 hibernate.xfg.xmlを入れ忘れ

このエントリをはてなブックマークに追加hiernate hibernate.xfg.xmlャ綽のはてなブックマーク被リンク数
Filed under: java — akky @ 11:22:58

hibernate3でannotationを使ってコーディングを実施。org.hibernate.Criteria#list()を何度実行しても、空のリストが帰ってくる。DB側のログを見ると接続してはいるが、SQLを実行している形跡がない。テーブルを変えてみても駄目。

それで、別プロジェクトで作られた同じやり方をしているソースコード見ても特段の違いを感じられない。もう、こうなったらということで、一通りのソースを見ていると、hibernate.xfg.xmlを発見。これが無いからだorz。半日無駄にしてしまった。

2008/4/14 月曜日

php.iniの設定を.htaccessで上書きできない

このエントリをはてなブックマークに追加php.ini荐絎.htaccessт吾сのはてなブックマーク被リンク数
Filed under: PHP — akky @ 17:18:30

レンタルサーバーを使っていてphp.iniの上書きをしたいときに、レンタルサーバのマニュアルに従って.htaccessを編集しても、phpinfo()で見ると設置値が反映されていない場合の対応。

display_errorsのマニュアルを見ていて知った。ini_set関数を使うことで、解決できる場合もある。

注意: display_errors は実行時にも設定可能(ini_set() 関数を用いて)ですが、スクリプトが致命的(fatal)なエラーを発生した場合は その設定は反映されません。なぜなら、要求されたアクションは 実行されなかったからです。

ということで、文法エラー系には効かないと解釈したのだが、requireしているファイルの文法エラーはメッセージを出してくれた。set_ini()を記述しているファイルでなければ問題ないということなのだろうか。

例えばdisplay_errors を有効にしたい場合の記述はこれ。

ini_set("display_errors","On");

エラーの原因がわからないために、1日つぶしてしまった。ちなみに、PEAR.phpが無いのが原因だった。

2008/4/3 木曜日

webalizer-2.01-10をインストール

このエントリをはてなブックマークに追加webalizer-2.01-10ゃ潟鴻若のはてなブックマーク被リンク数
Filed under: linux — akky @ 17:32:49

Fedra6にwebalizer-2.01-10をインストールした顛末です。

You must have a V1.85 compatable DB libraryっていわれる

ホスト名を逆引きしたいので

./configure  --with-language=japanese --enable-dns

とすると

[root@vesalius webalizer-2.01-10]# ./configure  --with-language=japanese --e
nable-dns
loading cache ./config.cache
checking for gcc... (cached) gcc
checking whether the C compiler (gcc  ) works... yes
checking whether the C compiler (gcc  ) is a cross-compiler... no
checking whether we are using GNU C... (cached) yes
checking whether gcc accepts -g... (cached) yes
checking whether ln -s works... (cached) yes
checking for a BSD compatible install... (cached) /usr/bin/install -c
checking how to run the C preprocessor... (cached) gcc -E
checking whether char is unsigned... (cached) no
checking for dbopen... (cached) no
checking for library containing dbopen... (cached) no
configure: warning: You must have a V1.85 compatable DB library!
configure: warning: DNS lookup code will be disabled...
checking for socket... (cached) yes
checking for sys/socket.h... (cached) yes
checking for main in -lnsl... (cached) yes
checking for main in -l44bsd... (cached) no
checking for main in -lm... (cached) yes
checking for main in -lz... (cached) yes
checking for gzrewind in -lz... (cached) yes
checking for main in -lpng... (cached) yes
checking for gdImagePng in -lgd... (cached) yes
checking for gd.h... (cached) /usr/include
checking for getopt.h... (cached) yes
checking for math.h... (cached) yes
checking default config dir... (cached) /etc
checking for language file... yes - japanese
creating ./config.status
creating Makefile
linking ./lang/webalizer_lang.japanese to webalizer_lang.h
[root@vesalius webalizer-2.01-10]#

ってなる。コンパイルもでき、実行もできるのだけど、DNSCacheDNSChildrenの設定をしてあると

Warning: Invalid keyword 'DNSCache' (/etc/webalizer.conf)
Warning: Invalid keyword 'DNSChildren' (/etc/webalizer.conf)

っていわれてしまい、逆引きもできていない。configure時の

configure: warning: You must have a V1.85 compatable DB library!
configure: warning: DNS lookup code will be disabled...

の警告に起因しているみたいだ。Berkeley DBの1.85を用意せよとおっしゃる。なので、rpmから

  • db4-devel-4.3.29-9.fc6
  • db4-4.3.29-9.fc6

を入れておく

Berkeley DBを使ってコンパイル

rpmから入れたBerkeleyDBを使うように

./configure  --with-language=japanese --enable-dns --with-dblib=/usr/lib -with-db=/usr/include

とすると、configure時の警告は消えるが、今後は、コンパイルが通らない

dns_resolv.c: In function `resolve_dns':
dns_resolv.c:149: warning: passing arg 2 of pointer to function from incompatible pointer type
dns_resolv.c:149: error: too few arguments to function
dns_resolv.c: In function `dns_resolver':
dns_resolv.c:218: warning: implicit declaration of function `dbopen'
dns_resolv.c:218: warning: assignment makes pointer from integer without a cast
dns_resolv.c:228: error: too few arguments to function
dns_resolv.c:235: error: too few arguments to function
dns_resolv.c:275: warning: passing arg 2 of pointer to function from incompatible pointer type
dns_resolv.c:275: error: too few arguments to function
dns_resolv.c:329: error: too few arguments to function
dns_resolv.c:359: error: too few arguments to function
dns_resolv.c: In function `db_put':
dns_resolv.c:745: warning: passing arg 2 of pointer to function from incompatible pointer type
dns_resolv.c:745: error: too few arguments to function
dns_resolv.c: In function `open_cache':
dns_resolv.c:793: warning: assignment makes pointer from integer without a cast
dns_resolv.c:801: error: too few arguments to function
dns_resolv.c:807: error: too few arguments to function
dns_resolv.c: In function `close_cache':
dns_resolv.c:829: error: too few arguments to function
make: *** [dns_resolv.o] Error 1

引数の数が違うとな。/usr/include/db.hdns_resolv.cを見比べるとやっぱり、引数数が合わない。むむむと、dns_resolv.cと睨めっこしていると

ifdef HAVE_DB_185_H
#include <db_185.h>                            /* on my RH6.0 system ?!?   */
#else
#include <db.h>                                /* DB header ****************/
#endif /* HAVE_DB_185_H */

という記述を発見。db_185.hがあるとな。最初の警告にあるV1.85と符合する。db_185.hを探すと/usr/include/db4/にヘッダファイルを発見。これを読ませればいいんだな。ということで、

CFLAGS='-DHAVE_DB_185_H' ./configure  --with-language=japanese --enable-dns --with-dblib=/usr/lib --with-db=/usr/include

としてコンパイル。これでコンパイル時の問題と実行時の問題が無事解決です。

2008/3/8 土曜日

Services_HyperEstraierを使ってPHPでノードから検索

このエントリをはてなブックマークに追加Services_HyperEstraier篏帥cPHPс若罎膣△里呂討淵屮奪マーク被リンク数
Filed under: linux — akky @ 20:50:24

HyperestraylerのPHPバインディングは標準では配布されてないので、移植されたものを http://page2.xrea.jp/ からダウンロード。今回使うのは、PHP5 専用のServices_HyperEstraier の方。

ファイルの構成は下の通り。ServiesはServices_HyperEstraierから取得したものです。

common.php
index.php
Services/HyperEstraier.php
Services/HyperEstraier/Error.php
Services/HyperEstraier/Condition.php
Services/HyperEstraier/ResultDocument.php
Services/HyperEstraier/Node.php
Services/HyperEstraier/Document.php
Services/HyperEstraier/Utility.php
Services/HyperEstraier/HttpResponse.php
Services/HyperEstraier/.ResultDocument.php.swp
Services/HyperEstraier/NodeResult.php
Services/HyperEstraier.php

common.php

<?php
define('SERVICES_HYPERESTRAIER_DEBUG', 1);
error_reporting(E_ALL & ~E_STRICT);

require_once 'Services/HyperEstraier/Node.php';

$uri = 'http://localhost:1978/node/main';
$user = 'admin';
$pass = 'admin';

index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Cache-Control" content="no-cache, must-revalidate, no-transform" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
</head>
<body>
<?php
$phrase = isset($_GET["phrase"]) ? $_GET["phrase"] : null;
?>
<form action="<?php echo $_SERVER["PHP_SELF"] ?>" method="get">
検索:
<input type="text" name="phrase" value="<?php echo $phrase ?>" size="32" id="phrase" class="text" tabindex="1" accesskey="0" />
<!--
並び替え
<select name="sort">
  <option value="score">候補</option>
  <option value="updateDate">更新日付</option>
  <option value="url">URL(ディレクトリ)</option>
  <option value="size">サイズ</option>
</select>
-->
<input type="submit" value="検索"/>
</form>

<?php
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'common.php';
// create and configure the node connecton object

if  ($phrase != null ) {

  $node = new Services_HyperEstraier_Node;
  $node->setUrl($uri);

  // create a search condition object
  $cond = new Services_HyperEstraier_Condition;
  $cond->setPhrase($phrase);
  $cond->setMax(10);
  $cond->setSkip(0);

  // get the result of search
  $nres = $node->search($cond, 1);
  if ($nres) {
      if ($nres->docNum() == 0) {
          printf( "%s: not found.n", $cond->getPhrase());
      } else {
          foreach ($nres as $rdoc) {
              printf("<h2><a href='%s'>%s<a/></h2>n"
                ,$rdoc->getAttribute('@uri')
                ,$rdoc->getAttribute('@title')) ;
              printf("%s<br/>n",$rdoc->getAttribute('@uri'));
              print("<BLOCKQUOTE>");
              foreach( split("n",$rdoc->getSnippet()) as $line ){
                if ( mbereg('   ',$line) ){
                  printf("<strong>%s</strong>",mbereg_replace(' .*$','',$line));
                }else{
                  printf("%s",$line);
                }
              }
              print("</BLOCKQUOTE>n");
          }
      }
  } else {
      printf("error: %dn", $node->status);
      if (Services_HyperEstraier_Error::hasErrors()) {
          printf( print_r(Services_HyperEstraier_Error::getErrors(), true));
      }
  }
}
?>

</body>
</html>

2008/3/4 火曜日

最寄り駅Webサービス

このエントリをはてなブックマークに追加絲薈Web泣若垢里呂討淵屮奪マーク被リンク数
Filed under: googlemap — akky @ 23:46:57

緯度経度や住所から最寄駅を教えてくれるAPIサービス
http://map.simpleapi.net/

指定した位置からの直線距離も教えてくれる。
目的とする位置の緯度/経度はわからないので、これは駅名から緯度経度に変換すればいいのかな。
駅の緯度/経度がわかればマーカーなりは表示できるし。

2008/3/3 月曜日

ExcelVBAでUTF-8のcsvファイルを書き出す

このエントリをはてなブックマークに追加ExcelVBAUTF-8csv<ゃ吾冴のはてなブックマーク被リンク数
Filed under: windows — akky @ 21:56:06

表題の通り。

ADODB.Streamdでは、クローズするときにファイル名を指定するのはしっくりこないな。名前の通りにストリームだから「ファイル名なんて飾りですよ」ののりなのかな。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpado260/htm/mdobjstream.aspにあるマニュアルを探し出せるまで満足に実行することもできなかった。

Const SHEETNAME As String = "Sheet1" ' 対象とするシート名
Const STARTROW = 2 ' 開始行
Const LASTCOL = 13 ' 最終列

Private Sub cmdCSVoutput_Click()
    Dim excelFiles As Variant
    Dim exceiFile As String
    Dim csvFile As String
    Dim i As Integer

    ' 複数指定で対象とするファイルを指定
    exelfiles = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls", MultiSelect:=True)
    ' キャンセル
    If Not IsArray(exelfiles) Then
        Exit Sub
    End If

    For i = 1 To UBound(exelfiles)
    ' 同じパスで拡張子をcsvへ変更してCSVファイルを書き出す
        exceiFile = exelfiles(i)
        csvFile = Mid(exceiFile, 1, Len(exceiFile) - 3) + "csv"
        csvputput exceiFile, csvFile
    Next i

End Sub

'
' 指定されたExcelファイル
'
Private Sub csvputput(ByVal excelFile As String, ByVal csvFile As String)
    Dim wb As Workbook

    Dim ws As Worksheet ' データがあるシート
    Dim lastRow As Long ' 最終行
    Dim col As Long ' 現在の対象列
    Dim row As Long ' 現在の対象行

    Dim buf As String
    Dim v As Variant

    ' 文字コードにUTF-8を指定して書き出すCSVファイルをオープン
    Set outStream = CreateObject("ADODB.Stream")
    outStream.Open
    outStream.Charset = "UTF-8" ' ファイルの文字コード
    outStream.LineSeparator = -1 ' CRLF
    outStream.Type = 2    ' テキスト

    ' 指定されたシートを開く
    Set wb = Workbooks.Open(excelFile)
    Set ws = wb.Worksheets(SHEETNAME)
    ' 出力するCSVファイルを開く

    ' ヘッダを飛ばして2行目からを書き出す
    lastRow = getLastRow(ws)
    For row = STARTROW To lastRow
        ' 1行分のデータを作成
        buf = ""
        For col = 1 To LASTCOL

            buf = buf & ",""" & ws.Cells(row, col) & """"
        Next
        buf = Mid(buf, 2)

        ' ファイルへ書き出し 文字コード変換は ADODB.Stream がやってくれる
        outStream.WriteText buf, 1

    Next
    ' ファイル名を指定してクローズ
    outStream.SaveToFile csvFile, 2
    outStream.Close

    ' Excelを閉じる
    wb.Close

End Sub

'
' 指定されたシートの最終行を取得する
'
' 行の各セルに値がなければ無効行と判断する
'
Private Function getLastRow(ws As Worksheet)
    Dim i As Long

    ' シートの末尾から先頭方向へ向かって有効な行がある位置を探す
    For i = ws.Cells(65535, 1).End(xlUp).row To 1 Step -1
        If isValidRow(ws, i) Then
            Exit For
        End If
    Next

    ' 最終行を戻り値に設定
    getLastRow = i
End Function

'
' 指定された行の値を検査して、一つでも値が入っていれば有効な行と判断する
'
Private Function isValidRow(ws As Worksheet, row As Long)
    Dim i As Long
    Dim b As Boolean

    b = False

    For i = 1 To LASTCOL
        If ws.Cells(row, i) <> “” Then
            b = True
            Exit For
        End If
    Next

    isValidRow = b
End Function

2008/2/28 木曜日

Centos4.6でapache1.3がコンパイルエラー

このエントリをはてなブックマークに追加Centos4.6apache1.3潟潟ゃ爾里呂討淵屮奪マーク被リンク数
Filed under: linux — akky @ 23:01:35

コンパイルしようとすると、

 ndbm.h No suche file or directory

とおっしゃられる。ぐぐってみるとgdbmのヘッダらしいけど、それ自体も見つからず。そもそも、gdbm-develのパッケージから入れないといけないらしい。というわけで、さくっとyumでインストール。

最近はgccすら明示的に入れないといけないんだよな・・・

ヘッダファイルは/usr/include/gdbmにあるので、

 CLFAG=/usr/include/gdbm ./configure 〜

とやって解決。シンボリックリンクを張っている記事もあるけど、コンパイルの王道はこうだよな。

2008/2/17 日曜日

Hyper Estraierでノードを使ったWebサイトとファイルを検索対象にする

このエントリをはてなブックマークに追加Hyper Estraierс若篏帥cWeb泣ゃ<ゃ罎膣√乗院のはてなブックマーク被リンク数
Filed under: linux — akky @ 14:26:03

estseek.cgiでは一つのインデックスだけしか扱えないので、大量の文書やWebサイトとファイルサーバにある文章を同時に扱うことができない。そこで、P2Pを使って問題を解決したい。

ノードの構成は下の状態

+- ノードマスタ ---------------------+
|  mainノード -+- project_a ノード   |
|              +- project_b ノード   |
|              +- イントラ ノード    |
+------------------------------------+

ノードマスタは一つだけ用意。mainノードにはインデックスは持たずに、project_aノード、project_bノード、イントラノードへのリンクを張るだけ。project_aノードとproject_bノードはそれぞれのプロジェクトで作成した文章へのインデックスを持ち、イントラノードはイントラをクロールしたインデックスを持つ。project_cや新たなイントラを検索の対象に含めたい場合には、個別にノードを用意(インデックスを作成)して、mainノードからのリンクを追加する。
クライアントはmainノードだけを検索の対象にして、mainノードがそれぞれのノードに対してリクエストを投げて、帰ってきた応答をマージしてクライアントへ返す方法をとる。
これが適切な設計なのかはわからないが、試験的なものとして試してみる。

操作で使うディレクトリの状態は下の通り。

 + master マスタノードのサーバルートディレクトリ
 |  +- _node ノードディレクトリ
 |       +- main      mainノード
 |       +- project_a project_aノードのインデックス
 |       +- project_b  project_bノードのインデックス
 |       +- intra      イントラノードのインデックス
 |
 +- crawl クローラーのディレクトリ

ノードマスタとノードを作成

[参考]P2Pガイドのチュートリアル 「起動と終了」及び「管理用インターフェイス」

 $ estmaster init master
 $ estmaster start -bg master
 webブラウザで http://localhost:1978/master_ui へアクセス。認証はadmin/admin。
 Manage Nodesからmain、project_a、project_b、intraのそれぞれのノードを追加

mainノードからのリンクを設定

[参考]P2Pガイドのチュートリアル 「文書の検索」

メインノードからそれぞれのノードへのリンクを設定する。信頼度は全て1000。

 $ estcall setlink -auth admin admin http://localhost:1978/node/main \
  http://localhost:1978/node/project_a プロジェクトA 1000
 $ estcall setlink -auth admin admin http://localhost:1978/node/main \
  http://localhost:1978/node/project_b プロジェクトB 1000
 $ estcall setlink -auth admin admin http://localhost:1978/node/main \
  http://localhost:1978/node/intra 社内イントラ 1000

estcmdでproject_aとproject_bのインデックスを作成

[参考]P2Pガイドのチュートリアル 「初期導入の効率化」
ノードマスタを起動している最中はインデックスがロックされているため、estcmd gatherがロック待ちで止まりますので、ノードマスタを停止してから行います。

 $ estmaster stop master
 $ estcmd gather -cl -fx ".doc,.xls,.ppt" "H@estfxmsotohtml"  -ic UTF-8 \
     -sd -cm -pc UTF-8 master/_node/project_a /home/Projects/project_a
 $ estcmd gather -cl -fx ".doc,.xls,.ppt" "H@estfxmsotohtml" -ic UTF-8  \
     -sd -cm -pc UTF-8 master/_node/project_b /home/Projects/project_b
 $ estmaster start -bg master

クロールしてイントラノードのインデックスを作成

 $ estwaver init -xs crawl
 $ im crawl/_conf

seed: 1.0|http://intra.example.co.jp/
として他のseedを削除。seedは種文書(ここからクロールを開始する)

allowrx: ^http://http://intra.example.co.jp/
クロールをイントラサーバだけに限定します。

language: 1
日本語の文書なら1にします。

nodeserv: 1|http://admin:admin@localhost:1978/node/intra
事前に作成したノードへインデックスを保存します。

 $estwaver crawl -revcont crawl

検索をしてみる

http://localhost:1978/node/main/search_ui へアクセスすると、検索フォームが表示されます。右側にはmainノードがリンクしているノードが表示されているはずです。depthが「0」のまま検索すると、リンク先を検索しないので、ヒットしないはずです。「1」以上にすると、リンクしているノードも含めて検索結果が表示されます。右側にあるノードのチェックを外すと検索の対象から除かれます。

2008/2/12 火曜日

sambaのPDCにログインしたらプロファイルが無いって言われる。

このエントリをはてなブックマークに追加sambaPDC違ゃ潟<ゃ<c荐のはてなブックマーク被リンク数
Filed under: windows, linux — akky @ 20:09:28

この手順で作成したドメインへログインすると

移動プロファイルのサーバー用コピーが見つからないため、ローカルプロファイルを使ってログオンしようとしています。プロファイルへの変更は、ログオフ時にサーバーにはコピーされません。ネットワークの問題が発生しているか、セキュリティの権限が不足していることが原因と考えられます。問題が解決しない場合は、管理者に問い合わせてください。

とか

ローカルのプロファイルが見つかりません。一時的なプロファイルでログインしています。ログオフ時にこのプロファイルへの変更は失われます。

って言われる。samba userのサイトを見ながらわかったことは、ldapのsambaProfilePathのディレクトリが無いのが原因。/etc/samba/smb.conflogon pathをどれだけ編集していても解決できないわけだった。smbldap-usershowlogon pathが指すディレクトリを作成することでエラーの原因は解決。

smbldap-usermod -Fでldapのlogon path/etc/samba/smb.conflogon pathが同じディレクトリを指すように変更しておく。あと、ldapのlogon path/etc/smbldap-tools/smbldap.confuserProfileをテンプレートとしているので、これも修正しておく。

2008/2/7 木曜日

hyperestraier を使って、ファイルサーバを全文検索

このエントリをはてなブックマークに追加hyperestraier 篏帥c<ゃ泣若罎膣△里呂討淵屮奪マーク被リンク数
Filed under: linux — akky @ 17:11:19

hyerestraier を使って、ファイルサーバのみんなで共有しているファイル群を全文検索します。インデックスを作成するときにはジャンルを使って、案件を指定できるようにします。

イントロダクションに書いてあることは省略してあります。

Excel,MS-Word,PowerPoint,PDFを検索できるようにテキストを抽出するプログラムをインストール

■MS-Wordからテキストを抽出するvwWare

  # yum install glib2-devel
  # yum install libgsf-devel
	  依存パッケージいっぱい
  $wget http://downloads.sourceforge.net/wvware/wv-1.2.4.tar.gz?modtime=1161798556&big_mirror=0
  $ tar xvfz wv-1.2.4.tar.gz
  $ ./configure
  $ make
  $ make install

■ExcelとWordからテキストを抽出するxlhtml

  $ wget http://nchc.dl.sourceforge.net/sourceforge/chicago/xlhtml-0.5.tgz
  $ tar xvfz xlhtml-0.5.tgz
  $ cd xlhtml-0.5
  $ ./configure
  $ make
  $ make install

インデックスを初期化

 $ estcmd create -attr _lpath str -attr @mdate seq -attr @size seq -attr @genre str job

インデックス化

インデックス化する際には -aa @genreを使ってフォルダ単位にジャンルを指定します。

 $ export PATH=$PATH:/usr/local/share/hyperestraier/filter/
 $ estcmd gather -cl -fx ".doc,.xls,.ppt" "H@estfxmsotohtml" -ic UTF-8 -sd -cm -pc UTF-8 -aa  @genre project_a job /home/Projects/project_a
 $ estcmd gather -cl -fx ".doc,.xls,.ppt" "H@estfxmsotohtml" -ic UTF-8 -sd -cm -pc UTF-8 -aa @genre project_b job /home/Projects/project_b

estseek.confにジャンルを指定

genrecheck: project_a{{!}}プロジェクトA
genrecheck: project_b{{!}}プロジェクトB

次のページ »