自作自演

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

Top

カテゴリ:未分類( 28 )

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

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

画像の naturalWidth と naturalHeight とれるかな

naturalWidth、naturalHeight 便利ーって言っていたら
取れない時もあるよ。 と言われたので確認してみました。
使ったブラウザは Firefox 18 です。


■仮説
DOM の解釈後から画像の読み込みまでは、
naturalWidth、naturalHeight が取得できないのではないかと予想しました。
表示できるところから表示して、画像は大きいかもしれないから後から読み込む、
という方がユーザに親切というか、遅い回線はそんな感じに見えるので。
従って、DOMContentLoaded と load イベントそれぞれの発生時点で取得できるか確認します。


■下準備
ローカルで検証すると、画像がすごい早さで取得できてしまいそうなので
PHP で決まった秒数 sleep してから応答するスクリプトを用意しました。
参考・PHP/画像のレスポンスを返す - 俺の基地

// 遅延秒数 (0未満か指定なしなら1秒にする。0秒の指定はありにしておく。)
$seconds = (int)$_GET['sec'];
if ($seconds < 0) $seconds = 1;
sleep($seconds);

header('Content-Type: image/png');
readfile('./hiyoko-01.png');
exit();

PHP 5.4 以上が入っていれば、ビルトインウェブサーバでさくっと試せます。
書いたスクリプトのあるディレクトリに移動して、
php -S localhost:8000
とかすればサーバが立ち上がります。
PHP: ビルトインウェブサーバー - Manual


■検証用 HTML と JavaScript
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>画像の naturalWidth と naturalHeight とれるかな</title>
</head>
<body>
<script>
var listener = function(evt){
// ブログの都合でドットが全角になってるが実際は半角
var image = document.getElementById('image');
var out = [];
out.push(evt.type);
out.push(new Date().toString());
out.push(' width: ' + image.naturalWidth);
out.push('height: ' + image.naturalHeight);
console.log(out.join('\n'));
};
window.addEventListener('DOMContentLoaded', listener, false);
window.addEventListener('load', listener, false);
</script>
<img id="image" src="http://localhost:8000/?sec=3" />

</body>
</html>


■結果
DOMContentLoaded
Tue Feb 05 2013 22:33:54 GMT+0900 (JST)
width: 0
height: 0

load
Tue Feb 05 2013 22:33:57 GMT+0900 (JST)
width: 500
height: 625

DOMContentLoaded イベントの発生時点では 0 となってしまっていますが、
load イベントの発生後はきちんと使った画像のサイズを取得できています。

ただ、画像が一度読み込まれていると(普通にリロードすると)
DOMContentLoaded の段階で、前回読み込んだ画像のサイズが取得できました。
ページのリロード前に、画像を差し替えサイズを変えてやると
DOMContentLoaded では前回読み込み時のサイズ、
load では実際表示した画像のサイズになりました。
[PR]
by tokage-shippo | 2013-02-05 22:49

MySQL のデータを取捨選択して別環境へコピーしたかった

お手軽に。ご利用は計画的に(これでよかったのか…?)。
mysqldump で全部ダンプすれば良いのでは? → コピーしたくないデータがありました><


■ユーザについて

select Host, User from mysql.user;
で現在いるユーザを確認する。

show grants for 'ユーザ名'@'サーバ(localhostとか)';
必要なユーザについて、上記コマンドを叩いて GRANT 文を取得して
コピー先でそのまま流す。


■データベースについて

show create database DB名;
で create 文が取得できるのでそのままコピペ。


■テーブルについて

mysqldump -uユーザ名 -p DB名 テーブル名 > ダンプファイル
とかすると、テーブルごとにダンプがとれるので、それを投入する。

-d オプションで、データ抜き(テーブル定義のみ) にできる。
--skip-lock-tables でロックをせずにダンプを取れる(ダンプしている間に更新されうる)。

が、--single-transaction の方が整合性のとれたデータが取得できるらしいので
--skip-lock-tables は使わない方が良さそう。
PHPのテクメモ ≫ Blog Archive ≫ mysqldumpで「when using LOCK TABLES」と怒られる
MySQL :: MySQL 5.1 リファレンスマニュアル :: 4.9.2.1 バックアップ ポリシー
[PR]
by tokage-shippo | 2013-02-01 21:11
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

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