32bit やめたい。ローカル環境でいかに逃げるかという話なので、本番では使わない。
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の最大値)が返ってくる。
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
#
by tokage-shippo
| 2016-01-04 15:09
Windows を使って開発していて、本番環境は Amazon Linux、とかそういう状況。
アップロードした画像に対して、GD の処理をしようとしたらエラーになった。
Installed GD does not support 'tmp' images
→ 「'tmp' なんて拡張子知らんがな。」
→ 私もそんなものを上げた覚えはない。
ファイルをアップロードすると、勝手に Temp フォルダに ****.tmp みたいな名前でファイルができる。
そのままいじると上記のエラーになる。どうも Mac はそんなことない模様。
Windows がローカル環境だけなら下記で逃げれば良さそう。
アップロードした画像に対して、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;
}
#
by tokage-shippo
| 2016-01-04 15:04
内容古くなっているかもしれない。
■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から実行する - きのさいと のあたりを参考に。
これで lucene-gosen/dictionary/ipadic に辞書のファイル(*.sen) ができる。
■辞書の利用
■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 {
Listtokens = new ArrayList<>();
TAGGER.analyze(text, tokens);
for(Token token : tokens) {
log.info(token.getSurface() + "\t" + token.getMorpheme().getPartOfSpeech());
}
log.info("----------------------------------------");
}
DicUtil.analyze("プリンスメロン"); // プリンスメロン 名詞-一般-野菜
#
by tokage-shippo
| 2016-01-04 14:56
$ git log --pretty=format:"%h%x09%ad%x09%s" --date=short > log.txt
これで、短いハッシュ・日付・コミットログ がタブ区切りで取得できる。(%x09 がタブになる)
Git - コミット履歴の閲覧
これで、短いハッシュ・日付・コミットログ がタブ区切りで取得できる。(%x09 がタブになる)
Git - コミット履歴の閲覧
#
by tokage-shippo
| 2016-01-04 14:48
SimpleFacetParameters - Solr Wiki
wiki に書いてあることがすべて、なんだけれども、「solr facet 条件 上書き」とか日本語でうまく探せなくて困ったので残しておく。
以下、例は wiki に書いてあるものを使う。
上記のように、doctype フィールドが普通の値(マルチバリューじゃない)だと、doctype:pdf で検索しているとき、そのままでは pdf 以外のファセットが 0件になってしまう。
wiki の通り、以下のように、条件にタグ付け({!tag=dt})をして、facet.field で除外条件({!ex=dt})を設定すると、ファセットの検索のときだけ、除外したい条件が無効化された検索が行われる。
■
さて、これを Solarium で書くとどうなるか。
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);
#
by tokage-shippo
| 2015-12-14 18:53