OmniAICreator/Qiita-1.07M huggingface dataset:
【モデル駆動型アプリ】レコードのドキュメントを添付する方法【Sharepoint連携】

↓何もしない状態だとドキュメントを添付する方法はない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/314f65e7-ff8a-9eb0-199d-e06aa8f54053.png)


前準備
・シェアポイントサイトの作成（要ライセンス）
・モデル駆動型アプリの作成

手順
1.サーバーベースのSharepoint統合の有効化
2.ドキュメント管理設定
3.試しに添付してみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/f06ae5ee-40d9-d0c3-c834-627d0a94b92f.png)

1.サーバーベースのSharepoint統合の有効化
PowerPlatform管理センター＞環境＞対象環境＞設定＞統合＞ドキュメント管理の設定
上記からドキュメント管理の設定画面へ遷移する

「サーバーベースのShrepoint統合の有効化」をクリックし下記画面で「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/ff0c4f2f-cbc5-913d-565a-94b1fdf69a8c.png)

「オンライン」を選択して「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/9d4600d2-bef8-9666-b0bb-f45f4a63b5c1.png)

シェアポイントのサイトURLを設定して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/76447b59-99f8-4347-5437-b52dae30bd7d.png)

検証が完了されたので完了を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/7999a274-f597-9686-4cf2-f15194465314.png)
<img src="blob:chrome-untrusted://media-app/850fa699-1bf8-460f-92ec-c86450ceac50" alt="Screenshot 2022-08-28 16.16.43.png"/>




2.ドキュメント管理設定

ドキュメント管理の一覧に戻って「ドキュメント管理設定」をクリックする
今回は取引先企業テーブルにSPOを入れたいのでチェックを入れる
その下にサイトの指定があるので先程のサイトURLを入力して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/7caa7450-ae38-8821-fad6-864e07f26a24.png)
<img src="blob:chrome-untrusted://media-app/0cfac61b-1f2f-492a-bb9d-6d62fa49b1f1" alt="Screenshot 2022-08-28 16.31.50.png"/>

今回は企業ごとにフォルダを分けたいので項目にチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/d5a334bf-490c-ca68-d38f-4b4f3a3b8db4.png)
<img src="blob:chrome-untrusted://media-app/e027be5e-68eb-4a91-adc6-cf1f859b5130" alt="Screenshot 2022-08-28 16.35.44.png"/>

設定が完了する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/094913be-c7fb-89b0-22cb-bba102b5cf44.png)
<img src="blob:chrome-untrusted://media-app/87e79ab9-53bb-4729-87c6-1dc7cf8e212f" alt="Screenshot 2022-08-28 16.37.15.png"/>


3.試しに添付してみる

手順を完了すると関連タブからドキュメントを選択できるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/bf29631a-fe8d-4650-b5f6-a72e1aba37b9.png)


「場所の追加」ボタンを押して規定のSPOサイトにフォルダを作成します）（自動で作られている場合もある）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/07cd5b85-a812-b39a-3bf3-71c9a3a82259.png)


連携されたので試しにフォームからアップロードしてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/8a6a9702-52e9-9a4a-e93d-602d2ccf5ea1.png)

シェアポ側にも連携されている！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/ab8d76b3-ec27-ddc6-dbbf-d01ad34f0a8e.png)



完



※カスタムテーブルの場合はテーブルのプロパティでドキュメント設定を行ってから上記の手順を行う必要があります
ロケールによって小数点がピリオドかコンマかが変わるので数値⇔文字列変換に注意しよう

ロケールによって数値表現が変わるので注意しようってお話です
特にユーザー端末で実行されるアプリでは、様々なロケールでの動作を考慮する必要があります

日本語や英語では小数点に「.」（ピリオド）を使用するため、これ以外の表現が使われることを意識していない人も多いのではないでしょうか？イタリア、ドイツ、フランス、ロシア語などでは「,」（コンマ）が使われるため、変換時に「.」（ピリオド）が使われることを前提にしていると不具合になってしまう場合があります。

ということで、以下を実行してみましょう。

```kotlin
fun main() {
    Locale.setDefault(Locale.JAPAN)
    println("%.1f".format(1.1))
    println(1.1.toString())
    println("1.1".toDoubleOrNull())
    println("1,1".toDoubleOrNull())
    println(DecimalFormat().parse("1,1").toDouble())

    println()

    Locale.setDefault(Locale.FRANCE)
    println("%.1f".format(1.1))
    println(1.1.toString())
    println("1.1".toDoubleOrNull())
    println("1,1".toDoubleOrNull())
    println(DecimalFormat().parse("1,1").toDouble())
}
```

結果
```
1.1
1.1
1.1
null
11.0

1,1
1.1
1.1
null
1.1
```

`String.format`や`DesimalFormat.parse`を使った場合はロケール設定が反映されるため挙動が変わります。
一方`Double.toString()`や`Double.parseDouble`はロケール設定に影響されず、「.」（ピリオド）が小数点として使われていますね。

表示するために文字列に変換したり、ユーザー入力の値をパースを行う場合は`String.format`や`DesimalFormat.parse`を使うのが良いでしょう。
一方、URLなど外部APIアクセスに使用するための文字列や、内部処理のための、文字列⇔数値変換では`Double.toString()`や`Double.parseDouble`を使用する、`String.format`を使う場合はロケールを明示的に指定する必要があります。

ロケールが小数点に影響するとは意識しておらず、この問題になかなか気づけませんでした。
さすがに全言語環境での確認はできませんが、こういう問題もあると言うことを覚えておきましょう。
JavaScriptで非重複な配列・オブジェクト配列を作るって話

非重複な配列って、たまに必要になりますよね。
しかも、すぐ忘れる。

てなわけで、今回は『プリミティブ配列』と『オブジェクト配列』の場合の２パターンを実装していきます！

:::note warn
プリミティブ配列って言ってみたけど ”数値や文字列の配列” です。
オブジェクト配列って言ってみたけど ”オブジェクトの配列” です。
※意味合ってんのか？😇
:::

## まずは完成系のコード

```js:数値や文字列（プリミティブ）の場合
const data = [ 1, 3, 5, 3, 2, 4, 1, 4 ];

// 非重複の配列を生成
const setObject = new Set(data);
const result = [ ...setObject ];

// 出力：[ 1, 3, 5, 2, 4 ];
console.log(result)
```

```js:オブジェクトの場合
const data = [
  { id: 1, name: 'キリン' },
  { id: 2, name: 'アサヒ' },
  { id: 1, name: 'キリン' },
]

// 非重複のオブジェクト配列を生成
const mapObject = new Map(data.map(item => [item.id, item]))
const result = Array.from(mapObject.values());

// 出力：[ { id: 1, name: 'キリン' }, { { id: 2, name: 'アサヒ' }, } ]
console.log(result)
```

SetやMapには、重複した値を排除してくれる機能があるので、それを使って非重複な配列を作っています！

- プリミティブ配列ならSetオブジェクト
- オブジェクト配列ならMapオブジェクト


## めんどいからlodashで良くね？

lodashは簡単に言うと、 **『たくさんの便利機能を用意しているプラグイン』** です。
もちろん、その中には **『非重複な配列を生成する機能』** も含まれています。

:::note info
プリミティブ配列：uniqメソッドを使えばOK！
オブジェクト配列：uniqByメソッドを使えばOK！
:::

まずは、lodashを読み込むところから！
読み込み方は、**CDN** もしくは **NPM** が使えます。

良く分からないってときは、**CDNを使えばＯＫ** 👌

```html:CDNの場合
<!-- htmlファイルに↓↓を記述 -->
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>
```

```bash:NPMの場合
$ npm install --save lodash
```

読み込んだら次は非重複配列の実装！

```js:プリミティブ配列の場合
const data = [ 1, 3, 5, 3, 2, 4, 1, 4 ];

// 非重複の配列を生成
const result = _.uniq(data)

// 出力：[ 1, 3, 5, 2, 4 ]
console.log(result)
```

```js:オブジェクト配列の場合
const data = [
  { id: 1, name: 'キリン' },
  { id: 2, name: 'アサヒ' },
  { id: 1, name: 'キリン' },
]

// 非重複の配列を生成
const result = _.uniqBy(data, 'id'); // NOTE: 第２引数に重複したくないキー値を指定

// 出力：[ { id: 1, name: 'キリン' }, { { id: 2, name: 'アサヒ' }, } ]
console.log(result)
```

## まとめ

- プリミティブ配列はSetオブジェクトで非重複な配列を作れる
- オブジェクト配列はMapオブジェクトで非重複な配列を作れる
- 結局は lodash を使うのが一番ラク！

他にナニカ良い方法があったら教えてください〜！！
プログラマによる何もしない休息。ぼーっとする訓練。 (よい休息・休息の科学・マインドフルネス・瞑想)


# プログラマは生産性を求める生き物だ

あなたは休みの時間でさえ何もしないのが苦痛ではないだろうか。だからこそ燃え尽きやすいのではないか。

# 人間というのは難儀なものだ。

疲れたら休まなければいけない。エネルギーが枯渇すれば動けない。
必要な休息の量は僕らが思うよりもはるかに大きいのかも知れない。
疲れ知らずの人間もいるだろうが疲れやすい人間もいる。あなたが後者なら何とかしてうまく休む方法を見つけておきたいところだろう。

# 何もしない方法

僕の場合はカフェに行く。そしてPCもスマホも使わずにゆっくりする。
目を閉じて呼吸の数を数えたり、物思いをしたりする。カフェの雰囲気にひたったり、美味しい抹茶のティーラテを味わったりする。
昔は何もしないことが本当に難しいと思ったが、今は何故か出来ている。
なかなか難しい部分もある。だが休息の訓練だと思ってゆっくりしている。

# 何もしないのは訓練だ

何もしないのはただ無為な行為ではない。偉大な休息方法だ。
休息関係の本を読んで休息に関する理解を上書きしておいてはいかがだろうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/58246356-3daa-b708-2dc3-38828773cbe6.png)

# マインドフルネスを活用する

本当に何もせずゆっくりするのは難易度が高い。難しければ呼吸の数を数えたり、呼吸に意識を集中してみてはどうだろうか。
瞑想の訓練経験は休息に役立つと思う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/ac47ad63-e2a0-8264-6ba7-0a63c212ef8d.png)


# 疲労感に惑わされない

ただゆっくりしているとむしろ活動時よりも疲労感を感じることがある。なので休息によってむしろ疲れているという誤解をしてしまうかもしれない。
だがこれは活動によって疲労感がごまかされないがために感じている疲労感かもしれない。
自分の感じ方がどうにせよ、休息は確実に心身を回復させてくれていると信じて休むことが大事だ。

# で、具体的にどうしたら良いの？
「何もしないでゆっくりする」は特に言語化が難しい技術だと思う。環境を整えることは出来るがあとはやってみるしかない。
休日のたびに何度か挑戦してみてほしい。あとは任せた。

# 仕事中毒を避ける

仕事中毒の場合は何もせずにいることが苦痛になると思う。世の中のあらゆる中毒は深くはまりこむほど抜け出すのが難しくなるだろう。
だからそもそも休息を習慣づけておいて仕事中毒に陥らないようにしたい。
休息は疲労回復にもなるけれど仕事中毒の予防にもなる。

# PCを使わない

PCはエネルギー消費度がめちゃくちゃ高い。ものすごい勢いで色々なことが出来てしまう。しっかりと休みたい日は持ち歩くのはやめたい。勇気を出して。家に置いておこう。
もし自宅でゆっくりするにしてもPCを開かないで過ごすか、難しいならタイムロッキングコンテナでも使って封印しておいてはいかがだろうか。

# スマホをタイムロッキングコンテナで封印する

出来るならスマホも使わずにゆっくりしてみてはどうだろうか。だがさすがにスマホを全く持ち歩かない勇気を出すのは難しいだろう。
持ち歩けるタイプでスマホ用のタイムロッキングコンテナをおすすめする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/c0ec2d3f-45f6-7caa-2786-7cc53c3f0711.png)


# 何もしないのではなく「大して何もしない」
> 現代人からすれば、座って壁を見つめる行為へのバートルビーの執着は異様です。自分の心を乱し、苦しめる行為で、安らぎとは正反対です。だからこそ「たいして」何もしないことが大切なのです。
この章では、本当に何もしないことではなく、ほとんど何もしないことがもたらすメリットを紹介します。ここでも、要はバランスの問題です。１００か0かではなくその中間でもなく、限りなく0にそっと寄るのです。私たちにはもっと休息が必要なのですから。
クラウディア・ハモンド. 休息の科学 息苦しい世界で健やかに生きるための10の講義 (Japanese Edition) (p.143). Kindle 版.
# 他の休息方法
ぼーっとすること、何もしないのは難易度が高い休息法だと思う。他の方法もある。

>人気の休息 第10位 マインドフルネス
人気の休息 第9位 テレビ(動画コンテンツ)を見る
人気の休息 第8位 空想にふける
人気の休息 第7位 入浴
人気の休息 第6位 長めの散歩
人気の休息 第5位 特に何もしない
人気の休息 第4位 音楽を聴く
人気の休息 第3位 一人になる
人気の休息 第2位 自然のなかで過ごす
人気の休息 第1位 読書

(「休息の科学 息苦しい世界で健やかに生きるための１０の講義」より)

上のリストではパッシブレストが主だが、楽器を弾く、スポーツをするなどのアクティブレストも候補になるだろう。

読書が人気1位だが個人的にはプログラマにはおすすめしない。何故ならプログラマは日頃から文字情報を目に入れて知的労働をしている。休息まで文字情報で知性を使うのはよろしくないだろう。
なるべく知力を使わない方法。情緒や体のカテゴリでリラックスするのが良いんじゃないだろうか。

<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura

<!-- Update From Qiita API -->
Ubuntuのバージョン確認コマンド

# やり方

端末開いて下記。
```shell:バージョン確認コマンド
cat /etc/issue
```

実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/af8d2ea7-7f89-1cf5-056b-eb122220d487.png)

# LTSとは

**L** ong- **T** erm **S** upport（長期サポート版）のこと。
**TLSじゃないよ！**


# 参考サイトさん

https://www.server-memo.net/ubuntu/ubuntu_version.html

https://e-words.jp/w/LTS.html

# バージョン

Ubuntu 20.04.5 LTS
【SwiftUI】.onAppearと.taskの違い

# はじめに

SwiftUIでは、ある特定のViewが表示された場合に処理を実行させたい場合
`.onAppear`もしくは`.task`を使うのが良さそうだと思いましたが、2つの違いがよく分からなかったので調べてみました。

# 環境
Xcode 13.4.1

# 内容

### [.onAppear](https://developer.apple.com/documentation/swiftui/view/onappear(perform:))

Viewが表示される前に実行するアクションを追加

```swift
func onAppear(perform action: (() -> Void)? = nil) -> some View
```

SwiftUI がこのメソッドを呼び出す正確な瞬間は、適用する特定のビューの種類に依存するが、アクションクロージャーは最初のレンダリングフレームが表示される前に完了する

### [.task](https://developer.apple.com/documentation/swiftui/view/task(priority:_:))

Viewが表示される前に実行する非同期タスクを追加

```swift
func task(
    priority: TaskPriority = .userInitiated,
    _ action: @escaping () async -> Void
) -> some View
```

`.task`でViewのライフタイムと一致する非同期タスクを実行できる。Viewを削除するか、Viewの ID が変更される前にタスクが終了しない場合、SwiftUI はタスクをキャンセルする

非同期呼び出しが完了するのを待つか、AsyncSequenceインスタンスの値で待つために、タスク内でawaitキーワードを使用する

```swift

let url = URL(string: "https://example.com")!
@State private var message = "Loading..."

var body: some View {
    Text(message)
        .task {
            do {
                var receivedLines = [String]()
                for try await line in url.lines {
                    receivedLines.append(line)
                    message = "Received \(receivedLines.count) lines"
                }
            } catch {
                message = "Failed to load"
            }
        }
}

```

#### `.onAppear`と`.task`の違い

`.onAppear`の中には非同期処理が書けない

![スクリーンショット 2022-08-28 11.18.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/d2c37f46-7312-3620-39e2-a415ceecd8df.png)
`※ 非同期関数型 '() async -> Void' から同期関数型 '() -> Void' への変換は無効です。`


ただし`Task`を追加することで`.onAppear`でも非同期処理が使えますが、
`.task`を使った場合は、例えばViewが非表示となった時に実行されている処理が自動的にキャンセルされるようなので、この違いは残るようですね

```swift
        Text(message)
            .onAppear {
                Task {
                    do {
                        var receivedLines = [String]()
                        for try await line in url.lines {
                            receivedLines.append(line)
                            message = "Received \(receivedLines.count) lines"
                        }
                    } catch {
                        message = "Failed to load"
                    }
                }
            }
```

# おわりに

`.task`を使う場合で意図せずタスクがキャンセルされることはあるのだろうか。。。その場合は`.onAppear`+`Task`を使うメリットがあるのかも？🤔（このあたりはまだ理解できていない...）
`Task`についても深堀しようと書きながら調べてみましたが、さらっとまとめられる内容ではなく諦めました。。。

# 参考

https://kumonosu.cloudsquare.jp/program/swift/post-5247/

https://www.yururiwork.net/archives/1991

https://developer.apple.com/documentation/swiftui/view/onappear(perform:)

https://developer.apple.com/documentation/swiftui/view/task(priority:_:)

https://developer.apple.com/documentation/swift/task/

https://developer.apple.com/videos/play/wwdc2021/10132
AtCoder B,C問題をKotlinで解こう - ABC266

当記事ではAtCoder、ABCのB問題ならびにC問題（時々D問題も）のKotlinでの解法を超初心者向けに詳細に解説します。

https://atcoder.jp/contests/abc266/tasks

## [B - Modulo Number](https://atcoder.jp/contests/abc266/tasks/abc266_b)
#### やりたいこと
$n - x = (998244353 の倍数)$ ということは、``` x = n % 998244353 ``` となることが分かる。ただし、nの値はマイナスであることもあるため、``` n % 998244353 ``` がマイナスになる場合もある。
```n % 998244353```を計算し、**結果が0以上である場合はそのまま答えとして出力し、0未満である場合は結果に998244353を加えて出力** しよう。
#### 入力値の取得
```kotlin
    // 入力値の取得
    val n = readLine()!!.toLong()
```

#### サンプルコード
```kotlin:main.kt
fun main(args: Array<String>) {
    // 入力値の取得
    val n = readLine()!!.toLong()

    val target = 998244353

    var ans = n % target

    if (ans < 0) {
        // マイナスであった場合は 998244353 を加える
        ans += target
    }
    println(ans)
}
```
## [C - Convex Quadrilateral](https://atcoder.jp/contests/abc266/tasks/abc266_c)
#### やりたいこと
異なる3点ABCを **時計回りに** 見た場合
![abc266_c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2597866/e8688db2-d5cb-4343-6330-a17ad41ac696.png)
$∠ABC$ が180°以上の場合以下が成立する。
```(A.x-B.x)*(C.y-B.y) - (A.y-B.y)*(C.x-B.x) <= 0```
入力値は反時計回りで与えられるため、入力値を取得後逆順にし、全ての隣接する3点について判定を行おう。
#### 入力値の取得
```kotlin
    // 入力値の取得
    val points = (1..4).map { readLine()!!.split(" ").map { it.toInt() }.let { Point(it[0], it[1]) } }.reversed()
```
#### サンプルコード
```kotlin:main.kt
import java.awt.Point

fun main(args: Array<String>) {
    // 入力値の取得
    val points = (1..4).map { readLine()!!.split(" ").map { it.toInt() }.let { Point(it[0], it[1]) } }.reversed()

    // 全ての隣接する3点について、それが作る角が180°以上になるものが存在するかどうかを判定
    val ans = points.indices.all { !isAngOver180(points[it], points[(it + 1) % 4], points[(it + 2) % 4]) }

    // 答えの出力
    println(if (ans) "Yes" else "No")
}

// 異なる3点の作る角が180°以上になるかどうかを判定
fun isAngOver180(p1: Point, p2: Point, p3: Point): Boolean {
    val fixP1 = Point(p1.x - p2.x, p1.y - p2.y)
    val fixP3 = Point(p3.x - p2.x, p3.y - p2.y)
    return fixP1.x * fixP3.y - fixP1.y * fixP3.x <= 0
}
```
Dockerメモ

# Dockerとは

パソコン上でLinuxなどを動かせるエミュレーターのようなもの
コンテナ型の仮想環境を作成、配布、実行するためのプラットフォーム

#### Dockerのメリット

* Dockerがあるとアプリケーションを簡単に開発・デプロイできる
* アプリケーションを動作させるのに必要なものをひとまとめにして配布できる
* ローカルで開発したものをテスト環境、本番環境にそのまま入れることができる（差分をなくす）

# Dockerの基本的な仕組み
**イメージ**と**コンテナ**がDockerの基本で、イメージからコンテナを作成できる

#### Dockerイメージ
* コンテナの元になるテンプレート
* OSを実行するアプリケーションや設定をまとめたもの
* Dockerレジストリから取得するパターンとdockerfileで自身で作成するパターンがある

docker image build コマンドでイメージを作成することができる
~~~
docker image build  [オプション] PATH

オプション
-t　  タグをつける
-f　  ファイル名を指定（Dockerfile以外の名前の場合）
~~~
#### Dockerコンテナ
* イメージを元に作成される
* OSとアプリケーションが動く実行環境

docker container runコマンドでコンテナを起動することができる
~~~
docker container run [オプション] イメージ [コマンド]

オプション

-d　  コンテナをバックグラウンドで実行する

—name　  コンテナに名前をつける

-it 　標準出力とターミナルをアッタッチする（コンテナ上で実行される操作がシェルの場合コンテナが終了しなくなる）
~~~

# コマンドいろいろ
### コンテナのポートをホストに公開する
~~~
docker container run -p 8080:80 myapache:latest
~~~

### ログの確認
~~~
docker container logs [オプション]　コンテナ
~~~

### コンテナ内でコマンド操作
~~~
docker container exec [オプション] コンテナ　コマンド　[引数]

オプション

-it  　標準出力とターミナルをアタッチする->シェルを終了させない
~~~

### コンテナの停止
~~~
docker container stop [オプション]　コンテナ
~~~

### コンテナの停止(起動中のコンテナをまとめて)
~~~
docker container stop $( docker container ls -q)
~~~

### コンテナの削除
~~~
docker container rm [オプション]　コンテナ
~~~

### コンテナの削除(全て)
~~~
docker container rm $( docker container ls -q -a)
~~~

### コンテナの削除(起動中のコンテナを強制的に)
~~~
$docker container rm -f apache
~~~

### イメージの削除
~~~
docker image rm [オプション] イメージ
~~~

### Dockerの掃除

未使用のコンテナ、ネットワーク、イメージを削除する

~~~
docker system prune [オプション]

 オプション

-a　  全て削除する

—volumes　  ボリュームを削除する

-f　 // 強制的に
~~~
Macのcommandファイル（シェルスクリプト）でターミナルを入力待ち一時停止にするには？

# 概要

commandファイル（シェルスクリプト）を作っている途中で、変数の中身をちょっと確認したい。
でも ```echo $変数名``` と書いて実行すると、ターミナルがすぐ閉じてまう。

だから、 **ユーザーが入力するまでターミナルを閉じずに一時的に止めておきたい**
そんな時。

# やり方

```read``` コマンド。

```shell:ターミナルを止めつつ変数の中身を確認するサンプル
test=あああああああ
echo $test
read
```

実行結果は下記。
エンター押すまでターミナルは閉じない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c5ee1dd0-4c27-7a6c-4d05-a498a654fe23.png)

# pauseというコマンドは存在しない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d3f1101a-0980-5d82-0234-12e501f5bca5.png)

# バージョン

macOS Monterey バージョン12.5.1
【メモ】expectationとは？

ユニットテストを書く上で、expectation関数がなんなのかわからなかったので、調べたことをメモ。

 * @typedef XCWaitCompletionHandler
waitForExpectationsWithTimeout:handler: への呼び出しがタイムアウトするか、関連するすべての期待値が満たされたときに呼び出されるブロックです。
 
 * @param error
 待ち時間がタイムアウトした場合、または待ち時間に失敗が発生した場合、エラーのコードで失敗の種類を指定します。それ以外の場合、error は nil になります。

非同期処理を行う。期待値が入るまで、もしくは指定した時間が過ぎるまで待ってくれる。タイムアウトした場合はエラーになる。
デフォルトVPCとは

# デフォルトVPCとは
AWSではネットワークが詳しくない人でも利用できようにリージョンごとに**デフォルトVPC**が用意されている。
デフォルトVPCは選択したら、使用できる状態になっているので、個別に設定をする必要がない。基本的な要件の場合デフォルトVPCを使うと便利。
# デフォルトVPCの構成
デフォルトVPCとは**サブネットやインターネットゲートウェイが予め設定されているVPC**。EC2およびRDS作成画面で確認できる。
ネットワークの範囲は、プライベートIPアドレスの172.31.0.0/16が振られている。デフォルトのVPCでは「デフォルトのサブネット」と呼ばれるサブネットが、それぞれのAZに1つずつ作成される。東京リージョンだと、全てで4つ用意される。

**デフォルトVPCのネットワーク構成**
|ネットワーク|CIDR|ネットワークの範囲|
|-|-|-|
|VPC全体のネットワークの範囲|172.31.0.0/16|172.31.0.0~172.31.255.255|
|サブネット1|172.31.0.0/20|172.31.0.0~172.31.15.255|
|サブネット2|172.31.16.0/20|172.31.16.0~172.31.31.255|
|サブネット3|172.31.32.0/20|172.31.32.0~172.31.47.255|
|サブネット4|172.31.48.0/20|172.31.48.0~172.31.63.255|

**インターネットゲートウェイも用意されているため、インターネットに接続が可能**。インターネットに接続したくない場合は、別のVPCを接続するか、VPCダッシュボードからデフォルトVPCを変更する。
VPCウィザードを使うと、簡単な質問に答えるだけで、VPCを簡単に接続できる。
【メモ】Combineのcollect関数について

Combineにてcollectという関数が存在し、初めよく意味がわからなかったので、メモした。

# 使い方

```swift:Qiita.Combine
let numbers = (0...10)
cancellable = numbers.publisher
    .collect(5)
    .sink { print("\($0), terminator: " "") }
// Prints "[0, 1, 2, 3, 4] [5, 6, 7, 8, 9] [10] "
```

このようにcollectを使うことによって、指定した数字の要素分（この場合だと、5）のArrayを作成してくれる。

# 活用法
ユニットテストを書くときに、監視したい値に初期値が入っている時などに、collectを使うことによって、監視したい特定の値を見れるようになる。

例：
```swift:Qiita.Combine
@Published private var numbers = [[1,2,3,4,5]]
private var cancellable = Set<AnyCancellable>()
numbers.append([6,7,8,9,10])
numbers.last.publisher
    .collect(5)
    .sink { numbers in
        print(numbers)
    }
    .store(in: &cancellable)
// Prints "[[6, 7, 8, 9, 10]]"
```
【GitHub】検索条件一覧

## コードの検索

|          修飾子          |         サンプル         | 説明                                                       |
| :----------------------: | :----------------------: | :--------------------------------------------------------- |
|         in:file          |    SerchWord in:file     | ファイルの内容に検索ワードが含まれるコードにマッチ         |
|         in:path          |    SerchWord in:path     | ファイルパスに検索ワードが含まれるコードにマッチ           |
|      user:USERNAME       |    user:example-user     | ユーザー名が検索ワードに一致するコードにマッチ             |
| repo:USERNAME/REPOSITORY | repo:UserName/sample-app | リポジトリ名が検索したリポジトリ名に一致するコードにマッチ |
|        path:PATH         |  path:path/to/sample.js  | ファイルパスが検索したパスに一致するコードにマッチ         |
|    language:LANGUAGE     |      language:ruby       | 使用言語が検索ワードに一致するコードにマッチ               |
|    filename:FILENAME     |    filename:sample.md    | リポジトリ名が検索ワードに一致するコードにマッチ           |
|   extension:EXTENSION    |      extension:.ts       | 拡張子が検索ワードに一致するコードにマッチ                 |
EC2上にrailsアプリをデプロイするまで～puma起動で躓いた所を整理

アプリケーションのpumaの起動で起きたエラーとその解決策を記録。

もろもろの設定を終えた後に

bundle exec pumactl start

で起動しようとすると、

! Unable to load application: Aws::Sigv4::Errors::MissingCredentialsError: missing credentials, provide credentials with one of the following options:
  - :access_key_id and :secret_access_key
  - :credentials
  - :credentials_provider
missing credentials, provide credentials with one of the following options:
  - :access_key_id and :secret_access_key
  - :credentials
  - :credentials_provider

という謎エラー。数日前に苦労して起動させたときはこんなもん表示されずに起動したから泣きそうになった。

何やら認証情報がどーたらこーたららしいのだが、すでに心折れたので質問して待機中。

何故か1日経って起動したら何事もなく起動できたのでたぶん神がお許しになった。


ようやくブラウザのアドレスバーにEC2のIPアドレスを叩いて、サンプルアプリを起動…！

ActiveRecord::NoDatabaseError
Unknown database 'アプリの名前'
Extracted source (around line #43):
41
42
43
44
45
46
              
        rescue Mysql2::Error => error
          if error.error_number == ConnectionAdapters::Mysql2Adapter::ER_BAD_DB_ERROR
            raise ActiveRecord::NoDatabaseError
          else
            raise ActiveRecord::ConnectionNotEstablished, error.message
          end

と思ったらこのエラー

database.ymlのdatabaseの名前が違ったみたいで、訂正してもう一度起動。


502 Bad Gateway
nginx/1.20.0

次は君か。まぁこれはpumaを起動し忘れてただけ。pumaを再度起動すれば

ActiveRecord::PendingMigrationError
Migrations are pending. To resolve this issue, run:
bin/rails db:migrate RAILS_ENV=development
You have 2 pending migrations:
20210129231905_create_fruits.rb
20211003014450_create_active_storage_tables.active_storage.rb

うむ、エラーである。


エラーメッセージの中のbin/rails db:migrate RAILS_ENV=developmentをそのまま叩けば解決した。

ところが、

Webpacker::Manifest::MissingEntryError in Fruits#index
Showing /var/www/lecture05/app/views/layouts/application.html.slim where line #9 raised:

Webpacker can't find application.js in /var/www/lecture05/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
   unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
Your manifest contains:
{
}
Extracted source (around line #9):
7
8
9
10
11
12
              
    meta name="description" content="#{content_for?(:description) ? yield(:description) : 'Sortable Table Sandbox'}"
    == stylesheet_pack_tag "application", :media => 'all'
    == javascript_pack_tag 'application'
    == csrf_meta_tags
  body
    header

ほいまたエラーですわ。webpackerがコンパイルされてないらしい。なんのこっちゃ。

https://prograshi.com/framework/rails/webpackermanifestmissingentryerror/

この記事通りにコマンドを叩けばOK。

そしてやっとのことで、ブラウザにデプロイ完了…！！！

一ヶ月以上かかりましたわ…（実質勉強したのは半分以下）
influxdb+grafanaで変数を利用して個別の株価パネルを複製

# はじめに

ここまでのシリーズ記事でinfluxdbとgrafanaを使って株価のローソク足パネルを作ってきました。

- [ファイナンス分野で時系列データベースinfluxDBを使う](https://qiita.com/ixtlan001/items/c87e4b2c4a97d7dba800)
- [ファイナンス分野でInfluxDB+Grafanaを使う（株価をローソク足表示](https://qiita.com/ixtlan001/items/268dfab0d1ee21887602)

この記事では、grafanaの変数定義とパネルの複製機能を使って、簡易に各tickerのパネルを生成できる様に設定をします。

![スクリーンショット 2022-08-28 15.39.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781605/ad265867-58a2-d65c-2d75-956bd4b5033c.png)

# 設定

## 変数の定義

Dashboard settingsを開いて（Dashboard上部のギアのマーク）、Variablesを選択、Newをクリック

- Name : Tickerと入力
- Type : Queryを選択
- Queryのテキストフィールドに下記を入力

```
from(bucket: "influxdb_stock_prices_ver01") // 自分のbucket名に合わせる
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "stock prices")
  |> group(columns: ["SYMBOL"]) // tickerに対応するタグ名に合わせる
  |> distinct(column: "SYMBOL") // 同上
  |> keep(columns: ["_value"])
```

- Refresh : "On dashboard load"を選択
- Selection option : Multi-valueのスイッチをonにする
- Preview of valuesにtickerの例が表示されていることを確認
- Updateをクリック

## パネル設定での変数の利用、複製の設定

上記作業で、Dashboardの表示に戻ると、上部に変数選択のドロップダウンリストが追加されているはずです。このドロップダウンリストで選択した内容は、Dashboardの各種設定で、$tickerという変数名で使えるようになります。
また、パネルの設定のRepeat機能を使うことで、同じ形式のパネルを選択した変数の個数分複製することが出来るようになります。

- 複製の設定
    - Panel optionsの中にRepeat optionsの部分でRepeat by variableで複製を作りたい変数名を選択（ここではticker）

- Queryでの変数の利用

パネル設定のQueryで定義された変数を使います。${ticker}で変数が展開されます。クォーテーション""で囲うのを忘れずに。

```
from(bucket: "influxdb_stock_prices_ver01") // bucket名に合わせる
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "stock prices")
  |> filter(fn: (r) => r["SYMBOL"] == "${ticker}") 
  |> filter(fn: (r) => r["_field"] == "close" or r["_field"] == "high" or r["_field"] == "low" or r["_field"] == "open" or r["_field"] == "volume" or r["_field"] == "SMA" or r["_field"] == "Upper Bollinger Band" or r["_field"] == "Lower Bollinger Band")
```

Dashboard画面をリロードしないと反映されないのでご注意ください。

# 参考にした記事

- [grafana公式](https://grafana.com/docs/grafana/latest/variables/)
- https://stackoverflow.com/questions/61424275/influxdb-2-0-how-to-get-a-tag-all-values

# 不明点など

- legendのoverride設定がうまく複製されたパネルに反映されていないかもしれません。そもそもlegendがすぐ消えてしまったりといった挙動について良く把握できてません。
ポートフォリオ「ToDoリストアプリ」 


# 初めに
はじめまして。
今回は、Webアプリ開発の基礎のアウトプットを兼ねて、作成致しましたのでご紹介いたします。
何かアドバイス・コメント等ございましたらコメント欄に宜しくお願い致します。
（2022.8.4現在）

# 目的
・フレームワークを使用せず、素のPHPで開発する。
・MVCモデルを利用した開発
・システムの動きをイメージングできるようになるため（現在の仕事では、開発部分に携わることが少ないため）

# ポートフォリオの概要
一般的なAppleのリマインダーのようなシンプルにタスクが管理できるアプリを想定しております。
また、サイトの基本機能であるCRUDの実装し、どの端末でもアクセスできるようにレスポンシブデザイン
となっております。総作製時間は、PHPの勉強も含め90H程度です。

# ポートフォリオの機能
### ■機能一覧
・タスク一覧表示
・完了タスクの一覧表示
・タスクの新規作成
・タスクの完了処理
・タスクの削除処理
・完了タスクの復元処理
・タスクの詳細内容編集機能
・セキュリティ対策（SQLインジェクション・XSS対策）

### ■使用している技術
・PHP
・MySQL
・Javascript
・jQuery
・Docker

### ■機能説明
##### タスクの新規作成機能
タスクのタイトルと詳細内容を入力することができます。
![新規作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631121/cecaa256-a05c-ec11-4948-ad088f70ca79.gif)

##### タスクの完了機能
タスクが完了した場合、完了一覧に移動する処理を行います。
![完了処理.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631121/5dfdac4b-d12d-703c-bda3-c625bd9eff70.gif)

##### タスクの削除機能
タスクの削除処理を行います。
![削除処理.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631121/dc6d30e4-f2e9-24de-bdcf-0cef4fcebd61.gif)

##### 完了タスクの復元処理
誤って完了処理してしまったタスクを復元する処理を行います。
![復元処理.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631121/67058f42-5c3f-8314-3c97-e94f36af37d3.gif)

##### タスクの内容編集機能
タスクのタイトルや詳細を編集する処理を行います。
![編集機能.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631121/a92fd859-0fb7-d0b4-835f-b26cbdec030e.gif)

# 工夫したポイント
工夫したポイントは、エラー発生前に入力した値が発生後にも残るようにしたところです。新規作成時と更新時にタイトルや詳細内容がブランクでエラーになったとしても入力内容が保持されます。
##### 新規作成時の入力内容保持
![工夫ポイント①.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631121/4567e1ff-d853-d319-a0c4-d49e5e06a730.gif)
##### 編集時の入力内容保持
![工夫ポイント②.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631121/873ee0ca-92f8-31ed-f154-e19faee18044.gif)

# 課題点
まず、アジャイル的に開発しているなか手戻りすることによる無駄な工数がありました。個人開発でしたので、その日何となしに開発を始めてしまったことも多くあり、ここが課題点だと認識しています。最終ゴールの明確化やタスク管理等ポイントはしっかり押さえていくことで改善したいと思います。
また、コーディングにも課題を感じました。仕事の並行して行っていたので、なんとなくの焦りを感じ。頭で考えたことをそのままコードにアウトプットしていました。途中から紙に書き出したり、コメントをつけることで作業効率があがったので、次回につなげていきたいです。
加えて、検索機能をつけられなかったことは大きな課題です。検索エンジンをどのように実装するか、検索アルゴリズムどのように組み立てるか悩み、現状の自分では成し遂げられないと思いました。検索機能については、これを機に興味を持ったので、個人課題として研究してみたいと思います。

# 最後に
ご一読いただきありがとうございました。
採用担当者の方など、コードを見たい方がいらっしゃいましたら対応致しますので、DMかメールにご連絡宜しくお願い致します。
Automation AnywhereでAutomation Anywhereのロボットを編集

# はじめに
これはお遊びです。細かいツッコミは無しで、ひやかし半分で読んで頂ければ幸いです。

# やりたいこと
AIが絵を描いてくれる時代です。RPAのシナリオをRPAに作らせればいいじゃん、って事でやってみました。
RPA製品ＡでRPA製品Ｂを操作する事は問題ありません(*1)。なので２製品組み合わせれば「RPAでRPAシナリオを作る」は可能です。
では、同じ製品でシナリオ操作できるのか、というのが本日のメインです。

# Automation AnywhereでAutomation Anywhereのロボットを編集
編集用のブラウザを２つ上げることでAutomation360のシナリオを自動で作ってみます(*2)。
こんな感じ。

https://youtu.be/qXuWTlfZhzk


1000ステップあるシナリオも作れます(*3)。
![1000steps_bot_last_line.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/bb0929ee-8da3-c047-4ff2-5a48fd771a20.jpeg)

#  でも、これって何に使える？
ロボットシナリオを作っているときに手作業が多くて面倒くさい場面を考えます。
例えばAutmatio Anywhere V11のロボットをAutomation 360に変換したときにコメント行が無効行になって、行の色が気に食わないので手でコメント行を有効化したことがあります(*4)。
それをAutomatio360自身にやらせてみましょう。

以下が実際にやった動画です。

https://youtu.be/3tEYU1ZGT88

1行ずつ確認し「コメント (無効)」行だったら「Ctrl＋／」で有効化するAutomation360のロボットでAutomation360のシナリオを修正しています。なお、ループで10行だけに留めてます。

(  我ながら、技術力の無駄遣いみたいな、バカやっているなぁ...  ）

これは大したことない作業ですが、うまく使えばナニかおもしろい事ができるかもしれないな、と思いました。

# 強引なまとめ
自分の仕事を楽にするために、どんな工夫ができるかあれこれ考えるのは結構楽しいです(*5)。
RPAもそのように楽しみながら使えれば良いですね。

#  脚注
(*1)
https://qiita.com/etoootak/items/a9d8509373d2df3296fd

(*2)
２つのブラウザがEdgeとChromeになっているとか、2個のA360のIDを使っているとか、Bot Agentは片方にしか繋がっていないとかは秘密です。
1種のブラウザで1個のA360 Creator IDを使って自分自身を操作する、というのは使えるActionが制限され難易度Maxなのであきらめました。

(*3)
Automation360は500行以上のフロー表示できないので、リスト表示で行う必要あり。

(*4)
Automation360 v25になって、変換後コメント行が無効行になる問題は改善されました。
そのため今はこんな事を悩む必要ありません。

(*5)
Automation360の無効コメント行を有効するには、そのシナリオをエクスポートし、出力されたJSONファイルを適当なツールで変換しインポートする、という方法も使えます。こちらが簡単です。
【メモ】RxSwiftのCombineLatestの扱い方

RxSwiftを初めて使う際に、CombineLatestの便利さに驚きを隠せなかったが、それと同時に落とし穴が存在したので、忘れないようにメモする。

# CombineLatestとは？
ReactiveXの公式ドキュメントによると、CombineLatestは以下のように説明されている。

https://reactivex.io/documentation/operators/combinelatest.html


>when an item is emitted by either of two Observables, combine the latest item emitted by each Observable via a specified function and emit items based on the results of this function

上記の文章をそのまま訳すと、
>「2つのObservableのどちらかがアイテムを発行した場合、指定された関数でそれぞれのObservableが発行した最新のアイテムを結合し、この関数の結果に基づいてアイテムを発行します。」
となります。

## 具体例
具体例をあげて説明します。

まず、どちらかの値が更新されたときに、監視したいObservableのAとBがあるとします。

``` swift:Qiita.RxSwift
private let A = BehaviorRelay<String>(value:"")
private let B = BehaviorRelay<String>(value:"")

Observable.combineLatest(A, B)
.subscribe(onNext: {a, b in 
    print("a,b:\(a,b)")
})
.dispose(by: disposeBag)
```

これでAとBのどちらに値が流れてきても、監視をし続けることができます。
例えば、Aだけに値が流れてきたら、ちゃんとprintが呼び出されますし、Bだけがよばれてもしっかりとprintされます。

しかし、ここにおいて落とし穴が存在します。

## 落とし穴
``` swift: Qiita.RxSwift
private let A = BehaviorRelay<String>(value:"")
private let B = BehaviorRelay<String>(value:"")
```
ここに注意してみてみてください。
どうしてわざわざBehaviorRelayで初期値を持たせているのでしょうか？？

理由は単純でCombineLatestを使う際は、**初めに監視している値、両方に値が流れてこない** と監視を始めないからです。

つまり、一度A,B両方ともに値が流れない限り、CombineLatestは監視を始めません。

CombineLatestはとても便利な関数ですが、この点に注意しましょう。
新人エンジニアが先輩に言われたこと4つ



## 1.はじめに

今回は技術的な内容というより、**「入社してからこれまでで言われたことを振り返ってみよう」** という記事になります。

**「現場でこういうこと言われている人がいるんだな～」** と読み物感覚で読んでいただけると幸いです。


## 2.自己紹介

- 未経験で4月に入社しました。実務経験5ヶ月目のバックエンドエンジニアです。
- 自社サービスのシステムの不具合改修や、機能追加が主な業務内容です。

研修はなく、教育係の先輩や上司を中心に、都度教えて頂きながら業務に携わっています。


## 3.今回の「先輩」とは

別支店にいる教育係の先輩です。

チャットやWebミーティングで質問したり、コードのチェックをして頂いています。


## 4.先輩に言われたこと4つ

### ①コードのルールを守ろう

「自分でコードが書けた」と思ったら変更前後のファイルを先輩に送っています。

JavaScriptの実装で以前、こういうことがありました。

functionの呼び出しをしているわけですが、今回の場合だと`sample( id );`と本当は最後にセミコロンが必要になります。

```javascript
function sample( id ) {
 
}

//functionの呼び出し
sample( id ) //「;」がない
```

https://www.sejuku.net/blog/31671


こう言ったやり取りが頻発したときに **「何回も言わさんといて」** と呆れさせてしまい、心底へこみました。

そこからJavaScriptの学習とセルフチェックの強化を行い、今は以前より減ってきていると感じています。

## 22/9/12追記（Prettierの導入）
頂いたコメントを参考に、VSCodeに「Prettier - Code formatter」を導入しました。
インデントの修正や`;`の補完などをしてくれるので便利ですね:relaxed:

▼公式

https://prettier.io/

▼参考記事

https://qiita.com/KNR109/items/5f933df1292564e6dc70

https://qiita.com/KKKKK/items/3b9dba55653cb7993bf5

### ②変数のスコープを意識しよう

スコープとは、「変数や関数の引数などを参照できる範囲を決めるもの（引用元：[JavaScript Primer](https://jsprimer.net/basic/function-scope/)）」です。

どこで宣言するかによって参照できる範囲が異なります。

※JavaScriptで定数をx,y,zで宣言した例です。

```javascript
const x = 1; //グローバルスコープ（プログラム内どこからでもOK）
function sample( id ) {
    const y = 2; //関数スコープ（ファンクション内のみ）
}

{
    const z = 3; //ブロックスコープ（ブロック内のみ）
}
```

変数を追加する機会があり、「ゆくゆくは別のところから参照する可能性もあるかも」と思ったので`x`のグローバルスコープで宣言してコードを提出しました。

そして返ってきたのが **「なんでそこに宣言したん？」** ということでした。

グローバルスコープはどこからでも参照できるぶん、予期せぬ動きをする可能性もあります（他の人と変数名が被ってしまい衝突するなど）。
担当した課題が独立しているようなものだったこともあり、今のところ参照する予定はないという理由から最終的に`function`内に移動させました。

根拠をもとにスコープを意識して、宣言しましょう。

https://kenju.gitbooks.io/js_step-up-to-intermediate/content/content/part01/avoid_abusing_global_variables.html


### ③不明点は本人に聞こう

これはタイトルのままなのですが、**「自分を挟まずに○○さんに直接聞いてくれ」** ということです。

自分は出社していますが、複数の拠点で1つのチームとして働いているため基本的にやり取りはチャットで行うことが多いです。
チームメンバーから自分宛てに質問を頂いたときに、

- いろんな解釈ができる
- 「何を言われているのか全然わからん・・・」

となることがありました。

「他の人の意見が聞きたい！」と思って先輩に確認して質問に返信をしていましたが、「当人じゃないから憶測になってしまうし、直接聞いて良いと思う」とのことでした。

解釈がずれた状態で質問をしていないかどうかが不安でしたが、「解釈がずれたまま仕事を進めることのほうが怖いし、迷惑をかける可能性があるな」と思うようになりました。
割り切って今は質問するようになり、悩む時間が減ってきました。

前に進むためにも、思い切って質問してみましょう。

### ④やりたいことを日本語にしよう

 **「プログラムを考える前にまず日本語に落とし込む」** ということです。

～ある日～

私「今日から○○の課題に着手して、触るファイルが結構ありそうです。1日コード読んで時間が経ってしまい進捗はほとんどないです・・・」

先輩「なるほどなぁ・・。この課題で何がしたいん？」

私「えっと・・・。」

進捗がないうえに、ゴールも目的も答えられない。申し訳なさでいっぱいでした。

そんな私に先輩からアドバイスを頂きました。

「まず日本語で

- やりたいこと
- そのためにやらないといけないこと
- 気になっていること

を明確にしてみたら」

〜ある日・完〜

私はこれまで、課題を見つめながら「この辺に書いてあるかな」と思い、コードを読むことからはじめていました。似ている書き方をしている箇所があればコピーで持ってきたり・・。

先輩のアドバイスを受けて、まずノートに書き出すことから始めてみました。

- 日本語にできないならコードにできない
- 日本語にできないなら、そもそも理解していない可能性がある

今はこれをひしひしと感じています。

先輩にノートを見せることはないですが、私の進捗報告や質問を聞いて「理解していないんだな」と判断されているようで「日本語にしてみた？」「理解してないでしょ」と突っ込まれます。

私は締め切りまで時間がないときほど、焦りが募ってコードを読まなきゃとなってしまう傾向があるのでいったん落ち着いて整理してから始めたほうが、実は近道かも・・・と思いました。

ゴールも目的もわからないまま走るのはできないですね。目標の立て方と似ていると感じました。


## 5.まとめ

今回は自分が先輩から言われたなかで特に印象的だったものを挙げてみました。

毎日アドバイスを頂けることに感謝しつつ、取り入れて成長していきたいと改めて思いました。


## 6.最後に

何かありましたら、ご意見やご感想をいただけると幸いです。

読んでいただき、ありがとうございました。
余弦定理「22年 東北学院大 文系 A 1(4)」をsympyでやってみた。 

△ABCにおいて、∠BAC=60°.....

オリジナル

https://kamelink.com/blog/2022/08/28/3-2-22-touhokugakuinndai-bunkei-a-1-4/

大学入試数学問題集成＞
未掲載

# sympyで(余弦定理・正弦定理)
```python
from sympy import *
BC    =Symbol('BC'    ,real=True,positive=True)
sinABC=Symbol('sinABC',real=True,positive=True)
AB=7
AC=5
BAC=60
BC=solve(Eq(BC**2,AB**2+AC**2-2*AB*AC*cos(BAC*pi/180)),BC)[0]
print("#",solve(Eq(AC/sinABC,BC/sin(BAC*pi/180)),sinABC)[0])
# 5*sqrt(13)/26
```

# sympyで(三平方の定理)
点Cから辺ABへの垂線の足を点Hとする。
```python
from sympy import *
BC=Symbol('BC',real=True,positive=True)
AH=Rational(5,2)
CH=AH*sqrt(3)
# BC=sqrt((7-AH)**2+CH**2)
BC=solve(Eq((7-AH)**2+CH**2,BC**2),BC)[0]
print("#",CH/BC)
# 5*sqrt(13)/26
```
【メモ】Git Stashが便利だった

人生で初めてチームで開発するにあたり、ローカルとリモートのコンフリクトに苦戦したため、git stashを活用した。そのメモ。

`git stash `
→ git stashを行うことによって、リモートとローカルにおいて合っていないファイルを棚に上げてもらえる。
具体例：
ローカルでファイルを編集している状態において、メインのブランチを引っ張ってこようとしても引っ張ってこれない。なぜなら、リモートとローカルにおいて合っていないファイルがあるから。その場合は、git stashを使うことで一度自分が編集したファイルをローカルに保存し、リモートの状態に戻すことができる。そうしたら、メインをプルすることが可能である。

`git stash apply`
→ git stash applyを使うことによって、先ほどgit stashによってローカルに保存したファイルを反映させることができる。その後、コンフリクトが起こった場合は、手動で直す。
Github ActionsでSpring Bootのテストコードを検証する

GitHub Actions上でドッカ―コンテナを起動し、Spring Bootのテストコードを検証する流れについて説明します。
## GitHub Actionsのワークフロー作成
リポジトリのルートディレクトリにディレクトリ`.github/workflows`を作成し、.ymlファイルを作成します。
.ymlファイル名は何でもOKです。
```
name: Testing Spring Boot Code On Github Actions

on:
  push:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v2
      - run: docker-compose up --abort-on-container-exit
      - if: success()
        run: echo success
      - if: failure()
        run: echo failure
```
- docker-composeを実行するときに`--abort-on-container-exit`オプションをつけて、テストが失敗し、exit codeが1になったらコンテナを停止させるようにします。
- `if: success()`：テストが成功して、ステータスがsuccessだったら、echo successを実行します。
- `if: failure()`：テストが失敗して、ステータスがfailureだったら、echo failureを実行します。
## DockerfileとDocker Composeを作成
### Dockerfile
```
FROM openjdk:18-jdk-bullseye
ENV APP_HOME=/usr/app/

RUN apt update && apt upgrade -y && apt install -y curl gnupg sudo git vim wget && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /demo/home
COPY . /demo/home  
```
### docker-compose.yml
```
version: '3.8'
services:
  web:
    container_name: 'web'
    build:
      context: .
    tty: true
    working_dir: '/demo/home'
    volumes:
      - .:/demo/home:cached
    ports: 
      - "8080:8080"
    entrypoint: |
      bash -e -c "
      ./gradlew test
      " 
```
- entrypointにコンテナが起動されたら、テストを実施するよう`./gradlew test`を書き込みます。
## 実行
簡単なテストコードを作成し、Github Actions上で検証してみます。
### テスト成功
#### テストコード
```
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
class DemoApplicationTests {

	@Test
	void testCodeOnGithubActions() {
		assertEquals(1, 1);
	}

}
```
#### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727545/21727376-e3e2-fcc2-7c20-3277751bfc3c.png)
### テスト失敗
#### テストコード
```
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
class DemoApplicationTests {

	@Test
	void testCodeOnGithubActions() {
		assertEquals(1, 0);
	}

}
```
#### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727545/897f3c0d-f1d3-4f1c-1cc1-3e4bc3165ee1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727545/b847d679-de5c-bf26-90b5-2732371bf4e4.png)
## 最後に
詳細のコードは[こちら](https://github.com/crane93/qiita-article/tree/main/github-actions-spring-boot/demo)をご参考にしてください。
【メモ】zshとbashの違い

zsh, bashは聞いたことはあったが、具体的にどのようなものなのかを理解できておらず、アプリを立ち上げようにも環境設定に苦戦したので、ここにメモ程度に記述する。


zshとbashの違い
2019年よりAppleがシェルのデフォルトをzshに変更した。bashはもともと10年ほど更新されていなかった。だからといって、zshが完全なbashの上位互換ではないらしい。zshにできないことをbashができたりもするので、適宜切り替えが必要。

ターミナルにて、
`chsh -s /bin/zsh` ← zshへ移動
`chsh -s /bin/bash` ← bashへ移動
Uninitialized string offsetとは（PHPのエラー）

Uninitialized string offsetとは、文字列型の変数に対して、存在しないキー名を呼び出したときに発生するエラー。
（例）
```PHP
$a = 'PHPを勉強中です。';
echo $a[100];
```
この場合、Uninitialized string offset: 100 というエラーが出る。

# 参考文献
PHP | Uninitialized string offset エラーの原因と修正案
https://1-notes.com/php-error-uninitialized-string-offset/
エイリアスの設定方法 Mac

# エイリアスの設定方法 Mac

エイリアスを利用して、長いコマンドを短くする。

打つのがだるい、間違える、何回も利用するコマンドや、そもそも長くて覚えられないものにおすすめ。

# やり方

macのホームディレクトリにある.zshrcをいじる。

.zshrcの最後に

```bash
alias e='echo hello!'
```

とかを.zshrc内に書き込んでやると、コマンドラインで$ eとするだけでhello!が出力される。

引数を取りたい場合、(){}の中におくことで、$1とかで受け取ることができる。

下の例は競プロの便利ツールであるonline-judge-toolsのテスト実行を簡略化しているもの。

競プロで焦っている中で $ oj t -c "cargo run --bin a” とか打たないといけないものが、
 $ t 実行名 だけの入力で良くなる！

```bash
alias t='(){oj t -c "cargo run --bin $1"}'
```
TypeScript+VueにVuexを導入した際のインクリメントエラーについて

# 解決したい問題

npmにてVuexをインストールした際、「$Store」が使えない場合があります。
イメージとしてはこんな感じのエラーが発生します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278403/3d37f4db-a8ec-f6dd-40e0-832147b21576.png)
**エラー内容**
```
Property '$store' does not exist on type 'CreateComponentPublicInstance<{ [x: string & `on${string}`]: ((...args: any[]) => any) | undefined; } | { [x: string & `on${string}`]: undefined; }, {}, { hoge: ResItem[]; isLoading: boolean; }, { storeItems(): any; }, ... 13 more ..., {}>'.
```
「プロパティ '$store' がタイプに存在しません。」とコンパイルエラーが出ています。

**環境**
VueCLIにてVue3をインストール後、
Vuex4をインストールした際に本事象が発生しました。

# この問題の解決策
**型定義ファイルの導入**

VuexのTypeScriptサポート章に従って、Store型を導入しましょう。
このページで述べている「vuex.d.ts」を自分のプロジェクトに追加してください。

https://vuex.vuejs.org/ja/guide/typescript-support.html

**それでもうまくいかない時**
エディタの再起動を試してみてください。
上記で作成した型を認識しないことがあるようです。

# 補足
型定義ファイルに関しては以下がわかりやすいです。

https://typescriptbook.jp/reference/declaration-file

参考文献

https://qiita.com/Nossa/items/726cc3e67527e896ed1e
PHP で GCP を利用する際の認証設定

PHP から GCP を利用するときの credentials の設定について調べてみると「サーバーの環境変数に設定しましょう」という記事が見つかる。
必ずしもサーバーの環境変数を設定できる環境とは限らないので、今回は別の方法も調べてみた。


基本的には [githubの公式](https://github.com/googleapis/google-cloud-php#authentication) や、 [AUTHENTICATION.md](https://github.com/googleapis/google-cloud-php/blob/main/AUTHENTICATION.md)に書いてある。


## putenv を利用する
サーバーを直接操作できないなら PHP から操作すればいいじゃない、でお馴染み `putenv` さんの登場。
動作としてはサーバーの環境変数を設定したのと同じになる。
絶対パスで設定する。

```php
putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json');
```

## クラス初期化時のオプションに入れる
基本的には `keyFilePath` という名前で、絶対パスを入れる。
しかし、一部のクラスでは `crecentials` という名前になっているので、認証がうまくいかなければ、こちらを試してみると良い。

なお、どちらのケースにおいても json の中身を配列として直接ハードコードして指定することは可能だ。
しかし **ソースコードが流出した時に大変なことになる** ので、**絶対やらない** こと。



### keyFile のケース
```php
use Google\Cloud\Storage\StorageClient;

// ファイルパスを指定
$client = new StorageClient([
  'keyFilePath' => '/path/to/credentials.json',
]);

// 配列で指定
$client = new StorageClient([
  'keyFile' => json_decode(file_get_contents('/path/to/credentials.json'), true),
]);
```


### credentials のケース

```php
use Google\Cloud\Vision\V1\ImageAnnotatorClient;

// ファイルパスを指定
$client = new ImageAnnotatorClient([
  'credentials' => '/path/to/credentials.json',
]);

// 配列で指定
$client = new ImageAnnotatorClient([
  'credentials' => json_decode(file_get_contents('/path/to/credentials.json'), true),
]);
```

## サーバー内の特定の場所に設置する
[認証周りのソースコード](https://github.com/googleapis/google-auth-library-php/blob/deab93524279124917707189eef0038aa2bfd2a5/src/CredentialsLoader.php#L85-L111)を読み解いてみると、以下の場所に設置しても良いようだ。

* windows: %APPDATA%/gcloud/application_default_credentials.json
* others: $HOME/.config/gcloud/application_default_credentials.json

## 認証に関する全体の優先順位
1. クラス初期化時のオプション
2. サーバーの環境変数 (≈ putenv)
3. サーバー内の特定の場所に設置
YAML 中で制御文字を表現する方法

# はじめに

以下のようなタイプの YAML データについて考える。

```yaml
content: なんとか
```

単一の一要素のハッシュ（マッピング[^mapping]）があり，キー `content` の値が `なんとか` になっている。

[^mapping]: YAML の本来の用語は「マッピング」だが，これを「ハッシュ」と呼ぶこともある。Ruby 界隈では（読み取ってできるデータがハッシュになることもあって）ハッシュと表現されることが多い気がする。

この `なんとか` の部分に制御文字を含めたいときどう書くか，というのがこの記事のテーマ。

たとえば，

```
なんとか
かんとか
```

みたいに改行を含む場合とかね。

いやまあ，改行の場合は

```yaml
content: |-
  なんとか
  かんとか
```

という記法が使えるのだが，本記事では制御文字一般に通用する書き方について述べる。

# 予備知識

本題に入る前にちょこっと復習。

## 文字列スカラーの表し方

YAML では文字列スカラーを表現する際，引用符に関して以下の 3 とおりの書き方があるのだった：

```yaml
# 引用符無し
content: なんとか
```


```yaml
# ダブルクオート
content: "なんとか"
```


```yaml
# シングルクオート
content: 'なんとか'
```

以上の三つはすべてまったく同じデータを表現している。

しかし，以下の場合は違いが出る：

```yaml
content: 123 # => 整数
```


```yaml
content: "123" # => 文字列
```


```yaml
content: '123' # => 文字列
```

`" "` や `' '` で囲めば確実に文字列のスカラーとして扱われるが，囲まない場合，文字の並びによっては数値（整数，浮動小数点数），論理値などに解釈される，ということ。

## YAML テキストに使える文字

YAML テキストには，以下に挙げた以外の制御文字は含めることができない。

| コードポイント | 名称 |
|:-|:-|
| U+0009 | CHARACTER TABULATION（タブ） |
| U+000D | CARRIAGE RETURN（CR） |
| U+000A | LINE FEED（LF） |
| U+0085 | NEXT LINE |

なお，Unicode の制御文字は，U+0000〜U+001F，U+007F，U+0080〜U+009F のみ。

参考（公式ドキュメント）：
[YAML Ain’t Markup Language (YAML™) Version 1.2 > 5.1. Character Set](https://yaml.org/spec/1.2-old/spec.html#id2770814)

# 文字列スカラーに制御文字を含める方法

ここから本題。

答えを一言で表現すれば「ダブルクオートで囲ってエスケープシーケンスを使えばよい」となる。
つまり，

```yaml
content: "なんとか\nかんとか"
```

のように書く。
大事なのは「ダブルクオートで囲む」ということ。シングルクオートで囲った場合や，引用符で囲まなかった場合はエスケープシーケンスとはみなされず `\n` という文字そのものと解釈されてしまう。

エスケープシーケンスの一覧は公式ドキュメントのここ
[YAML Ain’t Markup Language (YAML™) Version 1.2 > 5.7. Escaped Characters](https://yaml.org/spec/1.2-old/spec.html#id2776092)
にある。

面白いのは `\_` で U+00A0 NO-BREAK SPACE が表せたりするところ。

バックスラッシュを表すのに `\\` と書いたり，ダブルクオートを表すのに `\"` と書くあたりは多くのプログラミング言語の文字列リテラルと共通。

文字コードを使うエスケープシーケンスもある（制御文字以外にも使える）。

```yaml
content: "\x31\u306F\U00029E3D" # "1は𩸽"
```

こんなふうに，16 進 2 桁は `\x` を，4 桁は `\u` を，8 桁は `\U` を使う。
`\u{29E3D}` のような，`\u{ }` を用いた表記は無いようだ。
人事のおじさんプログラミングを学ぶ Day8「while文～回数の決まっていない繰り返し」

書籍『確かな力が身につくJavaScript「超」入門 第2版』に沿って、
While文を使って回数の決まっていない繰り返しのプログラムを書いてみた。
![2022-08-28 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783084/7b99f0af-84f4-5e9e-52d8-76584aca236e.png)
![2022-08-28 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783084/80c34ec1-b113-a913-a6d2-926d55d0c14a.png)
【Xcode】「AST Deserialization Issue」を修正した

# はじめに
実機でビルドしようと思ったら突然大量のエラーが発生しました。


# エラー
![スクリーンショット 2022-08-25 23.34.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/fb02daeb-b2b4-53ff-52f5-78260ce2ffb1.png)

```
/Users/XXXXXXXXX/Library/Developer/Xcode/DerivedData/XXXXX-cjjyountbftezrcatmquboljpsyt/SourcePackages/checkouts/SDWebImage/SDWebImage/Core/SDWebImageCompat.h:67:10: File '/Users/XXXXXXXXX/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/25U36CV5033SC/UIKit-2LM3EQU7VVY4O.pcm' is not a valid precompiled module file
```

# 原因
不明

誰かわかる方教えてください。

参考にした記事ではMacのアカウント名を変更した時になったらしいんですけど、自分は何も変更してないのに突然発生しました。

# 解決方法
メニューバーにある「Xcode」を押します。
![スクリーンショット 2022-08-25 23.37.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d012f60c-be45-3df5-de6e-410d5ed14524.png)

「Preferences...」を選択します。
![スクリーンショット 2022-08-25 23.38.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/0c75cf62-dd00-40b1-8ad5-841dd94f9a68.png)

① 「Locations」を選択します。
② 「Derived Data」を押します。
![スクリーンショット 2022-08-25 23.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/263409ec-753b-d5f1-100c-35082cd67694.png)

「Relative」を選択します。
![スクリーンショット 2022-08-25 23.40.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/30cc8058-214c-8e98-704c-285c80069a1e.png)

おわり

# 参考記事
https://teratail.com/questions/138830
右辺値参照とMoveセマンティクス

UEのエンジンコードを見ているとたまに出てくるこういうコード

```cpp
	TArray& operator+=(TArray&& Other)
	{
		Append(MoveTemp(Other));
		return *this;
	}
```
***「&&」*** って？
***「MoveTemp」*** って何？

今日はこれの解説をしようと思います。

# &&は右辺値参照型の変数を定義する時に使われます
右辺値があるってことは左辺値もあります。

```cpp
// ポインタ
TArray* a;

// 左辺値参照
TArray& a;

// 右辺値参照
TArray&& a;
```


# 右辺値とは
- 一時的なオブジェクト
- 変数に代入する前の定義や計算結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778561/2752ad22-4264-72fb-9290-efc7ae2c8551.png)
定数や、一時オブジェクトである関数の戻り値なんかもそうです。
こういう代入演算子の**右側にしか書けないもの**と覚えると分かりやすいです。

# なぜ右辺値参照という機能が実装されたのか？

変数の値をコピーしたいんだけど、でかい構造体だからコストが心配だなぁ。そうだ！
### 「コピーじゃなくて中身を移動すればいいじゃん」
　
でも勝手に移動したら前使ってた人が困るから判別できるようにしよう。
ってことで&&です。

- 中身はもう使わない　＝　移動してもいいですよ　＝　右辺値
- 移動してもらっては困る　＝　左辺値

# 実際に試してみよう
文字列を扱うクラスを作ってみます。
```cpp
class String
{
public:
	String()
		: Data(new char[255])
	{
		std::cout << "コンストラクタが呼ばれた" << std::endl;
	}

	String(const String& rhs)
		: Data(new char[255])
	{
		std::cout << "コピーコンストラクタが呼ばれた" << std::endl;

		memcpy(Data, rhs.Data, sizeof(char) * 255);
	}

	String(String&& rhs)
		: Data(rhs.Data)
	{
		std::cout << "ムーブコンストラクタが呼ばれた" << std::endl;
	}

	String& operator=(const String& rhs)
	{
		std::cout << "代入演算子が呼ばれた" << std::endl;

		memcpy(Data, rhs.Data, sizeof(char) * 255);
		return *this;
	}

	char* Data = nullptr;
};
```
### まずは普通にコピーしてみます
```cpp
int main()
{
	String a;
	String b(a);

	return 0;
}
```
結果は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778561/8ba2e1c4-84fd-186e-2192-c177ba1eff1e.png)
コピーされました。

### 次に移動してみましょう
```cpp
int main()
{
	String a;
	String b(std::move(a));

	return 0;
}
```
結果は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778561/119a678d-e5ac-564f-1115-baa5265435b4.png)
無事に移動できましたね！

ここで出てきた ***「std::move」*** って何でしょう？
これは左辺値を右辺値にキャストするstlの関数です。
そう、UEのコードで出てきた ***「MoveTemp」*** はこれと同じです。

- 移動していい場合は関数を呼び出す側で ***「MoveTemp」*** を使う
- 移動後の変数は使ってはいけない。
```cpp
	FString a;
	FString b(MoveTemp(a));

	a = TEXT("テスト"); // Move後に変数を使っちゃ駄目！
```
# 右辺値参照を使えば一時オブジェクトを延命できる！
ここまでの説明だとあまり使う機会がなさそうに思いますが、
今から説明する機能はとても便利なので色んなところで使えるテクニックです。

UEの構造体FPathsにこういう関数があります。
```cpp
static FString GetPath(const FString& InPath);
```
これを使う時、
```cpp
FString Path = FPaths::GetPath(Fullpath);
```
こういう感じに使うと思いますが、これだとコピーが発生してしまいます。
こういう時は
```cpp
FString&& Path = FPaths::GetPath(Fullpath);
```
こう書くことでコピーせずにつかうことができます。
ちょっと待ってください。これは一時オブジェクトの参照を取っているので、次の行でこのオブジェクトは消えてしまうように見えます。
ですが大丈夫です。右辺値参照には ***一時オブジェクトの延命*** という機能があるため安全に利用することができます。

C++11で専用の&&という表記が追加される前は「const 変数名&」という書き方で同じことができていました。
なので以下のように書いても同じです。自分はこっち書き方の方をよく使います。
```cpp
const FString& Path = FPaths::GetPath(Fullpath);
```

#### 補足
こういう関数のreturnでわざわざMoveTemp(text)のように書かなくてもMoveコンストラクタを呼んでくれます。
returnしてるのでtext変数が不要なのは明白ですからね。
```cpp
FString GetText()
{
	FString text = TEXT("テキスト");
	return text; // returnの場合はMoveTemp(text)を省略してもOK
}
```

# まとめ
Moveがお得なのはMoveコンストラクタが定義さているクラスや構造体に限ります。
floatやint32、FVectorとかで使っても意味がないです。
UEだと

- TArray
- TMap
- FString
- FText

このあたりの型を扱う時に無駄なコピーが発生していないか？を意識できるようになるといいですね。

以上。
Fortigateログを暗号化してSyslogに送信する

# 概要
FortigateからMicrosoft Sentinelへ送信するログを暗号化します。ここで暗号化に使用する証明書は自己署名（オレオレ）証明書を使用します。

## 前提
暗号化未対応でMicrosoft Sentinelにログが送信できていること。送信方法について、以前Qiitaに記事を書いたので参照ください。

https://qiita.com/urushibata/items/449bee8e803e1e136f49

## 環境
- Fortigate-60F
- Ubuntu 20.04.4 (Azure VM)
- rsyslog 8.2001.0
```
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"

$ rsyslogd -v
rsyslogd  8.2001.0 (aka 2020.01) compiled with:
```

## 証明書とSyslogのTLS対応
CA証明書、SyslogのTLS対応は以下のリンクを参考にしてください。このページの手順でほぼできますが、私の環境ではcerttoolをインストールする時のパッケージ名が`gnutls-utils`ではなく`gnutls-bin`でした。
また、ポートは6514にしてください。Fortigateのデフォルトがこのポートのためここではこのポートで進めます。環境に合わせて変更してください。

```bash
$ sudo apt install -y gnutls-bin
```
https://qiita.com/saeki4n/items/198407c8710d769dfa55

## Fortigateの設定
CLIで暗号化を有効にします。ファームウェアのバージョンによるかもしれませんが、有効にするとポートが6514に変更されると思います。
```
config log syslogd setting
set enc-algorithm high-medium
end
```
CA証明書（上のリンクの手順で作成した場合、ca.pem）をアップロードします。
システム > 証明書 > CA証明書
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/530507eb-a923-8e1f-9c47-c43749a66ce5.png)

以上で設定完了です。
Numpy でよく使うもの

機械学習でNumpyを使っていく中でよく出てくるのになかなか覚えられないなーというものをメモします。

- np.dot: ベクトルの内積を求める
- np.zeros: ゼロを要素とする配列を生成
- np.exp: 底をネイピア数eとした指数関数の値を算出する