日曜日, 9月 18, 2011

Cygwin+Hiveで必要になる修正(File.separatorも!)

Hive内部では、当然HDFSのPath操作を各種行っているのだけど、、そのセパレータ(HDFSなら"/"であるべき)を、File.separatorシステム変数から取得している。 Cygwinではこれが"¥"になってしまうので、修正として先にで紹介したものだけでなく、ql/io/HiveFileFormatUtils.javaのdoGetPartitionDescFromPath()も変更が必要だった。
  private static PartitionDesc doGetPartitionDescFromPath(

-snip-

    if (part == null) {
      String dirStr = dir.toString();
      //int dirPathIndex = dirPath.lastIndexOf(File.separator);
      //int dirStrIndex = dirStr.lastIndexOf(File.separator);
      int dirPathIndex = dirPath.lastIndexOf("/");
      int dirStrIndex = dirStr.lastIndexOf("/");
      while (dirPathIndex >= 0 && dirStrIndex >= 0) {
        dirStr = dirStr.substring(0, dirStrIndex);
        dirPath = dirPath.substring(0, dirPathIndex);
        //first try full match
        part = pathToPartitionInfo.get(dirStr);
        if (part == null) {
          // LOG.warn("exact match not found, try ripping input path's theme and authority");
          part = pathToPartitionInfo.get(dirPath);
        }
        if (part != null) {
          break;
        }
        //dirPathIndex = dirPath.lastIndexOf(File.separator);
        //dirStrIndex = dirStr.lastIndexOf(File.separator);
        dirPathIndex = dirPath.lastIndexOf("/");
        dirStrIndex = dirStr.lastIndexOf("/");
      }
    }
    return part;
  }
というか、File.separatorでgrepすると多数あるので、、、他にも危ないところはありそう。。。

月曜日, 6月 20, 2011

GW-SC150Nの動き

この無線→有線コンバータは、とても便利なんだけど、どうも説明書などが詳細まで書かれていないので判然としないので調べてみた。

①自分自身は上位の(無線LANの)クラスCの".249"となる
②この249は上位から払い出されたものではなく勝手に使う
③自分の有線LAN配下には自身がDHCPサーバとなりIPを払い出す(※)
④但し払い出すIPのクラスC部分は上位の(無線LANの)ものを使う
⑤故に有線と上位(=無線LAN)で同じ第四オクテットを払い出しうる

ということか。

上位で見ていても有線上のMACが見えて来ないので、(※)ではNATしている=全て自分(GW-SC150N)が通信していることにすることは確認できた気がする。

日曜日, 1月 09, 2011

Googleの検索機能をAPI的に使える!?

Googleドキュメントにuploadした文書は、"Google Documents List Data API"経由で全文検索ができるらしい。これをJavascriptからやってみました(Rhino)。
/*
 * FullTextSearch
 * http://bit.ly/i4QaUO
 */

importPackage(com.google.gdata.client.docs);
importPackage(com.google.gdata.client);
importPackage(com.google.gdata.data.docs);
importPackage(java.util);
importPackage(java.util.logging);

function getDocsService(applicationName, username, password){
    var service = new DocsService(applicationName)
    service.setUserCredentials(username, password)
    return service;
}

var username = 'xxxx@gmail.com';
var password = 'xxxx';
var client   = getDocsService('fts-test-1', username, password);

var feedUri  = new java.net.URL('https://docs.google.com/feeds/default/private/full/');
var query    = new DocumentQuery(feedUri);

var qStr     = "first"; // 検索文字列
query.setFullTextQuery(qStr);

var feed = client.getFeed(
    query,
    java.lang.Class.forName("com.google.gdata.data.docs.DocumentListFeed")
);

print( feed );

if(feed){
    var entries = feed.getEntries();

    for (var i = 0; i < entries.size();i++){
        print("- " + entries.get(i).getTitle().getPlainText());
    }

    print(entries.size());
}

もちろん元ネタは、ぶいてくさんの「すごいのはGDriveより全文検索でしょ!?」です。カスタム検索という機能は提供されていましたが、検索結果としてHTMLが返されたりと、プログラムから使える感じではなかったのですが、これは便利そうです。

日曜日, 1月 02, 2011

JavaからJavascriptを使うとき

以下では、組込み変数のenvironmentなどがない環境での実行になってしまう。
Context cx = Context.enter();
Scriptable scope = new ImporterTopLevel(cx);
Object obj = cx.evaluateReader(scope, reader, "JsScript", 1, null);

これは以下のように、GlobalオブジェクトでContectを初期化することで(それら変数が入った)シェルと同様の環境で実行させることができる。
Global global = new Global();
Context cx = ContextFactory.getGlobal().enterContext();
global.init(cx);
Scriptable scope = cx.initStandardObjects(global);
Object obj = cx.evaluateReader(scope, reader, "JsScript", 1, null);

EnvJSの過去MLで知りました。
なお、ここのGlobalはorg.mozilla.javascript.tools.shell.Globalです。