OmniAICreator/Qiita-1.07M huggingface dataset:
ExpoでAndroid Emulatorが起動しない時



```
Error opening simulator. Check Metro logs for details.
```

![スクリーンショット 2022-04-10 10.24.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/403d7f75-264c-1904-54a2-5ed418d3e67e.png "スクリーンショット 2022-04-10 10.24.53.png")


## シェルの設定へ追加

#### シェルの設定へ追加

   * **Zsh**の場合

     ```
     echo 'export PATH="$HOME/Library/Android/sdk/platform-tools:$PATH"' >> ~/.zshrc
     ```
     
   * **bash**の場合

     ```
     echo 'export PATH="$HOME/Library/Android/sdk/platform-tools:$PATH"' >> ~/.bash_profile
     ```
     
   
## 適用

```
exec $SHELL -l
```
    
         
## 確認

```
vi ~/.zshrc
```

```
adb version
```

以下のように表示されればOK

```
adb version
Android Debug Bridge version 1.0.41
Version 31.0.3-7562133
Installed as /Users/xxxx/Library/Android/sdk/platform-tools/adb
```



##再起動

再度ExpoでAndroid Emulatorを起動


![スクリーンショット 2022-04-10 10.38.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/d415f67f-8070-2ba0-985e-2ac71c75404a.png "スクリーンショット 2022-04-10 10.38.57.png")
cscの作法 その109

# 概要
cscの作法、調べてみた。
ファイルを解凍してみた。

# サンプルコード

```
using System;
using System.IO;
using System.IO.Compression;

public class DecompressSample {
	static void Main(string[] args) {
		string inFile = args[0];
		if (!inFile.ToLower().EndsWith(".gz"))
		{
			return;
		}
		string outFile = "_" + inFile.Substring(0, inFile.Length - 3);
		int num;
		byte[] buf = new byte[1024];
		FileStream inStream = new FileStream(inFile, FileMode.Open, FileAccess.Read);
		GZipStream decompStream = new GZipStream(inStream, CompressionMode.Decompress);
		FileStream outStream = new FileStream(outFile, FileMode.Create);
		using (inStream)
		using (outStream)
		using (decompStream)
		{
			while ((num = decompStream.Read(buf, 0, buf.Length)) > 0)
			{
				outStream.Write(buf, 0, num);
			}
		}
	}
}

```

以上。
cscの作法 その108

# 概要
cscの作法、調べてみた。
ファイルを圧縮してみた。

# サンプルコード

```
using System;
using System.IO;
using System.IO.Compression;

public class CompressSample {
	static void Main(string[] args) {
		string inFile = args[0];
		string outFile = Path.GetFileName(inFile) + ".gz";
		int num;
		byte[] buf = new byte[1024];
		FileStream inStream = new FileStream(inFile, FileMode.Open, FileAccess.Read);
		FileStream outStream = new FileStream(outFile, FileMode.Create);
		GZipStream compStream = new GZipStream(outStream, CompressionMode.Compress);
		using (inStream)
		using (outStream)
		using (compStream)
		{
			while ((num = inStream.Read(buf, 0, buf.Length)) > 0)
			{
				compStream.Write(buf, 0, num);
			}
		}
	}
}



```

以上。
Windows10 WSLでUbuntsu 20.04.4 LTS インストール


Windows10(version 21H2) にて「Ubuntsu20.04.4 LTS」をインストールしてみた。
* プログラムメニューからMicrosoft Storeを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/6ca96ce9-c102-38c8-79e6-44c1ec6b5e32.png)

* Ubuntuをキーワード検索して以下「Ubuntsu20.04.4 LTS」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/af5b0372-c3e4-f3c1-c9ee-630459ebe4c7.png)

* プログラムメニューよりUbuntuアイコンを選択すると、以下エラーでインストールが失敗。
```
WslRegisterDistribution failed with error: 0x8007019e
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/ad09bea6-9908-bf64-da8f-8dd5d73e593f.png)

* 「Windows PowerShell」を右クリックして「管理者として実行」で開き、以下を実行。
```
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

* 以下が画面でYを押す。すぐにOS再起動がかかるので注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/4c0eb3f6-da88-90b6-4d80-a0dab186e2ea.png)

* 再起動後にプログラムメニューから「Ubuntsu20.04.4 LTS」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/f3578dd0-7170-d433-45c8-4bf9d06af9cf.png)

* id/passを設定利用開始
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/40c5c604-c509-fcf9-6d0e-ab81e9c4166e.png)

* 以下コマンドでOSのバージョンを確認
```
lsb_release -d
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/9e769849-efab-6b90-7938-856167251fbc.png)

以上で完了

WSLのバージョンを確認すると、WSL2ではなくWSLで動作しているよう。
```
wsl -l -v
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/91a12e3d-7060-c73b-acee-86809e343546.png)

WSLとWSL2の違いが思い出すために調査。
https://docs.microsoft.com/ja-jp/windows/wsl/compare-versions
https://www.kagoya.jp/howto/it-glossary/develop/wsl2_linux/

ファイル システム パフォーマンスの向上
システム コールの完全な互換性のサポート
という理由からであれば、上記の設定変更をしてWSL2で動作がよさそう。

---
それ以外気になったこと
「No LSB modules are available.」と表示されているので、調査。問題なしと判断。
（参考：）https://postgresweb.com/ubuntu-no-lsb-modules-are-available
SKT豆腐屋と「Screeps: Arena」 のチュートリアル#1「Loop and import」を進めよう

# Screeps: Arenaとは
　「JavaScript」などのプログラミング言語を使って自軍の「駒」を動かし他プレイヤーと戦うゲーム
Steamからダウンロードできる。https://store.steampowered.com/app/1137320/Screeps_Arena/?l=japanese
Screepsの公式discordはこちら（英語）：https://discord.gg/screeps
超全茶discord(日本語)では一緒に楽しみたい人を募集中：https://discord.gg/Am9Rz4w　（discord)

# Screeps: Arenaのチュートリアルを進めよう
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609246/ba31d8ac-b2c4-7f70-d45b-5128f5173c5f.png" width=50%>

## プログラミング言語の切り替え方
- プログラミング言語の切り替えってどうやるの？
→　他の言語から「wasm」か「js」にcompileすればいいんだよ！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609246/405a4656-3f83-95cc-0a79-81db48120fbb.png" width=50%>

## チュートリアル用のソースコードの編集と実行
1. 「Microsoft VS Code」などのエディターを事前にインストールしておく。
1. 「PLAY」ボタンの上にある「Open」を押下する。
1. ファイルエクスローラーで「tutorial-loop_and_import」フォルダが開いたら中にある「main.mjs」をエディタで開く。
1. エディタ側の編集が終わったら保存してからゲーム側の「PLAY」ボタンを押下。
1. 実行結果「PASSED」,「FAILED」が表示される
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609246/60ce1559-d6c6-997c-a12a-c92a2cc8b256.png" width=50%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609246/94517aa8-4cc6-ff80-06ad-dc0ea6a6c466.png" width=50%>
1. 「Watch replay」を押下する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609246/e8f76540-1946-c08a-28c5-5e3653b403a1.png" width=50%> 　
1. 「Back」を押下して戻る

## コメント付きサンプルコード #1「Loop and import」
```javascript
import { } from '/game/utils';
import { } from '/game/prototypes';
import { } from '/game/constants';
import { } from '/arena';

// getTicks関数が使えるようにインポート！
import { getTicks } from '/game/utils';

// このloop関数はターン(Tick)ごとに呼ばれる
export function loop() {
    // 現在のターン(Tick)数をログ出力するよ！
    console.log('現在のターン(Tick)数:', getTicks());
}
```
## 実行結果
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609246/60ce1559-d6c6-997c-a12a-c92a2cc8b256.png" width=50%> 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609246/98338224-98fa-38b7-352b-213f09664497.png" width=50%>  

# 以上
よかったよかった
SQLで第n〇曜日を判定する

# 経緯

来週、パッチチューズデイ(第2火曜日)があります。この「第2火曜日」をSQLでどう判定するのだろうとふと思い検証してみました。SQLを試し打ちするための簡易的な環境を構築する方法もあわせて記録として残しておきます。

# 環境

- Windows 11 Pro (未検証ですがWindows 10でも大丈夫だと思います)
- Rancher Desktop (未検証ですがDocker Desktopでも大丈夫だと思います)

# 手順

一時的に利用するMySQL環境を構築します。パスワードやポートは適宜書き換えて下さい。
```powershell
docker run -d --name mysql1 -e MYSQL_ROOT_PASSWORD=mysql -p 3306:3306 mysql
winget install HeidiSQL.HeidiSQL
```

色々試してみて、以下のように判定すればいいと考えました。条件に合致する場合は1が、そうでない場合は0が返ってきます。
```sql
-- M → 月
-- N → 第N週
-- D → 曜日番号(日曜日が1で、土曜日が7)
-- T → 判定対象の日付
SET
	 @M=4
	,@N=2
	,@D=3
	,@T=STR_TO_DATE('2022/04/12', '%Y/%m/%d')
;

SELECT
	-- M月
	    MONTH(@T) = @M
	-- N週
	AND DAY(@T) BETWEEN (@N - 1) * 7 + 1 AND (@N - 1) * 7 + 7
	-- D曜日
	AND DAYOFWEEK(@T) = @D
	AS RESULT
;

```

一時的な環境なので、検証後はお片付けします。
```powershell
docker container rm -f mysql1
winget uninstall HeidiSQL.HeidiSQL
```

以上です。
[Kotlin]Flowを試してみたい人用のサンプルコード

# 概要
Flowを試したことのない人がとりあえず動かしてみる為のサンプルコードです。

Flowはコルーチンの一種で、返す値が一個のみの「suspend関数」とは異なり、複数の値を順次出力できます。データベースからリアルタイムで更新情報を受け取るような場合等に使用できます。
# 本文

```kotlin
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lifecycleScope.launch {
            triggerFlow().collectLatest {
                Log.e("TAG", "Flow: $it")
            }
        }
    }

    private fun triggerFlow(): Flow<String> {
        return flow {
            repeat(5) {
                // emitを使って値を送信できます
                emit("Item: $it")
                delay(1000L)
            }
        }
    }
}
```

Log出力結果
![スクリーンショット 2022-04-10 9.01.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/616cec47-3788-0dec-7fef-5debaa35c880.png)

# 補足
参考にした動画
https://www.youtube.com/watch?v=6Jc6-INantQ
Wordpress で youtube を大きいサイズで楽に貼り付ける

## はじめに

xxxx年度版　とか、そのようなサイトがありますが、
ものすごく単純に、見やすく埋め込む方法を
jQueryで実装しました。

## CSSは不要です
かわりに、jqueryが必要です

## WordpressにYoutubeを貼り付ける方法

以下の方法で貼り付けた方法で動作確認しています。

```youtube貼り付け.txt
https://www.youtube.com/watch?v=動画ID

https://youtu.be/動画ID
```

埋め込みコードをつけるほどでもありません

### サイズを変更するJavaScript
ついでに、.youtubeのクラスも追加するようにしてあります。
```addyoutube.js
/* youtube.sjs */
$(function() {
	var width=document.documentElement.clientWidth,
		height=document.body.clientHeight,

	// wpcontentのクラスで探しています
	// 一般的には body か .single が良いかと思います

	var result = $('.wpcontent').find('iframe');

	if(result !== undefined) {
		for(var i=0; result[i] !== undefined; i++) {
			if($(result[i]).attr('src').match(/youtube/)) {
				$(result[i]).addClass("youtube");
				// youtubeのhtmlタグを読む
				var _ywidth=$(result[i]).attr('width'),
					_yheight=$(result[i]).attr('height')
				// 0.8 ＝80%のサイズを意味しています
				$(result[i]).attr('width', parseInt(width * 0.8));
				$(result[i]).attr('height', parseInt(width / _ywidth * _yheight * 0.8));
			}
		}
	}
});

```
stack viewで幅が変更できない　xcode(swift)

## stack viewで幅が変更できない

### やりたいこと
計算機アプリ作成のため`stack view`を利用して、左右いっぱいにボタンを配置したい。

### 困ったこと
`Width`の数値が変わらない。
![スクリーンショット 2022-04-10 8.27.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533678/7413347e-8901-99b2-cb58-b56691691c44.png)

無理やりハンドツールで幅を広げると間が開く
![スクリーンショット 2022-04-10 8.30.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533678/8b92086b-2631-c9d2-759f-e774da300b02.png)

### 解決方法
`Horizontal`(水平方向の)`StackView`を覆うように`Vertical`(垂直方向の)`StackView`が配置されているが 
![スクリーンショット 2022-04-10 8.32.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533678/3311e1e7-aacf-acab-dfc7-f1f1bae3175f.png)
その`Alignment`が`Leading`（左寄せ）になっていたので
![スクリーンショット 2022-04-10 8.34.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533678/18a40400-7821-900c-1fac-b21c549e08af.png)
`Fill`（画面いっぱい）に修正

:::note info
※幅は広がったが隙間ができた時は`spacing`の値が大きくなっている可能性あり（1or0に修正）
:::

![スクリーンショット 2022-04-10 8.34.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533678/239ccf34-d239-dd03-205e-379deed3b8bf.png)
pygameコピペ用

## 基本的な部分

```

import pygame as pg, sys
pg.init()
# スクリーンセット
screen = pg.display.set_mode((800, 600))

##################
必要に応じて処理書く
##################

# 描画用のループ
while True:
    # スクリーンの背景色
    screen.fill(pg.Color("WHITE"))
    # 再描画
    pg.display.update()
　　# 更新の速さ（1秒間に６０回以下実行）
    pg.time.Clock().tick(60)
　　
　　# ウィンドウの閉じるを押したとき終了
    for event in pg.event.get():
        if event.type == pg.QUIT:
            pg.quit()
            sys.exit()

```

## テキスト
[pygame.font](https://www.pygame.org/docs/ref/font.html)
```
# 引数(ファイル名, サイズ)
font = pg.font.Font(None, 300)
# 引数(テキスト, antialias, 色, (背景色))
text = font.render("Text Write", True, pg.Color("BLUE"))
# 引数（文字, 場所(x, y)）
screen.blit(text, (100, 400))
```

## 四角、ライン、丸
[pygame.rect](https://www.pygame.org/docs/ref/draw.html)
```
# 四角：引数（描画するスクリーン, 色, (x, y, 横幅, 縦幅)）
pg.draw.rect(screen, pg.Color("RED"), (0, 0, 150, 150))
# ライン：引数（描画するスクリーン, 色, (開始位置x, 開始位置y), (終了位置x, 終了位置y), 太さ）
pg.draw.line(screen, pg.Color("GREEN"), (100, 100), (300, 300), 5)
# 丸：引数（描画するスクリーン, 色, (x, y, 横幅, 縦幅), 太さ）
pg.draw.ellipse(screen, pg.Color("GREEN"), (400, 400, 100, 100), 5)
```
【Unity】AR FoundationReamoteトラブルシューティング

# コンパニオンアプリのインストール時にエラーが発生する
### Error: The archive doesn't seem to be an App Bundle, it is missing required file 'BundleConfig.pb'.
BUild SettingsのBuild App BUndleが有効になっている場合は無効に設定を変更するとインストールが通る。
典型90問003 Longest Circular RoadをPythonで解く！

# はじめに
AtCoder現在茶色(年内には緑が目標！）のあんこちゃん(@Chunky_RBP_chan)です。
典型問題は抑えとかねばということで、★2〜★5に取り組んでいます。
Pythonで取り組まれている方も多いと思うので自分の解答をシェアしたいと思います！
# 003 Longest Circular Road
https://atcoder.jp/contests/typical90/tasks/typical90_c

## 解法
最も遠い(間にある街が最も多い)2つの街を見つけ、この2つの街をつなげれば良いです。
今回の問題ではどの街にも道がつながっており、N個の街に対して道の本数はN−１本であることからこれらの街が作るグラフは木になっています。
したがって問題は、
最も遠い2つの街を見つける → 木の直径(最もノードが含まれる経路)を見つける
と言い換えられます。
木の直径はBFSを二度行うことで求められ具体的には
・まず適当なノード(私の場合は0を選びました)からBFSを行い最も遠いノードAを探す。
・最も遠いノードAからBFSを行い、Aから最も遠いノードBまでの距離を求める。
最終的に求まったAからBまでの距離が木の直径です。

なぜそうなるか気になる方は

https://qiita.com/nomikura/items/a4c5be6c72ce854d7ce4

をご参考ください。



```python
from collections import deque

def bfs(start):
    Q = deque()
    Q.append(start)
    W = [-1]*N
    W[start] = 0
    while Q:
        now = Q.popleft()
        for i in G[now]:
            if W[i] == -1:
                Q.append(i)
                W[i] = W[now] + 1
    m = max(W)
    for i in range(N):
        if W[i] == m:
            return W,i


N = int(input())
G = [[] for _ in range(N)]
for _ in range(N-1):
    a,b = map(int, input().split())
    G[a-1].append(b-1)
    G[b-1].append(a-1)
W,edge = bfs(0)
W,edge = bfs(edge)
print(W[edge]+1)
WebTransport で RTP-FEC (ProMPEG) を再現してみた話

## はじめに

Chrome M97 から WebTransport が登場しました。
これにより、DATAGRAM を使っての信頼性のない UDP のような通信がブラウザ可能となりました。
すなわち HoL(Head of Line) Blocking の無いリアルタイム通信が可能になります。

[前回](https://qiita.com/monyo-tech/items/c4c5c2e8e403728c0765)の記事では MPEGTS を HTTP-Chunked-Transfer で送ってみましたが
HoL の無い形で送れるのであれば、リップシンクもしやすくなるので是非送ってみたい。
せっかく MPEGTS を DATAGRAM で送るのであれば、既存実装と近い形で出来ると理想的です。

であれば、RTP-FEC (ProMPEG) のペイロードを送れば、目的を満たせそうに思えます。
RTP-FEC (ProMPEG) の実装自体は超単純ですので、週末の空き時間に実装してみました。

## 前提

### RTP-FEC (ProMPEG CoP3 #2)

FEC 付きの MPEGTS の送信の事実上の業界基準みたいな、最低限として扱われている規格です。
この規格は SMPTE ST 2022 として標準化されていますが、
RTP-FEC (ProMPEG CoP3 #2) と呼ばれる事が多く、ここでは RTP-FEC (ProMPEG) と呼びます。

内容は単純で、RTP に MPEGTS のペイロードを数パケット入れて、
その内容を R x C の二次元にマッピングして、行、列に FEC を挿入するというものです。
後発の SRT, RIST などの ARQ があるものに比べて、実装が超単純に済むのがメリットです。
(超単純なので、相互接続性の問題がすくないというメリットもあります)

あと ARQ が無い FEC のみであればスケールもしやすいんじゃないかという思惑も少しあります。
(IPTV で使ってるという話を聞いたことがあるので、実際に使えるかも...?)

## QUIC-DATAGRAM への マッピング

今回は RTP や FEC のペイロードをそのまま QUIC-DATAGRAM に載せてみます。
ProMPEG 上では RTP 上に 7 つの TS Packet を載せますが、
QUIC-DATAGRAM では MTU が少ないので 7 パケットを載せられません。
ここでは 6 パケットを QUIC-DATAGRAM に載せてみました。

## 実装

### サーバ側 (配信側)

aioquic を使った RTP-FEC(ProMPEG) の送信側の実装はこちらになります。
(Annex-A, Annex-B はそのうち...)

https://gist.github.com/monyone/5b0fa6fe905815ee0e882f0d09e30d2e

### クライアント側 (受信側)

RTP-FEC(ProMPEG) の受信部分の実装はこちらになります。

https://github.com/monyone/zlplayer/blob/main/src/source/quic-datagram-rtpfec-window-source.ts

自作の webcodecs を使うプレイヤー (zlplayer) に組み込む形で、
WebTransport での DATAGRAM 受信モジュールの作成を行いました。

## 評価

10 x 10 の 2D-FEC で実際に実験しました。

1% くらいの誤りを混入させた場合では、FEC による誤り訂正によりロスを復元できました。
10% くらいにしたところす、やはり訂正能力が追い付かず、再生に影響が出てしまいます。

## まとめ

実際に、MPEGTS を RTP-FEC (ProMPEG) で QUIC-DATAGRAM に載せ、
実際にプレイヤーで超低遅延での再生する所まで実装してみました。
オレオレ仕様で実際に動作する所をみると、自分で決めてるなという、面白さを感じました。

QUIC-DATAGRAM は自由に使えるため、自由度が非常に高く、面白い事ができるので
これを使った様々な独自プロトコルがそのうち大量に出来るのではないかと思っています。

相互互換性が問題になったりしそうですが、それはそれでテックジャイアントが決めた規格や
巨大なプラットフォームがサポートしている送り方が事実上の標準になるのかなと思いました。
(Twitch + IVS がやってる Warp とかが配信の主流になるのかな、とぼんやり考えてます)

## あとがき

SMPTE ST-2022-7 を実装できれば、クライアント側でシームレス切り替えができたり
MPEGTS を送るというだけでも、色々と夢は広がります。

SRT over QUIC-DATAGRAM や RIST over QUIC-DATAGRAM などを試してみたい所です。
これができれば、ブラウザ上でライブプレビューなどが楽にできるなという感じがします。
systemdのmulti-user.targetって何だっけ？

# はじめに
備忘録＆初心者向けの記事です！！
systemdのmulti-user.targetって何なんやろなって思っていたところ、CentOS6以前に利用されていたSysVinitが関係しているらしかったので、調べてみました。


# 実行環境
```
[root@tabi ~]# cat /etc/redhat-release
Rocky Linux release 8.4 (Green Obsidian)
```

# システムについて
```
1. 電源を入れる
2. BIOS/UEFIの起動
3. ブートローダーの読み込み
4. カーネルの読み込み
5. プロセス実行 ←ココ！！！
6. ログイン可能
```
- 5のプロセス実行でSysVinitが動作している

# SysVinitの動き
- Unix系OSで使われてきたOS起動の仕組み
- 最初にinitプロセスを起動する
	- `PID=1`
- `/etc/inittab`ファイルを読み込む
- システム初期化シェルを実行
- rcスクリプトの実行
	- デフォルトのランレベルに基づいて実行

## ランレベル（RHEL系）
0. シャットダウン（システムの停止）
1. シングルユーザモード
	- rootのみログインできる状態
	- システムメンテナンス等に利用される
2. マルチユーザモード
	- NFSは利用できない
3. 通常のマルチユーザモード（テキストログイン）
4. 未使用
5. グラフィカルログインによるマルチユーザモード
6. システムの再起動

# SysVinitとsystemd
- SysVinitではランレベルがあった
- systemdにUnitの概念が採用され、SysVinit時に利用されていたランレベルの機能はターゲットに置き換えられた
- `runlevelx.target`はシンボリックリンクとなっている
```
[root@tabi ~]# ls -al /usr/lib/systemd/system/runlevel0.target
lrwxrwxrwx. 1 root root 15  8月 11  2021 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
```
- 2, 3, 4のリンク先は全部同じ
```
root@tabi ~]# ls -al /usr/lib/systemd/system/runlevel2.target
lrwxrwxrwx. 1 root root 17  8月 11  2021 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
[root@tabi ~]# ls -al /usr/lib/systemd/system/runlevel3.target
lrwxrwxrwx. 1 root root 17  8月 11  2021 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
[root@tabi ~]# ls -al /usr/lib/systemd/system/runlevel4.target
lrwxrwxrwx. 1 root root 17  8月 11  2021 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
```
- `/etc/inittab`は利用されなくなった

## ランレベルとターゲットの対応
0. poweroff
	- `/usr/lib/systemd/systemd/runlevel0.target`
	- `/usr/lib/systemd/systemd/poweroff.target`
1. rescue
	- `/usr/lib/systemd/systemd/runlevel1.target`
	- `/usr/lib/systemd/systemd/rescue.target`
2. multi-user
	- `/usr/lib/systemd/systemd/runlevel2.target`
	- `/usr/lib/systemd/systemd/multi-user.target`
3. multi-user
	- `/usr/lib/systemd/systemd/runlevel3.target`
	- `/usr/lib/systemd/systemd/multi-user.target`
4. multi-user
	- `/usr/lib/systemd/systemd/runlevel4.target`
	- `/usr/lib/systemd/systemd/multi-user.target`
5. graphical
	- `/usr/lib/systemd/systemd/runlevel5.target`
	- `/usr/lib/systemd/systemd/graphical.target`
6. reboot
	- `/usr/lib/systemd/systemd/runlevel6.target`
	- `/usr/lib/systemd/systemd/reboot.target`

# systemdの動き
- systemdは`/etc/systemd/default.target`を読みに行く
	- `/etc/systemd/default.target`のシンボリックリンクが`/usr/lib/systemd/system/multi-user.target`となっているため、今回はmulti-user
```
- [root@tabi ~]# ls -al /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 41 10月  1  2021 /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target
```

# 終わりに
割と大雑把にしか調べてないので、気になるところとかあればコメントいただけると幸いです。
【GCS】Google Cloud StorageのBucketにCORSを設定【最速】

#### バケットにCORSを設定
```bash
echo '[
  {
    "origin": ["*"],
    "responseHeader": ["Accept", "Accept-Language", "Content-Language", "Content-Type"],
    "method": ["GET","HEAD","POST","PUT","DELETE","CONNECT","OPTIONS","TRACE","PATCH"],
    "maxAgeSeconds": 3600
  }
]' | gsutil cors set /dev/stdin gs://$DEVSHELL_PROJECT_ID.appspot.com
```

反映に1分ほどかかります

##### CORSを確認
```bash
gsutil cors get gs://$DEVSHELL_PROJECT_ID.appspot.com
```

#### バケット/オブジェクトの一般公開
```bash
gsutil iam ch allUsers:objectViewer gs://$DEVSHELL_PROJECT_ID.appspot.com
```
##### 公開アクセス権を削除
```bash
gsutil iam ch -d allUsers:objectViewer gs://$DEVSHELL_PROJECT_ID.appspot.com
```

##### Create a bucket
```bash
gcloud app create --region asia-northeast2
```

##### 書き込み権限の付与

```bash
gsutil iam ch allUsers:objectCreator gs://$DEVSHELL_PROJECT_ID.appspot.com
```

##### 書き込み権限の削除

```bash
gsutil iam ch -d allUsers:objectCreator gs://$DEVSHELL_PROJECT_ID.appspot.com
```

# 参考

## Access-Control-Allow-Origin

https://cloud.google.com/storage/docs/cross-origin?hl=ja

### Access to fetch at 'https://storage.googleapis.com/google.appspot.com/index.html' from origin 'https://cloud.google.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

### Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://storage.googleapis.com/google.appspot.com/index.html. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). Status code: 403.
### Uncaught (in promise) TypeError: NetworkError when attempting to fetch resource.

### Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://storage.cloud.google.com/google.appspot.com/index.html. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). Status code: 302.
### Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://storage.cloud.google.com/google.appspot.com/index.html. (Reason: CORS request did not succeed). Status code: (null).

### GET https://storage.cloud.google.com/google.appspot.com/index.html net::ERR_FAILED 302

The specified bucket does not exist.

## Access denied. Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object.
https://cloud.google.com/storage/docs/troubleshooting?hl=ja

```xml
<Error>
  <Code>AccessDenied</Code>
  <Message>Access denied.</Message>
  <Details>Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object.</Details>
</Error>
```

https://cloud.google.com/storage/docs/gsutil/commands/cors?hl=ja#synopsis

https://cloud.google.com/storage/docs/quickstart-gsutil?hl=ja#make_the_objects_publicly_accessible
フローの数式の使い方


数式を変数にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7b4688ee-ee33-8d1e-fd9e-b1cd1d3217f0.png)

割り当てで使えるみたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/08b9f5f0-5541-8e97-3404-7740fde620d6.png)


+ [フローでオブジェクトの数値を更新](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000G4sJE)
+ [フローで自動採番を構築したい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000GfGCZSA3)
+ [Create Formula](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000GfDFkSAN)
【Docker】Extension fieldsを使用してdocker-compose.yml内で値を使い回す

## はじめに
　本記事は、プログラミング初学者が学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## Extension fieldsを使用してdocker-compose.yml内で値を使い回す
以下のように記述することでdocker-compose.yml内で値を使い回すことができます。

```docker-compose.yml
version: '3.9'
x-db-env: &db-env
  MYSQL_ROOT_PASSWORD : rootpassword
  MYSQL_DATABASE: myapp_development
  MYSQL_TEST_DATABASE: myapp_test
  MYSQL_USER: user
  MYSQL_PASSWORD: userpassword

x-pulic-data-driver_ops: &public-driver_opts
  type: none
  device: ${PWD}/public
  o: bind

x-tmp-data-driver_ops: &tmp-data-driver_ops
  <<: *public-driver_opts
  device: ${PWD}/tmp


services:
  db:
    platform: linux/x86_64
    build: ./docker/db
    command:
      --default-authentication-plugin=mysql_native_password &&
      bash -c "chmod +x /docker-entrypoint-initdb.d/00_grant.sh"
    healthcheck:
      test: mysqladmin ping -h db -u$${MYSQL_USER} -p$${MYSQL_PASSWORD}
      interval: 1s
    restart: on-failure
    volumes:
      - mysql_data:/var/lib/mysql
      - type: bind
        source: ./docker/db/my.cnf
        target: /etc/mysql/conf.d/my.cnf
      - type: bind
        source: ./docker/db/
        target: /docker-entrypoint-initdb.d
    environment: *db-env
    ports:
      - "3306:3306"
  web:
    build: ./docker/web
    volumes:
      - public-data:/myapp/public
      - tmp-data:/myapp/tmp
    ports:
      - 80:80
    depends_on:
      - api
  api:
    <省略>
volumes:
  mysql_data:
  public-data:
    driver_opts: *public-driver_opts
  tmp-data:
     driver_opts: *tmp-data-driver_ops
代表的なネットワークコマンドを制覇(ネットワークスペシャリスト試験対策)

高度試験の中で最も難しい[^nw]とされているネットワークスペシャリスト試験(以下NW試験)の受験を今年の春に予定しています．NW試験ではしばしばネットワークコマンドを答える知識問題が出題されます．コマンドの動作を説明する文章は問題文中に有り，その説明に適するコマンドを記述する形式です．知識問題は知っていれば正解できますが，逆に知らなければ何時間考えても答えは分かりません．1点でも多く取って合格を勝ち取るために，代表的なネットワークコマンドとその動作についてまとめ，試験前に再度見直せる様にしておきたいと思います．

:warning: よく出るポート番号のまとめ記事は以下

https://qiita.com/joule/items/032b4a849aca9d7f2906

[^nw]: 従来は高度試験で最難関はITストラテジストとされてきましたが，R3春試験で合格率が12%となり，近年の高度試験では例を見ない低合格率となりました．

:warning: 取り上げるコマンドはUbuntuで利用されているコマンドです．MacやWindowsでは一部コマンドや動作が異なりますが，試験で問われるのはLinuxのコマンドが大半です．

Ubuntuで以下のコマンドを全て試すためには，追加で幾つかのアプリケーションのインストールが必要です．

```bash
sudo apt install -y net-tools traceroute
```

# 本記事で取り上げるコマンド総覧
* arp
* ftp
* ifconfig
* netstat
* ping
* route
* ssh
* tcpdump
* telnet
* traceroute

# コマンド毎の詳しい説明
## arp
ARP(Address Resolution Protocol)テーブル(IPアドレスとMACアドレスの対応表)を表示します．ARPの逆の操作を行うプロトコルにRARP(Reverse ARP)が有ります．覚え方として，ARPはアルファベット順(IP→MAC)，RARPは逆(MAC→ARP)と覚えておけば，間違うことが有りません．(筆者の個人的な意見です)Linuxではarpだけで動作しますが，MacとWinではarp -aと必ず`-a`オプションを付けて実行します．また，hostnameを非表示にするには，`-n`オプションを付けて実行します．

## ftp
ファイル転送やファイルダウンロードに用いられます．同様の操作が出来るコマンドにはwgetやcurlが有りますが，ftpコマンドでは対話モードが存在し，対話的にサーバからファイルをダウンロードすたり，アップロードすることができます．

## ifconfig
ネットワークインターフェース(NIC)を確認／設定するコマンドです．Linuxのディストリビューションによってはipコマンドを用いる場合も有ります．

## netstat
ネットワークに関連する様々な情報，例えばネットワークインターフェースの接続情報，経路情報，ソケット情報などを表示するコマンドです．

## ping
ネスペ頻出のコマンドです．穴埋めでしばしば登場します．本来は目的ホストにICMP(Internet Cotrol Message Protocol)(またはUDP)パケットが届くかどうか，どれだけ時間が掛かるかを調べる為に用いられるコマンドです．これを利用した死活監視にping監視が有ります．ネスペではICMPとセットで覚えておくのが得策です．

## route
IPv4経路テーブルを手動操作するコマンドです．Linuxのディストリビューションによってはipコマンドを用いる場合も有ります．

## ssh
SSH(Secure SHell)は通信を暗号化し，ネットワーク上のマシンへのログインやコマンド実行を行います．ネットワーク上のマシンとの間でファイルコピーを行うscpコマンドもsshベースのコマンドです．

## tcpdump
ネットワークインタフェース上のパケットのうち，指定した条件にマッチするパケットをダンプしてトラフィックデータを調べるコマンドです．条件を指定せず，ネットワーク上の全てのパケットを取得することも可能です．

## telnet
ネットワーク経由でリモートホストにログインするコマンドです．ホスト情報はホスト名指定またはＩＰアドレス指定のどちらでも可能です．ポート番号を明示しない場合は，デフォルトで23番ポートにポートに接続します．ポート番号を明示することで，23番意外に割り当てられたtelnetへの接続，HTTP,POP3,SMTPなどのテキストベースのプロトコルの動作確認が出来ます．

## traceroute
リモートホストへのネットワーク経路を表示します．ネットワークのルーティング設定が正しく出来ているかの確認などに利用されます．通常はＵＤＰを利用しますが，ＦＷが有ってＵＤＰパケットが通過できない場合にはＩＣＭＰを用います．

# Reference
* ステップ方式で仕組みを学ぶＩＰネットワーク設計演習(井上 博之著；近代科学社)
* UNIXコマンドブック 第4版(田谷 文彦他著；ＳＢ Creative)
【Vuetify】 v-img 画像指定方法

# v-img 画像の指定方法

v-img：Vuetifyのimageファイルを表示するコンポーネント

https://vuetifyjs.com/ja/components/images/

v-img コンポーネントページ

https://vuetifyjs.com/ja/api/v-img/

Vuetify：Vue.jsで使用できるマテリアルデザインのUIフレームワーク

### 画像をURLで指定する場合

```vue
<v-img
  src="https://picsum.photos/id/20/1920/1080?blur=5"
></v-img>
```

### 画像を相対パスで指定する場合

```vue
<v-img
  v-bind:src="require('/assets/images/index/vegetable1.jpg')"
></v-img>
```
SwiftUI - iOS14 sheet + fullScreen (multiple sheet)


# SwiftUI - iOS14 sheetとfullScreenを機能しないバグの対処法

## 内容
iOS14.4以下の場合、sheetを複数やsheet + fullScreen　を設定すると正常に動作しない事例が発生するみたいです。

そのため、EmptyViewに対してfullScreenを設定し回避するも、iOS15以降の場合はEmptyViewに対して設定されたイベントが発火しないなどの問題があるようです。

他の記事を見ると、iOS14とiOS15で処理を分けて対処しているのが多いと思いますがコードの肥大化を避けるためにもっと簡潔にやりたい。。。

## 解決法
iOS15では、EmptyViewに対して設定されたイベントが機能しないなら、他のViewにしてしまえぇと言うことで、Spacer().frame(width:0, height:0)に設定することで機能することが確認できました。


## iOS14.4以下で機能しないコード
```Swift
Button(action: {
    isPresentedSheet.toggle()
}{
    Text("ボタン")
}.sheet(isPresented: $isPresentedSheet) {
    //処理
}
.fullScreenCover(isPresented: $isPresentedfullScreen) {
    //処理
}
```
## 機能するコード
```Swift
Button(action: {
    isPresentedSheet.toggle()
}{
    Text("ボタン")
}.sheet(isPresented: $isPresentedSheet) {
    //処理
}

Spacer()
    .frame(width: 0, height: 0) 
    .fullScreenCover(isPresented: $isPresentedfullScreen) {
        //処理
    }

```
goquery & chrome driver

https://worklog.be/archives/3422

https://jpdebug.com/p/2334398

https://sites.google.com/chromium.org/driver/

https://chromedriver.chromium.org/downloads

https://qiita.com/libra_lt/items/b1e3ba2c9fc33a23951d

https://qiita.com/isao_e_dev/items/3a0f4e881fc7142ef489

https://gosamples.dev/string-padding/
QRコードリーダ（バーコードリーダ）の読み取りデータをNode-Redに飛ばす

QRコードリーダ（バーコードリーダ）の読み取りデータをNode-Redにあげます。

![node-red画面0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325563/c144a5a0-f8bc-ada3-d942-bbc81ced32b2.jpeg)

１．QRコード（バーコード）リーダの読み取りプログラムは、以下を利用します。
　　https://qiita.com/bb-mint/items/049d018d7e59a14f3aa9

２．上記のプログラムは、読み取り結果を標準出力するので、そのデータをshellスクリプトでjsonデータとしてcurlでpostします。

```shell: to_nodered.sh
#!/bin/bash
read line
curl -X POST -H "Content-Type: application/json" -d "{\"data\" :  \"${line}\"}" localhost:1880/from_qr_code
```

読み取って、送信は、コマンドをパイプ接続します。
```shell: QRコード・バーコードリーダのデータ読み取りをパイプする
sudo /path/qrcodereader /dev/input/by-id/usb-xxxxxx-kbd | /path/to_nodered.sh
```

適当なデーモン化については、次の最初に書いておきました。
https://qiita.com/bb-mint/items/eeb4b7571af0ca4ec43e


３．受け取り側のNode-redの設定は次の通りです。

「http in」で受け取り用のＵＲＬを作ります。
curlに設定した通り、/from_qr_code　としています。メソッドはPOST。
![node-red画面1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325563/f6ac6b4c-a1cd-360f-4e0c-e5d589e8996f.jpeg)

入ってきたデータを取り出す例として、「debug」に送ることにします。
![node-red画面2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325563/e930f826-428b-0a9f-c1ec-5ae456acae6b.jpeg)

「デプロイ」して。（右上のデプロイが赤くなっているはずなので、押します。）
![node-red画面3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325563/c95b9ed4-4dee-df0d-ee45-b280f95ad887.jpeg)

「デバッグ」で見てみます。（右上のテントウムシのマークです）
![node-red画面4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325563/65797ee8-ab54-91cd-80e0-43c3417619f6.jpeg)

バーコードを読み込みました。受け取れました。

---

４．入力データをもとにswtchして、コマンドexec処理

　入力されたデータをもとに、「switch」処理します。

![node-red画面5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325563/87b39767-98d1-4e0d-9574-7d9cb4d13573.jpeg)

　入力データは、jsonで、dataというkeyに入れているので、
　プロパティで、msg.payload.data とすると取り出せます。
　この入力データとの比較を追加して記載できます。
　処理は、順番に１番上から下に順に並んでいきます。

![node-red画面6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325563/20a6027c-ebd6-f9cc-2573-7502c89e6f29.jpeg)

　switch処理の結果１番から、PC上のコマンドを実行する「exec」に接続します。
　コマンドを、そのまま記載します。

![node-red画面7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325563/ff47eef6-b1ac-4b67-cf89-2811e1d22dd3.jpeg)

　コマンドの出力結果を確認できるように「debug」にさらに接続します。

![node-red画面8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325563/25049898-5095-c3b6-467d-5bfaff5cc979.jpeg)


以上で、PCを起動するコマンド、「/home/node-red/notepc.sh」を実行して、
PCをONにします。中身は次のようなコマンドになっています。

> #!/bin/sh
> wakeonlan ff:4f:f0:0f:ff:ff

なお、コマンドは、次のようにSUID(Set User ID)して、rootでの実行権限を
渡しております。
　$ chmod u+s notepc.sh
　$ ls -al notepc.sh
　-rwsr-xr-x  1 root root    38  2月 20 19:54 notepc.sh

これでPCの起動ができます。

![node-red画面9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325563/d9127644-bcab-41fe-6851-bd0fb2c544f6.jpeg)
SHA1ハッシュを使ったRSA署名が使えなくなったとさ

# なんの記事
- 久しぶりに新しいプロジェクトを作成し、リモートレポを作成しようとしたところ、以下のXcodeがエラーを吐いた。

# エラー内容
- `エラー内容：You're using an RSA key with SHA-1, which is no longer allowed. Please use a newer client or a different key type.`
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535198/23a8f80f-7f8f-6890-f2d2-74c175e313a4.png">

# 原因
- [2021年9月26日、OpenSSH 8.8がリリースされSHA-1ハッシュアルゴリズムを使用したRSA署名の廃止された](https://nulab.com/ja/blog/backlog/disables-rsa-sig-using-the-sha-1-in-openssh/)
- これを受け、Githubでも、2022年の3月15日？から、SHA1ハッシュを使ったRSA署名が禁止されている（[セキュリティー上の理由](https://github.blog/2021-09-01-improving-git-protocol-security-github/)）
- 詳しい話は、[こちら](https://core-tech.jp/blog/tech_log/3107/#ssh-rsa)

> Dropping insecure signature algorithms
RSA keys (you’ll see ssh-rsa in the public key) are stronger than DSA keys, but older Git clients may use them in combination with a dated signature algorithm that uses SHA-1. Many SSH clients, including OpenSSH 7.2 and newer, support RSA with SHA-2 signatures (signature types rsa-sha2-256 and rsa-sha2-512), which are secure. However, other clients only support the older SHA-1 signatures. SHA-1 is weak, so we’ll stop allowing new RSA client keys to use SHA-1 signatures and require them to use SHA-2 signatures instead. Keys with a valid_after date before the deadline (November 2, 2021) may continue to use SHA-1 signatures for the time being.



# 解決方法
- ターミナルで以下のコマンドを叩いて、ECDSAのSSH Keyを発行し、GithubにSSHKeyをアップロードする。
- `ssh-keygen -t ecdsa -b 521 -C “your_email@example.com`
- アップロード後、xcode>preferences> accounts> githutのSSH Keyの参照先を`id_ecdsa`に変更する。
- ssh> config内に記載のIdentityFileの参照先を`id_ecdsa`に変える。
- 注意:Githubから古いSSHKeyを削除し、`ssh -T git@github.com`をコマンドに打ち込み、新しいKeyでの認証を完了させないと、認証エラーが出ます。

[参照](https://exerror.com/youre-using-an-rsa-key-with-sha-1-which-is-no-longer-allowed-please-use-a-newer-client-or-a-different-key-type/#:~:text=key%20type%20Error%3F-,To%20Solve%20You're%20using%20an%20RSA%20key%20with%20SHA,add%20this%20key%20to%20Github.)
>To Solve You're using an RSA key with SHA-1, which is no longer allowed. Please use a newer client or a different key type Error Github is now not supported RSA keys with SHA-1 and that's why you are facing this error. Here What you can do is Just create a new SSH key with ECDSA and then add this key to Github. Just run this command: ssh-keygen -t ecdsa -b 521 -C “your_email@example.com” Then Just Upload it to GitHub Just after deleting your old key first, then update the SSH2 private key to point to id_ecdsa. Now you will be able to clone repositories and Now, your error must be solved. Thank You!.



# 参考にした記事
- https://github.blog/2021-09-01-improving-git-protocol-security-github/
- https://exerror.com/youre-using-an-rsa-key-with-sha-1-which-is-no-longer-allowed-please-use-a-newer-client-or-a-different-key-type/#:~:text=key%20type%20Error%3F-,To%20Solve%20You're%20using%20an%20RSA%20key%20with%20SHA,add%20this%20key%20to%20Github.
WSL2とClionの環境構築で詰まったこと



自分が環境構築で困ったこと，その際に考えたことを備忘録的にまとめておきます．

### 環境
* Windows10 Pro
* WSL2 Ubuntu-20.04 LTS


### WSL導入編
* CPU仮想化は有効になっていますか
* 「Windowsの機能の有効化または無効化」の「Hyper-V」「Linux用Windowsサブシステム」「仮想マシンプラットフォーム」にチェックは入っていますか
* "WslRegisterDistribution failed with error: 0x80070050"
私の場合，ある日WSLを起動すると急に出てきました．PowershellからWSLには入れるのですが，Windows TerminalやUbuntuアプリからは入れない状況でした．
    * Powershellからubuntuをアップデート(bashで入れる)
    * 「Windowsの機能の有効化または無効化」のチェックを外す→再起動→チェックを入れなおす→再起動
    * WSLのリセット(最後の手段)
   
特に3番目を踏むことは稀だと思うので，基本的には公式をそのままやるだけな感じです．導入の記事はたくさんあるので調べてみてください．

### Clionインストールまでにやっておくこと
* Cmake, make, g++, gdbのインストール
    * 基本的には `sudo apt install package`で入ります．CmakeのバージョンによってははClion側が対応してない場合があるので，適宜インストールしてください．[こちら](https://qiita.com/comachi/items/d0c1ce5d7b90fe30fced)の記事がとても参考になります．OpenSSL関係でエラーを吐いた場合，`libssl-dev`をインストールする必要があるかもしれません．

### Clionでの困りごと

* Cmakeがビルドできない
    * Permission errorでCmakeファイル関係の書き込みをClionができなくなっている可能性があります．作業ディレクトリのパーミッションを変更する必要がありそうです.
* 「"hoge"が\<デフォルト\>で実行できません」
    * 実行/デバッグ構成は設定していますか？
* ツールチェーンは設定していますか？

### その他試すこと
* Windows，各種アプリケーションなどの再起動
* ClionでのCmake プロジェクトの再ロード


### 参考

https://qiita.com/comachi/items/d0c1ce5d7b90fe30fced
https://minus9d.hatenablog.com/entry/2018/12/29/105151
https://www.thewindowsclub.com/fix-error-0x80070050-the-file-exists-when-deleting-a-file-on-windows-11-10?utm_source=dlvr.it&utm_medium=twitter
https://github.com/microsoft/WSL/issues/6928

---
思い出したらまた追加していきます．
こんなことに困った，という意見がありましたらぜひコメントしていただけたらと思います．
wsl2で立ち上げたdocker上のプロジェクトをvscodeで参照

![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803173/616b69f8-4a92-4f39-1a5d-978f0638ad99.png)
こちらの[open in visualstudio code]を開いても、「sample-app」と白紙のファイルが開かれるだけだった。
ボタンを押下した際にプロジェクトのフォルダが開いてほしい。

**解決**
簡単だった。
![スクリーンショット 2022-04-10 010137.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803173/c37a40ef-2abe-aa24-4d8c-160b6f588203.jpeg)

拡張機能として[Remote-wsl]をいれてあげるとプロジェクトごと立ち上がってくれた。
典型90問 002 Encyclopedia of Parentheses をPythonで解く！

# はじめに
AtCoder現在茶色(年内には緑が目標！）のあんこちゃん(@Chunky_RBP_chan)です。
典型問題は抑えとかねばということで、★2〜★5に取り組んでいます。
Pythonで取り組まれている方も多いと思うので自分の解答をシェアしたいと思います！
# 002 Encyclopedia of Parentheses
https://atcoder.jp/contests/typical90/tasks/typical90_b

## 解法
"(" → 0
")" → 1
としてbit全探索を考えます。この場合、入力例3は
3→0011→(())
5→0101→()()
となり辞書順に調べられています。
また、制約が1<=N<=20なので2^20 ~ 10^6程度となりbit全探索は十分間に合います。
適切な文字列かは変数count(初期値は0)に対して
"("は1を足す
")"は1を引く
を文字列の左から順に行います。適切な文字列の条件は
「途中でcountが負にならない」かつ「文字列を調べ終わったときにcount=0」
でこれらの文字列の数が解答となります。

```python
N = int(input())
for i in range(2**N):
    tmp = ''
    for j in range(N):
        if i & (1<<j) > 0:
            tmp = ')' + tmp
        else:
            tmp = '(' + tmp
    count = 0
    for i in range(N):
        if tmp[i] == '(':
            count += 1
        else:
            count -= 1
        if count < 0:
            break
    else:
        if count == 0:
            print(tmp)
新社会人に送るググり方

# いろんなググり方
もう「ググったけど出ませんでした」とは言わせない。

## リファレンスをググる
プログラミング言語やフレームワークにはリファレンスという公式のドキュメントが存在します。
変に個人が発信している情報は誤ったものも含まれているので、リファレンスを見るのが最も早く、最も正確です。

エラーとかはGithubのIssueに目を通すと解決しやすかったりします。

## 言語別にググる
基本的に次の順番でググればよっぽどじゃない限り目的の情報にたどり着きます。
日本語→英語→中国語→ロシア語

セキュリティ系（というか暗号系）に限れば、ロシア語が一番情報量としては多いような気がします。
それ以外は英語までググればほぼ解決します。

## 媒体別にググる
ググって出てくる多くの情報はWebページです。
ですがお硬い文書（調査報告書とか）や小さいコミュニティの発表資料（LT資料とか）はPDF、PPTが多いです。

そういう時は検索フォームの最初に「filetype:【媒体名】」をつけてググりましょう。
例えば「filetype:pdf 経済産業省　DX」とか
![スクリーンショット 2022-04-10 0.14.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/b8bcf95d-30c9-686b-6025-5dfbfc745323.png)

「filetype:ppt ブロックチェーン」とか
![スクリーンショット 2022-04-10 0.15.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/1b7783b2-45f1-504d-b05d-226a0df56a31.png)

## コミュニティ別にググる
以下のコミュニティがおすすめ
- [Stack Overflow](https://ja.stackoverflow.com/)
- [Qiita](https://qiita.com/)
- [Zenn](https://zenn.dev/)
- [Twitter](https://twitter.com/)
- [Reddit](https://www.reddit.com/)

なお、質問ができるコミュニティ（Stack OverflowやQiitaなど）は、とりあえず質問だけ投げておいて並行してググると時間効率がよろしいです。
（なお、回答者には敬意を払うことを忘れずに。聞きっぱなしはダメ）

## 【閑話】その界隈、技術のトップ層に聞く
これはググるとはちょっと違いますが、Twitter等で調べたい技術のトップ層にリプライを飛ばすとたまーーーーに答えてくれたりします。
（私はMicrosoftのAlex KipmanにHololens3はまだかと定期的にリプします）

## 論文をググる
高度な技術課題は、[Google Scholar](https://scholar.google.co.jp/schhp?hl=ja)か[arXiv](https://arxiv.org/)にある論文で解決する場合もあります。

## 特許をググる
特許庁の[J-PlatPlat](https://www.j-platpat.inpit.go.jp/)で調べたい技術に関連する特許をググりましょう。

出てくるものは特許になっているものなのでそのまま使えませんが、お金を払ったり自社の特許とクロスライセンスを結ぶことで使える場合もあります。

# そもそも検索ワードが出てこないという２等兵向け
## 助詞を切れ！！！！
例えば「NFTサービスの作り方」について調べたい場合
「NFTサービス　作り方」でググりましょう。
助詞である「の」はいりません。

すると……。

https://relipasoft.com/blog/nft-language-framework/

こういう記事が出てきますね。
あとは記事を読んで「Solidity」とか「Truffle」とか重要そうなキーワードをピックアップして検索ワードをアップデートしましょう。
例えば「Solidity　使い方」とか。

## 検索ワードは連想ゲーム
幅広い知識があれば検索ワードはポンポコリンと出てきます。
しかし、全員がそうではありません。

そういう人は知ってるキーワードで検索して出てきた新たなキーワードを吸収して連鎖的にキーワード組み合わせて行きましょう。

### ちなみに
検索ワードを名詞と動詞で組合せると効率よく探せるというのが経験則です。
「名詞　動詞」とか「名詞　名詞（補語）　動詞」とか。

英語の文法みたいですねｗ

**おわり**
なお、本記事は以下キャンペーンのテーマで作成しています。

https://qiita.com/official-events/3f21c92121aa125807b4
【Rust】AWS LambdaでWebSocketクライアントにメッセージ送信


AWS LambdaをRustで実装する際のサンプルコードが少なすぎるのでメモ

# 内容

LambdaからAPI Gateway経由でWebSocketクライアントにメッセージを送信する。
送信先クライアントのコネクションIDは入力イベントやDBで動的に取得することが多いだろうが、ここでは簡易化のため固定とする。

# コード

```toml:Cargo.toml
[package]
name = "sample"
version = "0.1.0"
edition = "2021"

[dependencies]
aws-config = "0.9.0"
aws-sdk-apigatewaymanagement = "0.9.0"
aws-types = "0.9.0"
http = "0.2.6"
lambda_runtime = "0.5.1"
serde_json = "1.0.79"
tokio = "1.17.0"
```

```rust:main.rs
use aws_config::meta::region::RegionProviderChain;
use aws_sdk_apigatewaymanagement::types::Blob;
use aws_sdk_apigatewaymanagement::{config, Client as ApiGwClient, Endpoint};
use aws_types::region::Region;
use lambda_runtime::{service_fn, Error, LambdaEvent};
use serde_json::{json, Value};

#[tokio::main]
async fn main() -> Result<(), Error> {
    let func = service_fn(func);
    lambda_runtime::run(func).await?;
    Ok(())
}

async fn func(_event: LambdaEvent<Value>) -> Result<Value, Error> {
    // リージョン設定の読み込み
    let region = "ap-northeast-1";
    let region_provider = RegionProviderChain::first_try(Region::new(region));
    let shared_config = aws_config::from_env().region(region_provider).load().await;

    // API Gateway クライアント用意
    // 対象　API Gateway　のエンドポイントURI(要変更)
    let api_uri = "https://<id>.execute-api.<region>.amazonaws.com/<stage>";
    let endpoint = Endpoint::immutable(http::Uri::from_static(api_uri));
    let api_management_config = config::Builder::from(&shared_config)
        .endpoint_resolver(endpoint)
        .build();
    let client = ApiGwClient::from_conf(api_management_config);

    // メッセージを送信
    let connection_id = "OFWR4eiLtjMCIpw="; // 送信先クライアントのコネクションID(要変更)
    let data = r#"{"message": "hello from lambda"}"#; // メッセージ内容
    client
        .post_to_connection()
        .connection_id(connection_id)
        .data(Blob::new(data))
        .send()
        .await?;

    Ok(json!({ "message": "success" }))
}
```
【NestJS】 No repository for "User" was found でTypeORMがEntityを見つけてくれない時のチェックポイント

# 概要

TypeORMを構成する設定ファイルのパス指定が間違っている場合に発生するエラー対処方法をまとめる

```bash
 No repository for "User" was found. Looks like this entity is not registered in current "default" connection?
```

# やり方

- Entityのパスを実際のディレクトリに合わせて定義する

`src/users/entities/user.entity.ts`


```ts:ormconfig.ts
module.exports = {
  type: 'mysql',
  host: process.env.DB_HOST || 'localhost',
  port: process.env.DB_PORT || '3306',
  username: process.env.DB_USERNAME || 'root',
  password: process.env.DB_PASSWORD || 'password',
  database: process.env.DB_NAME || 'meetup',

  // We are using migrations, synchronize should be set to false.
  synchronize: false,
  logging: true,
  entities: ['src/**/**/*.entity{.ts,.js}'],
  cli: {
    entitiesDir: 'src/**/entities',
  },
};

```


```ts:src/app.module.ts
import { Module } from '@nestjs/common';
import { join } from 'path';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import configuration from './config/configuration';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UsersModule } from './users/users.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      // 他のモジュールでも使用する
      isGlobal: true,

      // カスタム設定ファイルを読み込む
      load: [configuration],
    }),

    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: (configService: ConfigService) => ({
        type: 'mysql',
        host: configService.get('database.host'),
        port: Number(configService.get('database.port')),
        username: configService.get('database.user'),
        password: configService.get('database.pass'),
        database: configService.get('database.name'),
        entities: [join(__dirname, '**/entities/*.entity.{ts,js}')],
        synchronize: false,
        logging: configService.get('nodeEnv') === 'development',
        extra: {},
      }),
      inject: [ConfigService],
    }),

    UsersModule,
  ],
})
export class AppModule {}

```
MySQLコマンド

## 背景
MySQLコマンドをまとめた備忘録です。

## 内容

### ログイン
- localhostのMySQLサーバに接続する場合
```
$ mysql -u [ユーザー名] -p
```
- 外部MySQLサーバに接続する場合
```
$ mysql -u [ユーザー名] -p -h [host名] -P [ポート番号]
```

### ログアウト
```
mysql > \q
mysql > quit
mysql > exit
```
### ユーザー情報の取得
```
mysql > SELECT Host, User, Password FROM mysql.user;
```
### ユーザーの追加
```
mysql > create user `[ユーザー名]`@`[ホスト名]` IDENTIFIED BY '[パスワード]';
```
### ユーザーに操作権限の付与
```
mysql > grant all privileges on [DB名].* to [対象ユーザー] IDENTIFIED BY '[パスワード]';
```
### ログイン中ユーザーのパスワードを設定する
```
mysql > set password = password('[パスワード]');
```
### 特定ユーザーのパスワードを設定する
```
mysql > set password for '[対象ユーザー]'@'　[ホスト名]' = password('[パスワード]');
```
### データベース一覧表示
```
mysql > show databases;
```
### データベースの追加
```
mysql > create database [DB名];
```
### データベースの選択
```
mysql > use [DB名];
```
### テーブル一覧表示
```
mysql > show tables;
```
※詳細表示の場合
```
mysql > show table status;
```
### テーブルの作成
```
mysql > CREATE TABLE [テーブル名] (
  [フィールド名] [データ型],
  [フィールド名] [データ型],
  [フィールド名] [データ型]
)
```
### テーブルの削除
```
mysql > DROP TABLE [テーブル名]
```
### テーブル名の変更
```
mysql > ALTER TABLE [旧テーブル名] RENAME [新テーブル名]
```
### カラムの追加
```
mysql > ALTER TABLE [テーブル名] ADD [カラム名] [データ型];
```
### テーブル設計確認
```
mysql > desc [テーブル名]
```
※詳細表示の場合
```
mysql > SHOW FULL COLUMNS FROM [テーブル名];
```
### レコードの追加
```
mysql > INSERT INTO [テーブル名] [フィールド名] VALUES [値]
```
### データの更新
```
mysql > UPDATE [テーブル名] SET [フィールド名]=[値] WHERE [条件式]
```
※「WHERE」にて条件式を記載しない場合、全レコードが対象となります。
### レコードの削除
```
mysql > DELETE FROM [テーブル名] WHERE [条件式]
```
※「WHERE」にて条件式を記載しない場合、全レコードが対象となります。
Windows 11の絵文字パッドで「魔人（精霊）」を検索したい

# はじめに
　Windows 11のショートカット **[Win] + [.]** で、絵文字パッドを呼び出せる、と [**ROBO BOY**](https://twitter.com/flali_world)に教えてもらいました。しかし、多彩な絵文字パッドから文字検索する検索ボックスがありませんでした。その解決方法です。

## 検索ボックスがない状態とは
　以下のような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/e0100495-de73-fbf6-e7f7-3a0d4ee032bb.png)

## 対策

　Windows 11の設定で、IMEの設定で「以前のバージョンのMicrosoft IMEを使う」がオンになっていました。ここをオフにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/7ed1be16-4e03-4873-9ab0-50268d09c339.png)

　そうすると、このように検索ボックスが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/113b2b3c-87ac-bf66-3dab-0cbb1c835028.png)

魔人を検索するには、**精霊**です（3人もいますw）。

# おわりに
　これで大量の絵文字から、キーワードで検索できるようになって、一安心です。
「最新国勢調査結果」 →「 e-Stat API」 →「 Power BI Desktop」

# APIの利用準備

”国勢調査は，日本に住んでいるすべての人及び世帯を対象とする国の最も重要な統計調査で，国内の人口や世帯の実態を明らかにするため，5年ごとに行われます。”（[総務省統計局のサイト](https://www.stat.go.jp/data/kokusei/qa-1.html)より）

総務省（統計局）は昨年（2021年）から「令和2年国勢調査」の集計値の結果を公開し始めました。
6月に「人口速報集計」を、翌2022年4月6日には「小地域集計（移動人口の男女・年齢等集計に関する集計）」を公表しました。

https://www.stat.go.jp/data/kokusei/2020/index.html

政府統計の総合窓口「e-Sta」からデータを取得します。
今回はAPIを（初めて）利用しました。

https://www.e-stat.go.jp/api/api-dev/how_to_use

ログインし、マイページから「アプリケーションID」を取得します

~~~R
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/d0cc1deb-87e6-f9f7-c1ad-c5e444ef921b.png)
~~~

このIDをURL（クエリー）のパラメータとして付与することでAPIをたたき、XML、JSON、CSVのデータを取得します。

http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData?appId=<アプリケーションID>&lang=J&statsDataId=*****

# e-Statを使用しデータ準備

「男女別人口及び人口性比 － 全国，都道府県（大正9年～令和2年）」の数値を取得します。

https://www.e-stat.go.jp/stat-search/database?page=1&layout=datalist&toukei=00200521&tstat=000001011777&cycle=0&tclass1=000001011778&tclass2val=0

「DB」をクリックし、まずデータを確認、次に「API」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/aa133fe4-867c-bd7c-ffd6-f43d2e13160f.png)

今回はCSVを選びました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/792a7e1b-ed65-9e1c-c163-ba911097d77b.png)

「アプリケーションID」を付与し、Power BI Desktopでインポートします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/c8c95aa3-df9c-7316-b7d0-7303985d8fbe.png)

# Power BI Desktopで加工

下の方にある数値データのみにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/0b95dfca-211b-f562-c56b-13904564ee9e.png)

ある列（今回はColumn5）の空白行を外します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/9813e148-706e-505b-3c8a-83d98a43111f.png)

「1行目をヘッダーとして使用」「（整数列に整えるために）Errorをゼロに置換」し加工を終え（以下画面）、可視化画面に移ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/51fa3670-a73a-260e-8866-0c062a39b18b.png)

# グラフ作成

x軸に時間要素、y軸（値）に人口数値を配置、フィルター条件に「総数」「全国」とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/d8e4f0b5-e98c-4fd0-a174-16b86cb60cea.png)

5年ごとの推移です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/6fc96728-05e1-08ad-c989-0f4d6ef5181f.png)

# カスタム計算利用

人口数推移でなく、前回（5年前の）との比のグラフも作りました。
「クイックメジャー」に用意されている「YtoY（前年比）」の式をベースにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/b4c4d93e-c3a1-e1e7-aa95-4b6610c8d701.png)

「5」にすることで、5年前の値と比較できます。
デフォルトの「1」では、前年値が「ゼロ」となり多くが「-100%」の棒グラフとなるなど目的とは異なります。
生成したDAXの記述です。

~~~R
IF(
	ISFILTERED('国勢調査 時系列データ 男女_年齢_配偶関係'[時間軸（調査年）]),
	ERROR("タイム インテリジェンスのクイック メジャーは、Power BI が指定する日付階層またはプライマリの日付列でのみグループ化またはフィルターできます。"),
	VAR __PREV_YEAR =
		CALCULATE(
			SUM('国勢調査 時系列データ 男女_年齢_配偶関係'[value]),
			DATEADD('国勢調査 時系列データ 男女_年齢_配偶関係'[時間軸（調査年）].[Date], -5, YEAR)
		)
	RETURN
		DIVIDE(SUM('国勢調査 時系列データ 男女_年齢_配偶関係'[value]) - __PREV_YEAR, __PREV_YEAR)
)
~~~

作成したグラフです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/fabf4050-6c24-5f60-b192-b44fd3d53bff.png)

**了**