Makefileで相対パスからinclude

Makefileから共通ビルド定義をincludeする際にお決まりでincludeするファイルが複数あった場合に、MakefileC/C++とは違ってinclude先でのパスはinclude元と同じで簡単にパスを取得する方法が見つけられなかったので毎回下記のようにしていた。

# share/common.mk
CC := $(CC)

# share/build.mk
CC_CMD := $(CC) -O0 -g

# app/Makefile
include ../share/common.mk
include ../share/build.mk

毎回お決まりで2つincludeを書くのがメンドウだったのだけど、下記のようにするとinclude先からの相対include出来るのを発見した。

# share/common.mk
CC := $(CC)

# share/build.mk
BUILD_MK_DIR := $(dir $(lastword $(MAKEFILE_LIST))) # ../share/
include $(BUILD_MK_DIR)common.mk

CC_CMD := $(CC) -O0 -g

# app/Makefile
include ../share/build.mk

$(MAKEFILE_LIST)はinclude毎に末尾にMakefileのパスが増えていくので、lastwordで末尾を取ればすなわちカレントのMakefileのパスということのようだった。

makeのバージョンはこちら

# make --version
GNU Make 4.1
このプログラムは i686-pc-cygwin 用にビルドされました
Copyright (C) 1988-2014 Free Software Foundation, Inc.

cppcheckのバグ

cppcheck-1.72で確認。

// hoge.cpp
class Base {
};
template<typename T>
class Hoge<T[]> final : public Base {
};
void func() {
    int a[2];
    a[5] = 0;
}
$ cppcheck hoge.cpp
Checking hoge.cpp...

Hogeのfinal消すか継承を消すかT[]をTにするとちゃんと動く

$ cppcheck hoge.cpp
Checking hoge.cpp...
[hoge.cpp:15]: (error) Array 'a[2]' accessed at index 5, which is out of bounds.

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

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