カメニッキ

カメとインコと釣りの人です

よく使うGitHubのリポジトリは、ブラウザのカスタム検索設定をしておくと便利

よくあるアレ 設定が面倒くさくて放置してたけど、便利

やりたいこと

ブラウザのアドレスバーから https://git.tahira.com/hoge/fuga のissue検索を行いたい

通常のフローだと、3ステップ

  1. https://git.tahira.com/hoge/fuga へアクセス
  2. 左上の検索欄にキーワード入力して検索
  3. issueタブを選択

設定すると、1ステップ

  1. ブラウザのアドレスバーから直接ジャンプ

設定方法

GoogleChromeの場合

(1) GoogleChromeの設定画面から 検索エンジンの管理... を選択

f:id:tapira:20160323113031p:plain

(2) 検索エンジンを追加 より新規追加

f:id:tapira:20160323113606p:plain

  • 検索エンジンを追加・・・任意の名前
  • キーワード・・・アドレスバーからカスタム検索を実行するためのキーワード(なんでもよい)
  • URL・・・通常のフローで検索した際のアドレスバーからコピる。サンプル: https://git.tahira.com/hoge/fuga/search?q=検索したいキーワード&type=Issues&utf8=%E2%9C%93 これの、 q=XXXXXXq=%s に修正して記載

使用方法

(1) アドレスバーに設定したキーワード hogefuga と入力

f:id:tapira:20160323113659p:plain

(2) スペースを開けると GH:E hogefuga を検索 と表示が切り替わるので続けて検索したいキーワードを入力しEnter

f:id:tapira:20160323113747p:plain

以上!

Apache拡張モジュール「mod_resource_checker」のソースを眺めてる (途中)

はじめに

  • Cのお勉強のいっかんとして取り組んでいます
  • なので、誤った情報である可能性があります
  • 自分用の覚え書き情報が主なので、役に立たないかもしれません

お題

github.com

mod_resource_checker?

Process Resource Logging Module using JSON format into file or piped program.

アクセス毎にApacheプロセスの使用したOSのリソース情報を、JSON形式でログ出力することができます。

[PMAC226S ~/Downloads]$ tail -1 resource.log | jq .
{
  "module": "mod_resource_checker",
  "date": "Sun Feb 28 22:53:58 2016",
  "type": "RCheckALL",
  "unit": null,
  "location": "/var/www/*/*/web/",
  "remote_ip": "123.456.789.000",
  "filename": "/var/www/web/wp/index.php",
  "scheme": "http",
  "method": "GET",
  "hostname": "hoge.com",
  "server_ip": "192.168.0.111",
  "uri": "/wp/index.php",
  "real_server_name": null,
  "uid": 1234,
  "size": 418,
  "content_length": 0,
  "status": 200,
  "pid": 16431,
  "threshold": null,
  "response_time": 0,
  "result": {
    "RCheckUCPU": 0.552367,
    "RCheckSCPU": 0.00806,
    "RCheckMEM": 0.644531
  }
}

mod_resource_checker.c 読んでいきます

1. 末尾のモジュールをApacheへ登録する部分

722
723 #ifdef __APACHE24__
724 AP_DECLARE_MODULE(resource_checker) = {
725 #else
726 module AP_MODULE_DECLARE_DATA resource_checker_module = {
727 #endif
728     STANDARD20_MODULE_STUFF, (void *)resource_checker_create_dir_config, /* create per-dir    config structures */
729     NULL,                                                                /* merge  per-dir    config structures */
730     (void *)resource_checker_create_config,                              /* create per-server config structures */
731     NULL,                                                                /* merge  per-server config structures */
732     resource_checker_cmds,                                               /* table of config file commands       */
733     resource_checker_register_hooks                                      /* register hooks                      */
734 };

__APACHE24__ で判定しているのは、Apache2.4とそれ以前で定義方法に差異があるからでしょうか。
728〜732行は http://blog.matsumoto-r.jp/?p=603 を読んでお勉強。
とりあえず今は設定がちゃんとされてますか、の面倒をApache起動時に見るための記述という理解。
リクエストを処理する際に気にするところは、 resource_checker_register_hooks の中で設定されたhook関数群かな

2. 登録されたhook関数

715 static void resource_checker_register_hooks(apr_pool_t *p)
716 {
717   ap_hook_post_config((void *)resource_checker_init, NULL, NULL, APR_HOOK_MIDDLE);
718   ap_hook_access_checker(before_resource_checker, NULL, NULL, APR_HOOK_LAST);
719   ap_hook_fixups(resource_checker_handler, NULL, NULL, APR_HOOK_LAST);
720   ap_hook_log_transaction(after_resource_checker, NULL, NULL, APR_HOOK_LAST);
721 }

ap_hook_XXXX はhookさせたいタイミングに応じて、様々な種類がある。詳細は http://d.hatena.ne.jp/dayflower/20081029/1225266220http://blog.matsumoto-r.jp/?p=1625 にまとまっている。 今回のものでいくと、

  • ap_hook_post_config - 設定初期化時
  • ap_hook_access_checker - アクセス制御を行う前(なので、アクセス制御をおこなう)
  • ap_hook_fixups - よくわからん・・・
  • ap_hook_log_transaction - レスポンス後のロギング処理時

今回の mod_resource_checker はリソース情報をロギングすることが目的なので、 ap_hook_log_transaction が重要な仕事をやってそう。

3. ap_hook_log_transaction でやっていること

577 static int after_resource_checker(request_rec *r)
578  {
579    mod_rc_dir_conf *dconf = (mod_rc_dir_conf *)ap_get_module_config(r->per_dir_config, &resource_checker_module);
580    mod_rc_conf *sconf = (mod_rc_conf *)ap_get_module_config(r->server->module_config, &resource_checker_module);
581    mod_rc_rusage *before_resources = dconf->before_resources;
582
583    if (dconf->cpu_utime == INITIAL_VALUE && dconf->cpu_stime == INITIAL_VALUE && dconf->shared_mem == INITIAL_VALUE &&
584        dconf->check_status == OFF && dconf->check_all == OFF)
585      return DECLINED;
586
587    int match;
588    struct stat sb;
589    mod_rc_rusage *after_resources;
590    after_resources = (mod_rc_rusage *)apr_pcalloc(r->pool, sizeof(mod_rc_rusage));
591    mod_rc_rusage *use_resources;
592    use_resources = (mod_rc_rusage *)apr_pcalloc(r->pool, sizeof(mod_rc_rusage));
593
594    mod_rc_client_data *cdata;
595    cdata = (mod_rc_client_data *)apr_pcalloc(r->pool, sizeof(mod_rc_client_data));
596
597    if (resource_checker_initialized == 0) {
598      return OK;
599    }
600
601    if (r->main && (stat(r->filename, &sb) == -1) && errno == ENOENT) {
602      return OK;
603    }
604
605    cdata->access_uri = r->uri;
606    cdata->access_file = r->filename;
607  #ifdef __APACHE24__
608    cdata->access_src_ip = r->connection->client_ip;
609  #else
610    cdata->access_src_ip = r->connection->remote_ip;
611  #endif
612    cdata->access_dst_host = r->server->server_hostname;
613
614    if (dconf->check_status == ON) {
615      _mod_resource_checker_logging(r, 0, 0, NULL, dconf, cdata, MODULE_NAME, "RCheckSTATUS", NULL, r->pool);
616    }
617
618    // threashould check
619    if (before_resources == NULL) {
620      ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r, "%s NOTICE %s: Can not check resource of the request: file = %s",
621                    MODULE_NAME, __func__, r->filename);
622      return DECLINED;
623    }
624
625    match = 0;
626    after_resources->cpu_utime = INITIAL_VALUE;
627    after_resources->cpu_stime = INITIAL_VALUE;
628    after_resources->shared_mem = INITIAL_VALUE;
629
630    if (dconf->cpu_utime > INITIAL_VALUE || dconf->check_all == ON) {
631      match = 1;
632      if (dconf->check_all == ON)
633        after_resources->cpu_utime = _get_rusage_resource(r->pool, "ALL", "cpu_utime");
634      else
635        after_resources->cpu_utime = _get_rusage_resource(r->pool, dconf->utime_process_type, "cpu_utime");
636    }
637
638    if (dconf->cpu_stime > INITIAL_VALUE || dconf->check_all == ON) {
639      match = 1;
640      if (dconf->check_all == ON)
641        after_resources->cpu_stime = _get_rusage_resource(r->pool, "ALL", "cpu_stime");
642      else
643        after_resources->cpu_stime = _get_rusage_resource(r->pool, dconf->stime_process_type, "cpu_stime");
644    }
645
646    if (dconf->shared_mem > INITIAL_VALUE || dconf->check_all == ON) {
647      match = 1;
648      if (dconf->check_all == ON)
649        after_resources->shared_mem = _get_rusage_resource(r->pool, "ALL", "shared_mem");
650      else
651        after_resources->shared_mem = _get_rusage_resource(r->pool, dconf->mem_process_type, "shared_mem");
652    }
653
654    if (match == 0) {
655      return OK;
656    }
657
658    use_resources->cpu_utime = after_resources->cpu_utime - before_resources->cpu_utime;
659    use_resources->cpu_stime = after_resources->cpu_stime - before_resources->cpu_stime;
660    use_resources->shared_mem = after_resources->shared_mem - before_resources->shared_mem;
661
662    // unexpected value; resource is negative number
663    if (use_resources->cpu_utime < 0) {
664      use_resources->cpu_utime = 0;
665    }
666    if (use_resources->cpu_stime < 0) {
667      use_resources->cpu_stime = 0;
668    }
669    if (use_resources->shared_mem < 0) {
670      use_resources->shared_mem = 0;
671    }
672
673    if (dconf->cpu_utime > INITIAL_VALUE && use_resources->cpu_utime >= dconf->cpu_utime) {
674      _mod_resource_checker_logging(r, use_resources->cpu_utime, dconf->cpu_utime, dconf->utime_process_type, dconf,
675                                    cdata, MODULE_NAME, "RCheckUCPU", "sec", r->pool);
676    }
677
678    if (dconf->cpu_stime > INITIAL_VALUE && use_resources->cpu_stime >= dconf->cpu_stime) {
679      _mod_resource_checker_logging(r, use_resources->cpu_stime, dconf->cpu_stime, dconf->stime_process_type, dconf,
680                                    cdata, MODULE_NAME, "RCheckSCPU", "sec", r->pool);
681    }
682
683    if (dconf->shared_mem > INITIAL_VALUE && use_resources->shared_mem >= dconf->shared_mem) {
684      _mod_resource_checker_logging(r, use_resources->shared_mem, dconf->shared_mem, dconf->mem_process_type, dconf,
685                                    cdata, MODULE_NAME, "RCheckMEM", "MiB", r->pool);
686    }
687
688    if (dconf->check_all == ON && dconf->json_fmt == ON) {
689      _mod_resource_checker_logging_all(r, use_resources, dconf, sconf, cdata, r->pool);
690    }
691
692    return OK;
693  }

アクセス元IP・CPU使用量・メモリ使用量などかきあつめて、どこまで記録するかの設定に応じてロギング関数に投げてるのかな。

メモ

  • 下部のモジュール定義の書き方、処理させたいタイミングに応じてhook関数を設定する、というやり方は他のApacheモジュールでも同じっぽくて、今後読むときはそこから見ていこう
  • 様々なhookさせるポイントがあって、むずかしい。
  • 調べてもあんまり情報でてこなくて辛い

ほとんど独り言みたいな内容になってしまった。おしまい

HAGLOFSのROC SPRIT JACKETが日本では高すぎるので、個人輸入したメモ

この記事を参考にするのは自己責任で。正確性を保証するものではありません

デンマークから通販する機会はあまりなさそうなので、他に迷っている方の助けになれればと思ってメモ

Target

f:id:tapira:20160214094810j:plain

ハードコアに山を楽しむ人の、ハードコアな Roc スピリットジャケット! 3L GORE-TEX® Proを使用しクリーンなラインと究極の耐久性を兼ね備えた、季節を問わず活躍する機能満載のフード付きジャケット。(http://www.haglofs.com/jp/ja/Jackets/ROC-SPIRIT-JACKET-MEN/p/602656.2UY より引用)

「お前山登りしないだろ」というツッコミは無しで、釣り&通勤での利用で見た目が気に入って欲しくなったやつです。

日本では高すぎる&在庫が無い

  • 楽天 - \78,980 かつこの色は在庫なし。セール期間に \55,944 があったが在庫なし
  • Amazon - \67,000 ~ 79,900 かつこの色は在庫なし
  • ヤフーショッピング - 同上
  • 怪しい日本語の - 5万円台で過去に売っていたようだが、在庫なし

Backpacking United を検討

BACKPACKING-united(バックパッキング-ユナイテッド)はドイツにあるアウトドア専門の通販サイトです。(http://www.outdoorgear.blue/より引用)

Haglofs Roc Spirit Jacket Men Hurricane Blue - jp

が、在庫なし。

Backcountry.com

アメリカユタ州ソルトレイクにある。大手のアウトドア、スポーツのネットショップ専門店。 (http://www.kaigaituhan.com/より引用)

Haglöfs Roc Spirit Jacket - Men's | Backcountry.com

在庫ある!が、アメリカのため(?) メーカーの掛けている国外への輸出制限にひっかかり、日本国への直接発送はできない ため、malltailなどの輸入代行業者を利用する必要がある。

結局 friluftslageret.dk で購入

デンマークのアウトドアショップ

Friluftslageret - Specialbutik til friluftsliv og en aktiv hverdag

  • 商品 : 1.599,20DKK
  • 送料 : 248DKK
  • 計 : 1.847,20DKK

f:id:tapira:20160214101910p:plain

圧倒的に安い&日本に直接発送してくれる

というわけで、このサイトから日本へ個人輸入した方をネットで調べて情報を集め、問題なさそうという判断にいたり、ポチる。

f:id:tapira:20160214103147p:plain

f:id:tapira:20160214103318p:plain

  • 英語が通じるので、気になることはメールで問合せましょう。すぐ返してくれました
  • デンマークの数値表記は ドットが桁区切り カンマが小数点 らしいです

不正利用が怖いので、決済金額だけを口座に入れたVISAデビットカードを使うと良さそうです。

ドキドキしながら決済を済ませると、注文完了メールがきます。時差で多少ずれますが、おそらくその日のうちに発送完了メールがきます。

ヤマトの追跡っぽい画面で、状況を確認できます。

f:id:tapira:20160214104006p:plain

Locationがずっとデンマークのまま The shipment item has arrived at the country of destination. というステータスになって「????」となってました。

税関通過後 The shipment item has arrived at the distribution terminal になって半日くらいで手元にとどきました。

ぼくの場合郵便局が配達してきてくれて、 玄関口で関税の支払い をし、受け取りました。

関税の計算について

今回の場合 個人利用を目的 として 20万円以下 という条件で税金計算が行われます。以下のようになります。 (商品代金は 1.599,20DKK = \27,000 で計算)

  • 関税 - 27,000 * 0.6 * 0.1 = \1,620 (個人利用目的じの軽減措置として商品代金の60%が課税対象となり、衣類の簡易税率は10%)
  • 消費税 - 31,000 * 0.6 * 0.063 = \1,171(消費税は送料込みの金額にかかるっぽい?税率も6.3%でよくわからん)
  • 地方消費税 - 数百円(これも計算がよくわからん)

細かい話はこの辺参照してください 関税・消費税・諸税について(輸入時に課税されるもの)|個人輸入代行、海外発送サービス【malltail】公式サイト

大した金額でもないので、多く見積もってもお店に支払った合計の10%くらい余計にとられる、くらいの認識で良さそう。

まとめ

  • 調べて使えば海外通販はお得(およそ日本の半額で買えた)
  • デンマーク→福岡で5日間くらいで届く
  • 関税がかかるので注意
  • 国によって数字の区切り文字が違う

何かの参考になれば。

コピペでssl_ciphers(暗号化スイート)の指定をやってたけど、もうちょっと調べてみた

tapira.hatenablog.com

SSL Server Testで A+ 判定を得るために、Generate Mozilla Security Recommended Web Server Configuration Files で生成した設定を一部利用しています。 その中でも特に目につくのが↓のなっがいやつでした。

    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';

そもそも暗号化スイートとは?

鍵交換方式 & 鍵認証のアルゴリズム & 共通鍵暗号アルゴリズム & 利用するハッシュ関数 を組み合わせたものを、 暗号化スイート と呼ぶそうです。

ssl_ciphersで先頭にきている一番のおすすめ(?) ECDHE-RSA-AES128-GCM-SHA256 を例にとってみます。

  1. 鍵交換方式(Kx)に ECDHE(楕円曲線ディフィー・ヘルマン鍵共有 - Wikipedia - Elliptic curve Diffie–Hellman key exchange)を使う
    Kxは「安全でない経路で結ばれたサーバとクライアント間で共通鍵を安全に交換する」という目的を達するための仕組み。 公開鍵暗号の鍵交換を担う

  2. サーバ認証のアルゴリズム(Au)にRSA 実際に通信する相手が、証明書の持ち主か認証するための仕組み。 公開鍵暗号の署名を担う

  3. 暗号化の方法(Enc)に AES&GCM
    共通鍵を使用して暗号化通信する際の方式。 共通鍵を交換し終わったあと実際に情報をやり取りする際の暗号化・復号化を担う

  4. ハッシュアルゴリズム(Mac)に SHA256

で、いいのかな。KxとAuの役割の違いがよくわからんくなった。

結論

最新の 鍵交換方式 & 鍵認証のアルゴリズム & 共通鍵暗号アルゴリズム & 利用するハッシュ関数 を全部追っかけとかないといこうとすると辛いなーと思った。
何も考えずにコピペしない、という前提のもと Generate Mozilla Security Recommended Web Server Configuration Files などを参考に、内容を理解し、自身の環境に適用できるか検討したうえで選択する、というのが現実的なところか…

ちなみに

ssl_ciphers で完璧なものを指定しておけば安心!というわけではない(最近おしえてもらった)

  • ssl_prefer_server_ciphers on; でサーバ側の暗号化スイート設定を優先するようにしておかないと、クライアント側の設定が利用されて辛い
  • ssl_session_tickets off; デフォは有効なので、使わないのであれば明示的に off にする。(クラスタ構成にする場合は、複数台のnginxでsession cacheを共有するため有効にし、定期的にkeyの更新を行わせる必要がある。nginx.conf ssl_session_ticket_key /etc/nginx/ticket.key; とファイルを明示し、cronなどで openssl rand 48 > /etc/nginx/tickets.key で定期更新し、各nginxで同じものを使う。
  • ssl_session_timeout 5m; 有効期限が短ければ短いほど、安全なはず。サーバ負荷と相談しつつ設定
  • nginx外のそもそものサーバ設定。ミドルウェアの設定を頑張ってもfirewallが全空きでした!じゃ辛い

とても良い記事 qiita.com

tech.mercari.com

hb.matsumoto-r.jp