OmniAICreator/Qiita-1.07M huggingface dataset:
ChatGPTの活用事例集【備忘録】

# 目次
[業務](#業務)
[ゲーム](#ゲーム)
[教育](#教育)
[開発](#開発)
[Webブラウザ](#Webブラウザ)
[企業](#企業)

# 業務

### 仕事全般
質問するのではなく、作業をChatGPTに任せるような文章を与えてあげること。
可能性空間を狭めることが肝心。
https://www.youtube.com/watch?v=ReoJcerYtuI

ChatGPTを使いこなすテンプレ

```html
# 命令書：
あなたは、プロの編集者です。
以下の制約条件と入力文をもとに、最高の要約を出力してください。

# 制約条件：
・文字数は300文字程度
・小学生にもわかりやすく
・重要なキーワードを取り残さない
・文章を簡潔に

# 入力文：
<ここに入力文章>

# 出力文：
```

```html
あなたはプロのマーケターです。商品企画で悩んでいます。私のかわりに企画してください。
このタスクで最高の結果を出すために、もっと情報が必要な場合は、どんどん質問をしてください。
```

### リサーチ
https://twitter.com/seimeitsuzaki/status/1617802107779964928?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1617802107779964928%7Ctwgr%5E35e3c9c812616acec8fbbe3ea6f04895115c10ab%7Ctwcon%5Es1_c10&ref_url=https%3A%2F%2Fsaasis.jp%2F2023%2F02%2F15%2Fsnse381a7e38390e382bae381a3e3819fchat-gpte381aee383a4e38390e38184e4bdbfe38184e696b9efbc91efbc90e981b8%2F

# ゲーム
### しりとり
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526938/b38b5146-af9f-495f-abbc-7f8c2f9e6ad8.png">


# 教育
### プログラミング学習
https://qiita.com/tak001/items/7605f0be7b424118e5a5

# 開発
### 生産性向上
https://qiita.com/gwanryong/items/fdf7839b80f2f53473fd

### Webサイト作ってくれる
https://twitter.com/satoshi_gfa18/status/1623805980843573257?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1623805980843573257%7Ctwgr%5E35e3c9c812616acec8fbbe3ea6f04895115c10ab%7Ctwcon%5Es1_c10&ref_url=https%3A%2F%2Fsaasis.jp%2F2023%2F02%2F15%2Fsnse381a7e38390e382bae381a3e3819fchat-gpte381aee383a4e38390e38184e4bdbfe38184e696b9efbc91efbc90e981b8%2F

# Webブラウザ
https://twitter.com/Yamkaz/status/1625290076401057792?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1625290076401057792%7Ctwgr%5E35e3c9c812616acec8fbbe3ea6f04895115c10ab%7Ctwcon%5Es1_c10&ref_url=https%3A%2F%2Fsaasis.jp%2F2023%2F02%2F15%2Fsnse381a7e38390e382bae381a3e3819fchat-gpte381aee383a4e38390e38184e4bdbfe38184e696b9efbc91efbc90e981b8%2F

# 企業
### <a href="https://yoom.co.jp/news/rKTR2SK_">Yooｍ株式会社</a>
①メールからのテキスト抽出
受信メールから自動的に名前や企業名、メールアドレス、部門情報などを抽出し、データベースに格納します。

②口コミのネガティブ・ポジティブ判断
ユーザーからの口コミのリストに対して、ネガティブな口コミかポジティブな口コミかを判断し、自動的にラベリングします。

③商品説明の作成
商品リストに対して自動的に商品説明文を作成します。

④議事録の要約
会議の議事録を自動的に要約し、チャットツールなどに送信します。

### <a href="https://tsunagu-inc.jp/2023/01/30/chatgpt/">株式会社つなぐ</a>
「ChatGPT」を活用し、WordPressの記事・タイトルの作成から投稿までを自動で行うツールの開発に成功いたしました。

### <a href="https://prtimes.jp/main/html/rd/p/000000167.000017890.html">note株式会社</a>
文章レビュー、要約、導入文作成の3つの機能

### <a href="https://prtimes.jp/main/html/rd/p/000000043.000019803.html">チャットプラス</a>
一般的な質問への回答は、人手によるQ&Aの事前準備なしにAIにより自動回答できるようになりました。

### <a href="https://prtimes.jp/main/html/rd/p/000000001.000116340.html">Speakeasy Labs, Inc.</a>
「スピーク」は、「ChatGPT（チャットGPT）」の開発で知られている「OpenAI」とのパートナーシップを活かし、「OpenAI」のAI技術と「Speakeasy」が独自に開発した自動音声認識技術及び、英語学習ノウハウを組み合わせることにより、対人型英会話同様のスピーキング学習をAIを相手に行えることを可能としました。
title: AZ-900: 英語試験合格に向けた学習方法のまとめ

先月末(2023/2/22)、AZ-900を英語で受講し合格してまいりました。

私が取り組んだ勉強方法をまとめておきますので、同じく英語でのAZ-900の受験・合格を目指している方の参考になれば幸いです。
ちなみに英語の勉強の仕方などは書いていません。

### 日本語で受講予定の方
日本語でAZ-900を受講される予定の方は、是非こちらを参考にしてみてください。
私のこの投稿とは違い、勉強方法だけではなく勉強内容のまとめもされていますよ！：

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8

## 勉強の期間
　大きく分けて３つのフェーズに分けて勉強に取り組みました。

**【phase 1】**
ゆる勉強 (2022/12)
[Qiita投稿編](#phase1)

**【phase 2】**
ゆる勉強 (2023/1~2月前半)
[Udemyの口座流し見編](#phase2)

**【phase 3】**
がっつり勉強 - (ラスト一週間)
[模擬試験反復](#phase3)

（忙しい方は、こちらさえ確認いただければ事足ります。）
記事の最後に、勉強に使用した[Udemyの講座（模擬試験含む）](#courses)を記載しています。

<a id="phase1"></a>
## Qiita投稿編
こちらでは、AZ-900の試験範囲に該当するMS-Learnの項目を呼んだものをまとめて、Qiitaに投稿するといった形で勉強を行っていました。以下の理由で途中で辞めています💧
* 私が技術の外部配信に慣れておらず記事を書く事に精一杯になってしまい、記事を書く事がメインになってしまっていた
* 社内の研修のラストスパートに入りそちらに全振りをかましていた為、単純に余裕を失っていた

**良かった点**
* インフラの知識に精通している方にご指摘などを頂き、そこの点に関して良い感じに頭に入った。

これはたまたま私の周りに優しい方がいらっしゃって運が良かったからこそ得られた利点だと思っています。
（その節は本当にありがとうございました！）

**この勉強法が合いそうな人**
* 自分で勉強した内容をノートにまとめることで定着するタイプの人
* 記事を書く事に慣れており、執筆自体が労力のメインにならない人


<a id="phase2"></a>
## Udemyの口座流し見編
こちらでは、Udemyで購入した講座の動画をひたすら観るといった勉強を行っていました。

**（個人的に）良かった点**
* 調子が良い時に閲覧した範囲は良い感じに定着する
* 気軽な気持ちで始められる
* 家事をしながら勉強に取り組める
* 理解０の状態から１までに持っていくには良かったかも。

**（個人的に）良くなかった点**
* 途中から、動画を全部見終える事がゴールになってしまい、あまり頭に入ってこなくなった
* 動画を観ることに飽きが来て、頭に入ってこなくなる
* ながら勉をしてしまい、頭に入ってこなくなる
* 結構時間を費やした割に定着率が低かった気がする

**この勉強法が合いそうな人**
* 資料などを使って説明してくれる人の動画を観ることで、定着するタイプの人
* ひたすら動画を観て飽きない&集中を保つことが出来頭に入ってくる人


<a id="phase3"></a>
## 模擬試験反復
こちらでは、Udemyの講座に入っていた模擬試験をひたすら解くといった勉強法を行っていました。

私は定着した知識の8割をこのフェーズで得ました。

テストに出る範囲が予想されて作られている問題集である（はず）ため、勉強範囲の絞り込みがある状態で行える勉強法ですね。一番効率が良く勉強出来たんじゃないかと思います。

### 具体的な勉強法
**【step1】** とりあえず解く
**【step2】** 間違えた個所を確認。
**【step3】** 間違えた個所は、腑に落ちるまで調べて理解を深める
**【step4】** step1 に戻る

もうぶっちゃけこれさえすれば、同じ点数で受かっていたなと思いました。

<a id="courses"></a>
# 勉強に使用したUdemy講座
動画閲覧・模擬試験反復練習で使用したUdemyの講座を紹介いたします。

https://www.udemy.com/share/104Elm3@NRvoBV3hfKBP-VWqxo8DOWnbYw8XLVxWjdYT_LI7k3jE_NRNr77Fyqc820fOsEqkgg==/

https://www.udemy.com/share/101ZTY3@dMOeI6107zJY2OCkEG8wSfJ2Y7i6db9zV0fv9TvuL2lMDtSC09hibYuQZ6pVAJsCbA==/

https://www.udemy.com/share/105ZTS3@CTnafQKm2mnRf3nZa2A0VfRX4Y4D4bHGacEaMw_CHXJfyC4w_4KkB9SXv0eaKC1Ifw==/
DAppsを作成するための最も一般的なプラットフォームとEthereumの主な使用方法

はじめに

分散型アプリケーションは、開発者のイノベーションと創造性により、長年にわたって大きく進化してきました。

このブログでは、分散型アプリケーション（DApps）とは何か、そしてDAppsを作成するための最も一般的なプラットフォームについて説明します。

<h2>分散型アプリ（DApps）とは？

分散型アプリとは、Blockchainをベースとしたデジタルアプリケーションやプログラムで、通常のアプリケーションとは根本的に異なるものです。DApps は、所有する企業に属する集中型サーバー上で動作する通常のアプリケーションとは異なり、ブロックチェーンに基づく分散型ピアツーピア (P2P) ネットワーク上で動作します。

<h2>DAppsを作成するための最も一般的なプラットフォーム</h2>

<h3>イーサリアム</h3>

Ethereumは現在世界で最も人気のある分散型オープンソースブロックチェーンです。2500以上のDAppsを含む多くのブロックチェーンプロジェクトのベースとして使用されています。実際、イーサリアムはその市場価値において、ビットコインに次ぐ存在です。また、イーサリアムには、ビットコインのバージョンであるBTHとして知られるネイティブ暗号通貨があります。全体として、これは少し高価ですが、dAppを作成するための優れた選択肢です。

<h3>NEO（ネオ）</h3>。
NEOもスマートエコノミーを目指す分散型オープンソースブロックチェーンです。中国のイーサリアムとも呼ばれ、他のブロックチェーンプラットフォームと比較して、DAppsのスケーラビリティに優れたオプションを提供しています。NEOは現在、Ethereumよりも人気がなく、この技術を使用して構築されたDAppsは約100に過ぎません。また、かなり高価であり、場合によってはイーサリアムよりも高い手数料を請求することさえあります。

<h3>トロン（TRON）</h3>
TRONは、EthereumやNEOと比べると比較的新しいBlockchainプラットフォームである。しかし、かなり人気があり、将来的にはイーサリアムの競合になる可能性さえあります。TRONは、特にゲームアプリやギャンブルサイトで有名です。このプラットフォームを使って作られたDAppsは約1500もあり、優れた選択肢となっています。

<h2>イーサリアムの主な用途は</h2>？

<h3>NFT</h3>のご紹介です。
NFT（non-fungible token）とは、ブロックチェーン上に保存されたユニークなデジタルアイテムです。OpenSeaは、イーサリアムのブロックチェーン上でNFTを鋳造することも、互換性のある暗号ウォレットでNFTを購入することもサポートしています。NFTはほとんど何でも表現することができます。イーサリアムのブロックチェーンは、所有権のデジタル記録として機能します。

<h3>DAOs（ダオ）</h3>について
DAO（Decentralized Autonomous Organization）とは、唯一のリーダーシップを持たない組織です。その代わり、組織を構成するユーザーのグループによって統治されます。多くの場合、DAO内のユーザーが提案書を作成し、それを投票することで変更を実現します。DAOは、ユーザーがメンバーシップを証明し、投票することを可能にするトークンを使用します。DAOは、慈善事業からビジネス・ネットワーキング、教育まで、さまざまな目的を持つことができます。

<h3>DeFi（デファイ）</h3>。
Decentralized Financeは、しばしば単に「DeFi」と短縮され、ブロックチェーン技術上で動作するすべての金融サービスを説明するために使用される用語です。一般的なサービスには、利子の獲得、借り入れ、貸し出し、取引などが含まれます。DeFiは、信頼性が高く、許可不要で、高速な取引を可能にします。

まとめ

このブログでは、DAppsを作成するための最も一般的なプラットフォームとEthereumの主な使用方法を紹介しました。ブロックチェーン技術が主流になるにつれて、より多くのDAppsの必要性が高まっていくでしょう。

DAppsについてもっと知りたい方は、このコンテンツをお読みください。

https://miichisoft.com/what-is-DApps-understand-distributed-applications-intrinsically/

Website: https://miichisoft.com/
macのターミナルで.MOVファイルを.mp4に変換する方法

はじめに
-

iPhoneで撮影した動画をmacに取り込むとmac用の動画ファイル形式である.movファイルになるようです。
それをWindowsで再生できるようにするため、macOSのTerminal（ターミナル）で.mp4ファイルに変換する方法について記載します。
尚、下記の記事を参考にしており使ったコマンドはほとんど同じですが、私の環境で実施したところ一つエラーが発生したため、この投稿では当該エラーの対処方法にも触れます。
https://note.com/dr_kano/n/n5d45ab31f808

試した環境
-
macOS Ventura 13.2
Homebrewインストール済み（インストール必須）


手順
-
・macのターミナルでHomebrewがインストールされていることを確認
> brew --version 

私の環境ではHomebrew 3.0.5が入っており、インストール済みであることが確認できました。

・動画ファイル変換ツールであるffmpegをインストール
> brew install ffmpeg

この時下記のエラーが発生しました。書き込み権限不足のようです。
（尚、再度Homebrewのバージョン確認コマンドを実行したところ、このタイミングで4.0.4にバージョンアップされていました。）
> Error: The following directories are not writable by your user: /usr/local/share/man/man8


・ディレクトリ所有者をログイン中のユーザーに変更、書き込み権限付与
> sudo chown -R $(whoami) /usr/local/share/man/man8
chmod u+w /usr/local/share/man/man8

・再度ffmpegインストールコマンドを実行
> brew install ffmpeg

➡︎今度はffmpegのインストールが完了しました。

・.MOVファイルから.mp4ファイルに変換
> ffmpeg -i sample.MOV sample.mp4

➡︎変換後のファイルであるsample.mp4をWindows10端末で無事再生できることが確認できました。
また変換したいファイルの数が多かったため、上記以外のファイルはスクリプト化（ファイル名:changeFile）してまとめて変換しました。
> chmod 744 changeFile
./changeFile

※changeFileの内容（プログラミングに慣れるためfor文でループさせれば良かった・・・）
> ffmpeg -i sample02.MOV sample02.mp4
ffmpeg -i sample03.MOV sample03.mp4
ffmpeg -i sample04.MOV sample04.mp4
   ・
   ・
   ・


あとがき
-
今回も簡単な手順の紹介でしたが、これからも役に立ちそうな記事を投稿していこうと思います。
読んでいただけるだけでありがたいですが、ナレッジシェアのモチベーションアップのためにも
いいねやコメント・質問等いただけると更に励みになります。

引き続きよろしくお願いします。
rails7でherokuでrailsコマンドを動かす。（sitemapの自動更新）heroku scheduler

# やりたいこと
sitemap generatorのリフレッシュを、日本時間のAM4時に毎日自動で動かす。

# 設定
サイトマップの設定は下記。

https://hataworakuni.net/rails-sitemap

gem wheneverのところで動かなかった
＆
なるべく依存するgemを増やしたくない
ので、heroku schedulerを使って実行する方針へ変更。

heroku schedulerをインストールして下記のように設定。
登録したコマンド→ `rails sitemap:refresh`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145707/f24b8e75-c9d2-88bb-c640-ff777de54187.png)

時間は下記サイトを参考。（画像では日本時間の朝4時を狙っている。herokuで設定できるUTCと9時間の時差がある）

https://www.jisakeisan.com/?y=2023&m=3&d=7&hh=4&mm=0&t1=jst&t2=utc

# 事前確認：ターミナルからheroku loginして手動実行できること

問題なく成功。
```
$ heroku run rails sitemap:refresh -a narou-susume2
Running rails sitemap:refresh on ⬢ narou-susume2... up, run.3661 (Basic)
In '/app/public/':
+ sitemap.xml.gz                                           3 links /  357 Bytes
Sitemap stats: 3 links / 1 sitemaps / 0m00s

Pinging with URL 'https://narou-osusume.com/sitemap.xml.gz':
  Successful ping of Google
```

# 明日追記
動くか確認し、結果を明日追記する。（現在3/7）
以下コマンドで実行ログを確認できるっぽい。

```
$ heroku logs --app アプリ名
```

https://reasonable-code.com/heroku-cron/

# 3/8追記　問題なく動いていた。
サーチコンソールで最終読み込み日時が`3/7→3/8`に更新されていることを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145707/ca285e4e-7b18-f646-d1ba-d8ec46ae48f7.png)
swiper.jsとline-clampとiOSで沼った話

# 0. はじめに
- `-webkit-line-clamp` がiOSのSafariだけ効かない問題の解決方法になります
- line-clampが効かない原因はいくつかネットに上がっていますが、今回の原因は `swiper.js` と iOSの `Safari` に起因するものでした
- HTMLとcssの動きを説明しながら、解決方法を記載したいと思います

# 1. やりたかったこと
- 文章が4行以上になった場合、3行に表示行数を制限する
- 最後の文字は「･･･」に置き換える

# 2. 問題発生
- スマホ版のみの対応だったため、AndroidとiOSで動作確認しました
- Androidは期待値通りの表示がされていることを確認
- しかし、iOSの実機で動作確認してみると、 `swiper.js` を使っているところだけ、表示行数が制限されていなかったのです

上記の問題は、更新ボタンを押すと表示行数の制限がされる事象も同時に発生していました
この問題は他でも取り上げられていました(参考記事3)

# 3. 原因
- DOMの変更後はスタイルの再計算等が行われ、CSSが適用される**はず**です
- 今回のiOSのSafariではCSSは適用されなかったため、`swiper.js` と iOSのSafari と `-webkit-line-clamp` の相性が良くなかったことが原因となります(違ったらごめんなさい)

# 4. 解決方法
- できないで終わるのはダサいので、**更新ボタンを押すと表示行数が制限される**ところに注目して、解決方法を考えます

## 4.1. ブラウザの再描画について
ブラウザの再描画は、基本的には、**DOM, HTML, CSSの仕様に準拠する範囲で不要な処理をしない**の積み重ねになります
大まかなフローは下記の通りです
1. DOM変更
1. スタイル計算
1. レイアウト
1. ペイント
1. コンポジション

DOM変更を行えば再描画が発生し、CSSが適用され表示行数が制限されるはずです

## 4.2. DOM変更
- 表示行数を制限したい要素のクラス名を削除・追加することでDOM変更し、強制的に再描画フローを発生させます
- jQueryによるサンプルコード
  ``` css
  $(window).on('load', function() {
    var description = $('.description .line-clamp3');
    description.removeClass('.line-clamp3');
    description.addClass('.line-clamp3');
  });
  ```
- 注意：jQueryの `ready` では、まだ描画が完了していないため、描画完了後の `load` で処理を実行してください

# 参考記事
1. [CSS : 「line-clamp」 で表示行数を制御する](https://qiita.com/KazuyoshiGoto/items/4f88e87bb12ff38d1c4e)
1. [slickスライダー内の文字の行数が更新ボタンを押した時だけ制御できなくなる](https://teratail.com/questions/309815)
1. [DOMが書き換わった後ブラウザはどのように再描画していますか？](https://ja.stackoverflow.com/questions/52215/dom%E3%81%8C%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%82%8F%E3%81%A3%E3%81%9F%E5%BE%8C%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%86%8D%E6%8F%8F%E7%94%BB%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8B)
1. [【jQuery】処理実行タイミング $(document).readyと$(window).load](https://qiita.com/katsunory/items/3ba4683629333b94b2be)
Javaを基本からまとめてみた【オブジェクトの使い方】

## オブジェクトの使い方


①オブジェクトを生成する


```
クラス名　オブジェクト名 = new クラス名();
例)
Student stu1 = new Student();
//newを使うとStudentクラスから作ったオブジェクトのメモリ領域を確保してくれる
```

| Student |
| :---: | 
| name : String <br> engScore : int <br> mathScore : int |  
| display() : void <br> setScore(int, int) : void <br> setAvg() : double|  

##### プログラムにおいてオブジェクトを作ることを『インスタンス化』という
##### プログラムの中で実際にできたオブジェクトを『インスタンス』という

②変数・メソッドを利用する

```
オブジェクト名.変数名
オブジェクト名.メソッド名(引数)
例)
stu1.name = "Michael ";
stu1.setScore = (80,92);
```
```Sample.java
public class StuSample {
	public static void main(String[] args) {
		Student stu1 = new Student();
		stu1.name = "Michael ";
		stu1.setScore = (80,92);

	　　 stu1.display ();
		System.out.println("平均" + stu1.getAvg() + "点");
	}
}
```


## 参考サイト
[インスタンス化の方法とメモリ内部の動きを解説！【Java入門講座】3-3 オブジェクトの使い方](https://www.youtube.com/watch?v=HalozHg1LMM)
Proxmox 7.3 セットアップメモ

## apt updateでエラーになる件の対応

[SOLVED] - Update Unauthorized, after latest update. | Proxmox Support Forum

* https://forum.proxmox.com/threads/update-unauthorized-after-latest-update.61584/

```diff
- deb https://enterprise.proxmox.com/debian/pve bullseye pve-enterprise

+ deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription
```


## /etc/network/interfaces の書き方が変わった

```
# network interface settings; autogenerated
# Please do NOT modify this file directly, unless you know what
# you're doing.
#
# If you want to manage parts of the network configuration manually,
# please utilize the 'source' or 'source-directory' directives to do
# so.
# PVE will preserve these directives, but will NOT read its network
# configuration from sourced files, so do not attempt to move any of
# the PVE managed interfaces into external files!

auto lo
iface lo inet loopback

auto eno1
iface eno1 inet manual

auto enp2s0
iface enp2s0 inet manual

auto enx000000000000
iface enx000000000000 inet manual

auto enx000000000001
iface enx000000000001 inet manual

auto bond0
iface bond0 inet manual
	bond-slaves enx000000000000 enx000000000001
	bond-miimon 100
	bond-mode active-backup
	bond-primary enx000000000000

auto bond1
iface bond1 inet manual
	bond-slaves eno1 enp2s0
	bond-miimon 100
	bond-mode active-backup
	bond-primary eno1

auto vmbr0
iface vmbr0 inet static
	address 192.168.20.22/24
	gateway 192.168.20.1
	bridge-ports bond0
	bridge-stp off
	bridge-fd 0

auto vmbr1
iface vmbr1 inet static
	address 192.168.0.22/24
	bridge-ports bond1
	bridge-stp off
	bridge-fd 0
```

## proxmox backup serverへの接続が出来ない

> create storage failed: pbs-xxxx: Cannot find datastore 'backup', check permissions and existence! (500)

* https://forum.proxmox.com/threads/pbs-error-fetching-datastores-401-unauthorized-500.83419/
Path & Workspaces


+ [Path & Workspaces](https://trailhead.salesforce.com/content/learn/modules/sales_admin_optimize_salesforce_for_selling)

+ [please help me in completing futhure steps in the task](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000O8fMx)

:::note
None of the solutions worked for me untill, I created a new Playground. On the New Trailhead playground I was able to find New Event (composer) under Activity.

Step I followed such as:

1) click on Gear and select Setup

2) Go to App launcher enter sales

3) select lead tab

4) click new to create LEAD

enter below details:

First Name: Shelley

+ Last Name: Major
+ Company: Major Components
+ leave everything as default 

Click save

5) Under Activity you will find Log call, New Task, New Event, Email

6) Click new task and enter below details:

Subject: Marketing Materials
Status: Not Started
Click Save

7) Click New Event and enter below details:

+ Subject: Solar Webinar
+ Start Date: any date in the future
+ End Date: any date and time after the start date and time

Click save

8) Click mark status as complete botton
:::
RDS/Aurora の failover をまとめる

# RDS

📝 Primary, Read replica A, read replica B のそれぞれが異なるhost名を持つ。

## Multi AZ 構成の場合、

- RTO = ~35 sec (by promoting standby to master)
- RPO = 1sec (sync copy)
- automatic failover (No manual operations)
- No hostname change



## 非 Multi AZ 構成の場合、

- RTO = a few minutes (Promote read replica to master. Rebooting is required.)
- RPO = 1−2 min (async copy)
- Manual failover in AWS console. (Promote read replica to master.)
- Hostname changes (Use read replica’s hostname as the primary.)


ref.
- https://dev.classmethod.jp/articles/amazon-rds-read-replica-master-promote/#toc-6

## グローバル構成について
cross region reader replication を有効化する。primary region が落ちた場合は、`非 Multi AZ 構成の場合`と同じ。


# Aurora

📝 Writer, Read replica A, read replica B のそれぞれが異なるhost名を持つ。

## Multi AZ 構成の場合、

- RTO = 1-2 min
- RPO = 1 sec (async replication)
- automatic failover (No manual operations)
- No hostname change

## 非 Multi AZ 構成の場合、

- RTO = 1-2 min (if there is a read replica), 10 min (if there is not a read replica)
- RPO = 1-2 min (async copy) ????
- automatic failover (No manual operations) ????
- **No hostname change**

📝 read replicaをmasterにpromoteする場合、rebootは必要なさそう。

<details>
<summary>ref</summary>

> If the primary instance in a DB cluster fails, Aurora automatically fails over in the following order:
> 
> If Aurora Read Replicas are available, promote an existing Read Replica to the new primary instance.
> If no Read Replicas are available, then create a new primary instance.
https://aws.amazon.com/blogs/database/failover-with-amazon-aurora-postgresql/

</details>

## グローバル構成について
global tableにすることで、各regionにclusterが置かれる。

ある region が落ちた場合、
- RTO
    - ~~managed planned failover なら、1-2min (region Bにおいてread replicaをwriterへpromoteする)~~ これは、region がavailableな時のみ使用可能なので、disaster recovery時には使えない。
    - manual unplanned failover なら、もっとかかる (自分で detach and promote a secondary DB cluster)
- RPO = 1-2min (async replicationなので)
    - managed RPO で上限(20s以上)を設定できる。(= replicaへのコピーがこれ以上遅れている場合、primaryの処理を待機させる)
- failover はコンソール上で手動
    - ~~managed planned failoverなら、コンソール上でregionを選択するだけ。~~ これは、region がavailableな時のみ使用可能なので、disaster recovery時には使えない。
    - manual unplanned failover なら、もっと大変 (自分で detach and promote a secondary DB cluster)
- Hostname changes (because endpoint inludes region in it like `database-2.cluster-cgb61uwsvky2.ap-northeast-1.rds.amazonaws.com`)


ref. 

- https://dev.classmethod.jp/articles/amazon-aurora-global-database-failover-between-region/#toc-1
mmdetectionのdockerを作ってみる

# 概要
1. なぜmmdetectionで用意されているDockerfileを使わないのか
1. 環境構築
1. Dockerfileを書いて，buildする

# なぜmmdetectionで用意されているDockerfileを使わないのか
主に2つ理由がある．
1つ目はDockerfileに書かれているPytorchやcuda，mmcvのバージョンが低いことだ．これは当該箇所を修正すれば良い．しかし，pytorchやcuda，mmcvのバージョンが新しくなったことで生じる問題に対して，対応をしなければならないのが面倒くさくなってしまった．また，`TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0+PTX"`など最新のGPUを使っていたら`TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0 7.5 8.0 8.6+PTX"`のように書き換えなければならない．これなら1から書いてもいいのではないかと思ってしまった．
2つ目はmmcvをpipからではなくsourceからインストールしたかったからだ．これは何かの理由でmmcv側でエラーを吐いたときに対応しやすいと考えたからだ．mmcvのコードに問題があれば，sourceを書き直せば良いので，問題の解決を図ることができる．

# 環境構築
[Dockerの公式ページ](https://docs.docker.com/desktop/install/ubuntu/)を見てDockerをインストールする．
[nvidia-dockerを使用してGPU環境構築](https://qiita.com/gen10nal/items/1e7fe8a1b2e9ad1e7919)を参考にしてdockerでgpuを使えるように準備する．
[NVIDIA Container Toolkit (NVIDIA Docker) は何をしてくれるか](https://qiita.com/tkusumi/items/f275f0737fb5b261a868#%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%81%AE%E6%8C%87%E5%AE%9A)を参考にして，`default runtime`を`nvidia`にする．これはdocker buildするときにnvccを使う必要があるためである．

# Dockerfileを書いて，buildする
以下にDockerfileを記述する．
必要であればこれを書き換えればよい．
[mmcvのgithub](https://github.com/open-mmlab/mmcv/blob/master/docker/dev/Dockerfile)と[mmdetectionのgithub](https://github.com/open-mmlab/mmdetection/blob/master/docker/Dockerfile)を参考にした．
なお，これはmmcv=1.7.1，mmdetection=2.28.2の環境である．
```
ARG PYTORCH="1.13.1"
ARG CUDA="11.6"
ARG CUDNN="8"

FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel

#setup environment
ENV FORCE_CUDA="1" TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0 7.5 8.0 8.6+PTX" PATH="/usr/local/cuda/bin:$PATH" TORCH_NVCC_FLAGS="-Xfatbin -compress-all" CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" MMCV_WITH_OPS="1"
RUN apt update && apt install -y git libgl1 libglib2.0-0 ffmpeg libturbojpeg libsm6 libxext6 ninja-build libxrender-dev && apt clean && rm -rf /var/lib/apt/lists/*

#install mmcv
RUN git clone https://github.com/open-mmlab/mmcv.git -b v1.7.1 /mmcv
WORKDIR /mmcv
RUN pip install --no-cache-dir -e .[all] -v


#install mmdetection
RUN git clone https://github.com/open-mmlab/mmdetection.git -b v2.28.2 /mmdetection
WORKDIR /mmdetection
RUN pip install --no-cache-dir -e . -v

# if you need, you write the below code
RUN pip install --no-cache-dir albumentations
```
[チートシート]ユースケース

# ユースケース
## 構成要素

- アクター（利用者またはシステム）
    
- ユースケース（命令内容）

- サブジェクト（複数のユースケースをまとめて1つの機能を実現したもの）

## パッケージ

サブジェクトを再利用するときに使用します。
ECサイトのシステムをイメージしてみましょう。ユーザーが商品の注文から受け取りまでの機能をまとめたサブジェクトをパッケージ化すれば、何度でもECサイトでの注文システムを再利用することができます。
## 汎化
ユースケースの内容をさらに抽象化した、新たなユースケースを作成することです。
ECサイトの例で例えるなら、「セール品を注文する」と「お急ぎ便で注文する」の二つのユースケースは、どちらも「注文する」という一つのユースケースに汎化できます。
具体的な方法の上位概念として抽象的な方法を加えるといったイメージです。
## 包含
あるユースケースはほかのユースケースの内容を含んでいるときに使用します。
ECサイトの例で再びたとえると、「商品を出荷する」というユースケースには「配送先と時間を記載する」というユースケースを含んでいることを示します。
## 拡張
ユースケースに対して機能追加する別のユースケースの関係を示します。
たとえばECサイトのシステムで不具合のクレームを受けたときに、「不具合対応」というユースケースの「調査する」という時点で「不具合チェックシステムを使う」というユースケースを追加します。ちなみに、この「調査する」という時点のことを「拡張ポイント」と言います
拡張ポイント
上記の例で**「調査する」という時点のこと**
【Laravel】Jetstreamとは

# Jetstramとは

公式マニュアル

https://readouble.com/jetstream/1.0/ja/introduction.html

Laravelのバージョン8から導入されたライブラリの集合体。
Jestream自体でルートやビュー、コントローラを担当。
他に以下機能を搭載。

・Laravel Fortify
    セッションベースの認証

・Laravel Sanctum
    API認証

・ivewire/Inertia.js
    ユーザプロフィール、チーム管理のUIビュー

・Tailwind
    CSSのフレームワーク


付属機能が必要なければFortufy

# インストール

Jetstreamのインストール
```
composer ewquire laravel/jetstream
```
composer.jsonにjetstreamが自動追記されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/fdf6fab7-12b0-72f7-55c0-5767bc78492e.png)

ライブワイヤーのインストール
```
php artisan jetstream:install livewire
```
livewireが追記されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/3293b0bf-9e66-9b60-7b7c-b1ab1e1df3c4.png)

```
npm install && npm rum dev
php artisan migrate
php artisan serve
```

Laravelのwelocom画面のLogin/Registerも表記されました。

app/Actions
app/Providers
app/View/Components
ファイルなども自動生成されています。
Googleデジタルマーケティング＆Eコマース：パフォーマンス指標の基礎

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/77505f22-0d8f-b3af-4f9c-ed148bcefd65.png" width="800">

# 測定基準

マーケティングキャンペーンにおける測定基準とは、

***<font color="MediumVioletRed">『ビジネス目標を追跡し評価するために使用される定量化可能な測定方法であること』</font>***

指標を追跡することは、デジタルマーケティング担当者が目標達成にどれだけ近づいているかを測定するのに役立ちます。
例えば、
- 有料広告のインプレッション数
- クリック単価
- 顧客生涯価値
- ROAS（広告費用対効果)
    - 広告費に対してどれだけの収益が得られたかを示す指標です。つまり、広告に100ドル使っても、その広告の結果150ドル儲かったら、ROASは150%になるわけです。

# マーケティングファネルにおける指標

マーケティングファネルの各段階でパフォーマンスを測定する方法は非常に多く、平均的なカスタマージャーニーは約6回のタッチポイントを要するため、これらの測定は非常に重要です。この数は、15年間で2倍以上に増えています。パフォーマンス・マーケティングは、これらのタッチポイントのそれぞれが目標にどのように貢献しているかを測定し、より効果的に顧客にアプローチし、エンゲージすることを可能にします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/0f5b6468-0e51-c050-7346-b2c327fe0431.png" width="800">

マーケティングファネルのどのステージで運用するかによって、異なる戦術を適用して指標を追跡します。


| ステージ  | 指標例  |
| :--- | :--- |
| 認知 | インプレッション数 |
| 検討 | 獲得コスト<br>クリックスルー率 |
| コンバージョン | 販売転換率<br>平均注文額<br>カート放棄率 |
| ロイヤリティ | 顧客維持率<br>顧客生涯価値 |

# データ分析

データ分析の主な仕事内容は次の通りです。

### 1.データ収集

データ収集とは、分析ツールからデータを収集し、スプレッドシートやデータベースに格納し、アクセスや作業を容易にするプロセスです。例えば、Facebook、Googleなどの異なるプラットフォームで、同じような目標を持つキャンペーンを実施している場合があります。データの比較と分析を容易にするためには、すべてのデータをまとめる必要があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bac18899-0fcd-c2e8-b37a-a78b3c00aaf7.png" width="650">

### 2.レポート作成

1つの方法は、各ソースからデータを取り出し、スプレッドシートに整理することです。データレポートはパフォーマンスレポートとも呼ばれ、データを整理して要約し、マーケティングおよびセールス活動全体のパフォーマンスを追跡します。このプロセスにより、トレンドの特定や予期せぬ結果の発見がより迅速に行えるようになります。
- 例えば、複数のソースからデータを収集した場合、あるソースのROASが他のソースより高いかどうかを簡単に判断できます。

### 3.データ分析

データ分析とは、結論を導き出し、予測を立て、情報に基づいた意思決定を行うためにデータを調査するプロセスである。

# まとめ

パフォーマンス・マーケティングが生み出すデータは、自社の戦略がどれだけ目標を達成しているかを理解するための非常に貴重なリソースです。データ分析を通じて、目標が達成されているかどうかを確認し、顧客の行動を予測し、将来の計画を立てることができます。

パフォーマンス・マーケティングでは、ファネルの上流にあるインプレッションやクリック数から、下流にあるコンバージョン数や売上数まで、多くのデータが生成されます。
QC七つ道具

# 特性要因図
```特性（結果）とそれに影響を及ぼす要因（原因）との関係```を、```魚の骨のような図（フィッシュボーン図）```に整理して体系化したもの。

# パレート図
各要素の値が```大きい順に並べた棒グラフ```と、```累積和（各要素の値を順に加算)を表す折れ線グラフ```を重ねた、複合グラフで表す図法。

# 管理図
製品の品質管理などに用いる図法。
```管理限界の上限と下限を示し、値の変動を折線```で表す。

# ヒストグラム
```要素の値がとる範囲をいくつかの区間```に分け、各区間に入る要素の工数を数えて、それを```柱状のグラフ（ヒストグラム)```に表した図法。

# 散布図（相関図）
二つの要素間の相関関係を判断するためのグラフ。
右上がりなら```一方の値が増えれると、もう一方も増えるともう一方も増える```正の相関
右下がりなら```一方の値が増えるともう一方は減る```負の相関

# チェックシート
```作業の抜けやチェック漏れなどを防ぐ```ための確認表や図

# 層別
```得られたデータを項目別に分類```すること

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

# 参考記事 図があります。
https://www.sk-quality.com/qc7/qc701_general.html#n4

# 感想
知らないことだらけだ。
ACM(AWS Certificate Manager)非対応EC2インスタンス

## ACMで発行した証明書を利用できるサービス
参考:[AWS Certificate Manager と統合されたサービス](https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/acm-services.html#acm-nitro-enclave)


EC2ではNGINXとApacheが対応しているが、AWS Nitro Enclavesに対応している必要がある。
その中でも下記インスタンスは非対応なので要注意
```
Intel or AMD-based instances with at least 4 vCPUs, excluding T3, T3a, and u-*
AWS Graviton-based instances with at least 2 vCPUs, excluding A1, T4g, G5g, Im4gn, and Is4gen
```
参考:[What is AWS Nitro Enclaves?](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave.html)
form_forのDB指定

# はじめに
ネストしていDBのform_for指定方法迷ったのでメモを残します
### 迷ったところ
```
= simple_form_for([:admin,　campaign, promotion]) do |f|
```

```[:admin,　campaign, promotion]```が分からなかった

### ポイント
form_forの引数は[親、子、孫]となる

ルーティング
```
namespace :admin do
　　resources :campaigns do
   resources :promotions, except: [:index, :show]
```

以下のようなパスが可能
```admin/campaigns/:campaign_id/promotions/new(.:format)```


# 参考資料
[ネストさせたルーティングのform_forの使い方](https://sum54.hatenablog.com/entry/2020/12/18/102504)
データ分析基盤のプロジェクトで学んできたことやしたことをまとめた

# データ分析基盤開発プロジェクトに携わってきて学んだことをまとめ

## データ分析基盤とは？
データの収集、蓄積、加工、分析という一連の流れを一貫して行う部分です。
私がプロジェクトでわかってきたこととしては以下です。

- 最近はデータドリブンな開発やデータ中心の開発などが多くなってきている。
- さまざまなデータが乱立し、再度データベースをリプレースしているプロジェクトなども散見される。
- データの分析をしやすくするための構築、マーケティングやビジネスサイドにもっと使ってもらいやすくするための環境改善をしている。

データドリブンというのは個人的見解からすると最終的にはビジネスサイドへの集約です。マーケティングとしてどう行動データを使って自社内で活用していくのかということに尽きると思います。

そのための基本としては
データ分析基盤の開発に当たった時の概要としてデータのフローを一番最初に理解することが大事になってきます。

**インバウンド連携**
**レイヤー0(階層0)** → AWSのS3などのストレージサービス、GCPならGCS(いわゆるデータレイク)
**レイヤー1(階層1)** → レイヤー0にあるデータを必要なカテゴリ、媒体、種別などのコンテンツごとに大まかにデータマートを構築する。
**レイヤー2(階層2)**　→ レイヤー1に存在しているデータをさらに深ぼってカテゴリ内のどの部分に使うデータなのかという分類ごとにデータマートを構築する。
**レイヤー3(階層3)**　→ レイヤー2で細分化されたデータマートからアウトバウンドへ連携するための形式に変換する部分を構築する。
アウトバウンド連携

## データの連携方式について
- CSVファイルが指定のフォルダに配置されており、バケットやフォルダにアクセスして取得する。
- CSVファイルがサーバに配置されており、SFTP接続などで取得する。
- ZiPファイルでサーバや指定のフォルダに配置されており解凍処理を挟んで取得する。

他はTSVや文字コード、改行コードがいろんな形式を挟んで連携されてくるという部分はたくさんあると思いますが、基本的にはこのような連携方式かと思います。

データ分析基盤開発プロジェクトに当たるとだいたいこんなフローかと思います。

## データ分析基盤で使っている技術
- AWS S3
- AWS EMR
- AWS Redshift
- Python
- PySpark
- Bigquery(GCP)
- SQL
- ShellScript

だいたいこんな感じだと思います。

## できた方がいいこと
- データフローを理解してどんなアウトプットになり使用されてるのかを理解する判断力など
- PythonやShellScriptでテストのファイル作成ツールや性能試験関連ツール
- SQL操作
- クラウドのエラー関係の調査方法
- 分散処理の理解(並列処理など)

他にもたくさんあるので、一旦このような内容で展開させていただきます。
【レビューで指摘されがちシリーズ】null でないときに別の値を返したい場合は ?? 演算子が使えそうです

レビューで指摘された内容をそのまま放流するシリーズ。

student がいるときは student.Name を返し、いないときは「名無しさん」を返すプロパティがあるとします。

```c#
    public string Name
    {
        get
        {
            var student = Students.SingleOrDefault(s => s.Id == Id);

            if (student is null)
            {
                return "名無しさん";
            }

            return student.Name;
        }
    }

```

このコードに対して 「`student?.Name ?? "名無しさん"` って書けるっぽいです。」と指摘をもらいました。

```c#
    public string Name
    {
        get
        {
            var student = Students.SingleOrDefault(s => s.Id == Id);

            return student?.Name ?? "名無しさん";
        }
    }

```

わーお。スッキリしました。さらにコメントをもらいました。
「`Students.SingleOrDefault(s => s.Id == Id)?.Name ?? "名無しさん"` って、繋げられそうです。この辺は好みによると思います。」

```c#
    public string Name
    {
        get
        {
            return Students.SingleOrDefault(s => s.Id == Id)?.Name ?? "名無しさん";
        }
    }
```

おお。さらにスッキリします。

【追記】さらにさらに、 @chocolamint 様より [コメント](https://qiita.com/lx-sasabo/items/36c021cc52720d1479f2#comment-5551018e52f100437f5f) をいただきました。一行で書けます！

```C#
    public string Name => Students.SingleOrDefault(s => s.Id == Id)?.Name ?? "名無しさん";
```

さて、`??` 演算子、こいつは何と読むのでしょうか？
はてなはてな演算子でしょうか？

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/null-coalescing-operator

どうやら null 合体演算子というそうです。…が全く覚えられず結局、はてなはてな演算子と私は呼んでいます。
API Gateway プライベートタイプの注意点

## 東京リージョンと比較して、大阪リージョンで利用できるAPI Gatewayの機能制限
* REST APIのプライベートタイプとHTTPのAPIは、大阪リージョンでは利用ができない
* API Gatewayバージョン２のAPIは、大阪リージョンで利用ができない
* プライベートタイプのAPI Gatewayでは、カスタムドメインは未サポート
* 未サポートで利用はできるが、問題が発生した際は、AWSサポートで調査してもらえない
* マルチレベルのベースマッピングは、バージョン１（大阪リージョンがバージョン1）では利用できない
* マネジメントコンソールから、カスタムドメインのAPIマッピングはエラーとなる
（マネジメントコンソールからはapigatewayv2 APIが発行されるため）
⇒ マネジメントコンソールではなく、AWS CLIからを実行する必要がある


参考:[カスタムドメイン名はプライベート API ではサポートされていません。](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-custom-domains.html)
【Linux】cron

# cronについて

## cronファイルの開き方
### ルートユーザーに変更
```sh
sudo -s
```

### cronをエディターで開く
```sh
crontab -e
```

### cronの設定を追記する
```sh
* * * * sh /var/www/html/test/testcron.sh > /dev/null 2>&1
```

## cronの書き方
```
時間　実行するコマンド　実行するファイル > /dev/null 2>&1
```

### 時間の書き方
* 左から「分」「時」「日」「月」「曜日」となっている
```sh
30 10 1 12 *
```
と書いた場合は12月1日10時30分となる。

*30分毎には下記のように表現
```sh
*/30 * * * 
```

## 実行するコマンドの書き方
### PHPの場合はPHPファイルの場所を指定
```sh
* * * * /bin/php
```

### シェルスクリプトの場合はshと記述
```sh
* * * * sh 
```

## 実行ファイルの書き方
* 実行ファイルはフルパスで記載すればＯＫ

## > /dev/null 2>&1の意味
* エラーが発生する可能性があるので、すべての出力を/dev/null（システムのゴミ箱のようなもの）に送信し、2>&1によって、すべてのエラーの送信先をcronに指示している。
VSCode + Laravel + IntelphenseでFacadesが認識されないことの対策

# はじめに
　こちらの記事を見ていただいている皆様、PHPフレームワークのLaravel開発、どのようなIDEを利用されておりますでしょうか？
 　私は<a href="https://azure.microsoft.com/ja-jp/products/visual-studio-code">VSCode</a>に<a href="https://intelephense.com/">Intelephense</a>を最低限入れて、コーディングを行ってます。
 　
  　このLaravelには
 - ログを記録するためのLog Facades
 - DB接続のためのDB Facades

など、クラスインスタンス生成不要で、静的メソッドのように呼び出しが可能なFacades機能があります。
この Facadesは、useを利用せずに呼び出すことが可能な機能となります。
   
  
  　ただ、Intelephense Ver.1.3以上の場合、 Facadesを検知しきれないためか図のように<span style="color:red">赤線</span>を引かれてしまいます。これでは、記法エラーなのかIntelephenseの警告なのかわからなくなってしまいます。
 ![スクリーンショット 2023-03-06 13.02.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160690/377c2db0-1123-b9da-9545-47240ddec540.png)
  




  　今回はこの赤線をIntelephenseに引かせないためのパッケージ紹介となります。

# この記事の目的
- IntelephenseがFacadesを検知できないなどで出す警告を抑止すること

# 対象環境
- VSCode
- Intelephense(Ver 1.3以降)
- Laravel(筆者の動作確認環境は8以上)

# 結論
<span style="font-size:30px"><a href="https://github.com/barryvdh/laravel-ide-helper">laravel-ide-helper</a></span>を導入する

# laravel-ide-helperとは
　公式サイトも参考にまとめると、「Intelephenseが正確なオートコンプリートを提供できるように補助するヘルパーファイルを作成するライブラリ」です。
 　
  　先ほどの警告が出た図であればこのライブラリ導入とヘルパーファイルの作成すると図のようにワーニングが消えました。
![スクリーンショット 2023-03-06 13.03.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160690/ecd9b92a-d19e-1f08-3b84-0723186ac6ab.png)
   
   

   
   さらに、カーソルを合わせると、クラス参照のダイアログも出ました。
![スクリーンショット 2023-03-06 13.03.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160690/d15b3f7d-a034-3202-da78-f02a48fd0829.png)
   

# 導入手順及び利用方法
以下、<a href="https://github.com/barryvdh/laravel-ide-helper">公式サイト</a>より、ざっくりと導入手順とhelperファイルの作成手順を記載します。(前提は、「すでにLaravelプロジェクトが存在する」となります。未作成の場合は<a href="https://readouble.com/laravel/9.x/ja/installation.html">Laravel公式のインストールガイド</a>より作成してください。)

##### (1) 下記コマンドでパッケージを導入する(開発用であるため「--dev」でインストールします)
```
composer require --dev barryvdh/laravel-ide-helper
```
##### (2) 以下のコマンドでhelperファイルを作成
```
php artisan ide-helper:generate
```


以上のコマンドでFacadesのオートコンプリートが利用できるようになったはずです。

# 終わりに
このパッケージ導入で煩わしいFacadesの警告が消えるようになったかと思います。
この記事ではVSCodeで開発する人の助けとなれば幸いです。

# 余談
<a href="https://www.jetbrains.com/ja-jp/phpstorm/">PHPStorm</a>を利用すると、最初から反応するという話を聞きました。  そうであればとても強力なツールだなと思います。



# 参考・参照
- VSCode：<a href="https://azure.microsoft.com/ja-jp/products/visual-studio-code">https://azure.microsoft.com/ja-jp/products/visual-studio-code</a>
- Intelephense：<a href="https://intelephense.com/">https://intelephense.com/</a>
- laravel-ide-helper：<a href="https://github.com/barryvdh/laravel-ide-helper">https://github.com/barryvdh/laravel-ide-helper</a>
- PHPStorm：<a href="https://www.jetbrains.com/ja-jp/phpstorm/">https://www.jetbrains.com/ja-jp/phpstorm/</a>
Pythonで正規表現にマッチした文字列をひとつずつ置換する方法

# やりたいこと
* あるテキストの中で、正規表現にマッチした文字列をその内容に基づいて一つずつ置換し、その置換後のテキストを得たい。
* 簡単な例
  - もとのテキスト: `aaa <<hoge>> bbb <<fuga>> ccc <<hoge>>`
  - 置換方法:
    - `<<hoge>>` => `APPLE`
    - `<<fuga>>` => `BANANA`
  - 得たいテキスト: `aaa APPLE bbb BANANA ccc APPLE`

# 実装
追記：コメントをいただき、 `re.sub()`　で簡単に実装できることがわかったので、修正しました。コメントをくださった方、ありがとうございます！

```python
import re


def my_replace(match):
    """マッチした文字列に基づいて置換後の文字列を返却する。"""
    return "APPLE" if match[0] == "<<hoge>>" else "BANANA"


input_text = "aaa <<hoge>> bbb <<fuga>> ccc <<hoge>>"
result_text = re.sub(r"<<.+?>>", my_replace, input_text)

assert result_text == "aaa APPLE bbb BANANA ccc APPLE"
```

<details><summary>もともとの実装</summary><div>

```python
import re


def my_replace(match_str):
    """マッチした文字列に基づいて置換後の文字列を返却する。"""
    key = match_str[2:-2]
    if key == "hoge":
        return "APPLE"
    return "BANANA"


# 置換したい文字列の正規表現
pattern = re.compile(r"(<<.+?>>)")
# もとのテキスト
input_text = "aaa <<hoge>> bbb <<fuga>> ccc <<hoge>>"
# 得たいテキスト（を格納するための変数）
result_text = ""

# 置換処理（やっていることはシンプルで、マッチした文字列をひとつずつ置換しながら、もとのテキストを連結している）
last_end = 0
for m in re.finditer(pattern, input_text):
    result_text += input_text[last_end:m.start()]
    result_text += my_replace(m.group())
    last_end = m.end()

result_text += input_text[last_end:]

# 結果
assert result_text == "aaa APPLE bbb BANANA ccc APPLE"
```
</div></details>



# 備考
* ~~単に正規表現にマッチした文字列を一括で置換するだけなら `.replace()` や `re.sub()` を使えばOKなのだが、 **マッチした文字列の内容に応じて置換後の文字列を変更したい** というようなケースでは、 `.replace()` や `re.sub()` を用いるのは難しい。~~
  - ~~（上記「簡単な例」なら `.replace("<<hoge>>", "APPLE").replace("<<fuga>>", "BANANA")` でも実現可能なのだが、あくまで「簡単な例」なので・・・。）~~
* 追記： `re.sub()` は第２引数に文字列だけでなく関数も取ることができるので、それで実現可能。

# 参考サイト
* https://stackoverflow.com/questions/59313087/python-regex-how-to-replace-each-match-individually
* https://docs.python.org/ja/3/library/re.html#re.finditer
* https://docs.python.org/ja/3/library/re.html#re.sub
Googleデジタルマーケティング＆Eコマース：適切なプラットフォームを選択する

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/77505f22-0d8f-b3af-4f9c-ed148bcefd65.png" width="800">

今回、具体的なソーシャルメディアツールやプラットフォームを使って、どのように目標を設定し、達成するかを紹介します。

# ゴール1：オーディエンスとの関係を築く

あなたのブランドやビジネスが、オーディエンスとの関係を築くことを目標として優先するのであれば、どのソーシャルメディアプラットフォームが関係構築に最適かを検討する必要があるでしょう。

#### Twitter

例えば、Twitterのような、短いメッセージでやり取りし、オープンなコミュニケーションが推奨される、インタラクティブで言葉をベースとしたプラットフォームは、関係構築に適しています。これは、Twitterでは会話術が奨励され、優先されるからです。Twitterは、ブランドがフォロワーに負担をかけずに1日に何十回も投稿できる唯一のプラットフォームの1つでしょう。

#### 戦略

- レスポンシブで魅力的であることが必要です。誰かがあなたのブランドと交流していたら、遠慮なくすぐに返信して、会話を続けましょう。
- 注文に問題があったためにあなたのことを話題にしたのであれば、親切で、共感できる、そして協力的なカスタマーサービスを提供しましょう。

オンライン上でユーザーと関わる際に最も重要なことは、常にブランドの声に忠実であることを確認することです。あなたのフォロワーは、ある種の声を期待するようになり、その声によってあなたを認識するようになるのです。

:::note info
時には、関係構築について積極的になることがベストです。ユーザーからのコンタクトを待つのではなく、あなたのフォロワーコミュニティーの中で、本物のつながりやコミュニケーションを積極的に探しましょう。
:::

# ゴール2：新規顧客を開拓する

#### Instagram

新規顧客を目標とするのであれば、Instagramのような画像ベースの写真や動画共有プラットフォームで成功を収めることができるかもしれません。これは、製品について伝えるのではなく、人々に製品を見せるのに適した場所です。新規顧客をターゲットにするには、興味深くダイナミックなビジュアルを使って、ブランドや製品のストーリーを伝えるとよいでしょう。

Instagramのユーザーは、学習、インスピレーション、ショッピング、新しいものを試すなど、このプラットフォーム上で多くの時間を過ごすため、ブランドのストーリーを伝えるのに効果的です。また、ブランドは多くのフォロワーを持つ他のユーザーを活用して、自分たちのストーリーを伝えることができるため、ユニークなプラットフォームと言えます。

#### 戦略

- インフルエンサーマーケティングでは、ブランドはオンラインインフルエンサーと協力して、製品やサービスのマーケティングを行います。インフルエンサーが、自社のことを知らないフォロワーに自社ブランドを紹介することは、新規顧客開拓に非常に有効です。
- ソーシャルメディア広告キャンペーンを実施することで、ブランドのリーチが確実に増えます。

# ゴール３：Webサイトへのトラフィックを誘導する

#### Facebook

Webサイトにトラフィックを誘導したい場合は、Facebookのように、記事、リンク、製品、画像、レビューを共有できるソーシャルメディアプラットフォームを検討してみてください。共有するコンテンツが新鮮で有益に感じられ、ランディングページにリンクしていれば、ユーザーはそれをクリックして、あなたのWebページにたどり着く可能性が高くなります。ユーザーがあなたのページを気に入れば、あなたのコンテンツを共有し、さらに多くのトラフィックを獲得する可能性があります。

#### 戦略

- ブランドの声とビジュアルをまとまりのある形で組み合わせます。Webサイトへの訪問を促すには、すべてのコンテンツに目的意識と関連性があり、ユーザーを引きつける必要があります。
かんたん慣性スクロール ver.2 GSAP ScrollSmoother.js ぽいのを実現するメモ

[**GSAP**](https://greensock.com/)の[**ScrollSmoother.js**](https://greensock.com/scrollsmoother/)はブラウザネイティブのスクロールバーで慣性スクロールを実装できるライブラリですが、同じようにブラウザネイティブのスクロールバーで実装出来ないか試したものです。

## デモ
Windowsのマウスホイールでもなめらかな余韻の残る慣性スクロールになっています。
MacのTrackPadに近しいスクロール感覚だと思います。

<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="YzOxObY" data-user="TaroTsujimoto" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/TaroTsujimoto/pen/YzOxObY">
  Untitled</a> by ONSEN (<a href="https://codepen.io/TaroTsujimoto">@TaroTsujimoto</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## コード

マウスホイールに特化した実装でMacのトラックパッドで実行すると、命令が走りすぎて不具合が発生するため、Macのトラックパッドの場合は実行されないようにしています。

GSAPの ScrollToPlugin と組み合わせて使います。
スクロールの出だしが**10px以下**だと**1.5秒間**トラックパッドだと判定し、
それ以外だとマウスホイールと判定してScrollToPlugin で `wheelDeltaY` 分だけスクロールさせています。

**ScrollSmoother.js** は指定された要素`#smooth-wrapper #smooth-content`などでコンテンツを囲ってやる必要がありますが、この方法では必要ありません。



```js
import gsap from 'gsap';
import { ScrollToPlugin } from 'gsap/all';
gsap.registerPlugin(ScrollToPlugin);

let ignitionTimeoutID;
let isWheel = true;
let isTrackPad = false;

document.querySelector('body').addEventListener('mousewheel', disableScroll, { passive: false });

function disableScroll(e) {
  const wheelDeltaY = e.wheelDeltaY;
  if (isWheel) e.preventDefault();

  // スクロールの出だしが10px以下だと1.5秒間トラックパッドと判定する
  if (Math.abs(wheelDeltaY) < 10) {
    isWheel = false;
    isTrackPad = true;

    clearTimeout(ignitionTimeoutID);
    ignitionTimeoutID = setTimeout(() => {
      isTrackPad = false;
    }, 1500);
  } else {
    if (!isTrackPad) {
      isWheel = true;

      let direction = `-=${Math.abs(wheelDeltaY)}px`;
      if (wheelDeltaY < 0) direction = `+=${Math.abs(wheelDeltaY)}px`;
      gsap.to(window, {
        scrollTo: { y: direction, autoKill: false },
        duration: 1,
        ease: 'power2.out',
      });
    }
  }
}
```
【phpMyAdmin】エラー1030の解消方法

phpMyAdminでユーザー権限を編集しようとしていたところ、下記のようなエラー内容が表示されました。

< MySQLのメッセージ >
```
#1030 - Got error 176 "Read page with wrong checksum" from storage engine Aria
```

# 解決方法

 mysqlのデータベースを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/d3de59f9-7013-9382-34f3-8799629defef.png)


テーブルを全て選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/e8159b68-2136-4e83-8a83-6edb8b774dfc.png)

テーブルを修復するを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/6c03fa64-a576-a54d-897f-f1246666c591.png)

これで解決できました。
SSIDとは

# SSID
「ネットワーク名」は「ネットワーク」「ネットワーク（SSID）」```「SSID」```などとして表記されています。
# 出典
https://www.softbank.jp/support/faq/view/18113


```無線LANのアクセスポイントを識別するためのID```（名前）です。
例えばPCやスマートフォンなどの端末から無線LANの設定を行う際は、電波が届く```接続先候補のSSIDの一覧が表示```されます。
```特定のSSIDを秘匿にするには、アクセスポイントでSSIDの「ステルス機能」を設定```します。
SSIDを暗号化できません。

# 出典
https://gihyo.jp/book/2022/978-4-297-13178-4

# アクセスポイントとは？
無線でスマートフォン、ノートパソコン、ゲーム機といった複数の無線LAN（Wi-Fi）機能付きの```端末を、家庭内LANに接続するための機械```です。無線LANと有線LANを相互変換する装置であるとも言えます。

# 出典
https://dream.jp/mb/tips_m/wifi08.html#:~:text=%E7%84%A1%E7%B7%9A%E3%81%A7%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%B3%E3%80%81%E3%83%8E%E3%83%BC%E3%83%88%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%80%81%E3%82%B2%E3%83%BC%E3%83%A0%E6%A9%9F%E3%81%A8%E3%81%84%E3%81%A3%E3%81%9F%E8%A4%87%E6%95%B0%E3%81%AE%E7%84%A1%E7%B7%9ALAN%EF%BC%88Wi%2DFi%EF%BC%89%E6%A9%9F%E8%83%BD%E4%BB%98%E3%81%8D%E3%81%AE%E7%AB%AF%E6%9C%AB%E3%82%92%E3%80%81%E5%AE%B6%E5%BA%AD%E5%86%85LAN%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%A9%9F%E6%A2%B0%E3%81%A7%E3%81%99%E3%80%82%E7%84%A1%E7%B7%9ALAN%E3%81%A8%E6%9C%89%E7%B7%9ALAN%E3%82%92%E7%9B%B8%E4%BA%92%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E8%A3%85%E7%BD%AE%E3%81%A7%E3%81%82%E3%82%8B%E3%81%A8%E3%82%82%E8%A8%80%E3%81%88%E3%81%BE%E3%81%99%E3%80%82

# 感想
* アクセスポイントはLANに接続するための機械のことなのか。
* ネットワークの設定で色々名前が出てくる。これがSSIDなのか。
リスト内包表記

***Python3***を使ったリスト内包表記を使って配列を新たに作成する処理を実装しました。


```python
# 新規作成 2023/3/7
# リスト内包表記を使った処理の練習

member = ["白石麻衣","生田絵梨花","松村沙友理","西野七瀬","高山一実"]

# 生田絵梨花以外のメンバーをllc_member配列に格納する
llc_member = [men for men in member if men != "生田絵梨花"]

print(llc_member)

member2 = ["白石麻衣","生田絵梨花","松村沙友理","西野七瀬","高山一実","秋元真夏"]

# 生田絵梨花と秋元真夏をnllc_member配列に格納する
nllc_member = [men2 for men2 in member2 if men2 == "生田絵梨花" or men2 == "秋元真夏"]

print(nllc_member)
```
Googleデジタルマーケティング＆Eコマース：ソーシャルメディア・マーケティングの基礎

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/77505f22-0d8f-b3af-4f9c-ed148bcefd65.png" width="800">

# ソーシャル・マーケティングとは

ソーシャルメディア・マーケティングとは、ソーシャルメディア・プラットフォーム向けにコンテンツを作成・公開し、エンゲージメントを高めてブランドや製品のプロモーションを行うことです。

ソーシャルメディアは、多くの人が利用しているため、新しいオーディエンスを見つけるのに最も効果的なチャネルの一つです。ソーシャルメディアのアカウントで、企業は顧客と関わり、広告を出し、バイラルコンテンツを通じてアーンド・メディアを生み出すこともできます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/978bfc52-5527-c0d3-aaeb-38c8f155c493.png" width="650">


しかし、ソーシャルメディアには大きな欠点があります。企業はアカウントに投稿する内容はコントロールできますが、プラットフォームそのものをコントロールすることはできません。そのため、特定のプラットフォームが閉鎖されたり、アルゴリズムが変更されたりすると、ブランドは一夜にしてフォロワーにリーチする能力に影響を受ける可能性があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/30332700-8010-b6bf-391a-c3c5925da3b7.png" width="650">

# ソーシャル・マーケティングの5つの柱

ソーシャルメディアマーケティングは、5つの柱と呼ばれるカテゴリーに分類することができます。

1. 戦略
1. 計画と公開
1. リスニングとエンゲージメント
1. 分析とレポート
1. 有料ソーシャルメディア

## 1.戦略

#### <font color="MediumBlue">オーディエンスを知る</font>

コンテンツやキャンペーンを計画する前に、オーディエンスが誰で、どのソーシャル・プラットフォームを使用しているかを知る必要があります。適切なコンテンツを適切な場所に投稿することで、時間とお金の両方を節約することができます。

#### <font color="MediumBlue">目標を理解する</font>

どのような種類のコンテンツを作成すべきかを知るには、目標を理解することも必要です。

例えば、

- ブランド周辺のコミュニティを構築したいのであれば、投票や質疑応答などのインタラクティブなコンテンツに焦点を当てるかもしれません。
- 新製品のプロモーションが目的であれば、コンテストやプレゼント企画を実施した方が良い結果を得られるかもしれません。

#### <font color="MediumBlue">適切なコンテンツを作成する</font>

オーディエンスを理解し、明確な目標を持つことで、効果的で適切なコンテンツを作成することができます。

## ２．計画

以下を検討する必要があります。

- いつコンテンツを投稿するか？
- どれくらいの頻度でコンテンツを投稿するか？

目標は、フォロワーがあなたのことを思い出すのに十分な頻度で、かつフォロワーを圧倒するほど頻繁にはしないようにすることです。

## 3.リスニングとエンゲージメント

コンテンツを世に送り出したら、あなたのブランドに関連するソーシャル会話やメンションを追跡・分析することができます。

これは、ブランドのソーシャルコンテンツへの直接的な反応や、製品に関する投稿などのアーンド・メディアをモニタリングすることを意味し、顧客があなたのビジネスについてどのように感じているかを知るための素晴らしい方法となります。

得られた洞察は、ソーシャルプラットフォーム上で顧客にどのように対応し、関与するかを決めるのに役立ちます。これらの対応は、ブランドイメージや顧客との関係に影響を与える可能性があるため、重要です。

ソーシャルリスニングとエンゲージメントは、会話のようなものだと考えてください。まず、企業はコンテンツを公開します。そして、オーディエンスの反応に耳を傾けます。オーディエンスの発言に注意を払うことで、最適なレスポンスを判断することができます。

例えば、

- 特定のツールについて、いかに役立てたかについて投稿された場合、ブランドは、感謝や励ましの言葉を返すことができます。
- アプリが正しく動作していないと投稿された場合は、トラブルシューティングのヒントを共有することができます。

## ４．分析とレポート

分析とレポートを使って、コンテンツやキャンペーンのパフォーマンスを確認し、その結果を他の人に伝えることができます。

ソーシャルメディア分析ツールは、

- コメント
- シェア
- フォロー
- クリック
- あるハッシュタグを使用している人の数
- 肯定的な言及の数

などを追跡・測定することができます。

企業は、これらの洞察を利用して、トレンドに対応したり、将来の戦略を導くことができます。

## ５．有料ソーシャルメディア

有料のソーシャルメディア広告は、他のチャンネルの有料広告と同じような利点がたくさんあります。

- ブランドのリーチを既存の顧客ベース以外にも拡大します。
- 製品をリマーケティングすることができます。
- 検索エンジンよりも特定のユーザー情報を提供することです。つまり、ブランドは非常に特定された顧客グループに対して広告を提供することができます。
- Eメールリストを増やすのに良い方法です。広告をEメール登録フォームにリンクさせることで、企業はフォロワーに直接連絡し、特別なオファーを送ることができます。
[Python] 配列や辞書をフィルタリングする組み込み関数 filter()

# 1. はじめに
Pythonで配列をフィルタリングしようとしたものの、
```Python
# メニューの中から、リンゴを使ったものだけ注文したい！🍎

menu_list = ["apple juice", "orange juice", "apple pie", "lemon pie", "lemon juice"]
order_list = []
for menu in menu_list:
    if "apple" in menu:
        order_list.append(menu)

print(order_list) # ["apple juice", "apple pie"]
```
のように愚直に`for`ループを回す方法しか思いつかなかった。
```Python
order_list = [menu for menu in menu_list if "apple" in menu]
```
とすると１行で書くことはできるけれど、結局`for`ループを回していることに変わりはないし、もっといい書き方をしたい。

ずっとPythonを書いているのにフィルタリング方法を知らなかったことに驚きつつ調べたところ、便利な組み込み関数`filter()`が見つかった。
# 2. 基本的な使い方
```Python
filter(関数, iterableなオブジェクト)
````
という書き方をする。`関数`の戻り値が`True`となる要素のみをもつ、`filter`クラスのコレクションを生成してくれる。

# 3. 例
## 3. 1. 配列
例えば、最初の例は
```Python
def is_apple_menu_list(menu):
    is_apple = "apple" in menu
    return is_apple

filtered_menu_list = filter(is_apple_menu_list, menu_list)
```
と書ける。ただし、戻り値は配列ではなく`filter`クラスのオブジェクトである。
```Python
print(filtered_menu_list) # <filter object at 0x7f468071f940>
print(type(filtered_menu_list)) # <class 'filter'>
```
これは、`range`クラスと同様にイテラブルなオブジェクトなので、`range()`を使う場合と同じように`for`ループを回して中身を取り出すことができる。
```Python
for menu in filtered_menu_list:
    print(menu)
# apple juice
# apple pie
```
配列へ変換するには
```Python
print(list(filtered_menu_list)) # ["apple juice", "apple pie"]
```

`filter()`の第一引数にlambda関数を用いるとシンプルに書ける。
```Python
filtered_menu_list = filter(lambda menu: "apple" in menu, menu_list)
```
タブルも配列と同様の書き方でフィルタリングできる。

## 3. 2. 辞書
以下のような辞書があるとする。
```Python
menu_dict = {
    "apple juice": 300,
    "orange juice": 250,
    "apple pie": 450,
    "lemon pie": 400,
    "lemon juice": 200,
}
```
同様に`"apple"`でフィルタリングするには
```Python
def is_apple_menu_dict(menu):
    is_apple = "apple" in menu[0]
    return is_apple

filtered_menu_dict = filter(is_apple_menu_dict, menu_dict.items())
```
または
```Python
filtered_menu_dict = filter(lambda menu: "apple" in menu[0], menu_dict.items())
```
となる。辞書型に戻すには、
```Python
print(dict(filtered_menu_dict)) # {"apple juice": 300, "apple pie": 450}
```

# 4. 注意点
Pythonのイテレータは、一度取り出すと元に戻せないので、例のように`for`ループを回した後に配列や辞書に変換しようとすると、中身が空の配列や辞書が生成されてしまう。
`filter()`を使って生成したコレクションを何度も使う場合は、先に配列や辞書などに変換しておいた方がよさそう。

# 5. 参考
- [Built-in Functions — Python 3.11.2 documentation](https://docs.python.org/3/library/functions.html#filter)
キャッシュの考え方

# キャッシュです
システムが遅いときの対策としてキャッシュが利用されます。
キャッシュの概念を覚えておくときっと役に立つ時が来ます。
（役に立たないのはお前のレベルが低くて気づけていないと言っても過言ではない←反感食らうやつ）

# 今回はWebシステムを例にとります
キャッシュはシステム内のほとんどの段階で使用することができます。
例えば…Webシステムの抽象的なアクセスルートと各段階でのキャッシュの適用を考えてみます。

1. ブラウザ
    1. ブラウザで1度表示したコンテンツ（静的なHTMLとかjsとか画像とか動画とか）を保持しておきます。
1. Proxyサーバ
    1. 企業内では使われることがあります。
ブラウザキャッシュと同じように、一度表示したコンテンツをProxyサーバにためておき、外部ネットワークに出る前の段階でキャッシュを返します。
1. CDN
    1. エッジと呼ばれるWeb閲覧をしているところから近いWebネットワーク上にコンテンツをキャッシュしておくサーバを置き、リクエストが来たらOriginと呼ばれる本体のシステムまでいかずにキャッシュを返します。
1. Webサーバ
    1. http304等のステータスを返すことで、変更のないファイルはローカル端末上のファイルを使用し、コンテンツ本体は送信しないようにできます。
1. Application
    1. プログラム内では様々なやりかたがあります。一例としてファイル読み込みを毎回するのではなく、メモリ上にキャッシュしておくなどの方法が取られます。また、動的コンテンツでも変更頻度の少ないものに関してはN分間キャッシュしておくなどして、処理速度を速めることができます。
1. Database
    1. プログラムと同じように動的な検索結果をメモリ上にキャッシュしておき、ファイルリードの時間を短縮することができます。

ということで、システムの各ポイントでキャッシュを適用することができます。
負荷の高い部分についてはその前段にキャッシュを設けることによってレスポンスの高速化が可能です。
また、Webサーバ以降は処理を前段に寄せることによってスケールイン／ダウンなどの対応ができるため、クラウド費用等が下げられるかもしれません。


# その他の例
キャッシュの考え方は様々な応用が利きます。

- 未適用
    - リクエスト→→→→→→→→→→→→→→→→→→→→→→→→→→→データのオリジン
- 適用
    - リクエスト→→→→→→→→キャッシュ！→→→→→→→→データのオリジン

## スーパーマーケット
農家→→→→農協→→→→卸市場→→→→スーパー→→→→消費者
消費者が毎回農家や牧場やらに買い物に行くのはばかばかしいので様々な段階でキャッシュをします。

## ITシステムの問い合わせ
ユーザー→→→→問い合わせ窓口→→→→開発者

リクエスト発生拠点により近い場所で処理をしていくことで、レスポンスの向上とオリジンの負荷低減ができます。

それではよいキャッシュ生活を！
英語で ReadMe.md を書くときの、Getting Started のベストプラクティス

https://kaedeee.com/?p=2528

こんな感じが良いらしい、ソースは、英語の github open surce と、 chat-GPT より。

# Project Title
Enter project description here.

Add a smart banner below 👇
![🎮 Kaede Games](https://img.shields.io/badge/Kaede%20Games%20🎮-red.svg?style=for-the-badge&logoColor=white&labelColor=white)

## Getting Started

### Prerequisites
- Node.js

### Environment Variables
Description of .env file.

### Installation
Instructions on how to install.

### Usage
Description of custom commands.

### References
URLs or other references.

🍘

https://kaedeee.com/?p=2528