OmniAICreator/Qiita-1.07M huggingface dataset:
NSubstitute を使った処理の置き換え

# NSubstitute
NSubstitute は主にユニットテストで利用できる .Net 用の Mock ライブラリです。
今回の記事では v4.2.1 で動作を確認しています。

# 使い方
## Sample
今回はこのようなインターフェースを例に使い方を説明します。

```
        public interface INSubstituteSample
        {
            void Hoge(int a, int b);
            bool Fuga(int a, int b);
        }
```


## モックの作成
`Substitute.For<インターフェース名>()`でモック化したインスタンスを取得します。

```
            var mock = Substitute.For<INSubstituteSample>();
```

## 処理の置き換え
### 戻り値がある場合
#### 引数を指定する
`Returns()`を使います。

```
            mock.Fuga(1, 2).Returns(true);
            Assert.IsTrue(mock.Fuga(1, 2)); // 成功
            Assert.IsTrue(mock.Fuga(2, 2)); // 失敗
```
#### どんな引数の場合でも決まった値を返す（１）
先ほどは引数が指定したものと一致していた場合に特定の値を返していました。
引数がどんな値でも決まった値を返したい場合は `ReturnsForAnyArgs()` を使うことができます。

```
            mock.Fuga(1, 2).ReturnsForAnyArgs(true);
            Assert.IsTrue(mock.Fuga(1, 2)); // 成功
            Assert.IsTrue(mock.Fuga(2, 2)); // 成功
```
#### どんな引数の場合でも決まった値を返す（２）
戻り値のあるメソッドに対して引数がどんな値でも決まった値を返させたい場合に、Arg クラスを使うことで`Returns()`で指定することもできます。

```
            mock.Fuga(Arg.Any<int>(), Arg.Any<int>()).Returns(true);
            Assert.IsTrue(mock.Fuga(1, 2)); // 成功
            Assert.IsTrue(mock.Fuga(2, 2)); // 成功
```
#### 呼び出し時に別の処理をする
`Returns()`, `ReturnsForAnyArgs()` では引数にラムダ式を指定することで呼び出し時に指定した処理をさせることができます。

```
            mock.Fuga(1, 2).Returns(x => Console.WriteLine("Called"));
```

#### 呼び出し時の処理で元のメソッドの引数を取得する
`Returns()`のラムダ式の中では、元のメソッドを呼び出す際に使われた引数を取得することもできます。

```
            mock.Fuga(Arg.Any<int>(), Arg.Any<int>()).Returns(x =>
            {
                return x.ArgAt<int>(0) > x.ArgAt<int>(1);
            });
            Assert.IsTrue(mock.Fuga(1, 0)); // 成功
            Assert.IsTrue(mock.Fuga(1, 2)); // 失敗
```

### 戻り値がない場合
`Returns()` が使えるのは値を返すメソッドに対してのみです。
値を返さないメソッドに対しては `When()` と `Do()` を使って処理を置き換えることができます。

```
            mock.When(x => x.Hoge(1, 2)).Do(x => Console.WriteLine("Called") );
```
openapi-generator におけるRestful

# [忙しい人のための結論](https://github.com/OpenAPITools/openapi-generator/blob/6.0.x/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java#L239-L241)

* tag付けは必須かもしれない
* tagとpathはpathParamを除いたとき大文字小文字は無視して一致しなければならない
* pathParamは一つのみしか許容されない
* POSTはpathParamを含めることはできない
* PUT, PATCH, DELETEはpathParamが必要

# 目次
1. [openapi-generator におけるRestful](# openapi-generator におけるRestful)
2. [openapi-generator におけるtagとoperation](# openapi-generator におけるtagとoperation)

# openapi-generator におけるRestful

## GET

以下の条件に当てはまるとき

* [pathに対してtagがそれと一致する。大文字小文字は考えない (e.g. pathが/usersでusersのtagが付与されているoperation](https://github.com/OpenAPITools/openapi-generator/blob/6.0.x/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java#L186)
* [pathにただ一つのpathParamがあり、pathParamを除くときtagと一致する。大文字小文字は考えない (e.g. pathが/users/{userID}でtagがusers](https://github.com/OpenAPITools/openapi-generator/blob/6.0.x/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java#L194-L196)

## POST

* [pathに対してtagがそれと一致する。大文字小文字は考えない (e.g. pathが/usersでusersのtagが付与されているoperation](https://github.com/OpenAPITools/openapi-generator/blob/6.0.x/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java#L204)

## PUT, PATCH

* [pathにただ一つのpathParamがあり、pathParamを除くときtagと一致する。大文字小文字は考えない (e.g. pathが/usersでusersのtagが付与されているoperation](https://github.com/OpenAPITools/openapi-generator/blob/6.0.x/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java#L213)

## DELETE

* [pathにただ一つのpathParamがあり、pathParamを除くときtagと一致する。大文字小文字は考えない (e.g. pathが/usersでusersのtagが付与されているoperation](https://github.com/OpenAPITools/openapi-generator/blob/6.0.x/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java#L231)


# openapi-generator におけるtagとoperation

opeanapiにおいてoperationに対し複数のtagをつけることは許容されている気がします

[openapi-generatorにおいてはtagを複数つけるとtagをbaseNameとするoperationが生成されます](https://github.com/OpenAPITools/openapi-generator/blob/b13e37839a648522fcb7dc6d43b62541d8024073/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java#L585)

つまりoperationにおいてはtagを複数つけるとその分operationが生成されます

[tagがない場合では一つのoperationがdefaultのtagで生成されます](https://github.com/OpenAPITools/openapi-generator/blob/b13e37839a648522fcb7dc6d43b62541d8024073/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java#L1107-L1109)

スタブはこれを無視していることが多いためtagを複数つけると同じhandlerが複数生成されたりする気がします
坂本俊之『作ってわかる アンサンブル学習アルゴリズム入門』の9章の勾配ブースティングの説明について

今、[坂本俊之『作ってわかる アンサンブル学習アルゴリズム入門』](https://www.c-r.com/book/detail/1316)を学習中です。
決定木の基礎から勾配ブースティングまでフルスクラッチで作れて勉強になり、楽しいです。


しかし、この記事
[坂本俊之『作ってわかる! アンサンブル学習アルゴリズム入門』の誤植情報を集める](https://qiita.com/hoxo_m/items/82f6fa2fd2cbae4bdfdb)
にあるよう、ミスがいくつかあります。

そして、9章の勾配ブースティングの説明も間違っていると思われるのですが、私の勘違いかもしれないので、指摘等を集める意味でも記事にしました。

# 間違っていると思われる個所

p201の式(2)

```math
\begin{align}
h_{i+1}&=h_{i}+\eta \frac{\delta l_i}{\delta y}\\
&=h_{i}+\eta\cdot2\cdot\sum_m(y_{mi}-h_{mi})
\tag{2}
\end{align}
```

という式がおかしいと思います

p200で、「$i$番目の学習」と書いてあるので、$i$は予測機が何番目か表すインデックス、$m$はデータのインデックスだと思われます。  
そうすると$\sum_m(y_{mi}-h_{mi})$はデータすべてについて目的変数と予測結果の残差を取って足し合わせるという計算になると思われます。
しかしそのような計算はその次のページのコードには載ってないですし、そもそもページ下部で参照している勾配ブースティングの論文[^1]にも載ってません。

[^1]: [Jerome H. Friedman. Greedy Function Approximation: A Gradient Boosting Machine. 1999](https://statweb.stanford.edu/~jhf/ftp/trebst.pdf)

# 修正案

記号はそのままで、元の論文の理論展開に合わせてp200、201の説明を直すと、

「$M$個あるデータの内$m$番目のデータの目的変数を$y_m$、それに対する$i$番回学習した予測結果(モデル関数)を$h_{i}(x_m)$とすると、二乗平均誤差の損失関数$l$は

```math
\begin{align}
l_{mi}=\frac{1}{2}[y_{m}-h_{i}(x_m)]^2\tag{1*}
\end{align}
```

となる。

一般的に次の$i+1$番目のモデル関数$h_{i+1}$の誤差関数がより小さくなるようにするには、学習率$\eta$、全ての$x$についての損失関数の勾配の期待値

```math
\begin{align}
g_i&=E\left[\frac{\partial l}{\partial h}|_{h=h_i}\right]
\end{align}
```
を用いて、勾配降下法の要領で、$h_{i+1}=h_i-\eta g_i$と計算すればいい。このとき$g_i$は$h_{i+1}$,$h_i$と同じくモデル関数である。(特定の値などではない)  
しかし、$M$個の有限のデータしかなく、$x=x_m$以外の点での勾配が求められないので$g_i$は計算できない。そこで式(1*)を$h$で微分し、$h_{i}(x_m)$を代入する。

```math
\begin{align}
\frac{\partial l_{mi}}{\partial h_i}&=-[y_{m}-h_{i}(x_m)]\\
&=-\tilde{y}_{mi}
\end{align}
```

$x_m$から、$\tilde y_{mi}$を予測するモデル関数は、$-g_i$と近くなりそうである。そこで、$\tilde y_{mi}$を予測する弱学習機$\theta_i(x_m)$を作成し、これを$-g_i$の近似関数とみなして$h_{i+1}=h_i+\eta \theta_i$と更新することにすればいい。

さらに$\theta_i^\ast=\eta\theta_i$とすると、学習機$\theta_i$で$\tilde y_{mi}$ を予測することは次の表に示すように、 $\theta^\ast_i$ で $\eta\tilde y_{mi}$ を予測することと同じになる。


| 学習機　　          | 目的変数             | 
| --------------- | -------------------- | 
| $\theta_i$      | $\tilde{y}_{mi}$     | 
| $\theta_i^\ast=\eta \theta_i$ | $\eta\tilde{y}_{mi}$ | 

よって、$x_m$から目的変数$\tilde{y}^\ast_{mi}=\eta[y_{m}-h_{i}(x_m)]$を予測する学習機$\theta_i^\ast$を作成し、予測機を$h_{i+1}=h_i+\theta_i^\ast$と更新する。」

という説明にすると、論文やこの次のページのコードとの整合性が取れます。
(本書籍のここの説明中の記号は、論文中の記号が別で使われている記号と入れ替わっていて大変紛らわしいです
論文→本書籍の対応で、全体の予測機$F$が$h$、弱学習機$h$は$\theta$、学習機の番号$m$は$i$、データ番号$i$は$m$に入れ替わっています。)

以上です。どなたか指摘等あればコメントお願いします。
rekordboxのxmlコレクション情報をPythonで正規化し可視化

そもそも、rekordboxとはフリーの音楽管理ソフトで、フォルダをインポートするだけで特に**曲のキーの解析を自動で行ってくれ**、DJにもよく使われているソフトです。そこからどんなキーが多く含まれているのか、XMLで出力はできましたが解析が面倒だったため自動化(?)して書いておきます

コード

```python:rekordbox.py
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import tostring
import xmltodict
import json
import collections
from collections import Counter
tree = ET.parse('../mu.xml')
#ここでxmlファイルを読み込む
tree=tree.getroot()
t=tostring(tree)
dict = xmltodict.parse(t)
result = json.dumps(dict)
j = json.loads(result)

musicinfolist=[]
for m in j['DJ_PLAYLISTS']['COLLECTION']['TRACK']:
  name=m["@Name"]
  length=m["@TotalTime"]
  bpm=m["@AverageBpm"]
  tonality=m["@Tonality"]
  musicinfolist.append([name,length,bpm,tonality])

for n,l,b,t in musicinfolist:
  print(n,l,b,t)
  #曲それぞれの名前、時間、BPM、曲のキー情報を表示

namel=[x[0] for x in musicinfolist]
lenl=[int(x[1]) for x in musicinfolist]
bpml=[float(x[2]) for x in musicinfolist]
tonality=[x[3] for x in musicinfolist]
print(sorted(lenl)
print(sorted(bpml))
print(sorted(tonality))
#時間、BPM、曲のキーそれぞれ元データ
import matplotlib.pyplot as plt

plt.hist(lenl,range(0,420))
plt.show()
#曲の長さ(秒)を0,420秒の範囲で可視化したヒストグラム

plt.hist(bpml,range(50,200))
plt.show()
#BPMを50,200の範囲で可視化したヒストグラム

c=Counter(tonality)
print(c.most_common())
c=sorted(c.items())
print(c)
plt.bar([x[0] for x in c], [x[1] for x in c])
plt.show()
#曲キーのABC順のヒストグラム

c=Counter(tonality)
c= sorted(c.items(), key=lambda x:x[1],reverse=True)![bandicam 2021-09-27 00-37-20-300.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522233/49f8760b-93a6-75ca-3915-300596d3c0ec.jpeg)

plt.bar([x[0] for x in c], [x[1] for x in c])
plt.show()
#曲キーの頻度順のヒストグラム
```

パッケージのxmltodictは、pip install xmltodict で入れてください。
pltは標準では無いかもしれません。

手持ちの1425曲で実行すると以下のようになりました。

↓曲の長さ
![bandicam 2021-09-27 00-29-31-387.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522233/e7b07373-16a1-36a3-880a-1b4fedc058a4.jpeg)

↓BPM分布
![bandicam 2021-09-27 00-29-39-039.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522233/2b518ce2-27f2-9e05-47ef-75e1a41bb9e1.jpeg)

↓曲キーのABC順
![bandicam 2021-09-27 00-29-53-336.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522233/e7fcee45-46b4-2da4-9e95-0118d2eab13d.jpeg)

↓曲キーの頻度順

![bandicam 2021-09-27 00-37-20-300.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522233/ce240789-b870-0c6c-5d04-ea2cf0fac76a.jpeg)

元データ
[('Cm', 152), ('Dm', 138), ('Am', 126), ('Gm', 112), ('Bm', 112), ('Em', 108), ('Fm', 97), ('Dbm', 93), ('Bbm', 71), ('Abm', 53), ('Ebm', 52), ('F#m', 46), ('D', 40), ('C', 32), ('E', 30), ('F', 28), ('G', 28), ('Eb', 22), ('A', 21), ('Bb', 18), ('Ab', 14), ('Db', 12), ('F#', 10), ('B', 9), ('', 1)]

以上です
HTML タグの種類について　パート３

<h2>Aタグについて</h2>
サイト内のリンクに飛ぶことができるタグです.
href属性があり、ハイパーテキストリファレンスの略でどこを参照するかを示してます。
```<a href="サイト内リンクのパス">
```

<h2>リストタグ（ul、ol)について</h2>
Ulタグは黒丸付きリストです。どんな風になるか実際に見てみましょう。
<ul>
    <li>おはよう</li>
 </li>
このような結果になります。また、Ulタグには子要素としてぃタグがついてきます。

```
<ul>
    <li></li>
    <li></li>
    <li></li>
</ul>
```
タグには開始タグと閉めタグがあるので閉めるのを忘れないようにしてくだい。
また例外として閉めタグがないタグも存在します。
番号付きタグOlタグ
<ol>
   <li></li>
   <li></li>
   <li></li>
</ol>

Olタグにしたことにより番号がついてきます。
実際の記述を書いてみましょう。

```
<ol>
    <li></li>
    <li></li>
    <li></li>
</ol>
```
Ulからolタグに変わっています。これで番号付きリストを作ることができました。

<h2>imgタグについて</h2>
サイトに画像を貼りたいときはIMGタグを使い貼り付けることが可能です。
![pexels-francesco-ungaro-96418.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2074932/4be1513d-8c37-9c42-3b30-08afcb625cd5.jpeg)
上の画像をサイトに貼るときの記述の書き方について

```
<img src="画像のファイルのパス" alt="代替えテキスト"　>
```
IMGタグには、まずSRC属性（sauce）のところに画像のファイルがある場所のパスを書きます。
次に、画像が表示されなかったときのための代替えのテキストを書いてあげます。またIMGタグから直接サイズの指定もできますが
こちらでは書かないようにします。

<h2>DIVタグについて</h2>
特に何の意味も持たないタグです。ひとつのグループとしてまとめたりするときにつかいます。

```
<div>
    <h2>aaaaa</h2>
    <p></p>
</div>

```

次回もこの続きを書いていこうと思います。
sqlalchemyでのORMを用いないinsertのやり方

##概要
ORM使わないsqlalchemyでのINSERTに関する日本語記事を見つけられず、
色々組み合わせてとりあえずで動かせたので、やり方を晒します。

##環境について
Python 2.7.16
SQLAlchemy 1.4.23
pandas 1.3.3
mysql 8

##sqlalchemyでobject定義をせずにinsertするまでのコード
```
from sqlalchemy import create_engine
from sqlalchemy import MetaData
from sqlalchemy import insert

dbengine = create_engine('mysql+mysqlconnector://' + MYSQL_ID + ':' + MYSQL_PASS + '@' + MYSQL_IP + ':' + MYSQL_PORT + '/' + MYSQL_DB)
dbmetadata = MetaData()
dbmetadata.reflect(bind=dbengine)
# MetaDataオブジェクトからテーブル定義を取得します。
# testtableは実際はORMで定義されたオブジェクトのインスタンスと同等のインスタンスかと思われます。
# テーブル名はTEST_TABLEです。
testtable = dbmetadata.tables['TEST_TABLE']
# 後はORMでやるやり方と同様にインスタンス渡してinsertすればよいかと。
# 以降は割と雑です。動かなければ、「sqlalchemy insert」とかで検索すれば幸せになれるかと思います。
insertstmt = (testtable).insert().values([column1:'value1', column2:'column2'])
dbengine.execute(insertstmt)
```

Selectとは異なり、Insert時にはテーブルを定義したオブジェクトのインスタンスがないと動作しないっぽいです。
ただ、MetaDataを利用してインスタンスが取得できます。
このため、ORMのようにオブジェクトをわざわざ定義しなくて良いのは楽。

##DataFrameをInsertするやり方

```
df.to_sql('TEST', dbengine, if_exists='replace', index=False)
```
既に情報の多い内容ですし、雑に書かせて頂きます。
さて、DataFrameでの定義時にはテーブルオブジェクトのインスタンスを引数としていませんが・・・
これを動かすと、insertというよりcreate tableな動きをします。
カラム名はDataFrameの行名で作成されます。
用途としては、一時的にDBへ登録、一時テーブルから実際のテーブルへ登録していく、な使い方が良いのかと考えます。

##sqlalchemyについての感想
sqlalchemyの特徴的なことはORMとしても使えますが、

Object RDB Mapper

としてだけではなく、

DataFrame RDB Mapper ※造語です

として使えることが特徴かと考えますし、
Python自体もデータの取り扱いに優れた言語ということもあり、
ORMだけではなく、
DataFrame連携に関する日本語資料が増えるといいなと思いました。
HLSLの関数をShaderGraph用に自動変換する



## 問題点

PhotoShopMath.hlsl や Quaternion.hlsl のようなHLSLのよく使う[汎用関数](https://github.com/supertask/ShaderLibLegacy/blob/main/Packages/jp.supertask.shaderliblegacy/Shader/Lib/PhotoShopMath.hlsl) をShaderGraphで使いたい場合、

```
float3 BlendDarken(float3 baseColor, float3 blendColor)
{
    return min(blendColor, baseColor);
}
```

 の形式の関数を

```
void BlendDarkenShaderGraph_float(float3 baseColor, float3 blendColor, out float3 res)
{
	res = BlendDarken(baseColor, blendColor);
}
```

の関数に毎回変換する（ラップする）のが、すごくめんどくさい問題があります。実際、PhotoShopMath.hlsl などは30関数以上あるので、めっちゃめんどいです。

## 解決法

PhotoShopMath.hlsl や Quaternion.hlslなどの関数をラップする関数をPythonで自動生成して、その関数をShader Graphで使えるようにする。実際の自動生成するPythonプログラムは下の通りです。

```python
#
# Shader functions to ShaderGraph converter
#
#
# How to use
#   1. Create the file "./functions.hlsl"
#   2. Execute `python shaderGraphFunctionGen.py`
#   3. Write the input file path "#inlude ./<functions>.hlsl" on "./output_functions.hlsl"
#
# INPUT (functions.hlsl):
#
# float3 RGBToHSL(float3 color)
#
#
# OUTPUT (output_functions.hlsl):
# 
# void RGBToHSLShaderGraph_float(float3 color, out float3 res)
# {
#	res = RGBToHSL(color);
# }
#

import os
import re
import sys

input_file_path = "./functions.hlsl"
output_file_path = "./output_functions.hlsl"

if not os.path.isfile(input_file_path):
	print("Error: create the file, '%s'." % input_file_path)
	sys.exit(1)

r_func_name = re.compile(r"(\w+) (\w+)\((.*)\)")
r_func_params = re.compile(r"(\w+) (\w+)")

rf = open(input_file_path, "r")
wf = open(output_file_path, "w")

for line in rf:
	line = line.rstrip()

	m = r_func_name.search(line)
	#print(m.group(0))
	func_res_type = m.group(1)
	func_name = m.group(2)
	func_params_type = m.group(3)
	# print("func res, func name: %s, %s" % (func_res_type, func_name))


	res = r_func_params.finditer(func_params_type)
	variables = []
	for m in res:
		# param_type = m.group(1)
		param_name = m.group(2)
		# print("%s, %s" % (param_type, param_name))
		variables.append(param_name)
	func_params = ', '.join(variables)


	output_str = f"""void {func_name}ShaderGraph_float({func_params_type}, out {func_res_type} res)
{{
	res = {func_name}({func_params});
}}"""
	#print(output_str)

	wf.write(output_str + "\n\n")

rf.close()
wf.close()
```

一応、Gistにも載せています。

https://gist.github.com/supertask/ce64a8b0580b8bdebfa2c21c6db443cf


ちなみに、最終的に今回のPythonスクリプトで吐き出した `PhotoShopMath.hlsl` の ShaderGraph版は以下のリンクに載せています。

https://github.com/supertask/ShaderLibURP/blob/main/Packages/jp.supertask.shaderliburp/Shader/Lib/PhotoShopMathSG.hlsl


- [Twitterアカウント](https://twitter.com/supertask_jp)
- [YouTubeアカウント](https://www.youtube.com/c/TasukuTAKAHASHI)
ユーザ名とホームディレクトリ名を変更する方法

# はじめに
適当に付けてしまったユーザ名を変更したいと思ったがユーザ名を変更してもホームディレクトリ名は自動では変わってくれなかった。
ホームディレクトリ名をユーザ名に合わせて変更する方法をメモしておく。

# 環境など
Docker Desktop for Windowsを利用

```powershell
PS C:\Users\mkx> docker run -it centos
```
で試せる。
2021/09/26現在だとCentOS Linux release 8.4.2105が入った。
# 手順（よりスマートな方法）
コメントで紹介いただいた方法です。こっちのほうが速いです。

```bash
[root@a292c8744a99 /]# useradd -m aiueo
[root@a292c8744a99 /]# usermod -md /home/aiueo2 -l aiueo2 aiueo
[root@a292c8744a99 /]# su - aiueo2
[aiueo2@a292c8744a99 ~]$ pwd
/home/aiueo2
```
# 手順（試行錯誤）
## Step 1
まずは`aiueo`というユーザを作成し、その後`aiueo`→`aiueo2`と名前を変更

```bash
[root@c2550a42e062 /]# useradd -m aiueo # ホームディレクトリを作成しながらユーザを追加
[root@c2550a42e062 /]# su - aiueo
[aiueo@c2550a42e062 ~]$ pwd
/home/aiueo
[aiueo@c2550a42e062 ~]$ exit
logout
[root@c2550a42e062 /]# usermod -l aiueo2 aiueo
[root@c2550a42e062 /]# su - aiueo2
Last login: Sun Sep 26 14:23:54 UTC 2021 on pts/0
[aiueo2@c2550a42e062 ~]$ pwd
/home/aiueo
```
ホームディレクトリが`/home/aiueo`のままになっている。ホームディレクトリを`/home/aiueo2`に設定したい。
## Step 2
`/home/aiueo`→`/home/aiueo2`にディレクトリ名を変更

```bash
[aiueo2@c2550a42e062 ~]$ exit
logout
[root@c2550a42e062 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@c2550a42e062 /]# cd home
[root@c2550a42e062 home]# ls
aiueo
[root@c2550a42e062 home]# mv aiueo aiueo2
[root@c2550a42e062 home]# su - aiueo2
Last login: Sun Sep 26 14:24:23 UTC 2021 on pts/0
su: warning: cannot change directory to /home/aiueo: No such file or directory
```
`aiueo2`のホームディレクトリは`/home/aiueo`のままなので`No such file or directory`と怒られる。

## Step 3
`/home/aiueo2`をaiueo2のホームディレクトリに設定する。

```bash
[aiueo2@c2550a42e062 home]$ pwd
/home
[aiueo2@c2550a42e062 home]$ ls
aiueo2
[aiueo2@c2550a42e062 home]$ exit
logout
[root@c2550a42e062 home]# ls
aiueo2
[root@c2550a42e062 home]# usermod -d /home/aiueo2 aiueo2
[root@c2550a42e062 home]# su - aiueo2
Last login: Sun Sep 26 14:24:59 UTC 2021 on pts/0
[aiueo2@c2550a42e062 ~]$ pwd
/home/aiueo2
```
`su - aiueo2`で無事`/home/aiueo2`に入れた。
Emacsでhasktagsを使って関数へジャンプ

## Emacs+Haskellでタグジャンプしたい

どうやらgtagsことGNU globalはHaskellに対応していない

- [GNU Global source code tagging system](https://www.gnu.org/software/global/global.html)

```
 GNU Global has the following features:

    supports 5 languages by built-in parser. (definition and reference)
    C, Yacc, Java, PHP4 and assembly.
    supports 25 languages by Pygments + Universal Ctags plug-in parser. (definition and reference)
    Awk, Dos batch, COBOL, C, C++, C#, Erlang, Fortran, Java, JavaScript, Lisp, Lua, Pascal, Perl, PHP, Python, Ruby, Matlab, OCaml, Scheme, Tcl, TeX, Verilog, Vhdl and Vim. 
```

参考: [ctagとetagについて #8 ](https://github.com/emacs-jp/emacs-jp.github.com/issues/8)


### hasktags

hasktagsというものでEmacs用にタグを生成できるようだ

- [hasktags: Produces ctags "tags" and etags "TAGS" files for Haskell programs](https://hackage.haskell.org/package/hasktags)

- stackでインストール（jsonは依存関係にあったのでインストールしただけ）

```shell
$ stack install hasktags json
```

### タグ生成

- ドキュメントの通り以下のコマンドを実行するとCtagとEtagが両方生成され、Emacsから呼び出されるとEtagが返るみたい

```shell
$ hasktags --both .
```

上記でTAGSファイルができているはずなのでEmacs側で「visit-tags-table」を実行してTAGSファイルを読み込めば、「M-.」で関数へジャンプできる。
辞書型

# 今回の授業資料

<script async class="speakerdeck-embed" data-id="c60b39558a154fca86b23d05221fe6cc" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>

:::note info
また本日の授業のサンプルコード (以下で列挙したコードであるdic_sample.pyと前回記事 array_sample.pyを合算したpython3ファイル) を，まなBOXにアップしています．演習や授業の参考としてご活用ください．
:::

# 辞書型
辞書型とは，**キー : バリュー (値)** の1対1対応で格納するデータ型
例えば，各クラスの学級委員の名簿を作るとしましょう．

|キー|1組|2組|3組|
|:-:|:-:|:-:|:-:|
| **値** |alfred|beck|charlie|

```python3:dic_sample.py
gakkyu_iin={
    '1組':'alfred',
    '2組':'beck',
    '3組':'charlie'}
print(gakkyu_iin)
# → {'1組': 'alfred', '2組': 'beck', '3組': 'charlie'} と出力される
```
---
### 辞書内バリューの書き換え

|キー|1組|2組|3組|
|:-:|:-:|:-:|:-:|
| **値** |anna|beck|charlie|

'1組'の'alfred'を'anna'に変えたいときは **「変数の再代入」** のときと同様， **変数名[キー]**へ新たに代入したい要素(値)を再代入します．

```python3:dic_sample.py
gakkyu_iin['1組']='anna'
print(gakkyu_iin)
# → {'1組': 'anna', '2組': 'beck', '3組': 'charlie'} と出力される
```
---
### 辞書内に新たなキーバリューの追加

|キー|1組|2組|3組|4組|
|:-:|:-:|:-:|:-:|:-:|
| **値** |anna|beck|charlie|daisy|

新たなキーバリューを追加する場合は，**変数名[新たなキー]=新たな値**という形で行う，イメージとしては，新たな変数を宣言し代入するようなイメージ．

```python3:dic_sample.py
gakkyu_iin['4組']='daisy' 
print(gakkyu_iin)
# → {'1組': 'anna', '2組': 'beck', '3組': 'charlie', '4組': 'daisy'} と出力される
```

## 該当演習箇所

**演習5**
[辞書型で自販機データを作ろう](https://qiita.com/hakukikun/items/8f8a1a58d0fe0ecab47a)

その他の演習一覧は，授業ページの [【演習一覧】 成績評価に関わる演習問題](https://qiita.com/hakukikun/items/ce55fef4fa1ffefb4e6d#%E6%BC%94%E7%BF%92%E4%B8%80%E8%A6%A7-%E6%88%90%E7%B8%BE%E8%A9%95%E4%BE%A1%E3%81%AB%E9%96%A2%E3%82%8F%E3%82%8B%E6%BC%94%E7%BF%92%E5%95%8F%E9%A1%8C) を参照してください．
SQL ServerのUPDATE文でJOINするときに別名を使う

## はじめに
SQL ServerでUPDATE文を書くときに、他のテーブルと結合して更新対象のレコードを絞りたい時があると思う。よく使用するのだがJOINや別名の位置を毎回忘れてしまうので、備忘録として残しておく。

## 書き方
SQL Serverの場合は下記でOK。他のDBだとJOIN方法から違ったりするので要注意。

```sql
UPDATE b
SET
    b.[item] = 1
FROM 
    [dbo].[tableB] AS b
INNER JOIN [dbo].[tableA] AS a
ON b.[ID] = a.[ID]
AND a.[num] = 1;
```

## 終わりに
DBごとにSQLが微妙に変わるのがめんどすぎる...
React Native for mac 2021年10月版

備忘録です。

# 準備
色んなバージョンでやってみたのですが2021年10月現在、ちゃんと動いたのは0.63.4でした。
まずは0.63.4で空のプロジェクトを作ります。

## zsh対応はしてる？
最近はbashじゃなくzshが標準になってしまったので、react native環境を作る時、.zshenvにPATHの設定をしておきましょうね。

```.zshenv
export PATH=$PATH:$HOME/.nodebrew/current/bin
```

## プロジェクト作成
```
npx react-native init HogeProj --template react-native@0.63.4
```

## パッケージのインストール
```
cd HogeProj
npx react-native-macos-init
```

## プロジェクト名の修正
app.jsonに記載されているプロジェクト名と、package.jsonに記載されているプロジェクト名が大文字小文字違いでこの状態でビルド・実行するとエラーになります。公式にもよく読むと書いてあります。`ProjectName has not been registered`って。

```app.json
{
  "name": "hogeproj",
  "displayName": "HogeProj"
}
```

```package.json
{
  "name": "hogeproj",
  "version": "0.0.1",
  "private": true,
  "scripts": {
```

package.jsonの"name"とapp.jsonの"name"を一致させておきます。
なんならプロジェクト名を最初から小文字のみにしておくのもいいかと。

## 実行
```
npx react-native run-macos
```
よく聞くマルウェアの11種類

# はじめに
本記事では、ITパスポートで学習した`マルウェア`について簡単に記述します。

# マルウェア
悪意を持って作成された`不正プログラムの総称`です。

`Malicious(悪意のある)`と`Software(ソフトウェア)`の造語です。

## よく聞くマルウェアの一覧

### ウイルス
コンピューターに`侵入`し、プログラムの一部を`書き換え`、内部のファイルに感染して`増殖`します。
`ウイルス単体では存在することができず`、
プログラムの一部を改ざんして入り込み、分身を作って増殖していきます。

### マクロウイルス
ワープロソフトや表計算ソフトなどのアプリケーションのマクロ機能を使用し、
データファイルに感染します。

*マクロとは、`複数の操作をまとめて呼び出す機能`のことです。

### ワーム
寄生するファイルを活用せず、自ら感染を広げる自己増殖機能も持ちます。
また、ネットワークを経由して、蔓延していきます。

自身が増殖して感染させていくことは、`ウイルスと同じ`ですが、
違いとして、`他のプログラムを必要とせず`、単独で存在することが可能なマルウェアです。
ワームには、ネットワークに接続しただけで感染するものも数多く存在します。

### トロイの木馬
有用なソフトウェアに見せかけ、それが配布された後、
`システムの破壊`や`個人情報の搾取`など、悪意のある動作をします。

一見しただけでは問題のない、
画像や文書などのファイル、スマートフォンのアプリなどに偽装して、
デバイスの内部へと侵入します。
外部からの指令によって、そのデバイスを操ることができます。

### スパイウェア
利用者が気づかないうちにインストールされ、
利用者の個人情報や、アクセス情報などを盗むことができます。

### キーロガー
名前で察しがつきそうですが、
キーボードの入力履歴を不正に記録することができます。

### ボット
感染したパソコンが、外部からの指令によって不正に操作され、
特定のサイトへのDos攻撃やスパムメールを行うことができます。

*`Dos攻撃`とは、想定以上の負荷を与え、サービスを妨害することです。

### ランサムウェア
パソコン内のファイルを勝手に暗号化し、
それらを戻すためのパスワードと引き換えに金銭を要求します。

### ルートキット
パソコンへ継続的にリモートアクセスするための`攻撃ツール一式をインストール`するものです。
管理者権限を意味する「ルート」が攻撃対象として狙われるため、被害が大きくなるリスクが高いです。

### ドライブバイダウンロード
利用者がWebサイトを`閲覧しただけ`で、
その利用者が気づかないうちに、
パソコンにマルウェアを`ダウンロードさせて感染`させます。

### MITB攻撃
利用者がWebブラウザを監視し、
利用者がインターネットバンキングのログインに成功すると、
通信を乗っ取ってしまい、サーバーとの通信内容を盗聴したり改ざんしたりします。


以上です。

# 終わりに
対策としては、定期的にウイルスチェックをすることがやはり必要ではないかと思います。
また、別の媒体にバックアップをとっておく事も必要ですね。

明日も頑張ります。

以下参考サイト
[マルウェアとは？ウイルスとの違いは？](https://www.ntt.com/business/services/network/internet-connect/ocn-business/bocn/knowledge/archive_19.html)
[いまさら聞けないIT用語：「マクロ」とは？VBAとの違い、できること、Excelマクロの初歩など基本を解説](https://data.wingarc.com/about-macro-25915)
PowerShellと組み合わせてログを作成、リアルタイムで表示する

# はじめに

UiPathとPowerShellを組み合わせて、ロボットのログをリアルタイムで表示できるようにしました。
（非常に簡素なもので恐縮ですが…）
本日はその仕組み解説をしたいと思います。
アドバイス等あればコメントお願いいたします。

# 仕組み解説

画像多めのため長くなりますがご寛恕ください。

## Main

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/bf435a28-e006-51d7-fbb9-778fab1926f2.png)

ログ開始
ログ中×10
ログ終了

を表示させるロボットです。

PowerShell起動、コマンド実行後にログとして表示させたいメッセージをLogMessageに入れて、
Log Customに引数として渡しています。
実際に今回の要となるのは後述するExecutePowerShellとLogCustomです。

## Execute PowerShell

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/3691760d-51e8-7663-7a3d-5f7bd4d9a981.png)



すでにPowerShellを起動しているかで条件分岐を挟んでいます。
起動確認方法として要素の存在を確認でPowerShellを探しています。
起動している場合はそのウィンドウをアクティベートしコマンド入力を実施、起動していなければ新規にPowerShellを立ち上げます。


### コマンド設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/05277c0c-9478-e5c7-f77d-6b80f3f246c8.png)




クリップボードに下記コマンドを設定、
CTRL+Vのショートカットキーを使ってPowerShellに貼り付け、実行しています。

```

Get-Content -Path  + ファイルパス + -Tail 10 -Wait
```

ファイルパスはコマンド設定の前「ログファイル格納先を作成」部分にてパスを作成しています。
このファイルパスはLogCustom部分でも使用するため、出力の引数として設定しています。
Tailの行数はお好みでOKです。

## LogCustom

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/60918167-6161-6707-5492-5d9d0f8c2744.png)


こちらは本当にシンプルです。
呼び出し元からのメッセージをファイルパス内にあるlogファイルに書き込むだけです。

## 実際に稼働させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/2f8795d7-30a5-f625-8450-3258464c65b5.png)



無事にPowerShellが起動、ログメッセージが出力されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/f228e37d-ca58-5ba5-ae24-1883045d6101.png)

元のログファイルにも同じ内容がばっちり記載されています。

## おわりに

あんなこといいな、できたらいいな…を実現するのは多少泥臭くでもまず作ってみて、それからおいおい美しさや機能性を追求できればいいのかなと思いました。

もっといろいろなことを発信できるよう勉強は続けていきたいと思います。
mysql 8.x系にしたら、Sequel Proでエラーが出た時の対処


1. 既存のSequel Proを削除する
1. 下記のコマンドで、銀色のSequel Proを再インストール

```
brew install homebrew/cask-versions/sequel-pro-nightly --cask
```

銀色のパンケーキのSequel Proがインストールできたら、接続できるようになっているはず。

![スクリーンショット 2021-10-16 23.05.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/019b5023-e53e-3f00-047d-e7bd625e0ce2.png)
create-react-appでejectせず、簡単にwebpack.config.jsの上書きをする方法

## はじめに

* create-react-appで作成したアプリで、build時に生成されるsource mapを`inline`に変更したい
  * cordovaの実機(Andoroid)デバッグで、TypeScriptのソースにブレークポイントを設定してデバッグしたい
* でもejectしたくない

素直にejectすればよいのですが、何かいい方法がないかと検索したところ、[rewire](https://github.com/jhnns/rewire) を使うととても簡単に書き換えが出来ることがわかりました。


:::note info
rewireは、対象のモジュールに特殊なgetter、setterを追加することで、公開されていない変数、関数を取得したり、モジュールにmockを挿入することができるライブラリです。
:::

https://github.com/murasuke/react-change-conf-without-eject

## 前提

create-react-appで作成したプログラム(--template typescript)

## 手順

production buildを行う際、source mapを`inline'(jsソース自体に埋め込む)設定にします。

1. package.jsonの`devDependencies`に`rewire`を追加

```sh
  npm i -D rewire
```

2. package.jsonの`scripts`に、ビルド用スクリプトを追加

```json
 "build-inlinemap": "node ./build.js",
```

3. プロジェクト直下に`build.js`を作成し、下記内容を記載する。

```javascript
const rewire = require('rewire');
const defaults = rewire('react-scripts/scripts/build.js');
const config = defaults.__get__('config');

config.devtool = 'inline-source-map';
```

ビルドスクリプトから`config`オブジェクトを取り出して、`devtool`プロパティーを`inline-source-map`に変更します。(変更前は`cheap-module-source-map`がセットされています)

4. ビルドを行い結果を確認
```
npm run build-inlinemap
```

buildフォルダに`～.js.map` ファイルが生成されません。

![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276579/2f6645db-d8e0-8b9d-1d3f-72704298360e.png)

* build\static\js\main.d7562627.chunk

  sourcemapがファイルの最後に追加(inline-source-map)されていることがわかります。

```javascript
(this["webpackJsonpreact-change-conf-without-eject"]=this["webpackJsonpreact-change-conf-without-eject"]||[]).push([[0],{11:function(e,t,c){"use strict";c.r(t);var n=c(1),r=c.n(n),a=c(3),s=c.n(a),o=(c(8),c.p+"static/media/logo.6ce24c58.svg"),i=(c(9),c(0));var l=function(){return Object(i.jsx)("div",{className:"App",children:Object(i.jsxs)("header",{className:"App-header",children:[Object(i.jsx)("img",{src:o,className:"App-logo",alt:"logo"}),Object(i.jsxs)("p",{children:["Edit ",Object(i.jsx)("code",{children:"src/App.tsx"})," and save to reload."]}),Object(i.jsx)("a",{className:"App-link",href:"https://reactjs.org",target:"_blank",rel:"noopener noreferrer",children:"Learn React"})]})})},d=function(e){e&&e instanceof Function&&c.e(3).then(c.bind(null,12)).then((function(t){var c=t.getCLS,n=t.getFID,r=t.getFCP,a=t.getLCP,s=t.getTTFB;c(e),n(e),r(e),a(e),s(e)}))};s.a.render(Object(i.jsx)(r.a.StrictMode,{children:Object(i.jsx)(l,{})}),document.getElementById("root")),d()},8:function(e,t,c){},9:function(e,t,c){}},[[11,1,2]]]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxvZ28uc3ZnIiwiQXBwLnRzeCIsInJlcG9ydFdlYlZpdGFscy50cyIsImluZGV4LnRzeCJdLCJuYW1lcyI6WyJBcHAiLCJjbGFzc05hbWUiLCJzcmMiLCJsb2dvIiwiYWx0IiwiaHJlZiIs
～～～省略～～～
```

*※ 通常のbuildを行った場合*

`～.js.map` ファイルが生成されます。

![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276579/4ea83c11-27e6-9fbc-c41a-34be7e901f58.png)

sourcemapを生成したくない場合は、環境変数で指定します。
```
GENERATE_SOURCEMAP=false
```

## 参考にしたページ

プロダクションビルドで、コンポーネント名の省略(mangling)を無効にするために
[rewire](https://github.com/jhnns/rewire)を利用しています。


https://marmelab.com/blog/2021/07/22/cra-webpack-no-eject.html
Angular CLI(12.2.10)インストール時のWARNについて

## はじめに

Angular CLIインストール時にWARNが出たので調べてみました。

2021年10月時点

2021/10/20 npmのバージョンに関する部分を削除、タイトルの変更

## Angular CLIのインストール

``` shell
$npm i @angular/cli
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
```

har-validator@5.1.5 と request@2.88.2は廃止予定でAngular CLI側での対処待ち
uuid@3.4.0Angular CLI側での対処待ち
[https://github.com/angular/angular-cli/issues/20994](https://github.com/angular/angular-cli/issues/20994)

## 終わりに

- 開発が進むと対処が大変になる可能性があるので、WARNであっても押さえておきたい。
- 開発環境構築を急かされて後回しにされるような気もする。
Automation 360でOracle接続

# はじめに
Automation 360でOracleを使う場合の小ネタです。
アクション：データベース⇒接続でOracleを選択し実行すると以下のエラーになりました。
![a360oracleErr01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/8bd20a27-1fd4-e093-d102-36abbe6413db.jpeg)

Automation 360はJavaベースだからJDBCですね。ドライバを入手し指定してやる必要がありました。

https://docs.automationanywhere.com/jp-JP/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/commands/cloud-using-database-connect-action.html
![a360oracleJDBC.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/17a770e2-028c-f29a-c595-ef20ae2fd698.jpeg)



# JDBCドライバの入手
OracleのバージョンにあったJDBCドライバを入手します。
Oracle 21cだと

https://www.oracle.com/database/technologies/appdev/jdbc-ucp-21-1-c-downloads.html

以下をダウンロードします。
![oracleJDBCdriver.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/8335eb45-595e-b796-a1a0-553db0144a83.jpeg)

ojdbc11-full.tar.gz というファイルがダウンロードされたら解凍し、ドライバ（ojdbc11.jar）を取り出します。
ここでは、PCの D:\temp\oracle\ojdbc11-full に置きました。
（テストだから適当な場所です。本番ではツール用の共通フォルダかコントロールルームに置いてください）

あとは、接続アクションで、「特定のデータベースを使用」にチェックを入れ、「デスクトップファイル」として、入手した「ojdbc11.jar」の場所を指定します。
![oracleJDBCdriver2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/0b3b5e67-925b-af45-6ca3-a2a351d22696.jpeg)
競プロ典型90問　004 - Cross Sum

#問題

[競プロ典型90問　004 - Cross Sum](https://atcoder.jp/contests/typical90/tasks/typical90_d)

#考察

####全探索を考える
あるA<sub>n,m</sub>に対してのB<sub>n,m</sub>を求める計算量を考えます。
計算量は同じ行と同じ列の数字を全て足すので`H+W`になります。
そして全てのA<sub>n,m</sub>に対してこの計算を行うので`H　× W × (H+W)`となって間に合いません。(制約内の最大値で考えると`1.6*10^10`になってしまう)

####各行と列の合計を先に出して仕舞えば良いのでは
行と列の合計を先に求めることによって
A<sub>n,m</sub>がある行と列の合計を足してA<sub>n,m</sub>を引く計算をするだけでB<sub>n,m</sub>が求められる。

#ソース

~~~python3
H,W = map(int,input().split())

A = [[0]*W for i in range(H)]
hSum = [0] * H
vSum = [0] * W

for i in range(H):
    workA = list(map(int,input().split()))
    for j in range(W):
        vSum[j] += workA[j] 
    hSum[i] = sum(workA)
    A[i] = workA

for i in range(H):
    ans = [0] * W
    for j in range(W):
        ans [j] = hSum[i] + vSum[j] - A[i][j]
    print(" ".join(list(map(str,ans))))
~~~

Python3だとTLEになってしまうようなのでPyPy3で提出しました。
調べてみるとPython3でもできないことはないようですが上位の人でもギリギリみたいなのでPyPy3で提出するのが無難かなと思いました。

#最後に
★2ということですぐに方針はたったのですが、一度コードを書いた時に縦の列と横の列を足しただけのコードを書いてしまい、A<sub>n,m</sub>が2回足されてしまうのを見落としてしまいました。
考察時点で気づけそうなミスには気をつけていきたいですね。
テストで気づけばまだ良いのですが、たまたま入力例がうまくいくパターンだった場合WAしてしまいますし。

次回の記事に関してですが、★6,★7はみてみたところ手も足も出なさそうだったので一度飛ばそうと思っています。次回の記事は006 - Smallest Subsequencになるかと思います。
それでも今までで最高難易度の★5なので心してかかりたいと思います。

以上、最後まで読んでいただきありがとうございました。
IBM Cloud SatelliteでR0048が発生した場合の対処方法

# 事象

IBM Cloud Satelliteのロケーションを作成するとき、構成バックアップ領域でIBM Cloud Object Storageのバケットを``指定する``ことも``指定しない``こともできます。指定しない場合は自動で適切ばバケットがアカウント内に作成されますが、指定する場合は自分であらかじめバケットを作成しておく必要があります。

しかし後者の方法で行った場合、バックアップが取られないという事象がありました。

下図は正常な状態のスクリーンショットです。

<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/b8b00cd7-cf1d-8325-38d4-ee67fc72956f.png">

しかしバックアップが取られてない場合、次のように表示されます。

> R0001: The Satellite location is ready for operations. R0048: The etcd backup for a cluster in your location failed to complete within the past day. If this issue persists, see 'http://ibm.biz/sat-loc-debug#R0048'.

# 対処

まずは素直にメッセージに書かれるとおり下記URLを参照し、環境を確認します。

> http://ibm.biz/sat-loc-debug#R0048

次に、バケットのロケーションを確認してください。結論から言いますが、バケットはクロスリージョナルである必要があり、東京ロケーションの場合は``ap-geo``である必要があります。特にその点はIBM Cloudのドキュメントからは見つけられなかったので（見落としかもしれません）、私はjp-tokでバケットを作成していました。そのせいでバックアップが取られなかったようです。

この場合の対処ですが、残念ながらSatelliteロケーションで使用するバックアップ先のバケットを変更する方法が現在ないため、次の対応をすることで解決しました。

1. 現在のバケットを削除
1. 約15分後に同じ名前でap-geoにバケットを作成
1. しばらく放置

私の場合、これで無事バックアップが取られ、R0048の表示も消えました。

ポイントは、Satelliteのバックアップ用バケットはSatelliteとは名称でしか紐づいていないらしいということと、バケットの名前は削除後約15分再利用できないという点です。

ちなみにもし削除して再作成する直前に、他人が同じ名前のバケットを作ってしまったらどうなるのかは気になるところです。
javascript演習　1日目/３０日

覚えたことたち


```javascript
window.addEventListener('keydown',function(e){
    キーを押した時の動作
  })
```

htmlのaudioタグについて

```javascript

const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);

audio.currentTime = 0;
audio.play();
```

トランジションが終わったらクラスを外したりする

```javascript
keys.forEach(key => key.addEventListener('transitionend',function))
```

e.keyCodeとかも知らなかった

```javascript
window.addEventListener('keydown',function(e){
    キーを押した時の動作
  })
```
Lambda が保留中のままタイムアウトするエラーの原因

# 目的

Lamba のエラー通知を受信したので X-Ray で確認すると、Lambda の状態が「保留中」となったまま実行時間を過ぎてタイムアウトしまいエラーになっていることがありました。その原因がわかったため、ここに記録しておきます。

# 原因

このエラーは、[VPC](https://aws.amazon.com/jp/vpc/) 内のプライベートサブネットに接続する必要がある Lambda に起こるようです。

Lambda が VPC 内のリソースに接続するとき、サブネットごとにネットワークインターフェイス（[ENI](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-eni.html)）が作成されます。これによって Lambda は各 VPC 内のリソースに通信できるようになります。

この Lambda が長期間アクティブでない場合、Lambda はネットワークインターフェイスを回収し、アイドル状態になります。アイドル状態の Lambda を再度アクティブにするには、その Lambda を呼び出します。すると、この呼び出しは失敗し、ネットワークインターフェイスが使用可能になるまで、Lambda は保留（Pending）状態になります。

このとき、ネットワークインターフェースが使用可能になるまでにかかる時間が Lambda の実行時間を超えてしまうと、Lambda は終了し、エラーになるようです。

VPC 接続しない Lambda では、この様なエラーは確認されていません。

# 保留中のままタイムアウトした Lambda の X-Ray

下記は、タイムアウトを 5 秒に設定している Lambda が保留中のまま終了となり、エラーとなった際の X-Ray の表示内容です。

![xray.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450243/931af91e-886a-efe6-999c-974abfa0ce5e.png)

# Lambda の状態に関する情報を取得するコマンド

下記のコマンドで、Lambda API を使用して、関数の状態に関する情報を取得できます。表示される各項目の解説は、[FunctionConfiguration](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/API_FunctionConfiguration.html) を参照してください。

```bash
$ aws lambda get-function-configuration --function-name my-function
{
    "FunctionName": "my-function",
    "FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXX:function:my-function",
    "Runtime": "go1.x",
    "Role": "arn:aws:iam::XXXXXXXX:role/XXXXXXXX",
    "Handler": "XXXXXXXX",
    "CodeSize": 123456789,
    "Description": "",
    "Timeout": 5,
    "MemorySize": 128,
    "LastModified": "2021-10-13T07:46:51.452+0000",
    "CodeSha256": "XXXXXXXX",
    "Version": "$LATEST",
    "VpcConfig": {
        "SubnetIds": [
            "subnet-XXXXXXXX",
            "subnet-XXXXXXXX"
        ],
        "SecurityGroupIds": [
            "sg-XXXXXXXX"
        ],
        "VpcId": "vpc-XXXXXXXX"
    },
    "Environment": {
        "Variables": {
            "XXXXXXXX": "XXXXXXXX",
        }
    },
    "TracingConfig": {
        "Mode": "Active"
    },
    "RevisionId": "XXXXXXXX",
    "State": "Active",
    "LastUpdateStatus": "Successful",
    "PackageType": "Zip"
}
```

以上です。

# 参照した記事一覧

- [【AWS Developer Guide】Lambda function states](https://docs.aws.amazon.com/lambda/latest/dg/functions-states.html)
- [【AWS デベロッパーガイド】Lambda API を使用した関数の状態のモニタリング](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/functions-states.html)
- [【AWS Compute Blog】Coming soon: Expansion of AWS Lambda states to all functions](https://aws.amazon.com/jp/blogs/compute/coming-soon-expansion-of-aws-lambda-states-to-all-functions/)
- [【AWS デベロッパーガイド】FunctionConfiguration](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/API_FunctionConfiguration.html)
Lottie アニメーションの復習 

#今回の内容

<img width="150" alt="6768F835-3B35-4FA7-B1C1-B12A1593089B_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/383bf581-cdc9-af2c-e0a1-32247caff841.jpeg"> 

#コードと簡単解説



```Swift:

import Lottie 

           ~~~~~~~~~~省略~~~~~~~~~~

    override func viewDidLoad() {
        super.viewDidLoad()

        let animationStartButton = {() -> UIButton in
            
            let button = UIButton(frame: CGRect(x: view.frame.maxX / 4, y: view.frame.maxX / 3, width: view.frame.width / 2, height: view.frame.height / 20))
            button.setTitle("Start", for: .normal)
            button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 20)
            button.titleLabel?.textColor = .white
            button.backgroundColor = .systemGreen
            button.layer.cornerRadius = 15.0
            button.layer.shadowOffset = CGSize(width: 5, height: 5)
            button.layer.shadowRadius = 5.0
            button.layer.shadowOpacity = 0.8
            button.addTarget(self, action: #selector(showLottie), for: .touchDown)
            return button
        }()
        view.addSubview(animationStartButton)       
    }
    
    @objc func showLottie(sender:UIButton){
        
        let lottieAnimationView = AnimationView() 
        lottieAnimationView.frame = CGRect(x: view.frame.maxX / 4, y: view.frame.maxY / 4, width: view.frame.width / 2, height: view.frame.width / 2)
        lottieAnimationView.backgroundColor = .clear
        lottieAnimationView.animation = Animation.named("ダウンロードしてきたデータの名前") //表示するアニメーションを設定
        lottieAnimationView.contentMode = .scaleToFill
        lottieAnimationView.loopMode = .loop //繰り返しアニメーションをします 
        lottieAnimationView.play() //アニメーションを開始します
        view.addSubview(lottieAnimationView)
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
            
            lottieAnimationView.removeFromSuperview() //画面から消します
            lottieAnimationView.stop() //アニメーションを停止します 
        }

           ~~~~~~~~~~省略~~~~~~~~~~
```

# 終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
【Laravel】implodeで配列を文字列にして取得

#はじめに
今回は`implode`を使って配列を結合し、文字列としてデータを取得する方法を見てみましょう。

#implode( )

```php:Laravel
$collection = collect([
    ['id' => 1, 'name' => 'Taro'],
    ['id' => 2, 'name' => 'Hanako'],
]);

$collection->implode('name', ':');
```

とすると、`Taro:Hanako`という文字列になります。

値が数字や文字列だけなら

```php:Laravel
collect(['Taro','Hanako'])->implode(':');
```
と簡潔に記述することができます。

#おわりに
implodeとは反対の動きをする、つまり、文字列を配列に変換する`explode`というものもあります。
WebやアプリのUIデザインで超使える「モダンなイラスト」が無料で手に入るサイト３選

#はじめに
**こんな感じのイラストがあるだけで、サイトやアプリがいい雰囲気になると思いませんか？？！**
![スクリーンショット 2021-10-16 16.29.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/e6c8d717-68ff-0dba-1d75-b4ed8c2fc94f.png)

![スクリーンショット 2021-10-16 16.29.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/26cdbca6-0495-2df8-34c6-ba08991a9abd.png)

https://zenn.dev

（👆UIがすげーモダンな雰囲気をかましてるZennより）

![スクリーンショット 2021-10-16 16.38.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/a41967dc-6ddf-4071-8e9a-c1dc46bb6a55.png)

![スクリーンショット 2021-10-16 16.39.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/aabf2ca3-1da9-e8bb-4b18-8ad941ebeebf.png)


https://eatplayworks.com/#

（👆UIがすげーモダンな雰囲気をかましてるeat play worksより）

###でもこーゆー感じのイラストってどこで手に入るのでしょうか？（かつ無料で）

日本で一番有名であろうフリー画像「[いらすとや](http://www.irasutoya.com)」とは完全に路線が違います。

もっと言うと、どこか海外っぽい雰囲気というか。。（あんまりこーゆー言い方は好きじゃないけど。。。）
なんかクール、と感じる人は多いのではないでしょうか？

今回はこんな感じのモダンなイラストが無料で手に入るサイトをご紹介！

#freepik

https://www.freepik.com/search?dates=any&format=search&page=1&query=Illustrations&selection=1&sort=popular&type=vector

![スクリーンショット 2021-10-16 17.19.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/a98af004-ab78-7485-237b-1a144af3cac0.png)
「Free」にチェックを入れて、検索欄に「Illustrations」を入れるとOK！上記リンクでは既に入ってるかと。

何やらみたことありそうなイラストがずらっと並んでますね〜:smile:

検索キーワードを追加したいときは、Illustrationsの後に半角スペースで開けた後に好きな英単語を入れると絞り込めます！

欲しいイラストを選択して
Download→Free download

![スクリーンショット 2021-10-16 17.24.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/97d2e981-caf7-c466-f47a-d62303dacf98.png)


無料のやつは1日にダウンロードできる上限があるので（確か5個くらいが上限？）、たくさん欲しい場合は数日に分けてダウンロードしましょう。

#undraw

https://undraw.co/illustrations

![スクリーンショット 2021-10-16 17.26.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/b70c8b27-2a43-11a6-8531-2a7b3a3d9553.png)

undrawは統一感のあるイラストを揃えることができます！

右上のカラーパネルを押すと、イラスト全てのテーマカラーが変化します。これはすごい:heart_eyes:
![スクリーンショット 2021-10-16 17.27.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/93905bc8-905f-6645-c9f6-e187f458fd97.png)

**サイトやアプリのテーマに合わせて、イラストのカラーも親和性を持たせることが可能となります！**

めちゃくちゃ数が多いので、キーワードで検索したい場合はカラーパネル横の「Search」を押して検索欄を表示させましょう。

#manypixels

https://www.manypixels.co/gallery

![スクリーンショット 2021-10-16 17.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/9fda0e34-b373-e7f1-6486-7232ae71c66c.png)


使い方はほぼ「undraw」と同じ。

少し違う点と言えば、manypixelsの方はもう少し「いらすとや」に近い可愛さのあるイラストが含まれてますw

![スクリーンショット 2021-10-16 21.49.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/019d2165-252c-e555-1ba4-7f8619aa6056.png)

![スクリーンショット 2021-10-16 21.49.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/8d73840e-f712-b4a0-4b5b-74dc2b50fa28.png)


#利用例
ちなみに僕は自分の運営してるアプリで、こんな感じで使ってます〜

![スクリーンショット 2021-10-16 21.44.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/bda29137-3302-285f-6e34-a45f50fde968.png)

**イラストが入るだけでいい感じのログイン画面に！**

![スクリーンショット 2021-10-16 21.44.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/f5681c97-12ca-9df0-eed8-7d310a852a15.png)
VSCode や Azure DevOps でガントチャート

# 目的

UML とかだけじゃなく、ガントチャートまで描けるのねという備忘録

https://mermaid-js.github.io/mermaid/#/gantt?id=gantt-diagrams

# ガントチャートの利用例
```markdown:ガントチャート例
::: mermaid
gantt
    title ガントチャート例
    %% こんな感じで作れる
    dateFormat  YYYY-MM-DD
    section 営業
    見積      : done,       Sales1, , 1d
    受注      : active,       Sales2, after Sales1, 1d
    section 営業支援
    仕様調整      :        admin1, after it3, 1d
    section 設計
    仕様確認      :        it3, after Sales2, 1d
    概要設計      :        it4, after Sales2, 1d
    構成設計: it5, after it4, 1d
    IF設計: it6, after it5, 1d
    レビュー: it7, after mind1, 1d
    section 実装
    詳細設計      :        mind1, after it6, 1d
:::
```
## VS Codeでの表示例
mermaid 表示は以下を利用

https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/7025e543-aa73-7cc3-8b7c-0a8a62cad065.png)

## Azure DevOpsでの表示例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/efccf199-c315-1fe8-acbb-734f957d7399.png)
Pythonで正規分布と戯れる

# はじめに
E資格の次は統計検定の合格を！ということで、早速Pythonで統計について理解を深めていきたい。そこでまずは正規分布と戯れてみた。

# 正規分布とは
以下の確率密度関数で定義される分布である。

$$ f(x) = \frac{1}{\sqrt{2πσ^2}}  \exp\left(-\frac{(x-u)^2}{2σ^2}\right)  $$

# 確率密度関数をPythonで書いてみよう。
腐るほど、いろんな人がやったネタであるが、自分で書いてみよう。
確率変数Xと平均と分散を受け取って確率を返すというもの。
numpyなので複数のXに対して計算できちゃうぞ。

```python
# 正規分布関数
def normal(x, u, v):
    ret = 1 / np.sqrt(2 * np.pi * v) * np.exp(-(x-u)**2/(2*v))
    return ret
```

#描画してみよう
先ほどの関数を使って平均0、分散1の標準正規分布を書いてみよう。

``` python
# matplotlibで描画
x = np.linspace(-5, 5,100)
y = normal(x, 0, 1)
fig = plt.figure(figsize=(5,5))
ax = fig.add_subplot(1,1,1)
ax.plot(x, y)
```

するとこんな感じ。もう腐るほどみた図だと思う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/c23d818d-f1a3-bbd8-236a-1e52f1d0e12e.png)

#モンテカルロ法により面積を求めてみよう
さて、確率密度関数というのは、-∞から∞まで積分すると1になるはずだ。
積分は大変なので、今回これをモンテカルロ法により求めてみよう。

モンテカルロ法とは、確率変数のサンプリングをコンピューター上で行うことで、数学的な問題を数値的に解く手法である。

今回は一様分布を用いる。
百聞は一見に如かずで、まずはXについて[-5, 5]、Yについて[0, 0.4]にの一様分布に従うX, Yを生成・プロットし、その上に先ほどの確率密度関数を重ねてみよう。

```python
# -5～5までの間で一様にXを生成
randomX = -5 + np.random.rand(30000) * 10

# 0～0.4までの間で一様にYを生成
randomY = np.random.rand(30000) * 0.4

fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(1,1,1)
ax.scatter(randomX, randomY)
ax.plot(x, y, c="r")
```

そうするとこんなプロットが得られるはずだ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/8b425b50-1dac-e6d8-3586-ca7980052709.png)


今、関数の下側の面積を求めたいわけだから、ランダムに領域内にプロットされた点の内、確率密度関数より下側にある点の割合を求め、領域全体面積(10 * 0.4)を掛ければよい。
※ -5～5の範囲外の確率はほぼ0近いので無視していることに注意してほしい。

コードは下の通りである。

```python
upperCount = 0 #上にあるか
lowerCount = 0 #下にあるか
for i, (randomX_tmp, randomY_tmp) in enumerate(zip(randomX, randomY)):
    normalY = normal(randomX_tmp, 0, 1)
    if randomY_tmp < normalY:
        lowerCount += 1
    else:
        upperCount += 1
        
print(lowerCount, upperCount, (lowerCount / len(randomX)) * 10 * 0.4)
```

計算すると1.008とほぼ1に近い値が得られた。

```
562 22439 1.0082666666666666
```

# おわりに
次回からは様々な分布を取り扱っていきたい。
統計学の本は非常に抽象的に記載されているので、Pythonを使って具体的なイメージに落とし込んでいきたい。乞うご期待。
docker-composeでPostgresとpgAdminコンテナを作成・起動 

最近になってサーバー上でDockerを使うようになり，色々調べたのでメモ．
複数のコンテナをまとめて管理したい場合は`docker-compose`を使う．ここではPostgresとpgAdminコンテナをまとめて作成・起動する．

とりあえず以下が設定ファイルの例

```yaml:docker-compose.yml
version: "3"
services:
  postgres:
    image: postgres:latest
    container_name: "my_postgres"
    restart: always
    environment:
      POSTGRES_USER: user_name
      POSTGRES_PASSWORD: password
      POSTGRES_DB: db_name
      LANG: ja_JP.UTF-8
      TZ: "Aisa/Tokyo"
    ports: 
      - "5432:5432"
    volumes: 
      - volume_postgres:/var/lib/postgresql/data

  pgadmin:
    image: dpage/pgadmin4
    container_name: "my_pgadmin4"
    restart: always
    ports: 
      - 81:80
      - 444:443
    environment:
      PGADMIN_DEFAULT_EMAIL: my_email
      PGADMIN_DEFAULT_PASSWORD: password
    volumes:
      - volume_pgadmin:/var/lib/pgadming
    depends_on:
      - postgres

volumes:
  volume_pg:
  volume_pgadmin:

```
 

上記ファイルがあるディレクトリで以下のコマンドを打つことでimageのDL，コンテナのbuild，起動を全てやってくれる．`-d`をつけないとデタッチせずにフォアグラウンドでコンテナが起動する．buildするときにキャッシュを使いたくない場合は`docker-compose build --no-cache`とするらしい．
別途`ps`と`exec`でコンテナの稼働状況を確認したり，コンテナに入ったりできる．

```sh
docker-compose up -d # imageのDL，コンテナのbuild，起動

docker-compose ps # docker-composeで起動したコンテナの稼働状況を確認
docker-compose exec service_name /bin/bash # コンテナ内に入る
```



### 学んだこと
- YMLファイルで`-`がついてるのは配列の値，ついてないのは文字列として処理される．
- Postgresで日本語を使えるようにしたい場合，LANGにUTF-8を指定しておけば良い模様（コンテナ内でpsqlを使ってログインするとロケール設定のエラーが出る... ただしテーブルにデータを日本語で保存できた)
- トップレベルの`volumes`以下で指定されたVolumeはパブリック扱いになって外部のコンテナからもアクセスできるらしい．Webアプリからアクセスするならここで指定する必要がある．
- `docker-compose exec service_name /bin/bash` でコンテナにアクセスできる．`service_name`はトップレベルの`services`直下に書いた値（例ではpostgresかpgadmin)．その下のcontainer_nameを書いてたから動かなくてはまった．



色々やってみてPostgresコンテナにはアクセスできて使えるようになった．pgAdminコンテナはまた後で使ってみたい．


### ついでに確認したこと
- railsで本番環境のDBコンソールに入るには`rails dbconsole --environment=production`
- railsで本番環境のDBテーブルにseedデータを入れるには`rails db:migrate RAILS_ENV=production`
- psqlでデータベースを切り替えるには`\c database_name`