OmniAICreator/Qiita-1.07M huggingface dataset:
Mysqlのバージョン確認

接続前なら

```terminal
  $ mysql --version
  mysql  Ver 14.14 Distrib 5.7.21, for osx10.13 (x86_64) using  EditLine wrapper
```

接続後なら

```sql
  mysql> select version();
  +-----------+
  | version() |
  +-----------+
  | 5.7.21    |
  +-----------+
  1 row in set (0.01 sec)
```

mysqladminやstatusを使えばより詳細に色々分かる。

接続前

```terminal
  $ mysqladmin version
  mysqladmin  Ver 8.42 Distrib 5.7.21, for osx10.13 on x86_64
  Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

  Oracle is a registered trademark of Oracle Corporation and/or its
  affiliates. Other names may be trademarks of their respective
  owners.

  Server version		5.7.21
  Protocol version	10
  Connection		Localhost via UNIX socket
  UNIX socket		/tmp/mysql.sock
  Uptime:			4 min 53 sec

  Threads: 1  Questions: 2  Slow queries: 0  Opens: 105  Flush tables: 1  Open tables: 98  Queries per second avg: 0.006
```

接続後

```sql
  mysql> status
  --------------
  mysql  Ver 14.14 Distrib 5.7.21, for osx10.13 (x86_64) using  EditLine wrapper

  Connection id:		3
  Current database:
  Current user:		root@localhost
  SSL:			Not in use
  Current pager:		stdout
  Using outfile:		''
  Using delimiter:	;
  Server version:		5.7.21 Homebrew
  Protocol version:	10
  Connection:		Localhost via UNIX socket
  Server characterset:	utf8
  Db     characterset:	utf8
  Client characterset:	utf8
  Conn.  characterset:	utf8
  UNIX socket:		/tmp/mysql.sock
  Uptime:			6 min 14 sec

  Threads: 1  Questions: 7  Slow queries: 0  Opens: 105  Flush tables: 1  Open tables: 98  Queries per second avg: 0.018
  --------------
```
Rails mail develop tips

Railsでメール周りの開発をやることが多いので、ノウハウってわけじゃないが雑に書き残しておく。
思いつきで書いてるので、後で思い出したら追記予定

## アジェンダ

- preview
- CSS
- HTMLメールの作り方
- 確認
- バウンス
- unsubscribe

## preview

開発時にHTMLの見た目を確認する方法

実際にメール送って、 https://github.com/ryanb/letter_opener を使って確認することが多いが、preview機能を使ったほうが圧倒的に早い
[Rails Guides - Action Mailer の基礎](https://railsguides.jp/action_mailer_basics.html#%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AE%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC) にpreviewのリンクがあるのでこちらを参考に

## CSS

HTMLメールにCSSを当てて装飾したい場合があるが、CSSは埋め込み方式 + tableレイアウトで作るのがほとんど。
CSSをせめて外のファイルで管理して他のメールに使いまわしたいので、
その場合は https://github.com/fphilipe/premailer-rails を使う

```app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  layout 'mailer'
end
```

```app/views/layouts/mailer.html.slim
html
  head
    = stylesheet_link_tag 'email', media: 'all'

  body
    = yield
```

```app/assets/stylesheets/email.scss

.main {
    background: #f3f3f3;
}
```

あとはテーブルレイアウトでいい感じに

## HTMLメールの作り方

1からHTMLメールを作るのはすごく大変なので、HTMLメールを作ってそれをHTMLに落とし込めるようにする
以前は https://mailchimp.com/ でGUIでポチポチしていい感じに作ったあとHTMLに吐き出し、それをslimやhamlに置き換えていた

https://beefree.io/ は使ったことないけど、これでもいいかも

## 確認

実際にメールを飛ばすが、本当のユーザーに飛ばすのはよくないので、メールは飛ばないけど実際の画面を見れるサービスを使う。
letter_openerやpreviewでは見つからないバグを見つけるのに便利(cssで画像を埋め込んだパターンで本番だと見えないとか)

https://mailcatcher.me/ or https://mailtrap.io/


mailtrapはLaravelで使ったことあるけど、こっちのほうがセットアップ楽かも？(mailcatcherは自身でセットアップしたことない)


## バウンス

メールのバウンス管理は本当にだるい。今までメールの開発について書いてきたが、めんどくさいので https://sendgrid.kke.co.jp/ 等外部のメール配信サービスに金払って使うほうがいい。
バウンス管理や開封率のレポートとか全部やってくれるし、[send gridのgemもある](https://github.com/sendgrid/sendgrid-ruby)

AWSのSESでやっていた時は、以下のような対応をした

- SESが失敗したバウンスの結果をSQSに流し込む
- https://github.com/phstc/shoryuken でSQSのデータを取り出す
- 取り出した結果をngリストみたいなテーブルに保存し、アプリケーションからメールを飛ばさないように対応

※確かAWSさんからバウンスレート10％超えたから2週間で改善しないとメールをスパム認定するから改善してねーって言われて速攻で対応して0.2%ぐらいにしたような記憶。ダブルオプトインじゃなくて、シングルオプトインだったからバウンスレートがやばかった

## unsubscribe(配信停止)

メルマガ等送られてくる場合、たまに非購読にするリンクがないメールが送られてくるが、特定電子メール法により禁止されているので、つける必要がある
（法律周りはそこまで詳しいわけじゃないのでご了承ください)

よくあるのが、ログイン後にこの画面にいってメルマガ配信停止してくださいみたいなのあるけど、そもそもパスワード覚えてねぇよみたいなことになりがちで結果的に迷惑メール設定してみたいなパターンが多すぎる。

ちなみにsendgridを使えばメール本文に1クリックで配信停止にできるリンクを仕込めます。

## 結論

自分で開発するのはやめて、sendgridを使おう
ホスティングサービスを比較してみた

## はじめに
ウェブサイト・ウェブサービスを公開するには、自分でサーバーを用意するかホスティングサービスを利用しなくてはいけません。

よほどの理由がない限り自分でサーバーを用意するのではなくホスティングサービスを利用する人が多いと思います。
しかし近年ではホスティングサービスの特徴が多種多様になっており選定基準も複雑になりました。
そこで本記事では、有名どころのサービスを比較して紹介することで皆様の選定の助けになればと思います。

なるべく主観的にならないように気をつけていますが
一部は、筆者の実体験に基づくものもあるのでご承知ください。

## [GitHub Pages](https://pages.github.com/)
無料で使える静的サイトのホスティングサービスです。
要件を満たすならば第一に検討してもよいかもしれません。

### メリット
* 無料で独自ドメインを設定できる。
* ブランチへのプッシュするだけで公開される。

### デメリット
* 動的なサイトには対応してない。

## [Netlify](https://www.netlify.com/)
少ないステップで静的サイトを公開できるホスティングサービスです。
GitHub Pagesでは要件を満たせない場合に検討してみるとよさそうです。

### メリット
* 無料で使える機能が多い。独自ドメインも無料です。
* 継続的インテグレーションに標準で対応している。
* フォーム機能など、部分的に動的な機能を使える。
* サーバーレス関数を使える。(AWS Lambdaのようなもの）

### デメリット  
* Netlify固有機能を使わないと動的なサイトは構築できない。

## [Heroku](https://jp.heroku.com/)
多くのプログラミング言語に対応したPaaSです。
動的なウェブサービスを立ち上げたいときに手軽です。

類似サービスとして、[AppHarbor](https://appharbor.com/)という.NETに特化したサービスもあります。

### メリット
* VCSとの連携機能が豊富。
* 拡張機能が豊富。

### デメリット
* 東京リージョン(2019/07/30時点)に対応していない。
* 無料だと550時間/月までしか使えない。超えるとスリープされる。

## [AWS](https://aws.amazon.com/jp/)
Amazonが提供するクラウドサービスです。

### メリット
* プライベートクラウドやネットワークの設定レベルで多様な構成をカスタマイズできる。

### デメリット
* 多様な種類を揃えているため、サービスの選定及び設計ノウハウが必要。

## [Microsoft Azure](https://azure.microsoft.com/ja-jp/)
Microsoftが提供するクラウドサービスです。

### メリット
* Visual Studioとの親和性が高い。
* サポートも充実

### デメリット
* AWSと比較すると料金が高くなりやすい。

## [GCP](https://console.cloud.google.com/getting-started?hl=JA)
Googleが提供するクラウドサービスです。

### メリット
* Googleが提供する幅広いサービスと同等のインフラを活用したクラウドサービスを利用できる。
* 膨大なビッグデータを高速で処理できる。
* 機械学習の技術において、リードしている。

###  デメリット
* リージョンや日本語情報が少ない。
* 日本語訳が準備されていない。


## [Vultr](https://www.vultr.com/)
コストパフォーマンスに優れたVPSです。

### メリット
* UIがシンプルで使いやすい。
* 日本ロケーションのサーバーも選択できる。

### デメリット
* 日本語に対応していない。


## [さくらのVPS](https://vps.sakura.ad.jp/)
日本での知名度が高くコストパフォーマンスに優れたVPSです。
英語に抵抗がなければ、さくらのVPSより、前述のVultrがおすすめです。

### メリット
* ディスクをSSD、HDDから選べる点や、目的に合わせて選ぶことができる。
* 機能面と料金でコストパフォーマンスに優れている。
* 日本リージョンが多い。
 
### デメリット
* 料金が安いが、サーバースペックが他社より劣っている。
* CPUやメモリ容量を見ると、若干スペックが低い。
* 障害が多い。

## まとめ
なるべく上から順番に、要件に照らしあわせて選定できるように並べました。

クラウドサービス系は、大規模なウェブサービスや学習には向いていますが、
小規模であればクラウドサービスを使う必要はないかもしれません。

またGMO系サービス(ロリポップ、お名前サーバー etc)は、本記事では紹介しませんでしたが、
全体的におすすめしません。

初年度の見せかけの安さにつられて使う人が多いと思いますが
使い勝手が悪くサポートも異常に悪いです。ほとんどサポートがBOTで運用されているのではないかと疑うレベルです。
rubyでスターリンソートをやってみた（ブロック渡しも可能）

今話題の[スターリンソート](https://qiita.com/Tatsuki-I/items/380d6bd06515b872b2b2)を `ruby` で実装してみました。

## 準備
``` stalin_sort.rb
class Array
  # Githubの実装と同様
  def stalin_sort
    return [] if empty?

    max = first
    select do |x|
      next if max > x

      max = x
      x
    end
  end

  # ブロックあり
  def stalin_sort_by(&block)
    return [] if empty?

    max = yield(first)
    map { |x| [yield(x), x] }
      .select { |y, _x| next if max > y; max = y }
      .map    { |_y, x| x }
  end
end
```

[Githubの実装](https://github.com/gustavo-depaula/stalin-sort/blob/master/ruby/stalin_sort.rb)は `Array` を引数に取り実行していますが、 `ruby` の良さを活かすためクラス拡張に変更しました。

## 実行
``` ruby
[1, 2, 1, 1, 4, 3, 9].stalin_sort
# => [1, 2, 4, 9]

names = %w(alice bob ava benjamin carol)

# ブロックなし
names.stalin_sort
# => ["alice", "bob", "carol"]

# ブロックあり
names.stalin_sort_by(&:length)
# => ["alice", "benjamin"]
```

簡単になりますが以上です。
掲載したものより良いコードがあれば是非ともお願いします！

## 引用元
* [計算量O(n)の画期的なソートアルゴリズムであるスターリンソートをHaskell で実装してみた #Haskell](https://qiita.com/Tatsuki-I/items/380d6bd06515b872b2b2)
* [Github 公式実装](https://github.com/gustavo-depaula/stalin-sort)
ubuntuでgitの補完をする

# 何をしたいか
ローカルの開発環境として使っている [便利な開発環境](https://github.com/htanaka0828/devbase_for_lamp_template) で
gitコマンドのタブ補完が効かずもやもやしたので忘備録

## 環境情報
詳しくはgitの [README](https://github.com/htanaka0828/devbase_for_lamp_template/blob/master/README.md) と [Vagrantfile](https://github.com/htanaka0828/devbase_for_lamp_template/blob/master/Vagrantfile) を読んで下さい
VagrantImageの[bento/ubuntu-16.04](https://app.vagrantup.com/bento/boxes/ubuntu-16.04)を使っています

## 一発で済ませたい人
`echo "source /usr/share/bash-completion/completions/git" >> ~/.bashrc`
これを打ち込んでやれば次のログインからは補完が効きます

## どういうことよ
[git-completion.bash](https://github.com/git/git/blob/master/contrib/completion/git-completion.bash)ってのをログイン時に読み込ませてあげれば良いのですが
色々な記事を見つつファイルをダウンロードしたりリポジトリを取得したりゴネゴネしてみたものの
一向に読み込まれる気配は無く
無く・・・なく・・・(´；ω；`)ｳｯ…

元々入っている`bash-completion`に入っている`git`の補完を読み込んであげれば解決した
というお話でした

# まとめ
環境に依存する話って文献がなかなか見つからないからしんどいね
開発環境の方も近々直しておきます
Mysql5.6から5.7への移行

自分のローカル環境のmysqlのバージョンが5.6系だった為、5.7系にバージョンを上げてその際に起きたエラーと他のコマンド等の備忘録（Macでやってます）

## 既存のMysqlのデータのバックアップを取る。

まず最初にMysqlのデータベースをバックアップ。
今回は全てのデータベースをバックアップしたかったので

```
$ mysqldump -u root -x —all-databases > mysqlbk.sql
```

一応ファイルと中身があるか確認

```
$ ls mysqlbk.sql
$ cat mysqlbk.sql ←これはやらない方がいいと思う
```
mysqlの停止

```
$ mysql.server stop
```
ただしここでエラーが発生

```
The server quit without updating PID file (/usr/local/var/mysql/ここはユーザーのmacbook-proとか出ます.local.pid).
```

もろもろ調べてみました（この辺りの記事）
https://qiita.com/_natsu_no_yuki_/items/ae4c94187093e4ab3cdc
http://morototo.hatenablog.com/entry/2017/07/29/103204

とりあえず上の記事を参考にして

```
$ sudo rm -rf /usr/local/var/mysql
$ brew uninstall mysql
$ brew install mysql@5.7
```
再度試してみました

```
$ mysql.server start
...
The server quit without updating PID file (/usr/local/var/mysql/ここはユーザーのmacbook-proとか出ます.local.pid).
```
もしかしたらプロセスが残っているからなのではと思い

```
$ brew uninstall mysql@5.7
$ ps aux | grep mysql
```
これでmysql5.6で生きていたプロセスがあったので

```
$ kill -9 対象のPID
```
これで削除ののち

```
$ brew install mysql@5.7
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
$ mysql.server start
SUCCESS!
```

動いたので自動起動の設定も

```
$ ln -sfv /usr/local/opt/mysql@5.7/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql@5.7.plist
```
バックアップの復元も

```
$ mysql -u root -p < mysqlbk.sql

$ mysql -u root -p
> show databases;
```

無事に全てのデータが格納されていました。
pidのエラーに関してはもう少しちゃんと調べれば簡単に解決できそうでした。

### 参考にした記事
https://qiita.com/mikakane/items/6857a4ae25ceaed4ee4e
https://qiita.com/dkjym/items/d2bfca70bc9b0c2ee9dc
5 cheap accessories for your mobile that are worth

![iphone cases.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463272/3118a101-2605-f748-c4ce-e79afb3d92c3.jpeg)


These 5 cheap accessories allow us to improve our mobile experience at a very low price. MicroSD card, Phone cases, and many more offers.

Accessories can improve our mobile experience. There are all categories and prices, being able to spend several hundred euros to improve the experience of our mobile.

Today we focus on five very cheap accessories that are very worthwhile. Some are temporary offers, while others simply tend to be around this price. They all have something in common, and their prices are very affordable.

###Cheap accessories: 128 GB Sandisk card for INR1200


If your mobile phone has support for microSD cards, you can greatly expand the storage with this Sandisk microSD card. By installing this card on your mobile, you can have 128 GB of extra memory to save all the music and photos you want.

It also has the A1 standard, which guarantees an adequate speed to install applications on the card. Of course, being able to install applications on the microSD card is not a feature that is available on all phones with a microSD card.

###Designer mobile phone case
[Mobile phone cases](https://www.marketwatch.com/press-release/meet-the-latest-engenius-psl-pro-single-line-long-range-cordless-phone-2019-10-05) are also one of the most selling products. People love phone cases because it protects your phone from damages and dust particles. Nearly all of us have phone cases with us but when it comes to buying a designer case with cool prints then [Zepper back cover](https://www.zepper.in/mobile-cover-back-cover-in-india/) comes to my mind every time
These phone cases are worth buying due to its diversity n design and the brand has a good reputation in the market.

###JBL portable speaker for INR1700


Do you like listening to music anywhere but your mobile speaker offers insufficient power? This portable JBL speaker offers good sound quality if we consider its size, weight, and price.

Its battery gives for 5 hours of music playback, and you can connect it both by Bluetooth and by 3.5mm jack cable. Ideal to enjoy music with friends wherever you go.

###Xiaomi Powerbank of 10,000 mAh for INR999


External batteries allow us to extend the autonomy of our mobile, tablet, or accessories. This Xiaomi model can fully charge your mobile more than 2 times, in addition to charging the battery of other accessories.

Xiaomi power banks stand out for the quality of the materials and their compact format. If you are looking for a good power bank that is also made of aluminum, this is one of the options that gives us more confidence.

###Mobile Holder for INR399

Thanks to the capabilities of Google Maps, sometimes to have a good GPS in the car all you need is a mobile phone holder. This Portable model grips well in flat positions thanks to its suction cup, it offers us good cheap support.

This is the only accessory that costs less than 400, but we assure you it is worth it.
Vueプロジェクトにおいて、クラスにプロパティを持たせようとした時のエラー

vue-cliのプロジェクトにおいて、

```
class AuthService extends EventEmitter {
  idToken = null // ←これがエラーになる
  profile = null
  tokenExpiry = null

  // Starts the user login flow
  login (customState) {
    webAuth.authorize({
      appState: customState
    })
  }
...
}
```
こういう書き方をすると、

```
Syntax Error: Unexpected token (9:10)

   7 | 
   8 | class AuthService extends EventEmitter {
>  9 |   idToken = null;
     |           ^
  10 |   profile = null;
  11 |   tokenExpiry = null;
  12 | 

```
こんな文法エラーぽいのがでた。



`package.json`に

```
  ...
  "devDependencies": {
    "@babel/polyfill": "^7.4.4",
    "@vue/test-utils": "^1.0.0-beta.29",
    "autoprefixer": "^7.1.2",
    "babel-core": "^6.22.1",
    "babel-eslint": "^8.2.1",
    "babel-helper-vue-jsx-merge-props": "^2.0.3",
    "babel-jest": "^24.8.0",
    "babel-loader": "^7.1.1",
    "babel-plugin-istanbul": "^4.1.1",
    "babel-plugin-syntax-jsx": "^6.18.0",
+   "babel-plugin-transform-class-properties": "^6.24.1",
    "babel-plugin-transform-runtime": "^6.22.0",
    "babel-plugin-transform-vue-jsx": "^3.5.0",
```

`.babelrc`

```
+   "plugins": ["transform-runtime", "transform-class-properties"],
```


でエラーが解消された。
nusterキャッシュ永続化

NusterはHAProxyを元に開発したキャッシュサーバで、HAProxyと互換性がある。
そしてHAProxyのACLを利用して細かいキャッシュルールを定義できる。新しいリリースしたv3.0.0.19では永続化機能が追加されて、永続化について紹介したいと思います。

ホームページ
https://github.com/jiangwenyuan/nuster

ruleベースで４つの永続化モードが使えます。

```
nuster rule name [key KEY] [ttl TTL] [code CODE] [disk MODE] [if|unless condition]
```

- off: デフォルト、メモリのみに保存する
- only: メモリに保存せず、ディスクだけに保存する
- sync: メモリとディスクに保存してからクライアントに返す
- async: メモリに保存してクライアントに返す、後ほどmaster processによってディスクに保存される

例えば

```
global
    master-worker
    nuster cache on data-size 10m dir /tmp/cache
    nuster nosql on data-size 10m dir /tmp/nosql
backend be
    nuster cache on
    nuster rule off   disk off   ttl 1m if { path_beg /disk-off }
    nuster rule only  disk only  ttl 1d if { path_beg /disk-only }
    nuster rule sync  disk sync  ttl 1h if { path_beg /disk-sync }
    nuster rule async disk async ttl 2h if { path_beg /disk-async }
    nuster rule others ttl 100

```

/disk-off はメモリのみに保存される
/disk-only はディスクのみに保存される
/disk-sync はメモリとディスクに保存してからクライアントに返す
/disk-async はメモリに保存してクライアントに返す。後ほどmaster processによってディスクに保存される
ほかはメモリに保存される
Unity Shader入门精要----第三章<Unity Shader基础>

# Unity Shader的基础

## 3.3 Unity Shader结构

### Shader名称

命名: *Shader “Custom/MyShader”​*

### Properties

只是为了让这些属性可以出现在材质面板中。
可以通过[カスタムシェーダー GUI - Unity マニュアル](https://docs.unity3d.com/ja/current/Manual/SL-CustomShaderGUI.html)对材质面板GUI进行自定义
![image-20190725175604319](http://ww2.sinaimg.cn/large/006tNc79gy1g5cygux8awj31eg0hq153.jpg)

### SubShader

需要包含1个或以上的Subshader语义块。
***Pass 的数目过多会造成渲染性能下降。***
状态和标签可在SubShader和Pass里同时设置，SubShader中设置的将会作用于所有的Pass

- 状态设置
  ![image-20190725175632839](http://ww1.sinaimg.cn/large/006tNc79gy1g5cyh8azwej31eg0cm7ch.jpg)
- SubShader标签
  键值对(Key/Value Pair)。 建和值都是字符串类型。
  结构：
  Tags { “TagName1” = “Value1” “TagName2” = “Value2” }
  以下标签仅可在SubShader中声明
  ![image-20190725175644550](http://ww3.sinaimg.cn/large/006tNc79gy1g5cyhfwkbxj31b40u0kjc.jpg)
- Pass 语义块

```
Pass {
	[Name]
	[Tags]
	[RenderSeteup]
	// Other code
}
```

1. Name

   UsePass "MyShader/MYPASSNAME" 

   使用UsePass命令时必须使用大写形式的名字

2. Tags

   ![image-20190725180359205](http://ww3.sinaimg.cn/large/006tNc79gy1g5cyimlvynj31f00a4aib.jpg)



- Fallback

  所有的SubShader都不被支持的时候的最终选择。个人感觉类似于Try/Catch里的Finally

```
Fallback "name"
// Or
Fallback Off
```



## 3.4 Unity Shader的形式

Unity可以使用3种形式编写Unity Shader

### 1. Surface Shader

Unity自创。代码量少，渲染代价比较大。

类似于对顶点/片元Shader的更高一层抽象。

处理了很多光照细节

**表面着色器定义在SubShader而非Pass中， 不需要关心使用多少个Pass和Pass中如何渲染**

### 2. Vertex/Fragement

Shader需写在Pass内

灵活性很高，可以控制渲染的实现细节

与Surface Shader相同都是由CG/HLSL编写

### 3. Fix-function

完全使用ShaderLab语法，而非CG/HLSL

5.2之后所有固定函数Shader都会被编译为Vertex/Fragment Shader

### 如何进行选择

- 尽量使用Surface shader或Vertex/Fragment shader
- 如果和多种光源打交道，表面着色器会更方便，但需注意移动端性能
- 光照数目非常少，或者有很多自定义的渲染效果，选择顶点/片元着色器

## 3.6 答疑

- Unity Shader != 真正的Shader。 Unity Shader提供了一种让开发者同时控制渲染流水线中多个阶段的一种方式。一般情况下，不需要关注渲染引擎底层的实现细节。
- Unity中CG和HLSL是等价的。
- 也可以使用GLSL来写，但是平台会受到限制（个人体会，真的不好用）
AWS上でphpをrpmでインストールする時のrequireメッセージに注意

```
Error: Package: php-mysql-5.3.3-49.el6.x86_64 (/php-mysql-5.3.3-49.el6.x86_64)
           Requires: php-common(x86-64) = 5.3.3-49.el6
           Removing: php-common-5.3.3-49.el6.x86_64 (installed)
```

とか言ってるくせに、本当にいるのはphp-pdoと言うこの詐欺メッセージ。だって、既にこのcommonは入れてるから。

## php-pdoとは
php-data-objectのことで、データベースの文字列をphpの扱うオブジェクトデータに変換するものです。これを引っ張ってきてください。

[rpm php-pdo](https://pkgs.org/download/php-pdo)
TypeScriptの場合はnode系でもrequireではなくimportを使う

# TypeScriptの場合はnode系の処理系でもrequireではなくimportを使う
備忘も兼ねて。
javascriptによるModule管理と言うと、webpack利用の場合はimport,node系の場合は余程新しいのを使わない限りはrequireを使うという印象だった。
実際、FirebaseのCloudFunctionのサンプル辺りも、基本はrequireである。

が、TypeScriptでCloudFunctionを書こうと思ったら
コンパイルエラーにはならないもののimportを使えと警告が出てしまった。

## TypeScriptにrequireはない
原理としては単純で、TypeScriptにrequireはないだけだった。
requireでも一応動くのは、TypeScriptがJavaScriptのスーパーセットだからで、全てanyと見做して動かしているためである。
実際、VSCodeでrequireを利用した場合と、importを利用した場合の挙動を比べてみると、
前者では型情報が取得できないためにコードアシストの類がほとんど効かない。

ちなみに、コンパイル後はimportで書いてもきちんとrequireに変換されていた。

## まとめ
* TypeScriptの場合は基本importでOK
* requireでも動くが型情報が落ちるのでTypeScriptのメリットがなくなる
VRMMOゲーム開発:リアルタイム通信

##如何にして90fpsを達成するか
VRMMOにおいてはリアルタイム性が重視されます。
ボイスチャット然り、動作反映然り。
その指標となる、90fpsの達成方法について考察します。
90回通信/秒より、一回の所要時間は10^-2程度、同時接続1000人とすると、負荷を考慮して1000で割って、10^-5の通信速度が求められます。

## jsonデータ
ゲームオブジェクトは、何らかの値を常時持っており、更新されます。これを、クライアント間で共有せねばなりません。
その為には、ゲームオブジェクトを識別可能として、値を文字列に変換する事が要と思われます。
構造化データ形式は限られており、unityの基本はゲームオブジェクト。そこで、ゲームオブジェクトの json化をします。 json utilityを用います。(他の方法が思いつきませんでした)
また、mysqlが jsonをサポートしている事もあります。

##通信

同期というのは恐らく手間がかかります。通信速度に影響します。
そこで、同期をやめます。
何かというと、ソケット通信時、c++ 変数に 文字列jsonを指定し、都度新しい jsonを丸ごと代入してあげます。これで、予想が正しければ、解析の時間が無くなります。その後、新しい jsonを、自分以外のポートに伝送します。(やり方はまだ分かりません)
プロトコルは、正確さが求められる場合はTCP、速さが求められる場合はUDPを用います。独自プロトコルについては、検討します。

##大事なこと
全体としての手続きを簡略化する事が重要です。速さと正確さの担保となります。
クライアント、サーバ双方で、常に何らかの処理をさせる、遊ばせない、これを重視したく思います。

##最後に
当方、超がつくほどの初心者です。
結局、根本にあるのは、unityはc++ で出来ているし、c++ はcの発展系だから、何とかなるだろうという考えです。ビジョンが先にあって、エンジンやプログラミング言語を用いて調節、最適化しながら、目標を目指します。

当方、unity、c、c++ 、c#について全くの初心者です。これから勉強してゆきます。

##追記

magic onionも検討中です。オープンソースライブラリということで、後でgithubにて確認します。
素数の数え上げをO(n)で実装

Nまでの素数の個数をO(N)で求める方法を思いついたので投稿します。
以下プログラムです。

```cpp
#include <iostream>
#include <vector>
#define ll long long int 
using namespace std;
vector<ll> p;
ll D(ll n,ll k);
int main(void){
	ll ans=0,N=0;
	int flag=0;
	p.push_back(2);
	while(1){
		while(N<=3){
			cout<<"Nまでの素数の個数を求めます。(N>3)"<<endl;
			cout<<"N:";
			cin>>N;
		}
		for(int i=p[p.size()-1]+1; p[p.size()-1]*p[p.size()-1]<=N; i++){
			for(int j=0; p[j]*p[j]<=i; j++){
				if(i%p[j]==0)flag=1;
			}
			if(flag==0)p.push_back(i);
			flag=0;
		}		
		ans = N-1-D(N,p.size()-2);
		cout<<N<<"までの素数の個数: "<<ans<<endl;
		ans=0;
		N=0;
	}
	return 0;
}
ll D(ll n,ll k){
	ll tem,ret;
	if(n<=3)return 0;
	if(p[k]*p[k]>n) return D(n,k-1);
	if(k==0)return (n/2)-1;
	tem = n/p[k];
	ret = D(n,k-1)+tem-1-k-D(tem,k-1);
	return ret;
}
```

それぞれ説明していきます。
まずこのアルゴリズム自体は「√Nまでの素数が全てわかればNまでの素数の個数が求まる」というものです。どうやって求めているかを大雑把に説明すると、Nまでの合成数は全て√N以下の素数で割り切れるというのを利用して合成数の個数を求め、それをNから引くことで求めています。（厳密には1が残るので１を引かないといけません）

√N以下の素数を求めている場所はここです

```cpp
for(int i=p[p.size()-1]+1; p[p.size()-1]*p[p.size()-1]<=N; i++){
	for(int j=0; p[j]*p[j]<=i; j++){
		if(i%p[j]==0)flag=1;
	}
	if(flag==0)p.push_back(i);
	flag=0;
}		
```

pは素数を表すvectorです。（p[0]=2, p[1]=3, p[2]=5, . . .）
初期の状態でp[0]だけ2になってるのでこれで求めることができます。
ここは本題ではないので細かい解説は省きます。

次は本題のD関数です。
D(n,k)はn以下の合成数のうちk番目までの素数で割り切れるものの個数です。
例えばD(10,1)なら10以下の合成数のうち1番目までの素数(2と3)で割り切れるものの個数となります。なので4,6,8,9,10の5つで5となります。
そしてこの関数からは次の漸化式が成り立ちます。

```
D(n,0) = n/2 - 1
D(n,k) = D(n,k-1) + n/p[k] - 1 - k - D(n/p[k], k-1)
```

割り算は全てintの除算ですので、切り捨てです。
一つ目の式は簡単に理解できると思います。
単純に2で割れるものの個数がn/2で素数である2を含んでいるので1を引いてます。

次の式は少し難しいです。

k-1番目までの素数で割り切れる合成数の個数にk番目の素数のみで割り切れる合成数の個数を足してます。k番目の素数のみで割り切れる合成数というのは、p[k]で割り切れてp[t]（t<k)で割り切れない合成数のことをさしています。

k-1番目までの素数で割り切れる合成数の個数はD(n,k-1)ですね。定義の通りです。

k番目の素数のみで割り切れる合成数は、まず一つ目の式のようにn/p[k] - 1でp[k]で割り切れる合成数の個数を求め、それから重複した数を引いています。
重複した数はk + D(n/p[k], k-1)で求められます。

重複した数というのは例えばnが30、kが2の場合、10,15,20,25,30の中から2と3で割り切れるものをなくせば良いのでまずこれらを5で割り2,3,4,5,6にします。
5で割った後に2,3で割り切れるなら最初から2,3で割り切れるので2,3,4,5,6の中から2,3で割り切れるものをなくせば良いわけです。そしてそれらの個数はD(6,1)+2となるのでk + D(n/p[k], k-1)と同じ形になっているのがわかると思います。

これによって再帰的に求めることができるというのがわかっていただけたと思います。

計算量については√n>p[k]である事を考えると最大でO(√n*√√n*√√√n*√√√√n*. . .)となります。また指数部に注目すると1/2+1/4+1/8+1/16+. . .=1となるのでO(n)になります~~(多分)~~
実際Dが実行される回数を数えるとNを2倍すると2倍くらいになってたのであってると思います。

いずれ時間があればメモ化再帰にしたりkが小さい時の処理の工夫をしたりすることで高速化ができるという事について書くかもしれないです。
Mac で Eclipse GitBucket ssh が Algorithm negotiation fail で使えないときの対処

最新の pleiades だと最初から、Eclipse_4.6 Neon だと Spring 系プラグインを入れたら、GitBucket からインポートするときに ssh が Algorithm negotiation fail で使えなってしまいました。対処がわかったのでメモ残しておきます。

# ssh のパスを確認

```
$which ssh
/usr/bin/ssh
```

# 環境変数に GIT_SSH を追加
```
$vi .bash_profile
export GIT_SSH=/usr/bin/ssh
```

# 暗号の種類追加
```
$vi /etc/ssh/sshd_config

# AuthorizedKeysFile の次くらい（適当）に以下の行を追加
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
```

# 設定を反映
```
$source ~/.bash_profile
```

# sshd を再起動
```
$sudo launchctl stop com.openssh.sshd
$sudo launchctl start com.openssh.sshd
```

# Eclipse clean 起動
```
$[Eclipseインストールディレクトリ]/Eclipse_4.6.3.app/Contents/MacOS/eclipse -clean
```

これで、ssh チェックアウトできました。
Lookerのグラフで土日の日付の色を変える

# グラフが見づらい問題の解消
自社でLookerを使っているのですが土日の数字が平日とは違った動きをすることが多く、祝日までとは言わないので土日だけでも色を変えたいと思いました。
下の画像を見ていただくとどの曜日かが分からず見づらくないでしょうか？
<img width="2189" alt="修正前" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170870/dadf0e08-02cd-cafa-370a-74a25e8afcda.png">
お問い合わせしたところLookerのサポートの方に丁寧に説明していただいたので共有します。

# 前提条件
・自社ではTreasureDataを使っています
・各々の環境で置き換えてください。

# 実装

time型の`dimension_group`を定義してください。

```
  dimension_group: time {
    label: "日時"
    type: time
    datatype: epoch
    timeframes: [raw, time, hour, hour_of_day, date, week, month, year, day_of_week_index]
    sql: ${TABLE}."time" ;;
  }
```
次に日付に色付けを行う`dimension`を定義します。
`sql: ${time_day_of_week_index}`で、曜日を数字で取得し、htmlパラメータ内で数字が`5(土曜日)`または`6(日曜日)`の場合に、上記の`dimension group内のdateの値`を参照し色付けします。
色付けは`Liquid html`を使用しています。

```
  dimension:time_date_color {
    type: number
    label: "日時(装飾用)"
    sql: ${time_day_of_week_index}  ;;
    html: {% if value == 5 %}
          <font color="blue"> {{ time_date._value }} </font>
          {% elsif value == 6 %}
          <font color="red"> {{ time_date._value }} </font>
          {% else %}
          {{ time_date._value }}
          {% endif %};;
  }
```

# 使い方
time_date、新規で作成したdate_colorと表示させたい他のdimensionやmeasureを選択します。
次に`created_date`のfieldで`Hide From Visualization`をクリックします。
それにより、date_colorと表示させたい他のdimensionやmeasureのみがVisualization上に表示されます。
## tips
time_dateが必要なのは、date_colorのみを選択した場合に日付でソートができなくなってしまうためです。
なので選択後に`Hide From Visualization`する必要があります。

# 完成
<img width="2202" alt="修正後" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170870/a71d660e-7b00-18c2-d75a-f81e5dcf1181.png">

このように土日が視覚的にわかりやすくなったのではないかと思います。
祝日は自社のDBなどに祝日データを持って置いたりしないといけないと思われるのでひとまずここまで・・・。
PHP で 配列の値を順番までランダムにして取得する関数

PHP で普通に配列から値を取得しようとすると `array_rand()` で取得したキーを元の配列に入れる微妙な面倒さがあり、ついでにこれだけだと順番がランダムになっていなくて、それもまた微妙に面倒。

ということで配列と取り出す数を指定してサクッとランダムに取り出せる関数を書いた

```php
function array_rand_and_shuffle(array $array, int $num_req)
    {
        shuffle($array);
        // 配列の要素数が取得数に満たない場合はシャッフルだけする
        if(count($array) <= $num_req) return $array;

        $random_keys = array_rand($array, $num_req);
        $rand_array = [];
        foreach($random_keys as $key){
            $rand_array[] = $array[$key];
        }
        return $rand_array;
    }
```
“unsafely-treat-insecure-origin-as-secure” の設定をGUIで行う方法について

現在地把握のためのメソッドgetCurrentPosition()を含む処理を久しぶりに修正する事になったので、開発環境で検証しようとしたところ以下のようなメッセージがコンソールに表示された。

~~~Chrome:Chromeのconsole画面に表示されたメッセージ
getCurrentPosition() and watchPosition() no longer work on insecure origins.
To use this feature, you should consider switching your application to a 
secure origin, such as HTTPS. See https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins 
for more details.
~~~

ローカルでの開発環境だと当然https対応していないので、別の方法を色々と調査したところ、ターミナルを開いて以下のようなコマンドを実行するという情報が見つかった

~~~CUI対応：CUIコマンド
open -a "/Applications/Google Chrome.app" --args  --unsafely-treat-insecure-origin-as-secure="http://localhost/" http://localhost/
~~~

※参考：
* https://egashira.jp/treat-localhost-as-secure
* https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins

詳細は分からないが、CUIベースでの対応方法だと、自分のPCでは動作しなかった。
そこで、GUIベースでの対応方法を調査し、対応方法を見つける事ができた。

# GUIでの“unsafely-treat-insecure-origin-as-secure”設定方法
以下2ステップで対応するだけという、非常に簡単な対応で済みます。

1. Chromeのアドレスバーに `chrome://flags/#unsafely-treat-insecure-origin-as-secure` と入力する

2. secureな環境と偽装させたいURLを、`insecure origins as secure`という欄に入力してEnabledにする

![7da844534682551a774e8c001eae3a3d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429583/8d985b51-8ffe-43b1-28ea-4a563b89676a.png)

意外と、ここら辺の情報がなかったので、方法が分かって良かった。。。
[Swift]UIViewにaddGestureRecognizerしようとしてつまずいた話

#問題

UIViewにUITapGestureRecognizerをaddGestureRecognizerしようとしてもできなかった

#前提

・isUserInteractionEnabled = true
・UIViewもnilではなかった

#解決方法

```swift
addGestureRecognizer(.init(target: self, action: #selector(tapped)))
```

initを直したら動きました

```swift
addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapped)))
```

#最後に

今思うとaddGestureRecognizerなので、.initで書いたらサブクラスのUITapGestureRecognizerではなく,スーパークラスのUIGestureRecognizerが呼ばれるので、それはそうですよねというお話(引数が同じなのですっかりハマってしまいました。😇😇
IntelliJ IDEA が起動しなくて困ったら

<!-- TITLE: IntelliJ IDEA が起動しなくて困ったら -->
<!-- TAGS: IntelliJ -->

ある日突然 IntelliJ IDEA が起動しなくなって困ることはありませんか？
私はありました。
うまく解決できるかもしれない方法を教えてもらったので、ここで共有します。

### 現象

- 操作: Dock にある IntelliJ IDEA のアイコンをクリックします。
  - これ→<img width="126" alt="スクリーンショット 2019-07-30 18.13.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415135/b381c78f-b9e1-423f-57bb-8d497a7718ab.png">
- 期待: IntelliJ IDEAが起動。すごいプログラムをバリバリ書けるようになってほしいです。
- 実際: アイコンがピコピコ動くだけ。IntelliJ IDEA のプロセスすら立ち上がりません。

#### 環境

- MacOS Mojave 10.14.5
- IntelliJ IDEA ULTIMATE 2019.2

### 解決方法

以下のようにターミナルから直接 IntelliJ IDEA を起動すると、起動に失敗した理由を標準出力に表示してくれます。
標準エラー出力かも。

```bash
$ /Applications/IntelliJ IDEA.app/Contents/MacOS/idea
```

私の場合は以下のようなメッセージが出ました。

```
2019-07-30 16:40:50.078 idea[30387:314035] allVms required 1.8*,1.8+
2019-07-30 16:40:50.081 idea[30387:314042] Value of IDEA_VM_OPTIONS is (null)
2019-07-30 16:40:50.081 idea[30387:314042] Processing VMOptions file at /Users/ta.yamashita/Library/Preferences/IntelliJIdea2019.2/idea.vmoptions
2019-07-30 16:40:50.081 idea[30387:314042] Done
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
Error occurred during initialization of VM
Initial heap size set to a larger value than the maximum heap size
```

要するに、 `/Users/ta.yamashita/Library/Preferences/IntelliJIdea2019.2/idea.vmoptions` の読み込みがうまくできてなくて、その理由は `Initial heap size` が `maximum heap size` よりデカいせいらしいです。


当該のファイルには

```
-Xms4096m
-Xmx2048m
```

のような記述があったので、最大のヒープサイズを表す `-Xmx` の方を `4096m` に修正しました。
元々そうしていたつもりなんですけどね。

結果、アイコンをクリックして IntelliJ IDEA を起動することができるようになりました。
めでたし、めでたし。
「WEBを支える技術」のまとめ２

「Webを支える技術」のメモです。

3部HTTP

#6章 HTTPの基本

HTTPは、RESTの重要な特徴である統一インターフェース、ステートレスサーバ、キャッシュなどを実現している、Webの基盤となるプロトコルです。
また、HTTPは、[TCP/IP](https://qiita.com/genreh/items/05186691fbf8c10a4a48)をベースにしています。

##クライアントとサーバ
Webはアーキテクチャスタイルに、クライアント/サーバを採用しています。そしてHTTPでは、
クライアントが出したリクエストをサーバで処理を行ってからレスポンスを返します。
サーバでの処理時間がかかる場合でも、リクエストを出したクライアントはレスポンスが返るまで待機します。これはHTTPが同期型のプロトコルであるためです。

###クライアント側で行われること
クライアントは、一つのリクエストを送信し、レスポンスを受信する際に、次のことを行います。

・リクエストメッセージの構築
・リクエストメッセージの送信
・レスポンスが返るまでの待機
・レスポンスメッセージの受信
・レスポンスメッセージの解析
・クライアントの目的を達成するために必要な処理

###サーバで行われること
クライアントからリクエストを受けたサーバは、次のことを行います。

・リクエストの待機
・リクエストメッセージの解析
・適切なアプリケーションプログラムへの処理の委譲
・アプリケーションプログラムから結果を取得
・レスポンスメッセージの構築
・レスポンスメッセージの送信

###HTTPメッセージ
リクエストメッセージとレスポンスメッセージをまとめて、「HTTPメッセージ」と呼びます。

####リクエストメッセージ
1.リクエストライン
リクエストメッセージの一行目は「リクエストライン」と呼び、メソッド(GET等)、リクエストURL、プロトコルバージョンから成り立ちます。

2.ヘッダ
リクエストメッセージの2行目以降はヘッダが続きます。ヘッダはメッセージのメタデータです。
1つのメッセージには複数のヘッダを持つことが出来ます。

3.ボディ
ヘッダの後にボディが続くことがあります。ボディには、そのメッセージが表す本質的な情報が入ります。

####レスポンスメッセージ
1.ステータスライン
レスポンスメッセージに1行目は「ステータスライン」と呼び、プロトコルバージョン(HTTP/1.1等)、ステータスコード(200等)、テキストフレーズ(OK等)から成ります。

2.ヘッダ
レスポンスメッセージの2行目以降は、リクエストメッセージと同様にヘッダです。

3ボディ
こちらもリクエストメッセージと同様です。

###HTTPのステートレス性
HTTPはステートレスなプロトコルとして設計されています。
ステートレスとは、サーバがクライアントのアプリケーション状態を保存しないということです。
こちらの記事を見てもらうと分かりやすいです。(テキストと同じないようなので、引用させてもらいました笑)
[ステートレスとは](http://yohei-y.blogspot.com/2007/10/blog-post.html)

サーバがステートフルな場合、サーバがクライアントの状態を覚えます。しかし、クライアントの数が増えれば増えるほど、サーバの負荷が大きくなり、スケールアウトしにくい設計となります。
この問題を解決するのがステートレスなアーキテクチャです。ステートレスサーバでは、処理に必要な情報はすべてクライアントからのリクエストに含まれており、各クライアントが自身のアプリケーション状態を(覚えて)伝えるので、サーバ側のシステムは簡素になります。


##HTTPメソッド

###8つしかないメソッド
HTTPメソッドには、クライアントが行いたい処理をサーバに伝えるという重要な役割があるのにも関わらず、8つのメソッドしか用意されていません。

・GET/リソースの取得
・POST/子リソースの作成、リソースへのデータの追加、その他の処理
・PUT/リソースの更新、リソースの作成
・DELETE/リソースの削除
・HEAD/リソースのヘッダ(メタデータ)の取得
・OPTION/リソースがサポートしているメソッドの取得
・TRACE/自分宛てにリクエストを返す試験
・CONNECT/プロキシ動作のトンネル接続への変更


これほどにメソッドの数を限定したからこそ、HTTPが(Webが)成功したともいえます。


####べき等と安全性
通信エラーが発生した場合に、リクエストをどのように回復するかは、HTTPにおいて重要な課題です。HTTPの使用では、プロトコルのステートレス性を保ちながら、この問題を解決するための工夫がなされています。
次の表を見てみましょう。


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

べき等とは、「ある操作を何回行っても結果が同じこと」を意味します。
PUTやDELETEを同じリソースに何回発行しても、必ず同じ結果(リソースの内容が更新されている、削除されている)が得られます。

安全とは、「操作対象のリソースに副作用が無いこと」を意味します。
副作用とは、リソースの状態に変化を与えることを言います。
GETには副作用が無いので、GETを同じリソースに対して何回発行しても、リソースの状態は変化しません。

※べき等でも安全でもないPOST
POSTはべき等でも安全でもないので、使用する際は必要です。
例えば、ショッピングサイトでブラウザの戻るボタンを押した場合に「もう一度送信しますか？」というダイアログが出ることがあります。これはPOSTを再送信しようとしているからです。もしダイアログが出現しない場合、自動的にPOSTを再送信してしまい、二重注文になってしまします。
ibm cloudにdeployしていたappが動かなくなっていたので対応した

いつの間にか、ibm cloudで動かしてたappが動かなくなってたので、その時やったこと。

> A service instance was not found in this resource group and region us-south

このエラーは正直良くわからないけど、なんか適当にツールを追加したらいつの間にか、過去ツールが動くようになっていて、追加したツールを削除した。しばらくログインしてなかったからだと思う。

ibm cloudは、Web UIがコロコロ変更されるので、正直、よくわからん状態。

1. `Pipeline | Delivery Pipeline`で`Deploy Stage`の構成をpipline img(latest:2.3)にする

> IMPORTANT: The Continuous Delivery Pipeline is being updated to pull a specific Docker image to run each job, either one of the built-in ones or your own custom image. This job is being run with the oldest image. You should consider moving to a more recent one, to get more recent versions of the included tools.

バージョンが古かったらしいので、最新にしてみた。

2. memory不足を言われるので、manifest.ymlで指定して`cf push`する

> Error restarting application: Server error, status code: 400, error code: 100005, message: You have exceeded your organization's memory limit: app requested more memory than available

WebのGUIからの操作で何故かメモリが足りないエラーが出て、デプロイできない。CUIからmanifest.ymlでmemory:256MBを指定して、pushしたらデプロイ成功した。
UDP & OSC @ Max8

# 概要
Max8やその他のアプリケーションでもよく使う「OSC」と「UDP」について。大まかなIPの構造やMacベースでのセットアップ方法。
ちょっと長めになります

# UDP,OSCとはなんぞや
UDPはUser Datagram Protocol、OSCはOpen Sound Controlの略です。
UDPは複数デバイスやアプリケーション間でデータを送受信するためのプロトコルであり、OSCは色々な用途がありますが、「MIDIを代替するために生み出された、新たなデータ形式」と覚えておいてください。

# UDPを使うための基礎知識
MaxやopenFrameworksにおいて、OSCやUDPは送り先の「IPアドレス」「ポート」を指定して運用します。
「IPアドレス」とは、「ネットワーク上の住所」のようなものです。そしてこのIPアドレスはコンピュータ固有のものが割り当てられます。同じ住所に一軒家が二つなんて基本はないですよね。
なので、IPアドレスは別々なのです。

# 実践編 
_(丁寧語がめんどくさくなったのでこの後は適当)_
想定環境は作品のための環境作りであり、他のネットワークが一切絡まないものとする。ここでは最低限の通信環境である二台のコンピュータおよびハブの構成として仮定する。（一応Wi-Fi利用の場合も併記する。)
なお、このセットアップをした場合既存のネットワークに繋がらなくなる可能性大なので、新しくプロファイル(ネットワーク環境)を作ることを推奨。

## コンピュータのIPアドレスを設定する
「システム環境設定>ネットワーク」と選択して、Wi-FiならWi-Fi、有線接続ならその有線の機器を選択します。
1. Wi-Fiの場合
「詳細」を押し、タブから「TCP/IP」を選択。「IPｖ4の設定」から「手入力」を選択する。IPアドレスに[192.168.0.###]サブネットマスクに[255.255.255.0]ルーターに[192.168.0.1]を設定。
2. 有線の場合
Wi-Fiとは違い既に[IPv4の設定]が表示されているため、そこを「手入力」で選択。IPアドレスに[192.168.0.###]サブネットマスクに[255.255.255.0]ルーターに[192.168.0.1]を設定。

"###"の部分は機器に応じて2~224の数字を割り振る。0,1,255は割り振らない、既存の別機器と被らない値を選ぶこと。

## Max8 送信側 (IPアドレス192.168.0.2)
新しくオブジェクトを作り、中に"udpsend 192.168.0.3 25565"と入力する。udpsendの二つのアーギュメントはそれぞれ送り先のIPアドレスとポート番号の指定のために使う。ポートに関してはシステム予約のないところを選ぶこと。二万ぐらいまでいけば大体大丈夫なはず。OS占有のポートはAppleから公開されているので、[こちら](https://support.apple.com/ja-jp/HT202944)を参照。送りたいメッセージをパッチコードで繋いで送信する。今回はOSCを使うため、"/position/x 356""/position/y 524""/rotation 19 95 331"の三つのメッセージを例として用意。
<img width="820" alt="udpsender" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221134/3008b182-10c6-a7c0-19c2-bc0ae94e61a0.png">


## Max8 受信側(IPアドレス192.168.0.3)
新しくオブジェクトを作り、中に"udpreceive 25565"と入力する。センドと違い、指定するのはポート番号のみ。OSCを色々いじくるためパッケージマネージャーからCNMATをインストールしておく。
udpreceiveから繋がる新たなオブジェクトを作り、"OSC-route /position /rotation"と入力する。確認用にprintオブジェクトを二つ配置し、繋げばOK。
<img width="984" alt="udpreceiver" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221134/b48fee6f-d4fd-1909-c84d-89deabc10194.png">

# UDP
IPアドレスとポートを指定してデータ（主にテキスト）をやりとりするもの。IPアドレスは住所、ポートは大量にあるポストのようなモノだと覚えれば良い。送信元は住所とポストを指定、受信者はポストを指定してそこに入っているモノを取りに行く。

# OSC
Open Sound Controlはある一行のテキストの中に[アドレス]と[データの値]を入れて利用するモノ。データの値はリスト化が可能である。以下に一例を示す。
>/position/x 356
/rotation 19 95 331

先ほども例として利用したこの二つだが、前半の英数字部分がアドレス、後ろが数値（アーギュメント）である。
そしてこのアドレスだが通常のMacオブジェクトである"route"でも分離が可能だが、いかんせんアドレスがフルパスでないとルーティングができず、よってOSCの利点たる階層構造アドレスも利用できないので"OSC-route"を使うのである。アドレスを全てルーティングすると、後に残るのはリスト構造のデータである。よってそこはunjoin、unpack等を利用してリストを分離して利用する。
herokuでrailsアプリをデプロイする。[in rails_tutrial]

rails_tutrialの分だけじゃちょっとよく分からなかったので、
備忘録。

そもそもデプロイとは、実際にコードを本番環境で動かす処置のことで、
ざっくりいうと、webアプリの場合、コードに書いた内容を実際にwebに公開する事。

herokuは、本番環境に公開するためのあらゆるめんどくさい設定・環境をを揃えてくれていて、railsのアプリをherokuに投げるだけで、デプロイできる。

herokuの空アプリのなかに、railsのアプリを投げる(git push)とデプロイできる状態のrailsアプリになるという。

手順

①herokuのアカウント作成/railsのアプリをgithubに登録
②ターミナルでデプロイしたいappにcdして"heroku create"コマンド。
=>herokuの空アプリができる＆railsアプリのgitとその空のherokuアプリが紐づけられる。
=>"git remote"とコマンドするとherokuの紐づけが確認できる
③デプロイしたいrailsのbranch(例えばmaster)をherokuにpushする。（大抵"git push heroku master"コマンド）
SwiftでMapタイプの切り替え方

##何をやるのか？
簡易的なMapアプリのオプション機能として、mapタイプの切り替えを行う。

##前提
MapKitにてMapが設置されていることを前提とする。

##Mapの種類
|画面                   |定義                |内容　　　　　　　　|
|:---------------------:|:------------------:|:---------------:|
| <img width="369" alt="スクリーンショット 2019-07-30 17.41.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/dad9ed9d-2b19-05a7-666e-11977989e5cb.png"> |                .mutedStandard      | 交通機関|
|  <img width="367" alt="スクリーンショット 2019-07-30 17.42.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/a8f3086d-8f58-8195-f6c6-2aaa5011c692.png"> | .standard  |   標準の地図 |
|<img width="360" alt="スクリーンショット 2019-07-30 17.43.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/b9a7a8b7-15d0-b691-ce3d-7f93c2e9fce1.png">|.satellite|航空写真|
|<img width="360" alt="スクリーンショット 2019-07-30 17.44.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/06323ab1-a0b7-e5da-41af-e97d9db2b208.png">|.hybrid|航空写真 <br>+<br> ラベル|
|<img width="362" alt="スクリーンショット 2019-07-30 17.44.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/f7cba30e-6b71-9b93-fd20-bd3d2c5f8ad6.png">|.satelliteFlyover|3D Flyover|
|<img width="363" alt="スクリーンショット 2019-07-30 17.45.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/7f6e7293-c2cc-c1bf-8685-e9a0989c3d5c.png">|.hybridFlyover|3D Flyover <br> + <br> ラベル|

##実装コード

```
@IBAction func changeMapButton(_ sender: UIButton) {
        if Map.mapType == .standard {
            Map.mapType = .satellite
        } else if Map.mapType == .satellite{
            Map.mapType = .hybrid
        } else if Map.mapType == .hybrid{
            Map.mapType = .satelliteFlyover
        } else if Map.mapType == .satelliteFlyover{
            Map.mapType = .hybridFlyover
        } else if Map.mapType == .hybridFlyover{
            Map.mapType = .mutedStandard
        } else {
            Map.mapType = .standard
        }
    }
```
if文を使い現在のmapTypeと各mapTypeを順番に比較し、もし同じTypeだった場合次のTypeを代入するという簡単なコードになっています。
x-codeのフレームワークのButtonをStoryboardに貼り、それに対応する関数内に記述すれば問題ありません。

##最後に
非常に簡単な実装ですが、割と本格的なアプリのように仕上がるので、初学者の方やプログラミングやった事ないけど興味ある人も是非一度実装して、開発の楽しさを体験してみましょう。
【解決】FirebaseでGoogleログインした時の403エラー解決方法

Firebaseを使ってGoogleのOAuthを実装していた際, なぜか403エラーで弾かれました.

## tl;dr
[GCPの管理画面](https://console.cloud.google.com/apis/credentials/consent)にて、次の**３つの情報**を入力して「保存」すればOK.
![GCP同意画面設定](https://i.gyazo.com/c9b46cfe4729ca0c9fab95ada984b84c.jpg)

1. アプリケーション名（デフォルトのままでも大丈夫）
2. アプリケーションのロゴ（必須）
3. サポートメール（必須）

検索して「emailを入力すれば大丈夫」という情報に辿りついていたにも関わらず**ロゴをアップロードしていないだけで１時間ほど詰まってしまいました.**

*スクショ上部の赤丸で囲んだ「プロジェクト名」とログインしている「gmailアカウント」が適切かどうかも念のため確認されてください.*

## cf1. エラー表示の文面
> 承認エラー エラー 403: restricted_client This app is not yet configured to make OAuth requests. To do that, set up the app’s OAuth consent screen in the Google Cloud Console.

## cf2. 解決できた理由
[GitHubのFirebaseリポジトリのイシュー#324](https://github.com/firebase/quickstart-js/issues/324)のGabrykさんのコメントに助けられました.
![Gabryk_Comment](https://i.gyazo.com/1f1ad17bfa8cf8b1f0d8f14d06f13b9c.png)
Raspberry Pi に HFS+ フォーマットの外付け SDD をつなぐ

## まずは

SDD は Mac の Disk Utility で初期化

Raspberry Pi 側では HFS+ を使うためのパッケージをインストール:

```
sudo apt-get install hfsplus hfsutils hfsprogs
```


外付けハードディスクをUSBに繋げば `/media/pi/` 以下に自動的にマウントされ、デスクトップにも表示される。

## 問題

Mac OS のフォーマット HFS+ の外付け SDD ドライブを接続するも

```
Read-only file system
```

と言われて書き込みができない。


## 解決法

ジャーナリングを切らないといけないらしい。

https://www.raspberrypi.org/forums/viewtopic.php?t=60437


1: Raspberry Pi をシャットダウンして、SDD を Mac につなぐ。

2: ディスクの名前を確認。私の場合は disk2s1 だった。

```
$ diskutil list
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *500.1 GB   disk2
   1:                  Apple_HFS Extreme SSD 500GB       500.1 GB   disk2s1
```

ジャーナリングを無効化する

```
sudo diskutil disableJournal disk2s1
```

SDD を取り外して、Raspberry Pi につなぐ → 解決。


## 未確認

また Read only に戻ってしまう？

```
sudo fsck.hfsplus /dev/sda2
```

`/dev/sda2` 適宜自分のマウント先を。

## 環境

* Raspberry Pi 4 Computer Model B 2BG RAM
* Raspbian GNU/Linux 10 (buster)
* SanDisk Extreme Portable SSD 500 GB
PwC's Analytics Hackathon

<!--Event_page-->
## 概要
PwC's Analytics Hackathonは、スキルや創造性を活かして、社会の課題解決に取組むイベントです。

皆さんとPwCの若手コンサルタントでチームをつくり、企業や組織が抱える課題を解決するために「どのようなデータ分析手法が最適であるか」を考えて頂きます。実際に検討した手法を用いてデータ分析を行い、その結果から解決策を検討し、発表を行っていただくプログラムとなります。

ハッカソン後は、PwCのコンサルタントとフランクにお話いただく懇親会も予定しています。

### こんな人にぜひ！
 - コンサルタントの仕事を体験してみたい人
 - データサイエンティストに興味がある人
 - データ分析を用いた研究をしている人
 - テクノロジーを用いたビジネスを考えることが好きな人　
 - 新しいアイデアを考えることが好きな人
 - ご自身の分析スキル・プログラミングスキルを試してみたい人
 - Hackathonに参加してみたい人

## 推奨スキル
###プログラミングスキル
下記のいずれかの対象言語でのプログラミング経験
 - Python
 - Ruby
 - Perl
 - R
 - MATLAB
 - C
 - C++

### 分析スキル
下記のいずれかの分析アルゴリズムの使用経験
 - 回帰：ロジスティック回帰、SVMなど
 - ツリー：決定木、ランダムフォレストなど
 - ベイズ：単純ベイズ（ナイーブベイズ)など
 - アンサンブル学習 ： ブースティング、バギングなど
 - 時系列：AR、MA、(S)ARIMAモデルなど
 - 商品分析：アソシエーション分析、ABC分析、バスケット分析など
 - 顧客分析：デシル分析、RFM分析など
 - 自然言語解析：テキスト解析、共起ネットワーク、感情分析、Word 2 Vectorなど
 - クラスタリング：k近傍法(KNN)、階層型クラスタリング、非階層型クラスタリング（K-Means）、トピックモデルなど
 - 異常検知（外れ値検知）：教師なし異常検知、教師あり異常検知、半教師あり異常検知など
 - ニューラルネットワーク：CNN、RNN、LSTM、自己組織化マップ（SOM)など

## 開催概要
- 開催日：2019年9月7日(土)10:00-21:00
- 実施場所：PwCコンサルティング合同会社　丸の内パークビルディング21F
- 服装：自由
- 募集人数：約50名(※)
- 参加資格：2021年3月卒業/修了見込みかつ2021年4月/10月入社が可能な方
- 交通費：遠方から新幹線もしくは飛行機で参加される方には、弊社規定に従い、交通費をお支払いいたします。※国内のみ
- 持ち物：Windows PCやMac、タブレットなどハックするためにご自身が必要と判断するもの
- 応募方法：当社採用ウェブサイトのマイページに登録後、イベントにエントリー
    - 当社採用ウェブサイトURL：http://bit.ly/2YAAJTi
- 応募締切：2019年8月30日(金)23:59

(※)応募者多数の場合、抽選となります、予めご了承ください。
Asciidoctor-PDFをMacOS Mojaveにセットアップする

# rbenvでRubyをインストールする

MacOS標準のRuby (v2.3.0) を使いたくないのでrbenvをインストールする。

ここを参考に
[【2018年版】macにrbenvを入れてrubyを管理できるようにしちゃう](https://qiita.com/Alex_mht_code/items/d2db2eba17830e36a5f1)

とりあえずStableバージョンの最新を入れる。

```
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin18]
```

# asciidoctor-pdfをインストールする

こちらを参考にasciidoctor-pdfをインストールする
　[asciidoctor-pdfでかっこいいPDFを作る(1)](https://qiita.com/kuboaki/items/67774c5ebd41467b83e2)

上のドキュメント通りインストールしてもなぜか出力されたPDFに日本語が表示されない。
どうやら、asciidoctor-pdf-cjkでインストールされるNotoSansフォントのサブセットには日本語フォントが含まれないようだ。

そこで、CJKフォントが含まれるasciidoctor-pdf-cjk-kai_gen_gothicを追加でインストールする。

```
$ gem install asciidoctor-pdf-cjk-kai_gen_gothic
```
フォントをインストールする

```
$ asciidoctor-pdf-cjk-kai_gen_gothic-install
```

# サンプルファイルでPDFを作成する

プロジェクトフォルダを作成し、[こちら](https://github.com/hayato-m126/AsciidoctorSample/blob/master/sample.adoc)のサンプルファイルを拝借して保存する。ファイル名は、example01.adoc とする。

テーマファイルを同じフォルダにコピーする

 ```
$ cp ~/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/asciidoctor-pdf-cjk-kai_gen_gothic-0.1.1/data/themes/KaiGenGothicJP-theme.yml .
```

PDFをビルドする

```
$ asciidoctor-pdf -r asciidoctor-pdf-cjk-kai_gen_gothic example01.adoc -a pdf-style=KaiGenGothicJP-theme.yml -o output.pdf
```

output.pdfをプレビューする

```
$ open output.pdf
```

以下のようなPDFが生成される

![AsciidocSample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63960/35ce8f1a-4b7e-8699-a448-e2c18dc8bb6e.png)
いまさら聞けないセキュリティのセ

昔は文通なんかやったりしていた情報交換。懐かしい人には懐かしいですよね！
それが１００年も経たずして超絶進化を遂げて、世界中のありとあらゆる情報を瞬時に手中に収めることができる時代になりました。

それと同時に重要視されるようになってきたのが個人のセキュリティ対策です。
この記事では、セキュリティってそもそもなんだっけ？のお話をしようと思います。

# 今も昔も情報は武器！
歴史を振り返ると幾多の戦争がおこり、悲しいながらその度に技術革新と情報戦略の重要性が増していきました。
それは今でも外交やスパイ活動の中でバチバチと火花を散らしています。

そうやって手にした情報は各国の強力な武器となるのです。

## 武器は奪われたくないし、奪った武器は返したくない
もっと身近に言いましょう。
お気に入りのオモチャは人に取られたくないものですよね？
そして、人から貰った（奪った）オモチャは何が何でも私のもの！って主張ししてる子供なんかもよく目にしますよね

要は自分の財産として獲得したものはみんな守りたいと言う気持ちに狩られるのです。
それがセキュリティの本質的な行動原理なのです！

# ネットワークの登場
財産を守りたいのが原始的なセキュリティ。鍵をかけたり、誰も近寄らせなかったりする事で人々はセキュリティを敢行してきました。

しかし、ここで革命が起こるのです。
インターネットという世界を覆い尽くす巨大な情報網の登場です。

人々はそれまで数日かかっていた文通をほんの数秒でやり取りできることに感動し、軍事、銀行関係では特に取り入れられました。

## どこにでも悪意がある人はいる！
ここまでの話で、財産を守るという話をしましたが、誰から守るのでしょうか

犬？泥棒猫？いいえ、答えは悪意のある人間です。

それはインターネット上の世界にももちろん存在しています。
特にインターネットは数億人がアクセスする超巨大ネットワークです。誰が何を盗み聞きしているかわかりません。
現代で言えば電話番号、パスワード、銀行口座などなど、大事な情報だって盗み放題なのです。

## インターネットセキュリティ
で、そんな悪意の人たちを捕まえることは国を超えて犯行可能なこともあり警察もうまく機能しません。

では、我々の財産を守るべく手段セキュリティをする必要がありますよね？
それも紙のように手で守ることの出来ない特別なセキュリティを

そこでインターネットセキュリティというワードが登場し、物理学者、数学者などがしのぎを削り年々高度な技術が登場していきました。

その恩恵を受けて現在の私たちは安心してインターネットという広大な海を探検することができるのです。

# でも落とし穴はある
自分の財産を守りたいし、インターネットでたくさんの情報を安全に利用したい。そのために高度な技術が生まれて今は安全なんだ！バンザーイ\( ˆoˆ )/

いえいえ、セキュリティはそんなに浅い世界ではありませんよ？

人はミスを犯すもの、事故は起こるものなのです。
たとえば、大事なデータをしまった鞄を持ったままお酒に酔って公園に置き忘れてしまったり、、、あぁ、悲惨(´；ω；｀)

これだと技術がどう高度化していようが盗まれてしまいますよね？

# 人的セキュリティ
先に挙げた通り、セキュリティ事故は現代になっても人的なことでも普通に起こり得ることなのです。

スマホを落としただけなのにって映画もいい例です

今回はセキュリティのセの字だけをお話ししたかったので、これ以上の深掘りはしません。
また次の機会にセキュリティのキの字の時に詳しくお話しできたらと思います

最後までお読みいただきありがとうございました！
【PHPUnit】phpunit.xmlを使ってグローバル変数を設定したい

PHPUnitを使ってテストコードを書くとき、
[phpunit.xml](https://phpunit.readthedocs.io/ja/latest/configuration.html#appendixes-configuration) を使って\$_POST, \$_GET, $_ENV （その他いろいろ）などが設定できる。

```:ディレクトリ構成
 App/
   src/
      Environment.php
   tests/
      EnvironmentTest.php
   vendor/
   composer.json
   phpunit.xml
```

```xml:phpunit.xml
<phpunit>
    <php>
        <env name="ENVIRONMENT" value="localhost" force="true"/>
    </php>
</phpunit>
```

```php:Environment.php

<?php

class Environment
{
    public static function getEnvironment()
    {
        return \getenv('ENVIRONMENT');
    }
}

```

```php:EnvironmentTest.php
<?php
require_once __DIR__.'/../src/Environment.php';

use PHPUnit\Framework\TestCase;

class EnvironmentTest extends TestCase
{
    /**
     * @test
     */
    public function xmlで環境変数が設定できている(): void
    {
        $this->assertSame('localhost', Environment::getEnvironment());       
    }
}
```


## phpunit.xmlはカレントディレクトリにないとデフォルトでは読み込まれない

カレントディレクトリにphpunit.xmlがある場合

```
C:\App> vendor/bin/phpunit tests\EnvironmentTest.php
PHPUnit 8.0.6 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 813 ms, Memory: 4.00 MB

OK (1 test, 1 assertion)

```

testsディレクトリに移動して実行

```
C:\App> cd tests
C:\App\tests> ../vendor/bin/phpunit EnvironmentTest.php
PHPUnit 8.0.6 by Sebastian Bergmann and contributors.

F                                                                   1 / 1 (100%)

Time: 1.66 seconds, Memory: 4.00 MB

There was 1 failure:

1) EnvironmentTest::xmlで環境変数が設定できている
Failed asserting that false is identical to 'localhost'.

C:\App\tests\EnvironmentTest.php:13
```


## カレントディレクトリにないXML設定ファイルを読み込む

https://phpunit.readthedocs.io/ja/latest/textui.html#textui-clioptions

>--configuration, -c

>設定を XML ファイルから読み込みます。 詳細は XML 設定ファイル を参照ください。

>phpunit.xml あるいは phpunit.xml.dist (この順番で使用します) が現在の作業ディレクト>リに存在しており、かつ --configuration が使われて*いない*場合、設定が自動的にそのファイルから読み込まれます。

>指定されているのがディレクトリで、 phpunit.xml あるいは phpunit.xml.dist (この順番で使用します) がそのディレクトリ内に存在する場合、設定が自動的にそのファイルから読み込まれます。


```
C:\App\tests> ../vendor/bin/phpunit --configuration ../phpunit.xml EnvironmentTest.php
PHPUnit 8.0.6 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 796 ms, Memory: 4.00 MB

OK (1 test, 1 assertion)

```

## XML設定ファイルを読み込まない

https://phpunit.readthedocs.io/ja/latest/textui.html#textui-clioptions
>--no-configuration

>現在の作業ディレクトリにある phpunit.xml および phpunit.xml.dist を無視します。

```
C:\App\tests> cd ..
C:\App\> vendor/bin/phpunit --no-configuration tests/EnvironmentTest.php
PHPUnit 8.0.6 by Sebastian Bergmann and contributors.

F                                                                   1 / 1 (100%)

Time: 597 ms, Memory: 4.00 MB

There was 1 failure:

1) EnvironmentTest::xmlで環境変数が設定できている
Failed asserting that false is identical to 'localhost'.

C:\App\tests\EnvironmentTest.php:13

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
```
CocでPHP定義元辿ろうとすると PHP Fatal error:  Uncaught Error: Class 'MessagePackUnpacker' not found in が起きる。

https://qiita.com/masakuni-ito/items/d7a6c2de47344f0bbd1c の続き。

Neovimで[Coc](https://github.com/neoclide/coc.nvim)入れて、PHPの定義元移動試してみたら、PHPでエラーが起きたので、それ解決したら違うエラーが起きた。

```shell
PHP Fatal error:  Uncaught Error: Class 'MessagePackUnpacker' not found in /Users/ito_masakuni/.cache/dein/repos/github.com/lvht/phpcd.vim/vendor/lvht/msgpack-rpc/src/MsgpackMessenger.php:18
Stack trace:
#0 /Users/ito_masakuni/.cache/dein/repos/github.com/lvht/phpcd.vim/php/main.php(30): Lvht\MsgpackRpc\MsgpackMessenger->__construct(Object(Lvht\MsgpackRpc\StdIo))
#1 {main}
  thrown in /Users/ito_masakuni/.cache/dein/repos/github.com/lvht/phpcd.vim/vendor/lvht/msgpack-rpc/src/MsgpackMessenger.php on line 18
```

まぁ……たぶん、msgpack、ないんだな……。

入れる。

```shell
$ pecl install msgpack
downloading msgpack-2.0.3.tgz ...
Starting to download msgpack-2.0.3.tgz (45,769 bytes)
.............done: 45,769 bytes
20 source files, building
running: phpize
Configuring for:
PHP Api Version:         20180731
Zend Module Api No:      20180731
Zend Extension Api No:   320180731
・
・
・
```

これでCocの定義元移動ができた。Coc凄まじい。
型アサーション

プログラミング言語Goを読んでいて、型アサーションの説明が分かりづらかったのでメモ

### 型アサーション
型アサーションはインタフェースの値に使えるインタフェース型の変換のようなものである

io.Writerインタフェース型の値があるとする

```go
var w io.Writer
w = os.Stdout
fmt.Printf("type = %T\n", w) // type = *os.File
```

この時、wが別のインタフェース型になれるか調べることができる

```go
rw := w.(io.ReadWriter) // 成功する
```

(*os.File)型はReadおよびWriteのメソッドを持っているため成功する。
rwでは、ReadWriterで定義されているメソッドReadも追加で呼ぶことができる


失敗した場合はpanicが発生するが、成功したかという変数を受け取ればpanicは発生しない

```go
var w io.Writer
w = new(ByteCounter) // ByteCounterは、ReadメソッドがないためReadWriterインタフェースは満たせない
rw := w.(io.ReadWriter) // panicが発生する 
rw, ok = w.(io.ReadWriter) // rwにはゼロ値、okにはfalseが入る
```