OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel に関する記事まとめ (8.x 対応作業中)

- ✨がついているものは明示的に 6.x 対応確認済み
- 何もついていないものは，ほぼそのまま読めるはず
- 🔥がついているものはおそらく 8.x 対応必須
- 👀は再チェック（2021 作業用）

# ソースコードリーディング

- **[【Laravel】サービスコンテナ・サービスプロバイダ・ファサード・契約に関する補足資料](https://qiita.com/mpyw/items/8b6f4666bfc98ff544dd)** ✨
- **【Laravel】 Eloquent ソースコードリーディング**
  - **[第1回 - モデルの取得](https://qiita.com/mpyw/items/7c7e8dc665584122a275)** :fire: 👀
  - **[第2回 - リレーションの取得](https://qiita.com/mpyw/items/ed058e2d679a672c3ba7)** :fire: 👀
- **[【Laravel】 キュー・イベント・ブロードキャストに関する補足とフロントエンドへの導入](https://qiita.com/mpyw/items/90bc5a7f30a2812a7bcd)** :fire: 👀
  - [【Laravel】 Redis Queue Worker のソースコードリーディング](https://qiita.com/mpyw/items/74fdf9c57138d04e3023) :fire: 👀
- **[【Laravel】 認証や認可に関する補足資料](https://qiita.com/mpyw/items/8c5413b99b8e299f7002)** 🔥 👀
- **[【Laravel】 通知に関する補足と拡張の手引き](https://qiita.com/mpyw/items/9d5874166add98d34d58)** 👀

# レシピ・ノウハウなど

## データベース全般

- [【Laravel】 Model::firstOrCreate() をバルクインサートで実現する](https://qiita.com/mpyw/items/eb407d8c3f546916a570) ✨ 👀
- [【Laravel】 MySQL がマスタスレーブ構成のとき，リクエストを超えて sticky 効果を適用する](https://qiita.com/mpyw/items/8b7ab3311ce3f08298d7) 👀
- [【Laravel】 QueryException で表示される SQL を正しくクオートする](https://qiita.com/mpyw/items/c66209f03c359b928506) 👀
- [OFFSETを使わない高速ページネーションを任意のPHPフレームワークで超簡単に実現する](https://qiita.com/mpyw/items/b94b7d69146777f7a407) 👀

## マイグレーション関連

- [【Laravel】 ユニークな外部キーを定義する方法](https://qiita.com/mpyw/items/51af426a28daf300e377) 👀
- [【Laravel】 MySQL の生成カラムに NOT NULL 制約を付与する方法](https://qiita.com/mpyw/items/691c367eb0577e7826de) 👀
- [MySQLでLaravel標準のSoftDeletesを使った論理削除とユニーク制約を両立させる方法](https://qiita.com/mpyw/items/d3e25860ecaaeb8340ab) 👀
- [CREATE TABLE / ALTER TABLE においてMySQLネイティブのプリペアドステートメントは動作しない](https://qiita.com/mpyw/items/a04f5f77e678fefd0ace) 👀

## Eloquent 関連

- [【Laravel】 Eager Loading + LIMIT を UNION ALL で実現する](https://qiita.com/mpyw/items/f141c44f0c747cb1442f) 👀
- [【Laravel】 ネストした既定の Eager Loading を一時的に無効化する](https://qiita.com/mpyw/items/57fb272fdf2ee6b99fcb) 👀
- [【Laravel】 Eager Loading でネストしたリレーションをカウントする](https://qiita.com/mpyw/items/ccbffdd07330fd9f1c39) 👀
- [【Laravel】 Eager Loading 応用: ピボット上のリレーションの Eager Loading](https://qiita.com/mpyw/items/d2d44f6f61bdbb4f6ab6) 👀
- [【Laravel】 認証でユーザを取得するとき，特定のスコープに限定する - Qiita](https://qiita.com/mpyw/items/3f3ba293bdb8ee790eda) 👀

## その他

- [Laravel では env() を config 系ファイル以外の場所に書いてはいけない](https://qiita.com/mpyw/items/34f37742d9a18b80a08c) 👀
- [Laravel の request() や Request::__get() は地雷， Request::input() と Request::route() を使え - Qiita](https://qiita.com/mpyw/items/d26f0ffac1529399a35f) 👀
- [吉田さんは通すけど𠮷田さんは通さないミドルウェア - Qiita](https://qiita.com/mpyw/items/5bb2d84f583378e1cf68) ✨
- [【Laravel】 Cron タスクスケジューラの onOneServer() と withoutOverlapping() の違い - Qiita](https://qiita.com/mpyw/items/15d14d920250a3b9eb5a) ✨
- [商用環境でも使っている Laravel 用 php-fpm イメージの Dockerfile レシピ - Qiita](https://qiita.com/mpyw/items/731e710342faf4513776)
- [[Laravel] 機能テストで Guzzle インスタンスの通信をモックする - Qiita](https://qiita.com/mpyw/items/0d0b434ed03e9d772555) ✨
- [$previous 引数を取らない例外クラスに強引に例外をチェーンする裏ワザ - Qiita](https://qiita.com/mpyw/items/7f5a9fe6472f38352d96) ✨
Error1 - Operation not permitted の解決法

##現状
Zipファイルをネットからダウンロードし解凍しようとしたら以下の表示が出た。
<img width="376" alt="Screen Shot 2019-01-29 at 12.59.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/312088/35fa57f0-52b1-eeae-245a-91e14e6090d7.png">



##やりたいこと
ZipファイルをMacで解凍する。


##解決方法
####①`terminal`を開く
Macに標準で入っているterminalを開く。

####②以下のコマンドを入力する

```terminal
$ cd ~/Downloads
$ unzip -q CentOS6vm.zip -d CentOS6vm && cd CentOS6vm
```

##結論
解凍できた。

<img width="767" alt="Screen Shot 2019-01-29 at 12.59.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/312088/ee7187a1-40c0-4dbb-53e6-11938c098860.png">
Golang - func init() as constructor

# import --> const --> var --> init()

![2.3.init.png](https://qiita-image-store.s3.amazonaws.com/0/150367/f3289591-9783-a4c6-b0d0-c89d9ad9a853.png)

We can use init() as constructor.

https://stackoverflow.com/questions/24790175/when-is-the-init-function-run
Treasure Workflow（Digdag）で SQL クエリに変数を使う

Treasure Workflow で SQL に変数を使いたい場合のメモです。

手元の環境は以下になります。

* Ubuntu 18.04 LTS
* td-agent 1.3.3

まず、以下のように .dig ファイルで変数を設定します。

```
timezone: Asia/Tokyo

_export:
  # 先月の月初から月末まで
  start_date: ${moment(session_time).subtract(1, 'months').startOf('month').format("YYYY-MM-DD 00:00:00")}
  end_date: ${moment(session_time).subtract(1, 'months').endOf('month').format("YYYY-MM-DD 23:59:59")}
```

クエリを実行する処理を .dig ファイルに追記します。

```
+task1:
  td>: queries/sample.sql
  create_table: sample_table
```

SQL ファイルの中で変数を呼び出します。

```SQL
SELECT
  user_name,
  text
FROM
  review
WHERE
  create_datetime >= '${start_date}' AND
  create_datetime <= '${end_date}'
```
iOS-Safariで<input type="file">のChangeイベントを拾うときの注意

ブラウザのデフォルトの`<input type="file">`の見た目が嫌なので`display:none`で隠して、ボタンのイベントで`<input type="file">`をclickさせる処理をJavaScriptで書く、という事をやりたくなります。

この時、DOMを用意するのも面倒だしJavaScript側で`<input type="file">`を`document.createElement`を使って作ればよいのでは、と試したところ、iOSで動きませんでした。


デモ
-----

以下は動きますが`window._temp`の行をコメントアウトするとiOS Safariでは動きません。

http://jsfiddle.net/03bsmc6t/


要点
-----

Macを持ってないので振る舞いを見た感じの調査ですが、iOS Safari(Safari 604.1)においては、createElement→ファイル選択が終わる(changeイベントが起きる)までに作成したHTMLElement(リソース)が使われてないと判断されているようで、そのため、回収されてしまいイベントが発火しなくなるようです。

上記の例ではグローバルオブジェクトな`window`を使って参照を残すようにしています。
また、DOM上にあっても良いので、例えば`document.body.appendChild`をしてもよいです。

些細な問題ですが、ファイル選択をキャンセルした時のイベントがないようです。
なので、`document.body.appendChild`の場合、消すタイミングを考えたくなるはずですが、消すことが出来ない場合があります。ただファイル選択は頻繁に使われるものでもないはずなのでリソースリークしても、たかが知れているはず。。



その他
-----------

### iOS版のChrome

iOS版のChromeではchangeイベントを仕込んでchangeイベントが発火するとフリーズ（？）する現象が起きています。
私の手元だけだといいんですが。。。
Ubuntuのパッケージアップデート数の確認




```bash:メッセージの取得
$ sudo /etc/update-motd.d/90-updates-available 

16 個のパッケージがアップデート可能です。
10 個のアップデートはセキュリティアップデートです。

$ sudo cat /var/lib/update-notifier/updates-available

16 個のパッケージがアップデート可能です。
10 個のアップデートはセキュリティアップデートです。

$ /usr/lib/update-notifier/apt-check --human-readable
16 個のパッケージがアップデート可能です。
10 個のアップデートはセキュリティアップデートです。
```

```bash:数の取得（出力先はstderr）
$ /usr/lib/update-notifier/apt-check
16;10$ 
```


ちなみにリブートが必要かどうか．

```bash:要リブート？
$ /etc/update-motd.d/98-reboot-required
*** システムの再起動が必要です ***
$ /usr/lib/update-notifier/update-motd-reboot-required
*** システムの再起動が必要です ***
$ cat /var/run/reboot-required
*** システムの再起動が必要です ***
```
GITの覚書

###コミットを整理する `git rebase -i` or `git commit --amend`
不要なコミット、例えばADDし忘れたファイルを追加するだけのコミットとかいらないので消したり修正したいとき  

```
# 1つ前のコミットを書き換える方法
$ git commit --amend -m "書き換えたいメッセージ"
# 書き換えないで追加する方法
# git add 追加したいファイル
# git commit --amend --no-edit

# それ以外のコミットを書き換える方法。（もちろん直前も可）
$ git rebase -i コミットID
# するとエディタが起動
  pickと書いてあるところをeditやdropなどコマンドの説明に書いてあるように編集し、保存。`:wq`

-----コマンド一覧に従う↓
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
-----
→ editとした場合、また編集のエディタが起動し、コミットの内容を書き換えることができる。

```


###誰かがリモートブランチを削除した場合
```
#リモート上の削除されたブランチがあるかどうか確認
$ git remote show origin
#リモート上の削除されたブランチをローカルから消す
$ git fetch --prune
又は
$ git pull --prune
```
- 上記がめんどくさい場合git configに設定  

```
#グローバルに設定。--prune付きでfetchとpullが実行されるようになる。
$ git config --global fetch.prune true
$ git fetch
```

###犯人捜し
git blameコマンドを使うことで、各行が変更された最終コミットを知ることができる。  

```
$ git blame ファイル名

# インデントコミットを無視
$ git blame -w 

# 他
# `-L` オプションで行数を指定できる
```

###コミットはせずに変更を退避
```
# saveはなくてもOK
$ git stash save
# 新規ファイルも含めて保存
$ git stash -u

# 保存したものを確認
$ git stash list
stash@{X}がstashの名前。WIP onのあとはブランチ名

# 戻す
$ git stash apply stash@{0}
stash名を指定しない場合は、直近に退避された変更を戻す
# ADDされた状態で戻す場合はindexをつける
$ git stash apply stash@{0} --index

# 削除する
$ git stash drop stash@{0}
# すべて削除する
$git stash clear

# 戻す＆削除はpop。らくちん
$ git stash pop stash@{0}
```
 
##gitの理解が深まる記事
[Gitのリポジトリの中身をなるべく正確に理解する](https://qiita.com/kaitoy/items/ce6cd3426a16268389d9)
初めて管理を任されて見積もりをしなくてはいけなくなった新人くんに送る言葉

## はじめに
- 非エンジニア職の新人が初めて管理を任された時の日報で「見積もりが!!」と言っていた
- ので、エンジニアとして見積もりをするときにどんなことに気をつけているかをまとめてみた

## そもそも見積もりが必要な理由
### 計画を建てたいから
- いつまでに終わるのか、どの程度まで進むのかによってその後の進め方や他の人のタスクが変わる
- つまり見積もりが甘いと**他の人に迷惑**がかかる

### 先に不安要素を潰したいから
- 目標に対して見積もりが無理っぽいとわかった時点対処できる
- 不安要素は発見が早ければ早いほど取れる施策が増える
  - つまり出来るだけ早い段階で見積もりが欲しい

## 正確に見積もるには
### タスクを分解する
- 粒度を細かくしたほうが見積もりは簡単

### タスク難易度・量を見積もる
- 難しい作業は時間がかかるし、量が多ければ当たり前
- これらを無視して作業ごとに固定にして考えると上手く見積もれない
- 時間の前にタスクの量や難易度を定量化してしまう
    - ex.
        - タスク量B = 1.5h
        - 難易度A = 係数2.0
        - 難易度A × タスク量B = 3.0h

### 見積もりに対するKPTをする
- 見積もりを記録する
- 実際にかかった時間を記録する
- ズレがあれば何故かを考える
    - 早かった時も遅かった時も原因が何か考える
    - 「見積もりが甘い」で終わりがちだけど「何故見積もりが甘くなったのか」まで考えてみるといいかも
        - 辛いので毎回はやらなくてもいいと思います
- **日報でやるといいと思います**

### バッファを設ける
- 必ずイレギュラーは発生するのでバッファを設ける
- 決め打ちでとりあえず1.2倍にしとくとかしてもいい

### そもそも正確に見積もろうと思わない
- 見積もり時間に幅を持たせる
- 最良時間
    - 超スムーズに進んだ場合の時間
- 最有力時間
    - 大抵こうなるだろうなって時間
- 最悪時間
    - 問題だらけで辛かった場合の時間
- 「確度何%でこの期日」みたいな言い方が出来るようになる

### 見積もり直す
- 途中までやって辛かったら見積もり直す
- 細かい粒度のタスクでやるとKPTの意味がなくなるので、大きい粒度でやろう

### 作業担当者が見積もる
- 一番詳細が見えているのは作業担当者
    - 詳細を知らずに見積もると少なく見積もりがち
- 担当者が出してきた見積もりに対してレビューをしながら一緒に目標設定 = 見積もりをしよう
link > Raspberry Pi > I2C > Sr (Repeated Start Condition)が必要なセンサーを読むための設定

```
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
Geany 1.24.1
GNU Make 4.0
gcc (Raspbian 4.9.2-10) 4.9.2
とあるI2Cセンサー
```

### Sr (Repeated Start Condition)が必要

とあるI2Cセンサーとの通信をSMBusで試していた。
I2Cの仕様書によると、メモリアドレスの後にSr(Repeated Start Condition)が必要とのこと。

Srを発行できるには?

### 資料

- [Raspberry Pi で I2C の Repeated Start Condition を有効化](https://rabbit-note.com/2015/02/15/raspberry-pi-i2c-repeated-start/)
    - @ Rabbit Note by kimataさん?

情報感謝です。

`/etc/modprobe.d/i2c.conf`において下記を記載する (こちらの環境では新規ファイル)

```
options i2c_bcm2708 combined=1
```

その後、以下を実行してみました。

```
$ sudo modprobe -r i2c-bcm2708
$ sudo modprobe i2c-bcm2708 baudrate=400000
```

次に、読込み用のPythonプログラムを実行したところ、センサーから数値が読めました。

### 疑問と対処

疑問点:
`combined=1`の設定により、おかしくなる状況はあるのかどうか?

未調査。

ソフトウェアI2Cを実装する予定なので、動作確認後は**i2c.confを消しておきました** (*1)

*1) 元々なかったファイルのため

時間が取れた時に影響の(資料）調査をするかもしれません。


### 動作確認

Analog Discovery 2において動作確認。

- Samples: 5M
- Rate: 500kHz
- I2Cの通信: 400kHz


### 関連

- [Raspberry Pi | I2C > I2Cセンサーの接続確認まで > 使用品 | 配線 | i2cdetect | link:Rasberry PIのI2Cコマンド詳解](https://qiita.com/7of9/items/c693244b65ecaf82c9f5)


### 実は教えていただいていました

2017年3月7日に、@fujiwarasoftservice さんに[コメント](https://qiita.com/7of9/items/0a3398ccf226733679b7#comment-a3f2d55a4c412ea4592a)にてリンク先を教えていただいていました。
SQL Server Compact EditionのDBをVBAからアクセスする

#なんで今頃SQL Server Compact Edition
SQL Server Compact Edition(以下SQL Server CE)で作成されたシステムをリプレースするという仕事があり、現行システムのデータを加工しようと思ってExcel VBAを作成しようとしたところ、接続文字列の情報が見つけにくかった(自分のググレベルが低い)のでこちらに書いておこうかと思った次第です。
.NETでのアクセスは一杯載ってるので、そちらで作ってしまえばいいんですがとりあえず。

#接続文字列
で、本題のSQL Server Compact EditionをVBAからアクセスする場合の接続文字列は以下のような感じになります。

```
"Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=[データベースファイル名];SSCE:Database Password=[データベースパスワード];"
```

データベースファイルにパスワードがない場合は`SSCE:Database Password`の項目は不要だと思います。

#実際のVBA例

実際にVBAでアクセスする場合はまずVBAのエディタウィンドウの方の[ツール]メニュー→[参照設定]で、「Microsoft ActiveX Data Objects 2.x Library」にチェックを入れた上で、下記のような感じになります。2.xの部分は色々あって特に気にしなくていいのではと思いますが当方は2.8にチェックを入れました。

```Sheet1.bas
Private Sub cboTest_Click()

    Dim objCon As New ADODB.Connection
    Dim pRS As New ADODB.Recordset
    Dim sConStr As String
    Dim sSql As String
    
    objCon.ConnectionString = "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=C:\DB\TEST.sdf;SSCE:Database Password=TEST;"
    'データベースオープン
    objCon.Open
    
    'SQL文 TESTテーブルのレコードを検索
    sSql = "SELECT * FROM TEST"
    
    'SQL文を実行して結果を取得
    pRS.Open sSql, objCon
    
    '結果の数だけレコードの処理
    While Not pRS.EOF
        '見つかったレコードのIDカラムを取得してダイアログに表示
        Call MsgBox("ID=" & CStr(pRS.Fields("ID")))
        pRS.MoveNext    '次のレコードへ移動
    Wend
    
    pRS.Close   '結果セットを使い終わったらクローズ
    objCon.Close   'DB接続クローズ
    set pRS = Nothing    '結果セットオブジェクト解放
    Set objCon = Nothing    '接続オブジェクト解放

End Sub

```

#おまけ
たまにしか使わないのですぐ忘れるのでついでに、、、

・DB内にあるテーブル名を取得するSQL
```
SELECT * FROM INFORMATION_SCHEMA.TABLES
　→TABLE_NAME列にテーブル名が入っている
```

・DB内にあるテーブルのカラム名を取得するSQL
```
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='[テーブル名]'
　→COLUMN_NAME列にカラム名が入っている
```

SQL Server CEのsdfファイルはSSMS(SQL Server Management Studio)の2008以前のバージョンでしか読めないので、新しいSSMSを使っていると二重に入れておかないといけないのでディスク容量の無駄ですね・・。
【本番IoTに使えるシリーズ】尖ったWi-Fiアクセスポイント - Ruckus編

#背景
弊社、<a href="http://www.kamarqx.jp/">カマルク特定技術研究所株式会社</a>では「本番IoT」を謳い文句に、各種の商用サービスを展開しています。
その中でも、現在の主力サービスとなっている、高齢者福祉施設向け「<a href="http://mimalog.jp/">みまろぐクラウドサービスConvenient版」</a>では、Microsoft Azure上の「みまろぐクラウド」から、現場のIoTセンシング装置系をWi-Fiにて収容しています。

基本的に、見守りシステムというのは、24H365日の常時稼働で、無数のセンサ（多い施設では、300デバイス）を秒単位のサンプリングレートで、時系列データを収集しています。
UDPを利用したり工夫はするようにしていますが、基本的に無数のパケットが止めどなく飛び交わなければ、このサービス品質は維持できません。
そんな中で、肝となるのが「IoTの商用サービスに耐えうるWi-Fiアクセスポイント」選びです。
ネットワークインフラの整備は、IoTの基本中の基本です。
実際に、私たちの現場で使っている・・・いや使えるWi-Fiアクセスポイントは**これ**だ！

# Ruckus Wirelessとは
採用のきっかけは、数年前に見かけた展示会です。
そこには、アメリカ発のワイヤレス製品メーカのRuckusが展示されており、
タコの頭？いや、無数のアンテナを配したアンテナから、指向性の強い電波が吹かれるる仕組みだそう！
> イメージは、RuckusのHPよりLink
><img src="https://ruckus-www.s3.amazonaws.com/images/diagrams/ruckus-r600-internals.jpg">
>

**ruckus beamforming**というテクノロジらしく、ビームサーベルのように電波を「**吹く**」んだそう。

少し古い資料になりますが、何とアメリカ市場では「40%程度のシェア」を誇り、あのCiscoさえも凌駕しているらしいです。
資料：[CDSUMMIT 2015: Ruckus Wireless' David Wright](https://www.slideshare.net/CommsDay/cdsummit-2015-ruckus-wireless-david-wright/4 "CDSUMMIT 2015: Ruckus Wireless' David Wright")


弊社で採用している機種は2種類

| # | 機種 | 特徴 |
|:-----------|----------|:------------:|
| 1     |  ZoneFlex R510|    エンタープライズ向け    |
| 2     |  ZoneFlex R310|    最廉価モデル    |

# ZoneFlex R510
ちょっとエンタープライズ向けの製品です。
お弁当箱ぐらいのサイズで、このように天井裏設置したりしています。
ちょとエンタープライズ向けのモデルになるので、お値段も割としますので、選択には迷う部分かも？
![510キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/351028/d002dae0-682a-abfa-ae6c-36c7bcb3c475.jpeg)

# ZoneFlex R310
こちら一番のエントリー商品ですが、これでも十分なパフォーマンスを発揮します。
手のひらよりちょっと多きサイズです。弊社では、社内向けの高性能アクセスポイントとして活用中です。
![310キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/351028/336d923e-011e-3e8a-390b-a8bfdc70b385.jpeg)

# 最後に
なかなか、Ruckusについてはネット上に情報がありませんが、
こうやって具体的な例を示しながら尖っているけど「当たり前に動く」事をお伝えできればと考えています。
Azure でコンテナ実装を検討する

最近ニーズが増えた(ような気がする)ので、まとめてみました
※一部TechSummit2018の内容を参照させていただきました

## コンテナが検討されるケース
・Lift and Shift
・DevOps
・Microservice・Serverless
・配布

## コンテナのメリット
コンテナ化すると何が良いの？
・利用する物理ハードウェアは減る
・OSとの分離→環境に依存しない
・自動化しやすい

## 採用するために検討すること
・方針が重要→それに合わせたスタイル→その手段として選ぶ
・運用としてメリットがあるか
・ビジネスとして本当に必要か(特にKubanetesの実装が必要かは要検討)

## Azureで使えるコンテナサービス
何を選択すればいいの?
・ Container Instances
  AWSでいうところのFargate
  仮想マシンをプロビジョニングすることなく簡単にコンテナを使うためのサービス
　お手軽にコンテナを始めるにはちょうど良い
　
　秒単位課金・東日本リージョンでも利用可
![azurecontainer_01.png](https://qiita-image-store.s3.amazonaws.com/0/313446/b4f95cc7-4e25-ca88-f3b2-3dbc2dc05b96.png)

・Web Apps for Container
　App Service の1つでPaaS
　特に「Web Apps for Container」はWindowsだけでなくLimuxベースもあり、独自コンテナも持ち込めるので汎用性が高く、DevOpsと絡めて運用を簡略化しやすい


・AKS(Azure kubernetes Service)
　Kubernetesを使ったサービス
　コンテナの展開やスケーリング、操作を自動化するように設計されたプラットフォーム

・OpenShift
　RedHatのサービス
　Azure MarketPlace経由でデプロイ可能
　オンプレとの連携でハイブリット構成が組める

次回はもう少しそれぞれのサービスに関して詳細をまとめてみたいと思います
capybaraでcurrent_pathを検査するときにクエリパラメータを無視する方法

元ネタ: [capybaraでcurrent_pathが一致しているかどうか調べるのにハマった](https://qiita.com/aiyu427/items/946d35ec84f99e005290)

# 問題
```ruby
expect(page).to have_current_path XXX_path
```

とすると、`current_path`にクエリパラメータ（`?〜`）が付いているときにfailします。

# で、どうするの？
`have_current_path`に`ignore_query: true`オプションを指定しましょう。

```ruby
expect(page).to have_current_path XXX_path, ignore_query: true
```

これで`current_path`のクエリパラメータ以降が無視されます。
【OS X】Jupyterlabで通知機能が欲しい

jupyter上で重たい計算が終わるのを待っているとそわそわします。
普通のループ計算だと[tqdm](https://github.com/tqdm/tqdm#ipython-jupyter-integration)で進捗確認できたりするんですけど、データサイズの大きなグラフの描画や計算中に別の作業をしている場合に通知機能が欲しくなります。
jupyterからの通知を実現する[jupyter-notify](https://github.com/ShopRunner/jupyter-notify)なるものがあるのですが、notebook向けに作られており[issue](https://github.com/ShopRunner/jupyter-notify/issues/33)にある通りJupyterlabには未対応のようです。(2019/1/29時点)
また、[notify-run](https://qiita.com/IntenF/items/e4c78d20ad37627a082c)を使えばスマホに通知を飛ばせてかなり便利なんですがPCのみで完結したい時もあります。
Mac使いでなおかつローカル環境で実行している場合の解決方法を備忘録として残します。(リモートの場合はめんどくさそう..)

## 方法
コマンドラインからポップアップ通知をする[alerter](https://github.com/vjeantet/alerter)コマンドを使用します。(インストールはリンク先参照)
JupyterLab上で実行できることを確認。

```python
!alerter -sound default -message finished.
```

通知音と共に画面右上に通知が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158851/f2736ab3-ae61-f934-090b-131789372d45.png)

## マジックコマンドとして使う
Jupyterlabの裏で動作しているIpythonのコンフィグファイル(~/.ipython/profile_default/startup/startup.py)に以下を追記すればマジックコマンドとして使えます。

```python:startup.py
import os
from IPython.core.magic import register_line_cell_magic


@register_line_cell_magic
def alert(line, cell=None):
    os.system(
        f'alerter -sound default '
        ' -title JupyterLab '
        ' -appIcon ~/Pictures/jupyter.png '
        ' -message finished. '
    )

```
(`alerter`コマンドの`-appIcon`オプションは通知のアイコンを指定する部分なので適当な画像拾ってきて下さい)

何かしらの重たい処理をするセルの直後に以下を追加し、一緒に実行すると計算が終わったタイミングで通知が届きます。

```python
%alert
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/158851/3e42d1ec-8848-cd56-14c8-86799ae524d7.png)


## 参考
- [OSXのコマンドライン通知ツール「Alerter」のご紹介](https://dev.classmethod.jp/etc/osx-alerter/)
- [(Ipython: Documentation) Defining custom magics](https://ipython.org/ipython-doc/3/config/custommagics.html)
(データ通信)プログラマが電気通信主任技術者試験を受けるときに読んでおくこと

# 電気通信主任技術者試験
通信
https://www.shiken.dekyo.or.jp/chief/index.html
##資格
「伝送交換主任技術者」と「線路主任技術者」がある。
## 試験科目区分
### 法規・設備及び設備管理
伝送交換主任技術者及び線路主任技術者「法規」(プログラマが電気通信主任技術者試験を受けるときに読んでおくこと(法規) https://qiita.com/kaizen_nagoya/items/a6f913875edb808d6de3 )
伝送交換主任技術者「伝送交換設備及び設備管理」
線路主任技術者「線路設備及び設備管理」
###専門的能力及び電気通信システム

####伝送交換主任技術者
「専門的能力（伝送）」(伝送)プログラマが電気通信主任技術者試験を受けるときに読んでおくこと https://qiita.com/items/0222148a9f59f003d999
「専門的能力(無線)」
「専門的能力(交換)」
「専門的能力(データ通信)」
「専門的能力（通信電力）」
「電気通信システム」
####線路主任技術者
「専門的能力（通信線路）」
「専門的能力（通信土木）」
「専門的能力（水底線路）」
「電気通信システム」

# 専門的能力（データ通信）
伝送、交換と３、４、５問目が同じ問題。
ここではデータ通信固有の事項を整理。

RAM
ROM
・EEPROM
・・フラッシュメモリ
・・・NAND型
・・・NOR型
・・・・ビット線
・・・・ソース線
・・・ブロック消去
・・・SSD


主記憶
OTPROM
CD-ROM
DVDドライブ
CCD
UV-EPROM
XOR
AND
OR
ドレーン線
ワード線
アース線

# 参考資料

# 文書履歴(document history)
ver. 0.01 初稿 20190129
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
gemのfullcalendarを実装してみた感想

この記事が初投稿なので間違えているところ等があるかもしれません。ご了承。
#fullcalendarとは
　fullcalendarとはrailsのgemのことです。知っている方もいるかもしれませんが詳しくは公式ドキュメントをみてください。トップページにサンプルがあります。
[fullcalenfar公式ドキュメント](https://fullcalendar.io/)
#fullcalendarの実装の仕方
```ruby:.Gemfile
//= require momentjs-rails 
//= require fullcalendar-rails 
//= require jquery-rails 
```
でgemfileに追記します。
次に


```
bundle install
```

を行います。
#MVCを作る
```
rails g controller event index 
railsg model events
```
#カレンダーを表示させる
```ruby:application.js
//= require jquery
//= require moment
//= require fullcalendar
#上記追加
//= reqire tree.
#以下追記 
$(document).ready(function(){
  $('#event').fullCalendar({
  })
});

```
これでフルカレンダーを呼びます。また、僕の場合は複数の場所で使いたかったのでapplication.jsにしましたが
別にevents.coffeeでも⭕️
次に

```ruby:appliction.scss.rb
/*
*= require fullcalendar
*/
@
@
@

```
このように記述します。ここd注意しなくてはならないのが@の上に書かなくてはならないことです。別にインポートしていなくて@なんてないよって人は気にしないでください。

``` ruby:views/events/index.html.erb
<div id="event"></div>
```
で表示できるようになります。


![スクリーンショット 2019-01-29 11.30.25.png](https://qiita-image-store.s3.amazonaws.com/0/350246/5be0331d-2424-1454-13ce-61a1b87a07db.png)

表示は多分日本語ではなく英語になっていいると思います。
日本語表記をしたい場合は以下を参考にしてください。
といってもapplication.jsに以下を追記するだけです。

``` ruby:application.js
//= require fullcalendar/lang/ja
```

#fullcalendarを使ってみた感想
カスタマイズが難しい上にあまり使い勝手がよくないなと思った。僕がやりたいのはカレンダーにイベントを書いてそれをDBに保存して違うviewで表示することなのでfullcalendarではできなそう。というか、僕の技術では無理そう。
だれかできるよという人は丁寧に教えてくださるとありがたいです。
p.s
インターン先を探しています。プログラミング歴は半年くらいです。主にバックエンドruby on rails,rubyを使っています。東京近辺希望。
Win10のWSLとMacでdotfilesをGit管理すると、Winでエラー吐く

ぜんぶWindowsのせいだ。
JR SKISKI

# TL;DR
設定を読んだ際に出たエラーの最後に「**^M**」となっていればたぶん、改行コード。
Git for Windowsの設定で改行コードが自動で変換され、CR/LFになってしまう模様。
WSLではなく、GUIのGithub for Desktopを使ったせい。

# やったこと
## 経緯
.vimrcや.bashrc(.zshrcとか.config.fishでもいいが)のようなdotfilesを、
複数環境で使うようにしたかった。
小生の環境

- 【会社】WSL(Ubuntu) Windows10
- 【自宅】macOS 10.14 Mojave

で、調べたら「設定ファイルをgitすればええやん！」
[という記事](https://qiita.com/ShoutaWATANABE/items/557955140178cbe691b9)にほだされ、やってみることに。

## なんか、エラー頻発する
$HOMEにdotfilesリポジトリ置いて、
関係各所にlnでシンボリックリンク張っただけなので、
[詳細](https://qiita.com/ShoutaWATANABE/items/557955140178cbe691b9)(上記の記事)については省略。

しかし、自宅のmacから設定を持っていき、vim(neovim)を使おうとすると

```shell-session
(省略)~/dotfiles/vim/.config/nvim/init.vim の処理中にエラーが検出されました:
行    2:
E15: 無効な式です: &compatible^M
```
ということで、dein.vimの設定から既に最後になんかついてる。
この`^M`が何かを調べると、どうやら**改行コード（しかもCR）**っぽい。
改行コード...？最近のmacってlinuxと同じ**LF**じゃないっけ...？（あってた）

## 原因
と思ったら、どうやら**Github Desktop for Windows**を使っていたことが敗因だった模様。
Gitの設定で「自動で改行コードがCR/LFになる」という仕様になっていたらしい。

前のこのPCの使用者は、この設定で使ってたのか...
これインフラいじったとき問題おきなかったんだろうか。

当然こっちはGit for Windowsを使用しているので、
Windows側でGitの設定が必要になる。
WSLのコンソールではなく、**PowerShellで**以下の設定を行う。

```
PS> git config --global core.autocrlf input
```
これでもう一度`clone`すれば、
変換されずに済むかと思われる。

# まとめ
> *ぜんぶWindowsのせいだ。*
> *JR SKISKI*

いや、設定しなかった私も悪い(小声)

# 参考
https://qiita.com/uggds/items/00a1974ec4f115616580
GoogleCloudFunctionsの環境分けについて

# GoogleCloudFunctionsの環境分けについて
プロジェクトに導入しようとなると、dev環境、stg環境、prd環境など一つ以上の環境が必要となっていくる。
GoogleCloudFunctionsを導入した場合、どのように環境を分けたら良いのかざっくりと調査してみた。

# いきなり結論
公式のベストプラクティスの中に、

https://cloud.google.com/functions/docs/bestpractices/testing?authuser=1&hl=ja

>注: 開発環境、テスト環境、本番環境を分離することをおすすめします。そのための 1 つの方法は、各段階で別個の GCP プロジェクトを使用することです。また、可能な場合は、システムテストのリソースにグローバルに固有の名前を割り当てることもおすすめします。こうすることで、システムテストを同時に実行してもテストは互いに干渉しなくなります。リソースにグローバルに固有の名前を割り当てるには、テストを実行する前に（たとえば、test.before フックで）必要なリソースを作成します。テストが完了したら、（たとえば、test.after.always フックで）リソースを破棄します。

とあるのを見つけた。
環境の分け方だけにフォーカスしてみると、環境別にGCPのプロジェクトを分けるといいとある。

# 自分なりに考えたこと
上記、 `GCPのプロジェクトを分ける` ということを見つけるまでは、
環境別のデプロイどうするのかな？
例えばcircleciなどでデプロイするには環境別のjob作って、
その中で環境を表すprefixなどをつけてデプロイしてGCF上での区別をつけるのかな？
とか考えていた。

でも公式見てハッとさせられた。
プロジェクト分ければいいんだと。

ただ、プロジェクト分けるのが難しいケースやめんどくさいケースもあると思った。

例えば、すでにGKEを使ってプロジェクトを利用していて、
GKE上では環境の区別をクラスターでやっている。
でもGCFを導入するとなると違った考えて環境を区別しないといけなくなる・・・
どうしよ？そういうもんと思って諦める？あー考えるのめんどくさとか。
（極端な例です）

もしくは、大きい会社などはGCPのプロジェクト管理はどこかのインフラ部署が担当していて、
払い出してもらうのにいちいち申請が必要・・・とか。

逆にマッチする状況を考えてみると。
アプリケーションとしてボリュームがないからGCFの方が要件にあっている、
今後も拡張される予定はないし、GKEやGCE使ってアプリケーション作るのは流石に時間かかるし・・・
っていう状況だったら利用はありかな。

あとはフロントエンジニアしかいないけど、ちょっとだけバックエンドが必要になった時とか
nodejsで実装できるからそういった状況にはマッチしそう。

ただ、バックエンドのエンジニアがいてGKEやGCEの利用にも慣れている・・・
っていう状況であればそれこそ今後のことを考えると導入には慎重になってしまうのでは。

そんなことをグダグダ考えてみた。
結局はプロジェクト次第！！
（楽をした）
stateで計算できるようにするためには

## この記事の内容を一言で
**`setState`で`Number`を設けて挿入される値を数字として定義する**

## 問題点
Reactを使って家計簿を作っている時に以下の問題が発生した。

**inputから数字を挿入しても0が残る**

実際の動画:
https://www.useloom.com/share/43bd30dc0f0741f7b09c63a3728d2ba9

その時のコードはこんな感じ。

```Cache.js
class Account extends Component {
  state = { sum: 0 };
  input = event => {
    this.setState({ input: event.target.value });
    console.log(this.state.input);
  };
  Plus = () => {
    this.setState({ sum: this.state.sum + this.state.input });
  };
  Minus = () => {
    this.setState({ sum: this.state.sum - this.state.input });
  };
  render() {
    return (
      <Fragment>
        <h2>現金</h2>
        <h3>
          現在:&nbsp;
          {this.state.sum}
        </h3>
        <input onChange={this.input} />
        <br />
        <button onClick={this.Plus}>収入</button>
        <button onClick={this.Minus}>支出</button>
      </Fragment>
    );
  }
}

```


## 原因
```Cache.js
input = event => {
    this.setState({ input: event.target.value });
    //この定義でinputから追加されるのは文字
　　console.log(this.state.input);
}
```
そのため、inputから数字を入力しても、初期値の`0`の後ろに文字列として記録される。
計算できるようにするためには、inputのstateで挿入した値を数字として追加できるようにする必要がある。
では、どのようにすればそれが実現できるのか。

## 解決策
```Cache.js
input = event => {
    this.setState({ input: Number(event.target.value) });
　　console.log(this.state.input);
}
```
`event.target.value`の前に、inputによって挿入されるvalueを数字として定義することで解消される。
今回は後から見た時、他の人が見た時でも、わかりやすくなるように`Number`を用いたが、`+`や`parseInt`を用いることも可能だ。

解決策導入後の動画:
https://www.useloom.com/share/12a9e650a9de485fbcbc657cf4fa0c7d

## 解決策に至るまで
今回はstackoverflowで質問を行った。

質問: [Remain 0](https://stackoverflow.com/questions/54095765/remains-state-on-react/54095952#54095952)

この記事は、そこに寄せられた回答を読み、日本語にしてまとめたものである。

## Github
Issue: [Remains 0](https://github.com/kaibara/calculator/issues/7)
PullRequest: [feat: Settled for remain 0 ](https://github.com/kaibara/calculator/pull/10/files?utf8=%E2%9C%93&diff=split#diff-d9df7ef7e759de5cc1e0680449d54a9a)

もっと良い方法や他のコードに対する改善案があれば教えていただきたいです。
SQLでグループごとに上位数件ずつ取得する方法(Window関数)

#はじめに

SQLで「あるグループごとに上位〇件ずつデータを取得して比較したい！」
という際にwindow関数を使うとサクッと抽出することが出来ます。

# サンプルデータ
select * from book;

  id   |     name     |   title                  | num
-------+--------------+--------------------------+--------
1      |  江戸川 乱歩 |   赤いカブトムシ         | 20
2      |  江戸川 乱歩 |   宇宙怪人               | 10
～

  id   |     name     |   title                  | num
-------+--------------+--------------------------+--------
11     |  芥川 竜之介 |   アグニの神             | 40
12     |  芥川 竜之介 |   犬と笛                 | 10
21     |  小川 未明   |   赤い蝋燭と人魚         | 100
22     |  小川 未明   |   赤土へくる子供たち     | 90

# numの大きいものから上位5件ずつ取得する
nameごとにnumの大きいものから上位5件ずつ取得します。
row_number()関数を使ってnumの降順に番号を付ける。
row_number()の代わりにrank()関数を使うとランキングの順位（同順位は同じ値）で取得できる。

```sql
 select
 *
 from
 (
   select
   name
  ,title
  ,num
  ,row_number() over (partition by name order by num desc) as rank
   from
   book
 )
 where
 rank <= 5
```

- **window関数**

※ row_number()、rank()、avgなど表につけたい関数を指定する
　⇒　集約関数と異なり行自体はグループ化せずにカラムを付加するイメージ
※ over　…　ウィンドウ関数を使う宣言のようなもの（ウィンドウ関数の処理定義）
※ partition by　…　どの単位でまとめるか、グループ化する値の指定（上記例では作者(name)）
※ order by　…　ウィンドウ関数内の処理される行の並びを指定

＜取得結果＞

   name     |       title        | num | rank
------------+--------------------+-----+------
小川 未明   | 赤い蝋燭と人魚     | 100 |    1
小川 未明   | 赤土へくる子供たち |  90 |    2
小川 未明   | 新しい町           |  80 |    3
小川 未明   | 秋のお約束         |  70 |    4
小川 未明   | 朝の公園           |  60 |    5
芥川 竜之介 | 杜子春             | 100 |    1
芥川 竜之介 | 魔術               |  90 |    2
芥川 竜之介 | 蜘蛛の糸           |  80 |    3
～
# 件数の多いものから上位5件ずつ取得する
nameごとに件数の多いものから上位5件ずつ取得します。
同じ要領でcountを作り、countの降順に番号を振る。

```sql
 select
 *
 from
 (
   select
   name
  ,title
  ,count(*)
  ,row_number() over (partition by name order by count(*) desc) as rank
   from
   book
   group by
   name
  ,title
 )
 where
 rank <= 5
```
＜取得結果＞

    name     |       title        | count | rank
-------------+--------------------+-------+------
 江戸川 乱歩 | 怪奇四十面相       |     8 |    1
 江戸川 乱歩 | おれは二十面相だ   |     6 |    2
 江戸川 乱歩 | 黄金豹             |     4 |    3
 江戸川 乱歩 | 宇宙怪人           |     3 |    4
 江戸川 乱歩 | 赤いカブトムシ     |     2 |    5
 小川 未明   | 秋のお約束         |     6 |    1
 小川 未明   | 秋が　きました     |     5 |    2
 小川 未明   | 明るき世界へ       |     4 |    3
～

#おわりに
「あるグループごとに上位〇件ずつ取得する」SQLを、window関数を使わずに書くと
複雑になるので、知っておくと便利ではないかと思います。
また、これ以外にも関数が用意されていますので、簡易な集計・分析などする際は
使ってみては如何でしょうか。
（最近は多めにデータを取ってきてBIツールで可視化するケースの方が多いですが...）
Sublime Text3のタブでイライラしない方法

#タブが上書きされてイライラする
この状態から、index2.htmlを開こうとすると、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332549/17ca365c-234d-e028-de00-d10613d1782c.png)
タブが上書きされてされてしまってイライラしたことないですか？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332549/378d0e61-db49-b8a4-7b7f-224607933218.png)
編集すれば両方開くんだけど、編集したくもないときもある。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332549/d9e90b7f-fbf2-f206-344b-dbda67623b39.png)

#プレビュー機能というらしい
どうやらこれはSublimeTextのプレビュー機能というらしい。

よく見ると、タブ名が斜体になってる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332549/17ca365c-234d-e028-de00-d10613d1782c.png)

#別タブで開くには？
プレビューじゃなくて、ちゃんと開けばいい。
Wクリックで開くと・・・、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332549/c72a12eb-5579-342e-11da-f164df3e016c.png)
斜体じゃなくなった！

この状態で、別ファイルを開くと、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332549/432a54b4-4e1c-3ae5-46f4-ff037e51b806.png)
ちゃんと別タブで開きました！

SublimeText使いの方には当たり前の機能かもしれませんが、
初めて気がついたので、共有しておきます。
vimiumで任意のタブに移動する


## 概要
`{{n}}g0`と入力することで左からn番目のタブに移動できる。
同様に、`{{n}}g$`と入力することで右からn番目のタブに移動できる。

## 例
左から3番目のタブに移動したい場合
`3g0`

右から7番目のタブに移動したい場合
`7g$`

## 参考
https://github.com/philc/vimium/issues/2339
UbuntuやCentOSに最新のtmuxを導入する

## 概要

GitHubのtmux公式レポジトリから最新のソースコードをダウンロードして、ビルドとインストールを行います。

## 更新履歴

- 2019/02/08追記: 
    - Ubuntu 16.04でも同様の手順での導入が可能なことを確認しました。
- 2019/04/29追記:
    - 必須パッケージにautomakeを追加しました。@leica19 さん、コメントありがとうございました。
    - Ubuntu 19.04でも同様の手順での導入が可能なことを確認しました。
- 2019/06/24追記:
    - 必須パッケージにbisonを追加しました。@kalafinalice さん、コメントありがとうございました。
    - Ubuntu 18.10でも同様の手順での導入が可能なことを確認しました。
    - CentOS 6、CentOS 7における導入手順を新たに追加しました。
- 2019/10/05追記:
    - CentOS 8でも同様の手順での導入が可能なことを確認しました。

## 注意事項

最新ということはつまりリリース前の開発中バージョンとなるため、バグが多く含まれる可能性があります。まともに動かなかったりしてもこちらに石を投げてこないでください……。
『それはさすがに不安なんでバージョン指定してインストールしたい』という場合には[補記](#補記)のあたりを参照してください。

また、tmuxを使っていて『ペインの境界線がおかしな表示になっていて画面が崩れる』という場合には、ターミナルエミュレータの文字幅に関する設定を変えるか[tmuxビルド時に追加でパッチを当てる](https://qiita.com/ha4gu/items/e0afb4facb2c6b1f7844)と解決するかもしれません。

## 前提

### インストール先

インストール先が`/usr/local/`配下となるようにしています。
これによって、OSバンドル版のtmux(`/usr/bin/tmux`)と共存させることが可能です。
なお、本手順ではシェルの環境変数`$PATH`において、`/usr/local/bin`の順序が`/usr/bin`よりも先にあるものとします。

### 作業ディレクトリ

ダウンロードとビルドはどこのディレクトリで実施しても構いません。
本手順においては`/usr/local/src`配下で行っています。
なお、本手順では一般ユーザが`/usr/local/src`への書き込み権限を有しているものとします。

## 手順

### Ubuntuの場合

Ubuntu 16.04, 18.04, 18.10, 19.04での動作を確認しています。

必須パッケージのインストール

```shell
sudo apt update
sudo apt install git automake bison build-essential pkg-config libevent-dev libncurses5-dev
```

ソースコードのダウンロード

```shell
cd /usr/local/src/
git clone https://github.com/tmux/tmux
```

ビルド

```shell
cd ./tmux/
./autogen.sh
./configure --prefix=/usr/local
make
```

インストールと確認

```shell
sudo make install
which tmux  # /usr/local/bin/tmux となっていることを確認
tmux -V     # tmux next-3.1 (記事編集時点)
```

### CentOS 6の場合

rootアカウントにスイッチ

```shell
su -
```

必須パッケージのインストール

```shell
yum check-update
yum groupinstall "Development Tools"
yum install libevent2-devel ncurses-devel
```

ソースコードのダウンロード

```shell
cd /usr/local/src/
git clone https://github.com/tmux/tmux
```

ビルド

```shell
cd ./tmux/
./autogen.sh
./configure --prefix=/usr/local
make
```

インストールと確認

```shell
make install
which tmux  # /usr/local/bin/tmux となっていることを確認
tmux -V     # tmux next-3.1 (記事編集時点)
```

### CentOS 7、CentOS 8の場合

rootアカウントにスイッチ

```shell
su -
```

必須パッケージのインストール

```shell
yum check-update
yum groupinstall "Development Tools"
yum install libevent-devel ncurses-devel
```

ソースコードのダウンロード

```shell
cd /usr/local/src/
git clone https://github.com/tmux/tmux
```

ビルド

```shell
cd ./tmux/
./autogen.sh
./configure --prefix=/usr/local
make
```

インストールと確認
※whichコマンドが入ってないケースがありうるのでそこだけ要注意

```shell
make install
which tmux  # /usr/local/bin/tmux となっていることを確認
tmux -V     # tmux next-3.1 (記事編集時点)
```

### 補記

ただ単に『現時点の最新の状態でビルドができさえすればいい』のであれば、
`git clone --depth 1 https://github.com/tmux/tmux` 
としてしまってもいいと思います。

また、最新ではなく特定バージョンをビルドしたいなら、例えば`tmux 2.9a`であれば
`git clone -b 2.9a https://github.com/tmux/tmux` 
とすればよいでしょう。

これら両方を組み合わせてもいけます。
`git clone -b 2.9a --depth 1 https://github.com/tmux/tmux` 

## さいごに

tmuxの開発が進むにつれて必須となるパッケージが増える傾向にあります。
必須パッケージで足りないものがあるのを見つけた際にはぜひコメント等で教えてください！
[linux]プロンプトのカスタマイズ

メモ
linuxのコマンドプロンプトの表示を環境によって変えたかったり、gitのブランチ名を表示させたかったりしたので
変更の仕方をメモする

▼ 現状のプロンプトの設定を確認

```
echo $PS1
```

▼ 表示内容の調整

```
ユーザー名[環境名]@今いる階層(gitブランチ名)$ 
```

▼ gitブランチ名表示処理を用意

```
$ cd ~
$ vi .git_branch_name.sh
function git_branch_name {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
```

▼ .bashrcに追記

```
source ~/.git_branch_name.sh
export PS1='\[\033[32m\]\u[環境名]\[\033[31m\]@\[\033[32m\]\w\[\033[31m\]$(git_branch_name)\[\033[00m\]\$ '
```
flutter開発環境構築〜作成までをまとめみた(リンクを)

# とりあえず環境構築したい
- この2サイトを参考にまず環境構築から
    - [VSCodeでFlutter、最初の一歩](https://tech.actindi.net/2018/09/21/120000)
    - [絶対にくじけないFlutter開発環境構築(VS Code)](http://ryuichi111std.hatenablog.com/entry/2018/09/09/232158)
- これみればだいたいできるかと、上記サイトに記載してないエラーはググりましょう。

# とりあえずファイル構成がどうなってるのか知りたい
- `Flutter: New Project`でできるファイルの構成はこちらでまとまってました。
    - [[Flutter] New Projectで作られるファイル構成を把握しよう〜！](https://mankutsu.com/flutter-structure-1337)

# 環境構築〜簡単なもの作成までいっきにしたい
- [公式のcodelabでFlutterに入門してみた](http://t-miliya612.hatenablog.com/entry/2018/04/29/124818)
    - [Write your first Flutter app, part 1](https://flutter.io/docs/get-started/codelab)

# 位置情報の取得を行いたい
- [flutter_background_geolocation](https://pub.dartlang.org/packages/flutter_background_geolocation#-readme-tab-)
- 現在実装中　営業マンの業務端末に入れて位置情報を取得できるかどうか　電池の消費はどのくらいかを検証予定

# あとで使う可能性が高いリンク
- [Cooking Firebase Dynamic Links in Flutter.](https://medium.com/flutter-community/if-you-want-to-make-your-product-popular-the-strategy-of-mouth-publicity-is-unavoidable-part-of-9da78ea32e79)

# FlutterWeekly
- https://mailchi.mp/flutterweekly/flutter-weekly-43
    - [日本語訳してくれてる記事もあります](https://qiita.com/aoinakanishi)
eclipse 2018-12にアップデートしたらjava補完候補が出なくなった場合の解決方法

1. .metadata/.plugins/org.eclipse.core.runtime/.settings 内のファイルにcontent_assist_disabled_computers の設定があれば外す
2. Java → Editor → ContentAssist → Advanced の Java Non-Type Proposals, Java Proposals, Java Type Proposals にチェックが入っていなければ入れる
3. .metadata/.plugins/org.eclipse.jdt.core 内の拡張子 .index ファイルを消す
Windows 10 Pro x64 + Excel2016 x86 VBA から ODBC経由で SQLite3 にアクセスしてみる

#目的
SQLite3をインストールしたので、ExcelVBAからのアクセスを試してみる
ODBCを使用してアクセスする
32bit/64bit 版ODBCドライバー共に正常に使用できる仕様なんですね・・・
##サンプルコード
```vb
'=================================================================
'
'   Excel2016 VBA -> SQLite3 からの読込サンプル
'   32bit/64bit 版ODBCドライバー共に正常に読み込めるのはなぜ？
'
'=================================================================
Private Sub ReadSqlite3()
On Error GoTo ERR_PROC

    Dim adoCon      As ADODB.Connection
    Dim adoRst      As New ADODB.Recordset
    Dim adoCmd      As New ADODB.Command
    Dim host        As String
    Dim driver      As String
    Dim dbname      As String
    Dim user        As String
    Dim pass        As String
    Dim conn        As String
'
    driver = "SQLite3 ODBC Driver"
    dbname = "C:\DEV\DB\sqlite3\demo.sqlite3"
'    host = "SQLITE3DEMO64"     ' sqliteodbc_w64.exe
    host = "SQLITE3DEMO32"      ' sqliteodbc.exe
    user = ""                   ' 未設定
    pass = ""                   ' 未設定
    conn = "DSN=" & host & ";UID=" & user & ";PWD=" & pass
    conn = "DRIVER={" & driver & "};DATABASE=" & dbname & ";UID=" & user & ";PWD=" & pass
'
    Set adoCon = New ADODB.Connection
    adoCon.ConnectionString = conn
    adoCon.CursorLocation = adUseClient
    Call adoCon.Open
'
    adoCmd.ActiveConnection = adoCon
    adoCmd.CommandText = "SELECT * FROM TEST_TABLE"
    adoCmd.CommandType = adCmdText
'
    Set adoRst = adoCmd.Execute
    While Not adoRst.EOF
        Debug.Print adoRst.Fields("ID") & " " & adoRst.Fields("VALUE")
        adoRst.MoveNext
    Wend
'
    adoCon.Close
    Set adoCon = Nothing
    Set adoRst = Nothing
    Set adoCmd = Nothing
    Exit Sub
    
ERR_PROC:
    adoCon.Close
    Set adoCon = Nothing
    Set adoRst = Nothing
    Set adoCmd = Nothing
End Sub
```
##参考にしたのは以下のサイト
[簡単なコマンドの作成と実行](https://docs.microsoft.com/ja-jp/sql/ado/guide/data/creating-and-executing-a-simple-command?view=sql-server-2017)
対象テーブルは以下で作成したもの
[Windows 10 Pro x64 で SQLite3を試してみる](https://qiita.com/tabizou/items/af8687201961e4d6b8a4)
無線網（Wi-Fi）空中線(antenna)(33)空中線(antenna)の高さ模様(height pattern)

電磁気の模擬試験(simulation)を行うための資料

![51Fioiqy9OL._SX368_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/51423/b3c8a3d2-b9be-4b43-f18d-3109b88f55bc.jpeg)

[改訂]電磁界シミュレータで学ぶ高周波の世界―高速ディジタル時代に対応した回路設計者の基礎知識 (RFデザイン・シリーズ), 小暮 裕明, 小暮 芳江, CQ出版, 2010
https://www.amazon.co.jp/dp/4789830225

wikiに「ハイトパターン」で項目がない。記事中の単語にもない。

無線、音響、鉄道、天文などの技術分野は、プロとアマチュアが継ぎ目なく繋がっていて、専門家と素人の境界がない。
部分的に詳しい方もおみえになれば、総合的な理解にすぐれた方もおみえになる。
学歴とか、出身とか、現在の職業とかはあまり相関はない。

何かwikiに書いても、消して回る人がいてうんざりしている。

無線についてはまだあまり書いたことがない。
慎重を期して、Qiitaで誤りなど事前に指摘を受けてからwikiに追記予定。

# 空中線(antenna)の高さ模様(height pattern)

ハイトパターンによる受信レベルの低下
http://www.soumu.go.jp/soutsu/kanto/bc/shogai/miwake/dtv_sj1.html
総務省関東総合通信局 症状(1)　特定チャンネルが受信できない

![000201142-2.gif](https://qiita-image-store.s3.amazonaws.com/0/51423/239ad584-dd57-dbd8-6616-c230e3c6f212.gif)
「デジタル時代の放送受信技術―地上・BSデジタル放送受信　ノウハウ編― 2010」テレビ受信向上委員会編より引用
http://tvkoujou.com/wp-content/uploads/2014/06/2.pdf

ハイトパターン(height pattern)
http://t-sato.in.coocan.jp/terms/height-pattern.html

アンテナの高さ(height)によって受信水準(level)の変化する型(pattern)

ハイトパターン計算
http://circuitdesign-jp.check-xserver.jp/wp-pre/technical/technicaltool/height-pattern/

# 参考資料(reference)
##参考記事(reference catalog)
地上・ＢＳ放送受信ノウハウ編
http://tvkoujou.com/?activity=地上・ｂｓ放送受信ノウハウ編

2018年 DXアンテナ 新商材発表会・講習会 技術講習会(入門編)
http://www.dxantenna.co.jp/help_tools/pdf/kiso/nyumon.pdf


##  参考書籍(reference book)
![51MBNX1Z3QL._SX305_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/51423/9b7f548a-9b5d-5f11-799a-3ffb474953cf.jpeg)
高校数学でわかるマクスウェル方程式―電磁気を学びたい人、学びはじめた人へ (ブルーバックス), 竹内 淳,  講談社, 2002, ISBN: 978-4062573832
https://www.amazon.co.jp/dp/4062573830/

![517VMFKdvjL._SX298_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/51423/e71f80e8-053b-b0f0-f9a4-2d3b963f03da.jpeg)
ただいま講義中! 図解マクスウェル方程式―電磁気の基本・基礎 室岡 義広, 裳華房, 2007, ISBN: 978-4785328245
https://www.amazon.co.jp/dp/478532824X/r

![318dwfVINAL._SY298_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/51423/de9696b4-0d3a-c672-701b-2eadcfe085d2.jpeg)
アンテナ・電波伝搬 (電子通信大学講座 第 18巻)虫明 康人,コロナ社, 1961, ISBN: 978-4339000863
https://www.amazon.co.jp/dp/4339000868/
## 参考文献(reference paper)
測定距離 10 m と 3 m でのエミッション測定の相関 T. Sato, 平成27年5月6日
http://t-sato.in.coocan.jp/compliance/correlation-emission-10m-3m.pdf

埼玉県産業技術総合センター研究報告 第2巻(2004), 電磁ノイズ測定の再現性に関する研究, 
戸枝保, 能戸崇行, Research on the Reproducibility of Electromagnetic Noise Measurement, TOEDA Tamotsu, NOTO Takayuki, 
http://www.saitec.pref.saitama.lg.jp/research/h15/2003_309C.pdf

# 文書履歴(document history)
ver. 0.01 初稿 20190129
ver. 0.02 表題統一・参考文献追記 201903122

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
composer installができなくなった時の解決法（PHP7.3）



PHP7.3にしたら、composer installができなくなった。
（PHP7.2に下げれば根本解決するらしいです。）

```bash
$ composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)

                                                                                           
  [ErrorException]                                                                         
  "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?  
                                                                                           

install [--prefer-source] [--prefer-dist] [--dry-run] [--dev] [--no-dev] [--no-custom-installers] [--no-autoloader] [--no-scripts] [--no-progress] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--ignore-platform-reqs] [--] [<packages>]...

```
　　

Google翻訳さんに聞いたら、
> "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?  　　
→ 「continue」ターゲティングスイッチは「break」と同じです。 "continue 2"を使用するつもりでしたか？　　


とのことらしいです。どっかで使ってるんでしょうね。。。。
PHP 7.3から”break”の代わりに”continue”は使えなくなるらしいです。  
参考：https://blog.ohgaki.net/php-7-3#continue




　　
###　解決策
- **composerのバージョンが古い場合、composerのバージョンをあげる。**

※composerのバージョンが新しい場合はこちら
[【2019年1月現在】PHP7.3でcomposerが使えなくなるバグの対策](https://qiita.com/nnahito/items/916052ff6d8bbed87070)


　
composerのバージョンを確認。

```bash
$ composer -V
Composer version 1.1.2 2016-05-31 19:48:11
```
  
   

composer自体のバージョンをあげる。

```bash
$ composer self-update
Updating to version 1.8.0 (stable channel).
    Downloading: 100%         
Use composer self-update --rollback to return to version 1.1.2
```
```bash
$ composer -V
Composer version 1.8.0 2018-12-03 10:31:16
```



composer install できた！

```bash
$ composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 28 installs, 0 updates, 0 removals

  - Installing sebastian/version (2.0.1): Loading from cache
....

Writing lock file
Generating autoload files
```
Wi-Fi(無線網) Antenna(空中線）(34)(無線)プログラマが電気通信主任技術者試験を受けるときに読んでおくこと

# 電気通信主任技術者試験
https://www.shiken.dekyo.or.jp/chief/index.html
##資格
「伝送交換主任技術者」と「線路主任技術者」がある。
## 試験科目区分

### 法規・設備及び設備管理

伝送交換主任技術者及び線路主任技術者「法規」(プログラマが電気通信主任技術者試験を受けるときに読んでおくこと(法規) https://qiita.com/kaizen_nagoya/items/a6f913875edb808d6de3 )
伝送交換主任技術者「伝送交換設備及び設備管理」
線路主任技術者「線路設備及び設備管理」
###専門的能力及び電気通信システム

#### 伝送交換主任技術者
「専門的能力（伝送）」(伝送)プログラマが電気通信主任技術者試験を受けるときに読んでおくこと https://qiita.com/items/0222148a9f59f003d999
「専門的能力(無線)」
「専門的能力(交換)」
「専門的能力(データ通信)」
「専門的能力（通信電力）」
「電気通信システム」
####線路主任技術者
「専門的能力（通信線路）」
「専門的能力（通信土木）」
「専門的能力（水底線路）」
「電気通信システム」

# 専門的能力（無線）
無線に関する試験を受けるときには、マクスウェルの方程式を一度は勉強しているとよい。
試験に受かるだけなら、マクスウェルの方程式を知らなくてもよい。
試験時間を有効に使うには、その問題をマクスウェルの方程式で解くとどういう簡略化、微積分をするかなど、思考実験になる。

![51MBNX1Z3QL._SX305_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/51423/9b7f548a-9b5d-5f11-799a-3ffb474953cf.jpeg)
高校数学でわかるマクスウェル方程式―電磁気を学びたい人、学びはじめた人へ (ブルーバックス), 竹内 淳,  講談社, 2002, ISBN: 978-4062573832
https://www.amazon.co.jp/dp/4062573830/

![517VMFKdvjL._SX298_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/51423/e71f80e8-053b-b0f0-f9a4-2d3b963f03da.jpeg)
ただいま講義中! 図解マクスウェル方程式―電磁気の基本・基礎 室岡 義広, 裳華房, 2007, ISBN: 978-4785328245
https://www.amazon.co.jp/dp/478532824X/r

![318dwfVINAL._SY298_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/51423/de9696b4-0d3a-c672-701b-2eadcfe085d2.jpeg)
アンテナ・電波伝搬 (電子通信大学講座 第 18巻)虫明 康人,コロナ社, 1961, ISBN: 978-4339000863
https://www.amazon.co.jp/dp/4339000868/

無線
・周波数
・直接波
・反射波
・・反射係数
・・・大地
・・・電気的定数
・・・接地角


マイクロ波通信
・見通し内伝搬
・・ハイトパターン(height pattern:高さ模様)　http://t-sato.in.coocan.jp/terms/height-pattern.html
・・・修正屈折指数
・・・・垂直分布曲線
・干渉雑音 
・・オーバーリーチ干渉
・・送信フロントバック干渉
・・異偏波隣接チャネル間干渉
・・送受間干渉
・デジタルマイクロ波通信
・・波形ひずみ
・・フェージング
・・・干渉性フェージング
・・・・振幅・遅延特性
・・・・周波数選択性
・・無線チャネル
・・・高域
・・・低域
・・・チャネル数（５−１０）
・・・伝送容量
・・・変調方式
・・・交差偏波
・・・・水平偏波
・・・・垂直偏波
・・・・交差偏波識別度（干渉の程度：受信点における主偏波と交差偏波との電界強度の比）
・・・・・主偏波減衰量
・・・・・伝送路距離・勾配
・・・・・直交偏波共用システム
・・・・・交差偏波補償回路
・・・・・降雨
・・・・・・扁平雨滴：扁平回転楕円体
・・・・・・・傾き

・・・チャネル間隔
・・・・チャネル間干渉量

ラティス
送受分離
効率
広帯域
非直線
透過
２周波
４周波
インターリーブ
レイク
リバースチャネル
スペースダイバイーシチ構成
異偏波対向
小口径アンテナ対向
FDMA
TDMA

#参考資料
空中線(antenna)の高さ模様(height pattern)
https://qiita.com/kaizen_nagoya/items/9ae601e0769634fa9002
# 文書履歴(document history)
ver. 0.01 初稿 20190129
ver. 0.02 表題統一、参考資料追記 20190312
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Thinkpadと4k60p

プログラミングじゃないけれど、世界中に5人くらい同じことを探している人がいるかもしれないのでメモ
# 結論
- Thinkpad X1 Carbon 6Gen, Thinkpad 13 2Genでは、USB Type-C経由でDisplay Port(等)に出力する
- HDMIポートでは4k30pまでしか出力できない
- 4k60pがイケる状態ならHDRもイケる

# 環境
- ThinkPad (たまたま手元にあったもの)
    - [ThinkPad X1 Carbon 6th Gen, 2018](https://psref.lenovo.com/syspool/Sys/PDF/ThinkPad/ThinkPad%20X1%20Carbon%20(6th%20Gen)/ThinkPad_X1_Carbon_6th_Gen_Platform_Specifications.pdf)
        - ちゃんと読むと、Max resolution: 5120x2880@60Hz (USB Type-C); 4096x2160@30Hz (HDMI) と書いてある
    - [ThinkPad 13 2nd Gen, 2017](https://psref.lenovo.com/syspool/Sys/PDF/ThinkPad/ThinkPad%2013%20(2nd%20Gen)/ThinkPad_13_2nd_Gen_Platform_Specifications.pdf)
        - ちゃんと読むと、Max resolution: 1920x1080 (HDMI)@60Hz, 3840x2160 (USB Type-C)@60Hz と書いてある
- Windows 10 
    - 1809だとDisplay SettingsでWindows HD Colorの項目が出て設定できるが、1803でも同じ
- [LG 27UL600-W](https://www.lg.com/jp/monitor/lg-27UL600-W)
    - 27UL650とかでも同じだと思う
    - 付属のHDMIケーブル、Display Portケーブルを使用
- [Amazonベーシック USB 3.1 Type C to Displayport ケーブル ブラック](https://www.amazon.co.jp/gp/product/B078LGP33Y/ref=ppx_yo_dt_b_asin_title_o00__o00_s00?ie=UTF8&psc=1)

# 確認方法
探せばいろいろあるけれど、dxdiag.exeを実行してDisplayの項を見るのと、モニタ側の信号情報を見るのが簡単

# 余談
[Fire TV Stick 4K](https://www.amazon.co.jp/gp/product/B079QRQTCR/ref=ppx_yo_dt_b_asin_title_o01__o00_s01?ie=UTF8&psc=1) をHDMIに入力すると、4k60p HDR を27UL600-Wでイケるのは確認済み
これは、サウンドバーの[YAMAHA YAS-108](https://jp.yamaha.com/products/audio_visual/sound_bar/yas-108/index.html)を経由してもOK
ideone > GitHubのリンクをコメントで書いたら 「## from https://g...content-available-to-author-only...b.com/seanh/93666」に変換された

```txt:動作環境
ideone (Python3.5)
```

https://ideone.com/BMRVGl

実装したコードは以下

```py
import string

def format_filename(s):
	## from https://gist.github.com/seanh/93666
    """Take a string and return a valid filename constructed from the string.
    Uses a whitelist approach: any characters not present in valid_chars are
    removed. Also spaces are replaced with underscores.
    
    Note: this method may produce invalid filenames such as ``, `.` or `..`
    When I use this method I prepend a date string like '2009_01_15_19_46_32_'
    and append a file extension like '.txt', so I avoid the potential of using
    an invalid filename.
    
    """
    valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
    filename = ''.join(c for c in s if c in valid_chars)
    filename = filename.replace(' ','_') # I don't like spaces in filenames.
    return filename


astr='\gbahsd:njs?<>|"asd/as*'
res = format_filename(astr)
print(res)

```

閲覧者が見えるのは以下

```py
import string
 
def format_filename(s):
	## from https://g...content-available-to-author-only...b.com/seanh/93666
    """Take a string and return a valid filename constructed from the string.
    Uses a whitelist approach: any characters not present in valid_chars are
    removed. Also spaces are replaced with underscores.
 
    Note: this method may produce invalid filenames such as ``, `.` or `..`
    When I use this method I prepend a date string like '2009_01_15_19_46_32_'
    and append a file extension like '.txt', so I avoid the potential of using
    an invalid filename.
 
    """
    valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
    filename = ''.join(c for c in s if c in valid_chars)
    filename = filename.replace(' ','_') # I don't like spaces in filenames.
    return filename
 
 
astr='\gbahsd:njs?<>|"asd/as*'
res = format_filename(astr)
print(res)

```

format_filename()の関数内のGitHubリンクのコメントが書き換えられている。


### 関連

- [link > Python > 文字列操作 > ファイル名として無効な文字を削除 (別解法: a whitelist approach) + 使用例 (at ideone in Python 3.5)](https://qiita.com/7of9/items/c16b90c4c8e20bde3256)
link > Python > 文字列操作 > ファイル名として無効な文字を削除 (別解法: a whitelist approach) + 使用例 (at ideone in Python 3.5)


- [ファイル名として無効な文字を削除（Python）](https://qiita.com/sbajsbf/items/27ec043a26dd1d529220) by @sbajsbf さん

文字列から「ファイル名無効文字」を省く処理。
re.sub()を使った実装例を紹介されている。

関数などで簡単に「無効文字」が取得できないか？

関数ではないが、自作関数で「無効文字」を削除している例は見つかった。

https://gist.github.com/seanh/93666

ホワイトリストアプローチ
string.ascii_lettersまたはstring.digitsのみを妥当な文字としての処理

これが有効かは使用者のやりたいことによるだろう

**注記: seanhによる実装では「空白」を「_」に変換もしている**

### ideone使用例

ideone(Python3.5)で使用してみた
https://ideone.com/BMRVGl


### 関連

- [c++ builder > TeeChart > 凡例に使えない文字列](https://qiita.com/7of9/items/3ad4239578c696e5dec3)
- [WinAppDev > 不正なフォルダ名 > フォルダ名変更時に"/"入力すると(ファイル名に対する)不正文字を表示することができる](https://qiita.com/7of9/items/9aa82ce970c2898da5d0)
- [6.1. string — 一般的な文字列操作](https://docs.python.jp/3/library/string.html) @ Python 標準ライブラリ
【rails5】特定のアクションでのみパスワード再確認を実施する方法

#特定のアクションでのみパスワード再確認を実施する方法 

ユーザーの新規登録時には、パスワードとパスワード再確認フォームへの入力は必須。

だが、ログイン後のプロフィール編集等で、名前やメールアドレスの簡易な編集でいちいちパスワードを入力させるのはユーザーにとって手間。

新規登録のcreateアクションでのみパスワード再確認を実施し、プロフィール編集のeditアクションでは実施しない、ということを実現したい。

そのためのメモ。


```
user.rb
# パスワード再確認 onの後に指定したアクションでのみ動作するようになる
validates :password, confirmation: true, allow_nil: true, on: :create
```
validates :password
パスワード属性を検証する

confirmation: true
パスワード属性がtrue（一致しているか）であるかを確認する

on: :アクション名
このメソッドを実行するアクションを指定する

>一致

>指定した属性名と#{指定した属性名}_confirmationを比較します。
(この場合email属性)

>model
>validates :email, confirmation: true

上記のようにしたが、パスワードを変更したい場合にバリデーションがかからなかったので、最終的に以下のように修正しました。

```
パスワード入力用
# allow_nil: trueの場合、nilを認める
validates :password, presence: true, length: { minimum: 6 }, allow_nil: true

パスワード再確認用  
# confirmation: trueで、パスワードとパスワード再確認が一致するかを検証する。
パスワード入力用がnilの場合もあるため、こちらでもallow_nil: trueを追加し、nil同士の検証も出来るようにする。

validates :password, confirmation: true, allow_nil: true
```

参考
[Railsバリデーションまとめ]
(https://qiita.com/shunhikita/items/772b81a1cc066e67930e)