投稿

ISUCON12 予選突破しました #isucon

イメージ
概要 2022年7月23日土曜日に、ISUCON12のオンライン予選が開催され、チーム名 hidekiy で何とか予選突破出来たので、参加記録を残しておきます。 全体指針の検討 最初にざっくりアプリを触ってみて、マルチテナントと沢山のAPIが入り混じっていて大変難しいと思いながら、コードとクエリを確認して明らかに直した方が良さそうな所として、2か所発見しました。 1か所目がMySQL側のvisit_historyで、これは集約して来訪時刻の最小値のみが使用されているため、最小じゃないレコードは不要そうでした。2か所目がSQLite側のplayer_scoreで、スコアの最新値のみが使用されているので、そうじゃないレコードは書き込まなくても良さそうでした。そこで、2か所とも、初期データとアプリの書き込み処理を、どちらも修正する事にしました。 また、SQLiteをMySQLに載せ替えるかという事に関しては、意味深な変換スクリプト (~/webapp/sql/sqlite3-to-sql) が同梱されていた事から、そもそもそういう問題ならこの機能は自力で用意させるはず?とメタ推理し、このルートは大変不審であると考えたので、誘惑に惑わされず、載せ替えは無しで進める事にしました。 visit_historyの改良 visit_historyに関して、初期データを更新 (@k_enokiがいい感じにやってくれました) し、アプリ側でも2件目以降の登録を阻止するために、(tenant_id, competition_id, player_id) でユニークインデックスを設定し、Duplicate Key Errorを無視するコードをアプリ側に追加して、これはスムーズに完成しました。 スコアは初期スコアからほぼ変化なし (4000程度) です。 player_scoreの改良 player_scoreに関しては、初期データを更新するため、~/initial_dataのSQLiteの各ファイルに以下のようなクエリ: delete from player_score where id in (   select id from (     select id, row_number () over (      ...

ISUCON10 本選8位でした #isucon

イメージ
概要 10月3日にISUCON10 本選にチーム名 hidekiy、チームメンバー @hidekiy, @kotaroy で参加して、結果8位でした。賞金圏内は逃しましたが、過去の本選出場時のやられっぷりに比べて、若干の進歩は感じました。 何をやったかメモ 10:00 レギュレーション、アプリ仕様確認 盛り沢山過ぎて過去の ISUCON 本選でほぼ何もできなかった悪夢が蘇って焦る。 11:00 アプリのコード確認、やはりボリューム感が凄くて気分が悪くなる。 予選と同じく Cloud Profiler, Cloud Trace 設定する。サーバー1号機がメモリ不足でアプリのビルドが遅すぎるので、仕方なくスペックが少し良さそうな2号機に移行したら行けた。 12:00 ホームディレクトリに作った Makefile から、make -C webapp/golang としていたら明後日の場所 ~/bin にバイナリが出来ていてデプロイ出来ていない事に気づく。(cd webapp/golang && make) として対処完了 13:00 ListNotifications の負荷が高いため、Web Push に移行する対応を行う。サンプルコードのおかげて特に難しい事は無く出来た。 14:00 Audience Dashboard はユーザーごとに変化させなくて良く、一律でキャッシュ可能なので、 singleflight  で一定時間内(1秒間)に来たユーザーには同じレスポンスを返しておく対応をする。シリアライズ後のバイナリを作るところまでを共通処理とした。 15:00 Leaderboard を対処するため、クエリ側からユーザー固有パラメーターを抜いて、ジョブ履歴とチーム一覧を全ユーザー共通で取得出来るようにし、ユーザー固有の調整(スコアフリーズ中のスコアなど)は後でアプリ側で行うことで、Audience Dashboard と同様にキャッシュ可能にする 16:00 ListNotifications で使っている loginRequired の負荷が高いので調べたところ、必ずしも getCurrentTeam しなくとも、contestant.TeamID が入っている事で判断出来るようなので修正 17:00 ListClarifications も...

ISUCON10 予選通過しました #isucon

イメージ
チーム名 hidekiy で、 @kotaroy と ISUCON10 予選に参加して、何とか通過しました。 ブログ記事の募集期間が終わらないうちに、当日の行動について記録しておきます。 タイムライン 12:20 予選開始 仕様把握、なぞって検索が本丸っぽい予想。 不要そうな node_modules, target を抜いて、コードを Git 管理する。SSH のエージェント転送で連れてきた鍵を使って、サーバーから直接 GitHub にアクセスしてデプロイとかやる事にする。 サンプルの SSH の設定ファイルに、8081~8083 でそれぞれのサーバーのポート80を開けるようにする設定を入れた LocalForward を追加してチーム内に共有した。 14:00 去年のISUCON予選1位チームのありがたい記事  ISUCON9 予選を全体1位で突破しました  で学んだ Cloud Trace, Cloud Profiler をまず設定する。New Relic はプロファイルが取れれば不要と思ったんで、入れない事とする。リソース監視は top を更新間隔1秒で目視確認して行う事にした。 いずれ問題になってくると思ったんで、nginx.conf でのボット対策を依頼した。 15:00 検索機能がクソ重い事分かったんで、ソート用にいくつかインデックスを追加 (EXPLAIN 確認してない) MySQL サーバーのスレーブ追加を依頼 16:00 なぞって検索のN+1クエリについて、1段目のクエリのWHERE条件に、後段の条件を追加する感じで修正して対応した。 SELECT  * FROM  estate WHERE   latitude <= ?  AND  latitude >= ?  AND  longitude <= ?  AND  longitude >= ?    AND  ST_Contains(ST_PolygonFromText(%s), ST_GeomFromText( CONCAT ( 'P...

Google Trust Services 用の CAA レコードを追加しました

イメージ
当ブログで使っている独自ドメイン hidekiy.com では、学習用で無駄に CAA レコード  を設定して証明書発行が出来る認証局を制限しているのですが、 Google Trust Services (GTS)  についてのレコードを追加した事についての記事です。 2018年に設定した当初は、 Blogger の独自ドメイン用証明書には Let's Encrypt が使われていたので、以下のような CAA レコードを設定していました。 0 issue "letsencrypt.org" 0 issuewild "letsencrypt.org" その後、巷の Blogger のブログでは GTS へ変更されているのに、何故か自分のブログだけ GTS に切り替わらないのが気になって調査した結果、GTS の証明書発行が出来るような CAA レコードを設定する必要がある事が分かり、 Google Trust Services, Certificate Policy などを参考に、 0 issue "pki.goog" 0 issuewild "pki.goog" を追加したところ、無事 GTS 発行の証明書に置き換わりました。  Blogger 側の挙動としては、GTS、Let's Encrypt の順で発行可能な証明書が発行されているような雰囲気があります。 関連記事 [blogger] ブログの HTTPS 化が完了しました

Intel Dual Band Wireless-AC 7260 付属の Bluetooth がデバイス記述子要求の失敗となる

Windows 10 の PC にて、インテル® ドライバー & サポート・アシスタント というツールを使って、Intel 製のドライバを色々更新していたら、使用していた Intel Dual Band Wireless-AC 7260 付属の Bluetooth 部分が正常に認識されなくなり、デバイス記述子要求の失敗 コード43 というエラーがデバイスマネージャー上で出るようになりました。 再起動、シャットダウン、シフトキーを押しながらシャットダウン、ドライバを削除と色々試したのですが、特に変化なく、途方に暮れていたところ、こちらの記事 圏外恐怖症: デバイス記述子要求の失敗 コード43 なんじゃこれ!! を参考にして、PC の電源をコンセントより抜いて、しばらく放置してから起動したところ、正常に認識され動作するようになりました。 こちらの方法は試していないのですが、同様なエラーを別の方法で解決されているようでした。 超絶はらへ('A`) - USB機器がエラーコード43を返してきた場合の対処方法 詳しく調査していないのですが、必要な何らかのリセット処理が正常に行われておらず、デバイス側とホスト側が矛盾した状態になり、復旧出来なくなる不具合があるのではと想像しています。

ASUS TPM-L R2.0 のファームウェアを 5.63.3144 に更新しました

Windows 10 Version 1803 に更新したところ、Windows Defender セキュリティセンターにて、TPM チップのファームウェアの更新が必要という警告が出るようになったので、さっそく更新してみました。作業内容についてメモしておきます。 更新手順 1. 更新元バージョンを調べて USB ストレージを準備 2. ASUS のマニュアルの指示の通り、以下を実行 2.1. UEFI の設定で、Security Device Support と Launch CSM を Disable 2.2. USB ストレージから起動して、EFI シェルで更新手続きを実行 2.3. UEFI の設定を元に戻して再起動 3. Microsoft の指示の通り TPMのクリアを実行 補足 更新手順はマニュアルの通りで上手くいきましたが、更新元のバージョンに合わせたファイルをダウンロードして使用することが必要でした。 更新元のバージョンによっては、ASUS のダウンロードページで Show all を押すと出てくるもう一つの方を使う必要がある場合があります。 TPM チップのバージョンを確認するには、 Windows Defender セキュリティセンター > デバイスセキュリティ > セキュリティプロセッサ > セキュリティプロセッサの詳細 を見ると良いようです。 EFI シェルに入る方法は、配布されているファイルを、X:\EFI\Boot\BOOTX64.EFI というパスになるように USB ストレージに展開して、起動すれば良いようでした。 UEFI の設定変更や、TPM のクリアを行う際は、BitLocker の保護の中断を行ってから作業をすると回復キーを何度も入れなくて済むので便利です。 リンク セキュリティ プロセッサ (TPM) ファームウェアを更新する - Windows Help TPM-L R2.0 Driver & Tools | Motherboard Accessory | ASUS Global - 2018年5月現在、更新元バージョンの異なる2種類のファイルがダウンロード出来るようになっています。 TPM-L R2.0 Manual | Motherboa...

[blogger] ブログの HTTPS 化が完了しました

Blogger のカスタムドメイン用 HTTPS 対応がリリースされたので、さっそく有効にしてみました。特に追加費用は発生せず、証明書は Let's Encrypt の DV (Domain Validation) 証明書が自動で設定されるようで、大変便利でした。 証明書が設定されたことで、GFE (Google Front End) の配信方式が、HTTP 1.1 から、HTTP 2, QUIC 39 に変更され、やけに最先端感があります (2018/04/01 時点)。また、HTTPS 有効化前からですが、当たり前のように IPv4, IPv6 のデュアルスタックになっています。 ブログ内の http:// な画像は親切なことに Blogger 側で用意してくれたプロキシで https:// な URL に変換されるので、mixed content 問題も回避してくれるようです。 Google App Engine のカスタムドメイン用 HTTPS 機能でも同じように Let's Encrypt + GFE で設定されたので、どうやら同じ仕組みを使っているようです。 特に問題はないと思うので、HTTP サイトの表示変更が予定されている、2018/07 の Chrome 68 リリースまでに、HTTPS リダイレクトまで有効化しておくと良いと思います。 Marking HTTP As Non-Secure - The Chromium Projects

So-net フレッツ回線を IPv6 + DS-Lite に変更して劇的に速度改善しました

イメージ
最近、毎晩8時~12時くらいの時間帯で、So-net フレッツ光マンションタイプのインターネット回線のダウンロード速度が非常に遅くなる (0.1~1Mbps程度) 現象に見舞われており、大変困っていました。 具体的には、YouTube の 1080p や、AbemaTV の最高画質はダウンロードが追い付かず、低ビットレートのモヤモヤした画面を見させられ、アプリの更新やデータダウンロードでもやたら時間がかかるという感じで、この回線に繋がる Wi-Fi よりも、ドコモ Xi の 4G+ の方がずっと速いという、いったい何にお金払っているんだろうかという状況でした。 切り分け用に NTT 東日本の用意してくれている フレッツ速度測定 では、十分に高速 (90Mbps 以上) な速度になっているので、おそらくボトルネックは So-net 用の PPPoE 部分にあるようで、先駆者のブログでの改善報告も参考にして、以下のページより IPv6 接続オプションを申し込みました。 「IPv6」ご利用のご案内 | 会員サポート | So-net 申し込み数時間後、手続きが完了したようで、ルーター広告 (RA) でグローバル IPv6 アドレスが降ってきて IPv6 で通信できるようになり、Google, Facebook, YouTube, Netflix など、IPv6 接続性のあるサイトの速度が改善しました。 この調子で IPv4 の速度も改善するため、So-net での IPv4 over IPv6 トンネリング (IPv6 ネットワーク上で IPv4 の通信を行う技術) のために必要な DS-Lite に対応した無線LANルーター WXR-1751DHP2 を導入してみました。セットアップ自体は PPPoE の設定すら必要なく、有線で繋いで電源を入れるだけで、あとは IPv6 と IPv4 (DS-Lite) の接続性が得られました。 速度測定結果は以下のように、混み合っていた時間帯でも安定してダウンロード 60Mbps 以上は出るようになって、非常に快適になりました。 プロバイダを So-net に変えてから、遅延がひどくてやらなくなっていた、FPS も試しにやってみたところ、ちゃんと敵の居場所が反映されるようになって、レイテンシーも安定し...

[adtech] 行動ターゲティング広告を最大限強化するには

イメージ
インターネット広告について、もし広告ブロッカーなどは使わず、広告を受け入れるポリシーなのであれば、完全に最適化してもらうのも面白いと思います。行動ターゲティング広告という仕組みはご存知であっても、具体的に最適化を強化するには何をすれば良いかは、各社気持ち悪がられることを恐れてか、あまり明確な説明をしていないように思います。そこで、広告の最適化をより進め、広告の配信が楽しみになるアイディアをご紹介します。 まず、Google, Facebook, Twitter, Yahoo! JAPAN など、広告配信に直結したアカウントで、モバイルを含む普段使うすべてのブラウザにログインしましょう。クッキーを受け入れていれば、すでにブラウザごとに履歴が蓄積しているのですが、アカウント経由で全ての行動履歴が統合されることでより正確なプロフィールが仕上がります。 Safari のデフォルトの設定は広告最適化上よろしくないものがあるので、サードパーティークッキーは受け入れる、サイト越えトラッキングも防がない設定に変更すると良いです。 次に、所持しているモバイル端末全てに、各社のモバイルアプリをインストールし、ログインしましょう。これにより、デバイス単位で存在する IDFA (iOS), AdID (Android) の広告用識別子と、ユーザープロフィールが統合され、モバイルアプリ内の広告も最適化が完了します。追加で、位置情報も定期送信しておくと良いです。 これらのユーザーごとに広告配信を最適化する仕組みは、必ずしもリアルタイムではなく、日次~週次ほどのバッチ処理で随時更新されるような雰囲気です。すぐに面白い広告が出なくともしばらく放置してみると良いと思います。 以上の対応により、例えば、 Google 広告設定 を見てみると、以下のように収集された興味関心が一覧で表示されると思います。 現状の分析 現状どれくらい正確なユーザーの情報を得られているかについて、Google は Google Chrome により、SDK の埋め込みがなくても、全ての閲覧履歴を収集する仕組みを持っているので、格段に優位な状況にあると思います。 Facebook のモバイルアプリも、標準ブラウザでログイン済みかどうかを定期的に確認し、ログインさせる機能を有しているので、広告...

[isucon] ISUCON7 本選17位でした

イメージ
2017年11月25日、LINE の新宿ミライナタワーの会場にて、 ISUCON7 本選にチーム 円山町(hidekiy, kotaroy, k_enoki) として参加してきました。成績は ISUCON6 本選と比べて若干の進歩はしたのですが、まだまだ上位層との壁を感じました。 当日やったことを書いておきます。 10:00~ SSH 鍵ログイン設定、Mackerel Agent 設定、Go 実装に変更、アプリの動作確認、Go の CPU プロファイル取得 (pprof) 12:00~ 分析の結果、初期状態のボトルネックは、DB と API のどちらの CPU, 各種 IO も使い切っていると言えないので、ロック競合か何かかと思ったが、煮え切らないまま深く考えなかった (これが致命的にまずかった) CPU プロファイル的には、多倍長整数演算が遅かったのと、コード上明らかにおかしな1000回ループ、テストコード付属という親切設計を見て、このループを最初に修理することにした。 16:00~ 初めて使う Go の多倍長整数演算ライブラリで、苦労の末1000回ループの除去に成功、それでも相変わらずボトルネックはDBのロックにあるように見え、これを何とか小細工しようとするが、特に有効な手を打てないまま時間切れとなった。 感想 速やかに、オンメモリー方式に作り替え、ロックを部屋別に分散させる決定をする必要があった。 Go の多倍長演算には結構苦しんだ。 糖を消費したせいか、ISUCON ケーキが美味しかった。 総括 素晴らしいイベントを企画、運営いただいた、LINE、KLab、さくらインターネット様には大変お世話になりました。ありがとうございます。

[isucon] ISUCON7 予選通過しました

ISUCON7 にチーム名 円山町 (@hidekiy, @kotaroy, @k_enoki) として出場し、去年に引き続き予選通過しました。当日について、記憶が定かな内にメモしておきます。 今回の予選問題について isubata という名前で、これは ISUCON 参加者になじみの深い idobata というチャットサービスを参考に作られているようでした。 用意したもの GitLab のプライベートリポジトリと権限設定 専用の Slack チャンネル Mackerel オーガニゼーションと公式プラグイン (inode, linux, mysql, nginx, proc-fd, uptime) の設定 ngxtop の使い方 2017/10/22 13:00 無事全員そろって開始 当日用マニュアル熟読 (@hidekiy, @kotaroy) 公開鍵ログイン設定と ssh config 作成 (@k_enoki) アプリのソースコードを GitLab へアップロード (@k_enoki) アプリを Go 実装へ切り替えと自動起動設定の修正 (@k_enoki) isubata アプリの動作確認 (@hidekiy, @kotaroy) インフラ構成と、nginx, MySQL の動作状況の確認 (@k_enoki) トラブルシュート用の mackerel-agent を全台に設定 (@hidekiy) 14:00 ローカル開発環境構築 (@hidekiy, @kotaroy) make deploy で全台にアプリがデプロイ (ローカルで GOOS=linux でクロスコンパイル後、scp して rename して systemctl restart) されるように設定 (@hidekiy) 静的ファイルの nginx 配信化と事前圧縮設定 (@k_enoki) DB のネットワーク上りがあんまりな状態だったので、一旦 image のオンメモリキャッシュを実装 (@hidekiy) /icon にインチキ Etag + If-None-Match 実装を試すが、全く 304 を返せず挫折 (@hidekiy) /profile の画像アップロード機能で、DB に二重に書き込まないように修正、ついでに...

[golang] crypto/rand で疑似乱数生成器を初期化する

Go 言語で疑似乱数 math/rand を使うとき、実行ごとに別の乱数列を選択するための方法として、rand.Seed(time.Now().UnixNano()) とするのが人気があるようなのですが、より予測困難さを追加するためには以下のコードのようにすると良いです。 今日では、Perl, Ruby, Python などで、明示的な seed をせずに rand を使った場合に、内部的に行われる自動的な seed では、OS の乱数生成器由来の値が使われるようになっているので、Go でも同じ感じで良いと思います。 package main import ( cryptorand "crypto/rand" "encoding/binary" "math/rand" ) func main() { randSeed() println("rand int:", rand.Int()) } func randSeed() { var seed int64 err := binary.Read(cryptorand.Reader, binary.LittleEndian, &seed) if err != nil { panic(err) } rand.Seed(seed) } LittleEndian は BigEndian でも良いです。crypto/rand には big.Int のインターフェースもありますが、こちらの方式の方が簡潔に書けると思います。 蛇足ですが、暗号化用の鍵や、何とかトークンのような、長さ分のエントロピーを持つ乱雑な文字列を作りたい場合は、math/rand ではなく、 crypto/rand をそのまま使う必要があります。 リンク math/rand: Deterministic random by default is dangerous #11871

ISUCON6 本戦敗退しました #isucon

22日土曜は第6回の ISUCON に参加しました。当日は無事起床は成功したのですが、完全に打ちのめされました。チーム名は円山町です。参加メンバーは会社の同期 @k_enoki, @ymz_kotaro です。今後のため当日やったことをメモしておきます。 10時~12時 4コア * 5台の構成が Azure のデフォルトのコア数制限にひっかかってデプロイ失敗、運営で2コア * 5台に変更していただき、この構成で競技することになる。 デプロイ後なぜかログインできないと思ったらユーザー名が自分の名前で入ろうとしていた。isucon@ としてログインに成功する。 バックエンド側アプリを Go 実装に変更後、何もいじらずにベンチ流してみるが、フロント側アプリの Node.js でアクセスログが出ていないのでアクセス状況は良く分からず。 12時~14時 Go のアプリのプロファイルを取得するためにアプリを改造する。Node.js 部分は @ymz_kotaro に依頼する。 @k_enoki が Node.js の前に nginx を立ててアクセスログを解析する。 isu05 に MySQL と Redis を立ててもらうのを @k_enoki に依頼する。 本番環境では別ノードの MySQL を使いたいが、ちゃんとした設定が良く分からないのでひとまずホストネットワーク設定とする。 docker-compose の扱い方でローカル環境構築に手こずったが、Docker for Mac ではホストネットワークが使えない問題があることが分かったので本番でのみ使うこととする。 14時~16時 docker-compose build していなくてイメージがリビルドされずコードの変更が反映されない問題を解決する。 Go のプロファイル上最も時間を費やしていた、あるルームの全情報を取得する API を Redis でキャッシュする機能を作成する。 ポーリングで沢山無駄にクエリを発行している、SSE で部屋の更新情報を通知してくれる API を Redis の Pub Sub を使って改造することを計画する。 16時~18時 Redis のキャッシュ機構はバグ修正を git pull してようやく機能するようになる。 更新情報通知用の Pub S...

[isucon] ISUCON6 予選通過しました

今回はついに予選通過しました。チーム名は円山町です。17日土曜日の予選当日にやったことをメモしておきます。 予選当日のタイムライン 10時 出社 (会社のオフィスから参加させてもらいました。大変感謝) 前の日の晩に作った無料試用アカウントでデプロイ Go 実装に変更、動作確認 記事を削除したら /initialize しても復活しなくて、初期データを壊してしまったので復旧方法を調査 /var/log/cloud-init-output.log を見て展開イメージの tar.gz を発見したので、中に入っている SQL ダンプでデータを復元 11時 Go 実装に切り替えたところ、スターが付かない不具合があったので、コードを検査、ngrep で調査して原因を特定 ローカルでコードいじるためにホームディレクトリで git init、必要そうなものを add/commit して push ローカルの MySQL にデータを入れて似たような環境を構築、バグ修正、動作確認 正常に動作するが、キーワードの置換処理があるページが遅くてベンチどころじゃないので、アプリに net/http/pprof を仕込んで、キーワード個別ページを叩いた時の CPU プロファイルを取得 htmlify の正規表現コンパイルと正規表現マッチングが遅いことが分かったので、何とかする方法を検討 12時 昼食、修正方針の検討 13時 htmlify で行っているキーワードの発見部分は、元上司の okzk さんが活用しているのを見たり、他プロジェクトのコードで見たことがあったトライ木で何とかするのが良さそうと判断、触ったことのあった github.com/armon/go-radix を使わせていただいて試作してみたところ、特に問題なく動き、動作はだいぶ速くなった。 ベンチを流しながらプロファイルを取ったところ、トライ木の構築に時間がかかっていたので構築済みのトライ木をキャッシュする (キーワードリストが変わったら破棄) ように修正 14時 isutar のスター追加処理でキーワードの存在チェックにキーワード個別ページを叩いていて迷惑なので MySQL から存在情報を取るように修正 isuda のスター取得部分で HTTP API を使う必要はないと思...

[windows] BitLocker の暗号化モードを新しい XTS-AES に変更してみました

イメージ
Windows 10 バージョン 1511 の新機能で、BitLocker の暗号化方式が追加されたので、早速変更してみました。 変更方法は、いったん暗号化を解除した後、再度暗号化をする際に、以下の画面の選択肢の中で「新しい暗号化モード」を選べばよいです。 ディスクがリムーバブルではなく内蔵のときはデフォルトで新しい暗号化モードが選択されていました。 GUI 上は暗号化方法を確認出来る画面が見つからなかったのですが、BitLocker のコマンドラインツール manage-bde を使うと以下のように XTS-AES が使われていることを確認できました。 C:\WINDOWS\system32>manage-bde -status BitLocker ドライブ暗号化: 構成ツール Version 10.0.10011 Copyright (C) 2013 Microsoft Corporation. All rights reserved. BitLocker ドライブ暗号化で保護可能な ディスク ボリューム: ボリューム C: [Windows] [OS ボリューム] サイズ: 475.98 GB BitLocker のバージョン: 2.0 変換状態: 完全に暗号化されています 暗号化された割合: 100.0% 暗号化の方法: XTS-AES 128 保護状態: 保護はオンです ロック状態: ロック解除 識別子フィールド: 不明 キーの保護機能: TPM 数字パスワード BitLocker の新機能 (Windows) - 公式のリリースノートのようなものがあります。 セキュアVMを支える暗号技術 - 筑波大学 セキュアVM開発室 面 和成 - XTS-AES についての丁寧な説明が載っています。

[windows] 復元ポイントに保存されたレジストリを閲覧する (Windows Vista 以降用)

管理者コマンドプロンプトにて、vssadmin list shadows、とすると復元ポイントごとの保存先アドレスが、項目「シャドウ コピー ボリューム」に表示されます。通常の復元機能では見えるコメント欄がないので、通常の復元機能の方で日時の当たりを付けておくと良いと思います。 出力例 Microsoft Windows [Version 10.0.10586] (c) 2015 Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>vssadmin list shadows シャドウ コピー セット ID: {0000000-1111-2222-3333-444444444444} の内容 1 個のシャドウ コピー、作成時刻: 2015/12/26 8:39:27 シャドウ コピー ボリューム: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1 元のコンピューター: PC123 サービス コンピューター: PC123 プロバイダー: 'Microsoft Software Shadow Copy provider 1.0' 種類: ClientAccessibleWriters 属性: 恒久, クライアント アクセス可能, 自動リリースなし, 差分, 自動回復 しかしとてもアクセスしにくいので mklink でシンボリックリンクを作成すると便利です。mklink /d SRC DEST で、DEST 末尾の \ を追加で付ける必要があるので注意してください。 C:\WINDOWS\system32>mklink /d c:\shadowcopy1 \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\ c:\shadowcopy1 > \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\ のシンボリック リンクが作成されました この後は c:\shadowcopy1 に対して、エクスプローラーで閲覧し...

おさいふ Ponta に移行してみました

2015/11/3 おさいふ Ponta をローソンでゲットしたので、会員登録を行おうとしました。最初のステップで届くメールが Gmail の迷惑メールフォルダに分類されましたが登録自体は問題なく完了しました。旧カードからの移行は障害中だったのであきらめました。 2015/11/4 次の日の晩、復旧のニュースを見たので早速移行申請し、2015/11/5 の昼頃見てみたら移行完了していました。 感想 Ponta 部分は特に変更なく、発行の敷居の低さに反して JCB デビット自体の機能は十分と思います。 おさいふ Ponta マイページから暗証番号の登録と J/Secure (JCB の本人認証サービス) の有効化が行えるので設定すると良いと思います。 ローソン店頭でおさいふ Ponta 決済をするときは、カードを出した時点でおさいふ Ponta で決済したい旨を伝えなかった場合は、Ponta カードのスキャンだけして返してくれました。 個別の移行手順 ローソンモバイル Ponta Android 端末内蔵の FeliCa に登録するローソンモバイル Ponta の変更はローソンアプリからログアウトして、かざすフォルダのおさいふポンタを削除、ローソンアプリで新 Ponta ログイン、ログイン時にモバイル Ponta 登録オプションを有効にして更新できました。 参考: 5. 機種変更する場合はどうなりますか? リクルートID リクルートIDとの連携は旧 Ponta 側をコネクト解除して、新 Ponta 側とコネクトしました。これは即座に完了しました。 参考: Pontaコネクトを解除するにはどうすればよいですか。 JMB×Ponta会員 JMB×Ponta会員は旧 Ponta 側でログインし連係解除を行った後、3日目にようやく新カードでの連携に成功しました。ここの連携は日次バッチ?のようなので気長に待つ必要があるようです。 参考: Pontaカードを2枚持っているが、JMBとの登録カードを変更したい場合はどうすればよいですか?

[isucon] ISUCON5 予選敗退しました

ISUCON5 予選に土曜日の日程で参加しました。チーム名は円山町、チームメンバーは @ymz_kotaro と2人です。主にアプリの改良を担当しました。午後6時半ごろのスコアは12000点ほどで予選敗退しました。 予選当日の流れは大体こんな感じでした。 午前11時~午後2時 何もいじらずにベンチマーク実行、タイムアウトでFAIL。 my.cnf の設定すべき個所に右往左往しながら innodb_buffer_pool = 1G を設定してようやくベンチマーク通過。 GoAccess で nginx のアクセスログを解析してアプリ宛にしかリクエスト来てないと判断し、nginx の設定は放置することとする。 Ruby 実装のまま MySQL にスロークエリログ 0.1 秒を仕込んで pt-query-digest 見る、インデックスなしのクエリを発見したのでひとまずインデックスを修正。 Go 実装に systemd の設定を切り替えてテスト、ベンチマークはエラー多数で FAIL。 エラー原因を目視確認しようとするが見つけられず。試しに一度 go build -o app を実行して再起動すると動くことを発見。 3回連続でベンチマーク正常を確認したのでGo実装を使うこととする。 午後2時~午後7時 Go実装のアプリにデバッグ用サーバー net/http/pprof を組み込んで再起動する。ベンチマークを流しながら go tool pprof で CPU プロファイルを取得し、top50 -cum で関数プロファイル、list GetIndex で行プロファイルを取得して遅い部分を解析 プロファイル上時間がかかっているように見える N+1 クエリを修正。 users テーブルへの書き込みがないので初期化時に全体をロードするいんちきオンメモリ化を施す。 全て修正完了したと思っていた N+1クエリについて、テンプレート関数経由でデータベースアクセスしている部分を発見したので修正。 テンプレートエンジンを高速化しようと試行錯誤するがいまいち早くならず終了。 午後7時時点でやり残したと思っていた点 html/template の使い方でリクエストごとにテンプレートを解析していたので何とかする gorilla/mux を julie...

Windows 10: EMET 5.2 有効下で Internet Explorer 11 が起動しない

Internet Explorer 11.0.10240.16384 と、EMET 5.2.5546.19547 の組み合わせで、Internet Explorer が起動時に音沙汰なくクラッシュします。 イベントビューアーの Windows ログ > Application には以下のようなログがありました。 障害が発生しているアプリケーション名: iexplore.exe、バージョン: 11.0.10240.16384、タイム スタンプ: 0x559f3a1c 障害が発生しているモジュール名: ntdll.dll、バージョン: 10.0.10240.16392、タイム スタンプ: 0x55a864a2 例外コード: 0xc0000409 障害オフセット: 0x00000000000963e0 障害が発生しているプロセス ID: 0x10c0 障害が発生しているアプリケーションの開始時刻: 0x01d0cbebdd651de2 障害が発生しているアプリケーション パス: C:\Program Files\Internet Explorer\iexplore.exe 障害が発生しているモジュール パス: C:\WINDOWS\SYSTEM32\ntdll.dll EMET をアンインストールしても回避できますが、以下の公式サポートフォーラムに具体的な解決策がありました。 Emet 5.2 on windows10 10130 - Microsoft Community EMET の設定画面を開いて、Configuration > Apps で、iexplorer.exe の EAF を無効化すると大丈夫みたいです。EAF+ は有効なままでも大丈夫でした。Default Action が Audit only になっていても EAF が有効だとクラッシュするようです。 この問題に関して、マイクロソフトにはクラッシュレポートが大量に送信されていると思うので、速やかに修正されると思います。問題の修正後はこの一時的な無効化を解除するため、デフォルトの設定にリセットすると安全と思います。 2015/10/7 追記 Windows 10 に正式に対応する EMET 5.5 Beta がリリースされていて、EAF を無効化しな...

[Node.js] http client がリクエスト6回目以後ハングする

Node.js v0.10.x の http.globalAgent は、keepAlive = true, maxSockets = 5 になっているので、同一 Origin に対して5コネクション全てを腐らせるとハングします。 具体的には 公式ドキュメントの http.get のサンプルコード そのままで、複数回のリクエストを行うようにすると6回目以降必ずハングします。 var http = require('http'); setInterval(function () { http.get("http://www.google.com/index.html", function(res) { console.log("Got response: " + res.statusCode); // res.resume(); すれば OK }).on('error', function(e) { console.log("Got error: " + e.message); }); }, 1000); この事情に関しては、 Class: http.ClientRequest の章に丁寧に記述されているとおり、コールバック関数で受ける res は paused readable stream で、on data で内容を読むか、resume で捨てるかどちらかを必ず行う必要があります。 この状況の詳細なログを見るには、以下のように環境変数 NODE_DEBUG に http を入れるとデバッグログが出力されます。 $ node --version v0.10.39 $ NODE_DEBUG=http node foobar.js # 正しい場合の出力 HTTP: outgoing message end. HTTP: AGENT incoming response! HTTP: AGENT isHeadResponse false Got response: 302 HTTP: AGENT socket keep-alive HTTP: outgoing message e...