OmniAICreator/Qiita-1.07M huggingface dataset:
リーダーシップは誰がとってもいい。それが自立型組織を創る。

## 自立型組織を目指したい

だって素敵そうだから。笑
というのはありますが、素敵の正体はおそらく良いサービスをより早く世に送り出せている
というビジョンなのだと思います。

ここでまず勝手に、自分なりに言語化してみた自立型組織の状態を書いてみます。

```自立型組織
* 全てのRelevantな行動がユーザーファーストな課題解決であり続けていて
　　 メンバー1人1人が自覚と責任を持って意思決定をしていて、
　　 その結果大きな成果を挙げ続けている組織
　　**　意思決定に必要な情報が行き届いていること
　　　　 ***　サービスのユーザーに対する提供価値が何であるかが意思統一されていること
　　　　 ***　ステークホルダーが明確であること
　　　　　　  -　誰のための課題解決か
　　　　　　  -　解決するために必要な相談相手は誰か
　　**　課題解決に必要なスキルを有していること
　　　　 ***　各々が正しく問題設定ができること
　　　　 ***　設定した問題に対して解決するスキルがあること
```

ここで書いてみても、事業環境に関する情報の透明性はもちろんのこと、
所属している仲間の相互理解だったり、ロジカルシンキングに代表されるような
個人スキルも当然のように必要そうですが、出身が様々なメンバーが集まってる中で
粒も当然バラバラ、というか何かが尖ってる人の集まり（笑）？のようなものなので、
今は自立型組織を目指すために、現在はメンバーのベースを揃えたり、
最終的に創意工夫するための出発点を整えている段階だと思っています。

## 組織に必要になってくるのはリーダーシップ？

まだまだ成熟しているとは言い難い（っていうか自分たち自身で成熟したと思える日なんて来るのか？）
と思っているので昨年も次に向けて今足りないorこれから足りなくなりそうなものを
考えてみたわけですが

※昨年の記事
https://qiita.com/hakocha/items/64fab2a31a277138765a

その中にリーダーシップに関するものがありました。
> 中間マネジメント層のマネジメント力ではなくリーダーシップ力の開発

案の定、今社内でよく言われているのはマネジメント力の向上です。
（いや、それも大事なことですけどね）

ので、前置き長すぎですけど、リーダーシップに関して最近聞いた良い言葉を
少しご紹介してみたいと思います。

## After you と Follow me

それがこの言葉。

伊藤羊一さんという現在は武蔵野大学でアントレプレナー教育などを中心に
幅広くご活躍されている方から学んだ言葉です。

ちなみに、ちょうど最近リーダーシップに関する本を出されたとのことで
気になる方は「「僕たちのチーム」のつくりかた メンバーの強みを活かしきるリーダーシップ」
で検索してください。（まだ読んでないけど勝手に宣伝。笑）

さて、まだ浅い理解の中でこの言葉と自分の考えを混ぜ合わせてみますと、
* After you
　なんでもそうなんだと思いますが、特にインターネットサービスに関しては
　どんなサービスがユーザーの心を動かすのか、その正解をみなさん求めながら
　日々活動されているんだと思いますが、偉い人が正解を知っていることなんて
　ほとんどなく、正解は創り手が探し当てていく時代、という前提で
　「挑戦してごらん、尻拭いはするから」という、一定の責任者が持つ背中押しの精神。
* Follow me
　「引っ張るからついてこい」という牽引する精神。

このような感じで、ここから自分の環境と照らし合わせて納得したのは

「有事はフォローミー、平時はアフターユー」

なるほどなるほど。確かに有事に「やってごらん」ってなんかアンマッチ。

ちなみに、上の説明文で、
書いてみると説明の文字数に差がありすぎるだろう、と思ったわけですが
私も一定マネジメントを職とする身として、After youで組織の成果を
最大化する考え方を使うことが多かったと感じていて、それもあってか説明に明確に
「責任者が持つ精神」という書き方をしました。

一方で、フォローミーのユースケースが有事を思い浮かべたので
危機感のある状況下で誰が引っ張るのか、ぶっちゃけ誰でも引っ張れる人が
引っ張るべきだよなー、と思ったのでこちらの説明には「誰が」というのを
明示しませんでした。

## Follow meを発揮してみてリーダーシップを磨いてみよう

説明文が短いのは、私の理解がまだまだ浅い結果かもしれませんが、
まさに誰がフォローミーを発揮してもいいんだ、ということなんだとは思います。

また、もう1点。
大人は経験して成長するものだとよく言われますが、では機会はどれほどあるのかと思った時に
有事、と言うとサービスの事故が起きた時を思い浮かべますが、
私は敢えて「危機感のある状況下」と表現しました。

日々プロジェクトを進める中でも危機感を感じる状況ってあると思うんですが、
つまり読者の皆さんに問いかけたいのは、
After youとFollow meの境界線、Follow meを発揮すべき状況、危機感を感じる状況
というのは、意外と日常的なものではないでしょうか？　ということです。

日々プロジェクトを進める中で起きうる様々な障害たちに対して
1つ1つどういう姿勢で解決するか、ということですね。

## まとめ

リーダーシップを早く磨くための1つの手段として、
Follow meとAfter youの境界線を考えると、
いかに日々の違和感をヤバいと思ってアクションするか、
そしてそれは誰でも機会があること。

つい最近、日本はカタールW杯で盛り上がりましたね。
私は、サッカーに精通しているわけではありませんが、今回ほどチームの意思統一や
マネジメントとしての監督やコーチ陣の力を意識して見たことはなかったかもしれません。
きっと、監督が選手の自主性を尊重しつつ統一した戦術を定めることが
チームの基盤なんだと思いますが、
その上にピンチやチャンスがやってきたときに、個のチカラで、
選手が周囲の2-3人を引っ張って結果に結びつけていく、
チームキャプテンとは違った１つの１つのプレーにおけるリーダーシップだったり、
ハーフタイムに檄を飛ばして締めるマネージャーのリーダーシップ、
なんてものもあったのだと思います。
チームも生きものですね。

ということで、みなさん、日常のヤバいものを血眼になって探して（笑）
解決を牽引してみましょう。

それが、最終的には自立型組織をみなさんが体現する糧になるでしょう♪
[CICD#1]CentOS7のコンテナにansibleとgitlab-runnerをインストールする ※現在（2022/11/29時点）作成中

gilab+ansible+gitlab-runnerでITインフラのCI/CDを実現するプロセス
※環境構築も本記事も絶賛作成中

# 環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408313/e2ab6d8e-4640-051b-ee2c-4ae670309bc2.png)

- ホストOS（EC2）
    - OS：Amazon Linux（Dockerをinstall済み）

- コンテナ１
    - OS：CentOS7
    - installed：gitlab

- コンテナ２
    - OS：CentOS7
    - installed：git（v2.31.0）
    - installed：ansible（core v2.14.0）
    - installed：gitlab-runner

- ansible実行環境
    - Python3.9.2
Q.padding・marginってなんなの？

一か月に5回は調べてるような気がするのでまとめた。

# 結論
* どちらも要素の**余白**を表す
* 要素の輪郭を隔てて、**marginは外、paddingは内**

なんか節分みたいでいいですね。marginは外、paddingは内。
それは置いといて。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/183e9de4-11f9-d7bc-19aa-d38664f538e2.png)

実線がいわゆる要素の輪郭、内側の破線がpaddingの輪郭、外側がmarginの輪郭です。
イメージとしては、paddingは内に押し込む感じ、marginは外側に幅をとる感じ。

<details><summary>ちなみに</summary>
上の画像のなかで、「width」「height」にあたる部分はどの線でしょう？

...

...

...

正解は、 **もっとも内側の点線** です。
躓きがちですが、 **要素の輪郭** にはならないんですね。

...しかし、直感的には「要素の輪郭 = width, heightが表す」のほうが素直です。

そんなときは`box-sizing:border-box`を指定してあげましょう。
これで要素の輪郭が基準となるように変更されます。やったね。

参考：[【CSS】marginとは？paddingとは？両者の違い・使い分けについて](https://csshtml.work/margin-padding-chigai/#:~:text=margin%E3%81%A8padding%E3%81%AF%E6%80%A7%E8%B3%AA%E3%81%8C%E4%BC%BC%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E9%81%95%E3%81%86%E9%83%A8%E5%88%86%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%20margin%E3%81%AF%E3%83%9E%E3%82%A4%E3%83%8A%E3%82%B9%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81padding%E3%81%AF%E4%BD%BF%E3%81%88%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82,%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E8%A6%81%E7%B4%A0%E3%81%8B%E3%81%A4width%E3%81%8C%E8%A6%AA%E8%A6%81%E7%B4%A0%E4%BB%A5%E4%B8%8B%E3%81%AE%E5%A0%B4%E5%90%88%E3%80%8Cmargin%3Aauto%E3%80%8D%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%A8%E5%B7%A6%E5%8F%B3%E4%B8%AD%E5%A4%AE%E5%AF%84%E3%81%9B%E3%81%AB%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%20%E4%B8%80%E6%96%B9paddng%E3%81%AB%E3%81%AFauto%E3%81%A8%E3%81%84%E3%81%86%E5%80%A4%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%20margin%E5%90%8C%E5%A3%AB%E3%81%8C%E3%81%B6%E3%81%A4%E3%81%8B%E3%82%8B%E3%81%A8%E5%90%B8%E5%8F%8E%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81padding%E3%81%AF%E5%90%B8%E5%8F%8E%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82)

</details>

# 使い分け
## padding
* 枠線とその中身との位置を調節する

「余白」と聞くと「ふたつの要素の距離感を調節するモノ」ってイメージが大きいけど、この場合は **「枠線と中身の距離感を調節するモノ」** っていうイメージがいいかも。

## margin
* 他の要素との距離感を調節する

こちらは本来の「余白」のイメージ通り。
要素-要素 の距離感だけでなく、**ページ内の要素の位置**を決定するときもここをいじります。
【Git】Gitでよく使うコマンド メモ

Git初心者なのでよく使うコマンドをまとめておく

お試しでローカルリポジトリに`command.txt`をファイルを作った

#### add
ステージエリアにファイルを追加するコマンド
```
$ git add . #カレントディレクトリ配下すべてをadd
$ git add <ファイル名> #ファイルをadd
$ git add <ディレクトリ名> #ディレクトリをadd
```
```
#　作ったファイルをadd
$ git add command.txt
```

#### commit
作成したファイルをGitに登録するコマンド
```
$ git commit #commit
$ git commit -m "メッセージ" #ファイルをメッセージ付きでcommit
```

```
$git commit command.txt
```
COMMIT_EDITMSGファイルが表示されるので最上部行にコメントを追加する
```
command.txtの追加　←コメント
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Your branch is ahead of 'origin/master' by 3 commits.
#   (use "git push" to publish your local commits)
#
# Changes to be committed:
#	new file:   command.txt
#
```

#### status
現在の変更情報を確認することができるコマンド
```
$ git status
On branch master
Your branch is ahead of 'origin/master' by 4 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
```
先ほどcommitしたのでコミットするものはないよと表示されました。

#### push
リモートリポジトリのブランチ履歴を更新するためのコマンド
```
$ git remote add origin https://github.com/user/repo.git
# http~以降は自分で作成したリポジトリのURL
```
今後はoriginという名前でリポジトリにアップしたり取得することができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/70d84b03-b07e-21b2-d6b9-633d87bde6b4.png)

```
git push <リモート名> <ブランチ名>
```
```
git push origin master #初回のpushはgit push -u origin master
```
詳しくは[git pushのオプション -u とは](https://qiita.com/shumpeism/items/1b8027c8905ca826416d)
知ってて良かった！ゲーム検証の事前知識


# ご挨拶

皆さまこんにちは！
AIQVE ONE株式会社の@soulgemです。
AIQVE ONE ゲームテスト/QA Advent Calendar 2022、6日目は私が担当させていただきます。

私は2022年3月に入社しました。約9か月経ったのかと改めて時の流れをしみじみと感じます。前職では「英会話スクールのスタッフ」というゲーム業界とはまったく無縁の環境で働いておりました。去年の今頃、子ども達の面倒を見ながらひたすら営業の電話を掛けていた日々を思い出します。

業界歴が浅く、技術的なお話ができないため、私からは**知っていて良かった！と感じた事前知識**について書かせて頂こうと思います。あくまで私個人の話となりますので、参考にならないことも多いかと思いますが…………初めてゲームテスターを経験した感想や、この期間の振り返りを兼ねてお話していきたいと思います。

## ソーシャルゲームの“勝手”が分かる
触れた事のないタイトルだったとしても、スマホゲームを普段プレイしているかどうかで仕様把握の効率が大きく変わってくると感じました。

### 世の中にどんなタイプのソーシャルゲームがあるかが分かる
リズムに合わせてノーツを叩く**音ゲー**、ひたすら周回してレベルを上げていく**育成ゲー**など…………RPGひとつとっても**タワーディフェンス**であったり**コマンドバトル**であったりと形式は様々です。

ある程度ソーシャルゲームをやり込んでいると「今回担当のゲームは○○と近い構造か」とパターンの把握が即座に行えます。UIの飲み込みもスムーズにできると感じました。逆に、普段触れる機会の少ない海外産のゲームを担当した際、UIに馴染みがなく進めづらいといった事例も起こりました。

### ソーシャルゲーム上の“あるある”を知っている
同じカードや素材によって**覚醒**が行える、コストを消費して**スキルツリー**を伸ばしていく、仲間が集う**ギルド**や**クラン**がある、**ステップアップガチャ**や**ボックスガチャ**があるなど、多くのゲームで登場頻度の高いシステムを最初から理解しておくとすぐ検証に取り掛かることができます。

また、「こう操作した時はこうなる方が良心的」「一般的なソーシャルゲーム基準からすればここが変」「ここに負荷がかかりやすい」といった、**ユーザビリティ観点からの指摘**がしやすくなります。

## 仕事上役に立った知識、役立つかもしれない知識

### PC操作、Googleドライブの扱い
ショートカットキーは勿論、動画圧縮やアクセサリの活用などパソコンに対する知識が役立ちました。私はあまりパソコン知識に明るい方ではありませんが、ある程度使い慣れておいて良かったと思っています。

### 自社が携わっているタイトルへの理解
自分が仕事で携わっているタイトル以外にも、今自社でどんなタイトルに携わっているかを知ることも大切です。ゲーム各種に加えて通話アプリや依頼サイト、VRプラットフォームなど、普段利用しているツールが多いため「あれもこれも自社がお手伝いしたんだ」と実績への具体的な理解が深まりました。中には毎日使っているサービスもあり、やりがいに繋がると感じます。

### 制作ソフトへの理解
Live2d cubismやAdobe CreativeCloud、Unityなどをはじめとした制作ソフトに触れておくことで、仕様把握の円滑化や案件獲得に繋がるのではと考えています。



## おわりに：これからゲームテスト業界に入るなら

業界のことや具体的な技術について、知識不足ではありますが、私が未経験でテスト業界に飛び込んだ際に感じたことを書き連ねてみました。もしゲームテスターが気になる！という方がいらっしゃれば、まずは**色々な種類のゲームに触れてみる**ところから始めるといいかもしれません。
JSTQBの取得やテスターとしての技術力向上に向け、今後はより専門的な知識をつけていきたいです。

ここまでお読みいただきありがとうございました！
【D】Dropboxのファイルを直接参照したい

Dropboxにぶん投げたファイルをHTMLで参照しようの会

## 正解

- 共有を有効にする
- `https://www.dropbox.com/s/xxxxxxxx/example.jpg?dl=0`みたいなURLが共有リンクでとれる
- `dl=0`を外して`raw=1`を入れる

```html
<img src="https://www.dropbox.com/s/xxxxxxxx/example.jpg?raw=1">
```

## 補足

`dl=1`にすると自動ダウンロードリンクになる。これはこれで使えそう。
Azure Bastion 共有可能リンクを試す

この記事は [セゾン情報システムズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/sisco) 1日目の記事です。

Azure Bastion shareable links（共有可能リンク）が[パブリックプレビュー](https://azure.microsoft.com/en-us/updates/azure-bastion-shareable-links/)で使えるようになったので試してみました。

# Azure Bastion作成
* Azure PortalからBastionを作成します。Basicでは使えない機能なのでStandardで作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/f9156477-18be-defc-953e-962e4f080367.png)

* [詳細設定]で[共有可能なリンク]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/8e28a8be-af81-71b6-2b60-dfa1d4743013.png)

* 上記設定でBastionを作成します。

* 既存のBastionの場合は、[構成]から有効化が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/30cef34b-8a8d-850f-07c9-8dfd7b53e1b5.png)

* 有効化されると左メニューに[共有可能リンク]が表示されるので、[追加]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/af77ebd0-6abe-dbc7-6bc6-15bc459f914a.png)

# 共有可能リンク作成
* 接続したい仮想マシンが配置されたリソースグループを選択し、接続したい仮想マシンを選択します。今回はWindows ServerとLinuxの2つを選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/228310b9-1233-4513-698f-6169f9942bff.png)

* 共有リンクの作成は数秒で終わります。作成されると共有リンクが払い出されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/2e63203b-5fe9-8f94-f46b-8ececd1e93dd.png)

# 共有リンクアクセス
* 共有リンクにアクセスするとブラウザに以下の画面が表示されます。OSユーザーのIDとパスワードを入力することで、いつものBastion画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/d928a5b7-3469-d763-2cb9-753c517c9b16.png)

* Linuxでも同様にブラウザからアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/d25912ff-efb6-f6d0-8f3d-f95e99bcff10.png)

* LinuxはパスワードだけでなくPrivate Keyを使ってのアクセスも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/4e62e8c4-fc15-c3f8-07eb-55540864748c.png)

# vNet Peering先の仮想マシンへの共有可能リンク
* 公式ページには ```現在、共有可能リンクは、ピアリングされた VNet ではサポートされていません``` と記載がありましたが、共有可能リンクを作成するときの以下画面では利用可能と記載があったため試してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/98813c44-1349-20d1-f8e9-103c29431e01.png)

* 試したところvNet Peering先の仮想マシンへも共有可能リンクは追加でき、ブラウザ経由のBastionアクセスが可能でした。

* 同じvNet、Peering先のvNet以外の仮想マシンへも共有可能リンクは追加できますが、リンクにアクセスするとネットワークエラーとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/2b7313e5-b937-c26b-862f-bea517281e4d.png)

# セッションや監査ログ
* 共有可能リンクでのアクセスでもセッションは表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/3b709751-5343-1544-d296-2de6005954f0.png)

* 診断設定のAuditログも問題なく記録されていました。

# まとめ
* 共有リンクを使うことでAzure Portalにログインすることなく仮想マシンにアクセスすることができる新機能でした。
* 便利な一方、一度Azure Portalへのログインを挟むことでセキュリティを高めているという事実もあります（特にAzure AD多要素認証を使っている場合など）
* セキュリティ面と利便性を考えたうえで有効化を検討する機能かなと思います。

以上
【C】calc()でどうにかするCSS

「だいたいcalcで調整すればなんとかなる」という良くない気がする考えに行き着いた。

## 問題

```html
<body>
    <div class="itemList">
        <!-- youtubeの動画一覧みたいなものを作りたい！ -->
        <div>
            この中に色々
        </div>
        <div>
            この中に色々
        </div>
        <div>
            この中に色々
        </div>
        <div>
            この中に色々
        </div>
    </div>
</body>
```

```css
body {
    width: 100%:
}
div.itemList {
    width: 100%;
    display:flex;
    flex-wrap: wrap;
    flex-direction: row;
}
div.itemList > div {
  width: 50%;
  margin: 10px; /* 10pxくらい隙間を開けておきたいな！ */
}
```

![スクリーンショット 2022-11-29 10.15.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599149/ae949c43-a12c-98ca-0182-374a2fce9967.png)

どうして……？

## 原因

- `div.itemList > div`はそれぞれ`50% + 20px`とってる
- ……ので、2つ横並びにしようとすると`100% + 40px`となり40pxオーバーするので横には並ばない

じゃあwidthを`50% - 20px`にすればいいな〜そういう指定方法ないかな〜 → **ある**

## 解決

```css
div.itemList > div {
  width: calc(50% - 20px);
}
```

CSSは関数が使える。`calc(値 演算子 値)`。
演算子は`+-*/`があり、`*`ならどちらか、`/`なら右側の値が数値でなければならない。
また、`+-`の場合は演算子前後にホワイトスペース必須。

## 参考

値3つ以上を演算したいときは入れ子にする

```css
calc(10vw + 10% + 10px); /* これはだめらしい */
calc(10vw + calc(10% + 10px)); /* こういうのはいいらしい */
```

でも見づらくなるから多用するのはよくなさそう。

https://developer.mozilla.org/ja/docs/Web/CSS/calc
サクッとメールを送る、"Mailer"

[Symfony Component Advent Calendar 2022](https://qiita.com/advent-calendar/2022/symfony-component)の11日目の記事です。

## 最初に
[Symfony](https://symfony.com)はPHPのフレームワークのひとつです。しかし、公式サイトの説明文には

> Symfony is a set of PHP Components, a Web Application framework, a Philosophy, and a Community — all working together in harmony.
  （SymfonyはPHPコンポーネントのセットで、Webアプリケーションフレームワークで、哲学、そしてコミュニティです。それらがハーモニーを奏でながら動作しています。）

と書かれている通り、PHPコンポーネントのセットで、たくさんのコンポーネントを提供しており、それらを組み合わせてひとつのフレームワークとして動作しています。Symfonyのコンポーネントは、Symfony上だけで動作するのではなく、他のPHPフレームワークやアプリケーションでも動作している強力なものが揃っています。

今回はそれらの中から、役立ちそうなもの・お薦めしたいものを紹介していきたいと思います。

※記事内ではautoloadのインポートは省略します。


## サクッとメールを送る、"Mailer"

[Mailer](https://symfony.com/doc/current/mailer.html)は、メールを送るコンポーネントです。以前は[SwiftMailer](https://symfony.com/doc/5.2/email.html)というのを利用していましたが、5.3からはこのMailerが使われるようになりました。Symfony以外でも動作しますし、Laravelのメール送信機能もこのMailerを使っています。

### インストール

```shell
composer require symfony/mailer
```

#### DSNの設定

Mailerを使う際、DSNを設定する必要があります。Mailerインストール時に`mailer.yaml`が以下のように作成されます。

```yaml:config/packages/mailer.yaml
framework:
    mailer:
        dsn: '%env(MAILER_DSN)%'
```

よって、`.env`の`MAILER_DSN`に利用したいDSNを設定します。

```text:.env
# SMTPの場合
MAILER_DSN=smtp://{ユーザ名}:{パスワード}@{SMTPホスト}:{ポート}

# sendmailの場合
MAILER_DSN=sendmail://default

# php.ini準拠の場合
MAILER_DSN=native://default
```


他にも[いくつかDSNが用意されています](https://symfony.com/doc/current/mailer.html#using-a-3rd-party-transport)が、それぞれ追加のコンポーネントをインストールする必要があります。


### メールの送信

メールの送信はいたって簡単で、`Email`オブジェクトを作り、各プロパティの設定を行った後で、`Mailer`オブジェクトで送信します。

```php
    public function create(MailerInterface $mailer): Response
    {
        $email = new Email();
        $email
            ->from('Fromのメールアドレス')
            ->to('Toのメールアドレス')
            ->text('メール文言')
            ->html('HTMLメール文言')
            ->attachFromPath('ファイルパス', 'ファイル名', 'MIMEタイプ') // 添付ファイル
        ;
        
        $mailer->send($email);
    }
```

### Twigの利用

[Twig](https://qiita.com/ippey_s/private/a81cf9980ed0f8c63a3e)を利用している場合、`TemplateEmail`クラスを使うことで、テキスト・HTMLメール文言のテンプレートからメール文言を作成することができます。

```php

$email = new TemplateEmail();
$email
    ->htmlTemplate('email/registered.html.twig') // HTMLメール文言
    ->textTemplate('email/registered.txt.twig') // テキストメール文言
;
```

## まとめ

今回はMailerを紹介しました。メール送信機能なので、他のライブラリと大きく違うところはないですが、Symfonyでは必要な箇所にサクッと注入できて便利です。他にもマニアックな機能があったりするので、ぜひ公式ドキュメントをご覧ください。
iosブラウザでカメラを使う時詰まったのでメモ

localhostでブラウザカメラを使うwebアプリを開発していて、スマホ実機から見たくなったので試してみると、カメラが動かなかった。

``` js
navigator.mediaDevices.getUserMedia()
```

をしてもユーザーにカメラの許可を求める部分がでてこなかった。


<h2>解決方法</h2>

結論からいうと、localhostをhttpsで通信するようにしてサーバを立ち上げれば上手くいった。

secretkeyが入ったpemを使いhttpsで立ち上げるようにすれば良い。


詳しくは別途調べてみてほしい。
Raspberry Pi 4でProcessingをつかって音声再生しようとしてハマったメモ

そもそもラズパイでP5を動かすというマニアックな話なのですが、
ちょっとハマったので備忘録として。

# ハマったこと

## ① minimの限界

当初、minimで実装をしていたのですが、AudioPlayerを2つ以上持つと、3つ目以降の音声ファイルが再生されなくなりました。

## ② Sound library on RPi4 動かず

その後、P5純正のSoundライブラリにreplaceを試みたのですが、音声再生がそもそもされず。

調べてみると、下記のissueで「pulseaudio, gstreamer1.0-pulseaudio」をaptで入れたらいいよ〜と書かれていてインストールしてみたのですが、動かず。
    
https://github.com/processing/processing-sound/issues/49

## ③ そうだ、nativeのaplayを使えばいいのでは？

P5ではProcessBuilderを使えば外部プログラムを実行できるので、試してみたところ、複数ファイルでも動くように！

# 実装

## 1. 簡単に音声再生したい(音声ファイルが2つまでであれば問題なく動きます)

```java:minimSample.pde
import ddf.minim.*;

final String AUDIO_FILES_PATH[] = {
  "/home/pi/soundPlaySample/data/se_01_2022.wav",
  "/home/pi/soundPlaySample/data/se_02_2022.wav",
};

Minim minim;
AudioPlayer players[];

void settings() {
  size(160, 120);
}

void setup() {
  minim = new Minim(this);
  players = new AudioPlayer[AUDIO_FILES_PATH.length];
  for (int i=0;i<players.length;i++) {
    players[i] = minim.loadFile(AUDIO_FILES_PATH[i]);
  }
}

void draw() {

}

void mouseClicked() {
  int soundIndex = (int)random(100) % AUDIO_FILES_PATH.length;
  soundPlay(soundIndex);
}

void soundPlay(int _soundIndex) {
  println("soundPlay: " + _soundIndex);

  players[_soundIndex].rewind();
  players[_soundIndex].play();
}
```

## 2. ProcessBuilde経由でaplayをつかって音声再生をする

```java:soundPlaySample.pde
import java.lang.ProcessBuilder;

final String AUDIO_FILES_PATH[] = {
  "/home/pi/soundPlaySample/data/se_01_2022.wav",
  "/home/pi/soundPlaySample/data/se_02_2022.wav",
  "/home/pi/soundPlaySample/data/se_03_2022.wav",
  "/home/pi/soundPlaySample/data/se_04_2022.wav",
};

ProcessBuilder pb = null;
Process p = null;

void settings() {
  size(160, 120);
}

void setup() {

}

void draw() {

}

void mouseClicked() {
  int soundIndex = (int)random(100) % AUDIO_FILES_PATH.length;
  soundPlay(AUDIO_FILES_PATH[soundIndex]);
}

void soundPlay(String _filePath) {
  println("soundPlay: " + _filePath);

  ArrayList<String>args = new ArrayList<String>();
  args.add("aplay");
  args.add("--device=sysdefault:CARD=Headphones");
  args.add(_filePath);

  // ここでpb,pが生きてたら殺す処理入れないといけない？かも？

  pb = new ProcessBuilder(args);
  try {
    p = pb.start();
  }
  catch(Exception e) {
    println(e);
  }
}
```

# 良かったこと

nativeで音声再生をすることになったので、minim経由で動かすより多少負荷が下がった印象がある。
※ ベンチマーク取ってるわけじゃないので、体感ですが。。

複数の音声再生してもちゃんと動く！

※ そもそも、RPi4でP5を動かす需要が少ないので、別の方法を試すべきなのではというのは言わないお約束。
マネジメントtips:期待値の調整を恋愛に例えてみた

![24445844_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/79c98f9c-1bdf-2e2d-06c6-edb36aaea6ba.jpeg)
人間関係の中で注意しておく必要があるのが、期待値です。相手との会話、やり取りで期待値がどこにあるのかを注視しておく必要があります。
期待値が高ければ高い程、結果も高く求められます。逆に、期待値が低い状態の場合、結果が少しでも良いと、評価が上がります。

# 期待値を恋愛に例えてみた
恋愛で考えると非常に分かりやすいのです。
最初、情熱的に盛り上がると相手に対して、沢山の期待をしてしまい。ちょっと期待と外れてしまうと、とても残念な気持ちになる。逆に最初から想っても無い状態から始まると、ちょっとした出来事で感動したり、喜んだりという事になる。第一印象が悪いと、加点ばかりでドンドン良くなる奴です。

```
彼氏：これプレゼント！
彼女：嬉しい！これ欲しかったの！
彼氏：それは良かった。
彼女：でも今日は、誕生日でも何でもないのに、どうしたの？
彼氏：君の笑顔がみたいからだよ
彼女：こんな事してくれと思ってなかったから余計に嬉しい！
```
これは期待値が低かったので、効果が高かったパターン。いわゆるGAP(ジーエーピー）です。
```
彼氏：明日レストラン予約した！
彼女：私の誕生日！ありがとう！
レストランにて
彼女：美味しかった！ありがとう！
彼氏：良かった、じゃー帰ろうか。
彼女：あれ？プレゼントは？
```
これは、期待値が高くなってしまってる、駄目なパターン。

# 期待値の調整を常に意識しよう
マネージメントにおいて、この期待値の調整は、重要なメソッドとなります。
メンバーの中で育って欲しいメンバーや、成功して欲しいプロジェクトを担当しているメンバーには、沢山の期待している事を話してあげましょう。そうすると、メンバーは、その期待を感じて、成功に向かって頑張ってくれます。
逆にメンバーへの期待が過度に高い状態だと、期待値とのギャップから良く無い所が気になって仕方ありません。従って、メンバーに対しては期待値が高いと伝えながら、自分の中の期待値はある程度抑えておく必要があります。
評価にも期待値を下げた状態で好評価するとGAPで喜ばれますが、期待値を上げすぎると、評価が足りてないと残念な状態にさせてしまいます。
上手に期待値をコントロールしましょう。
# お願い
今後も続けていきますので、フォロー、イイね、シェアお願いします。
下記、説明会もご参加下さい。
[エンジニア年収アップ講習(転職サポート付き！)　無料説開会　12月6日　19時開催](https://cto-can-be.hp.peraichi.com/)
Twitterのユーザー名を非表示にするブックマークレットの紹介

# 概要
PCのブラウザ版Twitterの画面左下にあるアイコンとかユーザー名を非表示にするブックマークレットを作った
実行すると単純にユーザー名とアイコンが消える
ページを再読み込みすると元に戻る
ちなみに本来ボタンがあったところをクリックすると普通にアカウント切り替えボタンとして動作する
ブックマークレットの使い方に関してはググればいくらでも解説が出てくるのでここでは省略する
なお、全画面表示の状態のChromeでの使用を想定している

# ソースコード
2024/01/07追記 : Twitterの仕様変更により取得するdiv要素のクラス名が変更された為、現在の使用に合わせてソースコードを更新した

URL欄へのコピペ用 : 
```JavaScript
javascript:(function(){const account_menu=document.getElementsByClassName("css-175oi2r r-1awozwy r-sdzlij r-6koalj r-18u37iz r-xyw6el r-1loqt21 r-o7ynqc r-6416eg r-1ny4l3l");account_menu[0].innerHTML="<div id='newdiv'></div>";})();
```
インデント済み : 
```JavaScript
javascript: (function () {
    const account_menu = document.getElementsByClassName("css-175oi2r r-1awozwy r-sdzlij r-6koalj r-18u37iz r-xyw6el r-1loqt21 r-o7ynqc r-6416eg r-1ny4l3l");
    account_menu[0].innerHTML = "<div id='newdiv'></div>";
})();
```
【RUBY】FizzBuzz問題

# はじめに
プログラミング初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。

# 概要
スクールの問題でFizzBuzz問題というものが出てきて、かなり有名なプログラミングの問題ということでした。
まず、1〜100までの数字をターミナルに出力して、「3の倍数」のときは数字の代わりに文字列でFizzと、「5の倍数」のときはBuzz、3と5の倍数である「15の倍数」のときはFizzBuzzと出力するというプログラムを作っていきます。

作るプログラムの雛形は下記↓
```ruby
def fizz_buzz
  # ここに処理を書き加えてください
end

fizz_buzz
```
条件の概要を整理すると、以下の４点でした。
・数字の1~100を出力する
・値が3の倍数のときだけ、"Fizz"という出力に置き換える
・値が5の倍数のときだけ、"Buzz"という出力に置き換える
・値が3と5の倍数のときだけ、"FizzBuzz"という出力に置き換える

ヒントとして、
・「〇〇の倍数」を導き出す時は剰余演算子を使う。
・条件を指定して繰り返し処理をする場合は、whileメソッドを使う。
# プログラムの実装

①まずは、1〜100までの数字をターミナルに出力するためのプログラムです
```ruby
def fizz_buzz
  num = 1
  while num <= 100 do
    puts num

    num = num + 1
  end
end

fizz_buzz
```
whileメソッドは、指定した条件がtrueである間ループします。
また、条件式がfalseになるまで処理を繰り返し行います。

②次に「3の倍数」のときは数字の代わりに文字列でFizzと、「5の倍数」のときはBuzzと出力します
```ruby
def fizz_buzz
  num = 1
  while num <= 100 do
    if num % 3 == 0    # 3の倍数のとき
      puts "Fizz"
    elsif num % 5 == 0    # 5の倍数のとき
      puts "Buzz"
    else    # それ以外のとき
      puts num
    end

    num = num + 1
  end
end

fizz_buzz
```
③そしてここに「15の倍数（3と5の倍数）」の時についての条件式を追加します。しかし、このまま下に追加してしまうと上記4行目の「3の倍数であるか」または6行目の「5の倍数であるか」という条件式が真になり、FizzまたはBuzzと表示されてしまいます。

したがって、if文の最初に「15の倍数」のときはFizzBuzzと出力する条件を追加します。
```ruby
def fizz_buzz
  num = 1
  while (num <= 100) do
    if num % 15 == 0    # 15の倍数のとき
      puts "FizzBuzz"
    elsif (num % 3) == 0    # 3の倍数のとき
      puts "Fizz"
    elsif (num % 5) == 0    # 5の倍数のとき
      puts "Buzz"
    else    # それ以外のとき
      puts num
    end

    num = num + 1
  end
end

fizz_buzz
```
別解としては、「15の倍数であるとき」の条件式をnum % 15 == 0からnum % 3 == 0 && num % 5 == 0のように置き換えることができます。
【A】aspect-ratioで縦横比を指定する

## 経緯

『この画像縦横1:1で表示させたいけど%だとwidthに合わせてheight指定するとかできないんだよな〜』

## 仕様

https://developer.mozilla.org/ja/docs/Web/CSS/aspect-ratio

「heightやwidthがautoのときに参考にする縦横比の値」だそうです。

## 実装例

webページのトップにあるみたいな横幅いっぱいの画像を作る

```css
.mainVisual {
    width: 100vw; /* widthかheightを片方指定した上で、もう片方はautoとかに。 */
    height: auto;
    aspect-ratio: 5 / 2; /* "横/縦"。数字1つのみを指定する場合は縦=1としたときの横。 */
}
```

その他、Youtubeの埋め込み(iframe)を囲うdivに`aspect-ratio: 16/9;`を指定しながら`width: 100%`をするとレスポンシブ対応しやすいはず。
[GPG] Exportした秘密鍵をimportせずに確認する方法

ExportしたGPG秘密鍵ファイルを**importせずに**確認したい場合は
以下のコマンドを実行します。

```bash
gpg --keyid-format LONG --show-keys (秘密鍵のパス)
```
※--keyid-formatオプションは先頭にする必要がある

# 出力例
```bash
$ gpg --keyid-format LONG --show-keys ./sub-61DCAFB6C3A05C56.key
sec   nistp521 2022-11-28 [SC]
      DDB4512F2A31C4C8C40C3BD02869380CAB350F42
uid                      Shion Ichikawa (Master) <shion1305@gmail.com>
ssb   rsa4096 2022-11-28 [S] [有効期限: 2023-05-27]
```

# 関連Tips
## Subkey秘密鍵のエクスポート方法
GPGKeyを使用する場合はMasterをまず作成しそのSubkeyを生成した上で
MasterKeyを安全な場所に保管し普段はSubkeyを使う方が良いそうです。
私は1つのMasterキーに対して複数のSubkeyを作成し、
デバイスごとにSubkeyを割り当てる、という運用をしています。
(正しい運用方法かわかりませんが...詳しい方コメントでアドバイス等頂けると幸いです)
1. Exportしたい秘密鍵のkeyidを特定
`gpg --list-secret-keys --keyid-format LONG`
1. keyidを指定してExport
`gpg -o (出力ファイル名) --export-secret-keys (keyid)!`
※`-o`オプションを先頭にする必要がある

### 実行例
```bash
$ gpg --list-secret-keys --keyid-format LONG
------------------------------------------------
sec   nistp521/2869380CAB350F42 2022-11-28 [SC]
      DDB4512F2A31C4C8C40C3BD02869380CAB350F42
uid                 [  究極  ] Shion Ichikawa (Master) <shion1305@gmail.com>
ssb   nistp521/2F286CB4629F9791 2022-11-28 [E]
ssb   rsa4096/61DCAFB6C3A05C56 2022-11-28 [S] [有効期限: 2023-05-27]
ssb   rsa4096/954BB364B07F0077 2022-11-28 [S] [有効期限: 2023-05-27]
ssb   rsa4096/E1C030555148F323 2022-11-28 [S] [有効期限: 2023-05-27]
ssb   rsa4096/3C1ECF447F0A2E98 2022-11-28 [S] [有効期限: 2023-07-26]

$ gpg -a -o sub-61DCAFB6C3A05C56.key --export-secret-subkeys 61DCAFB6C3A05C56!
```
Delphiが値上げするのでその前に買ってみた

# Delphiの値上げ
これまでは無償版のCommunity Editionを使用して開発をしていましたが、後に説明する理由で購入するかどうか迷っていたところ2022年12月1日で値上げをおこなうとのことで購入に踏み切りました。

https://www.embarcadero.com/jp/products/new-pricing-jp

# Delphiとは
Delphiといっても聞き慣れないものだと思いますが**Delphiとは開発環境を指します**
どんな言語で開発するのかというと**Object Pascal**になります。

# Pascalとは
Pascalは**ALGOL**をベースに開発された言語です。さすがにALGOLは掘り下げませんよ。

# Pascalの特徴
個人的にはコンパイラに優しい言語のように思います。
もうコンパイル速度なんて気にするような時代ではありませんが、当時は高性能なPCは非常に高価で安価な環境でPC用アプリを開発する時にコンパイルの速度は遅かったのです。
コンパイル作業はプログラマにとっては欠かせない物で何回も繰り返すのですから時間がかかるとストレスが溜まります。
3秒ぐらいから遅いと感じ、5秒ぐらいからストレスが溜まり始め、10秒かかっていたらコンパイル中に次の修正部分が追加で書けそうな遅さです。
そんな中で開発環境の出来の良さもありますが1秒でコンパイル出来ていたのがObject Pascalを採用した開発環境Delphiだったのです。

# Object Pascalとは
その名の通り、Pascalにオブジェクト指向プログラミングが簡単に出来るように仕様追加した物です。
後からオブジェクト指向を導入した言語の割りには他の言語と比較してもオブジェクト指向の良さを引き出せている言語になっています。
Delphi開発環境以外にも**Lazarus**という開発環境も出ています。

# Delphiとの出会い
当時はC++あたりとコンパイラが用意しているライブラリでなんとかWindowsのアプリが作れますよという時代でしたが、とても1人ですぐに取りかかれるものではありませんでした。
そのため開発が容易なVisualBasicが流行っていました。
もちろん筆者も購入したくさんのアプリの開発を行いました。
しかしどれも納得のいくものではありませんでした。
なにせ

- 開発環境が用意しているライブラリしか使えない
- 実行させる側にランタイムライブラリが必要
- 開発環境のテキストエディタが勝手に整形する

特にテキストエディタが整形するのでコメントを揃えていても勝手に崩れるのには何度もイライラさせられました。

そんな時に出会ったのがDelphiです。
当時はWindows95の時代でそのときにDelphi 3とか3.1がありました。
しかしDelphiは言語仕様がこれまでのどの言語とも異なるので理解が大変でした。

# Delphiと他の言語の違い
筆者は他の言語も扱えますが、どの言語とも異なるのがPascalの言語仕様です。
記述方法が独特すぎるのもハードルを挙げてしまっていることでしょう。

## 簡単な例

|  | 一般的な言語 | Delphi |
|:-:|:-:|:-:|
|宣言|int i,j;|i,j : Integer   |
|代入|i = 0;| i := 0|
|ループ   | for (i = 1; i <= 3; i++)|for i := 1 to 3 do begin end  |
| 関数  | int test(int x, int y){| function test(i,y : Integer) begin end  |
|変数の増加|i++|inc(i)

お薦めしておいてアレですが、非常に構文が長くなります
特に中括弧「{」の代わりがbegin endなのが長く感じます
代入も「=」ではなくて「:=」を使わないとだめです。

しかし最終的には他の言語よりも**プログラムを書く手間**は減っていきます。
最初のうちは大変で、進めていくうちに楽になっていく言語です。

# 結局の所Delphiってどうなの？
Delphiを使うことのメリットとしては

- 1人とかの少人数でも大規模なアプリ開発が可能
- 他のフレーム枠「.NET」などの影響を受けない
- EXEファイル1つで実行可能
- ライブラリを自作しておけば再利用性が高い

デメリットはものすごく大量にあります。

仕様のWebサイトは公式のがあるのでなんとかなるのですが
書籍がほぼ無い状態。
Android開発言語のKotlinとまあ同じぐらいに書籍がありません。
（JAVAとかと比べるのは止めておきます）

# Delphiを極めて行き着いたところは
20年間もの間Delphiを触っていてライブラリを増やしていった結果なんと
**プログラムを書かずにプログラムを作る**
というところまで行き着くことが出来ました。

そのおかげでプログラムの量は約半分に開発時間はこれまでの十分の一になっています。
気が向けばこれも公開します。

# Community Editionを止めて有料版にした理由
筆者は1つのアプリを作るとき20から30ぐらいの自作ライブラリをインクルードして使います。
これが規模が大きくなるとファイルがどんどん増えるのですが
インクルードファイルが160ぐらいになったところでCommunity Editionから警告が出るようになりました。
どうも有料版に移行しろということのようです。
無視してコンパイルは出来るのですが1手間かかるのは避けたい。
試しにインクルードファイルを減らしたところ警告が出なくなりました。
Community Editionの使用条件には書かれていないのですが大規模アプリの開発と判断されたのでしょう。

1つのアプリに1年間かけて作っているとこれぐらいの規模になります。

仕事用のPCには法人用として購入したDelphiが入っているのですが、
それとは別に趣味用のPCにも入れることになったというわけです。

# 終わりに
気が向いたらDelphiでのオブジェクト指向プログラミングとかも書いてみます。
飲食店検索サイトの情報をとってきてみよう -食べログ編-

## 概要

久々にスクレイピングで情報を取得するスクリプトを組みたくなったので組んで見る

## 言語
- ruby

## 使うライブラリ
- nokogiri
- mechanize

nokogiriはHTMLをパースする上では欠かせない子です。
net/httpで簡単なスクレイピングはできるがリダイレクトとかが発生する場合に難しいのでそのへんを簡単にやってくれるmechanizeを採用しました。

## 本題
スクレイピングの基本は
1. 通信内容の理解
1. コードに落とし込む

以上である。

### 1. 通信内容の理解

通信内容の理解ということで、基本的にサイトを訪れてデベロッパーツールを開いてNetworkタブを開きます。
そこで検索時にどんな通信が行われているのかを見てみます。
![スクリーンショット 2022-11-29 9.31.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/ffae714a-0f99-99de-5abe-afaa5f8fe827.png)
これがそうっぽいですね。

あとはこれをコードに落とし込むだけ

### 2. コードに落とし込む

#### ライブラリインストール
これをコードに落とし込むんですけど、まず最初に述べたライブラリを使うのでGemfileを作ってこんな感じに書きます。
```Gemfile
source 'https://rubygems.org'

gem 'nokogiri'
gem 'mechanize'
```
必要なのはこの２つなのでこれを記載した上で

```
bundle install --path=.bundle
```
を実行
なんで`--path`オプションをつけているかというとこれをつけないとグローバルに入っちゃってプロジェクトレベルの管理がしにくくなるからですね。

#### コーディング
これで準備ができたので実際のrubyのコードを書いてみましょう。

ファイル名は何でもいいのですが、crawler.rbとかにしましょうか

```rb
require 'uri'
require 'nokogiri'
require 'mechanize'
require 'kconv'

agent = Mechanize.new
area = '横浜'
keyword = 'たこ焼き'
page = agent.get("https://tabelog.com/rst/rstsearch/?LstKind=1&voluntary_search=1&lid=top_navi1&sa=%E5%A4%A7%E9%98%AA%E5%B8%82&sk=#{keyword}&vac_net=&search_date=2022%2F11%2F29%28%E7%81%AB%29&svd=20221129&svt=1900&svps=2&hfc=1&form_submit=&area_datatype=MajorMunicipal&area_id=27100&key_datatype=Genre3&key_id=40&sa_input=#{area}")

doc = Nokogiri::HTML.parse(page.body.toutf8, nil, 'utf-8')
puts '###ページタイトル取得###'
puts doc.title

puts "\n###検索ワード取得###"
puts doc.css('h2 strong').text


puts "\n###お店の名前を取得###"
doc.css('.list-rst__rst-name-target').map do |target|
  puts target.text
end

```

細かいコードの解説はこの記事ではしません。
実行結果はこんな感じになるかと思います。

```
###ページタイトル取得###
横浜市でおすすめの美味しいたこ焼きをご紹介！ | 食べログ

###検索ワード取得###
横浜市のたこ焼きのお店

###お店の名前を取得###
串カツ田中 綱島店
お好み焼き さ介
お好み焼ポン吉 本店
築地銀だこ モザイクモール港北店
ごっつええ本舗 CIAL横浜
めりけんはとば
じゃんぼ総本店 ジャンボ酒場  綱島駅前店
元天ねぎ蛸 MARK IS みなとみらい店
ポッポ 立場店
梅鉢流まみい
tacobe
築地銀だこ ウィング上大岡店
築地銀だこ まるい食遊館戸塚店
ドルフィン
お好み焼き ころんぶす 石川町北口駅前店
銀だこ酒場 新横浜店
たこ焼一久
串カツ田中 横浜西口店
60Hz
ポッポ ららぽーと横浜店
```

「横浜」「たこ焼き」で検索した結果がこんな感じで取得できます。
なにかに使うことがあれば...
microCMS + React に highlight.js を適用させたときの話

こんにちは！クリスマスがやってきますね:santa_tone2::evergreen_tree:

アドカレ3日目は、microCMSのリッチエディタへ書かれたコードに（まるで街のイルミネーションのように）色をつけたく、言語に合わせてハイライトを入れたときのことについて書いていきます。

※ この記事では、microCMS、React、nodeモジュール(html-react-parser、highlight.js)を扱っています。

<h2>microCMSのリッチエディタに書かれた文章について</h2>
リッチエディタ（コンテンツを入力するフィールドの一つ）に文章を入力して、その記述を取得すると文字列になったDOMが返ってきます。

例1）
入力時：こんにちは
取得時：`<p>こんにちは</p>`

例2）
入力時：
```
p { color: #555; };
```
取得時：`<pre><code>p { color: #555; };</code></pre>`

<h2>取得した文字列をパースする</h2>
ハイライトをつける前に、文字列ではなくDOM要素として扱ってもらうためにパースします。パースしない場合、文字列としてそのまま表示されることになます。<br /><br />



直接文字列を入れてパースする例
```react
// 画面表示されるもの → Hello, World!
import parse from 'html-react-parser'
parse('<p>Hello, World!</p>')
```

microCMSから取得した文字列をパースしたときの例
```react
// contentHTMLにmicroCMSのリッチエディタから取得した文字列が入っている
import parse from 'html-react-parser'

export default function ConvertText({ contentHTML }) {
  const contentReact = parse(contentHTML)
  return <>{contentReact}</>
}
```

<h2>パースする記述の中でcode要素を検知する</h2>
リッチエディタでコードブロックを用いて記述したものは、code要素で囲まれます。そのcode要素であるDOMを検知することで、ハイライトする処理につなげます。

```react
import parse from 'html-react-parser'

export default function ConvertText({ contentHTML }) {
  const contentReact = parse(contentHTML, {
    // 以下で検知
    replace: (node) => {
      if(node.name === 'code') {
        // ハイライト処理を入れる場所
      }
    }
  })
  return <>{contentReact}</>
}
```

<h2>code内にハイライトを入れて、完成</h2>
code要素の子要素にhighlight.jsを適用させ、その適用させたDOM要素をパースします。以上でハイライトまでの処理は完成です。

```react
import parse from 'html-react-parser'
import hljs from 'highlight.js'
import 'highlight.js/styles/hybrid.css';

export default function ConvertText({ contentHTML }) {
  const contentReact = parse(contentHTML, {
    replace: (node) => {
      if(node.name === 'code') {
        const result = hljs.highlightAuto(node.children[0].data);
        const dom = parse(result.value);
        
        return (
          <code className='hljs'>
            {dom}
          </code>
        )
      }
    }
  })
  return <>{contentReact}</>
}
```
`highlight.js`
highlightAuto関数を用いて言語の種類を検知し、コードに色をつけるために要素とクラスを付与
`highlight.js/styles/hybrid.css`
コードに色をつける際のテーマ。使うテーマのみインポートする。テーマは公式サイト参照
公式サイト：https://highlightjs.org/static/demo/

<h2>〜 highlight.jsを使った理由 〜</h2>
そもそもコードブロックに記述する時点で何の言語か指定し、ブラウザでの表示時に自動で配色されると楽でしたが、microCMSには試していたときにはその機能はないことがわかったので、ハイライトをつけられる方法を探していました。そこでPrism.jsの使用を考えたのですが、何の言語か実装側で指定しないとスタイルをつけることができなかったので、どんな言語かわからないけど検知してハイライトをつけてくれるhighlight.jsにすることにしました。

<h2>最後に</h2>

何かのお役に立てたら幸いです、メリークリスマス！！:snowman:
[OpenText]データ取得で100件以上のデータが取得できない場合の対処

## はじめに
OpenTextのデータ取得をおこなうAPI作成中に取得条件のlimitを1000件に設定しデータ取得しようとしていましたが、何故か1000ではなく100に変換されてしまう事象が発生しました。
以下画像のようにPostManで確認してみるとlimitが1000ではなく100と表示されています。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699599/ff95f3e6-99d6-e718-81c6-cbf9f47f90cf.png)


## 原因
調べてみると、現在パフォーマンス改善のためにページあたり 100件取得に制限されているようでした。

## 解決
limitを最大数の100に設定し、取得したいデータの分割数である"page_total”を取得後
その回数リクエストを投げ格納するという方法に落ち着きました。

```java
public JSONObject getClassifiedItems(String objId) {
		JSONObject result = null;
		JSONObject infoObject = null;
		JSONArray itemList = new JSONArray();
		List<NameValuePair> params = new LinkedList<>();

            //limitを100に設定
			infoObject = httpGetJson("api/v2/classifieditems/?sort=asc_type&limit=100",
					new UrlEncodedFormEntity(params, "UTF-8"),
					getHeaders());

			// page数取得
			int pageCnt = infoObject.getJSONObject("collection").getJSONObject("paging").getInt("page_total");

           //page数分データを取得し、配列に格納
			for (int i = 0; i < pageCnt; i++) {
				String pageCntValue = String.valueOf(i + 1);

				result = httpGetJson("api/v2/classifieditems/" + objId + "?sort=asc_type&page=" + pageCntValue,
						new UrlEncodedFormEntity(params, "UTF-8"),
						getHeaders());

				JSONArray aitemList = result.getJSONObject("results").getJSONArray("contents");
				System.out.println("aitemList:" + aitemList);
		
				//取得したデータ格納
				for (int j = 0; j < aitemList.length(); j++) {
					itemList.put(itemList.length(), aitemList.getJSONObject(j));
				}

		JSONObject oItemList = new JSONObject();

		return oItemList;
	}
```

## 参考文献
[https://forums.opentext.com/forums/developer/discussion/309446/is-there-a-fixed-result-limit-via-rest](https://forums.opentext.com/forums/developer/discussion/309446/is-there-a-fixed-result-limit-via-rest)
箱ひげ図を表示する(SPSS Modeler データ加工逆引き10-10)

# 箱ひげ図を表示する（新グラフ）

![スクリーンショット 2022-11-11 15.22.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2b1f4853-3e7f-4dc4-a14d-7f42f8b2e82c.png)

## 1.想定される利用目的

・ばらつきのあるグループの比較


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/box_plot.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-11-11 15.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b00638d9-e9f2-0bd6-caa1-1024faf68aea.png)

入力するデータを確認するため[テーブル]を実行します。
![スクリーンショット 2022-11-11 15.28.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/42ee2b5c-1b99-9642-5b37-d7e052fe7dd0.png)

[グラフボード]ノードで従来の箱ひげ図を表示します。
![スクリーンショット 2022-11-11 15.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/346dc41a-b088-f27e-c149-652bd4c39fbc.png)

[値2]ノードを右クリックして[データの表示]を選択します。
![スクリーンショット 2022-11-11 14.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1ef9f2d0-77cb-20ba-4894-df147b7e4b05.png)

箱ひげ図を選択します。
![スクリーンショット 2022-11-11 15.12.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f5190606-5189-3399-6412-b5cf686e4ca7.png)

以下の画面左の設定に従いセットします。

![スクリーンショット 2022-11-11 15.19.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/219005a0-10ff-b8a1-039c-2aa5622db00d.png)

![スクリーンショット 2022-11-11 15.20.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6850fb1d-8903-8197-41aa-3694589f6ee3.png)

#### 注意事項

新グラフ機能はバージョン18.1以降で装備されました。

## 4.参考情報

#### 新グラフを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-04/

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
【技術書まとめ】HTML&CSS コーディング・プラクティスブック 3 実践シリーズ

引き続き、現在のCSSの基本を再確認するために本書を手に取った。


## 作成したデモサイト

https://spectacular-entremet-fec039.netlify.app/


## 全体のフォントをWindowsでは「メイリオ」、macOS/iOSでは「ヒラギノ角ゴ」にする

```css
body {
 font-family: sans-serif;
}
```


## after擬似要素を使って幅いっぱいの背景画像を表示する

```css
.header {
  position: relative;
}

.header::after {
  content: '';
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: -1;
  background-image: url(img/candy.jpg);
  background-size: cover;
  background-position: center;
}
```


## border-imageでsvg画像を指定して飾り罫を表示する

```css
.site {
  border: solid 1px currentColor;
  border-image: url(img/border.svg) 68 / 40px / 20px;
}
```

## デスクトップサイズで表示する場合のテキストの最大サイズを指定する

- モバイルでも間延びしたテキストにならないように設定したほうがいい

```css
@media (min-width: 768px) {
  .text {
    max-width: 567px;
    margin: auto;
  }
}
```


## 装飾は擬似要素で表現する

```css
/* コンテンツの視線誘導をする縦の罫線 */
.site::after,
.msg::before,
.msg::after {
  content: '';
  display: block;
  width: 1px;
  height: var(--whiteline);
  margin: 0 auto;
  background-color: #ffffff;
}

:root {
  --whiteline: 100px;
}

/* 本文前のアイコン */
.text::before {
  content: url(img/candy.svg);
  display: block;
  margin-bottom: 18px;
}
```


## モバイルでは2カラム、PCでは3カラム表示にする

```css
.photos ul {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  max-width: 452px; /* モバイルでの最大幅を指定しておく */
  margin: auto;
  gap: 15px;
}

.photos li {
  width: calc((100% - 15px) / 2); /* 間の余白を15pxにする */
}

@media (min-width: 768px) {
  .photos ul {
    max-width: 874px; /* PCでの最大幅を指定しておく */
    margin: auto;
  }

  .photos li {
    width: calc((100% - (20px * 2)) / 3); /* 3カラムだと2つ余白が入る */
    margin-bottom: 20px;
  }
}
```

## ヘッダー画像をフェードインで表示する

```css
.header::after {
  animation: fade 3s ease-in-out 2s backwards;
}

@keyframes fade {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
```
Azure Administrator(AZ-104)：Azure管理者向けの前提条件「リソースプロバイダーとリソースの移動」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「リソースプロバイダーとリソースの移動」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure 管理者向けの前提条件](https://learn.microsoft.com/ja-jp/training/paths/az-104-administrator-prerequisites/)
◇対応するモジュール
[Azure Resource Manager を使用する](https://learn.microsoft.com/ja-jp/training/modules/use-azure-resource-manager/)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure管理者向けの前提条件「リソースの管理方法」](https://qiita.com/fsd-jume/items/c750b8bce5fb63fcdff5)

## リソースプロバイダーとリソースの移動
### リソースプロバイダー
**ARMを使用してAzureリソースを提供するサービス**
⇒各プロバイダーはデプロイされたリソースを利用するための操作を提供
⇒リソースを使用する場合はサブスクリプションにリソースプロバイダーを登録する必要がある
・一部のリソースプロバイダーはデフォルトで登録済み
例)Azure PortalやARM、Azure ADなど
・多くのプロバイダーはリソース作成など特定のアクションを実行すると自動的に登録される

**◆リソースプロバイダーの例**
・「Microsoft.Compute」：VMリソースを提供
・「Microsoft.Storage」：ストレージアカウントリソースを提供
・「Microsoft.Network」：ネットワークリソースを提供

**◆リソースの種類の表し方
{リソースプロバイダー}/{リソースの種類}**
例)VMリソースの種類 → 「Microsoft.Compute/virtualMachines」
例)ストレージアカウントの種類 → 「Microsoft.Storage/storageAccounts」
例)VNetの種類 → 「Microsoft.Network/virtualNetworks」

**◆リソースに対する操作の表し方
{リソースプロバイダー}/{リソースの種類}/{操作内容}/・・・**
例)VMの新規作成や更新 → 「Microsoft.Compute/virtualMachines/write」
例)ファイル共有を削除 → 「Microsoft.Storage/storageAccounts/fileServices/shares/delete」　　
例)VNetを別のVNetにピアリング → 「Microsoft.Network/virtualNetworks/peer/action」

### リソースの移動
**新しいサブスクリプションや同じサブスクリプション内のリソースグループに移動可能**
⇒移動中は移動元と移動先のリソースグループがロックされる
⇒書き込み操作や削除操作が不可となり、リソースの追加/更新/削除ができなくなる
※リソースを使用することは可能

## 次の学習内容
**◆ARMテンプレートスキーマ**

https://qiita.com/fsd-jume/items/254134e3934ee6cd45d3

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
devise_token_authを使ってGETリクエストをすると/omniauth/sessionsへリダイレクトする

`http://localhost:3000/admin/auth/sessions`へGETリクエストをaxios経由で行うと、意図せず`http://localhost:3000/omniauth/sessions` へリダイレクトしてしまう。
以下がログ。
```
Started GET "/admin/auth/sessions" for ::1 at 2022-03-04 17:51:33 +0900
Started GET "/omniauth/sessions?namespace_name=admin&resource_class=AdminUser" for ::1 at 2022-03-04 17:51:33 +0900
  
ActionController::RoutingError (No route matches [GET] "/omniauth/sessions"):
```

こんなときはroute.rbを以下の通り変えてあげると解決する。
```diff_ruby:config/routes.rb
namespace :admin do
  mount_devise_token_auth_for 'AdminUser',
                              at: 'auth',
++                            skip: [:omniauth_callbacks],
                              controllers: {
                                registrations: 'admin/auth/registrations',
                              }
  namespace :auth do
    resources :sessions, only: %i[index]
  end
end
```
【Terraform】outputを使ってModule間で変数を共有する

Qiita Advent Callendar企画　[新卒エンジニアによる全部俺カレンダー2022](https://qiita.com/advent-calendar/2022/arie_onlyme2022)　3日目投稿記事です。

## 概要

TerraformでAWSリソースを新規作成する際、module間で変数を共有したい時がある。  
しかし、`terraform plan` 実行時、moduleから他のmoduleの値を参照すると...

```
module.xxx is a object, known only after apply
```

といったエラーが発生し、参照できない。

そこでoutputブロックを活用してmodule間で変数を共有できるようにする。

## outputを使ってみる
今回は例として、「ECSとCodeDeploy間で変数を共有する」という形でoutputを活用してみます。

ディレクトリ構成は以下の通り。
```
.
├── modules
│   ├── ecs
│   │   ├── outputs.tf
│   │   ├── variables.tf
│   │   └── main.tf
│   └── codedeploy
│       ├── outputs.tf
│       ├── variables.tf
│       └── main.tf
└── main.tf
```

① ECSのクラスターを定義

```modules/ecs/main.tf
resource "aws_ecs_cluster" "cluster" {
  name = "hoge-cluster"
}
```

② ECSのクラスター名をCodeDeployで共有するために、outputでクラスター名を共有
```modules/ecs/outputs.tf
output "cluster_name" {
    value = aws_ecs_cluster.cluster.name
}
```


③ main.tfでモジュールを定義
```main.tf
module "ecs" {
    source = "./modules/ecs"
}

module "codedeploy" {
    source = "./modules/codedeploy"
    # ここでoutputで定義した変数をcodedeployモジュールに渡す
    cluster_name = module.ecs.cluster_name
}
```

④ codedeploy側でvariableブロックを使用して、変数`cluster_name`を受け取るように設定する。
```modules/codedeploy/variables.tf
variable "cluster_name" {
  type = string
} 

```

⑤ ECSのクラスター名をcode deployモジュールで参照する

```modules/codedeploy/main.tf
resource "aws_codedeploy_app" "app" {
  compute_platform = "ECS"
  name             = "${var.cluster_name}-app"
}
```

これでECSとcodedeploy間で変数が共有できるようになり、問題なくplan/applyの実施・ECS/Code Deployの新規作成が同時に行えるようになります。


## 参考
https://developer.hashicorp.com/terraform/language/values/outputs

https://dev.classmethod.jp/articles/terraform%E3%81%AEmodule%E3%81%A8output/
新人はToDoリストの達人になれ -モブプロ開発を行っているチームでやっている取り組み-

# はじめに

本記事は[モブプロ開発を行っているチームでやっている取り組み Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mob_torikumi_example)の15日目の記事です

今回もチームで行っているユニークな指導として「ToDoリスト」を紹介します
え、ToDoリストくらいわかる？たしかにほとんどの方がToDoリストをつくられているかと思います。
新人の方も多くの方が作って仕事をしているのを知っています。しかしながら、そのToDoリストをプログラミングに落とし込んでもらうと多くの新人の方がうまくできません。
この能力を鍛えることで、実装力の向上や見積もり精度の向上、１人で実装する能力、テスト駆動開発の能力などが早く着くようになります

本当にいいとこどりなので、私のチームでは力を入れて取り組むようにしています

# Chapter#14 実装できる未来見えてる？

アール「テスト駆動開発やはり難しいですね」
ベープ「そうですね。何をまずテストすればいいのかすらわかりません」
アール「私なんて皆さんがやろうとしていることすら、なぜそれをいまテストで書いているのかわかっていないのでひたすら質問時間になってます」
じん「質問時間とることはまったく悪いことではないので気にしなくていいですよ」
ミュート「それに比べてじんさんは割とすらすらテスト書いている気がしますが、初めからそんな感じだったのですか？」
じん「いえいえ、最初は皆さんと同じでしたよ。テスト駆動も実装力も鍛えればすぐ向上します！」

アール「鍛えるってじんさんみたいに休日色々開発したりしないとってことですよね」
ミュート「いやー、時間とれないんだよね」
じん「いえいえ、そういえばそのお話してませんでしたね。やることは簡単です。質の高いToDoリストを作れるようになるだけです！」
ベープ「ToDoリストなら私も作ったことありますけど、システム開発でもやるんですね」
じん「では、まずは今回開発するログイン画面のToDoリストを皆さんに作ってもらいます」

こうして、それぞれが思い思いのToDoリストを書き始めた

# 質の高いToDoリストとは

今回は新人教育やテスト駆動開発を導入する際に最初にマスターしてほしい、システム開発における「ToDoリスト」について紹介します。
ToDoリストは皆さんが知っての通り、やるべきことを箇条書きにしたものです

そのToDoリストですが、私たちのチームでは実装する項目に対して粒度が小さいToDoリストを書くように心がけています

例えば以下の画面を作成するとします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/e6ae850f-6590-2df9-ee40-863b6587e2da.png)

これは簡単な動画アップロードのページになります。すべてReact(TypeScript)で実装する想定です。

ここで質の高いToDoリストが作れない方(新人やテスト駆動開発未経験者)は以下のようなToDoをつくります

- [ ] 動画アップロード画面を作る
- [ ] ボタンを押したらファイルが選択できる
- [ ] ファイルを選択するとAWSに動画をアップロードする

これではまったく実装する方法が伝わらないですし、テストを書こうとしたときに項目単位でテストをすることができません
私たちは少なくとも以下の粒度で書くようにしています(実際はさらに細かいです)

- [ ] カード作成
- [ ] タイトル配置
- [ ] ドラックドロップゾーン作成
- [ ] ボタン配置
- [ ] ボタンを押したらファイルが選択できるようにする
- [ ] ファイルを選択したらAWS SDKをAxiosで実行する
    - [ ] アクセスキーがなければエラーが出る
    - [ ] シークレットアクセスキーがなければエラーが出る
    - [ ] アップロード処理が始まったらローディングのスピンが出る
    - [ ] マルチパートアップロードを行う
    - [ ] 終わったらローディングが消える
        - [ ] 成功なら成功のメッセージを出す
        - [ ] 失敗ならエラーメッセージを出す

このようにコード単位で細かく何を実装するかをToDoに書くことで、項目単位でテスト駆動を行えます
また、1行ごとに工数を見積もることができるので大雑把な見積もりから卒業できました

そして新人にはなるべく最初のToDoリストを作らせるようにしています(アールさんは事前に書いてくれてました)
作成してきたToDoリストをメンバー全員で添削してから見積もりに入るのがプランニングの流れとなっています

このToDoリスト作成ですが新人にはなかなか難しいので最初はボロボロになったり、実装終わりまでが見えないという状況になりますが徐々にできるようになるはずです。
まさに成長です！！

今回はシンプルにはなりますが、システム開発においてのToDoリストについてのご紹介でした
始めは時間がかかりますが、メリットがとても大きいのとテスト駆動開発やモブプロには相性が良いのでぜひ試してみてください！

# おわりに

ToDoリストはいままでやった取り組みの中で身近でもやっているけど、真剣にやると効果が絶大だととても感じた取り組みでした
新人が初めに学ぶべきと個人的に思っているのは

- ToDoリストができる
- 検索ができる
- デバックができる
- 公式ドキュメントを読む力
- ショートカット

だと思っています。いまのところToDoしかこれをやれば能力向上できるというのが見つかっていないので今後も模索していきたいと思います
Windows用の便利ツールたち

- [Sysinternals](https://learn.microsoft.com/ja-jp/sysinternals/)
  - [RDCMan](https://learn.microsoft.com/ja-jp/sysinternals/downloads/rdcman)
- [PowerToys](https://learn.microsoft.com/ja-jp/windows/powertoys/)
  - [Awake](https://learn.microsoft.com/ja-jp/windows/powertoys/awake)
  - [FancyZones](https://learn.microsoft.com/ja-jp/windows/powertoys/fancyzones)
  - [PowerRename](https://learn.microsoft.com/ja-jp/windows/powertoys/powerrename)
- [DevToys](https://devtoys.app/)
- [Clibor](https://chigusa-web.com/clibor/)
- [QTTabBar](http://qttabbar-ja.wikidot.com/)
- [Everything](https://www.voidtools.com/)
- [noMeiryoUI](https://github.com/Tatsu-syo/noMeiryoUI/releases)
- [ScreenToGif](https://www.screentogif.com/)
フローをデプロイできない

# We can't find an action with the name and action type that you specified.
プロセスビルダーでの回避策ですが、フローでも同じだったみたい

+ [Can not deploy flow to other sanbox environment](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000LHfJI)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ef329de8-240b-c89b-0657-4ebf41a3b56c.png)



:::note
1\. You must specify a default workflow user for this sender type
Identify Your Salesforce Org’s Default Workflow User
Select a Default Workflow User that you want Salesforce to display with a workflow rule when the user that triggered the rule is not active.
2\. Sent_Email(Action) We can't find an action with the name and action type that you specified


1\.この送信者タイプのデフォルトのワークフロー ユーザーを指定する必要があります
Salesforce 組織のデフォルトのワークフロー ユーザーを特定する
ルールをトリガーしたユーザーがアクティブでない場合に、Salesforce がワークフロー ルールと共に表示するデフォルトのワークフロー ユーザーを選択します。
2\. Sent_Email(Action) 指定した名前とアクション タイプのアクションが見つかりません

+ [Process Builder Deployment Error: “We can't find an action with the name and action type that you specified.”](https://salesforce.stackexchange.com/questions/307512/process-builder-deployment-error-we-cant-find-an-action-with-the-name-and-act)
:::

+ [Send_Individual_Gift_Alert (Action) - We can't find an action with the name and action type that you specified. ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000Kf7VY0AZ)

# We can't find an action with the name and action type that you specified, because it is using namespace while calling it in flow.

+ [Prompt Templates having issue while working with namespace.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J9CBm0AN)


# Deploy the Coral Cloud Sample App

+ [Coral Cloud コードのデプロイ中にエラーが発生しました - cc-employee-app](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KE6gH0AT)

:::note alert
Your organization doesn't have permission to create flows of processType "PromptFlow".   
generativePromptTemplate isn’t a valid property name.  
Invoke_Prompt (Action) - We can't find an action with the name and action type that you specified.
:::
CloudWatch Dashboard カスタムウィジェット内でのタイムゾーン扱い

# カスタムウィジェットで得られる情報

## カスタムウィジェット詳細
詳細は公式ドキュメントを見るのが一番確実です。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/add_custom_widget_dashboard_about.html


## タイムゾーン関連部分
```typescript
        timezone: {
            label: string, // Local or UTC
            offsetInMinutes: number
        },
```
labelにAsia/Tokyoのような文字列が入ると予想していたのですが、実際にはLocalかUTCのいずれかが入ります。Management Consoleと同じイメージですね。


# ユーザにはどう表示するべきか
JSTを前提に書くのが一番楽ではありますが、offsetInMinutesが取得できるのでこれを元に時差を調整して変換します。

1. 日時をUTCタイムゾーンに変換する
2. offset分減算する
3. タイムゾーン情報なしでformatする

LambdaのタイムゾーンはUTC固定なのですが、それを前提にコードを考えるとテストできないので明示的にUTCに変換する方が望ましいです。

dayjsを使ったサンプル

```typescript
export function formatDate(params: {
    d?: Date,
    offsetInMinutes?: number,
}): string {
    if (params.d === undefined) {
        return ""
    }
    return dayjs(params.d)
        .utc()
        .subtract(params.offsetInMinutes ?? 0, "minutes")
        .format("YYYY-MM-DDTHH:mm:ss")
}
```

## 最後に
このサンプルはon-demand-dashboardを作る際に書いたコードです。
CloudWatch Dashboardのコストを削減できるon-demand-dashboardもよかったら触って見てください。

https://github.com/tomohisaota/on-demand-dashboard/wiki/README%28JA%29