OmniAICreator/Qiita-1.07M huggingface dataset:
QCA8337の使い方

QualcomのEthernet SwitchのQCA8337の使い方です。

QCA8337はAtheros時代のAR8327,AR8328の後継です。AR8337という製品あったのかもしれませんが、ほんの一瞬だったと思います。

Atherosの最初のGigaのスイッチのAR8316は大きなパッケージでしたが、QCA8337は小さくなっています。

AR8316の前にAR8229/AR8228という製品もあって、これは内蔵PHYは100Mですが、GMACが入っているので外付けPHYでGinaに出来るチップでした。

|Device ID|Product|
|:---|:---|
|0x01|AR8216|
|0x02|AR8226,AR8228,AR8229|
|0x03|AR8236|
|0x10|AR8316|
|0x12|AR8327,AR8327N,AR8328|
|0x13|AR8337,QCA8337|

今回のターゲットはc2kですが、AtherosのMIPS SOC AR9342といっしょに使われているターゲット(DB120)もありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8c57eb2e-5933-117d-dd98-2a954b6677cf.png)

PHY以外の接続をPADと呼んでいて、PAD0(GMII..), 5(RGMII..), 6(SerDes)があります。

PADがMAC側を意味する場合もあり混乱します。

以下のような使い方があります

1. PAD0をSOCのGEMACに接続
2. PAD5をSOCのGEMACに接続してPHY4を切り出し
3. PAD5をSOCのGEMACに接続してPort5 GMACに接続(上の図で線が抜けています)
4. PAD5をSOCのGEMACに接続してPort6 GMACに接続
5. PAD6をSOCのSerDesに接続してPort6 GMACに接続
6. PAD6をSOCのSerDesに接続してPort0 GMACに接続

PHY4を切り出さずPort5 GMACを使わない場合、PHY4はPort5 GMACに接続されて外部5PortのSwitchになります。

DB120はSOCのGEMACが1本なので1だけでした。

このチップはデフォルトはPort base VLANで入ってきたパケットはAR8327_REG_FWD_CTRL1と各ポートのAR8327_REG_PORT_LOOKUPのマスクでパケットが転送されます。

BareboxはPHY4切り出しで使っていて、Kernelブート後にPort6 GMACにつないでも通信できません。

確認はpingとtcpdumpコマンドを使います。

PADの設定はPORT0_PAD_CTRL, PORT5_PAD_CTRL, PORT6_PAD_CTRLがありPort6 GMACの設定はPORT6_PAD_CTRLでできるのかと思いきや、google fiberのソースに以下のようなコメントがありました。

```
                /* PORT5_PAD_CTRL[MAC_RGMII_RXCLK_DELAY_EN] controls all RGMII
                 * interfaces (MAC0, MAC5 and MAC6)
                 * If set, then RGMII interface RXCLK is delayed:.
                 *   1000M:    Delay 2 ns output to CPU.
                 *   10M/100M: Delay value depends on bits[21:20].
                 */
```

同じようにしたら、とりあえずLANポートのPHY0-3とは通信できるようになりましたがWANポートのPHY4とは通信できません。

PORT6_PAD_CTRLにPHY4_RGMII_ENという切り出し用の設定があるのでMACに接続する設定もあるのかと思いきやありません。PHY4_RGMII_ENが設定されていない場合はPHY4はMAC接続になるようです。

STATUSレジスタを見るとPHYの状態はMACが把握できているようなのですが、通信できません。

google fiberのコードを見てみたらPHY4自体を設定しているコードがあって、同じようにしてみたのですが上手くいきません。

よく分からんので通信できている、PHY3の設定をPHY4にコピーするようにしたら通信できました。副作用があるかもしれません。

SOCなどに接続せずに単体で5ポートのSwitchとして使う場合デフォルトではPHY4が有効にならないのでEEPROMで設定する必要があります。

PADの設定のデフォルトは全て0で、なにもつながない事を前提にしているので、PHY4がデフォルトで接続できないのは、ちぐはぐです。

と思ったのですが、RGMIIなどを使わず5ポートのSwitchで使うことはほぼなく、WANとLANがつながっちゃうと問題があるので、意図的にそうしているのかもしれません。

![comcerto2n-sw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/59212d7a-59f0-4c4c-3c8f-ad73b3128b26.png)

WAN/LANの2ポートでルーターとして使わない場合はSOCからはIFが1本の接続で、全ポートがSwitchに接続されているのが使い勝手がいいです。また、なにか特殊な利用方法でない限りVLANも必要ありません。

SwitchはOSが設定するまでは全ポート通信できないのがセキュリティ的にはいいのだが、さすがに使い勝手がわるいので、全ポート開放のデフォルトの事が多い。もし閉じたければEEPROMをつけろって事かな。

c2kのPFEのHIFを複数IFにするのが面倒なので、IFが1本のほうが都合がよかったりします。
#0014 シバン 【shebang】とは

## はじめに
- 最近の仕事ではbashスクリプトを書いてdockerコンテナを一括実行するようなことがあった。
- bashスクリプトの一行目のおまじないの `#!/bin/bash` が何なのかが気になったので調べてみた。

##  シバン （shebang）
- `#!/bin/bash`はshebangと言われるもので、LinuxなどのUNIX系OSで実行されるスクリプトファイルで、実行する処理系（インタプリタ）を指定する仕組み。
- 一行目でインタプリタを指定して、二行目以降の文を引数として渡す。
- bashのみが使えるものでもなく、pythonファイルの先頭に`#!/usr/bin/env python`と記述すればpythonのインタプリタをしていできます。

[参考](https://e-words.jp/w/%E3%82%B7%E3%83%90%E3%83%B3.html)

## shebangの使い方
- hello.sh
```
#!/usr/bin/bash
echo hello!!!
```

- 実行
```
❯❯❯ bash hello.sh
hello!!!
```

## shebangがないとどうなるか

- それでは`#!/usr/bin/bash`がないとどうなるか...結果は同じ出力がされた......
- これに関して調べてみると、shebangはなくてもうまくいくことはあるようです。
- ただ、shebangがないと想定外のインタプリタでスクリプトが実行される可能性があるようで、記述はした方が良いとのことです。（ふわっとした結論ですが...）

## おわりに
- shebangという名前の由来は「ハッシュorシャープ(#)」と「エクスクラメーションマーク（！） ※バンとも呼ばれる」の組み合わせから“hash-bang” あるいは “sharp-bang” を縮めて “shebang”となったらしい。
TypeScript interfaceとtypeどっち使うんですか？

フロントエンド勉強中です。
ブルーベリー本とChatGPT、サバイバルTypeScriptとともに学んでいます。

# ざっくりとしたまとめ

## **interface：拡張可能**

`interface`を使用すると、同じ名前のインターフェイスを複数回定義することで、既存のインターフェイスを拡張することができる。

## **typeの特徴：複雑な型操作ができる**

`type`を使用すると、Intersection型など、より複雑な型の操作を表現することができる。

``` typescript
interface PersonInterface {
  name: string;
  age: number;
}

interface PersonInterface {
  email: string;
}

const personWithInterface: PersonInterface = {
  name: "田中",
  age: 25,
  email: "tanaka@example.com"
};

console.log(`${personWithInterface.name}さんのメールアドレスは${personWithInterface.email}です`);


type Name = {
  name: string;
};

type Age = {
  age: number;
};

type PersonType = Name & Age;

const personWithType: PersonType = {
  name: "山田",
  age: 30
};

console.log(`${personWithType.name}さんは${personWithType.age}歳です`);

// 田中さんのメールアドレスはtanaka@example.comです
// 山田さんは30歳です
```
【Python】辞書に含まれるキーと値を取得する方法

# 【Python】辞書に含まれるキーと値を取得する方法について書いていく


## 1.辞書の「キー」の取得方法(2種類) keys()

### ①keys()を使わなくてもキーは取れる
```py
drink = {'c': 'coffee', 'o': 'orange', 't': 'tea'}
for a in drink:
    print(a)
```

```py:実行結果
c
o
t
```

### ②keys()を使ったキーの取得


```py
drink = {'c': 'coffee', 'o': 'orange', 't': 'tea'}
for a in drink.keys():                               # drinkの後ろに、keys()を入れるだけの違い
    print(a)
```
```py:実行結果
c
o
t
```

## 2.辞書に含まれる値を取得 values()

```py
drink = {'c': 'coffee', 'o': 'orange', 't': 'tea'}
for a in drink.values():                              
    print(a)
```
```py:実行結果
coffee
orange
tea
```

## 3.キーと値をどちらも取得 items()

```py
drink = {'c': 'coffee', 'o': 'orange', 't': 'tea'}
for b, c in drink.items():
    print(b, c)
```

```py:実行結果
c coffee
o orange
t tea
```
【Python】４つの数の合計

# 作るもの
与えられた配列から4つの要素の組み合わせを選び、その合計が目標値と一致するものを見つけてリストで返す関数。

# 実装
```python:four_number_sum.py
def fourNumberSum(array, targetSum):
    result = []  # 合計が目標値と一致する組み合わせを格納するリスト
    array.sort()  # 配列をソートして順序を整える
    for i in range(len(array) - 3):  # 4つの要素の組み合わせを探すため、最後から4番目の要素までループ
        for j in range(
            i + 1, len(array) - 2
        ):  # iより後ろの要素との組み合わせを考えるため、i+1から最後から3番目の要素までループ
            left = j + 1  # 左側のポインタをjの次の位置に設定
            right = len(array) - 1  # 右側のポインタを配列の最後に設定
            while left < right:
                total_sum = (
                    array[i] + array[j] + array[left] + array[right]
                )  # 4つの要素の合計を計算
                if total_sum == targetSum:
                    result.append(
                        [array[i], array[j], array[left], array[right]]
                    )  # 合計が目標値と一致する場合、組み合わせをリストに追加
                    right -= 1  # 右側のポインタを減少させる（より小さい値を試すため）
                    left += 1  # 左側のポインタを増加させる（より大きい値を試すため）
                elif total_sum > targetSum:
                    right -= 1  # 合計が目標値より大きい場合、右側のポインタを減少させる
                else:
                    left += 1  # 合計が目標値より小さい場合、左側のポインタを増加させる
    return result  # 合計が目標値と一致する組み合わせのリストを返す


# テスト
if __name__ == "__main__":
    array = [7, 6, 4, -1, 2]
    targetsum = 16
    print(fourNumberSum(array, targetsum))
```

# 参考
https://www.algoexpert.io
現場でよく使用するシェルスクリプト

## ＜頻度:高>コマンド
○su -　
一時的に別のユーザに変える時に叩く
ex) su - root

○exit 
ログアウト時に使用

○chmod 
ファイルに対する権限を設定時に使用
ex)chmod 000 ファイル名/ chmod 777 ファイル名/chmod 444 ファイル名
000でファイルに書き込み、読み込み不可
777でファイルへの書き込み、読み込み可
444でファイルへの読み込みのみ可

○ls
削除したいファイルがディレクトリ配下にあることや削除したディレクトリを確認する際に使用

○tail -f ファイル名
ログを監視する際に使用

○pwd
現在ユーザーがいる場所を確認する際に使用

○vi ファイル名
ファイルを作成及び記述したい際に使用

○aキー
viで開いたファイルに記述するために使用する

○exit 1
プログラムを強制終了させるために、exit 1をviで開いたファイルに記入する

○:wq
vi で開いたファイルに記述した内容を保存するために使用

○:q!
vi で開いたファイルに記述した内容を保存せず、閉じる際に使用

○#
シェルスクリプトで書かれたコードをコメントアウトする際に使用

○esc 
vi での記述モードを終了させたいときに使用

○Alt + c 
文字列をコピーしたい時に使用

○右クリック
コピーしたデータを貼り付ける時に使用

### <頻度:少>
○mkdir　ファイル名
ファイルを作成時に使用

○cd ファイル名or ディレクトリ名
移動する際に使用

○rm -r ファイル名
不要なファイルを削除する際に使用
このコマンドにより、削除したファイルは元に戻す事ができないため、注意して使用
19章 回帰分析その他

# 問19.1
(1) 観測できる積雪量が0以下になることはないから、左打ち切りであり、$L=0$である。
これと、$x_i^\top\beta = \beta_0+\beta_1x_{i1} + \beta_2x_{i2}$を潜在変数の式に代入する。

(2) 推定するパラメータの数は、例えば「日照時間＋平均気温＋最低気温＋最高気温」のモデルの場合、$\beta_0$（切片項）、$\beta_1$（日照時間の係数）、$\beta_2$（平均気温）、$\beta_3$（最低気温）、$\beta_4$（最高気温）、$\sigma$の6つ
p288のAICの式に従ってAICを算出すると、「日照時間＋平均気温」のモデルが最もAICが小さく、良いモデルといえる。

# 問19.2
ハザード関数$h(x)$は以下の式で導出される（p7を参照）
$h(x) =\frac{f(x)}{S(x)}= (-\log{S(x))'}$
回答のとおり

# 問19.3
$h(t|x) = (-\log{S(t|x)})'$
$-\log{S(t|x)}) = \int_{0}^{t} h(u|x) du$
(19.3)より、基準ハザード$h_0(x)$を用いて
$-\log{S(t|x)} = \int_{0}^{t} h_0(u)e^{x^\top\beta} du = e^{x^\top\beta}\int_{0}^{t} h_0(u) = e^{x^\top\beta}H_0(t)$
両辺の対数をとって
$\log(-\log{S(t|x)}) = x^\top\beta + \log{H_0(x)}$

# カプラン・マイヤー推定量
https://biotech-lab.org/articles/6361

# 問19.4
(1)治療する（治療群、太線）/治療しない（対象群、細線）を共変量として考える。比例ハザード性を表す式$\log(-\log{S(t|x)}) = x^\top\beta + \log{H_0(x)}$
を満たしているかどうかを確認する。
x=0は治療しない場合なので、x=0のとき
$\log{H_0(t)} = \log(\int_{0}^{t} h(u|0) du) = \log(\int_{0}^{t} (-\log{S(u|0)})' du) = \log(-\log{S(t|0)})$
x=1を治療すると仮定した場合、以下の式が成り立つがどうかを確認すればよい。
$\log(-\log{S(t|1)}) = \beta + \log(-\log{S(t|0)})$

今回の問題では、$\log(-\log{S(t|1)})$が細線、$\log(-\log{S(t|0)})$が太線であるが、これは平行になっており$\beta$をその間隔と考えれば上式は成り立つ。

(2)回答のとおり
【Python】単調配列

# 作るもの
与えられた配列が単調な増加または単調な減少を持つかどうかを判定するための関数。

# 実装
```python:main.py
def isMonotonic(array):
    c = True  # 単調増加を示すフラグ
    d = True  # 単調減少を示すフラグ
    for i in range(len(array) - 1):
        # 配列内の要素を順番に比較し、単調増加かどうかを判定
        c = c and array[i] <= array[i + 1]
        # 配列内の要素を順番に比較し、単調減少かどうかを判定
        d = d and array[i] >= array[i + 1]
    # 単調増加または単調減少のいずれかが成り立つ場合、単調であると判断
    return c or d

# テスト
if __name__ == "__main__":
    array1 = [-1, -5, -10, -1100, -1100, -1101]
    array2 = [-1, -5, 10, -1100, -1100, -1101]
    print(isMonotonic(array1))
    print(isMonotonic(array2))

```

# 参考
https://www.algoexpert.io
Javaで「ファイルやディレクトリを削除する(Files.delete)」の動作を確認してみた

# 概要
Javaで「ファイルやディレクトリを削除する(Files.delete)」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/file/index6.html

# 実装
以下のファイルを作成しました。
```JSample6_1.java
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.IOException;

class JSample6_1{
  public static void main(String[] args){
    Path p = Paths.get("/code/java/file/report.txt");

    try{
      Files.delete(p);
    }catch(IOException e){
      System.out.println(e);
    }
  }
}
```
以下のコマンドを実行しました。
```
$ javac JSample6_1.java 
$ java JSample6_1 
$ java JSample6_1 
java.nio.file.NoSuchFileException: /code/java/file/report.txt
```
以下のファイルを作成しました。
```JSample6_2.java 
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.IOException;

class JSample6_2{
  public static void main(String[] args){
    Path p = Paths.get("/code/java/file/doc/manual/back");

    try{
      Files.deleteIfExists(p);
    }catch(IOException e){
      System.out.println(e);
    }
  }
}
```
以下のコマンドを実行しました。
```
$ javac JSample6_2.java 
$ java JSample6_2 
$ java JSample6_2 
```

# まとめ
何かの役に立てばと。
ブラウザ　学習

<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vSSokJGdNLmkTZCU3FyNGpnmMhox88_yRVHLS5kDcsrImD3mpnfq2Caeu3N4KxyZE_rNCiKpy3j1EFj/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
JavaScript　プロトタイプ　学習

<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vQcy0rSDeHHPEpRW32OXlXkP9_D0QEQQWYkejngM6w4Xjq1NGDllaYgC2J_VC5YR0kpx-nM64zSe6cM/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
JavaScript　非同期処理　学習

<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vTv-XNQr216OvG0atkpiNv7bMSKrodQyx7CcWd-XRSqqMyyyhl7Akq1tVVcOGQlKMcmHFwsrf65VSem/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
えんじぇる。がQiitaにやってきた。

ということで（？）、とりあえず登録してみた。
勉強がてら投稿するので、コメント頂ければうれしいです。

本人はGID当事者（MTF）で、理系に憧れただけの文系かも知れない人です。
昔、MS-DOSの頃、パソコンをいじり、Windows登場でやめてしまい、数十年が過ぎ、また勉強し始めました。
今はとりあえず、PHPを勉強し直しています。

ファンタジー神名辞典→http://bio-fantasy.com

早川SF文庫書評データベース→
http://hayakawadb.bio-fantasy.com

えんじぇる。ちゃんねる→
https://youtube.com/channel/UCBEdwnk8rc43bU8Q34Wtw-A

その他
https://ameblo.jp/sadangel
郵便番号から住所を検索するLINEbotを作ってみた

**初心者でも作れるLINEBotを作成します。**
-
LINEBotなど聞いた事もなかった私ですが、ある機会があって作る事に。
テキストを何度も何度も復習して、数日格闘して作成したLINEbotです。
でも言い換えれば、初心者でも簡単に作れる、初めてチャレンジするには
もってこいの内容です。

以下が完成したLINEBotです。
![ezgif.com-video-to-gif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484232/bf19c4f7-1192-d96e-f9dc-dc46563cd2c0.gif)

**まずMakeでシナリオを作ります。**
-
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484232/fd5a17a2-7cb6-b66f-ce5e-b7cf04a6f0fe.png)
最終系のシナリオはこうなります。
モジュールという丸っこいものを繋いで、それぞれ処理してもらいます。
LINEモジュールについては、こちらが参考になります。

https://zenn.dev/inoue2002/articles/3067c574b3a605

**モジュールを追加して繋いでいきます。**
-
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484232/1ce82d6d-f33e-ea55-3474-a02d3f873171.jpeg)

HTTPモジュールを追加して、郵便番号APIのURLを入力します。

![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484232/0303f391-7f50-9284-6fea-f6cd558fc8f3.jpeg)
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484232/0c2445a2-938e-e7cc-c2fc-70176afaca43.jpeg)
ちなみにAPIの中身はこんな感じです。
中身を見る限り、address1~address3まで抜ければ大丈夫そうです。
![WS000007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484232/630b694e-ecb9-2848-d223-cc831488a17b.jpeg)
クエリは「zipcode」で設定します。
![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484232/2f8534e6-c144-35f5-f328-fad1ae1431ee.jpeg)
![スクリーンショット 2023-08-20 164512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484232/e81f2949-07f1-c8f0-3bb5-5e0581abc9e4.png)
次にParseJSONモジュールを追加してサンプルデータに先ほどのJSONコードを
コピペします。
![WS000009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484232/6cf4f702-2b05-75de-a4da-f1d26bda8fab.jpeg)
![WS000010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484232/87fec894-2512-0a0f-f115-5a1456cd011c.jpeg)
Json stringにDataを入れます。
![スクリーンショット 2023-08-20 170113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484232/f4cf5653-01d9-c6f7-c5d7-715ec21322be.png)
最後にSend a Reply MessageのLINEのText欄にaddress1~3まで入れたら完了です。
![スクリーンショット 2023-08-20 170802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484232/8c905845-250d-cb65-39e1-d5e024ca94ba.png)

**最後に**
-
結構簡単に出来ました。
少ない時間との戦いの中で完成させたものなので、今後は他の人が作ったものを
自分でも作成して経験値を積み、自分の作りたいものにチャレンジしたいと思います。
Chromeリモートデスクトップ後にキー長押しができない事象を対処したい


# Introduction

皆様はリモートワークしていますでしょうか。
私は基本出社ですが、体調不良や家庭の事情がある時はリモートにしています。

リモートの際は Windows10 から社内の Ubuntu18.04 に、Chrome リモートデスクトップで接続しています。
特に問題なく作業できますが、翌日出社していつも通り Ubuntu を触っているとキー長押しが反応しなくなりました。

- **結論**
  - **`リピートキー`を一度オフにして、再度オンにする。**

**本記事が少しでも読者様の学びに繋がれば幸いです！**
**「いいね」をしていただけると今後の励みになるので、是非お願いします！**

## 環境

Ubuntu18.04

## 発生パターン

1. Windows10 から Ubuntu18.04 に Chrome リモートデスクトップで接続する。
1. 切断後に Ubuntu マシンを直接操作し、キー長押しで発生した。

:::note info
手元の Ubuntu20.04 と 22.04 は、同一手順では再現しませんでした。
Ubuntu バージョンに依存した現象かと思われます。
:::

## 対処

1. 右上の設定（工具のアイコン）をクリックする。
1. ユニバーサルアクセス（Ubuntu22.04 ではアクセシビリティ）を選択する。
1. `リピートキー`を一度オフにする。
1. `リピートキー`をオンに戻す。
1. キー長押しが反応することを確認する。

![Screenshot from 2023-08-10 23-42-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292052/c26f79f8-3039-661e-9602-06fe2ad740e6.png)

再起動すれば直るのですが、モデル学習中等で再起動できない場合があったため上記手順で対処しました。

### 最後に

Linux マシンは何かとバグの多いですが、特に GUI や daemon の反映する/しない問題は多いように感じますね。[^1]
[^1]: 本記事の投稿にあたって[発生パターン](#発生パターン)を試したところ、解像度も 1600☓900 になってフル HD 以上が選択できない事象も発生しました。
再読込で解決しそうだったため 1366☓768 を反映させると、フル HD に戻りました。

似たような事象が発生しましたら`リピートキー`を疑って、解決しなければ再起動を試しましょう。

最後まで閲覧頂きありがとうございました。
本記事がお役に立てば幸いです！

### 参考 URL

https://help.ubuntu.com/stable/ubuntu-help/keyboard-repeat-keys.html.ja
関数で処理の流れを書く「関数フロープログラミング」

# 概用
処理の流れを、トップダウン方式（ウォーターフォール）で主に関数や式を使ったフローで書き、実装は末端の関数でするプログラミングスタイル。やってみると書きやすく、処理の流れもわかりやすい。

# Hello Worldで具体例
```py
# flow
def HellowWorld():
  str = SetStr()
  PrintStr(str)

# end
def SetStr():
  return "Hello World!"

# end
def PrintStr(str):
  print(str)
```
#flowがフローで、#endが実装。

ここまで簡単なプログラムだと冗長に見えるが、問題（処理）が分解され、アルゴリズムの概要が明確。正しいかどうかの検討も容易。

# 就活で例えると
```py
def 就活(prof)
  履歴書 = 履歴書作成(prof)
  結果 = 履歴書投函(履歴書)
  if 結果 == 合格
    最終結果 = 面接()
  else
    最終結果 = 不合格
  return 最終結果

  def 履歴書作成(prof)
    #実装を書きます

  def 離席書投函(履歴書)
    #実装を書きます

  def 面接()
    #実装を書きます
```
という感じ。流れが分かりやすいですね。

# 抽象的な構造の例
```py
# flow
def flow(x):
  x = f(x)
  y = g(y)
  r = h(z)
  return r

  # flow
  def f(x)
    y = r(x)
    z = s(y)
    return z

    # end
    def r(x)
      # implementation

    # end
    def s(x)
      # implementation

  # end
  def g(x)
    # implementation

  # end
  def h(x)
    # implementation
```
flowとendによる入れ子構造ですが、データ受け渡し含めてそのようでなくてもよく、フローにifやfor、その他処理を含めたり、プログラムの一部に使うなど、好きに改造してOKです。

# 終わりに
問題を分解することにより、アルゴリズムの複雑さが低減される、書き易い、などのメリットがあります。

デメリットは、フローの制作ができるかどうかや、関数が多くなること、プログラムが縦に長くなることなど。

見やすくするには、関数をネストするのが良いですが、python含めて、理想的にサポートされていないこともあります（pythonはネストされた関数を先に書かなくてはならないので、例の書き方は間違いなのですが、説明のため）。

気に入ったら試してみてください(−ω−)ｱﾘｶﾞﾄｳｺﾞｻﾞｲﾏｼﾀ
VSCodeでFontconfigをXML Language Supportを効かせながら編集する方法

## 概要

Fedora Linuxを使用していてVSCodeでFontconfigを編集しようと思ったんですが、単にXML Language Support by Red Hatの拡張を入れただけでは上手く行かなかったので追加で行った設定を残しておきます。

## 環境
OS: Fedora 38

## 手順

### 拡張のインストール

VSCodeに拡張`XML Language Support by Red Hat`をインストールします。

[XML Language Support by Red Hat ](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-xml)

:::note info
FontconfigのファイルをXMLとして編集するには`Change Language Mode`でXMLを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260137/ca5e6ef5-9edc-bce7-081d-0a339bb51bde.png)
:::

:::note warn
この状態でFontconfigを編集しようとするとDTDが見つからない旨のエラーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260137/64ed443a-8ba6-045f-8ccf-af5bc4b48fc8.png)
なので後続の手順でDTDを見つけられるように設定します。
:::

### XMLカタログファイル追加
 
XML Language Support by Red Hat 拡張のXMLカタログ設定`xml.catalogs`にXMLカタログファイルのデフォルトの配置パス`/etc/xml/catalog`を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260137/290b8928-85ea-43a6-8486-36fa8706797e.png)

:::note info
XMLカタログファイル内に`urn:fontconfig:fonts.dtd` という識別子と実際のファイルの場所`file:///usr/share/xml/fontconfig/fonts.dtd` の紐付けが記述されています。
```xml:/etc/xml/catalog
<?xml version="1.0"?>
<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <!-- 中略 -->
  <system systemId="urn:fontconfig:fonts.dtd" uri="file:///usr/share/xml/fontconfig/fonts.dtd"/>
  <!-- 中略 -->
</catalog>
```
:::

### Fontconfigを編集する

Fontconfigを開き、`Change Language Mode`でXMLを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260137/ca5e6ef5-9edc-bce7-081d-0a339bb51bde.png)

DTDが読み込まれfontconfigの各種要素が認識されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260137/73595a20-a83c-5737-3a6a-8dc5dc34dda0.png)

## 参考
[フォント設定 - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E8%A8%AD%E5%AE%9A#Fontconfig_.E8.A8.AD.E5.AE.9A)
[XML Catalogs](https://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html)
ヒープメモリ不足によってktlintエラーが発生する

## 事象
Kotlinでのバックエンド開発中、Ktlintに準拠しているにも関わらずエラーが発生することがあります。このエラーの一因として、Javaヒープメモリの最大サイズの不足が挙げられます。

## 原因
Ktlintや他のGradleタスクは、大規模なプロジェクトや多数のテストを処理する際に、メモリの消費が増えます。そのため、デフォルトのヒープメモリ割り当てが不足してエラーが発生することがあります。

## 対処法
### 1\.　org.gradle.jvmargsの設定調整

ヒープメモリ不足を解消するための方法は、org.gradle.jvmargsの設定を調整することです。

```gradle-wrapper.properties
org.gradle.jvmargs=-Xmx4096m
```

この設定org.gradle.jvmargs=-Xmx4096mは、Gradleプロセスに割り当てられるJavaヒープメモリの最大サイズを指定します。

### 2\. メモリの使用量に影響を与える要因の把握

テストの増加：テストケースが増えると、メモリの使用量も増加します。
プロジェクトの成長：クラスやリソースが増加すると、必要なメモリも増加します。
特定のタスク：一部のGradleタスクは他よりも多くのメモリを消費します。

### 3\. Gradleデーモンの再起動:

Gradleはデーモンとして動作するため、設定変更後にはデーモンの再起動が必要です。特に、org.gradle.jvmargsのようなJVMの設定を変更した場合、この再起動は欠かせません。

```
./gradlew --stop
```

上記コマンドにより、現行のGradleデーモンが停止します。次回のGradleタスク実行時には新しいデーモンが起動し、新しい設定が反映されます。

自らの備忘録のために投稿してますが、なにかお役に立てましたら幸いです！:clap:
また、なにか間違ってましたらご指摘いただけますと幸いです！:pray:
ABC188 解説

# ABC188解説
## この記事は何
この記事は復習としてABC188を解説したものになります。
## 問題の解説
[問題のリンクはこちら](https://atcoder.jp/contests/abc188/tasks/abc188_b)
### A問題
[A問題の公式解説のリンクはこちら]()
```python:abc_312.py

```
### B問題
[B問題の公式解説のリンクはこちら](https://atcoder.jp/contests/abc188/editorial/490)
この問題はいわゆる「__やるだけ問題__」になります。いわれた通りに実装できればACがでる問題という意味。学びになる個所としては累算代入演算子を使って条件をfor文を通して判定していくところぐらいです。ちなみに内積を求めて0なら～とやってもかまいません。
```python:abc_188_b.py
N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

ans = 0
for i in range(N):
    ans += A[i] * B[i]

if ans == 0:
    print("Yes")
else:
    print("No")
```
### C問題
[C問題の公式解説のリンクはこちら]()
```python:abc_312.py

```
ABC197 解説

# ABC197 解説
## この記事は何
この記事は復習としてABC197を解説してみようというものです。
## 問題の解説
[問題のリンクはこちら](https://atcoder.jp/contests/abc197/tasks)
### A問題
[A問題の公式解説のリンクはこちら](https://atcoder.jp/contests/abc197/tasks/abc197_a/editorial)
この問題はStr型の操作を正しく行えればACが出るはず。以下は自分のコードになります。
```python:abc_197_a.py
S = input()

ans = S[1]+S[2]+S[0] 

print(ans)
```
以下のようにすると __'str' object does not support item assignment__ のエラーがでるので注意。リストの順番入れ替えはこの書き方で行われがちだが、str型は[イミュータブル](https://qiita.com/kojikawamura/items/50a7d1d426c12a8c702b)で書き換え不可能なので注意。
```python
S = input()

S[0], S[1], S[2] = S[1], S[2], S[0]

print(S)
```
### B問題
[B問題の公式解説のリンクはこちら](https://atcoder.jp/contests/abc197/tasks/abc197_b/editorial)
```python:abc_197_b.py

```
### C問題
[C問題の公式解説のリンクはこちら]()
```python:abc_312.py

```
ABC199 解説

# ABC199解説
## この記事は何
この記事はABC199の復習として解説をしてみようというものです。
## 問題の解説
[問題のリンクはこちら](https://atcoder.jp/contests/abc199)
### A問題
[A問題の公式解説のリンクはこちら](https://atcoder.jp/contests/abc199/tasks/abc199_a)
この問題は標準入力を正しく受けとり、標準出力を正しく行えればACが出ます。
以下は自分が書いたコードになります。
```python:abc_199_a.py
A, B, C = map(int, input().split())

if A**2 + B**2 < C**2:
    print('Yes')
else:
    print('No')
```
### B問題
[B問題の公式解説のリンクはこちら]()
```python:abc_312.py

```
### C問題
[C問題の公式解説のリンクはこちら]()
```python:abc_312.py

```
ABC191 解説

# ABC191 解説
## この記事は何
この記事は復習としてABC191を解説したものになります。
## 問題の解説
[問題のリンクはこちら](https://atcoder.jp/contests/abc191/tasks/abc191_b)
### A問題
[A問題の公式解説のリンクはこちら]()
```python:abc_312.py

```
### B問題
[B問題の公式解説のリンクはこちら](https://atcoder.jp/contests/abc191/editorial/613)
以下は自分が書いたコードになります。いわゆる「__やるだけ問題__」でしょう。
```python:abc_191_b.py
N, X = map(int, input().split())
A = list(map(int, input().split()))

ans = []

for i in range(N):
    if A[i] != X:
        ans.append(A[i])

print(*ans)
```
ちなみに下記のようにリスト内包表記を使えば元のリストを書き換える(正確に言えば、別のオブジェクトとして代入する)ことができ、コードも短くなります。
```python
N, X = map(int, input().split())
A = list(map(int, input().split()))

A = [i for i in A if i != X]

print(*A)
```
### C問題
[C問題の公式解説のリンクはこちら]()
```python:abc_312.py

```
VueUseとは？

VueUse は、Vue.js アプリケーションのためのカスタムコンポジション関数のコレクションを提供するライブラリです。カスタムコンポジションは、Vue 3 の Composition API を使用して、コンポーネントのロジックをより効果的に組み立てるための方法です。VueUse は、様々なタスクや機能に特化したカスタムコンポジションを提供し、開発者がこれらの機能を簡単に利用できるようにすることを目的としています。

VueUse の特徴や機能には以下のようなものがあります：

1. **カスタムコンポジション**: VueUse は、リファクタリングやコードの再利用を容易にするためのカスタムコンポジション関数を提供します。これにより、コンポーネントのロジックをより小さな部分に分割して、再利用しやすくなります。
2. **機能ごとのカスタムフック**: VueUse は、様々な機能やタスクに関連するカスタムフックを提供します。例えば、`useLocalStorage` はローカルストレージを操作するためのカスタムフックです。他にも、`useMouse`、`useClipboard`、`useEventListener` などがあります。
3. **タイプセーフ**: VueUse は TypeScript と統合されており、タイプセーフなコードを書くことができます。カスタムコンポジションが提供する機能に関する型情報が適切に提供されます。
4. **コミュニティによる貢献**: VueUse はオープンソースプロジェクトであり、コミュニティからの貢献によって成り立っています。多くの開発者がカスタムコンポジションを提案したり、貢献したりしています。

VueUse を使用することで、Vue 3 アプリケーションの開発プロセスが効率的になり、より洗練されたコードを書くことができるようになります。
Appstore ConnectのTestFlightで新規アプリ利用可能なビルドなし

新規アプリをTestFlightを使用して配信しようとしたら、

利用可能なビルドなし

といわれ、テスターグループに配信できませんでした

## 解決策

アプリ->アプリ情報

必要な情報を順次入力していけば大丈夫です。
ABC313 - A - To Be Saikyo 自己解法

# 問題

https://atcoder.jp/contests/abc313/tasks/abc313_a

# 考察
人$1$が最強になるためには、あといくつプログラミング力を上げる必要があるか求めてくださいという問題です。最強になるためには、人$1$以外全員のプログラミング力を上回っている必要があります。つまり人$1$が最強に最低限必要なプログラミング力は、
$$(人1以外全員のプログラミング力の中の最大値) + 1$$
ということになります。上記の値を求め、人$1$が持つプログラミング力との差を求めればあといくつ必要化を求めることができます。
もし、$(人1以外全員のプログラミング力の中の最大値) + 1 - (人1のプログラミング力)$が負の数になれば、それは既に人$1$が最強です。これ以上プログラミング力は必要ないため、そのときは$0$を出力すればOKです。

# 提出コード(コンテスト後)

https://atcoder.jp/contests/abc313/submissions/44442804

ご不明点などがあれば教えていただけると幸いです。
javascriptにおけるesbuildとは？

esbuild（エスビルド）は、高速なビルドツールであり、JavaScript および TypeScript のコードを効率的にバンドルおよびトランスパイルするためのツールです。esbuild は Go 言語で開発され、非常に高速でパフォーマンスが優れています。主に以下の特徴があります

‌

1. **高速なビルド速度**: esbuild はコンパイルやバンドルが非常に高速であり、一般的に他のビルドツールよりも迅速にビルドを完了できます。
2. **バンドルとトランスパイル**: esbuild はモジュールのバンドルとトランスパイルの両方を処理します。モダンなモジュール構文を使用するプロジェクトでも、古いブラウザ向けにトランスパイルする際に便利です。
3. **プラグインエコシステム**: esbuild はプラグインをサポートしており、ユーザーがカスタムのビルド処理やトランスパイルを追加できます。
4. **ES6 モジュールネイティブサポート**: esbuild は ES6 モジュール構文をネイティブにサポートしており、モジュールの非同期読み込みを効率的に行えます。
Amazon Kinesis Data StreamsとAmazon Kinesis Data Firehoseの違い

⚫︎Kinesis Data Streams（データ処理できる）
→Amazon Kinesis Data Streamsは、サーバーレスストリーミングデータサービスであり、あらゆる規模のデータストリームを簡単にキャプチャ、処理、保存することを可能にする。

・"リアルタイム"にクリックストリームデータなどの高頻度のイベントデータ用のアプリケーションを構築し、数日ではなく数秒でインサイトにアクセスできるようにする。
この場合、AWS Lambda、Amazon Kinesis Data Analyticsを使用する。

・アプリケーションとサービスのログ、クリックストリームデータ、センサーデータ、およびアプリケーション内のユーザーイベントから、一日あたり数テラバイトのデータを取り込んで収集し、ライブダッシュボードを強化し、メトリクス（※1）を生成し、データレイク（※2）にデータを配信する。

・AWS　Lambdaとすばやくペアリングして、環境内のイベント駆動型アプリケーション内で急に発生する事象に、あらゆる規模で対応または調整する。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
※1 メトリクス：メトリクス（メトリック）とは、定期的にシステムのヘルス情報やパフォーマンス情報を取得し、測定値をグループ化したもの。 たとえば、CPU使用率、メモリ使用率、ディスク使用率、Data I/O、アクセス数などがこれにあたる。
※2 データレイク：データレイクとは情報の湖のこと。
スマホアプリ、IoT デバイス、Web サイト、SNS など、さまざまソースから収集したローデータ（生のデータ）を、非構造化データか構造化データかを問わず、まとめて入れておことができます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

⚫︎Kinsis Data Firehose（データ処理できない）
→Amazon Kinesis Data Firehoseは、ストリーミングデータを確実にキャプチャおよび変換し、データレイク、データストア、および分析サービスに配信する、抽出、変換、ロード（ETL）サービス。

・データをAmazon S3にストリーミングし、分析に必要な形式にデータを変換する。処理パイプラインを構築する必要はない。

・サポートされているSecurity Information and Event Management（※1 SIEM)ツールを使用して、ネットワークセキュリティをリアルタイムでモニタリングし、潜在的な脅威が発生したときにアラートを作成する。

・機械学習（ML）モデルを使用して、データストリームを強化し、データを分析して、ストリームが送信先に移動する際に推論エンドポイントを予測する。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
※1　SIEMとは、ファイアウォールやIDS／IPS、プロキシーなどから出力されるログやデータを一元的に集約し、それらのデータを組み合わせて相関分析を行うことで、ネットワークの監視やサイバー攻撃やマルウェア感染などのインシデントを検知することを目的とした仕組み。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
networkXで格子状のネットワークを描く

# メモ目的
普段グラフ作成にmatplotlibを使っているますが、ネットワークを可視化するのはやっぱり専用のパッケージがいいので使ってみた機能をメモします。


# networkXで5×5の格子上ネットワークを作成
以下のコードで表示してみると、5×5のノードを持ち、それぞれがつながったグラフが出力されます。ただ、ノードのposを指定していないため、場所は適当になります。
```python
import networkx as nx

G = nx.grid_2d_graph(5, 5)  # 5x5 grid
nx.draw(G)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328308/2dfe2b53-7f46-fa33-9603-f9b341482014.png)

https://networkx.org/documentation/latest/reference/generated/networkx.drawing.nx_pylab.draw.html#draw

ドキュメントよりposは辞書型で、ノードをキーとポジションを値として持つようです。もしなければその都度、spring layout positioning？というものが計算されるそうです。
>pos:dictionary, optional
>A dictionary with nodes as keys and positions as values. If not specified a spring layout positioning will be computed. See networkx.drawing.layout for functions that compute node positions.

正方形にノードが並ぶようにしたいので、posを決めていきます。
まず具体的にxyともに0-10のグラフに配置するとします。

```python
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

fig,ax = plt.subplots()
ax.set_aspect("equal")
ax.set_title("mesh grid (5x5)")
ax.set_xlim(0,10)
ax.set_ylim(0,10)

G = nx.grid_2d_graph(5, 5)  # 5x5 grid
x = np.linspace(0, 10, 5)
y = np.linspace(0, 10, 5)
X, Y = np.meshgrid(x, y)]
pos = {}
for idx,node in enumerate(G.nodes()):
  pos[node] = [X.flatten()[idx],Y.flatten()[idx]]
nx.draw(G,pos,ax)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328308/0c42738a-44c5-68f0-2534-b38c7715d47f.png)
Unityの特定のComponentの特定の値(Color)を一括置換するコマンド

## 概要
Unityでゲームを作っていると「このテキストカラー変えたいな」とか「イメージのグレーアウトもう少し暗くしたいな」というシチュエーションがあります。

カラー値が固有のものだとわかっているのであれば、以下のようなgrep + sedの組み合わせで置換出来ます。
```
git grep -l "m_Color: {r: 0.1, g: 0.1, b: 0.1, a: 1}" | xargs sed -i '' -e 's/m_Color: {r: 0.1, g: 0.1, b: 0.1, a: 1}/m_Color: {r: 0.2, g: 0.2, b: 0.2, a: 1}/g'
```

しかし、たまに #FFFFFF のような、別のComponentでも使っているカラーを変えたい時があります。
この場合はgrep + sedのコマンドだけでは巻き込んで置換してしまいます。

その場合は置換したいComponentのguidを置換対象にすることで、巻き込まないように置換することが出来ます。
以下は個人用のメモ。

## コマンド

```
# 置換対象のテキストを含むファイルのリストを取得
git grep -l "m_Script: {fileID: 11500000, guid: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, type: 3}" > file_list.txt
```

```
# 置換される文字列
cat <<EOF > original_text.txt
  m_Script: {fileID: 11500000, guid: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, type: 3}
  m_Name: 
  m_EditorClassIdentifier: 
  m_Material: {fileID: 0}
  m_Color: {r: 1, g: 1, b: 1, a: 1}
EOF
```

```
# 置換する文字列
cat <<EOF > replaced_text.txt
  m_Script: {fileID: 11500000, guid: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, type: 3}
  m_Name: 
  m_EditorClassIdentifier: 
  m_Material: {fileID: 0}
  m_Color: {r: 0.9, g: 0.9, b: 0.9, a: 1}
EOF
```

```
# 置換
while IFS= read -r file; do
    perl -i -p0e "s#$(cat original_text.txt)#$(cat replaced_text.txt)#g" "$file"
done < file_list.txt
```

## メモ
- 本当はワンライナーでやりたいが複数行の対応をするのがめんどくさそうなので綺麗にわけた
- 置換したいComponentを指定するためにguidを利用する
- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXは自分が置換したいComponentのguid
    - 多分Graphicを継承しているものであればこのレイアウトで行ける
- guidがわからなかったら、適当にカラー変えて保存した後、gitかなにかでdiffを取ってきたらこの近辺の行が取れる
- 多分ColorだけじゃなくてMaterialやSprite、Mesh、Fontも行ける
- perl部分はperlじゃなくてpythonとかでも出来そう
Gitのrebaseを活用してコミットを整理・まとめる方法

開発を進めていると、バグの修正や小さな変更を繰り返すうちにコミットの数が増えてしまいます。これにより、プルリクエストの履歴が読みづらくなってしまうことがあります。そこで、この記事では、**`git rebase`** コマンドを使ってコミットを意味のある単位で整理・まとめる方法を紹介します。

### **注意:**

rebaseはコミットの履歴を変更する操作です。共同で作業しているブランチでこの操作を行うと、混乱が生じる可能性があります。したがって、この操作は自分だけのブランチや、チームメンバーとの確認の上で行ってください。


1. 対象のブランチ（今いるブランチ）で対話型のrebaseを開始
```bash
git rebase -i HEAD~3
```

HEAD~3というのは、HEADから3つ目のコミットまで編集対象にするという意味。

1. テキストエディタで編集

```bash
pick ff5b300 add sample1
pick 0ca0ac8 fix typo
pick 1d1a084 add sample2
```

上から古い順番にコミットが並んでいます。
基本的に一つ古いコミットにまとめることになる。
つまり、下記の場合は、

```bash
pick ff5b300 add sample1
squash 0ca0ac8 fix typo
pick 1d1a084 add sample2
```

`ff5b300`に`0ca0ac8`をまとめるということ。

1. コミットメッセージの編集

```bash
# This is the 1st commit message:

add sample1

# This is the commit message #2:

fix typo
```

好きな方を残せばいいです。必要ない方は削除またはコメントアウトします。

1. **`git log --oneline` や `git log` で確認**

```bash
9524e62 (HEAD -> gattai) add sample2
d353f75 add sample1
```

### **強制プッシュと`-force-with-lease`オプション**

```bash
git push origin main --force-with-lease
```

**`--force-with-lease`**オプションは、他の人が間に合間に新しいコミットをプッシュしていないか確認する安全な方法で強制プッシュを行います。

- `-force-with-lease`は安全に強制プッシュを行うためのオプションです。このオプションは、他の人が新しいコミットをプッシュしていないかを確認し、変更を上書きする際の安全策として使用されます。

具体的には:

- 他の人が新しいコミットをプッシュしていない場合、強制プッシュが正常に動作します。
- 新しいコミットがプッシュされていた場合、`-force-with-lease`オプションはプッシュを中断し、エラーメッセージを表示します。
【サービス復活】年25,000円でACM会員になればO'Reilly本が読み放題になる！！

昨年、惜しまれつつサポートが終了したACM会員特典のO'Reilly Online Learningの読み放題サブスクが復活しました！
年間 ＄174 と以前よりはコストが掛かってしまうものの、それでも通常のサブスクよりも圧倒的に安いです(通常は年間$499です)

# O'Reilly Online Learning(旧Safari Books)とは
O'Reilly出版の本やビデオ教材などが使い放題となるサービスです。英語の本が主ですが、最近は日本語の本もかなり充実していて、2023年8月11日現在は231冊の日本語の本が読み放題対象となっています。

人気の本ランキングではみなさんも見聞きしたことある本が上位に来ているかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707111/027be2f7-bee6-2e49-3fe8-3a380f01886b.png)

新作本の一覧では今年の6月に発売された本などもラインナップに並んでいることがわかります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707111/951a345d-37bc-ac0c-a181-aab6a918a878.png)

日本語本のラインナップはこちらから確認することができましたのでこちらを検討材料にお使いください。
https://www.oreilly.com/search/?q=*&type=*&rows=10&publishers=O%27Reilly%20Japan%2C%20Inc.&order_by=_oreilly_popularity

ちなみに英語の本は現在47,000冊存在していて、一生あっても読み切れないレベルになっています。


O'Reilly Online LearningはPCだけでなくスマホアプリを使って気軽に本を読むことができ、スキマ時間も有効に学習することができます
ちなみに、スマホアプリの使い心地はKindleやKoboとは段違いです。(おそらく)すべての書籍が連続スクロールに対応していて、ネットのコンテンツを読む感覚で本を読むことができます。もちろんハイライト機能などもありますのであとから重要なフレーズを見返すこともできます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707111/959aea4f-fa8d-da70-c948-d7ba1b1b1784.png)


# 登録方法
https://services.acm.org/public/qj/profqj/qjprof_control.cfm?promo=PWEBTOP&form_type=Professional
こちらから登録が可能です。住所などの登録が必要ですが、日本語入力は禁止ですので頑張って英語で記入してください。

ACM Professional Membershipの登録(年 ＄99 )の際に、ACM Skills Bundle Add-On(＄75)をオプションで付けることで**O'Reilly Online Learning**、 eラーニングの**Skillsoft Percipio**、 IT技術学習プラットフォームの**Pluralsight**の3つの学習コンテンツのサブスクを追加することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707111/fbd1cecc-c828-8948-5671-30f17e2c22f6.png)

ACM会員になるともちろんACM側の特典である学会誌や一部論文へのアクセスも可能となります。

# (登録後） 日本語の本の検索方法
デフォルトでは日本語の本は検索に引っかからない状態となっています。設定からJapaneseにチェックを入れると検索に引っかかるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707111/79642ce9-f73b-e112-1438-2739d245c9e7.png)
読み放題サービスはテキストベースで表示できますので英語の本でも翻訳機能を使って読むことも可能です。英語もチェックを入れておくとよいかと思います。


# さいごに
お金を惜しまずに技術力をどんどんアップさせましょう！ おまけでChatGPTのお言葉も載せておきます
> 技術の世界では、投資が知識とスキルの質を決定する要因の一つとなります。特に今の時代は技術の進化が急速で、その変化に追従するためには継続的な学びと投資が不可欠です。お金を惜しむことで得られる短期的な節約は、長期的には自身の技術力の停滞や市場での競争力喪失を招くリスクとなり得ます。
> 高品質の書籍、先進的なオンラインコース、専門家によるセミナーやワークショップへの参加は、技術者の成長を促進し、新しい技術や知識を迅速に習得するための鍵となります。これらのリソースや経験は、初期の投資が必要かもしれませんが、結果として得られるスキルアップやキャリアの拡大はその価値を大きく上回ることが多いです。
> 加えて、技術の世界では単に知識を増やすだけでなく、それを実際に活用する実践的な経験が価値を持ちます。最新のツールや技術を手に入れ、それを活用して実際のプロジェクトや研究に取り組むことで、深い理解と高度なスキルを習得することができます。
> 最後に、自身の成長とキャリアを真剣に考え、技術のフロンティアを追求する者として、資金的な投資を惜しまず、情熱と好奇心を持って学び続けることを強くおすすめします。未来は、学び続けることの価値を理解し、それを行動に移す人々によって築かれるでしょう。
"Gitで効率的に最新の変更を取り込む: rebaseを活用したシンプルな手順"

# Gitで効率的に最新の変更を取り込む: `rebase`を活用したシンプルな手順


作業をしている間にリモートブランチに新しい変更が加えられることはよくあります。
これらの変更をローカルに取り込む際に、今まで私はブランチをチェックアウトし、そこで最新の変更を`pull`して、再度作業ブランチに戻ってそのブランチの内容をマージする、という手順を踏んでいました。
Gitに少し慣れてきて、直接作業ブランチで`rebase`を利用して最新を取り込む方法を知ったので記事にすることにしました。


### 手順

1. **最新の情報を取得する**
    
    まず、リモートから最新の情報を取得します。
    
    ```
    git fetch --prune
    ```
    
    - `-prune`オプションを使うと、リモートで削除されたブランチの参照もローカルから削除されます。
2. **作業ブランチで直接リモートの変更を取り込む**
    
    作業ブランチ（例: `feature01`）にいる状態で、別のブランチ（例: `feature02`）の最新の変更を取り込みます。
    
    ```
    git rebase origin/feature02
    ```
    

### なぜこの方法が効果的なのか

- **不要なブランチへの切り替えがない**：`feature02`のような中間ブランチにチェックアウトする必要がないため、手順が削減されます。
- **履歴が綺麗**：`rebase`を使用することで、ブランチの履歴が直線的になります。
- **リモートブランチの最新情報のみを利用**：最新の変更を効率的に取り込むことができるため、ブランチ間のネットワークについて考慮する必要がありません。
JAVA応用（模写）

# JAVA応用
教科書Sample模写（備忘録）

~~~java
import java.util.Calendar;

public class CalenderSample1 {

	public static void main(String[] args) {
	Calendar cal = Calendar.getInstance();
	int year = cal.get(Calendar.YEAR);
	int month = cal.get(Calendar.MONTH)+1;
	int day = cal.get(Calendar.DAY_OF_MONTH);
	System.out.println("今日は"+year+"年"+month+"月"+day+"日です。");
	}

}
~~~

今日の気づき: cal.get(Calendar.MONTH)+1;はなぜ＋1するのか

今日の学び:      JAVAは０から始まるため＋1を行うことで1～数えられるようになる
Git Cloneできなくなった

# Git Clone時のエラー
久しぶりにgithubを使った際、git cloenすると以下のようなエラーが発生した。
```bash
Cloning into 'OpenVPN'...
Username for 'https://github.com': xxxxxx
Password for 'https://XXXXXX@github.com':
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/XXXXXX/OpenVPN.git/'
```

# 解決方法
## GitHub上でトークンを新しく作成
・GitHubにアクセス
・Settingを開く
・Developer settingsを開く
・Personal access tokensを開く
・トークンを新しく作成する
　Generate new tokenをクリック
・わかりやすい名前を付ける(Noteに入力)
・Scopesを指定する
　repoとadmin:repo_hookとdelete_repoにチェックを入れる
・トークン作成
  Generate tokenをクリック
　作成されたトークンはどこかに保存しておく
## git clone
```bash
git clone XXXXXX
```
username:ユーザーネームを入力
password:先ほど作成したトークンを入力

以上でgitcloneできるようになる。

## 参考
[【Git】2021年8月13日からGitでリモートにアクセスができなくなった。](https://ios-docs.dev/20210813support-for-password/)
JavascriptにおけるESモジュールとは？

ES モジュールの主な特徴と概念は以下の通りです

‌

1. **エクスポートとインポート**: モジュール内のコードは、エクスポートとインポートのステートメントを使用して、他のモジュールとデータや機能を共有します。エクスポートするものは、関数、変数、クラス、オブジェクト、その他の値などがあります。
   ```javascript
   // モジュールのエクスポート
   export const myFunction = () => { ... };
   export const myVariable = 42;

   // モジュールのインポート
   import { myFunction, myVariable } from './myModule';

   ```
   ‌
2. **ファイルごとのスコープ**: モジュールごとに独立したスコープがあります。エクスポートされた要素は、そのモジュール内で定義された変数としてのみ存在し、グローバルスコープを汚染しません。
3. **非同期読み込み**: モジュールは非同期的に読み込まれ、必要に応じてダウンロードされます。これにより、アプリケーションの初期ロードを最適化することができます。
4. **静的な解決**: インポートされるモジュールのパスは静的に解決され、依存関係のグラフが構築されます。これにより、依存関係が一貫して管理されます。

ES モジュールは、モダンな JavaScript アプリケーションでコードを構造化し、モジュール間の依存関係を管理するために非常に強力なツールです。これは、Vite や Nuxt 3 などのツールが採用する理由の一部でもあります。
PF作成：１０日目

10日目。今日から新しいチームメンバーになった。誰も話したことない方たちばかりなので仲良くできるか不安だけど、仲良くできればいいな。

## 進捗
- 全体のレイアウトの完成
- 寺社詳細、一覧ページ作成と部分テンプレート作成（管理者、ユーザー両方）


## 学習
- background-colorを透明化しようとしてopacity: 0.8; /*全体を透明化*/をヘッダーに入れたが、透明化できなかった。理由としては単純で記述する場所を間違えていた。<br>ヘッダーの部分テンプレートを囲むdivタグに記述していたが、実際はヘッダータグに記述しなければならなかった。
- ブートストラップバージョン４ではテーブルの幅を変更できない。CSSをしようしなければならない。<br>(参考資料：https://qumeru.com/magazine/563)
- 管理者やユーザーが存在しても全く同じビューを見るのであれば部分テンプレートは使用可能。その時は部分テンプレートの保存フォルダはlayoutsが一般的。ただしパスが指定されている場合はif文などを使用してどっち側なのか判断しなければならない。<br>ド忘れしていたが、link_toなどで使用するパスはビューへ渡しているのではなくコントローラーに渡している。なのでビューは同じでもコントローラーは分けなければいけないのでif文が必要となる。
- 寺社の投稿画像が一枚計算で考えていたが、よくよく考えると複数画像が必要なのでは？と思った。現状は技術面が足りないので使用しないがES3という仕組みを使い、画像をES3へ保存する。アプリケーションの方では画像テーブルのようなものを作成してURLとして保存するやり方が画像を複数保存する一般的なやり方らしい。<br>テーブルを後からつけるのは難しいことではないので拡張性的な面から考えても後から出来そう。
- enumの日本語化がうまく出来ていないのとdeviseの方で日本語化できないエラーが発生する。


## エラー
- 部分テンプレートの呼び出しでテンプレートエラーが発生した。なので誤字脱字、パスの確認、呼び出し方の記述が間違っていないかなど確認したが間違っていなかったのでわからなかった。<br>結果、何が悪かったのかというとファイル名が名前の後に.html.erbとするがそこで_html.erbとしてしまっていた。そこは盲点だった。よくする間違いの一つらしいあとhtmlがhtmiになってたりすることもよくあることらしい。


## ヒント
- フォントをDLしてアプリケーションに入れた場合、それだけだと自分でしか反映されないらしい。みんなに反映させるには特別なやり方をやらなければいけないらしい。参考資料をオススメされたので時間がある時に学習してみよう。<br>（参考資料：https://dekiru.net/article/13117/)


## 明日の予定
明日はメンターさんに質問できない日なので、学習を進めるよりも色々片付けないといけないことからやっていこうと思う。主にキャリアアドバイザーについてのこと。
【VSCode】TODOコメントをツリー表示する方法


## 拡張機能をインストールする

TODOコメントを一覧表示するために「Todo Tree」をインストールします。

https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree&ssr=false#overview

インストールすると以下のように「Todo Tree」のアイコンが表示され、クリックするとTODOの一覧が表示されます。

![スクリーンショット 2023-06-04 18.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/b830ce44-e049-176b-7230-299c07918746.png)

## TODOとして認識されるタグを設定する

TODOとして認識されるタグはデフォルトで次のようになっています。

```json:settings.json
{
  "todo-tree.general.tags": [
    "BUG",
    "HACK",
    "FIXME",
    "TODO",
    "XXX",
    "[ ]",
    "[x]",
  ]
}
```

この`"todo-tree.general.tags"`の項目を変更することでTODOとして認識されるタグを設定できます。

## アイコンやハイライトを変更する

ツリーに表示されるアイコンやエディターでのハイライトを変更するには次の設定を変更します。

```json:settings.json
  "todo-tree.highlights.customHighlight": {
    "BUG": {
      "icon": "bug"
    },
    "HACK": {
      "icon": "tools"
    },
    "FIXME": {
      "icon": "flame"
    },
    "XXX": {
      "icon": "x"
    },
    "[ ]": {
      "icon": "issue-draft"
    },
    "[x]": {
      "icon": "issue-closed"
    }
  }
```

`"todo-tree.highlights.customHighlight"`では次の設定ができます。

`foreground` - エディターのハイライトおよびルーラーのマーカーの前景色を設定する。

`background` - エディターでハイライトの背景色を設定する。

`opacity` - 背景色の透明度を設定するパーセント値。

`fontWeight`、`fontStyle`、`textDecoration` - 標準の CSS 値でハイライトのスタイルを設定する。

`borderRadius` - ハイライトの背景の境界線の半径を設定する。

`icon` - ツリービューに別のアイコンを設定する。アイコンは以下のいずれかから選択。codiconから選択する場合には「$(*icon*)」で指定。

https://octicons.github.com

https://microsoft.github.io/vscode-codicons/dist/codicon.html

`iconColour` - ツリー内のアイコンの色を設定する。指定しない場合は、前景色または背景色が使用される。色は前景色と背景色ごとに指定可能。

`gutterIcon` - エディターのガターにアイコンを表示するには「true」に設定する。

`rulerColour` - 概要ルーラーのマーカーの色を設定する。指定しない場合は、デフォルトで前景色が使用される。色は前景色と背景色ごとに指定可能。

`rulerOpacity` - ルーラーマーカーの不透明度を設定する。

`rulerLane` - オーバービュールーラーのマーカーのレーンを設定する。指定しない場合は、デフォルトで「right」が設定される。「left」、「center」、「right」、「full」のいずれかを設定可能。「none」を使用してルーラー マーカーを無効にすることも可能。

`type` - エディター内でどの部分を強調表示するか設定する。有効な値は次のとおり。
- `tag` - タグのみを強調表示
- `text` - タグとタグの後のテキストを強調表示
- `tag-and-comment` - コメント文字 (または一致の開始部分) とタグを強調表示
- `tag-and-subTag` - 上記と同様だが、サブタグもハイライト可能 (カスタムハイライトで定義された色を使用)
- `text-and-comment` - コメント文字 (または一致の開始部分)、タグ、およびタグの後のテキストを強調表示
- `line` - タグを含む行全体を強調表示
- `whole-line` - タグを含む行全体をエディターの全幅まで強調表示
- `capture-groups:n,m...` - 正規表現からのキャプチャグループを強調表示。「n」は正規表現へのインデックス
- `none` - 文書内の強調表示を無効にする

`hideFromTree` - ツリーからタグを非表示にする。ファイル内ではハイライト表示される。

`hideFromStatusBar` - タグがステータスバーのカウントに含まれないようにする。

`hideFromActivityBar` - タグがアクティビティバーのバッジ数に含まれないようにする。

`"todo-tree.highlights.customHighlight"`で設定されていないタグは`"todo-tree.highlights.defaultHighlight"`の設定が適用されます。

## 隠しファイルを対象に含める

デフォルトでは隠しファイルは検索の対象外となっています。
隠しファイルを検索対象に含めるには次のように設定を変更します。

```json:settings.json
{
  "todo-tree.filtering.includeHiddenFiles": true
}
```
【Java・学習ログ④】配列について


## ■配列について
同一種類の複数データを並び順で格納するデータ構造のこと。

＊要素
　変数のように型を持ち、１つのデータを格納できる。
　各要素には0からの番号が付いており、これを**添え字**という。

#### ①基本の書き方
<１>配列変数の宣言
<２>要素の作成・代入
![スクリーンショット 2023-08-05 114147.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/d45163ec-d327-2631-d782-bb3901186316.png)
【実行】
![スクリーンショット 2023-08-05 114448.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/22179a81-d259-807c-3e1e-a6f84d3b8eb9.png)
＊配列における初期化
　変数の値を取り出すときは必ず代入をして初期化しなければならないが、配列における初期化は特定の値で初期化される。intやdoubleなど数値の型は「0」、boolean型は「false」。

＊「scores.length」
 要素をいくつ作ったかプログラム内で調べたいときに使う値。
#### ②省略の書き方
![スクリーンショット 2023-08-05 120039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/fc07854e-d669-fc16-71a2-213da4d4b826.png)
【実行】
![スクリーンショット 2023-08-05 120411.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/d7de9b0b-ae1e-876a-5b5a-a0cf9851ab86.png)

#### 従来のfor文を使った書き方
配列の添え字には「scores[i]」のように変数を指定することが可能。

・パターン１　「ループによる全要素の利用」
　全要素に順にアクセスする。
![スクリーンショット 2023-08-05 122157.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/0ec65b23-8b08-f8f1-6509-a0d51178a044.png)

・パターン２　「ループによる集計」
　②のコード改良版。合計を表す変数sumに「0」を代入し初期化。その後for文で１要素ごとに加算していく。if文ネストでカウントする条件を加えることもできる。
![スクリーンショット 2023-08-05 123636.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/73533d9e-40b4-5593-f469-1c1387c97262.png)

・パターン３　「添え字に対応した情報の利用」
![スクリーンショット 2023-08-05 130337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/7209f9d7-a5e1-e9cc-8d98-63445c07c9f1.png)

## 拡張のfor文を使った書き方
ループや添え字の記述を省略し、任意の変数に要素の内容を格納する方法。
![スクリーンショット 2023-08-05 131244.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/902a51f3-ad40-2b57-2783-401446f6b22d.png)

#### 仕組み
配列作成時にコンピューター内で何が起こっているか。ざっと読み飛ばしたので、うまく咀嚼できていないかもしれません。

≪例文≫　int[] sores = new int[5];

①new 演算子によりメモリ内区画を5番地分差し押さえ
②メモリ上に変数scoresのint型（箱）を作成
③scoresに差し押さえした番地情報が代入される
④scores=番地情報となり、これを[参照型変数]と呼ぶ。
⑤「scores[i]」と指定すると、scoresから街頭の番地を取り出せる。

※ブロック内でその役割を失う配列変数とは違い、初めに区画を差し押さえしたnew演算子は適切な処理を行わないとメモリ内に永久的に残ってしまう。

しかし、Javaには**ガベージコレクション**というしくみが常に動作しており、どの変数からも参照されなくなたメモリ領域を自動的に探して処理をしてくれる。

＊「null」
　参照型変数に代入できる値。これにより配列の参照をしなくなる。
![スクリーンショット 2023-08-05 142009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/01050635-404b-32e8-7897-8f0dcd2d012d.png)
上記の例では、「null」で参照を切ったにも関わらず、直後に参照型変数を用いているため、実行結果がエラー（例外）に。切らなければ表示結果は10なる。

## ■多次元配列
上部のコードはすべて<font color =red>[行]</font>を示した１次元配列だが、これに縦の並び<font color =blue>[列]</font>を加えると**２次元配列**になる。
![スクリーンショット 2023-08-10 230951.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/4edb0486-3acf-1076-a498-600bd50bf559.png)
【実行】
![スクリーンショット 2023-08-10 234849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/3608ff10-70de-cf73-a8ea-26f7d80e52e7.png)

（↑いい例が思いつかなさ過ぎました…活用方法間違ってる自信しかない！！）

以上、雑備忘録でした。
今週サボりすぎているのでお盆駆け抜ける宣言を発動します。。
【Terraform】「Error configuring Terraform AWS Provider: failed to get shared config profile」のエラーの対処法

TerraformCloudで、terraform planすると、ただprovider.awsに指定していたprofileをコメントアウトしたら普通に動きました。そんだけか。。

```terraform:main.tf
provider "aws" {
  #profile = "my-profile"  # terraform cloudではprofileを指定するとエラー
  region  = "ap-northeast-1"
}

terraform {
  cloud {
    organization = "MyOrganization"
    workspaces {
      name = "MyWorkspace"
    }
  }
}
```

# 参考

- https://discuss.hashicorp.com/t/error-configuring-terraform-aws-provider-failed-to-get-shared-config-profile/45500/1
Firebase Deploy がうまくいかない時には npm run build エラー見て

`firebase init` などで firebase のセットアップはすでに完了しているとする。

`firebase deploy --only hosting`

実行時、デプロイが最後までいかない原因は大抵 `npm run build` が失敗していることが原因にある。
例えば、src ディレクトリ下の動的ファイル群を dist ディレクトリ下に静的ファイルとしてコンパイルされた js ファイル群を削除することで解決することが多い（エラー内容が以下なら、`src/layouts/dashboard/mobile-nav/dist` ディレクトリを丸ごと削除してから `firebase deploy` を実行することをお勧めする）。

```src/layouts/dashboard/mobile-nav/dist/index.js
116:19  Error: React Hook "useCssVars" is called in function "exports.MobileNav" that is neither a React function component nor a custom React Hook function. React component names must start with an uppercase letter. React Hook names must start with the word "use".  react-hooks/rules-of-hooks```
【Flutter】Listを操るメソッド3選

未経験にとって、List自体は理解していても、そのListを表示させるために操ろうとすると結構詰まりません？？
そこで、1年間Flutterの開発をしてきて、「このメソッド知ってたらなんとなく行けるだろ」ってメソッドを3つ紹介します！

# 1\.`map`
Iterableを返却してくれます。 ← Iterableってなんやねん。ってなりますよね最初は。

簡単にいうと、forEach文と同じ動きをしてくれていると思ってください。
mapの処理を通ることで、Listのひとつ分の要素を返却する処理を繰り返してくれます。

`list.map((e) => e)`にあたるところで、listひとつ分の要素が「e」に入り、
それをTextWidgetで利用することで表示しています。


```dart
Widget build(BuildContext context) {
    final List<String> list = ['apple', 'orange', 'greape'];

    return Scaffold(
      appBar: AppBar(
        title: const Text('サンプル'),
      ),
      body: ListView(
        children: [
          ...list.map((e) => Text(e)), //1要素ずつText表示
        ],
      ),
    );
  }

```
表示結果

<img width="300" alt="スクリーンショット 2023-08-10 18.42.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524065/1ae109fe-a7b6-d8a2-4a72-79c6cde29bf9.png">


# 2\.`where`
渡した条件と一致する要素のみを返却してくれます。

`.map()`と同様に、`list.where((element) => 条件)`にあたるところで、
`element`に入ったひとつ分の要素が、その後に渡している条件と一致するものを絞り込んでいます。

最後の、`.toList()`のメソッドを付け足すことで、
条件に一致した要素をリスト化しています。

```dart
Widget build(BuildContext context) {
    final List<String> list = ['山田太郎', '山田花子', '鈴木太郎'];
    final filteredList =
        list.where((element) => element.contains('山田')).toList(); // 「山田」が含まれる文字列を絞り込み

    return Scaffold(
      appBar: AppBar(
        title: const Text('サンプル'),
      ),
      body: ListView(
        children: [
          ...filteredList.map((e) => Text(e)), //絞り込んだリストを1要素ずつText表示
        ],
      ),
    );
  }

```
表示結果

<img width="300" alt="スクリーンショット 2023-08-10 18.51.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524065/60c01ae7-e32c-ada8-d93f-ef0162f311a6.png">


# 3\.`sort`
リストの並べ替えをしてくれます。

自分はcompareToはテンプレートだと思って暗記しています。(苦笑)
a.compareTo(b)とするころで、リストを昇順に並べ替えてくれます。

```dart
Widget build(BuildContext context) {
    final List<int> list = [1, 3, 5, 2, 4];
    list.sort((a, b) => a.compareTo(b)); //リストを昇順で並べ替え

    return Scaffold(
      appBar: AppBar(
        title: const Text('サンプル'),
      ),
      body: ListView(
        children: [
          ...list.map((e) => Text(e.toString())),  //並べ替えたリストを1要素ずつText表示
        ],
      ),
    );
  }
```
表示結果

<img width="300" alt="スクリーンショット 2023-08-10 21.50.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524065/ab39aec8-b1e0-8aba-315d-9ca6395e57a6.png">

:::note info
sortは文字数やDateTime等でも並べ替えることができます。
:::

## 終わり
今回紹介したのはListを操るメソッドの氷山の一角にしか過ぎませんが、
多分これさえマスターできれば、これよりも単純で簡単なメソッドは容易に理解ができるのではないかと思っています。

以上、このメソッド使って感動したなんて話があったらコメントください！
Comporserについて

# 引用サイト
以下サイトから引用させていただいております。
https://www.engilaboo.com/about-composer/

# Composerとは？
PHPを用いたアプリ開発に必要なライブラリやパッケージをまとめて管理・インストールすることができる。

Composer（パッケージ管理ツール）を使わない場合、必要なパッケージを全て手作業で一つずつインストールする必要がある。

一方でComposerを使うことでコマンド一発で必要なパッケージをすべてインストールすることができます。

# メリット
・パッケージのインストールが楽にできる
・チーム開発でパッケージやパッケージのバージョンを統一できる
・パッケージの依存関係を考えなくていい

# composer.jsonとcomposer.lockの役割・違いについて

Composerの概要を掴んだところで、composer.jsonおよびcomposer.lockについて解説。

Composerがライブラリやパッケージを管理しているファイルがcomposer.jsonやcomposer.lockです。
 
どちらも「アプリ開発に必要なライブラリを管理している」という点では同じですが、若干役割が違います。
 
まず最初に使われるのはcomposer.jsonです。
Composerをインストールし、composer.jsonをアプリのディレクトリに配置して
```
composer install
```
をコマンド実行すると、composer.jsonに書かれた情報を基にパッケージやライブラリがvendorディレクトリ配下にまとめてインストールされます。
 
このとき同時に生成されるのがcomposer.lockファイルです。composer install時に参照したパッケージやパッケージのバージョン情報がcomposer.lockに書き込まれます。

そして二回目以降にcomposer installをしたときは、composer.jsonではなくcomposer.lockを参照します。
つまり、composer.lockがある場合は、composer installをしても、単にcomposer.lockを参照してライブラリをインストールするだけになり、何かパッケージの情報（パッケージの追加とかバージョン情報とか）が書き換わることはないので、混乱しないように注意しましょう。


composer.lockファイルをGit管理してチーム間で共有すればcomposer.lockを手元に落としてきてcomposer installをするだけで、チームでバージョン等を統一した状態で必要なパッケージをアプリにインストールすることができます。
CloudFunctionsでFailed to configure trigger for event-type:providers/cloud.firestore/eventTypes/document.create resource:projects<長いPath>service:firestore.googleapis.com. The Event trigger resource 'projects/<長いPath> is invalid.

Cloud Functionsでトリガーのパスが不適切だと言われました。

そのパスがこちら。

`/public/{version}/users/{uid}/public/{version}/posts/{postId}`

"public"が重複していたのが原因だと思われます。

## 解決策
パスを
`/public/{version}/users/{uid}/posts/{postId}`
に変更。