OmniAICreator/Qiita-1.07M huggingface dataset:
タスク管理ツール「ZenHub」を導入したお話

# はじめに
Qiitaはじめて書くので、見づらいかもしれないけどよろしくお願いします。

# 導入のきっかけ
クラスのチーム開発でスクラムを導入しています。
ZenHubを導入する前は、ホワイトボードをタスクボードとして使い、付箋にタスクを書いて貼っていました。
バーンダウンチャートも同じように、ホワイトボードに直接書いてました。
しかしデジタル化が進んでる中、わざわざタスクを手書きしホワイトボードに貼りにいく・・・
<b>効率悪くね・・・？</b>
そして、致命的な欠点が・・・
<h3>それは学校にいないと、タスクを動かせない!</h3>
就職活動やインターンシップ、~~学校をサボっている~~
色々な理由で学校にいないことはあります。
そんな感じで、僕たちのチームは「ZenHub」を導入しました。

# 「ZenHub」とは？
ようやく本題です。
[ZenHub](https://www.zenhub.com/)とは、GitHubのissueをTrelloのカンバンのように扱えるツールです。
ブラウザエクステンションとして実装されていて、GitHubのUI上からシームレスにタスクボードやマイルストーンごとのバーンダウンチャート等を出力することができます。

#「ZenHub」の導入方法
1. [Chrome ウェブストア](https://chrome.google.com/webstore/detail/zenhub-for-github/ogcgkffhplmphkaahpmffcafajaocjbd?hl=ja)からインストール。
2. 「Sign in to Zenhub」をクリックしてからGitHubのアカウントでログインする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206053/098bf4d2-1cd9-f81e-b4d1-e547f028597b.png)
3. GitHubのタブメニュー？にZenHubが表示されてたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206053/295b1dc1-83a3-6d48-f077-909ab4d6138b.png)

# 導入してみた結果
上記のチームで約4週間使用した結果、以下のようなメリットが出てきました。

- チーム全員が詳しい説明なく使い始めることができた。＝学習コストがそんなに高くなかった。

- わざわざ足を運ばなくてもタスクボードにタスクが反映される。
 
- issueをcloseしたら自動的にバーンダウンチャートに反映されるため、毎日手書きでバーンダウンチャートを書く必要がなくなった。

- 誰が何をしているかが明確にわかるようになった。

- GitHubと連携してるため実際の進捗とズレがなくなった。

# まとめ
初記事は「ZenHub」を導入したきっかけ・結果でした。
タスク管理は色々なスタイルがあるため一概に優劣ををつけれるものではありません。
しかし、特にタスク管理手法にこだわりがなく、シンプルに進捗状況の可視化がしたい！という場合はZenHubを使うことでタスク管理自体のコストを削減できるのは間違いないと思います。
よかったら使ってみてはどうでしょうか？
名前空間（namespace）の使い方

##名前空間を使う場面

ファイルを複数に分割して読み込むとき。

##使用目的

同一関数名やクラス名、メソッドなどのバッティングを防ぐ。
ファイルが増えたり、複数人での開発時などに有効。

##使用例

呼び出し（require）元ファイル

```php
<?php

// 必ず先頭で名前空間を宣言。バックスラッシュで階層を指定。
namespace MyApp\Class;

class User {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  public function greeting() {
    echo "Good morning, Mr $this->name!";
  }
}
?>
```

実行ファイル

```php
<?php

require "User_class.php";

// use 名前空間名　（use MyApp\Class as Class）
use MyApp\Class;

$Tom = new Class\User("Tom");
$Tom->greeting();
?>
```
python3.8 venv環境でjupyter notebook

> 20191124時点の情報。眠いから死ぬほど淡白に書く。
> 20191227追記 この記事だけやたらと需要がある模様

起動確認と初期設定まで。

# python install
割愛 pyランチャーを使ってるのでpythonまでのpathは通してない。

# venv環境作成
環境作成。ついでにactivateする。コンソールはgit-bash

```
$ py -m venv hoge
$ . hoge/scripts/activate
```

# venv環境下にjupyterをインストール
pipをアップデートして、jupyterをインストールする。

```
(hoge)$ pip install -U pip
(hoge)$ pip install jupyter
```

# jupyterを起動、エラー

```
(hoge)$ jupyter notebook
```

死ぬほどエラー吐かれた。要はここ。

```
raise NotImplementedError
```

# tornado配下のasyncio.pyに追記する
エディターは好きなの選んで。というかコンソールからやる必要もない。

```
(hoge)$ cd lib/site-package/tornado/platform
(hoge)$ emacs asyncio.py
```

asyncio.pyのファイル内、パッケージのインポートが大方終わったあたりに以下を追記する。

```hoge/lib/site-package/tornado/acyncio.py
    import sys
    if sys.platform == 'win32':
        asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
```

# 正常に起動した

```
(hoge)$ jupyter notebook
```

# デフォルトフォルダ変更
`hoge/lib/site-package/tornad/platform` がデフォルトフォルダになっているように見える。  

```
(hoge)$ jupyter notebook --generate-config
>>> Writing default config to: ~\.jupyter\jupyter_notebook_config.py
```

以下のコメントアウトを外して任意のパスを渡す。

```~/.jupyter/jupyter_notebook_config.py
#c.NotebookApp.notebook_dir = ''
```

# venvのカーネルを指定する
適当にprintやら試した。憶測だけどデフォルトではroot pythonを使っている模様。

`ipython kernel install` でvenv環境を追加する。  

```
(hoge)$ ipython kernel install --user --name=hoge
```

jupyterのkernelメニューから `Change kernel > hoge`

# 終わり
多分使えるようになった。みんなも気軽に使おうね。


# 補足
## Jupyter server
多分jupyterかpythonでサーバー立てれば良いような気もする

git-bashにtmux打ち込んでtmuxセッションから仮想環境とjupyter notebookを起動するとまぁそれなりに困らないのでそっちで対応した

## 見た目の設定
これすっごくべんり。ほぼコピペ。(記憶があいまい)

```
(hoge)$ jt -t onedork -fs 105 -tfs 11 -nfs 115 -cellw 88% -lineh 120 -T -N -f inconsolata
```


# 参考
助かりもうした。
ちゃんと@をつけると参考元に通知されるの知らんかった。

## Jupyter setup系
@k-serenadeさん [JupyterNotebookの初期ディレクトリを変更する](https://qiita.com/k-serenade/items/af8701101fe50397d8aa)
@Gattacaさん [jupyter notebookでvenvを使う](https://qiita.com/Gattaca/items/80a5d36673ba2b6ef7f0)
StackOverFlow : [Jupyter Notebook with Python 3.8 - NotImplementedError](https://stackoverflow.com/questions/58422817/jupyter-notebook-with-python-3-8-notimplementederror/58430041#58430041)


## Jupyter見た目系

@kazukiiiさん [お前らのJupyterはダサい](https://qiita.com/kazukiii/items/bf98ee0d152489e49883)
@knakajima3027さん [Jupyter Notebook テーマのカスタマイズ](https://qiita.com/knakajima3027/items/91896c5a4060eb3e5004)
@koikoi_jamさん [jupyter-themes の fontについて](https://qiita.com/koikoi_jam/items/29d9ef4e16a42038325c)
蟻本「分割数」考察

#蟻本「分割数」考察

## 概要
通称蟻本、「プログラミングコンテストチャレンジブック」を読んでいるのだがp.66の分割数のところで直に理解できない部分があったので少し考えてみた。備忘録的に記録。

## 直に理解できなかった部分
Kindel版でP.66の以下の部分がなぜそうなるのかすぐにわからず、悩んだ。
![antbook-p066.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/ae94ecbb-acdf-6bdf-7a29-e53f53ef35e3.png)

## 理解した結果
（Overleafで書いたものをキャプチャ）
![antbook-p066-001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/2c76ef54-021b-ce4f-337d-0173da72208b.png)

![antbook-p066-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/a4526de0-c9db-4366-efbd-98063b0fedab.png)




## どこで躓いていたか。。
だいぶ悩んだあげく理解できた。$a_i$に0を許容することでm未満の分割数になる場合も含んで表現していることがぱっと理解できなくて「あれ何で0を許容してるのか？」と悩み、時間がかかってしまった。。。
うーん。「n個の互いに区別できない品物を、m個**以下**に分割する方法の総数」って書いてあるのに。。反省するべき。
【Unity】【シェーダ】ライティング入門

# デフォルトライティング関数
・Unityではあらかじめ下記のライティング関数が利用されている。
・構造体の詳細については[※4 公式リファレンス](https://docs.unity3d.com/ja/current/Manual/SL-SurfaceShaders.html)参照。

| 関数名 | ライティング関数へ渡す構造体 |　タイプ |
|:--|:--|:--|
| Lambert  | SurfaceOutput  | 非物理ベース |
| BlinnPhong  | SurfaceOutput  | 非物理ベース |
| Standard  | SurfaceOutputStandard  | 物理ベース |


## ライティングの切り替え
・下記２か所を設定する。

```csharp
　#pragma surface surf 関数名
　void surf (Input IN, inout ライティング関数へ渡す構造体 o) { }
```

# 自作ライティング関数
## ①定義
・関数名は「Lighting」で始める。
・関数の引数は以下の通り。（その他の引数については　[※１公式リファレンス](https://docs.unity3d.com/Documentation/Components/SL-SurfaceShaderLighting.html)を参照）

| タイプ | 引数 |
|:--|:--|
| カメラビューなし  | half4 LightingMyName(SurfaceOutput s, half3 lightDir, half atten)  |
| カメラビューあり  | half4 LightingMyName(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)  |


```csharp
  void LightingAnyMethodName(SurfaceOutput s, half3 lightDir, half atten) { return 描画色; }
```

## ②宣言

```csharp
　#pragma surface surf 「Lighting」を除いた関数名
　void surf (Input IN, inout ライティング関数へ渡す構造体 o) { }
```

# ライティングをOFFにする
・シェーダの作成に当たり、ライトを切りたい場合があるは以下の設定を行う。
1. Window -> Rendering -> Lighting Settingを選択する。
2. Intensity Multiplierの値を「0」に設定する。

# 物理ベースと非物理ベース
## 特徴について
・物理ベースレンダリング (PBR : Physically - Based Rendering)
・非物理ベースに比べて、より物理学のモデル(光の屈折や反射)に近い計算を行うことで、より現実に近い描写を行うことができる。
 　- energy conservation (エネルギー保存則) - 受けた光量以上は反射できない。
 　- microsurface scatteringstate-of-the-art (微小表面反射) - 荒い面はなめらかな面に比べて不安定な光を反射する
 　- Fresnel reflectance (フレネル反射) - スペキュラ反射は「かすめ角」に現れる。
 　- surface occlusion (面閉塞) - 角の暗がりや反射しにくい面
・イメージする質感を直感的に作成できる。
　（例えば、Metallicというパラメタに1を設定すると金属っぽくなり, 0を設定すると非金属っぽくなる。)
・非物理ベースに比べて、高負荷である。

## 種類
・Materialのインスペクタビューからシェーダを「Standard」「Standard (Specular)」を選択する。
・どちらを選択しても同一のマテリアルを作成できるため、どちらを選ぶかは好みの問題である。
・詳細な違いについては[※2 公式リファレンス](https://docs.unity3d.com/ja/current/Manual/StandardShaderMetallicVsSpecular.html)参照
・マテリアルのサンプルは[※3 公式リファレンス](https://docs.unity3d.com/ja/current/Manual/StandardShaderMaterialCharts.html)参照

## 透過の設定
・Materialのインスペクタビューから「Render Mode」を切り替える。

| Type | 2 | 3 |
|:--|:--|:--|
| Transparent  | 半透過  | α=0でも光は反射するため透明にはならない。鏡のようなオブジェを作りたいときに使用  |
| Fade  | 完全透過  | αが透明度となる。 |
| CutOff  | 部分透過  | α < C となる部分の描画をスキップする。  |


# 参考サイト
[1. Custom lighting models in Surface Shaders](https://docs.unity3d.com/Documentation/Components/SL-SurfaceShaderLighting.html)
[2. Metallic と Specular のワークフロー](https://docs.unity3d.com/ja/current/Manual/StandardShaderMetallicVsSpecular.html)
[3. マテリアルチャート](https://docs.unity3d.com/ja/current/Manual/StandardShaderMaterialCharts.html)
[4. サーフェスシェーダーの記述](https://docs.unity3d.com/ja/current/Manual/SL-SurfaceShaders.html)
Gmailで受信した時、Lineのbot形式で通知する方法

# Gmailで受信した時、Lineのbot形式で通知する方法
## 今回、使用するアプリ
LINEアカウント
LINE Notify
Googleアカウント(Gmail/Google App Script)

## Line notifyのアカウント登録と友達追加

https://notify-bot.line.me/ja/より
アカウントを登録する。

右上のアカウント名をクリックして、「登録サービス管理」をクリック

アクセストークン発行のトークンを発行をクリック

トークン名を記入と通知を送信するトークルームを選択

発行するをクリック
トークンをコピーしてメモしておく。(後でもコピー可能)

LINEアカウントに移動

Line notifyを追加する


## 受信するメールアカウントのGoogle App Scriptの設定

GASを開く
以下の記述をコピー

```
// 検索結果に応じたGmailをLINEに通知する
// 検索
var FindSubject = 'subject:(件名を入れる) ';

function getMail(){

  //指定した件名のスレッドを検索して取得
  var myThreads = GmailApp.search(FindSubject, 0, 10);
  //スレッドからメールを取得し二次元配列に格納
  var myMessages = GmailApp.getMessagesForThreads(myThreads);

  
  for(var i in myMessages){
    for(var j in myMessages[i]){

      //スターがないメッセージのみ処理   
      if(!myMessages[i][j].isStarred()){

        var strDate　=　myMessages[i][j].getDate();
        var strSubject　=　myMessages[i][j].getSubject();
        var strMessage　=　myMessages[i][j].getPlainBody().slice(0,200);

        //LINEにメッセージを送信
        sendLine(strDate,strSubject,strMessage);

        //処理済みのメッセージをスターをつける
        myMessages[i][j].star();



      }
    }
  }
}

function sendLine(strDate,strSubject,strMessage){

  //Lineに送信するためのトークン
  var strToken = "LINE Notifyで発行したトークンをコピー";
  var options =
   {
     "method"  : "post",
     "payload" : "message=" + strDate + strSubject + strMessage,
     "headers" : {"Authorization" : "Bearer "+ strToken}

   };

   UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}

```




## 試しにメールを送ってみる


参考にした記事
サマータイムについて知っておかなきゃ！><!

#はじめに
プロジェクトを作成するにあたって時間を取り扱う時に『サマータイム』というものを知っとかなきゃ！っと思ったのでqiita記事にしました！

#そもそも『サマータイム』ってなんぞや！
私達が日頃、目にしている時間、時計やスマホの時間とは、基準の時間といわれるものに、ある一定の時間を足したり引いたりしているものです。

ちなみに日本だと+9時間。

『日本は今〇〇時だけど、アメリカは今〇〇時だね』

という会話があるのは、**ある一定の時間(タイムゾーン時間)**が**各国**によって違うからなのです！

※日本と書きましたが正確には『Asia/Tokyo』です。
※基準の時間と書きましたが正確には『UTC(協定世界時)』です。
※ある一定の時間と書きましたが正確には『タイムゾーン時間』です。
※各国と書きましたが、正確には『共通の標準時(タイムゾーン時間)を使う地域全体』です。

以下からは※で説明した用語を用いて説明させて頂きます:bow_tone1:

で、**サマータイムとはこのタイムゾーン時間を進めることを言います。**
で進めた経緯なのですが以下4コマ漫画作ってみました！
<img width="464" alt="スクリーンショット 2019-11-22 1.20.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/1f040b39-1f03-8862-74a9-c2a75906103e.png">

**<font color=red>進めると書きましたがサマータイム期間が終わったら進めた時間を戻す</font>ことも行います！**
**ちなみにこのサマータイムですが、<font color=red>ある国、ない国、あった国あり、さらに進める時間も異なります！</font>**


#サマータイムがあるとどうなる？基本の考え
※自分の国に『サマータイム』があることを想定

:hatching_chick:サマータイム開始のタイミング

<font color=red>一瞬で1時間進む</font>
<img width="319" alt="スクリーンショット 2019-11-24 2.18.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/af691248-93c5-b644-6f8e-7c665478df24.png">
よって…その間の時間は**空白の時間**。この場合6:00になるはずが7:00になったら6:00、6:01、6:02…6:58、6:59はなかったことになる。
:watch:5:58、5:59、<font color=red>7:00</font>、7:01
**なかったことになるのだ…。**


:hatched_chick:サマータイム終了のタイミング
<font color=red>一瞬で1時間戻る</font>
<img width="315" alt="スクリーンショット 2019-11-24 2.23.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/4bc947dc-8719-4482-bd4b-eff4dc1b9a79.png">
よって…同じ時間がまた来るのだ。7:00だったはずが6:00になると言うことはまた**同じ時間が繰り返される**のだ。
:watch:6:01、6:01…6:57、6:58、6:59、<font color=red>6:00</font>、6:01、6:02…6:57、6:58、6:59、7:00


#でどうなる？

:sweat_smile:存在する時間がない日付はプログラムで出力不可になることがある。
:sweat_smile:時間をそのデバイスなどに頼ると同じ時間でも他の国だと違う時間になることがある。
:sweat_smile:同じ時間が繰り返されるため、後におこなったのに後におこなったことにならないことがある。
:sweat_smile:サマータイムが開始されたのに時間が変わらないことがある
:sweat_smile:実行されるはずの処理が実行されない
:sweat_smile:1回の実行でいいものが2回されてしまう

#私は思った

サマータイムが、対象とする時間に今後起きるなら…(日本にサマータイムが導入されるかもと言われている)
変わらないUTCの時間で管理しない限り、またはそれに相当する管理方法で管理しない限りおかしなことは起こる…。

#さいごに
:relaxed:サマータイムやめませんか？

#参考
[夏時間](https://ja.wikipedia.org/wiki/%E5%A4%8F%E6%99%82%E9%96%93)
[ほん怖〜昔日本にもサマータイムがあった話〜](https://qiita.com/uhooi/items/0598860efb50d07dc349)
[サマータイム対応方法のメモ](https://qiita.com/yamato225/items/676beef96efb8751e581)
[ほんとうにあったサマータイムについて](https://qiita.com/Kobayashi-asaas/items/adaa3af5c6c705de7223)
Nightwatchで始めるE2Eテスト

<img width="650" alt="Screen Shot 2019-11-24 at 1.57.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32359/d83b65ed-16fe-6ea1-5cf6-b6f8af3e1db3.png">

# はじめに

仕事で毎日お世話になっているE2Eテストフレームワーク、[Nightwatch.js](https://nightwatchjs.org/)について、インストールからテストコードを書いてみるところまでを、さくっと紹介します。💁‍♂️

では、さっそく。

# インストール

必要なものをインストールしていきます。
Nightwatch本体と、今回はChromeで試したいので、chromedriverを。

```terminal
$ yarn add -D nightwatch chromedriver
```

デフォルトではプロジェクト直下の`nightwatch.conf.js`を認識してくれますが、大規模プロジェクトでは環境に合わせて設定を変えたいので、以下のように`configs`に置いておくと良いでしょう。

```json:package.json
{
  "name": "test-nightwatch",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "e2e:test": "nightwatch -c e2e/configs/nightwatch.conf.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "chromedriver": "^78.0.1",
    "nightwatch": "^1.3.1"
  }
}
```

# 設定ファイル

ミニマムな設定はこんな感じで。
テスト中はブラウザが立ち上がって動作を見ることができますが、コーディング中や調べ物の最中に裏でテストを走らせておきたい、みたいな時は`headless`指定を行うと良いです。

```js:nightwatch.conf.js
module.exports = {
  src_folders: ['./e2e/tests'],

  webdriver: {
    start_process: true,
    port: 9515,
    server_path: require('chromedriver').path
  },

  test_settings: {
    default: {
      desiredCapabilities : {
        browserName : 'chrome',
        chromeOptions: {
          // args: ['headless']
        }
      }
    }
  }
};
```

# テストコード

検索サービスへ飛んで、フォームに検索文字を入力し、出てきた結果から、該当のものをクリックして移動する、という簡単なテスト。

```js:demo.test.js
module.exports = {
  'E2E Demo': (browser) => {
    const textToSearch = 'Nightwatch.js | Node.js powered End-to-End testing framework';
    browser
      .url('https://www.ecosia.org')
      .waitForElementVisible('input[type="search"]')
      .setValue('input[type="search"]', 'nightwatch')
      .click('button[type="submit"]')
      .assert.urlContains('/search')
      .waitForElementVisible('.results')
      .click('xpath', `//a[contains(text(), "${textToSearch}")]`)
      .end();
  }
};
```

# 結果

開発や運用が進むと、UIフローが変わったりしますが、ページ移動を含む一連の動作をテスト出来るので、安心して開発に取り組めます。
![Nov-24-2019 02-22-50.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32359/1fb6fffb-f9cc-4403-f8dd-30d98a483464.gif)

結果ログもこの通り。
自動で動作テストしてくれるのは、本当に楽ちんですね🤖
<img width="689" alt="Screen Shot 2019-11-24 at 2.20.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32359/3aa5bf22-6edd-2ef5-3a51-45cdf98f7440.png">
ディープラーニング G検定 の勉強法

## ディープラーニング G検定の勉強法
　2019/11/9に実施された**ディープラーニング G(ジェネラリスト)検定#3**を受験し無事合格できましたが、その勉強法などをまとめたいと思います。

## G検定とは
・目的:ディープラーニングを事業に活かすための知識を有しているかを検定する
・受験資格制限:なし
・試験概要:120分、知識問題(多肢選択式)、オンライン実施(自宅受験)
・出題問題:シラバスより出題

## 受験目的
　本職は生産技術系のエンジニアをしており、データサイエンスなどの業務もしていて、データ分析や、機械学習やディープラーニングを用いた画像認識のシステムなど製作もしています。本などで学習していますが、体系的に学び直したいとの思いで受験しました。資格を取ることで、今後の仕事でメインにやっていきたいとの意志と実力があることを示す意図もありました。

## 学習期間
　試験3週間前から試験勉強を開始。

　ただし、AI関連の本はもともと多く読んでおり、また機械学習やDeepLearningの実装経験もあり。Udemyの関連講座などは数年前から受講していた。
　そのため、分かっているつもりで、ちょっと油断してしまい、直前に一気に試験勉強をすることになりました。勉強してみると推薦図書も多く、しっかり学ぶには時間が不十分でした。試験をパスするだけなら、3週間あれば十分ではあります。

## 学習内容
　以下の本で学習を進めました。
①「深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト」
②「徹底攻略 ディープラーニングG検定 ジェネラリスト問題集」
③推薦図書
　「AI白書 2019」、「ディープラーニング活用の教科書」 他
④kindle「実践で理解する G検定 ディープラーニング教本: G検定合格者が教える最短で合格する秘法 (神草出版)」「詳解！実践で理解するG検定　Web模試　解説書」

特に①②④は3回ほど繰り返してやりました。③は時間が足りず、さらっと目を通したレベルです。特に④についているweb模試が良かったです。

## 受験してみて
・思いのほか法律問題が多い
・テキストにない問題も結構出る
　これらはGoogle検索で乗り切った

　上記本の①②④を3回繰り返していたことで、基本的な問題は瞬殺のスピードで解くことができたので、15～20分程度残しで全問は解き切り、自信のない問題を順次Googleで検索や確認する時間が取れました。
　試験のスピード感は上記④のweb模試をすることで、非常に似た形式で試験を事前体験できたのは良かったです(web模試だと簡単で30分以上余り、9割以上は取れます)。ただ、実際の試験の方が難しい(知らない問題が多い、特に法律問題)印象です。

　試験中は分からない問題はとりあえず、回答を選びサクサク進める。残る時間で検索して確実に取りに行く作戦が有効です。
　問題数が多いので、基礎的な問題に時間をかけないことが重要で、それは繰り返しトレーニングが役立ちました。問題集そのままの問題もあったと思います。

　やはり難しかったのは、法律問題で、常識で攻めれない内容だったこともあり、「AI白書」など最新の本で、一通り読んでおく価値はあると思います。正直、ここは勉強しにくいので、Googleで調べると割り切っても、基礎に自信があれば合格できると思います。
　合格ラインは非公開のようですが、テキストや問題集をベースに繰り返し勉強していれば基礎や技術的な問題がほぼ満点狙えるので、十分合格できるレベルだと思います。

　幅広い知識が問われる分、今まで色んな本で読んで学んだことを体系的に理解し、頭を整理できたと思います。正直、受けて良かったです。どんどん進化している分野なので、今度も情報を集め知識をアップデートしていきたいところですね。

## 次はE資格
　G検定に受かったので、次は実装力を問われる**E(エンジニア)資格**にチャレンジしようと思います。近々では2020年2月に試験があるため、あと3か月程度しかありません。
　しかも受験資格に指定のプログラミングスクールの講座の修了が必要になります。選定した結果、コスパ(直前でさらに安くなっていた)でAIジョブカレの講座を受けています。
　受けていて、かなりのスピードで進むので、正直pythonなど初心者だと厳しい印象です。一応、pythonも使え、データサイエンスの経験があるのでついていけてますが、この3か月で3講座の修了試験をパスして、E資格の試験に臨むにはかなりタイトなスケジュールになります。
　それでもG検定で知識がついているので、この機会に一気にE資格を取ってしまいたいですね。短期集中で頑張ります！
[C#]OpenCvSharp3を使ってPictureBoxのImageに矩形を描画すると色が消える問題

# 問題
OpenCvSharp3を使ってビットマップ化したPictureBoxのImageに矩形を描画をすると、再度ビットマップ化したときに色情報が落ちてしまう。
PNGをビットマップ化した場合は問題なかったので違いを調べてみた。

# コード(修正前)
```
Bitmap pngBmp = new Bitmap(@"test.png");
Bitmap pictImageBmp = new Bitmap(this.pictureBox1.Image);

Mat pngMat = BitmapConverter.ToMat(pngBmp);
Mat pictImageMat = BitmapConverter.ToMat(pictImageBmp);

// 緑色の矩形を描画
Rect rect = new Rect(10, 20, 50, 300);
Cv2.Rectangle(pngMat, rect, new Scalar(0, 255, 0), 2);
Cv2.Rectangle(pictImageMat, rect, new Scalar(0, 255, 0), 2);

// 正しい色で矩形が表示される
this.pictureBox1.Image = BitmapConverter.ToBitmap(pictImageMat);
// 矩形が白くなる
this.pictureBox1.Image = BitmapConverter.ToBitmap(pictImageMat);
```
# 解決
OpenCvSharp3でMat変換すると、カラータイプが以下の通りになっていた。
PNG → BGR
PictureBoxのImage → BGRA

OpenCvSharp3ではBGRで描画処理をしているため、BGRAでビットマップ化すると色情報が落ちてしまう。
※どうしてそうなるのかは調べきれていません、すみません。

# コード(修正後)
```
// Mat pictImageMat = BitmapConverter.ToMat(pictImageBmp);
// アルファチャンネル付きBGRからBGRに変換
Mat pictImageMat = BitmapConverter.ToMat(pictImageBmp).CvtColor(ColorConversionCodes.BGRA2BGR);
```
【Unity】【シェーダ】Shader Graph入門



# Shader Graphの導入
1. メニュー上でWindow -> Package Managerを選択する。
2. 「Shader Graph」をインストールする。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/45eab991-cb22-2a7d-527b-b8375ae8b3df.png)

3.「render-pipelines.lightweight」をインストールする。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/a0b48dc8-4973-3abb-2ade-b65d29d57f41.png)

4.Projectタブ上でCreate -> Rendering -> LightWeight Render Pipelineを選択。
5.メニュー上でEdit -> Project Settingsを選択する。
6.Graphics -> Scriptable Render Pipeline Settingsに4で作成したファイルをアタッチする。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/21d48555-8a81-b880-6def-a2e4ef86194c.png)

# Shader Graphの利用
##インスペクタ上にプロパティを追加する。

1. +ボタンを押し、使用したい型を選択する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/e522f085-d2c3-c239-5705-d9c462213446.png"/>

MyTexture : インスペクタ上に表示される名前
Exposed   : インスペクタ上に表示するかどうか
Reference : シェーダ内での変数名
GatsbyJSを試してみた

## Gatsby.jsとは?

<a href="https://github.com/gatsbyjs/gatsby"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/fd8e7796-155b-9d28-8c7d-9a84a9fbc82c.png" width="460px"></a>

> Gatsbyは、Reactに基づく無料のオープンソースフレームワークであり、
開発者が非常に高速なWebサイトやアプリを構築するのに役立ちます

※ [Docs](https://www.gatsbyjs.org/)より

###  :computer:環境構築
****

まずはCLIが用意されているので、Gatsby CLIをインストールします。

```sh
$ npm install -g gatsby-cli
```

まずは試しにサイトを生成してみます。
※途中でpackage managerの `yarn` と `npm` どちらを使うか聞かれます。
今回は `yarn` を選択しました。

```sh
$ gatsby new my-site
? Which package manager would you like to use ? › - Use arrow-keys. Return to submit.
❯   yarn
    npm
```

生成後のディレクトリ構成は以下の様になりました。

```
.
├── LICENSE
├── README.md
├── gatsby-browser.js
├── gatsby-config.js
├── gatsby-node.js
├── gatsby-ssr.js
├── node_modules
├── package.json
├── public
├── src
└── yarn.lock
```

develop用のサーバーを起動し、ブラウザで `http://localhost:8000` を確認してみます。

```sh
$ cd my-site
$ gatsby develop
```

↓の様に表示されとけば成功です :sparkles: 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/47ff571c-70f9-489f-7041-42761f4aedeb.png" width="400" />

ちなみに、production用にbuildする場合は以下コマンドで行います。

```sh
$ gatsby build
```

また、production buildした内容を手元の環境で確認する場合は以下コマンドで行います。

```sh
$ gatsby serve
```

### :pencil: ブログを作成する
****
Gatsby.jsの雰囲気が掴めた所で、次はブログを作成してみます。
`https://github.com/gatsbyjs/gatsby-starter-blog` を使用する事で簡単にブログを作成できます。

```sh
$ gatsby new my-blog https://github.com/gatsbyjs/gatsby-starter-blog
```

生成後のディレクトリ構成は以下の通りで、先ほどよりBlog用にディレクトリやファイルが増えています。

```
.
├── LICENSE
├── README.md
├── content
├── gatsby-browser.js
├── gatsby-config.js
├── gatsby-node.js
├── node_modules
├── package.json
├── public
├── src
├── static
└── yarn.lock
```

早速ローカルで確認してみます。

```sh
$ cd my-blog
$ gatsby develop
```

ブラウザで `http://localhost:8000/` を確認すると以下の様なページが表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/35e548b4-4001-2722-11c4-64a68badec79.png" width="400" />

また、`http://localhost:8000/___graphql` を確認すると、ローカル環境のデータをQueryできる[GraphiQL](https://github.com/graphql/graphiql)が表示されます。
色々揃っていて素敵です :sparkles: 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/0e1ec9cc-890c-e258-e84c-59a8cd64ba63.png" width="400" />

----
#### 記事を追加する

記事追加も簡単で、`content/blog/` に追加するだけで自動で更新されます。
試しに `content/blog/sample/index.md` を以下の内容で作成すると

```md
---
title: これはサンプルです
---

## 追加された記事
```
直ぐに反映されます ↓

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/65084bd7-8f81-0e04-82d2-2735bf33ac98.png" width="400" />

追加したページ。URLは `http://localhost:8000/sample/` になります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/deb9a0ca-3036-6e93-4557-13b2b8b4704b.png" width="400" />

###  :rocket:  デプロイ
****

今回はまだ試せてないですが、`GitHub`,  `GitLab`,  `Bitbucket` いずれかにリポジトリを作成し、
[Netlify](https://www.netlify.com/) を使用する事で簡単に公開できるとの事でした。 :sparkles: 

### :link: 参考になったURL
****
- [Reactベース静的サイトジェネレータGatsbyの真の力をお見せします - Qiita](https://qiita.com/uehaj/items/1b7f0a86596353587466)
- [爆速静的サイトジェネレーターのGatsbyJs入門 | #TSUKAMON](https://tsukamon.com/blogs/3)
基本情報技術者試験合格！

久しぶりの投稿となります。


10/20 令和最初の資格取得として基本情報技術者試験を受けてきました。

この記事では、受ける前の勉強方法や受けた後の振り返り等を簡易的にではありますが書いていきたいと思います。


# 結果は？


| 午前 |午後|
|:--------:|:--------:|
| 72.5|63.0| 


午後はかなりギリギリになってしまいましたが、一発で合格できました:bangbang:



# 実際に受けてみて

:pencil2: 午前問題

　過去問からの再出題や類題が多く、過去問を繰り返し解いていれば問題ないかと思います。


:pencil2: 午後問題

  「ソフトウェア」「データベース」「ソフトウェア設計」「マネジメント」「Java」を選択。時間配分が上手くいかず、全部解ききれなかったです。読解形式で解くのは以前の IT パスポートにはなく、午前問題とは別物でした。



#午後問題についての考察

**主に長い文章を読んでそれに答える読解問題**で、IT パスポートにはなかった形式でした。午後対策をしていった中で、自分なりに考察したことを書いてみようと思います。


　1.　午前の知識が使えることもあるが、**基本は読解問題**。長い文章を読んでそれを踏まえて答えるので、**午前とは別の対策が必要**。


　2.　各問題には「問題点 → 対策 → その後」といったように、**文章の「流れ」というものがある**。これを知っておくだけでも、なんとなく読むことは無くなって文章を早く読めるようになる。


　3.　初めから最後まで文章を読んでから選択肢を見るのは効率が悪い。その答えを探すためにまた文章に戻らなくてはいけないため、二度三度手間がかかる。空欄にたどり着いたら、すぐさま設問を見て答えたほうがいい。


　4.　読むだけでなく、線を引いたり記号をつけたりメモをする等、**問題を再開してもすぐに思い出せるように書き込んでおく**のも重要。どんな語句に印をつけたり記号をつけるかは自分なりのルールを決めておくこと。


　5.　設問に書いてあることを正しく読めば、そのまま正解の選択肢を選ぶことができるものもある。


　6.　**「与えられた問題の範囲」で答えなければならない。**ゆえに、自分の経験や意見は入れないのが大事。**答えの根拠となる文章は必ず書かれているので、それを見つけて答える。**




#:pencil2: どんな勉強をしたか
　以前合格した IT パスポートとほぼ同じ感じです。参考書や過去問集は買いましたが、どちらかというと学習サイトや動画がメインでしたが、午前と午後で少し違います。



:star:　午前

 [基本情報技術者試験ドットコム](https://www.fe-siken.com/)

　IT パスポートに続いて、今回も大いにお世話になったドットコム。参考書も購入はしたが、ほとんどこれを使って勉強をしていた。


:star:　午後

情報処理教科書 出るとこだけ! 基本情報技術者[午後] （翔泳社）


　午後対策は書籍で勉強。初めてやる午後問題でいったいどこから手を付ければいいのかわからなかったとき、この書籍はかなり重宝した。出題の傾向を把握できるので、効率的に対策すべき分野を知ることができる。図解が丁寧で、午後問題をどうやって読んで解いていくのかが分かった。

　注意しなければならない点は、解法くらいしか載っておらず問題も一部分をピックアップして取り上げているので、**問題のすべての文章や設問が載っているわけではない**ということ。よって、この書籍だけに頼ってしまうと、実際の問題文の長さと設問の多さにギャップを感じる恐れがあるので、あくまで**「初めの取っ掛かり」「補助」**として使うのがよいと思われる。一通り読んで解き方を理解したら、実践でも使えるように過去問を使って練習するのが望ましい。

　アルゴリズムに関しても載ってはいるのだが、内容がかなり少ないので、アルゴリズム午後問題初学者にとってはかなり厳しい。別途、午後問題用のアルゴリズムの書籍を用意したほうが無難。選択言語の解法は一切ないので、こちらも別途で各自選択した言語の書籍を用意する必要がある。


# :star:　おわりに
　とりあえず、基本情報技術者試験に合格できて一安心といったところでしょうか。午後問題はいろいろと反省点が多かったように感じます。:sweat:

　それらを踏まえつつ、引き続き応用情報技術者試験の合格に向けてまた頑張っていこうかと思います！






P.S
以前受けたITパスポート試験に関する記事です。併せてどうぞ。
[IT パスポート試験合格](https://qiita.com/delph/items/bf6fcebb3af60468e7b0)
【Ionic】`ionic g page`でAn unhandled exception occurred: Schematic "page" not found in collection "@schematics/angular".が出てしまったら

## `angular.json`に設定を追加する。

```json:angular.json
{
  …,
  // ↓これを追加
  "cli": {
    "defaultCollection": "@ionic/angular-toolkit"
  },
  // ↑これを追加
  "schematics": {
    "@ionic/angular-toolkit:component": {
      "styleext": "scss"
    },
    "@ionic/angular-toolkit:page": {
      "styleext": "scss"
    }
  }
}
```

参考リンクでは、

```
"cli": {
  "defaultCollection": "@ionic/schematics-angular"
},
```
のように指定されていたが、現在[@ionic/schematics-angular](https://www.npmjs.com/package/@ionic/schematics-angular)は（最新のIonicであれば）[@ionic/angular-toolkit](https://www.npmjs.com/package/@ionic/angular-toolkit)に統合されたため、上記のように設定する必要がある。

## 参考
- [CLI v4 ionic generate page not working](https://github.com/ionic-team/ionic-cli/issues/3507)
- [fix: add default schematics and file extensions](https://github.com/ionic-team/ionic-conference-app/commit/0650686b7462c1e229a024d1ab52963a0b0df53a)
PIC16F18346でI2C通信【Master】

#概要
PIC16F18346をI2C Masterとして使用するためのテスト。
動作確認用SlaveとしてPCF8574T(アドレス：0x27)を接続。
MCC ver3.85.1を使用してコーディング。（MCCの導入については省略）

#MCCの設定
- Resource Manegement -> Device Resource:　MSSP1を選択
- MSSP1:　下記の内容で設定

| Serial Protocol: | I2C |
|:------------------------:|:----------------:|
| Mode: | Master |
| I2C Clock Frequency(Hz): | 100000 |
| Enable I2C Interrupt: | チェックを入れる |
※後述のMCCで自動生成されるサンプルコードでイベント割り込みを使用しているため、割り込みをENABLEにしている。

- Pin Manager:　SCL1とSDA1をどのピンに割り当てるか設定
- Pin Module:　SCL1とSDA1のStart High、Analog、Output、WPU、ODのチェックを外す
- Resource Manegement:　Generateをクリック



#コーディング
500ms毎にI2C_TxBufferの中身を、アドレス0x27宛に送信する。

```c:main.c
#include "mcc_generated_files/mcc.h"
#include "mcc_generated_files/examples/i2c1_master_example.h"
#define PCF8574T_ADD 0x27
uint8_t I2C_TxBuffer;

/*
                         Main application
 */
void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();
    
    while (1)
    {
        // Add your application code
        I2C1_WriteNBytes(PCF8574T_ADD, &I2C_TxBuffer, 1);
        I2C_TxBuffer++;
       __delay_ms(500);
    }
}
```

###ポイント
- サンプルコードを使用するために i2c1_master_example.h をインクルードする。
- INTERRUPT_GlobalInterruptEnable()、INTERRUPT_PeripheralInterruptEnable()のコメントアウトを解除する。

※I2Cの初期化は SYSTEM_Initialize() の中に入っているため不要。
※I2C1_WriteNBytes()の処理内容については i2c1_master_example.c を参照。
unsupported Scan


こんなエラーが出たら

``` go
sql: Scan error on column index x, name "updated_at": unsupported Scan, storing driver.Value type <nil> into type *time.Time
```

null パッケージを使う

``` golang

import (
	"gopkg.in/guregu/null.v3"
	"time"
)

type Hoge struct {
	Id             int64 
	Hoge           string
	CreatedAt      time.Time
	UpdatedAt      null.Time
	DeletedAt      null.Time
}
```

代入は、キャストして

``` go
Hoge.UpdatedAt = null.TimeFrom(time.Now())
```
Saving Plansによるコスト試算

# Saving Plansによるコスト試算

## はじめに

AWSで運用しているシステムでコスト効率を上げるため、**Saving Plans**のコスト試算に関して調べました。
**基本料金**と**Saving Plans**のコスト試算についてまとめています。

## EC2の料金

[Amazon EC2 料金表](https://aws.amazon.com/jp/ec2/pricing/on-demand/)を確認しましょう。
基本的に常時稼働のEC2インスタンスではリザーブドインスタンス(RI)を購入して運用している方が多いと思います。
**Saving Plans**では、常時稼働ではないが定期的・不定期に停止・起動を行っているようなサーバに適用することでコスト削減が望めそうです。

## Fargateの料金

[AWS Fargateの料金](https://aws.amazon.com/jp/fargate/pricing/)を確認しましょう。
**2019/11/23現在、東京リージョン(ap-northeast-1)**では以下の料金となっていました。

リソースタイプ | 料金(per hour)
-----------+---------------
1 vCPU     | $0.05056
1 GB MEM   | $0.00553

## Saving Plansでのコスト試算

AWSマネジメントコンソールのうち、EC2サービスに**Saving Plans**のメニューがあるので選択します。
**※こちらに記載されている説明文(英語)はPurchase Saving Plansのリンク先に日本語訳があるので無視して大丈夫です**
**※請求ダッシュボード→Cost Explorer→コストエクスプローラ→Saving Plansからもいけます**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158971/ce023458-5895-7cee-418d-a19d2b26bb42.png)

### Saving Plansについて

上記の画面で**Purchase Saving Plans**のリンクをクリックすると以下の画面が表示されます。
以下の説明文にある通り、2種類の**Saving Plans**を提供しているようです。

* Compute Saving Plans
* EC2 Saving Plans

主に`Amazon ECS on AWS EC2`か`Amazon ECS on AWS Fargate`で使い分ける感じでしょうか:thinking_face:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158971/b0bfc400-3f36-9268-35ec-868a3cd7d9b4.png)

### Saving Plansでのコスト試算について

**推奨する Compute Saving Plans**、**推奨する EC2 Instance Saving Plans**にある通り、コストエクスプローラにより自動で算出された推奨プランを提示してくれる様です。
頭捻って色々試算しないといけないなと思ってましたが、トグルスイッチをポチポチ切り替えるだけで**Saving Plans**の種類や期間に応じた推奨プランを提示してくれるのでコスト試算するのはそんなに難しくないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158971/760a3de2-4582-13d3-a3a6-d2c9017869e3.png)

## Saving Plansの注意点について

* **Compute Saving Plans**
  * どの**ECS Cluster**に適用されるのか意識して購入しましょう
* **EC2 Instance Saving Plans**
  * どの**EC2インスタンス**に対して何が適用されるか意識して購入しましょう
      * **Saving Plans**上は**インスタンスファミリ**までしか表示されません
      * [脳死](https://dic.nicovideo.jp/a/%E8%84%B3%E6%AD%BB)で推奨プラン通りに購入してしまって、`実は不要な前払い料金を払ってしまった・・・`なんてことも発生しうると思います。
      * (**Saving Plans**で使用傾向は加味して推奨プランを提示してくれますが)定常的に起動/停止していない変則的に利用するサーバなどが含まれている可能性があります
  * 1年以内に廃止する予定のサーバなど含まれていないか考慮しましょう
      * 損益分岐点がいつなのかも考慮できると良さそうです

## 参考リンク

* [New – Savings Plans for AWS Compute Services](https://aws.amazon.com/jp/blogs/aws/new-savings-plans-for-aws-compute-services/)
* [EC2やFargateが最大72%割引となる新しい料金モデル「Savings Plans」がリリースされました](https://dev.classmethod.jp/cloud/aws/new-savings-plans-for-compute/)
【Unity】トップ

# シェーダ
[Surface Shader入門](https://qiita.com/ogawa-to/items/67eda5ff375c1ea3c339)
シェーダ サンプル集
PostEffect サンプル集
Lighting サンプル集
[Shader Graph入門](https://qiita.com/ogawa-to/items/c6bdf44e5ebfc02a1abd)

# 3Dアニメーション
[第一回 幾何学オブジェクトをアニメーション](https://qiita.com/ogawa-to/items/033654fa12009f838b2c)
[第二回 自作アニメーションを作成する。](https://qiita.com/ogawa-to/items/a2513b0340336ecf4ea4)
[第三回](https://qiita.com/ogawa-to/items/1d1a9038c6e73c810560)

# コルーチン
[コルーチンとシーン遷移](https://qiita.com/ogawa-to/items/be474429b87ad9072e45)

# UI
[UIまとめ](https://qiita.com/ogawa-to/items/5046ca1f3e65843e4fb7)

# プロジェクト管理
[UnityプロジェクトでGitで管理すべきファイル一覧](https://qiita.com/ogawa-to/items/68b93ea3efe885aee5a1)
[作成したゲームをWebで公開する方法](https://qiita.com/ogawa-to/items/9026235e3cdbd700a7d2)

# 設計手法
[設計手法](https://qiita.com/ogawa-to/items/b2108a92189776a99590)

# チップス
[2Dプロジェクトにおける座標系について](https://qiita.com/ogawa-to/items/722f8d8be7fd41031386)
[2Dスプライトの分割ロード](https://qiita.com/ogawa-to/items/a6c0cf476ce6cf617136)
[プレビュータブでカメラとUIの表示領域を合わせる](https://qiita.com/ogawa-to/items/9f85f4f1a92f6ed72f19)
[オブジェクトの実行順序を設定する](https://qiita.com/ogawa-to/items/f8c26193cacfa3d2d666)
[オブジェクトをなめらかに動かす](https://qiita.com/ogawa-to/items/a923a24745d4a28019a1)
[フォントで日本語を表示する](https://qiita.com/ogawa-to/items/b5cfdbc5fe35e591d09a)
[画像に関するクラスについて](https://qiita.com/ogawa-to/items/b9a9d1e142c0ba74373a)
[SerializeFieldとは](https://qiita.com/ogawa-to/items/e3f33c22358c5006fba4)
[material変更時にはまったこと](https://qiita.com/ogawa-to/items/cd97e1c04ab3f640cd1b)
[公式のソースコードを閲覧する](https://qiita.com/ogawa-to/items/424f711e37fa33e6e1ce)
[inspectorでクラスを設定する](https://qiita.com/ogawa-to/items/d82dbc47f28be2c772cb)
[SerializeFieldの警告を削除する。](https://qiita.com/drafts/a74acc7d4f6798edcfc2/edit)
[GUI : スクロールの使い方]
(https://qiita.com/ogawa-to/items/d9c9830bcae80de2660c)

### 制作物
[Seek And Shoot](https://qiita.com/ogawa-to/items/1c0f6d62fa1ff561b7f8)

### 講座の受講
[シャドバ風カードゲーム](https://qiita.com/ogawa-to/items/ac3fced0c2a0329db6a2)
いつのまにかGoogle ColabのGPUにP100-PCIE-16GBが追加されていた件

※※この記事は2019/11/24の時点での話になります。
もうみんな知ってるのかもしれないと思いつつも。。。。

## Google colabのGPUガチャについて
GPUのガチャがあるのはよく知られているかと思います。
詳しくは下記参照。
https://qiita.com/koshian2/items/d33edc963ed6cfcad77e

## きっかけ
なんかいつもより早いなあっと思ってGPUを調べたら下記の通りP100が追加されてました。
![キャプチャ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509891/beae0c9d-3b53-19bc-cca9-dec2fee0097f.jpeg)


## GPU速度比較
早速ですが、訓練速度比較してみました。
使用したコードはGoogleSeedbankから適当に拾ってきたpix2pixのコード
https://research.google.com/seedbank/seed/pixpix_with_eager_execution

Seedbankについてはこちら。
https://qiita.com/tomo_makes/items/e5a309687f5054ba471f

epochは10に設定して、速度比較した結果がこちら。

|GPU|計算時間/sec|
|:---:|:---:|
|K80|723.3|
|T4|411.4|
|P100|250.1|

すごい早い。こりゃますますColabに依存してしまいますね。。。

## GPUガチャ結果（30回）
ちなみに、どんな感じで配分されているか確認するために
30回ぐらい「すべてのランタイムリセット」→「nvidia-smi」を繰り返してみました。

|GPU|回数|確率/%|
|:---:|:---:|:---:|
|K80|12|40|
|T4|4|13.3|
|P100|14|46.7|

この感じだとK80と同じぐらいの確率っぽいですね。
※あまり使用頻度が高いとK80だけ割当られたりするので、
　この結果はあくまで参考程度だと思います。

## 最後に
ガチャの回数が30回なのですが、実は100回ぐらいやろうと思ったのです。
ただ、途中で下記のような割り当て拒否にあってしまいました。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509891/749f1e79-11e5-2bac-da4c-af1bfd60ecb5.png)

どんなもんか興味本位だったのですが、その日はもう進められないという悲惨な結果に。
皆様、GPUガチャは程々に！素晴らしいGoogleColabライフを！
[Python]unittestを使ったテストコードの書き方

#unittestによるテストコードの書き方
##そもそもテストコードが必要な理由
1.プログラムが洗練される
2.デグレを防ぐことができる
※デグレとはプログラムを修正したことで今まで正常に動作していた機能に不具合が生じるようになること

他にも理由はありますがざっくりとテストコードが必要な大まかな理由はこの2点です。

##ユニットテストの手順
・unittestをimportする
・unittest.TestCaseを継承してクラスを作成する
・関数名の頭はtest_にすることが慣例


下記サンプルコード

```python:test.py
import unittest
class Test~(unittest.TestCase):
   def test_~(self):
```

##assert関数

assert関数はunittestにおいてよく利用される関数です。
種類がいくつかあるので状況に応じて使い分けます。

| 関数名      |        |
|:-----------------|------------------|
| assertEqual(a,b) | a=b |
| assertNotEqual(a,b)| a!=b|
| assertTrue(x)| x=True|
| assertFalse(x) | x=False|
[UE4]ActorTagとComponentTag


#初めに
アクターとコンポーネントにはTagsというプロパティがあります。
FName型の配列になっていて、自由に文字列を追加できます。
**が、特に直接なにか動作が変わるものではありません。**
**また、GameplayTagsとは全く関係はありません。**


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/7732fb55-50b2-d988-0ea0-de3f277ccd2a.png)


#何に使うの？

ComponentやActorの識別に利用できます！
キャストや名前の比較などでも同等のことができる場合もありますが、こちらはAActorやUActorComponentなどの基底クラスに実装されているため
キャストほど高価ではありませんし、FName(ランタイムでは整数比較)での処理となり、
クラスなどの「型」を必要としないためアセット間のリファレンスが追加されないというメリットがあります。

たとえばアクターに以下のようなStaticMeshComponentを4つ追加した場合、それぞれを識別するのはなかなか面倒ですがActorTagをつけることでそれが容易になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/949a2df3-d709-a4a1-05d1-776f458784ac.png)

#利用例
ブループリントの中で使ってみましょう！
以下の例はGetComponentsByTagを使って、Boxというタグを持っているPrimitiveComponentの表示/非表示を切り替えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/e35f340a-603a-c2c3-7ba1-762c1ec11e2f.png)


次の例ではPrimitiveComponent配列に対して、ループを回しながらComponentHasTag関数を使って識別を行っています。(対象のコンポーネントが一つしかないことを前提としています)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/5ea63744-9e19-c602-c5a3-79f2aba7edd4.png)

※このようなExecutionピンを持たないGetComponentsByTagのような**Pureノード**を直接ForLoopなどのマクロに刺すと大きな負荷を生み出すことが多いので、
テンポラリ変数に保存するなどの対策をご利用ください。

他にはコリジョンイベントなどで、一部のアクターにだけ反応したい場合にこのタグを使って(Castなどを回避しながら)識別したりすることが可能です。

Typoなどの危険性はあるので、間違いがあると困る部分はc++側のコードで定数としてFNameを扱う方がいいかもしれません。
【css】複数画像を背景に指定して固定する

#仕上がりはこんな感じ
![5d820030a2593bf15b9060b8512bac73.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480700/c886454d-359d-e628-ee69-ab11d6a3f6e6.gif)

#どのような指定をしたか
複数指定することがあまりないのでピンときませんが、
ちょい足しでできるようです。
ショートハンドというテクニックで下記のようにスッキリシンプルに指定できるようです。

```style.css
body {
  background:
    url(img/hidoi_reply_yokeru_woman.png) left  top / 40% no-repeat fixed,
    url(img/hidoi_reply.png)              right top / 40% no-repeat fixed;
}
```
**※コメント欄にて神にもっと簡単な書き方あるで！と教えていただきました！！（2019/11/27更新）**

#デモページ（2019/11/27更新）
http://okachanblog.com/static/20191124background/

#ひとこと
一枚画像作ろうと思ってたけどこの方法を知って、
複数配置をちょい足しで実装できたので画像作る手間省けました！
ラッキー！

#参考記事
コメント欄の神の声

CSS での複数の背景の利用方法
https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Background_and_Borders/Using_CSS_multiple_backgrounds
Google Colaboratory上でmusic21を利用

#はじめに
Jupyter上で楽譜が表示できると聞いて、[music21](http://web.mit.edu/music21/doc/about/what.html)というパッケージを試してみた。
[Google Colaboratory](https://colab.research.google.com/)上で表示させるのに手間取ったので備忘録として残しておく。

#インストール方法
X virtual framebufferを以下のコードのように設定をすることで、Colaboratory上でも楽譜が表示されるようになる。

```python:setup.py
# music21のインストール（Jupyterと共通）
!pip install --upgrade music21
!apt-get install musescore
# 仮想フレームバッファの設定（Google Colaboratoryで必要な設定）
!apt-get install xvfb
!sh -e /etc/init.d/x11-common start
import os
os.putenv('DISPLAY', ':99.0')
!start-stop-daemon --start --pidfile /var/run/xvfb.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -screen 0 1024x768x24 -ac +extension GLX +render -noreset
# パスの設定（Jupyterと共通）
from music21 import *
us = environment.UserSettings()
us['musescoreDirectPNGPath'] = '/usr/bin/mscore'
us['musicxmlPath'] = '/usr/bin/mscore'
us['directoryScratch'] = '/tmp'
```

#実行結果
『カエルの歌』の楽譜などを表示してみた。

```python:plot.py
#TinyNotation記法による『カエルの歌』
cp = converter.parse('tinyNotation: 4/4 c4 d4 e4 f4 e4 d4 c4 r e4 f4 g4 a4 g4 f4 e4 r c4 r c4 r c4 r c4 r c8 c8 d8 d8 e8 e8 f8 f8 e4 d4 c4 r')
#楽譜の表示
cp.show()
#ピアノロール式表示
cp.plot()
#ヒストグラム表示
cp.plot('histogram', 'pitch')
```

##楽譜の表示
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23691/3e981575-8b1a-77a9-11fc-66d21633400f.png)
##ピアノロール式の表示
<img width="585" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23691/8e3dca1b-0add-3e26-49cb-f77fe3ea45ac.png">
##ヒストグラムの表示
<img width="584" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23691/48574ee9-0fd3-c329-d4a4-420f689f45fd.png">


#課題
MIDI再生がうまくいかない。
Web Audio APIと紐付けるか、ローカルマシンのデバイスが利用できれば聞こえるはず、時間のあるときにでも検証したい。

```python:play.py
#リファレンス上は下記のコードで再生されはず...
cp.show('midi')
```

誰か分かる人がいたらぜひ教えて下さい。
AD の SYSVOL 複製が FRS かどうか確認するコマンド

## Active Directory の SYSVOL 領域の複製方法

Active Directory における SYSVOL 領域の複製方法には、FRS と DFS-R があります。

Windows Server 2008 以降に新規作成したドメイン (ドメインの機能レベルが Windows Server 2008 以上) では DFS-R が利用されていますが、Windows Server 2003 などの時代からアップグレードを繰り返しているドメインでは、明示的に変更をしていなければ FRS で複製が行われているはずです。

前々から、FRS から DFS-R への移行を推奨されていましたが、ついに Windows Server 2016 (1709) および Windows Server 2019 からは FRS が利用できなくなりました。

[The End is Nigh (for FRS) – updated for WS2016](https://techcommunity.microsoft.com/t5/Storage-at-Microsoft/The-End-is-Nigh-for-FRS-8211-updated-for-WS2016/ba-p/425379)

もし、FRS のままになっている場合、複製ができない状態となってしまうため、DFS-R への変更が必要です。

今回は、念のため確認するコマンドを確かめてみましたので、それを残しておくものです。

なお、DFS-R への変更の手順や、もっと詳しい情報については、[こちら (FRS から DFSR への移行)](https://blogs.technet.microsoft.com/jpntsblog/2009/12/04/frs-dfsr-sysvol/) が参考になると思いますので、適宜参照ください。

## 確認するコマンド

### 確認した環境

* Windows Server 2019

### コマンド内容

```
dsquery * "CN=Domain System Volume,CN=DFSR-GlobalSettings,CN=System,DC=lab,DC=contoso,DC=com" -scope base
※ドメイン名は "lab.contoso.com" と仮定
```

値が見つかった場合は、DFS-R を利用している状態です。値が見つからない場合は、その旨を示すエラーが発生します。

-----

＃しかし、この辺の話は「インフラ」なので「プログラミング」ではない気がしますが、公開プラットフォームとしては Qiita でも良いんですかねぇ…あんまり気にしないで記事にしちゃいますが…
ftp通信でwordpressのユーザーをゴリ押し作成

備忘録
※結構ゴリ押し技
※参考元→https://cunelwork.co.jp/blog/web/user_register/

-FTP通信はできるけどwpのパスワードを忘れた人

初っ端に盛り込む

```php:wp-content/themes/テーマ/header.php
<?php
	// 設定
	$user_login = 'admin'; // ログインID
	$user_pass = 'password'; // ログインパスワード
	$user_email = 'hoge@example.com'; // メールアドレス
	$role = 'administrator'; // 権限を管理者に

	// ログインユーザーの登録
	if (!username_exists($user_login)) {
		$data = array(
			'user_login' => $user_login,
			'user_pass' => $user_pass,
			'user_email' => $user_email,
			'role' => $role
		);
		wp_insert_user($data);
	}
?>
```

1.ftpで上記をアップロード
2.サイトにアクセスするとheader.phpが一度読み込まれるので上記コードが実行されて、ユーザー作成完了
3.正式な手続きでユーザーを作成して、上記を削除したheader.phpを削除(必ず)
ModuleNotFoundError: No module named 'flask_sqlalchemy'

pyenvの仮想環境でflaskを使ってデータベースを扱おうとしている.

データベースはSQLalchemyってのと、postgrewみたいなのを使おうとしてるけどずっと冒頭のエラーがでる。
requirements.txtを変更してデプロイしてるのになぜ？

⇨pip install flask-sqlalchemyをpipenv install flask-sqlalchemyにしてデプロイし直したらこのエラーは消えたかも

新しいエラー出たけど

以上。

追記：と思ったらやっぱエラーでたわ。なんやねんこいつう。
【haml】クラス名を設定する【class】

#はじめに
hamlによるマークアップを進める中で
クラス名の設定で少し苦戦したので備忘録として残します。

#クラス名設定の基本
「%div」に「hogehogeクラス」を設定します。
これは以下のように記述することで正常に動作します。

```haml

  %div{ :class => 'hogehoge'}
  %div{ class: 'hogehoge'}

  //以下のように { の前にインデントが挟まるとエラーが出ます。
  %div { :class => 'hogehoge'}
  %div { class: 'hogehoge'}
```

#「{}」と「class」は省略可能
これでコードもだいぶスッキリします。

```haml

  %div.hogehoge
```

#さらに「%div」も省略可能
divタグに関してはここまで省略しても問題なくクラス名が設定されます。

```haml

 .hogehoge
```

##補足）%div以外の省略はここまで
```haml

 %p.hogehoge
 %a.hogehoge
 %span.hogehoge
 %ul.hogehoge
 %li.hogehoge
```

##補足）クラスは続けて複数設定可能
```haml

 %div.hogehoge.btn
 //「hogehoge」「btn」の2つのクラスを設定しています。
```

#rubyの要素にクラス名を設定する
rubyのコードをhamlに記述する時には「-」や「=」に続いて記述を行います。

ここで引っかかりました...
form_forのtext-field（テキストフィールド）やsubmit（送信ボタン）にクラス名を設定する時、
「.」に続いてクラス名を設定することに慣れた後だったので
なんとか「.」を使ってクラス名を設定できないかと固執してしまいました。

最終的に、以下のように基本に立ち返って
クラス名を設定することでエラーなく動作しました。

```haml
  .form
    = form_for [@message] do |f|
      .input-box
        = f.text_field :text, { :class => 'input-text' }
      = f.submit "Send", { :class => 'submit-btn' }
//{ class:'input-text' }{ class:'submit-btn' }でも問題なく動作します。
```
これも省略が可能で、以下のように記述しても問題なく動作します。

```haml
  .form
    = form_for [@message] do |f|
      .input-box
        = f.text_field :text, class: 'input-text'
      = f.submit "Send", class: 'submit-btn'
```

#終わりに
以上、Haml記法におけるクラス名設定方法の簡単なまとめでした。
HTMLがとても簡単に書けるようになってとても便利ですが、
慣れない内は今回のような小さな苦戦も頻発するかと思います。
またつまづいたら、詳しく調べてアウトプットしようと思います。
転んでもただでは起きぬ！
Shift-JIS, UTF-8をC言語で扱うために文字コードについて調べた

Shift-JIS, UTF-8をC言語で扱わないといけなかったけどわからなさ過ぎたので、文字コードとC言語での扱い方について調べたり考えたりした。
嘘は言ってないつもりですが、それでも間違ってたら優しく教えてくださるととても嬉しいです。
特に脚注の疑問が気になっているのでお気軽にぜひ...


## 文字コード
### ASCIIコード
特徴

- 半角英数と制御文字(改行コードとか)だけを表すための文字コード
- 1バイト
- 最上位bitは常に0(上位4bitは7まで)

例): 
a → 61

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490290/8efc9ed4-1a52-2614-28d1-c1ad4a24dde1.png" , width=70%>
>https://en.wikipedia.org/wiki/ASCII より

### Shift-JIS
特徴

- 日本語を表現するために発明された文字コード
- ASCII文字はそのまま使い、使われていないコード(最上位bitがA以降)に半角カタカナを割り振る → **ASCII互換**
- 全角文字(平仮名など)の表現のために2バイトのコードを使う → **1~2バイトの可変長**

例): 
a → 61
ｱ → B1
あ → 82 A0

1バイト目("あ"の場合は"82")にASCIIで使われていない値が来た場合に2バイト文字と判断し、2バイト目も扱う。

### Unicode
特徴

- 全世界の文字を統一的に表現するための文字コード
- 最大21bit
- 複数の符号化方式がある(効率的なデータ保存のため？)
    - UTF-8
    - UTF-16
    - その他割愛

Unicode → UTF-8とか(符号化) → Unicodeのように使う

例): 
a → U+0061
あ → U+3042

#### UTF-8

特徴

- Unicodeの符号化方式
- ASCII文字は1バイト、そのほかは2~4バイトの可変長で表現(日本語は3バイト) → **ASCII互換**

例): 

| 文字 |Unicode |UTF-8 |
|:-:|---|--:|
| a |U+0061| 61|
| あ|U+3042| E38182|


文章の先頭につくBOM(Unicodeの符号化方式の判別用のマーク)は3バイトだが、必須でも推奨でもないのでなくてもいい。Excelで開くときにはBOMがないと問題が起こるらしい。

#### UTF-16

特徴

- Unicodeの符号化方式
- 基本は2バイト固定。2バイト以下で表せないものはサロゲートペアと呼び、2バイト×2の4バイトで表現する(ここは少し自信なし)
- Windows標準で、C#のstringもUTF-16らしい[^1]


例): 

| 文字 |Unicode |UTF-16 |
|:-:|---|--:|
| a |U+0061| FF41|
| あ|U+3042| 3042|
サロゲートペアについては以下に例がある。
>Unicode番号が16進数で10000以上の文字を、UTF-8(およびUTF-16)では1 符号単位で表現することができない。
そのため、Unicode番号D800〜DBFFとDC00〜DFFFの組み合わせで表現した仕組み。
https://qiita.com/deco/items/81338e744945f9fef5b2 より

## C言語での表現

今までのまとめ。"あ"と"a"の各符号化方式。

| 文字 |Unicode |UTF-8|Shift-JIS|UTF-16 |
|:-:|---|--:|--:|--:|
| a |U+0061|61|61| FF41|
| あ|U+3042|E38182| 82A0| 3042|

一方、C言語では

- `char`は1バイト。
- ~~`wchar_t`は`setlocale(LC_ALL, "jpn")`して日本環境にすると2バイト固定。~~
- `wchar_t`は環境によりバイト数が違う。Windowsだと一般に2バイト、Andoroidだと4バイトだったりするよう。

よって"あaあ"という文字列を表現した場合、以下のように認識される。

| 型|符号化方式 |バイト列 |
|:-:|---|:--|
| char  |UTF-8 | E3 81 82 61 E3 81 82|
| char |Shift-JIS | 82 A0 61 82 A0|
| char |UTF-16| 30 42 FF 41 30 42|
| wchar_t  |UTF-8 | E381 8261 E381 8200[^2]|
| wchar_t |Shift-JIS | 82A0 6100 82A0[^2]|
| wchar_t  |UTF-16 | 3042 FF41 3042|
※脚注がついているものは間違っている可能性大です。教えてください。

### 結論
- 結合するだけとかで、文字数や各文字を識別する必要がないなら`char`だけでいい。
- 文字数を気にしたい場合はShift-JISとUTF-16なら`wchar_t`が完璧。
- UTF-8で文字数識別が必要とかになったらどうするんだろう。char32_tとか調べきれてない型を使うのだろうか。

- UTF-8とShift-JISの変換に関して「`MultiByteToWideChar()`でワイド文字(Unicode)に直してから`WideCharToMultiByte()`でマルチバイト文字に戻す」ということ文を見た。Windowsのページなので、これはたぶん「`char` → UTF-16(`wchar_t`) → `char`」という意味の、"Unicode=UTF-16過激派"の表現なんだなと思った。どこかのブログに「microsoftがUnicodeと言ったらUTF-16のことである」って書いてあったし、紛らわしい。

[^1]: メモ帳を保存するときの文字コードの選択肢にあるUnicodeはUTF-16(リトルエンディアン)のこと指しているらしく、文字コード初学者にとって非常に紛らわしい。
[^2]: `E38182 61`(UTF-8の"あa")のような奇数バイトの文字が`wchar_t`に入った場合に、`E381 8200 6100` or `E381 8261`になるのかわからなかったです。誰か教えてください...
#16 iOS13以降の画面遷移で前の画面に戻れてしまう問題の解決方法1例

#はじめに
個人のメモ程度の出来なのであまり参考にしないで下さい．


#環境
Xcode：11.2.1
Swift：5.1.2
2019/11



##part1
画面の遷移先の`View Controller`を選択している状態で，`Attributes inspector`の`Presentation`を`Full Screen`に変更する．

<img width="259" alt="スクリーンショット 2019-11-24 午前0.39.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/ae89c5ba-6bb8-77b4-2330-61cf7fe1ca8a.png">
Ruby on Rails　パラメータ付き遷移処理の方法

<h2>概要</h2>
遷移元のテキストボックスに入力した内容を、遷移先の画面に表示します。

<h2>画面イメージ</h2>
<h3>遷移元</h3>
<img width="410" alt="qiita_sc_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222940/7ccdaa06-a2ab-97dc-991c-4b99f699ec11.png">
<h3>遷移先</h3>
<img width="410" alt="qiita_sc_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222940/5a96b6c5-a3c6-f9bb-01ce-5be9276ee8c7.png">

<h2>プログラム：共通</h2>
ルーティングを設定します。
moveアクションが遷移するアクションです。
indexアクションで遷移元で入力された値を受け取ります。
:nameがパラメーターで、入力された値が入っています。

```rb:routes.rb
Rails.application.routes.draw do
  post 'move' => 'home#move'
  get  'second/:name' => 'second#index'
end
```

<h2>プログラム：遷移元</h2>
form_tag内にアクション名「move」を設定し、
text_field_tagのパラメーターを「name」にします。
これで、button_toで生成されたbuttonを押下すると、
遷移する際に、テキストボックスに入力された値を渡すことができます。

```html:遷移元.html.erb
<h3>画面１</h3>
<div>
  <%= form_tag("move")do %>
    <%= text_field_tag "name"%>
    <%= button_to 'Button'%>
  <% end %>
</div>
```

controller内では、redirect_toで遷移先のパスと、
テキストボックスで入力された値をパスに入力し、遷移させます。

```erb:遷移元_controller.rb
class HomeController < ApplicationController
  def top
  end
  def move
    redirect_to("/second/#{params[:name]}");
  end
end
```

<h2>プログラム：遷移先</h2>
変数名「@name」に代入されている値を表示しています。

```html:遷移先.html.erb
<h3>画面２</h3>
名前は<%= @name %>です。
```

params[:name]で、遷移元で入力された値を取得し、htmlに表示する変数に代入します。

```rb:遷移先_controller.rb
class SecondController < ApplicationController
  def index
    @name = params[:name]
  end
end
```
Dockerイメージ削除時に Error: No such image

不要なイメージを削除しようとしたらエラーが発生した。

```
$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
<none>                     <none>              7236d7baccf7        24 hours ago        1.19GB
ruby                       2.6.1               99ef552a6db8        8 months ago        876MB

$ docker rmi 723
Error: No such image: 723
```

どうやら、リポジトリ+タグ で指定すると削除できるらしい。

```
$ docker rmi <none>:<none>
bash: syntax error near unexpected token `newline'
```

うん。ダメだよね、知ってた。
`docker prune` で消せるかな？

```
$ docker images prune
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
<none>                     <none>              7236d7baccf7        24 hours ago        1.19GB
ruby                       2.6.1               99ef552a6db8        8 months ago        876MB
```

ダメかぁ・・・ `docker system prune` で削除してみる。

```
$ docker system prune
WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all dangling images
        - all dangling build cache
Are you sure you want to continue? [y/N] y
Deleted Networks:
docker_default

Deleted Images:
deleted: sha256:476ecb9f768812b356cbb920474edbb9321d2d84739e47726d3a15bf7b448e2b


$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
ruby                       2.6.1               99ef552a6db8        8 months ago        876MB
```

消せた！

ファイルシステムからイメージを削除しても消せるらしいけど、そちらは未検証。
絶対に覚えておきたいUNIXコマンド

プログラミング学習メモ用

```terminal:tarminal
$ cat ファイル名
///ファイルの中身を確認
```

```terminal:tarminal
$ pwd (print working directory　の略) 
///ルートディレクトリからカレントディレクトリまでの階層が全て表示される
```

```terminal:tarminal
$ ls (list) 
///カレントディレクトリの中身を確認
```

```terminal:tarminal
$ cp コピーするファイル名 新しいファイル名
///ファイルをコピー
```

```terminal:tarminal
$ cp -r （recursive）　コピーするディレクトリ名 新しいディレクトリ名
///ディレクトリをコピー
```

```terminal:tarminal
$ rm ファイル名
///ファイルを削除
```

```terminal:tarminal
$ cd -p（parents オプション） 新しいディレクトリ名（親）/新しいディレクトリ名
///コピー
```

```terminal:tarminal
$ history
///コマンドの履歴
```

```terminal:tarminal
$ ln -s config/production/database/ dbconfig
///シンボリックリンク
```

```terminal:tarminal
$ unlink 消したいリンク
///リンク削除
```