CubicLouve

Spring_MTの技術ブログ

Dockerコンテナのリソース利用状況をコンテナ内から把握する

dockerには docker stats というコマンドが用意されており、ホストからdockerコンテナの状態を知ることができます。

docs.docker.com

www.datadoghq.com

crate.io

ホストからこのコマンドを叩けばdockerコンテナのリソース利用状況の一覧を取得できます。

またこの docker stats 相当のREST APIも提供されております。

docs.docker.com

ホストからこんな感じでも情報を取得可能です。

curl --unix-socket /var/run/docker.sock http://localhost/containers/CONTAINER_ID/stats

dockerコンテナ内からこの値も参照したい場合の方法

ホストからは参照できますが、dockerコンテナ内からも参照したいときがあるかもしれません。

その場合は、dockerコンテナ内のファイルを読み込むことで参照もできます。

cat /proc/self/mountinfosys のmount先などを確認します。

gihyo.jp

それで、下記などを見てなんとなくファイルを特定します。

github.com

github.com

例はこんな感じです。

# cat /sys/fs/cgroup/cpu/cpu.stat 
nr_periods 9798
nr_throttled 88
throttled_time 1975163917

参照

https://www.kernel.org/doc/Documentation/cgroup-v1/

suとsudo

su

su コマンドは、PAM認証ユーザーの切り替えを行い、シェルの実行を行います。

su だけ打つとrootユーザーへ切り替え、rootユーザのシェルが実行されます。

su -su -l と同じ意味をもち、ログインするときを全く同じになります。

su(1) manページ

シェルが実行されるので、exit するまでそのユーザの権限で動き続けてしまうため、利用は避けたほうがよいです。

【 su 】コマンド――スーパーユーザー(rootユーザー)の権限でシェルを実行する:Linux基本コマンドTips(67) - @IT

sudo

sudo は、rootユーザーまたは別のユーザとして許可されたコマンドを実行します。

rootユーザーとしてなにかしたい場合は基本的にはこちらを使う。

【 sudo 】コマンド――スーパーユーザー(rootユーザー)の権限でコマンドを実行する:Linux基本コマンドTips(68) - @IT

参考

blog.kentarok.org

www.slideshare.net

ソフトウェアの資産計上について

よくわからんので、まとめていく

用語 説明
減価償却資産(有形固定資産) サーバーとか
減価償却資産(無形固定資産) ソフトウェアはここにあたる
開発後一定期間継続的に利用することが想定されるので、そういうものに費やされた工数(費用)は減価償却する。
販売費及び一般管理費(販管費) 販売費は、販売に関する経費であり販売活動において直接要した費用をいい、販売手数料、販売促進費(広告費)などが該当する。
また一般管理費とは、総務や企業全体を運営し管理するために要した費用をいい、間接部門(人事・経理・役員など)の人件費(給与・賞与・諸手当)、間接部門が入居する事務所を運営するための費用(光熱費家賃減価償却費など)、租税公課、会社全体の福利厚生費、その他の経費(交際費・旅費交通費・通信費など)が該当する。
売上原価
減価償却とは 事業などの業務のために用いられる建物、建物附属設備、機械装置、器具備品、車両運搬具などの資産は、一般的には時の経過等によってその価値が減っていきます。このような資産を減価償却資産といいます。他方、土地や骨とう品などのように時の経過により価値が減少しない資産は、減価償却資産ではありません。減価償却資産の取得に要した金額は、取得した時に全額必要経費になるのではなく、その資産の使用可能期間の全期間にわたり分割して必要経費としていくべきものです。この使用可能期間に当たるものとして法定耐用年数が財務省令の別表に定められています。
減価償却とは、減価償却資産の取得に要した金額を一定の方法によって各年分の必要経費として配分していく手続です。

参考

ADMIN PINGとは

前提

Railsのバージョン

https://github.com/rails/rails/tree/v4.2.6

ADMIN PINGの正体

ADMIN PINGというコマンドはありません。

実態はMySQLのCOM_PINGというコマンドになります。

https://dev.mysql.com/doc/refman/5.6/ja/mysql-ping.html

https://github.com/mysql/mysql-server/blob/71f48ab393bce80a59e5a2e498cd1f46f6b43f9a/libmysql/libmysql.c#L931

pt-query-digestがCOM_PINGのコマンドを ADMIN PINGと見せています。

https://github.com/percona/percona-toolkit/blob/b118e39d1057058b59f0a606946f189f640a693e/lib/MySQLProtocolParser.pm#L590

クエリではないので、単純にtcpdumpしていてもADMIN PINGのコマンドを確認することはできません

(パケットの内容を16進表示して理解できる人には見えるかもしれません)

RubyでADMIN PINGを送っている場所

mysql2にpingを送るMysql2::Client#pingメソッドが用意されています。

https://github.com/brianmario/mysql2/blob/7879f1ee4f976e8b31a4378925f3b7621eb1b431/ext/mysql2/client.c#L1083

pingがbool値を返します。(pingが通ればtrue)

RailsでMysql2::Client#pingを呼び出しているのはActiveRecord::ConnectionAdapters::Mysql2Adapter#active?のみになります。

https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/connection_adapters/mysql2_adapter.rb#L89

ここまでで実態はつかめたかと

実際にActiveRecord::ConnectionAdapters::Mysql2Adapter#active?が呼ばれるまでの経由

これはRailsMySQLとのコネクションを確立するまでの流れを追ってみます。

http://blog.livedoor.jp/sonots/archives/38797925.html sonotsさんのblogがわかりやすいです。

Railsの立ち上げ時

ActiveRecord::Base#establish_connectionが呼ばれるが、この時点ではMySQLサーバーにコネクションは貼られない。

モデルクラスがロードされて、評価されると、pk_cache_adapterがPKを取得するためにMySQLサーバーに通信します。

findとかをMySQLサーバーからデータを取得する

AR::Base.find AR.find(:id)は下記が呼ばれる

find https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/core.rb#L126

AR::ConnectionAdapters::ConnectionPool#connection

findの中でconnectionが呼ばれると下記メソッドが呼ばれます。

connection https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb#L259

AR::ConnectionAdapters::ConnectionPool#checkout

ここでMySQLサーバーにコネクションを貼ったobjectがなければ、checkoutにいきます。

checkout https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb#L347

checkoutでは、 acquire_connectionでpoolからMySQLサーバーにコネクションを貼ったmysql2_adapterのobjectを取ってくる or 新しくMySQLサーバーにコネクションを貼ったmysql2_adapterのobjectを取ってきます。

acquire_connection https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb#L418 その後に、checkout_and_verifyがよばれます。

checkout_and_verify https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb#L454

checkout_and_verifyの中で、AR::ConnectionAdapters::AbstractAdapter#verify!を呼び出して、取ってきたobejctの中のMySQLサーバーのコネクションが生きているかを確認し、 もし死んでたら、MySQLサーバーへのコネクションを貼り直します。

veryfy! https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb#L327

この中で、active?が呼ばれて最終的にpingが飛びます。

ADMIN PINGを抑制するために

AR::ConnectionAdapters::AbstractAdapter#verify!で何もしないようにする

def verify!(*ignored)
  reconnect! unless active? # ここを削除する
end

このveryfy!はconnection_pool経由でobjectを取って来た際に、objectは存在するがMySQLとの接続が切れている可能性があるためにその確認をするためのメソッドかと思います。 (思わぬところでconnectionが切れている、idle状態でwait_timeout超える等々)。

APIはリクエスト毎にMySQLのコネクションを貼り直していることを前提にします。

1リクエスト内では、一度貼ったコネクションをもつobjectは AR::ConnectionAdapters::ConnectionPool#connectionの中で、@reserved_connections インスタンス変数に現在のスレッドのobject_idをキーにキャッシュされ、ここから利用されます。 (余談ですが、WEBrickはmulti threadなWEBサーバーです)

そうすると1リクエスト内で一度AR::ConnectionAdapters::ConnectionPool#connection経由でコネクションを貼ると、AR::ConnectionAdapters::ConnectionPool#checkoutまで到達しません。

なので、AR::ConnectionAdapters::ConnectionPool#checkoutに到達するのは、

最初の一回目でコネクションをはるとき or 1リクエストの中で@reserved_connectionsが開放され、かつARのコネクションプールが残っている場合

です。

最初の一回目はコネクションを貼った直後に切れていることはないと思うので、verify!を向こうにしてADMIN PINGを飛ばないようにしても問題なさそうです。

https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb#L347

      def checkout
        synchronize do
          conn = acquire_connection <- ここで貼ったコネクションが
          conn.lease
          checkout_and_verify(conn) <- この間で切れる場合にveryfy!の結果が効くがそんな刹那なタイミングで切れることはないかと
        end
      end

@reserved_connectionsが開放されARのコネクションプールが残っている場合において、 生存確認がないとMySQL側でコネクションが切られているときにエラーになりますが、MySQLサーバーがコネクションを切る場合はreconnectしてもつながらない場合のほうが多いかなと。

このMySQLサーバーとのコネクションが切れているconnection objectを使って通信すると Lost connection to MySQL のエラーが即座に返ってくるので、詰まることはないと思います。

JavaのJSONObjectのgetIntとoptInt

import org.json.JSONException;
import org.json.JSONObject;

public class HelloWorld {
  public static void main(String... args) {
    String json = "{\"screen_name\":\"katty0324\",\"age\":\"\"}";
    JSONObject jsonObject = new JSONObject(json);
    System.out.println(jsonObject.getInt("age"));                                                                               
  }
}
% javac -J-Dfile.encoding=UTF-8 -classpath . HelloWorld.java
% java HelloWorld
Exception in thread "main" org.json.JSONException: JSONObject["age"] is not an int.
    at org.json.JSONObject.getInt(JSONObject.java:543)
    at HelloWorld.main(HelloWorld.java:8)

こちらはぬるぽ

import org.json.JSONException;
import org.json.JSONObject;

public class HelloWorld {
  public static void main(String... args) {
    String json = "{\"screen_name\":\"katty0324\",\"age\":\"\"}";
    JSONObject jsonObject = new JSONObject(json);
    System.out.println(jsonObject.optInt("age"));                                                                               
  }
}
% javac -J-Dfile.encoding=UTF-8 -classpath . HelloWorld.java
% java HelloWorld
0

0返ってくる

参照

重回帰分析について

spring-mt.hatenablog.com

から続く話です。

単回帰分析では、2つの変量しか扱っていませんでした。

重回帰分析では2変量以上の多変量とを扱います。

ただし、ある1変量を説明しようとするのは単回帰分析でも重回帰分析でもかわりません。

単回帰分析の回帰方程式はこんな感じです。

\displaystyle{
 \hat{y}  = ax + b
}

aが回帰係数、bは切片です

重回帰分析の回帰法的式はこんな感じになります。

\displaystyle{
 \hat{y}  = a_1x_1 + a_2x_2 + a_3x_3 + ・・・  a_nx_n + b
}

単回帰分析と違って多次元になってくるので、もうグラフで表現できなくなってきます。(3変量であれば3次元のグラフがかけますが)

a1、a2、a3を 偏回帰係数 と呼びます。

Excelの回帰分析だと、単に 係数 と表されます。

って書くと難しい感じですが、英語だと partial なはずで、部分的って意味だとまあ、そうだなって感じですね。

偏回帰係数

それぞれの偏回帰係数は、特定の説明変量xについてそれ以外の説明変量の影響を除いた、目的変量 yに対する影響力になります。

特定の説明変量が1変わったときの目的変量 yの平均的な変化を見ることができます。

この偏回帰係数を解釈し、目的変量 yに対するそれぞれの説明変量 xの影響度を測定することがもっともやりたいことなのではないでしょうか?

偏回帰係数の算出は、単回帰分析の回帰係数の算出と同様に最小二乗法を用います。

残差平方和 を Qe としています。

\displaystyle{
Qe = (y1 - \hat{y1})^2 + (y2 - \hat{y2})^2 + ・・・ + (yn - \hat{yn})^2
}

つまり、変数を3つとすると、

\displaystyle{
Qe = (y1 -  a_1x_{11} + a_2x_{21} + a_3x_{31} + ・・・  a_nx_{n1} + b )^2 + (y2 - a_1x_{12} + a_2x_{22} + a_3x_{32})^2 + ・・・ + (yn - a_1x_{1n} + a_2x_{2n} + a_3x_{3n})^2
}

つまり

\displaystyle{
Qe = \sum_{i=1}^{n}  (yi - a_1x_{1i} + a_2x_{2i} + a_3x_{3i})^2
}

となります。

この残差平方和 Qe が最小になるように、つまり 0 になるように方程式を解きます。

ここからは、偏微分を駆使してもろもろ計算していくのですが、すっ飛ばします。

  • 参考

ラグランジュの未定乗数法 - Wikipedia

重回帰(説明変数が複数個))の場合

各偏回帰係数の検定

偏回帰係数が求められても、その影響力が有意なものかはわかりません。

それを測るために、説明変量ごとにt検定を行います。

t検定はt分布を用いた検定となっています。

t分布については下記リンクなどを参照ください。(これはこれで大きいネタすぎる。。)

t分布 - Wikipedia

t分布はt値が分布したものです。

t値は 偏回帰係数 / 標準誤差 によって求められます。

t検定においては、「偏回帰係数の影響力は0」である帰無仮説(棄却したい仮説)を棄却できるか(背理法)を検定します。

帰無仮説が正しい場合、t値はt分布に従います。

ここでのP値はt値が出現する確率となります。

この確率が低ければ、t値はt分布に従わないため、帰無仮説を棄却することができます。

P値は一般的には0.05を下回っていると有意であると言われます。

参考

Excelにおける回帰分析 (5)説明変数に関する出力

27-2. 重回帰分析 | 統計学の時間 | 統計WEB

標準偏回帰係数

説明変量 x が同じ尺度(単位)である場合は、偏回帰係数同士比較しても問題はないですが、異なる尺度の場合はデータを標準化して比較する必要があります。(x1は身長、x2は体重とかの場合など)

これを、標準化された偏回帰係数を 標準偏回帰係数 と呼びます。

標準化とは、観測対象によって変わってしまうデータのばらつきを同じ尺度(グラフ上の同じ縦軸と横軸)で表現できるようにすることです。

具体的には、データ全体を平均を0、標準偏差(分散)を1 に変換することです。

データ値から全体の平均を引いて、全体の標準偏差で割ることで標準化ができます。

標準化された個々の値は標準化変量 z と呼ばれます。

標準偏回帰係数は、データを全て標準化すれば求められますが、下記の式でも求められます。

標準偏回帰係数=偏回帰係数×説明変数の標準偏差÷目的変数の標準偏差

多分この式を展開して解けば同じ答えになると思うけど、ここではすっ飛ばします。

\displaystyle{
Qe = \sum_{i=1}^{n}  ( \frac{yi - \bar{y}}{sy}  - a_1  \frac{x_{1i} - \bar{x_1}}{ sx1 }   + a_2 \frac{x_{2i} - \bar{x_2}}{ sx2 } + a_3 \frac{x_{3i} - \bar{x_3}}{ sx3 })^2
}

偏回帰係数を使った計算式の精度

偏回帰係数を使った計算式(モデル) ができても、このモデルの精度が悪ければ、偏回帰係数を解釈しても無駄になっていまいます。

決定係数

単回帰分析では決定係数を使って精度を判定しました。

決定係数は下記のように定義されます。

\displaystyle{
R^2 = \frac{Q- Qe}{Q} ・・・(2)
}

Q は、yの平均値と実際の値の距離の二乗の和となります。

\displaystyle{
Q = (y1 - \bar{y})^2 + (y2 - \bar{y})^2 + ・・・ + (yn - \bar{y})^2
}

重回帰分析でも決定係数を算出して使うことができます。

Excelの回帰分析だと 重決定 R2 と表されます。

しかし、決定係数は説明変量 xの数が増えるほど増加し1に近づくという性質を持っています。

決定係数 - Wikipedia

決定係数だけモデルの精度を判断すると、決定係数が高い要因が、精度が高いのか、説明変数の数が多いからなのかの判断がつきません。

そのため、モデルの精度を判断する指標として、 自由度修正済み決定係数 を使います。

自由度修正済み決定係数

自由に動ける個数のことを自由度といいます。

大きさ n の標本における観測データ (x1, x2, ..., xn) の自由度は n とする。

自由度 - Wikipedia

自由度修正済み決定係数は下記の用に表されます。

\displaystyle{
\bar{R^2}
}

サンプル数を n 、説明変量の数を p とすると求め方は下記の式になります。

\displaystyle{
\bar{R^2} = 1 - (1 - R^2) \frac{n - 1}{n - p - 1}
}

残差平方和は QeQ は目的変量 y の散らばりの総量とし、決定係数は下記のようになります。

\displaystyle{
R^2 = \frac{Q- Qe}{Q} \\

1  - R^2 = \frac{Qe}{Q} \\ 
}

これらを当てはめると、自由度修正済み決定係数は下記の式になります。

\displaystyle{
\bar{R^2} = 1 -   \frac{n - 1}{n - p - 1}\frac{Qe}{Q}
}

自由度は説明変量の数と目的変量 y を除いたものなので、 n - p - 1 となります。

自由度修正済み決定係数は、決定係数と同じ用に1に近づくほど精度が高いとなります。

また、精度が悪い場合は0よりも小さくなることもあり、下限はありません。

標準誤差

重回帰分析での標準誤差は、残差の標準偏差となります。

標準偏差は分散の平方根です。

なので、重回帰分析での標準誤差は下記になります。

\displaystyle{
StDev = \sqrt{ \frac{\sum_{i=1}^{n}  (yi - \hat{y_i} )^2}{n - p - 1}}
}

標準偏差は、データの平均的なばらつきを示します。

標準誤差の値が低ければ残差の変動が小さいことになり、モデルの精度が高いことを示しています。

参照

社会・人口統計体系 | ファイル | 統計データを探す | 政府統計の総合窓口

Latexをはてなブログmarkdown形式に変換 - ano3のブログ

  • サンプル数の話

重回帰のときに必要なデータの数はパラメータの数の10倍です - 驚異のアニヲタ社会復帰の予備

単回帰分析について

回帰分析とは

複数の変量(変数)があるときに、1つの変量を残りの変量で説明すること。

よくわからん

変量とは bellcurve.jp

単回帰分析

2つの変量を扱うものを単回帰分析と呼びます。

単回帰分析において、導きだしたい変量(目的変量)をy、導き出すために使う変量(説明変量)をxとし、これを一次式(線形)で説明する一番単純かつよく利用される回帰方程式となります。

一次式なので、下記のように表されます。

\displaystyle{
 \hat{y}  = ax + b  ・・・ (1)
}

^yとしているのは、これは理論値であるためです。 ( a は回帰係数, b は切片)

この方程式を導き出すために、最小二乗法を使います。

ja.wikipedia.org

最小二乗法で一次方程式の回帰方程式を導き出すには、各データと導き出される一次方程式の直線の距離の和(これが誤差になる)を 全体 で最小になるように方程式を導き出します。

このデータ全体の理論値の 誤差 は残差平方和 Qe 呼ばれます。 (残差の平方(距離)をとって、その和)

\displaystyle{
Qe = (y1 - \hat{y1})^2 + (y2 - \hat{y2})^2 + ・・・ + (yn - \hat{yn})^2
}

Qe が最小になるように方程式を解けば、(1)の一次方程式の ab が決まる。

例として、縦軸yに体重、横軸 x に身長とした、体重と身長の関係を示してみます。

身長xがいくらのときに、体重yはいくらになるかの導きだす回帰方程式を求めいます。

f:id:Spring_MT:20200715091158p:plain

これはGoogle Spreadsheetの散布図から、トレンドラインを線形で出した結果となります。

回帰方程式を求めたとしても、データさえあれば、最小二乗法を使ってなんらかしらの直線を引くことができるため、その方程式はどれくらい実情を表しているかはわかりません。

回帰方程式の確からしさ(精度)を表現するために決定係数を使います。

決定係数は下記のように定義されます。

\displaystyle{
R^2 = \frac{Q- Qe}{Q} ・・・(2)
}

決定係数 R^2 の正の平方根をRを重相関係数といいます。

Qe は、先程の残差平方和 Qe です。

これは、実際と理論値の誤差を表しています。

Q は目的変量 y の散らばりの総量になります。

Q は、yの平均値と実際の値の距離の二乗の和となります。

\displaystyle{
Q = (y1 - \bar{y})^2 + (y2 - \bar{y})^2 + ・・・ + (yn - \bar{y})^2
}

誤差が小さければ、Qe は0に近づき、R^2 は1に近付いていきます。

つまり

\displaystyle{
0 \leqq R^2 \leqq 1
}

となり、R^2 が1に近づけば精度が高いといえます。

先程の例だと、決定係数 R^2 は 0.499となっています。

参照

27-4. 決定係数と重相関係数 | 統計学の時間 | 統計WEB