OmniAICreator/Qiita-1.07M huggingface dataset:
Githubのメモ

# パーマリンク

下の画像のような感じでコメント中にコードを展開するやつ。レビューでたまに見かけて「わかりやすい！　真似したい！」と思うのだが意外とやり方を知らないとできない。

![rendered-code-snippet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10508/6b598c44-4b93-894e-524a-9a03b3d3d7e8.png)

やり方は[こちら](https://help.github.com/en/github/managing-your-work-on-github/creating-a-permanent-link-to-a-code-snippet)。

# ショートカット

[一覧](https://help.github.com/ja/github/getting-started-with-github/keyboard-shortcuts) には色々書かれているが自分が使うものをまとめる。

プルリクエスト画面で

| キー | 動作 |
|-----|-----|
| `q` | レビュアーを編集 | 
| `l` | ラベルを編集 |
| `t` | ファイルを選択 |  
| `i` | レビューコメントを隠す |

編集を終えるときは ESC 押してから編集と同じキーを押す。
[GitHub] まだ PR レビューで『typo』ってコメントしてるの？（Suggestion機能で修正提案する）

## Tl;Dr
**Suggestion（Cmd + g）** で修正提案のコメントができ、
![308E350C-20B2-4B48-B563-C23C53DC5869.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29653/5ec443b9-b353-76bd-0fb8-febd4fba781b.png)

取り込む人は diff を確認し、 **Commit suggestion** からボタン一つでコミットして取り込める。
![7D9AF6A1-B320-40B3-97C7-0D82BBB98B85.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29653/9b8b4b6e-5e43-1857-925b-486d9062ce9b.png)

**追記：2020/02/27**
まだ、ベータ段階だが[複数行の修正提案にも対応](https://github.blog/changelog/2020-02-26-multi-line-code-suggestions-beta/)された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29653/b87da3c5-cd40-9132-fd37-b18243905de3.png)

## Suggestion Change
冒頭のように`suggestion`をつけたコード形式で記述すると、修正提案という形でコメントできる。

単純な`typo`であればこのままコメントしても伝わるだろうし、補足したいことがあれば冒頭のように説明を追加することも出来る（これが適切な例かは別として）。

取り込む人は diff を確認してボタン一つでコミットできるし、レビュアーは自身のコメントが取り込まれていることを確認するだけでよいので、双方の負担軽減につながる。

## コミットをまとめる
特に Push トリガーで CI を実行している場合において、複数の修正提案を一つずつコミットすると、コミット単位で CI が実行されてしまい煩雑なことがある。

その場合は **Add suggestion to batch** からコミットをまとめることができ、
![CF21E86F-C549-45B9-B6F1-C68318730BBF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29653/f2460a0a-1ff7-06bd-ab42-c9c2098f7556.png)

**Commit suggestions** からコミットできる。
![728E231B-A62D-4166-AFBB-DC3F34B8E87D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29653/4aad9ac2-dd9e-4da1-5a3a-2c93fb4fa640.png)

## 補足
この機能に限った話ではないが、リモート側でコミットされるので、ローカルでも合わせて修正をする場合は `git pull` するのを忘れないようにする必要があるので注意。

もし修正がコンフリクトしないなら `git pull --rebase` が手っ取り早い。

## 終わりに
この内容に相当する記事は、半年くらい前に会社の Qiita::Team でも書いており、Qiita にも書こうと思いながら半年以上も経過してしまった；

*レビューイ・レビュアーの双方の負担を減らす、良き PR レビューライフを。*
Raspberry+am2302温湿度センサーで温湿度を計測する

# GPIOに繋がる
https://github.com/adrianlois/RaspberryPi-sensor-dht22-am2302-thingspeak を参考して
am2302温湿度センサーをraspberry piのGPIOに繋がる。

# Pythonの設置
pip install --upgrade pip setuptools wheel
pip install Adafruit_DHT

**Adafruit_DHTはpython2とpython3両方対応しています**

# python code

AdafruitDHT.py

```py

import sys
import Adafruit_DHT


sensor_args = { '11': Adafruit_DHT.DHT11,
                '22': Adafruit_DHT.DHT22,
                '2302': Adafruit_DHT.AM2302 }
if len(sys.argv) == 3 and sys.argv[1] in sensor_args:
    sensor = sensor_args[sys.argv[1]]　#センサーのタイプー
    pin = sys.argv[2] #GPIOのpinナンバー
else:
    print('Usage: sudo ./Adafruit_DHT.py [11|22|2302] <GPIO pin number>')
    print('Example: sudo ./Adafruit_DHT.py 2302 4 - Read from an AM2302 connected to GPIO pin #4')
    sys.exit(1)

humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

if humidity is not None and temperature is not None:
    print('Temp={0:0.1f}*  Humidity={1:0.1f}%'.format(temperature, humidity))
else:
    print('Failed to get reading. Try again!')
    sys.exit(1)
```
# 実行

```
python AdafruitDHT.py 2302 4

```
`require': dlopen(~ mysql2): Library not loaded: /usr/local/opt/openssl@1.1/lib/libssl.1.1.dylib (LoadError)

# 0. 問題

`rails server` が立ち上がらず、以下のようなエラーが出る。

```
$ rails s
/Users/yokoto/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/mysql2-0.4.5/lib/mysql2.rb:31:in `require': dlopen(/Users/yokoto/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/mysql2-0.4.5/lib/mysql2/mysql2.bundle, 9): Library not loaded: /usr/local/opt/openssl@1.1/lib/libssl.1.1.dylib (LoadError)
  Referenced from: /Users/yokoto/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/mysql2-0.4.5/lib/mysql2/mysql2.bundle
```

どうやら、 `openssl@1.1` 、 `libssl.1.1` 、 `mysql2-0.4.5` あたりに問題がありそう。


# 1. 環境

```bash
$ openssl version
LibreSSL 2.8.3
```
> MacのHigh Sierraから、デフォルトのOpenSSLがOpenSSLからLibreSSLになっている

らしく、OpenSSL依存のライブラリが問題を起こしていらしい。
ちなみに自分の環境は、

- macOS Catalina バージョン10.15.1

### 参考リンク

+ [macOS High Sierra（OSX）のOpenSSLをデフォルトのLibreSSLからOpenSSLに変更する](https://qiita.com/moroi/items/53d60d1d6885795a0f6f)

# 2. 解決方法

## 1. mysql2 gemのアンインストール

```bash
$ gem uninstall mysql2
```

## 2. opensslのインストール

```bash
$ brew install openssl
```

次が重要。上記の出力で、

```
...
openssl@1.1 is keg-only, which means it was not symlinked into /usr/local,
because openssl/libressl is provided by macOS so don't link an incompatible version.

If you need to have openssl@1.1 first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.bash_profile

For compilers to find openssl@1.1 you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
  export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"

For pkg-config to find openssl@1.1 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"
```

とあるので、これに従い、

```bash
$ echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.bash_profile
$ export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
$ export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
$ export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"
```

`bash_profile` の再起動を忘れずに。

```bash
$ . ~/.bash_profile
```

## 3. mysql2 gemのインストール

OpenSSLを使ってインストールする必要がある。

### グローバルにインストール

```bash
$ gem install mysql2 -v 0.4.10 -- --with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib
```

### bundlerを使ってインストール

```bash
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle install
```

### 参考リンク

+ [rake db:migrate error with mysql2 gem - Library not loaded: libssl.1.0.0.dylib
](https://stackoverflow.com/questions/51264240/rake-dbmigrate-error-with-mysql2-gem-library-not-loaded-libssl-1-0-0-dylib)

# 3. 結果

```
$ rails s
=> Booting Puma
=> Rails 5.1.0 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.8.2 (ruby 2.4.1-p111), codename: Sassy Salamander
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
```

よかった。
MySQLの複数バージョンの衝突対処法

# 目的
MySQL8を入れた後に「初心者は8ではなく5.7を使った方がいい」という旨の記事を読み，後追いで5.7を入れたところ衝突が起きたのか`mysql server.start`などをしても毎回エラーが起きるようになってしまった．
これを解決し，5.7をインストールしたい．

# とにかくアンインストール

```
$ sudo rm -rf /usr/local/mysql
$ sudo rm -rf /Library/StartupItems/MYSQL
$ sudo rm -rf /Library/PreferencePanes/MySQL.prefPane
$ sudo rm -rf /Library/Receipts/mysql-.pkg
$ sudo rm -rf /usr/local/Cellar/mysql*
$ sudo rm -rf /usr/local/bin/mysql*
$ sudo rm -rf /usr/local/var/mysql*
$ sudo rm -rf /usr/local/etc/my.cnf
$ sudo rm -rf /usr/local/share/mysql*
$ sudo rm -rf /usr/local/opt/mysql*
```

とにかく消す．エラーを見ずに解決するなんて邪道だが，初心者のうちは成功体験を積むためにとにかく短時間で先に進むことを目的とする．

# 再びインストール

```
$ brew install mysql@5.7
```
Invoke-Gherkin 使おうとすると ConvertFrom-Json の部分でエラーが出るときのワークアラウンド

# PesterでInvoke-Gherkin使おうとしたらエラーが出て使えない

* Pester でも Gherkin でテスト書いて動かせるようになってるじゃん! すげえ! ということで試そうとしたら動かなかったので、動かす作業メモ。

## 環境
* ```Windows10 (Microsoft Windows [Version 10.0.17763.805])```
    * 日本語版
* ```PSVersion 5.1.17763.771```
* ```Pester v4.10.1```

# 現象
* feature fileと step file 作って動かすと、次のようなエラーが出る。

```
> Invoke-Gherkin
Pester v4.10.1
Testing all features in 'C:\foo\bar\features'
ConvertFrom-Json : ',' ではなく無効な配列が渡されました。 (2589): {
  "af": {
(略)
```

# 動いた方法

* Install-Module Pester して入った場所の ```C:\Program Files\WindowsPowerShell\Modules\Pester\4.10.1\lib\Gherkin\gherkin-languages.json``` を BOM付きのUTF-8に書き直したら動くようになった。

# ダメだった方法

* Gherkin.ps1 に ```Get-Content``` してる部分があるが、それを ```Get-Content -Encoding UTF8``` にしても動作に変化がなかった。
* 何か直し方間違ってるのだろうか。

# feature と Steps ファイル
* 英語以外はやはりfeatureファイルはBOM付きのUTF-8にするかしないと次のようなエラーが出て動かせない。
* 日本語ならSteps はShift-JISでもよい。

```
> Invoke-Gherkin
Pester v4.10.1
Testing all features in 'C:\foo\bar\features'
Invoke-GherkinFeature : Skipped 'C:\foo\bar\features\baz.feature' because of parser error.
発生場所 C:\Program Files\WindowsPowerShell\Modules\Pester\4.10.1\Functions\Gherkin.ps1:290 文字:13
+             Invoke-GherkinFeature $FeatureFile -Pester $pester
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], MethodInvocationException
    + FullyQualifiedErrorId : System.Management.Automation.MethodInvocationException,Invoke-GherkinFeature
```
yyyymmddが正しい日付かチェックする

## 日付の文字列が正しいか判断するのに正規表現を使った複雑な比較もあるが、dateコマンドを使うのが一番楽かな。。。
```
$ date +%Y%m%d -d 20190230
date: '20190230' は無効な日付です
$ date +%Y%m%d -d 20190229
date: `20190229' は無効な日付です
$ date +%Y%m%d -d 20200229
20200229
$ date +%Y%m%d -d abcd
date: `abcd' は無効な日付です
```
元のyyyymmddとdateコマンドを通した後のyyyymmddを比較して一致してたら正しい日付

```
A=20200218
B=$(date +%Y%m%d -d $A 2>/dev/null)
if [ "$A" = "$B" ]; then
    echo "correct date"
else
    echo "incorrect date"
fi
```
AWSのEC2(仮想サーバ)環境構築

#まずどこに環境を置くか
AWSはクラウド上であるため、世界中のどこにでも自分の環境を構築できる。それらの中でどのリージョンのどのアべイラビリティゾーンに設置するのかをまずは検討しなければならない。
####リージョン
世界中のあらゆる拠点のこと。例えば日本だと「東京リージョン」がある。
####アベイラビリティゾーン
実際にサービスを提供する拠点となるデータセンターのこと。
例えば、東京リージョンならばA地域のデータセンターとC地域のデータセンターがある。

#EC2
AWSで提供している仮想サーバがEC2(Elastic Compute Cloud)である。
EC2のファイアウォール機能としてセキュリティグループという機能がある。

#VPC領域の確保
EC2は**VPC(Virtual Private Cloud)**と呼ばれる領域のさらに細分化した**サブネット**と呼ばれる領域内に設置される。
先ほどのEC2に対するセキュリティとしてセキュリティグループの設定があったが、サブネットに対しても同様に**ネットワークACLと呼ばれる設定によってパケットフィルタリングを行う。

#インターネットゲートウェイの接続
先ほどのVPCをインターネットに接続するためには、VPC領域にインターネットゲートウェイを接続する必要がある。
Mac > Coccinellidaを使ってSSH

## 環境

* macOS 10.15.1 
* Catalina



## SSH Tunnel Manager

SSH Tunnel Manager は多段トンネルのやり方分からずに挫折

* [SSH Tunnel Manager](https://www.tynsoe.org/v2/stm/)


## Coccinellida

Coccinellida v0.7

[Coccinellida - Simple SSH Tunnel Manager for Mac OS X](http://coccinellida.sourceforge.net/)

[Coccinellida - Browse Files at SourceForge.net](https://sourceforge.net/projects/coccinellida/files/)


## 

SSH多段接続（ポートフォワーディング）については↓の画像を見たら早い

![Kobito.eKhsxU.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/b09bedb7-301a-e2e4-22ff-26e6dbe0c63c.png "Kobito.eKhsxU.png")
(画像は[SSH Tunnel Manager](https://www.tynsoe.org/v2/stm/documentation/)を借用)




![Kobito.v2Tbeg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/b218f4ba-4782-08d8-cd69-5ac856b5a9c8.png "Kobito.v2Tbeg.png")

![Kobito.ojW6GF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/145abf81-d65d-ac45-5597-2935d16eb0d1.png "Kobito.ojW6GF.png")

![Kobito.B7Qlxi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/5fe48202-31d6-431e-b39f-b3ba62980fe0.png "Kobito.B7Qlxi.png")

![Kobito.ifJL3u.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/25474933-330c-9f77-99de-c783e8f91078.png "Kobito.ifJL3u.png")
Ruby と JavaScript でライフゲームを書いた

[ハッカーになろう](https://cruel.org/freeware/hacker.html)や[模造クリスタル『ゲーム部』2](https://www.melonbooks.com/index.php?main_page=product_info&products_id=IT0000161681&gro_ignore=1)で言及されてた[ライフゲーム](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0)が面白そうだったので書いてみた。ライフゲームはセル平面上(要は方眼紙のこと)で生命をシミュレートするモデルです。

# ライフゲームのルール

- セルには生と死の二つの状態がある。
- 時間(世代)が経過すると、あるルールに従ってセルの状態が変わる。
- あるルールとは次の4つ。
    - 過疎による死: 自身が生で、周りの8セルのうち1セル以下が生のとき、次の世代で死ぬ。
    - 生存: 自身が生で、周りの8セルのうち2〜3セルが生のとき、次の世代で生き続ける。
    - 過密による死: 自身が生で、周りの8セルのうち4セル以上が生のとき、次の世代で死ぬ。
    - 誕生: 自身が死で、周りの8セルのうち3セルが生のとき、次の世代で生になる。

コードで表現しやすそうなルールだ。疑似コードで書いてみるとこんな感じ？

```ruby
class Cell
  def next_alive?
    alive_count = 周囲.count { |item| item.alive? }

    # 過疎
    return false if self.alive? && alive_count <= 1
    # 生存
    return true if self.alive? && 2 <= alive_count && alive_count <= 3
    # 過密
    return false if self.alive? && 4 <= alive_count
    # 誕生
    return false if self.dead? && alive_count == 3

    false
  end
end
```

で、これを1世代ごとに全てのセルに対してチェックすればいけそう。

## Ruby で実装

https://github.com/oieioi/lifegame.rb
こんな感じに動きます。JoyDivisionっぽい見た目になった。
![lifegame.rb.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26239/fa62cea9-3030-f274-3802-ee228dcf2b2d.gif)

上に示した次世代の生死判定はこんな感じのコードになりました。

```ruby:lib/lifegame/game.rb#L47-L78
    # あるセルが次のターンに生きてるか確認する
    def next_alive?(x, y)
      target = self[x, y]

      # 隣接セルの座標
      adjoining = [
        [x - 1, y - 1],
        [x    , y - 1],
        [x + 1, y - 1],
        [x - 1, y],
        # [x    , y],
        [x + 1, y],
        [x - 1, y + 1],
        [x    , y + 1],
        [x + 1, y + 1],
      ]

      dead_or_live = adjoining.map { |point|
        n_x, n_y = point
        self[n_x, n_y]&.alive?
      }.compact

      live_count = dead_or_live.count { |live| live }

      if target.dead?
        # 3の時のみ誕生
        live_count == 3
      else
        # 2,3の時のみ生き残る
        (2..3).include?(live_count)
      end
    end
```


## JavaScript (with React)で実装

CLI だとインタラクティブなのがやりづらいのでJSでも書いてみた。

https://github.com/oieioi/lifegame.js
デモはこちら: https://dreamy-lumiere-0f384d.netlify.com/

![画面収録 2020-02-04 14.36.33.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26239/21d4105a-a71d-b226-e3cb-7c1fb6ebea98.gif)

こちらは全てのセルを二次元配列で受け取って新しい生死の二次元配列を返すようにした。

```javascript:src/lib/LifegameLogic.js#L1-L18
function nextCells(cells) {
  return cells.map((line, x)=> {
    return line.map((alive, y) => {
      // 周囲を調べる
      const aliveCount = getAdojoiningPositions(x, y).filter((position) => {
        const [x,y] = position;
        if (!cells[x]) return false;
        return cells[x][y]
      }).length
      if (alive) {
        // 周囲の生き残りが2,3のとき生存
        return aliveCount === 2 || aliveCount === 3;
      } else {
        return aliveCount === 3
      }
    });
  });
}
```
FiberでMML

以前作った[MML再生用のスクリプト](https://qiita.com/yamori813/items/eb23741d99a3677cf077)をFiberで書き直してみました。

```ruby
def track(c, mml)
  return Fiber.new {
    ch = c
    dat = mml
    curev = -1

    loop do
      if curev == -1 || curev[1] == 0  then
        curev = dat.getnext()
        if curev == -1 then
          Fiber.yield(-1)
        end
        if curev[0] != -1 then
          tone($t, ch, curev[0])
        end
      elsif curev[0] != -1 && curev[1] == curev[2] then
        $t.write(0x50,0x08+ch,0x00)
        curev[1] -= 1
      else
        curev[1] -= 1
      end
      Fiber.yield(1)
    end
  }
end

# main
    
$t = BsdIic.new(0)
$t.write(0x50,0x07,0xf8)
    
if ch0.length != 0 then
  tr0 = track(0, MML.new(ch0))
else
  tr0 = nil
end
if ch1.length != 0 then
  tr1 = track(1, MML.new(ch1))
else
  tr1 = nil
end
if ch2.length != 0 then
  tr2 = track(2, MML.new(ch2))
else
  tr2 = nil
end

while (tr0 || tr1 || tr2)

  if tr0 && tr0.resume == -1 then
    tr0 = nil
  end
  if tr1 && tr1.resume == -1 then
    tr1 = nil
  end
  if tr2 && tr2.resume == -1 then
    tr2 = nil
  end

  tick = (60*1000*1000/(MML::gettempo*120)).to_i
  Sleep::usleep(tick)
end
```

各トラックをFiberにしてtick毎に処理を動かしています。
IoT Centralのデータを他のAzureサービスに連携する【Event Hub】

今回はAzureのIoT系SaaSサービスのIoT Centralのデータを活用する方法についてまとめていきます。

#IoT Centralのデータをエクスポートする方法
現在、IoT Centralのデータを他のAzureサービスに連携する方法はEvent Hubs、
Service Bus、Blob Storageの3通りあります。以下、ドキュメントです。
https://docs.microsoft.com/ja-jp/azure/iot-central/core/howto-export-data

手順を見る限りではどれも簡単そうですが、今回はほぼリアルタイムにデータを出力するEvent Hubsを利用する方法をやってみます。

IoT Centralアプリケーションのセットアップについては別の記事に記載しているので今回はその続きだと考えてください。
https://qiita.com/ishii1125/items/0a36935a75c2d0a538f0

#Azure側での準備
とりあえずAzureのサービスとしてはEvent Hubsだけあれば問題ないのですが、Event Hubsのスループットを見ても面白くないので、Stream AnalyticsでEvent Hubsに入ってきたデータをJsonファイルに落とし込みたいと思います。
ということで、必要なAzureのサービスをいくつかデプロイしていきます。
まずはEvent Hubs。「リソースの作成」で検索窓から「Event Hubs」を見つけてデプロイします。
価格レベルについては今回はBasic、スループットユニットは1で問題ないでしょう。
次にStream Analytics。Event Hubsと同様に「Stream Analytics job」を見つけてデプロイします。ストリーミングユニットを3から1にすることをお忘れなく。。。
最後にストレージアカウント。前略ですが「Storage account - blob, file, table, queue」を見つけてデプロイします。パフォーマンスはStandard、レプリケーションはLRSになっていれば特別問題ないでしょう。
一通りサービスがデプロイできたらそれぞれの設定をしていきます。

#Azureサービスの諸作業
・Event Hubsの設定
作成したEvent Hubsの詳細に遷移し、実行するためのイベントハブを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482426/69f89344-b7c9-65ef-f062-6e4402c1b273.png)
パーティション数は4くらいにしておけば良いかと思います。

・Stream Analyticsの設定
入力、出力、クエリを準備します。
まず、入力の設定です。「ストリーム入力の追加」⇒「イベントハブ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482426/ae1bf461-65a5-9d6e-94ad-3a9deb12667f.png)
詳細な設定は基本的には自動なので大幅割愛しますが、イベントシリアル形式はJsonで問題ないです。
次に、出力の設定です。「追加」⇒「Blob Storage/Data Lake Storage Gen2」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482426/538911a4-19bb-5ba9-aa8f-94586644af84.png)
ストレージアカウントについては先に作成したものを利用しますが、コンテナーについてはまだ作成していないので、この場で作成します。
「コンテナー」の項目から「新規作成」を選択し、任意の名前を決めてください。
最後はクエリです。SELECTは全出力にしたいので、アスタリスクのままでINTOを出力設定で作成した名前に、FROMは入力設定で作成した名前に変更して「クエリの保存」を選択してください。
以上で概ねの設定が完了です。

#IoT CentralアプリケーションとAzureの連携
まず、IoT Centralアプリケーションでデータ連携の設定をします。
IoT Centralアプリケーションで「Data export」を選択し、「New」⇒「Azure Event Hubs」で作成したEvent Hubsとイベントハブを選択し「Save」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482426/1e6c7889-5cf4-5b0d-1b7c-f1c60a27faa0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482426/c5078084-686e-1839-f032-6e5ab7d10714.png)

最後にStream Analyticsのジョブを実行してデバイスからIoT Centralアプリケーションにデータを送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482426/412dc3d8-2001-ce4e-fb11-174a0c107dee.png)


#まとめ
実際にIoT Centralアプリケーションへのデータ送信とEvent Hubsのスループットのメトリックからかなりリアルタイム性は高いと思われます。
割とお手軽にできたので、IoT CentralアプリケーションをフロントにしたIoTも実現可能かと思います。
ラズパイでPHPを導入してみる

##はじめに
まずは恒例の

```
sudo apt-get update
```
をしてからPHPのインストール

```
sudo apt-get install php php-xml
```
インストールが完了したら、バージョンを確認してみる

```
php -v
```
![Screenshot from 2020-02-18 09-03-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584794/b9cd8cfa-3747-0b99-8c5f-d637b9815220.png)
こんな感じにバージョンが表示されたらインストール出来てる

###とりあえずなにか表示
phpinfo();を表示してみる
HTMLのときと同じようにファイルを作って中身を入力していく。ファイル名は「test」にする。

```
pi@raspberrypi:~ $ sudo vim /var/www/html/test.php
```

```php
<?php
    phpinfo();
?>
```
で、HTMLと同じ時の要領で
`http://192.168.*.*/test.php`
で表示してみる。
・
・・
・・・
なぜか表示できない...
どういう訳かそのまま
`<?php
    phpinfo();
?>`
が表示されちゃう...

###解決策
色々調べて試してみたが、どうやってもうまく行かないので最後の手段として一回全部削除してみる…

```
 sudo apt-get --purge remove php*
```
そして最初から同じ手順を試してみる

![Screenshot from 2020-02-18 09-52-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584794/d3356a8f-e1cc-6777-fe04-6d523f0b994e.png)
やっと表示できた。

原因はよくわからないけど、詰んだらとりあえず真っさらな状態にして一度試すしかない(正しいかわからないけど)
Laravel & VSCodeによるAPI仕様書管理の一案

今回の記事は、LaravelでAPI開発をすると同時に、
VSCodeの拡張機能を用いてAPI仕様書の管理もしてしまおうという狭い話です。

まずLaravel。
ひとまず最新の6を使うこととします。
今回の主題はAPI実装よりもAPIの仕様管理ということで、
マークダウンでAPIの仕様を記述します。
場所は`resources/api`を作るなどして保存しましょう。

```api_template.md
# API

API説明

# エンドポイント

## パス

### /api/hoges/{id}

## HTTPメソッド

### GET

# リクエスト

| パラメータ名 | データ型 | 必須  | 制約 | 説明 |
| ------------ | -------- | :---: | ---- | ---- |
| id           | integer  |  ⭕️   |      | ID   |

# レスポンス

## 200 取得成功

``json
{
  "id": 1,
  "name": "Hoge",
  "foos": [
    {
      "id": 1,
      "hoge_id": 1,
    },
    {
      "id": 2,
      "hoge_id": 1,
    }
  ]
}
``

## 500 エラー

---

[戻る](/api_docs)
```

APIを使う際に必要な情報を記述します。
ちなみにVSCodeはマークダウンを編集しながらプレビューも見られるので便利です。

<img width="977" alt="スクリーンショット 2020-02-18 13.00.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123511/36012888-b21d-88b6-48f3-aad9a58272da.png">

ただし、ブラウザで見る際はHTMLに変換したほうがわかりやすい。
そこでVSCodeの拡張機能「Markdown All in One」が役に立ちます。

<img width="787" alt="スクリーンショット 2020-02-18 12.52.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123511/31dfcab3-09d7-fad9-d802-8b5a98413da9.png">

この拡張機能をインストールしてHTML出力のコマンドを実行すると、同じディレクトリ`resources/api`にHTMLファイルが出力されます。

<img width="770" alt="スクリーンショット 2020-02-18 12.55.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123511/727d7ef4-b845-62e2-39a6-c8ebbe9a7dff.png">

そのHTMLファイルをLaravelのルーティングで読み込んで表示しようというのが、本記事の肝です。

```routes/web.php
<?php

Route::get('api_docs/{name?}', function ($name = 'index') {
    if (config('app.env') === 'production') {
        return abort(404);
    }
    $path = resource_path() . '/api/' . $name . '.html';
    if (file_exists($path)) {
        return file_get_contents($path);
    } else {
        return abort(404);
    }
});
```

一応本番環境では表示しないようにしています。
このルーティングで、例えば`/api_docs/api_template`とアクセスすることでAPIの仕様を表示できます。

<img width="997" alt="スクリーンショット 2020-02-18 13.04.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123511/f4a1c45b-18a2-ce8a-6273-8dda76a444c8.png">

これによって、ひとつのLaravelリポジトリでAPIの実装と仕様管理の両方ができるのは便利ではないかと思っています:beer:
[RxJS小ネタ] switchMapで受け取った値もそのまま返す

switchMap[^1]でObservableを切り替える前の値もまとめて受け取れるようにしたい、もしくはcombineLatestのようなオペレータで実行順序を制御したいと思ったことはないでしょうか。
[^1]: この記事ではswitchMapを例に説明していますが、mergeMap(flatMap), concatMap, exhaustMapでも同じです。

例えば以下のようにリクエストAの結果がリクエストBのパラメータとして必要な場合を考えます。

```ts
type A = { prop: string };
function requestA(): Observable<A>;
function requestB(prop: string): Observable<B>;
```

この場合は単にrequestBの結果を取得したい場合はそのままswitchMapを使うといいです。

```ts
requestA().pipe(
  switchMap(a => requestB(a.prop))
)
.subscribe(b => /* bを使った何か */);
```

しかし、リクエストAの結果もキャッシュしてコンポーネントのテンプレートに渡したい場合などでは、switchMap内もしくはtapオペレータでインスタンス変数に代入する必要があります。

```ts
requestA().pipe(
  tap(a => (this.a = a)),
  switchMap(a => requestB(a.prop))
)
.subscribe(b => {
  /* this.aを使った何か */
  /* bを使った何か */
});
```

このようなシンプルな例だとこのままの実装で問題ないのですが、リクエストを受け取ったあとに必要な処理が膨れ上がってきたり、依存関係のあるリクエストの数が増えると読みづらいコードになってしまいます。

一方、combineLatestやforkJoinのようなオペレータは複数のリクエスト結果をタプルで受け取ることができますが、リクエストの呼び出し順を指定したい場合には使えません。

```ts
const a$ = requestA();
const b$ = requestB(a.prop); // aをどうやってa$から取り出す?
combineLatest([a$, b$]).subscribe(([a, b]) /* 型は[A, B]のタプル */ => {
  /* ... */
}
```

# 解決策
そこで紹介するのはswitchMapのようにObservableを切り替えつつ、入力元の値も含めて返す方法です。
以下のような実装をします。

```ts
requestA().pipe(
  switchMap(a => requestB(a.prop).pipe(
    map(b => [a, b] as const)
  )
).subscribe(([a, b]) => {
  /* ... */
});
```
元々switchMapには[querySelector](https://rxjs-dev.firebaseapp.com/api/operators/switchMap)という引数でコールバックを指定できていましたが、RxJSからはこのquerySelectorはdeprecatedになっているので、代わりに上記のようにswitchMap内のmapで変換する必要があります。
そしてswitchMap内のconst assertionで型をタプルにしています。const assertionがないとsubscribeのコールバック引数の型が`(A | B)[]`のようになってしまいます。

ちなみにタプルではなくshorthand propertyとオブジェクトの分割代入で次のようにも書けます。

```ts
requestA().pipe(
  switchMap(a => requestB(a.prop).pipe(
    map(b => ({a, b}))
  )
).subscribe(({a, b}) => {
  /* ... */
});
```
disable(d)という名称を使う人は設計のセンスが無い

タイトルそのままです。
DBのカラムにせよ、変数名、メソッド名にせよ、設定キー名にせよ、 `disable(d)` という名称を使う人は設計のセンスがありません。

`disable(d)` が `true` のときに無効になる。という **設定値のポジティブ/ネガティブさと、内容のポジティブ/ネガティブが逆転していることに気づいていないからです。**
この罪は `enable(d)` であることが二重否定となり、可読性を破滅させることとして現れます。

```javascript
  !disabled
```

こんな変態的な修辞法を使わなくてもはじめから `enable(d)` としておけば良かっただけなのです。

しかし世の中には `disable(d)` を使いたがる人が多くて困惑します。個人の趣味であればご自由にどうぞ。ですが、他者とコードを共有することが前提のプロの仕事としては失格です。
変更が比較的容易な変数名やメソッド名であればまだしも、一度設定してしまうと変更が難しいDBのカラム名や設定キー名に採用してしまうと目も当てられません。

この類型として、オンオフのUI（典型的にはチェックボックス）でチェックを入れると無効、外すと有効。というものがありますが、これもダメな例です。
<img width="199" alt="スクリーンショット 2020-02-07 12.40.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145575/30c152fa-24dd-2d72-55db-d591b013d656.png">

はじめからチェックすると有効、外すと無効としておけば良いだけなんですが、こういうUIを作る人ってUIに関心がないというか言語感覚が貧しいんだろうな。と思います。もっと単純に直感的に考えましょう。
Visual Studio Code + Markdown PDF でPDFのカタカナ文字化け

## はじめに

Visual Studio Code で作成した Markdownファイル を久しぶりに PDF 変換したところ、コードブロック内のカタカナが文字化け □□□□ した。

日本語フォントが設定されていないんじゃろなと思い下記修正を行いました。

## 環境

* Windows 10 Pro x64 1903
* Visual Studio Code 1.42.1
* Markdown PDF 1.4.2

## 修正

Visual Studio Code のユーザーディレクトリにある CSS ファイルを修正

```text
C:\Users\xxxxxxxx\.vscode\extensions\yzane.markdown-pdf-1.4.2\styles\markdown.css
```

修正前

```css
body {
	font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
	font-size: 14px;
	padding: 0 12px;
	line-height: 22px;
	word-wrap: break-word;
}

...

code {
	font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
	font-size: 14px;
	line-height: 19px;
}
```

修正後（それぞれの font-family に "Meiryo" を追加）

```css
body {
	font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
	font-size: 14px;
	padding: 0 12px;
	line-height: 22px;
	word-wrap: break-word;
}

...

code {
	font-family: "Meiryo", Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
	font-size: 14px;
	line-height: 19px;
}
```

## 結果

コードブロック内のカタカナの文字化けは直りましたが、PDF のヘッダーに設定されるファイル名のカタカナは文字化けのままでした。
インスタンスの扱い方


Javaの学習における自分用のmemoです。
#インスタンスとは
・クラス（設計図）を具現化したもの
・ヒープ領域に保存される※1
・newと言うキーワードを使って生成する※2

※1 ヒープとは、JVM上で「ユーザが作ったプログラムが利用するメモリ領域」のこと
※2 newはヒープ領域に「新しくインスタンス用の領域を確保する」という意味の命令

###参照型変数とは
・インスタンスそのものでなく、インスタンスへの参照（住所のようなもの:リンク情報）が入っている
・オブジェクト型変数とも呼ぶ
・参照がない状態を示す特別な値にnullというのがある

###プリミティブ型変数とは
・変数そのものがデータ
・int型やdouble型、char型など
・仕様として提供されている基本的な型

###コンストラクタメソッド
・インスタンス生成と同時に自動的に実行される
・メソッド名はクラス名と同じにしなければならない
・戻り値型を記述できない
・インスタンス生成時のみ呼び出し可能
・プログラマーが定義しなくてもコンパイラによって自動的に定義される（デフォルトコンストラクタ）
・プログラム実行時、コンストラクタの処理が終わってから他のメソッドが呼び出せるようになる


###ガベージコレクション
・不要になったインスタンスをメモリから自動で破棄してくれる自動メモリ管理機能があり、これを「ガベージコレクタ」という
・ガベージコレクションが実行されるタイミングはガベージコレクタが自動的に判断する
・ガベージコレクタがメモリ内のインスタンスを破棄する行為のこと

###オーバーロード
・メソッド名と引数をまとめてシグニチャと呼ぶ
・シグニチャが異なれば異なるメソッドとしてコンパイラやJVMに識別される
・コンストラクタもオーバーロードできる

###クラス変数とクラスメソッド
・ヒープ領域の一部にクラスファイルを保管しておき、そこからインスタンスを生成する仕組みがある
・このクラスファイルを保管する領域を「パーマネント領域」と呼ぶ
・static修飾子のついたメソッドやフィールドはstatic領域に作られる
・staticなメソッドやフィールドはインスタンスが生成されていなくても使うことができる
・staticメンバーからインスタンスメンバーにアクセスしようとするとコンパイルエラーになる
Lilypondでスイングの「８分音符＝３連符」ってやつを書きたい

# 概要
Lilypond で楽譜を作ってて困った点。swingとかの楽譜の最初に書いてあるこの記号の出し方が分からなかったんですよね。
![20200218-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449620/d7460809-1a84-0bb2-a448-b4e6f9c28f6c.png)
簡単に出すことはできなさそうだったので強引に作ってみました。

# ソース
色々調べて書いたり削ったり、、
もうよく分からなくなってしまいました。不要な部分とかあるかもしれませんがこれでできているのでいいことにします。
`swing = ` から括弧が終わるまでをコピペして、楽譜の最初に `\swing` って書くと使えるのではないかと思います。

```swing.ly
\version "2.18.2"

swing = \mark \markup { 
  \line \general-align #Y #DOWN {
    \score { 
      \new Staff \with {
        fontSize = #-2
        \override StaffSymbol.line-count = #0 
        \override VerticalAxisGroup.Y-extent = #'(0 . 0)
      }
      \relative { 
        \stemUp 
        \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 3 16) 
        \override Beam.positions = #'(2 . 2)
        b'8[ b8] 
      }
      \layout {
        ragged-right= ##t
        indent = 0
        \context { 
          \Staff \remove "Clef_engraver" 
          \remove "Time_signature_engraver" 
        }
      }
    }
    " ="
    \score {
      \new Staff \with {
        fontSize = #-2
        \override StaffSymbol.line-count = #0 
        \override VerticalAxisGroup.Y-extent = #'(0 . 0)
      }
      \relative { 
        \stemUp 
        \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 3 16)
        \override Stem.length = #4.5
        \tuplet 3/2 { b'4 b8 } 
      }
      \layout {
        ragged-right= ##t
        indent = 0
        \context { 
          \Staff 
          \remove "Clef_engraver" 
          \remove "Time_signature_engraver" 
        }
      }
    }
  }
}

\relative c' {
  \clef treble
  \key c \major
  \time 4/4
  \override Score.RehearsalMark.X-offset = #0
  \swing

  c4 d e f | g a b c |
}
```

# まとめ
もっといい方法を知ってる方がいらっしゃいましたら教えてください。
リストをファイルへの書き込み読み込み

#まず import pickle
```python
import pickle
```

#リストをテキスト出力

```python:
with open('output.pickle', 'wb') as f:
  pickle.dump(target_list, f)
```

#読み込み
```python
input_data = []
with open('output.pickle', 'rb') as f:
  input_data = pickle.load(f)
```
forEachをIE11で使う方法

# ES2015

JavascriptのES2015(ES6)からは配列を便利に扱えるメソッドが増えましたが、
IE11ではサポートされていないものが多々あります。

詳しい対応状況はこちらが分かりやすいですね↓
http://kangax.github.io/compat-table/es6/

forEachもその一つで、Can I useを確認してみても、

![コメント 2020-02-18 121912.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336446/c8942cff-06e2-1d54-83a0-d6b095612583.png)

サポートされていない事が分かります。
ですが、実際はひと工夫することでIE11でも使えます。

# forEachのIE11対応

```html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>forEachのIE対応実験</title>
</head>
<body>
  <ul id="box">
    <li>りんご</li>
    <li>みかん</li>
    <li>バナナ</li>
  </ul>
</body>
</html>
```

```javascript

//Chromeなどのモダンブラウザではこれで動く
const fruits = document.querySelectorAll('#box li'); //Nodelist;
fruits.forEach(fruit => {
 console.log(fruit.innerText); // りんご, みかん, バナナ
});

//IEだとエラーで動かない
オブジェクトは 'forEach' プロパティまたはメソッドをサポートしていません。

```

**原因は...**

IE11はquerySelectorAll等が作るNodelistのforEachに対応していないそうです。
対策としては、このNodelistを配列に変換します。
ですので、元から配列として定義されているオブジェクトに対しては、IE11でもforEachが使えます。


```javascript

//IEでも動いた！
const fruits = document.querySelectorAll('#box li'); //Nodelist
const fruitsArr = Array.prototype.slice.call(fruits); //Array
fruitsArr.forEach(function(fruit) { //アロー関数はIEでは使えません
  console.log(fruit.innerText); // りんご, みかん, バナナ
});
```

```javascript

//こう書いてもOK
const fruits = document.querySelectorAll('#box li'); //Nodelist
Array.prototype.forEach.call(fruits, function(fruit) {
  console.log(fruit.innerText); // りんご, みかん, バナナ
});
```

### 参考文献
https://lealog.hateblo.jp/entry/2014/02/07/012014
[Array.prototype - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/prototype)
[Array.prototype.slice() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)

# まとめ
他にも通常のfor文にお置き換えるという対応方法もありますが、
今回の対策の方が記述が少なくて済むので、今後も積極的に使っていきたいと思います。
ドメイン、ロードバランサ、サーバの経路がわからなくなった時の経路調査

ドメインがどのような経路でサーバまでたどり着くのかがわからなくなった時の調査の手かがりになる方法をメモしておきます。
もっといい方法があれば更新していきます。

## ドメインからホストまでの経路を調べたい

tracerouteコマンドを使えば操作中の端末から目的のサーバまでのネットワーク経路を調べられる。

[【 traceroute 】コマンド／【 traceroute6 】コマンド――ネットワークの経路を調べる](https://www.atmarkit.co.jp/ait/articles/1709/15/news016.html)


##ドメインからホストまでの経路を見やすくしたい

RIPE NCCのサービスでip, hostname, ドメインの経路関係を図示してくれる。

[RIPE NCC](https://stat.ripe.net/)


## ドメインがどの業者で使われているか調べたい

WHOIS情報を調べるとXserverなのかAWSなのか等の情報が拾える（かも）

WHOIS情報は以下サイトで調べられる。

[WHOIS検索](https://tech-unlimited.com/whois.html)
Django rest framework decorators `action decorator replaces list_route and detail_route`

# 背景
Django1.11.1のサポートが4月とかで切れるので、Django2.2にupdateを行っている。
Djangoのアップデートに伴って、restframeworkのバージョンも `3.6.3` から `3.8.2` にアップ。
するとPyCharmのapi.pyにこんな横棒が。

>from rest_framework.decorators import ~~detail_route~~, ~~list_route~~

しかしroutingは正常に行えている。

# 確認
以下のページでアナウンスされていた。
https://www.django-rest-framework.org/community/3.8-announcement/

```
Both list_route and detail_route are now pending deprecation. 
They will be deprecated in 3.9 and removed entirely in 3.10.
```

なるほど、バージョン`3.8.2`ではまだ完全には廃止されていない。
[読書] SCRUM BOOT CAMP THE BOOK 


スクラム開発自体を教科書どおりに取り入れようとすると、おそらく冗長すぎて失敗する。スクラム開発はあくまで思想であって、思想をどう組織に取りこむかは、組織文化とその方向性次第であり、現実では組織ごとにアレンジされて運用されている。
果たして、スクラム開発がアレンジされているチームや会社にあなたが入社したとして、スクラム開発の目的やその思想の背景は何なのか? 若干残業依存体質なのが気になるが、本質的な理解をマンガを用いてかんたん・スピーディーに把握できるという本でこの本は優れていると言える。例えば、「スプリントの終端で微妙にデモが間に合わないから、ちょっとスプリントを延長してよいか?」といった質問があったときに、思想や本質が理解できればきっと対応できるだろう。

★★★★☆ 4/5

https://amzn.to/37GSotj
<a href="https://www.amazon.co.jp/SCRUM-BOOT-CAMP-BOOK-%E8%A5%BF%E6%9D%91/dp/4798129712/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0&qid=1581995559&sr=8-2&linkCode=li2&tag=mabotsblog-22&linkId=897d0c72a6dd3f96cb49d00671b730ef&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4798129712&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=mabotsblog-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=mabotsblog-22&language=ja_JP&l=li2&o=9&a=4798129712" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
複数コミットをcherry-pick

# 1コミットをもってくる場合

```bash:branch-1のコミット履歴
$ git log --oneline
je903h92 commit 3
03843h90 commit 2
09459090 commit 1
87436843 first commit
```

たとえば、`branch-2`に1つのコミットをもっていきたい場合は、`git cherry-pick {commit number}`で解決できます。

```bash
$ git checkout branch-2
$ git log --oneline
349fi29u new commit

$ git cherry-pick je903h92 # commit 3をもってくる

$ git log --oneline
je903h92 commit 3 # コミットが追加されている
349fi29u new commit
```

# 複数コミットをもってくる場合
例えばcommit 1、commit 2、commit 3をbranch-2へもってくる場合は、`git cherry-pick {start commit number}..{end commit number}`を叩けばもってくることができます。
ですが、start commit numberの部分は、もってきたい始めのコミットの**１つ前のコミット番号を指定**しなくてはいけません。

```bash
$ git checkout branch-2
$ git log --oneline
349fi29u new commit

$ git cherry-pick 87436843..je903h92 # commit 1~3をもってくる

$ git log --oneline
je903h92 commit 3
03843h90 commit 2
09459090 commit 1
349fi29u new commit
```
GKEやEKSなどのKubernetesの環境でSSHの制限かけている状態でもノードに(SSHのように）入る方法。

セキュリティグループやFirewallでSSHを制限してたり、そもそもSSHできなくしていたりすると思います。
でもノードに入らないとわからないことも多いので、そんな時でもノードに入れる方法です。

~~セキュリティ的に裏道もあるよという記事~~

## 1. 以下のyamlを作成する

```:privileged-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: privileged-pod
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox
    resources:
      limits:
        cpu: 200m
        memory: 100Mi
      requests:
        cpu: 100m
        memory: 50Mi
    stdin: true
    securityContext:
      privileged: true
    volumeMounts:
    - name: host-root-volume
      mountPath: /host
      readOnly: true
  volumes:
  - name: host-root-volume
    hostPath:
      path: /
  hostNetwork: true
  hostPID: true
  restartPolicy: Never
```

## 2. applyする

```
kubectl apply -f privileged-pod.yaml
```

## 3. execする

```
kubectl exec -ti privileged-pod sh
```

## 4. お好きにどうぞ

```
$ more /etc/hostname
gke-default-node-pool-1ab2cd3-00zz
```

## 5. お掃除

```
kubectl delete -f privileged-pod.yaml
```
[読書] プログラマが知るべき97のこと


職業プログラマ、プロフェッショナルとしてプログラムを通じてアウトプットする方には盲目的におすすめできる良書。日本語版はさらに日本人プログラマーの記事が追加されており、単に読みやすい訳を提供するだけでなく対価にみあった価値を提供しているという意味で日本語版を積極的に購入するインセンティブがあるだろう。同僚との仕事の仕方、人間関係からコードの品質を上げるためのマインドセットまでプロとして仕事をするにあたって必ず突き当たる課題について先達のアドバイスが集約されている。誰か他人の苦労や人生のエッセンスを噛み締めながら一節一節を読んでいく、そんな本である。

★★★★★ 5/5 

https://amzn.to/2UYsT3F

<a href="https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%8C%E7%9F%A5%E3%82%8B%E3%81%B9%E3%81%8D97%E3%81%AE%E3%81%93%E3%81%A8-%E5%92%8C%E7%94%B0-%E5%8D%93%E4%BA%BA/dp/4873114799/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%8C%E7%9F%A5%E3%82%8B%E3%81%B9%E3%81%8D&qid=1581994665&sr=8-1&linkCode=li2&tag=mabotsblog-22&linkId=c1103ac51cf7f36c54eeef94a4fe4deb&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873114799&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=mabotsblog-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=mabotsblog-22&language=ja_JP&l=li2&o=9&a=4873114799" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
【Php Storm】パス内検索で100件以上表示した方法

PhpStorm で ctrl+shift+F を使いパス内のファイルを検索した場合
100件以上のファイルが表示できませんでした。
同様の内容は既に投稿されていました
https://qiita.com/naoki_koreeda/items/74894904caf29bb639d4
こちらの方を参考にしましたが日本語化している影響なのか
レジストリ編集画面を表示させることができなかったので自分が見つけた解決策を記しておきます

1. ヘルプ
2. カスタムVMオプションの編集...
3. カスタムVMオプションに以下を追加
4. -Dide.usages.page.size=10000

これで100件以上の検索結果が表示されるようになりました
自分はとりあえず10000としていますが大きすぎるとメモリ使用量は増えるので適宜調整してください
何もしてないのに READ_PHONE_STATE が付与されてしまった！（解決）

まあ何もしてない訳は無いんですよね。
いくつかライブラリをバージョンアップしていました。
１行ずつ戻しながら検証しました。

```:build.gradle
implementation 'com.android.installreferrer:installreferrer:1.0'
↓
implementation 'com.android.installreferrer:installreferrer:1.1.1'
```

これが原因でした。

https://blog.danlew.net/2020/02/11/install-referrer-library-permissions-snafu/

こちらで詳細を見つけました。
とりあえず 1.0 に戻して解決！
[読書] オブジェクト指向をきちんと使いたいあなたへ 

大型本ということだが、実際には寄稿記事の集合となっており、ムック本に近い。また、半分以上のコンテンツがスクラム入門的なページに割かれているため、タイトルの文脈とコンテンツの文脈のマッチングが悪くコストパフォーマンスは悪いと言わざるを得ない。この記事の執筆者には問題がないが編集者に問題がある。純粋にオブジェクト指向入門の記事を集約すべきである。オブジェクト指向に関しては各言語でのオブジェクト指向の取り込み方やかんたんな表現方法の紹介があり、さわりとしては参考になるだろう。

★☆☆☆☆ 1/5 

https://amzn.to/2STKFTe
<a href="https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%82%92%E3%81%8D%E3%81%A1%E3%82%93%E3%81%A8%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-Software-Design%E7%B7%A8%E9%9B%86%E9%83%A8-ebook/dp/B01CC7SYAQ/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1K9OKLSNBFU1D&keywords=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B&qid=1581994278&sprefix=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88,aps,331&sr=8-23&linkCode=li2&tag=mabotsblog-22&linkId=09840d57b14bc756415ac9f474c23b54&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B01CC7SYAQ&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=mabotsblog-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=mabotsblog-22&language=ja_JP&l=li2&o=9&a=B01CC7SYAQ" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
【GCP】ゾーン間のVMインスタンスを接続

## VM作成
### GCP Consoleで
Name: `my-vm-1`
Region: **us-central1**
Zone: **us-central1-a**
Boot disk: `Debian GNU/Linux 9 (stretch)`
Access scopes: `Allow default access`
Firewall: **Allow HTTP traffic**（受信HTTPトラフィックを許可します）
### gcloud command で
リージョン指定
`gcloud compute zones list | grep us-central1`
ゾーン設定
**`gcloud config set compute/zone us-central1-b`**
VM作成
```gcloud compute instances create "my-vm-2" \
--machine-type "n1-standard-1" \
--image-project "debian-cloud" \
--image "debian-9-stretch-v20190213" \
--subnet "default"```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/501c2df9-1dc6-f49e-01e2-acce53dd1fd1.png)
my-vm-2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/2f112bdd-a648-e073-0a48-25222c81c94d.png)

## Connect between VMインスタンス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/672adf97-8e76-86b4-68d9-87a160b54a70.png)
ssh クリック
my-vm-1へ接続する為、次のコマンドを実行
`ssh my-vm-1`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/92dc7378-de16-a345-90c6-6690f529d844.png)
my-vm-1インスタンスで Nguixウェブサーバーインストール
`sudo apt-get install nginx-light -y`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/8e3fe790-fea1-5547-2ec6-f03687cfe595.png)
sudo nanoでindex.nginx-debian.htmlファイルを編集
`sudo nano /var/www/html/index.nginx-debian.html`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/c738363d-4968-a006-baea-89bb5f71ac30.png)
保存して終了
Ctrl+O→Enter→Ctrl+X
my-vm-1提供するウェブサーバーを確認するコマンド
`curl http://localhost/`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/365c884e-a154-57d9-7299-ed3453cbd630.png)
my-vm-1コマンドプロンプトを終了、次のコマンドを実行
`exit`
my-vm-2コマンドプロンプトへ戻る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/79a5534d-9d56-1469-7b65-e624b7864295.png)
my-vm-2コマンドプロンプトでmy-vm-1のウェブサーバーに到達できる確認コマンド
`curl http://my-vm-1/`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/165eaa6e-feb2-9a54-0c3f-531c0ccef661.png)
*http://my-vm-1/*
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/ac5ec022-22e2-ea7a-6dbc-6d1b3f51bf04.png)
PHPerからGo使いへ

###Goとは？
・Goは2009年にGoogleが開発したオープンソースプロジェクトのプログラミング言語です。

###特徴
- いわゆる静的言語
ただし型推論は強め
- シンプルな記述
 - ループ処理はfor文だけ
 - 他の言語で用意されている継承の概念がない
- 並行処理の記述が簡単
- 実行速度やコンパイル速度が早い

###触ってみた所感
- Javaなどの他の静的言語に比べて記述が簡単！
- PHPと比べると実行速度早いのは良いです。
- よくも悪くもコンパイルが必要な言語なので、実行前にポカミスが洗い出されるのは良いです。
- シンプルで出来ることが他の言語に比べ限られているので、記述ややり方について悩むことは少ないのでは、と想像。


###サンプルコード

````go:fizzbuzz.go
package main

//ライブラリの読み込み。これをPHPで言う組み込み関数的な。
import (
    "fmt"
    "strconv"
    )

//main関数から実行されます。
//Goにはクラスの概念はありません。またファイル実行のためには必ずfunc main()が必要です。
func main(){

//厳密な変数宣言。
var num int
num = 10000

//main関数から別の関数を呼び出し。
message := fizzbuzz(num)

    fmt.Println(message)
}

//引き数に型の指定はマスト。
//返り値がある場合には返り値の型も書かないといけません。
func fizzbuzz(num int) string{

var message string   
//このように省略して変数宣言もできます。型の指定も省略できます。
for i := 1; i <= num; i++{
    if i % 3 == 0 && i % 5 == 0 {
        //文字列の結合は+を使います。
        message = message + "FizzBuzz\n"
    } else if i % 3 == 0 {
        message = message + "Fizz\n"
    } else if i % 5 == 0 {
        message = message + "Buzz\n"
    } else {
        //整数と浮動小数点数のキャストは簡単なのですが、
        //整数と文字列のキャストはこのように厳密にやらなくてはいけません。
        var s string
        s = strconv.Itoa(i)
        message = message + s + "\n"
    }
} 
return message
}
```


###ちょっとした考察
- WEBアプリなどで言語の処理速度がボトルネックになることはまずない（DBがボトルネックになりやすい）ので、速度を目的にしてGoをチョイスするのは微妙かなと思いました。（DBとかが介在しない自動売買のBOTとかには良いです。）
- PHPにあってGoにないものとしてフレームワークの存在があります。
言語として記述をシンプルにしているのでフレームワークは（現状）不要、と言う考え方もできますが、
PHPなどの他の言語ではフレームワークを使用することによって、記述のシンプルさや統一性を担保しているとも言えるので、この点でもGoの優位性は微妙かなと思いました。（個人的にはGoそもそものシンプルさは好きです。）
gulp sass の設定

自身のメモとして、gulp での sass（scss）コンパイルの環境導入の手順をまとめます。
windowsでの対応です。

#■流れ

- １、Node.jsのインストール（npmを使う準備、ver管理として Nodist で インストール）

- ２、package.json ファイルの作成（npm init で初期化生成）

- ３、gulp のインストール（npm install -D gulp）

- ４、sacc のインストール（npm install -D gulp gulp-sass）

- ５、gulpfile.js を記載

- ６、gulpfile.js のある階層で、gulp 起動コマンド。


#■１、Node.jsのインストール
複数人で制作したり今後ページを運用していくにあたり、Node の ver を合わせることは大切になってきます。
Node の ver を切り替えることができるように windows では Nodist を使って、Node をインストールします。

▼Nodist は以下よりダウンロード
https://github.com/nullivex/nodist



#■２、package.json ファイルの作成（npm init で初期化生成）
下記コマンドで package.json ファイルを生成します。
以降の手順でインストールしていくプラグインを管理するファイルになり、インストールと一緒に随時記載されていきます。

```
npm init -y
```
`-y` は質問をすべてスキップするオプション。





#■３、gulp のインストール（npm install -D gulp）

フォルダ毎の制作環境を持てるように、ローカルインストール（指定したフォルダ以下で使えるようにインストール）します。

`––save-dev`、または省略系の `–D` をオプションとして指定します。

```
npm install -D gulp
```


#■４、sacc のインストール（npm install -D gulp gulp-sass）

```
npm install -D gulp gulp-sass
```




#■５、gulpfile.js を記載

コンパイル時のソースと、掃き出し先は下記通り。
[src]フォルダを基ソースに、[dis]の中に 吐き出します。
>
>[dist]
>　┗[css]
>　　┗[test.css]
>
>[src]
> ┗[scss]
>　　┗[test.scss]


下記は gulpfile.js の中身です。

```gulpfile.js
// プラグインの読み込み
const gulp = require('gulp');
const sass = require('gulp-sass');

// 掃き出し階層の指定を定義
const path = {
  src: './src/scss/**/*.scss',
  dist: './dist/css/'
}

// default のタスクを作成する
gulp.task("default", function () {
  return gulp.watch(path.src, function () {

    // ●●.scssファイルを取得
    return (
      gulp.src(path.src)

        // Sassのコンパイルを実行、error以降Sassのコンパイルエラーを表示(これがないと自動的に止まってしまう)
        .pipe(sass({ outputStyle: 'expanded' }).on('error', sass.logError))

        // cssフォルダー以下に掃き出し
        .pipe(gulp.dest(path.dist))
    );
  });
});

```





#■６、gulpfile.js のある階層で、gulp 起動コマンド。

```
gulp
```

タスク名'default'は、`gulp` コマンドのみで実行することができます。

また、Node.js（npm v5.2以上）であれば
npx コマンドを使うことができ、`npx gulp` で、'default'タスクを実行できます。
npx コマンドを使うと、Gulp を少ない手順で使えるようになるようです。




#■参考
https://ics.media/entry/3290/

▼「gulp-sass 5」でコンパイルエラー！
https://notes-de-design.com/website/gulp/error-gulp-sass-v5/
Selenium+Headless Chromeで“Access Denied”となるページをスクレイピングする方法

#はじめに
Selenium + Headless Chromeでスクレイピングをしていると、headモードでは情報が取得できるのに、headlessにした途端に、NoSuchElementExceptionのエラーが発生するサイトに出会いました。
回避策について日本語の記事が少なかったので投稿してみようと思います。



#状況
・headモードではスクレイピングができます。
・headlessオプションを追加にした途端にNoSuchElementExceptionが発生しました。

#デバッグ
###原因究明
要素が取得できていないようなので、driver.page_sourceで当該サイトのソースを確認してみました。

```scraping.py
driver.page_source
```

返ってきた HTMLには"Access Denied"の文字が、headlessからのアクセスは拒否されるようです。

```
<html><head>
webapp_1        | <title>Access Denied</title>
webapp_1        | </head><body>
webapp_1        | <h1>Access Denied</h1>
webapp_1        |  
webapp_1        | You don't have permission to access "http://www.xxxxxxx/" on this server.<p>
```
###対策

調べてみると、chromedriverにはブラウザからのアクセスを装うことができるuser_agentオプションがありました。こちらをchromedrivereのオプションに追加することで無事に要素が取得できるようになりました。

```scraping.py
options = webdriver.ChromeOptions()
            options.binary_location = '/usr/bin/google-chrome'
            options.add_argument('--no-sandbox')
            options.add_argument('--headless')
            options.add_argument('--disable-gpu')
            options.add_argument('--lang=ja-JP')
            options.add_argument(f'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36') #追加

           
```

以上
【解決】エクセルの表示倍率が固定できない（改ページプレビューで保存した場合）

#＜現象＞
　作成した手順書を改ページプレビューで、表示倍率を指定して（例85%）、ファイルサーバに保存しました。再度開く（または他人が開く）と、表示倍率が勝手に変更されてしまいます（40%とか）。

#＜解決方法＞
　一旦標準表示モードで表示倍率を指定し保存して、再度改ページプレビューで表示倍率を指定して保存する。下記の手順でやれば解消できる。
　1．「表示」タブを選択
　2．「標準」モードを選択
　3．「ズーム」にて表示倍率を指定
　4．上書き保存（Ctrl+S）　※重要★
　5．再度「表示」タブを選択
　6．「改ページプレビュー」モードを選択
　7．再度「ズーム」にて表示倍率を指定（表示倍率が勝手に変更された場合）
　8．上書き保存（Ctrl+S）
　9．ファイルを閉じる
　10．再度ファイルを開く
　11．END
CentOS7 on Raspberry Pi 4 : eth0 の名前

#Raspberyy Pi 4 に CentOS 7 をインストールしてnetwork 設定で引っかかった

有志により公開されている Raspberry Pi 用の CentOS 7 イメージを使ってサーバーを構築している際、eth0 に固定IPを割り振ろうとおもったらエラーがでた。

```
# nmcli nmcli c m eth0 ipv4.method manual ipv4.addresses 192.168.100.11/24
エラー: 不明な接続 'eth1'.
```

調べてみると、device 名 と ネットワーク名が異なってつけられているようです。

``` 
# nmli c s 
NAME                UUID                                  TYPE      DEVICE
Wired connection 1  b5ebcc79-f7e5-3802-8350-c4ee0c665d97  ethernet  eth0
```
上の場合は、device名 が eth0 で、ネットワーク名が Wired connection 1 です。
幾つかの Ras Pi で試していますが、ネットワーク名が 有線接続１ となる場合もあるようです。

[CentOS7系OSのNIC名を変更する方法](https://www.faq.idcf.jp/app/answers/detail/a_id/789/~/centos7%E7%B3%BBos%E3%81%AEnic%E5%90%8D%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95) 

[NIC設定ファイル名変更と内容の編集](https://www.server-memo.net/centos-settings/centos7/nicname_change.html#NIC)

を参考にして、 ネットワーク名とデバイス名を同じにしました。

まずは、/etc/sysconfig/network-scripts 以下に ifcfg-wired_connection_1 があることを確認

```
# cd /etc/sysconfig/network-scripts/
# ls
ifcfg-Wired_connection_1  ifdown-isdn    ifup-aliases  ifup-ppp
ifcfg-lo                  ifdown-post    ifup-bnep     ifup-routes
ifdown                    ifdown-ppp     ifup-eth      ifup-sit
ifdown-Team               ifdown-routes  ifup-ippp     ifup-tunnel
ifdown-TeamPort           ifdown-sit     ifup-ipv6     ifup-wireless
ifdown-bnep               ifdown-tunnel  ifup-isdn     init.ipv6-global
ifdown-eth                ifup           ifup-plip     network-functions
ifdown-ippp               ifup-Team      ifup-plusb    network-functions-ipv6
ifdown-ipv6               ifup-TeamPort  ifup-post
```

ファイルの名前に含まれるデバイス名を正しいもの(eth0)に変更

```
# mv ifcfg-Wired_connection_1 ifcfg-eth0
```

つづいて、ifcfg-eth0 の内容を変更
NAME="Wired connection 1" を NAME="eth0"に変更

```
# vi ifcfg-eth0
```

```:/etc/sysconfig/network-scripts/ifcfg-eth0
~
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=0f5dcf49-a733-32ae-b854-64783fb02a33
~
```

あとは ネットワークを再起動

```
# systemctl restart network
```

以上