OmniAICreator/Qiita-1.07M huggingface dataset:
SolidJSを使って、開発をしてみた

## はじめに

今まで、ReactやVueやAngularなどのフロントエンドFWを色々使ってきましたが、最近話題のSolidJSを勉強がてら触ってみようかと思います。

## 作ったもの

SolidJSを使って、Markdownを書けるEditorを作りました。
![gamen_test1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3279741/42b6c34b-08ff-f9d4-3320-063b984185fe.gif)

リポジトリはこちらです。
https://github.com/eda-yoshizaki/learn-solidjs

# SolidJSとは？

- ReactやVue.jsと同様にコンポーネント指向のアプローチを採用し、仮想DOMを使用する代わりにテンプレートを実際のDOMノードにコンパイルすることで高速なリアルタイムレンダリングを実現するJavaScriptのUIライブラリです
- TypeScriptをサポートし、拡張性や再利用性も高く、状態管理や副作用の処理が容易になるフックシステムを持っています
- また、Svelteに似たイミュータブルなステート管理も可能です

## チュートリアルを実施してみて感じたこと

基本的には、[チュートリアル](https://www.solidjs.com/tutorial/introduction_basics)を一通り実施してからサンプルの作成を始めました。
そこでチュートリアルを実施してみて、感じたことを、少し共有していこうと思います。

### テンプレートを使える

- 作りたいプロジェクトによって、使用するテンプレートを選ぶことができます
- SolidJSでは、Viteをメインとした、[複数のテンプレート](https://github.com/solidjs/templates)が用意されています
- 今回私は、`Typescript + tailwindcss template`を採用しました
- テンプレートを使わず、一応既存のプロジェクトにも追加することはできそうです



### 制御フローについて

- 条件付きレンダー
    - `v-if`や`js`を絡ませることがなくなったので、シンプルに描けるようになリました
    - [`Show` コンポーネントで when と fallback を使うことで再現するようです](https://www.solidjs.com/tutorial/flow_show)
    - 複数条件の場合は、Switch/Match を使える
- 繰り返し処理
    - [`<For>` タグを使用して、実現する](https://www.solidjs.com/tutorial/flow_for)が、Reactなどと書き味はあまり変わらなさそう

### ライフサイクルフックについて
- [onMount を effect のエイリアス](https://www.solidjs.com/tutorial/lifecycles_onmount)で用意してくれている
    - これがReactにもあれば、、、
- 他のフレームワークでいうところの `destroyed` は `cleanup` となっています
- `React`の`useEffect` の代わりが、`createEffect` のようです

### Component関連

- ref も使えます
- propsでも使えます
- 属性をスプレッド演算子で展開できるのは、`React`と同じでした
- `use` を使うとカスタムディレクティブが使えるそうです
- `mergeProps` で props をマージできるそうです
- `splitprops` で props を分けることもできるそうです

### その他

- ストア使えるけど`redux`とは違いそう
- `provider` も使えるそうです
- `React` は更新の伝搬で複数の値を更新するが、[batch関数](https://www.solidjs.com/tutorial/reactivity_batch)を使ってまとめて更新することができるそうです

# 触った感触

- `react` にかなり近いと感じました
    - 公式としても、`特に React と Knockout という巨人の肩の上に立っています` と発言しているので、やはり感覚は間違っていなさそうです
    - Reactを使ったことある人は、導入は割と早いかもしれません
    - `tsx`形式がそのまま使えるのも割とグッドです
- `vite` も使える
    - こちらは、最近のフロントエンドフレームワークならば、ほとんど対応していますが、とてもありがたいです。
    - 個人的には、最近はWebpackではなくVite一択となってきているので、その記事も書いていきたいなと思っています
- まだまだドキュメントが少ない
    - 公式のチュートリアルは割と充実しているが、他のライブラリと組み合わせたりする際のに、実施した例があまりなかったです
    - こちらは、今後増えることに期待しましょう
- パフォーマンスの速さを実感できていない
    - 「仮想DOMからの脱却をして、速度がかなり向上しました」とはあるものの、私が作った規模ではあまり感じることができませんでした
    - というのも、複雑なUIやAPI呼び出しの部分さえないので、パフォーマンス面はいつか試してみようと思います

# まとめ

- `react` にかなり近いせいもあるが、構文が要所要所異なるので、この違いに最初のうちは困惑しそう
    - 慣れてくれば、かなり使いやすいフレームワークだとは感じました
- ただ、ライブラリの対応状況が不明なことも多いので、本格的に開発に採用する際も、大きいプロジェクトではなく、小さいものから入るのが良さそうです
- とは言いつつ、今後ユーザーが増えることに期待は大きいです
    - まだメインで使うことはなさそうですが、機会があれば採用してみたいなとも思えるほど魅力的ではありました

# 参考

- [SolidJS公式サイト](https://www.solidjs.com/)
- [SolidJS公式チュートリアル](https://www.solidjs.com/tutorial/introduction_basics)

# 告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを募集しております。
詳しくは採用情報ページをご確認ください。
https://eda-inc.jp/recruit/
みなさまからのご応募をお待ちしております。
ターミナルの使い方をまとめてみた【基本的なコマンド】

## ls(ファイルの一覧を表示)
##### listを略したコマンドで、カレントディレクトリに含まれているディレクトリとファイルの一覧を表示する。

ls(ファイルの一覧を表示)

```
$ ls
```
ディレクトリとファイルの一覧を、隠しファイルを含めて表示
```
$ ls -a
```
ディレクトリとファイルの一覧と、それぞれの詳細情報を表示
```
$ ls -l
```
隠しファイルも含めてそれぞれの詳細情報を表示
```
$ ls -la
```

## cd(カレントディレクトリの変更)

##### change directoryを略したコマンドで、カレントディレクトリを変更します。引数に変更先のディレクトリを指定する。

sampleディレクトリに移動して、sampleディレクトリをカレントディレクトリにする

```
$ cd sample
```
ターミナルの表示が
```
PC名:sample ユーザー名$ 
```
ホームディレクトリをカレントディレクトリに戻す
※ このコマンドはどこからでも、ホームディレクトリに移動できる

```
$ cd ~
```
現在のひとつ上の階層のディレクトリをカレントディレクトリにする
※ 「..（ドット2つ）」はひとつ上の階層を示す記号

```
$ cd ..
```
## pwd(カレントディレクトリの絶対パスを表示)
print working directoryを略したコマンドで、カレントディレクトリの絶対パスを表示する。絶対パスはシステムの最上位階層（ルートと言います）から対象とするディレクトリやファイルまでの経路を示したもの。

カレントディレクトリがホームディレクトリのときに
```
PC名:~ ユーザー名$  pwd
```
を実行すると、ホームディレクトリ名はユーザー名なので、
```
/Users/ユーザー名
```
と表示される

カレントディレクトリがdesktopのときに
```
PC名:desktop ユーザー名$  pwd
```
を実行すると、
```
/Users/ユーザー名/desktop
```
と表示される。desktopはホームディレクトリに含まれているディレクトリ。

## mkdir(新しいディレクトリを作成)
make directoryを略したコマンドで、カレントディレクトリに新しいディレクトリを作成する。引数に新しく作成するディレクトリ名を指定する。

newディレクトリを作成する
```
$ mkdir new
```
## touch(指定したファイルの更新日を変更)
カレントディレクトリに新しくファイルを作成できるコマンドで、引数に作成するファイル名を指定する。
正確に言うとtouchコマンドは、引数に指定したファイルの更新日を変更するコマンドで、引数に指定したファイルがカレントディレクトリに存在しない場合、新しくファイルが作成される。

```
$ touch <テキスト名>.txt
```
## mv
moveを略したコマンドで、ディレクトリやファイルの名前を変更したり、ディレクトリやファイルを移動できる。
　１つめのの引数に対象のディレクトリやファイルの名前を指定し、2つめの引数に変更後の名前を指定します。2つめの引数が存在するディレクトリ名の場合には、そのディレクトリに1つめの引数の対象を移動させる。

sample1.txtファイルの名前をsample2.txtファイルに変更する
```
$ mv sample1.txt sample2.txt
```
sample2.txtファイルをdesktopディレクトリに移動する
```
$ mv sample2.txt desktop
```
## rm(ファイルの削除)
removeを略したコマンドで指定したファイルやディレクトリを削除しますが、ディレクトリを削除する場合には「-r」オプションを付ける。

sample.txtファイルを削除するには
```
$ rm sample.txt
```

sampleディレクトリを削除する
```
$ rm -rf sample
```

## 1つ前のディレクトリに戻る
カレントディレクトリを変更した後で、1つ前にいたディレクトリに戻る

```
$ cd -
```






## 参考サイト
[ターミナルの使い方・基本的なコマンドについて詳しく解説！](https://www.sejuku.net/blog/124853)
Qtでプロジェクトを複製する

## 背景
やるたびに忘れて調べなおしてるので備忘録として
環境：　Qt version 5.15.2

## 手順(hoge.pro→fuga.proとする例)
1. QtCreatorを起動していた場合、終了する
2. リネーム複製したいプロジェクトをエクスプローラーでディレクトリごとコピーする
3. hoge.pro.userを削除する
4. ルートディレクトリ、hoge.proをfuga.proにリネームする
5. fuga.proをダブルクリックしてQt Creatorを起動する
6. 画面右のプロジェクトをクリックする
7. Configure Project でキットを選択する
8. 画面右のBuild&Run → デスクトップ → Buildをクリックする
9.  ビルド設定 → 一般 → ビルドディレクトリのパスからプロジェクト名を確認する
10. クリーン、リビルド、実行する
HarファイルをtsvやCSVに変換するツール

# 背景と目的
Webアプリケーションのリクエストレスポンス結果を見やすく整理するために、HarファイルをCSVファイル等のExcelで見れる表形式に変換するツールを探していました。  
ググってみるとCSV形式に変換するツールはいくつか見つかったのですが、以下の理由により使用できませんでした。

 * アップロードが必要なWebサービス
     * 仕事で使用することを考慮するとHarファイルをアップロードするわけにはいかない。
 * 欲しい情報が出力項目に無い
     * 今回キャッシュに関する調査用に使用したのでEtagやLast-Modified、Expiresと関連ヘッダを出力したかった。

# 作り方
JavaだとHarを読み込んでくれるライブラリ（HAR reader）があったので、出力部分だけ作成すればよく、さくっと作成できました。

https://github.com/sdstoehr/har-reader

# 公開場所
以下でソース公開しています。  
本記事公開時点ではバイナリ公開はしていないので、ビルドが必要です。

honzan0821/har2xsv
https://github.com/honzan0821/har2xsv
MFAとは

# MFAとは
Multi-Factor Authenticationの略で多要素認証の事を指す。では、多要素の認証とは何なのか。

# 多要素の認証とは
認証方式には以下の3種類ある。認証方式の種類を組み合わせて認証する方法を多要素認証（MFA）と呼ぶ。
    - 知識認証
    - 所有物認証
    - 生体認証

それぞれの認証方式の具体例を見ていこう。

# 知識認証とは
ユーザーのみが知る情報で認証する方式。
- 例
    - IDとパスワード


# 所有物認証とは
ユーザーしか持たない情報で認証する方式。
- 例
    - ICカード
    - ワンタイムパスワード
    - SMS認証
    - マトリクス認証

# 生体認証とは
ユーザーの身体的特徴と行動的特徴で認証する方式。
- 例
    - 指紋認証
    - 顔認証
    - 整脈認証
    - 虹彩認証
    - 正門認証
    - 筆跡
フローの簡単なテスト (ベータ)


+ [フローの簡単なテスト (ベータ)](https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_debug_tests.htm&release=238&type=5)

レコードトリガフローを有効化する前に、フローをテストして、予期される結果をすばやく確認してフローの実行時エラーを特定できるようになりました。Flow Builder でフローテストを作成し、保存して、実行します。以前はフローを手動でデバッグし、エラーが発生するたびにトラブルシューティングを行っていました。現在はデバッグ実行からフローテストを作成して保存します。その後、フローを変更するたびにテストを実行できます。テストできるのは、即時実行されるフローパスのみです。フローテストではレコードの削除時に実行されるフローはサポートされません。

+ [RecordType on Flow Test](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000HkCc9)


:::note alert
error: [Field: RecordTypeId is not a valid lookup field.]] Failing descriptor: {markup://lightning:lookup}
:::


:::note
I ran into the same issue with a flow test for a Knowledge record-triggered flow today and was able to work-around it by first selecting a Knowledge record which populated the problem-causing 'Record Type ID' field.


今日、ナレッジ レコードによってトリガーされるフローのフロー テストで同じ問題に遭遇しましたが、最初に問題の原因となる「レコード タイプ ID」フィールドに入力されたナレッジ レコードを選択することで回避できました。
:::
【設計手法】ドメイン駆動設計(DDD) is 何? 【初心者にも分かりやすく】

## 初めに
DDDって言葉自体は定期的に聞きますよね。

ドメインについて知識をつけましょう、みたいなことはよく言われますが
**「ドメインってIPアドレスをURLにしたものだよね〜」**
くらいの理解しか去年まではありませんでした。

ドメイン知識やDDDとか聞いても、「プロジェクト全体のルーティングの理解かな」って感じで半年くらい前までは恥ずかしながら間違った理解で解釈してました😇

聞いたことはあるけど、詳しくは知らないという方は沢山いると思います。

自分自体ふんわりとした理解しかなかったので、今回勉強を兼ねてまとめさせて頂きます。



## そもそもでドメインって?
ここでいうドメインとは**専門領域**のことであったり、ドメイン知識のことを分かりやすくいうと**業務知識**のことになります。

請求書系アプリで例えると締め作業や簿記の知識等ですね。

余談ですが、学生時代に取得した簿記やFPの知識もエンジニアになってからも役に立つことはありました。
## DDDとは?
DDDとは**Domain-Driven Design**の略で日本語ではドメイン駆動設計と呼ばれています。

以下wikipediaから抜粋
>ドメイン駆動設計（英語: domain-driven design、DDD）とは、ドメインの専門家からの入力に従ってドメインに一致するようにソフトウェアをモデル化することに焦点を当てるソフトウェア設計手法である。オブジェクト指向プログラミングに関しては、ソースコード（クラス名・クラスメソッド・クラス変数）の構造と名称がビジネスドメインと一致させる必要があることを意味する。
開発者は通常モデルを純粋で有用な構造として維持するために大量の分離とカプセル化を実装する必要があると批判されているが、ドメイン駆動型設計は保守性などの利点を提供する。一方でMicrosoftは、モデルがドメインの共通理解を策定する上で明確な利点を提供する複雑なドメインにのみ推奨している。

正直、何言ってるかわかりにくいですよね。
端的にいうと、**DDDはソフトウェアで解決したい部分(専門領域)を、ソフトウェアの設計にそのまま反映させる**、もっと簡単にいうと**業務をちゃんと理解した上でソフトウェア開発を行う**といった意味合いになります。

### DDDの根幹
業務を理解して、アプリ開発することは当然と思うかもしれません。

しかりウォーターフォールを例に出すと

```mermaid
graph TD;
    業務の専門家が要求を書き起こす,それをアナリストに渡す-->アナリストが設計書を作成,モデリング;
    アナリストが設計書を作成,モデリング-->エンジニアが設計書を元に開発を始める;
``` 
上記を見ればわかるかもしれませんが、エンジニアにドメイン知識(業務知識)が直接渡ってきません。
開発者はアナリストがモデルに落とし込んだ設計書から、実際にして欲しいことを読み取る必要があります。

設計書の内容を完璧に作れれば問題ありませんが、実際の業務で中々そうはなりません。
必ずどこかで、「このような状況ではどのように振る舞うのが正解か?」
等々の疑問は生まれます。

そこでエンジニアがアナリストへ仕様を確認し、アナリストが専門家へ何が正しいのか確認する必要があります。
無駄なコミュニケーションコストがかかりますね😇

初めから「業務の専門家」と「エンジニア」が直接ミーティングすれば良いじゃんという考え方がDDDの根幹です。

### ユビキタス言語とは
エンジニアと専門家の間では、同じ概念を保持しても別の名前をもった言葉がいくつもあります。
開発者サイドからすれば「ツイート機能」、専門家・他職種の人からすれば「つぶやき機能」といったものですね。
それを統一するものがユビキタス言語になります。

毎回脳内変換していれば、コストがかかってしまいますし誤認識の要因にもなります。
ユビキタス言語を使えばDDDも円滑に行うことができますね!

## まとめ
いかがでしたでしょうか。
エンジニアとして業務を行う際に、業務知識のあるなしで「DB設計」や「システムのフロー」を
適切に考えれるかどうか決めると言っても過言ではなありません。

今回の記事が多くの方に参考になったら幸いです。

テスト駆動開発(TDD)についてもまとめてるのでよかったら見てみてください！

https://qiita.com/kim_t0814/items/3f57880b3293b1e24387
## 参考記事
https://www.itmedia.co.jp/im/articles/0910/27/news108.html

https://developers.freee.co.jp/entry/development-that-requires-domain-knowledge

https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88

https://qiita.com/katokonn1020/items/767b611e83fc71571c37
ApacheとTomcatについて（基礎編）

# はじめに
Java一年未満の方へ研修用
JavaでWEBアプリケーションを構築して行く際に、なくてはならない
Apache、Tomcatに関して少し掘り下げて紹介

# 対象
・Java一年未満

# Apacheとは
・Webサーバ用のソフトウェア。
　正式名称はApache HTTP Server。
　世界中で最も使用されているWebサーバソフトウェア。

# Webサーバとは
・ブラウザからのHTTPリクエストに対して、HTMLファイルなどをレスポンスとして返してくれるサーバのこと。

# Tomcatとは
・アプリケーションサーバのこと。
・Java Servletを動かす時に使うソフトでWebコンテナのこと（サーブレットコンテナとも言う）
・簡易的なWebサーバとしての機能も持っている
・正式名称はApache Tomcatという

# アプリケーションサーバとは
・Webシステムにアプリケーションプログラムを動作させるサーバのこと。
※Webシステムは、「Webサーバー」「アプリケーションサーバー」「データベースサーバー」の3層構造になっており、アプリケーションサーバーはWebサーバーから受け取ったリクエストに基づいてJavaやPHP、Rubyなどを実行し、Webサーバーに処理の結果を返す。

# ApacheとTomcatは何が違うのか？
・ApacheはWebサーバだが、Tomcatも簡易的なWebサーバとしての機能を持っている。
　Apacheって必要ないと思いませんか？？

### 一般的なWebシステムを図で表すと

![スクリーンショット 2023-03-24 7.40.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956190/ce3c6f3d-0fc6-32ab-37ee-d8c290c94fa4.png)

### 上記の図からわかること
・クライアントはWebサーバにリクエストを送るため、最初に受けるのはApache（ApacheとTomcatがある場合）
・リクエストに対してApacheからWebアプリケーションを動作させるための実行環境(アプリケーションサーバ)であるTomcatへ必要な処理を要求する
・DBとTomcatの間にjavaが有り、そのjavaがDBをたたきにいっている。（TomcatがDBを叩くわけではない）

### 飲食店で例えると。。。
・Apache：ホール担当のバイト。
・Tomcat：キッチン、ホールもできる店長。
・クライアント：お客さん

### Apacheがない場合
・Tomcatさんがお客さんからの注文（クライアントからのリクエスト）を受けるホールもやりつつ、調理（クライアントへのレスポンス）もやることになる。
→クライアントからの少ない注文には対応できる。

### たくさんのリクエストが来た場合
・当然、Tomcatに負荷がかかり、レスポンスが遅くなり、最悪ダウンしてしまう可能性がある。
・そういった場合、Apacheを入れることで、サーバの負荷を分散させ、Tomcatには処理に専念してもらえる。
　→サーバの負荷を軽減することで、js、HTML、CSSなどの静的コンテンツの高速化ができる。

### ApacheとTomcatの違いとは
★Apache
　役割：リクエストを解析すること
　　　　・特定IPアドレスの場合フィルタ（リクエストを許可/拒否）する
　　　　・特定URLの場合リダイレクトさせる
　　　　・特定URLの拒否
　　　　・SSL化による通信の暗号化
　　　　・リクエストに応じて特定のサーバへ処理を振り分ける
　　　　　など

★Tomcat
　役割：リクエストを元に動的処理をする
　　　　・リクエスト情報を元にデータを登録する
　　　　・リクエスト情報を元に動的ページを作成しレスポンスを作成する
　　　　・リクエスト情報を元にユーザを判定し、ユーザごとに異なるレスポンスを作成する
　　　　　など

# まとめ
・ApacheとTomcatは役割がそれぞれある。
・リクエストが多くないシステムやツールを作る際はTomcatのみでもよい。
・大規模なものになるとApacheもあった方がよい。
Apacheの設定変更だけで激おもWebサーバーを再現する小ネタ

CDNの挙動を確認するため、**あえて応答の遅い、激おもWebサーバー**を用意する必要があったので、設定変更だけで工夫したメモです。

Debian、Ubuntu系を例にします。まず、`mod_ext_filter`を有効にします。

```bash
a2enmod ext_filter 
```

`ExtFilterDefine`ディレクティブで、**出力の前に10秒スリープするPerl製フィルタ**を定義し、適用します。

```apache:/etc/000-default.conf
<VirtualHost *:80>
        # 中略

        ExtFilterDefine latency mode=output cmd="/usr/bin/perl -e 'sleep 10; print <>;'" \
          preservescontentlength

        <Location />
                SetOutputFilter latency
        </Location>
</VirtualHost>
```

これでWebサーバーのあらゆるレスポンスが10秒遅延し、激おもWebサーバーを再現できました。

# 別解

試せてはいないですが、こんなフィルタでもいいかもです。

```apache
ExtFilterDefine latency mode=output cmd="/bin/sh -c 'sleep 10; /bin/cat'" \
          preservescontentlength
```

# mod_qos

あとで [mod_qos](https://mod-qos.sourceforge.net/) もあったなと思い出しました。

本来はこちらの方がスマートですが、あまり使ったことがないのと、少ない手数で目的を達成できたのでよしとします。

# 公式サンプル

今回のヒントは公式ドキュメントにあったんですが、力技すぎてちょっとウケちゃいました。

https://httpd.apache.org/docs/2.4/ja/mod/mod_ext_filter.html

```apache
ExtFilterDefine slowdown mode=output cmd=/bin/cat \
preservescontentlength

<Location />
    # core directive to cause the slowdown filter to
    # be run several times on output
    #
    SetOutputFilter slowdown;slowdown;slowdown
</Location>
```

最初に書かれた当時はこれで遅くできたのかな。

これでは秒単位の遅延は無理そうということで、Perlに書き換えたのでした。
IX初回パスワード設定

![スクリーンショット 2023-03-27 080044.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301005/166c7ec8-f55d-420a-3b58-78482b665483.png)
![スクリーンショット 2023-03-27 080138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301005/a67b1029-56b0-7c42-c761-b0937b60a3b4.png)
![スクリーンショット 2023-03-27 080212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301005/7c2649e7-b134-0daa-db0c-d4b0644d81b8.png)
![スクリーンショット 2023-03-27 080234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301005/1a17c054-a24d-5ae9-3444-728131745a31.png)
![uploading...0]()
Googleデジタルマーケティング＆Eコマース：市場調査

# はじめに

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

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

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/8957baaf-ce73-a2a4-19cd-72db89b6874f.png" width="800">

# 市場調査とは

***<font color="MediumVioletRed">『消費者のニーズや嗜好に関する情報を収集するプロセスのこと』</font>***

なぜこのプロセスが重要なのでしょうか？

なぜなら、収集した情報は、特定のビジネスや業界の中で、ECストアが成長し成功する可能性を判断するのに役立つからです。調査によって、ターゲットとなる顧客がどのような人たちなのか、どこで買い物をするのか、他に何を検討しているのか、などをより深く理解することができます。それによって、適切なタイミングで適切なメッセージを発信し、ターゲットとなるユーザーにアプローチする方法を知ることができます。

Eコマースの仕事が小規模な会社であれば、市場調査に直接携わることができるかもしれません。大企業であれば、リサーチを担当する特定のチームがあるかもしれません。あなたが直接市場調査に関わるかどうかにかかわらず、その結果は、顧客とその関わり方をよりよく理解するために役立ちます。

# 市場調査のタイプ

### <font color="MediumBlue">一次調査（Primary research）</font>

自分で行う調査です。

- アンケート
- インタビュー
- 直接観察
- フォーカスグループなどの実施

この調査の結果は、

- ビジネスに特化した情報を集めることができるため、貴重なものとなります。
- しかし、より大きな予算と時間が必要です。

「一番好きな果物の種類は何ですか」というアンケートを取るのは、一次調査です。知りたい情報を個人的に聞くことができるのです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/4a344b98-a7f5-4567-05aa-4930144bb09e.png" width="600">

### <font color="MediumBlue">二次調査（Secondary research）</font>

他の人が行った調査です。

- 消費者インサイト、調査、インタビューなど、公表されている資料からの情報

この調査の結果は、

- 調査情報がすでにオンラインやその他の公表された情報源から入手できるため、より予算に見合った選択肢となります。また、最初の調査を自分で行う必要がないため、時間もかかりません。
- しかし、あなたが見つけた情報は、あなたが望むほど特定のビジネスに特化していないかもしれませんし、調査が完了した後に市場が変化している可能性があります。

ネットで「最も人気のある果物の種類」を検索して、すでに終了している調査の結果を記した円グラフを見つけたら、それは二次調査でしょう。誰かがデータを集め、その結果を発表し、それをあなたの研究に利用することができるのです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bcd88a1e-2ab1-1bc1-7989-3dd335be0552.png" width="600">

# 市場調査の際に収集すべき情報

### <font color="Darkcyan">市場規模</font>

これは特定の業界における潜在的な顧客の総数を指します。市場規模を決定する際には、以下のような質問に答えなければなりません。

- 販売する製品に対して十分な需要があるか？
- その場合、市場にはすでにどれくらいの競合が存在するのか？
- 成長の余地はあるか？

### <font color="Darkcyan">ターゲット層</font>

その企業の製品を購入する可能性が最も高い人々のグループであるターゲットオーディエンスを考慮する必要があります。

- ターゲット層はこの種の製品を買いたいと思っているのでしょうか？
- その製品は彼らの価格帯や予算に合っているか？

### <font color="Darkcyan">競合他社</font>

競合、つまり市場にすでに存在する他の販売者を理解する必要があります。

- 最も重要な競合は誰ですか？
- どうすれば競合と差別化でき、より良い製品や体験を提供できるでしょうか？


#### Activity: Perform a competitive analysis

https://docs.google.com/spreadsheets/d/1NStw-9DGbcxubvSC4X8kgnhhN8DFnkRsNFGCRrHFNts/template/preview?resourcekey=0-ivYp3xI0dJk5rdKTpmKu2w#gid=2073884517

:::note info
調査結果は、販売する製品の種類、設定する価格、顧客への販売方法など、ビジネスのあらゆる領域でより良い決断を下すために役立ちます。
:::

# 市場調査がビジネスにもたらすメリット

- マーケティングと広告キャンペーンを最適化させる。
- 投資収益率(ROI)を向上させる。
- 有意義な結果をもたらす可能性の高い取り組みに時間と予算を集中させる。
- より多くの顧客にアプローチする。
- 売上を増加させる。
- 顧客との関係を改善する。
やっとできた！Arduinoに文字列を送信して操作するよ

　Arduinoは、Serial通信で１文字受信しか出来ないんだと思い込んでましたが出来るんですね。他にも教えてくださるところがありましたが
https://rabbitprogram.com/archives/1325
次のサイトを参考にしました。

http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=3470

　シリアル通信で受信した文字列を分割させて４つのLEDの明るさと点灯時間を操作するようにしてみました。今回使ったArduino互換ボードは、良く分かりませんが格安で購入したLGT8F32P(Nano互換品)です。TypeCコネクタで使い易いです。
![文字操作１.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/127cfd1f-6266-1243-cdf8-25db120350aa.jpeg)
ポイントは
```
while (Serial.available() == 0) {}   // wait for data available
String input = Serial.readString();  // read until timeout
```
ですね。これだけで一連の文字列の受信を待って格納してくれます。その文字列を
```
input.trim();
Serial.println(input);
n = input.substring(0).toInt();
l = input.substring(2, 5).toInt();
m = input.substring(6).toInt();
```
のように分割して、LED番号・明るさ(On,Off)・点灯時間(秒)としています。
なお、ここでのLED２番・４番ピンはdigitalWriteしかできないので、Onは0以上の3桁、Offは「000」と入力します。起動直後はこんな感じです。
![文字操作２.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/5fd1c430-2c28-a10e-b59c-50476716efb4.jpeg)
ここでArduinoIDE内蔵のモニターを開いて、文字列(数字とスペース)を打ち込みます。「Tera Term」では、設定なのか終端文字の送信の関係か、うまくいかないです。
![文字操作３.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/0056eea8-61ab-4727-cc51-c68da28e5976.jpeg)
　以下が Arduino IDE 1.8 でのスケッチです。
```c:
int n, l, m, q;
char *data = "3 100 1"; // 例として。3番、明るさ100、1秒間点灯

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  Serial.begin(9600);
  Serial.println(data);
  digitalWrite(2, HIGH);
  analogWrite(3, 10);
  digitalWrite(4, HIGH);
  analogWrite(5, 10);
}

void loop() {
  l = 0;
  m = 0;
  n = 0;
  Serial.println("Input No. Brightness delay(%1d %3d %1d):");
  while (Serial.available() == 0) {}   //wait for data available
  String input = Serial.readString();  //read until timeout
  input.trim();
  Serial.println(input);
  n = input.substring(0).toInt();
  l = input.substring(2, 5).toInt();
  m = input.substring(6).toInt();
  Serial.print(n);
  Serial.print(" ");
  Serial.print(l);
  Serial.print(" ");
  Serial.println(m);

  if ((n > 1 && n < 6) && (l >= 0 && l < 256)) {
    if (n == 2 || n == 4) {
      if (l > 0) {
        digitalWrite(n, HIGH);
        delay(m * 1000);
        digitalWrite(n, LOW);
      } else {
        digitalWrite(n, LOW);
      }
    } else {
      analogWrite(n, l);
      delay(m * 1000);
      analogWrite(n, 0);
    }
  } else {
    Serial.println("incorrect Input");
  }
}
```
文字列分割の部分はもう少し改良したいですが、かえって長くなるので今のところはこれで。
　Arduinoをシリアル通信の文字列で操作可能だと、プログラミングの幅が増えるので色々試したくなりますね。
オブジェクト指向で必須のUMLとは

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！

今回は具体的なオブジェクト指向で必須のUMLについて更に詳しく調べてみましょう！

![インスタスライド_202303064.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/47ba4b5b-8dd2-8b9a-98cf-ca5d3fc4873e.gif)


# ＵＭＬでの表記法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/58788039-c53f-29f0-497c-35512eb75cde.png)
# UML使い方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/ac6ef451-c62d-f37a-9643-0b6410a403b5.png)

# まとめ
ーUMLの表記法を知ろう

ーUMLには、下記が存在する
ユースケース図
アクティビティ図
シーケンス図
コラボレーション図
クラス図
パッケージ図
ステートチャート図
コンポーネント図
配置図


# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
1/rポテンシャル下の１質点系を考えるときに出てくる積分(1/2)

# はじめに
皆さんは普段，生活している時に引力ポテンシャルのもと，平面上を運動する１質点系について考えたくなったことありませんか。ありますよね。それを考えている中で，この運動の作用変数を求めようとすると少し難しい積分が出てきます。その積分について今回はまとめてみます。

ちょっと記事が重かったので分けました(2023/03/31追記)。
↓↓↓続きの記事はこちら↓↓↓
https://qiita.com/nefu_chem/items/27a782ca92853be69f3d

# 運動の考察
まずは引力ポテンシャルのもと，平面上を運動する１質点系についてサクッと考えてみましょう。最初は中心力ポテンシャル$U(r)$のもと，平面上を運動する質点を考えます（後で引力ポテンシャルを考える）。この系のHamiltonianは
```math
H(r, \theta ,p_r, p_{\theta })=\frac{1}{2m}(p_r^2+\frac{p_{\theta }^2}{r^2})+U(r)
```
です。文字は一般的なものを使います。さて，この系に対してのHamilton-Jacobi方程式は
```math
\frac{1}{2m}[(\frac{\partial S}{\partial r})^2+\frac{1}{r^2}(\frac{\partial S}{\partial \theta})^2]+U(r)+\frac{\partial S}{\partial t}=0
```
となります。今はHamiltonianが時間に陽には依らない系で，特性関数を$W(r, \theta )$とおけば，これを決定する偏微分方程式は
```math
\frac{1}{2m}[(\frac{\partial W}{\partial r})^2+\frac{1}{r^2}(\frac{\partial W}{\partial \theta})^2]+U(r)=E
```
となります。ここで$E(=\alpha_1)$は系のエネルギーです。ここで $W(r, \theta )=W_r(r)+W_{\theta }(\theta )$ のように変数分離して偏微分方程式を整理すれば
```math
r^2[(\frac{d W_r}{d r})^2+2m(U(r)-E)]=-(\frac{dW_{\theta }}{d\theta })^2
```
となり，両辺は定数になるはずですので，これを$-\alpha _{\theta }^2$とおきます。これより
```math
\begin{align}
W_{\theta }(\theta )&=\alpha _{\theta } \theta \\
W_r(r)&=\int dr \sqrt{2m(E-U(r))-\frac{\alpha _{\theta }^2}{r^2}}
\end{align}
```
を得ることになり，特性関数は
```math
W(r, \theta, E, \alpha_{\theta})=W_r(r)+\alpha _{\theta } \theta
```
となります。
とりあえず今回は作用変数を求めたいだけなので，ここまでやれば大丈夫です。もちろんここから質点の軌道まで求めることができます。

# 作用変数を求める
それでは作用変数を求めます。以下，引力ポテンシャルを考えます。具体的には
```math
U(r)=-\frac{k}{r} \quad (k>0)
```
とします。また，今は周期的な運動，つまり楕円運動の場合のみ考えたいので$E=\alpha_1<0$としておきます。
さて，$J_{\theta }$は
```math
J_{\theta }=\oint \frac{\partial W_{\theta }}{\partial \theta } d\theta =\alpha _{\theta} \oint d\theta =2\pi \alpha _{\theta }
```
と求まります。次に$J_r$を求めます。まず位相空間$(r, p_r)$における位相空間軌跡は
```math
p_r=\frac{\partial W_r}{\partial r }=\sqrt{2m(E-U(r))-\frac{\alpha _{\theta }^2}{r^2}}=\sqrt{2m\alpha_1 + \frac{2mk}{r}-\frac{\alpha_{\theta}^2}{r^2}}
```
で与えられる曲線です。また，ここで平方根の中に注目し，以下の二次方程式
```math
r^2+\frac{k}{\alpha _1}r-\frac{\alpha_{\theta}^2}{2m\alpha_1}=0
```
の解を$r_+$と$r_-$で置いておきます$(0<r_-<r_+)$。さて，作用変数$J_r$は先の位相空間軌跡が描く曲線に囲まれた部分の面積であるので
```math
J_r=\oint \frac{\partial W_r}{\partial r} dr = 2\sqrt{-2m\alpha_1}\int_{r_-}^{r_+}\frac{dr}{r}\sqrt{(r_+-r)(r-r_-) }
```
となります。
やっと今回扱う積分が出てきました。

# 参考文献
基幹講座物理学解析力学（益川敏英）
DockerHubへのPush手順

# はじめに
ローカル環境のイメージを初めてDockerHubへpushする手順を記します。

# 前提
- DockerHubのアカウントを作成していること
- ローカル環境にイメージがあること
- 本手順に記載のコマンドは、ターミナルから実行されること

# 環境情報
```terminal
$ sw_vers
ProductName:            macOS
ProductVersion:         13.1
BuildVersion:           22C65

$ docker -v      
Docker version 20.10.23, build 7155243
```

# 手順
以下の手順を実行します。
（１） リモートリポジトリを作成する
（２） ローカル環境からDockerHubにログインする
```terminal
docker login -u アカウント名 -p パスワード
```
（３） ローカル環境のイメージとpushするイメージを紐づける
```terminal
docker tag ローカルイメージ名:タグ名 アカウント名/リモートリポジトリ名:タグ名
```
（４） ローカル環境からDockerHubにイメージをpushする
```terminal
docker push アカウント名/リモートリポジトリ名:タグ名
```

# 解説/実施
## （１） リモートリポジトリを作成する
１. DockerHubの[ホームページ](https://hub.docker.com/)に移動します。
２. 「**Create a Repository**」をクリックする。
　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237378/4bf046ec-57d0-2e51-896c-99666cb220fe.png">
３. **リポジトリ名**と**公開範囲**(Public/Private)を選択し、「Create」をクリックする。
　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237378/79fede3c-2d3b-aa84-1567-5fdb0fefd46f.png">
４. リモートリポジトリの作成完了です。
　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237378/25308193-10d3-8e31-6b38-6139909eda18.png">

※以降の手順は、全てローカル環境で実施します。
## （２） ローカル環境からDockerHubにログインする
１. 以下のコマンドでDockerHubにログインします。
```terminal
docker login -u アカウント名 -p パスワード
```
 アカウント名とパスワードには、DockerHubに登録した情報をそれぞれ入力します。

以下の文言が表示されればOKです。
```terminal
Login Succeeded
```

## （３） ローカル環境のイメージとpushするイメージを紐づける
１. 以下のコマンドでローカル環境のイメージとpushするイメージを紐づけます。
```terminal
docker tag ローカルイメージ名:タグ名 アカウント名/リモートリポジトリ名:タグ名
```
- **ローカルイメージ名**
    - リモートリポジトリにpushしたいイメージを指定します。
- **:タグ名**
    - イメージのタグを指定します。
    - リモートリポジトリにpushするタグ名は、自由に指定できます。
    - ローカル、リモートともに、指定しなかった場合は、「latest」が設定されます。

以下のイメージを持ってコマンドを入力しましょう。
```terminal
docker tag ローカル環境の情報 リモートリポジトリの情報
```
## （４） ローカル環境からDockerHubにイメージをpushする
１. 以下のコマンドでイメージをローカル環境からリモートリポジトリにpushします。
```terminal
docker push アカウント名/リモートリポジトリ名:タグ名
```
「docker push」の後には、「docker tag」で指定したリモートリポジトリの情報を入力します。

---
DockerHubへイメージのpushが完了しました。
　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237378/761a00aa-87a8-8427-8f91-34cc491b6ae3.png">

# 最後に
GitHunを使用していれば、流れを掴みやすいと感じました。
最初はとっつきにくかったけれど、手を動かしてみたら意外と覚えやすかったです。

# 参考
- https:\//docs.docker.jp/engine/reference/commandline/login.html
- https:\//docs.docker.jp/engine/reference/commandline/tag.html
- https:\//docs.docker.jp/engine/reference/commandline/push.html
2023/3/27主にITとかセキュリティの記事

「ChatGPT」の大規模障害　クレカ番号など個人情報流出の可能性(3/25)
https://sputniknews.jp/20230325/chatgpt-15440639.html

偽佐川急便のフィッシング詐欺は再配達＆手数料を要求する(3/25)
https://ascii.jp/elem/000/004/130/4130085/

「デジタルエンゲル係数」でセキュリティ動向を紐解く。浮き彫りになった中小製造業の日米格差(3/24)
https://cybersecurity-jp.com/column/80912

「免疫」のようなセキュリティチームを作りたい
～主席エンジニアたちが向き合う情報セキュリティ対策～(3/24)
https://www.cyberagent.co.jp/way/list/detail/id=28608

TikTok CEO、米公聴会で何を言った？　議員らフォーブス記事も引用し追及(3/25)
https://forbesjapan.com/articles/detail/61892

ビットコインATMメーカー、ゼロデイ脆弱性が悪用されて暗号資産盗まれる(3/25)
https://news.mynavi.jp/techplus/article/20230325-2633191/

GitHub.comがSSH鍵を交換、接続できなくなった場合には確認を(3/25)
https://news.mynavi.jp/techplus/article/20230325-2635998/

.NET開発者を標的とした悪意のあるNuGetパッケージに注意(3/25)
https://news.mynavi.jp/techplus/article/20230325-2634480/

政府やエネルギー機関を狙う新たな脅威「YoroTrooper」に注意(3/25)
https://news.mynavi.jp/techplus/article/20230325-2628192/

スパコンで1万年かかる計算→たった3分20秒に?　理研、国産初の量子コンピューター発表　“ケタ違い”の計算速度で世界が変わる?(3/25)
https://news.yahoo.co.jp/articles/82a15c89f684919d6c5a96aa99af710074d28591

【セリア】シールを貼るだけで防犯！リモートワークにも役立つカメラセキュリティシールを使ってみた(3/25)
https://news.mynavi.jp/article/20230325-2635919/
64x64ドット12時メーターを作る3(STM32G071)(SSD1306)


フォント1


(0),(1),(2),(3),(4),(5)までのフォントを作る

![o_cop443.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d4f248ca-86b7-0cb1-0826-7d93100edf0f.jpeg)


![o_cop444.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f7a958ba-c847-e7b5-d4cd-268a01f0efc7.jpeg)
CISSP CPE取得メモ

# はじめに
CISSPの資格取得後のCPEクレジットについて、こちらに取得方法を記載しました。

CISSP合格体験記およびCISSPのエンドースメントについてはこちらを参照して下さい。

①CISSP合格体験記について

https://qiita.com/forest_moririri/items/4a1dfdacc89d67ff1985


②CISSPのエンドースメントについて

https://qiita.com/forest_moririri/items/b335a3a44491a4c86e03

# Who am i ?
しがないエンジニアです。

# 想定読者
- CISSPの資格取得後、CPEクレジットの取得方法について知りたい人
- その他

# 本題
まず、CISSPのCPEクレジットについては以下を参照してください。

https://www.isc2.org/-/media/ISC2/Certifications/CPE/APAC-Japanese-CPE-Handbook-Digital-20210317.ashx

$(\text{ISC})^2$のサイトについてはこちらを参照して下さい。

https://japan.isc2.org/member_cpecredit.html

資格更新に120クレジット必要ですが、年40クレジットが推奨されているようです。

# 参考

現実的なのは、このあたり？？
```
以下のような(ISC)²イベント等への参加1時間に対して1 CPEクレジット(グループA)が付与されます。
(ISC)²公式トレーニング
(ISC)²チャプターミーティング
(ISC)²チャプター役員ミーティング
(ISC)²認定CPEクレジットサブミッターのコース
(ISC)²InfoSecurity Professional Magazine
　クイズに正解すると各号毎に2CPEクレジットが付与されます。
SMEによる(ISC)²試験問題作成
(ISC)²JTA調査
(ISC)²Professional Development Institute (PDI)コース
(ISC)²Safe and Secureボランティアトレーニング (1CPEクレジット)
(ISC)²Security Congress
(ISC)²Webinar - 地域別(EMEAやAPAC)
(ISC)²Webinar - e-Symposium (3CPEクレジット)
(ISC)²Webinar - Security Briefing (1CPEクレジット)
(ISC)²Webinar - Solutions Summit (3CPEクレジット)
(ISC)²Webinar - Think Tank Roundtable (1CPEクレジット)
```
あとこちら。
```
専門的な活動による貢献 - グループA
CONTRIBUTIONS TO THE PROFESSION (Group A)
　専門的な活動による貢献に対してCPEクレジット(グループA)が付与されます。
執筆、研究、出版
　書籍を執筆した場合、単著には40CPEクレジット、共著には20CPEクレジット、編集には10CPEクレジットが付与されます。
　記事を執筆した場合、単著には20CPEクレジット、共著には10CPEクレジット、編集には5CPEクレジットが付与されます。
　専門的なブログを執筆した場合、単著には10CPEクレジット、共著には5CPEクレジット、編集には2CPEクレジットが付与されます。
　ホワイトペーパーを執筆した場合、単著には10CPEクレジット、共著には5CPEクレジット、編集には2CPEクレジットが付与されます。
Webinar、ポッドキャスト、プレゼンテーションの準備
新規もしくは既存のトレーニングの実施準備
　1日コースには2CPEクレジット、2日コースには5CPEクレジット、5～7日コースには10CPEクレジット、12週以上のコースには20CPEクレジットが付与されます。
専門家(SME)としてのパネルディスカッション参加
　雇用主または顧客とは異なるグループに対し、所有する資格のドメインに関するサービスを、ボランティアとして無償で提供した場合、1時間の活動に対して1CPEクレジットが付与されます。例えば、情報セキュリティ専門家団体(チャプター以外)での役員活動、政府・公共機関・慈善団体での委員会やワーキンググループでの活動、著名な団体におけるセキュリティに関する標準化活動などが含まれます。
　著書、教える内容のメモ、教材、教育プログラム等を保存しておいてください。
```
前者はBlightTALKや$(\text{ISC})^2$の教育など、後者は論文執筆やセキュリティに関するブログなどが該当するようです。
私もこの辺を重点的に申請しています。

# 最後に
120クレジットですが、年間40クレジットと考えればわりと簡単に達成できそうです。忘れないようにしたい所ですね。
kintoneプラグイン開発　プラグインの読み込みエラー(「不正なリクエストです」)

## 概要
プラグイン開発が終わって、プラグインをパッケージングして、zipファイルが出来上がった。
そして、zipファイルをプラグインの読み込み画面
https://{subdomain}.cybozu.com/k/admin/system/plugin/
にて読み込んでみると、```不正なリクエストです```というエラーが出てしまった。

この、何にも伝える気のないcybozuの怠惰なエラーメッセージに、時間を奪われたので共有しようと思う。
今回判明したパターン以外にも遭遇したら、この記事に追記していきたい。
もし、みなさんも遭遇したらコメントして頂けるとうれしいです。

## 疑ったこと

manifest.jsonファイルの形式がおかしいのか。⇒　正しく書けていた。
下記のようにmanifest.jsonファイルを記述していた。

``` manifest.json
{
  "manifest_version": 1,
  "type": "APP",
  "name": {
      "en": "plugin_name",
      "ja": "プラグイン名"
  },
  "description": {
      "en": "plug-in description.",
      "ja": "プラグイン説明。"
  },
  "icon": "image/icon.png",
  "version": "1.0.0",
  "config": {
      "html": "html/config.html",
      "js": [
          "js/config.js"
      ],
      "css": [
          "css/51-modern-default.css",
          "css/config.css"
      ],
      "required_params": []
  },
  "desktop": {
      "js": [
          "js/desktop.js"
      ],
      "css": [
          "css/51-modern-default.css",
          "css/desktop.css"
      ]
  },
  "mobile": {
      "js": [
          "js/mobile.js"
      ],
      "css": [
          "css/51-modern-default.css",
          "css/mobile.css"
      ]
  }
}
```

今回のプラグイン読み込みでは、kintone-plugin-packerを使ったパッケージングの動作確認を目的としていたので、```css/51-modern-default.css```と```js/desktop.js```以外を空のテキストファイルにして、上記のmanifestファイルでパッケージングした。

[kintone プラグイン開発手順](https://cybozudev.zendesk.com/hc/ja/articles/203455680-kintone-%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E9%96%8B%E7%99%BA%E6%89%8B%E9%A0%86)
には、manifestファイルのconfigは省略可能となっている。

今回は、manifestファイルのconfigを省略せずに書いておきながら、manifest.jsonファイルのキー```config.html```で指定しているファイル```html/config.html```は空のテキストファイルだった。これが良くなかったらしい。

## 結論
manifest.jsonファイルのキー```config.html```が存在する場合、
そこで指定したファイルは、空のテキストファイルであってはいけない。
チャットボットにおけるユーザーの行動分析に使えるSQL Tips

# 今回のテーマ
SQLを使用したチャットボット内のユーザーの行動分析

# 前提条件
- 使用するデータウェアハウスはBigquery
- チャットボットで記録されるデータは
    - session id：チャットボット起動時に記録される一意のID（String型）
    - createtime：データが作成された日時（datetime型）
    - scenario text：チャットボット内でどのボタンが押下されたか判別できるString型データ

# 今回分析したい内容
- シナリオごとのユーザー数

### シナリオごとのユーザー数
- 方法１：シナリオ単位でグループ化をし、session idをdistinctでcountしてあげる
- 方法２：STRING_AGGを使用してセッションごとにscenario textをまとめる方法

方法１については基礎的な部分なので割愛する。
方法２については以下のSQLで取得可能

~~~SQL
with A as(
    select 
        session_id
        ,STRING_AGG(scenario_text) as scenario
    from xx /*チャットボット内の行動が記録されているテーブル*/
    group by 1
)
select 
    case
        when REGEXP_CONTAINS(scenario, "シナリオ１") IS TRUE THEN "シナリオ１"
        when REGEXP_CONTAINS(scenario, "シナリオ２") IS TRUE THEN "シナリオ２"
        when ...
    end as scenario
    ,count(distinct session_id)
from A
group by 1
~~~

Aテーブルは以下のようになる
|session_id|scenario|
|:--|:--|
|a|シナリオ１,シナリオ２,...,シナリオｎ|
|b|シナリオ１,シナリオ２,...,シナリオｍ|
|...|...|

REGEXP_CONTAINSで含まれているシナリオを抽出しグループ化を行う。

方法２のメリットとしては、方法１とは違い複数のシナリオを経由したユーザーを把握することが可能である。

例えば、シナリオ１→シナリオ２→シナリオ４の行動を行ったユーザー数などを簡単に絞り込むことができる。
この場合、SQLは以下の通りになる。
~~~SQL
with A as(
    select 
        session_id
        ,STRING_AGG(scenario_text) as scenario
    from xx /*チャットボット内の行動が記録されているテーブル*/
    group by 1
)
select 
    case
        when 
            REGEXP_CONTAINS(scenario, "シナリオ１") IS TRUE 
            AND REGEXP_CONTAINS(scenario, "シナリオ２") IS TRUE 
            AND REGEXP_CONTAINS(scenario, "シナリオ４") IS TRUE 
        THEN "シナリオ１→２→４"
    end as scenario
    ,count(distinct session_id)
from A
group by 1
~~~
GitHub の RSA SSH host key が更新されました REMOTE HOST IDENTIFICATION HAS CHANGED!

## はじめに

今しがた GitHub に Push しようとしたら警告が出て失敗したのでメモ

## 警告内容

`git push` 実行時に以下の警告メッセージが表示されました

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s.
Please contact your system administrator.
Add correct host key in /Users/xxx/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/xxx/.ssh/known_hosts:1
Host key for github.com has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

GitHub に接続しようとしたら host key が変わっているので、盗聴の恐れがある、とのことです

そのままこれを受け入れていいか、本当に盗聴されている可能性があるのか判断できないので、 GitHub のブログを確認すると、以下の記事がありました

https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key/

というわけで、確かに GitHub の方で host key を変更していました

盗聴されそうになったわけではないようです

## 対処法

公式に従って以下のコマンドを実行します

まず ~/.ssh/known_hosts から古い host key を削除します

```bash
ssh-keygen -R github.com
```

GitHub 公式から新しい host key を取得して ~/.ssh/known_hosts に追加します

```bash
curl -L https://api.github.com/meta | jq -r '.ssh_keys | .[]' | sed -e 's/^/github.com /' >> ~/.ssh/known_hosts
```

この状態で `git push` すると警告メッセージなくプッシュできました

## まとめ

一瞬ドキッとしますが、調べればすぐ対処できる内容でした
swiftでC#のLINQ書く


## where
5以上を抽出する。

```csharp
public void GetOver5()
{
    int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, };
    var over5s = numbers.Where(x => x > 5).ToList();
    over5s.ForEach(x => Console.WriteLine(x));
}
```

```swift
func getOver5() {
    let numbers = [1, 2, 3, 4, 5, 6, 7, 8]
    let lowNums = numbers.filter {
        $0 > 5
    }
    lowNums.forEach{ print($0) }
}
```

## select
１足す

```csharp
public void AddOne()
{
    int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, };
    var over5s = numbers.Select(x => x + 1).ToList();
    over5s.ForEach(x => Console.WriteLine(x));
}
```

```swift
func addOne() {
    let numbers = [1, 2, 3, 4, 5, 6, 7, 8]
    
    let addOnes = numbers.map{ $0 + 1 }
    
    addOnes.forEach{ print($0) }
}
```

## take

```csharp
public void Take2()
{
    int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, };
    var take2 = numbers.Take(2).ToList();
    take2.ForEach(x => Console.WriteLine(x));
}
```

```swift
func take2() {
    let numbers = [1, 2, 3, 4, 5, 6, 7, 8]
    
    let take2 = numbers[0...1]
    take2.forEach { print($0) }
}
```

## OrderBy
```csharp
public void Sort()
{
    int[] numbers = new int[] { 8, 7, 6, 5, 4, 3, 2, 1, };
    var sort = numbers.OrderBy(x => x).ToList();
    sort.ForEach(x => Console.WriteLine(x));
}
```

```swift
func sort() {
    let numbers = [8, 7, 6, 5, 4, 3, 2, 1]
    
    let sorted = numbers.sorted()
    
    sorted.forEach{ print($0) }
}
```

## OrderByDescending
```csharp
public void SortDescending()
{
    int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, };
    var sort = numbers.OrderByDescending(x => x).ToList();
    sort.ForEach(x => Console.WriteLine(x));
}
```

```swift
func sortDescending () {
    let numbers = [1, 2, 3, 4, 5, 6, 7, 8]
    
    let sorted = numbers.sorted().reversed()
    
    sorted.forEach{ print($0) }
}
```

## Union
```csharp
public void Union()
{
    let numbers = Set([1, 2, 3, 4])
    let numbers2 = Set([5, 6, 7, 8])
    let union = numbers.union(numbers2)
    union.forEach { print($0) }
}
```

```swift
func Union () {
    let numbers = Set([1, 2, 3, 4])
    let numbers2 = Set([5, 6, 7, 8])
    let union = numbers.union(numbers2)
    union.forEach { print($0) }
}
```

## Intersect
```csharp
public void Intersect()
{
    int[] numbers1 = { 1, 2, 3, 4, };
    int[] numbers2 = { 3, 4, 5, 6, };

    var intersect = numbers1.Intersect(numbers2).ToList();
    intersect.ForEach(x => Console.WriteLine(x));
}
```

```swift
func Intersect () {
    let numbers = Set([1, 2, 3, 4])
    let numbers2 = Set([3, 4, 5, 6])
    let union = numbers.intersection(numbers2)
    union.forEach { print($0) }
}
```

## 編集中...
Snowflakeの外部ステージでストレージ統合の使用を必須にさせる方法

# <やりたいこと>
AWSのS3バケットを外部ステージとして設定することで、S3バケットからSnowflakeのテーブルにCOPYコマンドでデータロードできます。
外部ステージを使ってデータロードする際、以下①～②の方法で、S3バケットへのアクセス権をSnowflakeに付与できます。

**①ストレージ統合を参照**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/32371594-30cd-6a00-119f-b5f245ceed67.png)

**②アクセスキー + シークレットアクセスキーの指定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/5cc24f62-7415-7f6f-324e-317ae509b654.png)


セキュリティの強化を考えると、**①の"ストレージ統合を参照"の方が推奨**されます。

ストレージ統合には、以下のセキュリティ上のメリットがあります。
**・IAMロールでS3にアクセスできるため、アクセスキーやシークレットアクセスキーの認証情報の漏洩の心配がない**
**・SnowflakeからアクセスできるS3バケットとそのフォルダを制限できる**

②の"アクセスキー + シークレットアクセスキーの指定"では、認証情報の漏洩のリスクがあります。

Snowflakeの管理者からすると、とくに本番環境では、①の"ストレージ統合を参照"での運用を希望すると思います。

Snowflakeの以下のアカウントパラメータを使用することで、アクセス権を付与する方法を①の"ストレージ統合を参照"のみに制限できます。

<font color="red">**・REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATION**</font>
⇒TRUEにすると、S3バケットにアクセスする外部ステージを作成するときに、ストレージ統合を指定しないとエラーになります。

<font color="red">**・REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_OPERATION**</font>
⇒TRUEにすると、S3バケットからデータロードするには、ストレージ統合を参照する外部ステージを使用しなければなりません。アクセスキーを使うと、エラーになります。

Snowflakeパラメータを設定するDDLは、以下になります。
```
alter account set REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATION = TRUE;

alter account set REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_OPERATION = TRUE;
```

# <検証>
Snowflakeパラメータの効果を確認するため以下の検証を行います。
**①ストレージ統合を参照しない外部ステージを作成できるかどうか**（「REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATION」の効力を確認）

**②外部ステージ経由でのデータロードの際にアクセスキー + シークレットアクセスキーを指定できるか**
（「REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_OPERATION」の効力を確認）

## ①ストレージ統合を参照しない外部ステージを作成できるかどうか
### ①-1「REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATION」にTRUEにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/dc952c39-ec85-1a5f-5deb-19213aab0d7d.png)

### ①-2ストレージ統合を参照しない外部ステージを作成できないことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/5c3a2b40-14fa-4652-7617-ea39c168aabc.png)

## ②外部ステージ経由でのデータロードの際にアクセスキー + シークレットアクセスキーを指定できるか
### ②-1「REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_OPERATION」にTRUEにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/664baf0f-e333-d30d-dc4c-62d4e3c6f0be.png)

### ②-2ストレージ統合を参照しない外部ステージ経由でのCOPYがエラーになることを確認

以下のCOPYコマンドでは、外部ステージ「my_stg_orc_dev」はストレージ統合を参照しないため、アクセスキーとシークレットアクセスキーを指定して認証します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/9722dff1-b9f4-6763-967a-4ffd84d72720.png)

# おわりに
開発標準等で運用ルールを決めることはもちろん重要ですが、Snowflakeのパラメータを使うことで許可する操作を決めることができます。私もパラメータについては、使い慣れていないため、運用を統一する上で有効なパラメータが他にないか勉強してみようと思います。

# ご案内
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
64x64ドット12時メーターを作る2(STM32G071)(SSD1306)

たぶSSD1306 128x64互換なら何でもいいはず(自己責任)


ハード仕様

０．９６インチ　１２８×６４ドット有機ＥＬディスプレイ（ＯＬＥＤ）　白色
通販コード　P-12031
発売日　2017/11/27

SSD1306互換
128x64
アドレスは、「3C」


![o_cop433.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/13b755fa-baed-1869-9fa8-34c10fa352ad.jpeg)
Chat GPTを活用した英語学習

話題のChatGPTですが、英語学習においても有効に活用できます。
以下では、例としてTOEIC対策の学習方法を紹介します。

## Chat GPTを活用したTOEIC対策

### 問題の出題

入力した文章をもとに、その内容に合った問題を自動生成してくれます。
例えば下記のような依頼をしてみます。
![Screen Shot 2023-03-27 at 0.32.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1197988/886c503d-e666-903f-130d-e9800f5577ef.png)

適度な難易度の問題が出題されています。

### 自動採点と解説

回答内容に応じて適切に正誤を判断し、端的でわかりやすい解説を提供しています。
![Screen Shot 2023-03-26 at 23.56.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1197988/abcdafc3-3892-8440-ba25-aa5307176058.png)

### 再出題
前回の出題と同様のフォーマットで出題してくれています。
![Screen Shot 2023-03-27 at 0.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1197988/f22b19e2-2004-71bb-077b-a2db3d5ac637.png)

ちなみに、現在の英語力の入力を変更すると、入力に応じて出題レベルも変わった気がします。（微妙なところではありますが、、）
![Screen Shot 2023-03-27 at 0.09.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1197988/5e670033-9910-efdf-4660-708d97624889.png)

### その他の使い方
以下のように依頼することで、過去間違えた箇所に絞って復習することもできます。
![Screen Shot 2023-03-27 at 0.59.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1197988/d70b188d-d176-7173-c57d-a35206d0ca0e.png)

他にも、過去の学習実績に応じて、学習方法の改善提案などもできます。

## まとめ
このようにChatGPTは英語学習にも有効です。
特に、学習者の英語レベルや直近の回答を考慮して、最適な学習材料を提供してくれる点や、
個人の好みに合わせて細かいチューニングを即座に行える点が優秀だと思います。
64x64ドット12時メーターを作る1(STM32G071)(SSD1306)

完成図

![o_cop441.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a18d258a-f6cc-86e6-9416-93aabbefe076.jpeg)



目的
とりあえず長針を作って
後で短針を合成する

仕様

長針のみ
64x64固定
真円
0時から11時のまでの1時刻みで12バターン
配列は、縦に結合
線の太さは、1ドット
めもりあり


![o_cop442.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/48bc5744-788b-9f93-0c81-e7522bd5d57a.jpeg)
テキストエディタ編集まとめ

###### 以下は、テキストエディタで編集を行う際の操作のまとめ
##    はじめに

　　　　こちらは、主にフリーソフトのテキストエディタである、[サクラエディタ](https://sakura-editor.github.io/help/HLP000001.html)で個人的に良く使用する編集等を行う手順まとめです。

○<font color="blue">矩形選択</font>（選択範囲の文字を一括で編集）

　 (1) 以下の例で1行目～4行目の21桁目から8文字の部分のみ切り取る
　　1･･･切り取る文字の開始位置のカーソルを持ってくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214133/a9e0e1bb-fb9e-7ae4-f4f6-fe343bf9854c.png)
　　2･･･Shift+「F6」ボタンを押して（矩形範囲選択モード）、8文字まで矢印ボタンでカーソルを持ってくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214133/f0451bed-8478-a0a0-c8db-50a0f6fc637b.png)
　　3･･･4行目まで矢印ボタンでカーソルを持ってきて※1、切り取る。
　　　　※1 ファイルの終了までならCtrl+「End」　大量のデータがある場合など
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214133/207279ce-9049-0967-4dfc-b9df94801c90.png)　　
　 (2) 以下のように、貼り付けたい場所にカーソルを持ってきて貼り付け等が可能です。（[矩形編集](https://sakura-editor.github.io/help/HLP000115.html)）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214133/fdada867-a683-ac01-9b8b-0b200163c463.png)


○<font color="blue">改行の置換</font>（改行コードを置換する）

　 (1) 以下の例で改行コードを削除する
　　1･･･Ctrl+「R」で、<font color="Magenta">__正規表現(E)__</font>のチェック入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214133/9b2c8fb9-48fa-0045-f816-96fe5a84ae42.png)


　　2･･･置換前に改行コードである「￥r￥n」を入力
※例では[CRLF](https://wa3.i-3-i.info/word11580.html)を使用（￥マークは半角文字）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214133/c999abab-1d5b-851d-efcd-39ba2aa22f29.png)

　　3･･･「置換」を押下し、改行を空白に置換
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214133/585e7e9c-509b-17d6-e0eb-201005bf1b05.png)

　 (2) 以下のように、任意の文字列の前や後ろで改行することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214133/d5bdb7fd-455d-bc4c-4de8-60c3bfc17f8f.png)
　　 ･･･44444444　を　￥r￥n44444444￥r￥n　に置換して　44444444　の前と後ろで改行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214133/0c411267-2ba7-352c-d48d-57d8d61574e7.png)
入社半年エンジニアのお話

## 新卒で入社して、半年目のエンジニアのお話

#### 軽く自己紹介
- 沖縄生まれ沖縄育ち
- 現在22歳
- 高校卒業後 -> 留学 -> 専門学校 -> 今の会社に新卒として入社
- エンジニア半年目(2023/03　現在)
- 好きな食べ物はジャンクフード、焼き肉、寿司etc...
- 趣味はキャッチボールですが最近相手がいないので、HotWheels(ホットウィール)というミニカーを集めています。

#### どんな会社で働いているのか
- 10数人規模の主にwebシステム開発を行っている会社
- 基本リモートワーク

#### 自分が立てたエンジニア1年目の目標(まだ途中ですが...)
- とりあえず人並みにコードの読み書きができるようになること
- 周りとコミュニケーションをしっかり取って連携ができること
- 体重を増やすこと (これは達成しつつある)

#### これまで(入社半年目まで)にやってきたこと
- 研修3ヶ月 (週2稼働、PHPでのブログ開発、LaravelでのECサイト構築)

##### 入社　~~  ↓↓↓エンジニア実務スタート↓↓↓  ~~
- Laravel, Vueでの開発に参加
    - 最初は先輩エンジニアから案件の詳細を説明してもらったりした。
    - 実務最初にやった作業はfaviconの設置だったはず (Vueの知識不足でどこを触っていいのか戸惑った。)
    - 一緒に開発しているエンジニアのコードレビューなどもした (AWSのSESと初めてご対面したので、実装者に説明をしてもらいながら一緒にレビューをした。)

##### 2~3ヶ月目頃 ~~ なんとなく開発の流れをつかめてきた ~~
- 機能(編集系)の開発をした。
    - 画面の作成と、laravel側のロジックを書いたりなどした。(初めての機能開発)
    - 直接DBを触ってやっていた作業を、アプリ上でできるようになったので初めてお役に立てた感じがした。

##### 4~5ヶ月目頃 ~~ リモートでの開発やコミュニケーションに慣れてきた ~~
- 大きい機能の開発をした。
    - 工数見積から始まり、DB設計、実装、テストetc...
        - DB設計のリレーションなどで少し苦戦した
    - ここで見積もりを失敗したりした。

##### 5~半年目頃(最近)
- Laravel、GraphQL、Reactの案件に参加
    - GraphQL(lighthouse)でのAPI開発。
        - スキーマ定義はされている状態だったのでちょっと修正して、Mutationの処理やバリデーションを実装したりした。後テストも。
    - 最近は新規機能のスキーマ定義などをやったりしている。

みたいな感じの半年間でした!

#### 実務の中で失敗したこと、努力が必要だなと感じたこと(たくさんありますが、いくつかにしておきます。)
- 見積もりが甘くスケジュールがパツパツになり、オーバーしてしまった。先輩PMにお手数をおかけした
- 実装でわからない箇所があって質問する時、説明が下手で何をしたいのかがわからない時が多々あった。

#### 入社半年でできるようになったこと
- laravel完全に理解した
- Vue2少しわかる
- DB設計(正しい設計か怪しい)
- nuxtのプロジェクトをgithub actionsでテストからデプロイまで行ける
- lighthouse(GraphQL)でのAPI開発かじれる
- 仕様書見て実装方法がわからない箇所は相談しつつ開発できるようにはなったかも

#### 入社して今まででのお気持ち
- 今まで数ファイル程度の開発しかしていなかったので、最初、ファイル数の多さにちょっとチビった。(嘘)
- 自分以外の人が書いたコードを読むのは初めてでいろいろな書き方があって面白いなと思いつつ、自分もこのようなコードが書けるのか不安であった。
- 今まで勉強してきたことを実際の業務で使えるのは嬉しかった。
- 何がわからないのかがわからないことがあって、意味不明な時チビった(嘘)
- わからない箇所が次の日になって解決することがあったりして、再起動は大切だなぁと思った。
- リモートワークもいいけど、集まってワイワイしながら開発するのも楽しいなと感じた。
- とりあえず楽しく仕事ができることに感謝。

#### これからの目標
- ちょっとずつ技術についての記事を書けるようになる
- 強そうな体を手に入れる

最後まで読んでいただきありがとうございます!これからも精進するのでよろしくお願いします!
ue4.27でandroidのパッケージ化の時に出るrungradle.batエラーの解消方法

# チュートリアルをあてにすんな
恐らく始めに海外だったり日本のチュートリアルを見よう見まねでやったと思いますが人によって言うこと全然違いますよね。わかります。

## javaを独自で入れるな
海外のチュートリアルをみたら独自でjavaを入れて環境変数を設定するみたいなことが書いてあったのですが、これが原因でエラーはいてました。androidstudioにもともとjavaが入ってるので個別でダウンロードしないでください。これをやった場合、プロジェクト名が無いとかのエラーが出てビルドとおりません。

## 4.27でandroidのセットアップ

詳しくは公式を見ましょう

https://docs.unrealengine.com/4.27/ja/SharingAndReleasing/Mobile/Android/Setup/AndroidStudio/

①androidstudio 4.0をダウンロードする
②sdk platformでandroid8.0～10.0+までを有効にし、API31等は無効にする
③sdk toolsで28.03と29.03のみを有効化する

これで行けるはずです。環境変数を設定してしまった場合、削除してください。
ue4内の設定はほかの方が書いてるブログでも読んでください

https://zenn.dev/daichi_gamedev/books/unreal-engine-5/viewer/android-play
【Docker】なぜかコンテナが削除できない時のエラー対処法

## 概要
Docker Desktop for Mac などのクライアントツールで、なぜか GUI に表示されているコンテナの削除ボタンを押しても削除できないことがある。

エラー内容

:::note warn
**Deletion failed**
chdir /Users/ユーザ名/対象のディレクトリパス/: no such file or directory
:::

## Docker プロセスを全て表示してみる
`docker ps` でプロセスを確認。…してみても、何も表示されない。

そんな時は、`-a` オプションをつけて Docker のプロセスを全て覗いてみよう。

```zsh
# プロセスすべて確認
docker ps -a

# 結果
CONTAINER ID   IMAGE                                 COMMAND                  CREATED        STATUS                      PORTS     NAMES
f2ec9862617b   xxxxx/xxxxx:latest                    "sh -c ' /opt/bin/mi…"   3 months ago   Exited (0) 3 months ago               xxxxx-xxxxx
96e9065c2fd6   xxxxx-dev                             "/bin/sh -ecx 'ruby …"   5 months ago   Exited (137) 3 months ago             xxxxx-app-1
7d37807b9ed3   redis:latest                          "docker-entrypoint.s…"   5 months ago   Exited (0) 3 months ago               xxxxx-redis
```
何やら動いてました。

## 不要なプロセスを消す
`docker rm` を使って消すのも良いが、

```zsh
docker rm コンテナID1 コンテナID2 ...
```

Docker でクリティカルに使用してるコンテナ等がない場合、使用していないリソースを全て一括削除するのも楽なのでアリ。

```zsh
docker system prune
```
👉 停止コンテナ、タグ無しイメージ、未使用ボリューム、未使用ネットワークなどを一括削除する

### 未使用リソースを個別に消す方法
`docker system prune` ではなく個別に消す場合。
以下、すべて `-f` オプションで強制実行もできる。

```zsh
# 停止コンテナ一括削除
docker container prune

# 未使用イメージ一括削除
docker image prune

# 未使用ボリューム一括削除
docker volume prune

# 未使用ネットワーク一括削除
docker network prune
```

### 削除後

無事、不要なコンテナが消えてキレイになった
![docker_dt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/65acc3bf-9cb6-b9f8-d319-6250c191f663.png)
LinuCレベル1　一回目　SSH

# LinuCレベル1　一回目
##### 直接日本語でIT知識を勉強し、資格取得へ目指す。

##### SSHの操作方法
SSHに関連するファイル名

###### クライアント側
ssh_config 　　クライアント側のSSHの設定
id_rsa　　　　　SSHの秘密鍵
id_rsa.pub　　　SSHの公開鍵
known_host　　接続先サーバの情報や送られてきたホスト認証のための公開鍵
ユーザ別にホームディレクトリ直下の　.ssh　に保存される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/c1442c2d-ede5-69bc-6496-d54d10b5a234.png)


###### host側
sshd_config            host側の設定
ssh_host_rsa_key       SSHのホスト側の秘密鍵
ssh_host_rsa_key.pub　 SSHのホスト側の公開鍵　
authorized_keys　　　  クライアント(user)によって登録された公開鍵のリスト

「etc」ディレクトリ直下の「ssh」に保存され、「authorized_keys」のみホームディレクトリ直下の「.ssh」に保存される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/e3525894-6208-a0e7-13dd-6e4d4fa9d5d4.png)

#### 公開鍵と秘密鍵のペアを作成
ssh-keygen   　　　公開鍵と秘密鍵を作成しろ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/a3e3e271-d845-548f-10cf-ef91f55080de.png)

ssh　　接続先アカウント名＠接続先ホスト名/IPアドレス

例：ssh testuser@192.168.56.11
ログイン先は192.168.56.11のtestuserというアカウント　SSHで接続しろ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/0f8716d4-3b35-6e58-943c-f9393e0eeb4a.png)

logout/exit/ctrl+D       作業を終了し、SSH接続を切断する


IPアドレスの確認方法

ip a コマンド　

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 
   inet 127.0.0.1/8 scope host lo 
      valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 
   inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic eth0 
      valid_lft 71135sec preferred_lft 71135sec

2: eth0:の部分の　inetの後ろの　192.168.1.100は ipアドレスである。