OmniAICreator/Qiita-1.07M huggingface dataset:
BitBucketのパイプラインを使ってHerokuにJavaをPushした話

初投稿です。文章が読みづらいかもしれませんが宜しくお願い致します。

#**モチベーション**
せっかくだからGitにpushしたら自動でHerokuにデプロイするようにしたい。
でもGitHubは~~マイクロソフトに買収された~~課金しないとpublicだから見られたくないもんも見られちゃう。
BitBucketはprivateだからその辺うまくいきそう。

#**前提**
* STS使ってSpringBootでプロジェクト作ります（当方eclipseにSTSプラグインを入れております）
* bitbucketのアカウント作成を済ませておきます
* Herokuのアカウント作成を済ませておきます
* HerokuCLI導入済です
* Gitが使えます（eclipseのGitプラグインでもOK）

#**さっそくやってみる**
#**まずはHerokuの準備**
HerokuCLIからでもWebアプリ管理画面上からでもよいので任意のプロジェクトを作成
HerokuのAPIキーを控えておく（Account Settings画面から確認できる）
#**続いてBitBucketのリポジトリ作成**
リポジトリクリエイト→GitCloneでURLを控えておく
#**Javaのプロジェクト作成**
右クリック→新規→新規Springスタータープロジェクトで作成
以後作ったプロジェクト名はSampleProjectとして、各ファイル内の変数名もSampleProjectとしていますが、
そこは自分のプロジェクト名に読み替えてください。

```:SampleProject
├─src/main/java
├─src/main/resources
│　└─application.properties
├─mvnw
├─mvnw.cmd
└─pom.xml
```
上記のようなパッケージ構成になっていればOK
ここからBitBucketとHeroku特有ファイル作成＆修正

```system.properties（新設）
java.runtime.version=1.8
```
```:Procfile（新設）
web: java -jar target/SampleProject-0.0.1jar --server.port=${PORT}
```
```xml:pom.xml(修正)
…
	<artifactId>SampleProject</artifactId>
	<version>0.0.1</version>
	<packaging>jar</packaging>
…
```
pom.xmlのPackagingをjarに修正
pom.xmlのartifactId&version名がProcfileと同様になっていることを確認

```:application.properties(修正)
下記記載を追加

server.port=${PORT:5000}
```

```yml:bitbucket-pipelines.yml（新設）
# This is a sample build configuration for Java (Maven).
# Check our guides at https://confluence.atlassian.com/x/zd-5Mw for more examples.
# Only use spaces to indent your .yml configuration.
# -----
# You can specify a custom docker image from Docker Hub as your build environment.
image: maven:3.3.9

pipelines:
  default:
    - step:
        caches:
          - maven
        script: # Modify the commands below to build your repository.
          #- mvn -B verify # -B batch mode makes Maven less verbose
          - git push https://heroku:"HerokuのAPIキー"@git.heroku.com/"Herokuのプロジェクト名".git HEAD
```

##それぞれのファイルの説明
###system.properties
Heroku側でmavenプロジェクトをビルド後実行するために必要な設定ファイル
###Procfile
Heroku側でプロジェクトを実行するために必要なファイル。実行コマンドを記載
因みに、mavenプロジェクトではmvn buildを実行するとプロジェクト直下のtargetフォルダ内に、ビルド結果ファイル（今回はjar）を格納する。これを実行する指定をしている
###pom.xml
mvn buildのゴールをjarに変更(デフォルトはwarだった気が)
###application.properties
heroku側のサーバーポートは5000らしいのでこのように記載（公式に書いてある通り）
###bitbucket-pipelines.yml
bitbucketに備わっているパイプライン機能を利用。
bitbucketのmasterブランチにプッシュされると、自動でyamlに記載の処理を実行する
ここでは、今回はjavaをmaven管理しているので、
　①冒頭でmavenプロジェクトを宣言
　②herokuのプロジェクトブランチにpush
している。
なおherokuにpushされると、プロジェクトの言語、設定ファイル等を自動判別し勝手にビルドしてくれる。

最終的なフォルダ構成
(この構成じゃないとbitbucketさんやherokuさんが動いてくれないので要確認)

```:SampleProject
├─src/main/java
├─src/main/resources
│　├─application.properties
├─bitbucket-pipelines.yml
├─mvnw
├─mvnw.cmd
├─pom.xml
├─Procfile
├─pom.xml
└─system.properties
```

#**最後にbitbucketにpush**
bitbucketにプッシュすると、
①bitbukcetパイプラインが起動
②bitbukcetからheroku側のgitリポジトリにpush
③herokuがmavenプロジェクトと自動判別しmaven buildを実行
④targetフォルダ直下のjarをjavaコマンドで起動
の流れでherokuに配備されます。
pushしたらbitbucketのパイプライン画面のログや、Herokuのlogを確認し、各種コマンドがうまくいっていることを確かめましょう。うまくいったら完了です。

一度パイプラインを作れば、これからはBitBucektにpushするたび自動でherokuに配備されます。
終わりです。
CentOS6 iptables 設定について

# CentOS6 iptables 設定について( ● ´ ー ` ● )
 iptables って結構, 奥が深くハマったので自戒を込めて
残しておきたいと思います。

 iptables の中身を見ていきましょう♪
iptables の中身を見るには, iptables -L -n --line-number
というコマンドをたたくと見やすく表示してくれますよ♪
更に, -v オプションを付加すると更に詳細に表示されます
ここでは, 詳細に表示する -v を付加しています。

```console:iptables中身
[root@localhost /]# iptables -L -n -v --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 8
2        3   252 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 0
3      501 49301 ACCEPT     all  --  *      *       192.168.1.0/24       0.0.0.0/0
4        0     0 ACCEPT     tcp  --  *      *       192.168.1.0/24       0.0.0.0/0           tcp dpt:22
5        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
6       82  6251 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
7        0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 335 packets, 38006 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0
```

 less /etc/sysconfig/iptables
で直接見たときの形式は, このような感じになっています。

```console:iptablesファイルの中身
# Generated by iptables-save v1.4.7 on Sat Jun 30 23:12:40 2018
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [78:11824]
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j DROP
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Sat Jun 30 23:12:40 2018
```

 要点というか書くルールについて説明していくよ♪

```console:command
// まず行頭のルールから説明するね♪
iptables -I INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -I INPUT -p icmp --icmp-type 0 -j ACCEPT
// ↑これは, ping 疎通確認のときに使用するのに必要になるんだよ♪
// ping は, 8, 0 を許可してやる必要があるんだ(ΦдΦ)

iptables -I INPUT -s 192.168.1.0/24 -j ACCEPT
iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport ssh -j ACCEPT
// ↑ こやつらは, 自ネットワークからの ssh 接続と全てのプロトコルへのアクセスを許可する設定だよ。
// httpd のポート開放とかいちいち気にしなくてすむんだよ

iptables -I INPUT 5 -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT
// ↑ ローカルループバックといって内部でしようする通信を許可するって意味なんだ
// INPUT と OUTPUT 両方で許可しているよ

iptables -I INPUT 6 -m state --state ESTABLISHED,RELATED -j ACCEPT
// ↑ これは, 接続済(確立済)で関係する通信を許可するっていう奴なんだすごく重要な奴
// これが, 行末(一番最後の行)に来るようにしてあげないとネット接続できなくなるを
// 重要 この場合だと, ESTABLISHED,RELATED  ルールが, 全拒否ルールの上にくるようにします

iptables -I INPUT 2 -s 0.0.0.0/0 -j DROP
// こいつで, INPUT を全て拒否するんだよ
// これないと全て許可されちゃうからね
```

*重要 この場合だと, ESTABLISHED,RELATED  ルールが, 全拒否ルールの上にくるようにします*

 iptables -I INPUT 2 とか数字の部分は, ルールの挿入位置をしめしているので各自の環境に合わせてねo(*`ω´*)o

 192.168.1.0/24 も各自の環境に合わせて設定してねε-(´ωﾉ|
Jenkinsジョブでdiffをとると失敗する際の回避方法

# 現象

Jenkinsジョブでdiffを取り差異を確認しようとした際
ジョブが失敗してしまった。
（diff以外は成功しているのに...）

```
Connection to ＊＊＊＊＊ closed.
Build step 'シェルの実行' marked build as failure
Finished: FAILURE　
```
# 原因

Jenkins実行されるシェルのデフォルトは

```
/bin/sh -xe
```
である。

- -eオプション：終了コードが0でないものを返した時点でexitされる

→　diffで一致しなかった場合、0以外の終了コードを返すため、
　　ジョブが失敗してしまう


# 解決策

###1. 頭に```#!/bin/sh```をつける
途中で0以外の終了コードが返っても、無視して実行し続けることができる。
ただし、他の処理が失敗した時も処理をし続けるためリスキー。
###2. diffをとった箇所は必ずtrueを返すようにする※こちらを採用
```diff A.txt B.txt || true```
diffの実行時は必ずtrueを返すようにした。


# 参考
https://qiita.com/mechamogera/items/f689b95670127d5bf046
Githubよく使うコマンド集


#GitHubコマンド集#

Github初心者のためのよく使う基本的なコマンド集。
随時アップデートしていきます。

##initial setting##

###init###
```prompt:prompt
git init
git add *
```


###set username and email###
```prompt:prompt
git config --edit

# This is Git's per-user configuration file.
[user]
# Please adapt and uncomment the following lines:
        name = "xxxxxx"
        email = "xxxxxx@yyyyyy.zzz"
```

###check name###
```prompt:prompt
git config --global user.name
```

###check email###
```prompt:prompt
git config --global user.email
```


##git clone##

###git clone###
```prompt:prompt
git clone https://github.com/xxx/
```

###branch指定###
```prompt:prompt
git clone -b (branch) https://github.com/xxx/
```

###url指定###
```prompt:prompt
http://username:password@github.com/xxx.git
```

###ssh指定###
```prompt:prompt
git clone git@github.com:xxx.git
```

##疎通の確認##

###通常の疎通確認###
```prompt:prompt
ssh -T git@github.com
```

###鍵指定での疎通確認###
```prompt:prompt
ssh -l git -i ~/.ssh/id_rsa github.com
```

##git push##

###通常の流れ###
```prompt:prompt
cd xxx
git init
git add (filename/dirname) #or [git add .]
git commit -m "comment"
git status
git remote add origin https://github.com/(username)/xxx.git
git push origin master
```

##git pull##
```prompt:prompt
Git pull origin master
```

##branch作成##
```prompt:prompt
cd xxx
git branch -a
git branch (new branch name)
git checkout master
git checkout -b (new branch name)
git branch -a
```

##git push##
```prompt:prompt
git push -u origin (branch name)
```

##「プルリクだしてね」といわれたときは##
まずGithubのGUIでForkします
次にCloneでForkしたものを持ってきます。

```prompt:prompt
git clone "xxx"
```
vimとかでファイルを編集します
あとはファイルをコミット。

```prompt:prompt
git add .
git commit -m "comment"
```
ブランチ作ってPushします。

```prompt:prompt
git checkout -b xxx
git push -u origin xxx
```

最後にGithubのGUIでプルリクエストを押します。
Course 4 > Week 2 Deep convolutional models（Coursera Deep Learning Specialization 受講記録）

Coursera > [Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning) > Course 4 : Convolutional Neural Networks > **Week2 : Deep convolutional models: case studies** の受講記録。

#概要
Course 4 は4週分の講座から構成される。

1. [Week 1 Foundations of Convolutional Neural Networks](https://qiita.com/onooooo/items/7e1dadb271085045f2c4)
2. [Week 2 Deep convolutional models: case studies](https://qiita.com/onooooo/items/f35f521c6f68a2d88454)
3. [Week 3 Object detection](https://qiita.com/onooooo/items/f36dde6014304a02668b)
4. Week 4 Special applications: Face recognition & Neural style transfer

Week2 はいくつかの有名なCNNの事例/パターンを学ぶ。

---
#Case studies
##Why look at case studies?
他の人が作成したニューラルネットワークアーキテクチャを参考にすることは有用である。
LeNet-5、AlexNet、VGG、ResNet

##Classic Networks

- LeNet-5
- AlexNet
- VGG

##ResNets
一般的にニューラルネットワークはレイヤ構造が深くなるほど勾配消失・勾配爆発が起こりやすくなる。あるレイヤーのActivationの出力を、すぐ後ろのレイヤーに引き渡すだけでなく、2つ後ろのレイヤーのLinearとNon-Linearの間で足し込む操作を加える。ResNetはResidual blockを重ねることで構成される。Residual Blockの持つ short cut (skip connection) の働きにより、非常に深いネットワーク構造でも勾配が消失せずに学習できる。

##Why ResNets Work
ResNetsが機能することの直感的な説明。
(参考)[Residual Network(ResNet)の理解とチューニングのベストプラクティス](https://deepage.net/deep_learning/2016/11/30/resnet.html)

##Networks in Networks and 1x1 Convolutions
1x1 Convolutions(Network in Network)を使うことで、画像の幅と高さを変えずにチャネル数を減らしたり増やしたりすることができる。チャネル数を減らす場合は計算量を削減できる（=次元削減）。ReLUなどの非線形性を追加することも。

##Inception Network Motivation
inputに対して異なるサイズのフィルタによる畳込みやMaxPoolを行い、結果をconcatする。ただしこのままだと計算コストが膨大になる。1x1 Convolutionを使用して一旦ボリュームを削減することでトータルの計算コストを抑える（bottleneck layer）

##Inception Network
Inception Networkの構築例。1x1、3x3、5x5の異なるサイズのフィルタを適用する。3x3、5x5のフィルタについては適用前に1x1Convで次元削減を行っている。3x3のMaxPoolも適用する。PaddingしてWidthとHeightのサイズを変えないようにする。適用後に1x1Convを行い、チャネル数を削減する。
GoogLeNetの紹介。

(参考)[「Xception: Deep Learning with Depthwise Separable Convolutions」を読んで勉強したので参考になった資料とかまとめておく](http://st-hakky.hatenablog.com/entry/2017/11/07/174113)
※Inception ModuleというよりむしろXception Moduleが主題のようですが。

---

#Practical advices for using ConvNets
##Using Open-Source Implementation
オープンソースを活用し、オープンソースコミュニティへ参画・寄与することのすすめ。

##Transfer Learning
転移学習。既存のトレーニング済みモデルを流用することができる。

##Data Augmentation
Data Augmentationにより訓練データの量を水増しできる。
画像データの場合、以下のような方法がある。

- Mirroring
- Random Cropping
- Rotation
- Shearing
- Loacl wrapping
- Color Shifting(PCA Color Augmentation)

##State of Computer Vision
date vs. hand-engineering
データ量が十分に多い場合、シンプルな実装でうまくいく。
データ量が不十分な場合、手作業でいろいろ工夫を加える必要がある。

speech recognition はデータ量多め。
object detection はデータ量少なめ。
image recognition はその中間くらい。
データ量が少ない場合に転移学習が役に立つケースも。

ベンチマークでいい成績を出す方法
・ Emsumbling（アンサンブル学習）
・ Multi-crop at test time
(参考)[CNN による画像分類で使われる前処理・テスト時処理まとめ](http://iwiwi.hatenadiary.jp/entry/2016/12/31/162059)
Dockerイメージ「mattermost-docker-preview」のMySQLにアクセスする方法

#やりたいこと
Dockerイメージ「mattermost-docker-preview」はイメージの中にMattermostのWebアプリケーションとバックエンドデータベースMySQLが一つになったオールインワンパッケージ
https://github.com/mattermost/mattermost-docker-preview
にDockerFileがあるので、これを使えばすれば問題なく起動。しかし、MySQLにはホストOSからアクセスできない。
MySQLに直接アクセスしてデータ分析したい。

#やったこと
DockerFileを修正。

修正前

```text:修正前
# Ports
EXPOSE 8065
```

```text:修正後
# Ports
EXPOSE 3306
EXPOSE 8065
```

Dockerイメージ起動時のコマンドも次の通り修正

```text:修正前
docker run --name mattermost-preview -d --publish 8065:8065 mattermost/mattermost-preview
```

```text:修正後
docker run --name mattermost-preview -d --publish 8065:8065 --publish 3306:3306 mattermost/mattermost-preview
```

以上
Raspberry Pi と Arduino をシリアル通信する

# 参考
[RaspberryPiとArduinoを連携する【USBシリアル編】 (uepon日々の備忘録)] (http://uepon.hatenadiary.com/entry/2017/01/01/141220)

# 環境
* Raspberry Pi 3 Model B+
* Raspbian 9.4 (Stretch)
* platformio
* [Arduino 互換機] (https://www.amazon.co.jp/dp/B06Y5TBNQX)

# スケッチする
Raspberry Pi 上で書いたスケッチを platformio を使って書き込みます。
Raspberry Pi と platformio については以前に記事にしているので興味のある方はそちらをどうぞ。
[CUI で Raspberry Pi から Arduino のスケッチを書き込む（platformio）] (https://qiita.com/ancolin/items/d4291b994c422a01b6b3)

## プロジェクトを作る
まずはプロジェクトを作ります。
`$ mkdir -p Arduino/Lchika && cd Arduino/Lchika`

## プロジェクトを構築する
platformio で初期化します。
`$ platformio init --board=uno`

Arduino の場所を platformio に教えてあげます。
`$ echo 'upload_port = /dev/ttyACM0' >> platformio.ini`

## スケッチする
スケッチを作成します。
`$ vi src/Lchika.ino`


```c++:Lchika.ino
#define LED_PIN 13 /**< LEDを接続したデジタルピン */

void setup()
{
    Serial.begin(9600);
    pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, HIGH);
}

void loop()
{
    // シリアル通信で1行（改行コードまで）読み込む
    String inString = Serial.readStringUntil('\n');

    if (inString.startsWith("ON")) {
        Serial.println("<--HI-->");
        digitalWrite(LED_PIN, HIGH);
    }
    else if (inString.startsWith("OFF")) {
        Serial.println("<--LOW-->");
        digitalWrite(LED_PIN, LOW);
    }
}
```

## Python でシリアル通信して L チカする
`python` コマンドで動作確認しましょう。
`$ python`

次のようなプロンプトが表示されると思います。

~~~
pi@raspberrypi:~/Arduino/Lchika $ python
Python 2.7.13 (default, Nov 24 2017, 17:33:09) 
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
~~~

以下のプログラムを順番に渡してチカチカしちゃいます。

```py
import serial
s = serial.Serial('/dev/ttyACM0', 9600)
s.write("OFF\n")
s.write("ON\n")
```

順に実行すると以下のような感じになるかと思います。

```py
pi@raspberrypi:~/Arduino/Lchika $ python
Python 2.7.13 (default, Nov 24 2017, 17:33:09) 
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
>>> 
>>> s = serial.Serial('/dev/ttyACM0', 9600)
>>> 
>>> s.write("OFF\n")
4
>>> 
>>> s.write("ON\n")
3
>>> 
```

思う存分チカチカしたら終わりましょう。
`s.close()` して `quit()` します。

```py
>>> s.close()
>>> quit()
pi@raspberrypi:~/Arduino/Lchika $ 
```

ちかちかしていただけましたでしょうか。

# 謝辞
@KeitetsuWorksさんよりシンプルなスケッチを頂戴しましたので、そちらに差し替えさせていただきました。
ありがとうございます。
Ansibleの基本的なコマンド集

#Ansibleコマンド#

Ansibleでコマンド実行する時のコピペ用。
随時アップデートしていきます。

##ping疎通を確認したい場合##

###rootでping確認###
ansible (hostname) -m ping -i hosts -u root


##Playbookの実行##

###hostsに対してrootで実行###
ansible-playbook -i hosts playbook.yml -u root

###vaultpassも使う場合###
ansible-playbook -i hosts playbook.yml -u root -K --ask-vault-pass
SSH鍵認証関連コマンド集

#SSHコマンド集#
SSH接続や公開鍵関連のコマンドコピペ集。
随時アップデートしていきます。


###SSH鍵認証を引き継ぐ場合###

eval `ssh-agent`
ssh-add
ssh-add -l
ssh -A hostsname
初心者/入門者目線のエディタまとめ

プログラミング、コーディングをあまりやっていない初心者の観点で、
以下の観点でテキストエディタをまとめました。

ざっくりしてます。

##◆インストール不要##
###サクラエディタ###
- シンプルで軽い。
- ソースコードのカラー機能あり。

###TeraPad###
- シンプルで軽い。
- ソースコードのカラー機能あり。

###秀丸###
- 多彩な機能あり。有料も。


##インストール要##
###SublimeText###
 - 多機能なエディタ。
 - PackageControlで拡張機能あり。
 - 設定ファイルはJSON。
 - 有料（70$）。

###ATOM###
 - 多機能なエディタ。
 - Sublimeより設定がわかりやすい。
 - 無料。

###VS Code###
 - 多機能なエディタ。
 - 拡張機能も多い。
 - 無料。


###Brackets###
 - 未使用のため不明。

###CotEditor###
 - 未使用のため不明。

###DreamWeaver###
 - Adobe社提供の統合開発環境（IDE）。有料。


##その他##

###Windowsメモ帳###
 - 特に優れた機能なし。
 - 改行コードがうまく表示されないことがあるので注意。

###Macテキストエディット###
 - 特に優れた機能なし。
Azure AD テナントの削除

#概要
　Azure Active Directory のテナントを削除するには、以下の前提条件を全てクリアしていなければなりません。すなわち全てのリソースが ✔ 状態とならなければなりません。以下の例では、[アプリの登録] と [Microsoft Azure] が状態を満たしていません。

　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/56184c52-1d4c-69bd-12e3-a279df2deeaa.png)
#前提条件のクリア
　通常必要な操作の青字をクリックして状態を満たすようにユーザーや登録されているアプリを削除していきますが、ここでは前提条件が分かりずらい [Microsoft Azure] の状態クリアについて説明します。実は非常に単純で、この条件を満たすには、以下の画面で [全体管理者は、Azure サブスクリプションと管理グループを管理できます] を [はい] に設定し保存するだけです。

　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/74adfa91-30b7-daee-1ada-aeea71f3a800.png)
#削除
　そして下記画面のように条件を全てクリアできると、[削除] ボタンを押せるようになります。これで無事 Azure Active Directory のテナントを削除する事ができます。

　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/181882dc-0ba1-8830-27fc-72724ada08b4.png)
Pyside2.QtOpenGL.QGLWidgetを拡張しないで書いてみる。

#いきなり余談だが
```py
from PySide2 import QtCore,QtGui,QtWidgets,QtOpenGL
```
を

```py
from PyQt5 import QtCore,QtGui,QtWidgets,QtOpenGL
```
と書いても問題なく動く。ライセンスが絡んでいるらしいが、よくわからない。

#QGLWidgetを拡張しないで書いてみる
makeCurrent(), swapBuffers()　この2つ関数を使えば解決でした。
`QOpenGLContext::swapBuffers() called with non-exposed window, behavior is undefined`
というエラーが出るけど、contextを作るのが間に合わないのにswapBuffers()している感じかな。別に問題なさそうです。

```py
from PySide2 import QtCore,QtGui,QtWidgets,QtOpenGL
from OpenGL.GL import *
import sys
import time

frag_src = """
#version 330
out vec4 fragColor;
uniform float time;
uniform vec2 resolution;

void main()
{
    vec2 uv = (2.0*gl_FragCoord.xy-resolution) / resolution.y;
    vec3 col = 0.5 + 0.5*cos(time+uv.xyx+vec3(0,2,4));
    fragColor = vec4(col,1);
}
"""

class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(450,300)
        self.gl = QtOpenGL.QGLWidget()
        self.setCentralWidget(self.gl)
        self.gl.makeCurrent()
        self.program = glCreateProgram()
        for (src, type) in zip(("void main(){gl_Position=gl_Vertex;}", frag_src), (GL_VERTEX_SHADER,GL_FRAGMENT_SHADER)):
            shader = glCreateShader(type)
            glShaderSource(shader, src)
            glCompileShader(shader)
            if glGetShaderiv(shader, GL_COMPILE_STATUS) != GL_TRUE:
                raise RuntimeError(glGetShaderInfoLog(shader).decode())
            glAttachShader(self.program, shader)
            glDeleteShader(shader)
        glLinkProgram(self.program)
        glUseProgram(self.program)
        glUniform2f(glGetUniformLocation(self.program, "resolution"),self.width(), self.height())
        self.zeroTime = time.time()
        self.startTimer(1000//60)
        
    def timerEvent(self, event):
        glUniform1f(glGetUniformLocation(self.program, "time"), time.time() - self.zeroTime)
        glRects(1, 1, -1, -1)
        self.gl.swapBuffers()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
```
Firebase Auth + React のsign upだけ

Firebaseメモ。reactでユーザー登録するだけ。

```jsx
import React from 'react';
import ReactDOM from 'react-dom';
import firebase from "firebase";

// initialize firebase app
firebase.initializeApp({
  // apiKeyなど
});

// SignUp component
class SignUp extends React.Component {
  constructor(props) {
    super(props);
    this.state = { email: '', password: '' };
    this.handleSignUp = this.handleSignUp.bind(this);
  }
  handleSignUp() {
    const { email, password } = this.state;
    firebase.auth().createUserWithEmailAndPassword(email, password);
  }
  render() {
    const { email, password } = this.state;
    return (
      <div>
        <div>
          <label htmlFor="email">Email</label>
          <input id="email" value={email} type="text" onChange={ (e) => this.setState({ email: e.target.value }) } />
        </div>
        <div>
          <label htmlFor="password">password</label>
          <input id="password" value={password} type="password" onChange={ (e) => this.setState({ password: e.target.value }) } />
        </div>
        <button onClick={this.handleSignUp} >Sign up</button>
      </div>
    );
  }
};


ReactDOM.render(
  <SignUp />,
  document.getElementById('root'),
);
```
Rechartsを使ってReactにグラフ描画をする

Reactアプリを勉強中でグラフを描画したいと思い、いろいろ探していたところRechartsというライブラリがあったので使ってみた。

公式サイト

- [Recharts](http://recharts.org/#/en-US)
- [github](https://github.com/recharts/recharts)

# はじめに

[create-react-app](https://github.com/facebook/create-react-app)でアプリを作成

```
create-react-app recharts-app
cd recharts-app
```

rechartsをインストール

```
npm install recharts
```
# グラフを描画

単純な折れ線グラフを描画

```js
App.js

import React, { Component } from 'react';
import {LineChart, Line} from 'recharts';

import './App.css';

const data = [
  {name: 'Page A', uv: 4000},
  {name: 'Page B', uv: 3000},
  {name: 'Page C', uv: 2000},
  {name: 'Page D', uv: 2780},
  {name: 'Page E', uv: 1890},
  {name: 'Page F', uv: 2390},
  {name: 'Page G', uv: 3490},
]

class App extends Component {
  render() {
    return (
        <LineChart width={400} height={400} data={data}>
        <Line type="monotone" dataKey="uv" stroke="#8884d8" />
        </LineChart>
    );
  }
}

export default App;

```

```npm start```をすると折れ線グラフが描画されました。


公式の[Examples](http://recharts.org/#/en-US/examples)にいろいろ載っていました。
スプラトゥーン2のステージ情報を取得してみた

今更ながらAlamofireとSwiftyJSONを使用してスプラトゥーン2のステージ情報を取得してみた

# AlamofireとSwiftyJSONを入れる
今回はCarthageを利用

Carthageのインストール

```
$ brew update
$ brew install carthage
```

Cartfileの編集

```:Cartfile
github "SwiftyJSON/SwiftyJSON"
github "Alamofire/Alamofire" ~> 4.7
```

インストール

```
carthage update --platform ios
```


# iksm_session（Cookie）の取得
下記の方法で`iksm_session`を取得
https://qiita.com/valmet/items/1b3960085a8764778bf0

# Alamofireでリクエスト
取得した`iksm_session`を使用してリクエスト

```swift
Alamofire.request("https://app.splatoon2.nintendo.net/api/data/stages", method: .get, parameters: nil, encoding: JSONEncoding.default, headers:
            ["cookie": "iksm_session=\(iksmSession)"]).responseJSON { (response) in
                switch response.result {
                case .success(let value):
                    let json = JSON(value)
                    print(json)
                case .failure(let error):
                    print(error)
                }
        }
```

するとするとこんな感じでjsonが取得できる

```json
{
  "stages" : [
    {
      "id" : "20",
      "name" : "スメーシーワールド",
      "image" : "\/images\/stage\/555c356487ac3edb0088c416e8045576c6b37fcc.png"
    },
    {
      "id" : "16",
      "name" : "モンガラキャンプ場",
      "image" : "\/images\/stage\/e4c4800be9fff23112334b193abb0fdf36e05933.png"
    },
    {
      "id" : "17",
      "image" : "\/images\/stage\/828e49a8414a4bbc0a5da3e61454ab148a9f4063.png",
      "name" : "ショッツル鉱山"
    }...
  ]
}
```
Android testOnly フラグ

# 事象

Android のビルド後の APK を実機にインストールしようとすると、次のようなエラーが発生した。

```sh
$ adb install -d app-debug.apk
adb: failed to install app-debug.apk: Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]
```


# 原因

これは testOnly フラグによるもの。
API level 4 の頃から testOnly フラグは、 AndroidManifest.xml の `application` 要素の `android:testOnly` 属性で設定できる。

testOnly フラグが立っているかどうかは、コード上は以下のように確かめられる。

```kotlin
val applicationInfo = packageManager.getPackageInfo("com.example.app", 0).applicationInfo
val isTestOnly = (applicationInfo.flags and ApplicationInfo.FLAG_TEST_ONLY) != 0
```

ところで、今回は AndroidManifest.xml で特に `android:testOnly` を設定したりはしていないのだが、このエラーが出てきた。

調べたところ、マニフェストファイルで指定する以外に、このフラグが立つ条件があるらしい。
公式の情報も間違っているんじゃないかな、と思う記載があったりして、正確な情報がいまいちわからないんだが、僕が調べた感じだと、以下の場合は testOnly な APK になるようだ。

- Android Studio 3.0 以降の [Run] or [Debug] で直接インストールした際に生成された APK
- `compileSdkVersion` が正式リリース版でない場合 (developer preview SDK、つまり数字ではなくてアルファベットで表される場合 : 今回の場合は `'android-P'`)


# 対応

このエラーを回避するには、2つの方法がある。

1つ目は `adb install` に `-t` オプション (`INSTALL_ALLOW_TEST` フラグ) を付けて実行すること。

```sh
$ adb install -d -t app-debug.apk
```

2つ目は `gradle.properties` に testOnly フラグを無効化するオプションを付けること。

```groovy
android.injected.testOnly=false
```

> References

- [Disable 'testOnly' mode for Android Studio 3.0](https://gist.github.com/xujiaao/5fd127a72979cdc3c70dcc1324786f87)
- [The CommonsBlog — Android Studio 3.0 and FLAG_TEST_ONLY](https://commonsware.com/blog/2017/10/31/android-studio-3p0-flag-test-only.html)
- [android - Google Play error: cannot upload a test-only APK - Stack Overflow](https://stackoverflow.com/questions/43690118/)
- [Android Debug Bridge (adb)  |  Android Developers](https://developer.android.com/studio/command-line/adb#-t-option)
- [Build and run your app  |  Android Developers](https://developer.android.com/studio/run/)
- [Build your app from the command line  |  Android Developers](https://developer.android.com/studio/build/building-cmdline)
- [androidStudio(3.0)でビルドしたapkがインストールできなくなる - Qiita](https://qiita.com/taohaipai/items/cf05d47675781d58a92a)
CUI で Raspberry Pi から Arduino のスケッチを書き込む（platformio）

Raspberry Pi から Arduino へ書き込みできるようにしたので手順書として。
どちらもまだまだ初心者です。

*nix に慣れている方であれば特に詰まることなく作業できるかと思います。

こちらを参考にさせていただきました。
[Raspberry Pi で Arduino のスケッチを書き込む (魔女の一撃)] (http://s-edword.hatenablog.com/entry/2017/02/12/005621)

*GUI を使う方はもっと楽な方法があるようです。。。*
*[Raspberry PiにArduino IDEをインストールする方法 (kosakalab)] (https://make.kosakalab.com/make/electronic-work/inst_arduino-ide_raspi/)*

# 実行時の環境
* Raspberry Pi 3 Model B+
* Raspbian 9.4 (stretch)
* [Arduino 互換機] (https://www.amazon.co.jp/dp/B06Y5TBNQX)

# Raspberry Pi の準備
## 必要なもののインストール
* arduino  
`$ sudo apt-get install arduino`
* python-pip  
`$ sudo apt-get install python-pip`  
実行時の環境ではもともと入ってました。
* platformio  
`$ pip install platformio`

## PATH を通す
platformio コマンドを実行しやすいよう、予め PATH を通しておきます。
`$ export PATH=${PATH}:/home/pi/.local/bin`

PATH が通ったか確認し、次回ログイン時は勝手に PATH が通るようにします。
`$ which platformio`
`$ echo 'export PATH=${PATH}:/home/pi/.local/bin' >> ~/.bashrc`

※which コマンドの結果、見つからなかった場合は platformio が上記とは別の場所にインストールされています。
次のコマンドで見つけ出しましょう。
`$ sudo find / -type f -name 'platformio'`

# Arduino を Raspberry Pi に接続する
USB 接続したら次のコマンドを実行します。
`$ lsusb`

Raspberry Pi が Arduino を認識していれば次のような結果が表示されます。
今回の例では Bus 001 Device 006 に Arduino として認識されていることがわかります。

~~~
pi@raspberrypi:~ $ lsusb
Bus 001 Device 006: ID 2341:0043 Arduino SA Uno R3 (CDC ACM)
Bus 001 Device 004: ID 0424:7800 Standard Microsystems Corp. 
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:~ $ 
~~~

platformio を使って書き込みを行うためには Arduino のデバイスを指定する必要があります。
Raspberry Pi が認識しているデバイスの場所は下記コマンドで確認しておきます。
`$ ls /dev/ttyA*`

次のような結果が表示されます。
今回接続した Arduino は `/dev/ttyACM0` ということがわかりました。
このあたりは環境、特に使用している Arduino または Arduino 互換機によって変わるかもしれません。

~~~
pi@raspberrypi:~ $ ls /dev/ttyA*
/dev/ttyACM0  /dev/ttyAMA0
pi@raspberrypi:~ $ 
~~~

# platformio を使ったスケッチの書き込み
## プロジェクトを作成する
プロジェクトを作成するディレクトリを作成します。
`$ mkdir arduino-led`

プロジェクトのディレクトリへ移動します。
`$ cd arduino-led`

おもむろにプロジェクトを構築します。
`$ platformio init --board=uno`

以降はこのプロジェクトのディレクトリで作業を進めて行きます。

## Arduino の場所を設定ファイルに追記する
`platformio.ini` には Arduino への書き込みに必要な設定情報が保存されています。
次のコマンドで Arduino の場所を設定ファイルに追記します。
`$ echo 'upload_port = /dev/ttyACM0' >> platformio.ini`

追記できたか確認してみましょう。
最後の行に `upload_port = /dev/ttyACM0` と記載されていればおっけーです。
`$ cat platformio.ini`

## スケッチを書く
スケッチはプロジェクトディレクトリの中の `src` の中に保存します。
作ったばかりのプロジェクトでは `src` ディレクトリは空っぽです。
好きな名前でスケッチを作ることができます。
`$ vi src/arduino-led.ino`

L チカするためのプログラムは次のものを使いました。
正しく動けば１秒おきに LED がチカチカします。

~~~c
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}
~~~
これですべての準備が整いました。

## Arduino にスケッチを書き込む
それでは Raspberry Pi から platformio を使って Raspberry Pi へ書き込みましょう。
次のコマンドで書き込むことができます。
`$ platformio run --target=upload`

初回は必要なコンポーネントのダウンロードが行われるので多少時間がかかります。
どうでしょうか、LED は無事チカチカしましたか？
git diffの差分表示の+-を逆向きにする方法

`git diff` で差分表示の方向(+-)を逆にしたいときがたまにあります。

結論からいうと `-R` オプションを使えばおｋです。

## リビジョン間比較: 単に引数の順番を逆にすればよい

ブランチ同士やコミット同士のようにリビジョン間を比較したいなら単に引数の順番を逆にすればよいです。

`git diff a..b`
↓
`git diff b..a`

## ツリーとコミットの比較

`git diff --cached` のようにステージング領域とコミットツリーの比較をする場合、上記の方法は使えません。

このような場合、 `-R` オプションの出番です。

### HEADとステージングを比較
```
git diff -R --cached
```

# 任意のコミットとステージングを比較
```
git diff -R --cached cafebabe
```


## 参考
https://git-scm.com/docs/git-diff#git-diff--R
ヘキサそろばん(16進数)によるビットシフト演算

#ヘキサそろばんによるビットシフト演算
ヘキサそろばんの強みは、計算機のビットパターンをできるだけ忠実に、
そろばんに落とし込んでいるところにあります。

この性質を利用することで、ビットシフト演算を機械的にそろばんで解くことができます。

##例. 0x06 の左ビットシフト
1.まずヘキサそろばんに0x6を入れます
![BitShift_0.png](https://qiita-image-store.s3.amazonaws.com/0/13318/3836d4c4-d563-ac25-6e53-92b049a633d3.png)


2.最上位ビットに注目し、1ビットシフトします
8のビットが立っていたら次の桁の1に移し、4のビットが立っていたら8のビットに移り、2のビットが立っていたら4のビットに移し、1のビットが立っていたら2に移します。
![BitShift_1.png](https://qiita-image-store.s3.amazonaws.com/0/13318/4ed13497-9fe1-8f15-eb0d-e8185cd96971.png)

3.処理し終わったら、次のビットに注目し、またシフトします
![BitShift_2.png](https://qiita-image-store.s3.amazonaws.com/0/13318/0737b2d9-98ca-4faf-b0bc-2747eb0d4540.png)

4.結果 0x06 << 1 = 0x0Cが求まりました

![BitShift_3.png](https://qiita-image-store.s3.amazonaws.com/0/13318/7dcd70cd-454b-9203-7584-90fbf5903560.png)


ちなみに右シフトは、最下位ビットから右へ移していくことで同様に計算できます。
2ビット、3ビットシフトしたい場合は、シフト操作を必要回数連続で行ってください。

また4ビットシフトは、16dの乗算となりそろばんのパターンを機械的に次の桁に移していくことで求まります。
例. 0x06 << 4 = 0x60

5ビット以上のシフトは、一度4ビットや8ビットなど分かり易いシフト操作を行ってから、
残ったビットをシフトすることで求まります。
QnA Makerのあまり知られていない便利機能！ ~製品マニュアルの読み込み~

#はじめに

最近、QnA MakerのGA版がリリースされました。Preview版とGA版では、大きく変わった点がいくつかあるのですが(アーキテクチャ・料金体系・ポータルのデザイン・メタデータの設定etc..)、今回はPreview版の時から実は備わっていたQnA Makerの隠れ便利機能「マニュアルの読み込み」をご紹介したいと思います！

#背景

今年の5月に開催されたMicrosoft Build 2018のセッションをYouTubeで探していたら、たまたまQnA Makerのセッションを見つけました。

https://www.youtube.com/watch?v=4GczYPeg3KQ

このセッションでは、GA版の特徴について話されているのですが、私的に衝撃だったのが「Auto extraction from product manuals」という話でした(9:25辺りから)。

(かなりなまりの強い英語を注意深く聞いてみると、)どうやらGA版になってからの新機能ではないようですが、フォーラムできちんと発表するのは初めて、という内容みたいです。

それが「QnA Makerで製品マニュアルを読み込み、QとAを分類・抽出できる」といった話でした。

一般的にQnA MakerはFAQのChatBot化をしたい時に使われることがほとんどかと思いますが、製品マニュアルをChatBot化できれば、分厚い紙をいちいちめくることなく、簡単に知りたい内容を調べることができますよね！

#実際にやってみた

今回はSurface Bookのユーザーガイド(英語版)を元にKBを作ってみたいと思います。(https://download.microsoft.com/.../surface-book-user-guide-EN.pdf)

(QnA Makerの使い方の説明については省略します。）

きちんとExtractionできました↓

![sampleKB.png](https://qiita-image-store.s3.amazonaws.com/0/267543/d08e68b9-5577-181f-4b78-e4958e0c3c0b.png)


それではテストしてみましょう。

例えば元となるドキュメントの方で、表形式っぽくなっているところがあります。

![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/267543/8a0720b5-15de-5d5d-2f4b-e0b2122b35af.png)

これは当然、きちんとAnswerが返ってくることが分かります。

![sample3.png](https://qiita-image-store.s3.amazonaws.com/0/267543/e5bc3121-a890-adc0-99d9-f4660539df80.png)

では、手順が書いてあるこのような部分はどうでしょうか？

![sample4.png](https://qiita-image-store.s3.amazonaws.com/0/267543/2fcb2159-b845-895c-242b-41a3c792869a.png)

こういった部分も、きちんと回答を返してくれます！

![sample5.png](https://qiita-image-store.s3.amazonaws.com/0/267543/20d69c40-4fad-071c-6279-c58047df4b41.png)

これは、とてもすごいですよね！

#現状

~~このマニュアル読み込みですが、日本語のマニュアルは(私がやった限り)できませんでした。~~

~~以下のサイトにも書いてあるのですが、現状では高確率でQ&Aの抽出を行うことのできる言語が英語・フランス語・イタリア語・ドイツ語・スペイン語の5カ国語しかないようです。~~
(https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/overview/languages-supported)

~~日本語がサポートされれば、このマニュアル読み込みの機能はかなり便利だと思うので、今後に期待ですね！~~

2018年10月に日本語マニュアルの読み込みが出来るようになりました！

#まとめ

FAQのChatBot化を主の目的として、様々なユーザに利用して頂いているQnA Makerですが、実はあまり知られていない便利機能ということで、今回は「マニュアルの読み込み」をご紹介しました。

何ページにもわたる製品マニュアルから、知りたい情報を得るのって結構大変ですよね。

今回紹介した機能を使えば、かなり便利なサービスを作れること間違いなしです。

日本語の抽出精度がより向上したら、この機能の価値はますます上がると思います！

皆さんも是非、試してみてください。
(En Uygun) Rize GünüBirlik Tur: Ayder 40, Karagöl 50, Batum 50, Uzungöl 40

Rize GünüBirlik Turlar'da en uygun ve ucuz tur fiyat garantisiyle 0538 700 53 83 numaralı telefondan bize ulaşarak yerinizi ayırtabilirsiniz. Rize merkez çıkışlı turlarda 2018 yılında da en iddalı firma olduğumuzu belirtmek istiyoruz. Türkiye'nin en hızlı tur sitesinin en cazip Günübirlik Turlar ve Kültür Turları seçenekleri en avantajlı ve en çeşitli fiyat seçenekleriyle sizleri bekliyoruz.
---------------------------------------------------
BLOG ADRESİMİZ: https://rizetours.blogspot.com/
---------------------------------------------------
Ayder Turu 40 TL, Karagöl Turu 50 TL, Batum Turu 50 TL, Uzungöl Turu 40 TL, dahası için web sayfamızı ziyaret ediniz, vaya 0538 700 53 83 telefondan bize ulaşınız.
---------------------------------------------------
WEB ADRESİMİZ: http://www.rizetours.blogspot.com/
---------------------------------------------------
Visual Studio CodeでRubyによるExcel操作環境を作る

これまでPythonでExcelを操作するということをやってきましたが
業務でRuby(RonR)を利用することとなりましたので練習がてらにVSCodeに
環境を作ってExcelを操作するプログラムを作っていきます。


因みにRubyは全くの初心者です、徐々に慣れていればと思っています。

#とりあえず入れた拡張機能はこれ

全然Rubyとは関係ないが

[Qiita謹製のvscodeのテーマ](https://marketplace.visualstudio.com/items?itemName=Increments.qiita)
エディタの配色は重要といいうことで追加、結構お気に入りです。

#ターミナルからVSCodeを開けると便利

1. Command + Shift + P
2. Shell
3. インストール

<img width="873" alt="スクリーンショット 2018-06-30 13.38.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/202764/39fc5ed0-6754-a260-0dce-01d3cfd4a1bd.png">


```
$code file_name/folder_name
```

でターミナルから指定したファイル/フォルダをVSCodeから開くことができます。
これは意外と便利です。

#Rubyの拡張機能をインストールしてみる

###デバッガとか
[Ruby拡張](https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby)

###コード補完
[solargraph](https://marketplace.visualstudio.com/items?itemName=castwide.solargraph)

```
 gem install solargraph
```

#プログラムを止めてみる

エディタ左部のパネルから虫のアイコンをクリックするとデバックモードになる。
歯車のアイコンをクリックしてRubyデバックのlanch.jsonを作成する。

<img width="598" alt="スクリーンショット 2018-06-30 14.43.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/202764/7adad34b-d5b6-d1a3-2ef1-2f581fadc698.png">

歯車アイコン左隣のプルダウンから適用したいデバック設定を選択して
実行ボタンをクリックすればプログラムがデバック実行される。
デフォルトだとワークスペース内のmain.rb

実行を一旦停止したい箇所にブレークポイントを設置すればプログラムを停止させる事ができる。

#Excelを操作してみる

## roo
RubyでExcelを読み込む機能を提供するGem「roo」
を利用してみる。
[roo:Github](https://github.com/roo-rb/roo)

```
 $gem install roo
```
読み込むExcelファイルの内容
<img width="591" alt="スクリーンショット 2018-06-30 15.59.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/202764/ae97b8a8-1232-da1a-69e9-d74591a43052.png">


``` main.rb

require 'roo'

xlxs = Roo::Excelx.new('./sample.xlsx')
xlxs.sheets.each{ | sheet |
  puts xlxs.sheet(sheet).row(1) #対象シートの１行目を表示
  puts xlxs.sheet(sheet).column(1) #対象シートの１列目を表示
}

#retult 
## row
# 1
# 2
# 3
# 4
# 5
# 6
## column
# 1
# 1
# 1
```

#RubyMineも試してみたい
Ruby開発をする環境は[RubyMine](https://www.jetbrains.com/ruby/)など
あるのでいろいろ試し比較していきたい。
開発環境はDockerを利用しているのでエディタからDockerをコントロールできる環境も調査して試してみようかと思う
df.hist() でカテゴリ変数をプロットする

# 何がしたかったか
pd.DataFrameに含まれるカテゴリ変数の情報を、パッと可視化したかった。

確かに.describe()でだいたいわかる。でも目で見たかったんだ、、、


# df.hist（というかplot関数は）カテゴリ変数を描画しない
df.hist??から抜粋

``` .py
def hist_frame(data, column=None, by=None, ...):
    _converter._WARN = False
    if by is not None:
        axes = grouped_hist(data, column=column, by=by, ...)
        return axes

    if column is not None:
        if not isinstance(column, (list, np.ndarray, Index)):
            column = [column]
        data = data[column]
    data = data._get_numeric_data() # 数字だけ！！！
    naxes = len(data.columns)

    fig, axes = _subplots(naxes=naxes, ax=ax, squeeze=False,
                          sharex=sharex, sharey=sharey, figsize=figsize,
                          layout=layout)
    // Omitted
    return axes
```


`data = data._get_numeric_data()`！！！！！！

# だがしかし
カラムを指定すると使えるっぽい。

Titanic.Embarked.hist??より抜粋
（Titanic.Embarkedがpdのカラムでカテゴリ変数になってる）

``` .py
def hist_series(self, by=None, ax=None, grid=True, xlabelsize=None,
                xrot=None, ylabelsize=None, yrot=None, figsize=None,
                bins=10, **kwds):
    import matplotlib.pyplot as plt

    if by is None:
        if kwds.get('layout', None) is not None:
            raise ValueError("The 'layout' keyword is not supported when "
                             "'by' is None")
        # hack until the plotting interface is a bit more unified
        fig = kwds.pop('figure', plt.gcf() if plt.get_fignums() else
                       plt.figure(figsize=figsize))
        if (figsize is not None and tuple(figsize) !=
                tuple(fig.get_size_inches())):
            fig.set_size_inches(*figsize, forward=True)
        if ax is None:
            ax = fig.gca()
        elif ax.get_figure() != fig:
            raise AssertionError('passed axis not bound to passed figure')
        values = self.dropna().values

        ax.hist(values, bins=bins, **kwds)
        ax.grid(grid)
        axes = np.array([ax])

        _set_ticks_props(axes, xlabelsize=xlabelsize, xrot=xrot,
                         ylabelsize=ylabelsize, yrot=yrot)

    else:
        if 'figure' in kwds:
            raise ValueError("Cannot pass 'figure' when using the "
                             "'by' argument, since a new 'Figure' instance "
                             "will be created")
        axes = grouped_hist(self, by=by, ax=ax, grid=grid, figsize=figsize,
                            bins=bins, xlabelsize=xlabelsize, xrot=xrot,
                            ylabelsize=ylabelsize, yrot=yrot, **kwds)

    if hasattr(axes, 'ndim'):
        if axes.ndim == 1 and len(axes) == 1:
            return axes[0]
    return axes
```


`titanic.Embarked.hist()`で、無事プロットできた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/119807/047daebc-c915-9c8f-3cf1-fd19f5ef941c.png)


以上。
mysql - SQLメモ

- 16進数で登録されているデータを変換する

```sql
select
  cast(columne_name as CHAR) as columne_name
from
  tbl_name
```

- 日付データをINT型で登録

```sql
insert into tbl_name (columne_name) values (UNIX_TIMESTAMP('2011-01-01');
select FROM_UNIXTIME(column_name) from tbl_name;
```
Web系のエンジニアに転身して2ヶ月間で覚えたこと

## プロローグ

11年ちょっとのレガシーシステムのエンジニアから、Web系エンジニアに転身して2ヶ月が過ぎたところで、色々なことを覚えたので、書き留めておく。

Web系のエンジニアになりたいレガシーシステムのエンジニアに役に立つと思う。しらんけど。

## 自分の得意なことに気づいたこと。

ドメイン駆動設計の分厚い本を電子書籍版で購入したり、自宅にまともなPCをがなかったので、HP Spectre x360(Win10Pro メモリ16GB)を購入。タッチパネルやスタイラスペンに触れてみたりしたことで、何故かその2つがつながって、自分の得意なことに気づいた。

「あ、図で書けば、理解できるのか！」💡

それは、自分が理解したことはすべて概念（イメージ）で認識しているということ。平たく言えば、右脳派なのだろうか。途中で飽きる2時間の打ち合わせより1枚の図のほうがすべてが理解できる。

そういえば自分は新しいプロジェクトに入ると、システムが頭の中で絵になった瞬間、思い立ったように開発に没頭していた。作ったものが頭の中で絵になっているため、修正なんかも不思議なほど早いらしい。自分にとっては別にすごいことをやっている自覚はまったくないのだが、、、。

新しいことを覚えるときは、ドキュメントを読みつつ、図を自分で書きながら、覚えることにした。ときにその図は頭の中で描かれる。これを意識し始めたら、新しいことを覚えるのが楽になった気がする。

## フレームワークはとにかく開発が早い。・・・が

Web系のフレームワークをまともに触ったのは、これが初めてというわけではないが、モダンなフレームワークは初めてだったので、色々とおぼえながら、進めていった。ちなみに既に2つほどシステムをこさえたが、両方ともLaravel5.6採用であった。

Laravel楽しいよLaravel⭐

最初に感じたのは、フレームワークの道のりに沿っていれば、めちゃくちゃ簡単に開発できるということ。しかし、変わったことをしようとすると、遠回りしてフレームワークの仕組みを回避して自作するか、フレームワークの理解を深めた上で、最適なコーディングを行うかの選択に迫られる。

もちろん後者が良いに決まっている。しらんけど。難問にぶつかったときに最適な方法は、「英語で検索する」だ。（笑）。つまり、まずは英語のドキュメントやQAが読めれば、大抵の問題はクリアできる。知らんけど。

## サーバーも今風にAWSなど使ってみた

誰に教えてもらってってわけでもないが、AWSでtomcatのWebサーバー立てたり、Webサイト作ったりした。一昔前ならサーバー機を物理的に購入して高額な投資が必要だったことも、今ではクレジットカードと少しのお金があればできるという素晴らしい時代だ。

AWSでEC2に環境を作るだけなら、Linuxなりの知識があれば誰でもできる。問題はインフラが自由度が高いがゆえの、最初の設定の複雑さかなと思う。インフラ設定のテンプレートみたいなのがもう少し使えれば良いのかもしれない。

・・・しかし、なんでもCloudにすると、可用性があがって、自宅PCのHDDが壊れて泣くことはなくなるが、ひとたびネットワークが使えなくなると、なんにもできなくなるなあ。

## 今後やりたいこと

個人的にエンジニア向けのツールで作りたいものがあるとの、近所の農家の支援システムを作りたい（笑）
実行中のカーネルを飛ばします


古いカーネルを掃除しているときに、勢い余ってしまったんだけど、実行中のカーネルは消さないみたい。
``rm -fr /`` をブロックしてくれる奴とおなじかんじですね。感謝。


```bash
$ env LANG=C sudo yum remove kernel-3.10.0-862.3.3.el7.x86_64
Loaded plugins: etckeeper, fastestmirror, priorities
Skipping the running kernel: kernel-3.10.0-862.3.3.el7.x86_64
No Packages marked for removal
```
参考リンク

# python
* [Python入門](https://www.pythonweb.jp/tutorial/)

# electron
* [最新版で学ぶElectron入門 \- HTML5でPCアプリを開発する利点と手順 \- ICS MEDIA](https://ics.media/entry/7298)
* [テキストエディターを作ってElectronの基礎を学ぼう！ HTML5でPCアプリ開発入門 \- ICS MEDIA](https://ics.media/entry/8401)

# .net core - c#をmacで
* [Documentation for Visual Studio Code](https://code.visualstudio.com/docs/?dv=osx)

# Azure IoT Edge
* [Azure IoT Edge \+ Linux クイック スタート \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/iot-edge/quickstart-linux)
  * [IoT Azure Edge ContextualVersionConflict: pyOpenSSL \- Stack Overflow](https://stackoverflow.com/questions/50198767/iot-azure-edge-contextualversionconflict-pyopenssl) 
* [Azure IoT Edge C\# モジュール \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/iot-edge/tutorial-csharp-module)
【Ethereum】UbuntuにSolidityのIDE(Remix)をインストールする※install.sh付き

# 1．Remix IDE（Browser-Solidity）とは
Remixとはスマートコントラクトを開発する際に使用するIDE（統合開発環境）のことです。

Ethereumのスマートコントラクトの開発時には、主にSolidityという言語が使用されるんですが、ソースのコンパイルからブロックチェーンネットワークにコントラクトをデプロイするまでの全ての工程をRemixで行うことが可能となります。

そのため、Ethereumのスマートコントラクトを開発する際に、Remixの導入は必須と言ってもいいかと思います。

ちなみにクラウド版とインストール版が存在しますが、ソースコードが手元に保存されないのが怖いので、インストール版を推奨します。
クラウド版URL: https://remix.ethereum.org



# 2．環境
- Ubuntu v16.04
- Node.js v8.11.3
    - nvm v0.33.11
    - npm v5.6.0
- geth v1.8.8


# 3．Node.js周りのインストール
まずはnvm（Node Version Manager）を利用して、Node.js周りをインストールしていきます。

```bash:nvm-install
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

# curl実行後、bash_profile OR bashrcにnvmへのPATHが記載されるので、読み込ませてPATHを通します
$ source ~/.bashrc

# インストールが成功していればバージョンが表示される
$ nvm --version
0.33.11
```

nvmのインストール後、Node.jsとnpm（Node Packaged Modules）をインストールしていきます。

```bash:nodejs-install
$ nvm install v8.11.3

# インストールが成功していればバージョンが表示される
$ node --version
v8.11.3

$ npm --version
5.6.0
```

これでNode.js周りのセットアップは完了です。


# 4．Remixのインストール
続いて、いよいよRemixのインストールに入っていきます。
Remixは以下のGithubレポジトリにあります。
→ https://github.com/ethereum/remix-ide

```bash:remix-install
$ git clone https://github.com/ethereum/remix-ide.git
$ cd remix-ide
$ npm install
$ npm run setupremix
```

このとき、Node.jsとnpmのバージョンは完全に合わせるように注意してください。
バージョンが古いとRemixがエラーで起動できず、結構深い闇にハマります。（ハマりました）

最後にRemixを起動し、以下へアクセスできたら終了となります。
http://localhost:8080

```bash:remix-start
$ npm start
```

# 5．インストール用シェルを作成しました
大した量ではありませんが、Remixインストールのためのインストール用シェルを作成しました。
こちらを使って楽にインストールしてみてください。

```bash:remix-install.sh
#!/bin/sh

# node.jsがなければインストール
if ! type node > /dev/null 2>&1; then
    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
    source ~/.bashrc

    nvm install v8.11.3
fi

# remixのインストール
git clone https://github.com/ethereum/remix-ide.git
cd remix-ide
npm install
npm run setupremix
```




# 参考文献
- [remix-ide](https://github.com/ethereum/remix-ide)
- [EthereumのコントラクトをRemix（旧browser-solidity)で開発する](https://tomokazu-kozuma.com/develop-ethereum-contract-with-browser-solidity/)
- [#15 Remix(Browser-Solidity)をインストールする] (https://qiita.com/Hitoshi5858/items/0df1f0bc5d297729ea59)
Flutter DemoアプリをBLoCパターンで書き直してみた

Flutterアプリの新規作成時にできているでもアプリをBLoCパターンで書き直してみました。
BLoCの詳しい説明はここ
https://www.youtube.com/watch?v=PLHln7wHgPE&app=desktop

## BLoCパターンとは
BLoCとはBusiness Logic Componentの略で、BLoCを使ったアプリの実装パターンをblocパターンと呼ぶ。
コンポーネントと言っても、viewを構築するコンポーネントではなく、「ひとかたまりの要素」という意味でのコンポーネントである。 

以下の方針に従って開発を進めればBLoCパターンであると言える。

- BLoCの入出力インターフェースはStream,Sinkでやる
- BLoCの依存は注入可能で環境に依存しない
- BLoC内に環境ごとの条件分岐は持たない
- 以上のルールに基づくなら実装は自由

## BLoCで実装
新規作成時にできている以下のアプリをBLoCパターンにしていく

<img width="366" alt="スクリーンショット 2018-06-30 21.42.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/175962/7633ee32-7450-4181-1a7d-23deffde98ae.png">

```main.dart
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:rxdart/rxdart.dart';

// BLoCオブジェクト作成
class CounterBloc {
  StreamController counterAdditionController = StreamController();
  Sink get counterAddition => counterAdditionController.sink;

  BehaviorSubject<int> _count = BehaviorSubject<int>(seedValue: 0);
  Stream<int> get countString => _count.stream;

  CounterBloc(){
    counterAdditionController.stream.listen( (addition) {
      _count.add(_count.value + 1);
    });
  }
}

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  String title;

  MyHomePage({this.title});
  CounterBloc counterBloc = CounterBloc();

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(title),
      ),
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            new Text(
              'You have pushed the button this many times:',
            ),
            // データストリームから現在のカウントを取得
            StreamBuilder<int>(
              stream: counterBloc.countString,
              builder: (context, snapshot) =>
                  Text(
                    snapshot.data.toString(),
                  ),
            ),
          ],
        ),
      ),
      floatingActionButton: new FloatingActionButton(
         // ボタンが押された時Streamに通知
        onPressed: () => counterBloc.counterAddition.add(null),
        tooltip: 'Increment',
        child: new Icon(Icons.add),
      ),
    );
  }
}
```
ReactのFragmentについて3分でさっと理解

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)

Fragmentはシンタックスシュガーだ。returnで一つの要素しか渡せないという制約を外してくれる。
要するにjsxのネストを浅くするので、デザイン崩れとかの時に使えるとかっこいい。


### Fragmnentの説明

よくあるパターンとして

```react
class Table extends React.Component {
  render() {
    return (
      <table>
        <tr>
          <Columns />
        </tr>
      </table>
    );
  }
}
```

```react
class Columns extends React.Component {
  render() {
    return (
      <div>
        <td>Hello</td>
        <td>World</td>
      </div>
    );
  }
}
```
のようなパターンがある。
このパターンの問題はreturnに複数のtdタグを渡せないので、tdタグをdivで囲っていることだ。

つまり結果として

```html
<table>
  <tr>
    <div>
      <td>Hello</td>
      <td>World</td>
    </div>
  </tr>
</table>
```

という形に出力される。不必要なdivが入ってしまっている!

そこでfragmentの出番だ。子要素をdivで囲う代わりにfragmentで囲ってやる。

```react
class Columns extends React.Component {
  render() {
    return (
      <React.Fragment> // <React.Fragment>の代わりに<>で代用もできる
        <td>Hello</td>
        <td>World</td>
      </React.Fragment>
    );
  }
}
```

そうすると

```html
<table>
  <tr>
    <td>Hello</td>
    <td>World</td>
  </tr>
</table>
```
のように出力される。不必要なdivが消えました！
それだけ。使いどころがあまりない。style崩れを直す時に、ワンポイントで使うぐらい。


keyを使うこともできる。（mapと一緒に使うときなど。）

```react
function Glossary(props) {
  return (
    <dl>
      {props.items.map(item => (
        // Without the `key`, React will fire a key warning
        <React.Fragment key={item.id}>
          <dt>{item.term}</dt>
          <dd>{item.description}</dd>
        </React.Fragment>
      ))}
    </dl>
  );
}
```

尚、私の愛するreact nativeでは、


ショートハンドの
<>
は使えず、

```
<React.Fragment>
```
のみ使える。
goのgovmomiでESXiのNIC情報を自動取得するZabbixのLLDツールを作ってみた

Goの勉強で [govmomi](https://github.com/vmware/govmomi) を使ってESXiの物理NIC情報を取得してZabbixのLLDで監視を自動登録するツールを作ってみました。

# 作った背景

Zabbixは標準でVMwareのESXiホストをLLDで自動登録することができるのですが、VMwareの監視アイテムをLLDで自動登録するキーは少なく手動で登録する必要がありました。
数が少ないと問題ないのですが、動的にホストが増減するようなシステムだと非効率のためGoのお勉強がてらまずはESXiホストの物理NIC情報を取得してLLD登録するツールをGoで作ってみました。

# vmware_esxi_nic_lld

[https://github.com/sky-joker/zabbix-go-monitoring-tools/tree/master/vmware_esxi_nic_lld](https://github.com/sky-joker/zabbix-go-monitoring-tools/tree/master/vmware_esxi_nic_lld)

# 検証環境

|   項目  | バージョン |
|---------|------------|
| OS      | RHEL7.5    |
| Zabbix  | 3.4        |
| govmomi | 0.18.0     |

# 使い方

(1) [ここ](https://github.com/sky-joker/zabbix-go-monitoring-tools/tree/master/vmware_esxi_nic_lld)の手順でビルドします。

(2) Zabbixサーバまたはプロキシにツールをアップロードします。

```
$ scp vmware_esxi_nic_lld root@zabbix34:
$ ssh root@zabbix34
# cd /usr/lib/zabbix/externalscripts
# mv ~/vmware_esxi_nic_lld .
# chmod +x vmware_esxi_nic_lld
# ./vmware_esxi_nic_lld -h
NAME:
   vmware_esxi_nic_lld - Get physical nic name of esxi

USAGE:
   vmware_esxi_nic_lld URL UserName Password Uuid Datacenter

COMMANDS:
     URL         URL for vCenter sdk(ex:https://vcenter/sdk)
     UserName    vCenter user
     Password    vCenter user password
     Uuid        ESXi uuid
     Datacenter  Datacenter name(optional)
     help, h     Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h  show help
```

(3) [テンプレート例](https://github.com/sky-joker/zabbix-go-monitoring-tools/blob/master/vmware_esxi_nic_lld/example_zbx_templates.xml)をダウンロードしてZabbixへインポートします。

(4) ZabbixのLLDで自動ESXiホストを追加するのではなく手動登録する場合は `ホスト名` に `uuid` を指定します。

![スクリーンショット 2018-06-30 21.04.50.png](https://qiita-image-store.s3.amazonaws.com/0/180118/36deee7f-ccd8-1c31-5f3c-607f81cce4b5.png)

ESXiホストのuuidを確認するには以下のページを参照ください。

[https://qiita.com/sky_jokerxx/items/e14455bfd51295d1d1e7#zabbixに監視登録をする](https://qiita.com/sky_jokerxx/items/e14455bfd51295d1d1e7#zabbixに監視登録をする)

**上記で紹介しているツールの使用例**

```
$ ./mob-property-view.py -vc 192.168.0.253 --mob HostSystem -t esxi-07.local --property summary | grep uuid
Password:
      uuid = '00000000-0000-0000-0000-ac1f6b1e8888',
```

(5) `マクロ` は以下のように登録します。

![スクリーンショット 2018-06-30 21.11.46.png](https://qiita-image-store.s3.amazonaws.com/0/180118/5a2dbfef-800b-2391-9459-4720b7247454.png)

|     項目    |                    説明                   |
|-------------|-------------------------------------------|
| {$URL}      | vCenterのSDK URL                          |
| {$USERNAME} | vCenterへログインするユーザー名           |
| {$PASSWORD} | vCenterへログインするユーザーのパスワード |

これで、ESXiホストのNIC情報をLLDで取得し登録することができます :)

![スクリーンショット 2018-06-30 21.23.22.png](https://qiita-image-store.s3.amazonaws.com/0/180118/421effff-5d2c-2c32-553a-b88d0e55209c.png)