自作自演

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

Top

kindle に HTML を送ってみたメモ

某所から HTML を毎日取得して、kindle で読めるようにした。
それに関して色々メモ。

■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 を開けば同期も早いし、
同期が済めば電波の悪い場所でも問題ないので結構快適。



[PR]
# by tokage-shippo | 2014-08-24 23:06

mysqldump で取ったダンプが別の MySQL に入らなかった

・サーバA で mysqldump でダンプを取得する
・サーバB で mysql < ダンプ という感じでダンプをインポートしようとする
・シンタックスエラー多発
という状態になって困りました。

【MySQL】互換性の都合でダンプが流し込めない時 at softelメモ
mysqldump のオプションに --compatible=ansi をつけることでシンタックスエラーはなくなりました。

インポート時に Duplicate entry のエラーが1つだけ出てしまいましたが、
検証用のデータとしてほしかっただけだったので、原因追求はせずに
下記を参考に mysql コマンドのオプションに -f をつけて無理やり流し込みました。
[MySQL]エラーを無視してsqlファイルをインポートする | のぶろぐ
[PR]
# by tokage-shippo | 2014-08-05 17:51

#SECCON 2014 オンライン予選(日本語)に参加してみた

公式→ SECCON 2014
ありがたいまとめ→ 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 の解き方も見て行くと良さそうです。

[PR]
# by tokage-shippo | 2014-07-21 12:14

XULRunner のサンプルプロジェクトが動かなかった。

Getting started with XULRunner | MDN

この記事の下部にサンプルプロジェクトのリンクがありますが、
これは古い 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/ に書き換えないといけないです。
[PR]
# by tokage-shippo | 2014-06-09 13:03

Java から CloudSearch を使ってみた。

参考
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());
}

[PR]
# by tokage-shippo | 2014-05-28 14:44

よくわかるAmazon #CloudSearch に行ってきた。

5月15日 AWSプロダクトシリーズ|よくわかるAmazon CloudSearch(東京都)

少し CloudSearch を触ったことがある、という状態で行ってみました。
英語の話はわからないのでは…と不安でしたが、逐次日本語訳を付けて頂けたので何とかついていけました。
以下、自分の興味のあったところなど。

■CloudSearch Technical Deep Dive

インデックス作成時は下記の流れで文章を処理しているとのこと。
・トークナイズ (日本語なら形態素解析)
・ノーマライズ
  ・英語なら小文字に寄せる
  ・日本語だと半角カナを全角カナに寄せる。ただし「ヴ」の扱いなどまだ微妙なものも。
・ステミング (活用している語を自立語にするなど)
・stop word を取り除く (冠詞を除く? 日本語なら助詞を除くなど)
・シノニムを加える
  ・シノニムには1方向の alias と双方向?の group がある。

今はできないこと (将来の課題?)
・N-gram
・形態素解析辞書のカスタマイズ

Impression of using CloudSearch

・ドキュメントの追加・削除はなるべくまとめてしないとお金がかかる。
・頼めばインスタンスとパーティションを増やしてもらうことはできるが、ウォームアップはできない。
・VPC のセキュリティグループ使えない。

■感想というか、今後の希望。

・グルーピングの機能がほしいのでお願いします!!!
 例えば、色・サイズごとに在庫数があって、グルーピングしつつ在庫のあるものだけをひっかける、とかしたいです!

・ウォームアップもほしいです。発売日とかセールとか、アクセスが跳ね上がるケースってあると思うので…

・N-gram と辞書のカスタマイズも…

・ちょっとデータ入れて検索を試してみる、というところまではシンプルなので
 グルーピングや精度にうるさい全文検索が不要なら使えるのでは、と思いました。
 アクセス数が特に跳ね上がらなければ普通にオートスケールもあるとのことですし。

・話にもあまり上がらなかったし、自分でも試せていないのですが、
 latlon の検索がどんな感じなのか、気になります…
[PR]
# by tokage-shippo | 2014-05-16 12:27 | プログラミング

Wikipedia のデータファイルを使ってみたい

参考
Wikipediaのダウンロードできるデータファイル一覧 | mwSoft
Wikipedia:データベースダウンロード - Wikipedia

Wikipedia のデータはクロール禁止になっている。
代わりにダンプがダウンロードできる。
最新のファイル → http://dumps.wikimedia.org/jawiki/latest/

■全体的に
データ量が多いので、ダウンロードもデータの投入も加工も何もかも時間がかかる。

■ページの情報
ページのタイトル等のみの情報(page)と本文(text)がある。
jawiki-latest-pages-articles.xml.bz2 をダウンロード。
解凍 → 加工 → MySQL に投入という手順。

解凍すると xml が出てくるので、sql にするために xml2sql を使う。Data dumps/xml2sql - Meta
Windows なら zip をダウンロードして解凍すれば使える。
ただ、xml ファイルをそのまま xml2sql に渡すと
「unexpected element <ns>」のようなエラーが出るので sed で加工してから渡す。

Windows7 のコマンドプロンプトだとエスケープがうまく書けなかったので
MinGW で下記のコマンドを実行した。(パス通してなければ xml2sql はフルパスで書く)
cat jawiki-latest-pages-articles.xml | sed -e 's/<ns>.*<\/ns>\|<ns.*\/>\|<parentid>.*<\/parentid>\|<parentid.*\/>\|<sha1>.*<\/sha1>\|<sha1.*\/>\|<model>.*<\/model>\|<model.*\/>\|<format>.*<\/format>\|<format.*\/>\|<redirect>.*<\/redirect>\|<redirect.*\/>//' | xml2sql

Mac のデフォルトの sed だとうまくいかないかもしれないのでだめなら GNU sed を使う。
brew install gnu-sed → brew link gnu-sed → gsedコマンド使う(sedコマンドの代わりに)

データベースを用意する。スキーマは mediawiki のものを利用する。
http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/maintenance/tables.sql
mysql -uroot -p
create database wikipedia;
exit

mysql -uroot -p wikipedia < tables.sql

mysqlimport --default-character-set=utf8 -uroot -p -d -L wikipedia page.txt
mysqlimport --default-character-set=utf8 -uroot -p -d -L wikipedia revision.txt
mysqlimport --default-character-set=utf8 -uroot -p -d -L wikipedia text.txt
マシンスペックにもよるが、すごく時間がかかる。待つ。

■カテゴリの情報
jawiki-latest-categorylinks.sql.gz をダウンロード。
解凍後 MySQL にそのまま投入する。

■本文情報として abstract.xml は利用できないの?
どうも 1行目しかないっぽく、画像の指定しか入ってなかったりするものもあって、
残念ながら自分にとっては役に立たなさそうだった。
[PR]
# by tokage-shippo | 2014-03-03 18:33

Java のパスを変えたら jvm.cfg が開けないというエラーが出た。

Windows7 で JDK を新しく入れてパスを変えました。
最初 Eclipse の起動をしようとしてエラーになり、コマンドプロンプトで java -version をやってもエラー。
(ファイルパスの頭の方は手を加えています。)

Error: could not open
`C:XXXXXX\jre7\lib\amd64\jvm.cfg'

ググったところ、ファイルがないからだとか書かれていて、
確かにその場所にファイルはないが別の場所をパスに指定したつもりなんだよ…!と
思ったりもしたのですが、ぴったりなものがありました。
Java path..Error of jvm.cfg - Stack Overflow
Delete the “java.exe” file from “c:\windows” and “c:\windows\system32″.

この回答通り、 c:\windows\system32 に java.exe、javaw.exe、javaws.exe がありました。
これらを消したところ解消しました。
[PR]
# by tokage-shippo | 2014-02-14 13:59

スマホ向けに HTML とか書いたメモ

1機種でしか見ていないのでタイトル釣りっぽい…。

書いたもの → ポケモンのマーキングをメモできるよ
下記の通り、自分の端末ではこれで困らないからいいや、としている部分が多いので
他の機種で動作するかはわからないです。

■環境
GALAXY S III SC-06D (Android 4.1.2)

■目的
ポケモンで個体値を教えてくれる人がいますが、マーキングするまで覚えていられないので
メモするために6種類のマーク * 6セットをオンオフできるだけのページを書きました。

■マークのサイズが揃わない
マークは ● ▲ ■ ♥ ◆ ★ です。
自分の環境だと PC ではハートマークが細く、
GALAXY s3 ではハートと星が大きくなってしまい、サイズが揃いませんでした。
仕方ないのでそれぞれのマークは画像にして切り替えています。

■タップしても反応が遅かった
各マークを押したときを click イベントで拾おうとしたら
PC は良かったのですが Android ですごく遅かったです。
touchstart イベントを使うようにしたところ、PC と同様の感覚で操作できるようになりました。
touchstart を click 代わりにするのは、スクロールしようとしたら反応してしまう、
といった問題があるようですが、今回は特にページが長くないので気にしないことにしました。

■連打してるとどうしてもページが拡大されてしまった
GALAXY s3 でマークを連打すると、ページの拡大が発動してしまいました。
viewport の設定とか結構悩んだのですがうまく解決できず、
touchstart のイベントで e.preventDefault(); を呼んで
ブラウザの既定の動作をキャンセルして回避しました。

これ作ってたので、最近ポケモンのタマゴ孵化させてないです。本末転倒。
[PR]
# by tokage-shippo | 2013-11-01 00:10

mailx コマンドで日本語を本文に入れると添付ファイルになってしまう?

「mailx 添付ファイルになる」でぐぐっても
あまりよくわからなかったのでメモ。

■前提
・body.txt に UTF-8 で日本語の文章が書いてある
・cat body.txt | mailx -s "title" "自分のメールアドレス" でメールを送る
・みたいなコマンドをシェルスクリプトに書いて cron で動かす

・すると、cron で動かし、かつ、本文に日本語が含まれる時だけ、
 本文が空っぽで、本文になるはずの内容が添付ファイルで送られてくる。
・本文に日本語がなければこの現象は起きない。
・手動での実行でも起きない。

■対策
スクリプトの先頭に export LC_CTYPE=ja_JP.UTF-8 を記載する。

もしくは

0 15 * * * LANG=ja_JP.UTF-8 動かすスクリプト
みたいに cron の設定の中に文字コードの設定を書いておく。

■原因
mailx コマンドでは LC_CTYPE に設定されている文字コードが使われるらしい。
手動と cron で locale コマンドを実行すると結果が異なり、
手動では LC_CTYPE="ja_JP.UTF-8" などとなっていても
cron での実行だと LC_CTYPE="POSIX" のようになってしまう。

■参考
【嵌りました】CRONで動かない! cron jobに環境変数LANGは引継がれず: Pythonと自分 ~ a python life
+++ 上野メモ帳 +++ cronだとLANGとかLC_CTYPEが反映されない
[PR]
# by tokage-shippo | 2013-04-30 16:01 | その他
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

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