OmniAICreator/Qiita-1.07M huggingface dataset:
a

from collections import deque

n = int(input())
commands = [input() for _ in range(n)] # splitとかしてると間に合わない

l = deque()
for com in commands:
    if com[0]=='i':
        l.appendleft(com[7:])
    elif com[6]=='F':
        l.popleft()
    elif com[6]=='L':
        l.pop()
    else:
        l.remove(com[7:])

s = ' '.join(l)
print(s)
Swift：一つのオブジェクトに対して複数の場所でdelegate渡すのは危険

# はじめに
メモリリークの勉強中，自分のアプリでミスが見つかったので備忘録．

# 例
macOSアプリだと`WindowController`を管理しないといけないのですが，`NSWindow`周りのイベントを扱うために`NSWindowDelegate`を使います．何も考えずに必要なところで処理を行うために`WindowController`と`ViewController`の両方にDelegateを継承してウィンドウのイベントを取得していたのですが，そのせいでウィンドウを閉じても`deinit`されない現象が起きていたことに気づきました．

```swift:WindowControllerサイド
import Cocoa

class WC: NSWindowController, NSWindowDelegate {

    override func windowDidLoad() {
        super.windowDidLoad()
        self.window!.delegate = self
    }
    
    func windowWillClose(_ notification: Notification) {
        self.contentViewController = nil
    }

}
```

```swift:ViewControllerサイド
import Cocoa

class VC: NSViewController, NSWindowDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear() {
        self.view.window!.delegate = self
    }

    func windowDidResize(_ notification: Notification) {
        // リサイズ時の処理
    } 

    deinit {
        Swift.print("deinit したよ") // <- 呼ばれない
    }

}
```

# 所感
職業エンジニアの方なら常識的なことかもしれませんが，独学の学生エンジニアだと動けばいい（まずは動くところまで実装するのでやっと）という感じでえいやっと実装しているのでなかなかこういう大切なことが学べていません...
C言語から入った人なので一応メモリに対する意識はごくわずかでもあるのが救いですね．
Android Unit Test

# はじめに
Androidアプリ開発でUnit Test書いていますか？
僕はつい最近Unit Testを書き始めました。
その時に得た知見をまとめます。

- Kotlin 1.3.31
- Mockito-Kotlin 2.1.0
- Assertj 3.11.1
- Robolectric 4.2

```app/build.gradle
// ...

dependencies {
    // ...

    // Mockito-Kotlin
    testImplementation 'com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0'

    // Assertj
    testImplementation 'org.assertj:assertj-core:3.11.1'

    // Robolectric
    testImplementation 'org.robolectric:robolectric:4.2'

    // AndroidX
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
}
```

# Unit Testの作成方法と実行
## 作成方法
1. Android Studioでテストを作成したいクラスで`Command+Shift+T`
2. `Create New Test...`を押下
3. 必要に応じて、テスト実行前に実行するメソッド`setUp/@Before`とテスト実行後に実行するメソッド`tearDown/@After`にチェック
<img width="563" alt="スクリーンショット 2019-06-01 23.38.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/a815668f-ea9d-13a4-316f-f2810859755d.png">

4. テスト対象のメソッドにチェック(上記の画像)
5. `/app/src/test`を選択
(今回はUnit Testなので`/app/src/test`を選択しましたが、UI Testの場合は`/app/src/androidTest`を選択します)

## 実行
緑の再生ボタンを押すとclass単位 or メソッド単位でテストを実行できます。
<img width="146" alt="スクリーンショット 2019-06-02 1.07.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/5a5b4c7a-cf8f-6e59-25df-f4ff3d1bf018.png">

# Robolectricを用いたUnit Test
Androidのフレームワークに依存したコードのテストをする場合にRobolectricを用いてJVM上でシュミレートすることによりテストします。
実装例(クリップボードに文字列をコピーするメソッドのテスト)がこちらです。
この例ではAndroidXのInstrumentationRegistryを使ってcontextのインスタンスを作成しています。

```kotlin:UtilTest.kt
@RunWith(RobolectricTestRunner::class)
class UtilTest {

    @Test
    fun clipBoardCopy() {
        val context = InstrumentationRegistry.getInstrumentation().context
        Util.clipBoardCopy(context, "clip_test")
        val clipboardManager: ClipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
        val clipText = clipboardManager.text
        assertThat(clipText).isEqualTo("clip_test")
    }
}
```
また、Configアノテーションを使ってエミュレートするSDKのバージョンを指定できたりするので、詳しく知りたい方は[Robolectric](http://robolectric.org/)を見てください。

# Assertjでアサーション
Assertjを使ってアサーションを書くと、メソッドチェーンで書けます。
文字列や数値など、いろんな種類のアサーションが用意されているので便利です。
実装例がこちらです。

```kotlin
assertThat("Kotlin")
    .isNotBlank()
    .contains("ot")
    .isEqualTo("Kotlin")
```

# Mockito-Kotlinでモック作成
モックを使ってテストを書く際に、Mockitoというライブラリを使って書きました。
Kotlin仕様に拡張されている`Mockito-Kotlin`を使います。
実装例がこちらです。

```kotlin:UtilTest.kt
@RunWith(RobolectricTestRunner::class)
class UtilTest {

    @Test
    fun isNetConnection() {
        val networkInfo: NetworkInfo = mock(name = "NetworkInfo")
        whenever(networkInfo.isConnected).thenReturn(true)

        val connectivityManager: ConnectivityManager = mock(name = "ConnectivityManager")
        whenever(connectivityManager.activeNetworkInfo).thenReturn(networkInfo)

        val context: Context = mock(name = "Context")
        whenever(context.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(connectivityManager)

        assertThat(Util.isNetConnection(context)).isTrue()
    }
}
```

# 最後に
今回はUnit Testに関する知見をまとめました。
CI/CDでのテスト実行までを目標としています。
今はUI Testを書いている最中なので、またまとめようと思います。
GMT5で任意の直線を引いて震源断面図を作る(備忘録)


##はじめに
**このページに書いてあるスクリプトは未完成です。**
GMT5について少しでも噛んでいる方に読んでいただいて、おかしい所を指摘していただけると大変助かります。


#本題
地図全体の震源断面図を作るのは簡単で`awk`でごにょごにょして`psbasemap` `pscoast` `psxy`でどうにかすればいい。
~~自分はポンコツなのでエレガントには書けないが。~~
⇒じゃあ、任意の直線を引いてその線の震源断面図を書くにはどうすればよいか。

##Projectコマンド
公式マニュアル曰く、`project`を使いなさいとのこと。
http://gmt.soest.hawaii.edu/doc/5.4.5/project.html

>project - Project table data onto lines or great circles, generate tracks, or translate coordinates

GMT4版ではあるが日本語に訳していただいたサイトを見てみると
>project は任意の (x, y[, z]) データを標準入力[又は infile ]から読み込ん で (x, y, z, p, q, r, s) の任意の組合せを標準出力に書き出す。ここで (p, q) は投影された座標、 (r, s) は (x, y) 座標系における位置で、プロファイ ル (q = 0 の経路) は (x, y) に最も近い位置になり、 z は入力された残り全 ての列である(必要な x と y の列以外)。代わりに、 project はプロファイル に沿った (r, s, p) を等しい間隔 dist で作成することもできる。
http://gmt.shin-gen.jp/GMT4.1.4/project.html

らしい。ざっくりと言うと以下の通り。

+ 投影法は次の 3 つのうちの任意の( ただし単独の) 1 つで定義される。
    + 定義1. 中心 `−C` と北から時計回りの方位角 `-A` 。
    + 定義2. 投影経路の始点`−C` と終点`−E`。
    + 定義3. 中心`−C`と 回転極の位置`−T`。

どうやらこの3つのうちの1つを使いなさいよってことらしい。今回は直線断面図なので定義2を使う。
(他の定義を誰かやってくださると助かります)

>データは`−L`及び`−W`オプションを用いて選択的にある範囲だけを取り出すことができる。`−W`を使うと、投影される幅は`w_min`<`q`<`w_max`の範囲内だけになる。`−L`を設定すると、長さが`l_min`<`p`<`l_max`の範囲内の点だけを使うように設定される。`−E`オプションが投影法の定義に使われているときは、`−Lw`を選ぶと投影範囲はちょうどOからBまでの範囲になる。

つまり、本来は`-L`を使って長さを指定しなければいけないが、`-Lw`にすれば始点から終点まで読み込むということっぽい…？
##結果と課題
というわけで何となく作ってみた。`-W`の使い方がよく分からない…。
もっとエレガントな書き方があると思います。ColorPalletなどはご自由に。

```shell:danmen.sh
#!/bin/bash
output='out.ps'
year='2016'
makecpt -Cseis.cpt -T0/160/10 -Z > depth.cpt

gmt psbasemap -R134/138/33/36 -Jm3.5 -Ba1f0.5g1WSen -X3 -Y16 -Lf137.5/33.2/25/50 -P -K -V > ${output}

gmt pscoast -R -J -Df -W1 -G165/165/165 -K -O -V >> ${output}

#直線を引く始点と終点の設定
lon1='134'
lon2='138'
lat1='33'
lat2='35.5'

#ここら辺最高に無駄な気がする
awk '{printf $1" "$2"\n"}' << END > lonlat.dat
${lon1} ${lat1}
${lon2} ${lat2}
END

#図に直線を引く
gmt psxy lonlat.dat -R -J -W1,red -K -O -V >> ${output}

#気象庁の震源レコードから経度・緯度・深さを抽出
#awkじゃなくても「経度 緯度 深さ」の順番になっているデータを置けば大丈夫なはず
awk '{print $11" "$9" "$13}' h${year}.hypo | \
gmt psxy -Cdepth.cpt -R -J -h1 -Sc0.045 -K -O -V >> ${output}

#地図の下に書く断面図作成
gmt psbasemap -R0/500/0/140 -JX14c/-5c -Bxa100f50g100+l"distance(km)" -Bya20f10g20+l"depth(km)" -BWSen -X0 -Y-7 -P -K -O -V >> ${output}

#気象庁の震源レコードから再度抽出し直線付近の震源のみを絞り込む
#-Wオプションあたりで地震数が決まったりしているので、今度詳しく調べないといけない
awk '{print $11" "$9" "$13}' h${year}.hypo > temp0.dat
gmt project temp0.dat -C${lon1}/${lat1} -E${lon2}/${lat2} -W-30/30 -Lw -Q -V > temp1.dat

#断面図に書き込み
awk '{print $4" "$3" "$3}' temp1.dat | \
gmt psxy -Cdepth.cpt -R -J -Sc0.06 -K -O -V >> ${output}

#ここらへん自分でも怪しい
gmt psscale -Dx15/10/-5/0.2 -Jm -R134/138/33/36 -Cdepth.cpt -By20+l"Depth[km]" -O -V >> ${output}

#いらないやつを削除
rm temp* lonlat.dat depth.cpt

```
この結果が、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428354/7ea15eb5-dc5b-4f92-c995-bfe8bf59a50c.jpeg"width=50%>
になった。線が赤くなってしまって震源と被ってるが一応書けたは書けたので満足。

##(既知の問題点)


+ 横軸の距離がおかしい



##今後の課題

+ `-W`とは
+ distanceの長さの一致
+ てかこれ本当に震源断面図があってるのか

⇒詳しい方がいたらご教授願えると幸いです。

---
>GMT（Generic Mapping Tool; Wessel, P. and W. H. F. Smith, New, improved version of Generic Mapping Tools released, EOS Trans. Amer. Geophys. U., Vol. 79 (47), pp. 579, 1998）
URIを理解する

## URIとは何か？
URIはweb上に存在する情報(webサイト、画像、動画などなど)がどこにあるのかを一意に示したものです。URIはUniform Resource Identifierの略で直訳だと「統一リソース識別子」といい、「リソース(情報)を統一的に識別するためのID」と言えるものでしょう。一定のルールでたくさんあるリソースを他のリソースと区別するための一意なIDもしくは名前のことです。URIを使うからこそweb上で膨大な量のリソース中から欲しいリソースを見つけることができるのです。

## URIってURLとはどう違うの？
URIとURLは同じものではありません。URIという大きな集合の中にURLが存在し、同様にURNというものも存在しています。

### URI
web上でリソースを識別するためのルールの総称。リソースの場所や名前をどう書いて表すのかのルールがURIという名前。

### URL
URLとはweb上でのリソースの住所の書き方ルールのこと。web上でwebページや画像などを取得する際の場所と取得方法が書いてある。下記はURLを構成する基本的な例です。(ポート番号は基本書かないけど。。。)

```
http://www.example.com:80/user/1
```

上記のURLを構成するパーツは次のようになります。

- http :スキーム
- www :ホスト
- example.com :ドメイン
- 80 :ポート番号
- /user/1 :パス

### スキーム
利用するプロトコルを指定しています。今回の場合欲しいリソースにHTTPでアクセスできることが示されています。

### ホスト
ネットワーク上のコンピュータにつける識別用の文字列。ドメインとは「.」で区切られている。

### ドメイン
ネットワークを特定するための文字列。ホストとは「.」で区切られている。

### ポート番号
接続先のサーバーのポート番号を示している。通常は省略されている。ポート番号とはサーバーが提供しているサービスがどれかを番号で表したもの。

### パス
接続したサーバーのディレクトリやファイル名を示している。

このように、インターネット上で必ず一意となるホストとドメインの仕組みと一意にあんる階層的なパスを組み合わせることで、あるリソースのURIが世界中のどのURIとも被らないようになっている。

## URN
web上でリソースを名前で永続的に識別するためのもの。URLがリソースの場所を表しているのに対し、URNはリソースの名前を表している。
Swift：NSColorPanelをつかってユーザに色変更のUIを簡単に提供

## よくあるこういうやつを出現させる方法

![スクリーンショット 2019-06-02 1.22.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/b8a37751-f0f0-502b-abed-b0f8fcba79f5.png)



```swift
let cp = NSColorPanel.shared
cp.setTarget(self)
cp.setAction(#selector(colorDidChange(_:)))
cp.color = NSColor.red //デフォルトで設定しておきたい色
cp.isContinuous = true //ユーザのアクションに対して連続的に色を変更したい時
cp.makeKeyAndOrderFront(nil)


@objc func colorDidChange(_ sender: NSColorPanel) {
    Swift.print(sender.color)
    // 色を変更した時の処理
}
```

超便利
競技プログラミングをPythonでやろうとしたきっかけ


#0.Atcoder
Atcoderは日本初のプログラミングコンテスト運営会社です。色々な難易度の問題があるため、初心者でも中級者の方でも
最近では、ソフトウェアエンジニアの採用をしたりと色々な企業が参加していきます。
また、Atcoder jobsという就職サービスというのもある。
#1.Python3
Pythonは今もっともメジャーなIoTやAIなどいった分野で使われている言語だ。
Pythonはオフサイドルールというものがあり、プログラミングを綺麗に書き、読み手に見やすくするためのルールである。
Pythonはライブラリが豊富であり、組み込み関数などあり、初心者の私でもとても入りやすい言語でした。

#2.AtcoderとPython3の関係
私が機械学習などに興味があったため、PythonでAtcoderを始めることにしました。
しかし、Atcoderは競技プログラミングなのでメジャーなのはC++がほとんどだと思います。



#3.最後
今回は初めての投稿であり私の知識不足なためここまでしか書けないが、今後知識をつけ、投稿回数を増やしていきたいと思います。
Pythonの参考サイトやAtcoderなどを教えていただける嬉しいです
Unityの重力加速度を変更

メニュー`Edit`->`Project Settings`->`Physics`の`Gravity`の`Y`を変更する。
デフォルトでは-9.81になっているので、すばやく落下させたいときは大きく、ゆっくりさせたいときは小さくする。

![スクリーンショット_2019-06-02_1_20_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94929/70cafd15-a7c1-31fc-c226-41076a25af34.png)
Taylor展開の証明

これが一番楽だと思います（多分）

##証明

　ある点$t$において関数$f(t)$の値が分かっている時、$f(t+dt)$の近似値を得ることを考える。$C_0, C_1, C_2, \cdots$を任意の係数として、$f(t+dt)$を$dt$の多項式で表現すると、次のように書ける。

```math
f(t+dt)  =  C_0 +C_1 dt +C_2 (dt)^2 +\cdots +C_k (dt)^k +\cdots  \tag{1}
```

　以降、係数を$C_0$から順に求めていく。$dt=0$とすると、直ちに次が分かる。

```math
  C_0 = f(t)
```

　続けて$C_1$を求めるには、まず式（1）を微分する。

```math
  f'(t+dt)  =  C_1 +2C_2 dt +3C_3 (dt)^2 +\cdots +kC_k (dt)^{(k-1)} +\cdots  \tag{2}
```

　ここで$dt=0$とすれば、直ちに次が分かる。

```math
  C_1 = f'(t)
```

　さらに式（2）を微分し、$dt=0$とすると、次が分かる。

```math
  C_2 = \frac{f''(t)}{2}
```

　以降も同様の方法で計算すると、係数を次々と求めることができる。

```math
  C_3 = \frac{f^{(3)} (t)}{2 \cdot 3}
  \\
  C_4 = \frac{f^{(4)} (t)}{2 \cdot 3 \cdot 4}
```

　すると$f(t+dt)$は、最終的に次のように書ける。

```math
  f(t+dt)  =  f(t)  +f'(t) dt  +\frac{f''(t)}{2!} (dt)^2  +\cdots  +\frac{f^{(k)} (t)}{k!} (dt)^k  +\cdots
```

　まとめて書けば、次のようになる。

```math
  f(t+dt)  =  \sum_{k=0}^{\infty}  \frac{f^{(k)} (t)}{k!} (dt)^k
```

　これを、Taylor級数の式という。また、関数$f(t)$からTaylor級数を得ることを、Taylor展開という。
pandasのto_sqlでトランザクションを実装する方法

`to_sql()`は`DataFrame`をデータベースに登録するために使われますが、トランザクションを実装するためには少し工夫が必要です。
本稿では、ORMモジュールであるSQLAlchemyを使って`to_sql()`でトランザクションを実装する方法を紹介します。

# 前提
- Python : 3.6
- sqlalchemy : 1.3.3
- psycopg2-binary : 2.8.2
- postgreSQL : 10.4

# DB接続
DB接続情報を記載した`db_config.ini`ファイルを作成し、実行スクリプトディレクトリに格納します。

```db_config.ini
[db]
database = postgresql
host = localhost
port = 5432
dbname = ********
schema = ********
user = ********
password = ********
```
engineオブジェクトを生成します。

```python
from sqlalchemy import create_engine
database, user, password, host, dbname = \
    self.db_conf.get('db', 'database'), \
    self.db_conf.get('db', 'user'), \
    self.db_conf.get('db', 'password'), \
    self.db_conf.get('db', 'host'), \
    self.db_conf.get('db', 'dbname')
url = f'{database}://{user}:{password}@{host}/{dbname}'
engine = create_engine(url, use_batch_mode=True)
engine.connect().connection
```

# トランザクション実装
`engine.begin()`によりトランザクションを実装できます。
`with`内の処理に成功した場合は`autocommit`されますが、途中で`Exception`を吐いた場合は`rollback`されます。

```python
from sqlalchemy.exc import IntegrityError

# DBへの登録処理
# 処理に失敗した場合はロールバックされる
try:
    with engine.begin() as conn:
        # DBへの登録処理①
        dataframe_1.to_sql(
            'tbl_1', conn, if_exists='append', index=False
        )
        logging.info(f'inserted {len(dataframe_1)} rows to tbl_1.')
        # DBへの登録処理②
        dataframe_2.to_sql(
            'tbl_2', conn, if_exists='append', index=False
        )
        logging.info(f'inserted {len(dataframe_2)} rows to tbl_2.')

except IntegrityError as e:
	logging.error(f'{e}')
	logging.error('failed to insert.')
	logging.error('executed rollback.')
	sys.exit(1)
```
勘違いしやすいコマンドつなぎ(制御演算子とか)

どうも、Qiita初投稿です。
ブログとか含めて全く慣れていないので見づらいところはご勘弁を
そしてどちらかというと未だにシェルスクリプトですら慣れていないので、自分用の備忘録というのが一番

# Linuxのコマンドつなぎについて
もともと簡単なシェルスクリプトとかなら書いたりしていて気にしていなかったのですが、最近仕事でよく作業手順書を書くことが増えてきました。
その際にコピペ用にワンライナーでコマンドを書くことが多いです。そうなってくると必ずいろんなコマンドを繋いでいく必要があるのでその際によく利用するようになりました。

## こんな種類があるよ
*CommandA <コマンド繫ぎ記号> CommandB*

| 記号 |       名前             |    意味    |
|:-----|:----------------------|:------------------|
| ;    | セミコロン              |CommandAの実行後にCommandBを実行する|
| &    | アンパサント            |CommandAと同時にCommandBを実行する|
| &#124; | パイプ                 |CommandAの実行結果をCommandBに渡す       |
| &&            | アンパサントアンパサント |CommandAの実行が成功した際にCommandBを実行する|
| &#124;&#124;  | パイプパイプ    |CommandAの実行が失敗した際にCommandBを実行する|

基本的に";"、"&"、"|"に関しては特に気にすること無く使えるかと
"&"使っている人見たことないですが

## "&&"、"||"の制御演算子の挙動

昨日仕事でこの存在を思い出し使ってみて、ちょっとしたところでif文の代わり等で使えて便利！
もうif文は使わないぞ――と思ってみたらでかい罠がありました。

詳しくはこちら
https://qiita.com/miyu/items/f467c3fd693b5a8d5472

つまりは
"&&"と"||"を混ぜて3つのコマンドを繋げると危ない

【例】CommandAが成功したらCommandBを実行して、失敗したらCommandCを実行したい
*CommandA && Command B || CommandC* とやると

| CommandA | CommandB | ComnmandC |
|----------|----------|-----------|
| 成功     | 成功      |実行無し    |
| 失敗     | 実行無し  |実行する    |
| 成功     | 失敗      |実行する    |

一番下のパターンが起こると困るってことですね。CommandBで終了コードが0以外だとCommandCが実行される状況になってしまうので。
こんなパターンはif文を正しく使いましょうということか、もしくはワンライナー諦めて2行で書くとか

ノリと勢いで何がなんでもif文使わず制御演算子だけでFizzBuzzやってやるぜって考えたけど結局以下になる。

```
for i in {1..100}
do 
    [ $(( ${i} % 3 )) -eq 0 ] && [ $(( ${i} % 5 )) -ne 0 ] && echo "Fizz"
    [ $(( ${i} % 5 )) -eq 0 ] && [ $(( ${i} % 3 )) -ne 0 ] && echo "Buzz"
    [ $(( ${i} % 3 )) -eq 0 ] && [ $(( ${i} % 5 )) -eq 0 ] && echo "FizzBuzz"
    [ $(( ${i} % 3 )) -ne 0 ] && [ $(( ${i} % 5 )) -ne 0 ] && echo "${i}"
done
```
"&&"だけを使って全てのパターンを書き出すというね。
途中で"||"使おうとしたけど難しすぎた…うまいやり方知っている方は教えてください。

## 2019/6/3追記
[angel_p_57](https://qiita.com/angel_p_57)さんのコメントからFizzBuzz作り直しました。
これでほとんど制御演算子メインで作れた感じ

```
for i in {1..100}
do 
    MSG=""
    [ $(( ${i} % 3 )) -eq 0 ] && MSG="Fizz" ||
        { [ $(( ${i} % 5 )) -eq 0 ] && MSG="Buzz" || MSG=${i}; false;} &&
        [ $(( ${i} % 5 )) -eq 0 ] && MSG=$MSG"Buzz"
    echo $MSG
done
```
よくまぁ動いてますわ…

```
[ $(( ${i} % 5 )) -eq 0 ]
```
が冗長なのがイケてないっちゃないですね。
まぁ思ってた以上に動いてくれてそれなりに満足した。
とあるRailsエンジニアのリモートワークトライアル 2019-06-01 on Twitter

# とあるRailsエンジニアのリモートワークトライアル 2019-05-31 on Twitter
 [*](https://twitter.com/YumaInaura/status/1134478445436690432")
<https://github.com/YumaInaura/YumaInaura/issues/2100>
# とあるRailsエンジニアのリモートワークトライアル 2019-05-31 on Twitter [ポエム] on @Qiita
 [*](https://twitter.com/YumaInaura/status/1134494378100060160")
<https://qiita.com/YumaInaura/items/8f531353513617b7da30>
# グアムで仕事したら生産性何倍アップするんだろ？
 [*](https://twitter.com/YumaInaura/status/1134603848952102913")

# 脳に親しみのあるエンジニア諸君。

 [*](https://twitter.com/YumaInaura/status/1134610266434392064")

# もしあなたの仕事が陸上競技なら今あなたは何メートル走に参加していて今どの地点にいるの？
 [*](https://twitter.com/YumaInaura/status/1134613036042375168")

# 仮眠が仕事になるなんて言ったら2019年頃には笑い者になっていたことでしょう。

 [*](https://twitter.com/YumaInaura/status/1134631208468434944")

# 仕事で評価されるとどうなるか？難易度の高い仕事が回ってきます。

 [*](https://twitter.com/YumaInaura/status/1134656060667490304")

# プログラミング用語 三国志
 [*](https://twitter.com/YumaInaura/status/1134657708328546304")
[@zispuga87l6lk8z](https://twitter.com/zispuga87l6lk8z/)

>Python・Ruby・JSと勉強して、
>思った事は、
>できる事の基本は変わらない。
>ならなんで名前統一しないの？
>ハッシュとか・配列とか・リストとか…
>私はまだまだ…真理には到達できないみたいです
# 人間関係は圧倒的な善意が大事だと思うけどそれでも周りにコスト感をかけてしっぺ返しを食らった過去。
まずは着実に仕事ができることが大事です。
 [*](https://twitter.com/YumaInaura/status/1134659479943802881")

# プログラミング初学者が精神と時の部屋に入りたいという気持ちがものすごく良くわかる暖かい土曜日。

 [*](https://twitter.com/YumaInaura/status/1134692269594894338")

# 満足のゆくお金さえもらっていれば難易度の高い仕事はやりごたえのあるゲームになる。
これはAND条件である。繰り返しつぐ、これはAND条件である。
 [*](https://twitter.com/YumaInaura/status/1134693819771842561")

# スマホゲーで負けるだけで自尊心が揺らぐのにこれが仕事ともなれば言うまでもない。

 [*](https://twitter.com/YumaInaura/status/1134695034194808832")

# 忙しい仕事の中で斧を磨き自分の心理的問題を解決する贅沢などとても許されないという罪悪感があるが逆に難易度の高い業務に遭遇でもしなければ永遠に斧を磨くチャンスなど現れないのでは？
 [*](https://twitter.com/YumaInaura/status/1134701618782302208")

# 自分がプログラマだというアイデンティティやフレーミングはアプリケーションの設計段階では邪魔にならないだろうか？ハッカーと画家よ。

 [*](https://twitter.com/YumaInaura/status/1134712081704337408")

# 分かった。
お金は仕事の目的というより、仕事を頑張るためのトリガーだ。
 [*](https://twitter.com/YumaInaura/status/1134713730355253248")
[@yumainaura](https://twitter.com/yumainaura/)

>満足のゆくお金さえもらっていれば難易度の高い仕事はやりごたえのあるゲームになる。これはAND条件である。繰り返しつぐ、これはAND条件である。
# エンジニアの皆さん。

 [*](https://twitter.com/YumaInaura/status/1134732209183645696")
[@oshimakaoru](https://twitter.com/oshimakaoru/)

>AV業界にいたとき男優さんに「できないプレイの欄って全部できるって言ったほうが仕事もらえるんですか？」って相談したら「いいや、自分を安売りして得られる仕事は2〜3件あるかもしれないけど、安売りして失う仕事は無数にあるよ」って教えてもらって、これ全ての仕事に言えることだなって今も思う。
# 朝は集中力をたくさん要求される業務やプログラミングをこなして夕方は哲学や心理学的な読書に費やすのがよろしいかな。
朝と夕方と夜の使い分けは非常に重要。遊んでいる暇はないが遊ばないと前に進めないんだぜ。
 [*](https://twitter.com/YumaInaura/status/1134741518378422272")

# エンジニアの皆さん。
  2019-06-01 on Twitter
 [*](https://twitter.com/YumaInaura/status/1134793028609236993")
<https://github.com/YumaInaura/YumaInaura/issues/2111>



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2114








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
矢印キーのためにホームポジション崩すのはもうやめよ...。矢印キーをFPS風の配置にしてみた。

矢印キーを押すときだけホームポジション外れちゃうのがいつも気になっていました。
(完全にHHKBに影響受けてるけど、貧乏でそんなリッチなキーボード買えない😇)
貧乏で現状維持のキーボードでもなんかいい方法絶対あるはず！と思って調査してまいりました🤗

## 最高の矢印キーの配置とは🤔
以下の条件満たすのは結構さいこうじゃないですかね？

- なんかやったことある配置
- 直感でも操作できる配置
- ホームポジションがほぼずれない。

以上を満たす条件は、FPSのWASD[W=↑, A=←, S=↓, D=→]の配置しかないと思いました。

そこで考えたのがFPS風のキータッチ(左Shift + WASD)

早速、キーバインドをFPSにするために調査の旅に出かけました...。

## [Karabiner🔥](https://pqrs.org/osx/karabiner/)
調査から數十分...
探すと以下のサイトにたどり着きました。
[Karabiner](https://pqrs.org/osx/karabiner/)

でもこのアプリ、ファンクションキーを左シフトなどに変えるレベルしかできんやーん...。
...と、思っていましたが、[Complex Modifications]というタブがあって、訳も分からずImportボタンを押すとWEBサイトに飛ばされ意味わからなかったのですが、どうやら誰かが作った複雑なキーボードの対応表をインポートできるらしい。

そこで見つけたのがこれです！！！！
![スクリーンショット 2019-06-02 0.05.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415529/933c009a-48bd-8b93-d820-5aa35aea6c05.png)

まさに欲しかったものが提供されていました。
とりあえず[fn + W/A/S/D to Arrow Keys]をインポートしてきました。

このままだとファンクションキー使わないといけないのですがMacユーザー的にはファンクションキーの配置は超絶押しにくい！(JISの配置なんで自分だけかも...😭)

右Shiftでも左ShiftでもControlでもなんでもいいんですが割とCUI使うんでMacユーザーだけどControl + Dとか結構使うのと、右シフト普段使ってるので左シフトを犠牲にしました☺️

## 左シフトにファンクションを割り当ててみる

左シフトにファンクションを割り当てるのは超簡単ですよ。

<img width="1008" alt="スクリーンショット 2019-06-02 0.05.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415529/5c95918c-26ed-259a-1197-0fc6e9c276df.png">

ほらね、これだけで終わりです😆！

もしVimmerであれば、「hjkl」も結構アリかもしれませんね！

以上です。

Happy Hacking!!
n変数関数の特徴量選択の手法 ~ Functional-Anova ~

# はじめに
機械学習のパラメータ初期設定に多数のパラメータが存在したり，データ解析の場で大量の変数が存在する場合にどの変数がどの程度性能に影響を及ぼすか知ることは非常に重要である．一般に機械学習の世界では実際に重要なパラメータの数はさほど多くないと言われており，2011年の[James Bergstraの論文](http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf)で *low effective dimensionality* という概念が提示されている．今回の記事ではその *low effective dimensionality* への対応策の一つとして，分散分析の一種であり，n変数関数に対応している[Functional-Anova](http://proceedings.mlr.press/v32/hutter14.html)の説明をしたいと思う．

# Functional-Anova
## Anova(分散分析)とは

$n$変数関数の内，$m$ 変数 ( $m < n$ )が変動する際に関数の値がどの程度変動するか分析するもの．

## 変数設定

変数は以下のように規定される．

```math
\begin{align}
N \in R^n ：& f(\theta) の入力\thetaの空間 \\
U \in R^m ：& Nの部分空間\\
V \in R^{(n-m)} ：& Uの直交補空間 \\
W \subsetneq U ：& Uの部分空間の内，U自身を除いた部分空間 \\
\theta \in N ：& Nの要素 \\
\theta_U \in U ：& Uの要素 \\
\theta_V \in V ：& Vの要素 \\
U \cap V = \emptyset ：& UとVは直交\\
U \cup V = N ：& VはUの補空間\\
F_S(\theta_S) ：& 入力を空間 S の要素 \theta_S としたときの関数 \\
f_S(\theta_S) ：& 入力を空間 S の要素 \theta_S とし，Sより低ランクの特徴空間の寄与を無視した関数 \\
\end{align}
```

## 仮定

[Taylor展開](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%A4%E3%83%A9%E3%83%BC%E5%B1%95%E9%96%8B)によれば，$C^\infty$級の$n$ 変数関数は適当な $m$ 変数関数の和として表すことが可能．ここで観測誤差を考慮しなければ，$n$ 変数関数は以下のように表すことができる．

```math
f(\theta) = \sum_{U \subseteq N} f_U(\theta_U|\theta)
```

また，同様に部分空間との関係性から以下のことも言える．

```math
F_U(\theta_U) = \sum_{W \subseteq U} f_W(\theta_W) = f_U(\theta_U) + \sum_{W \subsetneq U} f_W(\theta_W|\theta_U)
```

## 各変数の分散
ある $m$ 変数(例えば，2変数で $x_1, x_3$ の相互作用含む寄与率を調べたいときなど)の分散を調べる手法を考える．まずは $N$ の任意の部分空間 $U$ に対して，その直交補空間 $V$ で積分することによって $U$ の部分空間に落とすように積分消去した関数を得る．

```math
F_U(\theta_U) = \int f(\theta_U, \theta_V)P(\theta_V) d\theta_V　\\  
```

次に $N$ の任意の部分空間 $U$ から，$U$ に対する任意の部分空間 $W$ において積分消去で次元を落とした関数 $f_W(\theta_W)$ を引くことで $F_U$ から $U$ よりも低次元な特徴空間による寄与を取り除く．つまり，真に $U$ の特徴空間のみに依存した関数にする．自明ではあるが，$f_W(\theta_W|\theta_U)$ の入力 $\theta_W$ は $\theta_U$ よりも低次元であるから $\theta_W$ は事前に $\theta_U$ さえ定めれば一意に決まる．

```math
f_U(\theta_U) = F_U(\theta_U) - \sum_{W \subsetneq U} f_W(\theta_W|\theta_U)
```

最後に，$U$ の特徴空間のみに依存した関数の分散を取ることで，その特徴空間の関数に対する変動寄与がわかる．

```math
\sigma^2_U = \int {f_U(\theta_U)}^2 P(\theta_U) d\theta_U
```

以上の式変形において登場する $P(\theta_U)$ は確率密度関数であるが，$\theta_U$ はAutoMLを行う際は使用者側で適当にサンプリングを行うものであるため，一様分布を仮定している．則ち，$P(\theta_U) = \frac{1}{||U||}$ (= $U$ の超体積の逆数)となる．

上記で得られた $\sigma^2_U$ を $\sigma^2 = \int (f(\theta) - y(\theta))^2 P(\theta) d\theta$ で割ることによって，$\sigma^2_U / \sigma^2$ から特徴空間 $U$ がどの程度関数の変動に寄与しているかわかるようになる．
simpleRTK2B

#simpleRTK2Bとは
https://www.ardusimple.com/product/simplertk2b/
一部（自分の周り）界隈で人気沸騰中のGPSモジュール、u-blox社のF9Pが乗ってます。
色々な比較基準がありますが、業務用の測量機器と比べると２桁ほど価格が安く、海外ネット通販で気軽に買える、業務用と同じく２周波なのでFIXまでの時間は業務用と遜色ないのが特徴。
またsimpleRTK2Bは、汎用的なArduinoで使えるようになってます。

#ESPで使ってみる
今回用意したのは以下の２つ

スイッチサイエンスのESPr One 32
https://www.switch-science.com/catalog/3555/
ESPr® One
https://www.switch-science.com/catalog/2620/

注意点として、ESPr OneはResetがピンで出ており、simpleRTK2BのRX2の所に来ちゃってます。F9PのUARTがぶっ壊れる（壊しました）ので接続してはいけません。

#プルアップ抵抗
UARTはプルアップ抵抗を入れたほうが安定するようなので、esp32or8266のユニバーサル基盤になってる場所を使って10kΩでプルアップしてます。
また回路によっては470Ω程度で繋いでいる物も見かけます。（基盤削ったりしなきゃならないので自分は未設置）

#プログラム
別記事を参考
https://qiita.com/yasunori_oi/items/87e8a574f48bbbf5facf

もしくはAG_NTRIP_ESP
https://github.com/Coffeetrac/AG_NTRIP_ESP
初期設定だとUART1はデバッグポートなので、simpleRTK2BのUART1ピンを引っこ抜いてジャンパーする必要がありますが、WiFiを繋ぐことでスマホ等から設定を変更可能。方位角やジャイロセンサーが使えるようです。

#ケース
せっかくなのでケース作りました。DMM.Makeでポチれるように出品中です。
よろしければご利用ください。
https://make.dmm.com/item/1071687/
https://make.dmm.com/item/1070882/
VivadoをLinux (Ubuntu) にインストール　(Ubuntu 18.04.2 LTS, Vivado 2019.1, 64bit環境)

この記事ではUbuntu 18.04 LTSを用い、Xilinx Vivadoをインストールと設定についてまとめました。VivadoのバージョンはHLx2019.1で確認しています。

##ダウンロードとインストール
インストール時にアカウント情報が求められるため、まだXilinxのアカウントを作成していない場合は、[ここ](https://japan.xilinx.com/registration/create-account.html)からXilinxのアカウントを作成します。
アカウントを作った/すでに持っている人は[ここ](https://japan.xilinx.com/support/download.html)からインストローラーをダウンロードし、terminalでインストローラーを解凍したダイレクトリへ移動し、

```
sudo chmod +x [インストーラー]
sudo ./[インストーラー]
```
ダウンロードした.binファイルに実行権限を付与し/tools/Xilinxへインストールします。

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314400/d4b74522-7a78-ceff-8e14-455a9a810710.png)

上記のコードを実行するとこのような画面がでるのでNextをクリック。
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314400/b3d5955b-28b7-de42-e910-4b93ca1d5626.png)
次に、Xilinxのアカウントを情報を入力。下のチェックはデフォルトのDownload and Install Nowを選択。
![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314400/363bc428-8cb6-dff2-c0ec-0f396e3a34ff.png)
ライセンスなどの合意が求められるので、すべてAgreeをチェック。
![d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314400/cb2bc312-c52a-618e-71f3-4df24b56fda1.png)
エディションは3つあるが一番上のVivado HL WebPACKを選択する。
![e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314400/0c6d67bd-fc00-c758-26b9-31bbd07a5f31.png)
インストールするツールを選択、デフォルトの設定で特に問題ないと思います。
次の画面ではインストール先を選択します。デフォルトでは`/tools/Xilinx`となっているので問題なければインストールを開始する。時間は４０分くらい

##Cable_driverのインストール
ボードもしくはプログラミングケーブル用のデバイスドライバーはインストールされていませんので、これらは個別にインストールする必要があります。/tools/Xilinxにインストールした場合、インストールは次のようにします。

```
cd /tools/Xilinx/Vivado/2019.1/data/xicom/cable_drivers/lin64/install_script/install_drivers/
sudo ./install_drivers 
```

##Vivadoの設定
このままではterminalで`vivado`と打ってもvivadoは立ち上がりません。なので、まず、好きなエディタで~/.bashrcを開き、

```
sudo emacs ~/.bashrc 
```
以下のコードを付け加え、settings64.shを走らせるようにする。

```
source /tools/Xilinx/SDK/2019.1/settings64.sh 
```
保存をし、~/.bashrcをsourceする。

```
source ~/.bashrc
```

##最後に
以上でインストールと設定は終了です。今後、Vivadoを使う人の少しでも参考になればと思います。
年数を加算して月末を取得するメソッド



# Javaで月末を取得をするメソッド

```java

	public static String getLastYmd(String ymd) {
		try {
			//日付チェック
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
			sdf.setLenient(false);
			sdf.parse(ymd);

			//年・月を取得する
			int y = Integer.parseInt(ymd.substring(0, 4));
			int m = Integer.parseInt(ymd.substring(4, 6));

			//取得した年月の最終年月日を取得する
			Calendar cal = Calendar.getInstance();
			cal.set(Calendar.YEAR, y);
			cal.set(Calendar.MONTH, m - 1);
			cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DATE));

			//YYYYMMDD形式にして変換して返す
			return sdf.format(cal.getTime());

		} catch (Exception ex) {
			//例外発生時はnullを返す
			return null;
		}
	}
```

#年数を加算して月末を取得するメソッド

```java
	public static String addYear(String fromYear, int year) {

		// フォーマット変換用のSimpleDateFormatオブジェクトを生成
		DateFormat df = new SimpleDateFormat("yyyyMMdd");

		// 現在日時を保持するCalendarオブジェクトを生成
		Calendar cal = Calendar.getInstance();
		try {
			cal.setTime(df.parse(fromYear));
		} catch (ParseException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}

		// 年数を加算
		cal.add(Calendar.YEAR, year);

		return getLastYmd(df.format(cal.getTime()));
	}
```
Goで文字列を1つずつ処理する。

# はじめに
javaやCでは普通にできたが、Goで同じ操作をしようとしたらつまづいたので共有しておきます。Goで文字列を1文字ずつ処理する方法として`for range`と`Split()`について紹介します。今回のプログラムは標準入力した文字列を一文字ずつ取り出し、その文字の型も追加して出力するというものです。
# 対象読者
Goを始めて1ヶ月未満の方
Goの文字列操作があいまいな方
その他Goの文法に自信がない方
# `for range`で処理する。
文字数分だけ勝手にループしてくれます。

```main.go
func Range(input string){
	for _, c := range input {
		fmt.Printf("%c ", c)
		fmt.Println(reflect.TypeOf(c))
	}
	fmt.Println("")
}
```

# `Split()`で処理する。
stringsパッケージのSplit関数を用いて、スライスに1文字ずつ格納していきます。

```main.go
import "strings"

func Split(input string){
	slice := strings.Split(input, "")
	len := len(slice)
	for i := 0; i < len; i++ {
		fmt.Printf("%s ", slice[i])
		fmt.Println(reflect.TypeOf(slice[i]))
	}
	fmt.Println("")
}
```

スライスではなく配列に格納しようとするとコンパイルエラーが起きました。
`cannot use strings.Split(input, "") (type []string) as type [5]string in assignment`
これは`Split()`の返り値の型がスライスだからです。javaやCでは配列が返されるので、勘違いしてました。

# 実行結果
実行結果の前にコード全体を載せておきます。

```main.go
package main

import (
	"fmt"
	"strings"
	"reflect"//取り出した文字の型を調べるためにimport
)

func main() {
	var input string
	fmt.Scan(&input)//標準入力で文字列を受け取る
	fmt.Println("Range...")
	Range(input)
	fmt.Println("Split...")
	Split(input)
}

func Range(input string){
	for _, c := range input {
		fmt.Printf("%c ", c)
		fmt.Println(reflect.TypeOf(c))//取り出した文字の型を示す。
	}
	fmt.Println("")
}

func Split(input string){
	slice := strings.Split(input, "")
	len := len(slice)
	for i := 0; i < len; i++ {
		fmt.Printf("%s ", slice[i])
		fmt.Println(reflect.TypeOf(slice[i]))//取り出した文字の型を示す。
	}
	fmt.Println("")
}
```

### 実行結果
入力した値 `input = "12abCDあい"`

```
Range...
1 int32
2 int32
a int32
b int32
C int32
D int32
あ int32
い int32

Split...
1 string
2 string
a string
b string
C string
D string
あ string
い string
```

`for range`で取り出された文字は***int32型***であり、`Split()`だと***string型***
でした。

# 最後に
`for range`も`Split()`も***文字列にスペースが含まれるとそれ以降の文字は処理されない***ので注意。次回は文字列から一文字ずつ取り出し数字だったら足し、それ以外だったら足さないというプログラムを用いて、型のキャストや、スライスの扱い方にも触れながら、もう少し複雑な処理についてやってみます。
Manjaro で日本語入力をする方法

# はじめに

Manjaro Linux で日本語入力をできるようにする。

# 環境

- Manjaro Linux 18.0.4 illyria
- kernel: 4.19.45-1-MANJARO
- i3wm

# 手順

## 基本設定

```
sudo pacman -S fcitx fcitx-mozc fcitx-im fcitx-configtool
```

`~/.xprofile` に設定を追加。

```
cat << EOF >> ~/.xprofile
export LANG="ja_JP.UTF-8"
export XMODIFIERS="@im=fcitx"
export XMODIFIER="@im=fcitx"
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export DefaultIMModule=fcitx
EOF
```

`~/.bashrc` に設定を追加。

```
cat << EOF >> ~/.bashrc
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export QT_IM_MODULE=fcitx
EOF
```

`fcitx` の起動。

```
fcitx
```

## 「変換」、「無変換」キーの設定を変更
mac の「英数」、「かな」キーのように設定を変更する。

```
fcitx-configtool
```

1. 「全体設定」タブ
1. 「ホットキー」タブ
1. 下の方にある「Show Advanced Options」にチェックをつける
1. 「入力メソッドをオンに」-> 変換キー
1. 「入力メソッドをオフに」-> 無変換キー

## i3wm の場合
`~/.i3/config` に設定を追加。

```
cat << EOF >> ~/.i3/config
exec --no-startup-id fcitx
EOF
```


# 参考
- https://wiki.manjaro.org/index.php?title=%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E8%A8%AD%E5%AE%9A
- http://opamp.hatenablog.jp/entry/2014/05/23/021310
Firebase FunctionsのApolloServerがCORSに阻まれ動かない

以前書いた[Firebase FunctionsでGraphQLを使う](https://qiita.com/yubachiri/items/6b8403d6ec6e965eddc9)、その後困ったことです。

## まとめ
NuxtのApolloClientからFunctionsのGraphQL呼ぶとCORSでエラーになりました。
`createHandler`の引数にcorsオプションを渡してやるとスッキリします。

```
// 略

const server = new ApolloServer({ typeDefs, resolvers });

exports.graphql = functions.https.onRequest(server.createHandler({
  cors: {
    origin: 'http://localhost:3000', // 許可するオリジン
    credentials: true
  }
}));
```

## 補足
CORSとは https://developer.mozilla.org/ja/docs/Web/HTTP/CORS
オリジンって https://developer.mozilla.org/ja/docs/Glossary/Origin
僕はlocalhost:3000のnuxtからlocalhost:5001のfunctionsに投げてたので一生怒られてました。
動作確認ができないので詰みです。
サーバからレスポンス返すときのヘッダに`Access-Control-Allow-Origin`を入れてやればOKです。
今回のApolloServerでは[この辺](https://github.com/apollographql/apollo-server/blob/master/packages/apollo-server-cloud-functions/src/ApolloServer.ts#L45)で設定してる感じです。配列にすれば複数許可できるんですね。
iOSアプリでのOAuth認証で、ASWebAuthenticationSessionを使用する

# はじめに
iOSアプリにログイン機能を入れる場合、「Google」や「Github」、「Facebook」等でのログインを用いたOauth認証を使用することがあるかと思います。
このときに「OAuthSwift」のライブラリーを使用する方法もあるかと思いますが、「ASWebAuthenticationSession」を使用する方法を紹介します。

※ iOS11以上では、Cookie等のデータがSafariとは共有できなくなりました。
　iOS11では「SFAuthenticationSession」が新しく提供されましたが、iOS12ではdeprecatedとなり「ASWebAuthenticationSession」に置き換わりました。


# 実装方法
    
1. URLスキームを設定します
    [info] - [URL Types]
    - [identifire] Bundle Identifier を入れるのが一般的ですが、一意になれば何でも良いようです
    - [URL Schemes]  URLスキーム

1. アプリケーションを登録します 
（Qiitaの場合：Qiitaにログインして、下記のようにアプリケーションを登録します）
[設定] - [アプリケーション] - [アプリケーションを登録する]
※ リダイレクト先のURLには、アプリのURLスキーム://hogehogeのように設定をします。
   

1. コード
例として、取得した認可コードを表示しています。

```swift
import UIKit
import AuthenticationServices

class ViewController: UIViewController {

    var session: ASWebAuthenticationSession?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        let url = URL(string: "https://qiita.com/api/v2/oauth/authorize?<発行されたClient ID>&scope=<要求するスコープ>&state=<認可後にリダイレクトするURLのクエリに含める値>")!
            self.session = ASWebAuthenticationSession(url: url, callbackURLScheme: nil) { url, error in
                print(url) // <登録したリダイレクト先のURL>?token=XXXXXXXXXXXXXX
            }
        session?.start()
    }
}
```

# まとめ
iOSでOAuthを使用したログインを実装する場合、「OAuthSwift」のライブラリーを使用する方法があります。しかし「ASWebAuthenticationSession」での実装もシンプルですし、ライブラリー依存がなくなるので、こちらの方が良いかと思います。

今回紹介した方法で「認可コード」を取得できました。
この「認可コード」を「クライアントID」「クライアントシークレット」と一緒に、トークン発行のエンドポイントにリクエストを投げれば、「アクセストークン」が取得できます。

Oauth2のフローを理解するには、下記が参考になりました。
https://qiita.com/TakahikoKawasaki/items/200951e5b5929f840a1f

# 参考
https://qiita.com/api/v2/docs
https://blog.fenrir-inc.com/jp/2017/11/sfauthenticationsession.html
https://qiita.com/koogawa/items/55a7405c2c323a8f413a
https://qiita.com/TakahikoKawasaki/items/200951e5b5929f840a1f
OpenVDBのビルド

# 環境
Ubuntu 18.04
OpenVDBの対象バージョン 6.1, 6.0, 5.2

OpenVDBは以下からクローンできます
https://github.com/AcademySoftwareFoundation/openvdb

この中には*openvdb*, *openvdb_houdini*, *openvdb_maya*がありますが，この記事ではHoudiniをインストールせずにビルドを行うので，openvdbディレクトリ内のファイルのみを使います
また，Pythonモジュールのビルドは検証していないのでその点は各自でお願いします

# ライブラリのインストール
INSTALLファイルに書いてある通り，必要なライブラリをインストールします

```
sudo apt install libboost-all-dev
sudo apt install libtbb-dev
sudo apt install libilmbase-dev
sudo apt install libopenexr-dev
sudo apt install zlib1g-dev
sudo apt install libblosc-dev
sudo apt install libjemalloc-dev
```

Boostは`libboost-iostreams-dev`, `libboost-system-dev`のみインストールすれば良いらしいですが，これについては自分はBoost関連を全ていれた状態(`libboost-all-dev`)でしか試したことがないので何とも言えません
あと，これは任意ですが，*vdb_view*のビルドをするのであればGLFWのインストールが必要になります

# Makefileの書き換え
Makefileでインストール先や先ほどインストールした各ライブラリのパスを指定します
一応例として載せておきますが，この辺はMakefileの指示に従って各自でお願いします

まず`INSTALL_DIR`のデフォルトが`/tmp/OpenVDB`になっているので，`/usr/local`などにします
また，`*_INCL_DIR`, `*_LIB_DIR`も適宜変えます
今回使わない`LOG4CPLUS_INCL_DIR`, `GLFW_INCL_DIR `, `PYTHON_VERSION`, `NUMPY_INCL_DIR`, `EPYDOC`, `DOXYGEN`はブランクにします
もしGLFWなどを入れている場合は対応するパスを指定してください

**ここからが重要**
このままビルドしようとすると
`stdlib.h: No such file or directory`
でエラーがでます
対処法はMakefileの`-isystem`を全て`-I`に置換します
これでビルドが通ります

あと，ビルド時の出力がうるさいので
`make -s -j4`
とオプションを付けると良いです

ついでに，OpenVDBを用いたプログラムをビルドするときは
`-lHalf -ltbb -lopenvdb`
とリンクさせます

# 参考
https://github.com/AcademySoftwareFoundation/openvdb/issues/144
[Ruby]fakerでランダムなBitcoinアドレスが生成できるようになってた件（あとアニメキャラも）

# はじめに

Rubyにはランダムなダミーデータを生成してくれる、[faker](https://rubygems.org/gems/faker)というGemがあります。
テストデータとして、既に利用している方も多いかと思います。

例えば、これだけでランダムな名前が自動生成できちゃいます。
（デフォルトはlocaleがenなので外人さんの名前）

```ruby
require 'faker'

Faker::Name.name
#=> "Christophe Bartell"
```

# ビットコインアドレスも自動生成できる

fakerの[GitHub](https://github.com/stympy/faker)を見ていたら偶然、[Blockchain](https://github.com/stympy/faker/tree/master/doc/blockchain)というカテゴリを発見。
気になったので内部を拝見すると、どうやら以下のアドレスを自動生成できるようです。

* bitcoin
* ethereum
* tezos（なぜｗ）

そしてGitHubを見る限り、このbitcoinはlocalesのymlファイルを参照しているわけはなく、それぞれRubyのロジックでランダムな値を生成していることが分かります。

# ビットコインアドレスの生成手順

補足として、ビットコインアドレスの生成手順をざっくり纏めると、概ね以下の通りです。
だいたいの雰囲気が分かればとりあえずOKです。

1. 公開鍵をSHA256とRIPEMID160で二重ハッシュ化する、これをPayloadと呼ぶ。
2. Payload先頭にversion prefixを付与する
3. 上記の値をSHA256で2回ハッシュ化し、そこから先頭の4バイトを取得して最後尾に付与する
4. 上記の値をBase 58エンコードする

これでビットコインアドレスの完成です。

# fakerのコードを覗いてみる

上記の手順を念頭にGitHubのコードを覗いてみます。
コード量がそれほど多くないのでコピペします。

```ruby
# frozen_string_literal: true

require 'digest'
require 'securerandom'

module Faker
  class Blockchain
    class Bitcoin < Base
      class << self
        PROTOCOL_VERSIONS = {
          main: 0,
          testnet: 111
        }.freeze

        def address
          address_for(:main)
        end

        def testnet_address
          address_for(:testnet)
        end

        protected

        def address_for(network)
          version = PROTOCOL_VERSIONS.fetch(network)
          packed = version.chr + Faker::Config.random.bytes(20)
          checksum = Digest::SHA2.digest(Digest::SHA2.digest(packed))[0..3]
          Faker::Base58.encode(packed + checksum)
        end
      end
    end
  end
end
```

def address_forがビットコインアドレスを生成している処理です。
Faker::Config.random.bytes(20)が、手順1のPayloadを想定していると思われます。
その後の処理も読み解くと、fakerはそれなりにビットコインアドレスの生成手順に沿って値を生成していることが分かります。
実際は公開鍵のハッシュ値を参照してるわけではないので、それっぽいアドレスですがビットコインの送受信はできないはずです。

# さいごに

余談ですが、Blockchain以外でも偶然「Japanese Media」というカテゴリを発見しました。
内容を見ると、

* dragon_ball
* one_piece
* sword_art_online（なぜｗ）

今時点で、この3種が用意されてました。
ソードアートオンラインは議論を呼びそうですが、これもコミッターの特権ということで。

dragon_ballだと、キャラの名前だけがランダムに取得できるようです。

```ruby
Faker::JapaneseMedia::DragonBall.character
#=> "Goku"
```

名前が定義されたymlはlocales/en配下にあるので、localeがenの場合のみ利用できると思われます（試してない）。

そしてワンピースだと、キャラの名前以外にもいろいろな値が自動生成できるようです。
（ドラゴンボールとはえらい違いだ）

```ruby
Faker::JapaneseMedia::OnePiece.character #=> "Monkey D. Luffy"
Faker::JapaneseMedia::OnePiece.sea #=> "East Blue"
Faker::JapaneseMedia::OnePiece.island #=> "Laftel"
Faker::JapaneseMedia::OnePiece.location #=> "Foosha Village"
Faker::JapaneseMedia::OnePiece.quote #=> "ONE PIECE IS REAL!"
Faker::JapaneseMedia::OnePiece.akuma_no_mi #=> "Gomu Gomu no Mi"
```

それにしてもこのfakerの使い道がよく分かりませんね。
完全にネタな気がしますが、こうして日本の文化が採用されることを誇りに思いましょうｗ

以上、読んで頂きありがとうございました。
OpenCVをVisual Studio Codeで使う時にcv2モジュールのインテリセンスが表示されない問題

# 概要
VScodeでcv2をimportするとcv2モジュール関連のインテリセンスが効かないという問題が発生していた。
結論としてpylintの引数に```--extension-pkg-whitelist=cv2```を指定することで解決した

# 動作環境
OS         ：Ubuntu16.04
python     ：3.5.2
opencv     ：4.1.0

#問題
opencvをpipでインストールし、VScodeでいざ書こうとすると次のようなエラーが表示される。
```Module 'cv2' has no なんとか member. ```
pipでopencvのモジュールをインストールしなおしても解決されなかった。
作ったpythonファイルをターミナルから実行すると問題なく動き、インテリセンスだけが表示されない問題が発生していた。

# 原因
この問題はpylint引数の```extension-pkg-whitelist```にcv2モジュールを指定していないことが原因だった。

# 対策
pylintがそもそも入っていない場合はpipでインストールする。

    username@PC:~$ pip install pylint

pylintの設定ファイルを出力しておく

    username@PC:~$ pylint --generate-rcfile > pylintrc

次にVScodeを開いて```[ファイル]→[基本設定]→[設定]```を開く
設定タブが開くので、設定の検索で```Python.linting.pylintArgs```を探す。
![args.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72035/03489b48-6cac-3997-7ffc-e917ead01eae.jpeg)
settings.jsonを開き、次のように記載する。

```settings.json
    {
    "python.linting.pylintArgs": ["--extension-pkg-whitelist=cv2"],
    }
```

このように設定し、VScodeを再起動するとインテリセンスが効くようになる。
![vscode.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72035/e8b37535-30f0-8f51-4586-4c23be0a326f.jpeg)
ターミナルアプリでcontrol + L とcommand + Kの挙動の違い

## ターミナルアプリでcontrol + L とcommand + Kの挙動の違い
ターミナルアプリではcontrol + L やcommand + Kというショートカットを使うことで現在のコンソール画面をクリアすることができます。

挙動の違いとしては、今までのログを削除するかどうかが挙げられます。control + L はログを削除しませんが、command + Kは削除します。

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
tmux ショートカットキーが反応しない


tmuxのショートカットキーを使えず時間をかけてしまったのでメモ

tmuxのショートカットは

- prefix(デフォルトではCtrl-b) + c  
新規ウインドウ作成

のように書かれている。

これはCtrlとｂとｃを同時押しするのではなく、Ctrlとｂを押し、一度キーを離してｃのみを押すこと



[参考](https://superuser.com/questions/266725/tmux-ctrlb-not-working#comment277752_267317)
[Swift]サイドメニューで右側からメニューを表示する

サイドメニューで左側からメニューが出てくる場合の実装例は多数あったものの、
右側からメニューを出す方法が、分からず詰まったため解決方法を記載します。

##環境
Xcode:10.2
Swift:5.0.1


##実際のコード
右側から表示する場合のアニメーション部分のコードを記載します。
前提として、centerControllerの後ろにメニュー用のviewControllerがある状態だと思ってください。


```
//右側から表示する場合
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseInOut, animations: {
     self.centerController.view.frame.origin.x = -200
}, completion: nil)
```
「self.centerController.view.frame.origin.x」がviewのx座標であるため、0であればviewは画面の左側にぴったり寄っている状態です。通常はこの状態です。

右側からメニューを表示するために、x軸の座標をずらします。
x軸が-200になれば、centerControllerのviewが左側にずれるため、下のメニュー用のviewが右側から表示されます。

-200の部分をフレームの横幅を利用して、

```
self.centerController.view.frame.origin.x = -self.centerController.view.frame.width + 80
```

とすれば画面サイズが異なる端末にも対応できます。

##引用
以下の動画と動画に出てくるソースを参考にしております。

https://www.youtube.com/watch?v=dB-vB9uDRCI&t=1129s
https://github.com/sdowless/SideMenu
ワードプレスのテンプレートは安易に変えるな

サイトを作っている中でSEO対策は避けては通れない。

私の仕事の中でもワードプレスはよく利用する。

時々上位にランクインしたサイトがあり、「これはいける」と思ってしまう:relaxed:

そこでサイトをリライトしてテンプレートを無料からseoに強いと言われている有料版に変更する。

そうすると一気に圏外に飛ぶことがほとんど。というか間違いない。

これは経験上であるがかなりの高確率で一時は飛んでしまう。

その後にすぐ戻ってくれば良いが、そうでない場合もたくさんある。

3ヶ月～半年かかるサイトもあれば、二度と戻ってこないことだってある。

だからワードプレスのテンプレートを変更する場合は慎重になるべきである。

無料のものでも十分対策できるし工夫すれば見やすくだってなる。

例えばこの[ゼロファクター　解約](https://www.vlogtalkmeme.com/archives/129/)このサイトは作成して2ヶ月で上位表示に成功してアクセスも100uuくらいはあった。

しかし、もう少し見やすくと思いテンプレートを変更したところ一気に100位まで順位が下落した。

それから8ヶ月間である程度順位を戻ったが10位～12位をうろうろしている状態。

色々と対策をしてみたが全くダメで現在も試行錯誤中。

これからワードプレスを利用する人へのアドバイスとしては作成時からテンプレートを決定して一生変更しないこと。

変更する時には、サイトの順位が一時的に下がる覚悟で変更することをおすすめしておく。
適用済みWindowsUpdateのKB一覧を調べる

#### 2019/06/03追記
`Where-Object`で`$_`を使わない表記についてコメントを頂けたので反映しました。
これに伴い記事末尾に余談も追記しました。

---

今日調べる機会があったので。`PowerShell`の`Get-HotFix`コマンドレットで取得できます。

```Powershell
Get-HotFix | Where-Object HotFixID -match "KB4[01]"                                     # KB40 か KB01 が含まれる更新の一覧を取得する
Get-HotFix | Where-Object HotFixID -match "KB4[01]" | Sort-Object -Property InstalledOn # 適用日でソート 
```

なおGet-HotFix自体に`-Id`パラメータがありますが、ワイルドカードが使えないためあまり利便性は無いです。

```Powershell
PS C:\Users\me> Get-Help Get-HotFix -Parameter Id

-Id <String[]>
    指定された修正プログラム ID を持つ修正プログラムのみを取得します。既定値は、コンピューター上のすべての修正プログラムです。

    必須                         false
    位置                         1
    既定値                       All hotfixes
    パイプライン入力を許可する   false
    ワイルドカード文字を許可する false  # ← ココ

PS C:\Users\me>
```
なのでID検索したいときは`Where-Object`に渡して`-match`か`-like`で探す方が便利ですね。

また`-ComputerName`パラメータが使えるため、（設定されていれば）リモートノードの情報を一括で取得することができます。

```Powershell
PS C:\Users\me> Get-HotFix -ComputerName REMOTE1,REMOTE2 | Where-Object HotFixID -match "KB289"

Source         Description      HotFixID      InstalledBy          InstalledOn
------         -----------      --------      -----------          -----------
REMOTE1        Security Update  KB2894856     REMOTE1\Administrator 2015/01/26 0:00:00
REMOTE1        Update           KB2896496     REMOTE1\Administrator 2015/01/26 0:00:00
REMOTE2        Security Update  KB2894856     REMOTE2\Administrator 2015/01/26 0:00:00
REMOTE2        Update           KB2896496     REMOTE2\Administrator 2015/01/26 0:00:00


PS C:\Users\me>
```

---
#### 余談：`Where-Object`の`$_`について
- [ヘルプ：Where-Object (PowerShell5.0)](https://docs.microsoft.com/ja-jp/powershell/module/Microsoft.PowerShell.Core/Where-Object?view=powershell-5.0)

> The $_ automatic variable represents each object that is passed to the Where-Object cmdlet.
> The first command uses the script block format, the second command uses the comparison statement format.
> The commands are equivalent and can be used interchangeably.
> 
> ```PowerShell
> Get-Service | Where-Object {$_.Status -eq "Stopped"}
> Get-Service | where Status -eq "Stopped"
> ```

`Where-Object`をスクリプトブロックを用いずに使用する場合`$_`は不要とのことでした。
どこで刷り込まれた知識だったか、常に必要だと思っていました…。勉強になりました。
引用で示されている通り、`$_`を使う場合と使わない場合でコマンドは等価であり、互換性があるとのことです。
Go Lambda は aws-sam-cli@0.16.xでは動かないYO（2019/6/1現在）

# 問題
```
$ brew tap aws/tap
$ brew install aws-sam-cli
-> v0.16.1が入る　（2019/6/1現在）
$ sam init --runtime go --name hoge
$ cd hoge
$ sam local start-api

// 別セッションで
$ curl http://localhost:3000/hello
```

で、このエラーが起きます。

```
Invalid API Gateway Response Keys: set([u'multiValueHeaders']) in {u'body': u'{"Status":true,"Message":"OTP Generated"}', u'headers': {u'Content-Type': u'application/json'}, u'multiValueHeaders': {}, u'statusCode': 200}

Function returned an invalid response (must include one of: body, headers or statusCode in the response object). Response received: {"statusCode":200,"headers":{"Content-Type":"application/json"},"multiValueHeaders":{},"body":"{\"Status\":true,\"Message\":\"OTP Generated\"}"}
```

詳細はここに書いてあるとおりです。
`multivalue headers` というフィールドが悪さしているみたいですね。

https://github.com/awslabs/aws-sam-cli/issues/1190

# 解決方法
0.15.0にダウングレードさせることで解決します。brewだとダウングレードが難しいので自分はpip経由で行いました。

```
// 0.16.x系をアンインストール
$ brew uninstall aws-sam-cli

// pipでバージョン指定でインストール
$ pip install --user aws-sam-cli==0.15.0
```

あとは

```
$ $(python -m site --user-base)/bin
```

この出力結果をパス通せば、 `sam` コマンドが使えるはずです。

よくわからなければ、[AWSのチュートリアル](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install-mac-path.html)をどうぞ。


```
$ sam --version
-> SAM CLI, version 0.15.0
```

MEDETASHI MEDETASHI
Raspberry PiのCUIのログイン画面でパスワードが入力できない

# パスワードが入力できない
Raspberry Pi の CUI でのログイン時に**パスワードが入力できない**点について書きます。

# 詳細
Raspberry Pi が固まってしまったとき、**Ctrl + Alt + F2** でターミナルを開き、原因となっているプロセスをを終了させると思います。

この、ターミナルを開いたときに GUI でログイン済みでも、**もう一度ログイン**を求められます。その時の画面は以下のようになっているはずです（環境によっては多少違うかもしれません。）。

```
Raspbian GNU/Linux 9 raspberrypi tty2
raspberrypi login:
```
``login:``の後に``pi``と入力し、エンターを押すと、下のようになります。

```
Raspbian GNU/Linux 9 raspberrypi tty2
raspberrypi login: pi
Password:
```
ところが、どんなに頑張っても **Password を入力できない**のです。

# 理由
どうやら、Password として入力した内容は表示されないようです。つまり、

```
Raspbian GNU/Linux 9 raspberrypi tty2
raspberrypi login: pi
Password:
```
のあと、入力内容が**表示されなくても気にせず**、パスワードを入力し、エンターを押すとログインできるというということです。

ただし、Num Lock の関係があるので、キーボードの Num Lock に有効/無効のランプがない場合、数字の入力には**テンキーは使わない**方が良さそうです。

# おまけ
Raspberry Pi が固まってしまったときに CUI で使いそうなコマンドをまとめておきます。

```
プロセスの一覧を表示（PIDがプロセスID）・・・　ps axu
特定の名前のプロセスを表示・・・　pa axu | grep プロセス名
プロセスを終了・・・　kill プロセスID
プロセスを強制終了・・・　kill -9 プロセスID
```
ちなみに、CUI から GUI に戻るには、**Ctrl + Alt + F7** を押す、あるいはターミナルでログインした状態で``startx``と入力してエンターを押します。
LG gramにManjaro Linuxを入れると「No battery」と表示されてがバッテリーが取得できない件

## 問題

LG gramにManjaro Linuxを入れたところ、i3wmのステータスバーに表示されるバッテリーの欄が「No battery」となってしまって、バッテリーの残り残量がわからなかった。

## 環境

PC: LG gram 13Z980
OS: Manjaro Linux 18.0.4 Illyria

## 解決策

```bash
$ grep '' /sys/class/power_supply/*/type
/sys/class/power_supply/ADP1/type:Mains
/sys/class/power_supply/CMB0/type:Battery
```

バッテリーのパスがわかったので、i3の設定を書き換える

```bash
$ sudo vim /etc/i3status.conf
```

```
@@ -20,7 +20,7 @@
 # order += "disk /home"
 order += "wireless _first_"
 order += "ethernet _first_"
-order += "battery all"
+order += "battery 1"
 # order += "load"
 order += "tztime local"
 # order += "ipv6"
@@ -45,7 +45,7 @@
         format_down = " no lan "
 }
 
-battery all {
+battery 1 {
         # format = "%status %percentage %remaining %emptytime"
         format = " %status %percentage"
         format_down = "No battery"
@@ -62,6 +62,7 @@
         status_full = "☻"
         low_threshold = 15
         threshold_type = time
+        path = "/sys/class/power_supply/CMB0/uevent"
 }
 
 tztime local {
```

## 参考
* https://faq.i3wm.org/question/6499/no-battery-in-status-bar.1.html
* https://github.com/hishamhm/htop/issues/638
Ruby初心者が勉強会に参加してみた（全７回）第3回＆4回①

３回目のものもnoteには投稿したけれど、
こちらでは復習も兼ねて３回と４回をまとめて記載していきます！
（長くなりそうなので、何回かに分けます！）


##最終目的：sinatraで掲示板アプリを作る
####まずはじめにsinatraで簡単なアプリを作成してみる。

`$ mkdir test-sinatra`
作業ディレクトリを作成。

`$ bundle init`
gemファイルを作成。

```Gemfile.
source 'https://rubygems.org'

gem 'sinatra'
gem 'sinatra-contrib'
gem 'pg'
```

gemを変更したらお決まりのこいつを実行。
`$ bundle install --path vendor/bundle`
（`--path vendor/bundle`とすることで**vebdor**と**bundle**ファイルを作成してくれます。）


`$ touch app.rb`でapp.rbファイルを作成。

```app.rb
require 'sinatra'
require 'sinatra/reloader'
require 'pg'

get '/' do　
    'hellooo'
end
```

一度、sinatraを起動させて確認してみる。
`$ ruby app.rb`

![スクリーンショット 2019-06-01 22.02.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378334/7e0cc6a3-4531-9fe6-7936-220f03186c62.png)
無事、表示されました。

次にHerokuでnew_appを作成。
（Heroku側に空箱を作るイメージ）

**Heroku postgresql**を使用して、
以下の情報を取得。

![スクリーンショット 2019-06-01 22.25.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378334/acd823de-116a-53f5-76cc-1bd6bcaa2ff3.png)

```
Host　　　どのコンピュータに接続してデータベースが動いているか
Database   　データベースの名前
User　　　データベースにアクセス権のあるユーザー名
Port　　　 Port番号
Password   アクセス権のあるユーザーかの確認パスワード
```

上記の情報でPGコマンダーも使用できます！
https://eggerapps.at/pgcommander/

ここから、つまづくDBへ・・。
長くなるかと思うので次の記事にまとめます。