OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者必読】deviseとは？？deviseの導入方法について書いてみた

# はじめに
今回はdeviseの導入について書いていきます。
初心者向けの内容になっています。
ですが、これを機に上級者の方も学びなおすのもいいものですよ＾＾
早速行きます！！

# deviseとは、なんぞや？
（某サイト参照）
<b>deviseとは、railsで作ったwebアプリケーションに
簡単に認証機能を実装できるgemのこと。

認証機能？ほぇ？
安心してください。ログイン、ログアウト機能のことです。

deviseは認証機能のgemの中で使用率ナンバーワン！
しかも、簡単に認証機能を実装することができます！（ドヤァ）

用は、自分で作るより元ある物を活用しようってことですね。
devise最高！


# 導入の仕方

それでは、deviseを導入する手順を学習していきましょう。
すっごい簡単、以下の通りです。

- ①Gemfileというファイルにgem'devise'を記述する
- ②bundle installというコマンドを実行し、Gem をインストールする
- ③rails g devise:installコマンド実行


うむ、簡単すぎる！
導入はこちらで以上です。
後は、モデルだったり、routeファイルを設定してみてください。
そこはググって調べてください。
し、知らないわけではあ、ありません。
エンジニアは自分で調べる力を身に付けるものです。


# 終わりに
今回はdeviseの導入について書きました。
次回はより詳しく書ければなと思います。
ではまたお会いしましょう！
統計検定2級の振り返り

2023/02/22 に統計検定2級を受験し、合格しました。
この記事では学習方法や参考にしたサイトを書いていきます。
# 目次
1.はじめに
2.事前知識
3.学習サイト・参考書
4.学習方法
5.本番で焦ったこと

# 1.はじめに
　スペック：経済学部卒のエンジニア。データを扱う業務をしている。
　学習時間：体感だけど80~100時間 （期間：2か月）

# 2.事前知識
　大学で統計学の講義を受けたことはあるけど、内容は理解していなかった。
　区間推定や帰無仮説など用語は聞いたことはあるけど分からない、というレベル。

# 3.学習サイト・参考書
　統計学の時間 基礎編（https://bellcurve.jp/statistics/course/#step1）

　とけたろうさんのブログ（https://toketarou.com/）

　統計2級過去問（2018~2021年版 ＆ CBT対応版）

# 4.学習方法
　__統計学の時間（1週目） → 過去問1年分（自分のレベルの把握のため） → 統計学の時間（2週目）
　→ とけたろうブログ（2週） → 過去問 → 統計学の時間・とけたろうブログ・過去問__

　__〇統計学の時間__　
　基礎編の記事を全て読み、演習問題を一通り解きました。
　このサイトが統計2級の基礎になってくるので、分からないところは調べながら読み進めました。
　
　ただ、このサイトだけでは合格は難しいと感じます。

　__〇とけたろうブログ__
　統計学の時間で覚えた公式を、数式で理論立てて説明してくれているのがこのサイト。
　「何故このような公式になるのか」というのを説明してくれます。
　
　統計2級は、公式や解法を暗記しているだけでは対応できず、本質的な理解が必要となるのですが、
　それをこのサイトで学べるという感じです。


　**
　難易度としては
　統計学の時間 << とけたろうブログ
　この2サイトを活用することで、合格レベルに達せられたと思います。
　**

　__〇過去問__
　あとは過去問を沢山解いて、分からないところはサイトに戻って確認→再び過去問 という流れです。

# 5.本番で焦ったこと
　__1.計算用紙がラミネート紙、ペンがマーカーで計算が非常にやりにくい__
　紙とペンの持ち込みが許されず、会場側で用意されたラミネート紙とマーカーで計算するのですが、インクが薄くて焦りました。
　急いで書くと字が書けないので、書き直してで2,3分ほど時間をロスしてしまいました。

　__2.予想よりも基本問題が少なかった__
　色んなサイトで、2級の問題構成は
　「基本的な問題が8割,難問が2割」 
　と書かれていたのですが、体感それ以上に基本問題が少なく感じました。

　暗記ではなく、意味をしっかり理解しているかを問う問題が多かったように感じます。

　__3.時間がない__
　本番は時間との勝負でした。
　最後の問題が終わった時に残り4分。後回しにした問題を全て解くことはできなかったです。
　90分で約35問を解かなければいけないので、時間がかかると思ったらすぐ見切りをつけて次に行くのがいいと思いました。
Github ActionsでLaravelとNuxt.jsをEC2に自動デプロイする

## はじめに

Laravelを管理するEC2と、Nuxt.jsプロジェクトを管理するEC2がそれぞれある環境に対し、
Github Actionsを用いてCI/CDを組みたかったです。

やたらNuxt側に時間がかかったこともあるので備忘録として残しておきます。
プロジェクトとしては、Nodebrewを使ってバージョン管理等を行っている状態です。

### Laravelの自動デプロイ

```deploy-laravel.yml
name: Deploy Laravel(API)

on:
  push:
    branches:
      - develop

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Git Checkout
      uses: actions/checkout@v3

    - name: Deploy Laravel to EC2
      uses: appleboy/ssh-action@master
      with: 
        host: ${{ secrets.EC2_API_HOST_NAME }}
        username: ${{ secrets.EC2_API_USER_NAME }}
        key: ${{ secrets.EC2_PRIVATE_KEY }}
        timeout: 180s
        script: |
          cd /apps
          git fetch --prune
          git checkout develop
          git pull origin develop
          cd /apps/backend
          php artisan optimize
          php artisan config:clear
          php artisan cache:clear
```

### Nuxtの自動デプロイ
```deploy-nuxt.yml
name: Deploy Nuxt

on:
  push:
    branches:
      - develop

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Git Checkout
      uses: actions/checkout@v3

    - name: Install Node.js
      uses: actions/setup-node@v3
      with:
        node-version: 16.6.0

    - name: Deploy Nuxt.js to EC2
      uses: appleboy/ssh-action@master
      with: 
        host: ${{ secrets.EC2_FRONT_HOST_NAME }}
        username: ${{ secrets.EC2_FRONT_USER_NAME }}
        key: ${{ secrets.EC2_PRIVATE_KEY }}
        timeout: 180s
        script: |
          cd /apps
          git fetch --prune
          git checkout develop
          git pull origin develop
          cd /apps/frontend
          pwd
          export PATH=/home/ec2-user/.nodebrew/current/bin:$PATH
          node --version
          npm --version
          npm run build
          pm2 restart walx-front-app-stg
```

## 謎に苦戦したところ

最初、`.nodebrew`のパスを通すときこのようにしていました
```yml
- name: Add Node.js to PATH
  run: echo "export PATH=/home/ec2-user/.nodebrew/current/bin:\\$PATH" >> $HOME/.bash_profile
```

ただ、結果そうではなく実行する直前の箇所で以下のようにパスを通すだけでした。

```yml
script: |
    cd /apps
    git fetch --prune
    git checkout develop
    git pull origin develop
    cd /apps/frontend
    pwd
    export PATH=/home/ec2-user/.nodebrew/current/bin:$PATH <-ここ
    node --version
    npm --version
    npm run build
    pm2 restart walx-front-app-stg
```

以上です。本当にただの備忘録...
Amazon kindleの書籍をepub化して、iPadのBookアプリで読む手順

私的利用のためのメモ。Amazonはときどき焚書されると聞いたもので、念のために。

ちなみに epub変換の場合、画像コンバート品質はかなり低いです。
図鑑のような画像を多く使った書籍の場合、epubではなくpdf変換を選んだほうがいいです。

# Kindle PCアプリ環境を整備する

## Kindle PC v1.39を入手

以下のバイナリを探して、PCに導入します。
```
version 1.34.1
filename: KindleForPC-installer-1.34.63103.exe
SHA-256: 3dc62b3895954fc171d4a3d08f2b7a1a503233e373c163adb7 bc7fd34cdeff49
```
https://www.mobileread.com/forums/showthread.php?t=283371

## 起動用バッチファイルを入手する

KFX_begone4.bat です。オリジナルは以下に。

https://www.mobileread.com/forums/showthread.php?p=4021279#post4021279

## 起動してみる

KFX_begone4.bat を実行するだけで起動できます。設定画面で自動アップデートを無効にすること。
購入したKindle本を右クリックすることで、以下に .azw ファイルが保管されます。

> マイドキュメント\My Kindle Content

# calibre を導入する
## 本体アプリを入れる

>$ winget install Calibre

もしくは https://forest.watch.impress.co.jp/library/software/calibre/ 

## ReDRM プラグインを入れる

以下からzipで入手し、解凍する。
https://github.com/noDRM/DeDRM_tools/releases/tag/v10.0.3

Caribreツールバー→ 設定 → プラグイン → ファイルからプラグインを読み込む。zipファイルを選択するだけ。

## 既にあなたは、Caribreで .azw ファイルを開けるはずです

.azw ファイル の関連付けを、Caribreにしておくとよいでしょう。



# epubエクスポート環境を整える
## エクスポート後のファイル名命名規則を設定する

設定 → ディスクに保存 → テンプレートの保存
![Clipboard02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666068/574b12f9-041c-2cd6-31ea-b09ee8971c92.jpeg)

たとえば ** [作家名] 書籍名.epub ** という名前で出力保存したいときは、以下の命名ルールにしておく。

```
[{authors}] {title}
```

任意ですが、同じ画面で以下のオプションを無効にしておいたほうが便利かも。

* 表紙を別に保存 → OFF
* 書誌を別のotfファイルに保存 → OFF

## calibre に .azw ファイルをインポート

ツールバー→本を追加→サブフォルダから追加、を選び、以下のフォルダを選択する。

> マイドキュメント\My Kindle Content

すると本棚一覧に、Kindleでダウンロードした全ファイルが表示される。

# 変換する
## epubに変換する

ツールバー→本を変換→まとめて変換、を選び、OKを押す。

![Clipboard01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666068/48edfe1b-8cef-7733-0bb4-acebbf8080dd.jpeg)


最も大事なのは、出力プロファイルの選択です。ページ設定→プロファイルで、出力プロファイルを「タブレット」にしたほうがいいです。画像のリサイズを避けられます。

![Clipboard013.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666068/af8c1e18-2bc4-7ec5-122d-4c22f5242ff5.jpeg)


## 本棚のファイルを、epubで保存する

ツールバー→ディスクに保存→epub形式のディスク上のフォルダに保存、を選びます。

# できました

おしまい。epub以外で保存したい場合はここから。

![Clipboard_04-04-2024_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666068/a41633ad-5049-3659-0beb-1ab6cc7f3eee.jpeg)


# 備考
* 購読中の本一覧はこちらで見れる　https://www.amazon.co.jp/hz/mycd/digital-console/contentlist/booksAll/dateDsc/
「Webを支える技術」読書メモ#7 HTTPリクエスト

:::note info
本記事の内容
[Webを支える技術](https://amzn.asia/d/6TCP9kg)を読んだ際のノートのようなものです。
省略している部分もあり、書籍の内容を完全に要約するものではありません。

今回は第6〜7章あたりの内容です。
:::

# 8つのHTTPリクエスト
[RFC 9110](https://www.ietf.org/rfc/rfc9110.txt)で定義されているのは8つ。
GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE

## CRUD操作との対応
GET、POST、PUT、DELETEで対応できるが、下記が悩みどころ。

* POSTが追加なのか作成なのか
* Read=GETとしたいが、リクエストクエリが長すぎてPOSTで代用する場面もある
* PUT, DELETEはPOSTで代用することもある
    * 特にフォームからのリクエスト等

## つかいどころ
### POST vs PUT
POSTでできることが広く、リソース作成時にPOSTなのかPUTなのか問題が起きる。

■ PUT
URIを指定できる。
リソース作成した結果、クライアント側はURIを知ってるので返却しなくて良い。
ただし、サーバー側のURI設計を把握しないと適切なURIを指定できないので、サーバーと密結合することになる。

またリソースの上書きをしてはまずい場合は不適切。

■ POST
URIを指定できない。
ただし、URIの設計はサーバー側に任せるので、その分疎になる。

### HEAD
更新日時とかだけ取得したいような、小さいリクエストだけでいい場面で使ったりする。

### OPTIONS
OPTIONS以外のどのメソッドが使えるか調べたいときに、Allowヘッダで教えてくれる。
あと[CROS](https://developer.mozilla.org/ja/docs/Web/HTTP/CORS)などで活躍する。

## PATCHリクエストもいるよ
書籍では登場しないが、HTTPリクエストには`PATCH`というのも存在する。
[RFC 5789](https://ietf.org/rfc/rfc5789.txt)で定義されている。

# 条件付きのリクエスト
`メソッド + 特定のヘッダ（更新日時等）`を使って、条件付きで更新するとか、いつ実行するかといったことができる。

```text
例
GET + If-Modified-Since:2023-02-21
　↓
2023/02/21以降に更新されていたらリソースを取得する
```

# HTTPリクエストの冪等性＆安全性
安全性：副作用がないこと

通信エラーが起きたときの対策が必要。
下記の特色を考慮しるるAPI設計をしよう。

### 冪等なもの
* PUT
* DELETE

ただしPUTは動的なパラメータを作ると冪等性が崩れるので注意が必要。

### 冪等で安全なもの
* GET
* HEAD

GETはログやヒットカウント等、メインのリソース以外のものに対しては副次的に作用をするので、
とても広い意味では安全ではないとも言える。
とはいえクライアント側が求めるリソースへの操作は安全。

### POSTは冪等でも安全でもない…
毎回同じ結果になるとは限らない、副作用が生まれる。
できることは広いが、他のメソッドで実装すべき場面もあるので気をつける。
「Webを支える技術」読書メモ#6 HTTPの主要構成要素

:::note info
本記事の内容
[Webを支える技術](https://amzn.asia/d/6TCP9kg)を読んだ際のノートのようなものです。
省略している部分もあり、書籍の内容を完全に要約するものではありません。

今回は第6〜7章あたりの内容です。
:::

# きほん
リソースの表現をやり取りするプロトコル。
[RFC 2616](https://tex2e.github.io/rfc-translater/html/rfc2616.html)で定義され、RFC 7230, RFC 7231, RFC 7232, RFC 7233, RFC 7234, RFC 7235で修正されている。

### バージョンの変遷
* 最初は0.9
    * GETのみ
    * ヘッダなし
    * 仕様書もなし
* 1.0
    * 初の標準化
    * 他のメソッドやヘッダが追加
* 1.1
    * 完成
    * 拡張仕様も出ている

# HTTPのベースはTCP/IP
全4層の階層型プロトコル
<table>
  <tr>
    <td> アプリケーション層 </td>
    <td> HTTP, NTP, SSH, SMTP, DNS </td>
    <td> ソケットでデータをやり取りする<br>※ソケットを自分で操作することはもうほぼないけどわかっておこう </td>
  </tr>
  <tr>
    <td> トランスポート層 </td>
    <td> UDP, TCP </td>
    <td> 配達するよ :postbox: <br>転送完了までの保証をする<br>コネクションを張ったりする </td>
  </tr>
  <tr>
    <td> インタフェース層 </td>
    <td> IP </td>
    <td> 郵便出すよ :envelope:<br>データのやりとりをする<br>指定IP宛にパケットを送る<br>送り出すまでを担う </td>
  </tr>
  <tr>
    <td> ネットワークインタフェース層 </td>
    <td> イーサネット </td>
    <td> 道作るよ :pick:<br>ケーブルとかアダプタといった通信（物理） </td>
  </tr>
</table>

# クライアント/サーバ
```mermaid
%%{init:{'theme':'base','themeVariables':{'primaryColor':'#20b2aa','primaryTextColor':'white','primaryBorderColor':'#20b2aa','lineColor':'gray','textColor':'#6A7FABCC','fontSize':'20px'}}}%%

graph LR
A(("クライアント"))--"コネクション確立"-->B(("サーバ"))
```
としたうえで
```mermaid
%%{init:{'theme':'base','themeVariables':{'primaryColor':'#20b2aa','primaryTextColor':'white', 'primaryBorderColor':'#20b2aa','lineColor':'gray','textColor':'#20b2aa','fontSize':'20px'}}}%%

graph LR
subgraph A["クライアント"]
   C(("User Agent")) 
end

C--"リクエスト送信"-->B(("サーバ"))
B--"レスポンス返却"-->C

style A fill:white, stroke:#20b2aa, stroke-width:5pt, stroke-linejoin: round, text:#20b2aa
```
と言う感じでやりとりする。

## リクエストとレスポンスメッセージの構造
|  | リクエスト | レスポンス |
|:-:|:-|:-|
| スタートライン | リクエストライン<br>メソッド、URI（パラメータは含まない）、プロトコルバージョン | ステータスライン<br>プロトコルバージョン、ステータスコード、テキストフレーズ |
| ヘッダ | Key:Value形式のメタデータ | 左に同じ |
| 空行 |  |  |
| ボディ | お好きなリクエストボディ<br>JSONが入ったりするね | お好きなレスポンスボディ<br>HTMLとかが入ったりするね |


### クライアント側の流れ
* リクエスト構築
* リクエスト送信
* 〜レスポンス待ち〜
* レスポンス受信
* レスポンス解析
* アプリケーションの後続処理

### サーバ側の流れ
* 〜リクエスト待機〜
* リクエスト受信
* リクエスト解析
* 各アプリケーションへ処理を投げる
* アプリケーションから処理結果を受け取る
* レスポンス送信

# ステートレス性
* クライアントのそれまでのリクエストを保持しない
    * FTPはこの逆
* リクエストは冗長になる
* 自己記述的メッセージでやり取りする
* ステートフルはクライアントが多いと死ぬ
    * サーバーを冗長化しにくい
* ネットワークトラブルが起きた際に、どこまで処理が成功しているのかわからなくなる
「Webを支える技術」読書メモ#5 URI実装＆設計

:::note info
本記事の内容
[Webを支える技術](https://amzn.asia/d/6TCP9kg)を読んだ際のノートのようなものです。
省略している部分もあり、書籍の内容を完全に要約するものではありません。

今回は第5章あたりの内容です。
:::

# 実装
気をつけるべきはざっくり2つ。
* 相対URIの解決法を実装する
    * 相対URIにするとクライアント側がめんどくさいので基本は絶対URI
* %エンコーディング
    * エンコーディングはサーバー側からクライアントに教えてあげること

## URI、URL、URNの関係
URIの中にURLとURNがあるという関係。

#### URL
URIとほぼ同義。
ドメイン名、サーバーに依存したリソースID。

#### URN
ドメイン名とは独立したリソースID。
例えばISBN番号を使った識別子など。

URIとして、リソースの取得には使えない。

# 設計
## 「クールなURIは変わらない」
原文は[ここ](https://www.w3.org/Provider/Style/URI.html)にある。

ユーザビリティが高く、見てわかりやすい＆覚えやすいURIを作る。

実装上の都合によってURIが変わっちゃうことがないのが理想的。
そしてどうしても変えるのであれば、リダイレクトなどをして守ること。

### ポリシー
* (1)言語由来の拡張子やパスは使わない
perlでできているから`.pl`とついている…とか、Java系の文化でキャメルケースが使われているとか。

* (2)メソッド名、セッションIDを含めいない
セッションIDなんかはクエリパラメータでつけたりしてしまうのもよくない。

* (3)リソースを表現する名詞にする
動詞を入れない。動詞はHTTPメソッドで表現できるはず。
たとえフレームワークの都合だったとしても、なんとかして抗うべし。

### テクニック
* コンテントネゴシエーション
ヘッダ情報に応じてレスポンスを変える術。

* 拡張子で表現を指定可能にする

* マトリクスURI
カンマやセミコロン区切りの複数パラメータを用意する。
ちなみにセミコロンを用いるのはパラメータの順序に意味がある場合に用いる。

:::note warn
 URIの不透明性

これらのポリシーやURIの仕様から、ある程度URIは推測することができる。
ただし推測できたからと言って、必ずそこにリソースがあるかはアクセスするまでわからない。
しかもその中身が正しく存在するかは取得してみないとわからない。

URIにはこういった不透明性が存在するので、クライアントはいくら推測できたとしてもURI構造に疎であるべし。
:::

# マインドの話
フレームワークによっては自動的にURIを生成してくれるものもあるが、
「フレームワークがよしなにしてくれるから知らんわ〜:sleepy:」ではなく
「URIはリソースの名前である。寿命が長い。ブラウザ上で見えるもの。なので重要なのだ:smirk_cat:」という気持ちで
クールなURIを実装、設計するべし。
自分用　コマンドメモ

# Linux
# docker

dockerコンテナの作成、起動
```
$ docker run <コンテナ名>
```
停止中のコンテナを削除
```
$ docker rm <コンテナ名orコンテナID>
```
起動中のコンテナを強制削除
```
$ docker rm -f <コンテナ名orコンテナID>
```
任意の名前をつけてdockerコンテナの作成、起動
```
$ docker run --name <任意の名前> <コンテナ名>
```
dockerコンテナの作成、起動後プロセスが終了したら、コンテナを削除
```
$ docker run --name <任意の名前> --rm <コンテナ名>
```
コンテナの起動
```
$ docker start <コンテナ名orコンテナID>
```
コンテナの停止
```
$ docker stop <コンテナ名orコンテナID>
```
コンテナの再起動
```
$ docker restart <コンテナ名orコンテナID>
```
Dockerfileからイメージを生成
```
$ docker build <dockerfileパス>
```
起動中のコンテナ表示(起動中のみ）
```
$ docker ps
```
起動中のコンテナ表示(停止中含む）
```
$ docker ps　-a
```
起動中のコンテナ内でコマンドを実行する
```
$ docker exec <コンテナ名orコンテナID>　<コマンド>
```
コンテナに入る
```
$ docker exec -it <コンテナ名orコンテナID> /bin/bash
```
コンテナから出る
```
$ exit
```
ローカルにあるimageを全て表示
```
$ docker images
```
Dockerイメージを削除(起動中コンテナのイメージは削除できない)
```
$ docker rmi <イメージ名orイメージID>
```
コンテナとホストマシンでファイルのやりとりを行う
`ホスト→コンテナへコピー`
```
$ docker cp <ホストファイルのパスコンテナ指定>：<コンテナのパス>
```
`コンテナ→ホストへコピー`
```
$ docker cp <コンテナのパス>:<ホストファイルのパスコンテナ指定>
```
Dockerコンテナのログ出力
```
$ docker logs <コンテナ名orコンテナID>
```
Dockerコンテナのログ出力(リアルタイム)
```
$ docker logs -f <コンテナ名orコンテナID>
```
Dockerの詳細情報出力
```
$ docker inspect <コンテナ名orコンテナID>
```
Dockerイメージのダウンロード
```
$ docker pull イメージ名：タグ[レジストリURL]
```
コンテナをイメージ化
```
$ docker commit <コンテナ名orコンテナID> DockerHubID/イメージ名：タグ
```
イメージをDockerHubにアップ
```
$ docker push アカウント名/イメージ名：タグ
```
イメージの履歴確認
```
$ docker history <イメージ名orイメージID>
```
コンテナにボリュームをマウント
```
$ docker run -v ホストのパス：コンテナのパス　イメージ名
```

# Git

ブランチ作成
```
$ git branch <ブランチ名>
```
ブランチ切り替え
```
$ git checkout <ブランチ名>
```
ブランチ作成&ブランチ切り替え
```
$ git checkout -b <ブランチ名>
```
ブランチ名の変更
```
$ git branch -m <古いブランチ名> <新しいブランチ名>
```
ブランチ削除
```
$ git branch -d <ブランチ名>
```
commitの変更履歴をみる
```
$ git log
```
「Webを支える技術」読書メモ#4 URI

:::note info
本記事の内容
[Webを支える技術](https://amzn.asia/d/6TCP9kg)を読んだ際のノートのようなものです。
省略している部分もあり、書籍の内容を完全に要約するものではありません。

今回は第4章あたりの内容です。
:::

# URIとは？
日本語でいうと「統一リソース識別子」。
「統一」というのはみんな同じルールに、という気持ちの統一。
Web上のリソースを一意に示すもの。

## "統一リソース"の"リソース"
Web上に存在する名前付きの情報たちのこと。
hogehogeimage、〇〇文書、Aさんのブックマークリスト、Webページ△△などなど。

ここでいう**名前**は、必ず他のものと区別がつくもののことを言う。つまりURI。
URIは複数持っていてもよい。

### リソースの表現
表現はHTML、テキスト、画像など色々な形式がある。
クライアントとサーバー間でやり取りするデータそのもののこと。
状態によっても変化する。

## URIがないとき〜
リソースのアドレサビリティが低くて困る。
そのリソースを取得するためのサーバー、ログイン情報、ディレクトリ、ファイル名などをすべてクライアント側が覚えておく必要がある。
プログラムから扱うことを想像すると扱いづらい。

# 仕様
[RFC3986](https://tex2e.github.io/rfc-translater/html/rfc3986.html) に従う。

こんな構成。
<table>
  <tr>
    <td>URIスキーム(http or https)</td> 
    <td>（ユーザ名）</td>
    <td>ホスト名</td>
    <td>（ポート(TCP用)）</td>
    <td>パス</td>
    <td>クエリパラメータ</td>
    <td>URIフラグメント</td>
  </tr>
</table>

ASCII文字だけで構成し、それ以外は%エンコード（URLエンコード）する。
この辺のエンコードは文字コードによって結果が変わるので、注意がいるところ。

URIの仕様としては長さに制限はないが、ブラウザの仕様等の別都合で制限がかかる場合がある。

### ベースURI
パスよりも前の部分がついていると絶対URI（フルパス）、ついてないと相対URIという。
相対URIの起点をベースURIという。

使い方が2パターンある。
* そのリソースの場所をそのまま使う
    * リソース内に相対パスがあるぞ→今の場所とくっつけるか　スタイル
* ベースURIをリソース内のどこかに書いておく
    * HTMLのBase属性に書くのがスタンダード

## URIスキーム
`http://`の`://`の部分。
`:`が「スキームはここまでよ」と示し、
`//`が「このあとからユーザ名、ホスト名の始まりよ」と示す意味がある。

IANAに仕様がある。
初代はHTTPスキーム。

独自のスキームを作ることも可能ではあるが、作りたい理由が名前空間のためだけであれば既存スキームでなんとかしよう。
独自に作成するのは、プロトコルが新し場合くらいにしよう。（そしてそんなことはなかなかないね）
「Webを支える技術」読書メモ#3 REST

:::note info
本記事の内容
[Webを支える技術](https://amzn.asia/d/6TCP9kg)を読んだ際のノートのようなものです。
省略している部分もあり、書籍の内容を完全に要約するものではありません。

今回は第3章の内容です。
:::

```mermaid
%%{init:{'theme':'base','themeVariables':{'primaryColor':'#20b2aa','primaryTextColor':'white','primaryBorderColor':'#20b2aa','lineColor':'gray','textColor':'#6A7FABCC','fontSize':'20px'}}}%%

graph LR
A(("Web"))---B("世界規模のハイパーメディア")
A(("Web"))---C("世界規模の分散システム")
```
これが成功して、動作している理由が**REST**。

# RESTとは？
（マクロ）アーキテクチャスタイル。複数のアーキテクチャに共通する性質、様式、作法や流儀のこと。
特定の実装やアーキテクチャを指すものではない。
「アーキテクチャ」とも違う。

マクロアーキテクチャスタイルとあるが、対になる言葉としてマイクロアーキテクチャスタイルがある。
デザインパターンなんかがこれにあたる。マクロなのでもっと小粒なものを指す。

ざっくりイメージ
<img width="400" alt="ざっくりイメージベン図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877395/390009b4-04f2-c141-a6fb-6bfd3dfc27ed.png">

#### "特定の実装やアーキテクチャを指すものではない"とは？
こういう感じの包含関係にあるという話。
<img width="400" alt="ざっくりイメージベン図2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877395/bc5273de-6b78-a56c-ce7c-8e4eeaf2aaa9.png">

# 複合アーキテクチャスタイル
RESTは下記の要素で成り立っているが、実装者は必ずしもすべてを実現しなくても良いのがポイント。
| アーキテクチャスタイル |どういうこと|
|:-:|:-|
|クライアント/サーバ|クライアントはUIのみ<br>サーバはデータ・ストレージに分離<br>サーバは冗長化も可|
|ステートレスサーバ|クライアントの状態をサーバは管理しない<br>※対：ステートフル。cookieによるセッション管理等。|
|統一インタフェース|Uniform　Interface<br>統一して**限定的**なインタフェースでリソースへの操作をする。<br><br>限定的？<br>* クライアント/サーバ間を独立させる<br>* 全体をシンプルにする|
|キャッシュ|その名の通り…再利用するよ|
|階層化システム|プロキシやロードバランサーを置くことができる<br>HTTPで全部やり取りしているおかげ<br>しかもNOT HTTPなシステムを繋ぐこともできる|
|コードオンデマンド|js等でクライアントを拡張できる|

# いろんな視点でRESTを見る
## ハイパーメディアとREST
アプリケーション状態エンジンとしてのハイパーメディア。

URIによってリソースを再利用できる。

#### アプリケーション状態とは
アプリケーションの**利用者**が持つ状態のこと。
リンクをたどる作業によって遷移する。

## 分散システムとREST
分散オブジェクト（これで1アプリケーションとして動く）
```mermaid
%%{init:{'theme':'base','themeVariables':{'primaryColor':'#20b2aa','primaryTextColor':'white','primaryBorderColor':'#20b2aa','lineColor':'gray','textColor':'#6A7FABCC','fontSize':'20px'}}}%%

graph LR;
C("状態1").-A
D("状態2").-A

A(("サーバ"))--"呼び出し"-->B(("サーバ"))
B<--"返却"---A
```
※AからBを呼び出す段階でのオーバーヘッドがでかい場合があったりする。

よりも
RESTの
```mermaid
%%{init:{'theme':'base','themeVariables':{'primaryColor':'#20b2aa','primaryTextColor':'white','primaryBorderColor':'#20b2aa','lineColor':'gray','textColor':'#6A7FABCC','fontSize':'20px'}}}%%

graph LR;
C("状態1").-A
B.-D("状態2")

A(("リンク"))--"たどる"-->B(("リンク"))
```
となるほうが性能劣化が少ない。

インタフェースを統一しているので互換性で死ににくい。
「Webを支える技術」読書メモ#2 Web以前のシステムとWeb

:::note info
本記事の内容
[Webを支える技術](https://amzn.asia/d/6TCP9kg)を読んだ際のノートのようなものです。
省略している部分もあり、書籍の内容を完全に要約するものではありません。

今回は第1章〜第2章あたりの内容です。
:::

## Web以前のハイパーメディア
#### (1)Memex
ARPANETよりも更に前、構想のみで実装はない。
電気的に接続した本で、フィルムをリンクとしてつなぐアイデア。

#### (2)Xanadu
ハイパーメディア、ハイパーテキストという言葉を生んだが、頓挫した。

#### (3)Hyper Card
カード(文書)とカードをリンクさせて、別のカードに書かれたプログラムを実行可能にする。
HyperTalkでプログラムを相互に実行可能だが、ネットワークを通じてのデータのやり取りはできない。
初めて実用までいった。

### Web以前のハイパーメディア vs Web
旧来のハイパーメディア「Webって不完全じゃない？」
* リンクは単方向しかない
* リンク切れが起こりうる
* バージョン管理がない
* トランスクルージョンがない

Web「でもすごく普及したよ」
全部盛りで実装すればいいってもんじゃない。
機能が有りすぎると難しくなる。
不完全でも簡単だからこそみんなが使えることは強い。

## Web以前の分散システム
```mermaid
%%{init:{'theme':'base','themeVariables':{'primaryColor':'#20b2aa','primaryTextColor':'white','primaryBorderColor':'#20b2aa','lineColor':'gray','textColor':'#6A7FABCC','fontSize':'20px'}}}%%

graph LR;
    A(("端末")) --- B("ホストコンピュータ")
```
ホストコンピュータ1台で処理していた。
それが
```mermaid
%%{init:{'theme':'base','themeVariables':{'primaryColor':'#20b2aa','primaryTextColor':'white','primaryBorderColor':'#20b2aa','lineColor':'gray','textColor':'#6A7FABCC','fontSize':'20px'}}}%%

graph LR;
    A(("端末")) --- B("コンピュータ")
    A(("端末")) --- C("コンピュータ")
    A(("端末")) --- D("コンピュータ")
    B("コンピュータ") --- C("コンピュータ")
    C("コンピュータ") --- D("コンピュータ")
    B("コンピュータ") --- D("コンピュータ")
```
ちょっと図が散らかってますが、こんな感じで複数のコンピュータが接続された状態で分散して処理するようになった。

### RPC
Remote Procedure Call
リモートサーバーの実行中のプログラムを、クライアントから呼び出すことができるというもの。

```mermaid
%%{init:{'theme':'base','themeVariables':{'primaryColor':'#20b2aa','primaryTextColor':'white','primaryBorderColor':'#20b2aa','lineColor':'gray','textColor':'#6A7FABCC','fontSize':'20px'}}}%%

graph LR;
    A("ローカル側") -."IDLでメソッド定義".- B("リモート側")
    A("ローカル側") --"メッセージ(シリアライズ化)"--- B("リモート側")
    B("リモート側")---C["オブジェクト"]
    B("リモート側")---D["プログラム"]
```

今でもNFSなんかで使われていたりする。
UNIX戦争の時代に生まれた。

### 分散オブジェクト
RPCから進化して生まれた。
その名の通りオブジェクトをリモートに配置して、それを利用するしくみ。

便利ではあるが、仕様が複雑になりすぎた。

### 問題点
* 数が限定的
* コミュニケーションする相手が明確である
* メソッドが小さい

といった条件下であれば動く、という感じだった。
速度的に見ると、イントラネットであればまあ速いかもしれない、くらいの温度感だった。

もっと大規模な処理をしたり、オブジェクトが大量にあったりしたらとても使えない…という状態だった様子。
「Webを支える技術」読書メモ#1 Web概要

:::note info
本記事の内容
[Webを支える技術](https://amzn.asia/d/6TCP9kg)を読んだ際のノートのようなものです。
省略している部分もあり、書籍の内容を完全に要約するものではありません。

今回は第1章〜第2章あたりの内容です。
:::

Webの用途は色々ある。
* webサイト
* デバイスの設定画面などのUIの提供
* プログラム向けのAPIの提供

などなど。

# Webを構成するもの

Webを支える3大技術が **HTTP**（プロトコル）、**URI**（識別子）、**HTML**（表現）。
情報システムとしてはハイパーメディアシステム、分散システムの要素が特徴。

## ハイパーメディア
```mermaid
%%{init:{'theme':'base','themeVariables':{'primaryColor':'#20b2aa','primaryTextColor':'white','primaryBorderColor':'#20b2aa','lineColor':'gray','textColor':'#6A7FABCC','fontSize':'20px'}}}%%

graph LR;
A(("音楽"))---B(("動画"))
A(("音楽"))---D(("動画"))
A(("音楽"))---C(("テキスト"))
B(("動画"))---C(("テキスト"))
D(("動画"))---C(("テキスト"))
B(("動画"))---D(("動画"))
```
テキスト、動画、音楽などあらゆるメディアをハイパーリンクでつないだもの。
ユーザが**非線形に飛び回って見る**のが特徴。

従来のメディア（本や映画など）は線形的に見るもの。

### ハイパーリンク
ハイパーメディアにおいて、情報同士を結びつける**機構**のこと。
Webもこの中の一つ。

## 分散システム
集中システム：コンピューター1台で全部担う
分散システム：ネットワーク上の複数台でみんなでまかなう

# Webのレキシ
## ざっくり年表
※mermaidなどで縦書き年表的に書きたかったけどうまくかけなかったので、良い方法あれば教えて下さい。
#### - ARPANET
* 大学や研究機関同士をただつなぐネットワーク。Webはまだない。
* この頃に電子メール、ネットニュース、FTP、telnetとかが生まれた。
* TCI/IP + UUCPの世界。
#### - ハイパーメディア構想
#### - インターネット登場
#### - 分散システム
#### - 1990年頃 Webの提案
* **インターネットを使った**ハイパーメディア
* 単方向リンク
* ブラウザとサーバの誕生→無償公開
* 企業や大学の研究者から利用が拡がる
#### - 1993年 Mosaic(ブラウザ)が出てWebが普及
* 画像も扱うことができた◎
* 色々コンテンツが増えていく
:::note info
この時点でのWebの良し悪し
「オープンで不特定多数」が得意。そのため…

:smile: :+1:
* 大規模にしやすい
* HTTPSのおかげでOSやハードウェアがバラバラでもOK

:cry: :thumbsdown:
* 情報の集中管理が難しい
* リンク切れが起きやすい（単方向リンクのため）
:::

#### - Webの仕様策定
HTTP, URI, HTMLの標準化 by W3C。
それまではIETFのRFCだったが仕様策定が追いつかなくなる。

追いかけてXML, CSSなんかも標準化される。

このあたりの頑張りのおかげで、Webがまともに使えるものになっていく。


#### - 2000年頃 RESTの登場
ソフトウェアアーキテクチャの観点から
Webという大規模システムが成功した理由をまとめたもの。

#### - HTML以外のフォーマットが生まれる
RSS→Atomの誕生
データ表現向けのJSON等が生まれる

#### - Web APIのニーズの高まり
もともとは研究者たちの論文交換が主だった。
だんだん何かしらの計算などもするようになり、自動処理のニーズが高まる。
そこからAPIがあれば便利なのに…という流れが生まれる。

RPCや分散オブジェクトのアイデアをWebでも取り込もう！となり、SOAPが生まれる。
SOAP：トランスポートプロトコルとしてメッセージを送る。WS-* に周辺仕様郡がある。
サービスごとのプロトコルを定義しないと使えないという仕様で、そこの統一が難航した。

#### - SOAP vs REST
Googleが台頭してきたり、Amazonが出てきたりした頃。
このあたりの便利なものたちの登場でRESTが普及する。

#### - 2004年 Web2.0
RESTが主流になる。

マッシュアップという、複数のWebAPIの情報を組み合わせて1つのアプリケーションをつくる手法が登場する。
ここで手軽さの観点からRESTが活躍していく。

#### - すべてがWebになってゆく…
AjaxやComentの登場もあり、UI/UXが大きく変化していく。
Rust研究：画像ファイルの処理

Rust初心者です。ぼちぼちやってます。

Rust による画像ファイルの処理を調べてみました。

image クレートを使用します。

```
C:\work> cargo add image
```

以下、サンプルコードと処理結果の画像ファイルです。

```rust
// run.rs
use image::error::ImageResult;
use image::io::Reader;
use image::ImageFormat;
use image::imageops::FilterType;

pub fn process() -> ImageResult<()> {

    // 画像ファイルを読みだしてイメージデータを取得
    let mut image = Reader::open("image.png")?
    .decode()?;

    // イメージデータのサイズ（横×縦）の確認
    let width = image.width();
    let height = image.height();
    println!("size = {}x{}", width, height);

    // イメージデータ右下の四分の一をクロップ
    let image2 = image.crop(width/2, height/2, width/2, height/2);

    // ファイルに保存。
    // 画像フォーマットは保存先ファイルの拡張子で判別。PNG 形式で保存
    image2.save("image2.png")?;
    // イメージデータを画像フォーマットを指定してファイルに保存。
    // image3.save_with_format("image2.dat", ImageFormat::Bmp)?; // BMP 形式で保存

    // 90度回転 / 180度回転 / 270度回転
    let image3 = image2.rotate90(); // .rotate180(); // .rotate270();
    image3.save("image3.png")?;

    // リサイズ（4倍に拡大・ガウシアンフィルタを使用）
    let image4 = image3.resize(image3.width()*2, image3.height()*2, FilterType::Gaussian);
    image4.save("image4.png")?;

    // 上下の鏡像
    let image5 = image4.flipv();
    image5.save("image5.png")?;

    // 左右の鏡像
    let image6 = image5.fliph();
    image6.save("image6.png")?;

    // グレイスケール
    let mut image7 = image6.grayscale();
    image7.save("image7.png")?;

    // インバート
    image7.invert();
    image7.save("image8.png")?;
    
    Ok(())
}
```

image.png (もとの画像)
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960096/0fdf0027-8654-c71e-96fc-34becd7e2aa2.jpeg)

image2.png (クロップ)
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960096/2a7427ae-a912-0a2c-8057-aad8994df456.png)

image3.png (90度回転)
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960096/1cb28e07-c595-320f-4652-cbe4f88bb369.png)

image4.png (リサイズ）
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960096/49735dbe-a1e8-59c1-0485-350ce8973e04.png)

image5.png （上下鏡像）
![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960096/cc65493b-aee7-0eaf-2704-bb8ef12c32e9.png)

image6.png （左右鏡像）
![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960096/34eaa4e7-e18a-0964-1046-4ab413cecc13.png)

image7.png （グレイスケール）
![image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960096/8cd9ad15-a281-445b-aedb-d40703f35551.png)

image8.png （インバート）
![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960096/c827d594-dce9-343a-0643-acf9f5e941a0.png)

以上。
【Android】ADBでログを作る

adbコマンドからログを作れることを知ったのでメモ

以下のコマンドでadbからログを仕込むことができます。

```shell
adb shell log -t "gottie" hogehoge
```


コードにログを仕込んでビルドする必要がなくなったりします。
特定の操作において大量のログを確認したい場合、adbコマンドから二発ログを仕込むことで、その間だけ確認すればよくなったりと、意外と便利です。

ちなみにオプションは以下の二つがあります。

- `-p`
Prioirtyを変更できます。`DEBUG`とか`ERROR`とかのレベルの話ですね。

- `-t`
例でも使用しましたが、タグとして使用することができます。


以上です。
半導体って何？

# はじめに
半導体が不足しているというニュースを、ここ何年かの間に耳にしたと思うが、
「ハンドウタイってなに？」という人もいると思う。
私がその一人である。
なんかわからないけど謎の部品が不足しているんだろうなあと思っていたが、
switchのProコンが店頭に並ばなくなり、その影響をもろに受けた。
この記事では、半導体って何かについてまとめたいと思う。

## この記事の対象者
* 半導体が何かをざっくり知りたい人

# 半導体があると何がうれしい？
半導体は、さまざまな製品の部品として使われている。
* スマホ
* PC
* 自動車
* 冷蔵庫
etc...


現代社会において、半導体に関わらずに生きていくことは不可能なほど、
いろいろな製品に使われていることがわかる。

# 半導体の定義
中学の理科で、電気を通す導体と、電気を通さない絶縁体の授業を受けたと思う。
半導体は、その二つの中間の性質を持つ物質、材料のことである。
「中間の性質」とは電気を通すときと通さないときがあるという意味で、
条件によって操作ができる。

電子が移動すると電気が通るが、
絶縁体の場合、電子が移動できない「バンドギャップ」と呼ばれる領域を持つため、電気を通さない。
逆に導体はバンドキャップが無いため、電気を通す。
半導体はバンドキャップを持つが、絶縁体ほどバンドギャップが大きくない。
そのため、不純物を混ぜることによって電子や空孔の流れを制御し、電子の移動をコントロールできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697198/141d3bb3-85f4-452e-f0d7-cf6f808557a9.png)



下記のサイトで図を用いて詳しく記載がされているので、詳細を知りたい人は下記を参照いただきたい。
参考：https://www.tel.co.jp/museum/exhibition/principle/semiconductor.html


また、上記で説明した半導体を活用したトランジスタや回路などを
慣例的に「半導体」と呼ぶこともあるらしい。
参考：https://www.seaj.or.jp/semi/about_semi.html




# まとめ
* 半導体は、条件によって電気を通す/通さないを操作できる物質、材料のこと
* スマホやPC、自動車など、私たちの触れる様々な電化製品に使われている

# 参考文献
https://www.seaj.or.jp/semi/about_semi.html

https://www.y-skt.co.jp/magazine/knowledge/guide-semicon/

https://www.tel.co.jp/
AWS Lambdaでコンテナ(インスタンス)を再利用させないようにする

Lambdaは前回実行から310秒以内に実行するとコンテナを再利用します。sleepさせて意図的に再利用できないようにできます。汚れた環境で実行したくない場合に便利です

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtime-environment.html

### 検証方法

`sleep 320`にするとログストリームが増え、新しいコンテナ(インスタンス)で実行されていることがあわります

```bash
for i in `seq 10`; do curl https://.lambda-url.ap-northeast-1.on.aws/; sleep 320; done
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/f5d240b2-1bba-f263-7187-182fed44ad87.png)

`sleep 300`にするとログストリームが増えず、１つのコンテナ(インスタンス)で実行されていることがあわります

```bash
for i in `seq 10`; do curl https://.lambda-url.ap-northeast-1.on.aws/; sleep 300; done
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/1510a3ff-f52a-f04e-6189-02c09ba834c5.png)
TypeScriptとFsharpでuniq関数を再帰で実装してみよう

```TypeScript
const uniq = <T>(list: T[], resultList: T[] = []) => {
  /* 基底部。配列の長さが0のときは処理を終了する */
  if (list.length === 0) return resultList;

  /* 配列の一番最初を取り出した部分と、残りに分ける */
  const head = list[0];
  const tail = list.slice(1);

  /*
    すでにresultListのなかに存在しているかどうか
    JSON.stringifyにしないとオブジェクトの比較に失敗する。
  */
  const exists = resultList.findIndex(
    (x) => JSON.stringify(x) === JSON.stringify(head)
  );

  /* すでに存在していたらそのまま返し、存在していなければ末尾に足して返す */
  return exists !== -1
    ? uniq(tail, resultList)
    : uniq(tail, [...resultList, head]);
};
```

```Fsharp
(* 関数だとデフォルト引数ができないらしいので、使うときは空のリストを渡す *)
let rec uniq list result =
    (* 空のときはresultを返す *)
    if List.isEmpty list then
        result
    else
        (* headとtailにわける *)
        let head = List.head list
        let tail = List.tail list

        (*
          すでに含まれているときはresultを
          含まれていなければ末尾に足したものを返す
        *)
        if result |> List.contains head then
            uniq tail result
        else
            uniq tail (result @ [ head ])
```

Fsharpは書いてて楽しいです。
もっときれいに書けるんでしょうね。
if式よりもmatchで書くほうが良いのかな？

```fsharp
(* 実は標準でuniqにできる *)
let uniq list = List.distinct list
```
Markdown これだけ覚えておけばOK

# Markdown 記法

Markdown 初心者の私が、これだけ使えれば、まぁいいか。なMarkdown 記法を書いておく。  

## 改行  

最初のつまづきどころとして、改行。  
ただ、Enter で改行していっても、Markdown では改行されない。  
改行するため、`半角スペースを2つ`、行末に入れる。  

## 見出し

シャープ(#)を入れることで、見出しになる。  

```
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6
```
このページで言うと、
「**Markdown サンプル**」が、見出し1  
「**改行**」、「**見出し**」が、見出し2  
（実際にここで表示してしまうと、見出し一覧が崩れてしまうので、表示はしない。）

## 番号なしリスト  

`*` `+` `-` を使うと箇条書きのリストになる。それぞれ、後ろに`半角スペース`が必要。 

```
* リスト1
  * リスト1-1
  * リスト1-2
    * リスト1-2-1
* リスト2
* リスト3
```

* リスト1
  * リスト1-1
  * リスト1-2
    * リスト1-2-1
* リスト2
* リスト3

## 番号ありリスト  

`数字. ` を使うと、番号ありのリストになる。数字の後ろに`半角スペース`が必要。  
`1.`にすると、自動的に番号も振り直してくれる。  
ネストする時は、段落と同じだけのスペースが必要。

```
1. リスト1
   1. リスト1-1
   1. リスト1-2
      1. リスト1-2-1
      1. リスト1-2-2
1. リスト2
1. リスト3
```

1. リスト1
   1. リスト1-1
   1. リスト1-2
      1. リスト1-2-1
      1. リスト1-2-2
1. リスト2
1. リスト3

## 引用  

文頭に`>`をつけると引用文になる。

```
> これは引用文です。  
> > これは、もう1つ深い引用文です。
```

> これは引用文です。  
> > これは、もう1つ深い引用文です。

## コードブロック  

バッククオート`` ` ``もしくは、チルダ`~`3つでコード全体を囲むと、コードブロックになる。  

~~~
```
print("Hello world!")
```
~~~

```
print("Hello world!")
```
バッククオートの後ろに、言語の名前を書くと、シンタックスハイライトされる。(言語ではなく、ファイル名でもOK）
~~~
```python
print("Hello world!")
```
~~~

```python
print("Hello world!")
```
自分がよく使う言語でいうと、  
- python
- shell
- console
- json
- sql

あたり。  


Qiita公式は以下。  
[Qiitaでシンタックスハイライト可能な言語一覧](https://qiita.com/Qiita/items/e84f5aad7757afce82ba)

`` ` `` 1つで囲むと、部分的に表示することができる。  
apt get install の両側を囲むと、`apt get install` こんな感じで表示。


## リンク  

以下の書式で、リンクがはれる。

```
[リンクテキスト](URL)
[Qiita](https://qiita.com)
```

[Qiita](https://qiita.com)

## 文字装飾

`*`または`_`1つで囲むと、イタリック表記  
2つで囲むと、太字  
3つで囲むと、イタリックかつ太字
`~~`波線2つで囲むと、打ち消し線
```
*イタリック*
**太字**
***イタリックかつ太字***
~~打ち消し~~
```

*イタリック*
**太字**
***イタリックかつ太字***
~~打ち消し~~

## 表  

```
| 左寄せ | 中央寄せ | 右寄せ |
|:--|:--:|--:|
|left|center|right|
|left|center|right|
|left|center|right<br>right|
```

| 左寄せ | 中央寄せ | 右寄せ |
|:--|:--:|--:|
|left|center|right|
|left|center|right|
|left|center|right<br>right|

表のセル内で改行を入れたくなることがある。  
その場合、`<br>`を追加すればOK
また、セルの結合はできない。（アドインやHTMLタグを使えばできるらしい。）

## 画像  

以下の書式で、画像を埋め込める。
代替テキストとは、何らかの原因で画像が表示されなかったときに表示されるテキストのこと。

```
![代替テキスト](画像のURL)
![Qiita](https://s3-ap-northeast-1.amazonaws.com/qiita-image-store/0/88/ccf90b557a406157dbb9d2d7e543dae384dbb561/large.png?1575443439)
```

![Qiita](https://s3-ap-northeast-1.amazonaws.com/qiita-image-store/0/88/ccf90b557a406157dbb9d2d7e543dae384dbb561/large.png?1575443439)

## 水平線
  
`*`、`-`を3つ以上連続して書くと、水平線になる。

```
***
---
```
***
---

これだけ覚えておけば、十分、Markdown 使えます。って、言っていいよ！！（自分向け）
Python Web 開発の威力。正しい選択である理由

Pythonは、近年、Web開発において最も人気のあるプログラミング言語の1つとして浮上しています。その汎用性、シンプルさ、使いやすさから開発者の間で人気があり、最も人気のあるWebサイトやWebアプリケーションを構築するために使用されてきました。

では、なぜあなたの次のプロジェクトにPythonのWeb開発者を選ぶべきなのでしょうか？ここでは、主な理由をいくつかご紹介します。https://sloboda-studio.com/python-development-services/。

汎用性。Pythonは、複雑なWebアプリケーションの構築、動的なWebサイトの作成、バックエンドシステムの開発など、さまざまなWeb開発プロジェクトに使用することができます。この汎用性により、Webベースの製品やサービスを幅広く開発しようとしている企業にとって、優れた選択肢となります。

使い勝手の良さ Pythonはシンプルで習得しやすい言語であるため、あらゆるレベルの開発者に最適な選択肢です。その構文は単純で読みやすく、開発者が素早く効率的にコードを書くことを容易にします。つまり、PythonのWeb開発者は、他の言語を使用する開発者よりも、より速く作業し、より高品質のコードを作成することができます。

大規模なコミュニティ Pythonには大規模で活気のある開発者コミュニティがあり、開発者が問題を解決したりトラブルシューティングしたりするのに役立つリソースがたくさんあることを意味します。また、コミュニティは新しいライブラリやツールの開発にも積極的に参加しており、開発者がより複雑なWebアプリケーションを簡単に構築できるようになります。

スケーラビリティ。Pythonは拡張性の高い言語です。つまり、大量のトラフィックやデータを処理するアプリケーションの構築に使用することができます。このスケーラビリティは、Webベースの製品やサービスを長期的に成長させたいと考えている企業にとって、優れた選択肢となります。

オープンソースであること Pythonはオープンソース言語であり、自由に使用、変更することができます。Pythonの使用にはライセンス料がかからないため、開発コストの削減を目指す企業にとって最適な選択肢となります。

結論として、PythonのWeb開発者は、Webベースの製品やサービスを構築しようとしている企業に幅広い利点を提供します。汎用性、使いやすさ、大規模なコミュニティ、拡張性、オープンソースの性質から、Pythonは高品質のWebアプリケーションやWebサイトを構築したいビジネスにとって最適な選択肢です。Web開発プロジェクトを検討されている方は、ぜひPythonのWeb開発者との協業をご検討ください。
H8 アセンブラ　命令セット

# データ転送命令 		
|命令|内容|
|:--|:--|
|MOV|汎用レジスタと汎用レジスタまたは汎用レジスタとメモリ間でデータ転送します。
|PUSH|汎用レジスタの内容をスタックに退避します。
|POP|スタックから汎用レジスタへデータを復帰します。
|MOVTPE|汎用レジスタの内容をクロックに同期したタイミングで外部メモリに転送します。
|MOVFPE| 外部メモリの内容を クロックに同期したタイミングで汎用レジスタに転送します。
# 算術演算命令 		
|命令|内容|
|:--|:--|
|ADD|汎用レジスタと汎用レジスタまたは汎用レジスタとイミディエイトデータ間の加減算を行います
|SUB|汎用レジスタと汎用レジスタまたは汎用レジスタとイミディエイトデータ間の加減算を行います
|ADDX|汎用レジスタと汎用レジスタまたは汎用レジスタとイミディエイトデータ間のキャリ付きの加減算を行います。
|SUBX|汎用レジスタと汎用レジスタまたは汎用レジスタとイミディエイトデータ間のキャリ付きの加減算を行います。
|INC|汎用レジスタに 1 または 2 を加減算します
|DEC|汎用レジスタに 1 または 2 を加減算します
|ADDS|32 ビットレジスタに 12または 4 を加減算します。
|SUBS|32 ビットレジスタに 12または 4 を加減算します。
|DAA|汎用レジスタ上の加減算結果を CCR を参照して 4 ビット BCD データに補正します。
|DAS|汎用レジスタ上の加減算結果を CCR を参照して 4 ビット BCD データに補正します。
|MULXU|汎用レジスタと汎用レジスタ間の符号なし乗算を行います。
|MULXS|汎用レジスタと汎用レジスタ間の符号付き乗算を行います。
|DIVXU|汎用レジスタと汎用レジスタ間の符号なし除算を行います。
|DIVXS|汎用レジスタと汎用レジスタ間の符号付き除算を行います。
|CMP|汎用レジスタと汎用レジスタまたは汎用レジスタとイミディエイトデータ間の比較を行いその結果を CCR に反映します。
|NEG|汎用レジスタの内容の 2 の補数（算術的補数）をとります。
|EXTS|16 ビットレジスタの下位 8 ビットをワードサイズに符号拡張します。
|EXTU| 16 ビットレジスタの下位 8 ビットをワードサイズにゼロ拡張します。
# 論理演算命令 		
|命令|内容|
|:--|:--|
|AND|汎用レジスタと汎用レジスタまたは汎用レジスタとイミディエイトデータ間の論理積をとります。
|OR|汎用レジスタと汎用レジスタまたは汎用レジスタとイミディエイトデータ間の論理和をとります。
|XOR|汎用レジスタと汎用レジスタまたは汎用レジスタとイミディエイトデータ間の排他的論理和をとります。
|NOT| 汎用レジスタの内容の 1 の補数（論理的補数）をとります。
# シフト命令 			
|命令|内容|
|:--|:--|
|SHAL|汎用レジスタの内容を算術的にシフトします。
|SHAR|汎用レジスタの内容を算術的にシフトします。
|SHLL|汎用レジスタの内容を論理的にシフトします。
|SHLR|汎用レジスタの内容を論理的にシフトします。
|ROTL|汎用レジスタの内容をローテートします。
|ROTR|汎用レジスタの内容をローテートします。
|ROTXL|汎用レジスタの内容をキャリフラグを含めてローテートします。
|ROTXR|汎用レジスタの内容をキャリフラグを含めてローテートします。
# ビット操作命令 		
|命令|内容|
|:--|:--|
|BSET|汎用レジスタまたはメモリのオペランドの指定された 1 ビットを 1 にセットします。
|BCLR|汎用レジスタまたはメモリのオペランドの指定された 1 ビットを 0 にクリアします。
|BNOT|汎用レジスタまたはメモリのオペランドの指定された 1 ビットを反転します。
|BTST|汎用レジスタまたはメモリのオペランドの指定された 1 ビットをテストしゼロフラグに反映します。
|BAND|汎用レジスタまたはメモリのオペランドの指定された 1 ビットとキャリフラグとの論理積をとり結果をキャリフラグに格納します。
|BIAND|汎用レジスタまたはメモリのオペランドの指定された 1 ビットを反転しキャリフラグとの論理積をとり結果をキャリフラグに格納します。
|BOR|汎用レジスタまたはメモリのオペランドの指定された 1 ビットとキャリフラグとの論理和をとり結果をキャリフラグに格納します。
|BIOR|汎用レジスタまたはメモリのオペランドの指定された 1 ビットを反転しキャリフラグとの論理和をとり結果をキャリフラグに格納します。
|BXOR|汎用レジスタまたはメモリのオペランドの指定された 1 ビットを反転しキャリフラグとの論理和をとり結果をキャリフラグに格納します。
|BIXOR|汎用レジスタまたはメモリのオペランドの指定された 1 ビットを反転しキャリフラグとの排他的論理和をとり結果をキャリフラグに格納します。
|BLD|汎用レジスタレジスタまたはメモリのオペランドの指定された 1 ビットをキャリフラグに転送します。
|BILD|汎用レジスタレジスタまたはメモリのオペランドの指定された 1 ビットを反転しキャリフラグに転送します。
|BST|汎用レジスタまたはメモリのオペランドの指定された 1 ビットにキャリフラグの内容を転送します。
|BIST| 汎用レジスタまたはメモリのオペランドの指定された 1 ビットにキャリフラグの内容を転送します。
# 分岐命令 			
|命令|内容|
|:--|:--|
|Bcc|指定した条件が成立しているとき指定されたアドレスへ分岐します。
|JMP|指定されたアドレスへ無条件に分岐します。
|BSR|指定されたアドレスへサブルーチン分岐します。
|JSR|指定されたアドレスへサブルーチン分岐します。
|RTS| サブルーチンから復帰します。
# システム制御命令 	
|命令|内容|
|:--|:--|
|TRAPA| 命令トラップ例外処理を行います。
|RTE|例外処理ルーチンから復帰します。
|SLEEP|低消費電力状態に遷移します。
|LDC|汎用レジスタまたはメモリの内容を CCR に転送します。またイミディエイトデータを CCR に転送します。
|STC|CCR の内容を汎用レジスタまたはメモリに転送します。CCR は 8 ビットですがCCR とメモリ間の転送はワードサイズで行われ上位 8 ビットが有効になります。
|ANDC|CCR とイミディエイトデータの論理積をとります。
|ORC|CCR とイミディエイトデータの論理和をとります。
|XORC|CCR とイミディエイトデータの排他的論理和をとります。
|NOP| PC のインクリメントだけを行います。
# ブロック転送命令 	
|命令|内容|
|:--|:--|
|EEPMOV| ブロック転送命令です。ER5 で示されるアドレスから始まりR4L または R4 で指定されるバイト数のデータをER6 で示されるアドレスのロケーションへ転送します。
Laravel環境構築【Laravel Sail】

# Laravel Sailで環境構築
## 1. Docker Desktopのインストール
## 2. 以下のコマンドを入力
    curl -s https://laravel.build/{アプリ名} | bash
### データベースにログイン
    sail mysql

PostgreSQLを使う場合は以下

    curl -s "https://laravel.build/{アプリ名}?with=pgsql" | bash

### データベースにログイン

    sail psql
【Swift】Apple Siliconを搭載しているか判定する

# はじめに
現在、[apple/ml-stable-diffusion](https://github.com/apple/ml-stable-diffusion)を使ったmacOSアプリを開発しています。
[apple/ml-stable-diffusion](https://github.com/apple/ml-stable-diffusion)はApple Siliconを搭載したmacでしか動かないので判定する必要がありました。
既にKyomeさんが記事にしてくれていたのですぐに実装することができました。
また使うことがあるかもしれないので記録しておきます。

# 実装
```swift
#if arch(x86_64)
    print("Intel")
#elseif arch(arm64)
    print("Apple Silicon")
#endif
```

# おわり
macアプリ開発で困ったことがあれば、KyomeさんのZennを見るべし

# 参考記事
https://zenn.dev/kyome/articles/a64c83e5b0218b
chemfigでの両舵矢印と片鉤矢印

# 両鉤矢印と片鉤矢印
両鉤の方はマニュアルに書かれているため，簡単にできたが，片鉤の方は時間がかかったのでtipとしてここに示しておく．

```
\begin{figure}[ht]
\centering
\schemestart
\chemfig{C^{+}(-[:240,1.3]H)(-[:-240,1.3]H)=[,1.3]C^{-}(-[:60,1.3]H)(-[:-60,1.3]H)}
\schemestop
\chemmove{\draw[shorten <=3pt, shorten >=2pt](dnl) ..controls +(90:5mm) and +(90:5mm)..(atoo2);}
\schemestart
\chemfig{X^{-}(-[:240,1.3]H)(-[:-240,1.3]H)-[,1.3]Y^{+}}
\schemestop
\chemmove{\draw[shorten <=3pt, shorten >=2pt](dnl) ..controls +(90:5mm) and +(90:5mm)..(atoo2);}
\end{figure}
```

# 結果
![スクリーンショット 2023-02-23 20.04.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921144/ed724e58-db3b-df1a-6374-2d3f415db7fe.png)
ChatGPTってすごいね

# 今回の記事

プログラミング初心者ですが、話題のChatGPTに触りたいと思って、遊んでみました。
すると、思ったよりこいつ使えるやん！って思ったので記事にしちゃおうかなって思いました。

# 以下実際の様子（一部表示の修正あり）
###### ※内容は変えていません

質問：Pythonを使って、登録した動物の種類をランダムに取り出すプログラムを作って

解答：以下はPythonでランダムに動物の種類を取り出すプログラムの例です。この例では、リストに動物の種類を追加することで、より多くの動物を追加できます。

python
Copy code
import random

###### 動物の種類のリストを定義する
```Python:ChtaGPT
animals = ["犬", "猫", "鳥", "魚", "うさぎ"]

# ランダムに動物の種類を取り出す
random_animal = random.choice(animals)

# 結果を表示する
print("ランダムに選ばれた動物は {} です。".format(random_animal))
```
解答：このプログラムでは、randomモジュールのchoice関数を使用して、animalsリストからランダムに1つの要素を選択します。その後、選択された動物の種類を表示します。

# 他の質問

質問：Pythonの基本構文をまとめて
解答：Pythonは直感的で簡単に使える言語の1つであり、初学者でも理解しやすい構文を持っています。以下はPythonの基本的な構文の一部です。

###### コメント
コード中にコメントを挿入することができます。コメントは、コードの説明やメモなど、実行時に無視されるテキストです。コメントは # を使って記述されます。
```Python:ChatGPT
# これはコメントです
```

###### 変数
変数には任意の値を割り当てることができます。変数の名前はアルファベット、数字、アンダースコアの組み合わせであり、数字で始めることはできません。Pythonは動的型付け言語であり、変数の型を宣言する必要はありません。
```Python:ChatGPT
x = 10
name = "John"
```

###### データ型
Pythonにはいくつかのデータ型があります。以下はPythonでよく使われるデータ型です。

数値型: 整数型(int)、浮動小数点型(float)、複素数型(complex)
文字列型(str)
ブール型(bool)

```Python:ChatGPT
# 数値型
x = 10
y = 3.14
z = 2 + 3j
```

###### 文字列型
```Python:ChatGPT
name = "John"
message = 'Hello, world!'
```
###### ブール型
```Python:ChatGPT
is_true = True
is_false = False
```

###### 条件分岐
Pythonでは、if文を使って条件分岐を行うことができます。if文の後ろには、条件式が続きます。条件式がTrueの場合は、ifブロック内のコードが実行されます。

```Python:ChatGPT
x = 10

if x > 0:
    print("x is positive")
elif x < 0:
    print("x is negative")
else:
    print("x is zero")
```

###### 繰り返し
Pythonでは、for文やwhile文を使って繰り返し処理を行うことができます。
```Python:ChatGPT
# for文
for i in range(5):
    print(i)

# while文
i = 0
while i < 5:
    print(i)
    i += 1
```

###### 関数
Pythonでは、関数を定義してコードを再利用することができます。関数は、引数を受け取り、処理を実行し、結果を返すことができます。

```Python:ChatGPT
def greet(name):
    print("Hello, " + name + "!")

greet("John")
````
これらはPythonの基本的な構文の一部です。他にも、リスト、タプル、辞書、クラス、モジュールなど、Pythonで使用される様

# 所感

これらは例の一部ですが、ChatGPTはあらゆることの学習に応用できるのではないでしょうか。
さまざまな分野の学習においてもQiitaやterailや知恵袋などがいらなくなる可能性も考えました。
normalize

## NFKC,NFKD
NFKC  normalize form compatibility Compose
NFKD  normalize form compatibility Decompose
compatibility、つまり互換性のあるものに統一変換
実験した結果、全角数字、半角数字、①②は半角数字（１→1、①→1)、半角カナ、全角カナは全角カナ（ｶﾞ→ガ）に統一される
## NFC,NFD
NFC  normalize form compose
NFD  normalize form decompose
こちらはnon compatibility。互換性を意識しないので
[ｶﾞ、ガ]、および、[１、1、①]は別物として扱われる

## compose, Decompose
compose(ガ）、decompose（カ＋”）の統一

```java
package sampleproject;

import java.text.Normalizer;

/**
 *
 * @author java
 */
public class SampleProject {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        char c1 = '\u3066';
        char c2 = '\u3099';
        System.out.println(c1);
        System.out.println(c2);
        String s = "\u3066\u3099";
        printall(s);
        s = "ガ";
        printall(s);
        s = "ｶﾞ";
        printall(s);
        s = "１";
        printall(s);
        s = "1";
        printall(s);
        s = "①";
        printall(s);
    }
    static void printall(String str) {
        System.out.println("----------------");
        print(str,"");
        print(Normalizer.normalize(str, Normalizer.Form.NFC),"NFC");
        print(Normalizer.normalize(str, Normalizer.Form.NFD),"NFD");
        print(Normalizer.normalize(str, Normalizer.Form.NFKC),"NFKC");
        print(Normalizer.normalize(str, Normalizer.Form.NFKD),"NFKD");
    }
    static void print(String str, String opt) {
        System.out.println(opt + " " + str + ":" + str.length());
    }
}
```
```
て
゙
----------------
 で:2
NFC で:1
NFD で:2      //て、”　
NFKC で:1
NFKD で:2　　　//て、”
----------------
 ガ:1
NFC ガ:1
NFD ガ:2　　　　//カ、”
NFKC ガ:1
NFKD ガ:2　　　　//カ、”
----------------
 ｶﾞ:2　　　　　　
NFC ｶﾞ:2
NFD ｶﾞ:2　　　　
NFKC ガ:1
NFKD ガ:2　　　　//カ、”
----------------
 １:1
NFC １:1
NFD １:1
NFKC 1:1
NFKD 1:1
----------------
 1:1
NFC 1:1
NFD 1:1
NFKC 1:1
NFKD 1:1
----------------
 ①:1
NFC ①:1
NFD ①:1
NFKC 1:1
NFKD 1:1
```
Zabbix6.0でAPIを利用してグラフ画像を取得する際の注意点

# 経緯
底辺SEである私がZabbix6.0のAPIを利用してグラフ画像を取得しようとした際に、
google検索等で見つかるコードだけでは取得できなかった。
私の探し方が悪かった可能性も大きく、もっと簡単な方法もあるかもしれません・・・
また、WEBページの仕組みに疎いため、識者が見れば当たり前の情報の可能性もありますが誰かの助けになればと思い情報共有します。

## 経緯
巷で見つかるコードですが、おおむね下記の手順でグラフ画像をローカルに保存していると思います。
① APIログインしてトークン取得。
② graph.getメソッドを使いgraphidを特定。
③ graphidを利用してrequests.get用のクエリを作成。
④ request.get実行した結果を変数に格納。
⑤ open関数を使ってローカルにPNG出力。

私の場合は、④ request.getで躓いてました。
保存されたのは画像として開けない謎ファイルでした。
変数に格納されたデータをprint(変数名.text)で確認した結果、中身はログイン画面のhtmlファイルであることが判明。

### 結論
API側へのログインの他にWEB側(index.php)へのログイン処理が必要でした。

#### 解決法
通常のAPI側の処理にWEB側へのログイン処理を加えて下さい。
以下に、WEB側(index.php)へのログイン処理を記載します。
```
# Zabbix WEBへのログイン
url = 'http://exzample.co.jp/zabbix/index.php' #末尾に「/index.php」を忘れないよう注意して下さい。
payload = {
    'name': 'Admin_ID',
    'password': 'Admin_PASS',
    'autologin': '1',
    'enter': 'Sign in'
}
session = requests.Session()
response = session.post(url, data=payload)
```

これでWEB側(index.php)へのログイン処理が完了しました。
後は、request.getで画像を取得するだけですが、ログインしたセッション情報をreqeustsに渡す必要があります。
具体的には、request.getではなくrequests.Session().getを使います。

以下に、request部分を含めた全体のコードを記載します。
```
# Zabbix WEBへのログイン
url = 'http://hostname/zabbix/index.php' #末尾に「/index.php」を忘れないよう注意して下さい。
payload = {
    'name': 'ID',
    'password': 'PASS',
    'autologin': '1',
    'enter': 'Sign in'
}
session = requests.Session()
response = session.post(url, data=payload)

# グラフ取得用クエリ  #取得内容によってパラメータは変更して下さい。
payload2 = {
    'graphid': '2231', 
    'from': 'now-7d',
    'to': 'now',
    'profileIdx': 'web.graphs.filter'
}

chart_url = 'http://hostname/zabbix/chart2.php' #今度はchart2.phpを使用します。
cookie = dict(zbx_session=session.cookies.get_dict().get('zbx_session'))

# cookieを渡してグラフ画像を取得
response2 = session.get(chart_url, params=payload2, cookies=cookie)

# 画像を保存
with open('graph.png', 'wb') as f:
    f.write(response2.content)
```

##### おわりに
以上が、私が躓いた問題と解決方法になります。
参考になれば幸いです。
【TypeScript】  Javascriptのデータ型について学習したことをまとめる

🚨🚨🚨🚨個人的なアウトプット用記事なので、情報収集の人は閲覧注意です🙇
🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨

## プリミティブ型
### 真偽値(boolean) trueとかfalseを扱える
例
```const foo: boolean = trueまたはfalse; ```OK！

```const foo: boolean = 0;```booleanは真偽値しか扱えないのでエラーになる。

### 文字列(string)　”a”とか文字
例
```const foo: string = "スノボー"; ```OK！

```const foo: string = true;```stringは文字列しか扱えないのでエラーになる。


### ・数値(number)　１や０など数字
例
```const foo: number = １; ```OK！

```const foo: number = trueとか"スキー";```numberは数値しか扱えないのでエラーになる。

### null　現在利用できない状態の型
例
```const foo: null = null; ```OK！

```const foo: null = "null";```null型にはnull以外入れてはいけないのでエラーになる。何も入れてもダメ
### undefind 初期化されていない状態の型
```const foo: undefind = undefind; ```OK！

```const foo: undefind = "undefind"```nullと同じだが


## オブジェクト型
プリミティブ型以外
配列、関数とか

 Array
 Tuple
Any
Unknown
 Void
 Never
メールアドレスマスク化CLIツールを作ったのでメモ

### 背景

マーケティングのシステムの保守をしていたときにメールアドレスをマスク化して外部の関係者に連携するというタスクがあったので、CLIツール作ってみようかなと思ったため。

### ツールを作成した目的

個人情報であるメールアドレスが含まれるログファイルに対して、メールアドレスのマスク化を自動化するために作成したツール。

### 使用方法

#### Mac/Linux

１.使用環境と同じフォルダにある実行バイナリファイル「addressMask」をカレントディレクトにダウンロードして、配置する

２.メールアドレスを置換したいファイルが格納されたディレクトリを作成する

３.以下のコマンド実行する

注意　[対象フォルダ名]  の後ろにスラッシュ(/)はなし

```bash
cd [ダウンロードしたディレクトリ]
./addressMask mask [対象ディレクトリ名]
```

４.メールアドレスが置換されていることを確認する

#### Windows

１.使用環境と同じフォルダにある実行バイナリファイル「addressMask.exe」をカレントディレクトにダウンロードして、配置する

２.メールアドレスを置換したいファイルが格納されたディレクトリを作成する

３.以下のコマンド実行する

```コマンドプロント
cd [ダウンロードしたフォルダ名]
addressMASK.exe [対象フォルダ名]
```

### 終わりに

このツールは、実務で使えずじまいだったのでせめてものということで投稿します。

ソースはこちら


https://github.com/o-ga09/GolangCLI_addressMASK
テスト88

```vb
'Access
'標準モジュール

Public Msg_FilePath As String
Public FSO As Variant
Public cn As New ADODB.Connection  'データベース接続用変数
Public rs As New ADODB.Recordset   'レコードセット用変数
Public strSQL As String            'SQL格納用

Sub Make_Mail()
'------------------------------------
'事前に以下の参照設定をしておく
'Microsoft 16.0 Object Library
'------------------------------------
Dim ol As Outlook.Application
Dim objMail As Object
Dim Attach_FilePath As String
Dim F As Variant
Dim olClass As Ol_Class

Set olClass = New Ol_Class
Set FSO = CreateObject("Scripting.FileSystemObject")

'DB接続
Set cn = CurrentProject.Connection

'SQL文作成
strSQL = "SELECT * " & _
         "FROM T_保存先フォルダパス " & _
         "WHERE ID = 2 ;"
                                             
'指定のSQLからレコードを取得
rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic

'添付ファイルパス取得
For Each F In FSO.getfolder(rs.Fields(1).Value).files

    Attach_FilePath = F
    Exit For
    
Next F

Set rs = Nothing

'SQL文作成
strSQL = "SELECT * " & _
         "FROM T_保存先フォルダパス " & _
         "WHERE ID = 1 ;"
                                             
'指定のSQLからレコードを取得
rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic

'Msgファイルの保存先パス
Msg_FilePath = rs.Fields(1).Value


'Outlook
Set ol = New Outlook.Application

Set objMail = ol.CreateItem(olMailItem)

With objMail

    .To = "AAA"  'テスト
    .CC = ""
    .Subject = "テスト"
    .Body = "テスト1" & vbCrLf & _
            "テスト2"
    .Attachments.Add (Attach_FilePath)
    
'    .Display
    .Send

End With

Set rs = Nothing
Set cn = Nothing

Set ol = Nothing
Set objMail = Nothing

Set FSO = Nothing

MsgBox "メールを作成しました。"

End Sub


'--------------------------------------
'Ol_Classモジュール

Public WithEvents myOlApp As Outlook.Application

Public Sub Class_Initialize()
    Set myOlApp = CreateObject("Outlook.Application")
End Sub

Private Sub myOlApp_ItemSend(ByVal Item As Object, Cancel As Boolean)

'Msgファイルの保存
Item.SaveAs FSO.buildpath(Msg_FilePath, "テスト.msg"), olMSG

Set rs = Nothing
                                             
'指定のSQLからレコードを取得
rs.Open "T_送信履歴", cn, adOpenKeyset, adLockOptimistic

rs.AddNew
rs.Fields("送信者名").Value = Item.SenderName
rs.Fields("宛先").Value = Item.SenderEmailAddress
rs.Fields("送信時間").Value = Item.ReceivedTime

rs.Update

rs.Close

End Sub
[Go]REST APIのお勉強

# [Go RestAPI Docker](https://qiita.com/akidon0000/items/20720b877e5123e0e855)を読んでGoでREST APIの実行のお勉強

[goRestAPI](https://github.com/otamaninja/goRestAPI)

はじめて上記記事を読みながらGoでWeb APIを試してみました。
まずはローカルでhttpで試してみました。httpsでの方法も記載されているので今度試そうと思います。
これをベースにRESTの実装をしてみたいと思います。

@akidon0000さん、優良な記事ありがとうございます。
EC2で簡単にAnsibleの環境構築

# 1.はじめに
下記記事を参考にAnsibleの環境構築を行いましたので手順を記事にしました。

https://hitolog.blog/2021/10/12/how-to-install-ansible/

# 2.EC2作成
1.EC2を2台作成します。
後の手順で使用するためEC2(ansible_Clientserver)作成時にキーペアの指定をお願いします。
| インスタンス名 | SGの開放ポート(IPアドレス) |
|:-:|:-:|
| ansible_server | 22 |
| ansible_Clientserver | 22(ansible_serverのパブリックIPアドレス)<br>80(0.0.0.0/0) |

# 3.Ansible環境構築
1.Ansibleインストール
```
sudo amazon-linux-extras install ansible2 -y
```
2.Ansibleのバージョン確認、インストールされている事を確認します。
```
ansible --version
```
3.ansible_Clientserverの秘密鍵をansible_serverの/home/ec2-user/.ssh/配下に格納します。
```
vi /home/ec2-user/.ssh/ansible_Clientserver-key.pem
```
4.秘密鍵の権限変更
```
chmod 600 /home/ec2-user/.ssh/ansible_Clientserver-key.pem
```
5.Ansibleのコードを格納するためのディレクトリを作成します。
```
cd && mkdir ansible-test && cd ansible-test
```
6.`vi hosts`で下記記述を追加し、`{$ansible_Clientserver private ip address}`の箇所を変更します。
```
# hosts
[server]
{$ansible_Clientserver private ip address}

[server:vars]
ansible_ssh_port=22
ansible_ssh_user=ec2-user
ansible_ssh_private_key_file=~/.ssh/ansible_Clientserver-key.pem
__working_user=ec2-user
```
7.`vi site.yml`で下記記述を追加します。
```
# 対象の指定(インベントリファイルで指定した名前)
- hosts: server

  # 管理者権限で実行
  become: true

  # 以下に実際の操作を記述していく
  tasks:

    # パッケージの更新
    - name: updated yum
      yum:
        name: "*"
        state: latest

    # httpdのインストール
    - name: installed httpd
      yum:
        name: httpd
        state: installed
      become: yes

    # httpdの起動・自動起動設定
    - name: httpd booted and auto boot conf
      service:
        name: httpd
        state: started
        enabled: yes
      become: yes
```
8.構文チェック
```
ansible-playbook -i hosts site.yml --syntax-check
```
9.Ansible実行
```
ansible-playbook -i hosts site.yml
```
10.ansible_ClientserverのパブリックIPアドレスでApacheのTest Pageが表示されれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2088692/0c5df046-7bc9-ffd1-e1b5-b20ab43f8667.png)