OmniAICreator/Qiita-1.07M huggingface dataset:
(リンクだけです)正月 いつからいつまで 調べました。二十四節気も

1月15日が小正月とされています＜

https://baito.mynavi.jp/contents/oyakudachi/manner/0104.html

https://www.google.com/search?client=ms-android-huawei&sxsrf=ALiCzsbfL4JHOtyhLJ-9S6QOIPmYbELV3g:1672790466373&q=%E6%AD%A3%E6%9C%88+%E3%81%84%E3%81%A4%E3%81%8B%E3%82%89%E3%81%84%E3%81%A4%E3%81%BE%E3%81%A7&sa=X&ved=2ahUKEwjPl6CMzqz8AhVaG4gKHch9ANQQ1QJ6BAhaEAE&biw=816&bih=454&dpr=1.5#pi=%E6%AD%A3%E6%9C%88%20%E3%81%84%E3%81%A4%E3%81%8B%E3%82%89%E3%81%84%E3%81%A4%E3%81%BE%E3%81%A7&sbfbu=0

# 「新年は1月5日から」　で検索
https://www.google.com/search?q=%E6%96%B0%E5%B9%B4%E3%81%AF1%E6%9C%885%E6%97%A5%E3%81%8B%E3%82%89&client=ms-android-huawei&sxsrf=ALiCzsaDmIsVtUccfPqjSHVehu3TQYKOZQ%3A1672790799390&ei=D8O0Y624F8_3wAPY2JWIDQ&oq=%E6%96%B0%E5%B9%B4%E3%81%AF1%E6%9C%885%E6%97%A5%E3%81%8B%E3%82%89&gs_lcp=ChNtb2JpbGUtZ3dzLXdpei1zZXJwEAMyCggAEEcQ1gQQsAMyCggAEEcQ1gQQsAMyCggAEEcQ1gQQsAMyCggAEEcQ1gQQsAMyCggAEEcQ1gQQsAMyCggAEEcQ1gQQsAMyCggAEEcQ1gQQsAMyCggAEEcQ1gQQsAMyCggAEEcQ1gQQsAMyCggAEEcQ1gQQsANKBAhBGABQAFgAYNcOaAFwAHgAgAEAiAEAkgEAmAEAyAEKwAEB&sclient=mobile-gws-wiz-serp


https://hp.otenki.com/4777/

二十四節気に時刻がありました。

https://www.google.com/search?q=%E4%BA%8C%E5%8D%81%E5%9B%9B%E7%AF%80%E6%B0%97+%E6%99%82%E5%88%BB+2023&oq=%E4%BA%8C%E5%8D%81%E5%9B%9B%E7%AF%80%E6%B0%97%E3%80%80%E6%99%82%E5%88%BB%E3%80%802023&aqs=chrome..69i57j0i546l4.1645j0j9&client=ms-android-huawei&sourceid=chrome-mobile&ie=UTF-8


四季4,月12,二十四節気24
大学入試問題に二十四節気はありませんでした。

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%E4%BA%8C%E5%8D%81%E5%9B%9B%E7%AF%80%E6%B0%97&oq=%E4%BA%8C%E5%8D%81%E5%9B%9B%E7%AF%80%E6%B0%97&gs_l=partner-web.12..0i512j0i512i433i131i433i131j0i512j0i3j0i433i131j0i512l5.5403.5403.0.7341.1.1.0.0.0.0.267.267.2-1.1.0.csems%2Cnrl%3D10...0....2.34.partner-web..0.1.266.4G4tNED4gJM
Fedora でデスクトップのアプリが全部死ぬ

暫く前から気付くとデスクトップ上に開いていたアプリが全部無くなっているということが何度か続いた。

[Workspaces](https://github.com/DevAlien/workspaces) 経由で起動したものに限るようではあったのだけれど。
理由が分からない。

偶々それらが死ぬ瞬間を目撃したので、/var/log/messages を確認した。
```
Jan  5 05:01:17 Host systemd-oomd[3639]: Considered 28 cgroups for killing, top candidates were:
Jan  5 05:01:17 Host systemd-oomd[3639]: 	Path: /user.slice/user-1001.slice/user@1001.service/app.slice/flatpak-session-helper.service
Jan  5 05:01:17 Host vmnetBridge[3862]: RTM_NEWLINK: name:enp8s0 index:2 flags:0x00011043
Jan  5 05:01:17 Host systemd-oomd[3639]: 		Memory Pressure Limit: 0.00%
Jan  5 05:01:17 Host systemd-oomd[3639]: 		Pressure: Avg10: 66.37 Avg60: 30.12 Avg300: 8.01 Total: 2min 20s
Jan  5 05:01:17 Host systemd-oomd[3639]: 		Current Memory Usage: 23.8G
Jan  5 05:01:17 Host systemd-oomd[3639]: 		Memory Min: 0B
Jan  5 05:01:17 Host systemd-oomd[3639]: 		Memory Low: 0B
Jan  5 05:01:17 Host systemd-oomd[3639]: 		Pgscan: 170353416
Jan  5 05:01:17 Host systemd-oomd[3639]: 		Last Pgscan: 170353416
```

こんな感じ。

ちょっと対処法が分からないのだけれど、 systemd-oomd が関与している様子。
取り敢えず一旦 /etc/oomd.conf を参照し、記載の
```
systemd-analyze cat-config systemd/oomd.conf
```
を実行する。
```
DefaultMemoryPressureDurationSec=20s
```
が小さいか?

一旦、
/etc/systemd/oomd.conf.d/10-oomd-defaults.conf
に
```
DefaultMemoryPressureDurationSec=40s
```
を追加して様子を観ることにする。


2023-02-02 追記

別機でも類似事象を観察し、ログを確認した所次のようなものが発見された。
```
Feb  2 03:40:59 Host2 systemd-oomd[3272]: Killed /user.slice/user-0.slice/session-4.scope due to memory pressure for /user.slice/user-0.slice being 50.72% > 50.00% for > 20s with reclaim activity
```
少なくともうちの環境では、20秒は短過ぎるのだろう。

同様の措置を取った。
カスタムセルのAutoLayoutができない！！「this class is not key value coding-compliant for the key」の対処法

# はじめに
カスタムセルのAutoLayoutが正しく反映されず、苦戦したので記事に残します。

# 発生している問題
カスタムセルのAutoLayoutがいくらやっても効かず、中のUI部品がどうしてもセルの左上に配置されてしまいます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398435/7deda3f2-a5a9-b82d-1d6e-c1c0b68a4283.png" width=60%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398435/ba628fc6-21f8-fb8e-993f-aa9ec3b966cb.png" width=60%>

# 解決策
カスタムセルのストーリーボード上にある”ContentView”をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398435/82f1e514-531f-e29d-899f-30263f023992.png" width=60%>
右側のCastomClassが設定されている場合、空欄にする。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398435/6d5aa004-97d2-e71a-418f-f8c0c6923144.png" width=60%>
すると、UIViewという文字が薄く表示されデフォルトのUIViewが設定される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398435/c90ee90e-4cdd-0444-276a-35e9f977e0b5.png" width=60%>

これでAutoLayoutが反映されるようになります！

## それでも、「this class is not key value coding-compliant for the key」とエラーが出る場合
関連付けが二重にされている可能性があります。
UI部品を選択し、ContentViewとの関連付けを消去しましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398435/13142552-f49e-d659-3ca8-8868ec52eb78.png" width=60%>
DeepL翻訳:〜どうかよいお年をお迎えください．

オリジナル
「閑話休題，お世話になった皆さん，また読者の皆さん，どうかよいお年をお迎えください．」

https://mathexamtest.bbs.fc2.com/

# DeepL翻訳結果
?閑話休題?は、どこへいきましたか？
英語の次は、ワールドカップの対戦国の言語の順です。

I would like to take this opportunity to wish all the readers a very happy new year.
Allen, die mir geholfen haben, und allen Lesern wünsche ich ein gutes neues Jahr.
モロッコは、アラビア語とベルベル語だそうです。
A tous ceux qui m'ont aidé, et à tous les lecteurs, je vous souhaite une bonne et heureuse année.
A todos los que me han ayudado, y a todos los lectores, les deseo un feliz año nuevo.

# 逆変換
ドイツ語の変換がいいですね。

読者の皆様には、この場をお借りして新年のご挨拶を申し上げます。
お世話になった皆様、そして読者の皆様、良いお年をお迎えください。
お世話になった方々、そして読者の皆様、本年もどうぞよろしくお願いいたします。
お世話になった方々、そして読者の皆様、本年もどうぞよろしくお願いいたします。
Jupyter nbconvert でセルの出力を抑制

# jupyter nbconvert
jupyter のノートブックからHTMLやPDFを nbconvert で生成することができる。 しかし、多くの場合はすべてのセルを表示したいわけではないので、セル単位で 出力を抑制する必要がある。これにはいくつか方法がある。

## TagRemovePreprocessor
nbconvert には preprocessor という概念がある。 この内の、`TagRemovePreprocessor`を使うと、特定のタグがついたセルの出力を抑制できる。そもそも「タグ」というのは何なのか知らなかったのだけど、セルごとに任意の属性を付加する事ができる仕掛けで、普通のJupyter notebookでもできるし、vscodeでもつけることができる。ただし結構使いづらい。 これを使うと、
```
jupyter nbconvert --to html --TagRemovePreprocessor.remove_input_tags='{"hide"}' test.ipynb
```
のようにして、入力セルだけを抑制できる。ここで hide としているのは任意のタグなので、適当に変更することができる。なんで波括弧が要るのか、よくわからない。 
`remove_input_tags` を `remove_cell_tags`もしくは`remove_output_tags` にすると、それぞれ入出力両方、出力セルのみの出力を抑制できる。

タグは柔軟で素晴らしいのだけど、タグを付けるのが結構面倒だし、タグをvscodeなどで目視で確認する事ができない。 

## RegexRemovePreprocessor
`RegexRemovePreprocessor` というものがあり、これはセルの内容に対して、正規表現で検索を行って、マッチしたら出力を抑制してくれる。例えば冒頭のコメントに`# hide` と書いてあったら出さない、などということができる。
```
jupyter nbconvert --RegexRemovePreprocessor.patterns="['^# hide']" test.ipynb
```

素晴らしい、がこれはセルをまるごと抑制してしまい、入力だけを抑制することはできない。 ソースコードは `site-packages/nbconvert/preprocessors` にあるのだけど、非常に単純なコードで全く対応する気がなさそう。ほんのちょっといじればできそうなんだけどなあ。。

## MyRegexRemovePreprocessor

ということでいじってみた。素晴らしいことに、nbconvertにはさまざまなモジュールを外部からあたえる仕掛けが用意してあり、もとのソースコードに手を入れなくても独自のpreprocessorを入れる事ができるのだった。

```
jupyter nbconvert '--Exporter.preprocessors=["クラス名"]' --クラス名.オプション名=オプション値 ..
```
のように、クラス名とオプション値を指定する。

せっかくなので、各セルの入力部分の抑制、出力部分の抑制、全体の抑制を独立してコントロールできるようにした。オプション名は以下の通り。
- `all`  セル全体を抑制
- `input` 入力部分だけ抑制
- `output` 出力部分だけを抑制

下のコードを`regexremove.py` という名前でセーブして、PYTHONPATHの通った場所において、

``` sh
jupyter nbconvert '--Exporter.preprocessors=["regexremove.MyRegexRemovePreprocessor"]' \
 --MyRegexRemovePreprocessor.input="['^# hide']"\
  formattest.ipynb
```

とやると、`# hide` を含む入力セルだけを変換対象から外すことができる。

input, output, all はすべて独立なので、次のように別のタグをそれぞれ指定することもできる。

``` sh
jupyter nbconvert --Exporter.preprocessors=regexremove.MyRegexRemovePreprocessor \
 '--MyRegexRemovePreprocessor.input=^# hideinput'\
 '--MyRegexRemovePreprocessor.output=^# hideoutput'\
 '--MyRegexRemovePreprocessor.all=^# hideall'\
  formattest.ipynb
```


## コード
コードは以下の通り。

https://gist.github.com/HidemotoNakada/4114523476acdc8ecafc5166020dc594
[Python] TikTokAPI エラー KeyError: "name='ttwid', domain=None, path=None" 

# 該当エラー
```
Requesting data from TikTok
Traceback (most recent call last):
File "D:\desarrollo\tiktok\tiktokapi.py", line 39, in
for video in api.trending.videos():
File "C:\python\python390\lib\site-packages\TikTokApi\api\trending.py", line 40, in videos
ttwid = spawn.cookies["ttwid"]
File "C:\python\python390\lib\site-packages\requests\cookies.py", line 328, in getitem
return self._find_no_duplicates(name)
File "C:\python\python390\lib\site-packages\requests\cookies.py", line 399, in _find_no_duplicates
raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
KeyError: "name='ttwid', domain=None, path=None"
```

# 原因
2023年1月6日時点で未解決のバグ
https://github.com/davidteather/TikTok-Api/issues/979

# コード

```python
from TikTokApi import TikTokApi
import json

# read data from json file, cookie exported from webbrowser
def get_cookies_from_file():
    with open('www.tiktok.com.cookies.json') as f:
        cookies = json.load(f)

    cookies_kv = {} # key-value
    for cookie in cookies:
        cookies_kv[ cookie['name'] ] = cookie['value']
        print ( cookie['name'] + "=" + cookie['value'] )

    return cookies_kv


print('Reading data from cookie file...')
cookies = get_cookies_from_file() #obtiene un dictionary key-value

def get_cookies(**kwargs):
    return cookies

api = TikTokApi()

api._get_cookies = get_cookies 

print("    Requesting data from TikTok")
for video in api.trending.videos():
    print ( video.author.username)

```

↑以下の解決策とやろうとしていることは同じ
https://laboratory.kazuuu.net/get-the-latest-trending-videos-on-tiktok-using-tiktokapi-in-python/
Chartsを使っておしゃれグラフ実装

## 概要
[Charts](https://github.com/danielgindi/Charts)を使っておしゃれグラフを実装します。
以下の画像のような完成を想定してます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551042/82f2c5e3-537e-da91-0a53-6786f31316da.png" width="200" />

## 前提
Chartsは3系を使った時はエラーが発生したため、4系を使うことをお勧めします。
SPMを使ってライブラリを導入しました。

## 実装
以下で具体的に実装を行います。

### カスタムUIView準備
折れ線グラフを表示するカスタムViewを準備します。

```swift
class CustomLineChartView: UIView {
    @IBOutlet weak var lineChart: LineChartView!

    required init?(coder: NSCoder) {
        super.init(coder: coder)

        if let view = UINib(
            nibName: .init(describing: Self.self),
            bundle: nil
        ).instantiate(withOwner: self).first as? UIView {
            view.frame = bounds
            addSubview(view)
        }

        setup()
    }

    private func setup() {
    }
}
```

#### 横軸の設定
x軸の設定を行います。

```swift
private func setup() {
  let xAxis = lineChart.xAxis
  xAxis.labelPosition = .bottom
  xAxis.labelTextColor = .text
  xAxis.drawGridLinesEnabled = false
  xAxis.drawAxisLineEnabled = false
  ...
}
```

#### 縦軸の設定
左の縦軸について設定を行ってます。
右の縦軸は表示させません。

```swift
private func setup() {
  ...
  let leftAxis = lineChart.leftAxis
  leftAxis.axisMinimum = .zero
  leftAxis.zeroLineColor = .text
  leftAxis.labelCount = 5
  leftAxis.labelTextColor = .text
  leftAxis.drawGridLinesEnabled = false
  leftAxis.drawZeroLineEnabled = true

  lineChart.rightAxis.enabled = false
  ...
}
```

#### グラフ全体に係る設定
判例を非表示にして、グラフタップなどの動作を無効にしてます。

```swift
private func setup() {
  lineChart.legend.enabled = false

  lineChart.noDataText = ""
  lineChart.highlightPerTapEnabled = false
  lineChart.dragEnabled = false
  lineChart.pinchZoomEnabled = false
  lineChart.setScaleEnabled(false)
}
```

#### グラフに表示するデータの設定
親ビューからデータを受け取り、グラフに表示する想定です。
外部のビューがこのメソッドにアクセスできるようにしてます。

```swift
func updateChartEntries(_ entries: [ChartDataEntry]) {
  let dataSet = LineChartDataSet(entries: entries)
  ...
}
```

#### グラフに表示するデータの装飾
折れ線グラフの線の色と線の下の領域をグラデーションで塗れるように設定してます。

```swift
func updateChartEntries(_ entries: [ChartDataEntry]) {
  ...
  let colors: [CGColor] = [
      UIColor.accentColor.cgColor,
      UIColor.text.cgColor,
  ]
  let gradient = CGGradient(
      colorsSpace: nil,
      colors: colors as CFArray,
      locations: nil
  )!

  dataSet.circleRadius = 4
  dataSet.fill = LinearGradientFill(gradient: gradient)
  dataSet.setCircleColor(.text)
  dataSet.colors = [.text]
  dataSet.drawFilledEnabled = true
  dataSet.drawValuesEnabled = false

  let data = LineChartData(dataSet: dataSet)
  lineChart.data = data
}
```

ソースコードは[こちら](https://github.com/h-taro/line-chart-demo)です。
pythonのバージョンを切り替えたい（python3.9-->python3.10にしたいことがきっかけ）

pythonのバージョンを切り替えたい場合の備忘録です（python3.9-->python3.10にしたいことがきっかけ）

## Linux(ubuntu20.04)の場合

以下の方法を参照して`update-alternatives`を使う方法で`python3.10`を使えるように切り替えることができた

> [Ubuntu 20.04にPython3.xを複数インストールして切り替える方法（PPA・apt）](https://qiita.com/murakami77/items/b612734ff209cbb22afb)
> 
>
> ```リポジトリ追加
> sudo apt install -y software-properties-common
> sudo add-apt-repository ppa:deadsnakes/ppa
> ```
> 
> apt update
>
> ```
> sudo apt update
>```
>
>Python 各バージョンインストール
>
>```
>sudo apt install -y python3.10 python3.10-venv
>```
>
>定義
>
>```
>sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 140
>``` 
>
>Priorityを選択して切り替える方法
>
>```
>sudo update-alternatives --config python
>```

## windowsの場合

Linux同様の方法がないか調べたが、ぱっと調べた限りでは見つけられなかった（実際はあるのかもしれない）
結局、`microsoft store`から該当バージョンをGUI経由でインストールして、
古いバージョンをアンインストール(windowsボタン押下+検索+アンインストールボタン押下)した。


> https://superuser.com/questions/1399544/how-to-change-default-python-executable-on-windows-10
> https://www.skillsugar.com/how-to-change-the-default-python-version
> https://medium.com/swlh/how-to-set-up-a-virtual-environment-with-a-different-python-version-on-windows-10-9900eb0acf9a

最新バージョンのみを使い続ける場合はこの方法でも問題ないが、複数バージョンの同居が必要な場合はどうすればいいのかよく分からない。。が、やりたいことはできたのでOK。。

## 参考

https://qiita.com/murakami77/items/b612734ff209cbb22afb

https://superuser.com/questions/1399544/how-to-change-default-python-executable-on-windows-10

https://www.skillsugar.com/how-to-change-the-default-python-version

https://medium.com/swlh/how-to-set-up-a-virtual-environment-with-a-different-python-version-on-windows-10-9900eb0acf9a
PowerAutomateのExcelOnlineでテーブル情報取得

## 概要
データをまとめてインポートする際などはExcelを使った方が便利なことが多いです。
その際PowerAutomateで使用するコネクターが**ExcelOnline**です。
今回はこのExcelOnlineでのテーブル・値の取得に関する備忘録です。
またExcelOnlineはBusinessを使用してます。

### 前提
SharePointにExcelファイルが格納されている状態からスタートします。
ファイルの格納については、下記記事を参考にしてください。

https://qiita.com/loto0704/items/bb91c53e0f2411b69693

### データの準備
今回SharePointに事前に格納するExcelのテーブルに入っているデータは下記になります。

| ID  | 送信先メールアドレス      | 
| --- | ------------------------- | 
| 101 | nomiyama915@example.co.jp | 
| 102 | tarousenoo@example.co.jp  | 


## やること
1. （SharePointにExcelファイル格納）
1. テーブルの取得
1. 行の一覧を取得
1. 出力

## PowerAutomate全体イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130969/97a394d8-da3a-8f66-9ddb-5189fe6256a5.png)


## 手順
- ステップ0：（SharePointにExcelファイル格納）
- ステップ1：ExcelOnlineでテーブルの取得
    - コネクタ：ExcelOnlineの「テーブルの取得」を選択
    - 場所：Excelを格納したSharePointのサイトを指定
    - ドキュメントライブラリ：（今回は）ドキュメント
    - ファイル：Excelを格納した「Path」


- ステップ2：ExcelOnlineで行を取得
    - コネクタ：ExcelOnlineの「表内に存在する行を一覧表示」を選択
    - 場所：Excelを格納したSharePointのサイトを指定
    - ドキュメントライブラリ：（今回は）ドキュメント
    - ファイル：Excelを格納した「Path」
    - テーブル：ステップ1で取得したテーブルの「ID」 ※1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130969/f7c51009-2afc-bbee-c5ba-c23a065d469a.png)

- ステップ3：テーブルデータの解析
    - コネクタ：データ操作のJSONの解析を選択
    - コンテンツ：ステップ2で取得したvalueを選択
    - スキーマ：下記参照
```
{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "@@odata.etag": {
                "type": "string"
            },
            "ItemInternalId": {
                "type": "string"
            },
            "ID": {
                "type": "string"
            },
            "送信先メールアドレス": {
                "type": "string"
            }
        },
        "required": [
            "@@odata.etag",
            "ItemInternalId",
            "ID",
            "送信先メールアドレス"
        ]
    }
}
```

- ステップ4：出力
    - 出力方法：Teams※2
    - 出力データ：送信先メールアドレス ※3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130969/2bda3e97-b445-4f83-b4e2-59d39bc45b5f.png)


※1：テーブルの情報が配列で入っているため、「Apply to each」で回します。Apply to each の出力選択はテーブル取得時の「value」を選択
※2：確認程度であれば、変数とかに書き出してもいいと思います。
※3：※1同様に配列で入っているため、「Apply to each」で回してデータを取り出します。
【SQL】一つのINSERT文で複数行のレコードを一括で挿入する方法

# INSERT文について
データベースのテーブルに新しくレコードを追加するためには、SQLのINSERT文を実行します。
INSERT文は以下のように記述します。

`INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (データ1,データ2, ...);`

# INSERT文で複数行のレコードを一括で挿入する方法

テーブルに対して複数行のレコードを追加する必要がある場合、以下のようにINSERT文を複数記述することで、複数行のレコードを追加することが出来ます。

`INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (データ1,データ2, ...);`
`INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (データ1,データ2, ...);`
`INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (データ1,データ2, ...);`
`INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (データ1,データ2, ...);`
...

しかし、このような記述の仕方では、何回もINSERT文を実行しなければいけませんし、冗長に感じます。
そこで、一つのINSERT文で複数行のレコードを一括で挿入する方法を紹介いたします。
INSERT文を以下のように記述します。

`INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (データ1,データ2, ...), (データ1,データ2, ...), (データ1,データ2, ...), ...;`

VALUE句の記述を複数にすることで複数行のレコードを一括で挿入することが出来ます。
ABC262 B Dif:220 『AtCoder ABC251～275 ARC140～151 灰・茶・緑問題 超詳細解説』サンプル

この記事は 『AtCoder ABC251～275 ARC140～151 灰・茶・緑問題 超詳細解説』 のサンプルです。

値段：300円(Kindle Unlimited対象)
【kindle】
https://www.amazon.co.jp/dp/B0BRNTM9Z4

【booth(pdf)】
https://sano192.booth.pm/items/4455120

ARC140～151の部分のみ抜粋した廉価版 もあります。
値段：200円(Kindle Unlimited対象)
【kindle】
https://www.amazon.co.jp/dp/B0BRNRXPCV

【booth(pdf)】
https://sano192.booth.pm/items/4455133

【サンプル一覧】
ABC251 A：https://qiita.com/sano192/items/810a4a7d5cf61321bb05
ABC262 B：https://qiita.com/sano192/items/8a9cc91d73a798de6a54
ABC256 C：https://qiita.com/sano192/items/c52d24d0cdf3797a77d7
ABC259 D：https://qiita.com/sano192/items/e39d3636c1ea5d62c1bb

「ものすごく丁寧でわかりやすいABC解説」シリーズをベースに【キーワード】【どう考える？】【別解】を追加し、【解説】と【実装のコツ】を分けることでよりわかりやすく、具体例や図もより豊富に全ての問題の解説を書き直しました！
さらにQiitaでは公開していないARC140～151の灰・茶・緑問題も解説しています！
緑を目指す灰・茶コーダーの方へおすすめ！

https://qiita.com/sano192/items/54accd04df62242b70f0

https://atcoder.jp/contests/abc262/tasks/abc262_b

**【キーワード】**
なし

**【どう考える？】**
「単純無向グラフ」がなにかわからなければ調べよう。
なにやら難しそうな問題に見えるが、一行ずつしっかり意味を確認してみるとそこまでややこしいことはない。制約が小さめなので、全てのa,b,cの組について条件を確認すれば良いとわかる。

**【解説】**
「単純無向グラフ」とは以下の条件を満たすグラフを言う。
・多重辺がない(頂点①→頂点②の辺が2本以上ある等がない)
・ループがない(頂点①→頂点①等同じ場所に戻る辺がない)
・向きがない(頂点①→頂点②へ進めるなら頂点②→頂点①へも進める)

頂点の数は最大100個なので(a,b,c)の組としてありうるのは100C3=161700通り。
すべての組について
頂点aと頂点bを結ぶ辺が存在する。
頂点bと頂点cを結ぶ辺が存在する。
頂点cと頂点aを結ぶ辺が存在する。
という条件を確認する。

**【実装のコツ】**
**\<つながっている頂点の記録>**
つながっている頂点の記録には二次元配列を使う。
まず二次元配列connectを作る。初期値は全てFalse。

```python:
connect=[[False]*(N+1) for i in range(N+1)]
```

U,Vを受け取り、U→V,U→Vがつながっている⇔connect[U][V]=True,connect[V][U]=Trueと記録を行う。

```python:
for i in range(M):
    # 入力の受け取り
    U,V=map(int,input().split())
    # 頂点Uと頂点Vがつながっている⇔Trueと記録
    connect[U][V]=True
    connect[V][U]=True
```

**\<三重ループ>**
(a,b,c)の組を確認するため、三重ループを使う。

```python:
# a=1~N
for a in range(1,N+1):
    # b=(a+1)~N
    for b in range(a+1,N+1):
        # c=(b+1)~N
        for c in range(b+1,N+1):
```

このように書くことで
(a,b,c)
(1,2,3)
(1,2,4)
(1,2,5)
…
(1,3,4)
(1,3,5)
(1,3,6)
…
(2,3,4)
(2,3,5)
(2,3,6)
…
(N-2,N-1,N)
という順に代入して処理ができる。

**【提出】**

```python:
# 入力の受け取り
N,M=map(int,input().split())

# つながっている頂点を記録する二次元配列
# 最初は全ての初期値をFalseにする
connect=[[False]*(N+1) for i in range(N+1)]

# M回
for i in range(M):
    # 入力の受け取り
    U,V=map(int,input().split())
    # 頂点Uと頂点Vがつながっている⇔Trueと記録
    connect[U][V]=True
    connect[V][U]=True

# 答え
ans=0

# a=1~N
for a in range(1,N+1):
    # b=(a+1)~N
    for b in range(a+1,N+1):
        # c=(b+1)~N
        for c in range(b+1,N+1):
            # a,b,cが全てつながっていれば
            if connect[a][b]==True and connect[b][c]==True and connect[c][a]==True:
                # 答えにプラス1
                ans+=1

# 答えの出力
print(ans)
```
ABC256 C Dif:541 『AtCoder ABC251～275 ARC140～151 灰・茶・緑問題 超詳細解説』サンプル

この記事は 『AtCoder ABC251～275 ARC140～151 灰・茶・緑問題 超詳細解説』 のサンプルです。

値段：300円(Kindle Unlimited対象)
【kindle】
https://www.amazon.co.jp/dp/B0BRNTM9Z4

【booth(pdf)】
https://sano192.booth.pm/items/4455120

ARC140～151の部分のみ抜粋した廉価版 もあります。
値段：200円(Kindle Unlimited対象)
【kindle】
https://www.amazon.co.jp/dp/B0BRNRXPCV

【booth(pdf)】
https://sano192.booth.pm/items/4455133

【サンプル一覧】
ABC251 A：https://qiita.com/sano192/items/810a4a7d5cf61321bb05
ABC262 B：https://qiita.com/sano192/items/8a9cc91d73a798de6a54
ABC256 C：https://qiita.com/sano192/items/c52d24d0cdf3797a77d7
ABC259 D：https://qiita.com/sano192/items/e39d3636c1ea5d62c1bb

「ものすごく丁寧でわかりやすいABC解説」シリーズをベースに【キーワード】【どう考える？】【別解】を追加し、【解説】と【実装のコツ】を分けることでよりわかりやすく、具体例や図もより豊富に全ての問題の解説を書き直しました！
さらにQiitaでは公開していないARC140～151の灰・茶・緑問題も解説しています！
緑を目指す灰・茶コーダーの方へおすすめ！

https://qiita.com/sano192/items/54accd04df62242b70f0

https://atcoder.jp/contests/abc256/tasks/abc256_c

**【キーワード】**
なし

**【どう考える？】**
適切な4マスを決めれば残りのマスの値も決まる。
制約は30までと小さめなので全探索をすればいい。

**【解説】**
マス目に名前をつける。
![ABC256_C_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/8ff31d71-d3ac-08da-938c-d830e0c61fd1.png)

M11,M12,M21,M22を埋めれば他のマスも埋めることができる。
方程式を立てると以下のようになる。

M11+M12+M13=h1
M21+M22+M23=h2
M31+M32+M33=h3
M11+M21+M31=w1
M12+M22+M23=w2
M13+M23+M33=w3

M13,M23,M33,M31,M32を求めるために式変形する。
M13=h1-(M11+M12)
M23=h2-(M21+M22)
M33=h3-(M31+M32)
M31=w1-(M11+M21)
M32=w2-(M12+M22)

こうして求めた値について以下が成り立てば良い。
M13+M23+M33=w3

h,wは最大でも30なのでマスに入る数は1~28まで。4マスを全通り確かめると28^4=614656通りであり、これなら余裕で間に合う。

**【実装のコツ】**
**\<多重ループ>**
本問はM11,M12,M21,M22を求めるために四重ループが必要。
以下のように書く。

```python:
# M11=1~28
for M11 in range(1,29):
    # M12=1~28
    for M12 in range(1,29):
        # M21=1~28
        for M21 in range(1,29):
            # M22=1~28
            for M22 in range(1,29):
```

**【提出】**

```python:
# 入力の受け取り
h1,h2,h3,w1,w2,w3=map(int,input().split())

# 答えのカウント
ans=0

# M11=1~28
for M11 in range(1,29):
    # M12=1~28
    for M12 in range(1,29):
        # M21=1~28
        for M21 in range(1,29):
            # M22=1~28
            for M22 in range(1,29):
                # それぞれの値を計算
                M13=h1-(M11+M12)
                M23=h2-(M21+M22)
                M31=w1-(M11+M21)
                M32=w2-(M12+M22)
                M33=h3-(M31+M32)
               
                # ・全て正の整数(0より大きい)
                if 0<M13 and 0<M23 and 0<M31 and 0<M32 and 0<M33:              
                    # ・M13+M23+M33==w3も成り立つ
                    if M13+M23+M33==w3:
                        # 答えにカウント
                        ans+=1

# 答えの出力
print(ans)
```
ソフトウェアの品質（凝集度）って？？

# 背景
ソフトウェアの凝集度について復習したことを備忘録として残しておく。
結合度とセットになっていることが多いが、結合度については別の記事にすることにする。

目的：モジュール・クラス設計の根拠を説明するときに、
「凝集度レベルがxxxなので、こちらの設計のほうがより良いと考えました」と **当たり前のように** 説明できる。

# 参考文献

* [組込みソフトウェア開発のための オブジェクト指向モデリング (組込みエンジニア教科書)](https://www.amazon.co.jp/組込みソフトウェア開発のための-オブジェクト指向モデリング-組込みエンジニア教科書-SESSAME-WG2/dp/4798111767/ref=sr_1_1?__mk_ja_JP=カタカナ&crid=1OV6K2TYW6H06&keywords=オブジェクト指向モデリング&qid=1672325264&sprefix=オブジェクト指向モデリング%2Caps%2C223&sr=8-1)
* [実践UML―パターンによるオブジェクト指向開発ガイド](https://www.amazon.co.jp/実践UML―パターンによるオブジェクト指向開発ガイド-クレーグ-ラーマン/dp/4894710773/ref=sr_1_1?__mk_ja_JP=カタカナ&crid=2IATC870ZLBZT&keywords=実践UML+パターンによるオブジェクト&qid=1672904042&sprefix=実践uml+パターンによるおぶじぇくと%2Caps%2C219&sr=8-1)

# 凝集度（コヒージョン）
1970年代に Larry Constantine と Edward Yourdon によって定義された、
モジュール・クラスが単一の目的だけを有しているかどうかの尺度。
元は化学の世界から来た用語らしい。

以下の1から7の順でコヒージョンのレベルが定義されていて、
上位になるほどコヒージョンが高く、単一の目的を有していることを示す。
通信的コヒージョンのレベルまでが、コヒージョンが高いと言えるレベルです。


コヒージョンのことだけで言うとコヒージョンが高い方が良いのですが、
全部を単一の目的しか持たないようにはできないし、状況に応じて使い分ける必要がありますね。

1. 機能的
1. 逐次的
1. 通信的 ※ここまではコヒージョンが高い
1. 手順的
1. 一時的
1. 論理的
1. 偶発的

以下に、各コヒージョンのレベルの定義と、
考えてみた一例（ドラえもん）を載せる。

## 機能的コヒージョン
* 単一の目的しか持たない

どこでもドアは移動するという単一の目的しか持っていない。

![ドラえもん_凝集度_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/280c98e7-e442-8432-86bf-f8e395552627.jpeg)

## 逐次的コヒージョン
* 中心となるデータが存在していて、そのデータに対する複数の処理ステップを実行する

タイムマシンは、時空というデータを持ち、
目標時代設定、時空警察に連絡、移動という複数の順序動作をひとまとめにしている。

![ドラえもん_凝集度_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/6bf0faa9-dd98-acd1-3a81-5d882054f1f8.jpeg)

## 通信的コヒージョン
* 中心となるデータが存在していて、それに対する入出力処理がランダムに詰まっている

「四次元空間」という中心となるデータに対する入出力が詰まっているクラス。
この使い方が一番多いですかね。

![ドラえもん_凝集度_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/8dc5c936-a3c6-071c-4093-e94e9e31ce9a.jpeg)

## 手順的コヒージョン
* 中心となるデータが存在しておらず、順序的な関連性から1つのモジュールになっている

「どら焼き買い出しマシーン」は、中心となるデータは存在しておらず、
どら焼き買い出しの順序的な関連があるので、一つのモジュールになっています。
「スーパーに移動」と、「どらやき購入」の要素に関連がないので、
何をしているのか外側から想像しずらくなり、保守性が落ちます。

![ドラえもん_凝集度_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/7594c095-8286-cba0-b60e-5e5f5800e3bf.jpeg)

## 一時的コヒージョン
* ある時点において、偶然同時に行ったことをひとまとめにしたモジュール

「どらやき買い出しマシーン」に、ママから言われた「通帳記帳」の処理を追加したモジュールです。
あとから見ると、何の因果関係もないけど、たまたまママから頼まれたので
一部修正していくと、一時的コヒージョンレベルになります。

![ドラえもん_凝集度_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/b130d412-b935-f849-e014-f10caeb5f206.png)

改善ポイント：
複数の目的が含まれているので、
通帳記帳と、どら焼き購入、移動を別の道具（モジュール）にする。


## 論理的コヒージョン
* 外部からの論理的な理由で、同類の処理がひとまとめにされたモジュール

「外部からの論理的な理由」というのが、「のび太がやりたいこと」に相当します。
のび太のやりたいことはまとまったミニドラですが、できることは何の関係もないモジュールです。

![ドラえもん_凝集度_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/18820757-4cfa-a22b-23bd-1e25d9c7a1e5.jpeg)



## 偶発的コヒージョン
* お互いに何の関係も持たない処理がひとまとめにされているモジュール

![ドラえもん_凝集度_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/d69e5292-cc3c-9a13-360e-4b8796ff6ebb.png)

# まとめ
凝集度が高いメリット：
* 設計の明確さと理解しやすさが高まる
* 保守と拡張が容易である
* 疎結合性も同時に促進されることが多い
* 関連性の強い機能が適度に細分化されることで再利用の可能性が高まる。凝集性の高いクラスは限定された目的に仕様できるからである

ソフトウェアの品質（凝集度）について、例を用いて復習しました。
一概に機能的コヒージョンでなければいけない訳ではありませんが、
凝集度の高いモジュール・クラス設計ができるように常に意識していこうと思います。
ディレクトリパスの書き方

# 記事の目的
相対パスの書き方が曖昧だったので記録。
・ "./home/apple" &emsp;,&emsp;"/home/apple"&emsp;,&emsp;"../home/apple"の書き方の違いを理解する。
##### ＜本記事で取り扱うディレクトリ構造の例＞
```
 C:- Users                ←---カレントディレクトリ(現在の位置)
    |   |- desktop　　　　
    |      | - person1    ←---ここを示すパスを求めたい。
    |      | - person2
    |   | -userfile1
    |   | -userfile2
    |
    - image
    |   |-dog
    |   |-cat 
```

# パスとは？
階層構造内でのファイルやディレクトリの位置を示すモノ。

・絶対パス
・相対パス　　　
の二種類がある。


### 絶対パス
ルートディレクトリ（一番上）から見た時のパス。
```
C:Users/desktop/person1
```
### 相対パス
カレントディレクトリ（現在の位置）から見た時のパス
```
desktop/person1
./desktop/person1
```

# パスの書き方
```
desktop/person1　・・・(1)
```
.(ピリオド)： カレントディレクトリを表す。
```
./desktop/person1　 /*（.を付けることで（1）に比べて明示的になる）*/
```
先頭 /(スラッシュ) : 一番上のディレクトリ(ルートディレクトリ)を表す。
```
/Users/desktop/person1
```
..(ピリオド*2) : (カレントディレクトリから見た)一つ上の親ディレクトリを表す。

```
../Users/desktop/person1
```


# まとめ
常にカレントディレクトリ（自分の今いる位置）を気にする。
それか絶対パスで書く。
cssの要素指定について

以下ようなHTMLがあり、classが `a` かつ `b` であるときにstyleを指定したいときにどう指定することができるかメモとして残しておく。

```html
<div class="a">
  <p>test a</p>
</div>

<div class="a b">
  <p>test a b</p>
</div>
```

```css
.a.b {
    /* style */
    color: red;
}
```

上記のcssのように、クラスを空白なしで指定すると
`<div class="a b"></div>`を指定することができる。
ルータ広告について

●ルータ広告
IPv6では、IPプロトコル自体にアドレス自動設定機能を持つ。
IPv6インターフェイスがactiveになると、fe80::で始まるリンクローカルアドレスが自動的に設定。リンクローカルアドレスとは、RAを受信するのに必要なアドレス。

このアドレスを元に同セグメントのルータに向かって「ルータ要請」(RS、Router Solicitation)が送信。
同セグメントにルータがあり、「ルータ広告」（RA、Router Advertisement）を送信するように設定されている場合、指定されたプレフィックスとデフォルトゲートウエイの情報を返します。

Linuxでルータ広告を行うには、radvdを使用。
また、広告するLinuxはルータとしての役割も必要であるため、IPv6フォワーディングも有効にしておく必要があります。

IPv6フォワーディングの設定例
#echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
深掘りNxシリーズ ~ tensor を知る ③ 算術計算その2  行列の積 ~

東京にいるけどfukuokaexのYOSUKEです。
最近、[エリクサーちゃんで学ぶ Elixir](https://youtu.be/_QzrB6tTPwA)の動画を作成し始めてるので良かったらチャンネル登録お願いします。

さて、兼ねてより興味があったライブラリ、Nxについて勉強して行こうと思います。この記事は自分の為の備忘録でもあります。が、Elixir初学者でも分かりやすいように、なるべく解説をつけながらアウトプット目指します。

前回までの記事はこちら

深掘りNxシリーズ
|> [深掘りNxシリーズ ~ tensor を知る ① ~](https://qiita.com/Yoosuke/items/faafc1510bbae99f7036)
|> [深掘りNxシリーズ ~ tensor を知る ② 算術計算 ~](https://qiita.com/Yoosuke/items/193619975341e560a8f9)

同時進行で以下も学習しています。
ゼロから作る Deep LearningをElixirで学ぶシリーズ
|> [~ Numpy -> Nx に置き換えて 1章やる~](https://qiita.com/Yoosuke/items/8599ed0a976de1371ead)
|> [~ Perceptron（パーセプトロンの実装） ~](https://qiita.com/Yoosuke/items/751a9fe05b89755e25a8)
|> [~ 3章 Neural Network : NN を学ぶ （前編）~](https://qiita.com/Yoosuke/items/bc65b93e7e4dc1f0002d)

で、3章をやっているところで、前回、行列同士の積算がどうも違う結果になった。という所で止まっていましたが、これの解が見つかりました。という事で早速見て行きます。

## 行列の積

:::note info 
結論から言うと、行列の積の計算は```Nx.dot```を使います。 
:::

詳しくは、前回も触れているのでここでは```Nx```の行列の積の計算をする関数があったのでそちらを紹介します。

```elixir
iex()> a = Nx.tensor([[1,2],[3,4]])
#Nx.Tensor<
  s64[2][2]
  [
    [1, 2],
    [3, 4]
  ]
>
iex()> b = Nx.tensor([[5,6],[7,8]])
#Nx.Tensor<
  s64[2][2]
  [
    [5, 6],
    [7, 8]
  ]
>
iex()> Nx.dot(a, b)
#Nx.Tensor<
  s64[2][2]
  [
    [19, 22],
    [43, 50]
  ]
>
```

行列の形が違う同士でもあるルールを守れば計算できます。

```elixir
iex()> a = Nx.tensor([[1,2],[3,4],[5,6]])
#Nx.Tensor<
  s64[3][2]
  [
    [1, 2],
    [3, 4],
    [5, 6]
  ]
>
iex()> b = Nx.tensor([[1,2,3],[4,5,6]])
#Nx.Tensor<
  s64[2][3]
  [
    [1, 2, 3],
    [4, 5, 6]
  ]
>
iex()> c = Nx.dot(a, b)
#Nx.Tensor<
  s64[3][3]
  [
    [9, 12, 15],
    [19, 26, 33],
    [29, 40, 51]
  ]
>
```

あるルールを守らないとerrorが出ます。

```elixir
iex()> Nx.dot(a, c)
** (ArgumentError) dot/zip expects shapes to be compatible, dimension 1 of left-side (2) does not equal dimension 0 of right-side (3)
    (nx 0.4.1) lib/nx/shape.ex:495: Nx.Shape.validate_zip_reduce_axes!/4
    (nx 0.4.1) lib/nx/shape.ex:470: Nx.Shape.zip_reduce/6
    (nx 0.4.1) lib/nx/shape.ex:1616: Nx.Shape.dot/8
    (nx 0.4.1) lib/nx.ex:9392: Nx.dot/6
```

気を付けるべきルールは ```Nx.shape ``` で確認できます。

```elixir
iex()> Nx.shape a
{3, 2}
iex()> Nx.shape b
{2, 3}
iex()> Nx.shape c
{3, 3}
```

このタプルで帰ってきた```{3, 2}```や```{2, 3}```を見ると内側の数字が同じです。
この場合は計算ができます。これが、```{3, 2}```と```{3, 3}```これだとエラーになります。

この事からも分かる通り、行列の積は a x b と b x a で結果が変わります。

実際にいくつかパターンを見て行きましょう。

```elixir
iex()> Nx.dot(b, a)
#Nx.Tensor<
  s64[2][2]
  [
    [22, 28],
    [49, 64]
  ]
>
iex()> Nx.dot(a, b)
#Nx.Tensor<
  s64[3][3]
  [
    [9, 12, 15],
    [19, 26, 33],
    [29, 40, 51]
  ]
>
iex()> Nx.dot(b, c)
#Nx.Tensor<
  s64[2][3]
  [
    [134, 184, 234],
    [305, 418, 531]
  ]
>
iex()> Nx.dot(c, b)
** (ArgumentError) dot/zip expects shapes to be compatible, dimension 1 of left-side (3) does not equal dimension 0 of right-side (2)
    (nx 0.4.1) lib/nx/shape.ex:495: Nx.Shape.validate_zip_reduce_axes!/4
    (nx 0.4.1) lib/nx/shape.ex:470: Nx.Shape.zip_reduce/6
    (nx 0.4.1) lib/nx/shape.ex:1616: Nx.Shape.dot/8
    (nx 0.4.1) lib/nx.ex:9392: Nx.dot/6
iex()> Nx.dot(c, a)
#Nx.Tensor<
  s64[3][2]
  [
    [120, 156],
    [262, 340],
    [404, 524]
  ]
>
```

という事で、一番知りたかった、行列の積の計算について、今回わかりました。
【Mac】コマンドでファイルをゴミ箱に移動する方法

## はじめに

`rm sample.txt`などを実行するとゴミ箱に移動することなく完全に削除されます。  
完全に削除するのではなくゴミ箱に移動する方法について記載します。  

## ファイルをゴミ箱に移動する方法

次のコマンドを実行するとファイルをゴミ箱に移動できます。  

```terminal
mv sample.txt ~/.Trash
```

```terminal
$ ls ~/.Trash
sample.txt

```
NLP 100 Exercise 2020 (Rev 2) Chapter 1: Warm-up 00. Reversed string

#### 00. Reversed string
Obtain the string that arranges letters of the string “stressed” in reverse order (tail to head).

```py:solution00.py 
# Sequence types (list, tuple, string, range) support slicing.
# Therefore, you can sort in reverse order by setting text[::-1] in the slice operation.
text = "stressed"
print(text[::-1])

# You can also use reversed() method.
print(''.join(reversed(text)))

```

```: output 
desserts
desserts
```

この問題では、文字列を逆順に並び替えます。

#### Reference article

[[Python]スライス操作でlistを逆順にする](https://qiita.com/k-nakamura/items/49c393227d68bd10562b)
いまさらAI学んでみた（第4.5回）

# はじめに
こんにちは、株式会社ジールの[@Suguru-Terouchi](https://qiita.com/Suguru-Terouchi)です。
三が日は子供の胃腸炎をもらって腹痛と高熱で寝込んでました。
気を取り直して、2023年も頑張っていきましょう。

さて、[前回](https://qiita.com/Suguru-Terouchi/items/56c6d5138528fcd256e7)まで基礎編として機械学習の３つの手法を学んできました。
今回から実践編に入っていきたいと思いますが、まだそこまで仕事モードに入れていないので、
準備運動も兼ねて、第4.5回としてゆるっとAI/機械学習ことはじめしていきたいと思います。

# サクッと触れるAI/機械学習
前回、AWSのDeepRacerというサービスをご紹介させて頂きましたが、
それ以外にもAWSで提供されているAI/機械学習サービスはいっぱいあります。

どれくらいあるかというとこれくらいある。（執筆時点で26サービス）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1963640/2c15b337-054d-0136-8b99-b3410c421df0.png)
一つ一つ紹介していると2023年が終わってしまいそうなので、いくつか摘んでいきます。

### Amazon Comprehend
公式サイトより引用：https://aws.amazon.com/jp/comprehend/features/
`Amazon Comprehend は、機械学習を使用してテキストから洞察を見つける自然言語処理 (NLP) サービスです。`

簡単にいうと入力されたテキスト（文字列）を分析して色々な結果を返してくれるサービスですね、
機能の一つに感情分析というのがあるので、早速やってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1963640/7d9a77a5-bfbf-eb57-682f-5017ce68e6c5.png)
感情分析の結果として、赤枠部分にある「Neutral」（中立的）、「Positive」（肯定的）、「Negative」（否定的）、「Mixed」（混在）の４つの要素とスコアが表示されています。
最初日本語でやってみたのですが、ほぼ「Mixed」（混在）になってしまったので、翻訳サイトの力を借りて英語でも試してみたところなんとなくイメージしていた結果が返ってきました。
この結果の違いは日本人がシャイということではなく、日本語に対応してからまだ日が浅いことと、日本語という文字列が分析側から見ると複雑ということがありそうです。

### Amazon Polly
公式サイトより引用：https://aws.amazon.com/jp/polly/
`Amazon Polly は深層学習技術を使用し、人間の声のような音声を合成します。そのため、記事を音声に変換することができます。`

簡単にいうと入力されたテキスト（文字列）を分析して音声データを返してくれるサービスですね、早速やってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1963640/3d3d4961-18bf-4ea2-b689-22624cc4fe30.png)
オレンジ色のボタンの「▶ 音声を聴く」で入力したテキストを流暢に読み上げてくれました。
特にニューラルを選択した時の音声は全く片言感がありませんでした！（残念ながら音声データは貼り付けられなかったので試せる環境がある方は是非やってみてください。
設定も自然な読み上げ（ニューラル）と機械的な読み上げ（スタンダード）があり、
言語により音声の種類（画像だとTakumiさん）が変わったりするのが面白いと思いました。
ただ、これをどう活用するのかイメージ沸かなかったので調べてみたのですが、ニュースサイトを運営している企業などの事例が出てきました。確かに毎日変わる記事の読み上げデータに活かせるとなるとメリット大きそうです。

### Amazon Rekognition
公式サイトより引用：https://aws.amazon.com/jp/rekognition/
`Amazon Rekognition は、事前トレーニングされたカスタマイズ可能なコンピュータビジョン (CV) 機能を提供して、画像と動画から情報とインサイトを抽出します。`

これはこれまで学習してきた画像分析に相当するサービスですね、一口に画像分析といっても色々ありそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1963640/c3897266-5ba7-5025-71bb-2418f6ac62b0.png)
入力する画像のことも考えて今回は「ラベル検出」をやってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1963640/443e3da3-1f91-5dbe-c5c2-276cb631d66a.png)

ちょっと画像の解像度があまり良くないせいか「Person」とか「Baby」が入ってきてしまっていますが、
9割以上のスコアを出しているものに異論はなく、個人的には「Toilet」が出てきたことに驚きを隠せませんでした。

# おわりに
いかがでしたでしょうか。
これまで基礎を学んできましたが、もうここまで学習済みのモデルを使ったサービスが提供されているんですね。

次回は今度こそ、実践編として今回あえてスルーしたAmazon SageMakerに触れていきたいと思います。
Linux基礎知識

## はじめに
Udemyの講座で、Linuxについて学んだので、簡単なメモ代わりに書いていきます。


## Linuxとは
・OSの一種で、コンピューターを動かすための基本ソフト
・Linuxはサーバー、組み込み、デスクトップといった幅広い用途で使われている。

特徴
・オープンソースなので誰でも自由に使える。
・世界中で使われていて信頼度が高い。
・品質の高いソフトウェアが利用できる。
・自動化するための仕組みがあり、サーバーの運用がしやすい。

欠点
・商用アプリケーションがあまり存在しない。
・日本語対応されていない部分が多い。


## なぜLinuxを学ぶのか
・枯れている技術であり、何年経っても使える技術だから。
⇨一度習得すれば、何年経っても使える。


## カーネルとディストリビューションとは
・LinuxカーネルはOSの中核となるソフトウェア。ディストリビューションはカーネルに色々なソフトウェアを組み合わせて使いやすくしたもの。(1000種類以上ある)
Red Hat系とDebian系が主流

## シェルとは
・LinuxのCLI(キーボードからコマンドを入力し、文字列として結果を出力するインターフェース)を提供するソフトウェア。ユーザーとLinuxカーネル(カーネルのインターフェース)の仲介役をしている。

・シェルの画面 
↓
```
[ユーザー名@ホスト名 ~ ] $
[hukuryo@localhost ~ ]$⇦プロンプト
```
## シェルの仕組み
コマンドを入力すると実行結果が出力される
①ユーザーがプロンプトにコマンドを打つ
②シェルが入力されて名前のコマンドを探す
③Linuxカーネルが見つかったコマンドを実行する。
④シェルが実行結果を画面に表示する。

・ターミナルとシェルは別物。ターミナルの中でシェルが動いている。
・シェルの種類にはsh,bash,zsh等がある。

## カーネルの移動コマンド
|コマンド|内容|
|:--:|:---:|
|Ctrl + f|一文字次へ移動|
|Ctrl + b|一文字前へ移動|
|Ctrl + a|行の先頭へ移動|
|Ctrl + e|行の最後へ移動|
|Meta + f(esc + f)|一単語次へ移動|
|Meta + f(esc + b)|一単語前へ移動|

Macの場合はCtrlではなく、commandになる。

## 文字列の編集コマンド
|コマンド|内容|
|:--:|:---:|
|Ctrl + h|カーソルの左を一文字削除|
|Ctrl + d|カーソル部分を一文字削除|
|Ctrl + w|カーソル一の単語を削除(カーソルの前部分)|
|Ctrl + u|カーソルの位置から行頭まで削除|
|Ctrl + k|カーソルの位置から行末まで削除|
|Ctrl + y|最後に削除した内容を挿入|

## トラブル時の対応コマンド
|コマンド|内容|
|:--:|:---:|
|Ctrl + c|実行中のコマンドを強制終了|
|Ctrl + l|画面の消去。文字化けした時のクリアにも使える|
|Ctrl + s|画面表示のロック(キーボードから文字の入力を受け付けない)|
|Ctrl + q|画面表示のロック解除|

以上になります。ありがとうございました。
Postmanのインストールから最初のリクエストまで

# はじめに
postmanの導入を試してみることにした時の忘備録。
まずは最初のステップとして、アプリケーション版で導入して、リクエストを通すところまで試してみた。

# 導入
以下のサイトから取得できる。
https://www.postman.com/downloads/

アカウント登録が必要だが、Googleアカウントでも登録が可能である。

いつものWebからアプリケーションを取ってくる手順で、オレンジ色のアイコンが追加されるので、起動してログインすれば導入は完了になる。

# リクエストを送ってみる
以下を参考にFast APIで簡単なAPIをローカルで構築する。
https://fastapi.tiangolo.com/ja/tutorial/first-steps/

左上、NewからHTTP Requestを選択。
![スクリーンショット 2023-01-05 23.26.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329273/36cd5ca3-9de3-fcf2-65e8-d1c30010bdf9.png)

[http://127.0.0.1:8000](http://127.0.0.1:8000)をリクエスト先に設定し、Sendを押すとレスポンスが返却された。
![スクリーンショット 2023-01-05 23.29.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329273/b2aa150c-3d74-f4b4-d0ef-c80a00a70f6a.png)

今日はここまで。
よく使うLinuxコマンド

よく使用するLinuxコマンド・記号をまとめました。

# 目次

[1. find](#find)
[2. grep](#grep)
[3. diff](#diff)
[4. 記号](#記号)

# find

ファイルやディレクトリを検索するコマンド

## 基本的な使い方

```
$ find 検索場所  [オプション]  検索ファイル名
```

## よく使うオプションなど

|オプション|意味|例|
|:---|:---|:---|
|-name|ファイル名を指定して検索（ワイルドカードを使用して、部分検索が可能）|`find ./usr/ -name \*.txt`|
|-iname|文字の大小を区別せずにファイル名を検索|`find ./usr/ -name test.txt`|
|-type f|ファイルのみを対象に検索||
|-type d|ディレクトリのみを対象に検索||
|-size|ファイルの容量を指定して検索|`find /var/log -size -100k`|
|-anewer|変更日時よりも後にアクセスしたファイル・ディレクトリを検索|`find ./usr/ -anewer ./usr/hoge.txt`|
|-newer|指定したファイルの更新日時よりも後にアクセスしたファイル・ディレクトリを検索||
|-empty|ファイル容量が0のファイル/ディレクトリを検索||


演算子も使用することでより検索の幅を広げることができます。

|演算子|意味|例|
|:---|:---|:---|
|-and|複数条件（AND検索）|`find ./usr/ -type f -and -empty`|
|-or|複数条件（OR検索）||
|-not|条件不一致検索|`find ./usr/ -not -type f`|

# grep

文字列を検索するコマンド

## 基本的な使い方

```
$ grep [オプション] 検索文字列 対象ファイル名
```

## よく使うオプション

|オプション|意味|例|
|:---|:---|:---|
|-E|拡張正規表現で検索|`grep –E 'a｜b' ./usr/*`|
|-e [検索文字列]|パターンを指定して検索|`grep -e 'hoge' test.txt`|
|-i|大文字と小文字を区別せず検索||
|-v|一致しないものを検索||
|-m [数字]|数字の行分だけ検索結果を表示||
|–n|検索結果に行数を表示||

# diff

ファイルを比較するコマンド

## 基本的な使い方

```
$ diff [オプション] ファイル名1 ファイル名2
```

## よく使うオプション

|オプション|意味|
|:---|:---|
|-b|スペースの差分は無視して差分を表示|
|-c|context形式で差分を表示|
|-i|大文字と小文字の区別を無視して差分を表示|
|-s|差分があれば差分を出力し、無ければ差分なしのメッセージを出力|
|--color|色付きで差分を表示|


# 記号

## >

出力先を変更

```
# 「hello world」をresult.txtに出力
$ echo hello world > result.txt
```

## >>

新規作成ではなく、既存のテキストファイルに追記する

```
# 「hello world」を既存のresult2.txtに出力
$ echo hello world >> result.txt
```


## &

バックグランドジョブとして実行

```
$ echo 1000 &
```


## &&

コマンドを連結して実行

```
echo hello world && echo world
```
Leetcode 452. Minimum Number of Arrows to Burst Balloons

https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/description/

## 難易度
### Medium

## アプローチ
### Brute-force

```java
class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, (a, b) -> Integer.compare(a[1],b[1]));

        int result = 1;
        int prev = 0;

        for(int curr = 1 ; curr < points.length; curr++){
            if(points[curr][0] > points[prev][1]){
                result++;
                prev = curr;
            }
        }
        return result;
    }
}
```

 - [こちら](https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/solutions/3000906/java-solution-with-explanation/?languageTags=java)の解説を参照しました
Flaskでルーティング　その１


4月から社会人エンジニアになるのに向けて最近はPythonおよびFlaskを勉強しています。
主にFlaskの勉強には以下のUdemyの教材を見ています

https://www.udemy.com/course/flaskpythonweb/


ただ、どこかに書いておかないと忘れてしまいそうなので備忘録がてら書いています。
細かく分けて書いていきます。


<br>


## 第１回目
###  今回やることはルーティング！
URLによって表示する内容を変えていきたいと思います！



まず基本となるコードがこちら！

```python:app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello Flask!</h1>'


if __name__ == '__main__':
    app.run()
```

こちらを実行すると以下の画面になります。

![スクリーンショット 2023-01-05 21.47.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552555/46d11ba8-0fa8-0328-0222-27557e03a4a9.png)

Hello Flask!が出てきました！やったね！！


続けて以下のコードを追記します。

```python:app.py
@app.route('/myname')
def name():
    return '<p>私はつぼです</p>'
```

そして、アドレスを 'http://127.0.0.1:5000/myname' にして再度読み込むと

![スクリーンショット 2023-01-05 22.34.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552555/f841450e-b47f-2ada-a2f0-c64294924474.png)


はい！出ましたー！！



ということで、Flaskを用いて簡単にですがルーティングしてみました！
php-cs-fixerをvscodeに設定する ハマりポイントも添えて

## 目的
php-cs-fixerをvscodeで動作させるのに想定以上に時間がかかったのでその備忘録として

## 取り扱わないこと
1. php-cs-fixerのそれぞれの設定の意味
[PHP-CS-Fixer configuration](https://mlocati.github.io/php-cs-fixer-configurator/#version:3.13)を読んだ方が分かりやすいです
1. php-cs-fixerやphpのインストール方法

## 前提
php-cs-fixerと動かすphpはダウンロード済み

## .php-cs-fixer.phpを設定
```php
<?php

$target_dir = ""; // 任意のディレクトリ
return (new PhpCsFixer\Config())
    ->setRiskyAllowed(false)
    ->setRules([
        // configurationを見ながら設定
    ])
    ->setFinder(
        PhpCsFixer\Finder::create()
            ->in($target_dir)
            ->exclude([
                // 除外ファイル/ディレクトリを指定
            ])
            ->name('*.php')
    )
```
#### ハマりポイント
$target_dirをルートディレクトリとして、そこからの相対パスを指定
`/path/to/working/hoge/fuga/`のfuga配下を除外したい場合、`$target_dir = /path/to/working;` であれば`'hoge/fuga',` と指定する

## vscodeで設定する方法
### php-cs-fixer拡張を入れる
https://marketplace.visualstudio.com/items?itemName=junstyle.php-cs-fixer
### settings.jsonを設定
```jsonnet
{
    "php-cs-fixer.documentFormattingProvider": true,
    "php-cs-fixer.excutablePath": "php-cs-fixer",
    "php-cs-fixer.excutablePathWindows": "php-cs-fixer.bat", // windowsで利用する場合こちらを設定
    "php-cs-fixer.exclude": [
        // .php-cs-fixer.phpと異なる
        // **/hoge/**/*.php のように設定する
        "",
    ],
    "php-cs-fixer.onsave": true,
    "php-cs-fixer.pathMode": "intersection",
    [php]: {
        "editor.defaultFormatter": "junstyle.php-cs-fixer"
    },
}
```
#### ハマりポイント
1. .php-cs-fixer.phpのexcludeを設定しているのに保存時のフォーマットが行われる
    * プラグインの問題でonsave時に実行されるとpathModeがoverrideで実行されてしまうため.php-cs-fixer.phpのsetFinderの内容が上書きされてしまう
         > intersection mode only works on explorer context menu action.
 [参照](https://github.com/junstyle/vscode-php-cs-fixer/issues/48)
    * そのため、onsaveとexcludeをどちらも利用する際はsettings.jsonのexcludeを設定する
1. excludeを設定しているのにフォーマットされる
    * コマンドパレット(cmd + shift + p)から実行するときは`"php-cs-fixer.pathMode": "intersection"`を設定していないとoverrideで実行される
1. excludeは**/から始めないと認識してくれない
    https://github.com/junstyle/vscode-php-cs-fixer/issues/173

## まとめ
分からないことがあれば公式ドキュメントやリポジトリのissueを探そう
大体のことは記載 or 質問済みです
Laravelのエラー「SQLSTATE[42S22]: Column not found: 1054 Unknown column」を全力で解決する

### ことのあらまし
* テーブルarticlesにアクセスしたユーザのログを取りたい、と言うことでarticle_access_logsを新規追加するよ
* Modelも新規追加したよ
* ControllerでSELECTしたら良く分からないエラーが出たよ
* ER図はこんな感じ
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2809857/25f2ffd8-058a-bdb2-0da3-9bbac9775dee.png)



### エラーの内容
なんてことないエラーだと思ったんです。

```
SQLSTATE[42S22]: Column not found: 1054 Unknown column ・・・
```
article_access_logテーブルからSELECTする時のカラム名のtypoかしらね、と悠長に構えていたら

```
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'article_access_logs.' in 'where clause' (SQL: select * from `article_access_logs` where `id` = 1 and `article_access_logs`.`` is null limit 1)
```

え・・・？
カラム名が空・・・？
何が起きているんだ・・・

### ControllerとModel
特別なことはしていない。
詰んだかもしれないと途方に暮れる。

```app\Http\Controllers\ArticleController.php
use App\Models\ArticleAccessLog;
use App\Models\Article;

class ArticleController extends Controller
{
  public function index(Request $request)
  {
    //ここは正しく取得できる
    $test1 = Article::where('id', '1')->first();
    dump($test1);

    //ここでエラーになる
    $test2 = ArticleAccessLog::where('id', '1')->first();
    dump($test2);
  }
}
```

```app\Models\ArticleAccessLog.php
namespace App\Models;

use App\Models\BaseModel;
use Illuminate\Database\Eloquent\SoftDeletes;

class Log extends BaseModel
{
  use SoftDeletes;
  const UPDATED_AT = null;
  const DELETED_AT = null;

  protected $guarded = [
    'id', 'created_at'
  ];
}
```

### そして解決へ・・・
Modelの設定を修正することで解決・・・
```app\Models\ArticleAccessLog.php
namespace App\Models;

use App\Models\BaseModel;
use Illuminate\Database\Eloquent\SoftDeletes;

class Log extends BaseModel
{
  //↓ここがいらない
  //use SoftDeletes;
  //const UPDATED_AT = null;
  //const DELETED_AT = null;

  protected $guarded = [
    'id', 'created_at'
  ];
}
```

そりゃそうだ。
article_access_logsテーブルにはupdated_atカラムもdeletedカラムもない。
何にも考えずにコピペで作っていた所為だな、と反省。


### そもそもの話
ログテーブルなんだからupdateもdeleteもする必要ないんですよねえ。
ちゃんと考えましょうね、自分。
こんなうっかりミスに嵌る人が出ないことを祈ります・・・。
【Ruby】クラス変数ではなくインスタンス変数を使う場合

# Rubyの@変数
Rubyには2つの@変数があり、先頭が@の`インスタンス変数`と先頭が@@変数の`クラス変数`に分かれる。

インスタンス変数はそれぞれのオブジェクトに属しています。
あるオブジェクトに値がセットされたインスタンス変数は、他のオブジェクトのインスタンス変数には基本的には影響を与えません。

一方で、クラス変数は、オブジェクトごとではなく、クラスごとに与えられます。
クラスから作られたインスタンスは、すべてのインスタンスで参照することができます。
このため、オブジェクトでクラス変数を変更して、意図せずに他のオブジェクトのインスタンス変数を変更してしまうことがあります。

これを、例を示して考えてみます。

# シングルトンパターンを実装して@変数を考える

まず、クラス変数が使用される場面として、シングルトンパターンがあります。
シングルトンパターンは、特定のクラスのインスタンスを一つ作り、そのインスタンスをすべてのコードがアクセスできるようにしたい場合に実装されます。

```ruby
class Singleton
  private_class_method(:new, :dup, :clone)
  def self.instance
    @@instance ||= new
  end
end

# 書籍：Effective Rubyより抜粋
```
`Singleton`クラスの中に`self.instance`メソッドが定義されています。
これは、インスタンスの存在を確認し、存在しなければ、newメソッドを実行するように定義されています。

また、`private_class_method`はpublicなクラスメソッドをprivateなクラスメソッドとして定義できます。
`:new, :dup, :clone`をprivateにしているのは、親クラスであるObjectクラスに定義されているメソッドをprivate化して、インスタンスを作る役割をinstanceメソッドに一任しているのがわかります。

では、Singletonクラスを継承する`Configrationクラス`と`Databaseクラス`を定義してみます。

```ruby
class Configuration < Singleton
end

class Database < Singleton
end

p Configuration.instance
 # => <Configuration:0x0000563c0e4d64a8>
p Database.instance
 # => <Configuration:0x0000563c0e4d64a8>

```
実際に実装した結果は、どちらもConfigurationクラスから生成されたクラス変数が出力されています。1つのオブジェクトが他のオブジェクトに影響を与えてしまっているのがわかります。

# インスタンス変数を使う

考え方としては、すべてのクラスで一意なオブジェクトとして扱われる必要があります。
冒頭で説明した通り、この場合はインスタンス変数を適用することで、解決することができます。

```ruby
class Singleton
  private_class_method(:new, :dup, :clone)
  def self.instance
    @instance ||= new
  end
end

# 書籍：Effective Rubyより抜粋
```

クラス変数とインスタンス変数の使用場面には十分注意しましょう！
ACPI の AML を逆アセンブルして見る方法

# はじめに

1,2 年に一回くらい ACPI 関係の調査で AML を逆アセンブルして見る機会があるのですが、毎回方法を忘れるので書いておこうと思いました。


# 方法

例えば以下のコマンドで DSDT を逆アセンブルして出力できる。

```shell
sudo acpidump  > dump_acpi.dat
acpixtract dump_acpi.dat
iasl -d dsdt.dat
```

それぞれのコマンドは

-   1 つ目のコマンドで ACPI テーブルをダンプ
-   2 つ目のコマンドで ACPI テーブルのダンプから DSDT と SSDT テーブルを抽出し別々のバイナリファイルとして出力
    -   `-a` オプションを付けると DSDT と SSDT 以外のテーブルも抽出する
-   3 つ目のコマンドで逆アセンブル

という感じ。


# おわりに

次に自分が AML を逆アセンブルするのはいつになるのかわかりませんが、その時にこの記事をみて思い出せればいいな。 (書く前からわかっていたが、また内容が薄い記事になってしまった&#x2026;)
Vivox（音声チャットツール）を導入してみる

音声認識で調べていたところ、以下のような音声ツールがあるようなので
実装を試してみます。

Oculusとかでも動くというので、ボッチですがちょっとお試ししてみようかと....

https://developer.vivox.com/apps

https://qiita.com/Cova8bitdot/items/1c4288485a13e54b513f

上記の内容で割とさくさく準備ができるので、今回は準備を割愛しています。

## 導入していく
パッケージはtgz形式なので、パッケージマネージャーにて２個目のやつで導入を進めます。
ついでにSampleをDL。

![bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/86ff20d2-15ab-ced1-aee5-02a707322e0c.png)

DLが終わったら設定を進められるので次に進みます。

![cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/3d0d708b-7762-5b0f-5b39-94860eff7ea0.png)

とりあえずエラーがでないようにして、TestModeをONにしておきます。

![ee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/882be6d3-09b7-bc8a-ce0a-638762e3968c.png)

公式ドキュメントには、Unityダッシュボードでの登録が必要とか書いてありましたが
Quiitaの記事の手順で登録したら問題なくapkファイル化できました。
情報が古いのか、無料分が超過したら自動でストップする仕組みなんでしょうか...


あとは、先ほどのQuiitaと同じ設定をしてOculusからWindowsへ音声が流れるかテストを行います。
→実機確認までしようとしましたが、今日はここまで...!
（テストしたら更新します）

【追記】
設定がおかしいのか、自分のOculus環境では上手く動作しませんでした...
恐らくサーバーへの接続に時間がかかり、フリーズしてしてしまっているのかとは思うのですが
詳しくは調査できていないので設定漏れも考えらえます。

## その他
どうやらマイクの制御をするようなので、Azureの音声認識と被る可能性がある
＝同時に実装、というのはちょっと難しいのかもしれません。

うーん、Text to Speechがあるので実装してみたかったです...

https://qiita.com/neusstudio/items/9942c079d4c06b5fd36e
Linuxとは何か

# Linuxとは何か

## Linuxとは 

●LinuxはOSの一種でコンピューターを動かすための基本ソフト。オープンソースで誰でも自由に使える、世界中で使われていて信頼性が高いなど多くの長所があるが、商用アプリケーションがあまり存在しない（microsoft officeが動作しない）といった欠点もある。

### Linuxを学ぶ意義

①幅広い場所で使われている。（サーバー用・組み込み用）
②長年使える。技術が枯れているので、一度習得すれば何年経っても使える。

## OSとは

●OSとはハードウェアとソフトウェア（アプリケーション）の仲介役。OSのおかげで、ハードウェアを意識することなくソフトウェア開発ができる。

## カーネルとディストリビューションとは

①カーネル・・OS(Linux）の中核となるソフトウェア。（狭義のLinux）
②ディストリビューション・・カーネルに色々なソフトウェアを組み合わせて使いやすくしたもの。(Redhat系、Debian系が主流）

### 有名なディストリビューション

1,CentOS 2,Ubuntu 3,Fedora

## シェルとは

●ユーザーとLinuxカーネルの仲介役（インターフェース）の役割を果たしている。通訳みたいなもの
＊ターミナルとシェルは別物。ターミナルは画面を担当するソフトウェア。シェルはコマンドを解釈するソフトウェア。ターミナルの中でシェルが動いている。

### 代表的なシェル

1,sh 2,bash 3,zsh

##標準入出力とは
Linuxで実行されるプログラムにはデフォルトで3つの出入り口がある。それが標準入力、標準出力。標準エラー出力

### 標準入力
デフォルトはキーボード
### 標準出力
デフォルトは端末画面
### 標準エラー出力 
デフォルトは端末画面

### /dev/nullの機能

dev/nullはUNIXやLinuxシステムにおいて、不要なデータを捨てるための仮想的なファイルシステムで、全てのデータを無視するために使用される。このデバイスファイルにデータを書き込んでも、何も保存されず、読み取ることもできない。ログファイルを生成する場合など、不要な出力を削除するために便利に使用される。
憂鬱な時、鬱な時にすること

# 思い切り美味しいものを食べる　

普段500円くらいのランチなら、思い切って5000円くらいの昼食をいただく。　

「駄目だ、もう何もできない」と思った時にするかもしれないこと

https://qiita.com/kaizen_nagoya/items/d672e461a75728dd5e74

お金が続くかどうかが運命。
# 山か、海か、温泉に行く。　

# 子供と遊ぶ。育児を分担する。　
動物のお世話、植物のお世話でも良い。　

近所の子供の運動、勉強のお手伝いも良い。


# 映画、音楽、読書　
美術館、博物館に行くのも良い。　
神社仏閣、教会でも良い。

# ゲーム
依存症にはおきをつけください。

遊興競技依存症拮抗

https://qiita.com/kaizen_nagoya/items/934b65ea3282f7e863fe

１年ゲーム断ちして

https://qiita.com/kaizen_nagoya/items/a29748da55ef1e1fe6cd



# 安全分析　
本当に人命に影響を与えることに絞って人と接する。どうでもいい事言う人はどうでもいい。


# 参考資料

人間が計算機に勝てる３つの能力。忘れる。諦める。辞める。

https://qiita.com/kaizen_nagoya/items/70731eb529f3cbfc8c69



プログラマが苦手な「人との口頭のやりとり」面談技術(interview technique)７つの要点。仮説（48）転職(9)

https://qiita.com/kaizen_nagoya/items/f322df6978853c708c99

仕様を自然言語で書くのやめませんか。「言葉にすれば」「嘘に染まる」水谷啓二・ダンシングオールナイト　もんたよしのり

https://qiita.com/kaizen_nagoya/items/dd6ee74818f1a1a1c918


「真実は一つ」、上・下、裏・表、嘘・本当。仮説（118）

https://qiita.com/kaizen_nagoya/items/26f612afdb0b68b78b3c


統計の嘘。仮説（127）

https://qiita.com/kaizen_nagoya/items/63b48ecf258a3471c51b

社会事象は検証できない。仮説（204）

https://qiita.com/kaizen_nagoya/items/6b989b26f7ea2ac342cf


### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.