OmniAICreator/Qiita-1.07M huggingface dataset:
USBの形状について ～ USB Type-A 編 ～

参考サイト:
http://uzurea.net/usb-type-complate-list/

#前口上
数日前、備忘録で何の気なく投稿した<a href="https://qiita.com/philip_runner/items/923a6d20c4378b2d9c02">こちらの記事</a>に、コメントをしてくださった方がいた。
そのコメントの内容というのは……
>Type-Aコネクタの場合ですね。
コネクタは Type-A/B/C、nimi-A/B、micro-A/B などがあります。
Type-Cコネクタは色が分からないけど、USB2.0, USB3.0, USB3.1 に使えます。

———というもの。
せっかくの機会なので、USBについてもうちょい勉強しようと思う。

#前提として……
USBの大きく分けて3つに分類することができる。
>・USB
・mini USB
・Micro USB

今回は、その中で最も一般的(?)ともいえる、「USB Type-A」について説明していく。

#USB Type-A とは
USBと聞いて最初に思い浮かべるのは、恐らくこんな形をしているのではないでしょうか。![51KbFr5AACL._SL1280_.jpg](https://qiita-image-store.s3.amazonaws.com/0/368574/93ecdf80-9897-84af-05d2-da7b6d615a2d.jpeg)
これが USB Type-A です。

#深く掘り下げようと思ったけど……
面白いネタが見つからなかったので今回はこれでおしまい。
ごめんなさい。
この記事を読んだ方で、何か知っている方がいらっしゃれば、コメントお待ちしております！
では！！スタタタタッ(=(=(=(=(=(／□￣)／
Pythonからctypesを使って自作したC言語の共有ライブラリを呼び出す

PythonでC言語のライブラリを呼び出して使用する方法を調べたのでメモしておきます。

## 環境 ##

コンパイル環境:Xcode 10.2に含まれるgcc
Python:3.7.2

## C言語の共有ライブラリを作成する ##
Pythonから呼び出すライブラリ(libmyadd.so)を作成します。
ライブラリの内容は整数型の足し算(add)関数で構成されています。

```cpp:math.c
int add(int a, int b){ return (a + b); }
```

共有ライブラリを作成するためには、以下のコマンドを実行します。

```
gcc -shared -fPIC -o libmyadd.so math.c
```

この様にすると、libmyadd.soが作成されます。

## Pythonからlibmyadd.soを使用する ##

これをPythonから呼び出すのためのpythonのコードは以下の様になります。
なお、ライブラリの配置場所はソースコードと同じディレクトリであるとします。

```main.py
import ctypes as ct

libc = ct.cdll.LoadLibrary("./libmyadd.so")

if (__name__ == "__main__"):
    print(libc.add(1, 2))
```

## その他(自作したライブラリをCで使う ##
余談ですが、C言語から呼び出す場合もメモっておきます。
なお、ライブラリの配置場所はソースコードと同じディレクトリであるとします。

```main.c
#include <stdio.h>
  
int add(int a, int b);

int main(void)
{
  printf("%d¥n", add(1, 2));
  return 0;
}
```

これを以下の様にコンパイルします。

```
gcc -L./ -lmyadd -o main main.c
```

これを実行するには以下の様に実行します。

```
LD_LIBRARY_PATH=./myadd ./main
```

## まとめ ##
今回はPythonのctypesというパッケージを使って、Pythonから自作したC言語の共有ライブラリを呼び出しました。まだ曖昧な理解の部分もあるので、今度調べて記事を更新したいと思います。

なお作成したファイルは[GitHub](https://github.com/kuboshu/study-python-ctypes)に投稿してあります。

## 参考 ##
[Linuxで共有ライブラリの作成とダイナミックリンクをする方法:小粋空間](http://www.koikikukan.com/archives/2016/10/27-000300.php)
[Python Document 3.7](https://docs.python.org/ja/3/library/ctypes.html)
クラスタリング結果の一致を調べるーその１：Rand index

# Rand index（ランド指標・ランド指数）

Wikipediaでは英語版しかなく、日本語での説明記事がなぜかほとんどないので書きました。
ぬるっとWikiを読むと、X, Yそれぞれで任意個のサンプルが存在してもいいのかと一瞬混乱したので、初学者（と未来の自分）へ向けて残しておきます。
<i>（追記）ランド指数で検索したら出てくるのを知った。日本語版Wikipedia早く誰か作って。</i>


Rand indexとは
---
例えばX, Yというふたつの実験でそれぞれ対応するn個のサンプルが、別々にクラスタリングをしたときにも、できるだけ同じようなクラスターに分類されていて欲しいとする。そのような状態を表現する指標がRand indexです。

具体例
---
実際に5回ずつ計測されたX, Yのなんらかのデータをもとに、試しに２つのグループにクラスタリングすると

```
X: 1, 2, 1, 1, 2
Y: 1, 1, 2, 1, 2
```

というクラスに分類されたとする。
ここで、この5つからとりうるすべてのペア間でX, Yにおけるクラスタリングの結果を比較します。
評価の基準は<b>それぞれが同じクラスに入っていたか、そうでないか</b>。
ただそれだけ。

例えば1,2番目のペア同士を比較すると、

```
X: 1 x 2
Y: 1 o 1
```
となり、Xのクラスタリング結果は一致、Yの結果は不一致です。
このようにそれぞれでの一致不一致を調べた結果の個数をContingency tableにまとめる。
例えば上の例は左下のケースとして数えられる。

|　  |Yo  |Yx | |
|---|---|---|---|
|Xo  |1  |3  |4 |
|Xx  |3  |3  |6 |
|    |4  |6  |10|

このテーブルの値をもとにいよいよRand indexを計算する。
このときのテーブルの値を以下のような変数で表現したとき、

|　  |Yo  |Yx |
|---|---|---|
|Xo  |a  |c  |
|Xx  |b  |d  |

Rand indexは下の式で計算ができる。

$$Rand\ index=\frac{(a+d)}{(a+b+c+d)}=\frac{(a+d)}{\binom{n}{2}}$$

実際の値をいれて計算すると、今回のクラスタリング結果のRand indexは
$$=\frac{(1+3)}{(1+3+3+3)}=\frac{(1+3)}{\frac{5\times(5-1)}{2\times 1}}=0.4$$

という値になる。
例では2つのグループへのクラスタリングだったが、実際には任意の数のグループへの分割に対して定義されていて、各X,Yで同じクラスター数である必要もない。

ということで、Rand indexを計算することができるデータセットは

> X, Y二条件において同じ数の（ペアを組んでいる）サンプルが存在する
> X, Yそれぞれで任意の有限個のクラスターへの分類を行う

この２つが前提となります。

ちなみにRの関数は<a href="https://www.rdocumentation.org/packages/fossil/versions/0.3.7/topics/rand.index">これ</a>ですよ。

```
g1 <- sample(1:2, size=10, replace=TRUE)
g2 <- sample(1:3, size=10, replace=TRUE)
rand.index(g1, g2)
```

-> Adjusted Rand Indexへ続く？
Zabbix 4.2インストール、Docker Image作成する

# 概要

Docker CentOS(Official Image)をベースにして、Zabbix 4.2をインストール。
Docker Imageを作成。

## 環境
- Windows 10 Pro
- Windows PowerShell
- Docker Desktop Community Version 2.0.0.3

# 手順
## Docker CentOS(Official Image)準備
PowerShell上
1.

```shell
docker pull centos
```

## コンテナ実行・コンテナに入る
PowerShell上
1.

```shell
docker run --privileged -it -d --name centos7 centos /sbin/init
```
2.

```shell
docker exec -it centos7 /bin/bash
```

## CentOSコンテナ初期処理
コンテナ上
1.
/etc/yum.confの「tsflags=nodocs」コメントアウト
2.

```shell
localedef -f UTF-8 -i ja_JP ja_JP 
```

## MySQLインストール・起動
コンテナ上
1.

```shell
yum -y localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
```
2.

```shell
yum -y install mysql-community-server
```
3.

```shell
systemctl enable mysqld.service
```
4.

```shell
systemctl start mysqld.service
```

## MySQL初期パスワード確認
コンテナ上
1.

```shell
grep password /var/log/mysqld.log
```
例
[shell]2019-04-03T01:41:01.445286Z 1 [Note] A temporary password is generated for root@localhost: DQB>3&GcAhF1[/shell]
「root@localhost: 」の後ろがパスワード
控えておく</li>

## MySQLパスワード変更
コンテナ上
1.

```shell
mysql -uroot -p
```
パスワードを聞かれるので前作業で控えたパスワード入力
2.
mysql上

```shell
set password for root@localhost=password('Zabbix-db-9876');
```

```shell
quit[/shell]
```

## Zabbixインストール
コンテナ上
1.

```shell
rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
```
2.

```shell
yum clean all
```
3.

```shell
yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent
```

## Zabbix DB初期設定
コンテナ上
1.

```shell
mysql -uroot -p
```
パスワードを聞かれるので「Zabbix-db-9876」入力
2.
mysql上
```shell
create database zabbix character set utf8 collate utf8_bin;
```

```shell
grant all privileges on zabbix.* to zabbix@localhost identified by 'Zabbix-db-9876';
```
3.

```shell
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
```

## Zabbix初期設定・起動
コンテナ上
1.
/etc/zabbix/zabbix_server.confに「DBPassword=Zabbix-db-9876」追加
「DBPassword」で検索すると適切な挿入位置は分かる
2.
/etc/httpd/conf.d/zabbix.confの「# php_value date.timezone Europe/Riga」を検索。
コメントを外す
「Europe/Riga」を「Japan」に変更
3.

```shell
systemctl restart zabbix-server zabbix-agent httpd
```
4.

```shell
systemctl enable zabbix-server zabbix-agent httpd
```
5.
コンテナ抜ける

```shell
exit
```

## Docker Image作成
PowerShell上
1.
コンテナ停止

```shell
docker stop centos7
```
2.
Docker Image作成

```shell
docker commit centos7 zabbix4_2-centos7
```

## 作成したImageでコンテナ起動
PowerShell上

```shell
docker run --privileged -it -d -p 7777:80 --rm --name zabbix zabbix4_2-centos7
```
Zabbixアクセス先
http://localhost:7777/zabbix/
となります。

## あとは
Data Volume等でMySQLを永続化すれば。
顧客の勘違い、思い込みにどう対応するか。仮説（32）

仕事の種類によっては、顧客が業務知識に詳しく、設計者がすべて教えてもらって設計する場合がある。

その場合でも、計算機系についての、勘違い、思い込みに従って具体的な指示がある場合には、
その勘違い、思い込みを解消するか、
不明、勘違い、思い込みの結果の具体的な指示を変更してもらうか、
あるいは、具体的な指示をせずに、業務目標の提示にとどめてもらうかなどの方策が必要なことがある。

# 不明
勘違い、思い込み以前の、認識対象として範囲などについての理解がまだないことを自覚している状態。
顧客の認識が不明とは、不明であることを自覚している状態である。顧客の認識が不明であることを自覚していない状態には、勘違い、思い込みが入っていることがある。

# 勘違い
具体的に、実物、動作を見てもらって説明をすれば、理解してもらえるような場合を勘違いとする。

勘違いは、時間と場所と機材があれば、解消することは可能な事項とする。

時間、場所、機材がない場合には、勘違いの解消をせずに先に進まざるをえないことがある。

# 思い込み
具体的に実物、動作を見てもらって説明しても、理解してもらえない場合を思い込みとする。

思い込んだら、論理的な整合性はどのようにでも解釈していってしまうため、容易には解消できない。
思い込みにも何種類かある。

## 系は万全だという思い込み
高いお金を払って作った系は万全だという思い込み。
もっとお金を払ってもらって、もっと万全にする以外に解決策を知らない。

## 系は不完全だという思い込み
系は不完全だから、何をやっても仕方がなく、無駄なことをするなという思い込み。
ご自身で責任をもってすべてのことに対応していただければ問題はない。

系が不完全だから、業務知識で系の不完全さが悪影響を与えないようにすればよい

## 系は自分の思い通りになるという思い込み
系が自分の思い通りにならないのは、人が余分なことをしたり、あるいは必要なことをしないからだという思い込み。

もともとの思い通りには、ならないことを思い込んでいる場合には、対応の仕方がない。

# 逆
顧客の不明、勘違い、思い込みを疑う場合には、
設計者の勘違い、思い違いも同程度に想定するとよい。

## 設計者の不明
設計対象について、よくわかっていないという自覚があれば、設計者の認識の不明とする。

## 設計者の勘違い
設計対象、設計方法、設計道具などについて勘違いがあるかもしれない。
設計対象をよく知らなければ、勘違いというよりも不明である。

## 設計者の思い込み
顧客の思い込みよりも、影響が悪い場合がある。
ありとあらゆる顧客の質問に、一見整合性のある回答をするが、根拠を物理的、論理的、生物的、心理的、社会的には統計・確率をもってしめしていない場合がある。
あるいは、物理的、論理的、生物的、心理的、社会的には統計・確率をもってしめしているために思い込んでいる場合がある。この状態を覆すのは時間がかかる。

# 文書履歴(document history)
ver. 0.01 初稿 20190404早朝
ver. 0.02 設計者の不明、勘違い、思い込み追記 20190404 朝
ver. 0.03 表題追記 20190512

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
defer っぽいもの

プログラミング言語 Go には `defer` という構文があるようです。 私自身は Go を使っていないので感覚としてどの程度便利なものか理解していませんが、 Go の使い手にとってはかなり重要なもののようです。

さて、その `defer` を C++ でも使えたらよいのにという意見をツイッタでふと見かけたので、試しにそれらしいものを書いてみました。

```cpp:defer.h
#ifndef HEADER_7075ab2db3a7279e55c075b6010ee5e0
#define HEADER_7075ab2db3a7279e55c075b6010ee5e0

#include <functional>
#include <type_traits>
#include <utility>

class defer_t {
private:
  std::function<void(void)> f;
public:
  template<class T, class = typename std::enable_if<std::is_void<decltype((std::declval<T>())())>::value>::type>
  defer_t(T const& f) : f(f) {}
  ~defer_t(void) { f(); }
};

#define defer_helper2(line) defer_tmp ## line
#define defer_helper(line) defer_helper2(line)
#define defer defer_t defer_helper(__LINE__) = [&](void)->void

#endif
```

以下のような要領で使うことが出来ます。

```cpp:sample.cpp
#include <iostream>
#include "defer.h"

void test(void) {
  defer {
    std::cout << "test world" << std::endl;
  };
}

void test2(){
  defer {
    std::cout << "test2 world" << std::endl;
  };
}

int main(void) {
  defer {
    std::cout << "world1" << std::endl;
  };
  defer {
    std::cout << "world2" << std::endl;
  };
  test();
  test2();
  std::cout << "world" << std::endl;

  return 0;
}
```

Go では `defer` は有用なものでしょうが、  __C++ での__より良い設計は後始末をデストラクタに押し込めるべきであり、 `defer` のような機能が必要になったとしたらそれは設計がまずいことのサインである可能性が高いです。 しかし、とても残念なことに、設計がまずいライブラリを使わざるを得ないなどということもよくあることで、そのようなときにはこのようなちょっとしたユーティリティが役に立つこともあるかもしれません。
iPadでPaiza.IOを使いたいときの小技

（エディタにaceを採用していてvimバインドが選択できるWebアプリならどこでもこの小技が使えると思います。）

安売りされていたiPad 9.7 2018を購入したので、これだけでいろいろ出来ないか模索中です。

昨今はクラウド開発環境も整ってきてるし余裕なんだろうなあと鷹をくくっていたのですが、いろいろ触ってみた結果わりとまだ茨の道でした。
SafariからクラウドIDEを触っているとどこもかしこもカーソルキーが使えないものばかりなのが深刻すぎます。
カーソルキーが使えないということは編集したい箇所までをBackspaceで消して戻らなければならないということで、正直やってられません。
タブレットなんだからタッチパネルで操作すれば…とも思いますが、コーディングしてると結構細かいのでめちゃめちゃしんどくなります。

VSCodeがブラウザで動くCoderがかなりいい感じに使えそうだったのでカーソルキーの代替にvim拡張を入れたのですが、vim拡張が入ったとたんに動作が激重になって使い物にならなくなりました。なんなんだ。


## iPadでPaiza.IOを使う際の問題
[Paiza.io](https://paiza.io/)
ブラウザ上でコードを書いてぱっと実行できるので簡単な検証をするときに便利なのですが、iPadから使おうと思うと例に漏れず**カーソルキーが反応しません**。また、**Ctrl + 系のショートカットやESCキーも反応しません**。

## 対処
Paiza.IOのエディタ部分はaceを使っているようで、vimバインドが選択できます。
これを使えばNormalモードでカーソル移動ができるのでカーソルキーが使えない問題を解決できます。
（ちなみにCtrl + 系のショートカットも使えない以上emacsバインドでは解決できません。）

ただし、ESCキーも使えないので**一度Insertモードに入ったっきり二度と帰ってこれません**。
これをaceに対してキーマップを追加することで対処します。

1. vimバインドを選択
![696F3114-63A4-405D-9F9E-33D5FA9EFBFD.png](https://qiita-image-store.s3.amazonaws.com/0/204734/eac6c08d-458f-cc5c-5e92-de256922e03a.png)

2. なにをするよりもまず最初に`:imap jj <Esc>`
![14E7378E-5D1B-4C17-9150-AF023EE7C8AE.png](https://qiita-image-store.s3.amazonaws.com/0/204734/24f734b3-96da-72ae-fa5d-55c11fd44143.png)

以降は`jj`でNormalモードに戻れるのでカーソル操作ができます。
ここでうっかりInsertモードに入ってしまったら詰みです。あきらめましょう。  
jjでなくとも構いませんが、特殊キーが使えない以上コーディングの邪魔にならないキーにする必要があります。  
また、`<ESC>`ではダメでした。`<Esc>`です。ace特有？  


なおCtrlが使えないためキーボードからコードの実行はできません。諦めてタッチしましょう。

---

ところで、クラウドIDEのPaizaCloudが公式にiPad対応な感じで書いてあったのですが私の環境ではvimモードがうまく使えませんでした。
PaizaCloudは普段から使っていて、iPadでもそれと同じ環境を使えるととても嬉しいので現在問い合わせ中です。
コブダグラス型生産関数(効用関数)の可視化

# はじめに
初めまして、leisurelyと申します。この記事は、経済学を勉強していく上で逃れることのできない「コブダグラス型生産関数」を3Dグラフを用いて可視化します。
なぜ、この記事を書こうと思ったのか。それは、教科書や講義で先生が黒板に書くコブダグラス型生産関数のグラフがわかりにくいからです。（教科書や先生を批判してるのではなく、紙や黒板という2次元に3次元グラフを描く、かつ初学者に理解してもらうには限界があるということです。）
当然、教科書や黒板のグラフで理解できる方もおられると思います。
それに加え、荒戸寛樹氏（https://twitter.com/hirokiarato ）の一連のツイートでの「Rによるコブダグラス型生産関数の可視化」に感銘を受けたからです。
一連のツイート：
https://twitter.com/hirokiarato/status/1001466936989962240
https://twitter.com/hirokiarato/status/1001482183515586561
https://twitter.com/hirokiarato/status/1001491836785983488

私はRよりもPythonを使うことが多いので、Pythonでの実装を試みました。
実装はJupyter Notebook 上でPythonを用いて行います。

※この記事はプログラミングを学ぶのではなく、プログラミングというツールを用いて経済学をより理解するのが目的です。また、プログラミングわからないけれど結果だけ見たいという方のために、最後に結果を載せています。

##コブダグラス型生産関数
念のため、コブダグラス型生産関数についておさらいをしておきます。生産量をY、資本をK、労働投入量をLとした場合に、

```math

Y=K^{\alpha}  L^{\beta}

```

で示される生産関数のことです。$\alpha$と$\beta$は正の定数を示しています。
$\alpha + \beta = 1$ ならば一次同次関数なります。今回は一次同次関数を扱っていきます。

###コードの実装
さっそくコードの実装を行います。結果だけを見たい人は読み飛ばしていただいて構いません。
コードの実装にあたり「jupyter notebookで触れるプロットを描く（http://ksknw.hatenablog.com/entry/2016/08/04/233103 ）」を参考にさせていただきました。と、言いたいところですが、9割コピペしています。
またコードの説明につきましても必要最小限にとどめています。詳しい説明は上記のURLにてお願いします。
ではコードです。

```Python

%matplotlib notebook
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

def f(k, l):
    return k**(1/2) * l**(1/2)

k = np.arange(0, 100, 2.5)
l = np.arange(0, 100, 2.5)

K, L = np.meshgrid(k, l)
Y = f(K, L)

fig = plt.figure()
ax = Axes3D(fig)

ax.set_xlabel("K")
ax.set_ylabel("L")
ax.set_zlabel("Y")

ax.plot_wireframe(K, L, Y)
plt.show()

```

以上が実装したコードになります。一つだけ説明を行いますと、

```Python
def f(k, l):
    return k**(1/2) * l**(1/2)
```
この関数の定義において$k$, $l$ の指数を変更させることでグラフの形状と任意の$n$次同次関数に変化させることができます。

####結果：可視化されたコブダグラス型生産関数
上記のコードを実行すると以下のようなグラフがプロットされます。![無題4.png](https://qiita-image-store.s3.amazonaws.com/0/391748/b0464ed4-5b0e-76df-8a56-ff27b6a09c85.png)

先生が苦労しつつ黒板に書かれていたグラフだ‼
このグラフは様々な角度から見ることもできます。

以上がコブダグラス型生産関数の可視化になります。
皆様の経済学の勉強の参考になれば幸いです。

2019.08.22追記
メッシュでのプロットでは等量曲線がわかりにくいので等高線によるプロットも行いました。
どちらかというと効用最大化問題の無差別曲線を理解するために書きます。まぁ基本は一緒です。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391748/2fcee375-bd0e-8266-58a4-b117e348000e.png)

![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391748/133b0234-d516-2a90-8e11-64e1b467a784.png)

縦軸・横軸がY・X、高さがUに代わっていますが気にしないでください。（この場合、等量曲線じゃなくて無差別曲線ですね）

```Python
ax.plot_wireframe(K, L, Y)  #これを
ax.contour(K, L, Y, 15)     #これに書き直す。最後の数字は等高線の数
```

コードは上記のコードの一部を書き直してください。
Windows & VS Code で Java12 + Junit5 の環境を作る

## 必要なモノ

* [Apache Maven](http://maven.apache.org/download.cgi)
* [OpenJDK 12](https://jdk.java.net/12/)

`apache-maven-[version]-bin.zip`  
`openjdk-12_windows-x64_bin`  
をダウンロードして展開する。

最終的にこんな配置にしたい

```
C:/
├ java
│ ├ apache-maven-[version]
│ └ jdk-12
│
└ workspace
  └ javaProj
     ├ src
     │ ├ main/java
     │ └ test/java
     └ pom.xml
```

path通すのを忘れずに  
`JAVA_HOME` に `C:/java/jdk-12`  
`MAVEN_HOME` に `C:/java/apache-maven-[version]`  
`PATH` に追加もしておくこと


## VS Code
### 拡張機能
* Java Extension Pack

これインストールしておけばOK
### setting.json
コマンドパレットで`Preferences: Open Settings` ((UI)じゃない方) を開く  
`"java.home": "C:\\java\\jdk-12"`を追加


## junit5
* [GitHub : junit-team/junit5-sample](https://github.com/junit-team/junit5-samples/blob/r5.2.0/junit5-jupiter-starter-maven/pom.xml)

ここの `pom.xml` をコピーして

`project > properties > java.version`を`12`に変更

```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<!-- 略 -->
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>12</java.version>
		<junit.jupiter.version>5.2.0</junit.jupiter.version>
		<junit.platform.version>1.2.0</junit.platform.version>
	</properties>
	<!-- 略-->
</project>
```

cmd とか WPS で 下のコマンド実行

```
> cmd /c mvn install -f "c:\workspace\javaProj\pom.xml"
```


## 準備完了

あとは [Junit公式](https://junit.org/junit5/docs/current/user-guide/#writing-tests) のドキュメント読んでテストを書けば良いと思う。
Win向け通知アプリにトーストを使う

#概要
Windows向け常駐通知アプリを作ろうと思い、悩んだ末に選んだ方法を書きます。なお、近い記事があります。
https://qiita.com/horyu/items/4da2a79c6fa7311d350a
※トーストのクリック処理までしたい人は、先に一番最後の「捕捉」を読んでいただければと思います。

#要件定義
ここで言う私が作りたいアプリは以下のとおりです。

トーストで通知
タスクトレイに常駐
タスクトレイの右クリックで設定等の操作が可能
ウィンドウは非表示

#実装方法の検討
検索してみるとトーストはUWP、タスクトレイはFormでやるのが良さ(楽)そうです。トーストについてはFormでタスクトレイ表示した際のバルーンでも近い事が出来ますが、表示内容については制限があるので、トーストの自由度は魅力的です。しかし、トーストを正しく使うにはUWPで作るしかないように思われました。FormをWindows Application Packaging ProjectでUWP化する手もありますが、公開が面倒ですし、個人的にはちょっとしたアプリにインストールのような操作が発生するのが好きではありません。

#実装方法の選択
結果的にどうしたかと言うと、お行儀が悪く、かつその為にそのうち動作しなくなる可能性もありますが、Formで作りFormのままトーストの表示を行う方法を選択しました。

#手順(VisualStudio2019 Form .Net4.7.2)
Formプロジェクトを右クリックして「プロジェクトのアンロード」
アンロードしたプロジェクトを右クリックして「編集*.csproj」
TargetFrameworkVersionの下あたりに以下を追記
```<TargetPlatformVersion>8.0</TargetPlatformVersion>```
アンロードしたプロジェクトを右クリックして「プロジェクトの再読み込み]
Formプロジェクトを右クリックして「追加」から「参照」
Windowsから「Windows.Data」と「Windows.UI」をチェック
更に参照から以下(例)を追加してチェック
```C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\Facades\System.Runtime.dll```

#コード
```cs
using Windows.UI.Notifications;

var type = ToastTemplateType.ToastText01;
var content = ToastNotificationManager.GetTemplateContent(type);
var text = content.GetElementsByTagName("text").First();
text.AppendChild(content.CreateTextNode("Toast"));
var notifier = ToastNotificationManager.CreateToastNotifier("Microsoft.Windows.Computer");
notifier.Show(new ToastNotification(content));
```
CreateToastNotifierの引数が「お行儀が悪く」の部分です。既存のAppUserModelIdを拝借します。その中でも恐らく確実に存在するであろうものを狙って使います。
![toast.png](https://qiita-image-store.s3.amazonaws.com/0/286581/690f4581-61c5-29cf-cd95-38805ed6ba1a.png)
元々引数なしでもトースト通知の表示が出来たらしいので、今後こうした方法もダメになりそうな気がします。なお、UWPであれば現バージョンでも引数なしでトースト通知が出来ます。

#参考
Formアプリでトースト通知を使う [C#/.NET]
http://aziogroup.blogspot.com/2016/04/cnet.html

Fall Creators Updateを適用するとトースト通知できなくなる
https://qiita.com/akiqsinco/items/0c0d5ae4abc756a594b3

WPF などの .NET Framework のアプリから UWP の API を呼ぶ
https://blog.okazuki.jp/entry/2018/03/29/101601

#余談
開発者が知っておくべき、ライブラリとしてのWindowsランタイム (2/5)
https://www.atmarkit.co.jp/ait/articles/1304/26/news058_2.html
もう2013年と古い記事ですが、「参照するアセンブリについて」の部分が気になりました。
また、詳しく調べていませんが、Windows.winmdは現バージョンだとWindowsから選択できるため不要なのでは？と思います。

#捕捉
トーストへのクリックを処理したいのなら、この記事に書いてある内容では実現できません。
以下を最初から最後まできちんと対応すべきだと思われます。
https://docs.microsoft.com/ja-jp/windows/uwp/design/shell/tiles-and-notifications/send-local-toast-desktop
ただし、この場合は所謂「インストール」が何等かの形で行われる必要があるため、今回の要求は満たせないようです。
あと、タスクトレイというのはどうも正しくない表現だそうです。
https://www.atmarkit.co.jp/ait/articles/1604/19/news009.html
個人的な結論としては、Win10らしい機能が使いたければ大人しくUWPを使いましょう。です。
ValueError: The 'image' attribute has no file associated with it.が出た

imageFieldでアップロードされた画像を表示したかった時、

*ValueError: The 'image' attribute has no file associated with it.*

というエラーが出たので困った。
とりあえずコピペしてググったら
https://stackoverflow.com/questions/15322391/django-the-image-attribute-has-no-file-associated-with-it
ここにそれっぽいことが書いてありそうだったので読むと、

**In your template, check image exist or not first**

つまりimageフィールドに画像があるかチェックする処理をかけってことらしい。

```
{% if p.image %}
   <img src="{{ p.image.url }}" />
{% endif %}
```

書いたら直りました
ゲームを作ってみたい

ゲームをつくっりたい

ファンタジー風だけど絵はかけないからテキストベース
武器と防具を装備してダンジョンをもぐる
分かれ道を選択して進む
敵が出てきたら戦う
1vs1
ターン制
アイテムを拾っても全部テキスト
ボスを倒してお宝を手に入れたら脱出
終り
(睡眠薬をキメて朦朧とした意識のメモ)


2019/04/05 追記
とりあえずメモを分解してみる

・ファンタジー風だけど絵はかけないからテキストベース
→やりたいことと今できるレベルの話

・武器と防具を装備してダンジョンをもぐる
→大雑把なシステムとゲームの主目的

・分かれ道を選択して進む
・敵が出てきたら戦う
→主目的(ダンジョンをもぐる)の中で何をやるか(探索・バトル)

・1vs1
・ターン制
→バトルの中で何をやるか

・アイテムを拾っても全部テキスト
→最初の「やりたいことと今できるレベルの話」と同じ

ボスを倒してお宝を手に入れたら脱出
→主目的の結果

>まずはなにからしよう？

整理すると、大きく3つのパートに分けられそう
1.ダンジョンに潜るための準備パート
2.ダンジョンを潜る探索パート
3.敵と戦うバトルパート

まずは準備パートについて考えてみよう。
ReactNativeのインラインスタイルを整理する

## 概要

これを

```react
<Text style={{fontSize: 20, textAlign: 'center', margin: 10}}>Welcome to React Native!</Text>
```

こんな感じに書きたい。

```react
<Text style={[fs20, tac, m10]}>Welcome to React Native!</Text>
```

イメージはBootstrapにある`m-0` `w-25`など、
ようは汎用CSS、汎用クラスと呼ばれているやつをやりたい。

## 環境

ReactNative 0.59.3

## 方法

`tac` textAlign: 'center'

```react
const _base = StyleSheet.create({
  tac: {
    textAlign: 'center',
  },
});
```

`fs20` fontSize: 20
`m10` margin: 10

```react
const attrs = {
  fontSize: 'fs',
  margin: 'm',
};

const props = [
  10,
  20,
];

const styleGenerator = (attributes, properties) => {
  let hash = {};
  for (attr in attributes) {
    for (i = 0; i < properties.length; i++) {
      let h = {};
      h[attr] = properties[i];
      hash[`${attributes[attr]}${properties[i]}`] = h;
    }
  }
  return hash;
};

const whmp = StyleSheet.create(styleGenerator(attrs, props));
```
1. プロパティと値の配列を用意
2. 1の配列をもとに連想配列を作成
3. StyleSheet.create

### Base.js

最終的にはこんな感じになります。

```react
import { StyleSheet } from 'react-native';

const _base = StyleSheet.create({
  tac: {
    textAlign: 'center',
  },
});

const attrs = {
  fontSize: 'fs',
  margin: 'm',
};

const props = [
  10,
  20,
];

const styleGenerator = (attributes, properties) => {
  let hash = {};
  for (attr in attributes) {
    for (i = 0; i < properties.length; i++) {
      let h = {};
      h[attr] = properties[i];
      hash[`${attributes[attr]}${properties[i]}`] = h;
    }
  }
  return hash;
};

const whmp = StyleSheet.create(styleGenerator(attrs, props));

const base = { ..._base, ...whmp };

export default base;
```
他のプロパティ、値の追加も配列に追記するだけです。

### 使い方

```react

import React, {Component} from 'react';
import {Platform, Text} from 'react-native';
import s from './Base';

type Props = {};
export default class App extends Component<Props> {
  render() {
    return (
      <Text style={[s.fs20, s.tac, s.m10]}>Welcome to React Native!</Text>
    );
  }
}
```

## 最後に

プラットフォーム別に調整しづらい

### 参考

@YutamaKotaro様　[【React-Native】StyleSheetについて](https://qiita.com/YutamaKotaro/items/d0cd253c998f9b28dd55)
truffle network コマンド


# truffle network コマンドの使いどころ
truffleの利点の一つとしてデプロイ自動化は便利ですが、
ganache以外にも、Ropsten、Rinkeby等、複数のテストネットでデプロイをすると、
それぞれにデプロイしたコントラクト・アドレスを覚えておくのは面倒ですよね。

```
truffle migrate --network ganache
truffle migrate --network rinkeby
truffle migrate --network kovan
```
そこでnetworkコマンドです。

```
truffle network
```

networkコマンドを使うと、以下の様な表示となります。
![truffle_network.png](https://qiita-image-store.s3.amazonaws.com/0/280104/61ad305b-d16b-ee24-8169-c6f1a1b6392d.png)

ひとつめの「Network: UNKNOWN (id: 4)」は、
Rnkebyにデプロイされているコントラクト・アドレスです。

ふたつめの「Network: UNKNOWN (id: 42)」は、
Kovanにデプロイされているコントラクト・アドレスです。

みっつめの「Network: UNKNOWN (id: 5777)」は、
テスト用のGanacheですね。これはいらな（

この様に、
色々なテストネットでデプロイされたコントラクトアドレスを後から調べる際には、
networkコマンドを使うと便利です。

## FLOC宣伝
宣伝です＼(^o^)／
FLOC ブロックチェーン大学校・スマートコントラクト開発科、絶賛授業中です！
https://floc.jp/course/engsmart/
en-jpに参加してきました

英語でとにかく会話しよう！アウトプットしよう!という場を設けてくれているen-jpに参加してきました。
https://www.meetup.com/ja-JP/meetup-group-en-jp/

初参加だったのですが、今回は超ビギナーを対象に！という事で非常にいい機会でした。
会の流れは以下でした。
1.短い自己紹介
 introduce yourself in english within 30 second
2.希望者によるLT大会
 LT 3 minute up to about 5 minute
3.フリートーク
 free conversation with other joiners

1の自己紹介で自分のことを軽く紹介するのですが、ここで恥ずかしがってはいけません。
主催者の方から英語で話すにはt伝えるには大きな声で、自信を持って伝えることが大事だと言われました。

2のLT大会ですが、今回は私はトークをしていません。聞いただけです。
が、今回のLTを聞き、次回は自分でも登壇できるのでは？と自信をつけました。
というのも、詰まったときにはここはこう表現するんだよと、主催者の方や他の参加者の方からフォローがあったためです。
次はぜひともやってみたい、と気持ちが前のめりです。

フリートークこれが一番面白かったですね。
ただ英会話なんて普段しませんので、なかなか自分から声をかけられませんでした。
が、積極的に他の参加者の方から話しかけてくれました。
受け身になっててよくないですね…

フリートークの中でも、間違ってもいい、大事なのは会話しようとする情熱や意思だと教わりました。
(ネイティブの方もいらっしゃいました)
実際に自分も相手の質問が聞き取れず、誤った回答をしてしまっていましたが、誰も全然気にしてませんでした。
確かに外国の方が少々誤った日本語で尋ねてきてもだいたいわかりますし、会話が成立しますよね。
それと同じことなんだな、と実感しました。

というわけで、次回も参加しようと思います。
let's join together!
TimeMachineの実行速度を改善 Mac

久々にバックアップしようとしたら**6時間**とか表示されたので、なんとか早くできないか試行錯誤してみた。
結果、**`2時間未満`**でバックアップ完了できたと思う。

# バックアップ開始時

## TimeMachineバックアップの優先度を上げる
コンソールから以下のコマンドで設定可能。

```zsh:TimeMachineのリミッターを無効にする
sudo sysctl debug.lowpri_throttle_enabled=0
```
<details><summary>補足</summary><div>


| Time Machine の動作リミッター | debug.lowpri_throttle_enabled |補足 |
|:-:|:-:|:-:|
|  有効 | 1  |通常の状態|
|  無効 |0  |TimeMachine動作が最優先|

`バックアップ以外の動作が遅くなるので、併用作業には向いてない。
集中してバックアップ動作のみさせたいときに実施`

```zsh:
$ sudo sysctl debug.lowpri_throttle_enabled=0
debug.lowpri_throttle_enabled: 1 -> 0
```
</div></details>


<details><summary>**`おまけ`**</summary><div>

# バックアップデータにインデックス設定しないように除外設定
まず
`環境設定　⇨ Spotlight ⇨ プライバシー　⇨ （左下の）＋`
で、バックアップ先のHDDを選択しておく。
 
そのあとはターミナルからコマンド実行

```zsh:確認
$ mdutil -sa
/:
	Indexing enabled.
/Volumes/WD 25A2:
	Indexing and searching disabled.
/Volumes/WD 25A2/Backups.backupdb:
	Indexing enabled.
/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/MacBook Pro 2015/2019-04-03-224640/Macintosh HD:
	Index is read-only.
```
バックアップ先のHDD内ファイルにインデックスが貼られている（＝除外設定されていない）ので、コマンドで直接除外設定をする
`sudo mdutil -i off /Volumes/HDD_NAME/Backups.backupdb`

※　`HDD_NAME`を適宜、自分の環境のHDD名に変更して実行させる
　　自分の環境では WD25A2 だったので　⇨ `WD\ 25A2`

```zsh:
$ sudo mdutil -i off /Volumes/WD\ 25A2/Backups.backupdb
/Volumes/WD 25A2/Backups.backupdb:
2019-04-03 23:44:29.983 mdutil[3377:53961] mdutil disabling Spotlight: /Volumes/WD 25A2/Backups.backupdb -> kMDConfigSearchLevelFSSearchOnly
	Indexing enabled.
```
```zsh:確認
$ mdutil -sa
/:
	Indexing enabled.
/Volumes/WD 25A2:
	Indexing and searching disabled.
/Volumes/WD 25A2/Backups.backupdb:
	Indexing enabled.
/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/MacBook Pro 2015/2019-04-03-224640/Macintosh HD:
	Index is read-only.
```
表示文言的にはまだ除外されてないように見えるが、これでバックアップの進捗速度は向上するはず。

</div></details>

# バックアップ終了後

## 優先度（リミッター）設定を通常（有効）に戻しておく
```zsh:TimeMachineのリミッターを有効にする
$ sudo sysctl debug.lowpri_throttle_enabled=1
debug.lowpri_throttle_enabled: 0 -> 1
```

# 参考
>
[MacのTimeMachineが遅い時の対処法 | D-Box](https://do-zan.com/mac-timemachine-cope-delay/#toc_container)
[Macに本気を出させてTime Machineバックアップを高速化するコマンド | ライフハッカー［日本版］](https://www.lifehacker.jp/2016/08/160831_timemachine_command.html)
Code Star "AWS CodeStar encountered an error while handling your request: Rate exceeded"の解決方法

#現象
よくわからないエラーが出た。

```text:errorlog
AWS CodeStar encountered an error while handling your request: 
Rate exceeded (Service: AmazonCloudFormation; Status Code: 400; 
Error Code: Throttling; Request ID: 818a97be-561b-11e9-acb7-a97b6a8e0345). 
Try again with different parameters, or contact AWS Support.
```

特徴として、

- ネストスタックを利用しているときにしか出ない(単一のスタックを利用しているときは出ない)
- どのスタックで発生するかは不定(スタックAで出たと思ったら次にスタックBで同じエラーが発生することがある)
- 一度発生するとどれだけ時間を開けても再度同じエラーが発生する(私の場合、1週間おいてみたがだめだった)

という点が挙げられる。

APIの上限かなと思い、ドキュメントを斜め読みするが項目は見つけられなかった。

公式フォーラムを見ても、回答されていないエラーだった。
https://forums.aws.amazon.com/thread.jspa?messageID=896014&#896014

#原因?
少し調べていると、Stack Overflowに同じ質問がされていた。

- [AWS CloudFormation Rate Exceeded](https://stackoverflow.com/questions/53420972/aws-cloudformation-rate-exceeded)

以下適当に訳して抜粋すると、

- CloudFormation APIが 原因ではない
- Jenkins(継続的インテグレーション用のオープンソフトらしい)パイプラインが数秒ごとにステータスを取得していることが原因と考えられる。
- 複数のスタックを操作しているときに発生する
- おそらくJenkinsのCloudFormationプラグインのバグが原因だろう。
- 想定以上に時間がかかりょうなら、ステータスを頻繁に取得しないようにする必要がある。

最後の方にヒントっぽいことが書いてあったが、今の自分ではできそうにないので割愛

#対策
[2019/4/17追記]
この対策を施しても同じエラーが発生した。
もう少しフォーラムを漁ってみると、なぜかは分からないがデフォルトで入っている`Transform: AWS::CodeStar`を消せば良いっぽい。
現に、その対策を施したところ、今の所同様のエラーは発生していない。

```yaml:template.yml
Transform:
  - AWS::Serverless-2016-10-31
  #Comment out this
  #- AWS::CodeStar
  

```

[AWS Lambda scheduled with CodeStar: SyncResources com.amazon.coral.service.InternalFailure](https://stackoverflow.com/questions/43672087/aws-lambda-scheduled-with-codestar-syncresources-com-amazon-coral-service-inter)

CodeStarはまだドキュメントが未整備な部分が多いのでこのぐらいのバグはしゃーないか

~~全てのテンプレートファイルに、以下の記述を追加したところ、ひとまず解決した。~~

```yml:template.yml
Globals:
  Function:
    AutoPublishAlias: live
    DeploymentPreference:
      Enabled: true
      Type: Canary10Percent5Minutes
      Role: !Ref CodeDeployRole
```
~~初期ファイルに書かれている項目だったので、もしかしてと思ったらエラーは収まった。
どうもLambdaをデプロイする際のCodeDeployの設定らしいが・・・何のことかさっぱり~~

- [AWS Lambda プロジェクトのトラフィックを移行する](https://docs.aws.amazon.com/ja_jp/codestar/latest/userguide/how-to-modify-serverless-project.html)

どなたか詳しい人がいれば教えてください。
バイナリを見て文字コードを判別する方法

最近文字コードの勉強をしたところ、人力でもある程度は文字コードを判別できそうな気がしてきたのでやってみました。
サーバ上のコンフィグやらスクリプトやらのコメントが文字化けしたときに、さくっと文字コードを当てられたりしたらかっこいいですよね。

今回は日本語の文章が次のうちのどの文字コードか判別したいと思います。

* UTF-8
* EUC-JP
* Shift_JIS
* ISO-2022-JP

なお、この記事で言う「日本語」とは以下の文字を指すことにします。

* 全角ひらがな
* 全角カタカナ
* 漢字(JIS第1水準くらいまでをイメージ)
。
ただ実際の文章では日本語だけでなく半角英数字が混ざっていることも多いかと思うので、例文は以下にしました。

```
2019年5月より元号は令和<REIWA>
```

この文章をiconvでいろいろな文字コードに変換し、hexdumpでバイナリを読み解いていきます。

※この記事は正確には正しくない表現があるかもしれません。hexdumpを軽く見てなんとなく文字コードがわかればいいな程度に書いています。

## Step0 hexdumpについて
hexdumpはバイナリデータを16進数で表示させることができるツールです。
`-C`オプションをつけないと2バイトごとに順序が入れ替わって表示されるようなので注意してください。

## Step1 ISO-2022-JPか？
まずは4つの文字コードの中で、最もわかりやすい気がしているISO-2022-JPから見ていきます。

この文字コードはSMTPなどで日本語をやり取りできるように1バイトのうち7ビットまでしか使われていません。
つまり、最上位の1ビットは常に0。16進数に変換すると0x80から0xFFまでは一切使用しません。
hexdumpの結果を見て、日本語の文章であるはずなのに0x7F以下の値しか登場しなければISO-2022-JPであると判断できます。

```
$ echo "元号は2019年5月より令和<REIWA>" | iconv -t ISO-2022-JP | hexdump -C
00000000  1b 24 42 38 35 39 66 24  4f 1b 28 42 32 30 31 39  |.$B859f$O.(B2019|
00000010  1b 24 42 47 2f 1b 28 42  35 1b 24 42 37 6e 24 68  |.$BG/.(B5.$B7n$h|
00000020  24 6a 4e 61 4f 42 1b 28  42 3c 52 45 49 57 41 3e  |$jNaOB.(B<REIWA>|
00000030  0a                                                |.|
00000031
```

## Step2 UTF-8か？
これも比較的わかりやすい気がしています。
ただあまりメジャーではない漢字や絵文字などが含まれていると、必ずしもここに書いたとおりではないかもしれません。

UTF-8の日本語はだいたい先頭の4ビットが0xEから始まる3バイトであることが多いです。
つまり、頻繁に0xE? ?? ??が何度も繰り返し登場してきたときはUTF-8の可能性が高いと言えるでしょう。

また、UTF-8はASCIIコードと互換性があるので半角英数字は必ず最上位ビットが0の1バイトで表現されます。
したがって日本語の文章の中に半角英数字が混ざっていれば0x7F以下のバイトも登場します。

```
$ echo "元号は2019年5月より令和<REIWA>" | iconv -t UTF-8 | hexdump -C
00000000  e5 85 83 e5 8f b7 e3 81  af 32 30 31 39 e5 b9 b4  |.........2019...|
00000010  35 e6 9c 88 e3 82 88 e3  82 8a e4 bb a4 e5 92 8c  |5...............|
00000020  3c 52 45 49 57 41 3e 0a                           |<REIWA>.|
00000028
```

## Step3 EUC-JPか？
EUC-JPでは、日本語は最上位ビットが常に1である2バイトのコートで表されます。ただし諸事象あって0x80から0xA0までは使用されません。
したがって先頭の文字が0xA以上のバイトが偶数個並んでいればEUC-JPの可能性があります。
※ただしまれに0x8Eか0x8Fが登場する場合があります。

またEUC-JPもASCIIコードと互換性があるので、半角英数字が文章に混ざっていれば、そこだけは0x7F以下になります。

```
$ echo "元号は2019年5月より令和<REIWA>" | iconv -t EUC-JP | hexdump -C
00000000  b8 b5 b9 e6 a4 cf 32 30  31 39 c7 af 35 b7 ee a4  |......2019..5...|
00000010  e8 a4 ea ce e1 cf c2 3c  52 45 49 57 41 3e 0a     |.......<REIWA>.|
0000001f
```

## Step4 Shift_JISか？
Shift_JISは一番掴みどころがない印象です。というわけでやっつけ感がありますが、一番最後まで残ればShift_JIS。

一応EUC-JPと異なる点を書いておくと、2バイトで日本語一文字ではあるんですが、2バイト目の最上位ビットが0になる可能性があります。
つまり先頭の文字が0x80以上のバイトが奇数個並んでいればShift_JISの可能性があります。
※まれに8Eか8Fが登場したせいでEUC-JPも奇数個になってしまう可能性はある。

また、半角カタカナを使用しなければ0xA0から0xDFが登場することがない点もEUC-JPと異なります。

```
$ echo "元号は2019年5月より令和<REIWA>" | iconv -t SJIS | hexdump -C
00000000  8c b3 8d 86 82 cd 32 30  31 39 94 4e 35 8c 8e 82  |......2019.N5...|
00000010  e6 82 e8 97 df 98 61 3c  52 45 49 57 41 3e 0a     |......a<REIWA>.|
0000001f
```

## まとめ
Shift_JISとEUC-JPの切り分けがイマイチな感じになってしまいました。もっとわかりやすくまとめられたら、、、

本題とは関係ないですが、hexdumpの横っちょにASCIIで表示された様子をみて、なるほどISO-2022-JPとShift_JISはASCIIとの互換性がイマイチだなと実感しました。

ちなみにこの記事の内容は以下の書籍で勉強させていただきました。
文字コードについてもっと詳しくまとめられていておすすめです。
https://gihyo.jp/book/2019/978-4-297-10291-3
Pythonの条件式結果を変数に代入する

# はじめに
Atcoderで問題を解いていた時、
"ある条件が真の場合は`変数+1`,偽の場合は`変数-1`"
としたい時、下記のように記載していましたが、
三項演算子で1行でまとめられないかと考えました。

```python:sample1.py
if a < b:
	x += 1
else:
	x -= 1
```

# 環境
Python 3.7.0

# 結論
`=`のところを`+=`や`*=`のように代入演算子に置き換えると演算が行われます。

```python:sample2.py
x += 1 if a <= b else -1
```
軽く試してみた感じ、代入演算子は一通り使えそうです
`+=,-=,*=,/=,%=,**=,//=,&=,|=,^=,<<=,>>=`

# おまけ
関数を設定することも可能なようです。

```python:sample2.py
hoge() if flag1 else piyo()
```


# おわりに
三項演算子は`=`による代入しかできないと思ってました。
やってみるものですね。
FreeBSD 12.0 で xfs を mount した

pkg search xfs すると xfsprogs というそれらしいのが見つかったのだが、結論から言うとこれは罠だった。
fusefs-lkl で幸せになれる。

~~~
$ sudo pkg install fusefs-lkl
$ sudo kldload fuse
$ sudo lklfuse -o type=xfs /dev/ada1p2 /mnt
~~~

xfs 以外にも ext4 やら brtfs やらにも対応してるみたい。
AWSでEC2のインスタンスプロファイルに付いているインラインポリシーを、jsonファイルでごそっと抜いて来るのよ　Rubyで



神様の作ったこの世界に生きていると、様々なことを感じ、また、考えますよね〜


最近私は「AWSでEC2のインスタンスプロファイルに付いているインラインポリシーを、jsonファイルでごそっと抜いて来よう！」などと考えました
なにしろ沢山あって、AWSマネジメントコンソールで見ていると、異なる世界に連れて行かれそうになったのです
そう、異なる世界もまた、神様によって作られたのでしょう

RubyのSDKを使いました
なお、次回は、抜いてきたjsonを編集し、そのjsonを使ってポリシーを変更するスクリプトを載せようと思っています


以下を参考にしました

Class: Aws::IAM::Client
https://docs.aws.amazon.com/sdkforruby/api/Aws/IAM/Client.html

AWS SDK for Ruby の設定
https://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v3/developer-guide/setup-config.html

```ruby
#! /bin/sh
exec ruby -S -x "$0" "$@"
#! ruby

##### 使い方 #####
# 下記のようにシェルから実行する(第一引数：スイッチ先アカウント番号、第二引数：セッション名)
# ruby iam-inline-policy-doc.rb xxxxxxxxxxxx xxxx >result.json
#
# 確認環境
# ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
#################

require 'aws-sdk'

# 第一引数のROロールにスイッチロールする セッション名は第二引数
role_credentials = Aws::AssumeRoleCredentials.new(
  client: Aws::STS::Client.new,
  role_arn: "arn:aws:iam::#{ARGV[0]}:role/xxxx",
  role_session_name: "#{ARGV[1]}"
)

# IAMクライアント作成
iam = Aws::IAM::Client.new(credentials: role_credentials)

# インスタンスプロファイルに付いているインラインポリシーを、jsonファイルでごそっと抜いてくる
# 標準出力にも出す
iam.list_instance_profiles().instance_profiles.map do |n|
    profilename = n.roles[0].role_name
    iam.list_role_policies({
      role_name: profilename,
    }).map do |n|
        policyname_list = n.policy_names
        if not policyname_list.empty?
            policyname_list.each do |n|
                policyname = n
                get_role_policy = iam.get_role_policy({
                  role_name: profilename,
                  policy_name: policyname,
                })
                role__name = get_role_policy.role_name
                policy__name = get_role_policy.policy_name
                outputjson = role__name + "--" + policy__name + ".json"
                outjson = URI.decode_www_form_component(get_role_policy.policy_document)
                outputdoc = JSON.pretty_generate(JSON.parse(outjson))
                File.open(outputjson, "a") do |f|
                    f.puts outputdoc
                end
                puts
                puts
                puts
                puts
                puts role__name
                puts policy__name
                puts outputdoc
            end
        end
    end
end






```
GoでParquetを作成してみたかった（断念）

#GoでParquetは作成できるのか
RedshiftSのボトルネックであるディスク容量制限を緩和すべく、Spectrumの導入を検討。
カラムナフォーマットのParquetをどの言語で書けばよいか調査。
第1候補はWebでよくヒットするPython
第2候補は並行処理が容易なGo
GoでParquetを作成する情報がヒットしなかったので、備忘録としてメモ

#Git探索
google先生にGoでParquet作成する質問をしまくり、何とか2つを発見。
1.  [GitHub xitongsys/parquet-go/](https://github.com/xitongsys/parquet-go)&nbsp;&nbsp;Golang version of Read/Write parquet file
2. [GitHub appache/arrow/go/](https://github.com/apache/arrow/tree/master/go)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Appache Arrowの公式GitHub

## 上記GitHubのParquetファイル対応比較
\[1\] 読込：OK&nbsp;&nbsp;&nbsp;&nbsp;作成：OK&nbsp;&nbsp;&nbsp;&nbsp;Null対応：NG
\[2\] 読込：OK&nbsp;&nbsp;&nbsp;&nbsp;作成：NG&nbsp;&nbsp;&nbsp;&nbsp;Null対応：OK

\[1\]はParquetファイル作成は可能だが、Nullは書込不可。
回避方法としては、NULLを##NULL##のように文字列で表現し、Parquetの全フィールドを
文字列化する
逆に、\[2\]はParquetファイル作成は不可だが、Nullは対応済み。
メモリ上で展開するだけなら、\[2\]が使えるが片手落ちな気が…。

#【結論】現状（2019年4月時点）ではReadのみ対応
素直にPython（fastparquet or PySpark or PyArrow）使うのがよさげです。
Raspberry Pi 3 Model B+にRaspbianをモニタ・キーボードなしでインストールする

#用意するもの
・PC（今回はWindows10で作業します。）
・Raspberry Pi 3 Model B+
・MicroSDカード
#インストール手順
1.Raspbianを公式サイトよりダウンロード
https://www.raspberrypi.org/downloads/raspbian/

今回はデスクトップ環境は必要ないため、こちらのRaspbian Stretch Liteをダウンロードします。
![dl.PNG](https://qiita-image-store.s3.amazonaws.com/0/217010/e0f7e01e-0b32-df39-139b-cd336640e979.png)

ただし、ここからのダウンロードはすごく時間がかかることがあるので、その場合は日本にあるミラーサイトからのダウンロードをお勧めします。
http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/

2.Etcherのダウンロード
OSイメージをSDカードに書き込むためのフリーソフトです。
https://www.balena.io/etcher/

Portable版を選択すればexeをダウンロードするだけで使用できます。
![ec.PNG](https://qiita-image-store.s3.amazonaws.com/0/217010/0f1f0569-c1bd-0d2d-5bf0-a49347575e06.png)

3.SDカードをパソコンに接続します。

4.Etcherを起動しダウンロードしたOSイメージをSDカードに書き込む。

Etcherを起動し
![ec2.PNG](https://qiita-image-store.s3.amazonaws.com/0/217010/b94d4c53-243c-d807-e9e9-420db3b4bcd5.png)

ダウンロードしたOSを選択する。
![img.PNG](https://qiita-image-store.s3.amazonaws.com/0/217010/b56f1349-9d82-2ed8-12d1-8698c029dccb.png)

SDカードを選択し書き込み開始。
![ec3.PNG](https://qiita-image-store.s3.amazonaws.com/0/217010/31b4059f-c14a-08d1-cbac-7ffb79eac69c.png)

書き込み中
![wop.PNG](https://qiita-image-store.s3.amazonaws.com/0/217010/8b51ae4c-113d-2fab-8ef0-5441cec195aa.png)

この画面が出れば完了です。SDカードが自動でパソコンから非接続の状態になります。
![ok.PNG](https://qiita-image-store.s3.amazonaws.com/0/217010/76b25e4f-9c76-91a1-02d0-479e4cbf68a8.png)

5.SDカードをパソコンに差し直す。
6.エクスプローラでSDカードを開き、sshという名前の空ファイルをSDカードの直下に作成する。
![ssh.PNG](https://qiita-image-store.s3.amazonaws.com/0/217010/a40d5390-6e85-7e59-3956-dda8e7a456d0.png)

7.Raspberryを起動する。
SDカードをパソコンから抜き、Raspberryに挿します。
その後、Raspberryを起動します。

8.SSH接続を行う。
コマンドプロンプトやPowerShellを使ってSSH接続を行います。
　ssh pi@raspberrypi.local
　パスワード：raspberry

もしraspberrypi.localでホスト名が解決できない場合はIPアドレスを調べる必要があります。
Androidをお持ちの方はFingというスマホアプリを使えば簡単に調べることができます。
https://play.google.com/store/apps/details?id=com.overlook.android.fing&hl=ja


![ss.PNG](https://qiita-image-store.s3.amazonaws.com/0/217010/c6f88b14-88a5-9b93-f398-43e208955ae1.png)
人事考課の時期なので『プログラマのためのサバイバルマニュアル』の「人事考課を勝ち抜く」を読む

4月といえば人事考課の時期なので『プログラマのためのサバイバルマニュアル』の一節である「人事考課を勝ち抜く」を再読しました。
人事考課を勝ち抜きたいみなさんのためにもまとめておきます。

新入社員のみなさんもいずれ通る道なので頭の隅にでもおいておくといいかも。

#対象読者
人事考課を受ける人全般(ただし管理職を除く)。
あくまで管理職から評価を受ける人向けの内容です。

#『プログラマのためのサバイバルマニュアル』って？
プログラマとして働き始めた人向けの、プログラマとして生き残るための指南書です。
プログラマとしての心構えや働き方全般、更には簡単な社内営業に至るまで書かれた良書です。

[Amazon プログラマのためのサバイバルマニュアル](https://amzn.to/2UqVIGk)

以下、該当箇所のまとめです。

#人事考課のメカニズム
管理職にとって年1回の部下全員の評価をどう書くのは悩みの種である。
プログラマの能力を定量的に評価するのは難しい。
それは基本的に上司の問題だが、評価を受ける私たちができることは、そんな哀れな上司に**_可能な限り最高の情報を提供して、可能な限りよい評価を受けること_**である。

人事考課の目的は、誰が頑張って誰がそうでないかを把握することである。
企業は頑張った人に褒美を与え、そうでない人にはそれなりの対応をしなければならない。
あなたの上司には、誰が成績上位者で誰が下位かを記録する、という仕事が課せられている。

##自己評価
まず人事考課のアプローチとして、フォーマルな感じで「あなたが最近会社のためにしたことは何ですか？」と書かれたフォームが渡される。
ここに記入した内容は正式な評価書にコピペされる可能性が十分にあるので真剣に取り組んだ方がよい。

書くべきことは以下の5つ。
- 作業の質
- 作業量
- 適時性
- コスト削減
- チームへの貢献

以下に簡単にまとめる。

###作業の質
しっかりしたコードを書いていることを証明できる情報。
コード行あたりのエラー率、フィックスしたバグの数、書いたテストケースなど。
定量的なことでなくても、同僚からの好意的なコメントや改善したことなどでも可。

###作業量
どれだけ仕事をしたか。
完成させた機能の数、出荷された製品、ソースコードのコミット回数など。
バージョン管理システムの機能を活用しよう。

###適時生
納期を守れたか。
守れていたなら自己評価の中で報告する。

###コスト削減
コスト削減、省力化につながる成果。
管理職は常にコスト削減の方法を探しているので、それらのことで成果があれば報告する。

###チームへの貢献
チームや上司の評価につながる成果。
自分の成果だけでなく、自分の働きがチームや上司の評判につながったものがあれば報告する。

なお、これらはどれくらい具体的に書けばよいかを管理職に確認すること。
また、複数成果があればより良いものを書き、逆に書くネタがない場合はメールやバージョン管理システムの履歴を漁ってネタを集めよう。

##360度評価
同僚に評価を丸投げする方法もある。
いっしょに仕事をした別部門の同僚数人に、あなたの評価を尋ねる。
ヒアリングする先の候補を管理職から尋ねられるかも知れないので、自分の味方になってくれる人たちをあらかじめ把握しておくこと（普段からいろんなところに顔を出して味方をつくっておくこと）。

##管理職の評価
自己評価、360度評価など、他の人々が書いた評価をできる限り集めた後、最後に管理職が最終的な評価を書く。
だいたいは本人の自己評価に管理職のコメント、360度評価のコメントをつけたものになる。
なお、**_管理職はここですばらしい文章を書いたところで給料があがるわけではない_**。

##ランキング
人事部門は各チームのメンバーの成績は少数のスター、少数の落伍者、多数の普通の人、最悪のグループの4つから構成されていると決めつけているので、管理職はそれに合わせて部下をランク付けしなければならない。

評価の結果はあなたが4ランクのどこに属しているかで（直接的あるいは間接的に）表される。

実は**_すべての管理職は部下のランク付けを嫌がっている_**。
彼らはすばらしいチームを作るために多大な努力をしているのに、人事部門から「落伍者がいるはずだ」と言われたら嫌になるのは当たり前である。

##昇進
誰を昇進させるかについては、最近の人事考課の結果は間違いなく考慮される。
また、昇進したい役割を獲得する前からその役割に求められる行動をしているかも考慮される。
具体的には、テクニカルリーダーの候補を探す際は、あなたがすでにテクニカルリーダーと同じような仕事をしていれば、候補の筆頭になりやすい。
これについてはあなたの努力を反映させられる。

##課題（宿題）
- 自分の成果を記録し、自己評価を書く際に掘り出す
- 人事考課の時期が近付いたら、360度評価のヒアリング先になってくれる人を考えておき、引き受けてもらえるようにしておく
- 人事考課の1か月ほど前になったら管理職に雑談として、自分の仕事ぶりと改善点について尋ねておく

***
以上、まとめでした。

これら以外に個人的にしておくといいと思うのは、出世している先輩や上司に、評価される自己評価の書き方のレクチャーを受けることです。
出世している人たちに自己評価の書き方が下手な人は（権力による働きかけがない限り）基本的にいないので、参考になります。

私自身、人事考課を勝ち抜けているかは疑問ですが、一人でも多くの頑張ったエンジニアが勝ち抜くための参考になれば幸いです。
nginxで永遠に特定のページにリダイレクト


rootにリダイレクトさせたいパス、indexにファイル名を記入する

```
server {
    listen 80;
    server_name example.com;
    index index.php;
    error_log /path/to/example.error.log;
    access_log /path/to/example.access.log;
    root /path/to/public;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ \.php {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_index index.php;
        fastcgi_pass 127.0.0.1:9000;
    }
}
```

# 出たエラー

- 502エラー
  - fastcgi_passがうまく通ってなかった

- dockerでnginx(webサーバ)が立ち上がらない
  - エラーログ、アクセスログのパスが間違っている
  - Httpディレクティブ内にserverディレクティブが入っていない


# うまく立ち上がらないとき

docker環境下で、何が原因かわからないが、立ち上がらないときは
```docker-compose up --build```
で、監視する
CycleGANを用いたスタイル変換 (2) リベンジ編

[CycleGANを用いたスタイル変換](https://kiyo.qrunch.io/entries/r5nmsjIrdjGFHbdF)の続きです。

Cycle GANを使ってチーズケーキの画像⇔チョコレートケーキの画像ということをやりたかったのですが、前回記事を見てもらえばわかるように、あんまり上手くいっていませんでした。

結論だけ先に言ってしまうと、Normalization を Batch Normalization から Instance Normalization に変えたらいい感じの変換ができるようになりました。GPU のメモリの都合上、ミニバッチサイズが4 (チーズケーキとチョコレートケーキの画像を4枚ずつ) のような形になっていたので、流石にバッチサイズが小さすぎたのでしょう。
![e24d1656f781fa69647da9540211838e.jpg](https://qiita-image-store.s3.amazonaws.com/0/134222/ca7be977-ce8e-79b8-f3d9-f302284e0733.jpeg)

![0ae80bcb76af6aa31c8e869396e43fc4.jpg](https://qiita-image-store.s3.amazonaws.com/0/134222/4112a5be-251b-3079-245b-da6b39f0ebdc.jpeg)

風景写真⇔MtGのイラストについても前よりは雰囲気出てます。
![240563409b69dd7cc477f27c1caba2df.jpg](https://qiita-image-store.s3.amazonaws.com/0/134222/505ee440-a7b4-7291-df5d-6c397f69951c.jpeg)
![feabd07055a6b2c5e1a0f768101e04e9.jpg](https://qiita-image-store.s3.amazonaws.com/0/134222/5ed8b3c5-6d41-6760-11f5-5691d2cb8bd7.jpeg)
![a753aa6b28c889f476789ea7c0479cfb.jpg](https://qiita-image-store.s3.amazonaws.com/0/134222/9ec27b9a-4a23-b458-2539-77a851fe25db.jpeg)


使ったコードは[こちら](https://github.com/kiyohiro8/CycleGAN-pytorch)に置いておきました。
今回はPyTorchでの実装です。

Normalization についても勉強して何か書きたいですね。

(2019年3月18日追記)
Pytorch 版で BatchNormalization 使った場合の結果について載せておくのを忘れたのでちょっと追記。

<img width="160" alt="ff9fe7a395087a753e594d2a5c586766.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/134222/06405ae8-d3c1-b0e7-a27f-660e6cff0ba8.jpeg">
![aa12896562e8304056294c278bc48b3b.jpg](https://qiita-image-store.s3.amazonaws.com/0/134222/5d06392b-5da1-06a5-34db-2284eecafa9c.jpeg)


こんな感じなのでやっぱりあまり上手くいってないですね。
FireAlpacaが開けない時の対処法

画像の加工等に良く使うFireAlpaca。
macでダウンロードしたらアプリが開けなかった。
対処法は以下の動画の通り、2本指でクリック→開くでいけました。
https://matome.naver.jp/odai/2142382337712956301/2148395051995935203
Windows同士でファイルを簡単に共有する

#あらすじ
Windows10同士でファイルを共有する方法は多々あるが
いろいろ試した中でとても簡単だった方法を紹介したい

対象はそこそこできる人なので、難しくても、他にもっと簡単なのがあっても許して

#やること（アクセスされるPC）
1. エクスプローラーを開く
2. 共有するファイルorフォルダのプロパティを開く
3. 「共有」の「詳細な共有」を実行
4. 「このフォルダーを共有する」をチェック（と共有名を確認）
5. 更に「アクセス許可」を選択し、アクセスを許可するグループorユーザの権限を設定
6. 全て適用orOKで完了

#やること（アクセスするPC）
1. エクスプローラーを開く
2. 「\\"アクセスされるPCのIPアドレス"\」にアクセス
3. 設定を行ったフォルダが、共有名で表示されるので選択
4. ユーザ名とパスワードを入力して完了

#+ワンステップ
![pc.png](https://qiita-image-store.s3.amazonaws.com/0/167549/2682a9b4-eb99-6a94-c010-8465e2c80989.png)
エクスプローラーのPCのこの画面の「コンピュータ」の「ネットワークドライブの割り当て」を選択して、ドライブとフォルダーの設定を行うことで、新しいドライブとして登録できて、とても使いやすくなる

#さいごに
WidnowsでSSHのポート開放してサーバーを立てるとか面倒だし、知らないだけでWindowsには便利な機能が結構あるし、広まってみんな楽して幸せになれたらいいですね
Android Handler Looper と　runOnUiThread　の比較

###UI スレッド以外のスレッドから呼び出す時は、下記２つの書き方は同じものです。

```java:Looper.getMainLooper()

Runnable task = getTask();
new Handler(Looper.getMainLooper()).post(task);

```

```java:Activity#runOnUiThread()
Runnable task = getTask();
runOnUiThread(task);

```

###UIスレッドから呼び出す時は、下記のソースにより、runOnUiThreadの場合は直接UIスレッドに実行されます。

```java 
public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else { //UIスレッドの場合は直接実行する
        action.run();
    }
}
```
マイグレーションファイルについて

#マイグレーションファイルとは
Railsにて、データベースを扱う場合は必ず避けて通れないもの、それがマイグレーションファイルです。

データベースが白紙のノートだとしたら、そこに上から小さな紙を貼り付けて、罫線を引く感じですかね。

そうすることで、もしもそのデータが要らなくなった時に、貼り付けた紙を剥がすだけで良くなります。

データベースに直接書き込むと、それを消すのが大変なことはなんとなく想像できるかと思います。

#具体的なマイグレーションファイルの使い方
イメージだけでは意味がありませんので、実際にマイグレーションファイルを利用する流れをお伝えしていきます。

以下はターミナルの記述です。
まず、アプリを作ります。


```Ruby:
bin/rails new sample
```

次に、モデルを作ります。
設計図のようなものです。

```Ruby:
bin/rails generate model User name:string age:integer
```

そして、このタイミングで実は、マイグレーションファイルが出来上がっています。

```Ruby:db/migrate/20190205132111_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :name
      t.integer :age
 
      t.timestamps
    end
  end
end
```

小さな紙が今、データベースに貼られましたね！
あとは、好きに書き込んでいくわけですが、実は、まだ今の段階では下書きだと思ってください。

この後に消せないボールペンでなぞっていきます。
正直、この段階である程度データベースのカラムは決めておいた方が良いです。
（オプション追加や、indexをつけるなら、この段階で！！）

なぜなら、消せないボールペンでなぞってしまうと、それを書き換えるのは非常に骨が折れるからです。
効率的ではないと思います。


```Ruby:
bin/rake db:migrate
```

消せないボールペンで書きました。
このコマンドを行うと、ついにデータベースの体裁が整います。



#マイグレーションファイルの状態確認
マイグレーションファイルが増えてくると、今が下書きなのか、本書きなのか分からなくなります。
そんな時には、現在のデータベースの状態を確認しましょう。

##schema.rb
このファイルを覗くと、マイグレーションファイルでどんな下書きをしたのか見ることができます。
下書き（マイグレーションファイル）が多数ある場合は、ここで最終的にどのように本書きされたのか見ておくと良いでしょう。

```Ruby:db/schema.rb
ActiveRecord::Schema.define(version: 2019_04_03_143620) do

  create_table "users", force: :cascade do |t|
      t.string "name"
      t.integer "age"
      t.datetime "created_at", null: false
      t.datetime "updated_at", null: false
  end

end
```

データベースにカラム"nam"や"age"が登録されているのが分かりますね。


##rake db:migrate:status
このコマンドは、今、マイグレーションファイルが下書き状態なのか、本書き状態なのかを一覧で教えてくれます。


```Ruby:
Status   Migration ID    Migration Name
--------------------------------------------------
   up     20190205132111  Create users
```

upはもう本書きされてますよ、ということです。
対して、

```Ruby:
Status   Migration ID    Migration Name
--------------------------------------------------
   down     20190205132111  Create users
```

downはまだ下書きだよ、という意味です。
ちなみに意図的にこのupされているファイルをdownさせることも可能です。


downにすると、マイグレーションファイルをコードエディタなどで編集できるので、有り難いのですが、あまりやりすぎると、そもそものデータベースの前提が崩れることもありますので、多用は厳禁です。


やはり、最初から修正など無い方が良いですよね。
はじめてのC++【34日目】

#はじめに
`std::string` をstockリストに載せてたけどロベールでやったから消しとく。
##Stock List

###未解決
・`static_cast<int>(c)`　と `(int)c`　の違い　<-今日はここやる
・静的メンバ [参照](https://qiita.com/yumetodo/items/b0ff58617f2733d4ffa1#%E9%9D%9Estatic%E3%81%A7%E9%9D%9Evirtual%E3%81%AA%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A6%E3%82%8B)
・`i++`と`++i`の違い
・`nullptr`
・`std::vector`
・`std::array`
・`enum class`

・`std::quick_exit` [あとで読む](https://qiita.com/yumetodo/items/ba5bef7f64636ed2f439)
・初期化子
・みえる・みえない
・this
・標準規格と処理系

###解決
・`int const * const * const ** const * p`
・スマートポインタの使い方　`std::unique_ptr` や` std::shared_ptr`、`std::make_shared_ptr`
・メモリ  [メモリの話](https://qiita.com/yumetodo/items/067b2db266ae0779f030)　[セオライドテクノロジー](https://theolizer.com/cpp-school-root/cpp-school/)
・`std::string`
##`static_cast<int>(c)`　と `(int)c`　の違い
以前コメント欄で、 `static_cast` を使ったほうがいいとか、 `(int)`　でいいとか言われて何が違うのかわからなかったので調べてみようと思う。
###キャストについて
キャストには4種類あり、 `static_cast` `dynamic_cast` `reinterpret_cast` `const_cast` の4種類がある。
あれ、 `(int)x`　みたいな普通のキャストはないの？　と思ったが、 これは多数あるキャストをひとまとめにしたものだそうだ。 `(int)x` はC言語からある機能で、C++では、上で上げた4つのキャストに分けることができる。
今日はstatic_castについて調べようと思う。
###static_cast
これは、[はじめてのC++【3日目】のコメント欄](https://qiita.com/suponjipic/items/fbd39214e72cebf91fcc)で、教えていただいたのだが、オーバーロードの解決ルールで、なにかしらの型に暗黙の型変換が行われる。それを、明示的に別の型を指名するためのキャストが `static_cast`　である。
C++では基本的にこのキャストを使うみたい。
###疑問の解決
[はじめてのC++【31日目】のコメント欄](https://qiita.com/suponjipic/items/879d0479859af21a191d)では、 `static_cast<int>(c)`　と (int)cのどちらでも良かったのか？
これは、暗黙の型変換など何も行われていないので、 `static_cast` と (int)c　どちらでもよかったのである。

##ロベールのC++
###08-05 ファイルの読み書き
```readingfile.cpp
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

int main() {
  std::fstream file;

  file.open("test.txt", std::ios::in);
  if(! file.is_open()){
    return EXIT_FAILURE;
  }

  std::string str;
  getline(file, str);
  file.close();
  std::cout << str << std::endl;
}
```
<img width="151" alt="スクリーンショット 2019-04-03 23.38.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/0106c908-20b4-a166-d69d-ebf0cf269d19.png">

読み取り専用なので、33日目のコメント欄で教えていただいた `std::fstream`を使ってやってみる。

```readonlyfaile.cpp
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

int main() {
  std::ifstream file;//変更した

  file.open("test.txt");//変更した
  if(! file.is_open()){
    return EXIT_FAILURE;
  }

  std::string str;
  getline(file, str);
  file.close();
  std::cout << str << std::endl;
}
```
確かに、書かなくてよくて楽ちんや。
#終わりに
明日は残りのキャストをできたら全部しらべる。
おやすみなさい
curl 基本コマンド （GET/POST/PUT/DELETE）

API確認としてcurlを使う様になったのでまとめ

# GET
GETはcurlコマンドの後にURLでOK

```
$ curl http://www.example.com/
```

# POST/PUT/DELETE
他のメソッドは **-X** オプションの後にメソッド名を書けばOK

```
$ curl -X POST http://www.example.com/
$ curl -X PUT http://www.example.com/
$ curl -X DELETE http://www.example.com/
```

# POSTでデータを送信
POSTでデータを送信するには-dオプションの後に書けばOK
ファイルデータの場合にはファイル名の前に@を付けるだけ

```
$ curl -X POST -d "hoge=0&fuga=1" http://www.example.com/
$ curl -X POST -d @hoge.json http://www.example.com/
```
Qiita のタグフィードを１日以上前に遡る裏ワザ

Qiita のタグフィードは「もっと読む」を押しても途中で終わってしまい、直近15時間程度の記事しか見ることができません。
これだとQiitaへのアクセスを1日サボってしまうと、フォローしているタグの記事を見逃してしまう可能性があります。

これを回避するための裏ワザを紹介します。

# 使うもの

- Qiita API
- cURL
- jq
- awk

# やり方

1. Qiita API でフォローしているタグを取得して、Qiita の検索オプションの形式で出力します。
  
    ```shell-session
$ curl 'https://qiita.com/api/v2/users/tag1216/following_tags?per_page=100' | jq -r ".[].id" | awk '{printf("tag:%s or\n", $1)}'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 13971    0 13971    0     0  41917      0 --:--:-- --:--:-- --:--:-- 41954
tag:material-ui or
tag:データ分析 or
tag:分析 or
tag:ランキング or
tag:いいね or
tag:個人開発 or
:
```

2. 出力をQiitaの検索フィールドにコピーして検索を実行します。
3. 「新着順」でソートします。

これでフォローしているタグの記事が最新1000件(100ページ)まで表示できます。

タグのフォローは頻繁に追加するものでもないのでこれをブックマークしておけばいつでも見れるようになります。