OmniAICreator/Qiita-1.07M huggingface dataset:
USBメモリーで作るRHEL8.2インストールメディア(Win10 ver.)

※あわせてお読みください
Windows での USB インストールメディアの作成
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/installation_guide/sect-making-usb-media#sect-making-usb-media-windows

※最終更新日 2021/07/10 初版執筆


##１、RHEL8.2のバイナリISOを入手
下記のURLよりレッドハット公式ダウンロードコンテンツページに移動します（要RedHat垢）
https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.2/x86_64/product-software
ログイン後、下記のダウンロードページが表示されますので、それぞれ自分の実際インストールする環境のハード要件に応じてバージョンを選び、ISOバイナリファイルダウンロードしてください
![screencapture-access-redhat-downloads-content-479-ver-rhel-8-8-2-x86-64-product-software-2021-07-10-15_15_37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188534/9d739b9c-7035-e06a-f231-cc10163cbfec.jpeg)


##２、インストールメディア作成ツールを入手
次に、ISOファイルをUSBメモリーに書き込んで起動デバイスとして使えるようにインストールメディア作成ツールをダウンロードします。
下記のURLからインストールパッケージを入手し、インストールしてください。
https://getfedora.org/ja/workstation/download/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188534/42d59108-ae68-7e99-db71-bc8dcd9fde29.png)

##３、ISOファイルをUSBメモリーに書き込み
インストールできたら、作成ツールを立ち上げ、まずは以下の画面が表示されます。
今回はFedoraじゃなくて、RHELをインストールしたいので、下記のように、Custom imageを選択します
すると、出てくるファイル選択ダイアログで、先ほどダウンロードしたRHELＩＳＯファイルの保存場所に移動して、ファイルを選択し「開く」ボタンを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188534/cb23eeee-dd1c-0572-2ec3-222075c2952b.png)

どのデバイスをインストールメディアとして使うか、事前によーくご確認ください。間違って外付けＨＤＤを上書きしてしまう、なんて惨劇は絶対避けたいですよね。デバイス名確認終わったら、書き込みボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188534/eb9b5ae9-45fd-bb57-3a29-ff826525d4b1.png)
じっと待つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188534/c87d16a3-89d0-0850-e4d4-3765c7bb4e7c.png)

終わったら、以下のように「終わりました！」って表示されます。なんかこの文言、喜んでるのかな？えらいえらい、よしよしよしよしヾ(・ω・｀)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188534/52e2b9f5-f272-747f-1a4f-e09e0c2dad82.png)

スタートメニューのアイコンを右クリックして、「ディスクの管理」を開いて、以下のように、USBメモリー上ANACONDAみたいなパーティションが作られたはず。これでインストールメディアをブートデバイスとして使える。PCから抜き取り、ノートPCに差し込んでノートPCを立ち上げてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188534/84cfa9ea-4211-9f8e-d24f-52a605e21e1d.png)



以上、USBメモリーで作るRHEL8.2インストールメディア(Win10 ver.)の内容でした。

#レファレンス
Windows での USB インストールメディアの作成
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/installation_guide/sect-making-usb-media#sect-making-usb-media-windows
未経験からCCNA取得までの道のり　ver7

⭐︎サブネット化したアドレスからネットワークアドレス・ブロードキャストアドレスを2進数に変換せずに求める計算方法！


✽①試算対象となるオクテットに残っているホスト部のビット数だけ2の累乗計算をする

✽②対象オクテットの数字を①の計算結果で割り商を出す

✽③①の結果と②を掛け算した結果を対象オクテットの値とし、右のオクテットを全て0にするとネットワークアドレスになる！

✽④③の答えと①の答えを足して-1した結果を対象オクテットの値として、右のオクテットを255にするとブロードキャストアドレスになる！
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
🚩具体的な計算例

⑴192.168.3.149/29　というIPアドレスの場合

/29なので第4オクテットに5ビットはみ出ているため試算対象は第4オクテットになる

①第4オクテットに3ビットホスト部があるため、2³=8 となる

②149➗8となるため商は18となる

③18*8=144となり、第4オクテットの値を144とした
192.168.3.144がネットワークアドレスとなる

④144+8-1=151となり、第4オクテットの値を151とした
192.168.3.151がブロードキャストアドレスとなる！
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
⑵172.16.201.33/19というIPアドレスの場合

①第３オクテットに５ビットホスト部があるため、2⁵=32となる

②201➗32となり商は6となる。

③6*32=192となり、第3オクテットの値を192とし右のオクテットを0にした
172.16.192.0がネットワークアドレスとなる

④192+32-1=223となり、第3オクテットの値を223とし右のオクテット255にした
172.16.223.255がブロードキャストアドレスとなる！
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
これを覚えたら、192.168.3.149/29　というIPアドレスを見たときに
11000000.10101000.00000011.10010101　と2進数に直して
（11000000.10101000.00000011.10010）｟101｠
（）がネットワーク部で｟｠がホスト部

サブネットマスクは
11111111.11111111.11111111.11111000 となる
AND演算をして
ネットワークアドレスは
11000000.10101000.00000011.10010000だから10進数に戻すと192.168.3.144となる
ブロードキャストアドレスは11000000.10101000.00000011.10010111だから10進数に戻すと192.168.3.151となる

という面倒くさい計算をしなくて済む！！
これは絶対覚える！
【Rails】JavaScriptによる攻撃について

# 目的
XSS攻撃について理解を深める。

# 目次

1. [はじめに](#はじめに)
1. [XSSとは](#xssとは)
1. [反射型XSS](#反射型xss)
1. [格納型XSS](#格納型xss)
1. [XSSの対処法](#xssの対処法)
1. [Ruby on Railsにおける対処法](#ruby-on-railsにおける対処法)

# はじめに

JavaScriptはクライアントサイドで動くプログラミング言語です。
そのため、悪意のあるJavaScriptのプログラムをブラウザに埋め込めば、ユーザーにそのプログラムを実行させることができてしまいます。
今回はこのような、JavaScriptを利用した攻撃について理解を深めていきます！

# XSSとは

JavaScriptを利用した攻撃方法を`XSS`といいます。
`XSS`とは、攻撃者が脆弱性のあるWebアプリケーション上に、悪意のあるJavaScriptのプログラム（スクリプト）を埋め込み、そのサイトの利用者を攻撃する手法です。

「スクリプトを埋め込む」とは、ユーザーがブラウザ上で表示するHTML中に、JavaScriptのプログラムを埋め込むことを言います。例えば、以下のようなHTMLがあったとします。

```html:例
<!DOCTYPE html>
<html>
<div>
  こんにちは
  <script>alert("不正なスクリプトです")</script>
</div>
</html>
```

このように、悪意のあるスクリプトをWebアプリケーションを表示したときに実行させるような攻撃を`XSS`といいます。

今回は例として、アラートを表示するスクリプトを埋め込みました。しかし、実際はユーザーの個人情報などを、悪意のある人のサーバーなどへ送付するスクリプトが埋め込まれることが多いです。

# 反射型XSS

`反射型XSS`とは、悪意のあるURLをクリックすると、脆弱性のあるWebアプリケーション上でスクリプトが実行されるようにする手法です。
具体的には以下のような順序で行われます。

①ユーザーにURLをクリックさせる
攻撃者が、ユーザーに悪意のあるURL（脆弱性のあるWebアプリケーションへ遷移するURLに細工をしたもの）をクリックさせます。ユーザーにクリックさせる方法としては、メールで送付したり、掲示板などに書き込んだりすることがあります。

②ユーザーがクリックすると脆弱性のあるWebアプリケーション上でスクリプトが動く
上記の悪意のあるURLには、脆弱性のあるWebアプリケーション上で発火するスクリプトが仕込まれています。そして、ユーザーが脆弱性のあるWebアプリケーションのページを開くと、そのスクリプトが発火し個人情報を抜き取られます。

③スクリプトが発火すると、攻撃者のサーバーへ個人情報が送られる
スクリプト発火後、クリックしたユーザーの個人情報が攻撃者のサーバーへ記録されてしまいます。

この様にURLをクリックしてレスポンスがあると、即座にスクリプトが実行されることから、「反射型」と呼ばれます！

# 格納型XSS

`格納型XSS`は脆弱性のあるWebアプリケーションの投稿などに、悪意のあるスクリプトを埋め込み、ユーザーがそのWebアプリケーションを訪れたときにスクリプトが発火するようにする攻撃手法です。
具体的には下記の手順です。

①攻撃者が、脆弱性のあるWebアプリケーションにスクリプト付きの投稿をする
フォームからコンテンツを投稿する際に、スクリプトを埋め込んで投稿をします。

②ユーザーが、その投稿のあるページを訪れるとスクリプトが発火する
スクリプトが埋め込まれた投稿のページを開くと、そのスクリプトが発火し個人情報が抜き取られます。

③スクリプトが発火すると、攻撃者のサーバーへ個人情報が送られる
スクリプト発火後、ユーザーの個人情報が攻撃者のサーバーへ記録されてしまいます。

このように、脆弱性のあるWebアプリケーションにスクリプトを格納し、ユーザーが訪れたタイミングで発火するようになっていることから「格納型」と呼ばれます。

# XSSの対処法

XSSが発生する主要因として、フォームから入力されたスクリプトタグ`（<script>...</script>）`などが、スクリプトとしてそのままブラウザに反映されてしまっていることがあげられます。
したがって、XSSを防ぐためには、HTMLにおいて意味を持つ`「"」`や`「<」`を何らかの別の文字列に変換します。この変換する際に用いられる記法を`文字参照`と言います。

`文字参照`とは、ブラウザ上で表示できない特殊文字を表記する際に用いられる記法です。例えば、HTML中に`「<」`もしくは`「>」`と記述すると、この2つはタグの「始まり」「終わり」と認識されてしまいます。
これらの特殊文字を文字列としてブラウザ上に表示するためには、`文字参照`を用います。

|  変更前  |  変更後    |
| ------- | --------- |
|  <      |  & lt;    |
|  >      |  & gt;    |
|  &      |  & amp;   |
|  "      |  & quot;  |
|  '      |  & #39;   |

上の表は、XSSの対策をする際に変換すべき特殊文字の一覧です。
これらの特殊文字を`文字参照`に変換して表示すれば、外部から埋め込まれたスクリプトが実行されることはありません。

# Ruby on Railsにおける対処法

Ruby on Railsでは、上記で紹介したような主要な対処法についてはカバーされています。
具体的には、ビューファイルにおける`ヘルパーメソッド<%= %>`です。このヘルパーメソッドを用いることで、XSSへの対策を行うことができます!
RancherのワイルドカードDNSをxip.ioからnip.ioに書き換える

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに
## 0-1. xip.ioについて

言わずもがなですが、FQDNをIPアドレスに変換してくれるのがDNSサーバーです。
DNSサーバーにFQDNとIPアドレスが登録されていなければ、FQDNを問い合わせてIPアドレスを返答することはありません。

しかし、FQDNとIPアドレスを登録するのは手間がかかります(特に開発環境であったり、検証環境であったり)。
そこで、FQDN内にIPアドレスを書いて問い合わせると、自動的にIPアドレスを返却するというワイルドカードなDNSが考えられました。

xip.ioは、そのワイルドカードな無料DNSサービスで、FQDNが`hogehoge.192.0.2.1.xip.io` と問い合わせると IPアドレス `192.0.2.1` が返るようになっていました。

## 0-2. xip.ioシャットダウン

無料で便利に使えるxip.ioサービスだったのですが、残念ながら2021年4月30日にシャットダウンしてしまったようです。

## 0-3. Rancherでxip.ioが使われている

RancherのUI画面でIngressオブジェクトを作成すると、`xip.io`ドメインを使ったFQDNが生成されます。

Rancher設定画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/648988da-a62c-f9b7-0485-b874a0f878b3.png)

生成された画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/0b6e1774-1ac8-8cd2-f114-e733bd063181.png)

ちょっとテストしたいときに毎回xipをnipに書き換えるのは面倒なので、グローバル設定から変更しました。

# 1. Rancher
## 1-1. 設定画面を開く

メニューの「グローバル」をクリックして「グローバル」を選択します。
「グローバルメニュー」から「設定」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/177ffa38-17f8-843e-ca8e-4ff8061b8371.png)

## 1-2. ingress-ip-domainを編集

ingress-ip-domainの右端の三点リーダから「編集」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/c88e60a7-7a88-7008-e10b-35cca1223f5b.png)

`xip.io`を`nip.io`に書き換えて、「保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/4d6e0ad7-0d17-21c9-4e07-56812b213bc3.png)

## 1-3. ingressをデプロイ

ネームスペースは何でも良いのでingressを一つデプロイしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/e7772c9e-d72b-6d75-7988-d7836147624a.png)

.nip.ioで自動生成になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/1f987cc2-4d39-8f6d-20f5-5452a966a169.png)

書き換わりましたね。

# 2. まとめ

* xip.ioは使えなくなった
* rancherのingress-ip-domainを書き換えればOK

以上です。
データベースからの情報の呼び出し。

ビューにコントローラーで定義したインスタンス変数を渡して、
データベースから情報を取得する際に、

```
インスタンス変数.カラム名
```
だけではなく、

```
インスタンス変数.テーブル名
```
も可能。
IDaaS 概要

* IDaaSについて提供機能など概要情報をメモする。

## IDaasとは

* Identity as a Serviceの略称。
* アイデンティティ（Identity）管理をSaaSのようにクラウドで行うサービスを指す。
  * 一般的なWebアプリケーションで必要な認証系機能（ユーザー・権限管理など）を提供する。

![IDaaS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/f5179cd7-5585-763d-46f4-f4c0bf8fd765.png)


## 代表的なサービス

* Amazon Cognito(AWS)
* Auth 0 (Auth 0)
* Azure Active Directory(Microsoft)
* OneLogin(OneLogin)
* Google Cloud Identity(Google)
* Okta Identity Cloud(Okta)

...



## 代表的な提供機能

1. **認証・シングルサインオン機能**
   * ユーザーの認証
   * 多要素認証
   * 複数のWebサービスへのシングルサインオン（SSO）など
2. **ID管理機能**
   * 以下のID管理機能
     * IDaaS自体が持つID
     * 登録・連携したWebサービスが持つID
3. **ID連携(IDフェデレーション)機能**
   * 独自のID管理を行う複数のサービスで、それぞれのユーザーIDをリンクさせる。
     * IDaaSと各WebサービスとのID連携
     * IDaaSと社内システムとのID連携
4. **IDプロビジョニング機能**
   * 複数サービスでIDの整合性を取る(同期する)など、自動的に管理する機能。
     * あるIDを追加したら他の連携サービスにIDを追加する。
     * あるIDを削除したら他の連携サービスからIDを削除する。 など
5. **認可機能**
   * サービスへのアクセス権付与・コントロール
6. **監査機能**
   * ログ管理機能。
     * IDaaSおよびサービスに対する認証ログ
     * 管理者作業のログ　など

## 利用メリット

* IDフェデレーションの利用により、ユーザビリティが向上する。
* 自社で認証基盤開発をせずに済む。
* 認証基盤サーバー管理が不要になる。
* 多要素認証などセキュリティ機能を導入しやすい。



## 参考情報

* [最近流行り(?)のIDaaSについてまとめます](https://qiita.com/osak/items/28eda07e5d0183c6f99a)
* [IDaaS（Identity as a Service）とは](https://www.cybernet.co.jp/onelogin/product/idaas/)
* [IDaaSとは何か？ Azure ADやOktaなどのクラウド型ID管理サービスを比較する](https://www.sbbit.jp/article/cont1/49879#head1)
Linux　まとめ

##　5_ファイル操作の基本
### mkdirコマンド
ディレクトリの作成

```
$ mkdir [オプション] <作成するディレクトリ名>
```
### touchコマンド
ファイルの作成

```
$ touch <新しいファイル名1> <新しいファイル名2> …
```

### rm, rmdirコマンド
ファイル/ディレクトリを削除する

```
$ rm [オプション] <削除するファイル名1> <削除するファイル名2>…
$ rmdir <削除するディレクトリ名>
```

### catコマンド
ファイルを表示する

```
$cat [オプション] <ファイル名>
```

### lessコマンド
ファイルをスクロール表示する

```
$less [オプション] <ファイル名>
```

### cpコマンド
ファイル/ディレクトリをコピーする

```
$cp [オプション] <コピー元>　…　<コピー元>
```

### mvコマンド
ファイルを移動する

```
$mv [オプション] <移動元>　…　<移動先>
```

### lnコマンド
リンクを張る
※ファイルに別名をつける

```
$ln [オプション] <リンク元ファイル名>　<リンク名>
```
## 07_テキストエディタ
### vim
|コマンド  |内容  |
|---|---|
|:q  |終了  |
|:w  |上書き保存  |
|:wq  |上書き保存して　終了  |
|:q!  |保存せずに終了  |
|h  |左にカーソル移動  |
|j  |下にカーソル移動  |
|k  |上にカーソル移動  |
|l  |右にカーソル移動  |
|0  |行頭にカーソル移動  |
|$  |行末にカーソル移動  |

## 08_bash設定
### エイリアス
コマンドに別名をつけて実行する

```コマンド
#エイリアスの設定
$ alias ls='ls -F'

#エイリアスの確認
$ type ls

#エイリアスの削除
$ unalias ls
```

## 14_正規表現
### 繰り返しを指定するメタ文字
|基本正規表現  |拡張正規表現  |意味　　|
|---|---|---|
|*  |*  |0回以上の繰り返し  |



## 14_高度なテキスト処理
### sedコマンド
文字列を置換するときに用いられることが多い

```コマンド
$ sed [オプション] <スクリプト> <対象ファイル>
```

### awkコマンド
テキストの検索や抽出・加工などの編集操作を行う

```コマンド
$ awk <スクリプト> <対象ファイル>
```

## 15〜17シェルスクリプト
### 実行方法

```コマンド
1.ファイル名のみ指定して実行する
  $ ./hogehoge.sh
　　　　-- シバンが必要
2.シェルの引数として実行する
  $ bash hogehoge.sh
3.sourchコマンドを利用して実行する
  $ source ./hogehogel.sh
　　　　-- 現在設定しているシェル環境の影響を受ける
```

## アーカイブと圧縮

### tarコマンド

```
#ファイルをアーカイブする
tar cf <アーカイブファイル> <アーカイブ元ファイルパス>

#アーカイブファイルの内容を表示する
tar tf <アーカイブファイル>

#アーカイブファイルの展開
tar xf <アーカイブファイル>
```

### gzipコマンド
```
#ファイルを圧縮する
gzip <圧縮元ファイル>
```

### zipコマンド
デフォルトではインストオールされていないのでパッケージをインストールしてから使用する

```
# CentOS
yum install zip unzip
```
```
#zipファイルの作成
zip -r <圧縮ファイル名> <圧縮対象パス>
```

## その他
###　マウスがVirtualBoxから脱出できない
▼macの場合
⌘キーで解消
※コマンド　＋　Qでも強制的に抜けることは可能です。

### VirtualBoxでOS間のクリップボードを共有する方法
1. VirtualBoxを起動し
1. クリップボードを共有したいゲストOSを選択します。
1. 「設定」をクリックしましょう。
1. 「高度」をクリックします。
1. デフォルトでは「クリックボードの共有」が
1. クリップボードを共有するための設定を
1. 「OK」をクリックしましょう。
※ GuestAddtionsをインストールする

### ブレース展開
連番のリストを作成可能

```
{<開始数値>..<終了数値>}
ex) $ touch file-{1..5}.txt
```
【R】tibbleの行ごとに各列の値を合算したい

Rでgroup_byしているtibble型のデータを列ごとに合算するのは、summarize(Sum = sum(x1))で簡単に実施できる。
しかし、行ごとに計算する方法がわからなかった。

以下のような z がある。

```R
> library(tidyverse)
> z <- tibble(x1=c(1, 2), x2=c(9L, 6L), x3=c(2, 2), x4=c(0.9, 0.6))
> z
# A tibble: 2 x 4
     x1    x2    x3    x4
  <dbl> <int> <dbl> <dbl>
1     1     9     2   0.9
2     2     6     2   0.6
```

このzで、x2,x3,x4を足したSum行を作成したい。

```
  x1 x2 x3  x4  Sum
1  1  9  2 0.9 11.9
2  2  6  2 0.6  8.6
```
そのやり方を二つ考えた。

```r
#１：for文の活用
s <- numeric(nrow(z))
for(i in 2:ncol(z)){
  s <- s + z[[i]]
}
z <- transform(z, Sum = s)

#２：selectでx1を削除してからrowSumsで合計
z %>%
  select(-x1) %>%
  rowSums() -> zz
z %>%
  add_column(Sum = zz) -> z
```
Railsで架空のCafeのHPを作ってみよう!【4日目】

#概要
基本Railsの記法に則り書いていきます！
１から全ての説明ではなく
その中であれ？どうやるの？と
疑問に思った点や実装に困った箇所を
ピックアップして紹介していきます♩

#設定と準備
・Rails
・HTML
・CSS
・Javascript(jQuery)

↑上記の言語とフレームワークを使い
架空(自分で考えたテキトーなもの)のCafeの
HPを作っていこうと思います！

#4日目の作業内容:round_pushpin:
・トップページから他のページへの遷移(リンク)

#4日目の躓いた箇所:zap:
7つのアクション以外を使った
link_toのパスの指定はどうやったらいいの？？？

今回はトップページ
(views/sample/index.html.erb)から
7つのアクションではない自分でファイルを作った別のページ(views/sample/form.html.erb)に
遷移させると仮定！

```index.html.erb

<body>

  <link_to "formへ遷移", sample/form 　/>

</body>

```

```index.html.erb

<body>

  <link_to "formへ遷移", sample_form_path 　/>

</body>

```

こんな書き方かな...とやってみたが全然ダメでした。

#結論
自分でコントローラーにアクションを定義して
それをroutes.rbで使えるようにする必要があった！

まずはアクションを指定！
views/sample/form.html.erbに遷移したいので
sampleコントローラーにformアクションを作ります。

```controllers/samples_controller.erb

class SamplesController < ApplicationController

  def index
  end

  def form
  end

end

```
indexはトップページへの遷移で作ったもので
その下にformアクションを追加します。

そしたらroutes.rbに自分で作ったアクションを
使えるように追記していきます。

```routes.rb

Rails.application.routes.draw do
  root 'samples#index'
  resources :samples, only: [:index] do
    collection do
      get 'form'
    end
  end
end

```

resourcesに入れ子構造にする形で
collectionを使い自分の作ったformというアクションを
使えるようにしました。

上記ではcollectionですがparamsとして(:id)が必要な場合
特定の情報が必要になる場合などは**number**にしてください。

これで自分の作ったアクションが使えるようになったので
コマンド　rails routesでパスの確認！

     form_samples GET    /homes/contact(.:format)                                                                 samples#form

このように自分で作ったアクションにしっかりと
パスが存在するのを確認したらlink_toのパスに指定！

```index.html.erb

<body>

  <link_to "formへ遷移", form_samples_path 　/>

</body>

```

これで無事自分の作ったviewに自分の作ったアクションを使い
遷移させることに成功。
PyAutoGUI チートシート（画面操作の自動化）

# PyAutoGUIとは

プログラムで画面のカーソルを動かしたりクリックしたりキーボード入力したりして、
操作を自動化を行えるライブラリ。

プログラム自体は簡単でインパクト大なので教育現場で「プログラムができること」として披露するのもよさそう。

**※プログラムが完成しないうちは画面上の間違ったところをクリックしたりして大変なことになるので、誤操作されても問題ない状態にして動かすこと。**

# インストール

```
pip install pyautogui
```

# キーボード操作

### キーを押す

```python
pyautogui.press('enter')
```

### キーダウン

**※押しっぱなしになるのでキーアップとセットで使うこと**

```python
pyautogui.keyDown('shift')
```

### キーアップ

```python
pyautogui.keyUp('shift')
```

### ショートカットキーなどの同時入力

```python
pyautogui.hotkey('ctrl', 'c')
```

### テキスト入力

```python
pyautogui.write('I gained freedom.')
```

**注意:**

USキーボードを想定されて作られているようで、以下の文字を入力すると他の文字が入力される。

* `^` → `~`
* `@` → `` ` ``
* `:` → `*`

※[このページ](https://teratail.com/questions/79973)を参考にすると解決できるがライブラリ自体を変更するので自己責任で。

# マウス

### カーソル移動

```python
pyautogui.moveTo(x, y)
```

### クリック

```python
pyautogui.click() # 左クリック
pyautogui.click(button='right') # 右クリック
```

# 画像認識でカーソル移動してクリック

**カーソル移動したい部分を画像ファイルとして事前に保存しておくこと**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/b148aa4f-d8f4-dc93-5258-cf1beaa2b4b9.png)

### 保存したファイルと同一の部分を探してクリック

```python
localtion=pyautogui.locateCenterOnScreen('heart.png') # 見つからない場合Noneが変える
if localtion is not None:
    pyautogui.moveTo(localtion) # 見つかった場合はlocationにX,Y座標が入る
    pyautogui.click()
```

**※画像認識は数秒ほど時間がかかったり、1回で認識してくれなかったりする。**
**→1回で認識できる確率が低いときは、2回チェックさせることで対象箇所を探す確率が向上した。**
**操作スピードを上げるなら、上記の座標でのカーソル移動の方が格段に速いので画像認識処理は減らした方がいい。**

# スクリーンショット

```python
img = pyautogui.screenshot(region=(225, 225, 650, 450))
img.save('screenshot.png')
```

**※範囲指定を省略すると全画面のスクリーンショットとなる。**

# おまけ

ブラウザなど画面の表示までに時間がかかる場合などはスリープ処理を入れるとよい。

```python
from time import sleep
sleep(1) # 指定時間は秒単位
```

# 参考

* [PyAutoGUI公式ドキュメント](https://pyautogui.readthedocs.io/en/latest/)
* [PyAutoGuiで繰り返し作業をPythonにやらせよう](https://qiita.com/hirohiro77/items/78e26a59c2e45a0fe4e3)
* [PyAutoGUIを使った自動化 -入門編- 〜D&Dやスクロールなどのマウス操作も簡単に〜](https://qiita.com/oh_rusty_nail/items/e7f39a6fc3624ac9ff09)
* [teratail - pyautoguiを用いて「:」の入力をしたいです。](https://teratail.com/questions/79973)

# その他

## 「:」入力対応する場合のpyautoguiライブラリの場所（Windows）

```
C:\Users\ユーザ\AppData\Local\Programs\Python\Python38\Lib\site-packages\pyautogui
```
【Laravelクエリビルダ】where内で変数を用いて期間の条件を絞る方法

Laravelのクエリビルダで、whereを用いて対象期間内のデータを取得する方法を解説します。

バージョンは6系です。

ブログで以下のような記事も書いています。

https://www.kamome-susume.com/enginner-job-change-site/

## ゴール
期間の開始日と終了日があり、期間内のデータを取得する。

開始日:2021-06-01
終了日:2021-06-29

| user_id | created_at |
|:-:|:-:|
|  1 | 2021-06-01 12:21:33  |
|  2 |   2021-06-15 15:53:22|
|  3 |   2021-06-30 09:22:12|
↓

| user_id | created_at |
|:-:|:-:|
|  1 | 2021-06-01 12:21:33  |
|  2 |   2021-06-15 15:53:22|

## サンプルコード

コントローラー(PostController.php)

```
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;←バージョン8系なら use App\Models\Post;

class PostController extends Controller
{
    public function index()
    {
        $this->posts = new Post();

        $start = '2021-06-01';
        $end   = '2021-06-29';
        $results = $this->posts->getUser($start, $end);

        return view('posts.index', compact(
            'results',
        ));
    }
}

```

$start,$endに開始日と終了日をセットし、引数でモデルに変数を渡します。

モデル(Post.php)

```
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;←記述を忘れない

class Post extends Model
{
    public function getUser($start, $end)
    {
      return DB::table('posts')
              ->select('user_id', 'created_at')
              ->where([
                ['created_at', '>=', $start],
                ['created_at', '<=', $end]
              ])
              ->get();
    }
}

```
モデルにロジックを書きます。

whereで対象期間を指定します。
ちなみに、`->whereBetween('created_at', [$start, $end])`でも同様の処理ができます。
こっちの方がコンパクトでいいですよ。

ビュー(index.blade.php)

```
<table>
    <thead>
      <tr>
        <th>日付</th>
        <th>ユーザーID</th>
      </tr>
    </thead>
    <tbody>
    @foreach ($results as $result)
      <tr>
        <td>{{ $result->created_at }}</td>
        <td>{{ $result->user_id }}</td>
      </tr>
    @endforeach
    </tbody>
</table>
```

![スクリーンショット 2021-07-10 13.07.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1693248/a96a144c-b998-d5c1-86a1-286af899cbb8.png)

このようにデータを取得できました。

もし参考になったら忘れずに記事のストックまたはLGTMをお願いいたします。

ブログで以下のような記事も書いています。

https://www.kamome-susume.com/enginner-job-change-site/
gmailAPIを使ったデータ共有メール作成PGM(AddSpion)

<h2>gmailAPIを使ったデータ共有メール作成PGM(AddSpion)</h2>

gmailAPIを使ってデータ共有メールを自動送信するPGMを作りました
ちなみにタイトルの意味はアドー（演奏）、スピオンー（参加）のマイ人工言語です…
<hr>
使い方
gmailのアプリパスワードを作成し、
メール送信用設定ファイルを作成し(作成例ファイルはgithubURLのMailGroupFile.txtに置いてあります)、コマンドプロンプトから各自項目を入力し、送信します.
このようなPGMから演奏データや散歩画像データなどがグループ内でうまく共有できる
ようになればいいですね...
<br>
自動送信でのメールタイトルは以下のようになります
"AddSpion-MailGroup-" + メールグループId + "-MailType-" + メールタイプID + "-Label-" + タイトルラベル
<hr>
githubURL:https://github.com/NanjoMiyako/AddSpion

サンプルスクリーンショット
![screenshot1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/8d16828a-633d-22e0-eaf5-f07d464f943e.jpeg)

メール本文例
メールタイプ:AddSpion2
データ有効期限:2日間
共有データパス1:e1
共有データパス2:e2
コメント:f1



<hr>
参考にしたサイト
<a href="https://qiita.com/eito_2/items/ef77e44955e43f31ba78">PythonでGmailを送信する - Qiita</a>
<a href="https://hep.eiz.jp/gmail-inbox-period-search/">Gmailで日付や期間を指定してメールを検索する方法 | Hep Hep!</a>
<a href="https://cloudfish.hatenablog.com/entry/2016/05/08/112600">pythonのimaplibでメールのAND/OR検索【cloudpack 大阪 BLOG】 - cloudfishのブログ</a>
<a href="https://support.google.com/mail/answer/185833?hl=ja">アプリ パスワードでログインする - Gmail ヘルプ</a>
心を無にしてLAMP環境+phpMyAdminを作るコマンドまとめ

# はじめに
スクリプトにしておいた方がいいかなぁ～って
思ったけど、意外とこのくらいの雑さがちょうどいいときがあるので
メモとして残す。

# 前提条件
AWS EC2 t2.microで動作

# httpdのインストール
updateはやらなくてもよかったような気がする

```
yum -y update
yum -y install httpd
systemctl start httpd
echo "hello, world" >> /var/www/html/index.html
```

※ブラウザ上からhttp://[サーバのIPアドレス]/index.html　で画面表示できれば成功

# phpのインストール

```
ln -sf /usr/share/zoneinfo/Japan /etc/localtime
yum install -y php
cp /etc/php.ini /etc/php.bak
echo "<?php echo phpinfo();?>" >> /var/www/html/index.php

systemctl restart httpd
```

※ブラウザ上からhttp://[サーバのIPアドレス]/index.php　で画面表示できれば成功
``

# MySQLのインストール

```
yum remove mariadb-libs
yum install --enablerepo=mysql80-community mysql-community-server
yum install --enablerepo=mysql80-community mysql-community-devel
touch /var/log/mysqld.log
systemctl start mysqld 
systemctl status mysqld.service
systemctl enable mysqld
yum install -y php-mysqlnd
systemctl restart mysqld
mysql_secure_installation
→ passwordは/var/log/mysqld.log　で"password"で検索したらそっと初期パスワードが書いてある
　→ここでrootパスワードを変更する（後で使うのでメモしておく）
vi /etc/my.cnf
 character-set-server = utf8　←末尾に追記
systemctl restart mysqld
```

# （オマケ）phpMyAdminのインストール

```
yum-config-manager --enable epel
yum install -y phpmyadmin
vi /etc/httpd/conf.d/phpMyAdmin.conf
```

## phpMyAdmin用のユーザアカウントを用意する
https://qiita.com/ucan-lab/items/3ae911b7e13287a5b917

によると、MySQL8.0のデフォルト認証方式がphpの接続ライブラリの認証方式に対応してないので変更してやる必要があるそうだ。

1. MySQL8.0.4以降 のログイン認証方式は caching_sha2_password がデフォルト
1. PHPのMySQL接続ライブラリが caching_sha2_password　に未対応のため接続不可
1. 解決策としては認証方式を mysql_native_password に戻してやればよい

そこで、、、

https://labor.ewigleere.net/2020/11/01/phpmyadmin_login_caching_sha2_password/

を参考に設定を変更。

### MySQLへログインして、アカウント作成

```
mysql -uroot -pMysql@r0ot
※Mysql@r0otはmysql_secure_installationで変更したときのパスワード

CREATE USER sh00072021 IDENTIFIED BY 'Sh0007202!';

```

### phpMyADminへログインする
http://[サーバのIPアドレス/phpMyAdmin でイケる

ID/PWはさっき作ったsh00072021でログイン。

![スクリーンショット 2021-07-10 131936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/aea5d5e7-b2a6-8e99-81a4-05f33b02f35d.png)

ログイン直後の画面がコチラ。

![スクリーンショット 2021-07-10 131657.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/5b975929-042e-8c08-6b82-3640f6c3371d.png)
pandasで複数列を引数に持つ関数の返り値を列に追加する


pandasで関数に複数の列の値を渡して返り値を列に追加する方法が分からなかったので調べてメモ。
ついでにDataFrameに列を追加する方法も。

*test.csv*

|id  |x  |fix  |
|---|---|---|
|1  |2000  |8  |
|2  |1500  |4  |
|3  |3000  |5  |
|4  |1000  |15  |

```python:test.py
import pandas as pd

def calc(dicModel, x, size, fix, modelName):
    ret = 0
    if x < dicModel[modelName]['Dx0']:
        ret = dicModel[modelName]['Dy0']
    elif x < dicModel[modelName]['Dx1']:
        ret = (dicModel[modelName]['Dy1']-dicModel[modelName]['Dy0'])/ \
              (dicModel[modelName]['Dx1']-dicModel[modelName]['Dx0'])* \
              (x-dicModel[modelName]['Dx0']) + dicModel[modelName]['Dy0']
    else:
        ret = dicModel[modelName]['Dy1']
    if size > 10:
        ret += 5
    if fix >= 8:
        ret += 1
    return ret

#モデルの情報の辞書
dicModel = {'modelA':{'size':9.8, 'Dx0':1000, 'Dy0':-1.0, 'Dx1':3000, 'Dy1':5.1, }, \
            'modelB':{'size':13.3, 'Dx0':500, 'Dy0':0, 'Dx1':4000, 'Dy1':4.1, }}
#IDとモデル名の辞書
dicId = {1:'modelA', 2:'modelB', 3:'modelB', 4:'modelA'}

#読み込み
df = pd.read_csv('./test.csv')

#モデル名とサイズの辞書を作成
dicSize = {}
for amodel, ainfo in dicModel.items():
  dicSize[amodel] = ainfo['size']

#dfにIDを基にしたモデル名の列を追加
df['modelName'] = df['id'].map(dicId)
#dfにモデル名を基にしたサイズの列を追加
df['size'] = df['modelName'].map(dicSize)

#dfに複数列を引数とした関数の返り値の列を追加
df['calc'] = df.apply(lambda x: calc(dicModel, x['x'], x['size'], x['fix'], x['modelName']), axis=1)

```

結果

|id  |x  |fix  |modelName  |size  |calc  |
|---|---|---|---|---|---|
|1  |2000  |8  |modelA  |9.8  |3.050000  |
|2  |1500  |4  |modelB  |13.3  |6.171429  |
|3  |3000  |5  |modelA  |13.3  |7.928571  |
|4  |1000  |15  |modelA  |9.8  |0.000000  |

検算

```python:
>> print(calc(dicModel=dicModel, x=1500, size=10, fix=4, modelName='modelB'))
6.171428571428571
```
laravel(npm)で使ってみた javascript ライブラリ2021 その１

laravelのフロント部ははデフォルトでHTMLテンプレートにbalde、
javascriptはnpmベースになっている。変えることも可能。

webpack.mix.jsにてjsとcssの指定がある。

全画面共通で使用するライブラリは
`resources/js/bootstrap.js`で記載、
スタイルシート(cssやscss)などは
`resources/sass/app.scss`に記載

`npm run prod/dev`で以下のファイルに内包される。分割することも可能。
`public/js/app.js`
`public/css/app.css`

#### popper.jsとjquery
デフォルトで記載有

#### bootstrap
HTMLのレイアウトテンプレート
[公式](https://https://getbootstrap.com/)

`npm install bootstrap`

```javascript:resources/js/bootstrap.js
require('bootstrap');
```

```sass:resources/css/app.scss
@import '~bootstrap/scss/bootstrap';
```

#### moment
時間操作ライブラリ。
[メジャーアップを止めるらしい](https://momentjs.com/docs/#/-project-status/)ので代替ライブラリが必要
[公式github](https://github.com/moment/moment/)

`npm install moment`

```javascript:resources/js/bootstrap.js
window.moment = require('moment');
```

#### tempusdominus-bootstrap-4(bootstrapベースのDatetimepicker)
bootstrap3までは提供されていたが、v4になってから提供がなくなった。
以下でbootstrap4ベースのDatetimepickerを提供されていたけど
momentjsの開発停止に伴い、ライブラリに移行する模様？
[公式](https://getdatepicker.com/5-4/)

`npm install tempusdominus-bootstrap-4`

```javascript:resources/js/bootstrap.js
require('tempusdominus-bootstrap-4');
```
```sass:resources/css/app.scss
@import '~tempusdominus-bootstrap-4/src/sass/tempusdominus-bootstrap-4-build';
```

#### datatabales
一覧表の操作ライブラリ
[公式](https://datatables.net/)
bootstrap4ベースもスタイルも用意されている。

[こちら](https://datatables.net/download/index)からframeworkやstyleなどを選択してnpm/yarnなどでの導入方法が下部に表示される
【モリメモ】DjangoHerokuデプロイ Error対応-03

#実行例
実行コマンド = heroku run bash
実行コマンド = python manage.py migrate

#エラー内容
ModuleNotFoundError: No module named 'psycopg2'

#対策
Djangoでpostgresqlを使用するのに必要なpsycopg2がありませんと言われています。
実行コマンド = pip install psycopg2 
上記コマンドでインストールしてrequirements.txtにも追加して再デプロイで完了！

:shamrock:requirements.txtを作成するには
pip freeze > requirements.txt

:comet:よくある、のかな pip install psycopg でエラーが発生する場合
実行コマンド = brew install postgresqlでpostgresqlをインストール後
実行コマンド = pip install psycopg2がうまく通るはず

エラー内容について詳細を覚えていないので記述していませんが
似たようなケースがあったらぜひ試してみてください
【JAVA】【バッチ】バッチファイルでJAVAプログラム実行やってみた

## はじめに

javaで作成したプログラムをバッチで実行したいなーと思って
調べてみたら簡単に出来たので、忘備録がてら記載していきます。

## 環境
本記事は以下のIDEを使用することをベースに記載しました。

* eclipse

## 手順

### ①任意のプログラムを記述。
ここは各自好きなプログラムをmainメソッドに記載
※プロジェクトの作成方法などは割愛
　気が乗れば追記しますっ


### ②作成したプログラムをエクスポート。
`Eclipseでのエクスポート方法`

* ファイル（タブ） → エクスポート → JAVA → 実行可能jarファイル
* 起動構成に実行させたいファイルを選択<br>
<font color="Red">※ 一度実行しないと選択出来ないので注意</font>
* エクスポート先は任意
 - ライブラリー処理は一番上のまま（多分）
 - 完了ボタン押下<br>
   エクスポート先にjarファイルが出力されていれば成功!<br>
   出力されていなければ何かがおかしい。


### ③Java実行環境の構築
コマンドプロンプトからjavaを実行（javaコマンド、javacコマンド）するのに必要。
　→既に構築できている場合はこの手順は不要

`Eclipseを使用している場合`

* Eclipseから実行環境のパスが取得出来るので、PCの環境変数に設定する
 - ウィンドウ（タブ） → 設定 → Java → インストール済みのJREのロケーションにパスがあるはず
 - 上記で取得したパスを環境変数に設定する


### ④jarファイルの実行

エクスポートしたディレクトリでコマンドプロンプトを立ち上げて以下のコマンドを実行
※XXXX.jarは実行するjarファイル名

```bat:
java -jar XXXXX.jar
```

実行できていれば完成！！

### ⑤jarファイルをバッチファイルで実行させる

以下のバッチをコピーし、次の部分を書き換えて実行すれば、
自分で作成したjarファイルがバッチで実行出来るようになります。

* 3行目：jarファイルが格納されているフォルダ名<br>
 ※そもそもバッチファイルと同フォルダにjarファイルが格納されている場合は不要な行
* 5行目：実行するjarファイル名

```bat:runBat
@echo off
rem jarファイルのあるディレクトリに移動
cd ./sample
rem jarファイルの実行
java -jar sample.jar
```

## おわりに
バッチファイルだけでも十分業務効率化出来るのですが、
javaで業務効率化してみたいなー。とか思ったら意外と簡単に出来たので
参考になればと思い記事にしてみました。
exeやdllに含まれるpdbファイルへのパスを取得する方法

## はじめに
exeやdllには、デバッグの際に必要となる`.pdb`ファイルの**フルパス**が含まれています。
VisualStudioの規定フォルダでプロジェクトを作成すると、パスにユーザ名が含まれる(C:\Users\ユーザー名)ため、個人情報保護的に気持ちが良いものではありません。

という訳ではないですが、訳あって`.exe`や`.dll`ファイルに含まれる`.pdb`のパスを取するプログラムを作成しました。

.NET FrameworkではPInvokeが必要になるため、久しぶりにC言語です。
試行錯誤しながら、PEフォーマットを調べて目的のPDBにたどり着くことができました。

> ちなみに.NET Coreだと[PEHeader クラス](https://docs.microsoft.com/ja-jp/dotnet/api/system.reflection.portableexecutable.peheader?view=net-5.0)が追加されたため、簡単に取得できるようです。

## プログラム概要

* 引数に渡したプログラム内に`.pdb`ファイルのパスが含まれている場合、それを標準出力に出力します。
* .NETのexe でも ネイティブexe両方に対応しています(同じPEフォーマット)

## プログラムの説明

短いプログラムなのでインラインのコメントをご確認ください。

```C++
#include <windows.h>
#include <dbghelp.h>
#include <iostream>

struct RSDS_DEBUG_FORMAT
{
	DWORD     signature;
	BYTE      guid[16];
	DWORD     age;
	char      pdbpath[1];
};

/**
 * プログラム内に含まれる「.pdb」ファイルのパスを抽出して表示する。
 * 引数:exeまたはdllのパス
 */
int wmain(int argc, wchar_t* argv[])
{
	if (argc < 2) {
		return 1;
	}

	// プログラムをメモリ上にマップする
	auto hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		return 1;
	}
	auto hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
	auto pvBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);

	// ディレクトリエントリ(Debug)を取得
	PIMAGE_SECTION_HEADER imgSecHeader;
	ULONG dirEntrySize;
	auto dbgDir = (IMAGE_DEBUG_DIRECTORY*)ImageDirectoryEntryToDataEx(pvBase, FALSE, IMAGE_DIRECTORY_ENTRY_DEBUG, &dirEntrySize, &imgSecHeader);

	if (IMAGE_DEBUG_TYPE_CODEVIEW == dbgDir->Type)
	{
		auto pdb_info = (RSDS_DEBUG_FORMAT*)((LPBYTE)pvBase + dbgDir->PointerToRawData);
		if (memcmp(&pdb_info->signature, "RSDS", 4) == 0)
		{
			//RSDSシグネチャが見つかれば、pdbが含まれるので出力する
			std::cout << pdb_info->pdbpath;
		}
	}

	UnmapViewOfFile(pvBase);
	CloseHandle(hFileMapping);
	CloseHandle(hFile);
	return 0;
}

```


## 参考ページ

[PE(Portable Executable)ファイルフォーマットの概要](http://shopping2.gmobb.jp/htdmnr/www08/mcc/doc/pe.html)

[PE ファイルについて (5) - IMAGE_DATA_DIRECTORY](https://tech.blog.aerie.jp/entry/2015/12/27/144045)

[Getting your PDB name from a running executable (Windows)](https://deplinenoise.wordpress.com/2013/06/14/getting-your-pdb-name-from-a-running-executable-windows/)
 ⇒ 実行中のプロセスから取得する方法

[How to find corresponding .pdb inside .NET assembly?](https://stackoverflow.com/questions/38821662/how-to-find-corresponding-pdb-inside-net-assembly)
 ⇒.NET CoreのPEHeaderを利用した方法
C++の参照渡しについて

# 目的  
アドレス演算子(&)と間接演算子(*)を用いて、値渡し、参照渡し、アドレス渡しを理解する。
# 結論  
値渡し = 変数の値を別の場所にコピーする。アドレスは異なる。
参照渡し = 同じ値、同じアドレスをもつ変数を作り出す。変数名を変えただけ。
アドレス渡し = 変数のアドレスを値としてコピーする。アドレスは異なる。

# 検討事項  
cppのサンプルコードから考察した。

### 環境  
VSCode + WSL2(Ubuntu) + GNUコンパイラ。
### コード  

```cpp
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int INF = 2147483647;
const long long INFL=9223372036854775807;

int main(){
	// 変数aを定義
	int a = 1;
	// 値渡し
	int x = a;
	// 参照渡し(C++のみ。正式な呼び方不明)
	int& y = a;
	// アドレス渡し
	int* z = &a;
	// 実験開始。aを3に変更
	a = 3;
	std::cout << "a is " << a << " now"<< std::endl;
	// a is 3 now

	// 要素検討
	// 値渡しの場合、xはコピーされて、aとは無関係なメモリに格納されるため、aを変化させてもxは変化しない。
	std::cout << "x is " << x << std::endl;
	// x is 1

	// 参照渡しの場合、yとaが変数名が異なるだけで、全く同じものとして扱われる(値：同じ、アドレス：同じ)
	std::cout << "y is " << y << std::endl;
	// y is 3

	// アドレス渡しの場合、zにはアドレスが入るため、間接演算子(*)がないと、aの値にたどり着くことができない
	std::cout << "z is " << z << std::endl;
	// z is 0x7ffffffdf00
	std::cout << "*z is " << *z << std::endl;
	// z is 3

	// a,x,y,zのアドレス
	std::cout << "a's address is " << &a << std::endl;
	std::cout << "x's address is " << &x << std::endl;
	std::cout << "y's address is " << &y << std::endl;
	std::cout << "z's address is " << &z << std::endl;
	// a's address is 0x7fffffffdf00
	// x's address is 0x7fffffffdf04
	// y's address is 0x7fffffffdf00
	// z's address is 0x7fffffffdf08
	return 0;
}
```  
# まとめ
参照渡しは変数名を変えるだけで、メモリ的には全く同じものになる。
C++の参照渡しの理解が難しい。まだ完璧に理解できていません。
modに関するライブラリを作成しているときに、参照渡しの使い方が分からなくなったので本記事を執筆します。

# 参考文献  
https://qiita.com/RuthTaro/items/f35c3a26779c0ca1a41a
https://qiita.com/ue_sho/items/1ee5c3e665c72c035880
http://wisdom.sakura.ne.jp/programming/cpp/cpp15.html
AndroidStudioでアプリが実行できないとき

##事象
GitからクローンしてきたプロジェクトをAndroidStudioで開いた時に
アプリが実行できないときがある。
（Run'app'や Debug'app'のボタンが非活性になってしまう）

##原因
app/build.gradleファイルのbuildToolsVersionに指定されているバージョンが
インストールされていないときに発生する。

##対応
対応法としては、SDK Managerを開き、SDK Toolsタブで
右下の「Show Package Details」にチェックを入れる。
詳細なバージョンが表示されるので、app/build.gradleファイルのbuildToolsVersionに指定されている、
バージョンにチェックを入れ、インストールすると解消する。
Cannot run with sound null safety, because the following dependencies don't support null safety:

<h1>現象</h1>
エミュレータでflutterアプリを実行しようとすると下記エラー

```
Error: Cannot run with sound null safety, because the following dependencies
don't support null safety:

 - package:sqflite
 - package:sqflite_common
 - package:synchronized

For solutions, see https://dart.dev/go/unsound-null-safety

```

<h1>解決策</h1>
pubspec.yamlで引っ張ってくるsqfliteのバージョンを上げることでnull safetyに対応できるようにしました。

```pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
#  sqflite: ^1.3.0
  sqflite: ^2.0.0+3
```
<hr>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/0a57dc07-169e-4ea6-f332-f871638363db.png)
phpとLaravelいじっているときに、しょうもない理由で詰まった話。

OpenWeatherMapが出しているAPIを使おうとしていて、そのときに、

```
syntax error, unexpected '='
```

になってしまいました。
該当のコードはこんなかんじでした。

```
api_url = 'https://api.openweathermap.org/data/2.5/forecastlat=&lon=&appid=[API_KEY]'
```

はい、勘のいい人だったら気づくと思います。
そう、変数をPHPで定義するなら、最初に$が必要ですよね。
然しそれがないので、ただの文字列にこのURLを入れようとしているわけです。
こんなことできるわけありません。

初心者の皆さん、気をつけましょう。
[Node, npm] Missing write access to /usr/local/lib/node_modules でグローバルインストール(npm i -g)ができない時の対処法

# はじめに
長年使ってきたMacbook-air mid2013に別れを告げて、新しいmacに移行して環境構築した際につまづいたのでメモ。同じく新しいPCで環境構築する人の役に立てれば!

# エラー概要
新しいPCに移行して、とりあえずnodeのインストールだ！！と [nodeの公式](https://nodejs.org/en/download/)からインストーラをダウンロードしてインストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366323/ccfa2f60-56b8-9206-f6e9-2eb296f9d8dc.png)

そのあと、firebaseを使いたかったので
`npm i -g firebase-tools` を実行すると以下のエラーが。

実際のターミナル画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366323/acb33477-5967-6b80-d683-6731c07aa3ad.png)

どうやらnpmが十分な権限を持っていないことが原因らしい。

```shell
Missing write access to /usr/local/lib/node_modules
```

# 原因
node,npm はnodeのバージョン管理ツール(nvmなど)経由でなく、インストーラー経由でインストールすると権限がlocal権限しか与えられないため。

だから、`npm i -g`でエラーを起こしてしまうらしい。

公式(https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) が堂々と書いていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366323/a51ba990-fbc1-9533-051e-93c68841b3aa.png)

# 対策
公式の指示に従って、nvmをインストールしてnodeをインストールすることにした。

nvmインストールコマンド(zsh用)
bashの人は末尾をbashhにしないと.bashrcに必要な記述が書き込まれないので書き換えが必要

```shell
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | zsh
```

実行後に`source ~/.zshrc`を実行 or ターミナルを再起動する。

あとは以下などでお好みのnodeバージョンを指定してインストールすればOK

``` shell
nvm install x.xx.xx
```

使えるバージョンの一覧確認は以下

```shell
nvm ls-remote
```

以上です。
【モリメモ】DjangoHerokuデプロイ Error対応-02

#実行例
実行コマンド = git push (heroku repository) (branch name)

...
...
python manage.py collectstatic --noinput
remote:        Traceback (most recent call last):
...
...
...

#エラー内容
なんでエラーなんだろうか、、、


#対策
実行コマンド = heroku config:set DISABLE_COLLECTSTATIC=1
:sunny:上記コマンドを環境変数に追加することでCollectStaticのビルドステップを無効化できるそうです
【初心者】tar,gzipコマンド 

#はじめに
エンジニアになったばかりのひよっこです🐥
`tar`と`gzip`を用いた「アーカイブ」・「圧縮」・「解凍」・「展開」について、簡単にまとめました。

### tarコマンド
* 指定したファイルをアーカイブしたり、アーカイブファイルからファイルの情報を表示したり、取り出したりするためのコマンド。
>アーカイブ(archive)とは: 
記録保管所の意味。
複数のファイルを１つのファイルにまとめて管理するファイルのこと。

* 基本構文

```
$ tar 【オプション】 ファイル名 or ディレクトリ名
```

#### tarコマンドのオプション


|  オプション  |  役割  |
| ---- | ---- |
|  -c  |  アーカイブファイルを作成  |
|  -f  |  アーカイブファイル名を指定  |
|  -v  |  詳細情報を表示  |
|  -z  |  アーカイブファイルに対して、gzipを使用  |
|  -x  |  アーカイブファイルを展開  |

#### 圧縮とアーカイブは違うの？
=>違う。
圧縮は文字通りの意味だが、Linuxで広く使われているアーカイバー「tar」は圧縮の機能は持っていない。
「圧縮アーカイブ」として作成するのが常であるため、「圧縮ファイル」と「アーカイブファイル」が混同しがちなので注意。

###gzipコマンド
gzipの形式に圧縮したり、展開したりするコマンド。
gzipは圧縮形式の一つで拡張子は`.gz`となる。

* 基本構文

```
$ gzip 【オプション】 ファイル名 or ディレクトリ名
```

例えば、、

```
$ gzip hoge.txt
```
これにより`hoge.txt`をgzip形式で圧縮した圧縮ファイル`hoge.gz`が作られる。


##すこーし実例
![tar_gz_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/d8f6d379-b260-9b2f-e4b7-d477810e8925.png)

### アーカイブ → 圧縮
① `hoge.txt, fuga.txt, piyo.txt`をアーカイブする(ひとまとめにする)

```
$ tar -cvf hogehoge.tar hoge.txt, fuga.txt, piyo.txt
```
アーカイブされた`hogehoge.tar`が作られる。

② `hogehoge.tar`をgzipで圧縮する

```
$ gzip hogehoge.tar
```
`hogehoge.tar.gz`が作られる。

### 解凍 → 展開
③ `hogehoge.tar.gz`を解凍する。

```
$ gzip -d hogehoge.tar.gz
```
解凍され、アーカイブされた`hogehoge.tar`の状態に戻る。

④ `hogehoge.tar`を展開する。

```
$ tar -xvf hogehoge.tar
```
`hoge.txt, fuga.txt, piyo.tx`の状態に戻る。

実際、こんなにまどろっこしいことをしなくても、
↓下記のコマンドを使えば、①〜②と③〜④を一度に行える。
## アーカイブ → 圧縮 を一度に行うコマンド
```
$ tar -zcvf fileName.tar.gz filename
```
ファイルのアーカイブを作成しgzip形式で圧縮する。
拡張子 .tar.gz または .tgzとする。

## 解凍 → 展開 を一度に行うコマンド

```
$ tar -zxvf fileName.tar.gz filename
```
gzipで圧縮されたアーカイブを展開する。
【モリメモ】DjangoHerokuデプロイ Error対応-01

#実行例
実行コマンド = git push (heroku repository) (branch name)
結果 = remote: Pushed to branch other than [main, master], skipping build.

#エラー内容
マスターブランチでないとビルドしませんよって言われます。

:shamrock:発生経緯
モバイル開発をしていて、一時的にDemoを実機で動かしたいと言われたのでとりあえずHerokuにデプロイするためにブランチ切ってデプロイしようとしたら発生

#対策
実行コマンド = git push (heroku repository) (branch name):master --force
:sunny:ローカルリポジトリがマスターブランチでなくともHeroku上のマスターへ強制的にプッシュしてくれますのでこれで解決
【JavaScript】DocumentFragmentオブジェクトで一括で要素を追加する


DocumentFragmentオブジェクトはDOMのツリー構造をシンプルに作成することが出来ます。
例を挙げると、<ul>タグの子要素<li>タグを動的に追加したい場合に有効です。

実際にFragmentオブジェクトを使ってliタグに値を追加するシンプルな例を作成しました。


```sample.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
<!--個別のファイル-->
<link rel="stylesheet" href="./css/style.css" />
<script type="text/javascript" src="./js/sample.js"></script>
<title>Sample App</title>
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-12">
                <p class="lead">createDocumentFragmentを使ったサンプル</p>
                <ul id="shopinfo">
                <li id="list1">リスト１</li>
                <li id="list2">リスト２</li>
                </ul>

                <button class="btn btn-success" id="addBtn">追加</button>
            </div>
        </div>
    </div>
</body>
</html>
```

```sample.js

//ページロード時に実行されるイベントリスナー"DOMContentLoaded"を登録する。
document.addEventListener('DOMContentLoaded',function(){
    
    //idをキーに要素を取得する。
    let btnId = document.getElementById('addBtn');
    
    //ID=btnIdが付与されたボタンにクリックイベントを登録する。
    btnId.addEventListener('click',(e)=>{
        
        //DocumentFragmentオブジェクトを作成する。
        let fragment = document.createDocumentFragment();
        
        //liタグを新規作成する。
        let child1 = document.createElement('li');
        
        //liタグに値「リスト３」を入れる。
        child1.append(document.createTextNode('リスト３'));

        let child2 = document.createElement('li');
        
        //liタグに値「リスト４」を入れる。
        child2.append(document.createTextNode('リスト４'));

        //fragment要素に値をそれぞれ追加する。
        fragment.append(child1);
        fragment.append(child2);

        //親要素Uiタグを特定する。
        let parentnodeUi = document.getElementById('shopinfo');
        
        //Uiタグにfragment要素を格納する。
        parentnodeUi.append(fragment);
    },false);
},false);
```

ボタンをクリックすると...
(before)
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/b4d8541f-7aa6-688c-09f9-c0764cf59f59.png)

(after)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/96979f36-f59e-57a1-db65-faec2e0497d0.png)


こんな感じになります。
MBProgressHUD使用中にユーザー操作できるようにする

`isUserInteractionEnabled = false`にすることで、インジケーターやトーストを表示中にボタンタップなどの操作ができるようになる。

``` Swift
let toast = MBProgressHUD.showAdded(to: view, animated: true)
toast.isUserInteractionEnabled = false
```
他の言語がJavaにかなわない唯一のポイント

JDBCドライバという存在は破壊的だった。

JDBCの登場まではODBCやADOなどWindows縛りの接続環境が楽ちんインストールの接続ライブラリだったけど、JDBCの登場で環境依存が極小化された形でDBにつながる。

例えばRubyでmysqlの接続ライブラリをインストールすると、libmysqlclientのCのライブラリにバインドされる。Rubyも結局はC。phpもC。Cである以上はライブラリのインストールに何かしらのCのコンパイラが呼び出されて、makeやらが動く。ここWindowsはめっぽう弱いところ。MacでもXcodeのバージョンアップで挙動が変わったりする。いろいろ言語は進化したのに、ライブラリをインストールする段階になると、私達はCのコンパイルのエラーメッセージを眺めている。（Pythonに至ってはFortranのコンパイルが動いてる）

DBMSを提供している側はCのライブラリを提供するだけで、各言語がラッパーライブラリを作ってくれるというのはある意味いいエコシステムができてると言える。ただ、各スクリプト言語がCのラッパーでしかないという点に依存している。

一方でJava。JDBCはファイルコピーで動いちゃう。この点はダントツで強力。本来ならJVMという仮想マシンありきでのポータビリティーなのだけど、Javaという言語レイヤー込で規格を作りきったという点も強い。

その強さをどこで痛感するかというと、DBeaverやmetabaseなどの、Javaで作られたデータベースフロントエンドが「JDBCドライバがあればいろんなデータベースに繋がりますよ」というスタンス。製品レベルでDB個別に頑張る箇所が極小。

DBeaverみたいなDBMSフロントエンドを他の言語で作れるかというと気が遠くなる。
いつも忘れるgit rebase -iでコミットをまとめる

## 目的
コミットをまとめるため`git rebase -i`を久しぶりにやろうとすると、大体いつも微妙に忘れているため、記事としてまとめておきたい。他の方の記事を参考にするのだが、いつも目的の記事にスムーズにたどり着けず。

自分のPCのブックマークに入れても、案件や環境が変わるとまた探しているため。

## 対象

主には自分。また自分と同じように「コミットまとめるのどうやるんだっけ？」と探している方。

## git rebase -iで3コミット分をまとめる方法

```
git rebase -i -p HEAD~3
```

## 個人的なハマりポイント

#### HEADの後の記号を間違えがち
HEADの後につけるのは~（チルダ）、たまに^（キャレット）と間違える

#### マージコミットが含まれている場合には`-p`オプションが必要(重要)
いつもこれを忘れて、コミットまとめに失敗している気がする。

## 参考記事

https://te2u.hatenablog.jp/entry/2015/03/24/233447

個人的はこちらの記事を参照できれば問題なさそう。意外と`-p`コマンドの記載がない記事が大半な気がしていて、久しぶりに検索すると、そもそも辿り着けなかったりする。
【Swift】一定数の文字を打つと、自動的に次のTextFieldに移行する方法

どうも、しゅんやです。

例えばSNSを始める時などに、まあ個人情報を入力する事がよくあると思います。

その時にね、なんか例えば電話番号とかを打つ時に、最初の3文字を打った途端、勝手に次の入力欄に移ってくれたみたいな事があると思います。

あれ、入力する側としては楽ですよね。

なので今回は、それを実装するわけです。

ではいきましょう！

<h1>
①まずは下準備
</h1>

![スクリーンショット 2021-07-07 20.52.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106647/e6052805-cfd1-803d-abcc-32a9df621cb1.png)

こんな感じで、TextFieldを3つ用意して、その間に線(UILabel)を入れて、まあ電話番号の入力するときのやつっぽいのを作ってください。

んで、TextFieldだけコードに繋ぎましょう。

<h1>②ではコード書きます</h1>

めっちゃ簡単です。

次のコードを書くだけです。

```php　　　
　　　　　　　　　
import UIKit

class ViewController: UIViewController {

    //StoryBoardと繋いだTextField達
    @IBOutlet weak var textField : UITextField!
    @IBOutlet weak var textField2: UITextField!
    @IBOutlet weak var textField3: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //監視
        NotificationCenter.default.addObserver(self, selector: ♯selector(textFieldDidChange(_:)), name: UITextField.textDidChangeNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: ♯selector(textFieldDidChange2(_:)), name: UITextField.textDidChangeNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: ♯selector(textFieldDidChange3(_:)), name: UITextField.textDidChangeNotification, object: nil)
        
    }
    
    @objc func textFieldDidChange(_ notification:NSNotification){
        //最初のTextFieldの文字数が3だったら
        if textField.text!.count == 3{
            textField.resignFirstResponder()//閉じる
            textField2.becomeFirstResponder()//ここで次に移行
        } 
     }
    @objc func textFieldDidChange2(_ notification:NSNotification){
        //２つ目のTextFieldの文字数が4だったら
        if textField2.text!.count == 4{
            textField2.resignFirstResponder()//閉じる
            textField3.becomeFirstResponder()//次に移行
        }
     }
    @objc func textFieldDidChange3(_ notification:NSNotification){
        //最後のTextFieldの文字数が４だったら
        if textField3.text!.count == 4{
            textField3.resignFirstResponder()//閉じる
            print("終了！")
        }
　　　}
　}


```

ではさよなら！！！
ラズパイ単体でM5Stack製品にUIFlowをインストールするリンクとメモ

# 概要

M5Stack製品に[UIFlow](https://m5stack.github.io/UIFlow_doc/ja/)をインストールするには通常[M5Burner](https://shop.m5stack.com/pages/download)を使いますが、
Raspberry Piには対応していないので、PCを使わずにRaspberry Pi単体でUIFlowを手動インストールするためのリンクとメモ。

[対応する気はない模様](https://community.m5stack.com/topic/1285/unable-to-run-uiflow-or-m5burner-on-raspberry-pi-4)

# ESPToolのインストール

UIFlowを使うためにはM5Stack製品にfirmwareを書き込む必要があるのですが、書き込みにはesptoolを使うのでインストールします。

```bash
pip install esptool
```

# ファームウェアのダウンロード

ファームウェアはM5Burner経由でダウンロードすることが想定されているためリンクはありませんが、
規則性があるので機種とバージョンを基に直接urlを指定してダウンロードします。

例えばバージョンが1.8.0でM5Stack Core、M5 Atom Lite用のファームウェアをダウンロードする場合のURLは以下になります

M5Stack CORE: http://firmware-cdn.m5stack.com/firmware/UIFlow-core-v1.8.0-en.bin
M5Atom Lite: http://firmware-cdn.m5stack.com/firmware/UIFlow_Lite-atom-v1.8.0.bin


参考：[M5Stackメモ](https://qiita.com/NWLab/items/cf02fee4503aa650ed41#proxy%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BFbin%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E6%8C%81%E3%81%A3%E3%81%A6%E3%81%93%E3%82%8C%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D)

# ファームウェアの書き込み

M5BurnerはWifi設定をすればファームウェア書き込み時にまとめて書き込んでくれるようですが、
手動ではどうするのかわからない(Wifi設定を記載したデータファイルを生成して書き込むようですが、その作り方がわからない)ので
Wifi設定なしで書き込みます。

esptool.pyにパスがあたっていない場合は~/.local/bin/esptool.pyにあるのでフルパスで指定します。


```bash
~/.local/bin/esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 115200 --before default_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0x1000 ~/UIFlow-core-v1.8.0-en.bin
```

# Wifi設定

ファームウェアの書き込みの際にWifi設定をしなかった場合はWifi設定をする必要があります。

[Wifi設定方法](https://m5stack.github.io/UIFlow_doc/ja/ja/base/Setting_WIFI.html)

M5Aomで一度Wifi設定したあとにWifi設定を変更したい場合は以下のようにして再設定できます。

[M5AtomをUIFlowで書き込んだあとにWiFiでUIFlowに接続するモードに戻す方法](https://qiita.com/wakasamasao/items/eea919cc525abbf90eab#%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E3%83%A2%E3%83%BC%E3%83%89%E3%81%8C%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8C%E3%82%8B%E7%8A%B6%E6%85%8B%E3%81%A7%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%82%8B)

# APIキーの取得方法

色んな方法がありますが、UIFlowを書き込んだデバイスを接続し、
Arduino IDEのシリアルモニタを開いてからリセットしてAPI Keyを表示させるのが一番確実な方法のようです。
RailsでDBにテスト用の初期データを効率良く入れるには

# はじめに
テスト環境で統合テストやら単体テストやら試すときに初期データがないと不便な場合ってありますよね。私はあります。まあ、私、テストはおろそかにしまいがちなので準備不足なだけですが...

そんなときのために、いかに効率良く初期データを入れていくかについて考えてみました。

# ベストな方法
みんな思いついてるとは思いますが、開発環境があるのでそれを活用しようと考えた。具体的には、db:resetしてから実際に開発環境を動かしてそれなりのデータをpostしてからdb:seed:dumpしちゃう方法。
これがベストだと思ってます。予期せぬpostに対応できるのかよーって感じですが、初期データはあくまで呼び出してからのテストになるので、postのテストはまた別途書く必要が出てくるので初期データとしては条件を満たしているのかと考えています。

スクレイピングやら、csvやらのファイルを一度データベースに突っ込んでしまって、そこからdumpしといた方がdb/seed.rbには優しいので、そんな感じで私は開発しています。不変なデータはまとまった段階でdumpして残しておくってのが大事かなと。

# 具体的な手順

1.開発環境のデータベースをリセットする

```
db:reset
```

2.開発環境を動かして、必要な初期データを蓄積させる

3.データをdump

```
db:seed:dump
```

こんな手順で、db/seed.rbファイルに初期データを集めています。
開発環境のデータをリセットしないがちなので、定期的にテストコードつくろうってなったときにデータベースのリセットにつながるので効率が良いと思って取り組んでます。
【Laravelクエリビルダ】groupByとCOUNT関数で集計する方法

LaracelでgroupByとCOUNT関数を使ってデータを取得する方法を解説します。

バージョンは6系

ブログで以下のような記事も書いています。

https://www.kamome-susume.com/enginner-job-change-site/

## ゴール
postsテーブルにあるuser_idをグループ化させてuser_idをCOUNT関数でカウントする。

イメージは以下です。
postsテーブル

| post_id | user_id |
|:-:|:-:|
|  1 |  1 |
|  2 |  2 |
|  3 |  3 |
|  4 |  1 |

⇩

| ユーザーID | ユーザーIDのカウント |
|:-:|:-:|
|  1 |  2 |
|  2 |  1 |
|  3 |  1 |

やり方としては、
・postsテーブルにあるuser_idをグループ化
・user_idをCOUNT関数を使ってカウントする
・ビューで表示

## サンプルコード

```
DB::table('posts')
  ->select('user_id')
  ->selectRaw('COUNT(user_id) as count_userId')
  ->groupBy('user_id')
  ->get();
```

`selectRawはselect(DB::raw)`の省略形です。`selectRaw('COUNT(user_id)`でuser_idをカウントしています。

COUNTやSUM関数は、select('COUNT()')とできないので注意。

groupByでuser_idをグループ化させています。

ビューでforeachを回せばデータを取得できます。

```
<table>
    <thead>
      <tr>
        <th>ユーザーID</th>
        <th>ユーザーIDのカウント</th>
      </tr>
    </thead>
    <tbody>
    // $resultsの中にデータを先程のロジックデータを格納しています。
    @foreach ($results as $result)
      <tr>
        <td>{{ $result->user_id }}</td>
        <td>{{ $result->count_userId }}</td>
      </tr>
    @endforeach
    </tbody>
</table>
```

## コード全文
モデル(Post.php)

```
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;←忘れずに追記する。

class Post extends Model
{
    public function getCountAmount()
    {
      return DB::table('posts')
              ->select('user_id')
              ->selectRaw('COUNT(user_id) as count_userId')
              ->groupBy('user_id')
              ->get();
    }
}
```

コントローラー(PostController.php)

```
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;←バージョン8系なら use App\Models\Post;

class PostController extends Controller
{
    public function index()
    {
        $this->posts = new Post();
        $results = $this->posts->getCountAmount();

        return view('posts.index', compact(
            'results',
        ));
    }
}

```

ビュー(index.blade.php)

```
<table>
    <thead>
      <tr>
        <th>ユーザーID</th>
        <th>ユーザーIDのカウント</th>
      </tr>
    </thead>
    <tbody>
    @foreach ($results as $result)
      <tr>
        <td>{{ $result->user_id }}</td>
        <td>{{ $result->count_userId }}</td>
      </tr>
    @endforeach
    </tbody>
</table>

```

もしわからない箇所があればどしどしご質問ください！
参考になったと思ったら忘れずに記事のストックまたはLGTMをお願いいたします。

https://www.kamome-susume.com/enginner-job-change-site/
WSL2 での DISPLAY 設定

# WSL2 での DISPLAY 設定

WSL2 では、`YOUR_HOSTNAME.mshome.net` のように、`mshome.net` をドメイン名としたホスト名が割り当てられています。
これを用いて、

```bash
export DISPLAY=`hostname`.mshome.net:0.0
```

として、`DISPLAY` 環境変数を設定することができます。
`/etc/resolv.conf` から IP アドレスを引っ張ってくる必要はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144465/f8fd1242-c54c-400e-65f7-76baa4c61372.png)