OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptことはじめ　Node.jsのインストール~eslintの設定まで

### はじめに
社内でTypeScriptの環境構築について説明する機会があったので、備忘録として記事にまとめることにしました。


#### TypeScriptとは？
**Typescriptはjavascriptを拡張して開発された新しいプログラミング言語**
特徴として***静的型付け***などがある。
元々のjavascriptは動的型付け言語。
ただ、TypeScriptを使用するとコンパイル時に型のチェックを行ってくれる。

#### そもそも静的型付け言語って何？
静的型付け言語とは変数や引数を使う場合にデータ型をあらかじめ宣言をする言語

#### 静的型付けを使う理由
**データ型の指定を誤ると、プログラムが意図しない動作をすることが多々ある。**
複数人が開発を行うチーム開発では、本来想定していないデータ型でソースコードを書いてしまう場合がある。

```typescript:hoge.ts
let hoge = 1;
hoge = hoge + 1;
console.log(hoge);
```
こんなコードがあったとする。
出力される結果は**2**が表示される。

```typescript:hogehoge.ts
let hoge = "1";
hoge = hoge + 1;
console.log(hoge);
```
このコードを実行すると、出力結果は**11**になる。

二つのコードの違いは変数のデータ型の違い。
このように型が違っていると、意図しない結果になる。

こういったミスを防ぐために**静的型付けで事前にデータ型の宣言**をしている。

```typescript:hogehoge.ts
let hoge :number = "1";
hoge = hoge + 1;
console.log(hoge);
```

このコードでは**hoge**という変数に対して**numberのデータ型**を指定している。

```
npx tsc hogehoge.ts
```
このコードをTypeScriptでコンパイルしようとした時に
データ型の指定が誤っているとエラー文が表示され、
コンパイルが失敗する。

### Node.jsのインストール
まずはNode.jsのインストールを行う

https://nodejs.org/ja

上がnode.jsの公式サイト。
こちらからダウンロードを行う。
特別な設定などいれない場合はデフォルトでいいと思います。

#### Node.jsをインストールする理由
npmを利用するため
→「npm」とはNode.jsのパッケージを管理するためのツール。
pythonで例えるなら、pipがパッケージ管理ツールになります。
npmにtypescriptというパッケージをインストールするためにNode.jsをインストールします。

#### Node.jsとは何か？
Node.jsとはサーバーサイドでもjavascriptを使用するために作られたjavascriptの実行環境

**Node.jsとは実行環境を指す**もので **Typescriptはプログラミング言語**

### Node.jsをインストール後~
#### プロジェクトの新規作成
Node.jsをインストールした後は
指定のフォルダで
```
npm init
```

npm initでプロジェクトの新規作成を行う

#### TypeScriptをインストール
```
npm install typescript
```

```
npx tsc --version
```
インストールが終わったら、バージョンを確認


#### TypeScriptのコンパイル
TypeScriptはtscコマンドを実行することで、tsファイルをjsファイルにコンパイルすることができる。
```
npx tsc hogehoge.ts
```
**これがTypeScriptのコンパイル時のコマンド。**
このコマンドを実行することで、**hogehoge.js**というjsファイルにコンパイルされた形でファイルが出力される。

このnpxとはNode.jsのパッケージの実行ツール。
パッケージをグローバルにインストールしている場合はnpxを省いても実行ができる。
グローバルでのインストールはnpm install時に-gをオプションを付ける。

ただ、**PJ毎によってTypeScriptのバージョンを使い分けたい場合**はローカルでインストールした方がいいと思います。

### Eslintのインストール
ESlintはJavascriptの静的解析ツール。
Eslintを設定しておくと、セミコロンを文末に付けることの規則を作成したり、クラス名の命名規則を設定できる。

```
npm install eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
```

```
npx eslint --init
```
上のコマンドでeslintの設定ファイル **.eslintrc**が作成される

vscodeで使用する場合はvscodeの拡張機能であるEslintをインストールする。

例:セミコロンの関連ルール
https://qiita.com/mysticatea/items/9da94240f29ea516ae87



### 参考にさせて頂いた記事
https://typescriptbook.jp/

https://qiita.com/mysticatea/items/9da94240f29ea516ae87
Xcodeで「Cannot find type ' XXXXXXX ' in scope」エラーに遭遇した際の対処法

ほんの少しの手間なのに、解消までとても時間がかかってしまいましたw
知っていたら5分で解決したのに・・・

Xcodeでアプリ開発をしていると、時折、ビルドエラーに直面します。
「Cannot find type 'XXXXXX' in scope」というエラーは、開発者がタイプやクラスを正しく認識できない場合に表示されます。
これが意味するのは、Xcodeが指定した型やクラスを見つけられないということです。




## 原因：
主な原因は、新しいファイルがアプリの「ターゲットメンバーシップ」に含まれていないことです。
「ターゲットメンバーシップ」とは、特定のファイルやクラスが、ビルドされるべきアプリのターゲット（例：iPhoneアプリ、Watchアプリなど）に含まれているかどうかを設定するものです。
この設定が間違っていると、Xcodeはファイルやクラスを認識できません。

## 解決方法

![スクリーンショット 2023-09-25 20.47.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884151/d881ba07-2047-6819-bb3d-3c761a4d710a.png)

Xcodeの左側にある「プロジェクトナビゲータ」から、問題のファイル（この場合、「XXXXXX」）を選択します。
右側の「ファイルインスペクタ」を開きます。
「ターゲットメンバーシップ」セクションで、該当するターゲットのチェックボックスがオンになっているか確認し、オフになっていたらオンにします。
変更を保存し、プロジェクトをビルドしてみましょう。
この簡単な手順で、エラーは解消されるはずです。
そして、変更内容はソースコード管理ツール（例えば、Git）で管理し、他のメンバーと共有するよう心掛けましょう。

エラーメッセージは初めて見るときは少し intimidating かもしれませんが、
一つ一つ丁寧に解決していくことで、少しずつ理解が深まり、スキルアップにつながります。
開発の旅を楽しみましょう！
【FastAPI】JSONデコードエラー発生時のハンドリング方法

# 概要
FastAPIフレームワークを使うとき、HTTPリクエストのバリデーションエラーが発生したときのエラーハンドリングを実装しました。今回は、JSONのデコードエラーの時の実装方法を紹介します。

# サンプルコード

FastAPIの`main.py`に以下のように実装。

```py
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    return JSONResponse(
        status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
        content=jsonable_encoder({"status": "xxxx",
                                  "msg": "xxxxxxxxx"}),
    )
```

上記コードでは、FastAPIの`@app.exception_handler`デコレータを使用して、`RequestValidationError`という特定の例外が発生した場合に、カスタムのエラーレスポンスを返すための関数（エラーハンドラ関数）を指定しています。

`async def validation_exception_handler(request: Request, exc: RequestValidationError):`は、エラーハンドラ関数のシグネチャ。`request`はHTTPリクエストオブジェクト、`exc`は例外クラス`RequestValidationError`を引数として受け取ります。

関数本体では、`JSONResponse`を使用してエラーレスポンスを作成。
`jsonable_encoder`は、PythonオブジェクトをJSONエンコード可能なデータに変換する関数です。

`HTTP_422_UNPROCESSABLE_ENTITY`は、リクエストが受け入れ可能な形式ではない場合やリクエストが処理できない場合に使用されるHTTPステータスコード（400番台は「クライアントエラー」ですね）。
今回はJSONリクエストの形式エラーが発生した場合に適用しています。

参考：FASTAPIの公式ドキュメント
[Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/#use-the-requestvalidationerror-body)
一份好的statement of purpose怎麼寫？

"[美國工作](https://www.apexcharity.org/news/3/85)是近年來台灣年輕人追求的夢想之一，透過[海外工作](https://www.apexcharity.org/news/3/86)或[海外實習](https://www.apexcharity.org/news/3/87)，不僅可以獲得國際經驗，更能開拓視野，提升自我價值。然而，要成功進入美國工作市場，除了具備相關專業知識和技能外，一份精心打造的statement of purpose也是相當重要的。

什麼是[statement of purpose](https://www.apexcharity.org/news/3/90)呢？它是一份個人陳述，用來向美國的機構或公司展示你的專業背景、工作經驗和未來目標。這份文件的撰寫要點是要清楚明確地表達你為什麼想在美國工作，你的動機和目標是什麼，以及你能為該機構或公司帶來什麼價值。

首先，一份好的statement of purpose應該具有清晰的結構和流暢的語言。在撰寫之前，你應該先列出自己的主要觀點和想要傳達的訊息。然後，按照一個有邏輯性的結構來安排你的內容，例如先介紹自己的背景和專業技能，再說明你為什麼選擇美國作為工作地點，最後提及你對該機構或公司的興趣和貢獻。

其次，一份好的statement of purpose應該能夠展現你的個人特質和專業價值。你可以舉例說明你在過去的工作或實習中所取得的成就和貢獻，以及你在解決問題、團隊合作和領導能力方面的優勢。同時，你也可以提及你對行業的熱情和學習熱忱，以及你對未來的發展和成長的期望。

另外，一份好的statement of purpose應該是獨特且具體的。避免使用陳詞濫調和空洞的描述，而要專注於展示你的個人經歷和成就。你可以舉例說明你在某個專案中所扮演的角色和所取得的成果，並具體說明這些經驗如何與你未來的工作目標相關聯。

最後，一份好的statement of purpose應該是精心編輯過的。在撰寫完畢後，不要馬上送出，而是仔細檢查拼寫和語法錯誤，並確保每個段落和句子都清晰明確。你也可以請求他人的意見和建議，以確保你的statement of purpose能夠充分展示你的專業價值和獨特之處。

總結而言，一份好的statement of purpose是進入美國工作市場的關鍵文件之一。透過清晰明確的結構和流暢的語言，展現你的個人特質和專業價值，並通過精心編輯來確保文件的質量。只要你花足夠的時間和精力來撰寫，相信你能夠為自己在美國工作的夢想打下堅實的基礎。"
Unityのパッケージインポートが終わらない

2023/09/25 : 初稿
2023/11/08 : 追記
Unity : 2021.3.29f1

- 2023/11/08追記分

原因判明。エディタ拡張で
.csや.shaderに対してAssetPostProcessorで
文字コードをUTF8に書き換えているのですが、
この処理がPackagesフォルダ以下のファイルにも行われていました。
パスが"Assets/"で始まるもののみに絞ることで発生しなくなりました。

- 発生問題

プロジェクト開いたり、別のアプリに切り替えて戻ってきたりするたびにパッケージのreimportが走ってちっとも操作できない、みたいな症状に悩まされてます。

MacでもWindowsでも発生。マシンによって出ないこともあるようですが↓こんなwarningが出ます。

the package cache was invalidated and rebuilt because the following immutable asset(s) were unexpectedly altered:
packages/com.unity.timeline/runtime/scripting/playabletrack.cs
...(以下たくさんファイルが列挙される）

まだ解決方法が見つかってないのですが、一番楽な回避策？を書いときます。

Unityで該当プロジェクトを開いたら、

Packages/manifest.json

をメモ帳なりCotEditorなりで開きます。で、適当にどこかにスペース文字でも書き込んで保存。書き込んだスペース削除してもっかい保存。

要はcygwinやterminalでtouchコマンド使えばいいのですが。とりあえずテキストエディタで開いて無理やり上書きする、ですw。っと、ファイルコピーして差し替える方が楽かもでした。バッチファイルとか作ればいいんだろうけど面倒臭い。

ともあれ、このあとUnityに戻すと、一回だけインポートが走るものの、上記のwarningが出ず、以降はインポート走らなくなります。謎。
【Firebase】Cloud Firestoreを使ってみる。

個人アプリを作るにあたってFirebase「Cloud Firestore」を使うことにしました。
NoSQLも初めてだったのでハンズオン的な記事を参考に作っていくことに。

https://qiita.com/asameshiCode/items/a9bf530f6680d936dc75#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E3%81%A7%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B

上記を参考に作っていきます。

## Firestoreの設定
キーを取得する場所に迷ったのでメモ

歯車マーク>全般>アプリ追加からキーを発行できる。
![スクリーンショット 2023-09-25 19.19.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/2b202b60-de92-173c-ebe1-3efcb5bb472d.png)

こんな感じでTODOの課題を追加されたものが同期している。
![スクリーンショット 2023-09-25 19.22.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/27a672d5-4987-c1f2-725c-12c57558f9b2.png)
![スクリーンショット 2023-09-25 19.22.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/d4de5ee1-6f48-235b-3ab8-2c39631de666.png)

## NoSQLで知ったことまとめ
非正規化を推奨
NoSQLデータベースのFirestoreはデータの正規化よりも非正規化を推奨します。データが頻繁にアクセスされ、変更されない場合は、データの非正規化を検討。

結果整合性
結果整合性（Eventual Consistency）は、分散システムにおけるデータの整合性のモデルの一種で、リアルタイムでの厳格な整合性を犠牲にすることで、システムの可用性やパフォーマンスを向上させることを目指しています。

スキーマ管理はせずに、データベース管理をしてるみたいです。
実務ではどのように運用してるのか。。。時間があったら探ってみます。
ステージ１課題解読　2023/9/23~2023/10/8プロジェクト

## 1.はじめに
メインの記録は[こちら](https://qiita.com/yuyas7/items/b8b2693024172af556df)
課題についての理解を深めるため
# 2.課題
クライアントがサーバに接続する形式のチャットメッセンジャーサービスを作成します。
サーバはバックグラウンドで稼働し、一方でクライアントはCLIを通じてサーバに接続します。
接続が確立された後、クライアントはメッセージを入力してサーバに送り、そのメッセージはサーバに接続している他の全てのクライアントにも配信されます。
### 解読
client.py（クライアント）, server.py（サーバ）のファイルを作る。
server.pyを先に起動させる。（起動したら動き続ける）
client.pyを起動させTCP形式で接続を確立させる。（複数でも可）
クライアントがメッセージを入力してから、UDP形式でサーバにメッセージを送信させる。
サーバーがメッセージを受け取ったら、他の全てのクライアントにUDP形式でメッセージを配信させる。
# 3.機能要件
・サーバをCLIで起動し、バックグラウンドで着信接続を待ち受ける。
→　サーバから起動させないとクライアントを起動させても意味ないよ。（チャットサービス自体が停止している）
・サーバとクライアントは、UDPネットワークソケットを使ってメッセージのやり取りをする。
・メッセージ送信時、サーバとクライアントは一度に最大で4096バイトのメッセージを処理します。
→ bufsize = 4096
・セッションが開始される際には、クライアントはユーザにユーザー名を入力させる。
・メッセージの送信プロトコル
メッセージの最初の1バイト"usernamelen"は、ユーザ名の全バイトサイズを示す。
→最大で２５５バイトになる。
サーバは、はじめの"usernamelen"バイトを読み、送信者のユーザ名を特定する。
その後のバイトは送信される実際のメッセージ。
この情報はサーバとクライアントによって自由に使用され、ユーザ名の表示や保存が可能。
stack = [message, usernamelen]
pop()して情報を読み取るイメージかな
・バイトデータはUTF-8でエンコードおよびデコードされる。
・サーバにはリレーシステムが組み込まれている。
現在接続中の全てのクライアントの情報を一時的にメモリ上に保存する。
新しいメッセージがサーバに届くと、そのメッセージは現在接続中の全クライアントにリレーされます。→リレー？
・クライアントは、何回か連続で失敗するか、しばらくメッセージを送信していない場合、自動的にリレーシステムから削除されます。
→TCPと違い、UDPはコネクションレスであるため、各クライアントの最後のメッセージ送信時刻を追跡する必要がある。
→例えば、3時間以上連絡なかったら自動的にログアウトにする形かな

# 4.非機能要件
・チャットメッセージングシステムは、リアルタイムのデータの優先度が信頼できるデータよりも高いとされている。
→TCPよりUDPが適している
・システムは、毎秒最低で10,000パケットの送信をサポートする必要がある。
【PHP】PHPカンファレンスJapan 2023の開催を全世界に宣伝してきた

[PHP公式サイト](https://www.php.net/)には[カンファレンス](https://www.php.net/conferences/)の項目があります。
なんと、ユーザ主催で行われるカンファレンスも公式で紹介してくれるんですよね。


さて、それでは2023/10/08に行われる[PHP Conference Japan 2023](https://phpcon.php.gr.jp/2023/)も紹介されているんだろうなあと思ったら何故か入っていませんでした。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/0d059b07-3ccc-9f54-4c8b-1df463f62e5c.png)


なんなら2022年のカンファも載っておらず、[2021年が最後](https://www.php.net/archive/2021.php#2021-07-13-1)でした。
どうして。

ということで[PHP Conference Japan 2023を全世界に宣伝してきました](https://www.php.net/archive/2023.php#2023-09-06-1)。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/2093ca4c-8e4e-a8da-cd0b-dff31a17548f.png)


# 手順

[Want to see your conference appear here?](https://wiki.php.net/conferences)という解説ページがあるので、この手順に従うだけです。

とりあえず[Webサイトのリポジトリ](https://github.com/php/web-php)を[fork](https://github.com/NurseAngel/web-php)して手元に持ってきます。
次いでコマンドラインから`path/to/php "bin/createNewsEntry"`って打つと対話型コマンドが起動します。
`php`がついてるのはWindowsだからなので、Linuxであれば直接`bin/createNewsEntry`だけでいいと思います。

あとは指示に従ってタイトルとか日程とか本文とかを入れていけば、自動的に[ファイルが生成されます](https://github.com/NurseAngel/web-php/blob/master/archive/entries/2023-09-06-1.xml)。
らくちん。

最後は[プルリクを出して終了](https://github.com/php/web-php/pull/811)ですが、これはGitHubの画面上から行うのが、いちいちコマンドを打ったりする必要もなく手っ取り早いのでお勧めです。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/6b433b29-1b80-d41e-491a-cf222fee9220.png)


もちろん私はPHP本体にマージする権限など持っていないので、あとはメンテナのマージ待ちです。
今回はリリースまで2週間ほどかかりました。
長い。

そういえば「画像はないのかい？」ってリプが来てたのを後で返そうと思っていたらそのまま忘れてました。
たしかプルリク出した当時は公式サイトにロゴ画像がなかったと思うんですが、今見たらロゴありますね。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/a4a49d6b-dc30-84d8-3791-7c83eb5e5173.png)

誰かかわりにやっといてください。

# 感想

私は[PHP Conference Japan](https://phpcon.php.gr.jp/)の主催でもスポンサーでもなく、それどころかスピーカーやスタッフとして参加したことがあるわけでもなく、そもそも現地に行ったことすら一度もありません。
そんな完全なる赤の他人が勝手にこんなプルリク出していいのかよと思わないでもないですが、まあOSSなんでそんなものでいいんじゃないですかね。

なお、紹介文は[ここの概要](https://fortee.jp/phpcon-2023)を適当に訳しただけです。
他のカンファレンス紹介にはロゴ画像が付いているのに、Japan2023だけついてないのも寂しいですね。
そういうのが気になる場合はきっと誰かがプルリク出してくれるでしょう。たぶん。

ちなみに、私は今回もPHPカンファレンスに行くつもりはありません。

理由？
めんどくさい。
[Haskell] ダブルクォーテーション (") を付けずに文字列を表示する

`String` 型の文字列をそのまま表示したい場合は以下のようにします:

- `print` でなく `putStrLn` を用いる
- `show` は 不要

`print` は `putStrLn . show` と同じ動作をするため、`print . show` としてしまうと `putStrLn . show . show` という意味になります。

文字列型以外では `print` のみを使用するか、または `show` の戻り値を `putStrLn` に渡します。

```haskell
main :: IO ()
main = do

    let string = "foo" :: String
    putStrLn (show string :: String)
    print string
    putStrLn string -- そのまま表示

    let int = 23 :: Int
    print (show int :: String)
    print int                     -- そのまま表示
    putStrLn (show int :: String) -- そのまま表示
```

※説明のために `show` の戻り値の型 `String` を明示していますが、実際は不要です。

```text:実行結果
"foo"
"foo"
foo
"23"
23
23
```

参考「[putStrLn - System.IO](https://hackage.haskell.org/package/base-4.19.0.0/docs/System-IO.html#v:putStrLn)」
参考「[print - System.IO](https://hackage.haskell.org/package/base-4.19.0.0/docs/System-IO.html#v:print)」
参考「[show - Text.Show](https://hackage.haskell.org/package/base-4.19.0.0/docs/Text-Show.html#v:show)」
[UEFN][Verse]非同期関数の呼び出しをイベントにバインドされた関数から呼び出す

# はじめに

こんにちは、XRエンジニアの[イワケン](https://twitter.com/iwaken71)です。最近はUEFNとVerse言語を触っています。

最近Verseでこんな処理を書きたいときがありました。

- Buttonを押したら、毎秒ごとにコインをGetするシステムを起動する

そのために以下のコードを書いたのですが、エラーがでました。

```python

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

coin_system_device := class(creative_device):

    #ButtonをEditorから参照できるようにする
    @editable
    StartCoinSystemButton:button_device = button_device{}

    OnBegin<override>()<suspends>:void=
        OnStartIncomeButton.InteractedWithEvent.Subscribe(OnTriggerStart)

    #Buttonが押されたら呼び出す関数
    OnTriggerStart(Agent:agent):void=
        LaunchGetCoinSystem(Agent) #この文がエラーが出る

    #1秒ごとにコインを付与するloop実装を始める関数
    LaunchGetCoinSystem(Agent:agent)<suspends>:void=
        loop:
            Sleep(1.0)
            GiveCoin(Agent) #コインを付与する実装、中身は今回省略
    
```

`LaunchGetCoinSystem(Agent)`の行に次のようなエラーがでます。

```
This invocation calls a function that has the 'suspends' effect, which is not allowed by its context.(3512)
```
日本語訳で

> この呼び出しは、そのコンテキストで許可されていない「suspends」効果を持つ関数を呼び出している(3512)。

suspendsとは、エフェクト指定子の一つであり、 関数が非同期であることを示します。また関数本体の async コンテキストを作成します。([参考ドキュメント](https://dev.epicgames.com/documentation/ja-jp/uefn/specifiers-and-attributes-in-verse))

つまり、非同期関数であるLaunchGetCoinSystem関数をどうにかする必要があります。

# 結論 spawnを使う

結果次のようなコードで解決
`spawn{}`で非同期関数を囲います。その事により、async以外の関数で呼び出すことができます。([参考ドキュメント](https://dev.epicgames.com/documentation/ja-jp/uefn/spawn-in-verse))

```python
    #Buttonが押されたら呼び出す関数
    OnTriggerStart(Agent:agent):void=
        spawn{LaunchGetCoinSystem(Agent)}
```

# Verse言語の並列処理に関して少し調べる

これらを理解するために、Verse言語の並列処理に関してのお作法を紹介します (理解している範囲で)

https://dev.epicgames.com/documentation/ja-jp/uefn/concurrency-overview-in-verse

## asyncコンテキストとsuspendsエフェクト指定子

Verseの式(expression)はimmediateとasyncのいづれかになります。つまり、遅延なく評価される式(immediate)か、評価に時間がかかる可能性がある式 (async)です。

このasync式は、asyncコンテキストを持つ場所じゃないと使えません。asyncコンテキストを持つ場所が、**suspendsエフェクト指定子を持つ関数**の本体です。

先程のエラー文は「suspendsエフェクト指定子を**持たない**関数」の中で、async式を呼ぼうとしたのでエラーが出たのです。
じゃあ、「OnTriggerStart関数をsuspendsつければいいじゃない？」と思うのですが、button_deviceのイベントにバインドしているためそれができないのです。

## **spawn式**はasync関数をasyncコンテキスト外でも呼び出せる

spawn式の特徴は

- ①async関数を呼び出せる
- ②asyncコンテキストの内側、**外側**どちらでも呼び出せる
- ③spawn式の後ろの式は、spawn式の評価を**待たずに実行される**

並列処理、非同期処理を扱える式がいくつかあるのですが、**asyncコンテキストの外側で実行できる式はspawn式だけです。**([参考ドキュメント](https://dev.epicgames.com/documentation/ja-jp/uefn/concurrency-in-verse))

ただし③の特徴のように、評価の結果を待たないため、結果を待つ処理をしたい場合は、asyncコンテキストの中で別の非同期処理を扱うコードを書く必要がありそうです。

spawn式の処理フローはこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/e618c3e2-9cbe-cd02-be15-98e5799cac51.png)
図の引用: https://dev.epicgames.com/documentation/ja-jp/uefn/spawn-in-verse
Linux のプロンプトを Windows のように変える方法

# はじめに

どこに需要があるか分かりませんがLinuxのプロンプトをWindowsのように変える方法を書きます。プロンプトってのはコマンドを打つところより左の部分です。`~/.bashrc`の末尾で環境変数 `PS1` を代入してあげればよいです。

# ちょっと寄せる

```bash: ~/.bashrc
export PS1='C:$PWD>' # コマンドプロンプト風
export PS1='PS C:$PWD> ' # PowerShell風
```

```: 例
C:/home/user>ls
PS C:/home/user> ls
```

# ディレクトリの区切りを\に変える

何で Windows って区切りがバックスラッシュなんでしょうかね？

```bash
export PS1='C:${PWD//\//\\\\}>' # コマンドプロンプト風
export PS1='PS C:${PWD//\//\\\\}> ' # PowerShell風
```

```: 例
C:\home\user>ls
PS C:\home\user> ls
```

# ディレクトリの区切りを¥に変える

もはや日本人にしか分かりません。

```bash: ~/.bashrc
export PS1='C:${PWD//\//¥}>' # コマンドプロンプト風
export PS1='PS C:${PWD//\//¥}> ' # PowerShell風
```

```: 例
C:¥home¥user>ls
PS C:¥home¥user> ls
```
JavaScriptエラーを分類することで傾向把握して効率的に分析

# 概要
ユーザーの手元のブラウザ上で発生したJSエラーの情報は、通常は**サービス提供者が把握することが難しい**ですが、New RelicのBrowserエージェントを使うことで、**ユーザーのブラウザ上で発生したJSエラーを分析することができます**。

こちらの記事ではNew Relicを使って、**ユーザーの手元のブラウザで発生したJSエラーをOSやブラウザの種類などでグループ化して分析**してみました！

:::note info
このアップデートの詳細はこちら。[New Relic アップデート(2023年7月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202307 "New Relic アップデート(2023年7月)")
:::

Browserエージェントに関する公式ガイドはこちら

https://docs.newrelic.com/jp/docs/browser/browser-monitoring/getting-started/introduction-browser-monitoring/


# 手順
## 1. Browserの画面でGroup errorsを開く
New RelicのBrowserからアプリケーションを選び、Errors(errors inbox)を開きます。TriageタブとGroup errorsタブが表示されるので、Group errorsタブをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/cf7f7326-769f-c9ad-5e30-6ae23a32eaa8.png)

## 2. エラーメッセージでグループ化(デフォルト)
デフォルトでは、エラーメッセージでグループ化されています。
これにより、エラーメッセージ毎の発生回数（Occurrences）やいつ発生したか（First occurred, Last occurred）を把握することができます。
まずはざっくりと、**どのエラーメッセージが多く発生しているか**確認するのに使えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/3624e095-0516-9ba9-1cc9-a4df8b278de2.png)


## 3. グループ化する観点を選ぶ
Group byの下矢印をクリックすると、どんな観点でグループ化するか選択することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/b8bf26df-72f4-dd20-f334-9914e7ae8867.png)

例えば、このような属性を選択可能です。
| 属性 | 説明 |
|:-|:-|
|countryCode|アクセス元の国コード|
|userAgentOS|OSの種類|
|userAgentName|ブラウザの種類|
|deviceType|モバイル/デスクトップの種類|
|pageUrl|エラーが発生したURL|

今回は、userAgentOS(OSの種類)とuserAgentName(ブラウザの種類)を追加選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/106bec72-a99a-5902-5fa8-38cd8b9e1ff7.png)

## 4. エラーメッセージとOSとブラウザの組み合わせ毎に分析
エラーメッセージとOSとブラウザの組み合わせ毎に、発生回数（Occurrences）やいつ発生したか（First occurred, Last occurred）がグループ化されて表示されているのがわかります。

こちらの例では、最も多く発生している`Unexpected JS Error`はWindowsのIEで多発していることがわかりますし、また、`Time out loading ./js/couponSpecial.js`はOSやブラウザに限らず発生していることを読み取ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/09fcc8ec-18ca-2bc2-9152-3a3d8074852b.png)

## 5. エラーメッセージを選んで詳細分析
エラーを選択すると詳細画面が開き、時系列での発生状況や、スタックトレースの情報など、エラー自体の詳細分析ができるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/c2888437-d39c-a521-1ac0-8b8ee4710af3.png)

# まとめ
OSやブラウザの種類でエラーメッセージを分類することで、**どのようなOSやブラウザでどんなエラーが多く発生しているか**傾向を掴むことができました。`アクセス元の国コード`や`エラーが発生したURL`など**別の属性でグループ化することで、また違った傾向を掴むことができる**ので、ぜひ試してみてください。


:::note info
このアップデートの詳細はこちら。[New Relic アップデート(2023年7月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202307 "New Relic アップデート(2023年7月)")
:::

:::note info
[New Relic株式会社のQiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::
iTerm2の背景色をアクセスしたサーバごとに変える小ネタ

# 執筆の経緯

現在フリーランスで活動しています。この度新しい案件に参画することが決まったので、現在の現場で使っていた便利な小ネタなどをメモしておきたいと思い、この記事を書きます。

# やること

開発でiTeam2を使っています。背景色の変更や画面の分割がしやすいためです。現場では複数のGCEインスタンスで作業をしているのですが、アクセスするインスタンスを間違え無駄な時間を過ごした経験があります。例えば、GPU環境だと思ってNLPの学習を始めたら、実際にはCPU環境で非常に時間がかかってしまったり、CPU環境にしかないデータをGPU環境で探してしまったり。。

そんな、アクセスするインスタンスを間違えた時にすぐに気付けるように、アクセスするインスタンスごとにiTerm2の背景の色を変えようと思います。

具体的には、インスタンスにアクセスしたとき、下の画像のような見た目にします。
※滅茶苦茶に雑ですが、セキュリティ的に問題ない環境で実行してから画像を置き換えます。許してください。

![iTerm2_色2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562829/bb00bcf5-2e72-018e-72f5-2678709f1de4.jpeg)

↓サーバにアクセス

![iTerm2_色1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562829/bef2fdff-5eb1-3ff7-1a88-7fbf65c74817.jpeg)


# 実行環境
- MacBook Pro, Apple M1
- zsh
- iTerm2, Build 3.4.20

# やったこと

1. アクセスするインスタンスに名前をつける
1. スクリプトを作り、インスタンスごとに色を設定する
1. エイリアスを設定する

この順番に書きます。

## 1. アクセスするインスタンスに名前をつける
[こちら](https://qiita.com/sekine345/items/bd4df798ea44a4735471)の記事にあるように、以下のファイルを作ります。

```~/.ssh/config
#User sekine
#IdentityFile ~/.ssh/id_rsa

Host gpu_server
    HostName        111.111.111.111
    User            sekine
    IdentityFile    ~/.ssh/id_rsa

Host cpu_server
    HostName        222.222.222.222
    User            sekine
    IdentityFile    ~/.ssh/id_rsa

```

## 2. スクリプトを作り、インスタンスごとに色を設定する
以下のようなファイルを作ります。

```~/.zsh/ssh-item-setting
#!/bin/zsh
​
set_color() {
  local HEX_BG=$1
  local OPACITY=$2
​
  local BG_R=`echo $HEX_BG | sed 's/../0x&,/g' | awk -F "," '{printf("%d",$1 * 257)}'`
  local BG_G=`echo $HEX_BG | sed 's/../0x&,/g' | awk -F "," '{printf("%d",$2 * 257)}'`
  local BG_B=`echo $HEX_BG | sed 's/../0x&,/g' | awk -F "," '{printf("%d",$3 * 257)}'`
​
  /usr/bin/osascript <<EOF
tell application "iTerm2"
   tell current session of current window
      set background color to {$BG_R, $BG_G, $BG_B} 
      set transparency to "$OPACITY" 
   end tell
end tell
EOF
}
​
# 接続host名で振り分け
if [[ "$@" =~ cpu_server ]]; then
   # 色・透明度設定
   set_color 233B6C 0.05 
elif [[ "$@" =~ gpu_server ]]; then
   set_color 30000 0.1
fi
​
ssh $@
​
set_color 2f4f4f 0.05
```

`set_color`という関数を作って、引数で16進数のカラーコードと透過率を渡します。最後の`set_color 2f4f4f 0.05`はローカルの色設定です。`ssh`でのアクセスを`exit`で終えるとこの色に戻るようになっています。

スクリプトができたらパーミッションを￥変更しておきましょう。
```shell
chmod 755 ~/.zsh/ssh-item-setting
```

## 3. エイリアスを設定する
`.zshrc`ファイルでエイリアスを設定し、`ssh`コマンドを実行したときに、今作ったスクリプトを実行するようにします。

```.zshrcに追記
alias ssh='~/.zsh/ssh-item-setting'
```

以上で、アクセスしたサーバーごとに背景色を変えることができました。あとはいつも通りsshでアクセスするのみです。
```shell
ssh gpu_server
```

# 備考
このやり方は、「あー背景の色変えてーなー」って思った時に目についた中で最もやりやすそうなものでした。今調べればもっとやりやすいものがあるかもしれないです。もしもっと良いやり方がありましたら教えてください！
[ESLint] Node.jsのES Modulesで__filenameや__dirnameを使ったらエラーにする

# ES Modulesでは`__filename`と`__dirname`は使えない

Node.jsのES Modulesでは、以下のグローバル変数は存在しないため使用できません。

- `require`
- `exports`
- `module`
- `__filename`
- `__dirname`
- `global`

しかし、現状ではこれらの変数を使ったコードを**TypeScriptの型チェックで弾く方法はありません**。

詳細は以下のissueやdiscussionを参照してください。

https://github.com/DefinitelyTyped/DefinitelyTyped/issues/42201

https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/66780

現在はDefinitelyTypedが対応するのを待つしかないようです。

# __filenameや__dirnameの使用をESLintで弾く

前述したように、TypeScriptの型チェックで弾くことはできません。しかし、実行時エラーになるのは避けたいです。

そこで、ESLitntを使ってこれらの変数を静的解析で弾くことを考えます。

### ESLintのFlat Configを使っている場合

`languageOptions`プロパティに`globals.node`ではなく`globals.nodeBuiltin`を指定します。

```diff_typescript:eslint.config.js
 import globals from "globals";

 // ...(中略)

     languageOptions: {
-      globals: globals.node,
+      globals: globals.nodeBuiltin,
     },
```

`globals`パッケージの`nodeBuiltin`という定義を利用しています。

> For Node.js this package provides two sets of globals:
> - `globals.nodeBuiltin`: Globals available to all code running in Node.js. These will usually be available as properties on the `global` object and include `process`, `Buffer`, but not CommonJS arguments like `require`. See: https://nodejs.org/api/globals.html
> - `globals.node`: A combination of the globals from `nodeBuiltin` plus all CommonJS arguments ("CommonJS module scope"). See: https://nodejs.org/api/modules.html#modules_the_module_scope
>
> When analyzing code that is known to run outside of a CommonJS wrapper, for example, JavaScript modules, nodeBuiltin can find accidental CommonJS references.
出典：https://www.npmjs.com/package/globals

> (翻訳)
Node.jsに対して、このパッケージは2つのグローバル変数の定義を提供します：
> - `globals.nodeBuiltin`：Node.jsで実行されるすべてのコードで利用可能なグローバル変数。これらは通常、`global`オブジェクトのプロパティとして利用可能で、`process`や`Buffer`が含まれますが、`require`のようなCommonJS用変数は含まれません。参照: https://nodejs.org/api/globals.html
> - `globals.node`：`nodeBuiltin`のグローバル変数とCommonJS用の全ての変数の組み合わせ（「CommonJSモジュール・スコープ」）。参照: https://nodejs.org/api/modules.html#modules_the_module_scope
>
> CommonJS以外で実行されることが知られているコード、例えば JavaScript モジュールを分析するとき、`nodeBuiltin` は偶発的に参照されているCommonJS変数を見つけることができます。
出典: https://www.npmjs.com/package/globals

他のグローバル変数も無効化したい場合は、以下のように書きます。

```ts:eslint.config.js
import globals from "globals";

// ...(中略)

    languageOptions: {
      globals: {
        ...globals.nodeBuiltin,
        process: "off", // 例: グローバル変数processを無効化できる
      },
    },
```

### 設定ファイルが`.eslintrc`形式の場合

Flat Configではなく古い形式の設定ファイルを使っている場合、以下の設定を行うことで個別にグローバル変数を無効化できます。

```json:.eslintrc
  "env": {
    "node": true
  },
  "globals": {
    "require":"off",
    "exports":"off",
    "module":"off",
    "__filename":"off",
    "__dirname":"off",
    "global":"off"
  }
```

`globals`プロパティに使用したくないグローバル変数を`off`と設定することで、ソースコード中で使用した場合にESLintでエラーを出すことができます。

# まとめ

- `__filename`や`__dirname`が使えるのはCommon JSのみ。ES Moduleでは使えない。
- しかし、2023年9月現在では**ES Moduleのコードで`__filename`や`__dirname`を使っても型エラーにならない**。
- ESLintで`__filename`や`__dirname`の使用をエラーにするには、以下の方法を使う
    - Flat Configを使用している場合：`globals.nodeBuiltin`を設定する
    - Flat Configを使用していない場合`globals`プロパティを設定することでグローバル変数の定義を制御できる。
【GitHub】GitHubモバイルアプリの通知はオンにすべし

# はじめに
PRのレビューが来てたり、メンションが来てたりしても気付かなかったりします。
そんな時にGitHubモバイルアプリの通知設定です。

# 設定方法
プロフィールタブに移動します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/95023dbb-664a-1ef6-a989-10a926b01905.jpeg" width=50%>

右上の歯車アイコンを選択します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/52c8a682-4836-9d99-c6ef-188ce8f8dc1b.jpeg" width=50%>

「通知」を選択します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7667ea98-5ee2-3420-98ec-e9681a26dd2e.jpeg" width=50%>

通知を受け取りたいものをオンにします

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/88e5fba8-5f25-c281-9035-2e0f95b15373.jpeg" width=50%>

# おわり
勤務時間のみ通知を受け取るという設定も可能なのでめっちゃ便利だとおもいます！
Firestore のポイントインタイムリカバリを試してみた

# はじめに
開発や運用にミスはつきものです。

- 間違ってデータを更新してしまった
- 間違ってデータを削除してしまった
- 不具合でデータが変になってしまった

こんな経験はありませんか？
私も新人の時に経験がありますが、ヒヤヒヤしますね。

対応策もいろいろありますが、今回はバックアップからの復旧の一つの案ということで Firestore の ポイントインタイムリカバリ を紹介したいと思います。

# 対象読者
- データベースに Firestore を使っている方
- バックアップの方法を検討している方

# ポイントインタイムリカバリ (PITR) とは
[障害復旧計画](https://cloud.google.com/firestore/docs/disaster-recovery?hl=ja#point_in_time_recovery_pitr) として公式のドキュメントに以下のように記載されています。

> PITR を有効にして、最長で過去 7 日前までのドキュメントを読み取りできるようにします。粒度レベル 1 分でデータを読み取り、目標復旧時間（復元までの最大時間）を 0 にして正確にデータベースに書き戻すことができます。目標復旧時点（許容される最大データ損失）は 1 分です。

過去7日間の指定した日時(1分単位)の時点のドキュメントを取得できるようになるようです。
これを見るだけで便利そうですね。

# 設定方法
とても簡単でした！
gcloud cli を使った方法もありますが、今回はコンソールからの設定方法を記載します。
```
GCP コンソール
-> メニューから Firestore をクリック
-> データベース default をクリック
-> メニューから 障害復旧 をクリック
-> 設定のところの 編集 ボタンをクリック
-> ポイントインタイムリカバリを有効にする にチェックを入れて保存
```
![設定方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143332/209f25f3-8872-9cbc-bb53-10556343145f.png)
設定すると以下のように表示されます。
デフォルトで保持期間は7日間になっているようです。
![設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143332/2ef77e8e-d6e6-87d1-16e9-3650bd3862d3.png)

# データの確認方法
まずは GCP のコンソールから見てみましょう。
![GCP コンソールから見たデータ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143332/761eb581-a4ab-ffa0-2fca-c8d44c92a7e9.png)
フィールドには `name: "zzz"` と表示されていますね。

続いて、過去のデータを見てみましょう。
いろいろ方法はあるようですが、今回は [Firefoo](https://firefoo.app/) を使って確認したいと思います。
( やることは同じですので、もちろんプログラムを書いて確認しても大丈夫です。 )

- 2023/09/25 17:25:00 のデータを確認
17:25 時点では `name: "xxx"` であることがわかります。
![スクリーンショット 2023-09-25 17.31.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143332/1d2dfb81-a9cc-15f7-8ad3-9bb6987b3272.png)

- 2023/09/25 17:30:00 のデータを確認
17:30 時点では `name: "zzz"` であることがわかります。
![スクリーンショット 2023-09-25 17.32.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143332/fc153b16-c1de-90ca-0cdf-0c20075abc6d.png)

このように過去7日前までのデータを確認することができます。
冒頭で紹介した以下のような場合には、変更/削除前のデータを確認し、復旧に役立てることができます。

- 間違ってデータを更新してしまった
- 間違ってデータを削除してしまった
- 不具合でデータが変になってしまった

# エクスポート/インポート
ポイントインタイムリカバリを利用して、指定時点の状態に全てを戻したい場合には、エクスポート/インポートが有効だと思います。
今回こちらには触れませんが、興味のある方は公式の [整合性のある PITR バージョンからのエクスポートとインポート](https://cloud.google.com/firestore/docs/use-pitr?hl=ja#export_and_import_from_a_consistent_pitr_version) を参照ください。

# まとめ
バックアップ、障害復旧の一つの案として、ポイントインタイムリカバリを紹介しました。
まだ少し試してみただけですが、設定が驚くほど簡単で、特に運用/保守フェーズでの使い勝手が良さそうです。
唯一お値段が気になるところですが、実際どのくらいの規模でいくらかかるのか分かりづらいのが従量課金の難しいところですよね。
この辺は運用しながら見ていきたいと思います。
お値段についての計算方法は参考のURLを貼っておきます。

ここまで読んで頂き、ありがとうございました。

# 参考
- 概要
    - [ポイントインタイム リカバリ（PITR）の概要](https://cloud.google.com/firestore/docs/pitr?hl=ja)
    - [ポイントインタイム リカバリ（PITR）の操作](https://cloud.google.com/firestore/docs/use-pitr?hl=ja)

- 料金関連
    - [PITR の料金](https://cloud.google.com/firestore/docs/pitr?hl=ja#pricing)
    - [PITR データの単価](https://firebase.google.com/docs/firestore/pricing?hl=ja#select-region)
    - [PITR データについて](https://firebase.google.com/docs/firestore/pricing?hl=ja#pitr_data)
名前解決のためにresolv.confの設定変更をする（OS:SLES 15 SP4）

# 背景

サブスクリプション Bに存在するサーバの名前解決をさせたくて色々試行錯誤していたら、結構悩んだことがあったのでブログ化しました！

環境の構成は、以下になります。
* テナントが同じでサブスクリプションが2つある。
* サブスクリプション AにはDNSサーバが存在する。
* サブスクリプション Bに名前解決させたSLESサーバが存在する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3521211/dc97dc6c-db68-4f09-a60f-a7ba1ca8fcb7.png)

# 名前解決させるために実施した手順
以下手順を実施して、名前解決をさせます。

* サブスクリプション A側に存在するDNSサーバのAレコードにSLESサーバのドメイン名を追加する。
* SLESサーバが属しているVnetもしくは、SLESサーバに紐づいているNICに対して、DNSの設定をする。
* <strong>resolv.confの設定変更をする。</strong> ← ここの手順を今回紹介します！

# resolv.confの設定変更する手順
resolv.confを直接編集しても、OSの再起動をした際に設定が元に戻ってしまうため以下手順にて設定作業を実施します。



<details><summary>実施コマンド</summary>

```rb
vi /etc/sysconfig/network/config
以下値を修正します。
変更前：NETCONFIG_DNS_STATIC_SEARCHLIST=""
変更後：NETCONFIG_DNS_STATIC_SEARCHLIST="contoso.com"

設定変更後、以下コマンドを実施する。
netconfig update
```
</details>

↓ 参考にしたURLです。

https://documentation.suse.com/ja-jp/sles/15-SP4/html/SLES-all/cha-network.html#sec-network-manconf-files-resolv

設定変更後、resolv.confのファイルが変更されていることを確認します。
以下のエントリが追加されていることを確認できればOKです。

<details><summary>結果</summary>

```rb
search <今回追加したエントリ> reddog.microsoft.com
nameserver x.x.x.x
```
</details>

# おわり
reoslv.confにいろいろヒントがかかれていましたが、何をどう変更すればいいのかわからず困りました。
もし困った方がいてこのブログが参考になれば幸いです！
AWS Terraform - ECS Fargate の Auto Scaling > スケーリングポリシー > ターゲットの追跡

# やりたいこと

この左の「ターゲットの追跡」の設定をTerraformで管理したい

<img width="1172" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/2e36c747-952a-45ff-9a51-8c7c8cc7e409">

# コード例

Auto Scaling のターゲットとポリシーを作れば良いようだ

```tf
resource "aws_appautoscaling_target" "xxx" {
  service_namespace  = "ecs"
  scalable_dimension = "ecs:service:DesiredCount"
  resource_id        = "service/<クラスタ名>/<サービス名>"
  min_capacity       = 1
  max_capacity       = 15
}

resource "aws_appautoscaling_policy" "yyy" {
  name               = "cpu-auto-scaling"
  service_namespace  = aws_appautoscaling_target.xxx.service_namespace
  scalable_dimension = aws_appautoscaling_target.xxx.scalable_dimension
  resource_id        = aws_appautoscaling_target.xxx.resource_id
  policy_type        = "TargetTrackingScaling"

  target_tracking_scaling_policy_configuration {
    predefined_metric_specification {
      predefined_metric_type = "ECSServiceAverageCPUUtilization"
    }

    target_value       = 75
    scale_in_cooldown  = 300
    scale_out_cooldown = 300
  }
}
```

predefined_metric_type にはこのCPU/Memory/ALBRequestの3種類のどれかを指定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/22254d11-373f-93c9-e2cb-8a17c2275d0a.png)

# Note

このTerraformの例でも自動的にCloudWatchアラームが作成されるようだ
(Alarm-HighとAlarm-Lowの2種類)

# 公式


https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/appautoscaling_policy


# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
【タスク管理アプリを作る】⑤タスク状態を完了にできるようにした。

タスク一覧のタスク状態を完了できるようにしました。
未完了と完了状態のタスク表示をタブで切り替えるようにしました。

機能として物足りない点はありますが。
また、バグもまだまだありますが、
一先ずタスク管理としては完成しました！。。

ここからは、機能追加は一先ず置いておいて、
UnitTestやデザインパターンを考えたリファクタについて、
やっていきたいなと思います。

現在進行形で作っているので、更新頻度は下がると思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545817/e219960b-6e03-517e-318b-12e94866bc79.png)
Bashにおけるリダイレクト記号の話「>」「>>」「<」「<<」

42Tokyoでbashの一部を再実装する課題でリダイレクトを実装することになったので、
その際に気づいたリダイレクトの挙動について私が調べた範囲で公開します。
## 大前提

リダイレクトの基本的な使い方

```bash
# ファイルを新規作成し入力（もしすでにファイルが存在するなら内容を全削除）
command > file
# ファイルを新規作成し入力（もしすでにファイルが存在するなら追記）
command >> file
# ファイルの内容をコマンドの標準入力に渡す
command < file
# ヒアドキュメントが展開（終了文字がEOF）
command << EOF
```

## >, >>, < のあとは必ず「ファイルの名前」
それさえ守れば、順番なんて関係ない！

逆にその部分を抜き取ったものが**コマンド**となります。
（パイプ | や　セミコロン；などの特殊な例外はありますが、、、）

つまり以下の挙動はすべて同じと言えます。

 → aaaがtest_fileに書き込まれます

```bash
echo aaa > test_file
echo > test_file aaa
> test_file echo aaa
```

```bash
cat test_file
aaa
```

## リダイレクトを複数つなげる挙動

絶対に前から順番に実行。

そして、後ろが優先。

```bash
# tmp1 には出力されないけど新規ファイルを生成する
# もしすでに存在するなら内容を削除する(ファイルは残る)
echo aaa > tmp1 > tmp2
cat tmp1
cat tmp2
aaa
```

```bash
echo aaa > tmp1
cat tmp1
aaa
echo bbb >> tmp1 > tmp2
cat tmp1
aaa
cat tmp2
bbb
```

```bash
# Error
< no_file > no_file
bash: no_file: No such file or directory

# 正常終了
> no_file < no_file
# no_fileを生成する。
```

## 入出力ファイルがない場合

この場合は問答無用にエラーを出力されコマンドは実行されません。

```bash
cat < no_file < file
bash: no_file: No such file or directory
```

```bash
cat < file < no_file
bash: no_file: No such file or directory
```

環境変数でもおなじこと。

```bash
export aaa=bbb
# bbb というファイルから入力を受け付ける
cat < $aaa
```

無い環境変数には注意

```bash
unset aaa
cat < $aaa
bash: $aaa: ambiguous redirect # error
```

## ヒアドキュメント（<<）の挙動

終了条件によって挙動が変わる。

```bash
# 通常挙動
cat << EOF
> aaa
> bbb
> EOF
aaa
bbb
```

終了文字がヌル文字の可能性も

```bash
# この場合何もないところでEnterを入力すると終了する
cat << ''
> abc
> def
>
abc
def
```

### 文字列の展開

```bash
# 文字列の展開
cat << EOF
> $USER
> EOF
kels 
# 環境変数で$USERをkelsと今回は登録してある
```

```bash
# 文字列を展開しない
cat << "EOF"
> $HOME
> EOF
$HOME
```

- ちなみに文字列を展開するしないはクオートが存在するかどうか

```bash
# 展開しない挙動（以下の終了条件はすべてEOF）
cat << ""EOF
cat << EOF''
cat << E'O'F
```

```bash
# 終了文字が環境変数の場合
# 環境変数で$USERをkelsと今回は登録してある
cat << $USER
> abc
> kels # 終了しない
> $USER # 終了する
abc
kels
```

### 番外（cat コマンドの優先順位）

catコマンドはリダイレクトよりも引数を優先します。

```bash
cat file
aaa
cat redirect_file
bbb
# 標準入力から受け取っているけど引数を優先して結果を返している。
cat file < redirect_file
aaa
```

ちなみにerrorの場合はしっかり返してコマンドを実行しません。

```bash
cat file
aaa
cat file < no_file
bash: no_file: No such file or directory
```
G検定が難しすぎる

# はじめに
AIの資格試験であるG検定を受けてみました。まずは申し込んでから勉強を始めるというスタイルです。[ITパスポート](https://qiita.com/talomina/items/c3c20ef5fa36e9400ea2)も[データサイエンティスト検定](https://qiita.com/talomina/items/cfe48c30ff333972d168)も何とかなったので、何とかなるだろうと思ってお高い受験費用を支払いました。

https://www.jdla.org/certificate/general/

しかし、その考えは甘かった・・・

# 勉強したもの

AIは興味はあって、生活の中ではお世話になっている程度の素人です。一応ITリテラシーは備えているつもりでしたが、AIは本当に特殊な世界で、とにかくとっつきにくかったです。

## [公式本](https://www.amazon.co.jp/gp/product/B08XZDJDH2)を読む
kindleの電子版を買って読みました。馴染みのない言葉ばかりで内容が全く頭に入ってこない苦痛の読書。シグモイド関数とかシンギュラリティはまだ良いとしてCNNとかRNNとかDQNとか、さらにはカタカナの人名もたくさん出てくるのがつらかったです。下記のサイトでまとめのまとめをしてくれていたので、一読した後はこちらがおすすめです。

https://qiita.com/Ringa_hyj/items/88691e738bb36bc3dabf

## Udemyで学ぶ
本だけでは全く頭に入ってこなかったので、おなじみUdemyに頼ります。

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

この講座はとてもかみ砕いていろいろ説明してくれるのは良いですが、講師の方が特徴的すぎて万人向けではない感じがしました。説明の途中急に沈黙したかと思ったら大きなクシャミをしたりするので、心臓に悪いです。

なかなか頭に入らないのとボリュームが多いので、思ったよりも進捗せず、結局試験当日の朝に一通り読み終わり、Udemy視聴がひと回りしました。そして不安な状態のまま試験を受けます。

# 試験当日
自宅のPCで受験しました。190問を120分で解くので、1問あたり37秒！問題が多すぎます。残り時間が足りなくなったらラストスパートをしようと思っていたのですが、気づいたらタイミングを逃しており、最後の3分で15問くらい処理しましたが、何問かは残してしまいました。時間配分は本当に大事です。

# おわりに
これは本当に入門者向けの資格なのかな、と何度もくじけそうになり、さすがに今回は合格を逃したと思ったのですが。。。なんと合格！

次回の試験日程も発表されて、2周目の勉強を始めようかと思っていたタイミングだったので、通知メールを見た瞬間の解放感は強力でした。

# おまけ
覚えにくかった言葉を自分なりにまとめたカンペです。少しだけ役に立ちましたが、実際の試験では公式本になかった言葉もしばしば出てきたので参りました。

```text:自分用カンペ
強化学習は環境から得られる情報をもとに、どのような行動をとるべきかを学習する方法
LSTM(Long Short Term Memory)における忘却ゲートはシグモイド関数である。
RNNはBPTT(Back Propagetion Through Time)を用いた学習が有効な場合がある。
RNNでは、入力データと過去の隠れ層の状態から出力を計算する。
SegNetはセマンティックセグメンテーションタスクに用いる手法の一つで、エンコーダで得た特徴マップをデコーダで画像サイズまで徐々に拡大する。
GAN（敵対的生成ネットワーク）においてジェネレータでランダムなベクトルから画像を生成して、ディスクリミネータで本物か偽物化を予測する。
画像生成モデルの代表は変分オートエンコーダとGAN（敵対的生成ネットワーク）
MobileNetは、計算量削減を目的としたモデルで、その要素技術は深さごとに分離可能な畳み込み
Faster R-CNN、YOLO、SSDは画像の分類と一の特定とを同時に拘束に行う手法
fastTextでは辞書に登録されていない単語を文字ベースのn-gramを用いて推定する
自然言語処理の形態素解析においてある文章・句を意味を持つ最小の単位に分割する。
word2vecで2つのベクトルの角度によりコサイン類似度が求められる。
WaveNetは音声生成のためのディープラーニングのネットワーク
DQNは行動価値関数（Q関数）ベース
モデルフリー強化学習＝（Q学習、方策勾配法）、モデルベース学習＝（Alpha Zero、世界モデル）
トランスフォーマーは多頭注意、位置符号化器、マスクか言語モデル
Word2Vecは階層的ソフトマックス、CBOW
ResNetはMicrosoftが開発した物体認識を競うILSVRCでスキップ結合で高い認識率を示した
LSTMは内部にゲート構造を設けて長い系列を遡ると学習が困難になる問題を解決した
seq2seqは翻訳元言語をエンコーダにいれて翻訳先言語をデコーダから出す
```
MVVM　ViewModelの２つの役割

ViewModelには大きく分けて２つの役割があります。

ViewModelの一つ目の役割

# １．View関連処理

　・Viewデータ
　・View入力処理
　・Viewロジック

ViewModel もうひとつの役割

# ２．Model関連処理

　UI分離したModelと通信する。

　・Modelメソッドを実行
　・Modelにデータ書き込み
　・Modelからデータ読み出し
　・ModelからのデータをViewデータに変換
時刻だけ入っているセルをPower Automateで取得してみた

テストデータはこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469675/b6e684ff-9fd7-fecc-40a2-69187ad7a9b4.png)

1行だけでよかったなと後で気づく。

テストに用いたフローはこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469675/35891657-85b4-6d92-54e7-5801b1983153.png)

7:00の場合
|Date Format|Time1|
|---|---|
|シリアル値|"0.291666666666667"|
|ISO8601|"1899-12-30T07:00:00.000Z"|

23:00の場合
|Date Format|Time2|
|---|---|
|シリアル値|"0.958333333333333"|
|ISO8601|"1899-12-30T23:00:00.000Z"|

シリアル値では時刻もシリアル値で取得されていることがわかりました。
ISO8601形式ではExcelの基準値の考慮が必要なようです。

Excel側の数値形式を考慮していなかったので上記結果を取得した断面の
数値形式を確認すると、カスタム - h:mm でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469675/5335b593-df0b-5612-7295-7ed3bae73a8a.png)

h:mm AM/PMなど数値形式を変更してみましたが、出力結果は同じでした。

例のExcelの基準日、シリアル値についてはfloat式を用いた計算が必要ということがわかりました。
小学校教員試験対策　プライバシーポリシー

## プライバシーポリシー

小学校教員試験対策 は、ユーザーのプライバシーを尊重し、ユーザーのプライバシー情報の保護に努めています。

### アプリ提供者
本アプリは、Mikazuya Industrious によって提供されています。

### 情報の収集と利用
小学校教員試験対策 は、情報を収集・利用しません

### 情報の共有
小学校教員試験対策 は、第三者とユーザーの個人情報を共有することはありません。

### セキュリティ
私たちは、ユーザーの情報のセキュリティを確保するための措置を講じています。

### 変更の通知
本ポリシーに変更がある場合は、小学校教員試験対策に通知を掲載します。

### お問い合わせ
プライバシーポリシーに関する質問や懸念は、soanevalcke@hotmail.co.jp までお問い合わせください。
Amazon CodeWhispererはこんなこともできる（遊んでみた話）

## はじめに
船井総研デジタルの陸です。

この記事では、Amazon CodeWhispererのコード支援サービスを用いていろいろテストしてみたことについて紹介しました。コメントによるコード生成だけではなく、簡単なやりとりもできることがわかったので、各テストケースを記録の形で書いてみたいと思います。
前回、Amazon CodeWhispererについて書いた記事（以下を参照）の次のものになります。

https://qiita.com/fsdg-yook/items/2f85fe35c8a9df7d792b


## テスト開始
Amazon Code Whispererって、プログラムコードの生成ができることは公式ホームページでも確認できたましたが、他にもいろいろできるか気になり、テストをしてみました。

### Q1.関数の説明
引数に３つの数字を入力すると、足し算して返却する関数を作り、その結果をコンソールに出力する簡単なコードを書いた後、コメントから質問してみました。
「以下の関数は何をしますか（何の処理をしますか）」と聞いたら
ちゃんと、関数の役割からコンソールでの出力まで完璧に説明してくれました！
おおー、こういうこともできるのか！ GitHub Copilot Chatでしかできないと思った私の思い込みは完全に間違っていました。
![スクリーンショット 2023-09-22 111202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/562d0928-b762-46fb-d8e1-a0047dfdd44f.png)

### Q2.結果予測
書いたコードについて説明もしてもらえたので、実行結果も教えてくれるだろうとしてプロンプトを書いてみました。
そうしたら、「３」という回答が返ってきましたが、実際の実行結果は「４」です。
その後、引数を変えながら何回か試してみましたが、誤答がほぼでした。
これについては残念！
![スクリーンショット 2023-09-22 111412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/d8a78c3f-72b6-4011-c1be-866498392eb9.png)

### Q3.Qiitaについて
最初に聞いてみたのは「Qiita」サイトについてでした。
「Qiita」って知ってる？と聞いたら、なんと！
うん、知ってるよー　と回答をもらいました。（笑）
その他にURLの質問も勝手に作ってくれましたが、それに対してもちゃんとしたURLを生成してくれました。
知らないー　と回答すると思っていた私には少しビックリでした。
![スクリーンショット 2023-09-22 114419.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/5fafbe94-54de-110d-e0f2-cc999290cd5c.png)

### Q4. 日本の首都
この後からはふざけた質問をどんどん投げてみました（笑）
まず、日本の首都について聞いたところ、なんと
「愛知県」という結果が返ってきました。
CodeWhispererさん、本当にそうなの？！
![スクリーンショット 2023-09-22 112040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/687ef3c1-e543-cb0f-4edd-2f45fd0b0e86.png)

### Q5. 会社情報
次はうちの会社について聞いてみました。
この質問に対しても面白い回答が返ってきました（笑）
![スクリーンショット 2023-09-22 113256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/257029a8-becd-919f-e97d-1a9ad659c237.png)

### Q6. 天気情報
次は今日の天気について聞いてみました。
地域情報をまったく書かずだったので、また面白い回答がくるかなと思っていたところ、
「いい天気」
とシンプルな回答が出てきました。
まあ、実際にいい天気でしたけどね、、これは当たり、、かな
![スクリーンショット 2023-09-22 113737.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/f1ca876c-c01b-5d21-4e98-4ce2d2f009cb.png)

### Q7. らめん？うどん？
最後の質問として、ラーメンとうどんのうち、どっちがおいしいかについて聞いたところ
以下の回答が返ってきました。
そうです、CodeWhispererはうどん派だったんです。
ちなみに、僕はラーメン派ですが、もちろんうどんも好きです。
![スクリーンショット 2023-09-22 114112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/81867c6d-6273-68ea-7737-a9ad80f1db0d.png)

## 最後に
コード生成以外のプロンプトにも対応ができるCodeWhispererに驚いだ次第です。
以上、Codehispererの簡単なテストでしたー
試験 AI-900: Microsoft Azure AI Fundamentals(和名:AIの基礎) 合格まで

**受験者本人のレベルと学習環境**

AI初心者。興味深く、主に最近話題のchatGPTやチャットボットなどにも興味があり、
Microsoft TeamsにchatGPTを入れたり、チャットボットを作り方などを個人的に勉強したりしていました。また、社内にAI研究チームがいて、そこのチームの成果の発表を聞きながらAI関連用語に馴染みがある程度でした。

**受験までの流れ**

2023年1月27日（金） 13:00-17:00 「Microsoft Azure Virtual Training Day: AI Fundamentals」に参加
2023年3月23日 (木) 「AI-900 : Microsoft Azure AI Fundamentals 試験対策」確認
2023年6月：Udemy　AI-900関連問題集問う
2023年6月：「Microsoft Build: Azure AI チャレンジ」参加
2023年6月25日　AI-900合格！！

AI-900とは？
<details>
1.出題範囲:人工知能のワークロードと考慮事項について説明する (20 から 25%)<br>
Azure での機械学習の基本原則について説明する (25 から 30%)<br>
Azure の Computer Vision ワークロードの機能について説明する (15 から 20%)<br>
Azure での自然言語処理 (NLP) ワークロードの機能について説明する (25 から 30%)<br>
2.問題数:35問前後<br>
3.合格ライン ：（700点/満点は1000点）<br>
4.受験費用 :¥12500→¥0(マイクロソフト社開催の「Microsoft Azure Virtual Training Day: AI Fundamentals」に申込み後、参加)<br>

</details>

参考：https://learn.microsoft.com/ja-jp/credentials/certifications/exams/ai-900/

**Microsoft　Learning紹介**
[Microsoft Azure AI Fundamentals: 人工知能の概要](https://learn.microsoft.com/ja-jp/training/paths/get-started-with-artificial-intelligence-on-azure/)
[Microsoft Azure AI Fundamentals: 機械学習用のビジュアル ツールについて調べる](https://learn.microsoft.com/ja-jp/training/paths/create-no-code-predictive-models-azure-machine-learning/)
[Microsoft Azure AI Fundamentals: Computer Vision について調べる](https://learn.microsoft.com/ja-jp/training/paths/explore-computer-vision-microsoft-azure/)
[Microsoft Azure AI Fundamentals: 自然言語処理について調べる](https://learn.microsoft.com/ja-jp/training/paths/explore-natural-language-processing/)
[Microsoft Azure AI Fundamentals: 意思決定支援について調べる](https://learn.microsoft.com/ja-jp/training/paths/explore-fundamentals-of-decision-support/)


**受験感想**
難易度はそこまで高くなかったと思います。AIに関する興味と概念があれば充分受かると思います！:relaxed:今回はUdemyの問題集はあんまり勉強していなかったですが、「Microsoft Build: Azure AI チャレンジ」参加してから勉強したMS　Learnの方がかなり為になりました。

**その他参考にしたサイト**
特になし

**勉強したUdemy講座**
[AI-900: Microsoft Azure AI Fundamentals Practice Tests, 2023](https://www.udemy.com/course/ai-900-microsoft-azure-ai-fundamentals-practice-tests-new/)
日本語版は、解説がなかったため、今回は解説付きの英語版で勉強してみました。1－5までありますが、1－2だけ1周しました。

では、皆様！AI-900の合格まで頑張りましょう！ファイトです！
Power Query workout - 適用したステップごとに処理されるとは限らない

エディタを眺めていると [適用したステップ] ごとで処理されているように見える。Mashup engine がよしなに対応してくれるから、多くの場合で気にすることはないかもしれない。ただ、[適用したステップ] ごとに処理されるということを期待したままでガチャガチャやったところでうまくいくはずはないし、ステップ数を減らした記述をしたからってパフォーマンスが良くなるということもないし、逆効果ということまである。

最適化やチューニングを施したいなら、動作やスペックについて深い理解が必要だ。Power Query は Excel でもないしリレーショナルデータベースでもない。だから、それらの知恵/知識で考えたロジックが Power Query では通用しないってことは普通の出来事。

# たとえば
テーブルに対する変換多くについては行ごとで処理される。たとえば、テーブルにいくつかの列を追加するとき複数のステップが同時に処理されるということになる。ストリーミングによる処理を実施できるのであれば、[適用するステップ]ごとでではなく、おまとめされた処理になる。

https://qiita.com/PowerBIxyz/items/51bae068f3f92830b8aa

後続するステップであってもストリーミングで処理される。
```text:Power Qeury
// Query1
let
    Source = Table.FromColumns(
        {
            List.Numbers(1, Number.PositiveInfinity)
        },
        type table [Column1 = Int64.Type]
    ),
    FirstRows_le5 = Table.FirstN(Source, each [Column1] <= 5)
in
    FirstRows_le5
```
Source: 無限行数のテーブル
FirstRows_5: 先頭5行のみ選択

Source が無限行のテーブルを結果するからといって、いきなりエラーになることはない。次の[適用するステップ]にある、Table.FirstN もストリーミング処理に含まれるから。

1. Source から1行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true 
1. Source から2行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true 
1. Source から3行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true 
1. Source から4行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true 
1. Source から5行目 ⇒ FirstRows_le5 の [Column1] <= 5 は true 
1. Source から6行目 ⇒ FirstRows_le5 の [Column1] <= 5 は false 

行ごとの処理(ストリーミング)は行数分 6 回繰り返し、7 行目以降の処理は発生しない。
ストリーミングという動作では、[適用するステップ]ごとに先行評価をしないということだ。

テーブルではなくリストでも同じ。

# 思ったこと🙄
ほとんどのクエリで[適用したステップ]の順序で処理されない。
ステップごとで先行評価しないストリーミングは全体計算量を大きく減らす手段である。
そして、結果に必要のない処理をしないという判断も可能なのだ。


# その他
https://powerbi.connpass.com/

- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
- [Excel で Power Query を使い始めるには](http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9)
Ubuntu: `sudo: unable to resolve host ip-xxx-xxx-xxx-xxxのエラー修正

# Ubuntu: `sudo: unable to resolve host ip-xxx-xxx-xxx-xxxのエラー修正
- 今回はホスト名に関する変なエラーが出たので解決しました。AWSさんが勝手にホスト名を書いてくれるせいだと思います。

#  エラーの修正方法

このエラーは通常、`/etc/hostname` と `/etc/hosts` ファイルの間でホスト名の不一致が生じている場合に発生します。

## 手順1: `/etc/hostname` ファイルを確認

まず、`/etc/hostname` ファイルに現在設定されているホスト名を確認します。

```bash
cat /etc/hostname
```

このコマンドが `ip-xxx-xxx-xxx-xxx` または他のホスト名を出力するはずです。

## 手順2: `/etc/hosts` ファイルを修正

次に、`/etc/hosts` ファイルをエディタで開きます。

```bash
sudo vi /etc/hosts
```

ファイルを開いたら、以下のような行が存在するはずです。

```text
127.0.0.1 localhost
```

この行の下に、以下のように新しい行を追加します。ここで ip-xxx-xxx-xxx-xxxは `/etc/hostname` ファイルで確認したホスト名に置き換えてください。

```text
127.0.0.1 ip-xxx-xxx-xxx-xxx
```

変更を保存してファイルを閉じます。

## 手順3: システムのホスト名を更新

以下のコマンドでシステムのホスト名を即座に更新します。

```bash
sudo hostname -F /etc/hostname
```

## 手順4: システムの再起動

最後に、設定を確実に反映させるためにシステムを再起動します。

```bash
sudo reboot
```
SAP BTPへアプリをpushするときにエラーが出た：Routes quota exceeded for organization

SAPの初心者ですが、BTPとかCFとかいろいろ紛らわしいやつがあって、毎日苦戦中。。。
# 課題

https://developers.sap.com/tutorials/btp-cf-buildpacks-node-create.html

このチュートリアルを見てローカルからBTPへアプリをプッシュしたいけど、このエラーに遭遇

```
cf push
```

```
For application 'myapp': Routes quota exceeded for organization .
FAILED
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/47c303d1-703d-6416-5c43-1a910515e929.png)

# 解決方法
部署の先輩に尋ねると、部署のBTP内にはもうアプリがいっぱいで、購入するクォーターがもう足りていない。。。

**要らないアプリを適宜削除しましょうね**ということでした。。。

確かにcockpitを見ると、メンバーのみんなは頑張ってSAPを勉強しているように見えますね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/9d6df160-7795-9ca1-bcf6-6a6493edd6dd.png)

そこで、一個私が以前pushして最近使っていないやつを削除し、もう一回pushしてみると、
（**停止だけじゃなく、ちゃんと削除！！！**）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/82f8c239-0e79-c944-36bc-0fa9c9559df0.png)

今回はちゃんとpushできました！！！
プログラミングテクニック　徐算した数値の切り上げ

AtCorderで使うテクニックを備忘録として書き残しておく。



いきなり一般化するのは難しいので
まずは前提として１、２を考える。

1.登場する値は正の値とする。（負の場合では成立しない）
2.n+aの桁溢れが発生しない程度の数値の大きさ

通常の演算では数字は切り捨てとなる。つまり大学受験で時々登場するガウス記号が演算結果に適応されている。

```C++:切り捨ての場合
int main()
{
    int n = 5;
    int a = 2;
    //　結果を出力(2を出力)
    std::cout << n / a << std::endl; 
}
```

切り上げ時には下記の通り　n/aを(n+a-1)/aに書き換える。
n/a+1にした場合はn/aがちょうど割り切れる場合でも加算されてしまうため、全ての正の実数で条件を満たせない。

```C++:切り上げの場合　その１
int main()
{
    int n = 5;
    int a = 2;
    // 結果を出力（３を出力）
    std::cout << (n+a-1) / a << std::endl; 
}
```

前提２の桁溢れを防ぐためには以下の方法で回避できる。
割り切れる場合以外は１加算すれば良いので、判定文を利用する。

```C++:切り上げの場合　その２
int main()
{
    int n = 5;
    int a = 2;
    // 結果を出力（３を出力）
    std::cout << n/a + (n%a != 0)  << std::endl; 
}
```

さらに前提１で対象外としていた負の値も考慮する。
負の場合で余計な処理を加えなければ良いので,排他的論理和を含んだ判定分　(n^a) >= 0　を利用する。

```C++:切り上げの場合　その３
int main()
{
    int n = 5;
    int a = -2;
    // 結果を出力（-2を出力）
    // -2 + 0 * 1
    std::cout << n/a +　((n^a) >= 0) * (n%a != 0)  << std::endl; 
}
```