OmniAICreator/Qiita-1.07M huggingface dataset:
ＤＸとは？

#前書き
つい30分前の、妻との会話である。（実話）

夫：DXと言えば？
妻：マツコ！
夫：いや、最新のＤＸと言えば？
妻：ダウンタウンＤＸ？
夫：いや、ビジネスの世界でさぁ、聞いたことない？
妻：カブ？
夫：ん？
妻：ん？
夫：あ、ＦＸね。それは。いや、有吉とかもＣＭで言っているじゃあない。知らない？デジタル・・・（以下略）
妻：えー？何それ？

そんなもんである。ちなみに私も妻も共働きのサラリーマン（ウーマン）である。
二人とも昭和生まれの同世代。私はいわゆるＩＴ業界で働いているが、妻は塗料の商社で、人事給与・労務関係の職である。


#DXとは？　妻にＤＸ（デジタルの方）を説明できるか?

ビジネスの世界では世界中でDX、DXと騒がれ、テレビでも芸能人を使ってDX関連のCMが流れている今日この頃であるが、一般の、少なくとも私の妻への認知度はこんなもんなのだろうなと思ったわけですが、さて、そんな私の妻に「DX（＝ Digital Transformation）」を上手く説明できるだろうか？
私以外でも、この記事を読んでいただいている読者の方はDXについて理解されている、或いはシゴトで携わっている方も多いと思いますが、私の妻が分かるように、ひと言で説明してもらうとしたら、なんと説明するのが良いでしょう？


#私の結論

ググれば「DX」についていろいろカイセツがされています。
「それを見ろ」というのが一番手っ取り早いです。私も昔、いろんなサイトのカイセツをググって読みました。
そんな中、私が一番腹落ちしたサイトを紹介します。
私の妻のような、ITにあまり詳しくない、（興味もあまりない）というような人も、きっと理解したような気になるんじゃあないでしょうか。


**「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典**　のサイトを執筆されている、佐々木真（ササキマコト）氏のカイセツです。

https://wa3.i-3-i.info/word18727.html


このサイトの中で、彼は以下のようにひと言でまとめています。

>まぁ「デジタルトランスフォーメーション（DX）」って単語が出てきたら**「『デジタル技術をガンガン取り入れて、今までのショボいやり方をガッツリ大きく変えて、ウッハウハになってやるぜ！』的なニュアンスで使っているんだろうな～」**と、お考えください。


どうですか？的確な説明だと思いません？

私は、佐々木氏のサイトの愛用者で、自分自身、分からない用語があったりする場合はもちろんのこと、自分が相手にIT用語を説明したいときにも彼のサイトをよく参照させていただいています。
私は彼を天才だと思っています。

以上、今日の我が家の小話がきっかけの、素晴らしい佐々木真氏のIT用語辞典サイトを紹介する話でした。
音楽に目覚めたので、楽しくオリジナル曲が作れるゲームを作ってみた

#音楽に目覚める
以前から音楽に興味はがあり、ピアノなども触ってはみたのですが長続きせず、途中で挫折することを繰り返している北城です。

皆さんもそのような経験ありますよね？？

そんな中であった[Logic Pro](https://www.apple.com/jp/logic-pro/)。

もうね、音楽の知識とか必要なくすごい簡単に曲が作れちゃうんですよ。

楽しくなってしまって、曲作りについて学ぼうと『[作りながら覚える 3日で作曲入門](https://www.amazon.co.jp/gp/product/B08JYL8WWZ/ref=ppx_yo_dt_b_d_asin_title_o09?ie=UTF8&psc=1)』。

この本の通りにやると簡単に1曲作れます。

多くの人に音楽作りを体験して欲しくて、[ゲームを作成](https://unityroom.com/games/musicproject)しました。
　
お時間のある方は、ぜひやってみてください。
今回は、ゲームを作成する方法の肝についてまとめました。

#音楽に必要な３大要素
音楽が、リズム・ハーモニー・メロディーの３大要素によって構成されているそうです。
それぞれが3つあれば、3の3乗通り、つまり、27通りの音楽が作成されます。

上記のゲームは、この27通りから自分の好きな曲を自ら作り、楽しめるゲームになっております。

#音を出すための設定
unityで音を出すためには、
１）音を出すスピーカーにあたるAudio Source
２）音の元となるAudio Clip
を設置する必要があります。
[![Image from Gyazo](https://i.gyazo.com/1b73a40fe613e4869b28a8fa2c26f09a.png)](https://gyazo.com/1b73a40fe613e4869b28a8fa2c26f09a)

Clipを設定するためのcodeは以下です。

```c#:DrumSoundManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class DrumSoundManager : MonoBehaviour
{
    public static DrumSoundManager instance;

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(this.gameObject);
        }
        else
        {
            Destroy(this.gameObject);
        }
    }

    public AudioSource drumAudioSource; // BGMのスピーカー
    public AudioClip[] drumAudioClips;  // BGMの素材（
    public Slider dslider; //音量調節用のスライダー

    private void Update()
    {
        drumAudioSource.volume = dslider.GetComponent<Slider>().normalizedValue;
    }

    public void PlayDrum(string clipName)
    {
        drumAudioSource.Stop();
        switch (clipName) 
        {
            default:
            case "Beach":
                drumAudioSource.clip = drumAudioClips[0];
                break;
            case "Cafe":
                drumAudioSource.clip = drumAudioClips[1];
                break;
            case "Night":
                drumAudioSource.clip = drumAudioClips[2];
                break;
        }
        drumAudioSource.Play();
    }

    public void DrumStop()
    {
        drumAudioSource.Stop();
    }
}

```

続いて、以下のように設定を行います。
[![Image from Gyazo](https://i.gyazo.com/f449b3653aa285ad0816d189dfe8309c.png)](https://gyazo.com/f449b3653aa285ad0816d189dfe8309c)

① ヒエラルキー上にDrumSoundManagerという空のオブジェクトを作成し、このオブジェクトにAudio Sourceコンポーネントをアタッチします。

② DrumSoundManagerという空のオブジェクトにDrumSoundManager.CSもアタッチします。

③ Audio SourceコンポーネントをDrumSoundManager(Script)のDrum Audio Sourceにアタッチします。

④ Audio Clipsに音源となるMP3データを貼り付けます。

上記の工程をハーモニーとメロディーにも行います。

あとは、ボタンに音楽を開始する関数を貼り付ければ、完成です。

完成した[ゲームを再掲](https://unityroom.com/games/musicproject)します。

ぜひ一度遊んでみてください！！！
OpenCVで画像を読み込んだときのsizeとshapeの意味

# 気になったこと
OpenCVで読み込んだ画像から、サイズや幅を出力するときにsizeやshapeを使うと思いますが、実際の画像ファイルとの関係が気になったので確認してみました。

# 確認した内容
適当な画像ファイル「a.jpg」のファイルをimreadで読み込んで、いろいろ表示させてみました。

``` python3
import cv2

path = "C:\\XXXXXXXXXXXXXXX\\a.jpg"
img = cv2.imread(path)

print(type(img))
print(img.size)
print(img.shape)
print("高さ " + str(img.shape[0]))
print("幅   " + str(img.shape[1]))
print("色   " + str(img.shape[2]))
```

実行結果

``` 
<class 'numpy.ndarray'>
15116544
(1944, 2592, 3)
高さ 1944
幅   2592
色   3
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/7211499e-85e4-f8af-fa3f-e4b1c75e717f.png)

確認に使用した「a.jpg」のプロパティはこのようになってました。
つまり、cv2で読み込むとndarray型になって、shape[0]で高さ、shape[1]で幅、shape[2]はビットの深さ(24ビット→3バイト)。
shape[0] × shape[1] × shape[2]の結果がsizeで出力される結果ということみたいです。
【Rails】環境構築

ターミナルの設定を弄っていたら、今まで入れていたバージョンがどこかに行ってしまったので、再度環境構築する羽目になりました。環境構築は面倒なので今のうちにメモを。

###状態確認
```
実行したコマンド
・ruby -v
・rbenv -v
・which ruby → /usr/bin/ruby
```
状況確認のため上記のコマンドを実行し、結果を見て見ると
-v コマンドで確認したものは問題無くバージョンが表示されていたが
```which ruby → /usr/bin/ruby```
```which ruby```の結果、パスが間違っているのでここを修正できると判断。

```
❌　which ruby → /usr/bin/ruby
⭕️ which ruby → /Users/user/.rbenv/shims/ruby
```

###パスとは
ファイルやフォルダの置いてある場所のこと。
・パス ＝ PC内の住所
・パスを通す　=　パスを省略できるようにする

###設定を変える
rubyの住所を変えるために、.zshrcにて変更を加える必要がある。
>.zshrcとは？
ターミナルひらくときに最初に読み込まれるファイル。
初期化コマンドや パス通す処理やエイリアス(=別名,ショートカット)を記述するファイル。

```
変更手順
① .zshrcを開く　
　　　　　open ~/.zshrc

②  以下の２行を.zshrcに追加
　・　　export PATH="$HOME/.rbenv/bin:$PATH"
　・　　eval "$(rbenv init -)"

③追加した記述を保存
　　　　　source ~/.bash_profile
```

最後に状態確認にて行ったコマンドで正しい場所にできたら、
インストールしたいバージョンを指定。

###参考記事
[M1 Mac上でRubyとRailsの開発環境構築やっていきます](https://zenn.dev/osuzuki/articles/a535b2840bbea3)
[【zsh, bash】macでPATHを通す方法 - not found と出てしまったら](https://qiita.com/k3ntar0/items/eb8cdbd8eba9da388def)
[ファイルパス (file path)](https://wa3.i-3-i.info/word18264.html)
[パスとは？PATHを通すとは？](https://reserve.smart-theater.com/#/purchase/complete)
Splunk: 扱える数値の範囲について調べてみた

たまたま調べる機会があったのでメモ。

###### 実施環境： Splunk Free 8.2.2

 Splunk では、「数値」を扱うことがよくあります。
そして、その「数値」はしばしば非常に大きな値となります。
ですが実は、 Splunk で扱える「数値」の範囲には限界があります。

試しに、以下のSPLを実行してみます。
 pow は乗算を表す関数で、ここでは2を何回か掛け算した値に1を足した値を計算しています。

```Splunk:Splunk
| makeresults count=100
| streamstats count AS CNT
| eval NUM = pow(2, CNT) + 1
| eval CHK = if(NUM % 2 = 1, "T", "F")
| where CHK = "F"
| head 1
| table CNT, NUM
```

![スクリーンショット 2021-12-05 17.01.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/988aca3e-71ad-027b-7936-0e7a51882109.png "2のn乗")

上記を見ると、2の53乗に1を足した値が「2で割って1余る値ではない」、すなわち「奇数ではない」ことになっています。
これは明らかにおかしいです。
2の53乗は「9,007,199,254,740,992」なので、この値の周辺の数値の下1桁の動きを見てみます。

```Splunk:Splunk
| makeresults count=10
| streamstats count AS CNT
| eval NUM = 9007199254740987 + CNT
| table CNT, NUM
```

![スクリーンショット 2021-12-05 17.04.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7dafdddc-645e-6c91-1ca9-aaefd25fe456.png "+1ずつ")

ちょうど「9,007,199,254,740,992」を境に、下1桁の動きがおかしくなっているのがわかります。

 Splunk もプログラムの1つである以上、1つの数値が入る「箱」には当然限界があります。
この「箱」のサイズ上、2の53乗 =「9,007,199,254,740,992」(およそ9000兆、桁数なら16桁)が正確に整数を扱える範囲のようです。

マイナス方向も、結果は同様となります。

```Splunk:Splunk
| makeresults count=10
| streamstats count AS CNT
| eval NUM = -9007199254740987 - CNT
| table CNT, NUM
```

![スクリーンショット 2021-12-05 19.37.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b2be2d2e-b66d-057b-2d89-d22f461d4512.png "-1ずつ")

逆に、非常に小さい値についても確認してみましょう。
試しに、以下のSPLを実行してみます。
先ほどとは逆に、1を何回か2で割り算した値に1を足した値を計算し、それが「1より大きい値か」=「1に丸められていないか」を確認します(ちなみに、これで求められる「1より大きい最小の値と1の差」を「計算機イプシロン」と呼ぶそうです)。

```Splunk:Splunk
| makeresults count=100
| streamstats count AS CNT
| eval NUM = pow(2, CNT * -1) + 1
| eval CHK = if(NUM > 1, "T", "F")
| where CHK = "F"
| head 1
| table CNT, NUM
```

![スクリーンショット 2021-12-05 17.06.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3f43c4e7-e52c-07f1-23bd-f01cb0747d49.png "2の-n乗")

2の-53乗に1を足した値が「1に等しい」となっています。2の-53乗は0.00000000000000011...なので、小数点以下の桁数も16桁くらいが限界となります。

上記くらい大きい、または小さい値を扱うことはそうそうありませんし、あってもそのような細かい誤差まで気にすることは少ないと思います。
ただ、長期間の統計で合計値を計算してこのような大きい値が出てきたり、小さい値での誤差が計算を重ねるうちに無視できない丸め誤差を生じさせたりする可能性もあるので、注意が必要です。

ちなみに、この扱える値の範囲を考えると、どうやら Splunk における数値は「倍精度浮動小数点型」(標準規格「IEEE 754-2008」における「Binary64」)という形式を採用しているようです(きちんと確かめたわけではありませんが)。この形式は64ビットのデータ長を持ち、うち符号部は1ビット、指数部は11ビット、仮数部は52ビットとなります。なお、標準規格「IEEE 754-2008」に準拠しているなら、符号部/指数部/仮数部と数値の関係は以下のようになります(仮数部は小数であることに注意)。

```math
(-1)^{符号部}×2^{指数部-1023}×(1+仮数部)
```

ところで、標準規格「IEEE 754-2008」における「Binary64」では、指数部のビットが全て1の場合は特別なパターンを表す値として予約されています。
そのため、指数部の最大値は$2^{11}-1-1=2046$となります。
仮数部は1未満の小数なので、$2^{2046-1023+1}=2^{1024}$以上の数値は「Binary64」では表現できないことになります。
では、そのような値について、 Splunk はどう表現するのでしょうか。
答えは以下の通りです。

```Splunk:Splunk
| makeresults count=1
| eval NUM = pow(2,1024)
| table NUM
```

![スクリーンショット 2021-12-05 20.40.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/5b79c0b9-58ba-a38f-5ebd-b52d56085db4.png "Infinity")

「Infinity」=「無限大」と出力されました。
まあ、ここまで大きな値を使用することはないと思いますが。
ラズパイの画面をPCに表示させて効率よい開発をしよう


ラズパイを使うときは、モニター、キーボード、マウスを接続してましたが、そんな面倒から解放される方法を見つけました。

（参考記事）
・[VNCでRaspberry Piにリモートデスクトップ接続 (Windows/Mac/Linux対応)](https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-vnc/)

<br>
## 環境
動作確認OS
・Windows10
・macOS Catalina

ラズパイ
・ Raspberry Pi 3


##ラズパイ設定
ラズパイにモニター、マウスを接続し、モニターを見ながら以下を設定

設定 ＞ Raspberry Piの設定

[![Image from Gyazo](https://i.gyazo.com/2df570ae76afc8618bc17111bceb90e4.png)](https://gyazo.com/2df570ae76afc8618bc17111bceb90e4)


「インターフェイス」＞　VNCの項目を「有効」にチェック　＞「OK」をクリック
※最初「OKボタン」を見当たらず凄く悩んだ。OKボタンがモニターに表示される位置までドラッグして引っ張り出そう。
[![Image from Gyazo](https://i.gyazo.com/fb107134e3690a5815790a7dfeb8882f.png)](https://gyazo.com/fb107134e3690a5815790a7dfeb8882f)

デスクトップ上にVNCサーバーのアイコンが出現するので、クリック

[![Image from Gyazo](https://i.gyazo.com/795e5244adde07ff6247c81dc14dd063.jpg)](https://gyazo.com/795e5244adde07ff6247c81dc14dd063)

以下の通り、Raspberry PiのIPアドレスが表示される。
後でVNC Viewerから接続する際に必要になるので、メモする。

[![Image from Gyazo](https://i.gyazo.com/038cd8cb93041e6ff2f6eed24ab59962.png)](https://gyazo.com/038cd8cb93041e6ff2f6eed24ab59962)

##VNC

PCにVNCをインストール　
https://www.realvnc.com/en/connect/download/vnc/

インストールされたら
VNC Viewer　を起動

さっきメモしたIPアドレスを入力
[![Image from Gyazo](https://i.gyazo.com/d301b44029d1c92fb0afdd31077b98b1.png)](https://gyazo.com/d301b44029d1c92fb0afdd31077b98b1)


ラズパイの画面がPCで表示された！

![260867492_4584619648253200_7607945217363022811_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/88dd80df-2b47-4afd-3747-b0899f24c773.jpeg)




<br>
Arch Linux で wifi が使えなくなった時の対策

次のような状態で wifi が使えなくなった時の解決方法です。
wifi を次のコマンドで接続していましたが、使えなくなりました。

```bash
sudo netctl start hw02g
```

```text
The interface of network profile 'hw02g' is already up
```

```text
# netctl status hw02g
× netctl@hw02g.service - Networking for netctl profile hw02g
     Loaded: loaded (/usr/lib/systemd/system/netctl@.service; static)
     Active: failed (Result: exit-code) since Sun 2021-12-05 20:25:33 JST; 5s ago
       Docs: man:netctl.profile(5)
    Process: 1727 ExecStart=/usr/lib/netctl/network start hw02g (code=exited, status=1/FAILURE)
   Main PID: 1727 (code=exited, status=1/FAILURE)
        CPU: 12ms

Dec 05 20:25:33 iwata systemd[1]: Starting Networking for netctl profile hw02g...
Dec 05 20:25:33 iwata network[1727]: Starting network profile 'hw02g'...
Dec 05 20:25:33 iwata network[1727]: The interface of network profile 'hw02g' is already up
Dec 05 20:25:33 iwata systemd[1]: netctl@hw02g.service: Main process exited, code=exited, status=1/FAILURE
Dec 05 20:25:33 iwata systemd[1]: netctl@hw02g.service: Failed with result 'exit-code'.
Dec 05 20:25:33 iwata systemd[1]: Failed to start Networking for netctl profile hw02g.
```

#解決方法#

```bash
# ip link set wlp2s0 down
# netctl start hw02g
```
Cloud FunctionsのHttpsErrorのコード属性と内容について

# はじめに

クライアントからCloud Functionsの関数を呼び出すことが可能なhttpsCallable関数のエラーを処理するためには、**functions.https.HttpsError**のインスタンスをスローする必要があります。

ですが、エラーのコード属性に何があるのか分からなかったので、型定義ファイルから読み取っていきます。
# コード属性一覧

型定義ファイルには、Cloud Functionsのコード属性はgRPCと同一という記述があります。

```bash
The set of Firebase Functions status codes. The codes are the same at theones exposed by gRPC here: 
https://github.com/grpc/grpc/blob/master/doc/statuscodes.md
```

中身をまとめると、以下の表のようになります。


|コード属性  |ステータス  |内容  |
|---|---|---|
|ok  |200 OK  |エラーではありませんでした。  |
|invalid-argument  |400 Bad Request  |クライアントが無効な引数を指定しました。  |
|failed-precondition  |400 Bad Request  |システムが操作の実行に必要な状態にないため、操作が拒否されました。  |
|out-of-range  |400 Bad Request  |有効な範囲を超えて操作が試行されました。  |
|unauthenticated  |401 Unauthorized  |操作に有効な認証情報がありません。  |
|permission-denied  |403 Forbidden  |呼び出し元には、指定された操作を実行する権限がありません。  |
|not-found  |404 Not Found  |一部のリクエストされたエンティティ（ファイルやディレクトリなど）が見つかりませんでした。  |
|already-exists  |409 Conflict  |クライアントが作成しようとしたエンティティ（ファイルやディレクトリなど）はすでに存在します。  |
|aborted  |409 Conflict  |同時実行の問題が原因で、操作が中止されました。  |
|resource-exhausted  |429 Too Many Requests  |ファイルシステム全体の容量が不足している可能性があります。  |
|cancelled  |499 unknown  |呼び出し元によって操作がキャンセルされました。  |
|unknown  |500 Internal Server Error  |未知のエラー。十分なエラー情報を返さないAPIによって発生したエラーは、このエラーに変換される可能性があります。  |
|internal  |500 Internal Server Error  |内部エラー。システムの不変条件が壊れていることを意味します。  |
|data-loss  |500 Internal Server Error  |回復不能なデータの損失または破損。  |
|unimplemented  |501 Not Implemented  |操作が実装されていないか、サポート/有効化されていません。  |
|unavailable  |503 Service Unavailable  |このサービスは現在ご利用いただけません。  |
|deadline-exceeded  |504 Gateway Timeout  |操作が完了する前にタイムアウトしました。  |


実際にhttpsCallable関数で**functions.https.HttpsError**のインスタンスをスローすると以下のようになります。Cloud Functionsの環境はTypescriptを使用しています。

```jsx
export const errorCheck = functions.https.onCall((data, context) => {
  throw new functions.https.HttpsError('invalid-argument', '無効な引数を指定されました。');
})
```

第一引数にコード属性、第二引数にエラーメッセージ、オプションとして第三引数に詳細メッセージを渡すことが可能です。

実際にPostmanでテストしてみると、レスポンスは以下のようになります。

![スクリーンショット_2021-12-05_16.14.39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349238/3d9bf0c5-490d-3005-7c70-f1f2cd2b56da.jpeg)


# おわりに

httpsCallable関数は、HTTPリクエスト経由で関数を呼び出した時のような、

```jsx
res.status(400).send("エラーが発生しました。")
```

の記述はできないようなので、エラー属性の表を参考にエラーハンドリングの実装をしてみて下さい。
OpsRamp 検知したアラートからインシデントを作成してクローズするまで

2021年OpsRampアドベントカレンダー12月6日分の投稿です。

# 概要

OpsRampでは検知したアラートをインシデントとして登録し、対応状況を管理することができます。
それでは使ってみたいと思います。


# アラート作成

インシデントを作成するためにアラートを発生させてみます。
OpsRamp監視エージェントをインストールして、サービス監視しているWindowsサーバにログインしてIIS管理サービスを停止します

| ![2021-1203-2058-15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/bcedadf6-67e3-9c8d-1e73-5ad1f252373f.jpeg) |
| :-- |

状態がブランクになったことを確認します

| ![2021-1203-2058-42.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/31758955-eeb6-5fa7-5d65-1b7d8d0d7758.jpeg) |
| :-- |


# インシデント作成

アラート一覧にIIS管理サービスのアラートが表示されているので、Action/statusで"インシデント"を選択します

| ![2021-1203-2100-45.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/4c9cf2e3-f62e-74c1-e4c1-9772176f88f9.jpeg) |
| :-- |

件名と説明はデフォルトで入力されているのでそのまま利用して、"作業者"の項目で"Assign to me"をクリックして自分に割り当てます。

| ![2021-1203-2101-44.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/9acd1b7f-6ee5-c1df-656a-6f7fbfec0b19.jpeg) |
| :-- |

つづけて優先度で"High"を選択し、期限も設定しておきます。最後に"保存"をクリックします。

| ![2021-1203-2102-32.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/49b83e51-355c-f495-7eac-0ac50beb799c.jpeg) |
| :-- |

アラート一覧に戻り、"select"からインシデント番号に替わっていることを確認して、このインシデント番号をクリックします。

| ![2021-1203-2102-51.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/5afd1aa4-d838-fa97-19df-757e54538acc.jpeg) |
| :-- |

インシデントの内容が表示されます。

| ![2021-1203-2104-48.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/6c6a36fc-be57-6416-cd1f-f4c48796773e.jpeg) |
| :-- |


# インシデント対応

ここから対応内容を記録していきます。コメント欄に対応内容を入力してインシデントを"Open"にします。

| ![2021-1203-2106-19.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/ba28a5cf-7ef0-129b-f599-01efc2175bbd.jpeg) |
| :-- |

今回は原因が分かっているのでIIS管理サービスを再起動して復旧させます

| ![2021-1203-2107-41.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/cdfc2709-cc49-27af-afe1-69bb5ca23b61.jpeg) |
| :-- |

実行中になりました
※ここで、サービスの再起動を検知して、アラートが自動的に復旧されます。

| ![2021-1203-2107-57.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/bc292a9e-5aa8-4178-9e8f-f9d3aec7f431.jpeg) |
| :-- |

インシデントのコメント欄に対応内容を入力して更新します。

| ![2021-1203-2109-20.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/9aec7661-7585-f651-ebcd-0b77f36089cb.jpeg) |
| :-- |

上の画面だとOpenのまま更新していますが、サービスが再起動してアラートが復旧されているので、自動的にResolvedに遷移していました。
対応が完了したのでCloseしておきましょう。

| ![2021-1203-2112-28.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/65d64074-3466-8fad-7fa6-3d1d0dcf50bd.jpeg) |
| :-- |


"ステータスフロー"のタブで状態遷移が確認できます

| ![2021-1203-2112-48.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/45c5972c-2f39-344c-47e6-10685f8bef87.jpeg) |
| :-- |


サービスデスクの一覧からも状況を確認することができます。

| ![2021-1203-2114-19.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/2f7ba73d-8e42-7a8f-9dd5-1daaf5b33d31.jpeg) |
| :-- |





おわり。
samba共有フォルダのwindows端末からのアクセスできなかったときの解決法

#はじめに
最近Linuxを使い始め、忘れないようにと備忘録を作成。
最初にsamnbaを使って内蔵HDDを共有フォルダとして構築したが、「アクセス許可が必要です」などで苦戦し、試行錯誤を重ね、やっと構築できたので忘れないように残しておく。

#環境
Ubuntu(Ubuntu 20.04.3 LTS)
システムディスク(SSD 120GB)
データ保存用HDD(1TB,4TB)

sambaのインストール、構築方法は割愛させていただく。

#sambaで共有したフォルダにアクセスができなかった
Ubuntu(Ubuntu 20.04.3 LTS)では、内蔵HDDをマウントすると初期は,'/mnt/(HDDのUUIM)'でマウントされる。
UUIMだと長すぎて面倒なので、ディスクから該当HDDを選び歯車マークをクリックし、'マウントオプション設定'を選択。ユーザーセッションのデフォルトを外し、'マウントポイント'を'/mnt/任意の文字列'に変更する。再マウントを行うと'マウントポイント'が変更されている。
この状態でsambaで共有設定を行った結果、windows端末から共有フォルダは見えるもの中身を見ようとすると「アクセスできません」と弾かれた。

```
[Share1]
   path = /mnt/str1/Share
　　以下、任意の設定
```
#試行錯誤したこと
####ユーザーアクセス許可の変更
ディレクトリの権限をnobody:nogroupやログインユーザに変更したがアクセスできなかった。
####windows側でのネットワークの設定
これもどんな設定にしてもアクセスできなかった。

#マウントポインタ変更でアクセスができるようになった
結果からすると、ディスクのマウントポイントを'/mnt/str1'としてしていたものを'/home/str1'とすることでアクセスができるようになった。
###手順
１，上記のディスクの設定から'マウントポイント'を/home/str1変更する。

２，再マウントをする。
　　マウント先が/home/str1になっていることを確認する。

３，ディレクトリ作成、権限を変更する。

```
$sudo mkdir /home/str1/share
$sudo chmod 777 /home/str1/share 
```

４，samba共有設定のpathを変更する。

```
   path = /home/str1/Share
   任意の設定
```

windows端末からもアクセスできるようになり、フォルダ、ファイルが作成ができるようになった。
#最後に
アクセス権限等を変更してもアクセスができなかったため原因が不明であった。試しにhomeディレクトリにshareフォルダを作成し、共有設定するとアクセスできたためそれを流用したら、上手く構築することができた。
linux初心者のためこれで良いのかわからないが、とりあえずこれで運用していきたいと思う。
フリーランス元年

エンジニア歴 約20年を経て、今年11月にフリーランスになりました。
私にとって2021年が「フリーランス元年」になったわけですが、自分に限った話じゃないのでは？と探してみたところ、このような記事を見つけました。

[「フリーランスが増えている」は本当か？ 統計データをもとに検証](https://goworkship.com/magazine/freelance-factcheck-1/)

こちらの記事によると、

> 一般にフリーランスとしてイメージされる「誰かに雇用されるのではなく、スキルを武器に専業で働く独立した人（＝狭義フリーランス）」に該当するのは、「自由業系フリーワーカー」と「自営業系独立オーナー」の数字を合算した859万人と推測されます。
>
> こちらの数値も、昨年の354万人から2倍以上伸びており、副業ワーカーだけでなく狭義フリーランスも増えていることが分かります。

と、実際数字としても表れているようです。


## あえて「元年」と銘打った理由

それは、この変化が今年に限ったものではなく、むしろ今後も継続/増加していくと思うからです。

私は、どちらかというと消去法（転職したくても書類審査が通らない）でフリーランスになったクチなのですが、実際始めてみると会社員だった時よりも生活満足度が確実に高い！
ずっとこのままでやっていきたいと、少なくとも今は考えています。


## 意外と案件には困らない

多くの人にとって、フリーランスを選択するときの最大の懸念が「案件が見つかるか？」だと思います。

フリーランスを始める前は「とりあえずエージェントサイトには登録するけど、過去勤めていた会社を定期的に回って、仕事あるいは別の会社を紹介していただく営業活動が必須なんだろうな」と考えていました。
しかし実際は、初手からバンバン案件を紹介してもらい、立て続けに面接を受けたら両方受かってしまって一つお断りをさせていただくような状態でした。
インターネット（エージェントサイト）万歳！

私の場合、①年齢、②地方在住、③時間給5000円以上、④週3日勤務希望　と結構厳しい条件を掲げていたのですが、それでも上記の結果です。
あれこれ考えるより、動いた方が分かることってやっぱありますね。

まず①について。転職サイトでは提出書類として履歴書と職務経歴書が求められますが、エージェントサイトでは職務経歴書のみです。よって、そもそもマイナス要因として働かなかったと考えられます。

②③はコロナに助けられたと言えそうです。
コロナによってフルリモートワークが特別な就業形態でなくなり、物理的な出社が求められなくなりました。これにより居住地の縛りが消え、首都圏にオフィスがある会社の待遇で働くことができるようになりました。
そういう会社はコロナ前からあったかもしれませんが、母数が増えたというのは確実にあると思います。

④を満たす案件はやっぱり少数だったようですが、それでも母数が十分に多ければ案件はあるなという印象です。

重要なのは「コロナが収束した後もフルリモートワークを継続する会社が結構ある」点です。
すなわち、この傾向（地方在住者でも案件に困らない状況）は今後も続くことが期待できるということです。


## というわけで

2021年はフリーランス元年だったと言っていいんじゃないでしょうか。
BrainfuckのインタプリタをC言語で作った話

# Brainfuckとは
Brainfuckはプログラミング言語の一つで、特に[難解プログラミング言語](https://ja.wikipedia.org/wiki/%E9%9B%A3%E8%A7%A3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)というのに分類されてます。ジョーク的なプログラミング言語で、チューリング完全なのでC言語と計算能力としては同等です。では、その内容を紹介します。

# 構成
Brainfuckは簡単に次の要素で構成されます。

- Brainfuckプログラム
- バイトの配列
- インストラクションポインタ（プログラムカウンタのようなもの）
- データポインタ（配列の位置を指すポインタ）
- 入力と出力のバイトストリーム

ただし、以降の説明でデータポインタのことを「ポインタ」と言うことにします。

# 命令
Brainfuckプログラムは次の８つの命令のみで作られます。

- ```>``` ポインタをインクリメントする。
- ```<``` ポインタをデクリメントする。
- ```+``` ポインタの指す先をインクリメントする。
- ```-``` ポインタの指す先をデクリメントする。
- ```.``` ポインタの指す先をASCII文字として出力する。
- ```,``` 入力から１バイトのみをASCII文字として読み、そのコードをポインタの指す先に代入する。
- ```[``` ポインタの指す先が0なら対応する次の```]```までポインタをジャンプさせる。
- ```]``` ポインタの指す先が0でないなら対応する一つ前の```[```までポインタをジャンプさせる。

上から順により簡単に言うと、１を足す、１を引く、次のバイトに移動、一つ前のバイトに移動、出力、入力、繰り返しの開始、繰り返しの終わり
といった感じです。これらの命令は[ここ](https://fatiherikli.github.io/brainfuck-visualizer/)のBrainfuck実行環境を見ると非常に理解しやすいかと思います。

# プログラム例

＜プログラム①＞

```
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+.+.>++++++++++. 
```

＜実行結果①＞

```
ABC（改行）

```

最初の状態ではバイト列はすべて0で初期化されており、かつポインタはバイト列の先頭を指しています。

プログラムの先頭65個の```+```でバイト列の先頭に65を代入しています。
次にポインタの位置をそのままにして```.```で出力を命令しています。
65はASCIIコードで"A"ですから、"A"が出力されます。
そしてポインタの位置をそのままに```+.+.```で66="B" , 67="C"を出力し、```>```でポインタ次のバイトに進めます。
```+```を10個使って10を代入し出力します。10はASCIIコードで改行にあたります。

＜プログラム②＞

```
+++++++++++++[>+++++>+++++>+++++<<<-]>.>+.>++.
```

＜実行結果＞

```
ABC
```

まず先頭に13を代入します。これは繰り返しのカウンタとして使います。
```[]```の中で２，３，４番目のバイトに５を足して、ポインタをバイト列の先頭まで戻して１を引きます。
これで```[]```の中身を13回繰り返すことになり、２，３，４番目のバイトに65がそれぞれ入っていることになります。
ループを抜け出した状態でポインタは先頭にあるため一つ進めて出力、一つ進めて１足して出力、一つ進めて２足して出力をすることで"ABC"を出力しています。

# インタプリタを作る

簡単な仕様なのでC言語で十分Brainfuckの実行を再現するインタプリタのようなものが作れます。ということで実際に作ってみました。ソースコードはこれです。
https://github.com/yakishamo/BFI/blob/main/main.c

コマンドライン引数としてBrainfuckのコードを渡すも良し、渡さなければプログラム中で貼り付けることになります。
Brainfuckの仕様では、命令以外の文字は無視して次の命令に進むとされていますが、それでは不便なので上記の８つの記号以外が読み込まれた場合はエラーを吐いてプログラムが死にます。

大まかな流れとしては、コマンドライン引数が与えられているか見て、なければ入力待ち状態にして、Brainfuckプログラムを配列に格納できたらwhile文でswitch文をグルグル回していきます。

実際にBrainfuckしてみました。

```
$.\Brainfuck.exe
input:: +++++++++++++[>+++++>+++++>+++++<<<-]>.>+.>++.
ABC
```

成功しました。

# まとめのようなもの

BrainfuckのインタプリタはC言語であれば比較的簡単に作ることが出来ました。他の言語でインタプリタを作ってみても、言語によって処理速度が違ったりして面白いかもしれません。また、Brainfuckのように難読化を目指したプログラミング言語を自分で考えてみるのも良さそうです。（自分は考えようとしましたがいいアイデアが浮かびませんでした。）

# 追記（2021/12/06）
```[``` と```]```の処理で、自分のインタプリタだと２重のループに対応できないことを指摘され、自分でも確認したのでこれの修正を後日行います。
Go の log.Fatal は気軽に使ったあかん！

## log.Fatalはアプリケーションの実行が終了されるので、気軽に使うのはやめましょう！

`log` pkgの中身は以下

```go
// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v ...interface{}) {
    std.Output(2, fmt.Sprint(v...))
    os.Exit(1)
}
```

`os.Exit(1)` されてるので、アプリケーションの実行が終了される。
なのでとりあえずログに吐きたい時は `log.Println` などにしましょう。
`log.Println` だとexitされないです。

`log.Println` のsrcは以下

```go
// Println calls Output to print to the standard logger.
// Arguments are handled in the manner of fmt.Println.
func Println(v ...interface{}) {
	std.Output(2, fmt.Sprintln(v...))
}
```

## 参照
- https://cs.opensource.google/go/go/+/refs/tags/go1.17.2:src/log/log.go;l=316
- https://pkg.go.dev/log
LPIC 101 パーミッションの設定

LPIC1勉強の備忘録です。
 
<h2>アクセス権の変更</h2>
<h3>chmod</h3>

|オプション|説明| 
|:-----------|------------|
|-R|指定したディレクトリにある全ファイルのアクセス権を変更する|

アクセス権限

|対象|説明| 
|:-----------|------------|
|u|所有者|
|g|グループ|
|o|その他のユーザー|
|a|全てのユーザー|

|操作|説明| 
|:-----------|------------|
|+|権限を追加する|
|-|権限を削除する|
|=|権限を指定する|


|許可の種別|説明| 
|:-----------|------------|
|r|読み取り許可|
|w|書き込み許可|
|x|実行許可|
|s|SUIDもしくはSGID|
|t|ステッキービート|

SUID、SGID、ステッキービート

|名称|アクセス表記|文字|説明| 
|-----------|------------|------------|------------|
|SUID|4000|u+s|指定したファイルは<br>所有者のアクセス権限で実行できる|
|SGID|2000|g+s|指定したファイルまたはディレクトリは<br>グループのアクセス権限で実行できる|
|ステッキービット|1000|o+t|スティッキービットが設定された<br>ディレクトリ以下のファイルとディレクトリは実際に設定したアクセス権に関係なく、<br>所有者とrootユーザのみが名前の変更と削除を行えます。|

<h2>デフォルトのアクセス権</h2>
<h3>umask</h3>
ファイルやディレクトリを作成した時に設定されるアクセス権はumask値で決定されます。
ファイルは「666」ディレクトリは「777」からumask値を引いた値がデフォルトのアクセス権として適用されます。

umaskはユーザ毎に設定されています。オプションなしで実行すると現在のumask値を確認できます。

```
$ umask
0022
```

<h2>ファイルの所有者管理</h2>
<h3>chown</h3>
ファイルやディレクトリの所有者を変更。
変更できるのはrootユーザーだけです。

|オプション|説明| 
|:-----------|------------|
|-R|指定したディレクトリとその中にある全ファイルの所有者を変更する|

```
# chown test:testgrp test.txt
# chown test,testgrp test.txt
//区切り文字は ， でも指定可能
```

<h3>chgrp</h3>
ファイルやディレクトリの所属するグループを変更。
一般ユーザでも使うことができるが、その際に変更できるグループは
実行ユーザーが所属するグループに限られます。

rootの場合はどのグループにでも変更することができます。

|オプション|説明| 
|:-----------|------------|
|-R|指定したディレクトリ　とその中にある全ファイルの所有者を変更する|


<h2>参考</h2>
<a href="https://www.amazon.co.jp/dp/B07P5S98SK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1">あずき本</a>

https://www.infraeye.com/study/linuxz27.html
ドローンについて

Phantomやmavicなどのドローン

皆さんのドローンもこうしたドローンではないでしょうか

私が所有しているドローンも、Phantom、sprak、mavic miniなど

回転翼機と分類されるドローンです。

しかし昨今話題のレベル４の飛行や長距離飛行のドローンは

固定翼機やVTOL機が主流のようです。

そうした中で気になるドローン。

それがこの「HAMADORI」です。
![IMG_0735.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355513/9a224895-ec5e-7cce-88ad-f1da3db275dd.jpeg)

雨が大敵のドローン。しかしこのHAMADORIは飛行艇型！！

防水仕様のドローンなのです！

海、河川、ダム、湖、池　水があれば離着陸可能ということで島国の日本に最適な機体でした。
震災、風水害の際も天候に左右されることなく飛行できる。

陸のAEROBOwing 海のHAMADORI　この2種類が保有できるといかなる環境下でも活動できる！
なんて思うのですが、コスト面の深い深い溝。
超個人的要望としては、HAMADORIに垂直離着陸機能が追加されたら・・・

HAMADORIの飛行に携わりたい！なんて欲望も持ちつつ、この記事を書いてみました。

ドローン、災害ボランティアに興味がある方は是非「dronebird」で検索。
紅の豚を連想させるHAMADORIに興味ある方は、「スペースエンターテインメントラボラトリー」で検索をしてみてください。　福島県南相馬市で開発中の機体です。

続々登場する新しいドローンが欲しくて欲しくて堪らないそんな私の記事でした。
サンタさん、クリスマスプレゼントに新しいドローンをお待ちしています！！
ControlSystems.jl を使ってみる

https://qiita.com/advent-calendar/2021/thesense
the sense アドベントカレンダー2021の5日分です！

# ControlSystems.jl

[Julia](https://julialang.org/)で制御工学をするパッケージです。
本記事では伝達関数を定義して周波数解析のBode線図と過渡解析もやります。

# 実行

Jupyter Notebookで実行しています。

## パッケージ読み込み

```
using ControlSystems
```

## 伝達関数の定義

ここでは一例として伝達関数$G(s)$が次のような式で表されるRCローパスフィルタを扱います。
$$
G(s) = \frac{ \frac{1}{CR} }{ s + \frac{1}{CR} }
$$

$R = 1 \text{k}\Omega, ~~ C = 1 \mu\text{F}$としておきます。

ControlSystems.jlの[`tf`](https://juliacontrol.github.io/ControlSystems.jl/latest/man/creating_systems/#tf-Rational-Representation)で次のように定義します。

```Julia
R = 1 * 10^3
C = 1 * 10^(-6)

G = tf(1/R*C, [1,1/R*C])
```

## ボード線図

ControlSystems.jlの[`bodeplot`](https://juliacontrol.github.io/ControlSystems.jl/latest/lib/plotting/#ControlSystems.bodeplot)でBode線図を出力します。 Plots.jl を使っていて、`Plots.plot`のパラメータが入れられます。

```Julia
bodeplot(G)
```

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537455/004ae123-57d3-dc36-1258-b5d479dbd151.png">

## インパルス応答

ControlSystems.jlの[`impulse`](https://juliacontrol.github.io/ControlSystems.jl/latest/lib/timefreqresponse/#ControlSystems.impulse-Tuple{AbstractStateSpace,%20AbstractVector{T}%20where%20T})でインパルス応答を生成します。 図の出力には Plots.jl を使いました。

```Julia
using Plots

y, t, x = impulse(G)
plot(t, x', xlabel="Time [s]", legend=false, xlims=(0, 10^(10)+10^9))
```

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537455/b540610d-4d11-a0e6-6bb7-3d52d58e5e2c.png">

# 最後に

お手軽に伝達関数からBode線図を出力できるので、このパッケージの関数で伝達関数を生成できる場合には使えそうです。

# 参考

https://juliacontrol.github.io/ControlSystems.jl/latest
[ServiceNow]ナレッジ管理関連のTBL構成についてまとめてみた

ServiceNowのナレッジ管理を触ってみたところ通知の作成で少し苦労しました。
そのため、キーとなるナレッジ関連のTBL構成について少し書きます。
ナレッジ管理のOOTB機能を多少理解されている方向けに記載します。

#ナレッジ管理関連のTBL構成について

##Version
- Orland

##ナレッジ（kb_knowledge）TBL
概要：ナレッジ記事の情報を持つTBLです。
![ナレッジTBL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/1b60a8a4-d29a-845e-e856-4ffee78faecb.png)

##ナレッジフィードバック（kb_feedback）TBL
概要：ナレッジ記事に対するコメント情報を持つTBLです
![ナレッジフィードバック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/3a46c75d-c7f2-00c3-c673-cd37e5f54204.png)

スキーママップを見ます。
もちろんナレッジとナレッジフィードバックTBLは参照関係にあります。
![スキーママップ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/bae9af07-3706-eda3-09a6-058d9bc84eac.png)

##ソーシャル Q&A の質問（kb_social_qa_question）TBL
概要：ナレッジベースへ投稿された質問の情報を管理するTBLです。

##ソーシャル Q&A の回答（kb_social_qa_answer）TBL
概要：ナレッジベースへ投稿された質問への回答情報を管理するTBLです。

スキーママップを見ます。
もちろんソーシャル Q&A の質問とソーシャル Q&A の回答TBLは参照関係にあります。
![スキーママップ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/22406754-cd12-5291-a2b9-c57ed40327e0.png)

##社会的な Q&A の登録（kb_social_qa_subscribe）TBL
ここでもう一つ注目したいのが、社会的な Q&A の登録TBLです。
![スキーママップ3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/d0f417d2-35b3-38c4-d433-8d9ee96197f8.png)
ソーシャル Q&A の質問TBLから参照されています。
親子関係を考えると、
###親：社会的な Q&A の登録
###子：ソーシャル Q&A の質問
と考えられます。このTBL関係を把握できていると、通知本文に表示する内容のドットウォークで役に立つことがありそうです。

とここまで書いたのですが、
ソーシャル Q&Aの機能はParisから「Customer Service Management」に移動しているみたいですね。。
ParisからServiceNow始めた人には役に立たなそうです。。。
blenderを始めよう

[Iwaken Lab.「好きな技術・コト」 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/iwakenlab)の19日目の記事です。
<br>
はじめまして。Biscuitです。
好きな技術・コトということで、この記事ではblenderの簡単な紹介をしようかなと思います。

**blenderって最近聞いたけど何だろう…？**
**ちょっと興味あるけど、何から始めればいいんだろう…？**
という方のはじめの一歩を踏み出すきっかけになればうれしいです。
<br>
<br>


# blenderで何ができるの？

とりあえず、載せておきますね。
>**Blender（ブレンダー）はオープンソースの統合型3DCG製作、2Dアニメーション製作、VFX向けデジタル合成、動画編集ソフトウェアである。**

https://ja.wikipedia.org/wiki/Blender


<br>
あとはこれを見ましょう。ワクワクします。
<iframe width="560" height="315" src="https://www.youtube.com/embed/QRqY_20ti9A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


できることが多すぎるので、入り口は本当に様々だと思います。
ちなみに私の入り口は王道のモデリングからでした。（CG作れたらかっこいいな～って感じ）
<br>
<br>
<br>
これだと普通の紹介になってしまうので、実生活で役に立ったことを一つ。
**部屋の家具配置、レイアウトのシミュレーションができます…！**


引越しの時に実際に使ったもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355539/4f8a84a8-d375-bad8-4df6-cd73678bda09.png)
かなり雑ですが、これだけでも配置のイメージがしやすくなりますよ！
<br>
<br>
極めるとこの方のようになれます。いや～ほんとにすごい。

https://twitter.com/tobalog/status/1466972174796095490?s=20

<br>
これでblender使ってみたくなりましたね！


# どうやってやるの？
ここまで読んでくれた方は「**何から始めればいいの…**」となっていることでしょう。
そうなんですよ。blenderやれることが多すぎてどこから手を付ければいいかわからない問題。
<br>
でも安心してください。ここ最近急激に**チュートリアル動画**が増えています。
なので、これを作りたい！というのがあってもなくても、まずはチュートリアルを何個かやってみることをお勧めします。
そこで基本的な操作を覚えてしまいましょう。
<br>
（操作をすべて覚えるのはほぼ不可能に近いです。親切な方が**こんなこともできるよ！ツイート**をしてくれるので、徐々に引き出しを増やしていきましょう！）
<br>
今回は、一番最初にやるべきおすすめチュートリアルをご紹介します。
<iframe width="560" height="315" src="https://www.youtube.com/embed/nIoXOplUvAw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

ドーナツです。これ一択です。~~言い過ぎかもしれない~~
   
* とにかくわかりやすい。（英語だけど、今どこを押したのか表示してくれているので何とかなります。）
* 一通りの操作が学べる。
* **めちゃくちゃリアルなドーナツが作れる。（ここ重要）**
    * 初心者に感動と夢を与えてくれます。

<br>

もちろん他にもたくさん良い動画はあるので、「**blender tutorial**」で検索です。
「blender チュートリアル」だと日本語の動画もたくさん出てきます。ほんとにありがたいです。
<br>
ちなみに、バージョン**3.0**がリリースされたばかりなので、ほとんどの動画が古いバージョンのチュートリアルですが
少なくともバージョン**2.8**までなら特に困ることなくチュートリアルができると思います。
(バージョン**2.7**を使ったチュートリアルは見た目が違うのでちょっと手こずる可能性ありです。)

<br>
あとはインストールするだけですね！


# インストールしてみようかな…？
ありがとうございます。この記事の目的達成です。
<br>
こちらからダウンロードできます。
https://www.blender.org/
<br>
1. Download Blenderをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355539/fe2ff669-e607-121f-1ca7-62bb8c135fbe.png)
2. Download Blender 3.0をクリック（お使いのパソコンに合ったものを選びましょう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355539/bc5ecd73-4998-5f8b-3439-3d2e316d5a9b.png)

<br>
インストールに関してそんなに難しいことはないと思いますが、分からないことがあればコメントください。
好きなものをたくさん作っていきましょう！
最後まで読んでいただき、ありがとうございました。
【venv】仮想環境構築からjupyter notebookの導入まで

仮想環境を構築していく。

raspberry pi上でpythonを動かす際に，仮想環境について学びなおした。

参考
https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e


##venv
venvを用いて仮想環境を構築することにより，プロジェクト頃にpipでインストールした情報を独立させることができる。

1. pythonのバージョンの確認<br>
```python3 -V```
2. 作業ディレクトリ上で過疎環境の作成<br>
```cd [作業ディレクトリ]```<br>
```python3 -m venv [仮想環境の名前]```
2. 仮想環境に入る　Activate for Linax, Mac<br>
```source [仮想環境の名前]/bin/activate```<br>
2. 仮想環境に入っている場合は$の前に，[仮想環境の名前]が書いてある。
2. 仮想環境を終了する。<br>
```deactivate```

仮想環境で作業する際には，仮想環境に入りpython3と入力すればよい。

##jupyter notebook
仮想環境上で，jupyter notebookを動かせるようにする。

1. 仮想環境に入る。上記のvenvの項目の2. と3.を行う。<br>
```pip install jupyter```
1. raspberry piの場合は以下のコマンドでnumpyを使えるようにする。<br>
```sudo apt-get install libatlas-base-dev```<br>
```pip3 uninstall numpy```<br>
```apt install python3-numpy```<br>

##一言
個人的には，仮想環境を考えずにgoogle colabを使うのが便利だと思う。<br>
raspberry piなどで長時間コードを走らせる際には，仮想環境やパッケージの管理をしっかり行う必要が出てくるだろう。
Oculus QuestのPassthrough APIでブラックアウトしてしまう


#はじめに
Oculus Questで透過型ARを体験できる[Passthrough API](https://developer.oculus.com/blog/mixed-reality-with-passthrough)において，外の映像がブラックアウトしてしまうという問題がありましたので現時点（2021年12月5日）における原因と解決法について記録しておきます．

ためになる記事というよりは，出た障害に困っている人がいればと思い書かせてもらいます．

#環境

* Unity(2019.4.2f1)
* Oculus Integration(ver34.0)
* Oculus Quest(1,2両方で同様の現象が発生)

実装自体は，海外Youtuberの[この動画](https://www.youtube.com/watch?v=SJANudr3Wu0)を参照しながら実装しました．

#原因
この原因は，僕がUnity AssetstoreからインストールしたOculus Integration(ver34.0)を利用していたからでした．このOculus IntegrationのOVRPluginのバージョンが古いことが悪さをしているのではないかと思います．

#解決方法
ここまで書けばわかると思いますが，[Oculus Integration SDK](https://developer.oculus.com/downloads/package/unity-integration/)(ver34.0)をOculusのデベロッパーサイトからダウンロードするとうまく動くようになりました．同じ沼にハマった人がいればこれで解決するのではと思います．
GitHub Actions で .kts ファイルを実行して APK の差分を抽出してみた

この記事は [ゆめみ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/yumemi) の 5 日目の記事です。

## はじめに

みなさんは、Kotlin のスクリプト言語としての機能を使ったことはありますか？

Android アプリの開発で `.kts` という拡張子のファイルを Gradle で使っているよ！という方は、ちょっぴりいるのかなと思います。

以前は、サポート機能がまだまだ少なく、IDEA のコード補完も効かないなどありましたが、最近、どんどん強化・改善がされ、少しずつ使いやすくなってきました。

GitHub Actions に Kotlin がプリインストールされていて、せっかくなので APK の差分を抽出してみました :muscle: 

### 成果物

https://github.com/blendthink/android-diff-action

※ GitHub Marketplace へも近日リリース予定です :v:

### 実際の動作

https://github.com/blendthink/android-diff-action-demo/pull/1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165251/b5ab08c4-abe2-9033-8af8-38f6dda11346.png)

## スクリプト言語としての機能について

### さよなら Gradle

:::note warn
Gradle ファイルは必要ありません
:::

### ライブラリを使いたいときは？

```kotlin
// ライブラリをインストールしてくるリポジトリを記載
@file:Repository("https://repo1.maven.org/maven2/")

// 使用するライブラリを記載
@file:DependsOn("eu.jrie.jetbrains:kotlin-shell-core:0.2.1")

// ライブラリで使用するものを記載
import eu.jrie.jetbrains.kotlinshell.shell.*
```

ファイルの数が増えなくて快適です :relaxed:

### シェルコマンドを実行したい場合はどうするの？

公式でのドキュメントは見つかりませんでしたが、以下のライブラリを使って解決しました :sunglasses: 

https://github.com/jakubriegel/kotlin-shell

書き方はいろいろありますが、こんな感じで書けます :sunny:

```kotlin
shell {
    "echo hello"()
}
```

```kotlin
shell {
    val echo = systemProcess {
        cmd { "echo" withArg "hello" }
    }
    echo()
}
```

```kotlin
shell {
    val echo = "echo hello".process()
    echo()
}
```

ライブラリの作成者に感謝 :pray:

## APK の差分の抽出

Android SDK のコマンドラインツールに含まれている apkanalyzer を利用します :tools: 

GitHub Actions には Android SDK のコマンドラインツールもプリインストールされているため、自分でインストールする必要がないのはいいですね :sparkles:

### Kotlin の恩恵

apkanalyzer の結果をゴニョゴニョしたい時にとても恩恵を感じました。

以下のコードは「タブ文字を "|" に変換して、 差分が~Bと表示されているものは除外する」という処理です。
これをシェルスクリプトでやろうとするとけっこう大変ですよね :cry: 
（日常的にシェルスクリプトを触っている方であればそうでもないのでしょうか。。）

```kotlin
val compare =
    result("apkanalyzer -h apk compare --different-only $baseApkPath $targetApkPath")
        .replace("\t", "|")
        .split("\n")
        .filter { !it.contains("""\dB.+$""".toRegex()) }
        .joinToString("\n")
```

## おわりに

Kotlin のスクリプト言語機能を活用して、とても快適に GitHub Actions を開発することができました。
今後もどんどん活用していこうと思います :qiitan: :lgtm:

ぜひ、みなさんも Kotlin のスクリプト言語機能をご活用ください！

### 参考

https://kotlinlang.org/docs/command-line.html#run-scripts

https://developer.android.com/studio/command-line/apkanalyzer?hl=ja

https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-README.md

https://docs.github.com/ja/actions/learn-github-actions/workflow-commands-for-github-actions#using-workflow-commands-to-access-toolkit-functions

https://docs.github.com/ja/actions/learn-github-actions/workflow-commands-for-github-actions#adding-a-system-path

https://github.com/jakubriegel/kotlin-shell-examples
【HTTPヘッダ, 検証モード】APIにリクエストをしたときのリクエスト・レスポンスヘッダを確認する。

#概要
こんにちは、今日はAPIにリクエストを行った時のリクエストヘッダとレスポンスヘッダの確認方法を説明します。
自分はフロントエンドからRailsで開発したバックエンドのAPIにPOSTを行ったのですが、その際にCookieをしっかり渡せているかの確認のために用いました。

#手順
1. 実際にHTTPリクエストを行うページをブラウザで表示する。（例）```https://localhost:3000```など
1. 右クリックし、検証をクリック
1. Elementsの右側にあるNetworkを選択する。
1. Networkを選択した後に実際にHTTPリクエストを行う。
（例）ブラウザ上に配置したボタンなどをクリック
1. Nameという行に行ったHTTPリクエストのURLに対応するものが表示されるのでそこをダブルクリック
1. リクエストヘッダとレスポンスヘッダが表示される

#注意事項
以上のようにすれば基本的にすんなりとできると思います。
注意事項としては

+ GoogleChromeで開けていない
+ Networkが >> のボタンに隠れている
+ Networkのボタンを押す前にHTTPリクエストを送ってしまっている。

などが挙げられると思います。

#まとめ
自分はCookieをバックエンドへ送る必要があったため、この検証機能を利用して、リクエストヘッダの中身を確認しました。
他にはCSRF対策で用いられるCSRFトークンがきちんと送られているかといった確認にも用いることができると思います。
割とよく使う機能だと思うのでぜひやってみてください！
Tableau Publicで 「リレーションシップ」と「インナージョイン」の操作

##2つのテーブルの連携・結合

[前回](https://qiita.com/text_owleyes/items/374a7fa02903c77ce489)、**「Tableau Public」**を使用した際、**「消費支出」**と**「ネットショッピングの支出額」**と、それそでソースが異なるデータを同じ時間軸で扱いました（データ出典は総務省統計局）。
2つのテーブルを連携させる操作を思い出すのに多少てこずったので、メモとして記しておきます。

「消費支出」は、下記のように地方ごとに列が並ぶデータを用意しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/d19bffb7-e72a-51cf-5934-ed602887960c.png)

「Tableau Public」に取り込み、扱いやすいように地方別の列を2列にまとめます。
**「ピボット」**を実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/965a828e-dfed-028b-5296-6f5a33201f5d.png)

時間軸は日付型にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/706e8244-56b8-1f93-dd97-d1849919ef86.png)

一方、「ネットショッピングの支出額」のデータは、地域を既に1列にまとめています。
こちらも「Tableau Public」に取り込みます。
（後から取り込んだデータは、最初に取り込んだデータをそのままのスタイルで連携させることが優先されるためか、調べた範囲では「ピボット」を適用できなかっので、まとめた状態で取り込んでいます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/26e7dcf1-3d63-12d8-f8db-a3c5538c46cc.png)

「リレーションシップ」を定義する方法を使います。
取り込んだ直後は、連携させる（キーとする）列が見つからず、エラーが出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/0d445931-896e-0b1a-4e4f-1d0e7ad06a04.png)

両方に日付型の列があるので、手動で指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/7cbd35d1-6d49-f831-cedc-36c72baf84cc.png)

エラーはなくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/dfdc2af6-14d2-e56c-f481-7e9b2b12e98e.png)

「ワークシート」に移り、グラフを作成します。
「インターネット支出」の数値は2015年からなので、グラフの起点が異なります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/e0be7d76-a0ab-7709-db31-d9180d4ebc35.png)


##INNER JOIN

別の方法で2つのテーブルを連携・結合させることもできます。
最初に取り込んだ「消費支出」のデータから**「開く」**を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/88f1384c-e967-e509-ca73-9ffbe227a51a.png)

開いたエリアに、「インターネット支出」のデータをドラッグ&ドロップします。
インナージョイン（INNER JOIN：内部結合）を選びます。
INNER JOINは、重なるデータのみ抽出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/95b850fa-6868-7b2d-b0fc-e9b3ab3a6dd6.png)

先ほどと同様に時間軸を連携させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/388e54c9-e44e-8112-ed43-0736d56c949f.png)

今回は、「消費支出」のデータに「インターネット支出」の列が後ろに追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/e636d8e8-b94f-0007-019c-78fb0370d6f8.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/aa889719-885e-8aab-110c-30a31f184c02.png)

「ワークシート」に移り、グラフ作成。
先ほどと異なり、「重なる部分の抽出」が実行されたので、「消費支出」の推移も、「インターネット支出」と同じ2015年から始まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/375d55fa-7b6f-c4b5-f3b0-f86fa769a569.png)

実際には、合計値でなく平均値に変更したり、エリアのフィルタリングしたりなど細かい操作もしています。

**了**
Webの勉強はじめてみた その9 ～JavaScriptとCSS編 簡単なアニメーション～

N予備校の「プログラミング入門 Webアプリ」をアーカイブ動画とともに受講しています。
今回は第一章13節「はじめてのCSS」と14節「CSSを使ったプログラミング」を受講しました。

<h2>メモ</h2>
:::note
1. marginは要素の外側、paddingは要素の内側
2. CSSではclass属性を使うことが多い 
3. 条件文はできるだけシンプルに
:::
<h2>練習問題: JavaScriptとCSSでアニメーション</h2>

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>
        CSS を使ったプログラミング
    </title>
    <link rel="stylesheet" href="css-programming.css">
</head>
<body>
    <h1 id="header" class="face">CSS を使ったプログラミング</h1>
    <script src="animation.js"></script>
</body>
</html>
```

```css
.face{
    /*color: darkblue;  */
    color: red;         
}
.back{
    /*color: lightgray;*/
    color: red;
    /*opacity: 0.4;*/
}
```

```javascript
//header 取得
let header = document.getElementById('header');
//角度
let degree = 0;
//透明度
let opacity = 0;
//加算フラグ
let isPositive = true;
//headerを回転させる
function rotateHeader(){    
    //6°ずつ回転させる
    degree += 6;
    //裏を向いた瞬間にclassを変更する
    //361° と 1° は同じなので、360で割った余りが現在の角度になる。
    degree %= 360;
    //表を向いているとき：0 以上 90 未満 か 270 以上 360 未満
    /*if((0 <= degree && degree < 90) || (270 <= degree && degree < 360)){
        //表
        header.className = 'face';
    }else{
        //裏を向いているとき：90 以上 270 未満
        header.className = 'back';
    }*/
    //↓↓ 条件をシンプルに
    if(90 <= degree && degree < 270){
        header.className = 'back';
    }else{
        header.className = 'face';
    }
    //回転
    header.style.transform = 'rotateX(' + degree +'deg)';
    //header.style.transform = 'rotate3d(1, 1, 1, ' + degree +'deg)';    

    //透明度の設定
    if(isPositive){
        opacity += 0.1;

        if(opacity >= 1){
            //加算フラグを消す
            isPositive = false;
        }

    }else{
        opacity -= 0.1;

        if(opacity <= 0){
            //加算フラグを立てる
            isPositive = true;
        }
    }
    header.style.opacity = opacity;    
}
//20ミリ秒ごとに実行してアニメーションさせる
//setInterval(rotateHeader, 20);
setInterval(rotateHeader, 100);
```

今回は`h1`タグ内の文字列を回転させる、というもの。
あと追加で透明度も変えてます。
`degree %= 360`
のあたり、自力では全然思いつかないので、ただすごいなぁと感心するばかりでした。

<h2>まとめ</h2>
アニメーションって手段は色々あるけれど、どれも個人的にすごく感動を覚えます。
あとはもっと頭を柔らかくしていきたい。
そういえば次はCSS編です、と言いながらメインはがっつりJavaScriptでした。
UbuntuのNetwork Managerでメトリック値 (接続優先度) を変更する

ネットワークのメトリック値 (接続優先度、低いほど優先) を適切に設定することで、複数のネットワークに同時接続しても安定して使用できるようになる（例えばWi-Fiを常に有線LANより優先するなど）。

`ifmetric` コマンドでメトリック値を変更しても、一時的にしか反映されないので、Network Managerを使っている場合は `nmcli`から変更する。

```bash
# 確認
sudo nmcli connection show # 接続一覧
sudo nmcli connection show "Wired connection 1" # 設定値一覧
sudo nmcli connection show "Wired connection 1" | grep metric # メトリック値確認

# 設定変更
sudo nmcli connection modify "Wired connection 1" ipv4.route-metric 100
sudo nmcli connection modify "Wired connection 2" ipv4.route-metric 200

# 適用
sudo nmcli connection up "Wired connection 1"
sudo nmcli connection up "Wired connection 2"

# メトリック値を ip route で確認
ip route
```

なお、ipコマンドやifconfigコマンドが入っていない場合は、`apt install dnsutils` からインストールできる。

## 2022/05/16 追記

最近 Ubuntu 22.04 を使ったところ、上記設定だけではDNSの解決がうまく行かず、以下のように`ipv4.dns-priority`の設定も必要だった。

```bash
# 設定変更
sudo nmcli connection modify "Wired connection 1" ipv4.dns-priority 100
sudo nmcli connection modify "Wired connection 2" ipv4.dns-priority 200

# 適用
sudo nmcli connection up "Wired connection 1"
sudo nmcli connection up "Wired connection 2"
```
【JavaScript】複数のaタグリンクを無効化する方法

こんにちは。ikuraです。

最近、寒くなってきたので１日に１１時間も布団にもぐってしまうようになってしまいました。（夏は８時間程度）
寒いのが好きではないので早く４月にならないかと思っております:pensive:

余談はさておき、仕事でJavaScriptを触る機会がありましてオンライン画面のリンクを無効化する処理を書きました。
ネットで「JavaScript　aタグリンク無効化」と調べると色々実装方法が出てきたのですが、動的にリンクを無効化する処理がネット上にあまりなかったため記事を書こうと思い立ちました。


#pointerEventsの概要

私はaタグリンクを無効化するのに、「pointerEvents」を使いました。
poiterEventsの詳しい内容は、以下のリンクをご参照ください。
[Pointer events - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Pointer_events)
[pointer-eventsの本当の意味 - Qiita](https://qiita.com/ksk1015/items/c397181622d4ca6acceb)

「pointer-events」は、基本的にcssのプロパティとして使用されているためJavaScriptではあまり使われないようです。。
#pointerEventsの実装方法
1.「getElementsByTagName('a')」でタグ名"a"を取得する。
2.取得したaタグの件数文for分を回す。
3.「.style.pointerEvents = 'none';」でaタグ要素を無効化する。
という流れになります。

aタグ要素を有効化する場合は、「auto」を使用します。

```html:index.html
<html lang="en">
<head>
  <script src="a_index.js"></script>
</head>
<body>
  <a href="https://qiita.com/">Qiitaへ１</a>
  <a href="https://qiita.com/">Qiitaへ２</a>
  <a href="https://qiita.com/">Qiitaへ３</a>
  <a href="https://qiita.com/">Qiitaへ４</a>
  <a href="https://qiita.com/">Qiitaへ５</a>
  <input type="button" value="ここ押すとリンクが無効化される" onclick="invalidLink()">
</body>
</html>
```

```javascript:a_index.js
function invalidLink() {
  let elements = document.getElementsByTagName('a');
  for (let i = 0; i < elements.length; i++) {
    elements[i].style.pointerEvents = 'none';
  }
}
```
Rabbit Charenge レポート1

# 1　要点纏め
##  1.1　線形代数学（行列）
行列とは？
・スカラーを表にしたもの
・ベクトルを並べたもの
→ベクトルの変換や連立方程式を解くために用いる

以下代表的な演算例

**行列の積**

```math
\begin{pmatrix}
2 & 1 \\
4 & 1
\end{pmatrix}
\begin{pmatrix}
1 & 3 \\
3 & 1
\end{pmatrix}
=
\begin{pmatrix}
2×1+1×3 & 2×3+1×1 \\
4×1+1×3 & 4×3+1×1
\end{pmatrix}
=
\begin{pmatrix}
5 & 7 \\
7 & 13
\end{pmatrix}
```
**逆行列について**

・行列の逆数みたいなもの
・逆行列を求めるには**掃き出し法**が有名（具体的な計算過程は省略）



##  1.2　線形代数学（固有値・固有ベクトル・特異値・特異ベクトル）


**行列の固有値分解とは？？**
→簡単に言うと，（正方）行列を分解する操作
→．$A$ ：行列, $ \vec{x} $：ベクトル, $λ$：固有値として，下式のように表現できる$λ$を求める．

```math
A \vec{x} = λ\vec{x} \\
```

→応用例でいうと，主成分分析（PCA）にこの概念が用いられる．

**具体的な固有値分解過程**
・Step1：特性方程式$det(A-λI)=0$を解いて固有値を求める．
・Step2：各々の固有値に対し，$(A-λI)\vec{x}=0$ を満たす $\vec{x} \neq \vec{0}$を求める．



**行列の特異値分解とは？？**
→簡単に言うと，前述の固有値分解の正方行列以外も扱えるようにしたイメージ．
→$A$の特異値分解は，直交行列$U,V$，対角行列$Σ$を用いて，以下のように表現される．$Σ$の対角成分が$A$の**特異値**と呼ばれる．

```math
A = UΣV^T \\
```

→応用例でいうと，画像の圧縮などに用いられる．



**具体的特異値分解計算例**
$A$の特異値分解を行う場合
・Step1：固有方程式$\det(AA^T-\lambda E)=0$を解いて固有値$\lambda$及び固有ベクトルを求める．
・Step2：行列$V$の固有ベクトルを求める．
・Step3：行列$V$を転置させて$V^T$を求める．


##  1.3　統計学
本章では，集合の基礎（絶対補や相対補），確率の基礎（確率の概念や2群間の確立に関する考え方やベイズ則，確率密度の考え方や母集団や標本標本）について取り上げられていた．ベイズ則とは，確率の乗法定理を用いて，結果から原因を推定する方法．確率密度とは，確率変数が連続である場合に，縦軸が確率密度，横軸が確率変数の二次元で表される関数のこと．

##  1.4　情報理論
本章では，自己情報量やシャノンエントロピー，KLダイバージェンス，交差エントロピーに関して取り上げられていた．
ある事象$E$の自己情報量$I(E)$とは，単一の事象に対して，生起確率$P(E)$と以下のような関係にある値．単に情報量ともいう．

```math
I(E)=\log{\frac{1}{P(E)}} \\
```
シャノンエントロピーとは，平均情報量とも呼ばれ，全ての事象に対する情報量の期待値を指す．以下の式で表現される．

```math
H=-\sum_{E}{P(E)\log P(E)}\\
```
KLダイバージェンスとは，2つの確率分布P,Qに対し，確率密度変数$p(x)$,$q(x)$尤度比をlog変換し，期待値をとったものである．定義は以下．

```math
D_{KL}(Q||P):=\int q(x) \log \frac{q(x)}{p(x)} dx\\
```

# 2　確認テスト
**全体概観**
行列の固有値（分解）や特異値（分解）に関する問題，統計学から分散・共分散，期待値，情報理論分野から自己情報量・シャノンエントロピーに関する問題が出題された．特に，数式の理解を問われることが多く，上辺の理解では回答できない設計になっていた．
私自身の気づきとして，それぞれ単語は何を表しているかは把握していたが，数式による詳細な理解が求められた際，少し考え込んでしまうことや誤答をしてしまうことがあった．今後の学習として，数式の意味とそれぞれの算出過程を結び付けたような学習を心掛けたいと思った．

# 3　実装演習
応用数学のため，実装はなし．

# 4　全体を振り返って
情報工学を大学・大学院と6年間学んでいたが，応用数学は応用数学で独立して学んでいたが，本講座を通して，機械学習との関連を学ぶことができた．特に，特異値分解の部分に関しては，応用先が分からずに学んでいたが，画像圧縮に用いられることを実際の画像例で示してあり，自分自身の学びが深くなったように思えた．今後も機械学習との関連を意識した学習をしていきたいと思った．
RDKitのフィンガープリントをPandasのデータフレームに取り込んで使い倒そう②

#はじめに

[RDKitのフィンガープリントをPandasのデータフレームに取り込んで使い倒そう](https://qiita.com/kimisyo/items/1530819d419784f27357) の続編。

前回は、Morgan FingerprintとAtomPair Fingerprintについてはハッシュの例しかなかったため、今回はアンハッシュの例を示す。

# 環境
- RDKit 2020.09.3

# 前準備
前回同様、本記事のソースを動かすにあたり、以下のモジュールをインポートしておく必要がある。

```python
import numpy as np
import pandas as pd
from rdkit import rdBase, Chem
from rdkit import DataStructs
from rdkit.DataStructs import ExplicitBitVect
from rdkit.Chem import AllChem, Descriptors
from rdkit.ML.Descriptors import MoleculeDescriptors
```

#ハッシュ方式とアンハッシュ方式の違い
- ハッシュ方式はビット数固定だが、アンハッシュ方式はビット数が可変となる。
- ハッシュ方式はビットが衝突するため、一部の情報が失われてしまう。

# フィンガープリントの説明
では、ここからMorgan Fingerprint(アンハッシュ)とAtomPair Fingerprint(アンハッシュ)について、フィンガープリントを求めてpandasに取り込む方法について説明する。
なお、以下のコード例は全て前提として```mols```という変数にRDkitのMolオブジェクトのリストが格納されていることを前提としている。
また、Pandasのデータフレームのindexは指定していないので、化合物名のリスト等、適宜補ってほしい。

## Morgan Fingerprint (アンハッシュ)

### Pandasに取り込む方法
ここでは、GetMorganFingerprint関数に半径3を指定して計算した結果を取り込む例を示す。

前回のTopologicalTorsion Fingerprintでもふれたが、計算を行うまでどんなビットがでてくるか分からないという特徴がある。化合物によって得られるビットも異なってくる。
従って計算しながらビット名をキーとして保持し、後から全化合物に対し存在しないビットの値を0で補完する処理が必要となる。


```python 
# Morganのフィンガープリントの計算
from collections import defaultdict
mg_fps_tmp = []
keys = set()
for mol in mols:
    fp = AllChem.GetMorganFingerprint(mol, 3)
    mg_fps_tmp.append(fp.GetNonzeroElements())
    for key in fp.GetNonzeroElements():
        keys.add(key)
        
mg_fps = defaultdict(list)
for fp in ap_fps_tmp:
    for key in keys:
        if key in fp:
            mg_fps[key].append(fp[key])
        else:
            mg_fps[key].append(0)

df = pd.DataFrame(data=mg_fps)
```

## AtomPair Fingerprint(アンハッシュ)

こちらもMorgan と全く同様の処理となる。

### Pandasに取り込む方法
```python
from collections import defaultdict
ap_fps_tmp = []
keys = set()
for mol in mols:
    fp = AllChem.GetAtomPairFingerprint(mol)
    ap_fps_tmp.append(fp.GetNonzeroElements())
    for key in fp.GetNonzeroElements():
        keys.add(key)
        
ap_fps = defaultdict(list)
for fp in ap_fps_tmp:
    for key in keys:
        if key in fp:
            ap_fps[key].append(fp[key])
        else:
            ap_fps[key].append(0)

df = pd.DataFrame(data=ap_fps)
```


# おわりに
アンハッシュ方式は、情報の損失がなくなる半面、説明変数の数が多くなるため変数選択が重要となる。うまく使い分けてモデルを作成しよう。

# 参考
https://future-chem.com/rdkit-fingerprint/