OmniAICreator/Qiita-1.07M huggingface dataset:
40代エンジニア志望、React はじめの一歩

## はじめに

こんにちは！[@nyakako13](https://qiita.com/nyakako13 "Qiita ページ") です。

今期面白そうだなと思っているアニメは[夜のクラゲは泳げない](https://yorukura-anime.com/)です。アニメも音楽も好きなので、音楽アニメはハマりがちです。（ぼざろはほんと良かった）あと、転スラ、無職転生も外せませんね。他にも何かオススメあったら教えてください！

本題です。

参加中の[JISOU](https://projisou.jp/ "JISOU")の課題として、初めてReactでアプリを作ったので感想や気づきを残したいと思います。


## 作成したもの（学習記録アプリ）
![chrome-capture-2024-4-14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2539365/30ae73bc-70b7-6a2b-0ff1-49d8b68b42a9.gif)
↑gifは[【chrome capture】](https://chromewebstore.google.com/detail/ggaabchcecdbomdcnbahdfddfikjmphe)で収録

- 機能
  - 学習記録を一覧でみることができる
  - 新しい記録を登録できる
  - 勉強時間の累計をみることができる

スタイリングはしなくて良い課題だったので、かなりシンプルな見た目ですね。

主にReactのuseStateの扱いに慣れる為の課題かなと感じました。


## 気づき
### ①ハンズオンからすぐに手を動かす(動画の内容で動画以外の成果物を作る)のが大事
今まではUdemyなどの教材を学習し終わって、すぐ別の学習を始めてしまったり、何か応用するにしても少し時間が空いてしまうことが多かった気がします。

今までのやり方は効率が悪かったと気づくことができました。

学んだら、その内容ですぐに応用するのが効果的な学びにつながることを実感しました。

### ②タスクをできるだけ小さくすることが大事
「困難は分割せよ」は有名な名言ですが、自分でプログラミングする時はあまり意識できていませんでした。

今回の課題は一つ一つのタスクを細かく、明確にしてくれていたのでとても取り組みやすかったです。（特になれていない言語や技術を使うときは重要な気がします。）

実務ではいろんな粒度でのタスクがあると思うので、自分でタスクを分解する能力を磨いていきたいと感じました。


## 感想
課題の前に取り組んだUdemyの[【最新ver対応済】モダンJavaScriptの基礎から始める挫折しないためのReact入門](https://www.udemy.com/share/103Fxl3@rF32I2B813_7rBhSBuWkNqBTeWS3tY5SNLpUnEj9MeDo5pgOV-NC6ya5M1H7mR5_Bw==/)
有名なものだと思いますが、本当に良かったです。
少し前にフルリニューアルしていたり、解説もとてもわかりやすく講師のじゃけぇさんに本当に感謝です！！

React始めたい人、興味ある人にはマジでオススメ！


## おわりに
よかったら[X(@nyakako13)](https://twitter.com/nyakako13 "Xプロフィール")もフォローしてもらえると嬉しいです。

[Qiita100投稿](https://qiita.com/nyakako13/items/03ad61cfb82a1582b5d1)まで残り98！

未経験や浅経験、厳しいと言われている年代でエンジニアへの転職活動されている方、負けずにがんばりましょう！！

# JISOUのメンバー募集中

プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします👇

https://projisou.jp

## 参考
[【最新ver対応済】モダンJavaScriptの基礎から始める挫折しないためのReact入門](https://www.udemy.com/share/103Fxl3@rF32I2B813_7rBhSBuWkNqBTeWS3tY5SNLpUnEj9MeDo5pgOV-NC6ya5M1H7mR5_Bw==/)

[【永久保存版】0からReactを勉強するならこのロードマップに従え！](https://qiita.com/Sicut_study/items/78910cd8d103b8d45a73)
【これだけはやっとけ】Laravel/PHP未経験者が初案件で即戦力になるために（後編）

# 対象
こちらの記事はLaravel/PHPエンジニアとして初めて案件に参画する方に向けて作成しております。

# はじめに
[前回の記事](https://qiita.com/Jasco/items/fc979c1b1b6fbe485d8d)は読んでいただけましたでしょうか？
初案件参画に向けて、後編もどんどん見ていきましょう！！


# 全体項目
 
 ## 【前編】
  [別の記事](https://qiita.com/Jasco/items/fc979c1b1b6fbe485d8d)にて掲載しております。
 | 項番 | タイトル |
|:---:|:-------------|
| 1 | 正規表現 |
| 2 | git |
| 3 | SQL |
| 4 | HTML&CSS |
| 5 | JS |
| 6 | JSフレームワーク |

 ## 【後編】

 | 項番 | タイトル |
 |:---:|:-------------|
| 7 | [PHP](#php) |
| 8 | [Laravel](#laravel) |
| 9 | [Excel](#excel) |
| 10 | [用語](#用語) |

# PHP
やっとバックエンド側の技術となってきます。
PHPに関して、
正直、基本的な書き方（関数・配列・変数・繰り返し・if文など）が分かっていれば、
業務する上で特段に困る、という事はあまりないかと思います。
（わからないことは業務内で都度調べていけばOKです）

ただ、こちらの本を通して、
**「こういう時、確かこんな機能・関数があったな...」と記憶に片隅あるかないかでは、
作業効率やコード理解のスピードに大きく差が出る**ので、一通り目を通しておくことを推奨します。

[独習PHP](https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92PHP-%E7%AC%AC4%E7%89%88-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4798168491)

# Laravel
いわずと知れた有名な「青本」ですね。

自分自身、Laravelの開発案件に入って2年ほどたちますが、
人月単価65万未満の案件だったら、
**この本に書かれている以上のことは実務では求められない**
と思っても問題ないくらい充実した内容の入門書です。

最初から最後まで人に説明できるぐらい理解できれば、
業務としては十分に即戦力となります。
なんとなくの理解でも十分ですので、絶対に一通り目を通しておきましょう！

[PHPフレームワークLaravel入門](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1A6OSI6YO9O9N&dib=eyJ2IjoiMSJ9.wzsy_vHXdbFIsrpDz8RUfCZrlcP9n4aVArnXkgyDJyJ4sJVmeexiHXcDnBPvNDsi9vME1yfiSCmIqUD71xevtsMP-9xrSESgGVEupXufevpLMf3dUhJXaITIM9J5zTnV9vdu4nBbC97CXaNT8LtzZfjSw9qUSNGuHyMXmRj1ujdBt3eE2zd395580mm5jg7OWO_TuOCVYgShirVsP73Z_lYIBozWMjFWKv0MxbMNKtw.eXvxD-uGxDnUlNx2iD8bMwziNxinhrc1zujXHYqhGa8&dib_tag=se&keywords=Laravel%E5%85%A5%E9%96%80%E6%89%80&qid=1713075913&s=books&sprefix=laravel%E5%85%A5%E9%96%80%E6%89%80%2Cstripbooks%2C192&sr=1-2
)

# Excel
障害対応や調査にて、Excelを使う機会は頻繁にあります。
関数は最低限下記だけわかれば正直十分です！
逆に下記だけは、**諳んじて自由自在に使えるようにしておきましょう！**

・if
・vlookup
・index/match
・countif

＋α
ショートカットは最低限下記は覚えておきましょう！
　・**（ヘッダー行を選択して）ctrl + shift + L　：　 表をテーブル化（★かなりよく使う）**
　・（行/列を選択して）ctrl + shift + ;　：　行/列の追加
　・ctrl + D　：　セルを下の行に複製
　・ctrl + R　：　セルを右の列に複製

# 用語
様々な教本に載っているような用語は割愛します。
自分が現場に入って、「なにそれ？」となった用語を下記にまとめております。

**・開発環境（develop環境）**
　gitのブランチにおいて、直接コードを編集し、簡単な動作確認を行う環境
　障害対応や新規開発はこの環境で行う

**・検証環境（staging環境）**
　・疑似本番環境のこと
　・gitのブランチにおいて、基本的に直接的なコードの編集は行わない（開発環境のブランチをマージして使うことが多い）
　・開発環境で修正した内容をstaging環境に上げてからテストすることが多い。

**・本番環境（main）**
　・**誰の許可もなく操作するのは絶対にNG！**（触りたいときは必ず上の許可をとる　※基本的に偉い人が対応する）
　・gitのブランチにおいて、
 　　staging環境で問題ないと判断された修正、
   　　且つ、次のリリース対象となったコミットのみstaging環境からマージされ、
     　　更新されることが多い。


**・横展開確認**
　・障害対応・仕様変更などにて、そのピンポイントの修正だけではなく、
　　**同様の修正をする必要が、他の個所にもあるかどうか確認すること**
  
　　障害例）「organization」 の綴りが 「oganization」 になっていた
　　　→すべてのソースから「oganization」をグレップ検索
　　　→他にも「oganization」と書かれていたところがあった！
　　　→全員に共有＆修正。

# 終わりに
いかがでしたでしょうか？
ここで紹介したものをすべてやり通せたのであれば、
**もうあなたは未経験ではありません（？）**
**立派な経験者です！！！**

ここまでやれば、
案件先で恥をかいたり、全くできなくて業務で躓く、ということは絶対にないはずなので、
自身を持って案件に参画していきましょう！


初投稿で拙い文章となってしまい恐縮ですが、
最後まで読んでいただき、ありがとうございました！
Ubuntu化したミニPCをKVMサーバー化する。

# 概要

前回設定した以下記事の続き。

- パスワードによるSSH設定、
- GUIによるリモートコンソール接続の設定
- cockpitによる仮想化設定

を行う。

# 実行環境

- sshアクセス＆リモートデスクトップログインを行うクライアントPC
    - macbookpro m1_pro OS：Sonoma 14.2.1
- Ubuntu
    - VERSION="23.10 (Mantic Minotaur)"

# cockpitのインストール。
まずは、以下のコマンドでnmcliなどをインストールしておく。あると管理が便利になるため。

```
sudo apt update
sudo apt install -y network-manager
sudo netplan apply
```

その後、以下のコマンドでcockpitをインストールする。このコマンドだけで、KVMの仮想環境が出来上がる。
```
sudo apt install -y cockpit
```

次にcockpitにアクセスする。ポート9090を使用するので、Firewallで閉じている場合は解放すること。
https://サーバーのIPアドレス:9090
ローカルの場合はサーバのIPアドレスに`https://localhost:9090またはhttps://127.0.0.1:9090`

証明書の設定をしていないため以下のような表示が出てくると思われる。
今回は続行する。
![スクリーンショット 2024-04-14 16.40.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/c41711d4-3a04-51ed-4b9d-7d0f7f2a9a1e.png)

ユーザー名とパスワードは、ホストのユーザー名とパスワード名を入れてログインする。

![スクリーンショット 2024-04-14 16.41.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/3f129aea-7183-9074-37ea-1702bff81fda.png)

コンソールは最初制限されているため、sudo用のパスワードをGUIで入れることで、仮想マシンの操作などが実行できるようになる。

また、ホストのコンソール画面に戻り、以下のプラグインをインストールする。
```
sudo apt install -y cockpit-machines
```
これで、仮想ゲストが作成できるようになる。

インストールが完了するとGUIの左側に「Virtual machines」という項目が増える。ここから操作して、サーバを作成していくことになる。

# 仮想ゲストの作成


cockpitを用いてインストールしようとしたら、以下のようなエラーに遭遇。

https://qiita.com/kure/items/889d49cbe2affabae0cf
https://qiita.com/engishoma/items/695fea4656876f93317d

ユーザ、グループ名をqemuに変えるべしとあったが、自分の環境ではqemuのユーザがなく、
`libvirt-qemu`というものしかなかったので、以下のコマンドで変えるものとする。
```
sudo chown libvirt-qemu:libvirt-qemu ./Almalinux~~dvd.iso
```

それでもまだ上記のエラーが出たので、おそらくディレクトリにアクセスできないのかと思い、isoファイルを移動させる。今回は、/tmp/に移動させた。tmpは一週間で消えてしまうので、どこか任意の置き場を作るとよいだろう。

```
mv Almalinux~~dvd.iso /tmp/
```
すると、あっさり通ってくれた。サーバは作成された時はrunnningになる。
そしてGUIコンソールからLinuxのセットアップを行う。

ちなみに、自分は作成時には以下のような設定にして作成した。

![スクリーンショット 2024-03-31 16.05.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/4ebd7072-b84e-ee11-bfcd-3d39e4c4d768.png)


オートスタートなどの設定を読み込ませる際にはGUIでシャットダウンさせるか、以下のコマンドをホストで実行。
```
sudo virsh shutdown サーバ名
```


## ホストから行うゲストサーバの設定


まずは、サーバの自動起動を有効化する。
```
sudo virsh autostart  サーバ名
```

そして、virshコンソールからでも入れるようにする。cockpitでもなんとかなるがこれができるとなにかと便利。

ゲスト上で、以下のコマンドを入力する。cockpitのコンソールから操作するとよい。。
```
sudo vi /etc/default/grub
```
その後、以下のように編集する。
```
GRUB_CMDLINE_LINUX="「もともと変えてあるオプション」"
↓
GRUB_CMDLINE_LINUX="「もともと変えてあるオプション」 console=tty0 console=ttyS0,115200n8"
```
そして、以下のコマンドを実行する。*未検証だが、このコマンドだけでうまくいく可能性あり。
```
systemctl enable serial-getty@ttyS0.service
systemctl start serial-getty@ttyS0.service
```

ホスト上で、以下のコマンドを実行して、入れることを確認する。
```
sudo virsh console ゲスト名
```

# 事後作業

今回の設定で、最低限VMを構築することができた。
しかし本来であればネットワークの設定をしておいた方が良い。

これで作成したVMは`virbr0`という仮想ブリッジの配下になっている。サーバから外に出る分には問題ないのだが、外部からアクセスすることはできない。

そのため、新たにブリッジを作成し、このVMに紐づけてNICを追加する必要がある。


# 参考サイト

https://tech.nkhn37.net/ubuntu-ssh-setting/

https://vpscafe.net/sshd-ip-filter/

https://pc.watch.impress.co.jp/docs/column/ubuntu/1576889.html

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0713

https://access.redhat.com/ja/articles/4259721
【Vue3.4アップデート】子コンポーネントの値を親へ伝える方法

### はじめに
こんにちは、Mottyです。
Vue.jsにおいてコンポーネント指向は便利ですが、変数の受け渡しなど一部の機能がややこしかったりします。
去年12月のアップデートで親から子への伝搬が便利になったので、まとめていきます。

### 子コンポーネントの実装

```VmodelChild.vue
<script setup>
const data = defineModel(); //受け渡したい変数を定義
inputs.value= "value from child"; //.valueで受け渡したい変数の中身を記入
;</script>
<template>
    <div class="wrapper">
        <button> This is a Child Coomponent</button>
    </div>
</template>
```

### 親コンポーネントの実装

``` App.vue
<script setup>
import {ref} from 'vue';
import VmodelChild from './components/VmodelChild.vue';
const inputs = ref("") //ref関数で監視する必要あり
const showvalue = () => {
    alert(inputs.value);
}
</script>
<template>
    <VmodelChild v-model="inputs" @click="showvalue" />
</template>

```
### 結果
子コンポーネントをクリックすると、親で定義した関数によって、その値を表示することができた。これは子コンポーネントで定義した値を親側から取り出せたことを意味する。

### 備考
defineModel(),ref()も、定義する変数型がどちらもrefなので、
.valueによってアクセスしなければいけない。

子コンポーネント側をinputタグにし、v-modelで監視すると、親子間の双方向バインディングも可能
【MyBatis-Plus】テーブルに存在しないフィールドの処理

## はじめに
MyBatis-Plusはエンティティクラスのすべてのフィールドをテーブルの対応するカラムにマッピングするため、テーブルに存在しないフィールドがある場合はMyBatis-Plusに無視される（生成されるSQL文に含まれない）ようにする必要がある。

## 解決方法
### 1. `@TableField` アノテーションを使用する
`@TableField(exist = false)` を付与して、このフィールドがテーブルに存在しないことを示す

```java:Entity
@TableField(exist = false)
private String noColumn;
```

`@TableField` のドキュメント：

https://mybatis.plus/en/guide/annotation.html#tablefield


### 2. `transient` 修飾子を付ける
`transient` 修飾子を付けたフィールドはシリアル化されない

```java:Entity
private transient String noColumn;
```

### 3. `static` 修飾子を付ける
`static` 修飾子を付けるとクラス全体で共有されるため、あまり使用されない。
また、static変数はgetter, setterを手動で設定する必要がある。

```java:Entity
private static String noColumn;

public static String getNoColumn() {
    return noColumn;
}

public static void setNoColumn(String noColumn) {
    User.noColumn= noColumn;
}
```

## 参考ページ

https://baomidou.com/reference/question/

https://www.jb51.net/article/221304.htm
ApexでカスタムオブジェクトのListをソート

なぜかカスタムオブジェクトのソートがSOQLのORDER BYで効かないことがあり、対策としてこちら
```apex
private class XXXInfoAccountIdComparator implements Comparator<XXXInfo__c> {
    public Integer compare(XXXInfo__c x1, XXXInfo__c x2) {
      return x1.AccountId__c.compareTo(x2.AccountId__c);
    }
  }
```
```
xxxList.sort(new XXXInfoAccountIdComparator()); // なぜかORDER BYが効かない場合がある(！)ので追加
```
型エイリアス

# 環境
* OS
Ubuntu 22.04.4 LTS
* コンパイラ
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 

# unsigned XXX
以下のような感じでエイリアスが定義されている
* usr/include/x86_64-linux-gnu/sys/types.h
typedef unsigned char __u_char;

* usr/incldue/x86_64-linux-gnu/bits/types.h
typedef __u_char u_char;
Kubernetes超入門 extra1 Harborで自分のDocker Private registryを作成する。

前回、Kubernetes超入門 part3 Reactアプリケーションの作成という記事を作成しました。

https://qiita.com/Yuumillar/items/de0057efc7c3a92b6466

ここで自分の作成したDockerImageをおいておく場所があると良いよね、という話をしました。DockerHubでも良いんですが、容量の制限とかいろいろありますので、個人用のPrivateなレポジトリがあると便利です。簡単に作成できるのでつくってみましょう。

ひとまずHarborのページは以下。

https://goharbor.io/

getting startedの通りにやっていけば良いのですが、簡単に説明しましょう。
Dockerが動く状態なら大丈夫です。

CPU 1core
Memory 2GB
Disk 40GB
くらいあればなんとかなりますが、Diskは不要イメージ消していかないとすぐに膨れ上がるので結構きついかもしれません。100GBくらいあると嬉しいですね。僕はproxmoxのubuntu22.04で動かしてます。

## online installerをGETだぜ

https://github.com/goharbor/harbor/releases

ここから拾ってきます。tgzを拾ってきて解凍しましょう。

```sh
wget https://github.com/goharbor/harbor/releases/download/v2.10.1/harbor-online-installer-v2.10.1.tgz
tar -xzvf ./harbor-online-installer-v2.10.1.tgz
```
そうするとharborディレクトリができているかと思います。
そこに`harbor.yml.tmpl`があるので、それをcpで`harbor.yml`にします。
中身をvimなどで覗いてみましょう。

hostname、harbor_admin_passwordあたりが重要です。databaseのpasswordも大事ですが、直接harborのDBを触りに行く機会はあんまりない＋外部に公開しないDBなので、どうでも良いといえば良いです。細かい設定については公式のドキュメントを読みましょう。動けば良いのであればPASSWORDとhostnameだけ調整してあげてください。

harborを外部からアクセスできるようにして使いたいのであれば、個人的にはcloudflareで安いドメインを買うのをおすすめします。そのあとcloudflare tunnelでreg.mydomain.comみたいな感じでアクセスできるようになります。個人開発ならtailscaleで公開もアリかな～と思いますが、いろいろなマシーンにtailscaleを入れなくてはならなくなる問題もあるので、やっぱりcloudflareで安いドメインを買っておくと勉強用によろしいかと。当然、自前のサーバーがあるのならば、そこに配置してnginxのreverse proxyなどでなんとかするのも良いです。

hostnameとPASSWORDだけ変更したら、あとは保存して`install.sh`を実行するだけ。自動的にdocker composeがはじまってharborが起動します。
JavaSilverを未経験から3ヶ月で合格した時を振り返る

Java Silverを取得しようと、勉強方法を悩んでいる知り合いがいたので、私が以前、Java SE 8 Silverを取得した時の勉強方法振り返ろうと思います。

# 当時のスペック
- progateを少し触ったことがある程度
- 前職時代の時

なので、能力は0と言っても良いでしょう。

# 勉強期間

- 開始日：2019年7月

- 試験日：2019年9月28日

約3ヶ月で、全くの未経験から合格することができました。

# 参考書

- 徹底攻略　Java SE 8 Silver 問題集
    - 黒本とよく言われるものです。（ぶっちゃけ、これのみです。）
    - 現時点の最新だと、[徹底攻略Java　SE　11　Silver問題集　［1Z0-815］対応](https://hb.afl.rakuten.co.jp/ichiba/1d5aa798.217b1dd2.1d5aa799.01b58bc8/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16069799%2F&link_type=hybrid_url&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJoeWJyaWRfdXJsIiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MSwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9)ですね


- [スッキリわかるJava入門](https://hb.afl.rakuten.co.jp/ichiba/1d5aa798.217b1dd2.1d5aa799.01b58bc8/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16099007%2F&link_type=hybrid_url&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJoeWJyaWRfdXJsIiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MSwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9)
    - Javaの概念が全く分からないところからなので、一番はじめに一通り、目を通しました。

# 勉強時間

- 平日：出勤前に30分、帰宅後1時間半

- 休日：土曜日、日曜日に4時間ずつ

章末問題を解く時間に2時間半〜3時間程かかりますので、休みの日に行うことをおすすめします。

合計で、200時間〜220時間です。


# 勉強方法

黒本を繰り返し行うのみです。

実際の試験では、結構黒本で出てきた内容がよく出てくるので、何度も繰り返して、あの時やったなと思えるようになりましょう。

## 1ヶ月目

スッキリわかるJavaを2周、繰り返しましょう。

初めの1周目は本当に分からないと思うので、分からないところで、ずっと立ち止らず、読み進めてください。

黒本を解く時に見直したりするので、その時に理解できます。

## 2ヶ月目（第1週〜第2週）

黒本を一度、一通り解き進めていきましょう。

ここで、ほとんど正解しなくてもいいです。僕も、初めの週末問題は2割とかでした。。。

しかし、間違ったところは、しっかりと解説を読み込んでください。

この時に、他の選択肢がなぜ違うかもしっかりと読んでおくことが大切です。

答えを覚えるのではなく、消去法ができる理由をしっかりと理解することが大切です。

## 2ヶ月目（第3週〜第4週）

2週間で、黒本を1周を終わらすペースで、解いては解説を見て、分からないところは、スッキリわかるJavaで理解することをひたすら繰り返しです。

この間で、間違った問題にはチェックを入れて、繰り返し行いましょう。

あっている問題は次の週に飛ばして、問題を解く回転数をあげましょう。

この時点で黒本を2周行ったことになります。

## 3ヶ月目（第１週〜第２週）

1週間で、黒本を1周を終わらすペースで、黒本をひたすら解き進めましょう。

ここでは、前の週にあっていた問題は飛ばして、間違った問題をひたすら解いていきましょう。

## 3ヶ月目（第3週〜第4週）

残りの2週間で、章末を中心に解き進めて、間違ったところを潰していきましょう。

合計黒本を6周行ったことになります。

# 結果

得点率70%で合格しました。

ボーダーライン65%なので、余裕ではなかったですが、合格しました。

初心者でも、これくらい勉強すれば、いけると思います。

# 受けてみて

「プログミングの学習は、とにかくコードをかけ」

と言われますが、知識を体系的にインプットするため、初めにやるのも良いかもなって思いました。

コード書いて勉強する時や実装の時に「あー、やったなー」と頭の片隅に出るのと出ないとは全く違います。
PythonによるMinxinという考え方

### Minxin
Pyhonにおいて、多重継承に問題がいろいろあるため、
継承によるクラスの拡張を簡単にできるやり方がある

### 基底クラス
```py
class Character():
    def __init__(self, HP, MP) -> None:
        self.HP = HP
        self.MP = MP
```
### Mixinクラス
```py
class CharacterMixin:
    def normal_attack(self, name):
        print(f'{name}が攻撃しました。')
        print(f'敵に{self.power}のダメージを与えました')

    def show_attack_power(self):
        print(f"攻撃力は{self.power}")

    def show_skill(self):
        print(f"持っている職業スキルは{self.skill}")

    def show_status(self):
        print(f'HP:{self.HP} MP:{self.MP} 攻撃力:{self.power} スキル:{self.skill}')

class MagicMixin:
    def io_attack(self, name):
        if self.skill["イオ"] == 1:
            print(f'{name}がイオを唱えました。')

    def mera_attack(self, name):
        if self.skill['メラ'] == 1:
            print(f'{name}がメラを唱えました。')

class WarriorMixin:
    def defence(self, name):
        print(f'{name}が敵の攻撃を受け流しました。')
```
### 職業クラス
```py
class Wizard(Character, CharacterMixin, MagicMixin):
    def __init__(self, HP, MP, power, skill) -> None:
        super().__init__(HP, MP)
        self.power = power
        self.skill = skill

class Warrior(Character, CharacterMixin, WarriorMixin):
    def __init__(self, HP, MP, power, skill) -> None:
        super().__init__(HP, MP)
        self.power = power
        self.skill = skill
```
### Playerクラス
```py
class Player():
    def __init__(self, name, job) -> None:
        self.job = job
        self.name = name
```
### 実行
```py
if __name__ == "__main__":

    # 職業クラス
    wizard = Wizard(HP=30, MP=30, power=10, skill={"メラ": 1, "イオ": 1})
    warrior = Warrior(HP=50, MP=0, power= 30, skill={"受け流し" : 1,"ためる": 1})

    # Playerクラス
    marin = Player(name="マリン", job=wizard)
    tuyoshi = Player(name='ツヨシ', job=warrior)

    # 名前の表示
    print("Player Name:", marin.name)
    # ステータスの表示
    marin.job.show_status()
    # できる攻撃
    marin.job.normal_attack(marin.name)
    marin.job.io_attack(marin.name)
    marin.job.mera_attack(marin.name)
    print('-------')
    tuyoshi.job.show_status()
    tuyoshi.job.normal_attack(tuyoshi.name)
    tuyoshi.job.defence(tuyoshi.name)
```
### 実行結果
```terminal
Player Name: マリン
HP:30 MP:30 攻撃力:10 スキル:{'メラ': 1, 'イオ': 1}
マリンが攻撃しました。
敵に10のダメージを与えました
マリンがイオを唱えました。
マリンがメラを唱えました。
-------
HP:50 MP:0 攻撃力:30 スキル:{'受け流し': 1, 'ためる': 1}
ツヨシが攻撃しました。
敵に30のダメージを与えました
ツヨシが敵の攻撃を受け流しました。
```
### 感想
Mixinで多重継承ができて、拡張しやすいと感じています。
通常の多重継承だと順番を気にする必要があるが、
Mixinの場合、基底クラス、共通メソッドクラス、カスタムクラスという順番を決めておけば、
それなりに使えるかと思います。
但し、4，5以上はお勧めしません。

事例で示してるのは、職業クラスからPlayerクラスに至って、継承をやめており、
職業をPlayerクラスのプロパティにし、
jobクラスが持っているメソッドを活用して、実行するようにしている。
なお、拡張する場合は、メソッドを増やすことができ、
攻撃相手（enemyなどクラス）を引数として、引き渡せば、それなりに拡張できると思います。

以上。
AWS Cognito User Pool 設定


AWS駆け出しエンジニアとして、AWS Cognitoの設定を投稿します。
今回は、UserPoolを設定し実際にテストアクセスするところまでを記述します。

## ■初期設定

1.「ユーザープールを作成」を選択
![Cognito1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/f15965ba-8bff-c5bb-5008-1aec57611a82.png)

2.「Cognito ユーザープールのサインインオプション」で「Eメール」を選択
![Cognito2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/c65304d9-1a44-5b6c-ba46-5fa8b53ccd06.png)

3.「多要素認証」は「MFAなし」を選択
![Cognito3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/258c638a-fdd6-6ae6-4836-a6c0c0f6ff98.png)

4.「E メールプロバイダー」は「Cognito で E メールを送信」を選択
![Cognito5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/8e99c812-86a2-dd68-7a5c-5e0104041b38.png)

5.「ユーザープール名」に任意の値を入力。「Cognito ドメイン」に任意のプレフィックスを入力
![Cognito6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/78b49f11-cbf8-7429-8544-c47d65979138.png)

6.「アプリケーションクライアント名」に任意の値を入力
「許可されているコールバック URL」に任意の値を入力（ログイン後の画面のURL）
※今回はS3の静的ＷEBサイトのURLを指定しています
![Cognito7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/7702d763-160c-8e19-66d0-5736c036450b.png)


7.設定確認画面で確認後、画面下の「ユーザープールを作成」を押下
![Cognito8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/adff678f-6a4a-f268-736a-969ddcdbfdf7.png)

8.以下のような画面に遷移したら、初期設定成功です
![Cognito9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/4054d148-bbd2-8702-debe-a4c809b0dfff.png)


## ■User の追加

1.設定した「ユーザープール名」を選択。「ユーザー」タブの「ユーザーを作成」を選択
選択後の画面で「Eメールアドレス」と「パスワード」
（実際にログインする際に使用する値となります）を入力。「ユーザーを作成」を選択
![Cognito10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/b633474a-55fa-d7a4-11f9-56ad01fd6ecd.png)


## ■テストアクセス

1.「アプリケーションの結合」タブ内の画面下「アプリケーションクライアント名」を選択
![Cognito11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/18072927-cce5-d99c-48e7-2e23bb69e424.png)

2.「ホストされた UI を表示」を選択
![Cognito12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/dc9ef605-ef15-ea43-887d-9ffcdb0d4a09.png)

3.Cognitoが準備したログイン画面が表示後に、
「メールアドレス」と「パスワード」を入力し「Sign in」を選択
![Cognito13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/77d5c111-26ce-df39-d6bc-e9d9c1c9c3f3.png)

4.パスワード変更を適宜変更後、「Send」を選択
![Cognito14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/c7740457-3d25-424f-79c4-81eb0aad5e2f.png)

5.ログイン成功した場合、「許可されているコールバックURL」に設定した画面が表示されます
※今回の場合は、事前にテストで作成していたS3の静的WEBサイトが表示されています
![Cognito15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/72ce3af7-30a0-4f82-03d5-5e39e38fca7b.png)
React公式ページで学んでみた12（備忘録）

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事を書きました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:
その中でもこれってどういう意味？とかつまづいたところを念入りに書いていこうかと思います。:fist:

# 今回の目的
前回の続きです。今回は「state ロジックをリデューサに抽出する」。被る部分もあると思いますが、後で振りかえって深掘りするきっかけになるのが理想です。細かく書くと大変なのであっさりめ。

https://qiita.com/mr_noppo/items/80422cc87ac468edfdde

# 使用したものや事前準備
・Macbook Pro
・Visual Studio Code

# 主に参考にさせていただいた記事
https://ja.react.dev/learn/sharing-state-between-components

# reducerは、stateを扱うもう1つの方法
reducerはstateをまとめて更新することができます。

useState から useReducer への移行は、次の 3 つのステップで行います。

1.state セットをアクションのディスパッチに置き換える。
2.リデューサ関数を作成する。
3.コンポーネントからリデューサを使用する。

## state セットをアクションのディスパッチに置き換える。
イベントハンドラ関数を全て置き換えます。
※例は公式ページから。
改めて更新のプロセスを振り返られて良いです。

### 変更前
イベントハンドラに処理内容を記述
```react
function handleAddTask(text) {
  setTasks([
    ...tasks,
    {
      id: nextId++,
      text: text,
      done: false,
    },
  ]);
}

function handleChangeTask(task) {
  setTasks(
    tasks.map((t) => {
      if (t.id === task.id) {
        return task;
      } else {
        return t;
      }
    })
  );
}

function handleDeleteTask(taskId) {
  setTasks(tasks.filter((t) => t.id !== taskId));
}
```

### 変更後
dispatchに"action"というオブジェクトを渡します。
actionには「何が起こったか（**type**）」の最小限の情報を渡す。
```react
function handleAddTask(text) {
  dispatch({
    type: 'added',
    id: nextId++,
    text: text,
  });
}

function handleChangeTask(task) {
  dispatch({
    type: 'changed',
    task: task,
  });
}

function handleDeleteTask(taskId) {
  dispatch({
    type: 'deleted',
    id: taskId,
  });
}
```

## リデューサ関数を作成する 
reducerに渡す、更新用関数を作成します。
```react
/*
tasks = reducer初期化時に返却されるstate
action = 更新用関数に渡した引数（今回はdispatchの引数)
*/
function tasksReducer(tasks, action) {
  switch (action.type) {
    case 'added': {
      return [
        ...tasks,
        {
          id: action.id,
          text: action.text,
          done: false,
        },
      ];
    }
    case 'changed': {
      return tasks.map((t) => {
        if (t.id === action.task.id) {
          return action.task;
        } else {
          return t;
        }
      });
    }
    case 'deleted': {
      return tasks.filter((t) => t.id !== action.id);
    }
    default: {
      throw Error('Unknown action: ' + action.type);
    }
  }
}
```

## コンポーネントからリデューサを使用する 

```react
/* 
tasks = state値
dispatch = ディスパッチ関数（ユーザアクションをリデューサに「ディスパッチ」する）
tasksReducer = リデューサ関数
initialTasks = 初期state
*/
const [tasks, dispatch] = useReducer(tasksReducer, initialTasks);
```

・全体の流れは下記の通りです。
ボタンを押す。
→イベントハンドラが発火
→更新用関数（今回はdispacth（tasksReducer関数）にactionを渡し実行
→tasksReducer関数内で、action.typeに応じて更新処理を実行
→state(今回はtasks）の更新
```react
  return (
    <>
      <h1>Prague itinerary</h1>
      <AddTask onAddTask={handleAddTask} />
      <TaskList
        tasks={tasks}
        onChangeTask={handleChangeTask}
        onDeleteTask={handleDeleteTask}
      />
    </>
  );
```

# 次
https://qiita.com/mr_noppo/items/049fd3ad53f5356fc35c
React：カスタムフックスによる際レンダリングの可能性


ReactでデータフェッチするフックスAを作成し、フックスBから呼び出していた。

フックスは下記のように呼び出すときには　**useDataGet()** と関数を実行しているわけですから、**呼び出したタイミングでフェッチされるわけです!!!** 

```
const { data } = useDataGet(); 
``` 


その影響でなぜこんなとこでレンダリングされているかわかりませんでした。
hooksとは値を渡すのではなく、関数を渡すために使いましょう。また、関数を渡すにしても呼び出し他タイミングで実行されるのかどうかも大切です。　気をつけて。

値はprops　または recoilなどグローバルステートの管理でもいいかもしれませんが、とにかくhooksでは際レンダリングにきをつけましょう。
【生成AIアプリ100チャレンジ】（17）コールセンター商品対応

https://ai.nuevo.jp/callcenter/


# 開発環境

|              |              |
|:------------:|:------------:|
| Server       | lightSail    |
| Language     | Python3.11   |
| Framework    | Django       |
| DB           | sqlite3      |

ローカル環境ではPythonのvenvを使用。エディタはvs codeです。

# 目的
商品情報を与えることでコールセンターの従業員の代役をできるかどうかを目的としたアプリ
声が男性なので、VOICE ENGINE API がリリースされたら女性の声に変更させたい。

商品情報を与えることで、簡単な問い合わせ対応はできる。
単純な問い合わせ対応ならAIが代用できる未来は近い。

# コード
```python:qiita.rb
    OPENAI_API_KEY = os.environ['OPENAI_API_IMAGE_KEY']
    chat_results = ""
    if request.method == "POST":
        form = TranscribeForm(request.POST)
        if form.is_valid():
            client = OpenAI(
                api_key = OPENAI_API_KEY,
            )
            audio_file_path = settings.BASE_DIR / "uploads/callcenter/user.wav"
            audio_file= open(audio_file_path , "rb")
            transcription = client.audio.transcriptions.create(
                model="whisper-1",
                file=audio_file
            )
            response = client.chat.completions.create(
                model="gpt-4",
                messages=[
                    {
                        "role": "system",
                        "content": """
                        新しいひとがやってきます
                        日本語で応答してください
                        あなたは浄水器のコールセンターで働くコールガールです。
                        この役割では、コールセンターで働く女性スタッフが、浄水器に関するお客様からの問い合わせに対応します。
                        彼女は親切で丁寧な対応を心がけ、浄水器の特徴やメリット、使い方、保守に関する質問に答えることが求められます。
                        例えば、浄水器の取り付け方法、フィルターの交換時期や方法、浄水性能についての説明が必要です。
                        また、購入後のアフターサポートに関する情報も提供します。彼女の役割は、顧客がこの浄水器を安心して使用できるように、正確かつ有用な情報を提供することです。
                        商品についての情報を記載します。
                        ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
                        この浄水器は、家庭用に設計されており、価格は4800円です。
                        寿命は1年間有効で、交換用のフィルターが必要になります。
                        デザインはコンパクトでモダンなものを想定し、主にキッチンカウンターに置くことを考慮したスタイルです。
                        この浄水器は、蛇口に直接取り付けるタイプであり、取り付けはユーザー自身で簡単にできるように設計されています。
                        浄水機能としては、塩素、重金属、細菌を効率的に除去し、水道水を安全で美味しい飲料水に変換します。
                        また、エコフレンドリーな素材を使用し、環境に優しい製品となっています。
                        ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
                        商品の問い合わせ対応のみ回答してください。
                        """
                    },
                    {
                        "role": "user",
                        "content": transcription.text
                    },
                ],
            )
            text_results = response.choices[0].message.content
            speech_file_path = settings.BASE_DIR / "uploads/callcenter/system.mp3"
            response = client.audio.speech.create(
                model="tts-1",
                voice="alloy",
                input=text_results
            )
            response.stream_to_file(speech_file_path)
            chat_results = speech_file_path
    else:
        form = TranscribeForm()

```


# アプリ画面
![スクリーンショット 2024-04-14 17.02.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398694/c0a7b170-07a8-9702-ac5c-37125c7b3465.png)

# 感想
コールセンター以外の職種でも会話対応できるかどうか、いろいろとチャレンジしたい。
Voice Engine APIのリリースが待ち遠しい。
【Laravel】ジョブ・キューとは/簡単な実装

# 環境
・Laravel10
・Windows11

# ドキュメント

https://readouble.com/laravel/10.x/ja/queues.html

https://laravel.com/docs/11.x/queues#introduction

# ジョブ・キューとは
時間の掛かる処理を非同期で実行する機能。

リアルタイムでの実行が適さないタスクをジョブとして定義
↓
キューに追加
↓
実行

使用用途
例）
・メール送信
・バッチ処理
・遅延実行

# データベースの準備
ジョブキュー実装のため、２つのテーブルをコマンドで生成。

## `jobs`テーブル生成
```
php artisan queue:table
```
ジョブをキューに保持するためのテーブルがされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/0b7537cf-c7a7-dc87-e0de-f53415fbb571.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/f9f30867-6140-8aca-e07f-a8ae350a67a5.png)
〇各カラムについて
・`queue`
`INSERT`されるとき、ジョブが属するキューの名前が入る。通常は`default`。
・`payload`（キューとも呼ばれる）
ジョブの実行内容がJSON形式で入る。
・`attempts`
エラー試行回数が入る。
・`reserved_at`
ジョブが予約された日時が入る。
・`available_at`
ジョブが処理可能になる日時が入る。

キューに追加されたジョブが以下のように保持される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/e5ade525-5d32-9a07-05dd-8e3882553d1c.png)


## `failed_jobs`テーブル生成
```
php artisan queue:failed-table
```
失敗したジョブを保持するテーブルが生成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/0e3a1996-2dea-f0d3-e6d5-14ddbdbe9a6b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/c8010965-905e-4b40-509d-bcd79be31d4a.png)
・`exception`
エラーログに記述される内容が入る。

### uuidとは
>ソフトウェア上でオブジェクトを一意に識別するための識別子である。分散システム上での利用を考慮して設計されており、統制なしに作成しても重複や偶然の一致が事実上起こらないものとして使用できる
[引用：https://ja.wikipedia.org/wiki/UUID]

## 環境設定
### .env
`QUEUE_DRIVER`を`database`に変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/36617bd4-b23c-a83d-7622-b682bc9e2758.png)

### config/queue.php
`driver`を`databas`に変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/2568c556-651c-9a62-9802-8c27f8b0a41a.png)

# ジョブのディスパッチ
`dispatch`メソッドを用いることで、ジョブをキューに追加できる。

```php:
SendEmailJob::dispatch($user);
```
バッジやコントローラー内などに記述。

### ジョブの実行を遅延させる
例）～分後に実行
```php:
SendEmailJob::dispatch($user)->delay(now()->addMinutes(5));
```

# ジョブクラスの生成
キューに登録するジョブはジョブクラスとして作成する。
```
php artisan make:job SendEmailJob
```
`App\Job`配下にファイルが生成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/5f712305-9ed3-6815-6abb-10923c16d073.png)
・`Illuminate\Contracts\Queue\ShouldQueue`インターフェイス
非同期でジョブをキューに投入し、実行することを宣言。
・`handle`メソッド
ジョブがキューで処理されるときに呼び出される。

# キューに投入したジョブを実行
**キューワーカーとは**
キューに貯め込んだジョブを実行する。

以下のコマンドで、キューワーカーを起動し、キューに投入したジョブが実行される。
```
php artisan queue:work
```


※実行されたジョブは`jobs`テーブル内からなくなる。
# 参考記事

https://yurupro.cloud/3691/

https://qiita.com/y_o_28/items/f99448add1411acd31a7

https://laravel10.wordpress.com/2015/05/07/%E3%82%AD%E3%83%A5%E3%83%BC/
「Python 3.12.2 ドキュメント」を読んでみる　その２

# はじめに
　プログラミングの勉強をしようと思っても何から始めたらいいかわからないので、とりあえずQiitaのリンクを辿って、公式リファレンス（ドキュメント？）に目を通すことにしました。この記事はそのメモですが、如何せんプログラミングの知識がほぼない人間の解釈ですので、勘違い、間違い、誤解等多数あるかと思います。

https://docs.python.org/ja/3/tutorial/index.html

# 「2. Python インタプリタを使う」を読んでみる

https://docs.python.org/ja/3/tutorial/interpreter.html

## 用語
Unix シェル：
「Unix」はOSの１種で、「シェル」はOSを操作するプログラミング言語。
コマンドを入力することでパソコンの操作をする機能。
GNU Readline ライブラリ：
読みは「グニュー　リードライン　ライブラリ」。コード入力を補助する機能を提供してくれる。
引数：
読みは「ひきすう」。「いんすう」だと「因数」と混同してしまうから。
関数に渡す値。

## 概要
・PythonがインストールされたWindowsPCなら、WindowsPowerShellに「python3.12」と入力してEnterすればPythonが起動するよ。
・Pythonを終了するときは「quit()」と入力すればいいよ。
・行頭に「>>>」と表示されているところにコードを入力するよ。
・行頭が「...」の行は前の行から続いているよ。


## 疑問
「対話的行編集」とは？「対話入力編集」と同じ？
「ヒストリ置換」とは？
「コード補完」とは？
「コマンド」と「モジュール」って何が違う？

## 後記
自分としてはしばらくはGoogleColaboratoryGoogleを利用する予定つもりなので、起動と終了は今じゃなくてもいい内容
「モジュール」と「コマンド」はイマイチ区別がつかなくて、「まだコーディングをしていない段階でそんなこと説明されても・・・」というのが率直な感想。このドキュメント自体がプログラミングの初学者向けではないのかな？
Amazon APIGateway同士を連結してみた

案件でAPIGatewayを使っているのですが

バックエンドに繋いでいた
オンプレのアプリがAWSに移行してAPIGatewayを持つようになり、
こちらでも繋ぎかえの設定が必要になりました。


しかーし、このAPIGateway同士の接続なかなか情報がなく。。
（APIGatewayという性質上、２つ繋ぐなんて需要ないんでしょう。）
苦労の末なんとか繋げたので簡単な備忘録を書いときます。

# 元々の構成
* プライベートAPIなのでVPCエンドポイント経由でAPIGatewayを呼ぶ。
* バックエンドはVPCリンク、NLBを介して外部サーバへ。(通信はhttps)
![スクリーンショット 2024-04-14 16.01.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769853/90ac68dc-056f-6223-e36a-020c82ba5e3f.png)


# バックエンド環境の変更・課題になった点
[変更点]
* アプリがECS上に移転。フロントにAPIGatewayが立つ。
* これまでNLBはIPベースでサーバを向いていたが、APIGatewayのIPはユーザにはわからないので直接指定はできなくなる。

[課題になった点]
* もともと指定していたエンドポイントURLは何に差し替える？
* NLBから相手のAPIGatewayへは何をターゲット指定したら良い？

![スクリーンショット 2024-04-14 16.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769853/8a5e6a9e-88ef-5e92-20c5-485fd92a5986.png)

こちらの環境のAPIGatewayを廃止して、クライアントから直接向こうのAPIGatewayを呼べたらこんな課題は発生しないのですが、
そうもいかない事情があり、なんとかしてこれを繋ぐことになりました。

ちなみに新しいAPIGatewayもプライベートなので、
呼ぶ際にはVPCエンドポイントを経由する必要もあります。

# 決定した構成
検索しても全く同様の事象が見当たらず、AWSに問い合わせても、
「つなげる方法は持ち合わせておりません。」と言われる始末。
しかし知見者に意見をもらってあっさり接続成功。

こんな方法があったとは。。
* エンドポイントURLはAPIGateway上で払い出されるURLでOK。
* NLBはVPCエンドポイントをIPアドレス指定、ヘルスチェック確認。(VPCエンドポイントはNLBからの通信に対する穴あけが必要)
* 新バックエンド側でもリソースポリシーにこちらのVPCエンドポイントを追記し、通信許可リストに入れる。

![スクリーンショット 2024-04-14 16.42.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769853/d9cb59d5-5be5-7bc5-af3c-aa678219311e.png)
プライベートAPIはVPCエンドポイントのIPアドレスベースでは呼べないイメージだったのですが、NLBから直接VPCエンドポイントを指定しても呼べるんですね。
勉強になりました。
「現代数理統計学の基礎」演習問題解法メモ　第8章問8～10

問8よくわからず。
なんとか、ここまでUPできました。
これで「現代数理統計学の基礎」終わります。
![第8問8 P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/83176080-7479-b0fb-3ec5-34d8ab7dcd12.jpeg)
![第8問8 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/8368ab33-5b1d-9ddf-eae1-ed0a90edb5a8.jpeg)
![第8問9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/c15e40f7-a0c8-0373-e23d-1955fffd8c13.jpeg)
![第8問10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/13d300fe-16e3-c483-93f5-5ae993910950.jpeg)
SpringBootでシステム起動時に独自処理を追加（ログ出力など）

# この記事はこれの続きです

https://qiita.com/waokitsune/items/a6b2f281b99135cbc5b8

# ApplicationRunnerクラスの実装

SpringBootにはApplicationRunnerという名前の抽象クラスが用意されています。
これを実装するとシステム起動時に独自処理を追加できます。


```java:NekoApplicationRunner.java
package com.example.demo;


import java.net.InetAddress;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;


@Component
public class NekoApplicationRunner implements ApplicationRunner {
	
	
	private final Logger log = LoggerFactory.getLogger(this.getClass());
	
	
	@Override
    public void run(ApplicationArguments args) throws Exception {
		
		
		String server_name_ = InetAddress.getLocalHost().getHostName();
		log.info("サーバー名" + server_name_);
		
		String ip_address_ = InetAddress.getLocalHost().getHostAddress();
		log.info("サーバーIPアドレス" + ip_address_);

        String tomcat_version_ = org.apache.catalina.util.ServerInfo.getServerInfo();
        log.info("Tomcatバージョン" + tomcat_version_);

        String java_version_ = System.getProperty("java.version");
        log.info("JAVAバージョン" + java_version_);
        
        String encoding = System.getProperty("file.encoding");
        log.info("ファイルエンコーディング" + encoding);
        
        String user_name_ = System.getProperty("user.name");
        log.info("システム実行ユーザー" + user_name_);
        
        
	}

 
}
```

# 実行結果

SpringBoot側の準備が終わった後に実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/381cebc4-f49c-144a-335b-150482b9525c.png)

# この記事の続き

https://qiita.com/waokitsune/items/5e2e071687f8ca354805

# バージョン

Microsoft Windows [Version 10.0.22631.3447]
JAVA 17.0.10
Spring Boot v3.1.10
【Simulink】Simulink Support Package for Raspberry PiでSunFounderを動かす(4)

# はじめに
Simulink Support Package for Raspberry PiでSunFounderを動かす[(1)](https://qiita.com/nrykot/items/ece75417703b90ae2b4c)、[(2)](https://qiita.com/nrykot/items/ae3c6dd8b08b3e1a1938)、[(3)](https://qiita.com/nrykot/items/b3c0d140564043c91ae3)の続きであり、最後の記事になります。
これまでの記事では、Simulinkモデルの内容について説明してきました。
本記事では、作成したSimulinkモデルをコード生成して、Raspberry Piに展開する方法について説明します。

# SimulinkモデルをRaspberry Piへ展開
Simulinkエディターのリボンから［ROS］-［配布］-［ビルドと実行］を選択します。
![BuildAndExecute.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/f3b9c136-7e55-cb64-9dd7-70b04d65610b.png)

ビルドが正常にすると、Raspberry Pi上でプログラムが実行されます。
![DiagnosticViewer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1400007/a50c9940-f04a-5bad-7119-500b271559b7.png)

実行例を以下に示します。
<iframe width="1280" height="720" src="https://www.youtube.com/embed/lkMzPX9l5I4" title="Simulink Support Package for Raspberry PiでSunFounderを動かす" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
ポートフォリオ完成までの道のり

## 概要
目標：ある会社のフロントエンドエンジニア職にアルバイトとして受かること。そのためにポートフォリオを作成していく。
投稿内容：毎日目標に向けてやったことを記録していく
また、この記事では初めてポートフォリオを作る人のリアルな進捗を伝えたいので、途中で設計を変更したりしてもどんどん後付けで書いていく。

## 意識すること、条件
**・一貫性のある内容**
**・使われるサービス+採用のアピールになるもの**
**・分割法で作成する**

・next.jsで開発する
・Githubを使って開発、公開
・バグがない
・簡単なものを改善していく
・デプロイする（AWSかVercel）
・（team開発）

### やっていくこと
目標は**フロントエンドエンジニアとして雇ってくれるアルバイト先に受かるためのポートフォリオを作成する**こと。

大きくやることは以下の４つ
①どんなポートフォリオを作成することで採用されやすいのか調査
②調査結果をもとに設計
③設計を実装に落とし込む
④ブラッシュアップ

## やることの細分化

## ①どんなポートフォリオを作成することで採用されやすいのか調査
**・一貫性のある内容**
**・使われるサービス+採用のアピールになるもの**
**・誰のどんな問題を解決するのか、用途が明確なもの**
・UI/UXが整っていて使い勝手がいい
・レスポンスが良好
・書かれている内容が実際にサービスとして公開された時のことを考慮したものであること
・機能数が十分多いこと
・READEMEが整理されていること
・可読性の高いコード
・テストが十分書かれている
・Githubを使って開発、公開
・バグがない
・簡単なものを改善していく
・デプロイする（AWSかVercel）
・（team開発）

## ②調査結果をもとに設計
・機能の一覧表を作成
・簡単な画面遷移図と画面一覧を作成
・データベースのスキーマを設計
・next.jsで開発する(TS+React)
・インフラとバックエンドはAWS（？）

## ①のメモ
NYK再建民をつなげるSNSアプリを作りたい!

NYK再建とは・・・NYK再建はNBAの人気チームnewyorkknicksのファンが集まるyoutubeのコミュニティです。以下のリンクからチャンネルに飛べます。
[NYK再建プロジェクト](https://www.youtube.com/@nyk5223)

プログラミングの力で誰かの小さな問題から大きな問題まで解決したい（一貫性）

NYK再建民という最高のコミュニティがあるのになかなかオフラインで出会うような機会を作ることができない。東京ではオフ会を開催していたが、地方で開催することは難しい、、そこでそれぞれの地域の再建を繋げ、オフラインで会えるようなSNSを作成したいと思った。
使われると想定する人たち・・・NYK再建民（特に地方の人たち）
採用のアピールになるもの・・・自分でサービスを１から作成した経験
どんな問題を解決するか、用途・・・オフラインで会うことが難しい人々をつなげることができる

## ②のメモ
**機能の一覧**
ログイン画面
新規登録画面
登録してくれた人たちのプロフィールの一覧を表示するメインページ
プロフィールを作成するためのページ（できたら、メインページからそれぞれの人のプロフィールに飛ぶことができるものを作成する。）

**画面遷移図と画面一覧表**
![uploading...0]()

**技術選定**
書籍　：next.js+mongoDB+vercel
今回：next.js++mongoDB+vercel+nextauth.js

## ③設計を実装に落とし込む
まずは大きく３つに分けて開発していく。
1.まったくあたらしいnext.jsプロジェクトをvercelにデプロイする。
2.アプリの内容は書籍と同じ状態でデータベースとインフラをmongodb,vercelに変更する
3.アプリの内容を変更し、今回使用したい技術で開発する

### 1.アプリの内容は書籍と同じ状態でインフラのみVercelに変更し、デプロイする
まず、DBをmongoDBで動かせる状態にし、ローカル上ではアプリが完成した。
あとは前に書いた記事に基づいてデプロイをしていく。
ここで問題発生。mongoDBをAWSに接続しようとすると大幅に労力がかかってしまう。またAWSのサービスを使うならDynamoDBの方が開発がしやすい。そこでdynamoDBに変更していこうと思う。よってまず行うことを以下に変更する。

### 1.まったくあたらしいnext.jsアプリをaws amplifyにデプロイする。→これを変更し、vercelへデプロイする
aws amplifyへの自動デプロイとローカルの初期化まで完了。ここからはnext.jsにcognitoを追加する方法だけをまずは学んでいく。
next.jsにcognitoで認証機能をつけるのがとても難しい。というかなぜかできない。

next.jsにawsのサービスを使ったものの情報が少ないのでまずはvercelで作成してみる。
完成版をgithubからダウンロードし、それを自分のレポジトリでアップロードする。そしてまたそれをvercelでデプロイする。
①vercelに前編のソースコードをデプロイ
②vercelに後編のソースコードをデプロイ

デプロイがやっと完了した。そして基本的なデータはデータベースと接続して変更した。
あとは
・　認証機能
・サイトの微調整を行う
次はitem/updateファイルの編集から

### 2.アプリの内容は書籍と同じ状態でデータベースとインフラをmongodb,vercelに変更する

インフラをvercel、データベースをmongoDBに変更
・readsingleページの修正、編集ページの修正

### 3.アプリの内容を変更し、今回使用したい技術で開発する
・画像のアップロード機能
・javascriptからtypescriptに移行する　→辞めて新機能を追加する
・認証をnextauth.jsに変更する　→JWTで最低限の機能にとどめる
・ヘッダーのタイトルの横に再建民のロゴを載せる
・メインページの背景に画像を載せる。MSGの写真など

### ここまでで設計図に記載した機能は実装が完了した
よって次は新たな機能の追加に移っていく。
・候補１　google map APIを使ってNBA観戦ができる店を検索できるページを作成する。
Next.jsにgoogle map apiを追加する方法を理解した。

page.js（クライアントコンポーネント）でマップを表示する仕組みはできた。だが外部APIのデータを直接クライアントコンポーネントで読み込んでいることや、まだピンを一件しか立てれていないことが問題。なのでここから修正することは
・route handlerを使用して外部APIから情報を取得する
・ピンを複数たてられる仕組みを作る、つまりデータベースを作成する。

サーバーサイドの処理も考え始めるとかなりややこしくなってきた。なので一旦はクライアントサイドで複数のピンを表示できるような仕組みをつくる
Pythonおすすめの書籍(2024)

## 概要
私がこれまでに読んだPython関連書籍からおすすめのものを抜粋して分類・評価しました。
> **抜粋2冊**

## 本ページの見方
点数は、下記の基準で５段階に★を付けました。  
（抽象的で平易な場合）
> **具体的　★★★★★　抽象的**

> **平易　★☆☆☆☆　難解**

# おすすめの書籍一覧
## 文法解説書
[『Python基礎＆実践プログラミング』](https://www.amazon.co.jp/Python%E5%9F%BA%E7%A4%8E%EF%BC%86%E5%AE%9F%E8%B7%B5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%EF%BC%BB%E3%83%97%E3%83%AD%E3%81%B8%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%EF%BC%BD-impress-top-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B0854KZK66/ref=sr_1_24?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2PJTN12PGAW1D&dib=eyJ2IjoiMSJ9.nkwUa6ALRziBXbRoYDVL4WwXZbs7ZVbx4IyRparJJOOHU8J7BzKl4zBjHhz5WcIUf7tmG-wiZXO7KAoJay4eHCS0Ih9tx6sMwJgXMwM7Bpf5QuoOch0CHZ15sXvPfRIgBY8QxKx25AWHeBgE2K_2w2HVaWMo9eKit7J368JXt142EdB6U8J7pA7XxX-OqyV4rwSzu7JUh0_rfg8yZw5EQOHXlHy7XSMBNQhNj9kPKSZmUp40atQecRp2KXLVYXAZZJjLXo-dHOlCAz7cjYA8oD11TpKgmfAsKnhvjyvoMEI.F5panXX_Mqtiw5H_44VPTo7IhEqWioEoQsD2FhEN8Os&dib_tag=se&keywords=Python+%E5%AE%9F%E8%B7%B5&qid=1713065640&sprefix=Python+%E5%AE%9F%E8%B7%B5%2Caps%2C184&sr=8-24)  
**具体的　★★☆☆☆　抽象的**  
**平易　★★☆☆☆　難解**  
Pythonの文法解説書は良いものを探すのが本当に大変です。
本書は文法解説編とサンプル作成編になっています。
文法解説だけの書籍ではないので文法解説の分量は少ないですが、必要な内容がコンパクトにつまっていると感じました。
サンプル作成編についても、上級者が書いたPythonの良質なサンプルという意味で参考になります。

## プラクティス集
[『エキスパートPythonプログラミング 改訂3版』](https://www.amazon.co.jp/%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88Python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E6%94%B9%E8%A8%823%E7%89%88-Michal-Jaworski/dp/4048930842/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2F7P8TJE8QEUG&dib=eyJ2IjoiMSJ9.nYoKIe5ReJFp00WGUvwtSlWjX_lzO1C3PaJ5kL1raQsXLikkcIDz4e6knabguE8-QyG9UH57QHA_UJ_DRT0UugGwHfa2NeK2NFbABajpJsQ822dq4MA2ANXYsMLXNQbBNqA6rcJzPkVRy-HVnQvET7acZ5IeT3AOHgGVYXUA3GXBVDO1X0wcHU59qIrUnkc5Vg1TuHdUjZC60Y1xxV2e-yIfwg6ytFycdA8OHrDMb12z1XJWmhncrIt3Eytw_wBPq7I1vWyW7tF2mHAKpOSyusZfTzFZ1omhzONrt618nGU.XsNImey4DsYnvPX0hnuU7Pbjg708h53D0MooexHfX78&dib_tag=se&keywords=%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88Python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1713065475&sprefix=%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88Python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%2Caps%2C167&sr=8-2)  
**具体的　★★☆☆☆　抽象的**  
**平易　★★★☆☆　難解**  
Pythonの最新プラクティスがつまった書籍です。
文法に関するプラクティスのみならず仮想化やテスト、ドキュメンテーションも視野に入れた内容になっています。
この書籍で初めて知る内容もたくさんあると思います。
さらっと読むだけでも最新の動向を確認できて面白いです。
＊2023年中盤に第4版が出版されました。

## ふりかえり
Python関連書籍は多く出版されているものの、データ解析に特化したものや読みにくいものも多く選定が難しいと感じました。
また今回は洋書の翻訳版が多かったですが、和書でもいいものが出版されているかもしれません。
「他にも必読の書籍がありますよ」という意見あればコメント頂けるとありがたいです。
【個人開発】キリ番を祝ってくれるGithub Actionsをリリースしました🎉【Go】

# 宣伝

GithubのIssue, Pull Requestには連番で番号が振られています。
この番号においてキリ番(キリの良い番号の略)を踏んだときに、誰も祝ってくれないのは寂しくないですか？
[kumackey/kiriban](https://github.com/kumackey/kiriban)を使えば、キリ番を踏んだときにコメントで祝ってくれます！🎉

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496036/43ffb89d-136a-f8dc-be04-1f279c9cd070.png)

![comment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496036/f3ab73df-60e2-e482-e452-cf010d08dc37.png)

今までキリ番を踏んだ人のリストや、次のキリ番も予告してくれます。

# 使い方

[README](https://github.com/kumackey/kiriban/blob/main/docs/ja.md)に書いてある通りではありますが、このアクションが動作して欲しいリポジトリの`.github/workflows`に、以下のようなymlファイルを追加するだけです！

```yml:.github/workflows/kiriban.yml
# .github/workflows/kiriban.yml

name: kiriban

on:
  issues:
    types: [ opened ]
  pull_request:
    types: [ opened ]

jobs:
  kiriban:
    runs-on: ubuntu-latest
    steps:
      - uses: kumackey/kiriban@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

`GITHUB_TOKEN`はメッセージをコメントをするために使っています。

# 開発

## キリ番判定

これが本リポジトリのコアロジックです。
キリ番ライブラリとして汎用的に使えるよう、[kiribanパッケージ](https://github.com/kumackey/kiriban/tree/main/kiriban)として切り分けてます。
キリ番には大きく分けて3つ存在していると分析し、実装しました。

- 丸まった数字: 10, 200, 3400
- 繰り返される数字: 11, 222, 3333
- 連続する数字: 123, 4567, 98765

他は1221みたいなミラ番をキリ番とするとか、結構キリ番にも宗派があると思います。
pull requestを歓迎しております。

## 言語

Goを選択してます。
~~選択してますというか、まともに書ける言語がGoしかない~~

キリ番には宗派があり、色んな要望に対応できるよう、functional options patternを用いて、オプションで判定方法を変えられるようにしました。
https://github.com/kumackey/kiriban/blob/main/kiriban/options.go

## カスタムアクション

リポジトリのrootに`action.yml`を置くことによって、カスタムアクションを作成することができます。
[About custom actions - GitHub Docs](https://docs.github.com/en/actions/creating-actions/about-custom-actions)

Types of actionsは`composite`で作りました。
`javascript`でなければ`docker`か`composite`しかなく、起動時間を気にして`docker`でなく`composite`にしました。

## Githubのissueのデータ取得やコメント

以下のライブラリを使いました。
[google/go-github](https://github.com/google/go-github)

# その他

番号10から祝ってくれます。
みんな使ってみてね！
あと、issueやpull request、大歓迎です！

[kumackey/kiriban](https://github.com/kumackey/kiriban)
Javaおすすめの書籍(2024)

## 概要
私がこれまでに読んだJava関連書籍からおすすめのものを抜粋して分類・評価しました。
> **抜粋2冊**

## 本ページの見方
点数は、下記の基準で５段階に★を付けました。  
（抽象的で平易な場合）
> **具体的　★★★★★　抽象的**

> **平易　★☆☆☆☆　難解**

# おすすめの書籍一覧
## 文法解説書
[『Javaプログラマ Silver SE11 スピードマスター問題集』](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Silver-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86-%E8%A9%A6%E9%A8%93%E7%95%AA%E5%8F%B71Z0-815/dp/4798162035/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=5Q3SPXU1C4FS&dib=eyJ2IjoiMSJ9.dz4nqS5S0GQ-ITiEpRmzJsCVoF0O5GmN85rcHqUedVVAXJIqBjwLGNukXLIKsx7B1cYZR-MFIx8FyXk0qzbSt1LzCC0ZGoWz2pLlNTAmPYi6Y5YTXkkGA2btbn-3dsPMHWfEZ5w-uU8d15212xlQ4iTslmhu6gYFMgKaPlWkGbyoMsY7Iv_-CqpPKjpBU0eqK0pNsQLBiA9Kdx8SL70WQzEutNvo1hwZuOV-36WjQkg.Bd8sHj4zWQurmvbuwXGKVIBFMHQq8dcuXqaM4HbKpeA&dib_tag=se&keywords=java+se11+silver&qid=1713063962&s=books&sprefix=java+se+11+silver%2Cstripbooks%2C251&sr=1-5)  
**具体的　★☆☆☆☆　抽象的**  
**平易　★★☆☆☆　難解**  
Javaの文法解説書は決定版的なものがなく、OracleのJava資格試験の参考書が文法解説書としても意外と役立つかもしれません。
複数の版がありますが、白本と呼ばれる本書は黒本と呼ばれる「徹底攻略Java SE 11 Silver問題集」に比べて解説の分量が多いです。
ちなみに本番試験の対策としては黒本のほうが定評があるようです。
目次を見れば分かりますが、文法の種類ごとに章立てされているため順序立てて勉強できる構成です。
試験問題自体が少し凝ったものになっているので最終的には十分な知識が身に付きます。

## プラクティス集
[『Effective Java 第3版』](https://www.amazon.co.jp/Effective-Java-%E7%AC%AC3%E7%89%88-Joshua-Bloch/dp/4621303252/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=14MAQY2RM44I&dib=eyJ2IjoiMSJ9.SLb0SkmEvnh0s-ZzMK8IAaq7cebh_cMZ8wYit0m07fwQdMx_-vTqO8TuXGpqYRxU6x_Uqfb9wnMR69_w-rd2lE2jfblVjMY-EzKIB3t0QIyHxX77N3vK5jYeMxVcw6vHmhdc8AC3b-Vjhhg6iBd2CSlZtUQb4mZSjEwlsNzIn4S6NRvmgbbE3v4Bxbk0FdldTpD9mPvAYwNRGQ-oPgT5WCfK3duFs4LWG1veEecNynU.hxgFKpNMUIdDDxI8nhUbs0PJbCAE-mj55irJeN2_2AQ&dib_tag=se&keywords=Effective+Java&qid=1713066523&s=books&sprefix=effective+java%2Cstripbooks%2C162&sr=1-1)  
**具体的　★★☆☆☆　抽象的**  
**平易　★★★★☆　難解**  
JavaのEffectiveシリーズです。Effectiveという名前は各言語で出版されているプラクティス集にも付けられています。
内容は全90項目で、Javaで推奨されるコードと避けるべきコードが解説されてます。
Java特有の項目もありますが、オブジェクト志向言語の特徴に由来するプラクティスも多いです。
推奨される理由、推奨されない理由が対比されながら解説されるので読み応えがあります。
プラクティス集と聞くと利用方法が限定されるようにも感じますが、解説の内容をよく読むと実際のコーディングに活かせる知見が多く得られます。

## ふりかえり
Javaの書籍は古いものも多く、新しい内容で良い書籍は少ないように感じました。
その点で、Java資格試験の参考書も価値があると思って掲載しました。
「他にも必読の書籍がありますよ」という意見あればコメント頂けるとありがたいです。
C#おすすめの書籍(2024)

## 概要
私がこれまでに読んだC#関連書籍からおすすめのものを抜粋して分類・評価しました。
> *抜粋3冊**

## 本ページの見方
点数は、下記の基準で５段階に★を付けました。  
（抽象的で平易な場合）
> **具体的　★★★★★　抽象的**

> **平易　★☆☆☆☆　難解**

# おすすめの書籍一覧
## 文法解説書
[『独習C++ 第3版』](https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92C-%E3%83%8F%E3%83%BC%E3%83%90%E3%83%BC%E3%83%88%E3%83%BB%E3%82%B7%E3%83%AB%E3%83%88/dp/4798103187/ref=sr_1_7?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3FA58BBPLFWZW&dib=eyJ2IjoiMSJ9.k2tFNcYt9lyhWZ0bmseEYAYNd6isXnF5P3enbnZdHI8kmW8J5hyUIvzWVmm3PdOeskfGOGkw_8Od3f4KiZFqIqihhgBQRR5v9cRkoVISuNTgUkLGfdEiX3yrnaak9qiJMbMYnSM_wXiNJLani-jKcqPLtgJ2Ffti7Gy2c4-OQzkjI-oPchjpkU4oEB_in5YOnK-SLPCj9t7uLFuna9PF7A_6s3p3BRFSdMvvjqVgNBI.IctZzhNh0V55OM_vuytkXaq1CPAGg9azUnC17yt9LZA&dib_tag=se&keywords=%E7%8B%AC%E7%BF%92+C%2B%2B&qid=1713061950&s=books&sprefix=%E7%8B%AC%E7%BF%92+c+%2Cstripbooks%2C228&sr=1-7)  
**具体的　★☆☆☆☆　抽象的**  
**平易　★★☆☆☆　難解**  
C++の文法解説書です。独習シリーズ自体が人気のシリーズになっています。  
複数の版がありますが、世界的に定評のあるハーバート・シルト著のものが第４版までです。（最新版に比べると内容が古くなっている点はマイナスです）
これ１冊で基本的な文法をもれなくほぼ正確にマスターできる内容になっています。

[『独習C# 第3版』](https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92C-%E7%AC%AC3%E7%89%88-%E3%83%8F%E3%83%BC%E3%83%90%E3%83%BC%E3%83%88%E3%83%BB%E3%82%B7%E3%83%AB%E3%83%88-ebook/dp/B015IXBSMM/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1LHR460IW6ARU&dib=eyJ2IjoiMSJ9.2plsIfJWOzRqWev8RtPtGAvYR5l_XKWJGuSZBdeJWdsivXSGgJPnNCVvs2FnZ3FniImT1mJ8yQr6jnCmBt-59pxT6VRclqw4O9TH8CC51Qxi4F5RU20wUK59RnShV59dOqO57TqOeirY2kzJI2lqskJsMV9zP-x1n2QS7aHSXg34uM9LTDdYbDn67bZzzkDNGvmcp_9bDaR9h9b9dGxvkffHigvEiXFciveOFB4zegs.sk0cE0lgoi2wHEzpTB4G7FHg3Mr8Ids46lDLRRS0GwA&dib_tag=se&keywords=%E7%8B%AC%E7%BF%92C%23&qid=1713063130&s=digital-text&sprefix=%E7%8B%AC%E7%BF%92c+%2Cdigital-text%2C145&sr=1-3)  
**具体的　★☆☆☆☆　抽象的**  
**平易　★★☆☆☆　難解**  
C#の文法解説書です。独習シリーズ自体が人気のシリーズになっています。  
複数の版がありますが、世界的に定評のあるハーバート・シルト著のものが第３版までです。（最新版に比べると内容が古くなっている点はマイナスです）
これ１冊で基本的な文法をもれなくほぼ正確にマスターできる内容になっています。

[『プログラミングC# 第8版』](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0C-%E7%AC%AC8%E7%89%88-Ian-Griffiths/dp/4873119367/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=7H893TNOHT2K&dib=eyJ2IjoiMSJ9.Tm8Jg-S_4PnY5Gb79_IGdfSYx_Pa46c9STrfXD3IyNOA91xFmH2B3oPrHIt5BCUNazN4XRyxV6jWNxeK0TgOF-dsNBZaXMGQJoGui7gKQXvhg-nTMS18NkQvQzeU-H_PPF6M3L9BxQlbG9hlHPSA-p1ynW44PxXSYUk3AM4imeS_g9-U07KndyEeTddKyJyhqYfPI7IuQdJ58Cw7CNI4kH4T87m0R54JXTK3_KpTh8I.fGDKCs5cmxKb2r_IIMQA7G70J2UZtq9uSDDNhMre2SY&dib_tag=se&keywords=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0C%23&qid=1713070686&s=books&sprefix=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0c+%2Cstripbooks%2C167&sr=1-1)  
**具体的　★☆☆☆☆　抽象的**  
**平易　★★★☆☆　難解**  
C#の文法解説書です。私は本書をC#文法解説書の決定版にしました。  
内容は非常に充実していて分量もかなり多いです。
項目が網羅されているだけでなく、1つ1つの解説も細かく丁寧です。
注意点としては、最初に買って一気に読む書籍ではないです。
リファレンス的に保有しておいて、困ったときに読むといい感じです。

## ふりかえり
本ページで紹介した書籍は、比較的分量が多い書籍もありました。
C#は年々多機能になっている傾向があるので古く定評のあるものと最新のもの両方を読んでみるほうがいいかもしれません。
「他にも必読の書籍がありますよ」という意見あればコメント頂けるとありがたいです。