OmniAICreator/Qiita-1.07M huggingface dataset:
[VisualStudio] Debug/Releaseビルドで、参照するdllを変えたい

# もくじ

https://tera1707.com/entry/2022/02/06/144447

# やりたいこと
VisualStudio2019でC#アプリのプロジェクトを作り、そのアプリがなにかのdll(.netのdll)を参照するとする。
そのときに、Debugビルドのときと、Releaseビルドのときに、参照するdllを変えたい。

※同じソリューション内にあるdllのプロジェクトであれば、「プロジェクトの参照」にすれば、使う側のビルドのConfigurationに自動で合わせてくれるが、外部の自分で作ってないdllだと「アセンブリの参照」を追加することになり、その際、Debugのとき、Releaseのとき、という設定ができないので困ったので、調べたことをメモする。

# やり方
VisualStudioのプロジェクトファイル(.csproj)を直接開いて、参照の設定をいじることで実現する。

具体的には、csprojの参照の設定に、下記のように書き込む。

```
<Reference Include="参照するライブラリの名前">
  <HintPath Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">..\Library\Debug\参照するライブラリの名前.dll</HintPath>
  <HintPath Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">..\Library\Release\参照するライブラリの名前.dll</HintPath>
</Reference>
　・
　・
```
※上の例のパスは適当。

# 手順

- まずはビルドのConfigurationをDebugにする。
- C#のプロジェクトの「参照」から、とりあえずDebugビルド時に使用したいdllを、「アセンブリの追加」で追加する。
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/a6f49eb2-31c9-784b-1919-93c3a28c80b3.png)
- 開いた参照マネージャダイアログの「参照」ボタンを押し、追加したいDebugビルド向けのdllを追加する。
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/bd7b9474-eaa7-be33-3466-8916878c9625.png)
- 追加したデバッグ用のdllが、参照の一覧に入る。そのプロパティを見ると、選んだパスが出ている。(今回は、Debugフォルダの中にDebug用を入れている。)
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/a15668ef-d40d-32ec-6db6-7962b62ebd69.png)
- 次に、そのプロジェクトの.csprojファイルを、なにかのエディタで開く。その中に、下記のような箇所ができているはず。(参照マネージャでdllを指定すると、相対パスでdllのパスが入るっぽい)

```.csproj
<ItemGroup>
  <Reference Include="DllTestCs">
    <HintPath>dll\Debug\DllTestCs.dll</HintPath>
  </Reference>
　・
　・
```

**このとき、参照に追加した直後にcsprojを開くと、まだdllの参照設定がファイルに反映されていない場合があるので、その場合はまず一度ビルドしておく。**(そのときにcsprojに保存されるっぽい)

- ここを、冒頭の内容を参考に書き換えて、保存する。(このとき、一度VisualStudioを閉じておいた方がよいかも？)

```
<ItemGroup>
  <Reference Include="DllTestCs">
    <HintPath Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">dll\Debug\DllTestCs.dll</HintPath>
    <HintPath Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">dll\Release\DllTestCs.dll</HintPath>
  </Reference>
　・
　・
```

これで完了。下図のように、DebugとReleaseのConfigurationを選んだ時に別々の設定になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/d02f9ab1-119a-129e-06b5-682b76f83b45.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/665f80ec-3ced-b759-f25a-c4524a02157e.png)


※例では、プラットフォームの指定(ここでは`x64`)をしているが、とくに指定しなくてもよい。
下記のようにしておけば、プラットフォームを何にしていても、DebugとReleaseによって使うものを分けてくれる。

```
<ItemGroup>
  <Reference Include="DllTestCs">
    <HintPath Condition="'$(Configuration)' == 'Debug'">dll\Debug\DllTestCs.dll</HintPath>
    <HintPath Condition="'$(Configuration)' == 'Release'">dll\Release\DllTestCs.dll</HintPath>
  </Reference>
　・
　・
```
【JavaScript】selectbox(プルダウン)の使い方メモ

###1.はじめに
かなり昔に、jqueryのプラグインを使って100万行くらいのデータをグラフ化する
ツールを作る依頼を受けた。
その時に初めてjavascriptを調べて、ツールを作ったがそれ以来触ることが
無くなってしまった。

思い出すためにも、恐竜と鳴き声の回数をセットしたセレクトボックスを用意して
ボタンを押すと鳴き声を表示させるプログラムを練習用として作ってみた。


###2.恐竜の鳴き声を指定回数表示してみよう。(ソース)
__今回のポイント__

+ セレクトボックスの使い方
+ セレクトボックスの値の取得の仕方
+ 指定場所のテキストの変更


鳴かせる恐竜は、__我らがダークヒーロー「ティラノサウルス」と、
走る鎧こと「ユーオプロケファラス」__にした。
ユーオプロケファラスは尻尾攻撃が得意とのこと(jwaより)
ユーオプロケファラスの鳴き声は知らないので(というかティラノサウルスの声すら
聞いたことない)、尻尾攻撃の音にしてみた。

下のコードを記載したファイル(こんなのコピーする人がいるか
疑問だけど)を適当なところに保存して実行すると、実行イメージのように表示される。

```html:dino_cry_for.html

<!DOCTYPE html>
<p>鳴き声<br>
<span id="d_cry"></span></p><br>

<form name="test">
	<select name="dino">
	    <option value="Tyranno">ティラノサウルス</option>
	    <option value="Euoploce">ユーオプロケファラス</option>
	</select>
	<select name="cry_n">
	    <option value="2">2</option>
	    <option value="4">4</option>
	    <option value="6">6</option>
	</select>
</form>
<input type="button" value="dinosor_crying!!" onClick="OnClickCrying()"/>

<script type="text/javascript">

function OnClickCrying(){
	//セレクトボックスのid
	const dino1 = document.test.dino;

	// 値(数値)を取得
	const num_dino = dino1.selectedIndex;
	
	const cry_n1=document.test.cry_n;
	//セレクトボックスの何番目を選択したか
	const idx_cry=cry_n1.selectedIndex;
	//セレクトボックスで選択した値を取得
	const num_cry2=cry_n1.options[idx_cry].value;
	
	var str_dino="";
	var c_dino="";
	
	if(num_dino == 0){
		c_dino="おおーん!!";
	}else{
		c_dino="ぴしっ！";
	}
	for(var i=0;i<num_cry2;i++){
		str_dino=str_dino+c_dino+"<br>";
	}
	document.getElementById("d_cry").innerHTML = str_dino;
}
</script>
</html>
```

###3.実行結果
![js_dino_for.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/76af26df-3a11-dd5b-725b-3018dea28798.jpeg)
特定のS3バケットのみ一覧表示と読み書きを許可するIAMポリシーの例

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::<バケット名>",
                "arn:aws:s3:::<バケット名>/*"
            ]
        }
    ]
}
```
Python3で業務的なデータはDecimalで

#Python3で業務的なデータはDecimalで

プログラマ初心者の頃を思い出す、初歩的ミスをしたので
基本中の基本的なことですが反省を込めて投稿を


###パーセントの変換

こんなソースで

```ng.py
#パーセント変換
#99.999 % をfloatに変換する。
def convert_per(gttper:str)->float:
    m = re.match(r"[0-9]*.[0-9][0-9][0-9]", gttper)
    ret_vees_per = float(m.group(0))/100
    #print (ret_vees_per)
    #print (type(ret_vees_per))
    return ret_vees_per
```

これで

```call.py
print(convert_per("2.200 %"))
```

ってやると
0.022000000000000002
になっちゃう

あれれ？
そうです。
コンピュータ内部は、2進数で管理しているから、10進数を扱うと微妙な誤差が出てしまうのです。
近似値で良い処理であれば問題ないが、金額等を扱う場合はNGですよね。

そういうわけで、Decimalに書き換えます

てな訳で

```ok.py
from decimal import *

#99.999 % をDecimalに変換する。
def convert_per(gttper:str)->Decimal:
    m = re.match(r"[0-9]*.[0-9][0-9][0-9]", gttper)
    ret_vees_per = Decimal(m.group(0))/100
    #print (ret_vees_per)
    #print (type(ret_vees_per))
    return ret_vees_per


```

これでOK
現職のスマホゲームアプリ開発者から聞いたビルド作業について

# 聞いたことメモ
以下、Tech Academyのメンターの方から聞いたこと。

- ビルド作業はプログラマー以外にはハードルが高いため、自動化していることが多い。
- ビルドマシンを用意している。
- JenkinsなどのCIツールがあって、GitHubからブランチを取得してビルド専用マシン上でビルドする。
- Jenkinsのコマンドを作ってUnityと接続している。
- ビルド環境をメンテナンスする専任担当がいる。
- デイリービルドしているが、Unitテストはやっていない(というよりスマホゲーム系はUnitテストまでやっている会社は少なく、リリースしてバグだらけというのがはびこっているのが実態←！)
- Jenkinsはほとんどの現場である。
- データベースのデータについてExcelファイル→CSV→バイナリへと変換するということもやってる
- 今の現場だと開発ブランチと一個区切ったステージングブランチがある感じ
- デイリービルドは開発ブランチに対してかけていて、ビルド時にエラーがあればすぐ通知が来る。
- デバッグチームが存在し、ビルドが通った成果物の動作確認もしている。問題があれば連絡があり、当日中に取るような感じ。
- とはいえ、そもそもpush前に実装者が動作確認はすべきなので、そのような事態を招いた人は反省すべき

# まとめ
- ビルドはJenkins使っている現場が多い
- ただし**Unitテストは実装する余力がなく、そもそも実装してもやっぱこうした方がいいなという修正も入るためやっていない現場が多数。結果、リリースしてバグだらけというのがはびこっているのがスマホゲーム業界(ひぃーーーーー！！！)**
javaでAtCoder Beginner Contest 150を解く

AtCoder Beginner Contest 150お疲れ様でした！
[公式ページ](https://atcoder.jp/contests/abc150)

残念ながらまたUnratedですね・・・

GitHub.comのアカウントを作った記念に、ちょっと前にはじめたAtCoderのコードもコンテストが終わった後にコミットしてみました。[こちら](https://github.com/ko-flavor/atcoder-java/tree/master/atcoder/src/abc/abc150)
さらに、解説記事も書いてみます。

競技プログラミングは最近はじめて言語も基本的にjavaくらいしか書けないのでjava使ってやってます。
(競プロでPythonとかC使ってる人多いのはなぜなのでしょうか・・・)

##[問題A](https://atcoder.jp/contests/abc150/tasks/abc150_a)

掛け算して比較する問題。
特に解説は不要かと思います。

##[問題B](https://atcoder.jp/contests/abc150/tasks/abc150_b)

ABCが順序通りに並んでいる数を調べる問題。
特に性能も気にしなくてもよさそうだったので、シンプルに3つとってきて一致するかどうかを調べました。

##[問題C](https://atcoder.jp/contests/abc150/tasks/abc150_c)

もう少しいい方法はあると思いますが・・・
自分は2つの数列を「何番目に大きい数字を使っているか」で変換し、2つの数列を比較し、桁ごとに対応する階乗の値をかけて算出しました。

あまりうまく文字で説明できません。コード見た方が分かりやすいかと思います。

##[問題D](https://atcoder.jp/contests/abc150/tasks/abc150_d)

最小公倍数的な問題。なぜ不正解か分かりません！

基本方針としては
- 最小公倍数算出
- 与えられたm+最小公倍数/2を最小公倍数で割り算した値を出力

で行いました。
ただ、数列が2/4/6などの場合に答えは0となります。なぜなら、「2の何乗か」というのがあっていないため。
2*(p+0.5)は2の倍数ではありませんが、4*(p+0.5)は2の倍数です。このように、数列の数全ての2の何乗かというのがそろっている必要があります。

が、不正解。この問題に苦戦していて終わりました・・・
https://github.com/ko-flavor/atcoder-java/blob/master/atcoder/src/abc/abc150/MainD.java

今日はいくら考えても分からなかったので、また後日見てみたいと思います！

(追記)
プログラムにバグを無事発見し、修正してACになりました。
基本情報技術者　テクノロジ系　第5章 データベース(SQLについては別途記載予定)

[基本情報技術者試験](https://qiita.com/savaniased/items/d3f94da4f087e178cb69)
こちらより

続いてデータベースについてです。
SQLについては内容が長くなるので
別の機会に投稿予定です。


# データベース基礎

## 一元管理の効果

・独立性
・整合性
・機密保持

## 3層スキーマアーキテクチャ
スキーマはデータの構造という意味です。

### 外部スキーマ
外部から見えるスキーマ

### 概念スキーマ
登録されているデータ全て

### 内部スキーマ
記憶装置上でのデータ構造です。

## 関係データベース
表形式でデータを管理するデータベースです。

### 主キー
行を一行に特定できる属性

#### 複合キー
複数の属性の組み合わせで主キーとなっているもの

一意性制約(UNIQUE): 同じ値はだめ
非ナル値制約(NOT NULL): 空値を取ってはいけない

### 外部キー
他の表で主キーとなっているもの

#### 参照制約
外部キーの値が必ず参照先の表に必ず存在しなければならない

### 実表
概念スキーマに該当
データベースに登録されている表本体のこと

### ビュー
外部スキーマに該当

実表から、必要な行や属性を抜き出して作成した仮装の表

## キーバリューストア
データ構造の一つ

保存したいデータ(Value)と
そのデータを一意に識別できる値(Key)を組としてデータに保管

[1234,田中]
のように
[キー(Key),バリュー(Value)]
となっています。

# E-R図
業務で扱うデータの性質を分析

## E-R図基礎
エンティティ(実体)とリレーションシップ(関連)を用いて表現

要はエンティティは表名
リレーションは紐、矢印の名称など
　
### 多重度
エンティティの数的な関係を表します。
矢尻のある方が'多'
矢尻のない方が'1'です。

家には複数の人間が住めるが
人間は一つの家にしか住めないなど

多重度を読み取る時は
それぞれのエンティティから考える

## E-R図と関係データベース
次のルールから作成できます。

・ER図のエンティティを表をする。
・エンティティの属性は、表の属性とする
・1-1関係は 一方の主キーを、他方で外部キーに設定する
・1-多関係は、1の側の主キーを、多の側で外部キーに設定する。
・多-多関係は、連関エンティティを用いて1-多関係に変形する。

## 連関エンティティ
多-多関係のままだとややこしいのので
1-多の関係にする仲介表を作成します。

その中間エンティティつまり中間表を
これを連関エンティティと呼びます。

例として
社員と部署だと多-多の関係なので
間に所属こと連関エンティティを作成します。

# 正規化
表を分割してデータの重複を排除すること
整合性を高くすることができる。

利点は不整合の発生を防ぐ
欠点はアクセスに時間がかかる

## 関数従属
Aを特定すればBが特定される。など

## 非正規形
繰り返し項目をもつ表
一行に複数のデータは入っているなど

このままだと使えない

## 第一正規形
繰り返し項目を持たない
一行に複数のデータが入っていない
単純な表

## 第二正規形
ここで分割するようになります。
第一の条件を満たしていて
非キー属性が主キー属性に関数従属する。

## 第三正規形
第二の条件を満たしていて
非キー属性が主キーに推移的関数従属しない

一旦分割した表をさらに分割して見やすくしている。

### 推移的関数従属
A→B→C
のように関数従属が推移していくもの

受注番号→顧客番号→顧客名
のような形です。

受注番号→顧客番号
顧客番号→顧客名
となるように分割して第三正規形を作ります。

さかのぼらず、一つ前から出せるようにする。

# 関係演算と集合演算

## 関係演算

### 選択
列を抜き出す

### 射影
列を抜き出す

### 結合
対応付けて双方の表を一つにする

##### 結合キー
対応付けに使うキーのこと

## 集合演算

### 直積
複数の表の全ての行の組み合わせ

買い物表にフルーツだとか日用品だとか
一つ残らずデータを追加するようなイメージ

# DBMS

## ACID
トランザクションが持つべき特性

### トランザクション
関連する一連の手順をまとめた単位

### コミット(COMMIT)
全て実行する

### ロールバック(ROLLBACK)
全く実行しない状態に戻す

### 原子性
全て実行するか
全く実行しないか

### 一貫性
矛盾させない

### 独立性、隔離性
他のトランザクションの影響を受けない

### 持続性、耐久性
更新結果は消失することがない

## 2相コミットメント制御
2つのデータベースを扱う場合
両方とも命令して準備完了と応答が来たら
実行する処理

### 分散データベース
情報を様々な場所で管理しているデータベースを
分散データベースといいます。

## 同時実行制御
共有されている場合、各自で更新すると
混乱が生じます。

そこでロックをかけて制御できるようにすることです。

###　共有ロック
読み込み時にかけるロック

他が共有ロックをかけている場合
さらに共有ロックをかけことができます。
さらに他は占有ロックをかけることはできません

### 占有ロック
書き込み時にかけるロック

占有ロックをかけている場合
他は占有も共有もかけることはできません。

### ロック粒度
ロックをかける単位

これを大きくすると
トランザクションまちが酷くなりますが
その分整合性を取りやすくなります。

小さくすると
トランザクションまちが短くなりますが
その分整合性が取りづらくなります。

## デッドロック
膠着状態になること

複数のトランザクションが互いに相手の
ロック解除待ちをしている状態

この場合どれかのトランザクションを強制終了を再実行が必要になります。

## 障害回復

### ロールバック
更新前ログで使用

障害発生時に実行中であった
トランザクションの途中結果を
全てキャンセルする。

### ロールフォワード
更新後ログで使用

コミット済みトランザクションの
実行結果を復旧する。

## チェックポイント
メモリ中のデータをディスク装置に反映する

ディスクへのアクセスに時間がかかるので
メモリ上のデータを更新するだけに留めて
後で行います。

## ストアドプロシージャ
SQLのまとまりをDBサーバに登録しておき
クライアントが呼び出しして実行すること

要はSQLのショートカット機能
ABC150 解説

[ABC150](https://atcoder.jp/contests/abc150)の解説です。
2回目のunrated。
なんだしなんだしABC。
今回はFの解き方がかなり微妙で未証明・テストケースに勝った感じなので、解説というより解き方の説明になります。Eまではちゃんとした解説です。
# [A問題](https://atcoder.jp/contests/abc150/tasks/abc150_a)
if文を知っていますか？僕は知っています
# [B問題](https://atcoder.jp/contests/abc150/tasks/abc150_b)
std::string::substrを知っていますか？僕は知っています（知らなくても解けます）
# [C問題](https://atcoder.jp/contests/abc150/tasks/abc150_c)
std::next_permutationを知っていますか？僕は知っています（知らないと辛そう）
# [D問題](https://atcoder.jp/contests/abc150/tasks/abc150_d)
まず、$a_i$ それぞれが素因数に $2$ を持つ個数が全部同じでないと答えが存在しません。$X$ に何を代入しても $N$ 通りの $p$ がすべて整数になることがないからです。以降では、このような場合は除いて考えます。
次に、 $a_i$ すべての最小公倍数 $L$ を求めます。$L$ が奇数の場合、答えが存在しません。$(p+0.5)$ の形の数にいかなる奇数をかけても整数にならないからです。以降では、このような場合は除いて考えます。
まず、問題文の式の両辺を $2$ 倍すると、$2X$ は $L$ の倍数であることがわかります。
また、 $X$ が $L$ の倍数である場合、 $a_i$ で割った商が整数になってしまうので、当然条件を満たしません。
逆に、 そうでない場合は、必ず条件を満たします。（$\frac{L}{2}$ が条件を満たすことを考えて、そこから帰納的に考えると簡単に証明できます）
よって、$M$ 以下でそのような数の個数を数えればいいです。愚直に数えると間に合うはずがないので、$\mathrm{ceil}(\frac{M-\frac{L}{2}}{L})+1$ です。
# [E問題](https://atcoder.jp/contests/abc150/tasks/abc150_e)
Dより証明は簡単です。
まず、変えなければいけないビットが決まっているとき、コストの小さい方から取るのが最適です。かなり自明なので既知とします。
ここからは、それぞれのビットを独立で考えます。
$1$ 回あたりのコスト $c$ のビットを変更するのにかかるコストの合計を考えます。
まず、このビットが異なる場合の数は $2^{2n-1}$ です。また、残りのビットでまだ異なっている可能性があるのは、コストが $c$ より大きいビットのみで、そのうち異なるものの個数の期待値は、当然個数の半分です。
よって、これらと $c$ をかけあわせたものがかかるコストの合計です。これを全部のビットについて計算して足せば答えが出ます。おしまい。
コストが同じビットが含まれている場合も、順番を先に決めてしまえばいいだけなので、ソートをしてindexをもとに計算すると楽です。
# [F問題](https://atcoder.jp/contests/abc150/tasks/abc150_f)
正しい解法は知りません。僕が通した嘘解法だけ書きます。
よい子の皆さんはマネしないように…
・$k$ を決め打ちする。そのとき、$a'$ と $b$ の各要素のxorをとったとき、これが全て一致すれば組がひとつ見つかり、そうでなければこの $k$ では実現できない。ここで、要素を全部試したい。
・要素を全部試すと計算量オーダーが $O(N^2)$ になってしまい。間に合わない。どうにかしたい。
・全部試すのは時間がかかりそうなので、$5000$ 個だけ試してみる。
・通る。
以上でした。
愚直な $O(N^2)$ でも、落ちるのは $3$ ケースだけだったので、ランダムに並び替えをするなどの対策をすれば、その $3$ つが強いケースだったとしても通っていたかもしれません。
# おわりに
このあとのこどふぉで代わりにレートを上げようと思います
※2020/01/11 追記:下がりました
明後日も解説を書くかもしれないので、よろしくお願いします。
httpプロキシ下で外部サーバーにsshする[Ubuntu18.04から]

# はじめに
httpプロキシ配下にある環境から外部のサーバーにssh接続したい場面で苦労したので，備忘録の意味も兼ねて記録しておきます．
基本的には[こちら](https://kaworu.jpn.org/security/HTTP%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%82%B5%E3%83%BC%E3%83%90%E7%B5%8C%E7%94%B1%E3%81%AEssh%E6%8E%A5%E7%B6%9A)を参考としました．

# 手順
## インストール
```terminal
// sudo apt-get updateも忘れずに
sudo apt-get install squid3
sudo apt-get install connect-proxy
sudo apt-get install openssh-client
```

## squidの設定
`/etc/squid3/squid.conf`に以下を追記(自分の環境ではsquidでした(3がつかない))．

```vim
acl SSL_ports port 22
acl Safe_ports port 22          # ssh
```

ここでsquidを再起動．

```terminal
// ここも自分の環境では3がつきませんでした．ここまで起動してなければstart
service squid3 restart
```

## sshの設定
`~/.ssh/config`を以下のように編集．example.comの部分を対応させて下さい．

```vim
Host example.com
        Hostname example.com
        ProxyCommand connect-proxy -H <httpプロキシのurl>:<httpプロキシのport> %h %p
```


# 実行
いつも通りにssh．

```terminal
ssh user@example.com
```
以上
RaspberryPiとAM2320で温湿度取得・CSVログ保存

Qiitaユーザの方は初めまして。シルミノです。

Raspberry Pi 3B+とAM2320という温湿度センサモジュールを使って遊んでみました。
紹介とか感想とかは下記リンクの私のブログにあります。
http://silumino.hatenablog.jp/entry/2020/01/07/234405
動画もあります。
https://www.nicovideo.jp/watch/sm36188517

じゃあ何なんだこの記事はって話ですが、プログラム全文を載せるには適している気がしたので。
コミュニティ的に。
ではプログラムです。

```python:humid_temper_measure.py

import RPi.GPIO as GPIO
import time
import smbus
import threading
import signal
import datetime
import csv

def read_sensor():
    print ("Start")
    i2c = smbus.SMBus(1)
    slave_signal = 0x5c #B8 = 5c << 1  1bit left bit shift
    read_data = 0x03

    #Sleep off
    try:
        i2c.write_i2c_block_data(slave_signal, 0x00, [])
    except:
        pass

    #Wait >0.8ms
    time.sleep(0.005)

    #Call sensor_address,command,[starting_register_address, number_of_registers]
    i2c.write_i2c_block_data(slave_signal, read_data, [0x00, 0x04])
    print ("Slave signal is sent")

    #Wait >1.5ms
    time.sleep(0.005)

    #Read
    measured_data = i2c.read_i2c_block_data(slave_signal, read_data)
    print("Data are received")

    #for data in measured_data:
    #    print (data)

    #calculation
    humidity = float(measured_data[2] << 8 | measured_data[3])/10
    if measured_data[4] >= 0x80:
        temperature = float((measured_data[4] - 0x80) << 8 | measured_data[5]) / (-10)
    else:
        temperature = float(measured_data[4] << 8 | measured_data[5]) / 10
    
    time_now = datetime.datetime.now()
    print(time_now)    
    print("{0:.1f} %".format(humidity))
    print("{0:.1f} degC".format(temperature))
    
    #add data to log file
    with open(csv_name, "a", newline='') as csv_file:
        csv_writer = csv.writer(csv_file, lineterminator='\n')
        csv_writer.writerow([time_now,humidity,temperature])

def make_thread(a, b): #only make a thread
    thread_1 = threading.Thread(target = read_sensor)
    thread_1.start()

#main
#wait until xx:xx:00
while True:
    time_now2 = datetime.datetime.now()
    now_sec = time_now2.second
    if now_sec == 59:
        break
    time.sleep(0.1)

#set interrupt timer
signal.signal(signal.SIGALRM, make_thread)
signal.setitimer(signal.ITIMER_REAL, 1, 60)

#make csv file
csv_date = time_now2.strftime("%Y%m%d%H%M%S")
csv_name = "%s.csv" % (csv_date)
with open(csv_name, "w", newline='') as csv_file:
    csv_writer = csv.writer(csv_file, lineterminator='\n')
    csv_writer.writerow(["Time","Humidity(%)","Temperature(degC)"])

#main loop
while True:
    time.sleep(1)
```


RPi.GPIOは使っていませんが、今後の機能追加を考えてのことです。
あと、わからないところとしては、make_threadに2個引数をつけないといけない理由がわかりません。
いったい何が渡されているんだ。（※まだpython初心者です）

だいたいコメントは書いてあるので内容はわかるかと思います。
Sleep offのところや、5msだけ待っているところ、最後の無限ループなんかは電子回路特有のプログラムですね。
並列化も信号処理を考えてつけておきましたが、メインループが「何もしない」なので無意味。
初心者による DOM 要素ノードの取得一覧-1

#概要
クライアントサイドのjavascriptにおいて、文書ツリーから要素ノードを取り出すというステップは欠かせない技術です。ここでは、文書ツリーから要素を取得する基本的な手段を一覧にしてみた。

#getElementById()
id=""のように取得したい要素が明確な場合はgetElementById()を使う。

```javascript:sample.js
document.getElementById(id)
 //id: 取得したい要素のid値
```

id値が複数あってしまった場合は最初に該当された要素１つを返す。

#getElementsByTagName()

上のgetElementByIdとは似ているが、Elementsと複数形になっていることに注意。getElementsByTagNameメソッドは、タグ名をキーにして要素を取得する。

```javascript:sample.js
document.getElementByTagName(name)
 //name: タグ名
```
これはタグをキーに要素を取得するので、複数の要素が該当する可能性があります。引数に「*」を指定することで、すべての要素を取得できます。
getElementsByTagNameの戻り値は、要素の集合です。これは、

```
length : リストに含まれる要素数
item(i).属性 or item[i].属性 : i番目の要素を取得
namedItem(name) : id、またはname属性が一致する要素を取得
```

のメソッドを使うことができる。

#getElementsByName()
getElementsByNameメソッドは、name属性をキーに要素を取得する。一般的には、<input>/<select>などのフォーム要素へのアクセスなどで使う。getElementByIdメソッドのほうが使いやすい時が多い。

```javascript:sample.js
document.getElenetByName(name)
 //name: name属性の値
```

使う際は、返り値が要素の配列になっているので自分が参照したい要素の順番をわかっていなければならない。逆に言うと、該当する要素が一つだけにしておいたほうが無難。
これはlength, item(i), namedItem(name)を使える。

#getElementsByClassName()
これはclass属性をキーに要素を取得する。特定に役割を持った要素に対してなんらかの処理をしたいときにつかう。

```javascript.sample.js
document.getElementsByClassName(class)
 //class: class属性の値
```

これはlength, item(i), namedItem(name)を使える。

#querySelector() / querySelectorAll()
より複雑な条件で要素を検索するときに使う。

```javascript:sample.js
document.querySelector(selector)
document.querySelectorAll(selector)
 //selector: セレクター一式
```

セレクタの一覧を出してみる。

```
* : すべての要素を取得
#id名 : 指定したIDの要素を取得
.class名 : 指定したクラス名の要素を取得
タグ名 : 指定したタグ名の要素を取得
セレクタ１, セレクタ２, ... : いずれかのセレクターに一致する要素を取得
parent > child : 子要素を取得
#list li : liをすべて取得
prev + next : 直後の要素を取得
prev ~ siblings : 兄弟要素をすべて取得
セレクタ名[属性値] : 指定した属性を持つ要素を取得
セレクタ名[属性値 = value] : 属性がvalueの要素を取得
セレクタ名[属性値 ^= value] : 属性がvalueから始まる要素を取得
セレクタ名[属性値 $= value] : 属性がvalueで終わる要素を取得
セレクタ名[属性値 *= value] : 属性がvalueを含む要素を取得
セレクタ名[属性][属性][属性] : 複数の属性をすべて含む要素を取得
```
querySelectorAll()は返り値が配列であるためlength, item(i), namedItem(name)を使える。

#get~とquery~の使い分けのまとめ
特定の要素を検索できる場合　→　getメソッド
複雑に絞り込む必要がある　→　queryメソッド

#参考資料
山田祥寛様　「javascript本格入門」
Ruby on Railsのアプリケーションをgit cloneする

# はじめに
学生エンジニアの覚え書きです。参考になれば幸いです。
使用しているPCはMacを使用しているのでWindowsの方は注意してください。
# まずはGitHubからcloneをする
クローンするアプリケーションを置きたいディレクトリに移動したあと

```
$ git clone https://github.com/example/test.git
```

URLにはクローンしたいリポジトリのURLを入れてください
# bundle installをする
クローンしたアプリケーションで使用するgemをインストールします。

```
$ bundle install
```
これでうまくいくはずが

```
An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  mysql2
```

エラーが出ました
mysql2のgemfileがインストールできない様子

ググって見ると、こちらの記事を発見し解決できました。
 <a href="https://qiita.com/fukuda_fu/items/463a39406ce713396403">【Rails】MySQL2がbundle installできない時の対応方法</a>

```
$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
```
このコマンドを打ったあと

```
$ bundle install
```
すると、うまくインストールできました。

```
Bundle complete! 22 Gemfile dependencies, 97 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
```
# データベースの作成
ここからはデータベースを作成していきます。

```
$ rails db:create
$ rails db:migrate
```

これでデータベースは作成できました。

# アプリケーションの起動
ここまで来たら最後に

```
$ rails s
```

をして起動すれば完了です。

# 最後に
今回はGitHubからcloneしたアプリケーションをローカル環境で動かすことをしました。
起動したあとも正常に動作しない点はあると思うので動作確認は怠らないようにしてください。

注意点としてcloneした際に.gitignoreに指定されているフォルダ、ファイルはcloneされないのでAPIキーなどを.envなどのファイルに書いている方は作成してください。
JavaでJSON文字列をエスケープするコード

# Javaで未だに公式サポートされないJSON
大きなデータの作成は、JacksonやGsonを使う選択肢が普通と思いますが、
小さなデータの作成は、リッチなライブラリに頼らず、簡単な関数で済ませたい。
このような時の悩みの種は文字列のエスケープ処理です。

# エスケープ対象は、

|対象文字 |Byteコード |エスケープ表記 |
|---|---|---|
|BS |0x08 |\b |
|HT |0x09 |\t |
|LF |0x0A |\n |
|FF |0x0C |\f |
|CR |0x0D |\r |
|" |0x22 |\" |
|/ |0x2F |\/ |
|\ |0x5C |\\ \


# コード
文字列を１バイトずつ置換する方式です。

```
private static String escapeJsonString(CharSequence cs) {
	
	final byte BACKSLASH = 0x5C;
	final byte[] BS = new byte[]{BACKSLASH, 0x62};	/* \\b */
	final byte[] HT = new byte[]{BACKSLASH, 0x74};	/* \\t */
	final byte[] LF = new byte[]{BACKSLASH, 0x6E};	/* \\n */
	final byte[] FF = new byte[]{BACKSLASH, 0x66};	/* \\f */
	final byte[] CR = new byte[]{BACKSLASH, 0x72};	/* \\r */
	
	try (
			ByteArrayOutputStream strm = new ByteArrayOutputStream();
			) {
		
		byte[] bb = cs.toString().getBytes(StandardCharsets.UTF_8);
		
		for (byte b : bb) {
			
			if (b == 0x08 /* BS */) {
				
				strm.write(BS);
				
			} else if (b == 0x09 /* HT */) {
				
				strm.write(HT);
				
			} else if (b == 0x0A /* LF */) {
				
				strm.write(LF);
				
			} else if (b == 0x0C /* FF */) {
				
				strm.write(FF);
				
			} else if (b == 0x0D /* CR */) {
				
				strm.write(CR);
				
			} else if (
					b == 0x22 /* " */
					|| b == 0x2F /* / */
					|| b == BACKSLASH /* \\ */
					) {
				
				strm.write(BACKSLASH);
				strm.write(b);
				
			} else {
				
				strm.write(b);
			}
		}
		
		return new String(strm.toByteArray(), StandardCharsets.UTF_8);
	}
	catch (IOException notHappen) {
		throw new RuntimeException(notHappen);
	}
}
```

# テスト
```
public static void main(String[] args) {
		
	String before = "abc \b \t \n \f \r / \\ \"";
	String escaped = escapeJsonString(before);
	System.out.println("{\"value\":\"" + escaped + "\"}");
		
	/* {"value":"abc \b \t \n \f \r \/ \\ \""} */	
}
```
Dockerで環境構築する際、ソースコードの変更が即時反映されない場合の対処法


##記事の目的
docker-composeで環境構築する際に起こったRailsのソースコードを修正しても即時反映されない問題に対しての対処法を共有すること。



## 対処法

###1.development.rbを編集

開発環境用の設定ファイルである ```config/environments/development.rb``` を編集。
「　~　」は元々の記述を省略しているものとする。
この中に```config.reload_classes_only_on_change = false```という記述を追加する。


```development.rb

Rails.application.configure do

~
config.reload_classes_only_on_change = false

end

```
###2.railsコンテナを再起動

設定を記載しただけでは反映されないので、最後にRailsを再起動する。

ターミナル上で、


```
$ docker-compose restart 
```
と入力する。

以上でソースコードの変更が即時反映される。



## 終わりに

Dockerで環境構築をした際に、もう設定しておくと良い。
Unityでコードの速度比較をする時のベストプラクティスを模索してみた

#速度比較をしたい！
UnityでC#のコードの最適化をしていて、「この書き方とこの書き方ではどっちが速いんや！」ってなることがよくあるので、速度比較をする時のベストプラクティスを模索してみました。
#その１,検証用のコードはTest Runnerで書く
ちょっとテストコードを書きたいときに、空のゲームオブジェクト作ってスクリプトをアタッチして終わったら消すのって地味にめんどくさいです。
Test Runnerを使えば、上記の手順を踏むことなくコードを書いてすぐに実行できるので、爆速でトライ＆エラーが出来ます。

詳しい使い方はこちらの記事が分かりやすかったです↓
[Unity使いは全員Unity Test Runnerを使え！爆速のトライ＆エラー環境だぞ！](https://qiita.com/su10/items/67a4a90c648b1ef68ab9)
#その２,時間を計るだけならStopwatchクラス
時間を計りたいだけならStopwatchクラスが簡単で便利そうです。
現実のストップウォッチのような使い方で時間を計ることが出来ます。

参考↓
[より高い精度で時間を計測する](https://dobon.net/vb/dotnet/system/stopwatch.html)
#その３,時間とGC Allocも図りたければPlofiler
時間やらGC Allowやらその他諸々を計測したい場合は、UnityのPlofilerを使いましょう。
速度比較に限らず、最適化には必須の機能なので絶対に使い方を覚えておいた方がいいです。

詳しい使い方はこちらの記事が分かりやすかったです↓
[【Unity】CPUプロファイラでパフォーマンスを改善する 前編](http://tsubakit1.hateblo.jp/entry/2016/05/09/073000)

#その４,ILを確認する（上級者向け）
C#で書いたコードはコンパイルした際にILというものに変換され、そこから更に機械語に変換されて実行されます。
この変換の際にコンパイラがコードを良い感じに最適化してくれるので、実はC#のコードだけを見ても実際にどういう処理が行われるのかはよく分かりません。

例えば、変数の宣言をループ外に書くか、ループ内に書くかの違いがある以下の２つのコードですが、ILを確認してみると全く同一の処理であることが分かります。

```C#:ループ外で宣言する場合
public class C {
    public void M() {  
        int sum = 0;
        int count = 0;
        int num;
        while(count < 100){
            count++;
            num = count;   
            sum += num;
        }
    }
}
```

```C#:ループ内で宣言する場合
public class C {
    public void M() {  
        int sum = 0;
        int count = 0;
        while(count < 100){
            count++;
            int num = count;   
            sum += num;
        }
    }
}
```

ILの確認には[SharpLab](https://sharplab.io/)というWebサービスが便利です。試しに上のコードをコピペしてみましょう。
しかしSharpLabでは、標準ライブラリしか使えないようなのでUnity固有のライブラリを使う場合は、スクリプトをdll化し、逆アセンブルする必要がありそうです。

やり方はこちらの記事が分かりやすかったです↓
[UnityのスクリプトをDLL化する](http://tsubakit1.hateblo.jp/entry/20121107/1352243417)
[C#で作られたプログラムをデコンパイルしてみよう](https://tyheeeee.hateblo.jp/entry/CS-Advent-Calendar-2014-Day-15)

ILを確認することで、そのコードが速度比較に適したものかどうかを確認したり、なぜその計測結果になるのかを調べる助けになると思います。
#まとめ
正確な速度比較をしようと思うとかなり高度な知識が必要になってしまいますが(ILとか機械語とかワカラン)、Stopwatchで時間を計るコードを書いてTest Runnerで実行するくらいなら簡単にできそうですね。

ご意見ご感想、それは違うよ！等ございましたらコメントを頂けますと幸いです。
ながいPythonコードをシェル芸で実行させる

これは備忘録です．発想は単純だけど意外と面倒だった．

# もちべ
長いコードを画像化して投げればいいのでは？

# てじゅん

## 1. コードをbase64にする

まずはソースコードを文字にして画素値にさせる．

中間的な形式としてPPM画像で出力させる．

PPMで画像化するので3文字ごとに変換する．`AAABBCCCC`ならば`0 0 0\n 1 1 2\n 2 2 2`とさせる

```python:encode.py
import sys
import base64
argv = sys.argv
f = open(argv[1], 'r').read()
enc = base64.b64encode(bytes(f,"utf-8"))
tri = []
for i in range(0,len(enc),3):
    e = enc[i:i+3]
    while len(e) != 3:
        e += b"="
    tri.append(e)
b2i = {c: i for i,c in enumerate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=')}
im = []
for t in tri:
    r = []
    for c in t.decode('utf-8'):
        r.append(b2i[c])
    im.append(r)
ims = "\n".join([f"{c[0]} {c[1]} {c[2]}" for c in im])
print(ims)
```

```shell
python encode.py src.py > image.ppm
```

## 2 PPMをPNGにする

画像にするためには行数を縦横分割する必要がある．素因数分解して縦横比がちょうどよくなるような約数をえらぶ．

例えば行数が12486行の場合約数は$2,3,2081$だが2行増やした12488は$2,2,2,7,223$と正方形に近くなるように約数が選べるため上の出力結果に`64 64 64`という行を追加してパディング．(64は`=`に相当するので)

```
47 26 22
53 33 25
54 21 51
11 54 33
47 25 54
20 46 28
6 57 39
...
8 34 36
64 64 64 <-ここに追加
64 64 64 <-ここに追加
```

つぎに頭にメタ情報を付加する

```
P3
横の画素数 縦の画素数
画素の最大値
...
```

```:image.ppm
P3
223 56
255
47 26 22
53 33 25
54 21 51
11 54 33
47 25 54
20 46 28
6 57 39
...
8 34 36
64 64 64
64 64 64
```

あとはconvertでpng化

```shell
convert image.ppm image.png
```

よくわかんない画像ができる．
![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217391/2bd47efa-641b-1384-c3a3-2567ff340233.png)

## 3 Twitterに投げる

あとはこれをメディアに付加して`#シェル芸`タグをつけて投稿

```shell
python -c '
import numpy as n
import matplotlib.pyplot as p
f={i:c for i,c in enumerate("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=")}
print("".join([f[int(255*i)] for i in p.imread("/media/0","png").flatten()]),end="")
'|base64 -d|python
#シェル芸
```

文字制限ギリギリです．画像は`/media/0`に格納される仕様なのでそれを利用する．

# 実行例

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/xyBv6ejSGj">https://t.co/xyBv6ejSGj</a> <a href="https://t.co/1FSVyLeNVF">pic.twitter.com/1FSVyLeNVF</a></p>&mdash; シェル芸bot (@minyoruminyon) <a href="https://twitter.com/minyoruminyon/status/1215602458317086720?ref_src=twsrc%5Etfw">January 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

実際これは[3万字近いヤツ](https://gist.github.com/Shirataki2/c25969355bcad908d4efb939508014bc)なので画像万歳といったところである．

なお，もととなる関数はWolflam Alphaより拝借している．

https://www.wolframalpha.com/input/?i=graph+yasuna+curve&lang=ja
AndroidでRealmStudioを使ってdefault.realmの中身を見る

## pathを通す
Android Studio > File > Other Settings > Default Project Structure... で確認する。

```zsh:.zshenv
export PATH="/.../Android/sdk/platform-tools:$PATH"
```

## adbコマンド
そのままじゃ権限がないので、pullできるところにdefault.realmを持ってきたい。

```zsh
$ adb devices // 接続中デバイスの確認
$ adb shell
$ adb run-as <com.example.appname> // パッケージ名
$ cp -p files/default.realm /sdcard/. // とりあえずsdcardディレクトリにコピー
$ exit
$ exit
$ adb pull /sdcard/default.realm . // Desktopなど任意の場所で
```
これでRealmStudioで開ける。
Pythonで一度に、安全に、非破壊的に、複数辞書の結合と複数要素の追加を行う

# やりたいこと

- 複数の辞書を結合して1つの辞書にしたい
- ついでに他にも要素を追加したい

```python
dictA = {'A1': 1, 'A2': 1}
dictB = {'B1': 1, 'B2': 1}
# ---(辞書の結合 & 要素の追加)---
# => {'key1': 1, 'key2': 1, 'A1': 1, 'A2': 1, 'B1': 1, 'B2': 1}
```
さらに、

- 非破壊的に (元の辞書に変更を加えずに) 処理したい
- valueの変更をしない (keyが重複していたらエラーになってほしい)

これらを実現するための効率の良い書き方を紹介したいと思います。
# 良くない書き方

これは、```.update()```と辞書の追加記法を使えば一部実現可能です。

```python
dictA.update(dictB)
dictA['key1'] = 1
dictA['key2'] = 1
new_dict = dictA 
print(new_dict)
# => {'A1': 1, 'A2': 1, 'B1': 1, 'B2': 1, 'key1': 1, 'key2': 1}
```

## デメリット
元のdictAはなくなってしまいます。(dictAに要素の追加 (破壊的変更) をしているため)

```python
print(dictA)
# => {'A1': 1, 'A2': 1, 'B1': 1, 'B2': 1, 'key1': 1, 'key2': 1}
```

また、keyが重複していると値が上書きされます。これは意図せぬ挙動(バグの原因)を引き起こす可能性があります。

```python
dictA = {'key': 'dictA'}
dictB = {'key': 'dictB'}
dictA.update(dictB)
print(dictA)
# => {'key': 'dictB'}
```

# 適切な書き方
結合や要素の追加ということを気にせず、dict関数のキーワード引数に値を渡して新たに辞書をつくります。何個でも可能です。

```python
new_dict = dict(
    key1=1,
    key2=1,
    **dictA,
    **dictB,
)
print(new_dict)
# => {'key1': 1, 'key2': 1, 'A1': 1, 'A2': 1, 'B1': 1, 'B2': 1}
```
## 非破壊的
非破壊的な処理なので元の辞書は変更を受けません。

```python
new_dict['keyA1'] = 5

print(new_dict['keyA1'])
# => 5
print(dictA['keyA1'])
# => 1
```
## 重複がある場合の挙動
重複がある場合はTypeErrorになるので、意図しない値の上書きを回避できます。
辞書内のkeyと明示的に書いたキーワード引数すべての重複に対してエラーになります。

```python
dictA = {'key': 'dictA'}
dictB = {'key': 'dictB'}

new_dict = dict(
    key='A',
    **dictA,
    **dictB,
)
# => TypeError: type object got multiple values for keyword argument 'key'
```
# まとめ
dict関数で作り直せば辞書の結合、要素の追加は安全かつ簡潔に書けますよ、という話でした！
Kubernetes certmanager


# Read Bellow Doc
https://cert-manager.io/docs/installation/kubernetes/

#  file
```
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    # You must replace this email address with your own.
    # Let's Encrypt will use this to contact you about expiring
    # certificates, and issues related to your account.
    email: test@example.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # Secret resource used to store the account's private key.
      name: letsencrypt-key
    # Enable the HTTP01 challenge mechanism for this Issuer
    http01: {}

---
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: letsencrypto
spec:
  secretName: api-server-certificate
  commonName: domain-name.com
  dnsNames:
    - domain-name.com
  issuerRef:
    name: letsencrypt-staging
    kind: ClusterIssuer

```
# Secret削除
```
kubectl delete secret secretname
```

# 失敗ログ確認
```
kubectl describe challenges
```

# Google Managed Certificate
https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs
check process

```
kubectl describe managedcertificate
```
bashでディレクトリのファイル名を一括変更する

*自分のための備忘録です

# bashとは
kernel(=OSのこと?)を操作するための言語的なもの

#ファイル名を一括変更するには
 1. 所定のディレクトリに移動する
 2. ```mv (変更前の名前) (変更後の名前)```で変更可能
 3. ファイルが複数ある場合は，<br> ```for i in *; do hogehoge; done```<br>で可能．この時の * は様々な書き方がある．例えばfigure_hoge1, figure_hoge2...などのファイル名だけが該当するなら，代わりにfigure_hoge*とすればそれらだけを触れる．```*```はとても使える！

また，bashでprintに該当するのは```echo```
非同期通信でTodoの保存を行うアプリケーションのJSを細かくみてみる。

アプリは以下のような物

![alt](https://gyazo.com/bcf622ad4b623f932fdc5e03d6883b53.alt)

jsファイル、コントローラー、ビューは以下の通り。

```todo.js
$(function() {

  function buildHTML(todo) {
    var html = $('<li class="todo">').append(todo.content);
    return html;
  }

  $('.js-form').on('submit', function(e) {
    e.preventDefault();
    var todo = $('.js-form__text-field').val();
    $.ajax({
      type: 'POST',
      url: '/todos.json',
      data: {
        todo: {
          content: todo
        }
      },
      dataType: 'json'
    })
    .done(function(data) {
      var html = buildHTML(data);
      $('.todos').append(html);
      $('.js-form__text-field').val('');
    })
    .fail(function() {
      alert('error');
    });
  });
});
```

```index.html
<div class="contents">
  <%= form_for @todo, html: { class: 'form js-form' } do |f|%>
    <%= f.text_field :content, class: 'form__text-field js-form__text-field' %>
    <%= f.submit class: 'form__submit js-submit' %>
  <% end %>
  <ul class="todos">
    <%= render @todos %>
  </ul>
</div>
```

```todo_controller.rb
class TodosController < ApplicationController
  def index
    @todo = Todo.new
    @todos = Todo.order('created_at ASC')
  end

  def create
    @todo = Todo.create(todo_params)
    respond_to do |format|
    # respond_to メソッドでリクエストがHTMLのレスポンス求めているのか、
    # それともJSONのレスポンス求めているのか,条件分岐させる。
      format.html { redirect_to :root }  # htmlリクエストの場合
      format.json { render json: @todo}  # jsonリクエストの場合
    end
  end
  
  private
  def todo_params
    params.require(:todo).permit(:content)
  end
end
```

####・Json
Rubyのハッシュと同様、キーとバリューの組み合わせでデータを表現するデータ記述形式。
表示形式は下記参照
`{user_name: "testさん", created_at: "2019-08-28T10:35:13.000+09:00", content: "これがJSONの形です！", image_url: null, id: 6}`

以下でjsファイルを細かく見ていく

```todo.js
$(function() {    // function で以下が関数であると定義する

  function buildHTML(todo) {
    var html = $('<li class="todo">').append(todo.content);  //todoの内容をcontentに追加する。
    return html;  //controllerで設定された処理を実行する　（format.html { redirect_to :root }）
  }

  $('.js-form').on('submit', function(e) {   //イベントの設定（submitイベント(クリックorエンターキー)が行われた際に処理が行われる。）
    e.preventDefault();   //デフォルトの、通信処理を通じてホームを送信する処理を止めている
    var todo = $('.js-form__text-field').val();
    $.ajax({  // 非同期通信を行うための記述。
      type: 'POST', // HTTP通信の種類を記述している。GETとPOSTの２種類がある。
      url: '/todos.json',data: {todo: {content: todo}},dataType: 'json'})  // わかりやすいように引数の部分を一列にした
      // url:リクエストを送信する先のURLを記述する。
      // data:サーバに送信する値を記述する。
      // dataType	:サーバから返されるデータの型を指定する。
    .done(function(data) {   // 非同期通信が成功した際の処理
      var html = buildHTML(data);   // HTMLのレスポンスに関して、buildHTML(data) の処理を実行する
      $('.todos').append(html);   // 記入された内容をHTMLに追加する。
      $('.js-form__text-field').val('');  // 未記入の時には追加しないというバリデーションを設定している
    })
    .fail(function() {   // 非同期通信が失敗した際の処理
      alert('error');   //error というアラート文を表示する。
    });
  });
});
```

現状の理解はこのようなイメージ。
誤りがございましたらご教示ください。
ログの確認

忘れないためのメモ

railsの場合、エラーを確認にするには、
開発環境 => log/development.log
本番環境 => log/production.log
ー＞特に本番環境は ~→current→log→production.logに行くこと！
を見るのが基本となります。
開発環境では、ブラウザにエラーが表示される場合もありますが、
本番環境では基本的に表示されません。
PHPのようにブラウザ上にエラーが表示される事は期待しないほうが良いので、
ターミナルでtailコマンドで常にログを開いておくと便利です。
tail -f log/development.log
tail -f log/production.log
tensorflowのstrategy.experimental_run_v2の使用する際の注意点

<h1>tensorflowのstrategy.experimental_run_v2の使用する際の注意点</h1>

tensorflowには、分散学習用のAPIが用意されています。
tensorflowで分散学習する際に必ず使うstrategy.experimental_run_v2は、@tf.functionの中で宣言すべきようです。


```
    @tf.function
    def distributed_train_step(入力データなど):
            return  mirrored_strategy.experimental_run_v2(学習関数名, args=(入力データなど))

```


これだけなのですが、mirrored_strategy.experimental_run_v2で使用する学習関数のほうに@tf.funcionを宣言しておくとエラーが発生する場合があるようです。
c#でatcoder その3

#概要

c#でatcoderの練習問題やってみる。

#練習問題

文字列Sが与えられ、始め空の文字列Tの末尾に "dream", "dreamer", "erase", "eraser"を追加する処理を行って、S=Tにできるか判定する問題です。

#成果物

https://paiza.io/projects/aeec1g04HH4TH0CgP7A1FQ


以上。
c#でatcoder その２

#概要

c#でatcoderの練習問題やってみる。

#練習問題

時刻0のとき、平面上の(0, 0)にいます。平面上のN箇所の点を、ある時刻に移動できるかという問題です。

#成果物

https://paiza.io/projects/UdsS3I8-KpPzBCWu_dxCmg


以上。
c#でatcoder

#概要

c#でatcoderの練習問題やってみる。

#参考にしたページ

https://qiita.com/NotFounds/items/7b166af69a6f52a332de

#練習問題

3つの整数値と文字列を1つ受け取り、整数値の和と文字列を一行に出力する問題です。

#成果物

https://paiza.io/projects/ln_uYwy4_73P-RMA-k8Ueg

以上。
EKSでPrivate IPが足りなくなった場合の対処

# はじめに

ある日、EKSで新しいServiceを作ろうとしたところ、Subnet内に利用可能なPrivateIPが足りずに失敗した。

```
Warning  CreatingLoadBalancerFailed  7m12s  service-controller  Error creating load balancer (will retry): failed to ensure load balancer for service xxxxx: InvalidSubnet: Not enough IP space available in subnet-xxxxx. ELB requires at least 8 free IP addresses in each subnet.
```

このSubnetのサブネットマスクは255.255.255.0なので、256弱のPrivateIPが使えるはずであるが、各Node(m5.xlarge)に30のPrivateIPが割り当ていることが原因でPrivateIPが枯渇していた。

# ENIの割り当て

ENIの割り当て方法については詳しくは以下を参照。

https://github.com/aws/amazon-vpc-cni-k8s#eni-allocation

要は、NodeがClusterに追加された時にENIが一つ、その後ipamDがもう一つENIをアタッチする。今回のNodeはm5.xlargeなので、1ENI辺り15のIPを割り当てられるので、計30個のIPが割り当てられていた。

# 解決方法

`WARM_ENI_TARGET` と `WARM_IP_TARGET` の適宜修正することで、事前に割り当てるPrivateIPの数を調整できる。詳しくは以下を参照。

https://docs.aws.amazon.com/eks/latest/userguide/cni-env-vars.html

`WARM_ENI_TARGET` は使っていない事前に確保しておくENIの数。`WARM_IP_TARGET`は使っていない事前に確保しておくIPの数。

# 更新方法

まず以下のようなファイルを生成する。ここでは仮にtmp.yamlとする。 `WARM_IP_TARGET` には設定したい値に変えてください。

```
spec:
  template:
    spec:
      containers:
        - name: aws-node
          env:
          - name: WARM_IP_TARGET
            value: "5"
```

以下のコマンドを実行。

```
$ kubectl patch daemonset -n kube-system aws-node --patch "$(cat tmp.yaml)"
```

# 参考

- [Running out of IP addresses with EKS, not sure if I'm missing something](https://www.reddit.com/r/aws/comments/cpiveu/running_out_of_ip_addresses_with_eks_not_sure_if/)
- [CNI Configuration Variables](https://docs.aws.amazon.com/eks/latest/userguide/cni-env-vars.html)
- [How do I set an environment variable in an EKS worker node (for CNI configuration)?](https://www.reddit.com/r/aws/comments/axdku9/how_do_i_set_an_environment_variable_in_an_eks/)
- [Elastic Network Interfaces](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html)
- [aws
/
amazon-vpc-cni-k8s](https://github.com/aws/amazon-vpc-cni-k8s)
- [EKS利用時に注意すべきポイント](https://qiita.com/paper2/items/efa1083ce955c174c800)
初投稿

#OSS活用勉強会でQiita入門というMarkdown勉強会に参加してみたので、自分でもちょっと書いてみた。

##まずは自己紹介など・・・
Qiita初めての記事は、Qiita入門イベントに参加してみたレポートになります。
あ、申し遅れました。長野県伊那市で電子黒板の販売や、ネットワーク構築などを生業とする会社の一人親方なんぞしている「鄭　喆敏（てい　あきとし）」と申します。
1973年8月生まれの在日コリアン3世（但し日本語しか喋れません）
そう、今世間で「氷河期世代」とされている40代後半の人間です。
某書店員・某家電販売員・某カメラメーカー修理センター電話対応員・某カメラメーカー修理センター作業員~~（MOドライブとか音楽プレイヤーとかの修理してました）~~という職歴を経て、伊那市の公立校（小中21校）でのPC更新計画策定に関わり（iPad大量導入へと繋がります）教育ICT分野にコミットし始めました。その活動の中で、ブームになり始めたIoTと関わるようになり、それと同時に地方でのエンジニアの圧倒的な少なさに直面。それを解決すべく~~（今から考えるとかなり無茶してますが）~~2017年から地元で、「IoTで地域課題解決にチャレンジ」を掲げハッカソンの開催などを行っています。（2019年は諸事情により開催できず）
現在は、CoderDojo伊那のチャンピオン（代表の意味）をやったり、「Code for」の地元ブリゲード（消防団 ここでは地方組織の意）立ち上げ準備をしています。

##今後どうするか・・・
今後はあくまで地元を拠点に、IoTやAIの活用の追求・地域に眠る様々な情報のオープンデータ化や活用、地域全体の情報リテラシーの底上げなどに係るあらゆることに関与していこうとしています。
2019年M5STACK TOP10

#ネタバレ注意 M5Stack 2019年TOP10

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">2019 has been a whirlwind year for M5Stack, join us in celebrating and lets look at the M5Stack devices you loved the most in our run down of the top 10. <a href="https://t.co/8VPXYP4J2g">https://t.co/8VPXYP4J2g</a> <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://twitter.com/hashtag/ESP32?src=hash&amp;ref_src=twsrc%5Etfw">#ESP32</a> # IoT <a href="https://t.co/suwyj3N9HD">pic.twitter.com/suwyj3N9HD</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1215582283215691777?ref_src=twsrc%5Etfw">January 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

忙しくてゆっくり見る時間の無い方へ、M5Stackが発表した2019年M5Stack TOP10だそうです。
じっくり見たい方は[YouTube](https://www.youtube.com/watch?v=4PDOMvZ-zGM&feature=youtu.be)をどうぞ。


↓↓↓
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
↓↓↓

1.M5STACK BASIC(CORE)
2.M5STICK C
3.M5STICK V
4.M5STACK FIRE
5.M5STACK FACES KIT
6.M5GO IOT STARTER KIT
7.ESP32CAM(ORIGINAL)
8.PROTO MODULE
9.CARDKB UNIT
10.M5 CAMERA(PSRAM CAM)

金額ベースなのか台数ベースなのかはよくわかりませんでしたが、TOP3は今後もしばらく鉄板な気もします。開発スピードが尋常ではないので今年の新製品にも期待大ですね。
まずは新ラインナップのM2STACK? とか M5ATOM? に期待です。
nestjsで依存関係をいい感じに解決する

こんな感じのディレクトリがある

```
├── api
│   ├── ...
│   ├── nest-cli.json
│   └── db
│       ├── entities
│       └── ...
└── batch
    ├── ...
    ├── nest-cli.json
    └── src
        └── ...
```

# 何をしたいか

`batch/src` 以下で、 `api/db/entities` 内にあるエンティティ使いたい

```shell
cd batch
nest start
```

 すると
`Error: Cannot find module '../batch/dist/main'`
となって動かない

これを解決したい

# 何をすればいいか

dist配下にどちらかの形でmain.js出力されるようにすればいい

```
dist/main.js
dist/src/main.js
```

# 何をしたか

`batch/nest-cli.json` を書き換えた

```json:batch/nest-cli.json
{
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "root": "src",
  "compilerOptions": {
    "webpack": true,
    "deleteOutDir": true
  }
}
```

# どうなるか

`dist/src/main.js` と出力されるようになる

※ `"root": "src"`を削除してbuildすると `dist/main.js` と出力される

# 感想

ディレクトリ構成から見直すべきかもしれないが、依存関係をいい感じにコネてとりあえず動かしたい時に使おうと思った
論文まとめ：A Unified Approach to Interpreting Model Predictions  

# はじめに 
NIPs 2017からSHAPという、学習した複雑モデルを解釈説明するしくみ
[1] S. M. Lundberg, et. al. "A Unified Approach to Interpreting Model Predictions"
https://papers.nips.cc/paper/7062-a-unified-approach-to-interpreting-model-predictions
のまとめ

SHAPの使用方法やロジックの簡単なまとめに関する記事は既にいくつか存在する
https://qiita.com/shin_mura/items/cde01198552eda9146b7
https://orizuru.io/blog/machine-learning/shap/
https://linus-mk.hatenablog.com/entry/2018/10/28/230410

またこちらはSHAPのみならず多くの手法をまとめたもの
https://www.slideshare.net/SatoshiHara3/ss-126157179

著者らのgithubコード
https://github.com/slundberg/shap

# 概要 
1. 複雑なモデルを解釈・説明するしくみの１つ
2. 複雑なモデルを簡単なモデルで局所的に近似する
3. 具体的にはゲーム理論におけるシャープレイ値をモデルの説明に応用する

# シャープレイ値
シャープレイ値に関して、ざっくりまとめると多分以下のような感じ。（間違ってたら教えて下さい）

１）$F$ 人が協力して行うゲームを考える。$f$ を貢献度を表す関数とする。全ての組み合わせに関して貢献度を計算する。

２）$F$ 人から $S$ 人を選んだ時点での貢献度は $f\_S (x\_S)$ 。これに $i$ さんが加わった場合の貢献度は $f\_S (x\_S)$ 。そうすると、この時の $i$ さんの貢献度は

```math
f_{S \cup \{ i \} } (x_{S \cup \{ i \}}) - f_S (x_S)
```

と考えられる。これの全ての組み合わせに対する期待値を出したい。

３）まず $S$ を $S=S'$ と固定して考える。そうすると、$F$ 人から $i$ さんを除いた $F-1$ 人から $S' \subseteq F \backslash \{ i \}$ 人を選ぶ組み合わせの数は

 ```math
\frac{|F-1|! }{|S'|! (|F|-1-|S'|)!}
```

である。よって $S = S'$ の場合の $i$ さんの貢献度の期待値は

```math
\sum_{S' \subseteq F \backslash \{ i \}} \frac{|S'|! (|F|-1-|S'|)!}{|F-1|! } [f_{S' \cup \{ i \} } (x_{S' \cup \{ i \}}) - f_{S'} (x_{S'})]
```

となる。$S'$ は $0$ から $F-1$ まで $F$ 個あるので、この値を更に $F$ で割って求める $i$ さんの貢献度の期待値とする。

```math
\begin{eqnarray}
\phi_i &=& \frac{1}{|F|} \sum_{S \subseteq F \backslash \{ i \}} \frac{|S|! (|F|-1-|S|)!}{|F-1|! } [f_{S \cup \{ i \} } (x_{S \cup \{ i \}}) - f_{S} (x_{S})] \\
&=& \sum_{S \subseteq F \backslash \{ i \}} \frac{|S|! (|F|-1-|S|)!}{|F|! } [f_{S \cup \{ i \} } (x_{S \cup \{ i \}}) - f_{S} (x_{S})] 
\end{eqnarray}

```

# シャプープレイ値を用いた説明の手順
<font color='red'>書きかけ</font>

# reference 
[2] 河崎氏「シャープレイ値（１）」
https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=2ahUKEwi72-Sr1vLmAhUU_GEKHS3TCHcQFjABegQIARAC&url=http%3A%2F%2Fwww.ocw.titech.ac.jp%2Findex.php%3Fmodule%3DGeneral%26action%3DDownLoad%26file%3D201427708-175-0-76.pdf%26type%3Dcal%26JWC%3D201427708&usg=AOvVaw2vWDbkCXtovAnwqQVI720y
[Rails]form_withでutf8=✓を消す方法

調べても中々なかったのでメモ

## form_withでutf8=✓を消す方法

```haml
= form_with(url: hoge_path, method: :get, local: true, skip_enforcing_utf8: true)
```

`skip_enforcing_utf8: true`を指定する。


### form_for / form_tagだと

`enforce_utf8: false`

## 参考情報

- https://github.com/rails/rails/pull/26976/commits/15a805c38059a951c5fba1f6bc9281d6707fed4e#diff-05817d325a286d1a910b60604c35d3e3R692
- https://qiita.com/tyamagu2/items/fbc44f7b41a1697ca5b7
PHPで他URLのファイルを転送してダウンロードさせる

やっていることはトンネル。

```php
function forwardBin($url) {

    // ウェブブラウザが独自にMIMEタイプを判断する処理を抑止する
    header('X-Content-Type-Options: nosniff');

    // ダウンロードするべきファイル情報を先に取得して、その内容をそのまま設定
    $filename = basename($url);
    $headers = get_headers($url, 1);
    header('Content-Type: ').$headers['Content-Type'];
    header('Content-Length: '.$headers['Content-Length']);
    header("Content-Disposition: attachment; filename=${filename}");

    // readfile()の前に出力バッファリングを無効化する
    while (ob_get_level()) {
        ob_end_clean();
    }
    // ダウンロード
    readfile($url);

    exit;
}
```

[【PHP】正しいダウンロード処理の書き方](https://qiita.com/fallout/items/3682e529d189693109eb) を参考にしました。
Android + Termux で Vulkan 開発を行うメモ

## 背景

* Android で Vulkan でレイトレーシングや機械学習したい.
* Android で Vulkan(C/C++)開発を効率化したい
  * Gradle or Android Stuio で Java(Kotlin)経由で JNI で Vulkan とかめんどくさすぎる. 
* とりあえず compute 実行でよいので, Vulkan 開発と動作チェックする仕組みを作りたい

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ねんがんの Pixel4 + Termux で Vulkan minimal compute の実行に成功したぞ!!!! 🎉🎉🎉🎉🎉🤩🤩🤩🤩🤩🤩🤩🤩😍😍😍😍😍😍😍✌️✌️✌️✌️✌️✌️✌️✌️💪💪💪💪💪💪 thanks to <a href="https://twitter.com/ilmarihei?ref_src=twsrc%5Etfw">@ilmarihei</a> &#39;s advice I can finally got Vulkan running on Android + Termux!!! 🎊🎊🎊🎊🎊🎊 <a href="https://t.co/Y9FHhr8fZY">pic.twitter.com/Y9FHhr8fZY</a></p>&mdash; Syoyo Fujita 🌸 RayWa(Ray and Peace) (@syoyo) <a href="https://twitter.com/syoyo/status/1215571049598705664?ref_src=twsrc%5Etfw">January 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

できました.

## 情報

きっかけは ilmari 先生のツイートでした.

<blockquote class="twitter-tweet"><p lang="nl" dir="ltr">Termux + Vulkan runner on aarch64 is go! 🥳🥳🥳🚀📲💥</p>&mdash; Ilmari Heikkinen (@ilmarihei) <a href="https://twitter.com/ilmarihei/status/1075609459127271424?ref_src=twsrc%5Etfw">December 20, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

調べると `/system/lib64/libvulkan.so` があります.

https://source.android.com/devices/graphics/implement-vulkan

Android のドキュメントでも vulkan.so があるとありました. Vulkan は C API, .so 自体も C のみで実装(のはず)ですので, C++ ABI 周りの問題もあまりないはずですから, Termux でも直接呼べる(NDK の clang とバージョンや STL を合わせる必要がない)と想像できます.

## 実行

いつものように, Termux で vulkan_minimal_compute で動作を試してみます.

https://github.com/Erkaman/vulkan_minimal_compute

Vulkan のヘッダーファイル(vulkan_android.h)は, x11 関連あたりを pkg install すれば, Termux に入っていました.
(Termux では, `/usr` は `/data/data/com.termux/files/` にあります)

もしファイルがなければ, vulkan-headers(+ Vulkan-Loader) を使うのも手でしょう

冬到来! SwiftShader を使い人類史上最速で Vulkan プログラミングをはじめよう!
https://qiita.com/syoyo/items/ef5518f8c3638e50a6b9

あとは `/system/lib64/libvulkan.so` とリンクするようにすればよいです!

## 感想

しかしスマホの画面では, 外部物理キーボードつかってもめんどいです.
Snapdragon 855 あたり搭載した GPU 性能のよいタブレットがほしいところです.

## TODO

* [ ] Fluxbox + VNC だと quantized color モードになるようで, 画像を Display(ImageMagick)してもきちんと色が出ないので 32bit color になる設定を見つける.
* [ ] 画面に出す
  * [ ] X11 + XCB Surface でいけるか?
  * [ ] Flutter で GUI を作り, ffi で Vulkan 関数を呼ぶ
* [ ] Termux へ ssh ログインだとなんだか反応わるい. VNC も不安定なのでなんとかしたい.
* [ ] Termux から PC Linux の X11 にはなぜか飛ばせない問題を解決する(ポート or username 問題?)
[Rails]Deviseの有効期限設定する方法

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#URLの有効期限
設定ファイル `config/initializers/devise.rb` を編集

```config/initializers/devise.rb
Devise.setup do |config|
  # 省略
  config.confirm_within = 1.minutes
  # 省略
end
```
この記述内容はアカウントを登録してから
・１分以内なら確認化
・１分以降なら確認不可
になる設定ができる！

#参考記事
・[Deviseの有効期限設定をテストする](https://pinzolo.github.io/2015/12/10/testing-devise-timelimits.html/)
・[【Rails】deviseでURL認証付きのメールを送信してみる](https://qiita.com/ozackiee/items/21fcad4a1564136b9510/)
CentOS7 カーネルパラメータ チューニング

# はじめに
OSにデフォルトで掛かっている様々な制限を外し、ハードウェアの限界性能を引き出す。

主に、オープンファイル数の上限、起動プロセス数の上限、TCP/IPのポート数の上限、TCPコネクションの再利用促進、TCPの不正対策、IPv6無効化による資源の効率化、等々。

**※カーネルパラメータの設定変更は自己責任でお願いします。
※必ず十分にテストをしてから、適用してください。**

# OSのファイル数上限、ユーザの起動プロセス数上限を変更

/etc/systemd/system.conf を開いて以下を変更する

```
DefaultLimitNOFILE=1048576
DefaultLimitNPROC=1048576
```

/etc/sysctl.conf を開いて以下を変更する

```
# システム全体のプロセス数の上限
#kernel.threads-max = 29990
kernel.threads-max = 1060863

# システム全体のファイルディスクリプタの上限
#fs.file-max = 379862
fs.file-max = 5242880

# TCP/IPの送信用ポート範囲の変更
#net.ipv4.ip_local_port_range = 32768    60999
net.ipv4.ip_local_port_range = 1024 65535

# TCPソケットが受け付けた接続要求を格納するキューの最大長
#net.core.somaxconn = 128
net.core.somaxconn = 65535

# ソケット当たりのSYNを受け付けてACKを受け取っていない状態のコネクションの保持可能数
#net.ipv4.tcp_max_syn_backlog = 128
net.ipv4.tcp_max_syn_backlog = 65535

# カーネルがキューイング可能なパケットの最大個数
#net.core.netdev_max_backlog = 1000
net.core.netdev_max_backlog = 16384

# TIME_OUT 状態のコネクションを再利用
#net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_reuse = 1

#TCPのTIME_WAITの再利用を高速化(Linux4.12以降廃止)
net.ipv4.tcp_tw_recycle = 0
#TCPのFINを送信してからのタイムアウト時間
#net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_fin_timeout=10

#通信がアイドル状態になった後にスロースタートさせるか
#net.ipv4.tcp_slow_start_after_idle = 1
net.ipv4.tcp_slow_start_after_idle = 0

# スプーフィング対策 送信元IPの偽装防止
net.ipv4.conf.all.rp_filter = 1

# RFC1337に準拠させる。
# TIME_WAIT状態のときにRSTを受信した場合、TIME_WAIT期間の終了を待たずにそのソケットをクローズする
#net.ipv4.tcp_rfc1337 = 0
net.ipv4.tcp_rfc1337 = 1

# IPv6 無効化(無効化しない場合コメントアウト)
#net.ipv6.conf.all.disable_ipv6=1
#net.ipv6.conf.default.disable_ipv6=1

# SYN flood攻撃対策(負荷テスト時など対策しない場合0にする)
#net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syncookies = 0

```

設定反映

```
sysctl -p
```

設定確認

```
sysctl -a
```

OS再起動

```
# shutdown -r now
```


設定が反映されている事を確認する

```
# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14995
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1048576
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1048576
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
```