OmniAICreator/Qiita-1.07M huggingface dataset:
開発をベースにした - GitFlow

開発でブランチをどのような形にしたらいいのか現場で色々話し合うことがあるとは思うのですが開発していく上で、ブランチが一杯ってなってしまう時これだとかなり効率的にバージョン管理もできてというスタイルを教えていただいたのでシェアさせて頂こうと思います。

区分|種類|ブランチ名|分岐元|マージ先|削除のタイミング|用途
|:--|:--|:--|:--|:--|:--|:--|
メインブランチ | develop | develop | - | - | 削除しない | 開発中のソースコードを管理する。
サポートブランチ | フィーチャー | feature/(チケット番号) | develop | develop | マージ完了後 | 機能実装やバグ修正などの開発作業を行う。
サポートブランチ | リリース | release/staging | develop | developとstaging | マージ完了後 | ステージング環境へのリリース準備作業を行う。
メインブランチ | staging | staging | - | - | 削除しない | ステージング環境にリリース済みのソースコードを管理する。
サポートブランチ | リリース | release/master | staging | master | マージ完了後 | 本番環境へのリリース準備作業を行う。
メインブランチ | master | master | - | - | 削除しない | 本番環境にリリース済みのソースコードを管理する。

Gitflow
---

feature | develop | -- | staging | -- | master | hotfix
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
-- | \| | -- | \| | -- | master | --
-- | \| | -- | \| | -- | \| | --
-- | develop | << | < \| < | << | << \| | --
-- | ① | -- | ② | -- | ③ | --
feature/<br />(version)/ | << \| | (newBrunch) | \| | -- | \| | --
PJC-ID### | \| | -- | \| | -- | \| | --
開発 | \| | -- | \| | -- | \| | --
->>> | develop | (マージ) | \| | -- | \| | --
-- | \| | -- | \| | (tag) | \| | --
(newBrunch) | \| >> | release/<br />staging | \| | staging-<br />(version) | \| | --
-- | \| | \| | \| | -(build) | \| | --
-- | \| | \| >>> | staging | (マージ) | \| | --
-- | \| | -- | \| | -- | \| | (tag)
-- | \| | (newBrunch) | \| >> | release/<br />master | \| | master-<br />(version)
-- | \| | -- | \| | \| | \| | -(build)
-- | \| | -- | \| | \| >>> | master | (マージ)
(マージ) | develop | <<< | < \| < | <<< \| | \| | --
-- | \| | -- | \| | (newBrunch) | \| >> | hotfix/<br />(version)/
-- | \| | -- | \| | -- | \| | PJC-ID###
-- | \| | -- | \| | -- | \| | 緊急バグ
-- | \| | -- | \| | (マージ) | master | <<< \|
(マージ) | develop | <<< | < \| < | <<< | <<< \| | <<< \|
-- | ①へ | -- | ②へ | -- | ③へ | --

また色々とこんなやり方がいいよという方がいたらお問い合わせください。


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
jsonの配列の中に構造体を入れる


すぐ他の言語とごっちゃになって忘れるのでメモ

### 配列の中に構造体をいれたい場合の書き方

```
{
    "header": {
        "code" : "XXXXXX"
    },
    "body": [
        {
            "id": 100
        },
        {
            "id": 200
        }
    ]
}
```

### jsonを整形するサイトで正しいかを確認する
https://lab.syncer.jp/Tool/JSON-Viewer/
【Python】inspectでクラスのメソッドを全部使う

# やりたいこと
例えばこんなクラス

```Python
import re
import zenhan

class StrProcesser:
    @staticmethod
    def ToHalfwidth(str_) -> str:
        return zenhan.z2h(str_, 3).replace('・', '･')

    @staticmethod
    def RemoveWhiteSpace(str_) -> str:
        return ''.join(str_.split())

    @staticmethod
    def RemoveChrs(str_, remove='') -> str:
        pattern = f'[{re.escape(remove)}]'
        return re.sub(pattern, '', str_)
```

それぞれの機能は個々でも使いたいけど、全部まとめて使えたら便利だな～っていうのを実現するために
標準ライブラリの[inspect](https://docs.python.org/ja/3/library/inspect.html)を使っていきます。

# 追加するコード
```Python
import inspect

class StrProcesser:

    ...

    @classmethod
    def All(cls, str_, remove='') -> str:
        for _, func in inspect.getmembers(cls, inspect.isfunction):
            local_vars = locals()
            passing_args = {p: local_vars[p] for p in inspect.signature(func).parameters}
            str_ = func(**passing_args)
        return str_
```

`inspect.getmembers`の第2引数に`inspect.isfunction`を渡すことによって、第1引数に渡したオブジェクトの中から**自分(All)以外の**関数名と関数のタプルを抜くことができます。
`inspect.signature(func).parameters`はParameterオブジェクトですが、`for`で回すと引数名(str)が取得できます。
あとは多分見ればわかると思うので割愛。

# やってみる
しかし…

```Python
>>> target = '１・２　３'
>>> StrProcesser.All(target, '2')

1･23
```

なんと2が削除できていません。というのも`inspect.getmembers`で取得できるリストはメンバーの名前でソートされているため、上記例では`RemoveChrs` → `RemoveWhiteSpace` → `ToHalfwidth`の順で実行されてしまうのです。

上から順に実行したい場合にはこうします。

```Python
import inspect
import re
import zenhan


class StrProcesser:
    names = locals().keys()

    @staticmethod
    def ToHalfwidth(str_) -> str:
        return zenhan.z2h(str_, 3).replace('・', '･')

    @staticmethod
    def RemoveWhiteSpace(str_) -> str:
        return ''.join(str_.split())

    @staticmethod
    def RemoveChrs(str_, remove='') -> str:
        pattern = f'[{re.escape(remove)}]'
        return re.sub(pattern, '', str_)

    @classmethod
    def All(cls, str_, remove='') -> str:
        functions = dict(inspect.getmembers(cls, inspect.isfunction))
        valid_order_func_names = filter(lambda key: key in functions, cls.names)
        for func_name in valid_order_func_names:
            local_vars = locals()
            func_params = inspect.signature(functions[func_name]).parameters
            passing_args = {p: local_vars[p] for p in func_params}
            str_ = functions[func_name](**passing_args)
        return str_
```
辞書の順序が保証されているのはPython3.7からなので、それ以前のバージョンだとうまくいかないかもしれません。

# 最終結果
```Python
>>> target = '１・２　３'
>>> 
>>> StrProcesser.ToHalfwidth(target)
1･2 3
>>> StrProcesser.RemoveWhiteSpace(target)
１・２３
>>> StrProcesser.RemoveChrs(target, '２')
１・　３
>>> 
>>> StrProcesser.All(target, '2')
1･3
```
できました！
Azure DevOps 始めてみる

Azure DevOps を１からはじめてみたいと思います。
# Azure DevOps のサイトを開く
https://azure.microsoft.com/ja-jp/services/devops/
こちらのアドレスからサイトを開きます。
![20190618-3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/6b6e8e23-c9e8-35d1-6697-f47ad489c5f1.png)

"無料で始める" をクリックします。
マイクロソフトアカウントによるログインを聞かれます。
# マイクロソフトアカウントを作成する
![20190618-3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/961cccc5-c5ac-26bb-2a99-126141e366fd.png)

マイクロソフトアカウントを持っていない場合は作成します。
今回は作成したいと思います。

![20190618-3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/e3514ae5-5de6-505b-4ebf-6b51c4fb4ab2.png)

メールアドレスも取得してみます。
普段ご利用のメールアドレスを入力いただいても問題ありません。
過去の経験から言いますと、会社のメールアドレスを利用する場合、すでに会社としてAzureやO365といったマイクロソフトアカウント(正確にはAzure ADですが今はここらへんは省略)を利用するサービスを登録している（または今後登録する）可能性があります。
この場合、色々と権限まわりで面倒なことが起きる可能性もありますのでご注意ください。
（面倒というのは個人の見解です。個人と組織を正しく認証しようとしているため、認証基盤は戦略的に正しく利用しようというのが正確な表現です。）

![20190618-3-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/24af5aa1-8c8e-db62-cb7a-34e42a7162c6.png)

パスワード入力後、こちらの画面になります。
"はい"でも"いいえ"でも、お好きな方をクリックしてください。
今回は"はい"を選択してみました。

# はじめてのAzure DevOps プロジェクトを作成する

認証が終わり、Azure DevOpsのサイトに戻ってきました。
![20190618-3-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/8cc48e60-79be-e6c8-9fea-43218702974a.png)


- Project name
： プロジェクトの名前です。今回は"matakaha1113sampleprj"という名前にしてみたいと思います。
- Project visibility 
： "Private"か"Public"かを選択できます。OSSの開発でもない限り、基本的には"Private"を選択します。今回も"Private"を選択します。
- Country/region
： どこで稼働させるかを選択します。今回は"日本"を選択します。

最後に"Continue"ボタンをクリックします。

# Azure DevOpsプロジェクト作成中
青い丸がクリクリして作ってる感を醸し出します。
![20190618-3-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/621ca657-b02e-6158-804b-6c606020545e.png)
"organization"という文言が記載されていますが、今は触れません。
複数のプロジェクトを束ねている"組織"という単位だと、とりあえず理解ください。
このパートでは、組織というグルーピング単位を作成した上で、その中に１つ目のプロジェクトを作成しています。

# はじめての Azure DevOps プロジェクト完成
プロジェクトが作成され、何やらそれっぽい画面が出てきました。
![20190618-3-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/a618e718-0269-2afa-faa2-91e989cdf008.png)

できあがると同時に、azuredevops@microsoft.comというアドレスから完了通知メールが届きます。もし普段利用しているメールアドレスで作成している場合、このメールアドレスを使って何らかの振り分けやタグ付けルールを付与しておくと良いかもしれません。
（今は不要です。）

# まとめ
Azure DevOpsプロジェクトを１から作成してみました。
マイクロソフトアカウントの作成も含め、すべて実施してみましたが、まだ課金用の情報を入力する場面には遭遇していません。
当然ながら後から勝手に請求するような行為はしませんので、とりあえず無料で始めることが可能であるとご理解いただけたのではないでしょうか。
IRubyのPlotyでグラフを並べる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/f1cb7325-fbbb-79f5-d73b-e9ff0bbc8beb.png)
JupyterLab で IRuby と iruby-plotly を使うというアホほどマイナーな使用事例に関するメモです。
https://github.com/zach-capalbo/iruby-plotly
(2019年6月18日現在 Github Star が１つしかない）

gridを指定すればグラフを並べられる。
注意点は、それぞれのグラフについて別々のxaxis、yaxisを指定するところ。これをやらないと、plotly先生はよかれと思ってグラフをまとめてしまう。なおかつ、`x0`, `y0`だと正常に動かないみたい。なんでだろ

```ruby
rquire 'iruby/plotly'

data = Array.new(10){ |i|
{
  x: [*1..100],
  y: Array.new(100){rand(10)},
  xaxis: "x#{i+1}",
  yaxis: "y#{i+1}",
  type: 'bar',
}}

layout = {
  grid: {rows: 10, columns: 1, pattern: 'independent'},
    height: 800
}

IRuby.plotly(data, layout)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/f1cb7325-fbbb-79f5-d73b-e9ff0bbc8beb.png)

こうすれば

```ruby
data = Array.new(16){ |i|
{
  x: [*1..20],
  y: Array.new(20){rand(10)},
  xaxis: "x#{i+1}",
  yaxis: "y#{i+1}",
  type: 'bar',
}}

layout = {
  grid: {rows: 4, columns: 4, pattern: 'independent'},
    height: 800
}

IRuby.plotly(data, layout);
```

こうなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/9af48ec4-1e3a-bf3c-8eb9-4bbac9c8248f.png)

typeが line なら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/98418966-42ed-b90b-472a-f7d73a332432.png)

grid 2, 8なら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/1fa9c6ab-ce50-937c-3bf4-71a1c8516137.png)

べんり過ぎる。

便利すぎるけど導入めんどうくさいし、知名度低いから誰も使わないんだろうな…
Grove - Time of Flight Distance Sensor VL53L0XをWioLTEで利用する


Groveの`Time of Flight Distance Sensor`をWioLTEで使ってみます。

>[Wio cell lib for Arduino / Wio 3G / Wio LTE M1/NB1(BG96)](https://seeedjp.github.io/Wiki/Wio_cell_lib_for_Arduino/home-ja.html)を使っています。

[WioLTEでGroveセンサを使うサンプルをいくつかまとめてみた](https://qiita.com/n0bisuke/items/1541e8ce2e70f7a7df08)の続きっぽいやつ。



## Time of Flight Distance Sensor

http://wiki.seeedstudio.com/Grove-Time_of_Flight_Distance_Sensor-VL53L0X/

精度の高い距離センサです。
レーザーを利用している模様。

## 配線

I2C(電源コネクタを下向きにしたときの右上)に接続します。

## ライブラリのインストール

https://github.com/Seeed-Studio/Grove-Ranging-sensor-VL53L0X

zipでDLしてインストールしましょう。

## サンプルコード

Arduino向けのものを

```tof.ino
#include <WioCellLibforArduino.h>
WioCellular Wio;

#include "Seeed_vl53l0x.h"
Seeed_vl53l0x VL53L0X;

#define INTERVAL    (2000)

void setup(){
  VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  SerialUSB.begin(115200);

  SerialUSB.println("--- START ---------");
  SerialUSB.println("### I/O Initialize.");
  Wio.Init();
  
  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyGrove(true);
  delay(500);

  SerialUSB.println("### Sensor Initialize.");
//  pinMode(TILT_PIN, INPUT);
  
  Status=VL53L0X.VL53L0X_common_init();
  if(VL53L0X_ERROR_NONE!=Status){
    SerialUSB.println("start vl53l0x mesurement failed!");
    VL53L0X.print_pal_error(Status);
    while(1);
  }
  VL53L0X.VL53L0X_continuous_ranging_init();
  if(VL53L0X_ERROR_NONE!=Status){
    SerialUSB.println("start vl53l0x mesurement failed!");
    VL53L0X.print_pal_error(Status);
    while(1);
  }

  SerialUSB.println("### Setup completed.");
}

void loop(){
  VL53L0X_RangingMeasurementData_t RangingMeasurementData;
  VL53L0X.PerformContinuousRangingMeasurement(&RangingMeasurementData);
  
  if(RangingMeasurementData.RangeMilliMeter>=3000){
    SerialUSB.println("out of ranger");
  }else{
    const int val = RangingMeasurementData.RangeMilliMeter;
    SerialUSB.print("distance::");
    SerialUSB.println(val);
    if(val < 300){
      SerialUSB.println("近くにものがある");
    }else{
      SerialUSB.println("近くにものがない");
    }
  }
  
  delay(100);
}
```

## 感想

めちゃ精度が高くて感動しました。（小並感）
NeoVim+coc.nvimでLSPによるGoの補完を実現する

500番煎じくらいだけどcoc.nvimの記事は多くなかったので備忘録

## 前提
- NeoVim(v0.3.7)
- プラグイン管理はdein.vim
- LSはgopls

## Install coc.nvim
### Insatll Node.js & Yarn
[coc.nvim](https://github.com/neoclide/coc.nvim)のREADME通り

```
$ curl -sL install-node.now.sh/lts | sh
```

YarnはREADMEを無視して普通にインストールしてしまったが問題なかった

```
$ npm install -g yarn
```

### extension用のディレクトリを作成
Vimを開いた状態で`:CocInstall [extention]`するとNodeモジュールがインストールされる。
JavaScriptやJSONの補完やSyntaxが効くようになるありがたい拡張機能もある。
これらをインストールするディレクトリがないとエラーを吐くらしい（未確認）ので念の為ディレクトリを作っておく。

```
$ mkdir -p ~/.config/coc/extensions
```

### dein.vimにプラグインを追加
私はtomlファイルでVimプラグインを管理しているので、末尾に以下を加える。

```dein.toml
[[plugin]]
repo = 'neoclide/coc.nvim'
build = './install.sh nightly'
``` 

Vimを開くとインストールが始まり、完了後は`compiled javascript file not found`と出る。
Vim内で以下実行することでエラーは消える。

```
:call coc#util#install()
```

`:CheckHealth`でcoc.nvimの状態が全てOKになっていれば終わり

### 参考
[neovim + coc.nvim で LSP](http://wakame.hatenablog.jp/entry/2019/03/31/124941)
[Vimの補完プラグインであるcoc.nvimが強すぎる｡](https://drumato.hatenablog.com/entry/2019/04/01/121139)

## Goの補完設定をする
`:CocConfig`でcoc.nvimの設定ファイルが開く。このとき、JSON用の拡張もインストールされる（されてなければ）。
公式Wikiに従って以下の設定を加えた。

```coc-settings.json
{
  "suggest.noselect":false,
  "suggest.preferCompleteThanJumpPlaceholder":true,
  "languageserver": {
    "golang": {
      "command": "gopls",
      "rootPatterns": ["go.mod", ".vim/", ".git/", ".hg/"],
      "filetypes": ["go"]
    }
  }
}
```

### 補完が出ない...
`coc-settings.json`ではJSON用の補完が出ていたので、設定ファイルの記述ミスか、Go由来の問題。

#### PATHの確認をする

```
// デフォルトは$HOME/go
$ echo $GOPATH

// $GOPATH/bin
$ echo $PATH
```
パスが通っていなかったら設定ファイルに追記する。

```.bashrc
# 記述順序に注意
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
```

#### goplsのインストール

goplsはbingoの作者がgoplsをForkしてbingoの機能を追加したパッケージとGoogleが出している公式のパッケージがある。
coc-nvimのWikiにはbingo版での設定方法が書かれているが、今回は公式のパッケージを使う。

```
$ go get -u golang.org/x/tools/cmd/gopls

// $GOPATH/bin/goplsが表示される
$ which gopls
```

#### GOPATH下で作業する
GOPATH/srcに任意のディレクトリと`main.go`を作成したが、やはり補完されない。
**`package main`がないとサーバーがErrorを返してくる。**
`main.go`に`package main`を書いて再読み込みすると無事補完機能の動作を確認できた。

#### GOPATH下以外でも補完が効くようにする
`GO111MODULE=on`にすると、Go1.11のmodules機能が有効になり、GOPATHの外でプロジェクトを扱える。
`.bashrc`などに`export GO111MODULE=on`の設定を追記すし、GOPATH下でやったのと同じ作業を行うと、GOPATHの外のファイルでも補完が効くことを確認できた。

## まとめ
`coc.nvim`それ自体の設定は簡潔で、設定ファイルもJSONなので扱いやすい。
今回はGo特有の問題で詰まったが、そもそも私自身Go経験が浅いのでGoのプロだったら特に躓かずに補完が効くところまでいけると思う。
coc.nvim導入にあたり、相性のよくないプラグインやもともと補完を担っていたプラグインがリストラされ、プラグイン数の削減にも繋がった。
補完速度も上々なので、コーディングが捗りそう。

**毎回`package main`書いてリロードするのは面倒なのでなにかいい方法あったら誰か教えてください。**
全身3Dスキャン / リアルアバター 制作用撮影システムキット - Raspberry Pi 設定編 -


随時更新中。
本記事執筆開始時のビジョンはこちら <a href="https://note.mu/happyocean/n/n5f322b181706">https://note.mu/happyocean/n/n5f322b181706<a> ぜひ読んでください。

筆者は職業ソフトウェアエンジニアではないため、間違いやこうした方がいいというのはお知らせ下さい。

●Raspbian Stretch のイメージをダウンロードしてきてSDカードに書き込みます。
https://www.raspberrypi.org/downloads/raspbian/
Raspbian Stretch with desktop　で良いと思います。

書き込み方は、（筆者は基本Mac利用）
SDカードをFATフォーマットしてから、

```
sudo dd if=2019-04-08-raspbian-stretch.img of=/dev/rdisk5 bs=1m
```
rdisk5 の数字のところは、変わってきます。

●Raspberry Piの初期設定
sudo raspi-config

・カメラを有効にする

・SSHを有効にする

●Raspberry Pi には固定IPアドレスを設定します。
sudo nano /etc/dhcpcd.conf

```/etc/dhcpcd.conf


#一番下に移動して
interface wlan0  #無線WiFi時。後述するが基本は有線LANケーブルが良い。その場合は、interface eth0
static ip_address=192.168.1.1/24
static routers=192.168.1.100   #ルーターのIPアドレスを先に設定した場合
static domain_name_servers=192.168.1.100
```

●カメラモジュールの取り付けは、静電気でカメラモジュールがやられないように注意してください。
ケースキットを購入した場合、短めのフオレンジ色のフレキケーブルがついていますので、そちらに取り替えます。

●カメラのフォーカス合わせ
Raspberry Pi のカメラモジュールは固定焦点で、
全身3Dスキャンする際は、1m程度のところにフォーカスがあってるか確認しなければいけません。
すでにそれくらいに合ってる場合もありますが、合ってない場合もあります。。
小型プライヤー（やピンセット？）などで挟みながらカメラを回す必要があります。
作業風景写真・動画はこちら
![Screen Shot 2019-09-30 at 7.37.09 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194995/c185b3e0-6819-dc81-75e4-6e6ec6622543.png)

https://youtu.be/bHqP4CBoJxg

白い専用治具もCamera Module に付いてますが、筆者はうまく回すことができていません。
（もちろん成功されいる方のブログ記事もあります）
　時計回り：　遠くに焦点を合わせる。
　反時計回り：　近くに焦点を合わせる。

これはハードルが少し高いです。レンズに当たったりするとダメですし。壊してしまうことも無いとは言えません。
慎重にやれば大丈夫ではあります。

手の部分をとる場合は、より近い目にフォーカスを合わせるなどもありえますが、
1mで合わせれば、ほぼ大丈夫です。

下記のような、オートフォーカスの機能に関心がありますが、まだ試せてはいません。
http://www.arducam.com/programmable-motorized-focus-camera-raspberry-pi/
下記のサイトでmotorizedの製品を出しているようなので須賀、試せていません。
https://www.supertekmodule.com/product-item/8mp-sensor-camera-modules/
Hass.io(Home Assistant)の必須Add-onインストール


## Configurator

ブラウザで設定ファイルを編集するときに便利

### 関連URL

https://www.home-assistant.io/addons/configurator

### 参考イメージ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/e1777b8d-9d25-df4a-c890-145a2aed026e.png" width=70%>

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/e069ac00-1c1d-69a8-d68b-657a6cb69c0c.png)

## SSH & Web Terminal

HomeAssistantインスタンスにウェブでターミナル接続するときに便利

### 関連URL

https://community.home-assistant.io/t/community-hass-io-add-on-ssh-web-terminal/33820

### 参考イメージ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/4c133771-c9ac-4069-5bb7-6dd20152dcb9.png" width=70%>

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/300c7ad7-7dc7-46c9-839c-1eaeeedb5e2f.png)

## Node-RED

Node-REDと統合できるのでHomeAssistant関連フローを作成するのに便利

### 関連URL

https://github.com/hassio-addons/addon-node-red/

### 設定

Config設定にて二つ項目を設定する

* credential_secret
* ssl

### 参考イメージ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/9a633253-3d22-b3a2-064a-161fe23448a7.png" width=70%>

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/cc12a9ef-4fe5-fe79-98b4-b50982492b76.png)

## Samba share

Windows PCからファイル編集するときに便利

### 関連URL

https://www.home-assistant.io/addons/samba/

### 参考イメージ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/ce1b864f-ef8e-3fed-6c9a-fe09aebb049f.png" width=70%>

### 設定

ワークグループ/ユーザー名/パスワード/許可ネットワークを設定する

```
{
  "workgroup": "WORKGROUP",
  "username": "«Username»",
  "password": "«Password»",
  "interface": "",
  "allow_hosts": [
    "10.0.0.0/8",
    "172.16.0.0/12",
    "192.168.0.0/16"
  ]
}
```
windowsでmatplotlibの日本語が出ないときに修正するファイルの場所

# TL;DR

掲題のとおりですが、検索して出てくる記事では手元環境とパスが違っていたので改めてメモしておきます。誰かの助けになりますように。


JupyterLab 0.35.3

# ファイルの場所

## IPAexフォントファイル( `ipaexg.ttf` )の置き場所


```
C:\Users\[ユーザー名]\AppData\Local\Continuum\anaconda3\Lib\site-packages\matplotlib\mpl-data\fonts\ttf\
```

## `font.family : IPAexGothic` を追記するべき設定ファイル

```
C:\Users\[ユーザー名]\AppData\Local\Continuum\anaconda3\Lib\site-packages\matplotlib\mpl-data\matplotlibrc
```

# 参考

全体的な手順としてはこちらが参考になるかと。

https://datumstudio.jp/blog/matplotlibの日本語文字化けを解消するwindows編
postgresメモ

全テーブルから
README.md
というカラムを探したい。

でググったけど


http://tihiro.hatenablog.com/entry/2017/08/25/080151

https://devlights.hatenablog.com/entry/20080226/p1

https://qiita.com/cyborg__ninja/items/99efcb5b62a4cef2f156

やらみても分からない……(´；ω；`)ｳｩｩ

teratailで質問すると

```
yoorwm
2019/06/18 14:40

ダンプする、という言い方もあるので「dump psql」辺りで検索すると、周辺知識もついていいかもしれません

2019/06/18 14:49

>PostgreSQL テーブル一覧取得 
などでググってみましたか？
https://devlights.hatenablog.com/entry/20080226/p1
```
とアドバイス頂いたので調査するかなー


ただpgadminでは直接叩けない気がする(´；ω；`)ｳｩｩ
Ensemblが返すNCBI Gene IDが一意じゃなかった件について

~~めったに起きることでも無いと思うが~~（結構起きる、コメント欄参照）、自分の開発しているパッケージ[scTensor](http://bioconductor.org/packages/release/bioc/html/scTensor.html)がこけるパターンの一つとして、Gene NameとNCBI Gene ID（Entrez Gene ID）が一対一対応していない場合があった。

元を辿っていくと、内部で使っているbiomaRtが一つのNCBI Gene IDに対して、複数のGene Nameを返していた。

例えば、RLN1とRLN2は、NCBI側では、以下のように、6013、6019と別々のNCBI Gene IDが振られている。

- RLN1 : https://www.ncbi.nlm.nih.gov/gene/?term=6013
- RLN2 : https://www.ncbi.nlm.nih.gov/gene/?term=6019


しかし、biomaRtを使うと、

```r
library("biomaRt")
ens <- useMart("ensembl", dataset="hsapiens_gene_ensembl",
    host="asia.ensembl.org")

getBM(attributes=c('external_gene_name', 'entrezgene'),
    filters = 'entrezgene',
    values = "6013",
    mart = ens)

#   external_gene_name entrezgene
# 1               RLN2       6013
# 2               RLN1       6013

getBM(attributes=c('external_gene_name', 'entrezgene'),
    filters = 'entrezgene',
    values = "6019",
    mart = ens)

#   external_gene_name entrezgene
# 1               RLN2       6019
```

となるように、biomaRt的には、**6013はRLN1でもRLN2でもある**みたいである。

そして、6019もまたRLN2である。

念の為、本家のWebサイトで手作業でやってみたが、同じ結果になった。

![スクリーンショット 2019-06-18 15.52.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17038/439fcbaa-caf2-e1f8-cda1-f20b3d0debbf.png)

もう少し調べていくと、Ensembl側ではENSG00000107018のページのExternal referencesにNCBIのRLN1のリンクが貼られているが、
https://asia.ensembl.org/Homo_sapiens/Gene/Matches?db=core;g=ENSG00000107018;r=9:5334930-5339876

ENSG00000107014のページには、NCBIのRLN1とRLN2の両方のリンクが貼られていた。
https://asia.ensembl.org/Homo_sapiens/Gene/Matches?db=core;g=ENSG00000107014;r=9:5299864-5304716

RLN1とRLN2はゲノム上では隣同士に位置しており、Human cDNAsのところで繋がっているものがあるため、fusionして発現する場合があるのかもしれない。
それがこのID変換のトラブルに何か関係がありそう。
![Human_95293590_5343307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17038/eff251db-757c-62eb-3225-3d770d7a0143.png)
https://asia.ensembl.org/Homo_sapiens/Location/View?db=core;g=ENSG00000107014;r=9:5293590-5343307


ぐぐると、RLN1-RLN2 fusion exonについての言及が幾つかあった。
https://www.researchgate.net/publication/283261263_Identification_of_a_novel_fusion_transcript_between_human_relaxin-1_RLN1_and_human_relaxin-2_RLN2_in_prostate_cancer/figures?lo=1&utm_source=google&utm_medium=organic
https://www.ncbi.nlm.nih.gov/pubmed/26499396
tapメソッド活用

数か月Rubyを学習しているが、知らないメソッドが多すぎなので、( ..)φメモメモ

#tapメソッド
[引用](https://ref.xaio.jp/ruby/classes/object/tap)
>ブロック変数にレシーバ自身を入れてブロックを実行します。
戻り値はレシーバ自身です。
メソッドチェーンの中にtapメソッドをはさみ込み、ソースコードを簡潔にする目的で使われます。

Ex)

```ruby:
def build_user
  user = User.new
  user.email = "hoge@hoge.com"
  user.name = "Taro Yamada"
  user
end
```

上記は下記のように書き換えられる。

```ruby:
def build_user
  User.new.tap do |user|
    user.email = "hoge@hoge.com"
    user.name = "Taro Yamada"
  end
end
```

#最後に
[[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか](https://qiita.com/jnchito/items/dedb3b889ab226933ccf)
で今回は気づきを得ました。
初心者ですが、可読性が高いコードを目指します。
Railsで外部DBに接続してSQLで結果を取得する方法

外部DB向けのmodelを作成してActiveRecordで取得する方法は見つかったが、直接SQLでアクセスする方法が見つからなかったので、備忘録として記録しておく。
※あくまで一方法なので、他にもいい方法があると思いますのでそこは悪しからず。

## database.ymlの設定

外部向けのDB情報をextend_db(名前は任意)を追加で定義する。

```yml

extend_db:
  adapter: postgresql
  database: [extend_db_database]
  host: [extend_db_host]
  username: [extend_db_username]
  password: [extend_db_password]

```

## 外部DB向けmodelを作成

私の場合は`model/extend/base.rb`というファイルを作りました。
`self.abstract_class = true`はモデル名に対応するテーブルが無い時に使う。
`establish_connection :extend_db`は`Extend::Base`の接続先が前述のDBになる。
クラスメソッド`execute_sql`を定義。

```ruby
class Extend::Base < ActiveRecord::Base
  self.abstract_class = true
  establish_connection :extend_db

  def self.execute_sql sql
    begin
      result = connection.select_all(sql)
    rescue => e
      raise e.message
    end
    return result
  end

end

```

## 取得方法

```ruby
sql = "select * from hoge"
Extend::Base.execute_sql(sql)
```

`ActiveRecord::Result`オブジェクトで取得できます。
Powershell でユーザ環境設定(Path)

miniconda3をインストールしたあとに、ユーザ環境を設定する powershell の例です。

手打ちより、少し楽といったところです。

```
$oldUserPath = [System.Environment]::GetEnvironmentVariable("Path", "User")
Write-Host $oldUserPath
$oldUserPath += ";C:\ProgramData\Miniconda3;C:\ProgramData\Miniconda3\Library\mingw-w64\bin"
$oldUserPath += ";C:\ProgramData\Miniconda3\Library\usr\bin;C:\ProgramData\Miniconda3\Library\bin;C:\ProgramData\Miniconda3\Scripts"
[System.Environment]::SetEnvironmentVariable("Path", $oldUserPath, "User")

Write-Host $oldUserPath
```
APKに正しく署名できているか確認する

AndroidのAPKを署名付きで出力したとき、期待通り署名できているか、証明書のフィンガープリントと比較し、確認する

### フィンガープリントを確認する

 - キーストアファイルのフィンガープリントを出力する

```shell
keytool -v -list -keystore myKeystore.keystore
```

 - APKの署名のフィンガープリントを出力する

```shell
keytool -printcert -jarfile myApp.apk
```

 - それぞれ出力したフィンガープリントが一致するか確認する

```
...
証明書のフィンガプリント:
	 SHA1: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
	 SHA256: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
...
```

### 参考

[keytool-Key and Certificate Management Tool](https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/keytool.html#Changes)
全身3Dスキャン / リアルアバター 制作用撮影システムキット - プログラム編 - Raspberry Pi 使用 -

随時更新中。
本記事執筆開始時のビジョンはこちら <a href="https://note.mu/happyocean/n/n5f322b181706">https://note.mu/happyocean/n/n5f322b181706<a> ぜひ読んでください。

筆者は職業ソフトウェアエンジニアではありませんので、間違いやこうやったほうがいいよ、というのはお知らせください。


＊＊＊＊現在は、下記ではなく、Node.jsベースのコードをRaspberry Pi（クライアント）とMac（サーバー）に使用しています。＊＊＊＊＊


=============================================
●写真を撮る。

```python:picture.py
import time
import picamera
 
with picamera.PiCamera() as camera:
 camera.resolution = (3280, 2464)
 camera.rotation = 90 #カメラの向きによります。基本的には、縦使いが、より多くのピクセルで人物をカバーできるので良い。
 camera.sharpness = 100
 camera.start_preview()
 # Camera warm-up time
 time.sleep(7)
 camera.capture('1.jpg')
```

●複数のRaspberry Pi に同時接続・写真撮影プログラムの実行は 現状 fabric を 利用。但しvesion2系と1系で違うので適用注意。

```python:fabfile.py
from fabric.api import run
from fabric.api import env
from fabric.api import parallel
from fabric.api import get

env.hosts = ["192.168.1.1", "192.168.1.2","192.168.1.3", #・・・・・
"192.168.1.96"]

env.user = "xxxxx" #Raspberry Pi ユーザー名
env.password = "yyyyy" #パスワード　ファイル内にパスワードをそのまま書くのは推奨しません。回避は別途

@parallel #同時に走らせます。これが無いと、IPアドレスの順番に一つづつ実行されていきます。

def go_fab():
	run("python picture.py")
```
実行は、fabfileのあるディレクトリへ移動して

```
fab go_fab
```
fabfile.py の時は上記で実施できる。

ファイルが別の名称の時は下記で実行。

```
fab -f xxxx.py yyyy()
```


●Raspberry Piから写真をコントロールサーバーへ移動

```python:goget.py
from fabric.api import run
from fabric.api import env
from fabric.api import parallel
from fabric.api import get

env.hosts = ["192.168.1.1", "192.168.1.2","192.168.1.3", #・・・・・
"192.168.1.96"]

env.user = "xxxxx" #Raspberry Pi ユーザー名
env.password = "yyyyy" #パスワード　ファイル内にパスワードをそのまま書くのは推奨しません。回避は別途

#@parallel をするとネットワークの輻輳でかえって遅くなる場合があります。
#ルーターを複数分けるなどすることで対応もできますが、コストパフォーマンスの優れた方法を模索中です。有線LANで組むともちろん早いです。

def go_get():
	host_string=env.host
	get('/home/pi/1.jpg', host_string + '-1.jpg')　#仮にファイル名称にIPアドレスを付与してますが、この辺りはお好みで。
```
Swift5.1のFunction Builderで契約プログラミングっぽい記述をする

Swift5.1で導入されるFunction Builderを学ぶため、Function Builderで契約プログラミング（DbC）っぽいことをできるようにしてみます。（実用性は無いですが）

まずIn, Out, Bodyを構成するための型を用意します。

```swift
public struct In<S> {
    var message: String
    var contract: (S) -> Bool
    
    public init(_ message: String = "", _ contract: @escaping (S) -> Bool) {
        self.message = message
        self.contract = contract
    }
}

public struct Out<T> {
    var message: String
    var contract: (T) -> Bool

    public init(_ message: String = "", _ contract: @escaping (T) -> Bool) {
        self.message = message
        self.contract = contract
    }
}

public struct Body<S, T> {
    var body: (S) -> T
    
    public init(body: @escaping (S) -> T) {
        self.body = body
    }
}
```

次にFunction Bulider用の型を記述します。

```swift
@_functionBuilder public struct DbCBuilder {
    static func buildBlock<S, T>(_ a: In<S>, _ b: Body<S, T>) -> (S) -> T {
        return { s in
            precondition(a.contract(s), a.message)
            return b.body(s)
       }
    }
    
    static func buildBlock<S, T>(_ a: Out<T>, _ b: Body<S, T>) -> (S) -> T {
        return { s in
            let t = b.body(s)
            precondition(a.contract(t), a.message)
            return t
        }
    }
    
    static func buildBlock<S, T>(_ a: In<S>, _ b: Out<T>, _ c: Body<S, T>) -> (S) -> T {
        return { s in
            precondition(a.contract(s), a.message)
            let t = c.body(s)
            precondition(b.contract(t), b.message)
            return t
        }
    }
}
```

buildBlockを3つ用意しました。In+Body, Out+Body, In+Out+Bodyです。

このFunction Builderを利用する関数を記述します。

```swift
func dbc<S, T>(@DbCBuilder block: () -> (S) -> T) -> (S) -> T {
    return block()
}
```

これで準備ができました。
これらを利用した関数を記述します。

```swift
func calc(_ i: Int) -> Int {
    dbc {
        In { $0 > 1 }
        Body { $0 * $0 }
    }(i)
}

func add(_ a: Int, _ b: Int) -> Int {
    dbc {
        In { $0 > 0 && $1 > 0 }
        Out { $0 > 2 }
        Body { $0 + $1 }
    }((a, b))
}

calc(2)
add(1, 2)
```

dbc関数の中でIn+BodyやIn+Out+Bodyを返すことでDbCBuilderの各buildBlockが実行され(S)->Tが返され、dbc関数の返値となります。
[Python] Numpyで複数の要素をリスト形式で除く(ブラックリスト)

1次元配列を処理する際に、例外として取り除きたいデータが複数あったのですが簡単な処理が見つからなかったため実装しました。

さて、要件としては

* 欲しいのは例外データのあるインデックスが```False```になる1次元のリスト  
* 取り除く条件はリストインデックスをリストに入れたもの

## コード
作成したコードが以下になります。
```length```は処理対象データのリスト長で、
```blklist```が取り除くインデックスリストになります。

まず、```blklist```の各要素ごとでboolのリストを生成して、それを```np.any```で論理和を取ります。
この状態では```blklist```のインデックスのみ```True```となるリストになってしまっているので、最後に反転させます。

```Python
def get_bool_blklist(length, blklist):
    if (blklist == None) | (blklist == []):
        return np.array([True] * length)
    return np.logical_not(np.any([np.arange(length) == i for i in blklist],axis=0))
```

以下ような形で使用しました。
この例では1番目と4番目の要素を取り除いています。

```Python
np.arange(5)[get_bool_blklist(5, [1, 4])]
#Out[1]: array([0, 2, 3])
```
CodeBuildでStandard2.0のイメージを使用したらエラー出たときの対処

AWS CodeBuildでデフォルト提供されるイメージがいつからかstandardというのになってて
1.0と2.0が選択できるようになっていた。

<img src="https://i.imgur.com/2NbpDZ7.png"/>

2.0を選択して、
よくあるフォーマットの ```buildspec.yml``` を実行すると

```
YAML_FILE_ERROR Message: This build image requires selecting at least one runtime version.
```

というエラーが発生した。

[公式のトラブルシューティングに記載がある](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/troubleshooting.html#troubleshooting-build-must-specify-runtime) ように、```aws/codebuild/standard:2.0 ``` を使用するときは ```runtime-versions``` を指定する必要があるよう。

たとえばDockerの場合は以下のように指定する

```yml
phases:
  install:
    runtime-versions:
      docker: 18
```

対応しているランタイムは[こちら](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html#build-spec-ref-syntax) に記載がある。

以下スクショ

<img src="https://i.imgur.com/QeunoYK.png">
iPadのカメラサイズ

https://everymac.com/systems/apple/ipad/ipad-faq/ipad-basics-phone-camera-viewing-angle-storage.html

iPadの画面サイズとカメラの入力リソースは、
サイズが違う。

iPad ProでUnityでWebCamTextureを扱うとき、
なんか比率が合わないなーと思っていたのだけど、
僕のiPadサイズは2224x1668だけど、入ってくるのは4Kサイズ(4096×2160)だったみたい。
こちらに合わせると、ぴったりの比率で表示できました。
forEachメソッドを理解するため、関数で同じように動くコードを書いてみた

ご無沙汰しております、プログラミング初心者オジサンです。

配列を使ったコードを全然書いていなかったので、forEachメソッドが苦手です。コールバック関数もよく分かっていません。
そこで今回はforEachメソッドの動きを体感するため、コールバック関数を使ってforEachメソッドと同じように動くコードを書いてみました。

##1.forEachメソッドの場合
```javascript
    // 配列
    const stations = ['新宿', '代々木', '原宿', '渋谷'];

    // forEachメソッド
    // 第1引数は配列の要素、第2引数はインデックス
    stations.forEach((station, index) => {    
        console.log('forEachメソッド index：', index, '駅名：', station);
    });
```
このコードは、「新宿、代々木、原宿、渋谷」の4駅を入れたstaitonsという配列を、インデックス順に駅名を並べるものになります。
実行すると、

forEachメソッド index： 0 駅名： 新宿
forEachメソッド index： 1 駅名： 代々木
forEachメソッド index： 2 駅名： 原宿
forEachメソッド index： 3 駅名： 渋谷

とコンソールに表示されます。

##2.関数で同じように動かす場合
```javascript
    // forEachメソッドの動きを関数でやる場合
    // 関数名はforEachとし、第1引数は配列、第2引数はコールバック関数
    const forEach = (array, cb) => {
        for (let i = 0; i < array.length; i++) { // 配列の長さだけコールバック関数を繰り返す
            cb(array[i], i); // 引数の順番もforEachメソッド風に
        }        
    };
    // forEach関数の第1引数にstations配列を入れ、第2引数のコールバック関数の第1引数に駅、第2引数にインデックスを入れる   
    console.log(forEach(stations, (station, index) => {
        console.log('forEachの動きを関数でやる場合 index：', index, '駅名', station);
    }));
```

このコードを実行すると、

forEachの動きを関数でやる場合 index： 0 駅名： 新宿
forEachの動きを関数でやる場合 index： 1 駅名： 代々木
forEachの動きを関数でやる場合 index： 2 駅名： 原宿
forEachの動きを関数でやる場合 index： 3 駅名： 渋谷

とコンソールに表示され、forEach関数と同じ動きをしてくれます。

##最後に
forEachメソッドと同じく、mapメソッドもよく理解できていません。
使いどころがイメージできず、自分で考えたコードを書いたことがないためです。
イメージできたらサンプルコードを書いてみたいと思います。
SlackのIncoming WebhookにNode.jsで投稿する


```Node.js
const request = require('request');

request({
  url: 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL',
  method: 'POST',
  headers: {'Content-Type': 'application/json' },
  body: JSON.stringify({
    text: '@channel SOME MESSAGE',
    link_names: 1 // @がメンションと解釈されるためのフラグ
  })
}, (error, response, body) => {
  if (error) {
    return console.error(error);
  }
});
```

json: {'...'} だとメンションがうまくいかなかったため（テキスト扱いされた）、
body: JSON.stringify({text: '...'}) に変えたらうまくいった
Azure DevOps  利用料の考え方

# 購入モデルは大きく２種類

## [Azure DevOps Server](https://azure.microsoft.com/ja-jp/services/devops/server/)(DevOpsサーバー)
サーバーへインストールするモデルです。
こちらについてはリセラーにお問い合わせください。
https://azure.microsoft.com/ja-jp/pricing/details/devops/server/
上記料金について記載のサイトには
> Azure DevOps Server 2019 では、Azure を使用して月ごとに支払うか、3 年のコミットメントが必要なクラシック ソフトウェア ライセンスを購入できます。Azure を通じた購入では、クラウド サービスを利用するボーナスが得られるため、必要に応じて自由にクラウドに移行できます。どちらを選択した場合でも、Azure DevOps Server 2019 を実行するサーバー用の Windows ライセンスまたは Windows Server ライセンスも必要です。

との記載があります。
閉域ネットワークにこだわりのある会社、日本語にこだわりのある会社では、こちらが選択肢になるかと思います。

## [Azure DevOps Services](https://azure.microsoft.com/ja-jp/services/devops/)(DevOpsサービス)

クラウドベースのモデルです。一般的に"Azure DevOps"というと、こちらを指します。
こちらは毎月利用料金を支払うモデルです。
必要な時に必要な分を継続購入し、いつも最新の環境を手に入れるというサービスです。
ここではAzure DevOps Servicesについて記載します。

# 利用料金はおいくら？
Azure DevOpsの料金は、こちらで計算ができます。
[Azure DevOpsの料金](https://azure.microsoft.com/ja-jp/pricing/details/devops/azure-devops-services/)
以下の内容を理解したうえで、必要な分を計算して算出しましょう。

## おさえておきたいこと
### 始めるだけなら無料
ほぼすべての機能を無料で使い始めることができます。

### 人に対する課金とコンピューティングパワーに対する課金に分かれている
[１つ前の投稿](https://qiita.com/mstakaha1113/items/1cf45a5119e1397d0315)で触れた４つのサービスを例にすると、Boards・Repos・TestPlansは人に対して課金されます。
Pipelinesはコンピューティングパワーに対して課金されます。
Pipelinesは、プログラムをコンパイルしたりテストを流したり、デプロイしたりという作業を肩代わりしてくれますが、この作業は人手を介さない自動化に主眼を置いています。
よって、ここはコンピューティングパワーに対して課金されます。
人に対して実施される課金の種別を"ユーザーライセンス"、コンピューティングパワーに対して実施される課金の種別を"個別サービス"という名前で表現しています。

### 人への課金パターン(ユーザーライセンス)
- 最初の5名までは無料
細かい話題には触れませんが、AzureDevOpsは利用者を招待してみんなで使います。
この招待する最初の5名は無料です。

- Visual Studioサブスクリプション保有者は無料
Visual Studioサブスクリプション(昔のMSDN)を保有している方は無料で利用できます。
サブスクリプションレベルに応じて利用できる範囲には制限がありますので、詳細はこちらをご確認ください。
[Visual Studio サブスクリプションの Azure DevOps 特典](https://docs.microsoft.com/ja-jp/visualstudio/subscriptions/vs-azure-devops)

- ステークホルダーは無料
端的にいえば、モノを作らないけど"何を作るのか""できているのか"を気にしているだけの方は無料で利用できます。こちらも利用できる範囲には制限があります。(まずはモノ作りには参加できないと覚えておいてください)

- 上記に当てはまらない開発者への課金
Boardsを見ながら開発し、Reposにソースコードを登録する開発者に対して課金が発生します。
"Basicプラン"という名前の課金は、この開発者への課金となります。
料金は変わる可能性もありますので、上記料金ページにてご確認ください。

- 上記に当てはまらないテスト専門家への課金
"Basicプラン"に加え、Test Plansを利用するユーザーについては、"Basic+Testプラン"という名前の課金となります。
こちらも料金は変わる可能性もありますので、上記料金ページにてご確認ください。

### コンピューティングパワーへの課金パターン（個別サービス）
- Pipelinesは1800分/月まで無料
20営業日/月ベースで考えると1日90分までのパイプラインは無料です。（同時実行不可など制限事項もありますが、ここでは触れません）

- 上記を超過する分は課金
こちらも料金は変わる可能性もありますので、上記料金ページにてご確認ください。

課金に関するページを見ると、他にも情報がありますが、まずはここまで。

# Azure DevOps Services の支払い方法
Azure DevOpsはAzureというマイクロソフトが提供するサービスの１つとなります。
よって、支払い方法もAzureに準じています。

簡単に記載すると、

- マイクロソフトアカウントを作成する
- 支払い単位となるサブスクリプションを作成する（作成されてる）
- 支払い用のクレジットカード情報を登録する

というような流れになります。
その他、会社によっていくつかの精算方法がありますので、こちらもリセラーにお問い合わせください。

# まとめ
Azure DevOpsは、"支払い方法がややこしい"というよりも、"支払わなくて良い方法がたくさんある"と言った方が適切だと思います。
（正しく管理することでコストメリットが出やすい。また当然ですがマイクロソフトのサービスとの組み合わせによるメリットを意識している。）
![20190618-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/68509d46-ddff-d6c3-52fb-87cfad350ea7.png)
正規表現について

#学習後の結論
100%理解し扱うのは今のところかなり難しい。

サービスやアプリの規模の大きさでも正規表現の目指す精度も違うだろうし、調べてみると様々な書き方があるので。

なので、参考リンクをベースに基本を習得し、ある程度噛み砕けるようになる。
そして、今後応用できるように情報をストックしておくのが今はベターかと思う。

#参考リンク
https://qiita.com/jnchito/items/893c887fbf19e17d3ff9
https://qiita.com/teinen_qiita/items/806aba936a8ed1f7654e

#正規表現(Regular Expression)とは
(regexとも呼ばれる)
文字列のパターンを指定して、指定した(有効な)文字列のみをマッチさせ、それ以外(無効な)の文字列はマッチしないようにする言語。置き換えも可。
(と、自分は認識)

#メタ文字
正規表現で使用する特殊文字を**メタ文字**と呼ぶ。

#基本的なメタ文字

`.`←なんでもいい一文字を検索。
`^`←先頭の文字を検索。
`$`←行の最後の文字を検索。
`[]`←この中で括られた一文字を検索。
`*`←直前の文字が0か1文字以上。
`+`←直前の文字が1文字以上。
`?`←直前の文字が0か1文字。
`|`←どちらか検索。(or)
`()`←この中に括られた全てを検索。


※メタ文字でなく、普通の文字としてマッチさせたい場合は`\`を前に付ける。
`\.  \^  \$  \[  \]  \*  \+  \?  \|  \(  \)`

#その他のメタ文字
`{n,m}` や `{n}`←文字の個数を限定。（文字量を指定するから「量指定子」 と呼ばれる）
`\d`←1個の半角数字（0123456789）を意味する。
`\w`←英単語を構成する文字を意味する。
`\s`←半角スペースやタブ文字`\t`、改行文字`\t`など、目に見えない「空行文字全般」を意味する。(文字クラスと呼ばれる)
その他、復帰文字`\r`や改ページ文字`f`がある。


#正規表現を試せるWebサイト
[Rubular](https://rubular.com/?JUMPPAGE=ADVERTISE)


#使用例
自分のオリジナルアプリ内で、URL等にバリデーションをかける際に使用。

```app/models/court.rb
class Court < ApplicationRecord
    belongs_to :user
     
    validates :store_name, presence: true

    VALID_TEL_REGEX = /0[1-9]\d{0,3}[-(]\d{1,4}[-)]\d{4}/
    validates :tel, format: { with: VALID_TEL_REGEX }, allow_blank: true

    VALID_EMAIL_REGEX = /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
    validates :store_email, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX },
                                allow_blank: true
                      
    validates :url, format: { with: /\A^https?:\/\// }, allow_blank: true            
end
```
つかってないIAMユーザを表示するシェルスクリプト

## つけぇかた
Mac向け
jqとaws-cli要る

引数に何日前まで使ってないかをいれる

```
sh hoge.sh 60
```

```shell
#!/bin/bash

for i in `aws iam list-users | jq -r '.Users[].Arn'`
do
  jobId=$(aws iam generate-service-last-accessed-details --arn $i | jq -r '.JobId')
  lastActivity=$(\
      aws iam get-service-last-accessed-details --job-id $jobId | \
      jq -r '.ServicesLastAccessed[].LastAuthenticated' | \
      sort -n | tail -n 1
  )

  if [ $lastActivity == 'null' ] ; then
    continue
  fi

  lastActivityUnix=$(\
      date -u -j -f "%Y-%m-%dT%H:%M:%SZ" $lastActivity +%s
  )
  todayUnix=$(date +%s)
  if [ `expr $todayUnix - $lastActivityUnix` -ge `expr $1 "*" 86400` ] ; then
    echo "UserArn:" $i
    echo "LastActivity:" $lastActivity
    echo "======================================"
  
  fi
done
```

## 参考

使用していない認証情報の検索
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_finding-unused.html
CLIで簡単にKotlinを動かす

# Kotlinインストール

Homebrewでインストール

```bash
$ brew install kotlin
```


# jarにコンパイルして実行

## コーディング

`hello.kt` を作成

```kotlin:hello.kt
fun main(args: Array<String>) {
    println("Hello, World!")
}
```

## コンパイル

`kotlinc` で jarファイルにコンパイル

```bash
$ kotlinc hello.kt -include-runtime -d hello.jar
```

## Hello, World!実行！

```bash
$ kotlin hello.jar
Hello, World!
```

ﾔｯﾀﾈ！

# scriptファイルとして実行

## コーディング

`hello.kts` を作成

```kotlin:hello.kts
println("Hello, World!")
```

## scriptオプションを付けて実行！

```bash
$ kotlinc -script hello.kts
Hello, World!
```

ﾔｯﾀﾈ！
VS CodeでPowerShellの日本語を扱う時の文字化けへの対処法

# 文字化けの原因
VS Codeではファイル作成時のデフォルトの文字コードが**UTF-8**だが、PowerShellでは**UTF-8 With BOM**である必要があるため。
PowerShell ISEの場合はデフォルトの文字コードが**UTF-8 With BOM**となっています。

# 対処法
ここではVS Codeのデフォルトの文字コードをUTF-8 With BOMに変更してしまう方法を取る。
VS Code全体に影響を与えるので、他の言語も使う人は要注意。

1.　F1を押してコマンドパレットを開いて、**preferences: Open Settings (JSON)**を開く。
2.　**"files.encoding": "utf8bom",**　を追記する。
3.　PowerShellばっかり書く人はついでに、**"files.defaultLanguage": "powershell",**も追記すると新規ファイルがPowerShellモードで立ち上がるようになって便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16664/6f20b6f2-4b17-f97b-2a95-1758132c11b6.png)

# 余談
PowerShellを書く場合の選択肢として有力なのはPowerShell ISEだと思うのですが、VS Codeがかなり便利なので試してみると幸せになれるかもしれません。
インテリセンスは優秀ですし、特に頑張らなくてもデバッグも出来ますし、何より改行時のインデント周りの動きが段違いです。
PowerShellを6.0と5.1を行き来するのも右下のメニューから一瞬です。
Webサーバー 'IIS Express' に接続できませんでした。

# 現象
ASP.NET Core WebアプリケーションやASP.NET WebアプリケーションをVisual Studioでデバッグ実行しようとしたところ「Webサーバー 'IIS Express'に接続できませんでした。」というアラートWindowが表示されてアプリを実行できない。

# 対策
プロジェクトのプロパティ -> デバッグ -> アプリURLのポートを変更する(51539など)

![project_property.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15231/52ef52bf-119b-00f3-f92e-c5d74d264670.png)

# おわりに
Googleで「Webサーバー 'IIS Express' に接続できませんでした。」と検索したところ、「IIS Express Webサーバーを起動できません」というメッセージの記事ばかりがヒットして中々、解決にたどり着けなかったので本記事を投稿しました。
python の　お勉強　５日目

# 亀にグラフを描いてもらいます。
前回は　値が固定した　棒グラフでしたが
今回は　値を入力するできるようにしてみました。
いろいろと検索してみましたが　
turtlegraphicのオンラインマニュアルにあるように
テキスト入力は　以下のものだけのようです。

---
Input methods
turtle.textinput(title, prompt)
パラメータ
title -- string
prompt -- string


このInput methodsを４回使用して数値情報を
取得してグラフを描きました。
（前回のプログラムにInputMethodsを８行追加しました。
tkinterとturtlegraphicを連携させることはできませんでした。）
プログラムを起動するとbefore,30min,1hour,2hourの値の入力
画面が表示されます　０から１０００までの数を想定しています。
入力が終わると　亀がグラフを描いてくれます。

```python

from turtle import *
screensize(300,300)
color('blue', 'yellow')
setworldcoordinates(-150, -150, 150, 150)
shape("turtle")
screen1 = Screen()
screen2 = Screen()
screen3 = Screen()
screen4 = Screen()
answer1 = screen1.textinput("","before")
answer2 = screen2.textinput("","30min ")
answer3 = screen3.textinput("","1hour ")
answer4 = screen4.textinput("","2hour ")

up()
setpos(-140,-140)
down()
def mkaxis():
   fd(45)
   rt(90)
   fd(5)
   bk(5)
   lt(90)
mkaxis()
mkaxis()
mkaxis()
mkaxis()
mkaxis()
mkaxis()
setpos(-140,-140)
lt(90)
mkaxis()
mkaxis()
mkaxis()
mkaxis()
mkaxis()
mkaxis()
up()

def mkbar(x1):
   fd(x1)
   rt(90)
   fd(30)
   rt(90)
   fd(x1)
   up()
   home()
   lt(90)


setpos(-110,-140)
down()
mkbar(int(answer1)/3)
up()

setpos(-65,-140)
down()
mkbar(int(answer2)/3)
up()

setpos(-20,-140)
down()
mkbar(int(answer3)/3)
up()
      
setpos(70,-140)
down()
mkbar(int(answer4)/3)
up()
      
setpos(-180,-140)

```
次回はtkinterのcanvasを使ってグラフを描いていきます
解決方法：CircleCI Orbs が registry に存在せずビルドエラーになる

# 問題

CircleCIの公式ドキュメントを参考に用意した`.circleci/config.yml`でビルドエラーになった。

## 参考にした`config.yml`


参照元：[Configuring Deploys \- CircleCI](https://circleci.com/docs/2.0/deployment-integrations/#heroku)
Configuring Deploys > Heroku > Customizing Heroku Workflows

```yml:.circleci/config.yml
version: 2.1
orbs:
  heroku: circleci/heroku@1.0.0
workflows:
  heroku_deploy:
    jobs:
      - deploy
jobs:
  deploy:
    executor: heroku/default # Uses the basic buildpack-deps image, which has the prerequisites for installing heroku's CLI.
    steps:
      - checkout
      - heroku/install # Runs the heroku install command, if necessary.
      - heroku/deploy-via-git: # Deploys branch to Heroku via git push.
          only-branch: master # If you specify an only-branch, the deploy will not occur for any other branch.
```

## ビルド結果

### スクリーンショット
![circleci-build_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/6b64f06d-85b2-7509-8eaa-8b9a72b2032c.png)

###  エラーメッセージ

```
# Config Processing Error (Don't rerun)

$ #!/bin/sh -eo pipefail
  # Cannot find circleci/heroku@1.0.0 in the orb registry. Check that the namespace, orb name and version are correct.
  # 
  # -------
  # Warning: This configuration was auto-generated to show you the message above.
  # Don't rerun this job. Rerunning will have no effect.
  false

Exited with code 1
```

# 原因

レジストリに存在しない CircleCI orbs を利用していた。

## 備考

公式ドキュメントで orbs に`circleci/heroku@1.0.0`が指定されていたが、`1.0.0`は registryに（まだ）存在しないバージョンだった。

```yml:.circleci/config.yml
# 省略
orbs:
  heroku: circleci/heroku@1.0.0
# 省略
```

## 解決方法

### 1. 利用可能な CircleCI orbs を検索

　Explore Orbs ページで registry 上の Orbs を検索する。

　[CircleCI Orb Registry](https://circleci.com/orbs/registry/)
　![circleci-build_error(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/335c3ffd-1f28-107d-9c51-6533af52a9bf.png)


### 2. `config.yml` の orbs(バージョン) を修正

検索結果に表示された orbs(バージョン) に書き換える

```yml:.circleci/config.yml
# 省略
orbs:
  heroku: circleci/heroku@0.0.8
# 省略
```

### 3. ビルドが成功することを確認

`.circleci/config.yml`をコミット ＆ `git push` して CircleCI のビルドが成功することを確認する。

![circleci-build_error(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/14ddf7c6-6f5c-ca4c-2581-8d32f47dd82d.png)
[CSS]float解除の方法　3種類

# float解除の方法
## floatしない次のブロックレベル要素（兄弟）がある場合

その要素でclearすると解除される
`clear: right[left];`
`clear: both;`

##  floatしない次のブロックレベル要素（兄弟）がない場合

1.親要素で指定
`overflow: hidden;`

2.親要素にclearfixをつける　classで指定する

```
.clearfix::after {
	content: "";
	clear: both;
	display: block;
}

```
bundle installができない

bundle installしようとしたら

```
Traceback (most recent call last):
        2: from /Users/(ユーザ名)/.rbenv/versions/2.5.1/bin/bundle:23:in `<main>'
        1: from /Users/(ユーザ名)/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path'
/Users/(ユーザ名)/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
```

と出てきた。

Gemfile.lockに
```
BUNDLED WITH
   2.0.1
```

とあったので

```:no_mouth:
gem install bundler -v 2.0.1
```

すると

```
ERROR:  While executing gem ... (Errno::EACCES)
    Permission denied @ rb_sysopen - /Users/(ユーザ名)/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-2.0.1/CHANGELOG.md
```

と。:frowning2:

```
sudo chown -R (ユーザ名):staff /Users/(ユーザ名)/.rbenv
```
で無事bundle install できた。

権限まわりのエラーらしい:no_mouth:


とりあえずよかった:relaxed::v_tone1:
[Vue]v-ifとv-forを同じタグ内に書いたら、v-ifが無視される件

# 問題のコード
```html:期待する挙動をしてくれないコード
<ul>
    <li v-if="objs.length" v-for="obj in objs">
        {{ obj }}
    </li>
    <li v-else>
        オブジェクトがないよ！
    </li>
</ul>
```
今回省略しているが、objsに何かオブジェクトが入っていたとして、それを「v-for」を使って「objs」を1つずつ「obj」に格納し、出力しているとします。
そして、同じliタグ内に「v-if」を書いていて、objsの個数がfalseのとき（つまりobjsの中身がないとき）、
pタグが出力される、という挙動を期待したとします。

# 実行すると…
このコードを実行しても、残念ながらpタグが出力されず、期待した挙動を行ってくれません。
#v-forはv-ifより先に実行され、v-ifはそのまま素通りされる
実は、今回のv-if/v-forの両ディレクティブは、v-forの方が先に実行される、という特徴があります。

つまり、liタグの中で、v-ifより先にv-forが実行され、objsの中に何も入っていなかった場合は、もちろんここには何も出力されることはない。
そこで、liタグ内のv-ifを、それからでも実行してくれると良いのだが、残念ながらそうはいかず、liタグを抜けてしまい、pタグに入ってしまうそうな。
もちろん、v-ifの判定もしていないので、v-elseは素通りされ、結果的に何も表示されないという挙動になってしまうわけです。
# 代替案
```html:期待する挙動をしてくれるコード
<ul v-if="objs.length">
    <li v-for="obj in objs">
        {{ obj }}
    </li>
</ul>
<ul v-else>
    オブジェクトがないよ！
</ul>
```
このように、v-ifを1階層上のタグに移すことで、対応できます。
ありがとうございました。
Python-docxで日本語フォントを使いたい

#はじめに
Python-docxを使って文書の自動生成プログラムを作っているとき、「ＭＳ 明朝じゃなくて、どうしてもＭＳ Ｐゴシックいいのじゃ～」って言われたことはありませんか？
そんな時に、このプログラムを参考にしてもらえると幸いです。

#環境
Python 3.7.2
pip install python-docx 済み

#コード
```py:pydocx_sample.py
import os
import sys

#word
from docx import Document
from docx.oxml.ns import qn


document = Document('tmp.docx')#余白とかのベースを拾う

para = document.add_paragraph()
run = para.add_run("あいうえお")
run.font.name = "ＭＳ Ｐゴシック"
run._element.rPr.rFonts.set(qn('w:eastAsia'), run.font.name)

document.save('sample.docx')
```

#使い方
1. こういう感じで、tmp.docxを作っておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216904/d565a213-b910-a97a-fe52-c85df4d030a7.png)

1. そして、pydocx_sample.pyを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216904/4ca452f0-a42f-cada-2b79-be80cbd17bcf.png)

1. すると、このようにsample.docxが生成できてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216904/0eab128c-275f-4dea-e278-433c0685948f.png)

1. sample.docxの中身にも、ＭＳ Ｐゴシックで文字が入力できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216904/42c56da9-b0e3-2b91-a6b5-0c9958db9615.png)
※なぜか最初の1行空いてしまいます。回避策を知っている方がいらっしゃったらご教授お願いします！

#おまけ(表の挿入と入力)
python-docxを用いたwordの日本語フォント入力が楽にあるクラスを公開してます。こっちのクラスでは、表の入力にも対応しています。
[pydocx_ja_font](https://github.com/shrimp-f/pydocx_ja_font)
↓こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216904/9df45ec2-27a3-3af1-4838-adcf1aa7dccf.png)

より良いPython-docxライフを！
AEUXを使ってFigmaのデザインデータをAfter Effectsに移動する方法

**Sketch** のデザインデータを **After Effects** を経て **Lottie** でマイクロインタラクションパーツを作るような流れが流行している気がします。また、デザインとフロントエンドが分業のケースでは、インタラクションのイメージを動画で説明する機会も増えてきている気がします。

最近はもっぱら **Figma** ばかり使っているので、figma→sketchを経由せずに、直接 **Figma から After Effects へデータを移す現状最適な方法**を調べてみました。

※ Figmaはもうすぐ公式のプラグインの提供が開始されるとの噂なので、それまでの暫定になるかと思います。



##前提

- [Figma](https://www.figma.com/) が インストールされている
- [After Effect]() が インストールされている

##手順

1. [AEUX](https://aeux.io/)プラグインを After Effect に入れる
（※ .zxpファイルのインストールは **zxp installer** などを使う）

2. Figma の Shareボタンより **URLをコピー**する

3. [こちら](https://figma.aeux.io/)へ行き、FigmaのURLを貼る。

4. 目的のアートボードを選び **Download** を押すと **AEUX.json** ファイルがダウンロードされる。
※アートボード中で画像ファイルを使ってる場合はzipが落ちてくるが、その場合は中身の **AEUX.json** を使う。

5. After Effect の AEUXパネル（ウィンドウ→拡張機能→AEUX）へ AEUX.json を ドラッグ・アンド・ドロップ

6. 動画を作成

7. **Bodymovin** を経由し Lottie用のデータを出力


##注意点

精度が完璧ではないらしく、アイコンのような複雑なパスの部分が壊れたり、微妙に見た目がおかしくなる場合がある様子。
その場合はFigma側である程度FlattenやRasterizeでまとめておくといい感じでした。


より簡単な方法がありましたら、是非コメントいただければ幸いです。
selectメソッド活用

今まで書いていたコードで短くシンプルに書く方法があったので、( ..)φメモメモ

#コード内容

１. each文でブロック内の真偽値を評価し、配列にpushするパターン

```ruby:
array = []
(1..10).each { |num| array << num if num % 2 == 0 && num % 3 == 0 }

# 結果
array = [6]
```

２. selectメソッドでブロック内の真偽値を評価し、真と評価されたものだけ抽出して、配列で返すパターン

```ruby:
array = (1..10).select { |num| num % 2 == 0 && num % 3 == 0 }

# 結果
array = [6]
```

#終わりに
空配列を定義する必要もなく、selectメソッドを使うとシンプルになった。
今回は[「プロを目指す人のためのRuby入門」](http://gihyo.jp/book/2017/978-4-7741-9397-7)を読んで気づきを得ました。