人気ブログランキング | 話題のタグを見る

自作自演

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



# 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ファイルをインポートする | のぶろぐ
# 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 の解き方も見て行くと良さそうです。

# 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/ に書き換えないといけないです。
# 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());
}

# by tokage-shippo | 2014-05-28 14:44
Mozilla Firefox ブラウザ無料ダウンロード

about this...

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


リンク

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

最新のトラックバック

検索

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
31
XML | ATOM

会社概要
プライバシーポリシー
利用規約
個人情報保護
情報取得について
免責事項
ヘルプ