自作自演

Firefox の話題を中心に Web 関係の話も扱うつもりの雑記。だった。
zisakuzien.exblog.jp

Top

PHP 32bit版でタイムスタンプを取るメモ

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の最大値)が返ってくる。

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

[PR]
# by tokage-shippo | 2016-01-04 15:09

PHP + Windows + GD でアップロードした画像ファイルにはまったメモ

Windows を使って開発していて、本番環境は Amazon Linux、とかそういう状況。

アップロードした画像に対して、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;
}

[PR]
# by tokage-shippo | 2016-01-04 15:04

Gosen で辞書を作るメモ

内容古くなっているかもしれない。




■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("プリンスメロン");    // プリンスメロン 名詞-一般-野菜

[PR]
# by tokage-shippo | 2016-01-04 14:56

git で履歴の一覧を取得するメモ

$ git log --pretty=format:"%h%x09%ad%x09%s" --date=short > log.txt
これで、短いハッシュ・日付・コミットログ がタブ区切りで取得できる。(%x09 がタブになる)

Git - コミット履歴の閲覧
[PR]
# by tokage-shippo | 2016-01-04 14:48

Solr のファセット取得時に一部条件を打ち消したかった。

SimpleFacetParameters - Solr Wiki
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);

[PR]
# by tokage-shippo | 2015-12-14 18:53

CentOS5 に MySQL5.6 を yum で入れる。

今回作業したのは CentOS5 だが、CentOS6 でも似たような手順でできた。

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 になっていれば完了。
[PR]
# by tokage-shippo | 2015-11-02 15:27

typeahead 0.11.1 が動かない時がある?

typeahred で結果が取れているのに画面にそれが表示されない、という現象にはまって、
日本語で検索しても、全然ヒットしなかったので、書いておきます。

■結論
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 と同じ件数いっぱいまで取れた時)は何も表示されない。

■感想
頑張ってプルリクのタイトルくらい読めばもっと早く解決したのでは。
(自分でデバッガで追って大変だった…)
[PR]
# by tokage-shippo | 2015-09-13 11:32

PhalconPHP で boolean の値が保存できない?

PhalconPHP + MySQL で、
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度目、もしかしたらもっとなので、雑だけどメモ。
[PR]
# by tokage-shippo | 2015-08-04 16:07

PHP で大きいファイルを添付すると $_POST が空になる?

■事象

大きな添付ファイルを送りたい

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 か何か出してほしいなー、と思いました><
[PR]
# by tokage-shippo | 2015-06-04 12:15

Flame 買った。

しばらく前に。
アップデートなど自分用にまとめる。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さんから頂いたので上の方に追記しました。ありがとうございます。
[PR]
# by tokage-shippo | 2015-03-01 00:02
Mozilla Firefox ブラウザ無料ダウンロード

about this...

書き手の名前は 晴柳祐志 と言います。


リンク

Twitter
いつか何とかしたいサイト

最新のトラックバック

[foxkeh]フォクす..
from 「 Firefox ×?=!..
[Firefox]Fir..
from +Sun Flower〜報告〜+
Firefoxバトン
from MなMによるMのための日記
スキン変更!
from SUKA・SUKA・BLOG
Firefox 1.5に..
from mmkg

検索

S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
XML | ATOM

個人情報保護
情報取得について
免責事項