OmniAICreator/Qiita-1.07M huggingface dataset:
Firebase Admin SDKでグループへの送信がほったらかしにされている件についてまとめ

# 前提
２０２４年７月のお話。
アプリ側の話ではなく、メッセージを送るサーバ側の話。

ここを見てみる人には説明不要だと思いますが用語解説。

* notificationとかmessage...アプリに送る通知のことで、スマホ端末ではアプリから出ているように見える通知で、webブラウザでは右上に出てくる通知のことで、つまり通知メッセージだということです（小泉構文で恐縮ですがそうとしか言えないんです！）
* device, デバイスとは端末にインストールされたアプリのこと
    * token アプリがFirebaseから取得する通知を送るために必要なトークンのことでアプリからのみ取得可能、サーバはこれをアプリから受け取ってアプリに通知をぶん投げるという仕組み。こんな感じの文字列 `emlm8ZGtRDaZxxxxxxxx:APA91bHwX9IklxxBqBX9cLowxx2M2mcU_O71-XADunCq6PZzMSW1hF5L5BPTtUygAf2txAxx`
* group, グループとは[デバイスグループ](https://firebase.google.com/docs/cloud-messaging/android/device-group)のこと
* [Firebase Admin SDK](https://firebase.google.com/docs/reference/admin)は、一言で言えばFirebaseにおけるバックエンド的な操作を各種言語から行えるようにしたSDKのこと

# 実現したいユースケースの説明
たとえばメールが届いたよは個別の通知で、一つのアプリ(=token)に対してメッセージを送ればいいけれど、内科の先生で勤務中の人！といった一斉発報的に複数のデバイスに対して通知を送りたいときにどうするかの話を捌くのに現状３つの方法がある。

A. １件ずつ全デバイスに対して送信する
B. バッチ的に複数のトークンを１回のリクエストで送信する、ただし500件がリミット
C. デバイスグループにトークンを登録してバーンと送信する
D. topicをアプリに購読してもらう

それぞれn個の端末に対してのリクエスト数は下記の通り。

A. n回
B. n/500 で余がある場合は +1回
C. 2回
D. 1回・・だけど今回はアプリ側から購読というスタイルでは細かな条件（たとえば勤務中とか）に対応できない

実装するとき選ぶなら当然選択肢の3。トランザクション管理とかクッソだるいことしたくない。
3は下記のリクエスツで構成される

1. グループを作成してtokenを紐づける。このときtoken登録数にリミットは無いように（ドキュメント上では）みえる。 
1. notification発射

だがこのめちゃ便利な仕組みがFirebase Admin SDKでサポートされていない・・ような？という宙ぶらりんな状態を少し追った。

# なぜなのか

かつてはあったぽいんですよ。

[HTTPのAPI](https://firebase.google.com/docs/cloud-messaging/android/device-group?hl=ja)と、[SDKのこの機能](https://firebase.google.com/docs/reference/admin/node/firebase-admin.messaging.messaging.md#messagingsendtodevice)の組み合わせで。
でも今は後者がobsoleted。

obsされた理由はおそらく HTTP v1 からommit された機能だから。
https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages

レガシーFCM HTTP APIの期限が先月(2024年6月)なので、今はこの組み合わせでも利用できなくなっているかもしれない。

# どうするのか
Bの案使うしかねないなーという結論、つまんないしすごくださいたま。

# See also their lamentations 
* https://github.com/firebase/firebase-admin-node/issues/173#issuecomment-1311120011
* https://github.com/firebase/firebase-admin-dotnet/issues/278
sedコマンドのおさらい（備忘録）

# はじめに
こんにちは！
[awkコマンドのおさらい（備忘録）](https://qiita.com/yam_dev/items/09efa223d605ffb63e27)という記事を書きましたが、sedもよく忘れるので、備忘録です。

よく忘れるsedコマンドですが、Linuxコマンドの中でも、かなり代表的なコマンドです。知ってて損はないです。というか、知らないと効率悪いです。

今回は、このsedコマンドについて、基本的な使い方から振り返っていきます。

### sedの基本

sedの基本的な構文は以下の通りです。

```bash
sed 'コマンド' 入力ファイル
```

* **コマンド:** sedに対して行いたい処理を指定します。
* **入力ファイル:** 処理対象のテキストファイルを指定します。

sedは、指定されたコマンドに従って入力ファイルを処理し、結果を標準出力に出力します。

# よく使うsedコマンド

#### 1. 特定の文字列を置換する

sedの最も基本的な使い方の一つが、文字列の置換です。
例えば、`sample.txt` というファイルの中の "apple" を "orange" に置換したい場合は、以下のように記述します。

```bash
$ cat sample.txt
apple,100,red
banana,50,yellow
orange,80,orange
```

```bash
$ sed 's/apple/dog/' sample.txt
dog,100,red
banana,50,yellow
orange,80,orange
```

* `s/apple/dog/`: これがsedのコマンド部分です。 `s` は置換コマンドで、 `/` で区切られた最初の文字列 (apple) を2番目の文字列 (dog) に置換します。

#### 2. 行番号を指定して置換する

特定の行だけを置換したい場合は、行番号を指定します。

```bash
# 3行目の "banana" を "grape" に置換する
$ sed '2s/banana/grape/' sample.txt
apple,100,red
grape,50,yellow
orange,80,orange
```

#### 3. 正規表現を使った置換

sedでは、正規表現を使ったより柔軟な置換も可能です。

```bash
# 行頭が "a" で始まる行の "red" を "green" に置換する
$ sed '/^a/s/red/green/' sample.txt
apple,100,green
banana,50,yellow
orange,80,orange
```

#### 4. ファイルを直接編集する

sedは、 `-i` オプションを使うことで、入力ファイルを直接編集することもできます。

```bash
# sample.txt の "apple" を "strawberry" に置換する (ファイルを直接編集)
$ sed -i '' 's/apple/strawberry/' sample.txt
$ cat sample.txt 
strawberry,100,red
banana,50,yellow
orange,80,orange
```

#### 5. 複数のコマンドをまとめて実行する

sedでは、 `;` を使って複数のコマンドを連結して実行することができます。

```bash
# 1行目を削除し、2行目の "banana" を "grape" に置換する
$ sed '1d; 2s/banana/grape/' sample.txt
grape,50,yellow
orange,80,orange
```

# あまり使わないけど便利なsedコマンド

```bash
$ cat sample.txt
apple,100,red
banana,50,yellow
orange,80,orange
melon,500,green
```

#### 1. 特定の行を削除する

```bash
# 3行目を削除する
$ sed '3d' sample.txt
apple,100,red
banana,50,yellow
melon,500,green
```

#### 2. 特定の範囲の行を抽出する

```bash
# 2行目から4行目を抽出する
$ sed -n '2,4p' sample.txt
banana,50,yellow
orange,80,orange
melon,500,green
```

#### 3. 行頭にコメントを追加する

```bash
# 各行頭に "#" をつけてコメントアウトする
$ sed 's/^/#/' sample.txt
#apple,100,red
#banana,50,yellow
#orange,80,orange
#melon,500,green
```

### まとめ

今回は、基本的なsedコマンドと便利な使い方までを紹介しました。

sedは、非常に強力なテキスト処理ツールであり、使いこなせるようになれば、Linux環境での作業効率が格段に向上します。

ぜひ、今回の内容を参考に、sedコマンドを活用してください🙂
定積分 integrate(x**2 * sp.sin(x), (x, 0, 2*sp.pi/3))「2024 千葉大学前期【1】」をChatGPTとsympyとWolframAlpha でやってみたい。

# オリジナル
・めぐろ塾 様
　2024千葉大【理系数学】解説・解答・講評
　＞千葉大の数学の入試では、文系数学と理系数学が同じ冊子で配られる！

https://www.megurojyuku.com/2024%e5%8d%83%e8%91%89%e5%a4%a7%e3%80%90%e7%90%86%e7%b3%bb%e6%95%b0%e5%ad%a6%e3%80%91%e8%a7%a3%e8%aa%ac%e3%83%bb%e8%a7%a3%e7%ad%94%e3%83%bb%e8%ac%9b%e8%a9%95/

・大学入試数学問題集成 様＞ 前期【４】テキスト

https://mathexamtest.web.fc2.com/2024/202410241/2024102410100mj.html#to-0104

# ChatGPT-3.5先生へ。
・回答は英語です。
　はじめから、「日本語で」を追加してもいいです。
・ページのソースを表示です。MathMLです。
　省略しようと思いましたが、大学入試数学問題集成 様 の全文から必要部分の抜粋です。
```
<div class="qbody">
<p class="slevel"><a name="q-0104" 
id="q-0104"></a><span 
class="qnum">【４】</span>　以下の問いに答えよ．</p>
<a name="s-0104" id="s-0104"></a><p class="s1level"><span 
class="shomon1">(1)</span>　定積分<math>
<mspace width=".2em"></mspace><mrow><mstyle displaystyle="true"><msubsup>
<mo>&int;</mo><mn>0</mn><mfrac><mrow><mn>2</mn><mo>&it;</mo>
<mi>&pi;</mi></mrow><mn>3</mn></mfrac></msubsup></mstyle>
<msup><mi>x</mi><mn>2</mn></msup><mo>&it;</mo><mi>sin</mi>
<mo>&af;</mo><mi>x</mi><mo>&it;</mo><mi mathvariant="italic">dx</mi>
</mrow><mspace width=".2em"></mspace>
</math>を求めよ．
</p>
</div>
</div>
```

回答省略(英語です)
```
日本語で
```
```
sympyで
```
・(抜粋)　sympyのソースコードがでました。
・私がprint文を追加しています。
```python
import sympy as sp

# 定義
x = sp.symbols('x')
integral = sp.integrate(x**2 * sp.sin(x), (x, 0, 2*sp.pi/3))

integral.evalf()
print("#",integral)
# -3 + 2*pi**2/9 + 2*sqrt(3)*pi/3
```
# WolframAlpha で
・グラフがでます。

integral = sp.integrate(x**2 * sp.sin(x), (x, 0, 2*sp.pi/3))

# sympyで(オリジナル 様の方法で)
???勉強中です。???

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

・以下ができたら、助かります。指定と全部です

https://qiita.com/mrrclb48z/items/555d85face87552c34fb

https://qiita.com/mrrclb48z/items/5f57eac92aaca30e85c0

# いつもと違うおすすめです。
【Swift Concurrency】 新しい @Observable クラスの書き方を知らないやつwww


なにこれ。

![sc 2024-07-06 at 18.32.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/b995201a-3d43-1dad-cf17-b7d07445045a.png)

よって、最もよくある非同期処理記述での検証をしてみます。

![1024x500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/8a880986-092c-64f8-df2b-3b07fb918130.png)

https://x.com/maochanz/status/1809917293201387994

(つづく...)

# 🧑🏻‍💻 引用

https://x.com/maochanz/status/1809527798442389663
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（43/100）

【43日目】
トピック4：SAPS/4HANAの資材所要量計画（MRP）（10/10）

≪問題43≫
マスタデータの項目のうち、品目の購買依頼または計画手配がMRPによって生成されるかどうかに影響を与えるのは、以下のどの項目ですか。
（２つ選択）
□品目タイプ
□MRPグループ
□調達タイプ
□MRPタイプ

≪解答≫
□品目タイプ
■MRPグループ
■調達タイプ
□MRPタイプ

≪解説≫
◆MRP実行によって不足数量が決定されると、購買依頼（外部調達の場合）や計画手配（内製の場合）などの調達提案が登録されます。
◆調達数量によって決定されたロットまとめの後、品目マスタの調達タイプを使用して、品目を内製する（計画手配を登録）か、外部から調達する（購買依頼を登録）かが決定されます。また、調達タイプは、品目タイプの設定内容に依存します。
◆MRP実行の第一画面で購買依頼の登録区分を使用すると、システムが購買依頼を直接登録するか、最初に計画手配を登録するかを制御することができます。ただし、登録区分を持つMRPグループが品目に割り当てられている場合、この品目はMRPグループに記録された区分によって計画されます。
Windows 11でデバイスの挿抜情報をリアルタイムモニタする方法

## 背景・目的

モニタやUSBデバイスを接続しまくっているWindows PCは、接触不良などが原因でデバイスの挿抜が意図せず検出されてしまうことがある。この場合は不定期にデバイスの挿抜音が鳴って大変わずらわしい。しかし、挿抜音が鳴るだけで通知ポップアップなど何も出ないデバイスもあるため、悪さをしているデバイスの特定が難しいことがある。

接続されているデバイスの一覧を見るための一般的なツールとして、デバイスマネージャーやusbview.exeなどがある。これらのソフトは挿抜を検知してから画面に反映されるまで数秒かかるため、接触不良などの原因で短時間に抜き差しが検知された場合ではこれらのツールで原因となるデバイスを特定することは難しい。

（Linuxで言うところのudev的に）デバイスの挿抜をPowerShellでリアルタイムにログ出力する方法を発見したのでメモしておく

## 方法

PowerShellを開いて管理者権限で以下のスクリプトを実行する。
（下記コードはChatGPTが生成したもので、内容を1ミリも理解していないため実行は自己責任です）

```powershell
while ($true) {
     $currentDevices = Get-PnpDevice -PresentOnly
     $newDevices = Compare-Object $previousDevices $currentDevices -Property InstanceId -PassThru

     if ($newDevices) {
         $timestamp = Get-Date -Format "yyyy/MM/dd HH:mm:ss"
         $newDevices | ForEach-Object {
             if ($_.SideIndicator -eq "<=") {
                 Write-Host "$timestamp - Device removed: $($_.InstanceId)"
             } elseif ($_.SideIndicator -eq "=>") {
                 Write-Host "$timestamp - Device added: $($_.InstanceId)"
             }
         }
     }

     $previousDevices = $currentDevices
     Start-Sleep -Seconds 1
}
```

上記スクリプト実行中にデバイスが挿抜されると、ログが表示される。 \
DisplayPort接続のモニタが挿抜されたときの例。

```
2024/07/06 16:48:07 - Device removed: DISPLAY\IOD180E\5&2F3551B6&1&UID168193
2024/07/06 16:48:08 - Device added: DISPLAY\IOD180E\5&2F3551B6&1&UID168193
2024/07/06 16:48:20 - Device removed: DISPLAY\IOD180E\5&2F3551B6&1&UID168193
2024/07/06 16:48:21 - Device added: DISPLAY\IOD180E\5&2F3551B6&1&UID168193
```

上記のデバイスが何のデバイスか、詳細を知るコマンド。 \
（上記ログからデバイスID的な文字列をコピーして貼り付ける）

方法１
```powershell
 Get-PnpDevice -InstanceId "DISPLAY\IOD180E\5&2F3551B6&1&UID168193"
```

方法２
```powershell
 Get-WmiObject Win32_PnPSignedDriver | Where-Object { $_.DeviceID -eq "DISPLAY\IOD180E\5&2F3551B6&1&UID168193" }
 ```

## 結果

GPUからDisplayPort接続していたモニタが接触不良を起こし、挿抜音を発生させていた

（イベントビューアのシステムログから簡単にログが見れるようにしてほしい、、）

## 備考

検証済みPC: Windows 11 Pro - 23H2 \
(CPU: AMD / Ryzen 5 3600)

未検証: Windows 10マシン

## 参考

https://learn.microsoft.com/en-us/powershell/module/pnpdevice/get-pnpdevice?view=windowsserver2022-ps
エンジニア独特の用語

# はじめに
初見では意味のわからなかった用語集です。

# マサカリが飛んでくる



> 技術的な指摘をすることを「マサカリを投げる」と呼ぶ。

https://qiita.com/kaityo256/items/d7d8f7a0e522895c8f5d


「マサカリを投げる」より「マサカリが飛ぶ・飛んでくる」という言い回しの方が多いように感じます。

引用元の記事には「使用法が変遷している」とありました。
現在は、「技術記事を書くと間違いに対して指摘が入ること」、「良い内容にはコメントが付かず、間違っているときだけコメントが付く」といったニュアンスの印象です。



# 銀の弾丸



>不思議な霊力を持ちそれによって不死身の狼男（作品によってはそれ以外の魔物）でさえ打ち倒せる武器とされている。（中略）転じて、**通常の手段では対処が厄介な対象を、たった一撃で葬るもの**、という比喩表現として用いられる場合が多い。

https://ja.wikipedia.org/wiki/%E9%8A%80%E3%81%AE%E5%BC%BE%E4%B8%B8#:~:text=%E9%8A%80%E3%81%AE%E5%BC%BE%E4%B8%B8%EF%BC%88%E3%81%8E%E3%82%93%E3%81%AE,%E6%AD%A6%E5%99%A8%E3%81%A8%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82

特に、「**銀の弾丸は存在しない**」という言い回しで使用される印象です。

余談ですが、「銀の弾丸は狼男」は常識のようです。



>フィクションの吸血鬼作品では、吸血鬼を倒そうとして銀の弾丸を打ち込んだが効かず、「それは狼男の倒し方だろう！」と突っ込まれるという、すでに古典的ギャグとも言えるやり取りがある

[引用元](https://vampire.hanadaisuki.info/bullet/)



# 車輪の再発明



> 広く受け入れられ確立されている技術や解決法を（知らずに、または意図的に無視して）再び一から作ること

https://ja.wikipedia.org/wiki/%E8%BB%8A%E8%BC%AA%E3%81%AE%E5%86%8D%E7%99%BA%E6%98%8E

基本的には好ましくない意味を持つ印象です。「ライブラリがあるのに使わない、結果時間がかかった上に質が低い」など。

「意図的に無視して」に該当するケースとしては、基礎学習が当てはまるでしょう。



# ハッカソン

**Hack（ハック） + Marathon（マラソン）** ですね。

限られた時間内にチームで協力してソフトウェアやハードウェアプロジェクトを開発するイベントを指します。

何の略なのかずっと疑問で、語源を知るまでは「ハッカー」+「村（ソン）」だと思ってました。ハッカーの集まり的な。



# バニラ（Vanila）

「何もフレームワークを導入していない」「素の」といったイメージです。

「バニラのJS」はライブラリ・フレームワークを使用していない、純粋なJavaScriptを指します。特にJavaScriptに対して使われる印象。

https://zenn.dev/seya/articles/66809b3d59151c

この記事によると、「アイスクリームのバニラ味」から転じて「普通の・平凡な・デフォルトの」といった意味だとのこと。面白いです。

また、JS界隈で使われるようになったのは、簡単に言えば「jQuery要らなくね？」「そのままのJSでよくね？」という文脈で定着したようです。



# 「完全に理解した」

「初歩の初歩を完全に理解した。この先に想像もできない難関があるのは知っている」というとても謙虚な言葉ですね。


https://togetter.com/li/1268851

# おわりに


こういうエンジニア文化用語辞典、読み物として面白いと思うのですが、書籍・サイトは案外ないんですよね。

通常の用語辞典はあるのですが（お世話になってます）

https://e-words.jp/

同人誌レベルで用語集作ってみるのも面白いかもしれませんね。

以上、エンジニア独特の用語集でした。
PC版DeepLを使ってどこからでも一瞬で翻訳する

Deepl のデスクトップアプリを使ってショートカットキーを使って素早く翻訳する方法を発見したので紹介します。

WindowsとMacどちらでも使えますが、こちらではWindowsを使ってます。

## PC版Deeplのメリット

PC版Deeplを採用するメリットは以下の通りです。

### 素早い

PC版Deeplとは別にChromeの拡張機能がありますが、こちらは「文字を選択する」→「右クリック」→「"Deeplを翻訳"を選択」という流れで翻訳するので、少し手間がかかってしまいます。

一方、PC版Deeplではアプリケーションをいちいち立ち上げる必要なく、「文字を選択する」→「ショートカットキーで翻訳」という流れで翻訳できるので、素早く翻訳できます。

### どこでも使える

Chromeの拡張機能では"Chromeブラウザ内"での使用が基本となります。

そのため、ほかのアプリケーションからDeeplに翻訳したいときに、いちいちDeeplのサイトにもっていかなければいけないので大変です。

しかし、PC版Deeplでは、基本的にはどのアプリケーションでも利用可能なのでとても便利です。

## 基本的な使い方

1.まず、以下の URL から Deepl のデスクトップアプリをインストールします。

https://www.deepl.com/ja/app

2.インストール後、文章を選択し、「Ctrl + C」を 2 回連続で押すと、アプリを開かなくても、画面が出てきて自動翻訳することができます。

ユーザー登録は不要です。

<br>

![DeeplAppPrev.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828215/e567f96d-7103-7fb6-26e0-f7404aac98d4.gif)
実際に使ってみるとこんな感じ

<br>

## ターミナルでも使えるようにする

デフォルトではショートカットキーが「Ctrl + C」を 2 回連続で押すという形になっており、一般的な用途であれば、そのままでも便利に使うことができます。

しかし、コードを書く人の立場だと、このままの状態でターミナル（コマンドを使って操作するところ）でエラー文などを翻訳しようとすると、ターミナルの方でキャンセル操作になってしまい翻訳できません。このままだと不便なので、ターミナルでも便利に使える方法を色々考えてみました。

### ショートカットキーを変更する

まず最初に思いついたのが、この方法です。基本的な使い方は以下の通り。

Deepl のデスクトップアプリを開き、左上のハンバーガーメニューから「設定」を開きます。

「キーボードショートカットキー」から「選択したテキストの翻訳」を選択し、チェックが入っていることを確認します。

こちらから好みのショートカットキーを設定することができます。

<br>

![deepl1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828215/18bbd7e7-3653-cdb5-7f2f-5b800fdd8293.png)

デフォルトの設定（Ctrl + Cを 2 回）

<br>

![deepl2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828215/4cc9b1fb-8ed9-a2d5-cac1-72f8acd682b3.png)
カスタマイズ例（Ctrl+Shift+D）

<br>

このように自分でショートカットキーをカスタマイズすることができます。

ですが、この方法は個人的には微妙だと思いました。

体感的に押しやすい「Ctrl+Shiftと左側のキー」のような組み合わせって、大体ほかの機能とかぶってしまうんですよね。。

例えば「Ctrl + Shift + D 」の場合、Chrome上で使うと「すべてのタブをブックマークに追加する」が翻訳と同時に出てしまいます。

なので、ターミナルでは使えるようになったのですが、ほかのショートカットとかぶってしまい不便だと思いました。

### 「Ctrl+Win+C」を使ってみる

個人的にはこのショートカットを使うのが、一番良いのでは？と思いました。

デフォルトと似た感じで「Ctrl+Win+C」を２回押すと翻訳することができます。

このショートカットキーはDeeplアプリのデフォルトに搭載されているもので、以下のような機能があるそうです。

>Ctrl+Win+C：テキストを入力できるアプリや文書、メール、チャットなどで、書きながら翻訳するためのショートカットキーです。
https://www.deepl.com/ja/windows-app

ですが、上記以外の用途でも普通に使えますし、機能面でもほとんど変化はなく、ほかのショートカットキーともかぶっていません。

そして、なによりショートカットキーが押しやすい位置にあるので、とても便利です。

そのため、この方法を使えば、ターミナルやブラウザ上でもストレスなく使うことができます。

なので、個人的には「Ctrl+Win+C」を使うのが一番いいのかなと思いました！

## まとめ

以上から、個人的にはデフォルトの「Ctrl + C」と「Ctrl+Win+C」を組み合わせて使うのが良いのかなという風に思いました。

特にブラウザでは「Ctrl + C」、ターミナルなどブラウザ以外の環境では「Ctrl+Win+C」を使っていくのが便利そうです。

他にも便利な使い方がないか探してみようと思います。

基本的な使い方については以上になります。

ありがとうございました！
初めてのキータ

皆様お初にお目にかかります。

私Aubeと申します。名前の意味は、フランス語で「夜明け」らしいです。というのも当方は

全く外国語ができません。喋れないではなく、できないです（笑）。


ではなぜこの名前にしたかというと、単なる自己陶酔という側面も確かにありますが、自分

の現状に満足していないからです。

早く闇（就活）が明けてほしい！そんな軽い気持ちでこの名前を付けました（笑）

どうぞよろしくお願いいたします。m(_ _)m
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（42/100）

【42日目】
トピック4：SAPS/4HANAの資材所要量計画（MRP）（9/10）

≪問題42≫
在庫レベルが発注点方式の発注在庫よりも少なくなる場合に、調達のトリガに使用されるロジックはどれですか。
□安全在庫レベルまで補充する。
□最大在庫レベルまで補充する。
□発注点在庫レベルまで補充する。
□ロットサイズ計算処理に基づいて補充する。

≪解答≫
□安全在庫レベルまで補充する。
□最大在庫レベルまで補充する。
□発注点在庫レベルまで補充する。
■ロットサイズ計算処理に基づいて補充する。

≪解説≫
◆発注点方式は、以下のプロパティを持つ品目に対して有効である。
（1）需要が比較的安定している。
（2）要求された在庫の補充が保証されている。
（3）調達の補充リードタイムが認識されており一定である。
◆このタイプの計画は、マニュアル入力された発注点使用して管理する。在庫がこの発注点を下回っていることが認識されると、ロットサイズ計算の設定を考慮して入庫要素がトリガされる。
awkコマンドのおさらい（備忘録）

# はじめに

こんにちは！
久々に **awk** コマンドを使ったので、備忘録としてまとめようと思います。
便利だけど、たまにしか使わないので、よく忘れます。。

# awk ってどんなコマンド？

awk は、テキストファイルを読み込んで、指定したパターンにマッチする行に対してアクションを実行するコマンドです。
例えば、「特定の条件に合致する行だけを抽出したい」「ファイルの中身をカンマ区切りで出力したい」といった処理を、簡単に行うことができます。

# awk の基本的な使い方

awk の基本的な構文は以下の通りです。

```bash
awk 'パターン { アクション }' 入力ファイル
```

* **パターン:** 処理対象となる行を指定するための条件を記述します。
* **アクション:** パターンに合致した行に対して実行する処理を記述します。
* **入力ファイル:** 処理対象のテキストファイルを指定します。

パターンとアクションは、それぞれ省略可能です。

**パターンを省略した場合:** 全ての行に対してアクションが実行されます。
**アクションを省略した場合:** パターンに合致した行がそのまま出力されます。

# 簡単な例

例えば、以下のような内容の `sample.txt` というテキストファイルがあるとします。

```
apple,100,red
banana,50,yellow
orange,80,orange
```

#### 1. 特定の列だけを抽出する

カンマ区切りのファイルから、特定の列だけを抽出したい場合は、 `$1` 、 `$2` のようにフィールド指定を行います。
`$1` は1列目、 `$2` は2列目を表します。

```bash
$ awk -F ',' '{ print $1 }' sample.txt 
apple
banana
orange
```

#### 2. 特定の文字列を含む行だけを抽出する

`sample.txt` から、"banana" という文字列を含む行だけを抽出したい場合は、以下のように記述します。

```bash
$ awk '/banana/ { print $0 }' sample.txt
banana,50,yellow
```

`/banana/` がパターンに該当し、 `print $0` がアクションに該当します。
`$0` は行全体を表すので、パターンに合致した行全体が出力されます。

#### 3. 特定の条件に合致する行だけを抽出する

`sample.txt` から、2列目の値が 70 より大きい行だけを抽出したい場合は、以下のように記述します。

```bash
$ awk -F ',' '$2 > 70 { print $0 }' sample.txt
apple,100,red
orange,80,orange
```

#### 4. 各行に処理を加えて出力する

`sample.txt` の各行に "fruit: " という文字列を先頭に追加して出力したい場合は、以下のように記述します。

```bash
$ awk '{ print "fruit: " $0 }' sample.txt
fruit: apple,100,red
fruit: banana,50,yellow
fruit: orange,80,orange
```

#### 5. 合計値を計算する

`sample.txt` の内容について、合計を計算する場合は、以下のように記述します。

```bash
$ awk -F ',' '$2 { sum += $2 } END { print sum }' sample.txt
230
```

#### 6. 特定の条件に合致した合計値を計算する

`sample.txt` の内容について、2番目の数値が７０より大きい数の合計を計算する場合は、以下のように記述します。

```bash
$ awk -F ',' '$2 > 70 { sum += $2 } END { print sum }' sample.txt
180
```
### まとめ

今回は awk コマンドの基本的な使い方について、復習を兼ねてまとめてみました。
awk は、一見すると難しそうに見えますが、基本的な使い方さえ押さえておけば、非常に強力なテキスト処理ツールとして活用できます。

この備忘録が、（私を含めて）awk を久しぶりに使う方の助けになれば幸いです。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（41/100）

【41日目】
トピック4：SAPS/4HANAの資材所要量計画（MRP）（8/10）

≪問題41≫
計画手配を製造指図に変換すると、計画手配の従属所要量はどうなりますか。
□製造指図に変換される。
□納入日程行に変換される。
□入出庫予定に変換される。
□計画手配に変換される。

≪解答≫
□製造指図に変換される。
□納入日程行に変換される。
■入出庫予定に変換される。
□計画手配に変換される。

≪解説≫
◆内製の場合、生産数量の計画に対して計画手配が登録されます。多段階生産では、最終製品が組立品目または構成品目で構成されている場合、対応する組立グループ所要量は従属所要量によってマッピングされます。
◆計画が完了したら、計画手配を製造指図に変換します。次に、計画手配の従属所要量が、製造指図の入出庫予定に変換されます。
できませんでした。高校入試平面図形 相似の証明「高校入試　過去問 数学 2017年度 大阪府立 一般 C問題 大問2 平面図形」(1)だけ　をsympyとFreeCADでやってみたい。

# 最初に
**私の解答の方法は、中学生の学習指導要領の範囲外です。** 
・youtube　ニッキーランド 様を何回も視聴しました。
・私は、本問題を理解するには、時間がかかります。途中までです。
　私は、「相似の修行？」が足りないのを痛感しました。

# オリジナル
ニッキーランド 様　youtube (00:00〜17:38)の内(1)だけ(00:00〜6:00) 

https://youtu.be/xUSWMM_Ln7Y

# sympyで(普通に？)
```python
# 相似の証明 と 実験???
from sympy import *
var('degGAE',real=True,poitive=True) # Intrval(0,90)
def myTriangleRad(myT):
    P1,P2,P3=myT.args[0],myT.args[1],myT.args[2]
    myPol=Polygon(P1,P2,P3)
    return myPol.angles[P1],myPol.angles[P2],myPol.angles[P3]
AB=3
B=     Point( 0, 0)
A=     Point( 0,AB)
E=     Point(AB,AB)
G=A+AB*Point(cos(rad(degGAE)),sin(rad(degGAE)))
F=Line(B,G).intersection(Line(A,E))[0]
# 
radBEF=Line(E,B).angle_between(Line(E,F))
radBGE=Line(G,E).angle_between(Line(G,B))
print("#",      (radBEF-radBGE)                   )
print("#",      (radBEF-radBGE).simplify()        )
print("#",float((radBEF-radBGE).subs({degGAE:90})))
print("#",float((radBEF-radBGE).subs({degGAE:60})))
print("#",float((radBEF-radBGE).subs({degGAE:45})))
print()
# 
radBFE=Line(F,B).angle_between(Line(F,E))
radBEG=Line(E,G).angle_between(Line(E,B))
print("#",      (radBFE-radBGE)                   )
print("#",      (radBFE-radBEG).simplify()        )
print("#",float((radBFE-radBEG).subs({degGAE:90})))
print("#",float((radBFE-radBEG).subs({degGAE:60})))
print("#",float((radBFE-radBEG).subs({degGAE:45})))
print()
# -acos((-3*(3 - 3*cos(pi*degGAE/180))*cos(pi*degGAE/180) - 3*(-3*sin(pi*degGAE/180) - 3)*sin(pi*degGAE/180))/(sqrt((3*sin(pi*degGAE/180) + 3)**2 + 9*cos(pi*degGAE/180)**2)*sqrt((3*cos(pi*degGAE/180) - 3)**2 + 9*sin(pi*degGAE/180)**2))) + acos(-sqrt(2)*(sqrt(2)*cos(pi*(degGAE/180 + 1/4)) - 1)*Abs(sin(pi*degGAE/180) + 1)/(2*(sin(pi*degGAE/180) + 1)*Abs(sqrt(2)*cos(pi*(degGAE/180 + 1/4)) - 1)))
# -acos(-(sqrt(2)*cos(pi*(degGAE/180 + 1/4)) - 1)/(2*sqrt(1 - cos(pi*degGAE/180))*sqrt(sin(pi*degGAE/180) + 1))) + acos(-(cos(pi*(degGAE/180 + 1/4)) - sqrt(2)/2)*Abs((sin(pi*degGAE/180) + 1)/(sqrt(2)*cos(pi*(degGAE/180 + 1/4)) - 1))/(sin(pi*degGAE/180) + 1))
# 0.0
# 1.1818212630765742e-125
# 1.1818212630765742e-125

# -acos((-3*(3 - 3*cos(pi*degGAE/180))*cos(pi*degGAE/180) - 3*(-3*sin(pi*degGAE/180) - 3)*sin(pi*degGAE/180))/(sqrt((3*sin(pi*degGAE/180) + 3)**2 + 9*cos(pi*degGAE/180)**2)*sqrt((3*cos(pi*degGAE/180) - 3)**2 + 9*sin(pi*degGAE/180)**2))) + acos(-3*(-sqrt(2)*cos(pi*(degGAE/180 + 1/4)) + 1)*cos(pi*degGAE/180)*Abs(sin(pi*degGAE/180) + 1)/(sqrt(9 + 9*cos(pi*degGAE/180)**2/(sin(pi*degGAE/180) + 1)**2)*(sin(pi*degGAE/180) + 1)**2*Abs(sqrt(2)*cos(pi*(degGAE/180 + 1/4)) - 1)))
# -acos(-(sqrt(2)*sin(pi*(degGAE/180 + 1/4)) - 1)/(2*sqrt(1 - cos(pi*degGAE/180)))) + acos(sqrt(2)*(sqrt(2)*cos(pi*(degGAE/180 + 1/4)) - 1)*cos(pi*degGAE/180)/(2*sqrt(sin(pi*degGAE/180) + 1)*Abs(sqrt(2)*cos(pi*(degGAE/180 + 1/4)) - 1)))
# 0.0
# 9.454570104612593e-125
# 2.3636425261531484e-125
```

# sympyで(オリジナル 様の方法で)
```
# ＞１点から同じ長さの線分が3本伸びている...
# degBGE=45 # degBAE/2=45
# degBEF=degBGE
```
つづく
帰省中にISC２メンバーになった話

# お久しぶりです。
家庭の事情で２か月ほど実家に帰ってました。
 帰省している間に勉強期間一週間でCC試験に合格したので
体験談共有できたらと思います。

守秘義務で詳しい内容については掲載できませんが。。。。

## CC試験とは何ぞや
ISC2が提供するSSCPよりもさらにエントリー向けの認定試験です。
問題数は100問で75％で合格です。100問のうち何問かは得点にならない問題なので難しいと思ったら捨てるのもありかと思います。

この資格を持っていることでISC2のメンバーとして認められて世界のエンジニアとの交流の場に参加ができたり専用のウェビナーに参加できたりします。

※注意
この試験は回答終了後に問題の見直しができません。
なのでじっくり考えましょう（自分は試験前注意事項の罠にはまって見直しできなかったです）

## 第1日目：決意と計画

ISC2が無料でCC認定試験を開催しているという情報をゲットしたので
資格試験を受けることを決意しました。
目標は帰るまでに取ること
とりあえず家庭事情含めて時間がないことがわかっていたので、1日目は計画を立てることに専念しました。

## 第2日目〜第6日目：勉強法
　教材
 ・無料で使える自習用のテキスト（公式から配布されるもの）
 
　2日かけてテキストを通し読み、後の3日間は最後の問題集をひたすら解き、安定して90％とれるようになったら不安なところを読む。
勉強日については週一で取れたらいいかもくらいだったので飛び飛びでやってました。
 

## 試験当日
時間かけてじっくりやったわけではないので緊張しながら会場に向かいました。
ベターなものとベストなものがある中でベストなものを選択する問題が多かったと思います。
後で見直せばいいやと思っていたので10分ですべての回答が終わりました。
最後の回答が完了した瞬間に試験終了したので合格通知が発行されるまでこの世の終わりにしか感じられませんでした


## まとめ
一問答えたら後戻りできないし時間はたっぷりあるので一個一個丁寧に答えていけば落ちることはないと思います。
次回SSCPを受けるときは一問一問丁寧にやっていこうと思いました。
今回のキャンペーンは全世界で100万人限定なので早いうちに受けることをお勧めします。
情報学の分野

## 情報学基礎
- 計算理論
- オートマトン理論・形式言語理論
- プログラム理論
- 計算量理論
- アルゴリズム理論
- 暗号系
- 情報数理
- 数理論理学
- 離散構造
- 計算論的学習理論
- 量子計算理論
- 組み合わせ最適化


## ソフトウエア

- アルゴリズム工学
- 並列処理・分散処理
- プログラム言語論・プログラミングパラダイム
- プログラム処理系
- オペレーティングシステム
- ソフトウエア工学
- ソフトウエアエージェント
- 仕様記述・仕様検証
- 開発環境
- 開発管理
- 組み込みソフトウェア


## 計算機システム・ネットワーク

- 計算機アーキテクチャ
- 回路とシステム
- VLSI設計技術
- ハイパフォーマンスコンピューティング
- リコンフィギャラブルシステム
- ディペンダブルコンピューティング
- 組み込みシステム
- ネットワークアーキテクチャ
- ネットワークプロトコル
- ネットワークセキュリティ技術
- モバイルネットワーク技術
- トランスポート技術
- オーバレイネットワーク
- トラフィックエンジニアリング
- ネットワーク運用技術
- ネットワーク計測
- ユビキタスコンピューティング
- 大規模ネットワークシミュレーション
- 相互接続性
- ネットワークノードオペレーティングシステム
- ネットワーク情報表現形式
- サービス構築基盤技術

## メディア情報学・データベース

- データベース（DBMS）
- コンテンツ
- マルチメディア
- 情報システム
- Webサービス
- モバイルシステム
- 情報検索
- グラフィクス
- 可視化
- コーパス
- 構造化文書
- ヒューマンインターフェイス
- ユーザモデル
- グループウエア
- バーチャルリアリティ
- ウエアラブル機器
- ユニバーサルデザイン
- アクセシビリティ
- ユーザビリティ

## 知能情報学

- 探索・論理・推論アルゴリズム
- 学習と知識獲得
- 知識ベ一ス・知識システム
- 知的システムアーキテクチャ
- 知能情報処理
- 自然言語処理
- 知識発見とデータマイニング
- 知的エージェント
- オントロジー
- ウェブインテリジェンス

## 知覚情報処理・知能ロボティクス

- パターン認識
- 画像情報処理
- 音声情報処理
- コンピュータビジョン
- 情報センシング
- センサ融合・統合
- センシングデバイス・システム
- 知能ロボット
- 行動環境認識
- モーションプランニング
- 感覚行動システム
- 自律システム
- ディジタルヒューマンモデル
- アニメーション
- 実世界情報処理
- 物理エージェント
- インテリジェントルーム

## 感性情報学・ソフトコンピューティング

- 感性デザイン学
- 複雑系
- 確率的情報処理
- 感性表現学
- 感性認識学
- 感性認知科学
- 感性ロボティックス
- 感性計測評価
- あいまいと感性
- 感性情報処理
- 感性データベース
- 感性インタフェース
- 感性生理学
- 感性材料製品
- 感性産業
- 感性環境学
- 感性社会学
- 感性哲学
- 感性教育学
- 感性脳科学
- 感性経営学
- ニューラルネットワーク
- 遺伝アルゴリズム
- ファジィ理論
- カオス
- フラクタル

## 図書館情報学・人文社会情報学

- 図書館学
- 情報サービス
- 図書館情報システム
- ディジタルアーカイブ
- 情報組織化
- 情報検索
- 情報メディア
- 計量情報学・科学計量学
- 情報資源の構築・管理
- 文学情報
- 歴史情報
- 情報社会学
- 法律情報
- 情報経済学
- 経営情報
- 教育情報
- 芸術情報
- 医療情報
- 科学技術情報
- 知的財産情報
- 地理情報

## 認知科学

- 認知心理学
- 進化・発達
- 学習・思考・記憶
- 推論・問題解決
- 感覚・知覚・注意
- 感情・情緒・行動
- 比較認知心理学
- 認知哲学
- 脳認知科学
- 認知言語学
- 行動意思決定論
- 認知工学
- 認知考古学
- 認知モデル
- 社会性

## 統計科学

- 調査・実験計画
- 多変量解析
- 時系列解析
- 分類・パターン認識
- 統計的推測
- 統計計算・コンピュータ支援統計
- 統計的予測・制御
- モデル選択
- 最適化理論
- 医薬生物・ゲノム統計解析
- 行動計量分析
- 数理ファイナンス
- データマイニング
- 空間・環境統計
- 統計教育
- 統計的品質管理
- 統計的学習理論
- 社会調査の計画と解析
- データサイエンス

## 生体生命情報学

- バイオインフォマティクス
- ゲノム情報処理
- プロテオーム情報処理
- コンピュータシミュレーション
- 生体生命システム情報学
- 生体情報
- ニューロインフォマティクス
- 脳型情報処理
- 人工生命システム
- 生命分子計算
- DNAコンピュータ
VSCodeで個人的に使用して見やすかったダークテーマ3選

### はじめに
VSCodeにて見やすく、非常に気にいっているダークテーマを3つ紹介します。

※各々のテーマでプログラムの見え方の違いが分かるように、各々のテーマで挿入しているプログラムは全て同じ内容です。pythonのプログラムで、import文・関数・while文・if文を使用しています。

※文字色などの設定は各々のテーマでカスタマイズ可能ですが、本記事ではデフォルトの設定で紹介しています。



### Dracula Official
以下2つの配色テーマを設定できます(順番はVSCodeで確認できる順序にて記載)。
・Dracula
・Dracula Soft

文字がはっきりした色で表示されるので、非常に文字が見やすく感じます。
関数名が明るい緑色で表示されている点や引数がオレンジ色で表示されている点が特に見やすいです。

https://marketplace.visualstudio.com/items?itemName=dracula-theme.theme-dracula

![Dracula.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816911/2de6b86f-32a2-7624-838c-c6d6469edf8b.jpeg)
画像：Draculaを設定

### Tokyo Night

以下3つの配色テーマを設定できます(順番はVSCodeで確認できる順序にて記載)。
・Tokyo Night
・Tokyo Night Light
・Tokyo Night Storm

「Tokyo Night」も「Tokyo Night Storm」も後述する 「One Dark Pro」と比較して、背景の色がより濃い印象です。「Tokyo Night」は背景が黒の印象で、「Tokyo Night Storm」は背景が青の印象です。文字が背景に溶け込んでおり、長時間コードを眺めても目が疲れにくいと思います。

https://marketplace.visualstudio.com/items?itemName=enkia.tokyo-night

![TokyoNight.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816911/2b0c1e73-e5e4-8ebb-ae8e-6e7e9eeb694e.jpeg)

画像：Tokyo Nightを設定

### One Dark Pro

**以下marketplaceのリンク内より引用**
>Atom's iconic One Dark theme, and one of the most installed themes for VS Code!

Atom の象徴的な One Dark テーマ。
以下4つの配色テーマを設定できます(順番はVSCodeで確認できる順序にて記載)。
・One Dark Pro
・One Dark Pro Darker
・One Dark Pro Flat
・One Dark Pro Mix

文字の色のトーンが落ち着いている印象で、長時間コードを眺めていても目がチカチカせず気にいっています。個人的には「One Dark Pro Darker」が特に気に入っていて、他の3つの配色テーマと比較して黒背景の黒さがより濃く感じるので、より関数や変数などの文字が見やすいです。

https://marketplace.visualstudio.com/items?itemName=zhuangtongfa.Material-theme

![OneDarkProDarker.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816911/1791d6c8-0886-296d-dc2f-4af92750115d.jpeg)

画像：One Dark Pro Darkerを設定
### 参考文献
本記事は以下情報を参考にして執筆しました。

https://designup.jp/vscode-best-themes.html
CloudBuildで環境変数を複数渡したかった

### 発生したエラー
cloudfunctionsをcloudbuildでデプロイしようとしていました
```
ERROR: (gcloud.functions.deploy) unrecognized arguments: --set-env-vars PROJECT_ID=your-project-id,SECRET_ID=your-secret (did you mean '--set-env-vars'?) 
```
### 原因
`set-env-vars`の構文ミスだった
### 解決策
正しい構文
```
--set-env-vars=PROJECT_ID=$PROJECT_ID
```

間違っていたやつ
- [普通のデプロイ](https://cloud.google.com/functions/docs/configuring/env-var?hl=ja)は以下のようにスペースを空けるので気がつかなかった
```
--set-env-vars　PROJECT_ID=$PROJECT_ID
```
### 今回作成したcloudbuild.yamlと叩いたコマンド
- コマンド
```
 gcloud builds submit --config=cloudbuild.yaml --substitutions=_SECRET_ID=your-secret
```

- yamlファイル
```yaml
steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  args:
  - gcloud
  - functions
  - deploy
  - YourFunction
  - --source=.
  - --region=${_REGION}
  - --trigger-http
  - --runtime=go121
  - --allow-unauthenticated
  - --set-env-vars=PROJECT_NUMBER=$PROJECT_NUMBER
  - --set-env-vars=_SECRET_ID=$_SECRET_ID

substitutions:
  _REGION: asia-northeast1
  _SECRET_ID: default-secret-id

options:
  env:
  - 'PROJECT_NUMBER=$PROJECT_NUMBER'
```
### **追記
``-gen2``オプションをつけると下記のエラーが表示されます
```
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Permission 'run.services.setIamPolicy' denied on resource ...
```
### エラー解消法
IAMからサービスアカウントに対して、CloudFunctionsのロールを付与してください

### 参考
https://cloud.google.com/functions/docs/configuring/env-var?hl=ja


https://lofichillhop.sakura.ne.jp/lofichill/a-00182-cloud-build%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/
Pythonで簡単な占いをしてみよう

## Pythonで占いをする処理を実装する
Pythonを少しずつ勉強していったので、今回は実行すると占い結果が出力されるものを作っていくよ。関数の書き方やライブラリのインポート、エラーなどの知識の復習としていろいろなものを使って書いてみるよ。それでは、完成のサンプルコードをまずは見せるよ。

```python
1.  import sys
2.  import random
3.
4.
5. def user_input():
6.     print('星座を入力してください')
7.     user_input = input()
8.     star_sign = ['牡羊', '牡牛', '双子', '巨蟹', 'しし', '乙女',  '天秤', '蠍', '射手', '山羊', '水瓶', '魚']
9.
10.    if user_input not in star_sign:
11.        print('正しい値を入力してください')
12.        sys.exit(1)
13.
14.    return user_input
15.
16.
17. def fortune(input):
18.     num = random.randint(1,10)
19.     match num:
20.         case 1: fortune = '大吉'
21.         case 2: fortune = '中吉'
22.         case 3: fortune = '吉'
23.         case 4: fortune = '末吉'
24.         case _: fortune = '小吉'
25.        
26.     print(f'{input}座のあなたの運勢は、{fortune}です')
27.
28.
29. def fortune_handla():
30.     try:
31.         input = user_input()
32.         fortune(input)
33.     except:
34.         print('占いに失敗しました。')
35.
36.
37. fortune_handla()
```

これからざっと初心者が詰まるかなと思ったところの解説をするよ。
37行目を実行することで、5~34行目で定義した関数（正確には`fortune_handla関数`を実行するとほかの関数が呼び出されて動いている`）を動かしているよ。

### import
コードの1~2行目でライブラリのインポートをするよ。
今回用いたライブラリは標準ライブラリなので、pipでインストールする必要はないよ。
今回では、12行目のように処理を終了させるために`sys`を使っているよ。
また、ランダムな数字を出力させるために`random`を使ったよ。

### input()
7行目の`input()`は、コードを実行する際に、文字を入力して使うことができるものだよ。今回は、星座を入力してもらって、それを処理していく流れになっているよ。

### f 文字列
コードの26行目で`f'{input}座のあなたの運勢は、{fortune}です'`とあるね。
これは`f 文字列`といって、`''`の中に文字列と置換フィールドを設定できるよ。また、`'%s座のあなたの運勢は、%sです' %(input, fortune)`といった感じにも書き換えることもできるよ。

### try-except
Javaでいうtry-catchのような、例外が出たときにキャッチして処理を行うものだよ。

## まとめ
今回は最近学んだことの総復習として、コードを解説したよ。
今回は少し実践に近いものにしたので、少し難しいかもしれないけど頑張ろう。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（40/100）

【40日目】
トピック4：SAPS/4HANAの資材所要量計画（MRP）（7/10）

≪問題40≫
プラントで、MRPが有効化されています。MRP実行から品目を除外するには、以下のどのオプションを利用できますか。
（２つ選択）
□特定のMRP一覧を使用する。
□特定の品目ステータスを使用する。
□特定の品目グループを使用する。
□特定のMRPタイプを使用する。

≪解答≫
□特定のMRP一覧を使用する。
■特定の品目ステータスを使用する。
□特定の品目グループを使用する。
■特定のMRPタイプを使用する。

≪解説≫
◆カスタマイジングでMRPを有効化することにより、MRPを実行するプラントを指定することができます。この区分が設定されている場合にのみ、計画ファイルに入力することが可能です。
◆MRPを有効化すると、以下の結果が生じます。
（1）MRPに関連する品目を登録すると、その品目コードが計画ファイルにコピーされ、計画用のフラグが設定されます。
（2）MRPに関連する変更を行うと、品目に計画用のフラグが設定されます。
◆ 計画ファイルエントリの設定条件が満たされている場合でも、品目マスタのMRPタイプを使用して（例えば、MRPタイプNDを使用する）、すでに計画ファイルに含まれている品目をMRP実行から除外することができます。さらに、MRPの品目ステータスを使用して品目をロックするか、品目計画に関する警告を生成することも可能です。
Gstreamerを使ってJetsonカメラから映像を、受信して表示するFPVアプリを作りたい

## Gstreamerを使ってUAV/USV/UGVになどに搭載しているカメラから映像を、受信して表示するFPVアプリを作りたくなりました。

![Screenshot from 2024-07-05 15-30-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117164/f14be371-5202-e52e-cca0-d6d9c6713a9b.png)


* アプリを作る前に、基本を抑えるためコマンドベースでの動作検証を行いました。  
* PCでの検証はUbunt搭載の自作マシン、SBCはJetson Nano 2GB Developer Kitを使いました。  

### PC環境
* Ubuntuは将来的にDeepStreamと連携を行うため22.04です。  
```bash
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.4 LTS
Release:	22.04
Codename:	jammy

$ uname -r
6.5.0-41-generic
```

### SBC(Jetson)
* メモリについてですが、カメラからのキャプチャ映像をWifi送信するだけのなので2GBで問題ないです。  
* 512MBしかないRaspberry Pi Zero2でも大きな遅延などの問題は特に起こりませんでした。  
```bash
jetson@nvidia:~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.6 LTS
Release:	18.04
Codename:	bionic

jetson@nvidia:~$ uname -r
4.9.337-tegra
```
カメラはAliexpressで見つけた1200円くらいのIMX219でメーカ不明です。  
ケーブルの方向やケーブル裏表などシビアでした。  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117164/8db84e7d-19c5-56b1-dd2b-2c87dd86392b.jpeg" width="360px">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117164/c924f9bb-37c1-d0dd-01bc-0e90347733ed.jpeg" width="360px">

### 1.環境確認
* まず初めにハードウェアが認識されているか確認します
https://qiita.com/hexaforce/items/8ea21d893c478ade1ad9
### 2.キャプチャして確認
* 次に、GStreamerを入れてカメラからキャプチャできるか確認します。 
https://qiita.com/hexaforce/items/a356bbfa4bebbb574f36
### 3.ループバックでストリーミングしてみる
* キャプチャできることがが解ったらスタンドアローンでストリーミングしてみます
https://qiita.com/hexaforce/items/59a4d9f240c6da54a0b0
### 4.Wifiでアクセスポイントを立ち上げる
* 受信側をアクセスポイントとして、送信機とのWifi接続を設定します
https://qiita.com/hexaforce/items/06d689e464668f1c0206

### 5.ストリーミングしてみる
* 最後に、ストリーミングWifiを介してストリーミングができる事を確認します

#### H.264リアルタイムストリーミング受信側(Ubuntu)
```bash
$ gst-launch-1.0 -e udpsrc port=5000 ! application/x-rtp, encoding-name=H264 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
```
#### H.264リアルタイムストリーミング送信側(Jetson)
```bash
# 送信側：
jetson@nvidia:~$ gst-launch-1.0 -e nvarguscamerasrc sensor-id=0 ! \
'video/x-raw(memory:NVMM), width=1920, height=1080, framerate=30/1' ! \
nvv4l2h264enc bitrate=4000000 ! rtph264pay ! udpsink host=[受信側のIPアドレス] port=5000 sync=false async=false
```
![Screenshot from 2024-07-06 17-38-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117164/9becc0a4-fbf7-607e-59cc-99712cf3f7e2.png)
GStreamerでループバックストリーミング

### ループバックアドレスを使いスタンドアロンでストリーミングします

## PC環境

#### [PC USBカメラ] MJPGリアルタイムストリーミング(ループバック)
```bash
# 送信側：
$ gst-launch-1.0 -e udpsrc port=5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)JPEG, payload=(int)26" ! rtpjpegdepay ! jpegdec ! videoconvert ! autovideosink
# 受信側：
$ gst-launch-1.0 -e v4l2src device=/dev/video0 ! 'image/jpeg,width=1920,height=1080,framerate=60/1' ! jpegparse ! rtpjpegpay ! udpsink host=127.0.0.1 port=5000
```
#### [PC USBカメラ] H.264リアルタイムストリーミング(ループバック)
```bash
# 送信側：
$ gst-launch-1.0 -e v4l2src device=/dev/video0 ! 'video/x-h264,width=1920,height=1080,framerate=30/1' ! h264parse ! rtph264pay ! udpsink host=127.0.0.1 port=5000
# 受信側：
$ gst-launch-1.0 -e udpsrc port=5000 ! application/x-rtp, encoding-name=H264 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
```

## SBC(Jetson)

#### [Jetson MIPIカメラ] H.264リアルタイムストリーミング(ループバック)
```bash
# 送信側：
jetson@nvidia:~$ gst-launch-1.0 -e nvarguscamerasrc sensor-id=0 ! \
'video/x-raw(memory:NVMM), width=1920, height=1080, framerate=30/1' ! \
nvv4l2h264enc bitrate=4000000 ! rtph264pay ! udpsink host=127.0.0.1 port=5000 sync=false async=false
# 受信側：
jetson@nvidia:~$ gst-launch-1.0 -e udpsrc port=5000 caps="application/x-rtp, media=video, encoding-name=H264, payload=96" ! \
rtph264depay ! nvv4l2decoder ! nv3dsink
```
#### [Jetson MIPIカメラ] H.265リアルタイムストリーミング(ループバック)
```bash
# 送信側：
jetson@nvidia:~$ gst-launch-1.0 -e nvarguscamerasrc sensor-id=0 ! \
'video/x-raw(memory:NVMM), width=1920, height=1080, framerate=30/1' ! \
nvv4l2h265enc bitrate=4000000 ! rtph265pay ! udpsink host=127.0.0.1 port=5000 sync=false async=false
# 受信側：
jetson@nvidia:~$ gst-launch-1.0 -e udpsrc port=5000 caps="application/x-rtp, media=video, encoding-name=H265, payload=96" ! \
rtph265depay ! nvv4l2decoder ! nv3dsink
```
世界各国の実質GDP成長率をPowerBIで自動取得する

売上を検証したり予測したりする場合、指標としてGDP成長率を使う場合があります。

取得に手間をかけたくないので、以前はOECDのWEBサイトから取得していたのですが仕様が変わったらしくエラーを返すようになり、良い機会でもあったので別の取得方法を検討しました。

絶対条件として「世界各国のGDP成長率が取得できること」「売上を予測して予算計上にも使用するため、実績値だけではダメで予測値も取得したいこと」「ダウンロードしてインポートなどの手間はかけたくない。自動取得できる事」「データの出所を聞かれた際相手（上司・他部署・顧客etc...）に納得してもらえる公的機関のデータであること」の4点となります。

いろいろ探していたら下記を発見。
https://www.imf.org/external/datamapper/NGDP_RPCH@WEO/OEMDC/ADVEC/WEOWORLD
IMF（国際通貨基金）のデータですので、権威としては十分ではないかと笑
というわけでこのデータをPowerBIで取得してみましょう。

https://www.imf.org/external/datamapper/api/help
APIについて記載されているページはこちら。

PowerBIを起動させ「データの変換」⇒「新しいソース」⇒「WEB」で上記2019年・2020年限定のWEBAPIアドレスからデータ取得を試みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/eb8af6a9-5009-14a6-aa80-f918d06f2332.png)

そうするとデータを取れることは取れるのですが、なぜか全てカラム（列）で取得してきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/987a573a-4489-29d3-23f4-b0dcd68f3c75.png)

この謎解釈は嫌なので下図のようにクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/338ec200-4f95-17c6-d116-ade69dc0514a.png)

次に出てくる「Record」もクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/ec642df2-d498-0978-87be-0b2043970b27.png)

順番が正しければ各国のコード（3文字）と取得した年のGDP成長率が格納されたレコードが取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/6ad216a0-c496-be70-aee2-99409301a4b9.png)

この段階で「テーブルへの変換」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/1a40f365-46cc-2b23-fd80-28a2d8384c99.png)

見た目はあまり変わりませんが…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/103adcd1-2e8f-1aa3-69ff-8624a0c00a12.png)

「Value」をクリックして展開すると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/349e01ca-bcfb-52e9-e82b-0b069892beb3.png)

こういう形式になるので…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/511fbbba-db52-b53b-b2a4-782d98b37c96.png)

下記の様にクリックして処理します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/2d0cf4a1-2291-122a-3515-4531176bd6a9.png)

これで国コード・年・GDP成長率のリストとして使用できる状態になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/ba394319-b2ad-c352-18aa-7365a7d60fa1.png)

予測に使うには未来込みですべての念を取得したいので今回の場合「?periods=2019,2020」を消去して再度データを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/d777c7f9-8ccf-4676-9511-d36d6b5b9fa8.png)

展開する年に下記の様にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/40a9388c-417e-b6cb-a4c1-1c47e6bcc80d.png)

これで未来の年も含んだ実質GDP成長率をデータセットとして使用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/6442ba64-6c3a-e288-6158-5234e33afa65.png)
（2024年時点では2029年までしか選択できないため、数年後にデータ取得をやりなおすメンテナンスが発生します。毎回ダウンロードするよりははるかによいと思うのですがノーメンテでやれる方法はないかなと考え中）

個人的なおすすめとして、PowerBIサービス上で「データフロー」として構築してしまったほうが使いまわしは利くと思います。

他のオープンデータについても記事で紹介していく予定。
エンジニアではありませんが何かのお役に立てばうれしいです。
【Kotlin】【Swift】アクセス修飾子基本事項

# はじめに
Kotlin, Swiftや他言語で開発を行っていると、正確なアクセス修飾子の意味について忘れることがある。
都度調べていたが、特によく使うKotlin/Swiftの両言語のアクセス修飾子についてまとめてみる。

# アクセス修飾子

### Kotlin
| アクセス修飾子 | 意味 |
|:-|:-|
| public  | どのクラスからでも見れる。<font color="Red">デフォルト</font> ※1
| internal  | 同一モジュールからならどこからでも見れる ※2  |
| private  | クラス内にのみ公開  |
| protected  | サブクラスに公開  |

※1. Kotlinの場合、アクセス修飾子を省略するとpublic扱いとなる。デフォルトはpublic
※2. アプリ内（=同一パッケージのはず）であればpublicもinternal同じ意味となる。
　　例えば、ライブラリ化したときにhogehoge.jarを作ったとして、
　　hogehogeライブラリ内にinternalな変数へはライブラリ外からはアクセスできないことになる。

### Swift
| アクセス修飾子 | 意味 |
|:-|:-|
| open  | どのファイル/モジュールからでもアクセス可能。継承やオーバーライドも可能。
| public  | どのファイル/モジュールからでもアクセス可能。ただし、継承やオーバーライドは不可
| internal  | 同一モジュールからならどこからでも見れる <font color="Red">デフォルト</font> ※3  |
| fileprivate  | 同じファイル内であればアクセスすることができる  |
| private  | クラス内にのみ公開  |

※3. Swiftの場合、アクセス修飾子を省略するとinternal扱いとなる。デフォルトはinternal

# 最後に
デフォルトのアクセス修飾子が異なったり、微妙に言語仕様が異なるので注意が必要。
毎回忘れて調べ直すことになっていたので、まとめることができて良かった。
バケットを削除した後、同じ名前のバケットを作成できるようになるまでどれくらいかかりますか？

バケットを削除すると、新しいリージョンまたは新しいバケット所有者によって再利用できるまでに最大で1〜2時間の遅延が発生することがあります。同じリージョンや同じバケット所有者でバケットを再作成する場合は、遅延はありません
TCP/IPの知見を深める①

回線交換方式
------------
データをやり取りする前に１対１の伝送路を作り、やり取りが終わるまで使い続ける方式
接続している間は回線を占領しているため、安定した通信品質を実現することができるが、回線の利用効率が非常に悪い。

パケット方式
--------------
データを**パケット**と呼ばれる小さな単位に分けて、ネットワークに流す仕組み

膨大なデータ量を送るのは効率が悪いため、データを小さく細切れにして送り先でデータを元の形に戻すことで効率が良くなる
パケット（小包）を意味している

パケットを送る際にヘッダーをデータにくっつけて送信することでパケットの宛先（コンピューターの情報）やデータの何番目に当たるかなどヘッダーの情報をもとにパケット化する前の元のデータに復元することができる。

パケットの一部分が何らかで無くなったり、壊れていたとしても、壊れたパケットのみ送信すればよいので**復旧しやすい。**

**必要な分だけ取ってこれるなんてすごい便利！！**

プロトコル
--------------
**プロトコル**
パケットを処理するための約束事が決まっている。
プロトコルが整備されているおかげで、違うメーカー・OS・無線有線問わず、通信を行えるようになった

**プロトコルはすぐに発見することができる**
webサイトを見る際、https*//www.hogehoge.com/のようなURLで見られるHTTPSがプロトコルに該当する
**HTTPSのご紹介**
HTTPSはhyper transfer　Protocol Secureの略
WEBサーバとWEBブラウザの間で暗号化しながらパケットを送ります　　というプロトコルになる。
（HTTPSの約束事に基づいて、パケットの処理を行います！！！）という意味！

送信先
---------
現実で住所を知らないと贈り物を送れないように、ネットの世界でも住所を知らないとパケットを送信することができませんから、住所を割り当ててあげて、パケットを送れるようにする必要があります。

とあるサイトにデータを送りたい場合、私たちが認識できる住所はwww.hogehoge,comです。
それとは別に172.217.175.4と数字の住所も存在しています。
パケットを送る場合、この数字を住所をもとにデータを送るようになっています。

MVNOの仕組み
--------------------
もし仮にパケットが壊れたり、なくなったりした時のことを考慮して、エラーを通知したり、データを再送する等、被害を最小限に抑えるMVNO（Moble Virtual Network Operator） が生まれた。

プロトコルの階層構造
--------
プロトコルで制御されている通信機能は、処理に応じて階層構造になっている。
送信元のコンピューターは階層ごとに用意されたプロトコルに沿って、上の階層から順にデータの処理を行いパケットとして伝送媒体に送っている。

受け取るコンピュータは送るコンピュータとは逆に下の階層から順に元のデータに戻していきます。

送るコンピュータ
検索文字の入力→データの分割→宛先の特定→パケットの送信
サーバー側
パケットの受信→送信元の特定→データの結合→検索処理の実行

階層構造モデル
---------------
TCP/IP モデル
------------
リンク層/トランスポート層/インターネット層/リンク層

**第一層**
リンク層
デジタルデータを物理的な伝送媒体に流す変換・変調処理を行う、かつ、信頼性を確保する処理を行なっている。

**第二層**
インターネット層
宛先となるコンピューターまでの通信経路を確保する処理を行う

**第三層**
トランスポート層
アプリケーションの識別を行い、それに応じた通信制御を行う。
**第四層**
アプリケーション層
ユーザーに対して、アプリケーションの提供を行う

それぞれの階層は役割分担がされていて、順々に処理が行えている
自分の階層の処理が終わると、次の階層にデータを引き渡し、自分の階層以外には関与しない←トラブルシュートしやすい

TCP/IPモデルはOSI参照モデルよりも歴史が古く、実用性を重要視していることもあり、今は
TCP/IPモデルの構造が主流である。

OSI参照モデル
----------
物理層L1/データリンク層L2/ネットワーク層L3/トランスポート層L4/セッション層L5/プレゼンテーション層L6/アプリケーション層L7

**第一層**
物理層（L１）
デジタルデータを物理的な伝送媒体に流す変換・変調処理を行う、かつ、信頼性を確保する処理を行なっている。
**第二層**
データリンク層（L2）
物理層の信憑性を確保する処理を行う。
**第三層**
ネットワーク層（L3）
宛先となるコンピュータの通信経路を確保するための処理をおこなう
**第四層**
トランスポート層（L4）
アプリケーションの識別を行い、それに応じた通信制御を行う
**第五層**
セッション層（L5）
ログイン・ログアウト等、アプリケーションレベルの管理を行う
**第六層**
プレゼンテーション層(L6)
アプリケーション層にわかりやすいようにデータの変換を行う
**第七層**
アプリケーション層（L7）
アプリケーションの機能をユーザーに対して提供する

特徴として、TCP/IPと同じく、それぞれの階層ごとに役割が違っていて別々な処理を行っていること、自分の階層の処理が終わるとほかの階層の処理にはか関与することはないという点
国際的な標準化を計り、作られたが、通信機能を細かく分類させてしまったため、使い勝手が難しくなり使われることがなくなった

PDU
=============
**protocol Data Unit** 
各階層で処理されるひとまとめのデータ、　データの単位のことをPDUと表現する
PDUは**ヘッダー**と**ペイロード**で構成されていて処理されている階層によって名称が異なる。
![pdu.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162351/0d5001b6-92a1-57ed-4fa0-020874d4d48e.gif)

**ネットワークについて説明をする際は、名称を使い分けることによって、話し相手と利き手が階層を意識して会話を進めることができて認識の食い違いが起きることを防ぐ**
生成AIをフル活用したイラストサイトを作ってみた

# 作ったもの
誰でも**無料で使えるイラストサイト**を作ってみました🎉

「**AIを使って人間では作りきれない数のイラストを作ったらどうなるんだろう？**」という興味を形にしています。
技術構成はNext.jsとSupabaseを使っています。

https://illust-san.com

# 作るにあたって工夫したこと
* ストレスを減らすためにイラストがすぐに表示される
* 検索機能や関連イラスト機能を簡単に実装する
* なるべく手間なく大量のイラストを作成・登録する
* SEO対策を施す

## ストレスを減らすためにイラストがすぐに表示される
![スクリーンショット 2024-07-06 17.37.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/5cdf18e5-4ae1-90b0-ecfb-27e6ca3eae7c.png)

アクセスをしてから**すぐに画像が表示される**ように、Next.jsを使ってSSRとキャッシュを行っています。
AppRouterを使って画像のURLをサーバサイドで取得し、[Image Component](https://nextjs.org/docs/pages/api-reference/components/image)で描画をすることでVercelがキャッシュを行ってくれるため、２回目以降の描画が早くなります。

## 検索機能や関連イラスト機能を簡単に実装する
以下のような検索機能と関連イラスト機能を実装しています。
![スクリーンショット 2024-07-06 17.42.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/1d20e234-f9e9-aa1e-e27b-2dbfb877cba3.png)
![スクリーンショット 2024-07-06 17.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/82c778ef-538c-9612-e02d-b9008355db9f.png)

実はこの二つ、**同じ関数で実装**しています。
OpenAIの[Embeddings](https://platform.openai.com/docs/guides/embeddings)を活用しています。
Embeddingsは簡単にいうと、テキストデータを数値ベクトルデータに変換する機能です。
Embeddingsを活用することで、以下のようなことができます。

* 検索（クエリ文字列の関連性に基づいて結果がランク付けされる）
* クラスタリング（テキスト文字列が類似性によってグループ化される）
* 推薦（関連するテキスト文字列を持つアイテムが推奨される）
* 異常検知（類似性の低い外れ値が識別される）
* 多様性測定（類似性分布が分析される）
* 分類（テキスト文字列が最も類似したラベルによって分類される）

あらかじめ、各イラストのテキストをEmbeddingsでベクトル化してデータベースに保存をしておきます。
検索機能は、ユーザの入力をEmbeddingsでベクトル化して、データベースから近い順に画像を取得することで実装しています。
また、関連イラスト機能は、現在開いているイラストのベクトルデータに近い画像を取得して実装しています。

## なるべく手間なく大量のイラストを作成・登録する
AIイラストを作成するには、いくつかの手順を踏む必要があります。

* プロンプトの作成
* 画像の生成
* 画像の透過
* 画像の説明文の作成
* データ登録

この**一連の流れを自動化**させました。
プロンプトの作成は、イラストとして需要がありそうなジャンルをChatGPTに考えてもらい、そのジャンルに適する**プロンプトを複数考えてもらいます**。
そのプロンプトを使ってLoRA学習済みStable Diffusionを使って画像を生成し、[rembg](https://github.com/danielgatis/rembg)という**ライブラリを使って背景を透過**します。
画像の説明文はChatGPTに**画像をインプットしてタイトルと説明文**を作成します。
最後に**クオリティチェックをChatGPTで行い**、問題なければデータベースに登録します。

## SEO対策
イラストサイトは基本的に流入は検索エンジンからとなるので、**最低限のSEO対策**を行います。

[Web Developer](https://chrispederick.com/work/web-developer/)というChrome拡張のView Document Outlineを使って**H1タグ等が適切に設定されているかを確認**します。

![スクリーンショット 2024-07-06 17.53.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/b2c80680-f2bb-cab0-96f6-a80639e7fc92.png)

また、ページ遷移はJSを使わずに全て**aタグ**にしています。
最後にNext.jsの[sitemap機能](https://nextjs.org/docs/app/api-reference/file-conventions/metadata/sitemap)を使って**全ページ分のsitemap**を作って、Search Consoleに登録します。
早速、いくつかのイラストが画像検索で引っ掛かることを確認しました。

# 最後に
Next.jsとSupabaseを使うことで、フリープランでイラストサイトを作ることができました。
運用費用がほぼ０円でサイトを維持することができます(OpenAI Embeddings APIのコストがかかるが、100万文字で3円程度)。
生成AIをフル活用したサイトになっているので、ぜひご覧ください。

https://illust-san.com
Jetpack Compose の基本のメモ

[Jetpack Compose の基本](https://developer.android.com/codelabs/jetpack-compose-basics?hl=ja#0)を勉強したので、その時のメモ

### 始める前に
+ Jetpack ComposeはUI開発を簡素化するために設計された最新のツールキットのこと
+ 完全な宣言型（「何をしたいか」を指定するだけで、「どうやってするか」を気にしなくていい）
+ コンポーズ可能な関数で構成される
+ コンポーズ可能な関数は他のコンポーズ可能な関数を呼び出せる
+ UIコンポーネント＝コンポーズ可能の関数＝コンポーザブル

#### Composeに必要なオプションと依存関係を含むファイル
+ build.dradle.ktsファイル
+ app/build.gradle.ktsファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215907/e40905f7-e6a4-f154-de37-8f870fcbc6ff.png)

#### setContent内のアプリのテーマ
+ プロジェクトごとに異なる
+ プロジェクト名を変更するときは、ui/Theme.ktファイルのテーマの関数名を変更する必要がある

### Composeを始める
+ コンポーズ可能な関数とは@Composableアノテーションがついている関数のこと
+ ユーザーがアプリを開くと、MainActivityが起動される
+ AndroidManifest.xmlファイルで指定されている
+ setContent内でコンポーズ可能な関数を呼び出してUIを定義する
【Unity】Recorderを設定しよう

# Recorderとは？

「Unity Recorder」とは、Unity のエディタ内でゲームプレイ、アニメーション、その他のシーンコンテンツをビデオ、画像、オーディオ、アニメーションクリップなどのさまざまな形式でキャプチャおよびエクスポートするツールです。

# インストール方法

Unityエディタを開き、上部のメニューから
「Window」>「Package Manager」を選択します。
右上の検索バーに「Recorder」と入力し、出てきたパッケージをインストールします。

<img width="650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470968/da262600-c99c-ddf4-08d5-6448ff560ed0.png">

# ウィンドウの準備

１.「Recorder」ウィンドウを開きましょう。

Unityエディタを開き、上部のメニューから
「Window」>「General」>「Recorder」>「Recorder Window」を選択します。

２.「Recorder」を追加しましょう。

今回は、Movie Recorder の設定方法を紹介するので、
「Add Recorder」>「Movie」を選択します。

# 各種設定

それでは、上から順に各種設定を紹介していきます。

<img width="650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470968/8b9069e8-ae8d-78c3-05c7-6f9ba9af7d0d.png">

【Frame Rate】
- Playback -> フレームレートの制御方法（固定 or 可変）
- Target FPS -> 目標となるフレームレート値
- Cap FPS -> FPSが目標FPSを超えた場合にフレームレートを制限するか

【**Capture**】
- Source -> 録画する対象
- Output Resolution -> 録画するビデオの解像度
- Include Audio -> 音声を保存するか

【**Format**】
- Media File Format -> 出力形式
- Quality -> ビデオ品質

【**Output File**】
- File Name -> 出力ファイルの名前
- Path -> 出力先

以上です！最後までご覧いただきありがとうございました :laughing:
Webサーバとは

# Webサーバとは
Webサーバとは、Webサイトの機能を提供するサーバ
HTMLファイルや画像ファイル、プログラムなどを置いておく。クライアントのブラウザがアクセスしてくると、それらのファイルを提供する
# 代表的なソフト
- Apache
- NgInx
- IIS
Tableau serverのログ削除方法

## はじめに

TableauServerは使い続けているとログが溜まっていき、ディスク使用率が100%に達するとサービス停止してしまいます。
サービス停止してしまうと復旧するためにいろいろと面倒なので、そうなる前に不要なログを削除してディスク使用率を削減する必要があります。

## ログのバックアップ

ログは不要なら消してしまって問題ありませんが、必要に応じてバックアップをとってください。

https://help.tableau.com/current/server/ja-jp/db_backup.htm

## ログのクリーンアップ
ログ削除は下記コマンドで行えます。
`tsm maintenance cleanup `

`df -h`で容量を確認します。下記の場合は98%まで逼迫してしまっています。
```
$ df -h
Filesystem       Size  Used Avail Use% Mounted on
/dev/root        969G  947G   23G  98% /

```
`tsm status`で状態を確認しておきます。
```shell
$ tsm status
Status: RUNNING

# 一週間よりも古いログファイルを削除
$ tsm maintenance cleanup -l --log-files-retention 7
Starting the cleanup job.
The last successful run of CleanupJob took 0 minute(s).

Job id is 'xxxx', timeout is 60 minutes.
100% - 古いログ ファイルを削除しています。 。
Cleanup completed.

# 再度確認
$ tsm status
Status: RUNNING

$ df -h
Filesystem       Size  Used Avail Use% Mounted on
/dev/root        969G  551G  419G  57% /
```

## 参考

https://help.tableau.com/current/server/ja-jp/maintenance_cleanup.htm

https://dev.classmethod.jp/articles/disk-full-measures-for-tableau-server/
開発…の前に開発説明の用語がわからん1

## はじめに
最高のエンジニアになるにあたって、開発関連の説明を見ると、用語のレベルが初心者の私には高いと感じる場面があります
一度調べても、数日後には「あれ？どのような意味だっけ？」という状態になっています
私自身が見返せるようにするためでもありますが、アウトプットとして、わかりやすく内容をまとめてみたいと思います
今後もわからない用語は増えていくと思います(-_-;)そのたびにアウトプットしようと思います


## わからなかった用語
- [ ] デプロイ可能な環境とは
デプロイ可能な環境: アプリケーションを実際に運用できるサーバーやサービスが整った状態。英語の"deploy"は、「展開する」「配置する」という意味。
<br>

- [ ] プロダクトをリリースとは
開発したソフトウェアやサービスを正式に公開・提供すること。英語の"release"は、「公開する」「リリースする」という意味。
<br>

- [ ] 開発タスクとなるISSUEを作成する、とはどういう事
開発の課題やタスクをGitHubなどのツールで"ISSUE"として記録すること。ISSUE:は英語で、「問題」「課題」という意味。
<br>

- [ ] マイルストーンを明確にする、とはどういう事
開発プロジェクトの重要な節目や達成目標を明確に設定すること。マイルストーンは、プロジェクトの重要な進捗点や目標を指す。

- [ ] インフラ構築とはどういう事
サーバー、ネットワーク、データベースなどの基盤となるシステムを設計・設定すること。
<br>

- [ ] WebAPIとは
ウェブ上でアプリケーションがデータや機能を相互にやり取りするためのインタェース。
<br>

- [ ] CSSフレームワーク」とは
レスポンシブデザインやスタイリングを簡単にするためのCSSテンプレートの集合。例: Bootstrap, Foundation。
<br>

- [ ] フロントエンドのフレームワークとは
ウェブアプリケーションのユーザーインターフェースを効率的に開発するためのツールセット。例: React, Vue.js, Angular。
<br>

- [ ] アジャイル開発とは
小さな機能単位で頻繁にリリースしながら改善を繰り返す開発手法。
<br>

- [ ] プルリクエストとは
GitHubなどで、自分の変更をメインブランチに統合してもらうためのリクエスト。単純なリクエストである、一般的な要求や依頼のことに類似
<br>

- [ ] プルリクエストをマージするとは
提出されたコード変更をメインブランチに統合すること。マージは英語で"merge"「統合する」という意味。
<br>

- [ ] 「プルリクエストをマージするとリンクされたISSUEは自動でクローズし、In ProgressからDoneに移動します。」というないようについて
プルリクエストをマージすると、関連するISSUEが自動的に完了（クローズ）としてマークされる。
In ProgressからDoneに移動: 作業中（In Progress）のタスクが完了（Done）として更新されること。
<br>

- [ ] ストーリーポイントとは
アジャイル開発で、タスクの複雑さや作業量を相対的に評価するための単位。
<br>

- [ ] クローラーとクロールについて
クローラー: 検索エンジンがウェブサイトを自動的に巡回するプログラム。
クロール: クローラーがウェブサイトを巡回する行為。


## まとめ
現段階での開発に入る前の説明でわからなかった用語をまとめました。
専門用語が増えれば増えるほど混乱。言われた瞬間理解できるよう頑張ります。
集中演習SQL入門 BigQueryで始めるビジネスデータ分析からの学び

<h2>年-月-日のデータを取る方法</h2>

2021-01-20といった形で日付型のデータを取りたいときは、%Fを使う
~~~SQL
format_datetime("%F",date_time)
~~~
参考
https://cloud.google.com/bigquery/docs/reference/standard-sql/format-elements#format_elements_date_time

<h2>文字列や小数が入っているデータを整数へ変換</h2>

SQL出方変更をするときには、CAST()関数を使う。小数から整数へ変換
~~~SQL
CAST(your_field AS INT64) AS your_field,
~~~

<h2>文字列や小数が入っているデータを整数へ変換</h2>

SQL出方変更をするときには、CAST()関数を使う。小数から整数へ変換
~~~SQL
CAST(your_field AS INT64) AS your_field,
~~~

<h2>SQLでWith句を２つ以上書く</h2>

,を使うことでwith句を2つ以上作れる
~~~SQL
with cart as(
select concat(cid,"-",session_count) as session , count(page)
from sample.web_log
where page="/cart/"
group by session
),
thank as(
select concat(cid,"-",session_count) as session , count(page)
from sample.web_log
where page="/thank_you/"
group by session
)
~~~

<h2>SQLで欠損値処理をする</h2>

SQLでnullの値へ何かを入れるときには、ifnull()関数を使う
~~~SQL
select ifnull(registration_year,2017) as reg_year
from sample.small_ltv
~~~

<h2>関係ない2つの値を横並びにするときは、cross joinを使う</h2>

同一の関数から出せず、共通のキーもない場合にはcross joinを使って結合をする
~~~SQL
with master as(
  select sum(revenue) / sum(quantity) as avg_unit_price_1
  from sample.sales
  where product_id =1),
master2 as(
  select sum(revenue) / sum(quantity) as avg_unit_price_all
  from sample.sales)
select *
from master cross join master2 
~~~