OmniAICreator/Qiita-1.07M huggingface dataset:
備忘録　tableviewに必要なメソッド(swift編)


いつの間にか UITableViewScrollPosition が UITableView.ScrollPosition に変更になっていました。 iOS13から？

- UITableView

```swift
func scrollToRow(at indexPath: IndexPath, at scrollPosition: UITableView.ScrollPosition, animated: Bool)

func selectRow(at indexPath: IndexPath?, animated: Bool, scrollPosition: UITableView.ScrollPosition)

indexPathForSelectedRow.row   : IndexPath? { get }

func reloadData()
```

- UITableViewDataSource

```swift
func numberOfSections(in tableView: UITableView) -> Int { }

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") ??
        UITableViewCell.init(style: .default, reuseIdentifier: "Cell")
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { }
```

- UITableViewDelegate

```swift
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { }

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { }

func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) { }
```

- UITableViewDelegate (2019.1.5追加)

```swift:スワイプを無効化
//for iOS11
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let configuration = UISwipeActionsConfiguration(actions: [ ]) //none
    configuration.performsFirstActionWithFullSwipe = false
    return configuration
}
```
備忘録　CocoaPods Homebrew

# CocoaPods

## CocoaPodsのコマンド

- xcodeプロジェクトのディレクトリに移動<br>
 (*.xcodeproj のあるフォルダ)

```sh
cd PROJECT-FOLDER
```

- まずinit（Pod file生成）

```sh
pod init
```

- 出来上がったPodfileに必要なライブラリを指定

```
target 'プロジェクト' do
pod 'ライブラリ'
end
```

- ライブラリをダウンロード/インストール

```sh
pod install         //初回

pod update          //2回目以降（ライブラリの追加/変更）
```

- インストールしたライブラリを使用する場合は、プロジェクト(`.xcodeproj`)ではなく、
ワークスペース(`.xcworkspace`)を開くこと

　
　

以降追加（2021.2.4）

## CocoaPodsのアップデート

```sh
sudo gem install cocoapods -n /usr/local/bin
```

- Cleanup

```sh
sudo gem clean cocoapods
```

- ファイル削除

```sh
sudo rm -fr ~/Library/Caches/CocoaPods/
sudo rm -fr ~/.cocoapods/repos/master/
pod setup
```


- ファイル削除（プロジェクトフォルダ）

```sh
sudo rm -fr Pods/
pod update
```



# Homebrew

## Homebrewのバージョン確認

```shell
brew --version
```

## Homebrewのバージョンアップ

```shell
brew update
```

## インストール済パッケージのバージョンアップ

```shell
brew upgrade
```


# pip

```sh:pip自身のアップデート
pip install --upgrade pip
```

```sh:アップデート可能なパッケージ
pip list --outdated
```

```sh:パッケージのアップデート
pip install --upgrade パッケージ名 パッケージ名 パッケージ名 ...
```

```sh:アップデート可能なパッケージの一括アップデート
pip list --outdated | tail -n +3 | awk '{ print $1 }' | xargs pip install --upgrade
```
PythonでUDPパケット送ってみた

##概要
UDPパケット飛ばしたい！

##環境
* 送信側
 * OS : Windows10 Pro
 * IDE : PyCharm CE
  * Python3.6

* 受信側
 * OS : Android7
 * アプリ : [UDP TCP Server - Free](https://play.google.com/store/apps/details?id=com.aviramido.udpserver&hl=ja)

##


##ソース
1~100までを0.3sごとに飛ばすだけ

```python:udp_send.py
# -*-coding:utf-8 -*-

import socket
import time

raw_msg = 1
# 送るメッセージ

s_ip = "192.168.1.3"
s_port = 9998
# アドレス・ポート

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while raw_msg <= 100:
    msg = str(raw_msg)
    client.sendto(msg.encode(), (s_ip, s_port))
    print(raw_msg)
    raw_msg += 1
    time.sleep(0.3)


```

送れるのはbytes型だけ
LINQ to SQL Entity Framework　結合など使用したものメモ

<h1>LINQ to SQL Entity Framework</h1>

業務で利用しているので忘れないようにメモします
とにかく、先輩エンジニアの記述したものをまねしながら何となく書いてしまっているので、まだ理解が浅いです。
ので、本当にメモ。

業務で使用した環境：
・SQL Server 2014
・Visual Studio 2015

<h3>コードファースト</h3>

・用意するもの
 -データベース上のテーブルに相当するクラス（=エンティティ（entity: 本質、実体）
 -定義したエンティティ クラスを使ってデータベースを生成/テーブル参照するためのクラス(DbContext クラスを継承する)
  
・主キーは、対象のプロパティの上に[Key]と付ける。
・主キーがint型であるが自動採番したくない場合、
　[DatabaseGenerated(DatabaseGeneratedOption.None)]を[Key]の次に付加する。

<h3>複数のテーブルの外部結合と内部結合</h3>
※クエリはメソッドチェーン(ラムダ式を利用するもの)で業務では記述しました。
・内部結合・・・Join
・外部結合・・・Groupjoin

データを取得するのに、
JoinではSelect、
GroupJoinではSelectManyを使用。

```c#:query.cs
var query = DB.Table1 //queryはIQueryable型になる
        .GroupJoin(DB.Table2.DefaultIfEmpty(), x => x.Column1, T2.Column1, (T1, T2)=> // このxはTable1を指す
        new { T2.Column1, T2.Column2, T1.Column3 })
        .Join(DB.Table3, (T2, T3)=> new { T3.Column_a, T3.Column_b }).DefaultIfEmpty()
        .Where(x => x.Column_a == user_input); // このxは直前のJoinのテーブルが対象となる
        ...
```

・DefaultIfEmpty()
もしデータが拾えなかった(データが存在しないもしくは意図していない条件のクエリを書いてしまっているetc.)場合、Emptyで返ってくるところをDefault値(基本null)で返してくれる、というもの。
ポイントとしては、
GroupJoinは結果セットを平坦にして返してくるので(イメージでは result = {{1, 2, 3}, {4, 5, 6}, {...} ...} 
    のような2次元配列的なものの認識・・・あいまいだが、とにかく内部結合とは結果セットのかたちが違う)、DefaultIfEmpty()はSelectMany()のうしろではなく結合するテーブルのすぐあと、
JoinはSelect()のあとに記述する。

このおかげで、以下のようにクエリ結果を判定できます。

```c#:result.cs
if(query.Any())
    {
        // クエリでデータが取得できた場合の処理
    }
    else
    {
        // データが取得できなかった場合
    }
```
※他にも判断する方法はたくさんあると思いますが、今回はこれを頻繁に使用しました。

<h3>データベースファースト</h3>
上記の方法は、コードファーストというコードからデータベースを生成する方法でした。
この方法では、Entity Frameworkのしくみで、データベースが存在していなければ自動で生成します。
これはEFの仕様らしいので、それを生成しないようにするのは不可能。
ただ、不具合を起こしてデータベースをデタッチしている際にプログラムがそのデータベースを参照しに行ったとき、
新たにデータベースをつくりそこにデータを登録したり参照してしまうことによってエラーや意図しない動きをしてしまう、場合によっては何か重大な損害が出るとして、
既存のデータベースを参照し、今度はコードを生成してくれる「データベースファースト」なるものを一部に使用しました。
下記サイトさまを参考に実行。案外サクッとできました。
[.NETの各種DBアクセス方法を試す(DataSet,EntityFramework,Dapperなど)](http://endok.hatenablog.com/entry/2018/01/02/142050)
いろんな方法を書いてくださってますね。画面キャプチャもコードもあってわかりやすいです。

これで、データベースは自動生成されず、コードが自動生成されるので時間も、本当5分くらいしか要さずできました。


<h5>参考サイトさま</h5>
[EntityFrameworkについて](https://qiita.com/nakamurau1@github/items/eae0458039a09e6f0c34)
[SelectMany: Probably The Most Powerful LINQ Operator](https://dzone.com/articles/selectmany-probably-the-most-p)
自サービスを辞めないために辞めること

自分と同じ趣旨で、自分よりも遥かにクオリティの高いサービスを見つけてしまった。
それでも自サービスを続けようと思った理由と、続けるために辞めると決めたこと。

# 何が起きた？

[progate](https://prog-8.com/)をご存知でしょうか？~~（あぁ、今更かよって声が聞こえる...）~~
プログラミングの入門にはもってこいサービスです。
無料枠ですが私も触ってみて、その作り込みにはひれ伏すしかありませんでした。

というのも、私は[Gieer](https://gieer.tech/)という「独学でWEBエンジニアを目指す人のための技術ブログ」を運営しています。
私自身が独学で苦労したこともあり、これから同じような道を歩む人ができるだけ効率的に、楽しく学べるようにと思い制作しました。

が！
progateを見て、「これからWEBエンジニアを目指す人にはこれを勧めるべきだ」と思いました。~~（最初はなんとか勝てないか、とか思いましたが...）~~

ここで一度自サービスの目的を失ったのですが、それでもやっぱり続けていこうと思った理由と、これから続けていくために辞めると決めたことを書いていきます。

# 「完璧主義者」を辞める

私は何かをしようと思った時、いきなり完璧を目指してしまう人間です。
中途半端ができないのです。

目指す機能が完璧にならないとリリースできなかったり、書きたい記事を完璧に理解してもらうために、前知識の説明に時間を割いてしまったりします。

これはスピードをあまり望めない、また自身のモチベーションに大きく左右される個人開発には辛いな、と思いました。

## 機能は段階的にリリースしていく

好きな機能を好きなように作って、好きな時に出せます。取り消すことだって自由です。

そう、個人開発ならね。

・・・。

機能の理想とする形はあります。
が、これからはそれを段階的に切り出してリリースしていこうと思います。

その都度達成感を得られますし、その時点で反応があれば追加開発のモチベーションにもなる。
もしフィードバックをいただければ、より良い機能に仕上げてリリースすることもできます。

## 書きたいものから書く

機能にしても記事にしても、書きたいものから書いていきます。
本来は順序があるものかもしれませんが、そこは後から用意して結びつけてあげればいいだけです。

可愛い子にあれこれ服を着せるのは楽しいですが、服を一式用意してから可愛い子を探しに行くのでは、その過程でモチベーションを削がれます。~~（あんまりしっくりこないな...）~~

とにかく訪問者にとってより有益なものから作っていく。
これは自分にとっても、訪問者にとっても良い結果となるはずです。

# 「誰かの為」を辞める

Gieerは独学でWEBエンジニアを目指す人のためのサービスです。
ですが、本当にそれを望むのであればprogateを勧めるべきだという結論に至り、自サービスの目的を失ってしまいました。

## 「自分の為」の目的を持つ

Gieerにはもう一つ、「画力アップのためのアウトプットの場」という自分の為の目的がありました。
実際に画力が上がってきている実感があり、これは今後も続けていきたいと思ったため、運営も続けて行こうと思いました。

「誰かの為」を辞める、というのは大袈裟ですが、自分のスキルアップのためであったり、純粋に好きだからやる、であったり、外の影響を受けない「自分の為」の理由があるのは大事だなと思いました。

# 「やりたくないこと」を辞める

Gieerのブログ記事は、手を動かしながら読み進めて、10〜20分くらいで読み終わるように、と考えて書いています。
ただ、私は文章を書くのが苦手で（完璧主義も相まって）書き始めるのに時間がかかってしまったり、すぐに疲れてしまいます。

## 「やりたくない」を「やりたい」に変化させる

アウトプットはしたい、でも長く書くのが辛い。

であれば、短くてもいいからどんどんアウトプットした方が良いです。
その方が楽しいですし、数の分チャンスを広げることもできます。
あまりにも細々としたものが増えてきたら後でまとめればいいだけです。

少しでも「やりたくない」と思ったら、どうすればそれが「やりたい」に変わるのかを考え、すぐに実践していこうと思います。

自サービスです。
やりたいようにやります。

# これから

モノづくりは続けていきたいのですが、一人でできることには限界もあります。

私は先入観や固定観念が強く、自然と人が集まるような秀でた発想がなかなか生まれません。
また、周りをガンガン巻き込んでいくようなタイプでもありません。

なので、発想力以外の能力を提供することで、日常を（少し）変えられるようなサービス開発に携われたらいいなーと思っています。
SRTの暗号化通信を試してみた


SRTの暗号化通信を試してみた。
基本的にpassphraseのパラメータを追加し、送信側と受信側でこれが一致していれば通信できる。
key-length も暗号化に関係しているが、これは送信側の設定値が有効になり、受信側は設定が不要のようなのであまり気にしなくてもよいようだ。
VLCでもSRTの通信条件を設定するところでpassphraseを入れることができる。

# つまずいたところのメモ。

つまずいたのは以下の2点。

## passphraseの長さは10文字以上80文字以下

この範囲を外れているとエラーになる。
しかし、gstreamerではこのソケットプションの設定から帰ってきたエラーを握りつぶしているのでエラーになったことを気付けない。
gstreamerを送信側にして、6文字のpassphrase(短すぎる)を設定しようとしたが暗号化されないという現象で悩んだ。ソースコードを見て気がついた。

## ffmpegのバグ

逆にffmpeg(ffplay)ではpassphraseにどんな長さのものを入れてもエラーになる。
passphraseの扱うポインタが間違っていた。
以下のパッチを当てて、正しく動作するようになった。

```patch

diff --git a/libavformat/libsrt.c b/libavformat/libsrt.c
index 2faf9de580..2290a34435 100644
--- a/libavformat/libsrt.c
+++ b/libavformat/libsrt.c
@@ -268,7 +268,7 @@ static int libsrt_set_options_pre(URLContext *h, int fd)
     if ((s->mode == SRT_MODE_RENDEZVOUS && libsrt_setsockopt(h, fd, SRTO_RENDEZVOUS, "SRTO_RENDEZVOUS", &yes, sizeof(yes)) < 0) ||
         (s->maxbw >= 0 && libsrt_setsockopt(h, fd, SRTO_MAXBW, "SRTO_MAXBW", &s->maxbw, sizeof(s->maxbw)) < 0) ||
         (s->pbkeylen >= 0 && libsrt_setsockopt(h, fd, SRTO_PBKEYLEN, "SRTO_PBKEYLEN", &s->pbkeylen, sizeof(s->pbkeylen)) < 0) ||
-        (s->passphrase && libsrt_setsockopt(h, fd, SRTO_PASSPHRASE, "SRTO_PASSPHRASE", &s->passphrase, sizeof(s->passphrase)) < 0) ||
+        (s->passphrase && libsrt_setsockopt(h, fd, SRTO_PASSPHRASE, "SRTO_PASSPHRASE", s->passphrase, strlen(s->passphrase)) < 0) ||
         (s->mss >= 0 && libsrt_setsockopt(h, fd, SRTO_MSS, "SRTO_MMS", &s->mss, sizeof(s->mss)) < 0) ||
         (s->ffs >= 0 && libsrt_setsockopt(h, fd, SRTO_FC, "SRTO_FC", &s->ffs, sizeof(s->ffs)) < 0) ||
         (s->ipttl >= 0 && libsrt_setsockopt(h, fd, SRTO_IPTTL, "SRTO_UPTTL", &s->ipttl, sizeof(s->ipttl)) < 0) ||

```

### 追記 (2018.11.12)
このバグはffmpeg 4.1 で解消しました。
https://qiita.com/tetsu_koba/items/cc1ecb9c2f5ae2901aa9


# 実行例

gstreamerでテストパターンを暗号化して送信する。passphraseは "abcdefgh123456"
key lengthは指定していないのでデフォルトの16(128bit)が使用される。

```send_testptn_crypt.sh 
#!/bin/sh

gst-launch-1.0 \
  videotestsrc is-live=true pattern=ball \
! video/x-raw,width=640,height=360,framerate=30/1 \
! x264enc tune=zerolatency key-int-max=60 \
! mpegtsmux \
! srtserversink  uri="srt://:7010" passphrase=abcdefgh123456
```

これを前述のパッチを当ててビルドしたffplayで再生する。

```
ffplay srt://localhost:7010?passphrase=abcdefgh123456
```

もしもpassphraseが一致しないときには以下のようなエラーが出て再生できない。

```
16:44:50.080269/read_thread*E: SRT.c: processSrtMsg_KMRSP: received failure report. STATE: BADSECRET
16:44:50.104531/SRT:RcvQ:worker*E: SRT.c: SECURITY STATUS: BADSECRET - can't decrypt packet.
16:44:50.105470/SRT:RcvQ:worker*E: SRT.c: KMREQ/rcv: (snd) Rx process failure - BADSECRET
16:44:50.105558/SRT:RcvQ:worker*E: SRT.c: SECURITY STATUS: BADSECRET - can't decrypt packet.
```

# 関連

[新しい映像伝送プロトコルSRTをgstreamerとVLCで試す](https://qiita.com/tetsu_koba/items/b12a6de83185a5267217)
[ffmpeg 4.0 に入った新しい映像伝送プロトコルSRTを試す](https://qiita.com/tetsu_koba/items/b8e1868a726c6201d3ab)
[ffmpeg 4.0 をlibsrtを有効にしてビルドする](https://qiita.com/tetsu_koba/items/92c398abd96c651f4035)
SSHでLAN内からのパスワードログインを許可する

OpenSSHサーバーでパスワードログインを禁止していて、LAN内からに限りパスワードログインを許可する方法です。

・Fedora 28 Server
・OpenSSH 7.7

エディタでsshd_configを開く

```terminal
sudo nano /etc/ssh/sshd_config
```

Matchディレクティブを使ってローカルネットワークを指定し、パスワードログインを許可する。sshd_configに下記を追加。

```text:sshd_config
Match Address 192.168.1.0/24
    PasswordAuthentication yes
```

OpenSSHサーバーを再起動する。

```terminal
sudo systemctl restart sshd
```
HTML5.2にてモーダルウィンドウが使えるようになったっぽい

#とりあえず実装例
百聞は一見に如かず（現状IEとかEdgeでは動かない）
<p data-height="265" data-theme-id="0" data-slug-hash="LJRdzy" data-default-tab="js,result" data-user="Keyhoh" data-pen-title="LJRdzy" class="codepen">See the Pen <a href="https://codepen.io/Keyhoh/pen/LJRdzy/">LJRdzy</a> by Heyhoh (<a href="https://codepen.io/Keyhoh">@Keyhoh</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
僕がメインOSをWindows10からUbuntuに移行するときにやったこと（後編）Ubuntu編

今回は前回の続きとなります。前編はこちら↓
https://qiita.com/asapy0307/items/5a56123133a646dc53bd
やること
--
1. Dropboxなどのオンラインストレージに大事なデータを移す。
1. パソコンのHDDやSSDをクローンしてバックアップする。
2. Ubuntuとwindowsをデュアルブートする。　　　　　　（ここまで前編）
3. ctrlとcapslookを入れ替える。
4. 必要なソフトをインストールする。
5. コマンドで遊ぶ。

1〜2はWindowsで作業します。3でUbuntuをインストールしたらそのあとはUbuntuで作業します。

環境
--
・ASUS Zenbook 3 UK390UA
・Ubuntu 18.04 LTS
・Windows 10
前編と同じです。
ctrlとcapsを入れ替える。
--
プログラミングをする人は特にショートカットを多用すると思うのでctrlを打ちやすいAキーの横がいいと思います。
xkbなどを弄ってやる人もいると思いますが、今回は誰でもやりやすいようにGUIでやりたいと思います。

**「GNOME Tweaks」をインストールします。**
Ubuntuソフトウェアを開いて「GNOME Tweaks」をインストールします。。
![Screenshot from 2018-08-27 21-00-47.png](https://qiita-image-store.s3.amazonaws.com/0/278637/3d9dffea-ecc9-2d9b-4c17-d2e5c6027f1b.png)
インストールしたら起動します。そして「キーボードとマウス」をクリック
![tweak-home.png](https://qiita-image-store.s3.amazonaws.com/0/278637/6a60e222-1aa9-2028-4074-2b8d258389e3.png)
「追加のレイアウトオプションをクリック」
![tweak-keyboard.png](https://qiita-image-store.s3.amazonaws.com/0/278637/dc80876a-251a-2b99-7f39-432b0c10b783.png)
写真の数字の順番にクリックして設定します。
![tweak-keyboard-option.png](https://qiita-image-store.s3.amazonaws.com/0/278637/dbce3717-9144-a2c8-21e3-b3c2708710f7.png)
これで再起動したら反映されているとおもいます。（ログアウトでもいいかも）
必要なソフトをインストールする。
--
これは人それぞれだと思います。Ubuntuではコマンドでアプリをインストールする方法とインストーラーを使ってインストールする方法があります。これ以外にも色々なインストール方法があるとおもうので、アプリを入れるときはその都度インストール方法を調べてください。たいていはそのソフトのホームページに乗っていると思います。今回はインストーラーを方法を紹介します。基本的にはwindowsとあまり変わりません。

**インストール方法**
1. Ubuntuのアプリのインストーラーであるdebファイルをダウンロードして起動します。
2. インストーラーが起動したらインストール
コマンドで遊ぶ
--
ファイル操作などをコマンドでできるようにしましょう。コマンドになれるとファイルマネージャーよりやりやすいです。以下のサイトがわかりやすいです。
https://qiita.com/LostEnryu/items/a12689edddca1d906298
これらの他にも色々なコマンドを打って遊んでコマンド操作を習得しましょう。
まとめ
--
UbuntuはGUI操作だけでも使えなくもないのでわりと簡単に導入できました。実際にこのあと使ってみましたが、Ubuntuは結構よかったです。Ubuntuのいいところをまた今度書きたいとおもいます。
C# で FizzBuzzを書いて見た

# 普通な考え方を元に書いてみました。
### 実質のGameルールには従ってない部分：
数字の代わりにFizzBuzzだが、出力を見やすくする為にルールを変更

```c#
: FizzBuzz.cs

using System.Text;
namespace TelerikWinFormsApp1
{
    public partial class FizzBuzz : Telerik.WinControls.UI.RadForm
    {
        public FizzBuzz()
        {
            InitializeComponent();

            StringBuilder str = new StringBuilder();
            for (int i = 1; i <= 100; i++)
            {
                if (i % 15 == 0)
                {
                    str.Append(i.ToString() + "-FizzBuzz");
                }
                else if (i % 3 == 0)
                {
                    str.Append(i.ToString() + "-Buzz");
                }
                else if (i % 5 == 0)
                {
                    str.Append(i.ToString() + "-Fizz");
                }
                else
                {
                    str.Append(i.ToString());
                }
                str.Append("\r\n");
            }
            textBox1.Text = str.ToString();
        }
    }
}
```
![2018-08-29 20_47_03-FizzBuzz Output.png](https://qiita-image-store.s3.amazonaws.com/0/107324/6832bcf3-81db-2c82-b56e-166db95961b3.png)
gRPC-SwiftでgRPCのデバッグ情報を出力する

現状gRPC-swiftは以下図のようにgRPC-C-Coreをラップして実装されています。
そして、C-Coreベースの実装で設定可能な環境変数が[こちら](https://github.com/grpc/grpc/blob/master/doc/environment_variables.md)で公開されています。
<img width="400" alt="スクリーンショット 2018-08-29 19.30.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/9628/2db0a14a-7ae0-346e-ed61-b770c1dbd3e3.png">

中でも`GRPC_TRACE`と`GRPC_VERBOSITY`はデバッグに便利で、
`GRPC_TRACE`に`all`を指定するとapiコールからchannelの動作まで全てトレースします。
`GRPC_VERBOSITY`に`DEBUG`を指定するとトレース結果を全て標準出力に出力します。


エラーだけを出力したければ`GRPC_VERBOSITY="DEBUG"`でOKです。
また、`-pending_tags`と`-`で指定するとトレース対象から除外されます。  

```sh
$ export GRPC_TRACE=all,-pending_tags
$ export GRPC_VERBOSITY="DEBUG"
```

以下はログの一部抜粋ですが`keepalive_time_ms`が5000に設定されている事がログから分かりますね。

```sh

I0829 19:52:25.917127000 123145385742336 handshaker.cc:211]  
handshake_manager 0x7f8d5140dee0: error="No Error" 
shutdown=0 index=0, args={endpoint=0x7f8d5140c7b0, 
args=0x6000000035d0 {size=7: grpc.keepalive_time_ms=5000, grpc.keepalive_permit_without_calls=1, 
grpc.http2.max_pings_without_data=0, grpc.client_channel_factory=0x10f8a0ac8, grpc.server_uri=dns:///127.0.0.1:50051,
grpc.default_authority=127.0.0.1:50051, grpc.subchannel_address=ipv4:127.0.0.1:50158}, read_buffer=0x7f8d515005c0 (length=0), exit_early=0}
```

Xcode上で設定したいときは、`Product`>`Scheme`>`Edit Scheme`>`Arguments`の`Environment Variables`から渡してあげればOKです。  

<img width="878" alt="スクリーンショット 2018-08-29 19.48.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/9628/d9d0ec4a-1a3c-b13e-8ae7-0085ea6bf25c.png">  

Core部分をネイティブ実装しているGoやJavaでは使えないと思うのでご注意を。
Python3の内包表記と、辞書の逆引き

# 内包表記とは？

これは自分用に忘備録として書いているだけなので、正確性はありません。
内包表記などを詳しく知りたければ、他の方のを見た方が為になること間違いなしです。

では、本編。
Python3系において、(たしか)追加された機能であり2系では使えないものだったはず。
まぁ御託は置いといて。
何ができるのかというと、リスト生成の際の省略とスピードアップ。
書き方は 

example = [i for i in range(100)]

みたいな感じ。
example = []
for i in range(100):
    example.append(i)

とやってることは同じみたい。

なんで速くなるのか知りたい人は詳しく調べて見てね〜

# 辞書の逆引き

この内包表記を知ると、結構簡単に逆引きできるっぽい。
まぁ、別に普通に書いても簡単だけど。。。

fruits = {"apple":"りんご", "orange":"みかん", "banana":"バナナ", "grape":"ブドウ"}
みたいにすると、print(fruits["apple"])で、りんごって結果が得られるんだよね。
なら、りんごって入れてappleって出したい。for文でlist作ってアクセス？だるいな。。。
どーしよう。
ってわけで、内包表記してみる。

fruit_name = [en for en, ja in fruits.items() if(ja=="りんご")]
print(fruit_name)

とすれば、appleと出力される。無事keyゲットだね！！
Pythonでサブディレクトリからimportする

サブディレクトリから自作モジュールをimportする方法を検索して見つけたのでメモ

↓　参考サイト
http://otiai10.hatenablog.com/entry/2013/08/13/215034

```python:ディレクトリ
root
├ main.py
└ aaa
  └ bbb.py
```

ここでmain.pyからbbb.pyをimportしたい場合、aaaに空ファイル\__\init\_\_.pyを作る。

するとディレクトリ構造は以下のようになる。

```python:ディレクトリ
root
├ main.py
└ aaa
  ├__init__.py
  └ bbb.py
```

そして、main.pyで

```python:main.py
from aaa import bbb
```

とすればimportできるようになる。
（初日）java.io.InputStreamはリゾートカジノ白服ディーラー（カード担当）

## はじめに
この記事は[リンク情報システム](https://www.lis.co.jp/)が主催するイベント「[Tech Connect! Autumn](https://qiita.com/dgkz/items/4c3a449f3168d6c787cf)」のリレー記事です。
「[Tech Connect! Autumn](https://qiita.com/dgkz/items/4c3a449f3168d6c787cf)」は engineer.hanzomon のグループメンバによってリレーされます。
（リンク情報システムのFacebookは[こちらから](https://ja-jp.facebook.com/lis.co.jp/)）

１日目は本イベント言い出しっぺの大伍がポエムをお送りします。

## InputStreamを樽に刺す
普段何気に使っているjava.io.InputStreamの**主観的印象**を膨らませるポエムです。

・・・・・
Streamから受ける印象は「流れ」。
ファイルなどを読む時に先が尖っていそうなInputStreamを樽に刺す。
刺すとそこからデータが水のように出てくるのでBufferedReaderなどで少しづつ貯めながら飲んでいく事となる。

## 最初は飲めるものと思っていました
プログラム書くときはドバドバ流れ出しても困るので、読む分量を指定するなどして手で塞ぎながら飲んでいく。
read()とclose()は、**流す・塞ぐ感じがあり、水っぽくて良い感じ**である。
だが、skip()というメソッドはnバイトのデータをスキップしちゃうので、その間の水はどうするの？という疑問が生じて水っぽくない。
そもそもInputStreamが扱えるのはbyteなので、角ばっていて数字を表すものが良い。
数字が書いてあるカードが並んでるとしよう。樽と水はさっさと忘れよう。

## カードのもらい方
最初にread()すると先頭のカードがもらえる。
そこには0～255の数字が書いてあるので、それをASCIIと解釈したり、画像データの一部と解釈したり自由にして良い。

もう一回read()すると次のカードがもらえる。
なので、InputStreamは直前に渡したカードの位置を自分で覚えていることになる。

read()は１バイトづつ読むものと、サイズを指定してガサっと読むメソッドが定義されており、サイズ指定read()は内部で1バイトread()をコールしている。

mark()すると、そのカードの位置を覚えてくれて、reset()でその位置に戻ってくれる。
生粋のjava.io.InputStreamはreset()を呼ぶと激怒してIOExceptionを投げてくるが、そもそもmark()やreset()はあまり使わないから、怒り易いことも知らないし、知る必要もない。
InputStreamに水らしさは完全に無くなり、カードすらも喧騒によるカジノ感が出てきた。


## abstractだった
available()というものあり、あとどの位カードが残っているかを教えてくれる約束になっているが、生粋のjava.io.InputStreamは必ずゼロを返す。
多分、読み込み対象が超巨大だったり、連続したデータを扱う事を前提としたくないから？、カジノを取り仕切っているおじさん仕様決定者がゼロを返してよいと決めたのであろう。

最後のカードを読み終え、再度read()を呼ぶと-1が返却される。
カードがもうない時は-1。

　　　
ここまで書いたが、java.io.InputStreamはabstractである。
結構な人たちが**その字面からinterfaceの感触**を受けていると思うがabstractである。
interfaceだったら、働かずに各種やり取りの調停を行う、どちらかというとコンパイラ側の人の印象となるが、InputStreamはabstractなので、若干の筋肉感と働き者感がでてきた。
カジノでカード配っている人はディーラしかいない。


## もっと清楚な人です
カジノのディーラーと書いたが、実際の使い心地はもっと清楚で真面目な感じがあるので、java.io.InputStreamは白系の服を着てかっちり仕事をこなす清楚なリゾートカジノディーラー（カード担当）に近しいか。
黒縁の眼鏡をかけている。

InputStreamを継承した子たちは遺伝子と責務を自身に取り込みつつ、今日も様々なリゾートカジノで働いている。
その眼鏡の奥にはJDK1.0からの実績と自信が満ち溢れている。
　　　　
　　　　
明日は@taisuke3です。
Laravelのrouteヘルパーで相対URLを使う

laravelのrouteヘルパーを利用する絶対URLで出力される。
個人的にはサイト内のリンクは相対URL（ルートパス）で表記したい。

## 調査

```php
$ php artisan tinker
Psy Shell v0.9.7 (PHP 7.2.9 — cli) by Justin Hileman
>>> route('login')
=> "http://localhost:8000/login"
```

調べると第３引数で指定できるらしい。

https://readouble.com/laravel/5.5/ja/helpers.html#method-route

```php:vendor/laravel/framework/src/Illuminate/Foundation/helpers.php
    function route($name, $parameters = [], $absolute = true)
    {
        return app('url')->route($name, $parameters, $absolute);
    } 
```

で実行してみる

```php
>>> route('login', null, false)
=> "/login"
```

ok。解決かなと思うけど、毎回、第2引数にnullセットして第3引数にfalse入れるの辛い。

## 対応

下記を参考にヘルパーを自作する

[Laravel 5へ自作のヘルパー関数を追加するベストプラクティス | 綺麗に死ぬITエンジニア](https://s8a.jp/laravel-custom-helper)

自作ヘルパーの作成

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

if (! function_exists('route_path')) {
    function route_path($name, $parameters = [])
    {
        return route($name, $parameters, false);
    }
}
```

オートロードの設定

```diff:composer.json
    "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "files": [
+           "app/helpers.php"
        ]
    },
```

反映

```sh
$ composer dump-autoload
```

確認

```php
$ php artisan tinker
Psy Shell v0.9.7 (PHP 7.2.9 — cli) by Justin Hileman
>>> route_path('login')
=> "/login"
```

すっきり
QiitaファンミーティングLT: 量子コンピュータはじめました

# この夏、転職しました
某IT企業
↓
量子コンピュータのベンチャー (MDR社)

---

## ということで、量子コンピュータ、実際どうなの？って話をします。

---

## 量子コンピュータは2種類ある
- 量子アニーリング (イジングモデル) 方式と、量子ゲート方式
    - できることも、目指していることも違うのだから、区別したい
- 混同している記事は、ネットにも商業誌にも、たくさん転がっている。

---

## 量子コンピュータは2種類ある

- 量子アニーリング (イジングモデル) 方式
    - 組み合わせ最適化に特化している
    - 焼きなまし法を改善した方式を実機で解く
- 量子ゲート方式
    - チューリング機械の概念を拡張したもの
    - 従来のコンピュータを発展させたもの

---

## 量子コンピュータは2種類ある

- 量子アニーリング (イジングモデル) 方式
    - D-Wave社のマシンが有名
    - リクルート、メルカリ、デンソー、フィックスターズ、その他多くの企業が参戦
- 量子ゲート方式
    - Google、IBM、Microsoftなど大手が覇権を争う

---

## 量子コンピュータは2種類ある

- 量子アニーリング (イジングモデル) 方式
    - マシンが既に実用レベルに達している
- 量子ゲート方式
    - 実用にはまだまだ遠い
        - 想像を絶するほど役に立たない
        - 今後「スパコンを超えた」というニュースが流れても、まだ慌てなくていい
    - ポテンシャルは秘めている

---

## MDR社の立ち位置

- 量子アニーリングと量子ゲート、両方やっている
- 今後は量子ゲート方式に力を入れる(はず)


かなりの頻度で勉強会を開催しています
興味のある方はお越しください
https://qnn.connpass.com/

---

## 量子アニーリング方式
電子 = 世界一小さい磁石
「スピン」の向きが揃っている→強い磁石
「スピン」の向きがバラバラ→打ち消し合う

スピンの向き
→電子同士の相互作用の強さと外部磁場に依存
　(エネルギーが低くなる方向を向く)
これらを人工的に制御することで計算に生かす

---

QUBO: 組み合わせ最適化問題の表現方法のひとつ
N x N行列のQを与えて、ビット列$\lbrace \sigma \rbrace$を求める
$$\min_{\lbrace \sigma_1, \dots, \sigma_N \rbrace \in \lbrace 0, 1 \rbrace ^N} \sum_{i<j} Q_{ij}\sigma_i\sigma_j$$

Q: 電子同士の相互作用、σ: スピンの向き
と読み替えると、
「電子同士の相互作用がQのとき、スピンσはどっち向きか？」→実機で試すと解ける

---
## 量子ゲート方式

- ビット: 0または1
- 量子ビット: 0成分の波と1成分の波の重ね合わせ
    - 単に確率的なだけだと、乱数を使った計算と同じ
    - 波 = 振幅と位相
- ゲート: AND/OR/NOTみたいなもん
    - 1量子ビットの回転と、2量子ビットの相互作用

---
## 理想的な量子ゲート方式
- 従来のコンピュータでできること + 量子演算
    - 従来の演算は、同じ計算量で動く
        - 速くはならない！
        - 量子演算を使ったアルゴリズムに書き直すと速くなるかも
- 素因数分解、離散対数が多項式時間で解ける
- N回の総当りが必要だったものが$\sqrt N$回に

---
## 現実の量子ゲート方式
- 今のマシンはノイズに弱く、誤りが多い
- 理想的な量子計算には、量子誤り訂正が必須
    - 今のマシンは、誤り訂正には量子ビットが足りない (現状: 50 → 必要: 数千、数万)
- 因数分解はできない。実用には遠い
    - 「シミュレーションできない」という意味で今後スパコンを超えることは予想されている

---
## NISQ時代の幕開け
- Noisy Intermediate-Scale Quantum
    - Preskill氏による造語
    - 誤り訂正なし、50〜数百量子ビット
- 従来のコンピュータと、得意分野を補い合うことで量子の利点を発揮する

---
## ハイブリッド量子演算 
- 量子化学計算などに使われる固有値問題、最小化問題を解く
    - ある量子回路が最小になるようなパラメータを、従来手法で最適化する
- 同様の手法で組合せ最適化、機械学習なども提案されている
    - ただし、実用にはまだ遠い

---
## まとめ

- 量子コンピュータの会社に転職した
- 量子アニーリング方式: 組み合わせ最適化
- 量子ゲート方式
    - NISQ: できつつある。実用性不明
    - 誤り訂正あり: 万能量子計算。未来の話
- がんばるぞい
【ColdFusion】正規表現で部分文字列を取得

##ColdFusionで正規表現を使って部分文字列を取得したい

調べたらこんな感じで取れるらしい。
[照合された部分文字列の戻し](http://ipx.ne.jp/cfdocs/Developing_ColdFusion_Applications/regexp6.html)

##関数を作ってみた

```cfc
<!--- 正規表現で部分文字列を取得する関数 --->
<CFFUNCTION name="REArray" returntype="array">
	<CFARGUMENT name="reg_ex" type="string" required="true">
	<CFARGUMENT name="target_str" type="string" required="true">

	<CFSET local.regex = REFindNoCase(reg_ex, target_str, 1, true)>
	<CFSET local.aResult = arrayNew(1)>
	<CFLOOP from="1" to="#arrayLen(local.regex.pos)#" index="i">
		<CFIF local.regex.pos[i] neq 0>
			<CFSET arrayAppend(local.aResult, mid(target_str, local.regex.pos[i], local.regex.len[i]))>
		</CFIF>
	</CFLOOP>

	<CFRETURN local.aResult>
</CFFUNCTION>
```

##使用例

```cfc
<CFSET aResult = REArray("^【(\d+)月(\d+)日.+】(.+)おまかせ御膳（(.+)）$", "【8月30日（木）】雑穀米220gおまかせ御膳（海老チリ＆シューマイ）")>
<CFDUMP var="#aResult#">
```

こんな感じの配列を返します。
![2018-08-29_175113.png](https://qiita-image-store.s3.amazonaws.com/0/106969/cbf43c32-37e9-70ae-3366-968a18232fb8.png)
JUPYTER　NOTEBOOKでデータ分析レポート作成

# 狙い
プログラミングにまったく興味がない上司や関係者にも見てもらえるデータ分析レポートをjupyter notebookで作成したい。パワポにグラフや表を張り付けるのは面倒。役立ちそうなことをまとめる。


## 荒い画像をきれいに表示

```
%config InlineBackend.figure_format = 'retina'

```

## プレゼンスライド
[Jupyter Notebookを簡単にプレゼンスライドにする方法](https://qiita.com/cvusk/items/d425751ba663dc8c6517)

## 目次を自動で作る
NbextensionsのTable of Contents (2)にチェックを入れて、ノートをF5などで再表示します。

## HTML自動保存
[Jupyter notebook で HTML も自動作成](https://qiita.com/junkoda/items/011d44dcc1c8bd0a936a)

## スクリプトを非表示にする

[Jupyter 知っておくと少し便利なTIPS集](https://qiita.com/simonritchie/items/d7dccb798f0b9c8b1ec5)

```
from IPython.display import HTML

HTML("""
<button id="code-show-switch-btn">スクリプトを非表示にする</button>

<script>
var code_show = true;

function switch_display_setting() {
    var switch_btn = $("#code-show-switch-btn");
    if (code_show) {
        $("div.input").hide();
        code_show = false;
        switch_btn.text("スクリプトを表示する");
    }else {
        $("div.input").show();
        code_show = true;
        switch_btn.text("スクリプトを非表示にする");
    }
}

$("#code-show-switch-btn").click(switch_display_setting);
</script>
""")
```

## ipynbをバッチ実行してhtmlを出力
[jupyter notebookのipynbファイルをバッチ実行してhtmlを出力する](http://takemikami.com/2017/01/16/jupyter-notebookipynbhtml.html)

```
pip install runipy
```

```
runipy src.ipynb out.ipynb
jupyter nbconvert out.ipynb --to html
```

## 探索的に集計：pivottableを使う
[Pythonで探索的データ分析したいのでpivottablejsを使う](http://esu-ko.hatenablog.com/entry/2016/03/04/Python%E3%81%A7%E6%8E%A2%E7%B4%A2%E7%9A%84%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%A7pivottablejs%E3%82%92%E4%BD%BF%E3%81%86)
[Jupyterでpivottableを使う](https://qiita.com/Hyperion13fleet/items/c99dbbc6bdb455804847)
プルリクを分けて出す方法3パターン

Gitを使い始めた頃、「プルリクを分けて」と言われて困ってたけど、知らない間にできるようになってた。
私のPRの出し方にはだいたい3パターンある。

- ローカルブランチを分けてpushしていく方法
- ローカルブランチ一本でpushしていく方法
- cherry-pickを使って、同じブランチ上のcommitを分けてPRを出す

###注意点
だいぶざっくりとしか書いていないので、参考程度にしてください。
特に `git reset --hard` や `cherry-pick` は使い方を間違えるとものすごく面倒なことになったりするので。

## ローカルブランチを分けてpushしていく方法　（おてがる度 ★★★★★）

いちばんシンプルでわかりやすい方法。

### メリット
pushするときに手元（ローカル）のブランチとリモートのブランチの名前が一致しているので、混乱しない。

### デメリット
手元のブランチが増えて煩雑になる。ブランチの削除が邪魔くさい。

### 手順

```
//typoブランチを作成
git checkout -b typo

//ブランチの起点先を指定したい場合は-bの前に指定
git checkout origin/master -b typo

//commitしたら自分のリポジトリにpushしてtypoブランチを作成（今回の場合、リモート名はshonoで登録済み）
git push shono typo
```

これで自分のリポジトリに `typo` ブランチが作成されるので、GitHubでPRを出す。

## ローカルブランチ一本でpushしていく方法　（おてがる度 ★★★）

いちばんよくやる方法。

### メリット
手元のブランチが一本で済む。PhpStorm > Version Control > Log がすっきり見やすくなる。

### デメリット
pushし忘れて `reset --hard` したら終わるので注意が必要。

### 手順

```
//自分の今いるブランチを確認（今回はmaster）
git branch

//作業してcommitしたら、masterブランチをtypo2ブランチとして自分のリモートジポジトリに作成
git push shono master:typo2
```

これで自分のリポジトリに `typo2` ブランチが作成されるので、GitHubでPRを出す。
で、

```
//先ほどの作業開始点の一つ前のcommit番号までreset --hardで戻す。
git reset --hard abcdef
```

これでmasterブランチがクリーンな状態に戻る。

## cherry-pickを使って、同じブランチ上のcommitを分けてPRを出す　（おてがる度 ★）
ブランチの切り替え or ブランチのリセットを忘れて作業してしまった場合。

## メリット
「ブランチを複製して、reset --softをして不要なファイルだけをRevertしてcommitして...」といった作業なしにブランチを分けられる。

## デメリット
事故りやすい。

### 手順
masterブランチにある連続したcommitを分けたい場合。（例　commit番号 aaabbb/cccddd）


```
//origin/masterを起点としてブランチ作成
git checkout origin/master -b dev

//devブランチにcheckout
git checkout dev

//欲しいcommit番号をcherry-pickする
git cherry-pick aaabbb
```

これでdevブランチに `aaabbb` のコミットがくっついた形になるので、あとは「ローカルブランチを分けてpushしていく方法」に則ってPRを出していくだけ。
型変換をまとめる

##文字列から数値へ
*  Number関数、parseInt、parseFloat
*  イディオム的に変換する方法
*  文字列の　'0'　は判定されない

```js:js
const str = '0123';

//関数
Number(str); //123
parseInt(str, 10); //123
parseFloat(str); //123

//文字列から数値への暗黙の型変換
str - 0; //123
str * 1; //123
str / 1; //123
+str; //123 
```

####数値に変換できない文字列を含む型変換

```js:js
const str2 = '123px';

Number(str2); //NaN 文字列を含むとNaNを返す
parseInt(str2, 10); //123　
parseFloat(str2); //123
```

####空文字列を含む型変換

```js:js
const str3 = '';

Number(str3); //0
parseInt(str3, 10); //NaN　
parseFloat(str3); //NaN
```

###parseInt、parseFloatの違い
####parseInt
* parseIntは第一引数に文字列をとり、第二引数で基数（10進数や6進数など）を取る
* 第一引数で数字とされない文字を認めると、それ以降の文字を無視して、それまでの値を返す
* 整数を返す

####parseFloat
* 引数として与えられた文字列を解析し浮動小数点を返す
* 正負記号 (+ か -)、数字 (0-9)、小数点、指数以外の文字があれば、それ以降を無視してそれまでの値を返す


##数値から文字列への変換
* String関数もしくはtoStringメソッドを使う
* イディオム的に変換する

```js:js
const num = 123;

String(num); //'123'
num.toString(10); //'123'
num + ''; //'123';
```

##ブーリアン型の型変換
* falseを返すもの
    * 数値０
    * null
    * undefined値
    * 空文字列
    * arr.lengthで中身がないとき
* trueをかえすもの
    * 数値１
    * 配列（オブジェクト）。空でもtrueが返る。
    * arr.lengthで配列に中身があるとき

```js:js
//真偽値判定関数
function checkBoolean(val) {
    if (val) {
        console.log(val + ' is true');
    } else {
        console.log(val + ' is false');
    }
}

const num = 0;
const num2 = null;
let num3;
const num4 = 1;
const str = '';
const arr = [];
const arr2 = [2,3];

//falseを返すもの
checkBoolean(num);//"0 is false"
checkBoolean(num2);//"null is false"
checkBoolean(num3);//"undefined is false"
checkBoolean(str);//" is false"
checkBoolean(arr.length);//"0 is false"


//trueをかえすも
checkBoolean(num4);//"1 is true"
checkBoolean(arr);//" is true"
checkBoolean(arr2);//"2,3 is true"
checkBoolean(arr2.length);//"2 is true"
```

##ブーリアン、null、undefined型から数値変換
* trueは１
* falseは０
* nullは０
* undefinedはNaN

```js:js
let a;

a = Number(true); console.log(a); //1
a = Number(false); console.log(a); //0
a = Number(null); console.log(a); //0
a = Number(undefined); console.log(a); //NaN
```

##比較演算子による型変換
* 比較できない文字列値はNaN
* undefinedもNaN
* trueは１
* falseは０
* nullは０

```js:js
function checkBoolean(val) {
    if (val) {
        console.log(val);
    } else {
        console.log(val);
    }
}


checkBoolean(1 > 'x');  //false
checkBoolean(undefined > 0);  //false
checkBoolean(true > 0);  //true 
checkBoolean(null < 1);  //true
```

##オブジェクトからの型変換
* 文字列型は、String関数もしくはtoStringメソッド
* 数値型は、Number関数もしくはvalueOfメソッド
* valueOfメソッドは、オブジェクトが基本型のデータの値を持っていればそれを返す。
JSON.stringifyの出力結果を整形して可読性を向上させる

# JSON.stringify()の出力結果が見辛い
`JSON.stringify(value)`の出力結果が整形されておらず見辛くて困ってた。
初心に戻りドキュメントを見てみると、オプションでサクッと整形できることがわかったのでメモ。


第3引数に空白文字を渡すと出力結果にインデントを付与することができる模様。

## 構文
`JSON.stringify(value[, replacer[, space]])`

## 引数
> value
>   JSON 文字列に変換する値。
> 
> replacer Optional
> 文字列化の手順の挙動を変更する関数、または値のオブジェクトを JSON 文字列に含めるプロパティを選択するホワイトリストとして機能する String と Number オブジェクトの配列。もしこの値が null であるか提供されない場合は、結果の文字列にオブジェクトのすべてのプロパティが含まれます。
> 
> space Optional
>出力する JSON 文字列に可読性を目的に空白を挿入するために使う String または Number オブジェクト。これが Number のときは空白として使う空白文字の数を示します。この数字は上限が 10 に設定されていて 10 より大きい場合 10 となります。1 より小さい値は空白を使わないことを示します。これが String のときはその文字列（10 文字より長い場合はその最初の 10 文字）が空白として使われます。もしこの引数が提供されない（または null である）場合は、空白は使用されません。
>
> [JSON.stringify() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)

知らなかった。

## 第1引数のみ渡した場合

`JSON.stringify(err);`

```
{"message":"NaN を (class) に変換できません。","name":"InternalError","fileName":"event/pr (hoge bot（testing）)","lineNumber":47,"stack":"\tat event/pr (hoge  bot（testing）):47 (sendPrRestart)\n\tat コード (hoge  bot（testing）):45\n\tat コード (hoge  bot（testing）):13 (doPost)\n"}
```
見辛い(´・_・`)

## 第3引数にタブ文字を渡した場合
`JSON.stringify(err, null , "\t");`

```
{
    "message": "NaN を (class) に変換できません。",
    "name": "InternalError",
    "fileName": "event/pr (hoge  bot（testing）)",
    "lineNumber": 47,
    "stack": "\tat event/pr (hoge bot（testing）):47 (sendPrRestart)\n\tat コード (hoge bot（testing）):45\n\tat コード (hoge bot（testing）):13 (doPost)\n"
}
```
見やすい＼(^o^)／


第2引数のreplacerには関数や配列も渡せるようなので、フィルターかけたり文字列を変換することもできるっぽい。

便利。
codenize-tools/miam の DSL を parse して中身をチェックするスクリプトを書く

私は AWS の IAM 定義に [codenize-tools/miam](https://github.com/codenize-tools/miam) というツールを使っています。
DSL で宣言的に定義し、適用できるので大変便利なツールです。

## 解決したい問題

一部を除く全ての Group に共通の Managed Policy を attach したい。
が、漏れがあると困るので、必要なグループの全てに attach されているか、を自動的にチェックしたい。

「一部」とは、例えば管理者権限を持つグループとか。

## ソリューション

`Miam::DSL.parse` メソッドを使う。

このメソッドは IAM を定義した DSL を parse し、その結果をプレーンな `Hash` として返す。
`Hash` なので適当にごにょごにょすれば良い。

ここでは、`SRE` というグループ以外の全てが `global_user_policy` という名前の Managed Policy を持っているかどうかをチェックしている。
全てのグループがちゃんと持っていれば `exit 0` し、持ってないグループがいれば `exit 1` してそのグループ名を出力する。

(実際に私の業務で使っているものはもうちょい複雑な条件がいくつかありますが、その辺は各自好きにやりましょう)

```rb:test_global_user_policy.rb
require 'miam'

WHITE_LISTED_GROUPS = %w(
  SRE
)
IAMFILE_PATH = 'IAMfile'

groups = Miam::DSL.parse(open(IAMFILE_PATH).read, IAMFILE_PATH).fetch(:groups)
groups_without_global_user_policy = groups
  .reject { |name, definition|
    definition.fetch(:attached_managed_policies).any? { |policy_arn| policy_arn.end_with?(':policy/global_user_policy') }
  }
  .reject { |name, definition| WHITE_LISTED_GROUPS.include?(name) }
  .keys

if groups_without_global_user_policy.empty?
  warn "*** global_user_policy is applied correctly!"
else
  warn "*** These groups are not attached `global_user_policy`."
  warn "*** Is it okay?"
  warn "*** If it's okay, please add the group names into `WHITE_LISTED_GROUPS` in #{__FILE__}"

  groups_without_global_user_policy.each do |name|
    puts name
  end

  exit 1
end
```

あとはこのコマンドを CI とかに組み込めば OK。

```
$ bundle exec ruby test_global_user_policy.rb
```

プレーンな `Hash` なのでこのように簡単に料理できます。
便利ですね。
Git — git の編集モードで Vimを最初からインサートモードで開く

素早くコミットしていく開発スタイルだとじわじわと便利

## git config

```
~/.gitconfig
```

```
[core]
  editor = 'vim' -c 'startinsert'
```

## Versions

- git version 2.8.1
- VIM - Vi IMproved 8.1

## Links

- [Gist](https://gist.github.com/YumaInaura/bdd74d0e0a89c246bf7286a184c6447d)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Ubuntuでsudoするときのパスワード入力を省略する

## はじめに
本当にsudoをパスワードなしで実行していいか100回自問自答する

## 設定変更
sudoしたいユーザでログインして下記実施

```
cat << EOF | sudo tee /etc/sudoers.d/$(logname) >> /dev/null
$(logname) ALL=(ALL) NOPASSWD:ALL
EOF
```

## 確認
```
cat /etc/sudoers.d/$(logname)
doQiita ALL=(ALL) NOPASSWD:ALL
```

※ `NOPASSWD:ALL` の `ALL` の部分を任意のコマンド（フルパス）に置き換えると任意のコマンドだけパスワード不要になる
例：`NOPASSWD:/sbin/shutdown`
Atcoder ABC 099 C by Python3 (動的計画法)

[Atcoder Beginner Contest 099 C](https://beta.atcoder.jp/contests/abc099/tasks/abc099_c) のPython3による解答例。

##学んだこと
- nが与えられたときに、1円、6^i円、9^j円の出金をそれぞれ何回行うと出金回数が最小になるか、一発で特定するのは難しそう。
- そこで、n<=iにおいて出金回数が分かっている場合に、それらを用いて、n=i+1における最小の出金回数を漸化的に求められないか、と考える。
- つまり、「一発で求めるのが難しいならば、漸化的に求められないか」と発想すること。
- 漸化的に求める場合、リストに値を格納しておき、漸化式においてそれを参照する。この方法を動的計画法と呼ぶ。

##コード
```
# coding: utf-8

n = int(input())

#（↓）n円をおろすときの最小の出金回数をdp[n]に格納する。
#（↓）0円をおろすには0回の出金でよいのでdp[0]=0を初期値として設定する。
dp = [0]

#（↓）おろす金額がi円（=1,2,3,...,n）の場合を順番に考える。
for i in range(1,n+1):

    #（↓）i円を出金するときにありうる出金回数を全部Qに格納する。
    #（↓）全ての出金方法を検討した後で、Qの最小値、すなわちn円をおろすのに
    #（↓）必要な最小の出金回数をdp[i]に格納する。
    Q = []

    Q.append(1+dp[i-1])
    
    p6 = 1
    while i >= 6**p6:
        Q.append(1+dp[i-6**p6])
        p6 += 1

    p9 = 1
    while i >= 9**p9:
        Q.append(1+dp[i-9**p9])
        p9 += 1
    
    dp.append(min(Q))

print(dp[n])
```
配列 a の全ての要素が配列 b に含まれることを確認する

# 方法

## :sob: 愚直な方法

```rb
a = [1, 2]
b = [3, 2, 1]
a.all? { |a_el| b.include?(a_el) } #=> true

c = [1, 4]
c.all? { |c_el| b.include?(c_el) } #=> false
```

## :neutral_face: まずまずの方法

配列を集合とみなし、a と b の積集合が a と一致すれば、a は b の部分集合だとみなす。ただし、a に重複する要素がないことが前提。

```rb
a = [1, 2]
b = [3, 2, 1]
a & b == a #=> true

c = [1, 4]
c & b == c #=> false
```

シンプルだが直感的ではない。

## :smiley: よい方法

Set を使えば集合専用のメソッドが使える。

```rb
a = [1, 2]
b = [3, 2, 1]
a.to_set.subset?(b.to_set) #=> true

c = [1, 4]
c.to_set.subset?(b.to_set)
```

シンプルさは前の方法に劣るが、[Set#subset?](https://docs.ruby-lang.org/ja/latest/method/Set/i/proper_subset=3f.html) のおかげで可読性が上がる。
レスポンシブイメージの実装テク

主に社内勉強会向けに書きました。

画像リストやブロックの中に画像が入るようなケースを作成していると、画像のサイズが統一されている状態で並べて表示させると一見整って見えますが、必ずしも入ってくる画像サイズが同じとは限りません。ブラウザサイズやウインドウサイズで縦横比が変わってきたりすることもあります。

そこでよくつかわれる方法を考えてみます。

`background`や、`object-fit`や`max-width`プロパティを使用することも多いかと思います。

## background
```css
.sampleImg {
  background-image: url("image.png");
  background-size: cover;
}
```
↑おなじみbackground

## object-fit
```css
img {
  width: 250px;
  height: 250px;
  object-fit: cover; /* これ */
}
```
↑ IEだとアレ

## max-width

```css
img { 
  height：auto; 
  width：100％;
  max-width：720px; /* これ */
}
```
↑ 一見よさげだけど状態によってはmax-width効かない問題はよくあります。

では他に方法はあるのかどうか

## srcsetを使ってみましょう

```html
<img src="img/sample-img.jpg"
     srcset="img/sample-img-320.jpg 320w,
             img/sample-img-640.jpg 640w"
     sizes="50vw">
```

320w, 640w って？
→ その画像を表示したい時のブラウザ幅です

sizesの`vw`とは？
viewport widthの略称らしく、viewportの幅に対する割合（％）を指します。

幅1000pxで開いている場合

```
100vw = 1000px * 100% = 1000px　
50vw  = 1000px * 50%  = 500px
30vw  = 1000px * 30%  = 約333px
```

sizesは

```css
sizes="(max-width: 320px) 280px,
       (max-width: 480px) 440px"
```
のような複数指定もできる感じです。

## srcsetはpictureタグでも使えます

```html
<picture>
  <source media="(max-width: 799px)" srcset="hoge-480w.jpg">
  <source media="(min-width: 800px)" srcset="hoge-800w.jpg">
  <img src="hoge-800w.jpg">
</picture>
```

こんな感じで画面サイズによって違う画像を読み込ませることが
JSを使わずにHTMLだけで完結したりします。

ちなみにIEは対応してないので
![スクリーンショット 2018-08-29 18.21.52.png](https://qiita-image-store.s3.amazonaws.com/0/30278/c528a661-49dd-e803-7c68-e938d057bd83.png)

IE対応として[picturefill](https://github.com/scottjehl/picturefill)というライブラリを導入すると幸せになれそうな気配です。

## 参考
https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images
nuxt.js

## デフォルトの構成
フォルダ名などは基本的にこのまま使う。
（他のバックエンドフレームワークと同様）

### layouts
ここが全体レイアウトになる
`<nuxt>` のところに追加したりすれば、全ページ共通で使いたいコンポーネントを差し込んだりもできる

## 記事のページをつくる
idをとって表示させたいときは

![Screen Shot 2018-04-12 at 20.41.55.png](https://qiita-image-store.s3.amazonaws.com/0/109241/1c70557a-762b-20d0-51ce-d3cecee777ce.png "Screen Shot 2018-04-12 at 20.41.55.png")

こんな感じで `pages/pages` の下に `_`をつけてファイルを作る。
`_` の後ろの名前（この場合`id`）がパラメータとなる。

### idを取得したい

`$route.params.id` とすれば取得できる


```
<p>post id: {{$route.params.id}}</p>
```

## データについて
基本的にデータはコンポーネントに持たせるのでどんどん扱いにくくなる。

### Vuex
コンポーネントでもっていたデータを「ストア」という形でまとめて持つことができ、コンポーネントはそのまとめてあったデータを読み込みに行くだけでよいので高速かつ扱いやすくなる

### state/mutataions/actions

#### state
コンポーネントで使用するデータ

#### mutations
stateを変化させるための同期関数。
シンプルな変更処理だけを書くべきで、「APIを叩いてデータをとってくる」などはactionsに書くべき。

#### actions
実際に非同期処理などを用いてデータを変更する関数

# axios

APIを叩くライブラリ
EC2 に ログインした際、インスタンス情報を表示させたい

## はじめに
EC2 へ SSH ログインしたときに、インスタンスタイプなんかが見れたらいいなー、って思って適当に作ったもの。
Redhat 系の OS しか対象にしていないので、仕事で扱っていない Ubuntu とか Debian とかは知らないっす。

## 使い方
今回は下記を表示させた

- OS
- インスタンスID
- インスタンスタイプ
- アベイラビリティゾーン
- Elastic IP

### Redhat 系 OS の場合
下記のファイルを配置すれば OK
root 直ログインの場合は適当に直して

```bash:/etc/profile.d/motd.sh
#!/bin/bash

user_name=$(whoami)

if [ $user_name != "root" ]; then

  instance_id=$(curl -s 169.254.169.254/latest/meta-data/instance-id)
  instance_type=$(curl -s 169.254.169.254/latest/meta-data/instance-type)
  availability_zone=$(curl -s 169.254.169.254/latest/meta-data/placement/availability-zone)
  public_ipv4=$(curl -s -f 169.254.169.254/latest/meta-data/public-ipv4)
  os=$(cat /etc/system-release)

  echo "------------------------------------------------------------------------------------"
  echo "OS: $os"
  echo "Instance-id: $instance_id"
  echo "Instance-Type: $instance_type"
  echo "Availability-Zone: $availability_zone"
  echo "Elastic-Ip: $public_ipv4"
  echo "------------------------------------------------------------------------------------"

fi
```

### AmazonLinux の場合
ファイル名は任意のもので Ok

```bash:/etc/update-motd.d/99.motd
#!/bin/bash

instance_id=$(curl -s 169.254.169.254 169.254.169.254/latest/meta-data/instance-id)
instance_type=$(curl -s 169.254.169.254 169.254.169.254/latest/meta-data/instance-type)
availability_zone=$(curl -s 169.254.169.254/latest/meta-data/placement/availability-zone)
public_ipv4=$(curl -s -f 169.254.169.254/latest/meta-data/public-ipv4)
os=$(cat /etc/system-release)

echo "------------------------------------------------------------------------------------"
echo "OS: $os"
echo "Instance-id: $instance_id"
echo "Instance-Type: $instance_type"
echo "Availability-Zone: $availability_zone"
echo "Elastic-Ip: $public_ipv4"
echo "------------------------------------------------------------------------------------"
```

↑を配置した後、下記のコマンドを実行すること

```bash
update-motd
```

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html
【登壇の告知】iOSDC2018に「iOSと（深層）強化学習  」というタイトルで登壇します

こんにちは、@yuky_azです。

2018年8/30-9/2に開催される[iOSDC2018](https://iosdc.jp/2018/)に「iOSと（深層）強化学習」というタイトルで登壇するので、こちらで告知させていただきます。
![iOSDC2018.001.png](https://qiita-image-store.s3.amazonaws.com/0/35297/48fbfa83-6054-2994-199a-856f6783cbc2.png)

登壇は8/31（金）の16:00から、30分間になります。会場はTrack Bです。
[2018/08/31 16:00〜 Track B レギュラートーク（30分）iOSと（深層）強化学習 iOSDC Japan 2018](https://fortee.jp/iosdc-japan-2018/proposal/dbd569d0-1894-45c6-89b0-f3f84e853998)

今回の発表にはテーマがあります。それは、
「**iOSに深層強化学習は実装できるのか？**」
です。

Appleが提供する機械学習フレームワークは、予測はできても学習はできません。
そのため、深層強化学習を実装するためには線形代数ライブラリを使って仕組みを1から構築する必要があります。

果たして、iOSにおける深層強化学習の実装は成功するのでしょうか？
結果を知りたい方は、ぜひ会場に足をお運びください。

本発表の構成は以下の通りです。

Sec. 1: 強化学習とは？
Sec. 2: Swiftで強化学習
Sec. 3: Accelerate Frameworkによるニューラルネットワーク
Sec. 4: Swiftで深層強化学習

強化学習の基礎の解説から始めて、Q学習、DQN(Deep Q-Network)、Accelerate Frameworkによるニューラルネットワーク の実装などを解説します。
会場には300人以上入るようなので、たくさんの方の来場をお待ちしております。

昨年の発表は[こちら](https://qiita.com/yuky_az/items/1ca9041e894a1cc81cfc)です。

P.S.
昨日、SBクリエイティブよりディープラーニングの本を出版しました📘。
[はじめてのディープラーニング -Pythonで学ぶニューラルネットワークとバックプロパゲーション-](https://sai-lab.co.jp/book/)
フレームワークを使わずに、畳み込みニューラルネットワークまで丁寧に解説する本です。
arduino ProMicroでAPDS9960ジェスチャー

#導入経緯
・APDS9960が3.3V駆動
・使い慣れてたArduino Leonardpが5V駆動
・「レベルシフタ噛ますならProMicro(3.3V)がいいよ」アドバイス

##使ったもの
・Pro Micro(3.3V)…leonardo互換らしい
・APDS9960センサーモジュール（秋月で600円）
・ブレッドボード

##ハード準備
・ProMicroに足つけてハンダ
・APDS9960に足つけて裏のプルアップR1,R2にもハンダ

##ソフト準備
・ArduinoIDE最新入れる
・IDEにProMicroアドオンインスコ、ProMicroドライバインスコ（不明モジュールからローカルフォルダ指定）
参考サイト[TomoSoft]（https://tomosoft.jp/design/?p=6494）
・IDEにAPDS9960ライブラリインスコ
参考サイト[プチモンテ](https://www.petitmonte.com/robot/howto_gesture_sensor.html)

##配線
・SDA,SCL、VCC,GND、LED繋いで、INTはわかんねえから5に繋いだ
・Arduinoスケッチも2→5に変えた（よくわかってない）

#動いた
・サンプルスケッチのシリアル吐きはIDEのシリアルモニタで見れた
・相対移動は強いイメージ。
・コンデンサも用意したけどよくわからず付けずとも動いたから付けなかった。

##反省
・回路もうちょっと分かるようになろう
テストの話

社内勉強会のメモ。全然まとまってないけど。

## 自動テスト
テストを作成することで永久に動作確認ができる

## TDD（テスト駆動）
テストの話になると出てくる概念。
「まずは動作確認をするべき」

### 問題点

- めんどくさい
- モチベーションが上がらない

「ではなぜモチベーションが上がらないのか？」

実装しているタイミングで永久に動く動作確認を作成することは不可能。
<= テストには「寿命」がある

∴実装しているタイミングでテストを頑張る必要はない

コードカバレッジ
=> 完璧にしていくと、疲弊していく

**ではどうするか？**

## BDD
「ふるまい」受け入れ仕様
コード全てに対してテストを書く必要はないが、モジュール単位での動作確認を作成するということは必要

全てにやるのではなく、仕様をかなえるために必要な箇所で要所要所取り入れていこう

### 例
API->parr、JSON
Page->html、parr
module->引数を与えた時にどういうreturnが帰ってくるのか（ユニットテストと近い関係）

## 理想と現実
コードカバレッジなどを考慮して完璧を目指すのではなく、BDDのように必要なぶんだけ作成することが現実的。

設計に比べて仕様はまだ安定的であるはず。
=> BDDは仕様に重点をおいているので比較的ラク

## phpでBDDするには？
behat/phpspe/codeception

なぜ仕様のテストをするだけなのに、独自のツールが必要なのか？？

### 受け入れテスト
テストと仕様を紐づける

## BDDのテストは仕様そのものなのではないか？

それならテストのコードは読みやすくなければいけない

## phpunitを使ったテスト
基本的に `assert` というのを使う。

- 期待するJSONが返ってくるか
- ステータスが返ってくるか

など

## behatなどを使うとどうなる？

shouldBeなど、英語など自然言語に近い書き方
（phpunitはプログラミングっぽい感じ）

「読みやすいコードを書く」というのがコンセプトとなっている

### 個人的には入らないと思う
読みやすさはなんとかしようぜ

## LaravelもBDDをサポートしている

https://laravel.com/docs/5.6/http-tests

## phpunitでどうすればみやすくかけるか？

- シナリオ
- なんども使うものはメソッドにしたりして工夫

など。
codeception等のドキュメントを見てみると参考になる。
「テストには3種類あるのか」など

- どういうテストを用意してあげたらいいのか
- どういう名前のテストを作れば良いのか

### E2E 
End to End
実際にブラウザを叩いて...

### バックエンドにおけるE2Eテスト
JSON、html
client <=> server 
※JSはまた全く別物の内容になる

# JSの世界でのE2Eテスト
codeとブラウザの話
JSの場合はブラウザで叩く必要がある

「〜のあとにAPIが飛ぶ」とかを試すならduskを使うといい
Jsdom...バーチャルDOMをつくる

## LaravelでtestUnitを作ってみよう

```
$this->assertTrue(true);
```

を最後の一文に追加して、いろんなモジュール検証のコードを書いてみよう。
テストの中が空っぽだとエラーになるので、この1ぶんだけ追加しておいてあげる。

assert関数はめちゃくちゃあるので、全てassertTrueを使い回すのがラク

```
$this->assertTrue(is_integer($price));
$this->assertTrue($price === 5200);
```

それかphp7以上なら、標準の `assert()` を使ってもいい

```
assert($price === 5200);
```

phpのassertはテストの時だけ動くようにする、みたいな設定ができる
（Herokuなんかは標準でOFFになっているはず）
<= バリデーションエラーなど、絶対にエラーを返さないといけないものなんかはassertではなくちゃんとコードで書くべき
UiPath勉強七回目


#excel操作(1)


UiPathでexcelを扱うためには専用のパッケージをインストールする必要があります。

インストールには「Manage Packages」という機能を使用します。

UiPathウインドウ左側のActivitiesペインの右上のボタンを押します。


![0.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/f75afc1c-58ba-762b-0802-aff22f32a694.png)

押すと、Manage Packagesというタイトルのウインドウが表示されます。

左側にある「Available」→「All」を選択した後、上部の検索欄に「excel」と入力します。検索を行うと「UiPath.Excel.Activities」というパッケージが表示されますので、「Install」ボタンを押します。


![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/4f3af0c2-3725-2ef4-2f0a-7e8802439de3.png)

しばらくするとパッケージのインストールが始まり、下記のようにチェックマークがついたらインストールは完了です。



![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/4fb9af6b-d1c4-bbff-4a48-62b343481e6d.png)

下記のようにActivitiesにexcelが追加され、以降はexcelに関する処理を行っていくことができます。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/5cf52d63-5563-ea9c-5793-366cd0453498.png)

次回はこの状態からexcelの処理を行ってみます。
vagrant使用時のPhpStorm PHPUnit設定

vagrant使用時にはリモートのインタプリタを設定する必要がある。

- ローカルでする場合、ローカルのphpの置き場所を書く必要がある
	- 置き場所は `type php` でチェック
	- `php is hashed (/usr/local/php5/bin/php)` と表示される
OracleのSQLをPostgeSQLのSQLにしてみる時に役立てたいリンク集

![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/ceba224c-6a6d-fe2f-956c-30639eb62ec6.png)
# そもそもOracleをあんまり使ったことがない
- [PostgreSQLとOracleの仕様の相異](http://interdbconnect.sourceforge.net/oracle_fdw/difference-ja.html)
- [Oracle独自の書き方で外部結合する際の注意点 - Qiita](https://qiita.com/naotarou/items/aa78ae725d128b6e5a12)

# 今現在を表したい
```sql
-- Oracle
SYSDATE;
SYSTIMESTAMP;

-- PostgreSQL
CURRENT_DATE;
CURRENT_TIMESTAMP;

/*
 * SYSDATE >> current_date
 */
-- Oracle
select sysdate from dual;
-- PostgreSQL
select current_date;
```

# 文字列を結合したい(連結演算子というもの)
```sql
-- Oracle：連結演算子
SELECT 'Name is ' || last_name FROM employees ORDER BY last_name;

-- PostgreSQL：連結演算子というかは不明だが同じものがある
SELECT 'Name is ' || last_name FROM employees ORDER BY last_name;
```
- [Oracle：連結演算子](https://docs.oracle.com/cd/E60665_01/db112/SQLRF/operators003.htm)
- [PostgreSQL：文字列関数と演算子](https://www.postgresql.jp/document/9.3/html/functions-string.html)


# 関数
```sql
/*
 * DECODE >>> CASE
 */
-- Oracle
DECODE('判定する値', 1, '1だった時の値', 2, '2だった時の値', '1でも2でもない場合')

-- Postgresql:DECODE関数は違う意味の関数としてPostgeSQLにもあるので注意
CASE '判定する値' WHEN 1 THEN '1だった時の値' WHEN 2 THEN '2だった時の値' ELSE '1でも2でもない場合' END

/*
 * NVL >>> COALESCE
 */
-- Oracle
NVL('nullかもしれない値', 'nullだった時の値')
NVL2('nullかもしれない値', 'nullじゃなかった時の値', 'nullだった時の値')

-- Postgresql
COALESCE('nullかもしれない値', 'nullだった時の値')
```
- [PostgreSQLでDecode?: つれづれネット散歩](http://kashi.way-nifty.com/jalan/2014/04/postgresqldecod.html)
- [PostgreSQLにおけるNVL関数の代替手段: つれづれネット散歩](http://kashi.way-nifty.com/jalan/2014/03/postgresqlnvl-8.html)

# 明示的な行ロック
```sql
/*
 * PstgreSQL
 */
-- トランザクションが終わるまで、他のトランザクションがロック、変更、削除できない
SELECT 〜 WHERE ... FOR UPDATE;
-- 同じ行のロックを獲得しようとするSELECT FOR KEY SHAREコマンドをブロックしないFOR UPDATE
SELECT 〜 WHERE ... FOR NO KEY UPDATE;
-- 排他ロックではなく共有ロックを獲得する
SELECT 〜 WHERE ... FOR SHARE;
-- SELECT FOR UPDATEはブロックされるが、SELECT FOR NO KEY UPDATEはブロックされないFOR SHARE
SELECT 〜 WHERE ... FOR KEY SHARE;

/*
 * Oracle
 */
-- SELECT対象の全ての表のレコードをロック
SELECT 〜 WHERE ... FOR UPDATE;
-- 表を結合する場合に使用。行ロックする表を指定
SELECT 〜 WHERE ... FOR UPDATE OF 行ロックする表.列名 [,column_name2...];
-- 対象レコードにロックがかかっていた時に、ロックが開放されるまで待つ
SELECT 〜 WHERE ... FOR UPDATE WAIT [待ち時間]
-- 対象レコードにロックがかかっていた時に、開放を待たずに下記エラーで復帰
SELECT 〜 WHERE ... FOR UPDATE NOWAIT;
```
- [PostgreSQLの行レベルロックについて - Tihiroの頭を休めるIT教室](http://tihiro.hatenablog.com/entry/2017/08/10/045238)
- [13.3.2. 行レベルロック](https://www.postgresql.jp/document/9.6/html/explicit-locking.html#locking-rows)
- [SELECT FOR UPDATE - オラクル・Oracle SQL 入門](https://www.shift-the-oracle.com/sql/select-for-update.html)
- [ＯＲＡＣＬＥ／オラクルＳＱＬリファレンス（SELECT～FOR UPDATE）](http://oracle.se-free.com/dml/10_forupdate.html)
アジャイル開発についてざっくり

社内でざっくりとだけ教えてもらったのでメモ

## アジャイル開発とは？
ぐるぐる回して開発する方法。
とはいえ、何をどういうタイミングでぐるぐる回すのか？がポイント

- 週次スプリント（weekly）
- イテレート

週次イテレートということもあるらしい。
スプリントごとにお客さんからのFBをもらい、随時修正や仕様の変更に対応できることが特徴。
一方のウォーターフォールだと、お客さんに確認してもらうのは最終段階なので仕様変更に柔軟に対応できない。

## スプリント
1単位（1週間）の単位を「スプリント」という。
スプリントの最後には「リリース」を行って「実装」ではなく「実現」してお客さんに成果を見せることが大切。
1スプリントが終わるときには、お客さんに対するQA（質問、確認事項）等をあげておき、次のスプリントに入ってる間に前のスプリント分のQAをお客さんにチェック＆回答しておいてもらうとよい。

## カンバン
プロジェクトメンバー内での週次ミーティングは可能だが、お客さんとの週次ミーティングはプロジェクトによっては不可能なので、その場合はオンラインやチャットツール等を用いてFBをもらうようにする。

1週間ごとのスプリントをまとめるものを通常「カンバン」と呼び、GitHubプロジェクトやTrelloなどを使うと良い。