自作自演
2016-01-04T15:09:34+09:00
tokage-shippo
Firefox の話題を中心に Web 関係の話も扱うつもりの雑記。だった。
Excite Blog
PHP 32bit版でタイムスタンプを取るメモ
http://zisakuzien.exblog.jp/24021279/
2016-01-04T15:09:40+09:00
2016-01-04T15:09:34+09:00
2016-01-04T15:09:34+09:00
tokage-shippo
未分類
date_create_from_format('Y-m-d H:i:s', '2038-01-19 12:14:08')->getTimestamp()
は 32bit 環境だと false が返ってくる。悲しい。
date_create_from_format('Y-m-d H:i:s', '2038-01-19 12:14:08')->format('U')
は 32bit でも、タイムスタンプとして正しい文字列が返ってくる。
(int) date_create_from_format('Y-m-d H:i:s', '2038-01-19 12:14:08')->format('U')
は 32bit だと、2038-01-19 12:14:07 と同じ数値(要するにintの最大値)が返ってくる。
php -r "var_dump(date_create_from_format('Y-m-d H:i:s', '2038-01-19 12:14:08')->getTimestamp());"
bool(false)
php -r "var_dump(date_create_from_format('Y-m-d H:i:s', '2038-01-19 12:14:08')->format('U'));"
string(10) "2147483648"
php -r "var_dump((int) date_create_from_format('Y-m-d H:i:s', '2038-01-19 12:14:08')->format('U'));"
int(2147483647)
php -r "var_dump(PHP_INT_MAX);"
int(2147483647)
php -r "echo PHP_INT_SIZE;"
4]]>
PHP + Windows + GD でアップロードした画像ファイルにはまったメモ
http://zisakuzien.exblog.jp/24021258/
2016-01-04T15:04:05+09:00
2016-01-04T15:03:59+09:00
2016-01-04T15:03:59+09:00
tokage-shippo
未分類
アップロードした画像に対して、GD の処理をしようとしたらエラーになった。
Installed GD does not support 'tmp' images
→ 「'tmp' なんて拡張子知らんがな。」
→ 私もそんなものを上げた覚えはない。
ファイルをアップロードすると、勝手に Temp フォルダに ****.tmp みたいな名前でファイルができる。
そのままいじると上記のエラーになる。どうも Mac はそんなことない模様。
Windows がローカル環境だけなら下記で逃げれば良さそう。
$file_info = $_FILES[$key];
// Windows の時だけ元のファイルの拡張子を付けてやる。さもないと .tmp という謎の拡張子になって GD がしぬ。
// Installed GD does not support 'tmp' images
if (PHP_OS == 'WINNT') {
$oldname = $file_info['tmp_name'];
$newname = $file_info['tmp_name'] . '.' . pathinfo($file_info['name'], PATHINFO_EXTENSION);
rename($oldname, $newname);
$file_info['tmp_name'] = $newname;
}]]>
Gosen で辞書を作るメモ
http://zisakuzien.exblog.jp/24021233/
2016-01-04T14:56:22+09:00
2016-01-04T14:56:16+09:00
2016-01-04T14:56:16+09:00
tokage-shippo
未分類
■jar のダウンロード
https://code.google.com/p/lucene-gosen/
このサイトの左下の方の Links の中に External links として「Downloads lucene-gosen 4.8.1」のリンクがあり、Google Drive に遷移するはずなので、そこからダウンロードする。
ページ上部の Download からは古いものがダウンロードできる。罠っぽい。
今回の用途なら lucene-gosen-4.8.1.jar のように辞書の名前のついていない jar を取得すればよい。
ビルドパスに追加しておく。
■ソースのダウンロード(チェックアウト)
辞書生成のために必要。
https://code.google.com/p/lucene-gosen/source/checkout
ここに SVN の URL が書かれているので、チェックアウトする。
dictionary のフォルダを使う。(ので、この用途だとそれ以外は不要っぽい。)
辞書生成
■Ant 準備
Java から ant を使えるようにする。
http://ant.apache.org/bindownload.cgi ダウンロードして ant.jar と ant-launcher.jar をビルドパスに追加しておく。
Eclipse からの実行で「JDK がない」みたいなメッセージのエラーになった場合は、tools.jar をビルドパスに追加すると解消するかもしれない。JDK の下の lib の中にある。Eclipse から実行すると JRE での実行になってしまい tools.jar が見つからないと思われるが、この辺の理解はあいまい。
■追加の辞書ファイル
Java製形態素解析ライブラリ「lucene-gosen」を試してみる
lucene-gosenの辞書編集方法 - エメラルドアオキロック
この辺を参考に。
プリンスメロン,1229,名詞,一般,野菜,*,*,*,プリンスメロン,プリンスメロン,プリンスメロン
こんな感じの CSV ファイルを作る。
メロンよりも桃が好きです。それはそれとして、デフォの辞書のままだと プリンス / メロン の2単語に解釈される。
ビルドの際、追加の csv ファイルの場所はフルパスで指定できるので、配置場所はどこでもよい。(lucene-gosen の外で良い)
2カラム目はコスト。
チェックアウトした lucene-gosen の dictionary の下に ipadic のディレクトリがあり、この中に dictionary.csv というファイルがある。これがデフォルトの辞書になっている。トマトなどの野菜の名称は 3000~4000 くらいのようなので、追加の単語はこれより小さいコストを設定する。
なんとなくで、(int) (2000 / Math.sqrt(Math.sqrt(文字数))) をコストとした。
3カラム目からが品詞の種類。
dictionary.csv と同じディレクトリにある connection.csv に連接コストの定義が書いてあるがなるべく手をつけたくないので、追加の単語の品詞は、デフォで存在するものにする。
今回であれば 名詞,一般,野菜 のように。名詞,野菜,* のようにしてしまうと、連接コストの定義がないためか、追加した単語が出てこなくなってしまう。
■辞書のビルド
lucene-gosen 直下と lucene-gosen/dictionary の下の両方に build.xml が存在する。
辞書のビルドなので使うのは dictionary の下の方。
Java/Ant/Javaから実行する - きのさいと のあたりを参考に。
private static final String BUILD_XML = "lucene-gosen/dictionary/build.xmlの場所";
private static final String ADD_DIC_FILE = "追加の単語.csv";
// 辞書のビルド
Project project = new Project();
project.init();
ProjectHelper.getProjectHelper()
.parse(project, new File(BUILD_XML));
project.addBuildListener(getBuildLogger());
project.executeTarget("clean-sen");
project.setNewProperty("dictype", "ipadic");
project.setNewProperty("custom.dics", ADD_DIC_FILE);
project.executeTarget("compile");
private static BuildLogger getBuildLogger() {
BuildLogger buildLogger = new DefaultLogger();
buildLogger.setMessageOutputLevel(Project.MSG_INFO);
buildLogger.setOutputPrintStream(new PrintStream(System.out));
buildLogger.setErrorPrintStream(new PrintStream(System.err));
buildLogger.setEmacsMode(false);
return buildLogger;
}
これで lucene-gosen/dictionary/ipadic に辞書のファイル(*.sen) ができる。
■辞書の利用
private static final String DIC_DIR = "lucen-gosen/dictionary/ipadicの場所";
private static final StringTagger TAGGER = SenFactory.getStringTagger(DIC_DIR);
public static void analyze(String text) throws IOException {
List tokens = new ArrayList<>();
TAGGER.analyze(text, tokens);
for(Token token : tokens) {
log.info(token.getSurface() + "\t" + token.getMorpheme().getPartOfSpeech());
}
log.info("----------------------------------------");
}
DicUtil.analyze("プリンスメロン"); // プリンスメロン 名詞-一般-野菜
]]>
git で履歴の一覧を取得するメモ
http://zisakuzien.exblog.jp/24021216/
2016-01-04T14:48:52+09:00
2016-01-04T14:48:46+09:00
2016-01-04T14:48:46+09:00
tokage-shippo
未分類
log.txt
これで、短いハッシュ・日付・コミットログ がタブ区切りで取得できる。(%x09 がタブになる)
Git - コミット履歴の閲覧]]>
Solr のファセット取得時に一部条件を打ち消したかった。
http://zisakuzien.exblog.jp/23961948/
2015-12-14T18:53:00+09:00
2015-12-14T18:54:14+09:00
2015-12-14T18:52:51+09:00
tokage-shippo
未分類
wiki に書いてあることがすべて、なんだけれども、「solr facet 条件 上書き」とか日本語でうまく探せなくて困ったので残しておく。
以下、例は wiki に書いてあるものを使う。
=== Document Type ===
[ ] Word (42)
[x] PDF (96)
[ ] Excel(11)
[ ] HTML (63)
上記のように、doctype フィールドが普通の値(マルチバリューじゃない)だと、doctype:pdf で検索しているとき、そのままでは pdf 以外のファセットが 0件になってしまう。
wiki の通り、以下のように、条件にタグ付け({!tag=dt})をして、facet.field で除外条件({!ex=dt})を設定すると、ファセットの検索のときだけ、除外したい条件が無効化された検索が行われる。
fq={!tag=dt}doctype:pdf&facet=on&facet.field={!ex=dt}doctype
■
さて、これを Solarium で書くとどうなるか。
// 適当にクライアントを作る
$client = new Solarium\Client($config);
// 普通にクエリを用意するが、doctype については addTag をしておく
$query = $client->createQuery($client::QUERY_SELECT);
$query->setQuery('*:*');
$query->createFilterQuery('fq_status')->setQuery('status:public');
$query->createFilterQuery('fq_doctype')->setQuery('doctype:pdf')->addTag('tag_doctype');
// ファセットのフィールドを指定する際に addExclude でタグを指定する
$facetSet = $query->getFacetSet();
$facetSet->createFacetField('facet_doctype')->setField('doctype')->addExclude('tag_doctype');
$facetSet->setMinCount(1);
// 検索する
$resultset = $client->execute($query);
]]>
CentOS5 に MySQL5.6 を yum で入れる。
http://zisakuzien.exblog.jp/23831811/
2015-11-02T15:27:08+09:00
2015-11-02T15:26:00+09:00
2015-11-02T15:26:00+09:00
tokage-shippo
未分類
MySQL :: A Quick Guide to Using the MySQL Yum Repository
公式の yum リポジトリから MySQL をインストール - akishin999の日記
上記ページを参考にした。
まず、yum リポジトリの追加が必要なので、公式から rpm を取得。
MySQL :: Download MySQL Yum Repository
Download ボタンを押すと、ログインボタンが大きく表示されるが、
ページ下部に地味に「No thanks, just start my download.」のリンクがあるので
そちらを使うとログインせずにダウンロードができる。
ダウンロードした rpm を以下のようなコマンドでインストール(ファイル名はダウンロードしたものに読み替え)。
sudo rpm -Uvh platform-and-version-specific-package-name.rpm
2015年11月現在、デフォルトで 5.6 ではなく 5.7 が有効になっているので、リポジトリの設定を編集する。
sudo vim /etc/yum.repos.d/mysql-community.repo
以下のように、5.6 のほうが enabled=1 に、5.7 のほうは enabled=0 になるように変更する。
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/5/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/5/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
なお、ここで yum search mysql をしても、mysql56-*** のようなパッケージは出てこない。
mysql-community-client.x86_64 等が新たに引っかかるようになっていれば OK。
MySQL5.1 が残っていたからか、下記コマンドで 5.6 が入った。
sudo yum update mysql-server
MySQL5.5 が残ったので、残ったものを調べて消す。
yum list installed | grep mysql
sudo yum remove mysql55 mysql55-mysql mysql55-mysql-libs mysql55-runtime
MySQL を再起動して、upgrade コマンドを実行。
sudo /etc/init.d/mysqld stop
sudo /etc/init.d/mysqld start
sudo mysql_upgrade -uroot -p
MySQL にログインして、\s でサーバのバージョンが 5.6 になっていれば完了。
]]>
typeahead 0.11.1 が動かない時がある?
http://zisakuzien.exblog.jp/23668850/
2015-09-13T11:32:59+09:00
2015-09-13T11:32:55+09:00
2015-09-13T11:32:55+09:00
tokage-shippo
未分類
日本語で検索しても、全然ヒットしなかったので、書いておきます。
■結論
Fixed rendered item counts for async remote typeahead. by ztratar · Pull Request #1367 · twitter/typeahead.js · GitHub
のバグを踏んだ。
■対応
A. 上記のプルリクが本体に取り込まれるのを待つ。
B. プルリクの URL の .patch をつけてアクセスするとバッチが取得できるので自力でそれを当てる。
■現象
入力時、Bloodhound に設定した remote の URL からは正常にサジェスト結果が取れる。
が、limit の件数に近い件数が取得できると何も表示されない。
limit が5件の時、2件までは正常に表示できるが、
3件取得できた時は2件、4件取得時は1件表示される。
そして、5件取得時(limit と同じ件数いっぱいまで取れた時)は何も表示されない。
■感想
頑張ってプルリクのタイトルくらい読めばもっと早く解決したのでは。
(自分でデバッガで追って大変だった…)]]>
PhalconPHP で boolean の値が保存できない?
http://zisakuzien.exblog.jp/23520519/
2015-08-04T16:07:56+09:00
2015-08-04T16:07:48+09:00
2015-08-04T16:07:48+09:00
tokage-shippo
未分類
hoge_flag tinyint(1) not null というカラムの定義で
boolean の値を保存したかった。
$hoge = true; //何か判定した結果とか、外部から設定するとか。
$model = new Piyo();
$model->hoge_flag = $hoge;
$model->save();
ってやっても保存できない。
$model->getMessages() で取れるエラーメッセージを確認すると
hoge_flag is required とのこと。
セットしたのに required って言われても…
$model->hoge_flag = $hoge; //$hoge は true か false
ではなく、
$model->hoge_flag = $hoge ? 1 : 0; //$hoge は同上
とすると無事に保存できた。
tinyint なので、確かに数字を入れるべきだとは思う…が、他の ORM は何とかしてくれていたのでなかなか気づかなかった…
これにはまるの少なくとも2度目、もしかしたらもっとなので、雑だけどメモ。
]]>
PHP で大きいファイルを添付すると $_POST が空になる?
http://zisakuzien.exblog.jp/23210233/
2015-06-04T12:15:03+09:00
2015-06-04T12:15:04+09:00
2015-06-04T12:15:04+09:00
tokage-shippo
未分類
大きな添付ファイルを送りたい
↓
upload_max_filesize を大きくしよう (10M)
↓
試しに POST で 10M弱のファイルを送ってみよう
↓
特にエラーも出ず、ただ $_POST が空になってしまう!
■原因と対応
post_max_size ≧ upload_max_filesize でないといけないのにデフォルトの 8M のままだった。
こちらも 10M に変更したところ、$_POST の中身が取れるようになった。
■マニュアル
post_max_size
upload_max_filesize
memory_limit
post_max_size の項に細かい説明が書かれている。
memory_limit ≧ post_max_size ≧ upload_max_filesize のサイズで設定しないといけない。
POSTデータの大きさが、post_max_sizeより大きい場合、 $_POST と $_FILES superglobals は空になります。
■感想
黙って空にしないで、Warning か何か出してほしいなー、と思いました><
]]>
Flame 買った。
http://zisakuzien.exblog.jp/22843059/
2015-03-01T00:02:00+09:00
2015-03-01T00:24:08+09:00
2015-03-01T00:01:45+09:00
tokage-shippo
未分類
アップデートなど自分用にまとめる。Mac 使用。
■まず
後にどんな作業をするにしろ、説定画面を開いて
端末情報 → その他の情報 → 開発者メニュー を有効化。
開発者 → USB経由のデバッグで ADBと開発ツール を選択。
(買った直後はメニューがちょっと違うので MDN を確認する。)
adb devices で接続できているか確認できる。
■困ったら?
Fastboot モードで起動して、Base image を入れれば良いかも?
ボリュームキーと電源ボタンを同時押しして起動する。
■Flameを更新する - Mozilla | MDN
Updating your Flame - Mozilla | MDN 英語の記事のほうが新しいかも。
Base image v18D.zip をダウンロード、解凍。
./flash.sh
初期化されるけど、この次の工程でも初期化されるので日時設定は適当で良い。
Latest master builds から
b2g-XX.XX.en-US.android-arm.tar.gz と gaia.zip をダウンロード。
shallow flash script をダウンロード。
./shallow_flash.sh -g gaia.zip -G b2g-XX.XX.en-US.android-arm.tar.gz
■mozilla-japan/iwnn-ime-sample · GitHub
日本語入力ができるようになる。
チェックアウトするか、zip でダウンロードして解凍する。
Mac・Linux の場合、sed の種類を確認する。GNU sed だった場合、install.sh を編集する。
96行目のコメントアウトを外して、98・99行目をコメントアウトする。
ここをしくじったまま先に進んでしまうと、ひらがなは入力できても、変換が一切できない状態になってしまう。
./install.sh
Firefox を起動して、Shift + F8 で WebIDE を起動。(Firefox は起動済みなら再起動)
ランタイムを選択 → USB デバイスに Flame が出るはずなので選択。
左のプルダウンから iWnn IME を選択 → ウィンドウ中央の再生ボタンぽいボタンを押す。
(最初は WebIDE でパッケージ型アプリとして iWnn IME を開く必要がある。)
■dynamis/firefoxos-patch · GitHub
APN設定と FM の設定。
patch-apn.sh を少し変えないと動かなかった。
29行目を下記にする。
$ADB shell mount -o rw,remount /system
./patch-apn.sh
./patch-fmradio.sh
Flame 再起動
■
一通り流し終わったらゆっくり日時等の説定を確認する。
特に、日時は自動設定が選択されていると違う時間になってしまったので、
何度か確認しておかしくなったら自動説定を解除して自分で設定する。
FM の確認はイヤホンが必要。
■追記
@Yuhshi ベースイメージはv18D (FxOS 2.0) が出てますよ。 https://developer.mozilla.org/en-US/Firefox_OS/Phone_guide/Flame/Updating_your_Flame
というリプライをmarさんから頂いたので上の方に追記しました。ありがとうございます。
]]>
kindle に HTML を送ってみたメモ
http://zisakuzien.exblog.jp/22328056/
2014-08-24T23:06:00+09:00
2014-08-24T23:06:18+09:00
2014-08-24T23:06:18+09:00
tokage-shippo
未分類
それに関して色々メモ。
■kindle に関して
Android に kindle アプリを入れれば使える。
Send-to-Kindle の機能で、Amazon 側に指定されたメールアドレスに
HTML ファイル等を添付して送ると、kindle で読めるようになる。
■HTML の変換
最初は取得した HTML をほぼそのまま kindle に読ませたが
それでは HTML の構造が複雑なのか遅かった。
見出し(h1)と本文(p)の繰り返しになるように詰めなおしたら
kindle 上でもさくさく読めるようになった。
PHP で UTF-8 以外の HTML を読むときは
文字コードを UTF-8 に変換した上で、
meta タグの Content-Type で UTF-8 を指定するように書き換えた上で
DOMDocument に読み込ませれば文字化けしない。
元のドキュメントから、シンプルなドキュメントに詰めなおすときは
そのままでは appendChild できない。
importNode メソッドで、別ドキュメントにノードをコピーできる。
■メール送信
uuencode コマンドと mailx コマンドで添付ファイルを送ろうとしたが
kindle では添付ファイルがあると認識されなかった。
(添付ファイルがない旨のエラーメールが返ってきた。)
Kindle に sendmail で届け - Slip Ahead Logging
上記のスクリプトを使ったところ、ちゃんと kindle で認識された。
■送ったファイルの削除
Send-to-Kindle のファイルがたまっていくのは
PC から下記のブックマークレットを使って、
My Kindle → パーソナル・ドキュメントのページから削除する。
(ブックマークレット使わないと1つ1つ削除・ページ読み込みになってつらい。)
Kindle Library Bulk Delete - Overanalyze
■感想
Send-to-Kindle で HTML ファイルを送る場合、
mobi ファイルを作る場合と違って、目次等はいらないし、
HTML の構造はかなり適当で良い。
Wi-fi のある環境で kindle を開けば同期も早いし、
同期が済めば電波の悪い場所でも問題ないので結構快適。
]]>
mysqldump で取ったダンプが別の MySQL に入らなかった
http://zisakuzien.exblog.jp/22264364/
2014-08-05T17:51:47+09:00
2014-08-05T17:51:38+09:00
2014-08-05T17:51:38+09:00
tokage-shippo
未分類
・サーバB で mysql < ダンプ という感じでダンプをインポートしようとする
・シンタックスエラー多発
という状態になって困りました。
【MySQL】互換性の都合でダンプが流し込めない時 at softelメモ
mysqldump のオプションに --compatible=ansi をつけることでシンタックスエラーはなくなりました。
インポート時に Duplicate entry のエラーが1つだけ出てしまいましたが、
検証用のデータとしてほしかっただけだったので、原因追求はせずに
下記を参考に mysql コマンドのオプションに -f をつけて無理やり流し込みました。
[MySQL]エラーを無視してsqlファイルをインポートする | のぶろぐ
]]>
#SECCON 2014 オンライン予選(日本語)に参加してみた
http://zisakuzien.exblog.jp/22219681/
2014-07-21T12:14:00+09:00
2014-07-22T00:01:53+09:00
2014-07-21T12:14:09+09:00
tokage-shippo
未分類
ありがたいまとめ→ SECCON 2014 CTF オンライン予選 みんなのWrite-upまとめ - sonickunのブログ
入門向けワークショップの CTF for GIRLS に参加したので
全く手も足も出ない、という状態にはならなかったのですが、
暗黙のルールみたいなのがいくつかあってやっぱり敷居高いなぁと思いました。
・問題で exe ファイルが渡される (Windows ないと困る)
CTF for GIRLS で Windows の VM が配布されたので、
もしや、と思って Windows のマシンで参加したので良かったです。
Mac だったら modern.IE を落としてきて使うことでカバーするのかなと思いますが
特に参加要項にも Windows が必要とは書かれていなかったので
知らなければ時間かかってつらそうだと感じました。
・問題で ELF 形式のファイルが渡される
Ubuntu とか CentOS とかなんか入っているよね常識的に考えて、ということなんでしょうか…
私も検証用に CentOS 入れていたのでそれを使いました。
・フラグは flag.txt というファイルに入っていることもある。
これは CTF for GIRLS ではまりました。
・Write up とは一体。
解き方をブログとかに書くものっぽいです。
Write up とは、でググっても常識すぎるのかずばりな答えが出ない…
問題に関して。
・練習問題
もたもた準備をしていたらチームメイトが回答していた。
・decode me
チームメイトが最初の数文字をずらすと SECCON になっていると言う。
→適当にずらそうとするがいまいち。というかそもそもアルファベットじゃない文字がある。
→適当にずらした問題文に rot13/47 と書いてある
→暗号、SSL、SSH
→nkf -r を使うとのこと。
→ローカルに nkf なかったのでレンタルサーバで実行。
・捏造された契約書を暴け
2012年5月の日時のファイルがたくさん残っていたが
その更新日をいくつか入力しても正解にならなかった。
未割当の領域に残っていたファイル?を取得して
バイナリエディタで 201 で検索して出てきた日付を入れたら通った。
・重ねてみよう
gif アニメが出てきた
→GIMP に入れたら1コマ1レイヤーになった
→レイヤーのモードを「比較(明)」に全部直して重ねる
→反転したらスマホで読める QR コードになった
→スマホで読んだらフラグが出てきた
感想。
一応リアル知人捕まえて2人チームで出ましたが、
CTF 向けの知識量がいまいちでだいたい自分ひとりでスコアをとった気分でした…
ランキング見るとかろうじて2桁になったのはがんばれたのかなと。
(同点で3桁のチームもありますが…)
勉強のとっかかりが CTF for GIRLS で少しは得られたと思うのですが
とにかく経験というか引き出しの多さが問われる感じで
ひとりで一体どう勉強したら…という気持ちはより強くなりました…
追記
https://twitter.com/shiracamus/status/491067943648645121
@Yuhshi 一人勉強はwriteup見て自分の手を動かして検証するのが早道です。
世界中のCTFのwriteup も沢山。
https://ctftime.org/writeups
過去問バイナリはここにあるかも。
http://shell-storm.org/repo/CTF/
世界CTFにも是非挑戦。
というリプライを頂きました。
今回の他の人の解き方から、他の CTF の解き方も見て行くと良さそうです。
]]>
XULRunner のサンプルプロジェクトが動かなかった。
http://zisakuzien.exblog.jp/22094770/
2014-06-09T13:03:24+09:00
2014-06-09T13:02:26+09:00
2014-06-09T13:02:26+09:00
tokage-shippo
未分類
この記事の下部にサンプルプロジェクトのリンクがありますが、
これは古い XULRunner (1.9.2以前) でないと動きません。
下記の方法で XULRunner 30.0 で動作するようになります。
サンプルプロジェクト → http://developer.mozilla.org/samples/xulrunner/myapp.zip
理由は chrome.manifest の位置を変えないといけないためです。
Chrome Registration | MDN
Gecko 1.9.2 およびそれ以前では、Mozilla はアプリケーションのルートから見て chrome/*.manifest の位置にあるマニフェストファイルも読み込みます。Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1) 以降では、ルートに置かれた chrome.manifest だけがマニフェストファイルとして利用されます
サンプルだと
/myapp/chrome/chrome.manifest の位置にファイルが置かれていますが
/myapp/chrome.manifest に移動しないといけないです。
また、これに伴い chrome.manifest の内容も、相対パスになっているため
content myapp file:content/ ではなく
content myapp file:chrome/content/ に書き換えないといけないです。
]]>
Java から CloudSearch を使ってみた。
http://zisakuzien.exblog.jp/22057715/
2014-05-28T14:44:04+09:00
2014-05-28T14:43:37+09:00
2014-05-28T14:43:37+09:00
tokage-shippo
未分類
Amazon CloudSearchのクライアントプログラミング | shinodogg.com
Amazon CloudSearch 用 deleteByQuery を書きました。 - よしだのブログ
What Is Amazon CloudSearch? - Amazon CloudSearch
Overview (AWS SDK for Java - 1.7.11)
以下、適当に書いてたものをブログに載せても差し支えないように
伏せたり直したりしているので、動かなかった時はごめんなさい。試してないです。
■準備
SDK などをダウンロードしてビルドパスを追加しておく。
AWS SDK for Java | アマゾン ウェブ サービス(AWS 日本語)
Joda - Time - Browse /joda-time at SourceForge.net (2.3 を利用)
Commons Logging - Download Commons Logging (1.1.3 を利用)
Apache HttpComponents - HttpComponents Downloads(httpclient-4.3.3.jar と httpcore-4.3.2.jar を利用)
JacksonDownload - FasterXML Wiki (jackson-annotations-2.2.3.jar、jackson-core-2.2.3.jar、jackson-databind-2.2.3.jar を利用)
■ドメインを作る
認証情報を AwsCredentials.properties ファイルに書いておく。
accessKey = xxxxxxxxxxxxxxxxxxxx
secretKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
アクセスポリシーの設定を JSON 形式で用意しておく。
(下記は特定のIPアドレスからのみすべての操作を受け付ける)
{
"Version":"2012-10-17",
"Statement":
[{
"Resource": "arn:aws:cloudsearch:ap-northeast-1:xxxxxxxxxxxx:domain/piyo",
"Effect": "Allow",
"Sid":"1",
"Action": "cloudsearch:*",
"Condition": {
"IpAddress": {
"aws:SourceIp": ["xxx.xxx.xxx.xxx/xxx"]
}
},
"Principal": {
"AWS": ["*"]
}
}]
}
AmazonCloudSearchClient client = new AmazonCloudSearchClient(
new PropertiesCredentials(
CreateDomain.class.getResourceAsStream("/AwsCredentials.properties")));
client.setRegion(Region.getRegion(Regions.AP_NORTHEAST_1));
// 作るドメインの設定
CreateDomainRequest request = new CreateDomainRequest();
request.setDomainName("piyo"); //好きな名前を付ける
// ドメイン作る
CreateDomainResult result = client.createDomain(request);
// アクセスポリシー設定
String policiesJson = ポリシーを書いた JSON の文字列;
UpdateServiceAccessPoliciesRequest policiesRequest = new UpdateServiceAccessPoliciesRequest();
policiesRequest.setDomainName(domainStatus.getDomainName());
policiesRequest.setAccessPolicies(policiesJson);
UpdateServiceAccessPoliciesResult policiesResult = client
.updateServiceAccessPolicies(policiesRequest);
■フィールド設定
AmazonCloudSearchClient client = new AmazonCloudSearchClient(
new PropertiesCredentials(
CreateDomain.class.getResourceAsStream("/AwsCredentials.properties")));
client.setRegion(Region.getRegion(Regions.AP_NORTHEAST_1));
DefineIndexFieldRequest request = new DefineIndexFieldRequest();
request.setDomainName("piyo");
IndexField field = new IndexField();
field.setIndexFieldName("title"); // 好きなフィールド名をつける
field.setIndexFieldType(IndexFieldType.Text); // com.amazonaws.services.cloudsearchv2.model.IndexFieldType
request.setIndexField(field);
DefineIndexFieldResult result = client.defineIndexField(request);
インデックス生成のリクエスト (時間かかるかも)IndexDocumentsRequest request = new IndexDocumentsRequest();
request.setDomainName("piyo");
client.indexDocuments(request);
■追加・削除の post 用のメソッド
URL は固定してしまっていますが、それ以外はただ指定の URL に json を post するだけです。
DefaultHttpClient は非推奨になってたので違う方法で HttpClient を作るようにしました。
public static String postBatch(HttpClient client, String json)
throws IOException {
HttpPost post = new HttpPost("http://doc-piyo-xxxxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.cloudsearch.amazonaws.com/2013-01-01/documents/batch");
StringEntity stringEntity = new StringEntity(json,
StandardCharsets.UTF_8);
stringEntity.setContentType("application/json");
post.setEntity(stringEntity);
HttpResponse response = client.execute(post);
String responseString = EntityUtils.toString(response.getEntity());
return responseString;
}
public static HttpClient createHttpClient() {
// 適当に…
int connectTimeout = 1000 * 30;
int socketTimeout = 1000 * 30;
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(connectTimeout)
.setSocketTimeout(socketTimeout).build();
List<Header> headers = new ArrayList<>();
headers.add(new BasicHeader("Accept-Charset", "utf-8"));
HttpClient client = HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.setDefaultHeaders(headers).build();
return client;
}
■追加・削除
下記のような感じに追加・削除するドキュメントのデータを JSON 形式で用意し
所定の URL に post する。
[
{"type": "add",
"id": "piyo0001",
"fields": {
"title": "ひよこものがたり"
}
},
{"type": "delete",
"id": "piyo0002"
}
]
形式については Preparing Your Data for Amazon CloudSearch - Amazon CloudSearch を参照。
投入したデータの一部だけを「修正」する機能はないので、
修正したい場合はその id のデータをまるごともう一度 type=add で送る。
■全件削除
雑すぎる例外処理、そして getDeleteAllList()と言いながら特にループとかしてないので
これだと件数が多い時は全件取れないです…
今のところ新しく渡したデータに全とっかえして、古いデータを全部捨てる、みたいな機能はないので、
古いものを全部消したければ自分で指定して消さないといけないです。
(下記の ObjectMapper は com.fasterxml.jackson.databind.ObjectMapper です。)
public static void main(String[] args) {
try {
log.info("削除対象を取得します。");
List<Map<String, ?>> deleteMap = getDeleteAllList();
log.info(deleteMap.size() + "件の削除対象がありました。");
ObjectMapper mapper = new ObjectMapper();
HttpClient client = createHttpClient();
postBatch(client, mapper.writeValueAsString(deleteMap));
log.info("処理がすべて完了しました。");
} catch (Exception e) {
log.error("ダメだった(´・ω・`)", e);
}
}
@SuppressWarnings("unchecked")
public static List<Map<String, ?>> getDeleteAllList() throws Exception {
ObjectMapper mapper = new ObjectMapper();
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("q", "*:*"));
params.add(new BasicNameValuePair("q.parser", "lucene"));
params.add(new BasicNameValuePair("return", "id"));
params.add(new BasicNameValuePair("size", "10000"));
List<Map<String, ?>> root = new ArrayList<>();
String responseString = getSearch(params);
Map<String, ?> map = mapper.readValue(responseString, Map.class);
System.out.println(map);
for (Map<String, ?> hit : (List<Map<String, ?>>) ((Map<String, ?>) map
.get("hits")).get("hit")) {
Map<String, String> data = new HashMap<>();
data.put("id", (String) hit.get("id"));
data.put("type", "delete");
root.add(data);
}
return root;
}
public static String getSearch(List<NameValuePair> params)
throws IOException {
HttpClient client = createHttpClient();
HttpGet get = new HttpGet("http://doc-piyo-xxxxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.cloudsearch.amazonaws.com/2013-01-01/search?"
+ URLEncodedUtils.format(params, "UTF-8"));
HttpResponse response = client.execute(get);
return EntityUtils.toString(response.getEntity());
}
]]>
https://www.excite.co.jp/
https://www.exblog.jp/
https://ssl2.excite.co.jp/