OmniAICreator/Qiita-1.07M huggingface dataset:
Trailhead(Retrieve and Automate App Analytics Data)のエラー対応

## はじめに
SalesforceのTrailheadで勉強していて1日エラー対応で終わったので、今後同じように引っかかって1日(かそれ以上の日々を)費やす人が生まれないようにどうやったら解決したかを残すものである。

## 引っかかったところ
Apexのクラスを作成してスケジュールJobを作成したはずだが、次で示すエラー内容の通り「見つからない、または正しくスケジュールされていない」というエラーが発生していた。

## エラー内容
`We can’t find a job named 'SecondDaySummaries', or it's not scheduled to run on the second day of every month.`

## 対応した内容
組織の言語、ロケール、タイムゾーンと個人の言語、ロケール、タイムゾーンを以下のように変えた。
```
言語: English
ロケール: English(United States)
タイムゾーン: (GMT+00:00) Greenwich Mean Time (GMT)
```
そのうえでApexクラスからスケジュールJobを作り直した。
(この時点で日付や時刻の表示が変わっているのでそれかな？という感が生まれる)

## 終わりに
Salesforceさんはいい加減日本の表記にも対応してほしい…
トレイルやSuperbagdeで技術的な面ではないところで引っかかって達成できないのはシンプルにストレス…
【CommonLisp】Hello,World!を出力するプログラム回文

## 方法1

```common-lisp
(format t "Hello, World!")'("!dlroW,olleH" t tamrof)
```

## 方法2（邪道）

```common-lisp
(format t "Hello, World!");("!dlroW,olleH" t tamrof)
```

## 独り言

Hello,World!を出力するプログラムが組み込まれている言語以外で、Hello,World!を出力するプログラム回文を作るのはなかなか難しいんじゃない？
気概のある人は他言語でも挑戦してみたらどうでしょうか。（ただしコメントアウトは邪道）
Windows　USキーボードで日本語入力の切り替えをしたい

## 準備

まず，こちらに従った設定が必要かもしれません．
https://news.mynavi.jp/techplus/article/20210610-1901710/

## 

右下？のENGとJを切り替えられるようにする．
左alt+shiftで変えられるか．

できない場合
ENGまたはJをクリックし，言語設定へ
入力言語のホットキーから確認

次に，日本語キーボード(J)のとき，日本語と英語の切り替えをできるようにする．
alt+`(~のとこ)でできる．
剽窃チェッカー ツール - 大規模な多言語データベース | ETTVI

ETTVI's advanced plagiarism checker searches our vast database to quickly find duplicate content. Compare any kind of content with billions of web pages to track matching resources.

Detects plagiarism and provides insight into content quality. Check originality, SEO, readability, and intent scores to ensure your content ranks prominently.

Upload essays, research papers, blog posts, or other content - ETTVI's plagiarism checker uses lightning-fast recognition technology to highlight parts that contain copied content or need citations.

Leverage this effective plagiarism checker to monitor the quality of your content in real time for free.
https://ettvi.com/ja/on-page/plagiarism-checker
位置情報関連調べた時の備忘録（CoreLocation、Firestore）

## はじめに

アプリで位置情報を取得する際に気になること（バックグラウンドでの取得や充電の消費など）について調査した。
検証用アプリ作成でバックグラウンドで取得して、FirebaseFirestore（DB）に保存、後に取得とかをやってみたのでまとめます。


## バックグラウンドでの取得
バックグラウンドで必要な実装は大きく分けて３つ。


OSの位置情報取得ダイアログを出す。
現在地の取得処理。
取得した現在地を保存、今回の場合はFirebaseのDBに保存。


## 位置情報の取得タイミング


意図的に取得をストップさせる、もしくはアプリのタスクをキルした場合は取得がされない。
それ以外は、フォアグラウンド、バックグラウンド共に動作することを確認。
デバイスがスリープ状態でも位置情報をDBに送信していたことからスリープ時でも取得可能である。


## 位置情報の取得に関する設定


位置情報の取得は

- 取得距離間隔
- 取得時間間隔（Timerなどで）
- 取得アクティブタイプ（歩きの場合だけ、動いていない時は送信しないなど）

などの設定ができる。（ただし、必ずしもその間隔で動くとは限らない。）
**※設定できるプロパティ全て確認したわけではないので他に利用可能なものがあるかもしれない。**

## 消費電力

位置情報精度をkCLLocationAccuracyBestForNavigationとkCLLocationAccuracyBestでそれぞれ設定して確認した。
取得間隔は毎秒。
使用端末はiPhone11, iOS13。

**kCLLocationAccuracyBestForNavigation**は約30分で5％。
**kCLLocationAccuracyBestは約30分で2%。**


## 実装方法


### 前提環境
- Googleアカウントを作成する
- Firebaseでプロジェクトを作成する。


https://firebase.google.com/docs/firestore/quickstart?authuser=2#swift
公式サイトに載ってますが簡単な流れを一応。


### FirebaseFirestoreをインストールする

Podファイルに

```pod 'Firebase/Core' 
pod 'Firebase/Firestore' 
```
記述して

`$ pod install `
実行。

### Cloud Firestore を初期化する

AppdelegateのdidFinishLaunchingWithOptions内で

```FirebaseApp.configure() let db = Firestore.firestore()```
初期化。

###  位置情報取得実装

#### **1.　iOSの位置情報取得ダイアログを出す。**
まず、CLLocationManagerを初期化して設定をする。

```
private var locationManager: CLLocationManager!
locationManager = CLLocationManager()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.distanceFilter = 5
locationManager.allowsBackgroundLocationUpdates = true
```

上記のallowsBackgroundLocationUpdatesをtrueにすることでバックグラウンドでの取得を可能にする。



次に、位置情報取得ダイアログの取得処理を追加する。
locationManager.requestWhenInUseAuthorization()
これで位置情報取得許可のダイアログが表示され、許可をすれば位置情報の取得が可能になる。

#### **2. 現在地の取得**


まず、許可されているかを確認し、位置情報の取得を開始する。
```
let status = CLLocationManager.authorizationStatus()
if status == .authorizedWhenInUse || status == .authorizedAlways {
　　locationManager.delegate = self
　　locationManager.startUpdatingLocation()
}
```

次に、CLLocationManagerDelegateを実装する。

` func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {} `

が位置情報が変更されるたびに呼ばれるのでこの中で現在地を取得。



#### **3. 取得した現在地を保存、Firestoreに保存**

didUpdateLocations()のlocationsから最新の緯度経度を取得する。

```
let location = locations.last
let latitude = location?.coordinate.latitude
let longitude = location?.coordinate.longitude

addDocument()でFirestoreに登録する。

詳しい実装については公式ドキュメントを参照。

let myLocation = firestore.db.collection("locations")
        let name = UIDevice.current.name
        let data: [String: Any] = [
                            "name":name,
                            "createAt":FieldValue.serverTimestamp(),
                            "latitude":self.latitude,
                            "longitude":self.longitude]
        myLocation.addDocument(data: data) { (err) in
            ￥if let error = err {
                print("error:\(error)")
           } else {
                print("saved!")
         }
}
```
【先着5社限定】ラボ型オフショア開発、最大2週間無料お試しキャンペーン2022！Newwave Solutions Japan株式会社

![1-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031688/7d787c88-2129-ebbb-f127-612de3550dd7.jpeg)

設立11周年を記念して、日の間、新規のお客様にラボ型オフショア開発を最大2週間無料でお試しいただけるキャンペーンを開催いたします。
コロナ禍により、あらゆるもののＩＴ化・オンライン化が急務とされています。しかし新たにＩＴ人材を採用し、社内に安定した開発チームを作ろうとしても、思うようにいかない企業様が多いのではないでしょうか。
近年、日本のIT業界は、深刻な人材不足と人件費の高騰に直面しています。そしてこの問題はシステム開発の需要が増大する一方、今後も悪化していくと予想されています。
▶ https://newwave.vn/jp/blog/software-development-jp/what-is-offshore-development/

そのような状況下で今、オフショア開発が人気を高めています。
海外に開発を委託することにより、人件費を抑えながら、多種多様な技術を持つ人材を豊富に確保することができるオフショア開発は、コロナ禍の最適解として注目される機会が急増しました。システムを開発するとなると、やはりコストが課題となる場合が多いのではないでしょうか？

それを知っていただくには体験していただくのが一番ではないかと思いトライアルキャンペーンを企画いたしました。ズはオフショア開発をご検討されている皆様をサポートするため、Newwave Solutions Japan株式会社はお気軽にお試しいただけるよう、2週間分の費用が無料になる2週間オフショア開発で無料お試しキャンペーンを実施いたします。興味はあるけれど、これまでなかなか踏み出せなかった、他のオフショアとは合わなかったという皆様、この機会に是非Newwave Solutions Japan株式会社のラボ型オフショア開発をお試しください。

▶︎ <b>ラボ型開発サービスの詳細はこちら</b>：https://newwave.vn/jp/services/
![106515-18-9b758e76fcca0f99851532dd3addd68c-2092x1100 (1).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031688/f5c71b73-955d-79b6-44ed-17072d35faf1.jpeg)
<b>オフショア開発のメリット</b>
①コスト削減ができる
②IT人材不足を解消できる
③海外に自社専属の開発チームを作れる
④業務の幅が広がる
⑤納期の短縮につながる

<b>Newwave Solutions Japan株式会社のオフショア開発について</b>

2011年の創業より11年間、Newwave Solutionsは、DXとソフトウェア開発のアウトソーシングのリーディングブランドです。革新的なテクノロジーとビジネスを変革するという使命のもと、当社は複数の業界にDXとテクノロジーコンサルティングとエンドツーエンドの開発ソリューションを提供しています。

<b>Newwave Solutions Japan株式会社の「ラボ型開発サービス」が選ばれる理由?</b>

・Newwave Solutions Japan株式会社はベトナムの優秀なエンジニアを多数抱えていますので、低コストでも、クオリティには自信があります。
・リスクを抑えて高品質のオフショア開発を体験
・Newwave Solutionsは、世界中の複数のオフィスと開発センターで運営されています。 ソフトウェア開発サービスについては、お住まいの地域のオフィスにお問い合わせください。支社 東京 : 〒113-0034 東京都文京区湯島1丁目11-8

<b>ラボ型オフショア開発のお試しキャンペーンの概要</b>

▶︎ <b>キャンペーン実施期間</b>
2022年9月15日〜2022年12月31日の間にご発注頂く案件に限ります。

▶︎ <b>お取引先の条件</b>
先着5社限定！
新規のお客様限定とさせて頂きます。

▶︎ <b>お試し期間及びお試しチーム体制</b>
お試し期間：最長2週間
お試しチーム体制：
・ブリッジSE　0.5名
・開発者　2名

▶︎ <b>契約の期間</b>
３ヶ月以上の「お試し期間チーム体制」でご発注頂く案件に限ります。
２週間お試し期間以内に、無料契約を解除することは可能です。

<b>注意事項</b>
※チーム体制を調整することは可能です。お試し期間でのお試しチーム体制の部分はご請求いたしません。
※先着５社限定になりますので、早めにご相談ください。
※ご応募多数の場合は、受付終了日より前に締め切らせて頂く場合があります。
※その他、詳細条件については、お問い合わせ時にお知らせいたします。

<b>お申し込み方法</b>
▶︎ お問い合わせください : https://newwave.vn/jp/contact-us/

</b>【会社概要】</b>
会社名 ：Newwave Solutions株式会社 | Newwave Solutions Japan株式会社
設立日 ：2011年11月17日
代表者 ：TO QUANG DUY（ト・クアン・ズイ）
従業員数 ：300名 (2022年07月現在)
所在地 ：〒113-0034 東京都文京区湯島1丁目11-8
業務内容 ：システム開発、ブロックチェーンサービス、ウェブ開発、ラボ開発、モバイルアプリ開発, ソフトウェア保守、QAとテスト、UI／UXデザイン、WEBシステム開発 、オフショア 開発 会社、システム開発会社、アプリ開発
お問い合せ先 ：sales@newwave.vn
公式WEBサイト ：https://newwave.vn/jp/
​お問い合せ先　 ： https://newwave.vn/jp/contact-us/
電話番号: +84 98 531 0203 (LINE)
<b>オフィス</b>
Newwave Solutionsは、世界中の複数のオフィスと開発センターで運営されています。 ソフトウェア開発サービスについては、お住まいの地域のオフィスにお問い合わせください。
本社 ハノイ : 1F, 4F, 10F, Mitec Building, Duong Dinh Nghe Street, Yen Hoa Ward, Cau Giay District, Hanoi, Vietnam
支社東京 : 〒113-0034 東京都文京区湯島1丁目11-8
Github EnterPrise利用者のためのCLIでBitrise導入手順

## はじめに

BitriseにはWebのGUIでプロジェクトを追加して設定していく方法とCLIで追加する方法がありますが、
今回GithubがEnterPriseだったので、CLI一択でした。

GUIについても色々ネットで調べると出てきますので今回はCLIの流れを載せていきます。


## Bitriseにアプリの追加


1. Bitriseにログインする。（アカウントはこちらに記載→　01.共通アカウント）
2. Add new App をタップして from CLIで続行。
![image-20200727091210548.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701264/8d292e71-ded4-3635-f835-9d9bf2f7c839.png)
3. ページ下部の bashコマンドをコピーする。
![スクリーンショット 2020-06-17 14.23.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701264/b64b0ce1-28b5-539d-c4a5-9d653bb2ce77.png)

4. Specify how Bitrise will be able to access the source code: Automaticを選択し、Do you need to use an additional private repository?は I need toを選択する
5. What bitrise.yml do you want to upload? は 既に使っているbitrise.ymlがなければ、Run the scanner to generate a new bitrise.yml を選択。

6. 5を行うと現在ローカルで参照しているブランチをscanするので、そのブランチでよければそのまま続行する。
7. ipaファイルのExportの仕方を聞いてくるので、用途によって選択する。（develop,enterpriseなど）
8. どの証明書を使用するか聞かれるのでExportの種類によって合ったものを選択する。
9. bitrise.ymlを自動作成される設定の場合はアーカイブが行われて成功の表示が出る。


## Bitriseワークフローの実行


実行にはpushやPRなどのトリガーを設定して自動的に実行する場合と

Bitriseに追加したアプリの詳細画面から実行する場合がある。

![スクリーンショット 2020-06-22 17.54.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701264/60d1dcae-a4b2-c1b6-1ca9-ad4a9f94a0ff.png)


githubのイベントを受信するにはbitriseのSetting画面から取得できるwebhookを対象プロジェクトに設定するのと

Workflowの設定画面のTriggerタブで設定が必要。

また、Secretsに設定している変数を使う場合はプルリクからの参照も許可する。



## Slackへの通知設定


通知用のチャンネル作成とwebhookurlを取得をして、

Bitriseのワークフローにslack send messageを追加して、作成していただいたURLを設定する。


![スクリーンショット 2020-06-22 18.22.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701264/848437bc-2b9f-627e-b269-ea074a3ed8f2.png)
![スクリーンショット 2020-06-22 17.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701264/4920520b-f21c-4875-7d37-9d119736fbcc.png)



参考：https://qiita.com/powerispower/items/f8b9e358649df2e4b905



## Deploygateとの連携


workflowのステップでdeploygateを追加。
deploygateのAPIキー、グループ（もしくはアカウントユーザー）情報をアカウント画面から確認し設定する。
App file path　を$BITRISE_IPA_PATHにする。
必ずXcode Archiveのステップの後にdeploygateのステップを追加する。
※リリースノートなども書けるが、追加ではなく自動配信時に設定が必要。


![スクリーンショット 2020-06-22 17.57.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701264/ff6e66d5-6f8d-83d4-54df-18899901b1c8.png)


参考：
https://devcenter.bitrise.io/jp/deploy/deploy-apps-to-deploygate-from-bitrise/

https://qiita.com/kyoro353/items/200d5b34b9f5805dd43a



## 課題と対応内容一覧


Bitriseのデフォルトのstackがxcode10.2だったため、マルチモーダルアプリのSceenDelegateに対応しておらずビルドが失敗した。
★対応
　デフォルトのstackをXcode11以降にする。（今回は導入時が11.4だったためそれに合わせた。）
案件特有のログインライブラリがシミュレータ 用と実機用とあるため、現状テストをするにはシミュ用でdeploygateで配信するには実機用にする必要あり。
★対応
　開発環境ごとに証明書の切り替えが必要だと思われるが、現状そこまでの動作確認、調査は未完了。
　また、アーキテクチャごとに設定して、ファイルのあるフォルダのパスを設定する。

証明書のようなセキュアな情報をどのように扱うか検討が必要。（fastlaneの利用？）
[学習メモ]ワイヤーフレームの作成

# ワイヤーフレーム

Webページのレイアウトやコンテンツの配置を定めた設計図のこと

# 順番

## サイトマップを作成する

- 必要なページを書き出す
- ページのコンテンツをカテゴリ別に分類
- ページの階層を決める
- サイトマップを作成する

## ページのレイアウトを決める

- 作成するサイトに適したレイアウトを考える。
    - カラムレイアウト
    - タイル型レイアウト
    - マルチカラムレイアウト
    - サイドバー固定レイアウト

## ワイヤーフレイムを書く

- ヘッダー・グローバルナビゲーション、メインビュー、コンテンツエリア、フッターの4種類に分けて設計していく
### ヘッダー・グローバルナビゲーション
- 全ページで共通して使用される
- このサイトにこんなコンテンツがあるということを伝える
- サイトマップに沿って作成する
### メインビュー
- ユーザーがTOPに入ってきたときに、真っ先に目に入る重要な部分
- インパクトのあるキャッチコピーや画像を入れて、サイトを印象付けることが重要
### コンテンツエリア
- サイト全体の「目次」的な役割を果たすため下層のコンテンツページをわかりやすく並べる
    - 全てのコンテンツを並べてはいけない
    - 見せたいコンテンツから順番に並べる
### フッター
- ページの一番下に表示される要素
- コンテンツを全て読んだ人の目に入るので、サイトの全体像がわかるように目次として使う
- ヘッダーと違い、フッターは縦幅が大きくなっても良いので、ページをできるだけ掲載すると良い
## コツ
- 他ページへの導線
    - 他のページへのリンク部分はすぐに分かるように、色分けをする
## 参考
[https://abentry.co.jp/blog/web/wireframe-make/](https://abentry.co.jp/blog/web/wireframe-make/)
[https://n-works.link/blog/webdesign/wire-frame](https://n-works.link/blog/webdesign/wire-frame)
[https://blog.nijibox.jp/article/making-wireframe/](https://blog.nijibox.jp/article/making-wireframe/)
[https://web-kanji.com/posts/making-wireframe](https://web-kanji.com/posts/making-wireframe)
Newwave Solutionsのシステム開発におけるビジネスの可能性を解き放つ

![5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031688/17a5bda5-768e-3c7f-3122-d67a7a252785.jpeg)
Newwave Solutionsは、ベトナムにある専門的なシステム開発会社です。ソフトウェア開発において10年以上の経験を持ち、スタートアップから大企業、さらには政府のソフト開発まで、多くのプロジェクトを手がけてきました。コラボレーションとパートナーシップを通じて、お客様のデジタル戦略やビジネスアイデアの実現をお手伝いします。

Newwave Solutionsのチームは、お客様との綿密な打ち合わせを頻繁に行うことで、システム開発プロジェクトにおけるお客様の目標を容易に定義し、理解することができます。この初期のプロセスが長期的な成功を確実にするために重要であると信じています。その上、当社はリリース後長期間にわたってもシステムが効果的に稼働するよう、システムの保守と更新も提供しています。

<b>要求に応じるシステム開発者を提供する</b>
![331164622_641812664614243_6150887581196752045_n.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031688/072e1f19-428d-a17d-cb70-3a1e6f08fb79.jpeg)
複数のお客様がベトナム・ハノイのNewwave Solutionsのオフィスを訪問しました

Newwave Solutionsでは、300人以上の社内システム開発者を雇用しており、長年にわたって様々なプロジェクトの規模や業界でITソリューションを提供してきたことを誇りにしています。当社の開発者は、ワークフローを加速し、収益を向上させ、コンセプトから実装、そして最終的にはデプロイまで、作業を最適化します。さらに、新しい技術やプロセスを採用してアーキテクチャ設計からテスト、実装に至るまで、あらゆる課題を克服しています。ベトナムのオフショアシステム開発外注にNewwave Solutionsを選択する主なメリットは以下のとおりです。

● リアルタイムのコミュニケーション：当社の開発者は、リアルタイムのコラボレーションを可能にするために、お客様のニアショアタイムゾーン内で作業します。本当の「ブランチロケーション」感覚の実現実現に取り組んでいます。定期的な管理と進捗レポートにより、説明責任と透明性をモデルに適用します。

● スケーラブルなビジネスモデル：お客様と協力してお客様のビジネスに最適かつ詳細な計画とアプローチを考え出し、プロジェクトが終了した時に高い価値を保証します。お客様のニーズに基づいて、可能であればどの時点でもチームの規模を増減できる柔軟なビジネスモデルを採用しています。

● ソースコード 所有権：ほとんどのベトナムソフトウェア会社は、お客様が他の会社やツールを探すのを防ぐために、自社のソースコードを所有することにこだわっています。しかし、当社の契約では、ソースコードと知的財産の唯一の所有者はお客様です。
10年以上にわたるシステム開発サービスの提供を通じて、お客様の要件に容易に適応できるようにプロセスを最適化してきました。アジャイル手法を用いることで、市場投入までの時間を短縮し、費用や時間を無駄にしないようにします。昨年、Newwave Solutionsのチームの平均定着率は85%以上でした。
![NWS.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031688/467d6772-a02a-8991-fdbf-8f19c8ff4cb0.jpeg)
Newwave Solutions – ベトナムソフトウェア会社トップ
さらに、Newwave Solutionsの開発者たちは勤勉で献身的なチームであり、お客様のアイデアを強力なビジネスソリューションに仕上げる準備ができています。当社が関わるビジネスの範囲は、時間とともに広がっていますが、主要なソフトウェアプロジェクトは、医療システム開発、通信システム開発、税関システム開発などに重点を置いています。複雑な規制、広範な統合レベル、データの高い価値、大規模なプロジェクトなどの経験から、Newwave Solutionsは様々な分野に適合しています。その結果、最高の品質と、お客様のビジネスと当社のビジネスとの最適な相関関係を保証します。

ソフトウェアプロジェクト開発について考えていますが、まだプロジェクトの概要が明確ではありませんか？

お問い合わせは今すぐ！

<b>【会社概要】</b>

会社名 ：Newwave Solutions株式会社 | Newwave Solutions Japan株式会社

設立日：2011年11月17日

代表者 ：TO QUANG DUY（ト・クアン・ズイ）

従業員数 ：300名 (2022年07月現在)

所在地 ：〒113-0034 東京都文京区湯島1丁目11-8

業務内容 ：システム開発、ブロックチェーンサービス、ウェブ開発、ラボ開発、モバイルアプリ開発, ソフトウェア保守、QAとテスト、UI／UXデザイン、WEBシステム開発 、オフショア 開発 会社、システム開発会社、アプリ開発

お問い合せ先 ：sales@newwave.vn

公式WEBサイト ：https://newwave.vn/jp/services/software-development/

​お問い合せ先 ： https://newwave.vn/jp/contact-us/

電話番号: +84 98 531 0203 (LINE)
Nuxt3のプロジェクトにStorybookを導入する

## はじめに

表題そのまんまですがNuxt3でStorybookを扱うまでの手順です。  

## 環境

* Node 16.17.0  

## Nuxt3のインストール

まずNuxt3プロジェクトを作成します。  

```shell
npx nuxi init nuxt3-storybook
cd nuxt3-storybook
npm install
```

一度動作確認しておきます。  

```shell
npm run dev
```

<http://localhost:3000>にアクセスして、ページが表示されればOK。  

![Nuxt3Home](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780581/1995aca3-3b96-ad30-57b8-e7f624e3cdc3.png)


## Storybookのインストール

Storybookを導入します。  

```shell
npx sb init --type vue3 --builder @storybook/builder-vite
```

(補足)  
最初公式にある通り`npx sb init`としてみたらダメでした。  
typeにVue3を指定すること(`--type vue3`)と、ビルダーにviteを指定する(`--builder @storybook/builder-vite`)ことが必要だそうです。  
[参考](https://zenn.dev/link/comments/a8e07be06bcbbd)  

こちらもとりあえず動かしてみます。  

```shell
npm run storybook
```

<http://localhost:6006>にアクセスして、ページが表示されればOK。  

## コンポーネントを用意する

Storybookで表示するコンポーネントを作成します。  
プロジェクトルートに`components`ディレクトリを作成し、その配下にコンポーネントを作成していきます。  

```vue:components/Counter.vue
<script setup lang="ts">
import { ref } from 'vue';
// クリックしたらカウントUPするだけのボタン
const state = ref(0);
const increment = () => {
  state.value++;
};
</script>

<template>
  <div>Count: {{ state }}</div>
  <button @click="increment">Increment</button>
</template>
```

Storybookで表示するために`stories`ファイルも作成します。  
今回はcomponentsディレクトリ配下に`stories`ディレクトリを作成、その配下にstoriesファイルを作成していきます。  

```ts:components/stories/Counter.stories.ts
import { Story } from "@storybook/vue3";
import Counter from "./Counter.vue";

export default {
  title: "components/Counter",
  component: Counter,
}

const Template: Story<typeof Counter> = () => ({
  components: { Counter },
  template: "<Counter />",
});

export const Default = Template.bind({});
Default.storyName = "Increment Counter Button";
```

storiesファイルの場所によっては、.storybook/main.jsの記述を変える必要があります。  

```js
module.exports = {
  "stories": [
    "../components/stories/**/*.stories.@(js|jsx|ts|tsx)",
  ],
  :
}
```

再びStorybookを起動します。  

```shell
npm run storybook
```

先ほど作成したコンポーネントが表示されていれば成功です。  

![スクリーンショット 2023-02-25 161018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780581/62f84f19-553a-deeb-4eff-7b5a7f95c5e6.png)


## おわり

以上がNuxt3にStorybookを導入するまでの手順です。  
導入・起動しただけで具体的にコンポーネントを開発していく過程は載せていませんが(というか私もこれから学習しなくては)、何かのお役に立てば幸いです。
ネイティブアプリ開発時のZeplinのちょっとしたチームルール

## はじめに

現場ではZeplinを元にアプリのUI実装を進めているのですが、

その時に色や画像はもちろん、コメントでやりとりするのですが

今の現場でのルールを備忘録的に載せようと思います。


## コメントルール

基本的にデザイナーさんへの細かい質問（pxの違いや端末差分の時の制約についてなど）はZeplin上で行います。

質問時は黄色のタグでコメントし、回答をもらって解決したらタグを青色に変更します。


それ以外の仕様に関わるデザインについてはPO（アジャイル開発なので）に確認を行いPO経由でデザイナーさんに修正依頼を行います。

## 色ルール

色の名前はそのままコードの命名で使いたいのでキャメルケースで設定して

もらってカラーコード見たいのを作ってもらいます。（Swiftなのでこの命名規則）

プロジェクトを対応OS、言語にしてもらって（SwiftやKotlinなど）

px, dp, 画像ダウンロード時のサイズなどを統一してもらうようにします。

なので、例えばiOSならhoge.png, hoge@2x.png, hoge@3x.pngがワンタップでダウンロードできて便利です。
SAP(ABAP)/Python/RDBMSの構文比較

|  機能  |  ABAP  |  SQL系  |  Python  |
| ---- | ---- | ---- | ---- |
|  Function関数  |  ・サブルーチン<br>・汎用モジュール  |  ストアドプロシージャ  |  クラス/メソッド  |
|  TBD  |  TBD  |  TBD  |  TBD  |
Vue.jsの学習を始めました②

前回に引き続きVue.jsの学習記録です。

今回はVue.jsを使ってランダムなニックネームを表示する簡単なアプリケーションを作りました。
参考：https://zenn.dev/sdkfz181tiger/books/363d20b1e591fc/viewer/f853ce

全体のHTMLは以下の通り。
```index.html
<html>
<head>
	<meta charset="UTF-8"/>
</head>
<body>
	<div id="app">
		<p class="d-title">
      {{ appName }}
    </p>
    <p class="d-line-1">
      あなたのニックネームは
    </p>
    <p class="d-line-2">
      {{ nickname }}
    </p>
    <p class="d-line-3">
      です!!
    </p>
	</div>
	<!-- JavaScript -->
	<script src="https://unpkg.com/vue@next" defer></script>
	<script src="script.js" defer></script>
</body>
</html>
```
次にjavascriptです。

まずVue.jsで使うデータを用意します。
```script.js
const myData = {
  appName: "ニックネームメーカー",
  nickname: "ニックネーム",
  names: [
    "スライム",
    "スライムベス",
    "メタルスライム",
    "はぐれメタル",
    "メタルキング"
  ]
}
```

names配列の中からランダムな配列を返す関数を定義します。
Vue.jsにおける関数の定義はmethods:{}の形で記述します。

```script.js
  methods:{
    roulette(){
     //ランダムな0から1までの整数を生成し、names配列の数までの数と掛け合わせる
      let rdm = Math.random() * this.names.length;
     //生成した整数の小数点以下を切り捨てて変数indexとして定義
      let index = Math.floor(rdm);
     //names配列からindex番目のオブジェクトを持ってくる
      this.nickname = this.names[index];
    }
  }
```

全体のコードはこんな感じになります

```script.js
const myData = {//Vue.jsで使うデータを用意する
  appName: "ニックネームメーカー",
  nickname: "ニックネーム",
  names: [
    "スライム",
    "スライムベス",
    "メタルスライム",
    "はぐれメタル",
    "メタルキング"
  ]
}

const app = Vue.createApp({//Vue.jsを準備する
  data() {
    return myData;
  },
  created() {//サイト訪問時の処理
    console.log("roulette!!");
    this.roulette();
  },
  methods:{
    roulette(){
      console.log("tick!!");

      let rdm = Math.random() * this.names.length;
      let index = Math.floor(rdm);
      this.nickname = this.names[index];
    }
  }
});
app.mount("#app");//Vue.jsを起動する
```
既存のflutterアプリにfirebaseを導入する

## はじめに
- 何も設定しなければ、cloud firestoreに繋げれない。当たり前のことだが。
- 2つしないといけないことがありました。
    1. cloud_firestore: v4.4以外にも、firebase_core: v2.7のpackageのインストールが必要だったこと
    1. apiKeyやappIdなどの幾つかの認証設定
- firebase cliを使えば簡単に出来ちゃうのだとか

lib/main.dart

```dart
void main() async {
  // runApp()より前にFirebaseの設定をしているのならば、以下の記述をしなければならない
  WidgetsFlutterBinding.ensureInitialized();
  // Undefined name 'Firebase'.
  // Try correcting the name to one that is defined, or defining the name.
  await Firebase.initializeApp();
  runApp(const FitnessApp());
}
```

## Firebase CLIから行う手順

- 自動インストール スクリプトで Firebase CLI をインストールする

```bash
curl -sL https://firebase.tools | bash
```

- Google アカウントで Firebase にログインして認証

```bash
firebase login
```

- pathを通して、flutterfire configureコマンドを使用できるように設定する

```bash
dart pub global activate flutterfire_cli
export PATH="$PATH":"$HOME/.pub-cache/bin" >> ~/.zshrc
source ~/.zshrc
```

- 以下のコマンドから、既存のflutterアプリにでもfirebaseに繋ぐファイルを生成してくれる

```bash
flutterfire configure
```

## 参考文献
https://firebase.google.com/docs/flutter/setup?hl=ja&platform=ios
個人WEBサービス開発で使ったサービス（鋭意更新中

Railsで開発中。

# 開発、ソース管理、デプロイまで。

## Cloud9
m1 MacでRailsの環境構築をしたくなかったので、AWSのCloud9から遠隔開発を選択。

## heroku
いろいろインフラを管理したくなかったので、いい感じにやってくれるherokuを選択。

## GitHub
これ以外にソース管理の選択肢なし。

## chatGPT
ライブラリやコーディングの相談、リファクタを頼む、バグを見つけてもらうなど、
万能すぎてやばい。
こいつに関しては凄すぎるのでまた別で記事を書く予定。

---

# デザイン関連

## colorhunt
カラーパレットを選んでサイトの統一感を出す感じ。

https://colorhunt.co/palette/e3fdfdcbf1f5a6e3e971c9ce

# colorate
ベースの色を指定すると、それを基準にカラーパレットをいくつか出してくれるサイト。

https://colorate.azurewebsites.net/ja/Color/16B7CD#modals

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145707/d5989d6a-7210-7b3c-4323-0077f8b36aac.png)
#4ECADB,#16B7CD,#8DDEE9

# color-register 色系
グラデーションで出してくれて、色々試すのに捗った。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145707/ba45c841-562a-31be-6f5a-0a3512fdb77a.png)

https://color-register.org/color/EFFAFB
https://color-register.org/color/E7F8FA

# アイコン
googleのマテリアルデザインのアイコン。

https://fonts.google.com/icons?selected=Material+Icons&icon.style=Outlined

ヘルプにあったこの一文が決め手 `CSS のみを使用して色付け、サイズ設定、配置が可能です。`

https://developers.google.com/fonts/docs/material_icons?hl=ja#icon_font_for_the_web

## 使い方が超簡単。
CDNを追加して、
```
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
```
クラスは一定でspanを書くだけ。中の`expand_more`の文字列を書き換えると、違うアイコンになる。
```
<span class="material-icons">expand_more</span>
↓
<span class="material-icons">expand_less</span>
```
jQueryでテキストを書き換えただけで、下矢印が上矢印に変わっている。
![2023-02-28 17.30.00.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145707/f04876b5-507c-9b5a-e2ae-742b721b7c36.gif)


ーーーーーーー
# 参考リンク

https://qiita.com/aiandrox/items/4196c8f5b564d29fdce7

# 分析系
### Google Analytics

### Googleサーチコンソール

### Microsoft Clarity
無料の画面レコーディング＆ヒートマップツール

### GoogleTagManager


# 参考にしたURLを貼っていく

meta_tagsと、titleの設定

https://qiita.com/momo1010/items/ccb507c013976846a549
Newwave SolutionsのITエンジニア雇用のご案内

![4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031688/4c03114d-4ed1-c714-7cc5-f532ce3a4c96.jpeg)
2022年にITエンジニアが不足するため、有能なソフトウェア開発者雇用ができるための競争が激しくなっています。しかし、Newwave SolutionsでITエンジニア雇用をするためのすべての情報を提供しますので、最良の取引とガイダンスを取得するための進捗状況を理解することができます。

ベトナムには、国際企業と協力しているソフトウェアオフショア企業が多数あり、当社もその1つです。Newwave SolutionsはベトナムのITアウトソーシング企業トップ10に入る会社です。革新的なソフトウェア ソリューションを提供するだけでなく、ITエンジニア雇用をしてプロジェクト専用の開発チームを合理的なコストで作成することもできます。

<b>Newwave Solutions | ITエンジニア雇用の信頼できるソフトウェアアウトソーシングサービス</b>
![NWS-1536x1008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031688/9975ac8b-e5ea-db09-327c-f880ce6f526b.png)
ITエンジニア雇用

10年以上の経験を持つベトナムのオフショアソフトウェア開発会社として、私たちは500社以上のクライアントと協力をし、適切なIT開発者雇用を支援してきました。

Newwave Solutions の経験豊富な開発者チーム（ソフトウェア開発者とブロックチェーン開発者を含む）は、お客様のユニークなプロジェクトのアイデアに取り組み、クラス最高のソリューションを提案します。

スタートアップから世界中の大企業まで、エンドツーエンドのWebアプリケーションからモバイルアプリケーションまで、当社のIT開発者は、お客様のプロジェクトに必要なすべてを提供するためのスキルとツールを備えています。

私たちの優秀で信頼できるIT開発者とデザイナーを雇用することで、強力なチームを作り、お客様のビジョンとビジネス要件に合った複雑なソフトウェアソリューションを作成するお手伝いをします。私たちのチームは、UI/UXデザイン、ブロックチェーン開発、モバイルアプリのカスタマイズなど、様々な分野に特化しています。

お客様のあらゆる問題を解決し、最終的な目標を達成するために、私たちをお選びください!

 → [専任の開発者を雇う](https://newwave.vn/jp/contact-us/)

<b>Newwave SolutionsのITエンジニア雇用すべきの理由</b>

当社のITエンジニア雇用をして、一歩先を行きましょう！Newwave Solutionsの開発者チームは、お客様のビジネスアイデアを信頼性が高く、収益性の高いプロジェクトに仕上げるお手伝いをします。なぜニューウェーブでソフトウェア開発者を雇うべきなのか、その理由をいくつか見てみましょう。

<b>質の高い技術者教育</b>

Newwave Solutionsのベトナム人開発者は高度なスキルを持ち、専門分野に優れています。実際、ベトナムは、2020年のグローバルスキルインデックスでアジア太平洋地域で2位、世界で22位にランクされたため、Forbesによって ITアウトソーシングサービスの「小さくても強力な大国」と呼ばれています。

<b>言語能力</b>

ITアウトソーシングでは言語の壁が常に障害となりますが、Newwave Solutionsでは問題ありません。日本企業向けのソフトウェア開発を10年近く提供してきた経験を持つNewwave Solutionsは、各プロジェクトにITコンター チームを配置し、適切な日本語スキルを持つ多くのITエンジニアを擁しています。それに加えて、ベトナムのすべての大学は英語の資格を必要とするため、ほとんどの開発者は英語で作業し、コミュニケーションをとることができます

<b>簡単な雇用プロセス</b>

ITエンジニア雇用の非常にシンプルなプロセスにより、プロジェクトに必要な経験や言語スキルを持った開発者を簡単に選ぶことができます。お客様のアイデアやご要望をお聞かせいただいた後、適切な候補者のショートリストをお送りします。その後、履歴書の確認と面接を経て、あなたのアイデアを実現するためのドリームチームを選ぶことができます。

<b>コスト効率性</b>

ベトナムでITエンジニア雇用をする場合には、企業は低い雇用コストを利用して、さらに経費を削減することができます。米国、中国、インドなどのITアウトソーシング企業に比べ、平均給与は40～50％安くなっています。

ベトナムでのITエンジニア雇用は、品質に妥協することなくコスト削減を目指す企業にとって、間違いなく合理的な価格と品質が保証された賢明な決断も言えるでしょう。

【会社概要】
会社名 ：Newwave Solutions株式会社 | Newwave Solutions Japan株式会社
設立日 ：2011年11月17日
代表者 ：TO QUANG DUY（ト・クアン・ズイ）
従業員数 ：300名 (2022年07月現在)
所在地 ：〒113-0034 東京都文京区湯島1丁目11-8
業務内容 ：システム開発、ブロックチェーンサービス、ウェブ開発、ラボ開発、モバイルアプリ開発, ソフトウェア保守、QAとテスト、UI／UXデザイン、WEBシステム開発 、オフショア 開発 会社、システム開発会社、アプリ開発
お問い合せ先 ：sales@newwave.vn
公式WEBサイト ：https://newwave.vn/jp/services/
​お問い合せ先　 ： https://newwave.vn/jp/contact-us/
電話番号: +84 98 531 0203 (LINE)
cloud firestoreをインストールしたらxcode buildが終わらなくなって…のエラー

## はじめに
・他の記事でも取り扱われ、散々擦られた題材だが、どのファイルに記載していいかわからなかったので、備忘録として残しておく。

## エラーの内容

```shell
Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies.
To update the CocoaPods specs, run:
pod repo update
Error running pod install
Error launching application on iPhone 13.
```

## 対処法

ios/Podfile

```shell
target 'Runner' do
 use_frameworks!
 use_modular_headers!
 // 以下の行を追記する
 pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '6.33.0'
 flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end
```

```shell
brew upgrade cocoapods
```

```shell
cd ios
pod install --repo-update
flutter clean
```

## 参考文献

https://www.ryu-nosu.com/cocoapods-satisfy-dependencies/

https://note.com/hatchoutschool/n/ndf9049d84773
Power Apps 起動画面を設定する　App.StartScreenを設定する

## Power Appsのアプリ起動時の画面を設定する

## 完成前　before
アプリ起動時の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/f3e984dc-44a8-f8bf-5572-f9e3e09cf7f2.png)

## 完成後 after
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/03f8beb1-ac62-0480-45a9-71b2b70a0d23.png)


## 起動画面を設定した背景
ユーザーにアプリ起動画面が立ち上がるまでの、数秒間に起動画面をみせたく。

## 設定方法
### 挿入＞入力＞タイマー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/08b856e7-34b4-da63-9a47-8593a3911ada.png)

見つからないときは検索する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/9a810936-8680-a992-8556-1202878cfa41.png)

### 秒数は初期は60000-60秒のため、5秒の5000に設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/8a696f10-e5e0-7410-45cc-c2e8b1ac0ce9.png)

### プロパティ設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/7adfe61b-5b1a-c44c-2634-2fca9127b3d4.png)

Power Apps アプリ起動時に表示する画面を指定するApp.StartScreenを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/c3bb66ba-1b0c-a62f-a15f-cebd9a8edcd4.png)

参考URL

https://ippu-biz.com/development/powerplatform/powerapps/startscreen/

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/object-app#startscreen-property

https://koruneko.hatenablog.com/entry/2021/10/22/005143

以上
【不可能？】レガシーのカスタマイズ画面に行きたい！【PowerApps】

# クラシックでのカスタマイズができなくなった！
https://qiita.com/sho-sun/items/b6a5bdb6bd630bdfe01b

↑こちらの記事のとおりモデル駆動型アプリの『詳細設定』からカスタマイズへ遷移できなくなっていました。

呼び方も様々です。
レガシー、クラシック、Dynamicsの画面、昔のカスタマイズ画面などなど

またアクセスする方法もいくつかあるので色々試してみたいと思います。

## 方法①規定のソリューションからクラシックに切り替える
![Screenshot 2023-02-27 16.37.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/7603ffe9-b9f1-0ac9-bf8a-d962fb3a04cd.png)
最短な方法はこちらかなと考えられます。
i. 既定のソリューションを選択状態にする
ii. ［クラシックに切り替える（Switch to classic）］をクリックする
さあどうでしょう...

 ![Screenshot 2023-02-27 16.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/81be1d96-5e26-544e-a2fe-677c9140a8c1.png)
はにゃ？？

既定のソリューションに入ってないし、そもそも既定のソリューションがないし、、、

## 方法②URLゴリ押し戦法
![Screenshot 2023-02-27 16.51.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/212d3221-6e81-1612-b345-34877d7a2082.png)
経路は閉ざされど、アクセスできちゃうということがDynamicsにはよくあります。
さあ今度こそ...

![Screenshot 2023-02-27 16.53.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/fba267b2-f51f-5019-37b2-028d2c22afef.png)
はい、すみませんでした。

## 方法③ソリューションを開いた状態で［クラシックに切り替え］
![Screenshot 2023-02-27 16.58.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/c1a5f60f-3b8a-0e29-35ad-f1b2a7521a17.png)

なんとなんと
![Screenshot 2023-02-27 17.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/026fa259-a88f-6035-81a2-618d6a3533fd.png)

アクセスできました！
案外単純でしたね。

## 方法④フォームのカスタマイズ画面から［クラシックに切り替え］
![Screenshot 2023-02-27 17.04.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/fe0077c3-7c4d-1ef8-cb14-e01f6bc7a14b.png)

結果は。。。
![Screenshot 2023-02-27 17.07.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/93dcf44d-b948-7274-fb46-52ea236cff3a.png)
だめでした。
ここはだめなんかい！って感じですね。

## 結論
方法③からのみアクセス可能。
ソリューションに入った状態でクラシックに切り替えると行けるようですね。ただ他3つがだめだったように方法③もいつかはできなくなる可能性もあります。注目ですね。

## 追記（2023/3/1）
残念ながらフォームの編集画面まではいけませんでした。
![Screenshot 2023-03-01 19.25.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/fdf73dfb-5f47-adb4-1e52-8a0dc7a8115e.png)

メインフォームを編集しようとすると、、、
![Screenshot 2023-03-01 19.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/8c01d0d6-a2c1-8ca0-bd46-a04099adcc9f.png)

おなじみのこの画面に飛ばされてしまいました。

本格的にレガシー潰しが始まっていますね。わくわくします

ついきいじょう
タプル

>タプルとは、リスト同様に複数の要素を格納できる
タプルはリストと違って中身を更新することができない
要素の変更をしたくないときに有効である

```py.qitta.py
#  タプルの学習
a = (1, 2, 3)
print(a, 'タプルの型は',type(a))

```

## タプルの要素を取り出す方法
```py.qiita.py
#  アンパックすると、要素の取り出しが可能
one, two = (1, 2)
print(one, two)
```

## 注意点
```py.qiita.py
# 　練習
t1 = (1, 2)
t2 = (3, 4)
print('t1のID: ', id(t1))
print('t2のID: ', id(t2))

t1 = t1 + t2
print(t1)
#  ここで、t1が更新できているのは、IDが違うから
#  元々あったt1が更新できたわけではなく、新しいタプルが作成されたということ
print('新しいt1のID', id(t1))

```
Newwave Solutions | 日本における仮想通貨の今後はどうなるでしょうか？

![10.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031688/0bbf08cf-2bee-58c1-cdd2-c3bb402b0844.jpeg)
この記事はウェブサイトから引用されました[Japantimes](https://www.japantimes.co.jp/news/2023/01/04/business/tech/japan-crypto-2022-review-regulation-future)

FTXの最近の崩壊は、世界の主要な仮想通貨取引所の1つであることから、世界中の政策立案者が業界に対するより厳しい規制を検討するよう促しました。日本では、この事件がデジャブを感じさせました。

2018年1月、東京に拠点を置く仮想通貨取引所コインチェックの大規模ハッキング事件が発生し、約580億円（現在の為替レートで4億4600万ドル）のデジタルトークンが盗まれ、厳しい規制を求める声が高まり、国の金融監視機関が国内取引所に対する包括的な取り締まりを開始するきっかけとなりました。

コインチェック事件の前、日本は仮想通貨の関連規制を他の主要国よりも先んじて設定し、ビットコインの大量取引量を楽しんでいたため、仮想通貨界での先進国と見なされていました。しかし、厳しい規制によってセクターに暗い影が投げかけられ、多数の取引所が規制基準に適合することに苦労していました。

FTXの崩壊を受けて、早期の兆候は、2018年の日本の正しい動きを示していると言えます。しかし、2022年の景気後退と国の厳しい規制の持続的な影響の中で、一部の与党議員は、仮想通貨技術に基づくWeb3ビジネスが成長の柱になるという賭けで、仮想経済をより大きく受け入れるように働きかけています。

ここでブロックチェーンサービスについてさらに調べてくだ[さい](https://newwave.vn/jp/services/emerging-technology/blockchain/)
ChatGPTに「herokuでDBを定期的に自動バックアップする方法」を聞いてみた

「herokuで自動でdbのスナップショットを取る方法を教えて」



Herokuでは、Heroku Postgresデータベースのスナップショットを自動的に取得する方法があります。以下はその手順です。

1、Herokuのダッシュボードにログインし、対象となるアプリケーションを選択します。
2、Resources（リソース）タブをクリックして、Heroku Postgresアドオンを見つけます。
3、Heroku Postgresアドオンをクリックして、対象となるデータベースを選択します。
4、Settings（設定）タブをクリックします。
5、Backups（バックアップ）セクションで、Automatic Backups（自動バックアップ）を有効にします。
6、Backup Retention（バックアップの保持期間）を設定します。この期間が過ぎると、古いバックアップは自動的に削除されます。
7、Optional Schedule（オプションのスケジュール）セクションで、バックアップを取得する頻度を設定します。一日に一度、毎週日曜日に、などといった具合に設定できます。
8、Save Changes（変更を保存）ボタンをクリックして、変更を保存します。

これで、Heroku Postgresデータベースのスナップショットが自動的に取得されるようになります。
取得されたスナップショットは、Herokuダッシュボードからダウンロードすることができます。また、Heroku CLIを使用して、スナップショットをローカルにダウンロードすることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145707/77b6ff36-56f4-bb33-6406-6b765786b4f7.png)




## heroku postgresがスタンダード以上じゃないと、バックアップはできない模様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145707/3b588047-771e-f7f1-9595-423b00ae01b2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145707/addd9ad1-4401-6eeb-c451-f8138c329749.png)
【bootstrap】hidden-smはもう動かない!最新版は〇〇を使え!スマホで表示しない方法

## はじめに
最近、bootstrapにハマってます。
クラスを書くだけで簡単にそこそこのデザインが作れちゃう。
Twitter様、ありがとうございます。

ところで、APIの件はどうなるんでしょうね....
有料化は嫌です。

## 閑話休題、hidden-smは動きません。
この前、レスポンシブサイトを作っていた時のこと。
レイアウトの関係で、スマホでは表示したくない```<div>```がありました。
調べてみると、どうやら```hidden-sm```をクラスに追加すれば良いとのこと。

コードに追加して、動かしてみるも何も変化なし。
CDNに変えてみたり、内部に書き込んでみたり、いろいろ試しましたが、変化はありませんでした。

## ```d-none d-sm-block```を使おう
どうやら、bootstrap4で```hidden-sm```は廃止されたようです。
代わりに使えるのが、
```
.d-none.d-sm-block
```
の二つのクラス。
これをつけることで、スマートフォンで表示しないようにできます。
なお、スマホのみ表示する場合は
```
.d-block.d-sm-none
```
らしいです。


終わり。
Notionについて調べたのでまとめます。

# はじめに
プログラミング初学者です。
家事育児の合間に勉強をしています。
まとめたものの、まだまだ知識不足なため、新たにインプットしたらまた付け足していきたいなと思っています。
よろしくお願いします！


# Notionとは
Notionとは、仕事で使えるアプリ。「オールインワンワークスペース」。
メモやタスク管理、ドキュメント管理、データベースなど仕事で使う様々なツールを1つにまとめたアプリ。

アメリカ・サンフランシスコ発。
近年、Notionを利用するユーザーが増えている様子。
2020年ユーザー数は400万人
2021年１月1000万人
その10ヶ月後には2000万人
日本市場でも同じようにユーザーが増えているようです。
2021年10月より日本語対応のベータ版が開始。
2022年11月には正式版をリリース。
東京などの都心部では、Notionの広告を見かけるようになったそうです。
（私の住む地域にはまだ無さそう。笑）

## 利用者数、なぜ増えた？
ユーザーがやりたいよう、使いやすいようカスタマイズすることができるため、ユーザーが増えていると考えられます。

## 特徴
先ほど、メモやタスク管理、ドキュメント管理、データベースなど様々なツールをまとめたアプリケーションとお話をしました。
特徴としては、カスタマイズ性に富んでおり、マルチに使えるデジタルな作業場所となる点です。
メモアプリにもなるし、プロジェクト管理ツールにもなる。

- ウェブ版
- デスクトップ版
- モバイル版

に対応しており、時間・場所に捉われずいつでも利用できるところもポイントです。



## 参考文献

https://www.sbbit.jp/article/cont1/100775

# 終わりに
面接をしていて、Notionというワードが出てきたことをきっかけに調べていました。
自分の知らない世界がまだまだあるなーと痛感。もっともっと勉強します！！

転職活動や家庭の用事で投稿が1週間空いてしまいました...
細々インプットしたことをこちらに投稿していこうと思います。今日はここまで。
コーディングスキルの向上法

エンジニアにとって、コーディングスキルを磨くことは最も重要な事柄のひとつですよね
。エンジニアはプログラムを書くことが中心的な活動であるため、
常にスキルを向上させることが必要です。
ただ、何かを作るにしてもどんなシステムやアプリを作成するか迷ってしまったり、
どうしても自分のできる範囲の内容に収まってしまうということもあるため、
この記事では、コーディングスキル向上のために使えるサービスを紹介したいと思います。


## オンラインジャッジメントサイト
プログラマー向けのオンラインジャッジサイトがいくつもあります。
プログラマーがコーディングスキルを磨くために利用でき、
コーディングテストやコンペティションなど、さまざまな問題を提供してくれています。

- Codewars
コーディングスキルを向上させるためのオンラインプラットフォームで、多数のプログラミング課題が用意されています。言語によって難易度が異なり、自分のレベルに合わせて練習できます。
https://www.codewars.com/

- HackerRank
企業が採用試験として利用することもあるオンラインプラットフォームで、多数のプログラミング課題が用意されています。コーディングスキルの他にも、アルゴリズムやデータ構造に関する問題もあります。
https://www.hackerrank.com/

- LeetCode
アルゴリズムやデータ構造に特化したオンラインプラットフォームで、多数の問題が用意されています。日本語にも対応しています。
https://leetcode.com/


各サイトごとの特徴は下記のようになります。

## LeetCode の特徴
主にアルゴリズムやデータ構造に関する問題が提供されています。問題は難易度別に分類されており、自分のレベルに合わせた問題を解くことができます。また、GoogleやAmazonなどの有名企業の面接に出題されるような問題もあるため、実際の面接に役立つことが期待できます。さらに、データ構造やアルゴリズムの理解を深めることができます。

## Codewars の特徴
プログラマーがスキルを磨くためのコミュニティベースのオンラインジャッジサイトです。問題は、1級から8級までの難易度に分かれており、自分のレベルに合わせて問題を選ぶことができます。プログラミング言語に関する問題が多く、Python、Java、C++など多くの言語に対応しています。また、ユーザーは自分の解答コードを他のユーザーにレビューしてもらうことができ、より良い解答方法を学ぶことができます。

## HackerRank の特徴
コーディングテストやコンペティション、企業のリクルーター向けのサービスなどを提供しているオンラインジャッジサイトです。企業向けには、採用プロセスを簡素化するための機能が提供されており、企業は自分たちの採用プロセスに合わせて問題を設定することができます。また、企業向けには、コードの自動採点やインタビューのスケジューリングなどの機能も提供されています。

## ジャッジサイトを利用することで得られること
以下のようなことが期待できるかなと思っています。

### コーディングスキルの向上
実際のコーディングテストやコンペティションに挑戦することで、問題解決能力を高めることができます。
アルゴリズムやデータ構造の理解の深化：問題は難易度別に分かれており、自分のレベルに合わせた問題を選ぶことができます。よって、自分のレベルに合わせた問題を解くことで、アルゴリズムやデータ構造の理解を深めることができます。

### コミュニティとの交流
「Codewars」では、他のユーザーに自分の解答コードをレビューしてもらうことができます。また、「HackerRank」では、企業向けのコンペティションなども提供されており、他のプログラマーと交流することができます。

### 実践的なコーディング経験
「HackerRank」では、企業の採用プロセスに合わせた問題も提供されており、実践的なコーディング経験を積むことができます。

以上で紹介したサービスは数多あるサービスの一部の例となります。
自分に合ったサービスを見つけて、コーディングスキル向上に努めましょう。
論文をDeepLに放り込むときに使いたいクイックアクション

※2023.3.16 よりよい方法を見つけたので加筆修正しました。

# おきもち

論文の一部をDeepLなどの翻訳サイトにコピペする際に、

1. 引用数字がテキストに混ざる
2. 変な改行が入る(特にChromeでPDFからコピーするとき)
2. 単語がハイフンで分割して改行されている

といったことがよく起こり、正しく翻訳されなかったり、文章丸ごとすっ飛ばされることがある。
→手作業で調整するのは面倒くさいので、正規表現で消したいな〜〜

ということでやりました。

# Automatorの設定

## ワークフローの設定

受け取る項目：テキスト
検索対象：すべてのアプリケーション
選択されたテキストを出力で置き換える：チェックを入れる
ワークフローの中身：「シェルスクリプトを実行」を左側のサイドメニューからドラッグ＆ドロップ

ワークフローの名前はそのまま使用時に選択する項目名になります。

## シェルスクリプトの設定

- シェル：`/usr/local/bin/python3`
- 入力の引き渡し：引数として

## シェルスクリプトのコード

```python
import re
import sys

# step 1
res = re.sub(r'([.,;:])\[?\d+\]?(?:[,-]\s?\[?\d+\]?)*\s?([A-Za-z])', r'\1\2', sys.argv[1].strip() + ' ')
# step 2
res = re.sub(r'-\s', '', res)
res = re.sub(r'([^,.])\n(.)', r'\1 \2', res)
print(res)
```

<details><summary>説明</summary>

### re.sub(*pattern*, *repl*, *text*)

*text* において *pattern* にマッチする文字列を *repl* に置換する

### Step 1

引用文献の参照を削除する。

- `This is a pen.1 That...`
- `This is a pen.[2] That...`
- `This is a pen.3,4 That...`
- `This is a pen.[5-6] That...`
- `This is a pen.7That...`

### Step 2

- 変な改行をなくす（単語と単語の間が改行のみの場合）
- 単語の分割を元に戻す（アルファベットとアルファベットの間がハイフンのみの場合）

</details>

# ショートカット設定

1. macのシステム設定→キーボード→キーボードショートカット
2. サービス→(クイックアクションの名前)→ショートカットを設定

# 使い方

1. テキストをコピーして、DeepLのアプリケーションの入力窓に貼り付ける。
1. 貼り付けたテキストを全選択→右クリック→「サービス」→ワークフローを選択
Webスクレイパーを作ろう #2

# Pythonを使ってWebスクレイパーを作る

この記事では，Pythonを使ってWebスクレイパーを作ることを目的としています．
今回は非同期通信のWebサイトでスクレイピングする際のやり方を説明します．

# 非同期通信の場合
非同期通信の場合には大きく分けて2つのやり方があります．

1. Seleniumを使う
2. 非同期通信の内容をスクレイピングする

Seleniumは環境の準備が大変なので，今回は非同期通信の中身を確認するやり方を説明します．

# 非同期通信とは?
Webサイトの通信の仕方には，同期通信と非同期通信の2種類があります．
同期通信は，リクエストを投げて，レスポンスを待って，返却されたHTMLを表示する方法です．
それに対して，非同期通信とは，リクエストを投げて，レスポンスを待たずに返却されたタイミングで表示する方法です．そのため，レスポンスが返却されていなくてもブラウザを操作することが可能です．

例として，twitterを見てみます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189046/19eaa48a-1c42-8c6e-237b-a8c81c788b41.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189046/a16437ba-2502-eede-6e1c-cb2237757431.png)

おすすめからトレンドに切り変えた際には，ページ全体を更新するのではなく，トレンドの内容のみを通信して，表示させています．

# 通信内容の確認方法

ブラウザを開きF12キーを押しネットワークの項目を確認するとどのような通信が発生しているのか確認できます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189046/4a3f7a7a-5888-cd74-de71-fc334ee5264f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189046/f7b0d560-861b-40ec-ee54-81352f13d7cc.png)

このサイトでは，画面をスクロールすると，非同期通信が行われ，HTMLが返却され，表示していることがわかります．
このリクエストでは，
https://cocooru.com/mutters?page=3
GETパラメーターでpageの値を設定し，取得しているので，
前回の記事のようにGETパラメータを設定したリクエストを送信すれば，HTMLが取得できます．

注意点としては，非同期通信の場合には，HTML以外が返却されることがあります．
例えば，JSONやプレーンテキストなど，返却されたデータをjavascriptなどで加工して表示する場合もあります．
どういったデータが返却されるのか確認することが重要です．
Power AutomateでTeamsメッセージの添付ファイルを取得する

Teamsメッセージには添付ファイルを含めることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/fc4dd577-d685-201b-f87a-f8db90bdf0ad.png)
このように表示されます。
このメッセージをPower Automateで分析する方法を考えてみます。

# トリガーで受け取る

[自動化したクラウドフロー]->[チャネルに新しいメッセージが追加されたとき]
または
[インスタントクラウドフロー]->[選択したメッセージに対して]
のいずれかでメッセージを受け取ります。今回は後者で取得します。
以下のようなフローを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/aa420809-95ad-4d3a-91da-34520866bf66.png)

このフローは、Teamsの「…」をクリックして実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/72dcae57-b607-68e4-aa48-9c96f8bbe432.png)

実行結果を見ると以下のようなデータになっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/3ec51818-c857-fe26-1c6e-922aa167e4b3.png)

なんとなく以下の部分が添付ファイルのように思えますが、attachment id に関する情報はこれしか含まれていません。

                   "Body": {
                        "ContentType": "text",
                        "Content": "今日もテスト<attachment id=\"b2acb6d0-2229-4856-a6d2-6d8b374d****\"></attachment>",
                        "PlainText": "今日もテスト<attachment id=\"b2acb6d0-2229-4856-a6d2-6d8b374d****\"></attachment>"
                    }

ということで詳細を取得してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/45227822-9149-5426-8df6-e32709b72ee5.png)
同じように出力結果を見てみると今度はattachments が含まれていました

        "attachments": [
            {
                "id": "b2acb6d0-2229-4856-a6d2-6d8b374d****",
                "contentType": "reference",
                "contentUrl": "https:/*****.sharepoint.com/sites/msteams_******/Shared Documents/General/OfficeScriptとは.pptx",
                "content": null,
                "name": "OfficeScriptとは.pptx",
                "thumbnailUrl": null
            }
        ],

この contentUrl が欲しいですよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/216182a2-7204-9161-15b1-7d63b2fc807a.png)
しかしcontentUrlらしきものが出てきません。このような場合、JSONデータの中身を直接参照してあげる必要があります。

以下のようにしてみます。

body('メッセージの詳細を取得する)?['attachments/contentUrl']

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/dc26701e-122a-1063-70ed-148bc0f59dbd.png)

これを実行するとエラーは出ませんが、文字列はEmpty（から）になります。attachmentsはアレイになっているので一度アレイ型変数に入れてから取り出してみましょう。

※「変数を初期化する」の値は body('メッセージ詳細を取得する')?['attachments']
※「文字列変数に追加」の値は items('Apply_to_Each')?['contentUrl']

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/98d9134b-eae2-66b2-4abd-b44b8a239283.png)

今度は値が取れています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/80ca1218-c025-d689-e1ad-edc30125d2cb.png)


# まとめ

ポップアップで自動的に取得できない属性がありますが、item()?[//ここの値を自分で式に追加//] することで取得できます。一度テスト実行してJSONの中身を確認することができます。もし配列になっているようであれば、一度アレイ変数に代入してから参照するとよいでしょう。
Newwave Solutions | メタバースでお金を稼ぐには？


「メタバース」という流行語は聞き覚えがありますが、あなたはそれが何であるかを明確に理解していますか? それは間違いなく、人々が互いに交流する方法において大きな飛躍となるでしょう。

Facebook のグループが新しい名前のMetaにブランドを変更したり、Microsoftが積極的にメタバースに参入したりするように、巨大なテクノロジー企業はメタバースに賭けています。 世界の半分は、今後の「メタバース」に注目するような気がします。 今日はニューウェーブ・ソリューションズと一緒に近年メタバースがもてはやされている理由を発見してみましょう。

メタバースとは何か、なぜ気にするのか？
メタバースとは何か、なぜ気にするのか

1. メタバースのコンセプト
「メタバース」とは、インターネットの次の進化として期待されています。オンライン・コミュニティだけでなく、ゲーム・プラットフォームやデジタル・アイデンティティなど、生活の他の側面にも影響を及ぼします。簡単に言うと、メタバースは社会的なつながりに焦点を当てた共有仮想空間です。

メタバースでどんなアクティビティができるのか気になりませんか？ここでは、仮想世界でできるアクションをいくつか見てみましょう。

    他人との出会い、交流
    カスタマイズ可能なアバターで自分を表現
    リモートワーク
    商品を購入
    コンサートや社交行事に参加
    VR（バーチャルリアリティ）ゲームをプレイ
    不動産の購入
メタバースで多くの活動を行うことができることは明らかであり、企業にも多くのマーケティングおよびブランディングの機会があります。

2. メタバースを構成する要素とは?
メタバースの構成要素

メタバースの目標は、物理的な現実を超えるかもしれない拡張現実体験を作り出すことです。メタバースはきっと、すべてのユーザーにとって一貫性のある生きた体験をリアルタイムで確実に提供します。では、メタバースを構成する核となる要素にはどのようなものがあるのでしょうか。これらの要素はそれぞれ、メタバースにおいて重要な役割を果たし、互いに補完し合うことになります。

    デジタル通貨
    マーケットプレイス
  非代替性トークン (NFTs): ユニークな仮想キャラクターを使用して、イベントに参加したり、メタバースで買い物をしたりできますが、これらの活動は無料ではない場合があります。お金を使用する代わりに、デジタルオブジェクトに価値を帰属させ、オブジェクトの所有者を確認するためにNFTが使用されます。
    ゲーム
    社交イベント
    オンラインショッピング
    ワークプレイス
    ソーシャルメディア
    デジタル資産
メタバースでお金を稼ぐには？
大企業はメタバースに大きく賭けています。メタバースは仮想現実、拡張現実、ブロックチェーンの組み合わせたものですが、この3D仮想世界でどのようにお金を稼ぐことができるのでしょうか? 利益を上げるためのいくつかの方法の詳細については、以下をお読みください。

    遊んで稼ぐゲーム：このように、ユーザーは暗号の報酬を受け取ることができます。
    仮想の衣服やアクセサリーを作ること：ユーザーは自分のアバターをアクセサリーや衣服で美しくしたいと考えており、あなたはそれらのアイテムをデザインし、マーケットプレイスで販売する人になるかもしれません。
    会場のオープン：なぜ駄目なのですか？メタバース体験で特別なイベントのチケットを販売することができます。
    大家さんになること： 土地区画を購入し、後でより高い価格で販売することはとても簡単ではないでしょうか。
    NFTsのトレード： 3D NFTを完全に取引してお金を稼ぐことができます。
記事の詳細については、Newwave Solutionsの公式ウェブサイトをご覧ください。https://newwave.vn/jp/blog/blockchain-jp/%e3%83%a1%e3%82%bf%e3%83%90%e3%83%bc%e3%82%b9-%e4%bb%95%e7%b5%84%e3%81%bf%e3%81%ae%e7%b0%a1%e5%8d%98%e3%81%aa%e6%a6%82%e8%a6%81/
AWSでMFAが複数登録できるようになり自身でMFAを管理するポリシーがどう変わるか

以前、AWSでMFAを自身で管理できるIAMポリシーについての記事を投稿しました。

[AWSでMFAを自身で管理できるポリシーを作成してみる](https://qiita.com/SAITO_Keita/items/9339c75bc3ba1596e9b2)

その後、2022年11月にAWSでIAMユーザとルートユーザーに複数のMFAを割り当てるアップデートが発表されました。

[AWS Identity and Access Management で複数の多要素認証 (MFA) デバイスのサポートを開始](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/aws-identity-access-management-multi-factor-authentication-devices/)

このアップデートに伴い、MFAを自身で管理するIAMポリシーについても追加で考慮する事項が発生しているので紹介します。

## ドキュメント

- [IAM: IAM ユーザーに MFA デバイスの自己管理を許可する](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_iam_mfa-selfmanage.html)

MFAを自己管理するIAMポリシーについては、上記にドキュメントがあります。
英語版については、2022年12月に更新されてしばらくの間、日本語版が古い版の翻訳の状態となっていましたが。

2023年2月現在は、英語版と日本語版のIAMポリシーの記述は同一のものとなっています。

## 以前のポリシーだと何が問題になるのか

複数のMFAデバイスを割り当てられるアップデートが来たことで、今まではユーザー名固定で作成されていたMFAデバイス名が、任意入力に変更となりました。

セキュリティ認証情報からMFAを登録する場合は、下記のデバイス名を入力するステップが追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/2c487435-2294-edc4-e57f-8384ff9905b8.png)

MFAデバイス名が変更になると、IAMポリシーで定義しているリソースのARNが変わります。

以前のドキュメントに記載されていたポリシーでは、MFAデバイス名がユーザー名で作成される事を前提として、リソース制限を`"arn:aws:iam::*:mfa/${aws:username}"`といった形でユーザー名指定で記述していたため。

このリソース制限を入れていた場合は、複数のデバイスをMFA登録する事ができず。
また、登録時もユーザー名を入れて登録しないとエラーとなります。

下記はhogeというIAMユーザーがfoobarというデバイス名でMFAデバイスを登録しようとしてエラーになった図。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/39b52ac6-e998-9383-37ed-1e5a8f5c4d23.png)

`User: arn:aws:iam::xxxxxxxxxxxx:user/hoge is not authorized to perform: iam:CreateVirtualMFADevice on resource: arn:aws:iam::xxxxxxxxxxxx:mfa/foobar because no identity-based policy allows the iam:CreateVirtualMFADevice action`

## ドキュメントはどう変わったのか

[Periodic update - 12/30/22-05:08pm PST doc_source/reference_policies_examples_iam_mfa-selfmanage.md](https://github.com/awsdocs/iam-user-guide/commit/149cf97fe14b7e6d388636b7b387b3149232e7b5#diff-f1dd4db411bf6ca5158a7fe655e88df8307d650882e61c70be514f1525d9faac)

上記のタイミングで、下記2点の変更がはいっています。

1. `iam:CreateVirtualMFADevice`のリソース設定が`arn:aws:iam::*:mfa/${aws:username}`から`"arn:aws:iam::*:mfa/*"`に変更。
1. `iam:DeleteVirtualMFADevice`が削除。

これは、任意のデバイス名を登録できるようにするため、リソース名の制限を撤廃しつつ。

MFAデバイスの削除について。以前は `ユーザー名`＝`デバイス名`　といった仕様があったので、自分と同名のデバイス名は自分が登録したものとして削除できるようにしていたが。
仕様変更にともない、任意のデバイス名が登録できるようになったため、MFAデバイスの削除権限については自己管理のポリシーからは削除された形になります。
（MFAデバイスを削除する必要が出た場合は、自身ではできなくて別途管理者が削除する対応が必要）

## 対応方針について

1. IAMポリシーは変更せずに、MFAデバイスを登録する時はユーザー名で登録する運用にする。（MFAの複数登録はできない）
1. ドキュメントにあるようにIAMポリシーを変更して、MFAデバイスの削除は自身では削除できないようにする。（MFA登録の複数登録はできる）

既存を変更するか、ドキュメントの変更に追随すう場合は上記の対応になるかと思いますが。

他にも、リソース許可を`arn:aws:iam::*:mfa/${aws:username}*`としてデバイス名のprefixにユーザ名をいれる運用にすることで、複数MFAを登録しつつ、デバイスの削除も可能にする方法もあります。

ユーザー管理の部分に絡む事象となるため、既存権限を変更する場合は十分に検証してから変更して下さい。

## 総評

今回はAWSのアップデートに伴い、既存IAMポリシーが影響をうけるパターンになります。

MFAが複数登録できるようになると発表された当時。新しい機能追加がきたのか　としか思い至りませんでしたが、よくよく考えると既存に影響ありなパターンでした。
OIDCトークンを使用する

# 背景
CircleCIを使用している・していたプロジェクトで、シークレットのローテーションの対応が呼びかけられた。

https://circleci.com/ja/blog/january-4-2023-security-alert/

---

CI/CDには、`Github Actions`を使用していたが、IAMユーザーを払い出して`SecretKey`・`SecretKeyID`をGithubに保存して使用していればいつかは同じインシデントに遭遇するかもしれない。。。

---

# 対策

CircleCIのブログの「セキュリティのベストプラクティス」でも挙げられている内のひとつにOIDCトークンを使用する方法がある。

https://circleci.com/ja/blog/jan-4-2023-incident-report/

---

以下抜粋
![スクリーンショット 2023-02-27 12.32.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183059/f8479e86-1926-f260-c27b-046b3a5c714f.png)

---
# やること

1. CicleCIでのOIDCを使用する方法は下記
https://circleci.com/docs/ja/openid-connect-tokens/

2. Github ActionsであればRoleARNを用いる方法があり、下記を参考
https://dev.classmethod.jp/articles/github-actions-aws-sts-credentials-iamrole/

---

# 参考

- [CircleCIブログ](https://circleci.com/ja/blog/)
- [CircleCI OIDCトークン](https://circleci.com/docs/ja/openid-connect-tokens/)
- [GitHub ActionsにAWSクレデンシャルを直接設定したくないのでIAMロールを利用したい](https://dev.classmethod.jp/articles/github-actions-aws-sts-credentials-iamrole/)