OmniAICreator/Qiita-1.07M huggingface dataset:
AWS認定 デベロッパーアソシエイト合格記

# はじめに
2年ほど前にソリューションアーキテクト(SAA)の認定は取得していたのですが、
プロフェッショナル認定への足がかりとして、復習も兼ねて受験することを決めました。
お決まり？の体験談を記事として残します。

# 準備
SAAの時と同じく、基本的に書籍がメインでした。
私は主に以下の2冊（と以前に使ったSAAの参考書）を使って学習を進めました。
Udemyは[微妙説](https://qiita.com/sakai-y/items/c2d353e0340510d8d794#udemy)があるので、最初から選択肢には入れていませんでした。 

## 参考書籍
SAAの書籍は数多く出ていますが、DVAの書籍はあまり種類が豊富ではない印象があります。

### ポケットスタディ
https://www.amazon.co.jp/%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%82%B9%E3%82%BF%E3%83%87%E3%82%A3-AWS%E8%AA%8D%E5%AE%9A-%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E8%A9%A6%E9%A8%93%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%82%B9%E3%82%BF%E3%83%87%E3%82%A3-%E5%B1%B1%E4%B8%8B%E5%85%89%E6%B4%8B/dp/4798063401/

解説が画面イメージ付きで分かりやすく、携帯にも便利なのでとても参考になりました。

### 徹底攻略
https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5AWS%E8%AA%8D%E5%AE%9A%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BENTT%E3%83%87%E3%83%BC%E3%82%BF-%E5%B7%9D%E7%95%91/dp/4295013080/

解説は細かく丁寧なのですが、章末問題がやたら難しく、学習する人の心を容赦なく折ってきます。
索引のページ番号が全然合っていないというトラップ付きです。

## 進め方
本読み→問題回答→苦手箇所のフォローの繰り返しが基本でした。
試験直近の1か月間は、平日は30分、週末は2〜3時間程度を学習に充てていたと思います。

* 本の各章を読む＆章末の演習問題を解く
* 模擬試験を解く
* 理解の怪しい用語などをノートに手書きで整理
* 再び本を読む
* 模擬試験を解く

## 苦手だった箇所
`IAM`周りが特に理解に苦しんだ分野です。
あとは、あまり書く機会が無かった`CloudFormation`のテンプレートに出てくる関数など。

# 試験
## 申し込み
ピアソンVUEでテストセンター受験（電車で1時間以内の場所）を申し込みました。
自宅で受けるのは環境音や通信回線の問題、色んなものを片付けないといけない準備が億劫だったので、やめました。
アカウント情報は以前の試験で作成済みだったため、幾分か申し込みは楽でした。

## 試験本番
テストセンターに予約時刻の15分前に向かい、氏名と受ける試験種別を告げます。
続いて、係員の指示に従い、身分証明書（今回は運転免許証と社員証を提示）を見せ、顔写真を撮影します。
私物を全てロッカーに入れ、ポケットに何も無いことを確認してもらったら、テストルームに入室します。

試験は全65問、制限時間は130分です。
半分くらいの時間で一通りの問題を解き終え、あとは時間をかけて丁寧に見直しを行いました。
試験問題は、英語の原文が参照できるので、意味の分からない文章を理解する手助けになります（びっくりするような誤訳もありました）。

テストルームの環境面は、仕切りがあるので隣の人のことは気になりませんが、退室する人が椅子を机にぶつける衝撃が時々やって来るのが気になりました。

## 試験結果
前日の問題集の模擬試験では6割程度しか正解できておらず、正直あまり自信はなかったのですが、「おめでとうございます」の文字を見たときは安堵しました。
数日後に見られるようになっていたスコアレポートは、以下のような感じでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653162/22e71bd5-86de-e689-9d8e-eb8e88b16b6e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653162/5acbb2f8-4763-a9aa-eec7-e714e4eb8997.png)

# 所感
実務で触れることの少ないサービスに関する知識も問われ、結構幅広い知識が必要な試験であると思いました。
ただ、IAMなどセキュリティに関する部分はよく出てくるため、このあたりの分野はしっかりと押さえておいて損はないかと思います。

SAAの更新時期もじわりと近づいて来ていますし、完全に忘れてしまわないよう、今後も適度に学習は続けていきたい次第です。
Mavenの環境構築で詰まった話

# 本記事について
会社PCのリースアップに伴い、新規端末に開発環境構築した際の話です。
前回構築した後にいろいろ社内環境が変わっており、環境構築でエラーが多発。。。
詰まったところを記載します。みんなも気をつけなはれや！

## 社内環境で変わったところ
* **プロキシサーバ**
　オンプレミスから aws 化していたため、若干セキュリティが強化されている。
* **Nexus Repositoryサーバ**
　Maven のライブラリをローカルリポジトリにコピーするために一括保管されているオンラインリポジトリサービス。
　社内のNexus Repositoryがサーバ移行したことによりMavenライブラリが全くダウンロードできなかった。。。


## ローカル変更箇所
* Maven の ローカルリポジトリ 直下にある setting.xml に プロキシサーバ の IPアドレス が埋め込まれているため変更。
（Windowsのローカルリポジトリは```"C:\Users{ログインユーザー名}.m2\"```）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2614309/9c0fff0b-feca-e7dd-0534-53cd438f6d1f.png" width=70%>


* 各フォルダ階層の pom.xml に Nexus repository の URL が埋め込まれているため、パスを変更する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2614309/879b154e-54c8-a7d3-9cdf-dd2686dcfe19.png" width=60%>



これで Maven の プロジェクトの更新 はできるようになった。


この後、プロジェクト自体 の ビルド を実行したところエラーが発生。

調べるとプロジェクトの jarファイル を Nexusリポジトリー から ダウンロード しようとしていた。

コマンドプロンプトでMaven の インストールコマンド を使用し、直接 ワークスペース に入れる。
```dosbatch:コマンドプロンプト
>mvn install:install-file -Dfile=D:\{インストールしたいファイルが格納されているパス}\ojdbc6.jar -DgroupId=oracle -DartifactId=ojdbc6 -Dversion=11.2.0.4 -Dpackaging=jar -DgeneratePom=true
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2614309/52ef8747-a69d-b8e5-2ee4-a769ed2b8fb7.png" width=60%>

するとビルドが通った

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2614309/f47a2261-933f-858a-234d-2284a68e02f4.png" width=60%>
django rest framework とcsrf_exempt

まずこちら
https://qiita.com/romgaran/questions/3fbf576fd34e8baf468f

Django 3.0
djangorestframework 3.13.1

もしかしたらこの問題は多くの方に気に留められないかもしれませんが、
検索してもわかりやすい回答が見つからなかった上に、質問コミュニティに出しても即答してくれる方がいなかったので、書き残しておきます。


djangorestframeworkは、デフォルトの状態でcsrf_exemptです。他のバージョンはちょっと確認してないですが。


これを知らずにログイン不要の投稿システムを作ってしまうと、余裕でCSRF攻撃ができてしまいますね・・・。
赤の他人サイト利用者のIPを使って爆破予告・・・とかしちゃうやつです。


APIViewを用いて、postで投稿を行う時はpostメソッドの上に＠method_decorator(csrf_protect)を付けましょう。
何でも通してしまうので、もしかしたら気付かれないかもしれないですが、APIViewはデフォルトでCSRF免除のようです。


setting の　MIDDLEWAREに、django.middleware.csrf.CsrfViewMiddlewareが設定されていたとしても、CSRF免除です(←ココ重要)


気付かない人はそのままガバガバAPI作るだろうし、知ってる人は普通にmethod_decoratorつけるのかなぁ。
まぁ、自分みたいに半端な知識でやってる人もいるだろうし、いつか自分みたいな人がいたら、

django rest framework とcsrfで検索してここにたどり着くといいなぁ、と思います。
VPSにVPNを構築する

タイトルの通りなんですが、海外に居たりすると日本のIPで接続する必要が出てきたりします。:flag_jp:
業務上何度もこういった事でIPで弾かれたりとしてきたので、構築方法を記述しておきます。:helmet_with_cross:

Qiitaを使っている方なら多分当たり前過ぎることだと思うので、サーバーの構築とかそういったのは割愛します。

ではどうやるかと言うと

```bash:bash
 wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh
```

このコマンドを叩くだけです。何をやってるかわかりますよね？openvpn-install.shをダウンロードして、それをsudoで実行すればいいだけです。

実行すると次の質問をされます。順番に入力していきます。
* 何のプロトコルを使用しますか→1と入力（UDP）
* OpenVPNに使用したいポートはどれ？→1194と入力（ここは個人の設定次第ですが）
* VPNにはどのDNSを使用しますか→1と入力（これもお好みで）
* クライアントの認証に使用する名前を教えてください→VPNのログイン時に使用したい名前を入力（今回は便宜的にtestとしました）
* 最後になんでもいいのでキーを入力します。

終了すると、ここに保存したど〜と言われるので、そのファイルをVPNGateなどで開くだけで、VPN接続が完了します。

テレワークが基本となった今、自宅のIPを固定にできない人などは便利に使えるのではないでしょうか？
VyOSでNAPTとポートフォワーディングの設定

VyOSをNAPTルータにするために行った設定方法とポートフォワーディングの設定方法を備忘録としてまとめます。
# NAPTの設定
```
# set nat source rule 50000 outbound-interface eth0
# set nat source rule 50000 translation address masquerade
```

# ポートフォワーディングの設定
- destination portでは変換前のポートを指定する。
- inbound-interfaceでは変換するときに入ってくるインターフェースを指定する。
- protocolでは変換するデータの種類を指定する。
- translationでは変換先アドレスとポートを指定する。
```
# set nat destination rule 60000 destination port 11111
# set nat destination rule 60000 inbound-interface eth0
# set nat destination rule 60000 protocol tcp
# set nat destination rule 60000 translation address 192.168.1.1
# set nat destination rule 60000 translation port 22
```
# 設定したコンフィグ
```
 nat {
     destination {
         rule 60000 {
             destination {
                 port 11111
             }
             inbound-interface eth0
             protocol tcp
             translation {
                 address 192.168.1.1
                 port 22
             }
         }
     }
     source {
         rule 50000 {
             outbound-interface eth0
             translation {
                 address masquerade
             }
         }
     }
 }
Topページを絞り込みたい！

# 【Rails】Topページを絞り込むページ作成！
## はじめに
本記事ではTOPページで検索したものを他ページで表示するコードを記載しています

## 前提
 
 - 記事のテーブルはtweets
 - tweetsで検索する文字列はbody
 - indexページ(index.html.erb)に検索フォーム、searchページ(search.html.erb)検索結果を表示
# 手順
## search.html.erb作成
↑の名前のファイルを自分のテーブル名のViewファイルの中に作成しましょう！
その中に一度自分のindexページ（index.html.erb）をコピペして入れておきましょう！
何かindexページと違う文字など入れておくとわかりやすいです🔥

## ルーティング設定
```ruby:config/routes.rb
get 'search' => 'tweets#search'
```
## 検索フォーム作成
```erb:index.html.erb
<div class="search-form">
  <%= form_with url: search_path, method: :get, local: true do |f| %>
    <%= f.text_field :keyword, value: @keyword %>
    <%= f.submit "検索" %>
  <% end %>
</div>
```
↑Viewを作成。
## 検索機能の追加

```ruby:tweet.rb
def self.search(keyword)
  where(["body like?","%#{keyword}%"])
end
```
↑こちらではkeywordで受け取った中身をbodyの中から探してきています。
```rb:tweets_controller.rb
def search
  @tweets = Tweet.search(params[:keyword])
  @keyword = params[:keyword]
  render "search"
end
```
↑ここで@tweetsの中身にキーワードで選んだ投稿のみを入れることができます！

## 参考文献
Railsで検索機能を実装する方法
https://qiita.com/Yusuke_Hoirta/items/159e63bcc5e99958d698

## 終わりに
この機能をつけることでrailsでTOPページを違う形で表示することができます！
楽しみながらプログラミングしていきましょう🔥
【Python】多次元リストの作成方法

## 背景
- pythonで多次元リストを作成したい時がある。
- 作成した多次元リストをdfに変換したい時がある。
- 今回はリストに一意の項目を追加する多次元リストの作成方法と多次元リストからdfに変換する方法を紹介する。

## 目標
- pythonでの多次元リストの作成方法を覚える。
- pythonの多次元リストからdfに変換する方法を覚える。

## この記事でやること
- 東京都の市町村リストに対して、東京都という項目を追加した多次元リストを作成する。
- 多次元リストをdfに変換する。
```python:市町村リスト
tokyo_cities = ['千代田区','世田谷区','〜略〜','町田市']
```
```python:作成する多次元リスト
print(multi_list)
[['東京都', '千代田区'], ['東京都', '世田谷区'], ['東京都', '〜略〜'], ['東京都', '町田市']]
```
```python:多次元リストから変換したdf
print(df)
  都道府県  市町村名
0  東京都  千代田区
1  東京都  世田谷区
2  東京都   〜略〜
3  東京都   町田市
```

## 多次元リストの作成方法
```python:多次元リストの作成
#多次元リストの用意
multi_list = []

#市町村リストの用意
tokyo_cities = ['千代田区','世田谷区','','町田市']

#enumerateを使用して、「東京都」という値を入れたいリストで回す。
for i, item in enumerate(tokyo_cities):
    #多次元リストを作りたいので、リストの中にリストを追加
    multi_list.append([])
    #リストの中にあるリストの最初に「東京都」という要素を追加
    multi_list[i].append('東京都')
    #次の要素には、市町村名を入れたいので、tokyo_cities要素を追加
    #ここで、enumerateを使用しておくとリストの該当要素番号が使用できるので楽
    multi_list[i].append(tokyo_cities[i])

print(multi_list)
[['東京都', '千代田区'], ['東京都', '世田谷区'], ['東京都', '・・・'], ['東京都', '町田市']]
```

## 多次元リストをdfに変換する方法
```python:多次元リストをdfに変換
#DataFrameを使用したいのでpandasをimport
import pandas as pd

#dfへの変換は以下の通り。多次元リストと対応するカラム名を指定する。
df = pd.DataFrame(multi_list,columns =['都道府県','市町村名'])

print(df)
  都道府県  市町村名
0  東京都  千代田区
1  東京都  世田谷区
2  東京都   〜略〜
3  東京都   町田市
```

## 補足
- もっと良い方法もあると思う。
- そのうちnumpy arrayでのやり方の記事も書こう。

## 参考資料

https://www.delftstack.com/ja/howto/python/list-of-lists-in-python/

## 個人ブログ

https://takuma-tech.com/2022/09/27/227/
Terraform Cloud 環境で 0.13 より古いものから Upgrade して発生した Invalid legacy provider address の対応

# 概要
- GitHub.com と Terraform Cloud 利用環境（state を Terraform Cloud で管理している）
- Terraform Cloud の Workspace の terraform version を 0.13 より古いものから最新版(1.2.1)に Upgrade したところ、terraform plan で Invalid legacy provider address が発生するようになってしまった。
  - provider も最新化している。

# エラー詳細

```
│ Error: Invalid legacy provider address
│ 
│ This configuration or its associated state refers to the unqualified
│ provider "google".
│ 
│ You must complete the Terraform 0.13 upgrade process before upgrading to
│ later versions.
```

# 原因

- Terraform アップグレードに伴う、 google providor の更新が必要

# 対応

- Cloud でも local でも terraform plan すると、同じ Invalid legacy provider address  になってしまう。
- とりあえずLocalで `terraform login` して、`terraform init` し、Invalid legacy provider address が表示されても、 .terraform 配下に backend 情報が生成される。
- state を replace する（具体的には以下）
  - `terraform state replace-provider registry.terraform.io/-/google registry.terraform.io/hashicorp/google`
- そうすると、 `terraform init` と `terraform plan` が通るようになった。
  - `.terraform.lock.hcl` が生成されるように変わるので、忘れずコミットする。


# 参考にしたもの

- https://chroju.dev/blog/terraform_state_introduction
- https://stackoverflow.com/questions/65396812/invalid-legacy-provider-address-error-on-terraform
EC2とRDSでバックエンド環境を構築してみた

[こちらの記事](https://qiita.com/t-tysm/items/2fe4d878d8cfeecd9107)の続きです。

今回はバックエンド環境のセキュリティグループの設定および、
EC2、RDSそれぞれの実行環境を構築します。

## 構成（フロントエンド含む）
### EC2
Webアプリのバックエンドを実行します。
今回はJavaのjarファイルを常時実行し、フロント側から実行されたAPIを処理します。
RDSに構築されたデータベースとデータをやりとりします。
今回はSpringBootで実装しています。
なお、HTTPS接続したいために、SSLを有効にしています。
その際、今回はテスト環境のため自己署名証明書を使っています。

### RDS
Webアプリのデータベースを担います。
今回はPostgreSQLです。

### S3
Webアプリのフロントエンドを配置します。
静的ウェブサイトとして設定し、エンドポイントにアクセスすることでフロント側の画面を表示します。
今回はVue.jsを用いて画面を作成します。

## セキュリティグループの設定
### EC2
AWSコンソール画面より、EC2 > インスタンス と進み、インスタンスを選択し、
セキュリティタブよりセキュリティグループを選択します。
セキュリティグループの設定画面に移行するので、インバウンドを設定します。
今回はHTTPS接続で8443ポートを使うので、8443ポートをインバウンドルールに追加しました。

### RDS
AWSコンソール画面より、RDS > データベース と進み、接続とセキュリティタブよりVPCセキュリティグループを選択します。
セキュリティグループの設定画面に移行するので、インバウンドを設定します。
タイプはPostgreSQLを選択しました。自動でTCP、ポート5432が選択されます。
EC2からのみ接続可能とするため、ソースにはEC2のプライベートIPアドレスを設定しました。

## 実行環境構築
### EC2
※ jarファイルは作成済みであることが前提です
※ データベースの接続先をRDSのエンドポイント向けにしておきます

Javaを実行するために、EC2にJavaをインストールします。
インストール可能なJava一覧を表示します。
```bash
yum search java
```

Javaをインストールします。（少々古いですが、下記はJava8です）
```bash
sudo yum install -y java-1.8.0-openjdk.x86_64
```

以下でインストールを確認します。
```bash
java -version
```

SCPコマンドにてjarをアップロードします。（ローカル環境にて実行）
SSLの場合は証明書も配置します。
```bash
scp -i [pemファイル] [対象のjarファイル] ec2-user@[EC2のIP]:~
```

アップロードしたjarファイルを実行します。
SSH接続が切れても実行したいため、バックグラウンドで実行します。
```bash
nohup java -jar [jarファイル] &
```

バックグラウンドで実行されているモジュールの確認は以下で行います。
```bash
ps x
```

停止する場合は、以下でkillします。
```bash
kill [PID番号]
```

### RDS
RDS上にデータベースを構築します。
EC2からRDSのpostgreSQLに接続するために、EC2にpsqlをインストールします。
EC2上で以下コマンドを実行し、インストール可能なモジュール一覧を表示します。
```bash
yum list | grep postgre
```

psqlをインストールします。
```bash
sudo yum install postgresql.x86_64
```

インストール確認をします。
```bash
psql --version
```

postgreSQLに接続します。
```bash
psql --host=[RDSエンドポイント] --port=5432（postgreSQLのポート） --username=[ユーザ名] --password --dbname=[データベース名]
```

接続されたら、SQLを実行し任意のデータベースを構築します。
```sql
db=> create table ... などなど
```

上記でバックエンド環境が構築できました。
EC2のインバウンドで許可されたIPから、EC2のエンドポイントに向けAPIを実行することができます。
【Swift】Object file (XXXXXXXXXXXX) was built for newer iOS Simulator version (14.5) than being linked (14.1)を修正する

意味のわからない警告文が出てきた

ビルドに支障はないが気になるので消したい
```
Object file (/Users/XXXXXXXXX/Library/Developer/Xcode/DerivedData/XXXXXXXXXX/Build/Products/Debug-iphonesimulator/XCFrameworkIntermediates/XXXXXXX/XXXXXXXXX.framework/XXXXXXXXX(XXXXXXXXXXXX)) was built for newer iOS Simulator version (14.5) than being linked (14.1)
```

# 解決策
`Build Settings`で`Other Linker Flags`と検索します。
![スクリーンショット 2022-06-01 22.54.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6b618c70-abe1-127c-53b5-5d6a7a489ca9.png)

ダブルクリックでリストを表示したら「+」を押して`-w`を追加します。
![スクリーンショット 2022-06-01 23.00.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4501e808-0ce6-3e4b-ac6b-1b38a7e81ac6.png)

警告が消えました
めでたし
自分流仕事日記の書き方

# はじめに
<!-- 発端や概要を記載 -->
タスク管理の手法として、また自身の業務の振り返りに役立つものとして今年の2月から「仕事日記」というものを書き始めました。
書き始めて４ヶ月経ちましたが、タスク管理としても、振り返りを行う際やモチベーションの維持にもかなり役立っていると感じたので、
自分流の書き方をメモとして残しておきます。

使用しているツールは[Evernote](https://evernote.com/intl/jp)です。
表やチェックボックスなど色々なツールがあって使いやすく、日記以外にも仕事上のメモツールとしても役立つのでおすすめです！

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [タイトルとタスク管理部分](#Chapter1)
1. [日記欄](#Chapter2)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# タイトルとタスク管理部分

![スクリーンショット 2022-06-01 22.34.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620072/b2950e85-cd33-7254-72d3-e3179b11045c.png)

## ○月の目標
月初めに(この写真の場合は5月1日)今月の目標を書いておく
（私の場合は月末にKPTがあるのでそこで出たtryをそのままコピーしておいています。）
先頭に置いてあるとなんとな〜く目に付くので以前よりも意識して仕事に取り組めている気がします。

## TODO
自分に割り振られたタスクをチェックボックス形式で書いています。
先頭に取り組み始めた日付を書くことで時間をかけすぎていないかも意識するようにしています。
また、チェックボックス形式にすることで終わった！！という気持ちが出ます・・。
PR出したけどレビューまで時間かかりそう・・という時はPRまで完了と書いて終わりにして、レビュー対応は別タスクとして考えることもあります。


## TODO予定
タスクは割り振られたけどすぐにはやらないもの(時間あったらやっておいてほしい！というものや、〇〇が終わったらしてほしいなど)
は別にTODO予定として場所をとっています。
最初はこの欄はなかったのですが、追加してから対応忘れなどがなくなりました。

## MTG予定
忘れがちなMTGの予定もチェックボックス形式で忘れないように書いています。


<a id="#Chapter2"></a>
# 日記欄
![スクリーンショット 2022-06-01 22.55.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620072/b0567823-bd02-0437-e438-7483c548128d.png)

## 日付と今日のMTG予定
見やすいように日付と今日のMTG予定を入れています

## 日記
特に誰に見せる予定もなく"自分用"の日記なので話し言葉で自分の気持ちとか思ったことなどをつらつらと書いています。
プロジェクトごとに書き分けた方が見やすいと思ったので、プロジェクトごとに枠を作って書いています。
その他の部分はプロジェクトとは関係のない部分で思ったことや、起こったことを書いています。

# 自分が書きやすいやり方で！タイミングで！
<!-- 発端や概要を記載 -->
自分の仕事日記の書き方として紹介させていただきましたが、それぞれの仕事の内容や、仕事の取り組み方は様々だと思うので、是非自分に合った書き方を見つけてみてください。

また、習慣化する上でいつ書くか？というのは大事になってくると思います。
ちなみに私の場合は朝出勤してすぐに前日の分を書くように基本しています。前は退勤前、退勤後にしていたのですが、なかなか習慣化しなかったため・・。

少しでもタスク管理の手法として参考になれれば嬉しいです。
閲覧していただきありがとうございました！！
おうちkubernetes構築記①　dockerのインストール

### おうちkubernetesの構築した記録を備忘録　兼　手順書として残しておきます。※この内容は、master／worker双方に同じように設定する必要があります。

## 環境
 #### S/W
  -  OS　　　　　： Ubuntu22.04
  -  docker　　　　: 20.10.12
  -  kubernetes　　: 1.24.1
  -  terterm　　　 ：4.106

#### H/W
  - 本体　　　　　：rasberry Pi4 8GB × 2
  - ルータ　　　　：LINKSYS 5PORT
  - SDカード　　　：64GB




## 1. dockerのインストール
- dockerをubuntuにインストールする。

1. 以下のコマンドを実行する。
```
$ sudo apt-get install -y docker.io
```

2. インストールが始まるので、しばらく待つ。
```
パッケージを事前設定しています ...
以前に未選択のパッケージ pigz を選択しています。
(データベースを読み込んでいます ... 現在 157946 個のファイルとディレクトリがインストールされています。)
.../0-pigz_2.6-1_arm64.deb を展開する準備をしています ...
```

3. インストールが完了すると、以下のコマンドを実行し、状態を確認する。
```
$ sudo systemctl status docker
```


4. 以下の様に、緑文字で、「active (running)」と表示されていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/09d77290-5d8f-c7d6-813e-5f6057fa93af.png)

以上

### 2. dockerの設定
- dockerコマンドをsudoを利用しなくても実行可能にする。
1. 以下のコマンドを実行する。
```
$ sudo usermod -aG docker ${USER}
```
2. 上記コマンドが何も表示されず終了したら、以下のコマンドを実行する。
```
$ su - ${USER}
```

### 3.動作確認
- インストールしたdockerが正常に動作することを確認。
1. 以下のコマンドを実行する。
```
$ docker run hello-world
```

2.　しばらく待つと、以下の内容が表示されることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/474c727e-e97c-9b87-61c3-a325ab6d0955.png)

3. 以下のコマンドを実行し、ダウンロードしたimageが一覧に表示されていることを確認する。
```
$ docker images
```

4. 以下の内容が表示されることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/68ec7f5a-1b59-8707-fa76-4e7b4cede9d8.png)

以上

次回は、kubernetesのインストール手順になります。
Galaxyのデバイスでspotifyがつかえなくなる問題

Galaxyのスマホ又はタブレットを使おうと考えている方へ。

Galaxyのスマホ又はタブレットではspotifyが正しく動作しません。

Issueについては英語ですが、ここなどを参照してください。
https://community.spotify.com/t5/Ongoing-Issues/Now-Playing-bar-missing-on-Android/idi-p/5364978

タブレット購入の際などの参考になれば幸いです。

ちなみに、このバグはアプリを強制終了してもういちどアイコンをタップして起動する事で一時的に解消されます。
OSS-DB Silver合格体験記

先週、OSS-DB Silverを受験してきました。

結果は、84点で合格していました。

受験する前からまあ受かるだろうなとは思っていたのですが、実際に受かってほっとしています。

てなわけで合格体験記というほど偉そうなものではないのですが、合格までにしたことを書こうと思います。

# 合格までにやったこと



・Ping-tのOSS-DB Silverの問題集をやる

以上です。

ほんとにこれだけで合格できると思います。まったく同じ問題が出ることはないですが、似たような問題が出るので、Ping-tの問題集を通して知識をつけておけばまず問題ないと思います。

ping-tの問題は400問くらいあると思うのですが、それを一通りやってみるっていうのを繰り返して、ほとんど間違えなくなったら合格可能だと思います。

知ってないと解けないっていうのもいっぱいあります。
(current_timestampには()いらないとかね...、now()には()必要です)

参考書もあるようですが、合格するといった点のみを見ればなくても大丈夫なんじゃないかと思います。(知識つけるのにはもちろんあった方がいいです)

実機にPostgreSQLをインストールして、動かしてみるっていうのも非常に勉強になるとは思いますが、なくても合格は十分可能です。

ただ、自分はコマンドプロンプトで実行とpsqlで実行の違いがよくわからなかったので、実機に入れて動かしてみると少しだけ違いが分かりました。
あと動かしてみた方がやはり面白いです。ほんとにこういう動作だったんだとか、この関数だと確かにエラーになるっていうのが肌で分かりますので。

# あとがき
この受験を通して少しだけPostgreに詳しくなれた気がします。後は実務に活かして、取るだけで終わらないようにしていきたいですね。

たいしたことは書いていないですが、もし誰かの助けになれば幸いです。

これから受験される方の合格を心よりお祈りしています。

あまり時間がない方は本当にPing-tの繰り返しで十分合格が狙えます。
後は問題をしっかり読んで、選択肢を何個選ばなければいけないのかに注意しましょう。
私の時は、3個選んでと指示された問題がありました。(Ping-tでは3個指定する奴なかったような...)

受験される方、頑張ってください！
C++で<bits/stdc++.h>をincludeできるように

# はじめに

Windows環境のCLionを用いたときにどうやって`#include <bits/stdc++.h>`すればいいのかな、Macの記事しかないな、という感じで書いた記事です。
ちなみに競技プログラミング(AtCoder)用です。

- CMake
- Visual Studio 2022

# 試した方法

## stdc++.hファイルの設置

ディレクトリ`C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.30.30705/include/` に `bits/`フォルダを作成して、以下のファイルを追加しました。

`stdc++.h`

```stdc++.h
#include <iostream> // cout, endl, cin
#include <string> // string, to_string, stoi
#include <vector> // vector
#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound
#include <utility> // pair, make_pair
#include <tuple> // tuple, make_tuple
#include <cstdint> // int64_t, int*_t
#include <cstdio> // printf
#include <map> // map
#include <queue> // queue, priority_queue
#include <set> // set
#include <stack> // stack
#include <deque> // deque
#include <unordered_map> // unordered_map
#include <unordered_set> // unordered_set
#include <bitset> // bitset
#include <cctype> // isupper, islower, isdigit, toupper, tolower
#include <cmath>
#include <numeric>
#include <iomanip>
```

※一部[AtCoder記事](https://atcoder.jp/contests/apg4b/tasks/APG4b_af?lang=ja) を引用しています。

## CMakeListsの編集
```CMakeLists.txt
include_directories("C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.30.30705/include/bits")
```
を追加しました。

## C++ファイルの編集

これで、無事

```cpp
#include <bits/stdc++.h>
```

ができました！


本当になんとなくローカルでできただけの話なので、参考程度にでもしていただけると幸いです。
【TypeScript】 デフォルト型引数について　(Required type parameters may not follow optional type parameters. とは)

## はじめに

タイトルの通り、TypeScript のデフォルト型引数の使用方法と、自分が遭遇した`Required type parameters may not follow optional type parameters.`というエラーについてまとめる。

## 結論

引数が複数ある場合、デフォルト型引数を設定する引数は最後にしないと、

「Required type parameters may not follow optional type parameters」
（必須の型パラメータはデフォルト型引数の前に配置してください）

というエラーがでる。

### 詳細

デフォルト型引数は

```tsx
const func = <T, U, V = number>(value1: T, value2: U, value3: V): [T, U, V] => {
  return [value1, value2, value3];
}
```

と、引数に`V = number` のように型を与えることで、

```tsx
// ３つ目の引数の型を指定していない
const result = func<string, number>("foo", 42, 30);

// が自動的にnumberを当てはめてくれる
console.log(result);
=> ["foo", 42, 30]
```

関数の呼び出し時に型を指定しなくても自動的にデフォルトで設定した型を適用してくれるもの。

ただし、例えば

```tsx
const func = <T, U = number, V>(value1: T, value2: U, value3: V): [T, U, V] => {
  return [value1, value2, value3];
}
```

と引数の２つ目にデフォルト引数を設定したりすると

Required type parameters may not follow optional type parameters」

（必須の型パラメータはデフォルト型引数の前に配置してください）

のエラーがでる。

## おわりに

普段Reactを書く際などに使っているTypeScript以外についても理解が深まってきた。まだデフォルト引数を使用する必要のある場面には出会っていないが、今回学習したことで対応できる幅が広がったように思います。
JSの特殊な記述方法　書き殴り

## if文

```javascript
let number = 10
let result = "";

if(number < 10) result = "10未満";
else if (number < 100) result = "100未満";

//一般的な記述
if(number < 10){
 result = "10未満"
}else if (number < 100){
 result = "100未満"
}
```

## 分割代入

```js
const user = {
 id:1,
 name:"dossy"
}

let {id,name} = user

console.log(id)
//=>1

```
## 参考
https://www.youtube.com/watch?v=s3H6PmB4SZ4&t=153s&ab_channel=JamesQQuick
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

こんな書き方Fantastic!!!
無いときはINSERT・在る時はUPDATEするSQL

# 世間ではUPSERTというらしい
そもそもUPSERTを知らなかった。
長いことOracleのSQL書いてたけど、いつのまにそんな便利なものができていたのか。
あ、でも、MERGEなら使ったことあるかも。UPSERTはMERGEのエイリアスらしい。
OracleとMySQLで記法が違うみたいなので、差がわかるように書いておく。

# ChatGPT による説明
## Oracle の Merge と MySQL の ON DUPLICATE KEY UPDATE とは
OracleのMergeとMySQLのON DUPLICATE KEY UPDATEは、両方ともUPSERT（UPDATEまたはINSERT）と呼ばれる操作を実行するためのSQL文法であり、データベースのテーブルにレコードを挿入する際に、既存のレコードを更新するか新しいレコードを挿入するかを判断することができます。

## 共通点と相違点
### 共通点
1. 両方の操作は、テーブル内の重複する行を特定するために、一意制約（unique constraint）やプライマリキー（primary key）の使用が必要です。

1. 両方の操作は、データベースのパフォーマンスを向上させることができます。従来のUPDATEとINSERT文よりも効率的に、一意な識別子を使用してデータを更新することができます。

### 相違点
1. OracleのMergeは、マッチングするレコードを更新するために、更新条件を指定することができます。MySQLのON DUPLICATE KEY UPDATEでは、重複するキーが見つかった場合に更新される列と値を指定することができます。

1. OracleのMergeは、複数のテーブルからデータをマージすることもできます。MySQLのON DUPLICATE KEY UPDATEは、INSERTするテーブル内の既存のレコードを更新する場合に使用されます。
OracleのMergeは、テーブル内の更新が必要なレコードのみを更新します。MySQLのON DUPLICATE KEY UPDATEは、重複するキーが存在する場合はすべての行が更新されます。


# OracleでのUPSERT(MERGE)
例えばこんな感じ。
キーが一致する時はMATCHED句（UPDATE）、そうでもないときはNOT MATCHED句(INSERT)が動く。

```SQL
MERGE INTO table1
USING table2 
ON (table1.id = table2.tab1_id)
WHEN MATCHED THEN
	UPDATE SET 
        col1 = table2.col1,
        col2 = table2.col2
WHEN NOT MATCHED THEN
	INSERT (col1, col2)
	VALUES (table2.col1, table2.col2) ;
```

参考：
https://www.shift-the-oracle.com/sql/merge.html


# MySQLでのUPSERT(ON DUPLICATE KEY UPDATE)
キーが一致するかどうかで振る舞いが決まるのは、Oracleと同じ。
一致する時はINSERTとして動く、そうでもないときはON DUPLICATE KEY UPDATE句が動く。

```SQL
INSERT INTO table1(col1, col2) 
    SELECT col1, col2 FROM table2
    ON DUPLICATE KEY UPDATE 
      col1=table2.col1,
      col2=table2.col2;
```

参考：
https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html

---
プログラムで条件分岐しなくていいって、楽ねー。
高速カウントユニットQD62/RD62P2ピン配列

三菱電機製　高速カウントユニットQD62やRD62P2への接続は
三菱システムサービス製　端子台:FA-TBS32XY、ケーブルFA-CBL__FMVを使うのが良い。
メーカーが分かれているので、端子→ピン対応表(三菱電機)　ピン→信号名称対応表(MEE)　それぞれ参照すると面倒。1枚の表にした。
FCN40P-Y端子バラ線ケーブルFA-BCBL10FFBLを使ってもいいが、コネクタで端子台につないだほうが安い。

|  端子  |  ピン  | 信号名称 |
| ---- | ---- | ---- |
|  00  |  B20  |  CH1 A相 12V  |
|  01  |  B19  |  CH1 エンコーダーCOM  |
|  02  |  B18  |  CH1 B相 12V  |
|  03  |  B17  |  CH1 プリセット 24V  |
|  04  |  B16  |  CH1 プリセット 5V  |
|  05  |  B15  |  CH1 カウントスタート 24V  |
|  06  |  B14  |  CH1 カウントスタート 5V  |
|  07  |  B13  |  CH2 A相 12V  |
|  08  |  B12  |  CH2 エンコーダーCOM  |
|  09  |  B11  |  CH2 B相 12V  |
|  0A  |  B10  |  CH2 プリセット 24V  |
|  0B  |  B09  |  CH2 プリセット 5V  |
|  0C  |  B08  |  CH2 カウントスタート 24V  |
|  0D  |  B07  |  CH2 カウントスタート 5V  |
|  0E  |  B06  |  CH1 EQU1  |
|  0F  |  B05  |  CH2 EQU1  |
|  10  |  A20  |  CH1 A相 24V  |
|  11  |  A19  |  CH1 A相 5V  |
|  12  |  A18  |  CH1 B相 24V  |
|  13  |  A17  |  CH1 B相 5V  |
|  14  |  A16  |  CH1 プリセット 12V  |
|  15  |  A15  |  CH1 制御COM(プリセット、カウントスタート)  |
|  16  |  A14  |  CH1 カウントスタート 12V  |
|  17  |  A13  |  CH2 A相 24V   |
|  18  |  A12  |  CH2 A相 5V   |
|  19  |  A11  |  CH2 B相 24V   |
|  1A  |  A10  |  CH2 B相 5V  |
|  1B  |  A09  |  CH2 プリセット 12V  |
|  1C  |  A08  |  CH2 制御COM(プリセット、カウントスタート)  |
|  1D  |  A07  |  CH2 カウントスタート 12V  |
|  1E  |  A06  |  CH1 EQU1  |
|  1F  |  A05  |  CH2 EQU2  |
|  24V  |  B1,2  |  24V入力  |
|  0V  |  A1,2  |  0V入力  |

- バッファメモリのコメントを一括読み出し
グローバルデバイスコメントを開いた状態で編集→サンプルコメントの流用→インテリジェント機能ユニット

U00¥G0 プリセット設定値下位
U00¥G2 現在値下位
X00　READY
Y01/09　プリセット指示
Y04/0C　カウントイネーブル
あたりは覚えてたら便利。

Fx5の高速カウンタユニットは24Vのみ対応。
FX5-16ET/ES-H
GitHubでQiitaの:::noteみたいな強調をする

:::note info
2023年11月21日 追記: 
初回投稿時（2022年6月）の内容を，2023年11月現在の内容に更新しました
:::

# はじめに
Qiitaの`:::note`みたいな強調表示とは，上のような表示（コールアウト）のこと
Qiitaでは `:::note info`や `:::note warn` などと入力すると強調して表示ができる

# GitHubでの対応状況
2023年11月現在，5種類の表示が利用できる
[[Markdown] An option to highlight a "Note" and "Warning" using blockquote (Beta)](https://github.com/github/feedback/discussions/16925)

というわけで試してみた．

# 使い方
IssueなどのMarkdownに，以下のような記法で書き込む

```markdown
> [!NOTE]
> こんな感じに書き込むと強調表示される

> [!TIP]
> `TIP` の例

> [!IMPORTANT]
> `IMPORTANT` の例

> [!WARNING]
> `WARNING` の例

> [!CAUTION]
> `CAUTION` の例
```

プレビューに切り替えると，下のような表示になる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382909/7fc5a824-dc92-bf7c-51df-372deadaedff.png)

ダークモードでも問題なく表示された．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382909/db37312f-3ad9-c90f-e186-986fdd4b80b1.png)

見ての通り，従来の Markdown 記法の引用をベースに使える便利機能になっている
[Obsidian](https://help.obsidian.md/Editing+and+formatting/Callouts) の Callouts 機能に似ている気がする

# おわりに
頻繁にアップデートが行われているため，今後も変更があるかも
（実際に，この記事の初回投稿時に紹介していた記法が今では機能しなくなったりしている）

とはいえ，消えても通常のMarkdown構文として機能するので大きな問題はないと思う
【Rust】 日本時間の今日日付・0時0分0秒を取得する

## 概要
[Rustで日時を扱う](https://qiita.com/fujitayy/items/ae6175118cbed7134594)の記事にある通り、Rustでは日時を扱うのに、`chrono`クレートを使用することが多いと思います。
今回はこのchronoクレートを使用して、日本時間の今日日付・0時0分0秒を取得してみたいと思います。

## 実装方針
1. 概要欄で紹介した記事の、[TimeZone有りの型から無しの型への変換、またはその逆](https://qiita.com/fujitayy/items/ae6175118cbed7134594#timezone%E6%9C%89%E3%82%8A%E3%81%AE%E5%9E%8B%E3%81%8B%E3%82%89%E7%84%A1%E3%81%97%E3%81%AE%E5%9E%8B%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B%E3%81%BE%E3%81%9F%E3%81%AF%E3%81%9D%E3%81%AE%E9%80%86)の項にある通り、まずは`Utc::now()`でUTCの現在日時を取得します。後続の処理用に`naive_utc`に変換しておきます。
2. 上記の1で取得した`naive_utc`を[chrono-tz](https://github.com/chronotope/chrono-tz)のクレートを使用して、日本時間に変換します。[How do I go from a NaiveDate to a specific TimeZone with Chrono?](https://stackoverflow.com/a/50353821)のstackoverflowの回答が参考になります。
3. 最後に取得した日本時間の日時に、0時0分0秒を設定します。[Rustの日付時刻処理(std::time, time, chrono)](https://qnighy.hatenablog.com/entry/2019/04/21/190000)の「例: タイムゾーン指定で時刻を組み立てる (一意に決まる場合)」にある通り、and_hmsで全て0に設定すればいけそうです。

## 実装サンプル
```rust
use chrono::{DateTime, Datelike, TimeZone, Utc};
use chrono_tz::{Asia::Tokyo, Tz};

// 日本時間当日を0時0分0秒で返す
pub fn get_now_jst_date() -> DateTime<Tz> {
    let utc = Utc::now().naive_utc();
    let jst = Tokyo.from_utc_datetime(&utc);
    return Tokyo
        .ymd(jst.year(), jst.month(), jst.day())
        .and_hms(0, 0, 0);
}
```
【CodeIgniter4】form_dropdownの使い方

# はじめに
CodeIgniterに関して情報が少ないので、ドロップダウンの作成方法について投稿してみました。
良ければ参考にしてください。

言語：PHP
フレームワーク：CodeIgniter4
# 使い方
codeIgniterのフォームヘルパー`form_dropdown`を使ってドロップダウンを作成します。
フォームヘルパーを使用する際は、ヘルパーを呼び出すために`helper('form')`を記述する必要があるので忘れずに！
```
form_dropdown($name, $options, $select)
```
$name：name属性(データ送信時、controller側で受け取るnameとなる)

$options:リスト表示させたい配列をここに設定する。

$select：画面レンダリング等の初期表示させたいリスト項目を設定する。
　　　　　連想配列のkey値を渡してあげることで初期表示を実現させる。　　　
　　　　　また、この引数をうまく使ってバリデーションエラー時に選択したリストのkey
　　　　　を渡すことで再度選択したリストを表示させることが出来る。


# 使用例
コントローラにてリストと初期表示させるリストデータを作成し、viewメソッドを使ってドロップダウンを表示させます。
```IndexContoroller.php
public function index()
{
    // ヘルパー呼び出し
	helper('form');

	// 表示リスト
	$dropList = [
	  'dropList01' => 'dropList01',
	  'dropList02' => 'dropList02',
      'dropList03' => 'dropList03',
	];

  // 初期表示リスト選択
  $selectList = "dropList02";

  $dropDownData = [
    'dropList' => $dropList,
    'selectList' => $selectList,
  ];
  
	echo view('index', $dropDownData);
}
```

```index.php
<?=
  from_dropdown(
    'dropName',               // nameの指定
	$dropList,                // 表示させるリストをセットする
	$dropList['dropList02']   // リスト表示のキーを指定して初期表示させる
  )
?>
```

# 結果
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521366/46a428f3-10f6-c3de-8e0d-34887ee49930.png"
 width="500px">
三菱PLCシンプルCPU通信設定

iQ-RとiQ-Fについてるプロトコル。
マニュアルのかなり下の方に載ってるがすごい便利。キーエンスの簡易PLCリンクかこれの2択だと思う。
[MELSEC iQ-R Ethernet/CC-Link IEユーザーズマニュアル(応用編)](https://dl.mitsubishielectric.co.jp/dl/fa/members/document/manual/plc/sh081253/sh081253y.pdf)
1.14章

通信状態は　Un￥G721936 = 3　が正常。
先頭XYが200の時、GOTでの表記は「U20-G721936」
設定No.1 : Un￥G721936 ~ 設定No.64: Un￥G721999
0H: 未設定
1H: 準備中
2H: 要求待ち
3H: 実行中
4H: 停止中
5H: リトライ中
6H: 異常時監視中
AH: 交信不可

通信エラーコード : Un￥G722000 ~ Un￥G722063　16進数。
実行間隔(現在値) : Un￥G722128 ~ Un￥G722191

![シンプルCPU通信.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141264/dd72ec18-2739-9a2d-a966-436451943a62.png)

内蔵の場合
通信状態:U3En￥G1130~1193
エラーコード:U3En￥G1194~1257

- CClink-IEFieldやControlのようなms単位の同期速度は出ない。100msが標準になっている。
- (ビット8192点，ワード512点) × 64までやりとりでき、点数が多い。
- SLMP(ソケット通信)ベースで動くのでPCやバーコードリーダー等と同居できる。ただし同時に実行するトラフィックが多いと同期速度に影響を及ぼすことがあるらしい。タッチパネル3台程度では今のとこ影響なし。
- QやFx3、大半のメーカーのPLCとも通信できるがポート開放必要。
- Modbus/TCPの機器から読み出しはかなり使い易い。ポート番号 502

通信している複数台を順に電源入れる場合、先に立ち上げた方は通信相手が見つからずタイムアウトエラーCFB1hが出る。
通信は自動復帰するが、エラーランプはついたままになる。
気持ち悪いので下記の命令でエラーを自動復帰させるとよい。
[D4 = HFFFF]
[GP.ERRCLEAR U20 D0 M0]
(エラー出ないようにタイムアウト時間とリトライ回数を極端に大きい値にする方法は使えない。)
初心者で Python を使いたい人で環境構築に困った場合メモ

# 新たなプログラム言語を始めるにあたって何が障害？

私はずばり「**環境構築**」だと思っている。

新たなプログラム言語を習得するとかって、いろいろと用意することがあった記憶がある。
少なくとも私はそれが一番初めに来るのが嫌だった・・。
「まずは動くもの作りたいし、仕組みもシンプルなほうがよい。」
性格的に、なんでそう動くの？どんな仕組みでって考える人は、初めのハードルが高い気がする。（私見）

幸い私の場合は Python を業務ですぐに習得しなければならない事情があったので、とりあえず、動く環境で動かしてみることを続けた。

その間、Python のバージョンアップや周辺環境の変化によりいろいろな選択肢が出てきて、いまでは環境の仕組みがわからなくても何とかなる。しかも、Pythonのような人気がある言語の場合は、ぐぐーったら環境構築の記事はごまんとある。新旧織り交ぜて・・・
これらのサイトをいろいろと読んでいて、一つ思ったのが

[**公式サイト**に書いてあるじゃん](https://www.python.jp/index.html)

しかも、Pythonは比較的初心者にもわかりやすくシンプルに書いてある。（Python自体がシンプルな設計っていうのもあるけど）

でもね、いきなり初心者がanaconda や PyPI JupyterNotebookとか聞くと。??? が並ぶのもよくわかる。（私もそうだったし・・・:frowning2:）

本記事では、本当にシンプルにやりたい人向けにどうすればいいのか整理してみる。

# ただプログラムが動けばいい人（ローカルにこだわらない）
- 言語の勉強をしたい人
- どっかのサンプルソースをそのまま動かしたい人（バージョンに注意）
- 環境とかどうでもいい

[Google Colaboratory](https://colab.research.google.com/)
にアクセスして、ソースを張り付けて実行してみてください。
※Azure Notebook ってサービスがなくなっているのは気のせいか・・

プログラムによっては必要なライブラリを適宜入れてください。[こちら](https://colab.research.google.com/notebooks/snippets/importing_libraries.ipynb)

# ローカル環境に環境構築したいプログラマ（Python標準機能で環境を管理したい）

公式通りで以下をPythonのインストールを実施してください。
1. Pythonのインストール (Windowsの場合)
    [Windows版Pythonのインストール](https://www.python.jp/install/windows/install.html)
    ※[パッケージ](https://pythonlinks.python.jp/)をダウンロードしてインストール。
    ※Microsoft Store版は非推奨になっています。
2. コマンドプロンプトで Python の起動
    ```Python
    # Pythonコマンドで起動
    > python
    >>>
    # Pyランチャーコマンドで起動
    > py
    >>>
    ```

# ローカル環境に環境構築したいデータサイエンティスト（そこまで環境にこだわらず簡単に外部ツールで環境管理したい）

[Anaconda のインストール](https://www.python.jp/install/anaconda/index.html)
に従ってインストールしてください。
一般的に Anaconda の環境で Pythonアプリケーションを構築することはありません。どちらかといえば科学技術計算や機械学習向けに最適化された環境です。そのため、最終的にアプリローンチまで考える場合はAnaconda はお勧めしません。

ただ、どちらもPython実行環境モジュールは取得元が異なるだけで、やれることは大体同じです。

# ローカル環境その後のおすすめ

PCにPythonがインストールされたら以下を実施します。これでローカルの環境汚染がなくなります。

- 仮想環境を構築
    ```python
    # python 環境の場合
    py -m venv [仮想環境名]
    # Anaconda 環境の場合
    conda create --name [仮想環境名] python=3.9
    ```
- 何をともあれ Jupyter Notebook を入れる

```python
    # python 環境の場合
    pip install notebook
    # Anaconda 環境の場合
    conda install jupyter
```
IDEは好きなのを使ってください。私はvscodeがお好みです。

# おまけ

最近クラウドサービスでホスティングしている環境は Coraboratory だけではなく、いろいろと増えているみたい。
- （我らが？）[Azure Machine Learning](https://docs.microsoft.com/ja-jp/azure/machine-learning/)
- [kaggle](https://www.kaggle.com/)
- [GitHub Codespaces](https://docs.github.com/en/codespaces)
- [paiza.io](https://paiza.io/ja/languages/python3)
- [vscode web](https://vscode.dev/)

# 参考資料

- [python Japan](https://www.python.jp/index.html)
- [Microsoft と GitHub のすべてのノートブック エクスペリエンスに関する詳細情報](https://visualstudio.microsoft.com/ja/vs/features/notebooks-at-microsoft/)
【HTML/CSS/レスポンシブ】PCとモバイルで表示画像を変える方法

## 初めに

こちらはHTMLとCSSのみで、PCとモバイルで表示画像を変える方法（画像）をまとめた記事です。
Railsで実装した方法も併せてご紹介しています。

## 手順

#### ①HTMLにviewportを読み込ませる

レスポンシブに対応させるため、HTMLのhead内にviewportを読み込ませます。

```sample.html
<head>
    <!-- 以下１行の記述を追加 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>サイトのタイトル</title>
     <!-- 省略 -->
  </head>
```

#### ②HTMLに表示させたい画像を記述

PC、モバイルで表示させたい画像２枚にそれぞれ違う名前のクラス名を追加します。
例　
・class="pc"
・class="mobile"

```sample.html
   <!-- 以下はPCで表示させる画像 -->
   <img src="logo.png" class="logo__pc">
   <!-- 以下はモバイルで表示させる画像 -->
   <img src="logo_responsive.png" class="logo__mobile">
```

複数箇所変える場合は「○○__pc」など、どこのレスポンシブ化を示しているか明確にすると可視性が高まると思います。
画像名や呼び出し方、クラス名は使用に合わせて、適宜ご変更ください。

この時点では２枚の画像が表示されている状態です。

#### ③CSSで表示の有無を変える記述

表示させたい画像に「display: block;」
非表示にしたい画像に「display: none;」を記述します。

```style.css

/*---------------------------------
 以下PCに表示させたいCSS
--------------------------------- */

.logo__pc{
  width: 400px;
  height: 70px;
  display: block;
}

.logo__mobile{
   display: none;
}

/*---------------------------------
 以下レスポンシブデザイン（モバイル）で表示させたいCSS
--------------------------------- */
@media (max-width: 599px) {
.logo__mobile{
  width: 300px;
  height: 70px;
  display: block;
}

.logo__pc{
  display: none;
}

}
```



## Ruby on Railsの場合
「ヘッダーのロゴ」を画面幅によってサイズを変更した実装例
手順は同様ですが、記述するファイルも併せてご紹介しています。

#### ①viewportを読み込ませる

レスポンシブに対応させるため、application.html.erbのhead内にviewportを読み込ませます。

```app/views/layouts/application.html.erb
<head>
     #以下１行の記述を追加
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>サイトのタイトル</title>
    #省略
  </head>
```

#### ②表示させたい画像を記述

ヘッダーのサイトタイトルをクリックしたら、トップページに遷移するよう設定しています。

```app/views/layouts/application.html.erb
<%= link_to (image_tag "logo.png", class:"logo__pc") , root_path %>
<%= link_to (image_tag "logo_responsive.png", class:"logo__mobile") , root_path %>
```
#### ③同様にCSSを編集する

```style.css

/*---------------------------------
 以下PCに表示させたいCSS
--------------------------------- */

.logo__pc{
  width: 400px;
  height: 70px;
  display: block;
}

.logo__mobile{
   display: none;
}

/*---------------------------------
 以下レスポンシブデザイン（モバイル）で表示させたいCSS
--------------------------------- */
@media (max-width: 599px) {
.logo__mobile{
  width: 300px;
  height: 70px;
  display: block;
}

.logo__pc{
  display: none;
}

}
```

## まとめ

最後までご覧くださり、ありがとうございました。
使用頻度が高そうなので、備忘録としての記録記事でした。

初学者のため、記入漏れや記述ミスがありましたら教えていただけると助かります。

こちらの記事がどなたかの参考になりましたら幸いです。
RPGツクールMVのプラグインにGPL/LGPLを適用した場合どうなるか

# 概要

RPGツクールMVでは、JavaScriptを使って自由にプラグイン[^1]を制作することが可能です。
有志の手によりオープンソースライセンスのプラグインが多数公開されていますが、その内ほとんどがMITライセンスを使用しており、GPL/LGPLの適用例が少ないと思ったため、記事にしてみました。
ライセンスの選択肢を増やす為の参考にしていただければと思います。

なお本記事ではRPGツクールMVの使用を前提としていますが、性質上RPGツクールMZ用のプラグインについても一部同様に扱えると思います。ただしコミュニティ版コアスクリプトが公開されていないなどの違いがある為注意が必要です。

[^1]: 外部からインポートできるアドオンのようなもの

# 免責事項

本記事の内容は個人の見解であり、内容の正確さを保証するものではありません。
実際のライセンスの使用にあたってはご自身の判断で行ってください。

# ソースの公開義務について

まず前提として、RPGツクールMV製のゲームを頒布する際は必然的にスクリプトファイルを添付することになるので、ソースの公開義務について心配する必要はほぼないと思われます。
ただし実行形式の場合、スクリプトを実行ファイルにパッケージングしてしまうとライセンス条項違反となる可能性があるため、注意が必要です。

以下ではライセンスごとの違いについて見ていきます。

# LGPLを適用した場合

jsを用いたプラグインのimportの扱いが問題となります。
ツクールMV用プラグインとしての使用はライブラリのリンクとみなされるため、**ソースを改変しない限りゲーム中のスクリプト全体にLGPLを適用する義務は生じず、他のプラグインのライセンスとも競合しません。**

プラグインを使用する側にとっては比較的少ない負担で使用できるライセンスだと思われます。
ライブラリとメインのスクリプトが明確に分離していなければならないので、ライセンス表記に加え、プラグイン単体で一つのライブラリであると明記しておいた方が良いでしょう。

# GPLを適用した場合

GPLの場合、ライブラリ自体を直接呼び出すスクリプトは全て派生物扱いとなり、GPLを適用する必要が生じます。
このため、GPLの適用範囲は「**他のプラグインを含んだゲーム中のjs全体**」となります。
コアスクリプトについてはMITライセンスで公開されている[コミュニティ版](https://github.com/rpgtkoolmv/corescript)を使用すれば問題ないですが、現在使用中の他のプラグインがGPLと競合するライセンスを使用している場合[^2]、ライセンス違反になるので注意が必要です。

ただし、ツクール本体が生成するJSONデータはGPLの適用範囲外となりそうです。これはJSONがデータ記述用の独自の形式であり、jsのオブジェクトの一部とはみなされないからです（確証があるわけではないので慎重に扱うに越したことはないと思います）。
また実行形式での配布の場合、ゲームの実行ファイル本体はコアスクリプトのインタープリタとみなされるため、GPLの適用範囲外となります（実際にゲームロジック用のLuaスクリプトにGPLを適用した商業作品が存在します）。

[^2]: Yanfly製の有料プラグインなど

# 最後に

まとめると、

- **LGPL:** プラグイン自体を改変しなければゲーム全体には影響を与えない
- **GPL:** ゲームのスクリプト全体をGPLで配布することになる。ただしJSONと実行ファイルは対象外

となります。

これらを踏まえると、LGPLはプラグインのライセンスとして比較的現実的に使用できるのではないかと思います。
ちょっとした改良等は今まで通りMITライセンスで公開するといいと思いますが、独自の戦闘システム等の大規模なプラグインであればGPLやLGPLの適用も視野に入ってくるかと思います。
また、プラグインでなく自作のゲーム用にがっつりスクリプトを組んだ場合GPLは有力な選択肢になると思います。
GPLはツクール本体への影響など誤解されやすい面があるように感じますが、利点も多いライセンスなのでうまく活用していきたい所です。

# 参考文献

- [*licensing - How does the GPL static vs. dynamic linking rule apply to interpreted languages? - Software Engineering Stack Exchange*](https://softwareengineering.stackexchange.com/questions/167773/how-does-the-gpl-static-vs-dynamic-linking-rule-apply-to-interpreted-languages)
- [GPLなJavaScriptのコードは、非フリーなソフトウェアに使えるのか - ありえるえりあ](http://dev.ariel-networks.com/Members/inoue/gpl-and-javascript/)
【備忘録】Java学習2週間でInterfaceを理解するまで

# はじめに

　この記事はプログラミングを初めて2か月たったアホの子である筆者がJava学習を開始して2週間たった時にInterfaceを理解した時の思考回路です。
　基本的にドルオタ末期なのでかなりお見苦しい点も見受けられますが温かい目で見てやってください。
　でも初学者の方は理解しやすい（はず）です！

# そもそもInterfaceクラスとは
　抽象クラス（abstractクラス）の仲間みたいなものらしいです。そもそも抽象クラスの概念自体難しいのに余計になんだこれって感じですよね...
　恐らく皆さん調べた結果似たような状態になっているのではと思ってます。

# 本題！この説明を見ればInterfaceが理解できる！（はず）
　そもそもクラスから生成されるインスタンスは実体として扱う上での話になります。
　筆者は日〇坂〇6が大好きですのでその中の推しメンである小〇菜緒さん（kosakanaクラス）をJavaで作ろうと思いました。（そもそもこの時点で正気の沙汰ではない）
　この際に、小〇奈緒さんは（当たり前ですが）「人」なので、human classという人としての機能（呼吸する、寝る、起きるなど）をもつクラスを継承して作ったとします。この時点でUML図っぽくするとこんな感じ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698908/037263d3-998c-4f89-694f-037235736dce.png)
 
　既にこの時点で訳分らんって方はなんでもいいのでこれ以降は好きなものに置き換えてたとえ話と思って聞いてみてください
　
　しかしながら小〇菜緒さんは「アイドル」でもあります。そこで、idol classを作成し継承したいところですが、継承はjavaの使用上一つのclassしかできないのでできません。けど、世の中には小〇菜緒さん以外にもアイドルはたくさんいます。そんな人たち全てに（実際にはありえないですが）アイドルとしての行動（機能）、例えば踊る（danceメソッド）、歌う(singメソッド)などを定義していたら作業が大変になります。仮に定義できたとしても作っているのは人間なので、もしかしたら上〇ひなのさんには踊る（danceメソッド）能力を付与し忘れるかも知れません。

　そこで、出てくるのがInterfaceです。まずはじめに、Interfaceはclassの一種です。

　ここでたとえ話の続きとして、アイドルは人によって歌う曲や踊るダンス（つまりメソッドの処理内容）は違います。分かりやすく言えば、小〇菜緒さんさんは「キュン」という曲を歌って踊りますが、齋藤〇鳥さんは「裸足でsummer」を歌って踊ります。（分からなかったら人の名前や曲は知ってる歌手で置き換えてみてください）

　このように、一人一人が違う曲やダンス（場合によっては曲は一緒でも違うダンス）をアイドルは歌って踊らなければなりません。（つまり同じメソッドでも違う処理をしなければならない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698908/16e639e0-ff50-9ba0-1d0c-2013bd005fc5.png)

　そのため、プログラム上ではアイドルのインターフェイス（interface idol）を作成し、歌う（sing）や踊る（dance）などのメソッドを作るだけ作っておき、処理内容はimplement(拡張)した先のclass（インスタンス）に処理内容はお任せします。（つまりメソッドをオーバーロードする）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698908/b5c95d90-42fc-a84d-53a2-8b6dd270a474.png)

というところまでがInterfaceを実装する理由です。
でも恐らく、「オーバーライドするなら全部に書き込んでも一緒じゃない？」と思います。
ここから先は自分も色々な方に聞いた話と推察を交えて話しているのでご了承ください。


# 何故オーバーライドするのにInterfaceクラスをわざわざ作成するの？

　恐らくInterfaceを作成する利点は「保守・運用性の向上およびチーム内での共通認識」のためではないかと思われます。

　まず一つ目の保守・運用に関しては、コードを後から見返す際に、Interfaceがあることによって、このコードは何のコードなのかがわかりやすくなると思います。例えば、「ピ〇チュウ」（class）「ポ〇モン」(親クラス)だけ書いてあるものと、それに加えて「タイプ（でんき）」・「種類（でんきね〇みポケモン）」（Interface)が追記してあるものでは、どちらのほうが誰が見ても「ピ〇チュウ」関する解析度が高いかというところだと思います。

　二つ目のチーム内での認識共有も結局は一つ目と同じような理由だと思います（チーム内でポケット〇ンスターというアニメ（プロジェクト）に対する知識の深さや理解度は多かれ少なかれみんな違うと思うので）。

　長くなりましたがInterfaceの説明は以上です。
　正直、私も少し前に初めて知ったところなのですべてが正しいとは言い切れません。参考程度でお願いします。
PHP　三項演算子の省略形

## 三項演算子の省略形
三項演算子は可読性が下がる場合もありますが、今回は紹介します。
下記の2つは同じ結果になります。

```php:例文
$hoge ? $hoge : $hogehoge;
```
**解説**
「$hoge」が `true` の場合は「$hoge」を返し、 `false` の場合は「$hogehoge」を返します。
　
```php:例文
$hoge ?: $hogehoge;
```
**解説**
「$hoge」が `true` の場合は「$hoge」を返し、 `false` の場合は「$hogehoge」を返します。
1つ目のコードと違う点は、 `true` の場合に返す値を省略している点です。
`true` の場合には「?」の左にある値が返されます。
※三項演算子の時点で可読性が下がる場合があり、省略することで更に可読性が下がる場合もあります。
Open Source, Some/IP


# BMW
https://github.com/COVESA/vsomeip

COMMUNICATION PROTOCOLS FOR
ETHERNET IN THE VEHICLE

https://www.iqpc.com/media/9048/29408.pdf

Genevi
https://blog.katastros.com/a?ID=01600-bac506fc-65f5-4210-b87f-fc56559c9bb9

# Microchip
https://github.com/MicrochipTech/some-ip


# synopsys

SOME/IP Server Test Suite Data Sheet
https://www.synopsys.com/software-integrity/security-testing/fuzz-testing/defensics/protocols/some-ip-server.html

# NI

SOME/IP Client / Server Examples 
https://forums.ni.com/t5/LabVIEW-Automotive-Ethernet/SOME-IP-Client-Server-Examples/td-p/3702326


# others
Analyzing and Securing SOME/IP Automotive Services with Formal and Practical Methods
Daniel Zelle, Fraunhofer Institute for Secure Information Technology, Germany,
https://dl.acm.org/doi/fullHtml/10.1145/3465481.3465748


Design of a CANFD to SOME/IP Gateway Considering Security
for In-Vehicle Networks

https://www.mdpi.com/1424-8220/21/23/7917/pdf?version=1638257592


Rust-based SOME/IP implementation for robust
automotive software

https://sigarra.up.pt › feup › pub_geral.show_file

What's the difference between DDS and SOME/IP?

https://stackoverflow.com/questions/51182471/whats-the-difference-between-dds-and-some-ip
【Git】親ブランチを訪ねて

# ブランチを作成って、一体どこから？

Gitブランチを切る！って記事はよく見るのですが、どこから切っているの…？というのがよく分かっていませんでした。
（ローカルリポジトリのmasterブランチから派生？それともリモートリポジトリのorigin/masterブランチから派生？？）
そこで、今回は親ブランチを訪ねてみます！

## 状況
developブランチは、masterブランチより開発が進んでいる状態
```sh:
$ git branch
  develop
* master
```

## 親ブランチの確認
- masterブランチにてブランチをきった場合
```sh:masterブランチ
$  git checkout -b new_branch
Switched to a new branch 'new_branch'
```
```sh:new_branchブランチ
$ git show-branch | grep '*' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -1 | awk -F'[]~^[]' '{print $2}'
develop
```
- developブランチにてブランチをきった場合
```sh:developブランチ
$  git checkout -b new_branch2
Switched to a new branch 'new_branch2'
```
```sh:new_branch2ブランチ
$ git show-branch | grep '*' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -1 | awk -F'[]~^[]' '{print $2}'
develop
```

## 結論
git branchを実行したときに起きていることは、ローカルブランチで最新のブランチから派生してブランチを作成している！

## 開発準備
せっかくなので普段の業務で行っている開発の準備をメモ:writing_hand_tone1:

1. ローカルリポジトリでmasterブランチへ移動
　```
$ git checkout master
　```

2. リモートリポジトリ（origin/master）の変更をローカルリポジトリのmasterブランチに反映させる
　```
$ git pull
　```

3. ローカルリポジトリのmasterブランチから派生させて、新たにブランチを作成
　```
$ git branch <branch name>
　```

4. 新たに作成したブランチに移動して作業を開始！
　```
$ git checkout <branch name>
　```
PHP　smarty　テンプレート変数取得　getTemplateVars

## getTemplateVars
テンプレート変数の情報を取得します。

```php:例文
$smarty->getTemplateVar('hoge');
```
上記でテンプレート変数「hoge」の値が取得できます。

assignされていた場合に処理を行うなどの、if文を記述する際にも使えます。
mac で brew をインストールする時に x-code cliツールがインストールできない問題

# mac で brew をインストールできない

##　問題
x-code の cliツールがインストールできない問題が発生した
こんなエラー
```
Can’t install the software because it is not currently available from the Software Update server.
```

## 原因
OSが古い

## 解決策
OSをアップデート。

# 感想
なんかサーバーが落ちてるかのようなエラーなのですごい戸惑った。
Denoの環境構築 Mac

# 環境
Mac Monterey 12.3.1

## インストール方法
１ ターミナルを開き、下記のコマンドを実行し、Denoをインストールする
```
curl -fsSL https://deno.land/x/install/install.sh | sh
```

2 .zshrcファイルを下記のコマンドで開く
```
open ~/.zshrc
```

※この時、error等のメッセージが出てきたら、ファイルがない可能性があるので、
下記のコマンドを実行し、ファイルを作成する
```
touch ~/.zshrc
```

3 .zshrcファイルを開けたら、下記の内容を記述し、保存する
※下記の内容は、1でインストールが終了した時に記述されている
```
  export DENO_INSTALL="/Users/[ホーム名]/.deno"
  export PATH="$DENO_INSTALL/bin:$PATH"
```

4 ターミナルを再起動し、下記のコマンドを入力する
```
deno

Deno (1.22.1)←ここはインストール時のバージョンに依存する
>
```

# まとめ
上記、1~4の手順を実施することで、Denoのインストールを行うことができる。
brewでも インストールは可能なので、簡単だと思った方を各自で実施してください。
また、touch ~/.zshrcでファイルを作成することを知らなかったので、
思いのほか時間がかかったので、備忘録としてこの記事を書きました。
一人でも多くの方にお役に立てましたら、幸いです。
inputに入力された文字を扱う

# はじめに

この記事はreact初心者が学習記録程度に書き残したノートです。  
この記事を参考に一～十まで学ぼうとしないでください！

# できること

1. inputタグに入力した値をクライアントのjsで受け取る
1. 受け取った値をjsで加工して表示する

```react
import { Link } from "react-router-dom";
/* point1 */
import React, { useState } from "react";

const SignUp = () => {

    /* point2 */
    const [email, setEmail] = useState("");
    const [decideEmail, setDecideEmail] = useState("");
    const [pass, setPass] = useState("");
    const [decidePass, setDecidePass] = useState("");

    /* ↓表示ボタンをクリックした時の処理 */
    const onClickDisplayValue = () => {
        const mark = "●";
        let hiddenPass = mark.repeat(pass.length);
        let makedEmail = email + "@mail.com";
        setDecideEmail(hiddenPass);
        setDecidePass(makedEmail);
    }

    return (
        <>
            <h1>新規登録ページ</h1>
            <div>
                {/* point3 */}
                <p>メールアドレス<input 
                type="text" 
                value={email} 
                onChange={(event) => setEmail(event.target.value)}
                /></p>
                <p>パスワード<input 
                type="text" 
                value={pass} 
                onChange={(event) => setPass(event.target.value)}
                /></p>
                <button onClick={onClickDisplayValue}>表示</button>
                {/* 表示部分 */}
                <p>パスワード：{decidePass}</p>
                <p>メールアドレス：{decideEmail}</p>
            </div>
            <div>
                <p>ログインは<Link to={`/login/`}>こちら</Link></p>
                <p><Link to={`/`}>ホームに戻る</Link></p>
            </div>
        </>
    );
};

export default SignUp;
```
# point1：useStateを使ってinputの値を取得する

## useStateとは
reactで用意されているフックAPIの1つ

## フックとは
ある状態を保存する変数とその状態を更新するための関数を１セットにしたもの  
詳しくはpoint2で。

## 準備する
以下の１行を書き込めばuseStateを使う準備は整います。  
npmでinstallとかは特に行いませんでした。
```react
import React, { useState } from "react";
```

# point2：state変数の宣言

```react
const [email, setEmail] = useState("");
const [decideEmail, setDecideEmail] = useState("");
const [pass, setPass] = useState("");
const [decidePass, setDecidePass] = useState("");
```
この部分で行っています。 
```react
const [状態を保存する変数の名前, 更新用の関数の名前] = useState("");
```
の形で宣言します。
確かに「ある状態を保存する変数」と「その状態を更新するための関数」が１セットになってます。  
これをフックと呼ぶようです。

# point3：inputの書き方にも注意
```react
<p>メールアドレス
<input type="text" value={email} 
onChange={(event) => setEmail(event.target.value)} />
</p>
```

inputの書き方も一癖あります。
①文字の入力を検知
②検知したらset関数で状態を更新
を繰り返します。

「onChange={(event) => setEmail(event.target.value)}」で実現しています。

面白いのが、setで更新すれば、画面上へのレンダリングは自動で行ってくれるのです。

## ボタンを押したら値を取得して加工して表示

取得～加工～表示をざっくり。
イベント「onClickDisplayValue」をボタンのイベントに設定しています。
中身は単純。ボタンを押した段階のパスワードとメールアドレスはそれぞれ「pass」「email」に保存されているので、そいつをひっぱってくるだけ。

あとは、表示用にそれぞれ１つずつ、計２つフック変数を用意しました。
「decidePass」「decideEmail」です。
passとemailは入力するたびに中身が変わるので、ボタンを押した時に状態が書き変わる用のフックが欲しかったからです。

あとは加工します。今回は伏字と文字連結。ここは説明省きます。

最後に加工したものをset関数で表示すれば、ボタンを押した時の表示が完成です。
PHP　array_slice()　配列の一部を取得

## array_slice()
配列の一部を取得する関数です。
取得した部分を配列にして返します。
※返り値の配列の添字は0から指定されます。
　
```php:例文
$hoge = ["a", "b", "c", "d", "e"];
$hogehoge = array_slice($hoge, 1, 3, true);
var_dump($hogehoge);
```

```:結果
Array
(
    [1] => b
    [2] => c
    [2] => d
)
```

### 解説
`array_slice(第1引数, 第2引数, 第3引数, 第4引数)`

`第1引数`　※必須
取得の対象の配列

`第2引数`　※必須
取得の開始位置
例文では「1」を指定していたので、2つ目が開始位置になります。
末尾から数えたい場合は、負の数を指定します。最後の要素が「-1」、最後から2番目の要素が「-2」になります。

`第3引数`　※省略可能
取得する要素の数
デフォルトでは「NULL」が指定されていて、開始位置以降の全ての要素を取得します。
負の数を指定した場合、最後の要素まで取得したい場合は「-0」、最後から2番目の要素まで取得したい場合は「-1」になります。

`第4引数`　※省略可能
添字を維持するかどうか
デフォルトでは「false」が指定されていて、取得した配列の添字は「0」からになります。
trueを指定した場合、第1引数の添字が維持されます。
【Jupyter Notebook】Bad file descriptorエラーを解決する

# 内容
タイトル通りですが、解決できる対象の環境は**ディレクトリ名に日本語が入っている**(Windows OSでユーザー名に日本語が入っている等)場合です。
エラー内容としては`jupyter notebook`コマンドからノートブック立ち上げ→カーネル立ち上げ→`Bad file descriptor`でノートブックが強制終了してしまうことを指しています。

(以下のようにノートブック立ち上げ後に`Bad file descriptor`で落ちてしまう)
![SnapCrab_NoName_2022-6-1_20-50-9_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635079/d4fb32ca-b7d9-5639-840c-b1623e6fc27f.png)



# 解決方法

`pip install notebook`実行時にインストールされる`pyzmq`をアンインストール

```:python
pip uninstall pyzmq
```

`pyzmq==19.0.2`を再インストールする

```:python
pip install pyzmq==19.0.2
```


**これで解決するはず**です。

また、`pyzmq==19.0.2`インストール時、jupyter-clientライブラリのバージョンが新しいと
```
ERROR: jupyter-client 7.3.0 has requirement pyzmq>=22.3, but you'll have pyzmq 19.0.2 which is incompatible.
```

のように出ますが、今回のエラーについては解決できます。