OmniAICreator/Qiita-1.07M huggingface dataset:
正方形スキンメッシュスプライトを動かす

1枚絵スプライトを少しだけアニメーションさせて、単純な動きを付けたいことはありませんか？

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/7e24a069-573a-5224-3892-dba43bb8acce.gif)

[スプライトにボーンを入れて動かす方法](https://qiita.com/ELIXIR/items/150374b29e249d8dca27)も公式に用意されているのですが、これが結構重くて、大量のオブジェクトをちょっとアニメーションさせる、という用途にはちょっと向いていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/4c39b2e7-5e99-e2a3-a90f-366f32255c12.png)

そこで、四角いスプライトを2x2-8x8分割したメッシュとしてアニメーションさせるアセットを作りました。
実際にはスプライトではなく、メッシュにスプライトと同じようなシェーダーをあてられるようにしたものです。
メッシュに簡単なボーンを入れてあるだけなので、アニメーションを追加するのも簡単です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/db298e9f-1efe-7381-4e1e-f1b7b04d279c.png)

UDP用やビルトインシェーダー用、Light2Dに反応するもタイプや通常のライトに反応するタイプなどいろいろなバリエーションを用意しています。

アセットはこちら↓です。

[Quad-Mesh Sprite Animation](https://assetstore.unity.com/packages/2d/characters/quad-mesh-sprite-animation-218582)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/a421b869-916c-a9cf-9a4e-438a461dac4d.png)
Chromebookの表示解像度（倍率）を自由に設定する

# はじめに
Chromebookは設定にて表示解像度の倍率を設定できますが、
下記のような固定の倍率しか選択できず、ちょうどいい解像度に設定できません。

▼1920x1080（16:9）14.0インチの場合
| 倍率 | 長辺 | 短辺 | 備考 | （内部的な倍率の値） |
| -: | -: | -: | :- | :- |
| 70% | 2194 | 1234 | | 0.699999988079071 |
| 80% | 1920 | 1080 | ネイティブ | 0.800000011920929 |
| 85% | 1807 | 1016 | | 0.8500000238418579 |
| 90% | 1707 | 960 | | 0.8999999761581421 |
| 95% | 1617 | 909 | | 0.949999988079071 |
| 100% | 1536 | 864 | デフォルト | 1 |
| 110% | 1396 | 785 | | 1.100000023841858 |
| 120% | 1280 | 720 | | 1.2000000476837158 |
| 130% | 1182 | 665 | | 1.2999999523162842 |

▼2400x1600（3:2）12.3インチの場合
| 倍率 | 長辺 | 短辺 | 備考 | （内部的な倍率の値） |
| -: | -: | -: | :- | :- |
| 50% | 2400 | 1600 | ネイティブ | 0.5 |
| 60% | 2000 | 1333 | | 0.6000000238418579 |
| 70% | 1714 | 1143 | | 0.699999988079071 |
| 80% | 1500 | 1000 | | 0.800000011920929 |
| 90% | 1333 | 889 | | 0.8999999761581421 |
| 100% | 1200 | 800 | デフォルト | 1 |
| 110% | 1091 | 727 | | 1.100000023841858 |
| 125% | 960 | 640 | | 1.25 |
| 150% | 800 | 533 | | 1.5 |

これを2560x1440(16:9)や1920x1280(3:2)等のちょうどいい解像度、
任意の倍率に設定する方法を紹介します。



# 方法
まず、ディスプレイの設定画面を開きます。
![Screenshot 2022-05-01 17.20.37_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/9222f3bc-04ef-4dd5-a364-af1f58c4346f.png)
空白部分を右クリックし、メニューの1番下にある「検証」を押下します。
![2_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/76435c56-5224-7619-0152-24d30b2d7624.png)
表示された検証ツール（DevTools）の**コンソール**タブを開きます。
![Screenshot_2022-05-01_17_46_54_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/9b1a4020-6f1f-2390-f6b9-4870e8f48936.png)
`chrome.system.display.getInfo()`を入力してEnterを押し、▶をクリックして`PromiseResult`の`0`を開きます。
（外部ディスプレイを接続している場合は`1`等も表示されるため、どのディスプレイがどの番号か`name`や現在の倍率等で確認して下さい。）
![Screenshot_2022-05-01_17_58_28_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/c3eb4ecf-ba53-d138-d89e-60e88a56c3fd.png)
 → `id`をコピーします。

下記のコマンドに倍率と`id`をセットして実行すれば、表示倍率が変更されます。
`const properties = {displayZoomFactor: [倍率]}; chrome.system.display.setDisplayProperties("[id]", properties, null);`

例：`const properties = {displayZoomFactor: 0.6}; chrome.system.display.setDisplayProperties("1881xxxxxxxx4736", properties, null);`
※倍率の計算は1536（デフォルト値） / 2560（設定したい解像度） = 0.6（倍率）

▼70%（2194x1234）
![Screenshot_2022-05-02_13_42_38_c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/7f0468b6-1afc-33d4-ccd4-df35671d9c5f.png)
▼60%（2560x1440）※画面上は70%のままだが表示サイズ自体は変化している
![Screenshot_2022-05-02_13_43_38_d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/46a8c45a-5855-3cc3-2084-076b7219d487.png)

標準で選択できる倍率より小さい倍率を設定することが出来ました。


# 参考
+ [[M67] Set any resolution on your Chromebook! : chromeos](https://www.reddit.com/r/chromeos/comments/8ij22k/m67_set_any_resolution_on_your_chromebook/)
+ [Any new way of setting custom resolution? : chromeos](https://www.reddit.com/r/chromeos/comments/paknfq/any_new_way_of_setting_custom_resolution/)



バージョン: 101.0.4951.32（Official Build）beta （64 ビット）にて確認



以上
Javascript_括弧の使い方メモ

# はじめに
Javascriptで配列やオブジェクトを作る際に`[]`や`{}`を用いるがどれがどれなのかわからなくなりそうなのでメモ

## 内容
```javascript:配列は[]を使う
const animals = ["dog","cat","rabit"]; 
```

```javascript:オブジェクトは{}を使う
const animals = {name:"dog",age:12};
```

```javascript:console.logの出力時にも{}をつかう
console.log(`${animals.name}はかわいい`);
```

自然にかけるように書いて覚える
【メモ】キャッシュについて



プログラミング初心者が、キャッシュについて学んだことをメモとしてまとめたものです。
もし間違いなどありましたら、ご指摘いただけると幸いです。

# レジスタとキャッシュとメモリ

- レジスタは、演算器の横に付いてる一時的な記憶域
X byte * 32~512本 (xは32bitとか64bitとか128bitとか）

- キャッシュは、演算器より外にあるKB~MBオーダの一時保存領域
これを超えたらメモリに行く

- キャッシュは、Lxキャッシュがある(xは、1~4)

L2キャッシュには、昔の計算結果(c += a + b)が入る。
L1キャッシュには、計算結果の答えが入ったcが入る。

コアがたくさん存在するときにL3が必要になってくる。
２コア目以降は、１コア目にある変数の値をL2(?)まで取っていかなくても、L3に置いてあるから取ってくることができる。

最近ではL4キャッシュも存在する。
64コアとかになってくると、L3キャッシュで渋滞が起こるため、L4キャッシュを足している。


![Screen Shot 2022-02-04 at 21.45.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224085/5a40f32a-ebc9-a4ad-9c13-070e23381fcf.png)

上の画像は以下のサイトより引用
https://www.hardwaretimes.com/future-amd-ryzen-and-epyc-cpus-may-feature-a-level-4-cache-l4/


## キャッシュコヒーレンシ

計算機は、1秒間に30億回計算をやっても、バグが起こらない。それはキャッシュコヒーレンシと関係しているようである。

例えば、４番コアが計算結果cが欲しいといった場合、１番コアがL3のcを書き換えて、それをコア４が取ってくる。従って、L3が共有されたメモリリソースになっている（？）。
システム全体で共有リソースを更新して、キャッシュの内容に一貫性を保つようになっている。

どのようにキャッシュの内容を更新していくかなどを考えて、CPUの設計書を作っている会社がARMである。

https://ja.wikipedia.org/wiki/キャッシュコヒーレンシ#:~:text=キャッシュコヒーレンシ（英%3A%20cache%20coherency,不一致という問題が生じる%E3%80%82
【ServiceNow 】カタログタスクを作成するフローを複数のカタログアイテムで処理する

最近私の周りでワークフローの開発工数を削減できないかという話が持ち上がっています。

新規でワークフローを作成するとなると、基本的にはカタログアイテムとフローを作成しカタログアイテムにフローを紐づけますね。

【イメージ】
<img width="400" alt="画像1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/306169bd-3474-30d6-3280-1c0fb3eb5b14.png">

フローの構成が全く異なる場合は都度作成する必要がありますが、
ほとんど似た構成の場合にフローを使い回すことができたら開発工数を**カタログアイテムの作成分だけ**で済ますことができます。

【イメージ】
<img width="400" alt="画像2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/57679b7f-efe8-26c1-fe86-5d21a363608f.png">

承認フローでは何となくフローを使い回せると想像がつきますが、
カタログタスクを作成するアクションを入れた場合にどのように処理が行われるのか気になり検証してみました。

## フローを複数のカタログアイテムで処理する

フローを複数のカタログアイテムで処理すると、どのような動きをするのか見ていきたいと思います。

複数のカタログアイテムに共通の変数を紐づけられる「**変数セット**」を使用します。
カタログアイテムの構成は以下です。
<img width="550" alt="画像3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/525c3e93-538d-4c16-062d-20bb74e89817.png">

フローではカタログタスクに**catalogA**の変数**VariableSetA_1**が表示されるように設定します。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/40cd7028-4b94-61bb-48c0-a6bf67999924.png)

**catalogA**でフローを処理していきます。
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/237f1559-511b-982d-d2ca-6610de55a9e8.png)

カタログタスクが作成されました。
変数セットに作成した変数**VariableSetA_1**が表示されています。
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/207a48d6-ce8f-9798-ccf0-32e3e0f94633.png)

続いて**catalogB**で処理していきます。
![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/22fbaac0-e029-6e6a-1b27-53ec8f92918d.png)

こちらもカタログタスクが作成されました。
catalogAの時と同じように変数セットの変数**VariableSetA_1**が表示されています。
![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/b71c4952-ab1a-82a6-ce0e-335322fd87f0.png)

「Create Catalog Task」で選択していないカタログアイテムでフローを処理してもカタログタスクが作成されました。
また変数セットの変数を使用することで、複数のカタログアイテムから同じ構成のカタログタスクを作成できることもわかりました。

## フローを複数のカタログアイテムで処理する（変数だけを使用）
変数セットを使用しない場合にはどのように処理が行われるか検証してみました。
カタログアイテムの構成は以下です。
<img width="300" alt="画像9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/9c96dd53-3dc4-bc03-8a4d-e33f5b3623cb.png">

カタログタスクには**catalogA**の変数**catalogA_1**を表示するように設定します。
![画像10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/811ac643-fbf3-9e2c-725d-9f2d5efbbe97.png)


**catalogA**でフローを処理してみます。
![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/5badf929-11b4-dd12-2228-d82e755c43b9.png)

変数catalogA_1がカタログタスクに表示されています。
![画像12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/ea9227fe-1568-e144-37a2-06faaecdcf9f.png)


続いて**catalogB**で処理していきます。
![画像13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/ba4eb4a2-b4cd-7922-b114-40bd86d1fd82.png)

フローのアクションで選択した変数が存在しないため、カタログタスクは作成されましたが変数は何も表示されませんでした。
![画像14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/0acd62df-4c7d-addd-4477-165daf1ff794.png)

## おわりに
今回は変数セットの「複数のカタログアイテムで変数を共通利用する」という特性を利用してフローの共通化を図りました。

ServiceNowではノーコード開発、市民開発といった従来の開発手法よりも効率的な開発を実現することができる為、
今回ご紹介した対応以外にも様々なやり方があると思いますので、当社も継続検討していきます。
juliaでdocker環境を簡単に構築したい

## juliaで自作パッケージ用のdockerを作成

juliaでDockerfileなどを作成にあたり、参考にした記事やメモを残しておきます。

こちらを参考にしました。
https://github.com/terasakisatoshi/MyTemplate.jl

とりあえず、上の記事のREADMEに書いてあることをそのまま実行します。
すると、DockerFileができるので、それをそのまま自作のパッケージ用に書き換えれば良いです。

例えば、私の場合、すでに自作パッケージのQCMaterialNew（https://github.com/sakurairihito/QCMaterialNew）
が存在して、それのdockerfileなどを用意したいということでした。

ですので、上記で作成したそのままのDockerfileではなく、以下のような変更を行えば良いということになります。

```
RUN mkdir -p /workspace/YourPkg.jl/src && echo "module QCMaterial end" > /workspace/YourPkg.jl/src/QCMaterial.jl
COPY ./Project.toml /workspace/YourPkg.jl
```

上でやっていることは、/workspace/YourPkg.jl/srcというディレクトリを作成し、そこにQCMaterial.jlというファイルを作り、そこに``module QCMaterial end``を書き込むということになります。

あとは、ご自身のパッケージに必要なファイルなどをインストールをすれば良いです。


### 共用のマシンでドッカー環境を構築する場合

```
ERROR: SystemError: opening file "/workspace/YourPkg.jl/Manifest.toml": Permission denied
```

共用のマシンでやる環境だと上記のエラーが発生しました。
これは、ホスト側のUIDとコンテナ内のUIDを統一すれば解決すると思われます。

ワークステーション(WS)の中でVS code + SSH + Dockerで作業ディレクトリをmountしたとき、ちゃんとUID/GIDが適切な値に変更されるようになりました。

その際に、WSの.bashrcに

```
mkdir -p /tmp/$USER
export TMPDIR=/tmp/$USER
```

を記入すれば一時的なディレクトリを作られて問題が回避できます。
詳細はこちらを参考：
https://github.com/microsoft/vscode-remote-release/issues/2347


### 余談：OpenMPIもコンテナ内でできた

ubuntsで、ドッカーコンテナ内で、MPI並列も実行できました。
ちなみにMacとかだとドッカーで使用できるリソースは制限されますが、Ubuntsだとその制限はないようです。

## まとめ
手軽にdocker環境を構築できました。

## 参考
https://github.com/terasakisatoshi/MyTemplate.jl
【メモ】juliaの@doc, @eval, @showの用例

# juliaのマクロについて

マクロとはメタプログラミングのことであり、プログラミングをプログラミングするみたいな感じである。
本記事はいくつかのマクロの例を実行してみることで、それらの理解を深めることが目的です。

なお、[juliaのメタプログラミンのドキュメント](https://docs.julialang.org/en/v1/manual/metaprogramming/)に詳細が載っています。


## @doc

@docは、何か値と紐づいたストリングを返すマクロである。

@docのコードを簡単な例で確認する。なお、SciPy.jlのsrcに出てくる@docに関するコードを参照しています。https://github.com/AtsushiSakai/SciPy.jl/blob/master/src/util.jl

```julia
@doc "hogehoge" g = sin(1)　# g
```

実行

```julia
g #0.8414709848078965
@eval g　#上と同じ
@doc g　#hogehoge
```

ここで、@docをしたときに、裏でどのように実行されているかをみるには以下を実行する

```julia
@macroexpand @doc g
# :((Base.Docs.doc)((Base.Docs.Binding)(Main, :g)))
```




実際に、以下を実行すると`@doc g `と同じ結果が返ってくることがわかる。

```julia
eval(:((Base.Docs.doc)((Base.Docs.Binding)(Main, :g))))
```

この例を通して、@docによって、g(ここではsin関数)に紐づいた"hogehoge"という文字列を返すことがわかった。


## @show
これは、よく使う人も多いかもしれないが、printlnの強化版みたいなイメージである
先ほどの続きで確かめる。

```julia
@macroexpand g　# :g
eval(:g) # 0.8414709848078965
@show g
# g = 0.8414709848078965
# 0.8414709848078965
```

```julia
@macroexpand @show g
```
@macroexpandを使えば、@showがどのようなコードなのかみることができ、確かにprintlnとvalueを返していることがなんとなくわかる。

```
quote
    Base.println("g = ", Base.repr(begin
                #= show.jl:1047 =#
                local var"#30#value" = g
            end))
    var"#30#value"
end
```


## @eval

与えられた関数とその引数を与えると、評価してくれるマクロになる。

```julia
a = zeros(4)

for (i, f) in enumerate([:sin, :cos, :tan, :log])
       @eval $a[$i] = $(f)(1)
       end

@assert a == [sin(1), cos(1), tan(1), log(1)]

```

```julia
b = zeros(4)
for (i, f) in enumerate([:sin, :cos, :tan, :log])
       @eval $b[$i] = $(f)($i)
       end

@assert b == [sin(1), cos(2), tan(3), log(4)] #OK
@assert b == [sin(1), cos(2), tan(3), log(100)] "NOOOOOO!" #これはエラー
```


## おまけ：Exprとeval() 


```julia
Meta.parse("1+1") # :(1 + 1)
Meta.parse("1+1") |> typeof # Expr
```



```julia
ex = :(1+1)
ex |> dump　# データ型の構造を取得
```

結果

```
Expr
  head: Symbol call
  args: Array{Any}((3,))
    1: Symbol +
    2: Int64 1
    3: Int64 1
```

ex.args, ex.headを実行すると、それぞれの値をとってこれる。

ここでExprの働きを詳しくみる。

```Julia
Expr(:call, :+, 1,2,3) #:(1 + 2 + 3)

Expr(:call, :+, 1,2,3) == :(1+2+3) #と同じ

Expr(:call, :+, 1,2,3) == :(1+2+3) == Meta.parse("1+2+3") #と同じ
```

最後にexのargsの値を変更することも可能である

```Julia
ex.args[end] = -1
ex # :(1 + -1)

eval(ex) #0
```


Expr は関数 eval() で評価することができる


# まとめ
juliaのいろいろなマクロの例を見て理解を深めることができた。
パーセントエンコーディング

常に間違えるのでメモ。パーセントエンコーディングには二種類ある。普通のやつと、空白を "+" に変換する application/x-www-form-urlencoded。application/x-www-form-urlencoded は記憶から抹消するべき。実際に URL のクエリ部分に application/x-www-form-urlencoded を使うとエラーを出す実装も存在するので、歴史的な意味しか無い混乱を生むだけの悪しき存在としか思えない。

* 普通のやつ
    * 例: "Hello 1+1!" を "Hello%201%2B1%21" と書く。
    * 用途: URL のクエリ以外
    * 仕様: https://url.spec.whatwg.org/#percent-encoded-bytes
    * python: quote("Hello 1+1!")
    * javascript: encodeURIComponent("Hello 1+1!")
* application/x-www-form-urlencoded
    * "Hello World!" を "Hello+1%2B1%21" と書く。
    * 用途: URL のクエリ部分や POST の body
    * 仕様: https://url.spec.whatwg.org/#urlencoded-parsing
        * in many ways an aberrant monstrosity と書かれている。。。
    * python: quote_plus("Hello World!")
    * javascript: 存在しない???
        * encodeURI("Hello 1+1!") は 'Hello%201+1!' となる (+ が変換されない)
Almalinuxで自動アップデートにした話

年度末にAlmalinuxに変えてから更新すること多いんだけど？
CentOS8のときは前任者が自動アップデートにしていたみたいだけど、Almalinuxになってその設定が消えた？っぽい。
ここ最近毎日アプデしろしろとメールがうるさいので、この期に自動アップデートに変えることにした。

# dnf-automaticの導入と自動更新設定
ここ（https://installati.one/almalinux/8/dnf-automatic/
とか
ここ（https://ex1.m-yabe.com/archives/6276
とか
ここ（https://aulta.co.jp/archives/7685
を参考にしたところ、dnf-automaticというのを入れれば自動アプデしてくれるみたい。

筆者はdnfコマンドがなぜか効かなかったのでyumでインストールすることに。(dnfでもyumでインストールできるんか）
あと筆者はrootで実行()しているので、rootじゃない人はsudoで実行してください。
```
yum install dnf-automatic
```

インストールされると/etc以下のディレクトリに/dnf/automatic.confというconfファイルができるので、ここで設定をいじる。

`vi /etc/dnf/automatic.conf`でファイルに入り、
[commands]以下の
download_updates とapply_updateをyesにする。

アップデートの確認でメールを受け取りたい場合は
ここ（https://ex1.m-yabe.com/archives/6276
を参考に[emitters]と[command_email]も設定した方がよい。


# サービスの自動起動と実行タイミングの設定
これだけだとdnf-automaticは動いてないので、以下のコマンドで自動起動に登録&サービスを起動する。

自動起動に登録する。
```
systemctl enable --now dnf-automatic.timer
```

サービスを起動する。
```
systemctl start dnf-automatic.timer
```

いつ実行するかを設定したい場合は
```
cat /etc/systemd/system/multi-user.target.wants/dnf-automatic.timer
```
か、
```
cat /etc/systemd/system/timers.target.wants/dnf-automatic.timer
```
を確認するといい。



ここの違いはよくわからないけど、multi-userの場合はファイル内の[Timer]のところが
```
OnBootSec=1h
OnUnitInactiveSec=1d
RandomizedDelaySec=5m
AccuracySec=1s
```
となっていて、これだとtimer起動して1時間後に実行→毎日同じ時間に起動される。

で、timersの場合はファイル内の[Timer]のところが
```
OnCalendar=*-*-* 6:00
RandomizedDelaySec=60m
Persistent=true
```
となっていて、毎日6時に起動するよ、となっている。

よくわからんけど、dnf-automaticをenableにしたときに出るアドレスと対応するところを確認してください。

こんな感じでした。
検証用AWSアカウントでGuardDutyと闘う話 〜S3バケット編〜

# はじめに

2021年某日、転職した会社で検証用のAWSアカウントを自由に使っていいとのことだったので、自分のリソースをTerraformで色々作ってみることにした。
VPCから始めてEC2やS3等よく使うものを自分の検証用に作成してみた。

少し空気がひんやりしてきた秋晴れのある日、知らない人からSlackのDMが来た。
どうやらインシデントレスポンスの人らしい。

海外の人なので英語でのメッセージで責め立てられたが、要約するとこう↓いうことらしい

> お前のS3バケットがパブリックアクセスになってるからアクセス制限させとくンだわ

あれ？パブリックアクセス許可したっけ？そんなんよく見つけたよね？そもそもどうやって俺のバケットだってわかったの？

# そもそもTerraformを使った理由

数年に1回くらいの頻度で転職するので、その都度検証用AWSアカウントで自分のリソースをコンソールから作っていたら、退職するときに1個1個削除していくのがめんどくさかったから、一括で削除したいな、ということで自動化することを検討。

で、Terraformにした理由は単に自分の好みというだけ。

tfファイル作ったらgitで管理しておけばいいし、また転職したときに簡単に自分のリソースをデプロイできるから今後楽かなって。

# 検知方法

タイトルにもあるようにGuardDutyでアラートが出たらしい。
詳しいことはわからないが、どうやらGuardDuty検知されるとボットが通知を送ってくるとのこと。

# バケットから作成者を特定した方法

これは単に自分がタグに自分のメアドを設定していただけ。
TerraformのAWS Providerで `default_tags` に設定しておけば、タグをつけられるリソース全てに入るから便利だよね。
これはTerraform使ってよかったと思った。

```hcl
provider "aws" {
  region  = var.region
  default_tags {
    tags = {
      Owner     = "${var.email}"
      ManagedBy = "terraform"
    }
  }
}
```

この場合 `Owner` タグを見て連絡先を特定したらしい。
こういうタグつけとくの大事だよね。

# S3バケットがパブリックアクセス可になっていた原因

Terraformで作成

```hcl
resource "aws_s3_bucket" "my_bucket" {
  bucket = "${var.prefix}-bucket"
  acl    = "private"
  versioning {
    enabled = true
  }

  tags = {
    Name = "${var.prefix}-bucket"
  }
}
```

※ `${var.prefix}` には自分の名前を設定

## この設定だといけないの？

**結論**：全然足りない

どうやらTerraformの [`aws_s3_bucket`](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket) リソースで作成したバケットはデフォルトでパブリックアクセス可の状態で作成されるらしい。ﾅﾆｿﾚｺﾜｲ

パブリックアクセスをブロックするには [`aws_s3_bucket_public_access_block`](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_public_access_block) リソースを追加しないといけないみたい。

```hcl
resource "aws_s3_bucket_public_access_block" "my_bucket_public_access_block" {
  bucket = aws_s3_bucket.my_bucket.id
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}
```

## 追加した結果

![kikeyama-bucket - S3 bucket 2022-05-02 at 1.28.12 PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/a232a81c-5a22-a0c6-da70-b31745f8384c.jpeg)

**Block all public access** がOnになってるからヨシ！

# おわりに

至極基本的なことかもしれないけど、S3バケットをTerraformで作ったらデフォルトでパブリックアクセスできるなんて知らなかったので、勉強になった。

パブリックにしてたときは中身は空っぽだったし検証用のバケットだったので、問題ないけど、ここに重要なデータ入れてたらと思うとゾッとする。

ちゃんと監視することって大事なんだなということも思い知った。
インシデントレスポンスの方、わざわざ連絡くれてありがとうございました。そして、ご迷惑おかけしました。

S3以外にもGuardDutyで検知されて対処したネタがあるので、シリーズ化して記事を書こうかと思う。
今回のS3は比較的ライトな話でした。

# 関連リンク

第1回: 検証用AWSアカウントでGuardDutyと闘う話 〜S3バケット編〜（当記事）
第2回: [検証用AWSアカウントでGuardDutyと闘う話 〜不用意にポート開けるな編〜](https://qiita.com/kikeyama/items/8d694725a43272bed3e8)
第3回: [検証用AWSアカウントでGuardDutyと闘う話 〜怒りのVPN編〜](https://qiita.com/kikeyama/items/53c66cccd53e1cd6f6ff)
ゼロトラストのディープダイブ(2)-アーキテクチャと機能要件

[前回] [ゼロトラストのディープダイブ(1)-背景と定義](https://qiita.com/mingchun_zhao/items/65beeadcaf481ce731c7)
## はじめに

じゃ、ゼロトラストを実現するには、何をすればよいでしょうか?
その前に、ゼロトラストモデルの構成と要件を理解する必要がありそうです。

## 前回のおさらい

ゼロトラストモデルと従来の境界防御モデルの簡単比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/f708200c-afe9-4adf-999a-7240fff02860.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/70d9ce31-f393-1f04-6768-f9d40181bf5b.png)


## `ゼロトラスト`はバズワードではありませんでした

NIST SP 800-207やForrester ZTXによって、明確に定義されていました。

## NIST SP 800-207のゼロトラスト・アーキテクチャ

[NIST(米国国立標準技術研究所) SP 800-207](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-207.pdf)による、ゼロトラスト・アーキテクチャの定義です。

PwCコンサルティング合同会社様が日本語に翻訳し、公開されていました、感謝感謝。
https://www.pwc.com/jp/ja/knowledge/column/awareness-cyber-security/assets/pdf/zero-trust-architecture-jp.pdf

### NIST SP 800-207で、ゼロトラストの考え方

- リソースとは、全てのデータソース、コンピューティングサービスを指す
- ネットワークの場所に関係なく、全ての通信を保護
- セッション単位で、企業リソースへのアクセスを許可
- 以下動的ポリシーによって、リソースへのアクセスを決定
    - クライアントID
    - アプリケーション
    - 情報資産の状態
    - 行動属性
    - 環境属性
- 企業は、全ての資産の整合性とセキュリティ動作を監視/測定
- アクセス許可のため、全てのリソースに対し認証/認可を動的/厳格に実施
- セキュリティ対策の改善のため、企業は下記の現状について可能な限り多く情報収集
    - 資産情報
    - ネットワークインフラストラクチャ
    - 通信

### ゼロトラストネットワークアーキテクチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/f6c771e8-1a18-953b-d8c1-3d37c164436b.png)

論理コンポーネント

- Control Plane
    - Subject
        - アクセス要求元のユーザー/アプリケーション/デバイス
    - PEP(Policy Enforcement Point)
        - 接続を監視
    - Enterprise Resource
        - 企業リソースのデータ/アプリケーション
- Data Plane
    - PE(Policy Engine)
        - リソースへのアクセス許可を決定
    - PA(Policy Administrator)
        - 通信経路確立とシャッドダウン実施
    - PDP(Policy Decision Point)
        - アクセス許可を判断するためのポリシー決定

## ゼロトラスト・エクステンデッド(ZTX)で、ゼロトラストに求められる機能

[The Zero Trust eXtended(ZTX) Ecosystem](https://www.cisco.com/c/dam/m/en_sg/solutions/security/pdfs/forrester-ztx.pdf)に定義されています。

- ネットワーク対策
    - セキュアウェブゲートウェイ(SWG)
    - ソフトウェアによる境界定義(SDP)
    - インターネット分離
- デバイス対策
    - エンドポイント保護プラットフォーム(EPP)
    - エンドポイントでの検出と対応(EDR)
    - IT資産管理
    - モバイルデバイス管理(MDM)
- ID管理対策
    - 多要素認証
    - シングルサインオン
    - 統合ID管理
    - 特権ID管理
- ワークロード対策
    - クラウドセキュリティポスチャーマネジメント(CSPM)
    - 脆弱性管理
- データセキュリティ対策
    - 情報漏洩監視
    - ファイルアクセス制御によるデータ保護
- 可視化と分析
    - クラウドアクセスセキュリティブローカー(CASB)
    - 統合ログ管理
        - SIEM(Security Information and Event Management)
- セキュリティ運用の自動化
    - セキュリティインシデントの発生から処理まで全過程を自動化
        - 例: SOAR(Security Orchestration, Automation and Response)

## おわりに

理論だけでお腹いっぱいになりました。
次回は、ゼロトラストの実践として、試しに関連ツールを検証してみます。
お楽しみに。


##### [次回] [ゼロトラストのディープダイブ(3)-Apache Guacamoleの検証](https://qiita.com/mingchun_zhao/items/cf38460a2118c9cae795)
UWPでマウスカーソルを変更する

# curファイルを用意する

例えば以下とかを使って作成する。

http://greenfishsoftware.org/


# rcファイルを作成する

この123が後で指定するIDになる。
```
#define IDI_CURSOR1 123

IDI_CURSOR1 CURSOR "circle.cur"
```

# rcファイルをコンパイルする。

Developer Command Prompt for VS xxxxを起動して
```
rc xxxx.rc
```
でxxxx.resファイルが作成される。


# resファイルを配置する。

適当に取り込んで以下とかにしておく

|項目 | 設定内容 |
| -- | -- |
|Build Action  | None |
|Copy to Output Directory | Copy always |

uwp の.csprojファイルをテキストエディタで開いて
一番上のPropertyGroupの中に以下を入れる
```
    <Win32Resource>Resources\Cursors\circle.res</Win32Resource>
```
パスは上で配置したパスにする。

# カーソルを適用する

rcファイルに記載したIDにする。
```
        private void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            Window.Current.CoreWindow.PointerCursor = new Windows.UI.Core.CoreCursor(Windows.UI.Core.CoreCursorType.Custom, 123);
        }
```

![cursor_changed_uwp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383810/b25a4c0b-d11b-d550-e167-05118ca20626.png)
Notion APIを試す＆エラー対応した件

# はじめに
notion apiを使って、お問い合わせデータベースを作成してみよう！とした時に発生したエラーについて述べます。

Token発行やDatabaseIDの取得は、以下の記事が参考になります。
[Qiita](https://qiita.com/tomoya_sakusaku/items/5a7f59ddfebe25e1ca8b)

# 環境
TypeScript
firebase functions

# コード

```
import axios ,{AxiosRequestConfig} from "axios"

const yourDatabaseID = 'あなたのデータベースID
const yourToken = 'あなたのトークン

const options:AxiosRequestConfig = {
      method: "post",
      url:'https://api.notion.com/v1/pages',
      headers: {
        Accept: 'application/json',
        'Notion-Version': '2021-08-16',
        'Content-Type': 'application/json',
        Authorization: 'Bearer ' + yourToken
      },
      data: {
        parent:{
          database_id: yourDatabaseID
        },
        properties: {
          Name: {
            "title": [
              {
                "text": {
                  "content": data.name,
                }
              }
            ]
          },
          },
          "お問い合わせ内容":{
            'rich_text': [
              {
                'type': 'text',
                'text': {
                  'content': data.content
                }
              }
            ]
          },

        }
      }
    };

    return await axios.request( options)
```

# Error

```
notion message: 'お問い合わせ内容 is not a property that exists.'
```

# 解決策
先に、Notion上で、プロパティを作成しておく。
今回は、”お問い合わせ内容”をTextタイプで作成しました。
WindowsActiveDirectoryをTerraformから操作する

## 構成
- WindowsServer2022
- ローカルから実行してる

## 導入
リモートで実行するために、WinRMを許可する必要がある
- Client
    - `winrm set winrm/config/client '@{AllowUnencrypted="true"}'`
- Server
    - `winrm set winrm/config/service '@{AllowUnencrypted="true"}'`
    - `winrm set winrm/config/service/auth '@{Basic="true"}'`

Providerをセットする
```
provider "ad" {
  version = "0.1.0"
  // Add WinRM configuration here
  winrm_hostname = "WIN-RGSRC4BU38N.vamdemic.local"
  winrm_username = "Administrator"
  winrm_password = "!QAZxsw2"
}
```

## 中身

```terraform
provider "ad" {
  version = "0.1.0"
  // Add WinRM configuration here
  winrm_hostname = "WIN-RGSRC4BU38N.vamdemic.local"
  winrm_username = "Administrator"
  winrm_password = "!QAZxsw2"
}

resource "ad_gpo" "g" {
    name            = "ExampleGPO"
    domain          = "vamdemic.local"
    description     = "gpo for gplink tests"
    status          = "AllSettingsEnabled"
}

resource "ad_gpo_security" "gpo_sec" {
  gpo_container = ad_gpo.g.id

  password_policies {
    minimum_password_length = 3
  }

  system_services {
    service_name = "TapiSrv"
    startup_mode = "2"
    acl          = "D:AR(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;LA)"
  }
}

resource "ad_ou" "o" {
    name        = "Example OU"
    path        = "dc=vamdemic,dc=local"
    description = "OU for gplink tests"
}

resource "ad_gplink" "og" {
    gpo_guid  = ad_gpo.g.id
    target_dn = ad_ou.o.dn
}
```

## 参考
https://registry.terraform.io/providers/hashicorp/ad/latest/docs
https://xkln.net/blog/getting-started-with-terraform-and-the-active-directory-provider/
AWSのSagemakerの無駄な料金を請求されないために注意すべき事

# 本記事について
　本記事はAWS初学者である著者の失敗を踏まえて、読んだ人が同じ失敗をしないために書いたものです。

※社会人なり立てで、AWSも勉強し始めたばかりなので、もし間違っていることがあればコメントなどでご教授お願い致します。

# なぜ発覚したのか
　2022年4月の初めに機械学習のR&D職として入社し、これから仕事でAWS上の機械学習関連の技術を学ぶことになりました。
　最初はノートブックのみを使用し特に気にするほど高い料金の請求はこなかった。
　しかしある日AWSのCost Managementを開いてみたら。前日AWSを使っていなかったにもかかわらず、42＄（日本円にして5468.21￥）もsagemaker関連で請求が来ていました。


# 解決方法
## 詳しく調べたところ
　Cost Explorerにて
　グループ化の条件のところで「使用タイプ」を選択したところ「APN1-Canvas:Session-Hrs」っというものに料金がかかっていたことがわかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/f5d5a9c9-bc6f-f662-6767-95e21c298cfa.png)

※以下の内容はCanvasを起動し、やりたい処理を終わらせたという前提で進めています。
## Canvasという単語に注目しました
　Amazon SageMakerにはAmazon SageMaker Canvas（※以降Canvasと略称）という便利なツールが存在しています。
https://www.youtube.com/watch?v=Sy3GDQT6Lnk&t=22s
（公式youtubeチャンネルのCanvasについての説明）

　このことから、今回多額な請求が来ている原因がCanvasにあると推測します。
　しかし、Canvas上ではすでにモデルもデータも存在していません。アカウントのログアウトもして、「これでもう大丈夫でしょ」っと安心してCanvasのページを閉じました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/2b304c4b-2f87-e1e2-bcd3-41bc497c43de.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/52f13015-f1d1-651e-05f4-eb9e6d7753bc.png)
次の日に42＄もの請求が来たのです。

　試しにアプリケーションの削除＆ユーザーを削除＆ドメイン削除を実行してみたところ、次の日から請求が止まりました。
# 手順
※いきなりドメインを削除しようとしても削除できません!
## 1.アプリケーションの削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/5c5aac11-05d5-4eb5-5a21-36abab5a8d68.png)
名前の下の青い部分をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/352e497a-a233-0d71-536c-46be9aa40149.png)
アプリケーションの削除を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/13162078-dc7b-8a61-4f4c-b132fb452362.png)
※時間がかかっていると思った場合画面を更新してみたらステータスがDeletedとなっていると場合があります。
## 2.ユーザーの削除
アプリケーションのステータスが「Deleted」であることを確認し、右下にある編集をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/c35ece6d-faa8-27a7-c3ca-d7f7781edacd.png)
ユーザーを削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/805a1f06-3c84-55dc-941f-9cfb7451a81f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/833496b6-ea14-a660-18c1-3220349bbc0a.png)
## 3.ドメインの削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/e38d972c-205c-6d09-f52b-4c2dd791ba1d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641616/e27fba21-9c6c-374f-5275-8742afef32cd.png)
以上になります。
# 最後に
　もしかしたら、アプリケーションかユーザーかドメインのどこかの段階は残してもお金がかからないかもしれませんが、原因がわからず多額な請求が来ていた場合はすべて削除してみてください。
　お金で心配することはなくなります。

「こうすれば問題ないよ」など詳しく知っている方がいれば、コメントでご教授お願い致します。
【Golang】GOPATH、GOROOTについて

# 前提
Macユーザー

# 参考

https://pleiades.io/help/go/configuring-goroot-and-gopath.html

# GOPATH
・ワークスペースのルートディレクトリ
・デフォルト値が「%USERPROFILE%/go」なので、変更する場合は「go env -w GOPATH=----」で変更する。
・次のフォルダが格納されている

>src/ : **Go ソースコード**の場所（例: .go、.c、.g、.s）。
pkg/ : コンパイルされた**パッケージコード**の場所（例: .a）。
bin/ : Go によって**ビルドされたコンパイル済み実行可能プログラム**の場所。

# GOROOT
・↓の説明にある通り、異なるGoバージョンを変更する必要がないなら気にしなくていい。

>GOROOT は、Go SDK の場所を定義する変数です。異なる Go バージョンを使用する予定がない限り、この変数を変更する必要はありません。
Linux Ping-t勉強の記録4 ブートプロセスとsystemd

# 覚えるものを記録
## systemctlのサブコマンド(理解できたもの)
#### start
サービス起動
#### stop
サービス停止
#### status
サービスの状態を表示
#### is-active
サービスが稼働しているかを表示
#### restart
サービス再起動
#### reboot
システム再起動
#### poweroff
システムを停止し電源をオフ
#### halt
システムを停止する（電源は落とさない）
-pでシステム停止後電源をオフ
#### disable
サービスの自動起動を無効
#### enable
サービスの自動起動を有効
#### restart
サービスの設定ファイルを再読み込み

### 理解できていないもの
___
#### set-default
次回起動時のターゲットを設定
___
#### get-default
次回起動時のターゲットを表示
##### cd /etc/systemd/systemの後 ls -l default.targetと何が違う？
___
#### isolate
set-defaultは次回起動時だがisolateはリアルタイムで変更できる？
___
#### list-unit-files
Unit(設定ファイル)の一覧表示

___
## Unit拡張子
#### device
デバイスを管理するUnit
#### service
サービスを制御するUnit
#### swap
スワップ領域を管理するUnit
#### target
複数のサービスを1つのグループにするUnit
#### mount
マウントを管理するUnit
___
## shutdownコマンドオプション
#### -h
システム停止(デフォルト)
#### -r
システム再起動
#### -k 
ログインしているユーザーにメッセージ送信
#### -c
シャットダウンをキャンセル
## telinitコマンド
#### ランレベルを切り替えるコマンド
##### chkconfig で各デーモンのランレベルを表示
#### ランレベルとは
Linuxの動作モード？
ランレベル6がシステムの再起動？
#### systemdのtargetコマンドでランレベルを変更することが可能？
#### reboot.target 
ランレベル6(再起動)にする
#### poweroff.target
ランレベル0(システム終了)にする
#### rescue.target
ランレベル１（シングルユーザーモード）
#### multi-user.target
ランレベル2,3（サーバーとして動作させる）,4
#### graphical.target
ランレベル5（グラフィカルログイン）
サービスを起動することは可能だが、無駄なリソースを使用する
___
### シンボリックリンク
元ファイルの場所を示す
ln -sでシンボリックリンクを作成

___
### /etc/inittabを設定ファイルに使わないinitプログラム
#### Upstart
#### systemd
#### (inittabを使うinitプログラムはSysVinit)
___
## システムの起動順序
BIOS→ブートローダ→カーネル→init
BIOSでHDD等に関して簡単な認識を行う
ブートローダでHDD内のカーネルをロード
カーネルで高度にハードウェアを認識・制御し、様々な初期化処理を行い、/sbin/initを起動
initで/etc/inittabを用いアプリの初期化を行う
docker-compose upで"container is marked for removal and cannot be started"が発生した時の対処法

docker-composeのコンテナを追加したり削除したりなど、あれこれ触っていたら、以下のエラーが発生。

```
Starting xxxxxxx ... error

ERROR: for xxxxxxx  Cannot start service xxxxxxx: container is marked for removal and cannot be started
ERROR: Encountered errors while bringing up the project.
```
コンテナのstatusがDead状態になっているとこのようなエラーになる。

```
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                          PORTS                                       NAMES
c1ccedaf35fc   xxxxxxx   "docker-entrypoint.s…"   29 minutes ago   Dead                            0.0.0.0:3030->3000/tcp, :::3030->3000/tcp   xxxxxxx
```
コンテナを削除すれば解決。

```
$ docker rm c1ccedaf35fc
```
HTMLでもmatplotlibが使えるってよ。なんならPythonも使えるってよ。

# はじめに
Java ScriptならぬPyScriptがリリースされたようです。
少し試してみました。


# 表示結果
HTMLファイルで、PyScriptを実装しmatplotlibで可視化できるか実験してみました。
ブラウザの表示結果を下記に示します。
確かに動作していることがわかります。
動作が重かったのが難点かなと思いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139678/55594ac3-ebfa-1728-43eb-6350a150aade.png)

# ソースコード
HTMLファイルのソースコードを下記に置きます。
リーダブルコードだなというのが印象です。

```html
<html>
  <head>
    <title>Matplotlib</title>
    <meta charset="utf-8">

    <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />
    <script defer src="https://pyscript.net/alpha/pyscript.js"></script>
    <py-env>
      - matplotlib
    </py-env>
    </head>
    <body>
      <div id="mpl"></div>
      <py-script output="mpl">
import matplotlib.pyplot as plt
import matplotlib.tri as tri
import numpy as np

# First create the x and y coordinates of the points.
n_angles = 36
n_radii = 8
min_radius = 0.25
radii = np.linspace(min_radius, 0.95, n_radii)

angles = np.linspace(0, 2 * np.pi, n_angles, endpoint=False)
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)
angles[:, 1::2] += np.pi / n_angles

x = (radii * np.cos(angles)).flatten()
y = (radii * np.sin(angles)).flatten()
z = (np.cos(radii) * np.cos(3 * angles)).flatten()

# Create the Triangulation; no triangles so Delaunay triangulation created.
triang = tri.Triangulation(x, y)

# Mask off unwanted triangles.
triang.set_mask(np.hypot(x[triang.triangles].mean(axis=1),
                         y[triang.triangles].mean(axis=1))
                < min_radius)

fig1, ax1 = plt.subplots()
ax1.set_aspect('equal')
tpc = ax1.tripcolor(triang, z, shading='flat')
fig1.colorbar(tpc)
ax1.set_title('tripcolor of Delaunay triangulation, flat shading')

fig1
      </py-script>
    </body>
</html>

```

# 参照

https://pyscript.net/examples/
【メモ】juliaのバージョン上げた時のローカルとVSCodeへのパスの通し方

プログラミング初学者の時、juliaのパスの通し方に困ったことがあったのでメモしておきます。

## 環境
M1 macbook(2021)

https://julialang.org/downloads/

からJuliaをダウンロードして、アプリケーションに入れる。


bashrcもしくはzshrcに以下を記入
以下は、julia1.7をインストールする場合なので、バーションは適宜変えて下さい。

```
export PATH=/Applications/Julia-1.7.app/Contents/Resources/julia/bin:$PATH
```


Homebrewを用いて入れた場合は、


```
export PATH=/opt/homebrew/bin/julia:$PATH
```


## julia側からpythonを呼び出す際のパスの設定


```Julia

julia> ENV["PYTHON"]=Sys.which("python3")
julia> using Pkg; http://Pkg.build("PyCall")

```

~/.julia/conda/3/bin 以下にある Python を呼びたい場合は

```julia
julia> ENV["PYTHON"]=""
julia> using Pkg; http://Pkg.build("PyCall")
```

# VSCodeのパス　
こちらを参考　
https://julialang.github.io/IJulia.jl/stable/manual/installation/

```julia
using Pkg
Pkg.add("IJulia")
```
【javascript,jquery】の配列追加！jsはpushじゃないとダメ！

# コード
```javascript

//varを使用すると再宣言、初期化によるバグを起こしやすくなるため、今は非推奨だから使わないほうが良い
let items = [];
const results = [
    {'name' : '田中',  'japanese' : 83, 'math' : 57, 'science' : 43,  'social' : 72, 'english' : 78},
    {'name' : '渡部',  'japanese' : 62, 'math' : 88, 'science' : 70,  'social' : 66, 'english' : 38},
    {'name' : '品川',  'japanese' : 23, 'math' : 33, 'science' : 53,  'social' : 17, 'english' : 07},
    {'name' : '滝谷',  'japanese' : 93, 'math' : 89, 'science' : 79,  'social' : 96, 'english' : 91},
    {'name' : '川原田','japanese' : 55, 'math' : 56, 'science' : 60,  'social' : 54, 'english' : 66},
    {'name' : '一色',  'japanese' : 27, 'math' : 47, 'science' : 100, 'social' : 42, 'english' : 38},
];

 results.forEach(function(result) {
    if(result.japanese > 80) items.push(result);
 })

// jqueryなら

$.each(results,function() {
      if(this.japanese > 80) items.push(this);
})
 
console.log(items);
```

# 結果
```
[
  {
    name: '田中',
    japanese: 83,
    math: 57,
    science: 43,
    social: 72,
    english: 78
  },
  {
    name: '滝谷',
    japanese: 93,
    math: 89,
    science: 79,
    social: 96,
    english: 91
  }
]
```
JavaScriptでUUIDを生成する方法(ライブラリなし)

### JavascriptでランダムなIDを生成する方法
JavaScriptでUUIDをライブラリなしで作成する関数を下記に記載。

```hoge.js
const uuid = () =>
  ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>
    (
      c ^
      (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))
    ).toString(16)
  );
```

結果
``` result.js
console.log(uuid())

// 396246c5-d076-4b39-a6d5-4dbc74996bdf
 ```

[参照](https://tapajyoti-bose.medium.com/7-more-killer-one-liners-in-javascript-1cd180d82695)
Windows環境のDockerまとめ

# 環境
OS : windows 10pro build 21H1
nVIDIA driver 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/8857168f-b324-5075-7df9-faea27cf2c39.png)

# widnowsのDockerはバージョンが複数ある。
https://atmarkit.itmedia.co.jp/ait/articles/2011/20/news015.html

△Docker for windows
〇Docker Desktop	
〇Docker On WSL 2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/eed27a55-63ec-8791-f210-b4951c954fa3.png)

# 参考
https://qiita.com/anikundesu/items/7ecf20b7e8a60f8439a8　(Docker for windows)
https://qiita.com/NoOne/items/6e03c5ea51e8288eded5 (Docker Desktop)
https://rubytomato.hateblo.jp/entry/2021/01/09/230402
https://zenn.dev/taka_tech/articles/4f9ef536ac51c2

#公式
https://www.docker.com/
https://hub.docker.com/

# 有料
Docker Desktopの有料化
https://chigusa-web.com/blog/windows%E3%81%ABdocker%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6python%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89/
```

Docker Desktopは、スモールビジネス（従業員数250名未満かつ年間売上高1000万ドル未満（訳注：1ドル110円換算
で11億円））、個人利用、教育機関、非商用のオープンソースプロジェクトであれば、引き続き無料でご利用いただけます。

```

# DL
https://docs.docker.com/desktop/windows/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/2d976f2a-9373-f7a8-99a1-df210acc5df9.png)

# Docker Desktop インストール

再起動する。

途中で、WSL2が無い場合は次の画面になるので、ＭＳストア経由でインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/5f3ae62d-bb14-b55a-eb24-365000df05e9.png)

# Ubuntu18 LTS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/d6f90338-3caa-1e2c-c2f1-7cc3fe1e7146.png)

# WSL2 インストール

```

Error: 0x800701bc WSL 2 ???????????? ??????????????????????? https://aka.ms/wsl2kernel ?????????                                                                                        

```

x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ　を入れる
https://qiita.com/hali/items/bf04a1e4012025a38d6b

# tutorial 

https://qiita.com/Michinosuke/items/5778e0d9e9c04038903c
Dockerを体系的に学べる公式チュートリアル和訳

https://docker-curriculum.com/
https://zenn.dev/taichifukumoto/scraps/bfbdb56f7e5852

Play with Docker 
ネームドボリューム docker volume create
docker volume inspect todo-db
バインドマウント
docker logs -f <container-id>
docker build -t getting-started .
一般的に、各コンテナは一つのことのみを行うべきです。
docker network create todo-app
docker exec -it <mysql-container-id> mysql -p  : pass=secret


docker exec -ti <mysql-container-id> mysql -p todos
Docker Composeを使用する
docker-compose version
Dockerダッシュボードでアプリケーションスタックを確認する
docker-compose down

# イメージ構築のベストプラクティス
docker scan getting-started
docker image history getting-started
レイヤーのキャッシュ

.dockerignore
Qiitaの記事からコードブロック部分だけ抽出して表示するPythonスクリプト

Qiitaの記事に書かれたコードを動作確認することが多いので、Qiita記事のURLを指定してコードブロック部分だけを表示するスクリプトを作りました。

### 使用例

```text:すべてのコードブロックを表示
$ python3 qiitacode.py https://qiita.com/shiracamus/items/556ff8d916712a9f7055
```

```text:c言語部分だけ表示
$ python3 qiitacode.py https://qiita.com/shiracamus/items/556ff8d916712a9f7055 c
```

```text:Python(py)部分だけ表示
$ python3 qiitacode.py https://qiita.com/shiracamus/items/556ff8d916712a9f7055 py
```

### プログラムコード

```py:qiitacode.py
#!/usr/bin/env python3

"""
download a Qiita article and print program in code blocks

example:
    $ python3 qiitacode.py https://qiita.com/shiracamus/items/556ff8d916712a9f7055
    $ python3 qiitacode.py https://qiita.com/shiracamus/items/556ff8d916712a9f7055 c
    $ python3 qiitacode.py https://qiita.com/shiracamus/items/556ff8d916712a9f7055 py
"""

import sys
import re
import requests


def load_markdown(url):
    return requests.get(f'{url}.md').text.splitlines()


def markdown_code(lines, lang=''):
    lang_pattern = rf'(\s*{lang}(:.*)?|.*:.*\.{lang})' if lang else ''
    code_start = re.compile(rf'^\s*(```|~~~){lang_pattern}\s*$')
    code_end = re.compile(r'^\s*(```|~~~)\s*$')
    in_code_block = False
    for line in lines:
        if in_code_block:
            if code_end.match(line):
                in_code_block = False
                yield '\n'
            else:
                yield line
        else:
            if code_start.match(line):
                in_code_block = True


def main():
    if not 2 <= len(sys.argv) <= 3:
        print(f'Usage: {sys.argv[0]} QIITA_ARTICLE_URL LANGUAGE')
        exit(1)
    markdown = load_markdown(url=sys.argv[1])
    lang = sys.argv[2] if len(sys.argv) > 2 else ''
    for code in markdown_code(markdown, lang):
        print(code)


if __name__ == '__main__':
    main()
```

### 関連記事

https://qiita.com/shiracamus/items/6772be86ef1f863bcd2e
【BigQuery】外部テーブルを使いこなせ！　ファイルネームで絞ってスキャン量を減らす方法

## やろうとしていること
BigQueryの外部テーブルに対してクエリをたたく際に、何も指定しないとレコードを全スキャンしてしまいます。
今回は[FILENAME 疑似列](https://cloud.google.com/bigquery/external-data-cloud-storage?hl=ja#the_file_name_pseudo_column)を使って、スキャン量を減らしていきたいと思います。

## そもそもFILENAME疑似列とは
GCSのような外部リソースを使った外部テーブルにおいて、ファイル名という疑似カラムが存在します。
そしてその疑似カラムをWHERE句等でフィルターすることで、BigQueryはそれに該当しないファイルを読み込むことをスキップします。

> When the query has a filter predicate on the _FILE_NAME pseudo column, BigQuery attempts to skip reading files that do not satisfy the filter

早速クエリを例に見てみましょう。

## クエリ
参考例として、以下のようなクエリを外部テーブルに対して叩けば、そのファイル名のavroファイルなりjsonファイルなりのレコードだけスキャンします。
このクエリの場合、特定のテーブルの2022年1月分のファイルレコードだけをフィルタリングしています。

```sql:filename.sql
    SELECT 
    id,
    _FILE_NAME as fn

    FROM `project_name.dataset_name.table_name`
    
    WHERE _FILE_NAME LIKE concat("gs://your_gcs_bucket_name/any_folder/", "your_table_name","/",
    "2022" ,"/" ,"01" , "/%")
```

## 結果
```sql:result.sql
行	id	 fn
 1 	1111 gs://project_id/table_1/2022/01/30/10/00/your_file1.avro 
 2 	1112 gs://project_id/table_1/2022/01/31/10/00/your_file2.avro 
...
```
上記の例のファイル名の構造は以下のような
**project_id/table_1/year/month/day/hour/minute/your_file.avro**
といった形です。
これはGCSのファイルの保存形式に依存するので、ご自身のGCSのフォルダ構造に合わせてください。
``` 
 フォルダ名(テーブル名)/year/month/day/hour/minute/file.avro
|-table_1 
|　　　  ┗2022
|　　　　　　┗01
|　　　　　　　┗31
|　　　　　　　　┗10
|　　　　　　　　　┗00
|　　　　　　　　　　┗filename_avro
|-table_2
|-table_3
```

## まとめ(追記)
外部テーブルのスキャン量を減らす方法として紹介しましたが、
活用方法としては、連携されたデータGCSに置いてBigQueryにテーブルを作るときに

**①直接外部テーブルを作る。**
→　これだと外部テーブルに直クエリなのでパフォーマンスが悪い×

**②（外部テーブルではない）BigQueryテーブルを作る。**
→　月次ではなく毎日or毎時でテーブルを作り直したりするわけにはいかないので×

**③　②の確定データテーブル（前月末日までのみ）　＋　ファイルネーム疑似カラムを使用して、今月１日～当日のデータだけ外部テーブルから取得してviewを作る**
→　これなら前月までの確定データは既に作成されているかつ、今月分を取得する際に全データスキャンしないのでviewが重くなることもないのでＯＫ

以下は簡素ですが③のview作成クエリのイメージです。
```sql:sample.sql
SELECT * FROM 確定データテーブル --例　2022/03/31までのデータ
union all
SELECT * FROM 外部テーブル
WHERE _FILE_NAME LIKE concat("gs://your_gcs_bucket_name/any_folder/", "your_table_name","/",
    "2022" ,"/" ,"04" , "/%") --2022の４月分だけのデータ
```
トラッキング技術まとめ

<h1>Hi
<p>人工知能を使ったトラッキングって、なんか燃えますよね。簡単に3つほど紹介したいと思います。全てpythonで書かれています。

<h1>DeepLabCut version2
<p>https://github.com/DeepLabCut/DeepLabCut
<p>・複数の個体のトラッキングが可能
<p>・nature methods(impact factor：28.5)に今年の4月に記載された
<p>・ラベリング付けは、GUI
<p>.日本語の資料が豊富（もちろん、英語も）

<h1>SLEAP version1
<p>https://github.com/murthylab/sleap
<p>・複数の個体のトラッキングが可能
<p>・nature methods(impact factor：28.5)に今年の4月に記載された
<p>・ラベリング付けは、GUI
<p>.日本語の資料がほぼない（ドキュメントが読めれば問題なし）

<h1>DeepPoseKit
<p>https://github.com/murthylab/sleap
<p>・単一個体のトラッキングが可能
<p>・ラベリング付けは、すこしめんどくさそう
<p>.日本語の資料がほぼない（ドキュメントが読めれば問題なし）

<h1>mAP
<p>気になるmAPは、ほぼ同じ(0.927-0.928)
【JavaScript】【Jquery】配列操作 each文

# コード
```javascript

//varを使用すると再宣言、初期化によるバグを起こしやすくなるため、今は非推奨だから使わないほうが良い

let results = [
    {'name' : '田中',  'japanese' : 83, 'math' : 57, 'science' : 43,  'social' : 72, 'english' : 78},
    {'name' : '渡部',  'japanese' : 62, 'math' : 88, 'science' : 70,  'social' : 66, 'english' : 38},
    {'name' : '品川',  'japanese' : 23, 'math' : 33, 'science' : 53,  'social' : 17, 'english' : 07},
    {'name' : '滝谷',  'japanese' : 93, 'math' : 89, 'science' : 79,  'social' : 96, 'english' : 91},
    {'name' : '川原田','japanese' : 55, 'math' : 56, 'science' : 60,  'social' : 54, 'english' : 66},
    {'name' : '一色',  'japanese' : 27, 'math' : 47, 'science' : 100, 'social' : 42, 'english' : 38},
];

// forEachなら
 results.forEach(function(results) {
  console.log(results.name)
 })

 results.forEach((results) => {
    console.log(results.name)
 })

//jqueryなら

$.each(results, function() {
    console.log(this.name);
})

// アロー関数なら
$.each(results,(_,v) => {
    console.log(v.name);
});
```

# 結果
```
田中
渡部
品川
滝谷
川原田
一色
```

# DOM操作の場合

```html
<input type="checkbox" name="sports" value="野球">野球
<input type="checkbox" name="sports" value="サッカー">サッカー
<input type="checkbox" name="sports" value="バスケットボール">バスケットボール
```

```javascript
$('input[type="checkbox"]').each(function(){
    console.log(this.value);
})

// アロー関数なら
$('input[type="checkbox"]').each((_,v) => {
    console.log(v.value);
});
```

# 結果
```
"野球"
"サッカー"
"バスケットボール"
```
MAiX Qube 奮闘記08 I2C通信でキャラクタＬＣＤ表示(1)

今回はI2C通信を使ってキャラクタＬＣＤへの文字表示に挑戦。
キャラクタＬＣＤはこれ

https://akizukidenshi.com/catalog/g/gK-08896/

配線(Qube 正面コネクタ)
| LCD | QubeIO |QubeIO | LCD |
|:-:|:-:|:-:|:-:|
|  SDA|   IO 7 SDA|  3V3 | +V  |
|  -|   IO15|  IO21 |   -|
|  -|   IO20|  IO 8 |   -|
|   GND|   GND|   IO 6　SCL|   SCL|

そしてLCD「2.54mmピッチに変換する基板」裏面2か所のスイッチパターンをはんだブリッジをして有効にします。
まずはi2c バススキャン　をしてみます。
応答があったアドレスがシリアルターミナルに表示されます。

LCDモジュールのアドレスは秋月の取説から0x7cです。
→２進表記だと:0111 1100
応答があったのは62(10進表記、16進表記だと0x3E)。
→２進表記だと:0011 1110
I2Cの7ビットアドレス指定だと最下位はR/W指定ビットなので
たぶん秋月の取説の0x7Cはアドレス7ビットとR/W指定を最下位に含んだ表記なのでしょう。
正常に応答があると判断しました。

```python:I2C_SCAN_DIVICE.py
from machine import I2C
from fpioa_manager import *
i2c = I2C(I2C.I2C3,mode=I2C.MODE_MASTER, freq=100000, scl=6, sda=7)
#id: I2C ID, [0 to 2] (I2C.I2C0 to I2C.I2C2) [3 to 5] (I2C.I2C3 to I2C.I2C5, I2C_SOFT) is the number of soft analog I2C.
devices = i2c.scan()
print(devices)
i2c.deinit()
```
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606106/ea5f8714-57f7-19c5-3336-e69456f5cfda.png)
裏面２カ所ははんだブリッジ
![IMG_0025.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606106/622b9b41-152f-ac04-f768-4334e07f8659.jpeg)

![IMG_0024.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606106/f339d479-c67b-f6dd-be37-1ff495e4e1a8.jpeg)
Arduinoでセンサ値の小さな移動平均をとる

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) ちょっと均したいだけ（ならしたいと読む）

# センサの取得値を加工してなだらかにする

センサーのデータを取得する際に、ローデータだとどうしても値が暴れます。
その値をならす方法はいろいろあると思いますが、シンプルな移動平均法を書いたので自分用のメモとして残しておきます。

# 移動平均法とは？
たとえば気温の変化度合いを毎日発表するとした時、その値をグラフにするとかなりギザギザします。
そこで毎日一週間分の平均値を発表するとします。
この場合、明日発表する平均値は、その平均値に明日の気温を足して、もっとも古いデータ、つまり先週の同じ曜日の気温をひいてから７で割って平均かしたものになります。
これが移動平均です。

# 小さな移動平均

たとえば過去7個までのデータで移動平均を取る場合。
月〜日までの７曜日分のデータを配列とします。
新しいデータを入力する際には、その曜日の枠の値を上書きするイメージです。
更新された一週間分のデータの平均をとればそれが最新の移動平均になります。
小さな数値であれば毎回合計しても負荷はそれほど気にしなくてよいと思います。

具体的には、下記のようなコードはどうでしょう。

```c++:moving_average
int stock_rotation_term = 7;//移動平均の期間（標本数）
int stock_rotation_number = 0;//輪番用のカウント
int stock_data[stock_rotation_term];//データをストックする配列
float new_data;//センサから取得した最新のデータ

void moving_average(float data) {//IMUデータの移動平均値の取得

  //二次元配列の0番から輪番で最新のデータを入れていく。指定個数を上回ったら0番に戻す
  stock_rotation_number ++;
  if (stock_rotation_number > stock_rotation_term) {
    stock_rotation_number = 0;
  }

  stock_data[stock_rotation_number] = data;//ストックの輪番箇所にデータ上書き

  float result=0;//結果を初期化
  for (int i = 0; i < stock_rotation_term; i++) {//ストックした値を合計する
    result += stock_data[i];
  }

  result = result/stock_rotation_term; //合計値を標本数でを割る
  
  return result;
}

void setup() {
  Serial.begin(9600);
}

void loop {
  new_data = //<なんらかのセンサ値>
  Serial.prlintln(moving_average(new_data));
}
```
3~4個ぐらいの過去についての移動平均であれば、この方式でいけると思います。

# 大きな移動平均

100個とか大きめの移動平均の場合は、現在の平均値を利用して結果を出せば計算回数を大幅に減らせてよいでしょう。その場合、ある程度の段取りは必要になると思います。

100個の例で考えてみます。

① 最初の100個のデータについては、配列の輪番枠に順にデータを貯めていく。
② その際の移動平均は、合計値を取得したデータ個数で割って出していく。
③ 100個に達するまで、①②を繰り返す。
④ 101個めからは次のルーチンに入る。
⑤ 現在の平均値から輪番枠のデータを減算する。
⑥ 同時に、最新のデータを輪番枠に上書きする。
⑦ 平均値に最新のデータを加算し、100で割った結果を移動平均として出力する。
⑧ ある程度の期間は⑤〜⑦をループ
⑨ 誤差が積算していくため、定期的に②で平均値をリフレッシュする。

これで移動平均が出せると思います。
コードが長くなっても問題ない場合には、こちらの方法でやれば、4個ぐらいの小さな移動平均でも計算コストを下げることができます。3個の移動平均だと計算コストは小さな移動平均と同じぐらいになると思います

# 他の方法
ライブラリとかが便利なのかもしれませんが概念としてメモしておきました。
もっとよい方法があればぜひ教えてください。
Agent Live Web Chat 



# CORS Error - 404 not found

+ [【未解決】CORS Error - 404 not found](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FWti8SAD)
+ [【新しいPlayGroundで回避】I am facing Having trouble starting a chat. I have checked URL in Visualforce page as the URL ends with .visualforce.com instead of .force.com, I have created NEW in CORS Setting to allowlist https://*.visualforce.com. Still issue not resolved.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FXPb4)
+ [ユーザーが提供した値に基づいてチャットをルーティングする必要がある](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YwRzc)

:::note
I answered my own question - you can do this without using a Flow.  I used the 'set routing type' and transfer' rules in the Bot designer to route chats based on answers from the Chat user.  

私自身の質問に答えました。フローを使用せずにこれを行うことができます。ボット デザイナーの「ルーティング タイプの設定」と「転送」ルールを使用して、チャット ユーザーからの回答に基づいてチャットをルーティングしました。  
:::

# エラー

+ [チャットを開始するのに問題があります。URLが.force.comではなく.visualforce.comで終わるため、VisualforceページでURLを確認しました。CORS設定でNEWを作成して、allowlist https：//*.visualforce.comを作成しました。まだ問題は解決されていません。](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FXPb4SAH)

# できないこと

+ [Live Agent のキューで転送チャットを優先する](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HF1C0SAL)


# 設定例

+ [【Live Agent機能関連】プログラミングでエージェントのテキスト入力領域にあるテキストの文字列を設定したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ywew7)

# CSSがうまく機能しない

+ [LiveAgent (embedded service chat) styling broken recently?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YwCoZ)

:::note
Unfortunately, no, I don't think there is a way to turn the shadow-root off unless it is explicitly mentioned in the script where you can close it, which I don't think it'll help!

We found the issue was with another vendor of ours whose product has their own javascript embedded on our site and it was conflicting with the embedded service after an update they had made.  So, if this happens to you check with your other vendors for recent updates. 


:::