OmniAICreator/Qiita-1.07M huggingface dataset:
pgRoutingをはじめて使ってみた

# pgRoutingのインストール
`brew install pgrouting`でもインストールできるっぽいけど、依存パッケージにgccなどがあって時間がかかりそうだったので、Dockerでサクっと。

```
cd
docker run -d --rm --name pgrouting -e POSTGRES_PASSWORD=test -p 5432:5432 -v $(pwd)/pgdata:/var/lib/postgresql/data starefossen/pgrouting
```

- ホームディレクトリ下の`pgdata`にデータを保存させる

Dockerが起動したらpsqlで接続する:
パスワードは`test`。

```
psql --host=localhost --user=postgres postgres
```

## AWS RDSでpgRoutingを使う

RDSのpostgresはpgRoutingに対応しており、これだけで使えるようになるのでRDSでも良いかもしれない。

```
create extension postgis;
create extension pgrouting;
```

# 経路探索してみる
データベースを作成し、extensionを導入：

```sql
CREATE DATABASE d1;
\c d1
CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;
```

ダイクストラ法で経路探索してみる。
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%80%E3%82%A4%E3%82%AF%E3%82%B9%E3%83%88%E3%83%A9%E6%B3%95)に載ってるこの無向グラフを`edges`テーブルに投入する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79394/3b3ccc77-a97f-5748-f7a2-7de10d54ffda.png)

```sql
CREATE TABLE edges (id serial, source int, target int, cost int);
INSERT INTO edges (source, target, cost) VALUES (1, 2, 7), (1, 3, 9), (1, 6, 14), (2, 3, 10), (2, 4, 15), (3, 4, 11), (3, 6, 2), (4, 5, 6), (5, 6, 9);
SELECT seq, node, edge, cost FROM pgr_dijkstra('SELECT id, source, target, cost FROM edges', 1, 5, directed:=false);
 seq | node | edge | cost
-----+------+------+------
   1 |    1 |    2 |    9
   2 |    3 |    7 |    2
   3 |    6 |    9 |    9
   4 |    5 |   -1 |    0
(4 rows)
```

ちゃんと`1→3→6→5`という経路が求まっている。

[pgr_dijkstraのリファレンス](https://docs.pgrouting.org/2.3/en/src/dijkstra/doc/pgr_dijkstra.html#pgr-dijkstra)

# もっと巨大なグラフで試したい

[9th DIMACS Implementation Challenge: Shortest Paths](http://www.dis.uniroma1.it/challenge9/download.shtml)
にある`gr.gz`ファイルが手頃な大きさ。権利はパブリックドメインと書いてある。
Distance graphは辺のコストが物理的な距離のもの、Travel time graphはコストが移動時間のもの。有向グラフっぽい。[データの仕様はこちら](http://www.diag.uniroma1.it/challenge9/format.shtml#graph)
下記スクリプトでSQLへ変換できる：

```ruby
#!/usr/bin/env ruby

filename = ARGV[0] || "USA-road-d.NY.gr"
table_name = "edges"

puts <<EOF
INSERT INTO #{table_name} (source, target, cost) VALUES
EOF

i = 0
IO.foreach(filename) do |line|
  a = line.split
  if i != 0
    print ","
  end
  if a[0] == "a"
    puts <<~EOF
    (#{a[1]}, #{a[2]}, #{a[3]})
EOF
    i += 1
  end
end

puts <<EOF
;
EOF
```

# A*

[pgRoutingでA*経路探索してみた](https://qiita.com/aosho235/items/77e2fbfb290a34cbae8e)
GolangでJIS規格の都道府県を扱うライブラリを作った

都道府県をシステムで扱う時、多くの場合[JISX0401](http://kikakurui.com/x0/X0401-1973-01.html)の規格に基づいたコードが振り分けられることがほとんどかと思います。

都道府県は全部で47件と数が少ないためプログラム中にハードコードされる実装も多いかと思いますが[^1]、
そもそも規格があるのだから規格に沿ったライブラリを公開してそれを利用するほうが、規格という共通認識・その実装の再利用といった観点から良いはずです。

多くのプログラミング言語には、JISX0401に沿った都道府県の情報を得るライブラリが存在しているかと思いますが、Golangにおいてはその存在が確認出来なかったため今回実装して公開を行いました。

ライブラリの名称は過去Rubyを利用していた時代に愛用していた[chocoby/jp_prefecture](https://github.com/chocoby/jp_prefecture)をリスペクトし、同じ名前をつけさせていただきました。
https://github.com/diverse-inc/jp_prefecture

## 使い方

以下のimport文を追加することで、ライブラリを利用出来るようになります。

```go
import pref "github.com/diverse-inc/jp_prefecture"
```

都道府県の情報を全件取得するには`List`関数を呼び出します。
取得出来る都道府県情報は、JISX0401で定義されたコード順に並んでいます。

```go
prefs := pref.List()
```

取得出来る都道府県情報は、`Prefecture`というインターフェースを通してアクセスすることが出来ます。

```go
prefs[0].Code()  // 1
prefs[0].Kanji() // "北海道"
prefs[0].Kana()  // "ほっかいどう"
prefs[0].Roma()  // "hokkaidou"
```

また、このライブラリはコード、漢字名、かな名、ローマ字名での検索機能を持っており、個別の都道府県情報を取得するのにも利用出来ます。

```go
// コードで検索
prefInfo, ok := pref.FindByCode(1)
prefInfo.Kanji() // "北海道"

// 漢字名で検索　末尾の「都」、「府」、「県」は省略可
prefInfo, ok := pref.FindByKanji("東京")
prefInfo.Kanji() // "東京都"

// かな名で検索　末尾の「と」、「ふ」、「けん」は省略可
prefInfo, ok := pref.FindByKana("きょうと")
prefInfo.Kanji() // "京都府"

// ローマ字名で検索　末尾の「-to」、「-fu」、「-ken」は省略可
prefInfo, ok := pref.FindByRoma("okinawa")
prefInfo.Kanji() // "沖縄県"

// 存在しないキーで検索すると、都道府県情報はnilとなり、okがfalseになります。
prefInfo, ok := pref.FindByCode(0)
prefInfo // nil
ok       // false
```


[^1]: 市区町村まで含めて扱う場合は、国土交通省が公開している市区町村検索APIなどを利用するケースのほうが多いためハードコードされることはないと思います。
【Looking Glass】Looking Glassでもっと奥を描こう


**2020/01/19**
**LookingGlass購入一周年記念で作った遠景の描画方法を追加しました**

Twitterで簡単に説明しましたが、やはりわかりにくいと思ったので書きました。
開発環境はUnity 2018.2.20f1＋HoloPlay SDK 0.1.4 です。

#はじめに

Looking Glassはどうしても背景（奥方向）の描画が苦手です。
そしてCapture.csのInspectorからビューボリュームを調整するのも結構大変です。
ならばRenderTextureで書き割りを作ってしまえ！というのが今回のネタです。

#結果

まず結果です。
https://twitter.com/aodama/status/1084862221765627905

一番手前の車線の自動車だけが見る角度で変化し、それ以外はRenderTextureの画像になります。

RenderTextureを描画しないとこんな風です
![190116_FakeBGなし.JPG](https://qiita-image-store.s3.amazonaws.com/0/227733/a10d1c1d-756c-0d85-b164-01ba4d1b1366.jpeg)

RenderTextureを描画すると動画のような感じになります
![190116_FakeBGあり.JPG](https://qiita-image-store.s3.amazonaws.com/0/227733/907e564d-be8a-3aef-8336-62d4660c849a.jpeg)

#実装

Looking Glassのビューボリューム外をRenderTextureに描画して、それをLooking Glassで表示範囲に置くだけです。
RenderTextureはQuadに貼り付けてシーンに配置しています。
![190115_FakeBGタネ明かし.png](https://qiita-image-store.s3.amazonaws.com/0/227733/1a8d2bc4-211c-68eb-f408-465c813696a1.png)

ここまではTwitterで説明したので、もうちょっと詳細に。

まずHoloPlay Captureの子にあるHoloPlay Cameraと同じ位置にRenderTexture用のカメラを作ります。この時FovはHoloPlay Cameraと同じ値に設定しましょう。

次に追加したカメラのNear ClipををRenderTextureを置く位置に設定します。手前は描画しなくていいですからね。あとこのカメラでRenderTexture自身を描画しないようにレイヤーを設定してください。

シーン上はこんな感じです。
![190116_FakeBG用カメラ.png](https://qiita-image-store.s3.amazonaws.com/0/227733/65532b2d-aef8-485e-9dd5-f9f0aa752265.png)

これで動画のようなLooking Glassな3Dと背景が共存出来ます。

#調整

RenderTextureを置く位置によって、Looking Glass上での見え方はかなり変わります。
![190116_FakeBGの位置.png](https://qiita-image-store.s3.amazonaws.com/0/227733/4fc1feb3-693c-a194-aea6-6a261ce33015.png)
例えば上の画像のようにRenderTextureを中央付近と奥に置いた場合、中央付近は動画のようなクッキリとした見た目になりますが、奥に置いた場合はこんな感じでかなりジャギジャギします。仕様なので仕方ありません…
![190116_FakeBG奥.JPG](https://qiita-image-store.s3.amazonaws.com/0/227733/f11dacf0-eca9-48c9-8995-6797f7195cc2.jpeg)
そのかわりRenderTextureを奥に置けばLooking Glassのビューボリュームはほぼ全部使えます。これ重要！

少しでもジャギジャギ感を軽減するなら、RenderTextureを低解像度にしてぼかしてしまうのが一番簡単です。
下の画像はRenderTextureの解像度を256x160にした場合です。
![190116_FakeBG低解像度.JPG](https://qiita-image-store.s3.amazonaws.com/0/227733/692ab0ad-411c-d87c-1077-1ec992975c75.jpeg)

#課題

奥から手前や手前から奥のようなRenderTextureを跨いで移動するのは御法度。ズレちゃいますからね。

#まとめ

結局は用途次第ですが、例えばLooking Glassでゲームを作る際に奥行きのある背景を出せるのは強みになると思います。

#一周年記念アプリの遠景について

動画
https://twitter.com/aodama/status/1208755492505309186

やっていることは単純で、Curved Worldアセットで地面を曲げて、遠景（RenderTexture）のつなぎを見えないようにしています。
![191222_バイク＋ドリル＋メイドな説明.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227733/a6ac6615-63a8-1ec8-b94f-8d1c1cf6daf4.jpeg)
UnityからのXcodeプロジェクトでシミュレータが使えないときは

Unity で iOS の `Player Settings` / `Other Settings` / `Target SDK` が、 `Device SDK` のままだと、生成される Xcode Project における `Build Settings` の `Supported Platforms` が `iphoneos` になっている。この状態ではシミュレータが使えない。なので、Unity の方で `Target SDK` を、 `Simulator SDK` にする。グラフィックスライブラリに関する警告が出るから、 `Auto Graphics API` のチェックを外して、 `OpenGLES3` を追加して Build すれば良い。この場合、実機は使えなくなる。不便だあ。（Unity 2018.3.1f1 と、Xcode 10.1 で確認）
Unity で SystemInfo.operatingSystem を使って iOS バージョンの判定をする時に

`SystemInfo.operatingSystem` の値が、iOS 10より前だと `iPhone OS` で始まり、10 以降だと `iOS` で始まる。同じプログラムが iOS が新しいもので動かない時は確認した方がいい。プラグインなどで汎用性を目指して結構使ってそうなコードパタン。
[Rails5]CSV.generate+pluckでCSVを出力する

# はじめに

Railsの勉強として、今回はCSV出力をやってみました。
やり方はいろいろあるようですが、
今回は表題にあるようにCSV.generate+pluckで行ってみます。

## 検証環境

以下の環境で実施しました。

```
[client]
・MacOS Mojave(10.14.2)
・Vagrant 2.2.2
・VBoxManage 6.0.0

[virtual]
・CentOS 7.6
・Rails 5.2.2
・ruby 2.3.1
```

ご参考までに。

# CSV出力処理の実装

**・前提**

事前にRails勉強用に作成したプロジェクトで進めます。
各MVCは適当に掲示板アプリを想定してPostsコントローラーなどを生成済みです。
(index,show,editの空ページが見れる程度)

```
$ rails g model post
$ rails g controller posts index show edit
```

**・方針**

その前提のもと、すでに作成していた
以下の既存処理に手を加えていきます。
方針としては一覧ページに出力リンクを設置して、
一覧情報をCSV出力するような形で進めていきます。

**・実装**

まずはコントローラーを以下のように実装しました。

```ruby:posts_controller.rb
require 'csv'

def index
  respond_to do |format|
    format.html do
      # kaminari
      # @posts = Post.page(params[:page])

      # ransack
      @search = Post.ransack(params[:q])
      @posts = @search.result
    end
    format.csv do
      send_data output_csv,
      filename: "投稿情報.csv"
    end
  end
end

def output_csv
  # 出力情報を整形する場合は別途調整！
  CSV.generate do |csv|
    csv << Post.column_names
    Post.pluck(*Post.column_names).each{|data|csv << data}
  end
end
```

(gemは以前に勉強していた副産物なので無視してください)

indexの中で、CSV出力処理もまとめて書いても良かったけど、
CSVの出力内容をカスタマイズすることになった場合、
index内がごちゃごちゃしそうだったので、別メソッドに逃しました。

続いでビューにリンクを設置します。

```ruby:index.html.erb
<%= link_to 'csvダウンロード', 'index.csv' %>
```

もちろん、bootstrapを適用して

```ruby:index.html.erb
<%= link_to 'csvダウンロード', 'index.csv', class: 'btn btn-default' %>
```

みたいにボタン化しちゃうのもアリ。
むしろそっちのほうが良いのかも。
けど今回は通常リンクで。

# 動作確認

では早速画面を見てみましょう。

![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/335844/b6c0b675-5e12-b59a-dc48-27de6f2dfcfa.png)

csvダウンロードのリンクが表示されたので、押下してみます。

![cap2.png](https://qiita-image-store.s3.amazonaws.com/0/335844/7cab7d7a-8a38-c4c0-f0bc-e99fc1a74d03.png)

指定していた名前でダウンロードされました！

![cap3.png](https://qiita-image-store.s3.amazonaws.com/0/335844/e08f87bf-b37f-ae1b-54fe-e628e5e3fa3d.png)

中身も大丈夫そうです！

# 追記(2019/01/17)

コメントで[scivola](https://qiita.com/scivola)様より、
別の手法を教わったので早速試してみました。

## コントローラーではなくビューで生成処理をする

前述では、コントローラー内に
CSVの出力処理を組みましたが、それをビューで実施するという方法。
まずは"app/views/posts/"以下に"index.csv.ruby"ファイルを作成。

```
$ touch index.csv.ruby
```

そしてコントローラーで組んでいたロジックを移動。

```ruby:index.csv.ruby
require 'csv'

CSV.generate do |csv|
  csv << Post.column_names
  Post.pluck(*Post.column_names).each{|data|csv << data}
end
```

そしてコントローラーのindex内を以下のように調整。

```ruby:posts_controller.rb
def index
  respond_to do |format|
    format.html do
      # kaminari
      # @posts = Post.page(params[:page])

      # ransack
      @search = Post.ransack(params[:q])
      @posts = @search.result
    end
    format.csv do
      # メソッドを呼び出していた部分をrender_to_stringに変更
      send_data render_to_string,
      filename: "投稿情報.csv"
    end
  end
end
```

## 動作確認

![cap4.png](https://qiita-image-store.s3.amazonaws.com/0/335844/2632d0c8-5a51-0849-fdb9-a496a7fc267d.png)

同じように動きました！

# 所感

とりあえず全件出力ですが、無事に実装することが出来ました。
最低限のものであれば、数行書くだけで出来るのは楽で良いですね。

**追記(2019/01/17)**

ビュー側で行う方法についてご教示頂いたあと、
CSV出力について調べている感じ、この方法をとってる方のほうが多そう？
"render_to_string"のリファレンス見るだけだとあまりピンとこなかったですが、
こういう風に使い方を実例としてやってみると分かりやすいですね。

# おわりに

何かお気づきの点がありましたら、
ご指摘やアドバイス等頂けると大変助かります！
初心者がgitの流れを書いてみる

##経緯

11月からプログラミングを本格的に学び始めているが、gitを使用することがほとんどなくここまできてしまい危機感を感じたため、この機会に整理してみようと思う。

##gitとは

開発を進める中で、どうやら過去のファイルに戻したい時が多く出るらしい。
（今の段階でもそうなので、職にしたらよりそう感じるのだろう）
そこで、gitと呼ばれる分散型バージョン管理システムを使用することで

１.ファイルのバージョン管理をし、過去のファイルに戻すことができる。
2.複数人で作業をするときも楽にファイルの変更が可能

というメリットを受けることができる。

※**分散型バージョン管理システム（Git）**とは、サーバーが接続されていない状態でも、リポジトリをローカルに作ることでファイルをローカルでも保存して置けるようにする管理システム。
これとは対に**集中型バージョン管理システム（SVN）**とは、リポジトリ（貯蔵庫）がサーバー上に1つだけ存在するため、サーバに接続されていない環境だと、編集や更新はできない。

##gitの仕組み

###リポジトリ

**ファイルやディレクトリの管理場所**
変更履歴を管理したいディレクトリをリポジトリで管理することによって、変更履歴などを記録することできる。

**リモートリポジトリとローカルリポジトリ**
・ リモートリポジトリ・・・クラウド上に存在するリポジトリ。複数人での作業をする際に利用することが主。
・　ローカルリポジトリ・・・個人のPCの中にあるリポジトリ。

・pull・・・リモートリポジトリの変更をローカルリポジトリへ反映させること。
・push・・・ローカルリポジトリの変更をリモートリポジトリへ反映させること。

### コミット（確定）
リポジトリにソースコードを保存するための操作。
この操作により、トラッキング状態になり、ファイルがリポジトリへ保存される。


### トラッキング状態
コミットする前にaddコマンドを使用して、ステージング領域と呼ばれるところへ保存する。



##実際の流れ

1.git init 

```
$ mkdir "ディレクトリ名" 　#ディレクトリを作成
$ cd "ディレクトリ名"　#作成したディレクトリへ移動
$ git init #このフォルダでgitを使い始めるためのコマンド
```

2.git add 

```
$ touch sample #ファイルを追加
$ git add トラッキング状態にしたいファイル名
$ git add . #ディレクトリ配下全てのファイルをトラッキング状態にする
```

3.git commit 

```
$ git commit -m "コミットメッセージ"　　#コミットメッセージはどういう意図かわかりやすく記述。
```
　4.git log

```
$ git log 
commit データ内容の表示
Author :　名前
Date:　日付
```

上記順が基本となる。


##まとめ

git hubへのpush方法は長くなりそうなので割愛します。(怠惰)
間違えて理解しているところも多そうなので、ご指摘有れば是非お願いします。
AWS Transfer for SFTP scope-down policy作成（AWSオフィシャルドキュメント問題解決）～ファイルをS3バケットに保存する時フォルダ別の権限設定

最近AWS Transfer for SFTPは発表され、丁度仕事中にこの機能を使いました。

途中にAWSオフィシャルドキュメントのscope-down policyの部分は問題があると気づきました、
いちいちAWSオフィシャルドキュメントを参照してもscope-down policyが正しく動けません。

僕はAWSオフィシャルBBSで問題とほかのAWSユーザーたちをやり取りして解決案を見つけました、
でも、これは一番いい案かどうかが知りません。

ほかのAWSユーザーはもう一度時間をかからないようにこの記事を書きます、もしもっといい方法があればどうぞレスを書いてください。

先ずAWSオフィシャルドキュメントのpolicyの部分：
https://docs.aws.amazon.com/transfer/latest/userguide/requirements-roles.html

見るとscope-down policyを作成してロールにアタッチしたらいいと思いますが、
やってみると全然FTPのコマンドが実行できない状態です、「pwd」以外は全部「Failure」です。

解決案としては、
####1、Bucketにアクセスpolicyを作成してSFTPのIAMロールを与える。
※.AWSオフィシャルドキュメントの一番目のポリシー

```json:transfer-for-sftp-xxx-bucket-access-policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::<bucket_name>"
            ]
        },
        {
            "Sid": "HomeDirObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObjectVersion",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::<bucket_name>/*"
        }
    ]
}
```
<font color="Red">※.このポリシーに特定のバケット名が含むため、自分のバケットを埋めてください</font>

####2、Scope-down policyを作成してSFTPユーザーに与える
※.AWSオフィシャルドキュメントの二番目のポリシー

```json:transfer-for-sftp-scope-down-policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::${transfer:HomeBucket}"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "<Optional_path>/${transfer:UserName}/*",
                        "<Optional_path>/${transfer:UserName}"
                    ]
                }
            }
        },
        {
            "Sid": "HomeDirObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObjectVersion",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::${transfer:HomeDirectory}*"
        }
    ]
} 
```
<font color="Red">※.Optional_pathは要らなくても大丈夫</font>

だとSFTPユーザーは自分のユーザー名を含むフォルダのみがアクセスできるようになります。
参照図例：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236892/9a5de7ab-94c5-cc3d-0591-c7f089c11ad3.png)

##Summary：
　・bucketにアクセス権限はsftpで使うIAMロールに与える
　・scope-down policyはTransfer for SFTP中のsftpユーザーに与える


参照：https://stackoverflow.com/questions/53642132/connecting-to-aws-transfer-for-sftp/54132370#54132370
libknet(kronosnet)について

***準備中***
#確認したバージョン
 kronosnet v1.6(libknetのみ)で、デフォルトのUDP通信のみを確認。

#構成
libknetは、7つのスレッドで構成され、corosync層(totempg/totemsrp/totemnet/totemknet)の下位で動作します。
libknetに対応しているcorosyncではrrp層(リングプロトコル)が廃止された為、rrp_modeの指定が無くなりました。
詳細は別途記載しますが、corosync.confのlink_modeにpassive/rr/activeを設定することによって、rrp_modeに変わる指定が可能です。(デフォルトは、passive)
libknetを利用する場合には、corosync.confのtransportにknetを指定する必要があります。(libknetを利用しない以前のcorosyncに似たudpu/udp指定も可能。)

複数インターフェースに関しては、libknet側で管理・制御する為、corosync層からの送受信は、libknetとの送受信fdを利用して行います。
よって、transportにknetを指定しない場合には、複数インターフェースは利用出来ません。
![corosync_libknet.png](https://qiita-image-store.s3.amazonaws.com/0/80018/68b7253f-1c7f-590a-e7ef-03e45ce16d6f.png)

## 1. heartbeatスレッド
coroync.confのnode_listに設定された自ノード以外のクラスタメンバーのringx_addrのアドレスに対して、libknet独自のPINGパケットを送受信して接続を確認します。
PING応答がないクラスタメンバーの状態(connectedが変化)を、dst_link_handlerスレッドへ通知します。

## 2. send_to_links_threadスレッド
クラスタメンバーへのデータの送信処理を行います。
自ノードへの送信に関しては、インターフェースへ書き込む事なく、corosyncへ受信fdを介して書き込みし、通知します。
他ノード宛ての送信に関しては、link_modeに従がってデータをインターフェースへ書き込みます。

## 3. recv_from_links_threadスレッド
クラスタメンバーからのデータの受信処理を行います。
heartbeatスレッドからのPINGパケットの受信と応答、pmtudスレッドからのPMTUデータの受信と応答も行います。
send_to_links_threadスレッドの説明にも書いていますが、自ノード宛ての送信は受信スレッドが処理することはありません。

## 4. dst_link_handlerスレッド
自ノード以外のクラスタメンバーのリンク状態の管理・更新を行います。

## 5. pmtud_linkスレッド
PMTU処理を行ないます。

## 6. sctp_listen_threadスレッド

## 7. sctp_connect_threadスレッド

#詳細

#その他

#関連リンク
 * https://github.com/kronosnet
php-master-changes 2019-01-15

今日は openssl の処理を外部から呼べるようにするリファクタ、不要コードの削除、エンジンの一部局所最適化、Typed Properties 導入時のバグ修正、gd の pkg-config への移行、ドキュメントの更新、イテレータラッパーにダミーの get_gc ハンドラを実装する修正があった！

# 2019-01-15
## devnexen: Refactor subset of openssl module.
- https://github.com/php/php-src/commit/62c7432fa3530f7e3607b9829d5036b1c6ab2473
- ext/openssl で、暗号化や復号の処理を外部から呼べるようリファクタ
- PHP_OPENSSL_API というのが導入されてる

## dstogov: Removed missed and unused function declaration
- https://github.com/php/php-src/commit/c87c6f81f05b8e18ea0e0a06b8b2e180bb163e2f
- 使われていない関数宣言を削除

## dstogov: Use fastcall calling convention
- https://github.com/php/php-src/commit/6f6532d32b1288bac536c9864550f5dff3b9987d
- エンジンの一部処理を fastcall 使うよう修正

## nikic: Fix handling of UNDEF properties in compound assign
- https://github.com/php/php-src/commit/61d00c0c55ebbc2fa59af35befd2f61a80571675
- 複合代入時の未定義プロパティの扱いを修正
- Typed Properties 導入時に[消しちゃってた](https://github.com/php/php-src/commit/e219ec144ef6682b71e135fd18654ee1bb4676b4#diff-5d1661cc2ad170dc8bbe40c80ae75b85L960)けどこの分岐に入るケースでは必要だった
- BP_ﾅﾝﾁｬﾗ は[読み込みなんかのオブジェクトハンドラ](https://wiki.php.net/internals/engine/objects)がどういう文脈で使われてるかを示す用の定数かな？
- [Nobody knows what backpatching is, apparently.](https://devzone.zend.com/1119/zend-weekly-summaries-issue-360/) ということで backpatching が何かはよく分からない
- パースしながら opcode を生成してた関係で、先を読まないと具体的な挙動が判明しない場合に後からパッチするみたいな奴と [stas の人が言ってるっぽい](https://externals.io/message/32425#32518)
- 実際コンパイラでも使ってるっぽいけど、これ executor での利用と分けてしまったらアカンのかなみたいな気持ちで見てる

## nikic: Migrate ext/gd to pkg-config
- https://github.com/php/php-src/commit/19d8a6b771a1d8d458583772703a5bb1a1276274
- ext/gd を pkg-config へ移行

## nikic: Document pkg-config related changes
- https://github.com/php/php-src/commit/48ca2c08339eeec3eb13b317deb17c6a80e0af82
- UPGRADING に各拡張の pkg-config 移行について追記

## nikic: Add dummy get_gc handler for iterator wrapper
- https://github.com/php/php-src/commit/97fc84ca06188ded308cc5a92cf487f0a562fb75
- イテレータラッパーにダミーの get_gc ハンドラを実装
エンジニアの勉強はスターバックスで。問題意識のスタート地点は別でも、ゴール地点は同じかも？戦士や魔法使いや鋼の剣など、たくさんの道具や仲間を用意して、自分のもやもや、問題意識をクリアしたい。

エンジニアの勉強はスターバックスで。問題意識のスタート地点は別でも、ゴール地点は同じかも？戦士や魔法使いや鋼の剣など、たくさんの道具や仲間を用意して、自分のもやもや、問題意識をクリアしたい。

![image](https://user-images.githubusercontent.com/13635059/51218800-53d55700-1971-11e9-9399-48feb7b9e231.png)

￼

入り口はどこでもいいのかもしれない。僕はなんだか入り口と言うものにこだわってしまう。スタート地点とゴール地点にこだわってしまう。

だけど入り口がどこでも、自分の問題意識にたどり着くので、あまり関係ないかもしれない。いやこれはどういうことなのかと言うと話さなければいけないな。

# 例えば今スターバックスでおじちゃんが店員さんに話しかけていた。おじいちゃんかもしれない。

これが目につくと、そのことについて話したくなってしまう。

人間は目の前に見えたものに反応するようにできているけれど、僕の場合は特にその性質が強いように思う。だからたくさん話したいことがあっても、目の前のことが本当に80%位の意識で話したいので、先ほど話したかった大事なことを忘れてしまう感じがする。

# だから例えば、ブログを入り口にするのか、Twitterを入り口にするのか、iPhoneのメモ帳入り口にするのか、写真を入り口にするのかと言うことに関してもすごく悩むし、

どこで道の入り口と出口をつなげたらいいのかに関してなかなか答えが見出せなくて試行錯誤したりする。

だけど例えばそれがTwitterで始まったとしても、ブログで始まったとしても、たとえ着想がスターバックスのおじちゃんだったとしても、その他のものだったとしても、こうやってiPhoneの音声入力でずっと喋っていたら、最近自分がずっと持っている問題意識の話につながるはずなのだ。

こうして実際、入り口と出口の話につながったじゃないか。スターバックスのおじちゃんの話は自分の強な問題意識の話にちゃんとつながったぞ。

# スタート地点はどこでも良い、入り口がたくさんあっても、同じ迷宮に通じている。

迷路と言う人間の脳みたいなものにつながっていて、そこでぐるぐると回って、またTwitterやブログやらに着地点を作って、出口を作って、そこに脳の中で反射したものをアウトプットしてやる。

だからTwitterやブログと言うフォーマットに惑わされずに、その時その時で最適なものを手にして、どうにかこの迷路スタート地点からゴール地点まで導き出して、脱出ゲームをクリアしてやろうと言う気持ちだ。

このメールをクリアするためなのであれば、ブログでもTwitterでも、何でもツールと言うツール、戦略と言う戦略を使えばいいじゃないか。道具の種類は多い方が良い。

# 道具にはリファクタリングも必要だ。いちどに持っていける道具には現実的な制約がある。たとえデジタルの世界であっても、あまり多くのアプリケーションを使いこなそうとすると、複雑度の波に飲み込まれてしまいそうだ。

だからデジタルの世界であっても決してモテるアイテムの風無限では無い。iPhoneのアプリケーションもあまりインストールしすぎると収拾がつかなくなるし、脳のワーキングメモリの少ない僕のようなエンジニアにはとても苦しいのだ。

ということでまた少しだけすっきりしたな。僕は自分の抱えている問題意識と言うトピックを、どんな入り口から入っても、ある程度解消してTwitterやブログにアウトプットできる自信はちょっとついてきたし、そのためのツールやサービスの選び方にも時間をかけたし、割と良い体制が整ってきた気がするぞ。

この装備やアプリケーションのパーティーを組み立てるのには結構コストはかかったけれど、やっぱ洗車魔法使いや送料と言う仲間や、鋼の剣やゴールドや場所やそんなものをたくさん揃えてダンジョンにいた挑みたい。

それじゃ続きはまた今度。


---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
wordpressの閲覧URLと管理URLで異なるホストを設定

この記事は技術書典5で作成した本の内容を抜粋したものです。

## やりたいこと

- wordpressの閲覧URLと管理URLで異なるホストを設定する
  - セキュリティ的にホストから分けて、管理側に制限かけたいため
- AWS上のEC2で設定する

![kouzeizu.png](https://qiita-image-store.s3.amazonaws.com/0/6568/50df8612-1982-3ae6-890f-d06ff4c07b91.png)

※ *manage.example.com*、*blog.example.com* は実際に使用するURLに置き換えてください


## 準備
KUSANAGI for AWSを利用する
https://kusanagi.tokyo/cloud/kusanagi-for-aws/

## 管理URL設定
- ALBを設定する
  - リスナーはHTTP,HTTPS。ターゲットにwordpressのEC2
  - 管理画面へアクセス可能なIPだけを設定する
- Route53を設定する
    - 管理URL（*manage.example.com*）レコードを作成し、Alias Targetに作成したALBを設定する
- 準備した KUSANAGIのEC2にログインし、管理側のURL（*manage.example.com*）で初期設定を行う
  - KUSANAGIの初期設定 https://kusanagi.tokyo/document/kusanagi-init/

この段階で、設定したIPだけ管理用URLで、wordpressにアクセスできる状態になります。

## 管理URLのSSL化を行う
現在の設定だと無限ループするので、こちら参考
https://qiita.com/backgroundcolor/items/22ff275d0e82d4e5edd7


## 閲覧URL設定
- ALBを設定する
  - リスナーはHTTP,HTTPS。ターゲットにwordpressのEC2
  - IP制限なし
- Route53を設定する
    - 閲覧URL（*blog.example.com*）レコードを作成し、Alias Targetに作成したALBを設定する
- WordPressのサイトアドレスを設定
  - WordPressの管理画面（ https://manage.example.com ）にログインし、サイトアドレス (URL)を *blog.example.com* に変更

wp-config.phpで変更も可

```php:wp-config.php
define('WP_SITEURL','https://blog.example.com');
```

## nginxの設定
- nginxの設定ファイルを閲覧URL用にコピー

```sh
$ cd /etc/nginx/conf.d/
$ sudo cp xxxx_http.conf xxxx_blog_http.conf
```

- 閲覧URL用の設定ファイル(xxxx_blog_http.conf)を開き3箇所修正

```sh:server_nameの変更
  server_name blog.example.com;
```

```sh:/wp-adminのリダイレクトをコメントアウト
  #rewrite /wp-admin$ $scheme://$host$uri/ permanent;
```

```sh:wp-login.php、/wp-adminは404を返すように変更
  location ~* /wp-login\.php|/wp-admin/((?!(admin-ajax\.php|images/)).)*$ {
    return 404;
  }
```

- nginxを再起動し、*blog.example.com* でアクセスできることを確認
- 閲覧URLでは管理画面(*blog.example.com/wp-admin*)が404になることも確認

```sh:nginx再起動
$ sudo kusanagi nginx
```
## WordPressの設定変更
この段階ではテンプレートで埋め込まれるURLが管理URLとなったままなので
管理URL -> 閲覧URLに置換するため
テーマファイルのfunction.phpに追記します。


```sh:/wp-content/themes/xxx/function.php
function replace_site_url($url){
  return str_replace(site_url(), home_url(), $url);
};
add_filter('includes_url', 'replace_site_url');
add_filter('content_url', 'replace_site_url');
add_filter('script_loader_src', 'replace_site_url');
add_filter('get_search_form', 'replace_site_url');
add_filter('get_the_guid', 'replace_site_url');
add_filter('wp_calculate_image_srcset_meta', '__return_false');
add_filter('comments_open', '__return_false');
add_filter('pings_open', '__return_false');

remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wp_generator');

// 画像パス変更
add_filter('wp_get_attachment_url', function ($url){
  if (preg_match('/^http(s)?:\/\/[^\/\s]+(.*)$/', $url, $match)) {
    $url = $match[2];
  }
  return $url;
});
```

以上で設定完了です


2020.04.27 追記
上記の設定をしていると、 ver5以上のwordpressの投稿画面でエラーとなるようなので、対策を追記した

wordpressの管理と公開で異なるドメインにしたらWP REST APIがエラーになる場合の対処
https://qiita.com/backgroundcolor/items/6e925625ccb843de4342
MacBookAir2018のバタフライキーボードは使いやすいけど、手が凍っている冬に使うのは辛いかもしれない。バリアフリーなデバイスとは、おじいちゃんおばあちゃんの手でも使える端末だ。僕らの肉体も日々変化しているから、最低状態でも使える端末。



# Ref 

[なぜお年寄りはスマホを使えないのか？ - Qiita](https://qiita.com/su10/items/61c793c036af1dbae12b)
￼

# MacBook Air 2018を買ったけれど、少しだけ後悔しているかもしれない。

やはりキーボードの薄さだ。冬で手が凍るとあの薄いキーボードを触る気になれない。

なんというか、自分の体が1番調子が良い時と、1番調子が悪い時では、かなりの違いがあることに気付いた。

デバイスの使いやすさと言うのは決して固定されていない。人間が変動するからデバイスの使いやすさも常に流動的だ。

これはMacBookエアを買い換えた後に理解したことなので、その当時はわかりようがなかった。そしてiPhoneの音声入力にはまり始めてからは、MacBookでは多少の編集をするだけになった。

それにしても前のMacBookエアは、もうハードウェア的にもタッチパッドが押しづらかったりして、CPU的にもメモリ的にも限界が来ていたと思うのだけれど。

もうちょっと自分の手が悪くなったときの最低LINEに届く厚さというか、1番調子が悪い時でも使えるデバイスというのが1番優れているかもしれない。

# 技術情報サイトでも、そんな話があった。おじいちゃんおばあちゃんはなぜスマホが使えないのかと言うトピックが話題になっていたなぁ。

だけどおじいちゃんおばあちゃんだけじゃなく、実は僕たちの肉体も日々変化を繰り返している。例えば怪我をするかもしれないし、風で手が凍ってしまうかもしれない。だからおじいちゃんおばあちゃんが決して特別では無いのだ。

僕らは日ごろから自分の肉体が変化していることに、自覚的でないだけで、実は微妙な変化を繰り返している。

![image](https://user-images.githubusercontent.com/13635059/51218620-a3675300-1970-11e9-8a0c-9323c548e4a7.png)

だからスマホがなんだか入力しやすい時もあれば、入力しにくい時もあると言うのは、実は自分たちの肉体の変化のせいだ。

# だからバリアフリーなデバイスを作るべきだ。子供でもおじいちゃんおばあちゃんでも怪我をしていても使えるようなデバイスが最高だと思うのだけれど、

MacBookエア2018のキーボードは、バタフライ希望としては進歩したものの、やはり薄すぎる繊細なタッチが必要な感じがして、荒々しくキーボード打ち鳴らすことができない。

僕はこのままiPhone音声入力を続けるか、冬から春のなるのを待って家が動き出すのを待った方が良いのかもしれないな。

まだ完全に後悔しているとは言い難いし、これからどんどんMacBookエアを使っていくと思うけれど、2015年のモデル様のようなあの何も気にしなくていいキーボードタッチが戻ってこないかと思うと、やっぱりちょっと悲しくなったりするな。

それじゃ続きはまた別の話で。


---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
特にエンジニアとという人間には、理解したいと言う根本的な欲求がある。だけど全てを理解することなど到底できないと言うジレンマも抱えている。これが非常に辛い。神様にならなければ無理だ。神様だって無理だ。

特にエンジニアとという人間には、理解したいと言う根本的な欲求がある。だけど全てを理解することなど到底できないと言うジレンマも抱えている。これが非常に辛い。神様にならなければ無理だ。神様だって無理だ。

![image](https://user-images.githubusercontent.com/13635059/51218519-26d47480-1970-11e9-9ff3-a8b6710985f4.png)

なぜ人間は思考と言うものを生み出したのだろう。と言うよりも思考と言うものが生まれてきた由来は何なのだろう。

脳科学的に言うと、実は自分と言うものは存在しないらしい。みんな信じられないかもしれないけれど。じゃあ一体こうやって喋っているのは一体誰なのだろうと言う考えをすると、とても考えることでは解決できない領域に立ちそうなのだけれど。

考えているものは自分ではない。エンジニアの思考力はどこから生み出されるか。それは自分自身ではない。自分自身の脳から自動的に生み出されている。自分自身と言う意識を生み出している部分と、思考を自動的に生み出している部分はどうやら違うらしい。自分と言うものの定義がそもそも難しいのだけれど。

# マインドフルネスの実践をしているとそのことがちょっとだけ手に取るようにわかる気もする。

ほらこうして僕がiPhone音声入力でこの記事について語り、ちょっとものが食べたくなって節分の豆をリビングまで取りに行った間にも、たくさんの思考が頭の中を駆け巡ったぞ。


￼

では、エンジニアが思考力を高めるにはどうすれば良いのだろうか。いやいや、そもそも思考力と言うものが存在すると言う思考を手放そうじゃないか。

筋力が存在するけれど、思考力と言うと何か雲をつかむ物のような気がする。僕らが考えて考えて思考力を高めだと思っていても、実は思考することによって思考力なんか全く変わっていないかもしれない。思考力が高まったと言うのは単なる思い込みかもしれないと言う思いがあると僕は思考している。

思考力を高める以外に何か別のアプローチは無いのだろうか。エンジニアで言えば、能力を上げる手段はいくつもあると思う。例えばスーパーエンジニアにちょくちょく話を聞きに行って、エンジニアリングの1番おいしいエッセンスだけをいただいて、インストールするというのはものすごくエンジニア力を高めると思う。

# 自分の思考力と言うものをあてにせずに、周りの力に頼ると言うのは、

いいことだと思う。周りの力に頼ると言うとなんだか頼りない感じがするけれど、例えば、脳の細胞同士がお互いにシナプスを繋げ合わずに、孤立していたら、僕らの脳が全く機能しなくなってしまうではないか。

うん、いつもながらにしてトピックが乱雑にごっちゃになってきた気がするなぁ。無理矢理エンジニアリングの話と繋げようとしたのがまずかったかな。まぁ脳の神経細胞がつながる事は、成功することもあれば失敗することもあるさ。繋がろうと言うこと、シナプスを形成しようとするその働き自体が重要だ。

そう、やはり僕らは脳細胞なので、単体で思考力を高めることができないかもしれない。思考力と言うのは、他の脳細胞とのシナプス形成によって生み出されるかもしれないぞ。

# つまり他のエンジニアともっとメッセージングして、サインを交わすと言うことだ。

ということでトピックが乱雑になりましたが、エンジニアは脳の仕組み的に言って、とゆうか人間は脳の仕組み的に言って、思考力を単体で伸ばす事は根本的に不可能なので、他のエンジニアともっと雑談やディスカッションをして、チームやプロジェクトや会社の総体として、活躍できればいいんじゃないかなぁ。

いやいやこれはなかなか乱雑な結論ですねすいません。それじゃまた別の話で。

---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Twitterでは面白いツイートが流れてくるということが大事だ。根本的なことに改めて気づいたぞ。だけどタイムラインはとても荒れやすいし壊れやすい。やはり機械による情報集約が求められる時代じゃないだろうか。

Twitterでは面白いツイートが流れてくるということが大事だ。根本的なことに改めて気づいたぞ。だけどタイムラインはとても荒れやすいし壊れやすい。やはり機械による情報集約が求められる時代じゃないだろうか。

たった1秒たりとも、例えば、iPhoneの小さい画面が広告で埋められるような事態にはなって欲しくないのだ。

# タイムラインの管理は非常に大事で、

Twitterの魂の進み方はここに尽きるといっても過言ではないかもしれない。だけどタイムラインと言うのは本当にたやすく崩されがちで、失礼かもしれないが、リツイート1時間200個もするアカウントを一旦フォローしてしまったが最後、この本当に大事なタイムラインが、一気に荒れ果ててしまったりする。

そんなに気軽にフォローなんかするなよと思うかもしれないけれど、最近のSNSしかり、Twitterだって本当に1-Clickでフォローできる、しかも1人のユーザをフォローすると3人ぐらいおすすめユーザが出てきてそれもクリッククリックでフォローしていてようというインターフェイスになっているのだから、タイムラインが繊細で大事だということに反して、なかなか脆弱に作られていると言う思いもある。

# だからこそTwitterのタイムラインを自動的に整理してくれる機能が今デフォルトで搭載されているけれど、

それはそれで単純に時系列の一覧に戻してくれと言うユーザの熱い要望があったらしく、オプションで切り替えられるようになったらしいし、タイムラインをそもそも管理できているTwitterユーザにとっては、勝手にタイムラインをカスタマイズするシステムは迷惑なだけなのかもしれないな。

# だけど今の時代は膨大な情報をどうやって人間の手ではなく、機械によって整理するかと言うことが切実に迫られている時代なので、

Twitterのタイムラインもある程度、システムによって整理してくれるのは僕にとってはとても嬉しいことなのだ。

最近ステーションと言うSlackやら何やらのアプリの情報をまとめるアプリが流行り始めたかどうかと言うところで、情報集約アプリケーションは今後、さらに必要性を増していくだろう。Twitterのタイムラインにしてもそうだ。僕らはもうこの壊れやすいタイムラインを自分自身で管理する注意力さえ、持ち合わせていないというか、そこにコストをかけていられないくらい複雑で巨大な世界に生きているのだから。


---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
エンジニアとしてアラサーで初就職してナルコレプシー的な病気から命が救われたかもしれない話。

エンジニアとしてアラサーで初就職してナルコレプシー的な病気から命が救われたかもしれない話。

なんか昔自営業時代、自分をナルコレプシーかと思ったことがある。24時間眠くて仕方なくて、5分間も仕事ができなかった。どんどん睡眠時間が伸びた。今の会社に入るまで、命がやばいレベルで眠かった。

# ナルコレプシーと言うのはただひたすら眠くなる病気。

本当に尋常じゃなくて、この眠いレベルが。信じられないかもしれないけど、眠る以外のモチベーションが全くわかずに、本当に1年ぐらい毎日1日中眠り続けてたような気さえする。

幸いと言うべきか不幸と言うべきか、その時は僕はGoogleアドセンスの収入によってほぼ不労所得状態だったので、ただひたすら眠ることが許される生活だったのだ。だけどかなりやばい状態だとは自分でも思っていた。

だけど自分ではどうすることもできなかった。睡眠時間を少しずつ工夫したり、朝起きて夜眠ろうと意識したりするけど、やっぱり睡眠の不順が起きているのか、

# 1時間目覚めると、8時間位眠くなるような状態だった。

恋人とデートをしていても、とにかく眠くて仕方なくて、死にそうな日々だった。病気のレベルだった。だけど先天的なナルコレプシーではないし、病院にも行かなかったし、睡眠にはまだまだ謎が深いと言うし、単純に睡眠のバイオリズムが乱れて乱れて乱れすぎた結果、1日12時間、14時間睡眠ぐらいになったのかもしれない。

# 本当にこれは命がやばいレベルだった。

今思い出してみてもやばい。あれは一体なんだったんだろう。もしかしたら睡眠に詳しいお医者さんに行ったら診断を下してくれるのかもしれない。だけどストレスですねとか言われて実質上の門前払いを食らわせられそうな気もする。

僕はその時、パソコンを一緒に開くだけで猛烈な疲れが来てしまって、これは何の日風でもなく5分ぐらいしかパソコンを触ることができなかった。どんどんどんどん疲れやすくなって、どんどんどんどん睡眠時間が長くなっていた。やっぱり今思いだしてもヤバ過ぎる。

# 幸いにも、自営業10年間続けて収益悪化によって今の会社に就職したわけだけれど、

お金の面やキャリアの面もさておき、ちゃんと朝起きて夜眠れるようになったので、その点で何の比喩でもなく命を救われた感じはある。

これを語りながら今あんなに眠かった時代を思い出して、ちょっと興奮気味にiPhoneで音声入力をしているんだぜ。睡眠のバイオリズムの乱れも、天井知らず、極限まで乱れることができると言うエグザンプルになるだろうか。

あのままいったらきっと、1日23時間位は眠り続ける怠け者というか、眠りの森の何かしらの生き物になっていた気がするなぁ。3年寝太郎だろうか。こわいよこわいよ本当に怖いよ。命が助かって本当によかった。

それじゃあ続きはまた別の話で。


---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Mac Book 2018 OS Mojave Touch ID の指の登録上限は三個だけ？人間の指は10本あるのになぜだよ。

Mac Book 2018 OS Mojave Touch ID finger upper limit is three?
Mac Book 2018 OS Mojave Touch ID の指の登録上限は三個だけ？人間の指は10本あるのになぜだよ。


I have a two hands and 10 fingers but this upper limit why?

I want to register both hands tumb and index fingers.

![image](https://user-images.githubusercontent.com/13635059/51218153-774ad280-196e-11e9-8cad-15636665d427.png)

---

https://twitter.com/yumainaura

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












<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Dockerでnpmコマンドをインストールする


Dockerを使えばnpmコマンドをすぐに実行できる環境が手に入る。

やり方
----

`npm` コマンドを実行したいフォルダまで移動して以下を実行する。Windowsの場合はGit bashで実行するか `$(pwd)` をカレントのフォルダのフルパスに置き換える必要がある（e.g. /c/Users/username/Documents）。

```bash
docker run -it -v $(pwd):/app -w /app node:10.15.0-alpine sh
# 実行したいnpmコマンド
npm init
```
AtCoder用の Nim0.13 のメモ

2019年1月現在 Nim は version0.19 がリリースされています.
それに対してAtCoderで使用可能なNimは2016年1月に出た 0.13 です.
これはかなり古いです。
## Docker Image
https://hub.docker.com/r/muratam/nim0.13.0
作りました

## ビルド
OSXではバグでchoosenimで落とせないので自分でビルドしましょう.
https://nim-lang.org/download/nim-0.13.0.tar.xz のリンクが残ってますので,解凍し,`build.sh` を叩けばカレントディレクトリの`bin`以下にnimコンパイラのバイナリをビルドできます.

## ver0.13の標準ライブラリのドキュメント

https://web.archive.org/web/20160208210257/http://nim-lang.org:80/docs/lib.html

## ver0.13の実装
https://github.com/nim-lang/Nim/tree/a121c3f9eb2a348b9d6ae03ffd01aab26a238c30/lib

## 追記

https://github.com/dom96/choosenim/pull/107/files
DynamoDBのリザーブドキャパシティーの料金に引っかかりそうだった件

勝手に引っかかりそうになってただけかもしれませんが。

## TL;DR
前払い料金を払っても、時間単価が別にかかるよ。

## DynamoDBのリザーブドキャパシティ
巷ではOn-Demandで盛り上がっていますが、
プロビジョンドキャパシティーの料金では、リザーブドキャパシティがあります。

この記事を書いている時点では以下のような表示になっています。
https://aws.amazon.com/jp/dynamodb/pricing/provisioned/
<img width="1051" alt="スクリーンショット 2019-01-09 14.51.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/39565/1a3c8d3b-5890-cfc9-8939-32cf5ead8492.png">

## 時間単価って何？
上記の料金表に「時間単価」というものがあります。
(表に書いていませんが、左が1年、右が3年のようです)

年単位での支払いなので、参考までに時間単価を掲載してくれてるのかと思いきや…。
例えば、1年のRCUの場合、
34.20USD / 365日 / 24時間 = 約0.0039USD
と、0.0029USD/時と大きくずれています。
他の金額も同様に計算してみても、合うのは一つもありません。

一体これはどうやって出てきた数字なんだ…。

## サポートに聞いてみた
サポートに問い合わせてみたところ、
どうやら「前払い料金」を支払うと、「時間単価」の価格で使える、という意味らしいです。
例えば、1年のRCUの場合、先に34.20USDを支払えば、その後1年間は0.0029USD/時で100RCUが使えると。

## 結局、実質の時間単価は？
「前払い料金」を時間ごとの料金にして、さらに「時間単価」を足して実質の時間単価を出してみました(東京リージョン)。

||実質の時間単価|割引率|
|:--|--:|--:|
|1年WCU|約0.03427USD/時|約53.8%|
|1年RCU|約0.00680USD/時|約54.2%|
|3年WCU|約0.01712USD/時|約77.0%|
|3年RCU|約0.00336USD/時|約77.4%|

## 購入したキャパシティをフルで使わないとどうなる？
リザーブドキャパシティは100W/RCU単位での購入になります。
では、購入後、DynamoDBを使っていない時間、100W/RCU未満のキャパシティを使っている時間の料金はどうなるのでしょうか？

これに関しても問い合わせてみたところ、使っていようが使ってなかろうが時間単価の料金がかかり続けるそうです。
(だったら全部前払いにしてくれたらいいのに…！)

## まとめ
ドキュメントに明示的に書かれてない部分があって分かりにくいものの、割引率としてはかなり大きいです。
100WCU/RCU単位での購入になりますが、大規模に長期間使うのであれば非常にお得かと思います。

なお、料金は変動する可能性がありますので、最新の料金は公式を参照してください。
https://aws.amazon.com/jp/dynamodb/pricing/provisioned/
そろそろbodyタグの中に文字列を突っ込んでバックエンドから送信するのをやめにしないか？

# 1．SPAの神髄

　SinglePageApplication(SPA)を推進するため活動している最中なのだが、残念ながらなかなか広がりを見せない。SPAっぽいシステムはあるにはあるのだが、実はかなり中途半端な代物なのだ。なにをもって真のSPAと判断するのか、それは初期状態でのbodyタグの中身が空っぽかどうかである。

# 2. なぜbodyタグの中が空でなければならないのか？

　簡単な話、SPAの初期状態でbodyタグの中に何か置いておく必要性が全く無いからである。中途半端なSPAは、おおよそのUIをbodyタグの中に記述し、それをJavaScriptで書き換える方式をとっている。しかしそのやり方では、まったく違うUIが必要となったとき、結局ページ切り替えをすることになるのだ。

　真のSPAを実現するのであれば、通常画面や編集画面、システム設定画面だろうと、一切のページ切り替えを行わずにやり遂げる必要があるのだ。

# 3.  開発の難易度が上がりすぎてしまうという誤解

　SPAを作るに当たって問題になるのは、UIを動的に更新していく部分にあるだろう。これを逐次記述していったら、とんでもなく手間がかかる。間違いなくその通りだ。だが考えてみて欲しい。WindowsやAndroidのネイティブアプリだって、同じことをしているはずなのだ。なぜWebアプリだけ難易度が高いと敬遠されてしまうのだろうか？それはbodyの呪縛のせいなのだ。

# 4．ネイティブアプリの開発手法

　例えばWindowsアプリを作るとする。クラシックなアプリなら、そのレイアウトの単位はウインドウという枠組みを使う。その上に標準コントロールという子ウインドウを貼り付けていく。Windowsでは目に見えるコントロールはウインドウハンドルを持っており、全て立派なウインドウなのだ。そしてカスタムコントロールが必要となれば、ウインドウハンドルとそこでやりとりされるイベントを駆使して作っていくことになる。実質、ウインドウ機能の継承と派生を行っているような形だ。画面の切り替えは新しいウインドウをポップアップするか、ビューと呼ばれる単位で生成したウインドウを親ウインドウに貼り付ける。WPFやUWPというものがMicrosoftから提供された後になると、レイアウトの切り替えはもっと簡単にできるようになった。

　Androidの場合はアクティビティという、やはりウインドウに似た単位を持っている。しかしモバイルを意図したAndroidで複数アクティビティを切り替えていく手法は、使い勝手がすこぶる悪い。そのため最初の時代は画面の切り替えのためにアクティビティの中を書き換える形をとったアプリが多かった。ただしそれをまともにやると、表示画面が増えてきたときに、アクティビティ上のコードが破裂することになる。そこでアクティビティ上にフラグメントという単位を用意して、画面ごとの機能を複数の分散して記述できるようにしたのだ。

# 5．ネイティブと同じように作れば良い

　フロントエンドで効率的に開発する肝は、画面ごとに処理を切り分けて記述する部分にある。Web開発においてこの画面単位というのが、htmlのファイル単位になってしまっている部分が問題を大きくしている。htmlのファイルを単位とするからこそ、ページを切り替えなければいけなくなってしまうのだ。その諸悪の根源はbodyタグの中の初期データなのである。

　ではどうやって開発すれば良いのか。答えはネイティブアプリと同じように作っていくことだ。ビューやフラグメントとよばれるものをJavaScriptで記述できるようにし、作ったものを目的の場所に自由に差し込めるようにすれば良い。

　私の場合は表示単位を仮想ウインドウとした。仮想ウインドウは位置解決能力を持ち、特定のノードの子として貼り付けることも出来るし、タイトルバーやフレームを持ったポップアップウインドウとしても動作させることも出来る。

　新たな画面が必要となったら、この仮想ウインドウの機能を継承する。そこでアプリ専用の新しい画面を作ることも出来るし、リストビューやツリービューなど、後から使い回す為の汎用機能を作っておくことも出来る。これをJavaScriptで全て行えるようにするのだ。

　そしてウインドウ単位で画面を切り替えたり、すでにある画面上に重ねてポップアップ表示させて使うのだ。ユーザの入力画面ならポップアップの方が扱いやすいことが多い。

# 6. 実装例

　夢みたいなことを言っていても、実際に作れなければ意味は無い。ということで実装例は以下のような形だ。サンプルの切り分けのため、各サンプルは単独のページとして実装している。

動作サンプル
[https://javascript-windowframework.github.io/JSW/](https://javascript-windowframework.github.io/JSW/) 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267629/6400b1ed-ecf7-21cd-10d9-61521fb1b8fc.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267629/6103990c-27c0-f37e-c933-ca44c000a1ff.png)


ソースコード
[https://github.com/JavaScript-WindowFramework/JSW](https://github.com/JavaScript-WindowFramework/JSW)

　ちなみにTypeDocの吐き出したJSONデータをSPAで単純に表示させるためのサンプルは一時間程度で作ることが出来た。表示の体裁をきちんと整えたり、検索機能などを追加していくともっと時間がかかるだろうが、一から作るより圧倒的に早く開発することが出来る。

　別記事でGoogleDriveの操作をJSWでウインドウ化する内容も紹介した。もちろん使い回せるのでHTMLファイル中で呼び出して、jsの中でインスタンスを作るだけであっという間にアプリに組み込むことが出来る。

　最終的にAPI提供者がViewも一緒に配るようになれば、開発者の苦労の多くを取り払うことが出来るようになる。

# 7．今後のWeb開発に必要なもの

　Web開発システムに対するユーザの体験を向上させ、開発を加速させる方法、それは作成した資産を蓄積し再利用する部分にある。今回のウインドウシステムは一例にしか過ぎないが、こういった形で使い回せるコンポーネントの単位が規格化されていけば、ユーザも開発者も幸せになれるのだ。そんな未来を夢見て活動を続けていきたい。
アプリケーションを管理者権限で起動する

#はじめに
アプリケーションを管理者権限で起動するにはマニフェストファイルに定義する方法もありますが, 実行ファイルのアイコンに盾マークが付いてしまいます. またデバッグ時にはVisual Studioのアクセス許可を引き上げる必要があります.

![admin.png](https://qiita-image-store.s3.amazonaws.com/0/196571/2afa1934-915d-241d-dd68-ddd12c66d2bb.png)

そのため, 起動時に権限を確認し, 管理者権限でなければ管理者権限で再度起動することで実行ファイルに盾マークが付くことなく管理者権限起動することができるようになります.

#権限の確認及び管理者権限で再起動
権限を確認し, 管理者権限でなければ別プロセスとして管理者権限を付与して起動し直します.

```csharp
Thread.GetDomain().SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
var pri = (WindowsPrincipal)Thread.CurrentPrincipal;

//管理者権限以外での起動なら、別プロセスで本アプリを起動する
if (!pri.IsInRole(WindowsBuiltInRole.Administrator))
{
    var proc = new ProcessStartInfo()
    {
        WorkingDirectory = Environment.CurrentDirectory,
        FileName = Assembly.GetEntryAssembly().Location,
        Verb = "RunAs"
    };

    if (args.Length >= 1)
        proc.Arguments = string.Join(" ", args);

    //別プロセスで本アプリを起動する
    Process.Start(proc);

    //現在プロセス終了
    return;

}
```

上記処理をReleaseビルド時のみ有効とすることでVisual Studioでのデバッグ時は既存のプロセスのまま動作することとなりデバッグができることとなります.
以下, 全ソースとなります.

```csharp:Program.cs
using System;
using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {

#if (!DEBUG)
        Thread.GetDomain().SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
        var pri = (WindowsPrincipal)Thread.CurrentPrincipal;

        //管理者権限以外での起動なら, 別プロセスで本アプリを起動する
        if (!pri.IsInRole(WindowsBuiltInRole.Administrator))
        {
            var proc = new ProcessStartInfo()
            {
                WorkingDirectory = Environment.CurrentDirectory,
                FileName = Assembly.GetEntryAssembly().Location,
                Verb = "RunAs"
            };

            if (args.Length >= 1)
                proc.Arguments = string.Join(" ", args);

            //別プロセスで本アプリを起動する
            Process.Start(proc);

            //現在プロセス終了
            return;

        }
#endif

        /* メインの処理 */
        
    }
}
```

#最後に
起動時に管理者権限か確認し起動し直すことで, マニフェストファイルを使用することなく, アプリケーションを管理者権限で起動することができます.
（組み込み系の）展示会リスト2019

#2019年の展示会リスト

###1月

1/16(水)～1/18(金)
ネプコンジャパン
東京ビッグサイト（東1～8ホール、西1,3,4ホール　86,540m2）

1/23(水)～1/25(金)
Japan IT Week 【関西】
組込みシステム 開発技術展
インテックス大阪（前回、6号館　19,358m2）

###2月

2/6(水)～2/8(金)
日本 ものづくり ワールド
機械要素技術展
東京ビッグサイト(前回、東1～8ホール 66,140m2)
8万9千人

2/6(水)～2/8(金)
テクニカルショウヨコハマ
パシフィコ横浜　（A・B・Cホール　13,300m2）
3万6千人

###3月
###4月

4/3(水)～4/5(金)
AI・人工知能 EXPO
クリエイターEXPO
コンテンツEXPO
東京ビッグサイト
4万6千人

4/10(水)～4/12(金)
Japan IT Week 【春 前期】
組込みシステム 開発技術展
東京ビッグサイト(前回、東1～6ホール、西1,2,3,4ホール 71,780m2)

4/17(水)～4/19(金)
名古屋 ものづくり ワールド
機械要素技術展
ポートメッセなごや(前回、1～3ホール　33,946m2)
3万5千人

4/17(水)～4/19(金)
TECHNO-FRONTIER
幕張メッセ
2万9千人

###5月

Maker Faire Kyoto（京都）
5/4<font color="DarkTurquoise">(土)</font>～5/5<font color="Red">(日)</font>

5/8(水)～5/10(金)
Japan IT Week 【春 後期】
ソフトウェア＆アプリ開発展
ビッグデータ活用展
クラウドコンピューティングEXPO
東京ビッグサイト(前回、東1～6ホール、西1,2,3,4ホール 71,780m2)

###6月

###7月

###8月

8/3<font color="DarkTurquoise">(土)</font>～8/4<font color="Red">(日)</font>
Maker Faire Tokyo
東京ビッグサイト　（西1・2ホール）

###9月

9/(水)～9/(金)
JASIS 2018
科学機器展
幕張メッセ国際展示場（4～8ホール 33750m2）
2万4千人

9/11(水)～9/13(金)
センサエキスポジャパン
測定計測展
TEST総合試験機器展
東京ビッグサイト（<font color="DarkTurquoise">南</font>1～4ホール 20,000m2）
5万1千人

9/18(水)～9/20(金)
名古屋ネプコンジャパン
ポートメッセなごや（第2、第3展示場 20,076m2）
3万6千人

###10月

10/2(水)～10/4(金)
関西 ものづくり ワールド
機械要素技術展
インテックス大阪

10/9(水)～10/11(金)
日経TECH EXPO
loT Japan
デジタルものづくり
東京ビッグサイト
7万6千人

10/23(水)～10/25(金)
Japan IT Week 秋
組込みシステム 開発技術展
幕張メッセ
5万3千人

10/23(水)～10/26<font color="DarkTurquoise">(土)</font>
メカトロテックジャパン
ポートメッセなごや(1～3ホール　33,946m2)

###11月

###12月
EC2上のDjangoアプリを独自ドメイン、SSL対応する

EC2のUbuntu 18.04.1 LTSに独自ドメイン名を割り当て、Let's EncryptでNginx、DjangoをHTTPSに対応させたときの手順です。
CloudFrontなどは使わず、直接、EC2を独自ドメイン&SSL化しています。

※この手順はElastic IP(固定のパブリックIP)を使用しています。Elastic IPは使い方次第で料金が発生するので注意してください。

なお、独自ドメインはムームードメインで取得済みのものとし、DNS設定もムームードメインでのケースを記載しています。

# 全体の流れ
- 外部からAWSのEC2へSSL接続できるようポートを開く。
- Elastic IPを取得しEC2インスタンスに割り当てる。
- ドメイン名でアクセスできるようにDjango、Nginxの設定を変更する。
- DNSを設定する。
- Let's Encryptの証明書を取得し、SSL接続できる様にNginxの設定を変更する。
- 証明書を自動取得するようにcron設定する。

# AWSのポートを開く
EC2ダッシュボード - ネットワーク＆セキュリティ - セキュリティグループで、該当するセキュリティグループのインバウンドに443を追加する。

タイプ：HTTPS
プロトコル：TCP
ポート範囲：443
ソース：0.0.0.0/0, :://0

# Elastic IPの取得と設定
EC2ダッシュボード - ネットワーク＆セキュリティ - Elastic IP で新しいアドレスを割り当てる。
Scope：VPC
IPv4 address pool：Amazon pool

アクション - アドレスの関連付け でインスタンスにIPアドレスを割り当てる。
![aws_elastic_ip.jpg](https://qiita-image-store.s3.amazonaws.com/0/250349/26ec4308-b1ae-729f-1a1e-d2abaff43d6c.jpeg)

# Django、Nginxの設定
ドメイン名でアクセスしても動作する様に設定ファイルを修正する。

## Django

```python:settings.py
ALLOWED_HOSTS = ['ドメイン名','IP'] # 取得したドメイン名、IPに修正
```

## Nginx

```shell
cd /etc/nginx/sites-available/
sudo nano Djangoプロジェクト名
```

この時点ではSSL化はしないのでポートは80のまま、server_nameをドメイン名に修正する。

```
server {
    listen 80;
    server_name ドメイン名; # 取得したドメイン名に修正

    〜
}
```

上記を書き換えたら、Nginx、Gunicornをrestartする。

# DNSの設定
ドメインを取得したところでドメイン名とIPアドレスを紐付ける。
ムームードメインの場合、該当のドメイン名をカスタム設定にし、設定2にAレコードを追加する。
サブドメイン：空欄
種別：A
内容：IPアドレス
![mumu_dns_setting.jpg](https://qiita-image-store.s3.amazonaws.com/0/250349/1c3c7326-3630-c450-ca47-6697aa216181.jpeg)


ここまで設定したら、クライアントのブラウザからドメイン名でアクセスできることを確認する。DNSの設定が反映されるまでしばらくかかるかもしれない。

# 証明書の取得とNginxの設定
[Certbot](https://certbot.eff.org/lets-encrypt/ubuntubionic-nginx)のサイトでSoftwareにNginx、SystemにUbuntu 18.04 LTS (bionic) を選択すると設定コマンドが出てくるので、Install、
Get Startedをそのまま実行する。

```shell
sudo apt-get update
～
sudo certbot --nginx
# 上記までを実行する
```

`certbot --nginx`を実行すると、メールアドレスを聞かれたりするので回答していく。
NginxへのHTTPアクセスをHTTPSへリダイレクトするか聞かれたらリダイレクトするように回答し、certbotにNginxの設定を書き換えてもらう。


```
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): メールアドレス

～

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
```

ここまで設定したら、クライアントのブラウザからHTTPSでアクセスできることを確認する。

# 証明書の自動更新設定
下記コマンドが動作することを確認する。
`sudo certbot renew --post-hook "systemctl restart nginx"`

動作するならcronに登録する。
`sudo crontab -e`


```shell:例
# m h  dom mon dow   command
0 1 * * 1 sudo certbot renew --post-hook "systemctl restart nginx"
```

# 参考
[Certbot](https://certbot.eff.org/)
GitLabアカウントをSourceTreeに登録する方法

SourceTreeにGitLabアカウントを登録する際につまづいたポイントの覚え書き。

# 概要
SourceTreeにGitLabアカウントを登録する際にパスワードの入力が必要となる。GitLabアカウントのパスワードを入力するも認証に失敗するため調べたところ、**アクセストークンをパスワードとして入力しなければならない**ことが判った。

# 環境
* macOS 10.14.2
* SourceTree 3.0.1

# 手順
## GitLab - アクセストークンの作成
GitLabにログインして `Settings` へ進み、`Access Tokens` タブをクリックする。

![screencapture-gitlab-profile-personal_access_tokens-2019-01-16-05_45_33.png](https://qiita-image-store.s3.amazonaws.com/0/286440/ce191058-f4a6-ae1d-dd89-07747f89b437.png)

リポジトリのread/writeを許可するため、以下の情報を設定して `Create personal access token` をクリックし、アクセストークンを作成する。

* Name: トークン名
* Expires at: トークンの有効期限
* Scopes: `api` にチェックを入れる

![screencapture-gitlab-profile-personal_access_tokens-2019-01-16-05_47_29.png](https://qiita-image-store.s3.amazonaws.com/0/286440/b552a608-4be5-3e27-05f6-62469393929c.png)

作成されたアクセストークンが表示される。下に注意書きされているように、トークンを後から閲覧することはできないため、ページを開いたまま次の手順へ進む。

## SourceTree - アカウントの登録
必要な情報を以下の通り入力し、`Generate Key` をクリックしてSSH鍵を生成する。その後 `Save` をクリックすると、SSH鍵がアップロードされてGitLabアカウントが登録される。

* Host: `GitLab.com`
* Username: GitLabアカウントのユーザー名
* Password: 前項で作成したアクセストークン**(GitLabアカウントのパスワードではない)**

![Screen Shot 2019-01-16 at 5.55.05.png](https://qiita-image-store.s3.amazonaws.com/0/286440/8207f299-60a7-47b1-ba8d-5e8f0e75a784.png)

# 考察
SourceTreeでは、アクセストークンを鍵としてGitLabアカウントを認証する。鍵は一対の情報としてサーバー(GitLab)とクライアントで交換されなければならないため、クライアント側ではパスワードとしてトークンを用いている。この仕組みを覚えていれば、他のサービスで同様の認証が必要になった際につまずくことはないだろう。

# まとめ
GitLabでアクセストークンを作成し、SourceTreeにGitLabアカウントを登録する手順を示した。
FreeBSD 11.2 に samba をインストールした

SMB3で暗号化が使えるからFTPのかわりにならんかなと思って試してみた。

# インストール

```shell-session
$ sudo pkg install samba48
.
.
.
How to start: http://wiki.samba.org/index.php/Samba4/HOWTO

* Your configuration is: /usr/local/etc/smb4.conf

* All the relevant databases are under: /var/db/samba4

* All the logs are under: /var/log/samba4

* Provisioning script is: /usr/local/bin/samba-tool

For additional documentation check: http://wiki.samba.org/index.php/Samba4

Bug reports should go to the: https://bugzilla.samba.org/
```

# 設定

http://wolfbash.hateblo.jp/entry/2018/02/20/022717

# 起動

```shell-session
$ sudo service samba_server start
```

ちなみに停止は、

```shell-session
$ sudo service samba_server stop
```


# 動作確認

Finderの 移動 -> サーバへ接続 から smb://xxx.xxx.jp/ と入力して接続する。

SMB3で接続して暗号化が行われているかどうかをチェックする。

```shell-session
$ smbutil statshares -a

==================================================================================================
SHARE                         ATTRIBUTE TYPE                VALUE
==================================================================================================
miminashi                     
                              SERVER_NAME                   xxx.xxx.jp
                              USER_ID                       501
                              SMB_NEGOTIATE                 SMBV_NEG_SMB1_ENABLED
                              SMB_NEGOTIATE                 SMBV_NEG_SMB2_ENABLED
                              SMB_NEGOTIATE                 SMBV_NEG_SMB3_ENABLED
                              SMB_VERSION                   SMB_3.02
                              SMB_SHARE_TYPE                DISK
                              SIGNING_SUPPORTED             TRUE
                              EXTENDED_SECURITY_SUPPORTED   TRUE
                              LARGE_FILE_SUPPORTED          TRUE
                              CLIENT_REQUIRES_SIGNING       TRUE
                              FILE_IDS_SUPPORTED            TRUE
                              DFS_SUPPORTED                 TRUE
                              FILE_LEASING_SUPPORTED        TRUE
                              MULTI_CREDIT_SUPPORTED        TRUE
                              ENCRYPTION_SUPPORTED          TRUE
                              SIGNING_ON                    TRUE

--------------------------------------------------------------------------------------------------
```