VC2013が無名構造体のメンバに初期値を記述しても初期化してくれない

VisualStudio2013のC++11実装が甘い。

// hoge.cpp
#include <stdio.h>

struct Hoge {
    int one = 11;
    int two = 12;
    int sun = 13;

    struct named_t {
        int one = 21;
        int two = 22;
        int sun = 23;
    } named;

    struct {
        int one = 31;
        int two = 32;
        int sun = 33;
    } noname;
};

int
main(int, const char**) {
    Hoge hoge;
    printf("hoge.one = %d\n", hoge.one);
    printf("hoge.two = %d\n", hoge.two);
    printf("hoge.sun = %d\n", hoge.sun);
    printf("hoge.named.one = %d\n", hoge.named.one);
    printf("hoge.named.two = %d\n", hoge.named.two);
    printf("hoge.named.sun = %d\n", hoge.named.sun);
    printf("hoge.noname.one = %d\n", hoge.noname.one);
    printf("hoge.noname.two = %d\n", hoge.noname.two);
    printf("hoge.noname.sun = %d\n", hoge.noname.sun);
    printf("ok.\n");
    return 0;
}
# SConstruct
Program('hoge.cpp',CCFLAGS=['/W4','/WX'])
$ scons -Q hoge.exe && ./hoge
cl /Fohoge.obj /c hoge.cpp /TP /W4 /WX
Microsoft(R) C/C++ Optimizing Compiler Version 18.00.31101 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

hoge.cpp
link /nologo /OUT:hoge.exe hoge.obj
hoge.one = 11
hoge.two = 12
hoge.sun = 13
hoge.named.one = 21
hoge.named.two = 22
hoge.named.sun = 23
hoge.noname.one = 0
hoge.noname.two = 0
hoge.noname.sun = 0
ok.

$ g++ --version
g++ (GCC) 4.9.3
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ -Wall -std=c++11 -o hoge hoge.cpp && ./hoge
hoge.one = 11
hoge.two = 12
hoge.sun = 13
hoge.named.one = 21
hoge.named.two = 22
hoge.named.sun = 23
hoge.noname.one = 31
hoge.noname.two = 32
hoge.noname.sun = 33
ok.

警告も出さないとかマジかVC…。初期値記述するときは無名構造体を使うのはやめよう。

nginxで認証必須にする

nginxでBASIC認証を通過していなければ何も出来ないようにする方法。

# /etc/nginx/conf.d/default.conf
server {
  listen 443 default ssl;
  server_name hoge.com;

  # SSL証明書
  ssl_certificate     /etc/nginx/conf.d/ssl/server.crt;
  ssl_certificate_key /etc/nginx/conf.d/ssl/server.key;

  # BASIC認証
  auth_basic Restricted;
  auth_basic_user_file /etc/nginx/userpass;

  # 認証が通っていれば /=/... に内部リダイレクト
  location / {
    if ( $remote_user != "" ) {
      rewrite /(.*) /=/$1 last;
      break;
    }
  }

  # 認証必須領域
  location /=/ {
    # 以下は内部リダイレクト専用領域
    # 外部からアクセスすると 404 を返す
    internal;

    location /=/app/ {
      ... 中略 ...
    }
  }

  ... 中略 ...
}

nginx-1.9.5で確認。以前はif($remote_user=""){break;}をlocationごとに書いてたけど、これでいけるっぽい。

304を求めて

nginx/uwsgi/moinmoinを運用しているのだけどLastModified/IfModifiedSinceが一致するのにnginxが304を返してくれない。

http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_revalidate
↑これだけだとダメなのか。。わからん。。

http://www.amazon.co.jp/dp/4774176338/ref=sr_1_1?ie=UTF8&qid=1444353040&sr=8-1&keywords=nginx

とりあえず資料をポチった。

「システムエラーのメモリ ダンプファイル」がデカすぎる件

ハードディスクの残量が少ないのでちょいちょいディスク クリーンアップしてるんですが、「システムエラーのメモリ ダンプファイル」が10GBを超えててギョっとしたので保存しない方法を探してみた。

http://www.jyoukyoutools.com/?p=899
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10108328705

自分の環境はWin7で「システムの詳細設定の表示→詳細設定タブ→起動と回復の設定ボタン→デバッグ情報の書き込みのカーネルメモリダンプをなしに変更」にした。

もうディスククリーンする日常とはさよならしたい。

getoptの戻り値をグループ化

こういうのが欲しい。

# hoge.py
import sys
import getopt
import itertools

opts, argv = getopt.getopt(sys.argv[1:], 'x:y:z:')

keyfunc = lambda item: item[0]
opts = sorted(opts, key=keyfunc)
opts = itertools.groupby(opts, key=keyfunc)
opts = [(k, list(vv for _, vv in v)) for k, v in opts]
opts = dict(opts)

import pprint
pprint.pprint(dict(opts=opts, argv=argv))
$ python hoge.py -x5 -y6 -x7 -y8 -z9 -x0 foo bar baz
{'argv': ['foo', 'bar', 'baz'],
 'opts': {'-x': ['5', '7', '0'], '-y': ['6', '8'], '-z': ['9']}}

optsの合成がもっとスマートに出来ないものか。