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
次のページ »