OmniAICreator/Qiita-1.07M huggingface dataset:
【GCP】GAEを使ってみる　１回目

【目的】GAEを使ってみる

https://www.topgate.co.jp/gcp05-google-app-engine-run-application
ここでやろうと思ったけど、情報があまりなくわかりづらいので、
目的を果たせるやり方を探してみる。
↓

【参考サイト】https://blog.apar.jp/web/6912/
上記でGoogle App Engineを使ってみる

リージョンを選ぶ　＞　言語を選ぶ

その後は、SDKのインストール方法とかもでる。

App Engine SDK for PHPをインストールする。
WEBアプリケーションはPHPで作成するため。

gcloud components install app-engine-php

入力。したが、以下のwarningがでた。

Update done!

WARNING:   There are older versions of Google Cloud Platform tools on your system PATH.
  Please remove the following to avoid accidentally invoking these old tools:

  /usr/lib/google-cloud-sdk/bin/docker-credential-gcloud
/usr/lib/google-cloud-sdk/bin/git-credential-gcloud.sh
/usr/lib/google-cloud-sdk/bin/gsutil
/usr/lib/google-cloud-sdk/bin/bq
/usr/lib/google-cloud-sdk/bin/gcloud

https://qiita.com/ynozue/items/6a3e4fcdb28b81708fda
ここに同じwarningが出てる人がいる。
ツールが古いので削除してくださいってことだと思う。

https://qiita.com/keitakn/items/241ccd2bc95c2c879735
ここに対応の仕方が乗っている。
何かをインストールした時に、競合ができていたからだと思う。

一旦気にせず進めた

設定ファイルをローカルに作成。

https://cloud.google.com/appengine/docs/standard/php/configuration-files
ここに設定ファイルの詳細が書いてある。

〜〜〜〜〜〜
で、
参考サイトを進めていたが、GAEのページでチュートリアルがあったので、そっちでやってみた。

※注意点
cd /home/t_suzuki/php-docs-samples/appengine/php72/helloworld/
チュートリアルに記載がある内容とディレクトリが異なるので注意。

特に問題なく、デプロイまでいけた。

チュートリアルを最後まですすめればダッシュボードにGAEが表示される。
以下が画面
![Screenshot from 2020-04-02 16:34:12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/232a9b13-2815-4730-336f-5ecd8653f34c.png)

＝＝＝＝＝
GAEとGCEの関係性がわからないのでdigった。


dig our-lamp-272013.appspot.com
;; ANSWER SECTION:
our-lamp-272013.appspot.com. 300 IN	A	172.217.161.84

GCEのIPは以下
http://35.223.236.251/

　　10.0.0.0〜10.255.255.255（24ビットブロック）
　　172.16.0.0〜172.31.255.255（20ビットブロック）
　　192.168.0.0〜192.168.255.255（16ビットブロック）

GAEとGCEとのIPアドレスは異なるみたい。
GAEとGCEは別々のインスタンスを構築しているみたいなイメージになる。

【思ったこと】
ブラウザからコマンドラインを打てるのは便利。AWSにもない機能ではある。
基本的にどの機能も立ち上がりが簡単。
おさえないといけないのは、どうしたらコストを抑えられるか、他サービスとの違いはとかだと思う。
自宅ネットワーク環境構築時に思ったこととか

# 自宅環境について(概説)
![SnapCrab_NoName_2020-4-2_16-28-17_No-00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277982/5fe04ecc-01a2-3076-5967-028f2258f338.jpeg)

* 自宅は訳あって実家の戸建て2階建てとなります(いい加減一人暮らししたい…)
* 画像に記載はありませんが自宅の固定電話がIP電話であり、IP電話対応のルータを所持してないのでAtermのルータから直接繋いでいます。ルータのDHCP機能やNAPT機能もそのまま利用しています。
* 1Fと2Fは有線で接続していますが、1Fエアコンの穴から一度外に出て、2Fエアコンの穴から入ってます。カテ5eの古いやつで、普通に屋内用のケーブルです。これ切れたら死ぬ。

# 無線環境について
* 1Fと2Fの両方にCiscoの11n対応AP(AIR-LAP1142N-P-K9)を置いて、1FにあるWLCでコントロールしてます。
![SnapCrab_NoName_2020-4-2_17-3-49_No-00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277982/fc5664e8-9400-b365-d40b-82f55b9a257d.jpeg)

* 家庭内の機器はほとんどがwlc経由のAPに接続していますが、11nの速度で全く問題ありません。
* 2.4Ghzのみの運用だと、電子レンジを使用した際にブチブチ切れるので、一時期2.4Ghzを無効化していました。が、、簡易的な機器(raspberry pi含む)が5Ghzに対応していないことに気づき、現在は2.4Ghz, 5Ghzともに運用中です。
* YamahaのWLX202が2Fに接続されており、5Ghzのみで運用しています。こちらは11ac対応なので、高速で繋ぐ必要がある機器メインで繋いでいます。将来的に4K動画が主流となった場合は、テレビを11acに接続する必要があるのかなと思ってます。
![SnapCrab_NoName_2020-4-2_17-5-34_No-00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277982/1c1229b7-8025-296c-3e13-55c432491ec3.jpeg)

* 無線APは全てPoEで繋いでいます。

# 10Gbps化について
* 1FのCatalystが10Gbps対応のSFP+ポートを2つ持っているので、それぞれサーバとNASにDACで接続しています。サーバ-NAS間だとほぼ10Gbpsほどの速度が出ますが、他の機器が対応してないので限定的です。
* 全機器を10Gbps化する予定はございません。理由として、ほとんどの通信が1Gbpsで問題ないためです。そもそもInternet側が10Gbpsに対応してないので、イントラネットだけの自己満足の世界になります。

# チーミングについて
* 一部の機器でチーミングを実施しています(楕円で包まれたNWケーブルがチーミング対象です)
* チーミングによって1Gbps -> 2Gbpsになると思いがちですが、色々な理由があって、少なくとも自宅環境ではまず2Gbpsにはなりません。仮に一本が故障した際に、サービスが継続出来るようにするためのものです。

# ASAが内側にある件について
* 自宅環境にCisco AnyConnectでVPN接続することが目的だったので、内側に配置しています。普通であればルータの外側に配置するので、少し特殊な配置方法かなと思っています。(通常はInterfaceにinsideとoutsideがありますが、LAN内設置なのでinsideしかありません)

![SnapCrab_NoName_2020-4-2_17-7-15_No-00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277982/48e15597-c7d1-69b7-03ad-49fd4f5deb81.jpeg)


# その他
* 各機器のファンがうるさすぎて日常生活に支障をきたすレベルなので、低回転ファンに換装することをオススメします。特に1FのCatalyst2960はうるさすぎたので低回転ファンに換装しました。

* データセンタのように常に空調が機能しているわけではないので、夏場は特に温度が上がりがちです。Zabbixなどによる温度管理を行うと共に、必要であれば置き場所の変更やファンの変更、本体上部へ冷却フィンの設置などを考える必要があります。熱暴走による装置故障より何より火事が怖いので、自宅では火災報知器の設置もしております。

![SnapCrab_NoName_2020-4-2_16-47-49_No-00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277982/9e643671-c640-e525-e04d-cb2fca8db9d9.jpeg)
↑サーバについてるiLo付属の外気温計です。最大で34度まで外気温が上がっています。

* コンセントから電源タップなど、電源配線が複雑になる上に、配線自体が熱を持つので、機器本体を含め火事にはお気をつけください。定期的にほこりの掃除と、電源周りの確認(半刺しになっていないかなど)は重要なルーチンワークです。
* ケーブルですが、1Gbps環境であればカテ5eで全く問題ありません。新規敷設をお考えの方はカテ7以上にしておくと、後々に10GBASE-Tに対応させることが出来て良いかなと思います。
* 電気代は月に1万円くらいです。高いですよね。驚きです。
* Wi-Fi6(11ax)の導入については悲観的です。周辺機器含め、自宅環境で導入するにはまだまだコスパが見合わないと思っています。
SikuliXが起動しない（1系から2系への移行時）

# 前置き

Windows10環境が前提の記事です。
そしてJavaをコンパイルしたことがない人が書いてます。

# 起動バッチがないと起動しない

# 起動バッチがないと起動しない

バージョン2.0.0からは、ダウンロードしたjarファイルをダブルクリックするだけで動作するようになりました。
>https://raiman.github.io/SikuliX1/downloads.html から引用
>Just download, move it to a folder of your choice and doubleclick to run it.
>An alternative to run it is from commandline using
>java -jar path-to/sikulix.jar

と言っていますが、1.0.0以上2.0.0未満のバージョンで???setup.jarを使ってインストールを行ったものは、2.0.0以降のバージョンをダウンロードしてきてもダブルクリックするだけでは動作しません。

## 解決

動作させるには、インストールを行った際に自動生成される起動スクリプト「runsikulix.cmd」が必要です。

これが嫌だという人は、`%userprofile%\AppData\Roaming\Sikulix`を削除してください。
コマンドプロンプトで削除するなら、

```
del %userprofile%\AppData\Roaming\Sikulix
```
Powershellなら、

```posh
Remove-Item -LiteralPath $env:USERPROFILE"\AppData\Roaming\Sikulix"
```

# JDK・JREのバージョンは適当に決められない

## 問題

sikulix2.0.4が最新である現在、Corretto8では動作するのに、Corretto11だと動作しないとか、
AdoptOpenJDK11は動かないけどAdoptOpenJDK12だと動作するとか
HotspotOpenJDK11だと動作しなくて、HotspotOpenJDK12だと動作するとかいろいろあります。

>https://github.com/RaiMan/SikuliX1 から引用
>Java 13 (OpenJDK release)
>Java 8 (Oracle) for comatibility test

互換性のためにJava8で動作確認してますが、間のバージョンの動作保証として不十分みたいです。

## 対処法

[chocolatey](https://chocolatey.org/)を使用するとJAVAのインストールからシステム環境変数の設定から、アンインストールまで、CUIで1コマンドでできます。そのため、OSS派生の各種JDKの各種バージョンで動作確認をすることに、それほど心理的抵抗がありません。
[ChocolateyでインストールできるJDK・JRE一覧](https://chocolatey.org/packages?q=jdk)

そのため、互換性あるのかという好奇心から、私もいろいろ試してみています。その中で動くバージョンから自分の使いたいバージョンを使っていくといいと思います。

[OpenJDKのビルド](https://ja.wikipedia.org/wiki/OpenJDK#OpenJDK%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89)それぞれで一度確認して表を作ってみたいなと思っているので出来たら表を追記します。

**Excelsior!**
【GCP】Cloud Source Repositoriesはどうやって使うのがいいのか？

そもそも
Cloud Source Repositories
の使い方をあまり理解してない。
調べてみたら、コンテナと併せて使ったほうが良さそうなので、別途つかってみる。
＝＝＝
CIがポイント↓

コンテナとCloud Source Repositoriesの連携
https://www.casleyconsulting.co.jp/blog/engineer/2101/
コードの管理が容易になるのがメリット

https://www.apps-gcp.com/cloud-build-getting-started/
修正⇛テストの繰り返しが手間になるので、それを解決する。
こういう使い方をすることでクラウドのメリットが増す
ここの図の連携がわかりやすい。
＝＝＝
Cloud Source Repositoriesについて
https://www.logw.jp/cloudserver/9260.html

Cloud Source RepositoriesはGoogleが用意しているgitのツールです。
今までgithubとか外部のツールで管理していたのをGCPで管理できるという事になります。
【Microsoft Intune】Auto Pilot 案件でハマったポイント【パート1.5】

#・パート１の続き。
皆さんこんにちは、アイネットテクノロジーの上口です。
前回お話しした Auto Pilot 案件でハマったポイントパート1の続きで解決方法が見つかりましたのでパート1.5として投稿します。

前回、**device.devicePhysicalIDs -any (_ -contains "ZTDId"))**を登録するよう記載しましたが、

<font color="Red">***(device.devicePhysicalIds -any _ -eq "[OrderID]:Surface Go")*** </font> とルールを変更すれば問題ないことがわかりました。

なーんだと思った人もいると思いますが、ここで、一つ <font color="Red">***落とし穴です。***　</font>

実は、この OrderID（注文書）は手動で入力できないのと、CSVの取り込み時に***OrderID***という属性が存在しません。
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/10de6fcc-3d88-b3fc-9f70-bc4fdb030277.png"width=70%>
#・対応策
OrderIDを使いたい、でもどのようにすればいいのか？
実際色々試してみた結果とサポートに確認した結果ですが　 <font color="Red">***[グループタグ]***　</font>を使用します。

<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/1d2add66-7a9b-1173-d449-68199833bc15.png"width=70%>

そして、また落とし穴です。。。。
実は、このグループタグも手動で入力してもエラーになったり、登録されても実際には反映されてないこともあります。。。

#・ではどうやって登録するの？？？
実際には、CSVで登録するのですが、CSVの中身を見ると、下記の通りの属性がありました。
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/b0f136a2-0a8f-0df7-715a-16f76c3e6bce.png"width=70%>
Device Serial Number,Windows Product ID,Hardware Hash　この Hardware Hash の隣にGroup Tagと追加します。
**変更後：　Device Serial Number,Windows Product ID,Hardware Hash,Group Tag**
そして、このGroup Tag　に 任意の文字列を追加してください。（私の場合はSurface Go）

準備ができたらIntuneにインポートしてください。

#・確認してみましょう
Intuneから確認してもOrderId（注文書）は確認できませんので、Powershellで確認してください。
コマンド：Get-AzureADDevice -objectid (deviceObjectId) | select DevicePhysicalIds -ExpandProperty DevicePhysicalIds
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/7352e468-8eab-d2bb-110c-978a627740e9.png)
これで要件は満たします。

#・まとめ
パート1でお話しした、Ztdidを使用して動的デバイスグループを作成してもよいですが、あらかじめAutopilotプロファイルを分けたいなどの要件がある場合、***今回ご説明したOrderIdを使用してください。***

<font color="Red">***ただ、OrderIdは手動で追加できないため、CSVでGroup Tagを追加しIntuneにインポートしてください。***

それでは、パート２をお楽しみに。

弊社HP
https://www.inet-technologys.com/
plunkerでd3 その2

#概要

plunkerでd3やってみた。
covid-19のcsv読んで、tableにしてみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2db186f5-2333-60b0-2578-359faf59784a.png)


#サンプルコード

```

var url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv";

d3.csv(url, function(data) {
  var th = ['Province/State','Country/Region','Lat','Long','1/22/20','1/23/20','1/24/20','1/25/20','1/26/20','1/27/20','1/28/20','1/29/20','1/30/20','1/31/20','2/1/20','2/2/20','2/3/20','2/4/20','2/5/20','2/6/20','2/7/20','2/8/20','2/9/20','2/10/20','2/11/20','2/12/20','2/13/20','2/14/20','2/15/20','2/16/20','2/17/20','2/18/20','2/19/20','2/20/20','2/21/20','2/22/20','2/23/20','2/24/20','2/25/20','2/26/20','2/27/20','2/28/20','2/29/20','3/1/20','3/2/20','3/3/20','3/4/20','3/5/20','3/6/20','3/7/20','3/8/20','3/9/20','3/10/20','3/11/20','3/12/20','3/13/20','3/14/20','3/15/20','3/16/20','3/17/20','3/18/20','3/19/20','3/20/20','3/21/20','3/22/20','3/23/20','3/24/20','3/25/20','3/26/20','3/27/20','3/28/20','3/29/20','3/30/20','3/31/20','4/1/20'
];
  var table = d3.select("body").append("table").attr("border", "1")
  table.append("thead").append("tr").selectAll("th").data(th).enter().append("th").text(function(d) {
    return d;
  });
  for (var i = 0; i < data.length; i++)
  {
    var td = [data[i]['Province/State'], data[i]['Country/Region'], data[i]['Lat'], data[i]['Long'], data[i]['1/22/20'], data[i]['1/23/20'], data[i]['1/24/20'], data[i]['1/25/20'], data[i]['1/26/20'], data[i]['1/27/20'], data[i]['1/28/20'], data[i]['1/29/20'], data[i]['1/30/20'], data[i]['1/31/20'], data[i]['2/1/20'], data[i]['2/2/20'], data[i]['2/3/20'], data[i]['2/4/20'], data[i]['2/5/20'], data[i]['2/6/20'], data[i]['2/7/20'], data[i]['2/8/20'], data[i]['2/9/20'], data[i]['2/10/20'], data[i]['2/11/20'], data[i]['2/12/20'], data[i]['2/13/20'], data[i]['2/14/20'], data[i]['2/15/20'], data[i]['2/16/20'], data[i]['2/17/20'], data[i]['2/18/20'], data[i]['2/19/20'], data[i]['2/20/20'], data[i]['2/21/20'], data[i]['2/22/20'], data[i]['2/23/20'], data[i]['2/24/20'], data[i]['2/25/20'], data[i]['2/26/20'], data[i]['2/27/20'], data[i]['2/28/20'], data[i]['2/29/20'], data[i]['3/1/20'], data[i]['3/2/20'], data[i]['3/3/20'], data[i]['3/4/20'], data[i]['3/5/20'], data[i]['3/6/20'], data[i]['3/7/20'], data[i]['3/8/20'], data[i]['3/9/20'], data[i]['3/10/20'], data[i]['3/11/20'], data[i]['3/12/20'], data[i]['3/13/20'], data[i]['3/14/20'], data[i]['3/15/20'], data[i]['3/16/20'], data[i]['3/17/20'], data[i]['3/18/20'], data[i]['3/19/20'], data[i]['3/20/20'], data[i]['3/21/20'], data[i]['3/22/20'], data[i]['3/23/20'], data[i]['3/24/20'], data[i]['3/25/20'], data[i]['3/26/20'], data[i]['3/27/20'], data[i]['3/28/20'], data[i]['3/29/20'], data[i]['3/30/20'], data[i]['3/31/20'], data[i]['4/1/20']];
    
    
    table.append("tbody").append("tr").selectAll("td").data(td).enter().append("td").text(function(d) {
      return d;
    });
  }
});




```

#成果物

https://embed.plnkr.co/plunk/2vBSduypV92ULTob

以上。
WindowsにPHPのバージョン管理ツールを導入する。

2020年 4月 執筆
# 背景
いままでWindows10に直にPHP最新版をインストールしていましたが、
ダウングレードを行う必要があったので、バージョン管理ツールを導入することにしました。
せっかくなので、手順を簡潔にまとめました。

当記事は、Scoopというバージョン管理ツールを導入し、PHPのバージョン切り替えができるようになるまでの手順のメモになります。

※当記事ではコマンドラインツールを使用します。特にこだわりのない方は、Windows標準搭載の PowerShell というツールを使うといいと思います。

※Node.jsをはじめ、PHP以外の言語でも対応できるものがあるようですが、当記事ではPHPのバージョン管理のみを目的としています。他言語の場合、意図したバージョンに対応していない場合もあるそうです。

# 手順1. PHPをアンインストール
すでにPHPをインストール済みの場合、Scoop経由で導入したPHPと競合する恐れがあるので、削除したほうが無難です。

**PHPのインストーラがある場合**
1. インストールをダブルクリックして「uninstall」を押す。

**PHPのインストーラがない＆コントロールパネルの一覧に表示されている場合**
1. コントロールパネル > プログラムのアンインストールまたは変更 へ移動する。
2. PHP関連のものを削除する。

**PHPのインストーラがない＆コントロールパネルの一覧に表示されていない場合**
1. コマンドラインツールを立ち上げる。
2. `gcm php | fl`と入力し、php.exeのパスを調べる。（whichコマンドは使えなかったので）
3. php.exeが入っているフォルダを削除する。
4. C:\Windows 配下に php.ini やdll関連ファイルがあれば、それも削除する。

# 手順2. Scoopをインストール
コマンドラインツールを立ち上げScoopをインストールする。

```PowerShell:PowerShell
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```

ここで

```PowerShell:PowerShell
PowerShell requires an execution policy of 'RemoteSigned' to run Scoop.
To make this change please run:
'Set-ExecutionPolicy RemoteSigned -scope CurrentUser'
```

というエラーが発生する場合は、エラーメッセージに記載のあるコマンド叩いて、再びインストールを試みてください。

```PowerShell:PowerShell
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
```

# 手順3. Scoopで過去バージョンのインストールをできるようにする
過去バージョンをインストールできるようにするため、
`versions`というバケットを追加する。

```PowerShell:PowerShell
scoop bucket add versions
```

# 手順4. 任意のバージョンのPHPをインストールする
`scoop search`コマンドで、インストール可能なバージョンを確認する。

```PowerShell:PowerShell
scoop search php
```

`'main' bucket:`という項目に最新バージョン、
`'versions'bucket:`という項目に過去バージョンが表示される。

`scoop install`コマンドを使用して、任意のバージョンのPHPをインストールする。

```PowerShell:PowerShell
scoop install php php55 php71
```

(複数インストールする場合は、上のように半角スペースで区切れば複数指定可能)

# 手順5. PHPのバージョンを切り替える
`scoop reset`コマンドで、任意のバージョンに切り替える。

```PowerShell:PowerShell
scoop reset php71
```
# 補足. PHPの設定ファイルを確認/作成する。

**確認**
設定ファイルを確認する場合は
`C:\Users\ユーザー名\scoop\persist\php\cli\php.ini`を確認する。
（非常に長いファイルなので、コマンドラインに出力するよりも、GUI（エクスプローラー）上で確認するか、PowerShellにvimを導入して編集モードで展開した方がよいです。）

**作成**
設定ファイルを作成する場合は
`C:\Users\ユーザー名\scoop\persist\php\cli\conf.d`に、任意の名前の .ini ファイルを作成する。
GCP CloudFunctionsからCloudAPIを呼び出す方法

PythonのSDKでライブラリ化されてない関数をCloudFunctionsから呼び出したかったが、gcloudコマンドはCloudFunctionsに入ってないので(CloudFunctionsが動くコンピュートノードにgcloudはインストールされていない)CloudAPIを直接呼ぶ必要があった


CloudFunctionsからCloudAPIをRESTで呼びたい場合以下の様に認証をして呼び出すことが出来る

```python
def hello_world(request):
    import google.auth
    from google.auth.transport import requests

    # Get the credentials and project ID from the environment.
    credentials, project = google.auth.default(
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    # Create a requests Session object with the credentials.
    session = requests.AuthorizedSession(credentials)

    # Make an authenticated API request
    response = session.get(
        'https://www.googleapis.com/storage/v1/b'.format(project),
        params={'project': project})
    response.raise_for_status()

    return response.text
```


API単体のテストだと、テストフォームが用意されているので、こちらが便利
https://cloud.google.com/storage/docs/json_api/v1/buckets/list
TouchDesingerの出力をWebカメラに出力する for mac

ZoomやGoogle meetで使うカメラの映像にTouchDesingerの出力を使う方法だ。
SnapCameraもいいけどクリエイター的には自前でエフェクトを用意したい。

## CamTwistのDL
用意するものは[CamTwist](http://camtwiststudio.com/)これをダウンロードしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5390/21fb8c56-5b89-10b1-b749-459270d00b10.png)


## TouchDesingerの設定
[Syphon Spout Out](https://docs.derivative.ca/Syphon_Spout_Out_TOP)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5390/023b63ea-daba-3eba-4eab-38c161ce7500.png)

これを線でつないであげる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5390/28f5a702-b8b7-9025-1130-c717a880552f.png)

## CamTwisの設定
CamTwistを起動してVideo SourceをSyphon
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5390/46b38eec-37fb-6984-5c5e-6c466afa5437.png)

Syphon ServerでTouchDesingerを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5390/1c4f7b7e-b532-d3f2-510f-017142392f80.png)

## ZoomなどVideoチャットツールの設定
カメラをCamTwistのカメラを選択するだけでOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5390/e27bd6d8-42fa-27a3-5110-96c403cb6fb2.png)



それでは楽しいリモートワークを
gitはsshでクローンしろ(自戒)

# 何が起きたの
これまでgitクローンする方法は特に意識してなかったんですが、今回httpでクローンしたところ、cloneもpullもできるのにpushだけエラーが出るという事が起こりました。

httpでクローン

```
$ git clone http://[ドメイン]/hoge.git
```

ファイルを編集し...よし！pushだ！

```
$ git push origin develop
warning: redirecting to https://[ドメイン]/hoge.git/
(中略)
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: the remote end hung up unexpectedly
fatal: the remote end hung up unexpectedly
Everything up-to-date
```

なんでやねん


```
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
```
というエラーでぐぐると、どうもpushするときのサイズが小さすぎるのでサイズ増やせば解決するとのことでしたが、変わらずエラーが出てしまいます。

# 解決
[こちら](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)などを参考にssh設定し、以下コマンドでクローン

```
$ git clone git@[ドメイン]:hoge.git
```

改めてファイルを再編集し、さきほどと同じpushコマンドを実行すると無事成功！やった〜！

今回の解決法はこちらを参考にしました。
https://stackoverflow.com/questions/38618885/error-rpc-failed-curl-transfer-closed-with-outstanding-read-data-remaining

そういえば今回の事象以外でもSSHでクローンしないことで、他のgitコマンドを実行したときに問題になったような...。いろいろ検証不足で恐縮ですが「クローンの方法によって後々問題が発生する」ことを忘れないように自戒も込めて記事にしました。m(_ _)m
tar (child): cannot run bzip2: No such file or directoryとなった時の対応方法

- 環境
    - CentOS Linux release 7.6.1810 (Core)
    - tar (GNU tar) 1.26

# 事象 : `.tar.bz2` を解凍しようとしたら怒られた
Sublime Text 3がバージョンアップしたので新しいのを配置しようとした。
圧縮ファイルの拡張子は`.tar.bz2`だった。解凍しようとしたら怒られた。

```bash
$ tar xvf sublime_text_3_build_3211_x64.tar.bz2
tar (child): cannot run bzip2: No such file or directory
tar (child): trying lbzip2
tar (child): lbzip2: Cannot exec: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
```

# 原因 : `bzip2` コマンドがないから
[tar (child): bzip2: Cannot exec: No such file or directory - Qiita](https://qiita.com/DQNEO/items/6e66675b4c124cb708d7)

## 対応 : `bzip2` コマンドをインストールする
```bash
$ sudo yum install bzip2
[sudo] password for ponsuke: 
Loaded plugins: fastestmirror, ovl
Repository google-chrome is listed more than once in the configuration
Determining fastest mirrors
...省略...
Installed:
  bzip2.x86_64 0:1.0.6-13.el7                                                                                                                                                                                      

Complete!

# 再度回答を試みると解凍できた！
$ tar xvf sublime_text_3_build_3211_x64.tar.bz2
sublime_text_3/
sublime_text_3/python3.3.zip
...省略...
sublime_text_3/Icon/48x48/sublime-text.png
$
```
Blender Scriptを外部エディタ（VS Code）で編集する時の参考サイトまとめ

# きっかけ
検索してもなかなかヒットしなかったので忘れないように書いておきます。Blenderにもエディタはありますが、ログが出なかったりして不便なので、外部エディタを使う方が便利です。
# 方法
まず、こちらのサイトを参考にしてVS Codeに拡張機能を追加します。（コマンドパレットはCtrl+Shift+Pで開きます）
https://reincarnation-plus.gitbook.io/project/blender/scripts/01_vscode_addon
そして、こちらのサイトを参考にして実行します。
https://reincarnation-plus.gitbook.io/project/blender/scripts/05_vscode_send_script
エラー：Gradle sync failed: Cause: invalid type code: 85 の対応[AndroidStudio]

## 概要
- 2～3ヶ月ぶりにAndroidStudioを起動したら、既存、新規を含めてすべてのプロジェクトが動かなくなった件。

- 結論としてはJDKをAndroidStudio内蔵の物に変更したらエラーがなくなって動くようになった。

- イベントログに表示されていたエラーコードは以下になります。
```Gradle sync failed: Cause: invalid type code: 85```

## 引用情報
下記のサイトの内容を参考に対応をした。
[Gradle Sync Failed in Android Studio 3.6 Cause invalid type code :85](https://translate.googleusercontent.com/translate_c?depth=1&hl=ja&prev=search&rurl=translate.google.com&sl=en&sp=nmt4&u=https://stackoverflow.com/questions/60435743/gradle-sync-failed-in-android-studio-3-6-cause-invalid-type-code-85&usg=ALkJrhixS5JabpGvDv5b5fl0iFb89OQtWw)

エラーコードでググっただけなのでもっと詳しい情報もあるかもしれないが対応できたので深くは調べない
## 対応内容
特定のプジェクトだけではなく全てのプロジェクトが一律で動かなくなったので個別のエラーではなく環境の問題であると考える。
イベントログを確認するとどうもgradleの起動（？）に失敗しているらしいので「また、gradleか！」という気分になった。

とりあえず下記のエラーで検索をかけるとトップにそれらしいサイトは出てきたが英語の質問サイトだったので備忘録も含めてここに日本語でも残す。
```Gradle sync failed: Cause: invalid type code: 85```

上記のサイトを機械翻訳をかけた結果AndroidStudio3.5からAndroidStudio3.6にアップグレードで発生している問題らしい。
対応としてはプロジェクトのJDKロケーションを外部のものではなくAndroidStudio内蔵のものに変更するといいとあるので。

以下の手順で対応した。

1. 上部の「ファイル」メニューから「プロジェクト構造」を選択。

<img width="713" alt="無題3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514306/4526e84a-a5be-a4fb-00da-4491f1bce21f.png">
2. プロジェクト構造画面が表示されるので左の一覧の「SDKロケーション」を選択
3. 中央の「JDKロケーション」から「Embedded JDK:～」を選択。「適用」もしくは「OK」を押下して閉じる。
4. gradleのアップグレードが問われるのでアップグレードもしくはインストールを選択。

ここまで進めるとプロジェクトが問題なく動いた。
要はgradleの更新に失敗していると思われるが詳しいことはよくわからんかった。

ちなみに、エラーが直った後にJDKロケーションを元に戻しても問題なく動いたのでやはりgradleの更新に失敗が原因だったのだろう。
（元々OpenJDKを使用していたが戻しても問題なく動いた。）

## 後記
また、gradleか！という感想しか出てこない。
また、よく言われているようにAndroidStudiohはむやみやたらに最新化するものではないという戒めを残さないといけない
（常に最新化しないとは言っていない）

今回は3.5から3.6へのアップグレード固有の問題なので多発はしないと思われる。
願わくばこの記事が不要になるような環境になるよう祈っている
mac上のqemuでARM-cpuな環境を作ってjavaを動かす【結果→失敗】

## 本内容は結果として構築失敗です。備忘録として残します。
最終的にopenJDK(JRE)は動かせませんでした。

↓以下書こうとしてた内容



ちょっとARMなCPUでしか動かないバイナリがあり、それをmac上で動かしたかった。
まぁmacはIntelなので当然そのままでは無理。

なので、ARMが載ったPCとかを検討したが新規にインストとかするのがちょっとめんどくさいので、エミュを探すと
QEMUというものがあった。（ちなみにラズパイも所持しているがめんど（

## qemu arm [raspbian]
ということで構築。
最初はカーネルとかダウンロードして起動させようとしたがめちゃ大変＆失敗したので割愛。

なのでこちらを使用させていただいた。
https://github.com/karaage0703/raspbian_on_qemu
https://qiita.com/karaage0703/items/366eb17906a3341f1999
こちらも参考にさせていただきました。ありがとうございます。

sshも使いたかったので、
`sudo raspi-config`でsshを有効に。
qemuコマンドにポートフォワードを追加

```
$ qemu-system-arm -kernel kernel-qemu-4.19.50-buster -dtb versatile-pb.dtb -m 256 -M versatilepb -cpu arm1176 -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -drive file=2019-09-26-raspbian-buster.img,format=raw -no-reboot -net nic -net user,hostfwd=tcp::10022-:22
```
（ちなみにメモリを２５６から増やしたかったが、qemuの制限なのかこれが上限みたい）

`-net nic -net user,hostfwd=tcp::10022-:22`
を追加した。
これで`localhost -p 10022`でsshがつながるようになった。


## ディスク拡張
そういえばデフォルトだとディスクサイズが小さいので、`apt`とかがサイズ無いよ、って止まる。
なのでimgを拡張
`qemu-img resize 2019-09-26-raspbian-buster.img +4G`
で起動して`fdisk`と
`sudo resize2fs /dev/sda2`



そこで元々の要件、javaを動かすことだったが、これからが大変。

## java
そのままだとjavaがエラーを吐いて動かない。
`Server VM is only supported on ARMv7+ VFP`
↑こんなエラー

なので色々な記事を参考にしつつ、構築していく。
まずは今のjavaを削除しまくる。(apt removeとかで)

それでもなんか残ってたので、
`which /usr/bin/java` `ls -la /usr/bin/java`
とかでjavaの実体を探す。
`/usr/lib/jvm/java-9-openjdk-armhf/bin/java`
だいたいこのあたりにあるはず。
`dpkg -S /usr/lib/jvm/java-9-openjdk-armhf/bin/java`
で詳細
`openjdk-9-jre-headless:armhf: /usr/lib/jvm/java-9-openjdk-armhf/bin/java`
とあったので、`apt remove openjdk-9-jre-headless`
で消す。

そして再インストールなど行うが、結局上記エラーメッセージが出るだけでJavaを動作させることはできなかった。
諦めて別の方法を模索することとした。
本番環境で画像が表示されない

##ローカルで表示された画像が本番環境だと表示できない

localhostの時は表示されていた画像がデプロイした本番環境だと表示できず、altの文字だけが表示されてしまう状態になりました。
画像は**app/assets/images**の中に保存されてあります。
画像のpathがおかしいのかな？と狙いをつけて調べたところ解決できたので、記事にします！

元のコード

```erb
<img src="assets/MHW.jpg" alt="ゲーム画像１">
```

修正後のコード

```erb
<%= image_tag asset_path("MHW.jpg", alt: "ゲーム画像1") %>
```

自動デプロイの際に画像がコンパイルされ、パスが変わるのが原因のようです。
背景画像が表示できない場合は、下記を参照してみてください。

元のコード

```scss
img {
  background-image: url("MHW.jpg");
}
```

修正後のコード

```scss

img {
  background-image: image-url("MHW.jpg");
}
```

画像が表示されないエラーはよくあるので、今後も何か発見があれば記事にしていきたいと思います。
以上、ここまで閲覧していただきありがとうございました！！
貴方に向いた端末は

#じゃあまず使用方法を教えてくれるかな

|使用方法|Windows|MacOSX(MacBookシリーズ)|iPhone|Android(スマホ)|Android(タブレット)|iPad|ChromeBook|　　　　　備考　　　　|
|---|---|---|---|---|---|---|---|---|
|ブラウジング|〇|◎|△|△|◎|◎|◎|広い画面でUIが使いやすいとブラウジングしやすい。性能とかより機動性が大事|
|動画編集|×~◎|◎|△|×~△|×~〇|△~◎|×~△|性能が低かったり画面が小さいと厳しい。|
|電子書籍|△|〇|△|△|◎|◎|×~◎|ChromeBookを買うときはAndroidアプリ対応機種を買うこと。|
|絵を描く|△|〇|△|×～△|△~◎|〇~◎|×~△|動画編集ほどではないが性能が必要|
|ゲームをする|△~〇|×~△|〇|△~◎|△~◎|〇~◎|×|もしあなたがゲームを楽しみたいのなら機動性や可用性が優れたハイエンドタブレットorハイエンドスマホのどちらかが必要。Windowsはエロゲは揃いが良いらしいがそれ以外(特にゲーム性の良いゲーム)はタブレットやスマホと比べると劣る。ChromeBookはゲームが苦手。|
|Office|〇|△|×|×|△|△|◎|間違いなく一番この用途ではChromeBookが使いやすい。|
|コスパ|△|×|×|〇|◎|△|◎|Google系がオープンソースであるためかコスパが良い|
|電話|×|×|◎|◎|△|△|×|これは携帯電話から派生したスマホが良い|
|初期ソフトウェア|×|◎|◎|〇|〇|◎|〇|WindowsはAndroidより要らない初期アプリが多すぎる。無駄にお金がかけられていると思うとイライラする。|
|セキュリティー|×|◎|〇|〇(野良アプリ(GooglePlayStore以外から入手したアプリ)を使用したときは×)|〇(野良アプリ(GooglePlayStore以外から入手したアプリ)を使用したときは×)|〇~◎|◎|Windowsはアプリストアが貧弱すぎるため基本的にインターネット上からのダウンロードとなる|
|プログラミング|〇|◎|×|×|×|×|◎|ChromeBookはプログラミングでも案外使いやすい|
|各種3DCGソフトウェア(Blender等)|△~◎|〇~◎|×|×|×|△~〇|×|Blender等を触りたければChromeBook以外のPCを買いましょう|

こちらの記事に質問させてもらいました。
>【スマホVSパソコン】ハイスペックスマホにお金をかける時代は完全に終わった！
　https://www.digigaze.com/pc-vs-phone

>人形百合姫(私):
2020年3月23日 21:21
これも用途による気がします。
ゲームをするならスマホ、動画編集等をするならPC、効率よくメモを取りたい、Office系ソフトを使いたいならChromeBook(Google製の手軽なノートPC)にそれぞれ金をかけるべきだと思う。ChromeBookならコーディング(MarkDown,HTML,CSS,PHP,JavaScript,C#等)ができるし、Google Playがあると、電子書籍を読めたりするし、ハイエンドでも安いので、PC代わりにもなり、大体の作業はこちらで代用可能です(ゲームと動画編集、3DCGソフトは無理諦めましょう)。

>> 返信
上田 龍上田 龍 より:
2020年3月31日 23:54
確かにその通りだと思います。
コメントの人形百合姫様はパソコンやスマホの知識が豊富であるようですが、当記事は最新iphoneなどを購入して機能のうちの10％も使いこなせていない人が多いという現状を知った時に執筆した記事となっています。
使いこなせない機能盛りだくさんな15万円のスマホをショップで契約させられるのであれば
スマホ5万円
パソコン10万円
という選択肢をとったほうは有利に働くことが多いと感じます。
あくまでマクロ的な視点での意見ですので、ミクロ視点だと人形百合姫様の意見が必要な方が多いのも事実です(‘◇’)ゞ
コメントありがとうございました！

ゲームをする場合ハイエンドスマホまたは[ゲーミングスマホ(ゲームに特化した高性能アンドロイドスマホ)](https://dic.pixiv.net/a/%E3%82%B2%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B9%E3%83%9E%E3%83%9B)もしくはハイエンドタブレット端末(できればiPad pro)があれば快適。
[WKwebview]Monaca+Iosでデバッグビルドしたアプリがスプラッシュ後、画面が真っ白になる

## MonacaでWkwebviewを利用してデバッグビルドしたアプリをiphoneで実行したときに画面が真っ白になってしまう
上記の現象に遭遇したので、そのときの解決策を記載します。

前提条件
・AndroidやcloudIDEでは動作している
・iphoneで動作しない
・WKWebViewを利用している

最初に結論から言うと、HTMLを取得する際のXHRでエラーとなっていました。
iphoneのログを見ても特にエラーは出てませんでした。

3/31に公開されたプラグイン、"Custom Scheme"を追加すると起動するようになりました。

追加方法
CloudIDEの[設定]→[cordovaプラグインの管理]を開き
検索窓に[Custom Scheme]と入れて有効にします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400312/3ed193ad-e885-9fd6-d6d1-2fcfb10339e1.png" width=50%>

これだけで起動するようになりました。

"Custom Scheme"プラグインが公開されるまでは
"cordova-plugin-wkwebview-file-xhr"プラグインを入れていたのですが、私の場合、初回起動はしたものの、2回目以降の起動で画面が真っ白になる現象が再発してしまっていたので、"Custom Scheme"を使っています。


初心者なので、何か間違っていること等あればご指摘ください<(_ _)>
深層学習／強化学習

#1.はじめに
　今回は、強化学習について簡単にまとめる。

#2.強化学習とは？

![スクリーンショット 2020-04-02 13.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/7ad4f2b3-c4f3-bd80-f895-2982562e0f21.png)
基本的な進め方
① 最初は何もわからないのでランダムに行動
② 何ステップか行動するとそのうち報酬が手に入る
③ 報酬が手に入ったら「今までの行動は良い行動だった」と学習する
以上を繰り返します。

**1)方策(Policy)**
　どの行動をとるかは、「過去どんな状態だったか」を入力、「どの行動をとるべきか」を出力する関数だと考えて方策（Policy）と呼びます。

**2)ε-greedy** 
　過去の経験から一番良さそうな行動をするのを**利用(exploration)**、まだやったことのない行動をするのを**探索(exploration)**と呼び、トレードオフの関係にあります。利用のみ行うのを**greedy**と言い。確率εで探索し、確率1-εで利用をするのを**$\epsilon$-greedy** と言います。

**3)割引率**
　強化学習では確率的に行動を選択して確率的に報酬が貰えるので、将来の見込みはそんなに信用できません。そのため将来の価値はある程度割り引いて考えるべきで、これを割引率と言います。割引率rは、0に近いほど目先の報酬しか重視せず、1に近いほど未来のことを見越すことになります。

#3.Deep Q-Networks(DQN)
　DQNは、強化学習に深層学習を適用して成功した1つの例で、今までQ学習にDNNを使った時に学習が不安定になる問題点を解決しました。ポイントは3つ、

![スクリーンショット 2020-04-02 13.35.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/66fb276b-5e55-09dd-0396-ac28540261d4.png)


**1)Experience Replay**
　強化学習はデータが時系列のためデータ間に強い相関があり(独立性がなく)、短時間では値がほとんど変化がなく学習が上手く進みません。そのため、エージェントが経験した状態・行動・報酬・遷移先を一旦メモリに保存し、損失の計算を行う際には、メモリに保存した値からランダムサンプリングを行います。この手法をExperience Replayと言います。

**2)報酬のクリッピング**
　どれだけの幅(スケール)で報酬を与えるかはタスクによって大きく異なります。そこで、報酬の価値を[-1. 1]の範囲に制限することで学習を安定させます。当然ながら、報酬の大小を 区別できなくなるデメリットはありますが、学習が安定するメリットの方が DQN においては大きいです。この手法を報酬のクリッピングを言います。

**3)Target Q-Network(Fixed Target)**
　価値関数Q(s,a)は見込みなので常に変化します。そうすると入力が同一なのに出力が変化することが起こり学習が不安定になります。そのため、ミニバッチを取ってきてその計算している間は価値関数の重みパラメータを固定しておきます。そして、ミニバッチが全部終わったら今までの更新分を貯めておいて一括で更新することで、学習を安定させます。この手法をTarget Q-Networkと言います。
MacにGrADSをインストールする

# GrADSとは？
GrADSとはGrid Analysis and Display Systemの略で、気象学・気候学など地球科学関連のデータを可視化するための対話式ソフトウェアです。

気象系企業で働いていた頃はよく使っていたのですが、しばらく使っていなかったらコマンド類はすっかり忘れてしまいました(笑)。

今まではLinux系OSで使っていたのですが、今回初めてMacにインストールしてみて、うまくインストールできなかったので、記事にまとめて残したいと思います。


# 前準備
MacでGrADSを動かすには、Mac用のX11が必要です。事前に[XQuartz](https://www.xquartz.org/)をインストールします。


# 最新のGrADSをインストールしたが…？
macOS用にビルドされたGrADS最新版を、[GrADSホームページ](http://cola.gmu.edu/grads/)からダウンロードします。この記事を書いている時点では、2.2.1が最新でした。

さてダウンロードした **grads-2.2.1-bin-darwin17.5.tar.gz** を適当なディレクトリに置いて（一般によくある設置場所はありますがここでは触れません）展開し、**/<設置したディレクトリ>/grads-2.2.1/bin/** にパスを通して以上、完了！

…と思っていたのですが、実際にgradsを起動するとこんなエラーが発生。。

```
dyld: Library not loaded: /Users/jma/grads/supplibs/lib/libpng15.15.dylib
  Referenced from: /<設置したディレクトリ>/grads-2.2.1/bin/grads
  Reason: image not found
```

何、これ？
**/Users/jma/...**って何？そんなユーザーいないよ？
というかjmaって、**JMA = Japan Meteorological Agency = 気象庁**のことじゃない？？

これは…もしかして、完全に憶測だけど、気象庁の職員の方がGrADS開発に関わっていて、Mac用にビルドした際に自分のローカル設定が入っちゃってることに気づかず配布しちゃったってこと？？？

いずれにしろ、この最新版は使えないってことですか…？


# 最新版をソースからビルドする
仕方がないので、ソースから自分でビルドすることを試みました。GrADSホームページにビルドする方法は掲載されていたので、興味がある方は[こちら](http://cola.gmu.edu/grads/gadoc/supplibs2.html)を試してみてください。

僕自身は…Supplemental Librariesのncursesのコンパイルができず、早々に諦めてしまいました。


# 古いバージョンのGrADSを使う
結局、私は古いバージョンを使うことにして、ここから2.0.2を入手してインストールしました。
ftp://cola.gmu.edu/grads/2.0/

こうして、今度こそとgradsを実行すると、無事になじみあるGrADSのウィンドウを立ち上げることができました。

*<font color=gray>※ちなみにバージョンの2.1も、私の環境ではうまく動作しませんでした。</font>*


# あとがき
今回は昔作ったスクリプトをそのまま使えるのでGrADSをインストールしましたが、なんかもう古い・・・と言ったら語弊がありますがそんな印象もあるので、Pythonあたりで同等の可視化をしてみたいと思っています。

また、そもそもGRIB2を読み込んで任意の要素で可視化できるようなアプリがないか探しています。もし情報ありましたら共有させていただけると嬉しいです。
イメージファイル重ね合わせ

```java

public class ImageTest {

	public static void main(String[] args) throws IOException {
		BufferedImage bufferedImage1 = ImageIO.read(new File("C:\\image_test\\tree.jpg"));
		BufferedImage bufferedImage2 = ImageIO.read(new File("C:\\image_test\\star2.png"));
		
		Graphics graphics1 = null;
		
		try {
			graphics1 = bufferedImage1.getGraphics();
			int x = 2;
			int y = 2;
			graphics1.drawImage(bufferedImage2, x, y, null);
			
		} finally {
			graphics1.dispose();
		}
		
		ImageIO.write(bufferedImage1, "jpg", new File("C:\\image_test\\dst_jpg2.jpg"));
	}

}
１波長ヘンテナで地上デジタル放送を受信してみた


電波を受信するアンテナにはいろいろな用途・形状のものがあります。一番身近なのが魚の骨の形をしたテレビアンテナですが、変わり種にヘンテナというものがあります。変なアンテナ、と言うことで、ヘンテナ、と呼ばれているらしいです。日本のアマチュア無線家が発明したと言われていますが、その動作原理がよくわかっていないとか、いるとか。いわく有りげです。
ヘンテナは構造が簡単な割に性能がいいのが特徴です。また、適当に作ってもそれなりに性能が出るのでDIYに向いています。ヘンテナにはいくつかバリエーションが有るようですが、一番BASICな形のヘンテナを作成してみました。
#ヘンテナの構造
ヘンテナはこのような形をしています。
<img width="265" alt="半波長ヘンテナ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112029/7ae124f7-3b1d-4d4a-0398-1a1c10e5495c.png">
長い辺が1/2波長(※1)、短い辺が1/6波長の長方形で、下の方の1/10波長ぐらいのところに給電点があります。ここをテレビの同軸ケーブルの芯線と被覆につなげて、アンテナの面を放送局の方に向ければ電波が受信できます。長い辺を地面に垂直にすると水平偏波(※2)の電波を受信できます。長い辺を水平にすると垂直偏波になります。水平と垂直を間違えると全く受信できません。ちなみにスカイツリーからの電波は水平偏波になります。

(※1) 波長とは電波の波の長さのことです。受信する周波数で決まります。
`波長(m) = 光速(m/s) / 周波数(Hz)`
NHK総合東京を受信する場合、放送周波数は557MHzなので、真空中の光速を30万km/sとすると、
１波長 ≒ 300,000,000 / 557,000,000 ≒ 0.54m、
54cmぐらいになります。（そうすると、1/2波長：27cm、1/6波長：9cm）
※普通は複数の放送局（周波数）を受信しますので、それらの周波数の中央あたりの周波数を選ぶと良いと思います。

(※2) 屋根の上に立っているテレビアンテナの魚の骨が地面に対して水平に並んでいるならその地域のテレビ電波は水平偏波、垂直なら垂直偏波です。
#１波長ヘンテナ
ヘンテナを２つつなぎ合わせた形をしたのが１波長ヘンテナです。長辺が１波長に延びて、給電点がアンテナの中央に移動しています。
<img width="354" alt="１波長ヘンテナ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112029/8f7fb23c-62e2-9c3d-8ed4-d6ccc52f606e.png">

理屈は理解していませんが、半波長ヘンテナ２個分になりますので、半波長ヘンテナの倍相当の感度になります。（きっと）

#受信感度
東京スカイツリーから直線距離で150km余りの地点ですが、市販のブースターを使って十分な受信感度が得られます。
#設置方法など
ヘンテナは写真のように中央部分をステンレス製ポールに固定しています。このように中央部分に金属があってもアンテナの動作には支障ないようです。ヘンテナのすぐ下にあるのがブースターです。
<img width="206" alt="写真.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112029/5af7c5da-3c47-0121-cb79-c37e2ffde238.png">
ヘンテナの素材として直径1cmの銅パイプを使いました。太めのものを使ったほうが性能が良くなるようです。銅パイプははんだ付けで組み立てています。銅は空気中ですぐに酸化皮膜が出来、腐食しにくくなるようです。実際、野外で１０年近く使っていますが問題ありません。
【VBA】VBAでwavファイル（サウンド）を再生する。

メモとして残します。


#■やり方

標準コードに定義

```vb
Public Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

Public Sub PlaySound()
    Dim SoundFile As String, rc As Long
    SoundFile = Chr(34) & "C:\Windows\Media\Windows Critical Stop.wav" & Chr(34)
    rc = mciSendString("Close " & SoundFile, "", 0, 0)
    rc = mciSendString("Open " & SoundFile, "", 0, 0)
    rc = mciSendString("Play " & SoundFile & "", "", 0, 0)
End Sub

```

#■さいごに
上記は非同期での再生で且つ、対象ファイルのプロセスを最初クローズしてから再生するため、短いSEを流すのに最適です。
【GCP】GCEでhello worldを表示する

【目的サイト】
https://www.topgate.co.jp/gcp04-google-compute-engine-run-application

githubに格納すべきコードがあることを確認。
![Screenshot from 2020-04-02 11:29:02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/be00be21-433b-cfe9-8c18-e828e10a85a3.png)

![Screenshot from 2020-04-02 11:27:36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/83dfcd9c-c141-e27c-b896-1d38a7067b32.png)


GCP ではソースコードの管理に Git を利用するとのこと。

gitコマンドはローカルのPCで打つので、インスタンスにgitコマンドがインストールされてなくても関係ない。

【打ったコマンド】
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
cp -rf python-docs-samples/appengine/standard/flask/hello_world hello_world
cd hello_world
git init .
git add .
git commit -m 'Initial Commit'

このあとはGCPのコンソールのリポジトリページで表示されるコマンド一覧をみていったほうがいい。
gcloud init && git config credential.helper gcloud.sh
gcloud init && git config --global credential.https://source.developers.google.com.helper gcloud.sh
git remote add google https://source.developers.google.com/p/our-lamp-272013/r/test_1
git push --all google

ここまでやってリポジトリに格納されたことを確認した。

リポジトリに保存されたところまではいけたが、IPにアクセスしても表示されない。
apacheは表示されるが。。。
topgateの入門サイトは情報が古いところが多いので、別のサイトを参考にしたほうがいいかも。

↓

リポジトリに入っているが、インスタンスでこれを見れるようになっているかわからない。
ここの機能の理解はもう少し必要


ちなみに、以下のURLからチュートリアルをみれる。https://cloud.google.com/appengine/docs/standard/java/tutorials?hl=ja
⇛App　Standard環境のチュートリアルクリック

↓
【今後やってみてもよいかも】
このサイトとかでgoを使った連携とかができるからこちらを使ってやってみたい。
https://christmas-cookies.hatenablog.com/entry/2018/08/13/193931
https://www.apps-gcp.com/golanguage-on-gce/

こちらはgoogleのクイックスタートドキュメントだが、リポジトリを使ってない。
オススメのやり方では哭いのかもしれない。
https://cloud.google.com/appengine/docs/standard/python3/quickstart?hl=ja
https://qiita.com/miyacomaru/items/276bf4fc4e8a89b76851

【余談】
https://qiita.com/kiyokiyo_kzsby/items/0184973e9de0ea9011ed
Flaskを使ったアプリの開発。
flaskの知識も簡単に必要かもしれない。
json

#jsonとは
jsonとはテキストベースのデータフォーマット
シンプルにデータを記述できるため人間が理解しやすいデータフォーマット
##jsonの形式
{}でくくりその中にデータを書いていく。
書き方は
"name":"田中"
左がkeyで右がvalueと呼ばれるもの

**型と呼ばれるものが６つある**
文字列 ("...")
数値 (123, 12.3, 1.23e4 など)
ヌル値 (null)
真偽値 (true, false)
オブジェクト ({ ... })
配列 ([...])

参考サイト
https://www.sejuku.net/blog/80617
http://www.tohoho-web.com/ex/json.html
【Linux・GCP】Gitコマンド使った時に出たエラー対処した件

https://www.topgate.co.jp/gcp04-google-compute-engine-run-application
ここをやろうとした時に対処した。

【参考サイト】
git initコマンドの使い方：https://www.sejuku.net/blog/71268

【1】
Initialized empty Git repository in
上記はOKだった時の表示。

【2】
git commitした時に以下のエラーが出た。
以下のエラーがでた
git commit -m “Initial Commit”
error: pathspec 'Commit”' did not match any file(s) known to git.

https://teratail.com/questions/161970
こちらを参照。

ダブルコートではなく、シングルでいけばOK

【3】
以下のエラーがでた
 git commit -m 'Initial Commit'

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '***@***')

*はマスクした部分

https://qiita.com/Taylor-U/items/3f329895766e613b3acf
ここで解決した。

要は、gitコマンドに関する設定をしていなかった。

https://note.nkmk.me/git-config-setting/
ここで設定確認、変更ができるみたい。

git config -l
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true

たしかに、これしか出てこなかった。
なので、設定し、add ,commitしなおしたら行けました。

git add .
git commit -m 'Initial Commit'
[master (root-commit) bb4b386] Initial Commit
 5 files changed, 84 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 README.md
 create mode 100644 app.yaml
 create mode 100644 main.py
 create mode 100644 main_test.py

＝＝＝＝＝＝
サブライム3で漢字だけ消したい

⌘command と　⬆️Shift を押します

<img width="267" alt="スクリーンショット 2020-04-02 13.07.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/687b952a-a126-a879-12d9-c6887f0eec9d.png">

で、下記のようにする。

```
[^\x01-\x7E]+
```

<img width="502" alt="スクリーンショット 2020-04-02 13.09.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/70f0d1cd-6c63-d030-6c96-e7f981379b3a.png">

で、全部消えた

<img width="315" alt="スクリーンショット 2020-04-02 13.10.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/a2f85b61-9d70-1f6f-16b0-f75743fde609.png">

参考

https://kantaro-cgi.com/blog/tool/zenkaku-search-in-sublimetext.html
【Linux】Gitコマンド

GCPを使っている時、リポジトリにgitコマンドを使ってあげた。
gitコマンドについて無知だったので、調べてみた。
やろうとしたのは以下。
https://www.topgate.co.jp/gcp04-google-compute-engine-run-application
GCP ではソースコードの管理に Git を利用するとのこと。

gitについて
https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000
今回やるのは、githubに上がっているリポジトリを複製してGCPで使うこと。
要は、ソースコードの管理をするためのコマンド。
図とかもあるので参考になる。

gitの基本コマンドとかもここを読んでおく
https://qiita.com/konweb/items/621722f67fdd8f86a017

併せて、リポジトリについてもおさえておく。
https://www.otsuka-shokai.co.jp/words/repository.html
アプリケーション開発の際に、システムを構成するデータやプログラムの情報が納められたデータベースのことを指す。
GCPのリポジトリにサンプルコードを格納するイメージかな？

＝＝＝＝＝＝＝＝＝＝＝＝

ステージを理解して git をもっと便利に使う：http://daretoku-unix.blogspot.com/2009/08/git.html

・gitの概念
「「stageする」＝「特定の変更内容をindexに登録する」＝「次回コミットに含めるようgitに指示する」」
↑ここがポイント

https://kimromi.hatenablog.jp/entry/2015/08/04/082357
git add　の使い方
ステージング領域に追加し、コミット対象にするコマンドです。

https://tech-blog.rakus.co.jp/entry/20190930/git
commitの使い方

http://www-creators.com/archives/2106
git commitの使い方
WSL Ubuntu18.04にJavaをインストールする

##環境

・ホストOS: Windows10 Home
・仮想OS: WSL Ubuntu18.04 lts
(windows10に導入したwslを利用してUbuntu18.04を導入しています)


##概要
・Javaをubuntu18.04にインストールする。


##手順

① パッケージのアップデート

```
$ sudo apt update
```

② OPEN JREをインストールする

```
$ sudo apt-get install default-jre
```

JREがインストールできているか下記のコマンドで確認します

```
$ java --version
openjdk 11.0.6 2020-01-14
OpenJDK Runtime Environment (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1)
OpenJDK 64-Bit Server VM (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1, mixed mode, sharing)
```

② OPEN JDKをインストールする

```
$ sudo apt-get install default-jdk
```

先ほどと同じようにインストールできているか確認します。javacはJavaコンパイラを扱うコマンドです。

```
$ javac --version
javac 11.0.6
```

① ②ともにバージョン指定をしてインストールすることもできますが、慣れないうちはdefault-jre, default-jdkで最新版をインストールするのが無難だと思います。

③ 環境変数の設定

まずは下記のコマンドでjavaのインストールパスを確認します。

```
$ sudo update-alternatives --config java
There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-11-openjdk-amd64/bin/java
Nothing to configure
```

Javaのインストールパスが/usr/lib/jvm/java-11-openjdk-amd64 であることを確認できました。

続いて 下記のコマンドでbashファイルを開きます。

```
$ vi ~/.bashrc
```

bashファイルに下記の環境変数を設定します。

```
export JDK_HOME = "/usr/lib/jvm/java-11-openjdk-amd64"

export PATH="$JDK_HOME:$PATH"
```

:wq!コマンドで編集内容を保存した後、bashファイルを閉じます。

**※Javaの環境構築について書かれた記事を読むと環境変数を$JAVA_HOMEとしている場合が多かったですが、そうするとVScodeの拡張機能が働かず、不都合に感じました。**

環境変数が設定されているのを確認します。

```
$ echo $JDK_HOME
/usr/lib/jvm/java-1.11.0-openjdk-amd64
```

無事Javaをインストールできました。
Anaconda におけるExecuting transaction: failedの対処法


## エラー内容
```
Preparing transaction: done
Verifying transaction: done
Executing transaction: failed
ERROR conda.core.link:_execute(543): An error occurred while uninstalling package 'defaults::python.app-2-py38_10'.
PermissionError(1, 'Operation not permitted')
Attempting to roll back.

Rolling back transaction: done
```

## 解決方法

```
$ conda update -n base -c defaults conda
```

以上です。
オープン・オンラインコースまとめ

#edx・Open edx
[公式ページ](https://open.edx.org/)
[dockerにインストール](https://edx.readthedocs.io/projects/edx-installing-configuring-and-running/en/latest/installation/install_devstack.html)
[仮想環境にインストール](http://ngi644.net/blog/archives/1354)
[インストールオプション](https://openedx.atlassian.net/wiki/spaces/OpenOPS/pages/60227779/Open+edX+Installation+Options)
##1.Open edxとは
ハーバード大学とMITが共同設立したオンライン学習サイトである、**edx**を支えるプラットフォームのこと。そもそも、**edx**はハーバード大学とMITが2012年に設立したオンライン学習サイトであり、以下のような特徴がある。

1. どこにいても、誰もが質の高い教育を受けられるようにする
2. キャンパスとオンラインでの教育と学習を強化
3. 研究を通じて指導と学習を進める

##2.評価
ヒントや問題バンク、自動質問生成、AIベースのオープンエンドな評価、コードテスターなどの機能を備えたテンプレートが存在するっぽい。
また、コースを修了すると本人確認後に証明書を発行してくれる。

##3.edxの規模
学習者 - 4000万人
コース数 - 2万以上
言語 - 32の言語をサポート
大学 - 世界のハイレベルな大学が使用

また、20を超える政府やNGOがedxを使っている。

#Coursera
[公式ページ](https://ja.coursera.org/)

##1.Courseraとは
4500万人ものユーザを誇るオンラインコース。残念ながら、オープンソースは無さそう。[CourseraのTedプレゼン](https://www.ted.com/talks/daphne_koller_what_we_re_learning_from_online_education?language=ja#t-43626)　こちらが分かりやすかったので、メモとして。

また、Courseraにはプログラミングコードの自動採点機能が存在しており、宿題として作成したプログラムを送信すると自動的に採点され、すぐに結果を知ることができる。さらに、「理解度テスト」と呼ばれるものが存在し、その結果が成績として記録もされる。このように、実際の大学などの授業のようになっていることがCourseraの特徴である。

#UDACITY
[公式ページ](https://www.udacity.com/)
##1.UDACITYとは
UDACITYはedxやCourseraとは違い、大学と連携するのではなく大学教員が個人として参加し、配信する形をとっている。そのため、コース数はほかの2つと比べて少なめである。また、UDACITYは主にプログラミングや機械学習、データサイエンスなど、コンピュータ系の講義に偏っている。
また、開講日も上の2つと違い、自由であることも特徴である。しかし、こちらも営利組織であるためオープンソースは無さそう。
Python lambda Djangoでドヤ りたいけどやめます

# Pythonのlambdaでドヤりたいけどやめる

```
sum(list(map(lambda item3: len(item3), list(filter(lambda item2: item2[0].hoge == 3, list(
    map(lambda item: list(item.huga.all()), list(piyo.all())))))
             )))
```

Djangoのクエリと組み合わせた**どやどや**ラムダ式。

1ヶ月後見ると死ぬのでやめる

```
# データの取得
piyo_list = list(piyo.all())

# 詳細データを取得
huga_list = list(map(lambda item:list(item.huga.all()), piyo_list))

# レベル1,2を取得
hoge_list = list(filter(lambda item: item[0].level == 1 or item[0].level == 2,huga_list))

# レベル1,2の件数を取得
level_list = list(map(lambda item: len(item), hoge_list))

# レベルの合計件数を取得
sum_level = sum(level_list)
```

ドヤりたいのはわかるけどやめときます。
enum（列挙型）がよくわからん

#enumについて
enumぬついて調べて現時点で自分がわかったことをとりあえずメモ...
列挙型は複数の変数に一連の整数値をつけると便利な場合に使用する。
曜日とか都道府県の場合に便利に使えるってことかな？？
列挙型で定義される変数はメンバという
**メリット**
とりあえず便利？？
読みやすくなる？？
といった感じなのかなと思います。
npm runで missing scriptエラーが出た場合

しょうもないことでしたが、かなり遠回りしてしまったので、書いて置こうと思います。

#エラー内容

```console:実行コマンド
npm run dev
```

```console:エラー
npm ERR! missing script: dev
npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/aki/.npm/_logs/2020-04-02T04_04_16_519Z-debug.log
```

#原因
scriptにdevのコマンドがない。
package.jsonに記載がないことが原因らしいため、色々調べて見た。

#解決
結果npm run devを実行するディレクトリが違ったのが原因だった。

しょうもないことで時間が取られてしまった。
解決しないときはpackage.jsonがあるフォルダで実行してるか確認してみよう。
plunkerでtensorflow.js その26

#概要

plunkerでtensorflow.jsやってみた。
関数フィッティングやってみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/0203ad2a-f8f2-187e-5885-d41db50ccd02.png)


#サンプルコード


```


function predict(x) {
  return tf.tidy(() => {
    return a.mul(x.square()).add(b.mul(x)).add(c);
  });
}
function loss(predictions, labels) {
  const meanSquareError = predictions.sub(labels).square().mean();
  return meanSquareError;
}
function train(xs, ys, numIterations) {
  for (let iter = 0; iter < numIterations; iter++) 
  {
    optimizer.minimize(() => {
      const pred = predict(xs);
      return loss(pred, ys);
    });
  }
}
function generateData(numPoints, coeff, sigma = 0.04) {
  return tf.tidy(() => {
    const [a, b, c] = [tf.scalar(coeff.a), tf.scalar(coeff.b), tf.scalar(coeff.c)];
    const xs = tf.randomUniform([numPoints], -1, 1);
    const ys = a.mul(xs.square()).add(b.mul(xs)).add(c).add(tf.randomNormal([numPoints], 0, sigma));
    return {
      xs,
      ys,
    };
  })
}
const a = tf.variable(tf.scalar(Math.random()));
const b = tf.variable(tf.scalar(Math.random()));
const c = tf.variable(tf.scalar(Math.random()));
const learningRate = 0.5;
const optimizer = tf.train.sgd(learningRate);
const numIterations = 100;
const eff = {
  a: 5,
  b: 3,
  c: 2
};
const r1 = generateData(20, eff);
train(r1.xs, r1.ys, numIterations);
const aa = Number(a.dataSync());
const bb = Number(b.dataSync());
const cc = Number(c.dataSync());
var values = [];
for (var i = -1; i < 1; i = i + 0.1)
{
  values.push({
    x: i, 
    y: eff.a * i * i + eff.b * i + eff.c,
    pred: aa * i * i + bb * i + cc
  });
}
const spec = {
  '$schema': 'https://vega.github.io/schema/vega-lite/v2.json',
  'width': 300,
  'height': 300,
  'data': {
    'values': values
  },
  'layer': [{
    'mark': 'point',
    'encoding': {
      'x': {
        'field': 'x', 
        'type': 'quantitative'
      },
      'y': {
        'field': 'y', 
        'type': 'quantitative'
      }
    }
  }, {
    'mark': 'line',
    'encoding': {
      'x': {
        'field': 'x', 
        'type': 'quantitative'
      },
      'y': {
        'field': 'pred', 
        'type': 'quantitative'
      },
      'color': {
        'value': 'tomato'
      }
    }
  }]
};
vegaEmbed('#vis', spec);






```

#成果物

https://embed.plnkr.co/plunk/2EjfhtHI6bnXy8pO

以上。
supervisor+cron環境でログをdocker logsで確認する方法

# 目的
コンテナ内のcrondログをdocker logs <コンテナID>で確認する。

# 必要ソフトウェア
- docker
- centos7
- cron
- supervisor

# 環境作成

```text:Dockerfile
FROM centos:7
WORKDIR /root
RUN set -x && \
    yum install -y initscripts && \
    yum install -y rsyslog && \
    yum install -y logrotate && \
    yum install -y cronie && \
    yum install -y supervisor && \
    localedef -f UTF-8 -i ja_JP ja_JP
CMD ["/usr/bin/supervisord", "-n"]
```
### crondログをpid1の標準出力にリダイレクト
```text:/etc/cron.d/test
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
*/1 * * * * root echo "aaaaaaaaaaaa" > /proc/1/fd/1 2>/proc/1/fd/2
```
```text:/etc/supervisord.d/test.ini
[program:crond]
command=crond -n
user=root
autostart=true
autorestart=true
```
GASを使っていく中で便利だと思った機能（メモ）

#### 概要
GASを使っていろいろやっていく中で個人的に便利だと思った機能をまとめていきます。

#### キャッシュ
GASの処理を高速化する中で必要になって来るのがGASメソッドの呼び出し回数をいかに減らすか。。
特にカスタム関数に関しては30秒という制約が契約プラン問わずあるので複雑な処理を実装した際にとても助かりました。
https://qiita.com/golyat/items/ba5d9ce38ec3308d3757

#### コールバック関数
クライアント側からサーバー側のメソッドを呼び出すことが出来るのでUI操作の必要な分岐処理など使い道は様々。
https://tonari-it.com/gas-web-app-google-script-run/

#### V8 Runtimeのサポート
機能と言うわけではないですがこの変更が入ったことで幅が広がりました。
https://officeforest.org/wp/info/google-apps-script%e3%81%8cv8-runtime%e3%82%92%e3%82%b5%e3%83%9d%e3%83%bc%e3%83%88/
dockerメモ

■docker hub
https://hub.docker.com/

Windowsの場合、相性が悪いかもしれない。

■
Docker hub?にあるイメージをローカルに持ってくる
docker pull mysql:5.6

イメージ一覧
docker image ls 

docker run -d -e MYSQL_ROOT_PASSWORD=password --name mysql5.6 mysql:5.6

docker ps

docker stop コンテナID

docker ps -a


docker start コンテナID

docker restart コンテナID

設定情報確認
 docker inspect コンテナID

フォーマットオプションをつけて、IPアドレスを抜き出す方法
docker inspect コンテナID  --format '{{ .NetworkSettings.IPAddress }}'

docker inspect 0f2d9adec7e4  --format '{{ .NetworkSettings.IPAddress }}'


Docker コンテナ削除　
docker rm コンテナID

docker rmi イメージID

ビルド
docker build -t php .

docker run -d -p 80:80 --name php php:latest

docker exec -it コンテナID /bin/bash
docker exec -it 4c241c04f1b3 /bin/bash

入ったコンテナから出る
exit

docker-compose.ymlが見えるところで
docker-compose up -d


docker rm $(docker ps -aq)
Image 全消し
docker rmi docker images -q



```
$ docker cp dump.sql mydocker_db_1:/tmp/dump.sql
$ docker exec -it mydocker_db_1 /bin/bash
$ mysql -u USER_NAME -p -h HOST_NAME DB_NAME < /tmp/dump.sql
```
UIRefreshControl使ってみた

RXとMVVMでUIRefreshControlを使ってみる。

#import系
```ruby:podfile
import RxSwift
```

まず、View側にrefreshControlとViewModelのインスタンスを用意

```swift:ViewController
var viewModel: HomeViewModel = HomeViewModel()
let refreshControl = UIRefreshControl()

  override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    viewModel.tryRefresh(refreshControl: refreshControl,tableView:tableView)
  }
```
ViewModelに動作系を書く。

```swift:ViewModel
import RxSwift
//〜略〜
private var disposeBag = DisposeBag()

  func tryRefresh(refreshControl: UIRefreshControl,tableView: UITableView){
    refreshControl.rx.controlEvent(.valueChanged)
    .subscribe(onNext: {[weak self]_ in
//動かしたいfunctionを呼ぶ。(ネストが嫌ならカスタムしてください。)
      {
       refreshControl.endRefreshing()
       tableView.reloadData()
       }
    }).disposed(by: disposeBag)
  }
```

これで期待通り動くと思います。
refreshControlはtableで使うよなあ、と思ってこんな感じになったのですが、ご指摘あればコメントください。
MVVMも最近になって勉強を始めた状況なので、使い方変かも。

 refleshControlカスタムしたいかたは、ViewControllerに以下のように書いてみてくださいね！

```swift:ViewController
///refreshControl
///- Returns:refreshControlerCSS
  func CSSrefleshController(){
//    refreshControl.tintColor = .white　←指定したい色。extensionで色つくってるので、以下のようになっています。
//    refreshControl.attributedTitle = NSAttributedString(string: "入れたいコメント")←これも拡張してるので、以下のようになっている。
    refreshControl.tintColor = Color.main
    refreshControl.attributedTitle = NSAttributedString(string: "Updating".localizedString() ?? "update")
    tableView.addSubview(refreshControl)
  }
```
上記をdidroadで呼んであげれば完成ー！
拡張の中身なしに書いてしまいましたが、気になる方はコメント頂ければお見せしますー！