OmniAICreator/Qiita-1.07M huggingface dataset:
外国人のプログラマーがGoogle AIYを使って猫の自動作成物を作りました！


「現代の人々の豊かさを披露するための最新の方法は - あなたは猫を飼っていますか？」と言う人々もいます。確かに、彗星の治癒係数はある程度、食物を覆い隠しさえしています。 この「弱い」エクスタシーに直面して、人間は喜んで裁判所にお辞儀をします。
![15305103182089a012e070d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/be932e5e-2271-fb74-58b9-2200b6d554b7.jpeg)


自分の飼い主がキッチンで「犯罪を犯す」ことが多いので、海外にコード農家がいるので、グーグルのAIY Vision Kitを使って自分の猫を入れて、自分の賢い小さな頭脳を弾く機会を得ました。 台所から離れてください。

Google AIY Vision Kitの簡単な紹介

Googleのシンプルなコンピュータビジョン製品であるAIY Vision Kitは、Google AIY Projectsの2番目の製品です（最初の製品は、ラズベリーベースの人工知能音声スイートであるVoice Kitです）。
![undefined]()


これはDIYの人工知能スイートで、ユーザーは面白くて面白いAIクリエイティブ（スマートカメラなど）を作成できます。

01 /設定

ビジョンキットはボール紙から組み立てられた小さなカートンです。 主なコアハードウェアには、ラズベリーパイラッシュWH、ビジョンボンネットボード、マイクロSDカード、カメラが含まれます。

構成要素

この小さな紙箱 - 「小さな体、大きなエネルギー」を過小評価しないでください。このカートンは、画像認識およびコンピュータビジョン機能を処理し、何千もの一般的な物体（動物、植物）のオフライン識別をサポートし、顔、表情などを検出できます。 

興味のある開発者は、Google AIYシリーズ開発キット -  Gravitylink Storeのオンラインストアをフォローして学ぶことができます。(https://store.gravitylink.com)

02 /モデル

AIY Vision Kitには、顔検出、表情分析、食品検出など、複数のモデルが付属しています。 ほとんどが画像分類モデルです。Vision Kitには「犬/猫/人間」の物体検出モデルが含まれていることを言及する価値があります。 そして、この弟はちょうどこのモデルを利用しました。

![20181114154018.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/bfba2fc7-2f9f-e5e9-6375-dde5c5a5eeea.gif)
![20181114153908.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/79ca61bd-49dd-2001-bd53-5e10eadd24c0.gif)


トレーニング画像を収集する。

弟は自分の最愛の主人のために何百もの写真を撮りました。実世界（特に台所）での主人公のさまざまな場面、さまざまな照明条件、そしてさまざまな角度の写真を完璧にカバーしています。

2.各画像に手動でマークを付けます。
![1530510318818ae9db0e912.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/70f51b77-9694-8328-6e69-05e1c6154fce.jpeg)


3.トレーニングデータセットを準備する

タグを適切な形式に変換し、タグマップを作成し、画像を大きなトレーニングセットと小さな評価セットに分割します。

4.オブジェクト検出プロファイルに正しいパラメータを設定します。

5. TensorFlow環境を準備します。

6.モデルを訓練して生成します。

7.モデルを修復します。

8. UbuntuのBonnet Compilerを使用してモデルをコンパイルします。

9.コンパイルしたモデルをVision Kitにロードします。

10.コンパイル済みモデルで動作するようにサンプルコードを調整します。

11.奇跡の瞬間を目撃するためにモデルコードを実行してください。

弟のGithubにある特定のコードを見ることもできます。

https://github.com/chadwallacehart/aiy_custom_cat_detector

「長くて曲がりくねった」期間の後、マスターの息子の識別と追跡の「アーティファクト」はついに成功しました！
![153051031913397db427d8a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/78998cfa-c0fd-7938-f2f4-bf243f3b3953.jpeg)


弟がビジョンキットを台所に置き、箱が主人を認識すると、「ビープ音」が鳴ります。 これは猫を追い払うのを助け、それが台所でめちゃくちゃになるのを防ぐでしょう。

しかし、弟は後で久しぶりに、彼のいたずら好きな主人はもはや箱からの「ビープ音」の音を恐れていないことを発見しました.....（笑）
![1530510319059135bd6a147.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/d5fef60b-34a9-be35-b20c-9303d3939cbd.jpeg)


それで、弟がロボットをロボットに接続し、箱に主人を認識させることを計画するとき、ロボットは座標に従って猫に小さなビー玉を発射することができます。

台所から主人を取り除くために、この弟はまた疲れています...読者がそのような問題を抱えているならば、弟の練習を試してください。 弟の幸運を祈り、彼の新しい仕事を楽しみにしましょう。
Ubuntu 16.04　シャットダウンができないとき(非仮想化環境）

#はじめに
ある日、いつものようにubuntuをシャットダウンしようとしたら電源が切れなくなってしまいました。そこで、あれこれ試して直った方法をメモしようと思い記事を書きました。
**尚、今回対象としているマシンは、VM ViutualBoxなどの仮想環境ではないことにご注意ください。**


#シャットダウンできない　
いつまでたってもシャットダウン中の「Ubuntu」と表示された画面から動きませんでした。そこで、ctrl+Rでシャットダウンの進捗を見てみました。
すると...

```
kvm: exiting hardware virtualization...
```
というログを最後に処理が止まっていました。
#実際に行ったこと
仮想化に関係するシステムに問題があるのだろうと思い、
BIOS画面を起動させてIntel VTを無効にしました。

BIOS画面の開き方は、パソコン・マザーボードごとに異なります。
[パソコンメーカー別「PC起動時」に「BIOSを起動させるキー」の一覧メモ](https://freesoft.tvbok.com/tips/peripherals/bios_boot_fn-key_list.html)

再起動して再びシャットダウンすると、今度はすんなりとシャットダウンできました。

##KVMとは
Kernel-based Virtual Machineの略で、Linuxをハイパーバイザーとして機能させる仕組みのことです。
[Linux標準の仮想化技術「KVM」の仕組み](https://www.atmarkit.co.jp/ait/articles/0903/12/news120.html)
##Intel VTとは
インテルが開発した、仮想化ソフトウェアを支援する機能です。
VitualBoxなどの仮想化技術を使用する際、有効にします。
[インテル® バーチャライゼーション・テクノロジー (インテル® VT)](https://www.intel.co.jp/content/www/jp/ja/virtualization/virtualization-technology/intel-virtualization-technology.html)
#参考にしたサイト
 - [Linux情報　仮想化（KVM) -富士通](https://www.fujitsu.com/jp/products/software/os/linux/featurestory/kvm/kvm-page2.html)
 - https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1777674
 -  https://itsfoss.community/t/system-hangs-at-reboot-shutdown/3081/2
Python 標準入力まとめ

#基本的な入力 (1区切りの文字列の入力)
区切りのない連続した文字列の入力。
入力した文字列の型を任意に指定でき、指定しない場合はstr型になる。
以下で二通りの標準入力の仕方を紹介する。

## inputを使う場合
通常はこちらで問題ないです。多くの入力を扱う必要があり少しでも早くしたい方は以下をもう一方を使うほうがいいかもしれません。

```python:input_1.py
a = input()
b = str(input())
c = int(input())
d = float(input())

print(a, type(a)) # 入力:1234 出力:1234 <class 'str'>
print(b, type(b)) # 入力:1234 出力:1234 <class 'str'>
print(c, type(c)) # 入力:1234 出力:1234 <class 'int'>
print(d, type(d)) # 入力:1234 出力:1234.0 <class 'float'>
```

## sys.stdin.readlineを使う場合
input()とほぼ同様に使え、入力数が大きくなるとこちらのほうが有意に早くなる。

```python:readline_1.py
import sys
input = sys.stdin.readline

N = int(input())
A = list(map(int,input().split()))

print(N) # 入力:3 出力:3
print(A) # 入力:1 3 2 出力:[1, 3, 2]
```

その他のpythonの処理速度を早くする工夫併せてこちらを参照ください。
https://www.kumilog.net/entry/python-speed-comp

# 行の配列(横一列の複数の入力)
区切りのある横一列の複数の文字列を任意の型に指定できる。
区切りの入れ方はsplitで指定する。

```python:input_2.py
x, y = map(int, input().split())           # 入力:1 2
a, b = map(int, input().split(','))        # 入力:1, 2
c, d, e = map(str, input().split())        # 入力:1 2 3
A = [int(i) for i in input().split()]      # 入力:1 2 3 4 5 6
B = list(str(i) for i in input().split())  # 入力:1 2 3 4 5 6
C = list(map(int, input().split()))        # 入力:1 2 3 4 5 6

print(x,y)                                 # 1 2
print(a,b)                                 # 1 2
print(c, d, e)                             # 1 2 3
print(A)                                   # [1, 2, 3, 4, 5, 6]
print(B)                                   # [1, 2, 3, 4, 5, 6]
print(C)                                   # [1, 2, 3, 4, 5, 6]
```

# 列の配列(縦一列の複数の入力)
縦一列に入力された文字列を一つのリストで管理する。

```python:input_3.py
X = [int(input()) for i in range(5)]
# 入力: 
# 1
# 2
# 3
# 4
# 5
print(X) # [1, 2, 3, 4, 5]
```

# 二次元配列(縦横複数行の入力)
縦横複数列の入力を列ごとに二次元配列で管理する。

```python:input_3.py
N = int(input()) # 入力: 5
Array = [list(map(str, input().split())) for _ in range(N)]
# 入力:
# -7 -10 U
# 7 -6 U
# -8 7 D
# -3 3 D
# 0 -6 R
print(Array) # [['-7', '-10', 'U'], ['7', '-6', 'U'], ['-8', '7', 'D'], ['-3', '3', 'D'], ['0', '-6', 'R']]
```


#参考記事
https://yokubari-tentan.com/python3-standard-input/
【M5Stack】LCDに表示する文字や図形の色をRGBで指定したい時の変換作業

M5StackでLCDに文字や図形を表示する場合、RGBを指定するのではなく、複数用意されたカラープリセットの中から色を選んで指定するのが一般的です。

こちらのURLからカラープリセットを調べることができます。
https://github.com/m5stack/M5Stack/blob/master/src/utility/ILI9341_Defines.h
ブラック、ネイビー、ダークグリーン、ダークシアン、マルーン、etc....と、全部で17種類の色が用意されていて、それぞれに１６進数が振り分けられています。ただしこの数は１６進数カラーコードとは若干異なるため、イラレなどから１６進数カラーコードを調べて指定しても、エラーが起きてしまいます。

プリセットの色ではない色をRGB値で指定したい時には、その変換が若干面倒なので、この記事ではひとまず、指定したいRGB値から、M5Stack用の１６進数に変換する手順を説明したいと思います。
まずは、M5Stackでカラーを決めるために用いられている、RGB565というフォーマットについて説明します。

#RGB565とは？
RGB値を、１６ビットで指定する方法です。
１６ビットのうち、R値を5ビット、G値を6ビット、B値を5ビットで指定します。
２進数で表現すると、左から５ビットがR値、中央の６ビットがG値、残りの５ビットがB値になります。M5Stackでは、これを１６進数で表したものを用いて色を指定しています。
![変換チャート2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412023/dda4daa1-08f5-6271-7858-66390cb98ffc.png)

僕はこの、色によってビット数が異なるというのを理解するのになかなか手こずりました。
続いて、M5Stackコーディングに必要な実際の変換手順を説明します。

#ステップ1: 指定したいRGB値をマッピング
まずは、指定したいRGB値を0〜255で指定します。今回は例として、(R,G,B)=(127,254,26)とします。
ただしRGB565では、RとBは５ビット、つまり３２段階でしか分割できず、Gは６ビット、つまり６４段階でしか分割できません。
そのため、RGB値を0〜255から、それぞれのビット数に合わせてマッピングをしてあげます。

まずはR値から。R値は５ビットで表現することになるので、0〜255の範囲を0〜31の範囲に変換する必要があります。
よってR値は、(127*31)/255=15.43...となり、切り捨てして15とします。

G値は6ビットで表現することになるので、0〜255の範囲を0〜63の範囲に変換します。計算式は(30*63)/255=62.75...から、63とします。

B値もR値と同様に計算して、(26*31)/255=3.16...から、3とします。
以上から、RGB565でのRGB値は、(15,63,3)となります。

#ステップ2: １０進数から２進数に変換
続いて、先ほど求めた(15,63,3)を２進数に変換し、15→1111, 63→111111, 3→11 とします。
なおこういった計算の際、自動で変換するサイトを使うと便利です。（このサイトなど https://hogehoge.tk/tool/number.html ）

そしてこれらをR,G,Bの順に、5,6,5ビットで並べます。そこで、R値1111は01111,G値は111111のまま、B値は00011として、01111 111111 00011→0111111111100011となります。

#ステップ3: ２進数から16進数に変換
ラストです。この求めた２進数の値を１６進数に変換します。
先ほど紹介したサイトなどを使って変換すると、7FE3と変換されます。これが、M5Stackの色指定に用いる値となります！
ここまでの流れを図にすると以下のようになります。
![変換チャート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412023/a2ee502a-1769-240e-0729-e2ec9cabb04e.png)


#実際に書き込んでみる
実際に色を比較してみましょう。
RGB=(127,254,26)は、イラストレーターで見てみるとこんな感じの色です。
<img width="907" alt="スクリーンショット 2019-07-05 13.44.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412023/b723aa60-0d02-5fc6-4159-16896fdca570.png">


M5stackに、色指定をするプログラムを描いてみます。

```fillscreen.cpp
#include <Arduino.h>
#include <M5Stack.h>

void setup() {
  M5.begin();
  M5.lcd.fillScreen(0x7FE3);
}

void loop() {
}
```
ここで、7FE3の前に0xをつけるようにして下さい。これは、16進数であるということを示すものであり、これがないとエラーが起きてしまいます。

![IMG_7562.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412023/463d4cec-3d13-5de3-eaac-10c1d9933359.jpeg)

無事に光りました！
マッピングの際に値を切り捨て、切り上げをするために、指定したい色と若干色味が異なることはありますが、基本的には同じような色を表示できます。
EC-CUBE4 商品CSV登録で送料が反映されなかったのをどうにかする

EC-CUBEのVerは```4.0.2```です。

何度やっても入らない！
SymfonyのProfilerみたらTranslationでWARNINGが…

![missing.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1236/0604d7b0-c5c3-aea2-fb4c-3e638a1d73b3.jpeg)

中を調べてみると

```php:eccube4/src/Eccube/Controller/Admin/Product/CsvImportController.php
$headerByKey['delivery_fee'] = trans('csvimport.label.delivery_fee');
```
登録されてないからMissing
なの下記の通りにで入れてみる

```php:eccube4/src/Eccube/Resource/locale/messages.ja.yaml
csvimport.label.delivery_fee: 送料
```

やった、商品に送料が入った〜〜
なんで登録されてないんだろうか…



##追記（2019/07/05 16:30）
1ヶ月前に修正あった模様
https://github.com/EC-CUBE/ec-cube/releases/tag/co%2F20190613

ZIPでDLして展開したから、まだそこには入ってなかったってことだったっぽ。
とりあえず、Githubにある該当ソースまるっこローカルにコピペして入れたらちゃんと送料入った。
ビンゴ

乱数を使うことがあったので暇つぶしにビンゴマシーンを作ってみました。



```py
import tkinter as tk
import numpy as np
import bisect

bingo = list(range(1,76))
gets = []

def bingoo():
        get = np.random.choice(bingo)
        bisect.insort_left(gets,get)
        s= "最新番号： {0} ".format(get)
        labelResult['text'] = s
        m = "今までの数 {0} ".format(gets)
        labelLesult['text'] = m
        bingo.remove(get)
        if len(bingo) ==0:
            s = "終了"
            labelResult['text'] = s
     
win = tk.Tk()
win.title("ビンゴ")
win.geometry("500x250")
labelResult = tk.Label(win, text=u'---',font=("",50))
labelResult.pack()
labelLesult = tk.Label(win, text=u'---')
labelLesult.pack()
calcButton = tk.Button(win, text=u'次の数は・・・')
calcButton["command"] = bingoo
calcButton.pack()
win.mainloop()
```
Property or method "xxx" is not defined on the instance と出た時の対処法

表題の通りですが、問題の内容によっては切り分けが難しいと思われるため書いておきます。

# 問題点

以下のような警告が表示されます。

```console:console
Property or method "hogeText" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property.
```

# 原因

原因は私が遭遇した限りで3つほど。

- 本当に宣言を忘れている
- Vue.jsのscriptの範囲外に宣言している
- **Vue.jsのCDNが2回呼ばれている**

特に最後のが、ワーニングからの特定が難しいので参考にして頂ければと。
以上です
【AWS】Amazon EBS (インスタンスストア) ボリュームの初期化  dd とfio のどちらが速いか検証してみた。

# インスタンスストア初期化の２パターンのどちらが早いのか検証してみた

前回の記事　：　[【AWS】EC2のインスタンスストアの初期構築　マウントして使えるようにするまでを整理する](https://qiita.com/mimimi-no-sesese/items/2d31013e03ae3b5f5628)

## はじめに

インスタンスストアは最初のファイルシステムへのアクセスは遅く、
一度初期化するのが推奨されています。
以前は公式は dd のみの記載だった記憶がありますが、 fioっていう記載が増えており、
社内でそっちらのほうが早いという噂を聞いたので検証してみます。
 （※EBSは最近では事前ウォーミングしなくてよくなったようです）

[AWS公式 EBSボリュームの初期化] (https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-initialize.html)


## dd での速度計測

```console

$ time sudo dd if=/dev/nvme1n1 of=/dev/null bs=1M
47683+1 レコード入力
47683+1 レコード出力
50000000000 バイト (50 GB) コピーされました、 539.372 秒、 92.7 MB/秒

real    8m59.380s
user    0m0.043s
sys     0m10.189s
$

```

## ddでの計測結果

結果：9分
50Gなんでこんなもんかな。


## fioでの速度計測

続きまして、fioでの速度計測。
早いと聞いたのでどこまでか....


```console

$ time sudo fio --filename=/dev/nvme1n1 --rw=read --bs=128k --io
depth=32 --ioengine=libaio --direct=1 --name=volume-initialize
volume-initialize: (g=0): rw=read, bs=128K-128K/128K-128K/128K-128K, ioengine=libaio, iodepth=32
fio-2.14
Starting 1 process
Jobs: 1 (f=1): [R(1)] [100.0% done] [90112KB/0KB/0KB /s] [704/0/0 iops] [eta 00m:00s]

(略)

real    8m59.883s
user    0m1.093s
sys     0m2.799s
$

```

## fioでの計測結果

結果：約9分

（ ﾟдﾟ ） > ... あれ？ 時間一緒やった。


ためしにブロックサイズを1Mにしてみる。
` 貼りもしませんが、結果は変わりませんでした！` 



## 結論
ddつかってもfioつかっても一緒だった。
まあ、全体のボリュームサイズは一緒だし、やっていることも初期化ということで
納得の結果といったらそうだったんですが、、、
ちょっと期待していたのになーって感じでした w 

ちなみに、個人的にはできることなら `fioの方` をおすすめします。
理由は 下のように画面にでてくるのですが、進捗率と残り時間をリアルタイムで表示してくれます。
それがすごくわかりやすいです。


![スクリーンショット 2019-07-05 13.18.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/9eb822a8-41b5-306b-be15-18021c1da3aa.png)


また完了後の情報も多いです。



dd も` sudo pkill -USR1 dd ` を使えばわかるんですが、別ターミナル立ち上げるし、なんか
pkillとかよくわからんコマンド使っているし、少し勇気が必要ですw


ということでddとfioの検証でした。


すこしそれますが、今回検証でc5d.largeインスタンスを使ったんですが、、、
startしてからsshアクセスできるまでの時間がすごく早く感じました。


ということで、
良い AWS　ライフを　！

以上
小さな工場ができるIoT、既存設備の利用と少ない購入で見える化を実現する(前編)

#背景
私が昔勤めていた会社は山奥にある小さな工場でした
その工場でIoT化設備を内製し、直ぐに結果を出して業務改善を図ったときのノウハウを書こうと思います

内容としまして、
>1、目標
>2、電子回路設計
>3、ソフトウェア設計
>4、設置とその効果

の4本立てで進みます

本当に直ぐに効果が出るかは保証しませんが、何か一つやってみて動いたものを見ると別のアイディアが浮かぶかもしれません。

特に上の管理職の方は社員が楽ができる方向に考えていただけると幸いです

#1,目標
少ない社員数で沢山の設備を抱え日夜生産している工場を想定します
常に社員が機械に張り付いて確認する回数を減らし、生産数のカウントとアラームを表示するシステムを考えます

![図面1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404394/ff3ca01c-538e-bb7e-4142-94ff83b59a89.png)
図１、システム案


生産設備は一定サイクルで吐き出される成形機を想定します
古い成形機や生産設備を使用しており、最新機種のようなネットワーク機能がない機械をIoT化させます。

各機械の生産数とアラームは１台の既存のPCで集計し表示します。
開発ソフトも多くの企業で利用されているExcelのVBAを利用します。

#2,電子回路設計
##2-1,どうやって機械の動きを見るか？
案として二つ方法があります。

１、パトライトにセンサーをつけて状況を確認する
２、機械の出力リレーの接点を入力として確認する

この二つのメリットデメリットを以下の表にまとめます。

|   | メリット | デメリット |
|:---:|:---|:---|
|１案　|取付けが簡単、仕組みが単純|パトライトの3色の動き以外はわからない|
|２案|出力リレーの数だけセンサーをつければ、機械の詳しい状況がわかる|電気配線が煩雑|

特に１の場合はすでに製品化して販売されているものがあります。
あくまで私見ですが、１の方法は製品として買うと既に感度が調整済みだったりして直ぐ動きますが、センサーを自作して自分で調整するとなるとかなり時間がかかります。
トリガーとなるリレー１個に配線するのとセンサーの調整時間を考えると配線するほうが早いと私は感じました。

なので今回は２案で進めます。

もちろんですが、これ以外も方法があったりするのでいろんなアイディアでやってみましょう。
##2-2,どうやってそれぞれの機械の情報を集めるか？
大事なことは、接点やセンサーがONやOFFになったらそれを発信することです。

いくつか方法はありますが、ここも方法を二つ提案します。

１、PCを各機械において社内LANなど用いて情報展開する
２、小型の無線ボードを利用して情報展開する

この二つのメリット・デメリットを下記の表にまとめます。

| | メリット | デメリット |
|:-:|:---|:---|
| １案  |既存のネットワークを利用できる|PCの用意にコストがかかる、この後のソフト作成が大変|
| ２案  |仕組みが単純、部品点数少なくコストが低い|無線が届くように配慮が必要|

そもそも機械の台数分PCを用意するのにお金がかかり、その台数の分だけ電気代がかかるため１案はあまり現実的ではないかもしれません。
なので２案を採用します。

使用する無線ボードは[秋月電子などで安く手に入るDigi社のxbee](http://akizukidenshi.com/catalog/c/cxbee/ "秋月電子")を用います
使用方法などに関してはここでは触れないため、ご了承ください
##2-3,仕様と回路図
機械の取り付ける発信側と画面表示する受信側の２つを用意します

発信側は成形機の24V電源から給電し、機械の出力リレーの接点をフォトカプラを持ちいて取得します。
xbeeのAPI機能を用いて接点がONやOFFに切り替わったときに信号を投げる仕様にします。

受信側はPCとシリアル接続で通信し、受信したデータをPCに送ります。
以下が回路図です。
![図面2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404394/7780df07-7282-b7e7-773f-9dd72ba5d4b2.png)
図２、回路図

かなり大雑把に書いたので細かところは各自必要に応じて修正してください。
発信側のTLP(フォトカプラ)の先についている抵抗値はTLPのLED側のIF値と定格電圧から求めてください。

次回、ソフトウェア開発
A5:SQL Mk-2（A5SQL）のポータブルモードの場合でのアップデート方法

## はじめに
A5:SQLで、古いバージョンだとSQLの実行計画でactual_timeが見れなかったので、バージョンアップした際に
自分がポータブルモードで初回インストールしていたので、設定がうまく引き継がれなかった。
そこで調べたときのメモです。

## 内容

参考に上げている[リンク先](https://qiita.com/C_HERO/items/54d56680b607b21d5263)でアップデートしよーと思って、アップデートしたら・・・
「設定が引き継がれない・・・」ってなったので、[参考リンク先](https://qiita.com/C_HERO/items/54d56680b607b21d5263)プラス以下のことをやりました。

```
1. 事前に旧バージョンでインストールされていた「Portableフォルダ」をどこかにとっておく。

2. 参考リンク先の手順で新バージョンのインストール

3. インストールしてきたzip展開し、適当にフォルダ作る

4. その中にとっておいた「Portableフォルダ」を、3で作成したフォルダに置く
```

上記のことをやれば、旧バージョンで使用していた設定を引き継げます。

これでやっと、SQLの実行計画でactual_timeが見れる！

## 参考
- https://qiita.com/C_HERO/items/54d56680b607b21d5263
- https://a5m2.mmatsubara.com/wp/?topic=%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%9B%B4%E6%96%B0%E3%81%AE%E3%81%A8%E3%81%8D%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%82%92%E5%BC%95%E3%81%8D%E7%B6%99%E3%81%8E%E3%81%9F%E3%81%84
「ホクホクのイモ」を考察する

元記事 https://qiita.com/mattn/items/d447a43ad12fada71663

自分がよく使ってる言語はコードゴルフにも難解プログラミングにも向いてないので、そっちで攻めるのではない記事にします。

# 仕様の考察

分解すると、まあこんな感じかと。

1. 「ホクイモ」の4字から、ランダムに、かつ重複せずに2文字取り出す。取り出す順番は考慮する。 (例："モホ")
2. 1. で取り出した文字を2回繰り返す。（例：「モホモホ」）
3. 1. と同じ処理をもう一度やりなおす。その際、さっき何を取り出したかは影響しない。（例："クモ"）
4. 2. と 3. の文字を「の」でつなぐ。（例：「モホモホのクモ」）

# アルゴリズムの考察

「指定されたn字の中から、ランダムに、かつ重複せずにm文字取り出す。取り出す順番は考慮する。」のところが肝です。

* n字を順序付きコレクションに入れておいて、そのインデックスをm個ランダムに生成する。ただし、一度使ったインデックスはもう使えないようにする方法が必要（ビットパターンやブール値配列をフラグとして使うとか、集合に入れておくとかして、生成された数字が既出だったら再生成するなど）。
   * nに対してmが大きければ大きいほど、既出のインデックスが生成される確率が高くなるので、延々とループし続ける羽目になる。
* n字をコレクションに入れておいて、その要素をランダムに1つ選ぶ。そして、その要素（文字）をコレクションから取り除いて1字分小さくする。これをm回繰り返す。
   * コレクションのデータ構造によっては、コレクションから1字取り除くコストがそれなりにかかる。
* 最初にn字からm文字取り出す順列（permutation）をすべて並べあげて、その中からランダムに1つ選ぶ。
   * 順列をすべて並べ挙げた時の数は P(n, m) = n * (n-1) * ... * (n-m+1) = n! / (n-m)! になる。
   * バリエーションとして、0以上n未満の数で順列を作って、それを文字に対応付ける（順序付きコレクションのインデックスとして扱うなど）のもあり。
* n字を順序付きコレクションに入れておいて、最初にランダムシャッフルする。その後先頭からm文字取り出す。
   * 配列に入れておいて、配列のインデックス i を増やしながら、0以上i以下の数からランダムにjを選んで、要素iと要素jでシャッフルする。
      * 元の配列の要素を入れ替えて破壊的にシャッフルする方法と、新しい配列を初期化しながらシャッフルする方法がある。
   * ランダムな数列を長さnで作っておいて、その値をキーにしてコレクションをソートする。
   * リストをマージソートする際の比較をランダムにする。ただし、マージ元のリストの長さに比例して重みづけし、長い方のリストから選ばれやすくする。

このどれか（とはいえ最初のはやめた方がいい）の機構を提供する言語標準のライブラリーがあれば、短く書けて、なんかつよい感じがするのだけど、そういうのがない言語もあるわけですね。その場合はちょっとため息をつきつつ、自分で実装しましょう。

計算量については割愛しましたが、もし万が一コーディング面接で「ホクホクのイモ」が問われた時には、上のいくつか（全部とは言わないので、1つより多く）のアルゴリズムについて、計算量をきちんと見積もれれば、まあとりあえずその問題についてはOKなんじゃないでしょうか。
ホクホクの芋を簡単に作りたかった

@mattn さんの [ホクホクのイモ](https://qiita.com/mattn/items/d447a43ad12fada71663) という記事を読んで、もっと簡単にホクホクの芋が食べられたらなと思った。

# ホクホクのイモとは？

こちらの記事がとても分かりやすかったです。
https://qiita.com/matarillo/items/0876311a901e313c36e8

1. 「ホクイモ」の4字から、ランダムに、かつ重複せずに2文字取り出す。取り出す順番は考慮する。 (例："モホ")
2. で取り出した文字を2回繰り返す。（例：「モホモホ」）
3. と同じ処理をもう一度やりなおす。その際、さっき何を取り出したかは影響しない。（例："クモ"）
4. 2. と 3. の文字を「の」でつなぐ。（例：「モホモホのクモ」）

## golang版

```golang
package main

import (
	"fmt"
	"math/rand"
	"strings"
	"time"
)

func main() {
	rand.Seed(time.Now().UnixNano())
	rs := []rune("ホイクモ")
	hoku := func(j []int) string {
		return string(rs[j[0]]) + string(rs[j[1]])
	}
	fmt.Printf("%sの%s", strings.Repeat(hoku(rand.Perm(4)[:2]), 2), hoku(rand.Perm(4)[:2]))
}
```

~~javascript版は打ち合わせしながら考える・・・~~

## JS版

node.jsを使用しました

```javascript
let hokuimo = "ホクイモ".split("")

let r = (max) => Math.floor(Math.random() * (max))
let f = (arr, rv) => {
  return arr.length > 2 ? arr[rv] + f(arr.filter((v, i) => i != rv), r(arr.length -1)) : ""
}

console.log(`${f(hokuimo, r(hokuimo.length)).repeat(2)}の${f(hokuimo, r(hokuimo.length))}`)
```

@tkturbo さんのコメントを見てJSでワンライナーできないかなと思ってこんな感じにしてみました。

```javascript

((h = (s = "ホクイモ", n = true, r = Math.floor(Math.random() * s.length), t1 = s.substr(r, 1)) => n ? (rp = 2) => (t1 + h(s.replace(t1, ""), false)).repeat(rp) : t1) => console.log(`${h()()}の${h()(1)}`))()

```

基本の処理はコメントの内容ですが、ワンライナーで処理できるように所々工夫しています。

---

もっと簡単な書き方があったら教えてください・・・
~~~ホクホクのイモに関する定義から外れてしまっている部分があったので投稿し直します。。。~~~

### 2019/7/8 追記

jsのロジックに誤りがあったので修正しました・・・
> かつ重複せずに2文字取り出す
RubyMineでctrl+dで前方消去をしたいときのkeymapの設定

## はじめに
けっこうググったのに中々出てこなかったので記事に。

## やりたいこと
RubyMineでカーソルの前方方向を消去するショートカットをCtrl+dにしたい。

## 設定の仕方

おいおいまじかよと思ったんですが、なんと前方消去って**Delete**に設定されているらしいです。普通Deleteってカーソルの左側を消すやつじゃないの？よくわからんすね。。。
なので、Keymapから`Delete`のキーバインディングを`Ctrl+d`にすれば解決。

## 参考文献
[IntelliJ Forward Delete Mac
](https://stackoverflow.com/questions/20981788/intellij-forward-delete-mac)
組み込み系開発現場における開発環境まとめ

# 背景
筆者は組み込み系の開発に3年間携わってきましたが、Qiitaに組み込み系開発の記事が少ないと感じました。
Web系の開発であれば言語+フレームワーク等学ばなければならないツールや環境が明確に記載されています。
しかし、組み込み系は開発案件によってOS、統合開発環境、通信プロトコルは様々です。(主に使用するハードのCPUに依存することが多い)
そこで私が3年間で関わった案件の開発環境をここにまとめることで、これから組み込み系エンジニアを目指す方の勉強する目的や目安になればいいな思います。

# 組み込み系の開発って?
組み込みシステムについてWikipediaでは下記のように定義されています。
> 組み込みシステム（くみこみシステム、英: Embedded system）とは、特定の機能を実現するために家電製品や機械等に組み込まれるコンピュータシステムのこと。

これだけだといまいちイメージが付きにくいと思いますので、私の関わってきた主な開発現場を紹介することで、組み込み系開発って何を開発するの?という疑問にお答えできればと思います。
・L2スイッチ開発
・メディアゲートウェイ開発
・列車用無線機開発
・クレジット決済端末開発

他にもありますが、イメージしやすい物だと上記になります。

# 開発言語
開発を補助したり、テストを行うツール以外は全てC言語とC++で開発を行いました。

- C言語
- C++
- Lua(Linux内でプロセスを立ち上げるときに各種設定を行うスクリプトとして)
- Python(テストツール)
- C#(GUIで動くテストツール)

# OS
ネットワークスイッチ関連ではLinux、組み込み機器開発ではiTRONが多かったイメージです。
- Linux
　- MontaVista
　- Wind River
　- NetBSD
　- CentOS
- iTRON
- Windows(作業用)

# 統合開発環境
使用するマシンのCPUに合わせてチョイスしている感じです。
ネットワーク機器開発では開発用のサーバを用意して、その中でViでコードを書いてコンパイルすることが多いです。
- HEW
- IAR

# プロトコル
ネットワーク機器開発では知識として必要とされるプロトコルは多いです。
- TCP/IP
- UDP
- LAG
- VLAN
- EoE
- リングプロトコル
- TIPC
- CORBA

# まとめ
組み込み系の開発はネットワーク、OS(メモリ管理、プロセス制御)、プログラミング言語、簡単なハードウェアの知識等、新しくはなく古い知識ですが幅広い知識を要求されます。
もしこれから組み込み系エンジニアになりたいという方の手助けができれば幸いです。

# 追記
https://kosuke-rb.hateblo.jp/entry/2019/10/07/154126
こちらにテスト環境についての情報と、各環境における詳細説明を記載した物を作りましたので、ご興味がある方はどうぞ。
探索を高効率にするSurrogate-Modelとはなんなのか

# はじめに
個人的に**Data-efficient Neuroevolution with Kernel-based Surrogate models**[^1]を読んで，「Surrogateって便利かもしれないな」って思ったのでまとめます．

# About Surrogate Model
Surrogateは「代理」や「代わりのもの」という意味です．
一般にSurrogate Modelと言った場合には，代理モデルとして，多様な意味合いがあります．

しかし，本記事中でのSurrogate-Modelは**Surrogate-Assisted**などと呼ばれる，探索を補助する手法のことを指します．

これは簡単に言えば，評価値を予測する手法になります．

通常，解を探索する場合には解を評価関数(目的関数)に入力することで，評価値を得ます．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219048/061856ce-aeaa-623f-3e7f-6840930c58bc.jpeg" width=50%>

しかし，評価関数が高速ではない場合はあります．
たとえば物理シミュレータや，ゲームエミュレータなどによってシミュレータティングしたときの結果を評価値としたときです．
このときの評価関数は，実際にシミュレータを動作する必要がありますが，シミュレータは高速に動作することができない場合が多いです(特に，学習や最適化用のシミュレータではない場合には，高速動作をサポートしていない場合があります)．

このときに，何万回・何百万回と探索を進めたい場合には，評価関数自体の速度が遅いために実時間では，最適化することが困難です．

そこで，登場するのがSurrogate-Modelです．評価関数をほかの手法で近似するのです．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219048/7a664de4-f41b-dae6-750e-d65422b4c891.jpeg" width=50%>

実際，文献[^1]ではBayesian Optimizationによって評価関数を近似することで，評価関数を通さずに評価値を得ることに成功しています．
この手法では，探索と同時に評価関数を近似することで，探索効率が上がることを示しています．

# 注意点
Surrogate-Modelはたしかに面白い手法ですが，適用しようと思った場合には注意点があります．

一つ目は，「評価関数を近似するためには，その評価関数を探索しなければいけない」ということです．
このときの学習データは，解そのものになることに注意しなければいけません．
解が大きすぎる場合には，情報過多によって評価関数の近似ができない場合があります．
当然，評価関数の近似ができない場合には，Surrogateできないので，注意しましょう

二つ目は，評価関数を近似する学習にも時間がかかるということです．
文献[^1]の場合は解探索と同時に評価関数の近似学習も行っていますが，当然，近似学習の時間が発生しています．評価関数の速度自体が遅くない場合には，通常の学習を行ったほうがよいでしょう．


# Neuroevolution with Kernel-based Surrogate models
文献[^1]ではNeuroevolution(この場合はNEAT)でSurrogate-Modelを行っています．
多くの探索点をもつ進化計算は非常にSurrogate-Modelと相性がいいのでしょう．
特に，最近Hotな進化計算+多目的最適化の分野では光るのかもしれません．
その場合には，下のようなモデルになります．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219048/a160fbc3-2b21-45c6-eb43-8b76d98e4717.jpeg" width=50%>
高度なシミュレータを通す場合には非常に高速に探索できるようになると思います．
今後光ってくる手法でしょう．

また，遺伝子型とよばれる固定長のデータで表現される点も，Surrogate-Modelと相性がいいのでしょう．やはり，不定形のものを学習することは非常に困難です．さらに，文献[^1]ではBayesian OptimizationをSurrogate-Modelとして使っていましたが，他の機械学習モデルをしようしてもいいと思います．
ただ，最適化と同時に関数近似をするという点ではBayesian Optimizationの少数サンプルの利点が効いてくるのかもしれません．

# おわりに
半自分用にSurrogate-Modelについてまとめました．
そのうち実際に使ってみた例を挙げたいと思います．



[^1]: Gaier, Adam, Alexander Asteroth, and Jean-Baptiste Mouret. "Data-efficient neuroevolution with kernel-based surrogate models." Proceedings of the Genetic and Evolutionary Computation Conference. ACM, 2018.
#ruby で Date = 日付を足し算、引き算して差分の日数を得る

例

```rb
(Date.new(2019, 10, 01) - Date.new(2019, 07, 01)).to_i
# => 92
```

くわしく

```rb

Date.new(2019, 10, 01) - Date.new(2019, 07, 01)
# => (92/1)
# 何これ

(Date.new(2019, 10, 01) - Date.new(2019, 07, 01)).class
# => Rational
# Rational というクラスのインスタンスらしい

(Date.new(2019, 10, 01) - Date.new(2019, 07, 01)).to_i
# => 92
# to_i すると差分の日付が得られる
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2244








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
「勉強する方法」

システム系の職に就く限り逃れられないのが勉強。
私は勉強が苦手である。
けれども、一応資格は持っている（簡単な部類だが）
そんな私が勉強する方法を模索した結果をこのコラムで連携したいと思う。

そして、このコラムを読んだ方が一人でも「そうだ、資格取ろう！」と思ってくだされば幸いである。
もちろん自分も含め。

目次
①このコラムを書こうと思ったきっかけ
②なぜ勉強が必要なのか？
③なぜ勉強できないのか？
④勉強方法と結果
⑤結論

①このコラムを書こうと思ったきっかけ
私は新入社員のころ、当時所属していた会社ではITパスポート、基本情報はほぼ義務で研修期間中に勉強し取った。
OracleのBronzeも当時の上司から勧められて取った。

なので今の会社にきて驚いた。みながみな資格を持っているわけではないのだと。
むしろ資格を持っている人のほうが少数だ。

もちろん日々の業務の勉強は大事だけれども、資格も大事だと私は考える。
客先へのやる気のアピールにもなるし、褒章も出る。
ステップアップしている感覚があり、自分のモチベーションもあがる。
いいことずくめだ。

なので、勉強する方法を考えるきっかけになればと思い今回のコラムを綴ることとする。

②なぜ勉強が必要なのか？
言語知識、業務知識、お客様とのやりとりの知識。
この業界は勉強することが山ほどある。（もちろん他業種もだろうが）

子供のころは、なぜ勉強が必要なのかずっと疑問だった。
大人になっても使わないでしょ？と。
今ならわかる。使わないから勉強が必要ないわけではない。
勉強する習慣とそれによって身につく記憶力が大事なのだ。
子供のころ勉強する習慣がないと大人になって苦労する。

③なぜ勉強できないのか？
・集中力が落ちている
子供のころはいくらでもゲームできたのに、今は1時間くらいで満足する。
今もいくらでもできる人はきっと勉強もできる。

・心の底では「今で大丈夫だろう」とたかをくくっている
強敵である。自分を追い込む必要がある。
勉強せざるを得ない状況をつくる。（人に宣言する、カフェで時間を作るなど）

・時間がない
ある意味仕方ない･･･睡眠時間は削らないこと。普段の集中まで落ちてしまう。
移動時間をうまく使うといいかもしれない。
快速を各停に変えると人も少なくて快適である。

④勉強方法と結果
次に、私が試した勉強方法と結果を羅列する。
長くなるので、はかどったものの項目に★をつけているのでそれだけ読み飛ばしてくれればいい。

★カフェ
場所を切り替えることにより勉強スイッチをつける。
お勧めはミスド。ホットコーヒー、カフェオレがおかわり自由である。
席の硬さもほどよい。
ふわふわのソファー席など落ち着きすぎると集中が落ちる。

★時間を決める（タイマーをつける）
時間を決めて集中する。
なお、時間は無理をしない範囲から始める。30分や1時間など。

★携帯の電源をオフ
これが一番効くかもしれない。携帯は誘惑の塊である。

★1日の量を決める
今日はテキストの○章まで、など。
これも少なめの目標にする。気分が乗る日は目標より進み、その分達成感もある。

★音楽を聴く
歌詞のあるものはついつい歌いたくなるのでお勧めしない。
普段携帯で音楽を聞いている人は音楽プレイヤーを買うかPCで聞く。
動画サイトなどで「集中力　BGM」で検索したりしてお気に入りを探すと良い。
個人的にはゲームの戦闘曲集をよく聴く。

★温度を適正に保つ
暑かったり寒かったりすると集中がとぎれる。
服で調整。

★集中できる服装にする
人によって集中できる服装は違うので、スーツ、ジャージ、Tシャツなど
自分に合う格好をする。

・テレビを見ながら
当然ながらはかどらない。

・友人と
ついつい話し込んでしまう。

・家で勉強
誘惑が多い。

・マクドで勉強
騒がしく集中できない。
席の間隔が狭く、落ち着かない。

・図書館
静か過ぎて眠くなる。
大阪の図書館は人気で席取り合戦。
よって狭い。
田舎の図書館ならはかどるかもしれない。

⑤結論
長々と書いたが、それぞれに合った勉強法を見つけてがんがんスキルアップしていってほしい。
周りが資格を取ったり勉強を始めると、自分もやらないと！と言う気持ちになり相乗効果となる。

もし勉強のいいアイデアがあれば私に連携してほしい。メールでもラインでもスラックでもいい。読んだよ、とか一言でもいい。反応があれば嬉しい。

そして、冒頭でも書いたが、これをきっかけに勉強する気持ちになってもらえれば幸いである。

以上。長々とごらんくださりありがとうございました。
Macのスクリーンショットについての小技

WFや仕様書などのドキュメント作成において、スクショを撮って貼り付けることはよくあると思いますが、
スクショに撮り方わからんって人がいたので、書いておきました。
特にアプリケーションを落とさず大体のことはできるので、覚えておいて損はないでしょう。

# Mac
|キー| 内容 |
|:--|:--|:--|
| ⌘ + shift + 4 | 範囲指定のスクリーンショット|
| ⌘ + shift + control + 4 | 範囲指定のスクリーンショットをクリップボードにコピー|
| ⌘ + shift + 4 + space | アプリケーションウィンドウ単位でのスクリーンショット |
| ⌘ + shift + control + 4 + space | アプリケーションウィンドウ単位でのスクリーンショットをクリップボードにコピー |
| ⌘ + shift + 3 | 全画面 |
| ⌘ + shift + control + 3 | 全画面スクショをクリップボードにコピー |

## 範囲指定後の小技
⌘ + shift + 4 でドラッグしながら範囲を指定している状態で特定のキーを押しながら選択範囲を　少し小技が使えます。

|キー| 内容 | 効果 |
|:--|:--|:--|
| space | 範囲指定のスクリーンショット| 選択範囲を固定しながら位置を調整できる |
| shift | 範囲指定のスクリーンショット| 縦幅 or 横幅を固定して範囲の調整ができる |
| alt(option) | 範囲指定のスクリーンショット| 中心位置を固定して範囲の調整ができる |
shift + spaceなど組み合わせもできました。他にも何かあるかもしれないので試してみてください。


## 保存
デフォルトはpngでデスクトップに保存されるようになっているかと思います。
それだとサイズはでかいわデスクトップが散らかるわで大変なので、設定を変えました。

### ファイルの保存形式の変更
ターミナルで下記のコマンドを叩くだけです。

```
$ defaults write com.apple.screencapture type jpg
```
とりあえず軽くしたかったんでjpgにしましたが、pdfとかでもいけるっぽいですね。

### ファイルの保存場所の変更
上記と同様に任意の場所を指定してコマンドを叩くだけです。

```
$ defaults write com.apple.screencapture location ~/Documents/ScreenShots
```
これで整理整頓が少し楽になりますね。

##その他
####iOSのシミュレータでスクショを撮りたい時
- ⌘ + s

#### 画面での操作を動画にしたい時
- スクリーンショット.appを使う（アプリケーションのユーティリティの中にあります。） 
    - グラブっていうアプリがあったと思ったんですが、気づいたらスクリーンショットっていうのに代わって（？）ましたね。


以上、久々にドキュメントを作りましたが、ホント大変ですね。
どうぞ素敵なドキュメントライフを。
今日やったこと！①

初めてのphp学習でした！今まで自分でpythonを学んでいて、考え方は同じだけど新しい書き方に慣れるのが大変でした。。。

本日は、主にprogateを使ってphpの基本を学びました。その中でも特に理解しづらかったことは以下です。

```php
<?php foreach($menus as $menu): ?>
  <h3><?php echo $menu->name ?></h3>
<?php endforeach ?>
```

foreachです。

この部分では、htmlにphpを入れています。
この部分の何が理解できていないかというと、そもそもforeachの使い方がよくわかっていません。

私は、「```$menus```という配列の１つ１つの要素を取り出して、```$menu```に代入している。」と解釈しました。
これがあっているにせよあっていないにせよ、foreachを使うことによって今後どんなことができるのだろうか、、、。

また、復習として森川さんに教えてもらったこと

```html
<tr>
  <th>gmail:</th>
  <td><input type="text" name="id"></td>
</tr>
```

これはhtmlですが、、、

type="text"とname="value"が何者なのかを教えてもらいました。
type="text"は、お買い物サイトのログイン画面などでよくある、自分のメールアドレスを入力するときのあの、四角いやつ。

あれを作りたかったらtype="text"を書きましょう！

name="id"は、例えばそのメールアドレスの欄に自分のメアドを打ち込んだら、その打ち込んだ情報に名前が付いてる的な。？
打ち込んだ情報を受け取るための名前みたいな感じ！(森川さん、あってますか？？笑)

言葉で説明するの難しい・・・泣

今後の予定→
まだ、プロゲートPHPの２番が全て終わっていないので、それを終わらせて、確認画面と完了画面を作っていきます。
ブログの内容送ります！よろしくお願いします！
Heroku に JavaScript をコンパイルするビルドフローがある Ruby アプリをデプロイすると Node.js のバージョンが incompatible になる場合がある

# 問題

Heroku に Rails バックエンドと webpacker + webpack 使って JavaScript のコンパイルを行うフロントエンドをもつWebアプリをデプロイしようとしたら以下のエラー。

```sh:herokuログ
error some-rails-app-build@0.1.0: The engine "node" is incompatible with this module. Expected version "10.16.0". Got "10.15.3"
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
```

Node.js のバージョンが 10.16.0 で指定されてるけど 10.15.3 でビルドしようとしている。 package.json では以下のようにNode.jsのバージョンを指定している。

```json:package.json
...
  "engines": {
    "node": "10.16.0"
  }
...
```

# 原因と解決方法

原因は buildpacks の順番。 [`heroku/ruby` にはすでに Node.js 10.15.3 がインストールされており](https://devcenter.heroku.com/articles/ruby-support#installed-binaries)、 `heroku/nodejs` を buildpack として追加していても **`heroku/ruby` が上にあるとそちらの Node.js が使われる**。

>If you need a specific version of node for your Ruby application you should use multiple buildpacks to first install node then install Ruby.

Ruby とバージョン指定した Node.js を使いたかったら最初に Node.js をインストールしろと。

>Verify that your buildpacks are set correctly and that Node comes before Ruby: 

Node.js を Ruby より前にすることを注意している。

上記2つは[Heroku Ruby Support](https://devcenter.heroku.com/articles/ruby-support#installed-binaries)より引用。


![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26239/c6a4f1cc-a22f-f83b-7be8-17948fc6b87b.png)

`heroku/ruby` を `heroku/nodejs` の下に変えたらうまくいきました。
7/1(mon) 今日やったこと

ProgateのPHPレッスンで２まで進めました！
まだイマイチよくわかっていないところもあるけど、アウトプットしつつ理解を深めていこうと思います。

その後お問合せフォームの入力画面を作りました。

```php
<form method = "post"  行き先>
</form>
```

[課題]</br>
・森川さんにform入力について教えてもらったので次回追加。</br>
・行き先指定についてウェブで調べる。</br>
・確認画面と完了画面完成させる。
VSCodeでC#のドキュメントコメントをファイル出力する

プラグインの説明欄に書いてあるけど見落としていたので、同類がいると思って書いておきます。

XML Documentation CommentをXMLファイルに出力します。

## プラグインを入れる
[C# XML Documentation Comments](https://marketplace.visualstudio.com/items?itemName=k--kato.docomment)

## csprojを編集する
PropertyGroupの中に以下を記述して保存

```myApp.csproj
<PropertyGroup>
    ...
    <GenerateDocumentationFile>true</GenerateDocumentationFile>
    <DocumentationFile>FilePath/FileName.XML</DocumentationFile>
</PropertyGroup>
```

パスはcsprojファイルからの相対パスです。

## コンパイルする
F5押してプロジェクト実行でもすれば良いかと。

そうしたら指定したパスにファイルが出力されていると思います。
[NewRelic] NewRelic Agent のサイレントインストール

サイレントインストール用スクリプト

```
#!/bin/bash
# install newrellic agent
export NR_INSTALL_SILENT='1'
export NR_INSTALL_KEY='__NEWRELIC_LISENCE_KEY_HERE__'
/bin/rpm --quiet -Uvh http://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm
/usr/bin/yum -y install newrelic-sysmond
/usr/sbin/nrsysmond-config --set license_key=${NR_INSTALL_KEY}
/etc/init.d/newrelic-sysmond start
/sbin/chkconfig newrelic-sysmond on
/usr/bin/yum -y install newrelic-php5
/usr/bin/newrelic-install install
/bin/sed -i -e 's/PHP Application/__APPLICATION_NAME_HERE__/g' /etc/php.d/newrelic.ini
/sbin/service php-fpm restart
```
C#の各並び替えメソッド (Array.Sort, List.Sort, OrderBy) のパフォーマンス比較

# はじめに
Qiita 記事は初投稿となります。いろいろとおかしな点もあるかもしれません。
さて、[Twitter](https://twitter.com/kichi2004_/status/1146699215696908288)でC#における OrderByとSortのパフォーマンスの違いの話になって、自分もどれくらいの差があるのか把握していなかったので、検証して、せっかくなので記事に残すことにしました。

#環境
この記事では、以下の環境を使用しました。
Windows 10 Home
Intel Core i5 6400T
.NET Framework 4.6.1
Visual Studio 2019 Debug環境

#検証方法
元の配列は、0から(10^6 - 1)を昇順に並べた、100万要素の配列とする。
`Array.Sort(array)` `List<T>.Sort()` `enumerable.OrderBy(x => x)` それぞれについて、ソートを10回行う。
* 以下に記載してある時間は「ミリ秒単位」で「ソート10回分」です。(1回あたりは10で割ってください。)
##ランダム順の配列を並び替え
以下の操作を10回行い、ソート10回にかかった時間の平均値・最大値・最小値を計算します。
- 元の配列をランダム順に並び替える。
- それぞれのソート関数でソートを実行する。
###結果
|       |Array.Sort|List.Sort|OrderBy|
|:-----:|:---------|:--------|:------|
|Max|1721ms|1448ms|5428ms|
|Min|1307ms|1301ms|5177ms|
|Ave|1375.5ms|1347.7ms|5306.7ms|

ランダム順では、`List.Sort` が `Array.Sort`よりわずかに早く、`OrderBy` はそれらより4倍近く遅い結果となりました。

##昇順・降順の配列を並び替え
以下の操作それぞれで、ソート10回にかかった時間を計算します。
- 昇順となっている（すでにソートされている）配列に対してソートを実行する。
- 降順となっている配列に対してソートを実行する。
###結果
|       |Array.Sort|List.Sort|OrderBy|
|:-----:|:---------|:--------|:------|
|昇順|175ms|184ms|2608ms|
|降順|368ms|313ms|1923ms|

昇順配列におけるソートでは、 `Array.Sort` が `List.Sort` よりわずかに早く、 `OrderBy` はそれらより15倍近く(!)遅い結果となりました。
降順配列におけるソートでは、 `List.Sort` が `Array.Sort` より少し早く、 `OrderBy` はそれらより6倍近く遅い結果となりました。

それぞれの関数別にみると、
`Array.Sort` では、昇順配列におけるソートが降順配列におけるソートより約2倍早く、ランダム配列におけるソートより約8倍早い。
`List.Sort` では、昇順配列におけるソートが降順配列におけるソートより約1.7倍早く、ランダム配列におけるソートより約7.3倍早い。
`OrderBy` では、昇順配列におけるソートが降順配列におけるソートより約1.3倍**遅く**、ランダム配列におけるソートより約2倍早いという結果になりました。

#まとめ
今回の検証に使用したコードは、 [Gist](https://gist.github.com/kichi2004/d9061b4affad4eb553da983647c2aa14)に載せています。

数値や文字列などの、オブジェクト自体の並び替えには、絶対に `Array.Sort` や `List<T>.Sort()` を使いましょう!! (特に私は競技プログラミングをやっていて、数百ミリ秒でも早いほうがいいため、今後はSortを使うことをより意識しようと思います。ソートが原因でTLEはくらいたくない!!)
今回は検証していませんが、オブジェクトのプロパティを指定した並び替えでも、`objects.OrderBy(x => x.Target);` とするよりも、`ToArray()` → `Array.Sort(objectsArray, (a, b) => a.Target.CompareTo(b.Target);` としたほうが高速だと思います。
`OrderBy` は、`IEnumerable<T>` を対象に並び替えができるようになっているため、遅い実装になっているんですかね…。
* もしかしたら遅延評価の問題などで、`OrderBy` のほうが高速になることがあるかもしれません。 (特に `EnumerateFiles` などで外部にアクセスするとき)

この記事について、ご意見やご指摘などがありましたら、記事のコメント等へお願いいたします。
VSCodeのMarkdown Preview EnhancedのMermaid.jsのガントチャートで本日の赤線を消す

# 概要
* Markdownで書いたガントチャートから本日の赤線を消す

# 環境
* macOS Mojave 10.14.5
* Visual Studio Code 1.36.0
* Markdown Preview Enhanced 0.4.2
    * https://github.com/shd101wyy/vscode-markdown-preview-enhanced

# 方法
　mermaid.jsの設定を駆使して，スタイルシートの```line.today```を```display:none```にすることで赤線を消すことができる．

## Mermaidの設定を開く
⌘+SHIFT+Pで，```Markdown Preview Enhanced: Open Mermaid Config```を選択して開く

```json
// config mermaid init call
// http://knsv.github.io/mermaid/#configuration
//
// You can edit the 'MERMAID_CONFIG' variable below.
MERMAID_CONFIG = {
  startOnLoad: false
}
```

## 以下のように追記する
```json
// config mermaid init call
// http://knsv.github.io/mermaid/#configuration
//
// You can edit the 'MERMAID_CONFIG' variable below.
MERMAID_CONFIG = {
  startOnLoad: false,
  themeCSS: "line.today{display:none;}"
}
```

## 変更前のガントチャート
![mermaid_today_line.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/fc53711a-ca42-5568-24b2-fa38cb915b80.png)


## 変更後のガントチャート
![mermaid_today_noline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35035/e0f7c033-fb37-74d3-e75d-758435ccf8e7.png)
Rails6 のちょい足しな新機能を試す47（upcase downcase swapcase 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第47段。 今回は、 `upcase downcase swapcase` 編です。
Rails 6 では、 `ActiveSupport::Multibyte::Unicode.downcase` 、 `ActiveSupport::Multibyte::Unicode.upcase` 、 `ActiveSupport::Multibyte::Unicode.swapcase` を使うと `DEPRECATED WARNING` が出るようになりました。
Ruby 2.4.0 以降であれば、 `String` のメソッドがそのまま使えるからということのようです。
(Rails 6.0 は、 Ruby 2.5.0 以上が必要です。)

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# 簡単なスクリプトを作る

今回は、動作確認用の簡単なスクリプトを書いて確認します。


```bin/unicode.rb
#!/usr/bin/env ruby

require 'active_support/core_ext'

puts '--- DEPRECATED WARNING ---'
p ActiveSupport::Multibyte::Unicode.downcase('À')
p ActiveSupport::Multibyte::Unicode.upcase('à')
p ActiveSupport::Multibyte::Unicode.swapcase('àÀ')

puts '--- NO DEPRECATED WARNING ---'
p 'À'.downcase
p 'à'.upcase
p 'Àà'.swapcase
```

# 実行してみる

`ActiveSupport::Multibyte::Unicode` の方は実行すると `DEPRECATION WARNING` が表示されます。

```shell
--- DEPRECATED WARNING ---
DEPRECATION WARNING: ActiveSupport::Multibyte::Unicode#downcase is deprecated and will be removed from Rails 6.1. Use String methods directly. (called from <main> at bin/unicode.rb:6)
"à"
DEPRECATION WARNING: ActiveSupport::Multibyte::Unicode#upcase is deprecated and will be removed from Rails 6.1. Use String methods directly. (called from <main> at bin/unicode.rb:7)
"À"
DEPRECATION WARNING: ActiveSupport::Multibyte::Unicode#swapcase is deprecated and will be removed from Rails 6.1. Use String methods directly. (called from <main> at bin/unicode.rb:8)
"Àà"
--- NO DEPRECATED WARNING ---
"à"
"À"
"àÀ"
```

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try047_unicode


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Deprecate Unicode#downcase/upcase/swapcase](https://github.com/rails/rails/pull/34123)
VyOSでNATする時に同一セグメント内へのDNATではまった件

# はじめに
* VyOSでNAT設定やろうとした時にはまった点のメモ

# 環境構成
* 環境概要は以下の通り

### VyOSのNIC設定
|NIC|IPアドレス|
|-------|-------|
|eth0|10.10.10.1|
|eth1|192.168.179.1|
|eth2|128.7.56.1|


### 検証環境のマシン
|名称|IPアドレス|デフォルトGW
|-------|-------|-------|
|マシン①|10.10.10.100|10.10.10.1|
|マシン②|192.168.179.100|192.168.179.1|

### 構成図
![画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310068/66ced782-27ea-701a-9940-7e4d1e60f169.png)

# やりたいこと
* ***「128.7.56.1:80」***にアクセスした時、***「10.10.10.100:80」***に転送されるようにしたい

# DNAT設定
* VyOS側にて以下設定を実施
    * rule1はeth0で受付したリクエストの転送
    * rule2はeth1で受付したリクエストの転送

```shell
set nat destination rule 1 destination address 128.7.56.1
set nat destination rule 1 destination port 80
set nat destination rule 1 inbound-interface eth0
set nat destination rule 1 protocol tcp
set nat destination rule 1 translation address 10.10.10.100
set nat destination rule 1 translation port 80

set nat destination rule 2 destination address 128.7.56.1
set nat destination rule 2 destination port 80
set nat destination rule 2 inbound-interface eth1
set nat destination rule 2 protocol tcp
set nat destination rule 2 translation address 10.10.10.100
set nat destination rule 2 translation port 80
```

# DNAT設定後の疎通結果
* マシン①から「128.7.56.1:80」にアクセスしても、「10.10.10.100:80」には転送されずエラーとなる
* マシン②からの疎通は問題なし

| マシン名 | 疎通結果 |
| -------- | ----|
| マシン①  | ○   |
| マシン②  | ×   |

# マシン①の疎通結果がNGだった理由
* SNAT変換がされていないため、マシン①への戻りパケットのsource IPアドレスが***「10.10.10.100」***のままになっている
* source IPアドレスが***「10.10.10.100」***のため、マシン①はdestination IPアドレスに***「10.10.10.100」***を設定して自分自身に対し通信を行なおうとするが、最初のSYNパケットのdestination IPアドレスは***「128.7.56.1」***であるため齟齬が発生しTCPコネクションを確立できずエラーとなる

![やり取り.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310068/a5672795-dedb-8ded-43c6-8218d9a150a9.png)


# 解決方法
* SNAT設定を入れて、送信元が同一セグメント内からの場合も別セグメントからアクセスが来たように見せかける
* VyOSを経由してくれればNAT変換後のIPアドレスでいい感じに通信してくれる
* translation addressは10.10.10.0とは別セグメントで使えるやつなら多分なんでもいいはず
* outbound-interfaceはsource addressのデフォルトGWとなっているNICを指定する

```
set nat source rule 1000 source address '10.10.10.0/24'
set nat source rule 1000 translation address 128.7.56.1
set nat source rule 1000 outbound-interface eth0
```


# まとめ
* DNAT設定時、同一セグメント（同一アドレス含む）からもアクセスがある場合はSNAT設定も忘れずにやる
CircleCIで環境変数(Environment Valuables, Context)が効かない

CircleCIで環境変数が効かない、環境変数が反映されない、という地味な現象にハマりましたが、原因は`config.yaml`内で`sudo`利用時に環境変数引き継ぎオプション`-E`を指定していなかったという残念なものでした。
検索しても引っかからなかったので自分のためにメモ。

# 修正前

```bash
sudo yarn deploy       
```

# 修正後

```bash
sudo -E yarn deploy       
```

# config.yaml全体

```yaml
version: 2.1

references:
  ignore_master: &ignore_master
    filters:
      branches:
        ignore:
          - master

orbs:
  aws-cli: circleci/aws-cli@0.1.13

executors:
  default:
    working_directory: ~/repo
    docker:
      - image: circleci/node:10.15.3-browsers

commands:
  prepare-aws-cli:
    description: 'AWS CLIを準備'
    steps:
      - aws-cli/install
      - aws-cli/configure

  prepare-resources:
    description: 'リソースを準備'
    steps:
      - checkout

      - run:
          name: Install Yarn
          command: sudo npm install -g yarn@1.6.0

      - restore_cache:
          keys:
            - v2-dependencies-{{ checksum "package.json" }}-{{ checksum "serverless.yml" }}-{{ checksum "yarn.lock" }}
            - v2-dependencies-

      - run:
          name: Install dependencies
          command: |
            # yarn.lockの内容をすべてインストール
            yarn install --frozen-lockfile

      - save_cache:
          paths:
            - node_modules
          key: v2-dependencies-{{ checksum "package.json" }}-{{ checksum "serverless.yml" }}-{{ checksum "yarn.lock" }}

jobs:
  lint-and-test:
    executor:
      name: default

    steps:
      - prepare-resources

      - run: yarn lint

      - run:
          name: Format checking
          command: |
            yarn format;
            git diff --exit-code --quiet;
            if [ $? = 1 ]; then
              echo 'Unformat file(s) found.';
              exit 1
            fi

      - run: yarn test:coverage

      - store_artifacts:
          path: ~/repo/coverage/lcov-report/

  build:
    executor:
      name: default

    steps:
      - prepare-resources

      - prepare-aws-cli

      - run:
          name: Build Nuxt resources
          command: |
            if [ $ALIS_APP_ID ]; then
              sudo -E yarn build
            fi

      - persist_to_workspace:
          root: .
          paths:
            - .nuxt/*

  deploy:
    executor:
      name: default

    steps:
      - prepare-resources

      - prepare-aws-cli

      - attach_workspace:
          at: .

      - deploy:
          name: Deployment
          command: |
            if [ $ALIS_APP_ID ]; then
              sudo npm install -g serverless
              sudo -E yarn deploy
            fi

workflows:
  main:
    jobs:
      - lint-and-test
      - build:
          <<: *ignore_master
      - deploy:
          # ステージング環境、本番環境へのデプロイはCodeBuildに委ねる
          <<: *ignore_master
          requires:
            - lint-and-test
            - build

```
this.setState()とuseState()で連想配列の一部だけ変更したい

## したいこと

Reactで連想配列のstate内にある項目を一部分だけ変更したい。
`state = { a: array.a, b: array.b }`のようにしてもいいが、配列の中身が多すぎるとすっきりしたコードにならない。

## 試したけどうまくいかなかった方法

```javascript
this.setState({ array.a: newA });
```
→　ナメすぎました。笑

## 解決策
うまくいった方法

```javascript
this.setState({ array: { a: newA } });
```
これだけでできました。

多次元配列の場合はシンプルに

```javascript
this.setState({ array1: { array2: { a: newA } } });
```
でいけます。

## Hooksを使う場合
ついでにHooksのuseStateを使う場合も試しました

```javascript
const [stateOfArray, setStateOfArray] = useState({});

setStateOfArray(state => ({ ...state, a: newA }));
```
これでstateOfArray配列にあるa要素が変更されました。

## 参考

- this.setState()を用いる： https://stackoverflow.com/questions/43040721/how-to-update-nested-state-properties-in-react
- useState()を用いる： https://upmostly.com/tutorials/how-to-use-the-usecontext-hook-in-react
JuliaをAmazon Linux/Centos6でインストール

# バイナリーを使用(1.0)
```
wget https://julialang-s3.julialang.org/bin/linux/x64/1.0/julia-1.0.0-linux-x86_64.tar.gz
tar -xzf julia-1.0.0-linux-x86_64.tar.gz
```

# github経由
結構時間かかるので要注意1~2時間?
/usr/local/srcに展開したとして、

```
git clone https://github.com/JuliaLang/julia.git
```

```
#(sed -i "s/enabled=0/enabled=1" /etc/yum.repos.d/epel.epo)
yum -y update
yum -y upgrade
yum -y install git gcc-fortran clang m4 patch ncurses-devel python-devel
yum -y install openblas, openblas-devel, blas
ln -s /usr/lib64/libblas.so.3 /usr/lib64/libblas.so
 ./contrib/download_cmake.sh
# openblasでエラーが出たら
make -C deps clean-openblas
make clean
# 以下いずれか？
```

```
make OPENBLAS_USE_THREAD=0
(make USE_SYSTEM_BLAS=1)
```
動作確認

```
./julia --version
./julia
```

Pathを設定
使い分けに応じて
~/.bash_profile
または
~/.bashrc
に

```
export PATH=$PATH:/usr/local/src/julia
```
を追記

```
source ~/.bash_profile
```
または

```
source ~/.bashrc
```

julia 1.0

```
yum install libgfortran
ln -s /usr/lib64/libgfortran.so.3 /usr/lib64/libgfortran.so
```

1系はモジュールのインストールは0系のPkg.add("[モジュール名]")ではなく

```
julia
]
add [モジュール名]
```

## JLD

JLDのインストールでつまづく。

以下コマンドでHDF5をインストールすればJDLは問題なくインストールできる。

```
$ sudo amazon-linux-extras install epel
$ sudo yum-config-manager --enable epel
$ sudo yum install hdf5-devel
```

参考:
https://qiita.com/miiton@github/items/33c2b62c4911216d5fdb
https://github.com/mass10/julia.note/wiki/Julia-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B

https://qiita.com/Hidekazu-Karino/items/eeda08fbd6f16c735843
#Rails #rspec で describe とか context とか it のタイトルを分かりやすく表示してくれるオプションは -fd です ( --format=documentation )

以上。


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2243


# Help

デフォルトが progress (進捗バー)みたいです。

```
    -f, --format FORMATTER             Choose a formatter.
                                         [p]rogress (default - dots)
                                         [d]ocumentation (group and example names)
                                         [h]tml
                                         [j]son
                                         custom formatter class name
```








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
obnizがofflineのままでつながらないときの対応法



JavaScriptでIoTができるobnizですが、いろいろいじってると「あれ？offlineのまま動かなくなった！」ということがあるようです。

これ、機械の故障ではなくて、意図してない設定をしてしまって起きていることが多いなと思ったので、まとめてみました。


## 現象

obniz boardにQRコードが出ている（オンラインになってそう）。
なのにoffline表示される
　![IMG_4287.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/26d81612-0a42-8f97-a4e8-b780d7592e9c.jpeg)


## 原因

* obniz cloudにてアクセストークンが発行されていて、**特定の人しか使えなくなっている**
* プログラムで**特定の人だと証明できていなく**、アクセスできないよということでofflineになっている

## 解決策

解決策１）特定の人だと証明しましょう
解決策２）アクセストークンを無効化して誰でも使えるようにしましょう


この記事では解決策２で対応します！　

## 解決方法

[obnizのサイト](
https://obniz.io/)で開発者コンソールに行きます
![スクリーンショット_2019-07-05_11_16_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/d956f546-eb7b-a993-346a-0e45ddd25bb8.png)


デバイスへ移動します
![スクリーンショット_2019-07-05_11_16_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/322a8e8d-752d-653d-f462-5a01e4699004.png)



ここでPrivateと出ているのがアクセストークンが発行されているデバイスです。
![スクリーンショット_2020-06-25_10_23_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/bf7359ed-4d2e-f305-af99-59553871c86f.png)


IDをクリックして設定画面に行きます
![スクリーンショット_2020-06-25_10_23_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/5c734c4d-f4e5-7951-eb46-5abed2f1b379.png)



中段にある「アクセストークンの削除」ボタンを押してアクセストークンを無効化します
![スクリーンショット_2020-06-25_10_23_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/ad7e3e65-5afc-d7cb-f754-28e226089d03.png)


スッキリした画面になって、アクセストークンが無効化されました

![スクリーンショット 2020-06-25 10.23.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/0438017d-609f-a8d1-b8dc-982a974e7384.png)


## 結果
デバイス一覧に戻ってもPrivateと表示されなくなりました
![スクリーンショット 2020-06-25 10.23.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/485762d3-5dd9-bb5c-39b3-399c27c400ed.png)



もちろん、普通にobnizも使えてonlineになります
![IMG_4288.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/f0903ff6-1851-48b7-4126-558ddb2d99c4.jpeg)
【Sass】コンパイラkoalaの使用方法

3回目の投稿です:lifter_tone1:
今回は手軽にSassをコンパイルしてくれるコンパイラkoalaについてです。
まずはじめに公式サイトから[koala](http://koala-app.com/)を流れに沿ってダウンロードしてください。
## 環境設定
ダウンロードできたら左上の歯車を選択しGeneralのLanguageを日本語にします。
<img width="1012" alt="スクリーンショット 2019-07-05 11.14.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451805/2e7dd11f-6169-8469-6af1-a0a266dce444.png">

アウトプットスタイルを好みのスタイルに設定する。
- Nested      Sassのネスト状にする
- Expanded    通常のCSSの書き方
- Compact     セレクタとプロパティを一文にする
- Compressed  空白など全て取り除き圧縮する
<img width="1012" alt="スクリーンショット 2019-07-05 11.20.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451805/613277b2-8544-75e9-3007-4c519a962d36.png">

## コンパイル手順
1.style.scssファイルを用意し任意のフォルダに格納しておく
2.style.scssが入っているフォルダをkoalaにドラッグ&ドロップする
3.自動コンパイルにチェックを入れるとscssを保存する度にcssが更新されます
4.コンパイルボタンを押し実行するとcssファイルが生成されます
<img width="1012" alt="スクリーンショット 2019-07-05 11.39.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451805/46ac47f0-485d-3a9d-66c6-8af878e9789c.png">

## あとがき
以上、今回はkoalaについての説明でした。
さらに使って行くうちに追記などがあったら更新していきたいと思います:space_invader:
Docker for Windows + Windows Subsystem for Linux (WSL) で Docker

Windows Terminal がやってきたので、なるべく作業環境は Windows Terminal に寄せたいわけです。ということで手始めに Docker のビルド環境はこちらに移動することにしました。デーモンは Windows 側にいます。

# 事前準備

- Docker for Windows をインストールする。
- Windows Subsystem for Linux (WSL)- Ubuntu をインストールする。 ( Windows 10 May 2019 Update 以降がよい ) 
- Windows の設定で Hyper-V を有効にする。

## Docker のインストール

```
$ sudo apt update
$ sudo apt install docker.io
```

## ホスト側のDocker for Windows でローカルホストからの平文接続を許可する

Docker for Windows へはドメインソケット経由ではつながらないので、TCP経由でつなぎます。デフォルトではTLSが必須なのですがローカルホストの場合には平文で接続を許可するオプションがあるので、そうしてしまいましょう。

<img width="625" alt="docker_windows_settings.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17911/f00803fe-4ff4-c005-464f-fe36a40af19f.png">

## DOCKER_HOST 環境変数を設定する

WSL側では環境変数で接続先を指定しておきます。

```bash
$ export DOCKER_HOST="tcp://0.0.0.0:2375"
```

# Docker コンテナをビルドする

## 適当なディレクトリに Dockerfile とスクリプトを置く

```awesome.sh
#/bin/sh
echo "hello!!!"
```

```Dockerfile
FROM debian

COPY awesome.sh /
RUN chmod +x /awesome.sh
CMD /awesome.sh
```

## 上記で作成した適当なディレクトリで docker build する。

```bash
$ docker build . -t sample1
```
## 動作確認する

```bash
$ docker run sample1

hello!!!   
```

# まとめ

平和に動作します。特別なことはありません。