OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel Sail 開発環境のカスタマイズ

# この記事でやりたいこと
Laravel Sail 開発環境で、
1. タイムゾーンをJST（日本標準時）に変更する
1. MySQLの文字コードをutf8系に変更する

上記2点のカスタマイズを行う。

___
### 動作環境
- macOS 13.5.2
- PHP 8.2.11
- Laravel Framework 10.28.0
- Docker version 23.0.5, build bc4487a

## 詳細

Laravel Sail は、LaravelでDockerコンテナによる開発環境を提供してくれるコマンドラインインターフェースであるが、**タイムゾーン**と**MySQLの文字コード**の変更は、開発を始める前にやっておくべきである。

Sailは docker-compose を利用してDockerコンテナを起動し、開発環境を立ち上げている。
Dockerコンテナの設定は Dockerfile に記述されており、__この Dockerfile をいじることで開発環境を独自にカスタマイズすることができる__。


### 下準備
まずはターミナルで下記のコマンドを実行して、アプリケーションルートに docker ディレクトリを作成する。
~~~
sail artisan sail:publish
~~~
（これにより、docker-compose.yml の記述が一部変更され、docker ディレクトリおよびその中の Dockerfile が利用できるようになった。)

ここで、dockerディレクトリを覗いてみると、いくつかの子ディレクトリが存在することが分かる(筆者の場合、8.0、8.1、8.2、8.3 の４つの子ディレクトリがあった)。
このうち実際に使用されるのは１つだけであり、どれが使用されるかは docker-compose.yml の `services.laravel.test.build.context`の箇所に記載されている。

~~~docker-compose.yml
services:
    laravel.test:
        build:
            context: ./docker/8.2   # ← ココを見る
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.2/app
# 以下略...
~~~

筆者の場合、docker/__8.2__ のディレクトリが使われていることが分かったので、以降はdocker/__8.2__/Dockerfile を編集していく。
以上で下準備は完了。

___

### 本題１: タイムゾーンのカスタマイズ
ようやく本題に入る。
__タイムゾーンをJST（日本標準時）に変更__ していく。

やることは単純で、Dockerfile内の ENV TZ の箇所を __'Asia/Tokyo'__ に変えるだけである。

~~~docker/8.2/Dockerfile
# ENV TZ=UTC  コメントアウトまたは削除
# ↓ 追加
ENV TZ='Asia/Tokyo'
~~~

変更後はDockerイメージを再ビルドする必要がある（しばらく時間がかかる）。

~~~
sail build --no-cache
~~~

再ビルド完了後、 `sail up -d`コマンドでDockerコンテナを起動してから、下記のコマンドでDockerコンテナにログインして日付を確認してみる。
~~~
(sail up -d コマンドを実行してから行うこと)
sail shell

date
~~~

すると、例えば `Thu Feb 24 00:00:00 JST 2023` のように時刻が表示される。
__JST__ となっていれば無事成功。

___

### 本題２: MySQLの文字コードを変更する
2つ目の本題に入る。
MySQLの文字コードが正しいもの設定されていない場合、文字が適切に表示されなくなってしまうので、これもカスタマイズする必要がある。

docker/__8.2__ ディレクトリ（← __8.2__ の部分は適宜自身のものに読み替えること）に `my.cnf` ファイルを新規作成し、以下の内容を記述する。

~~~docker/8.2/my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin

[client]
default-character-set = utf8mb4
~~~

その後、MySQLの設定ファイルとしてこのファイルをMySQLコンテナの /etc ディレクトリに配置するように docker-compose.yml に追記する。下記のように、`mysql`の`volumes`の欄に `'./docker/8.2/my.cnf:/etc/my.cnf'` を追加する。

~~~docker-compose.yml
services:
    laravel.test:
       # （中略）
    mysql:
        image: 'mysql/mysql-server:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
           # （中略）
        volumes:
            - 'sail-mysql:/var/lib/mysql'
            - './docker/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
            - './docker/8.2/my.cnf:/etc/my.cnf'    # この１行を追加!!!!!!!
        networks:
            - sail
        # 以下略...
~~~

完了したら、`sail down`コマンドで一度コンテナを停止させ、再度`sail up -d`で起動してから、下記のコマンドで文字コードを確認してみる。
~~~
sail mysql

mysql > show variables like '%char%';
~~~
画像のように、Value欄がutf8系になっていればOK！
![スクリーンショット 2023-10-12 0.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/943160c7-1164-24f4-930e-cf5a841d07c1.png)

以上です。
___

## 参考

https://amzn.asia/d/9oduEHe
Oracle Formsの近代化：CheerpJとJava Web Startの比較

![My-project-1-14.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/95f5b71f-c360-fad6-1aa3-5949cb3a9d9d.jpeg)
　　　[]()
ウェブテクノロジーの進化に伴い、レガシーシステムの近代化は多くの組織にとって必要不可欠なものとなっています。エンタープライズアプリケーションを構築するためのフレームワークとして広く使われているOracle Formsも例外ではありません。

レガシーのOracle Formsアプリケーションは、新しいテクノロジー、ブラウザ、およびデバイスとの互換性の問題に直面する可能性があります。Oracle Formsを最新化することで、最新の Web標準との互換性が確保され、デスクトップ、ラップトップ、タブレット、スマートフォンなど、さまざまなデバイスでアプリケーションをシームレスに実行できるようになります。この互換性により、組織はモビリティを採用し、多様なユーザーベースのニーズに対応する機会を得ることができます。

Oracle Formsを最新化する場合、CheerpJとJava Web Startの2つの一般的なソリューションが登場します。このブログ記事では、[Oracle Formsを最新化するためのソリューションとして推奨されるCheerpJの利点](https://leaningtech.com/accessing-oracle-forms-without-internet-explorer/)を、Java Web Startと比較しながらご紹介します。

**CheerpJを理解する**
CheerpJは、ブラウザ上でJavaアプリケーションを直接実行できる強力な技術です。[JavaバイトコードをJavaScriptに変換](https://leaningtech.com/cheerpj)し、シームレスな互換性を提供し、プラグインやクライアントサイドのインストールを不要にします。HTML5とJavaScriptのポテンシャルを最大限に活用することで、CheerpJはOracle FormsアプリケーションをWeb上で動作させるモダンで効率的な方法を提供します。

**Java Web Startに対するCheerpJの利点：**
**1- 確実な互換性のためアプリに依存しない：**
Java Web Startの重要な課題の1つは、クライアント側のJava Runtime Environment（JRE）への依存である。これはしばしば互換性の問題やバージョンの衝突につながります。一方、CheerpJは、JREの必要性を排除し、あらゆるオペレーティングシステムで動作する幅広いブラウザとアプリケーションの互換性を実現します。このJREフリーのブラウザ互換性は、異なるプラットフォーム間でスムーズかつ一貫したユーザーエクスペリエンスを保証します。

**2 - セキュリティの強化：**
Java Web Startは、Javaサンドボックスモデルに依存しており、レガシーアプリケーションを扱う際に懸念されることがあります。CheerpJは、JavaScriptのセキュリティモデルを活用することで、より安全な環境を提供します。CheerpJによるJavaバイトコードからJavaScriptコードへの変換は、システムリソースへのアクセスをきめ細かく制御し、潜在的なセキュリティリスクを低減します。

**3 - シームレスなデプロイメント：**
上述したように、Java Web Startはクライアント側にJREのインストールと設定を必要としますが、これは複雑で時間のかかるプロセスです。CheerpJは、追加のインストールを不要にすることで、デプロイプロセスを簡素化します。JavaからJavaScriptに変換されたコードは、Webサーバー上で簡単にホストすることができ、ブラウザーから直接アクセスすることができます。

**4 - 最新のウェブ機能：**
CheerpJは、HTML5やJavaScriptのような最新のWeb技術を活用し、レスポンシブでインタラクティブなユーザーインターフェイスを実現します。これにより、企業はOracle Formsアプリケーションを、レスポンシブレイアウト、ダイナミックコンテンツ、リッチユーザーエクスペリエンスといった最新の機能で強化することができます。CheerpJを使えば、Oracle Formsアプリケーションの近代化は機能性だけにとどまらず、美しさや使いやすさにも及びます。

[Oracle Formsアプリケーションの近代化](https://leaningtech.com/alternative-ways-for-launching-oracle-forms-in-2021/)に関して、すでに非推奨となっているJava Web StartよりもCheerpJが望ましいソリューションとして浮上しています。クロスブラウザー互換性、強化されたセキュリティ、シームレスなデプロイメント、そして最新のWeb機能により、CheerpJはOracle Formsアプリケーションを最新のWeb時代に導入するための堅牢で効率的なアプローチを提供します。CheerpJを選択することで、組織はOracle Formsアプリケーションを活性化し、Webのパワーを活用しながら優れたユーザーエクスペリエンスを提供することができます。

https://leaningtech.com/legacy-modernisation-jp/

引用元：https://leaningtech.com/modernizing-oracle-forms-cheerpj-vs-java-web-start/
[Unity]A meta data file (.meta) exists but its asset 'Assets/hoge.png' can't be found.～警告が消えなくて悩んだ話

## 結論から言うと
怒られている.metaファイルを消したあと、**Unityを一度終了**して起動しなおしましょう。

## やったこと
うっかりUnityに関係ないファイルをドラッグドロップで入れてしまい、そのファイルを消したら
> A meta data file (.meta) exists but its asset 'Assets/hoge.png' can't be found.～

と警告が出てきました。

.metaファイルも一緒に消せと言っているようなので、ファイルを戻してからプロジェクトフォルダ内のAssetsフォルダにできていた同じ名前の.metaファイルを一緒に削除。

…しても警告が消えない。

なんで!?　とさんざん悩んで、Unityを終了して起動しなおせば良いということに気づくのにかなり時間がかかってしまいました。
AMI ブロックパブリックアクセス（AMI BPA）のデフォルト設定が更新されました


# ■概要

AWSより通知が届きました。日が近いので取り急ぎメモ。

件名：
[アクションが必要な場合があります] AMI ブロックパブリックアクセスのデフォルト設定が更新されました | [Action may be required] AMI Block Public Access default setting updated [AWS Account: 123456789] [AP-NORTHEAST-1]

# ■内容

2023年10月16日から、
AMIが誤操作等で公開される事を防ぐ機能（AMI BPA）がデフォルトで有効化されるとの事。

AMIの公開共有を設定していない場合、特に影響やアクションの必要性はなく、
パブリックAMIを保有する既存のAWSアカウントにも影響ないようです。

# ■AMI BPAとは

自身のAWSアカウント以外からのAMI（Amazon Machine Image)へのアクセスを禁止することができる機能です。
これまでもAMI単位でパブリックアクセスの可否を設定できましたが、BPAを有効にするとそのAWSアカウント内ではパブリックアクセス可能なAMIを作成できなくなり、操作ミス等で外部に公開することを防ぐことができます。

Amazon EC2 が Amazon マシンイメージのブロックパブリックアクセスに対応
https://aws.amazon.com/jp/about-aws/whats-new/2023/09/amazon-ec2-block-public-access-machine-images/

# ■例外的な部分

このデフォルト設定は、2023年7月15日以降 AMIをパブリックに共有していない既存のアカウントでも有効になる。
（逆を言うと、2023年7月15日以降に公開共有していたら適用外…？）

デフォルトが適用された後（2023年10月16日以降）に作成された新しいアカウントと、2023年7月15日以降にAMIをパブリックに共有していない既存のアカウントで、AMIの公開共有を行う場合はAMI BPAを無効に設定する必要がある。

# ■AMI BPAはどこで設定する？

以下EC2のページから設定できるみたいですね。

![A_2023-10-11_23h51_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/a4bbb593-2947-0f3f-d002-a83d3d9a44d4.png)

↓

![B_2023-10-11_23h53_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/707153a5-35da-01db-f66e-83a400386afe.png)

# ■最後に
慌ただしく書きましたが、お役に立てば。
【Next.js】ReferenceError: window is not defined解消法

`ReferenceError: window is not defined`のエラーが発生した場合には以下のように記述することで解消できます。

```tsx
import { useEffect } from 'react'

export default function Sample() {
  useEffect(() => {
    // windowが必要な処理
  }, [])

  return (
    
  )
}

```
新卒フルリモートエンジニアの僕が心がけている事

# 始めに
ご閲覧ありがとうございます。

4年課程の専門学校を卒業したのち、自社開発フルリモートwebバックエンドエンジニアになりました。
現在は岐阜のど田舎で愛犬とほのぼの生活しております。

始めに言っておきますが、新卒のフルリモートエンジニアはなかなかに地獄です。
会社にもよりますが、自己管理能力や、コミュニケーション能力、積極性、自走力がないと詰みます。

そんな当事者の自分が、何を意識して普段仕事に取り組んでいるかをまとめてみました。
ぜひ、最後まで見ていってもらえれば幸いです。


## 1. 常に前のめりでポジティブに
**「なんでもやります！やらせてください！」のスタンスを大事にすべき**
ネガティブな人に仕事は回ってきませんし、重要な案件を任せてもらえないのは当たり前の話です。
どんな案件でもタスクでも、新卒１年目にとっては必ず学びがあるはずです。

それに、１年目は教わる立場の人間です。
もし自分に後輩や部下ができた時、ポジティブで意欲的な部下と、ネガティブで受け身の部下がいたら、どちらの方が好印象でしょうか？間違いなく前者です。

なんでも積極的に取り組む姿勢があれば、周りの同期よりも多くの経験を積めて、結果的に自分のためになります。


## 2. 先輩エンジニアには甘える
技術力、プロダクトへの理解、問題解決力や人間力。
エンジニアとして働く上で、必要な力は必ず先輩社員が持ち合わせているはずです。

分からない事は分からないと素直に教えを乞うことも大切です。ただし、甘え過ぎも良くありません。
ここまで調べて、ここまで辿り着いた結果こうなりました。と、
**必ず自分で考えて行動した結果を添えて質問しましょう。**


## 3. たくさん失敗する
最初から全てのアンチパターンを網羅してる人なんて絶対にいません。
よくない実装方法、よくない進め方をたくさんして、たくさん指摘されて１つづつアンチパターンを覚えていきましょう。
2年目からは誰も指摘してくれません。

**失敗しても許される今だからこそ、失敗したもん勝ちです。**


## 4. 生成形AIに頼りすぎず、自分で考える
ChatGPT めちゃくちゃ便利ですよね。実はこの記事の雛形も作成してもらいました。
メチャクチャ便利な反面、エンジニアとしての思考力が低下すると考えてます。
自分で記事を読みあさって、自分の中で解釈しないと、
**同じ問題に遭遇した時にまた同じ質問をAIに飛ばすことになります。（僕も結構やっちゃいます）**
その場しのぎの使い方をすべきではないです。きちんと理解して次のステップに進みましょう。

## 5. コミュニケーションは積極的に取る
ぶっちゃけリモートで働く上で1番重要な事ってコミュニケーションだと思います。
だからこそ、受け身の人間はリモートワークに向いていないと僕は思います。
エンジニアは情報共有が命です。ただコードが書ければいいってもんではないです。
自分が3時間悩んで解決できることも、聞けば５分１０分で解決することもあります。

繰り返しになりますが、
**良好な人間関係を築いて円滑にコミュニケーションを取る事がリモートワークで最も大切です。**
雑談でも、業務に関することでもなんでもいいでしょう。積極的にコミュニケーションは取るべきです。

## 6. 仕事を楽しむ
先ほどのポジティブ思考とも少し重なってきますが、1日のほとんどを仕事の時間に費やすわけですから、嫌々やるより好んでやった方がいいでしょう。その方が生産性も上がります。

技術が嫌いなのにエンジニアになった方はいないと思います。
新しい知識が身についた時、自分の成長を感じられた時、何かを達成した時。これらの瞬間を大切にすべきです。

## 7. 敬意を忘れない。
新卒1年目は、いわば半人前です。
自分に時間を割いてくださる先輩社員、上司、管理職の方、同期、そして会社へ敬意を１秒たりとも忘れてはいけません。

**今の自分があるのは、今の生活ができるのは、今自分がエンジニアとして働けているのは、全てこれらの人々のおかげだという事実を忘れず、常に感謝と敬意の気持ちを持つべきです。**

同期や先輩社員、上司とどれだけ仲が良くなっても、敬意を持って接するべきです。
そして、コードなり成果でしっかりと感謝を返していくべきです。

## 8. 全て自責思考で捉える。
社会人であれば、理不尽な事も納得いかない事もたくさんあると思います。
**しかし、その責任は全て自分にあります。**
この会社のこの環境を選んだのは自分自身であり、不満があるのであれば行動しなかった自分が悪いのです。

文句ばっか言って他責思考になっても良い事なんて１つもありません。まさに百害あって一利なしです。
大切な事は、今の自分に何ができるのか、自分の何がいけなかったのか、じゃあどうするべきなのかを考えて行動に移す事です。

自分が選択した事に対して責任を他者に押し付けるのは愚行極まりないです。

## 最後に

長々とダラダラと書いてみました。結構文章にするって難しいですね（笑）
初めの方に「新卒のフルリモートエンジニアはなかなかに地獄」なんて書きましたけど、これも正直自分次第です。ありがたいことに、今の自分の環境はものすごく良いです。

この記事が、少しでも参考になれれば嬉しいです！
最後までご閲覧いただき、ありがとうございました！！
WindowsでのPySparkの環境構築



## PySparkとは

**PySpark** とは、Apache Spark の機能を Python から操作できるようにするための API です。  
大規模なデータ処理、ETL、機械学習などの用途に広く利用されており、Pythonエンジニアでも分散処理に強い Spark を扱うことができます。



## WindowsでのPySpark環境構築手順

Windows環境では、PySpark を動作させるためにいくつかの依存ソフトや設定が必要です。



### 1. Javaのインストール

PySpark は Java Virtual Machine（JVM）上で動作するため、まずは Java（JDK）をインストールします。

- Oracle JDK ダウンロード：[https://www.oracle.com/java/technologies/javase-downloads.html](https://www.oracle.com/java/technologies/javase-downloads.html)



### 2. Apache Sparkのダウンロード

Apache Spark の公式サイトから ZIP ファイルをダウンロードし、任意のフォルダに展開します。

- Spark公式：[https://spark.apache.org/downloads.html](https://spark.apache.org/downloads.html)

例：`C:\spark-2.4.5-bin-hadoop2.7`



### 3. winutils.exeの配置

Windows上でSparkを実行するためには `winutils.exe` が必要です。

- ダウンロードページ：[https://github.com/steveloughran/winutils](https://github.com/steveloughran/winutils)

ダウンロードした `winutils.exe` は、Sparkを展開したディレクトリの `bin` フォルダ内に配置してください。

C:\spark-2.4.5-bin-hadoop2.7\bin\winutils.exe




### 4. 環境変数の設定

以下の環境変数をシステムに追加します。

- `HADOOP_HOME`：Sparkの展開パス  
  例：`C:\spark-2.4.5-bin-hadoop2.7`
- `PATH`：`%HADOOP_HOME%\bin` を追加

設定方法：  
コントロールパネル → システムとセキュリティ → システム → システムの詳細設定 → 環境変数



### 5. Sparkの動作確認

コマンドプロンプトを開き、以下を実行します：

```bash
spark-shell
```
[MUI] コンポーネントをカスタマイズする方法

## 環境構築 ※今回はviteを使っています
* 下記コマンドを実行
```zsh
yarn create vite #Enter
# プロジェクト名を入力　（今回は「vite-project」とする）
# 「React」を選択
# 「TypeScript」を選択
```
```zsh
cd vite-project1 #Enter
yarn #Enter
yarn add @mui/material @emotion/react @emotion/styled #Enter
```
* src/index.cssの中身を削除

## src/App.tsxを編集
```typescript
// src/App.tsx
import { Box, Typography, AppBar, Toolbar } from "@mui/material";
import { styled } from "@mui/material/styles";

const ErrorAppBar = styled(AppBar)(() => ({
    width: "100vw",
    backgroundColor: "red",
}));

function App() {
    return (
        <Box>
            {/*↓↓デフォルトのAppBar*/}
            <AppBar sx={{ height: 70 }}>
                <Toolbar sx={{ height: "100%" }}>
                    <Typography>Note</Typography>
                </Toolbar>
            </AppBar>

            {/*　カスタマイズしたAppBar*/}
            <ErrorAppBar sx={{ height: 70, mt: "70px" }}>
                <Toolbar sx={{ height: "100%" }}>
                    <Typography>Error</Typography>
                </Toolbar>
            </ErrorAppBar>
        </Box>
    );
}

export default App;

```

## 結果
![スクリーンショット 2023-10-11 23.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525908/e34fe7c9-3f51-5ef1-c8f4-aeedea315cc0.png)

* 青いバーがデフォルトのAppBarです
* 赤いバーがカスタマイズしたAppBarです

## 終わりに
少し構えてましたが、これくらいのカスタマイズだったら意外と簡単でしたね
Goで学ぶGraphQLサーバーサイド（１）

こんにちは。

今日の記事からGoで学ぶGraphQLサーバーサイドについて記載しています。

# はじめに 

GraphQLはリクエストクエリを書くことで、必要な分のデータを柔軟に取得することが可能なAPI形式です。
RESTとは違うその仕組みはクライアント目線ではとても便利なものですが、サーバーサイドに立ってみると無限の組み合わせがあるリクエストクエリに一体どう対処しているのか不思議に思う人もいるでしょう。
この本では、Goのgqlgenというライブラリを用いてGraphQLサーバーを作る過程を通して、サーバーサイドGraphQLを理解・開発するのに必要な知識を解説していきたいと思います。


## この本について
ウェブAPIのアーキテクチャとしてメジャーなものはREST APIかと思いますが、近年はGraphQLの形式で自社サービスAPIを公開する例が増えてきています。
リクエストーレスポンスが1:1対応されており取得可能情報が固定されていたREST APIとは異なり、開発者が欲しい情報のみを柔軟に取り出してくることができるGraphQLはクライアント目線からはとても便利なものであり、今後も採用事例が増えていくのではないかと思います。
しかしサーバーサイドの目線に立つと、1つのリクエストパターン(メソッド・パス)に対して決まったハンドラを1つ用意すればよかったRESTに対して、無数のパターンが存在するリクエストクエリに対してどのようにレスポンスを作っていけばいいのかというGraphQLサーバー側のロジックは、知識がないと想像しにくいのではないでしょうか。

そこでこの本では、Goのgqlgenというライブラリを使いGraphQLサーバーを実装する過程を紹介しながら、サーバーサイドGraphQLの一般的な知識も解説していきたいと思います。

## 本の構成

### 1章: はじめに 

### 2章: GraphQLサーバーを動かしてみる

ここでは`gqlgen`に用意されているサンプルアプリを稼働させる様子を紹介します。
また、その過程の中で`gqlgen`で自動生成させるコードの解説も行います。

### 3章: 自作のスキーマを使ってGraphQLサーバーを作ろう

前章のような既存のサンプルアプリではなく、自作のGraphQLスキーマからサーバーコードを生成させる過程を紹介します。

### 4章: リゾルバの実装 - 基本編

この章では`gqlgen`にて自動生成されたコードを元に、GraphQLサーバーのコアとなるリゾルバの実装を行います。

### 5章: カスタムスカラ型の導入

この章ではGraphQLのスキーマ中に定義されたカスタムスカラ型を、どのGoのデータ型に紐付けするかの設定方法を解説します。

### 6章: リゾルバの実装 - 応用編

この章では、リゾルバを分割することによって、GraphQLの肝となっている「リクエストされたデータのみ取得する」という性質をサーバーサイド側の視点で紐解いていきたいと思います。

### 7章: N+1問題の回避 - dataloaderの導入

サーバーサイドGraphQLには、リクエストクエリが複雑になり取得するべきオブジェクトの数が増えると、その分だけDBに対して発行するSQL文も増えていくN+1問題という課題がよく知られています。
ここではそれを回避するためにDataloaderというものを導入する様子をお見せします。

### 8章: クエリ複雑度の制限

GraphQLサーバーでは、サーバーに負荷をかけるようなあまりに複雑なクエリはそもそも実行させないようにする制限をかける場合があります。
この章では、そのクエリ複雑度の計算方法と、それによるクエリ実行制限のかけ方を解説します。

### 9章: GraphQL特有のミドルウェア

GraphQLサーバーがリクエストを受け取ってレスポンスを返すまでの間の処理には、ミドルウェアによる前後処理を挟める箇所が4箇所存在します。
ここではそのGraphQL特有の4つのミドルウェアについて紹介します。

### 10章: ディレクティブを利用した認証機構の追加

この章では、ディレクティブというカスタムデコレータを使用しながら、認証機構をGraphQLサーバーに追加する方法を説明します。

### 11章: GraphQLサーバーから返却されるエラーメッセージ

この章では、GraphQLサーバーからユーザーにレスポンスとして渡せるエラーの構造について解説します。

### 12章: GraphQLサーバーのテストTips

この章では、サービス層やリゾルバをテストするために便利なモックの作り方と、ゴールデンテストと呼ばれるテスト手法を紹介します。

## 使用する環境・バージョン

- OS: macOS Ventura 13.3.1 (a)
- go version go1.19.3 darwin/amd64
- gqlgen v0.20.6
- SQLBoiler v4.14.0
- sqlite3 3.28.0

## サンプルコード

本書で開発・使用するサンプルGraphQLサーバーコードは[このレポジトリ](https://github.com/pinpointdev90/go-graphql)に格納されています。

以上です。

次は[GraphQLサーバーを動かしてみる]についてです。

ありがとうございます。
よろしくお願いいたします。
ubuntu22.04でeduroamにつながらなかった話[解決]

私は、とある高専で学んでいる学生です。
近頃、ノートパソコンの動作が遅くなってしまったのでubuntuを導入することにしました。
しかしながら、学校で利用されているwifiのeduroamに接続できないという問題が発生し、結構な時間を浪費しました。
同じように困っている人の役に立てれば幸いです。


## 調査
最初は、eduroam側の問題だと考えて調査していました。
しかし、いくら調べても原因がわかりませんでした。
接続方法もあっているし、証明書も間違っていない。

結局原因は違うところにありました。

## 解決策
下の記事に従って行えば、解決できました。
めでたしめでたし。
https://qiita.com/fiashaction/items/f9b91bb19a5cabbd93ed
JavaScriptのコピーメカニズムについて調べてみた！

# JavaScriptのコピーメカニズム

変数への代入やオブジェクトのコピーが行われる際に、値の型によってコピー内容が異なる。
値の型には　**プリミティブ型** と **オブジェクト型** の2つがある。

## プリミティブ型の代入

プリミティブ型の変数は、値のコピーが保存されるため、値はそれぞれの変数に独立して保存される。

```javascript
let name = "山田";
let newName = name;
newName = "田中";

console.log(name, newName); // output: 山田 田中 
```

## オブジェクト型の代入

オブジェクト型の変数は、オブジェクトの参照（メモリアドレス）が保存されるため、オブジェクトはコピーされず、それぞれの変数からオブジェクトが共有される。

```javascript
const object = { name: "apple" };
const newObject = object;
newObject.name = "banana";

console.log(object); // output: {name: "banana"}
console.log(newObject); // output: {name: "banana"}
```

## シャローコピーとディープコピー

オブジェクト型のコピーには、**シャローコピー** と **ディープコピー** の2種類がある。

- **シャローコピー**: 元のオブジェクトをコピーする際、オブジェクト内部のオブジェクトは参照がコピーされるため、オブジェクト内オブジェクトは共有される。
- **ディープコピー**: オブジェクト内部のオブジェクトも再帰的にコピーされるため、完全に独立したコピーが作成される。

### シャローコピーの利用シーン:

1. **パフォーマンスが重視される場合**:
   シャローコピーは、オブジェクトのコピーにおいて効率的で、メモリの使用量や処理速度が高速。大きなオブジェクトを扱う場合や、パフォーマンスが重要な場面でシャローコピーが選択される。

2. **データの共有が必要な場合**:
   シャローコピーは、元のオブジェクトとコピー先が同じデータを共有するため、特定の変更が両方に反映される必要がある場合に選択される。複数の部分で同じデータを共有する必要がある場合に便利。

### ディープコピーの利用シーン:

1. **データの独立性が必要な場合**:
コピー先が元のオブジェクトの変更に影響を受けてはいけない場合、または変更が元のオブジェクトに影響を与えてはいけない場合にディープコピーが選択される。

2. **データの保存や変換が目的の場合**:
元のオブジェクトから完全に独立したコピーを作成するため、そのコピーを変更しても元のデータに影響がない。特定の状態を保存したり、変換したりする際に利用する。

一般的にはシャローコピーが利用されている。データの独立性が必要な場合やデータの安全性が求められる場合には、ディープコピーを利用することもあるみたい。
エディタの外観をカスタマイズする

調査に時間がかかった為、自分へのメモも兼ねて投稿します。

UE5系から、エディタにテーマを設定し、ヘッダーやウインドウのフレーム、文字の色を変更して、
外観をカスタマイズできる『**テーマ**』機能が用意されました。



# 検証環境
UnrealEngine 5.3.1
Windows11 Pro



# テーマのつけ方

まずは、以下の設定まで行きます。

`編集 → エディタの環境設定 → アピアランス → Theme → アクティブなテーマ `

![テーマ作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/b5f4e1fc-d57a-526b-23bf-7734aab64be6.png)


『**アクティブなテーマ**』は、最初は、編集できないデフォルトのテーマがセットされています。
左から二つ目のボタンを押すと、デフォルトのテーマを複製します。
ボタンを押すと、『**テーマエディタ**』が開いて、テーマをカスタマイズが可能となります。
カスタマイズできる内容は、かなり細かい為、説明はしませんので、実際にさわってご確認ください。

![テーマエディタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/5ad4e3b1-64e9-69a0-ebe4-dca6cef676af.png)



# テーマについて

複製して作成したエディタのテーマは、<font color="Red">**JSON形式**</font>で保存されます。
エディタ起動時は、<font color="Red">**ユーザーフォルダ**</font>、<font color="Red">**プロジェクト内**</font>、<font color="Red">**エンジン内**</font>の三つの場所からロードが行われますが、
また、JSONファイルは、<font color="Red">**ユーザーフォルダに保存・作成される点**</font>は注意してください。

```
※ Windows11 Proの場合
ユーザーフォルダ
C:\Users\actasuser\AppData\Local\UnrealEngine\Slate\Themes

プロジェクト内
プロジェクトのルート/Content/Slate/Themes

エンジン内
エンジンのインストールフォルダ\Engine\Content\Slate\Themes

```
:::note info
気になる方は、『**USlateThemeManager::LoadThemes**』の動作を追ってみてください
:::



# テーマの設定

テーマは、Saved以下の『**EditorPerProjectUserSettings.ini**』に以下の内容で記録されています。

```conf:EditorPerProjectUserSettings.ini

[/Script/UnrealEd.EditorStyleSettings]
CurrentAppliedTheme=テーマID

```

デフォルトのテーマを設定するには、『**DefaultEditorPerProjectUserSettings.ini**』を作成し、『**CurrentAppliedTheme**』にデフォルトにしたいテーマIDを設定をする事で起動時のテーマを反映させる事ができます。

『**テーマID**』は、JSONファイルに記載されている為、目的のテーマのJSONを開いて確認できます。

:::note info
テーマは、**テーマIDが被っていなければ、使い回し可能**なので、配布する事もできます。
もし、テーマが被っていた場合は、
**色については、先にロードされたテーマの情報が使用**されるが、
**名前(DIsplayName)は後からロードしたテーマが使用**される挙動になるみたいです。
しかし、基本的には、**被らないようなテーマの管理**の仕方をしましょう。
:::



# おまけ

以下は、実装のソースコードになります。
自分で調査したい方は、実際にC++のソースコードを追ってみてください。

**UEditorStyleSettingsの定義**
UnrealEngine-5.3\Engine\Source\Editor\UnrealEd\Classes\Settings\EditorStyleSettings.h
UnrealEngine-5.3\Engine\Source\Editor\UnrealEd\Private\Settings\EditorStyleClasses.cpp

**FStyleThemeの定義**
UnrealEngine-5.3\Engine\Source\Runtime\SlateCore\Public\Styling\StyleColors.h
UnrealEngine-5.3\Engine\Source\Runtime\SlateCore\Private\Styling\StyleColors.cpp

**LoadThemesの定義**
UnrealEngine-5.3\Engine\Source\Runtime\SlateCore\Private\Styling\StyleColors.cpp



# 参考
* https://historia.co.jp/archives/20294/
* http://kagring.blog.fc2.com/blog-entry-624.html
(電子工作)カラー液晶を基板に接着する。(接着剤いろいろ)(ST7789)

x 関連

https://qiita.com/caa45040/items/f2a5dcd8e8b6b4ace141

x いろいろな「ノウハウ」

(電子工作)カラー液晶を基板に接着する。(接着剤いろいろ)制作中


目的
カラー液晶(秋月のST7789)を接着して固定する
きれいに接着したい(やりなおしやふき取り)
全てダイソー100円
arduinoに接続


結果　くろろ系に決めた

![o_cop623.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2feb7891-563e-4901-335c-65fb7ecd9d38.jpeg)



---------------------------------------------------------

●クロロ系

![o_cop660.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ab3a20f5-ed55-4628-163a-d8ba043bece5.jpeg)



頑張れば爪ではがせる
簡単にふける
くさい
縮まる
揮発剤は、有機溶剤
はみ出た場所は、
いい頃合いになったら指でくりくりして
爪で削る(切る)
頃合いの見定めが重要
指手ころころして団子作る練習をするといいよ

---------------------------------------------------------

●酢酸ビニール系

![o_cop661.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/903e74fc-486e-40d3-cc3c-98d5d65406a2.jpeg)



簡単に剥がれる
簡単にふける
匂いほぼなし
揮発剤は、水
注意　水分が大量に入っていて電子回路には?
粘度が低い
はみ出したところは、固まった後に爪で切る

---------------------------------------------------------

●エポキシ系

![o_cop662.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/08382001-243f-2cec-9cd2-5c30753ae3fa.jpeg)


簡単に剥がれない　固まるとかちんこちん
ふける
いちお、においは、しないはずだが、くさい
縮まらない
二剤混合で固まる

---------------------------------------------------------

●シリコン系

![o_cop663.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3ac28fb4-cd3f-7bae-6b07-2196e5cd05ff.jpeg)


簡単に剥がれる
簡単にふける
匂いほぼなし
揮発剤は?
やや膨張
Roboyo - Fuzzy Logic

[***Roboyo - Fuzzy Logic***](https://marketplace.uipath.com/ja/listings/roboyo-fuzzy-logic)
２つの文字列の類似度を数値化してくれるアクティビティを紹介します！
***OCR の読取結果からのマスター検索***や***入力ミスに対するサジェスト***、***簡易なQAロボ作成***などに使えそうです(=ﾟωﾟ)ﾉ

「***Roboyo - Fuzzy Logic***」
![fuzzy_logic.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/0a6ed1e9-e1a0-44b9-b10a-45910170628f.jpeg)
「Roboyo.fuzzy_logic.activities」（パッケージ）をインストールすると、次の4つのアクティビティが使えるようになります。
- ***Get Jaro Winkler Distance***：ジャロ・ウィンクラー距離を計算する
- ***Get Levenshtein Distantce***：レーベンシュタイン距離を計算する
- ***Get N Gram Distance***：NGram 距離を計算する
- ***Lucene Search String***：インプットの配列から検索した文字列に最も近いインデックスを返す（ルシーン検索ロジック）

素人が触った感じでは、***Get Jaro Winkler Distance***（ジャロ・ウィンクラー距離）の計算アクティビティが使えそうです！
利用シーンは主に***入力文字列に対するマスターチェック***です。

例えば
「UiPath株式会社」という登記上の正式な会社名称に対して、
「株式会社UiPath」「（株）UiPath」「UiPath」といった様々な入力がある訳ですが、
これを***マスターと照らしあわせて最も確度が高いものに上書きする***といったことが可能になる訳です。

（例）　"UiPath株式会社"　"株式会社UiPath"
![fuzzy_logic12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/0eb4cee8-df18-2ecb-e0b6-74601c54f4b8.jpeg)
（例）　"UiPath株式会社"　"（株）UiPath"
![fuzzy_logic13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/979d2c75-f0e5-9a1b-2c8b-f2428a4a6894.jpeg)
（例）　"UiPath株式会社"　"UiPath"
![fuzzy_logic14.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/b336b832-27d7-f991-22ea-4b8a3622c462.jpeg)

この結果だけをみれば、***ジャロ・ウィンクラー距離で 70%以上の確度がある文字列を正として問題ない***ですよね！！

::: note
- ジャロ・ウィンクラー距離：***文字の一致数と一致する文字の距離***で値が計算される模様。
- レーベンシュタイン距離：***編集距離***を求めるものらしく、***文字の追加・変更・削除等の多さ***が数値として計算されます。
- NGram 距離：ちょっと難しくてよくわからないが、***最初の分割後は1文字ずつ移動して順次分割を行う***みたいなので、形態素解析に近い？感じのロジックです。キーワードの出現場所が異なっても違いを吸収できることがメリットっぽい。
:::

OCR などで、最後に残る（判子被り等での）解決不可能系の***住所や宛先の問題***

（例）"〒105-0011 東京都港区芝公園４丁目２−８"　"105-0011 東京都港区 ***意図しない文字列*** 芝公園4-2-8"
![fuzzy_logic6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/a63cdecb-1560-24bd-d044-f17b9d51b6d6.jpeg)
郵便番号マークをとって、判子？の不要な文字列を住所の間に挟み、さらに入力は半角英数字といった住所で試してみました。
ジャロ・ウィンクラー距離はおよそ 75%なので、住所マスターなどを用意すれば、そちらに置き換えれば精度が上がりますよね☀

上は東京タワーの住所ですが、ディズニーランドの住所で実行すればこうです↓↓
（例）　"〒105-0011 東京都港区芝公園４丁目２−８"　"〒279-0031 千葉県浦安市舞浜１−１"
![fuzzy_logic10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/eb41264b-b82f-532a-dbc4-970b776be0f1.jpeg)

最後に ***Lucene Search String***（ルシーン検索）について

（例）配列：{"a","b","c"}　検索文字列："c"
![fuzzy_logic15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/43fcbc2f-5685-721b-17b9-80db09e92e99.jpeg)
検索ロジックにて最も近しい値を持つインデックスを返してくれます。（ロジックについては、大規模データ検索に向いてることくらいしか、パッと調べた限りわからなかった。）

（例）配列：{"Orchestrator でのデプロイ作業を教えてください","OC にロボットを登録する方法","***Orchestrator でロボットを有効化する方法***"}　検索文字列："ロボットを Orchestrator で使えるようにする方法を教えてください"
→　インデックス：2 （***Q：ロボットを Orchestrator で使えるようにする方法を教えてください　＞　A：Orchestrator でロボットを有効化する方法***）

いかがでしたでしょうか？
EXCEL の VLOOK などでは曖昧検索にしたとしても前方一致の世界ですが、
Roboyo - Fuzzy Logic アクティビティをもちいれば、もう一段上の検索が誰でも手元でおこなえそうですね
興味の沸いた方は https://marketplace.uipath.com/ja にアクセスして便利なコンポーネントを是非他にも探してみてください(*´Д｀)
【Xcode】シュミレーターのアニメーションをゆっくり動かす

# はじめに
Twitterを見ていたらシュミレーターをゆっくり動かすという方法を見つけたのでやってみました

https://x.com/emildzwonek/status/1696068726934716898

# やりかた
① 「Debug」を選択します
② 「Slow Animations」を選択します
![スクリーンショット 2023-10-11 22.39.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/57670e4a-43aa-d5c0-64fa-5b825466c5fa.png)

# こうなる
![Simulator Screen Recording - iPhone 15 - 2023-10-11 at 22.44.03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b184c740-43e0-d303-4d4f-1b844aed87ab.gif)


# おわり
アニメーション職人してる時とかはめっちゃ使えそうですね
javascriptの無名関数について調べてみた！

## JavaScriptの無名関数について

JavaScriptにおいて、**無名関数**（または匿名関数）は、名前を持たない関数のことを指す。
関数を変数に代入するためや、他の関数の引数として渡すために利用する。

### 無名関数の基本構文

無名関数の書き方

```javascript
const myFunction = function() {
  // 関数の処理内容
};
```

このような無名関数は変数 `myFunction` に代入して、後からこの変数を通じて関数を呼び出すことができる。

### 無名関数の利用例

#### 1. 変数に代入して利用する

```javascript
const greet = function(name) {
  return `こんにちわ、 ${name}!`;
};

const greetingMessage = greet('太郎さん');
console.log(greetingMessage); 

// Output: こんにちわ、 太郎さん!
```

#### 2. 関数の引数として利用する

```javascript
function executeFunction(func) {
  const result = func();
  console.log('関数を実行した結果:', result);
}

executeFunction(function() {
  return 'これは実行される無名関数です！';
});

// Output: 関数を実行した結果: これは実行される無名関数です！
```

上記の例では、無名関数を引数として受け取る関数 `executeFunction` を定義して、それを呼び出すことで無名関数を実行している。

### アロー関数（Arrow Function）との比較

無名関数はアロー関数（Arrow Function）と似ていますが、いくつかの違いがある。

## 主な違い
### 構文:

- **無名関数**: 使用するのは `function` です。
- **アロー関数**: 使用するのは `=>` です。

### `this` の挙動:

- **無名関数**: `this` は呼ばれるたびに変化する。
- **アロー関数**: `this` は定まった親のコンテキストを参照する。

### 戻り値:

- **アロー関数**: 1つの式の結果が自動的に返される。
- **無名関数**: : `return` を使って戻り値を返す。

### `arguments` オブジェクト:

- **無名関数**: `arguments` オブジェクトを使用できる。
- **アロー関数**: `arguments` オブジェクトを使用できない。

#### 補足
##### `arguments` オブジェクトとは
ChatGPT
>JavaScriptの関数内で利用できる特別なオブジェクトであり、関数が呼び出された際に渡された引数にアクセスするために使用します。このオブジェクトは関数内で自動的に利用可能で、引数の値や引数の数にアクセスすることができます。

サンプルコード

```javascript
function example(a, b) {
  console.log(arguments[0]); // apple
  console.log(arguments[1]); // banana
}

example('apple', 'banana');

```

#### アロー関数の基本構文

```javascript
const myArrowFunction = () => {
  // 関数の処理内容
};
```

### まとめ

無名関数は、関数を変数に代入したり、関数の引数として利用する際に役立つことを知れました！
アロー関数との違いも理解することができた。
AWS　SAA　模試直し③

# 現状
Udemyの講座をすべて視聴完了（約１ヶ月半かかった）
AWS-CLI取得済

# 今回の模試の結果
![スクリーンショット (87).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2957298/4456a179-0b38-8d1e-89d7-6f6563e1d688.png)
各章のまとめをしたことによって大幅に得点が上がった。
あと２問正解で合格ラインなので頑張りたい。

#直し
### Auto Scaling
スケーリングがうまく実行されずに24時間以上たった場合は、自動的にAuto Scaling処理が停止

### Aurora
デフォルトの構成で、マルチAZに分散化される DB クラスターを構成→追加でマルチAZ配置を設定することはできない→Auroraレプリカを複数のアベイラビリティゾーンに展開することで、可用性をさらに高める

### EC2
##### クロスアカウントアクセスによって外部ベンダーに適切なアクセス権限を委譲する方法
サードパーティーのWEBアプリケーションに必要なアクセス権限を付与したIAMポリシーを設定して、それによってクロスアカウントアクセスが可能となるIAMロールを作成し、該当WEBアプリケーションに設定

##### セキュリティグループ
セキュリティグループはすべてのインスタンスに即座に反映される。

### API Gateway
Amazon API GatewayはAPIへのアクセスを IAM のアクセス権限によって制御

##### 関数 URL(Function URLs)
API Gatewayを省略してパブリックに公開するAPIや、簡易な認証実装でも差し支えの無いAPIを AWSLambdaで実装する

### DynamoDB
###### グローバルテーブル
グローバルに複数のテーブルを作成して、レプリケーションする機能

##### トランザクション機能
DynamoDBテーブルへの書き込みなどのトランザクション発生時に特定の処理を実行させることができる機能

### 暗号化されたAMIを、別のAWSアカウントと共有する方法
AMIを第三者のAWSアカウントとのみ共有できるようにAMIのLaunchPermissionプロパティを変更することが必要。このAMIはAWS KMSのCMKを利用して暗号化されているため、その暗号化に利用したCMKの権限を有していることが必要です。したがって、KMSのキーポリシーを変更して、第三者のAWSアカウントがAMIの暗号化に利用したKMSキーを使用できる権限を付与する操作が必要。

### AWS Shield
Standard版：CloudFrontやRoute53に無料で自動的に適用
Advanced版：有料、DDoS 攻撃によって生じた可能性のあるAWS請求額の急増に対して、コスト面の保証をしてくれるなどの追加機能が付与

### IAMポリシー
ec2:TerminateInstances→すべてのインスタンスを指す

### S3
##### バケットポリシー
NotIpAddress条件：指定したIPアドレス以外が、このポリシーによって影響する

### 認証情報を安全に保存して利用する仕組み
AWS Secrets Manager：データベースやその他のサービスの認証情報を安全に暗号化してシークレットとして保存・取得する仕組み、アクセスするためには、IAMポリシーによる許可設定が必要
※AWS Systems Manager はオンプレミス環境とAWS環境のインフラストラクチャの利用状況を可視化し、制御するための統合運用サービス

##### エンドポイント
ゲートウェイもインターフェースもエンドポイントポリシーをアタッチする必要がある。

### SNS
FIFOキューの使用可

### EvwntBridge
【アクセス許可設定の例】
aws lambda add-permission \
--function-name LogScheduledEvent \
--statement-id my-scheduled-event \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-east-1:123456789012:rule/my-scheduled-rule

### SQS
Amazon SQSキューはあくまでもメッセージの配信機能を提供しているだけです。したがって、Amazon SQSキューだけではDynamoDBテーブルへの書込処理機能を実現できません。SQSキューからメッセージをポーリングして、Lambda関数がデータ処理を実行する必要があります。
リモートにプッシュしたコミットに署名する

## 実現するもの
GitHubなどでVerifiedバッジを表示するとき署名をする必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491081/175fb15c-e904-c60e-a6e5-3ee26f08a2f7.png)

署名方法が公式documentを見ながらやっていいと思う。

https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification

この記事が詳しく説明してくれる。

https://qiita.com/noraworld/items/43cd1dd8c28931a766c1

## 署名方法

以下のコマンドを実行するとコミットに署名できる
```bash
git commit -S -m "commit message"
```

## プッシュしたコミットの署名方法
しかし、コミットしてプッシュしちゃった！もうPR作ったよ！
というときに以下のコマンドを実行する

```bash
git commit --amend --no-edit --gpg-sign
```

このコマンドでは最新のコミットをgpg署名できる
以下のコマンドで確認する

```bash
git log --show-signature
```

```bash
gpg: Signature made 水 10/11 22:11:54 2023 JST
gpg:                using RSA key [KEYID]
gpg: Good signature from "chanon-mike <zzmikezz8520@gmail.com>" [ultimate]
Author: chanon-mike <zzmikezz8520@gmail.com>
Date:   Wed Oct 11 14:19:56 2023 +0900

    feat: Add favicon to document
```

このような結果が表示されたら、コミットが署名されるのが確認できる！

次はPRにプッシュする

```bash
git push origin [branch-name] --force-with-lease
```

`--force`のフラグを追加してリモートブランチのコミット履歴をローカルに書き換える
`--force-with-lease`ではリモートブランチに他のチームメンバーが新しいコミットを追加していた場合、その作業を上書きしないようにする安全なフラグオプション

こういう感じでプッシュしたコミットに署名することができる！！
GitHub リポジトリにサブモジュールを設定する手順

# GitHub リポジトリにサブモジュールを設定する手順

こんにちは、@studio_meowtoon です。今回は GitHub リポジトリにサブモジュールを設定する紹介します。
![github_with_unity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/ca3d51ad-0da3-dd14-0019-520020dcc5a9.png)

## 実現すること

GitHub リポジトリに Git サブモジュールを設定します。

## Git サブモジュールについて

### サブモジュールとは？

:::note info
**Git サブモジュール (Git submodules)** は、Git バージョン管理システムのリポジトリ内で他の Git リポジトリをサブリポジトリとして組み込む仕組みです。サブモジュールは、親リポジトリ内に外部プロジェクトや依存関係を含めるために使用されます。
:::

### サブモジュールはどのように役立ちますか？

|キーワード|内容|
|:--|:--|
|コードの再利用|サブモジュールを使用することで、別のリポジトリのコードやリソースを再利用できます。例えば、ライブラリやツールキットなどの外部プロジェクトを組み込むことができます。|
|バージョン管理|サブモジュールは特定のバージョンの外部リポジトリを指すため、プロジェクト内で使用される外部コードのバージョンを一貫して管理できます。|
|分散開発|複数のチームや開発者が協力してプロジェクトを進める場合、サブモジュールを使用することで、異なる部分を異なるリポジトリで開発でき、それらを単一の親リポジトリで統合できます。|

### 今回想定するケースは？

**複数のアプリと一つのフレームワークを同時に開発します。**
```mermaid
flowchart LR
    git1[GitHub リポジトリ] <--> app1
    git2[GitHub リポジトリ] <--> app2
    git3[GitHub リポジトリ] <--> app3
    subgraph app1[アプリA]
        fw1[フレームワーク]   
    end
    subgraph app2[アプリB]
        fw2[フレームワーク]    
    end
    subgraph app3[アプリC]
        fw3[フレームワーク]    
    end
    fw1 <--> git4[GitHub リポジトリ]
    fw2 <--> git4[GitHub リポジトリ]
    fw3 <--> git4[GitHub リポジトリ]
style app1 fill:#FADBDA, stroke:#CA475C
style app2 fill:#D3EDFB, stroke:#0099CE
style app3 fill:#D5EAD8, stroke:#009453
style fw1 fill:#FFFCDB, stroke:#D59533
style fw2 fill:#FFFCDB, stroke:#D59533
style fw3 fill:#FFFCDB, stroke:#D59533
style git1 fill:#D2CCE6, stroke:#423885
style git2 fill:#D2CCE6, stroke:#423885
style git3 fill:#D2CCE6, stroke:#423885
style git4 fill:#D2CCE6, stroke:#423885
```

## リポジトリにサブモジュールを設定

### GitHub リポジトリにサブモジュールを設定

コマンドの書式

```sh
> git submodule add -b <ブランチ名> <GitHub リポジトリのURL> <サブモジュールの相対パス>
```

今回は、以下の内容で GitHub リポジトリをサブモジュールとして親リポジトリに設定します。 

|項目|内容|
|:--|:--|
|ブランチ名|master|
|リポジトリURL|https://github.com/awesomeuser/germio.git|
|サブモジュールの相対パス|Assets/Plugins/Germio|

```sh
> git submodule add -b master https://github.com/awesomeuser/germio.git Assets/Plugins/Germio
```

親リポジトリに以下のような .gitmodules ファイルが追加されます。

```
[submodule "Assets/Plugins/Germio"]
	path = Assets/Plugins/Germio
	url = https://github.com/awesomeuser/germio.git
	branch = master
```

:::note info
例えば、**Unity** でゲームアプリを作成する場合、**Assets/Plugins/** 配下に**フレームワーク**や**ライブラリ**を Git サブモジュールとして個別に設定することができます。
:::

#### Unity 定義済みのアセンブリのコンパイル順序(※エディター以外)

|フェーズ|アセンブリ名|スクリプトファイル|
|:--|:--|:--|
|1|Assembly-CSharp-firstpass|Standard Assets、Pro Standard Assets、Plugins という名のフォルダー内のランタイムスクリプト|
|3|Assembly-CSharp|Editor という名のフォルダーに入っていないすべてのスクリプト|

https://docs.unity3d.com/ja/2022.2/Manual/ScriptCompileOrderFolders.html

## まとめ

GitHub リポジトリに Git サブモジュールを設定することができました。

:::note alert
この記事の実装例は一つのアプローチに過ぎず、必ずしも正しい方法とは限りません。他にも多様な方法がありますので、さまざまな情報を照らし合わせて検討してみてください。
:::

どうでしたか？ Window 11 と Git を操作する環境は手軽に構築することができます、ぜひお試しください。今後も Git を操作するトピックなどを紹介していきますので、ぜひお楽しみにしてください。
共用体とビットフィールド

# 概要
本投稿では、筆者の備忘録として共用体およびビットフィールド構造体についてまとめる。

# 共用体とは
共用体とは、１つのメモリー領域を確保し、そのメモリー領域内でメンバー(構造体や共用体の中で定義された変数)を扱うデータ型のことである。
共用体で確保するメモリー領域は、その共用体の中で最も大きいメンバーのサイズを確保する。
構造体と似ているが、共用体と構造体の違いについては後の章で解説する。

# 共用体とビットフィールド
共用体は、ビットフィールド構造体と組み合わせて使用されることがある。
以下に共用体とビットフィールド構造体を組み合わせて使用したサンプルコードとその実行結果を示す。

[サンプルコード (test.c)]
```c
#include <stdio.h>

int main(void){
    union {
        struct {
            unsigned int a: 2;
            unsigned int b: 2;
            unsigned int c: 4;
        }bit;
        int all;
    }test;

    test.bit.a = 1;
    test.bit.b = 3;
    test.bit.c = 4;

    printf("%zu", sizeof(test));
    printf("[Byte]\n");
    printf("%d\n", test.bit.a);
    printf("%d\n", test.bit.b);
    printf("%d\n", test.bit.c);
    printf("%d\n", test.all);
}
```
以下に出力結果を示す。
```
4[Byte]
1
3
4
77
```
上記の出力結果のように、共用体は下記のように1つのメモリー領域(今回の場合、int型サイズの4[Byte]=32[bit])をメンバー内で共有して使用する。
上記の出力結果を図で表したものが図1である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613720/158dc993-c1a0-8ab2-a885-820f2e1b9729.png)

# 共用体と構造体の違い
共用体と構造体の大きな違いはメモリの使い方である。
以下に共用体と構造体を使用したサンプルコードとその実行結果を示す。
[サンプルコード (test.c)]
```c
#include <stdio.h>

int main(void){
    struct {
        unsigned int a;
        unsigned int b;
        unsigned int c;
    }test;

    union {
        unsigned int a;
        unsigned int b;
        unsigned int c;
    }test2;

    test.a = 1;
    test.b = 3;
    test.c = 4;

    test2.a = 1;
    test2.b = 3;
    test2.c = 4;

    printf("%zu", sizeof(test));
    printf("[Byte]\n");
    printf("%d\n", test.a);
    printf("%d\n", test.b);
    printf("%d\n", test.c);

    printf("%zu", sizeof(test2));
    printf("[Byte]\n");
    printf("%d\n", test2.a);
    printf("%d\n", test2.b);
    printf("%d\n", test2.c);
}
```
以下に出力結果を示す。
```
12[Byte]
1
3
4
4[Byte]
4
4
4
```
上記の出力結果のように、構造体はメンバーごとにメモリー領域を確保している。
構造体のメモリー領域を図で表したものが図2である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613720/056c97b6-4b57-b2d9-cdd6-c3f0df111f18.png)

# まとめ
本投稿では、共用体およびビットフィールドについてまとめた。
また、補足として、共用体と構造体のメモリー領域確保の違いについてもまとめた。
以下にポイントをまとめる。

- 共用体とは、１つのメモリー領域を確保し、そのメモリー領域内でメンバー(構造体や共用体の中で定義された変数)を扱うデータ型のことである。
- 共用体で確保するメモリー領域は、その共用体の中で最も大きいメンバーのサイズを確保する。
- 構造体は、共用体とは異なり、構造体内のメンバーごとにメモリー領域を確保する。
【Mysql】エラー「ERROR 1227 (42000) at line 18: Access denied...」の原因と解決方法

# 概要
AWS EC2サーバで`mysql`コマンドでリストアをしようとしたら以下のエラーメッセージが表示されました。

```
ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
```

本記事ではその原因と解決方法を記載します。

# 原因
このエラーは、ダンプしたユーザーとリストアを実行したユーザーが異なるために起きるエラーとのこと。アクセス権限が不足しているエラーです。
`DEFINER`を削除してどのユーザーでもリストアできるようにしたらOK、という記事があったのですが、`DEFINER`は見つからず。ちなみにDUMPはDBeaverというDBクライアントツールを使って取得しました。それをSCPコマンドでEC2サーバにコピーし、リストアを試みたところ、上述のエラーが出ました。

# 解決方法
`DEFINER`の記述がない場合は、ファイルの冒頭にある以下`SET`3行をコメントアウトしてあげたら良いとのこと。
セッション変数`@@SESSION.SQL_LOG_BIN`の値を変更しようとしていますが（=バイナリログを無効にする操作らしい）、一般的に`SUPER`特権を持つユーザーにしか許可されていません。そのため、上述のエラーに`SUPER privilege(s)`何ちゃらと出ているんですね。

```sql
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;
```

以下のように対応したら無事に解決しました。

```sql
-- SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
-- SET @@SESSION.SQL_LOG_BIN= 0;
```

ただし、MySQLではDUMP作る時から設定することもできます。それが以下のオプション。

```
 mysqldump -h XXX -u root -p mysql57-db > mysql57-db-dump.sql --set-gtid-purged=OFF
```

`--set-gtid-purged=OFF`により、GTID（Global Transaction ID。トランザクションの一意性を識別するために使用される機能）情報の削除または無効化が行われます。
これにより、GTID情報が保持されるため、データベースを別のサーバーにリストアするときも簡単になります。
【メモ】Trailheadでやったことを備忘用に記録していく（Lightning アプリケーションビルダー）

---Salesforce　アドミニストレータ試験用の実施内容単元、ごとに、後で戻れるよう単元ごとにメモしていきます---


■Lightning アプリケーションビルダー入門

Lightning ページと Lightning コンポーネント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532370/8f98756a-f38b-2f45-d517-3f422b6285ad.png)

ホームページビルダー的なやつだ。
ライコス犬とか思い出す（インターネット老人会）

「主要な商談」の英語...oppotunityではないのか。
key deals　かぁ。。取引って言ってほしいぞ

■Lightning Experience および Salesforce モバイルアプリケーションにカスタマイズされたレコードページを作成する

おおー、ページを作って条件とか組めば、実際の商談状況に応じて表示を変えられたりするのね。

■アプリケーションホーム Lightning ページを作成する

・色々カスタマイズできるの楽しい！

■Lightning カスタムコンポーネントを使用する


とにかく
設定⇒クイック検索⇒Lightning アプリケーションビルダー
で入ることだけ覚えていれば。あとはGUIで何とかなる。
モジュール分割技法とモジュールの評価

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/664dff9b-af62-ba39-0646-7dddb5af71c7.png)
　モジュール分割には、STS分割、TR分割落ちう技法があります。どちらもデータの流れに注目してモジュールに分割する方法です。STS分割は、データの流れが一直線である場合に用います。TR分割は、再利用しやすいことが望まれます。せっかく作ったモジュールも、一度しか使えないのではもったいないです。再利用しやすいモジュールは、独立性の高いモジュールです。モジュールの独立性を表す指標として、モジュール強度、モジュール結合度があります。モジュール強度を強く、モジュール結合度を弱くすると、独立性が高く再利用しやすいモジュールになります。
【Rails】OGPを設定したのにX（旧Twitter）で反映されない時に試すといいかもしれないこと！

# はじめに
お疲れさまです！
おおくまです！

``Rails``で実装した``Webアプリ``に``OGP``を設定したのですが、``X（旧Twitter）``でなかなか反映されず、「設定が間違っているのかな？」と、とても試行錯誤しました！
~~気付けば2日ほど溶かしました。笑~~
しかし、**あること**を試すと解決しました！
その際の備忘録になります！

# 環境
:::note
Ruby 3.2.2
Rails 7.0.8
gem meta-tegs を用いてOGP設定済み
:::

# 注意点
:::note warn
私はプログラミング学習中で、初学者です！
内容に誤りがある場合があります！
コメント等で教えていただけると幸甚です！
:::

# 試してもダメだったこと

・``キャッシュ``を削除する
・``OGP``を何度も設定し直す
・[OGP確認ツール](https://rakko.tools/tools/9/)で確認する（こちらできちんと表示されていれば、いずれ反映されると思います！）

# クロール
皆さんは、``クロール``をご存知でしょうか！
``クロール``とは、``検索エンジン``の``ロボット``が、``Webサイト``を巡回し、``HTMLファイル``などの読み込みを行い、``Webページ``を検索結果として表示させるための``データベース``に登録することです！
``クロール``を行う``ロボット``のことを、``クローラー``と言い、``クローラー``はできる限り``Webサイト``から情報を収集します！
自分の``Webアプリ``が``クロール``されると``OGP``が表示されるというわけですね！
しかし、この``クロール``をされる頻度ですが、**一般的におよそ3日〜4週間が目安**とされています！
これでは、すぐに``OGP``が表示されなくても仕方ないですね！
しかし、この``クロール``を``X（旧Twitter）``**上でのみ**にはなりますが**強制**することができます！

# X（旧Twitter）での強制クロールの方法
``強制クロール``の方法は``X（旧Twitter）``の[Card validator](https://cards-dev.twitter.com/validator)というツールを使います！
[Card validator](https://cards-dev.twitter.com/validator)にアクセスし、``X（旧Twitter）アカウント``で``ログイン``すると以下のような画面になると思います！
![スクリーンショット 2023-10-11 20.45.25（2）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/81b1b74a-d5bc-a7cc-27c1-9fea7614c1aa.jpeg)

<br>

``Card URL``に``Webアプリ``の``URL``を入力し、``Preview card``をクリックするだけです！

<br>

![スクリーンショット 2023-10-11 20.50.08（2） 2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/e90e978f-c688-0589-5b4e-0ee8179c340e.jpeg)
きちんと設定できていないとこのようになります！

<br>

![スクリーンショット 2023-10-11 20.49.27（2） 2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/e827edad-beff-72d0-7aa2-318e15854716.jpeg)
逆に、きちんと設定できているとこのようになります！

<br>

きちんと設定できていることが確認できたら``X（旧Twitter）``の投稿画面に``Webアプリ``の``URL``を貼り付けてみましょう！
![スクリーンショット 2023-10-11 21.02.23.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/622f4a31-b922-8b40-4c87-41f78fbb9178.jpeg)

<br>

無事に表示されればOKです！
お疲れさまでした！
74HC165AP

# :taco:配線:taco:
![74HC165.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3195955/fa319f0b-708a-5461-137a-80a8b2411983.jpeg)
https://rephtone.com/electronics/arduino-74hc165/ 参照
CLK INH : GND
SER : GND
QH : 4
SH/LD : 2
CLK : 3

# プログラム
```c++
/*
 * 74HC165
 * SH/LD 2
 * CLK 3
 * QH 4
 */

int const SL = 2;
int const CLK = 3;
int const SER = 4;

int array[8] = {0,0,0,0,0,0,0,0,};

void setup() {
  pinMode(CLK, OUTPUT);
  pinMode(SL, OUTPUT);
  pinMode(SER, INPUT);

  digitalWrite(SL, HIGH);
  digitalWrite(CLK, LOW);

  Serial.begin(9600);
}

void loop() {
  digitalWrite(SL, LOW);
  digitalWrite(SL, HIGH);
  for (int i=0; i<8; i++){
    array[i] = (digitalRead(SER));
    digitalWrite(CLK, HIGH);
    digitalWrite(CLK, LOW);
  }
  for (int i=0; i<8; i++){
    if (array[i] == 0){
      Serial.print("0, ");
    }
    if (array[i] == 1){
      Serial.print("1, ");
    }
  }
  Serial.println();
  
}
```
GitHub リポジトリのデフォルトブランチ名を変更する手順

# GitHub リポジトリのデフォルトブランチ名を変更する手順

こんにちは、@studio_meowtoon です。今回は GitHub リポジトリのデフォルトブランチ名を変更する手順を紹介します。
![github_with_ubuntu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/e0fa4557-beed-1157-9931-710130e5078a.png)

## 実現すること

GitHub リポジトリのデフォルトブランチ名を main から master に変更します。

:::note alert
GitHub リポジトリでは、過去には通常 **master** という名前がデフォルトブランチとされていましたが、現在では一般的には **main** という名前が使われています。
:::

## リモートデフォルトブランチ名の変更

デフォルトブランチ名を変更したい GitHub のリポジトリを表示して、Settings タブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/0d73102d-6bce-5bdb-158a-2720219a1297.png)
デフォルトブランチ名を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/33de0e57-8718-8d83-92a4-5a902867b8aa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/17052e86-542a-acc3-f40e-ffcc63cb2a58.png)
Code タブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/42fa5fc2-13a1-f1f2-5665-92906c6eff66.png)
ローカルブランチの名前を変更するためのコマンドが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/10ca5f1a-ac2c-539e-e7fa-147ab2972d67.png)

:::note info
ここまでの手順で、リモートのデフォルトブランチ名を main から master に変更することができました。
:::

## ローカルブランチ名の変更

ローカルのリポジトリに移動して先ほどのコマンドを実行します。

```sh
$ cd TO_LOCAL_GITHUB_REPOSITORY
$ git branch -m main master
$ git fetch origin
$ git branch -u origin/master master
$ git remote set-head origin -a
```

|コマンド|説明|
|:--|:--|
|git branch -m main master|main ブランチを master ブランチに名前変更します。|
|git fetch origin|リモートリポジトリ (origin) から最新の情報を取得します。|
|git branch -u origin/master master|master ブランチをリモートの origin/master ブランチに追従させます。|
|git remote set-head origin -a|リモートリポジトリ origin の HEAD を設定し、デフォルトブランチを master に変更します。|

ローカルのブランチ名を確認します。

```sh
$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
```

:::note info
ここまでの手順で、ローカルのブランチ名を main から master に変更することができました。
:::

## まとめ
GitHub リポジトリのデフォルトブランチ名を main から master に変更することができました。

どうでしたか？ Window 11 の WSL Ubuntu でも、Git を操作する環境を手軽に構築することができます、ぜひお試しください。今後も Git を操作するトピックなどを紹介していきますので、ぜひお楽しみにしてください。

## 推奨コンテンツ

https://qiita.com/studio_meowtoon/items/719e6765dd11f17a0b19
Rspec ざっくりチートシート

# Rspec チートシート

## 0. 前提要件
テストを始める前に、以下の要件が満たされていることを確認しましょう。

- **Railsプロジェクト**: Rspec-railsはRailsのプロジェクト専用のgemです。新しいRailsプロジェクトは`rails new [プロジェクト名]`で作成できます。
- **Bundler**: Rubyの依存関係管理ツール。`Gemfile`に記述されたgemをインストールする際に使用します。Railsをインストールすると、Bundlerも一緒にインストールされます。

次に、RSpecのインストールや基本的なコマンドなどの情報をチートシートとしてまとめます。

## 1. セットアップ

```ruby
# Gemfileに追加
gem 'rspec-rails', group: :development, :test

# Rspecをインストール
$ bundle install
$ rails generate rspec:install
```

## 2. Userモデルのテスト
expect文でuserがvalid?メソッドを実行した場合を確認しています。
valid?メソッドが定義されたバリデーションを満たしているかどうかをチェックします。
```ruby
RSpec.describe User, type: :model do
  it "is valid with a name, email, and password" do
    user = User.new(name: "Alice", email: "alice@example.com", password: "password")
    expect(user).to be_valid
  end
end
```

## 3. UsersControllerコントローラのテスト
getやpostなどのテストも可能です。
```ruby
#getのテスト
RSpec.describe UsersController, type: :controller do
  describe "GET #index" do
    it "responds successfully" do
      get :index
      expect(response).to be_successful
    end
  end
end

#postのテスト
RSpec.describe UsersController, type: :controller do
  describe "POST #create" do
    #テストデータ作成
    let(:valid_attributes) {
      { name: "Alice", email: "alice@example.com", password: "password" }
    }

    it "creates a new user with valid attributes" do
      expect {
        post :create, params: { user: valid_attributes }
      }.to change(User, :count).by(1)
    end

    it "redirects to the new user's page after creation" do
      post :create, params: { user: valid_attributes }
      expect(response).to redirect_to(user_path(User.last))
    end
  end
end


```

## 4. FactoryBotの使用
❶FactoryBotはテストデータの生成をサポートするgemです。
❷テストの際にテストデータを一部をオーバーライド（変更）することなどが可能です。
❸describeやcontextの下などに使用例にあるような形でテストデータを定義します。
```ruby
# Gemfileに追加
gem 'factory_bot_rails'

# factories/users.rb
FactoryBot.define do
  factory :user do
    name { "Alice" }
    email { "alice@example.com" }
    password { "password" }
  end
end

# テストでの使用例
let(:user) { create(:user) }
```

## 5. it / describe / context
contect itの中身は文章っぽくなるとわかりやすいです。
「When user is logged in it shows the user's profile」
```ruby
describe "GET #index" do
  context "when user is logged in" do
    it "shows the user's profile" do
      # テスト内容
    end
  end
end
```
場で役立つOTの仕組みとセキュリティ 演習で学ぶ！わかる！リスク分析と対策

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

本書を手に取った背景
OTというのが何なのかよくわかっていなかった。
paloaltoの製品でOTセキュリティがあることはしってたが、そもそもOTは何なのかからわかってなかったので読んでみた。

本書のテーマ
マイナーなOTセキュリティを解説。
OTは被害を受けると意外と社会への影響は大きい。

個人的なポイント
１，
プロセス制御：現在地を目標値に向けて調整すること
フィードバック制御：センサーで制御した内容を目標値に向けて制御すること

２，
SCADA:運転監視システム、データロガー
DCS:分散制御システム
PLC：ラダー言語

３，OTのプロトコル
PLCネットワーク

４，OTの被害
OTのOSはマイナーなものもある。インターネット二でなければパッチをあてられない。
USBメモリを持ち込まれてウイルスに感染させると、一気に内部の危機に広がる。

５，リスクアセスメント
詳細分析などをやるように一般的なリスク分析と同じ流れを実施。

今後やれること
・OTセキュリティはSWG製品も関連してる
・ZscalerはOTを今後強くしていくので打ち合わせで話せる

まとめ
本書のみでOT関連の基本知識は身につく。
検証方法も乗っているので、技術も学べて良い書籍だと思った。
OTも基本的には学ぶことはセキュリティの基本と一緒。
Windows標準のターミナルをLinuxにする

こんにちは,exe2zip-l8tot8kiibreakです．
今回はWindowsのターミナルをLinuxにする方法を記します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763301/c382a7d0-0ff3-8c67-a1bd-6df8fba96839.png)

ターミナルを開きます．
上部で右クリックし，設定を開きます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763301/1febe48c-c7bf-03d3-974d-36c3a5eb3bb5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763301/02237749-6b04-21ee-4559-d0fd7f1442a5.png)

この設定画面で，既定のプロファイルをUbuntuにします．
(ない人はWSL ubuntuをインストール)

そうすると，terminalをタスクバーに入れておいて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763301/9505b47f-b78e-cfb4-a69c-537c0a0c3da3.png)
クリックするとUbuntu(wsl)が起動するようになります．


```bash
wsl
```
いままでpowersellが起動してー＞wslコマンドで起動していましたが，設定しておけばよかったです．
GitHub Pages プロジェクトサイトの公開手順

## はじめに
今回は、`GitHub Pages`の公開手順を簡単に記載していきます。  

`GitHub Pages`サイトには、

* ユーザーサイト
* 組織サイト
* プロジェクトサイト 

の３種類があります。

ここで取り扱うのは３個目の`プロジェクトサイト`になります。

## 前提
調べる方は公開したい状況にあると思うので、GitHubへのリポジトリの作成やプッシュ、Git自体の設定方法などはスコープ外とします。

## 手順
1. Githubのログイン後ページから、右上のアイコンを押下します。
![アイコンクリック.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518748/36810230-3aef-2881-5888-14ce2dba13fc.jpeg)

2.リストが展開されるので、`Your Repositories`を押下します。
![YourRepositoriesクリック.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518748/40067f88-a45d-989b-4582-dc77b980a58c.jpeg)  

3.リポジトリ一覧が表示されるので、公開したいリポジトリを押下します。
![公開したいリポジトリ選択.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518748/edd5e22d-7b7c-6ed8-4730-1cb2575b309b.jpeg)

4.リポジトリを開いたら、次の`Settings`を押下します。
![Settingクリック.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518748/6772da1c-5a4f-a70e-9879-8f09301239f0.jpeg)

5.Settingを開いたら、ページの最下まで移動してリポジトリの公開範囲を確認する。  
リポジトリ作成時にPrivateにしていた場合、Publicに変更する必要があります。  
`Change Visibility`から変更しましょう。
![Public確認.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518748/c93e25c7-ff9a-525a-57e9-7f0e2e2c24fc.jpeg)

6.ページの最上まで戻り、次に`Pages`を押下します。  
![Pagesクリック.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518748/f15e150c-f0e9-8c60-76bc-721d0d76675d.jpeg)

7.Pagesを開くと、色々と設定項目がありますが、変更するのは`Branch`の項目だけです。  
画像では`main`を既に選択していますが、Defaultは`None`になっているかと思いますので、公開したいブランチを選択してください。
![branch選択.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518748/5f8e53a9-cc3e-275c-95c2-ec675c3232e5.jpeg)

8.ブランチを選択すると、Folderの選択プルダウンが表示されます。  
基本的に、Defaultの`/(root)`のままで大丈夫です。
選択肢に`/docs`が見えると思いますが、リポジトリに`docs`フォルダを作成し、その中に公開したいサイトのソースを入れるといったことをしていなければ気にしなくて良いということになります。
![directory選択.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518748/563eb821-a007-31b6-1857-d46734e82a8b.jpeg)

9.ここまで設定したら、`Save`を押下して完了です。
![Save.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518748/d4bb2ac6-bb32-466b-0b3f-41a2ff7b9768.jpeg)

10.え？これで公開されたの？どこに？と初めは思うかもしれませんが、ちょっと時間がかかります。  
少し待ってから（２～５分くらい？）リロードすると、URLが表示されます。  
カスタムドメインを使用していない限りは  
`http(s)://<username>.github.io/<repository>`  
のようになります。
![URL表示.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518748/75dabb68-acca-14a2-89ba-c661b19eb991.jpeg)