OmniAICreator/Qiita-1.07M huggingface dataset:
プロジェクトマネジメント/プロジェクト管理まとめエントリー

ジャーニーマン( @beajourneyman )です。

これまで、プロジェクトマネジメントのエントリーを何本か書いて来たので、閲覧しやすいようまとめエントリーを残します。ナレッジを読み直したり、ノウハウを確認したりする時に楽にたどり着くためのまとめです。各エントリーの概要を添えて、まとめます。

# エントリーを書いて来た背景
まとめを作成する前に、これまで書いてきた方向性ときっかけを簡単にご説明します。エントリーを書き始めたきかっけは2017年のアドベントカレンダーです。 [#JBUG という Backlog のユーザーグループ](https://jbug.connpass.com/) で登壇したコトを契機に、アドベントカレンダーに参加し初のプロジェクトマネジメントの記事を書きました。2018年も同様にアドベントカレンダーに参加、以降何本かのエントリーを残しています。各エントリーとも見出しにリンクしています。ではご紹介します。

# 1. [プロジェクトマネジメントで大事にしている"文化"について](https://qiita.com/beajourneyman/items/a80cf874dcd9317d3dfb)
2017年12月執筆。プロジェクトマネジメントで大事にしている"文化"について、プロジェクトがもつ人格やリーダーの振る舞いを紐解きながら執筆。文化の先に習慣になるステージがあり、どう実現して行くのか考えを述べています。自分のエントリーの中で多少はてブもついた数少ないヒット作です。

# 2. [プロジェクトで大事な"メジャメント"について](https://qiita.com/beajourneyman/items/e4053c40be91c64f9f59)
2018年12月執筆。"文化"について呼応するエントリーです。プロジェクトのゴールを見据え、実際の成果、アウトカムを出すコト、そしてその成果を計測可能なモノとして定義し可視化するコトの意義を書いています。ステークホルダーとの真の合意形成ができている状態はプロジェクトの自由への近道です。

# 3. [新しいことに取り組む時に大事な"たった2つ"のコトとは？](https://note.mu/beajourneyman/n/n07b2bff4bbce)
2019年01月執筆。こちらはnoteのエントリーでチームの在り方をテーマにしました。新しい技術やビジネス的な価値が注目を集めると、トップダウンで取り組む命が下るコトが多いと思います。成功のポイントは何でしょうか？　とあるチームの歩みを通して突破口になる考え方があると感じ、まとめています。

# 4. [PMPを更新しよう 〜知識編〜](https://qiita.com/beajourneyman/items/6ab3ad2d46c181629f45)
2019年05月執筆。PMPの更新が近付いて来た時期だったので、PMP資格更新の取り組みをエントリーにしてます。前回の更新から今回の更新に掛けて更新プログラムが新しくなっていたので調べてコトを知識編としてまとめています。普段のコミュニティ活動やブログ執筆が対象になるという発見がありました。

# 5. [PMPを更新しよう 〜ブログ執筆と #JBUG 勉強会開催報告編〜](https://qiita.com/beajourneyman/items/da7a6c6961fa86b61065)
同じく2019年05月執筆。知識編の後編にあたる実際にPDU報告した内容や、どんな点に気を付けたのかをまとめています。ポピュラーな実務と非公式の勉強会、ブログコンテンツ作成の3本立てになっています。更新システム(CCRS)の解説と報告が承認されるまでの一連の流れが分かる内容になっています。

# 最後に…
以上、全5本のご紹介です。エントリーを公開した結果、特に反響が大きかったのは以下の2本です。文化については公開から1年半ほど経過していますが、引き続き読んでいただけているようでView数、いいね数とも累積が多いです。新しいこと〜は、公開4ヶ月になりましたが、「新しいこと 大事」という検索ワードで1位になっており、ニッチなテーマですが、見付けていただき易くなっているようです。

* **[プロジェクトマネジメントで大事にしている"文化"について](https://qiita.com/beajourneyman/items/a80cf874dcd9317d3dfb)**
* **[新しいことに取り組む時に大事な"たった2つ"のコトとは？](https://note.mu/beajourneyman/n/n07b2bff4bbce)**

今回初のまとめを作成しました。多少なりとも各エントリー本文を読んでいただくきっかけになったでしょうか？　キャリアの多くでプロジェクトマネジメントに携わって来たので、これからもエントリーを書いて行こうと思います。最後までご覧いただきありがとうございます。
CoreOS Container LinuxのTimezoneを変更したい

# CoreOS Container LinuxのEOLが発表されました(2020/02/20追記)

情報の一部

2020/05/26に最終アップデートの公開が開始されます。
その日以降に発見されたバグやセキュリティ脆弱性は修正されません。

2020/09/01以降、CoreOS Container Linuxに関連する公開リソースは削除されるか、読み取り専用になります。 OSダウンロードは削除され、CoreUpdateサーバーはシャットダウンされ、OSイメージはAWS、Azure、Google Compute Engineから削除されます。

全ての内容は以下のサイトをご参照ください
[End-of-life announcement for CoreOS Container Linux](https://coreos.com/os/eol/)

# 設定

AWS EC2
CoreOS Container Linux stable 2023.4.0 (HVM)

```
$ timedatectl

               Local time: Tue 2019-05-28 18:01:32 UTC
           Universal time: Tue 2019-05-28 18:01:32 UTC
                 RTC time: Tue 2019-05-28 18:01:32
                Time zone: UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl status

               Local time: Wed 2019-05-29 03:03:01 JST
           Universal time: Tue 2019-05-28 18:03:01 UTC
                 RTC time: Tue 2019-05-28 18:03:01
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

```

[Configuring date and time zone](https://coreos.com/os/docs/latest/configuring-date-and-timezone.html)
CoreOS Container Linuxでdocker-composeを使いたい

# CoreOS Container LinuxのEOLが発表されました(2020/02/20追記)

情報の一部

2020/05/26に最終アップデートの公開が開始されます。
その日以降に発見されたバグやセキュリティ脆弱性は修正されません。

2020/09/01以降、CoreOS Container Linuxに関連する公開リソースは削除されるか、読み取り専用になります。 OSダウンロードは削除され、CoreUpdateサーバーはシャットダウンされ、OSイメージはAWS、Azure、Google Compute Engineから削除されます。

全ての内容は以下のサイトをご参照ください
[End-of-life announcement for CoreOS Container Linux](https://coreos.com/os/eol/)

# 設定

AWS EC2
CoreOS Container Linux stable 2023.4.0 (HVM)

```
# CoreOSでは/usr以下は読み込み専用なので/opt/binを使用
$ sudo mkdir -p /opt/bin
$ sudo curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` -o /opt/bin/docker-compose
$ sudo chmod +x /opt/bin/docker-compose
$ docker-compose -v

docker-compose version 1.24.0, build 0aa59064
```
CSSである要素の上下左右に表示されるように要素を配置したい

HTMLとCSSで狙った位置に要素を配置するのにいつも数時間は悩む初心者です。

あるコンテンツの上もしくは下もしくは左もしくは右に表示されるように要素を配置したい。（tooltipとかballoonとかdropdownなリストを表示したい）

この時に以下も考慮しておきます。

- コンテンツに被らないように配慮したい（他のコンテンツには被っても良い）
- 上下に配置するとき横幅はコンテンツの長さに合わせたい
- 左右に配置するときはコンテンツの上か下に沿わせたい

Demo: https://jsfiddle.net/nL0brfht/2/

こんなふうに見えます。一応Firefox,Chrome,IE(Edgeではない)で大体同じ見え方をすることを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/4eac86ed-0859-3cb8-aee4-515bfb4cf037.png)

やったことは単純でこんな感じです。

- 1個wrapper要素で包み、`position: relative`を与える
- 上下左右に配置する要素はwrapper内に配置。`position: absolute`を与えることで、wrapper要素の位置を基準に配置できるようにする
    - 後はtop,left,right,bottomを使っていい感じに調整する

細かい考慮点を満たすメモです。

- コンテンツに被らないように配慮したい（他のコンテンツは被っても良い）
    - コンテンツの上に沿わせたい場合は、`bottom: 100%`
        - (100%はコンテンツの高さとなり、bottom:100%とすることで上方向に移動します。で、y座標がwrapperのy座標と一致するので、いい感じになるという感じです。他も同じ原理です。)
    - コンテンツの下に沿わせたい場合は、`top: 100%`
    - コンテンツの左に沿わせたい場合は、`right: 100%`
    - コンテンツの右に沿わせたい場合は、`left: 100%`
- 上下に配置するとき横幅はコンテンツの長さに合わせたい
    - `left: 0; right:0;` にします
- 左右に配置するときはコンテンツの上か下に沿わせたい
    - コンテンツの上に沿わせたい場合は、`bottom: 100%`
    - コンテンツの下に沿わせたい場合は、`top: 100%`

欲を言えば、領域に余裕がある方向を動的に決めて出したいですね。


参考: https://www.w3.org/TR/CSS2/visuren.html#comp-abspos
ubuntuで自動ログインを有効にできなかった現象を解決

## 環境について

Ubuntu 18.04.2 LTS

## 現象について

自動ログインを有効にしようとしたところ、以下のスクリーンショットのようにメッセージが表示されました。
![20190318225301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128348/9dcb3189-fff4-2d0c-ecd8-c59cb6a2d7b5.png)

> incorrect permissions on /usr/lib/policykit-1/polkit-agent-helper-1 (needs to be setuid root)

## 解決

`/usr/lib/policykit-1/polkit-agent-helper-1`にスティッキービットが付与されていないため、エラーが発生しているとのこと。 
確認をしてみると確かに付与されていない。

```
$ ls -al /usr/lib/policykit-1/polkit-agent-helper-1
-rwx-xr-x 1 root root 14328  1月 15 22:18 /usr/lib/policykit-1/polkit-agent-helper-1
```

なら、スティッキービットを立ててあげればいいので、以下のようにコマンド実行しました。

```
$ sudo chmod u+s /usr/lib/policykit-1/polkit-agent-helper-1
$ ls -al /usr/lib/policykit-1/polkit-agent-helper-1
-rws-xr-x 1 root root 14328  1月 15 22:18 /usr/lib/policykit-1/polkit-agent-helper-1
```

なぜ、スティッキービットが付与されなかったのか不明ですが、これで問題なく自動ログインを有効にできました。
C言語でファイルの更新日をナノ秒まで表示する方法

※ 2017年の自分の記事を移転しました。

C言語でファイルの更新日時をナノ秒まで表示する方法です。
用途としては、ファイルの定期的な更新確認ですかね。

## 環境について
・Linuxカーネル2.5.48以上
・ファイルシステム　XFS, JFS, Btrfs, ext4
上記以外のファイルシステムは、ナノ秒は0で表示される可能性があります。

## ソース

``` C:nsec_show.c
#include <stdio.h>
#include <sys/stat.h>
#include <errno.h>
#include <time.h>

int main(int argc, char *argv[])
{
    int i;
    struct stat st;
    char date_str[256];

    /* argc check */
    if (argc != 2) {
        printf("USAGE:%s <FILE PATH>\n", argv[0]);
        return 1;
    }

    /* get stat */
    if (stat(argv[1], &st) != 0) {
        printf("%s\n", strerror(errno));
        return 1;
    }

    /* show */
    strftime(date_str, 255, "%Y%m%d%H%I%M%S", localtime(&st.st_mtime));
    printf("%s.%09ld\n",date_str, st.st_mtim.tv_nsec);

    return 0;
}
```

## 動作確認
コンパイル後、実行すると以下のような形で表示されます。

```
$ gcc nsec_show.c  -o nsec_show
$ ./nsec_show ./nsec_show.c
20170305063637.656058532
```

ちなみに、lsコマンドで表示されるナノ秒と一致しています。

```
$ ls ./nsec_show.c --full-time
-rw-rw-r--. 1 miyabi miyabi 581 2017-03-05 06:36:37.656058532 +0900 ./nsec_show.c
```

## 参考文献
[STAT](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/stat.2.html)
[CLOCK_GETRES](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/clock_gettime.2.html)
ジョーカースクリプトでanimタグ使用時に反転状態が反映されないのを解決した話

※ 2016年の自分の記事を移転しました。

## 課題について

ジョーカースクリプトにはデフォルトで反転させる機能はありません。

## 対処方法について

chara_newタグのscale_xにマイナスの値をマイナスにすると反転させられます。

移動スクリプト側ですが、AbstractObject.csのanimPositionメソッドが移動させる処理となっています。

iTweenのScaleToを使って大きさの移動を行っています。
ですが、このままですと、マイナスの状態だった場合に強制的にプラスの値にされてしまいます。（その為、反転がもとに戻るんですね。）

## 改修内容について

``` C#:AbstractObject.cs
	// 向きを実際に合わせる
	int scale_x = (0 < this.rootObject.transform.localScale.x) ? 1 : -1;
	int scale_y = (0 < this.rootObject.transform.localScale.y) ? 1 : -1;

	iTween.ScaleTo(this.rootObject,iTween.Hash(
		"x",scale * scale_x,
		"y",scale * scale_y,
		"time",time
	));
```
※ 一部抜粋
Unityでアニメーション・エフェクトを外部プラグインで自作する方法

※ 2016年の自分の記事を移転しました。

サークルメンバーがエフェクトを作成できる便利なツールを見つけてくれました。

[エフェクト制作ツール「Effekseer」](https://effekseer.github.io/jp/)

**Effekseerは簡単に綺麗なパーティクルエフェクトを制作できるツールです。**~~(そのまま引用)~~

私は~~めんどくさかった~~全く余裕がないため、ツールを発見してくれたメンバーにツールを使ってもらっています。

Unity側ではプラグインをインポートして、作成してもらったエフェクトデータを決められたところに置くだけ。

**とっても楽ちん！！！なんだこれ！！！！！**

エフェクトのサンプルもあるので、なんとなく作成できると思います。

ちなみに私は以下のようにしてUnityで実行しています。

```
string name = "<ほげほげ>";
Vector3 postion = <再生したいポジション>;
Vector3 scale = <再生時の大きさ>;
// ハンドル作成
EffekseerHandle handle = EffekseerSystem.PlayEffect(name, postion);
// 再生位置を調整
handle.SetTargetLocation(postion);
// 大きさを調整
handle.SetScale(scale);
```

~~うーん。こんな形でいいのかな。。多分あってる。~~

かなり簡単にエフェクトを作成・再生することができるので、とても便利でオススメです。
docker-composeでpythonを立ち上げてみた（Dockerfile）

# 概要
いろいろとpythonの環境を考えた結果macではdockerを使ったらいいのでは無いかと思い最初から勉強してみた。

# 参考
[dockerで簡易にpython3の環境を作ってみる](https://qiita.com/reflet/items/4b3f91661a54ec70a7dc)
[docker-compose コマンドまとめ](https://qiita.com/wasanx25/items/d47caf37b79e855af95f)
あと、公式のリファレンスとか
[Compose CLI リファレンス](http://docs.docker.jp/v1.12/compose/reference/index.html)
[コンテナで Hello world](http://docs.docker.jp/engine/tutorials/dockerizing.html)

# ファイル構成 
```markdown:ファイル一覧
├ Dockerfile 
└ docker-compose.yml
```
# Dockerfile
基本的にはpipでインストールするものは最小限のほうが良いとされる。
つまり、何であれ最小構成を心がける。

```md:Dockerfile
FROM python:3.7.3
USER root
SHELL ["/bin/bash", "-c"]
ENV DEBCONF_NOWARNINGS yes
RUN apt-get update && apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install  numpy \
                 matplotlib \
                 pandas \
```

# docker-compose.yml

```yml:docker-compose.yml
version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'python3'
    working_dir: '/root/dev/'
    tty: true
    volumes: 
    - /Users/hoge/dev/python3/:/root/dev/
```

# 起動
````bash:terminal
$docker-compose up -d --build
````

# 停止
````bash:terminal
docker-compose down --rmi all
````
`--rmi all` でイメージも含めて削除
dockerは短命であるべきらしい
# 接続
`attach`もあるみたいだけど、`exit`すると完全にコンテナが停止するらしいので、基本的には`exec`らしい

````bash:terminal
$ docker exec -it python3 bash
````
# ps
一番上の参考記事を踏襲した感じになっているので、そちらとの差異を見ていただけたらと思います。
基本的にはDockerfileのみが変わっていると思っていただいて。。。。。
あとは、dockerの基本的な考え方が載っている[Dockerfile を書くベスト・プラクティス](http://docs.docker.jp/engine/userguide/eng-image/dockerfile_best-practice.html)を読むと
`コンテナはエフェメラルであるべき
Dockerfile で定義されたイメージを使って作成するコンテナは、可能ならばエフェメラル（短命；ephemeral）にすべきです。私たちの「エフェメラル」とは、停止・破棄可能であり、明らかに最小のセットアップで構築して使えることを意味します。`
のようにいろいろな指針が載っています。
ジョーカースクリプトでキーボード操作したメモ

※ 2016年の自分の記事を移転しました。

## 課題について

ジョーカースクリプトはマウスのみにしか対応していない？ようでした。
そのため、キーボード操作がメインのゲームにはユーザビリティ的に欠点です。
（サポート掲示板には質問は投稿されていますが、返信なし。。。）

ということなので、改修して実装してしまいましょう。

## 改修内容

やったことは単純で、SeneInit.csのUpdateにキーボードが押下されたか判断させただけです。
（ソースをななめ読みしたので、これが正しいのかはわかりません。間違ってたら指摘してください。）

ロジックは以下のような感じです。
1. スペースキーとエンターキーで次へ進める。
2. コントロールキーでスキップ開始。
3. それぞれにスキップ停止処理を加える。

``` C#:SeneInit.cs
void Update () {
	if (Input.GetMouseButtonUp (0)) {
		StartCoroutine("ClickButton");
	}

	// シナリオをすすめる
	if (Input.GetKey(KeyCode.Space) || Input.GetKey(KeyCode.Return) || Input.GetKey(KeyCode.KeypadEnter))
	{
		//skip中にクリックされた場合、Skipを止める
		if (StatusManager.FlagSkiiping)
		{
			StatusManager.FlagSkiiping = false;
		}

		gameManager.clickNextOrder();
	}

	// スキップ開始
	if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl))
	{
		//skip中にクリックされた場合、Skipを止める
		if (StatusManager.FlagSkiiping)
		{
			StatusManager.FlagSkiiping = false;
		}
		else
		{
			StartCoroutine("startSkip");
		}
	}
}
```

### 調査方法のメモ

1. スキップがマウス操作のみということは、マウスイベントを取得している箇所を探すと見つかるのでは。
2. 「GetMouseButtonUp」で探す。
3. 見つかりました。
SourceTreeが起動しなかった時の対処法のメモ

※ 2016年の自分の記事を移転しました。

Windows10で発生。何度も起動しようとしても立ち上がる気配が無かったので調査し、対処できたのでその時のメモ。

## 解決方法

%Appdata%\local\Atlassian\にあるSourceTreeと書かれているフォルダで、ファイル名が長い方を削除することで解決しました。

## 調査手順

とりあえず、以下の方法を確認しました。

1. SourcesTreeの再インストール
2. イベントビューワを見て調査

### SourceTreeの再インストール

現象は再現し、解決されなかった。

### イベントビューアーを見て調査

困ったときや調査をするとき、誰かに助けてもらうときは確認しておいたほうがいいですね。

1. イベントビューアーを起動
2. イベントビューアー(ローカル) > Windowsログ > Application　を表示。

![スクリーンショット-2016-06-19-20.04.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128348/af8a2d63-b99d-fe05-f24d-4e5b9a7deaec.png)

以下2点のエラーログが気になりました。

```
障害が発生しているアプリケーション名: SourceTree.exe、バージョン: 1.8.3.0、タイム スタンプ: 0x56f18db8
障害が発生しているモジュール名: KERNELBASE.dll、バージョン: 10.0.10586.306、タイム スタンプ: 0x571af331
```

やっぱりSourceTree.exeでエラーが発生していますね。。

KERNELBASE.dllで障害が発生しているようです。

## 解決方法
以下の通り、解決できるようです。

[SourceTree will not launch](https://answers.atlassian.com/questions/201090/sourcetree-will-not-launch)

簡単に対処方法をまとめますと、冒頭に記載しているとおりです。
%Appdata%\local\Atlassian\にあるSourceTreeと書かれているフォルダで、ファイル名が長い方を削除。

![スクリーンショット-2016-06-19-20.12.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128348/62ca262c-0e01-b067-95e0-4997c98ceb89.png)


こんなやつの長い方を削除しました。

削除後は無事、SourceTreeを起動することができました。
※ 起動時はセットアップ画面は表示されます。

これでコミットできますね。
ABC071-B

ABC071B B - Not Found
与えられた小文字からなる文字列のうち、出てきていないアルファベットで一番自書式配列で早いものを出力する。
まず入力された文字列を最初から読んでいく。その時そのアルファベットに対応する箇所(例えばaなら1,bなら2,...)をカウントするvector cnt(100)を用意する。
最終的に文字列を最後まで読み終わった後、cnt(100)について、アルファベットは26なので、最初から見ていって、最初に0が来る数字を選んで、それに対応するアルファベットを出力する。
zまで、つまりi=25が終わるまで0が出ないときは、"None"と出力する。:relaxed:

aからi番目のアルファベットを出力するには(aを0番目として)

```
char ans=i+'a';
```
とした。

```cpp:ABC071B.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
 string s;cin >>s;
  vector<int> cnt(100);//この時アルファベットが何個あるか知らなかったので適当に100と置いた
  for(int i=0;i<s.size();i++){
   int al=s[i]-'a';//b->1,d->3...というようにintで置いておく。
   cnt[al]++;
  }
  int stl=0;
  for(int i=0;i<26;i++){
   if(cnt[i]==0){
    char ans=i+'a';
     cout << ans << endl;
     return 0;
   }
   else stl++;//stlはsteam locomotive の略。
  }

  if(stl==26)cout << "None" << endl;
}

```
color_fieldとインラインでの擬似要素の表示について

##吹き出しの背景色をその時の気分で色を決めたい！

変更前がこちら

<img width="815" alt="スクリーンショット 2019-05-29 21.07.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265805/8cf4ac28-b854-82d2-331d-1c981f0bdc27.png">



##やること
Articleモデルに色を登録するカラム`color_1`と`color_2`を追加する


##color_field

jqueryのカラーピッカーとかを使って色を登録しようかなんて思っていたところRailsが提供している`color_field`というものを見つけた。


これで色を選択できる！こんなかんじ↓



![画面収録-2019-05-29-1.32.03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265805/c87e7add-f681-d87c-2b6c-a6d3384d420b.gif)




<img width="1245" alt="スクリーンショット 2019-05-29 1.27.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265805/4bf5b3b6-0054-3b1a-a6f2-973b8928cb39.png">

```_form.html.erb
  <tr>
    <th scope="row">吹き出し1</th>
    <td><%= f.text_field :balloon_1, size: "90x10"  %>
        <%= f.color_field :color_1 %>
    </td>
  </tr>
  <tr>
    <th scope="row">吹き出し2</th>
    <td><%= f.text_field :balloon_2, size: "90x10" %>
        <%= f.color_field :color_2 %>
    </td>
  </tr>

```




##色の表示

```.rb
<div class = "balloon1" style="background-color:<%= @article_.color_1 %>">
```

```HTML
<div class = "balloon1" style="background-color:#b8e1f5">
```


<img width="776" alt="スクリーンショット 2019-05-29 1.47.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265805/3f59a3cc-52eb-4f2b-2ddb-3e59443bb739.png">



これだとまだ吹き出しの３角の部分の色がstyle.cssで指定したままの色なので未完成です。
この吹き出しのCSSはこのようなコードでできています。

```style.css
.detail .article .balloon1{
  position: relative;
  padding: 20px;
  border-radius: 10px;
  background-color: #ffb1cd99;
  width: 75%;
  height: 25px;
}

/* 三角アイコン */
.balloon1::before{
  content: '';
  position: absolute;
  display: block;
  width: 0;
  height: 0;
  left: -15px;
  top: 17px;
  border-right: 15px solid #ffb1cd99;
  border-top: 15px solid transparent;
  border-bottom: 15px solid transparent;
}

```        

::beforeってのが擬似要素ってやつでこれのスタイル指定を別で行わなきゃいけないようです。


擬似要素ってなあに？って方はこちら↓
この方の記事がわかりやすかったです！
いろんな仕様の変更とかで`::`と`:`が混じってわかりにくい記事も多いです
参考：[擬似要素と擬似クラス](https://qiita.com/KKKeisuke/items/616137e3b1db4e4dae6a)


```HTML
  <style>.balloon1::before { border-right: 15px solid <%= @article_.color_1 %>; }</style>
  <div class = "balloon1" style="background-color:<%= @article_.color_1 %>"><%= @article_.balloon_1 %></div>
```
<img width="813" alt="スクリーンショット 2019-05-29 12.06.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265805/4cfc6091-af38-8dc9-b53a-85250efc9b91.png">


できた！
DCOMエラーが多発している不具合を解決（？）した話

※ 2017年の自分の記事を移転しました。

## 現象について

原因は不明ですが、イベントビューアーに以下2つのDCOMエラーが大量に発生していました。

```
DCOM サーバーを起動できません: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} (利用不可/利用不可)。エラー:
"740"
は、次のコマンドの起動中に発生しました:
C:\Windows\System32\rundll32.exe C:\Windows\System32\shell32.dll,SHCreateLocalServerRunDll {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -Embedding
```

上記はDCOMエラーAとします。

```
DCOM サーバーを起動できません: {C82192EE-6CB5-4BC0-9EF0-FB818773790A}。エラー:
"740"
は、次のコマンドの起動中に発生しました:
C:\Windows\System32\rundll32.exe shell32.dll,SHCreateLocalServerRunDll {c82192ee-6cb5-4bc0-9ef0-fb818773790a} -Embedding
```

上記はDCOMエラーBとします。

それぞれが発生するトリガーは以下のようでした。

* DCOMエラーA

`エクスプローラーでフォルダ移動すると発生。`

* DCOMエラーB

`タスクバーのエクスプローラーから「デスクトップ」や「ゴミ箱」などのショートカットもしくはエクスプローラを選択すると発生。
選択しても、デスクトップやゴミ箱がエクスプローラで表示されない。（なにもされない。）`

DCOMエラーAはログに出るだけで実害はなかった（？）のですが、DCOMエラーBだけはエクスプローラーの表示問題があるので実害でまくりでしたね。

いやぁ困った困った。

## 解決方法

microsoft Comunityでも同様の現象に悩まされている人がいました。

[Windows file explorer/quick access not working correctly in windows 10](https://answers.microsoft.com/en-us/windows/forum/windows_10-files/windows-file-explorerquick-access-not-working/a58906c1-30e4-420b-9920-67107a17cce6)

要約すると、**失敗したコマンドをもう一度実行させたらできたぜ！！！**

・・・まじか。

私も試してみたところ、無事解決（？）しました。

以下を実行しました。

```
C:\Windows\System32\rundll32.exe C:\Windows\System32\shell32.dll,SHCreateLocalServerRunDll {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -Embedding
C:\Windows\System32\rundll32.exe shell32.dll,SHCreateLocalServerRunDll {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -Embedding
```

再起動すると元に戻ってしまうので、起動時に実行するようにしました。
なぜかDCOMエラーAは起動直後に数件でますが、実害はないのでこのままにします。

## 参考サイト

[Windows10 起動時にアプリを自動起動 – スタートアップに登録](https://pc-karuma.net/windows-10-app-startup/)

[ログインしたら、最小化の状態でプログラムを立ち上げたい。](http://blog.goo.ne.jp/xmldtp/e/e6c2a3bdb8b426a50f1b8e3b63f39e98)
EChartsの軸ラベルをリンクっぽく装飾する

# はじめに
需要があるのかわからないシリーズ

普段グラフライブラリにEchartsを使ってるんですが、Y軸とかX軸のラベルをHTMLで装飾するすことはEchartsではできないようになっています。
今回、ラベルをリンクのように見せたい事情があり、無理やり実装したというエントリです。

# 方法
borderのオプションは用意されているものの、四方そぞれぞれ個別に設定ができないので下線を引くことはできないんです。
ただ、heightを1にしてあげたうえでbackgroundColorを指定してあげると線として見せることができます。
これをうまく使ってあげれば下線を引けそう。


```javascript
option = {
    xAxis: {
        type: 'category',
        data: ['月', '火', '水', '木', '金', '土', '日'],
        axisLabel: {
            color: '#00f',
            // richをうまく使います。改行したあとにダミーのboxを用意
            formatter: function(n) {
                return n + '\n{box|}';
            },
            rich: {
                // 高さ1pxにしてあげて塗りつぶしてあげる
                box: {
                    height: 1,
                    width: 16,
                    backgroundColor: '#00f'
                }
            }
        },
        // ラベルもマウスイベント拾えるようにする
        triggerEvent: true
    },
    yAxis: {
        type: 'value'
    },
    series: [{
        data: [820, 932, 901, 934, 1290, 1330, 1320],
        type: 'line'
    }]
}
```

こんな感じになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372576/a56ca88e-22cc-d25a-023b-2f3afe0d4689.png)


あとはイベントを拾ってlocation.hrefで飛ばしてあげる

```javascript
myChart.on('click', function (params) {
    console.log(params);
});
```

# さいごに
細かいところまでカスタマイズできるグラフライブラリあれば教えてください :pray:
Angular パイプ

#Angular パイプとは
![angular.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368226/4d509604-9039-5808-a1f4-2d27afd158cb.png)

- パイプとは**「与えられたデータを整形する機能」**です。

データがパイプを通って、新しい形にしてくれてるんだなーって勝手に思っています。ドラえもんのガリバートンネルみたいな？　笑

例えば、`hello`を`HELLO`と大文字にしたい時ありますよね。

その時は以下のように記述します。

```
{{ "hello" | uppercase }}
```

このようにAngularはいくつかのパイプをすでに用意してくれています。

#パイプの種類
パイプにも種類があります。
大きく分けると以下の二つです。

- ビルトインパイプ
- カスタムパイプ

###ビルトインパイプ

Angularが用意してくれている、パイプです。
一部ですが以下のようなパイプが用意されています。

- DatePipe
 - 日付を人が読みやすい形にしてくれる。
- CurrencyPipe
 - ドルや日本円表記にしてくれる。 
- PercentPipe
 - 1.0を100%に変換してくれる。 

###カスタムパイプ
独自のカスタムパイプを記述し、使用することもできます。
こんなパイプあれば良いのになーって思った時に作るやつですね。

カスタムパイプは実際のコードをみた方がわかりやすいと思うので、分けて別投稿させて頂きます。
投稿した際にはここにリンクを貼っておきます。:raised_hand:

#参考
[Angular公式](https://angular.jp/guide/pipes)
[パイプ機能の使い方](https://confrage.jp/angular-%E3%81%AE%E6%A8%99%E6%BA%96%E3%81%AE%E3%83%91%E3%82%A4%E3%83%97%E6%A9%9F%E8%83%BD%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/)
[Angular 入門 パイプ](https://angular.keicode.com/basics/pipes.php)
ECSクラスタに手動でインスタンスを登録する

## 手順

### 1. 空のECSクラスタ作成

### 2. EC2に割り当てるIAMロールを作成

- EC2インスタンスをECSクラスタに登録するには、ECSクラスタにアクセスできるポリシーが必要になる
- すでにECSクラスタにアクセス可なEC2用のIAMロールがある場合は、作成不要
- 新たにロールを作成する場合
    - 信頼されたエンティティ : EC2
    - ポリシー : AmazonEC2ContainerServiceforEC2Role

### 3. EC2インスタンスの作成
- 下記に記述する設定以外は任意の設定で良い
    - AMI : ami-0e52aad6ac7733a6a
    - ↑ ECSエージェントインストール済みのコミュニティAMI（参考記事1参照）
    - インスタンスの詳細 > 高度な詳細 > ユーザーデータ（テキスト） : 
        **your_cluster_name を「手順1で作成したECSクラスタ名」に書き換える**

        ```shell
        #!/bin/bash
        echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config
        ```

## 参考記事

1. [Amazon ECS コンテナインスタンスの起動](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/launch_container_instance.html)
Windows10のシステムフォントを変更する方法

Windows10で標準となった游（ゆう）ゴシック体が自分にとっては読みにくかったので、メイリオに変更した時のメモ。

![yuGothiku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128348/6cbbf56c-8ebc-5e88-e59a-b746f657e628.png)


Windows10ではフォントを簡単に変更する方法が無いようなので、ツールを使用して変更しました。

[Meiryo UIも大っきらい!!](http://tatsu.life.coocan.jp/MySoft/WinCust/index.html)

ソフトをダウンロードして起動すると、以下の画面が表示されます。
![NoMeiryoUI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128348/f0c888d2-ddeb-f281-6df3-0dfe48a4691b.png)

**説明もいらないほど直感で理解しやすい☺☺☺**

一応手順を記載します。

1. [すべてのフォント]-[游ゴシック 9pt]の横、「選択...」をクリック
2. 「メイリオ」を選択
3. 「一括設定」をクリック

**たったこれだけでフォントを変更できました！！！**

メイリオ以外にもMSゴシックなど、Windowsに登録されているフォントは選択できるようです。

Windows標準機能で簡単に変更できれば、楽なんですけどねぇ。。。

私と同様に不服を感じた方は「フィードバックHub」で**システムフォント変えられるようにして！！**と連絡しましょう！！！
HTTPを理解する⑤ ステートレス

## ステートレスとステートフル
HTTPはシンプルなプロトコルであり、特徴として「ステートレス性」があります。ステートレスとは状態を保持しないということの意味で、クライアントとサーバーの一往復分で完結しその後も状態を維持することはありません。
状態を保持することの例としてよく以下のようなことがあります。

客：「ハンバーガーください」
店員：「ハンバーガーですね、一緒にポテトはどうですか？」
客：「ハンバーガーと一緒に飲み物もください」

客がクライアントであり店員がサーバーです。ステートレスなやりとりではサーバーは「ハンバーガーください」という情報のことをサーバー側は「ハンバーガーと一緒に飲み物もください」をリクエストとして送ったときには忘れてしまってます。このがステートレスです。このときの「ハンバーガーください」という情報を保持しつづける状態のことをセッション状態といいます。
逆に常に状態を保持しつづけることをステートフルといいます。

## ステートレスの利点、欠点
ステートレスの利点としてサーバー側の処理を軽減できることがあります。もしクライアントの状態を保持し続けた場合何千人ものセッションを持つことになるためサーバーに負担が大きくなります。ですがステートレスは状態を保持しつけることがないためサーバーの負担が軽くなります。
欠点として状態を保持しないためクライアントの情報を毎回DBに問い合わせて照合する必要があります。これを毎回繰り返すのはユーザーには手間だし毎回ユーザー情報をユーザーが記入するのはしんどいことです。
Docker イメージを ECR に保存して実行する

docker コマンドと aws コマンド (CLI) を使って、手元の Docker イメージを Elastic Container Registry (ECR) に保存して、とりあえずローカルで実行してみます。（2019年5月現在）

- docker コマンド → https://qiita.com/kawanet/items/30c1acd4bc90ee0e535d
- awscli コマンド → Mac なら `brew install awscli` でインストールできる。

## リポジトリの準備

先に AmazonEC2ContainerRegistryFullAccess 権限のついた IAM ユーザのアクセスキー ID・シークレットアクセスキーを取得しておきます。

```sh
# アクセスキー ID
export AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxxxxx"

# シークレットアクセスキー
export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# 東京リージョン
export AWS_DEFAULT_REGION="ap-northeast-1"

# Docker を認証する → 「Login Succeeded」と表示されれば成功
aws ecr get-login --no-include-email | sh -v

# ECR 上にリポジトリを作る
aws ecr create-repository --repository-name myalpine

# ECR 上にリポジトリを消す
aws ecr delete-repository --repository-name myalpine
```

## Docker イメージをアップロードする

```sh
# 適当なイメージを Docker Hub からダウンロードする
docker pull alpine:latest

# ローカルのイメージの一覧を確認する
docker images

# リポジトリにプッシュするイメージにタグを付ける
# `xxxxxxxxxxx` の部分は、AWS のアカウント ID です。
# `ap-northeast-1` の部分は、リージョン（東京）です。
docker tag alpine:latest xxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/myalpine:latest

# 間違えたら、タグを消す（リージョンの指定を間違えた等）
docker image list
docker image rm xxxxxxxxxxx.dkr.ecr.wrong-region.amazonaws.com/myalpine:latest

# ECR にイメージをプッシュする。
# 「no basic auth credentials」が出たら認証の問題。リージョンが違うとか。
docker push xxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/myalpine:latest

# プッシュした ECR のイメージを確認する
aws ecr list-images --repository-name myalpine

# ローカル側のタグをいちど消しておく
docker image rm -f xxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/myalpine:latest

# ローカル側のタグが削除されたのを確認
docker image list
```

## ECR からイメージをダウンロードして実行する

```sh
# ECR 上のイメージをそのまま実行してみる
docker run -it xxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/myalpine:latest sh

# ECR からイメージをプルする
docker image pull xxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/myalpine:latest

# ローカルのイメージが復活したことを確認する
docker image list

# ECR 上のイメージの削除
aws ecr batch-delete-image --repository-name myalpine --image-ids imageTag=latest

# ECR 上のリポジトリの削除
aws ecr delete-repository --repository-name myalpine
```

参考 → https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/ECR_AWSCLI.html
VPCをインターネットに繋げる方法

AWS VPCのサブネットを構築すると、インターネトゲートウェイを使用してサブネットをインターネットに接続することが出来ます。

##とりあえず作成してみましょう！！


VPCの画面から作成することが出来ます。

![スクリーンショット (8)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/5dd2f7d5-5d6b-6e3f-254d-573be97f0158.jpeg)

このような画面が出てくるので、「作成」ボタンを押して、インターネットゲートウェイを作成しましょう！

![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/fbb2458e-38ec-c09a-b803-8f6e6f61ac5c.png)

元の画面にインターネットゲートウェイがあれば、作成出来てます。


###インターネットゲートウェイをVPCに繋げる

作成したインターネットゲートウェイをVPCに繋げましょう！


![スクリーンショット (9)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/585fffdf-7290-d68f-ac05-e94b255e465e.jpeg)


使用したいインターネットゲートウェイを選択し、アクションボタンを押します。
そして、「VPCにアタッチ」ボタンを押し、インターネットに繋げたいVPCを選択すると、インターネットゲートウェイをVPCに繋げることが出来ます。
VPCにつき、ひとつのインターネットゲートウェイしか接続できないので注意しましょう。


これで、VPCをインターネットに接続できる、、と思いきや！
ルートテーブルの設定も忘れずに！

##ルートテーブルの設定

AWS VPCでは、VPCを作成したと同時にルートテーブルも作成されます。

ルートテーブルは、ルーターに設定されているIPアドレスのホストと、データのやり取りを行うことができるデータ、とここでは考えてもらっても差し支えありません。

なので、自動で生成されてたルートテーブルに、やり取りをしたいIPアドレスが示されていなければ、そのIPアドレスのホストとはデータのやり取りができなくなるということです。

ホームページを公開したい方などは、すべてのIPアドレスを受け入れることができるように設定しておかなければなりませんね！

VPCダッシュボードのルートテーブルを見ます。

![スクリーンショット (9)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/7f0751ee-04ca-56e0-b250-e2ee72ddd960.jpeg)


「ルート」ボタン、「ルートの編集」を押します。

![スクリーンショット (10)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/1a94c183-ad80-3b8c-ae84-c195cb97cf61.jpeg)

すると、ルートを設定することが出来ます。

「送信先」には、IPアドレスを指定します。
全指定したい場合は0.0.0.0/0と指定しましょう。

「ターゲット」は、VPCと接続したインターネットゲートウェイのIDを指定します。

そして、「ルートの保存」ボタンを押せば、完成です。



以上です。ありがとうございました！
【備忘録】MD5のハッシュ値確認と照合について

装置A、装置Bが存在しているのが前提。

装置Aから装置Bにmd5sum_testディレクトリごとコピーする。
md5sum_testディレクトリにはファイルが入っている。


1.装置Aで下記コマンド

```
$ find /home/pi/md5sum_test/1/ -type f -exec md5sum {} \; > 1_A.md5sum
```

2.装置Aで下記コマンドで内容確認。

```
$ cat 1_A.md5sum
372e25f23b5a8ae33c7ba203412ace30  /home/pi/md5sum_test/1/file2
60b725f10c9c85c70d97880dfe8191b3  /home/pi/md5sum_test/1/file1
```

3.装置Bに手順1で作成したファイルを転送。

4.装置Bで下記コマンド実施。

```
$ md5sum -c /tmp/1_A.md5sum
/home/pi/md5sum_test/1/file2: 完了
/home/pi/md5sum_test/1/file1: 完了
```
※失敗すると下記のようになる。

```
/home/pi/md5sum_test/2/file2: 完了
/home/pi/md5sum_test/2/file1: 失敗
md5sum: 警告: 1 個の計算したチェックサムが一致しませんでした
````

以上
docker-compose でコンテナを起動する

docker-compose を使ってミニマムのコンテナを作って起動してみます。（2019年5月現在）

まず最初に、ディレクトリ名が docker-compose におけるプロジェクト名（Docker コンテナ等の接頭辞）になるので、ディレクトリを作ります。

```sh
mkdir myproj
cd myproj
```

Dockerfile を作ります。
ドキュメント → http://docs.docker.jp/engine/reference/builder.html

```Dockerfile
# 軽量な Alpine Linux をベースにする
FROM alpine

# ログインしたときに便利なように bash・ps・curl を入れておく。
RUN apk add bash procps curl

# 1秒ごとに時刻を STDERR に書き出す
CMD sh -c "(while :; do date; sleep 1; done) >&2"
```

docker-compose.yml を作ります。
ドキュメント → https://docs.docker.com/compose/compose-file/compose-file-v2/
なお、tty などのオプションについては、docker 側のドキュメント http://docs.docker.jp/engine/reference/run.html を参照します。

```docker-compose.yml
version: "3"

services:
  myalpine:
    build: "."
    tty: true
```

イメージを作ります。
イメージ名は、サービス名の前に、プロジェクト名（ディレクトリ名）が自動で付きます。
プロジェクト名を指定する場合は `-p` オプションを指定します。

```
$ docker-compose build
Building myalpine
Successfully built e4215b22f7c8
Successfully tagged myproj_myalpine:latest

$ docker images
REPOSITORY          TAG     IMAGE ID        CREATED         SIZE
myproj_myalpine     latest  e4215b22f7c8    2 minutes ago   13MB
```

detach モードで起動します。

```
$ docker-compose up -d
Creating network "myproj_default" with the default driver
Creating myproj_myalpine_1 ... done
```

コンテナ名は、イメージ名の末尾に `_1` が付きます。
起動中のコンテナ・プロセスを確認します。

```
$ docker ps
CONTAINER ID    IMAGE               COMMAND                   CREATED             STATUS              PORTS               NAMES
cc95a9d44519    myproj_myalpine     "/bin/sh -c 'sh -c \"…"   23 seconds ago      Up 22 seconds                           myproj_myalpine_1

$ docker-compose ps
      Name                     Command               State   Ports
------------------------------------------------------------------
myproj_myalpine_1   /bin/sh -c sh -c "(while : ...   Up      
```

STDERR 標準エラー出力を確認します。
`docker logs` だとコンテナ単位のログを、
`docker-compose logs` だとプロジェクト単位のログを確認できます。
`-f` は `tail -f` と同じ `--follow` の意味です。

```
$ docker logs -f myproj_myalpine_1
Tue May 28 15:13:50 UTC 2019
Tue May 28 15:13:51 UTC 2019
Tue May 28 15:13:52 UTC 2019
Tue May 28 15:13:53 UTC 2019

$ docker-compose logs -f
myalpine_1  | Tue May 28 15:13:50 UTC 2019
myalpine_1  | Tue May 28 15:13:51 UTC 2019
myalpine_1  | Tue May 28 15:13:52 UTC 2019
myalpine_1  | Tue May 28 15:13:53 UTC 2019
```

稼働中のコンテナにログイン（bash を起動）してみます。

```
$ docker exec -it myproj_myalpine_1 bash

bash-4.4# uname -a
Linux cc95a9d44519 4.14.114-105.126.amzn2.x86_64 #1 SMP Tue May 7 02:26:40 UTC 2019 x86_64 Linux

bash-4.4# grep PRETTY /etc/os-release 
PRETTY_NAME="Alpine Linux v3.9"

bash-4.4# exit
```

コンテナを `stop` で停止してみます。

```
$ docker-compose stop
Stopping myproj_myalpine_1 ... done

$ docker ps
```

不要なコンテナを削除して後片付けします。

```
$ docker image prune -f
Total reclaimed space: 0B

$ docker image list

$ docker image rm myproj_myalpine
```

今回は１サービスのみでしたが、docker-compose を使うと
１プロジェクトで複数のサービスを束ねられます。
♪どつぼにはまってどっぴんしゃん

# まったく進まなくなってしまった...
- [GitHubの二段階認証が有効な環境でSourceTreeを使う](https://qiita.com/MATTENN/items/7009eed1de1e46f99544)にアクセストークンを発行し、それをソースツリーに入れればOKと書いてあったのでやってみた。でもダメ
- 昨日は疲れて寝てしまい落としてしまったし
- でも仕方ない。明日改めてがんばろう

# 今日の気持ち
- GOの勉強のはずなのにどんどん違う方向に進んでいる
- 参った、ホント参った
- でも諦めない。また明日
Golangで積み上げ棒グラフ（stacked bar chart）を描く

# Golangで積み上げ棒グラフを描く
Goで積み上げ棒グラフを描こうと思ったのですが，日本語による参照情報が見つからなかったので，英語で調べて分かったことをまとめます．

## Overview
- [完成図](#完成図)
- [コード全体](#コード全体)
- [参照サイト](#参照サイト)

## 完成図
![stackedBarChart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261058/9f956eae-7a8e-bcff-aa9c-d270f021fd89.png)


## コード全体
積み上げ棒グラフの生成でポイントとなるのは，StackOn関数です．
この関数を利用すれば，棒グラフを「上に乗せる」ことができます．

```go
func (b *BarChart) StackOn(on *BarChart)
```



```go
package main

import (
	"log"

	"gonum.org/v1/plot"
	"gonum.org/v1/plot/plotter"
	"gonum.org/v1/plot/plotutil"
	"gonum.org/v1/plot/vg"
)

func main() {

    // サンプルデータを生成します
	groupA := plotter.Values{1500, 1500, 1400, 2100, 1100}
	groupB := plotter.Values{2800, 2600, 1600, 2100, 800}
	groupC := plotter.Values{1800, 2100, 1500, 1300, 900}
	groupD := plotter.Values{1600, 3500, 2600, 1700, 600}

	p, err := plot.New()
	if err != nil {
		log.Panic(err)
	}

	p.Title.Text = "utility cost"
	p.Y.Label.Text = "cost"

    // 棒の横幅を設定します
	w := vg.Points(30)

    // barsA がグラフの一番下になります
	barsA, err := plotter.NewBarChart(groupA, w)
	if err != nil {
		log.Panic(err)
	}
    // グラフの色を設定します
	barsA.Color = plotutil.Color(0)
    // グラフ自体を囲む枠線を設定します 0にすると，黒の枠線がなくなります
    barsA.LineStyle.Width = vg.Length(0)

	barsB, err := plotter.NewBarChart(groupB, w)
	if err != nil {
		log.Panic(err)
	}
	barsB.Color = plotutil.Color(1)
    // barsB を barsA の上に乗せます
	barsB.StackOn(barsA)

	barsC, err := plotter.NewBarChart(groupC, w)
	if err != nil {
		log.Panic(err)
	}
	barsC.Color = plotutil.Color(2)
    // barsC を barsB の上に乗せます
	barsC.StackOn(barsB)

	barsD, err := plotter.NewBarChart(groupD, w)
	if err != nil {
		log.Panic(err)
	}
	barsA.Color = plotutil.Color(3)
    // barsD を barsC の上に乗せます
	barsD.StackOn(barsC)

	p.Add(barsA, barsB, barsC, barsD)
	p.Legend.Add("Electric bill", barsA)
	p.Legend.Add("Water bill", barsB)
	p.Legend.Add("Gas fee", barsC)
	p.Legend.Add("Telephone fee", barsD)
	p.Legend.Top = true
    p.Legend.Left = false
	p.NominalX("January", "February", "March", "April", "May")

	err = p.Save(5*vg.Inch, 5*vg.Inch, "stackedBarChart.png")
	if err != nil {
		log.Panic(err)
	}

}

```

## 参照サイト
- [package plotter
](https://godoc.org/gonum.org/v1/plot/plotter)
- [sourcegraph gonum/plot](https://sourcegraph.com/github.com/gonum/plot@e2840ee46a6b612972d746f9fea9920d329a0605)
Javaの勉強　ScannerとかMapとか使ってみる

職業訓練校に通い始めてHTML&CSS,JavaをProgateなどで学習していたらQiitaの活用がすっかり、、、
と、いうわけで
Javaの勉強のために購入した「**スッキリわかるJava入門　第2版**」の練習問題を本来の回答と違う方法で記述してみました


---
練習2-3
以下のプログラムを作成してください。

①画面に「ようこそ占いの館へ」と表示します。
②画面に「あなたの名前を入力してください」と表示します。
③キーボードから１行の文字入力を受け付け、String型の変数nameに格納します。
④画面に「あなたの年齢を入力してください」と表示します。
⑤キーボードから１行の文字入力を受け付け、String型の変数ageStringに格納します
⑥変数ageStringの内容をint型に変換し、int型の変数ageに代入します。
⑦0から3までの乱数を生成し、int型の変数fortuneに代入します。
⑧fortuneの数値をインクリメント演算子で1増やし、1から4の乱数にします。
⑨画面に「占いの結果が出ました！」と表示します
⑩画面に「(年齢)歳の(名前)さん、あなたの運記番号は(乱数)です」と表示します。
　その際に(年齢)には変数ageを、(名前)には変数nameを、そして(乱数)に⑧で作った数字を表示させます。
　画面に「1：大吉　2：中吉　3：吉　4：凶」と表示します。


```java
import java.util.*;

public class practice {

	public static void main(String[] args) {
		Scanner stdInput = new Scanner(System.in);
		Random random = new Random();
		Map<Integer, String> map = new HashMap<Integer, String>();
		
		map.put(0, "大吉");
		map.put(1, "中吉");
		map.put(2, "吉");
		map.put(3, "凶");
			
		
		System.out.println("ようこそ占いの館へ！");
		System.out.print("あなたの名前を入力してください： ");
		String name = stdInput.nextLine();
		System.out.print("あなたの年齢を入力してください： ");
		String ageString = stdInput.nextLine();
		
		int age = Integer.parseInt(ageString);
		int fortune = random.nextInt(4);
		
		System.out.println("\n占いの結果が出ました！");
		System.out.println(age + "歳の" + name + "さん、あなたの運勢は" + map.get(fortune) + "です");
	}
}
```

実行結果です

```java:結果

ようこそ占いの館へ！
あなたの名前を入力してください： はたでめお
あなたの年齢を入力してください： 40

占いの結果が出ました！
40歳のはたでめおさん、あなたの運勢は中吉です

```






使用した本
---
[スッキリわかるJava入門 第2版 (スッキリシリーズ)](https://www.amazon.co.jp/dp/484433638X/)


まとめ
---
色々こうしろと言われてたのですが無視してやった結果がこれです。。。
Pythonの辞書にあたるものを使いたかったのですが、調べて最初に出てきたのが**Map**だったのでそれを使用しました
javaはデータ型を色んなところで宣言するのがなかなか煩わしいです。。。
分かり易くていいんですが

お気づきの点がありましたら遠慮なくご指摘お願いいたします。
Raspberry pi のバックアップ 

# Raspberry pi のバックアップ
せっかくインストールしたRaspberry Piを手軽にバックアップする方法をまとめてみました。

バックアップ先は、Windows10を想定した手順として記載します。
## Windows 10 フォルダ共有設定
適当な場所にフォルダを作成します。
例として、share という名前のフォルダを作成します。

フォルダを右クリック > プロパティ >共有タブを選択し、詳細な共有をクリックします。
<img width="301" alt="008.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418731/3031c668-bdbb-32f5-025b-fbcc1553bac3.jpeg">
このフォルダーを共有する にチェックを入れて「OK」をクリックします。
<img width="310" alt="006.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418731/02101653-5e4a-a639-b1a2-44fbfc899576.jpeg">
共有フォルダにeveryoneを追加し、読み取り/書き込み権限を付与します。
<img width="441" alt="003.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418731/cdf3df99-2981-7d78-d7f9-c32c80408d74.jpeg">

※パスワードなしで共有させたい場合は、以下の設定を実施します。
ネットワークと共有センター > 共有の詳細設定の変更をクリックします。
<img width="641" alt="001.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418731/f78974aa-b520-fd71-312c-699f107a7430.jpeg">
すべてのネットワーク > パスワードの保護共有 でパスワード保護共有を無効にする にチェックを入れて変更の保存をクリックします。
<img width="636" alt="002.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418731/1c32c976-ab56-2c11-69a2-be7a20be659e.jpeg">



## Windows 共有フォルダをRaspberry Piからマウント
Windows 共有フォルダをRaspberry Piからマウントします。
Windows のIPアドレスが、192．18.11.** 、共有フォルダ名が、shareの場合。

    pi@raspberrypi:~ $ sudo mount -t cifs //192.168.11.**/share /mnt/nas -o iocharset=utf8
    Password for root@//192.168.11.**/share:  
    pi@raspberrypi:~ $ mount |grep nas
    //192.168.11.**/share on /mnt/nas type cifs (rw,relatime,vers=default,cache=strict,username=root,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.11.**,file_mode=0755,dir_mode=0755,soft,nounix,serverino,mapposix,rsize=1048576,wsize=1048576,echo_interval=60,actimeo=1)
    
## バックアップ

ddコマンドでSDカードのデータをWindows共有先にコピーします。
32GBのSDを使用していましたので、コピーしたファイルも32GBになります。
バックアップ先の空き容量にご注意ください。

    sudo dd if=/dev/mmcblk0 of=/mnt/share/`date "+%Y%m%d-%H%M"`.img bs=16M status=progress 

なおバックアップ時間は、30分程度かかりました。

## リストア

バックアップしたイメージファイルを[balenaEtcher](https://www.balena.io/etcher/)を使ってSDカードにFlashします。

balenaEtcherは、以下のサイトよりダウンロードできます。

balenaEtcher
https://www.balena.io/etcher/

バックアップしたイメージを選択して、Flash!すれば完了します。

<img width="601" alt="007.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418731/259bc31a-2c87-9a02-2554-dde95906fc61.jpeg">
Pythonでスクレイピング

# Pythonでスクレイピング
## スクレイピングとは
インターネット上にある、HTMLをはじめとするさまざまなコンテンツを取得すること
（車のフロントガラスに積もった雪をこそげ落とすイメージ？）

## ざっくりやってみる事
- HTMLを取得してみる
- 連続で取得してみる
- HTMLを解析してみる

### HTMLを取得する
- `Requests`というライブラリを使ってやってみる
- 取得するコンテンツに日本語等マルチバイト文字を含んでいる場合、文字化けしてしまうので呪文を唱える

```
$ pip install requests
```

```sample.py
import requests

# とりあえずgoogleのトップに殴り込む
url = 'https://www.google.com/?hl=ja'
response = requests.get(url) # ここまでだと文字化けの可能性が
response.encoding = response.apparent_encoding # 呪文

print(response.text) # textに入ってくる
```
`encoding`プロパティーでサーバーからのレスポンスの文字エンコーディングを指定できる
ここで指定した`apparent_encoding`はレスポンスの内容から文字エンコーディングを教えてくれるもので、こいつをencodingプロパティーに指定する事で無敵モードになれる

```html
<!doctype html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="ja">
<head>
  <meta content="世界中のあらゆる情報を検索するためのツールを提供しています。さまざまな検索機能を活用して、お探しの情報を見つけてください。" name="description">
  ...(割愛)...
```
※本当は１行で返ってきますが見やすいように体裁整えています
（結果を見た感想：googleトップってドシンプル、でもscriptがんがん仕込まれててなんかすごっ）

#### ちなみにHTML以外も
インターネット上のコンテンツであればcsv、画像、動画の取得等も可能

```csv_sample.py
import requests

# フロリダ州立大学が後悔していたサンプルCSV　URL以外は同じ
url = 'https://people.sc.fsu.edu/~jburkardt/data/csv/addresses.csv'
response = requests.get(url) 
response.encoding = response.apparent_encoding

print(response.text)
```

### 連続で行っちゃう
特に変わったことはしない、一目瞭然

```sample.py
import time
import requests

# 取得したいURL
url_html = "https://www.google.com/?hl=ja"
url_csv = "https://people.sc.fsu.edu/~jburkardt/data/csv/addresses.csv"

# HTMLの取得と表示
response = requests.get(url_html)
response.encoding = response.apparent_encoding
print(response.text)

# 1秒スリープ
time.sleep(1)

# CSVの取得と表示
response = requests.get(url_csv)
response.encoding = response.apparent_encoding
print(response.text)
```
ただ２回やってるだけ
実際は取得に行くところはメソッドに切り出して引数だけでできるようにするのかな？ まあいいや。
*`time.sleep(1)`*
今回は例としての記述だが、同じサイトに何度もリクエストする場合は、相手にご迷惑にならないように間隔あけるのがマナーって死んだトノサマバッタが言ってた

### HTMLを解析する
- `BeautifulSoup`というライブラリを使う（名前イケすぎてる・・・）
- aタグのテキストとリンク先URLを抜いてみる

```
$ pip install bs4
```

```sample.py
import requests
from bs4 import BeautifulSoup

url = "https://www.yahoo.co.jp/"

response = requests.get(url)
response.encoding = response.apparent_encoding 

bs = BeautifulSoup(response.text, 'html.parser')

a_tag = bs.find('a') # １つ目に見つかったやつ
# nobr_tag = bs.find_all('nobr') # 全部
# nobr_tag = bs.find_all('div', class_='item') # なんか条件指定できたりする classは予約語
# div_item_list = bs.select('div.item-list') # セレクタで指定

print(a_tag.text)
print(a_tag['href']) # a_tag内のhref属性にアクセス

```
`html.parser`以外は別途[公式ドキュメント](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser)等で調べる

## ここまでやってから知った
[Python - Scrapyを使ってクローラーを作る](https://qiita.com/naka-j/items/4b2136b7b5a4e2432da8)
RequestsとかBeautifulSoupとかより便利で実用的なやつあるやんか！

## 感想
スクレイピングするだけならあっという間にできますね。
この取ってきたデータをどう保存して、どう活用するか、DeepLearningにかけるかとかを考えるわけか。
Anacondaのconda installでビルドを指定する方法

# 前略
`conda install`でビルドを指定してインストールする方法がわかりませんでした。

# 環境
- Windows

# 手順
tensorflowの例です。

`conda search tensorflow`で下記が出力されたとします。

```bash
> conda search tensorflow
Loading channels: done
# Name                       Version           Build  Channel
tensorflow                     1.1.0     np112py35_0  pkgs/free
tensorflow                     1.1.0     np112py36_0  pkgs/free
tensorflow                     1.2.1          py35_0  pkgs/free
tensorflow                     1.2.1          py36_0  pkgs/free
tensorflow                     1.7.0               0  pkgs/main
tensorflow                     1.7.1               0  pkgs/main
tensorflow                     1.8.0               0  pkgs/main
tensorflow                     1.9.0 eigen_py35hb0e21f4_1  pkgs/main
tensorflow                     1.9.0 eigen_py36h0b764b7_1  pkgs/main
tensorflow                     1.9.0 gpu_py35h0075c17_1  pkgs/main
tensorflow                     1.9.0 gpu_py36hfdee9c2_1  pkgs/main
tensorflow                    1.10.0 eigen_py35h38c8211_0  pkgs/main
tensorflow                    1.10.0 eigen_py36h849fbd8_0  pkgs/main
tensorflow                    1.10.0 gpu_py35ha5d5ef7_0  pkgs/main
tensorflow                    1.10.0 gpu_py36h3514669_0  pkgs/main
tensorflow                    1.10.0 mkl_py35h4a0f5c2_0  pkgs/main
tensorflow                    1.10.0 mkl_py36hb361250_0  pkgs/main
tensorflow                    1.11.0 eigen_py36h346fd36_0  pkgs/main
tensorflow                    1.11.0 gpu_py36h5dc63e2_0  pkgs/main
tensorflow                    1.11.0 mkl_py36h41bbc20_0  pkgs/main
tensorflow                    1.12.0 eigen_py36h67ac661_0  pkgs/main
tensorflow                    1.12.0 gpu_py36ha5f9131_0  pkgs/main
tensorflow                    1.12.0 mkl_py36h4f00353_0  pkgs/main
tensorflow                    1.13.1 eigen_py36hf0a88a9_0  pkgs/main
tensorflow                    1.13.1 eigen_py37h2a8d240_0  pkgs/main
tensorflow                    1.13.1 gpu_py36h1635174_0  pkgs/main
tensorflow                    1.13.1 gpu_py36h9006a92_0  pkgs/main
tensorflow                    1.13.1 gpu_py37h83e5d6a_0  pkgs/main
tensorflow                    1.13.1 gpu_py37hbc1a9d5_0  pkgs/main
tensorflow                    1.13.1 mkl_py36hd212fbe_0  pkgs/main
tensorflow                    1.13.1 mkl_py37h9463c59_0  pkgs/main
```

バージョン`1.13.1`のビルド`eigen_py36hf0a88a9_0`を指定する場合下記のようにします。


```bash
conda install tensorflow=1.13.1=eigen_py36hf0a88a9_0
```

これでインストールできます。

# 草々
素振りのために Elm でフィルタ・ソート機能付きテーブルを書いた

リポジトリは [zaneli-sandbox/elm-showcase](https://github.com/zaneli-sandbox/elm-showcase)。

![FiletableSortableTable.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841/e86f7a6e-8d05-f13d-3766-9bf2c246e0b8.gif)

管理画面的なやつでよくある感じのあれ。
[ヘッダに `filtable`, `sortable` を指定](https://github.com/zaneli-sandbox/elm-showcase/blob/8c10c3ce171102d159858079296c2fa002b6f164/src/Main.elm#L29-L34)することで、フィルタ対象・ソート対象の項目を指定できる事にした。

要件としては

- 数値・文字列が混在する場合があり、それでもよしなにソートできるようにする。
- 表示されている値とソート対象の値が一致しない場合がある(「`n%(追加情報)`」と表示するがソートは `n` の数値ソート、など)。

といったところ。

これを実現するために、各テーブルセルは[Item](https://github.com/zaneli-sandbox/elm-showcase/blob/master/src/Parts/FiletableSortableTable.elm#L35-L38)型で表現し、
[List.sortWith](https://github.com/zaneli-sandbox/elm-showcase/blob/master/src/Parts/FiletableSortableTable.elm#L103-L127)でゴニョゴニョやるようにした。
この実装では[文字列と数値のOrder](https://github.com/zaneli-sandbox/elm-showcase/blob/master/src/Parts/FiletableSortableTable.elm#L111-L115)が決め打ちになってしまっているが、
細かく制御したければどちらも[View](https://github.com/zaneli-sandbox/elm-showcase/blob/master/src/Parts/FiletableSortableTable.elm#L38)で表せば如何様にもできそう。

各セルにインデックスアクセスするため `Array` を、複数のフィルタ条件を保持するのに `Dict` を使ったが、
ドキュメント読む限り必要最小限の関数を提供したシンプルなものという印象。
もうちょっと気の利いたものが使いたければ `Array.Extra` あたりの利用を検討するとか、そういう感じなのだろうか。
個人的には標準のものだけで十分なように思えた。

`zaneli-sandbox/elm-showcase` リポジトリには今回のフィルタ・ソート機能付きテーブル以外にも
練習台用途でちょっとしたものを追加していこうと思う。
Splunkと一緒に。簡易EDRツールとしてのsysmonの真価に迫る ~その1: 概要編~

sysmonについて
---
- マイクロソフト社が**無償**提供しているツール
- 端末上で動作したアプリケーションの情報やレジストリエントリの作成、通信などWindows OSの様々な動作をイベントログに記録するツール
- JPCERT/CCもwindows端末内の不審な挙動をとらえるためのツールとしてsysmonを[紹介](https://blogs.jpcert.or.jp/ja/2018/09/SysmonSearch.html)
- 海外のRSAコンファレンス等でもエンドポイントのセキィリティログ分析用途での活用として[紹介](https://www.rsaconference.com/writable/presentations/file_upload/hta-w05-tracking_hackers_on_your_network_with_sysinternals_sysmon.pdf)されている


何が嬉しいのか？
---
Windows端末がバックドアなどの不正プログラムに侵害された際に**「不審なプロセスを早期発見」**または**「何が原因で感染したのか？」「どこまでの影響範囲があったのか？」**
とセキュリティインシデントの現場に役に立つことがあります。

### 「不審なプロセスを早期発見」

- powershellを用いた攻撃（encodeされた長過ぎるCommandLine）の検知ができる
![May-28-2019 22-14-27.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/ac6e34b9-1b57-7fd4-8a5a-479ce9ff5eba.gif)

### 「何が原因で感染したのか？」

- [Force Directed App For Splunk](https://splunkbase.splunk.com/app/3767/)を利用することで、視覚的にプロセスの親子関係を可視化ができる![May-28-2019 22-41-45.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/62c250d2-2587-1a14-5f88-98e1e5b92c3b.gif)

- プロセスIDをキーにして親プロセスを特定
![May-28-2019 22-57-53.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/7bbd8273-2dc5-d16a-60a4-4c2f61e594ae.gif)

### 「どこまでの影響範囲があったのか？」
- 悪性のプロセスが他にどのようなプロセスを起動したか確認
![May-28-2019 22-57-39.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/af570870-330e-ced2-83cd-aba346e87366.gif)



How to Setup! （次回に続く）
---
というわけで上記に紹介した検知ルールの設定やダッシュボードの作成方法を次の回で紹介していきたいと思います。

- [導入編](https://qiita.com/odorusatoshi/items/35177f0093b94b439f2e)
    - sysmonの展開
    - Splunkへのデータ取込
- [活用編](https://qiita.com/odorusatoshi/items/3180457b64f6869e59ea)
    - 検知ルールの設定
    - ダッシュボードの作成
- おまけのTIPS集
    - 転送されるトラフィックやデータサイズは？
    - UFをwindowsPCに配るには？
    - sysmon以外にもwindowsから追加でログ収集したくなった
Excelで常に有効数字2桁を表示する

実は有効数字ってお仕事で使ったこと無かったりします。
掲示板の話題から思ったことをつらつらと書いてみます。

## 元ネタの質問
> 「有効数字２桁で表示（３桁目は切り捨て）」
http://www.excel.studio-kazu.jp/kw/20190526122601.html

質問の内容がとりとめないためか、回答が乱れまくっていますがそれはそれ。
まとめてみます。

## 質問内容
 - 有効数字2桁まで表示したい
 - 3桁目は切り捨てしたい
 - 2桁目が0の場合は0を表示したい

### 例)
 - 999　→　990
 - 12345　→　12000
 - 1.5678　→　1.5
 - 1.0012　→　1.0
 - 0.010012　→　0.010

2桁目が0の場合に0を表示するというのがExcelとしては相性が悪そうです。
1.0とかは勝手に1になってしまいますからね。
書式設定をするにも、例の4番めは「0.0」として、5番目は「0.000」と、有効桁数によって変わってしまう。
文字列が無難でしょうか。

あと3桁目を「切り捨てたい」という要望なので、指数を使いづらいという問題もあります。
指数は四捨五入してしまうので、それがまた回答者たちを混乱させているようにも見えます。

## 式を2つに分けよう
だいたいこういうときに活躍するのがLOG関数です。
今回の場合は、LOGの値が1以上か1以下かで式を別にしたほうがいいと思いました。
1の場合？どっち使ってもいいんじゃないですかね(適当)
なんとなくですが、実際のところ大きい数字か小さい数字か、どちらかしか使わないと思うんですよね。

## LOGが1以上の場合
こっちは上2桁だけとって他の桁を0にすればいいので、こんな感じでしょうか

```
=LEFT(A1,2)*10^(INT(LOG(A1))-1)
```
- 999　→ 99 * 10 = 990
- 12345　→　12 * 1000 = 12000

## LOGが1以下の場合
こっちは有効数字を2桁までLEFTで引っ張ればいいだけですね

```
=LEFT(A1,3-INT(LOG(A1)))
```
 - 1.5678　→　3文字　→　1.5
 - 1.0012　→　3文字　→　1.0
 - 0.010012　→　5文字　→　0.010

欠点として、LEFTでくり抜いているだけなので、「6」とかだと当然「6」になり「6.0」にはならない。
蛇足だとは思うけど、それが嫌な場合は最初にTEXTで0をいっぱいつけておくといいかも。

```
=LEFT(TEXT(A1,"000000000000000000"),3-INT(LOG(A1)))
```

---
なんかEXCELの機能にあっても良さそうなのになぁと思うお話でした。
私はBootstrap4の文字サイズをこう覚える＆自作サイズ追加

Bootstrap4の文字サイズは、16px＝1remという基準で、以下のようなクラスを割りふればよい。こう見ると、割と小刻みに文字サイズが用意されているようです。

```html:sample.html
<p class="display-1">6rem</p>
<p class="display-2">5.5rem</p>
<p class="display-3">4.5rem</p>
<p class="display-4">3.5rem</p>
<p class="display-5">3rem</p>　※1
<p class="h1">2.5rem</p>
<p class="h2">2rem</p>
<p class="h3">1.75rem</p>
<p class="h4">1.5rem</p>
<p class="h5">1.25rem</p>
<p class="h6">1rem</p>
```

※1　ただBootstrap4のデフォルト値だけだと、3rem相当の文字サイズがないので、```display-5```を独自に新設対応。ついでに大きな文字も太字にしちゃおう。以下のコードは、追加するSCSS。

```scss
/*大きな文字を太字にする*/
$display1-weight: 500 !default;
$display2-weight: 500 !default;
$display3-weight: 500 !default;
$display4-weight: 500 !default;
/*display-5を新設*/
.display-5 {
	font-size: 3rem;
	font-weight: 500;
	line-height: 1.2;
}
```
【Unity】WebGLビルドの設定はデフォルトでasm.jsの場合がある

## 【Unity】WebGLビルドの設定はデフォルトでasm.jsの場合がある
Unity2018ではデフォルトはWebAseemblyではなくasm.jsのようです。(画像はPlayer Setting)
<img width="338" alt="Screen Shot 2019-05-28 at 23.33.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250231/f814fbca-63f4-e586-2781-15d3e869e7b0.png">

ブラウザのWebAseemblyへの対応は進んできていますので、画像のasm.jsのところを選択して「WebAssembly」か「Both」を選択した方が良いでしょう。Bothは、WebAssemblyとasm.jsのどちらも用意して、ブラウザのWebAssembly対応状況をみて出し分けをするようになります。

公式ドキュメントはこちら
https://docs.unity3d.com/Manual/class-PlayerSettingsWebGL.html
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)