OmniAICreator/Qiita-1.07M huggingface dataset:
axios（Promise）で通信が成功しているのにcatchに入ってしまう

# 現象
JSでaxiosを使って通信処理を書いたときに、通信が成功しているのにcatchの処理が走っていた。
通信が成功しているのは開発者ツールのネットワークタブで確認済み。
問題のコードは以下。
実際にはいろいろと処理を書いているが、この記事では必要な部分だけを抽出。
API呼び出し時に共通の処理が入るため、_axios.jsにaxiosのインスタンス化と共通処理を書き、
Customer.jsでそれを呼び出し使用。
```_axios.js
import axios from "axios";

export const _axios = createAxiosInstance();
function createAxiosInstance(){
  const axiosInstance = axios.create();

  axiosInstance.interceptors.response.use(
    (response) => response,
    (error)=>{
      if (error.response) {
        console.log(error.response.status);
        console.log(error.response.data);
        console.log(error.response.headers);
      } else if (error.request) {
        console.log(error.request);
      } else {
        console.log('Error', error.message);
      }
      console.log(error.config);
      return Promise.reject(error)
    }
  )

  return axiosInstance;
}
```

```Customer.js
// 
// 省略
//
import {_axios} from 'modules/_axios';

// 
// 省略
//

// 顧客一覧取得
function getCustomerList(setCustomerList){
  _axios({
    method: "get",
    url: config.API_GET_CUSTOMER_LIST, //別ファイルで定義された定数
  })
  .then(function (response) {
    setCustomerList(response.data.customer_list);
    return true;
  })
  .catch(function (error) {
    console.log("顧客一覧取得失敗");
  })
  .finally(function () {
  });
}
```
通信はちゃんと200で返ってきているのに「顧客一覧取得失敗」が出力されてしまう。

# 原因
ここで、そういえばcatchの中でエラー内容を出していないことに気づく。
とりあえずエラーを出してみる。
↓↓ Customer.js
```diff_javascript
// 
// 省略
//
import {createAxiosInstance} from 'modules/_axios';

// 
// 省略
//

// 顧客一覧取得
function getCustomerList(setCustomerList){
  axiosCustomerManagement({
    method: "get",
    url: config.API_GET_CUSTOMER_LIST, //別ファイルで定義された定数
  })
  .then(function (response) {
    setCustomerList(response.data.customer_list);
    return true;
  })
  .catch(function (error) {
+   console.log(error);
    console.log("顧客一覧取得失敗");
  })
  .finally(function () {
  });
}
```
実行・・・
```:コンソール
TypeError: setCustomerList is not a function
    at Customer.js:93:5
```
thenの中で実行している「setCustomerList」という関数が定義されていないだけでした。。。

# まとめ
Promiseのthenの中でエラーが起きた場合にはcatchに入る。
いろいろと原因を想像する前に、まずはコンソールで出力して全情報をかき集める。
今回　↑　これをしなかったのが原因。
Wordpressの更新のあり方

久々の投稿。

現在、ある組織のHPをWordpressで自家運用（も当然の状態）していて、
開発方法が色々あることで、どのようにやるのがベストなのか判断に困っている。


① 全部管理画面から更新
② CF（カスタムフィールド）を使い一部管理画面から更新
③ PHPを直接更新する方式。この場合、管理画面からは更新できない。

まず大前提として、

テスト環境、本番環境を用意しており、基本的にテスト環境→本番環境へのアップで運用中。
例えば、お知らせやコラムなどのブログ記事、またCFのデータ編集などを私以外の担当者が本番環境で更新。
一方で、私が、その組織からの依頼を受けて新コンテンツをテスト環境で開発している。

運用上の問題として、
本番環境で行ったブログなどの記事データやCFのデータ編集やらを私が新コンテンツをアップするときにいちいち確認して、テスト環境に手作業で移して開発しているコンテンツ以外は同じ状態に同期してからまとめて
All-in-one WP migrationの無料版でアップしている。
（無論画像はFileZillaでアップしてからそれ以外を全部ブラグインでアップしている）
実に面倒なことこの上なし。

本番環境で行ったデータ（ブログ記事とCFのデータ編集部分）だけを残して新コンテンツだけをアップする方法はないのか探しているかいまだにAll-in-one WP migration以外の方法が見つかっていない。
もしあれば教えてほしい。
まあそれは本題ではないのでここまでにしとくが、
後で言及するので覚えておいてほしい。

さて、上に挙げた３つで、現状、私以外の人が更新することが前提であるので、①が理想的だ。

③はあまり更新しないページだったらOKという説がネットに転がっているが、例えば、もし、私がその組織からいなくなって、急に更新の必要ができた場合どうするのか、と考えると、あまり更新しないページでも結局は①が良いってことになる。

現実、私が自家運営していて、たまたまサイトポリシーを③でなくて①の方法で更新していたため、テキストを直すだけで一分もかからず終わった。
これが③だったら、HTMLを修正して、アップしてテスト確認して、CSSで不具合出ていたら直して。。。。ということで結局は10分かかっただろうと考える。

ところが、運営上問題があり、ここでさっきの運用の話に戻るが、
テスト環境で開発を行なっていた場合、本番環境の更新部分だけを移すことが現状できないので、手動で本番環境でやった更新をテスト環境でもやっておかないといけない。

一方。③の方法でやった場合、その部分だけだったら普通にFTPでアップするだけで済んでしまう。

という、あっちを立てれば、こっちが立たず、な状態になってしまっているのである。

※*＊
何の解決策もないが、もうすぐWordpressの勉強会があるので、その質問に使おうと思って懸念点をまとめておいた。

あわよくば。。。で。。。
Qiitaを見ている方で、
Wordpressを運用していて、かつ、新規開発も同時に行なっているというようなことをやっている方がいれば
こういうときどう運用しているのかコメントなどでヒントをくれれば幸いです。
AWS 各種サービス一覧

## AWS インスタンス一覧

### AWS GPUインスタンス一覧

ひとまず、g4dn (NVIDIA T4) の一覧です。
GPUの種類と数も記載されているリストがあんまりないのでメモ代わりに記載しておきます。
（スポットインスタンスの料金も付けてます）

|インスタンス|vCPU|メモリ|GPU|$/1H|$/月|$/H<br>(spot)|$/月<br>(spot)|
|-|-|-|-|-|-|-|-|
|g4dn.xlarge|4|16 GiB|T4 x 1|0.710|511|0.213|153|
|g4dn.2xlarge|8|32 GiB|T4 x 1|1.015|730|0.3045|219|
|g4dn.4xlarge|16|64 GiB|T4 x 1|1.625|1,170|0.4875|351|
|g4dn.8xlarge|32|128 GiB|T4 x 1|2.938|2,115|0.8814|635|
|g4dn.12xlarge|48|192 GiB|__T4 x 4__|5.281|3,802|1.5843|1,141|
|g4dn.16xlarge|64|256 GiB|T4 x 1|5.875|4,230|1.7625|1,269|
|g4dn.metal|96|384 GiB|__T4 x 8__|10.562|7,605|3.1686|2,281|

※月の料金は 24時間 x 30日 で計算
※2022/09/03 時点での 東京リージョン Linux での料金
　最新の情報は以下で確認ください
　https://aws.amazon.com/jp/ec2/pricing/on-demand/
【Photoshop】psdファイルのフォーマットについて その2 TypeToolObject

[前回](https://qiita.com/kawawa1989/items/16e7bf44dff9c61c6687)の続きです。


今回は **AdditionalLayerInformation** の **TySh** について

https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_40186

以下のようなテキストデータを持つpsdファイルを用意します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/83270f9c-0f78-13ab-339a-cc0ad96bf2bb.png" width="450">

このようなデータを作成した場合、**Hello World** レイヤーは以下のような情報を持ちます

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/9e207a9e-596b-b34e-4f35-101d51015170.jpeg" width="450">


| データサイズ | プロパティ名  |  |
|:-----------|:-----------:|:------------|
| short      | Version           | 常に `1` であることが期待される |
| Transform  | Transform         | 拡大率などの変形情報が含まれる |
| short      | TextVersion       | 常に50である |
| int        | DescriptorVersion | 常に16である |
| Descriptor | TxLr              | テキストデータ部分 |
| Descriptor | Warp              | おそらくワープテキスト情報(使っていないので詳細不明) |


#### Transform 

```csharp
struct Transform
{
    public readonly double Xx;
    public readonly double Xy;
    public readonly double Yx;
    public readonly double Yy;
    public readonly double Tx;
    public readonly double Ty;

    public Transform(IPsdReader reader)
    {
        Xx = reader.ReadDouble();
        Xy = reader.ReadDouble();
        Yx = reader.ReadDouble();
        Yy = reader.ReadDouble();
        Tx = reader.ReadDouble();
        Ty = reader.ReadDouble();
    }

    public override string ToString()
    {
        return $"xx:{Xx}, xy:{Xy}, yx{Yx}, yy:{Yy}, tx:{Tx}, ty:{Ty}";
    }
}
```
テキストを横方向に拡大した場合は `xx`、縦方向に拡大した場合は `yy` の数値が変化します。
`(tx, ty)` はレイヤー内でのテキストの中心位置になります。
(中央より、右寄せ、左寄せなどをした場合この座標を中心に寄せられる)

#### Descriptor 
Descriptor は少し構造が複雑で、これは入れ子構造に出来るデータオブジェクトです。
OSType と呼ばれる各データ型のプロパティを持ちます。
また上記の図を見ても分かる通り、Descriptor が Descriptor を持つような事もあります。

| データサイズ | プロパティ名  |  |
|:-----------|:-----------:|:------------|
| UnicodeString     | Name ||
| LengthAndKey      | ClassId ||
| int               | ItemCount | プロパティ数 |
| OSType[ItemCount] | Properties | プロパティ |

#### LengthAndKey
Descriptor ブロックでは頻繁に使われるデータ形式で、先頭4バイトに長さ(Length)を持ち、次のLengthバイトをKeyとして扱うデータです。
Lengthは0であることもありますが、0である場合は次の4バイトをKeyとします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/1ef9ef66-1474-2eaf-7088-6213136b2a30.jpeg" width="450">


#### OSType

以下の図に書かれている以外にもOSTypeはあるようなのですが、自分が確認する範囲では確認できなかった型が存在するのでそういったものは今回は扱わないようにします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/b23456f6-82a1-3284-1377-9c793668fa24.jpeg" width="450">

OSType は最初に **LengthAndKey** の構造をした Key 情報(プロパティ名)
次にOSTypeの型情報文字列という順番になっており、この型情報によって取得する情報が変化します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/f79f7237-24e4-b798-eb4e-7cf7735c8ceb.jpeg" width="450">

今回はテキスト情報が欲しかったので、実は欲しい情報は `EngineData` だけだったりします。
（それ以外は今の所使用していないので用途がよくわかっていない）
次回は `EngineData` についてまとめます。
Rubyのクラスについて

Rubyのクラスについて自分の備忘録としてまとめます。

# クラスとは
クラスはデータの入れ物(データそのものではない)とその処理をまとめたものです。

# クラスの使用例
例えば、商品の価格と原価のデータがあり、利益を計算したいと思います。

## クラスを使わない場合

クラスを使わない場合、次のように計算することができます。

**例1**
```ruby:shohin_cal1.rb
ringo_name = "りんご"
ringo_genka = 100
ringo_kakak = 200
puts ringo_kakak - ringo_genka   #=>100
#putsは引数(文字列)を出力するメソッド。

ichigo_name = "いちご"
ichigo_genka = 200
ichigo_kakak = 400
puts ichigo_kakak - ichigo_genka  #=>200
```
例1では、商品の数が多くなると記載する量が多くなってしまいます。また、ringoと記載するべき場所にichigoと記載してしまうなどの間違いをする可能性があります。

**例2**
```ruby:shohin_cal2.rb
ringo = {name:"りんご", genka:100, kakaku:200}
puts ringo[:kakaku] - ringo[:genka]  #=>100


ichigo = {name:"いちご", genka:200, kakaku:400}
puts ichigo[:kakaku] - ichigo[:genka]  #=>200
```
例2では、ハッシュを使っています。例1より記載量が少なく、ハッシュにより商品ごとのデータがまとまっているためringoに関する計算にichigoのデータが間違って入力されるという可能性が低くなっています。
しかし、利益の計算を都度入力しているため、-を+と入力するなどの入力間違いの可能性があります。

## クラスを使う場合
クラスを使うとこれらの問題に対応することができます。
冒頭述べた通り、クラスはデータの入れ物とその処理をまとめたものです。
データの入れ物とその処理をまとめたクラスを作り、それに実際のデータを設定して使います。


**例3**
`name`、`genka`、`kakaku`のデータの入れ物と、利益を得る処理をまとめたものを`class Shohin`とします。クラスを使うためにはまずクラスを定義する必要があります。ここでは実際の計算は行っていません。

Shohinクラスの定義は以下の通りです。

```ruby:shohin.rb
class Shohin
  def initialize(name, genka, kakaku)
    @name = name
    @genka = genka
    @kakaku = kakaku
  end

  def rieki()
    return @kakaku - @genka
  end
end

```

まず、クラス名を`class クラス名`と表記し、`class クラス名`から`end`までの中に`def`と`end`で処理をまとめます。
上の例ではクラス名を`Shohin`とし、
1つ目の`def initialize`で、引数にname、genka、kakakuをとり、それぞれを
@name、@genka、@kakakuに代入しています。
2つ目のdef riekiは引数をとらず、@kakakuから@genkaを引いた値を返しています。

実際のデータの設定と、クラスを使用した利益の計算は以下の通りです。
コードはクラス定義の続きに記載しています。

```ruby:shohin.rb
ringo = Shohin.new("りんご", 100, 200)
puts ringo.rieki()  #=>100

ichigo = Shohin.new("いちご", 200, 400)
puts ichigo.rieki()  #=>200
```
データの設定、つまりクラスのデータの入れ物に個別のデータを入れることを、コンストラクトと呼びます。

クラスのコンストラクトは`クラス名.new(データ1,データ2,...)`で実行されます。
上記では、`Shohin.new()`で実際のデータを入れて、コンストラクトしています。実際のデータを入れコンストラクトしたものを、それぞれを`ringo`と`ichigo`という変数に代入しています。この、コンストラクトされてできたデータの実態を持つ変数をインスタンスと呼びます。

コンストラクトする際に入れられたデータは`initialize`でそれぞれの@が付いた変数に代入されます。この@が付いた変数をインスタンス変数と呼びます。インスタンス変数はインスタンスそれぞれに紐づいています。今回の例で言うと、インスタンス`ringo`のインスタンス変数`@name`には`"りんご"`が、インスタンス`ichigo`のインスタンス変数`@name`には`"いちご"`が、という様にインスタンスごとに違う情報が入力されているということです。


`Shohin.new()`で実行される処理はここまでです。


クラス内で定義されている処理をインスタンスメソッドと呼びます。`initialize`は特別なメソッドで、コンストラクトの際に実行されます。それ以外のメソッドは、`インスタンス名.インスタンスメソッド名`で実行することができます。
上記では、`ringo.rieki()`や`ichigo.rieki()`で実行した返り値を`puts`で出力しています。


# まとめ
クラスについてまとめました。クラスを使うことで、以下のようなメリットがあることがわかります。
- データとそれに紐づく処理をまとめることができる
- データを入力する手間が少ない
- データを入力する際の間違いが少ない
- データから処理する際の間違いが少ない

クラスには他にも様々な機能があります。クラスを設計する人とそれを使用する人が別の場合を考えると、上記のメリットやクラスの機能を使うことで、設計者は使用者のミスを減らすことができます。これもクラスを使うメリットです。
PHPで指定したディレクトリ内のファイル一覧を取得

最近アイコンの素材サイトを作りまして、その際にディレクトリ内のsvgとpngファイルを全部表示させる的なことをPHPで書いたので解説。

## 完成コード
完成コードはこんな感じ

``` php:php
<?php
function iconlist($directory)
{
  $file = glob($directory . '*.svg');
  foreach ($file as $path) {
    $path_png = $path;
    $path_png = str_replace('.svg', '.png', $path_png);
    echo '
      <li>
      <img src="' . $path . '">
      <img src="' . $path_png . '">
      </li>
      ';
  }
}
?>

<ul>
  <?php iconlist('icon/group_1/'); ?>
  <?php iconlist('icon/group_2/'); ?>
  <?php iconlist('icon/group_3/'); ?>
</ul>

```

### ディレクトリの構成
構成はこんな感じ。
`icon`の中にアイコンの種類別ディレクトリを作っています。

```
icon/
　├ group_1/
  　├ aaa.svg
  　├ aaa.png
  　├ bbb.svg
  　├ bbb.png
  　├ ...
　├ group_2/
  　├ ...
  　├ ...
　├ group_3/
  　├ ...
  　├ ...
```

## 解説

### glob関数
glob関数はパターンにマッチしたパス名を探す関数です。
「*」や「?」を使用してディレクトリ内のファイルの一覧を取得します。

これで指定したディレクトリ内の全ての`.svg`を取得します。

```php:php
$file = glob($directory . '*.svg');
```

### str_replace関数
str_replace関数は指定した文字列を他の文字列に置き換えるときに使用する関数です。
これで`.svg`から`.png`に置換させます。

```php:php
str_replace('.svg', '.png', $path_png)
```


### foreachで表示
foreachでディレクトリの中にある`.svg`の数だけ繰り返し処理をしています。

```php:php
  foreach ($file as $path) {
  }
```

## まとめ
webサイトでよく見るスライダーとかは画像をたくさん表示させる必要があるので、この方法でやると効率的かと思います。
Windows11 + WSL2 + Docker - Dockerイメージのビルドエラー

# 概要
WSL2上でのDockerイメージのビルドエラーをDaemon configuration fileを変更して回避した。

# エラーの内容
## 環境
- Microsoft Windows 11 Pro Build 10.0.22000
- Docker Desktop v4.12.0 - Docker Engine v20.10.17
- WSL2 - Ubuntu-20.04
## 再現手順
```bash
$ docker build
[+] Building 10.7s (2/3)
[+] Building 10.8s (3/3) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 3.30kB                                                                             0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => ERROR [internal] load metadata for docker.io/library/ubuntu:22.04                                             10.8s
------
 > [internal] load metadata for docker.io/library/ubuntu:22.04:
------
failed to solve with frontend dockerfile.v0: failed to create LLB definition: rpc error: code = Unknown desc = error getting credentials - err: exit status 255, out: ``
```

# 解決にあたって実行したこと
1. Docker Desktopを起動する
1. Settingsを開く
1. Docker Engineを開く
1. Daemon configuration fileを下記のように書き換える
1. [Apply&Restart]をクリックする
```diff_json
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": {
-    "buildkit": true
+    "buildkit": false
  }
}
```

# 参考情報
[Daemon configuration file - Feature Options:buildkit](https://docs.docker.com/engine/reference/commandline/dockerd/#feature-options "Daemon configuration file - Feature Options:buildkit")
コロナ発熱外来質問事項マークダウンフォーム(2022/08版）

#### ■発熱外来に関する確認事項
 1. 発熱外来住所
 2. 発熱外来連絡先
 3. 受診上の注意点
 4. 発熱外来受診日
#### ■発熱外来での質問内容
 1. 住所〒　　　-　　　　　　　　（都道府県）　　　  （市区町村）
 2. 氏名（ふりがな）
 3. 連絡がつく電話番号
 4. 生年月日
 5. 年齢　
 6. 持病の薬 花粉症等の場合も告げる。お薬手帳に日頃から記録する。なお、自分が意識を失っている場合に使えないので、お薬手帳は紙のほうが良い。というかそうせざるをえない。特に決まりはないが薬の名前と病名という形で書く。例：草津の湯（こいわずらい）


 7. コロナワクチン 種類 回数 直近接種日
 　　　　※　例　コロナワクチン 3回ともモデルナ　直近3回目の接種日は2022年8月19日

 8. コロナワクチン以外のワクチンの接種日と種類（ただしきかれないこともある）


 9. 発症した日、発症したと自覚した原因（何日に発熱した、市販の検査薬で陽性だった）


 10.  受診するまでに飲んだ薬（何日に何を飲んだか、持病の薬、サプリメント等も記載）日毎に記載そして現在の状態。
 　月　日 発熱 　　度  PCR検査陽性 など

 
#### ■その他
##### 身長・体重
##### 喫煙・飲酒について（何歳くらいから、週にどのくらい）
##### 腎疾患の　有　無
##### 資質異常の　有　無
##### 糖代謝異常の　有　無
##### 心疾患等の　有　無
##### 食物アレルギー 有　無　　有りの場合は種類
##### もらった薬でアレルギーが起きたことがあるか　有　　無
##### 女性の場合　妊娠の　　有　　無
##### 未成年の場合 保護者情報（氏名、続柄、住所、連絡先）

##### 周囲の感染状況

---
# 使い方（マークダウンで印刷するときはここから下は削除して印刷しましょう）
1. この様式をmdでダウンロードしてください。
2. メモ帳やマークダウン形式を開けるTyporaで最初の4行と、使い方の項目はカットし。印刷して記載してください。マークダウンはメモ帳でも印刷できます。この場合、MS　UI　Gothicの12ポイントだとA4に収まると思います。<br>---
title: MD発熱外来質問事項
tags: md
author: Q11Q
slide: false
---</br>
3. この様式は日本国内における使用を想定しています。医学的に正確ではありませんが、コロナの重症化因子及びHer-SySに入力すべき事項は抑えてあると思います。違う場合はご連絡ください。これに記載して発熱外来に行くほうがスムーズです。
4. ただし上記質問事項は変更またはより細かくなる可能性があります。すべての質問を網羅しているとは限りません。

## FIREFOXで印刷する方法
### 注 意
- pdfに一旦変換します。
- 余白が狭いので印刷できない場合があるかもしれません。

` ■発熱外来から　周囲の感染状況までを選択します
右クリックで選択した部分を印刷を選択します
PDFに変換で奇数ページ A4  倍率60% 余白をカスタムで上下0.25左右0.2 ヘッダ・フッター、背景画像は印刷しません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/49643bb2-53c3-4182-d282-16df352809c9.png)

## Google ChromeでPDFに変換
注意事項はFirefoxと同様です。
余白はデフォルトでも良いようです。倍率は60%。Google Chromeの場合は選択した部分を印刷にチェックが必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/526872b9-0542-8ff3-f3e3-cd66cdcc3836.png)


# 日頃やっておくべきこと
禁煙・お酒は控えましょう。運動しましょう。体重、血圧、体温はできれば毎日、最低でも週1でもいいので測っておきましょう。人間ドックで自分の数値を知っておきましょう。
# 発熱外来には予め連絡して確認しましょう
予約方法が病院ごと、おそらく感染状況ごとでも違うので、必ず確認しましょう。また大抵の場合車で来るよう勧められます。このため予約後、住所、時間等を正確に記載しましょう。
PugやHamlなどのインデント記法は、HTML作成には不向きでは？



:::note alert
主観的なコーディングスタイルの話になります。正しい、間違っているは読み手の判断に委ねられます。
:::

# １．インデント記法が向いてるのは短く浅いブロック

インデント記法は、字下げをしてブロックを定義します。
有名なのはPythonですね。

```py:sample

def print_number(last):
    for i in range(last)
        print i

def print_multiple(multiple, last):
    for i in range(last)
        print i * multiple

```


https://www.javadrive.jp/python/if/index2.html


個人的に、Python、そして、それと同じ記法をもつCやJavascriptをトランスパイルできるNimはとても好きです。

https://zenn.dev/dumblepy/articles/b475b3b4f7d0da

インデント記法は、スペースやインデントの違いにより問題を起こしかねないという欠点の指摘もあります。

http://wtar00.seesaa.net/article/462655858.html

感覚的に、JavascriptやRubyのようにブロックで閉じている方がわかりやすいという人もいます。インデント記法がよいか悪いかはどのようなエディタを使うかや個人の好みに委ねられる気もします。

https://qiita.com/SFITB/items/8fa6a08c9088d964748d#:~:text=%E3%82%A4%E3%83%B3%E3%83%87%E3%83%B3%E3%83%88%E8%A8%98%E6%B3%95%E3%81%B8%E3%81%AE%E6%8A%B5%E6%8A%97&text=%E5%95%8F%E9%A1%8C%E7%82%B9%E3%81%AF%E3%80%81%E8%A6%8B%E3%81%88%E3%81%AA%E3%81%84,%E5%95%8F%E9%A1%8C%E7%82%B9%E3%81%A0%E3%81%A8%E6%80%9D%E3%81%86%E3%80%82

個人的に、プログラムは行数は短く、ブロックは浅くすることでみやすさや、テストのしやすさを担保されるので、こうしたコーディングスタイルをするのであれば、インデント記法はブロックの特定がしやすくて問題ないと思います。


# ２．HTMLがインデント記法になじまないと思う理由

インデント記法でHTMLを記述するライブラリとしてPugやHamlがあります。HTMLの不等号（<>）を使わなかったり、閉じタグを付けないので記述する文字数が少ないので、書きやすい、読みやすいとされています。

確かに、短く、ブロックが浅い分にはとても有効だと思います。
ただ、実際、仕事でHTMLをコーディングすると、長く入れ子が多い（ブロックが深い）です。
こうなると、<font color="red">**インデント記法だと、深くなればなるほど、ブロックの違いがわかりにくくなり、ときに、スペースが一つないだけでコンパイルエラー**</font>になります。

また、<font color="red">**インデントのネストがある場合、フォーマッターをかけると意図しないところでネストされてしまうことがある**</font>ので、迂闊にフォーマッターをかけにくいです。
閉じカッコがある記法の場合、フォーマッターは意図通りになります。

https://weblife.ppmp556.com/pug/


最近は、ReactやVueなどで小さくコンポーネントをつくるので、こうした問題は起こりにくいかもしれません。
逆に、少ししか書かないのでコンパイルの準備をすることがめんどくさいので、HTMLのまま書く人も多いと思います。


https://ics.media/entry/200710/

最近は、VSCodeなどでHTMLを記載するにしても、スニペットをつかったり、コード補完が効くので、ゼロからすべての記号を書くわけではありません。

https://qiita.com/mikd/items/183023f99db8954a0443

IDEの補完が効かないような場合、PugやHamlは便利かもしれませんが、現在はかならずしもこれを使う必要もないかと思います。
それよりも、コンパイルの準備をしたり、複雑になった場合のエラーを考えると、コード補完機能をつかって、HTMLを記載するほうが楽な気もします。

# ３．HTMLは処理の流れを記載するプログラムではなく、構造を記述するもの

HTMLがインデント記法になじまないと感じるのは、構造を記述する言語であるからだと思います。

Pythonのように処理の流れを記載するものではなく、構造を記載するものは、入れ子が発生したりしやすく、長く全体を捉えた方が視覚的にもわかりやすい。

インデント記法のアンチパターンが発生しやすいのが構造記述をするHTMLなのではと感じています。
【Swift/SwiftUI】 シンプルなカウントダウンタイマー作ってみた。(for MacOS)

Swiftで何か作る、ってなるとiPhoneをターゲットにすることを前提に考えちゃうんですけど、
macで使える（もしくはどっちからでも同じ機能が使える)、っていう方がいいものもあって、
実際Swift(SwiftUI)でmacOS向けにアプリ作るのって難しいんだろうか、、、

ていうのを実際に作って試してみました。

作ってみたものはこちら↓のmacOS版です。
（同じものを作ってみた方がどこに差があるかとかわかりやすいと思ったので）

https://qiita.com/ydzum1123/items/a4f837ef337da5b28cd8

## 開発環境
MacOS Monterey 12.2.1
Xcode Version 13.4.1
Swift Version 5

## 画面イメージ
タイマー開始前
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126315/1debe93d-f054-8db2-f710-3c8331d83f3a.png">

タイマー作動中
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126315/f80b039f-7b90-68ac-33bd-8a7cb7bd8cd3.png">

## コード

#### 結論
機能的な部分の実装については、ほぼ変わっていません。
当たり前といえば当たり前かもしれませんが、
SwiftUIのViewって、iOS端末向けと同じように表示・動作するんだ・・・
ってちょっと感動しました。。

以下でmacOS向けに追加・変更した点について記載します。

#### 追加・変更点
##### macOS向けアプリのプロジェクト作成
まずはアプリのプロジェクト作成時にmacOS向けを選択します。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126315/37171d37-4240-74cf-5cea-7fcba2c2116d.png">

##### エントリーポイントにWindowタイトルを設定
`.navigationTiltle()`を付与することでWindowのタイトルを設定しています。
```swift
import SwiftUI

@main
struct helloWorldOnMacApp: App {
  let windowTitle: String = "INTERVAL TIMER"
  var body: some Scene {
    WindowGroup {
      ContentView().navigationTitle(windowTitle)
    }
  }
}
```

##### ウィンドウサイズの設定
macOS向けに作ると、ウィンドウサイズが自由なためどの程度の大きさで表示するのか決める必要があります。
何かしらうまいやり方がありそうな感じはしますが、
今回は部品を配置しながらちょうど良さそうなサイズを`frame(width, height)`で設定しました。
```swift
    .frame(width: 600, height: 500)
```


##### タイマー時間切れになった際にアラート表示
「macOS向けのアプリでのアラートってどんな風に表示されるんだろ？？」っていうのが気になったので、最低限の設定ですが表示してみました。
(筋トレ中のインターバル管理を目的として作ってみたので、表示文言にちょっと圧があります。）
```swift
    .alert(isPresented: $timerController.showingAlert) {
      Alert(
        title: Text("JUST DO IT!!"),
        message: Text("とっとと次やれ！！"),
        dismissButton: .default(Text("OK"), action: { timerController.stop() })
      )
    }
```

で表示イメージはこんな感じでした。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126315/05700e55-0c26-785a-bd9d-ceca24e4fd7d.png">

##### プログレスバーの表示設定
画面イメージを見て貰えばわかる通り、
プログレスバーの高さ(細さ)がデフォルト状態でちょっとボリュームがもの足りませんが、
macOS向けでは`.scaleEffect()`で高さを引き伸ばすという書き方が機能しなかったので
現状デフォルト状態での表示にしています。
（ちょっと調べた限り、もうプログレスバーに関しては自作した方が早そう）

```swift
  ProgressView(
    value: timerController.remaining,
    total: Double(intervalSecond)
  )
  // macOS版では機能しなかったので削除
  // .scaleEffect(x: 1, y: 15, anchor: .center)
```

その他細かいバグや書き方の見直しをしたりはしていますが、
「macOS向けに作る上での修正点」という意味合いでは以上です。

#### コード全文(Github)
コード全文はこちらを参照下さい。

https://github.com/yuta-yama-1123/helloWorldOnMac


今回は以上です。
PyAthenaの速度を改善する方法

## はじめに
PyAthenaを使用して、Pandas.DataFrameにデータを展開する場合に速度が遅くて困ったことはありませんか？
もしかしたら、PyAthenaの使い方を見直すことで改善することができるかもしれませんよ！
私がPyAthenaの速度改善するために調べたことをまとめたいと思います。

## PyAthena
PyAthenaは、PythonからAmazon Athenaを使用するためのPython Clientになります。
PyAthenaを使用して、Pandas.DataFrameにデータを展開する方法は複数あり、使い方によって速度に大きな差が出る場合があります。

https://pypi.org/project/pyathena/

## 使い方
PyAthenaを使用してPandas.DataFrameにデータを展開する方法を3つ紹介したいと思います。

　① Pandas : read_sql_query
　② PyAthena : PandasCursor
　③ PyAthena : AsyncPandasCursor

PyAthenaの使い方で調べると①の方法がよくヒットするのですが、実は①read_sql_queryの方法はパフォーマンスがあまり良くないのです…
PyAthenaには、別の方法として②PandasCursorも用意されており、こちらを使用することで速度の改善を図ることができます。

### ① Pandas：read_sql_query
PyAthenaで取得したクエリ結果をPandasのread_sql_queryを使用して、DataFrameにデータを展開する方法です。
これが、非常に遅くデータ展開にかなりの時間が掛かります…
なので、この方法を使用している人は、②PandasCursorまたは③AsyncPandasCursorの方法を試してみてください。

```Python:read_sql_query
from pyathena import connect
import pandas as pd

conn = connect(s3_staging_dir="s3://YOUR_S3_BUCKET/path/to/",
               region_name="ap-northeast-1")
df = pd.read_sql_query("SELECT * FROM many_rows", conn)
```

### ② PyAthena：PandasCursor
PandasCursorは、Athenaのクエリ結果としてS3に保存されるCSVファイルからDataFrameに直接データを展開する方法です。
S3に保存されるCSVファイルから直接データを読み込むため、①read_sql_queryの方法と比較してパフォーマンスに優れています。

```Python:PandasCursor
from pyathena import connect
from pyathena.pandas.cursor import PandasCursor

cursor = connect(s3_staging_dir="s3://YOUR_S3_BUCKET/path/to/",
                 region_name="ap-northeast-1",
                 cursor_class=PandasCursor).cursor()

df = cursor.execute("SELECT * FROM many_rows").as_pandas()
```

このPandasCursorは、Athenaに対して順番にクエリを発行を行います。
なので、複数から同時にクエリを発行した場合、先発のクエリが終了するまで後発のクエリは実行待ちになり、パフォーマンスのボトルネックとなる場合があります。
その場合は、③AsyncPandasCursorの方法を試してみてください。

### ③ PyAthena : AsyncPandasCursor
AsyncPandasCursorは、PandasCursorと同様にS3に保存されるCSVファイルからDataFrameに直接データを展開する方法ですが、Athenaに対して複数のクエリを並列実行することができます。
その為、複数のクエリを同時実行する場合、②PandasCursorの方法と比較してパフォーマンスに優れています。（実行環境によっては、並列化することでパフォーマンスが劣化する可能性もありますので、ご注意ください。）

```Python:AsyncPandasCursor
from pyathena import connect
from pyathena.pandas.async_cursor import AsyncPandasCursor

cursor = connect(s3_staging_dir="s3://YOUR_S3_BUCKET/path/to/",
                 region_name="ap-northeast-1",
                 cursor_class=AsyncPandasCursor).cursor(max_workers=10)

query_id, future = cursor.execute("SELECT * FROM many_rows")
result_set = future.result()
df = result_set.as_pandas()
```
ワーカー数は、"max_workers"を指定することで変更することが可能です。
デフォルトは、5 または ＣPU数 * 5 になります。

クエリIDは、クエリをキャンセルする場合に使用します。
```Python:AsyncPandasCursor
from pyathena import connect
from pyathena.pandas.async_cursor import AsyncPandasCursor

cursor = connect(s3_staging_dir="s3://YOUR_S3_BUCKET/path/to/",
                 region_name="ap-northeast-1",
                 cursor_class=AsyncPandasCursor).cursor()

query_id, future = cursor.execute("SELECT * FROM many_rows")
cursor.cancel(query_id)
```

### まとめ
下表に紹介した3つの方法をまとめます。

|展開方法|展開速度|並列実行|
|:-:|:-:|:-:|
|① read_sql_query|×|×|
|② PandasCursor|〇|×|
|③ AsyncPandasCursor|〇|〇|

基本は、② PandasCursorを使用するで問題ないと思いますが、
並列実行する場合は、③ AsyncPandasCursorを検討すると良いと思います。

### さいごに
PyAthenaについて調べてみると色々な使い方があることがわかりました。
PyAthenaが遅くて…と感じた時に参考にして貰えたらと思います。
Google Chroomに熟達する（ショートカット編）

# 目的
作業効率を上げるために自分がよく使うクロームのショートカット一覧を残しておきます。
これらのショートカットはすべて[ヘルプページ](https://support.google.com/chrome/answer/157179?hl=ja&co=GENIE.Platform%3DDesktop)に載っています。

ただ全てを覚えるとなると大変なので、個人的開発者視点で少なくともこれだけ覚えておくといいよと思ったものをピックアップしています。

# ショートカット
### ウィンドウ操作

| 操作 | ショートカット |
|:-|:-|
| 新しいウィンドウを開く | Ctrl+N |
| 新しいシークレットウィンドウを開く | Ctrl+Shift+N |
| 現在のウィンドウを閉じる | Ctrl+Shift+W , Alt+F4 |
| 現在のウィンドウを最大化する | Win+[↑] |
| 現在のウィンドウをウィンドウモード（または最小化）する | Win+[↓] |
| 随時追加予定 |  |



### タブ操作
| 操作 | ショートカット |
|:-|:-|
| 新しいタブを開く | Ctrl+T |
| 現在のタブを閉じる | Ctrl+W |
| 閉じたタブを開く | Ctrl+Shift+T |
| 次のタブに移動する | Ctrl+Tab , Ctrl+PgDn |
| 前のタブに移動する | Ctrl+Shift+Tab , Ctrl+PgUp |
| 1つ前の履歴に戻る | Alt+「←」 |
| 1つ後の履歴に進む | Alt+「→」 |
| 1~8の特定のタブに移動する | Ctrl+1～Ctrl+8 |
| 最後のタブに移動する | Ctrl+9 |
| 現在のタブでホームを開く | Alt+Home |
| 随時追加予定 |  |

### アドレスバー操作
| 操作 | ショートカット |
|:-|:-|
| アドレスバーに移動する | Ctrl+L |
| 随時追加予定 |  |

### ウェブページ操作
| 操作 | ショートカット |
|:-|:-|
| 現在のページを再読み込みする | F5 |
| 現在のページを全てのキャッシュを削除して再読み込みする | Ctrl+F5 , Shift+F5 |
| 現在のページを拡大する | Ctrl+[+] |
| 現在のページを縮小する | Ctrl+[-] |
| 現在のページの拡大（縮小）をもとに戻す | Ctrl+0 |
| 随時追加予定 |  |

### Chrome操作
| 操作 | ショートカット |
|:-|:-|
| デベロッパーツールを開く | F12 |
| タスクマネージャを開く | Shift＋Esc |
| Google Chrome を終了する | Alt+F → X |
| 随時追加予定 |  |

# まとめ
マウスに手を伸ばすのもめんどくさい！！って方はぜひ活用していただければと思います。
今後も随時追加していきます。
SidekiqのActiveRecord::ConnectionTimeoutErrorを解決した話

# 最初から結論
sidekiqの実行中
```
ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.019 seconds)
```
エラーが発生したのでrailsのdatabase.yamlのconnection poolを増やして解決しました。

# 何が起こったか
sidekiqが実行されているサーバーから急に1時間200件頻度で以下のエラーが発生しました。
```
ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.019 seconds)
```
特に修正したことは無かった状態でアクセスが多かっただけを把握しました。

# 調査のスタート
Tracebackを確認すると
User.where(id: ids).order(name: :desc)
でselectしているだけだったのでコードの問題は無かったと判断、設定に問題ないかを調査しました。
エラーの内容を検索するとrailsガイドから
>利用可能な数を超えるコネクションを使おうとすると、Active Recordはコネクションをブロックし、プールのコネクションが空くのを待ちます。コネクションを取得できない場合は以下のようなタイムアウトエラーが発生します。

https://railsguides.jp/configuring.html#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%8E%A5%E7%B6%9A%E3%82%92%E3%83%97%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B

ただpool増やせばOKな感じ

# database.ymlの確認と修正
それでdatabase.ymlを確認しましたが
```
...
production:
  <<: *default
  reconnect: true
  pool: 10
...
```
だったので単純にpool: 20に変更して反映しました。
それで終わり！だと思いましたが…

# pool変更ができない？
反映しましたが同じ頻度でエラが発生していることを発見。
poolが対応されていないと判断して確認すると
```
irb(main):009:0> ActiveRecord::Base.connection_pool
=> #<ActiveRecord::ConnectionAdapters::ConnectionPool... @size=5
... 
```
poolサイズが５でした。
最初からdatabase.ymlが適用されたことなくてdefaultの５だったものでした。
サーバーのdatabase.ymlの内容見るとやはりpool設定した行もないし他にも微妙に内容が一致していないことを発見しました。

＃ opsworks
今回問題が発生したサーバーはawsのopsworksに構築されているサーバーでした。ドキュメント確認すると
> アプリケーションをデプロイすると、アプリケーションの AWS OpsWorksdatabase.yml 属性からの情報を使用して新しい deploy ファイルが Stacks によって作成されます。例えばMySQL または Amazon RDS インスタンスをアタッチするアプリにAWS OpsWorksスタックは、接続情報をdeploy属性は、database.ymlには正しい接続データが自動的に含まれます。

https://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/workinglayers-rails.html

アプリケーションのdatabase.ymlじゃなくdeployする時作成するdatabase.ymlを利用することだったものでした。
chefに本物のdatabase.ymlがあったので今回はちゃんとpool: 20を追加して再びデプロイしました。

# まだエラーが終わらない
反映結果半分以上エラーが減らしましたがまだ発生していることを確認しました。
もしpoolが正しくないかと思って検索するとsidekiq concurrency以上のpoolが必要でした。
うちのsidekiq concurrencyが４８だったので２０でも足りなかったものでした
sidekiqがTHREADを多めに作っていることが影響になっていることでした。

https://github.com/mperham/sidekiq/wiki/Advanced-Options#concurrency

# 結論と追加確認

pool: 50設定でエラーが０になりました！！！！
解決！！！！
pool sizeがdefaultの５だったけどエラーが発生しなかったことは長い時間多めのサクセスが無かった状態だったので起こっていなかっただけの話。で終わりの話でしたが5->50の10倍に増やしたのでもしRDSの制限に問題ないかと思いました。
awsのrdsを利用しているので確認しました。
RDS→データベース→(利用中のDB)→設定タブ→パラメータグループ
からmax_connectionsを検索しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1683881/94bac64e-3a32-1dd7-ec6b-50552d79bcb7.png)

DBInstanceClassMemory/12582880なら３０GBなので２４００までOK
サーバーの数やプロセス数＊50しても全然問題ない制限でした。
今回はそれで終わる

# 参考URL

https://gist.github.com/tai2/04202c605774745d3d42cef0d5d595a8
LPC812MAXのI2CのIDのスキャンプログラム

x IDが7ビット系と8ビット系でいろいろ間違っている(9/4修正済み)

x mbed2リビジョン144
x リビジョン変更が出来るひとむけ


目的
I2Cとシリアルのテスト

よって0x46と0x9Eが繋がっている


![o_con719.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b0367dc5-0ddc-37cd-64ea-38293108d75e.jpeg)


![o_con720.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f087c763-47b3-2879-925b-a87c58388e2b.jpeg)


小改良


```c++


//i2c_scan_id_812_3

#include "mbed.h"

//        TX      RX
Serial pc(USBTX, USBRX); //812

//       SDA    SCL
I2C i2c(A4, A5); //812

//メイン関数
int main()
{

    int hex1[] = {
        '0','1','2','3','4','5','6','7',
        '8','9','A','B','C','D','E','F'
    };

    for(int add1=1; add1<=127; add1++) {
        if ( i2c.write( (add1<<1), "@", 1) == 0) {

            pc.putc( hex1[ (add1<<1) >>    4 ]  );
            pc.putc( hex1[ (add1<<1) &  0x0f ]  );
            pc.putc( ',' );

        }//if

        wait_ms(50);

    }//for

    //無限ループ
    while(1) {}

}//main




```


```c++



//i2c_scan_id_812_2

#include "mbed.h"

//         TX    RX
Serial pc(P0_4, P0_0); //812

//       SDA    SCL
I2C i2c(P0_10, P0_11); //812

//メイン関数
int main()
{

    int hex1[] = {
        '0','1','2','3','4','5','6','7',
        '8','9','A','B','C','D','E','F'
    };

    for(int add1=1; add1<=127; add1++) {
        if ( i2c.write( (add1<<1), "@", 1) == 0) {

            pc.putc( hex1[ (add1<<1) >>    4 ]  );
            pc.putc( hex1[ (add1<<1) &  0x0f ]  );
            pc.putc( ',' );

        }//if

        wait_ms(50);

    }//for

    //無限ループ
    while(1) {}

}//main





```


いろいろ間違い

```c++



//i2c_scan_id_812_1

#include "mbed.h"

//         TX    RX
Serial pc(P0_4, P0_0); //812

//       SDA    SCL
I2C i2c(P0_10, P0_11); //812

//メイン関数
int main()
{

    for(int add1=1; add1<127; add1++) {
        if ( i2c.write(add1, "@", 1) == 0) {

            pc.putc( '0' + (add1 >>    4 )  );
            pc.putc( '0' + (add1 &  0x0f )  );
            pc.putc(',');

        }//if

        wait_ms(50);

    }//for

    //無限ループ
    while(1) {}

}//main




```



![o_con833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/37737aff-7189-987a-98c3-61051d42f159.jpeg)



-8-
スクラムイベントを覗いて見てみよう!

## スクラムイベントってなに？
---
## スクラム開発を実践する上で開発を円滑に進める為の会議のようなもの
---
## デイリースクラムってなに？
---
### つまり、朝会のようなもの
---
### 観点：スプリントの目標を達成するために正しいことをできているか？

---
ー内容ー
## 1.昨日なにした？
## 2.今日何する？
## 3.何か問題点は？
---
## <font color="Red">毎朝15分厳守！！</font>

---
## スプリントプランニングってなに？
---
## スクラムイベントの最初のイベント
---

・**スプリント**期間内で何ができるか？

・スクラムチーム全員が参加

・**プロダクトバックログ**※で優先順位の高いものから順に

・タスク量を明確化・分割してリスト化した**スプリントバックログ**※を作成

※プロダクトへの要望を一覧形式でまとめたもの。プロダクトオーナーによって定義づけられるのが一般的。

※スプリントバックログは、チームがプロジェクトのスプリント期間中に完成を目指す作業アイテムをリストアップしたもの

---
## スプリントってなに？
---
**スクラムチームが一定量の作業を完了させる際の、短く区切られた期間**

・約１、２週間（チーム内で期間を定める）

・決められたサイクルで開発を進めることで、スクラムチームで完了できる仕事量を把握

---
## スプリントレビューってなに？
---
・スプリントの成果物を**ステークホルダー向けに披露**し、プロダクトについての進捗報告やフィードバックを得る


・開発チームはスプリント期間内に達成できたこと、できなかったこと次回以降何をどう作っていけばいいか議論

---
## スプリントレトロスペクティブってなに？
---
### スプリント終了時に行われる最後のスクラムイベント
---
### いわゆる「振り返り」
---
### 次回以降のスプリントでより良い仕事を行うための改善策を出していく場
---
KPTA（Keep、Problem、Try 、Action）
![Action.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543815/47a735a3-3b6a-2c28-df34-674e0f6f79fd.jpeg)
このテーマに基づいてチームで検討し、業務改善に役立てるという振り返り手法

---
## 【まとめ】スプリントの流れ
---
![スプリントプランニング.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543815/d5015328-cbd1-6c1f-b8e5-666a497df62f.jpeg)

---

### Let's try it!
VirtualBoxとWindowsマシンの共有フォルダ設定

VirtualBox上の仮想環境からWindowsのフォルダをマウントする。

VirtualBoxの仮想環境OSは「RockyLinux8.5」で行った。(記事が少ないのでCentOS8系を参考にしている)

### 仮想マシンのカーネルを更新＆再起動
```
dnf update -y kernel*
```
```
reboot
```
### EPELリポジトリのインストール
```
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
```
### パッケージのインストール
```
dnf install -y gcc kernel-devel kernel-headers dkms make bzip2 perl
```
### 環境変数の追加
```
KERN_DIR=/usr/src/kernels/`uname -r`
```
### Guest Additionsのインストール準備
起動中のVirtualBoxの画面上のタブから[デバイス]>[Guest AdditionsのCDイメージの挿入]をクリック
※あらかじめ[設定]>[ストレージ]>[コントローラ：IDE]>[光学ドライブの追加]から「VBoxGuestAdditions.iso」を指定しておく必要あり。
それでもエラーが出て失敗する場合、以下の記事を参照。

https://www.koikikukan.com/archives/2020/04/13-235555.phpGuest

### Additionsのインストール
```
mkdir -p /mnt/cdrom
```
```
mount -r /dev/cdrom /mnt/cdrom
```
```
sh /mnt/cdrom/VBoxLinuxAdditions.run
```
※VirtualBoxのバージョンが古いと上記コマンドが失敗して先に進めない場合があるので注意。

```
reboot
```
### VirtualBoxでホストOSの共有用フォルダを設定
VirtualBoxの[設定]>[共有フォルダ]>[右上の＋マーク]から仮想環境と共有したいフォルダを指定する。

### マウントの確認
仮想環境の再起動後、「/media」配下に「sf_フォルダ名」の名称で共有フォルダが表示される。

必要に応じて「/var/www/html」配下にシンボリックリンクを設定したり、パーミッションを適宜設定して共有フォルダを使用する。
sl を VSCode で走らせる

# 概要

ふと、VSCode の潤沢なテキストエリアに sl を走らせたくなったので、拡張を作った。

<!--![187077131-14265651-599e-4751-a9ce-b5f72f510ee0.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49525/b4d4d743-1452-a649-c159-8292fad91179.gif)-->
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49525/bd6ed408-dbd4-4782-3e9e-bcb3c2aae504.png)



https://marketplace.visualstudio.com/items?itemName=tsubasaogawa.sl-vscode

実行したときの絶望感を高めるため、 sl が通ったところの文章は消滅する仕様とした。(※ Undo で復活可)

# 余談: UNIX コマンド sl(1) の生い立ち

https://ja.wikipedia.org/wiki/Sl_(UNIX)

> lsコマンドを実行しようとしてslとミスタイプすることがしばしばある。そのような場合、コンピュータは「sl」という存在しないコマンドを求めてシステムを全検索してしまい、70年代から80年代当時の処理能力の遅いコンピュータではそれにしばらく時間がかかり、作業が中断してしまうことがあった。そこでそれを防ぐため、「sl」と言う名のダミーのプログラムを用意することがあった[要出典]。
このslも、そういったダミープログラムの一つであるといえるが、ミスタイプによってロスする時間（現代においては殆ど一瞬である）よりも、SLが走り抜けるのを待っている時間のほうが長いなど、ジョークプログラムとしての性格が強い。 

当時と比べるとマシン性能が格段に速くなったため、ミスタイプで「作業が中断」する光景がなかなか想像しにくい昨今ではある。だからこそ sl の歴史を深ぼっていくことで、「ダミープログラムを作って回避する」といった当時の知恵・工夫に思いを馳せたいところである。(ダミープログラム云々は要出典ではあるが)

# 本題: VSCode で走らせる

ソースコード

https://github.com/tsubasaogawa/sl-vscode

## 実装のポイント

### TextEditorEdit.edit() をループさせるときは async/await

edit() をループして sl を動かすために、edit() を await する必要がある。

```javascript
let editor = vscode.window.activeTextEditor;
for (...) {
  editor.edit(...);       // NG
  await editor.edit(...); // OK
  await setTimeout(config.refreshRateMs);
}
```

### TextEditorEdit.edit() の undoStopBefore を適切に設定する

デフォルトでは 100 回分ループしてテキストエリアを書き換えているが、Undo してもとに戻したい場合は 100 回 Undo する必要があり、不便。
そこで edit() の第二引数 `options` に undoStopBefore = false を渡すことで、このときの edit の結果を Undo の対象から外すことができる。
sl-vscode では、初回 (i=0) のループ時のみ undoStopBefore = true とし、それ以降は false とすることで、Undo 1 回で sl 前の状態に戻すことができる。

```javascript
await editor.edit(..., { undoStopBefore: i == 0 });
```

### TextEdit.replace() で複数行 replace する場合は Range の行数と書き換えテキストの行数を合わせる

TextrEditorEdit.edit() のコールバック内で使うことの多い replace() だが、第一引数には Range オブジェクトを指定する。

https://code.visualstudio.com/api/references/vscode-api#Range

Range は一行にすることも複数行にすることも可能だが、

- Range の行数
- 書き換えテキストの行数

が一致しないと、書き換えの挙動がおかしくなることがある。例えば「書き換え後に不要な空行が追加される」など。

# むすび

VSCode で sl が動かせたからといって何も得することはないのだが、冒頭で述べたように当時の時代背景と sl の関わりについて知ることができたのはよかった。

本家 sl には ls と同様のオプション (e.g. `-a`, `-l`, `-F`) が用意されており、オプションによって登場する汽車に変化が生じるギミックとなっているため、今後の予定としてこれらオプションの実装をしていきたい。
【PHP】PHPで別ドメインへcookieを送る方法

iframe内のコンテンツのURLを開く際に、cookieが消えてしまう事象が発生した。
ifame内は別ドメインで動いているためcookieのセキュリティで別ドメインに送れず、別ドメインを経由して表示されたページではクッキーが消えているという状態だった。

### 別ドメインへcookieを送る方法
PHPで```setcookie()```を使ってクッキーをセットするときに、パラメータでセキュリティ等の詳細を設定することができる。
今回は別ドメインに対してもクッキーを送れるようにしつつ、最低限のセキュリティは保つようなパラメータを設定した。

```:phpファイル
setcookie('name', 'value', [
    'path' => '/',
    'secure' => true,
    'httponly' => true,
    "samesite" => 'None',
]);
```
上で設定しているパラメータの意味は次のとおり。

```path```：サーバー上でcookieを有効としたいパスを記入。
　　　　```'/'```をセットするとドメイン配下すべてで使用可能。

```secure```：```true```に設定するとhttps接続の場合のみcookieが送信される。

```httponly```：```true```に設定するとhttpを通してのみcookieにアクセス可となり、JSなどからアクセスできなくなる。

```samesite```：現在のドメインから別ドメインへリクエストを送るときのcookieのセット可否
　　　　　　```None```に設定すると別ドメインへクッキーを送れるようになる。


※```samesite```を```None```に設定した場合は、セキュリティが最も緩い状態になるので、```secure```や```httponly```など他のパラメータも同時に設定して最低限のセキュリティを確保する必要がある。
【PHP】同じ名前のcookieが重複して登録される不具合修正

同ドメインで同名のcookieが2つ登録されてしまい、原因を調査しました。

### cookieの判定条件
cookieは以下の3つのパラメータで差別化されています。
1. 名前 (cookieのキー名)
2. ドメイン (cookieを使用するドメイン)
3. パス (cookieが使用できるパス)

今回、名前とドメインは同じでしたが、パスが違ったため別のcookieと判断されて重複登録されていました。

### 重複登録されないようパスを指定
複数個所で同一のcookieを作成・更新する処理がある場合、重複登録されないようにパスを指定する必要があります。

今回はPHPとjavascriptでパス指定の方法を紹介します。

※例では「/」以下でcookieが使用できるようパスを設定。

#### 【PHPの場合】
```:phpファイル
setcookie('name', 'value', [
    'path' => '/',
]);
```
※なお、setcookieのオプションに「'httponly => true'」が設定されていると、javascriptなどhttp通信以外の方法でcookieの値をいじれなくなるので注意。

#### 【javascriptの場合】
```:jsファイル
document.cookie = 'name=' + encodeURIComponent('value') + ';path=/';
```
Windows10でディスプレイ間のウィンドウ移動ショートカット

# 概要

Windows10でデュアルディスプレイの環境。
別ディスプレイにアプリのウィンドウを移動させたい。
それはドラッグドロップではなくキーボードショートカットでサクサク行いたい。

そんな時。

# やり方

マルチタスクのウィンドウのスナップをオンにしておく必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6fc1b223-b1e9-d687-f408-f58369975a92.png)

移動させたいアプリのウィンドウにフォーカスされてる状態で ```Shift + Windowsマーク + 矢印キー``` 。
（矢印キー = 移動先ディスプレイが右側なら右矢印キー）

# 参考サイトさん

https://www.724685.com/weekly/qa200421.htm

# バージョン

Windows 10 Home 21H1 OSビルド 19043.1889

TODO:クリップスタジオペイントのサブビューもこのショートカットで移動できるか確認。
スマホでインプットフォーム入力時に英語キーボードを初期表示する方法【HTML】

フォーム入力時に適切なキーボードを初期表示するには、inputタグのtype属性を目的に応じて設定する必要がある。

今回はメールアドレス入力欄で英語キーボードを初期表示したいと要望があったが、inputタグのtype属性を```type=”email”```に設定すると、androidデバイスでは英語キーボードになるものの、iosデバイスでは日本語キーボードが表示されてしまう。

### iosデバイスで英語キーボードを初期表示する方法
iosデバイスで英語キーボードを初期表示するにはinputタグのtype属性を```type=”url”```に設定する。
※url属性には正規表現によるバリデーション機能があるが、pattern属性を設定しなければ有効にならないので、メールアドレス入力にも使用できる。
【MySQL】dumpファイルを使用したリストア方法

各自の開発環境のデータベースの状態を合わせるときなど、dumpファイルを入手してリストアする必要があります。

※ここではデータベースの中身を合わせたい環境からdumpファイルを入手したところから解説します。

### dumpファイルを保存
入手したdumpファイル(sample.dump)を各自の環境に保存します。
(仮想環境の場合はファイル転送ツールなどを使用して保存)

今回はCentOS7の仮想環境で以下の階層にdumpディレクトリを作成して、ここにdumpファイルを保存します。

```
/var/lib/mysql/dump/sample.dump
```
### リストア先のデータベースの準備
もしデータベースを未作成の場合、あらかじめDBを作成しておく必要があります。
mysqlにログイン状態で以下のコマンドを実行

```
CREATE DATABASE データベース名;
```
### dumpファイルのある階層へ移動してリストアを実行
dumpファイルを保存した階層へ移動します。

```
cd /var/lib/mysql/dump
```
移動した先で以下のコマンドを実行します。※mysqlに未ログイン状態で実行

```
mysql -u ユーザー名 -p データベース名 < sample.dump
```

※データ量によっては結構時間がかかるので注意。
【MySQL】MySQLを再起動せずにスロークエリログを出力する方法

本番環境など再起動できないサーバーでスロークエリログを取得するには```my.conf```の設定ではなく、以下の方法で出力できる。

### スロークエリログの出力を開始する
```
set global slow_query_log = 1;
```
### スロークエリログの出力を停止する
```
set global slow_query_log = 0;
```
### スロークエリログの出力先を指定する
```
set global slow_query_log_file='/var/lib/mysql/slow_query.log';
```
### 何秒以上のクエリをログ出力するか設定する
```
set global long_query_time = 1;
```
※ここでは1秒以上のクエリを出力する設定をしているが、0.1秒なども設定可能。

## スロークエリに関する設定の確認
```
mysql> show variables like 'slow_query%';
+---------------------+-------------------------------+
| Variable_name       | Value                         |
+---------------------+-------------------------------+
| slow_query_log      | ON                            |
| slow_query_log_file | /var/log/mysql/slow_query.log |
+---------------------+-------------------------------+

mysql> show variables like 'long%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 0.100000 |
+-----------------+----------+
```
※long_query_timeは一度quitで抜けて入りなおさないと表示が反映されないので注意。
LPC812MAXのシリアルでHello Worldと出力






x mbed2リビジョン144
x リビジョンを変更できる人むけ


目的
シリアルのテスト

![o_con717.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/74b6672b-66c4-c938-cf53-aa7d3f457825.jpeg)



参考



https://os.mbed.com/users/okini3939/notebook/Serial_jp/




```c++



//SER_HELLO_812_1

#include "mbed.h"

//         TX    RX
Serial pc(P0_4, P0_0); //812

int main()
{

    char *ss1; //文字のポインター
    int ii; //ループカウンター

    //無限ループ
    while(1) {

        ss1="Hello World !\r\n";
        ii=0; //ループカウンター
        while(ss1[ii]!=0) {

            //一文字出力
            pc.putc(ss1[ii]);
            ii++;

        } //while

        //1秒の待ち
        wait_ms(1000);

    } //while
} //main





```


![o_con833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1ca5e3de-eeef-e6e3-9955-6eb82ac4afa4.jpeg)



-7-
ajaxが通信成功しているのにfailで処理される場合の対処方法

## 原因
ajaxの通信が成功しているのに、thenではなくfailで処理されてしまう現象が発生した。

調査した結果、以下の4行目のdataTypeを指定しないと、jQueryのほうでjson形式に自動で変換しようするため、パースエラーが発生してfailに入ってしまう。

```:jsファイル
$.ajax({
  type: "post",
  url: "/api/test/done-test",
  dataType: "text",　// ここでデータ型を指定しないとjsonで処理されてparsererrorになる
  data: {
    sampleData: 'sample',
  },
})
//通信成功
.then((res) => {
  console.log('成功');
})
//通信失敗
.fail((xhr, textStatus, errorThrown) => {
  console.log(textStatus);
  console.log('失敗');
});
```
## 対策
レスポンスのデータ型dataTypeを適切に指定する。
【PHP】composer installコマンドについての超簡潔まとめ【Composer】

composerとはPHPのパッケージ管理システムです。
composerを使ってパッケージをインストールするには以下のコマンドを使用します。

```:terminal
composer install
```
1. 上記コマンド実行時、同階層に```composer.lock```ファイルが存在する場合、```composer.lock```に記載されたバージョンがインストールされる。

2. 同階層に```composer.lock```ファイルが存在しない場合、```composer.json```の情報をもとにパッケージをインストールし、インストールしたバージョン情報等を記載した```composer.lock```ファイルが新たに作成される。

3. チーム開発時にはメンバー間でパッケージのバージョンを合わせる必要があるため、```composer.lock```ファイルもバージョン管理し、```composer.lock```を使用して```composer install```を行う。
[Github] ラインセスの違い

コードを公開してようとしている方、または公開されているコードを利用しようとされている方はこちらを一読ください。

公開されているコードやソフトウェアには著作権があり、アクセスできるからと言ってやたらめったら利用してOKという事ではありません。

Githubではライセンスに関してこちらのドキュメントが公開されています。
https://docs.github.com/ja/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository

ライセンスを指定しない場合はデフォルトの著作権すわなち「ソースコードについては作者があらゆる権利を留保し、ソースコードの複製、配布、派生物の作成は誰にも許可されない」となります。

Githubでは複数のラインセンスが選択できるようになっています。下記の記事では現在Githubに上がっている人気のライセンスが記載されています（注:データは古いです、2015年)のでトップ5を見てみます。感覚的にも2022年もトレンドは変わっていない感じです。メインはMIT、Apache、GPLのようです。 各ライセンスの詳細はリンク先をご確認ください。ここでは簡単な説明のみとしています。

# MIT 44.69%
もっとも使われているラインセスがMITになります。再利用を認めているコードとして一番簡易なものとなります。

要約すると
- このソフトウェアを誰でも無償で無制限に扱ってOK。でもコードに著作権表示と本許諾表示をしなくてはいけない　＝　勝手に名前変えて自分のものにしたり、なにも表記しないまま再利用しないでね。
- 作者または著作権者は、ソフトウェアに関してなんら責任を負わない　＝　このコードを再利用したことによって何が起きても訴えないでね。

## MIT ライセンス原文
https://opensource.org/licenses/mit-license.php

# Other 15.68%
Githubには34のライセンスが選択できるようになっています。MIT、Apache、GPLのほか31のライセンスを束ねると15.68%とのことですね。

# GPL (2=12.96%, 3=8.88%)

ポイントとしては、
- MIT＋
- GPLベースのコードを使用する際はそのソースコードにアクセスができること
- 再配布する際にライセンスの変更ができない

## GPL(3)ライセンスの原文
https://www.gnu.org/licenses/gpl-3.0.html

# Apache 11.19%

基本はMITと同じですが、ライセンスの文字数は多く読み込みは大変そうです・・　

- 特許の記載も明記すること、転売など不安な方はMITではなくApacheの方を選択しているそうです。
- コードを変更して再利用する際には変更点も記載すること。

## Apache 2.0 ライセンス原文
https://www.apache.org/licenses/LICENSE-2.0

自身でコードを公開するときにも必要な知識ですが、使うときも必ずライセンスを確認して利用方法を決めましょう。

# 参考資料

- https://gist.github.com/nicolasdao/a7adda51f2f185e8d2700e1573d8a633
- https://coliss.com/articles/build-websites/operation/work/choose-a-license-by-github.html
- https://qiita.com/shibukk/items/67ad0a5eda5a94e5c032
- https://github.blog/2015-03-09-open-source-license-usage-on-github-com/
UnityでUIをスマホ画面準拠にする方法

備忘録

## Canvasオブジェクト作成
1. ヒエラルキーで右クリック
1. UI→好きなUIを選択

![スクリーンショット 2022-09-03 17.49.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/3593bce6-11e8-a587-4b1f-ee535389b72a.png)

## 画面をスマホサイズに設定
1. ゲームタブを選択
1. Free Aspectを好きな端末の比率に変更

![スクリーンショット 2022-09-03 17.51.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/62fa0e07-8cb9-bb73-e8d2-327835ffb952.png)
プログラマの恥

- プログラマの恥。オンライン会議に来ないメンバーを皆が見ているチャットで呼び出してしまった。失念という罪に罰を与えるかのごとく。他の人にも技術的な話をしながら「こんな基本も分からないの？」というようなニュアンスのことを言ってしまった。あれはダイレクトメッセージで十分だったはずだ。人を辱めてはいけない。人を辱めるのは辱めた側の罪だ。
- 組織論はポエムである。不確実性が高すぎる。抽象度が大きすぎる。当たり前だがとても本1冊で語りきれるものではない。こうして組織論の本は必然的に詩歌に落ち着く。
- 1冊の本を読んでいる最中にも次の本が欲しくなる。次に買う本こそは真実の書だと思ってブックホッピングをしてしまう。おおむね全部読み切れば問題はない。
- 瞑想で死を超越したい。瞑想を極めたら永遠にさえ生き続けられるんじゃないだろうか。
- 組織には対話が必要だとは思う。もちろん銀の弾丸ではない。誰と誰がどんな対話をするかを決めるべきだ。いや厳密に決めるべきではない。それさえも分からない。対話の手法は色々にある。1on1ミーティング。振り返りのKPT。手法が僕らを助けてくれる。手法に溺れさえしなければ。手法ファーストは滅んで良い。あくまでも痛みから手法へと手を伸ばせ。
- 知らないから出来ない。経験がないからやる資格がない。やらなければ経験は生まれない。知ることも永遠にない。
- プログラミングの本は無数にあるがプロジェクトマネージャーの本はほとんど見当たらない。どんな秘術なんだ。
- 「これで人生が変わる」と銘打たれた自己啓発書を1万冊読んだって人生は変わりはしない。彼らは文字情報を信頼しすぎている。
- スターバックスに長居する時も「俺は何杯も頼む優良顧客だ」ということを示すために空のカップを何個もテーブルに置き続ける必要はない。飲み終わったカップは捨てよう。それにカフェの収益の大半はテイクアウトだろう。
- スターバックスで抹茶のティーラテを2時間に1杯ずつほど頼んだ。すると店員さんに3回目の注文ですねと言われた。そこはカウントしておいてほしくなかった。
- 僕の感情は腰骨のあたりにある気がする。
- 見積もりが小さすぎるとタスクが溢れる。見積もりが大きすぎると無意識に寄り道をして余計な時間がかかる。見積もりは正確なのが一番良い。分かってはいるのだが。
- 見積もりが大きすぎると無意識に寄り道をして余計な時間がかかるという。この現象は本当なのだろうか。いかにもありそうな話だが。いつだって見積もりは小さく歪みがちだ。だから僕らは忙しい。いつだって自分の予測よりも何十%かの余裕が必要だ。それを見越して最初から見積もりを大きく取るとむしろタスクの完了を遅くするのだとしたら悩ましい。悩ましい。以上。答えがない。
- 僕らは大人なのにちょっとしたことで感情的になる。人間関係に安心が欲しい。

<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura

<!-- Update From Qiita API -->
最近の開発環境でHoloLens 2でMRTK V2＋Vuforiaを動かす確認をしてみた


# 気になったのである程度の最新環境でVuforiaの動作確認をしました

HoloLens 2でVuforiaを使う方法については以前以下の記事を書いたことがあります。

https://qiita.com/miyaura/items/72321d4017b63b732165#comment-280a85001a846971035b

参考にしていただけているようでうれしい限りなのですが、時々コメントで動かないという話を聞くことがあります。ということで、そこそこ新しい環境でVuforia動く環境をチェックしてみました。

:::note info
結論
ARM64でビルドしないとHoloLens 2ではVuforiaは動作しないです。
:::

## Vuforiaの最近

去年の記事の段階ではVuforiaはOpenXRに対応していなかったため、「Windows XR Plugin」もしくは「Legacyな方法(Unity 2019.4まで)」のいずれかの手段しか取れませんでした。現在はOpenXRに対応しています。一方、HoloLensでVuforiaを使う場合結構な確率で問題が起こるようでVuforiaの開発者フォーラムを見ると困っている書き込みが結構あります。

https://developer.vuforia.com/forum/archive/hololens

最近はUnity 2020.3以降を使っている人もいると思うので、以下の状況で動作を確認してみました。

* パターンA
    * Unity 2020.3.35f1
    * Mixed Reality Toolkit V2.8.2(Foundation only)
    * Vuforia 10.9.3
    * Visual Studio 2022
  
* パターンB
    * Unity 2021.3.4f1
    * Mixed Reality Toolkit V2.8.2(Foundation only)
    * Vuforia 10.9.3
    * Visual Studio 2022

いつくかパターンを調べてみたところ、Unity Editor上で動いてもHoloLens 2では動かないパターンがあり、その違いはアーキテクチャでした。Arm64アーキテクチャーでビルドすると動作するというものです。
もし、Vuforia使いたくてプロジェクト作ったもののデプロイしたら動かない人は一度ビルドアーキテクチャをチェックしてみてください。
念のためその時に動作したプロジェクトを以下のGithubに公開しています。うまくいかないときの参考にしてください。

https://github.com/TakahiroMiyaura/VuforiaWithMRTKV2Samples
Rails初級者が一ヶ月研修を受けて得た学びをまとめた

# 前書き
- RubyonRailsで開発している企業にサーバーサイドエンジニアとして転職し、一ヶ月間受けた研修で得た学びを雑に分類してまとめました。
- どの言語でもそうですが独学で初心者向け記事やチュートリアルを読み込むだけでは得られない内容が多くあったのでまとめてみた。これまでこういったまとめを作ったことがなく初めてです。
- 完全に自分のメモ書きですが、 **Railsやコーディングに初めて取り組む人にとっては役立つこともあるかと思いまとめています**

## 自分の経験とスキル
- 前職で一年間toB向けWebサービスのフロント＋バックエンド＋インフラ（ちょこっと）に携わっていた
- NuxtJs＋NodeJs、DBはCloudSQLとかとか。
- NodeJsで開発したAPIをコンテナ化してCloudRunにデプロイしたりなどの基本的なことはできる
- Railsは半年ほど前に初めて触った。ORM自体の経験もほとんどない
## 研修概要
- **事前にRailsで自分が開発した簡単なTodoアプリをレビューしてもらい、改善点・問題点を先輩がリストアップ**
- **各項目ごとにSTEPとして分けてもらい、順に取り組みPRとしてレビューしてもらう**
- 一人メンターの先輩がついてくださり、その先輩中心にサーバーサイドエンジニアの方々にレビューしてもらう
- 毎週1on1を実施しフォロー＆常にSlackで質問できる
## 研修の目的とゴール
*メンターの先輩が設定してくださったものを一部改変)*
### 目的
- **入社後1ヶ月以内に企業の開発スタイルに馴染み、一つの案件のサブを任せられるようになる**
- モチベーションを維持しながらRailsで開発することに自信を持ってもらえるようにする

### GOAL
- 転職先企業の開発環境の基礎知識をつけてもらい、どう動いているかを理解してもらう
    - Docker、Linter、CI/CD
- Rails Wayに則ったアプリケーション開発ができるようになる
    - ActiveRecord / Routing周りを重点的に
- 転職先企業の開発スタイルについて一通り理解する
    - PRの粒度 / PRレビュースタイル / ブランチ運用


## 研修を受けての感想・取り組み方
- Railsの経験が~~乏しい~~ほぼない自分が、スムーズに実務開発に取り組めるようにとても考えて用意してくださった研修だったと感じています。
- 研修は 
    > *「STEP2:開発環境を整えよう」「STEP8: より使いやすいインターフェースに作り変えよう」* 

    のような幾つかのSTEPに分かれており、STEP毎にある程度のやるべきことは書かれている状態のNotionを共有していただきました。
- それをもとに、自分でまずは考えて取り組みPRを出し、開発メンバーのSlackチャンネルでPRレビューをもらい、自分のアプリの改善をしていく形で進めていきました。
- 「自分で考えて取り組む」ことが主ではありますが、どれだけ考えてもわからなければ開発メンバーがいるSlackで質問するようにしていました。その際の先輩方の物腰はテキストベースでもとても穏やかで、ビビらずにどんどん質問ができていたと思っております。めちゃくちゃレベルの高い先輩からのレビューをバンバンいただき、実際のプロジェクトのコードも時々参照しつつ調べながら進められたので、とても密度の高い一ヶ月でした。

- 純粋にエンジニアとしての経験不足からくるミスや改善点についても、とても丁寧なコメントとソース、オプショナルな知識ともにレビューコメントをくださり非常に取り組みやすくモチベーション高く望むことができたと思っています。
- めちゃくちゃにお忙しい中でここまで質の高い研修を用意し、サポートしていただけてとても嬉しかったです。ありがとうございます🙇‍♂️



# 学びの技術領域など
- RubyonRails, Docker, GithubAction, CircleCIなどが中心です。ざっくり分野ごとに分けてあります
- レビューコメントや自分で調べたことなど、Rails関係なく初歩的な知識不足もあり恥ずかしい…
- 断りがない限り、引用形式の記述は先輩からのPRコメントを一部改変して引用したものです。


# Rubyの文法とか基本的なこと
- [Rails初級者が一ヶ月研修を受けて得た学びをまとめた~Ruby Rails~ - Qiita](https://qiita.com/Nifu-Uchi/items/8dc75429f8d21fffe8da)

# コード品質担保系
- [Rails初級者が一ヶ月研修を受けて得た学びをまとめた~GithubActions・Rspec~ - Qiita](https://qiita.com/Nifu-Uchi/items/f1fb3fecd061957df657)

# Docker・その他
- [Rails初級者が一ヶ月研修を受けて得た学びをまとめた~Docker・ほか~ - Qiita](https://qiita.com/Nifu-Uchi/items/6a955bd6669c8a6bb74e) （Dockerfileについてや、その他分類しきれなかった項目について）

# 読んでおくべき書籍
> より専門的なスキルを身につけるために、以下の書籍を読んで基礎知識を増やそう
- [安全なウェブサイトの作り方：IPA 独立行政法人 情報処理推進機構](https://www.ipa.go.jp/security/vuln/websecurity.html)
- [現場で使える MySQL (DB Magazine SELECTION) | 松信 嘉範](https://www.amazon.co.jp/dp/4798111139)
- [Web API: The Good Parts | 水野 貴明](https://www.amazon.co.jp/dp/4873116864)
- [体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践 | 徳丸 浩](https://www.amazon.co.jp/dp/4797361190)

# 手元資料
- [パーフェクト Ruby on Rails　【増補改訂版】 | すがわら まさのり](https://www.amazon.co.jp/dp/B08D3DW7LP)