OmniAICreator/Qiita-1.07M huggingface dataset:
MQL5-単純な制御 if 6

#はじめに
この記事は以下リンクのYoutubeビデオを翻訳したものになります。よければそちらもご覧ください。

https://www.youtube.com/watch?v=Utr4IBg7FPQ&list=PLV8YK-9p3TcOmgAFIjntw-GxOJoHp9xwc&index=8&t=221s

前回記事 は以下です。

https://qiita.com/James_KW/items/a96a244a3a96267a3102

#もし？
トレードを実行する際には必ず特定の条件に当てはまったときに、注文と決済をする。たとえば。「もし現在の値動きが単純移動平均線を抜けたら買い注文」などである。
MQL5でこれを実装するにはif文を使うのがもっともわかりやすい。

#if文
if文の構造は以下のとおりである。

```cpp
if( 条件 )
  //"条件"を満たしていたら実行される処理
else
  //"上限"が満たされていなかったら実行される処理
```

1行目のかっこの中に上限を入れる。条件とは何かと何かが等しいとかどっちかのほうが大きいとかである。たとえばaが4より大きいと書きたかったら

```c
if(a>4)
```

と書けばいい。条件を満たしたり満たさなかったりで、前半の処理が動くか後半の処理が動くか変わる。

#実際に動かしてみる。
いつものようにOnTick関数で試してみよう。新規作成からファイルを作ってOnTick()以外はすべて消して作業しよう。

```c
void OnTick()
  {
   int a = 3;
   
   if (a < 4)
      Comment("a < 4");
  }
```

このコードは変数aに3を代入した後に、aの値が4より小さいかどうかを調べている。
ではコンパイルして実行してみよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96388/185c0a48-51ea-ada6-1a06-2beaa5f9e6b9.png)

ここで変数aの中を5に変えたらどうなるか。
なにも表示されなくなるはずである。試してみよう。

条件に入れる式として使える記号は以下のとおりである。

< 大なり
> 小なり
== 等しい
!= 等しくない
<= 大なりイコール
>= 小なりイコール
Rで文字列中の旧字体を新字体にまとめて変換する

何かパッケージとかあるかなと思ったがなさそうだったので力技で解決した。
`stringr::str_replace_all`で複数のパターンを指定するやり方がわかってなかったのでこれを機に覚えておくことにする。名字の表記ゆれ(渡邉・渡邊・渡辺から渡辺にまとめるとか)とかもこれで解決するとよいか。

漢字一覧は[こちら](https://www.benricho.org/moji_conv/13.html)から拝借した。

[公式のドキュメント](https://www.rdocumentation.org/packages/stringr/versions/1.4.0/topics/str_replace)によると複数のパターンの指定においては、`c("one" = "1", "two" = "2", "three" = "3")`のような名前付きベクトルをpattern/replacementの代わりにに与えるとよいらしい。

[こちらの記事](https://qiita.com/flatsilver/items/be8689a7d348162015a0)も後から見つけた。

```
library(tidyverse)

#旧字体漢字一覧
old_kanji <- "亞惡壓圍爲醫壹稻飮隱營榮衞驛悅閱圓緣艷鹽奧應橫歐毆黃溫穩假價畫會囘壞懷繪槪擴殼覺學嶽樂渴鐮勸卷寬歡罐觀閒關陷巖顏歸氣龜僞戲犧卻糺舊據擧虛峽挾敎强狹鄕堯曉區驅勳薰羣徑惠揭攜溪經繼莖螢輕鷄藝擊缺儉劍圈檢權獻縣硏險顯驗嚴吳娛效廣恆鑛號國黑歲濟碎齋劑冱櫻册雜產參慘棧蠶贊殘絲姊齒兒辭濕實舍寫釋壽收從澁獸縱肅處緖敍尙奬將牀涉燒稱證乘剩壤孃條淨狀疊穰讓釀囑觸寢愼晉眞刄盡圖粹醉隨髓數樞瀨淸靑聲靜齊稅蹟說攝竊絕專戰淺潛纖踐錢禪曾瘦雙遲壯搜插巢爭窗總聰莊裝騷增臟藏卽屬續墮體對帶滯臺瀧擇澤單擔膽團彈斷癡晝蟲鑄廳徵聽敕鎭脫遞鐵轉點傳黨盜燈當鬭德獨讀屆繩貳姙黏惱腦霸廢拜賣麥發髮拔晚蠻祕彥姬濱甁拂佛倂竝變邊辨瓣辯舖步穗寶萠襃豐沒飜槇每萬滿麵默餠歷戀戾彌藥譯豫餘與譽搖樣謠遙瑤慾來賴亂覽畧龍兩獵綠鄰凜壘淚勵禮隸靈齡曆鍊爐勞樓郞祿錄亙灣"

#新字体漢字一覧
new_kanji <- "亜悪圧囲為医壱稲飲隠営栄衛駅悦閲円縁艶塩奥応横欧殴黄温穏仮価画会回壊懐絵概拡殻覚学岳楽渇鎌勧巻寛歓缶観間関陥巌顔帰気亀偽戯犠却糾旧拠挙虚峡挟教強狭郷尭暁区駆勲薫群径恵掲携渓経継茎蛍軽鶏芸撃欠倹剣圏検権献県研険顕験厳呉娯効広恒鉱号国黒歳済砕斎剤冴桜冊雑産参惨桟蚕賛残糸姉歯児辞湿実舎写釈寿収従渋獣縦粛処緒叙尚奨将床渉焼称証乗剰壌嬢条浄状畳穣譲醸嘱触寝慎晋真刃尽図粋酔随髄数枢瀬清青声静斉税跡説摂窃絶専戦浅潜繊践銭禅曽双痩遅壮捜挿巣争窓総聡荘装騒増臓蔵即属続堕体対帯滞台滝択沢単担胆団弾断痴昼虫鋳庁徴聴勅鎮脱逓鉄転点伝党盗灯当闘徳独読届縄弐妊粘悩脳覇廃拝売麦発髪抜晩蛮秘彦姫浜瓶払仏併並変辺弁弁弁舗歩穂宝萌褒豊没翻槙毎万満麺黙餅歴恋戻弥薬訳予余与誉揺様謡遥瑶欲来頼乱覧略竜両猟緑隣凛塁涙励礼隷霊齢暦錬炉労楼郎禄録亘湾"

#旧漢字のベクトル
old_kanji <- str_split(old_kanji,"") %>% unlist()


#新漢字のベクトル
new_kanji <- str_split(new_kanji,"") %>% unlist()
### 1文字ずつに分割したいときはstringr::str_splitで""を指定すればよい

#新漢字のベクトルを旧漢字の名前付きにする
names(new_kanji) <- old_kanji

#例
"旧車會" %>% str_replace_all(new_kanji)

```
Ubuntu20.04にてディスプレイ設定をいじったら黒い画面が現れた

### 環境
OS：Ubuntu 18.04 → 20.04
GPU：GeForce RTX 2070 Super
NVIDIA Driver Version：440

### 事の発端
先日、我が家にも4Kモニターがやってきました
メインPC（Ubuntu 18.04）用として使おうとしたのですが、4Kになって解像度が変わったことでサイズ調整がうまくいかなくなり、せっかくなのでUbuntu 20.04にアップグレードすることにしました

### アップグレード
LTSを跨いだバージョンのアップグレードは初めてだったのですが、以下のサイト参考に何の失敗もなくアップグレードさせることができました

[Ubuntu 18.04(LTS)→20.04(LTS)アップグレード方法](https://qiita.com/hitobb/items/2ee9b1c2c49760976e0f)

### ディスプレイ設定
晴れてアップグレードには成功したのですが、4Kモニターになったということでまあ色々と小さいのでディスプレイ設定を行いました
Ubuntu 20.04からは `設定 > ディスプレイ` において任意倍率のスケーリング項目が追加され、125%や150%といったより細かいサイズ調整ができるようになりました


### 悲劇
ディスプレイ設定をいじっていると画面表示がおかしくなってしまったので、とりあえずリブートしたら悲劇が起こりました

**ログイン後の黒い画面**

### 解決法
設定をいじっていたら起こったことなので、リカバリーモードで起動し新たにテスト用ユーザを作成しログインを試みました

[リカバリーモードについて](https://tkzo.jp/blog/how-to-startup-ubuntu-with-recovery-mode/)

テスト用ユーザでは問題なくログイン後にちゃんと画面が表示されたのでいじった設定が原因であることがわかりました

#### NVIDIAドライバを吹き飛ばして入れ直す
もともと18.04の段階でNVIDIAドライバがインストールされていたので一度アンインストール

```
sudo apt-get --purge remove nvidia-*
```

NVIDIAドライバを入れる手順は以下のサイトを参照
[How to install the NVIDIA drivers on Ubuntu 20.04 Focal Fossa Linux ](https://linuxconfig.org/how-to-install-the-nvidia-drivers-on-ubuntu-20-04-focal-fossa-linux)

リブート後にドライバが機能しているかの確認を忘れずに

```
nvidia-smi
```



#### 汎用グラフィックドライバを使用することも
/etc/X11/ディレクトリ内にXサーバ設定ファイル `xorg.conf` を設定
`xorg.conf` がない場合

```
Xorg -configure
```
/root配下にxorg.conf.newが生成されるので、xorg.confという名でコピーを作成して中身を以下に書き換える
※ 汎用のドライバのfbdevを使用する場合の例

```
Section "Device"
	Identifier	"Configured Video Device"
	Driver		"fbdev"
EndSection

Section "Monitor"
	Identifier	"Configured Monitor"
EndSection

Section "Screen"
	Identifier	"Default Screen"
	Monitor		"Configured Monitor"
	Device		"Configured Video Device"
EndSection
```

[参考](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10159900740)


### おわりに
今回も `ubuntu ログイン後　真っ暗` とかググっていたわけですが、数時間で解決できて良かったです
以前18.04をクリーンインストールした際もNVIDIAドライバを入れ直したりしてた気が…
pythonで表色系変換

## はじめに
研究で表色系の比較を行うことが多いので，表色系変換のコードをまとめてみました．
opencvを使えば1行で実行できます．
しかし，実際にどうやって変換しているのか気になったので，自分でコードを書いてみました．

## 実行環境
python3.6

## RGB→CIE Luv
```python

def convert_luv(img_data):
    """
    Convert RGB to Luv
    """
    img_flat = img_data.reshape(-1, 3)

    red = np.delete(img_flat, [1,2],1)
    green = np.delete(img_flat, [0,2],1)
    blue = np.delete(img_flat, [0,1],1)
    #RGB >>> XYZ
    X = 0.412391*red  +0.357584*green  +0.180481*blue
    Y = 0.212639*red  +0.715169*green  +0.072192*blue
    Z = 0.019331*red  +0.119195*green  +0.950532*blue

    #XYZ >>> u'v'
    cielu = 4*X / (X + 15*Y + 3*Z)
    cielu[(np.isnan(cielu)) | (len(cielu)==float("inf")) | (len(cielu) == float("-inf"))] = 0
    cielv = 9*Y / (X + 15*Y + 3*Z)
    cielv[(np.isnan(cielv)) | (len(cielv)==float("inf")) | (len(cielv) == float("-inf"))] = 0
    uv = np.c_[cielu,cielv]

    #XYZ >>> L*u*v*
    Yn = 100
    un = 0.19793943
    vn = 0.46831096
    L = np.empty((0,1),int)
    for i in Y:
        if i/Yn <= (6/29)**3:
            L = np.append(L, np.array([(29/3)**3 * i / Yn]),axis=0)
        else:
            L = np.append(L,np.array([116 * (i/Yn)**(1/3) -16]),axis=0)

    u_asterisk = 13*L * (cielu - un)
    v_asterisk = 13*L * (cielv - vn)
    Luv = np.c_[L, u_asterisk, v_asterisk]
    return Luv
```

### CIE Lab→HSV
```python

def convert_hue(color_list):
    """
    Convert Lab to HSV
    """
    a = np.delete(color_list,[0,2],1)
    b = np.delete(color_list, [0,1],1)

    h = []
    count = 0
    for ab in color_list:

        a = math.radians(ab[1])
        b = math.radians(ab[2])
        hs = math.atan2(b,a)
        hs = math.degrees(hs)

        if hs < 0:
            hs = hs + 360
            count += 1
        h.append([hs])
    h = np.array(h)
    hue = np.array([])

    for i in h:
        hue = np.append(hue,i)

    return hue
```

## CIE Luv→u'v'
```python

def convert_asteriskuv(color_list):
    """
    Convert L*u*v* to u'v'
    """
    un = 0.19793943
    vn = 0.46831096
    L = np.delete(color_list,[1,2],1)
    u_asterisk = np.delete(color_list,[0,2],1)
    v_asterisk = np.delete(color_list,[0,1],1)
    cielu = u_asterisk / (13*L) + un
    cielv = v_asterisk / (13*L) + vn
    asterisk_uv = np.c_[cielu,cielv]
    return L, asterisk_uv
```

## まとめ
代表的な表色系の変換を行いました．
書いてみて，opencvのありがたさを改めて感じますね．
何かの参考にしていただけると，嬉しいです！
autoitの画像認識が動かないので別のやり方で。

##現状
現在、在庫更新の作業を自動するプログラムを作っています。
その作業の中で「accessのフォームにあるボタンを押す」作業があります。
ボタン画像を認識して、クリックするだけですが画像を認識してくれません。

googleでautoitの画像認識を探すと
こちらのツールを紹介したサイトばかりです。
[ImageSearch Usage Explanation](https://www.autoitscript.com/forum/topic/148005-imagesearch-usage-explanation/)


こちらのツールを入れるとこの関数が動きますが
 _ImageSearch('checkImage.bmp', 0, $x, $y, 0)

設定したbmpが悪いのかうまく認識してくれません。

##別のUDF
世界中のautoitユーザーでも同じように動かない人が多いはずなので
「autoit 　imagesearch 　doesnt work」とgoogleで探すと、新しい画像認識があるみたいです。
（まだ3000DLしかされてないので紹介します。）

[Image Search UDF 2.0.2.0](https://www.autoitscript.com/forum/files/file/471-image-search-udf/)
動作
[![AutoIT ImageSearch](http://img.youtube.com/vi/piJfI0BFrb0/0.jpg)](http://www.youtube.com/watch?v=piJfI0BFrb0)

こちらの中にある
_ImageSearch_Sample.au3で起動させると
「どの画像を認識しますか」と出てくるので画像部分を選択すると、自動でbmpが作られ
下記の設定をもとに動作してくれます。


```ruby:_imagesearch.sample.au3
Global Const $Ask_On_Found = 0　        #画像の座標を出す
Global Const $Mouse_Move_On_Found = 1 　#画像にカーソルを合わせる
Global Const $Mouse_Click_On_Found = 0　#画像をクリック
```

↑のプログラムで生成したbmpを使って
オリジナル関数を_my_image_search_click(path)を作ってみました。
とにかく指定した画像を押せ関数です。

```ruby:_my_image_search_click.au3
#include "_ImageSearch_UDF.au3"
#RequireAdmin

Global Const $Mouse_Click_On_Found = 1
Global Const $iSleep_Time=500
Global $sCount = 0

func _my_image_search_click($_Image_1)
While 1
	Sleep($iSleep_Time)
	$sCount += 1
    Local $return = _ImageSearch($_Image_1)
    If $return[0] = 1 Then
       If $Mouse_Click_On_Found Then MouseClick("left", $return[1], $return[2])
        Exit 0
    EndIf
    Sleep(200)
WEnd
EndFunc
```

都合がよいときに呼び出します。

```ruby:_my_program.au3
#include "_my_image_search_click.au3"
_my_image_search_click("C:\Users\mypc\Desktop\access.bmp")
```

もともとsampleのプログラムで認識ができているので
書き換えたプログラムもうまく起動しました。
めでたし　めでたし。
CentOS 日本ミラーサイト

いくつかあるようです。

> [https://www.centos.org/download/mirrors](https://www.centos.org/download/mirrors)

代表例です
[JAIST](http://ftp.jaist.ac.jp/pub/Linux/CentOS)
[KDDI R&D Laboratories Inc.](http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/)
[NARA Inst of Science and Technology](http://ftp.nara.wide.ad.jp/pub/Linux/centos/)
[Yamagata University](http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/)


例えば、Raspberrypi4向けのCentOSをダウンロードするなら以下

[CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-4-2003-sda.raw.xz](http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos-altarch/7/isos/armhfp/CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-4-2003-sda.raw.xz)

# 参考
[https://www.centos.org/download/mirrors](https://www.centos.org/download/mirrors)
WebRTCのブラウザ対応状況の調べ方

こんにちは、最近業務でWebRTCを勉強し始めたものです。

WebRTC使うぞ！となった時にまず気になるのが自分たちが対応したいブラウザでサポートされているのかという話なのですが、WebRTCはそれが単独のAPIで構成されているわけではなく、またコーデックなども関わってくるので、自信を持って大丈夫と言えるようにまとめてみました。

## WebRTCのAPI
まず WebRTC と一口に言っても window.webrtc みたいなオブジェクトが生えているわけではなく、ブラウザを介したユーザ間のリアルタイムコミュニケーションを実現するためのAPIの総称が WebRTC です。

それを実現するためには大きく二つあって

- 通信に使用するメディア(カメラやマイク)へのアクセス
    - navigator.mediaDevices.getUserMedia() を使って MediaStreams を取得します。
- P2Pでのコネクションの確立
    - [RTCPeerConnection](https://developer.mozilla.org/ja/docs/Web/API/RTCPeerConnection) を使って実現します。

(その他には Audio/Video 以外を通信したい場合は RTCDataChannel が必要だったり、レコーディングや画面共有などの機能を作りたい場合はnavigator.mediaDevices.getDisplayMedia()が必要です)

なので navigator.mediaDevices.getUserMedia() と RTCPeerConnection が実装されているブラウザであればとりあえず実現はできそうです。

### navigator.mediaDevices.getUserMedia() の対応状況
主要なところで言うと iOS 10 以下とIEを切ることができれば大丈夫そうですね。

![スクリーンショット 2020-05-31 11.56.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150569/9c2cfd1b-5ad9-6384-3c9f-124748aab8ba.png)


https://caniuse.com/#feat=stream

### RTCPeerConnection の対応状況
こちらも同様です。

![スクリーンショット 2020-05-31 11.58.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150569/79a3d9cc-261a-c17e-e44f-44be209d08ec.png)

https://caniuse.com/#feat=stream

## コーデックについて

普段Webだけやっている身としては馴染みのない概念ですが、使用するコーデックもブラウザによって対応状況が違うため気をつける必要があります。

MDNに詳しく纏まっているのでこちらをご一読いただけるといいと思いますが、ここでもざっくり解説をします。
https://developer.mozilla.org/en-US/docs/Web/Media/Formats/WebRTC_codecs

### コーデックとは
記事の本筋から逸れるので詳細は省きますが、ざっくり言うと動画データと音声データを通信する際の圧縮/復元を行うプログラム(アルゴリズム？)をコーデックと呼びます。

我々Webエンジニアも gzip したり brotli したりすると思いますが、アレの動画/音声版ですね。
それで「brotli、IEだと解凍できないから使えません😇」みたいなのがコーデックにもある訳です。

### WebRTC で対応しているコーデック

まずブラウザ関係なくWebRTCのRFCを見てみると次のコーデックのサポートが必須となっています。

- Video
    - RFCのURL: https://tools.ietf.org/html/rfc7742
    - VP8, H.264
- Audio
    - RFCのURL: https://tools.ietf.org/html/rfc7874
    - Opus, G.711

各ブラウザベンダーの良心を信じればこれらのコーデックを使用していればとりあえずは動きそうです。

と思いたかったのですが、どうやら Safari ではVP8は iOS 12.1 からの対応みたいです。
[WebRTC コーデックの現状に関する考察 - ボクココ](https://www.bokukoko.info/entry/2018/10/26/210134)
[Safari 12.1 で VP8 と Unified Plan が入る - V - Medium](https://medium.com/@voluntas/safari-12-1-%E3%81%A7-vp8-%E3%81%A8-unified-plan-%E3%81%8C%E5%85%A5%E3%82%8B-47c3aa0cb9eb)

まだまだ記事執筆時点では iOS 12.0 以下のシェアも馬鹿にならないのでコーデックを決める際には注意が必要です。またVP9などのコーデックを使用したい場合には個別に調査を頑張りましょう。

こちらの記事が現状整理分かりやすくされていて良かったです。
[WebRTC の未来 · GitHub](https://gist.github.com/voluntas/59a135343538c290e515)

## 参考
[Getting started with WebRTC](https://webrtc.org/getting-started/overview) <- これ読むとWebRTCがどう動いているかの流れが大体掴めます。 
[Codecs used by WebRTC - Web media technologies | MDN](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/WebRTC_codecs)
[Can I use... Support tables for HTML5, CSS3, etc](https://caniuse.com/#search=webrtc)
[WebRTC の未来 · GitHub](https://gist.github.com/voluntas/59a135343538c290e515)
初心者向けRailsでブログを作ってみるチュートリアルその0

次の回へのリンク: [初心者向けRailsでブログを作ってみるチュートリアルその1](https://qiita.com/zako-pro/items/1b257112d272046cb043)
# これはなに？
Webプログラマを目指す人で、ある程度プログラミングができるようになったけど自分でインターネット上にサービスを公開する方法はわからない...という方向けにRailsでブログを作り、インターネット上からアクセスできるようにクラウドサービス(今回はherokuを利用します[^1])上で公開する方法を書いていきます。
**下の対象者に該当するレベル感の方がこのチュートリアルを全部終わる頃には、最低限一人で一応Webサービスを作れるようになっている予定です**

[^1]: おまけとしてGoogle Cloud Platform上で動かすバージョンも書く予定

# これの対象者
以下のような方々が対象です

- 前提として、Rubyをある程度さわれるようになっている人(今回は文法の説明は含みません)
- Railsがなんなのかはある程度わかっていて、コードを書くお題が欲しい人
- コードを書く以外のWeb開発のいろいろな要素を体験してみたい人
- Github上でPull Requestを出して機能単位でコードを開発するやり方をやってみたい人

イメージ的にはこちらのチュートリアルを少しボリュームを削って、すでに触ったことある方向けにシンプルにしたものを書く予定です。 https://railstutorial.jp/chapters/beginning　

# 今後作っていくお題
ブログを作ってみる、ということでざっくりワイヤーフレームっぽいものを作ってみました。
他の画面や、サイトマップについては次の更新でお見せします(まだ作ってない)

![rails_blog_wireframe-List.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645608/a014f7b4-9a10-b3eb-080b-8e72ca16edb6.png)
macOS Catalinaのアップデートが更新完了しない理由をCUIで確認する

# はじめに

普段使っている Mac のソフトウェア・アップデートが、GUI だといつまでも更新完了にならないので、コマンドで状況を確認します。


# 事象

macOS Catalina 10.15.5 のアップデート案内が来たため、GUI で [今すぐアップデート] を選択し、再起動を伴う処理を実行させても、OS起動後はアップデート前の状態のままである。
特にエラー画面やログについて画面に表示されたりはしない。

<img width="780" alt="スクリーンショット 2020-05-31 10.45.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/171d4198-69d2-98b8-e308-f96d4e5ea678.png">

更新ファイルは、約 3GB のストレージ容量が必要とあるが、ストレージの空き容量は、まだ 12GB 程度余裕がある。

<img width="780" alt="スクリーンショット 2020-05-31 11.02.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/abb8bfc7-f9dd-41f9-17b6-e980a3135058.png">


# コマンド実行

`softwareupdate` コマンドを実行し、アップデート内容を確認します。

```bash:アップデートがあるかを確認
softwareupdate -l
```

この例では、**macOS Catalina 10.15.5** のアップデートがあることがわかります。

```bash:実行結果
Software Update Tool

Finding available software
Software Update found the following new or updated software:
* Label: macOS Catalina 10.15.5 Update- 
	Title: macOS Catalina 10.15.5アップデート, Version:  , Size: 3291647K, Recommended: YES, Action: restart,
```

macOS Catalina 10.15.5 の更新があったので、今回はアップデート内容を全てインストールします。
*オプションを利用すれば、アップデートする項目を個別に指定することも可能です。*

```bash:ソフトウェアをアップデート
softwareupdate -ia
```

```bash:実行結果
Software Update Tool

Finding available software
Not enough free disk space: a total of 14.91 GB is required.
```

実行した結果、ディスク容量が足りないというエラーが出ており、更新のために 15GB の空き容量が必要なことがわかりました。
*3GB ちゃうやん！！*


# 結果

Docker イメージや iMovie などで編集した際の動画編集データなど、無駄なデータを削除し、`softwareupdate -ia`を再実行したところ、正常にアップデートが開始されました。
*ストレージ容量たりないという情報は、わかりやすく GUI でも表示して欲しいですね。。*

```bash:再度コマンドを実行
softwareupdate -ia
```

```bash:実行結果
Software Update Tool

Finding available software

Downloaded macOS Catalina 10.15.5アップデート
Installing macOS Catalina 10.15.5アップデート
Done.
To install these updates, your computer must shut down. Your computer will automatically start up to finish installation.
Installation will not complete successfully if you choose to restart your computer instead of shutting down.
Please call halt(8) or select Shut Down from the Apple menu. To automate the shutdown process with softwareupdate(8), use --restart.
```

再起動が求められているので、再起動を行い、無事に macOS Catalina 10.15.5 へのアップデートが完了です。

<img width="780" alt="スクリーンショット 2020-05-31 13.00.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/3bf1de85-2adf-fa65-2548-5bf71a3e8321.png">



# 外部リンク

- [【Tips】macOSのソフトウェアアップデートをコマンドラインから高速に実行する方法][RefLink1]



[RefLink1]:https://www.softantenna.com/wp/tips/macos-command-line-update/
TensorflowでYOLOv2を動かす

## はじめに
先行研究([DeepStyle: Multimodal Search Engine for Fashion and Interior Design](https://arxiv.org/abs/1801.03002))の環境を再現するために物体検出モデルであるYOLOv2を動かしてみました．
darkflowではYOLOv3を対応していないみたいなので，darkflowユーザーの方に見ていただけると幸いです．


## 実行環境
- Ubuntu：16.04
- GPU：Quadro P5000
- CUDA：8.0
- cuDNN：6.0
- Tensorflow-gpu：1.4.0
- Python：3.6

tensorflow-gpuはCUDA, cuDNNと互換性があるので，以下のサイトで自分の環境にあったバージョンをインストールしてください．
https://www.tensorflow.org/install/source#common_installation_problems

## darkflowインストール手順
1. [github](https://github.com/thtrieu/darkflow)からdarkflowをクローンする．

2. binディレクトリを作成し，binディレクトリにyoloのweightをダウンロードする．
`wget https://pjreddie.com/media/files/yolov2.weights`
3. darkflowをインストールする．
darkflowディレクトリで実行↓
`python3 setup.py build_ext --inplace`
`pip3 install -e .`
`pip3 install .`


## サンプルプログラム実行
READMEの”Using darkflow from another python application”に書かれているプログラムを動かしてみます．
thresholdは
#### コード
```
[test.py]

from darkflow.net.build import TFNet
import cv2

options = {"model": "cfg/yolo.cfg", "load": "bin/yolov2.weights", "threshold": 0.4, "gpu": 0.3}

tfnet = TFNet(options)

imgcv = cv2.imread("./sample_img/sample_dog.jpg")
result = tfnet.return_predict(imgcv)
print(result)
```
#### 実行
`python3 test.py`
#### 結果
sample_img/out/配下に検出結果が保存される．
![dog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258740/27f51d0d-fa38-6872-1242-83aa0b650922.png)

### パラメータ
test.pyのパラメータ(options部分)について説明します．
- load：ダウンロードしていたweightsファイルを指定
- threshold：検出結果の閾値．高くすると評価の高い物体のみが出力される．
- gpu：gpuの使用率

## まとめ
darkflowを用いてYOLOv2を動かしてみました！
KerasでYOLOv3を動かすのが主流となっているので，需要があるのかわかりませんが，
先行研究の環境再現などの際に参考にしていただけると嬉しいです！
次は矩形内の物体画像切り抜きについて記事を書きたいと思います！
Hugoで環境によって設定を変える方法

# 動作確認環境

- Hugo v0.71 extended
- Ubuntu 18.04, macOS Catalina

# TL;DR

基本的には、以下のようにすればいいだろう。

```
.
├── config/
│   ├── development/
│   │   └── config.toml  # hugo serverで使う設定
│   └── production/
│       └── config.toml  # hugoコマンドで使う設定
└── config.toml          # 共通設定
```

# 解説

`hugo` には、所定のディレクトリに置かれた設定ファイル群を読み込む機能がある。[^1]

[^1]: [Hugo v0.53](https://gohugo.io/news/0.53-relnotes/)で追加された機能のようだ

https://gohugo.io/getting-started/configuration/#configuration-directory

以下、仕様の要点を記す:

- デフォルトでは `config/` 以下を参照するが、オプション `--configDir <DIRECTORY>` で別のディレクトリを指定可能。以下では `$configDir` とする
- `$configDir/_default/` 以下に置かれた設定ファイル群は常に読み込まれる
- 更に、オプション `--environment <ENVIRONMENT>` で指定された `$configDir/<ENVIRONMENT>/` 以下の設定ファイル群が読み込まれ、デフォルトの設定を上書きする形で適用される

また、最後の `--environment` オプションについては、コマンドによって下のようにデフォルト値がある:

- `hugo server` 実行時はデフォルトで `--environment development` となる
- `hugo` 実行時（サイトビルド時）はデフォルトで `--environment production` となる

以上から、冒頭で示したディレクトリ構成によって、共通する設定は `config.toml` にまとめた上で、特にオプションを指定することなく、`hugo server` 実行時と `hugo` コマンド実行時の設定を切替えることができる。

この `--environment` オプションのデフォルト値は、多くの人のユースケースを考慮したものだろう。
私自身もそうだが、ローカルでコンテンツを編集しながらサイトの表示を確認する際には `hugo server` を使い、公開用にサイトをビルドする際に `hugo` コマンドを実行することが多い。

`config.toml` については、上の仕様に従うと `config/_default/` に移してもいいのだが、分割しないなら別に移す必要もないので、今回はそのままとした。

# 他のやり方
## `--config` オプションで使用する設定ファイルを与える

https://gohugo.io/getting-started/configuration/#configuration-file

利用する設定ファイルを明に示したい場合は、こちらのやり方を好む人もいるかもしれない。
このオプションではカンマ区切りで複数の設定ファイルを指定することができ、後ろで指定した設定ファイルが、先に読み込まれた設定内容を上書きするようだ。

例:

```sh
# 共通設定とローカル開発用の設定を読み込む
hugo server --config config.toml,config-local.toml

# 共通設定と公開用の設定を読み込む
hugo --config config.toml,config-production.toml
```

## 環境変数で一部の設定値を上書きする

https://gohugo.io/getting-started/configuration/#configure-with-environment-variables

少なくとも、トップレベルの設定値と、 `[params]` 直下の設定値（Site Params）は環境変数で上書きすることができるようだ。

例:

```sh
# title, baseURLを上書き
env HUGO_TITLE="[開発中] My Site" \
  HUGO_BASEURL="http://localhost/path/to/dev" \
  hugo server

# params.author = "Bob" に設定
env HUGO_PARAMS_AUTHOR="Bob" hugo
```

以上。

# 脚注
DICE#プログラム

　この記事はC#のVisualStudio2019を使用しています。
　実行の際には特に設定は必要ないです。
　入力の必要はありません。

　このプログラムは１～４桁までのサイコロで合わせた数値で割り算を行い、割った出力した数値とその余りを求めるものになっています。

以下はそのソースコードです。



using System;

namespace Dice++++
{
    class Program
    {
        static void Main(string[] args)
        {
            //１つ目のサイコロは一桁　0～9まで
            var random = new Random();
            var number = random.Next(0,10);
            //２つ目のサイコロの二桁　0～9まで
            var number2 = random.Next(0,10)*10;
            //３つ目のサイコロの二桁　0～9まで
            var number3 = random.Next(0, 10) * 100;
            //４つ目のサイコロの二桁　1～9まで
            var number4 = random.Next(1, 10) * 1000;


            //一桁、二桁、三桁と四桁のサイコロの数の合計
            var number5 = number + number2 + number3 + number4 ;

            Console.WriteLine("1桁のサイコロの数は" + number +"、");
            Console.WriteLine("2桁のサイコロの数は" + number2 + "、");
            Console.WriteLine("3桁のサイコロの数は" + number3 + "、");
            Console.WriteLine("4桁のサイコロの数は" + number4 + "、");
            Console.WriteLine("4つのサイコロを足した数は" + number5 + "です");

            double x = random.Next(1, 10) * 100;
            var X = number5 / x;
            double X1 = number5 % x;

            Console.WriteLine("合計を３桁の数字である"+x+"で割ると" + X + "になり、余りは"+ X1 +"になります");
        }
    }
}



　出力例：
　　１回目
1桁のサイコロの数は8、
2桁のサイコロの数は20、
3桁のサイコロの数は200、
4桁のサイコロの数は6000、
4つのサイコロを足した数は6228です
合計を３桁の数字である600で割ると10.38になり、余りは228になります

　　２回目
1桁のサイコロの数は2、
2桁のサイコロの数は60、
3桁のサイコロの数は700、
4桁のサイコロの数は1000、
4つのサイコロを足した数は1762です
合計を３桁の数字である900で割ると1.9577777777777778になり、余りは862になります

　以上です。
JavaのStringクラスのメソッドいろいろ

#文字列調査に関するメソッド
|メソッド|操作|引数型|戻り値型|
|-------|---|-----|-------|
|equals|内容が等しいかどうか調べる|String|boolean|
|equalsIgnoreCase|大文字、小文字の区別を無視して内容が等しいかどうか調べる|String|boolean|
|length|文字列の長さを調べる|String|int|
|isEmpty|空文字かどうか調べる|String|int|

#文字列検索に関するメソッド
|メソッド|操作|引数型|戻り値型|
|-------|---|-----|-------|
|contains|文字列が含まれるかどうか調べる|String|boolean|
|startsWith|指定された文字列で始まるかどうか調べる|String|boolean|
|endsWith|指定された文字列で終わるかどうか調べる|String|boolean|
|indexOf|指定された文字または文字列が最初に登場する位置を調べる|String|int|
|lastIndexOf|指定された文字または文字列が後ろから検索して最初に登場する位置を調べる|String|int|

#文字列切り出しに関するメソッド
|メソッド|操作|引数型|戻り値型|
|-------|---|-----|-------|
|charAt|指定位置の1文字を切り出す|int|String|
|startsWith|指定された文字列で始まるかどうか調べる|String|boolean|
|endsWith|指定された文字列で終わるかどうか調べる|String|boolean|
|indexOf|指定された文字または文字列が最初に登場する位置を調べる|String|int|
|lastIndexOf|指定された文字または文字列が後ろから検索して最初に登場する位置を調べる|String|int|

#文字列変換に関するメソッド
|メソッド|操作|引数型|戻り値型|
|-------|---|-----|-------|
|toLowerCase|大文字を小文字に変換|String|String|
|toUpperCase|大文字を小文字に変換|String||
|trim|前後の空白を除去|String||
|replace|指定された文字列に置き換える|String,String|String|
|reverse|指定された文字列を反転|String||

#参考文献
スッキリわかるJava入門実践編
【Git】職場で使うことを想定してGitの使い方を考えてみた - part2


# はじめに

この記事では
バージョン管理システムのGitを
職場で使うことを想定して
Gitの使い方についてまとめた記事です。

今回はGit関連のサービスは使えないけど
リモートリポジトリは作成できる人向けに書きます。

ベストプラクティスや間違いがあれば
それなりに良い方法で書き直していきます。

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

# あざやかにバージョン管理をキメたい

前回の内容に加えて
もしかするとこういうコマンドもあると
やりやすくなるのではというのがあったのでその続き

正直なところ職場だったら
Gitを操作できるGUIをクライアントを
導入すれば解決なんじゃないかと思われry

効率を最優先にとっても
ソフトを導入することは
あまり良い選択肢ではないと思います。

--------------------------------
# なにゆゑそう思うか

> 効率を最優先にとっても
> ソフトを導入することは
> あまり良い選択肢ではないと思います。

これは私の持論ですが主に理由は２つ

・ソフトを扱えることでその技術が扱えると勘違いする人が登場すること
・ソフトのサポート終了した瞬間その技術が使えなくなること

簡単に言えば
「GUIのソフトウェアがなければその技術を扱えない」

というハンデキャップをわざわざ負いに行くことはないんじゃないかな
ということと
ニッチな技術でとんがるより
みんなが愛してやまない技術を使ったほうが
自身の市場価値は測りやすいとも思うからです。

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

# 今回登場するコマンドー

```
$ git clone [リポジトリURL]
$ git push origin [ブランチ名]
$ git merge [ブランチ名]
$ git branch -D
$ git branch -d
```

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

# 想定される環境

客先常駐
GitHub使用不可
Windows10 Pro 64bit 
Git 2.26.2.windows.1

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

# 想定される利用者

研修中のエンジニア（例えば、業務未経験者など）
初学者を教えるベテラン、中堅エンジニア

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

# リポジトリのコピー(git clone)

リポジトリのURLと書きましたが
.gitフォルダのあるリポジトリのフォルダパスでも使えます。
たとえば、clone元のリポジトリ（test）が
別のディスクドライブ（仮にF:）にあるとき
以下のように入力することリポジトリをcloneできます。

```
$ git clone F:\test
```

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

# cloneしたあと

clone後に
内容を変更してaddして
commitすると
変更されるリポジトリはどこでしょうか。

答えは簡単です。
clone先のリポジトリです。
このときclone元のリポジトリは変更されません。

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

# clone元を更新したい

clone元を更新したいときは***push***を使います。

例えば、clone元のリポジトリのmasterブランチを更新したいときは
カレントのリポジトリをcommitしたあと
以下のように入力すること更新できます。

```
$ git push origin master
```

--------------------------------
# 改修とレビューのサイクルを作りたい

実際に作業する人とレビューする人に
分かれて作業するときのことを考えてみた。

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

# 作業者側

1.git clone
2.git branch -b test
3.コード改修
4.git add
5.git commit
6.git push

こうすることでclone元リポジトリには
testブランチという草が生える。

***間違ってもmergeしないように！！！***

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

# レビュー者側

何をレビューするかについての議論が先かとは
思いますがこれについては
次回以降まとめます。

作業者側の作業が終わったと仮定して話を進めると

1.git clone
2.git merge
3.レビュー
4.git branch -d test
5.git push origin master

工程の3で問題がなければ4と5に進む
レビューNGならば作業者にもう一度、同じ手順を踏んでpushしてもらう。


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

# この運用の問題点

・作業者がtestブランチを切り忘れたままcommitしてしまう可能性
・レビュー者がマージ完了後のtestブランチを削除し忘れる可能性

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

# 問題点その１

**作業者がtestブランチを切り忘れたままcommitしてしまう可能性**

これについては
作業者のフローである工程2の後に
git branchを叩くことで
ポカを回避できそう。


--------------------------------
# 問題点その２

**レビュー者がマージ完了後のtestブランチを削除し忘れる可能性**

これについてはレビュー後か
merge後に
git branchを叩くことで
ポカを回避できそう。

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

# まとめ

***git branch めっちゃ大事なコマンドでは？？？***

来月あたりから実際にこれで運用してみようと思います。

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

# おわり
Ubuntu 20.04でapt install docker-composeでインストールしたらバージョンが古くてエラーが発生

`$ sudo docker-compose up`
を実行したら以下のようなエラーが発生

ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/

https://docs.docker.com/compose/install/
を見てみると、apt installでインストールされたバージョン1.25.0よりも新しい1.25.5が存在していたので、それをインストールしたら解決した。

まず
`$ sudo apt remove docker-compose`
でdocker-composeをアンインストール

あとは公式ページの手順に従い
`$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose`

`$ sudo chmod +x /usr/local/bin/docker-compose`

`$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose`
でインストール完了


`$ docker-compose --version`
 version 1.25.5, build 8a1c60f6
変数をコピーした時の値 vs 参照

まだまだ完璧に理解しているとは言えないのですが、
フォルダの例えですっきりしたのでシェアします。

ひとつの変数から他の変数に中身をコピーしたい場合、
ざっくり言うとStringとObjectで挙動が変わってしまう。

- string ... コピー元が変わらない
- object ... コピー元も書きかわってしまう


## Stringの場合
Stringはプリミティブ型。メソッドを持たないデータ型。

```
let name1 = 'tom';
let name2 = 'tom';
console.log(name1, name2): // tom tom

name1 = 'bob'; //ここでname1を書き換える
console.log(name1, name2): // bob tom

name2 = name1; //name1(今はbob)をname2つに入れる。name1のコピーを作ってname2という名前にする
console.log(name1, name2): // bob bob
```

stringは中にvalueしかないから、copyしたら中身もそのままコピーする

`name2 = name1`

name1のbobをcopyしてname2にpasteしている感じ

コピー元のname1は変わらない。

### フォルダを複製してリネームしたと考えよう
フォルダーのコピペをしていると考えると自分的には理解しやすかった。
name1というフォルダを複製してname2という名前を付けた。
name2の中身を変えてもname1フォルダには影響は受けない。

## Objectの場合
stringと違ってメソッドを持つデータ型ということ。

```
const person1 = {
  first: 'tarou'
  last: 'yamada'
};
const person2 = {
  first: 'hanako'
  last: 'satou'
};
const person3 = person1; // person1をコピーしてperson3としたい
person3.first = 'Yuko'; // person3のfirstだけYukoにしよう。姉妹だし
console.log(person3.first); // Yuko ふむふむ
console.log(person1.first); // Yuko !!!なんでや
```
`const person3 = person1;`
このあと`person3.first = 'Yuko';`と
person3だけを変えたつもりなのに、コピー元のperson1の内容も変わってしまう。

この場合はStringのときと違って、person1の中身をコピペしてるんじゃない。
参照を作ってるだけ。

### フォルダのショートカット(エイリアス)を作ったと考えよう
ようはperson1のショートカットを作った。そのショートカットの名前をperson3に変えた。
person3の中身を修正したら、person3とperson1はリンクで繋がっているので
ショートカット元のperson1も変わってしまう。
2020年6月から11月までに行われる開発者向け大規模オンラインカンファレンス・サミットをまとめみた！

こんにちは(๑╹ω╹๑ )
毎年夏季前後で開発者向けの大規模なカンファレンスやサミットが開催されていますよね！！

今年は例年と違いオンラインでの参加が可能なイベントが増えております！
※この記事で紹介するイベントはオンラインでの視聴が可能なイベントのみです

このような記事を書き残そうと思ったのは、
情報の整理が追いついていなかったためです笑

※日付は現地時間です


|主催|イベント名|日程|備考|
|---|---|---|---|
|Microsoft|[Cloud Summit](https://resources.office.com/en-in-landing-IN-M365DEP-WBNR-FY20-06Jun-01-Microsoft-Cloud-Summit-4935.html)|6月1日〜6月5日|Azure、ブロックチェーン、AI、Dynamics 365、Power Platform|
|Cisco|[Cisco Live](https://www.ciscolive.com/us.html)|6月2日〜6月3日||
|Android|~~[Android11](https://developer.android.com/android11)~~|6月3日|中止になりました|
|Google|[Google Cloud Day](https://cloudonair.withgoogle.com/events/google-cloud-day-digital)|6月9日〜6月11日|アプリケーション、データ基盤・分析、コラボレーション、インフラストラクチャ、機械学習、セキュリティ|
|Apple|[WWDC2020](https://developer.apple.com/jp/)|6月22日|例年通り開発中のOS発表、Xcode11 SwiftUI、ARKit、Core ML 3|
|VMware|[VMworld 2020](https://www.vmworld.com/en/index.html)|6月23日|インフラストラクチャ、マルチクラウド、セキュリティ|
|Google|[web.dev LIVE](https://web.dev/live/)|6月30日〜7月2日|Chromiumを主軸としたWeb Next|
|Moz|[Moz Con](https://moz.com/mozcon)|7月14日〜7月15日|SEO、マーケティング担当者向け|
|Google|[Google Cloud Next](https://cloud.withgoogle.com/next/sf/)|7月14日から毎週（計9回|上記**Google Cloud Day**と同等内容のセッション|
|Microsoft|[Microsoft Ignite](https://www.microsoft.com/en-us/ignite)|9月（日時は未定）|Azureを主軸としたインフラストラクチャ|
|Adobe|[Adobe Max](https://max.adobe.com/)|10月19日〜10月21日|Adobe Creative Cloud|


記載漏れ等あれば教えて下さい🥺
【VMware】ネットワークアダプタのアダプタタイプとは？

# はじめに
仮想マシンを構築しようとしていた際に気になったので、本記事を書きました。
業務で仮想マシンを設定する場合、なんとなくアダプタタイプを**「VMXNET3」**を選択していると思います。
今回は、こちらのアダプタタイプについて解説してきます。


![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/f2f30741-de68-1a7b-362b-a9f4101b048f.jpeg)

# アダプタタイプ

## VMXNET3

**VMware Toolsに含まれる仮想マシン向けの専用アダプタ。**
仮想マシン向けに最適化された機能が含まれている。
(仮想マシン構築時には基本的にこれを選択する。)

**特徴**

- IPv6オフロード、MSI/MSI-X 割り込み配信等の機能がある
- サポートされるOSは限定されている

WindowsOSのNICを「VMXNET3」にする場合は、「VMwareTools」のインストールが必要。
(インストールしない場合、ネットワーク接続ができない。)

## E1000e

**物理NICのエミュレーションしたアダプタ。**
Intel 82574 ギガビット イーサネット NIC のエミュレート バージョン。

**特徴**

- Windows8以降のWindows仮想マシンのデフォルトアダプタタイプ
- Linux仮想マシンの場合、UI(インターフェース)から使用不可


## SR-IOV パススルー

SR-IOVは「Single Root I/O Virtualization」の略。
**仮想マシンの仮想ネットワークアダプタを、ハイパーバイザーを介さずに直接物理ネットワークアダプタにマッピング。**

つまり、「仮想マシンのNIC = 物理NIC」ということにするタイプ。

※こちらのサイトでは、図付きで分かりやすく解説されている。
[ESXi 6.7U2 環境下におけるMellanox ConnectX-5 ENでのSR-IOVの動作](https://www.servants.co.jp/technology/column/technology/tec-mellanox/3545/)

**特徴**

- 仮想マシン内のゲストOSとマッピングされるハードウェアの両方がSR-IOVに対応している必要がある
- 遅延によって障害が発生したり、必要な CPU リソースが増加したりする可能性のある仮想マシンに向いている
- ESXi6.0 以降の場合に「Red Hat Enterprise Linux 6」以降および「WindowsServer2008R2SP2」の仮想マシンで使用可能 


# まとめ

|  アダプタタイプ  |  内容  |
| ---- | ---- |
|  VMXNET3 |  仮想マシン向けに最適化された機能が付いているアダプタ、vSphere環境のみで利用可能  |
|  E1000E  |  物理NICをエミュレーションしたアダプタ  |
|  SR-IOVパススルー  |  仮想ネットワークアダプタを直接物理のネットワークアダプタにマッピングするアダプタ  |


# 参考

[仮想マシンのネットワーク アダプタを選択する](https://kb.vmware.com/s/article/1001805?lang=ja)
[ネットワーク アダプタの基本](https://docs.vmware.com/jp/VMware-vSphere/6.7/com.vmware.vsphere.html.hostclient.doc/GUID-AF9E24A8-2CFA-447B-AC83-35D563119667.html)
git clone チーム開発にて


# githubから自分のローカル環境にcloneする
アプリを置きたいディレクトリに移動して下記コマンドを実行

```
$ git clone リポジトリのurl
```


次に必要なgemをインストールします

```
$ bundle install
```


これでデータベースを作成します

```
$ rails db:create
$ rails db:migrate
```

起動します

```
$ rails s
```

## まとめ
githubからcloneしたアプリケーションを自分のローカル環境で開発できるようにした時のメモです。
Windows10_Docker Toolboxインストール

# 備忘録
① BIOSでVT-Xの有効化
（Security>Visualization）
②Hyper-Vの無効化
（Windows機能の追加と削除>Hyper-Vのチェックを全外し）
③インストール
・VirtualBox単独インストール（インストーラを管理者権限で実行）
・Git単独インストール（インストーラを管理者権限で実行）
・Docker Toolboxインストール
（インストーラ管理者権限で実行、VirtualBoxとGitのチェックを外す）
④起動
・Docker Quickestart Terminnal実行
ボルダリングで登ったコースの効率性を評価するアプリを作った

## こんなの作りました

ボルダリングのコースを登っている動画をアプリで分析して、登ったコースの効率性を評価します。評価結果は数値出ます。数値が大きければ大きいほど効率の良い登りです。
分析できる動画には制限があって、アプリのトップ画面に書いています。

- スマホ推奨
- スペック低いスマホだとうまく動かないかもしれない
- ios未対応(厳密には動画が .mov の拡張子だと読み込めない)

WiFi環境推奨です。1分くらいの動画だと分析はだいたい1~2分くらいかかります。

https://www.noboruu.club/#/

1.分析する動画を選ぶ

<img width="150" alt="Screenshot_20200530-160844.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606419/78c32eb7-28a2-7dab-ee8e-559ee5e27f51.png">

2.登っていない動画の不要な部分をカットする

<img width="150" alt="Screenshot_20200530-160905.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606419/d33706b4-527c-d55c-78d1-1141692cd308.png">

3.分析結果の表示

<img width="150" alt="Screenshot_20200530-160922.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606419/57996a3c-5845-d235-c486-49718bb9f8a1.png">

試しにアプリの動き見るだけなら、ネットで見つけた人の画像を、だいたい10秒くらい、ゆらゆらさせて、登ってる風にして撮っても分析結果はハチャメチャですが、問題はないです。


## 登ったコースの効率性とは？

効率の良さとは、イメージすると以下の画像になります。
- 赤色が効率の良い登り
- 黄色が効率の悪い登り

![17292_paint.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606419/449eecf8-1e6a-ea6d-5531-6c7496e25fa0.jpeg)
<a href="https://jp.freepik.com/free-photos-vectors/man">Pressfoto - jp.freepik.com によって作成された man 写真</a>

基本的には、ボルダリングコースを登るときはスタートからゴールまでの距離は短く行きたいですね。このアプリの効率性では、赤色 > 黄色 という評価をしています。

ただ、もしかすると黄色の経路のほうがホールドが良く(持ちやすく)、力を消費せずに行けるかもしれません。もしかすると黄色の経路のほうが時間的にはゴールまで早くたどり着けるかもしれません。総合的な効率の良さを評価するには、もう少し工夫が必要ですね。
今回は経路の効率性の良さ、という角度で分析しているので、筋力の消費加減や時間は考慮していません。これらは今後の課題ですね。


## 分析の仕組み
動画に写っている人の姿勢を推定し、推定からわかるその人の骨格の座標を追跡することで、登ったボルダリングコースの経路を算出します。その経路がどの程度効率良かったかを数値化します。

人を姿勢推定するとこんな感じで、骨格の17部位を推定します。（鼻、左目、右目、左耳、右耳、左肩、右肩、左肘、右肘、左手首、右手首、左尻、右尻、左膝、右膝、左かかと、右かかと）
<img width="254" alt="capture.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606419/73d5a491-81fc-01ef-9ae1-fafe2fbd543f.png">

青色ホールドのコースを登っている人の姿勢推定を試しに行いました。
アプリでは骨格の描画をするビューはありませんが、内部的にはこの情報を元に分析をしています。17部位のポイントはわかりやすいように赤色にしています。
<img width="385" alt="debug.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606419/cb0a2581-c579-020b-a447-aa123310fec2.png">


## 技術
姿勢推定では、PoseNet を使用しています。
![camera.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606419/8ce9c820-18c8-814b-d625-5f054269c8d0.gif)
https://github.com/tensorflow/tfjs-models/tree/master/posenet

PoseNet はブラウザ上で動くので、クライアント側で動画を処理して骨格の座標を特定しています。アプリでは実際に動画をサーバーにアップロードしているわけではありません。アップロードしているのは、動画から判定した人の骨格のみです。プライバシー問題回避ですね(骨格から人を特定することができるなら、話は別ですが...)。

アプリケーションは、AWS Amplify + Vue で作っています。Firebase でも良かったんですが、Amazon の社員さんが激オシしていたものでちょっと使ってみました。普段の業務ではAWSの利用が多いですし、使い慣れたIAMで権限を管理できるのも魅力ですね。


## アプリが目指す方向性
サッカー・バスケットボール・野球など様々な分野で数字の重要性がフォーカスされていますね。今あげた球技系とボルダリングで決定的に違うのは、そもそもボルダリングにはそこまで数字の種類がないです。完登数・フラッシュ・レッドポイント・アテンプト数などなど、もうちょっとある気はしますが、メジャーな数字は10以下だと思います。なのでまず、その数字を作るところからです。
今の技術を使ったら、こんなのも数字化できるよ！という試みがこのアプリです。
数字化してみて、こんなの使えないよ、となったらそれまでです。解散ですね。


## まとめ
姿勢推定を使ったボルダリングの分析はまだまだやれそうなところがあるので、今後も続けていきます。以上、終わり！投げ銭ウェルカム！
Dockerでbuildを実行したら、名前解決が出来ずにエラー

Ubuntu 20.04で
`$ docker build .`

を実行したら、以下のようなエラーが複数回発生してタイムアウトした。

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f3f45040790>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /simple/pipenv/


`$ sudo vi /etc/default/docker`
でDockerの設定ファイルを開き

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
のコメントアウトを外した後

`$ sudo service docker restart`
でエラーが解消された。
Rails Tutorial　第2章 演習問題が難しくなってきました

#2020/5/30 1.5時間
5/25-29は会社なのでこの勉強はお休みです。

1週間ぶりなので、何をやっていたか思い出すのに時間がかかりました。


再びCloud9のIDEのボタンが表示されず、思い出すのに時間がかかりました。いったんログアウトしてログインし直しなおせばいいです。

2.3.1マイクロポストを探検するまで終わりました。

#2020/5/31 1時間

2.3.2 マイクロポストをマイクロにする
2.3.3 ユーザーはたくさんマイクロポストを持っている
をやりました。

演習問題が難しくなってきました。

## 不明点1　関連付けされたモデルをどう参照するのか

2.3.3.演習1 
自力では解けなかったので、ネットの解答例を見ましたが、よく分かりませんでした。具体的には、

```ruby:正解
 <%= @user.microposts.first.content %>
```

のuser.microposts がなぜ関連づけできているのかが分からないです。SQLだとテーブルのジョインならどのキーで関連付けるかをWhereで書くところですね。

## つまづいた点1　コロンが漏れた

2.3.3.演習3

```ruby:正解
  validates :name,presence: true
  validates :email,presence: true
```

とすべきところ、

```ruby:間違い
  validates name,presence: true
  validates email,presence: true
```

と、nameの一文字前のコロン「:」を漏らしていました。

解決まで時間がかかったのは、nameはなくてもエラーにならず、emailはエラーになったためです。理由は分からないですが、追うのはやめました。

こういうケアレスミスを見つけるのは、私の苦手なところです。間違い探しが得意な人がいるので、本当にうらやましいです。
sassc を直に使う


Rails や Sinatra などのフレームワークで CSS を編集する人はたいがい Sass 言語で書いていると思う。
フレームワークが全てをやってくれるのであまり意識することは無いが，多くの場合に [sassc](https://rubygems.org/gems/sassc) という gem のお世話になっているだろう[^sassc]。

[^sassc]: 以前は sass という gem が使われていたが，処理を C で実装した高速な sassc に置き換えられていっている。

この記事は，sassc を直接扱うことについて書く。

なお，Sass 言語の構文には，当初から存在した「Sass 構文」と，のちに追加された「SCSS 構文」の二つがあるが，本記事では Sass 構文で例を示す[^notation]。SCSS 構文でも本質的に変わらない。

[^notation]: SCSS 構文が Sass 構文より良い点は「CSS の上位互換」ということしかない気がするが，それでも圧倒的に SCSS が使われているのはなぜだろう？

# 使ってみる

## require

Gemfile に

```rb
gem "sassc"
```

と書いて，スクリプトで

```rb
require "bundler"
Bundler.require
```

すれば使える。

また，sassc がインストールされている環境ではスクリプトで

```rb
require "sassc"
```

すれば使える。
この記事では後者の方法で示す。

## 変換する

変換元の Sass ソースを与えて SassC::Engine オブジェクトを作り，`render` メソッドを呼ぶだけ。

以下のように書く。

```rb
require "sassc"

source = <<SASS
body
  margin: 0
SASS

p SassC::Engine.new(source, syntax: :sass, style: :compact).render
# => "body { margin: 0; }\n"
```

## オプション

`SassC::Engine.new` に与える重要なオプションとして，以下のものがある。

### :syntax

どっちの構文かをシンボルで与える。

Sass 構文なら `syntax: :sass` とし，SCSS 構文なら `syntax: :scss` とする。

### :style

出力の形式を `:nested`，`:compact`，`:compressed`，`:expanded` から選ぶ。

最も小さくなるのが `:compressed`。

CSS の最もふつうの（？）形式が `:expanded`。


# 非 ASCII 文字の扱い

仕様を確認したわけではないが，非 ASCII 文字を含むかどうかで変換結果の形式に少し違いがあるようだ。

実のところ，記事を書こうと思った動機がコレ。
特筆すべきは compressed スタイルの場合なので，これを expanded と比較する。

まず最初に ASCII 文字だけの例を見よう。

Sass が

```sass:Sass
a
  font-family: "hoge"
```

だとする。
expanded と compressed の出力は以下のとおり。

```css:expandedスタイル
a {
  font-family: "hoge";
}
```

```css:compressedスタイル
a{font-family:"hoge"}
```

とくにどうということもない。

次に，Sass に非 ASCII 文字が入った以下のケース。

```sass:Sass
a
  font-family: "ほげ"
```

これを expanded で出力するとこうなる：

```css:expandedスタイル
@charset "UTF-8";
a {
  font-family: "ほげ";
}
```

ふむ，`@charset "UTF-8";` が付いた。なるほどこれは理にかなっている。

では compressed は？

```css:compressedスタイル
a{font-family:"ほげ"}
```

おや？　`@charset` が無い。いいのこれで？

## 謎解き

実は，さきほどの実験で，非 ASCII 文字を含む場合に，`compressed` スタイルで出力した CSS は，`a` で始まっているように見えるが，そうではない。
先頭に BOM（Byte Order Mark：バイト順マーク）が入っているのだ。

それを確かめるため，

```sass
a
  font-family: "ほげ"
```

を `compressed` で CSS に変換した結果の最初の 5 文字のコードポイントを表示させてみよう：

```rb
require "sassc"

source = <<SASS
a
  font-family: "ほげ"
SASS

css_text = SassC::Engine.new(source, syntax: :sass, style: :compressed).render

puts css_text.codepoints.take(5).map{ |c| "U+%04X" % c }.join(" ")
# => U+FEFF U+0061 U+007B U+0066 U+006F
```

やっぱり最初の文字は U+FEFF，つまり BOM であった。

スタイルを四つ全部試したところ，BOM が付くのは `compressed` だけであった。
また，ASCII 文字だけの場合は BOM が付かなかった。

よくは調べてないが，上記の動作は sassc というライブラリーの特性とかではなく，Sass 言語の仕様であるらしい。したがって Dart Sass など，他の Sass 処理系でやっても同じ結果になると思う（確かめてない）。

さて，U+FEFF は不可視[^invisible]なので，入っていることに気づきにくい。これがときに大きな問題を引き起こすのだが，それについては以下の別記事で述べた。

[Sass の吐き出す BOM に注意！ - Qiita](https://qiita.com/scivola/items/c6a2f60ebee5aab6f1b8)


[^invisible]: ゼロ幅のスペースなので見えなくて当然。ただし，閲覧環境（テキストエディター，コードエディター，ターミナルなど）によっては何らかの表示がされる場合もある。
Sass の吐き出す BOM に注意！


この記事は，Sass 言語で記述して生成させた CSS に付加される（場合がある）BOM に注意しよう，というもの。

# はじめに

BOM（Byte Order Mark；バイト順マーク）はファイルの先頭に付加される（ことがある）バイト列で，そのファイルが何の文字コード（エンコーディング）で書かれているかを示すのに役立つ（ことがある）もの。

U+FEFF という文字をファイルの先頭に置くと，それがどんなバイト列になっているかによってエンコーディングが（まあまあ）判定できるわけだ。

もう少し細かい話は，最後の節「おまけ：U+FEFF と BOM」に書いておいた。

Sass 言語で記述されたスタイルシートを CSS に変換する手段はいくつもあるが，手段に関わりなく，ある条件を満たす場合に変換結果の先頭に BOM が付加されるようだ。

# どんな場合に BOM が付くのか

仕様をきちんと調べたわけではないので，以下は手元の実験結果に基づいたもの。Ruby の sassc という gem を用いて実験を行った。

まず，生成される CSS が ASCII 文字しか含まない場合は BOM は付かないようだ。
この場合，エンコーディングを示す必要が無いから付かないのだろう。

また，生成される CSS のスタイル（`expanded`, `nested`, `compact`, `compressed` の四種類がある）にも依存し，BOM が付くのは `compressed`[^compressed] の場合だけのようだ。
その他の形式の場合，BOM ではなく，

```css
@charset "UTF-8";
```

によってエンコーディングが示される（ASCII 文字だけの場合はこれも付かない）。

[^compressed]: compressed という形式は，人間には見づらいがファイルサイズが最も小さくなるので，配信用に向いている。


# 落とし穴

この仕様はときとして人を陥穽に落とし入れる。
つか，ぶっちゃけ，まんまと罠にはまったからこそ，この現象を発見したんだけどね。

どういうことかというと，`compressed` スタイルで出力された CSS をそのまま CSS ファイルとして書き出すんなら問題ないのだが[^bomcss]，得られた CSS テキストをほかの何かと結合して利用すると問題が起きる。

[^bomcss]: CSS ファイルの先頭に BOM をつけてエンコーディングを表現するのは，CSS 標準で決められた正当なやり方の一つ。

たとえば複数の Sass ファイルをそれぞれ CSS 化して**繋げる**場合。

あるいは，Sass を CSS 化して，それを HTML の `<style>`/`</style>` の中に**埋め込む**場合。

U+FEFF は，ファイルの先頭にあってこそ BOM として働くが，そうでなければ BOM ではない（「おまけ」の節参照）。

たとえば

```css
body {
  color: #333;
}
```

という記述の `body` の直前に U+FEFF が入っていたとしよう（しかし，ファイルの先頭ではないとする）。

確かめてはいないが，ブラウザーは `body` の前に U+FEFF のついた 5 文字の要素セレクターとして解釈するはずだ。
しかし，そんなセレクターにマッチする要素は存在しないので，この色指定は効かないことになる。

CSS 全体が無効になるのではなく，上記の記述だけが無かったことになる。だから，そもそも問題に気づきにくい。
そして，気づいたとしても，なぜここだけが効かないのか，生成した CSS をいくら**眺めても**さっぱり分からない，ということになる。U+FEFF は目に見えないからね。

# @charset にも同じ問題が

もちろん，`compressed` 以外の形式で付加される

```css
@charset "UTF-8";
```

にも同様の問題がある。
つまり，これが付加された CSS テキストを単純にほかの何かと結合して利用するとダメ。

とはいえ，`@charset` は CSS の途中に書いてはいけないし，HTML の `style` 要素の内容に含めてもいけない。
したがって，もしそういうことをやっちゃったら invalid として怒られる。
しかも目で見て分かりやすいから，問題の所在に気づきやすい。

それに対して，BOM のほうは問題が顕在化しにくいだけに厄介，ということだ。

# おまけ：U+FEFF と BOM

U+FEFF は本来はバイト順を示すものではなく，アラビア語などで使う zero width no-break space という「幅の無い分割されないスペース」であった。これはアラビア文字とアラビア文字の間に挿入して使う。

したがって，本来の使い方ではテキストの先頭に来ることはない。
このことと，「上位バイトと下位バイトを逆にした U+FFFE  という文字は Unicode に**存在しない**」という事実を利用して，UTF-16 という**バイト順がどっちだかよく分かんない文字コード**[^utf16]のバイト順を示すのに使っちゃえ！という**奇策**が BOM の始まりであった。

[^utf16]: UTF-16 は 16 bit コードなので，この 16 bit を 8 bit 二つに分割して，それを並べるときに，上位 8 bit と下位 8 bit のどっちを先に置くのかについて，二つのやり方が考えられる。

だから，ファイル先頭以外では U+FEFF を BOM と解釈してはいけないし，無視することもできないんである。

そのうち，UTF-16 だけでなく，UTF-8 だって U+FEFF をファイル先頭に置いておけば UTF-8 ということが分かっていいんじゃね？ということで，「BOM 付き UTF-8」というものまで生まれた[^bomutf8]。

[^bomutf8]: バイト列としては `EF BB BF` となる。

こうなると，もはや「バイト順」ではない。Unicode 系エンコーディングの判別をするためのマークになっちゃってる。それでも「BOM」と呼ばれている。やれやれ。

# sassc 以外の手段でも同様（追記 2021-11-20）

[sass-embedded](https://rubygems.org/gems/sass-embedded) という gem を使った場合でも，Node.js の sass パッケージを使った場合でも同様に，非 ASCII 文字を含むと compressed スタイルで BOM が付くようだ。
参考：[Ruby で Sass るには - Qiita](https://qiita.com/scivola/items/a7610ca1638119c31d8d)
Uncaught TypeError: Cannot read property 'hoge' of undefined

### '〇〇' of Undefined

よく出くわすエラーなのですが、〇〇がundefinedで〇〇がおかしい！と私は早とちりしがちなので、
このエラーがどういう意味なのかということを残しておこうと思います。

### マリオで見てみよう

こういうobjectがあるとします。

```
    const mario = {
      job: 'plumbing',
      relationship: {
        brother: 'Luige'
      }
    };
```

`mario.hobby`だと、そんなプロパティはないので、`undefined`になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126769/1afc2eaa-fa30-a2f4-5143-634390ce09b4.png)
ここまでは想像がつきますね。

### cannot read property 'fire' of undefined

で、どんなふうに呼び出すとこのエラーがでるかというと、
`mario.ability.fire`としたときです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126769/9d78992e-82f5-d62b-8bfc-6c1854770190.png)

`fire of undefined`なのでundefinedになっているfireではなく、
undefinedの中のfireというプロパティが読めないということですね。

marioの中のabilityというプロパティがなく、そこがundefinedになっているので、
undefinedの中のfireプロパティが読めないのです。

```
const mario = {
      job: 'plumbing',
      relationship: {
        brother: 'Luige'
      }
      undefined: {
        fire: 🔥
      }
    };
```
コードが複雑になってくると混乱してきますが、
こんなふうにシンプルに考えてみましょう。（と自分に言い聞かせている)
webサイトを中心に配置する

#やり方
横幅の大きさを指定します。横幅の大きさを指定しないと中央寄せできません。marginはautoにします。すると中央に要素を配置できます。

```html
.content {
  max-width: 500px;
  margin: auto;
}
```

#ソースコード
```html
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body {
  background: #555;
}

.content {
  max-width: 500px;
  margin: auto;
  background: white;
  padding: 10px;
}
</style>
</head>
<body>

<div class="content">
  <h1>This page is horizontally centered on screens that are wider than 500 pixels.</h1>
  <h1>Resize the browser window to see the effect.</h1>
  <p>This page is always centered on screens that are wider than 500px. On screens that are less than 
  500px wide, it will span the whole of the page.</p>
  <p>Content inside this container is centered horizontally.</p>
  <p>Content inside this container is centered horizontally.</p>
  <p>Content inside this container is centered horizontally.</p>
  <p>Content inside this container is centered horizontally.</p>
  <p>Content inside this container is centered horizontally.</p>
  <p>Content inside this container is centered horizontally.</p>
  <p>Content inside this container is centered horizontally.</p>
  <p>Content inside this container is centered horizontally.</p>
  <p>Content inside this container is centered horizontally.</p>
</div>

</body>
</html>

```

#参考サイト
https://www.w3schools.com/howto/howto_css_center_website.asp
https://www.nishi2002.com/16106.html
iCloud Driveからnode_modulesを除外する

#iCloud Driveのアップロードが止まらない

Vuejsとかの開発をiCloud Driveに入れて開発すると、npm installした途端node_modulesフォルダのiCloud Driveのバックアップに物凄い時間がかかって困る。

そもそもバックアップされたくないし、する必要もないと思うので、なんとかして除外したい。

[参考:Prevent iCloud from Syncing /node_modules/ Folder](https://davidsword.ca/blog/terminal/prevent-icloud-syncing-node_modules-folder/)

```
npm install
mv node_modules node_modules.nosync
ln -s node_modules.nosync/ node_modules
```

```npm install``` したらすぐにフォルダの名前変えて、```node_modules```っていうシンボリックリンクで紐づけるって形。

私の環境だと、gitあたりがindex付けようとしたので、ローカルのグローバル無視リストに```node_modules.nosync```を追加
Visual Studio CodeのSFTPプラグインもアップロードしたそうにしてたのでignoreに追加。

ただ、iCloud Driveは.gitフォルダーは保存してくれないので、結局gitとTimeMachineとiCloud Driveでトリプル保存になりましたとさ。
【Swift】Protocolについて

# 仕様書、プロトコル

プロトコルとは、一言で言えば**仕様書**です。

クラスや構造体、列挙などはしばしば**設計書**と言われますが、**プロトコルはその設計書の仕様書と言えます。**

プロトコルでは設計書内にどのようなプロパティやメソッドが入っているのを単文で記述します。そして、設計書でその具体的な処理について記述すると言うように分担しています。

#プロトコルを使うメリット

仕様書であるプロトコルを使うことで、設計書であるクラス、構造体、列挙などの構成の組み立てに枠組みを用意することができます。

仕様書に従って、この設計図にはこのメソッドを書く必要があるな、、などと言うように。

#コードで見てみる

クラス（設計書）：Testは、プロトコル（仕様書）：testProtocolに**準拠する**場合のコードです。

プロトコルで、プロパティを指定する際は、

- varのみ（letは使えない）
- {get}：読み取り専用か{get set}：読み取り・代入　かを指定しなければならない

の２つの注意点があります。
下のサンプルコードでは、1つを`{get}`、もう１つを`{get set}`としました。



```Swift
protocol testProtocol{
    var getProperty: String { get  } //読み込み専用
    var getset: String { get set }  //読み込み・代入が可能
    func ABC()
}

class Test: testProtocol{
    var getProperty: String = "get"
    
    var getset: String {
        get {
            return "getset"
        }
        set{
            getProperty = newValue  // getPropertyは"get"のまま
        }
    }
    
    func ABC() {
        print(getProperty)
        print(getset)
    }
}

let test = Test()
test.ABC()
```

```text:出力
get
getset
```

getPropertyは`{get}`で指定したので、値が変更されてませんね

# 最後に
プロトコルは、delegateなどにも使われています。
delegate単体で概念を理解するより、プロトコル自体の理解を深めた方がdelegateだけでなく、他の概念についても理解が深まるなあと思いました！
エクスプローラーをタブ化する QTTabbarをいれてみました。

下記のサイトを参考にインストールさせていただきました。
https://laboradian.com/win10-tabbed-explorer-qttabbar/

結論、使いやすい気がする。
インストールしたばかりなので、これから使ってみます。
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350277/496ff599-72d5-8cfe-c792-c17885da2369.jpeg)
【簡潔】curlコマンドでPOSTリクエストのREST APIを叩いてみる

# はじめに
Ruby on Railsをメインに扱うWeb受託開発企業に転職し、約4ヶ月が経過しました。
初心者ながらにプロジェクトにアサインして頂き苦し楽しい毎日を過ごしております。

今回はcurlコマンドによるPOSTリクエストのAPIの実行を自分なりの備忘録として残します｡
機会があればGETSリクエストも載せます｡

## APIとは
「API」とは、「Application Programming Interface」の頭文字です。
食べログなどのサイトでお店の地図が[Google Map](https://cloud.google.com/maps-platform?hl=ja)で表示されていたりします｡
私はAPIに対して「外部のアプリケーションの機能を部分的に引っ張ってこれるもの」くらいのイメージを持っていました｡

調べたところ説明する際は以下が分かりやすいと感じました｡

>APIとはソフトウェアやアプリケーションなどの一部を外部に向けて公開することにより、第三者が開発したソフトウェアと機能を共有できるようにしてくれるものです。

## curlコマンドとは

>cURLとは、主にUNIX系OSでよく利用されるコマンドおよびプログラムの一つで、様々なプロトコル（通信手順）を用いてURLで示されるネットワーク上の場所との間でデータの送受信を行うもの。オープンソースソフトウェアとして公開されている。

よくGithubのリポジトリなどをURL指定してcurlコマンドでダウンロードしたりします｡


## curlコマンドでREST APIを叩いてみる
ターミナルで以下で実行します｡

```json
curl --request POST "実行するAPIのURL" \
--header "Content-Type: application/json" \ < レスポンスフォーマット 今回はjsonを指定
--header "X-SSapi-version: APIのバージョン" \
--data-raw {'
    "カラム名": "データ",
    "hoge": 1,
    "fuga": 2
}'
```
- 複数のデータを指定する場合は行末に「,」を忘れないようにします｡また､最後のデータの行末には不要です｡

## JSONの型
APIを実行しようとする中でjsonに関するエラーが頻発したため､jsonの型についてまとめます｡

### String
- nameカラムに型が文字列のhogeが入っている

```json
{ "name": "hoge" }
```


### Integer
- ageカラムに型が数値の26が入っている

```json
{
  "age": 12
}
```

### Json Object
- user_infoという名前のJson Objectにuser_idカラム､user_nameカラムが入っている

```json
{
  "user_info": {
    "user_id": "abcdefg",
    "user_name": "hoge fuga"
  }
}'
```

### Json List
- color_list配列にa,b,cの3つの要素が入っている
- object list配列にname,ageという名前のjson objectが入っている(配列によるネスト)

```json
{
  "color_list": [ "a", "b", "c" ],
  "object_list": [
    { "name": "hoge", "age": 13 },
    { "name: "fuga", "age": 12 }
  ]
}
```

# 参考文献
[今さら聞けないIT用語：やたらと耳にするけど「API」って何？](https://data.wingarc.com/what-is-api-16084)
[cURLとは - IT用語辞典 e-Words](http://e-words.jp/w/CURL.html)
[REST API Guide 2. REST API の概要](https://nec-baas.github.io/baas-manual/latest/developer/ja/rest/intro.html)
[とほほのWWW入門 JSON入門](http://www.tohoho-web.com/ex/json.html#object)