OmniAICreator/Qiita-1.07M huggingface dataset:
公開鍵と秘密鍵を使ったSSH接続 (macOS Mojave)

#はじめに
公開鍵と秘密鍵を使ったSSH接続の設定方法を解説。


#手順

1: クライアント側）鍵を入れるディレクトリを作成

```text:
$ cd
$ mkdir .ssh
```

2: クライアント側）公開鍵と秘密鍵のペアを作成
(-C '' を使うとデフォルトコメントを消せます)
(-f を使うとファイル名を指定できます)

```text:
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/motofumi/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): 
Enter same passphrase again:
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.
```



3: サーバ側）ディレクトリとファイルを用意する
 
```text:
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ touch ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

```

4: クライアント側）公開鍵をサーバにアップロード

```text:
scp ~/.ssh/id_rsa.pub username@example.com:~/.ssh/
```

5: サーバ側）公開鍵の内容をauthorized_keysに追記

```text:
$ cat ~/.ssh/id_rsa.pub >> authorized_keys
$ rm ~/.ssh/id_rsa.pub

```

6: クライアント側）ssh接続できればOK

```text:
$ ssh -i ~/.ssh/id_rsa username@example.com
```

!!注意!!
間違えて設定すると詰みます。
(二度とサーバ接続できなくなる可能性あり）
7: サーバ側）パスワード認証を切って鍵認証だけにする。

```text:/etc/ssh/sshd_configファイルに追記
PasswordAuthentication no
ChallengeResponseAuthentication no
```

8: システム環境設定の共有のリモートログインをOFFにしてONする。


#オプション
option: SSH鍵をssh-agentに登録と確認

```text:
$ ssh-add /Users/user_name/.ssh/id_rsa
$ ssh-add -l
```




#リファレンス
- [Macのsshdでパスワード認証を無効にする](https://qiita.com/tukiyo3/items/10623166f9c2c009d3b2)
- [GitのSSH鍵認証で毎回パスワードを要求される](https://qiita.com/shinki_uei/items/70f8f9ae50f1b9e24dce)
WSL上にBBc1をインストールしてみる

#目的
WSL(Ubuntu)環境にBBc1環境を構築する際の覚書。
Ubuntuをインストールした直後のまっさらな状態からインストールすることを前提。

#構成
WSLとUbuntuで仮想環境を構築
Ubuntu環境上にBBc1環境を構築する


#手順
BBc1のインストールガイドを参照して構築するが一部情報が古いので、下記の手順で構築する
[BBc1_core_tutorial_installation_ja.md](https://github.com/beyond-blockchain/bbc1/blob/master/docs/BBc1_core_tutorial_installation_ja.md)



##Python3環境の構築

```
$ sudo add-apt-repository ppa:deadsnakes/ppa
$ sudo apt update
$ sudo apt install python3.6 python3.6-dev python3.6-venv
```

※python3.6-venvは過去の不具合で入らないみたいなので事前に3も入れておく

```
$ sudo apt-get install python3-venv
```

仮想環境上にlibbbcsig.soが作成されないので事前にgccをインストール

```
$ sudo apt install build-essential
```


##Python仮想環境を作成
```
$ python3.6 -m venv bbcenv
$ source bbcenv/bin/activate
(.bbc1_venv)$ pip install -U pip
```


##BBc1のインストール(ソースから)

```
$ git clone https://github.com/beyond-blockchain/bbc1.git
$ cd bbc1
$ sh prepare.sh
```

libbbcsig.soが作成されているか確認

```
$ ls libs/
```

libbbcsig.soが表示されていればOK


##cryptographyのバージョンを2.2.1に上げる

```
$ pip install cryptography==2.2.1
```


##必要なPythonパッケージのインストール

```
$pip install -r requirements.txt
```


##起動確認

```
$ cd bbc1/core
$ python bbc_core.py --no_nodekey
```



2か月前くらいに書いた記事なので最新とは異なる可能性もあります。誤字・脱字等ありましたらご指摘ください。


#参考サイト
[Win10のBash on Windows をインストールする](https://qiita.com/yukio_tokuyoshi/items/042546812c663ceeccf3)
[bbc1インストール時のエラー対処法](https://qiita.com/kichinosukey/items/6e81103ec9c4bf9345ed)
[WSL の Ubuntu の Python に pip がない](https://va2577.github.io/post/79/)
vueでwindowを使うとエラーになる

# 画面のサイズを取りたい

vueでwindowを使って画面のサイズを取りたい時にハマってしまった

```vuejs
<script>
export default {
  computed: {
    windowSize: () => {
      return { x: window.innerWidth, y: window.innerHeight }
    }
  }
}
</script>
```

`window is not defined` 

# 原因

コンポーネントのライフサイクルが関係しており、適切な場所でwindowを使わなければならない

[ライフサイクル](https://jp.vuejs.org/v2/guide/instance.html#%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%A9%E3%83%A0)

[linkref]: リンクのアドレス "リンクのタイトル"

# 解決策

mountedでwindowSizeをセットするように実行

```vuejs

<script>
  export default {
    data: () => ({
      windowSize: {
        x: 0,
        y: 0
      }
    }),

    mounted () {
      this.onResize()
    },

    methods: {
      onResize () {
        this.windowSize = { x: window.innerWidth, y: window.innerHeight }
      }
    }
  }
</script>
```

問題なくwindowを使うことができた！
「今後必要になるプログラム言語」を読むに当たって

#[今後必要になるプログラム言語](https://qiita.com/administrator1974/items/387aab2a42bf57e3b215)を読む前提知識

時代背景と当時の知識がないと読むのが非常に難しいので、僕の知っている範囲内の前提知識を書いておこうと思います。

## 当時の背景
当時というのは、ここでは 2000 年前後の Java 黎明期を指します。
僕個人で言えば PostPet 2001 などの開発に携わっていた頃のことです。

この少し前にインターネットの世界ではウェブブラウザが誕生しました。
そして、元々はセットトップボックス用に開発された言語 Java (Oak と呼称されていた)も開発されていました。

誕生間もない Java と誕生間もないウェブブラウザが出会うのは必然だったかもしれません。
この２つが出会ったことで、ウェブブラウザ上に動的なコンテンツを表示する Java Applet という技術が誕生しました。

##Netscape Communications と Sun Microsystems
次に、Java とウェブブラウザを作っていた企業の話です。

#### Netscape
Netscape Communications は Netscape というウェブブラウザを開発していました。
後に AOL に買収され Mozilla へ繋がって行く企業です。

#### Sun Microsystems
Sun Microsystems はワークステーションや CPU, OS を作るなどコンピューター全般を業務範囲とする企業で早くからインターネットに注力していました。
この Sun がセットトップボックスという新しいハードウェアを作るに当たって生み出されたのが Java です。
Sun は後に Oracle に買収され Java も Oracle が所有します。

#### LiveScript
Netscape はその頃自社のブラウザで動作する動的コンテンツ環境を実現するために LiveScript というスクリプト言語を開発していました。
このとき、Netscape と Sun は業務提携していた関係もあり LiveScript を JavaScript という名称に変更しました。
当時から Java Applet との連携が考えられていたのかもしれません。

##Java Applet と JavaScript
Java Applet と JavaScript は以下の２つの事象によって結びつきます

* Ajax 以前の世界では、JavaScript 単体でサーバと通信するプログラムを作るのが難しかった
* Java Applet も awt などで構成されていたため GUI 構築が煩雑で面倒だった

この解決をするために HTML + JavaScript + Java Applet という仕組みが考案されました。

|技術名|役割|
|---|---|
|HTML|文書|
|JavaScript|UI の構築|
|Java Applet|Java が用意する豊富なライブラリへのブリッジ（UI 構築には使っていない）|

この仕組みを使ったウェブページが主に官公庁系 SIer によって量産されました。

##動的データの取得方法
Java Applet を用いた通信のため Java Servlet を使うのが一般的でした。

具体的には

1. JavaScript から Java Applet の機能を呼び出す
1. Java Applet は Java Servlet にアクセスする
1. Java Servlet は SQL を使って DB にアクセスし、データを Java Applet に返す
1. Java Applet はデータを JavaScript に返す
1. JavaScript は、そのデータを使って UI を構築する

という流れです。

こうしてみると、著者が Java を前提にし、JavaScript と Java を混同（JS から Java のライブラリを呼べるので）し、それ以外をサブルーチンと呼ぶ意味がわかるかと思います。.
また、突然 SQL が言語欄に出てくるのも自明です。

##まとめ
あの記事は HTML + JavaScript + Java Applet + Java Servlet を使う Java 黎明期の知識がないと読むのが難しいと思います。
恐らく、この辺りで時代が止まっている物と思われます。
MSDN が C++ と主張しているのも、この時代にはまだ C# が無く Win32 API のオンライン・リファレンスな意味合いが強かったため、と思われます。

これらを頭に入れてから、もう一度読んでみてください。
…やっぱり全然わかりませんね！！

**追記**
コメント欄はわりかし読めるようになってるかも

**追記2**
元記事はアカウント停止で読めなくなったようです
Nextcloud のアクティビティ機能

#はじめに
Nextcloudはファイル共有をする事がメインの使い方です。ファイル共有をしていると、日頃よく使っているファイルが更新されたり、共有されたフォルダ内へ誰かがアップロードしたかなどがユーザ自身が確認できれば、業務効率も上がりますよね。今回は、Nextcloudのアクティビティ機能を紹介します。

#プラグイン
Nextcloud標準のプラグインです。もちろん有効にします。
![画像76.png](https://qiita-image-store.s3.amazonaws.com/0/308127/df36a340-49a5-b67f-8402-d208a6353cc3.png)

#設定方法
まずは、管理者のよるデフォルト設定画面です。この設定が、新規ユーザを登録した際に反映されます。設定画面の左側がメール送信する項目、右側がブラウザで表示する項目です。
![画像77.png](https://qiita-image-store.s3.amazonaws.com/0/308127/5f93458a-b6ab-4961-d868-3005ec3598c4.png)
設定画面の一番下に、メール送信の間隔を設定できます。
![画像78.png](https://qiita-image-store.s3.amazonaws.com/0/308127/38d5224b-75ef-3da8-7125-c3207c1bb9d8.png)
アクティビティの設定はユーザ単位でもできます。個人設定画面に同じようなアクティビティ設定画面の項目があるので、ユーザが好きなように設定します。
![画像82.png](https://qiita-image-store.s3.amazonaws.com/0/308127/82ed5501-9b8b-b84a-4e24-4e8a43c152a6.png)
#確認方法
ブラウザ上部のアクティビティのメニューをクリックすると、そのユーザ全体のアクティビティが表示されます。
![画像79.png](https://qiita-image-store.s3.amazonaws.com/0/308127/48992b53-62df-104d-0803-5baeda7bc4bd.png)
フォルダ単位でも確認できます。フォルダの共有アイコンをクリックし、アクティビティタブをクリックすると、そのフォルダ内のアクティビティが表示されます。
![画像80.png](https://qiita-image-store.s3.amazonaws.com/0/308127/3aca5675-cb77-08bd-ca84-c5a5d55abf5b.png)
ついでに、ファイル単位も
![画像81.png](https://qiita-image-store.s3.amazonaws.com/0/308127/764a89c1-f6f7-6d9d-e8e9-707d2f0d8cb5.png)
メールで送信される内容はこんな感じです。
![画像83.png](https://qiita-image-store.s3.amazonaws.com/0/308127/4e37ea26-b5fe-7504-fe94-579a56cb76d6.png)

#まとめ
ファイル共有をするなら必要な機能ではないかと思います。私も日頃からよく使ってまして、URLリンク共有をしたファイルをお客様がダウンロードされた事なんかを確認しています。スタイルズでも、このアクティビティ機能を[うまく活用した事例](http://www.scsk.jp/product/oss/case_6.html)がありまして、ナイスアイデアと思いました。

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
jupyterthemesで見切れる問題への対処

## 更新履歴
2018年11日8日：centOSでの例について追記（CentOSではうまくいきませんでした）

## 環境
- Windows 10 (or CentOS 6.8)
- Python 3.7.1
- jupyter 1.0.0
- jupyterthemes 0.19.6

## jupyterthemesって？
### Jupyter Notebookのテーマを変える
Jupyter Notebookの外観を簡単に変えてくれるヤツです。
いいヤツです。
詳細は、[こちらの記事](https://qiita.com/yujikawa/items/41c898ccfaae3b49e0cf)がわかりやすかったのでどうぞ。

```
jt -t oceans16
```

とコマンドプロンプトへ入力すると、↓こんなんだったJupyter Notebookが…
![ss1.PNG](https://qiita-image-store.s3.amazonaws.com/0/304493/5f564dd4-3219-b94b-d152-f0fdd31f34ee.png)

こうなります↓
![ss2.PNG](https://qiita-image-store.s3.amazonaws.com/0/304493/05510c21-be5f-5c1d-2a44-570f82a8e12a.png)
かっこいいし、白背景が厳しい私の眼球にやさしい。
これは、oceans16というテーマを外観に適用した結果です。
テーマはほかにも色々あるので、[先ほど挙げた記事](https://qiita.com/yujikawa/items/41c898ccfaae3b49e0cf)をご覧ください。

### 細かい外観を調整する
しかしこれ、ツールバーが表示されない（まぁあまり使いませんが）し、ノートブックの名前も表示されません。
さらに、出力の文字サイズが小さめで目が疲れます。

このあたりを細かく調整するオプションも、jupyterthemesには揃っています。
コマンドプロンプトで、

```
jt -t oceans16 -T -N -ofs 16
```

と入力します。
-T とつけると、ツールバーが表示されます。
-N とつけると、ノートブック名が表示されます。
-ofs 16 は、出力窓のフォントサイズを16にする、という意味です
（12くらいがちょうどいいと思いますが、今回は例として）。
すると、こうなります↓
![ss3.PNG](https://qiita-image-store.s3.amazonaws.com/0/304493/8a7c887b-857d-7d80-0d19-a3583fd4be25.png)


その他のオプションは

```
jt -h
```

とやると出てきます。

## 出力の左端が切れる問題
さて、お気づきでしょうか
テーマを変えた時から、出力画面（Hello World）の左端が切れています。
llo Wolrd とか ello Worldになってます。
これを修正するのが本題です。

### .cssファイルを編集する
解決法は、[こちら](https://github.com/dunovank/jupyter-themes/issues/203)でディスカッションされていました。
まず、**custom.css** をテキストエディタあたりで開きます。
場所は、**C:\Users\（ユーザー名）\.jupyter\custom** です。

ちなみに、CentOSだと **/home/（ユーザー名）/.jupyter/custom** にあります。
しかし、この後の手続をやってみても、うまくいきませんでした。

さて、cssファイルから、div.out_prompt_overlay.prompt と、div.out_prompt_overlay.prompt:hover という記述を見つけます。
これら両方において、min-width と width の値を、14.5exから11.5exに変えます。
計4か所を編集して、保存します。
↓変更した後（～.prompt:hover の中身を変えることもお忘れなく）
![ss4.PNG](https://qiita-image-store.s3.amazonaws.com/0/304493/3fac6522-58fe-7388-40cd-43ebefdbf9c4.png)

あらためてJupyter Notebookを開くと、
![ss5.PNG](https://qiita-image-store.s3.amazonaws.com/0/304493/b10e9fa3-cad7-f5c3-a5c5-061c98036f92.png)
無事見切れが直ってます。

### 変更するたびに変更する
注意点です。
再び jt コマンドを使って外観を変更すると、custom.cssが更新されてしまいます。
すると、せっかく直した見切れもまた復活してしまいます。

外観を変更するたび、custom.cssを編集しなくてはなりません。
結構面倒ですがまぁ、しっくりくる設定が見つかったらそれ以降はいじらないでしょうし。
Pythonを使った分析をやる上で必要なこと

##はじめに
これから分析をやりたい人向けに情報をまとめます。

###目標：分析の仕事が出来ること

- Pythonを使った分析
- 回帰分析などの手法の理解・使用

#### その他目標
- PythonらしいPythonの書き方を習得する
- Python環境構築

##分析をやる上で勉強してほしい＆必要なこと

### 環境

Pythonで分析を行う場合、多くの標準出ないパッケージを扱うことになります。その場合、依存関係やバージョン管理がかなりネックになってきます。（最近流行りの機械学習周りも同様です）


そこで、分析や機械学習に特化したPython環境を用意しているので、有名なのが[anaconda](https://www.anaconda.com/)です。

- [科学計算向けPython環境を簡単にインストールできる「Anaconda」入門](https://knowledge.sakura.ad.jp/17235/)
- [ディストリビューション「Anaconda」とは？](http://programming-study.com/trouble/anaconda/)
- [より効率よく開発できる！AnacondaでPythonの環境を構築する方法](https://techacademy.jp/magazine/15703)

しかし、環境を汚したくないかたや、GPUマシンとラップトップのマシンで環境を同等にしたい方もいらっしゃると思います。
そんな時は、Dockerで環境を構築することをお勧めします！

- [Docker コンテナに Anaconda 環境を構築](https://iriya-ufo.net/blog/2016/11/18/pyenv-and-anaconda-on-docker/)

### Pythonライブラリ

pythonでグラフ描画を行うライブラリにはこのようなものがあります

- [Pythonでグラフを描く](https://qiita.com/tobira-code/items/3b2322bf87464a36dfe6)
- [早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)

[pandas](https://pandas.pydata.org/)を使うことで、データの読み込みや統計量の表示、が簡単にできるようになります。また、主要な部分がC言語やCythonで書かれているので非常に高速に処理を行うことができます。

- [データ分析のライブラリ！Pandasとは【初心者向け】](https://techacademy.jp/magazine/17697)
- [Pandas データフレーム](https://stats.biopapyrus.jp/python/dataframe.html)

[numpy](http://www.numpy.org/)は配列(リスト)計算を高速にするライブラリです。numpyを使うことで配列を扱いやすくなり、コードがシンプルになります。

- [numpyの使い方](https://qiita.com/jyori112/items/a15658d1dd17c421e1e2)
- [numpyの何がすごいのか？【Python3】](https://to-kei.net/python/data-analysis/what-is-numpy/)
- [【Python入門】numpyで計算をしてみよう](https://www.sejuku.net/blog/42550)


[matplotlib](https://matplotlib.org/)はpythonでグラフを描画するときに使われる標準的なライブラリです。簡単なアニメーションを作ることも可能です。

- [matplotlib入門](http://bicycle1885.hatenablog.com/entry/2014/02/14/023734)
- [【Python入門】すぐわかる！matplotlibライブラリの使い方](https://www.sejuku.net/blog/54285)
- [【Python入門】ライブラリmatplotlibの基本的な使い方](https://qiita.com/Morio/items/d75159bac916174e7654)
 
また、pythoを使った統計ではNaNの処理が重要です。

- [【NANって何だ？】意味・pythonでの使い方を解説します！](https://www.sejuku.net/blog/68519)
- [pandasで欠損値NaNを除外（削除）・置換（穴埋め）・抽出](https://note.nkmk.me/python-pandas-nan-dropna-fillna/)

### 統計の知識

分析では主に回帰分析と基礎分析が重要です。

##### 回帰分析
- [単回帰分析とは](https://www.albert2005.co.jp/knowledge/statistics_analysis/multivariate_analysis/single_regression)
- [重回帰分析とは](https://www.albert2005.co.jp/knowledge/statistics_analysis/multivariate_analysis/multiple_regression)
- [決定係数と重相関係数](https://bellcurve.jp/statistics/course/9706.html)

##### 基礎分析
- [基礎分析の必要性とその目的 | システムトレードはじめの一歩](http://highfai.com/systemtrade/article0106.html)
- [Pandasを用いた基礎分析](http://blog.brainpad.co.jp/entry/2014/12/10/204111)

### その他必要なこと
  
##### 調べる力
分析に限った話ではありませんが、調べる力はとても重要です。

##### データベース(SQL)
分析ではデータベースを操作することが多いです。SQLでのデータベースの操作に慣れておきましょう。

- [SQLって何？](https://qiita.com/nishiy-k/items/49b3b658fb90d3e8fed3)
- [初心者が押さえておきたいSQLの基本構文（文法）](https://www.epano-school.com/blog/mamechishiki-31/)

##### スクレイピング

webサイトから情報を取得する際必要になります。

- [【Python入門】Webスクレイピングとは？サンプルコード付きでご紹介](https://blog.codecamp.jp/python-scraping)
- [Python Webスクレイピング 実践入門](https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406)
AVCaptureVideoDataOutputをBGRAで受け取る

AVCaptureDeviceとかでカメラの入力を直接受け取るとyuvで来る。
自前でシェーダ噛ませてRGBに変換してもいいけど、楽にやりたいのであれば`AVCaptureVideoDataOutput`にいい感じのオプションがあるので使う。

```swift
let output = AVCaptureVideoDataOutput()
output.videoSettings = [kCVPixelBufferPixelFormatTypeKey : kCVPixelFormatType_32BGRA] as [String : Any]
```

便利
全ての開発者が学ぶべき1つのNim

https://qiita.com/poly_soft/items/e89bc757596cfdfba784
https://qiita.com//outlandkarasu@github/items/a2243eb3adbe906ec30d
のパロディ(パクリ)です。ご了承ください。

@ishidakei　誤字訂正ありがとうございました！
# その1 - Nim
トップバッターはこの言語。
Nimは、2008年に公開されたコンパイル言語の一つです。

![download.jpeg](https://qiita-image-store.s3.amazonaws.com/0/238002/25549b57-9983-bec5-0214-51ffd50cbaf8.jpeg)

この言語は様々な用途で使うことができます。
**システム、web、デスクトップアプリケーション、ゲーム、人工知能...**それだけにとどまりません。
これらすべて、すでにNimmerによって提案・開発がなされています。

サーバーやカーネルまで開発した人間もいます。

なんせこの言語、**Cのライブラリを使える**ということもあり、Cに募った莫大な財産を利用することができるのです。( 実際に僕もWinAPIを使ったことがあります。)
もちろん、Nimのためにできたライブラリも山ほどあり、それらはパッケージ管理ソフト**nimble**でらくらくインストールできます。
もしあなたが「何かやりたい！」っていう分野があれば、ぜひNimでやってください。

# その2 - Nim
続いてNim。

Nimなんて初めて聞いた方もいるかもしれません。
なんせNimはまだv1.0にもなっておらず、少々マイナーな言語です。

**この言語はなんと言っても文法のかきやすさ・読みやすさに優れています。**

```nim:fib.nim
proc fib(n: int): int =
  if n < 2 :
    return n
  else :
    return fib(n - 1) + fib(n - 2)

echo fib(15)
echo 15.fib
echo fib 15
```

とにかく簡潔で無駄がないのです。
`int main(..)`~ とか、`...lic class .. `~とか、よくわからないモノは書かなくていいのです。
いちいち括弧つけてコードを書く時代はもう終わり。

また文法が簡潔なだけでなく、**手続き型、命令形、オブジェクト指向などで書くこともでき、メタプログラミングもサポートされ、文法の多様性にも優れています。**

もしあなたがPythoninstaなら、Pythonを静的向けにした感じだと思っていただいたほうが把握しやすいかと。

# その3 - Nim
次はこの言語。

Nimは2008年にアンドレアス・ランプフによって開発された言語です。

この言語はなんと言っても、**処理が非常に高速です**。
言語のベンチマークをはかるサイトはたくさんありますが、**中でもNimはいつも上位にいます**。
https://github.com/kostya/benchmarks

**なんせ、NimのコンパイラはCのコードを吐きます。**
Nimコード --(Nimコンパイラ)--> Cコード --(Cコンパイラ)--> 実行ファイル

Cのコードと言っても、Nimコンパイラの吐くものは「最適化されたCのコード」。普通に人間が書いたCのコードよりも速いことだってあるのです。

ちなみに、Nimはバイナリサイズも小さいです。
これは[Nimの公式ページ](https://nim-lang.org/features.html)にもあります。

# その4 - Nim
ラストを飾るのはこの言語。
Nimという言語は聞いたことがない方も多いかもしれませんが、簡潔な文法ながら処理の速い、いわずとしれた万能言語です。

そんな万能言語を、あなたはもっと触ってみたいと思いませんか？

あなたがこの言語を触ることによって、Nimがまたさらに普及します。
そうすると、世界中の老若男女が、"今よりもっと"軽量なソフトウェアを"今よりもっと"簡単に制作・改造して世界中に公開でき、またそれを"今よりもっと"容易に利用できる、夢の社会を築く一員となることができます。

そんな社会の変革に、乗り遅れてはいけません。

興味の湧いた方は是非、Nimを初めて見てください。
インストール : 
windows : http://nim-memo.hatenablog.com/entry/2016/10/24/173300
macOS : https://qiita.com/nemui-fujiu/items/8b541fb9b1f4654938f7
linux系はあまり情報がありませんが、とにかくターミナルで｢nim｣と打って見るとなんとかわかるかと。
gccのインストールも忘れずに。

チュートリアル翻訳 : https://qiita.com/KTakahiro1729/items/f4776f3a072c01f9086b

# 最後に
というわけで、Nimやろうぜ

そういえばなんでこんな投稿が伸びてるんだろ
Node.jsで数値型が標準出力できない

Node.jsで数値型が標準出力できなくてハマったのでメモ。

# 出力できなかったコード

```js

const STATUS_ENABLE = 1;

process.stdout.write(STATUS_ENABLE);

```

# 出力できたコード
```js
const STATUS_ENABLE = 1;

process.stdout.write(String(STATUS_ENABLE));
```

文字列型に変換しないと出力されないようです。。。
UnityでSSH.NETを導入する方法


ネットワーク関連の処理やエディター拡張などで`SSH`を書きたくなることがあるでしょう。

単純にWebAPIの通信で`https`接続であれば、`WWW`や`WebRequest/HttpWebRequest `や`BestHTTP`などいくつか方法はあると思います。

ですが、[C#でのSSH接続はまた別に方法がいくつかあり](https://www.sftp.net/client-libraries)、今回はUnity C#で`SSH.NET`ライブラリを扱えるようにするためには、どうセットアップすれば良いのかまとめようと思います。

## SSH.NET

.NET専用の[SSH-2](http://higgs.phys.kyushu-u.ac.jp/You-Doc/UNIX/SSH/SSH2.html)ライブラリのようです。

Nuget: https://www.nuget.org/packages/SSH.NET
GitHub: https://github.com/sshnet/SSH.NET


## 導入方法

1. Macの場合、[Mono for macOSをダウンロード](https://www.mono-project.com/)しておくこと。
2. [GitHubのReleasesページ](https://github.com/sshnet/SSH.NET/releases/)から最新バージョンのZipファイルをダウンロードする。
3. 解凍したファイルを`SSH.NET`にリネームし、Unityプロジェクトの`Assets`配下に配置し、SSH.NET/lib配下を`net35`または`net40`のみにします。
![スクリーンショット 2018-11-07 14.33.12.png](https://qiita-image-store.s3.amazonaws.com/0/82601/a140a19d-84ab-fe51-97a8-e78e14f46385.png)


## 使い方

以下の各記事に紹介されているソースコードをもとに実際に触ってみると良いかと。

- [C#でSFTPでファイル転送やってみる](https://yoshinorin.net/2016/12/08/csharp-sftp/)
- [C#でリモートのMySQLやSSH接続をやってみた](https://developer.aiming-inc.com/programming/connect-mysql-and-ssh-for-csharp/)


## さいごに

前回、以下の記事を投稿しました。

- [GCPのVMインスタンスでSFTP接続する方法](https://qiita.com/gremito/items/d53560e3cd4a3b1acbe8)
- [C#でFTP/SFTP機能を作る方法のまとめ](https://qiita.com/gremito/items/1a4875d94983545f2b1e)

私が、SSH.NET（Renci.SshNet）を使いたかった理由は、SFTPをUnity上で実装したかったからです。
もし、似たような開発でお困りの方はコメントなりTwitterなりでコメントもらえると知見の共有程度はできるかなと思います。
テスト投稿を兼ねてMarkdownを触る

#はじめに
はじめましてQiita
投稿練習ついでにMarkdownを使ってみます

行頭に「#」を挿入すると見出しがつきます
レベルに応じて「#」を増やしたり

```
#見出し1
##見出し2
###見出し3
```
#見出し1
##見出し2
###見出し3


##リスト
文頭に「*」をつけると以下のようなリストになります

* りんご
* みかん
* ぶどー

「1.」のように数字に.をつけると↓のようなリストに
1.りんご
2.みかん
3.ぶどう


#引用
文頭に「>」を付けると引用に
ちなみに引用内で>>を使うと二重引用に(～'ω' )～


>ここから引用です、ここで改行！
>まだ引用だよ、今日はすこし寒いですね

###二重引用
>>ここから二重引用、引用の中で引用



#リンク
[ ]でリンクしたい文字を囲って、リンク先のURLを( )で囲む

```
[ぐーぐる](https://www.google.co.jp/)
```

[ぐーぐる](https://www.google.co.jp/)




#ツイートを埋め込む

埋め込みたいツイートからサイト埋め込みURLをコピーして貼り付け


<img width="506" alt="コウメ太夫__dayukoume_さん___Twitter.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/286770/60e1042a-3e85-19c8-3cad-3b9d88483b36.jpeg">





##結果



<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">何があってもあなたの味方よ！と言われたと思ったら～、<br><br>敵でした～。<br><br>チクショー！！　<a href="https://twitter.com/hashtag/%E3%81%BE%E3%81%84%E3%81%AB%E3%81%A1%E3%83%81%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#まいにちチクショー</a></p>&mdash; コウメ太夫 (@dayukoume) <a href="https://twitter.com/dayukoume/status/1054651303886876673?ref_src=twsrc%5Etfw">2018年10月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
puppeteerを使ってlazyloadがSEOフレンドリーかどうか確認する

[Google、SEOに適したLazyloadの仕様を公開 | 海外SEO情報ブログ](https://www.suzukikenichi.com/blog/google-published-lazyloading-guide-for-seo/)
に
>検索エンジンフレンドリーな Lazyload が実装できているかどうかをテストします。
>検証方法の1つとして、ヘッドレスブラウザの Puppeteer を利用したスクリプトを Google は準備しています。

とあったのでさっそく試してみました:muscle: 

## scriptのダウンロード

```sh
❯ git clone git@github.com:GoogleChromeLabs/puppeteer-examples.git
```

## puppeteerのインストール

```sh
❯ cd puppeteer-examples
❯ yarn add puppeteer
yarn add v1.10.1
[1/5] 🔍  Validating package.json...
[2/5] 🔍  Resolving packages...
[3/5] 🚚  Fetching packages...
[4/5] 🔗  Linking dependencies...
[5/5] 📃  Building fresh packages...
success Saved lockfile.
warning Your current version of Yarn is out of date. The latest version is "1.12.1", while you're on "1.10.1".
info To upgrade, run the following command:
$ brew upgrade yarn
success Saved 1 new dependency.
info Direct dependencies
└─ puppeteer@1.10.0
info All dependencies
└─ puppeteer@1.10.0
✨  Done in 91.06s.
```


## puppeteerでページの検証

今回、モバイルページかつbotでの挙動を確認したかったのでpuppeteerにUserAgentの設定を追加しました。
（`screenshotPageWithoutScroll`と`screenshotPageAfterScroll`の二箇所変更する必要があります。）

```diff:lazyimages_without_scroll_events.js
   const page = await context.newPage();
+  await page.setUserAgent('Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)')
```

いざ、scriptを実行。

```sh
❯ node lazyimages_without_scroll_events.js -u https://sotoasobi.net
Lazy images loaded correctly: Passed
Found 0 pixels differences.
Dimension image A: 250x1037
Dimension image B: 250x1037
```

すると、results.htmlにスクロールあり/なしの比較結果が出力されます。

![スクリーンショット 2018-11-07 14.00.46.png](https://qiita-image-store.s3.amazonaws.com/0/611/ea2aaafa-5e5f-5b0a-da23-aa6ff272a1fd.png)

PASSしていた :tada: 

さくっと確認できるのでご自身のサイトで試してみては？ :wink: 

## 余談

>IntersectionObserver API と polyfill を実装するように Google は指示しています。

とありますが、うちのサイトではこれを使ってます :point_down: 

[aFarkas/lazysizes: High performance and SEO friendly lazy loader for images (responsive and normal), iframes and more, that detects any visibility changes triggered through user interaction, CSS or JavaScript without configuration.](https://github.com/aFarkas/lazysizes)

>lazysizes is a fast (jank-free), SEO-friendly and self-initializing lazyloader for images

すばらしいですね。
botかどうかをUserAgentで判断して、lazyloadするかどうか判断してるようです。
https://github.com/aFarkas/lazysizes/blob/gh-pages/src/lazysizes-core.js#L292

以上です :hugging: 

参考
---
- [GoogleChrome/puppeteer: Headless Chrome Node API](https://github.com/GoogleChrome/puppeteer)
- [GoogleChromeLabs/puppeteer-examples: Use case-driven examples for using Puppeteer and headless chrome](https://github.com/GoogleChromeLabs/puppeteer-examples)
- [Google のクローラ（ユーザー エージェント） - Search Console ヘルプ](https://support.google.com/webmasters/answer/1061943?hl=ja)
feature specでクリック直前に座標がずれてクリックできない問題に対する措置

# テストが不安定問題

feature specで、クリックできたり、できなかったりする問題。
Ajaxが終了するのを待っても、sleepしても不安定だった。

なぜ不安定かというと、highchartsなどのグラフ描画ライブラリを使っていて、svgの描画が実行され、アンカー要素が最初にあった位置から移動してしまい、クリックができなかったりしたからだと推測した。

# 画面遷移するまで待つメソッドを定義

待ってもダメなので、何度もクリックさせるような仕組みを作ってみた。

```ruby
module WaitUntilTransition

  # 画面遷移するまでリンクのクリックを行う
  #
  # @param [String] link_text クリックするリンクのテキスト
  # @param [String] within_selector withinを使って領域を絞り込む際のセレクタ
  # @param [String] next_page_selector 次のページに存在するセレクタ。nilの場合は`within_selector`が`next_page_selector`になる
  def wait_until_transition_by_click(link_text, within_selector, next_page_selector=nil)
    if next_page_selector.nil?
      next_page_selector = within_selector
      within_selector = nil
    end
    Timeout.timeout(Capybara.default_max_wait_time) do
      begin
        unless page.all(next_page_selector).present?
          if within_selector.nil?
            find_link(link_text).click
          else
            within(within_selector) do
              find_link(link_text).click
            end
          end
          sleep 1
          if within_selector.nil?
            raise if find_link(link_text, wait: 1)
          else
            if page.all(within_selector).present?
              within(within_selector) do
                raise if find_link(link_text, wait: 1)
              end
            end
          end
        end
      rescue => e
        retry
      end
    end
  end
end

RSpec.configure do |config|
  config.include WaitUntilTransition, type: :feature
end
```

最初のページには存在せず、次のページに存在するセレクタを条件とする。

1. 次のページに存在するはずのセレクタがあるかチェックする
2. 1がなければ、クリックを実行し、多少sleepをした後にまだクリック対象の要素が存在するかチェックする。その際に、タイムアウトを防ぐために、敢えてwaitを短くする。
3. クリック対象要素が存在するようならば画面遷移していないのでraiseで例外を発生させる。
4. retryでもう一度1から3まで試す
5. 1で次ページのセレクタがあれば、画面遷移したと見なす
6. それでもタイムアウトするならば、他に問題がある！

以上。

## 使い方

```ruby
require 'rails_helper'

feature 'サンプル', js: true do
  scenario '次のページに遷移すること' do
    wait_until_transition_by_click '次のページへ', '#pager', '#next-page-selector'
    within '#next-page-selector' do
      expect(page).to have_content '次のページにあるコンテンツ'
    end
  end
end
```

不安定だったテストが今の所100%の成功率になったので、これで様子を見る。
ViewDataBinding.setLifecycleOwner() しないと LiveData が更新されなかった



Databinding、便利ですよね。本格的に使うのは初めてなのですが、もっと早く導入しておけばよかったと思います。

前置きはさておき、下記コードをご覧下さい。

```kotlin:HogeActivity.kt
    binding = DataBindingUtil.setContentView<ActivityHogeBinding>(this, R.layout.activity_hoge).apply {
        setLifecycleOwner(this@HogeActivity) // ★★★これ！
        viewModel = ViewModelProviders.of(this@HogeActivity).get(HogeActivityViewModel::class.java)
    }
```

「★★★これ！」の部分を書いてないと、ViewModel の LiveData にデータをセットしても、GUI に反映されません。自分はこれに気づかず、一時間くらい悩みました。ちょっと悔しかったので、なぜ反映されないのか？を軽く調べました。

LiveData に値を設定するときは、setValue() か postValue()(メインスレッドで setValue() してくれる) を使うと思います。ということで setValue() を見てみます。

```LiveData.java
    @MainThread
    protected void setValue(T value) {
        assertMainThread("setValue");
        mVersion++;
        mData = value;
        dispatchingValue(null);
    }
```

dispatchingValue() という部分が怪しいですね。

```LiveData.java
    private void dispatchingValue(@Nullable ObserverWrapper initiator) {
        //
        // 中略
        //
        do {
            mDispatchInvalidated = false;
            if (initiator != null) {
                considerNotify(initiator);
                initiator = null;
            } else {
                for (Iterator<Map.Entry<Observer<T>, ObserverWrapper>> iterator =
                        mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
                    considerNotify(iterator.next().getValue());
                    if (mDispatchInvalidated) {
                        break;
                    }
                }
            }
        } while (mDispatchInvalidated);
        //
        // 中略
        //
```

inititator とやらは null なはずなので、else のほうに入ります。デバッガで見てみたところ、ここの mObervers が 0 になっていました。なので、considerNotify() まで到達しないですね。

mObserves が登録される場所を探してみました。

```LiveData.java
    @MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
        if (owner.getLifecycle().getCurrentState() == DESTROYED) {
            // ignore
            return;
        }
        LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
        //
        // 中略
        //
    }
```
mObservers.putIfAbsent() で無事に増えています。言い換えれば、observe() が呼ばれないと増えないわけです。


ところで、observe() の引数に、LifecycleOwner が出てきました。@NonNull 指定なので、（バグってなければ）LifecycleOwner が入っていないと呼ばれることはないはずですね。なので、最初の「★★★これ！」を怠ると、LiveData が更新されない、ということにつながります。

せっかくなので、ViewDataBinding.setLifecycleOwner() を読み進めましたが、思いのほかあちこちに飛ぶので、すっきりしませんが、また機会があれば調べたいと思います。結論としては、setLifecycleOwner() はちゃんと呼びましょう、ということで。
iOS Safari が自動で追加する電話リンクを CSS だけで無効にする

iOS Safari さんの小さな親切が大きなお世話なときの処方箋です。忘備録として。

## 1.「電話リンクを自動で追加してくれるのはありがたいんだけど、これは電話番号ではないのだよ」というとき

iOS Safari が `<a href="tel:0123456789">` のようなリンクタグを追加するので、CSS セレクタには `a` を含めるようにします。[pointer-events](https://developer.mozilla.org/ja/docs/Web/CSS/pointer-events) は、クリックを無効化する CSS プロパティですね。

```html
<style>
.disable-auto-tel a[href^="tel:"] {
  color: inherit;
  text-decoration: none;
  pointer-events: none;
}
</style>
<p class="disable-auto-tel">0123456789</p>
```

## 2.「電話リンクは自分で設定するから、余計なお世話は不要だぜ」というとき

小さな親切が不要なときは、こうします。

```html
<meta name="format-detection" content="telephone=no">
```
俺でもわかるJIRAのインストール

俺です。

Atlassian人の機運を高めるために[JIRA](https://ja.atlassian.com/software/jira)を入れることにしました。

# 構成

ALB(https) -> EC2(JIRA http)
JIRA Server Edition

# JIRAのインストール

```
[ec2-user@ip-172-16-132-133 ~]$ sudo ./atlassian-jira-core-7.12.3-x64.bin
Unpacking JRE ...
Starting Installer ...
10 31, 2018 6:26:01 午前 java.util.prefs.FileSystemPreferences$1 run
情報: Created user preferences directory.

This will install JIRA Core 7.12.3 on your computer.
OK [o, Enter], Cancel [c]
o
Choose the appropriate installation or upgrade option.
Please choose one of the following:
Express Install (use default settings) [1], Custom Install (recommended for advanced users) [2, Enter], Upgrade an existing JIRA installation [3]
1
Details on where JIRA Core will be installed and the settings that will be used.
Installation Directory: /opt/atlassian/jira
Home Directory: /var/atlassian/application-data/jira
HTTP Port: 8080
RMI Port: 8005
Install as service: Yes
Install [i, Enter], Exit [e]
i

Extracting files ...


Please wait a few moments while JIRA Core is configured.
Installation of JIRA Core 7.12.3 is complete
Start JIRA Core 7.12.3 now?
Yes [y, Enter], No [n]
y

Please wait a few moments while JIRA Core starts up.
Launching JIRA Core ...
Installation of JIRA Core 7.12.3 is complete
Your installation of JIRA Core 7.12.3 is now ready and can be accessed via
your browser.
JIRA Core 7.12.3 can be accessed at http://localhost:8080
Finishing installation ...
```
# JIRAのセットアップ

- NLBを準備してEC2に刺します.なぜやらにゃあかんのかKBあったはずだけどURL忘れた
- JIRAインストールウィザードから俺たちの使う最強のジラ設定をします
- ログインページに遷移できれば完了です

# HTTPS Proxy設定(Connectorの変更)

今回の構成ではALB(https)からくるprotocolをEC2(JIRA)が理解できません。
JIRAのProxy設定をしこみます。

- `${ATLASSIAN_BASE}/jira/conf/server.xml`

```
# vi /opt/atlassian/jira/conf/server.xml
     77         <Connector port="8080" relaxedPathChars="[]|" relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;"
     78                    maxThreads="150" minSpareThreads="25" connectionTimeout="20000" enableLookups="false"
     79                    maxHttpHeaderSize="8192" protocol="HTTP/1.1" useBodyEncodingForURI="true" redirectPort="8443"
     80                    acceptCount="100" disableUploadTimeout="true" bindOnInit="false" secure="true" scheme="https"
     81                    proxyName="jira.andgate.co.jp" proxyPort="443"/>
```

# ALBエンドポイントへの変更

- NLBをALBに変更します
リポジトリの作成からPull Requestするまでの簡単な流れ

Gitを扱って約３ヶ月経ちました。基本的な流れのメモです。

①リポジトリを新たに作成

```
KunionoMacBook-puro:~ terada$ cd workspace
KunionoMacBook-puro:workspace terada$ cd DemoApp
KunionoMacBook-puro:DemoApp terada$ git init
```

②自分のローカルPCで編集するために、リポジトリのURLをセットしてクローン

```
git clone URL
```

③ブランチの作成
ブランチの操作

```
git branch add_tableview
```
ブランチ名はざっくりしたわかりやすい名前にする
これでブランチを切る事ができる
「git branch」と打つといまどこにあるのかを確認できる

```
KunionoMacBook-puro:DemoApp terada$ git branch
 add_tableview
* master
```

④masterから出て違うところで作業したいときは「checkout」をする。

```
KunionoMacBook-puro:DemoApp terada$ git checkout add_tableview
Switched to branch 'add_tableview'
KunionoMacBook-puro:DemoApp terada$ git branch
* add_tableview
 master
```

⑤編集ののち、

```
git add ファイル名
git commit
git push origin add_tableview
```
で更新

⑥githubでプルリクエストボタンが表示されるので作成し、更新内容をタイトルに付ける。
CarrierWaveでアップロードしているファイルを削除する

日本語の記事がすぐには見つけられなかったためメモ。


CarrierWaveのアップローダーでマウントされているファイルを削除したい場合、CarrierWaveで用意されている `remove_{カラム名}!` メソッドを呼び、そのあとsaveすれば良い。

```ruby:controllerまたはconsoleなど
@user.remove_image!
@user.save
#=> true
```

# 参考

公式ドキュメントに詳しく書いてあります。
[carrierwaveuploader/carrierwave]
(https://github.com/carrierwaveuploader/carrierwave)
EBSスナップショット取得について

# Amazon Data Lifecycle Manager(DLM)

## 概要
Amazon Data Lifecycle Manager(DLM)でのバックアップ取得についてまとめた。
AWS Management ConsoleあるいはAWS CLIにて設定可能。

## 保存料金以外のコスト
- DLM自体のコストは無償
- ただし以下のコストは発生する
    - CloudWatch
    - CloudTrail

## 初回実行時の設定項目
- デフォルトIAM Role作成
- ライフサイクルポリシー設定
    - ターゲットボリュームのタグ
    - スケジュール名	
    - スナップショットへ付与するタグ
    - スナップショットの取得頻度
    - スナップショット取得開始時刻
    - 保持世代数
- 対象ボリュームにタグ付与

## スナップショットを取ることによるセキュリティレベル低下の可能性
明示的に共有設定を変更しない限り、外部アカウントへは公開されない

## 参考
- https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EBSSnapshots.html
- https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/snapshot-lifecycle.html
- https://dev.classmethod.jp/cloud/aws/amazon-dlm-tokyo-region/
- https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-modifying-snapshot-permissions.html
wp-cli で WordPress のコア、プラグイン、テーマ、翻訳をアップデートするコマンドのメモ

# WordPress コアのアップデート

```
$ wp core update
$ wp core update-db
```

# プラグインのアップデート

```
$ wp plugin update --all
```

# テーマのアップデート

```
$ wp theme update --all
```

# 翻訳のアップデート

```
$ wp language core update
$ wp language plugin update --all
$ wp language theme update --all
```

# 参考

## wp-cli のバージョン

```
$ wp --version
WP-CLI 2.0.1
```
GrandstreamのATAとSIPレジストとボイスワープを組み合わせて 電話番号も電話機も変えずにTwilioを導入する

#はじめに
Twilio便利です。便利なんですが、話すと大抵言われる（私だけですかね？）のが
- 今の電話番号のまま使えない？
- 電話機変えるの面倒
といった話。確かに、どうしたものか。

そんなある日、こんな記事を見つけてしまったのです。
[VoIPアダプタ(HT701)でIP電話を固定電話化することで家の電話代を0円に](https://itevangelist.net/blog/voip-adapter-ht701-ip-phone-change-to-fixed-line-phone/)
おぉ、家の電話機をIP電話に変える装置なんてものがあるなんて凄いなぁ。

そしてまたある日、こんな記事を見つけてしまったのです。
[SIPレジストを使って、Twilioで固定電話をつかってみる](https://qiita.com/mobilebiz/items/26f91550556088545c49)
おぉ、TwilioにSIP電話機をぶら下げられるなんて凄いなぁ。

ん？？？待てよ？
- 家の電話機をIP電話に変える
- IP電話に変えた家の電話機をSIPレジストでTwilioにぶら下げる
- 家の元々の番号をボイスワープでTwilioの050番号に転送する
お？？？これで電話番号も電話機も変えずにTwilio導入出来るのでは？

ということで試してみました。

#Twilio番号用意＆SIPレジスト
これは元記事そのままな感じです。
[Twilio側の設定](https://qiita.com/mobilebiz/items/26f91550556088545c49#twilio%E5%81%B4%E3%81%AE%E8%A8%AD%E5%AE%9A)

以下は補足
- FRIENDLY NAMEは分かりやすいものであれば何でもOK
- IP ACCESS CONTROL LISTSは電話機のIPアドレス。電話機側のネットワークのグローバルアドレスって、固定IPじゃないとこれ登録難しい？
- CREDENTIAL LISTSは登録のID・パスワードのセットを自分で作るやつなので、適当なものを
- 最後にSIP RegistrationをEnabledにする

そして、とりあえず今回は着信のみやってみるということにし、以下050番号のセットアップ。これもほぼ元記事通り。
[SIP電話機への着信設定](https://qiita.com/mobilebiz/items/26f91550556088545c49#sip%E9%9B%BB%E8%A9%B1%E6%A9%9F%E3%81%B8%E3%81%AE%E7%9D%80%E4%BF%A1%E8%A8%AD%E5%AE%9A)
最近のIFだと番号購入したらその流れでTwiML Binの作成も出来る。以下のような感じ。
![スクリーンショット (10).png](https://qiita-image-store.s3.amazonaws.com/0/260443/7fc1702e-e5ed-5a2c-0b91-576ed0ffa73d.png)

#家の電話機をIP電話にする with grandstream　ATA
電話機版のマニュアルであるが米国Twilioのサイトに接続マニュアルが存在する
https://www.twilio.com/docs/documents/2/GrandStreamGXP2130CfgGuide.pdf
以下は補足
- ATAの管理画面のIPアドレスの調べ方はATAセット後に受話器を取り「＊」を3回押すと、英語のガイダンスが流れてきますのでそのまま「０２」と入力します。すると、「IP address！ 192.168.×.×」というように、IPアドレスを英語で読み上げてきますのでそれをメモしてブラウザでアクセスすればOK。
- Account Nameは適当でOK
- SIP Serverはus1込みで設定済みのSIP URI（xxxx.sip.us1.twilio.com)
- Outbound ProxyはSIP Serverと同じ（xxxx.sip.us1.twilio.com)
- SIP User IDはクレデンシャルリストで設定したID
- Authenticate IDはSIP User IDと同じ（＝クレデンシャルリストで設定したID）
- Authenticate Passwordはクレデンシャルリストで設定したパスワードと同じ
あとはマニュアル通り進めれば問題ない

ちなみに今回実験に使ったのは[Grandstream HT701 VoIPアダプター ATA 1-FXS](http://amzn.asia/d/9myRp3P)でした。

#家の電話をボイスワープで転送する
実は電話機で「142」と押すとガイダンスに従って設定出来てしまったりする
https://flets.com/hikaridenwa/use/pdf/voice.pdf
勿論契約状態にもよるが、意外に知られていないかも

#まとめ
というわけで、勢いで書いてしまいました。固定IPといいボイスワープといい、ちょっと前提が普通じゃない感じになってしまった。もう少し簡単に導入出来たらいいなと思うので、引き続き考えていこうと思います。
phpbrewでPHP7.1、Laravel 5.2の環境を作る

## コマンド

```sh
$ phpbrew install 7.1.23 +default+dbs
$ phpbrew use 7.1.23 #一時的に使う
$ phpbrew switch 7.1.23 #ずっと使う
```

## 参考
https://laravel.com/docs/5.2/installation
### Laravel 5.2 Requirements

```
PHP version between 5.5.9 - 7.1.*
OpenSSL PHP Extension
PDO PHP Extension
Mbstring PHP Extension
Tokenizer PHP Extension
```

### phpbrew variants
https://github.com/phpbrew/phpbrew#variants

```
default:    bcmath, bz2, calendar, cli, ctype, dom, fileinfo, filter, ipc,
              json, mbregex, mbstring, mhash, mcrypt, pcntl, pcre, pdo, phar,
              posix, readline, sockets, tokenizer, xml, curl, openssl, zip
dbs:        sqlite, mysql, pgsql, pdo
```
turbolinksとaudioタグで再生され続ける

turbolinksを使って、Audioタグで音声を再生させていると、リンクをクリックしても音声が再生され続ける。
この問題の手っ取り早い解決方法

```coffee-script
$(document).on 'turbolinks:click', ->
  $('audio').remove();
```

とりあえず、クリックとともにAudioタグを消す。
turbolinksとaudioとブラウザバック

1. turbolinksを有効にしているRailsプロジェクト
2. とあるボタンを押すと、Audioタグ（autoplay: true）が現れて音声を再生させる
3. ブラウザバックする

すると、なぜか、戻った時に２で流れていたAudioタグの音声が再生される。
という問題。

特に何も考えずに手っ取り早く治す方法。

```ruby:haml
%meta{ content: 'no-cache', name: 'turbolinks-cache-control'}
```

とりあえず、キャッシュを無効にする。
moment.jsで午前1時30分を "25:30" という文字列で出力させる。

# 実現したいこと

- 午前（つまり深夜の）1時30分を、`"01:30"` ではなくて、`"25:30"` と表示させたい。

- 時間を加える演算、例えば「25時30分の2.25時間後は、27時45分」ということも実現したい。

# 書いたコード

- 上記の、実現したいことは、[Moment.js](https://momentjs.com/) にちょっと手を入れたらできるのでは？と思ったので、ざっくりスパイクしてみました。

- 書いたコードは、以下のレポジトリにあります。

  - https://github.com/jun68ykt/moment-h25

- Momentに手を入れてるコードは以下の `momentH25conf(startHour)` です。

```javascript
function momentH25conf(startHour) {

  // checking the parameter "startHour"
  if (!Number.isInteger(startHour)) return;
  if (startHour <= 0 || startHour > 12) return;

  // add getter "hhmm"
  moment()
    .constructor
    .prototype
    .__defineGetter__('hhmm', function() {
      let hour = this.hour();
      if (hour < startHour)
        hour += 24;
      const hh = `${hour < 10 ? '0':''}${hour}`;
      return `${hh}:${this.format('mm')}`;
    });

  // enhance moment() to handle the parameter with "HH:mm"(HH >= 25) format String
  const _moment = moment;

  window.moment = function() {
    if (arguments.length === 2 && arguments[1]=== 'HH:mm') {
      const matches = /^([0-9]{2}):([0-9]{2})$/.exec(arguments[0]);
      if (matches) {
        const h = parseInt(matches[1]);
        if (24 < h && h < 24 + startHour) {
          return _moment().add(1, 'day').hour(h-24).minute(parseInt(matches[2])).second(0);
        }
      }
    }
    return _moment(...[...arguments]);
  };

  window.hhmm = function(s) {
    return window.moment(s, 'HH:mm');
  };
}

```


# できること

- [READMEのsamples](https://github.com/jun68ykt/moment-h25#samples) にも書きましたが、以下のようなことができます。

```javascript
const t0 = hhmm('00:00');
console.log(t0.hhmm); // "24:00"
```

```javascript
const t1 = hhmm('24:00');
console.log(t1.hhmm); // "24:00"
```

```javascript
const t2 =hhmm('21:45');
console.log(t2.hhmm); // "21:45"
```

```javascript
const t3 = hhmm('05:21');
console.log(t3.hhmm); // "29:21"
```

```javascript
const t4 = hhmm('28:15');
console.log(t4.hhmm); // "28:15"
```

```javascript
const t5 = hhmm('21:00');
const t6 = hhmm('26:45');
console.log(t6.isAfter(t5));  // true
console.log(t5.isBefore(t6)); // true
console.log(t6.diff(t5, 'minutes')); // 345
console.log(t6.diff(t5, 'hours'));   // 5
console.log(t6.diff(t5, 'hours', true)); // 5.750271388888889 (or float value nearly 5.75 ) 
```

```javascript
const t7 = hhmm('22:45');
const t8 = t7.add(4.5, 'hours');
console.log(t8.hhmm); // "27:15"

const t9 = t8.add(-20, 'minutes');
console.log(t9.hhmm); // "26:55"
```

以上です。３０分ぐらいでざっくり書いたコードですので、見落としがあるかもしれません。
何かツッコミあれば下さい。
nth-child と nth-of-type の違いが今までわかっていませんでした。

# 前提
- nth-child と nth-of-type をなんとなく使っていた方向け

# 環境
- CodePen

# TL;DR
端的に言うと、

- nth-child は、親要素の n 番目にマッチする場合
- nth-of-type は、 親要素にある指定の要素のうち、 n 番目にマッチする場合

にそれぞれスタイルが当たるようになっています。

<p data-height="265" data-theme-id="0" data-slug-hash="LXpmEX" data-default-tab="html,result" data-user="smartponzu" data-pen-title="nth-child vs nth-of-type" class="codepen">See the Pen <a href="https://codepen.io/smartponzu/pen/LXpmEX/">nth-child vs nth-of-type</a> by FumiyaShibusawa (<a href="https://codepen.io/smartponzu">@smartponzu</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 詳細

上記の CodePen をみてみると、div を親要素として、h2、p、p、pという順で子要素が並んでいるのが分かると思います。ここで以下のスタイルを当てます。

```scss
#nth-child {
  p:nth-child(1) { // これは当たりません。
    color: red;
  }
  p:nth-child(2) {
    color: red;
  }
}

#nth-of-type {
  p:nth-of-type(1) {
    color: red;
  }
  p:nth-of-type(2) {
    color: blue;
  }
}
```

## nth-child の場合
親要素が持っている子要素のうち、 n 番目に対象の要素があった場合にのみスタイルが当たります。

CodePen の例でいうと、1番目の子要素に p タグはないので、 `p:nth-child(1)` にはスタイルが当たりません。 p タグが出てくるのは2番目からなので、 `p:nth-child(2)` であればスタイルは当たります。

## nth-of-type の場合
親要素が持っている子要素の **指定するセレクター** のうち、 n 番目に対象の要素があった場合にのみスタイルが当たります。この場合は、予め擬似クラスをあてるセレクター（ p タグ）に限定してくれます。 `p:nth-of-type(1)` であれば、子要素の中の p タグのうち、1番目のものにスタイルが当たります。

# 参考文献
https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child
https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-of-type
App Store Connectで有料アプリケーションの法人登録について

# App Store Connectで有料アプリケーションの法人登録

登録作業について途中からになりますがメモ (2018/11/7)

## 契約／税金／口座情報

### Contact Info  
最初、誰も登録されていないので「Add New Contact」で登録して選択ればOK

### Bank Info
全銀コードを確認しておけばOK

### Tax Info
ここが一番めんどくさい

1. 「U.S. Tax Forms」→「Set　Up」

2. Are you a U.S. citizen, U.S. resident, U.S. partnership, or U.S. corporation?  
米国人か米国に住んでる？:「No」→Submit  

3. Do you have any U.S. Business Activities?  
米国でビジネスしているか？:「No」→Submit  

4. TaxInfo

- 3.Type of Beneficial Owner
法人なので「Corporation」を選択

- [ ]  I declare that the individual or organization 〜
デベロッパープログラムの使用許諾契約書に記載されている個人または組織が、かかる契約に基づいて行われた支払いの有益な所有者であることを宣言するのでチェック

- Name of Person Making this Declaration
宣言をする人の名前(自分)

- Title
役職名

#### Part I

- 8. TIN, if required  
「EIN」と番号を入力

#### Part III

- 14.1 該当項目に適合するならチェック
  - [ ]  a. The beneficial owner is a resident of Japan 〜  
日本の居住者です
  - [ ]  b. he beneficial owner is a resident of Japan 〜  
租税条約の特典制限条項の〜　　
     - [ ]  Subsidiary of a publicly traded corporation: 上場企業の子会社
  - [ ]  c. The beneficial owner derives the item〜  
外国法人から受領した配当の〜

#### Part XXX

- [ ]  Under penalties of perjury, I declare that〜  
私の知識と信念の情報を真実で正確かつ完全であると判断したことを宣言するのでチェック

> I agree that I will submit a new form within 30 days if any c ertification on this form becomes incorrect

間違ってたら30日以内に再提出します

- [ ]  I certify that I have the capacity to sign for the entity identified on line 1 of this form  
フォームへの署名権利があるのでチェック

→Submitで送信
若手が今後必要になるプログラミング言語

**若手**プログラマ、又は**これから**プログラマになる人が今後必要になるプログラミング言語とその他必要なものを紹介していきます。

# これだけは絶対必要なプログラミング言語

なし


#### 強いて言うなら、なにか好きな言語
今時言語なんてなんでも良いんですよ。
好きな言語や作りたいものが作りやすい言語、なんか一つやってれば必要になったとき、勉強したくなったときに新しい言語の勉強をすれば良いです。

# 若手プログラマに求められるもの

今後の成長度

#### 今後どれだけ成長できるかが一番重要

精神論的な話に聞こえるかもしれないですが、**やる気**が求められます。
今後どれだけ成長して、その会社に貢献してくれるのかを重視するからです。
もちろん「やる気があります！」とか言いながら、プログラミング言語をほとんど触ったこともない人は*やる気があるある詐欺*です。
行動で示すことが求められます。


---
# おすすめ言語
ここからはちょっと話が変わります。
個人的におすすめしたい言語や技術に関して緩く紹介します。

- Ruby
- Java
- Go
- Scala

## Ruby
動的型付け言語でスクリプト言語などと呼ばれたりします。
Rubyはweb業界(特にベンチャー)で多く使われています。
簡単に書ける事と日本人が生みの親のため日本語資料が多い事から、初心者の最初の言語として勧められたりします。
ですが本質としては熟練したプログラマが楽しく、自由にかけることを追い求め、書き手に分別が求められます。
Rubyではメタプログラミングと言うものが書きやすくなっており、メタ的に書くことを推奨している言語でもあると思います。

世間一般でRubyというと、同じくらい`Ruby on Rails(通称Rails)`という用語を聞くと思いますが、これはフレームワークといういわば3Dプリンターの様なものです。
使い方と設計図さえあればあとは良い感じにやってくれるものなので、Rubyとは混同しない様にしましょう。
(`Ruby on Rails`も突き詰めればどんどん技術が必要になりますが、ここでは省略します)

## Java
静的型付け言語でしっかりと腰を据えて書く様な言語です。
Javaは世界的に使われていた期間が長く、今でもそれなりに現役な言語です。
そのため受注や長期間の安定した動作が求められる現場では、今も大きな人気を持っています。
しかし最近のweb業界では嫌われる傾向にあります。
なぜならRubyやPythonと言った言語と違って、冗長なくらい書く量が多いからというのが1番目につく理由です。
この言語ではオブジェクト指向という部分が勉強しやすいです。
冗長なくらいしっかりと書くため、Rubyなどでは省略されている部分も自分で書くことが求められるからです。
ちなみにですが何回言われてるかわからないくらいですが、JavaとJavaScriptは**全く別の言語です!!!!!**
書き方、実行方法、挙動、などなど全くもって違います。
インドとインドネシアくらい違います。
違いについて詳しく書かれた記事があるので、明確に知りたい方は[こちら](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Introduction#JavaScript_and_Java)をご覧ください
JavaScriptの書き方についてだいたい知りたいなら、[ECMAScript](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Introduction#JavaScript_and_the_ECMAScript_Specification)と検索すると名前が似ていないため調べやすいです。


## Go
静的型付け言語でシンプルに記述できる言語です。
GoはGoogleにより制作され、すでに仕様がシンプルに完成されています。
今後、仕様が大きく変わることはなく安心して使うことができるのではないでしょうか。
Goの良いところは、仕様がシンプル、速度が早い、Javaなどと比べると簡潔に書ける、並列処理が素晴らしい、と言った点があげられます。
しかしオブジェクト指向ではあるのですが、仕様をシンプルにするために全てのオブジェクト指向を網羅していません。
オブジェクト指向を学ぶのには向いていないと思います。
最近では現場でも多く使われ始めているため、学んでおいても損はないと思います。

## Scala
静的型付け言語でオブジェクト指向と関数型をちょうど良い塩梅で融合した言語でもあります。
Scalaでは型という部分が非常に重要視され、初心者が学ぶには非常に難易度の高い言語となっています。
ですが関数型という考え方は一度触っておくと見えるものが違ってくるのではないでしょうか。
Scalaを使った開発では長期間の工期が必要になります。
しかしその分、型という制約でガチガチに縛っているため非常に安全で安定性のあるソフトウェアが書けます。
(*DDD*などの開発手法をとる場合に非常に向いている言語だとも思っています)

## (おまけ)よく使われてる気がする言語一覧
- C/C++ (組み込み系、競技プログラミング)
- Java (保守、安定性を求めるソフトウェア)
- C# (VisualC#でWindowsアプリ、Xamarinでスマホアプリ等)
- Kotlin (Webアプリ、スマホアプリ)
- Ruby (Webアプリ)
- Python (機械学習、Webアプリ)
- PHP (保守、Webアプリ)
- JavaScript[& TypeScript] (Webアプリ、ReactNativeでスマホアプリ)
- Go (CLIツール、Webアプリ)
- Scala (Webアプリ)
- Swift (iPhoneアプリ)
- SQL (DBの操作)
- Shell系 (CUIで操作するためのBash等、Makefile)

# まとめ
とりあえずなんでも良いから作りたいものを作り、学びたいものを学びましょう！
初心者のうちは*車輪の再発明*大歓迎！
実際に行動することが重要です！


### 参考
[今後必要になるプログラム言語](https://qiita.com/administrator1974/items/387aab2a42bf57e3b215)
webを支える技術

<h1>webとは何か</h1>
<h2>HTTP、URI、HTMLの関係</h2>

![スクリーンショット 2018-10-08 18.22.33.png](https://qiita-image-store.s3.amazonaws.com/0/299225/fbfa13f3-db53-9b22-0e04-d3418ee5f96d.png)


<h2>REST</h2>
- クライアント/サーバー：クライアントとサーバーで処理を分離する
- ステートレスサーバー：サーバーがアプリケーション状態を管理しない
- キャッシュ：一度取得したリソースをクライアント側で使い回すことでサーバーとクライアントの通信回数を減らす
- 統一インターフェース：インターフェースを統一する（HTTPのメソッドは8つのみ）
- 階層化システム:システムを階層化することで負荷を分散させたり、アクセスを制限できる
- コードオンデマンド：JavaScriptなどをサーバーからダウンロードすることでクライアントの機能を拡張できる


<h1>URI</h1>
クールURIとは「変わらないURI」であり「シンプルなURI」

- プログラミング言語に依存した拡張子やパスを含めない
- メソッド名やセッションIDを含めない
- URIはリソースを表現する名詞にする


<h1>HTTP</h1>
HTTPはTCP/IPをベースとしたプロトコル。
![スクリーンショット 2018-10-08 19.27.49.png](https://qiita-image-store.s3.amazonaws.com/0/299225/051b600d-b017-b800-d462-762ed7e8dd6c.png)

- ネットワークインタフェース層：物理的なケーブルやネットワークアダプタ
- インターネット層：指定したIPアドレスを送り先としてパケット単位でデータを送り出す
- トランスポート層：データの送り先に対してコネクションをはることでデータの抜け漏れをチェックする。転送するデータがどのアプリケーションに渡るかを決定するのがポート番号。サーバ側のHTTPはデフォルトで80番。
- アプリケーション層：メールやDNS、HTTPなどのインターネットアプリケーションを実現する層。

例：技術評論社のWebサイトであるgihyo.jpにアクセスした場合
クライアントは、まずDNSを使ってgihyo.jpのホスト名を名前解決し、その結果得られるIPアドレスのTCP80番ポートに接続して、リクエストを送信する。

クライアントで行われること
1. リクエストメッセージの構築
2. リクエストメッセージの送信
3. （レスポンスが返るまで待機）
4. レスポンスメッセージの受信
5. レスポンスメッセージの解析
6. クライアントの目的を達成するために必要な処理

画像やスタイルシートへのリンクが含まれるため何度もリクエストを発行しなければ正しくHTMLをレンダリングできない。

サーバーで行われること
1. (リクエストの待機)
2. リクエストメッセージの受信
3. リクエストメッセージの解析
4. 適切なアプリケーションプログラムへの処理の委譲
4. アプリケーションプログラムから結果を取得
5. レスポンスメッセージの構築
6. レスポンスメッセージの送信

<h3>HTTPのステートレス性</h3>
ステートレスとは「サーバーがクライアントのアプリケーション状態を保存しない」

<h2>HTTPメソッド</h2>

|メソッド  　　　　|意味 　　　　　　　　　　　　　　|    
|:-----------------|:------------------|
| GET             |リソースの取得               |     
| POST           |子リソースの作成、リソースへのデータの追加、そのほかの処理            　　　　　　　　 |      
| PUT             |リソースの更新、リソースの作成               |      
| DELETE               |リソースの削除 |     
| HEAD             |リソースのヘッダ（メタデータ）の取得 |  
| OPTIONS          |リソースがサポートしているメソッドの取得 |  
| TRACE               |プロキシ動作の確認                 |     
| CONNECT             |プロキシ動作のトンネル接続への変更              |  


<h3>POSTとPUTの使い分け</h3>
POST　:　URIの決定権はサーバー（TwitterのようにつぶやきのURIをサーバー側が自動的に決定する場合）
PUT　:　URIの決定権はクライアント（wikiなどのようにクライアントが決めたタイトルがそのままURIになるような場合）

HTMLのフォームで指定できるメソッドはGETとPOSTの２つだけのためPOSTでPUTとDELETEを代用する方法がある。
1. _methodパラメータ
input type="hidden" id="_method" value="PUT"
2. X-HTTP-Method-Override
X-HTTP-Method-Override: PUTという記述をヘッダに含める

<h3>べき等性と安全性</h3>
- べき等性　：　ある操作を何度行っても結果が同じこと
- 安全　：　操作対象のリソースの状態を変化させないこと

| メソッド       |性質        |  
|:-----------------|:------------------|
| GET、HEAD             |べき等かつ安全               | 
| PUT、DELETE          |べき等だが安全でない             |  
| POST            |べき等でも安全でもない               | 

- GETのリクエストを何度行ったとしても結果もリソースの状態も変わらない。
- PUTとDELETEは何度送信しても結果が変わらない。例えばDELETEはリソースを削除すれば再びリクエストを送信すると404 NOT Foundが返ってくる。しかし、「リソースが削除されている」という結果は先ほどと同じ。
- POSTは複数回リクエストするとその分だけリソースの状態が変わる。そのため二重注文のような問題が起こる可能性がある。

<h2>ステータスコード</h2>
<h3>ステータスコードの分類と意味</h3>
- 1xx : 処理中
- 2xx : 成功
- 3xx : リダイレクト
- 4xx : クライアントエラー
- 5xx : サーバーエラー

<h2>HTTPヘッダ</h2>
- OpenID : あるwebサービスのアカウントで別のwebサービスにログインできるようにする
- OAuth : Webサービス間でデータをやりとりできるようにする仕様 

<h3>持続的接続</h3>
パイプライン化　：　TCPコネクションを持続的に接続することでクライアントはレスポンスを待たずに同じサーバにリクエストを送信できる。