OmniAICreator/Qiita-1.07M huggingface dataset:
Deepfake detection challenge のメモ

https://deepfakedetectionchallenge.ai/

Kaggle で Deepfake Detection Challenge が行われています(31 Mar/2020 まで).

略して **DFDC** です.

2019/12/11 に完全な(full)データが公開されました(取得には Kaggle アカウントと Terms of use への同意が必要です)

## データセット

データは zip で 472 GB ありますが, 実バイト数は 500 GB(1000*1000*1000 換算)あります. 中身はほぼ mp4 で, 展開してもデータサイズは 500~600 GB に収まるかとは思いますので, 1 ~ 2 TB くらいのディスク容量は必要かと思います. 
(Gen4 な NVMe SSD が理想(4~5 GB/s)なところですね)

json に, mp4 が fake か real かの情報があります.

ちらっとみた限りでは, fake とすぐわかるものもあれば, 人間の目からは見分けがつかないものもあります.

動画ブラウザ + 画像 diff(idiff https://openimageio.readthedocs.io/en/latest/idiff.html or perceptual diff https://github.com/myint/perceptualdiff あたりを使って) がほしくなりますね.

## 関連研究

Kaggle の Discussion Forum に逐次いろいろポストされていますが, 公開されているものとしては,

https://github.com/drbh/deepfake-detection-challenge

https://github.com/aerophile/awesome-deepfakes

faceswap 

https://github.com/deepfakes/faceswap

は DFDC に使えると便利そうですね.

## チャレンジ方針

とりあえず FaceForensics++ 論文を読んでからどうするかですが, 画像の差分(シェーディングの差分, 幾何的な差分, etc)や生物学的な差分に加え, 音声と動画の差異も活用することになりそうですから, VisemeNet https://arxiv.org/abs/1805.09488 など, 音声 + facial landmark なども考慮するとよさそうかしらん.

Kaggle の forum でいろいろ情報交換もされていますね.

## 役立ちそうな情報

Liveness Detection with OpenCV
https://www.pyimagesearch.com/2019/03/11/liveness-detection-with-opencv/

単一顔画像からの 3D 復元 Deep3DFaceReconstruction を試す(2019 年 9 月 7 日)
https://qiita.com/syoyo/items/6d911c598c5ee670d3b8

Modeling and Animating Eye Blinks
https://vimeo.com/157517464
PodmanでJenkinsを起動してみる

# 環境

Fedora CoreOS 31.20200113.3.1
Podman 1.7.0
Podman Compose 0.1.5

# 準備

```
$ sudo sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/sysconfig/selinux
$ sudo reboot
$ sudo rpm-ostree install python3 -r
$ sudo pip3 install podman-compose
$ mkdir -p ~/.local/bin
$ curl -o ~/.local/bin/podman-compose https://raw.githubusercontent.com/containers/podman-compose/devel/podman_compose.py
$ chmod +x ~/.local/bin/podman-compose
$ mkdir jenkins_home
$ chmod 777 jenkins_home
```
# ファイル

```docker-compose.yml
version: "3.7"
services:
  master:
    image: jenkins/jenkins:lts
    restart: always
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./jenkins_home:/var/jenkins_home
```

# 実行

```
$ podman-compose up -d
$ podman ps

CONTAINER ID  IMAGE                          COMMAND  CREATED         STATUS             PORTS                   NAMES
d9fe9bb22b8d  docker.io/jenkins/jenkins:lts           26 seconds ago  Up 26 seconds ago  0.0.0.0:8080->8080/tcp  jenkins_master_1
```
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/89f37888-fc17-f573-8a50-d1579fdef221.png)
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/6bb073e9-29e2-6ab6-dc1e-6c09abed2461.png)
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/6f3b331f-fc60-c472-bd3d-0e6e543879c4.png)
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/86a074f7-7953-c253-59a7-02d99f87c9dc.png)
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/c047f7a7-ddca-2b65-ca16-43f91e991b1e.png)
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/923ee274-cfdb-1d8c-d7ad-7864c5b97090.png)
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/252c50b4-d3af-fddb-6e13-2ba988bc116b.png)
キーボードから手を離したくない人のための良く使うショートカット + テクニック

# 環境
<b>os : Windows10 home 64bit

# まえがき
結局普通のショートカット集です

# ショートカット
|キー  |内容  |一言  |
|---|---|---|
|Ctrl + A  |全選択  |  |
|Ctrl + C  |コピー  ||
|Ctrl + X  |切り取り||
|Ctrl + V  |ペースト  ||
|Ctrl + S  |ファイルの保存||
|Ctrl + Z  |操作を戻す|- 押しっぱなしで連続して戻す  |
|Ctrl + Y  |操作を進める|- 押しっぱなしで連続して進める|
|Ctrl + T  |タブを追加||
|Ctrl + W  |タブを閉じる||
|Ctrl + Tab  |次のタブ|- Tabを連打してる人は大体これ|
|Ctrl + Shift + Tab  |前のタブ ||
|Alt + Tab |次のウィンドウ|- いついかなる場合にも使う<br>- Tabを連打してる人は大体これ|
|Alt + Shift + Tab  |前のウィンドウ||
|Ctrl + Shift + Esc  |タスクマネージャーを起動|- 意外と使う|
|Win + 上矢印キー(↑)  |ウィンドウの最大化||
|Win + 下矢印キー(↓)  |ウィンドウの最小化||
|Win + 左/右矢印キー(←/→) |ウィンドウを左右に分割|- よく使う|
|Win + R  |ファイル名を指定して実行||
|Win + Tab  |タスクビューの表示||
|Win + D  |デスクトップの表示||
|Win + Shift +S  |選択した範囲をクリップボードにコピー|- コピーしたらとりあえずOneNoteに張り付けておく|
|Win + Ctrl + D  |仮想デスクトップを追加||
|Win + Ctrl + F4|仮想デスクトップを閉じる||
|Win + Ctrl + 左/右矢印キー(←/→)  |前/次の仮想デスクトップへ移動する|- 一番強そうに見える|

# テクニック
<b>単語単位でのカーソル移動</b>
Ctrl + 左/右矢印キー<br>

<b>単語単位で移動しながらの選択</b>
Ctrl + Shift + 左/右矢印キー<br>

<b>カーソルの位置より行内の前/後の文章すべてを選択</b>
(前)Shift + Home
(後)Shift + End

<b>カーソルの位置より前/後の文章すべてを選択</b>
(前)Ctrl + Shift + Home
(後)Ctrl + Shift + End

# あとがき
ご覧いただきありがとうございました。
以上が普段よく使っているショートカットとテクニックになります。
おすすめ・指摘などございましたらコメントお待ちしております。<br>


ちなみに自分の好きなテクニックは以下の2つですが、何をしているかと言われたら何もしていません。
・Win + Ctrl + 矢印キー左右連打で行う仮想デスクトップ反復横跳び
・全選択(Ctrl + A) + 切り取り(Ctrl + X) + ペースト(Ctrl + V)によるテキストの高速張り直し
セッション情報の管理ってやつがわかってきた

セッション情報の保存方法は二通りある。


# サーバーサイドに保存

* セッション情報はセッションファイルやRedisなどに保存し、そのsession_idをブラウザのCookieに保存する
* リクエスト時にはサーバサイドでsession_idからセッション情報を取り出す



# クライアントサイドに保存

* セッション情報(user_idを含む)はクッキー(やLocalStorage)にJWT形式で保存 ([参考](https://qiita.com/doyaaaaaken/items/02357c2ebca994160804))
* サーバサイドでこれをdecryptできた時点で、そこに含まれるuser_idのuserだと信用する

**問題点**

* サーバサイドにおいてセッションを無効化するが術がない



# 参考
https://qiita.com/doyaaaaaken/items/02357c2ebca994160804
[写真整理][bat][windows]★★★のフォルダに、RAWデータを移動する

##平田の写真の整理その３
もう不要となったファイルを一括で削除するために、
必要なRAWファイルを取り出し、バックアップを取っておきます。
その後に要らなくなったRAWファイル群を消せば、少しはメディアの容量も増えるのでは？
私は念のため、JPGだけは残しておく人です。

###★★★のフォルダにあるファイル群のファイル名から、RAWデータのファイル名を取得し、★★★のフォルダに移動します。

setなにがしのところは、各メーカーの拡張子毎にエディットしてくださいませ。

```bat:star_pichup.bat
rem 拡張子が違ったものを持ってくる
rem 
rem ★★★　に入れたファイルを元に 
rem 一つ下の jpg 等の拡張子毎に分かれたファイルからファイル名と同名の拡張子が違うファイルを★★★に
rem 持ってくる。

cd ★★★
for %%A in (*) do call :sub_pick_star "%%A" %%~tA
goto :eof

:sub_pick_star
set FILENAME=%1
set EXT_NAME=%~x1
set FILE=%~n1
set ext01=jpg
set ext02=cr2
set ext03=crw
set ext04=tif
set ext05=nef
set ext06=nrw
set ext07=jpeg
set ext08=tiff
set ext09=ARW
move ..\%ext01%\"%FILE%.%ext01%" .\
move ..\%ext02%\"%FILE%.%ext02%" .\
move ..\%ext03%\"%FILE%.%ext03%" .\
move ..\%ext04%\"%FILE%.%ext04%" .\
move ..\%ext05%\"%FILE%.%ext05%" .\
move ..\%ext06%\"%FILE%.%ext06%" .\
move ..\%ext07%\"%FILE%.%ext07%" .\
move ..\%ext08%\"%FILE%.%ext08%" .\
move ..\%ext09%\"%FILE%.%ext08%" .\
goto :eof
---
React.js 三大特徴?を整理

# References
- https://qiita.com/koba04/items/4d13caf5ab4507974bf0
- [Reactコンポーネントへの理解を深める ](https://codezine.jp/article/detail/9928)
- [npm trends angular vs react vs vue](https://www.npmtrends.com/angular-vs-react-vs-vue
)

# Share@2020/02/09
![www.npmtrends.com_angular-vs-react-vs-vue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268573/a10641f8-d508-46ac-71d0-3b7d868bbfc0.png)

# 特徴
## - Just the UI
    - Component志向
        - Componentとは
            - Reactコンポーネントへの理解を深める https://codezine.jp/article/detail/9928
                - Props と State を利用している
                    - Propsとは、Component生成時に親から渡されるObject。Componentが画面から除去されるまで、不変の値を保持。
                    - Stateとは、Component内で保持される、PrivateなObjectで、可変　の　変数　を保持。
                        - 直接更新NG
                        - > this.setState( hash代入 )
                        - アロー演算子の場合
                            - this.setState((prevState, props) => ({   currentTime: props.format + prevState.date }));
                - Component の ライフサイクル
                    - React Componentのクラス型で宣言する場合　必ず　React.Componentクラスを継承。
                    - Raact.Componentクラス　は　抽象クラス。
                    - React.Componentクラス　を　継承した　サブクラス　は　ライフサイクルメソッド　を　利用可能
                - ライフサイクルメソッド
                    - Mounting（Componentが生成されてDOMに要素が挿入されるとき）
                        - constructor()
                        - componentWillMount()
                        - render()
                        - componentDidMount()
                    - Updating（PropsやStateの値に変更が発生したとき）
                        - componentWillReceiveProps()
                        - shouldComponentUpdate()
                        - componentWillUpdate()
                        - render()
                        - componentDidUpdate()
                    - Unmounting（ComponentがDOMから除去されるとき）
                        - componentWillUnmount()
￼
![https___docs.google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268573/d0edfe4a-6ce1-37e4-1c30-4e408a27d2a3.png)
[React component ライフサイクル図(kawachi)](https://qiita.com/kawachi/items/092bfc281f88e3a6e456)より

表1　ライフサイクルメソッド一覧

```

#	メソッド名	引数	概要
1	render()	-	React.Componentクラスに必須のメソッド。単一のReact要素を返す役割をもつが、何も描画する必要が無い場合にはnullやfalseを返すこともできる。
2	constructor()	-	DOM挿入前の初期化時に呼ばれる。
3	componentWillMount()	-	renderメソッドによるDOM挿入直前に呼ばれる。（Mountingフェーズ）
4	componentDidMount()	-	renderメソッドによるDOM挿入直後に呼ばれる。（Mountingフェーズ）
5	componentWillReceiveProps()	nextProps	親コンポーネントから新しいpropsを受け取ったときに呼ばれる。propsが更新されたときのみに呼ばれ、stateが更新されただけでは呼ばれることはない。
6	shouldComponentUpdate()	nextProps,nextState	propsかstateが更新されたときに呼ばれ、初回の描画時（Mountingフェーズ）では呼ばれない。
7	componentWillUpdate()	nextProps,nextState	renderメソッドによるDOM挿入直前に呼ばれる。（Updatingフェーズ）
8	componentDidUpdate()	prevProps,prevState	renderメソッドによるDOM挿入直後に呼ばれる。（Updatingフェーズ）
9	componentWillUnmount()	-	React要素がDOMから取り除かれるときに呼ばれる。

```

## - Virtual DOM
    - React.js は JS内にVirtual DOMとしてDOM Treeのような構造体を持つ。
    - rerender時、その構造体の前後の差分だけを実際のDOMへ反映。 →高速処理が可能


## - Data Flow

    - データの流れが一方向
        - アプリのデータを管理するComponent
        - →そのデータを子のComponentに渡す


nextAction
[これからReactを勉強する人が最初に見るべきスライド７選](https://uxmilk.jp/43555)
「localhostでリダイレクトが繰り返し行われました」の解決法 (ERR_TOO_MANY_REDIRECTS)

#エラーの状況
簡易版twitterアプリを作成して、rails sで仮装サーバーを立ち上げ、localhost:3000にアクセルした時にでたエラーです。今まで遭遇したことがなかったエラーでしたので解決策について記述します。
<img width="712" alt="スクリーンショット 2020-02-09 19.38.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527013/f7b3304c-3b96-1eb3-bd40-0ab4e777f9b6.png">

#エラー内容に対する仮説
エラー画面には「localhostでリダイレクトが繰り返し行われました」という記述があります。本来であればlocalhost:3000にアクセスすると、route.rbではtweetsコントローラーのindexアクションが実行されビューが表示されるはずです。

```route.rb
Rails.application.routes.draw do
  root 'tweets#index'
  devise_for :users
  resources :tweets do
    resources :comments, only: :create
  end
  resources :users, only: :show
end
```

しかし今回の場合、本来はビューファイル（index.html.erb）を表示したいのに、読み込む段階でリダイレクトされてしまってるためのエラーとなっています。
ですのでコントローラーの表記によって起きているエラーと推測します。

#修正内容
では早速コントローラーの記述を確認します。
未ログインユーザーがindexにアクセスしようとするとmove_to_indexが実行され,indexアクションにリダイレクトされます。


```tweets_controller.rb
class TweetsController < ApplicationController
  before_action :move_to_index

  def index
    @tweets = Tweet.includes(:user).order('created_at DESC').page(params[:page]).per(2)
  end
 
（省略）

  def move_to_index
    redirect_to action: :index unless user_signed_in?
  end
end
```

ここで問題となるのが、リダイレクト前にmove_to_indexが呼ばれるため無限ループが起きてしまします。この問題によって今回のエラーは発生していました。

#解決策
indexアクションにアクセスした時、indexアクションへのリダイレクトを繰り返すことにより無限ループが起こるので以下のように修正することでエラーを解決することができました。

###before
```tweets_controller.rb
before_action :move_to_index
```

###after
```tweets_controller.rb
before_action :move_to_index,except: :index
```
MySQLコマンド（基本）

#はじめに
今回は基本的なMySQLコマンドについて紹介します。

#MySQLコマンド
ここからコマンドをどんどん列挙していきます。

・ログイン

```:
# localhostのMySQLサーバに接続する場合
$ mysql -u [ユーザー名] -p

# 外部MySQLサーバに接続する場合
$ mysql -u [ユーザー名] -p -h [host名] -P [ポート番号]
```

・ログアウト

```:
#複数あるのでいろいろためしてみてください。
mysql > \q
mysql > quit
mysql > exit
```

・データベースの確認

```:
mysql > show databases;
```

・データベースの追加

```:
mysql > create database 【追加するDB名】;
```


・データベースの選択

```:
mysql > use  【選択したいDB名】;
```


・テーブル一覧の確認

```:
mysql > show tables;
```

#さいごに
次回の記事で（更新削除など含む）テーブル作成についてまとめたいと思います。
macOSにAWS CLI をインストールする 


## 概要
自身のMacにAWS CLIをインストールした時の備忘録。
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-macos.html)を元に作業。

## 環境
- macOS Catalina

## 前提条件
- Python 2 バージョン 2.7 以降または Python 3 バージョン 3.4 以降

## 構築

### Pythonのバージョン確認
```
$ python --version
Python 2.7.16
```
バージョン2.7以降のPythonがインストールされているから前提条件をクリアしているが、
なんとなく、Python3もインストールする。

### Python3 インストール
```
# パッケージの検索
$ brew search python3
==> Formulae
boost-python3       python3             python@3            python@3.8

# Python3 インストール
$ brew install python3

# Python3 インストール確認
$ python3 --version
Python 3.7.6
```

これで、Python3でインストールする準備が整ったので、次にAWS CLIをインストールする。

```
# AWS CLI ダウンロード
$ curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"

# AWS CLI 解凍
$ unzip awscli-bundle.zip

# AWS CLI インストール (Pythonのバージョンを指定してインストール）
$ sudo /usr/local/bin/python3 awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws

# AWS CLI インストール確認
$ aws --version
aws-cli/1.17.13 Python/3.7.6 Darwin/19.3.0 botocore/1.14.13
```
Pythonのバージョンは、デフォルトバージョンで実行されてしまうため、デフォルトバージョンを変更するか、Pythonアプリケーションの絶対パスを指定してあげる必要がある。今回は「**/usr/local/bin/python3**」の部分で絶対パスを指定して実行している。  
デフォルトのバージョンを変更したい場合は、**pyenv**でバージョン切り替えを行うと良さそう。

### 参考
参考：https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-macos.html
【Rails+Redis+Docker】RailsアプリにRedis導入＆ランキングの実装

#Redisの導入
今回使うRedisはブログサイトでよくあるランキングを表示するために使います。

まずRailsとRedisの接続からしないといけないのですが、ここで2日くらい躓きました。色んなサイトを見まくって試したけど全然繋がらない状態が続き地獄でした。

##解決方法
基本的にredisはlocalhost:6379に繋ぐのが普通なのですが、開発段階だとRails自体をlocalhostに繋いでるので混同しちゃって上手く繋がらなくなってしまっていたということでした。

なのでredisの設定をlocalhost→redisといった感じに名前を変更して行えばすんなり上手くいった感じです。

出来てしまえば簡単なことだったと思うのですが、やはり初心者には結構辛いところでした。コード打っててエラーならまだしも繋がらなくてエラーは精神的にかなりきます。

以下は変更点と参考サイトです。

【https://stackoverflow.com/questions/34729752/sidekiq-error-connecting-to-redis-on-127-0-0-16379-errnoeconnrefused-on-doc】

ちなみにdocker-compose.ymlはこんな感じです。

 ```docker-compose.yml
version: '3'

 services:
   db:
     image: mysql:8.0.17
     command: mysqld --default-authentication-plugin=mysql_native_password
     volumes:
       - ./db/mysql_data:/var/lib/mysql 
     environment:
       MYSQL_ROOT_PASSWORD: root
       MYSQL_DATABASE: root
     ports:
       - "4306:3306"

   web:
     build: .
     command: bundle exec rails s -p 3000 -b '0.0.0.0'
     volumes:
       - .:/app_name
     ports:
       - "3000:3000"
     depends_on:
       - db
       - redis
     tty: true
     stdin_open: true
     links:
       - db
     environment:
       REDIS_HOST: redis
       REDIS_PORT: 6379

   redis:
     image: redis:5.0.5
     ports:
       - 6379:6379
     volumes:
       - ./redis:/data
     command: redis-server --appendonly yes
```

#Redisでランキング機能の実装
無事redisは導入出来ましたが、「導入出来てしまえばこっちのもん！」というわけではありません。

ランキングを表示しないといけないのでこれまたredisの基礎とcontroller、viewを見直さないといけません。

これも「Rails redis ランキング」と調べたら結構参考サイトは出てくるのですが、仕組みの理解が乏しいので基礎の見直しが必要でした。

redisの特徴としては以下のような感じです。

- インメモリアルデータベース（すごく早い！）…ランキングなどに向いてる
- 永続化（定期的にディスクに書き出す）
- データ構造サーバー

そんなredisをRailsで使うには、gemでredisを導入してREDISメソッドを利用する必要があります。

gemの導入が完了したらconfig/initialize以下にredis.rbを作成して以下を記入。

```config/initialize/redis.rb
require 'redis'

uri = URI.parse(ENV["REDIS"])
REDIS = Redis.new(host: uri.host, port: uri.port)
```

```post_controller.rb
  def index
     @posts = Post.all
     ids = REDIS.zrevrangebyscore "posts/daily/#{Date.today.to_s}", "+inf", 0,limit:[0,3]
     @ranking_posts = ids.map{ |id| Post.find(id) }
   end

   # GET /posts/1
   # GET /posts/1.json
   def show
     REDIS.zincrby "posts/daily/#{Date.today.to_s}", 1, @post.id
   end 
```

今回はredisのソート済みセットを使ってpv数ランキングを実装していきました。
pv数の表示はviewに直接以下のように書けば表示されます。

```index.rb
<ul>
   <% @ranking_posts.each do |ranking_post| %>
       <li>
         <%= link_to(ranking_post.title,"/posts/#{ranking_post.id}") %>
         (<%= REDIS.zscore("posts/daily/#{Date.today.to_s}", ranking_post.id).to_i %>PV)
       </li>
   <% end %>
</ul>
```
 
アクションに設置する方法がないか考えたのですが、これしか方法がわからなかったです。ちょっと見苦しいですがとりあえずこれでPV数が表示されます。

#まとめ
Redisの理解はまだまだ乏しいのですが、触ってると結構楽しかったのでまた利用してみたいと思います。
【お手軽Python】openpyxlによるExcelファイル読み込み

#OpenPyXLとは
openpyxlとは、Pythonのライブラリです。
openpyxlは、Excelファイルを操作する時に使われます。

Excel操作に特化したライブラリなので、軽量で使いやすいという利点があります。

#Excelファイルの読み込み

sample.xlsxの中身が

![bandicam 2020-01-20 16-36-57-804.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240459/67181424-bc36-431e-1b3b-e4985c960dba.jpeg)

だった場合

```python
wb = openpyxl.load_workbook('sample.xlsx')
```

とすることで、Workbookオブジェクトを取得できます。
さらに

```python
ws = wb['sheet1']
```
とすることで、Worksheetオブジェクトを取得できます。
これでsample.xlsxのシート名'sheet1'の情報がwsに入ったことになります。

###指定のセル読み込み

```python:main.py
import openpyxl

wb = openpyxl.load_workbook('sample.xlsx')
ws = wb['sheet1']
```

ここまでは共通であるとします。

####Excelの指定文字列で取得

```python:main.py
cell = ws['A2'] # A
```

####行番号、列番号を指定して取得

```python:main.py
cell = ws.cell(row=2, column=1) # B
```

A,Bのcellの値(value)は、どちらも「1」となります。

```python:main.py
print(cell.value) # 1が表示される
```

#まとめ

OpenPyXLを使ってExcelファイルを読み込む方法を紹介しました。
PythonでExcelファイルを操作するのにはうってつけのライブラリなので、是非使ってみてください。
Dockerfileに書いた字をBashに表示する（初心者備忘録）

#Dockerfileを作る
ファイルの場所は適当でよし、とりあえずディレクトリ（ここではmy_build）を作り、その中にDockerfileを作る

```Bash.shell
$ mkdir my_build
↓
$ cd my_build
↓
$ touch Dockerfile
↓
```

#Dockerfileに書き込む
普通にファイルを開いて入力する

```Docker
FROM ubuntu:18.04

CMD ["echo", "hello container"]
```
##Dockerの内容に基づいてコンテナイメージを作成
上の続きから。
-tはコンテナイメージの名前をつけられます。
ここでいうところのwinterfall/hello

```Bash.shell
↓
$ docker build -t winterfall/hello:1.0.0 .
↓
```
#Dockerを実行
こうすることで、Dockerfileの["echo", "hello container"]の部分が実行されます。

```Bash.shell
$ docker run winterfall/hello:1.0.0

>>> hello container
```
#参考書
[みんなのDocker/Kubernetes]
(https://www.amazon.co.jp/%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AEDocker-Kubernetes-%E7%9F%B3%E6%BE%A4-%E5%9F%BA/dp/429710461X/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AEdocker&qid=1581247458&sr=8-1)
Angular:リンクアクティブの完全一致を機能させる際のエラー対応

Angularにて現在アクティブなページのリンクボタンのみの色を変化させるためには
「routerLinkActiveOptions」の設定をしなければいけません。
設定しないと、「/」や「help」ごとにアクティブ判別出来ず、「/」にアクセスした場合は他ページへ遷移してもずっとアクティブカラーになってしまいます。

設定の際にエラーでハマって解決した事例をまとめました。

まず下記のようにコーディングをしました。（ヘルプ画面のナビボタンを設置しているヘルプコンポーネントHTML）
▼エラー時のコード
<button routerLink="/" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">トップ画面へ</button>
<button routerLink="/help" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true">ヘルプ画面へ</button>

そしたらヘルプコンポーネントの内容が表示されません。。
コンソールを確認したら
「ERROR Error: Uncaught (in promise): Error: Template parse errors:
Parser Error: Missing expected } at the end of the expression [{exact: true] in ng:///HelpModule/HelpComponent.html@1:80 ("e}">トップ画面へ</button>」
と表示されています。

「routerLinkActiveOptions」のソースを貼り付ける際、
「}」がついていない箇所があり該当コンポーネントHTMLが表示されませんでした。

下記は「}」を貼り付けた正常なコードです。
▼正常なコード
<button routerLink="/" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">トップ画面へ</button>
<button routerLink="/help" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">ヘルプ画面へ</button>

エラーが出現したら必ずコンソールエラーを確認することを習慣にしないといけませんね！
(Python) ある文字が絵文字か判定したい 

<img width="883" alt="スクリーンショット 2020-02-09 20.29.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553450/ff3c5468-63b1-450c-69cf-b37320aeee1c.png">

まんまemojiという名前のライブラリがあるらしい

- https://github.com/carpedm20/emoji
- https://pypi.org/project/emoji/

## インストール

`pip install emoji --upgrade`

## 絵文字か判定

Exampleには書いてないが、`emoji.UNICODE_EMOJI` が単純に絵文字のdictになっている。

emoji/emoji/unicode_codes.py/
https://github.com/carpedm20/emoji/blob/master/emoji/unicode_codes.py
<img width="476" alt="スクリーンショット 2020-02-09 20.24.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553450/c9ea6df3-47f3-e249-0b9e-2ff725489ac2.png">

**コード例**

```python
import emoji

is_emoji = '🥺' in emoji.UNICODE_EMOJI
print(is_emoji) # True

is_emoji = 'あ' in emoji.UNICODE_EMOJI
print(is_emoji) # False
```

- https://github.com/carpedm20/emoji
- https://pypi.org/project/emoji/
【Python】スクリーンショットをとる


#環境
・Mac Catalina
・Python 3.8.1

#Macでの設定

そのままだと、スクリーンショットをとってもデスクトップがとられてしまうため、
画面収録の許可を行います。

『システム環境設定』→『セキュリティとプライバシー』

<img width="669" alt="システム環境設定.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431502/b732151b-6dd4-5bbe-15ea-e195e134d644.jpeg">

『画面収録』にターミナルにチェックを入れる。

![画面収録.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431502/223184e2-e4a5-ac33-b886-53297550628c.jpeg)

#スクリーンショットをとる

pyautoguiをインストールします。

```
pip install pyautogui
```

pyautogui.screenshot()で全画面のスクリーンショットをとれます。

```
import pyautogui

screenshot = pyautogui.screenshot()
screenshot.save('スクリーンショット.png')
```

![全体.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431502/c12f4020-271a-de60-8cb0-a6aad9d0ca98.jpeg)





#範囲を指定する場合
region = (左からの配置位置, 上からの配置位置, 幅, 高さ)を使用することで、
特定範囲のスクリーンショットをとれます。

```
import pyautogui

screenshot = pyautogui.screenshot(region = (100, 200, 1500, 875))
screenshot.save('スクリーンショット.png')
```



![範囲指定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431502/11ed4b3d-19aa-ea7a-351b-12fd68c21c7e.jpeg)


#JPEGで保存する場合

RGBに変換することで、 JPEGで保存することができます。

```
screenshot = screenshot.convert('RGB')
```

# 参考
[容量の大きいpngファイルを、jpgファイルに変換する](https://qiita.com/hirohuntexp/items/05b7a81323dff7bdca9f)
[pyautogui](https://pyautogui.readthedocs.io/en/latest/screenshot.html)
「つくりながら学ぶ！PyTorchによる発展ディープラーニング」をColaboratory上で。


つくりながら学ぶ！PyTorchによる発展ディープラーニング
https://book.mynavi.jp/ec/products/detail/id=104855

の「1章 画像分類と転移学習」にて。

自端末内に環境を別途作るのがめんどくさかったので、Google Colaboratoryで実施。
その際に調べたことなどを備忘録として残しておく

## アップロード
gitからDLしたフォルダ(Makeまではローカルでやっておいた方が楽)をGoogleドライブへアップロードし、ドライブ上からNotebookファイルを起動。
この状態だとドライブを認識してくれていない状態になっているので、マウントする必要がある。

``` python
# 現在のパスの確認
import os
print(os.getcwd())
!ls
```

``` python
# マウント
from google import colab
colab.drive.mount('/content/gdrive')
```

認証を求められるので、認証しauthorization codeを入力

``` python
# フォルダ移動
os.chdir('gdrive/My Drive/Colab Notebooks/20200126_pytorch/pytorch_advanced/1_image_classification')
!ls
```

これで書籍と同じようなパス構成で処理できるので、実施してみる。
GPUを使いたい場合は「ランタイム」をGPUに変更して
torch.cuda.is_available()
がTrueになっていることが確認できたらOK。GPUで処理できます。
Google Cloud SDKのインストール ~ 初期化

# 環境
- MacOS X 10.14.5 (Mojave)
- Homebrew 2.2.5


# Google Cloud SDKのインストール

```bash
$ brew cask install google-cloud-sdk
```

> https://cloud.google.com/sdk/docs/downloads-interactive?hl=ja#mac

# パスを通す

```brew info```してみる

```bash
$ brew info google-cloud-sdk

・
・
・
google-cloud-sdk is installed at /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk. Add your profile:

  for bash users
    source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.bash.inc'
    source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.bash.inc'

  for zsh users
    source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.zsh.inc'
    source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.zsh.inc'
```


bashの場合は.bashrcに以下の2行を追記

```.bashrc
source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.bash.inc'
source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.bash.inc' 
```


シェル再起動

```bash
$ exec $SHELL -l
```

# Cloud SDK の初期化
```bash
$ gcloud init
```

# 対話形式で設定していく
> https://cloud.google.com/sdk/docs/initializing?hl=ja

<br>
googleアカウントへログインするか聞かれます。 -> ログイン

```
To continue, you must log in. Would you like to log in (Y/n)? 
```

<br>
プロジェクトが複数ある場合は数字で選択します。

```
Pick cloud project to use:
 [1] [my-project-1]
 [2] [my-project-2]
 ...
 Please enter your numeric choice:
```

<br>
こんなメッセージがでて初期化完了

```
Your current project has been set to: [testtheid].

Not setting default zone/region (this feature makes it easier to use
[gcloud compute] by setting an appropriate default value for the
--zone and --region flag).
See https://cloud.google.com/compute/docs/gcloud-compute section on how to set
default compute region and zone manually. If you would like [gcloud init] to be
able to do this for you the next time you run it, make sure the
Compute Engine API is enabled for your project on the
https://console.developers.google.com/apis page.

Your Google Cloud SDK is configured and ready to use!

* Commands that require authentication will use edsa9654@gmail.com by default
* Commands will reference project `testtheid` by default
Run `gcloud help config` to learn how to change individual settings

This gcloud configuration is called [default]. You can create additional configurations if you work with multiple accounts and/or projects.
Run `gcloud topic configurations` to learn more.

Some things to try next:

* Run `gcloud --help` to see the Cloud Platform services you can interact with. And run `gcloud help COMMAND` to get help on any gcloud command.
* Run `gcloud topic --help` to learn about advanced features of the SDK like arg files and output formatting
```


# もしよろしければ
[Google Cloud SDKのコマンドメモ](https://qiita.com/komiya_____/items/4cef3b2d47ed42a7caf5)
sizeThatFitの使い方, 幅固定 高さ可変なUILabelの作り方

##使い方
意外と日本語の記事がなかったので？書きました。

```swift
let maxSize = CGSize(width: 100,height:100)
let size = __UIパーツ__.sizeThatFits(maxSize)
__UIパーツ__.frame = CGRect(origin: CGPoint(x:0, y: 0), size: size)
```
maxSizeで最大の幅と高さを指定しておきます。
その範囲内でいい感じ設定してほしいので、それをsizeThatFitsの引数として代入すると、いい感じに調整してくれたサイズが返ってきます。
この場合は　width,heightがそれぞれ１００以下の範囲でいい感じに値を返してくれます。
あとはそれを代入すればOK!

##具体例（UILabel)　幅を指定値以下で高さを可変

```swift
let label = UILabel()
label.numberOfLines = 0
label.text = "lorem ipsum ..........something"
//最大値の設定。　幅固定で高さはいい感じにしたい、と言う場合はこのように高さの最大値を無限大に
let maxSize = CGSize(width: self.view.frame.width - 100, height: CGFloat.greatestFiniteMagnitude)
let size = label.sizeThatFits(maxSize)
//後でcenterを設定するためCGPointのx、yはどんな値でもよき
label.frame = CGRect(origin: CGPoint(x:0, y: 0), size: size)
label.center = self.view.center
```

これでtextが全てすっぽり収まるけれど、大きすぎないちょうどよいUILabelサイズが計算されます。
VSCodeの設定を公開する

# この記事は？

業務でも個人でもVSCodeをメインで使用しています。
VSCodeには便利な拡張機能がたくさんあり、インストールすることで開発が効率的にできるようになります。
今回は備忘録も兼ね、自分が利用している拡張機能をリストアップします。
他の開発者の情報源になればと思います。

# PHP開発用

## コード補完、フォーマッター

- [PHP Intelephense](https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client)
    - コード補完や定義へのジャンプなど様々な機能を提供してくれる言語サーバ。
- [PHP DocBlocker](https://marketplace.visualstudio.com/items?itemName=neilbrayfield.php-docblocker)
    - PHP Docのテンプレートにしたがってコメントを自動的に補完してくれる。
- [phpcs](https://marketplace.visualstudio.com/items?itemName=ikappas.phpcs)
    - コードの静的解析ツール。linter。
- [php cs fixer](https://marketplace.visualstudio.com/items?itemName=junstyle.php-cs-fixer)
    - phpcsの指摘を自動的に修正してくれる。フォーマッター。
- [PHP Namespace Resolver](https://marketplace.visualstudio.com/items?itemName=MehediDracula.php-namespace-resolver)
    - 名前空間を推測してくれる。

## デバッガ

- [PHP Debug](https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug)
    - XDebugのデバッグ結果を表示してくれるアダプタ。

# フロント開発用

## コード補完、フォーマッター

- [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
    - HTML, CSS, JSをキレイに整形してくれるフォーマッター。
- [IntelliSense for CSS class names in HTML](https://marketplace.visualstudio.com/items?itemName=Zignd.html-css-class-completion)
    - HTML中のclass属性名を自動補完してくれる。

## デバッガ

- [Debugger for Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome)
    - ChromeのデバッグをVSCode上で行える。

# ドキュメント、ビューアー関連

## ビューア

- [Rainbow CSV](https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv)
    - CSVをカンマごとに色を変えて表示してくれる。
- [SVG Viewer](https://marketplace.visualstudio.com/items?itemName=cssho.vscode-svgviewer)
    - SVGファイルのビューア。
- [Markdown All in One](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one)
    - Markdownのフォーマットやビューア。

## 仕様書作成

- [PlantUML](https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml)
    - MarkdownからUML図を生成してくれる。
- [API Blueprint Viewer](https://marketplace.visualstudio.com/items?itemName=develiteio.api-blueprint-viewer)
    - API Blueprintで作られたドキュメントのビューア。
- [API Elements extension](https://marketplace.visualstudio.com/items?itemName=vncz.vscode-apielements)
    - API Blueprintの書式をチェックしてくれるlinter。

# その他

- [Path Autocomplete](https://marketplace.visualstudio.com/items?itemName=ionutvmi.path-autocomplete)
    - パスを自動補完してくれる。
- [Docker](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker)
    - Dockerコンテナをメニューに表示してくれる。
- [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
    - Gitで管理されたコードの履歴を表示してくれる。
- [Project Manager](https://marketplace.visualstudio.com/items?itemName=alefragnani.project-manager)
    - プロジェクトごとにワークスペースを指定し、保存管理してくれる。
Kubernetes The Hard Way - AWS （日本語訳）

# はじめに

CKA受験に向けて[Kubernetes The Hard Way](https://github.com/kelseyhightower/kubernetes-the-hard-way)をやろうと思っていたのですが、慣れ親しんでいるのがAWSであったため、AWSで同じようなことが出来るものがないか探していました。

Github上にいくつか見つけたのですが、いかんせん英語に弱いため、都度都度Google翻訳で訳していました。

今後の学習のことを考えて、フォークして日本語訳を行いました。
[フォーク元](https://github.com/slawekzachcial/kubernetes-the-hard-way-aws)

よろしければ、ご使用ください。
また、間違っている点などありましたら、コメント頂ければ幸いです。

# リンク

https://github.com/danonb10/kubernetes-the-hard-way-aws
GolangをFastCGIとしてApacheと共に動かす

# tl;dt

Go言語の`net/http/fcgi`を使ってGoをCGIとしてApacheで動かしました。

動かす

``` sh
git clone https://github.com/nozo-moto/golang-fastcgi-try
cd golang-fastcgi-try
make docker-build
dokcer-compose up
```

確認

``` sh
$ curl localhost:8888
{"message":"pong"}
```

# net/http/fcgi
Go言語には[net/http/fcgi](https://golang.org/pkg/net/http/fcgi/)というFastCGI protocolが実装されたパッケージがあります。

これは以下のように`http.Handler`をラップしてあげて使えます。今回はginを使っています。

``` go
package main

import (
	"net"
	"net/http/fcgi"

	"github.com/gin-gonic/gin"
)

func main() {
    var err error
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
    l, err := net.Listen("tcp", ":8080")
	if err != nil {
		panic(err)
	}
	if err := fcgi.Serve(l, r); err != nil {
		panic(err)
	}
}
```

# 動かす

以下のようなdocker-composeを用意します
以下ではてきとうなコンテナに上のGoのコードのバイナリを入れて実行しています。

``` yml
version: '3.3'
services:
  www:
    image: httpd:2.4.41
    ports:
        - "8888:80"
    depends_on:
        - fcgi
    volumes:
        - ./docker/apache/conf/fcgi.conf:/usr/local/apache2/conf/extra/fcgi.conf
    command: bash -c "echo 'Include conf/extra/fcgi.conf' >> /usr/local/apache2/conf/httpd.conf && httpd-foreground"
  fcgi:
    image: nozomi0966/fastcgi-golang-try
```

## fcgi.conf
ApacheでfastCGIを実行するための設定ファイルを書きます
上記のdocker-compose.ymlで`./docker/apache/conf/fcgi.conf`に書いたのを読んでいます。
Apache2.4以降から[mod_proxy_fcgi](http://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html)というモジュールが入っているのでそれを使います。
docker-composeで`fcgi`というホスト名で引けるように動かしているので以下のように`fcgi:8080`でアクセスします。

``` 
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
SetHandler "proxy:fcgi://fcgi:8080/"
```

以下を実行してApacheとFastCGIを動かします。

```
docker-compose up
```

以下のようなレスポンスが返ってくれば動いてるのが確認できます。

``` sh
$ curl localhost:8888
{"message":"pong"}
```

---

以上

以下のリポジトリにコードを載せています
https://github.com/nozo-moto/golang-fastcgi-try
zshの切替とPyhton3の再設定


macOS Catalina の標準シェルがzshになったとのことで、
terminalでも切替えの促しがありシェル変更（change shell）コマンドchshを実行

`chsh -s /bin/zsh`

その後にPythonのプログラムを実行すると、エラーが。。

`SyntaxError: Non-ASCII character '\xe8...' `

ググると、utf-8の文字コードの宣言が冒頭に必要と。。
`# -*- coding: utf-8 -*-`

でも今まで普通に動いてたのにと思い、もう少し調べると、、
Python3ではutf−8はデフォルト設定、
Python2ではutf−8の文字コード宣言が必要との記載が。。

そこで`Phyton`でバージョンを確認すると、Python2と判明。。
最初からPython3使ってたから意識してなかった。。

Anacondaを使ってるので、

`/opt/anaconda3/bin/conda init zsh`

でPython3に切り替えて無事解決！
octokitを使ってGithubリポジトリ情報を取得する

# 目的
octokitを使ってGithubリポジトリ情報を取得した際の備忘録です

octokitとは
> [octokit](https://github.com/octokit/octokit.rb)
> Ruby toolkit for the GitHub API.

# 準備

インストール

```
$ gem install octokit
```

# コード

以下を参考にIntelRealSenseGithubリポジトリの情報を取得します。

> [octokit.rbを使って、githubの情報を見てみた](https://qiita.com/tbpgr/items/754a087d82f02f59e990)

```ruby:sample.rby
require 'octokit'

# github user name
@name = "IntelRealSense"

options = {
  auto_paginate: true,
  access_token: nil, # 必要に応じて入力する
}

# Clientオブジェクトを生成
@client = Octokit::Client.new(options)

# Repositories情報を取得
repos = @client.repositories(@name)

# リポジトリ情報の出力
repos.each do |repo|
  puts "name: #{repo.name}, language: #{repo.language}"
  puts "url: #{repo.url}"
# puts "repository info = #{repo.attrs}"
  puts ""
end
```

# テスト

リポジトリ情報が取得できればOKです。

```
$ ruby sample.rby
ruby sample.rby
...
name: librealsense, language: C++
url: https://api.github.com/repos/IntelRealSense/librealsense
...
```

# 参考
[GitHub/octokit](https://github.com/octokit/octokit.rb)
[octokit.rbの使い方まとめ](https://qiita.com/kompiro/items/0504c70eb8f522e1f66a)
[Ruby で octokit と Slack の bot でインターン生が楽をする](https://qiita.com/toyoday/items/38b8bee6673d3bb9ca9f)
[Octokit | octokit によって API 経由で GitHub を利用する #octokit](https://qiita.com/tbpgr/items/754a087d82f02f59e990)
[octokit.rbを使って、githubの情報を見てみた](https://qiita.com/tbpgr/items/754a087d82f02f59e990)
[GitHub/IntelRealSense](https://github.com/IntelRealSense)
laravelでパスが合っているのに画像が表示されない（シンボリックリンク）

当方、Mac環境からwindows環境に移行した際にMacでは表示されていた画像がwindowsでは一切表示されなくなりました。
もちろんフォルダのバックアップを取っていたし、コードもそのままを使用です。

おかしいなと思いつつも色々なパスを書いたが画像は表示されず・・・

```php:blade.php
<img class="logo" src="storage/profile_images/{{$post->id}}.jpg" alt="logo">
<img class="logo" src="../storage/profile_images/{{$post->id}}.jpg" alt="logo">
<img class="logo" src="../../storage/profile_images/{{$post->id}}.jpg" alt="logo">
```

ページで確認しても、もちろん404エラーです。
![画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/2470b42d-39f9-e108-ec7a-917fef981bf5.png)


#結論
シンボリックリンク行いましたか？


>publicディスクは一般公開へのアクセスを許すファイルを意味しています。デフォルトのpublicディスクは、localドライバを使用しており、storage/app/public下に存在しているファイルです。Webからのアクセスを許すには、public/storageからstorage/app/publicへシンボリックリンクを張る必要があります。
Laravel 5.5 ファイルストレージから引用（https://readouble.com/laravel/5.5/ja/filesystem.html）


#シンボリックリンクをやってみよう！
シンボリックリンクは超簡単です。
下記コードをターミナルにて打ち込むだけ

```
php artisan storage:link
```

```php:blade.php
<img class="logo" src="../storage/profile_images/4.jpg" alt="logo">
```
これで画像が表示されました。


#追記：本番環境で画像がうまく表示されない


AWS EC2本番環境にて問題が起きました。

ローカルの環境では正しく画像が表示されているのに本番環境であるEC2ではうまく表示されません。
`php artisan storage:link`はもちろん実行済み

#解決
本番環境で`php artisan storage:link`はを行うとプロジェクト直下に
public/storageファイルが出てきます。
実はこれ、同じプロジェクト直下の/storageと連動していました。

/public/storage/profile_imagesに.jpgを入れたら
/storage/app/public/profile_imagesにも.jpgが反映されます。

片方に.jpgを入れたらもう片方にも自動で反映されるといった具合です。
storageフォルダが2つないとうまく動作しません。
RoboMaster S1のROS対応に向けて3Dデータを取得する

###ことの顛末

皆さん、こんにちは。
今回は、RoboMaster S1のROS対応にとって避けて通れない、Simulation環境の構築の第1弾を書きたいと思います。
ところで、まずはじめにやるべきこととして、RoboMasterS1の3Dデータを手に入れる必要があります。
調べると、以下のような個人で作成されたものを”有料で”配布されていたりします。
[https://www.turbosquid.com/ja/3d-models/dji-robomaster-s1-blue-3d-1426203](https://www.turbosquid.com/ja/3d-models/dji-robomaster-s1-blue-3d-1426203)
まあ、お金ある人は買ってください。
ただ、我々貧乏人にとってこの3Dモデルに100ドル以上払うのは気が引けます。
さて、どうしたものか・・・・

###RoboMaster S1の3Dデータの発見

あるとき、Windows版のRoboMasterS1アプリをインストールしてみたところ、やけに容量が大きいことに気づきました。インストールフォルダを調べてみると、なんとUnityで作られており、各種データがAsset Dataとして保存されているではないですか！

まあ当たり前ですがDJIはおそらくこれらのデータの再利用を恐れて暗号化を施しているはずに違いない。とダメもとで、[AsssetStudio](https://github.com/Perfare/AssetStudio)を使用して、中身を見てみたところ。。。

。。。
。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/c957015d-b700-988b-fa2a-46316b760936.png)

暗号化されてへんやんけ( ゜A゜；)

ということで、もちろん取り出したデータは再配布はできないものの、個人使用の範囲であれば自分で手に入れることができそうです。

###RoboMaster S1の3Dデータの取り出し方（自己責任で＆詳しくは書かないよ）

GazeboやRVizでRoboMasterS1のデータを表示させたい人は自己責任で以下の通り進めると幸せになれます。

1. Asset Studioを使用してRoboMasterアプリのResourceのフォルダを開く
2. 表示されるlevel3のTime_robotのしたのxw0607（おそらくDJI内の開発コード）にチェックボックスをつけて取り出す。（実際はジンバルとかも動かしたいので、部品ごとに別々のファイルで取り出してください）
3. 作成されたfbxファイルをBlenderでインポートする
4. モデルが正常に表示されないので、右のツリーからxw0607のを右クリックしてunlinkをクリック
5. するとこんな感じになります。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/58642761-26a1-f45e-926f-9c82c588a86f.png)

6. 床面を削除して、あとはROSの世界で使うための形式にExportすればOK

###あくまで自己責任で使ってください
このファイルの3Dデータはかなり荒いので、それほどほかに使い道があるわけではないです。あと、この方法自体は、暗号化されていないものを取り出しているので、暗号化の解除には当たらないのですが、もちろん使用の範囲は個人での使用に限って、自己責任でお願いします。
（DJIの中の人に何か言われたらソッコーで消しますのでよろしくお願いします）
 (((( ；ﾟДﾟ)))
Rails 6 + RSpec 3.7~でスクリーンショットが真っ白になる問題の要点とその解決法

# 要点
* RSpec3.7で追加されたSystemSpecはスクショを自動で保存してくれる機能がある
* Rails6ではRSpec4系の使用が推奨されている
* 解決方法は`rails_helper.rb`パッチをあてる
* なぜ？を追ってみたけど、わからなかった
* 他の理由で失敗するケースもある模様


# System Specのスクリーンショット保存機能
RSpec 3.7から追加された System Specでは、テスト失敗時に自動でスクリーンショットを保存してくれます。

> この機能はRailsのシステムテストに組み込まれているので、feature specのようにcapybara-screenshotなどによるサポートを手動で設定する必要がありません。
[Rails 5\.1以降のシステムテストをRSpecで実行する（翻訳）｜TechRacho](https://techracho.bpsinc.jp/hachi8833/2018_01_25/51101)

# Rails6ではRSpec4の使用が推奨されている

rspec-railsのイシューにもおなじ問題が上がっていました。このスレッドで解決できる :thinking:? 

[Teardown hooks are called in the wrong order, resulting in a blank screenshot in Rails 6\. · Issue \#2153 · rspec/rspec\-rails](https://github.com/rspec/rspec-rails/issues/2153)

とおもったのですが、「rspec-rails4.0で試してみてほしい」「完璧に動いたよ、サンキュー！」でおわっていました。Rails6にはRSpec4という組み合わせが推奨のようですね。

# 解決方法

以下の記事で、原因と解決するためのパッチが説明されていました。

> rails 6\.0\.0 と rspec\-rails 3\.8\.2 の組み合わせだと Capybara\.reset\_sessions\! を呼んだ後に save\_screenshot が呼ばれるので、スクリーンショットの内容が真っ白になります。
[Rails アプリケーションの不安定なテストを撲滅したい 〜system spec のデバッグ方法とテストを不安定にさせる要因〜 \- あらびき日記](https://abicky.net/2019/09/17/062506/)

## rails_helper.rbにパッチをあてる

さきほどの記事にはパッチコードはあったのですが、「どこに書けばいいか」は明記されておらず、迷いました :sweat_drops: 

`rails_helper.rb`に書いてあげると動作することがわかりました。

```rb:rails_helper.rb
module SystemHelper
  extend ActiveSupport::Concern

  included do |example_group|
    # Screenshots are not taken correctly
    # because RSpec::Rails::SystemExampleGroup calls after_teardown before before_teardown
    example_group.after do
      take_failed_screenshot
    end
  end

  def take_failed_screenshot
    return if @is_failed_screenshot_taken
    super
    @is_failed_screenshot_taken = true
  end
end

RSpec.configure do |config|
  config.include SystemHelper, type: :system
end
```

## なぜ？を追ってみたが…

パッチコードをみたときに、「うーん :thinking: ？」何をしているのか、なぜ直るのかがわかりませんでした。「**Capybara.reset_sessions! を呼んだ後に save_screenshot が呼ばれる**」というキーワードでしらべてみました。

…


* [rails/setup\_and\_teardown\.rb at 6\-0\-stable · rails/rails](https://github.com/rails/rails/blob/6-0-stable/actionpack/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb#L18-L28)

```rb:順序はただしいように見える
def before_teardown
  take_failed_screenshot
ensure
  super
end

def after_teardown
  Capybara.reset_sessions!
ensure
  super
end
```


TestHelpers::SetupAndTeardownモジュールにたどりついて、それでも :thinking:？で力尽きました（笑）

理由が気になる…。


# まとめ

* RSpec4はbetaだし、あげると既存のテストが壊れる可能性もある。
* スクショが保存できればそれでいい。
* RSpec4が来るまで動いてくれたらOK!
* 上記にあてはまるようであれば、今回の対応でよいのではとおもいました。

# 他の理由で失敗するケースもある

遭遇はしたことないのですが、パスの長さがエラーの問題になるケースもあるようでした。（詳細未調査）

* [\[rails\] system specにおけるtake\_screenshotの問題を雑に修正する \- Qiita](https://qiita.com/isuke/items/f7d78cbc9305bb99f8ef)
【Python × Zapier】警報情報を取得してSlackで通知する

##やりたいこと（BEFORE）
**気象庁の警報情報を取得して指定する地域に警報が出ていればSlackで通知する**  

[こちらの記事](https://qiita.com/paranishian/items/7135f01f06e379f84985)がやりたいことドンピシャだ！
と思い記事の通りに進めていましたが、気象庁のデータが更新される度に[Zapier](https://zapier.com/home)（作業を自動化できるツール）のタスクを動かしていると[自分のプラン](https://zapier.com/app/billing/plans)の上限タスクを超えてしまう...

![screencapture-zapier-app-billing-plans-2020-02-09-17_41_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533386/146667c7-38f4-7d3c-4f86-2f3c6c8d2e4e.png)

そこでやりたいことの範囲を狭めました。

##やりたいこと（AFTER）
**気象庁の警報情報を「毎朝7時」に取得して指定する地域に警報が出ていればSlackで通知する**  
▼こんな感じ（動かした時に警報が出ていなかったので代わりに注意報を取得した様子）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533386/ae0ce97a-4be2-3c7c-5043-7388029ae472.png" width=50%>
毎朝7時に1回だけ情報を取得してタスク実行回数を1回/日にしました。

##Zap全体図
1. Every Day：ここで毎朝7時にタスクを実行するように設定
2. Run Python：気象庁の情報を取得・抽出（下にコードを記載）
3. Only continue if...：2で出力があれば（警報が出ていれば）次に進む
4. Send Channel Message in Slack：Slackの指定するチャンネルで通知

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533386/e77b253e-f3da-e206-1234-e9888c7170ad.png" width=70%>

##Pythonコード
やりたいことが若干変わったので勉強せねば...と思いスクレイピングの方法を調べて書きました。初Python！
調べているとどうやらBeautifulSoupというものを使うのか〜ということを知りましたが[Zapierのヘルプ](https://zapier.com/help/create/code-webhooks/use-python-code-in-zaps)にこんなことが書いてありました。
<img width="766" alt="スクリーンショット 2020-02-09 18.23.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533386/ecd1e32c-c775-7998-41c0-99e0259929b8.png">
お"ぉぉおおおんBeautifulSoupが使えない！
ということで無理矢理感ありますがBeautifulSoup使わずにほしい箇所（警報部分）だけ抽出します。

```python
import re
import requests
import time

code_list = [['札幌市', '0110000'], ['仙台市東部', '0410001'], ['さいたま市', '1110000']]
output = {'text': ''}

for code in code_list:
    html = requests.get('https://www.jma.go.jp/jp/warn/f_' + code[1] + '.html').text
    data_list = re.findall('<span style="color:#FF2800">(.*?)</span>', html)

    if len(data_list) == 0:
        continue

    text = '【' + code[0] + '】'
    i = 1
    for data in data_list:
        if i == len(data_list):
            text += data
        else:
            data = re.sub('警報', '', data)
            text  += data + '，'
        i += 1
    output['text'] += text + '\n'
    time.sleep(1)
```
各地域のページで警報部分のフォントカラーは`#FF2800`なので、`<span style="color:#FF2800">〜</span>`で囲まれた部分を全て抽出しています。
また、複数ページをスクレイピングするので`time.sleep(1)`で1秒休ませます。

##参考
[気象庁から情報を取得して東京23区の気象警報をSlackに通知する](https://qiita.com/paranishian/items/7135f01f06e379f84985)
Zapierの使い方も含めてとても参考にさせていただきました。
Spring MVC 內 ModelAndView 用法

在目前 Spring MVC 專案內已經有利用 mvc-servlet.xml 設定一個全域的 bean 來處理 view 的轉送：

```
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="order" value="2"></property>
	<property name="prefix" value="/WEB-INF/view/"></property>
	<property name="suffix" value=".jsp"></property>
</bean>
```

因此在 controller 裡面只要寫 return ABC 就等於 return /WEB-INF/view/ABC.jsp


不過這樣處理 controller 之間的轉送會有問題，比如想轉 CDE.do，會被轉送到 /WEB-INF/CDE.do.jsp 而造成失敗


爬文之後，在 controller 內用 ModelAndView 會是比較好的處理方式。
1. 我們可以透過 return new ModelAndView("redirect:/userOrder.controller"); 
直接去到已經 mapping 給 /userOrder.controller 路徑的 controller
2. 可以 new ModelAndView 物件並使用 .setViewName 方法，例如 .setViewName("ABC") 
這樣一樣能吃到 mvc-servlet.xml 內設定的前後綴，最終去 /WEB-INF/view/ABC.jsp

詳細文章記載在這篇的方法二

##### Spring MVC之ModelAndView分析 h5
https://blog.csdn.net/Mint6/article/details/77345631

以及這篇的第一段
##### 1. return modelAndView例子 h5
https://blog.csdn.net/violet_echo_0908/article/details/50951141
「ERROR: The Compose file is invalid」となったクソしょうもない原因

##その状況

```yml:docker-compose.yml

version: '3'

services:

  (略)

db:
    image: mysql:5.7
    container_name: db-host
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
    - 3306:3306
```

とdocker-compose.ymlを書き、docker-compose upしてみると

> 
ERROR: The Compose file '.\docker-compose.yml' is invalid because:
Invalid top-level property "db". Valid top-level sections for this Compose file are: version, services, networks, volumes, and extensions starting with "x-".
>
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/

こんなエラーが…
「お前のファイルさ、書き方がなってないから無効な。公式のやつ見て来いよ」てなことを言われるのでした。

公式やほかの人たちのと比べてもいろいろ直したのだが通らず。小一時間格闘する羽目に。

##判明した原因
半角スペースがないこと。

```yml:docker-compose.yml
version: '3'

services:

  (略)

db:
    image: mysql:5.7
    container_name: db-host
```
`db:`の前に半角スペースがなく`services`と同じ列にあることがわかります。
`db`は`services`として定義するためこのままではエラーが出てしまうのでした。

```yml:docker-compose.yml
version: '3'

services:

  (略)

　db:
    image: mysql:5.7
    container_name: db-host
```
半角スペースを入れてdocker-compose upすると無事に通りました。
dockerが厳しいというより、ただのしょうもないミスでした。
CPUの仕組み

## 機能面から見たCPUを構成する要素  
  
- レジスタ  
　  処理対象とする命令とデータを格納する領域
- 制御装置  
　メモリ上の命令やデータをレジスタに読み出す  
　命令の実行結果に応じてコンピュータを制御  
- 演算装置  
　演算をする
- クロック  
　クロック信号を発生させる

## レジスタの種類と役割

| レジスタの種類 | 役割 |
|:------------|:------------|
|アキュムレータ|演算を行うデータを格納する|
|フラグ・レジスタ|演算処理後のCPUの状態を格納する|
|プログラム・カウンタ|次に実行する命令が格納されたアドレスを格納する|
|ベース・レジスタ|データ用のメモリー領域の先頭アドレスを格納する|
|インデックス・レジスタ|ベースレジスタから相対アドレスを格納する|
|汎用レジスタ|任意のデータを格納する|
|命令レジスタ|命令そのものを格納する|

レジスタに格納される値は「データ」か「命令」
データはさらに演算に使われる値とメモリーのアドレスを表す値がある

#####・プログラム・カウンタ
次に実行する演算、データの場所（アドレス）を格納しておくところ
#####・フラグ・レジスタ
直前に実行した演算の結果としてアキュムレータの値が負、ゼロ、正のどの状態になったか記録しておく
#####・アキュムレータ
演算の核になる値が格納されるところ

##命令の種類と機能  
|種類|機能|
|:--|:--|
|データ転送命令|レジスタとメモリ、メモリとメモリ、レジスタと周辺装置の間でデータを読み書きする|
|演算命令|アキュムレータで算術、論理、比較、シフト演算を行う|
|ジャンプ命令|条件分岐、繰り返し、無条件のジャンプを行う|
|コール/リターン命令|関数を呼び出す/呼び出し元に戻る|

##参考
プログラムはなぜ動くのか（矢沢久雄）日経BP社
MySQL5.7を起動時に起こるエラー「ERROR! The server quit without updating PID file」に関して

##はじめに
MacOS内にMySQL8.0が入っていたが、MySQL5.7にダウングレードする必要があり、
MySQL8.0を完全にアンインストール後にMySQL5.7をHomebrewでインストールした。

しかし、MySQLサーバー起動時に「ERROR! The server quit without updating PID file」というエラーが出て起動できなかったので、その解決方を忘備録として残しておきます。

##開発環境
| Center align     |   Center align |    
|:-----------------|---------------:|
| MacOS Mojave     |        10.14.6 |
| Mysql            |         5.7.29 |

##MySQL5.7のインストール
MacOS内にもともと入っていたMySQL8.0は[この記事](https://qiita.com/sato11/items/ba887a5655217f60f2a2)を参考に削除したという前提でMySQL5.7をインストール

```
$ brew install mysql@5.7

$ vim .bash_profile

# .bash_profileに下記の一行を追加
export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"

# .bash_profileの再読み込み
$ source .bash_profile

$ mysql.server start
Starting MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/ip-10-3-4-134.ap-northeast-1.compute.internal.pid).

```

##解決方法

`my.cnf`ファイルに`skip-grant-tables`を追加したら、無事に起動しました。

```
$ vim /usr/local/etc/my.cnf

# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
#mysqlx-bind-address = 127.0.0.1
#socket=/tmp/mysql.sock
skip-grant-tables  ←追記

$ mysql.server start                                                                                                                                                                              
Starting MySQL
. SUCCESS!
```

無事解決！！！

##参考
・[MacでMySQL5.7をアンインストールする](https://qiita.com/sato11/items/ba887a5655217f60f2a2)
・[MySQL5.7をHomebrewでmacOSにインストールする手順](https://weblabo.oscasierra.net/mysql-57-homebrew-install/)
【画像で説明】Google Cloud Platform (GCP)の無料トライアルでアカウント登録 

# まずはgoogleアカウントにログイン
してください

# GCPのトップページへ
https://cloud.google.com/

# ブラウザ上ですすめるだけ

![スクリーンショット 2020-02-09 17.59.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/c11808b6-a898-9fff-1e09-96e15bff23f6.png)


![スクリーンショット 2020-02-09 18.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/dfb034ce-3382-7706-e606-3fa30483b031.png)


![スクリーンショット 2020-02-09 18.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/d22e570c-f542-60ec-965a-94540763eba8.png)


![スクリーンショット 2020-02-09 18.10.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/e28560d0-ab3a-837a-f555-716be3aacfe5.png)


# ちなみに

- **Automatic billingをONにしなければ、無料枠を超えて課金されない。**
- **無料期間（12ヶ月）内に有料アカウントにアップグレードする場合は、無料クレジットの残高はそのまま移行される。**
- **有料アカウントへのアップグレードからさらに12ヶ月間が有効期限となる。**

とのこと。
良心的ですね:relaxed:
adventcalender 簿記初級レベルであるあるな、業務アプリをVR風にしてみる 12/17 として投稿

2020/02/08 

目的
　業務アプリの経験用説明＋デモアプリとして利用
　他に、VRで働く人がお金の確認までVRの中で完結する用の頭コネコネ用として
  バックエンドを切り離しておく

構成
　アプリ(いろいろと)
　データ保持側

レイアウト例
　伝票

機能
　月毎の給料計算
　カレンダー機能
　公共料金等の各種引き落としや振り込みについて、各種通知
　　→ゲームエンジンの知見を活かして画像だけじゃなくて、音楽を含めた通知

イメージ動画　
https://www.youtube.com/watch?v=aRMs5kJ3aHI

今後の課題
## プログラムの開発