Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

CentOS7にNewRelicのnginxプラグインをセットアップする

まずyumでプラグインを入れないといけないですが、そのためにまずリポジトリを追加しないといけません。 以下ファイルを編集します。

/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/
gpgcheck=1
enabled=1

OSは"centos" OSRELEASEは"7"に置き換えます。

http://nginx.org/keys/nginx_signing.key ここにあるファイルの内容を/tmp/keyに保存します。

それをインポートします。

sudo rpm --import nginx_signing.key

これで以下のコマンドが動くようになるはずです。

yum install nginx-nr-agent

インストールが終わったら、

/etc/nginx-nr-agent/nginx-nr-agent.ini

を開き

newrelic_license_key を置き換えます。また

[source1]
name=nginx
url=http://127.0.0.1/nginx_stub_status

とします。

/etc/nginx/nginx.conf に以下を追加します。

location /nginx_stub_status {
    stub_status on;
    allow 127.0.0.1;
    deny all;
}
service nginx-nr-agent start

を実行しNewRelicのPluginタブにnginxが表示されたらOKです。

Thanks for Downloading! - NGINX

http://nginx.org/en/linux_packages.html?_ga=1.28488380.1615085713.1475315790

Using New Relic to Monitor Nginx. Here's how.

IPv6環境のActionMailerでのgmail送信でNet::OpenTimeoutエラー発生

IPV6環境のActionMailerでgmail送信すると Net::OpenTimeout (execution expired): となってしまい送信できない。

telnet smtp.gmail.comを実行すると分かるが、まずIPv6で接続をトライし、60秒くらいでタイムアウトした後、IPv4で接続トライする。 最初からIPv4で接続すれば動作するので、IPv6よりIPv4を優先する設定を入れると動作するようになる。 CentOS7で/etc/gai.confファイルに以下の内容を設定する。

label       ::1/128        0
label       ::/0           1
label       2002::/16      2
label       ::/96          3
label       ::ffff:0:0/96  4
precedence  ::1/128        50
precedence  ::/0           40
precedence  2002::/16      30
precedence  ::/96          20
precedence  ::ffff:0:0/96  100

DATAPUISTOKEMISTI: Prefer IPv4 over IPv6 on CentOS 6

smtp - Rails Mailer "Net::OpenTimeout: execution expired" Exception on production server only - Stack Overflow

apple-touch-icon.png 読み込みエラーの抑制

safariでrailsで作ったサイトにアクセスした時に、railsのログにapple-touch-icon.pngが読み見込めないエラーが出ている。 このエラーを抑制するにはrailsでfaviconファイルがあるフォルダpublicに0バイトのapple-touch-icon.pngを置けば良い。

$ touch apple-touch-icon.png
$ touch apple-touch-icon-precomposed.png

C++11 type_traits の原理

std::iteratorのソースを読んでいたところ、C++11のtype_traitsがよく分からないため、勉強中。

備忘録として解説しておく。

C++11で<type_traits>というヘッダがSTLに追加されている。

type_traits - cpprefjp C++日本語リファレンス

型の特性を判定、操作するための機能らしい。

<type_traits>ヘッダから、integral_constant,is_const構造体を取り出し、 とりあえず、必要ない部分をカットして簡略化し、サンプルソースにしてみた。

template <class T, T v> struct integral_constant {
    static const T value = v;
};

typedef integral_constant<bool, true>  true_type;
/*
 展開するとこうなる
 struct true_type {
   static const bool value = true; 
 };
 */

typedef integral_constant<bool, false> false_type;
/*
 展開するとこうなる
 struct false_type {
   static const bool value = false;
 };
 */

// (A)
template <class T> struct is_const : public false_type
{
};

// (B)
template <class T> struct is_const<T const> : public true_type
{
};

int main(int argc, const char * argv[]) {
    
    // SFINEにより、(A)のテンプレートクラスに展開される
    printf("%d\n", is_const<int>::value); // 0
    
    // SFINEにより、(B)のテンプレートクラスに展開される
    printf("%d\n", is_const<const int>::value); // 1
    
    return 0;
}

integral_constantはstatic constな変数を一つだけ持つ構造体だ。 is_const構造体はこの構造体を継承して作られる。

true_type, false_typeはvalueにそれぞれtrue,falseの値が入った構造体となる。

難しいのは(A),(B)の部分。 SFINEを理解するため、まず、C++での関数オーバーロードについて考える。

// (C)
int func(void) { return 1; }
// (D)
int func(int) { return 2; } 

func(); // (C)が呼び出される
func(3); // (D)が呼び出される

このようにC++には同じ名称の関数が引数に応じて呼び分けられる関数オーバーロードという機能がある。 似た仕組みで同じ名称のクラステンプレートがテンプレート引数に応じて呼び分けられる機能がSFINEと考えてよい。 ルールとしては、最も指定が一致するものから検索される。

そのため、(A),(B)は同じ名称のクラステンプレートだが、(B)の方が指定が多く、(A)は(B)を含む一般性を持つ。 型Tにconstが指定されている場合は、(B)の方が指定が一致しているのでこちらに置き換えられ、 型Tにconstが指定されていない場合は、(B)に一致しないので、(A)に置き換えられるのである。

C++11でのautoを使った関数定義

C++11では関数定義をautoを使って書くことができるようになった。 今まで

int get_value(void);

と書いていたものが、C++11以降はこのようにも書ける

auto get_value(void) -> int;
int get_value1(void)
{
    return 1;
}

auto get_value2(void) -> int
{
    return 2;
}

int main(int argc, const char * argv[]) {
    
    printf("value1 %d\n", get_value1());
    printf("value2 %d\n", get_value2());
    
    return 0;
}

これ何でautoなんだろう。。 ソースのググラビリティが下がってしまって残念すぎるので使う気になれないなあ。 fnとかfuncとかがベストだと思うけどなあ。