OmniAICreator/Qiita-1.07M huggingface dataset:
グラフをxkcd風に作成する

* 製造業出身のデータサイエンティストがお送りする記事
* 今回はmatplotlibでxkcd風（コミック風）にグラフを作成する機能を試してみました。

##はじめに
基本的な可視化は別の記事できちっと整理しておりますので、そちらを参照してください。

* [基本的な可視化手法を整理してみた](https://qiita.com/DS27/items/59b6676e734c3d7dd604)

##xkcdとは
xkcdとは、簡単に言うとコミック風の出力する機能らしいです。詳しいことはこちらを参照してください（[xkcdとは](https://xkcd.com/)）。

##xkcdを試してみる
実装は凄い簡単です。1行だけスクリプトを追加するだけで全てのグラフがxkcd風になります。

__*注意*__
一度、jupyter notebookで実行するとずっとxkcd風になってしまいますので、戻す場合はカーネルをリセットする必要があります。

追加するコードは下記です。

```php
plt.xkcd()
```

####ヒストグラム
まずはヒストグラムを描画してみようと思います。

```php
# ライブラリーのインストール
import numpy as np 
import pandas as pd
from sklearn.preprocessing import StandardScaler

from pandas.plotting import *
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
plt.xkcd()

import os

file_path = 'https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data'
file_name = os.path.splitext(os.path.basename(file_path))[0]
column_names = ['MPG','Cylinders', 'Displacement', 'Horsepower', 'Weight',
                  'Acceleration', 'Model Year', 'Origin'] 

df = pd.read_csv(
    file_path, # ファイルパス
    names = column_names, # 列名を指定
    na_values ='?', # ?は欠損値として読み込む
    comment = '\t', # TAB以降右はスキップ 
    sep = ' ', # 空白行を区切りとする
    skipinitialspace = True, # カンマの後の空白をスキップ
    encoding = 'utf-8'
) 

# ヒストグラム
df['MPG'].plot(kind='hist', bins=12)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/3db5b6a2-f749-66fa-c721-81cfa3d5db06.png)

####箱ひげ図
次は箱ひげ図を描画してみようかと思います。

```php
箱ひげ図(boxplot)
sns.boxplot(x='Model Year', y='MPG', data=df.sort_values('Model Year'), color='cornflowerblue')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/5b672fef-6735-272a-76aa-2081f10c0222.png)

####バイオリン図
最後にバイオリン図を作成してみようと思います。

```php
# violin plot 
sns.violinplot(x='Model Year', y='MPG', data=df.sort_values('Model Year'), color='cornflowerblue')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/49a1c3f1-1aa7-1e9c-a576-c86bac89df54.png)

##さいごに
最後まで読んで頂き、ありがとうございました。
今回は、xkcd風でグラフを作成してみました。
少し遊び心を持った資料を作成する際には面白いですね。

訂正要望がありましたら、ご連絡頂けますと幸いです。
Microsoft IME を再起動する

先月の Windows Update 後、「ひらがな」モードにしているのに半角英数字しか入力できない状態になる現象が見られたので、これまで以下のスクリプトを書いてしのいでいたのですが…

```bat:2021-02-18.bat
@echo off

openfiles > NUL 2>&1
if %ERRORLEVEL% equ 1 (
  powershell.exe -Command Start-Process \"%~f0\" -Verb runas
  exit /b
)

set SELF=%~n0
set TASK=

setlocal
  for /f "tokens=2" %%i in ('tasklist /fi "imagename eq ctfmon.exe"') do (
    set TASK=%%i
  )
  echo %TASK%
  
  if "%TASK%" == "" (exit /b 1)
  
  taskkill /pid %TASK% && ctfmon.exe
endlocal
```

本日、以下のツイートを目にしたので、これでしばらく様子を見てみようかと思います。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">最近 Windows をアップデートして以降、FF14 やってる最中に、IME 表示は「あ」になってるのに半角英数しか入力されなくて はぁ？って思っている人ためしてみて。FF14 やってなくても全員これやるべき、ってくらい IME がデグレードしてる。<br />
<a href="https://t.co/QCPQAXdKA1">pic.twitter.com/QCPQAXdKA1</a></p>ミランドラ（@Pico_SnowDrop）<a href="https://twitter.com/Pico_SnowDrop/status/1374373016214269952?ref_src=twsrc%5Etfw">March 23, 2021</a></blockquote>
<!-- script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script -->
クラスとインスタンスを使ったコードの作成

## 初めに
クラスとインスタンスを使ってコードを作成していきます。
まずは用語のおさらいです。
#### クラスとインスタンスについて
クラスとはオブジェクト指向の設計図みたいなものです。
クラスからインスタンスを作成してそインスタンスで処理を行います。
おおまかに言うと、クラスは設計図、インスタンスはその設計図から作られるものです。なぜクラスからインスタンスを生成するのかというと共通する部分を再利用することができるからです。
みじかな例として車がインスタンスでクラスが車を作る部品みたいな感じです。
### クラスとインスタンスを使ってコード書こう

```
class Article

  def initialize(author, title, content)
    @author = author
    @title = title
    @content = content
  end

end
```
以下の出力結果を得られるようにします。

```
著者: 鈴木
タイトル: Hello Ruby!
本文: こんにちは、Ruby
```
まず、コードの中にinitializeメソッドがあります。これは特殊なメソッドでクラス内に記述した場合、オブジェクトが作成される時に自動で呼び出されます。
ではそのinitializeメソッドにクラスの外からnewメソッドを使いインスタンスを生成し変数に代入します。

```
article = Article.new("鈴木", "Hello Ruby!", "こんにちは、Ruby")
```

この時の("鈴木", "Hello Ruby!", "こんにちは、Ruby")は実引数として、仮引数の(author, title, content)に受け渡します。

そして上記の値が＠author,＠title,@contentに代入されます。
そして最後にインスタンス変数に代入された値を出力する記述を書いたらコードの完成です。

```
class Article

  def initialize(author, title, content)
    @author = author
    @title = title
    @content = content
  end

  def author
    @author
  end

  def title
    @title
  end

  def content
    @content
  end

end

article = Article.new("阿部", "Rubyの素晴らしさについて", "Awesome Ruby!")
puts "著者: #{article.author}"
puts "タイトル: #{article.title}"
puts "本文: #{article.content}"
```

###最後に
初学者のため少しわかりにくい部分や間違いもあるかもしれません。何か間違いがあればご指摘お願いします。
scipy.optimize.leastsqで何を最小化するか what should be minimized in the optimization of scipy.optimize.leastsq.

※初投稿で勝手がわからなかったので、後々告知なく修正するかもしれません。

scipy.optimize.leastsqは所謂最小二乗法で二乗残差を最小化することで、ある $y$ の $x$ 依存性 $y(x)$ をある関数 $f(x)$で再現する際のパラメーターを最適化する場合にも用いられる。

scipy.optimize.leastsq is sometimes used to optimize the parameters of a function $f(x)$ that reproduces the $x$-dependency of $y$.

例えば、ある半導体の低効率の温度依存性 $\rho(T)$ をArrheniusの式 $a\exp(b/T)$ でフィッティングしたい場合（$a,b$ はフィッティングパラメータ。物理的な意味はググってください。）は

For example, the temperature depencencies of resistivity $\rho(T)$ is sometimes fitted by the Arrhenius formula as follows,

```
import scipy.optimize as opt

def arrhenius(param,x): #Arreniusの式
    a,b = param[0],param[1]
    return a*np.exp(b/x)
def residual(param,x,y,func): #残差計算
    return y - func(param,x)

result = opt.leastsq(residual,param,args=(X,Y0,arrhenius))
```

のような形でフィッティングできる。
個人的にはフィッティング結果をプロットする場合などを考えるとフィッティング用の関数と残差計算用の関数は別に用意しておいたほうが楽だと思っている。

ここで疑問なのが、残差　y - func(param,x)　を最小化することが適切なのかどうか。

Here, it is quastionable whether the minimizing y - func(x) is valid or not.

今回の場合、$y$が低温ほど(つまり$x$が小さいほど)大きくなる。抵抗測定では測定範囲の関係で一般的に真の値が大きいほど誤差も大きくなるので、上のような単純な残差を最小化する場合、低温側のデータの重みが大きくなることになる（逆に抵抗率の逆数である伝導率を用いた場合は高温側の重みが大きくなる）。そこでこのような残差計算を考えてみる。

In this case, the error of resistivity tend to be proprtional to the magnitude of the real value due to the range of the measurable volrage, thus the data at lower temperature become the hevior aginst the fitting. To modify such a weighted tendencies, I suggest one option of residual function like this:

```
def residual(param,x,y,func): #残差計算
    return func(param,x)/y - 1
```

こうすると各データ点とフィッティング関数の差分を比として計算しているため、真の値に依存するような重みづけは無くなる。yで割っているのはfの関数形によってはfが0になることがあるから。

that evaluates the not the difference but the ratio that is not relevant to the absolute value of signs. 

個人的な経験としては測定値の誤差自体が十分小さくフィッティングに用いるデータ数が十分な場合やフィッティングパラメータの数が少ない場合は大差はないが、そうでない場合は残差計算の方法の違いでそれなりに結果に違いが生じてくるので個人的には注意したいと思っている部分である。

In my experience, such a fifference of residual function make no difference if the error itself is enough small or the number of data for fitting is enough or the number of fitting paremeter is enough small, there is no significant diference, Otherwise, there are possibilities to make differencies depending on the choice of residual function. Thus we wolud like to be careful about such a differencies.

正直質問として投稿する内容かとも思ったけれども、フィッティングの関数や範囲などの条件でどうとでも状況が変わる話題だと思うのでこちらで投稿しました。ご指摘ありましたら歓迎いたします。

Although I'm not sure whether it should be submitted by article or question, I did because the situation will change depending on the range and the condition of fitting. I welcome the any suggestions ans corrections.
WordPressのマルチサイト引越し体験

今回、WordPressで作られたウェブサイトのサーバー移転を請負ました。
この作業の中で見つけたネット上の記事を備忘録の意味も込めて、ここに記録したいと思います。

http://wordpress.bulog.jp/201604multi-duplicator/

https://www.itti.jp/web-design/wp-multi-site02/

https://into-the-program.com/wordpress-multisite-database-connection-error/

https://free-leaf.org/tomorrow/manual-of-move-wordpress-multisite/

https://kinsta.com/jp/blog/wordpress-multisite/


[データベース接続確立エラーの修正方法、原因](https://wp-doctor.jp/blog/2015/08/24/wordpress-%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e6%8e%a5%e7%b6%9a%e7%a2%ba%e7%ab%8b%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%a8%e3%81%af%e4%bd%95%e3%81%8b%ef%bc%9f/)


上記の記事は、とても勉強になりました。

また、Xサーバーなどの動作確認URLで、WordPressを利用できないときは、下記の記事を参考にされると良いです。

https://www.itra.co.jp/webmedia/hosts_file.html
[Rails][RSpec]FactoryBot でFaker を使うのは一意性制約のあるものだけでOK 

# 結論
FactoryBot でインスタンスを生成する時に、
Faker でランダムな値を出力するのは一意性制約のあるものだけでOK というお話です。
# 背景
RSpec使ったテストコードについて学んでいる中で、
FactoryBot であらかじめインスタンスをまとめておける、
Faker でランダムな値を生成できると知り、
Faker を使うのが楽しくなってこんな感じでユーザー登録用のFactoryBot の記述をしていました。

```spec/factories/users.rb
FactoryBot.define do
  factory :user do
    transient do
      gimei { Gimei.name } # gem 'gimei'を用いて漢字氏名とフリガナを生成する
    end

    nickname { Faker::Name.first_name }
    email { Faker::Internet.free_email }
    password = 'test1234'
    password { password }
    password_confirmation { password }
    family_name { gimei.last.kanji }
    first_name { gimei.first.kanji }
    kana_family_name { gimei.last.katakana }
    kana_first_name { gimei.first.katakana }
    birthday { Faker::Date.between(from: '1930-01-01', to: '2016-12-31') }
  end
```

そんな時にコードレビューしていただいた方から、
「FactoryBot では**バリデーションにひっかからず登録できる情報が作れれば良い**ので、
Faker はemail等の**一意性制約をかけているものだけ使えばOK** ですよー。」
とコメントを頂きました。

なるほどと思い、書き直したのがこちらです。

```spec/factories/users.rb
FactoryBot.define do
  factory :user do
    nickname              { 'テスト用ユーザー' }
    email                 { Faker::Internet.free_email }
    password =            'test1234'
    password              { password }
    password_confirmation { password }
    family_name           { '佐藤' }
    first_name            { '太郎' }
    kana_family_name      { 'サトウ' }
    kana_first_name       { 'タロウ' }
    birthday              { '1970-01-01' }
  end
end
```
ユーザー登録にemail だけは一意性制約をかけているのでFaker を使い、
他は重複しても問題無いので直接記述しています。
こちらの方が断然読みやすくなりました。
# 学んだこと
この時新しくFaker を知ったので、使いたいばかりになっていましたが、
新しく勉強したことでも、
本当にそれを使う必要があるのかや、もっとシンプルにコードを書けないかを意識しようと改めて思いました。


[Faker](https://github.com/faker-ruby/faker/blob/master/README.md)
Rubyについて

##if文以外の条件分岐について
### case文
case文は条件分岐を表現する文法のひとつであり、elsifで書くよりもシンプルな記法にすることができる。

```ruby:sample.rb
case 対象のオブジェクトや式
when 値1
 # 値1に一致する場合に実行する処理
when 値2
 # 値2に一致する場合に実行する処理
when 値3
 # 値3に一致する場合に実行する処理
else
 # どれにも一致しない場合に実行する処理
end
```

## 繰り返し処理について
### while文
指定した条件がTrueである限り、処理を繰り返す。

```ruby:sample.rb
while 条件式
 # 条件が真である時に繰り返す処理
end
```

・使い方例

```ruby:sample.rb
number = 0

while number <= 10
 puts number
 number += 1
end

# ターミナル出力結果
# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
```

・無限ループになってしまう例

```ruby:sample.rb
number = 0

while number <= 10
 puts number
end
```

numberの値が０のままになってしまうので、無限ループが起こる
無限ループはコンピュータに大きな負荷をかけてしまうので、繰り返し処理を実装する際は注意

## break

breakは無限ループから脱出するために使われる

```ruby:sample.rb
number = 0

while number <= 10
 if number == 5
   break
 end
 puts number
 number += 1
end

# ターミナル出力結果
# 0
# 1
# 2
# 3
# 4
```
device.mapファイル

####device.map　とは
デバイス名と、GRUBブートローダのドライブ名との対応が記述されているファイルである。

    フルパスを確認する
    # find / -name device.map
    /boot/grub2/device.map

    中身を確認する
    # cat /boot/grub2/device.map
    # this device map was generated by anaconda
    (hd0)      /dev/sda
APIを改めて勉強してIoT機器を動かす


##  目次

1. APIとは
2. 仕組み
3. 便利ツール
4. やってみた

---
## 1. APIとは

Application Programming Interfaceの略

---
###　機能的には

ソフトウェアやアプリケーションなどの一部を外部に向けて公開
　↓↓↓↓↓
第三者が開発したソフトウェアと機能を共有するもの

---
### つまり

アプリケーション、ソフトウェアとプログラムをつなぐもの

---
### 例えば
[よくある郵便番号を入力したら住所を入力してくれるやつ](http://zipcloud.ibsnet.co.jp/doc/api)
[![Image from Gyazo](https://i.gyazo.com/30e8fcb957818e6f44d4441e02be53b3.png)](https://gyazo.com/30e8fcb957818e6f44d4441e02be53b3)

---
### やってみよう
`curl -X GET https://zipcloud.ibsnet.co.jp/api/search\?zipcode\=あなたの郵便番号`（間のハイフンは無し）
ちなみに`curl`はサーバへ（から）データ転送を行うコマンド
基本的な使い方はHTTPリクエスト

---
## 2. 仕組み

---
- API エンドポイント
- API キー
- メソッド
- クエリパラメータ
- ヘッダ
- ボディ
- レスポンス

---
## 分解してみよう

---
### API エンドポイント
サービスに接続するためのURL
企業などのサービス提供側が用意している
これがないと
どこにデータを取りに行ったら良いかわからない

---
#### メソッド
|ネーム|役割|コメント|
|:-:|:--:|:--:|
|GET|リソースの取得|一番安全|
|POST|リソースの作成|よく使う|
|PUT|リソースの置き換え|ファイルアップロードなど|
|PATCH|リソースの部分更新|べき乗でない|
|DELETE|リソースの更新|べき乗である|

---
### クエリパラメータ
使用するAPI・サービスの種類など詳細を指定
`https://example.com/pathparameter/{pathparameter}?queryparameter=hoge`

※パスパラメータは特定のリソースを識別するために必要な情報

---
### クエリパラメータ
特定のリソースを操作して取得する際に必要な情報
検索やフィルタなどで使用

---
### ヘッダ
データの種類や、API キーなどの認証情報を入力　※POSTメソッドで指定する

---
### ヘッダ
そもそも情報は付与してリクエストしている
curl -i https://api.github.com/zen

---
### ボディ
APIと送受信したい情報を入力。※POSTメソッドで指定する
`{hoge_name: fugafuga,description: hogefugahoge}`
特定のリソースを識別するために必要な情報
※基本はJSON形式

---
### JSONかXMLか
JSON: JavaScript Object Notation
記述量が少なめ
XML: Extensible Markup Language
HTMLと同じマークアップ言語だがデータ記述用の言語

---
### JSONが増えている
[![Image from Gyazo](https://i.gyazo.com/39edb5cd3d688e53d8d0e859dc6acbaf.png)](https://gyazo.com/39edb5cd3d688e53d8d0e859dc6acbaf)

---
### レスポンス (APIからの返答)
同時にアクセスがある時のPATCHなどべき乗でないので設定が必要
また、同時のアクセスが多いものなどには
プロキシサーバーを立ててあげることで複数のAPIアクセスを個別に行い、レスポンスをまとめて返してくれる

---
## 3. 便利ツール

[**Postman**](https://www.postman.com/)
[**Swagger**](https://swagger.io/)

---
### [Postman](https://www.postman.com/)
[![Image from Gyazo](https://i.gyazo.com/6950cd24fa220a47c7941246e0e351a7.png)](https://gyazo.com/6950cd24fa220a47c7941246e0e351a7)

---
### Postman
- リクエストの保存ができる
- パラメーターのカスタマイズがしやすい
- 比較的人気

---
### [Swagger](https://swagger.io/)

簡単にいうと
APIの仕様書でリクエストも送れるもの
サーバを立てないとリクエストが遅れないなど少し面倒

---
## 4. やってみた
[![Image from Gyazo](https://i.gyazo.com/a3d4fb4b7a9aee965ebd24bc0ec88f10.png)](https://gyazo.com/a3d4fb4b7a9aee965ebd24bc0ec88f10)

---
### Switch botがAPIを公開している

#### [SwitchBotAPI](https://github.com/OpenWonderLabs/SwitchBotAPI/blob/main/README.md#command-set-for-physical-devices)

生のAPIを使って操作してみた

---
参考：
[郵便番号検索API](http://zipcloud.ibsnet.co.jp/doc/api)
[APIの仕組みが分かる・使いこなせる人材になれる記事（Pythonコード付き）](https://qiita.com/Saku731/items/6ae290f72e98723f165d)
emotionを用いたReactのプロジェクトでスナップショットテストをする

前回書いた記事の少し発展です。

https://qiita.com/hideokaizuka/items/2d7b636b5255e2091b70


## スタイルではなくclass名の変更が検知される

[emotion](https://emotion.sh/docs/introduction)を使って開発してるブロジェクトで[storyshots](https://storybook.js.org/docs/react/workflows/snapshot-testing)を用いたスナップショットテストを行おうとすると、そのままだとスタイルではなくclass名がテストされてるという問題があります。（以下の画像参照）

![css変更テストクラス名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307699/2d443a17-1210-dc09-655f-83a082e98c59.png)

画像を見るとわかるようにclass名の変更が検知されています。しかし、これはテストの意図としては間違っていて、スタイルの変更を検知して欲しいはずです。意外とこの辺ことについて書かれている記事がなかったので、今回はこの問題を解決する方法について紹介していきます。

## 環境というか諸々のバージョン

`yarn -v
1.22.10`

`node -v
v14.11.0`

`react@16.13.1`

`@storybook/react@6.1.20`

`@storybook/addon-storyshots@6.1.2`

などなど

## 解決方法

[emotion/jest](https://github.com/emotion-js/emotion/tree/master/packages/jest)を導入します。

`yarn add -D @emotion/jest`

storyshotのテストのファイルに以下のように設定を追加します。

```src/Storyshots.test.js
import initStoryshots, { multiSnapshotWithOptions } from '@storybook/addon-storyshots';
import { createSerializer } from '@emotion/jest';
initStoryshots({
  integrityOptions: { cwd: __dirname }, // it will start searching from the current directory
  test: multiSnapshotWithOptions(),
  snapshotSerializers: [createSerializer()], //これが大事
});
```

その上でテストを実行すると、

![スナップショットテストスタイルの変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307699/2af64a3c-b03c-de5b-17e3-6972be1f0879.png)

上記の画像のように、スタイルの変更を検知してくれるようになります。

この記事が似たようなことで困っている方の助けになれば幸いです。

## 参考
https://emotion.sh/docs/testing
MAMP環境でtimezoneが反映されない問題の解決過去記事による罠

## タイムゾーンが反映されない問題について
### 疑う箇所
- 編集しているphp.iniファイルは合っている？(php.infoから確認できます)
- コメントアウトされてない？
- 編集後に再起動した？


## 本題
「PHP MAMP タイムゾーンが反映されない」などで検索すると同じような解決策がずらりと並びます。
ですが今回の問題は上記にあげた疑う箇所によるものではないです。
というのも過去記事にもMAMPのデフォルトでも同じように以下の記載になっています。

```
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
; date.timezone = "Europe/Berlin"
```

これを

```
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Asia/Tokyo"
```

と書いたら動きそうですよね？
でもこれではうまくいきません。
理由は簡単で「""」が悪さをしています
これを

```
date.timezone = Asia/Tokyo

または

date.timezone = 'Asia/Tokyo'
```
に変更で動きました！
いやー罠でした。

## 後書き
以前は「""」でできてたものと推測しますが
今はなぜできないのか調べても出てきませんでした。
もしご存知の方いればご教授いただけたらと幸いです。
ゲーム系の専門学校に通っての個人的な感想

今回はゲーム系専門学校を卒業し、ゲーム業界に内定した私からゲームプログラムの専門学校はどうなの？などをお話したいと思います。



###ゲーム業界を目指す方法
まずゲーム業界にはいりたい人に向けてどうすればゲーム業界に入る方法を並べたいと思います。
#####１，ゲーム系専門学校に入学してゲーム業界を目指す
#####２，大学に入学してゲーム業界を目指す
まあ、単純にこの2つが多いでしょう。
しかしどっちのほうがいいの？と言われると私もこっちのほうが絶対いい！！とは言えません。
なので私が専門学校を選んだ理由を言いたいと思います。

#####専門学校は授業がプログラムやゲーム開発関係のみ！
個人的にはまずこれですね。私は理系で世界史や国語などがあまり得意ではないのでプログラムの勉強1本ってところが一番うれしかったですね。高校も工業高校を選んだのですが普通科の勉強をあまりしたくないって理由もすこし込みで選んでますのでｗ
なので私みたいな複数の勉強を平行してやるのが苦手な人は専門学校を選ぶことお勧めします。
#####会社に入るまでの期間が大学に比べて少ない！
もう一つはこれですね。私の専門学校では2、3、4年制とあります。
2年制クラスに入るには少し大変なのですが、私は少しでも早くゲーム業界に入りたい気持ちがあったので頑張って2年制に入りました。
なので大学と比べると最高2年間も期間を短くして就職することができます。
なので早くゲーム業界に入って勉強したい！って人は専門学校をお勧めします。

個人的にはこんな感じでしょうか。簡潔にまとめちゃうとジャンルの違う複数の勉強を平行してやりたくない、早くゲーム業界に入りたいって人は専門学校のほうがいいのかなと思います。

###専門学校ってどんな感じなの？
少し話題がそれてしまったので専門学校ってどんな感じかをお話したいと思います。
#####すこし悪い言い方ですがある意味無法地帯
ゲーム系の専門学校は非常に人気でたくさんの人が入学してきます。
その中にはいろんな人がいます。私が見た中で上げると「高校で進学しろって言われたから来た」、「ゲームできるんでしょ？楽しそう」や授業中永遠とゲームをしている奴、寝ている奴と上げるときりがないのですがはっきり言ってこんなクズたちが結構います。（もっとひどいやつもたくさんいます）
はっきり言うとこんな奴は絶対にゲーム業界に入れません。無理です。勉強もせずにどうやってゲーム業界に入るのかって話です。
なので専門学校で本気でゲーム業界を目指しているのであればかかわらないほうが絶対にいいです。

しかしその中にも本気でゲーム業界を目指している人はもちろんいます。
ゲーム業界に入りたい人はこのような人と仲良くなりましょう。技術に関する情報交換や実際に作ったゲームをプレイしてもらってアドバイスをもらったりありがたいことしかありません。なのでこんな友達をたくさん作りましょう。

#####授業はどうなの？
授業はゲーム業界を目指す方法にも記入しましたが本当にプログラムやゲーム開発に関する授業だけといっても大丈夫です。
なので本気で目指している人は楽しいと思います。個人的にはめっちゃ楽しかったです。
しかしIT業界に就職する人もいるのでIT関連の授業もあったりします。

#####先生たちはどうなの？
私の通っていた専門学校はお世辞抜きでほんとに良い先生ばかりでめちゃくちゃお世話になりました。
授業以外でもわからないところなど質問しても教えて下さったり、夜中に質問メール送っても返信してくれたりなどめちゃくちゃ助かりました。
専門学校によって変わるかもしれませんが良い先生が多いのでわからないところは質問しまくりましょう！

こんな感じですかね。なので本気で勉強したい人にはとてもおすすめできる環境ではあると思います。

###人によってはいい環境
専門学校はプログラム初心者の人が結構います。なのでスタートはほとんど同じです。安心して入学しましょう。
しかしゲームが好きだからゲーム開発者になる！という考えはやめましょう。
ゲームを作るとゲームをプレイするは全くの別です。
もし専門学校に入って自分がゲーム開発者に向いてないなと思いたくないのであれば一度ゲームを作ってみるのもありかもしれません。
でも作り方を知りたいから専門学校に入るんだ！って言われるのもわかります。
なのでボードゲームを作ってみたりする、などでも大丈夫です。0から1つのゲームを作り出してみましょう。
そして重要なのが作ったものを周りの人にプレイしてもらって感想や改善点、苦情を聞きましょう。
その中でめんどくさいなと思ったりしたらその人はゲーム開発者には向いてないかもしれません。
またゲーミングPCなどをもっている人はUnityやUE4などを使って自分で簡単に作ってみるのもありです。
もしゲーム業界を目指すのであれば「ゲームが好き」から「ゲームを作るのが好き」に代わるようにしてみましょう！
Node.jsからSlackへのレスポンス際に「あなただけに表示されています」と表示されるのを、どうにかしたい

# はじめに

* Slackのslash commandのリクエストに対して、普通にレスポンスを返すと「あなただけに表示されています」という状態で投稿されます
* 他の人に投稿した内容が見えるようにする方法を簡単にまとめます。

# 「あなただけに表示されています」を解消する方法
* レスポンス内で```response_type: 'in_channel'```を指定します。 
* ちなみに、Slackの公式サイトにも以下のように記載されています。

>
The response_type parameter in the JSON payload controls this visibility, by default it is set to ephemeral, but you can specify a value of in_channel to post the response into the channel, like this:
{
    "response_type": "in_channel",
    "text": "It's 80 degrees right now."
}
参考URL : https://api.slack.com/interactivity/slash-commands

デフォルトでは、```"response_type": "ephemeral"```が設定されていると書いてありますね。

# サンプルコード
```body```内で、```response_type: 'in_channel'```を指定すればOKです。

```Node.js
const requestPromise = require('request-promise');
const options = {
  url: responseURL, // SlackへのレスポンスURL
  headers: {
    'Content-type': 'application/json'
  },
  body: {
    response_type: 'in_channel', // ★ ここで in_channelを指定
    text: response // Slackへのレスポンス内容
  },
  json: true
 };

res = requestPromise.post(options);
```
デスクトップマスコットを作ってみる。【目次】

# 変更履歴

- 2021/4/10
    - リンクの誤りを修正


# 概要

デスクトップマスコットを作るための記事のまとめです。

# 元記事
[JavaFX＋Kotlinでデスクトップマスコットを作ってみる。【マスコットの表示編】](https://qiita.com/urado/items/140293b94cac2424dc02)


# 目次
- [デスクトップマスコットを作ってみる。【マスコットの表示編】](https://qiita.com/urado/items/699740de7475064369e8)
- [デスクトップマスコットを作ってみる。【マウスの操作編】](https://qiita.com/urado/items/896c1ef63b76d4b6a83e)
- [デスクトップマスコットを作ってみる。【アプリの終了編】](https://qiita.com/urado/items/d94382e5fc53fbcc6d85)
- [デスクトップマスコットを作ってみる。【マスコットを投げる編】](https://qiita.com/urado/items/67637d5102c25405877f)
- [デスクトップマスコットを作ってみる。【アニメーション管理編】](https://qiita.com/urado/items/f951f5f05d74be4dc9b4)
- [デスクトップマスコットを作ってみる。【アニメーション遷移編】](https://qiita.com/urado/items/3db939f37ed935451547)
PHPerKaigi2021に参加しました

## はじめに

[PHPerKaigi2021](https://phperkaigi.jp/2021/)というイベントに参加したので参戦記録を残します。
今年はコロナ禍ということでオンラインでの開催となり、
早起きをすることなくのんびり起きて自宅からまったり参加できました。
僕が所属している[Hamee株式会社](https://recruit.hamee.co.jp/)は本イベントのスポンサーをしており、弊社からも何名か登壇しておりました。

## 気になったセッション

### 静的型解析を用いた大規模レガシーコードのリファクタリング計画

レガシーコードに静的解析をかけると大量のエラーが出るのはあるあるだなと思いました。
本講演の例だと約2万件のエラーが出て、それを少しずつ減らしているとのことでした。
僕も昔経験がありますが、大体静的解析かけて大量にエラーが出て、そこで諦めちゃうんですよね。
そこからレベル絞って少しずつ対応している姿勢に尊敬を覚えました。
PHPDocを元に型の判別をして静的解析する、ということでしたがレガシーコードにはまずPHPDocなんて書いてないのでまずはPHPDocを充実させていくところから。
何事も1歩ずつですね。

### テクニカルサポートに精一杯だったチームが、安定運用のための開発を行えるようになるまでの道のり

サポートメンバーも同席しての講演が珍しく印象に残っています。
弊社でも開発チームとサポートチームとの間のコミュニケーションはしばしば課題になるので、課題感が近く共感して話を聞くことができました。
部署をまたいだ朝礼など検討しようと思いました。
本講演がyoutubeなどの媒体に動画としてアップされたら社内共有しようと思います。

### モックの泥沼から脱却するために、あえてDBにつないでテストしている話

発表の最後に登壇者の方もおっしゃっていましたが、結局ケースバイケース。
モックを用意する方が良いケースもあるし、データを用意する方が良いケースもある。
テストしたい内容、テストしたいメソッドの性質によって使い分けるのが良いと感じました。

### なるせ先生のPHP学～PHP8新機能スペシャル～ 

なるせ先生は何を目指しているのか…。
ひとまず安定の面白さでしたｗ

## 良かった点

* 今年はメインセッションは全て録画放送だったので時間切れの発表はなく、発表者にとっても視聴者にとっても良かった
* 配信がニコニコ動画だったので画面上にコメントが流れる感じが賑わい感が出て良かった
* いつもかさばるチラシが今年は1冊の本になっていたので邪魔にならず良かった
* フィードバックがコメントなしでも送れる仕組みだったのでイイネ感覚で送ることができた
* GMOさんのCMが相変わらず面白かった
* ノベルティにカレーが入っていた
* ノベルティに温泉の素が入っていた（弊社ですが）

## 悪かった点

* 録画配信だったのでリアルタイムのやり取りがなく物足りなさを感じた
* ニコニコ動画、twitter、discord、自分用メモとPOSTする先が複数あり、配信中に全てに目を通すのが難しかった
* disocrdのask the speakerが入りにくかった
* セッション間が20分もあり、リアル会場と違って移動とかないのでただただ暇でテンポが悪かった
* モンスターハンターライズの発売と被っており、モンハン欲と戦うので必死だった

## ベストフィードバッカー賞

クロージングでツイート企画の表彰とかやってて
くそー抽選選ばれなかったぜーと思っていたら
まさかの「ベストフィードバッカー賞」をいただきました！！！
めちゃびっくりして手が震えました。
見たセッションに関しては大体フィードバックを送っていて、計21個のフィードバックを書いてました。
ベストフィードバッカー賞ありがとうございます！
Oculus Quest2がもらえるらしい（すごい）

![スクリーンショット 2021-03-28 18.39.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/7399071a-ccb2-155c-efb8-49bc7b0dcb0c.png)

![スクリーンショット 2021-03-28 18.39.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/dcbd7c51-25ca-8d41-68a4-72e0207773d4.png)

2021/04/05 追記

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">phperkaigiの賞品届きましたー！ありがとうございます！ <a href="https://t.co/iR2lkTKWkO">pic.twitter.com/iR2lkTKWkO</a></p>&mdash; Hiroya Yamamoto (@HiroyaYamamoto1) <a href="https://twitter.com/HiroyaYamamoto1/status/1378189049421127682?ref_src=twsrc%5Etfw">April 3, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## まとめ

配信なので自宅から気軽に参加できました。
実は密かにプロポーザルを出していたのですが見事に採択されませんでした。
次回は是非プロポーザル採択で登壇できるように精進したいと思います！

![ExiQWr_VIAEoWrv.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/3888d1e6-f00b-d36f-5787-82e5e46cc2dd.jpeg)
UbuntuでAlt + Tabを現在のディスプレイに限定する

サブディスプレイはワークスペースを独立させて特定のウィンドウを出しっぱにしていることが多いので、
Alt + Tab　の挙動をカレントディスプレイに限定させたい。

デスクトップGUIがGNOMEになっているUbuntuバージョンが対象です。
古いUbuntuでUnityのやつは知らん。

# gnome拡張機能をインストールできるようにする（まだやってない人だけ）

```bash:
sudo apt install chrome-gnome-shell
```

# Current screen only on window switcherのインストール

以下のページにアクセスしてONにする

https://extensions.gnome.org/extension/1437/current-screen-only-for-alternate-tab/
Archlinux lxqt環境でデスクトップにゴミ箱/Trashが現れない場合

Archlinux lxqt環境でデスクトップにゴミ箱/Trashが現れない場合、まずはgvfsを入れてみる。以上。

https://wiki.archlinux.jp/index.php/PCManFM
dockerで、react-nativeの環境を構築する(expoなし、nativeのreact-native)


#はじめに
最近、友達と個人でreact-nativeを使ってアプリ開発をしています。そのときに環境の違いによって余計な時間がかかってしまったというのがあり、dockerを使うことにしました。存在自体は前から知っていたのですが、自分でDockerfileを作ったり、docker-compose.ymlをいじったりするのははじめてだったのでなかなか難儀しました。今回はandroidだけですが、iosでもできるように整備したいですね。

##この環境の強み
react native関係のパッケージ(yarn,npm,node,npx)やadbなどのandroid関係のパッケージがdocker内にほぼすべて入っているので、自分のノートパソコンの環境への依存性がかなり減ります。

##参考にしたgithub
いろいろgithubを見ていたのですが、最終的にreact-native-communityのレポジトリが頻繁に更新されていて使えそうだったのでこれを利用することにしました。(https://github.com/react-native-community/docker-android)

##Dockerfile

```dockerfile
#基になるdocker image
FROM reactnativecommunity/react-native-android 

# watchmanとnmapをインストール(nmap は自分の好み)
RUN apt update -qq && apt install -qq -y --no-install-recommends watchman nmap

#work ディレクトリの作成
RUN mkdir /home/react-native
WORKDIR /home/react-native

#パッケージのインストール
#npm install ではなぜかstack over flowのようなエラーがでた
COPY . .
RUN yarn install

```

##docker-compose.yml
```yml
version: "3"
services:
  react-native:
    build: .
    privileged: true
    ports:
      - 8081:8081
    tty: true
    volumes:
      - ".:/home/react-native"
      - "node_modules:/home/react-native/node_modules"

volumes:
  node_modules: # ここでvolumeを定義
    driver: local

```

##docker-compose
react nativeのルートディレクトリで、docker-compose upをすれば立ち上がります。



#最後に
githubにコードをあげています。
https://github.com/taka1226/my_react_native_docker
OSI参照モデル

#OSI参照モデル
**7層：アプリケーション層
6層：プレゼンテーション層
5層：セッション層
4層：トランスポート層
3層：ネットワーク層
2層：データリンク層
1層：物理層**

##アプリケーション層
**「ユーザが操作するソフトウェアが提供する昨日の仕様や通信手順やデータ形式などを定義」**
HHTP：Webプラウザを利用してWebページを閲覧
HTTPS：Webプラウザを利用してWebページを閲覧するとき暗号化通信を行う
FTP：サーバにファイル転送
SFTP：暗号化転送
TFTP：簡易的なファイル転送
SMTP：メール送信
POP：メール受信
Telnet：サーバの遠隔操作
SSH：サーバの遠隔操作で同時に接続の際にパスワードを暗号化する
これらを**定義**する

##プレゼンテーション層
**「コンピュータとネットワークのデータ形式の変化を定義」**
SMTP：電子メールを伝送する際に利用されるプロトコル
FTP：サーバにファイル転送を行う際に利用されるプロトコル
TLS：反対に下層のセッション層に渡す際はデータの暗号化通信
どちらもファイルを転送する役目がありますが、送ったファイルがサーバで動作しているアプリケーションの形式に沿ったフォーマットでなければ思ったとおりに表示されない


##セッション層
**「通信の確立、維持、終了するまでの手順を規定」**
セッションは通信の開始から終了までを管理する1つの単位
主流のプロトコルSSL/TLS
SSLサーバ証明書は「運営者の実在性を確認」し、ブラウザとウェブサーバ間で「通信データの暗号化」を行うための電子証明書で認証局から発行

##トランスポート層
**「正確な信号を送信する通信の企画を定めたもの」**
プロトコルはTCPとUDP

**TCP(Transmission Control Protozol)**
通信相手とのコネクションを確立してから、データを送受信するコネクション型の通信プロトコル
コネクションの確立は、通信相手が確実にデータを受信できることを事前に確認するための手順です。コネクションを確立して、通信相手が確実にデータを受信できることを確認してから、データの転送を開始します。そして、データを受信した宛先では、受信したことを通知するための確認応答を返します。確認応答が返ってこなければ、データが失われたと判断して再送します。また、データを分割しているときには、その順序も明確にできます。

**UDP(User Datagram Protocol)**
事前に送信相手と接続確認を取ったりせず、一方的にパケットを送り続けるコネクションレス型の通信プロトコル。高速だが信頼性に欠ける。
データを受信した通信相手は、確認応答を返すこともしません。コネクションレス型の転送プロトコルは、オーバーヘッドが必要ないのでデータ転送を効率よく行うことができます。しかし、確実に転送したデータが通信相手に届くとは限らないため、信頼性が低いデータの転送となります。


##ネットワーク層
**「サーバー同士の接続」**
プロトコルの代表的なものはIP

**IP**
ネットワークからネットワークへとパケットを運んで相手に送り届ける
1つのデータを、より小さなブロックに分割した細切れのデータのかたまりのこと
パケットは、「ヘッダー」と「データ」に分かれる。ヘッダーには、送信元・あて先IPアドレス、データの内容を表すフラグやTTL（Time to live）、上位層のプロトコルの種類などの情報が保存される
コンピュータやネットワーク機器などを識別するために、IPアドレスという番号を割り当てて管理している。

**IPアドレス**
コンピュータやネットワーク機器はIPアドレスという番号で管理されている
グローバルIPアドレス
インターネットの世界で使用するIPアドレス
プライベートIPアドレス
企業内などでLANの中で使えるIPアドレス

**ネットワーク部とホスト部**
ネットワーク部：どのネットワークに所属しているか示す部分
ホスト部：所属しているネットワーク内でコンピュータを識別する部分

**IPアドレスのクラス**
ネットワークの規模によってクラスA,クラスB,クラスCに分かれる
クラスA：ネットワークアドレス部8ビット、ホストアドレス24ビット→使用できる台数16777214台
クラスB：ネットワークアドレス部16ビット、ホストアドレス16ビット→使用できる台数65534台
クラスC：ネットワークアドレス部24ビット、ホストアドレス8ビット→使用できる台数254台

##データリンク層
**「通信回線のことを示し正確に通信する規則を定める」**
代表的な組み合わせはMACアドレスによるイーサネット接続
MACアドレス（Medium Access Control Address）とはノード間のデータ転送を行う際の宛先として使われるアドレスでコンピュータ機器の製造時に割り振られたもので、これを物理アドレスやノードIDともいいます。イーサネット（Ethernet）とは主に室内や建物内でコンピュータや電子機器をケーブルで繋いで通信する有線LAN（構内ネットワーク）の標準の一つで、最も普及している規格です。また室内でも「無線LAN」がありLANケーブルを必要としない通信技術も存在します。要するにイーサネットの概念は有線でも無線でもローカルエリア（室内、企業のオフィス内）のネットワークである


##物理層
**「ハードウェアのコネクタ形状やピン数などの物理的な接続を定めるもの」**
プログラミング未経験だったぼくのエンジニア転職日記【面接編_前編】

#はじめに
昨年9月からプログラミングスクールに通って、プログラミングを勉強し始めてから早半年、この度、自社開発企業複数社様から内定をいただくことができました。そこで、スクールのカリキュラム終了後から転職活動までの経験をこれから複数回に分けて投稿していこうと思います。こんな人もいるんだなあという感じで見てください。
これまで、シリーズ化してきた体験談も面接編でラストです。面接編は二回に分けて投稿予定で、今回はその前編です。
第一回はポートフォリオの作り方、第二回はWantedlyの活用方法について書いているので、そちらも見ていただけると嬉しいです。

https://qiita.com/nasubiee/items/bc297d11eac734c126bd

https://qiita.com/nasubiee/items/78c094890d52163909d3　

# 転職活動概要
### 転職活動期間
ぼくは主に2月初旬〜3月中旬にかけて約7週間ほど転職活動を行っていました。このうち、最後の2週間は、1社だけ選考を続けていた期間なので、実質の活動期間としては約5週間です。この5週間で何をやっていたかに関しては、以下の通りです。

* 最初の3週間：企業研究、面接対策、カジュアル面談、面接(2社)
* 後半の2週間：面接(10社)、企業研究

まず、最初の3週間についてですが、ここに3週間かかった理由は主に2つあります。1つは自分の行動力が足りなかったことと、もう1つはスクールの応募解禁前だったことです。このうち、前者は完全に自分自身の問題なので、もっとどんどんWantedlyで応募するなど、改善の余地はあったなと思います。ただ、前半の反省も踏まえて、後半の2週間の行動力全振りみたいな方針につながったので、この辺は何とも言えない部分です笑。この後半2週間については、以下の__転職活動戦略__の中で話そうと思います。

### 転職活動戦略
ぼくの転職活動の戦略(特に後半の2週間)は、シンプルに面接を__受けまくる__ことでした。具体的には、後半の__2週間で12回__面接を受けました。この期間は1日1回以上のペースで受けていたので、さすがに自分でもやりすぎかなと思う部分もありましたが、結果的には、この方法でよかったなと思います。具体的に、短期間で多くの面接を受けるメリット・デメリットをまとめると以下のようになると思います。

* メリット<br>
進展が早い / 面接の場慣れができる / 望みを持てる選択肢が多く精神的に嬉しい / 当初志望度が高くない企業でも思わぬ良さを発見できる
* デメリット<br>
体力的にはきつい / 1回1回の面接の割り切りができない場合は精神的にきつい / 自己応募一本だと企業とのやり取りが大変

この中でも、特に1回1回の__面接の割り切り__についてお話しようと思います。ぼくは計12社の面接を経験しましたが、言葉は悪いですが、ある程度、面接練習と割り切って、志望度が高い企業から低い企業まで幅広く受けていました。個人的には、この意識が良かったなと思います。最悪、選考に落ちても精神的ダメージは少ないですし、面接の内容自体も志望動機以外はほぼ同じなので、ある程度落ち着いた心持ちで、本命の企業を受ける前に面接官の反応を確かめることができます。また、当初、志望度が低い企業でも、特にCEOやCTOの方の話に魅力を感じ、その企業の本当の良さを知れるなんてこともあるかなと思います。

以上の話から、デメリットよりメリットの方に魅力を感じる方は、短期間に多くの面接を受ける手法を取るのは向いてるのかなと思います。

また、短期間で面接をするという点は個人の向き・不向きがあるとは思いますが、多くの企業を受けるという点は、現職との折り合いがつけば、これを見てる方全員に薦めたいと思ってます。というのも、前回の投稿でも触れましたが、IT業界で実務を経験していない状態での志望順位なんて、そんなに正当性はなく、面接をしてみて企業の良さがわかることも多くあると思います。ぼくも転職活動前後で志望順位なんてまるっきり変わってます。良くも悪くも比較して初めて分かることは多いので、出来るだけ多くの企業の方の話を聞くというのは大事なことかと思います。

### 転職活動結果
以上の方針で転職活動を行ったぼくの戦績は、以下の通りです。

||選考フェーズ|企業数|備考|
|:---:|:---:|:---:|:---:|
|①|書類応募|17|応募経路内訳<br>（Wantedly経由5社、スクール経由11社、その他1社）|
|②|書類通過|13|内1社はその後自主辞退|
|③|一次+二次面接通過|4||
|④|最終面接通過<br>（内定）|4|自社開発企業3社、SES企業1社|

各選考フェーズについての話は、書類選考と面接それぞれにこだわりポイントがあって長くなりそうなので、次回の後編で書いていこうと思います。


# 終わりに
今回は、自分の転職活動の大まかな流れについて書いてみました。面接をやってみて思ったのは、ありきたりな話ですが、慣れがものを言う部分も多いと思うので、1回1回の結果を気にしすぎないマインドセットが大事ということでした。次回は、各選考フェーズについて詳しく書いていくので、そちらも見ていただけると嬉しいです！
Nreal Light devloper kitでGooglePlayを使えるようにする方法 

Nreal Light devloper kitでGooglePlayを使えるようにする方法を見つけたので自分の備忘録的に書いておきます。

こちらの記事を参考に
https://bibinbaleo.hatenablog.com/entry/2020/07/31/141343

Scrcpyを使ってNreal LightのAndroid画面をPCに写すことができました。

YouTubeアプリをapkインストールで入れてみましたが白い画面になってしまい起動ができません。

GooglePlayを入れるとGoogle Play Servicesが必要とのこと

以下のapkを上から順番でインストールすると解決します。
1.[Google Account Manager (Googleアカウントマネージャー)](https://www.apkmirror.com/apk/google-inc/google-account-manager/google-account-manager-5-1-1743759-release/google-account-manager-5-1-1743759-android-apk-download/)
2.[Google Services Framework (Googleサービスフレームワーク)](https://www.apkmirror.com/apk/google-inc/google-services-framework/google-services-framework-5-1-1743759-release/google-services-framework-5-1-1743759-android-apk-download/)
3.[Google Play Services (Google Play開発者サービス)](https://www.apkmirror.com/apk/google-inc/google-services-framework/google-services-framework-5-1-1743759-release/google-services-framework-5-1-1743759-android-apk-download/)
4.[Google Play Store (Google Play ストア)](https://www.apkmirror.com/apk/google-inc/google-play-store/google-play-store-15-8-23-release/google-play-store-15-8-23-all-0-pr-259261889-android-apk-download/)

fireタブレットを購入した時もGooglePlayStoreが入っていないことを思い出して同じ方法でやってみたらできました。


参考
https://kodomotablet.com/how-to-install-google-play-on-fire-tablet/


Nreal Light devloper kitはかけた状態で右側のつるのボタンを長押しすることでAndroid画面を表示させることができます。
ただ、操作ができないので別に入れても意味ないなと思いました。
Bluetoothで画面をPCにミラーリングさせれば操作はできそうですが…
WinActor Ver6.3.0とVer7.2.0のVerの違いと使用感レビュー

# はじめに

* バージョンの違いを難しい言葉で説明されてもわからない。
* 実際両方とも使用した人の声が聞きたい。

そんな初心者の方に向けた記事です。

# 本題の Verの違い & 使用感

Ver6.3.0とVer7.2.0の使用感の大きな違いは**3つ！**

* 項目ごとに分かれていたウィンドウが **１つ** ！
* 変数の個数上限が **256** から **上限無し** ！
* <font color = "RED">圧倒的</font>**処理速度**！

## 使用感詳細
>　項目ごとに分かれていたウィンドウが **１つ**

今、Ver7.2.0以前を使用している方が一度は必ず
**「ウィンドウ分かれてるのどうにかならないのかなぁ」**と思ったのではないでしょうか？

モニターが余っていれば２つ、余ってない時は１つの画面で使用していたのですが、
**Ver6.3.0** の時は毎回「ウィンドウごとに位置を変えて～」「大きさを変えて～」と
ちまちま行ってました。

~~この手間が毎日あると結構やる気を削がれたりも~~

**その作業が Ver7.3.0 になってからはウィンドウを １つ 動かすだけで済むわけです！**

使用したことが無い方からすると、とても些細な変更だと思うのですが
高頻度で使う方からすると <font color = "RED">**とても**</font> 大きな変更になると思います。
***
> 変数の個数上限が **256** から **上限無し**

上限解放は関係ある方とない方が居るとは思うのですが、私は前者でした。
Excelファイル間のデータ移行で変数が300ほど必要と判明。

~~Ver.6.3.0しか使ったことがない当時の私は「どうすれば良いのか...」と絶望してました~~
***
> <font color = "RED">圧倒的</font>**処理速度**

もう何も説明は要らないでしょう。
ただただ、処理速度が<font color = "RED"> 格段 </font>に上がりました。
体感 ３ 倍(それ以上かも)です。~~完全にシ○アのモビルスーツです、絶対<font color = "RED"> 赤色 </font>です。~~

ただ、これが意外と良い事ばかりではなく...

処理速度が **速すぎて** ウェブの応答速度が間に合わない事も多々...
「一度テスト実行して、応答が間に合わない所には **待機** を追加してっと」
速すぎるのも案外困ったものです。

# まとめ

個人的な総合的評価はVer7.2.0が良いと感じました。
流石最新版だけあるな...といった所でしょうか。

Ver7.2.0にも所々不具合もあるので、そういう詳しい話も今後出来たらいいなと思ってます。

## おまけ

WinActorを使用していてわからない事は 必ず 出てくると思います。
**「でも、質問する宛てが無い！」**という方は[公式のユーザーフォーラム](https://winactor.com/questions/)を利用してみてください。
きっと先人達が<font color = "RED"> 解決法 </font>や<font color = "YELLOW"> アドバイス </font>を教えてくれるはずです☺

<br>
**何か不備等ありましたらコメントお願いします。**
pyrealsense2をMacのpyenv,pipenv環境にインストールする

#はじめに
pyrealsense2をmacのpyenv,pipenv環境にインストールした際の備忘録。
基本のビルド方法は@comachiさんの記事を参考にさせていただきました。
[Mac に pyrealsense2 をインストールする](https://qiita.com/comachi/items/14b358568365bc5ee474)

#検証環境
macos 10.15.7
Intel® RealSense™ SDK 2.0 (v2.43.0)
pyenvとpipenv環境(Python3.7.7で作成)

#ビルド＆インストール

librealsenseのソースは以下のようにgit cloneするか、[公式サイト](https://www.intelrealsense.com/sdk-2/)からDLします。
公式サイトでは[Xcodeを使ったビルド方法が紹介されています](https://dev.intelrealsense.com/docs/macos-installation-for-intel-realsense-sdk)が、普通にmakeでもできるんですね。

今回は仮想環境をpython3.7.7で構築する前提で進めます。python3.7.7のバイナリは、/Users/xxxxxxxxx/.pyenv/versions/3.7.7/bin/python3　にあるとします（xxxxxxxxの部分は各自のユーザー名に置き換えてください）。

```
$ brew install libusb pkg-config
$ brew install homebrew/core/glfw3
$ brew install cmake
$ git clone https://github.com/IntelRealSense/librealsense.git 
$ cd librealsense
$ mkdir build && cd build
$ cmake .. -DBUILD_EXAMPLES=true \
-DBUILD_WITH_OPENMP=false \
-DHWM_OVER_XU=false \
-DBUILD_PYTHON_BINDINGS=true \
-DPYTHON_EXECUTABLE:FILEPATH=/Users/xxxxxxxxx/.pyenv/versions/3.7.7/bin/python3 \
-G "Unix Makefiles"
$ make -j4
$ sudo make install
```

pyrealsense2のインストールパスを確認

```
$ find /usr -name pyrealsense*
....
....
/usr/local/lib/python3.9/site-packages/pyrealsense2
/usr/local/lib/python3.9/site-packages/pyrealsense2/pyrealsense2.2.43.0.cpython-37m-darwin.so
/usr/local/lib/python3.9/site-packages/pyrealsense2/pyrealsense2.2.43.cpython-37m-darwin.so
/usr/local/lib/python3.9/site-packages/pyrealsense2/pyrealsense2.cpython-37m-darwin.so
```

この辺は人によって違うと思われますが、私の場合、
/usr/local/lib/python3.9/site-packages/pyrealsense2
以下にインストールされていることがわかります。なお、見た感じpython3.7対象のバイナリが3.9のディレクトリ以下に生成されてしまっていますので、本来の3.9など別のpythonバージョンで使うときは都度ビルドしなおした方がよいでしょう。

#pipenv環境の構築
作業ディレクトリにpipenv環境を作成します。今回はpython 3.7.7で環境構築しています。

```
$ mkdir realsense-test
$ cd realsense-test
$ pyenv local 3.7.7
$ pipenv --python 3.7.7
```

#pipenv環境にpyrealsense2をコピーする

さて、最近のバージョンのlibrealsenseではインストールプロセスになにがしか問題があるようで、通常の環境でもpyrealsense2がすんなり動作しないケースがあるようです。特に今回仮想環境を使っているのでややこしさ倍増です。そこで美しくありませんが、ライブラリを作業ディレクトリにばくっとコピーして解決します。

さきほどのpyrealsense2ディレクトリ以下に生成された６つの.soファイルをすべて作業用ディレクトリにコピーしましょう。
importをしてpipeline()してエラーが出なければDone！　うまくできていない場合pipeline()で落ちます。


```
$ cp /usr/local/lib/python3.9/site-packages/pyrealsense2/* .
$ pipenv run python3 -c "import pyrealsense2 as rs; rs.pipeline();"
```

librealsense/wrappers/python/examples/ 以下のサンプルファイルも実行してみましょう。

以上。
AWS Cognito トリガーを使ってサインアップ・サインインのログを取る

# 目的

Cognitoで認証システムを構築したをWebサイトに対して、サインアップやサインインがどのくらい行われたのかログを取りたかった。

# トリガー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/c5792a75-f3d5-4890-0840-adadf4d5ccdb.png)



上記のようにlambda関数を指定する。すると以下のようなログがCloudWatch Logsに出力される。

サインアップ前・・・サインアップ時にユーザーが送信する情報が含まれる

```
{
	'version': '1',
	'region': 'ap-northeast-1',
	'userPoolId': 'ap-northeast-1_XXXXXXXXX',
	'userName': 'test-user-29',
	'callerContext': {
		'awsSdkVersion': 'aws-sdk-js-2.6.4',
		'clientId': 'xxxxxxxxxxxxxxxxxxxxxxxxx'
	},
	'triggerSource': 'PreSignUp_SignUp',
	'request': {
		'userAttributes': {
			'email': 'xxxxxxxxxxxx@sample.com'
		},
		'validationData': None
	},
	'response': {
		'autoConfirmUser': False,
		'autoVerifyEmail': False,
		'autoVerifyPhone': False
	}
}
```

認証前・・・サインイン時にユーザーが送信する情報が含まれる

```
{
	'version': '1',
	'region': 'ap-northeast-1',
	'userPoolId': 'ap-northeast-1_XXXXXXXXX',
	'userName': 'test-user-13',
	'callerContext': {
		'awsSdkVersion': 'aws-sdk-js-2.6.4',
		'clientId': 'xxxxxxxxxxxxxxxxxxxxxxxxx'
	},
	'triggerSource': 'PreAuthentication_Authentication',
	'request': {
		'userAttributes': {
			'sub': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
			'email_verified': 'true',
			'cognito:user_status': 'CONFIRMED',
			'email': 'xxxxxxxxxxxx@sample.com'
		},
		'validationData': {},
		'userNotFound': False
	},
	'response': {}
}
```

# Lambda関数

画像にあるlambda関数は以下の通り。

```python
def lambda_handler(event, context):
    print(event)
    return event
```

# 参考記事

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-lambda-pre-sign-up.html

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-lambda-pre-authentication.html
【Bubble】Tabで入力フォーム移動するときの順序をいい感じにする

#はじめに
[前回](https://qiita.com/yuki_ink/items/dfcacdd1ccaa30ac4457)の記事でめでたくユーザー登録編が完結したわけですが、テストをしているとあることが分かりました。

**え、Tab使った時の移動順変じゃね？？**

ユーザー登録ページがこんな感じであって、当然、上から順に [お名前] ⇒ [メールアドレス] ⇒ [生年月日]、、というように移動したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/e8c3c8d8-f94c-aeaf-a123-14ef0cf375f5.png)
しかし、私の環境でいざTab移動してみると、 [お名前] ⇒ [パスワード] ⇒ [パスワード（確認用）] という順番にTab移動してしまい、もう酷いものでした。
いやいや、メールアドレスとか飛ばさないでほしい。。

今回はそんな地味な欠陥をプラグインを使って解決していきます。

#Fix Tab Orderを使う
Fix Tab Orderというプラグインを使います。
プラグインの詳細は[こちら](https://bubble.io/plugin/fix-tab-order-1595502384716x853477727762120700)。
無料で使えるプラグインです。

###とりあえずインストール
左ペインからPlugins画面を開き、右上の「Add plugins」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/bce54a9b-88d5-7b77-d6f4-cc1f0ebea633.png)
Fix Tab Orderを見つけ、「Install」ボタンをクリックし、続いて「DONE」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/4e8ea1bb-6db4-9ed2-6d6a-b7985438e0f6.png)
これでインストール完了です。
Installed PluginsのなかにFix Tab Orderが表示されていれば、正常にインストールできています。

###エレメントとしてページ上に配置
[Random Number Generatorを導入したとき](https://qiita.com/yuki_ink/items/20f9868dbeb1062b506f#%E6%89%BF%E8%AA%8D%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)と同様ですが、Bubbleのプラグインはエレメントとしてページ上に配置して初めて機能するようです。

Design画面に移り、Visual elementsを確認すると、「Tab Fix」が追加されていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/5dd4ac50-3887-19d9-d8c9-4274a468be0e.png)

この「Tab Fix」のエレメントをuser_registrationページに追加します。
いつものようにドラッグアンドドロップ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/b7b4e3aa-d841-10c5-54ca-8ff082c6a447.png)
これで導入完了です。
Previewしてみると、いい感じにTab移動できていることが確認できます。

###デフォルト設定のままでOK
Tab Fixの設定ウィンドウを見てみると、「Include Date Inputs」と「Include Radio Buttons」にチェックが入っていないことが分かります。
このままでは、[生年月日] と [加入プラン] はTabでの移動でスキップされてしまいます。

しかし、それで別に問題ないのでは、、というのが私の考えです。
基本的にDate InputsとRadio Buttonsはマウス操作での入力となるため、Tab移動で選択できたとしてもあまりメリットがありません。
ですので、ここに関してはデフォルト設定で放置でOKかと思います。

#終わりに
今回発見した欠陥は地味ですが、かなりインパクトの大きいものだと思います。
入力項目多めのページではどうしてもTab移動使いがちですから、そこでユーザーにストレスを与えてしまってはユーザー登録やーめたとなるのがオチです。

ご自身の環境をチェックしていただき、Tab移動の順序が想定と異なるようであれば、ぜひFix Tab Orderを使ってみてください。
【RubyOnRails + MySQL】AWS Cloud9 環境構築 MySQLの文字化け解消まで

AWS Cloud9で　RubyOnRails + MySQL　の環境構築を行う
(大変初歩的なことで申し訳ないが)

Create environment後、

##Rubyの設定

####Rubyの好きなバージョンをインストールせよ

```
$ rvm install バージョン
```

実行後、

```
$ ruby -v
```
をすることで現在インストールされているバージョンを確認できるよ。
Cloud9には元々Rubyはインストールされてるけど、自分の好きなバージョンを入れてね

####インストールしたRubyを使用できるようにせよ
上記のインストールだけでは、ただAWSにインストールしただけだよ

```
$ rvm --default use バージョン
```
にて、使用するバージョンを決めておいて


##Rails の設定
####好きなバージョンのRailsをインストールせよ
```
$ gem install rails -v バージョン
```
Rubyのときと同じく、念のためインストールしたRailsのバージョンを確認しといて

```
$ rails -v
```

##MySQLの設定

MySQLはAWSに元からインストールされてる基本的に既存のバージョンで大丈夫だと思うよ


####MySQLの文字化けを回避せよ

MySQLのデフォルトの文字コードだと、日本語を登録した際に文字化けの恐れがある。変更すべし。

試しにMySQLにログインしチェックしてみよう

```
$ sudo mysql -u root -p
mysql> show variables like 'character%';
```

```
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```
上記の latin1 という文字コードを UTF-8 にしなければ。

####vimで設定を書き換える

```
$ vi /etc/mysql/mysql.cnf
```
下部に

```
[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
```
これを書き加え、保存してね。


再び

```
mysql> show variables like 'character%';
```
を実行してみると...


```

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

こうなっていればひとまず解決です。
M1 Mac、pod 'FirebaseUI/Storage'やpod 'SDWebImageSwiftUI'でエラーが出るときの対処法

M1 Macでpod 'FirebaseUI/Storage'をPodfileに追加してpod installした時、エラーに遭遇したので対処法を共有します。

#対処法
対処法は単純、多分、ユニバーサルバイナリ使ってIntelアーキテクチャで実行ってこと

```bash
arch -x86_64 pod install
```
何かと便利そうなので、すぐ使えるようにaliasを切っておきます。M1 Macだとデフォルトがzshなのでルートディレクトリの.zshrcを編集、なかったら作成します。

```bash:~/.zshrc
alias intel="arch -x86_64"
```
以下で読み込み。

```bash
source ~/.zshrc
```
こうすれば、これだけでOK。

```bash

intel pod install 
```

お疲れ様でした！
cvxpy install

# cvxpy とは

https://www.cvxpy.org/install/

# cvxpy インストール・環境設定

```shell

$ conda create -n cvxpy python=3.7 anaconda

$ conda activate cvxpy

$ conda install -c conda-forge cvxpy

```

# jupyter table of contents(2)

```shell

$ pip install jupyter_contrib_nbextensions

$ jupyter contrib nbextension install --user

$ jupyter notebook

```

このあと、ブラウザ画面に移動するので、そこで"Nbextensions"をクリックし、「Table of Contents (2)」のチェックを入れる。
Webセキュリティ解説とセキュリティ対策

### 一、Webセキュリティとは
いまの時代、サイバー攻撃はだんだん増えてます。さまざまな被害が出てしまいます。
このような脅威から身を守るための対策を、一般的に「Webセキュリティ」と呼んでいます。
普段、システムを構築する際に、情報が外部へ漏洩しないよう、サイバー攻撃を防ぎ、WebサイトやWebサービスのセキュリティを高めるための対策を目指しています。

### 二、サイバー攻撃の種類について

サイバー攻撃については、いくつかの種類があります。
本記事は主に下記のサイバー攻撃をご紹介いたします。

#### 2.1 SQLインジェクションとは
> データベースと連携したウェブアプリケーションの多くは、利用者からの入力情報を基にSQL文（データベースへの命令文）を組み立てています。ここで、SQL文の組み立て方法に問題がある場合、攻撃によってデータベースの不正利用をまねく可能性があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225740/21cae600-9d7f-cada-412c-0f61c8a53fd1.png)


#### 2.2 XSSとは
> ユーザーの入力内容によって表示が動的に変わる Web ページにおいて、悪意のあるスクリプトが Web サイトに入り込んでしまう脆弱性です。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225740/7a483352-39fc-9864-2576-2a041bc4f6c0.png)


#### 2.3 CSRFとは
> Web アプリケーションが偽装された（本来送信されるべきではない）リクエストを正規のものとして受信してしまう脆弱性、または攻撃手法を意味します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225740/7ae39a0d-1060-ec83-dd0b-40a3a7a1f63a.png)


### 三、Webセキュリティ対策
ここまで、一般的なサイバー攻撃の種類を知りましたが、では、どうやって効果的なWebセキュリティ対策をしますか？
実は、それぞれのサイバー攻撃に対して、Webセキュリティ対策が違います。

#### 3.1 SQLインジェクションの対策

- SQL文の組み立ては全てプレースホルダで実装する。
- ウェブアプリケーションに渡されるパラメータにSQL文を直接指定しない。

#### 3.2 XSSの対策
- 入力値を制限する
- エスケープ処理を行う
- Cookie情報の漏えい対策として、発行するCookieにHttpOnly属性を加え、TRACEメソッドを無効化する。

#### 3.3 CSRFの対策
- トークンを利用して正しいリクエストであるかをチェックする

### 四、最後に
最後まで読んでいただき、ありがとうございます。
Dockerコンテナ化したGitLabのアンイストール方法

次回実施予定のGitLabのバージョン合わせの事前準備として、前回インストールしたGitLabをアンイストールしました。
概出かもしれませんが、今回は備忘録を兼ねて手順を残しておきます。

#GitLabの停止
まずは以下のコマンドからDockerを停止させます。
なお、sudoは省略しています。

```
docker exec -it gitlab gitlab-ctl status
docker exec -it gitlab gitlab-ctl stop
docker exec -it gitlab gitlab-ctl status #全てdownになっていればOK
```

続いてDockerのGitLabプロセスを停止させます。

```
docker ps
docker stop gitlab
docker ps #gitlabのプロセスが表示されなければOK
```

以上でGitLabの停止は完了です。

#GitLabのアンイストール・イメージ削除
続いてGitLabのアンイストールを実施します。
コマンドは以下の通りです。

```
docker ps -a
docker rm -f gitlab
docker ps -a #gitlabのプロセスが表示されなければOK
```

アンイストール実行後、イメージも不要であれば削除します。
コマンドは以下の通りです。

```
docker images #ここでgitlabのIMAGE IDを控える
docker rmi <IMAGE ID> #gitlabのIMAGE IDを指定
docker images #gitlabのイメージが消えていればOK
```

以上でGitLabのアンイストールとイメージ削除も完了しました。

#GitLab関連ディレクトリの削除
最後にGitLab関連のディレクトリを削除します。

```
rm -rf /srv/gitlab/config/
rm -rf /srv/gitlab/data/
rm -rf /srv/gitlab/logs/
※インストール時にGitLabの関連ディレクトリの場所を別の場所に指定した場合は「/srv/gitlab/」を指定していた場所に読み替えてください
```

以上でアンイストール作業は完了です。
上記の流れでアンイストールすれば再インストールも問題なく実行できます。
簡単ですね。
pyenvで任意のPythonバージョンに切り替える方法


タイトル通り、pyenv を使って任意の Python バージョンをインストールし、使いたいランタイムに応じて切り替える方法を紹介します。
環境は Mac です。
本記事執筆時点では AWS SAM が Python 3.9 に対応していなかったので、Python 3.8 をインストールしようと思いまとめます。

Homebrew を用いて pyenv をまずはインストールします。

```
$ brew install pyenv
```

インストールが終わったら pyenv でインストールできる Python バージョンを確認します。
(予め指定したいバージョンがわかっているならば必要ありません）

```
$ pyenv install -l
```

今回は Python 3.8.8 をインストールしたいので、その場合は次のようにターミナルに入力します。

```
$ pyenv install 3.8.8
```

インストールしたら、次のコマンドでデフォルトの Python バージョンを切り替えます。
※もし切り替わらない場合は一回ターミナルを再起動してみましょう。

```
$ pyenv global 3.8.8
$ python --version
  Python 3.8.8
```

これでインストールした Python 3.8.8 に切り替えることができました。

ついでに Python 3.7 系もインストールしておきます。

```
$ pyenv install 3.7.10
```

ここで、複数のバージョンを pyenv でインストールした時の切り替え方を紹介します。
次のコマンドでインストールしたバージョンを確認できます。

```
~ $ pyenv versions
  system
  3.7.10
* 3.8.8 (set by /Users/yourname/.pyenv/version)
```

上記の中でアスタリスクがついているバージョンが、現在使われている Python のバージョンということを表しています。
切り替えるには pyenv global コマンドを使います。

```
$ pyenv global 3.7.10
$ python -V
Python 3.7.10
```

指定したバージョンに切り替わったことを確認できました。
vagrantでdocker-composeが使えるubuntu18.04を立ち上げる

### この記事について
1. macにvagrantでubuntu18.04を立ち上げdocker-composeを使えるようにしました。
背景はdocker-for-macの実行速度が遅かったので、ubuntuでdockerを使痛くなったことです。

2. あくまで個人の備忘録です、参考にされる場合はその点ご留意ください。

### やったこと
#### 1. vertualBoxとvagrantのインストール
 こちら各サイトを参考にしてみてください。
1) VertualBox
https://pc-karuma.net/mac-virtualbox-install/
2) vagrant
https://weblabo.oscasierra.net/install-vagrant-onto-macosx/


#### 2. Vagrantの仮想マシンを立ち上げる

1) Vagrantfileを作成

```
## 任意の実行を作成
$ mkdir vagrant
$ mv vagrant
## 以下のコマンドを実行
$ vagrant init ubntu/bionic64
```

これで実行ディレクトリにVagrantfileが作成される
2)
試しに仮想マシンが立ち上がるか確認する

以下を実行してssh接続できることを確認。できれば仮想マシンが立ち上がっていることになる。


```
$ vagrant up

$ vagrant ssh
```

 dockerが入っていないことを確認してみる(まだコマンドないと言われるはず)


```
bionic$ docker -v
```


終わったらhaltする

```
### 仮想マシンから抜ける
bionic$ exit

### ホストで仮想マシンを止める
$ vagrant halt
```

・docker-composeを使えるようにする
公式のgithubを参考にしました。
https://github.com/leighmcculloch/vagrant-docker-compose

私が実行した手順は以下です。

1) ホストでプラグインをインストール

```
$ vagrant plugin install vagrant-docker-compose

```

2) Vagrantfileに追記

```
  config.vm.prvision :docker
  config.vm.provision :docker_compose
```

3) 追記内容を反映させる

以下のコマンド実行すれば仮想マシンにdocker-composeがインストールされます。
```
$ vagrant provision
```

仮想マシンを立ち上げてdocker-composeがインストールされてるのを確認します。

```
$ vagrant up
$ vagrant ssh
## dockerとdocker-composeが入ってるのを確認
bioic$ docker -v
Docker version xx.xx.x, build xxxxxxx

bionic$ docker-compose -v 
Docker version xx.xx.x, build xxxxxxx
```
でそれぞれversionが表示されればOK！