OmniAICreator/Qiita-1.07M huggingface dataset:
【情報求む！】Looking Glassを無線化したい！

# 動機
LookingGlass、せっかくインテリア性の高いデバイスなので無線化したい！！！

# 給電部は問題なし
```
Looking Glass <--> USB type-C -- USB A <--> モバイルバッテリー
```
でケーブル接続したところ、無事給電された(Looking Glassの電源がついた)ので問題なし
モバイルバッテリーを後ろに貼りつけるとか目立たないところにまとめておければ良いだろう
何分持つかは未検証だけど大容量のモバイルバッテリー買うか数を大量に用意すればきっと大丈夫(適当)

ちなみに

```
Looking Glass <--> USB type-C -- USB A <--> USBプラグ変換 <--> コンセント
```
という構成でももちろん給電されたのでご家庭の電源から電気代の続く限り無限に給電したいというニーズにも対応可能

# 問題は映像出力
## 考えた事・調べた事・試した事
映像出力もなんかこう…ピューンって映像飛ばしてくれるやつ使えば無線化いけるんじゃね、と思ってた
具体的にはChromeCastとかFire TV Stickとか

UnityでHoloPlay Captureを利用しながら開発しているのでPC操作ディスプレイとの関係はミラーリングではなくLookingGlassをセカンドディスプレイとしたい
どうやらChromeCastはセカンドディスプレイ化には対応していないらしい…
そしてLookingGlassにFire TV Stickを接続してみても真っ暗なまま、何も映らなかった…

LookingGlass公式サイトに以下のページがあった
[Will this be able to connect to a Raspberry Pi? \- Looking Glass Knowledge Base](https://looking-glass.helpscoutdocs.com/article/37-will-this-be-able-to-connect-to-a-raspberry-pi)
上記から、公式的に推奨している最小構成は“Intel Hades Canyon NUC PC”との接続なので、あくまでUnityを動かしている本体PCとの直接の接続を前提としているらしい？
というわけで“Intel Hades Canyon NUC PC”を調べてみると、
[Amazon\.com: CUK Hades Canyon NUC Premium VR Mini Desktop Gaming PC \(Intel i7\-8809G, 32GB RAM, 2x500GB NVMe RAID, AMD Radeon RX Vega M GH, Windows 10 Home\) Tiny Portable Gamer Computer \- Thunderbolt 3, 4K Support: Computers & Accessories](https://www.amazon.com/dp/B07CZ3SXNZ/ref=psdc_13896591011_t2_B07H8M3TJY)
ちょっと下にスクロールして"Product Description"の項を見てほしい
**さすがにそのサイズをカバンに収めるのは無理がある**
この*SIZE AND PORTABILITY*を接続すればいけるらしいが、これで最小構成？まだまだスリムになれるんじゃない？やせたら今よりもっとかわいくなるってLookingGlass！無線化はロマンだ！

## 情報求む！
というわけでHDMI接続部分を無線化 & LookingGlassを本体PCのセカンドディスプレイとして利用可能な工夫・アイテム・情報ありましたら教えてください！🙇🙇🙇
Ruby から FFI で Go にバイト列のポインタを渡す

Ruby を書いていると、バイナリ処理を Go で書いて FFI 呼び出すことでいい感じにしたくなることがあります。

バイナリの受け渡しをする際は、String を使うと NULL 文字で終端されてしまう [^1] ため、ポインタで渡してあげる必要があります。

C での書き方は ffi/ffi の wiki に載っていますが、Go での書き方は調べてもあまり出てこないので、ここに書いておきます。

```main.go
package main

import (
	"C"
	"bytes"
	"unsafe"
)

//export hoge
func hoge(pointer unsafe.Pointer, size C.int) *C.char {
	// ポインタからバイト列を取り出す
	var data []byte = C.GoBytes(pointer, size)

	// バイト列を使って何か処理する
	var result string = do_something(data)

	// Go の string を C の string に変換して返す
	return C.CString(result)
}

func do_something(data []byte) string {
	return "xxx"
}

func main() {
}
```

```hoge.rb
require 'ffi'

module Hoge
  extend FFI::Library

  # 上記の Go を shared library にコンパイルしたファイル
  ffi_lib 'hoge.so'

  attach_function :hoge, [:pointer, :uint], :string

  class << self
    # ポインタを渡す必要があるので private にしてインターフェイスを call_hoge に統一する
    private :hoge

    # 文字列をポインタに変換してから hoge を呼ぶ
    def call_hoge(string)
      mem_buf = FFI::MemoryPointer.from_string(string)
      hoge(mem_buf, data.bytesize)
    end
  end
end
```

[^1]: Binary data · ffi/ffi Wiki https://github.com/ffi/ffi/wiki/Binary-data
Pythonで複素数（実数部の取り出し）- 2019京都大学理系数学より

# ２０１９年京都大学 理系数学 問６

https://www.yomiuri.co.jp/nyushi/sokuho/k_mondaitokaitou/kyoto/mondai/mondai/1306785_5050.html

```math
i は虚数単位とする。 (1+i)^n + (1-i)^n > 10^{10} をみたす最小の正の整数 n を求めよ
```

## pythonの虚数は j で表す。

ただし、 

```math
1 + i
```

のような値 は `1+1j` のように表記する というポイントがある。5iが5jになるのはわかるが・・・ `1+j` と書くと変数jが定義されていないということにハマるので注意。（ハマった）

## 虚数を含んだ複素数の実数部の取り出し

値は `complex` クラスになるので、 `.real` で行う。（虚数部は`imag`）。両方共値としては`float` で返る。



## 解答例

```2019-kyoto-06.py

n = 1
while True:
    s = (1+1j)**n + (1-1j)**n
    # s は明らかに実数
    if (s.real > 10**10):
        print(n)
        break
    n += 1
```

これで正解の `71` を得ました。
[CentOS6.x]yumできないときは、ネットワーク設定です。

CentOSをインストールした後に、yumをたたいても動かない…
こんなときは、ネットワークを設定しましょう。

#+ネットワーク設定
**- 手順 -**
1.suでユーザーを切替える
2.ネットワーク設定ファイルを編集する
3.ネットワーク再起動する
4.ネットワーク確認してみる

---
###1.suでユーザーを切替える

```
# su
パスワード：*********

[root@localhost]   ← 切替わった状態
```
###2.ネットワーク設定ファイルを編集する 
vimを使用してファイルを開きます。
ONBOOT="no"となっていたら、ONBOOT="yes"に修正して上書きしてください。

```
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
HWADDR="00:00:00:00:00:00"
IPV6INIT="yes"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
```
###3.ネットワーク再起動する

```
# /etc/rc.d/init.d/network restart
```
###4.ネットワーク確認してみる

```
# ping -c 4 google.co.jp

PING google.co.jp (172.217.161.35) 56(84) bytes of data.
64 bytes from nrt12s23-in-f3.1e100.net (172.217.161.35): icmp_seq=1 ttl=128 time=368 ms
64 bytes from nrt12s23-in-f3.1e100.net (172.217.161.35): icmp_seq=2 ttl=128 time=125 ms
64 bytes from nrt12s23-in-f3.1e100.net (172.217.161.35): icmp_seq=3 ttl=128 time=256 ms
64 bytes from nrt12s23-in-f3.1e100.net (172.217.161.35): icmp_seq=4 ttl=128 time=72.3 ms

--- google.co.jp ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3076ms
rtt min/avg/max/mdev = 72.392/205.771/368.531/115.311 ms
```
疎通確認ができれば設定完了となります。
機械学習論文読みメモ_160

機械学習論文読みメモ_160

[Towards Understanding the Role of Over-Parameterization in Generalization of Neural Networks](https://arxiv.org/abs/1805.12076)
従来のnorms, margin, sharpnessといった複雑性指標では、なぜDNNがover-parameterizationによって汎化性能が改善されるのかを説明出来てこなかった。
本論ではDNNのcapacityを測る指標を提案し、よりtightなgeneralization boundを実現する。
このboundを求めるにあたってはover-parameterizationが観測可能かつ簡単な構造として
２層のReLUを利用した。
その構造において、隠れ層の各ニューロン毎に対して複雑性を評価し、その組み合わせとして
Rademacher complexityに基づいた汎化性能のboundを導出する。
この指標を用いると、隠れ層のニューロン数を増やすに連れDNNの複雑性が低減する事が示され、
つまりover-parameterizatioによって汎化性能が改善する事が示された。

[Digging Into Self-Supervised Monocular Depth Estimation](https://arxiv.org/abs/1806.01260)
depth estimationタスクにおいて、画像に対する深さ情報のコストが高いため、
最近はreconstruction errorを用いたself-supervisedな手法が注目されてきている。
こうした手法のためのネットワーク構造が多く提案してきたが、
それらのテスト性能は予想外な事がある。
例えばステレオカメラを用いたself-suprevisionの利用は、データ調達コストが高く
スケールしにくいが、スケールさせられるモノカメラベースのものより、テスト性能が安定しやすい。
このような直感に反する結果はその他のネットワーク構造、損失関数、motion handlingなどの
多方面で見受けられる。
このような観測に基づいて、本論では新たなネットワークを提案し、その他のself-supervision手法
よりも高性能を実現した。
提案ネットワークはモノカメラベースの学習を採用する。
その際depth estimatorに加えて必要となるpose estimatorがあるが、
それらの間でパラメータを共有する。

[To Trust Or Not To Trust A Classifier](https://arxiv.org/abs/1805.11783)
分類器の予測が信頼に値するかどうかを知る事はsafety面で非常に重要である。
従来手法は予測機のconfidence measureを用いる事だが、本論ではそれより
性能の良い指標を提案する。
提案するtrust score指標は、分類器と修正されたkNN分類器との間の予測結果に関する同意レベル
を評価する。
従来のconfidence measureと比較するとこの指標は経験的により高い精度を持って
予測結果の信頼度を評価できる。
【python】QPSK・16QAM・64QAM変調用の関数

通信シミュレーション系の記事は相変わらず少ないですが、懲りずに書いてまいります。
コードはpythonですが、matlabにも簡単に応用可能なはずです。

```python
import numpy as np


def bit_to_QPSK(TX_bit):
    # 入力bit系列のサイズを記録
    temp = TX_bit.shape
    M = temp[0]
    bit_num = temp[1]

    # まずは入力bit系列をBPSK変調
    TX_BPSK = np.ones((M, bit_num))
    TX_BPSK[TX_bit == 0] = -1

    # 平均電力が1になるように1/np.sqrt(2)をかけて、
    # BPSK系列の奇数番目は実部に、偶数番目は虚部になるように合成
    TX_BPSK = TX_BPSK * 1 / np.sqrt(2)
    TX_QPSK = TX_BPSK[:, 0:bit_num:2] + 1j * TX_BPSK[:, 1:bit_num:2]

    return TX_QPSK


def bit_to_16QAM(TX_bit):
    # 入力bit系列のサイズを記録
    temp = TX_bit.shape
    M = temp[0]
    bit_num = temp[1]
    sym_num = bit_num / 4

    # まずは入力bit系列をBPSK変調
    TX_BPSK = np.ones((M, bit_num))
    TX_BPSK[TX_bit == 0] = -1

    # 奇数番目のシンボルの重みをもたせた上で合成
    temp = 2 * TX_BPSK[:, 0:bit_num:2] + TX_BPSK[:, 1:bit_num:2]

    # 出力結果がグレイ符号化になるように調整
    temp_copy = temp.copy()
    temp[temp_copy == 3] = 1
    temp[temp_copy == 1] = 3

    TX_16QAM = (temp[:, 0:int(sym_num * 2):2] + 1j * temp[:, 1:int(sym_num * 2):2]) * 1 / np.sqrt(10)

    return TX_16QAM


def bit_to_64QAM(TX_bit):
    # 入力bit系列のサイズを記録
    temp = TX_bit.shape
    M = temp[0]
    bit_num = temp[1]
    sym_num = bit_num / 4

    # まずは入力bit系列をBPSK変調
    TX_BPSK = np.ones((M, bit_num))
    TX_BPSK[TX_bit == 0] = -1

    # シンボルの重みをもたせた上で合成
    temp = 4 * TX_BPSK[:, 0:bit_num:3] + 2 * TX_BPSK[:, 1:bit_num:3] + TX_BPSK[:, 2:bit_num:3]

    # 出力結果がグレイ符号化になるように調整
    temp_copy = temp.copy()
    temp[temp_copy == 7] = 3
    temp[temp_copy == 5] = 1
    temp[temp_copy == 3] = 5
    temp[temp_copy == 1] = 7
    temp[temp_copy == -3] = -1
    temp[temp_copy == -1] = -3

    TX_64QAM = (temp[:, 0:int(sym_num * 3):2] + 1j * temp[:, 1:int(sym_num * 3):2]) * 1 / np.sqrt(42)

    return TX_64QAM


# 送信側アンテナ数
M = 2
# 受信側アンテナ数
N = M
# 送信ビット数
bit_num = 12 * 10 ** 2

# 送信ビット列を生成
TX_bit = np.random.randint(0, 2, (M, bit_num))

# 各種変調を実行
TX_QPSK = bit_to_QPSK(TX_bit)
TX_16QAM = bit_to_16QAM(TX_bit)
TX_64QAM = bit_to_64QAM(TX_bit)

print(TX_bit)
print(TX_QPSK)
print(TX_16QAM)
print(TX_64QAM)
```

上記のbit_to_QPSK、bit_to_16QAM、bit_to_64QAMはそれぞれ、0/1により構成される任意の行数のビット列をQPSK変調、16QAM変調、64QAM変調する関数です。いずれもグレイ符号化になっているはずです。

ビットとシンボルの割り当てですが、QPSKは

<img width="454" alt="QPSKビット割り当て.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/271946/e631c3bd-e380-5594-0c61-3a4a92ed5320.png">

16QAMは

<img width="469" alt="16QAMビット割り当て.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/271946/eaac83a1-3fa0-ee6d-cd2e-cc2a3e16433f.png">

64QAMは
<img width="483" alt="64QAMビット割り当て.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/271946/e8c454c1-69d7-4cde-d76c-02ce538ae466.png">

というふうになっています。グレイ符号化のビット-シンボルの割り当て方は一通りではないので注意が必要な場合があります。

判定・復調用の関数も近いうちに記事にします。
terraform importでproviderを指定するときはコマンドラインオプションを使う

Terraform v0.11.11での話です。

## 結論
`terraform import`でproviderを使いたい場合には、configurationの`provider` attributeは尊重されないので、コマンドラインオプションの`-provider=`で指定する。


## なぜ
```
provider "aws" {
  alias = "foo"
  assume_role {
    role_arn = "..."
  }
}

resource "bar" "baz" {
  provider = "aws.foo"
}
```

とういようなconfigurationで

```console
terraform import bar.baz id
```

しようとしたところ、権限周りのエラーが出てしまいました。
少し試行錯誤してみると、そもそも指定しているprovider自体が使われてすらいないようです。

調べてみると関連するIssueがありました。
https://github.com/hashicorp/terraform/issues/17139#issuecomment-358721319

将来的にはimportがconfiguration自体を生成するようにしたいと考えていて、そのためのデザインとのことです。
google fonts preload でちゃんと読み込み

そうだ。Google fonts を preload しよう。

参考
https://firstlayout.net/optimize-google-fonts-with-preload/

・今回は Kosugi Maru をダウンロード
[google webfonts helper](https://google-webfonts-helper.herokuapp.com/fonts)

・WOFF2のみサーバーにアップロード
そしてheadタグ内のCSSの最初の方で以下を読み込み。
一応フォントへのパスは絶対パスにするほうがAMPにも対応するので良いみたい。


```

<link rel="preload" as="font" href="/fonts/kosugi-maru-v3-japanese_latin-regular.woff2" crossorigin>

```

フォント使うようにCSS設定。

```

        @font-face {
            font-display: swap;
            font-family: 'Kosugi Maru';
            font-style: normal;
            font-weight: 400;
            src: local('Kosugi Maru'), local('KosugiMaru-Regular'),
            url('/fonts/kosugi-maru-v3-japanese_latin-regular.woff2') format('woff2');
        }

body {
      font-family: 'Kosugi Maru', sans-serif;
     }

```

これでOK!
Ruby 演算子,真偽値

動作環境はMacとなります。

##比較演算子##

**演算子による値の比較**
２つの値の大小と同じ値かを調べる方法

**比較演算子の記号**
※マークダウン方式の影響で、より大きいの記述がおかしくなってます。

>より大きい > ⇦これ
>=　以上
<　より小さい
<=　以下
==　等しい
!=　等しくない

---

式が成り立つ場合　true
式が成り立たない場合falseを返す

```irb

irb#1(main):001:0> 1 < 2
=> true
irb#1(main):002:0> 1 <= 2
=> true
irb#1(main):003:0> 1 > 2
=> false
irb#1(main):004:0> 1 >= 2
=> false
irb#1(main):005:0> 1 == 2
=> false
irb#1(main):006:0> 1 != 2
=> true
```

演算子の優先順位

```irb
irb#1(main):007:0> 1.0 + 2.0 * 3.0 / 4.0 
=> 2.5
irb#1(main):008:0> (1.0 + 2.0) * 3.0 / 4.0 #（）で優先順位を上げる
=> 2.25
```

>高い   ::
       []
       +(単項)  !  ~
       **
       -(単項)
       *  /  %
       +  -
       << >>
       &
       |  ^
       > >=  < <=
       <=> ==  === !=  =~  !~
       &&
       ||
       ..  ...
       ?:(条件演算子)
       =(+=, -= ... )
       not
低い   and or

---

**数値と文字列は暗黙的に変換されない**

数値と文字列を連結するとエラー

```irb
irb#1(main):009:0> 1 + "1"
TypeError: String can't be coerced into Integer
	from (irb#1):9:in `+'
	from (irb#1):9
```

文字列を数値に変換

```irb
irb#1(main):011:0> 1 + "1".to_i #整数クラスに変換
=> 2
irb#1(main):012:0> 1 + "1.1".to_f　#浮動小数点クラスに変換
=> 2.1
```
出力された！

---

数値を文字列に変換

```irb
irb#1(main):015:0> num = 10
=> 10

irb#1(main):021:0> "Number name is " + num
TypeError: no implicit conversion of Integer into String
	from (irb#1):21:in `+'
	from (irb#1):21
#numが変数のため、わかりにくいが文字列と数値の足し算はエラー

irb#1(main):020:0> "Number name is " + num.to_s
=> "Number name is 10"

#数値を文字列に変換
```
出力された！

---

**インクリメントとディクリメント**

・インクリメント
数値に1を足す

・ディクリメント
数値から１を引く

他のプログラミング言語のように++や--で表すことができない点に注意！


```irb
irb#1(main):022:0> n = 1
=> 1
irb#1(main):023:0> n = n + 1
=> 2
irb#1(main):024:0> n += 1
=> 3
irb#1(main):025:0> n = n -　　1
=> 2
irb#1(main):026:0> n -= 1
=> 1

#どちらの表記でも大丈夫だが、+=や-=で表した方がスマート
```

##真偽値

Rubyでは、nilかfalseの場合は偽(false)
それ以外は真(true)

*trueの例*

- trueそのもの・・・true
- 全ての数値・・・１,1.5,2/3
- 全ての文字列
・・・"false","true",""(空文字)

##論理演算子

＆＆や||で複数の条件の式を真偽値で返すことが可能になる。

*論理積*
&&（かつ）=全ての条件が真の場合trueを返す

*論理和*
||(または)=少なくとも一つの条件が当てはまれば真になり、trueを返す

**and,or,not**

&&,||,！とほぼ同じ役割
ただし計算の優先順位が異なるため、式に混在させないこと

---



```irb
irb(main):001:0> t1 = true
=> true
irb(main):002:0> t2 = true
=> true
irb(main):003:0> f1 = false
=> false
irb(main):004:0> f2 = false
=> false
irb(main):005:0> t1 and t2
=> true
irb(main):006:0> t1 and f1
=> false
irb(main):007:0> t1 or t2
=> true
irb(main):008:0> f1 or f2
=> false
irb(main):009:0> !t1 || t1 #trueとfalse
=> true
```


```irb

#混在させると非常にわかりにくくなるため注意
irb(main):010:0> not t1 || t1
=> false
irb(main):011:0> t1 || t2 &&　f1　#&&の方が優先順位が高いため、t2とf1の計算が先にされた後、t1との和が計算される。
=> true
irb(main):012:0> t1 or t2 and f1　#orとandの優先順位は等しいので、左から計算
=> false
```

```irb

#（）で囲ったりわかりやすくすることは複数人で開発するときには欠かせないスキル
irb(main):013:0> (t1 || t2) && f1　
=> false
```

##まとめ
リファレンスに書いてある優先順位が高いものと低いものを混在させると非常にわかりにくい。
また、優先順位を上げたいときは()でくくるなど、直感的でわかりやすいプログラムを書くことが重要。

シンプルに記述するように心がけよう！





##参考文献

[Ruby 2.6.0 リファレンスマニュアル 演算子式](https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html)
ノスタルジアpc-9801 その２

# 概要

整理していたら、フロッピーディスクが出てきた。
せっかくなので、エミュで動かしてみた。

# 環境

- windows vista
- t98-next
- disk explorer

# windows 3.0（1991）

ms-dos 3.30 上で動かしてます。

![w0.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/72ad3375-0a9f-1c03-bd54-a656b7eec4dc.jpeg)

![w1.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/0e5ae466-4697-bc2d-68ca-9b709b18dbb8.jpeg)

![w2.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/6eead715-53c4-47ff-ffff-c6d5546ba02a.jpeg)

![w3.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/582b8c57-401e-0743-2949-9e34a2ef46bf.jpeg)


以上。
Cookpad Techconf2019資料リンク

2019/2/27
Cookpad Techconf2019資料リンク

#TimeTable
- クックパッドが目指す、これからのデザインとプロダクトのあり方
宇野 雄(CEO室　デザイン統括マネージャー)
資料：https://speakerdeck.com/saladdays/kutukupatudogamu-zhi-su-korekarafalsedezaintopurodakutofalsearifang

- 生鮮ECクックパッドマート - サービスの立ち上げから拡大に向けて
長野 佳子（買物事業部）
資料:https://speakerdeck.com/naganyo/cookpad-techconf-2019-cookpadmart


- 料理の学習体験をデザインする
須藤 耕平
資料：

- 新規サービス開発を加速させる技術とデザイン
藤井 謙士朗(Komerco事業部)
資料：https://speakerdeck.com/kenshir0f/cookpad-techconf-2019-komerco-service-dev

- Challenges for Global Service from a Perspective of SRE 2nd season
渡辺 喬之(Technology Department SREgroup)
資料：https://speakerdeck.com/takanabe/challenges-for-global-service-from-a-perspective-of-sre-2nd-season

- レシピを解析する！Machine Readable Recipe（MRR: 機械可読なレシピ）の開発
伊尾木 将之
資料：

- クックパッド動画事業開発のチャレンジ
渡辺 慎也
資料：

- 〜霞が関〜　クックパッドiOSアプリの破壊と創造、そして未来
三木 康暉
資料:https://speakerdeck.com/giginet/cookpad-techconf-2019-xia-gaguan-kutukupatudoiosapurifalse-po-huai-tochuang-zao-sositewei-lai

- スケーラブルなセキュリティ監視基盤の作り方
水谷 正慶
資料：https://speakerdeck.com/mizutani/techconf2019-mizutani
- 新規アプリ開発を支えるユーザ・決済基盤
宇津 宏一(ユーザ・決済基盤)
資料：https://speakerdeck.com/uzzu/xin-gui-apurikai-fa-wozhi-eruyuzajue-ji-ji-pan
- Re:silience から始めるカオスエンジニアリング生活
小杉山 拓弥
資料:https://speakerdeck.com/itkq/a-life-of-chaos-engineering-starting-with-resilience

- 基調講演
成田 一生(CTO)
LINE Thingsにおけるlink/unlinkイベント

# はじめに

本記事は、LINE Things を使っていて、link / unlink イベント周りでハマったことを書いています。
LINT Things に関しては、以下にすばらしい記事がありますので、そちらを参考にしてください。

[さっそくLINE Thingsを触ってみた（ESP32でリモートLチカ） #linedevday](https://qiita.com/n0bisuke/items/b0541a32f01007f938a4)
[LINE Things Developer Trial ハンズオン](https://qiita.com/hktechno/items/bb83cc898c75819b2664)

で、今回のネタなのですが、LINE Things の API には、デバイスが連携した時、もしくは連携が外れた時にイベントが発火するということで、そちらを拾ってみたいと思ったところから始まります。

## LINE Things で用意されているイベントとは

[ドキュメント](https://developers.line.biz/ja/docs/line-things/develop-bot/)抜粋するとこんな感じです。

> LINE Thingsでは、以下の2つのイベントがWebhook URLに通知されます。

> ・ デバイス連携イベント
> ・ デバイス連携解除イベント

> たとえば、ユーザーがデバイスを連携したり、連携を解除したりしたときに、任意のメッセージを送信できます。

LINE Things で紐づけている Messaging API のチャネル（LINE Bot）に設定した webhook URL に対して、ユーザがデバイスを連携させたり、連携を解除させたりするときにイベントが発火するわけですね。
たしかに、デバイスを利用するときに毎回以下のようなメッセージが出て、**ペアリング**をタップしてから利用していますね。

<img width="375" alt="IMG_877CFFDE6AC9-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/86046/8275467e-662c-41b1-156f-e6ea34687c5f.jpeg">

で、webhook URLはどこで設定するかといえば、ドキュメントにもあるように Messaging API の設定画面で行っていきます。たとえば以下のような感じですね。

![LINE Things Messaging API設定画面.png](https://qiita-image-store.s3.amazonaws.com/0/86046/663e7091-7af6-e687-1f9a-9c67ceda06a9.png)

Webhook送信を**利用する**にすることを忘れないようにします。また、Webhook URL は SSL 対応となりますので、そちらにも気をつけてください。設定したら、念のために**接続確認**ボタンを押して、連携が成功することを確認しておきます。

## テスト

では早速ペアリングをしてみましょう。
どうでしょう。Webhook は正しく飛んでいるでしょうか？

はい。そうです。飛ばないですよね。
飛ばないんですよ、Webhook 。

## ネタバラシ

実はイベントが発火するのは、ユーザがデバイスを連携した時、もしくは連携が外れた時と書いてありますね。この連携っていうのはペアリングではなくて、一番最初に LINE Things 画面上で連携可能なデバイスの一覧が表示され、かつそれを選択したときに**連携**が発生するらしいです。
なので、一度連携してしまっているデバイスでは、ペアリングのたびにイベントは発火しないみたいです。
確かに言われてみればそのとおりですね。

ということで、最後にデバイスの連携解除と連携をテストする方法を書いておきます。

### デバイスの連携解除

LINE Things の画面で、すでに連携済みのデバイスを左側にスワイプすると、**連携解除**というメニューが出るので、それをタップします。
*この方法ってほぼほぼ奇跡的に見つける以外に見つけられなさそうです。*

<img width="375" alt="IMG_8EB4EDF23775-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/86046/2ac29e4d-d7a7-9742-49c6-54f874a7abeb.jpeg">

連携を解除するかというダイアログが表示されるので、**解除**を選択すると連携が解除されます。
このときに、unlink イベントが発火し、次のような JSON が渡ってきます。

![LINE Things Unlink Event result.png](https://qiita-image-store.s3.amazonaws.com/0/86046/bfac5612-a946-b17c-c331-3747d4fa0215.png)

events.things.type が **unlink** になっているので、正しく連携解除されたことがわかります。

### デバイスの連携

連携解除されると、今度は**連携可能デバイス**の一覧にデバイスがリストされるので、そちらを選択して**ペアリング**を押すと連携完了のダイアログが表示されます（初回だけ）。
このタイミングで link イベントが発火して、以下のようなJSONが渡ってきます。

![LINE Things link event result.png](https://qiita-image-store.s3.amazonaws.com/0/86046/91ae0e5e-98c3-9640-267b-85d59d7d5f9a.png)

先程の unlink イベント内容は同じですが、events.things.type が **link**になっています。
見るとわかるように、events.source.userId でユーザIDが取得できるので、これを使ってトーク画面にメッセージを送信することもできます。

## まとめ

ということで、LINE Things の link イベントの発火タイミングは、毎回のペアリング時ではないということがわかりました。
大変勉強になりました。
Firebase 初期設定まで


本当はサイレント通知を発行するまでメモしていこうと思ったのですが、
一回プロジェクトが止まったので、せっかくなので書いたところまで。
（画面は2019/2/28現在）

# Firebase の設定

Firebase Notificationhはお手軽だが、サイレント通知を出すためには、FCM(Firebase Cloud Messaging)を使用する。


![fcm2.PNG](https://qiita-image-store.s3.amazonaws.com/0/200222/b3ac0043-0a11-3240-cc09-02d416bfa47a.png)

Googleアカウント登録済みでFirebaseのサイトにアクセスしていれば、右上のｺﾝｿｰﾙへ移動から、すぐにコンソールにログインできてしまいます。


![fcm1.PNG](https://qiita-image-store.s3.amazonaws.com/0/200222/26738de5-bd6d-6e9e-9991-45ef5c665273.png)


プロジェクトを追加　と押すと、追加のためのポップアップが出現します。

![fcm3.PNG](https://qiita-image-store.s3.amazonaws.com/0/200222/6eee91b6-01f5-5d42-4562-344c04ccf7f4.png)

プロジェクト名は任意で決定すればよいです。
（既にアプリなどでプロジェクトがあると、選択肢に出てきます。）

地域とロケーションも、任意のリージョンに変更可能で、日本に設定するなら以下のようにします。
アナリスティックの地域　：　日本
Cloud Firestoreのロケーション　：　asia-northeast1

登録完了。圧倒的スピード。
![fcm4.PNG](https://qiita-image-store.s3.amazonaws.com/0/200222/c8027851-0694-9848-7b3e-646bb286ccf7.png)





各OSの導入方法は以下参考
https://dev.classmethod.jp/smartphone/firebase-analytics-getting-started/

また、p8認証キーは、以下を参考。
https://qiita.com/matsuyoro/items/77408e5d09ef00be8577

今後、やっぱり通知やりますとなったら更新します。
8年前に作った HTML5 アプリを最近の技術で作り直した話（５年ぶり２回目）

[icotile](http://icotile.ogaoga.org/) は、HTML5 を活用して iTunes のような操作感で Twitter の友達やリストを管理できる Web アプリケーションです。2011年に最初のバージョンをリリースし、2014年には、AngularJS と Bootstrap で全面的に書き換えた icotile2 をリリースしました。この８年間で延べ 55,000ユーザーに利用されている Web アプリです。

[![icotile3 のメイン画面](https://icotile.ogaoga.org/img/main.png)](http://icotile.ogaoga.org/)

随分ほったらかしにしていたのですが、いまだに意外と使われていて、たまに要望とかもいただいていました。最近プロダクトを作っていなかったので、最新の技術を勉強するために、icotile3 の開発に着手しました。

随分古い技術スタックだったのと、勉強も兼ねているので、できるだけまだ使ったことのない技術を採用してみました。また、サーバサイドの Node.js への置き換えも行って、フロントエンドとバックエンドの共通化も図ってみました。機能はほぼ同等＋アルファですが、データベース以外はほぼ置き換えです。

|  | [icotile](http://icotile-v1.ogaoga.org/) (2011) | [icotile2](http://icotile-v2.ogaoga.org/) (2014) | [icotile3](https://icotile.ogaoga.org/) (2019) |
|--:|:--:|:--:|:--:|
| Framework | jQuery | AngularJS 1.x | Vue.js / Vuex |
| UI | jQuery UI | Bootstrap | Vuetify |
| Style | スキューモーフィック風 | フラットデザイン | マテリアルデザイン |
| Lang | JavaScript | JavaScript | TypeScript |
| Backend | PHP / CakePHP | PHP / CakePHP | NodeJS / Express |
| DB | MySQL | MySQL | MySQL |
| Server | Apache | Apache | Apache + nginx |
| Protocol | HTTP | HTTP | HTTPS |
| その他 | - | - | docker / docker-compose での環境構築、PM2 でのプロセス管理等。 |
| 関連記事 | [Twitter の友達やリストを iTunes 風に管理できるアプリ「icotile」（アイコタイル）をリリース](http://blog.ogaoga.org/?p=481) | [３年ぶりのバージョンアップ！AngularJS などの最新技術で再構築した Twitter リスト管理アプリ「icotile2」リリース！](http://blog.ogaoga.org/?p=831) |  |

# Vue.js/Vuex/Vuetify

Angular は複雑で理解するのに時間がかかったのですが、Vue.js/Vuex は構造がシンプルで、ドキュメントもわかりやすく、どんどん理解できてどんどんコードが書ける感じが気持ちよかったです。

React/Redux は仕事で散々やったので、今回 Vue をトライしてみました。React は、Redux とのつなぎこみが面倒だったので、その辺りは Vuex の方がうまく統合されていてわかりやすかったです。

あと、どちらかというと、UI フレームワークの Vuetify がとても良くできていて、素早く UI 開発ができました。前回は、Angular
と Bootstrap を自分で統合していたのですが、それが一切なく、すぐにマテリアルデザインのアプリが出来上がるのがよかったです。また、今回初のモバイル対応も簡単にできました。

# TypeScript

TypeScript は部分的に使った感じでしたが、定義したデータ型をフロントエンドとバックエンドで共有して、コンパイル時にエラーをチェックできたのはよかったです。それ以外は結構 `any` で逃げた感じ。

# Node.js/Express

さすがにもう PHP は覚えていないので、Node.js/Express に置き換え。フロントエンドとバックエンドで同じ言語で開発できるのはやっぱり楽ですね。プロセスの管理は PM2 を使用しました。

# nginx

フロントエンドと API をルーティングするために、nginx を使ってみました。フロントは、普通に Web サーバとして、ビルドされたスタティックをサーブし、API は Express のローカルサーバへのプロキシとして動かしてます。これが正しいのかは良くわからず...

# Docker

一番大変だったのは、Docker での環境構築で、概念を習得するのも、試行錯誤するのも時間がかかりました。いまだに正しい使い方をしているか自信ないですが、ステージングと本番環境をすぐに立ち上げられたり、ローカルで同じ環境で試せるのはよかったです。

あと、PM2 の設定や Bitbucket からの Webhook での更新とか、いろいろトライして、いろいろ勉強になりました。

# 今後

今回モバイル対応もしたので、Android 向けに PWA でアプリ化したいのと、iOS でネイティブクライアントを作ろうと思っています。MVVM や RxSwift の勉強のために。

と、特にオチもないですが、機能的にも色々進化しているので、Twitter をやってましたら、ぜひ [icotile3](https://icotile.ogaoga.org/) をお試しください。
php-master-changes 2019-02-27

今日は .gdbinit の修正、ReflectionClass::getDefaultProperties() が型付きプロパティに使われた際の不具合の修正、二項演算子が PHP スクリプトのコンパイル時評価とランタイムで同じ結果を返すことのテストを追加する修正があった！

# 2019-02-27
## nikic: Sync types in .gdbinit, improve property dumping
- https://github.com/php/php-src/commit/d73789ef91ebd15f6b72529e78041d366f586611
- [7.4~]
- .gdbinit で、zval 出力時の type が[一昨年の 10 月くらいから](https://github.com/php/php-src/commit/dec8b787eec376033c9a6051072ad9e60bee7d64)ずれていた問題の修正
- ついでにオブジェクトのダンプでプロパティテーブルが読み込まれておらずクラスエントリからプロパティ情報をたどる際、適切なスロットを参照するよう改善

## krakjoe: Fix [#77673 ReflectionClass::getDefaultProperties](https://bugs.php.net/bug.php?id=77673) returns spooky array
- https://github.com/php/php-src/commit/1ca9d818b8405159ef96cb974a21714881e1146c
- [7.4~]
- ext/reflection で、[ReflectionClass::getDefaultProperties()](http://php.net/manual/ja/reflectionclass.getdefaultproperties.php) が型付きプロパティに使われた際、要素の見えない配列を返す場合がある問題の修正

## rjhdby: Add runtime_compile_time_binary_operands.phpt
- https://github.com/php/php-src/commit/fcfec9102b638298f2a137ef915e29dc23ddd6f2
- 二項演算子が PHP スクリプトのコンパイル時評価とランタイムで同じ結果を返すことのテストを追加
- [PR:3885](https://github.com/php/php-src/pull/3885)

## bwoebi: Uncomment cleanup for runtime_compile_time_binary_operands.phpt
- https://github.com/php/php-src/commit/a72c74162491f20685ef6805af432717cbcffe90
- [7.4~]
- ↑のテストで一時ファイルの掃除がコメントアウトされていたのを修正
ノスタルジアpc-9801

#概要

整理していたら、フロッピーディスクが出てきた。
せっかくなので、エミュで動かしてみた。

#環境

- windows vista
- t98-next
- disk explorer

#lotus 1-2-3 (1990)

表計算
![lotus.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/57bfb76b-43b5-de32-0fe5-852b1499d487.jpeg)
ここから、動かん。

#red(1987)

エディタ
![red.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/ab356297-1612-f09d-5e66-f7ade580c635.jpeg)

#mifes(1988)

エディタ
![mifes.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/ce361b55-4fa7-2530-ef66-4937ea175c5f.jpeg)

#file master(1987)

ファイラー
![fm.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/11fc2b79-c9b1-2ce5-4535-96cea876c9cc.jpeg)

#エコロジーⅡ(1988)

ファイラー
![ec.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/ca180550-4bd4-f149-dda2-dd7750a07cbe.jpeg)

#dbase Ⅱ(1984)

データベース
![db.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/6d90b140-ad37-2864-9c55-bea53d44c30f.jpeg)

#turbo c++(1991)

コンパイラ
![tcc.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/3ecc5a0a-aeab-f3d9-4d3f-2c616e70dc4d.jpeg)

#quick c (1988)

コンパイラ
![qc.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/38928dc9-8ffa-8a71-f4f0-5cacd4a1a315.jpeg)

#N88-BASIC (1988)

インタープリタ
![n88.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/61768dd9-dff3-2b4f-335d-6ecf48ab3aba.jpeg)


以上。
シークバーのツマミのX座標の計算

シークバーのツマミの位置にViewを重ねて表示する機会があったので、備忘録としその際に使用したツマミの位置のX座標の計算方法を記載しようと思います。
#シークバーのツマミのX座標をピクセルで取得
```java
public float getThumbPositionX(SeekBar seekBar) {
    float width = seekBar.getWidth()
            - seekBar.getPaddingLeft()
            - seekBar.getPaddingRight()
            - seekBar.getThumb().getIntrinsicWidth();

    float thumbPositionX = width
            * (float) seekBar.getProgress()
            / (float) seekBar.getMax()
            + (float) seekBar.getPaddingLeft();

    return thumbPositionX
}
```
これでOKのはず...
cmdでフォルダ構成を調べる。(treeコマンド)


**フォルダ内の構成を知りたいときに使用する**

```言語:cmdコマンド
tree /f c:¥〜¥Work > c:¥WorkTree.txt
```
Cドライブ直下に`WorkTree.txt`が出力されます。
**出力結果**

```言語:WorkTree.txt
c:¥〜¥Work 
├─仕事
│ ├─ スケジュール.xlsx
│ └─ 仕事メモ.txt
│
├─目標
│ ├─ タスク
│ │  └─ やること一覧.xlsx
│ │
│ ├─ ダイエット.xlsx
│ └─ 運動とは.txt
│ 
└─その他
  ├─ 新元号予想一覧.xlsx
  └─ 旅行計画.pdf

```

**補足**
`c:¥〜¥Work`は、任意のディレクトリ。
`tree /？`をするとオプションが調べられます。
オプション`/f`は、拡張子も含めて表示
AWS Lambda Custom RuntimeのPHPのログ出力について

## はじめに

前回の [AWS Lambda のCustom RuntimeでPHP用のLayer作成](https://qiita.com/Sunochi/items/620ed40e5eb9871811c6) で作成したLayerを使用します。
(Stackery社のlayerでも問題ないです。)

## 作業環境

LayerのZip作成にdockerを、AWSへのアップロードにaws-cliを使います。

- pyenv
    - 1.2.9-2
- pip
    - 9.0.3(python3.6.5)
- aws-cli
    - 1.16.96(python3.6.5) 
- sam
    - 0.14.2   

作業はMacOSです。
各種インストールは割愛します。

## 使用ソースコード
https://github.com/Sunochi/LambdaTestFuntion

## ログ出力について

AWS LambdaでPHPを使用した際の挙動として、ログ出力が不便という点があります。
API Gatewayを使用する場合はブラウザ上に`var_dump()`で表示すれば良いですが、データとして残すためにもCloudwatch logsへ出来る限り可視性が高い状態で出力しておくことが望まれます。
最近はcloudwatch logsの機能で、json形式のログから検索も可能になっているようなので、ログ出力はちゃんとしようと思う毎日です。
さて、今回は`printf`と`var_dump`と`error_log`の挙動の違い、現時点でのPHPでのログ出力方法のベストプラクティスをまとめておきます。

## テストコード
```index.php
<?php 
function print_log(){
    $temp_array = [
        'hoge' => "foo",
        'var'  => 2,
    ];
    printf("Hello World!\nhogehoge");
    printf($temp_array);
}

function var_dump_log(){
    $temp_array = [
        'hoge' => "foo",
        'var'  => 2,
    ];
    var_dump("Hello World!\nhogehoge");
    var_dump($temp_array);
}

function error_log_log(){
    $temp_array = [
        'hoge' => "foo",
        'var'  => 2,
    ];
    error_log("Hello World!\nhogehoge");
    $json_temp_array = json_encode($temp_array);
    error_log($json_temp_array);
}

function main(){
    print_log();
    var_dump_log();
    error_log_log();
}
```

## 結果
`error_log()`と`json_encode`の組み合わせが最適です。

### printf

```
Lambda上のログ詳細: "Hello World!\nhogehogeArray"

CloudWatch logs: Hello World!
<行切り替え>hogehogeArray
```

printfで表示は可能ですが、複数のログを出力した際に、
1行にまとめて表示される問題があります。
`\n`がCloudwatch logsでの行切り替えになっているため、想定通りの出力にならないことがありそうです。

### var_dump

```
Lambda上のログ詳細: "string(21) \"Hello World!\nhogehoge\"\narray(2) {\n  [\"hoge\"]=>\n  string(3) \"foo\"\n  [\"var\"]=>\n  int(2)\n}\n"

CloudWatch logs: string(21) "Hello World!
<行切り替え>hogehoge"
<行切り替え>array(2) {
<行切り替え>["hoge"]=>
<行切り替え>string(3) "foo"
<行切り替え>["var"]=>
<行切り替え>int(2)
<行切り替え>}
```

実際に出力してみるとわかりますが、とてもログを参考にできたものはないです。ブラウザ上に表示する場合はvar_dump()がいいと思いますが、ログ出力には向いていないのがわかると思います。

### error_log
error_logにArrayを入れるとwarningが出るため、先にjson_encodeしておきます。()
```
Lambda上のログ詳細: ""

CloudWatch logs: Hello World!
<行切り替え>hogehoge
<行切り替え>
{
    "hoge": "foo",
    "var": 2
}
```

printf, var_dumpと比べて、行切り替えのタイミングが大分よくなりました。
ただ、\nは行切り替えしたくないので、以下のラッパー関数を作成します。


```logging.php
function logging ($output) {
    $log = "";

    if(is_array($output)){
        $log = json_encode($output);
        $log = str_replace("\n", "\\n", $log);
    } else {
        $log = str_replace("\n", "\r", $log);
    }
    error_log($log);
}
```

結果

```
Lambda上のログ詳細: ""

CloudWatch logs: Hello World!
hogehoge
<行切り替え>
{
    "hoge": "foo",
    "var": 2
}
```

いいですね！Lambda上のログ詳細に出したい場合(デバッグ時)は、
var_dumpを使用すればいいと思います。

## まとめ

PHPのログ出力について、ログ関数を入れてまで本格的にやりたくないので、手軽にできる方法を探しました。
今のところ、error_logのラッパー関数が使い心地がいいですが、よりオススメの方法があれば知りたいです。

## 参考

[AWS Lambda Custom RuntimeでPHPからCloudWatch Logsに出力する方法](https://tech.innovator.jp.net/entry/2019/02/08/121916)
Cookpad TechConf 2019 資料一覧

[Cookpad TechConf 2019](https://techconf.cookpad.com/2019)に参加してきました。後日スライドと動画は公開されるとのことですが、現在公開されてる資料をまとめておきます。
【追記】
公式で公開されました→[link](https://techconf.cookpad.com/2019/materials.html)

#資料一覧(敬称略)

13:05 - 13:25
宇野 雄
[クックパッドが目指す、これからのデザインとプロダクトのあり方](https://speakerdeck.com/saladdays/kutukupatudogamu-zhi-su-korekarafalsedezaintopurodakutofalsearifang
)
↓ご本人の解説
https://note.mu/saladdays/n/n5e914ab0f108

13:25 - 13:45
長野 佳子
[生鮮ECクックパッドマート - サービスの立ち上げから拡大に向けて](https://speakerdeck.com/naganyo/cookpad-techconf-2019-cookpadmart)

13:45 - 14:05
須藤 耕平
料理の学習体験をデザインする


14:05 - 14:25
藤井 謙士朗
[新規サービス開発を加速させる技術とデザイン](https://speakerdeck.com/kenshir0f/cookpad-techconf-2019-komerco-service-dev)

14:35 - 14:55
渡辺 喬之
[Challenges for Global Service from a Perspective of SRE 2nd season](https://speakerdeck.com/takanabe/challenges-for-global-service-from-a-perspective-of-sre-2nd-season)

14:55 - 15:15
伊尾木 将之
レシピを解析する！Machine Readable Recipe（MRR: 機械可読なレシピ）の開発

15:15 - 15:35
渡辺 慎也
クックパッド動画事業開発のチャレンジ

15:50 - 16:05
三木 康暉
[〜霞が関〜　クックパッドiOSアプリの破壊と創造、そして未来](https://speakerdeck.com/giginet/cookpad-techconf-2019-xia-gaguan-kutukupatudoiosapurifalse-po-huai-tochuang-zao-sositewei-lai)

16:05 - 16:20
水谷 正慶
[スケーラブルなセキュリティ監視基盤の作り方](https://speakerdeck.com/mizutani/techconf2019-mizutani)

16:20 - 16:35
宇津 宏一
[新規アプリ開発を支えるユーザ・決済基盤](https://speakerdeck.com/uzzu/xin-gui-apurikai-fa-wozhi-eruyuzajue-ji-ji-pan)

16:35 - 16:50
小杉山 拓弥
[Re:silience から始めるカオスエンジニアリング生活](https://speakerdeck.com/itkq/a-life-of-chaos-engineering-starting-with-resilience)

17:00 - 17:30
成田 一生
基調講演

17:40 - 18:20
LTセッション(見つけた順で追加更新)
[クックパッドiOSアプリのパフォーマンス改善](https://speakerdeck.com/sidepelican/kutukupatudoiosapurifalsepahuomansugai-shan)

#個人的感想

トップバッターの宇野さんが
「デザインはユーザーにとっての入口で、そこが悪いと中身がどんなに良くても使ってくれない」
「これからは(も？)全員でデザインを作り上げていく時代」
と言っていたこともあってか、デザインの話が多かった印象です。
デザインは専門外なので、新鮮な気持ちで聞けました。
Figmaが熱く推されてました。気になるな…

あと、「毎日の料理を楽しみにする」というミッションに向けて全力で取り組んでいるのを発表からもひしひしと感じました。
あそこまで料理について深く考察することなんてあっただろうか…
技術的なことはもちろん、料理を見つめ直す意味でもとても有意義な時間でした。

(LTセッションでRubyフルコミッタの方たちが登壇されるってどういうことなの…(困惑))
条件分岐の組み替え(Recompose Conditional)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/fdaf5b9d-a029-52fa-35b6-44022684defa.png)


1つずつリファクタリング技法まとめ
個人的に簡単かつ取り入れ易いと思うものから

## 目的
すぐ引き出せるようにする

## 基本作業サイクル
- システムを動かして仕様を精査
- テストメソッドを作成
- テストの失敗を確認
- テストの成功を確認
- 小さい変更、随時テスト実行(失敗確認->成功確認)
- 最後テスト実行
- 最後動作確認

## 条件分岐の組み替え(Recompose Conditional)とは
言語独自の構文要素を使うこと
イディオム(条件などに使用できる記号)など完結に実現できるものを使う
 
## ポイント
- 記述量が減る
- 誰がみても分かるかという意味ではRubyの習熟度に依存する部分がややある

## 例
- 三項演算子はイディオムのORの演算子を利用して表現できる

```
user.age = age ? age : '年齢不詳'
```
　　　↓

```
user.age = age || '年齢不詳'
```  

- returnはガード節(早期return)以外基本いらない
- 条件式の中行われている処理が1つだけならば、return if構文を使用できる

```
def talk(age)
  if age < 2
    'おぎゃー'
  else
    '話せるよ'
  end
end
```
　　　↓

```
def talk(age)
  return 'おぎゃー'if age < 2
  '話せるよ'
end
```    

## 書籍情報
Jay Fields (著), Shane Harvie (著), Martin Fowler (著), Kent Beck (著),
長尾 高弘(訳), リファクタリング:Rubyエディション
https://amzn.to/2VlyWML

## 雑感
凝りすぎずにシンプルさと読み易さを意識する。
画像フォーマットのチートシート SMUSH PRO Guide to Image Formats 日本語版

[Best Image Formats for Websites Compared! PNG, JPG, GIF, and WebP](https://premium.wpmudev.org/blog/best-image-formats-png-vs-jpg-svg-gif-webp/)に掲載されていた画像フォーマットのチートシートが素敵だったので日本語に翻訳してみました。

画像フォーマットの特徴と、新しいWebPとの関係、ベクターフォーマットSVGとの違いが1枚でよくわかります。

元記事のコメント欄で許可を受けたので公開します。

* [PDFダウンロード](https://blog.ideamans.com/assets/Smush-Guide-to-Image-formates-JP.pdf)
* [PNGダウンロード](http://mt.ideamans.com/assets/Smush-Guide-to-Image-formates-JP-fs8.png)

<a href="https://blog.ideamans.com/assets/Smush-Guide-to-Image-formates-JP.pdf">
<img alt="Smush-Guide-to-Image-formates-JP-fs8.png" src="https://blog.ideamans.com/assets/Smush-Guide-to-Image-formates-JP-fs8.png" width="600" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" />
</a>

PDFの編集ツールがよくないのか、一部色味が変わってしまいました。どうにも直せず...非可逆圧縮と可逆圧縮やラスターグラフィック、などのあたり。直せたら差し替えます。

[ページまるごとWebP変換](https://sim.lightfile.net/webp/)も大好評！ こちらもぜひお試しください。
とあるエンジニアの問題意識 2019-02-27


# 楽観的と前向きの違いを色々な人が語る。だが日本語表現のせいかとても分かりにくい。

戦略+楽観性。戦略不在+楽観性。このように2つの単語を組み合わせた方が理解しやすい。

戦略というキーワードはなぜみんな活用しないのか。とても便利なのに。そう語る戦略一年生の エンジニア。 <https://t.co/bXb4b2RInH> 
# エンジニアの恋愛工学。出会いのあるBARで確率論で声をかける。繰り返すだけで成功。

だが落とし穴もある。100回に1回も成功しない男もいる。

残念ながら自分が低品質なアプリケーション状態にあると気付いたら服装や話し方のモジュールを頻繁にアップデートしなければいけない。

エンジニア 恋愛 <https://t.co/MCtYPgHHuK> 
# エンジニアの恋愛工学。確率論に落とし込めるのは基本ができている人。

メンタルが弱すぎない。コミニケーションに難がない。服装に難がない。変わり者すぎない。

1つでも足りないとボトルネックになる。たとえば気が弱ければメンタルのダメージも閾値の計算に入れる必要がある。

エンジニア 恋愛 <https://t.co/MCtYPgHHuK> 
# ポートフォリオ作成のためのアプリケーション作成。
大変そう。ポートフォリオ作成という目的にコミットできない。モチベーションが上がらない。きっとみんなこんな感じでめんどくさがるからこそ逆に価値が高いんだろうな。日ごろからアプリケーションを公開している人であれば無問題。

# 刺激のオプトアウトとオプトイン。
オプトイン方式を試す。刺激が必要になったときだけ感覚器官をオープンする。基本的には視覚刺激や聴覚刺激を制限した状態。必要でなければ目も開かない。視覚情報は激しくエネルギーを奪うから。片目を閉じたり両目を閉じたり半眼にしたり。なんだか虚無僧みたいになってきた。

# 焦りを感じる時。
サイレンスを取り戻す訓練をする。訓練をするかしないかで全然違う。少しずつ経験値が溜まるか溜まらないか。脳のハッキングは手強いが呼吸を取り戻す。なんとなく時間が解決するのは低エクスペリエンス。人生が終わるまでに解決できない。ファクトフルネスではこれを何本能というんだっけ。

# Slackの通知設定を見直した。
一番メインで業務に使っているチャンネル。この通知をオンにした。一昔ま前は大量の通知が流れたりして、まったく通知が意味をなしていなかった。なので慣習的に無効にしていたのだ。だが今回の設定見直しで、バディのサインにいち早く気付くことができる。

# 空気中の獣道。
自分が一瞬でも分かりにくいと思ったものは本当にわかりにくい。まずは自分の脳にわかりやすいものを作るべきだ。手書きのノートであってもプログラミングのコードであっても。自分の混乱に正直になり続けたい。なんともふわっとした行く宛のないあの感じ。自分のために道を作る。

# おやつ時。
今日も生命が死にかけていた。椅子を倒して15分ほど眠ると命が別人になった。やはり体をある程度傾けないと、回復できない眠気というものがあるみたいだ。この最近感じていなかったエネルギーの回復を感じる。たった15分。

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
DateFormatter使うときはもちろん12時間表示のこと考えてますよね？

iOSの`設定 > 日付と時刻`には悪魔の設定があります。
そう、**12時間表示です**
![IMG_3D59590EACDF-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/179503/6ba9abd8-5c9d-21ee-09a8-fe6342a27b82.jpeg)

今回は`DateFormatter`を使っていて陥った12時間表示の罠と、その解決策を備忘録としてまとめました。


# DateFormatterの落とし穴

わかりやすく`Date型`を下記のように`DateFormatter`を使って時間だけを表示したい場合
を考えたい思います。

```swift
let formatter = DateFormatter()
formatter.timeZone = .current
formatter.locale = .current
formatter.timeStyle = .short
formatter.dateStyle = .none

let timeLabel = formatter.string(from: Date())
print(timeLabel)
// 理想の出力) "23:59"
```

# 12時間表示
ユーザが12時間表示設定している端末では、上記の出力は

```swift
//端末は12時間表示設定

let formatter = DateFormatter()
formatter.timeZone = .current
formatter.timeStyle = .short
formatter.dateStyle = .none

formatter.locale = Locale(identifier: "ja_JP")
let timeLabel = formatter.string(from: Date())
print(timeLabel)
// 出力) "午後11:59"

formatter.locale = Locale(identifier: "en_US")
let timeLabel2 = formatter.string(from: Date())
print(timeLabel2)
// 出力) "PM11:59"
```

なんだか余計な"午後"や"PM"といった文字がくっついてきますね。
textLabelの長さが言語によって変わってしまうのでUIによっては不便だと思います。

冒頭に書いた純正カレンダー内でも、書き込み時にGoogle Calender APIに渡すDate型の文字列
がバグってしまってることが想像できます。

# "hh:mm"とか"HH:mm"とかで指定できなかったっけ？
まず考えたのが、なんかフォーマットを大文字の"HH"で指定したら24時間表示にならなかったっけ？
ということです。<br>
実際[ICU User Guide](http://userguide.icu-project.org/formatparse/datetime)を参照すると

| Symbol     |  Meaning |    Example(s) | output |
|:-----------------|------------------:|:------------------:|:------------------:|
| h | hour in am/pm (1~12) | h，hh |7，07 |
| H | hour in day (0~23) | H，HH | 0，00 |
| k | hour in day (1~24) | k，kk | 24，24 |
| K | hour in am/pm (0~11) | K，KK | 0，00 |

`HH`や`kk`なんかが使えそうです。
あとは、
`formatter.dateFormat = "HH:mm"`
のようにフォーマットを指定すればうまくいきそうですね。
`.dateFormat`を指定するのはアンチパターンだというのは有名ですが、
時間を抜き出す目的ならば問題なさそうです。

<br><br><br><br><br><br><br>
**しかし**、結論から言えばこれは失敗します!
これでは`午前・午後`がついたままで、出力は先ほどと同様です。（これが仕様なのかはわからないです）

# 解決策
`.locale`に`NSLocale.system`を指定することで上手くいきます。

定義を`NSLocale.locale`と比べてみると
>.system
>A locale representing the generic root values with little localization.

>.locale
>A locale representing the user's region settings at the time the property is read.

とあり、どうやら`generic root values`が24時間表記で固定されているようです。

```swift
//端末は12時間表示設定

let formatter = DateFormatter()
formatter.timeZone = .current
formatter.timeStyle = .short
formatter.dateStyle = .none
formatter.locale = NSLocale.system
let timeLabel = formatter.string(from: Date())
print(timeLabel)
// 出力) "11:59"
```
[Minecraft 1.12.2]　ThutPerms　使い方メモ

ThutPermsはユーザーグループの概念を追加してMinecraftのコマンドのパーミッションを色々設定できるForge MODである。

- https://minecraft.curseforge.com/projects/thutperms

# 利用例

## 全員にdmarkerコマンドを使わせたい！

dmarkerコマンドは権限レベルが最高の4なので使わせるとサーバーストップやらクリエイティブやらなんでもアリの権限がくっついてくる。
ThutPermsを使うと、デフォルトのグループに対してdmarkerコマンドを許可するとコマンドの本来の権限レベルを無視して利用できる。

## 一部の建築士の人に飛行をさせたい！

Thut Essentialsに入っているflyコマンドでクリエイティブ仕様の飛行能力をON/OFFできる。
flyコマンドも権限レベルが4だが、建築士のグループを作ってflyコマンドを許可し、建築士の人をそのグループに放り込めば飛行が可能になる。

（ただしflyは飛行能力の付与・剥奪を行うコマンドなので飛行可能状態のままデフォルトグループに降格させると付与されたまま詰む。バグで他人を引数に入れられなくなってるので本人を再び建築士に戻して解除させないと詰む。`player.capabilities.allowFlying`でやっている（https://github.com/Thutmose/ThutEssentials/blob/1.12/src/main/java/thut/essentials/commands/misc/Fly.java#L32 ）ので別のMODでもOFFれる。）

# 使い方（未整理）

## グループ

`world/permissions/permissions.json`の中に以下のようなグループの設定が書かれる（これはデフォルトではなく編集済み）。

```json:
{
  "groups": [
    {
      "name": "builder",
      "prefix": "",
      "suffix": "",
      "members": [],
      "all": false,
      "all_non_op": true,
      "allowedCommands": [
        "command.dmarker",
        "command.fly",
        "command.heal",
        "command.spawn",
        "command.speed"
      ],
      "bannedCommands": []
    }
  ],
  "players": [],
  "initial": {
    "name": "default",
    "prefix": "",
    "suffix": "",
    "members": [
      "ユーザーのUUID"
    ],
    "all": false,
    "all_non_op": true,
    "allowedCommands": [
      "command.dmarker"
    ],
    "bannedCommands": [
      "command.home",
      "command.spawn",
      "command.warp",
      "command.back"
    ]
  },
  "mods": {
    "name": "mods",
    "prefix": "",
    "suffix": "",
    "members": [
      "ユーザーのUUID"
    ],
    "all": true,
    "all_non_op": true,
    "allowedCommands": [],
    "bannedCommands": []
  }
}
```

この例ではbuilderグループ（カスタム）とdefaultグループとmodsグループが存在する。modsグループの用途は分からないが、defaultは新しくサーバーに入った人が突っ込まれるグループだろう。groupsは手動で追加されたグループの配列が来る。

グループの編集はコマンドでできる。jsonファイルを編集する場合は、サーバーを閉じているときにやらなければサーバーを閉じるときにサーバー上のデータで上書き保存されて反映されないっぽい。

グループは排他である。一人のプレイヤーを複数の場所に所属させられないようだ。modsとdefaultは同時に付与できるみたいだがよくわからん。

prefix・suffixはバグってるのかゲームの起動中にグループを変更しても反映されない。なので頻繁に変更するグループはこれを設定しない方がよさそうだ。常に最高権限のOPに対して自己主張の為にマークを表示するなどは可能。`§6☆§r`のようにすると色付きの文字列を指定できる。

## グループの権限設定

### all

OP権限が必要なすべてのコマンドを利用可能にする。これを付けても、コマンドブロックの編集のようなコマンド以外のOP能力は発揮されない。恐らくOPレベル1のリスポーン保護貫通も適用されない。コマンドであれば権限レベル4のものも使える。

### all_non_op

OP権限が要らないコマンドを利用可能にする。これをtrueにしていない場合、普通は使えるhelpなどもブロックされる。

### allowedCommands

特別に許可するコマンドを指定する。`"command.fly"`で`/fly`を許可できる。ここに指定されている場合、allやall_non_opがfalseになっていても利用できる。

### bannedCommands

許可しないコマンドを指定する。ここに指定されていた場合、allやall_non_opがtrueになっていても利用できない。Thut Essentialsのワープ系コマンドはデフォルトで全員使えるが、使わせたくない場合はブロックできる。
owlready2を使ってpythonでowlファイルを作ってみる

#はじめに
pythonでオントロジーファイルつくるのないかなと探したら発見.
英語のドキュメントはあるものの，日本語のドキュメントもあまりなさそうだったので英語ドキュメントを読みながら触ってみた


#環境
Macbook pro
pyenv+anaconda
python 3.7

#インストール方法
pipで入ります

```bash
pip install Owlready2
```

これだけ

#使い方
オントロジーはクラスとインスタンスが明確に分かれてるので，その辺は分けて記述
推論系に必要な条件設定もおいおい書いていくつもり

###クラス
まずget_ontologyでグラフURIを指定してpythonのグラフメソッドでオントロジーのクラスを作成できる。すごい楽びっくり！
今回はThingの下にPizzaとToppingというクラスを作った．
プロパティはhas_Toppingで

```python:ontology.py
from owlready2 import *

onto = get_ontology("http://test.org/onto.owl")
with onto:
    #エンティティクラス
    class Pizza(Thing):
        class MeatPizza(Pizza):
    class Topping(Thing):
        pass
        
    # プロパティクラス
    class has_Topping(Pizza >> Topping):
        pass
```
広くやるとこんな感じです．
get_ontology()で名前空間を指定
もしファイルからowlファイルを読み込む場合は頭に"file://"をつけて

```python
get_ontology("file:///path/to/the/owlfile")
```

って感じになる
get_ontologyメソッドはリターンがIRIで， オントロジーはファイルやウェブからの取得があればそれを使うけど， なければ空のオントロジーを作るっぽい.

```python:example
ontology = get_ontology("file:///path/to/the/owlfile").load()
```
Documentによると
> The .load() method loads the ontology from a local copy or from Internet. It is safe to call .load() several times on the same ontology. It will be loaded only once.

なのでload()でコピーを作ってるのかな

これでできたオントロジーの中身にアクセスしてみる

```terminal
> print(ontology.Pizza)
ontology.Pizza
> print(ontology["Pizza"] )
ontology.Pizza
> print(ontology.Pan)
>
```
上みたいに返ってくればそのクラスはontology内に存在する．返ってこなければできてないって事．
この辺もpythonっぽくかけるのよい
他にも色々メソッドあるのでその辺はドキュメントで確認
[クラスの作り方](https://owlready2.readthedocs.io/en/latest/onto.html#creating-an-ontology)

###サブクラス

```python
class MeatPizza(Pizza):
    pass
```
で定義できるスーパークラスがPizzaの場合ね

###インスタンス
これも簡単.

```python:
margherita = Pizza["Margherita"]
```
これだけで変数による参照もできるし，オントロジーにPizzaクラスのインスタンスが追加もされてる．

#終わりに
基本的なクラスとインスタンスとプロパティの作り方講座でした．簡単でびっくりでした
データでかいとprotegeでちまちま作るより良さそうな予感．
動的に作る方法もあるっぽいので次はその辺から

#参考資料
https://owlready2.readthedocs.io/en/latest/class.html
タスクバーにあるウィンドウサムネイル(?)に再生ボタンを付けてみる

# 経緯
オーディオプレイヤーを作ってみたのですが、ウィンドウを出してくるのも手間だったので実装しようと思いました。
# まずはやってみる
ざっと、こんな感じです。

```Xml:MainWindow.xaml
<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Test"
        mc:Ignorable="d"
        Title="Window" Height="485" Width="536" ResizeMode="NoResize">
<!-- ↓ここから重要！ -->
    <Window.TaskbarItemInfo>
        <TaskbarItemInfo>
            <TaskbarItemInfo.ThumbButtonInfos>
                <ThumbButtonInfo x:Name="tb_rep_c" ImageSource="icon/1_rep.png"
                             Description="1曲リピート" />
                <ThumbButtonInfo x:Name="tb_plpa_c" ImageSource="icon/play.png"
                             Description="再生/一時停止" Click="tb_play"  />
                <ThumbButtonInfo x:Name="tb_dm_c" ImageSource="icon/rep.png"
                             Description="てすと" />
            </TaskbarItemInfo.ThumbButtonInfos>
        </TaskbarItemInfo>
    </Window.TaskbarItemInfo>
<!-- ↓後はご自由に -->
    <Grid>
```
はい。これだけです。
#スクリーンショット
やっぱりこれだね。
![sksho.png](https://qiita-image-store.s3.amazonaws.com/0/349992/8b4628de-0edf-9030-7523-ee803db97900.png)
#まとめ

```Xml
<Window.TaskbarItemInfo>
        <TaskbarItemInfo>
            <TaskbarItemInfo.ThumbButtonInfos>
                <ThumbButtonInfo x:Name="任意の名前" ImageSource="画像リンク"
                             Description="メッセージ" />
                <ThumbButtonInfo x:Name="任意の名前" ImageSource="画像リンク"
                             Description="メッセージ" />
                <ThumbButtonInfo x:Name="任意の名前" ImageSource="画像リンク"
                             Description="てすと" />
            </TaskbarItemInfo.ThumbButtonInfos>
        </TaskbarItemInfo>
    </Window.TaskbarItemInfo>
```
後は自由に設定すればいいと思います。
#参考にしたページ
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.shell.taskbariteminfo?view=netframework-4.7.2
#使用した素材サイト
http://icooon-mono.com/
なんだかんだ言っても、このサイトのアイコンが使いやすいし、種類も多いのでWeb制作にも活用できそうですね。
#最後に
初めてQiitaで記事を書きました。
まだ慣れていないので、色々書いてみて慣れていきたいです。
CentOS7にMySQLをインストール

▼記事を書いた経緯
1.ConoHA VPSを借りてブログを作りたい。
2.[ConoHA VPSのSSHセキュリティ設定は完了した。](https://qiita.com/rutko/private/abb0e185c849075edff9)
3.ブログ記事のデータ保存の為にMySQLをCentOSに設定したい。

3のCentOSにMySQLを設定する際に少し躓いたので、同じく悩んだ方がスムーズに進めるように残しました。
書いている私も至らない点が多いと思いますので、誤記がありましたらご指摘いただけると幸いです。

▼参考サイト
https://support.conoha.jp/v/setupmysql/
https://qiita.com/ritukiii/items/f4e2fbae5d6e7b1aa5f9



#1.MySQLのインストール

CentOSには標準のMariaDBが入っていて、そのままSQLをインストールすると競合する

▼MariaDBとデータフォルダを削除しておく

```
$ sudo yum remove mariadb-libs
$ sudo rm -rf /var/lib/mysql
```

[MySQLのダウンロードページ](https://dev.mysql.com/downloads/repo/yum/)を開いてOSのバージョンが同じものをダウンロード

<img width="890" alt="スクリーンショット 2019-02-28 2.11.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/197693/2178bab0-8ab3-414f-8691-1219645cd90a.png">

▼CentOSのバージョンの確認は以下で

```
$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core) 
```

▼'No thanks,just start my download.'を右クリックし**リンクをコピー**選択
<img width="784" alt="スクリーンショット 2019-02-28 2.15.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/197693/a254132c-3562-9a34-418b-cd6b4f68f301.png">

```
$ yum install https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm

```
最後に`Complete!`と出ればMySQLインストール完了


MySQLの追加が完了すると`mysql-community-server`というパッケージを追加することが出来る

```
$ yum -y install mysql-community-server

```

最後に`Complete!`と出ればパッケージの追加も完了

▼MySQLの自動起動


```
#OSの起動時にMySQLも起動することが出来ます
$ systemctl enable mysqld.service

#今回限りMySQLをスタートさせる為に使います。（次回からは不要）
$ systemctl start mysqld.service

```
コンソール上は何も表示されませんがこれで自動起動設定完了です


#まとめ

・CentOSには標準にMariaDBが付いているため、別のDBを入れる際は削除する(競合してしまうため)
・CentOS7からは起動処理の仕組みが違うためsystemctlを使う。
memo for how to use pl2303 usb - serial console cable in linux.

# memo for how to use usb - serial console cable in linux.

## objectives

- personal memo

## system

- Thinkpad X220

```
 % cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
```

## procedure

### 1. check usb port before attaching cable.

```
 % lsusb
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 147e:2016 Upek Biometric Touchchip/Touchstrip Fingerprint Sensor
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
```
 % ls -l /dev/ttyUSB*
zsh: no matches found: /dev/ttyUSB*
```

### 2. attach usb - serial console cable.

```
 % dmesg

(snip)

[1555060.547993] usb 2-1.2: new full-speed USB device number 15 using ehci-pci
[1555060.657895] usb 2-1.2: New USB device found, idVendor=067b, idProduct=2303
[1555060.657901] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[1555060.657905] usb 2-1.2: Product: USB-Serial Controller
[1555060.657909] usb 2-1.2: Manufacturer: Prolific Technology Inc.
[1555060.658939] pl2303 2-1.2:1.0: pl2303 converter detected
[1555060.660738] usb 2-1.2: pl2303 converter now attached to ttyUSB0
```

```
 % ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 Feb 28 01:29 /dev/ttyUSB0
```

```
 % lsusb             
Bus 002 Device 016: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 147e:2016 Upek Biometric Touchchip/Touchstrip Fingerprint Sensor
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

```
 % lsusb | grep -i --color PL2303   
Bus 002 Device 016: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
```

### 3. connect with screen command

```
 % sudo screen /dev/ttyUSB0
```

```
c3750-1>sh ver
Cisco IOS Software, C3750E Software (C3750E-UNIVERSALK9-M), Version 15.0(1)SE2, RELEASE SOFTWARE (fc3)

(snip)
```