OmniAICreator/Qiita-1.07M huggingface dataset:
【Glid】１０分で完成！競合店価格調査アプリ

# 【Glid使用】もうこそこそ写真を撮る必要はありません！競合店の価格調査アプリを作成！
いつもご来店ありがとうございます。
北の大地でスーパーマーケットの店員さんやってます。

今回はGlidを使用し**競合店の価格調査アプリ**を作成しました。

https://www.c3reve.co.jp/post/glide-rateplan-comparison

↑Glidについてとても分かりやすく紹介しているサイトがあったので載せておきます。

## スーパーマーケットにおける価格調査とは？

:::note info

**競合店や市場で販売されている商品の価格を調べ、比較・分析するプロセスのこと。**
競合するスーパーや店舗が同じ商品をいくらで販売しているかを把握することで、自店舗の商品価格を市場の動向に合わせて調整し、顧客にとって魅力的な価格設定を実現することを目的に行われます。


:::

当社ではこの価格調査(“PW”とも言います)を毎週1回行うことになっており、自分の担当部門の価格調査を行い報告する必要があります。

どうやって価格調査をするのか？といえば上司より指定された品目に対して売価を調べてくるのですが、当然堂々とメモは取れません。
こっそりとスマホで写真を撮ったり、店に電話して電話の相手にメモを取ってもらったりしているケースが多いです。

わたしはスマホでこっそり写真を撮る派なのですが、スマホのストレージを圧迫してきます。
何よりも気に食わないのが子供の写真よりも自分の店舗の売場と価格調査の売価の写真の方が多いこと！

そこで簡単にメモを取るために作成したのがこちらです。

# 完成品

[![Image from Gyazo](https://i.gyazo.com/dcc33d2364227f618dcd08da6a4c00ee.gif)](https://gyazo.com/dcc33d2364227f618dcd08da6a4c00ee)

# 使用したツール

### -Glid

https://www.glideapps.com/

コード入力が一切不要なので、プログラミングなどの知識がなくてもアプリを開発できます。


### -GoogleSpredSheets

# 作成方法


## **1️⃣スプレットシートに価格調査をしたい商品一覧の作成**
![スクリーンショット 2024-07-04 011525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777269/b33994b7-d715-b3b6-1d9b-286c6b76a6c0.png)


## **2️⃣Glidにアクセスし「New app」を選択→「importFile」→「GoogleSheets」を選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777269/ea8d08ba-fa4e-d379-ff70-37d436a9b153.png)

**↑この「GoogleSheets」は先ほど作成したスプレットシートを選択してください。**

## 3️⃣Glidがシートを解析して自動で作成

![スクリーンショット 2024-07-03 212522.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777269/90c75c41-6275-6957-ce37-5c787f49ec3f.png)


## 4️⃣画面右側のリストからレイアウトを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777269/4d55820b-55d4-b8cd-2940-bf373cfefb45.png)


**①はこの“7月PW”と記載されておる箇所の変更ができます。**
**最初はスプレットシートのシート名とリンクしています。**
![スクリーンショット 2024-07-04 100420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777269/7cbc8e02-0ce6-640e-9809-14f1e25ea5b6.png)

**②で自分のイメージに合うスタイルに変更します。**

## 5️⃣設定から色などを変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777269/f07051e3-6b5f-550c-5321-1f1a8210a444.png)




**直感的に操作できるので選択していきましょう。**



## 6️⃣公開

**画面右上の「Publish」を押下します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777269/14a90c99-ca7e-a027-c4d3-b0a8e4aa74f7.png)



**QRコードが表示されるのでスマホで読み取り→メールアドレスを入力→ログイン用のPINコードが送られるので、PINコードを入力してサインイン**

![スクリーンショット 2024-07-04 105144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777269/d106af60-8c69-8740-f47c-60ffdcb7b41c.png)


**これで完成です！！**

# まとめ

![スクリーンショット 2024-07-04 100724 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777269/8ea60bb4-d03d-ad4b-23a7-440da6eb9d95.png)

毎週使用できるように週別で記入ができるようなスタイルになっていて、職場内で使用するには十分です。


忙しくてどうしても行けないときはアプリを同僚と共有することによって、自分の担当部門外の商品の調査も簡単にできるところが良い点だと思っています。


**今回もここまで読んでいただきありがとうございました😊**
AWS Certified Data Engineer - Associateを新規取得した話

# はじめに

・AWS Certified Data Analytics – Specialty (DAS)
・AWS Certified Database – Specialty (DBS)
が廃止されました。

https://aws.amazon.com/jp/blogs/news/aws-certification-retirements-and-launches/

後継として、アソシエトレベルで、「AWS Certified Data Engineer」が新設されたので受験してきました。

試験のバージョンは、
+ DEA-C01
のバージョンでした。

# スコア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/bc25b002-e9c7-ab43-3902-1496379bd26a.png)

結果は、結構、余裕のある点数でした。

見直しフラグをつけた設問は10個でした。設問はProfessionalやSpecialtyに比べたら、比較的、短い設問ですので、すでにSpecialtyを保持しててアソシエイトを受験しにくる分には、さほど苦もなく受験＆合格できると思います。

:::note warn
 **CLF、DVA、SAA、SOAから、アソシエイトの4つ目として受ける場合は注意**
他の一派（CLF、DVA、SAA、SOA）からは、明らかに異質（別分野）の科目になるので、注意が必要です。
※筆者は、DAS／DBSを保持しており、アソシエイトに新設された後継科目を受けるという視点で書いてます。
:::

# 受験対策

## 公式模擬試験

https://explore.skillbuilder.aws/learn/course/external/view/elearning/18145/exam-prep-official-practice-question-set-aws-certified-data-engineer-associate-dea-c01-japanese

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/72b31605-eb1f-3148-512e-c76b44ace261.png)

最初、Skill Builderの検索で探したら見つからなくて、

https://aws.amazon.com/jp/certification/certified-data-engineer-associate/

公式の科目ページからリンクを探したら見つかりました。

## AWS Web問題集で学習しよう

https://techstock.jp/

の問題集が、私の感想としては有用でした。
他の認定を受ける際には、

https://www.whizlabs.com/

や

https://www.udemy.com/ja/

も活用しています。

## 抑えておいた方が良いサービス（と一言ポイントメモ）
+ AWS Glue
+ Sage Maker
+ Redshift
+ Kinesis
+ Lambda
+ Step Functions

ここら辺は、重点必須サービスといって過言ではないでしょう。
SQLの構文を問う問題が何個か（思ったより細かいこと聞かれたな？の感覚）

+ KPLって何？

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/developing-producers-with-kpl.html

+ 単一の COPY コマンドを使用した複数のファイルからのロード ※**←が出来るってことを把握しとく**

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_best-practices-single-copy-command.html

# まとめ
大容量データ基盤に関連するサービス群を抑えるには、良い試験だと思いました。

DWH基盤と言えば、弊社でも構築実績がございます。良かったら、ご覧ください。

https://www.cs-cloud-aid.com/cases/dwh-dev01/

# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。

https://www.cs-cloud-aid.com/
ＶＢＡを使ってフォルダを再帰的に作成するマクロ

VBAを使って、セル範囲に入力されたフォルダパスに従って再帰的にフォルダを作成するマクロを以下に示します。このマクロは、セルA1から最終行までの各セルの値を読み取り、その値に従ってフォルダを作成します。
```
Sub CreateFolders()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim cell As Range
    Dim folderPath As String
    
    ' シートを設定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' A列の最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    
    ' A1から最終行までループ
    For Each cell In ws.Range("A1:A" & lastRow)
        folderPath = cell.Value
        
        If Len(folderPath) > 0 Then
            CreateFolderRecursively folderPath
        End If
    Next cell
    
    MsgBox "フォルダの作成が完了しました。", vbInformation
End Sub

Sub CreateFolderRecursively(folderPath As String)
    Dim subFolders As Variant
    Dim currentPath As String
    Dim i As Integer
    
    ' フォルダパスを分割
    subFolders = Split(folderPath, "\")
    
    ' ベースパスを設定
    currentPath = ""
    
    ' フォルダを順に作成
    For i = LBound(subFolders) To UBound(subFolders)
        currentPath = currentPath & subFolders(i) & "\"
        If Dir(currentPath, vbDirectory) = "" Then
            MkDir currentPath
        End If
    Next i
End Sub
```

## 説明
# 1.CreateFoldersマクロ:

wsで操作対象のワークシートを設定しています。lastRowでA列の最終行を取得しています。For EachループでA1から最終行までのセルを巡回し、セルの値をfolderPathに格納します。folderPathに値がある場合は、CreateFolderRecursivelyサブルーチンを呼び出してフォルダを作成します。
# 2.CreateFolderRecursivelyサブルーチン:

フォルダパスを「\」で分割し、各部分を順に結合してフォルダを作成します。MkDirを使用して、存在しないフォルダを作成します。このマクロをExcelのVBAエディタにコピーして実行することで、A列に指定されたフォルダパスに従ってフォルダを再帰的に作成できます。
新卒向けAWS New Grads Trainingに参加しました

4月に新卒のAWS研修として行われたAWS New Grads Trainingに参加する機会がありました！
研修実施からかなり経ってしまいましたが、
参加して印象に残ったこと、学んだことを書こうと思います。

# 初めに
本題に入る前に少し私の自己紹介をしておこうと思います。

* IT未経験で入社し、今年で3年目になります。
* クラウドに特化したグループに所属し、日々の業務に加え、
クラウドの資格取得なども積極的に行っています。

# AWS New Grads Trainingとは?
AWS New Grads Trainingとは、AWS初学者の中でも新入社員向けのセミナーです。
※AWSパートナー限定のセミナーとなります

具体的な内容については以下のAWS公式をご覧ください
https://aws.amazon.com/jp/blogs/psa/aws-partner-learning-path-001/

# AWS New Grads Trainingの内容

### アジェンダ
研修は約6時間行われました。
IT業界からAWSを学ぶ上で重要なキーワードまで、
多くのことをわかりやすく丁寧に教えて頂きました。

* IT業界とクラウド
* セミナー講師の方の自己紹介
* 今IT業界で求められる人
* What's AWS?
* クラウド時代のITエンジニア
* Amazonの事業
* AWSサービス

ここからは、セミナーで特に印象に残った内容を簡単に紹介します。

### 今IT業界で求められる人
キーワード:「所有」から「利用」へ

* IT業界の歴史について

年代|概要
---|---
1970年代頃 |カスタムオーダーの為、コストと時間が非常にかかる<br>→非常に高価なため、所有していることが重要だった 
1990年代頃 |コンピューターは1人1台使用する時代へ
2000年代以降|インターネット接続

* 所有していることに意味のある時代から、
どのような使い方をするかで差別化を図る時代へ

* 「所有」から「利用」への転換により、
「ハードウェア→ソフトウェア→クラウド」へと変化

クラウドが誕生した背景も知ることができ、非常に興味深かったです。
一人一台コンピューターの所有が当たり前の時代に育ったので、
歴史を知ることでクラウドの便利さに改めて気づくことができました。

### クラウド時代のITエンジニア
* IT業界の中でもクラウドの需要は高い
* 今後、クラウドについて知っているのは当たり前になるので、
早期に学んでおくことが必要
* お客様の求めるクラウドを提案できる人が不足している
そのため、フルスタックな人材が必要
* 近年、資格取得がIT業界のトレンドになっている
資格が案件参画への条件となっていることもある

この話は、クラウドに特化したグループに所属している私にとって、
よりクラウドに対しての学習意欲が高まる内容でした。

### AWSサービス
* AWSのサービスは世界で最も幅広く深い
* AWSサービスの90%はお客様の声から誕生

200を超えるサービスのほとんどがお客様の声から誕生していることに驚きました。
Amazonの顧客第一の思想が実現されているのを知ることができました。

# 参加した感想
新卒向けのセミナーだったので、AWSの深堀というよりは、
IT未経験者に向けた業界の知識を学習できる内容となっていました。

参加した新入社員の中には未経験者もいましたが、
皆、積極的に質問したり、興味を持って話を聞いている様子がうかがえました。
また、セミナー受講後には、
AWSの資格取得に向けて意欲的に取り組んでいる姿もみられました。

とてもわかりやすく面白い説明ですんなりと理解できたので、
私にとってもかなり勉強になったと感じています!
【C#】IFormFile型の変数にローカルのファイルを参照して格納したい

# 前提
- Windows11
- ASP.NET Core 3.1
- ファイルをアップロードするWeb APIを開発中

# やりたかったこと
テストのため、IFormFile型の変数に、ローカルに保存してあるファイルを格納したい。(ファイルをアップロードするのではなく、コードでファイルを参照し、取得したものを変数に格納したい。)

# コード
```C#:test.cs
//using Microsoft.AspNetCore.Http;
//using System.IO;

var filePath = @"C:\Users\masayoshi\image\test.png";//ローカルのファイルを参照
var fileInfo = new FileInfo(filePath);
var stream = fileInfo.OpenRead();
IFormFile formFile = new FormFile(stream, 0, stream.Length, null, fileInfo.Name)
{
    Headers = new HeaderDictionary(),
    ContentType = "image/png" // MIMEタイプを適切に設定
};

```

# あとがき
簡単なコードですが、欲しかった記事になかなか出会えなかったので共有です。
Microsoft Store アプリ「StickyNotes」の手動インストール方法

Microsoft Store アプリ「StickyNotes」の手動インストール方法
Microsoftアカウントにログイン後、必要なファイルをDL済みである事が前提。

・アンインストール方法 :

未確認

・手動インストール(オフラインインストール)方法 :
Dismコマンドです。
長いため複数行に改行していますが、実際は1行のコマンドです。

Windows11で確認。
Windows10で未確認。

〇 batファイル : 
文字コード = sjis又はansi
改行コード = Cr + Lf

~~~bat
Dism /Online /Add-ProvisionedAppxPackage /PackagePath:.\
Microsoft.MicrosoftStickyNotes_6.0.2.0_neutral_~_(英数字文字列).Msixbundle
 /DependencyPackagePath:.\
Microsoft.VCLibs.140.00_14.0.33519.0_x64__(英数字文字列).Appx
 /DependencyPackagePath:.\
Microsoft.NET.Native.Framework.2.2_2.2.29512.0_x64__(英数字文字列).Appx
 /DependencyPackagePath:.\
Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x64__(英数字文字列).Appx
 /LicensePath:.\
Microsoft.MicrosoftStickyNotes_(英数字文字列).xml
~~~
Microsoft Store アプリ「3D Viewer」の手動インストール方法

Microsoft Store アプリ「3D Viewer」の手動インストール方法
Microsoftアカウントにログイン後、必要なファイルをDL済みである事が前提。

・アンインストール方法 :

未確認。

・手動インストール(オフラインインストール)方法 :
Dismコマンドです。
長いため複数行に改行していますが、実際は1行のコマンドです。

Windows11で確認。
Windows10で未確認。

〇 batファイル : 
文字コード = sjis又はansi
改行コード = Cr + Lf

~~~bat
Dism /Online /Add-ProvisionedAppxPackage /PackagePath:.\
Microsoft.Microsoft3DViewer_2024.2401.29012.0_neutral_~_(英数字文字列).AppxBundle
 /DependencyPackagePath:.\
Microsoft.NET.Native.Framework.2.2_2.2.29512.0_x64__(英数字文字列).Appx
 /DependencyPackagePath:.\
Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x64__(英数字文字列).Appx
 /DependencyPackagePath:.\
Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__(英数字文字列).Appx
 /DependencyPackagePath:.\
Microsoft.VCLibs.140.00.UWPDesktop_14.0.33728.0_x64__(英数字文字列).Appx
 /DependencyPackagePath:.\
Microsoft.VCLibs.140.00_14.0.33519.0_x64__(英数字文字列).Appx
 /LicensePath:.\
Microsoft.Microsoft3DViewer_(英数字文字列).xml
~~~
Microsoft Store アプリ「Calculator」の手動インストール方法

Microsoft Store アプリ「Calculator」の手動インストール方法
Microsoftアカウントにログイン後、必要なファイルをDL済みである事が前提。

・アンインストール方法 :

batファイルでps1ファイルを呼び出して、ps1ファイル内でアンインストールします。

〇 batファイル : 
文字コード = sjis又はansi
改行コード = Cr + Lf

~~~bat
powershell -ExecutionPolicy RemoteSigned .\remove-app.ps1
~~~

〇 remove-app.ps1ファイル : 
文字コード = BOM付きUTF-8
改行コード = Cr + Lf

~~~powershell
get-appxpackage *Microsoft.WindowsCalculator* | remove-appxpackage

Get-AppxProvisionedPackage -Online |Where-Object {$_.PackageName -like "Microsoft.WindowsCalculator*"} |ForEach-Object { Remove-AppxProvisionedPackage -Online -PackageName $_.PackageName}
Get-AppxProvisionedPackage -Online |Where-Object {$_.PackageName -like "Microsoft.WindowsCalculator*"} |ForEach-Object { Remove-AppxPackage -Online -PackageName $_.PackageName}
~~~

・手動インストール(オフラインインストール)方法 :
Dismコマンドです。
長いため複数行に改行していますが、実際は1行のコマンドです。

Windows11で確認。
Windows10で未確認。

〇 batファイル : 
文字コード = sjis又はansi
改行コード = Cr + Lf

~~~bat
Dism /Online /Add-ProvisionedAppxPackage /PackagePath:.\
Microsoft.WindowsCalculator_2021.2405.2.0_neutral_~_(英数字文字列).Msixbundle
 /DependencyPackagePath:.\
Microsoft.VCLibs.140.00_14.0.33519.0_x64__(英数字文字列).Appx
 /DependencyPackagePath:.\
Microsoft.NET.Native.Framework.2.2_2.2.29512.0_x64__(英数字文字列).Appx
 /DependencyPackagePath:.\
Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x64__(英数字文字列).Appx
 /LicensePath:.\
Microsoft.WindowsCalculator_(英数字文字列).xml
~~~
ServiceNowのSPM（Strategy Portfolio Management）入門：戦略的ポートフォリオ管理の新時代

# はじめに
今回、【ServiceNow】のSPM（Service Portfolio Management）について、実際の案件を通じて得た知識と経験を共有するために本記事を作成しました。

この記事の目的は、難解に思われがちなSPMとAPMの概念を、実際のプロジェクトで得た具体的な知見を交えて、わかりやすく解説することです。これにより、読者の皆様がSPMの基本を理解し、実践に役立てていただくことを目指しています。

# SPMとは
SPMは、ServiceNowが提供する戦略的ポートフォリオ管理の機能群です。一般的にPPM（Project Portfolio Management）ツールと呼ばれる分野に属し、プロジェクト管理や企業戦略デザインを支援するツールです。

SPMは、事業規模や売上規模が大きい企業ほどその恩恵を得やすい機能です。日本国内では、参天製薬、富士通、三井倉庫などの大手企業が導入しており、個人的な感覚では、年間売上2,000億円以上の企業において導入のメリットが大きくなる印象があります。

# なぜSPM・PPMが必要か
SPMが企業に求められる理由は主に以下の3点です：

1. プロジェクト管理の単一ツール化とデジタル化
2. 世界的に知名度の高いSaaS（ServiceNow）の機能であり、サイロ化を防ぎ世界標準に準拠
3. プロジェクト管理の品質標準化

これらの特徴により、SPMは他のプロジェクト管理ツールと比較して、より包括的で統合された管理を可能にします。

# SPMの実現したい世界観
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/6ea866f1-997c-0cb6-f0a2-70f348291735.png)
SPMは、企業戦略に基づいたプロジェクト企画やIT投資・統廃合のプランニングから、企画立案、開発・導入プロジェクトの組成、Go-Live、そして運用までを一つのプラットフォーム内で完結させることを目指しています。これにより、顧客に一貫した価値提供（バリューストリーム）の実現を可能にします。

つまり、SPMは戦略と実行の一貫性を保ち、無駄のない企業活動を推進する戦略系のツールなのです。

# SPMが提供する機能と価値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/ae5fad52-d890-e953-1122-955cf7802539.png)
SPMは以下のような管理体系やツールを具体的に提供します：

1. 需要管理
2. プロジェクト管理
3. リソース管理
4. 財務管理
5. ポートフォリオ管理

特に、需要管理とプロジェクト管理がSPMの中心的な機能となります。

# SPMの基礎概念と導入メリット

1. アイデアからデマンド、プロジェクトへの昇格プロセスにより、現場の意見を効果的に吸い上げることができます。
2. プロジェクト→プログラム→ポートフォリオの階層構造（PMBOK準拠）により、プロジェクト活動を俯瞰的に把握できます。
3. 投資評価と管理会計の機能があり、正確なデータ入力により適切な管理が可能です。

# SPMの競合と市場での位置づけ

SPMの主な競合には、Planview、Monday、Wrike、Asanaなどがあります。
2024年度のランキングでは、Forrester社の調査でServiceNowのSPMがトップリーダーに位置付けられています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/253d1c38-ff6d-db88-b13f-93841180c88d.png)
一方、Gartner社の調査では12位となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/36c567f4-9682-2ba5-884f-fa1b3bf2dca1.png)

# 顧客Demoにて評価されている主要機能
### 1. デマンドワークベンチ：需要の一覧と評価を可視化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/8c3d10ff-fd00-7d55-a87d-26c280336d18.png)

### 2. バブルチャート分析：プロジェクトの価値とリスクを図示(APM)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/0b2a6226-e531-a22a-8122-81e0076f1d9a.png)


### 3. PMOダッシュボード：プロジェクト全体の状況を一目で把握
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/a0c0a623-07bf-1e7f-5999-6edb3f10f6e5.png)


これらの機能により、戦略的な意思決定と効率的なプロジェクト管理が可能になります。

# まとめ

SPMは、大規模な企業向けの強力なポートフォリオ管理ツールです。戦略立案から実行まで一貫した管理を提供し、企業の経営効率を向上させる可能性を秘めています。導入を検討する際は、自社の規模や需要に合わせて慎重に評価することをお勧めします。

SPMについてより詳しく知りたい方は、ServiceNowの公式サイトや、プロジェクトマネジメント協会（PMI）のリソースを参照することをお勧めします。
Microsoft Store アプリ「Photos」の手動インストール方法

Microsoft Store アプリ「Photos」の手動インストール方法

Microsoftアカウントにログイン後、必要なファイルをDL済みである事が前提。

・アンインストール方法 :

batファイルでps1ファイルを呼び出して、ps1ファイル内でアンインストールします。

〇 batファイル : 
文字コード = sjis又はansi
改行コード = Cr + Lf

~~~bat
powershell -ExecutionPolicy RemoteSigned .\remove-app.ps1
~~~

〇 remove-app.ps1ファイル : 
文字コード = BOM付きUTF-8
改行コード = Cr + Lf

~~~powershell
get-appxpackage *Microsoft.Windows.Photos* | remove-appxpackage

Get-AppxProvisionedPackage -Online |Where-Object {$_.PackageName -like "Microsoft.Windows.Photos*"} |ForEach-Object { Remove-AppxProvisionedPackage -Online -PackageName $_.PackageName}
Get-AppxProvisionedPackage -Online |Where-Object {$_.PackageName -like "Microsoft.Windows.Photos*"} |ForEach-Object { Remove-AppxPackage -Online -PackageName $_.PackageName}
~~~

・手動インストール(オフラインインストール)方法 :
Dismコマンドです。
長いため複数行に改行していますが、実際は1行のコマンドです。

Windows11で確認。
Windows10で未確認。

〇 batファイル : 
文字コード = sjis又はansi
改行コード = Cr + Lf

~~~bat
Dism /Online /Add-ProvisionedAppxPackage /PackagePath:.\
Microsoft.Windows.Photos_2024.11060.12008.0_neutral_~_(英数字文字列).Msixbundle
 /DependencyPackagePath:.\
Microsoft.WindowsAppRuntime.1.5_5001.159.55.0_x64__(英数字文字列).Msix
 /DependencyPackagePath:.\
Microsoft.VCLibs.140.00_14.0.33519.0_x64__(英数字文字列).Appx
 /DependencyPackagePath:.\
Microsoft.VCLibs.140.00.UWPDesktop_14.0.33728.0_x64__(英数字文字列).Appx
 /LicensePath:.\
Microsoft.Windows.Photos_(英数字文字列).xml
~~~
RDBMS の命名規則

# 命名規則
RDBMS で**命名規則**とは、データベース内で使用される名前（テーブル名や列名など）に一貫性を持たせるためのルールです。

命名規則はプロジェクトやチームによって異なりますが、一般的に、小文字のみ、大文字のみ、または最初の一文字を大文字にして残りを小文字にするなどのルールが設けられます。例) `customers`、`CUSTOMERS`、`Customers`

特に決まりはありませんが、慣習として、SQL 文で使用する**キーワード**は**大文字**、**テーブル名**や**カラム名**などは**小文字**に統一します。

下記は命名規則の一例です。
- **データベース名**
  - 会社名やプロジェクト名など、データベースを識別できるわかりやすい名前を使用します。
  - 例) `company_db`, `sales_project_db`
- **テーブル名**
  - 小文字
  - 単語はアンダーバー（`_`）で区切る
  - 複数形
  - ただし、中間テーブルの場合、単数形と単数形を `_` で区切る
  - 例) `posts`, `tags`, `post_tag`
- **カラム名**
  - 単数形
  - 単語はアンダーバー（_）で区切る
  - テーブル名に使用している単語をカラム名に使用する場合は単数形にする
  - 例) `email`, `post_id`, `tag_name`
- **インデックス名**
  - `idx` からはじめる
  - 単語はアンダーバー（`_`）で区切る
  - インデックスがどのテーブルのどのカラムを対象としているかが分かる名前
  - 例) `idx_posts_created_at`, `idx_users_email`

以下の記事のように小文字に統一する場合もあります。

- [分析SQLのコーディングスタイル - クックパッド開発者ブログ](https://techlife.cookpad.com/entry/2016/11/09/000033)


# 具体的な例
```sql
CREATE DATABASE company_db;

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    email VARCHAR(100) UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE posts (
    post_id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(user_id),
    title VARCHAR(200),
    content TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_posts_created_at ON posts(created_at);
```

# おわりに
命名規則はあくまでデータベースの構造を理解しやすくし、保守性を向上させることを目的に設けられます。そのため、プロジェクトやチームによって命名規則は異なります。
URLコピーボタンと吹き出しをNext.jsで実装する


## はじめに

こんにちは。HRBrainでオウンドメディア・ランディングページの開発を担当している渡邉です。

この記事では、Next.jsプロジェクトにURLコピーボタンを実装し、さらにユーザー体験を向上させるために吹き出し（ツールチップ）を追加する方法を紹介します。

![copy_url.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681000/837d779f-7064-78a5-3af1-98b5689d5c06.gif)

:::note info
吹き出し（ツールチップ）について
ボタンをクリックした際に表示される吹き出しを「ツールチップ」と呼んでいます。
一般的には、ボタンなどの要素にホバーやクリックした時に出現する脚注や説明を指すそうです。
:::

## 実装手順

### コンポーネントの作成

`CopyUrlButton`コンポーネントを作成します。

```react
import React, { useState } from 'react';
import { useRouter } from 'next/router';

const CopyUrlButton = () => {
  // ツールチップの表示・非表示を制御するstate
  const [displayTooltip, setDisplayTooltip] = useState(false);
  const router = useRouter();

  const currentUrl = `${process.env.NEXT_PUBLIC_BASE_URL}${router.pathname}`

  const handleCopy = async () => {
    try {
      // 現在のURLをクリップボードにコピー
      await navigator.clipboard.writeText(currentUrl);

      setDisplayTooltip(true);
      setTimeout(() => {
        setDisplayTooltip(false);
      }, 2000); // 2秒後にメッセージを消す
    } catch (err) {
      console.error('URLのコピーに失敗しました');
    }
  };

  return (
    <div class="wrap">
      <div className='tooltip' style={{ opacity: displayTooltip ? 1 : 0 }}>URLをコピーしました</div>
      <button onClick={handleCopy} class="button">URLをコピーする</button>
    </div>
  )
};

export default CopyUrlButton;
```

### ツールチップのスタイル実装

ツールチップのスタイルを実装します。

```scss
.wrap {
  position: relative;

  .tooltip {
    color: #fff;
    font-size: 12px;
    padding: 8px 8px 9px;
    background-color: #000;
    border-radius: 6px;
    white-space: nowrap; // テキストを改行しない
    transition-duration: 0.2s; // ふわっと表示

    // 以下は親要素に対する配置
    position: absolute;
    top: -45px;
    left: 50%;
    transform: translateX(-50%);

    // ツールチップ下部の三角形部分
    &::after {
      content: '';
      width: 12px;
      height: 8px;
      background-color: #000;
      clip-path: polygon(0 0, 100% 0%, 50% 100%);

      // ツールチップに対する配置
      position: absolute;
      bottom: -7px;
      left: 50%;
      transform: translateX(-50%);
    }
  }

  .button {
    // ボタンのCSSはお好みで
  }
}
```

### clip-pathを使った三角形の作成

ツールチップ下部の三角形部分には、`clip-path`を使用しています。

`clip-path`は、要素の形状を定義するためのCSSプロパティです。`polygon()`関数を用いることで、任意の多角形を定義できます。

`polygon(0% 0%, 100% 0%, 50% 100%)`は、左上、右上、中央下の3点を結んだ三角形を表します。

```css
.triangle {
  width: 100px;
  height: 70px;
  background-color: #000;
  clip-path: polygon(0% 0%, 100% 0%, 50% 100%);
}
```

![clip_path_triangle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681000/1d8276b3-0742-fd98-def3-f074cf58d8db.png)


▼MDN

https://developer.mozilla.org/en-US/docs/Web/CSS/basic-shape/polygon

▼caniuse

IE以外のブラウザでサポートされています。

https://caniuse.com/css-clip-path

## まとめ

Next.jsプロジェクトにURLコピーボタンを実装することができました。

ユーザーが簡単に現在のページのURLをコピーできるようにすることで、ソーシャルメディアへの共有やブックマークを促進することができます。

実装する際の参考にしてください。

## PR

HRBrainではフロントエンドエンジニア（コミュニケーションデザイン）の採用も行なっています。

https://hrmos.co/pages/hrbrain/jobs/2110310

https://www.hrbrain.co.jp/recruit
【C言語】extern と __attribute__ の使い方を簡単に解説

## `extern` と `__attribute__` の使い方を簡単に解説

### はじめに

C言語やC++でプログラムを作るときに、プログラムの動きを速くしたり、デバッグ（問題を見つけて直すこと）を簡単にするために使える便利なキーワードがあります。ここでは、`extern` と `__attribute__` について、初心者でも分かりやすく説明します。

### `extern` とは？

`extern` は普通、他のファイルから関数や変数を使えるようにするためのものです。しかし、今回はちょっと違った使い方を紹介します。特定の使い方をすることで、関数がインライン化（コードの中に直接展開されること）されるようにできます。

### `__attribute__` とは？

`__attribute__` は、関数や変数に特別な性質を持たせるためのものです。これを使うことで、プログラムの動きを細かく制御できます。

### 特別な属性の説明

1. **`__gnu_inline__`**:
   - この属性を使うと、関数がインライン化されます。関数のコードがそのまま関数を呼び出した場所に展開されるので、関数を呼び出す手間が省けます。
   - `extern` と一緒に使うと、関数はインライン化されるだけで、普通の関数としては使われません。つまり、この関数はプログラムの中で直接使われる一部のように動作します。

2. **`__always_inline__`**:
   - この属性は、「この関数は必ずインライン化しなさい」とコンパイラに命令します。どんな場合でも、この関数はインライン化されます。

3. **`__artificial__`**:
   - この属性を使うと、デバッグ時に関数の中身の情報を省略できます。代わりに、関数が呼び出された場所の情報だけが表示されます。

### 実際のコード例

次のコード例を見てみましょう：

```c
extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm256_add_pd(__m256d __A, __m256d __B) {
    return (__m256d)((__v4df)__A + (__v4df)__B);
}
```

#### コードの意味

このコードは次のことをしています：
- `_mm256_add_pd` という関数は、インライン化されてコードの中に直接展開されます。この関数は普通の関数としては使われません。
- この関数は必ずインライン化され、普通の関数呼び出しのようには動作しません。
- デバッグ時には、この関数の中身ではなく、呼び出し元の情報だけが表示されます。

### まとめ

`extern` と `__attribute__` を使うことで、プログラムの動きを速くしたり、デバッグを簡単にしたりできます。この使い方を覚えておくと、プログラムを書くときにとても役立ちます。初めて使うときは少し難しく感じるかもしれませんが、例を参考にしながら使ってみると、だんだんと理解できるようになります。
Node.jsがヒープ領域不足で落ちてしまったので対処してみた

ある時、このようなログが発生してNode.jsが頻繁に落ちるようになりました。

```
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
```

↓前後のログ
![4186e71daa6a1d7dbcd1acf644873fb0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243199/46cb1efc-fe70-c651-fe0f-91b93a00d50f.png)

エラーログを読むと、Node.jsのヒープ内領域が足りていないと書いてありました。

調べてみると、`--max-old-space-size`の値をデフォルトより大きくするといいとの情報が出てきました。

設定はNode.jsの起動コマンドに`--max-old-space-size=値`を付与するか、環境変数に下記の通り指定すると設定が可能です。

```
export NODE_OPTIONS="--max-old-space-size=値"
```

デフォルトのヒープサイズは1400MBという記事を見つけましたが、他の値がデフォルトになっている場合もあるそうです。
デフォルト値はこのコマンドで確認が可能です。

```
node -e 'console.log(Math.floor(v8.getHeapStatistics().heap_size_limit/1024/1024))'
```

適切な値については、デフォルト値から徐々に上げてログをチェックするのがいいのではないかと思います。

以前、エラーが出たときはデフォルト値が1400MBだったため、2048MBを試したところ解消されず、最終的に`--max-old-space-size=3072`にすると解消されました。


# 参考

https://zenn.dev/ubie_dev/articles/f64561d59918d1

https://qiita.com/yamatai12/items/26349f468e398c73952e#--max-old-space-sizeのデフォルト値の算出方法

https://qiita.com/kawanet/items/cfedd535990b32710c50

https://zenn.dev/yusuke_docha/articles/f8c3cd88302d16
[AWS SUMMIT2024 セッションレポート] AI アプリ開発プロジェクトの始め方

# はじめに
受講セッションの個人的な所感と、メモです。
メモの内容は、誤字脱字などあるやもしれませんが、ご了承ください。

# 概要
> AI を使って今までできなかったことをやりたいけれど、AI を組み込んだアプリ開発をどう始めてどう進めたら良いのか、どこかに落とし穴があるんじゃないかと不安を持つ方もいらっしゃるのではないでしょうか。また、生成 AI の流れが来ていますが、従来の AI との使い分けや共存などにもお困りじゃないでしょうか。このセッションでは、アプリ開発を始める前に考えておくべきことから、実際にアプリ開発をする際に便利な AWS サービスの使いどころの紹介、アプリ開発が終わった後も気にすべきことなど、AI 全般のアプリ開発ジャーニーにおけるビジネス＆Tech な内容をまとめてご紹介します。

# 所感
改めて、AIの基礎的な事、考え方が知れたいいセッションでした。

AIは100%の精度にはならない、を念頭に、
許容できる範囲を考えたり、100%に近づけるためにはどうすればいいかを考えたりと、
向かい合うための心構えを知れた気がします。

特に大事にしたいのが、ビジネス課題の解決、という意識。

AI導入を目的にしてはいけない。これ大事ですね。

＃　受講メモ
## AIの特性を理解し、正しく使うための情報
- 従来のAIの特徴
- 従来のAIを自社アプリに組み込むためのTips
- AIと生成AIの違い
- 生成AIを自社アプリに組み込むためのTips

## AIの特徴
- 人工知能
    - 機械学習
        - 深層学習
            - 生成AI

AIは間違えることがある
- 精度100％にはならない

### 間違えない例
入力が決まれば、計算で結果が一意に決まる
- 給料計算
- 走行距離など

### 機械学習
入力が決まれば予測値が決まる
- 今までこうだったから、多分こんな感じ
- 計算できない予測であるため誤差が出る
- 入力の傾向が、時間と共に変化する類

前処理、後処理で精度を上げる
- データのノイズ除去
- 入力情報を限定する工夫（UI）
- データ取得を自動化する
- 複数AIの多数決
- 他手法とのかけ合わせ

## 従来のAIを自社アプリに組み込むため
一般的なライフサイクル

### なぜビジネスゴールの設定？
ゴールがないと、最終的にAIの精度をどこまで上げるかわからない
- 100％を求めて延々と続く
- 正しく機能しているかわからない

## 活用パターン
### APIで使えるAI
- 学習データ不要
- MLスキルいらず、カスタマイズがしにくい
- 主な例、画像認識
    - Rekognition

### 独自モデルを用意するパターン
- 学習データ必要
- ユースケースに応じて自由
- 主な例
    - レコメンド
    - Personalize
        - データだけ用意すれば、レコメンドしてくれる
    - SageMaker

AIの精度100%は非現実的
ビジネスゴールの重要性
APIで導入
独自データで導入

## 生成AI
### 従来AIでは
- テキストの感情を判断するための学習データが必要 数百〜数千
- ラベルづけで学習させる

### 生成AIでは (LLM)
- ラベルなしの事前学習データ
    - 大量データを与えておく
- 既にこれをもとに作られたモデルがある
- 学習済みのモデルから、回答を得ることができる
    - Bedrock

翻訳をAIで行う上での違い
- 生成AIの場合、出力テイストを指示できる

## プロンプトエンジニアリング
- 事前に指示を与えることで、出力を指定する
    - ラベルや例を与える
    - フォーマットを与える

- 事前指示が多くなると、プロンプトの制限に触れる場合は、ファインチューニングを検討する
    - プロンプトをシンプルにできる
    - コスト、レスポンス

LLMがやっていること
- 入力に対する次の言葉の確率計算
- 単語の予測であり、内容の正しさを考慮するメカニズムではない

## 苦手なこと、できないこと
- 最新状況の対応
    - 最新の時事ネタ
- 出力の制御
    - 指示を行っても必ずそうならない
- 妥当性の保証

これらの特徴を把握して活用、開発する

入出力の監視、検証
- Guardrails for Bedrock
- コンテンツフィルタ

Rekognition
- コンテンツモデレーション
    - 暴力的、性的な画像がないかを検証

# 関連
- [AWS SUMMIT2024 参加レポート](https://qiita.com/yukiMiyoshi_fcafe/items/220bf886aa94ea552d3e)
【初学者向け】【AWS】 アカウント と ユーザーの概念

![緑 シンプル かわいい 黒板 学校 先生 質問 タイトル YouTube サムネイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822977/d3c94153-434b-6f4f-6f14-f9be71dcf97f.png)
# はじめに

今回は AWS を利用し始めたばかりの方、もしくは利用を考えている方向けに、
AWS を使う上で理解しておくべき基本的なワード / 概念について簡単にまとめました。
　
1.  AWS における「アカウント」とは
2.  AWS における「ユーザー」とは
    2.1  ルートユーザーとは
    2.2  IAM ユーザーとは

# 1. AWS における「アカウント」とは

AWS を利用するためには、まず「AWS アカウント」を作成する必要があります。
一般的に「アカウント」と呼ばれる言葉は「ユーザー」と同じようなイメージですが、AWS においてはそれぞれの意味が異なります。
　
AWS 上で使う「アカウント」は"AWS 環境そのもの" を指します。
イメージとしては枠組のようなものです。
　
利用開始時に AWS アカウントを作成して、その AWS アカウント上（枠組内）に EC2 や S3 、その他ユーザーなどのリソースを作成していくこととなります。
　
ユーザーについては後程説明します。
　

:::note info
AWS アカウント = 利用中の AWS 環境
:::
　
# 2. AWS における「ユーザー」とは
AWS における「ユーザー」のイメージは、一般的にアカウントと言われるものと同意義です。
　
- 銀行口座（アカウント）
- X （旧 Twitter）アカウント
- Instagram アカウント
　　
:::note info
AWS における「ユーザー」は日常で使う「アカウント」と同じ
:::
　

細かく説明すると利用者の識別情報や資格情報のセットと言えます。
　
AWS ではユーザーが下記 2 種に大別されます。
- ルートユーザー
- IAM ユーザー

それぞれについてこれから説明します。

# 2.1  ルートユーザーとは
AWS アカウント作成時、AWS アカウントにメールアドレスとパスワードを設定します。
この組み合わせで AWS アカウントへサインインできるのがルートユーザーです。
　
そのため、ルートユーザーは 1 つの AWS アカウントに 1 つだけ存在するユーザーということになります。
　
このルートユーザーは、AWS アカウント内に対して全権限を有しています。
すべての操作が可能であり、かつその権限を削除できないため、
日常的に利用することは推奨されていません。
　
リソース構築などは IAM ユーザーで実施し、ルートユーザーでしか実施できない作業（例：解約）の場合のみ利用することが推奨されています。
　

:::note info
ルートユーザー = AWS アカウントに 1 つ =  [AWSアカウント内の] すべての操作が可能
:::

　
また時折、ルートユーザーを「ルートアカウント」や「AWS アカウント」そのものとして称する記事や参考書があります。
AWS アカウントに１つのみ存在するユーザーのため、そのように呼ばれているのだと思います。
　
ただ、AWS 公式ドキュメント上ではルートユーザー表記が多いため、
当記事では引き続きルートユーザーと称します。
[AWS アカウントのルートユーザー](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_root-user.html)


# 2.2  IAM ユーザーとは
IAM ユーザーの特徴は多いので一旦箇条書きでまとめます。
　
- AWS アカウント作成時には作成されない
- IAM ユーザーは複数作成可能（上限は 5000 ユーザー）
- IAM ユーザーを作成可能な権限があるユーザーで作成可能
- IAM ユーザー作成時、ユーザーには権限が割り振られておらず、作成後適切に権限を設定する。
- 認証情報は ID とパスワードの組み合わせ

　
上記のとおり、AWS アカウント作成時には作成されないため、
まずはルートユーザーで IAM ユーザーを作成することになります。
　
ルートユーザーの日常利用は非推奨のため、管理権限を持つ IAM ユーザーを作成したのちに、管理者権限 IAM ユーザーを使って IAM ユーザーを必要分増やして運用していきます。
　　

:::note info
IAM ユーザーは利用者ごと作成し、適切な権限を設定する
:::

# おわりに
以上、AWS におけるアカウントとユーザーの概念について簡単にまとめました。
筆者も AWS を利用し始めた当時はこの概念の理解がなかなか難しく、苦労しました。
そんな方への一助になれますと幸いです。
Amazing-QR でアニメーションGIFのQRを作成

おもしろいものを見つけたのでやってみました。

# Python3
Python3が必要です。
いまどきなので、ほとんどのパソコンにはインストール済みだとは思いますが、下記で確認しておきます。

```
% python -V
Python 3.11.6
% pip list
Package    Version
---------- -------
pip        24.1.1
setuptools 70.2.0
%
```

古そうだったら、最新化してください。

# インストール
下記でインストールできます。

```
% pip install amzqr
```

# やってみます。

## GIF探し
作ってもいいですが、お試しなので、ググって、自分のパソコンにダウンロード

## 下記コマンドで実行

```
% amzqr https://youtube.com/ -p minecraft-steve.gif -c
```

# 完成
できました。

![minecraft-steve_qrcode.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/e3f80a0a-d5e2-a400-2303-e93052f305a5.gif)

最後に `-c`を入れないと、モノクロになります。


### めでたしめでたし
AWS EC2でよく使うコマンド



## <INS>**システム管理**</INS>

	1.	sudo - 特別な権限を持ったコマンドを実行　ほとんどのコマンドの冒頭に入力することが多い。
	•	例: sudo apt-get update
 
	2.	reboot - システムを再起動
	•	例: sudo reboot
 
	3.	exit - EC2インスタンスからログアウト
	•	例: exit

## <INS>**ファイル・ディレクトリ操作**</INS>

	4.	tree - ディレクトリの構造をツリー状に表示
	•	例: tree
 
	5.	cd - ディレクトリを移動
	•	例: cd /home
 
	6.	ls - ディレクトリ内のファイルやフォルダを表示
	•	例: ls -l
 
	7.	mkdir - 新しいディレクトリを作成
	•	例: mkdir new_directory
 
	8.	cp - ファイルやディレクトリをコピー
	•	例: cp source.txt destination.txt
 
	9.	mv - ファイルやディレクトリを移動または名前を変更
	•	例: mv oldname.txt newname.txt

	10.	rm -rf - ファイルやディレクトリを削除

	•	例: rm -rf /path/to/dir

## <INS>**テキストエディタ**</INS>

	11.	vi - 高機能なテキストエディタ

	•	例: vi filename.txt
	•	入力開始: i
	•	入力終了: ESC
	•	保存して終了: :wq
	•	保存せず終了: :q!

	12.	nano - 簡単で直感的なテキストエディタ

	•	例: nano filename.txt
	•	保存して終了: CTRL + X, Y, Enter
	•	保存せず終了: CTRL + X, N

## <INS>**ストレージ管理**</INS>

	13.	df -h - ディスクの使用状況を表示
	•	例: df -h

	14.	du -sh - ディレクトリのサイズを表示
	•	例: du -sh /path/to/dir

	15.	mount - ファイルシステムをマウント
	•	例: sudo mount /dev/sdX1 /mnt

	16.	umount - ファイルシステムをアンマウント
	•	例: sudo umount /mnt

	17.	fdisk -l - ディスクパーティションの情報を表示
	•	例: sudo fdisk -l

	18.	mkfs - 新しいファイルシステムを作成
	•	例: sudo mkfs -t ext4 /dev/sdX1

	19.	tune2fs - ファイルシステムのパラメータを調整
	•	例: sudo tune2fs -l /dev/sdX1
 
	20.	fsck - ファイルシステムの整合性をチェック
	•	例: sudo fsck /dev/sdX1

## <INS>**プロセス管理**</INS>

	21.	kill - プロセスを終了
	•	例: kill 1234

	22.	ps aux | grep - 実行中のプロセスを検索
	•	例: ps aux | grep 'python'

## <INS>**ネットワーク操作**</INS>

	23.	ssh - リモートサーバーに接続
	•	例: ssh -i my-key.pem ec2-user@my-ec2-instance.amazonaws.com

	24.	scp - ファイルをセキュアにコピー
	•	例: scp -i my-key.pem filename.txt ec2-user@my-ec2-instance.amazonaws.com:/path/to/destination

## <INS>**ファイル表示**</INS>

	25.	cat - ファイルの内容を表示
	•	例: cat filename.txt

## <INS>**スクリプト実行**</INS>

	26.	sudo bash 'file_path' - シェルスクリプトの実行
	•	例: sudo bash script.sh

	27.	python "ファイルパス" - Pythonスクリプトを実行
	•	例: python script.py

## <INS>**仮想環境の作成**</INS>

	28.	python -m venv - 仮想環境の作成

	•	例: python -m venv myenv
	•	アクティベート:
	•	Windows: myenv\Scripts\activate
	•	Mac/Linux: source myenv/bin/activate
	•	デアクティベート: deactivate
【Android開発】Kotlin入門 Androidのディベロッパーガイドの分かりにくいところを書き直す#1

[デベロッパー ガイド](https://developer.android.com/guide?hl=ja)の[アプリの基礎](https://developer.android.com/guide/components/fundamentals?hl=ja)の分かりにくいところ

#### 知っていること
#### 知らないこと
APK
AAB
SDK
アプリコンポーネント
エントリポイント
アクティビティ
サービス
ブロードキャストレシーバ
コンテンツプロバイダ
コンポーネントを有効にするとは？


### アプリの基礎
>Android アプリは、Kotlin、Java プログラミング言語、C++ 言語を使用して記述できます。Android SDK Tools は、データやリソース ファイルとともにコードを APK または Android App Bundle にコンパイルします。

##### APKとは
+ **Android Package Kit(APK)** は、Androidアプリケーションを配布およびインストールするためのパッケージファイル形式で、拡張子は.apk
+ APKファイルには、アプリの実行に必要なすべてのコンポーネント（コード、リソース、アセットなど）が含まれている

##### Android App Bundleとは
+ **Android App Bundle（AAB）** は、Google Playストア向けの配布形式で、APKよりも効率的にアプリを配布するための方法
+ 複数のファイルやディレクトリを一つのファイルにまとめて圧縮されたファイル(アーカイブファイル)で、拡張子は.aab
+ 仕様や形式が一般に公開され、誰でも利用可能な形式
+ 直接Androidデバイスにインストールできないが、Google Playなどのサービスを通じて、デバイスに適したAPKが生成され、インストールされる

##### Android SDKとは
+ **Android Software Development Kit（Android SDK）** は、Androidアプリケーションを開発するために必要なツールとライブラリのセットのこと
+ SDKは、開発者が効率的かつ効果的にAndroidアプリを作成、テスト、デバッグするためのリソースを提供する
+ Android SDKは主にAndroid Studioで使用される

### アプリ コンポーネント
>アプリ コンポーネントは、Android アプリに不可欠な構成要素です。各コンポーネントは、システムやユーザーがアプリを起動するためのエントリ ポイントです。一部のコンポーネントは、他のコンポーネントに依存しています。

##### エントリポイントとは
+ Androidアプリにおいてエントリポイントは、アプリがどのように起動されるかを決定する場所
+ 最初に動作を開始するコンポーネント

#### アクティビティとは
+ ユーザーとやり取りするためのエントリ ポイント
+ ユーザー インターフェースを含む 1 つの画面を表す
+ アクティビティは、Activity クラスのサブクラスとして実装する

#### サービスとは
+ バックグラウンドで実行されるコンポーネント
+ サービスは、Service のサブクラスとして実装される

#### ブロードキャストレシーバとは
+ ブロードキャストメッセージを受け取るコンポーネント
+ ブロードキャストメッセージとは、システム全体通知のこと
+ これにより、アプリはシステム全体のイベントや状態の変化に対して適切に応答することができる

#### コンテンツ プロバイダとは
+ デバイスがアクセスできる永続ストレージの場所に保存できるアプリデータの管理をする

#### コンポーネントを有効にするとは？
+ アプリ内の各コンポーネント（アクティビティ、サービス、ブロードキャストレシーバ、コンテンツプロバイダ）が動作を開始すること
+ これらのコンポーネントが特定のタスクを実行するためにアクティブとなることを意味する
+ インテント（Intent）やその他のメカニズムを使って、これらのコンポーネントを呼び出すことができる
+ インテントは、コンポーネントを有効にするための非同期メッセージのこと
自動化機能を使ってSlackチャンネルに定期メッセージを送信する

# はじめに

私はメンバーとのコミュニケーションにSlackを使用しています。
自動化機能を使用することで、決まった時間に決まった内容のメッセージを送信する業務が楽になったと感じたので共有したいと思います。
5~10分くらいで設定できますよ:clap::clap_tone1::clap_tone4:

# こんな人に読んでほしい

- チームでコミュニケーションを取る機会がある
- Slackを使っている
- 定期メッセージを送信する機会がある
- Slackの自動化に興味がある

# 本機能を使用することになった経緯

ある日、チームメンバーが増えたことをきっかけに朝会を実施することになりました。
そこでチームのチャンネルにて毎朝10時にメッセージを送信し「困りごとや共有したい内容」をヒアリングすることにしました。
しかし、何日か経ってから以下の課題が発生したため、これを解決するために自動化設定をしました。

# 手動送信により発生した課題

- 毎日同じメッセージを打ち込むのが面倒
- 日によってメッセージ送信時間が10時から前後してしまう
- 日によってメッセージ内容がバラバラになってしまう
- そもそも忘れてしまう

自動化は上記課題をすべて解決してくれました！ありがたいですねぇ。

# 設定方法

それでは設定方法を説明していきます。
ここまでお話ししている通り、今回は「朝会の議題をヒアリングするための定期メッセージ送信」を目的に設定します。

以下STEPで設定していきます。
- STEP1：設定画面を開く
- STEP2：日時・周期を指定する
- STEP3：定期メッセージを設定する
- STEP4：公開設定
- STEP5：動作確認をする

## STEP1：設定画面を開く

- Slack画面左下の「その他」　→　自動化　→　テンプレート　を押下
- テンプレートギャラリーから「日時を設定してメッセージを選択する」　→　テンプレートを使用する　を押下

![スクリーンショット 2024-07-03 20.06.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952770/d1b9f4fd-249e-5358-5e0e-6baa1f0f58b9.png)

## STEP2：日時・周期を指定する

- ここでスケジュールを設定しますの編集ボタン(鉛筆アイコン)を押下
- 「Slackイベント」へ「スケジュールに基づく」を設定
- 「開始時間」へ未来の日付を設定
    - ここでは「今日」の「10:00」を設定します
- 「頻度」へ「毎日」を設定
    - 「カスタム」を選択すると、頻度や終了日を選択できます

![スクリーンショット 2024-07-04 9.21.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952770/85ba4984-e7b1-b9e0-464d-0aa0a70ba251.png)

- 右下の「保存する」を押下

## STEP3：定期メッセージを設定する

- 「その後これらを実行」の編集ボタン(鉛筆アイコン)を押下
- 「チャンネルを選択する」へ送信先チャンネルを設定
- 「メッセージを追加する」へ送信したい内容を記載
    - メッセージ内に日時を含めることができます
    - 右下の「{}変数を挿入する」　→　ワークフローが開始した時刻　を選択
    - メッセージ内の「{}変数を挿入する」を選択することで、日時の形式を変更できます
    今回は以下内容としました

```
@channel 
{ワークフローが開始した時刻}の朝会アジェンダ
何か議題がある方はスレッドに記載お願いします！
```

![スクリーンショット 2024-07-04 9.26.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952770/485b2b2e-b7d9-ba30-0923-53ce0ce26f1d.png)

- 右下の「保存する」を押下

## STEP4：公開設定

- 画面右上の「完了」を押下
- 「名前」へ本ワークフローを示す名前を記載
- 「説明」へ本ワークフローの説明を記載
- 「画像」へ任意の画像を選択
    - ここへ設定した画像は、メッセージ送信時の送信者のアイコンとして表示されるようです
    - こちらの画像がどこで使われるかはSTEP5でお見せします
- 「ワークフローマネージャー」へ編集権限を与えたいメンバーを追加

![スクリーンショット 2024-07-04 9.38.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952770/87c81ca9-31f8-996b-9b79-b2692cdc32de.png)

- 右下の「公開する」を押下

## STEP5：動作確認をする

指定の時刻になったら、作成したメッセージが送信されることを確認しましょう。
送信されるメッセージはこんな感じです。
STEP4の「画像」で設定したアイコンが表示されていますね。

![スクリーンショット 2024-07-04 10.00.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952770/c7d26bfe-6cb2-c9c2-ac5c-6146875e98d4.png)

作成した自動化設定は以下へ一覧表示されているので、そこから編集や削除が可能です。
Slack画面左下の「その他」　→　自動化　→　あなたが管理

# まとめ

かなり簡単に設定できたのではないでしょうか？
他にもスレッド内へメッセージを送信したり、メッセージ内にボタンを表示したりもできるようです。
ぜひ色々試してカスタマイズしてみてください。

自動化を通してみなさんの定期業務が少しでも楽になれば幸いです。
ここまで読んでくださりありがとうございました！
【Figma REST API】Figma の REST API は何ができるの？

## はじめに
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/d7910289-75dd-f019-3044-70a6e481907b.png)

みなさんは、FigmaのREST APIでは、何が取得できるの？と思ったことはあるでしょうか？
この記事ではそんな、FigmaのREST APIについて紹介しようと思います。

## Figma の REST API とは？

> Figma APIは、Figmaファイルへの読み取りとインタラクションをサポートしています。
> 
> これにより、オブジェクトやレイヤー、それらのプロパティを表示、抽出することができ、Figmaの外部で画像としてレンダリングすることができます。
> 
> そうすれば、デザインをプレゼンテーションしたり、他のアプリケーションに接続したり、ビジョンを拡張するために使用したりすることができます。
> 
> （引用：[Figma API](https://www.figma.com/developers/api#intro)）

## Figma の REST API で出来ること

### ⚪︎ 認証
Figma内のエンドポイントにアクセスする前に、有効な認証を提供します。
Figma APIへのリクエストを認証するには、次の2つの方法があります。

1. access tokenによる承認
    - プロフィールページからaccess tokenを生成する
2. 【推奨】　OAuth 2 経由での認証

スコープは以下のとおりです。

+ `files:read`
    + File content（ファイル・プロジェクト・ユーザー・バージョン・コメント・コンポーネント・スタイル・webhook）を読むことが出来る
+ `file_variables:read`・`file_variables:write`
    + Figma ファイル内のvariablesの読み取りと書き込みが出来る
+ `file_comments:write`
    + ファイル内のコメントとリアクションを投稿・削除できる
+ `file_dev_resources:read`・`file_dev_resources:write`
    + ファイル内の開発リソースの読み取りと書き込みができる
+ `library_analytics:read`
    + ライブラリーの利用状況を読み取ることができる
+ `webhooks:write`
    + Webhook を作成および管理できる

### ⚪︎ ファイルへのアクセス
Figmaのすべてのファイルは、ノードのツリーで構成されています。
すべてのファイルのルートには `DOCUMENT`ノードがあり、そのノードから `CANVAS`ノードが派生します。すべての`CANVAS`ノードは、Figma ファイル内の`PAGE`を表します。`CANVAS`ノードは、任意の数のノードを子として持つことができます。

`CANVAS`ノードから派生する各サブツリーは、キャンバス上のレイヤー(オブジェクトなど)を表します。

ノードにはいくつかのプロパティがあります。
その中には、すべてのノードに存在するグローバル・プロパティもあれば、ノードの種類に固有のプロパティもあります。

### ⚪︎ コメントへのアクセス
Figmaのコメント・モードでは、キャンバス上のレイヤーやオブジェクトに直接コメントを残すことができます。
これは、フィードバックを提供したい場合などの共同作業に便利です。

Figma APIを使用すると、コメントの作成日や作成者、キャンバス上の正確な位置など、コメントに関するさまざまな情報にアクセスできます。

### ⚪︎ ユーザー情報へのアクセス
Figmaに登録し、アカウントを作成した個人のFigmaアカウントを取得することができる。

### ⚪︎ バージョン履歴へのアクセス
Figmaでは、ファイルのバージョンを保存することができます。
これは、バージョン履歴に記録され、ユーザーは、ファイルの以前のバージョンを表示、追跡、復元することができます。

### ⚪︎ プロジェクトへのアクセス
ユーザー、やチームに属するファイルのコレクションです。
プロジェクトには共同作業者がアクセスでき、複数のファイルから構成することができます。

### ⚪︎ Components と styles へのアクセス
Figmaは、チームライブラリで公開されているコンポーネントやスタイルを取得することができます。

エンドポイントは、チームライブラリで公開されているアセット専用のもので、ローカルで購読されているコンポーネントやスタイルのメタデータを取得するには、`GET /v1/files/:key` を使用してください。

### ⚪︎ Webhooks V2
Webhooksは、Figmaファイルで特定のイベントが発生した際にそれを取得することができます。

### ⚪︎ アクティビティログ
組織で何が起きているかを追跡できます。

### ⚪︎ 支払い
Figma プラットフォームでの購入を、サーバーから安全に認証することとができる

### ⚪︎ Variablesへのアクセス
Variableを取得、作成、更新、削除することができる

### ⚪︎ Dev Resources へのアクセス
Dev リソースは、開発者が提供した URL で、ファイル内のノードに添付され、Figma Dev モードで表示されます。

### ⚪︎ ライブラリーの分析
Enterpriseプランの組織のみが利用でき、組織のデザインシステムやライブラリの使用状況に関する分析データを取得できる

## まとめ
この記事では、FigmaのREST APIについて紹介しました。
ぜひこの記事をきっかけにFigmaのREST APIを触っていただけると嬉しいです。

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
Rancher DesktopでDocker環境を構築してみた。

# Rancher Desktop セッティングとマニュアル作成

- 目次
    1. 設定環境
    2. Rancher Desktopのインストール
    3. コンテキストの切り替え
    4. 動作確認

### 動作確認環境

- MacBook Pro(M2, 2022)
- メモリ: 16GB
- macOS: Sonoma 14.5
- Rancher Desktop Version 1.14.2
- Docker Desktopは既にインストール済み

### Rancher Desktopのインストール（Homebrew使用）

1. Homebrewがなければインストール(手順は割愛)
2. 以下のコマンドを実行しインストール
    ```bash
    brew install --cask rancher
    ```


3. Rancher Desktopを起動し、<Preferences>→<Container Engine>が”dockerd”であることを確認する
![%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2024-07-03_12.08.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116193/111fcf6c-22e9-8de7-ee4d-1abf7660fee9.png)

    

### コンテキストの切り替え

TerminalでDockerのステータスを確認

```bash
docker info
```

`docker info`コマンドを実行した際にサーバーエラーが発生し、Dockerデーモンが立ち上がっていないという問題が発生しました。

`Error response from daemon: dial unix docker.raw.sock: connect: no such file or directory`

もともとDocker Desktopを使用していたため、DockerCLIがデフォルトでDocker Desktopのデーモンに接続しようとすることが原因でした。

以下のコマンドでDocker CLIのコンテキストの切り替えを行います。

```bash
docker context use rancher-desktop
```

再度 `docker info`を使用すると、正常に動作するようになるはずです。

### サンプルアプリケーションで動作確認

ここでは、Hello Dockerのコンテナイメージを使用して動作確認を行います。以下の手順に従ってください。

1. Hello Dockerイメージをダウンロードします。
    
    ```bash
    docker pull hello-world
    ```
    
2. Hello Dockerコンテナを実行します。
    
    ```bash
    docker run hello-world
    ```
    

このコマンドを実行すると、以下のようなメッセージが表示されます。

```
Hello from Docker!
This message shows that your installation appears to be working correctly.
```

このメッセージが表示されれば、Dockerの設定が正しく完了していることを確認できます。

### 参考資料

- Rancher Desktop 公式ページ

https://rancherdesktop.io/

- 環境構築方法

https://zenn.dev/mt_satak/articles/4d94ac6b75fb9a

- サーバーに接続できない場合の対処法

https://dev.classmethod.jp/articles/troubleshooting-connection-issues-to-docker-deamon-in-rancher-desktop/
Windows11でフォルダ共有(SMB3)をする備忘録

Windows11でのフォルダ共有が何やってもうまくいかなくて死にかけたので忘れないうちにメモしておきます。この設定は自宅内でPCの動画をスマホやらタブレットやらFireTVで見たい人向けの設定です。

# 前提
1. 自宅LAN内での共有(セキュリティはあまり考慮しない)
1. プライベートネットワークでやる
1. SMB1.0, SMB2.0は使わない
1. Windowsファイアウォールには触らない

# 事前準備(オプション)
PC(イーサネット)のIPを固定しておくと後から混乱せずに済みます。

# やること
1. Guestアカウントを有効化する
1. イーサネットの設定をプライベートネットワークに切り替える
1. 共有の詳細設定をいじる
1. メディアストリーミングオプションを許可する
1. フォルダを共有する

## Guestアカウントを有効化する
1. 左下のWindowsアイコンを右クリックして``コンピュータの管理``を開く
1. ``ローカルユーザとグループ`` > ``ユーザ`` > ``Guest``を開く
1. ``アカウントを無効にする``のチェックを外して``OK``を押す

## イーサネットの設定をプライベートネットワークに切り替える
``設定`` > ``ネットワークとインターネット`` > ``イーサネット``を開いて、``ネットワークプロファイルの種類``を**プライベートネットワーク**に切り替える

##  共有の詳細設定をいじる
1. ``設定`` > ``ネットワークとインターネット`` > ``ネットワークの詳細設定`` > ``共有の詳細設定``を開く
1. ``プライベートネットワーク``タブを開き、下記のオプションに設定する
    - ``ネットワーク探索``を**オン**
    - ``ネットワークに接続されたデバイスを自動的に設定する``にチェックする
    - ``ファイルとプリンターの共有``を**オン**
1. ``すべてのネットワーク``タブを開き、下記のオプションに設定する
    - ``パブリックフォルダの共有``を**オン**
    - ``ファイル共有の接続``を``128ビット暗号化(推奨)``に設定
    - ``パスワード保護共有``を**オフ**

## メディアストリーミングオプションを許可する
1. ``コントロールパネル``を開き、``ネットワークとインターネット\ネットワークと共有センター\メディア ストリーミング オプション``を開く
1. **メディアストリーミングが有効になっていません**と出ている場合、``メディアストリーミングを有効にする``ボタンを押す

## フォルダを共有する
これでやっと下準備完了。
1. 共有したいフォルダを右クリックして``アクセスを許可する`` > ``特定のユーザ...``を開く
1. 共有する相手を選ぶ。無地のリストを開いて``Guest``を追加する。アクセス許可は編集とかしないなら**読み取り**が無難です。

# 終わり
これで接続出来るはずです。
ちなみに認証を``Guest``とか``匿名``とか``anonymous``で認証するとなぜか**失敗**します。必ず``ユーザ名とパスワード``の項目からユーザ名を適当な値(例: aaaa)にして、パスワードは**空白**もしくは**適当な値**にします。

とりあえずAndroidだと``solid explorer``, ``MX Player``辺りで動作を確認しています。Appleは使っていないので良くわかりません。
VS Codeのハック

# 言語に応じてインデントの設定をしたい。
私はPythonはスペース4つ、Reactはスペース2つと毎回手動で設定しているが、ここを予め設定できないか調べてみた。

1. コマンドパレットに`Preferences: Configure language specific settings`を入力
1. すると、このように出るので、 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/862a9c54-bfa0-84fc-0517-ea3440da1ec7.png)
適応したい言語を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/fc9589fb-c612-7e73-f8d0-132ac37145ce.png)

1. 以下でインデントを設定できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/da4d1753-039d-751b-316b-aced4438628d.png)
Ue5 『An Unreal process has crashed:UE－プロジェクト名』を解決した。

何度目かのフリーズを経験し、さて、もう一度開こう。とUE5を起動したらつい先ほどまで開けていたファイルが開けなくなった。

![unnamed (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830284/0bf007fd-3ce4-e777-df43-34a2d3df70e5.jpeg)

起動の準備をしたのちこのポップアップが表示されてしまう。

そこで、下記のサイトを参考にした↓
【UE5　フォーラム】プロジェクトを開くとクラッシュするようになりました。
https://forums.unrealengine.com/t/topic/1754012
【UE5】エディタを開くとクラッシュする
https://qiita.com/Szr_Asakura/items/31938dad9c6febd498f1

リビジョンコントロールやコマンドプロンプトの画面が出てきたが、詳しいことが分からなかった。
しかし、どうやらログがおかしくなっている様子を感じたため、『intermediate』ファイルと『Saved』ファイルの削除した。

すると、プロジェクトが再度開けるようになった。

誰かの助けになれば幸いだ。
Cloud Functions + Node.jsをDocker環境で動かす by GCP

# ディレクトリ構成
```
├── Dockerfile
├── docker-compose.yml
├── index.js
├── node_modules
├── package.json
└── yarn.lock
```

# Dockerfile
nodeのバージョンを20にしているのは以下のガイドから。LTSがv20なのと、v22はプレビュー版のみ、v18は非推奨が結構近いので、v20にしている。

https://cloud.google.com/functions/docs/concepts/execution-environment?hl=ja#node.js

![スクリーンショット 2024-07-04 0.14.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/1b8ee7c0-f8e6-6102-fe02-213b5bfbe49f.png)

```Dockerfile
FROM node:20.11.0-bullseye-slim

RUN apt update && apt install

WORKDIR /app

COPY package.json yarn.lock /app/

RUN yarn

COPY . /app/

CMD ["yarn", "start"]
```

# package.json
`import` を使いたいので、`"type": "module"`を指定。
```json
{
  "main": "index.js",
  "type": "module",
  "license": "ISC",
  "scripts": {
    "start": "npx functions-framework --target=myHttpFunction"
  },
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0"
  }
}
```

# index.js
公式はCommonJSを使ってインポートしているが、ESModulesを使ってインポートする。正直好みの問題。Node.jsはCommonJSで書かれていること多いよね。
```javascript
import ff from '@google-cloud/functions-framework';

ff.http('myHttpFunction', (req, res) => {
  res.send('OK');
});
```

# 起動
プロジェクトrootで実施する。
```shell
docker compose up -d
curl http://localhost:8080/ // -> OK
```

これで完成。

# おわりに
この記事をベースとして、オレオレCloud Functions環境を作っていこうと思います。
TypeScirptを使ったCloud Functionsの環境構築方法を後日紹介しようと思います。

# 後日談
ほぼここに書いていたけど、node v10 の時なので情報が古い。

https://github.com/GoogleCloudPlatform/functions-framework-nodejs/blob/main/docs/docker.md
忙しい人のための「CI/CD」解説記事

# はじめに

こんにちは。3年目のFlutterエンジニアです。

未経験でIT業界に入社し、これまで数多の壁を1つずつ登ってきたわけですが、振り返ってみるといくつか理解を厳かにしてきた知識たちがいっぱいいます。

この記事を読んでる半分くらいの人は、これに共感していただけるのではないでしょうか？

今回はそんな人のために、「CI/CD」について解説します。
この記事を読み終わった後には、CI/CDを一言で説明できるようになってると思うので、
時間がない方や、聞いたことあるけど説明ができないといった方はぜひ読んでいってください！

# デプロイ

はじめから話がそれますが、CI/CDを理解するにあたって、デプロイについて理解しておく必要があります。ここについての理解がある方は、飛ばしてもらって大丈夫です。

デプロイとは…
を一言で表せたらよかったんですけど、デプロイって言葉は結構曖昧な使われ方をしているみたいなんですよね。

難しく書いている記事がたくさんありましたが、「開発環境で修正したソースを、ステージング環境や本番環境で利用できるようにする」とだけ覚えておけば何とかなります！


# CI/CD

では、本題です。

CI/CDとは、**継続的インテグレーション(Continuous Integration)** と **継続的デリバリー(Continuous Deployment)** を繋げた

**ソフトウェア開発プロセスを自動化し、効率化するための手法**

のことです！

はいうるさい。って感じですよね。
こういう文章っていろんなところに書かれてるけど、じゃあじゃあ何してんの？って思って毎回イライラします。

なので分割して簡潔に説明していきますね。

## CIとは

CIと呼ばれる段階では、「自動テスト」が実施されます。

厳密に言うと、他にも行っている処理はありますが、これからデプロイされるソースに問題が発生しないかの確認を、自動的に実施することがここの目的です。

### 実行される処理
* コードのコミット・プッシュ
* 自動ビルド
* 自動テスト
* アーティファクトの保存

## CDとは

CDと呼ばれる段階では、「デプロイ」が実施されます。

ここ処理は開発者が以下の状態から、どこまでを自動化するか選択することができます。

1. 製品としてリリースする手前まで実施する
2. 製品としてリリースするまで実施する

闇雲にデプロイを実施させるわけではなく、開発環境やチーム事情に合わせて設定させることが可能になります。

## 一言でまとめると

上記踏まえて、CI/CDについて聞かれたら、

**「デプロイまでの一連の流れを自動的に実施してくれるやつ」**

って答えておけばオールOKです◎笑

# 最後に

以上、最後まで読んでいただきありがとうございます。

難しそうだから避けてきたことも、蓋を開けてみれば説明するだけなら簡単だったりしますよね！（言うが易し）

今後も備忘録として上げていきます
[初心者向け] SlackとChatbotとLambdaを使ってChatOpsを実現しよう！

## 概要
Slack（Chatbot）経由でLambdaを使ってChatOpsを実現できるのでその方法について解説します

## 前提
- SlackのワークスペースとChatbotとの連携が完了していること

## ChatOpsとは
Chatツール(Slack、Teamsなど)を通じてシステム開発・運用から一般業務などさまざまな業務の効率化を行う手法のことです
ChatOpsでできることは色々あり、Slackにメッセージを送ることで

- SSOユーザの発行
- SGへIPアドレスを登録
- デプロイ

などさまざまなことを行うことができます
また、Slackのワークフローを組み合わせることでより汎用性が高くなります

## Chatbotの設定
Chatbotの設定を行います
設定名とチャネルIDを設定します

![スクリーンショット 2024-06-29 17.47.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/d07ae4f1-c4d9-eb1a-6bcb-c117a7b6eef7.png)

アクセスロールは下記の通りに行います

![スクリーンショット 2024-07-04 9.05.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/2fbf9c2b-04e8-3070-138b-53024f0852f8.png)

Lambda経由で処理を実行するので今回はガードレールポリシーにAWSLambda_FullAccessを追加します

![スクリーンショット 2024-07-04 9.06.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/baf50b26-0927-516e-d23a-5a4628cd3f5f.png)


設定が終わったら保存を押します
以下のように設定できれば成功です

![スクリーンショット 2024-06-29 17.53.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/8fb982f6-4416-ccaa-be37-446c47a2cf49.png)

## Lambdaの作成
以下の通りにLambdaを作成します

![スクリーンショット 2024-06-29 18.02.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/a01b9793-0ef0-1ac3-69c9-1203fa4e76e1.png)

今回は以下のレスポンスを返す簡単なLambdaを使ってChatOpsを実現します
![スクリーンショット 2024-06-29 18.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/87a638b7-a102-dccb-eef1-a8507893cc47.png)

## Slack内でChatbotの設定を行うには
以下のコマンドを実行するとAWSが招待されます
```
/invite @aws
```

![スクリーンショット 2024-06-29 17.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/79f91a00-f16f-d172-cbfa-53b9b4f3aade.png)

また、以下のコマンドを実行するとChatbotの色々な使い方が表示されます
```
@aws --help
```

![スクリーンショット 2024-06-29 17.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/b599424d-2c33-a426-f780-5f373a5deabd.png)

## 実際に実行してみよう！
以下のようにawsのアプリケーションにメンションした上でaws cliを使ってLambdaを実行します
```
@aws lambda invoke --function-name TestChatOps --region ap-northeast-1
```

以下のようにコマンドが実行されてLambdaからレスポンスが返ってきたら成功です

![スクリーンショット 2024-07-04 9.02.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/d4377276-c09a-0a69-7f40-51c12fcbd29e.png)

## 参考
https://fu3ak1.hatenablog.com/entry/2020/11/10/235659

https://www.rapid7.com/ja/fundamentals/chatops/#:~:text=%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89-,ChatOps%E3%81%A8%E3%81%AF%EF%BC%9F,%E5%AF%BE%E5%BF%9C%E3%82%92%E5%8A%B9%E7%8E%87%E5%8C%96%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

https://qiita.com/m_mizutani/items/f7fa7b1d1c077b139f98

https://tech.systems-inc.com/col-tool-cops-02/
【備忘録】GASリンク集

# 公式ドキュメントGoogle App Script

https://developers.google.com/apps-script?hl=ja

# サンプル集

https://github.com/googleworkspace/apps-script-samples

# 最初に読む

https://qiita.com/tanabee/items/2c51681396fe12b6a0e4

https://qiita.com/tanabee/items/5de3e8715be759ce1c7f


# スプレッドシートの操作

https://qiita.com/ryan5500/items/e72eb205fbe006c2eb6f

# Blobとファイル変換

https://qiita.com/a_eau_/items/01bc14bfc5cb5ef12e64

# ファイルのダウンロード

https://qiita.com/t_ohashi/items/1546427642bf7cb8fcaa

# 入力フォーム

https://qiita.com/tamtam0847/items/8b79754bb10fe58a01a3

# Zenn Book

https://zenn.dev/phpmyadmin/books/49bd37e6de7e31

https://zenn.dev/n0bisuke/books/gpts-handson-book

https://zenn.dev/catdance124/books/au-pay-manager-development

https://zenn.dev/4geru/books/advent-calendar-2022-day-4

https://zenn.dev/matsu7089/books/gas-account-book

# その他

https://tonari-it.com/google-apps-script-reference/#toc1

https://tonari-it.com/
ローカル5G、プライベートLTEのセキュリティ対策は難しい

多くのサイバー攻撃はDDoS攻撃のようにサーバーに負荷をかけて応答不能にするものの割合の多い傾向がある。

内部犯による、正規のユーザーを装ったハッキングというのも起こる世の中だが、内部犯行を行うような人材を組織に入れてしまうで時点で、すでにその組織が終わっている。

また、外部からのDDoSのような妨害攻撃は、ローカル5Gの場合周波数が限られるため、いとも簡単に干渉波を作り出しローカル5Gの通信を不能にすることができる。

理論は簡単だ。

WiFiの2.4Ghz帯を電子レンジで妨害できるのと同じで、O-RUでも持っていってローカル5G帯の電波を発射すれば、たちまちローカル5Gは通信不能となるだろう。

ローカル5Gを普及させようとしている人たちは、このような致命的な脆弱性を気にしてないようだが、性善説であるならそもそもセキュリティ対策がいらなくなる。

内部犯を対象としたセキュリティは開発には熱心なようだが、外部からは防ぎようのない電波妨害攻撃が行われてしまう。

内部犯が妨害電波を発射するようなことも考えられるだろう。

そうして、ローカル5Gがリスクに晒されるので、ローカル5Gに対するセキュリティ対策に投資することは、夢でしかないのだ。