Makefileで相対パスからinclude
Makefileから共通ビルド定義をincludeする際にお決まりでincludeするファイルが複数あった場合に、MakefileはC/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.
Win8で削除時に確認ダイアログを表示する
ごみ箱アイコンを右クリックしてプロパティを表示。「削除の確認メッセージを表示する」をチェックしておく。
うっかり連打で隣のファイルまで削除されてビビる。
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
とりあえず資料をポチった。
メモリダンプファイルが相変わらず保存されている
先日の設定は有効ではなかったようで。。どうやって止めるんだろう?