OmniAICreator/Qiita-1.07M huggingface dataset:
CircleCI で master ブランチとマージされたブランチでテストする

## やりたいこと

CircleCI で普通に `checkout` を用いてテストを流して通っても、master にマージ後にエラーになってしまうことがある。それを防ぐためにブランチを master にマージした状態でテストを流したい。

JenkinsやTravisだと選択したらできる程度の機能だが、現状のCircleCIだと頑張らないとできない(という認識)

## 事前知識

GitHub に pull request (PR) すると github 上では `pull/xxx/head` と `pull/xxx/merge` というブランチが作られる。

`pull/xxx/head` が PR されたブランチの head と同じ状態のもので `pull/xxx/merge` がマージ対象のブランチとマージした状態のブランチになる。

なので、基本的には `pull/xxx/merge` のほうを CircleCI で checkout してテストを流せば良い。
しかし、CircleCI の `checkout` では `pull/xxx/merge` のほうを選ぶことができない。

また、`pull/xxx/merge` の `checkout` だと Conflict したかどうかの判断がしづらい。Pull Request を投げた瞬間は

* Conflict しなかった場合: `pull/xxx/merge` が作られる
* Conflict した場合: `pull/xxx/merge` が作られない

一度 `pull/xxx/merge` が作られた後に、git commit && push を積むと

* Conflict しなかった場合: `pull/xxx/merge` が更新される
* Conflict した場合: `pull/xxx/merge` が更新されない

という挙動をする。`pull/xx/merge` の存在確認だけでは Conflict 判定ができない。


## やり方

結局こうなった。つまるところ `git checkout master` して `git merge --no-commit pull/xxx/head` で master に merge してあげている。

制約条件としては Pull Request にしていること。
その制約の代わりに fork されたリポジトリから Pull Request を送った場合でも動くようになっている。

```bash
if [[ -n "${CIRCLE_PULL_REQUEST}" ]]; then
    # TODO: Any ways to get PR destination branch dynamically?
    PR_DEST_BRANCH=master

    # CIRCLE_PR_NUMBER is available only if PR is created from a fork (unavailable if created from a branch).
    # So, manually construct it from CIRCLE_PULL_REQUEST environment variable.
    CIRCLE_PR_NUMBER=$(basename "${CIRCLE_PULL_REQUEST}")

    # Update PR refs for testing.
    FETCH_REFS="+${PR_DEST_BRANCH}:${PR_DEST_BRANCH}"
    FETCH_REFS="${FETCH_REFS} +refs/pull/${CIRCLE_PR_NUMBER}/head:pull/${CIRCLE_PR_NUMBER}/head"
    FETCH_REFS="${FETCH_REFS} +refs/pull/${CIRCLE_PR_NUMBER}/merge:pull/${CIRCLE_PR_NUMBER}/merge"

    # Retrieve the refs
    echo "git fetch -u origin ${FETCH_REFS}"
    git fetch -u origin ${FETCH_REFS}

    # Checkout PR destination branch and merge PR head ref.
    # If conflicts occur, exit with non-zero.
    echo "git checkout ${PR_DEST_BRANCH}"
    git checkout "${PR_DEST_BRANCH}"
    git config user.name 'foo' # Need to configure something to git merge
    git config user.email 'foo@example.com'
    echo "git merge --no-commit \"pull/${CIRCLE_PR_NUMBER}/head\""
    git merge --no-commit "pull/${CIRCLE_PR_NUMBER}/head"
fi
```

これを checkout のあとに書く

```yaml
jobs:
  foobar:
    steps:
      - checkout
      - run:
          name: 'Checkout merged branch'
          command: |
            ここにインデントして書く
```

CircleCI 2.1 以上なら commands にしておくとよいかもしれない

```yaml
version: 2.1

commands:
  checkout_merge:
    steps:
      - run:
          name: 'Checkout merged branch'
          command: |
            ここにインデントして書く

jobs:
  foobar:
    steps:
      - checkout
      - checkout_merge
```

## 参考文献

* https://discuss.circleci.com/t/show-test-results-for-prospective-merge-of-a-github-pr/1662/8
  * このままだと「事前知識」に書いたように Conflict 検知がうまくいかなかった。
SVG画像がIE11ではみ出すとき、viewBox属性を付与したら直った

#現象について
SVG画像を&lt;img&gt;タグで表示していた時に、IE11で表示確認すると、画像が見切れて表示されていた。

##※実装したイメージ

```html
<span style="background: #db365d; display: block; height: 24px; padding: 6px 0 0; width: 30px;">
    <img src="heart.svg" alt="Heart" style="width: 18px; height: auto;">
</span>
```

###正常なアイコン
![正常なアイコン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40940/b714650b-3189-3cda-398b-cabc6b4b78dc.png)

###IE１１でのアイコン
![IE１１でのアイコン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40940/22e53703-1e78-62c0-8e17-760497bb06f8.png)


#解決したこと
画像の width と height に合わせて、`viewBox`属性と値を入れた。
`viewBox="x座標, y座標, width, height"`のようなので、`viewBox="0, 0, 20, 19"`とした。
（あと、`height`の小数点を消した）
（あと、`preserveAspectRatio="xMinYMid"`も入れてみた）

##BEFORE

```svg

<svg xmlns="http://www.w3.org/2000/svg" width="20" height="19.062">
    <path...略 />
</svg>

```

##AFTER

```svg

<svg xmlns="http://www.w3.org/2000/svg" width="20" height="19" preserveAspectRatio="xMinYMid" viewBox="0 0 20 19">
    <path...略 />
</svg>

```

# gulp-imageminを使用している時
(2019/10/24追記)

gulp-imageminは標準設定では、画像を軽量化するためにviewBox属性を消してしまうので、
`removeViewBox: true`を`false`に変更した。

参考：
https://www.npmjs.com/package/gulp-imagemin
Minitestを書くときに参考にしたサイト


Rails テスティングガイド
https://railsguides.jp/testing.html

リファレンス
https://docs.ruby-lang.org/ja/2.0.0/library/minitest=2funit.html

IntegrationTest
https://edgeapi.rubyonrails.org/classes/ActionDispatch/IntegrationTest.html

API Controller
https://qiita.com/koshilife/items/53bfedbb17c0c4bc4327

assert_response
https://apidock.com/rails/Test/Unit/Assertions/assert_response
Qiita用Markdown記法メモ

## はじめに
Qiitaで使えるMarkdown記法についての備忘録記事
手を動かすのは大事（自戒）


## 見出し
    # H1
    ## H2
    ### H3
    ####### H6

# H1
## H2
### H3
####### H6

囲む方法も使える

        ## H2 ##
## H2 ##


## 引用
    > 引用文
    >> ネストされた引用
    >>> さらにネスト

> 引用文
>>　ネストされた引用文
>>>　さらにネスト

複数行の場合はこんな記述方式も使える

     >
    　複数行にわたる
    　ハードラップ段落でも　　　
    　記述できる

>
　複数行にわたる
　ハードラップ段落でも
　記述できる

## リスト

    * リスト1
    + リスト2
    - リスト3
    
    1. リスト1
    2. リスト2
    3. リスト3

* リスト1
+ リスト2
- リスト3 

1. リスト1
2. リスト2
3. リスト3

## 階層

        - 1
        - 1.1
            - 1.1.1
            - 1.1.2
            - 1.2
        - 2.1
        - 2.2 

- 1
 - 1.1
     - 1.1.1
     - 1.1.2
    - 1.2
 - 2.1
 - 2.2 

## 文字装飾

    **強調（太字）**
**強調（太字）**

    *斜体*
*斜体*

    --打ち消し線--
--打ち消し線--

    `コードのインライン表示`
`コードのインライン表示`

    水平線
    ---
    スペースを入れても
    - - - 
    配置できます
    ***
    アスタリスクでも
    * * *
    同様です

---
スペースを入れても
- - - 
配置できます
***
アスタリスクでも
* * *
同様です

##　テーブル記法
`<table>`タグを利用しても良さそう

## 数式
  
    ```math
       \frac{-b \pm \sqrt{b^2-4ac}}{2a} 
    ```
    

```math
 \frac{-b \pm \sqrt{b^2-4ac}}{2a} 
```

## 参考
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
パスワード付きExcelをPythonで読み込む方法(Linux対応)

#はじめに
`xlwings`がLinuxだと非対応だったのでOSに依存しない方法がないかと模索した結果です

#事前準備
今回利用するライブラリです

``` python
import pandas as pd
import tempfile
import msoffcrypto
from pathlib import Path
```

`msoffcrypto`はインストール時は名称が違います

```
pip install msoffcrypto-tool
```

#サンプルコード

下記の場合を想定しています
・あるディレクトリ(input/)配下の全てのxlsxファイルの対象のシートをcsv出力
・パスワードが全て同じ(hogehoge)
・読み込みたいシート名が全て同じ(Sheet1)

``` python
import pandas as pd
import tempfile
import msoffcrypto
from pathlib import Path

file_dir = Path(r'data/')
password = 'hogehoge'
sheet_name = 'Sheet1'

for file in file_dir.glob("*.xlsx"):
    with file.open("rb") as f,tempfile.TemporaryFile() as tf:
        office_file = msoffcrypto.OfficeFile(f)
        office_file.load_key(password=password)
        office_file.decrypt(tf)
        df = pd.read_excel(tf,sheet_name=sheet_name)
    df.to_csv('output/' + file.name.replace('','xlsx') + '.csv',index=False)
```
microk8s を使えば、ホストを汚さずに kubernetes を使えて便利!

# minikube だと不便なこと
最近は何かと人気の kubernetes(k8s)、便利ではあるものの、セットアップは結構大変です。このため、開発環境としては GKE などの Public Cloud や、手元の PC/Mac 上にインストールした minikube を使っている人が多いと思います。

手元の Mac 等で開発をする場合は minikube さえあればそれほど困らないかもしれませんが、アプリの規模が大きくなると CPU性能、memory や disk 等のリソースが不足してしまい、結局は Public Cloud 上に開発環境を構築することも多いと思います。

このような場合、IaaS 上になるべくお金をかけずに開発環境を作るのであれば minikube を vm-driver=none にして1台構成クラスタを作ることも可能ではありますが、microk8s を使えばもっとお手軽に環境を作れてしまいます。

[microk8s: Kubernetes for workstations and appliances](https://microk8s.io)

# microk8s で解決できること
microk8s を使うと、次のようなことが便利になります。
- snap コマンド1発、1-2分程度で single host な kubernetes が使えるようになります
- snap コマンド1発でアンインストールができ、依存パッケージも含めて完全に clean up できます

# microk8s インストール方法
次のコマンドを入力するだけで、kubernetes が使える状態になります。とても簡単です。

```sh
sudo snap install microk8s --classic
```

# microk8s アンインストール方法
microk8s のアンインストールも、とても簡単にできます。snap によりパッケージングされているため、アンインストールすれば依存パッケージも含めて、綺麗さっぱりファイルが削除されます。

```sh
sudo snap remove microk8s
```

# microk8s 停止方法
microk8s では、一時的に kubernetes を使わない際は停止することでリソース消費を抑えることができます。

```sh
microk8s.stop
```

# microk8s 再開方法
microk8s.stop にて停止させた kubernetes を再開したい場合は、次のコマンドを実行します。

```sh
microk8s.start
```

# microk8s 初期設定
基本的には初期設定をしなくても kubernetes が利用できる状態になっていますが、次のコマンドを入れておくと、より便利に使えます。

```sh
# microk8s.kubectl に alias を張って、kubectl コマンドとして使えるようにする
sudo snap alias microk8s.kubectl kubectl

# DNS(kibe-dns) を有効化します
microk8s.enable dns

# Storage Class を有効化します
microk8s.enable storage

# kubectl の補完機能を有効化します (ubuntu / bash の場合)
sudo apt install bash-completion
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc

# Pod からインターネットへ通信したい場合に iptables を設定します
sudo iptables -P FORWARD ACCEPT
```

# さいごに
microk8s を使うと、例えばあまり稼働していないツール系のホスト等をお手軽に開発環境へ仕立てることができ、終わればキレイさっぱりと cleanup することもできます。また、ingress や istio 等についても microk8s.enable コマンドにて有効化することもできるため、プロダクション環境と同等の動作をする開発環境を作るのにとても向いています。

microk8s をまだ使ったことのない人は、是非ご活用されると良いと思います。

2019年4月の Kubernetes Meetup Tokyo #18 でも Canonical さんがデモを交えた紹介をされていたので、下記にリンクを共有させていただきます。

[とある30秒でできる Full Kubernetes + Istio 環境 - Kubernetes Meetup Tokyo #18](https://speakerdeck.com/xibuka/toaru30miao-degou-zhu-dekiru-full-kubernetes-plus-istio-huan-jing)
Laravel Voyagerでfont-awesomeのアイコンを使用する

font-awesome等に慣れてしまうと、Voyagerで用意されてる200ぐらいのアイコンでは物足りないカラダにされてしまいます。

幸いVoyagerには **additional_css** と **additional_js** という設定値が存在しますので、ここにfont-awesomeを入れていきましょう。

#準備

##font-awesome インストール

```
$ npm i @fortawesome/fontawesome-free --save-dev
```

##laravel Mix で font-awesome.css を作る

```:resources\sass\font-awesome.scss
// Font Awesome
@import '~@fortawesome/fontawesome-free/scss/fontawesome';
@import '~@fortawesome/fontawesome-free/scss/solid';
@import '~@fortawesome/fontawesome-free/scss/regular';
@import '~@fortawesome/fontawesome-free/scss/brands';
```

```:webpack.mix.js
mix.js('resources/js/app.js', 'public/js')
   .sass('resources/sass/app.scss', 'public/css')
   .sass('resources/sass/font-awesome.scss', 'public/css');
```

```
$ npm run dev
```

参考：https://qiita.com/algi_nao/items/5d2befae8f367050ae7f

##作った font-awesome.css を Voyager に取り込む

```:config\voyager.php
    'additional_css' => [
        'css/font-awesome.css',
    ],
```

#設定

準備が済んだら font-awesome が使えるようになります。

BREAD の「アイコン」欄に、font-awesome のクラス名を記述すればOKです。

|![20190426_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108345/15deaf4f-7511-2b3c-fb04-e4539f030be6.png)|
|---|

font-awesome のアイコンが表示できます

|![20190426_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108345/46758c35-0ecc-abce-5fdc-e83c1f6f93a0.png)|
|---|

もちろんサイドメニューのアイコンも（メニュービルダーで設定）

|![20190426_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108345/14ee6995-7a61-e4af-9af5-619fc3a91275.png)|
|---|

この通り。

|![20190426_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108345/4a93de7c-163c-7997-a04b-db68c9b2a538.png)|
|---|

#補足

もしAlias切って
サブディレクトリで動かしてるプロジェクトの場合は、
font-awesome.css がフォントファイルを見つけられずに
アイコンが豆腐になってしまいます。

そのような場合は
[こちらの記事](https://qiita.com/calltella/items/dadff118676519a24707)を参考に。
Re：ゼロから始める物体認識 その2 実際に動くものを作っていく

#前回
この記事は
Re：ゼロから始める物体認識 その1 導入と環境構築 https://qiita.com/FcAqx/items/7e7d553b274300276967
の続きとなります。

#はじめに
お久しぶりです。なんとかにどめのこうしんをすることができました。
かなり時間が空きましたがこの間何をしていたかというと~~学生として最後の春休みを満喫していました。~~統計学的声質変換というものに挑戦しているのですがなかなか資料が少なく苦戦しています。そちらの方も後々共有できればな、と思います。
前回は物体検出に必要な環境構築をしていきました。
今回は実際にある程度動くものを作っていきたいと思います。

# OpenCV
OpenCVはPythonで顔検出をする際に最も有名なライブラリです。
顔検出の他に目の検出などもすることができる非常に優れたライブラリです。
今回の最終的な目標は自分で顔検出のモデルを作っていくことなのでOpenCVで顔検出をすることがゴールではないのですが、
実際に手元で顔検出が動く物ができるとそれはそれでテンションが上がるので一度OpenCVを使ってみたいと思います。
既存のライブラリは自分で作った物の性能を確かめる上でひとつの指標となりますし、動くものがひとつあるだけでモチベーションに繋がり易いので僕は作ろうとしているものと近いものがあれば触るようにしています。

OpenCVを使うようにするにはAnaconda Promptでインストールコマンド`pip install opencv-python`を入力します。
これからPythonでこのようなパッケージをインストールする場合は毎回Anaconda Promptからコマンドを入力します。

それでは実際にコード入力し、動かしてみましょう。

```python:TestCV.py
#coding: utf-8

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import cv2

# 分類機のパス
# Anaconda3をインストールした場所にあるので必要に応じて変えてください
cascade_path = "haarcascade_frontalface_default.xml"

# 判定したい画像のパス
images = ""



# 画像の読み込みをする
def read_img(img_path):
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    return img


# 顔を検出
def detect_face(image_path, cascade_path):
    img = read_img(image_path)
    width = img.shape[1]
    height = img.shape[0]
    img = cv2.resize(img, (width, height))
    # グレー画像に変換
    gry = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

    # 判定モデルを指定して顔判定を実行
    cascade = cv2.CascadeClassifier(cascade_path)

    # ここの引数のそれぞれの意味はしっかりと確認しておいたほうが使いやすいと思います
    # [OpenCVのリファレンス](http://opencv.jp/opencv-2.2/py/objdetect_cascade_classification.html)
    facerect = cascade.detectMultiScale(
        gry, scaleFactor=1.11, minNeighbors=20, minSize=(30, 30))
    dst_img = []
    if len(facerect) > 0:
        color = (255, 0, 0)
        for rect in facerect:
            x = rect[0]
            y = rect[1]
            w = rect[2]
            h = rect[3]

            add_image = cv2.resize(img[y: y+h, x: x+w], (64, 64))
            dst_img.append(add_image)

            cv2.rectangle(img, tuple(rect[0:2]), tuple(
                rect[0:2]+rect[2:4]), color, thickness=2)
        # 画像の表示
        plt.imshow(img)
        plt.show()
    else:
        print("顔が認識できませんでした")


detect_face(images, cascade_path)

```

上のコードを実行すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362776/9b3dfdb7-97f7-ad97-529a-2f7edda53ef5.png)

このように顔の部分を検出することができます。
OpenCVではこれ以外にも目や鼻の検出もすることができるので興味のある方は試してみるといいと思います。

# おわりに
今回はライブラリを使って顔検出をやってみました。
これで作りたいものがとりあえず手元で動くものとなったので目標としやすいのではないかと思います。
次回はこれを自分で作るために必要な素材集めなどの準備をしていきたいと思います。
Coroutineを用いてonActivityResultを簡潔に実装する

#startActivityForResultとonActivityResult
通常立ち上げたactivityから結果を受け取るには
requestCodeを定義し。startActivityForResultを呼び出し
onActivityResultをoverrideして結果を受け取ります。

機能が増えていくとrequestCodeの定義とonActivityResultの中の
実装が増えていき煩雑になっていきます。

#Coroutineを用いたonActivityResultの実装
本記事はcoroutineを用いてstartActivityForResultからonActivityResultまでの
処理をシンプルに実装する処理を紹介します。

###BaseActivityの実装
まず、親となるActivityにcoroutineを用いて
onActivityResultの待ち合わせ処理を実装します。

```Kotlin:BaseActivity.kt
abstract class BaseActivity : AppCompatActivity() {

    companion object {
        private const val REQUEST_CODE_DEFERRED = 10001
    }
    //onActivityResultの結果待ち合わせ用
    private var deferredResult = CompletableDeferred<ActivityResult>()

    //startActivityForResult同時に待ち合わせ開始
    fun launchStartActivityForResult(intent: Intent): Deferred<ActivityResult> {
        if(deferredResult.isActive) deferredResult.cancel()
        deferredResult = CompletableDeferred()
        startActivityForResult(intent, REQUEST_CODE_DEFERRED)
        return deferredResult
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(requestCode == REQUEST_CODE_DEFERRED) {
            //結果受け取り
            deferredResult.complete(ActivityResult(resultCode, data))
        } else {
            super.onActivityResult(requestCode, resultCode, data)
        }
    }
}

class ActivityResult(val resultCode: Int, val data: Intent?) { }
```
deferredResultというCompletableDeferred型の待ち合わせオブジェクトを定義し、
launchStartActivityForResult関数で待ち合わせを始めて、
onActivityResultで結果を受け取ります。


###呼び出し側の例
上記で実装した関数を用いてカメラのIntentから結果を受け取るサンプル

```Kotlin:SampleActivity.kt
button.setOnClickListener {
  val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
  GlobalScope.launch(Dispatchers.Main) {
    //startActivityForResultの結果の待ち合わせ
    val activityResult = launchStartActivityForResult(intent).await()
    if(activityResult.resultCode != Activity.RESULT_OK) return@launch
    activityResult.data?.extras?.let { bundle ->
      val bitmap = bundle.get("data") as Bitmap
      //do something
    }
  }
}
```
BaseActiviyを継承したActivityで
coroutineスコープ内にてlaunchStartActivityForResult()を呼び
その返り値をawait()関数で待ちその後結果を処理します。

#まとめ
coroutineのスレッド待ち合わせを使うことによりstartActivityForResultからonActivityResultまでの処理をまとめて実装することができ、
requestCodeの定義も無くすことができました。

#参考
[kotlinx.cotoutines CompletableDeferred](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-completable-deferred/)
fish 環境でヒアドキュメントから読んだリクエストボディを curl で POST する

厳密にはヒアドキュメントは使えない。
ということで echo した結果をパイプでつなぐ感じになった。

```sh
$ echo '{ 
  "id": 123,
  "name": "@takat0-h0rikosh1",
  "age": 29  
}' | curl -X POST -H "Content-Type: application/json" -d @- \
http://localhost:8080/users
```

下記、参考とさせていただきました。勉強になりました。

https://qiita.com/miminashi/items/f48cd4c25b06fcab5ea3
http://hyperpolyglot.org/unix-shells#redirection
【PMMP】Composerを使ったプラグイン開発

~~Composerを使ってプラグイン開発を行う的な記事が見当たらなかった~~（あるにはあるんですが、そちらの環境を整えている人が少なそうな）ので、備忘録的な意味も込めてここに書き留めておきます。

# Composerとは
ライブラリのインストールが簡単になるシステムです。(曲解)

本当は依存管理が云々だとかなんだとか...
PMMPプラグインでそんなとこまで気にしていたら身が持ちません。（笑）

# プラグインの下準備
取り敢えずプラグインの基盤だけ先に作っておきましょう。
以下、構成図とその中身です。

```
composer-example
├ src
│　└ Deceitya
│　　└ ComposerExample
│　　　└ ComposerExamplePlugin.php
└ plugin.yml
```

```yml:plugin.yml
name: ComposerExample
main: Deceitya\ComposerExample\ComposerExamplePlugin
version: 1.0.0
api: 3.8.0

load: POSTWORLD
author: deceitya
description: Composerを使ったプラグイン開発のサンプルコード
```

```php:ComposerExamplePlugin.php
<?php
namespace Deceitya\ComposerExample;

use pocketmine\plugin\PluginBase;

class ComposerExamplePlugin extends PluginBase
{
    public function onEnable()
    {
        $this->getLogger()->info('Composerを使ったプラグイン開発のサンプルコード');
    }
}
```

# Composerのインストール
ggrks
できなければお前は死ぬことになる。
（いつか気が向いたらここもしっかりと書きますので・・・）

無事にインストールが終わった方のみ進んで、どうぞ。

# Composerの準備
srcフォルダとplugin.ymlがある場所にcomposer.jsonを新規作成します。
中身はこんな感じです。

```json:composer.json
{
    "name": "deceitya/composer-example",
    "description": "Composerを使ったプラグイン開発のサンプルコード",
    "autoload": {
        "psr-4": {
           "": "src/"
        }
    }
}
```

# ライブラリの導入
それでは、実際にライブラリを入れていきたいと思います。
例としてUUIDを生成するライブラリ([ramsey/uuid](https://github.com/ramsey/uuid))を使ってみましょう。
先ほどcomposer.jsonを作ったディレクトリに移動して以下のコマンドを入力します。

```
composer require ramsey/uuid
```

composer.lockとvendorフォルダが生成されて、composer.jsonがこんな感じになってたら多分ヨロシ。

```json:composer.json
{
    "name": "deceitya/composer-example",
    "description": "Composerを使ったプラグイン開発のサンプルコード",
    "autoload": {
        "psr-4": {
           "": "src/"
        }
    },
    "require": {
        "ramsey/uuid": "^3.9"
    }
}
```

# 実際に使ってみる
UUIDを生成して表示してみましょう。
以下、サンプルコードです。

```php:ComposerExamplePlugin.php
<?php
namespace Deceitya\ComposerExample;

require_once __DIR__ . '/../../../vendor/autoload.php';
// .. は「一つ上の階層」を表します。

use pocketmine\plugin\PluginBase;

use Ramsey\Uuid\Uuid;
use Ramsey\Uuid\Exception\UnsatisfiedDependencyException;

class ComposerExamplePlugin extends PluginBase
{
    public function onEnable()
    {
        $this->getLogger()->info('Composerを使ったプラグイン開発のサンプルコード');

        try {
            $uuid = Uuid::uuid4();
            $this->getLogger()->info($uuid->toString());
        } catch (UnsatisfiedDependencyException $e) {
            $this->getServer()->getLogger()->critical($e->getMessage());
        }
    }
}
```

コンソール画面にUUIDが表示されたら成功です。
お疲れ様でした！

# あとがき
　ツキミヤです。平成も残り僅かとなりました。あ、もう終わってますかそうですか。年号制度、いつまで続くのでしょうか。1000年以上も前のシステムが今でも使われていると考えるとロマンを感じたり・・・します？
　さて、如何でしたか、私の初記事。分かりやすかったでしょうか。私の日本語下手も相まって、初心者には少しばかり難しい説明だったかもしれません。他人に何かを解説するというのはやはり難しいなと痛感しております。改善点等がございましたら何なりとお申し付け下さい。
　次の記事は現段階では考えていませんが、良い案が浮かべばまた作ろうと思います。
　ではまたお会いできる日までノシ
Java HttpURLConnectionを使ってファイルをアップロードする

以下の記事に実装したサーバーへJavaのクライアントからファイルをアップロードしてみたので、手順を記載する。
[Ruby Sinatraサーバーにhttpclientからファイルアップロードしてみた](https://qiita.com/MikuriyaHiroshi/items/0eb21892ad2795be4eb4)

Rubyと比べても仕方がないが、コードが長くなってしまった。

* Javaバージョン  
1.8.0_202

<font color="red">コメント欄からご指摘いただきコードを修正しました。</font>

```Uploader.java
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.UUID;

public class Uploader {
    private static final String EOL = "\r\n";

    public static int Send(String filename, String url, String method) throws IOException {
        try (FileInputStream file = new FileInputStream(filename)) {
            HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
            final String boundary = UUID.randomUUID().toString();
            con.setDoOutput(true);
            con.setRequestMethod(method);
            con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
            try (OutputStream out = con.getOutputStream()) {
                out.write(("--" + boundary + EOL +
                    "Content-Disposition: form-data; name=\"file\"; " +
                    "filename=\"" + filename + "\"" + EOL +
                    "Content-Type: application/octet-stream" + EOL + EOL)
                    .getBytes(StandardCharsets.UTF_8)
                );
                byte[] buffer = new byte[128];
                int size = -1;
                while (-1 != (size = file.read(buffer))) {
                    out.write(buffer, 0, size);
                }
                out.write((EOL + "--" + boundary + "--" + EOL).getBytes(StandardCharsets.UTF_8));
                out.flush();
                System.err.println(con.getResponseMessage());
                return con.getResponseCode();
            } finally {
                con.disconnect();
            }
        }
    }

    public static void main(String[] args) throws IOException {
        if (args.length < 2) {
            System.err.println("Input [Upload file path] [Upload URL]");
            return;
        }
        String filename = args[0];
        String url = args[1];
        int res = Uploader.Send(filename, url, "POST");
        if (res == HttpURLConnection.HTTP_OK) {
            System.err.println("Success!");
        } else {
            System.err.printf("Failed %d\n", res);
        }
    }
}
```

なお、本ソースはcurlでファイルアップロードした通信をWiresharkで確認して、javaでも同じような内容になるように作成した。

```
$ curl -X POST http://localhost:3000/upload -F "file=@./filepath"
```
docker-composeでdriver failed programming external connectivity on endpointが出た場合の覚書

# 前置き
docker-compose runでdjango環境を構築しようとした際に出たエラーの覚書。
dockerがポートを掴んでいて解放していないという原因もあるが、ホスト側とバッティングしている可能性もある。dockerさんが解放していない場合はdockerの再起動で治る。


# 発生した現象

```
> docker-compose run web django-admin.py startproject mysite .
  :
(中略)
  :
b64ec62ca852: Pull complete
42323e351ef3: Pull complete
Creating mysite.db ...
Pulling db (mysql:5.7)...
Creating hoge.db ... error

ERROR: for hoge.db  Cannot start service db: driver failed programming external connectivity on endpoint hoge.db (f683296d4aac32cfe3ca117c6c8464169624860afe875bedccf533d3fa1aa90e): Error starting userland proxy: Bind for 0.0.0.0:3306: unexpected error Permite.db (f683296d4aac32cfe3ca117c6c8464169624860afe875bedccf533d3fa1aa90e): Error starting userland proxy: Bind for 0.0.0.0:3306: unexpected error Permission denied
                                                                                                                 
  :
(中略)
  :
ERROR: for db  Cannot start service db: driver failed programming external connectivity on endpoint hoge.db (48963bd165e4acf284fdef661b0f6b92d4c80bba8e5826804b54294b92eef31d): Error starting userland proxy: Bind for 0.0.0.0:3306: unexpected error Permission denied
ERROR: Encountered errors while bringing up the project.
```

dockerでdb用のvolumeを作成して、コンテナでvolumeを指定しようとしたら発生。

# 原因
dbコンテナで指定していたポートがホスト側で使用されていた。

```
  :
    ports:
      - 3306:3306
  :
```

ホスト側

```
>netstat -ano|find ":3306"
  TCP         0.0.0.0:3306           0.0.0.0:0              LISTENING       6692
  TCP         0.0.0.0:33060          0.0.0.0:0              LISTENING       6692
  TCP         [::]:3306              [::]:0                 LISTENING       6692
  TCP         [::]:33060             [::]:0                 LISTENING       6692
```

ホスト側でお試しで入れていたMySQL8.0のポートとバッティングしていたのでアンインストール。
ホスト側を変えたくない場合はdocker-compose側のポートを変えてあげるといい。
MacでEigenをインクルードしたい[CPATHの追加方法]

# はじめに
C++で行列計算をする必要があり，行列計算用のライブラリ[Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page)を使おうと思い，

```bash:install_eigen
$ brew install eigen
```

をして，試しにC++コードに

```cpp:eigen_include_test.cpp
#include <Eigen/Core>

int main(){
  Eigen::MatrixXd X(3, 3);
  return 0;
}
```

と記述してコンパイルしてみると，

```bash:make_error
src.cpp:4:10: fatal error: 'Eigen/Core' file not found
#include <Eigen/Core>
         ^~~~~~~~~~~~
1 error generated.
make: *** [proj] Error 1
```

と言われてしまった．

解決方法は２通りあり，`CPATHに追加(永続的)`，`コンパイル時にPATHを指定(一時的)`である．

# 対処 〜永続的〜
最初は，以下に示す一時的な方法を考えたのだが，これではEigenを使用する際の`makefile`を変更する必要があり，非常に面倒である．そこで，コンパイラパスにEigenのフォルダを追加することにした．追加するパスは下記の`一時的`で述べる方法で検索することができる．

以下のコマンドを`~/.bashrc`，`~/.bash_profile`などに記述することで，コンパイル時に何も気にすることなく`Eigen`をインクルードすることができた．

```bash:add_c_path
export CPATH=:/usr/local/include/eigen3
```

`CPATH`を確認するコマンドは以下．

```bash:check_c_path
$ echo $CPATH
```


# 対処 〜一時的〜
Eigenはヘッダーオンリーライブラリであるため，インクルードパスを通せば良いようである．そこで，Eigenの在処を探して，`makefile`にインクルード先を追加することにした．

```bash:find_eigen_path
$ find / -d -name eigen 2>/dev/null

/usr/local/var/homebrew/linked/eigen
/usr/local/opt/eigen
/usr/local/Cellar/boost/1.69.0_2/include/boost/numeric/odeint/external/eigen
/usr/local/Cellar/boost/1.69.0_2/include/boost/compute/interop/eigen
/usr/local/Cellar/eigen
```

```make:Makefile
PROG = main.cpp
TARGET = proj
LIBRARY = /usr/local/include/eigen3
CXX = g++
CXX_VERSION = -std=c++17

${TARGET} : ${PROG}
	${CXX} ${CXX_VERSION} -o ${TARGET} -I${LIBRARY} ${PROG}

run :
	./proj

clean :
	rm -r ${TARGET}
```

こうすることで，先ほどのファイルをコンパイルすることができた．
【node.js】lambdaからベーシック認証がかかったサイトへGETリクエストを送る

AWS lambdaからステージング環境にGETリクエストを送信したかったのですが、ベーシック認証がかかっていて、なかなか苦労しました。。。

以下で動いてくれましたので、お試しくださいね！

## 環境
| ランタイム    | ハンドラ       |
| ---          | ---           |
| Node.js 8.10 | index.handler |

## コード
```node.js
exports.handler = function index(event, context, callback) {
    const util = require('util');
    const http = require('https');

    const host = '****URL****';         // e.g. test.com
    const path = '****/TO/TARGET****';  // e.g. /user/dashboard
    const user = '****USERNAME****';
    const pwd  = '****PASSWORD****';

    const req = http.get(
        {
            "host"  : host,
            "path"  : path,
            "auth"  : user + ":" + pwd,
        },
        function(res) {
            console.log("[info] Status Code: " + res.statusCode);
            console.log("[info] res:" + util.inspect(res, false, null));
        },
    );
    req.on('error', function(e){
        console.log("[error] " + util.inspect(e, false, null));
    });
};
```
AWS ElasticBeanstalkリリース後旧環境の削除漏れ監視


#マクロ
    - {$EB_APP} : 環境名
    - {$EB_ENVCNT} : 正常のアプリケーション数

#アイテム
- タイプ：外部チェック
- キー： http_get.sh -> パラメタをcurlに渡すだけ

```bash
    http_get.sh["https://api.hoge.com/v1/AwsEbEnvCount.aspx?acc=4&app={$EB_APP}&envcnt={$EB_ENVCNT}"]
```

- 単位：文字列

#トリガー
- 名前：[PF]EBﾘﾘｰｽ後の旧環境削除漏れ発生 {ITEM.LASTVALUE}
- 条件式：10連続アウト

```bash
{[KEY].count(#10,"","ne")}=10
```

#API
zabbixのexternalscriptsにpythonなどのスクリプトを置くとまとまるが、C#で組んだAPIがすでにあったのでAPIを叩くことに。

```C#

using System.Web.Script.Serialization;
using Amazon.ElasticBeanstalk;

/*
    appName 監視APP名
    AmazonConfig 認証カスタムクラス　別途組んでください
    return 「""」以外はエラーする
*/
private string GetCountEnv(AmazonConfig.AccountNo acc, string appName, int envCount)
{
    var ret = new Dictionary<string, string>();

    if (envCount == 0)
    {
        envCount = 1;
    }

    AmazonConfig conf = new AmazonConfig(acc);
    var cl = new AmazonElasticBeanstalkClient(conf.AccessKeyID, conf.SecretAccessKey, conf.RegionEndpoint);
    var res = cl.DescribeEnvironments();

    //envCountより環境数が多いと削除漏れ!
    var envs = res.Environments.Where(s => s.Health == "Green").GroupBy(s => s.ApplicationName).Where(s => s.Key == appName && s.Count() > envCount);

    foreach (var i in envs)
    {
        ret.Add(i.Key, i.Count().ToString());
    }

    if (ret.Count > 0)
    {
        JavaScriptSerializer js = new JavaScriptSerializer();
        return js.Serialize(ret);
    }
    else
    {
        return "";
    }
}
```

#メモ
これで削除漏れによる無駄な運用コストが減ったと。
MongoDBの1ドキュメントサイズは16MByte上限だけど、プロパティ数的にはどのくらいか？出してみた


雑共有です。 `1024 / 1024` は、単位をMbyteにするためです。

```bash
$ mongo --version
MongoDB shell version v4.0.9
git version: fc525e2d9b0e4bceff5c2201457e564362909765
build environment:
    distmod: ubuntu1804
    distarch: x86_64
    target_arch: x86_64
# ↑出力をちょっと省略しています
```

```js

// 長いプロパティ名
var obj = {"_id" : ObjectId("5cc27f54856171bb356878b0")};
for (var i = 0; i < 30 * 10000; i++) {
  obj["123456789012345678901234567890" + i] = 100;
}
Object.bsonsize(obj) / 1024 / 1024;
> 13.054763793945312

// 数値のみプロパティ名（0番からスタート）
var obj = {"_id" : ObjectId("5cc27f54856171bb356878b0")};
for (var i = 0; i < 30 * 10000; i++) {
  obj[i] = 100;
}
Object.bsonsize(obj) / 1024 / 1024;
> 4.4716949462890625

// 数値のみプロパティ名（10万番台からスタート）
var obj = {"_id" : ObjectId("5cc27f54856171bb356878b0")};
for (var i = 0; i < 30 * 10000; i++) {
  obj[i + 100001] = 100;
}
Object.bsonsize(obj) / 1024 / 1024;
> 4.577657699584961

// ちょっと深堀ってみたデータ
var obj = {"_id" : ObjectId("5cc27f54856171bb356878b0"), aaa:{}, bbb:{}, ccc:{}, ddd:{}};
for (var i = 0; i < 30 * 10000; i++) {
  var num = i + 100001;
  var prop = "aaa";
  if ((num % 4) === 0) {
    prop = "aaa"
  }
  if ((num % 4) === 1) {
    prop = "bbb"
  }
  if ((num % 4) === 2) {
    prop = "ccc"
  }
  if ((num % 4) === 3) {
    prop = "ddd"
  }
  obj[prop][num] = 100;
}
Object.bsonsize(obj) / 1024 / 1024;
> 4.577695846557617

// 110万プロパティで、16MB超えた場合
var obj = {"_id" : ObjectId("5cc27f54856171bb356878b0")};
for (var i = 0; i < 110 * 10000; i++) {
  obj[i + 100001] = 100;
}
Object.bsonsize(obj) / 1024 / 1024;
> 2019-04-26T12:51:35.489+0900 E QUERY    [js] Error: Converting from JavaScript to BSON failed: Object size 17800019 exceeds limit of 16793600 bytes. :
```

複雑なjsonになると、もっと変わると思いますが、意外と入るなぁという印象でした。

しかし、1ドキュメントサイズが大きいと、

- チャンク移動などに時間が掛かる
- メモリキャッシュ的にドキュメントサイズが大きいとキャッシュできる数が減る

とかデメリットありますので、あまりサイズが大きくならないような設計が望ましいと思います。
Docker環境構築で発生したエラーと対処法メモ

こんにちは、けんぞうです。
現在作成している[アプリ](https://say-thank-u.herokuapp.com/)でDocker環境を構築しているのですが、その中で発生したエラーと解消方法をまとめます。

（独学の範囲内ですので間違い等あればフィードバック頂けますと幸いです🙇‍♂️）

## Version in "./docker-compose.yml" is unsupported

`docker-compose up`を再度実行しようとした際に発生したエラーです。[こちら](https://stackoverflow.com/questions/42139982/version-in-docker-compose-yml-is-unsupported-you-might-be-seeing-this-error)を参考にして解消しました。

```ruby
#docker-composeの場所を特定する
$which docker-compose
/usr/local/bin/docker-compose

#一度docker-composeを削除する
$sudo rm /usr/local/bin/docker-compose

#upgradeする
$curl -L https://github.com/docker/compose/releases/download/1.20.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

$chmod +x /usr/local/bin/docker-compose

```

## A server is already running. Check /myproject/tmp/pids/server.pid.

エラーではないのですが、`docker-compose up`を実行しても`localhost:3000`で立ち上がりを確認できない時の対処方法です。

結論としては**`tmp/pids/server.pid.`を削除**で解決します。

毎回この事象が発生しないための対処法は以下の通りです。

### ①entrypoint.shを作成

```ruby:entrypoint.sh
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myproject/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
```

### ②Dockerfileに追記

```ruby:Dockerfile
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
```
【Ruby on Rails】 スクレイピング HTML データ抜き出し

#スクレイピングとは
他のウェブサイト上からある特定のデータを抜き出す処理です。
###使うための準備

####●Railsで、Gemをインストールする場合

```:Gemfile
gem 'mechanize'
```

```:ターミナル
$ bundle install
```
これで、gemのインストールが完了しました。
####●rubyファイルでクラスを使う場合
.rbファイルの一番上に追記すると使えるようになります。

```:〇〇.rb
require 'mechanize'
```

###Mechanizeクラスのインスタンスを生成する
スクレイピングを使うには、まず「Mechanizeクラスのインスタンス」を生成します。
インスタンスを生成するにはnewメソッドを使うでした。

```〇〇.rb
任意の変数 = Mechanize.new
```
これでインスタンスが生成できました。
###WEBサイトのHTMLを取得する(get)
先程、生成したインスタンスに取得したいWEBサイトの情報を抜き出すためにgetメソッドを使います。引数にURLを渡しましょう。

```〇〇.rb
require 'mechanize'
任意の変数 = Mechanize.new
任意の変数2 = 任意の変数.get("取得したいWEBサイトのURL")
```
###指定したHTML要素の内容を検索する
今回は、spanタグを内容を取得します。h1やpなどいろいろ試してみると理解が深まります。

```〇〇.rb
require 'mechanize'
任意の変数 = Mechanize.new
任意の変数2 = 任意の変数.get("取得したいWEBサイトのURL")
任意の変数3 = 任意の変数2.search('span')
puts 任意の変数3
```
さいごに任意の変数3を呼び出すと取得したいURLのspanタグの要素が全て取得できているのがわかります。
要素の中の要素を指定した場合は下記のように書きます。h1の中のspanという意味になりますね。

```
任意の変数3 = 任意の変数2.search('h1 span')
```
####要素からテキストのみを抜き出す(inner_text)
では、前回取り出したspan要素からテキストのみを取得してみましょう。
今回は、eachメソッドを使ってspan要素のテキストを全て表示させます。

```〇〇.rb
require 'mechanize'
任意の変数 = Mechanize.new
任意の変数2 = 任意の変数.get("取得したいWEBサイトのURL")
任意の変数3 = 任意の変数2.search('span')
任意の変数3.each do |変数3|
  puts 変数3.inner_text
end
```
では、ターミナルで出力してみましょう。

```:ターミナル
$ ruby 〇〇.rb
```
これで、指定したURLのspan要素のテキストが全て表示されました。
####属性の値を抜き出す(get_attribute)
今回は、a要素のからhrefの値を取得して呼び出します。

```〇〇.rb
require 'mechanize'
任意の変数 = Mechanize.new
任意の変数2 = 任意の変数.get("取得したいWEBサイトのURL")
任意の変数3 = 任意の変数2.search('a')
任意の変数3.each do |変数3|
  puts 任意の変数3.get_attribute('href')
end
```
php-master-changes 2019-04-25

今日は昨日の最適化修正の 7.4 系へのバックポート、デフォルトの php.ini の微修正、settype() の最適化、一部組み込み関数の局所最適化、テストこけの修正があった！

# 2019-04-25
## dstogov: Use ZEND_TRY_ASSIGN_REF_... macros for arguments passed to internal function by reference
- https://github.com/php/php-src/commit/2e4686b5667e9ccbfbfab10452c42f5b818fcfdb
- [7.4~]
- [昨日の修正](https://qiita.com/sj-i/items/11c520147f7ae3252291#dstogov-use-zend_tra_assign_ref_-macros-for-by-reference-arguments-of-internal-functions)の 7.4 系へのバックポート
- さりげなくコミットコメントの typo も直してるのがほほえましく、Dmitry 御大の typo 率は人間やっぱ細かいこと気にして生きてちゃダメだよな、という気持ちにいつもさせてくれる

## Girgias: Remove html_errors from INI Quick Reference as INI values are identical to Engine values
- https://github.com/php/php-src/commit/8b8d5a4bd1251a3298781089dea3233fceda779c
- [7.4~]
- デフォルトの php.ini で、html_errors のクイックリファレンス用コメントを削除し、デフォルト設定をコメントアウト
- エンジンのデフォルト値もどうせ On なので、という

## dstogov: settype() optimization
- https://github.com/php/php-src/commit/9e9407c22e16d4671b09ba765ed997af52f058be
- [7.4~]
- [settype()](https://www.php.net/manual/ja/function.settype.php) の最適化
- [zend_string_equals_ci()](https://github.com/php/php-src/blob/c4e4ef0498f691788e30e4cdfae3c3aa9dd3b1f1/Zend/zend_string.h#L321) 使うようにして strcasecmp() でのバイトごとの比較を本当に必要なければ行わないようにしてるのと、ZVAL_COPY() を避けられたら避けたりしてるのかな

## dstogov: Use better macros
- https://github.com/php/php-src/commit/21c36341afc505d4cf2c080f6c3764f991fbfeb9
- [7.4~]
- [ZEND_TRY_ASSIGN_REF_VALUE()](https://github.com/php/php-src/blob/2e4686b5667e9ccbfbfab10452c42f5b818fcfdb/Zend/zend_API.h#L999) の利用箇所を [ZEND_TRY_ASSIGN_REF_TMP()](https://github.com/php/php-src/blob/2e4686b5667e9ccbfbfab10452c42f5b818fcfdb/Zend/zend_API.h#L977) に置き換え
- 実質 [zend_try_assign_typed_ref_zval()](https://github.com/php/php-src/blob/878e09c47c1f33e2c0140ecedbf8eea9c15cd851/Zend/zend_API.c#L3691) を [zend_try_assign_typed_ref()](https://github.com/php/php-src/blob/878e09c47c1f33e2c0140ecedbf8eea9c15cd851/Zend/zend_API.c#L3595) に置き換えて ZVAL_COPY_VALUE() を減らした形

## cmb69: Fix [#77938](https://bugs.php.net/bug.php?id=77938): socket_get_option error
- https://github.com/php/php-src/commit/fe202d99c8fff957509375411641687f47dfc17b
- [7.2~]
- テストで http://www.php.net を見てる箇所が https リダイレクト導入の影響でこけていたのを修正

## cmb69: Fix [#77940](https://bugs.php.net/bug.php?id=77940): test using outdated mon_thousands_sep for Swedish
- https://github.com/php/php-src/commit/37ca6a7a2a333b5a783b2b8726bb5c9674c6e301
- [7.2~]
- スウェーデンでは通貨用の 1000 ごとの区切り文字 mon_thousands_sep がスペースらしく、[localeconv()](https://www.php.net/manual/ja/function.localeconv.php) を呼ぶテストがこけていたのを修正
- なお環境によって単にスペース期待にするとアカンらしく、この 4 時間くらい後に[別の](https://github.com/php/php-src/commit/bfbfb9dabd8369ec1891da99027f920bd851caee)[修正](https://github.com/php/php-src/commit/7ddfe73e69bd847c33bd69fb92d2f5f82b89c778)が入って、スペースでも "." でも受け付けるようにしている
【Bash】lsしたときの色を変更する

キーワード：**ls, Terminal, Color, bash, Linux**

以下のページを参考に，Terminalで```ls```した時に
ディレクトリが**太字**でかつ<font color="LimeGreen">**自分好みの色**</font>で表示されるよう設定しました．
http://neko-mac.blogspot.com/2015/03/mac_18.html

今回一番重要なのはここ

```bash:.bash_profile
export LSCOLORS=Cxfxcxdxbxegedabagacad
```

　
```COLORS=```の後ろのわけわかめな文字列だ

ここの一番左のアルファベットが```ls```した時のディレクトリの色と太さを決める

僕が参考にした時はここが```e```（ただのシアン）になっていたので

ここを```C```（太字のグリーン）に変更した．

今回の目的はとりあえずディレクトリを参照した時の色付けだけだったのでこれだけです

念のため僕の```.bash_profile```載せときます

```bash:.bash_profile
# ls した時の色付け
alias ls='ls -G'
export LSCOLORS=Cxfxcxdxbxegedabagacad

#ターミナル起動するたびに毎回 source ~/.bash_profile するの面倒なので自動でさせる
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```

これで大丈夫です

こんな感じでいい感じに色付けされました！

![Screen Shot 2019-04-26 at 12.20.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/3954ab55-ad14-446c-59e7-c64665f97ebe.png)

また，実行可能な実行ファイルは```ls```した時に赤色になります

![Screen Shot 2019-04-26 at 14.00.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/6699355c-5a6d-571e-5aa6-a69a865a293f.png)



 あ！ちなみに，

```.bash_profile``` は
 
```
$ vi ~/.bash_profile
```

で編集

```
$ source ~/.bash_profile
```

で変更を反映

できます


ありがとうございました( ・∇・)
DjangoでBootstrap4を使う方法

# 概要

 こんにちは、すずです。

 今回はBootstrap4というcss作業が格段に楽になるアイテムを使っていこうと思います！

同じ悩みを抱える人の力になれれば幸いです。

 
# 環境

Python 3.7.2

Django 2.1.7

django-bootstrap4 0.0.8 

 

# やり方

 まずはdjango-bootstrap4をpipでインストールしましょう！

> C:\Users\user> pip install django-bootstrap4

 

インストールが完了しましたら次の工程へ

djang-bootstrap4の設定をsettings.pyに記述します！

※スマホの方見えずらくて申し訳ございません<(_ _)>横にしてね..泣 

```python
# mysite/mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'bootstrap4', #ここに追加！
]

.........

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            'builtins':[ 
                'bootstrap4.templatetags.bootstrap4',　# ここに追加！
            ],
        },
    },
]
```
 

これでsettings.pyの設定は完了です！ 
htmlファイルではこんな感じにしてくだせぇ↓↓

```html
# mysite/index.html
<!DOCTYPE html>
{% load static %}

{% bootstrap_css %} # これを書かないとタグが適応されないよ( ;∀;)
{% bootstrap_javascript jquery='full' %}

<head>
    <meta charset="UTF-8">
    <title>*******</title>
</head>

<body>
<div class="Bootstrap定義のクラス名">
    ***************
    ***************
    ***************
</div>
</body>
</html>
```
普段書かないので*******でごまかしましたｗ  
もちろんclassの定義は<div>以外でも使えます～Buttonとかね('_')  


# まとめ  
他の人の使い方などを見てみると
ある程度はBootstrap4のクラスで書いて、 
プラスで独自CSSファイルを作るのがベターらしいですよ($・・)/~~~  
  
詳しくは[ブログ](https://s2notc2.hatenablog.com/entry/2019/04/26/133710)で書いていますのでご確認くださいッ
  
もし使えないとかだったら連絡ください！
[Twitter](https://twitter.com/S2notC2:embed:cite)にもらえると反応しやすいです  

Twitterではアプリ作成やアプリの広め方などについて呟いております！
ES2017時代のasyncライブラリを探す（blend-promise-utils編）

## はじめに

ES2017以降はasync functions (async/await)が使えるようになりこれまでと、非同期処理の書き方が変わりました。callback時代は[async.js](https://github.com/caolan/async)に大変お世話になっていたのですが、async/awaitで書くようになって、ちょっとオーバースペックな気もしてきました。そこで、もう少し軽量な代替ライブラリがないか探していたところ一つ気になるものがあったので、調べてみました。

## blend-promise-utils

[promise-utils](https://github.com/blend/promise-utils)は、promiseベースのユーティリティです。軽量なところと、TypeScriptなところが評価できます。mapはPromise.allで簡単に実現できるので、mapSeriesの例を見てみましょう。

```javascript
const fetchUserInfo = async (id) => {
  const response = await fetch(`https://reqres.in/api/user/${id}?delay=1`);
  return await response.json();
};
```

上記のようなasync関数があると仮定します。

```javascript
import promiseUtils from 'blend-promise-utils';

const run = async () => {
  const userIds = [1, 2, 3, 4, 5];
  const users = await promiseUtils.map(userIds, fetchUserInfo);
  return users;
};
```

promise-utilsで書くと上記のようになります。

```javascript
import async from 'async';

const run = async () => {
  const userIds = [1, 2, 3, 4, 5];
  const users = await async.mapSeries(userIds, fetchUserInfo);
  return users;
};
```

async.jsの場合はこのようになります。全く変わりませんね。

promise-utilsの場合はfetchUserInfoを呼び出すときに第二引数にindexを渡してくれるようです。Array.prorotype.mapとの類推ではその方が適切な感じはします。

[mapのソース](https://github.com/blend/promise-utils/blob/55949d5f6bcce28a8e1a4757a9df465dbb67aaf5/src/map.ts#L38)を見ていたら、少し予想外のものがありました。省略時には上限が設定されるようです。この上限を取るには、 `mapLimit(list, list.length, func)` とするしかなさそうです。

軽量なのは良いことだと思いましたが、raceなどはなく、その他機能不足を感じました。乗り換えるにはちょっと力不足な感じがします。

## おわりに
気になるライブラリではあったものの、用途は限られそうなので、async.jsの代替にはならないかと思いました。また、引き続き探したいと思います。

ところで、簡単なparallelやseriesくらいであればライブラリを使わなくてもそれほど苦労せずに書けるので普段はそれで済ましています。[このブログ](https://hackernoon.com/async-await-essentials-for-production-loops-control-flows-limits-23eb40f171bd)によると、limit系も書けてしまうようで、ライブラリは不要なのではないかとも思ってしまいます。でも、複雑ではあるのでやはり手頃なライブラリがあると良いですね。
React.jsで実装したアプリケーションをChromeの検証ツールで確認する（裏技）

今日先輩エンジニアから、React.jsでChromeの検証ツールを使った検証の仕方を教えてもらったので、メモがてらQiitaに投稿します。（感動だったのです…！！✨）

## ブレークポイントを使って表示に必要なデータが取得できているか確認する

この本家サイトがかなりわかりやすかったです！
[ブレークポイントでコードを一時停止する](https://developers.google.com/web/tools/chrome-devtools/javascript/breakpoints?hl=ja)

今回私がブレークポイントを使ったのは、
「このコンポーネントに渡した`posts`データの中身はなんだろな？
`console.log(Posts)`してみたけど、どのタイミングで取得できているのかわからない。。APIにコールしすぎているのか、はたまたreducerでレスポンスの配列をミスっているのか…👀」
というケースでした。

そこで、Postsを一覧表示しているPosts.jsのmapStateToProps部分に

```javascript
console.log(Posts)
```

を記述して、ここをブレークポイントとし、検索ボタンをクリックした時とレンダーする前のローディング時、ローディング後で`Posts`の中身を確認することにしました。

上の公式サイトに載っている手順そのままですが、
1. [Sources] タブをクリック
2. ブレークポイントを配置する対象のコード行を含むファイルを開く
3. 対象のコード行に移動
4. コード行の左側に行番号列があります。 その列をクリックします。 行番号列の上に青いアイコンが表示されます。


運用中のアプリケーションをお見せできないので😅
デモ用のアプリケーションで見ていくことにします。

###画面
キャプチャです。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327745/42502121-2143-cab6-b8e0-d51fe016036f.png)

グレーゾーンに「Open File」とあるところで、「コマンド＋P」からファイルを選択します。

###ブックマーク
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327745/6c6d224e-e615-71d8-2183-e569a7b365da.png)

確認したいところの行をクリックすると、青いタグマークが表示されます。

###確認その1
（動画小さくなっちゃった…）
この状態で入力すると、「追加」をクリックしたら子コンポーネントのpropsが変更されたことがわかります。

![output22.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327745/84775e02-d3bc-5524-4e6d-9fcf2e36842c.gif)

propsのPostsにちゃんとArrayが入っているのが確認できます。
（ちなみに私はこの配列の長さを取得出来たことで、元の配列に更に新しく取得した配列を足しちゃっていたのに気付けました😅）
今回はmapStateToPropsに書いちゃいましたが、他のところでも大丈夫です！

他にも「イベント リスナー ブレークポイント」、「DOM 変更ブレークポイント」もあるようです！（便利〜〜！😭✨）

##ちなみに
inputエリアをブックマークすると、入力するたびにpauseします。

![output32.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327745/d914df48-d00b-55b3-6931-aabcf579c881.gif)

これが面倒な時は、右上にある「ブックマークしたイベントをスルーする」設定ができるので、画像みたいなタグマークをクリックして青いアイコンのようにします。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327745/a0b45361-30a4-35ae-2ec0-8c29e949d9b9.png)

ブックマークを削除したい時は右クリックからDeleteを押しましょう

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327745/1161e1dc-96b1-8058-df48-f5e443b25f26.png)

## ReactのDev Toolsで、更新されたkコンポーネントを視覚化する

ReactのDeveloper Toolで、右上にある歯車マークをクリックするとなにやらボックスが出てきます。「Highlight Updates」をクリックした状態で、例えば入力して「投稿」を押すと、変更されたコンポーネントだけ枠が表示され、視覚的に他コンポーネントへの影響がわかるようになります。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327745/2c7e96df-5647-cf5e-f160-b76fc7bd5f59.png)

今回作成したダミーアプリケーションだと枠線の色が分かりづらかったので、こちらの記事を見てみると良いと思います。

Qiita: [React Developer ToolsでReactで作ったページをデバッグする](https://qiita.com/pepo/items/beccd5f1e83ce2b93376#%E6%9B%B4%E6%96%B0%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92%E8%A6%96%E8%A6%9A%E5%8C%96%E3%81%99%E3%82%8B)


##感想
先輩に教えてもらった時、Chromeの便利さに感激しまくりでした笑
今回は覚書メモで。
【PBCS】ASO（集約ストレージ・オプション）- MDX式の利用その①

# MDXとは

・ASO（集約ストレージ・オプション）の中で計算式を記述するために使用される言語
・一方、BSOでは **計算関数（@から始まる関数群）** および **カルク言語** と呼ばれる演算子が提供されている
　⇒ ASOで計算式を記述する場合にはMDX式への変換が必要！

## MDXの基本

1. ""(ダブルクオーテーション)ではなく **[]（大かっこ）** でくくる
2. 末尾には;(セミコロン)を **使用しない** 
　

```　
　　/* BSOの場合 */　
　　"Member01"+"Member02";

　 /* ASOの場合 */
　　[Member01]+[Member02]
```

1. ドリルダウンは **.(ドット)** を使用する

```
　[Period].[YearTotal].[H1].[Q1].[Apr]
```

4. クロス演算は **,(カンマ)** を使用する

```
　/* BSOの場合 */　
　　　"Apr"->"Actual"->"Sales"
　/* ASOの場合 */
　　　[Apr],[Actual],[Sales]
```

# 主な変換例

## (1) Case

・ELSEIFをMDX式に変換する際に使える

### BSOの場合

```
IF(@ISMBR("Member1") OR @ISMBR("Member2"))
0;
ELSEIF(@ISMBR("Member3"))
1;
ELSEIF(@ISMBR("Member4"))
2;
ELSEIF(@ISMBR("Member5"))
3;
ELSE
9;
ENDIF
```

### ASOの場合

```
IIF([Scenario].CurrentMember IS [Member1] OR 
[Scenario].CurrentMember IS [Member2]
,0,
CASE WHEN ([Scenario].CurrentMember IS [Member3]) THEN 1
  WHEN ([Scenario].CurrentMember IS [Act_PreAct]) THEN 2
  WHEN ([Scenario].CurrentMember IS [Bud_PreAct]) THEN 3
ELSE 9
END
)
```

## (2) Descendants

・指定されたレベルまたは距離にあるメンバーの子孫のセットが戻される
・@MEMBER、@DESCENDANTS、@IDESCENDANTからの変換に使用する


```
Descendants ( member, [{ layer | index }[, Desc_flags ]])
```


※【op】はオプション（任意）値
member：メンバー名（自身）
layer：戻される子孫の深さを示すレイヤーを指定【op】
index：戻される子孫の位置を示す、memberからの下位方向への階層の手順数【op】
Desc_flags：メンバー取得方法の詳細を示すキーワード【op】
　　【SELF】layer内のメンバーのみ取得
　　【AFTER】layerよりも下位のメンバーを取得。layerは含まない。
　　【BEFORE】memberとその子孫のうち階層内でlayerよりも高いものを取得。layerは含まない。
　　【BEFORE_AND_AFTER】AFTERとBEFOREで取得出来るメンバーの両方を取得。layerは含まない。
　　【SELF_AND_AFTER】layer内のメンバーと、layerよりも下位のすべての子孫を取得。
　　【SELF_AND_BEFORE】layerまでの、memberとそのすべての子孫を取得。
　　【SELF_BEFORE_AFTER】memberとそのすべての子孫を取得。
　　【LEAVES】memberとlayerの間のレベル0の子孫のみを取得。
　　

### ＜例①：自身を含むすべての子孫を取得(IDESCENDANTS)＞

#### 関数の場合

```
@IDESCENDANTS("Market")
```


#### MDXの場合

```
Descendants([Market])
```


#### MDXの場合②

```
Descendants([Market], [Market].level, SELF_BEFORE_AFTER)
```



### ＜例②：自身を除くすべての子孫を取得(DESCENDANTS)＞

#### 関数の場合

```
@DESCENDANTS("Market")
```


#### MDXの場合

```
Descendants([Market], [Market].level, AFTER)
```



### ＜例③：自身の配下にあるすべてのレベル0メンバーを取得(RELATIVE、LVL0DESCENDANTS)＞
※Market配下の階層は10階層に満たないものと仮定する

#### 関数の場合

```
@RELATIVE("Market",0)
```

※ LVL0DESCENDANTS("Market")と同義

#### MDXの場合
・Marketから10階層下は存在しないので、その間にあるすべての0メンバーが取得される

```
Descendants([Market],  10, LEAVES)
```

その②に続く
[【PBCS】ASO（集約ストレージ・オプション）- MDX式の利用その②](https://qiita.com/iwa_gino/items/705c9481410aeecfb272)

## その他変換方法はこちらを参照
https://kyoso.backlog.jp/alias/file/4591890