OmniAICreator/Qiita-1.07M huggingface dataset:
PHPとIISの組み合わせでどうも遅いとき、FastCGIの設定をチューニングしましょう

#はじめに
IIS 10.0.14393 (Windows Server 2016) + PHP 7.3.4 NTS 64bit版を組み合わせて WEB サービスを立ち上げました。
過去に同様の構成を行ったときよりもどうもレスポンスが遅く、調べて改善できたのでシェアします。

#ご参考
- [Using FastCGI to Host PHP Applications on IIS 7](https://docs.microsoft.com/en-us/iis/application-frameworks/install-and-configure-php-applications-on-iis/using-fastcgi-to-host-php-applications-on-iis) - Microsoft Docs

 （このうち **PHP Process Recycling Behavior** の **Configure FastCGI recycling settings by using IIS Manager** 項）

#チューニング
ごくごく簡単なphpページですが、チューニング前はレスポンスを得られるまで毎度 400ms かかっていましたが、チューニング後は 4ms になりました。

##手順
0. 「IISマネージャー」（管理ツール）を開きます。
1. 左ペインで、サーバーのホームを選択すると、中央ペインに「FastCGI の設定」と書かれたアイコンが現れますので、これをダブルクリックして開きます。
2. PHP の実行ファイルパスが書かれた項目が表示されると思いますので、これを選択し右ペイン（操作）から「編集」をクリックして開きます。
3. 「インスタンスの MaxRequests」と書かれた項目に **10000** くらいを指定します。
4. 「環境変数」と書かれた項目のボタンをクリックして、コレクション設定画面を開きます。
5. 「追加」ボタンをクリックし、Name に "**PHP_FCGI_MAX_REQUESTS**"、Value に先ほどの「インスタンスの MaxRequests」で指定した値を入力します。おわったら OK ボタンで各画面を閉じます。
6. PHPモジュールを使用しているサイト、またはサーバーを再起動させます。

なお、コマンドライン (appcmd.exe 利用) からも設定可能なようです。詳細は「ご参考」にあるページの情報をどうぞ。

以上です。
Swift UIButton の状態を１枚の画像で切り替える

selected や highlighted の表示を １枚の画像で切り替えたい場合のメモ

```swift
// normal時の画像をテンプレートとしてレンダリングモードで取得
let highlightedImage: UIImage = UIImage(named: "icon")!.withRenderingMode(.alwaysTemplate)

// その画像をハイライト時の画像にする
self.button.setImage(highlightedImage, for: .highlighted)

// tintColorで色を指定する
self.button.tintColor = UIColor.red
```

ボタンを押した時に同じ画像で色が赤になります。
わざわざ画像を作ってもらわなくても大丈夫。
Memo - Twitter Developer Register

# Memo - Twitter Developer Register

 * Describe in your own words what you are building

```
1. I’m using Twitter’s APIs to Learning of text analysis.
2. I plan to analyze Tweets to understand Natural language processing.
3. Yes, I will be Tweeting content when good events happen.For example, show Olympic champion’s name to my followers. Or informing the International Declaration of Peace.
4. Tweets will not display In my solution.
```
Salesforce権限レベル

降順(レベルが低くなる)
1. プロフィール(◆Meta Data)
2. Full Accesss権限(所有者、所有者上級のUser、システム管理者)

▼ここから降順(権限が低くなる)
3. 組織Default(◆Data)
4. ロール(◆Data)　　　　⇒下級のロールの権限を取得するには検索が遅くなる
5. 共手動共有(◆Data)　　⇒組織の共有設定(「セキュリティのコントロール」⇒「共有設定」)
6. 手動共有(◆Data)


:point_up_tone5:使用方法が違う(階層を使用したアクセス許可)
-ロール　　　　⇒下級ロールのユーザが操作可能なレコードに対して、同じ権限をもらえる
-共有グループ
-キュー　　　　⇒所有者のみFULL権限

※補足内容：
▶Meta Data:
 ①プロフィール(権限を制限できる)
 ①権限セット(権限を追加しかできない)
　例：同じ部門で一人だけ、一部画面が閲覧できない。
　対応方法：プロファイルを分割しかできない
▶Data(権限を追加しかできない)：
　ownerid（所有者）FULLアクセス

原作者リンク：https://qiita.com/xuwenzhen
Xcodeのgccでコンパイルしているつもりで実はclangでコンパイルしていた事実を今更知りました

# 概要 #

普段はmacを使用しているので、C++などのコードをコンパイルするのにXcodeをインストールして、それに付随しているgccを使っていた........つもりになっていました。それが実はgccではなくclangが呼ばれていることがわかって、ちょっと調べてみたのでまとめておきます。
ただ、調べたらだいぶ前からそうなっていたようで、自分の知見の無さと、時代についてけてない感にちょっと凹み気味です。

# この記事を書いて学んだこと #

- XcodeではGCCではなくClangを使ってコンパイルしている。
- ClangはLLVMのサブプロジェクトの1つであり、C++をはじめとするC言語系のLLVMに対するフロントエンドを提供する。
- LLVMはコンパイラ基盤であり、LLVMをつかってClangのようなコンパイラを自作することもできる。


# Xcodeのgccを呼び出すとclangが呼び出される #

この事実に気がついたのは、他の記事を書いている際に、コンパイルの処理内容を表示させた時でした。

```bash:
gcc -v -o hello main.cpp hello.cpp
```

この時表示されたのが

```bash:
...
"/Library/Developer/CommandLineTools/usr/bin/clang" -cc1 .... hello.cpp
"/Library/Developer/CommandLineTools/usr/bin/clang" -cc1 .... main.cpp

...
```

んっ？clang? cc1plusじゃなくて？

念の為、ターミナル上で```man gcc```を入力したが何も出力されず、試しに```man clang```と入力したらバッチリ説明がでてきたので、gccの代わりにclangがインストールされているみたいです。

```bash
NAME
       clang - the Clang C, C++, and Objective-C compiler

SYNOPSIS
       clang [options] filename ...

DESCRIPTION
       clang  is  a C, C++, and Objective-C compiler which encompasses prepro-
       cessing, parsing, optimization, code generation, assembly, and linking.
       Depending  on  which high-level mode setting is passed, Clang will stop
       before doing a full link.  While Clang  is  highly  integrated,  it  is
       important to understand the stages of compilation, to understand how to
       invoke it.  These stages are:
...
以下省略
...
...
```

# clangはGCC互換のコンパイラみたいなもの #
ググってみると、clangはGCCと互換のあるコンパイラで、LLVM用のC言語系のフロントエンドを提供するClangプロジェクトによって提供されたらしい。以下、Clangのホームページ([clang.llvm.org](http://clang.llvm.org))からの原文の引用です。
>The Clang project provides a language front-end and tooling infrastructure for languages in the C language family (C, C++, Objective C/C++, OpenCL, CUDA, and RenderScript) for the LLVM project. Both a GCC-compatible compiler driver (clang) and an MSVC-compatible compiler driver (clang-cl.exe) are provided. You can get and build the source today.

# LLVMはコンパイラ基盤 #
LLVM(Low Level Virtual Machine)はコンパイラ基盤らしいです。以下、LLMVMのホームページ([llvm.org](https://llvm.org/))からの原文の引用です。
>The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines. The name "LLVM" itself is not an acronym; it is the full name of the project.

なんとなくまとめると、LLVMはコンパイラを作成するのに必要な環境が揃っていて、LLVMを使ってコンパイラを自作することが可能である。また、LLVMの特徴としては、最終的なマシン語を生成するまでの間に中間言語(IR)を何度も作成し、その度に最適化を行うらしいです。

公式ホームページ以外で参考にさせて頂いたのは以下のサイトです
[大学院生のためのLLVM](https://postd.cc/llvm-for-grad-students/)
[LLVMを始めよう!〜LLVM IRの基礎はclangが教えてくれた- プログラムモグモグ](https://itchyny.hatenablog.com/entry/2017/02/27/100000)

# 結局LLVMとClangって? #
いまいち僕には難しくて良く理解できなかったのですが、色々な記事を読んで自分なりに(僕の知っている用語内で)解釈すると、LLVMは対応したハードウェア用のマシン語を作成するライブラリみたいなもので、ユーザはLLVMの用意したライブラリを使ってClangの様なコンパイラを作成することができる...ということでとりあえず納得することにします。


# まとめ #
今回は、たまたまmacがgccでなくLLVMのclangを読んでいることから、LLVMとClangについて調べました。LLVMはコンパイラを作成する環境を提供していて、それを使って開発されたものがいくつかあり、その1つがClangプロジェクトのclangということがわかりました。LLVMを使用すれが、簡単なコンパイラが(難しいと思うけど)作れそうなので、今度機会があればLLVMについてもう少し細かく調べたいなと思います。
Nagios CRITICAL - Socket timeout after 10 secondsに関して 

#**対応方法**

結論からいうと、対応方法は下記のようになります。

```
define service{
    use                             local-service
    host_name                       localhost
    service_description             HTTP
    check_command                   check_http!-N -p 80 -t {second}
    notifications_enabled           1
}
```
-t の後ろにある{second}に秒を設定してくだい。
and nagios reload..


#**原因は？**

Nagiosはシステムに何かの問題がある時、アラートを表示しています。</br>
普通はDefaultで定義されているtime outでモニタリングしている間にHostからResponseがない場合アラートが発生します。</br>
サービスダウンを表示している間にNagiosは三回チェックして、サービスが失敗したらCRITICALアラートを発生します。</br>
それと同時にNagiosがチェックする時、一回でも失敗したら、設定したadministratorに報告します。

time outのDefaultは10秒になっているそうなので、10秒より長く設定することもいいかもしれません。


#**参考**

[Nagios: CRITICAL - Socket timeout after 10 seconds](https://techietent.blogspot.com/2013/04/nagios-critical-socket-timeout-after-10.html)</br>
[nagios - HTTP CRITICAL Socket timeout after 10/20/60 seconds](https://serverfault.com/questions/529342/nagios-http-critical-socket-timeout-after-10-20-60-seconds/529967#529967)
Salesforce設定のよくある問題対応

1.タブが表示されない
　①開発中
　　設定⇒オブジェクトマネージャー⇒詳細⇒編集⇒リリース状況⇒「開発中⇒リリース済み」
　②アプリケーションにタブを追加確認
　　設定⇒アプリケーション⇒アプリケーションマネージャー⇒「アプリケーション名⇒編集」⇒タブ選択
　③プロファイルでデフォルトで表示されるか
　　設定⇒ユーザ⇒プロフィール⇒「システム管理者(ログインユーザプロフィール)」⇒
　　タブ設定⇒標準タブ設定(カスタムタブの設定)⇒
　　表示しようとするのタブを「デフォルトで表示」に設定
　④オブジェクト参照権限
　　設定⇒ユーザ⇒プロフィール⇒「システム管理者(ログインユーザプロフィール)」⇒
　　標準オブジェクト権限(またはカスタムオブジェクト権限)⇒
　　表示しようとするのオブジェクトに最低限の参照権限があるか確認、なければ☑を入れる

2.　開発画面をF5キーを押して、更新しても、ソースが古いやつで表示される。
　①セッションが残るのか確認
　　設定⇒セキュリティ⇒セッション設定⇒キャッシュ⇒
　　「パフォーマンスを向上させる...」チェックが外れてるか確認。
　　※開発時は外れる必要がある。リリース時は要れる方法いいと思う。
　②F5+Ctrlキーを押して更新。
正規表現を動的に作って複数の文字列を置換する

# TL;DR

* ``/#{vars}/``で変数展開して正規表現を動的に作れる
* ``String.gsub``の第二引数にHashを渡せて複数のパターンを定義できる

# 例示
```rb
str = '私の名前は{name}です。好きなプログラミング言語は{language}です。'
hash = {
  '{name}' => 'zom',
  '{language}' => 'Ruby',
}
str.gsub!(/#{hash.keys.join('|')}/, hash)

p str # "私の名前はzomです。好きなプログラミング言語はRubyです。"
```

# 備考
正規表現の変数展開ってエスケープはどうなの？とかまだ調査・検証できていないですので、外部から送られてくるパラメータをそのまま突っ込んだりすると危ないんじゃないかとかそんな懸念があります。おいおいやっていきたいですね。
Eclipse CDT 忘備録 cpplint 

# Ecripse-CDT で cpplint 
* 設定方法と使用方法を調べたので、忘れないうちに、記述しておく。

## Ecripse-CDT の外部ツールに cpplint を登録
* [外部tool実行]ボタン右の[▼]ボタンを押下 → External Tppls Configuration... を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169589/d4e87492-0440-7c2c-a8c7-fef323904ed5.png)


* ①の New ボタンを押下 → ②のName: に cpplint を入力
* Main タブ → Location:  ```/usr/bin/python```  → Arguments:```/usr/bin/cpplint ${resource_loc}```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169589/668629df-d569-d97b-668c-a1f98922d282.png)


* Common タブ → External Tools に チェック ON → Launch background の チェック OFF
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169589/8bc4e5ef-0984-2feb-0ce1-160c59fbd119.png)


* Apply ボタン 押下



## 使用時
* project 全てを一度にチェックできない。１ファイル毎にチェックしていく。
    * チェック対象ファイルを エディタ画面で編集対象としておき、[外部tool実行]ボタン右の[▼]ボタンを押下　→ cpplint を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169589/78cbe650-4594-e67f-4f02-73653e5fefd5.png)


* cpplint の 実行結果が Eclipse 画面下方の Console に出力される。
    * この行番号に マウスクリックで飛ばす方法はありそうだけども、わからず…。　```CTRL+L``` で手入力で飛ばす。

### cpplint 前の Build について
* cpplint の実行前に Build を行う設定がデフォルトのなっている。
    * 修正時に build 不可になる やらかしを行いかねないため?
* cpplint 前の build の実施/未実施は 選択可能。
* [外部tool実行]ボタン右の[▼]ボタンを押下 → External Tppls Configuration...　→ Program [cpprint] → Build タブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169589/64a50859-5bcb-986b-a9c3-42b1706baa55.png)
* Build before launch の チェックボタン で制御可能

## CPPLINT.cfg
* cpplint のオプションは、ソースファイルのディレクトリ または その上位の プロジェクトのルートディレクトリに ```CPPLINT.cfg``` を配置し、設定内容を書き込む。
    * autotools の プロジェクトなら ```src``` ディレクトリ がお薦め。

## 参考Webページ
* [Eclipse：C++静的チェック環境](https://qiita.com/mebiusbox2/items/e998fe5e78fec7c24fd1) https://qiita.com/mebiusbox2/items/e998fe5e78fec7c24fd1
機械学習を世界一分かりやすく理解する(主成分分析編)

# 主成分分析とは

> あの子の趣味はなんだろう。好きなものはなんだろう。特徴はなんだろう。構成成分はなんだろう。

誰もが一度は抱いたことのある疑問です。これを機械学習では

> あの子の<b>主成分</b>はなんだろう

なんて言ったりします。今度使ってみてください。


さて、データを機械学習していく上で、そのデータの特徴が上手く表せていないと精度がイマイチです。
そこで、雑多な成分を排除して一番特徴となる成分だけを上手く抽出しようというのが<b>主成分分析</b>というわけです。
<b>次元削減</b>なんて言われ方もしますがほとんど同じ意味です。


# 主成分分析のアルゴリズム

主成分分析のアルゴリズムには主に<b>PCA法</b>が用いられます。

PCAと調べるとモルヒネだのアンフェタミンだの会計ソフトだのいろいろ出てきますが機械学習ではPrincipal Component AnalysisのPCAを指します。当然ですが和訳すると「主成分分析」です。


## 概要


例えば2次元のプロットがあったとしますね。

![Screen Shot 2019-04-12 at 11.25.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243995/9d08f472-84e5-f866-3f36-b2df2dae1fcf.png)


PCAは特徴を説明することなので、一番<b>この特徴を説明している2本の直交した直線</b>を引きます。

イメージで言うとこんな感じです。次元の数だけ直線が引けることがわかると思います。

![Screen Shot 2019-04-12 at 11.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243995/55724e67-58af-79a8-95f4-a6faf415843f.png)

雰囲気は掴めましたか？ここから少し難しいお話になります。

## 分散
さて、さっきの2本の線分はデータの<b>分散</b>を表していることは見てわかると思います。
そして、<b>分散の大きいものほどデータを説明</b>していることがわかると思います。

この分散を定式化するとこのようになります。(分散の公式より)

$$
\mu^n = a_1x_1^n + a_2x_2^n + ... + a_px_p^n
$$

すると、分散$\mu$の平均は

$$
\overline{\mu} = \frac{1}{N}\sum_{n=1}^{N}(a_1x_1^n + a_2x_2^n + ... + a_px_p^n) = a_1\overline{x_1} + a_2\overline{x_2} + ... + a_p\overline{x_p}
$$

となることがわかりますね。わかりますよね？


実はこっからまたゴニョゴニョするのですが、要は<b>分散の分散</b>を求めます。すると

$$
s_{\mu}^2 = \frac{1}{N}\sum_{n=1}^{N}(\mu^n - \bar{\mu})^2= {\bf{a}^T}S \bf{a}
$$


となります。これを最大化することで主成分分析が完了します。

## ラグランジュの未定乗数法

機械学習が大好きなみなさんは数学も大好きな筈なのでさすがにこの単語は聞いたことくらいあるでしょう。
まず、これを説明する前に<b>最小化・最大化</b>という言葉がちらついたら<b>微分(偏微分)</b>が頭にくるようにしなければなりません。

関数の極値を求めるにはその導関数(偏導関数)を調べればよい、というのは高校数学でもやりましたよね。

さて、ラグランジュの未定乗数法とは、

> ある条件下での任意の関数の極値を求める手法

です。詳しいラグランジュの未定乗数法による極値の解法は書籍などで勉強するのが良いと思われます。


さて、今回ならば、$a_1^2 + a_2^2 + ... + a_p^2 = 1$という条件下のもと$s_u^2 = {\bf{a}^T}S\bf{a}$の極値を求めることにあたります。

$$
L(a, \lambda) = {\bf{a}^T}S{\bf{a}}-\lambda({\bf{a}^T\bf{a}}-1)
$$

この偏導関数は、

$$
\frac{dL}{d\bf{a}} = (S + S^T){\bf{a}} - 2\lambda{\bf{a}} = 2S{\bf{a}} - 2\lambda{\bf{a}} = 0
$$

これを解くと、

$$
S{\bf{a}} = \lambda{\bf{a}}
$$



さて、これによって、次のことを証明することができました。

> データセットの分散共分散行列Sの固有ベクトルが$\bf{a}$, 固有値が$\mu$の分散$s_{\mu}^2$と一致する

つまりは、<b>分散共分散行列の固有値問題を解くことが主成分分析のアルゴリズム</b>です。


さて、ここからは統計の知識となりますが、実は分散共分散行列は、<b>標準化された相関行列</b>と同じ性質を持ちます。相関行列は対称行列となるため、そちらの方が都合がよく、そちらを用いる場合が多いので今回はそちらについて見ていきましょう。

## アルゴリズム

アルゴリズムをまとめます。
　
1. データを標準化します
2. 相関行列を計算します
3. 相関行列の固有値問題を解きます
4. 固有値の大きい方から対応する固有ベクトルを並べます
5. この内、ベクトルk個(k≥0)を選択することによって次元を圧縮することができます
6. k個の固有ベクトルから特徴変換行列Wを作成します
7. XとWの積が主成分となります


# 実装

実装はめちゃくちゃ簡単です。`numpy`を使えばチョチョイのチョイです。多分コメントアウトを見れば一発で理解できると思うのでドンと載せちゃいます。

```Python
import numpy as np

def pca(X):

    # 標準化
    X = (X - X.mean(axis=0)) / X.std(axis=0)

    # 相関行列
    R = np.corrcoef(X.T)

    # 固有値分解
    eigen_values, eigen_vectors = np.linalg.eigh(R)

    # 特徴変換
    X_pca = X.dot(eigen_vectors)

    return X_pca
```
【備忘録】sklearnを使ってmnistをランダムフォレストで学習させる

## まえがき
機械学習の学習アルゴリズムの一つとして、ランダムフォレストという学習方法があると知った。
sklearnのRandomForestClassifierを使うと簡単に実装出来そうだったので実装をしてみた。
今回はmnist(28 × 28の手書き文字)を学習データとして学習させる。

## 以下ソースコード
```.py
import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist
from sklearn.ensemble import RandomForestClassifier
import time

start_time = time.time()
# データの読み込み
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 小数化
x_train = x_train / 255
x_test = x_test / 255
# データ数
m_train, m_test = x_train.shape[0], x_test.shape[0]
# ベクトル化
x_train, x_test = x_train.reshape(m_train, -1), x_test.reshape(m_test, -1)
# ランダムフォレストは標準化しない

# ランダムフォレスト
# max_depth=10 <-木の最大の深さ=10 深いほど学習に時間かかるが、ある程度精度が上がる
rf = RandomForestClassifier(max_depth=10)
rf.fit(x_train, y_train)

# 経過時間
print("time[s] : ", time.time() - start_time)

# 学習データの正解率
print("Train :", rf.score(x_train, y_train))

# テストデータの正解率
print("Test :", rf.score(x_test, y_test))
```

## 実行結果

```
time[s] :  4.7764482498168945
Train : 0.9466166666666667
Test : 0.9296
```

実行結果としてCore i5のノーパソ上で4.7秒の学習で92.9%の正答率が出た。

## まとめ
実装したのはいいものの、ランダムフォレストの学習アルゴリズムについてまだよく理解出来てないので、今後勉強をして、少しずつ記事を編集していきたいと思います。
memo: zsh alias

```bash:.zshrc
# basic
alias qq="exit"
alias c="pbcopy"
alias reload_zsh="source ~/.zshrc"
alias edit_zsh="vim ~/.zshrc && source ~/.zshrc"
alias v="vim"
alias lt="ls -ltr"

# git
alias g="git"
alias co="git checkout"
alias st="git status"
alias ft="git fetch"
alias stash="git stash"
alias gb="git branch"
alias gdel="git branch -D"
alias gadd="git add ."
alias gcommit="git commit -m "
alias gpush="git push origin HEAD"
alias gpull="git pull origin master"
alias gdiff="git diff"
alias master="git checkout master"
alias gmerge="git merge"

# docker
alias dcu="docker-compose up"
alias dcb="docker-compose build --no-cache"
alias dce="docker-compose exec"
alias dcw="docker-compose exec web"
alias dcmigrate="docker-compose exec web rails db:migrate"
alias dcrollback="docker-compose exec web rails db:rollback"
alias dcrspec="docker-compose exec web rspec"
```
[Tex] How to install Tex in Mac by Homebrew

#はじめに
Texを導入方法を調べるとめっちゃ面倒な方法が多くて…泣
でも、確かbrewでできるよな！
って気づいたので、その簡単な方法をメモっときます。

#注意事項
SSDなどを**10GB**ほど占領するので容量に余裕がある人限定です。
大した操作はないけど、installにはめっちゃ時間かかるから時間にも余裕がある時に行うのを推奨します。

#インストール手順
##前提条件
・Homebrewがinstallされていること
　　→installしてない場合は[こちら](https://brew.sh/index_ja)
・Homebrew-Caskがinstallされていること
　　→installされていない場合は`brew tap caskroom/cask`を実行

##Homebrewでinstall
```:terminal
$ brew update 
$ brew cask install mactex
```
##tlmgrのPATH設定

下記コードを一番下に記載する。
shellを**bash**を使用してる人は`~/.bash_profile`に上記コードを記載すること。

```:~/.zshrc
export PATH=/usr/local/texlive/2018/bin/x86_64-darwin:$PATH
```

##tlmgrでパッケージ管理

下記コマンドの実行直後にMacの管理者パスワード入力を求められる。

```:terminal
$ sudo tlmgr update --self --all
$ sudo tlmgr paper a4
```

#動作確認

##サンプルファイルの作成
下記のようなサンプルファイルを作成する。

```TeX:sample.tex
\documentclass{jsarticle}
\begin{document}
\section{日本語}
今年は暑かった。
\end{document}
```

##PDFを作成
今回はterminalから確認する。

```:terminal
$ platex sample
$ dvipdfmx sample 
```

これで**sample.pdf**が作成され、記述内容が合っていれば完了です！


#参考文献
[Homebrewを使ったmactexのインストール・アンインストール](https://oversleptabit.com/archives/4701)
[MacでTeXを使えるようにした](https://qiita.com/takenawa/items/c72835d67bf14928e0e9)
jupyter notebookの環境構築メモ(CSVデータ、グラフ描画、Vi バインディングに対応)

#前提
Windows 10
pythonをインストール済み
AppData以下のpython scriptディレクトリへのPATHを追加済み
gitをインストール済み

#jupyter notebook 本体のインストール
pip install jupyter

#データ変換、描画ライブラリのインストール
pip install numpy pandas matplotlib

#nbextensionsのインストール
pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install

#Vim bindingをインストール
git clone https://github.com/lambdalisue/jupyter-vim-binding C:\ProgramData\jupyter\nbextensions\vim_binding
インストール後、NbextensionタブからVim bindingを有効化
VSCodeでPythonのLinterとFormatterをいじるときに参考にしたリンク【メモ】


pep8のエラーコード一覧が参考になった：

- [Pythonソースのスタイルチェッカー「pycodestyle」と自動フォーマッター「autopep8」を使う。| "BOKU"のITな日常](https://arakan-pgm-ai.hatenablog.com/entry/2018/11/12/090000)

settings.jsonの書き方が参考になった

- [VS Code コーディング規約を快適に守る | Qiita |](https://qiita.com/firedfly/items/00c34018581c6cec9b84) @firedfly
- [[Python] コードの自動整形でインデントレベルを2に設定する | Qiita |](https://qiita.com/ksh-fthr/items/7cf8b5f2fde82d1c6bf7) @ksh-fthr
- [VSCodeのPython開発環境でpylintの代わりにflake8を導入し自動整形を設定する | Qiita |](https://qiita.com/psychoroid/items/2c2acc06c900d2c0c8cb) @psychoroid
- [VScodeでautopep8が勝手に改行するのを見逃してほしい | Qiita |](https://qiita.com/ideodora/items/09e9e7577ef672bb8014) @ideodora

 時間があったら細かい手順とかの記事書くかも
apexデータ保存順

1. システムデータ型チェック 
2. すべてのbefore トリガが実行されます。
   ⇒ここで　NewMapは利用できない（IDがまだ生成してないため）
   ⇒同一オブジェクトに複数のBefore　Insertトリガを作成可能が実行順は決めてない
   ⇒データ修正可能
3. システムデータ型チェック＋入力規則
4. 保存（コミットしません）
   ⇒INSERT句を実行
   ⇒IDは作成される
5. すべてのafter トリガが実行されます。
   ⇒ここから、NewMapのデータは修正できない（チェックが終ってるから）
6. 割り当てルールが実行されます。
   ⇒標準はリード、ケース+カスタムオブジェクト
7. 自動応答ルールが実行されます。
8. ワークフロールールが実行されます。
   ⇒ワークフロー項目自動更新の場合
     ∟before update トリガおよびafter update トリガが1回のみ実行。
     ∟カスタム入力規則は実行されません。
9. エスカレーションルールが実行されます。(スケジュールみだい)
10. レコードに積み上げ集計項目が含まれる場合、積み上げ集計項目の更新
11. 条件に基づく共有の評価が実行されます。
   ⇒ヒストリデータはこのタイミングで作成される
12. コミット
13. メール送信など

原作者リンク：https://qiita.com/xuwenzhen
「ページトップへスクロール」ボタンのフォーカスを外してユーザビリティを上げる

jQueryで実装した**ページトップへスクロール**するボタンにフォーカスを外す処理を加え、キーボードユーザーのユーザビリティを少し向上させてみました。

```html:scroll-to-top.html
<button class="js-scroll-to-top" type="button">ページトップへ</button>
```

```js:scroll-to-top.js
$('.js-scroll-to-top').on('click', function() {
  $('html,body').animate({ scrollTop: 0 }, 500);
  return false;
});
```
↑機能的には十分ですが、ボタンクリック後にもフォーカスが残ってしまいます。
ページトップへスクロールボタンは大抵ページの下部にあったり、上部で非表示になるため、フォーカスが残ってしまうとキーボード操作のユーザーはタブキーを連打して現在地を移動しなくてはいけなくなるかもしれません。

```js:scroll-to-top.js
$('.js-scroll-to-top').on('click', function() {
  $('html,body').animate({ scrollTop: 0 }, 500);
  this.blur(); //フォーカスを外す
  return false;
});
```
`this.blur();`を加えればボタンクリック後にページトップへスクロールボタンからフォーカスが外れ、次の操作に移行しやすくなります。
JavaScript 特定の要素の中身と背景色を変更する方法

#JavaScript　備忘録

###1.特定の要素の中身をごっそり書き換える方法

書き換えたい対象要素のinnerHTMLプロパティに文字列を代入すると、「対称の要素」の中身が「置き換える内容」に変化する。
実際に使う場合は、書き換えたい対称の要素にはid属性を使ってid名を割り振っておき、getElementByIdメソッドを使って特定し、innerHTMLプロパティに文字列を代入すれば良い。

(対象の要素).innerHTML = "置き換える内容"

```Javascript
 document.getElementByID("my_color_p").innerHTML = "This is Red!";

```
----------------------------------------------------------------------------------

### 2.任意の要素の背景色を動的に変更する方法

getElementByIdを使って対象要素を特定し、styleプロパティのbackgroundColorプロパティの値に、望みの背景色を代入するだけ

document.getElementById('対象id名').style.backgroundColor = '新しい背景色';

```Javascript

document.getElementById("my_color").style.backgroundColor = 'red;

```
ざっくり絵で理解するAWSのIAM用語「ユーザ、グループ、ロール、ポリシー」

それなりにAWSを利用していますが、コード書きばかりに脳内リソースを割いておりアクセス権限などにあまり興味がいかない悪い癖があり困っています。
４月ということで新人さんもいますし、自戒の念も込めたりしつつ、まずはざっくりと自分用に関係をまとめておこうかと思いました。
下の図を見るだけで、大体ざっくり理解できるように書いているつもりです。(本家のサイトは用語が多すぎて難しすぎるので…)
もし間違いなどありましたらご指摘頂けると大変助かります。 :bow: 

# IAMユーザ、グループ、ロール、ポリシー関係図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196303/d89f7142-c914-983c-bf63-d5ac0008593e.png)

# ポイント
- IAMユーザの認証方法には２種類があり、どちらかまたは両方を利用できる
    - パスワード認証（Webコンソールから）
    - アクセスキー＆シークレットキー認証（CLIやAPIから）
- AWSの認証機構として、IAMユーザ以外に「IAMロール」がある
    - IAMロールはAWSサービスの実行リソース(例えばLambdaの特定の関数など)に対する権限付与の仕組みであり、ユーザ（人間）は直接認証は意識しなくてよい。
    - ちなみに厳密には、IAMロールはスイッチユーザなどにも使えるので、単純にサービス「だけ」に紐づくわけではなく、実は人に紐づくような利用方法もあったりします。(この辺もまたややこしい)
- アクセス権限付与の対象には３種類のモノがあり、この単位で利用権限を個別に付与できる。
    - IAMユーザ
    - IAMグループ
    - IAMロール
- IAMグループはIAMユーザをひとまとめにグルーピングする概念である。（※ロールはグルーピングしない）
- 複数の権限セットを「IAMポリシー」としてひとまとめに扱える
    - 権限付与対象へ、ポリシーを付与するか、個別の権限を直接（インラインポリシー）付与する。

# （おまけ）ついでにGCPのIAMとの関係性
AWSとは少し離れますが、GCPにもIAMという似て非なる機能があります。
厳密性は省きつつ、大体同じ概念の用語を対応付けてみました。→GCPなんて知らーんと言う方はスルーで

|AWSのIAM用語|GCPのIAM用語|備考|
|---|---|---|
|IAMユーザ|ユーザアカウント|主に人が利用する際の権限付与対象|
|IAMグループ|Googleグループ|(複数の)人をひとまとめにして同一権限を付与する対象|
|IAMロール|サービスアカウント|主にクラウドで実行するモノ(Lambda、CloudFunctionなど)に権限付与する対象|
|IAMポリシー|役割(Role)|権限のセットをひとまとめに扱うモノ|

こうして並べると、**AWSのロールとGCPのロールの意味が別の意味で使われている**ことが分かります。(ややこしい)
世間一般のRDB(OracleやMySQLなど)やDirectoryService等の権限用語では、Roleの意味はGCP寄りの意味が多いかと思います。
→そういう意味ではAWSのRoleだけが特殊な気がします。(個人的感想)

# おわりに
以上、ざっくりと調べた内容をまとめました。
普通に利用するにはまずはこの程度で良いのかなと思いますが、IAMは非常に奥が深い世界のようで、他にも色々な概念があるようです。
必要になったらIAMの別の用語についても、できるだけ難解な用語に頼らず、ざっくりとまとめられたらと思います。
Multics, OSI and next

大きくて、重くて、厳密さを追求して失敗した事業。
 
 <この項は書きかけです。順次追記します。>
# OS、言語、通信規約

OSといsて大きすぎて複雑すぎたという伝説のMultics

rattydave/alpine-multics
https://hub.docker.com/r/rattydave/alpine-multics

言語として、大きすぎて複雑すぎたという伝説のPL/１

通信規約として、大きすぎて複雑すぎたOSI

それらに対して、管理方法として、大きすぎて複雑すぎたというPnbokは、最近小さくなったらしい。
https://www.pmi.org/pmbok-guide-standards/foundational/pmbok

改善の方法としても、大きすぎ、複雑すぎたCMMIを削ぎ落としたのが Scrumという認識。

つまり、ソースコードのない管理系はいくらでも削ぎ落とせるが、
ソースコードのあるOS、言語、通信規約は、そう簡単に削ぎ落とせないというのが経験則か。

# 考え方、枠組み
考え方、枠組み、方向性には、いいところがあっても、
統計や確率に基づいて選択するのではなく、
細かい整合性にこだわると失敗する。

CMMIは、最適化を目指している道具だから、統計、確率はあたりまえのはずなのに、
低い水準から議論すると間違うという典型。

水準５から考えれば、現実を描写する統計や、成功する確率に投機するとう姿勢があればよい。

その意味では、CMMIはMulics, OSIとは違うかもしれない。使い方で無駄をしなければ。


p.s.
SCRUMとか、C言語規格とか、小さくて、軽くいものでも、同じ無駄可能。

現実の課題とかを見ずに厳密な定義をしようとすると道を踏み外すかも。

SCRUMであれば、現実に使っている道具、自動化、参加している人の能力など。
C言語規格であれば、CPUの仕様、実際に書いているコードの分布、書き手の能力など。

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.01 初稿 20190412
ver. 0.04 URL追記　20230302

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
DockerでDatadogのアカウントをまたいでdashboardをcopyする

## 概要

[Datadogでアカウントをまたいでdashboardをcopyする](https://qiita.com/seikoudoku2000/items/42800ed68ca4f4ed8a06)

こちらの記事の内容で使われているツールを `Docker` を使って実行できるようにしました。

## How to

#### Dockerfile

```dockerfile
FROM python:3-alpine

WORKDIR /app

RUN python3 -m pip install --user dashjson

CMD [ "python3", "-m", "dashjson", "-h" ]
```

```shell
$ docker build -t dashjson .
```

#### credential file

```shell
$ cat << EOS > ./.dashjson_from.json
{
    "api_key": "abcdefg12345678",
    "app_key": "abcdefg987654321"
}
EOS
```
see: https://github.com/ouyi/dashjson#how-to-use

アカウントごとに作成しておく。

#### Datadogからのexport

```shell
$ docker run -ti --rm -v $PWD:/app dashjson python3 -m dashjson -c .dashjson_from.json tojson -b ${dashboard_id} dashboard.json
```

`${dashboard_id}` は下記のダッシュボードURLの値を利用した。
<img width="426" alt="貼り付けた画像_2019_04_12_11_10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50806/c60cc24e-7310-aa9d-8ffd-205cf940f40a.png">

#### Datadogからのimport

```shell
$ docker run -ti --rm -v $PWD:/app dashjson python3 -m dashjson -c .dashjson_to.json fromjson -n dashboard.json 
```

## 備考

Datadog のダッシュボードの種類によって付与するオプションを変える必要等もあるので、詳しくは `dashjson` のヘルプを参照してください。

```shell
$ docker run -ti --rm dashjson   
usage: dashjson.py [-h] [-c CREDENTIALS] [-t {t,s}] {tojson,fromjson} ...

A tool for exporting (or importing) Datadog dashboards to (or from) json files.

Examples:

- Export to json (the id can be found in the dashboard URL, normally numeric or alphanumeric)
# python dashjson.py tojson -b xyz-123-abc my_timeboard.json
# python dashjson.py -t s tojson -b 584086 my_screenboard.json

- Import from json
# python dashjson.py fromjson my_timeboard.json
# python dashjson.py -t s fromjson my_screenboard.json

- Import from json creating new dashboard
# python dashjson.py fromjson -n my_timeboard.json
# python dashjson.py -t s fromjson -n my_screenboard.json

- Example content of the credentials file (your keys can be found at https://app.datadoghq.com/account/settings#api)
# cat ~/.dashjson.json
{
    "api_key": "abcdefg12345678",
    "app_key": "abcdefg987654321"
}

optional arguments:
  -h, --help            show this help message and exit
  -c CREDENTIALS, --credentials CREDENTIALS
                        the json file containing api_key and app_key as dictionary entries, defaults to ~/.dashjson.json
  -t {t,s}, --board-type {t,s}
                        the type of the dashboard (t for timeboard and s for screenboard) to be imported or exported, default to t

subcommands:
  run `python dashjson.py <subcommand> -h` for usage on a subcommand

  {tojson,fromjson}     valid subcommands
    tojson              export a dashboard to a json file
    fromjson            import a dashboard from a json file
```
【初心者向け】好奇心を高めるpythonプログラミング

プログラミングは子どもの好奇心を高めるのに最適な道具だと考えています。
今回は好奇心を高めるプログラミング学習について考えたことをシェアします。
※お気軽にご意見いただけたら幸いです。

#1.この記事の対象#
・これからプログラミングを学びたい方
・プログラミングを初心者に教える機会のある方
・プログラミングを始めたが分からないことが多すぎてつまらない方

#2.好奇心の種類#

まず好奇心には２つ種類があります。それが拡散的好奇心と知的好奇心です。それぞれ見ていきましょう。

>拡散的好奇心とは、いろいろな事に興味をもつ好奇心のこと。

例えば子どもがりんごを見て興味を示すのが拡散的好奇心です。

![拡散的好奇心.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387778/15b4d90f-220d-c682-20ab-4fd2db7b25bf.png)
図１：拡散的好奇心のイメージ

>知的好奇心とは、拡散的好奇心で興味を持ったものを、専門的な知識の積み重ねで深めていくもの。

例えば、りんごを持って興味を持った子どもが、母親に「これは何？」と訪ねて、「りんご」という名前を知ったり、実際に触って見て表面がツルツルしていることを確認したりすることが知的好奇心を発揮している例になります。

要は**労力をかけて調べる**ということです。

![知的好奇心.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387778/99c97d7b-770a-e771-dc56-f66c31847a74.png)

図2:知的好奇心のイメージ

#3.好奇心が生まれる条件#

知的好奇心が生まれる条件として重要なのが、**前提知識をある程度持っていること**です。つまり全く知らなすぎると知的好奇心が沸かないということです。

例えば、野球観戦に行った時に野球のルールも選手の名前も応援の仕方も全く知らなかったら好奇心を持って観戦するのは不可能です。

最低限、ルールや応援の仕方や選手の情報が必要です。

つまり何も対象について知らない状態で興味を持つだけでは不十分なのです。
**最低限の知識を身につけることが重要**です。

#4.好奇心が生まれるPython学習#

好奇心を生むために有効と思われるのが、Turtle Graphics(タートル　グラフィックス)です。

タートルグラフィックスの利点は３つあります。
①アニメーションが使えるので興味を引くことができる(拡散的好奇心を喚起する)

②教えるべき最低限の予備知識の量が少ない。

③予備知識を教えたらあとは自力で絵を書いて探求することができる。(知的好奇心を発揮する)


そういう設計思想で作ったturtleの学習法は下のURLに載せています。もしよかったら活用して見てください！

https://qiita.com/kaito_takahashi/items/f6efd7c3925a4afce497
Kibanaを日本語化

# はじめに

Kibana 6.7から国際化の機能が入って、まず最初に中国語での表示ができるようになりました。
じゃ日本語化は？というと、7.1まで待たなきゃいけないそうです X-<

機構は入っているんですし、マルチバイトもOKなはずです！
なきゃ、自分で何とかすればいいんです！
-> 7.2以上で日本語リソースが[追加](https://github.com/elastic/kibana/commit/66bb463e5cfebafae0eb15eaa863e0417095674e)されました！

# 日本語化への道
## どうやって表示する？

どうやって国際化するかといえば、設定`i18n.locale`にロケールを設定するのと、`x-pack/plugins/translations/translations`に日本語メッセージのファイルを置くだけです。
設定は良いとして、日本語メッセージのファイルはどう作れば良いんでしょうか・・・

## 日本語メッセージファイルの作成

まずは中国語のメッセージファイルを確認します。
https://github.com/elastic/kibana/blob/master/x-pack/plugins/translations/translations/zh-CN.json
にあるファイルを見ると、こんな感じになっています。

```json:zh-CN.json
{
  (snip)
  "messages": {
    "common.ui.aggResponse.allDocsTitle": "所有文档",
    (snip)
  }
}
```
`messages`にメッセージのキーと翻訳されたメッセージの組がだーっと記載されています。
ですが、デフォルトのメッセージは、
https://github.com/elastic/kibana/blob/master/src/legacy/ui/public/agg_response/point_series/_fake_x_aspect.js#L22-L32
にあるように、コード中に埋め込まれています。

```js:_fake_x_aspect.js
export function makeFakeXAspect() {
  return {
    accessor: -1,
    title: i18n.translate('common.ui.aggResponse.allDocsTitle', {
      defaultMessage: 'All docs'
    }),
    params: {
      defaultValue: '_all',
    },
    format: {}
  };
}
```

Javaのロケールごとのリソースのように、`en`リソースのメッセージが切り出されてればいいんですけど、そんなこともなさそうです。
仕方ないので、泥臭く`zh-CN.json`からキーを抜き出して、コード中からキーを検索して取り出したメッセージから、元となるファイルを作ります。
＃やり方はいろいろあるでしょうし、そのうち正式版が出るでしょうから、ここでは特にやり方は書きません。
＃メッセージは、1行に収まっているものもあれば複数行で`+`つかって結合されていたり、ダブルクォートでくくってたり、シングルクォートだったり、バッククォートだったり、途中にクォート入ってたり・・・もうね、正規表現考えるのが面倒で機械的にやるのが面倒。

## 出来上がったロケールファイルを組み込む

と、ここまでは6.7をベースにやってたんですが、7.0が出ちゃったので途中から7.0用に変更して[つくり](https://github.com/tak7iji/kibana/blob/i18n-ja/x-pack/plugins/translations/translations/ja-JP.json)ました。
というのはさて置き・・・

ファイルを組み込んでみます。

### RPMの場合

RPMでインストールしている場合は、`/usr/share/kibana/node_modules/x-pack/plugins/translations/translations`に出来上がったファイルを配置します。
ファイルは、まぁ、`ja-JP.json`とでもしておきます（てか、これしかないか・・・）。
そして、`/etc/kibana/kibana.yml`に`i18n.locale: "ja-JP"`を設定して起動します。

### Dockerの場合

docker-composeで起動しているのであれば、`docker-compose.yml`に以下のような設定を追加します。
8.0の場合は、マウントパスが`/usr/share/kibana/x-pack/plugins/translations/translations/ja-JP.json`となるようです。

```yaml:docker-compose.yml
service:
  (snip)
  kibana:
    (snip)
    environment:
      - I18N_LOCALE="ja-JP"
    volumes:
      - /path/to/ja-JP.json:/usr/share/kibana/node_modules/x-pack/plugins/translations/translations/ja-JP.json
    (snip)
```

## 起動確認

起動してみます。

ホーム画面はこんな感じ。

![Screenshot_2019-04-12 Kibana.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221612/31fb685b-5f06-8c07-d5e9-0f800a8d1c6e.png)

ビジュアライズの作成画面とか、

![Screenshot_2019-04-12 Kibana(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221612/c19b3e2f-e5a2-1e87-636f-c5e572f6a08e.png)

インデックスの管理画面とか。

![Screenshot_2019-04-12 Kibana(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221612/da5ec96b-5eaa-174a-8ac3-bc417118fca0.png)

翻訳自体はGoogle翻訳してから、変な翻訳を修正（msをミズとか、max/minのminが分になっちゃったりとか、いらんとこ翻訳してくれやがるので面倒・・・）しているので、まだまだおかしなところがあるかもしれないけど、ま、自分で見る分にはなんとかできているようです。

# 最後に

さっくり表示できるので、とっとと本家でも出してほしいなぁ・・・
多対多の関連付け

## 背景

自分は現在院生2回生で, 4回生のころから京都のゲーム・Web会社で働いている. 今も細々と続けている中で, Ruby on Railsに触れる機会があったのでその知見を貯めておく.

今回は多対多の関連付けと, その使い方を紹介する.

## データ構造

このアプリケーションには, `user`と`group`の定義があって, `user`は複数の`group`に所属することができて, `group`は複数の`user`を持つ. よって中間テーブルを用いて多対多の関連付けを定義する.

```ruby:schema.rb
ActiveRecord::Schema.define(version: 20_190_219_052_352) do
  create_table "group_users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.bigint "user_id", null: false
    t.bigint "group_id", null: false
    t.index ["group_id"], name: "index_group_users_on_group_id"
    t.index %w[user_id group_id], name: "index_group_users_on_user_id_and_group_id"
    t.index ["user_id"], name: "index_group_users_on_user_id"
  end

  create_table "groups", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "name", null: false
    t.integer "status", default: 1, null: false
  end

  create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "name", null: false
  end
end  
```

テーブル名を`group_users`にして中間テーブルを作る. このテーブルをもとに`group`から`user`, `user`から`group`を参照する. ここでindexが3つ貼られているが, 以下のようにして簡単に貼ることができる.

```ruby:create_group_users.rb
class CreateGroupUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :group_users do |t|
      t.references :user, null: false, foreign_key: true
      t.references :group, null: false, foreign_key: true

      t.timestamps
    end

    add_index :group_users, %i[user_id group_id]
  end
end
```

## 関連付け

以下がそれぞれのモデルである.

```ruby:group_user.rb
class GroupUser < ApplicationRecord
  validates :user_id,   presence: true
  validates :group_id,  presence: true

  belongs_to :user
  belongs_to :group
end
```

1行の`group_user`が1行の`user`と1行の`group`に対応しているので, `belongs_to`で関連づける.

```ruby:user.rb
class User < ApplicationRecord
  has_many :group_users, dependent: :nullify
  has_many :groups, through: :group_users
end
```

```ruby:group.rb
class Group < ApplicationRecord
  has_many :group_users, dependent: :nullify
  has_many :users, through: :group_users

  def shape_response
    { id: id, name: name }
  end
end
```

1行が複数の`group`, 複数の`user`と対応しているので`has_many`. `through`で中間テーブルを利用する.

## 処理の書き方

自分が属するグループ全てを返す処理を以下に書く.

```ruby:groups_controller.rb
def index
  groups = current_user.groups
  ok("groups": groups.map(&:shape_response))
end
```

`current_user`は自分の`user`データを返す. それに`.groups`と書くだけで自分と紐づくグループが取ってこれる.

ここで, `groups`のカラムである`status`のみを除いたものを返したい場合は, 上記のように書ける. これは

```ruby
# 冗長に書いた場合
ok("groups": groups.map { |group|
  group.shape_response
})
```
を省略して記述した場合である. モデルでメソッドを定義しておくとこんなに綺麗に書ける。

## 感想

関連付けを正確に行うことによって, めちゃめちゃ綺麗に書けるのがrailsの良さだと思った.
【PBCS】ビジネス・ルール：値代入時の注意点

## ビジネス・ルールでの値代入の方法

### ①DATACOPYコマンドの使用
**【特徴】**
・代入元→代入先への直接代入に有効
・代入先がブロックが生成されていない（使用されていない）交点の場合
　自動的にブロック生成されて値が代入される

**【コマンド例】**

```
/* 予算から実績に値を一括コピー */
DATACOPY Budget TO Actual;
```

### ②式による代入

**【特徴】**
・代入元→代入先に代入する際に任意の計算を含む際に有効
・代入先がブロックが生成されていない（使用されていない）交点の場合
　ブロックは**自動生成されない**

**【コマンド例】**

```
/* 予算から実績に値を一括コピー(その際予算の2割掛けを行う) */
Actual = Budget * 1.2;
```


## 式代入時のブロック生成

式での代入時には、ブロックがない交点に自動生成されることがないため
明示的にブロックを生成する必要がある
（ビジネス・ルールのジョブは成功するが、
生成されていない交点に値は入らない）

試行錯誤したところ、以下の条件でブロック生成と値の代入が出来た

>①ブロックが１つも生成されていないメンバーはFIXに含めず、式にてメンバー指定すること
>②式の右辺で掛け計算を行うこと


**【例】**
以下のような次元構成の時に、4月の売上予算の3割増しの金額を同月の売上実績に代入したい場合

| 次元名       |       メンバー |
|:-----------------|------------------:|
| Years(年度)             |              FY19(2019年) |
| Entity(組織)           |            Osaka(大阪支社) |
| Version(バージョン)             |              Working(作業用) |
| Account(勘定科目)             |              Sales(売上) |
| Period(月)             |              April(4月) |
| Scenario(シナリオ)             |              Budget、Actual(予算、実績) |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/0dc50a01-3119-ec72-3d49-1b059ec2e468.png)

```

/* ↓ブロックが生成されている次元のみをFIXに含める */
FIX ("FY19"
,"Osaka"
,"Working"
,"April"
)

  /* 式の右辺で掛け計算を行う(直接代入のときは*1にする) */
    "Sales"(
        IF (@ISMBR("Budget"))
        "Actual"="Budget"->"Sales" *1.3;
        ENDIF
    )

ENDFIX
```

**【実行結果】**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/9d0c6b9e-187e-02ba-b34b-dace8bde8f2a.png)
学んだこと(Web アプリでの未処理例外ハンドル）

- Web アプリでの未処理例外ハンドルの方法  
https://www.c-sharpcorner.com/article/exception-handling-in-asp-net-web-api/ を参考に
    - コントローラ処理の未処理例外にはExceptionFilterを使用する。
        1. ExceptionFilterAttribute の派生クラスを作成する。
        1. 作成した派生クラスを使用するよう、Configurationに登録する
    - ExceptionFilterでキャッチできない例外にはExceptionHandlerを使用する。
        1. ExceptionHandler の派生クラスを作成する。
        1. 作成した派生クラスを使用するよう、Configurationに登録する

- サンプル

```c#
public class CustomExceptionFilter : ExceptionFilterAttribute
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        string exceptionMessage = string.Empty;
        if (actionExecutedContext.Exception.InnerException == null)
        {
            exceptionMessage = actionExecutedContext.Exception.Message;
        }
        else
        {
            exceptionMessage = actionExecutedContext.Exception.InnerException.Message;
        }

        // Logging(exceptionMessage);
    }
}

public class CustomExceptionHandler: ExceptionHandler  
{
    public async override Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
    {
        // Logging(context.Exception);
    }
}

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        // 例外ハンドラの登録
        GlobalConfiguration.Configuration.Filters.Add(new CustomExceptionFilter());
        GlobalConfiguration.Configuration.Services.Replace(typeof(IExceptionHandler), new CustomExceptionHandler());
    }
}
```
CODE COMPLETE (上) -第1部 基礎を固める ③-

自分の理解を深めるために投稿します。
## 第3章：2回測って、1度で切る：上流工程の必要性

### 準備の必要性
#### 時間がかかると思っても、コンストラクションの準備は大切！
- 準備をきちんとしたほうがコンストラクションが上手くいく
- 欠陥は早い段階で見つかったほうが修正しやすい

技術者の仕事の1つは、**プログラミング前の入念な準備の必要性を、上司や同僚に教育すること**である

でもどうやって？
1. **論理的に訴える**
  [例] 準備を怠った結果、**見当はずれのものや無駄なものを作ると結局コストがかかる**
2. **たとえで訴える**
  [例] 家を建てるときに、**設計書なし**に釘を打ち始めると**失敗する**
3. **データで訴える**
  [例] **欠陥が紛れ込んでから発見されるまでの時間が長くなればなるほど、修正コストは跳ね上がる**

いろいろな方法が取れるはず

***

### 反復型、逐次型手法の選択
反復型：アジャイル、スクラム
逐次型：ウォーターフォール

#### 反復型がオススメなプロジェクト
- 要求が十分に理解されていない
- 要求が変化しやすい
- 設計が複雑、手間がかかる
- 開発チームがそのアプリケーション分野をよく知らない
- プロジェクトのリスクが高い
- 長期的な予測が重要でない
- 要求、設計、コードを下流で変更しても安価な可能性がある

#### 逐次型がオススメなプロジェクト
- 要求がかなり安定している
- 設計が比較的簡単で、かなり理解されている
- 開発チームがそのアプリケーション分野に精通している
- プロジェクトのリスクが低い
- 長期的な予測が重要である
- 要求、設計、コードを下流で変更すると、高くつく可能性がある

***

### 準備を無駄にしないために
#### 課題定義

- 課題定義では、**ソリューションに言及しないこと**
- 課題定義は**ユーザーの言葉・立場**で語ること
- 課題定義が不十分だと、見当外れの課題に取り組むことになってしまう
- 時間も無駄になり、課題も解決されない羽目に陥る

#### 要求
要求が明確であることが最重要かもしれないレベル

- 議論が減る
- ユーザーが求めているものが分かる
- 後からエラーが発見された場合のコストを避けられる

しかし**要求は不変ではない**ので…

- 要求のチェックリストを使って、要求の品質を評価する(これは本読んで！)
- 要求変更に伴うリスクを全員で認識
- 変更管理手順を決める
- **変更に対応できる開発手法**を使用
  - スクラム、アジャイル
- ひどすぎたらプロジェクト中止も考える
- プロジェクトのビジネス上の価値を忘れない
  - アジャイルのインセプションデッキ「我々はなぜここにいるのか」

#### アーキテクチャ
- 優れたアーキテクチャは**コンストラクションを容易にす**る
- アーキテクチャの**変更はコストがかかる**
- アーキテクチャの**目的を明確に**する
  - いつもそうしているから、は危険!
  
- アーキテクチャは**過不足ない状態に**する
  - 1つの部分に必要以上にこだわらない

一般に次のものについて考えておく

- プログラムの構成
- 主要なクラス
- データ設計
- 業務ルール
- ユーザーインターフェイスの設計
- リソース管理
- セキュリティ
- パフォーマンス
- スケーラビリティ
- 相互運用性
- 国際化と地域化
- 入出力
- エラー処理
- フォールトトレランス
- アーキテクチャの実現可能性
- オーバーエンジニアリング
- 購入or構築
- 再利用の決断
- 変更方針
- アーキテクチャの全体的な品質
[Android]WebViewClientでアンカーリンクのタップをフックする

# WebViewClientでアンカーリンクのタップをフックする

あまりないケースだと思いますが、AndroidのWebViewでWeb画面上のアンカーリンク （ページ内リンク）のタップをフックして、そのタイミングでアプリ側で何か動作させたい時の備忘録です。

**例： WebViewをScrollViewに含めるとアンカーリンクが効かなくなるので、アンカーリンクのタップをアプリ側でフックして、ScrollViewをスクロールさせたい**

WebViewとネイティブのViewを一緒にスクロールさせたい時に上のような実装にすることがあります

### ハマった点： WebViewClientのshouldOverrideUrlLoadingはページ内リンクのタップでは呼ばれない

最初はWebViewClientのshouldOverrideUrlLoadingでUrl見てページ内リンクだった時にどうこうすればいいじゃん！って思ってたんですが、shouldOverrideUrlLoadingは同一ページ内のリンクの場合呼ばれないんですね...

### 解決： WebViewClientのonPageFinishedなら呼ばれる

ページ内リンクのタップ時にshouldOverrideUrlLoadingは呼ばれませんがonPageFinishedが呼ばれます。
引数でUrlも取れるので、ここでどうこうしてあげれば大丈夫です。
例えばページ内リンクが以下のような感じだとします。

```html
<a href="#top">一番上に戻る</a> 
```

WebViewClientを使って以下のように記述すればOKです

```java
 webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                if(url.contains("#top")) {
                    /** ここにしたいことを書く **/
                }
            }
        });
```

以上です。
Google 検索で、キーワードを無視して欲しくないとき

皆さん、Google 検索、使ってますね？

最近の Google 検索は、複数のキーワードを指定しても、そのうちいくつかを無視して検索されることが非常に多くなり、困っていました。

# 「草」を検索したい

たとえば、ネットのスラングで「草」というのがありますが、ぼくは「草」と言えば戦国大名の北条氏を思い出します。検索してみましょう。

<img width="956" alt="スクリーンショット 2019-04-12 10.31.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/8cf88421-7ec2-51ee-c633-af941d0ae3ca.png">

はい、「草」が見事に無視されてて草。


# 「草」を無視するな！

「草」を無視させないためには、「ツール」→「すべての結果」→「完全一致」を選択します。

<img width="956" alt="スクリーンショット 2019-04-12 10.32.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/a79f8b1f-164d-f786-9e9c-0fc43fb85794.png">

「草」を無視しない検索に変わりました。

<img width="956" alt="スクリーンショット 2019-04-12 10.33.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/ddc78bfe-ba25-a32c-9313-4664210b7a86.png">

「草」の活躍、というのが見つかりましたね。

<img width="956" alt="スクリーンショット 2019-04-12 10.36.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/4e6bb0be-6a9b-938c-aa79-28611225042d.png">

こんな簡単に解決できたなんてマジ草生えるwww
ABC - 109- A&B&C

#AtCoder ABC 109 A&B&C
[AtCoder - 109](https://atcoder.jp/contests/abc109)

#A問題

 - Cについて、$1-3$まで全部調べる

```java
	private void solveA() {
		Scanner scanner = null;
		int numA = 0;
		int numB = 0;

		try {
			scanner = new Scanner(System.in);
			numA = scanner.nextInt();
			numB = scanner.nextInt();
			for (int i = 1; i < 4; i++) {
				if (numA * numB * i % 2 != 0) {
					System.out.println("Yes");
					return;
				}
			}

			System.out.println("No");

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

 - 文字$W_i$が既に発言されている文字ならNG
 - 文字$W_i$の先頭一文字が、文字$W_{i-1}$の最後一文字と違うならNG

```java
	private void solveB() {
		Scanner scanner = null;
		int numN = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();
			String[] wk = new String[numN];

			Set<String> wkSet = new HashSet<String>();
			for (int i = 0; i < wk.length; i++) {
				String wkI = scanner.next();
				wk[i] = wkI;
				if (wkSet.contains(wk[i])) {
					System.out.println("No");
					return;
				}
				wkSet.add(wk[i]);
				if (i != 0) {
					String wkIm1 = wk[i - 1];
					if (wkIm1.charAt(wkIm1.length() - 1) != wkI.charAt(0)) {
						System.out.println("No");
						return;
					}

				}
			}

			System.out.println("Yes");

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#C問題

 - 都市間を移動する
    - 初期座標は
    - 移動可能な距離は、$y+D \; || \; y-D$ 
    - $\pm \; D$ をして全ての都市を訪れる
    - 初期座標$X$がスタート位置

 - {$初期座標,\; x_1,\; x_2,\; x_3,\; x_4.......,\; x_5$} という配列を作成し、ソートする
 - 全ての座標を訪れるには`全ての座標間の差分の最大公約数`がわかればよい
    - 最大公約数を求めた結果、$D=1$という可能性もありますが。。。

```java
	private void solveC() {
		Scanner scanner = null;
		int numN = 0;
		int numX = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();
			numX = scanner.nextInt();
			long[] wk = new long[numN + 1];

			wk[0] = numX;
			for (int i = 1; i < wk.length; i++) {
				wk[i] = scanner.nextInt();
			}

			Arrays.sort(wk);
			long[] wkSa = new long[numN];
			for (int i = 0; i < wk.length; i++) {
				if (i != 0) {
					wkSa[i - 1] = wk[i] - wk[i - 1];
				}
			}

			System.out.println(maxKouyakusu(wkSa));

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}

	private long maxKouyakusu(long[] wk) {

		long res = 0;
		for (int i = 0; i < wk.length; i++) {
			if (i == 0) {
				res = wk[i];
				continue;
			}
			res = maxKouyakusu(res, wk[i]);
		}
		return res;

	}

	private long maxKouyakusu(long i1, long i2) {

		long w1 = Math.min(i1, i2);
		long w2 = Math.max(i1, i2);

		while (w2 > 0) {
			long temp = w1 % w2;
			w1 = w2;
			w2 = temp;
		}

		return w1;

	}
```
#Mac で アプリケーションを問わずに現在のカーソル位置にある1行のテキストを削除するショートカット ( Control + A -> K )

- 先頭に移動する Control + A 
- 行末まで削除する Control + K

を組み合わせて使う。これを手癖にしていったら良さそう。

ずっと「一発で全部削除するショートカットなんだよ！」とうっすら思っていたけれども。あ、知ってる人いたら教えてください。

# だいたいどこでも使えるよ

- コンソール
- Google Chrome のフォーム入力中 / アドレスバー入力中
- Sublimetext などのエディタ

などなど。アプリケーションのショートカットと干渉さえしなければ。

# Ref

[Mac keyboard shortcuts - Apple Podpora](https://support.apple.com/sl-si/HT201236)

![image](https://user-images.githubusercontent.com/13635059/55998696-59d19e80-5cfa-11e9-87ef-f35088df187b.png)

[テキスト入力が死ぬほどはかどるMacショートカットキー15個 | Find Job! Startup](https://www.find-job.net/startup/mac-shortcut)

![image](https://user-images.githubusercontent.com/13635059/55998776-ac12bf80-5cfa-11e9-8a32-fe37d5945ea6.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
CakePHP Debugキットのアイコン表示がおかしくなる

## 画面右下に出てくるCakePHPのDebugキットの表示がおかしくなった
↓正しい表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394995/381c6715-78de-7ea3-67e7-7b20ed55730b.png)

表示がおかしかった際の画像は撮り忘れていたので無いのですが、アイコンの部分に上下左右のスクロールバーが表示されており、Debugキットを使うことができませんでした。


## 対応
`アプリケーションフォルダ\tmp\cache` フォルダ内のファイル、フォルダをすべて削除したら解消しました。

## 考察
キャッシュファイルが残っていたのが原因らしい。
キャッシュとかログファイルの肥大化とか、対策を講じる必要があると思う。


## 追記
- キャッシュの削除はコマンドを使うのが正しい操作みたい。
- キャッシュの生存期間については `config\app.php`ファイル内の設定を変更すれば良いらしい。
- ログ設定も`config\app.php`ファイルを以下のように追記すれば良さそう

```php:app.php
    /**
     * Configures logging options
     */
    'Log' => [
        'debug' => [
            'className' => 'Cake\Log\Engine\FileLog',
            'path' => LOGS,
            'file' => 'debug',
            'url' => env('LOG_DEBUG_URL', null),
            'scopes' => false,
            'levels' => ['notice', 'info', 'debug'],
			'size' => '100KB', // ←コレ
			'rotate' => 10, // ←コレ
        ],
        'error' => [
            'className' => 'Cake\Log\Engine\FileLog',
            'path' => LOGS,
            'file' => 'error',
            'url' => env('LOG_ERROR_URL', null),
            'scopes' => false,
            'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
			'size' => '100KB', // ←コレ
			'rotate' => 10, // ←コレ
        ],
        // To enable this dedicated query log, you need set your datasource's log flag to true
        'queries' => [
            'className' => 'Cake\Log\Engine\FileLog',
            'path' => LOGS,
            'file' => 'queries',
            'url' => env('LOG_QUERIES_URL', null),
            'scopes' => ['queriesLog'],
			'size' => '100KB', // ←コレ
			'rotate' => 10, // ←コレ
        ],
    ],
```

`rotate`は、保持するファイル数。上記設定であれば、「ログファイルのサイズが100KBになるとファイルを分けて、ファイル数が10を超えると古いものは削除する」ということになる。ハズ。

[CakePHP3.7 キャッシュ](https://book.cakephp.org/3.0/ja/core-libraries/caching.html)
[CakePHP3.7 ロギング](https://book.cakephp.org/3.0/ja/core-libraries/logging.html#writing-to-logs)
create nuxt-app で bulma を選択した際にfont-awesomeが使えずに困った

``create nuxt-app`` 便利ですよね。

それを使って、 [Bulma](https://bulma.io/) ベースのNuxt.jsなAppを作ろうとした際にFont Awesomeが使えずに困ったのでメモ。

## 最初にやったこと

- [Nuxt.jsのインストール](https://ja.nuxtjs.org/guide/installation) の通りに進めて、CSS FrameworkはBulmaを選択
- ``yarn add @nuxtjs/font-awesome`` する
- ``nuxt.config.js`` にそれを足す

```javascript
modules: [
    // Doc: https://axios.nuxtjs.org/usage
    '@nuxtjs/axios',
    // Doc:https://github.com/nuxt-community/modules/tree/master/packages/bulma
    '@nuxtjs/bulma',
    '@nuxtjs/pwa',
    '@nuxtjs/font-awesome', <-- ここを足す
  ],
```
- なのに、vueなファイルで、

```html
<span class="icon">
  <i class="fas fa-desktop"></i>
</span>
```
とかしても、アイコンが出ない。四角枠打鍵表示されるので露骨にCSS問題っぽい。

一方で、 ``node_modules/@nuxtjs/font-awesome`` の ``index.js`` とかみても、ちゃんとCSS PUSHしてくれているっぽいので、何がおかしいんだかさっぱり・・・という状態になった。


## で、どうしたか

``fort-awesome`` 入れた。 fo ``r`` t-awesome らしい。

- まず、これを消す

```javascript
modules: [
    // Doc: https://axios.nuxtjs.org/usage
    '@nuxtjs/axios',
    // Doc:https://github.com/nuxt-community/modules/tree/master/packages/bulma
    '@nuxtjs/bulma',
    '@nuxtjs/pwa',
    // '@nuxtjs/font-awesome', <-- ここを消す。というか戻す。
  ],
```

- ``yarn add @fortawesome/fontawesome-free`` する
- ``nuxt.config.js`` に以下を足す

```javascript
  css: ['@fortawesome/fontawesome-free/css/all.css'],
```

これで表示された。まぁ逃げですね。

何がおかしかったのかがよくわからないので、ちょっと時間ができたらちゃんと調べてみたいと思います。

まずちょっと画面のイメージを固めたいので、それが終わったら後学のためにもちゃんとやろう。
#jq コマンドで #JSON の ネストされた配列の中のオブジェクトの中の配列からちょっと複雑な検索をする  ( select filter )

- Github Issue API で得られるようなリストを想定
- JSON全体が配列である
- 配列内の各要素の labels 配列が複数のオブジェクトを持っている
- オブジェクトの name が特定の value を持っている要素だけを select したい
- 元の配列、オブジェクト構造を崩さずに復元したい

# JSON input ( eg.json )

```json
[
  {
    "labels": [
      {
        "name": "feature"
      }
    ]
  },
  {
    "labels": [
      {
        "name": "bug"
      },
      {
        "name": "important"
      }
    ]
  },
  {
    "labels": [
      {
        "name": "fix"
      },
      {
        "name": "important"
      }
    ]
  }
]
```


# filter pattern 1

```
$ cat tmp/eg.json | jq '[.[] | select(.labels[] | .name == "fix")]'
```

```json
[
  {
    "labels": [
      {
        "name": "fix"
      },
      {
        "name": "important"
      }
    ]
  }
]
```


# filter pattern 2

```
$ cat tmp/eg.json | jq '[.[] | select(.labels[] | .name == "important")]'
```

```json
[
  {
    "labels": [
      {
        "name": "bug"
      },
      {
        "name": "important"
      }
    ]
  },
  {
    "labels": [
      {
        "name": "fix"
      },
      {
        "name": "important"
      }
    ]
  }
]

```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PowerShellで環境変数を再読込する

環境変数、主にPATHを追加、更新したときにOSを再起動せずにコマンドを使用したいときなんかに便利です

```posh
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
```

処理としてはシステム環境設定とユーザー環境変数を取得してくっつけて代入するだけですね
ラズパイにdocker-composeをインストールしたdocker初心者の話

```
$ uname -a
Linux raspberrypi02 4.19.34-v7+ #1211 SMP Mon Apr 8 22:56:37 BST 2019 armv7l GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.8 (stretch)
Release:	9.8
Codename:	stretch
```
故あってインストールしたばかりの上記のようなラズパイでdockerをいろいろ試そうとしたところ、試したいことには docker-compose が必要らしいと分かり俄かにいろいろ漁る。

[Raspberry Pi用docker-composeの構築](https://qiita.com/tkyonezu/items/ceaaf41924df39254058)

なんかを参考に試してみたが、次のようなエラーが出力されて記事通りの成果が得られない。上記参考記事の内容と類似する記事は他所でも見られるので、当方でうまくいかないのはおま環と思われる。

```
$ ./docker-compose-Linux-armv7l -v
Traceback (most recent call last):
  File "docker-compose", line 5, in <module>
  File "/code/.tox/py37/lib/python3.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 627, in exec_module
  File "compose/cli/main.py", line 13, in <module>
ModuleNotFoundError: No module named 'distutils'
[15618] Failed to execute script docker-compose
```
あちこちうろついて思考停止した目に留まった以下の記事を参考に、
[docker-composeのエラー](https://qiita.com/uma8/items/55a71d788f7a2c6be253)

脳死状態で次のコマンドを実行。

```
sudo pip install -I docker-compose
```
バージョン確認。動いているっぽい。

```
$ docker-compose -v
docker-compose version 1.24.0, build 0aa5906
```
以下の内容を試して動作を確認。
[docker+Node.js(Express)の最小構成プロジェクトを作成する](https://qiita.com/ryo-ohnishi/items/b54e649b14b51694ef77)

リンク先の各位に感謝を。