- コンテキストが作られる
- narwhalの(engine個別の/ここではrhinoの)bootstrap.jsが実行される
ここでNARWHAL_HOMEはWEB-INF/packages/narwhalと決め打ち
その中で(NARWHAL_HOMEの)narwhal.jsが実行され環境が作られる - jackのservletハンドラ(proessメソッド)がrequireされる
アプリは(serviceメソッドから呼ばれ)このハンドラ内で実際に実行される - アプリのWEB-INF/src/jackconfig.jsがrequireされる
(web.xmlの)appとenvironmentに合わせた変数がexportされる - 上記exportされた変数(environmentとapp)を使ってアプリが初期化される
月曜日, 3月 22, 2010
appenginejsのアプリ初期化過程
最初のリクエストが飛んできたときに、appenginejsに同梱されているJSGIServlet.javaで行われていることをまとめておきます。
月曜日, 3月 08, 2010
hotデプロイなGAE開発!
appenginejsでは、war\WEB-INF\jackconfig.jsの中でlocalとhostedという2つの稼働方法をexportしている。
そして、同ディレクトリにあるweb.xmlの中でenvironmentという名前で指定して利用するのだが、これをlocalにしておけば、ソース修正が(jettyの再起動を行わずとも)反映できるようになる。
なお、jackconfig.jsというファイル、何かの設定ファイルのようだけどなんのことはなく、このファイルが、jack経由でJettyで実行されているだけである(このファイルのexports.app)。
そして、同ディレクトリにあるweb.xmlの中でenvironmentという名前で指定して利用するのだが、これをlocalにしておけば、ソース修正が(jettyの再起動を行わずとも)反映できるようになる。
なお、jackconfig.jsというファイル、何かの設定ファイルのようだけどなんのことはなく、このファイルが、jack経由でJettyで実行されているだけである(このファイルのexports.app)。
日曜日, 3月 07, 2010
appenginejsでtimezone
blog-gaeでのtimezone設定のやり方が分からず、ずっと時間表示がUTCだった。
調べてみると起動するservletであるjack-servletを最新ソースではこの設定が可能になっていたので差し替え。
ソースを落としたら、D:\work\blog-gaeに展開して、
調べてみると起動するservletであるjack-servletを最新ソースではこの設定が可能になっていたので差し替え。
ソースを落としたら、D:\work\blog-gaeに展開して、
ant runserverとするだけで、開発用サーバが8080ポートで上がります。ちなみに、WEB-INF\packages\narwhal\lib\sandbox.jsの6行目にある以下を修正すれば、配置場所は変更可能です(Windowsのディレクトリ記述がうまくパースできないようなので、このファイルは無理に改造しています)。
var zzWork = 'd:\\work\\blog-gae\\war\\WEB-INF\\';
土曜日, 3月 06, 2010
火曜日, 2月 23, 2010
appenginejsでrunInTransaction!!
appenginejsで、どうしても出来なかった同一トランザクションでのdb登録がやっとできた。GAEでは同一トランザクションでのデータ更新は、
・同じエンティティグループのエンティティ群しかダメ
・(そのためには先に作ってる同一に入れたい)エンティティからキーをもらう必要あり
このための記述が、昔はModelをnewするときの第一引数にキーを渡す方式だった(よう)だが、
×(昔)var objCom = new Comment(msg.key(),{
msgRef:msg.key(),
content: "This is test comment"
});
今のバージョンではプロパティにparentと切ってそこにキーを渡すことになっている。
○(今)var objCom = new Comment({
parent:msg.key(),
msgRef:msg.key(),
content: "This is test comment"
});
これで、以下のような一括更新が成功するようになる!!
ちなみに、
agl0ZjAwNTQtMDZyDQsSB01lc3NhZ2UYCQw
というキーを与えたら、
agl0ZjAwNTQtMDZyGgsSB01lc3NhZ2UYCQwLEgdDb21tZW50GAoM
というキーを持った(同一エンティティグループに入った)エンティティができている。
・同じエンティティグループのエンティティ群しかダメ
・(そのためには先に作ってる同一に入れたい)エンティティからキーをもらう必要あり
このための記述が、昔はModelをnewするときの第一引数にキーを渡す方式だった(よう)だが、
×(昔)var objCom = new Comment(msg.key(),{
msgRef:msg.key(),
content: "This is test comment"
});
今のバージョンではプロパティにparentと切ってそこにキーを渡すことになっている。
○(今)var objCom = new Comment({
parent:msg.key(),
msgRef:msg.key(),
content: "This is test comment"
});
これで、以下のような一括更新が成功するようになる!!
db.runInTransaction(function() {
db.put([objCom,msg]);
});
ちなみに、
agl0ZjAwNTQtMDZyDQsSB01lc3NhZ2UYCQw
というキーを与えたら、
agl0ZjAwNTQtMDZyGgsSB01lc3NhZ2UYCQwLEgdDb21tZW50GAoM
というキーを持った(同一エンティティグループに入った)エンティティができている。
土曜日, 2月 13, 2010
App Engine JavaScript SDK
GAEのアプリをJavascriptで書けるSDK"appenginejs"というのがあるのだけど、公開されているサンプルアプリ(blog-gae)をWindowsで動かすのにえらく苦労したのでメモ。
"app is not function"とかエラーがでるがこれはウソ。
で、やることは大きく2つ。
パスがうまく取り込めないので置換する(配置場所に合わせて適宜変えて下さい)。
変更するファイルは"blog-gae\war\WEB-INF\packages\narwhal\lib\sandbox.js"の1つだけ。
"\blog-gae\war\WEB-INF\src"は本来classesへのシンボリックリンク。
なのだけど、Windowsなのでこれはclassesをsrcという別名でコピーしておく。
これで、起動はやはり重いけど動くことは動く。日本語も使えている様子。
"app is not function"とかエラーがでるがこれはウソ。
で、やることは大きく2つ。
パスがうまく取り込めないので置換する(配置場所に合わせて適宜変えて下さい)。
変更するファイルは"blog-gae\war\WEB-INF\packages\narwhal\lib\sandbox.js"の1つだけ。
loader.find = function (topId) {
if(topId.match(/\-gae/)){
var zztmp = new Array();
//zztmp = topId.match(/([^\\]+)$/);
zztmp = topId.match(/INF\\(.+)$/);
topId = 'd:\\work\\blog-gae\\war\\WEB-INF\\'+zztmp[1];
}
...
self.find = function (topId) {
if(topId.match(/\-gae/)){
var zztmp = new Array();
zztmp = topId.match(/INF\\(.+)$/);
topId = 'd:\\work\\blog-gae\\war\\WEB-INF\\'+zztmp[1];
}
...
"\blog-gae\war\WEB-INF\src"は本来classesへのシンボリックリンク。
なのだけど、Windowsなのでこれはclassesをsrcという別名でコピーしておく。
これで、起動はやはり重いけど動くことは動く。日本語も使えている様子。
月曜日, 1月 11, 2010
[haXe] aswingを使う(ウィンドウ内に描画)
同様にhaXeにてaswingのウィンドウ内に絵を描く(linetoなど)には、FrameのContainerをとって、そこに、絵が描かれたGroudDecoratorをBackgroundDecoratorとしてセット、するみたいです。。。中国のaswingサイトに例がありました。

import flash.display.Sprite;普通にSpriteをJFrameなどにaddChildもできますが、これでは折りたたんだときに表示が残るので。。
import org.aswing.ASColor;
import org.aswing.Component;
import org.aswing.Container;
import org.aswing.JFrame;
import org.aswing.graphics.Graphics2D;
import org.aswing.graphics.IBrush;
import org.aswing.graphics.SolidBrush;
class FillTest extends Sprite
{
public function new()
{
super();
var frame:JFrame = new JFrame(this);
frame.setSizeWH(400, 370);
var c:Container = frame.getContentPane();
c.setBackgroundDecorator(new MyCanvas());
frame.show();
}
}
import org.aswing.GroundDecorator;
import flash.display.Shape;
import org.aswing.Component;
import org.aswing.graphics.Graphics2D;
import org.aswing.geom.IntRectangle;
import flash.display.DisplayObject;
import org.aswing.graphics.IBrush;
import org.aswing.graphics.SolidBrush;
import org.aswing.ASColor;
import org.aswing.graphics.GradientBrush;
import flash.geom.Matrix;
class MyCanvas implements GroundDecorator {
private var shape:Shape;
private var H_GAP:UInt;
private var V_GAP:UInt;
private var WIDTH:UInt;
private var HEIGHT:UInt;
public function new()
{
shape = new Shape();
H_GAP = 10;
V_GAP = 10;
WIDTH = 100;
HEIGHT = 100;
}
public function updateDecorator(com:Component, g:Graphics2D, bounds:IntRectangle):Void {
var g2:Graphics2D = new Graphics2D(this.shape.graphics);
g2.clear();
var rectBounds:IntRectangle = new IntRectangle();
//fill solid rect
rectBounds.x = bounds.x + H_GAP;
rectBounds.y = bounds.y + V_GAP;
rectBounds.width = WIDTH;
rectBounds.height = HEIGHT;
var solidBrush:IBrush = new SolidBrush(ASColor.RED);
g2.fillRectangle(solidBrush, rectBounds.x, rectBounds.y, rectBounds.width, rectBounds.height);
//fill liner grandient rect
rectBounds.y += HEIGHT; // move shape rect
rectBounds.y += V_GAP;
var colors:Array<UInt> = [0x000000, 0xFF0000, 0x00FF00, 0x0000FF, 0x000000];
var alphas:Array<Int> = [0, 1, 1, 1, 0];
var ratios:Array<Int> = [0x00, 0x3F, 0x7E, 0xBD, 0xFF];
var matrix:Matrix = new Matrix();
matrix.createGradientBox(rectBounds.width, rectBounds.height, 0, rectBounds.x, rectBounds.y);
var linear:IBrush = new GradientBrush(GradientBrush.LINEAR, colors, alphas, ratios, matrix);
g.fillRectangle(linear, rectBounds.x, rectBounds.y, rectBounds.width, rectBounds.height);
//fill radial grandient
rectBounds.y += HEIGHT; // move shape rect
rectBounds.y += V_GAP;
matrix.createGradientBox(rectBounds.width, rectBounds.height, 0, rectBounds.x, rectBounds.y);
var radial:IBrush = new GradientBrush(GradientBrush.RADIAL, colors, alphas, ratios, matrix);
g.fillRectangle(radial, rectBounds.x, rectBounds.y, rectBounds.width, rectBounds.height);
}
public function getDisplay(c:Component):DisplayObject {
return this.shape;
}
}
[haXe] aswingを使う

haXe(v2.04)でaswing(1_5というパック?)を使う例。
/**
* Sample002.as
* Thanks!! -> http://www.matzmtok.com/blog/?p=18
*/
import org.aswing.event.InteractiveEvent ;
import org.aswing.ASColor;
import org.aswing.Container;
import org.aswing.EmptyLayout;
import org.aswing.JSlider;
import org.aswing.JWindow;
import org.aswing.SoftBoxLayout;
import org.aswing.ButtonGroup;
import org.aswing.BoxLayout;
import org.aswing.BorderLayout;
import org.aswing.JLabel;
import org.aswing.JFrame;
import org.aswing.JPanel;
import org.aswing.JButton;
import org.aswing.JRadioButton;
import org.aswing.geom.IntPoint;
import org.aswing.geom.IntDimension;
class Sample002 extends JWindow{
private var rbX:JRadioButton;
private var rbY:JRadioButton;
private var group:ButtonGroup;
private var zzlayout:BoxLayout;
private var frame:JFrame;
public var bg:ButtonGroup;
public var title:String;
public function new() {
super(flash.Lib.current, true);
title = 'Example of BoxLayout';
initUI();
}
private function initUI():Void {
setBackground(new ASColor(0xffffff));
var rbPanel:JPanel = new JPanel();
rbX = new JRadioButton('BoxLayout.X_AXIS');
rbY = new JRadioButton('BoxLayout.Y_AXIS');
zzlayout = new BoxLayout();
rbX.addSelectionListener(onRadioChanged);
rbY.addSelectionListener(onRadioChanged);
rbX.setSelected(true);
group = new ButtonGroup();
group.append(rbX);
group.append(rbY);
rbPanel.append(new JLabel('方向'));
rbPanel.append(rbX);
rbPanel.append(rbY);
rbPanel.setLocation(new IntPoint(0, 0));
rbPanel.setSize(new IntDimension(400, 30));
getContentPane().append(rbPanel);
var gapPanel:JPanel = new JPanel();
gapPanel.append(new JLabel('間隔'));
var slider:JSlider = new JSlider(JSlider.HORIZONTAL, 0, 30, 0);
slider.addStateListener(onSliderChange);
gapPanel.append(slider);
gapPanel.setLocation(new IntPoint(0, 20));
gapPanel.setSize(new IntDimension(400, 30));
gapPanel.setBackground(new org.aswing.ASColor(0xFF00FF)); // 効かない?
gapPanel.setToolTipText("xxxTIPxxx");
getContentPane().append(gapPanel);
frame = new JFrame(this, title);
getContentPane().append(frame);
frame.getContentPane().setLayout(zzlayout);
frame.setLocation(new IntPoint(30, 50));
frame.setSize(new IntDimension(250, 150));
// たくさん並べるとよしなに幅や高さを等分してくれる
frame.getContentPane().append(new JButton('Button 1'));
frame.getContentPane().append(new JButton('Button 2'));
frame.getContentPane().append(new JButton('Button 3'));
frame.getContentPane().append(new JButton('Button 4'));
frame.show();
}
public function onRadioChanged(e:InteractiveEvent):Void {
var rb:JRadioButton = cast(e.target,JRadioButton);
switch(rb){
case rbX:
zzlayout.setAxis(BoxLayout.X_AXIS);
case rbY:
zzlayout.setAxis(BoxLayout.Y_AXIS);
default:
trace("cannot change layout!");
}
updateLayout();
}
public function onSliderChange(e:InteractiveEvent):Void {
var s:JSlider = cast(e.target,JSlider);
zzlayout.setGap(s.getValue());
updateLayout();
}
private function updateLayout():Void {
frame.getContentPane().setLayout(zzlayout);
}
}
これを、以下のように呼び出す。
import org.aswing.geom.IntPoint;
import org.aswing.geom.IntDimension;
class Main
{
static function main()
{
var app:Sample002 = new Sample002();
app.setLocation(new IntPoint(0, 0));
app.setSize(new IntDimension(500, 500));
app.show();
// flash.Lib.current.addChild(new Sample002());
}
}
ちなみに、haxeコマンドに与えるcompile.hxmlはこんな感じ。
-swf-header 500:500:20:FFFFFF
-swf Main.swf
-cp hxclasses
-swf-lib concat.swf
-swf-version 9
-main Main
水曜日, 1月 06, 2010
[haXe] haxelibが変?
haXeでは、swfにしたアセットライブラリは、"-swf-lib"オプションに指定するのだが、これが1つしか受け付けられない様子。画像ファイルのswfとflコンポーネントのswfを同時に使いたかったので、この2つのアセットswfを纏める方法。
以下xmlを用意(ここではconcat.xmlとした)。
そして、swfmillを実行。
意外に簡単!xmlのwidthとかは適当で良いようです。
以下xmlを用意(ここではconcat.xmlとした)。
<movie width="320" height="240" framerate="12" version="9">
<frame><library>
<clip id="foo" import="spectrum.swf"/>
<clip id="foo" import="component.swf"/>
</library></frame>
</movie>
そして、swfmillを実行。
> swfmill.exe simple concat.xml concat.swf
意外に簡単!xmlのwidthとかは適当で良いようです。
日曜日, 12月 06, 2009
[haXe] haxelibが変?
haXeでは、haxelibコマンドを使ってライブラリを簡単にインストールすることができるハズだが、Windows環境ではhscriptがうまく入れられなった。メッセージはこちら。
この原因は2つある模様。
1つはhaxelibのバグ。本家では解決済なので、最新ソースをCVSで取得後、コンパイルすることで無事入るようになります(一応、このコンパイル後haxelib.exeを置いておきます)。
2つめはmライブラリパスの問題なようで、以下設定をすることで動くようになるハズ。
パスは完了ごとに変えて下さい(\は実際は¥で指定します)。
In project: Unexpected element tag
この原因は2つある模様。
1つはhaxelibのバグ。本家では解決済なので、最新ソースをCVSで取得後、コンパイルすることで無事入るようになります(一応、このコンパイル後haxelib.exeを置いておきます)。
2つめはmライブラリパスの問題なようで、以下設定をすることで動くようになるハズ。
set HAXE_LIBRARY_PATH=c:\Program Files\Motion-Twin\haxe\std
パスは完了ごとに変えて下さい(\は実際は¥で指定します)。
火曜日, 11月 24, 2009
[HIVE] Solrのexample/books.csvを
以下スキーマで(Solrのexamplesにある)books.csvをHIVEに取り込むことができる。
create table books (
id STRING,
cat STRING,
name STRING,
price DOUBLE,
inStock BOOLEAN,
author_t STRING,
series_t STRING,
sequence INT,
genre_s STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
取りこむのは以下コマンド。
LOAD DATA INPATH '/tmp/books.csv' overwrite into table books ;
create table books (
id STRING,
cat STRING,
name STRING,
price DOUBLE,
inStock BOOLEAN,
author_t STRING,
series_t STRING,
sequence INT,
genre_s STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
取りこむのは以下コマンド。
LOAD DATA INPATH '/tmp/books.csv' overwrite into table books ;
月曜日, 11月 09, 2009
[HIVE] 日本語が。。。
jdkのエンコードのせいだと思うのだけど(コマンドラインでUTF8は見えるから)、HIVEのコンソールでは日本語が使えない。直接cygwinのコマンドラインでなら使えるので、まぁいいのだけど。
$ /cygdrive/d/work/apache-hive/build/dist/bin/hive -hiveconf hadoop.bin.path="bash /cygdrive/d/work/apache-hadoop-0.19.2/bin/hadoop" -e "FROM zip z insert overwrite directory '/tmp/gina3' SELECT z.zip, z.pref, z.city, z.town WHERE z.ver = '2008-12-26' AND z.town REGEXP '銀座';"
@ITの記事を参考に練習中。。
$ /cygdrive/d/work/apache-hive/build/dist/bin/hive -hiveconf hadoop.bin.path="bash /cygdrive/d/work/apache-hadoop-0.19.2/bin/hadoop" -e "FROM zip z insert overwrite directory '/tmp/gina3' SELECT z.zip, z.pref, z.city, z.town WHERE z.ver = '2008-12-26' AND z.town REGEXP '銀座';"
@ITの記事を参考に練習中。。
日曜日, 11月 08, 2009
[HIVE] HIVE上からHDFS操作
HIVE上からファイルを見るには。
hive> dfs -ls /tmp;
Found 10 items
drwxr-xr-x - 00962724 mkgroup 0 2009-11-24 02:27 /tmp/00962724
drwxr-xr-x - 00962724 mkgroup 0 2009-11-03 03:24 /tmp/cy
-rw-r--r-- 1 00962724 mkgroup 2740 2009-11-23 23:44 /tmp/FirstTest.jar
drwxr-xr-x - 00962724 mkgroup 0 2009-11-09 01:21 /tmp/gina3
drwxr-xr-x - 00962724 mkgroup 0 2009-11-09 01:13 /tmp/ginza
drwxr-xr-x - 00962724 mkgroup 0 2009-11-24 02:25 /tmp/hadoop-00962724
drwxr-xr-x - 00962724 mkgroup 0 2009-11-09 01:21 /tmp/hive-00962724
drwxr-xr-x - 00962724 mkgroup 0 2009-11-09 00:16 /tmp/localfiles
drwxr-xr-x - 00962724 mkgroup 0 2009-11-09 01:08 /tmp/prefff.dat
-rw-r--r-- 1 00962724 mkgroup 6687150 2009-11-22 21:54 /tmp/sample.war
hive>
hive> dfs -ls /tmp;
Found 10 items
drwxr-xr-x - 00962724 mkgroup 0 2009-11-24 02:27 /tmp/00962724
drwxr-xr-x - 00962724 mkgroup 0 2009-11-03 03:24 /tmp/cy
-rw-r--r-- 1 00962724 mkgroup 2740 2009-11-23 23:44 /tmp/FirstTest.jar
drwxr-xr-x - 00962724 mkgroup 0 2009-11-09 01:21 /tmp/gina3
drwxr-xr-x - 00962724 mkgroup 0 2009-11-09 01:13 /tmp/ginza
drwxr-xr-x - 00962724 mkgroup 0 2009-11-24 02:25 /tmp/hadoop-00962724
drwxr-xr-x - 00962724 mkgroup 0 2009-11-09 01:21 /tmp/hive-00962724
drwxr-xr-x - 00962724 mkgroup 0 2009-11-09 00:16 /tmp/localfiles
drwxr-xr-x - 00962724 mkgroup 0 2009-11-09 01:08 /tmp/prefff.dat
-rw-r--r-- 1 00962724 mkgroup 6687150 2009-11-22 21:54 /tmp/sample.war
hive>
土曜日, 11月 07, 2009
[HIVE] HQLの関数を確認
意外に説明が充実してる。
hive> DESCRIBE FUNCTION EXTENDED substr;
OK
substr(str, pos[, len]) - returns the substring of str that starts at pos and is
of length len
pos is a 1-based index. If pos<0 the starting position is determined by counting
backwards from the end of str.
Example:
> SELECT substr('Facebook', 5) FROM src LIMIT 1;
'book'
> SELECT substr('Facebook', -5) FROM src LIMIT 1;
'ebook'
> SELECT substr('Facebook', 5, 1) FROM src LIMIT 1;
'b'
Time taken: 0.156 seconds
hive>
hive> DESCRIBE FUNCTION EXTENDED substr;
OK
substr(str, pos[, len]) - returns the substring of str that starts at pos and is
of length len
pos is a 1-based index. If pos<0 the starting position is determined by counting
backwards from the end of str.
Example:
> SELECT substr('Facebook', 5) FROM src LIMIT 1;
'book'
> SELECT substr('Facebook', -5) FROM src LIMIT 1;
'ebook'
> SELECT substr('Facebook', 5, 1) FROM src LIMIT 1;
'b'
Time taken: 0.156 seconds
hive>
金曜日, 11月 06, 2009
[HIVE] select出来た!
cygwinだと、HIVEからhadoopを呼び出すところで失敗する。なのでこのためにはhiveconfオプションにて、hadoopのまるママの実行文を書いておくべし。
00962724@XXX /cygdrive/d/work/apache-hive/build/dist/conf
$ /cygdrive/d/work/apache-hive/build/dist/bin/hive -hiveconf hadoop.bin.path="bash /cygdrive/d/work/apache-hadoop-0.19.2/bin/hadoop" -e "SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';"
また、以下のようなエラーがでるときはmetadataが壊れていた様子。
Job Submission failed with exception 'java.lang.NullPointerException(null)'
"drop table"して(このコマンドも失敗したけど、その後"show tables"してテーブルが無いようなら"create table"してloadすれば、うまく動くようになった!
Hive history file=/tmp/00962724/hive_job_log_00962724_200911060205_2037141967.txt
Total MapReduce jobs = 1
Number of reduce tasks is set to 0 since there's no reduce operator
09/11/06 02:05:32 INFO exec.ExecDriver: Number of reduce tasks is set to 0 since there's no reduce operator
09/11/06 02:05:32 INFO exec.ExecDriver: Using org.apache.hadoop.hive.ql.io.HiveInputFormat
09/11/06 02:05:32 INFO exec.ExecDriver: Processing alias a
09/11/06 02:05:32 INFO exec.ExecDriver: Adding input file file:/user/hive/warehouse/invites/ds=2008-08-15
09/11/06 02:05:34 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
09/11/06 02:05:34 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
09/11/06 02:05:34 INFO mapred.FileInputFormat: Total input paths to process : 1
Job running in-process (local Hadoop)
09/11/06 02:05:35 INFO exec.ExecDriver: Job running in-process (local Hadoop)
09/11/06 02:05:35 INFO mapred.FileInputFormat: Total input paths to process : 1
09/11/06 02:05:35 INFO mapred.MapTask: numReduceTasks: 0
09/11/06 02:05:35 INFO ExecMapper: maximum memory = 1040515072
09/11/06 02:05:35 INFO ExecMapper: conf classpath = [file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/, file:/D:/work/apache-hive/build/dist/lib/hive_exec.jar, file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/classes]
09/11/06 02:05:35 INFO ExecMapper: thread classpath = [file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/, file:/D:/work/apache-hive/build/dist/lib/hive_exec.jar, file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/classes]
09/11/06 02:05:35 INFO exec.MapOperator: Adding alias a to work list for file /user/hive/warehouse/invites/ds=2008-08-15/kv2.txt
09/11/06 02:05:35 INFO exec.MapOperator: dump TS struct<foo:int,bar:string,ds:string>
09/11/06 02:05:35 INFO ExecMapper:
<MAP>Id =10
<Children>
<TS>Id =0
<Children>
<FIL>Id =1
<Children>
<FIL>Id =2
<Children>
<SEL>Id =3
<Children>
<FS>Id =4
<Parent>Id = 3 <\Parent>
<\FS>
<\Children>
<Parent>Id = 2 <\Parent>
<\SEL>
<\Children>
<Parent>Id = 1 <\Parent>
<\FIL>
<\Children>
<Parent>Id = 0 <\Parent>
<\FIL>
<\Children>
<Parent>Id = 10 <\Parent>
<\TS>
<\Children>
<\MAP>
09/11/06 02:05:35 INFO exec.MapOperator: Initializing Self 10 MAP
09/11/06 02:05:35 INFO exec.TableScanOperator: Initializing Self 0 TS
09/11/06 02:05:35 INFO exec.TableScanOperator: Operator 0 TS initialized
09/11/06 02:05:35 INFO exec.TableScanOperator: Initializing children of 0 TS
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing child 1 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing Self 1 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Operator 1 FIL initialized
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing children of 1 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing child 2 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing Self 2 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Operator 2 FIL initialized
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing children of 2 FIL
09/11/06 02:05:35 INFO exec.SelectOperator: Initializing child 3 SEL
09/11/06 02:05:35 INFO exec.SelectOperator: Initializing Self 3 SEL
09/11/06 02:05:35 INFO exec.SelectOperator: SELECT struct<foo:int,bar:string,ds:string>
09/11/06 02:05:35 INFO exec.SelectOperator: Operator 3 SEL initialized
09/11/06 02:05:35 INFO exec.SelectOperator: Initializing children of 3 SEL
09/11/06 02:05:35 INFO exec.FileSinkOperator: Initializing child 4 FS
09/11/06 02:05:35 INFO exec.FileSinkOperator: Initializing Self 4 FS
09/11/06 02:05:35 INFO exec.FileSinkOperator: Writing to temp file: FS file:/tmp/hive-00962724/1005059804/_tmp.10001/_tmp.attempt_local_0001_m_000000_0
09/11/06 02:05:35 INFO exec.FileSinkOperator: Operator 4 FS initialized
09/11/06 02:05:35 INFO exec.FileSinkOperator: Initialization Done 4 FS
09/11/06 02:05:35 INFO exec.SelectOperator: Initialization Done 3 SEL
09/11/06 02:05:35 INFO exec.FilterOperator: Initialization Done 2 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Initialization Done 1 FIL
09/11/06 02:05:35 INFO exec.TableScanOperator: Initialization Done 0 TS
09/11/06 02:05:35 INFO exec.MapOperator: Initialization Done 10 MAP
09/11/06 02:05:35 INFO exec.MapOperator: 10 forwarding 1 rows
09/11/06 02:05:35 INFO exec.TableScanOperator: 0 forwarding 1 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 1 forwarding 1 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 2 forwarding 1 rows
09/11/06 02:05:35 INFO exec.SelectOperator: 3 forwarding 1 rows
09/11/06 02:05:35 INFO ExecMapper: ExecMapper: processing 1 rows: used memory = 2369824
09/11/06 02:05:35 INFO exec.MapOperator: 10 forwarding 10 rows
09/11/06 02:05:35 INFO exec.TableScanOperator: 0 forwarding 10 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 1 forwarding 10 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 2 forwarding 10 rows
09/11/06 02:05:35 INFO exec.SelectOperator: 3 forwarding 10 rows
09/11/06 02:05:35 INFO ExecMapper: ExecMapper: processing 10 rows: used memory = 2388056
09/11/06 02:05:35 INFO exec.MapOperator: 10 forwarding 100 rows
09/11/06 02:05:35 INFO exec.TableScanOperator: 0 forwarding 100 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 1 forwarding 100 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 2 forwarding 100 rows
09/11/06 02:05:35 INFO exec.SelectOperator: 3 forwarding 100 rows
09/11/06 02:05:35 INFO ExecMapper: ExecMapper: processing 100 rows: used memory = 2388056
09/11/06 02:05:36 INFO exec.MapOperator: 10 finished. closing...
09/11/06 02:05:36 INFO exec.MapOperator: 10 forwarded 500 rows
09/11/06 02:05:36 INFO exec.MapOperator: DESERIALIZE_ERRORS:0
09/11/06 02:05:36 INFO exec.TableScanOperator: 0 finished. closing...
09/11/06 02:05:36 INFO exec.TableScanOperator: 0 forwarded 500 rows
09/11/06 02:05:36 INFO exec.FilterOperator: 1 finished. closing...
09/11/06 02:05:36 INFO exec.FilterOperator: 1 forwarded 500 rows
09/11/06 02:05:36 INFO exec.FilterOperator: PASSED:500
09/11/06 02:05:36 INFO exec.FilterOperator: FILTERED:0
09/11/06 02:05:36 INFO exec.FilterOperator: 2 finished. closing...
09/11/06 02:05:36 INFO exec.FilterOperator: 2 forwarded 500 rows
09/11/06 02:05:36 INFO exec.FilterOperator: PASSED:500
09/11/06 02:05:36 INFO exec.FilterOperator: FILTERED:0
09/11/06 02:05:36 INFO exec.SelectOperator: 3 finished. closing...
09/11/06 02:05:36 INFO exec.SelectOperator: 3 forwarded 500 rows
09/11/06 02:05:36 INFO exec.FileSinkOperator: 4 finished. closing...
09/11/06 02:05:36 INFO exec.FileSinkOperator: 4 forwarded 0 rows
09/11/06 02:05:36 INFO exec.FileSinkOperator: Committed to output file: file:/tmp/hive-00962724/1005059804/_tmp.10001/attempt_local_0001_m_000000_0
09/11/06 02:05:36 INFO exec.SelectOperator: 3 Close done
09/11/06 02:05:36 INFO exec.FilterOperator: 2 Close done
09/11/06 02:05:36 INFO exec.FilterOperator: 1 Close done
09/11/06 02:05:36 INFO exec.TableScanOperator: 0 Close done
09/11/06 02:05:36 INFO exec.MapOperator: 10 Close done
09/11/06 02:05:36 INFO ExecMapper: ExecMapper: processed 500 rows: used memory = 2459320
09/11/06 02:05:36 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting
09/11/06 02:05:36 INFO mapred.LocalJobRunner:
09/11/06 02:05:36 INFO mapred.TaskRunner: Task attempt_local_0001_m_000000_0 is allowed to commit now
09/11/06 02:05:36 INFO mapred.FileOutputCommitter: Saved output of task 'attempt_local_0001_m_000000_0' to file:/tmp/hive-00962724/384798627
09/11/06 02:05:36 INFO mapred.LocalJobRunner: file:/user/hive/warehouse/invites/ds=2008-08-15/kv2.txt:0+5791
09/11/06 02:05:36 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000000_0' done.
2009-11-06 02:05:36,156 map = 100%, reduce = 0%
09/11/06 02:05:36 INFO exec.ExecDriver: 2009-11-06 02:05:36,156 map = 100%, reduce = 0%
Ended Job = job_local_0001
09/11/06 02:05:36 INFO exec.ExecDriver: Ended Job = job_local_0001
09/11/06 02:05:36 INFO exec.FileSinkOperator: Moving tmp dir: file:/tmp/hive-00962724/1005059804/_tmp.10001 to: file:/tmp/hive-00962724/1005059804/_tmp.10001.intermediate
09/11/06 02:05:36 INFO exec.FileSinkOperator: Moving tmp dir: file:/tmp/hive-00962724/1005059804/_tmp.10001.intermediate to: file:/tmp/hive-00962724/1005059804/10001
OK
Time taken: 27.86 seconds
00962724@XXX /cygdrive/d/work/apache-hive/build/dist/conf
00962724@XXX /cygdrive/d/work/apache-hive/build/dist/conf
$ /cygdrive/d/work/apache-hive/build/dist/bin/hive -hiveconf hadoop.bin.path=
また、以下のようなエラーがでるときはmetadataが壊れていた様子。
Job Submission failed with exception 'java.lang.NullPointerException(null)'
"drop table"して(このコマンドも失敗したけど、その後"show tables"してテーブルが無いようなら"create table"してloadすれば、うまく動くようになった!
Hive history file=/tmp/00962724/hive_job_log_00962724_200911060205_2037141967.txt
Total MapReduce jobs = 1
Number of reduce tasks is set to 0 since there's no reduce operator
09/11/06 02:05:32 INFO exec.ExecDriver: Number of reduce tasks is set to 0 since there's no reduce operator
09/11/06 02:05:32 INFO exec.ExecDriver: Using org.apache.hadoop.hive.ql.io.HiveInputFormat
09/11/06 02:05:32 INFO exec.ExecDriver: Processing alias a
09/11/06 02:05:32 INFO exec.ExecDriver: Adding input file file:/user/hive/warehouse/invites/ds=2008-08-15
09/11/06 02:05:34 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
09/11/06 02:05:34 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
09/11/06 02:05:34 INFO mapred.FileInputFormat: Total input paths to process : 1
Job running in-process (local Hadoop)
09/11/06 02:05:35 INFO exec.ExecDriver: Job running in-process (local Hadoop)
09/11/06 02:05:35 INFO mapred.FileInputFormat: Total input paths to process : 1
09/11/06 02:05:35 INFO mapred.MapTask: numReduceTasks: 0
09/11/06 02:05:35 INFO ExecMapper: maximum memory = 1040515072
09/11/06 02:05:35 INFO ExecMapper: conf classpath = [file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/, file:/D:/work/apache-hive/build/dist/lib/hive_exec.jar, file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/classes]
09/11/06 02:05:35 INFO ExecMapper: thread classpath = [file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/, file:/D:/work/apache-hive/build/dist/lib/hive_exec.jar, file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/classes]
09/11/06 02:05:35 INFO exec.MapOperator: Adding alias a to work list for file /user/hive/warehouse/invites/ds=2008-08-15/kv2.txt
09/11/06 02:05:35 INFO exec.MapOperator: dump TS struct<foo:int,bar:string,ds:string>
09/11/06 02:05:35 INFO ExecMapper:
<MAP>Id =10
<Children>
<TS>Id =0
<Children>
<FIL>Id =1
<Children>
<FIL>Id =2
<Children>
<SEL>Id =3
<Children>
<FS>Id =4
<Parent>Id = 3 <\Parent>
<\FS>
<\Children>
<Parent>Id = 2 <\Parent>
<\SEL>
<\Children>
<Parent>Id = 1 <\Parent>
<\FIL>
<\Children>
<Parent>Id = 0 <\Parent>
<\FIL>
<\Children>
<Parent>Id = 10 <\Parent>
<\TS>
<\Children>
<\MAP>
09/11/06 02:05:35 INFO exec.MapOperator: Initializing Self 10 MAP
09/11/06 02:05:35 INFO exec.TableScanOperator: Initializing Self 0 TS
09/11/06 02:05:35 INFO exec.TableScanOperator: Operator 0 TS initialized
09/11/06 02:05:35 INFO exec.TableScanOperator: Initializing children of 0 TS
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing child 1 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing Self 1 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Operator 1 FIL initialized
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing children of 1 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing child 2 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing Self 2 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Operator 2 FIL initialized
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing children of 2 FIL
09/11/06 02:05:35 INFO exec.SelectOperator: Initializing child 3 SEL
09/11/06 02:05:35 INFO exec.SelectOperator: Initializing Self 3 SEL
09/11/06 02:05:35 INFO exec.SelectOperator: SELECT struct<foo:int,bar:string,ds:string>
09/11/06 02:05:35 INFO exec.SelectOperator: Operator 3 SEL initialized
09/11/06 02:05:35 INFO exec.SelectOperator: Initializing children of 3 SEL
09/11/06 02:05:35 INFO exec.FileSinkOperator: Initializing child 4 FS
09/11/06 02:05:35 INFO exec.FileSinkOperator: Initializing Self 4 FS
09/11/06 02:05:35 INFO exec.FileSinkOperator: Writing to temp file: FS file:/tmp/hive-00962724/1005059804/_tmp.10001/_tmp.attempt_local_0001_m_000000_0
09/11/06 02:05:35 INFO exec.FileSinkOperator: Operator 4 FS initialized
09/11/06 02:05:35 INFO exec.FileSinkOperator: Initialization Done 4 FS
09/11/06 02:05:35 INFO exec.SelectOperator: Initialization Done 3 SEL
09/11/06 02:05:35 INFO exec.FilterOperator: Initialization Done 2 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Initialization Done 1 FIL
09/11/06 02:05:35 INFO exec.TableScanOperator: Initialization Done 0 TS
09/11/06 02:05:35 INFO exec.MapOperator: Initialization Done 10 MAP
09/11/06 02:05:35 INFO exec.MapOperator: 10 forwarding 1 rows
09/11/06 02:05:35 INFO exec.TableScanOperator: 0 forwarding 1 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 1 forwarding 1 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 2 forwarding 1 rows
09/11/06 02:05:35 INFO exec.SelectOperator: 3 forwarding 1 rows
09/11/06 02:05:35 INFO ExecMapper: ExecMapper: processing 1 rows: used memory = 2369824
09/11/06 02:05:35 INFO exec.MapOperator: 10 forwarding 10 rows
09/11/06 02:05:35 INFO exec.TableScanOperator: 0 forwarding 10 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 1 forwarding 10 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 2 forwarding 10 rows
09/11/06 02:05:35 INFO exec.SelectOperator: 3 forwarding 10 rows
09/11/06 02:05:35 INFO ExecMapper: ExecMapper: processing 10 rows: used memory = 2388056
09/11/06 02:05:35 INFO exec.MapOperator: 10 forwarding 100 rows
09/11/06 02:05:35 INFO exec.TableScanOperator: 0 forwarding 100 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 1 forwarding 100 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 2 forwarding 100 rows
09/11/06 02:05:35 INFO exec.SelectOperator: 3 forwarding 100 rows
09/11/06 02:05:35 INFO ExecMapper: ExecMapper: processing 100 rows: used memory = 2388056
09/11/06 02:05:36 INFO exec.MapOperator: 10 finished. closing...
09/11/06 02:05:36 INFO exec.MapOperator: 10 forwarded 500 rows
09/11/06 02:05:36 INFO exec.MapOperator: DESERIALIZE_ERRORS:0
09/11/06 02:05:36 INFO exec.TableScanOperator: 0 finished. closing...
09/11/06 02:05:36 INFO exec.TableScanOperator: 0 forwarded 500 rows
09/11/06 02:05:36 INFO exec.FilterOperator: 1 finished. closing...
09/11/06 02:05:36 INFO exec.FilterOperator: 1 forwarded 500 rows
09/11/06 02:05:36 INFO exec.FilterOperator: PASSED:500
09/11/06 02:05:36 INFO exec.FilterOperator: FILTERED:0
09/11/06 02:05:36 INFO exec.FilterOperator: 2 finished. closing...
09/11/06 02:05:36 INFO exec.FilterOperator: 2 forwarded 500 rows
09/11/06 02:05:36 INFO exec.FilterOperator: PASSED:500
09/11/06 02:05:36 INFO exec.FilterOperator: FILTERED:0
09/11/06 02:05:36 INFO exec.SelectOperator: 3 finished. closing...
09/11/06 02:05:36 INFO exec.SelectOperator: 3 forwarded 500 rows
09/11/06 02:05:36 INFO exec.FileSinkOperator: 4 finished. closing...
09/11/06 02:05:36 INFO exec.FileSinkOperator: 4 forwarded 0 rows
09/11/06 02:05:36 INFO exec.FileSinkOperator: Committed to output file: file:/tmp/hive-00962724/1005059804/_tmp.10001/attempt_local_0001_m_000000_0
09/11/06 02:05:36 INFO exec.SelectOperator: 3 Close done
09/11/06 02:05:36 INFO exec.FilterOperator: 2 Close done
09/11/06 02:05:36 INFO exec.FilterOperator: 1 Close done
09/11/06 02:05:36 INFO exec.TableScanOperator: 0 Close done
09/11/06 02:05:36 INFO exec.MapOperator: 10 Close done
09/11/06 02:05:36 INFO ExecMapper: ExecMapper: processed 500 rows: used memory = 2459320
09/11/06 02:05:36 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting
09/11/06 02:05:36 INFO mapred.LocalJobRunner:
09/11/06 02:05:36 INFO mapred.TaskRunner: Task attempt_local_0001_m_000000_0 is allowed to commit now
09/11/06 02:05:36 INFO mapred.FileOutputCommitter: Saved output of task 'attempt_local_0001_m_000000_0' to file:/tmp/hive-00962724/384798627
09/11/06 02:05:36 INFO mapred.LocalJobRunner: file:/user/hive/warehouse/invites/ds=2008-08-15/kv2.txt:0+5791
09/11/06 02:05:36 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000000_0' done.
2009-11-06 02:05:36,156 map = 100%, reduce = 0%
09/11/06 02:05:36 INFO exec.ExecDriver: 2009-11-06 02:05:36,156 map = 100%, reduce = 0%
Ended Job = job_local_0001
09/11/06 02:05:36 INFO exec.ExecDriver: Ended Job = job_local_0001
09/11/06 02:05:36 INFO exec.FileSinkOperator: Moving tmp dir: file:/tmp/hive-00962724/1005059804/_tmp.10001 to: file:/tmp/hive-00962724/1005059804/_tmp.10001.intermediate
09/11/06 02:05:36 INFO exec.FileSinkOperator: Moving tmp dir: file:/tmp/hive-00962724/1005059804/_tmp.10001.intermediate to: file:/tmp/hive-00962724/1005059804/10001
OK
Time taken: 27.86 seconds
00962724@XXX /cygdrive/d/work/apache-hive/build/dist/conf
木曜日, 11月 05, 2009
[HIVE] 準備が結構。。。
Hadoopも、JavaのScalaと同様に楽をしたいためHIVEを使おうと思って準備。したのだけど結構はまったのでメモ。
・Hadoopをインストール
HIVEにするといってもHadoopは事前に入れておく必要がある様子。このときおとなしくcygwinを入れるべし。中でdfとか使うのでbash.exeなどを入れていても(それだけでは)途中でこける。
・HIVEをインストール
ivy(というmavenみたいな構成管理ツール)が曲者。というかtrunkをsvnで取ってきたのだけど、中でもう古い、たとえばv0.19.0みたいなHadoopをdownloadしようとしてしまう。なので以下2ファイルを書き替える必要があった。
apache-hive\shims\ivy.xml
apache-hive\shims\build.xml
これらの中で、使いたいHadoopバージョンだけを残せばOK(私はv0.19.2だけを入れました)。あと、普通に入れると途中のHadoopダウンロードが遅いので、
D:\work>ant -Dhadoop.mirror="http://www.meisei-u.ac.jp/mirror/apache/dist" -Dhadoop.version=0.19.2 package
のとおり、ダウンロードサイトを指定すると吉。
補足:
cygwinのv1.7をUTF8化する方法はこちら。
・Hadoopをインストール
HIVEにするといってもHadoopは事前に入れておく必要がある様子。このときおとなしくcygwinを入れるべし。中でdfとか使うのでbash.exeなどを入れていても(それだけでは)途中でこける。
・HIVEをインストール
ivy(というmavenみたいな構成管理ツール)が曲者。というかtrunkをsvnで取ってきたのだけど、中でもう古い、たとえばv0.19.0みたいなHadoopをdownloadしようとしてしまう。なので以下2ファイルを書き替える必要があった。
apache-hive\shims\ivy.xml
apache-hive\shims\build.xml
これらの中で、使いたいHadoopバージョンだけを残せばOK(私はv0.19.2だけを入れました)。あと、普通に入れると途中のHadoopダウンロードが遅いので、
D:\work>ant -Dhadoop.mirror="http://www.meisei-u.ac.jp/mirror/apache/dist" -Dhadoop.version=0.19.2 package
のとおり、ダウンロードサイトを指定すると吉。
補足:
cygwinのv1.7をUTF8化する方法はこちら。
日曜日, 10月 25, 2009
[Solr] tikaを簡単に
curlを2回つなげると、簡単にウェブページを検索対象にできる。
konpyuta:~/work tf0054$ curl -s http://lucene.apache.org/tika/ | curl 'http://localhost:8983/solr/update/extract?literal.id=doc5&literal.url=doc5&commit=true' -F "myfile=@-"
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">76</int></lst>
</response>
konpyuta:~/work tf0054$
ちなみに、curlの"-F"オプションで指定ファイルをPOSTすることができる(ココでは前のcurlから受け取ったSTDINを流すために"-"で受けている)。
konpyuta:~/work tf0054$ curl -s http://lucene.apache.org/tika/ | curl 'http://localhost:8983/solr/update/extract?literal.id=doc5&literal.url=doc5&commit=true' -F "myfile=@-"
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">76</int></lst>
</response>
konpyuta:~/work tf0054$
ちなみに、curlの"-F"オプションで指定ファイルをPOSTすることができる(ココでは前のcurlから受け取ったSTDINを流すために"-"で受けている)。
土曜日, 10月 03, 2009
[Android] BlueLoggerを公開しました
木曜日, 9月 24, 2009
[Linux] フィード取得の偽装に関して
blogspotユーザのフィード(atomで吐いている)を解析、画像のソースを本文に引っ付けて戻す事で、その記事ページに行かなくてもリーダ上で画像を見られるようにしたい。のだけど、atomで<img src="〜">〜</img>をきちんと処理してもらうには、どうすれば良いのか分からない。。。atom:contentでcdata付けてみたけどダメ。あ、cdata付けるからだめなのかな。
木曜日, 9月 10, 2009
[Solr] GoSenをまた修正!
Luceneが2.9-rc2になったからか、またSolrでgosenが動かなくなっていたので修正しました。
lucene-ja-gosen-1.0.2.zipとして置いておきます。
lucene-ja-gosen-1.0.2.zipとして置いておきます。
登録:
投稿 (Atom)