OmniAICreator/Qiita-1.07M huggingface dataset:
Vagrant環境で、rails db:dropでエラーになるトラブルシューティング

# 環境
Vagrant + Ubuntu 16.04.5 LTS
Rails 5.2.4.2
ruby 2.5.1p57

# はじめに
rails db:createした後に、rails db:dropをすると、下記のエラーが出た時のトラブルシューティング

```
$ rails db:drop
Text file busy @ apply2files - /vagrant/test03/db/development.sqlite3
Couldn't drop database 'db/development.sqlite3'
rails aborted!
Errno::ETXTBSY: Text file busy @ apply2files - /vagrant/test03/db/development.sqlite3
/vagrant/test03/bin/rails:9:in `<top (required)>'
/vagrant/test03/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:drop:_unsafe
(See full trace by running task with --trace)
```

# 内容
どうも、Railsのバグらしく、Vagrant環境で、データベースがsqlite3の場合に発生するようです。
同じVagrant環境でも、postgresqlの場合は発生しませんでした。（確認済）
sqlite3のデータベースファイルを直接削除して対応するしかないようです。

```
rm db/development.sqlite3
rm db/test.sqlite3
```

なお、下記コマンドでも同じエラーが出ます。

```
rails db:migrate:reset
```

**rails db:create** 、**rails db:migrate**を連続して、１コマンドつづ打っていくしかないようです。

参考URL
https://teratail.com/questions/67393
https://qiita.com/totechite/items/d4b7f97372881d1d7a25
Rails 404エラー画面を設定した時にrefileで設定した画像が表示されなくなる

# 概要

備忘録代わりに書かせていただきます


Railsでroutesの最下行に

```ruby:routes.rb
get '*path', to: 'application#render_404',
```

でどのパスにもいかなかった場合に404エラーを独自で出力するように設定した場合に、
Refile等で指定されたattachment_image_tagの画像が表示されない。

# 原因

ログを見たらすぐに分かるんですけど、attachment_image_tagでURLを生成して、GETを送ってRoutesを通る時にrefileではroutesの設定が無いので、当てはまるパスがなく404のgetを返してしまうという話。

#解決法
もっと綺麗なやり方があるのかもしれないですけど、とりあえずRoutesのconstraintsを使ってrequestオブジェクトのurlに"attachments/"が含まれている場合は404の行を通らないようにして回避しました。

もっといい方法100%あるような気がするので、よかったらコメントで教えていただけると嬉しいです。

```ruby:routes.rb
class ErrorAvoid
  def initialize
    @url = "attachments/"
  end
 
  def matches?(request)
    @url.include?(request.url)
  end
end

Rails.application.routes.draw do
  get '*path', to: 'application#render_404',
    constraints: ErrorAvoid.new
end
```

とりあえず当面はこれで回避できます。
Xcodeで古いOSバージョンのSimulatorを起動する

XcodeはそのXcodeがリリースされたときの最新のOSバージョンのSimulatorが用意されているが、そのXcodeを使いつつ古いOSバージョンのSimulatorを起動するためには一手間必要なので、その手順をメモしておく

# 環境
Xcode 11.4

# 手順
Xcodeのメニューから Window > Devices and Simulators を選択する

「Simulators」タブを選択することでシミュレータ一覧画面が表示されるので、左下の「+」ボタンをクリックする
![01_デバイスとシミュレータ画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/4f023b3f-1793-adf1-389f-3ab3cd71faf8.png)

以下のようなシミュレータ追加画面が表示されるので、「OS Version」をクリックして選択肢を表示する
<img width="800" alt="02_シミュレータ追加画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/b7ffdc8a-c2a6-1dba-435c-aada666694bb.png">

「Download more simulator runtimes」を選択する
![03_シミュレータランタイム追加画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/52650591-2d47-e3b2-fdd5-e5c7bce9c1c5.png)

以下のようなコンポーネント一覧画面に遷移するので、起動したいOSバージョンの左側に表示されているダウンロードボタンをクリックし、ダウンロードが完了するまで待つ
<img width="800" alt="04_iOSコンポーネント追加画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/f9d3e151-cdb4-b064-d5f3-decf115f7e17.png">

シミュレータ追加画面に戻り、追加されたOSバージョンと端末を選択し、シミュレータを作成する
この際、端末の種類によっては追加したOSバージョンが古すぎて作成できない場合がある
<img width="800" alt="05_古いOSのシミュレータ追加画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/9b4ee251-69d5-6fae-09b3-401bbda54d82.png">

Xcodeで適当なiOSプロジェクトを開き、画面左上のターゲットデバイスから先ほど作成したSimulatorを選択し、Runボタンをクリックすれば、起動する
<img width="759" alt="06_古いOSのシミュレータ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/8bb989d1-620e-884c-ec65-b0e173bf777d.png">
単体テストの作り方

#　序文
　C#での単体テストコードの書き方を、体系的に整理したいと思って作成しました。ご指摘あれば遠慮なくお申し付けください。
#　開発環境
- OS: Windows10
- IDE: Microsoft Visual Studio2019 ver16.5.1
- フレームワーク: ASP.NET Core 3.1
- テスト用フレームワーク: MSTest

#　手順
##　考え方
1.　テスト対象のメソッドのうち、検証したい事項を明確化する
2.　実際にテスト対象のメソッドを呼び出して得た結果が予想通りであれば成功、失敗なら成功するまで繰り返す
3.　テストコードのメソッドに戻り値や引数は基本的につけない
##　書き方
1.　戻り値、引数無しのメソッドを生成する
2.　結果を予想する
3.　テスト対象のメソッドを呼び出し、その結果と予想を比較する

##　実例
今回テストするのはこちらのCalculationクラスのaddメソッド。

```c#
public class Calculation(){
    public static int add(int a, int b){
          return a + b;
    }
}
```
　テストコードはこちら。

```c#
[TestClass]
public class CalculationTest(){
    [TestMethod]
    public static void addTest(){
         int x = 3;
         int y = 5;
　　　　　
　　　　　//予想している結果
         var expected = 8;
　　　　　//実際の結果
         var actual = Calculation.add(x,y);
         Assert.AreEqual(expected, actual);
     }
}
```
　今回検証したいのは、

- addメソッドが予想した通りの値を返すのか？

　ということ。つまり、``return a + b;``の部分。
　これを検証するため、
1. CalculationTestクラスを生成、そしてその中にaddTestメソッドを生成。
2. 予想値と、Calculation.add()を呼び出して得た結果を、それぞれ``expected``と``actual``に格納。
3. Assert.AreEqual()で``expected``と``actual``を比較。

　成功すれば完了、失敗なら原因を探ってもう一度テストを実行する。

#　補足
　今回はMSTestを使いましたが、NUnitやxUnitでも基本は同じです。ただし、属性名やメソッド名が微妙に違うことに留意してください。
Nuxt.jsでのStylus初期設定

Nuxt.jsを始める人に向けてstyle（stylus）の初期定義のオススメを書きます。

# 前提条件
- Nuxt.jsがインストールされていること

# インストール
モジュールのインストール

```shell
$ npm i --save stylus stylus-loader @nuxtjs/style-resources
```

# 使い方
`styl`ファイルの作成

```shell
$ mkdir assets/style && touch assets/style/_reset.styl assets/style/_base.styl assets/style/_media.styl assets/style/_variables.styl assets/style/index.styl assets/style/resource.styl
```

nuxt.config.jsでモジュールの読み込み、stylファイルの読み込みを記述

```javascript:nuxt.config.js
module.exports = {
  modules: [
    '@nuxtjs/style-resources'
  ],
  css: ['~/assets/style/index.styl'],
  styleResources: {
    stylus: ['~/assets/style/resource.styl']
  }
}
```

スタイルを定義

```:assets/style/_reset.styl
/*
html5doctor.com Reset Stylesheet
v1.6.1
Last Updated  2010-09-17
Author  Richard Clark - http //richclarkdesign.com
Twitter  @rich_clark
*/

html
body
div
span
object
iframe
h1
h2
h3
h4
h5
h6
p
blockquote
pre
abbr
address
cite
code
del
dfn
em
img
ins
kbd
q
samp
small
strong
sub
sup
var
b
i
dl
dt
dd
ol
ul
li
fieldset
form
label
legend
table
caption
tbody
tfoot
thead
tr
th
td
article
aside
canvas
details
figcaption
figure
footer
header
hgroup
menu
nav
section
summary
time
mark
audio
video
  margin 0
  padding 0
  border 0
  outline 0
  font-size 100%
  vertical-align baseline
  background transparent

body
  line-height 1

article
aside
details
figcaption
figure
footer
header
hgroup
menu
nav
section
  display block

nav ul
  list-style none

blockquote
q
  quotes none

blockquote :before
blockquote :after
q :before
q :after
  content ''
  content none

a
  margin 0
  padding 0
  font-size 100%
  vertical-align baseline
  background transparent

/* change colours to suit your needs */
ins
  background-color #ff9
  color #000
  text-decoration none

/* change colours to suit your needs */
mark
  background-color #ff9
  color #000
  font-style italic
  font-weight bold

del
  text-decoration  line-through

abbr[title]
dfn[title]
  border-bottom 1px dotted
  cursor help

table
  border-collapse collapse
  border-spacing 0

/* change border colour to suit your needs */
hr
  display block
  height 1px
  border 0
  border-top 1px solid #cccccc
  margin 1em 0
  padding 0

input
select
  vertical-align middle

*
*:before
*:after
  box-sizing border-box
```

```:assets/style/_base.styl
img
video
iframe
  width 100%
  height auto
```

```:assets/style/_media.styl
$break-point = 750px

sp()
  @media all and (max-width: $break-point - 1)
    block

pc()
  @media all and (min-width: $break-point)
    block

webkit()
  @media screen and (-webkit-min-device-pixel-ratio: 0)
    block

firefox()
  @-moz-document url-prefix()
    block

edge()
  @supports (-ms-ime-align: auto)
    block

ie()
  _:-ms-lang(x)::-ms-backdrop
    block

.is-sp
  display block

  +pc()
    display none

.is-pc
  display none

  +pc()
    display block

.is-sp-in
  display inline

  +pc()
    display none

.is-pc-in
  display none

  +pc()
    display inline
```

```:assets/style/_variables.styl
$main-color = #000000
$primary-color = #ffffff
```

```:assets/style/index.styl
@import '_reset'
@import '_base'
```

```:assets/style/resource.styl
@import '_media'
@import '_variables'
```
JSONの基本　データ形式

JSONとは、データ形式の１つで、「JavaScript Object Notation」の略称

データに「キー」があるため、意味がわかりやすく、
コンパクトにデータを表現することができる。

JSON

```javascript:sample.json

[
    {
        "path": "img/img01.jpg",
        "name": "AJ1",
        "caption": "カラーバリエーション豊富"
    },
    {
        "path": "img/img02.jpg",
        "name": "Dunk",
        "caption": "最近の流行り"
    }
]
```

データ形式とは、データをどのような形式で記述するかを定めたもので、JSONの他に、
・CSV　「Comma Separated Values」（カンマを用いて管理）
・TSV　「Tab Separated Values」（タブ記号を用いて区切ったデータ形式）
・XML　「Extensible Markup Language」（マークアップ言語）
などが存在する
<br><br>


```CSV: 
1, img/img01.jpg, AJ1, カラーバリエーション豊富
2, img/img02.jpg, Dunk, 最近の流行り
```
CSVやTSVは各データが何を表しているのかがわかりにくい。
<br><br>

```XML: 

<?xml version="1.0" ?>
<images>
   <image>
      <path>img/img01.jpg</path>
      <caption>カラーバリエーションが豊富</caption>
      <name>AJ1</name>
   </image>
   <image>
      <path>img/img02.jpg</path>
      <caption>最近の流行り</caption>
      <name>Dunk</name>
   </image>
</images>
```
XMLは自由にタグを作ってデータを整理できるが、長くなりデータ容量が大きくなりがち

そのため、JSONが活用されています
<br><br>
Firestore Emulatorで8080ポートが起動できない時

昨日まで起動してたFirestore Emulatorが急に起動できなくなったので色々調べてみたけど、結局何も分からなかった。
自分で色々やってみたので忘れ得ない様にメモ！
## 環境
Mac OS Catalina ver10.15.3

```linux:エラー内容
Error: Port 8080 is not open, could not start firestore emulator.
```

firebase-toolsのバージョンが古いから更新をしろとメッセージが出ていたから素直に更新ししてみたが当然起動はできず・・・
何に8080ポートを使っているか調べてみることに！
調べるには `sudo lsof -i:[ポート番号]`

```
sudo lsof -i:8080
Password:
COMMAND  PID        USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java    1600 [ユーザー名]   67u  IPv6 0x00a0c000b000c0c0      0t0  TCP localhost:http-alt (LISTEN)
```

javaがローカルサーバーを使っているっぽい...
とりあえずこいつを解放することに。
開放するには `kill [PID]`で開放できます。

```
$ kill 1604
$ sudo lsof -i:8080
```
何も出なかったので開放できたっぽい。気を取り直してエミュレータを立ち上げると

```
$ firebase serve --only firestore
⚠  Please use firebase emulators:start to start the Realtime Database or Cloud Firestore emulators.
i  firestore: Serving ALL traffic (including WebChannel) on http://localhost:8080
⚠  firestore: Support for WebChannel on a separate port (8081) is DEPRECATED and will go away soon. Please use port above instead.
⚠  Setup required, please run: firebase setup:emulators:firestore

Error: emulator not found
```

エミュレーターがないと怒られたので、素直に書いてある通りに `firebase setup:emulators:firestore`でセットアップしてみました。

```
$ firebase setup:emulators:firestore
i  firestore: downloading cloud-firestore-emulator-v1.11.2.jar...
Progress: =================================================================================================================> (100% of 90MB
i  firestore: Removing outdated emulator files: cloud-firestore-emulator-v1.10.2.jar
```
とりあえずセットアップは完了したので気を取り直して再び起動してみる。

```
$ firebase serve --only firestore
⚠  Please use firebase emulators:start to start the Realtime Database or Cloud Firestore emulators.
i  firestore: Serving ALL traffic (including WebChannel) on http://localhost:8080
⚠  firestore: Support for WebChannel on a separate port (8081) is DEPRECATED and will go away soon. Please use port above instead.
i  firestore: firestore emulator logging to firestore-debug.log
✔  firestore: firestore emulator started at http://localhost:8080
```
無事に起動できました!

基本、デフォルトでは8080ポートを使う様ですが使用するポートは変更できます。
やり方は[エミュレータを実行する](https://firebase.google.com/docs/firestore/security/test-rules-emulator#run_the_emulator)に載っています。

今回は調べても別のポートを設定する方法ばかりだったので自分で開放してみたらいいのでは？と思いやってみましたが、他にいい方法があれば教えてください！

## 参照元
[Macで使用しているポートを調べる方法とポートを使用しているプログラム確認方法](https://do-zan.com/mac-search-using-port/)
Android + Bitrise はじめのいっぽ

# Bitrise
Bitrise はモバイルアプリ開発に特化した CI/CD ツールです
https://www.bitrise.io/
日本語のドキュメント : https://devcenter.bitrise.io/jp/

## 特徴
### 構築が簡単
Jenkinse などのようにサーバーを立てたりする必要がありません。
また、ワークフローの構築がコンソール上の操作のみでできます。

### モバイルアプリに特化
モバイルアプリ用のワークフローがすでに組まれています。
Google Play Store、App Store へのアップロード、 Test Flight を使った配信などを組み込むことができます。
Amazon Device Farm を使ったテストにも対応しています。

## プラン
* Hobby : $0/月 1ビルド10分まで, 200 ビルド/月, 1チーム2人まで
* Developer : $36/月 1ビルド45分まで, 回数制限なし, チーム人数制限なし
* Org Standard : $90/月 1ビルド90分まで。ビルド用のサーバーが強くなります。
* Org Elite : $270/月 制限は Standard と同じ。ビルド用のサーバーがさらに強くなります。

# Android の CI 環境として Bitrise を使う
すでに述べたように Android の基本的なワークフローは Bitrise 側ですでに組んでくれているので、 Bitrise にアクセスし、サインアップ・リポジトリの選択・ビルド設定の入力を行うだけでビルドを走らせることができます。

## ステップの追加
Bitrise が組んでくれたワークフローはユニットテストを実行しログを出してくれるだけの単純なものです。
それ以外の作業を行いたい場合は自分で追加する必要があります。
ダッシュボードからアプリを選択し Workflows タブを選択すると既存のワークフローが表示されます。
ステップを追加したい場所を選び表示される項目の中からそこで行いたいものを選ぶことでステップを追加することができます。

## リポジトリのイベント連携
リポジトリへのプッシュ、プルリクエストなどのイベントとビルドを連携させたい場合は Trigger タブで設定できます。
Trigger タブでイベントとワークフローを紐づければ OK です。
.Net Core(C#)によるUDP Hole Punching

# 背景
途中で無くなったり、歯抜けになってもいいけど、素早くデータを送りたい場合に必要なUDPを**NAT越し**でクライアントに送る場合のお話。
# 環境
.NetCore3.1
# 検証環境
|クライアント||サーバ|
|:---|:---:|--:|
|Privateアドレス||Privateアドレス
|Privateアドレス|NAT|Privateアドレス
|Privateアドレス|NAT|Azure VM(Ubuntu)
|Privateアドレス|DockerのNAT|Docker|

# UDP Hole Punching
NATをどうしたら外側から超えられるか。
NATはクライアントのアドレスおよびポート番号を変換しサーバに転送するので、サーバからクライアントに向けて(IPアドレス）パケットを送っても到達しません（そもそもクライアントはプライベートIPの場合も）。
そこでネットを漁るとUDP Hole Punchingなるキーワードが。
NATの変換の癖を利用した方法で、一度クライアントからサーバにパケットを送るとNATに変換テーブルが作成され穴が開いた状態になるので、
その穴に向かってパケットを発射するとクライアントに転送されるといった技だそうです。

# サンプルについて
ネットを探すといろいろ情報があるけど、サンプルを実行しても動かない。
一番近い[サンプル](https://ja.coder.work/so/c%23/338744)でした。
調査すると、どうやらサーバ側のUDPにソースアドレスが設定されていないため、NATが変換できないことが判明。
簡単なコアサンプルを作成しましたので、ご自身のプログラムに組み込んではいかがでしょうか。
[コアサンプルソース](https://github.com/kyamamoto03/UdpHolePunching)

## 使い方
1. サーバを起動
1. クライアントを起動
1. サーバの時間をクライアントに１秒間隔で送信
1. クライアントで受信した文字列を表示

## 設定
1. サーバは内部で受信するIPアドレスを動的に決めています。うまく行かない場合は

```ServerLoop.cs
54:        internal List<IPAddress> IPAddresses
``` 
のプロパティを変更してみてください。
1. クライアントは実行時にサーバのIPアドレスをしてくしてください
以上です。
コアサンプルにコメントを書いておいたのでそちらを参照してください。

## P2P
うまくクライアントを制御すれば、サーバを返さずP2Pでクライアント同士がおしゃべりできるかも。

# 最後に
いろいろな環境(NAT)で試したわけではないので、動かない環境もあるやもしれません。
phpのCarbonで月の計算をするときの注意点

phpの日付操作の定番ライブラリである[Carbon](https://carbon.nesbot.com)についてです。

# 問題点
「10月31日」に1ヶ月足すと何日が正解でしょうか？
感覚的には「11月30日」になってほしいのではないでしょうか？
Carbonでは`addMonth()`や`addMonths()`で1ヶ月足すと

```php
Carbon::parse('2018-10-31')->addMonth()->toDateString(); // 2018-12-01
```

`2018-12-01`になってしまいます。

こうなることを知ってないとプログラム中で意図しないことになる場合があります。
やっかいなのは月末くらいしかこのパターンにならないためテスト中に問題に気付きにくいことです。  

この問題を解決する方法はいくつかあります。

# addMonthNoOverflow()
`addMonth()`のかわりに`addMonthNoOverflow()`を使います。  
これを使うと


```php
Carbon::parse('2018-10-31')->addMonthNoOverflow()->toDateString(); // 2018-11-30
```

`2018-11-30`となります。  
デフォルトの`addMonth()`でこの動きをしてほしい気がしますが・・・

# useMonthsOverflow(false)
いろんなところで`addMonth()`が必要な場合、いちいち`addMonthNoOverflow()`を使うのは面倒な場合があります。  
そんなときは`Carbon::useMonthsOverflow(false)`をしてやると、`addMonth()`のメソッドを使ったときの動きが`addMonthNoOverflow()`の動きになります。  
Carbonはシングルトンでこの設定値は保持されるので、一度設定してやるとどこで`addMonth()`使っても`addMonthNoOverflow()`の動きになります。
もしデフォルトの動きをしたい場合は`addMonthWithOverflow()`を使ってやるともとの動きになります。

# settings(['monthOverflow' => false])
これはCarbonのバージョン2から利用できます。  
`settings`は全体に設定するものではなく、個々に設定する場合に使うイメージです。  

```php
Carbon::parse('2018-10-31')->settings(['monthOverflow' => false])->addMonth()->toDateString(); // 2018-11-31
```

# ちなみに
`subMonth()`でもこの問題が起こります。  
例えば「10月31日」に`subMonth()`すると「9月30日」ではなく、「10月1日」となります。  
`addYear()`もうるう年でずれるようで、`useYearsOverflow()`なんてものが用意されてます。 
 
``` php
Carbon::parse('2016-02-29')->addYear()->toDateString(); // 2017-03-01
Carbon::parse('2016-02-29')->settings(['yearOverflow' => false])->addYear()->toDateString(); // 2017-02-28
```

# まとめ
phpのCarbonの注意を書きました。  
知ってないとバグが起きてしまう可能性は大いにあるので抑えておきましょう。
他の言語でも日付の計算は最初に動きを確かめておいたほうが個人的には良いかなと思います。
【cluster】公開したワールド(3/31時点)

公式サイト
https://cluster.mu/

3月のワールドコンテスト＆フォトコンテスト
https://blog.cluster.mu/2020/03/06/world-contest-202003/

---

はじまりのロボットの世界
https://cluster.mu/w/e3f44548-b438-4649-a3bc-51fd55599381

一本道のアスレチック
https://cluster.mu/w/baf3dc77-bb6f-4ac0-bfa2-65f24742e1f2

ケイオスメイズ
https://cluster.mu/w/e355dc3c-59cb-42cf-a4e0-adc6082d1bbc

世界へのレジスタンス
https://cluster.mu/w/2adb4334-2797-4254-ba1b-5740a5640608

アトランティス
https://cluster.mu/w/169697a2-65ab-4f01-ad11-deac3b8b7767
git clone プロジェクト名のディレクトリを作成したくない

# git cloneするとデフォルトでプロジェクト名のディレクトリができる

* デフォルト実行

```
$ git clone https://127.0.0.1/TEST/example.git
$ ls -l
example
```

* ディレクトリを作成せずclone

```
$ git clone https://127.0.0.1/TEST/example.git ./
$ ls -l
readme.md
sourcefiles
```
※プロジェクト直下のファイルが配置される
(Go言語)WebAssemblyで簡単なWebサイトを作ってみた

#前書き
Go言語の勉強を進める中でWebAssemblyが気になったので試してみました。
いろいろな情報を参考にしつつ勉強中なので、間違い等ありましたらコメントをお願い致します。
ファイル 【[GitHub](https://github.com/daemonkimura/Go_WebAssembly_Calc)】


##目次
・WebAssemblyとは
・実行環境
・ディレクトリ構成と各ファイルについて
・簡易電卓の実装
・感想

###WebAssemblyとは
モダンなブラウザにおいて、
スクリプトファイルをアセンブリ言語に変換したうえで読み込み実行する仕組みのこと

###実行環境
 OS:Windows 10 64bit
 言語環境：go version go1.14.1
 ブラウザ:Firefox バージョン: 74.0

###ディレクトリ構成と各ファイルについて 【[GitHub](https://github.com/daemonkimura/Go_WebAssembly_Calc)】
「main.go」はあくまでソースファイルなので実行する際にディレクトリに置いておく必要はありません
「server.go」に関してもテスト用なので別途webサーバが稼働しているなら必要ありません。

```ディレクトリ構成:ディレクトリ構成
calc
|-index.html(アクセスするhtmlファイル)
|-main.go(WebAssemblyのソースファイル)
|-wain.wasm(上記をコンパイルしたファイル)
|-server.go(テスト用の簡易Webサーバ)
|-wasm_exec.js(実行に必要なスクリプトファイル)

```

###簡易電卓の実装
1.WebAssemblyファイルの作成
　まずgo言語でプログラムを記述しそれをWebAssembly形式にコンパイルします。
　(go言語のソースファイルは割愛)

```cmd:コマンドプロンプト
..\calc> set GOARCH=wasm 
..\calc> set GOOS=js
..\calc> go build -o main.wasm main.go
```

WebAssembly形式でコンパイルすると「main.wasm」が生成されます。

あとは、「server.go」を実行しブラウザ経由でアクセスすることでアクセスできます。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436464/9607976d-d51a-21e4-ea5b-3b1090f4dcd5.png)

###感想
一部Javascriptを併用する部分があり完全にgo言語のみで動的Webサイトの実装は難しいと思いました。
学習コストを抑えるためできる限りGo言語でWebシステムを実装できる様に勉強中ですが、Javascriptの知識も得るか、何らかのフレームワークを使用する必要があると感じました。

次はGoのフレームワークで多機能なサイトが作れないか調べていこうと思います。
Pythonのprint出力をNode.jsが認識できない問題について

こんにちは。
こちらの記事は、Python-shellを用いたNode.jsとpythonの連携時に発生したバグの
解決方法について、自らの経験を記述しているものです。
英語が分かる方はこちらの公式ドキュメントを参照していただいた方が正確ですので
ご参照ください。
https://www.npmjs.com/package/python-shell

**バージョン**
python 3.8.1
pyenv  1.2.17
node.js 13.3.0

##問題
Node.jsからpythonのスクリプトに引数を渡して実行させ、実行結果を
Node.jsで受け取ったところ、
python側の出力では正しくjsonデータが送られているのですが、
Node.js側では空文字からなるリスト['']しか受け取れないという現象が発生しました。
また、この現象が発生した際には、pyenvを用いて作成した環境下で行っていたのですが、
system環境で実行したところ、正常に値を受け取ることが判明し、
環境の違いによってコードが動いたり、動かなかったりする状態でした。

該当コードは以下の通りです。
Node.js側のコード

```javascript:connect_test.js
let {PythonShell} = require('python-shell');
let options = {args:[input_string]};
PythonShell.run('data_processing.py', options, function(err, data){
    if (err) throw err;
    console.log(JSON.parse(data));
});
```
Python側のコード

```python:data_processing.py
import json
import sys

data_info = sys.argv[1]
'''
コード中略
'''
print(json.dumps(output_json))
```

##解決策
Node.js側のコードのoption変数に以下のコードを付け足すことで
pyenvで作成した環境下でも動作するようになりました。

```javascript
//修正前
let options = {args:[input_string]};
//修正後
let options = {pythonOptions:['-u'],
               args:[input_string]};
```
ドキュメントによると
pythonOptions
　pythonへ渡す際のオプションスイッチの配列で、リアルタイムにprint()の結果を
受け取る際には、['-u']を指定する必要があるとのことです。

必ずつけ忘れないようにしましょう。
以上です。
laravel version5.7以前でマイグレーションエラーが発生した際に行ったこと

laravel 5.７を使用したアプリ開発時に「php artisan migrate」を行ったところ次のようなエラーメッセージが出た。

`SQLSTATE[HY000]: General error: 3780 Referencing column 'user_id' and referenced column 'id' in foreign key constraint 'posts_user_id_foreign' are incompatible.`

user_idがどうこう言っていたのでmigrationファイルを確認したが異常は見つからず…。

その時の自分が書いたコードが以下の通り

```ruby:create_users_table.php

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            省略
        });
    }
```

```ruby:create_posts_table.php

public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            中略
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')
                  ->references('id')->on('users')
                  ->onDelete('cascade');
        });
    }
```

しばらくGoogleで検索しているとこのような下記のような記事が見つかった

[Laravel 外部キー制約エラー General error: 3780 Referencing column](https://qiita.com/ucan-lab/items/976d4d8b45685b1a4ada)

記事によるとどうやら外部キー制約によるエラーであることが判明。

記事の通り確認すると問題の箇所は
「create_posts_table」のほうではなく「create_users_table」の方にあった。

`$table->bigIncrements('id');`

と書かれていたのを

`$table->Increments('id');`

へと修正し、再度migrateを実行したところうまく行った！解決！！

どうやら自分が参照していたのはlaravel５.８以降のバージョンの記事であったらしくそれより以前のバージョンを使用していたためうまくかなかったらしいとのこと。

laravelにはバージョン別に様々な記事や参考書などがあるが自身が使っているバージョンの把握も大切だと学んだ。
WindowsのPythonで、Cannot load mkl_intel_thread.dll に詰まったら

何番煎じかわからないけれど、Windows上のPython (Anaconda/Miniconda) で `Intel MKL Fatal ERROR: Cannot load mkl_intel_thread.dll` で自分も詰まって、色々調査して解決したので、自分の思うベストソリューションをまとめてみる。

## 1. まず、どのdllが読み込まれているかを確認する

Anaconda PromptやPowershellなどで、`where.exe mkl_intel_thread.dll` を実行するとどのdllが読み込まれているかがわかる。

```powershell
> where.exe mkl_intel_thread.dll

C:\Miniconda3\envs\mkl_test\Library\bin\mkl_intel_thread.dll

# メモ: Powershellで実行する場合は、where じゃなくて必ず where.exe !
```

ここでAnacondaやMinicondaでインストールされている以外のdllが表示されているときは、間違いなく**バージョンのミスマッチ**でうまくいかないので、削除するか別のフォルダに移動する。（ちなみに手動でIntelのサイトから最新バージョンのMKLを入れている場合も、一旦Pathのフォルダから消したほうが良い。自分はここでハマッた。）

なお、`conda activate xxx` を行うと `where.exe` の表示も変わるので、condaで独自環境を作っている場合は先にactivateしてから実行すべき。

## 2. dllを整理してもうまく行かなかったら、新規に環境を作る

1.の手順で、余計なdllを削除して再度実行してもうまく行かない場合は、新規環境を作るのが良い。例えばPython3.6.5で環境を新規に作る場合は以下。`mkl_test`のところは好きな名前でOK。

```bash
conda create -n mkl_test python=3.6.5
conda activate mkl_test

# NOTE: Anaconda PromptではなくPowershellで最初にactivateを行うときは、
#   `conda init powershell` してPowershellの再起動が必要。
```

ただしこの `create` のとき、いつものように最後にanacondaを入れると、デフォルトのnumpyとかscipyとかが入ってしまうので、入れるべきではない。**あくまでMKLから先にインストールして、そこから自分の必要なライブラリをどんどん追加していく**。

MKLのバージョンについては、自分は2019.4ではうまく行かず、2019.1や2018.0.3ではうまくいった。

```bash
conda install mkl=2019.1
```

ここから、必要なライブラリを追加していく。

```bash
conda install numpy scipy
conda install -c pytorch pytorch=0.4.1
# などなど
```

そして最終的に `where.exe mkl_intel_thread.dll` でdllを確認して、今回作った環境のenvs以下のdllのみが表示されているのが正しい。

```
> where.exe mkl_intel_thread.dll

C:\Miniconda3\envs\mkl_test\Library\bin\mkl_intel_thread.dll
```

この状態でもう一度 `import numpy` などを実行すれば、多分うまくいく。
Typescriptのimport文のをフォーマットする正規表現

Typescriptのimport文のをフォーマットを整えたい人生だった。

### 結果

```
検索: import \{([A-Z]{1}.+[a-z]{1})\}
置換: import \{ $1 \}
```

### 説明

#### 検索

- `[A-Z]{1}` で1文字の大文字にマッチ
- `.+` 任意の文字列にマッチ
- `[a-z]{1}` 1文字の小文字にマッチ
- `(様々な正規表現)` のようにすることで括弧内の内容を置換時に `$1` で利用できるようになる

#### 置換

- 検索時の括弧で囲んだ内容を引き継いで $1 として置換する

### 最後に

最後まで読んでくれてありがとう。
IntellIJ を使っていればわざわざおこんなことしなくても Formatter の設定だけで済むよ。

`Preference > Edtor > Code Style > TypeScript > Spaces`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142263/b75b38a7-5d1e-c85d-be7c-de72faa0f2a6.png)
R データフレームの縦長←→横長変換の簡単まとめ

いろいろなところで解説されてる内容ですが、自分なりにできるだけ簡単にまとめました。関数の詳しい説明については「参考サイト」を参照してください。
なお、ここでは`tidyr::gather`と`tidyr::spread`を使います（理由については後述）。

# 必要パッケージ
`tidyr`を使う。

```R
install.packages("tidyr")
# あるいは
install.packages("tidyverse")
```

# イメージ
![tidyr2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/9341d87a-f6c1-1325-498c-b2be57da8f1f.png)


# 横長→縦長変換

![gather2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/7c2eaa0c-3e5e-7ec4-6313-30d844e9e464.png)


# 縦長→横長変換

![spread2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/cb32b835-02ed-d036-d8b8-39b2a8d18700.png)

# 例
データは[気象庁　台風の発生数（2019年までの確定値と2020年の速報値）](https://www.data.jma.go.jp/fcd/yoho/typhoon/statistics/generation/generation.html)を使用。列名が日本語なのとエンコードがShift-JISである点に注意。


## 取り込み
```R
d <- read.csv("https://www.data.jma.go.jp/fcd/yoho/typhoon/statistics/generation/generation.csv", fileEncoding = "shift-jis")
```
`read.csv`を使った場合、（上図と違って）各月の列名が「X」はじまりになるので注意。`read_csv`を使うと、各月の列名はバッククオートで囲われた形で格納される。

## 横長→縦長変換
```R
d.gathered <- tidyr::gather(data = d, 2:14, key = Month, value = Number) # 列数指定
d.gathered <- tidyr::gather(data = d, X1月, X2月, X3月, X4月, X5月, X6月, X7月, X8月, X9月, X10月, X11月, X12月, 年間, key = Month, value = Number) # 列名指定
```
またtidyverseを使っている場合には、dplyr::selectと同様の選択方法も使用可能。選択方法は[こちらのサイト](https://kazutan.github.io/kazutanR/hands_on_170730/select.html#%E5%88%97%E5%90%8D%E3%81%AE%E5%BE%8C%E6%96%B9%E4%B8%80%E8%87%B4_ends_with())に詳しい。

```R
d.gathered <- tidyr::gather(data = d,  -年, key = Month, value = Number) # 「年」以外の列を選択
d.gathered <- tidyr::gather(data = d,  ends_with("月"), key = Month, value = Number) # 「月」がつく列を後方一致で選択。この場合「年間」は残る。
```

## 縦長→横長変換
```R
d.spread <- tidyr::spread(data = d.gathered, key = Month, value = Number)
```
列名の順番は適宜訂正する必要あり。

# `gather`/`spread`と`pivot_longer`/`pivot_wider`
tidyr内の縦横変換関数としては、`gather`/`spread`とtidyr ver.1.0.0以降で使える`pivot_longer`/`pivot_wider`の2種類があるが、より互換性が高いのは前者だと思うのでここではそちらを使った（tidyverseの部分アップデートで依存関係が壊れるとめんどくさい）。
ただし[後者のほうが改良版で良いとのことなので](https://qiita.com/yanami/items/3775df6c579fd0a2d60c)、tidyr ver.1.0.0以降を使用可能ならばそちらを使ったほうがいいかもしれない。（機会があればそちらで書き直します）


# 参考サイト
### 共通
[Package ‘tidyr’](https://cran.r-project.org/web/packages/tidyr/tidyr.pdf)

### `gather`/`spread`
[Rstudio Data Import Cheat Sheet](https://github.com/rstudio/cheatsheets/blob/master/data-import.pdf)
[縦横変換 - gather関数とspread関数](https://kazutan.github.io/kazutanR/hands_on_170730/tidy.html)

### `pivot_longer`/`pivot_wider`
[【tidyr】gather?, spread? もう古い。時代はpivot](https://qiita.com/yanami/items/3775df6c579fd0a2d60c)
[tidyr — シンプルなデータ変形ツール](https://heavywatal.github.io/rstats/tidyr.html)
ImageMagickの使い方

#はじめに
imageMagickを使ってみたので、備忘録代わりに残しておこうと思う


#拡張子の変更


```
magick logo: logo.gif
```

logo:はインストール後にテスト用に用意されているファイルで、何も設定しなくても
使用する事が出来る。
上のコマンドをたたくと、拡張子を変更する事が出来る。
※任意でファイルは変えて下さい。



#サイズの変更

いくつか方法はあるが、とりあえず1つ書いておこうと思う。

```
magick logo.gif -resize 100x100 logo.png
```

ポイントは変換前のファイル名を -resize の前に記入する事。
つまり上のコードは
**logo.gif という画像を100x100に変更してlogp.pngとして保存する**
という事になる。
Pillowで画像をいじってみた

## Pillowとは?
Pythonの画像処理ライブラリです。
https://pillow.readthedocs.io/en/stable/

## 今回の環境
- Jupyter Notebook 5.7.8
- Pillow 5.4.1
- Matplotlib 3.0.3

#### 準備
パッケージをインポートします。

```python
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline
```

#### とりあえず画像を表示させる

```python
lena = Image.open("./lena.png")
type(lena)
```

```:出力
PIL.PngImagePlugin.PngImageFile
```

```python
fig, ax = plt.subplots()
ax.imshow(lena)
plt.title("Lena Color")
plt.show()
```

![lena_color.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/2d541188-b989-8369-1868-758fae9be8dc.png)


#### グレースケール化してみる

```python
lena_gray = lena.convert("L")
type(lena_gray)
```

```:出力
PIL.Image.Image
```

```python
fig, ax = plt.subplots()
ax.imshow(lena_gray)
plt.title("Lena Gray")
plt.show()
```

![lena_gray_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/fbd911fb-276f-a3fb-5a8a-a8b06181525f.png)


変な色になりますが、これはMatplotlibの仕様です。
カラーマップをデフォルト値から変更する必要があります。
グレースケールの画像を表示する場合は`cmap="gray"`を指定します。

> For actually displaying a grayscale image set up the color mapping using the parameters

https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.pyplot.imshow.html

```python
fig, ax = plt.subplots()
ax.imshow(lena_gray, cmap="gray")
plt.title("Lena Gray")
plt.show()
```

![lena_gray_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/75c638b8-6191-af9f-bce6-9a044583ab98.png)


#### 保存する

```python
lena_gray.save("./lena_gray.png")
```

#### リサイズする

```python
lena_resize = lena.resize((150,150))
fig, ax = plt.subplots()
ax.imshow(lena_resize)
plt.title("Lena Resize")
plt.show()
```

![lena_resize.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/ed07cba9-d094-e87e-3a0a-2b87ccd70200.png)


画像の目盛に注目するとサイズが変更されていることが分かります。

#### 回転させる
今回は画像を75度回転させます。

```python
lena_rotate = lena.rotate(75)
fig, ax = plt.subplots()
ax.imshow(lena_rotate)
plt.title("Lena rotate 75")
plt.show()
```

![lena_rotate_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/b4ac8139-aad9-10be-b2de-858c443dce64.png)


見切れてしまいました。
元の画像のサイズから変更されていないようです。
Image.rotateに`expand=True`を追記して見切れないようにします。

> Optional expansion flag. If true, expands the output image to make it large enough to hold the entire rotated image. If false or omitted, make the output image the same size as the input image.

https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.rotate

```python
lena_rotate_expand = lena.rotate(75, expand=True)
fig, ax = plt.subplots()
ax.imshow(lena_rotate_expand)
plt.title("Lena rotate 75 expand")
plt.show()
```

![lena_rotate_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/a31d84d3-9df7-e959-365d-282dd4131984.png)
ダメダメなタスク設計の例（オレ流）

# ダメダメなタスク設計
![RTOS設計におけるメモ2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402134/b3455a54-9428-cf98-a97f-bf5743de28c2.jpeg)

MAINタスクは全体制御という事を間違って解釈した例でもあり、この構成で正常に動作しているのであれば奇跡というしかないタスク構成です。

#どこがダメなんでしょう？

このタスク構成からでは機構制御そのものをMAINタスクで行おうとしていると読み取れます。
全体制御とはユニット全体としての状態遷移とその制御を行う事で機構制御を行う事ではありません。

SENSタスクから入ってきた情報からMOTORタスクへのモーターの動作要求やSOLタスクへソレノイドへの動作要求を行おうとしているのでしょうけど、そもそもSENSタスクからMAINタスクへのセンサ情報の更新通知がタイムクリティカルな構成（時間重視の構成）ではないので、非常にセンサ情報の更新にバラツキが出て来ます。
それに対してMOTORタスクやSOLタスクへの動作要求を出していては機構制御はボロボロです。
ソレノイドを引いてフラッパー動作で媒体の行き先を変えるような機構だったとすれば、極端な例だと媒体が通り過ぎた後にフラッパーを引いて行き先を変えるような事になり、機構制御としては成り立ちません。

#通信タスクについてもなんだかなぁと・・・
そもそも、この構成で通信プロトコルを何処で実装しようと考えてるのか読み取れませんけど、最悪の場合MAINタスクで実装しようと考える人もいます。（実例は見てきました・・・）　

こうなると、<font color=red><strong>iTronでマルチタスクを利用してプログラム開発を行っているメリットがまったくありません。</strong></font>

COM1タスクとCOM2タスクでUARTを使い、全く違うデバイス、またはユニットを制御してる場合は、まぁいいとしても、もしもハードウェア設計上でピンのアサインを一つのデバイス、またはユニットを送信はUART1、受信はUART2に割り付けないといけない場合などはこういうタスク構成では通信プロトコルは何処で実装するんでしょうかね？　

また、通信タスクの下に送信タスクと受信タスクを作るという設計になっていますが、<font color="light blue"><string>"オレ流タスク設計"</strong></font>では推奨していません。
割り込みで最小限の事だけして後はタスクに任せようと思っているのでしょうけど通信のレスポンスが悪くなるのと流用が面倒（と思ってる）、タスク構成が複雑になる、タスク優先度設計が複雑になる等のデメリットしか感じないからです。

こういう設計の場合で<strong>私が見てきた限りでは</strong>割り込み関数無いでは割り込みフラグだけクリアして受信タスクに通知するケース（ケース１）、割り込み処理内で割り込みフラグのクリアと受信レジスタから受信データをリングバッファに格納すうケース（ケース２）があります。

#### 1.　ケース１の場合の不具合例
　　タスクの優先順位や受信FIFO数によって、受信バッファがフルになる等の不具合が発生する。そしてタスクの優先順位を場当たり的に変更してデバッグ機では問題なくても他の試作機や量産機、接続先のユニットによっては同じ様に受信バッファフルのエラーが発生してしまう。
#### 2.　ケース２の場合の不具合例
　　リングバッファの位置変数をセマフォなので排他処理もせずに管理してしまい、タスク、もしくは割り込み処理内でリングバッファの位置変数が正確ではなくなる。　もちろん、割り込み処理内では排他処理でwai_sem()やtwai_sem()待つ事は出来ないので割り込み処理内で無駄にシステムコールをコールする事になり結果的に割り込み処理が（時間的に）長くなる。　
　
とまぁ、タスク設計でも一番アカン、アンチパターンの例を紹介しました。
オレ流での推奨は　<a href="https://qiita.com/ewi/items/761454f5b938d62225e1">RTOSにおけるタスク設計（もちろんオレ流）</a>　を参考にして下さい。
【UE4】タグによる当たり判定

# タグによる衝突判定のつけ方
ゲームにおいて攻撃が命中したかどうか、といったことを判定したい場合、衝突したかどうかの判定だけでなく何が衝突したのかを判定する必要があります。そうしないと壁にぶつかってはダメージを食らい、仲間同士でぶつかっては傷ついていくキャラクターができてしまいます。

衝突したオブジェクトが何であるかを判定する方法はいくつか考えられると思いますが、一つに「タグ」を利用する方法があります。
攻撃の例でいえばダメージを与えるようなオブジェクト(剣や弾丸など)に共通のタグを与え、衝突したオブジェクトがそのタグを持っていたらダメージを食らう、という方法です。

Unityでいう所の以下のような処理です。

```C#:Hit.cs
// 何かがぶつかったら呼ばれる。
void OnCollisionEnter(Collision collision){

    // ぶつかった相手のタグを取得
    string tag = collision.gameObject.tag;
    
    // タグが"Bullet"なら攻撃を食らったと判定
    if(tag == "Bullet"){

        // 攻撃を食らった際の処理
        Destroy(this.gameObject);
    }
}
```

上の例でいえば"Bullet"というタグを持つオブジェクトと衝突するとダメージを食らったものと判定します。
これで拳銃やライフルの弾に"Bullet"タグをつけ、壁や床には別のタグをつければ弾に当たった時だけダメージを食らうようになります。

先日UnrealEngine4でBlueprintを使用して同様の処理を作ろうとしたらあんまり情報が無かったのでご紹介します。

## 1.Actorにタグをつける
[こちらのチュートリアル](https://www.youtube.com/watch?v=QJpfLkEsoek)を例に話をします。

まずダメージを与えるオブジェクトである弾丸にタグをつけます。UE4のデフォルトのFPSプロジェクトに含まれている弾丸のActorはFirstPersonProjectileという名前です。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/c3fdab91-f313-fc9f-788d-7bd396c75e7b.png)

こちらをダブルクリックすると別ウインドウが開きます。 左上の"FirstPersonProjectile(self)"をクリックしてください。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/2dfd26c3-e918-15d5-45a9-070a1a710e5f.png)

右のdetailsタブを下にスクロールしていくと"Actor"という項目が出てきます。その項目の下部にある下矢印をクリックすると追加の設定項目が表示されます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/5dc77257-e6db-5393-b468-36caacf9bd51.png)

Tagsという項目が表示されますのでその項目の「＋」をクリックするとタグが一つ追加されます。
タグの値を"Bullet"に編集しましょう。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/f6eb1432-1fc6-d4af-e371-ec01dc9b60ac.png)

編集出来たらCompileしてSaveしましょう。これでタグの追加は完了です。

## 2.ダメージを食らう側の判定
ダメージを食らう側の処理を作りましょう。
動画で紹介されているEvilCubeを基に改造していきます。
以下のようにしましょう。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/e47a0b6c-86cf-c2b2-db0c-53095e7b705e.png)
Actor Has Tagは衝突したActorが特定のTagを持っているかどうかを判定するノードでBranchはif-else文に相当するノードです。
Pytorchを使った最適化のメモ


関数ベースになったtensorflow2が使いづらいので，Pytorchに移行中．
この記事は，パッケージをそのまま使う現代っ子ではなく，loss関数や最適化手法は自分で作りたいという懐古主義向けです．
「勾配は手計算するものだ」という，化石は対象ではないです．

## データ生成

適当に生成

``` python 
import numpy as np
import matplotlib.pyplot as plt
import torch
from torch.autograd import Variable
import torch.optim as optim

N = 100
a_data =  - 1
b_data = 1
sigma_data = 0.1
x_data = 2 * np.random.rand(N)
y_data = a_data * x_data + b_data + sigma_data * np.random.randn(N)
```

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245708/6c929db1-7e71-4a23-3dae-99428291f9cc.png)

## 最適化パッケージを使った場合

Loss関数を自分で作りたい，ひねくれた人向け.

```python
# 変数の定義
a = Variable(torch.randn(1), requires_grad=True)
b = Variable(torch.randn(1), requires_grad=True)

#データの変換
x_train = torch.tensor(x_data)
y_train = torch.tensor(y_data)

# 最適化関数の設定
optimizer = optim.Adam([a, b])

# 繰り返し回数
epoch = 4000

loss_epoch = np.zeros(epoch)

for i in range(epoch):
    #optimizerに使われていた勾配の初期化
    optimizer.zero_grad()
    #線形モデル
    y_hat = a * x_train + b
    #loss関数の計算
    loss = (y_train - y_hat).norm()
    loss_epoch[i] = loss.item()
    #勾配の設定
    loss.backward()
    #最適化の実行
    optimizer.step()
```

![Adam_loss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245708/e529e1ed-005a-15e8-a1b2-717591d79bda.png)
![Adam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245708/ddad5cd8-dbb1-18b2-003f-5357a4c836ff.png)

## 勾配のみ使う場合

Optimizerを使いたくない，もっとひねくれた人向け.
勾配法をつかって最適化．

```python
# パラメーターの準備
a = torch.randn(1,requires_grad=True)
b = torch.randn(1,requires_grad=True)

#データの変換
x_train = torch.tensor(x_data)
y_train = torch.tensor(y_data)

# 学習率
eta = 0.001

# 繰り返し回数
epoch = 4000
loss_epoch = np.zeros(epoch)
for i in range(epoch):
    #勾配の記録開始
    a.requires_grad_(True)
    b.requires_grad_(True)
    #予測とloss関数の計算
    y_hat = a * x_train + b
    loss = (y_train - y_hat).norm()
    loss_epoch[i] = loss.item()
    #勾配の設定
    loss.backward()
    #勾配の記録停止
    a.requires_grad_(False)
    b.requires_grad_(False)

    #勾配を用いた更新 
    a = a - eta * a.grad
    b = b - eta * b.grad
```

![original_loss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245708/79982b60-7da2-4b15-991c-c1341a8b917f.png)
![original.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245708/952d11d4-b4b0-f18b-2739-4dbc9a032406.png)


## まとめ

勾配の記録と停止の部分を慣れたら使いやすそうですね．

## Code詳細
https://github.com/yuji0001/2020Introduction_of_Pytorch

## Reference
Pytorchのチュートリアルとか（[ここ](https://pytorch.org/tutorials/)）.

## Author 
Yuji Okamoto yuji.0001@gmail.com
【初心者向け】PHPマスター講座 vol.4（比較演算子を学ぼう）

みなさんこんにちは！けいです

今回は「比較演算子」について解説します！

#【PHPマスター講座】演算子とは

===========================

###▶︎演算子（えんざんし）とは何か🐼？

>ひとつ以上の値 (あるいはプログラミング用語における「式」) から別の値 (制御構造が式になるように) を生み出すもの(引用先：PHPマニュアル)

見てもらうとわかるように…

マニュアルは「これでもか！」ってくらい
簡単な内容を複雑に書く天才なので

今回は演算子の中でも
初心者が一番初めに学んでおくべき

【比較演算子】について
一つずつ丁寧に解説していきます！

※演算子の基本となる[「代数演算子」](https://qiita.com/life_is/items/01d884602a355f9df926)の知識が曖昧な方は上記リンクから別記事を先に読むと理解度を上げていくことができますよ。

-------------------------

###▶︎【比較演算子を一言で表すと】🐼

「値同士を比較し、その結果を返す」ですが…

これだとまだイメージがつきにくいので

一つずつ丁寧に解説していきます！

**【比較演算子①】**
・「>」：より多い
・「<」：【未満】より少ない
・「>=」：【以上】より多いか等しい
・「<=」：【以下】より少ないか等しい

「以上」「以下」「未満」の違いによって

計算で表す内容は大きく変わるので

今回の記事でしっかりと抑えておきましょう！

-------------------------

**【比較演算子②】**
・「=」：代入
・「==」：等しい
（値が等しい時に「TRUE」を示す）
・「!=」：等しくない
（値が等しくない時に「False」を示す）
・「===」：等しい
（値が等しく型も等しい時に「TRUE」を示す）
・「!==」：等しくない
（値も型も等しくない時に「False」を示す）

※（データ）型
＝文字、数値（整数）
＝数値（実数＝小数点を含む値を指す）
＝論理（TrueかFalseか/YesかNoか）

（現時点では**【30%くらい】**の理解でも大丈夫です。今から補完していきます！）

===========================

###▶︎比較演算子を実践で学ぼう🐼（基礎編）

基礎編ではPHP学習者が一番気になる

・**「==」**
・**「===」**

この違いを簡単に解説していきます。

**・前提条件**
`$manga=100`
`$anime=100`

**・上記ケースの場合**
`$manga == $anime
//$mangaと$animenの値（100）が
　どちらも等しいので「TRUE」になります`

`$manga === $anime
//$mangaと$animenの値（100）は等しいけれども
　データ型が異なるので「FALSE」になります`

===========================

###💡ポイント💡
・「==」：等しい
（値が等しい時に「TRUE」を示す）

・「===」：等しい
（値が等しく型も等しい時に「TRUE」を示す）

※（データ）型
＝文字、数値（整数）
＝数値（実数＝小数点を含む値を指す）
＝論理（TrueかFalseか/YesかNoか、真か偽か）

===========================

###▶︎比較演算子を実践で学ぼう🐼（応用編）

さて、ここまでで基礎を学べたと思うので

次は実際に応用編として

**「比較演算子」**を学びましょう。

**①「>=」を使うケース：**
【以上】より多いか等しい

`<?php
$age = 21;`

`if($age >= 20){
 echo '成人(飲酒ができます)';
} else {
 echo '未成年（飲酒はできません）';
}
?>`

===========================

###▶︎【表示結果】
成人（飲酒ができます）

※今回は「21歳（20歳以上）」なので「TRUE」の成人（飲酒ができます）が表示されます！

===========================

**②「==」を使うケース：**
等しい（値が等しい時に「TRUE」を示す）

`<?php
$login_name = 'けい';`

`if($login_name == 'けい'){
 echo 'ログインに成功しました！';
} else {
 echo 'ログイン情報が誤っています。';
}
?>`

===========================

###▶︎【表示結果】
ログインに成功しました！

※今回は変数名（$login_name）の「'けい'」がif文の「==」の内容と同じなので、TRUEの結果が出力されます！

===========================

**③「===」を使うケース：**
等しい（値が等しく型も等しい時に「TRUE」を示す）

`<?php
$age = 21;`

`if($age === '21'){
 echo '年齢は同じです！';
} else {
 echo '年齢が違います。';
}
?>`

===========================

▶︎【表示結果】
年齢が違います。

※''が入っているので、数字は同じですが
 型の表示が異なるので「elseの結果」が出力されます！

===========================

さて、今回のPHPマスター講座 vol4（比較演算子を学ぼう）はここまでとなります！

少しでもあなたのPHP学習のお役に立てれば幸いです😌
Putty でSSHキーペアを作成する

#すいません、Windowsのことをすっかり忘れていました。


普段 Linux で作業していたので「SSH の公開鍵をください」と言っていたのですが、Windows しか使用しないユーザさんのことを
失念しておりました。

というわけで、Windows での SSH 諸々の作業場 Putty での SSH　公開鍵と秘密鍵のキーペアを作成します。

Putty のダウンロードサイトからダウンロードしてきましょう。現時点での最新版の置き場は

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

です。

インストールは標準でよいです。

では、動かしてみましょう。
Windows メニューから

Putty-gen 選択すると以下の画面が出ると思います。

![putty-gen001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494348/df92aa7b-d869-b9d1-2297-905208ce5336.png)

で、generate public/private key pair の項目の「Generate」ボタンを押して、キーペアを作ります。
その際のParametersはデフォルト(RSA の 2048ビット)でとりあえず作ってください。
心配な人は4096ビットで作っておけばオーケーです。

---追記20201209
   4096 bit の鍵を送ってほしいといわれたら、上の画面の一番下「Number of bits in generated key:」のところを2048から4096に変更してください。
---追記終わり



![putty-gen002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494348/91bff50e-99dd-55b6-3f66-6ee8644b0198.png)

ここで乱数を発生させるためにマウスをぐーるぐる動かしましょう。

![putty-gen003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494348/37cc4b29-eb3e-ddc3-93bb-55edfb4c4ea2.png)

で、乱数が生成し終わると鍵ができます。
[Save public Key][Save private key]を押して保存します。

この際に、Key passphrase をできれば 10 文字以上入れておくのが良いでしょう。
Confirm passphrase　に同じパスフレーズを入れてください。

パスフレーズについては

https://qiita.com/evakichi/items/e5663f223da39602546c

公開鍵と秘密鍵の特徴は

https://qiita.com/evakichi/items/1be582c5bc4263c3f228

を読んでくださってもよいでしょう。

で、この時にできた public key だけをサーバ管理者に送ればOKです。

補足：(鯖缶への情報)
頂いた putty 形式の公開鍵は

```
$ ssh-keygen -i -f putty.pub > putty.ssh.pub 
```

といった感じで変換すればOK。
swiftで角丸のボタンを実装する方法

# はじめに
今回も備忘録として残します。
## コード実装

```swift:test.swift
import UIKit

@IBDesignable class RoundedCornersButton: UIButton {
    
    // 角丸の半径(0で四角形)
    @IBInspectable var cornerRadius: CGFloat = 0.0
    
    // 枠
    @IBInspectable var borderColor: UIColor = UIColor.clear
    @IBInspectable var borderWidth: CGFloat = 0.0
    
    override func draw(_ rect: CGRect) {
        // 角丸
        self.layer.cornerRadius = cornerRadius
        self.clipsToBounds = (cornerRadius > 0)
        
        // 枠線
        self.layer.borderColor = borderColor.cgColor
        self.layer.borderWidth = borderWidth
        
        super.draw(rect)
    }
}

```

## 実装レイアウトに反映する方法
「show the identity inspector」の「custom class」に先ほど作ったClass名を入れる
PHP for文つまずきポイント

# はじめに
* 初心者向けです。お手柔らかに。
* 昔書いたやつです。下書き溜まっちゃったので出します。

## for文

```.php
$array = ['りんご','ゴリラ','ラッパ','パンツ'];
for ($i=0; $i < count($array); $i++) { 
    # code...
}
```

プログラミング始めたばかりの頃によく見たこの書き方、個人的にはよくないと思っている。
なぜなら

```.php
$i < count($array)
```
ここにcount()関数を用いることによって、実行条件の評価時に毎回count()が実行されてしまうからだ。
これがどういうデメリットを産むかというと、

* 実行条件が評価される度に、関数が実行されるため重くなる。
* for文の中（ループ中）で$arrayの要素の数が変更された場合、実行条件が変わってしまう

致命的なのはこれ

* for文の中（ループ中）で配列の数が変更された場合、実行条件が変わってしまう

だろう。例をあげると

```.php
$array = ['りんご','ゴリラ','ラッパ','パンツ'];
for ($i=0; $i < count($array); $i++) {
    // いろんな処理
    unset($array[$i]);
}
```

これは(初心者の僕からしたら)、for文開始時に配列の要素の数が4つあるわけだから4回回って欲しい。
が、for文が一回回るごとに要素の数が減っていくため、それにともなってcount($array)も減っていってしまうのだ。

というわけでこのループは2回しか回らない。
今は書いてて「当たり前だろこれは...」と思うが初期の頃の僕には難しかったので書いておく。

### 解決策

```.php
$array = ['りんご','ゴリラ','ラッパ','パンツ'];
$count = count($array);
for ($i=0; $i < $count; $i++) {
    // いろんな処理
    unset($array[$i]);
}
```

これなら変数が評価される時点で固定される（COWというすばらしい戦略）ので実行条件は$i < 4で固定される。

使えるならforeachを使おう。配列のためにある言語構造だし。
itronで安定した動作するソフトウェアを作るには



# 前の記事のアンチパターンの悪い悪い所から見るitronの悪い思い込み。

まず、<a href="https://qiita.com/ewi/items/761454f5b938d62225e1">前の記事</a>のソースコードで悪い所がまだありますので、そこを指摘しましょう。

```c
/**************************************************************************/
/**
 * @breaf 機構初期化処理 */
 */
/**************************************************************************/
int feed_init_proc()
{
     ERR err;
     UINT psw;
     FLGPTN ptn;

     PORTC.BIT.B0 = 0;    /* モーターへの電源イネーブル */
     PORTA.BIT.B0 = 1;    /* モーター１を正転 */
     PORTA.BIT.B1 = 0;    /* モーター１を正転 */
     PORTA.BIT.B2 = 0;    /* モーター２を逆転 */
     PORTA.BIT.B3 = 1;    /* モーター２を逆転 */
     feed_seq = 10;       /* 機構シーケンスを10へ */

    do
    {
        dly_tsk(100):     /* 100msディレイ */
    } (sens0_state == 0)  /* センサ０が紙ありになるまで待つ */

    PORTA.BIt.B2 = 0;    /* モーター２ブレーキ */
    PORTA.BIt.B3 = 0;
    dly_tsk(100);        /* 100ms ディレイ */.
    PORTA.BIt.B2 = 1;    /* モーター２正転 */
    PORTA.BIt.B3 = 0;

    ・
    ・
    ・
    ・
    return result:
  }
```

dly_tsk(100);の精度も相当荒いですけど、基本的な事ですけどitron仕様を忠実に実装しているとすればタスクの優先順位によって、この100msというタイマーは相当なズレが生じます。
それは、itronは<strong>時分割でタスクが実行される訳では無い</strong>という事です。
社内でも<strong>この事を知らない組み込みプログラマーが多い</strong>という事に私も驚かされました。
itronはシステムコールを呼び出す事によってディスパッチ処理が行われ、タスクを切り替えるなり
itronのアイドル処理が実行されます。タスクが切り替わるのは、ディスパッチ処理でタスクがWAIT状態からREADY状態に遷移しているタスクです。また、そこにはタスクの優先順位も関わってきます。
不具合が、dly_tsk()の部分にあると分かってもitronを理解していないとタスクの優先順位を変えて不具合が解消されたので、その部分のみデバッグして評価部門に提出すると、その他の基本動作で不具合が出て、他のタスクの優先順位を変えたり他のタスクに修正を入れたりする場<strong>当たり的な修正</strong>を行わなければならないという痛い目に遭います。
評価部門で不具合が発生すれば良いですが、微妙なタイミングで不具合が発生する為に市場では大発生で社内では発生せず等というプログラマーとしては最悪な現象が出る事になります。
発生する現象が分かったとしても、そういうベースで作られたソフトウェアの為、対策が思いつかない、もしくはモグラ叩きみたいにあっちを叩いても、こっちが出てくるという憂き目にあって最終的には<strong>その現象が起きない様にオペレーションで注意する</strong>という、製品としては欠陥品と言われても仕方無い事になります。

#だからitronは時分割じゃないって言ってるでしょ！

どうもマルチタスクといえば時分割で動作するプログラムだと思っている人が多いように思えます。
そして、何故か<strong>システムに制御を戻す</strong>という事が理解できない人が多いようにも思えます。
システムへ制御を戻すというのは<font color=red><strong>システムコールをコール</strong></font>するという事なのですが、どういう訳か処理の途中で無理矢理rot_rdq()とかをコールする人もいるんですよねぇ・・・。

私も処理が長すぎてWatchdog Timerでリセットしてしまうという恥ずかしいコードを書いてしまい、無理矢理rot_rdq()をコールするコードは書いた事はありますが（汗

まぁそういう人への対策は、次からはそういうソフトウェアは作らない様に指導するか、設計規定などで約束事と例を記載して無理矢理にでも更正させるしか無いでしょう・・・。
ソースコードのレビューをするのも一つ手だと思っていますが、時間が無いからすっ飛ばすとか、指摘しても今更変えるとスケジュールが・・・とか言い訳を作って結局、更正できない事も多々あります・・・。

# 安定した動作するソフトウェア

なんの為のエントリーかというとオレ流のRTOSプログラミングではタスクの優先順位など大ざっぱに高い優先順位と一つ低い優先順位さえあれば安定した動作をするソフトウェアを目指しているという事です。
機構制御を割り込み処理内でプログラミングするというのもその一つです。


※rot_rdq(tskpri)  iTronのシステムコールの一つでtskpriで指定された優先順位の先頭タスクをレディー・キューの最後につなぎ替えます。 rot_rdq()の使い方の間違いに関しては別のエントリーにて解説します。
SQLServer で突然遅くなった時の対処法 (統計情報更新 WITH FULLSCAN)

## 背景

いつもは数秒で終わる SQL が何時間もかかる・・。CPU 負荷はそこそこ高い。
[sys.dm_exec_requests](https://docs.microsoft.com/ja-jp/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-requests-transact-sql?view=sql-server-ver15)  で last_wait_type を見ると [SOS_SCHEDULER_YIELD](https://docs.microsoft.com/ja-jp/sql/relational-databases/system-dynamic-management-views/sys-dm-os-wait-stats-transact-sql?view=sql-server-ver15) と出ている。
そして 1 - 2 日もすると自然に収束してしまう・・。

そんな時は効率の悪い実行プランが生成されているのかも？
統計情報更新すると改善されるかもしれません。

## クエリ

~~~sql
-- テーブルごと
UPDATE STATISTICS SAMPLE_TABLE;

-- または、全テーブルまとめて
sp_updatestats;
~~~

ただしこの統計情報更新、サンプリングの割合というものが存在し、オプションを指定しない場合、既定でサンプリングしたデータが使用されるそうです。
なので上記で改善が見られない場合は、FULLSCAN (SAMPLE 100 PERCENT) でやってみると良いかもしれません。

~~~sql
-- テーブルごと (フルスキャン)
UPDATE STATISTICS SAMPLE_TABLE WITH FULLSCAN;
~~~

私の場合、上記をトランザクション系のテーブルに絞って実行してみました。
フルスキャンにすることで更新にかかる時間が 30 分から 2 時間ほどになりましたが、事象発生数が激減しました。

## ここまでの道のり

今まで sp_updatestats での統計情報更新や INDEX 断片化の解消、DB のスペックアップ、地道な INDEX 貼りや SQL チューニングに取り組んできましたが、抜本的解決には至らず・・。

半年間悩まされ試行錯誤しましたが、最後は MS (Azure) のサポートの方と何回かやり取りし、解決することができました。
親身になって相談にのって頂き大変感謝しております。

本記事が同じ問題で悩んでいる方の参考になりましたら幸いです。

## 補足

AUTO_UPDATE_STATISTICS という、テーブル全体の約 20% が更新されると自動で統計情報更新してくれる機能がデフォルトで ON になっているのでユーザー側で統計情報更新をしなくても大丈夫かなと思っていたのですが、やはり使われ方によるようですね。

>統計情報の自動更新オプション (AUTO_UPDATE_STATISTICS または AUTO_UPDATE_STATISTICS_ASYNC) が ON に設定されている場合であっても、UPDATE STATISTICS や sp_updatestats を実行して明示的に統計情報を更新する必要がある場合はあります。

## 参考

- [統計情報の自動更新が ON の時には統計情報を手動で更新する必要はない？](https://docs.microsoft.com/ja-jp/archive/blogs/jpsql/on-12)
- [SQLServer: 現在実行中クエリのリアルタイムトラブルシューティング](https://qiita.com/maaaaaaaa/items/83e4f984e63fee4dae34)
    - トラブルの度に大変お世話になりました。ありがとうございます！
- [UPDATE STATISTICS (Transact-SQL)](https://docs.microsoft.com/ja-jp/sql/t-sql/statements/update-statistics-transact-sql?view=sql-server-ver15)
- [sp_updatestats (Transact-SQL)](https://docs.microsoft.com/ja-jp/sql/relational-databases/system-stored-procedures/sp-updatestats-transact-sql?view=sql-server-ver15)
[python] 商と剰余の取得

## 商と剰余を同時に取得してみる

### ポイント
- ```divmod```を使う


```python
n = 3
cnt = 10
quot, mod = divmod(cnt, n)
#商
print(quot)
#剰余
print(mod)
```

```
>>> #商
>>>
>>> print(quot)
3
>>> #剰余
>>>
>>> print(mod)
1
>>>
```

## 商と剰余を別々にとってみる
### ポイント
- 商　```//```
- 剰余　```%```

```python
n = 3
cnt = 10
#商
print(cnt // n)
#剰余
print(cnt % n)
```
```
>>> #商
>>>
>>> print(cnt // n)
3
>>> #剰余
>>>
>>> print(cnt % n)
1
>>>
```
rocket.chatをEC2上でつかう

昨今の時勢でチャットツールをちょこっと用意したいと思ったので作ってみたメモ書きです。

# 構成

- AmazonLinux2
- t2.microインスタンス

EC2ユーザーデータを用いてパパっと立てます。
私の要望上、使い終わったらすべてのデータを毎回削除して使いたい。というちょっと特殊な事情もあったのでdocker使ってます。

`NWやSGの設定はよしなに`
ALBとACM挟んでHTTPS化とかもできるのでそのへんはよしなに

# docker-compose.yml
rocket.chatのページにあったものをちょこっと書き換えて使用。
volumeの部分を削除して使う＆hubotいらないのでそのへんを削除して使用してます。

```yaml:mongo
    volumes:
     - ./data/runtime/db:/data/db
     - ./data/dump:/dump
```

```yaml:rocketchat
    volumes:
      - ./uploads:/app/uploads
```


# スクリプト

```bash:user-data
#!/bin/bash
amazon-linux-extras install -y docker
yum install -y git
systemctl enable docker
systemctl start  docker
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
gpasswd -a ec2-user docker
systemctl restart docker

# rocket.chat
cat << _EOF_ > /home/ec2-user/docker-compose.yml
version: '2'

services:
  rocketchat:
    image: rocketchat/rocket.chat:latest
    command: >
      bash -c
        "for i in `seq 1 30`; do
          node main.js &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"
    restart: unless-stopped
    environment:
      - PORT=3000
      - ROOT_URL=http://localhost:3000
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
    depends_on:
      - mongo
    ports:
      - 3000:3000
  mongo:
    image: mongo:4.0
    restart: unless-stopped
    command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1
  mongo-init-replica:
    image: mongo:4.0
    command: >
      bash -c
        "for i in `seq 1 30`; do
          mongo mongo/rocketchat --eval \"
            rs.initiate({
              _id: 'rs0',
              members: [ { _id: 0, host: 'localhost:27017' } ]})\" &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"
    depends_on:
      - mongo
_EOF_

cd /home/ec2-user
docker-compose up -d
```

起動後、`http://InstanceIP:3000/`にrocket.chatのアプリがバインドされます。
使い終わったら `docker-compose down`また使う際は `docker-compose up`すれば毎回初期化されて使えます。



# 参考
https://docs.docker.com/compose/install/
https://rocket.chat/docs/installation/docker-containers/docker-compose/
Docker Desktop 裏技プロキシ設定

###社内開発だとプロキシ環境下でDocker Desktopを利用することも多いと思います。

プロキシ設定で手こずったので、裏技かどうかわかりませんが
色んなところで応用が利くんじゃないかと思い、メモ代わりに投稿します。

````
http://host.docker.internal:3128
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/5698d4d1-7a23-e6f9-0215-1142630582bf.png)


設定画面とは別に config.json ファイルを編集する。

「C:¥Users¥ユーザー名¥.docker¥config.json」

.dockerフォルダが生成されていない、または config.jsonファイルが生成されていない場合は自分で作成すればいい。

編集内容

```json:config.json
{
    "proxies":
    {
        "default":
        {
            "httpProxy":"http://host.docker.internal:3128",
            "httpsProxy":"http://host.docker.internal:3128",
            "noProxy":"127.0.0.*"
        }
    }
}
```

編集後は、Docker Desktopを再起動してプロキシの設定を反映。（完了）


CNTLMと併用して利用しています。

CNTLMのダウンロード先は[こちら](https://sourceforge.net/projects/cntlm/files/)
CNTLMの設定方法については[こちら](https://qiita.com/takuma-jpn/items/8db6b135f2723a02498b)
CNTLM利用コマンド一覧は[こちら](https://vijiboy.wordpress.com/2018/03/14/configure-cntlm-to-generate-hash-for-your-password-h-and-verify-m/)