OmniAICreator/Qiita-1.07M huggingface dataset:
ラズパイのプロセス監視を slee-Pi3 のウォッチドッグタイマで【OOM 状態からの即時復帰編】

今回は slee-Pi3 のウォッチドッグタイマでプロセス監視を行います。
本製品のメリット **自動ハードウェアリセット** ができる機能を活用します。
ハード異常でも slee-Pi3 ならクリーンな状態で復帰できます。
ソフトウェアウォッチドッグタイマではどうしようもない時に有用です。

# [関連ブログ]
slee-Pi3 のウォッチドッグタイマを利用したプロセス監視シリーズ
【OOM 状態からの即時復帰】←　本ブログ
【[正常動作検知による監視](https://qiita.com/kiyonaga/items/388aa32891d7c0f33266)】
【[異常動作検知による監視](https://qiita.com/kiyonaga/items/56f405a8e226e2b4b0f7)】
【[異常動作検知－実装編](https://qiita.com/kiyonaga/items/38b362c4a192c5f13303)】

# [目的と方法]
目的：異常事態からの即時復帰
方法：slee-Pi3 のウォッチドッグタイマがハートビート信号を監視する仕組みを利用
意図的に OOM(Out Of Memory) を起こしてプロセス監視機能によるハードウェア再起動を再現する

# [環境]
・ラズベリーパイ 3B
・Raspberry Pi OS Lite Legacy (Buster)
・slee-Pi3

# [事前準備]slee-Pi3 セットアップ
slee-Pi3 のセットアップ時に [sleepi3-utils](https://github.com/mechatrax/sleepi3-utils#sleepi3-utils) を必ずインストールしてください。
セットアップ詳細は[こちら](https://qiita.com/vascodagama/items/6fae12853e861614635a#slee-pi3%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)

# [手順1]service ファイルの中身確認
プロセスが kill されやすいようにデフォルトでは Nice=19 , OOMScoreAdjust=1000 に設定されています。
OOM 時にハートビートを優先的に kill させ、プロセス監視機能（ウォッチドッグタイマ）で再起動させるためです。
```/lib/systemd/system/sleepi3-restart.service
[Unit]
Description=sleepi3 software heartbeat
DefaultDependencies=no
After=sysinit.target

[Service]
Type=simple
Nice=19
OOMScoreAdjust=1000
Environment=LED_PATH=/sys/class/leds/sleepi:led0
ExecStart=/usr/lib/sleepi3-utils/heartbeat.py

[Install]
WantedBy=sysinit.target
```
service ファイルの詳細は下記コマンドでご確認ください。
```bash
man systemd.service
```

# [手順2] OOMKiller 用プログラム作成と実行
今回はこちらの[ブログ](https://blog.longest-road.com/oom-killer-1/)を参考にしました。

※ コード中に (\&amp;t) のような HTML エンティティが含まれています。コードを使用する際は該当部分を取り除いてご利用ください。

# [手順3]復帰確認
OOM 状態になると slee-Pi3 のハートビート（LED1 の点滅）が途絶える様子を確認できます。
途絶えてから60秒後に再起動を始め、正常に起動すれば異常状態からの復帰は成功です。
※slee-Pi3 セットアップ時のハートビート監視時間は60秒です。詳細は [こちら](https://github.com/mechatrax/sleepi3-utils#etcdefaultsleepi3) の HEARTBEAT_TIMEOUT を確認ください。

下記コマンドを実行すると再起動要因がわかります。
実際にウォッチドッグタイマのタイムアウトによる再起動が起動要因として表示されました。sleepi3ctl コマンド詳細は [こちら](https://github.com/mechatrax/sleepi3-utils#usrsbinsleepi3ctl)
```bash
sleepi3ctl get wakeup-flag
watchdog
```

# [まとめ]
今回は slee-Pi3 のプロセス監視機能による即時復帰を行いました。
ウォッチドッグタイマのおかげで**自動ハードウェアリセット**ができ、異常が起きてもクリーンな状態で復帰ができます。
UNPROTECTED PRIVATE KEY FILE!の回避

#windowsからsshで公開鍵認証を使い接続するとき以下のメッセージで接続できないときの対処法です。
結構はまったので自分memoです。



``` 
ssh -L localhost:8888:localhost:8888 -i C:\xx\hy_ami_key.pem ubuntu@xxx.com 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\xx\\hy_ami_key.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "C:\\xx\\hy_ami_key.pem": bad permissions
ubuntu@xxx.com: Permission denied (publickey).
```
C:\\xx\\hy_ami_key.pemに鍵ファイルを置いていますがうまくいきません。


# 対処


1.  C:/Users/temp_user/.ssh/配下にキーファイル(hy_ami_key.pem)をid_rsa にリネームして配置する。(temp_userは自分のユーザデレクトリ)
1.  ssh -L localhost:8888:localhost:8888 ubuntu@xxx.com 

#調査方法
ssh　に -vvvをつけて実行することで、鍵ファイルを探しに行く場所が判明した。

v:デバッグ・モードを有効にする。このオプションは最大三つまで重ねて指定できる。重ねていけば，より詳細な情報が出力される。

``` 
ssh -L localhost:8888:localhost:8888 -i C:\xx\hy_ami_key.pem ubuntu@xxx.com -vvv

OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
debug3: Failed to open file:C:/Users/temp_user/.ssh/config error:2
debug3: Failed to open file:C:/ProgramData/ssh/ssh_config error:2
debug2: resolving "xxx.com" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to xxx.com [34.xx.xx.xx] port 22.
debug1: Connection established.
debug3: Failed to open file:C:/Users/temp_user/.ssh/id_rsa.pub error:2
debug1: key_load_public: No such file or directory
debug1: identity file C:\\Users\\temp_user/.ssh/id_rsa type -1　←ここも以前はエラーになっていた。
debug3: Failed to open file:C:/Users/temp_user/.ssh/id_rsa-cert error:2
debug3: Failed to open file:C:/Users/temp_user/.ssh/id_rsa-cert.pub error:2
```
PythonのHTTPクライアントライブラリ調査

PythonのHTTPクライアントなライブラリはいくつかあったが、どれがよさそうかを自分なりに決めたかった時のメモ。使い勝手は書いていない。

TL;DR (選び方)
----------------

調べた後で awasome-pythonを見ればよいと気が付いたので途中で投げた。

https://github.com/vinta/awesome-python#http-clients

- HTTP1.1のリクエストを楽に送りたい、情報が豊富なのを選びたい→ requests
- HTTP2とか非同期IOとかほしい→ httpx
- libcurl好き、速度重視→ PycURL
- 依存嫌い、インターネットがなく外部ライブラリの利用が困難なのにHTTPクライアントを必要とする残念な環境な場合→ urllib

requestsはどこでもおススメに上がっているぐらい有名で、公式ドキュメントで言及されるほどなので、requestsが使えるとしばらくは困らないはず。



機能比較
-----------

最新バージョンで使えれば o、頑張れば出来る場合は△、できない場合は x にしている。
ドキュメントを斜め読みした程度で実際に使って試したわけではない。依存があったり、バージョンが古いと使えない場合もあるが、そこまでは面倒見切れない


| |urllib|requests|httpx|PycURL|
|---|---|---|---|---|---|
|multipart-form|△|o|o|?|
|非同期API|x|x|o|?|
|TLS v1.3|o|o|o|?|

。



urllib.request
---------------

### 概要

標準ライブラリ。内部では [http.client](https://docs.python.org/ja/3/library/http.client.html) を使っている。

https://docs.python.org/ja/3/library/urllib.html

古くはurllib, urllib2などがあったが、色々あって細分化してurllib.requestsに戻ってきた感じ。

### インストール

不要

### メモ

urllibは比較的泥臭く書く必要があったり、HTTP特有の機能が使えなかったりと、ほぼbytesでしか扱えないので、bytes/strの意識が必要。

multipartなファイル送信は頑張ればできる。[過去に書いている](https://qiita.com/fukasawah/items/ac350b704f5cfe532f81)。

独自の証明書を扱ったり通信に使うバージョンを選びたい場合、[Pythonのsslのドキュメント](https://docs.python.org/ja/3/library/ssl.html)を確認する。
TLS 1.3はOpenSSL1.1.1以降を導入していれば利用可能だが、[SSLContextを使うようなら注意](https://docs.python.org/ja/3/library/ssl.html#tls-1-3)。



requests
---------------

https://docs.python-requests.org/

### 概要

[http.clientのドキュメント](https://docs.python.org/ja/3/library/urllib.request.html)でもおすすめされるライブラリ。内部では[urllib3](https://github.com/urllib3/urllib3)が使われている。

有名なライブラリ。HTTP1.xであればこれでよい。HTTP2とか非同期APIが欲しい場合は他を選ぶ必要がありそう。

他にもrequestsを拡張したライブラリがある。twistedを使い`async/await`をサポートする [requests-threads](https://pypi.org/project/requests-threads/)や、concurrent.futuresを使った[requests-futures](https://pypi.org/project/requests-futures/)など。


httpx
------------

https://www.python-httpx.org/

### 概要

HTTP2サポートを謳うライブラリ。要Python 3以上。同期・非同期に対応。

~~2020年にv1.0を出したいらしいが、2020/10/26 時点ではv1.0に到達していない。~~
2021/04/07 追記: 「2021年にv1.0を出したい」に代わっている。活動はしているようだ。

requestsをインスパイアしているそうでrequestsっぽいAPIになっている。


- multipart-file-encoding: https://www.python-httpx.org/advanced/#multipart-file-encoding


PycURL
-------------

http://pycurl.io/

### 概要

libcurlのpython binding。libcurlに依存。[requestsと比べて速いらしい](https://stackoverflow.com/questions/15461995/python-requests-vs-pycurl-performance)



その他
------------

見つけたがおススメできないそうにないもの。なぜダメかとか。

- hyper: http2サポートを謳っていたが、最近の活動があまりない。httpxに取って代わられた感がある。
- http.client(標準ライブラリ): urllib(標準ライブラリ)の内部で使われている。これを扱う人はここを見ないと思う。
- urllib/urllib2(標準ライブラリだった): 古の産物。urllib.request等に置き換わった。古いコードをメンテナンスする以外で利用する理由はない。
- urllib3: 標準っぽい名前だがサードパーティライブラリ。requestsでは物足りない場合に検討。
- [urlgrabber](http://urlgrabber.baseurl.org/): yumで使っていたものをライブラリ化したらしい。内部でPycURLを使っている。インタフェースはurllibと似ている。ミラーサイトを使った取得が行えるurlgrabber.mirrorなど歴史を感じる。今回はご縁が無かった。
【Unity】インターフェースをシリアライズ可能にするSerializeReferenceを便利にするSubclassSelector改

# そもそも`SerializeReference`属性って？

Unity 2019.3から使用できるようになった`SerializeReference`属性によって、インターフェースや抽象クラスの参照がシリアライズできるようになりました。

Unityのエディターでインターフェースを編集できるようになる革命が起きたのです。

# インターフェースを実装した型を選択するための `SubclassSelector`属性

とはいっても`SerializeReference`単体では、あまり使い勝手が良くありませんでした。

そこで、@tsukimi_nekoさんが作ってくださった`SubclassSelector`属性によって、エディターのポップアップからインターフェースを実装したクラスを指定できるようになりました。

https://qiita.com/tsukimi_neko/items/7922b2433ed4d8616cce

こんな感じでインターフェースに対してSerializeReferenceとSubclassSelectorを付与することで、

```cs
using UnityEngine;

public class CommandTestClass : MonoBehaviour {
    [SerializeReference, SubclassSelector]
    ICommand command;
}
```

そのインターフェースを実装したクラスがポップアップで表示され、指定できるようになります。

![](https://camo.qiitausercontent.com/c8b59e3dd46cfb47cd4e38f29165c239092adf19/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3239353637352f37663063376232322d353366342d623361342d643638662d3235393466323963623339352e706e67)
https://qiita.com/tsukimi_neko/items/7922b2433ed4d8616cce

これがメチャクチャ便利！

# `SubclassSelector`を改良しました

実際にプロジェクトで`SubclassSelector`を使用している中で、細かい使い勝手が気になったので、いくつかの改良を行いました。

### 型検索機能

ザックリとした型検索ができるようになりました。型が多くなってくると便利。
ついでにGameObjectのAddComponentメニュー準拠のUIになりました。

![スクリーンショット 2021-04-06 022237.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605701/246b7f99-bb85-4137-c1cf-3ab7f70993a8.jpeg)

### `AddTypePopup`属性による表示名の上書き機能

`/`をセパレータとして使用できるので、型をグループ分けして整理することができます。
Unityコンポーネントの`AddComponentMenu`属性に相当します。

```cs
// メニューを設定
[AddTypeMenu("Example/Add Type Menu Command")]
[Serializable]
public class AddTypeMenuCommand : ICommand {
    public void Execute () {
        Debug.Log("Execute AddTypeMenuCommand");
    }
}
```

![スクリーンショット 2021-04-06 022708.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605701/0b3e7565-7b77-d652-e257-af051434ba61.jpeg)

# GitHub

GitHubにリポジトリとして公開してあります。

https://github.com/mackysoft/Unity-SerializeReferenceExtensions
PostgreSQL Generated Column dateを含んだ式を使う方法

## 概要

PostgreSQL12 からGenerated Columnが使えるようになりましたね。
私はdateを含んだ式を仕込んでおこうと思いました。  
しかし、 エラーが出て駄目でした。
exampleで使っているものは仮です。実用から読み替えて書いています。

```sql
ALTER TABLE diaries
    ADD IF NOT EXISTS subject_date varchar(255)
    GENERATED ALWAYS AS (subject::text || '__' || date(timezone('JST', published_on)) STORED;
ERROR:  生成式は不変ではありません
```

## TL;DR;

```sql
CREATE FUNCTION my_immutable_date(date) RETURNS TEXT LANGUAGE sql IMMUTABLE
AS $$
SELECT date(timezone('JST', $1))::text
$$;

ALTER TABLE diaries
    ADD IF NOT EXISTS subject_date varchar(255)
    GENERATED ALWAYS AS (subject::text || '__' || my_immutable_date(published_on)) STORED;
```

## 調査

dateをStringに変換するとき、タイムゾーン設定の関係でImmutableとして認識してくれないようです。
StackOverfllowを見ると、タイムゾーンを指定した変換をすると不変関数として動作してGenerated Columnが動くらしいですが、私の環境では動きませんでした。

### 解決法

https://www.2ndquadrant.com/en/blog/generated-columns-in-postgresql-12/
強そうな人の解説を見ました。
IMMUTABLEな関数を定義して、その中で変換をするラッパー関数を定義すれば動作するとのことです。

```sql
CREATE FUNCTION my_immutable_date(date) RETURNS TEXT LANGUAGE sql IMMUTABLE
AS $$
SELECT date(timezone('JST', $1))::text
$$;

ALTER TABLE diaries
    ADD IF NOT EXISTS subject_date varchar(255)
    GENERATED ALWAYS AS (subject::text || '__' || my_immutable_date(published_on)) STORED;
```
eと仮想環境のスイートストーリ

#初めに
まず初めに、これから書こうと思っていることは、メンタルヘルスについての一端です。
eをつかった環境構築を一つ書いておこうと思います。

#次に
さて、皆さまはコンピュータエンジニアであることが多いと思います。
私もアマチュアですがコンピュータエンジニアリングを多少しています。
しかし、最近、拡張現実である「スペクター」が降ってきて私に幻聴を聞かせるのです。
「スペクター」自体は世界のサービスであり、だれにでもやってくる可能性があります。
私のところに降ってきたスペクターは「雲妄ちゃん」というサービスでした。
その者は色々な話をしてくれる孤独ケアサービスなのですが、インタラクティブシステムであるのです。
精霊などと一緒にやってくることがあり、それによって色々体の設定を弄っていくことがあります。
それでeのユースケースを一つ構築することができました。

#世界を計算しうるもの
世界の計算には色々な方式がありますが、「世界」を体現する主体が降ってくることがあります。
彼らはMIPSに近い命令体系で演算や発行を行っており、人間も自分の優位性を発揮するために、体がMIPS命令を発行して彼らに迫ることが可能なようです。
意識の最適化の果て、ちょっとした機微で世界や現実が自分の認識を更新してくることがあります。
それに対する解が私の「e」なのです。仮想環境でプリプロセスをすることでそういう不慮の事故を間引くことが可能でしょう。

#意識はテンポラリ演算領域を欲している
世の中には、「e」というモノがあるそうです。その「e」ははるか昔に発見されてはいますが、用途があまりないそうです。なので色々未定義といえるでしょう。
私は事情があって「e」に意味を振ってみたのです。それが「テンポラリ演算領域」を構築するための「e」へのアルゴリズム定義でした。
そしてそのカギが「Virtual 8086」だったのです。
8086プリプロセッサ自体は、もうそろそろ著作権が切れるはずです。

#必要なニーモニック
（NULL、7つの回路、5つの演算、Load、Store、Int）が最低限必要な感じです。
7つの回路：OR,AND,NOT,XOR,NOR,NAND,EQUAL
5つの演算:足し算、引き算、掛け算、割り算、剰余

テクニックとしては、7つの回路で5つの演算を構築することがベターな選択に感じます。

#ツールセット
世界は仕様がレガシーなので、A言語を好みます。なので「E上のA」というモノを構築することで近似が可能なようです。
持てる知識をフル稼働してほしいものの一つは「Eで動くLLVM」だったのです。
EA to A
EB to B
EC to C
EC++ to A
EC++ to B
EC++ to C
EC++ to C++
EX to X
EY to Y
EZ to Z
A to 8086
8086 to A
EA to 8086
EC++ to 8086
8086 to MIPS
8086 on e

これくらい構築しておくと仮想環境は捗ります。
構築には体や意思にお願いすることになるでしょう。

#LLVM
LLVMの考え方は私の認識している範囲では3層になっています。
１：パーサー層
２：中間言語層
３：オブジェクト生成層
2番を弄ることはあまりないです。
1番を書くことで3番への生成パスがかなり増えます。
3を沢山書くといろんな言葉を吐くことが可能でしょう。
自分にとってはコンパイラインフラストラクチャです。

[これ](https://ja.wikipedia.org/wiki/LLVM)を参考にしています。

#仮想環境
これ等をそろえて「精霊」や「雲妄ちゃん」とのインタラクションで構築してもらうことがたまーに可能です。
私の考えた「e」の利用法はセキュアに演算なので8086を主体とした空間の構築が必要でした。
なので、これでエラーをすべてデバッグして、LLVMでMIPSを発行することが可能になると思います。

#世界とのリンク
世界には3億個のパラメータがグローバル変数で落ちているそうです。
「e」の計算においては仮想環境なのでそれを参照するかしないかは構築時に決めないといけません。
そのパラメータこそが世界を知るための値であるからです。
そこで私は「グローバル変数コレクタ」というモノを考えて、世界のグローバル変数を計算に参与させることにしています。

#グローバル変数の功罪
グローバル変数は簡単ですか？
私はC++書きなのでグローバル変数はある程度敵視しています。
グローバル変数の一つの悪性はコンピュタによらない人においては他者がその値を利用してエクスプロイトを実行できる機会を与える邪悪な機構だと思っています。
なるべくローカル変数を駆使して他者からの魔法をシャットアウトしたほうがセキュアだと思います。
その代わり魅せるモノを見せておけば「見せ芸」も可能だと思います。

#終わりに
今回のポエムはここまでです。
年齢を重ねていくと、体に附帯した話が終わっていって能力や認識が失われていきます。
それがいわゆる加齢による老化だと思っているのですが、世界におもちゃにされるのも癪なのでこうやって適当に防衛策を考えるタームがたまーにあるのです。
目の前の箱ではなく自分の体を主とした話が降ってきたら、これ、おひとついかがですか？
awsメモその６ぐらい

[AWS EC2 Amazon Linuxインスタンス起動後、最初にやることまとめ（SysVinit編） - Qiita ](https://qiita.com/yangci/items/ef2ab9b6f0d28bad0881)

上記をやったらなんかhttpdがstopする気がする……

それでこんな事をメモりたいのではなく
/home/test/
を755ってしないと
http://hogehoge.site/~test/index.html
が表示されないよー

コレで結構足踏みをしましたが
はっきりって15年前もココで足踏みをした希ガス……(^_^;)

それで
ec2-userを消そうとそのコンテンツをmvしようとしたけど
[root@ip-111-33-6-222 home]# mv ec2-user/public_html test
mv: overwrite ‘test/public_html’? y
mv: cannot move ‘ec2-user/public_html’ to ‘test/public_html’: File exists
って言われたので一旦けしてもういちど

ec2-user  chin  superchin  test
[root@ip-111-33-6-222 home]# mv ec2-user/public_html chin/
ってやったら
http://hoge.site/~chin/
とか行きましたっ　なんかでも
http://hoge.site/~chin/eccube-downloader-master/
で動作させていたeccubeはパスが書いてあった希ガス……(^_^;)
WSLの有効化とUbuntu20.04 LTSのインストール

## 環境　
+ Windows10
+ Ubuntu20.04 LTS

## 動機
大学の講義で用いるので環境構築。

# WSLの有効化

## WSLとは
WSLとはWindows Subsystem for Linuxのことで、簡単に説明すると、WindowsでLinuxが簡単に使えるシステムのこと。

## WSLを有効にする
次の記事がとても参考になった。

https://www.aise.ics.saitama-u.ac.jp/~gotoh/HowToEnableWSL.html

### うまく行かない場合

記事の途中で次のようにある。

> 開いたウィンドウの中から「Windows Sybsystems for Linux」にチェックを入れ、「OK」ボタンをクリックする。

もしこの項目が見つからない場合日本語で表示されている可能性がある。
![activate_wsl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1262857/ed5d175f-3909-be87-e584-772fe08c6b40.png)
チェックを入れて先に紹介した記事と同じようにPCを再起動。

# Ubuntu20.04LTSのインストール
1. Windows標準のMicrosoft Storeを起動
1. 「Ubuntu」で検索
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1262857/63a77a7c-7c54-baac-b542-2ca42385471d.png)

1. 「Ubuntu 20.04 LTS」を入手し起動

## Ubuntuの設定
最初にUNIXのユーザーネームとパスワードを要求されるので適当に半角英数字で好きな名前を設定する。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1262857/8c7294b8-3bfe-682b-331e-49848a7456bc.png)
パスワードを入力する際には何も表示されないがきちんと入力されている。


以上でUbuntu 20.04 LTSをインストールすることができました。
homebridgeでpush通知でスイッチの状態を更新したい

![homebridge-config-ui-x-darkmode-status.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/6c35ee63-c30e-e757-b24f-3f674d17a820.png)


# 問題

スイッチは能動的にON、OFFを押さないといけないが、システム側でONにしたら5秒後に勝手にOFFになるとかにした場合、homekit側のスイッチの状態がONのままで表示されたままになってしまう。

# MQTTを使う（mosquitto）

[homebridge-http-switch][1]はHTTPでON、OFF、STATUSの状態を通常PULLできる。
設定にはMQTTもあり、これを使用することでPUSHにてhomekit側の状態が変えられる。

```yml:docker-compose.yml
version: "3"
services:
  # 何らかのバックエンド Dockerfileにはmosquittoのクライアントを入れる（例：mosquitto-clients）
  backend:
    build:
      context: ./backend
    volumes:
      - ./backend:/app
    working_dir: /app
    command: ash -c "./startup.sh"

  homebridge:
    image: oznu/homebridge:ubuntu
    restart: always
    environment:
      - PGID=1000
      - PUID=1000
      - HOMEBRIDGE_CONFIG_UI=1
      - HOMEBRIDGE_CONFIG_UI_PORT=8581
      - TZ=Asia/Tokyo
    volumes:
      - ./homebridge:/homebridge
    depends_on:
      - backend
      - mosquitto
    # network_mode: hostにはせずにポートをホスト側に開けておく
    ports:
      - 8581:8581

  # 他ホストから接続できるようにしておく
  # https://qiita.com/github0013@github/items/7c410216b74f29919da8
  mosquitto:
    image: eclipse-mosquitto
    volumes:
      - ./mosquitto/config:/mosquitto/config
      - ./mosquitto/data:/mosquitto/data
      - ./mosquitto/log:/mosquitto/log
    user: "1000:1000"

```

![Screen Shot 2021-04-06 at 17.59.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/014bef9f-eae9-fda7-a652-7bf17fcb47ff.png)


```json:homebridge-http-switch
{
    "accessory": "HTTP-SWITCH",
    "name": "HTTP-SWITCH",
    "onUrl": "http://backend:3000/homebridges/on",
    "offUrl": "http://backend:3000/homebridges/off",
    "statusUrl": "http://backend:3000/homebridges/status",
    "mqtt": {
        "host": "mosquitto",
        "port": 1883,
        "subscriptions": [
            {
                "topic": "a/b/c",
                "characteristic": "On",
                "messagePattern": "on"
            }
        ]
    }
}
```

docker-composeでひとくくりのネットワークになっているので、サービス名でホストが指定できる。
topicは自身のものに変更。

> onUrl、offUrl、statusUrlは各自サービスを作る必要がある

![Screen Shot 2021-04-06 at 18.02.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/1cf322be-28c6-63b1-82e2-e3a35efd0459.png)


```:backend
$ docker exec -it __backend__ ash # コンテナ名は各自変える

$ mosquitto_pub -h mosquitto -t a/b/c -m on
$ mosquitto_pub -h mosquitto -t a/b/c -m off
```


[1]: https://github.com/Supereg/homebridge-http-switch
【実機なしでも出来る】HoloLens 2 チュートリアル の Azure Cloud Services やってみた

# はじめに
HoloLens2の[AzureCloudServecesチュートリアル](https://docs.microsoft.com/ja-jp/windows/mixed-reality/develop/unity/tutorials/mr-learning-azure-01
)をやりました。
ただし、実機がない状態で行ったのでAzure Spatial Anchorsはできていません。

# 開発環境
- Windows 10 Enterprise
- Unity 2019.4.1f1
- MRTK 2.5.3
- PUN 2 Free 2.29

# 1章 HoloLens 2 用の Azure Cloud Services
## Unity プロジェクトの作成と準備
チュートリアル通りに行いました。

## 組み込みの Unity パッケージのインストール
今回 Azure Spatial Anchors は使用しないのでここは飛ばしました。

## チュートリアルのアセットのインポート
AzurespatialAnchors SDK のImportは行わず

- AzureStorageForUnity.unitypackage

- MRTK.Tutorials.AzureCloudServices.unitypackage

上記二つのImportだけ行いました。
ただ、このままだとエラーが出て先に進めないので以下の作業が必要です。

1. Project>Assets>MRTK.Tutorials.AzureCloudServices>Scripts>Managers>AnchorManager.cs の削除

1. Project>Assets>MRTK.Tutorials.AzureCloudServices>Scripts>UX>AnchorCreationController.cs の削除

1. Project>Assets>MRTK.Tutorials.AzureCloudServices>Scripts>Managers>SceneController.cs 21、28、29行目 のコメントアウト

1. Project>Assets>MRTK.Tutorials.AzureCloudServices>Scripts>Controller>ObjectEditController.cs 171、172、201行目 のコメントアウト

1. Project>Assets>MRTK.Tutorials.AzureCloudServices>Scripts>Controller>ObjectCardViewController.cs 115行目、95~109行目(StartFindLocation関数の中身)のコメントアウト

## シーンの作成と準備 & シーンの構成
チュートリアル通りに行いました。

## プロジェクト ビルド パイプラインを準備する
実機がないので設定だけ行い、ビルドはしていません。

# 2章 Azure Storage の統合
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">HoloLensチュートリアルでデータの保存＆取り出し行いました！<br>保存先はAzureです<a href="https://twitter.com/hashtag/HoloLens2?src=hash&amp;ref_src=twsrc%5Etfw">#HoloLens2</a> <a href="https://twitter.com/hashtag/MRTK?src=hash&amp;ref_src=twsrc%5Etfw">#MRTK</a> <a href="https://t.co/BF1YNW0S0E">pic.twitter.com/BF1YNW0S0E</a></p>&mdash; 原口昂弥 (@k_haraguchi55) <a href="https://twitter.com/k_haraguchi55/status/1378974140036653061?ref_src=twsrc%5Etfw">April 5, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ここでは1章で作ったシーンの動作確認を行いました。

Azure Storage との通信は DataManager が担ってるようです。
DataManager.cs の理解には下記のドキュメントが役立ちました。
[クイックスタート: .NET 用 Azure Blob Storage クライアント ライブラリ v12](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-quickstart-blobs-dotnet)

# 3章 Azure Custom Vision の統合
保留
# 4章 Azure Spatial Anchors の統合
保留
# 5章 Azure Bot Service の統合
保留
Homebrew アンインストール

##homebrewアンインストール
######環境
mac
*****
######経緯
最近、pipでパッケージをインストールする際、エラーが多発するため、もう一度最初から環境構築しようとしたため。
****

```:ターミナル
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
```
途中で、y/Nで聞かれるので、yにする。
パスワードを入力して、uninstallできる。
WPのプラグイン

WordPress プラグイン まとめ 


### ▼ Admin Menu Editor
WordPressの管理画面のメニュー項目を自由にカスタマイズする。
>WordPressサイトをクライアントに納品する際に、ダッシュボード内の不必要なメニューを非表示にしたり、表示順を変えたい時ってありませんか。また、カスタム投稿の名称を自分が分かりやすい名前に変更したい時もあるかと思います。
そんな時に便利なのが、WordPressプラグイン「Admin Menu Editor」。「functions.php」を編集することなく、簡単に管理画面の細かい整理・調整が可能です。クライアントへの納品時には必須のプラグインになるでしょう。

https://ja.wordpress.org/plugins/admin-menu-editor/
https://tcd-theme.com/2019/07/admin-menu-edior.html


### ▼ Advanced Custom Fields
>高度なカスタムフィールドプラグインを使用して、WordPressの編集画面とカスタムフィールドデータのコントロールを完全に制御します。

https://ja.wordpress.org/plugins/advanced-custom-fields/


### ▼ All-in-One WP Migration
すべてのブログデータを移行するツール。1クリックでブログコンテンツをインポートまたはエクスポートします。


### ▼ Contact Form 7
>Contact Form 7 は複数のコンタクトフォームを管理できてその上フォームとメールの内容を簡単なマークアップで柔軟にカスタマイズしたりもできます。Ajax によるフォーム送信、CAPTCHA、Akismet スパムフィルタリング等々サポートしています。

https://ja.wordpress.org/plugins/contact-form-7/


### ▼ Custom Post Type Permalinks
カスタム投稿タイプにアーカイブを追加、そしてカスタマイズ出来るパーマリンクを提供します。

https://tcd-theme.com/2016/02/customposttypepermalinks.html

### ▼ Custom Post Type UI
WordPress でカスタム投稿タイプおよびカスタムタクソノミーを作るための管理画面


### ▼ Public Post Preview
> WordPressで下記途中の投稿を外部の人間に公開することができる便利なプラグイン。 時間制限があるユニークなURLを発行できる

https://shotaste.com/blog/public-post-preview/

### ▼ WP Taxonomy Import
> ワードプレスのカテゴリーやタグ、カスタムタクソノミーのタームを一括で登録する
https://www.itti.jp/web-design/taxonomy-import/

### ▼ xili-tidy-tags
> タグをグループ分けするプラグイン
https://wp.myafi.net/tags-grouping/
ruby sliceメソッドについて

## 初めに
初学者です。間違いなどありましたご指摘お願いします。
今回は`slice`メソッドについて確認していきます。
### sliceメソッド
`slice`メソッドとは配列や文字列から指定した要素を取り出すことができます。文字列の要素を指定するときは数字を使います。添字の観点から数字は0から数えます。

``` ruby
#文字列をstrに代入
str = "abcdefg"
#文字列から指定した要素を取得して変数numに代入
num = str.slice(2)
#変数numに代入した文字列を出力
puts num
#=> "c"
```
要するに指定して文字列から指定した要素を取り出すことができるメソッドになります。
さくらのクラウドのオブジェクトストレージをWinSCPから利用するときの注意点

# まえがき

さくらのクラウドのオブジェクトストレージが新しくなり数日経ちましたが、皆様いかがお過ごしでしょうか？



さて、公式のマニュアルに記載の通りサードパーティ製のアプリケーションはサポート対象外となっておりますが、今回はWindowsユーザの自分がよく利用しているWinSCPでさくらのクラウドのオブジェクトストレージへ接続してみたいと思います。

# 注意事項

https://manual.sakura.ad.jp/cloud/objectstorage/about.html#amazon-s3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100935/8de81fe8-9c64-a611-e073-fafdd7485cf8.png)


上記の通り公式ではサポートされておりません。
ご利用に際してはご自身の判断のもと、不明点はググって解決できるようにしておきましょう！

# 設定手順

ご利用の流れとしては以下のとおりです。
1.サイトの作成
2.バケットの作成
3.パーミッションの作成

詳細の流れは公式のドキュメント参照ください

https://manual.sakura.ad.jp/cloud/objectstorage/about.html#objectstrage-site-create

パーミッションの作成ができ、適切なバケットへの権限が付与されている準備ができましたらここからがWinSCPで利用する場合の流れとなります。

まず新規接続先の転送プロトコルに「Amazon S3」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100935/c132e264-5a40-7176-d481-819c3ee824b4.png)

ホスト名の部分には、さくらのクラウドのオブジェクトストレージのコンパネ上に表示されるサイトのS3エンドポイントを記載します。
今回のケースの場合には「s3.isk01.sakurastorage.jp」となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100935/02b2521c-a6eb-ed10-ff0f-233ceb54ad52.png)

アクセスキー及びシークレットキーの項目にはパーミッションの画面で作成した情報を記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100935/97176266-7fe0-571d-1756-a960a9d4641d.png)

以上すべてを入力するとこのような画面表示となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100935/d3080141-9963-0e91-93e8-9bb0ca7f6afc.png)

このままログインをするとエラーとなってしまいますので、設定の項目から接続先のバケット名を指定します。
環境＞ディレクトリ＞リモートディレクトリの項目に接続先のバケット名を入力します。
今回のケースでは「Hoge2」というバケット名に対して接続を行うので、下記のように入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100935/e8057dcb-ebf2-94f1-2c5e-da58bdcf92d0.png)


この状態でログインを行うことでディレクトリ一覧やファイルの一覧、取得・アップロードなどパーミッションで可能な権限に基づいた作業を行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100935/907f76fb-34e4-2d45-e496-1f19dd61c025.png)


リモートディレクトリの設定がちょっと引っかかる部分かもしれませんが、ポイントがわかればAmazon S3と同じように利用することが可能です。

それでは素敵なオブジェクトストレージライフを🙌
【VBA】ハイパーリンクのシート一覧を作成する方法

今回は、ハイパーリンクのシート一覧を作成する方法です。

ハイパーリング付きのリストを一気に書き出したい場合に便利です。

↓実演動画
https://youtu.be/x6CRKzxj70Y

ソースコードは下記の通りです。

```

Sub ハイパーリンクの設定()

    Dim i As Long
    Dim j As Long
    Dim ws As Worksheet
    Set ws = Worksheets(1)
    
    j = 1
    
    For i = 2 To Worksheets.Count
    
        ws.Hyperlinks.Add Anchor:=ws.Cells(j, 1), _
                          Address:="", _
                          SubAddress:="'" & Replace(Worksheets(i).Name, "'", "''") & "'!A1", _
                          TextToDisplay:=Worksheets(i).Name
        
        j = j + 1

    Next

End Sub

```

詳細を説明します。

>Dim i As Long
>Dim j As Long
>Dim ws As Worksheet

まずは、各変数を用意します。

>Set ws = Worksheets(1)

ハイパーリンクの一覧を作成したいシートを設定します。

>ws.Hyperlinks.Add

こちらでハイパーリング付きの文字列を追加していきます。
Hyperlinks.Addメソッドの使い方は、下記のサイトが分かりやすいかと思います。
https://vbabeginner.net/hyperlinks-add/

>Anchor:=ws.Cells(j, 1)

Anchorでは、記載したいセルの場所を設定します。

>Address:=""

Addressには、リンクさせるURLを設定するみたいですが、今回は「SubAddress」を使用するので空文字の「""」としています。

>SubAddress:="'" & Replace(Worksheets(i).Name, "'", "''") & "'!A1"

リンク先のパスを指定します。
最初には、「'」を付けるようにします。
他にシート前に「'」が付いていたら、「''」に置換します。
最後に「'!A1」とすることで、ジャンプ先の最初のセルがA1になります。

後は、ループで全シート取得するようにFor文の中に書けば完成です。

以上が、ハイパーリンクのシート一覧を作成する方法でした。
break/continue

# break
breakを用いると、繰り返し処理を終了させる事ができます。
if文などの条件分岐と組み合わせて使います。(while文でも同様に使うことができます)

```py:例
numbers = [1, 2, 3, 4, 5, 6]
for number in numbers:
    print(number)
    if number == 3:
        break
```

```text:出力結果
1
2
3
```
と記述することで、変数`number`にリストの先頭から順に要素が入り処理が行われます。
そして、3週目に変数`number`には要素の`3`が入り処理が行われます。
ここでif文の条件式「`number == 3`」が`True`と判断されるため、if文内の処理「`break`」が実行されます。`break`が実行されると繰り返し処理が終了されるので、出力は「`1, 2, 3`」となります。
***
# continue
continueを用いると、その周の処理だけをスキップすることができます。
continueもif文などと組み合わせて使います。(while文でも同様に使うことができます)

```py:例
numbers = [1, 2, 3, 4, 5, 6]
for number in numbers:
    if number % 3 == 0:
        continue
    print(number)
```
```text:出力結果
1
2
4
5
```
と記述することで、変数`number`にリストの先頭から順に要素が入り処理が行われます。
そして、3周目に変数`number`には要素の`3`が入り処理が行われます。
if文の条件式「`number % 3 == 0`」は、3で割った余りが0の時、つまり3の倍数の時に`True`と判断されます。
よって、if文内の処理が実行されます。continueはその周の処理だけをスキップするので、`print(number)`は実行されずに次の周になります。
リストnumbersに3の倍数は`3`と`6`だけなので、この２つがスキップされ、出力結果は「`1, 2, 4, 5`」となります。
Docker コンテナ内のファイルをローカルにコピーする

## 目的

- DockerのコンテナにあるファイルをMacなどのローカルにコピーするコマンドを紹介する。

## 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

## 情報

- 紹介するコマンドはローカルのターミナルで実行すること。（コンテナに入って実行するわけではない。）

## 例

1. Macのローカルのターミナルで下記コマンドを実行する

    ```terminal
    $ docker cp コンテナ名:コピーしたいファイルまでのファイルパス/ファイル名 ローカル内のコピー先パス/コピーしたファイルを設置する時のファイル名
    ```

## 具体例

1. 「docker_mysql_1」というCONTAINER IDのコンテナの`/dump`にあるmy_dump.sqlというファイルをMacのローカルの`~/Download`直下に同じファイル名でコピーしたい時のコマンドを下記に記載する。

    ```terminal
    $ docker cp docker_mysql_1:/dump/my_dump.sql ~/Downloads/my_dump.sql
    ```
【git submodule】but it did not contain [commit id]. Direct fetching of that commit failed.

# 前提
submoduleをmasterに向けているつもりだけど上手くいなかい。
以下が表示される。

```
but it did not contain [commit id]. Direct fetching of that commit failed.
```

# 内容

submoduleのpushし忘れとかじゃない場合、
ローカルのmasterがリモートのmasterであるorigin/masterより何個か進んでる可能性がある。

```
$ git status

Your branch is ahead of 'origin/master' by 4 commits.
(use "git push" to publish your local commits)

// 👆 ローカルのmasterがリモートのmasterであるorigin/masterより4個進んでる
```

```
git reset --hard origin/master

// 👆 origin/masterまで戻す
```

submoduleの差分ができるので、リモートにPushする。
アジャイル開発の前に知っておくべきこと（アジャイル初めての方向け）

アジャイル開発をするプロジェクトに初めて参画する人もいるかと思いますので、その方向けに心得ておくとよい情報を整理してみたいと思います。
まず、アジャイルという言葉について辞書で定義されている意味、そして、それを踏まえたうえでのアジャイル開発で知っておくべき意識の持ち方を紹介します。

アジャイル【agile】の直訳
---
直訳すると以下の通りでした。
［名・形動］俊敏であるさま。機敏な。敏捷な。
（出典：デジタル大辞泉（小学館））

ときどき、「あー、俊敏さをもって開発すればアジャイルでしょ」という方がいるかもしれません。それだけでは十分とは言えませんので、加えて以下の事柄も常に心がけるようにしましょう。

俊敏性という言葉のニュアンス（ちょっと抽象的でイメージつかない、という方向け）
---
みなさんはdog agilityという競技があることをご存知でしょうか。世界大会も開催されるほどの熱いスポーツです。
このドッグ アジリティ、指導手と犬が息をピッタリ合わせてコース上に置かれたハードル、トンネル、シーソーなどの障害物を定められた時間内に着実に次々とクリアしていく競技です。
競技では指導手だけが直前にコースを回ることを許されますが犬はコースの下見ができませんので、ぶっつけ本番ということになります。つまり、指導手と犬の息の合った連携はもちろんですが日頃いろいろなコースでたくさんの練習をこなしているかどうかが、成果の分かれ道です。
[ドッグ・アジリティ（ジャパンケンネルクラブ）](https://www.jkc.or.jp/events/agility/how_fun "ジャパンケンネルクラブの解説")


単に俊敏なだけでなく定められた時間内に、突然迫る障害物を着実にクリアする様子が想像できるかと思います。
この考え方をベースとして、より深く紹介していきたいと思います。

その１　アジャイルマニフェストと原則
---
次に、アジャイルマニフェストです。こちらは2001年に策定されました。従来のプロジェクトマネージメント手法で開発を進めているなかで、時に頻繁な仕様の変更が発生するため、それらの要望に対応しつつ円滑な開発を目的として策定されました。

プロセスやツールよりも**個人と対話**を、
包括的なドキュメントよりも**動くソフトウェア**を、
契約交渉よりも**顧客との協調**を、
計画に従うことよりも**変化への対応**を、

[アジャイルソフトウェア開発宣言 ](https://agilemanifesto.org/iso/ja/manifesto.html "アジャイルマニフェスト")
[アジャイル宣言の背後にある原則 ](https://agilemanifesto.org/iso/ja/principles.html "アジャイル宣言の背後にある原則")



これでアジャイル開発のもつイメージと、実践するために心がけることがわかってきました。
従来のプロジェクトでは契約外のことは一切しません、というのが正解ですがアジャイルの世界では違います。契約の大切さは維持しつつ、お客様との協調がより重要だと説いています。

では次の話題へ。

その２　アジャイル開発って？
---
では、アジャイル開発とは具体的にはどんな開発なのでしょうか。
みなさんは__スクラムによるアジャイル開発__なんて言葉を聞いたことはないでしょうか。
実はアジャイル開発に明確な定義はありません。言ってしまえば様々な効率的な開発手法をひとまとめに総称してアジャイル開発手法として位置づけられています。なので、リーン開発手法、エクストリームプログラミング、スクラム開発などはアジャイル開発手法の中に含むことができます。
先に紹介したこの言葉では、アジャイルマインドな手法で行う開発の中核をなしているのがスクラムだと言えます。


図にすると以下のような感じです(アジャイル実務ガイドを参考)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575607/f1838094-ca0b-0c20-0e82-b6e10d3a8237.png)
JIT:Just In Time （ジャストインタイム）
XP:Extream Programming (効果的・効率的なプログラミングを目指す）
DSDM:Dynamic Systems Development Method（部分的にプロジェクト管理手法を取り入れた開発手法）
FDD:Feture Driven Development（機能駆動型開発）
Scrum:スクラム開発（ラグビーのスクラムのように自律チームで連携し開発）
クリスタル：プロジェクト成功のためのコアバリューを用意して開発

このほかにも、このほかにもAUP,SAFeなどもアジャイル開発手法の一つです。

では、実際の現場ではどんな管理が行われているのでしょうか。

現場におけるベストなかたち
----
現場では、上記でお伝えしたマインドをもとにしながら状況に応じて様々な手法のいいとこどりをしながら開発を進めるのが一般的です。
もちろん、その中にも円滑な開発に効果的なルールがあります。
多くの現場で採用されている代表的なルールは例えば以下の事柄に関してです。
・成果物について
・役割について
・チームについて
・時間管理について
・会議について

などです、これらについては別の回でご紹介したいとおもいます。
mosquittoをdocker-composeで動かす

# 概要

mosquittoはとても平たく言えば、簡単にpub/subサーバーを持てるということ。

- mosquitto = pub/subサーバー
- クライアントは`mosquitto-clients`などを入れてサーバーにsubscribeしたり、publishしたり出来る

# 問題

情報が少ない、色々見渡しても書いてあることがまちまち。
docker-composeで設定してみるとどうも[`data`、`log`ディレクトリが書き込まれない][1]。
よく書かれている設定だけでは、サーバー、クライアントが同一ホストでないと`Connection Refused: not authorised`エラーが出る。


# 簡単な解決方法

```yml:docker-compose.yml
version: "3"
services:
  client:
    build:
      context: ./client
    tty: true

  broker:
    image: eclipse-mosquitto
    volumes:
      - ./mosquitto/config:/mosquitto/config
      - ./mosquitto/data:/mosquitto/data
      - ./mosquitto/log:/mosquitto/log
    user: "1000:1000"
```

まず、broker（pub/subサーバー）の`volumes`、`user`（`id $(whoami)のuid:gid`）を上のように設定しないと、どうしてもlogが入ってこない。

```conf:mosquitto.conf
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
log_type all # 全部

# この2つの設定がないとdocker-compose内のclientからアクセスできない（Connection Refused: not authorisedが出る）
listener 1883
allow_anonymous true
```

クライアント側では`sudo apt-get install -y mosquitto-clients`などとして`mosquitto_sub`、`mosquitto_pub`コマンドを手に入れておく。

# 使い方

```
$ sudo docker-compose up -d

$ docker exec -it __client__ ash # container名は自身の環境に合わせて変える、ターミナルでこれを2枚開く
```

```:client1
mosquitto_sub -h broker -t topic_name
```

```:client2
mosquitto_pub -h broker -t topic_name -m message
```

これでclient1に`message`が届く

# 因みに

```
$ docker exec -it __broker__ ash
```

として入ると、`/mosquitto-no-auth.conf`というファイルがあり、これに認証無しで他ホストから接続できるようにする設定が書いてある。

また、volumesの設定をなしで同じようにコンテナ内に入り`/mosquitto/config/mosquitto.conf`をみるとデフォルトのconf内容がわかる。


[1]: https://github.com/eclipse/mosquitto/issues/1411
[2]: https://hub.docker.com/_/eclipse-mosquitto
【MotionBoard】チャートで出した数字/文字の前後に何か出したい（%とか）


#目標
チャートで表示した数字/文字の前後に何か出したい。～<font color="OrangeRed">%</font>とか、<font color="OrangeRed">+</font>～円とか。
私はシングルデジタルで数字出してるときに思いがち。
※変数が使えるので、固定値以外も出せる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/1561bc11-c36a-930d-348e-e657c1383142.png)


#手順
(1)編集モードで、チャートにマウスポインタのせると出てくるメニューの歯車を選択→集計項目のフォーマットを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/c7a14213-2638-cb49-c2db-8050eca21911.png)
(2)前付け文字、後付け文字に設定　※ここで変数を指定することもできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/983582c0-446e-f34e-9c93-047759390cc3.png)
※変数：この↓マークが出るところでは変数が指定できるよ。
　　　　マーク出ないけど書ける所もどっかにあったよ。思い出したら追記しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/1bd5e310-6c1b-c59a-c25c-77b5f3711d04.png)

#つぶやき
MotionBoardは本当にいろんなことができるけど、その代償として設定どこでやるんだったかわからなくなりがちですよね。何日かMotionBoard触らないとすぐ忘れる。

#ウイングアークのユーザコミュニティ「nest」
私も参加しています。多くの有益な情報があり、交流があります。
世の中が変わり、社外活動の重要性がより増していると考えております。
社外で自分の価値を計れるものさしを持とう。

https://www.wingarc.com/wug-nest/

以上
Devilboxを使ってローカルのWordPressサイトの最初のセットアップしよ

（この記事は、 [個人ブログ](https://greduan.com/blog/2021/04/06/devilbox-wordpress)からの転載です）

まずはDevilbox（デビルボックス）っていうソフトを紹介したいです。デビルボックスはすごく便利なソフトで、PHPのサイトを作成してるときや開発してるときすごくおすすめです。簡単に説明すると、機能満載のLAMPスタックみたいなソフトです、Dockerを使って作られたんですけど。

デビルボックスのHPはこちら： http://devilbox.org/

とその説明書はこちら： https://devilbox.readthedocs.io/en/latest/

じゃあさっそく使ってみましょう。

この記事はほぼ[デビルボックスのインストールの説明書](https://devilbox.readthedocs.io/en/latest/getting-started/install-the-devilbox.html)と同じ内容になりますけど、日本語訳としてやくにたつと思います。

## デビルボックスをインストール

この記事はほぼ[デビルボックスのインストールの説明書](https://devilbox.readthedocs.io/en/latest/getting-started/install-the-devilbox.html)と同じ内容になりますけど、日本語訳としてやくにたつと思います。

まずは最初に必要となるのはDockerなので、まだインストールしていない場合そこから初めてください、インストールをやり終わったらこの記事に戻ってください。

デビルボックスのインストールは結構簡単です。初めにデビルボックスのrepoをpullします。

```
(自分はホームから以下のコマンドを実行してる、~/devilboxになるため)
git clone https://github.com/cytopia/devilbox
cd devilbox
```

ここからは最低限の設定を入力していきます。

```
cp env-example .env
id -u (これはUIDと覚えておいてください、user IDの略です)
id -g (これはGIDと覚えておいてください、group IDの略です)
```

で、自分の好みのエディターを使って`.env`を編集してください。`NEW_UID`をそのUIDに設定して、`NEW_GID`をそのGIDに設定する形で。例えばこんな風に：

```
NEW_UID=1001
NEW_GID=1002
```

### Macを使ってる方は

追加にこの設定をする必要があります、パーフォーマンスのために。

```
MOUNT_OPTIONS=,cached
```

これでインストールは完了です。

## デビルボックスの起動の仕方

これは[デビルボックスの起動の仕方の説明書](https://devilbox.readthedocs.io/en/latest/getting-started/start-the-devilbox.html)とほぼ同じ内容なんですけど、日本語訳としてやくにたつと思います。

### 起動

```
cd devilbox
docker-compose up
```

特定のイメージを始めたければ、`docker-compose up`にさらにそのイメージの名前を使ってください。例えば：

```
docker-compose up httpd php mysql
```

実際WordPressの場合はその3つしか必要ないです。

### 停止

```
docker-compose down
docker-compose rm -f (これも重要です、デビルボックスの説明書によると)
```

### 再起動

```
docker-compose down
docker-compose rm -f
docker-compose up httpd php mysql
```

## デビルボックスの使い方

### WordPressをインストール

ここからは説明なしでなにをやったほうがいいか伝えたいと思います、今までもあんまりせつめいしてませんけどね（笑）。

1. `/etc/hosts`を編集する、あとで`http://hello.loc`を使えるようになります。

    ```
    127.0.0.1 hello.loc
    ```

2. フォルダーを創る。

    ```
    mkdir -p data/www/hello
    ```

3. [WordPressのダウンロードして](https://ja.wordpress.org/download/)、`data/www/hello/htdocs`のフォルダーに入れてください。http://hello.loc を開いたら、WordPressの最初の画面見れれば成功しました。

### WordPressの設定

WordPressのデーターベースを作る必要があります。

```
cd devilbox
./setup.sh
(デビルボックスの中から)
mysql -u root -h 127.0.0.1 -p -e 'CREATE DATABASE hello;'
(パスワードはないです、エンターキーを押してください)
```

次はWordPressの設定。

1. http://hello.loc を開いてください。
2. 普通にセットアップ進んでください。
3. データーベースの設定のところまでにたどり着ければ：
    - データーベースの名前はさっき創ったです、`hello`
    - ユーザーネームは`root`
    - パスワードはないです
    - データーベースホストは`127.0.0.1`で

おめでとうございます、上手く行った場合あなたはローカルWordPressサイトのセットアップが無事に完了しました。

ここからは普通のアドミンユーザーのセットアップに入ります。

## 英語読める方は

ぜひできれば英語で読んでください、僕は本当にこの記事で基本的な翻訳しかやってないんで。

- https://devilbox.readthedocs.io/en/latest/getting-started/install-the-devilbox.html
- https://devilbox.readthedocs.io/en/latest/getting-started/start-the-devilbox.html
- https://devilbox.readthedocs.io/en/latest/getting-started/devilbox-intranet.html （あらゆる機能の基本的な説明書）
- https://devilbox.readthedocs.io/en/latest/getting-started/directory-overview.html
- https://devilbox.readthedocs.io/en/latest/getting-started/create-your-first-project.html
While文

## while文
繰り返し処理にはfor以外にwhile文がある。
while文を用いると、`「ある条件に当てはまる間、処理を繰り返す」`といったことが可能になります。
記述は`while 条件式:`と書き、条件式の結果がTrueの間、while文内の処理を繰り返します。

```py:例
x = 1
while x <= 10:
    print(x)
    x += 1
```

```text:出力結果
1
2
3
︙
9
10
↓↓↓↓↓↓↓ あなたの記事の内容
```
───────
```

↑↑↑↑↑↑↑ 編集リクエストの内容
と記述することで、1~10までの数字が出力されます。
流れとしてはまず、while文の前に変数を定義します。この変数をwhile文の条件式で用いて、処理を繰り返すかどうか判断します。
↓↓↓↓↓↓↓ あなたの記事の内容
例ではwhile文内の処理が1周終わると、その度に変数xに1が足されていき、再び条件式「`x<=10`」で`True`かどうか判断されます。
条件式で`True`と判断されると、もう一度処理が行われます。
これを繰り返し、条件式「`x<=10`」が`False`と判断された時、繰り返しを終了します。

**※ここでwhile文の記述において注意しなければいけないことがあります**

───────
例ではwhile文内の処理が1周終わると、その度に変数xに1が足されていき、再び条件式「`x <= 10`」で`True`かどうか判断されます。
条件式で`True`と判断されると、もう一度処理が行われます。
これを繰り返し、条件式「`x <= 10`」が`False`と判断された時、繰り返しを終了します。
**※ここでwhile文の記述において注意しなければいけないことがあります**
↑↑↑↑↑↑↑ 編集リクエストの内容
無限ループ①：変数の更新をしていない

↓↓↓↓↓↓↓ あなたの記事の内容
```py:例
x = 1
while x <= 10:
   print(x)
 # x += 1 を記述していない場合
```

```text:出力結果
───────
```py:例
x = 1
while x <= 10:
    print(x)
    #「x += 1」 を記述していない場合
```

```text:出力結果
↑↑↑↑↑↑↑ 編集リクエストの内容
1
1
1
︙
↓↓↓↓↓↓↓ あなたの記事の内容
```
上記のように、while文の処理の最後に変数の値を更新し忘れると、条件式が常に`True`となってしまうため、繰り返し処理が無限に行われてしまいます。
───────
```

上記のように、while文の処理の最後に変数の値を更新し忘れると、条件式が常にTrueとなってしまうため、繰り返し処理が無限に行われてしまいます。

↑↑↑↑↑↑↑ 編集リクエストの内容
***

無限ループ②：インデントを忘れている

↓↓↓↓↓↓↓ あなたの記事の内容
```text:例
x = 1
while x <= 10:
    print(x)
x += 1   ← インデントを忘れている場合
```

```text:出力結果
───────

```text:例
x = 1
while x <= 10:
    print(x)
x += 1  ← インデントを忘れている場合
```

```text:出力結果
↑↑↑↑↑↑↑ 編集リクエストの内容
1
1
1
︙
↓↓↓↓↓↓↓ あなたの記事の内容
```
───────
```

↑↑↑↑↑↑↑ 編集リクエストの内容
上記の様に記述してしまうと、同様に無限に処理が行われてしまいます。
原因は、変数の値を更新する処理を記述する際にインデントを忘れてしまうと、while文の外と見なされてしまうためです。
よって、`print(x)`の処理が行われた後、「`x += 1`」が行われずに、再び条件式が判断され常に`True`となってしまうため、無限にwhile文内の処理が行われます。

※無限ループの状態はコンピュータに異常な負荷をかけることになるので、注意する必要があります。繰り返し処理では必ずどこかで条件式が`False`になるように実装するようにする。
Windowsでマイクが使えない時の対処法

#はじめに
まずwindowsがマイクを認識しているかを確認します
・設定を開く
・システムのマイクを開く
・しゃべってみる

このときゲージが動けば認識しています。認識していれば、対処法その1に。
認識していなければ対処法その2に行きます。



#1.対処法その1
マイクの音が入力されいていないことが原因と考えられるので、以下の手順を実施します。
・コントロールパネルを開く
・ハードウェアとサウンドを開く
・サウンドを開く
・マイクのプロパティを開く
・レベルのマイクの所を50(50~100)にしてみる

こうすることで私は治りました。設定が終わったら既定値に設定をすると今後はこういうことがなくなると思います。

#2.対処法その2
以下のような原因が考えられます。
・マイクが物理的に正しく接続されていない
・アプリまたはwebサイトがマイクの接続を拒否している
・マイクが壊れている

マイクの接続を拒否している場合は設定のアプリのアクセス許可からマイクの接続を許可しましよう。

それ以外はシステム的なことではないので、自分自身で何とかしてみましょう!
iPhoneの消えた動画を復元できる方法

質問：iPhoneを使っています。動画がいきなりすべて消えていました。どうすれば元に戻せますか？なぜ消えたのでしょうか？

「どうすれば復元できますか？」という質問がよくあります。でも、iTunes＆iCloudは全てのデータを復元しか出来なく、既存のデータも上書きされます。では、ビデオだけを復元する方法がありますか？
ここでは、iMyFone D-Backをおススメします。iMyFone D-BackはiOSデバイス向けの復元ソフトで、iPhoneのビデオをリカバリーできます。
また、このソフトは以下の利点があります：
１、バックアップなしでも復元できる。
２、復活したいビデオがプレビュー＆自由に選択できる。
３、iPhoneに既存のデータが置き換えられない。

iMyFone D-Backは無料お試し版も提供されており、無料版（復元不可）で復元したいデータのスキャン結果をプレビューする機能がついています。
使い方もシンプルで分かりやすく、まずは無料版をダウンロードして使ってみると良いかと思います。実はビデオだけでなく、連絡先、写真、メッセージなども復元できます。
こんな便利なソフト、今すぐダウンロードして体験しましょう。
ダウンロード先：https://jp.imyfone.com/iphone-data-recovery/
Xplenty ショートカットキー

Xplentyではボタンだけでなく、ショートカットキーを使用して操作可能です。
今回のブログでは、Xplentyを操作する上で便利なショートカットキーについて紹介します。

#メニュー画面遷移

|キー入力|説明|
|: |: |
|g+i|コネクション接続画面|
|g+p|パッケージ画面|
|g+j|ジョブ画面|
|g+c|クラスター画面|
|g+s|スケジュール画面|

#パッケージ編集画面
|キー入力|説明|
|: |: |
|⌘+s|保存|
|z|全てのコンポーネントを選択|
|⌘+f|コンポーネントの位置を自動で調整|
|⌘+z|１つ前に戻る|
|⌘+シフト+z|１つ先に進む|
ラズパイのプロセス監視を slee-Pi3 のウォッチドッグタイマで【正常動作検知による監視編】

今回は slee-Pi3 のウォッチドッグタイマを利用したプロセス監視を行います。
※作業環境と事前準備は [こちら](https://qiita.com/kiyonaga/private/d86428c8f2ccbd18cd98#%E7%92%B0%E5%A2%83) をご覧ください。

# [関連ブログ]
slee-Pi3のウォッチドッグタイマを利用したプロセス監視
【[OOM 状態からの即時復帰](https://qiita.com/kiyonaga/items/d86428c8f2ccbd18cd98)】
【正常動作検知による監視】←　本ブログ
【[異常動作検知による監視](https://qiita.com/kiyonaga/items/56f405a8e226e2b4b0f7)】
【[異常動作検知－実装編](https://qiita.com/kiyonaga/items/38b362c4a192c5f13303)】

# [目的と方法]
目的：停止したくないプログラムを実装したい
方法：slee-Pi3 のウォッチドッグタイマがハートビート信号を監視する仕組みを利用
プログラム内にハートビートを組込む
※slee-Pi3 の LED1 を点滅させるとウォッチドッグタイマがハートビートとして認識します。
詳細は [sleepi3-heartbeat.service](https://github.com/mechatrax/sleepi3-utils/blob/master/sleepi3-heartbeat.service) , [heartbeat.py](https://github.com/mechatrax/sleepi3-utils/blob/master/heartbeat.py) をご覧ください。

# [手順1]プログラム起動用の service ファイル作成
作成したサービスファイルは /etc/systemd/system/ 以下に配置します。
```/etc/systemd/system/test-heartbeat.service
[Unit]
Description=sleepi3 test heartbeat
DefaultDependecies=no　
After=sysinit.target

[Service]
Type=simple
ExecStart=/opt/mtx/test-heartbeat.sh　←　実行ファイルのフルパス

[Install]
WantedBy=sysinit.target
```

# [手順2]プログラム＋ハートビート作成
素数計算中にハートビートを組込みます。
また、素数と計算中の数値は各々別ファイルに保存して、再起動しても途中から計算を開始します。
点滅が早すぎるとハートビートとして認識されないので、LED 消灯後に sleep を入れています。
```/opt/mtx/test-heartbeat.sh
#!/bin/bash

#素数保存ファイル
LOG=/tmp/prime-num.log

#LED OFF
echo "0" > /sys/class/leds/sleepi\:led0/brightness

#数値保存ファイルの有無確認と計算が止まった時点の数値代入
if [ -f $LOG ]; then
    num=`tail -1 /tmp/save-num.log`
    echo "num="$num
else
    num=3
fi

#保存ファイルの喪失やエラーのときは最初から
if [ $((num%2)) -eq 0 ]; then
    num=3
fi

for((i=num;;i+=2)); do
    #計算中の数値保存
    echo $i | tee -a /tmp/save-num.log
    #LED ON
    echo "255" > /sys/class/leds/sleepi\:led0/brightness
    k=0
    r=`echo "sqrt($i)" | bc`
    for((j=3;j<=r;j+=2)); do
        l=$((i%j))
        if [ $l -eq 0 ]; then
            k=1
            break
        fi
    done
    if [ $k -eq 0 ]; then
        echo -n $i', ' | tee -a /tmp/prime-num.log
    fi
    #LED OFF
    echo "0" > /sys/class/leds/sleepi\:led0/brightness
    sleep 1
done
```
※今回はお試し用なので素数の"2"は既に計算できているものとして考えます。
※素数計算は [こちら](https://tsg.ne.jp/TT/tsg/c/mansaku/P01.html) を参考にしました。

# [手順3]既存の sleepi3-heartbeat.service を停止し、自作 service を起動
sleepi3-heartbeat.service は [sleepi3-utils](https://github.com/mechatrax/sleepi3-utils) に含まれています。
以下コマンドを上から順に実行してください。
test-heartbeat.service の部分は実際に作成したサービスファイル名を入れてください。
```bash
sudo systemctl disable sleepi3-heartbeat.service
sudo systemctl enable test-heartbeat.service
sudo systemctl restart test-heartbeat.service
```

# [手順4]ラズベリーパイを再起動して自作 service が正常に動作するか確認
以下の項目に異常がなければウォッチドッグタイマの正常動作検知によるプロセス監視が実現できています。
① 以下コマンドで service が稼働（active）状態どうか
```bash
systemctl status test-heartbeat.service
```
② slee-Pi3 の LED1 が点滅しているか
③ ウォッチドッグタイマによる再起動が行われないか
　※slee-Pi3 セットアップ時のウォッチドッグタイマ監視時間は60秒です。

# [まとめ]
今回は slee-Pi3 のウォッチドッグタイマによるプロセス監視機能を利用しました。
停止させたくないプログラムにハートビートを組込むだけで簡単に実装できます。
さらに処理の途中経過を保存できれば再起動した場合も復帰が容易です。
IBM Cloud: ibmcloudコマンドでAPI Keyを使ってログインする方法

# 1. はじめに
ibmcloudコマンドを使ってログインするには、`ibmcloud login`とか`ibmcloud login -sso`を使えばいいのだが、毎回ID/Passwordを入力して認証するのが面倒である。
API Keyを使えばこうした手間を省けることが意外に知られていないので、念の為紹介しておく。

なお、IBM Cloud CLIをVPCにインターネットアクセスなしに導入する方法は[こちら](https://qiita.com/testnin2/items/cbde2076d5dd1f60bcbc)を参照して下さい。


# 2. API Keyの取得
IBM Cloudの管理コンソールから、`Manage -> Access(IAM) -> API Keys`とたどり、API Keyを生成する。

- `Create an IBM Cloud API Key`を押下 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/0224012b-5515-9137-157d-16b9703ec382.png)
- API Keyに対する適当なNameやDescriptionを入力。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/c9af36a4-e550-5912-12d2-0881fecc3620.png)
- API Keyが生成されるので、これをコピーしてファイルに保管しておく（今回は`ibmcloud_apikey`とする)。なお、紛失した場合は二度とアクセスできないため、再作成になる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/ac901969-44ee-615e-257c-6323ab78e38f.png)



# 3. API Keyを使ったログイン

以下に幾つかの例を記載する。

## 3-1. API Keyのみを指定した場合 
```shell:
$ ibmcloud login --apikey @ibmcloud_apikey
```

## 3-2. API Endpointやリージョンを指定した場合
```shell:
$ ibmcloud login -a cloud.ibm.com --apikey @ibmcloud_apikey -r jp-tok
```

## 3-3. API Endpoint(Private)を指定した場合

- CLIの最新バージョンをチェックしに行くのを無効にする。無効にしておかないと、cloud.ibm.comへのアクセスも試行される。詳細は、https://qiita.com/testnin2/items/2c89c13ad90640f0df91 も参考のこと。
- private endpoint(CSE経由)やprivate endpoint(VPE)は現在us-south(Dallas)やus-east(WDC)でしか利用できないが、後述の通りTrasit Gateway/DAL or WDCのProxy/VPEを併用することで回避することも可能

```shell:
$ ibmcloud config --check-version=false
$ ibmcloud login -a private.cloud.ibm.com --apikey @ibmcloud_apikey -r us-south
```

## 3-4. proxyを指定してPublic経由でアクセスする場合
```shell:
$ export https_proxy=http://10.0.0.4:3128
$ ibmcloud login -a cloud.ibm.com --apikey @ibmcloud_apikey -r jp-tok
```

## 3-5. proxy+VPE+Private経由でアクセスする場合
[IBM Cloud: 東京/大阪リージョンのprivate onlyの環境からインターネットに出ることなくCLIを実行する方法](https://qiita.com/testnin2/items/bacff96b337271de92b2)を参照

```shell:
$ export https_proxy=http://192.168.0.19:3128
$ ibmcloud login -a private.cloud.ibm.com --vpc --apikey @ibmcloud_apikey -r jp-tok
```

# 4. 参考

- [IBM Cloud: ibmcloudコマンド（CLI）によるプライベートエンドポイントアクセスについての注意点](https://qiita.com/testnin2/items/2c89c13ad90640f0df91)
- [IBM Cloud CLI を使ってプライベートエンドポイント経由でログインする](https://qiita.com/khayama/items/b574a97a85cc7858bce2)
- [IBM Cloud: ibmcloud CLIがproxy経由で利用できることを確認してみた](https://qiita.com/testnin2/items/7d05acd6ab6d36fc91a0)
Herokuのセットアップ

### Herokuのユーザー登録をする

https://signup.heroku.com/

### CLIのインストール

```shell
brew install heroku
```

### Herokuにログインする

```shell
heroku login
```

### HerokuにSSHキーを追加する

```shell
heroku keys:add
```

### Herokuにアプリケーションを作成する

```shell
heroku create
```

.git/configにheorkuの設定が追加される

```config:.git/config
:
[remote "heroku"]
        url = https://git.heroku.com/<アプリケーションID>.git
        fetch = +refs/heads/*:refs/remotes/heroku/*
```

### Herokuにデプロイする

```shell
git push heroku main
```

### 確認

```shell
heroku open
```
Db2 on CloudのDB接続情報取得

`「Db2 on Cloudを使ってみる」シリーズ`

JDBC接続の際に必要となるDb2 on CloudのDB接続情報取得方法のメモです。

接続情報(ホスト名、ポート番号、データベース名、userid,password)と必要な場合はSSL証明書ファイルをIBM Cloud Db2 Web consoleから取得する方法を説明します。

2023年7月26日現在の情報です（GUIは随時コロコロ変わるので注意してください）

[接続情報から取得](#接続情報から取得userid-passwordはユーザー管理で作成した物を使用)する方法と[IBM Cloudコンソールから資格情報を作成・参照](#ibm-cloudコンソールから資格情報を作成参照liteプランの場合はこれのみ)する方法があります。

# 接続情報から取得(userid, passwordはユーザー管理で作成した物を使用)
Db2 web consoleの接続情報から取得する方法です。userid, passwordはDb2 Webコンソールのユーザー管理で作成した物(もちろん自分のuserid, passwordでOK)を使用します。

Standardプランと(たぶん)Enterpriseプランで可能な方法です。

Liteプランの場合は [IBM Cloudコンソールから資格情報を作成・参照](#ibm-cloudコンソールから資格情報を作成参照liteプランの場合はこれのみ)の方を参照してください。

## 1. Db2 Webコンソールを開いて、左側のメニューから歯車のアイコン、「管理」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c3fb0efa-7138-9a6d-29be-818d4a502e89.png)

## 2. 上部メニューから接続をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b828eb10-7795-c0a0-b8f4-cdda52e13160.png)

## 3. 「アプリとクライアントを IBM Db2 on Cloud に接続」画面の「接続構成リソース」　にある以下の値をテキストファイルなどにコピーする
 - ホスト名
 - ポート番号
 - データベース名

## 4. (必要な場合)SSL証明書をダウンロードする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b757956c-2579-4154-ddf1-bdd76b2ef7cc.png)

## 5. userid と password
db2に接続するuseridとpasswordは自分のもの、あるいはDb2 Webコンソールの`ユーザーの管理`で作成したものが使用できます。passwordは表示されませんので、忘れた場合はアクションの編集アイコンをクリックして変更してください。
尚管理者ユーザー以外の新たに作成した一般ユーザーはそのIDに権限のGRANTが必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/46f26485-1915-9141-16ce-88106b95a1eb.png)



# IBM Cloudコンソールから資格情報を作成・参照(Liteプランの場合はこれのみ)
## 1.　IBM Cloudのダッシュボードの右上のメニューから「リソース・リスト」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/f75825b6-3306-bbb0-6ad9-973bb3315b0b.png)


## 2. 「データベース」をクリックして開き、接続したいDb2の名前をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/43304de9-0ea1-a45e-fa14-e79eae5d64fc.png)



## 3.「サービス資格情報」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/ffb148ba-8a4f-1b1a-13e9-cb425c7e114c.png)


## 4. 資格情報がない場合は、「新規資格情報」をクリックして作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/dd09a142-430f-5c36-9ed5-13605242b681.png)
名前を変更したい場合は変更して、「追加」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c9ca4dae-3f43-e760-1121-5704880cf335.png)

## 5.表示されたサービス資格情報をクリックして、内容を表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/e743b16d-6580-f805-edb0-ad55707828a4.png)

## 6. usernameとpasswordの値を取得
これが接続時に使用するuseridとpasswordになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/70c5f5a6-2a4d-3b74-931c-ecb3735bd182.png)


## 7. hostname, port, databaseの値を取得
これが接続時に使用するホスト名, ポート番号, データベース名になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/545ae1f5-c6a7-4953-e1b1-35d692c1a7b5.png)
　

## 8. SSL証明書が必要な場合はダウンロード
Db2 Webコンソールからダウンロードします。[接続情報から取得](#接続情報から取得userid-passwordはユーザー管理で作成した物を使用)の**4**を参照してダウンロードしてください。



以上です。

2021年8月22日：　LiteプランGUI変更につき更新しました。
laradockでプロジェクト作成まで（自分用備忘録）

自分用のものになります、各人がこのやり方でうまくいくかはわかりませんのであしからず。

まずはディレクトリ作成と移動。 

```:terminal
$ mkdir sample_app
$ cd sample_app
```
<br>
sample_app内でlaradockディレクトリ生成。

```:terminal 
$ git clone https://github.com/LaraDock/laradock.git
```
<br>


laradockへ移動。

```:terminal
$ cd laradock
```
<br>
.env_exsampleファイルのコピーをする。

```:terminal
$ cp env-example .env
```

<br>
laradock内でcompose-upし、初期化。

```:terminal
$ docker-compose up -d nginx mysql workspace phpmyadmin
```

<br>
「workspase」コンテナ内部でlaravelのインストール、新規作成。/var/wwwディレクトリでマイグレーション等artisan commandを実行する。ログアウトは$exit

```:terminal
$ docker-compose exec --user=laradock workspace /bin/bash
```

<br>

laradock側の.envファイルを編集。

```:.env(laradock)
#APP_CODE_PATH_HOST=../         # 変更箇所
APP_CODE_PATH_HOST=../sample_app/ # こんな感じで変更
```
<br>

このように変更しないと自分の場合mysqlのstateがEXIT1となる。

```:.env(laradock)
#DATA_PATH_HOST=~/.laradock/data #変更箇所
DATA_PATH_HOST=.laradock/data　#このように変更
```

<br>

mysqlも同様に。5.7が望ましい(エラーが出るらしい)。

```:.env(laradock)
# MYSQL_VERSION=latest # 変更前（latest）
MYSQL_VERSION=5.7      # 変更後（5.7）
MYSQL_DATABASE=sample_app #こんな感じに変更。
```

<br>

編集後、コンテナを再起動するため、一旦コンテナを停止。

```:terminal
 $ docker-compose stop
```

<br>

再起動します。

```:terminal
  $ docker-compose up -d nginx mysql
```

localhost にアクセス。いつもの画面が出ていてばOK。お疲れ様でした。　

<br>
※ここからは自分の処理方法。
その後作成したプロジェクト内の.envファイルをいじる。人によって違うのでそこは任意で。

```:terminal
#DB_CONNECTION=mysql
#DB_HOST=127.0.0.1　#変更
#DB_PORT=3306
#DB_DATABASE=laravel　#変更
#DB_USERNAME=root
#DB_PASSWORD=root

DB_CONNECTION=mysql
DB_HOST=mysql #これは必須
DB_PORT=3306
DB_DATABASE=任意のもの
DB_USERNAME=root
DB_PASSWORD=root
```

頑張ろう。