OmniAICreator/Qiita-1.07M huggingface dataset:
CCoEメンバーイチオシ！読んでよかったオススメ書籍7選

# はじめに

弊社CCoEは、多様なバックグラウンドを持ったメンバーが集まり、日々さまざまな観点から議論を交わしながら業務を進めています。そんな日々を過ごしている中で、メンバーの共通点が見えてきました。それは、豊富な知識量と新しい知識のインプット量です！先輩メンバーの姿勢に、常に刺激を受けています。

今回はそんなCCoEメンバーが選んだ、読んでよかったオススメの書籍について紹介したいと思います！:blush:
ITに興味がある学生の皆さんや若手エンジニアの方々等、幅広い皆様の学習の一助になれば幸いです:candy:

# :sunny: IT基礎関連書籍 3選

##  情シスの定石 ~失敗事例から学ぶシステム企画・開発・保守・運用のポイント
:panda_face: 推薦者コメント
情報システム部門がやるべき内容が教科書的に広く書かれている本になっています。

:writing_hand:こんな人にオススメ！
・いきなり情シスに異動になった方
・SIer勤務で事業会社への提案を控えている方

https://gihyo.jp/book/2022/978-4-297-12689-6

##  【この1冊でよくわかる】 ソフトウェアテストの教科書

:rabbit: 推薦者コメント
開発には付き物のバグを発見するためにどのようなテストを実施すればよいかについてその理論から説明している、まさに**テストの教科書**です。ソフトウェアテストはなんとなく実施するよりも、理論に基づき要点を押さえることで効率も品質も高まります。この本を読んでもっと品質について知りたくなった方には、[SQuBOK](https://amzn.asia/d/6X44EhY)もおすすめです。

:writing_hand:こんな人にオススメ！
・ソフトウェア開発に関わる全ての方

https://www.sbcr.jp/product/4815608750/


##  マスタリングTCP/IP
:dog: 推薦者コメント
普段利用し、口にしている「ネットワーク」について非常に丁寧に解説されている本です。今もたまに開いて勉強しなおす**インフラエンジニアのバイブル**的1冊です

:writing_hand:こんな人にオススメ！
・インフラ/ネットワークについて苦手意識がある方
・インフラ/ネットワークについて理解を深めたい方

https://www.ohmsha.co.jp/book/9784274224478/

# :mortar_board:エンジニアのためのビジネス基礎書籍 2選

##  エンジニアのための文章術再入門講座 新版 状況別にすぐ効く！文書・文章作成の実践テクニック
:rabbit: 推薦者コメント
報告書や依頼書などのきっちりとした文書から、メールやチャットでも使える文章表現などが書かれています。エンジニア向けに簡潔に分かりやすく書かれています！

:writing_hand:こんな人にオススメ！
・文章を書くのが苦手な方

https://www.shoeisha.co.jp/book/detail/9784798166803

## 【完全版】社内プレゼンの資料作成術
:hatching_chick: 推薦者コメント
資料作成がとても上手で真似をしていた方に教えて頂いてから、社会人になって一番読み返すことが多い1冊です。誰も教えてくれなかった資料作成のコツを具体例を示しながら書いているのでとても勉強になります。

:writing_hand:こんな人にオススメ！
・資料作成が苦手な方
・社内資料での効果的な表現方法を知りたい方

https://www.diamond.co.jp/book/9784478115152.html

# :necktie:ビジネス書籍 2選

##  成功するコミュニティの作り方 － 企業の成長・変革のための実践ガイド
:koala: 推薦者コメント
「コミュニティとは？」といったところから設立・運営のポイント、コミュニティをチームへ昇華することの重要性などが書かれています。また、**7社もの成功事例が載っており**、共通な部分もありつつ、「ファンを作る」「目的が命」「教えることで学ぶ」など各社が最も大事にしていることもわかり、とても参考になります。

:writing_hand:こんな人にオススメ！
・DX推進に関わっている方
・コミュニティを始めようとしている方
・コミュニティって何？メリットあるの？という方

https://www.ric.co.jp/book/e-books/detail/2430

##  ロジカルシンキング ～論理的な思考と構成のスキル～
:dog: 推薦者コメント
システムとは関係ない書籍ではありますが、考えを整理する、仮説を立てるというやり方を具体的にフレームワークを使って説明してくれます。**ロジカルシンキングの教科書として最適**です！

:writing_hand:こんな人にオススメ！
・論理思考（ロジカルシンキング）/ MECEってなに？という方
・思考フレームワークについて知りたい方

https://str.toyokeizai.net/books/9784492531129/


# 最後に

オススメ書籍として紹介させていただいた本は以下です。

:::note info
 1. **IT基礎関連書籍 3選**
     1. 情シスの定石 ~失敗事例から学ぶシステム企画・開発・保守・運用のポイント
     1. 【この1冊でよくわかる】 ソフトウェアテストの教科書
     1. マスタリングTCP/IP
 1. **エンジニアのためのビジネス基礎書籍 2選**
     1. エンジニアのための文章術再入門講座 新版 状況別にすぐ効く！文書・文章作成の実践テクニック
     1. 【完全版】社内プレゼンの資料作成術
 1. **ビジネス書籍 2選**
     1. 成功するコミュニティの作り方 － 企業の成長・変革のための実践ガイド
     1. ロジカルシンキング ～論理的な思考と構成のスキル～
:::

弊社のCCoEメンバーがオススメする書籍を簡単ではありますが7冊紹介致しました📕
技術書からビジネス基礎本まで幅広い書籍になっておりますので、皆様の学びのきっかけになれば嬉しいです:relaxed:

# 弊社では一緒に働く仲間を募集中です:sparkles::santa_tone1:
現在、様々な職種を募集しております。
カジュアル面談も可能ですので、ご連絡お待ちしております！

募集内容等詳細は、是非採用サイトをご確認ください。

https://engineer.po-holdings.co.jp/
Azure Compute Gallery とは

本記事は、[Microsoft Azure Tech Advent Calendar 2023](https://qiita.com/advent-calendar/2023/microsoft-azure-tech) の 12/21 の投稿です。


こんにちは、アーキテクトのやまぱんです。
今回はAzure Compute Galleryについてまとめてみます。
補足コメントや質問は是非お願いします🥺！

## Azure Compute Gallery とは
Azure VM のイメージを管理するマネージドサービスです。
そもそも、Azure Compute Gallery を使わずとも、Azure VM のイメージを作成(キャプチャ)することは可能です。

## そもそも、Azure におけるイメージとは
Azure VM を作るときのひな形になるものです。
画面ショットでいうとこんな感じ。
![2023-12-20_14h08_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/7a26bfad-e99e-294a-326e-e9565b0c03f6.png)

Azure Market Place にあるイメージから Azure VM を作成することも可能ですが、作りこんだ環境をイメージにする (**カスタムイメージ**を作成) ことで、同じような環境を作ることが簡単になります。

またイメージを作成しなくても、マネージドディスクのスナップショットリソースのコピーやAzure VM Backupなどでも複製することは可能です。
(その場合一般化はされない点に注意が必要です)


## Azure Compute Gallery がないとき
Azure Compute Gallery がないときのイメージ管理
イメージ作成画面でいうとこちらを選択した場合です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/5d6e6633-9c3c-f401-64d3-1465be6a1245.png)

イメージ リソースを直接管理する必要があります。
バージョン管理などもEXCELに書き出すとか組み込み処理を挟むなどしないと難しそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/9b67587c-b777-5f55-432e-5b673731203d.png)


## Azure Compute Gallery があるとき
Azure Compute Gallery がないときのイメージ管理
イメージ作成画面でいうとこちらを選択した場合です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/2f7ed8ef-c876-31aa-36a8-c2c274403822.png)

+ 下記のように+ 発行元 / オファー / SKU が設定出来、バージョン管理も容易です。
+ Azure Compute Galleryに登録後にレプリケーション設定を変える事で複数のリージョンにレプリケーションすることができます。そうすることで複数のリージョンで登録したイメージを使ってAzure VM をデプロイすることができます。
![Azure Compute Gallery レプリケーション設定の変更イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/cbf2bfb6-0d76-2408-4303-478eb1f13a8e.png)

+ RBACの設定をすることで**別テナントから該当の Azure Compute Galleryのイメージを使ってAzure VM をでデプロイすることが可能です。**(Azure Compute Gallery とは別テナントにAzure VM を複製した場合は 発行元 /オファー / SKU の設定は表示されません)
+ 一般化したイメージも特殊化したイメージも登録することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/a0745f0d-d2d8-5044-237e-210a300ee85e.png)

+ Azure Compute Gallery の共有については下記に公式ドキュメントがあります。

https://learn.microsoft.com/ja-jp/azure/virtual-machines/share-gallery?tabs=portal

## 一般化されたイメージと特殊化されたイメージについて
一般化したイメージはOS固有の情報が削除される(Windows の場合は Sysprep を行う必要がある)ので、デプロイ時にユーザー / Password の入力ができる。
特殊化したイメージはマネージドディスクや Azure VM Backupからの複製(リストア)のようにそういった ユーザー / Password 入力項目はでず、ホスト名もソース VM のままで作成されます

## Azure Compute Gallery のコスト

+ Azure Compute Gallery サービスを使用するための追加料金はかかりません。

+ 各レプリカを格納するためのストレージ コスト。 イメージのストレージ コストはスナップショットとして課金されます。
+ ソース リージョンからレプリケート先のリージョンに最初のリソース バージョンをレプリケートするための、ネットワーク エグレスの料金。 


## 参考

https://qiita.com/mikanchaaan/items/8a979b6f8e533da4600e

https://learn.microsoft.com/ja-jp/azure/virtual-machines/azure-compute-gallery

https://learn.microsoft.com/ja-jp/azure/virtual-machines/azure-compute-gallery
特定のタイミングでバックボタンを無効化する

## はじめに
この記事はand factory.inc Advent Calendar 2023 24日目の記事です。
昨日は @arusu0629 さんの「[スクラムマスターに俺はなる！](https://qiita.com/arusu0629/items/1613717b611b9076b0b9)」でした。

特定のタイミングでバックボタンの操作を無効にする方法について記載します

## やりたいこと
- ViewPagerのような親Fragmentと子Fragmentを使っていて、親Fragmentで既に、OnBackPressedDispatcher を使ってバックボタンの操作をカスタマイズしている
- 子Fragmentでアニメーションなどを再生中はバックボタンの操作を無効にしたい
- アニメーション再生中以外は親Fragmentでバックボタンのイベントを受け取リたい

## 実装

``` 子Fragment.kt

    private val backPressedCallback by lazy {
        // OnBackPressedCallback(true）にすると
        // 親Fragmentでバックボタンのイベントが受け取れなくなるため false を指定する
        object : OnBackPressedCallback(false) {
            override fun handleOnBackPressed() {
                // バックボタンの操作を無効化したいので何もしない
            }
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, backPressedCallback)
    }

    private fun startAnimation(){
        // バックボタンの操作を受け取るようにする
        backPressedCallback.isEnabled = true
    }

    private fun finishAnimation(){
        // バックボタンのイベントを受け取らないようにする。親のFragmentで受け取るようにする
        backPressedCallback.isEnabled = false
    }
```

## おわりに
- イベントを受け取らないように OnBackPressedCallback を生成するとうまく動きました
- 他にも良いやり方がありましたら教えてください
ITエンジニアとしてこの先生きのこるためにかかった呪いの共有

:::note warn
本記事の内容は己の内にのみ留めてください。
他人に押し付けることをせず、他人には大きなリスペクトを...
:::

# はじめに
学生時代からパソコンに触れ、その延長線上に立ち、仕事として触れ続けいる今。
いわゆるITの専門家として手に職をつけたはずだが、一体全体いつから専門家になったのか
いつになったら専門家になれるのか。いったいつまで入門者の気でいるのか。
これらの答えはいつまで経っても見つけられていない。
けれどもこういった焦燥感と向き合っているうちにいくつか刺さるものを発見することができた。
これらを本記事では呪いと呼ぶ。
せっかく言語化したので共有していこうと思う。
これがもし、誰かの目に留まったならば、僕のこの文章が少しでも心に残ってくれますように。
もし可能ならば共に呪われますように。

# 夏目漱石「こころ」

> 精神的に向上心のないものは、馬鹿だ

どうやら高校二年生の国語の教科書に収録されてるらしい。
高校から呪ってきた呪いの中の古参。

精神的な向上とは、古典から人生を学んだり、自己修養に励んだりすることと解釈しています。
それを忘れて遊ぶことや異性に恋することに興じているような人間は、
発言者からみたら、精神的に向上心のない者であり、馬鹿としか見えないと。

この呪いの言葉で登場人物が殺されている。
きっと僕も立ち止まったら殺されるのだろう。
今ではない未来に。


# 「エンジニアとして生き残るために」
全てのエンジニアに向けて「エンジニアとして生き残るために」 NTTコミュニケーションズ技術顧問・和田卓人氏 - Shines｜ドコモビジネス｜NTTコミュニケーションズ

https://www.ntt.com/shines/posts/b-t_20201012.html

先ほどの「精神的に向上心のないものは、馬鹿だ」という言葉は概念的に刻み込まれたものに対し、
こちらは具体的な行動指針を伴ってくれる。
その分、これを達成しなかった場合はきっと**ITエンジニアを辞めるのだろうな**という恐怖がある。

当日の講演資料も含めてとにかく読んで欲しい。

# そして生まれた呪い
「こころ」によって立ち止まることを禁止され、
「エンジニアとして生き残るために」によって具体的な行動指針を与えられた僕は、これらを実行するようにしている。
- 毎日1度は業務以外のコードに対してコミットする
- 月に1度は勉強会に参加する
- 4半期ごとに最低1冊は技術書を読む
- 年に1度は新しい言語を学ぶ
- 年に1度は登壇、もしくはブログを書く

# おわりに
これらを今年の後半から実行し始めることにより、幾ばくかの形容し難い焦燥感から解放された。
しかし、この焦燥感を文字に起こしたことにより呪いと成ってしまった。(共有しちゃってごめんね。)
僕はこの呪いに苦しまされ続ける限り、エンジニアとして働いていけるのだろう。
ITエンジニアとしてこの先生きのこることができるのだろうか。
生成AI×iPaaSの凄さについて語ります

ChatGPTをはじめとした生成AIの便利さ、凄さは誰もが知るところ。
そこで今回は、その機能をさらに高めることができる「iPaaS」と呼ばれるサービスと、生成AIの中でも特に、最も皆さんが使用されているであろうChatGPTとのシナジーについて語ります。

## はじめに
さっそく生成AI×iPaaSについて語っていきたいところですが、より凄さを感じていただくために、まずはiPaaSの簡単な説明と生成AI（特にChatGPT）のここが惜しい！と感じる点について先に語らせてください。
### まずは簡単にiPaaSの説明から
iPaaS（Integration Platform as a Service）はクラウドサービスの一種で、クラウド上で異なるアプリケーション、データ、システムを統合する機能を持ち、サービス間の連携を容易にする役割を担っています。
![スクリーンショット 2023-12-20 14.34.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657681/25afe145-3d0f-6ba6-3f73-2914f121579a.png)
具体例で述べると、「顧客管理システムから商談データを取得して、それを元にChatGPTでメール文章を作成、メールアプリに貼り付けて送信」といった異なるシステム間でのデータのやり取りやワークフローの自動化を行うことができるようになるのがiPaaSです。
### ここが惜しいよChatGPT
#### 多くの人が使いこなせない
そもそも、ChatGPTを使いこなせる人材が少ない…
これは結構クリティカルな問題で、企業や組織の中でも同じように感じている方は多いのではないでしょうか。

ChatGPTは応用次第で様々な業務に役立つ可能性がありますが、いざ自分の会社や部署で導入しても、上手く使いこなせていない人が大半だと宝の持ち腐れですよね。
#### 独自の情報などが扱えない
ChatGPTを使っていると、外部データとの直接的な連携ができたらいいのにと感じることが多々ありませんか？
たとえば、企業の顧客情報システムや在庫管理システムといった特定のデータベースを参照した業務をアシストしてほしいときなど。
#### 単体では実行能力を持たない
普段我々がChatGPT利用するとき、多くの場合は出力されたChatGPTの回答を元にして何か次のアクションへと繋げます。
たとえば、メールの文章を考えてもらった場合なら、出力された文章をコピーしてメールアプリに貼り付け、最後に送信までが本来の作業です。

ChatGPTはユーザーが入力した文章に対する回答を考えてはくれますが、ユーザーが本来行いたいメインのアクションを実行してくれる能力を持っていません。
しかも、回答を待っている時間も長いし正直面倒くさいです…
## 生成AI×iPaaSの凄さ
ここまでの説明を踏まえた上で、ようやく生成AI×iPaaSの凄さについて語らせていただきます。
私が思う、生成AI×iPaaSの凄さは次の3つです。
- 誰でも簡単に使うことができるようになる
- 独自の情報の有効活用
- 実行能力の獲得

### 誰でも簡単に使うことができるようになる
iPaaSを使用することで、ChatGPTをより直感的で使いやすいインターフェイスとして利用することができるようになります。
しかも、一度連携してワークフローを作成してしまえば、いつでも、誰でも、何度でも同じクオリティで業務を遂行することが可能に。

「回答の質がバラバラで使えない…」
「あの人みたいに上手く活用できない…」

なんて悩みとはおさらばです。
### 独自の情報の有効活用
PaaSを使用すれば、自社で持つ独自のデータベースや顧客情報を活用して、より精度の高い回答を生成できます。
たとえば、セールスフォースなどのCRMシステムとChatGPTを連携させることによって、顧客ごとに最適な提案文を作成させることなどもできるようになります。
### 実行能力の獲得
単体では実行能力を持たないChatGPTでも、iPaaSを利用すればアプリケーションに対する実行能力を獲得することができます。
iPaaSを介して特定のアクションをトリガーとすることによって、たとえば顧客の問い合わせがあった際に、「問い合わせの内容に基づいて自動的に関連情報に関する文章を生成して、Gmailの下書きに保存した後に通知する」など、実際の業務を最大限効率化する形でChatGPTを関与させることが可能になります。
## 生成AI×iPaaSの成功事例
せっかくなので、生成AIとiPaaSの組み合わせで実際に業務効率化に成功した事例をいくつか紹介させていただきます。
![スクリーンショット-2023-12-05-14.22.58-1024x637.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657681/08c85c60-a119-307c-7f46-8e2301efcb06.png)
![スクリーンショット-2023-12-05-14.23.11-1024x638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657681/7c2ac440-bd41-5efa-bdf0-7ee4b5f86961.png)
![スクリーンショット-2023-12-05-14.23.21-1024x636.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657681/17268460-7360-0eec-b3df-3afe7347b513.png)
## 最後に
生成AI×iPaaSの凄さについて語らせていただきましたが、いかがでしたでしょうか？

iPaaSを利用することでChatGPTは機能を大幅に拡張し、ビジネスプロセスと密接に関わる強力なアシスタントツールへと変貌を遂げます。

ビジネスにおける課題をリアルタイムかつスマートに効率化・自動化するなら、ChatGPT×iPaaSの組み合わせは欠かせません。

今回の記事を通じて、少しでも、生成AIとiPaaSがもたらす相乗効果について感じていただけたら幸いです。
### ホントの最後に
株式会社パンと水とでは、自社独自のiPaaSプラットフォームである「AgentFlow」を利用して、企業が抱える様々な課題に対して、豊富な事例を元に最適なソリューションを提案しています。
社内業務の効率化・自動化でお困りの際は、お気軽にお問い合わせください。
ぜひぜひ、一度カジュアルにお話しましょう

https://agent-flow.ai/
Ways To Major In Your Mechanical Engineering Degree

You already know what you will learn from mechanical engineering. So, you have chosen the best Villupuram Engineering College and enrolled in the course. Now what you need is some effective tips to major in your mechanical engineering degree.

What is mechanical engineering?

Mechanical Engineering is a course of study that focuses on the principles of engineering for the analysis, design, manufacturing, and maintenance of machines and mechanical production techniques for any industry.

A major reason that most prefer taking the mechanical engineering stream is the versatility of the course and the wide career choices.

Let us move into useful tips to top your mechanical engineering discipline.

Focus on the concepts of maths and physics

If you don’t have clarity in maths, then you can’t outshine in mechanical engineering. So, just like you paid attention to choosing the best engineering courses in Tamilnadu, you also have to put effort into understanding the core concepts of maths and physics.

Utilize Podcasts and audiobooks

We recommend listening to the Podcasts and audiobooks that are relevant to your stream and interest you the most. This digital world makes your search quick and easy. You can find the perfect audiobooks in just a few clicks.

Be well-versed in units

Understand the units well. Otherwise, you may become poor in making calculations and deriving answers. Unless you solve the question with the right approach, you may fail to convert the values into the required units.

Power of social media

Equipping yourself with the latest information on the industry helps in building your awareness of the course. You can start following the popular mechanical engineer figures or groups. Getting support from your lecturers at the Engineering College is also a good idea. This ensures you are being updated with the new developments and innovations in the mechanical engineering branch.

We hope we have furnished you with some essential tips to major in your mechanical engineering. Keep an eye on the industry sights, do homework, take down notes, and clarify your doubts about the units to enrich your learning.
AccessのVBAで自身の名前（フォーム名やクラス名など）を取得

# やり方

```vb:フォームとレポートでは可。クラスでは例外になってしまいます。
Me.Name
```

```vb:フォーム、レポート、クラスの3種全てで可。
TypeName(Me)
```

# 動作確認（フォーム）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6a54a7e3-0b0f-4b87-60c7-068e731af77c.png)

```vb:
Debug.Print "Me.Nameの結果は" & Me.Name
Debug.Print "TypeName(Me)の結果は" & TypeName(Me)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5bfc4c60-4b75-5413-d9aa-3f2b10643fa6.png)

# 動作確認（レポート）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2e62e3ab-89d5-6829-6e33-8f042e4cfcca.png)

```vb:
Debug.Print "Me.Nameの結果は" & Me.Name
Debug.Print "TypeName(Me)の結果は" & TypeName(Me)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c850f3e7-61a0-0cd6-218a-bf142c3623d2.png)

# 動作確認（クラス）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/55bfb65e-1d9b-3460-4b65-a1a375885838.png)

```vb:
Debug.Print "TypeName(Me)の結果は" & TypeName(Me)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/41b98382-206e-f980-7f53-08ed733a25c7.png)

# 標準モジュール

探したのですが、標準モジュール自身の名前を動的に取得する方法は見つかりませんでした…。

# 蛇足

ログ出力に使うなら ```TypeName(Me)``` がおススメ。
フォーム、レポート、クラスの全ておいて **同じ書き方で統一できる** ため。

* 表記揺れが発生しない。
* 覚えることが少ない。

# 参考サイトさん

https://darumaexcel.uijin.com/aboutooa/vba_limit.html

https://www.umayadia.com/vbsample/dotnet-Samples/dnSampleGetPrevMethodName.htm

# バージョン

Microsoft Windows [Version 10.0.19045.3803]
Microsoft Access for Microsoft 365 MSO (バージョン 2311 ビルド 16.0.17029.20108) 32 ビット
Slack 投稿を Google スプレッドシートに記録する、にあたって躓いたこと

やっぱりね、慣れないことは引き受けないのが一番です。とは言えやらないと出来るようにならないので、頑張りましょう。

# 環境について
Slack と スプレッドシートが使えます。
ワークフローも使えるのでプレミアム環境というやつでしょうか。

# 何を作るのか（仕様）
もともとワークフローで決められたフォームの内容を Slack に投稿スプレッドシートに記録する、というシンプルな構成で済ませたかったんですが、スレッドの返信も記録していきたかったのです。
* ワークフローからフォームの内容をシートに書き出す。
* 返信もシートに書き出す。
* 新規スレッドの書き出しはワークフローからのみ許容する。
* スレッドの ID も書き出す。
* 返信の ID も書き出す。

# 基本的な手順
1. Google スプレッドシートにテンプレを作る。
1. GAS (Google Apps Script) を開く。
まずここなんですよね、普通の人があまり手を付けないところ。未だに分かってませんがこの Apps Script はどこに保存されてるんだろう...。
1. 先人のコードに敬意を払いコピペする。
https://qiita.com/COMUCAL/items/4d8dd1bb1614805bfb41
このコードではアクティブなシートに書き込むことになっているので目的に合わない。URLに対応させる。
    ``` javascript
    const SHEET = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/xxxxxxxxxxx/edit').getSheetByName('シート1');
    ```
1. slack app directory で Outgoing Webhook をカスタムインテグレーションで設定する。
ここでトークンをゲットし、GAS のコードにコピペする。
1. GAS をデプロイする。
WEBアプリ、自分で実行することにする、全員アクセスできることとする。
この URL を Outgoing Webhook に反映する。
1. Outgoing Webhook のチャンネルを目的のチャンネルに設定する。
1. 設定を保存する。
この時点でチャンネルの投稿が書き込まれるようになります。

あとはワークフローをぼちぼち適当に設定したわけです。

# つまづきポイント
## Outgoing Webhook のチャンネル設定にチャンネルが出てこない！？
これは最近ありがちな気がします。「検索すればいいじゃない」的構造なんですよね、たぶん。`アイテムはありません`ってなんやねん！？

この対応はずばり手入力です。すると何故か途中から候補に出てきます。だったら最初から手入力っぽくしておいてくれればよいのに。
## Outgoing Webhook のリファレンスはどこだよ...
いろいろなサービスやら言語も含めてなんですが、見るべきリファレンスが見つからないんですよね。
## Outgoing Webhook が doPost に渡す引数の正体が JSON ではない
https://note.com/kmr992/n/n5eb9dca77a1f

こちらで知りました。JSON も普段は使わないので困りましたが、そもそも JSON でもなく URL encode だとか。それもそれで分からないのですが、調べ方が違うというのは重要なポイントですね。

## Slack のワークフローで使える変数定数等がさっぱりわからん
thread_ts に相当する値をスプレッドシートに書き込みたいわけです。そのやり方がさっぱり見つからない。きっと出来ると思うんですが。

結局スプレッドシートのシート関数とURLを組み合わせて ID を表示するという技を使うことにしました。

## GAS のデプロイでアクセスできる範囲を間違えた
セキュリティ観点からなるべくアクセス範囲を絞ろうという癖がありまして。先人の遺した資料には「全員」と書いてあるにも関わらず、「全員」ではないところを選んでしまいました。

## コード更新→デプロイの手順が怪しい
ちまちまコードの不具合を修正して「デプロイの管理」「編集」「デプロイ」で更新していましたが、上手くいっている気がしませんでした。途中からバージョンを増やしつつデプロイするようにしたところ何だか良さげになりまして。

でもそれをやるとアーカイブのところにどんどんゴミが貯まるんですよね。汚い…

# あとがき
とりあえずやってみよう、というのは大事なことです。それに伴う学びは大きい。
しかしのんびり学んでいる時間も多くはありません。私が苦戦した部分を残しておくことで、誰かの苦戦が…

減ることも無いのでしょうね、自己満足の世界です。
bundle install で grpcが失敗する

grpcのinstallでエラー

```sh
14 warnings generated.
linking shared-object grpc/grpc_c.bundle
Undefined symbols for architecture arm64:
  "_ruby_abi_version", referenced from:
     -exported_symbol[s_list] command line option
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [grpc_c.bundle] Error 1

make failed, exit code 2



An error occurred while installing grpc (1.48.0), and Bundler cannot continue.

In Gemfile:
  gruf-rspec was resolved to 0.6.0, which depends on
    gruf was resolved to 2.15.1, which depends on
      grpc

```

このissueが参考になる
https://github.com/grpc/grpc/issues/30976

自分の場合はruby再インストールしたら治った
TerraformでAWS Cloud9を構築するサンプルコードを書いてみた

# はじめに

みなさん、こんにちは。今回はTerraformの入門ということでAWS Cloud9のサンプルコードを書いてみましたのでこちらを紹介していきたいと思います。

なお、サンプルコードを書いた際のTerraformおよびAWSプロバイダーのバージョンは次のとおりです。最新バージョンでは定義方法が異なっている可能性があるため、実際にコードを書く際は最新の「[Terraformドキュメント]」と「[AWSプロバイダードキュメント]」を確認しながら開発を進めていただければと思います。

[Terraformドキュメント]: https://developer.hashicorp.com/terraform/docs
[AWSプロバイダードキュメント]: https://registry.terraform.io/providers/hashicorp/aws/latest/docs

```tf:versions.tf
# Requirements
terraform {
  required_version = "~> 1.3.6"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.46.0"
    }
  }
}
```

<!-- omit in toc -->
# サンプルコードを書いてみた

今回は次のような構成のサンプルコードを書いてみました。なお、変数定義部分などの一部省略している点、ならびにステップごとの細かい説明などは省いていますのでご承知おきください。詳細については「[AWSプロバイダードキュメント]」をご参照ください。

- [例1. Cloud9環境の作成](#例1-cloud9環境の作成)
- [例2. Cloud9環境へのメンバー追加](#例2-cloud9環境へのメンバー追加)

ちなみに、すべてのサンプルコードに共通してプロバイダー定義は次のようにしています。

```tf:providers.tf
# デフォルトのプロバイダー設定
provider "aws" {
  region = var.aws_region
  default_tags {
    tags = {
      Owner     = "matt"
      Terraform = "true"
    }
  }
}
```

## 例1. Cloud9環境の作成

接続方式としてSSMを活用するCloud9環境の例です。automatic_stop_time_minutesパラメータをウッカリ指定し忘れるとEC2インスタンスがずっと起動しっぱなしとなり、ムダに課金をしてしまうことになるためご注意ください。

```tf:main.tf
# Cloud9環境を展開する先のVPC情報の取得
data "aws_vpc" "this" {
  cidr_block = var.vpc_cidr_block

  filter {
    name   = "tag:Name"
    values = [var.vpc_name]
  }
}

# Cloud9環境を展開する先のサブネット情報の取得
data "aws_subnet" "private" {
  vpc_id            = data.aws_vpc.default.id
  availability_zone = var.aws_availability_zone
  cidr_block        = var.private_subnet_cidr_block

  filter {
    name   = "tag:Name"
    values = [var.private_subnet_name]
  }
}

# Cloud9環境の定義
resource "aws_cloud9_environment_ec2" "this" {
  name                        = var.cloud9_name
  instance_type               = "t3.small"
  connection_type             = "CONNECT_SSM"
  subnet_id                   = data.aws_subnet.private.id
  automatic_stop_time_minutes = 30
}
```

## 例2. Cloud9環境へのメンバー追加

本設定は個人でCloud9を立てて使う分には必要はないのですが、だれかと共有して利用するといった場合は次のような形で利用するメンバーを追加で登録することが可能です。

```tf:variables.tf
variable "cloud9_members" {
  descriptions = "IAM user name list of cloud9 environment members"
  default = ["sample_iam_user1", "sample_iam_user2"]
}
```

```tf:main.tf
# Cloud9環境の利用メンバーのIAMユーザの情報取得
data "aws_iam_user" "cloud9_members" {
  for_each = toset(var.cloud9_members)

  user_name = each.value
}

# Cloud9環境を利用するメンバー追加
resource "aws_cloud9_environment_membership" "this" {
  for_each = toset(var.cloud9_members)

  environment_id = aws_cloud9_environment_ec2.this.id
  permissions    = "read-write"
  user_arn       = data.aws_iam_user.cloud9_members[each.value].arn
}
```

<!-- omit in toc -->
# 終わりに

今回はTerraformの入門ということで、Cloud9のサンプルコードをいくつかご紹介してきましたがいかがだったでしょうか。こんな記事でも誰かの役に立っていただけるのであれば幸いです。

なお、今回ご紹介したコードはあくまでサンプルであり、動作を保証するものではございません。そのまま使用したことによって発生したトラブルなどについては一切責任を負うことはできませんのでご注意ください。

---

- AWS は、米国その他の諸国における Amazon.com, Inc. またはその関連会社の商標です。
- Terraform は、HashiCorp, Inc. の米国およびその他の国における商標または登録商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。
VsCode でプロジェクトにおすすめ拡張を追加する / 確認・インストールする 

# 画面から追加

「ワークスペースの推奨事項に追加する」

<img width="1029" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/8cc5b027-7503-46f8-9a7b-b01e44611ff2">

# コマンドで追加する

拡張のページを開いた状態で以下コマンドを実行


<img width="739" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/a7fa16ac-e9d0-47f1-8e78-17f9b12c398f">


# 追加した結果

`.vscode/extensions.json` にJSON項目が追加される

```json
{
  "recommendations": [
    "github.copilot"
  ]
}
```


# 追加した後の動作

VsCodeを開くと自動でおすすめされる

<img width="577" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/af856662-d613-4dde-960a-66fe026edb8b">

# おすすめを無視してしまった場合

拡張機能 -> 推奨 から確認・インストールできる

<img width="451" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/bc3d6362-b38d-4d3d-9343-f86958d9daf5">

<img width="753" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/0475bca3-e085-405e-a912-c820733aa48c">


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
PC SPEC(2024)

PCのパーツを一部更新したので久しぶりに投稿します！

## CPU
Ryzen7 7800X3D
- ゲーム最強CPU
- VALORANTで700FPS!

## マザーボード
ASUS ROG B650E-F Gaming Wifi
- ずっと欲しかったASUSのROGマザー！

## メモリ
DDR5 6000 32GB(16GBx2)
- 32GBあると色々と楽です。(Chrome多タブ）

## グラフィックボード
RTX2080Super 
- パーツ流用です

## 電源
Thermaltake TOUGHPOWER GF1 1200W
- これからGPUを変えるとなるとこれぐらい必要でした。。。
新人エンジニアが初めて”revert”したのでメモ

## revertとは

`git revert`は、任意のコミットを取り消すときに使えるコマンドです。例えば、新しい機能を導入した際に深刻なバグが発見されたときや、誤って間違ったブランチをマージしてしまったときに、そのコミットを取り消すことができます。

## git revertの仕組み

`git revert`コマンドは、指定したコミットによって導入された変更を打ち消すための新たなコミットを作成します。これにより、元のコミット自体は変更されず履歴に残り続けます。

具体的には、

`$ git revert commitID`

を実行すると、指定されたコミットIDによる変更を解析し、それを打ち消すための新しいコミットを作成します。この新しいコミットは、現在のブランチに自動的に反映されます。

## revertの方法

### GitHub上から

既にマージされたコミットは、該当するPRのページから、revertボタンをクリックすると実行されます。

通常のコミットは、Pull Request → commits → view commit details→revertボタンをクリックで実行されます。しかし、後者のrevertボタンは、全てのリポジトリで有効になっているわけではなく、適切なアクセス権が必要になるようです。

### コマンドで

`$ git revert commitID`
で実行することができます。

## commitIDの探し方

### GitHub上から

GitHub上で、Pull Request → commits → `view commit details`から確認することができます。

### コマンドで

①`$ git log`
過去のコミットを遡ることができます。`commit`の横に表示される４０桁の１６進数がcommitIDです。

ログは`q`で閉じることができます。

こちらのコマンドは、１つのコミットにつき６行ほどにわたって情報が表示されるので、長い履歴を持つプロジェクトにおいては少し読みづらいです。そこで便利なのが、以下のコマンドです。

②`$ git log --oneline`
上記のコマンドでは、１つのコミットにつき、文字通りoneline、つまり１行で履歴を表示してくれます。このコマンドで表示されるcommit IDは、通常40桁で表示されるIDの先頭7~10桁を取り出す形で短縮されたものですが、こちらのIDもrevertコマンドで使うことができます。

## 注意点

①revertしたいコミットをマージした後に、別ブランチからの変更が加わっていると、ブラウザから手動でコンフリクトを解決する必要が生じます。

②gitには、revert以外にも`git reset`や`git checkout`など、変更を取り消すときに使えるコマンドが用意されています。必要に応じて、使い分ける必要がありそうです。（３つの違いは後日まとめてみます）
QRコードリーダーアプリをswiftで作る

## 実行環境
* MacBook Pro 14inchi 2021
* Apple M1 Pro
* macOS 14.1
* Xcode 15.0.1

## Xcodeインストール・プロジェクトの新規作成
インストールとプロジェクトの新規作成は皆さんでもきっとできると思いますが、一応参考サイトを以下に貼っときます。

https://tech-camp.in/note/technology/88418/

## QRコードリーダーアプリ

アプリ作成の仕方はまず初心者の私からしたらさっぱりでしたが、目的のアプリはきっと既存しているだろうというわけで、YouTubeで探しました。（よく海外の方が作り方について説明してくれています。）

### QRコードリーダープログラム

```swift
//
//  ContentView.swift
//  CodeScanningTest
//
//  Created by KM on 2023/12/19.
//

import SwiftUI
import CodeScanner

struct ContentView: View {
    
    @State var isPresentingScanner = false
    @State var scannedCode: String = "Scan a QR code to get started"
    
    var scannerSheet : some View {
        CodeScannerView(
            codeTypes: [.qr],
            completion: {result in
                if case let .success(code) = result {
                    self.scannedCode = code.string
                    self.isPresentingScanner = false
                }
            }
        )
    }
    
    var body: some View {
        VStack(spacing: 10) {
            Text(scannedCode)
            Button("Scan QR Code"){
                self.isPresentingScanner = true
            }
            .sheet(isPresented: $isPresentingScanner) {
                self.scannerSheet
            }
        }
    }
}

#Preview {
    ContentView()
}

```

### 使用パッケージ
* [CodeScanner](https://swiftpackageindex.com/twostraws/CodeScanner)

### 注意点
動画通りにプログラミングとセッティングを行いましたが、エラーを吐いてしまいました。(詳細は気が向いたら書きます。)
対応策として、以下の画像のように[Metal]→[API Validation]のチェックを外しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476751/64e1e48f-d980-f1b7-0b9e-0753fcbee3d6.png)


### 参考動画

https://youtu.be/mFXkWrxRapc?si=xvkd7w_Mkn7mTgb5
scoopでnvmからNode.jsをダウンロードしようとしてはまった話

## はじめに
vimに興味を持ち、neovimをインストールしようと[この記事](https://devil-code.com/blogs/vim/neovim-setup/)を参考に環境構築していたところ、node.jsのインストールではまってしまいました。
備忘録として、記事にしようと思います。

## 使用環境
- windows11
- powershell
- scoop v0.3.1
<br> 
上記サイトを参考にscoopのインストール、そして必要なパッケージをインストールしていたところ、nvmを使ってのnodeのインストールでエラーが出ました。<br>
エラーが出たコマンドと排出されたエラーはこちら

```shell
nvm install latest

>> C:\Users\?? ??\scoop\persist\nvm\nodejs could not be found or does not exist. Exiting.
21.4.0
Downloading node.js version 21.4.0 (64-bit)...
Error while creating C:\Users\?? ??\scoop\persist\nvm\nodejs\v21.4.0\node.zip - open C:\Users\?? ??\scoop\persist\nvm\nodejs\v21.4.0\node.zip: The filename, directory name, or volume label syntax is incorrect.
Could not download node.js v21.4.0 64-bit executable.
```

調べてみると、C:\Userの中にあるディレクトリ(ユーザー名)が日本語だったことが原因。そのせいでインストールしようとしても見つからないと言われていた模様。

一度決めてしまったユーザー名を変更するのは、中々に大変なので、今回は別の方法で対応することにする。

**※※※ユーザー名はローマ字で付けた方がいいです。**

# 解決方法

今回はユーザープロファイルフォルダのシンボリックリンクを作成し、そこにパスを通すやり方で解決しようと思います。

シンボリックリンクの作成の仕方は以下のサイトに載っているので説明は省きます。

https://qiita.com/YoshijiGates/items/77c8c13621d644b8d27a

今回はコマンドプロンプトで以下のようにシンボリックリンクを作成しました。(「あいうえお」が実際にはユーザー名となっています。)

```shell
C:\Users>mklink /d C:\Users\Aiueo C:\Users\あいうえお

>> C:\Users\Aiueo <<===>> C:\Users\あいうえお のシンボリック リンクが作成されました
```

その後、Windowsキーから「環境変数を編集」を押して、NVM_HOMEのパスのユーザー名を上で変更したシンボリックリンクに変更。

最後にコマンドを実行。

```shell
nvm root [new path]
```

これで大丈夫と先程ダメだったコマンドを入力。

```shell
nvm install latest

>> 21.4.0
Downloading node.js version 21.4.0 (64-bit)...
Extracting node and npm...
Complete
npm v10.2.4 installed successfully.

Installation complete. If you want to use this version, type

nvm use 21.4.0
```

無事にインストール完了。

その後インストールしたnode.jsを使おうとすると

```shell
nvm use 21.4.0

>> exec: "elevate.cmd": executable file not found in %PATH%:
```

今度は「elevate.cmd」という実行可能ファイルが見つからないといわれる。このエラーについて調べてみると、どうやら現在のバージョンのバグらしい。nvm のバージョンを下げると解消されるとのこと。なので一度nvmをアンインストールしバージョンを下げることに。

https://github.com/coreybutler/nvm-windows/issues/1069

```shell
//まずは最新のバージョン確認
nvm --version
1.1.12

//ひとまずアンインストール
scoop uninstall nvm

//その後前のバージョンをインストール
scoop install nvm@1.1.11
```

その後改めて、node.jsをインストール。（先程環境変数を変えたおかげで、筆者はnvmを再インストールしたときは上記の操作をしなくても大丈夫でした。）

```shell
nvm install latest

>> 21.4.0
Downloading node.js version 21.4.0 (64-bit)...
Extracting node and npm...
Complete
npm v10.2.4 installed successfully.

Installation complete. If you want to use this version, type

nvm use 21.4.0
```

そして、インストールしたnodeを選ぶと…

```shell
nvm use 21.4.0

Now using node v21.4.0 (64-bit)
```

これで無事にnode.jsのインストールが完了しました！！

## 最後に
無事にNode.jsのインストールができました。バージョンの依存関係や、そのバージョン独自のエラーなどは検索すれば、StackOverFlowなどで記事を見つけることができます。<br>
英語のサイトにひるみそうになりますが、今はDeepl翻訳などブラウザの拡張機能で驚くほど簡単に翻訳することもできます。それらの技術を活用して、英語のサイトでもひるまずに読んでいけたらと思いました。<br>
LaravelをシンプルにSQLite利用で立ち上げる 参考サイト

シンプルに動作等を見たい時に、Laravelプロジェクトのルートディレクトリで `php artisan serve` コマンドを実行すると、簡易的にサーバーが立ち上がるのは非常に便利です。Laravel本当にすごい。

今度は、接続するデータベースもシンプルにしたいな…と思い、SQLiteを入れてみたのですが、備忘を兼ねて参考にしたサイトをまとめました。

## SQLiteのインストール
Mac OSではデフォルトでSQLiteが入っているので、インストール作業をする必要はありません。
Windowsには入っていませんので以下を参考にインストールします。

https://miya-mitsu.com/sqlite3-install-and-download/

パスの設定がうまくいかない場合など、こちらも試してみるとよいです。

http://kakedashi-xx.com:25214/index.php/2022/06/18/post-5669/#toc4

## LaravelにSQLiteを導入する
こちらの記事が導入から利用法まで記載されているのでおすすめです。

https://reffect.co.jp/laravel/laravel_sqlite

### SQLiteから抜け出せなくなったとき
データベース接続は `sqlite3 database.sqlite` コマンドのように行いますが、SQLiteのコマンドを終了する際は、`.quit` で終了することができます。

誤って quit などとしてしまうと、以後 `.quit` としても抜け出せなくなるので地味に困りました。

https://qiita.com/gyu_outputs/items/508a06125555d1f84ef5
【解決】SwiftDataでThread 1: Fatal error: failed to find a currently active container for xxxxxxxとなった場合の対処法

# 概要

SwiftData使用時に、

```
Thread 1: Fatal error: failed to find a currently active container for xxxxxxx
```

というエラーが出た時の原因を二つ確認しているので、備忘も兼ねて書いておきます。


## .modelContainer(for: xxxx.self)を宣言していない

SwiftDataの導入直後によくあるのが、Appファイル上に`.modelContainer(for: xxxx.self)`(xxxxはModel名)を宣言していないが故に発生する問題です。

Appファイルというのはプロジェクト作成時にプロジェクト名で自動的に生成されるファイルのことを指します。
例えば、`SwiftDataDemo`という名前でプロジェクトを生成した場合、`SwiftDataDemoApp`という名称で、以下のようにAppファイルが生成されます。
その中に、`modelContainer`を宣言しておかないと掲題のエラーが発生し、アプリがクラッシュします。


```swift:SwiftDataDemoApp.swift
import SwiftUI

@main
struct SwiftDataDemoApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .modelContainer(for: SiteInfo.self) // これがないと落ちる
        }
    }
}
```


上記の例では以下のような`SiteInfo`モデルを宣言しているため、`SiteInfo.self`を宣言しています。

```swift:Models.swift
import Foundation
import SwiftData

@Model
final class SiteInfo {
    var name: String
    var code: String
    let createdAt: Date

    init(name: String,code: String) {
        self.name = name
        self.code = code
        createdAt = Date()
    }
}
```


## 一度作成したSwiftDataの構造を変更した場合

**SwiftData内にデータを保持している状態**で`@Model`のついているクラスを更新し、アプリ上でデータを操作しようとするとアプリがクラッシュします。

例えば、
1.`SiteInfo`内にデータを追加する
2.以下のように`SiteInfo`を更新する
3.アプリ上で`SiteInfo`に関する操作を行う

上記の手順で操作を行うとアプリがクラッシュします。

```diff_swift:Models.swift
import Foundation
import SwiftData

@Model
final class SiteInfo {
    var name: String
    var code: String
    let createdAt: Date
+   var createdBy:String // 追加する

+   init(name: String,code: String,createdBy: String) {
        self.name = name
        self.code = code
+       self.createdBy = createdBy
        createdAt = Date()
    }
}
```

これは元々持っているデータとの不整合が発生するためにエラーが発生するようで、操作するクラス内に存在している全てのデータを削除したうえで操作を行う、ということでクラッシュを回避できます。
アプリを削除するのが手っ取り早い方法です。

その内他にもSwiftData周りのエラーやTipsについて記事をまとめていこうと思います。
サービス価値の提供と共に忘れてはいけないこと

[NEXTSCAPE Advent Calender 2023](https://qiita.com/advent-calendar/2023/nextscape) 21日目



# DRMサービスの提供により、お客様の事業価値を向上させる

私たちは、**Multi DRM Kit** の提供によりDRMの利用をもっと身近に簡単にすることを目指しています。

DRMとは、Digital Rights Managementの略で、デジタルコンテンツの不正利用を防止するための技術です。動画配信サービスや音楽配信サービスなど、デジタルコンテンツを提供する企業は、DRMを導入することで、コンテンツの権利を保護し、安心してサービスを提供することができます。

しかし、DRMの導入には、ライセンス取得の手続きや、専門知識を持ったエンジニアの確保など、さまざまな課題があるため、特にDRMを利用したことがない企業や担当者にとっては、導入のハードルは高いものとなっています。

**Multi DRM Kit** は、そのような企業を支援するために以下の価値を提供します。

- **わかりやすい価格体系と、シームレスな契約・利用**
- **ドキュメント、サンプルの充実による、短期間での理解・導入**
- **徹底的な高可用性の追求による安心・安全**

これらの価値を実現することで、DRMをお客様のサービスに具備するという価値の提供に加えて、導入・検討にかける時間、コストが削減され、利用しているサービスの障害に悩まされることも無く、**お客様自身の事業により注力することが出来ることにも貢献**しています。
お客様のサービスの可用性に対して過剰では？という話もありますが、DRMのライセンスが発行できなければお客様のサービス（主に動画配信）において動画の再生が出来なくなるわけなので、お客様のサービスが稼働している可能性のある間は決して**Multi DRM Kit**は落ちてはならないのです。そその為に**Multi DRM Kit**は複数のクラウドで動いており、特定のクラウドがグローバルレベルで障害が発生してもサービスが継続できる状態を提供しています。

ここで忘れてはいけないポイントがあります。これらの提供価値は**結果的に社内のエンジニアにも良い効果をもたらす**ということです。

- **無停止、運用稼働0を目指す徹底的な高可用性追及のサービス**により、エンジニアは夜中に障害で起こされることがなく、安心して仕事に集中することができます。また、さらなる高可用性を目指し、想定していない障害を洗い出すために「[Azure Chaos Studio](https://azure.microsoft.com/ja-jp/products/chaos-studio/)」なども面白そうと思って注目しています。

- **問い合わせ不要なドキュメントの提供や、問い合わせ対応の効率化**により、初期導入や問い合わせにかける時間自体が減り、より高度な技術的な問題に集中することができます。お客様からの問い合わせは、何度も発生することが想定される場合には、ドキュメント等に反映をして同じ問い合わせが来ないように対応してきています。この辺は一気には出来ないので、積み上げていくしかありません。

事業を継続する為にも、お客様に価値を提供し利益を上げ続けることは勿論ですが、その価値を作るエンジニアにも働きやすい環境を模索していく、継続した価値の提供にはこれら全てを満たす必要があると考えております。

価値を作りこむことは大変ですが、その先にお客様も会社もエンジニアも、皆がもっと良くなる未来があると信じて進むのみ。

ネクストスケープは、お客様の事業に貢献するだけでなく、同時に社員の働きやすさや生産性の向上も模索していきます。
ユーザーインタビューを実施してみた

この投稿は、2023年JINSのアドベントカレンダー21日目の記事です。

## 自己紹介
ITデジタル部の犬置（@Onami_I）です。
JINSアプリやCRM関連といったシステムを担当しています:smile:

最近はUIUXデザインにまつわる業務に携わっており
未経験の分野ですが、アプリのUIUXだけではなく幅広く活用できる考え方を学べるので、
ワクワクしながら取り組んでます:raised_hands_tone2:

## はじめに
今回はUIUXデザインに関連して、JINSアプリを題材にユーザーインタビューを実施したときの話をしたいと思います！

なぜ、ユーザーインタビュー実施に至ったかという経緯を書くと長くなるので（:sweat_smile:）
ざっくりお伝えすると、ユーザーが  ”JINSアプリをどう使っているのか”  を調査するために実施しました。

## 今回実施したユーザーインタビューの方法
ユーザーインタビューといっても、インタビューする対象や目的、どのくらい時間を費やするか、などによってやり方が変わります。
インタビューの種類には、あらかじめ用意した質問を順番に聞く「構造化インタビュー」や、順番に質問していく中で深堀したいところがあれば随時質問していく「半構造化インタビュー」など様々あります:pencil:

また、インタビューとは少し違いますが、ユーザビリティテストという方法もあります。
簡単に言うと、ユーザーにやってほしい事（タスク）を伝え、ユーザーがどのように操作しているか、どう感じているのかを観察して、こちらが意図した操作が出来ているか、迷っていないかを検証するものになります:eyes:

気になる方は、ぜひ調べてみてください:mag:

### 実施概要

今回は期間も限られており、簡単にインタビューしたかったので社内メンバーの知人や家族を対象に実施しました！

<dl>

<dt>■開催方法：Web会議や電話、対面</dt>
<dd>インタビューの対象者をどこか１箇所に集めるわけではなく、各々時間が取れる日にインタビューを実施しました。</dd>
<br>
<dt>■インタビュー技法：半構造化インタビュー</dt>
<dd>エクセルで質問リストをあらかじめ作成しておき、順番に質問していきます。会話の中で気になったところは追い質問してどんどん深堀していきました！</dd>
<dd>たとえばこんな感じです！</dd>
<br>
<dd>「JINSアプリをインストールした後、使ってみましたか？」という質問をする</dd>
<dd>「ある」と回答した場合　⇒　どの機能（画面）ですか？　の深堀質問に移る</dd>
<dd>「ない」と回答した場合　⇒　それはなぜですか？　の深堀質問に移る</dd>
</dl>


## インタビューする時のポイント
<d1>
<dt>■なぜ？を繰り返す</dt>
<dd>とくに深堀質問するときのポイントです！
<br>ユーザーがなぜそのボタンを押したのか、なぜそう感じたのか...人によって「当たり前」が違うので、なるべく細かく聞いていくのが大事です。ユーザーがどうしてそういう行動を取ったのかを探ることが出来ます。</dd>
<br>
<dt>■自分の意見を入れない</dt>
<dd>質問するときに、「ここの機能使いにくいと思うんですが～」と聞いてしまうと、「確かに言われてみると使いにくいかも。。」と少なからず相手にバイアスがかかってしまい、本来の気持ちとずれた回答内容になってしまうかもしれません。</dd>
<br>
<dt>■録音 or 録画する</dt>
<dd>インタビュー後に自分の書いたメモを見てみると、ちょっとした抜け漏れだったり、自分なりに解釈した文言でまとめてたりしてました。そうなると、回答者の発話の中に表れる本質的な部分を見逃してしまう可能性があります。(今回の反省点。。)
<br>録音や録画して後から見直せるようにしておくと良いです:ok_woman:</dd>

</dl>

## まとめ
ユーザーインタビューを実施してみると、「この機能は気付かれにくいのか」とか「こういうシチュエーションでアプリを起動するのか」などなど、作り手（企業）側が気付けなかった発見やギャップがたくさんありました！

「顧客起点でサービスを作る」ことは当たり前ですが、時に、"この機能／改修は本当にお客様にとって嬉しいもの？" "企業側の都合で作ってない？" ということもあるかと思います..

サクッと要件定義したはいいものの、お客様にとって価値あるものなのか、方向性が合っているのか検証するために、ユーザーインタビューを活用してみるのもいいかもしれません:smile:（あくまでも個人的な考えです）

明日は@guchi_sさんのオフショア開発にまつわる記事です！
怒られ駆動開発エンジニア

## はじめに

この記事は[ファンタアドベントカレンダー2023](https://qiita.com/advent-calendar/2023/funteractive-inc)の24日目です

初めまして、
ファンタラクティブ株式会社でフロントエンドエンジニアをしております、nuintee (ナインティー)です。

皆さんは普段どのように仕事のモチベーションを維持していますか？

本記事では非常に原始的なアプローチである「怒られる恐怖心」を用いたモチベーションコントロールについて紹介します。

## 想定読者

- 仕事のモチベーションを高めたい方
- 怒られるのが怖い方

## 怒られ駆動開発とは

開発の世界には、チケット駆動、テスト駆動、ドメイン駆動 (設計)など様々な駆動方式が存在します。
いずれも実体を持つモノが主体になって進められますが、「怒られ駆動開発」のアプローチは少し違います。
このアプローチは、怒られることの恐怖や危機感を原動力に変えるモチベーションコントロールの方法です。

### **怒られることの恐怖が原動力に**

人は誰しも、否定されたり、怒られたりすることに対して自然と恐怖を感じます。この感情は、私たちがより良い成果を出そうと努力する原動力になり得ます。怒られるかもしれないという危機感は、注意深く、丁寧に作業を進めることにつながります。

### **適度なストレス**

ストレスは常に悪いものではありません。実際、適度なストレスは生産性を高めることが科学的に証明されています。例えば、ヤーキーズ・ドットソンの法則（[https://ja.wikipedia.org/wiki/ヤーキーズ・ドットソンの法則](https://ja.wikipedia.org/wiki/%E3%83%A4%E3%83%BC%E3%82%AD%E3%83%BC%E3%82%BA%E3%83%BB%E3%83%89%E3%83%83%E3%83%88%E3%82%BD%E3%83%B3%E3%81%AE%E6%B3%95%E5%89%87) を参照）は、ある程度のストレスレベルが最高のパフォーマンスを引き出すことを示しています。怒られる恐怖がこの「適度なストレス」を生み出し、結果として生産性を高めることができるのです。

### **怒られても良いと思っている人には向かない**

怒られ駆動開発は、怒られることを恐れる人に効果的です。逆に、「怒られても平気」というタイプの人にはあまり効果がないでしょう。この方法は、怒られることに対する恐怖や不安をモチベーションに変えることが核となるため、怒られることに対して鈍感な人には不向きかもしれないです。

## 日頃意識している事

### 工数の見積もりを現実的に行う

仕事の工数見積もりは、あまりにも楽観的でないようにしましょう。現実的かつ少し厳しめの見積もりをすることで、自分自身にプレッシャーをかけ、期限内に仕事を終わらせるための動機付けになります。

### 期限内に終わらせたい仕事や目標を明言する

「分かりました、やります」といった明確なコミットメントをすることで、自分自身に対する責任感を高めます。これは、自分の言葉に責任を持つことで、目標達成に向けたモチベーションを維持するのに役立ちます。

### 自分から積極的に状況を開示する

定期的に進捗状況を上司やチームメンバーに報告することで、自分の進捗に対する責任感を高めます。これは、怒られることへの恐怖を緩和し、同時に進捗を確実にするための良い方法です。

### 最後の手段としての「火事場の馬鹿力」

これは推奨される方法ではありませんが、モチベーションがどうしても出ない時には、意図的に仕事を後回しにして、期限ギリギリで取り組むことも一つの手です。この「火事場の馬鹿力」は、緊急時の高い集中力と効率を引き出すことができますが、リスクも伴うため、常用する方法ではありません。

## おわりに

書いてみたら普通の事しか言ってなかったですが、
この「普通なこと」をコンスタントに実行するって、意外と大切だったりするんですよね。

怒られ駆動開発のエピソードがある方は是非コメントお待ちしております。

※ 本記事は弊社の人が怒ると怖い・よく怒る事を示唆する意図はありません、
皆さんとても優しいです。本当です。

## 次の記事

次の記事は[ファンタアドベントカレンダー2023](https://qiita.com/advent-calendar/2023/funteractive-inc)の最後です。
そんなトリを飾ってくれるのはもちろん、
弊社の代表であり大黒柱、仏のイムこと井村さんです！
お楽しみに！
Cloudflareのbot検知を回避するDrissionPageを紹介します

## はじめに
この記事では、Cloudflareのbot検知を回避してスクレイピングを行う方法について紹介します。

## CloudflareのBot検知とは
CloudflareにはBotを検知する機能があります。Botだと検知されると、確認画面が表示され、永遠にループすることがあります。

![cloudflare-bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849608/86e741de-6d6b-88c1-8312-2cd72cfd4855.png)

## 従来の回避方法

以前は、下記の`undetected-chromedriver`ライブラリを用いることで回避できましたが、2023年12月20日現在では効果がありません。

https://github.com/ultrafunkamsterdam/undetected-chromedriver

## DrissionPage

このundetected-chromedriverのissueでも取り上げられている、bot検知を回避できるライブラリが「DrissionPage」です。

https://github.com/g1879/DrissionPage

中国語で書かれていますが、翻訳機能やAIを活用すれば理解できます。

:::note info

DrissionPageは、requestsベースのデータ収集の速さと、ブラウザベースのデータ収集の容易さを組み合わせるように設計されています。このライブラリは、共通の機能をカプセル化し、開発と実行の効率を向上させるためのユーザーフレンドリーなインターフェースを提供します。速くて効率的であり、シンプルさと便利さに焦点を当てて設計されています。

このライブラリには独自のカーネルがあり、多くの便利な機能があります。異なるブラウザバージョン用の異なるドライバーを必要とせず、より高速に動作し、iframe間での要素の検索を切り替えることなく行い、ブラウザ内の複数のタブを同時に操作でき、ブラウザキャッシュから画像を保存し、ウェブページ全体のスクリーンショットを撮ることができ、shadow-rootの非オープン状態を扱うことができます。

このライブラリには他にも多くの機能があります。

シンプルな構文規則と統合された共通機能。
簡単で安定した要素の位置決め。
不安定なネットワークに対する待機と自動リトライ機能。
強力なダウンロードツール。
既に開いているブラウザの再利用。
一般的な設定を保存するためのiniファイルの使用。
解析エンジンとしてのlxmlの組み込み。
POMモードのカプセル化の使用、テストに適しており拡張が容易。
:::

## DrissionPageを使ったスクレイピング方法

### セットアップ
```
pip install drissionpage
```

### Seleniumとの比較
#### Selenium使用例
```py
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service

service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
driver.get("取得したいページのURL")
html = driver.page_source
```

#### DrissionPage使用例
```py
from DrissionPage import ChromiumPage

page = ChromiumPage()
page.get("取得したいページのURL")
html_content = page.html
page.quit()
```

## 検証
Cloudflareを使用するサイトでの検証を行います。

### 検証サイト
[https://uniteapi.dev/meta](https://uniteapi.dev/meta)

このサイトの`robots.txt`ではスクレイピングが許容されています。

```
User-Agent: *
Allow: /

Sitemap: https://uniteapi.dev/sitemap.xml
```

:::note warn
とはいえ高負荷を与えないように注意を払いましょう
:::

#### Selenium使用時
![selenium-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849608/b803704b-201c-2caa-6248-1bf1f8f0445f.gif)

#### DrissionPage使用時
![drissionpage.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849608/7e09163a-6fee-a4f6-3cf8-587a83c684e8.gif)

SeleniumではCloudflareによってブロックされますが、DrissionPageを使用すると回避できることが確認されました。
日本で初めてのFinOps Foundation公式ミートアップに参加してきた

# はじめに

みなさん、こんにちは。日本でクラウドコスト最適化に関する活動をしてきたエンジニアとしてコレは外せないなと思い、12/13(水)に開催された日本で初めてのFinOps Foundation公式ミートアップに参加してきました。今回はそのときのお話です。

https://mercari.connpass.com/event/302744/
# イベントの概要

FinOps Foundation は The Linux Foundation のプロジェクトの一つで、Finance と DevOps を掛け合わせた造語の「FinOps」を実現していくにあたってのベストプラクティスの発信や認定資格などの教育面に主眼において活動をしている非営利団体です。今回のイベントは、その FinOps Foundation が 2019/2 に発足してから日本で開催する最初の公式ミートアップでした。

![finops-meetup-agenda.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613908/48bb4d5e-8587-14c2-e1ab-45a65fc47054.jpeg)

# オープニング / FinOps at Mercari

オーガナイザーのメルカリのYuji KazamaさんからオープニングトークということでFinOps Foundationの概要などについてお話がありました。

その後、最初のセッションということで、メルカリにおけるFinOps活動についてご紹介があり、フェーズ1としてコストの可視化、目標設定、ステークホルダーへの定期的なレポート、コスト意識の啓発といったところからはじまり、フェーズ2ではFinOps専任チームの立ち上げや各プロセスの進化といったことについてお話がありました。

メルカリでFinOpsがうまく推進できた要因のひとつとして、CTOからの強いスポンサーシップがあった点をあげられており、「うんうん、やっぱそこが重要なんですよね、、、」といった共感を持ちました。

# メルカリにおけるオートスケーリング最適化の"諦め"と、そこに産まれたリクガメの可能性

次に、メルカリのKensei NakataさんからGKE上で稼働するアプリケーションのオートスケーリングに対するつらみと、それを解消するためにKubernetesのHPA、VPA、Resource requests、Resource limitsをいい感じに調整してくれるメルカリ製のオープンソースツール tortorise のご紹介がありました。

https://github.com/mercari/tortoise

発表内容もテクニカルでとても面白かったのですが、それよりも発表者のNakataさんが入社2年目ということにおじさんエンジニアの私はとても大きな衝撃を受けました^^; もしかすると日本の将来は思ったよりも明るいのかもしれない。

# API caching: A lesson learned from an incident of huge increase in network bandwidth

3番目は、メルカリのPrashant MauryaさんとChin-Ming Huangさんのセッションで、ブランドタグ情報を増やしたところアプリケーションのレスポンス性能が大幅にダウンしてしまった事例を挙げ、どのように解決していったのかといったAPIキャッシング方式に関する試行錯誤についてお話がありました。

# Big Query Storage & Optimization at Mercari

最後はメルカリのDuke Sextonさんのセッションで、BigQueryのコスト最適化に対する過去の取り組みとして、データ所有者からのヒアリングにはじまり、パーティショニングをした上でデータ作成日時をベースとしたライフサイクルポリシーの設定を徹底させていく、といった活動についてご紹介がありました。

# Q&A & ソーシャライジング

軽食と飲み物をいただきつつ、参加者の方に初めましてのご挨拶と普段こんなことやっていますといった会話をさせていただき、楽しい時間を過ごすことができました^^

参加者層としてはFinOps関連のソリューションを持つ企業のエンジニアさんや営業さん、アプリケーション開発を内製化できるつよつよエンジニアを多く抱える企業のエンジニアさんの参加が多く、いわゆる日本のSIerといった企業のエンジニアさんは少なかった印象でした。まだまだ日本国内だとFinOpsは一部のアーリーアダプターに留まっているのかなと思った次第でした。

ちなみに、今回のセッション内容についてはメルカリさんのエンジニアリングブログにも情報が載っているようなのでよかったらこちらもみてね、とのことでした。

https://engineering.mercari.com/blog/


# 終わりに

FinOps 自体は日本ではまだまだこれから、市場自体を作っていくところから、といった印象ですが今後もコミュニティ活動を通じて市場形成に役立てられるといいなと思っている今日この頃です。まだ何もできてませんけど。とにもかくにも、まずはドキュメントなどのローカライズ(日本語化)からって感じでしょうかね。

もし興味を持たれた方がおりましたら、ぜひこの機会にコミュニティ活動への参加を検討してみてはいかがでしょうか。一緒に FinOps 盛り上げていきましょう。ということで、FinOps Foundation の公式ミートアップが日本で初めて開催されたので参加してきました、というお話でした。

---

- The Linux Foundationは、The Linux Foundationの米国およびその他の国における登録商標または商標です。
- その他記載の会社名、製品名などは、それぞれの会社の商標もしくは登録商標です。
アドベントカレンダーの折り返し地点にたどり着いた感想【Advent Calendar 2023 13日目 / 人生13記事目】

## はじめに
Advent Calendar 2023への飛び入り参加を機に~~Qiitan欲しさに~~アウトプットを開始して、何とかカレンダーの折り返し地点(13記事目)に到達することが出来ましたので、[4日目の記事](https://qiita.com/TKY_study/items/b641558f9f00553a62d7)と同様にそちらについての所感、雑記となります。
~~なんで12/20に折り返し記事を書いているんだろう？？~~
## 気付き・感想など

### 毎日投稿はやっぱり大変だが得るものも大きい
カレンダー飛び入り参加にあたり、11月時点から先輩方が記事を書き溜めていた理由が良く分かりました...😢
他のタスクを消化しつつ、アンテナを張ってネタを何とか絞り出している状態で、ネタを見つけても記事化が思ったより難しく、時間もかかるなぁと感じています。
記事化に時間がかかるという点に関しては@Sicut_study さんの[記事作成フレームワーク](https://qiita.com/Sicut_study/items/9b20ac5ded003cb6d55a)の記事が個人的に非常に参考となりました🙏
記事化によって得られる学びや記憶の整理・定着といったメリットはとても大きいと感じており、また逆に負荷がかかっている状態を先に経験する事で、何か詰まったり思いついた際に記事を書くといったペースであればカレンダー終了後も継続が出来そうな気がしています🍀

### 自分の記事が自分自身に役立つ場面が早くも出てきた
記事に記載した内容は非常に忘れにくくなると感じており、また細部について忘れてしまっても「記事を書いたという事実」自体はほぼ間違いなく覚えていられそうな気がしています。記事を書き始めてから何度か「アレなんだっけな...?」といった場面に遭遇したのですが、記事を見返すことですぐに思い出すことが出来ました🍀

### カレンダー参加はとても楽しい
カレンダーという催しによって記事作成を良い感じにゲーム化出来ているという感覚があり、開発チーム及び巣立っていった仲間・先輩たちと参加しているということもあり、お祭り感覚で楽しめている気がします

## おわりに
~~おぼろげながらQiitanぬいぐるみの影が見え始めましたので~~
このまま~~泣きながら5日間で12記事書く~~最後まで走り切りたいと思います！

## 参考にさせて頂いた記事など
https://qiita.com/Sicut_study/items/9b20ac5ded003cb6d55a
AWS Lambdaでpython-gnupgを使用可能にする実装方法

# はじめに
PGP暗号化をLambdaで実装する際に、layerにLambdaのバージョンに対応するライブラリ(python-gnupg)を設定するだけではエラーが発生し使用できなかった。
どうやらライブラリが不足しているようなエラー内容だった。
その際にどういう手順で実装したかを記述する。

# 前提
 - Lambdaのランタイムはpython3.9 
 - Lambdaのバージョンに対応するlayer(python-gnupg)は作成済みであること。
（今回はpython3.9に対応するライブラリpython-gnupg0.5.2をpipでinstallし、zipファイル固めてLambdaのlayerにアップロードした。）
 - EC2インスタンスはAmazon Linux2
 - { }でくくられている部分は変数名なので適宜変更すること。

# 今回使用するAWSサービス
 - Lambda
 - S3
 - EC2

# 実装手順
## 1. EC2インスタンスを起動しログインをする
① EC2インスタンスでLambdaをパッケージ(zip)化した上でLambdaに反映させるため、EC2インスタンスを起動しログインをしておく。

② Amazon Linux2では既にインストール済みではあるが、確認のため以下のコマンドを実施した。
```
[ec2-user@~]$ sudo yum install -y gcc make glibc-static
```

```
[ec2-user@~]$ sudo yum install bzip2
```

## 2. 不足のライブラリをダウンロードする
https://www.gnupg.org/download/
① こちらのリンクから、「GnuPG 1.4 Tarball」をダウンロードする。

② S3に「gnupg-1.4.23.tar.bz2」をアップロードする。今回は{BUCKET_NAME}バケットの直下にアップロードした。

③ 以下のコマンドでEC2内にダウンロードする。
```
[ec2-user@~]$ aws s3 cp s3://{BUCKET_NAME}/gnupg-1.4.23.tar.bz2 /home/ec2-user
```

## 3. ダウンロードしたgnupgをビルドする
① 以下のコマンドを実行する。
```
[ec2-user@~]$ tar xjf /home/ec2-user/gnupg-1.4.23.tar.bz2
```

```
[ec2-user@~]$ cd gnupg-1.4.23/
```

```
[ec2-user@gnupg-1.4.23]$ ./configure
```

```
[ec2-user@gnupg-1.4.23]$ make CFLAGS='-static'
```

```
[ec2-user@gnupg-1.4.23]$ cd ../ 
```


# 4. パッケージ化して、Lambdaにアップロードする 
今回は、pgp_lambdaというディレクトリ以下でパッケージ化の作業を行う。
以下のコマンドを実行する。

```
[ec2-user@~]$ mkdir pgp_lambda
```

```
[ec2-user@~]$ cd gnupg-1.4.23/
```

ビルドしたものをコピーする。
```
[ec2-user@gnupg-1.4.23]$ cp g10/gpg /home/ec2-user/pgp_lambda/
```

```
[ec2-user@gnupg-1.4.23]$ cd ../
```

```
[ec2-user@~]$ cd pgp_lambda/
```

先程作成したフォルダにてpython-gnupgをインストールする。
```
[ec2-user@pgp_lambda]$ pip install -t . python-gnupg
```

gnupg.pycとpython_gnupg-0.5.1.dist-infoは不要そうなので、不要なファイルは取り合えずpython-gnupgからは移動させておいた。
```
[ec2-user@pgp_lambda]$ mv gnupg.pyc /home/ec2-user/
```

```
[ec2-user@pgp_lambda]$ mv python_gnupg-0.5.1.dist-info /home/ec2-user/
```

以下のコマンドで「lambda_function.py」ファイルを作成する。
```
[ec2-user@pgp_lambda]$ touch lambda_function.py
```
本来この「lambda_function.py」に処理のコードを記述するのだが、今回はライブラリを使用可能にする実装方法なので、gpgのオブジェクトが生成できればいいので、以下のコードにする。
Lambdaが使用できる一時領域が"/tmp"であることに気を付けなければならない。

```lambda_function.py
import gnupg

def lambda_handler(event, context):
    gpg = gnupg.GPG(gnupghome="/tmp", gpgbinary="./gpg")

```

権限の変更をする。
```
[ec2-user@pgp_lambda]$ chmod o+r gnupg.py lambda_function.py
```

```
[ec2-user@pgp_lambda]$ chmod o+rx gpg
```

zip化する。
```
[ec2-user@pgp_lambda]$ zip lambda_function.zip gnupg.py gpg lambda_function.py
```

S3にアップロードする。
```
[ec2-user@pgp_lambda]$ aws s3 cp /home/ec2-user/pgp_lambda/lambda_function.zip s3://{BUCKET_NAME}/
```

S3のアップロードしたzipをダウンロードし、Lambdaの関数にzipでコードを反映させる。
もちろん、 作成したLambda関数のlayerにpython-gnupgを設定することを忘れずに。

テスト実行でエラーが発生しないことが確認できれば問題なく実装できている。
ポストマンに挫折していることを考える

## 自己紹介
Web自社サービス開発やITベンダーで、フロントエンドをメインにWebサービス開発を経験。
新機能の開発やバグ修正など対応し、デザイン〜開発〜テスト〜リリースなどをなんとなく触れた。
その中で、ポストマン（Postman）を利用したもののイマイチ使えこなせていない。
というか、むしろ、多少の苦手意識がある。

## なぜポストマンに挫折するのか
- 構造が分かりにくい。
- 何をすればいいか分かりにくい。
- ポストマンを利用する以前に、開発しているシステムへの理解が足りない。
- ポストマンを利用する以前に、APIやバックエンドへの理解が足りない。

## そもそもポストマンとは

## ポストマンとの今後の向き合い方
とはいえ、やらないといけない
外部APIの利用については、比較的に容易いと思う
問題は内部のAPIや自作のAPIかもしれない、その難易度に耐えられるように学習を進めていく

## 挫折しないためにできること
- ポストマンのドキュメンテーションをしっかりとする、共有する
    - 接続方法、パスワードなど
    - どういった時に、どこでポストマンを利用するかメンバー間で明確にすべき
- APIへの理解を深める
    - SOAP, REST, GraphQL, gRPC など
## 参考

https://kageura.hatenadiary.jp/entry/hazimetepostman

https://www.freecodecamp.org/news/rest-vs-graphql-apis/#how-to-consume-a-graphql-api

https://qiita.com/tsudaryo1715/items/3ebb0c5233e480ee5407