OmniAICreator/Qiita-1.07M huggingface dataset:
Google Coral Dev BoardでYocto生成ディストリビューションを実行する

これは、Edge TPU Moduleと呼ばれるLinuxベースのSystem-on-Moduleであり、追加の周辺機器を含む開発ボードにマウントされています。 EDGE TPモジュールの主なハードウェア機能：
- 統合GPUを備えたi.MX8MQ SoC
- 1 GB LPDDR4
- 8 GBのeMMC
- Google Edge TPUコプロセッサー（MLモデルの高速化に使用）
- WiFi /Bluetooth
![微信截图_20190710150259.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/306bc8a6-c1b4-fc8f-ba31-c2d307ef00a9.png)

- 海外代理店購入可能：https://store.gravitylink.com/global

Coral Dev BoardはEdge TPU Moduleの評価用ボードとして機能しますが、Rasbperry Pi 3ボードと同様のシングルボードコンピュータとしても使用できます。 Coral Dev Boardには、Debian派生物であるMendel OSと呼ばれるLinuxディストリビューションが付属しています。 ボードは実際には事前にプログラムされたメンデルOSを含んでいなかった、そして私は始めるためにボードをフラッシュしなければならなかった。 しかし、事前に構築されたOSイメージと、十分に文書化された手順でボードをフラッシュする方法が提供されているので、これは比較的簡単です。

私はYocto / OE-coreを使ったLinuxディストリビューションの構築に時間をかけていますし、組み込みLinuxデバイス上でのLinuxディストリビューションは私にとって興味があるので、メンデルOSが何であるかをもっと深く掘り下げる必要がありました。

上で概説した文書に従うことによって、私はさらなる検査のためにすべてのコンポーネントのソースコードを取得することができました。 メンデルOSがi.MX8 SoC用のNXP i.MX BSPから来るかなり標準的なコンポーネント上に構築されていることを私がより近くで見始めてすぐに気が付いたとき本当の驚きはそこにありませんでした。 この情報を使って、私はこれを移植するのがかなり簡単であることに気づきました、そして私はCoral Dev Boardで起動する何かを構築することができるようにYocto BSPレイヤを作成することに着手しました。 起動するためには、このレイヤーに3つのものを実装するだけで済みました。
- Uブートフォークの作り方
- Linuxカーネルフォークの作り方
- boot.scrを展開するためのレシピ、およびMendel OSからコピーしたスクリプトのソースを作成しました

Yoctoを使ってイメージを構築するには、次の手順に従います。環境を保存するディレクトリを作成し、シェルをその場所に変更します。

```
mkdir coral && cd coral
```
レポマニフェストを初期化します:

```
repo init -u https://github.com/Freescale/fsl-community-bsp-platform -b warrior
```
マニフェストでレイヤーを取得する：

```
repo sync
```

クローン`meta-coral`:

```
git clone https://github.com/mirzak/meta-coral.git sources/meta-coral -b warrior
```
環境を設定します:

```
MACHINE=coral-dev DISTRO=fslc-wayland source ./setup-environment build
```

 `meta-coral`を`bblayers.conf`に追加します:

```
echo 'BBLAYERS += "${BSPDIR}/sources/meta-coral"' >> conf/bblayers.conf
```
ベーキングを開始します:

```
bitbake core-image-base
```

ビルドが完了したら、WICイメージが作成されているはずですビルドが完了したら、WICイメージが作成されているはずです:
- `tmp/deploy/images/coral-dev/core-image-base-coral-dev.wic.gz`

これは、起動システムを取得するためにeMMCまたはSDカードに書き込むことができるイメージです。 簡単にするために、Coral Dev BoardのブートモードをデフォルトのeMMCではなくSDカードからブートするように変更し、これを行うためにブートスイッチを次のように調整しました。

![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/e7617c80-0672-6609-25fc-12b834fbef71.png)


これが「SDカードモード」の起動スイッチの写真です:
![1-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/07efdfe2-d523-0c00-9ac8-4d053f34c52f.jpeg)


既に画像を作成しているので、SDカードに書き込むことができます:

```
zcat tmp/deploy/images/coral-dev/core-image-base-coral-dev.wic.gz | sudo dd of=<device> bs=4M
```

SDカードを挿入してシステムを起動します。これでYoctoビルドディストリビューションのログインプロンプトが表示されます:

```
FSLC Wayland 2.7 coral-dev ttymxc0
 
coral-dev login
```

さまざまな周辺機器のテストはまだ終わっていませんが、Mendel OSと同じLinuxカーネルを使用しているので基本的なコンポーネント（HDMI、Ethernet、USB）は動作するはずです。 ユーザースペースのコンポーネントに依存しているので、もう少し作業が必要なことがいくつかありますが、これは非常に短いリストです。

- WiFiとBluetooth（正しいファームウェアファイルをインストールする必要があります）
- Google Edge TPUコプロセッサ（Yoctoで実行されているMendel OSからMLデモを入手するのは楽しいでしょう）

Google Coral DevのYocto / OE-core BSPレイヤーのソースコードは、こちらにあります:
- https://github.com/mirzak/meta-coral


テストに満足していて、参加することに興味がある場合は気軽に連絡を取ってください。(作者：mirzak）
JavaScriptで改行付き文字列の先頭行だけ削除する

# 先頭行に謎の文字列の入ったCSVファイルに出会った

以下のようなCSVファイルに出会いました。（実際の業務データではありません）

```csv
hogehoge
name,value,count
りんご,100,2
バナナ,150,4
```

先頭行に、CSV形式ではない余計な文字列があって、それを削除してからCSV解析処理をしたいというシーンです。
改行は `LF` という前提です。

# 改行付き文字列の先頭行だけを消したい。

意外と記事が見当たらなかったので、忘れない内に書きます。

`indexOf` と `substr` の組み合わせでできました。

```javascript
// 改行付き文字列を定義（実際にはファイル読み込み）
const inputString = `hogehoge
name,value,count
りんご,100,2
バナナ,150,4`;

// 何文字目に最初の改行があるか？
const firstRowEndPos = inputString.indexOf('\n', 0);

// 最初の改行の次の位置から文字列を抽出
const outputString = inputString.substr(firstRowEndPos + 1);

// 表示
console.log(outputString);
```

# さいごに
そこそこ簡単にできました。
 `CR` も考慮すると、もっと複雑になるかもしれませんね。
MIPS 4Kのwaitインストラクション

MIPS 4KにはwaitというCPUをsleepさせて省電力を実現するインストラクションがあります。通常のLinuxやFreeBSDではカーネルモードでは使うことなくて、ユーザモードでは使えないインストラクションなはずです。勝手にユーザにCPU止められたら困りますよね。

試しにadm5120で測ってみました。

|状態|mA|
|:--|:--|
|通常|504|
|wait|420|

adm5120はSwitchなども入っているので、あまり小さくならないのかもしれませんが、ある程度の効果はあるようです。

waitから次の実行に移すには割り込みを上げる必要があります。割込みが上がりハンドラが呼び出された後にwaitの次のインストラクションが実行されます。

![mips_wait.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/31b211f2-a395-7d52-bd25-caaed68697aa.png)

mruby on YABMではTimerとEthernetの受信割り込みを使っています。Timerは10msでEthernetは随時上がります。

waitを使うためにはEthernetの受信割り込みを止める、またはパケットが入ってこない設定にする、Timerを指定した時間、または長めに指定するなどにする必要があります。

MIPSは1本のTimerで時間も管理しているので、結構厄介です。

ちょっと複雑になるのと効果が薄そうなので、とりあえず実装しないつもりです。

この手の省電力はOSがある場合は使うのが非常に難しいですが、BearMetalの場合には考えれば使いようがあるような気もします。
PowerApps コンポーネントフレームワーク : 目次

PowerApps コンポーネントフレームワークを使うと、PowerApps や Dynamics 365 Customer　Engagement に対してカスタムコントロールを開発することができます。いくつか記事を書くため、目次を用意しました。

# PCF の基本
[概要とツールのインストール](https://qiita.com/kenakamu/items/ed06d93825e51607f6d5)
[スライダーコントロールの開発](https://qiita.com/kenakamu/items/13eae0bc1eb83ce671d5)
[開発したコントロールのパッケージ化と展開](https://qiita.com/kenakamu/items/5e3825900c80c5accc07)
[スライダーコントロールの改修と再展開](https://qiita.com/kenakamu/items/454d6d165db95458b17c)

# サンプルから学ぶ PCF

[データセットサンプル](https://qiita.com/kenakamu/items/ef1b0e9250817ac6e814)
[ローカライゼーション API サンプル](https://qiita.com/kenakamu/items/564315b9ab9134cc5bf0)
[ステート API サンプル](https://qiita.com/kenakamu/items/489d8c9dafbcc18829e0)
[画像アップロードサンプル](https://qiita.com/kenakamu/items/ba99090d501bf815a7bf)
[Web API サンプル](https://qiita.com/kenakamu/items/5915a701cfc187268fe2)
[Client API サンプル](https://qiita.com/kenakamu/items/ff58a7d0bca9f0e5e8ce)
[IFRAME サンプル](https://qiita.com/kenakamu/items/e9bdde2e3ac5fb80b1f7)

# その他
[CSS を使った画面全体の上書き](https://qiita.com/kenakamu/items/56abc0508acc5c57eec3)
VSCode Remote Development + SSHトンネルで安全なWebアプリケーション開発

> 2020年11月6日追記
> 最近のバージョンのVSCodeでは、内蔵のターミナルでTCPを待ち受けするサービスを起動すると自動でポートフォワードされるようになってますね。なのでこの記事は古い内容になりました。いったいどこまで便利になるんだ！



# リモート開発でシンクライアント化

VSCodeのRemote Developmentがもう便利すぎです。自分のようなGUI依存のプログラマーには天の恵みです。

これまでMacbook Proほぼ単独で開発を行ってきましたが、Remote Developmentがあれば格安VPSやEC2インスタンス、社内のPCサーバーでリモート開発中心にシフトするのもいいなと思い始めています。

1. クライアントマシンが非力でもよい
2. バッテリーが長持ちしそう

バッテリーの浪費は他に原因がありそうですが…

# `.ssh/config` で開発用Webサーバーのポートフォワード

Webアプリケーションのリモート開発で問題となるのがブラウザでの動作確認です。
通常、`3000`や`8080`などのポートで開発用Webサーバーを起動させますが、そのポートを開放するわけにはいきません。

「簡単にSSHトンネルを掘る拡張機能でもないかなー」と探したのですが、よく考えたら`.ssh/config`で済むことに気づきました。

`LocalForward`に、クライアントマシンのポートと、そこに転送するリモートマシンのポートを指定します。
データベースのポートも転送しておくと、手元のGUIツールが使えて便利です。

```config
Host dev
  Hostname 開発VPSのホスト
  User ユーザ名
  LocalForward 3000 localhost:3000
  # LocalForward 3306 localhost:3306 # MySQL
```

# 試してみる

フレームワークやWebサーバーは何でもいいんですが、今回は`express`で試します。
Remote Developmentで起動したターミナルで次のコマンドを実行し、ポート`3000`でリクエストを待ち受ける開発用Webサーバーをリモート上で起動します。

```sh
npm i -g express-generator
express express-sample
cd express-sample
npm i
DEBUG=express-sample:* npm start
```

`.ssh/config`の`LocalForward`で、リモートのポート`3000`をクライアントのポート`3000`に転送しているので、クライアント上のブラウザから`http://localhost:3000`を開けば応答するはずです。

<img width="1114" alt="Express_と_Untitled-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/4b3dde83-ccbf-63fc-8412-bb562ba829f8.png">

期待どおりできました！

クライアントのネットワーク疎通と連携してstart/stopするEC2インスタンスとか、スケーラブルで費用もお得でいいかもですね。
RemoteDevelopmentによるシンクライアント + リモート開発、なかなか想像が膨らみます。
Salesforce イベントメモ

**随時更新**
---

#グループ一覧
https://www.trailblazers.jp/groups/

#イベント参加予定（グループ別）
##[Tokyo Salesforce Developer Group](https://www.trailblazers.jp/group/salesforce_dg_tokyo_dg)
###2019/8/23
- [[Tokyo] Salesforce Developers Meetup #21](https://www.trailblazers.jp/group/salesforce_dg_tokyo_dg)

##[Service Cloud Trailblazers](https://www.trailblazers.jp/group/servicecloud_ad)
###2019/8/05
- [Service Cloud Trailblazers Meetup #10](https://www.trailblazers.jp/event/service-cloud-trailblazers-meetup-10/)


##[Salesforce Architect Group](https://www.trailblazers.jp/group/archjapan_arch)
###2019/8/01
- [Salesforce Architects Meetup Tokyo#02](https://www.trailblazers.jp/event/archjapan-tokyo-02/)
JavaのProcessBuilderからPsTools(Psexec)を実行したら返ってこなかった。

#**はじめに**
Qiitaに初投稿。
少し前にいじった時の情報ですが、確認したら結果が変わらなかったので備忘録としてメモしておこうかと思います。
現在、作成していた環境が丸々消失したのでコードなどもあまり書けてないのはすみません。

###何の話か
Javaから外部のexeやスクリプトなどを実行する「ProcessBuilder」クラスを用いて、
Microsoftから公開されている「PsTools」を直接実行したらなんか処理が返ってこなかった。

**PsToolsについては以下参照**
[PsTools - TechNet - Microsoft](https://technet.microsoft.com/ja-jp/sysinternals/pstools.aspx)

#使用言語・環境
Java 8
Eclipse4.4 Luna
Apache Tomcat8.5
Windows10

#経緯
とあるJavaプロジェクトを検証環境に配置して実行できる状態にするまで自動化したくて作成。
リモート環境にJavaプログラムのzipファイルをコピーする処理の実装に利用。

#処理方法と結果
**ProcessBuilderインスタンスから直接実行**
共有フォルダから検証環境にzipファイルをコピーで配置の処理をEclipseから実行

`psexec \\コピー先ホスト名 -u コピー先ドメイン\コピー先ユーザー -p コピー先pass xcopy "\\共有server\Path\JavaProject1.zip" "C:\Users\コピー先ユーザー\Path\コピー先フォルダ"`

Eclipseのコンソール上に逐一情報が表示されるが、Psexecがリモート先に接続した状態で終わってしまう。
しかしファイルはコピーされていた。このままでは後続処理ができない。


**解決方法**
.batファイルにpsexecのコマンドを実行させて、Javaからはその.batファイルを呼び出す形にしたら返ってきた。

#まとめ
原因はわからないままで申し訳ないですが、ProcessBuilderではpsexecの返り値を識別できなかったっぽいです。
なので.batに記載してその中で返り値含めて記述することで解決しました。
Pyinstaller メモ

# Pyinstallerめも
基本的な使い方と容量を抑えるやり方…
忘れないうちにメモしておく。

## そもそもPyinstallerって何よ？
Pythonってスクリプト言語やん。基本的には環境が無いと実行できないわけ。おまけになんやかんやインポートしてるから、実行環境があってもいちいちパッケージをインストールしなくちゃいけないの。

や、別にわざとじゃ無いんだよ？そういうものなんだよ？だから怒んなって、そいつらをひとまとめにして実行できるいい方法教えてやるから。。ﾔｯﾀｰ

ってのがPyinstallerの大雑把な仕様。

## 使用例
・導入方法例
`pip install pyinstaller`

・実行例
`pyinstaller hoge.py`
ちょっと長いけどガマン

これで大抵の場合はexeファイルが生成されて、スタンドアロンに実行できるようになる。
Mac版も同様。(うまくいかない時もある)

## 応用例
でも、ファイル大杉~~大歩危阿波池田~~
そんなときは以下を試してみましょう。

・ファイルをひとまとめにする例
`pyinstaller --onefile hoge.py`

・何が取り込まれてるか調べたい例
`pyinstaller -F --onedir hoge.py`
Pyinstallerは勝手に余計なものまで入れちゃう~~クソ野郎~~賢い子なので、要らないものを見てみるときに使える。
何度もビルドしていると肥大化しまくる。知らん間にPyQt4とか入ってたり…

・以上を踏まえてカスタムビルドしたい例
`pyinstaller hoge.spec`
specファイルはプログラムのビルド方法をまとめる仕様書みたいなものです。
こいつにいろいろ書き込んで上記コマンドを実行すれば、幅を利かせてビルドすることが可能です。わーい

### specファイル？

ビルド毎にspecファイルが上書きされる。
ソースファイルでビルドするとデフォルトの状態になっちゃうので注意。

↓特に指定なしだとこんなのができる

``` hoge.spec
# -*- mode: python -*-

block_cipher = None

a = Analysis(['hoge.py'],
             pathex=['パス'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
          cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='hoge',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True,
          icon='hoge.ico')
```

datas: 画像等を埋め込む場合に使う
hiddenimports: インポートしないパッケージ

ほかにも色々あるけど、まだちょっと何言ってるかわかんない。
hooksとか理解できればもっとよさげかも

## ビルドエラー対処法

まず、何でつまづいているのか？
エラー文をよく読むことで大体は解決する。

どうやっても解決しないあるある
・特定のパッケージ内でのコードエラー
相性が悪いんで別の方法を考えましょ(投げ)
(望み薄だが、Pyinstallerのダウングレードやアップデートで直ったりするかも)


---
参考
[Pyinstallerマニュアル](https://pythonhosted.org/PyInstaller/index.html)
もっと分かりやすくまとめている方↓
[Pythonスクリプトを単一実行ファイルにする方法](https://qiita.com/hirohiro77/items/466e411fa41f144c8b2a)
わ、わかりやすい…
PHPのintの最大値を超えた場合の挙動はどうなるか？

先日、MySQLのintの最大値を超えるとどういう挙動になるかを記載しましたが、
Databaseに登録するプラグラム側はどうなんでしょう。
ということで今回は、
PHPのintの最大値を超えた場合の挙動はどうなるか？にします。

> 整数のサイズはプラットフォームに依存しますが、 約 20 億 (32 ビット符号付) が一般的な値です。 64 ビットプラットフォームでの通常の最大値は、およそ 9*10^18 (900京) になります。 しかし PHP 7 より前のバージョンにおける Windows は例外で、Windows で PHP 7 より前のバージョンを使う場合はは常に 32 ビットとなります。 PHP は符号無し整数をサポートしていません。 整数のサイズは定数 PHP_INT_SIZE で、 そして整数の最大値は定数 PHP_INT_MAX でそれぞれ決まります。 これらの定数は、PHP 5.0.5 以降で使えます。 PHP 7.0.0 以降では、整数の最小値を表す定数 PHP_INT_MIN が使えるようになりました。

参照：https://www.php.net/manual/ja/language.types.integer.php

結論からいうと
phpのintの最大値を超えるとオーバーフローして自動でfloatになる
という記載があったので本当にその挙動になるのかを確かめてみました。

## intの最大値は

32bitは約21億「2147483647」
64bitは約900京

64bitはPHP7.0.0以降になります。

## オーバーフローさせてみる

~~~
$int_test = 2147483647;
var_dump($int_test);
$int_test = 2147483648;
var_dump($int_test);
~~~
~~~
int(2147483647)
int(2147483648)
~~~

オーバーフローしない、

~~~
$int_test = 9223372036854775807;
var_dump($int_test);
$int_test = 9223372036854775808;
var_dump($int_test);
~~~
~~~
int(9223372036854775807)
float(9.2233720368548E+18)
~~~

オーバーフローしました。
ということで、

$>` php -v`

~~~
PHP 7.1.0
~~~

私の 環境はPHP7でした。

ちなみに、
オーバーフローする値をintにキャストしたらどうなるのか？

~~~
$int_test = (int)9223372036854775808;
var_dump($int_test);
~~~

~~~
int(-9223372036854775808)
~~~
結果は
`PHP_INT_MIN`のintの最小値となりました。
水田の取水バルブを定点カメラで監視し、水田の水があるかないか、給水されているか否かを機械学習で識別してみた

# はじめに

水田における水の管理が重要であることは皆さんよくご存知のことと思われますが、人が頻繁に確認するのはそれほど楽ではなく、兼業農家ではこれがさらに難しくなるという課題があるようです。
家の近くにある水田であれば何かのついでに見るということも可能ですが、少し離れたところにある水田の確認はどうしても不十分になってしまう。

上記のような相談があったことから、タイトルのとおり水田の取水バルブを定点カメラで監視し、水田の水があるかないか、給水できているか否かを遠隔地で確認できる仕組みを作りました。

遠隔監視ができるだけでも便利だと言われているのですが、せっかく画像がそろってきたので画像から状況を識別してみたいと試してみた経過を記録しておきます。

# 定点カメラの概要

## 外観

![UNADJUSTEDNONRAW_thumb_2fab.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/1a1b155c-98f8-cfae-a510-f66719876c5a.jpeg)

## 構成機器

- RaspberryPI Zero
- USBカメラ
- Soracom Air SIM
- ソーラーパネル
- バッテリー
- タイマーリレー
- さくらのVPS

## 機能

- RaspberryPIが起動したら接続されたUSBカメラの画像をSoracomの回線でVPSサーバーに送信
- 待機時の電力消費を少なくするため、タイマーリレーで1時間おきに電源を投入し、画像の送信が終わったらRaspberryPIをシャットダウン
- 日中はソーラーパネルから給電とバッテリーの充電を行い、夜間はバッテリーにより給電

# データ

## 画像

取得している画像のサイズは1280x720。

- 水田に水がある状態
![201907301307.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/0bc7bd3d-ed4d-9a18-20db-a767dda3d058.jpeg)

- 水田に水がない状態
![201907271343.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/fa87a8ab-5206-00a1-d3fe-1d2089030d98.jpeg)

- 給水している状態
![201907291339.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/d3f085f0-0f8f-1469-8a03-13d294c00d1d.jpeg)

これら３つ状態を画像から識別できるか否かを試してみました。

## 動画

参考までに、取得したデータをつなげて動画を作ってみたのであわせてご覧ください。

[![スクリーンショット 2019-10-15 6.25.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/e4fc4cf9-9885-b164-bf42-d8bbb299aae8.png)](https://youtu.be/2G_gws888xk)

## ラベル

以下のとおりラベルデータを作成。

| 状態 | 値 |
|---|---|
|水田に水がある状態|0|
|水田に水がない状態|1|
|給水している状態|2|

## データ形式

|files|status|
|---|---|
|201907011200.jpg|0|
|201907011300.jpg|0|
|201907011400.jpg|1|
|：|：|
|201907301200.jpg|1|

## 機械学習

以下のコードで学習と検証を実施。

```python:
import cv2
import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics

# ラベルデータの読込
df = pd.read_csv("dat.csv")

y = df["status"]

# 画像データの読込
X = []
i = 16

for file in df.files:
    
    img = cv2.imread(file)

    # 画像サイズが大きいので縮小
    img = cv2.resize(img, (int(1280/i), int(720/i)))
    
    X.append(img.flatten())
    
X = np.array(X)
X.shape

# 学習と検証のデータを分割
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=.1, random_state=42)

# 学習
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)

# 検証
print(model.score(X_test, y_test))
print(metrics.confusion_matrix(y_test, model.predict(X_test)))
```

実行した結果。

```
1.0
[[40  0  0]
 [ 0 14  0]
 [ 0  0  5]]
```

完璧。

...でも、完璧すぎて少し心配(^_^;)

なにはともあれ、次は画像取得時にこの予測を実施し、水田の水がなくなったら通知するというようにサーバーのスクリプト修正をしてみようかな。

# 追記

本記事で使用した技術を応用して、別の取り組みを行った内容も記事にしてみました。
もし興味のある方がおられましたらあわせてご覧下さい。

[畑に農作物を植えてみたけど、忙しくて毎日水やりにいけないのに日照り続きてどうしたものかと悩んでいたら、自動で散水する方法を思いついて試してみたという話](https://qiita.com/mix_dvd/items/bc84f0c143500c794b5f)

# その後

今はこんな感じ(^_^;)
草が生い茂ってきて、人の目で見ても水が出ているかどうか判別が難しいです...

草をとりにいかなきゃ！
![201908291058.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/54c22c5d-c333-e908-0a35-da3b5df6096f.jpeg)
#Ruby の OpenStruct がその名の通り、存在しないメソッドでも 例外を発生させずに実行してしまうので Struct を使う

#Struct is used because Ruby's OpenStruct, as its name suggests, will execute without causing an exception even for methods that do not exist


わりと両者の使い勝手が違って、最初戸惑う

# Struct

クラスを定義してから、インスタンスを作る (的なイメージ)

```rb
klass = Struct.new(:some)
# => #<Class:0x00007ffc0f885708>

s = klass.new(:what)
# => #<struct  some=:what>

s.some
# => :what

s.wow
NoMethodError: undefined method `wow' for #<struct some={:some=>:what}>
from (pry):4:in `__pry__'
```
 
# OpenStruct

いきなりインスタンスを作れる (的なイメージ)

```rb
s = OpenStruct.new(some: :what)
# => #<OpenStruct some=:what>

s.some
# => :what

s.wow
# => nil
```


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Elm でラジオボタン：label [] [ input [ type_ "radio", name "グループ名", onClick Msg ] [], text "ボタン名" ]

いい感じのサンプルを見付けられなかったのでメモ。

動くサンプル：https://ellie-app.com/6f6G6jwbddda1


## 手抜き版

`input` の属性に `value` を指定するのをサボりたいときはこっち。

```elm:ラジオボタンのサンプル
import Html exposing (..)
import Html.Attributes as Attrs
import Html.Events as Events

type Msg = ...

radioButton1 : String -> Msg -> String -> Html Msg
radioButton1 groupName msg_ buttonName =
    label []
        [ input
            [ Attrs.type_ "radio"
            , Attrs.name groupName
            , Events.onClick msg_
            ]
            []
        , text buttonName
        ]
```


## ちょっと真面目版

`input` の属性にちゃんと `value` を指定するときはこっち。

```elm
import Html exposing (..)
import Html.Attributes as Attrs
import Html.Events as Events

type Msg = ...

radioButton2 : String -> (String -> Msg) -> String -> String -> Html Msg
radioButton2 groupName toMsg value_ buttonName =
    label []
        [ input
            [ Attrs.type_ "radio"
            , Attrs.name groupName
            , Attrs.value value_
            , Events.onInput toMsg 
            ]
            []
        , text buttonName
        ]
```


## 参考

- [HTMLクイックリファレンス - &lt;LABEL&gt;](http://www.htmq.com/html/label.shtml)
「WEBを支える技術」のまとめ３

Webを支える技術のまとめです。


#HTTPヘッダについて
ヘッダは、メッセージのボディに対する情報、いわゆるメタデータを表現します。
クライアントやサーバはヘッダを見てメッセージに対する挙動を決めます。
リソースへのアクセス権を設定する認証や、クライアントとサーバの通信回数を減らすキャッシュにの設定など、HTTPの機能はヘッダで実現します。


##日時
ヘッダの値に日時を持たせることが出来ます。
電子メールに合わせた日時にフォーマットを使用し、グリニッジ標準時間帯を使用することになっています。

##MIMEメディアタイプ
メッセージをやり取りするリソースの表現の種類を指定するのがMIMEメディアタイプです。
こちらも電子メールから拝借してきた仕様ですが、そのうち、Content-Typeヘッダなど、いくつかのヘッダを使用します。


###Content-Type
メッセージのボディの内容がどのような種類なのかをメディアタイプで示します。

text,image,audio等、様々な種類のメディアタイプを指定することが出来ます。


###charsetパラメータ
メディアタイプはcharsetパラメータを持つことが出来ます。
例えばcharset=utf-8は日本語を示します。

charsetパラメータは省略可能ですが、タイプがtextの場合には注意が必要です。
日本語テキストだと指定しているのにも関わらず、ISO 8859-1が適応され、文字化けを起こしてしまう可能性があります。
さらに、XMLのように文書書体で文字エンコーディングできる場合でも、textタイプの場合は、Content-Typeヘッダのcharsetパラメータを優先しないといけません。なので、Content-Typeがtextの場合は必ずcharsetパラメータを付けるようにしましょう。


##言語タグ
charsetパラメータは、文字エンコーディング方式を指定するものでしたが、リソース表現の自然言語を指定するヘッダも存在します。それがContent-Languageヘッダです。

Content-Languageは「言語タグ」と呼ばれる文字列です。
```
Content-Language: ja-JP
```
なら、日本語-日本というような解釈になります。

##コンテントネゴシエーション
前期のメディアタイプや文字エンコーディング、言語タグはサーバが一方的に決めるのではなく、クライアントと交渉(ネゴシエーション)して決めることもできます。
この方法を「コンテントネゴシエーション」と呼びます。

##Content-Lengthとチャンク転送

###Content-Length
メッセージがボディを持っている場合、基本的にはContent-Lengthヘッダを利用して、サイズを10進数のバイトで示します。

###チャンク転送
しかし、動的に画像を生成するようなWebサービスの場合、ファイルサイズが決まるまでレスポンスを返せないので応答性能が低下してしまいます。このときに使用するのがTransfer-Encodingヘッダです。
Transfer-Encodingヘッダにチャンクを指定すると、最終的なサイズが分からないボディを少しずつ転送できるようになります。
```
Transfer-Encoding: chunked
```
で指定することが出来ます。

##認証
HTTPの認証方式には、Basic認証と、Digest認証があります。
また、Web APIではWSSEというHTTP認証の拡張使用を利用する場合もあります。

###Basic認証
ユーザ名とパスワードによる認証方式です。
ユーザ名とパスワードはAuthorizationヘッダに入れてリクエストごとに送信されます。
```
Authorization: Basic xxxxx
```
のようになります。
xxxxxは、Base64でエンコードした文字列が入ります。
Base64でエンコードした文字列は簡単にデコードできてしまうため、ユーザ名とパスワードが平文でネットワーク上に流れているようなものです。なのでSSLやTLSを使って、TTPS通信し、通信路上で暗号化するか検討しないといけません。


###Digest認証
Digest認証では、ユーザは認証無しでリクエストを送信します。そのレスポンスの中に、「nonce」という一度だけ使われる数字があり、nonceの値と、ユーザ情報、パスワード情報を組み合わせた文字列が認証情報になります。

ですが、Diest認証はその煩雑さから使用されないことが多いです。


###WSSE認証
SSLやTLSが利用できないのでBasic認証が使えない、ホスティングサービス上のCGIスクリプトなどでDigest認証も使えない場合のために、開発されました。

##キャッシュ
HTTPの重要な機能の一つです。
キャッシュとは、サーバから取得したリソースをローカルストレージサーバに蓄積し、再利用する手法のことです。
クライアントが蓄積したキャッシュは、そのキャッシュが有効な間は、クライアントが再度そのリソースにアクセスしようとしたときに再利用します。

・キャッシュの制限
・キャッシュの有効期限を示す
・詳細なキャッシュ方法を指定する
など、様々な指定方法があります。

##まとめ
HTTPヘッダでは認証やキャッシュの指定など、HTTPの重要な機能を実現することが出来ます。
Railsでコマンドラインを書く時の決定版

# 概要

railsでコマンドラインスクリプトを各方法はtaskとrunnerと2種類あります。

taskは引数の扱いが[微妙](https://qiita.com/MasamotoMiyata/items/83091c4f01819c8e93bf)で、オプションも扱えません。書き方も独特なためイマイチ好きになれません。またspringも効かないので読み込みも遅いです。

runnerはspringが効くので起動は早めですが引数を自分で解析しないといけません。

[Thor](https://github.com/erikhuda/thor)というrubyのコマンドライン用のツールがあって引数やオプションを柔軟に扱えて便利です。以前「[Thorのコマンドの中でrailsのActiveRecordを使う](https://qiita.com/MasamotoMiyata/items/a5511432109b688597cd)」という記事を書きましたが、spring経由で起動できないので起動が遅くイマイチでした。

実はその記事を書いた時点で[runner](https://guides.rubyonrails.org/command_line.html#rails-runner)の存在をすっかり忘れてました。runner経由で起動し、Thorで引数の解析を出来ないか試したらあっさり動きました。

# コード

スクリプトを置く場所はどこでもOKですが、`thor/test`にスクリプトをおいた前提で書きます。

```rb
# thor/test
class Main < Thor
  desc "exec", "foobar"
  def exec(foobar)
    # ここで何かする
  end
end

Main.start(ARGV)
```

まあ、普通のThorのスクリプトですね。これをrunner経由で呼び出します。

```
$ bin/rails runner thor/test exec foobar
Running via Spring preloader in process 66365
```

こんな感じで実行します。ちなみに`thor/test`内の`ARGV`には`[exec foobar]`が来ます。なのでThorがうまく引数やオプションを解析できるんですね。

既存のツール、機能の組み合わせですが、すっかり見落としてました。Railsのコマンドライン関係がイマイチだと思ってたのですが、私の中ではこれで決まりといった感じです。
VBAでBOM無しのUTF-8ファイルを作成する

# はじめに

VBAでUTF-8ファイルを作成する時、通常はこのような方法で作成する。

```vb:test.xlsm
Sub test()

    Const FILE_NAME As String = "C:\Users\xxxx\test.txt"
    Const BODY      As String = "あいうえお"

    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .WriteText BODY
        .SaveToFile FILE_NAME, 2
        .Close
    End With

End Sub
```
出来上がったファイルを見ると、BOM有りで出力されていた。BOM無しファイルを出力するにはもう一工夫必要そうだ。

# BOM無しファイルを作成する

```vb:test.xlsm
Sub test()

    Const FILE_NAME As String = "C:\Users\xxxx\test.txt"
    Const BODY      As String = "あいうえお"
    
    Dim adodb1 As Object
    Dim adodb2 As Object
    
    Set adodb1 = CreateObject("ADODB.Stream")
    Set adodb2 = CreateObject("ADODB.Stream")

    With adodb1
        .Charset = "UTF-8"
        .Open
        .WriteText BODY
        .Position = 3
        With adodb2
            .Type = 1
            .Open
            adodb1.CopyTo adodb2
            .SaveToFile FILE_NAME, 2
            .Close
        End With
        .Close
    End With

End Sub
```
これでBOM無しファイルを出力することができた。
シャッフルするExcelマクロ

###これは
1～Nの整数をシャッフルして配列として返す関数。

###コード
```vb
Function Shuffle(n As Long)
    With New Dictionary
        Do While .Count < n
            .Item(WorksheetFunction.RandBetween(1, n)) = 0
            DoEvents
        Loop
        Shuffle = .Keys
    End With
End Function
```
###テスト
```vb
Sub Test_Shuffle()
    Dim arr
    arr = Shuffle(13)
    Debug.Print Join(arr)
End Sub

```
###結果
```
9 12 8 7 5 10 6 1 11 4 2 3 13
```
Node.jsで発行したS3の署名付きURLへアップロードすると403エラーになる

# Node.jsで発行したS3の署名付きURLへアップロードすると403エラーになる

S3にファイルをアップロードする際に、署名付きURLを利用することにしました。
Node.jsで試したところ苦戦したので、忘れない内に記事にします。

Node.jsで署名付きURLを発行する方法はこちらの記事を参考にしました。
[{AWS(CloudFront+S3)+Node.js} 署名付きURLを使用したプライベートコンテンツの配信](https://qiita.com/l_v_yonsama/items/c7faa3fd7985bed75bcb)

# ダウンロード用署名付きURLの発行はうまくいった

以下のようなコードでダウンロード用署名付きURLの発行はうまくできました。

```javascript
import AWS from 'aws-sdk';

// 中略。AWSの認証等

// s3インスタンス作成
const s3 = new AWS.S3();

// ダウンロードURL発行
const downloadUrl = await s3.getSignedUrl('getObject', {
  Bucket: 'バケット名',
  Key: 'オブジェクト名',
  Expires: 60,
});
```

# アップロード用署名付きURLの発行でつまづいた

同じ要領でアップロード用署名付きURLを発行したところ、URLの発行自体はできました。

```javascript
import AWS from 'aws-sdk';

// 中略。AWSの認証等

// s3インスタンス作成
const s3 = new AWS.S3();

// アップロードURL発行
const uploadUrl = await s3.getSignedUrl('putObject', {
  Bucket: 'バケット名',
  Key: 'オブジェクト名',
  Expires: 60,
});
```

ただし、発行したURLへファイルのアップロードを試したところ、ステータスコード403のレスポンスが返ってきました。レスポンスボディは以下のような感じでした。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>SignatureDoesNotMatch</Code>
    <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
    <AWSAccessKeyId>hoge</AWSAccessKeyId>
    <StringToSign>hoge</StringToSign>
    <SignatureProvided>hoge</SignatureProvided>
    <StringToSignBytes>hoge</StringToSignBytes>
    <RequestId>hoge</RequestId>
    <HostId>hoge</HostId>
</Error>
```

メッセージを要約すると、署名方法がおかしいとのことです。

# 署名バージョン4を利用する

調べたところ、以下のIssueを見つけました。
[Node.js pre-signed URL for PUT response is 'signature does not match'](https://github.com/aws/aws-sdk-js/issues/902)

こちらによると、署名バージョン4を指定して、URLを発行する必要があるそうです。

```javascript
// s3インスタンス作成
const s3 = new AWS.S3({
  signatureVersion: 'v4',
});

// アップロードURL発行
const uploadUrl = await s3.getSignedUrl('putObject', {
  Bucket: 'バケット名',
  Key: 'オブジェクト名',
  Expires: 60,
});
```

試しに上記のコードで発行したURLへファイルをアップロードしてみたところ、今度はちゃんとアップロードすることができました！

# さいごに
無事に解決してよかったです。今回は以下の記事を参考にさせていただきました。わかりやすい記事、ありがとうございます。

- [{AWS(CloudFront+S3)+Node.js} 署名付きURLを使用したプライベートコンテンツの配信](https://qiita.com/l_v_yonsama/items/c7faa3fd7985bed75bcb)
- [Node.js pre-signed URL for PUT response is 'signature does not match'](https://github.com/aws/aws-sdk-js/issues/902)
- [Node.jsのAWS-SDKでPreSignedURLでPUTするとはまった件](https://qiita.com/kyasbal_1994/items/774be5624e4d90c5cf38)
【Ajax】phpで処理するAjaxを新規作成　

備考欄
=
“success(),error(),complete()“はjQuery1.8～非推奨になったため、
代わりに“done(),fail(),always()“を使うように


自分用メモ
=


```js:test.js
// jQuery 1.8~
$.ajax({
	url      : '../system/Ajax/change_switch.php',
	type     : 'POST',
	dataType : "json",
	data     : {
		id  : 'hoge',
		name: 'entry'
	}
})
// 成功
.done(function( data ) {
	console.log('成功');
})
// 失敗
.fail(function( data ) {
	console.log('失敗');
})
// 完了
.always(function( data ) {
	console.log('完了');
});
```

```php5:../Ajax/test.php
<?php
header('Content-Type: application/json');

$id   = $_POST['id'];
$name = $_POST['name'];
$data = ['データ',ture]; // この辺は好みで


echo json_encode($data);
```

【参考サイト】
[【Ajax】通信が成功した時の処理「success」と「done」の違いについて - Qiita](https://qiita.com/namari/items/c8addb6cdebfbc5913cf)
[jQuery.ajax()のまとめ: 小粋空間]
(http://www.koikikukan.com/archives/2012/10/02-005555.php)
three.jsでthree.module.jsを使う場合

```import * as THREE from '../build/three.module.js';```

という風に使うんですが、この時

Uncaught SyntaxError: Unexpected token *　、というエラーが出ることがあります。

このエラーを解決するには、three.jsで書いたコードを囲んでいる
```<script>～</script>``` を
　　　　　　↓
```<script type="module">～</script>```に変えなければいけません。


また、three.module.jsを使っている場合に

例えば、このURL(https://github.com/mrdoob/three.js/blob/master/examples/jsm/controls/OrbitControls.js)
のOrbitcontrols.jsの機能を使いたいと思った場合は、ちゃんと18行目に書いてある

from "../../../build/three.module.js";

の部分を自分がthree.module.jsを入れた場所へのパスに書き換えましょう。

参考になったと思ったら、いいねお願いします。

three.js関連のコメントも待ってます。
スターリンソート？

計算量O(n)で噂のスターリンソートを実装してみた
https://qiita.com/MeilCli/items/721526d716851e92192a

計算量O(n)の画期的なソートアルゴリズムであるスターリンソートをHaskell で実装してみた #Haskell
https://qiita.com/Tatsuki-I/items/380d6bd06515b872b2b2

↑ここら辺を読んで、提唱者のページを見たんだが、

stalin-sort - github
https://github.com/gustavo-depaula/stalin-sort

>  
You iterate down the list of elements checking if they're in order. Any element which is out of order is eliminated.


javascript版は少なくともこの定義に従っていない。

>  
```javascript
function stalinSort (array) {
  const sorted = [array[0]];
  for (let i = 1; i < array.length; ++i) {
    if (array[i] >= array[i-1]) {
      sorted.push(array[i])
    }
  }
  return sorted
}
module.exports = stalinSort
```

こうするのが正では？

```javascript
const trueStalinSort = (array)=>
  array.filter((e,i,arr)=>arr.filter((o,j)=>j<i).filter(o=>o>e).length==0)
;

module.exports = trueStalinSort
```


追記：
配列のprototypeに突っ込むとこうなる。


```javascript
Array.prototype.stalinSort = function(sort=(p,c)=>p>c){
  return this.filter((e,i,arr)=>arr.filter((o,j)=>j<i).filter(o=>sort(o,e)).length==0)
};

const arr = [2,1,5,3,4,1,2,3];

console.log(arr);

console.log(arr.stalinSort());
console.log(arr.stalinSort((p,c)=>p<c));
```

追記２：
O(n)を実現するならこっちかな。

```javascript
Array.prototype.stalinSort = function(sort=(a,b)=>a>b){
  const sorted = [];
  for (let i = 0; i < this.length; i++) {
    if (sorted.length && sort(sorted[sorted.length-1],this[i]))
      continue;
    sorted.push(this[i]);
  }
  return sorted;
}
```
JIRAのステータス遷移時にダイアログを表示したい

#まえおき
JIRAの新しい課題ビューで解決状況の値を手動で編集できなくてちょっと困りました。

issueは上がっていましたが対応未定の様子
[Ability to set the resolution in the new issue full-view](https://jira.atlassian.com/browse/JRACLOUD-69556)

表示を旧バージョンに戻せば編集できますが、ちょっと手間がかかる。

以前から、ステータスをDoneにする際に解決状況を選択するダイアログを表示したいと思っていました。ちょっと探しただけではやり方がわからず放置していましたが、今回思い切って時間を使って調べてみました。

[個人ブログ](http://www.pre-practice.net/2019/07/jira_30.html)にも書きましたが、Qiitaにも転記します。

#本文
##ステータスを完了にする際にダイアログを表示する
###ワークフローの設定を変更する

対象のプロジェクトを開いて以下の手順でできました。

![スクリーンショット 2019-07-31 9.36.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45849/43ec3441-802b-f60a-bf9d-384fdaaecbcf.png)

![スクリーンショット 2019-07-31 9.37.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45849/fe985bee-a6dc-0a93-9d72-a81da8c46fd3.png)

![スクリーンショット 2019-07-31 9.37.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45849/3cd62509-f922-4841-5135-71a684d65940.png)

![スクリーンショット 2019-07-31 9.37.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45849/bcf72a8a-67e5-c866-3de8-3fa411eb019d.png)

![スクリーンショット 2019-07-31 9.37.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45849/98cd5d52-259d-077b-3cab-06e93e62f7d1.png)

###ダイアログで不要な項目を消したい
今回選択してほしいのは「解決状況」だけだったので、その他の選択肢は消してシンプルにしたい。

以下の手順でできました。
![スクリーンショット 2019-07-31 9.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45849/24b10b59-2d2f-0a48-9f39-227ca3103ac9.png)
![スクリーンショット 2019-07-31 9.42.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45849/a0e9e88c-e59e-ce50-d58b-27e553682f35.png)

#####上記ワークフローの設定の「Transition View」を変更して「Publish Draft」します
![スクリーンショット 2019-07-31 9.42.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45849/7520f29b-9aa1-a918-f360-94b6d96540b3.png)
Commentの入力欄を消す方法はわかりませんでした。

以上です。

#参考

[Resolution is not displayed with the new issue view](https://community.atlassian.com/t5/Jira-questions/Resolution-is-not-displayed-with-the-new-issue-view/qaq-p/983154)

[Best practices on using the "Resolution" field](https://confluence.atlassian.com/cloudkb/best-practices-on-using-the-resolution-field-968660796.html)

[高度なワークフローの設定](https://ja.confluence.atlassian.com/adminjiraserver072/advanced-workflow-configuration-828787971.html)
Dockerコマンドメモ

# 基本操作
## イメージの取得（pull）
[DockerHub](https://hub.docker.com)からイメージを取得

```
$ docker pull ${イメージ名}(:${タグ})
```

### 例
```
# centosの最新イメージを取得
$ docker pull centos

# centosのバージョン6のイメージを明示的に取得
$ docker pull centos:6
```

## イメージの登録（push）
DockerHubにイメージを登録

```
$ docker push ${イメージ名}(:${タグ})
```

## イメージの確認（images）
```
$ docker images
```

## イメージの削除（rmi）
```
$ docker rmi ${イメージID}
```

## コンテナの作成・起動（run）
### 作成・起動のみ
```
$ docker run ${イメージID}
```
### 起動後、ターミナルに接続
```
$ docker run -it ${イメージID} bash
```
### コンテナに名前を付ける
```
$ docker run ${イメージID} --name ${コンテナ名}
```
### マウント
```
$ docker run ${イメージID} -v ${ホスト上のパス}:${コンテナ上のパス}
```

### 例

```
# 全部のせ
$ docker run --name test -v /home/kurita-shougo/workspace/test:/app/test -it 87f18086c4e7 bash
```

<details><summary><font color="Red">Docker for Windowsでマウントしたい場合</font></summary>
Shared Drives設定を入れてDockerを再起動
![d-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231600/cdbd33ba-0e39-e17c-2b70-709313e9bc90.png)
```
$ docker run --name test -v c:/workspace/test:/app/test -it 87f18086c4e7 bash
```
</details>

## コンテナの確認（ps）
```
$ docker ps (-a)
```
-a をつけると起動してないコンテナも表示する

## コンテナの削除（rm）
```
$ docker rm ${コンテナ名} or ${コンテナID}
```

## コンテナの停止（stop）
```
$ docker stop ${コンテナ名} or ${コンテナID}
```

## コンテナの再起動（start）
```
$ docker start ${コンテナ名} or ${コンテナID}
```

## コンテナへのログイン(attach)
```
$ docker attach ${コンテナ名} or ${コンテナID}
```

## コンテナからログアウト

コンテナ上での操作

### コンテナを停止しない場合
```
ctrl + p +q
```

### コンテナを停止する場合
```
$ exit
```

# 応用操作
## REPOSITORY名変更
```$ docker tag ${変更したいイメージのID} ${イメージ名}:${タグ名}```
これで設定したものが複製されるので元のイメージは削除する。
```$ docker rmi ${IMAGE ID}```
form_tagとform_forの違い

#form_tagの使い方

1.ルーティングのパスとhttpメソッドを直接定義する。

```ruby

<%= form_tag('/products/search', method: :get) do %>
```

2.新規投稿の場合、コントローラのnewアクションにモデルクラスのインスタンス変数を定義しなくてもよい。

```tweets_controller.rb
class TweetsController < ApplicationController
   def new
   end
end
```

3.新規登録の保存におけるストロングパラメータは,permit(:カラム名)という書き方をする。

```tweets_controller.rb

private
 def tweet_params
   params.permit(:name, :text)
 end
```

#form_forの使い方

1.ルーティングのパスとhttpメソッドを直接書き込む必要はなく、モデルクラスのインスタンス変数を引数に定義する。form_forの場合、モデルクラスのインスタンス変数の中身に値が、代入されていない場合はcreateアクションが作動し、代入されている場合はupdateアクションが作動するように自動化されているからである。


2.新規投稿の場合、コントローラのnewアクションにモデルクラスのインスタンス変数を定義する必要がある。引数に渡すためのインスタンス変数が必要となるからである。

```tweets_controller.rb
class TweetsController < ApplicationController
   def new
      @tweet = Tweet.new
   end
end
```

3.ルーティングのネストの回数によって、引数に渡すインスタンス変数の個数が変化する。

例えば、ルーティングを一回ネストさせた場合は、

```routes.rb
resources :tweets do
    resources :comments, only: [:create]
  end
```

インスタンス変数の個数は、ネストの親のルーティングのtweetsとネストの子のcommentsの２つが必要となる。よって、form_forの引数は、＠tweetsと＠commentsとなる。


```comments_controller.rb
class CommentsController < ApplicationController  
  def new
    @tweet = Tweet.find(params[:id])
    @comment = Comment.new
  end
end
```

```ruby

<%= form_for ( [@tweet, @comment] ) do |f| %>
```


3.新規登録の保存におけるストロングパラメータは、require(:モデル名)permit(:カラム名)という書き方をする。

```tweets_controller.rb

private
 def tweet_params
   params.require(:tweet).permit(:name, :text)
 end
```

form_forを使用し場合、一回モデルというキーを取り出して、その中にあるカラムというモデルのバリューかつparamsのキーであるカラムを取り出すという二重構造(二重ハッシュ)になっているからである。

form_tagの場合は、パスを直接指定しているため、モデルクラスを経由しないので、このような構造にはならない。

＜参考資料＞
https://guides.rubyonrails.org/v5.1/form_helpers.html
Jestでdotenvを使う

# Jestでdotenvが動かなかった
Jestを利用したときに、dotenv周りで苦戦しました。日本語の記事が見当たらなかったので、忘れない内に対処法を記載します。

# dotenvとは
dotenvは、 `.env` ファイルの内容を環境変数としてNode.jsで読み込むためのnpmパッケージです。
[npm - dotenv](https://www.npmjs.com/package/dotenv)

詳しい使い方はこちらが非常に参考になりました。
[環境変数の代わりに .env ファイルを使用する (dotenv)](https://maku77.github.io/nodejs/env/dotenv.html)

# Jestとは
JestはJavaScript向けのテストフレームワークです。
[Jest公式サイト](https://jestjs.io/)

# Jestでdotenvが動かなかった
Jestでテストコードを実行した時に、以下のコードが動作しませんでした。

```javascript
import dotenv from 'dotenv'

// .envファイルの値を読み込んでオブジェクトに代入する
const config = dotenv.config().parsed;
```

# package.jsonに設定を追加する
対処法を探したところ、以下の記事を見つけました。
[Using dotenv with Jest](https://medium.com/@lusbuab/using-dotenv-with-jest-7e735b34e55f)

package.jsonに以下の項目を追加すればよいそうです。

```json
{
  "jest": { 
    "setupFiles": [
      "dotenv/config"
    ]
  } 
}
```

試したところ、うまくいきました。

# さいごに
無事に解決してよかったです。以下の記事を参考にさせていただきました。

- [環境変数の代わりに .env ファイルを使用する (dotenv)](https://maku77.github.io/nodejs/env/dotenv.html)
- [Using dotenv with Jest](https://medium.com/@lusbuab/using-dotenv-with-jest-7e735b34e55f)
- [Jest公式サイト](https://jestjs.io/)
- [npm - dotenv](https://www.npmjs.com/package/dotenv)
mermaid.jsの描画を再ロードする

#mermaid.jsとは

* マークダウンにて、フローチャート・ダイアグラム・シーケンス図など記載できます。
* javascriptで動くので、軽く使いやすいです。
* <a href=https://marketplace.visualstudio.com/items?itemName=vstirbu.vscode-mermaid-preview>VScodeにプレビュー機能が付いたプラグインがあるのでぜひどうぞ</a>
* 
<a href=https://mermaidjs.github.io/>公式サイト</a>
<a href=https://mermaidjs.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiZ3JhcGggVERcbkFbQ2hyaXN0bWFzXSAtLT58R2V0IG1vbmV5fCBCKEdvIHNob3BwaW5nKVxuQiAtLT4gQ3tMZXQgbWUgdGhpbmt9XG5DIC0tPnxPbmV8IERbTGFwdG9wXVxuQyAtLT58VHdvfCBFW2lQaG9uZV1cbkMgLS0-fFRocmVlfCBGW2ZhOmZhLWNhciBDYXJdXG4iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ>ライブエディターもあるよ！</a>

#結論

* 描画するAttributeを削除
　removeAttribute('data-processed');
* 再びinitすればOK
  mermaid.init();

##ソースコード

```html

<!DOCTYPE html>
<html lang="jp">
<head>
  <meta charset="utf-8">
  <link rel="stylesheet" href="mermaid.min.css">
</head>
<body>
<input id="chart-src" onchange="changechart()" textarea value="
  graph TD;
    あ-->B;
    あ-->C;
    B-->D;
    C-->D;">
 </input>
 <div id="flowchart" class="mermaid">
 </div>
 <script src="https://unpkg.com/mermaid@7.1.0/dist/mermaid.min.js"></script>
 <script>mermaid.initialize({startOnLoad:false});</script>
<script>
	let aa = document.getElementById("chart-src").value;
	document.getElementById("flowchart").innerHTML = aa;
	mermaid.init();
</script>

<script>
function changechart(){
    document.getElementById("flowchart").removeAttribute('data-processed');
    let aa = document.getElementById("chart-src").value;
	document.getElementById("flowchart").innerHTML = aa;
	mermaid.init();
}
</script>
<body>
</html>
```

※汚いソースコードなのはご勘弁ください。
CentOSで起動時にサービスが起動するように設定する方法

- 環境
    - CentOS release 6.9 (Final)
    - iptables v1.4.7
    - chkconfig version 1.3.49.5

# やりたいこと : CentOS6で起動したらiptablesを自動で起動できるようにしたい
AWSのインスタンスに[iptablesでポートフォワードを設定](https://qiita.com/ponsuke0531/items/6b6255c0402e6ea4a950)した。
次の日、ローカルのWindowsからポートフォワード先に接続しようとした、が、つながらなかった。インスタンス起動しているのになぜ？それはiptablesが起動していないから。
インスタンスを起動するたびにiptablesを起動するのはつらいので、自動起動がいい。

```bash
# iptablesが起動していない
$ sudo service iptables status
iptables: Firewall is not running.
```

# SysV Init系の起動プロセスに設定する
- LinuxにはSysV Init系とsystemd系の起動プロセスがあり、今回はCentOS6なのでSysV Init系を使えば良いようだ。
    - [【新旧対応】Linuxでの自動起動の設定方法を解説](https://eng-entrance.com/linux_startup)
- Red Hat系ディストリビューションである今回のCentOS6の場合chkconfigコマンドを使うようだ。
    - [サービスの起動とランレベル | OpenGroove](https://open-groove.net/lpic/linux-start-servicse-and-runlevel/)

## 現状を確認する
参考 : [chkconfig - サービスの自動起動の設定 / CentOS - Qiita](https://qiita.com/perlzemi/items/6bd18c8c74e580af177b)

```bash
# サービスの状態を確認する
$ chkconfig --list iptables
iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

### サービスの一覧に表示されていない場合は追加する

```bash
# サービスの一覧に表示されていない場合は
$ chkconfig --list
# 追加する
$ chkconfig --add iptables
```

## サービスの自動起動を設定する

```bash
# 設定時のフォーマット
$ chkconfig [--level {ランレベル}] {サービス} on
```

- 各ランレベルの意味
    - [F.4. SysV Init ランレベル - Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/installation_guide/s1-boot-init-shutdown-sysv)
    - イメージしやすい説明 : [Linuxのランレベルについてまとめてみた - Qiita](https://qiita.com/takahirono7/items/8b971cd1cf2ddcfe0e04)
- ランレベルを指定しない場合 : ランレベル 2、3、4、5 でサービスが有効になる。
    - [10.2.3. chkconfig ユーティリティの使用 - Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/s2-services-chkconfig)

```bash
# --listが見られるからって権限があるとは限らない
$ chkconfig iptables on
You do not have enough privileges to perform this operation.
# 自動起動を設定する
$ sudo chkconfig iptables on
# 確認する
$ chkconfig --list iptables
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
```
【Ajax】通信が成功した時の処理「success」と「done」の違いについて

簡潔に
=
・success()はjQuery1.8～非推奨になったので、その代わりに「done」を使うべし
・どちらも通信が成功した時に行わせる処理
・jQueryの公式リファレンスによると、“success(),error(),complete()はjQuery1.8～非推奨になったため、代わりにdone(),fail(),always()を使うように”との記述があった。

|バージョン| 成功    |失敗（エラー） |完了|
|:-----------------|:-----------------|:-----------------|:-----------------|
|jQuery1.8～(非推奨)| success|error |complete|
|jQuery1.8～| done   |fail|always|
参考サイト
=
[ajaxで処理を行う時の「success」と「done」の違いについて](https://takuo4649design.com/weblog/note/archives/11225)
virtualhostを切ったサイトにローカルで確認する方法

# /etc/hostsにIPとサーバーネームを書く！！
何故か自分はこれをよく忘れているので、覚書。ローカルでvirtual hostを確認するためには、/etc/hostsに対して、IPとサーバーネームを書く必要がある。

```
sudo vi /etc/hosts
```

下記のように記述して、ローカルホスト側がIPアドレスを逆引きして、サーバー側にドメインを確認させてあげれば、ローカルからvirtual hostのサイトを確認することができる。

```
*2.5*3.**.*** サーバーネーム
```
php-master-changes 2019-07-30

今日は stream_get_contents() 利用時のメモリリークの修正、--disable-signals でのビルドこけの修正、Azure Pipelines の Mac 用設定修正、関数呼び出し時の ... の引数展開で RW フェッチを使うようにする修正、タイマーイベントのコールバック内でのタイマーイベントの再登録処理の修正、ドキュメントの更新、MySQL < 5.6 を想定したテストコードの削除があった！

# 2019-07-30
## acasademont: Fix bug [#78326](https://bugs.php.net/bug.php?id=78326)
- https://github.com/php/php-src/commit/dc7aa22b18b710aaa837c9466e9a77241f909c8a
- [7.2~]
- [stream_get_contents()](https://www.php.net/manual/ja/function.stream-get-contents.php) での固定長バッファ利用時のメモリリークの修正

## cmb69: Fix build for --disable-signals
- https://github.com/php/php-src/commit/3429370d69d8f2c7e244214ce11570bcf6fb2088
- [7.4~]
- --disable-signals でのビルドこけの修正
- [前日の修正](https://qiita.com/sj-i/items/682d4889effd0d2c4aeb#nikic-fix-zend-signals-unblocking)で入ったところ

## nikic: Don't explicitly install homebrew
- https://github.com/php/php-src/commit/76c2bef9b020bc0816fdd6e488627b2e3a520161
- [7.4~]
- Azure Pipelines の Mac 用設定で、homebrew のインストールをやめた

## nikic: Use RW fetch for argument unpacking
- https://github.com/php/php-src/commit/6913ec3282149914e999d91b056fe1cc68d15ed7
- [7.4~]
- `func(...$array)` での引数展開で、RW フェッチを使うよう ZEND_SEND_UNPACK まわりの修正
- [配列内の配列を展開しつつ参照渡しするようなコード](https://3v4l.org/eqLmV)がうまく動いてなかったのが修正されるようだ

## nikic: Fix FPM timer event re-registration
- https://github.com/php/php-src/commit/0ed6c3714087b254c49185568df96a31df76b2ce
- [7.4~]
- sapi/fpm で、タイマーイベントのコールバック内でタイマーイベントの再登録がちゃんとできるよう修正

## nikic: Handle RW UNPACK in inference
- https://github.com/php/php-src/commit/a9e332e02777c9b3805f6af846a4f48504109d2b
- [7.4~]
- ext/opcache で、最適化器の型推論処理で ZEND_SEND_UNPACK の RW 化に対応

## remicollet: add php-keyring.gpg update step
- https://github.com/php/php-src/commit/0c52061d12d52846800f5bd3d916cddf52e0ee36
- docs/release-process.md で、php-keyring.gpg の更新手順を追加

## cmb69: Fix tests
- https://github.com/php/php-src/commit/053df4ac3b82a27975c8ffe97604e5e2056f2bb4
- [7.4~]
- ext/mysqli で、MySQL < 5.6 を想定したテストコードの削除
Tera Termログインマクロ

# TTLファイル（.ttl）

以下の内容を、設定を書き換えてTTLファイルとして保存する。

```
; 設定（ここのみ書き換えて使いまわす）
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
username = 'kurita-shougo'
hostname = 'test.host.jp'
keyfile = 'C:\Users\kurita-shougo\.ssh\id_rsa'
passwdfile = 'C:\Users\kurita-shougo\tool\teraterm\password.dat'
configfile = 'C:\Users\kurita-shougo\tool\teraterm\TERATERM.INI'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg = 'Enter password for user '
strconcat msg username
passwdkey = username
strconcat passwdkey '@'
strconcat passwdkey hostname
getpassword passwdfile passwdkey password

msg = hostname
strconcat msg ':22 /ssh /auth=publickey'
strconcat msg ' /user='
strconcat msg username
strconcat msg ' /keyfile='
strconcat msg keyfile
strconcat msg ' /passwd="'
strconcat msg password
strconcat msg '"'
strconcat msg ' /F='
strconcat msg configfile
connect msg
```

TTLファイルを「Tera Term Macro Interpreter」で実行するだけでログインができる。
typeormのtransactionのちょいメモ

## 前段
typeormにてsave後にfindした値を戻り値に使いたいケースがあった。
DBの構成がmaster/slaveになっているためレプリケーションに若干のタイムラグがあった(100msecとか)。
そのためsaveした内容がslaveに反映される前にslaveからfindしてしまい、更新前の値を返却してしまうというケースが発生した。

## 内容
transactionを利用することでmasterへのsave, masterからのfindが実行されることになりこの問題は解決した。
以下サンプルコード

- before

```typescript
async updateHoge(params: { id: string } & Partial<HogeEntity>): Promise<HogeEntity> {
  const existed = await this.hogeRepository.findOne({ id: params.id });
  if (!existed) {
    throw new Error(`invalid id: ${params.id}`);
  }

  const updatedParams = {
    ...existed,
    ...params,
  };

  await this.hogeRepository.save(updatedParams);

  const updated = await this.hogeRepository.findOne({ id: params.id });
  if (!updated) {
    throw new Error(`invalid id: ${params.id}`);
  }

  return updated;
}
```


- after

```typescript
@Transaction('test')
async updateHoge(
  params: { id: string } & Partial<HogeEntity>,
  @TransactionRepository(HogeEntity) hogeRepository?: Repository<HogeEntity>,
): Promise<HogeEntity> {
  if (hogeRepository === undefined) {
    throw new Error('Transaction repository does not exist');
  }

  const existed = await hogeRepository.findOne({ id: params.id });
  if (!existed) {
    throw new Error(`invalid id: ${params.id}`);
  }

  const updatedParams = {
    ...existed,
    ...params,
  };

  await hogeRepository.save(updatedParams);

  const updated = await hogeRepository.findOne({ id: params.id });
  if (!updated) {
    throw new Error(`invalid id: ${params.id}`);
  }

  return updated;
}
```
Access progressバー表示 


```
SysCmd acSysCmdInitMeter, “表示文字列", 最大値
SysCmd acSysCmdUpdateMeter, 最大値を超えない任意の値
SysCmd acSysCmdClearStatus
```
- Access画面の右下に指定した表示文字列＋インジケータを表示してくれます。
- 指定された値でインジケータの進捗具合を更新します。
- インジケータが不要になったら、消去させます。

進捗状況は、acSysCmdUpdateMeter で指定した値を使って
インジケーターに表示する割合を計算して再表示してくれます。
例えば、最大値が 100 のときに 50 を指定すると、インジケーターが半分まで進みます。
最大値を超えた値を指定するとインジケータが正しく表示されません。
※複数回呼び出し可です。

また、インジケータは、不要で文字列だけ表示させたい場合には
以下のように実行します。

```
SysCmd acSysCmdSetStatus, “表示文字列"
SysCmd acSysCmdClearStatus
```

指定できる文字数は、いずれも約 80 文字
php-master-changes 2019-07-29

この日は Sparc の Solaris 10 でのクラッシュの修正、ストリームラッパー経由での include でファイル全体が読み込まれない問題の修正、クラスコンパイル時の const の可視性チェックで SEGV が起きる問題の修正、opcache 最適化器のバグ修正、ドキュメントの更新、Zend signals の修正があった！

# 2019-07-29
## cmb69: Fix [#78342](https://bugs.php.net/bug.php?id=78342): Bus error in configure test for iconv //IGNORE
- https://github.com/php/php-src/commit/30eb4b3563f508019d306c3c62311f43d4ce6682
- [7.2~]
- ext/iconv で、//IGNORE の configure テストが Sparc の Solaris 
 10 だとクラッシュする問題の修正

## nikic: Fixed bug [#78340](https://bugs.php.net/bug.php?id=78340)
- https://github.com/php/php-src/commit/9bfda013d308b47610fb23ee565500418a9f3cde
- [7.4~]
- ストリームラッパー経由での include でファイル全体が読み込まれない問題の修正

## nikic: Fixed bug [#78344](https://bugs.php.net/bug.php?id=78344)
- https://github.com/php/php-src/commit/4ae807e84e102db9e0e97411cac90909f75f63f4
- [7.4~]
- クラスコンパイル時の const の可視性チェックで SEGV が起きる問題の修正

## nikic: Fixed bug [#78333](https://bugs.php.net/bug.php?id=78333)
- https://github.com/php/php-src/commit/d142dfc93d71bb387c19a06f77c265e89fc9d516
- [7.2~]
- ext/exif で、Sparc の Solaris 10 でテストがクラッシュする問題の修正
- 2 byte aligned なアドレスで float をデリファレンスしようとしてバスエラー（Sparc がそのへん厳しいので）らしい

## nikic: Fixed bug [#78341](https://bugs.php.net/bug.php?id=78341)
- https://github.com/php/php-src/commit/8e63bb5e465620f27de93dea82e0d84be72da7f3
- [7.3~]
- ext/opcache で、最適化器 DFA パスで [smart branch](https://nikic.github.io/2017/04/14/PHP-7-Virtual-machine.html#smart-branches) 検出に失敗する問題の修正

## cmb69: Document how to generate ffi_parser.c
- https://github.com/php/php-src/commit/07286d2fb4f6d270dedd41c7b0828680d1f0863e
- [7.4~]
- ext/ffi で、generate ffi_parser.c の生成方法を追記

## cmb69: Update NEWS [ci skip]
- https://github.com/php/php-src/commit/76683ea999ad1523dc308e1011925ff9952bd6d7
- [7.3~]
- 先の opcache 最適化器の修正をチェリピしたので、NEWS エントリを PHP-7.3.8 へ移動

## nikic: Fix Zend signals unblocking
- https://github.com/php/php-src/commit/38f1288b6427fc9e2fa2b5ad9912745ded923ee7
- [7.2~]
- [Zend signals](https://wiki.php.net/rfc/zendsignals) のブロック解除まわりを色々修正
- Zend signals については [do_aki さんの資料](https://www.slideshare.net/do_aki/zend-signals)がだいぶわかりやすい
    - こういうの OS 側の割り込み処理の話でも似た構造見るし、人間が作ったシステムの各階層で「後でやる」が発生するのだから、システムを作るのが仕事な人間であるところの俺がタスクを「後でやる」と無限に積み続けるのも当然のことなのだ
- opcache で compile_file の際にブロックしないようにしている（コンパイルエラー時にブロック解除されないのを避けるため）
- リクエスト終了時の deactivate を追加、ブロック解除漏れが持ち越されないように
- deactivation でのクリティカルセクションを必要ではなさそうだったので外し、シグナルキューの掃除を追加
- SIGG(check) をデバッグビルドで追加