OmniAICreator/Qiita-1.07M huggingface dataset:
Rustのwasm開発環境でwasm-bindgenを利用するようにした際のModule not found: Error: Can't resolve 'env' in 'XXX'のエラー

wasm-bindgenを全く使わないWebAssembly開発から、同プロジェクトをwasm-bindgenを利用した環境に移行した際にハマったエラーについて解決したポイントをメモしておきます。

## 環境
rustのバージョン

```bash
$ rustc --version
$ rustc 1.30.0-nightly (f49f6e73a 2018-09-23)
```

利用しているcrateのバージョン

```cargo.toml
[dependencies]
cfg-if = "0.1.2"
wasm-bindgen = "0.2"
```

## 状況

```bash
$ npm init wasm-app XXX
```
のように、npm環境を用意しwasmをjsからimportする環境でのwebpackによるビルド時に下記のようなエラーが発生する

$npm run build (→ webpack --config webpack.config.js)を実行

```
ERROR in ../pkg/wazf_bg.wasm
Module not found: Error: Can't resolve 'env' in '/var/www/wasm-fzf/pkg'
```
※ pkg配下にwasmが生成されるのはwasm-packによるビルドのため

## 解決策
rust上でJSの関数を使うためにexternしている記述を削除できれば削除してみる。
（削除できなければwasm-bindgenでサポートされている形に修正してみても良いと思います）


```diff:XXX.rsのdiff
- extern {
-     fn logging(n: i32);
- }
```

振り返ってみるとたったそれだけなんですが、```Module not found: Error: Can't resolve 'env' ~~```のエラーからはなかなかたどり着けなかったので、同じようにハマった人のため参考になれば幸いです
Android permission システムパーミッション

# はじめに
作成したAndroidアプリを実機デバッグするたびに同じエラーに引っかかってしまうので備忘録。

# エラー内容
permissionに関するエラー。
実行するとこのようなエラーが出る。

```
09-27 17:42:33.276 10821-10821/com.example.xxxx.peakdetection E/AudioRecord: AudioFlinger could not create record track, status: -1
09-27 17:42:33.278 10821-10821/com.example.xxxx.peakdetection E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -1.
09-27 17:42:33.278 10821-10821/com.example.xxxx.peakdetection E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
09-27 17:42:33.279 10821-10821/com.example.xxxx.peakdetection D/AndroidRuntime: Shutting down VM
09-27 17:42:33.284 10821-10821/com.example.xxxx.peakdetection E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.xxxx.peakdetection, PID: 10821
    java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
        at android.media.AudioRecord.startRecording(AudioRecord.java:1016)
        at com.example.xxxx.peakdetection.MainActivity.onCheckedChanged(MainActivity.java:66)
        at android.widget.CompoundButton.setChecked(CompoundButton.java:156)
        at android.widget.Switch.setChecked(Switch.java:1076)
        at android.widget.Switch.toggle(Switch.java:1071)
        at android.widget.CompoundButton.performClick(CompoundButton.java:120)
        at android.view.View$PerformClick.run(View.java:22277)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:159)
        at android.app.ActivityThread.main(ActivityThread.java:6097)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
```

# 原因
AndroidManifest.xmlにpermissionを記述するだけでなく、実機でも許可が必要。
「設定」→「アプリ」→「アプリ名」→「権限」

<img src="https://qiita-image-store.s3.amazonaws.com/0/276354/0934893b-94d3-8635-d229-15c2d65646a2.jpeg" width=30%>


# さいごに
実機での許可が必要なのはわかるがわざわざ設定からアクセスするのが面倒でわかりにくい。
アプリ開始画面でダイアログを出すことで実機のpermissionを出す方法を今後検討。

# 追記 (2019/07/07)
Permission Request、やってみた。
[Androidのパーミッションリクエスト（複数）](https://qiita.com/tcb78/items/fd2e16eb7f1eacd0ba26)
軽率なアウトプットをする用の Qiita 記事テンプレート

もう毎回同じフォーマットを作るのめんどい of めんどいので、ここに書いておきます。あくまで軽率なアウトプット用なので、用意周到なアウトプットをしたい方は使わない方が良いと思います。

# 前提
そのアウトプットを読む人に認識しておいて欲しい前提知識や条件をここに書いておきます。軽率に箇条書きで良いと思います。特に説明する必要がない場合は、ここはカットしても良いかと。

例）

- 長らくお世話になっていたPaperclip が deprecatedになったため、ActiveStorage に引っ越しすることにした。
- ORM は ActiveRecord ではなく、Mongoid を使用。 view 側でフラグメントキャッシュを使う時のキャッシュキーはインスタンス変数そのものを使っていた。
- 周りの上司はほぼ全員Vimmerだったため、自分も最初はビジネスVimmerを名乗り、隠れてVSCodeを使っていた。

※ それぞれ例として上げた箇条書きは互いに無関係で独立したものです。

# 環境
そのアウトプットをした際の開発環境を書いておきます。ここは結構大切だったり。あとあと試してうまくいかなかった時、バージョンが違うことが原因だった…とかだと悲しいので。

例）

- ruby 2.5.0
- Ruby On Rails 5.2.0
- Mongoid 6.0.0
- Docker

# TL;DR
結論ありき。まず最初に一番重要な点を書いておきます。いちいちスクロールするのだるいので。最終的なコードや計測結果、設計、ワークアラウンドなどなど。

```:foo.txt
/*
タイトルに対応する結果とかをここに書くようにすると、パッと見て分かりやすいかと思います。
*/
```

# 実行手順／再現手順／詳細
結論に至るまでの手順とか、「ここは詳細に説明しておいた方が良いかな…」と思った部分を軽率に説明します。特に必要ない場合は書かなくても良いと思います。なるべく軽率にアウトプットしていきたいので。

もし書く場合は、以下のような感じで番号付き見出しとかでそれぞれまとめると良いかもしれません。

## 1. まずは VSCode をインストール
かくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじか

## 2. 次に VSCode の好みのプラグインをインストール
かくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじか

## 3. 最後に Atom をアンインストール
かくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじかかくかくしかじか

# 参考文献
そのアウトプットをするまでに参考にしたドキュメントや記事のリンクを貼っておきます。これも結構重要だったりします。あとあともっと詳しく調べたい時とかにまた一から調べ直すのもそれはそれで軽率だと思います（？）。


（以下マークダウンのフォーマット）

```
# 前提

# 環境

# TL;DR

# 実行手順／再現手順／詳細

# 参考文献

```
JavaScriptでハッシュ

[jsSHA](https://github.com/Caligatio/jsSHA)
[hashing](https://github.com/Caligatio/jsSHA#hashing)

```js
const jsSHA = require('jssha');

let shaObj = new jsSHA('SHA-256', 'TEXT');
shaObj.update('input');
let hash = shaObj.getHash('HEX');
console.log(hash);
hash = shaObj.getHash('B64');
console.log(hash);

shaObj = new jsSHA('SHA-512', 'TEXT');
shaObj.update('input');
hash = shaObj.getHash('HEX');
console.log(hash);
hash = shaObj.getHash('B64');
console.log(hash);
```

```
c96c6d5be8d08a12e7b5cdc1b207fa6b2430974c86803d8891675e76fd992c20
yWxtW+jQihLntc3Bsgf6ayQwl0yGgD2IkWdedv2ZLCA=
dc6d6c30f2be9c976d6318c9a534d85e9a1c3f3608321a04b4678ef408124d45d7164f3e562e68c6c0b6c077340a785824017032fddfa924f4cf400e6cbb6adc
3G1sMPK+nJdtYxjJpTTYXpocPzYIMhoEtGeO9AgSTUXXFk8+Vi5oxsC2wHc0CnhYJAFwMv3fqST0z0AObLtq3A==
```

ハッシュアルゴリズムを変更したい場合は
アルゴリズムを再設定する[メソッド](https://github.com/Caligatio/jsSHA/blob/master/externs/sha.js)が無いみたいなので
毎回newしないといけない様子。

# パスワード用

[node-password-hash](https://github.com/davidwood/node-password-hash)

verify機能もある

```js
const passwordHash = require('password-hash');

let counter = 0;
while (counter < 5) {
  var hashedPassword = passwordHash.generate(
    'password123',
    {
      algorithm: "sha256"
    }
  );
  console.log(hashedPassword);
  counter++;
}
```

```
sha256$9febcf65$1$0f1ef2081fd2a5f38a035e130a5ab8933d727131173b4c43b39a345cb1016793
sha256$0b37ea0a$1$f33d50b64282c4db99a7caf66eae46bef6a45fb63814895f4feb03b9a86fca07
sha256$e6329c37$1$f0e2a4eb756bb830a1805ab650af893d833503e03e04302b7a370df5a5267b6a
sha256$db1ec9b8$1$655ac7c9af1b6d7aff2f79faaae823952d9519b6009ff06477a799ec5738d845
sha256$df5cbf6a$1$53b6c0177c3357c848a7d273e244d302ecd0ec65559bf06c197be946d71f91d8
```
Mac で完全フリーの音声認識エンジンJuliusを試してみた

#はじめに
今，音声認識はいろいろなところで使われ始めています．
しかし，音声認識をしてみようと思うと意外と難しいのが現状です．
１から作るのは無理だし，GoogleやMicrosoftは音声認識は無料で使おうとすると制限が大きいし．．．と悩んでいる方も多いと思います．
そんな人に最適な，完全フリーのJuliusを使ってみたいと思います．








#ゴール
・ターミナルからデモを起動し，マイク入力から直接音声認識ができるようになる








#事前知識
#####Julius
http://julius.osdn.jp/index.php
音声認識システムの開発・研究のためのオープンソースの高性能な汎用大語彙連続音声認識エンジン
使う上での利点として，ほぼ**リアルタイム**かつ**オフライン**でも使用できるのが特徴です．
Julius自体はあくまで音声認識エンジンであり，音声認識をするには別に音響モデル・言語モデルが必要になる．（それも配布してるよ）











#インストール






###準備

最初に，brewをインストールしていない方は以下のコマンドを打ってインストールしてください．

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

~~次に，flew，portaudioを順にインストールします．~~
~~（juliusを動かすのに必要らしい）~~
※追記：Mac OS 10.13.5 で試した所、これらのパッケージをインストールしていない状態でもインストールできました。

```
$ brew install flex //必要なし
$ brew install portaudio //必要なし
```






###Julius インストール
以下のページからjuliusのtarファイルをダウンロードし，作業ディレクトリにもっていきます．
https://ja.osdn.net/projects/julius/releases/66547#note

その後，以下のコマンドを実行してJuliusコマンドをインストールします．

```
$ tar xvzf julius-4.4.2.tar.gz
$ ./configure
$ make
$ sudo make install
```

ヘルプコマンドを実行して，インストールに成功しているか確認しましょう．

```
$ julius --help
```

次に，先ほど書いたように音響モデル・言語モデルもダウンロードしましょう．
なぜかtar.gzファイルをダウンロードしてもうまくいかなかったため，今回はzipファイルをダウンロードします．
















###ディクテーションキットのダウンロード
先ほど述べたように音響モデル，言語モデルが入ったディクテーションキットを配布しているので，ダウンロードします．
（ここに実行バイナリもあるのでJuliusをインストールしなくても動くらしい
→自分は上手くいきませんでした）
以下から最新（もしくはお好み）のdictation-kitをダウンロードしましょう．
https://ja.osdn.net/projects/julius/
ダウンロードしたら，作業ディレクトリに展開します．
そこまでできたら，以下のコマンドを打ってみましょう．

```
julius -C main.jconf -C am-dnn.jconf -dnnconf julius.dnnconf -nostrip
```

```
### read waveform input
STAT: AD-in thread created
<<< please speak >>>
```
と出てきたら，何か話してみて下さい．

```
sentence1:  今日 の 夜 ごはん は カレー ライス だ よ 。
wseq1: 
 今日+名詞 の+助詞 夜+名詞 ごはん+名詞 は+助詞 カレー+名詞 ライス+名詞 だ+助動詞 よ+助詞 

```
こんな感じで音声認識できました．
体感そこそこな精度で認識してくれました！















##参考URL
julius公式ホームページ
http://julius.osdn.jp/

公式のトリセツ的なやつ
https://jaist.dl.osdn.jp/julius/47534/Juliusbook-4.1.5-ja.pdf

Terminal (macOS): Julius で音声認識をする
http://snippets.feb19.jp/?p=1734

MacでJuliusインストールする方法
https://qiita.com/amano-kiyoyuki/items/41f250a52e0929001e1f
AWS認定ビッグデータ - 専門知識 受験レポート

2018年10月5日に [AWS認定ビッグデータ - 専門知識](https://aws.amazon.com/jp/certification/certified-big-data-specialty/) を受験し無事合格しました。これから受験される方向けに試験の振り返りと勉強方法などについてまとめたいと思います。
専門知識系の認定に関する情報はあまり多くないので参考になれば幸いです。

# AWS認定取得状況
1. ソリューションアーキテクト - アソシエイト (2016年3月19日)
2. ソリューションアーキテクト - プロフェッショナル (2017年6月1日)
3. デベロッパー - アソシエイト (2018年2月2日)
4. クラウドプラクティショナー (2018年9月14日)
5. SysOpsアドミニストレーター - アソシエイト (2018年9月15日)
6. DevOpsエンジニア - プロフェッショナル (2018年9月29日)
7. **ビッグデータ - 専門知識 (2018年10月5日)**

# 試験結果
総合成績は78%でした。以下は分野別の成績です。Collectionが弱いですね。。

```
1.0  Collection: 50%
2.0  Storage: 100%
3.0  Processing: 75%
4.0  Analysis: 87%
5.0  Visualization: 71%
6.0  Data Security: 80%
```

# 試験の感想
全65問、制限時間は170分です。
DevOps Proは全80問で制限時間は170分だったので結構余裕かなと思ったのですが、結局全問解くのに130分程度掛かり、残り時間を見直しに充てました。

難易度的には `ビッグデータ専門知識 <= DevOps Pro < SA Pro` と感じました。
SA ProはAWSサービス以外も含めた広範な知識を求められるのに対して、DevOps Proは範囲は狭いもののより深い知識が要求される感じで、ビッグデータ専門知識はDevOps Proに近い印象でした。

ビッグデータ専門知識と銘打っているだけあって、EMRやHadoop、Redshift、Kinesisのどれかを業務で使っている人にとってはある意味取っつきやすいんじゃないかなと思います。

## 誤訳について
まだ日本語版が公開されてから日が浅いためか、誤訳と思われる記述が2〜3問ありました。以下は例です。

英語 | 日本語
--- | ---
EC2 Workers | EC2作業者

幸いなことに、専門知識試験では画面上部のリストボックスで英語と日本語を切り替えることができました。もし正解の選択肢が無いと思った場合は、一度英語に切り替えて文章を確認、それから日本語に戻して回答というステップを踏むのが良いと思います。

# 勉強方法
## AWS公式サンプル問題
現時点でAWSが公式に提供しているのはサンプル問題 (10問) (英語) のみです。
他の認定のサンプル問題と違って、最後のページに回答が記載されているのが嬉しいです。
https://d1.awsstatic.com/training-and-certification/docs-bigdata-spec/BD-S%20Sample%20Questions%20for%20Web.pdf

## Whizlabs
AWS公式の模擬試験が提供されていないのでどうしたものかと思い、Whizlabsというオンライン学習サイトで公開されている模擬試験を試してみました。セール期間で約4,000円でした。
https://www.whizlabs.com/aws-certified-big-data-specialty/practice-tests/

結論から言うと、そこまでやる意味は無かったなぁという感想です。決して変な問題ばかりという訳では無いんですが、本番の問題の傾向にそこまで近く無いかなと感じました。

## Black Belt読み込み
DevOps Proと違って模擬試験メインの学習方法が取れなかったため、サンプル問題に出てきたサービスのBlack Beltの読み込みを行いました。

- EMR
- Redshift
- Kinesis
- S3
- Amazon Machine Learning
- QuickSight
- AWS IoT

以上、つらつら書きましたが参考になれば幸いです。
ABC112　D問題

多分行けそうと考察ふわふわで投げたら通ったので，反省を込めて

###問題
https://abc112.contest.atcoder.jp/tasks/abc112_d

###やりたかったこと
求める$M=a_0+a_1+...+a_N$となる$a_{0toN}$の最大公約数なので，それを$b$としたとき
$$a_0\%b=0 \\\
a_1\%b=0 \\\
a_N\%b=0$$
なので$M$を割り切れる$b$で最大のものを求めたい的なことを考えていた．


###投げたコード

```cpp
template<class X> void is_prime( X n  , X m){
	if( n == 1 )
		cout << m << endl;
	else if( m % n == 0 ){
		cout << m / n << endl;
	}
	else{
		ll M = 0;
		int i = 2;	
		//ll lim = sqrt(m)+1;
		while( i * n <= m /*&& i < lim*/ ){
			if( m % i == 0){
				M = i;
			}
			i++;
		}
		if( M )
			cout << M << endl;
		else{
			if( m % 2 ){
				cout << 1 << endl;
			}
			else{
				if( m / n >= 2 ) 
					cout << 2 << endl;
				else
					cout << 1 << endl;
			}
		}
	}
}
int main(){
	ll n,m;
	cin >> n >> m;
	is_prime( n , m );
	ret 0;
}

```
素数判定のライブラリを100年ぶりに出したら無意味にtemplateとか使って笑いました
割り切れるときのペアになる数$\frac{m}{i}$を計算を代入している処理をしていないので，sqrtをちゃんと使うとWAになります．
テストケースが恐らく大きい$M$と小さい$N$の組み合わせがなかったのか，TLEすることなく通ってますがそういったのがあればTLEだと思います．ラッキー．

###ゆっくり考えてわかったこと
$N=3，M=14$のとき
$$a_0+a_1+a_2=14$$
になる，$a_{0to2}$を考えるとき，$M$の約数$b$（最大とは限らない）と$c_{0to2}$を用いて，とする．
$$a_i=b・c_i$$
14の約数は1,2,7,14なので
$b=1$のとき，$a_i=1・c_i$
$b=2$のとき，$a_i=2・c_i$
$b=7$のとき，$a_i=7・c_i$
$b=14$のとき，$a_i=14・c_i$
$b$が7より大きいときは，全ての$c_i$が最小の1でも$a_0+a_1+a_2=14$を満たさなくなるのでは？🤔🤔🤔
つまり，$b・N>M$となる$b$はダメなのでは？🤔🤔🤔
ということは，$b・N<=M$の範囲で最大になる$b$を求めればいいのでは？🤔🤔🤔
$m/b$が$N$より大きいときは$c_i$に吸収させればいいのでは？🤔🤔🤔
約数は平方根まで求めて，ペアでとれば全て取れるのでは？🤔🤔🤔
という発想で書き直したのが次のコードです．

```cpp
int main(){
	ll n,m;
	cin >> n >> m;
	ll lim = sqrt(m)+1;
	ll M = 0;	
	int i = 1;
	while( n * i <= m && i < lim ){
		if( !(m % i) ){
			M = max( M , ll(i));
			if( m >= n*(m/i) ){
				M = max( M , m/i );
			}
		}
		i++;
	}
	cout << M << endl;
	ret 0;
}
```
すごくシンプルになりましたね．
ACでした．
C問題を解けないので，そっちも明日とかにやっていきます．おやすみなさい．
Mac間で高速にファイル転送

普通のファイルのやり取りは AirDrop や File Sharing で問題ないのですが、今回20G超のファイルを転送する必要があり、そのために検討した方法です。

AirDropは多数のファイル送信はできそうにありません。File Sharingも22GBの転送に、4時間以上かかってしまい、かなり低速でした。

実は、File Sharing と同じ設定画面に「Remote Login」という項目があって、これを使います。

![Screen Shot 2018-10-07 at 0.02.10.png](https://qiita-image-store.s3.amazonaws.com/0/50780/b71fe5a4-723a-1cf8-9110-f934e8757d68.png)

有効にすると、以下のようなメッセージが現れます。

```
To log in to this compter remotely, type "user@xx.xx.xx.xx".
```

sshのサーバが立ち上がるので、rsyncで転送が可能です。今、設定を行ったのとは逆側のホストで以下のようにコマンドを実行します。※転送したいファイルが「Remote Login」を有効にした側のマシンの foo というフォルダに存在して、それを受け取る側のマシンで、ターミナルを立ち上げてこのコマンドを実行します。

```
rsync -avz user@xx.xx.xx.xx:foo/ foo/
```

これで圧倒的に速く！と思ってここまで記事書いて実測値を載せるつもりにしてたんですが、終わってみると5.4MB/secしか出てなくて、結局1時間弱かかってしまいました(^^;

まあ、それでも「File sharing(smb?)」よりは大分速いし、進捗も分かりやすいので、こちらがオススメではあります。
railsで大量のデータをinsertもしくはupdateする。

# railsで大量のデータをすでにあれば更新なければ作成する。
update + insert = upsert というらしいですね。

この操作、生のactive recordでやろうと思うとかなりの数のsql文ができて、かなり効率悪くなります。そこでactiverecord-importの出番です。こちらの[githubのwiki](https://github.com/zdennis/activerecord-import/wiki/On-Duplicate-Key-Update)によると``on_duplicate_key_update``というものが対応しているみたいです。

> MySQL, PostgreSQL (9.5+), and SQLite (3.24.0+) support on duplicate key update (also known as “upsert”) which allows you to specify fields whose values should be updated if a primary or unique key constraint is violated.

ふむふむ、どうやらプライマリーキー制約やユニークキー制約に引っかかったデータに対して、特定のカラムの更新をしてくれる見たいです。つまり、例えば``primary_key``が``user_id``の``User``テーブルがあったとして、

```ruby
User.create(user_id: 1, name: "hogehoge", sex: 1)
User.create(user_id: 3, name: "fugafuga", sex: 0)
User.create(user_id: 5, name: "piyopiyo", sex: 0)

hashes = [
        {user_id: 1, name: "Harry", sex:0},
        {user_id: 2, name: "Alice", sex:1},
        {user_id: 3, name: "Fred", sex:0},
        {user_id: 4, name: "Bob", sex:0},
        {user_id: 5, name: "Patricia", sex:1}
        ]

users = []
hashes.each do |item|
users << User.new(user_id: item[:user_id], name: item[:name], sex: item[:sex])
end

# MySQLバージョン
User.import users, on_duplicate_key_update: [:name]

# Postgreバージョン
User.import users, on_duplicate_key_update: {conflict_target: [:user_id], columns:  [:name]}

```

とすると、次のように更新or新規作成される。

```ruby
# 最初3つのcreateの時点
  User Load (0.7ms)  SELECT `users`.* FROM `users`
+---------+----------+-----+-------------------------+-------------------------+
| user_id | name     | sex | created_at              | updated_at              |
+---------+----------+-----+-------------------------+-------------------------+
| 1       | hogehoge | 1   | 2018-10-06 15:39:51 UTC | 2018-10-06 15:39:51 UTC |
| 3       | fugafuga | 0   | 2018-10-06 15:39:51 UTC | 2018-10-06 15:39:51 UTC |
| 5       | piyopiyo | 0   | 2018-10-06 15:39:51 UTC | 2018-10-06 15:39:51 UTC |
+---------+----------+-----+-------------------------+-------------------------+


# importが終わり更新処理が終わった時点
  User Load (2.6ms)  SELECT `users`.* FROM `users`
+---------+----------+-----+-------------------------+-------------------------+
| user_id | name     | sex | created_at              | updated_at              |
+---------+----------+-----+-------------------------+-------------------------+
| 1       | Harry    | 1   | 2018-10-06 15:39:51 UTC | 2018-10-06 15:40:50 UTC |
| 2       | Alice    | 1   | 2018-10-06 15:40:50 UTC | 2018-10-06 15:40:50 UTC |
| 3       | Fred     | 0   | 2018-10-06 15:39:51 UTC | 2018-10-06 15:40:50 UTC |
| 4       | Bob      | 0   | 2018-10-06 15:40:50 UTC | 2018-10-06 15:40:50 UTC |
| 5       | Patricia | 0   | 2018-10-06 15:39:51 UTC | 2018-10-06 15:40:50 UTC |
+---------+----------+-----+-------------------------+-------------------------+
```

ちゃんと名前だけが更新されているのがわかる。

これはかなり便利なのでは。
Angularを学習するにあたって参考にした書籍など

# 前置き
以前、[仕事でAngular使うことになったので整理する][1]という記事を投稿しました。
あれから少し経って、だんだんAngularのことがわかってきたので、勉強につかった書籍やサイトなどをまとめておきます。

※Angular 6を使ってた頃の話になります。

# 書籍
## Angular Webアプリ開発 スタートブック

[Angular Webアプリ開発 スタートブック][2]
最初に買った本です。
適当に寄った書店でAngular関連の本がこれだけ置いてあって、
とりあえず試しに買ってみた本でした。
感想としては、うーん、、、どうなんでしょう。
内容は薄めです。
ハンズオンのような形式で、かなり易しめに書いてありますが、
かゆいところに手が届いておらず、私の欲しかったような内容ではありませんでした。
とはいえ、書いてある通りに実装すれば動くものは作れましたし、それでなんとなく全体像が掴めたようなところはあったので、
詳細に書いてあるものを読み込むのではなく、とりあえず触りたい、という方にはそれなりに役に立つのではないかと思います。

## Angular アプリケーションプログラミング

[Angular アプリケーションプログラミング][3]

正直Angular界隈はあまりいい書籍があるとは言い難い状況なのかな、、、と個人的には思うのですが、
こちらの書籍に関してはとても分かりやすく、内容の充実度もほどよくて最後まで読めました。
機能ごとに整理されて解説されているので、リファレンスとしても用いやすいです。
上記のスタートブックの方ではテストまでは言及がないのですが、こちらはユニットテストについても章が割かれており、参考になりました。
関連ツールについても紹介されているので、この本があれば基本的なことと周辺環境についてざっくりわかるようになるのではと思います。


# サイト
## 公式チュートリアル

[Angular クイックスタート][4]
Angularの公式チュートリアルは結構充実していて、日本語化も全てではないですが徐々に対応されています。
一通りの機能を網羅的に開設されていますし、チートシートもあって、「書き方忘れた！」って時も参考にしやすいです。
順番にこなしていけば、全て終わる頃にはAngularの基礎は全て抑えたと言えるのではないでしょうか。
いろんなサイト見回しましたが、結局公式が一番かもしれません。

日本語化対応されている方々、本当にお疲れ様です。

# まとめ
正直なところ、Angularは参考にできるサイトや書籍があまりなく、基本的には一次ソースを見に行くのが正攻法なのかなと感じました。
英語読むのは疲れるので大変ですが、下手に日本語の情報を探すよりよっぽど良いです。
「ここ知りたいのに全然情報見つからないよ」って方は、
英語サイト回るように方向転換すると、案外すぐ見つかるかもしれません。


[1]:https://qiita.com/katokazu_dev/items/7f904fe10052521ff827
[2]:https://www.amazon.co.jp/dp/4800711975
[3]:https://www.amazon.co.jp/dp/4774191302
[4]:https://angular.jp/guide/quickstart
JavaScriptでdatetime

datetimeに登録する際によく使うのでメモ。

[moment](http://momentjs.com/)

```js
const moment = require('moment');

console.log(moment().format('YYYY-MM-DD hh:mm:ss'));// now
console.log(moment('2018-10-01 01:02:03').format('hh:mm:ss'));// 01:02:03
console.log(moment('2018-10-01 01:02:03').format('YYYY/MM/DD'));// 2018/10/01
```

[その他フォーマット](http://momentjs.com/docs/#/parsing/string-format/)
Goでコンストラクタっぽいことをする

Goで構造体型の初期化をコンストラクタっぽく書く時は、およそ次のルールを守れば良い。

* ”New型名”という名前にする。
* 戻り値はポインタ型にする。


(例)

```Go:
func NewFile(fd int, name string) *File {
    if fd < 0 {
        return nil
    }
    f := File{fd, name, nil, 0}
    return &f
}
```

参考:https://golang.org/doc/effective_go.html#composite_literals
視覚的プログラミング言語「B012（ボルズ）」開発中（2018/10/10微修正）

　２０２０に子供にプログラム教育が必須になるらしいので、子供でも簡単に覚えられて「楽しめる」ギミックを組み込み、より深く使いこなしたい人の需要も満たせる視覚的なプログラミング言語を現在作っています。

　正直もう少し形になってからと考えておりましたが、ここを見てる方々
に助言をいただくこともあるかもしれないので、現状を整理する意味でこの場をお借りします。

#作成の動機

文部省が主導で制作している視覚的言語「プログラミン」も、そのベールとなったScratchも、子供向けの導入としては悪くないのですが、より色々なことをしようとすると色々足りない。
あと出先でスマホで気軽にプログラムしたい際に｛｝閉じ忘れのチェックが面倒くさい、
かといってPythonのように書式を厳格化する位であれば、最初から「閉じる必要がない」、「そもそもソースを書き込む必要がない」言語を、というのも動機の一つです。

#レイアウト

現在の作成中の画面的＋イメージ合成はこんな感じです。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/298861/76568cb1-d43a-486a-d02c-15667eb0756e.png)


日頃ソースを文章で書いてるプログラマーの皆様から見れば、見た目から異質に思われるかもしれませんが、フローチャートを貼り付けてプログラムを組む、という感覚だと思えばご納得いただけないかなーと。

#開発環境など

javascriptとfabric.jsを使っての製作中です。

　スマホでも動くものをと模索したところwebベースで修正がしやすく、svgとの相性がよく視覚言語にもってこいだと思ったので。
　将来的にはスマホ、PCそれぞれで実行できるアプリ（多分javaベースになる予定）として開発するつもりです。




#最後に
実際にこの「言語」で「プログラム」が作れるようになりましたら、改めて詳細を報告しようと思っていますが、進捗は以下ブログで随時報告の予定。
https://b012.hateblo.jp/

なお現状で「動く」もの（といってもまだプログラムを組める段階ではないが）を見たい方は以下URLからお試しいただけます。

http://yoseisan.happy.nu/b012/
【Mac】MySQLにWorkbenchからソケット(socket)接続する【初心者】

記憶あやふや・ゆるゆる記事につき注意
# 結論
ポート番号で接続しようとしていたが、ポート番号が無く、**ソケット接続**なるもので接続できた。

# 環境
- MacOS High Sierra バージョン10.13.6
- MySQL Ver 8.0.12 for osx10.13 on x86_64 (Homebrew)
- MySQL Workbench 8.0

# 経緯
1. それまでのローカルのMySQLでは起動できなかったので、試行錯誤の末、アンインストールして、再度インストール、そして```mysql.server start```に成功した。
2. Workbenchから接続しようとするも、うまくいかない。

# 原因と解決策
ポート番号で接続しようとしていたが、ポート番号が存在しなかった。
->代わりにソケットなるものが定義されていたので、ポート番号を指定する接続方法ではなく、ソケット接続なる方法でDBに接続した。

# 確認した手順
### 1. とりあえず接続できないか試行錯誤する。
MySQLをインストールしてから、特にパスワードやポート番号などの設定の変更を行っていない。**はず**。なので、
![スクリーンショット 2018-10-06 23.57.48.png](https://qiita-image-store.s3.amazonaws.com/0/104294/3f66bd3f-0f15-a788-6a45-23f5cac8729e.png)
とデフォルト値を入力。Hostnameには```localhost```を入力したら、写真の通りに変更するようにWorkbenchがオススメしてきたので素直に従った。
portは3306がデフォルトだそうで、そのままにしていた。usenameは確かデフォルト(自分で入力したっけ...?)でrootだった(```$ select User from mysql.user;```を使えばUser名は確認できる)。パスワードは、初期状態だと無しでもログインできる？みたいな記事を見かけたので、空っぽにしたり、rootを入れたりしたが、それでも**ログインできなかった**。

### 2. ログファイル探してみたり、パスワード初期化してみたり
その後知人曰く、ログを見れば初期パスワードがどこかに書かれているみたいなことを聞いたので、ログファイルを探してみたがうまく見つけられなかった。このとき参考にしたページは[こちら](http://pentan.info/sql/mysql/log_files.html)
めんどくさかったので↓のページを参考に、パスワードを変更することにした。
[MySQL5.7でrootパスワード初期化変更メモ / 2017年10月](https://qiita.com/ononoy/items/7732a2e97b3901eb9d57)
そして変更後のパスワードを入力したが接続失敗。

### 3. やっぱりポート番号がおかしいのでは？
[Step5・MySQLの状態を確認する: MySQL初心者入門講座](http://mysqlweb.net/category/3978187-1.html)を参考にして、ポート番号を確認した。
すると上記ページの手順[7](http://mysqlweb.up.seesaa.net/image/mysql-73.gif)にあった写真とは異なり、
```TCP port```が存在しなかった。が、
![スクリーンショット 2018-10-06 22.00.36.png](https://qiita-image-store.s3.amazonaws.com/0/104294/a17240a6-2311-a633-4325-2dfabe53bde9.png)
代わりに```UNIX socket```が定義されていた。
そこで```Local Socket/Pipe```を選択し、
![スクリーンショット 2018-10-06 22.12.37.png](https://qiita-image-store.s3.amazonaws.com/0/104294/bcea9e04-06a8-2251-1054-14fac09215e7.png)
そして、ソケットのパス？を入力して、上で再設定したパスワードを入力したら、
![スクリーンショット 2018-10-07 0.25.34.png](https://qiita-image-store.s3.amazonaws.com/0/104294/18e2071b-b0a9-4eac-61ec-264bd1420615.png)

#### 接続に成功した。
なぜポート番号がないのかはよく分かっていない。
MySQLがうまく起動しないので、2,30の記事を見てhomebrewでアンインストール&インストールしたりした。
その後エラーでソケットファイル(へのアクセス権?)が無いうんぬんとか言われて何やかんや対処したような気もするが、MySQL関連のあらゆるファイルを削除してから再インストールしたらうまくいった。こういうわけのわからない処理をしたことが原因なのかもしれない。
あるいは別途dockerコンテナ内で他のDBを接続していたことが原因かもしれない。

また分かったら追記します。
Unityでライトを複数置いた際にSet Pass Callが増える理由を検証してみた

### Unityでライトを複数置いた際にSet Pass Callが増える理由を検証してみた
Unityではフレームレート低下を防ぐために、BatchesやSet Pass Callをなるべく少なくすることがあります。その際にライトを増やすと急激にSet Pass Callが増えることがあるので、その理由を検証したいと思います。
#1. 検証
ヒエラルキー上にDirectional Lightを0個、Cameraを1個、Terrainを1個置いたものをシーン0とします。
このシーン0では、Set Pass Callは4、Window/Profiler/GPU Usage配下のDraw Callは148です。
次にシーン0にDirectional Lightを追加したものをシーン1とします。
このシーン1では、Set Pass Callは5、Draw Callは310でした。
最後にシーン1に同じライトを追加した、Directional Light2つのものをシーン2とします。
このシーン2では、Set Pass Callは157、Draw Callは539でした。
#2. Set Pass Callの増大
シーン0からシーン1にライトを1個増やしたときはSet Pass Callは1しか増えなかったのに対し、シーン1からシーン2にライトを1個増やすとSet Pass Callは152増えました。
この理由を検証するために、Window/Frame Debuggerを開きます。これはEnableボタンを押したタイミングの画面が、どの順番でライティングされているかを表示するものです。
Camera.Render/Drawing/Render.OpaqueGeometry/RenderForwardOpaque.Render/RenderForward.RenderLoopJobに着目します。
シーン1の場合はこの中に140個のDraw Meshが存在し、シーン2には280個のDraw Meshが存在しました。
その中の1つのDraw Meshをクリックしてみると中に何のTextureが使われているかが分かります。
この時、各Draw Mesh上のシークバーに数字があります。この数字が近いもの同士は同じテクスチャが使われていると思いますが、これはUnityのBatch処理によるものです。
同じテクスチャが使われているDraw Meshが連続している場合、この連続したDraw Mesh群をまとめて1ブロックと呼びます。

さて、シーン0の場合ですがRenderForward.RenderLoopJobは2ブロックに分けられました。シーン1の場合は4ブロックでした。
そしてシーン2は前半140個のDraw Meshは4ブロックに分けられたのに対し、後半は何やらエラーがでています。
エラーの内容は
```Why this draw call can't be batched with the previous one. An object is affected by multiple forward lights.```
となっています。
つまり、複数のライトが存在する場合はブロックとして纏めることができず、結果としてSet Pass Callが増えたのではと考えます。
#3. 終わりに
このエラー文を調べてみると[Unity公式リファレンス](https://blogs.unity3d.com/jp/2017/04/03/how-to-see-why-your-draw-calls-are-not-batched-in-5-6/)に以下のような記述がありました。
```What breaks batching
Different Lights — the object is affected by a different forward light.```
やはり複数ライトによってSet Pass Callが増えるのは間違いないかと考えました。
Visual Studio Codeの自動整形機能を有効にして快適に

最近、コードを書く環境をVisualStudioCodeに変えました。いろいろ便利な機能が標準であるようです。Pythonでコードを書いてて自動整形をしてほしくなったので、コードの自動整形を有効にしてみます。

1. 「ファイル」→「基本設定」→「設定」と開く
1. 検索窓からformatonで検索
1. 以下のような表示がある

> Editor:Format On Type

これにチェックを入れてください。すぐに変更が反映されるはずです。

結果：コード書くと整形される
KKMS2 ~KenKunMySite2~

<h1>KenKunServer2 KKMS2</h1>
<h3>このサイトではケンくん氏が経営してるサイトあるいは運営してるサイトを紹介するところです。え？なぜ2かって？それはねぇ、前に完全自作のサイトでこういうの作ったんだけどパソコンを閉じたらサイトに入る事ができないからここで作ろうと決めました。</h3>
<h3>On this site we show the site from Kenkun. hm ? why 2 ? because i have the old website for KKMS but i closed the pc u can't access to website so i make on here. :) (on this site i show on japanese . sorry... plz use the translate.)</h3>

<h2>ケンのちゃんねる/Ken no channel</h2>
<h3>このブログはLivedoorブログにて作成したものである。主にこのブログではゲーム関連
の事を取り上げるブログでしたが、コメントや見る人が少なかった為終了。それから一年後、2019年に投稿を再開をした。</h3>
http://ken-no-channnel.2chblog.jp/

<h2>KenKunTeam(旧)/KenKunTeam(Old)</h2>
<h3>KenKunTeamの前のサイト。</h3>
http://kenkunteam.futene.net/index.html

<h2>ケンくんのテキトーな日常/Kenkun's Vlog</h2>
<h3>このブログはLivedoorブログにて作成したものである。日常敵な事を投稿する予定だ
ったが、必要性が無かったため終了(?)</h3>
http://kenkuntekito.gger.jp/

<h2>旧KenKunTeam</h2>
<h3>このサイトではKenKunTeamが作ったOSもどきやアプリ等を紹介するサイトです。まだ人は少ないが、今後人を集める予定。(廃止。新しいやつを作りました)</h3>
https://kenkunteam.enjin.com/

<h2>KenKunServer</h2>
<h3>このサイトではKenKunServerというケンくん氏が運営してるマイクラサーバー関連の情報や新情報等様々な物を紹介するところです。</h3>
https://kenkunmc.enjin.com/

<h2>KenKunMySite KKMS</h2>
<h3>これが初代のKKMS。完全自作であるが、一番上に書いてあるようにパソコンを閉じるとアクセスできないのでQiitaに変えた。一応廃止する予定はないが更新しない予定。あ、もちろんQiitaではたまに更新するかもよ！</h3>
http://kkms.dotera.net/index.html

<h2>KenKunTeamLinks</h2>
<h3>このサイトではKenKunTeamの公式サイトの相互リンク専用サイトとして扱っている(もう利用しない)</h3>
https://www4.hp-ez.com/hp/kktlinks

<h2>YeahChat</h2>
<h3>これは僕が作ったものの中で一番簡単に早くできたサイト(サービス)。みんなとチャットをしたり掲示板をたてたりすることができる。(FC2のBBSをぶちこんだだけ)</h3>
http://yeahchat.zouri.jp/index.html

<h2>DEMAサイテ</h2>
<h3>僕が作ったデマ情報を書くブログ。最後のところにフィクションですとかて書いてるので、多分本物だと勘違いするひとはいないと思います。。。多分だからね？</h3>
http://demasaite.blog.jp/

<h2>KenKunTeam</h2>
<h3>このサイトではKenKunTeamが作ったOSもどきやアプリ等を紹介するサイトです。まだ人は少ないが、今後人を集める予定。</h3>
http://kenkunteam.blog.jp/

<h2>サイト作成サービスのお任せケンくん！</h2>
<h3>1000円から3000円でサイトを作ってもらえますよ！ま、小遣い稼ぎで作ったんだけどねｗ</h3>
http://omakase.yakiin.net/
個人開発者がAppStore用にプライバシーポリシーを書く

今月初めより、AppStoreで公開するアプリには、データ収集する機能がアプリにあるかないかに関わらず、プライバシーポリシーが必要になりました。
この記事は、特にプライバシーポリシーを書いたことがない僕がどうしたかという内容です。

# 注意

僕は、プライバシーポリシーや、法律については全然詳しくありません。
なので、ここに書かれていることは正しいとは限りません。
というか、まず間違いはあるでしょう。
なので、これと同じことをして損害あった場合とか僕は責任取れません。

じゃあ何故こんな記事を書いているのかというと、何も分からない僕の認識を正して欲しいからというのが目的にあるからです。
なので、もし間違いや改善すべき点を見つけたら、コメント欄で教えてください。

# プライバシーポリシーに書くべきもの

とりあえず調べていて必要だと思ったもの一覧

- どんなデータをアプリが収集するのか
- どういう目的でデータを収集して利用するのか
- 上記の条件以外でデータの収集・利用をしないという宣言

このくらいがあればいいんじゃないかな。
異論反論は認めるので、あったらコメント欄でお願いします。

連絡先は必要なのかどうか迷ったのですが、そもそも対外向けのメールアドレスとか僕は持っていない。
あと、必要とあらば、AppStoreのレビュー欄やサポートURLを踏んだ先にあるコメント欄で連絡取れるだろうと思って書かなかった。

# 自分のアプリはどんなデータを収集してる？

たぶん、プライバシーポリシーについて気にしたことのない人が悩むのはここだと思います。
色々とパターンがあると思うので、いくつか僕の考えを書こうと思います。

## Firebaseを使っている

ここでは僕が実際にAppStoreで公開してるアプリで、プライバシーポリシー込みで審査の通ったものについて説明します。

僕が公開したのは一般的なカウントダウンタイマーです。
標準の時計アプリでは、好きな時間を設定して保存しておくことができなかったので、セットした時間を保存できるタイマーを作りました。

そして、このアプリではFirebaseとAdMobを使っています。
AdMobは少しても収益化できたらいいな程度の思いでバナー広告を出すのに使っています。
Firebaseは、AdMobを設定するとFirebaseとリンクしたほうがいいよって言われたので入れただけです。
なので、標準設定で収集できるデータ以上に追加で収集したりはしていません。

とりあえず、この時点でFirebaseのコンソールを開き、アナリティクスで見れる項目を並べます。

- アクティブユーザー数
- イベント・コンバージョンイベント
    - バナーがタップされた
    - アプリが初めて起動された
    - OSがアップデートされた
    - App内課金がされた
    - などなど
- エンゲージメント
    - どのViewControllerがどれだけの間表示されたか
- 収益額
- 安定性
    - クラッシュ数
- 最新リリース導入状況
    - 利用されてるバージョンの推移
- 新規ユーザーの獲得方法
- ユーザー維持率
- ユーザーの詳細データ
    - 国
    - 使用デバイス
    - 属性
    - などなど

とりあえず、適当に入れただけでもこれだけ収集されます。
で、調べてて気づいたのですが、AppStoreがプライバシーポリシー強制になる前から、Firebase使ってるならデータ収集してるし、プライバシーポリシーって書かなきゃいけなかったみたいです。気づけて良かったといったところでしょうか。

## 何もアプリにデータを収集させてない場合はどうする？

AdMobもFirebaseもその他広告やアナリティクスを行うサービスをアプリで利用していない場合。
何もデータを収集していませんってプライバシーポリシーを書くのか。
でも、そんなプライバシーポリシーのテンプレートって見当たらないんです。

### 本当に何もデータを収集していない？

App Store ConnectのAppアナリティクスを見てみよう。
アクティブなデバイス数や、クラッシュ数が見れるじゃない。
つまり、これはAppleが提供してくれてるものだけど、アプリの動作状況が収集されてるってことにならない？
ならばこれを書いてしまえばいいんじゃないかな。

~~※ ちなみにこの方法ではまだ、プライバシーポリシーを書いてアプリの審査が通るか試せていません。良さそうだったら報告します~~
10/18追記　これでいけました


# どうやって書けばいい？

今回説明に使ったタイマーのアプリは、プライマリ言語を英語にしてAppStoreで公開しています。
なので、プライバシーポリシーも英語にしようと思いました。
で、英語のプライバシーポリシーを作るのにいいものがありました。

[App Privacy Policy Generator](https://app-privacy-policy-generator.firebaseapp.com)

- アプリ名
- Type of App
- Dev Type
- 何のデータを収集しているか
- 対応OS

を入力すれば英語のプライバシーポリシーの完成です。

収集しているデータについては、上記に挙げたものを全部列挙するのはどうかと思ったので、自分がアップデートを作る際によく気にする使用されてるアプリとOSのバージョン、あとは広告関連のイベントについても見ているので、それらを書きました。

あとはこれをコピペなりhtmlダウンロードなりして、サポートURLと同じサーバーにアップすれば完成。
実際にこんな感じで公開してます。
[Multiple Countdown Timer Privacy Policy](https://ideal-reality.com/apps/multiple-countdown-timer/?page=privacypolicy)
~~※自宅サーバーなので遅い&よく繋がらなくなりますが、ご容赦を~~
サーバーを新調したのでしばらくは大丈夫な...はず...

実際にこれを10/5にアプリのアップデートと一緒に提出して10/6に審査通ってます。
よくわからずに作ったものだけど通ったってことは、プライバシーポリシーの審査はゆるいのかな？

# お願い

注意のところに書いたとおり、審査に通ったとしても、これが正しいとは思っていません。
なので、間違いがあったら教えてください。

あと、新しいアプリを作るごとにプライバシーポリシーを書かなければいけないので、参考になる記事が増えて欲しいと願っています。
日本語でのプライバシーポリシーの書き方とか、まだ分かってないですし。
なので、この記事を見ている個人のiOSアプリ開発者がいれば、自分はこういう風にプライバシーポリシーを書いたよって記事を書いてくれると嬉しいです。
cssのみで作る自動無限スクロールスライド

同じスライドを2つ並べている。一つ目のスライドはスライドが画面に表示されている状態から、画面から消えるまでスクロールする。二つ目は画面の外（ギリギリ見えない状態）から、一つ目のスライドの最初の状態までスクロールする。二つのスライドをこのように動かすことで無限ループに見せている。

### DEMO
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="mk668a" data-slug-hash="pxEppO" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="infinite scroll">
  <span>See the Pen <a href="https://codepen.io/mk668a/pen/pxEppO">
  infinite scroll</a> by mk668a (<a href="https://codepen.io/mk668a">@mk668a</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

### CODE
```html:index.html
<div class="infinity-slide">
<!--   同じスライドを二つ表示 -->
    <div id="slide">
      <img src="https://cdn.pixabay.com/photo/2018/04/28/22/03/dawn-3358468_1280.jpg" />
      <img src="https://cdn.pixabay.com/photo/2018/09/14/22/51/cobblestones-3678292_1280.jpg" />
      <img src="https://cdn.pixabay.com/photo/2018/06/29/22/45/wheat-3506758_1280.jpg" />
      <img src="https://cdn.pixabay.com/photo/2017/01/20/00/30/maldives-1993704_1280.jpg">
    </div>
    <div id="slide">
      <img src="https://cdn.pixabay.com/photo/2018/04/28/22/03/dawn-3358468_1280.jpg" />
      <img src="https://cdn.pixabay.com/photo/2018/09/14/22/51/cobblestones-3678292_1280.jpg" />
      <img src="https://cdn.pixabay.com/photo/2018/06/29/22/45/wheat-3506758_1280.jpg" />
      <img src="https://cdn.pixabay.com/photo/2017/01/20/00/30/maldives-1993704_1280.jpg">
    </div>
</div>
```

```css:style.css
.infinity-slide{
  display: flex; /* 二つのスライドを横に並べる */
  width: 50vw;
  margin: 0 25vw;
  background: gray;
  overflow: hidden;
}

#slide {
  animation: infinity-loop 10s infinite linear 1s both; /* 無限ループアニメーションの設定 */
  display: flex; /* スライドの要素を横に並べる */
  width: 50vw;
  height: 100px;
  position: relative;
}

#slide img{
  height: 100%;
  width: auto；
}

/* 無限ループアニメーション */
@keyframes infinity-loop {
  from {
    transform: translateX(0vw);
  }
  to {
    transform: translateX(-50vw);
  }
}
```


他にいい案があれば教えていただきたいですねええええ
Github の Pull Request に紐づく base / head branch を curl と jq で取得する

自分が開発中の Pull Request が複数あるリポジトリで、該当するブランチどれだっけなーと確認するとき、毎回 Github の Pull Request 一覧を GUI から確認していました。

最近それだと中々面倒だなと思い、CLI から確認できるように、簡単なワンライナーを作ってみたのでそのメモです。

## 前提環境

* MacOSX 10.13.6
* Github Personal Access Token 取得済み (未取得の場合は <a href="https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/" target="_blank" rel="nofollow noopener">Creating a personal access token for the command line - User Documentation</a> 参照)
* jq インストール済み (未インストールの場合は <a href="https://stedolan.github.io/jq/download/" target="_blank" rel="nofollow noopener">Download jq</a> 参照)

## tl;dr

下記のようなコマンドを作りました。

```bash
curl -sH "Authorization: token ${GITHUB_API_TOKEN}" "https://api.github.com/repos/:owner/:repo/pulls" \
| jq '.[] | { number: .number, title: .title, base: .base.ref, head: .head.ref }'
```

* `GITHUB_API_TOKEN` は Github の Personal API Token、`:owner/:repo` はリポジトリオーナーとリポジトリ名で読み替えてください。
* `GITHUB_API_TOKEN` は予め取得しておき、環境変数などに保持しておいて使う想定です。

## 実行結果サンプル

最近学習中の <a href="https://github.com/styled-components/styled-components" target="_blank" rel="nofollow noopener">styled-components</a> で試します。

```bash
curl -sH "Authorization: token ${GITHUB_API_TOKEN}" "https://api.github.com/repos/styled-components/styled-components/pulls" \
| jq '.[] | { number: .number, title: .title, base: .base.ref, head: .head.ref }'
```

上記コマンドを実行すると、結果はこんな感じになります。Pull Request ごとに base branch と head branch が簡易的に確認できるようになっています。

```
{
  "number": 2043,
  "title": "Create directory for core package WIP",
  "base": "develop",
  "head": "add-styled-components-core"
}
{
  "number": 2032,
  "title": "Add a babel-macro",
  "base": "develop",
  "head": "add-macro"
}
...
```

## 上記コマンドについて補足

### curl と Github API について

curl から実行している Github APIは、`GET /repos/:owner/:repo/pulls` になります。こちらで対象リポジトリの Pull Request 情報の一覧を取得してきています。
<a href="https://developer.github.com/v3/pulls/#list-pull-requests" target="_blank" rel="nofollow noopener">Pull Requests | GitHub Developer Guide</a>

curl の`-H` オプションで Personal Access Token を指定しています。プライベートリポジトリについて確認する場合は必要になります。もしパブリックリポジトリであれば設定不要です。

また curl の `-s` オプションでダウンロード状況など、curl の不要な情報は非表示にしています。

リクエストパラメータに何も指定しないと、Pull Request の `state` が `open` のものが返却されます。

表示したい Pull Reuest の `state` を `closed` や `all` にしたい場合は、リクエストパラメータをリクエスト URL の末尾にリクエストパラメータを追加します。
例えば以下のような形です。

```
"https://api.github.com/repos/styled-components/styled-components/pulls?state=closed"
```

参考：https://developer.github.com/v3/pulls/#list-pull-requests

### jq について

curl で取得した Github API の Response JSON をパースするために、今回は jq を使いました。

最初の `.[]` で配列内のオブジェクトを取得し、次の `{ number: .number, title: .title, base: .base.ref, head: .head.ref }` で、必要となるオブジェクトのキーを抽出しつつ、新しくオブジェクトを作成して表示しています。

参考： https://stedolan.github.io/jq/manual/#Basicfilters

## 終わりに

一旦 Pull Request ごとに対応する base/head ブランチがわかるようになりました。まだ荒いですが、こちらをもとにより便利に使えるよう考えてみようと思います。
zshを使っていてbrewやanyenvが「zsh: command not found」した時の対応メモ

職場の開発チームがiTerm2とzshの組み合わせで使っていて、それに倣ったところとっても快適だったので、自分のPCの環境にも適用しました。
それまでターミナルをおっかなびっくり触っていた身としては、視覚的にとてもわかりやすくなり、怖いという気持ちがかなり軽減されました。うれしい🙂

ですが、これまでインストールしていたbashやanyenvなどが軒並みエラーを吐いて動かなくなり、こりゃ大変だと慌てて調べてなんとかした時の覚書です。
**（ネタバレ：全部設定ファイルのパスを書き換えたら解決しました）**

# brew
## どんなエラーが出たか
`brew -v`などのコマンドを実行すると**「zsh: command not found: brew」**と出るようになりました。
ためしにbashに切り替えてから同じコマンドを実行するとそちらでは問題なく動いていたので、zshの設定がコケてるのだなと思いました。

## 試したこと1：パスを書き換える
[zshが「command not found」と云う](http://qiita.com/harapeko_wktk/items/285d5c2a409346e3d55e)（10/6現在は削除されていました）を参考にパスの書き換えを行いました。
//から始まるコメントを除く、以下コマンドを上から1行ずつ実行していきます。

```
// 今現在のパスを確認
echo $PATH
// usr/lobal/binが足りなかったので足した
PATH=/bin:/usr/bin:/usr/local/bin:${PATH}
export PATH
// パスが書き換わったか確認
echo $PATH
// brewがきちんと動くか確認
brew -v
```
結果としてはbrewはきちんと動きましたが、その後タブやPCを落とすとリセットされてしまいました。
毎回書き換えるのはさすがに辛いので、設定を保存できないか探しました。

## 試したこと2：zshの設定ファイル（.zshrc）を書き換える

[bashからzshに移行したときのメモ](https://qiita.com/hiroyuki827/items/4e87ce517a4894f092e8#homebrew) のHomebrewの項目を参考に、User/ユーザー名/直下にあるzshの設定ファイルである`.zshrc`に `export PATH=/usr/local/bin:$PATH`を書き込みます。

```
// .zshrcファイルに一文を書き込む
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.zshrc
// brewがきちんと動くか確認
brew -v
```
試しにタブを閉じたりPCを再起動を何度か試しましたが問題なく動きました。
気分は祝杯モードです！超スッキリ🍻🍻🍻🍻🍻

# anyenv
## どんなエラーが出たか
確かVue cliをインストールしようとした時だったと思いますが、`vue init`コマンドを実行したところで**「zsh: command not found: anyenv」**とエラーが出ました。
先のbrewを解決した直後だったので「何回この作業しなきゃいけないの…」と心が折れかけつつ、でもやらないと先に進めないので足取り重く調べました。。

## 試したこと：.zshrcのパスを書き換える
過去にインストールしたのに何で？と思ったけど、こちらもやっぱりパスが通ってなかったようです。
以下の記事を参考にパスを通します。
[anyenvをインストールする -- blog.10rane.com](http://blog.10rane.com/2014/08/19/install-anyenv/)

[本家サイト](https://github.com/riywo/anyenv)のReadmeファイル内、INSTALLにある2〜4行目（１行目は既に終わっているので飛ばす）にある`~/.your_profile`をすべて`~/.zshrc`に変えながら１行ずつ実行していきます。

これが

```
// １行目は省略
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.your_profile
echo 'eval "$(anyenv init -)"' >> ~/.your_profile
exec $SHELL -l
```

こうなります。

```
// １行目は省略
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(anyenv init -)"' >> ~/.zshrc
exec $SHELL -l
```

`exec $SHELL -l`でターミナルを再起動したあと`anyenv`を実行したときに「Usage:」から始まる長文が表示されたら成功です。

以上です。
お疲れ様でした！！！🍻🍻🍻🍻🍻
Powershellでcsvをjsonにパースする

簡単で感動

```powershell

PS /Users/tetsuya/yamazon/sandbox> # 読み込み(cat)
PS /Users/tetsuya/yamazon/sandbox> gc ./a.csv
"no","name","attr"
"1","yamazon1","aws engineer"
"2","yamazon2","aws engineer"
"3","yamazon3","aws engineer"
"4","yamazon4","aws engineer"

PS /Users/tetsuya/yamazon/sandbox> # csv -> psobject 変換
PS /Users/tetsuya/yamazon/sandbox> gc ./a.csv |ConvertFrom-Csv

no name     attr
-- ----     ----
1  yamazon1 aws engineer
2  yamazon2 aws engineer
3  yamazon3 aws engineer
4  yamazon4 aws engineer

PS /Users/tetsuya/yamazon/sandbox> # csv -> psobject -> Json 変換
PS /Users/tetsuya/yamazon/sandbox> gc ./a.csv |ConvertFrom-Csv |ConvertTo-Json
[
  {
    "no": "1",
    "name": "yamazon1",
    "attr": "aws engineer"
  },
  {
    "no": "2",
    "name": "yamazon2",
    "attr": "aws engineer"
  },
  {
    "no": "3",
    "name": "yamazon3",
    "attr": "aws engineer"
  },
  {
    "no": "4",
    "name": "yamazon4",
    "attr": "aws engineer"
  }
]
PS /Users/tetsuya/yamazon/sandbox> 
PS /Users/tetsuya/yamazon/sandbox> わーい
わーい : The term 'わーい' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ わーい
+ ~~~
+ CategoryInfo          : ObjectNotFound: (わーい:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

PS /Users/tetsuya/yamazon/sandbox> # わーい の実行エラー
PS /Users/tetsuya/yamazon/sandbox> 
PS /Users/tetsuya/yamazon/sandbox> pwsh -v # バージョン確認(若干古い)
PowerShell v6.1.0-preview.1

```
CFMLログライブラリのLogBoxを試してみる

CFMLというのは、Javaプラットフォーム上で動作するライトウェイト言語としてもっと使われてもよさそうなのに、レガシーなイメージから敬遠されてしまっている可哀そうなやつなので、CFMLのモダンな開発スタイルについて、ちょっとづつ調べたものを残してみようかなと思ってます。

CFMLが使えるオープンソースのアプリケーションサーバーである[Lucee](https://github.com/lucee/Lucee)を、本当は最初に紹介すべきと思いつつ、まずは今思うところあって調査中の「LogBox」から書いてみることに。

##LogBoxとはなんぞや

そもそもCFMLすら知らない人がほとんどってのは置いといて、[LogBox](https://logbox.ortusbooks.com/)はCFMLの使い手向けに作られた[log4j](https://ja.wikipedia.org/wiki/Log4j)ライクなログライブラリです。これ[Coldbox](https://www.coldbox.org/)フレームワークを作っているOrtus Solutionsが作っているので、Coldbox専用のフレームワークだと思い込んでいたけどそうではなく、CFMLのどんな環境にも簡単に差し込んで使う事ができます。

![LogBox_300.png](https://qiita-image-store.s3.amazonaws.com/0/298603/af297ee8-8f83-50e5-b3fe-a4a6722931df.png)

##LogBoxのメリット

基本的なメリットはlog4jと同じで、ログレベルを指定するとそのレベル以下のログが自動的に出力されなくなるとか、クラスごとにロギングの設定を簡単に制御できるとか、ログ出力先をファイルにしたり、DBにしたりといったコントロールを簡単に行えるとか、そのあたりの地味に面倒なローレベルの処理に関して、車輪の再発明を行わなくて良い、という事になります。

## LogBoxのインストール

[Commandbox](https://www.ortussolutions.com/products/commandbox)を使っている場合は、Commandboxから下記のコマンドを打つだけで、[Forgebox](https://forgebox.io/)というリポジトリから自動的にファイルをダウンロードしてくれます。

```
box install logbox
```

後はダウンロードされたフォルダに「LogBox」という名前でマッピングを通すだけで使えます。

例えばデータソース「myDS」にログを保存したい場合は、次のようにconfigオブジェクトを作って、appenderでLoggerの各種設定値を追加します。その上でconfigオブジェクトを渡してLogBoxのインスタンスを生成。

```CFScript
// ログ設定
config = new logbox.system.logging.config.LogBoxConfig();
config.appender(
    name="MyCoolLogger",
    class="logbox.system.logging.appenders.DBAppender",
    properties={
        dsn="myDS",
        table="logs",
        autocreate=true,
        textDBType="text",
        async=true
    }
);
// Logboxインスタンス生成
logBox = new logbox.system.logging.LogBox(config);
```
後は名前指定でLoggerを呼び出し、info()やdebug()等のメソッドでログを記録することができます。

```CFScript

// Loggerの呼び出し
log = logBox.getLogger('MyCoolLogger');
// ログ記録
log.info('My first logger!');`
```

## 実行結果

ちゃんとDBに入ってますね。おもろいおもろい。
![DBAppender.PNG](https://qiita-image-store.s3.amazonaws.com/0/298603/9f492ef6-0844-9dfa-dcdd-693bd26d7d48.png)

Appenderの種類は一般的なFileAppenderとか、EmailAppenderなるものもありますが、Appenderを自作することもできるようなので、ある時急にどこかのクラウドサービスにログを保存したくなった時にも、Appenderを追加して切り替えるだけで対応できるように設計できそうです。

もう少し細かいところを掘っていこうと思いますが、CFMLで使える貴重なログライブラリなので、積極的に活用していくべきですね。
nodeとnpmのアップデートでつまづいたメモ

# はじめに
nodeとnpmのバージョンが古いのでアップデートしようとしてつまづいたのでメモ。

環境はmacOSX。

# メモ
## アップデート前バージョン
```terminal
$ node -v
v0.12.2
$ npm -v
-bash: npm: command not found
```
古い。
npm入ってた気がするけど。。

## nodeを再インストール
### nodeアンインストール
nodeの消し方をggって再インストールする。
参考： [MacにpkgでインストールしたNode.jsをアンインストールする手順](https://qiita.com/yoshikoba/items/4906829faaaae8c73e56)

`lsbom`…
初めて見るコマンドは調べてから使う。

> インストールパッケージに含まれているカタログファイル（*.bom）を参照する。
> 「lsbom」コマンドは、ディレクトリ部分を抜き出すなど、インストーラーでパッケージを開くよりも詳細な情報を確認できる。

[引用元](https://renoji.com/IT.php?Contents=ShellScript_Bash/Cmd_lsbom.html)

ほほん

`/var/db/receipts/org.nodejs.pkg.bom`に記載されてるファイルと指定ディレクトリとファイルを消す。

```terminal
$ lsbom -flspf /var/db/receipts/org.nodejs.pkg.bom | while read i; do sudo rm /usr/local/${i}; done
$ sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules var/db/receipts/org.nodejs.*
```

これできれいになったはず。

## homebrew導入
[homebrew](https://brew.sh/index_ja.html)を入れる。

```terminal
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

インストールを確認。

```terminal
$ brew -v
Homebrew 1.7.6
Homebrew/homebrew-core (git revision 5131; last commit 2018-10-06)
```
OK

## nodeインストール

### nodeのバージョン管理
nodeのバージョン管理できる`nodebrew`というものがある。
これがあればnodeのバージョンを簡単に切り替えられるようなので入れておこう。

```terminal
$ brew install nodebrew
```

確認。

```terminal
$ nodebrew -v
nodebrew 1.0.1
```
OK

### nodeインストール
`nodebrew`で最新版のnodeをインストールする。

```terminal
$ nodebrew install latest
Fetching: https://nodejs.org/dist/v10.11.0/node-v10.11.0-darwin-x64.tar.gz
Warning: Failed to create the file
Warning: /Users/hogehoge/.nodebrew/src/v10.11.0/node-v10.11.0-darwin-x64.tar.gz
Warning: : No such file or directory
                                                                           0.0%
curl: (23) Failed writing body (0 != 1058)
download failed: https://nodejs.org/dist/v10.11.0/node-v10.11.0-darwin-x64.tar.gz
```
エラー

ディレクトリを作成して再実行。

```terminal
$ mkdir -p ~/.nodebrew/src
$ nodebrew install latest
```

確認。

```terminal
$ ./.nodebrew/current/bin/node -v
v10.11.0
```
OK

#### pathを通す
絶対パスでしかアクセスできないのでpathに通す。

```terminal
$ echo 'export PATH=$PATH:/Users/hogehoge/.nodebrew/current/bin' >> ~/.bashrc
$ source .bashrc
$ node -v
v10.11.0
```
OK

## アップデート後バージョン

```terminal
$ node -v
v10.11.0
$ npm -v
6.4.1
```
OK

----
無事、アップデートが完了しました。

ちゃんちゃん。
Windows10 にAnaconda を入れてPython 2系と3系の共存が簡単にできた

会社のWindowsマシンにPython2系と3系の環境が必要になったので構築したときのメモを残しておきます。
もっと苦労するかと思ったら思いのほか簡単にできてびっくりしました。

## 実現したいこと
基本的にPython 3系の方が使う頻度が高いので、コマンドプロンプトにて
`python`
と打ってPython 3系が起動

`python2`
と打ってPython 2系が起動

という感じにしたい。

## 実行環境
Windows 10 64bit
Anaconda 5.2

## Anacondaをインストール
https://www.anaconda.com/download/#windows

Python 2.x versionとPython 3.x versionのリンクが表示されていますが、両方ダウンロード、インストールします。
詳細は割愛しますが、パスの自動設定するようインストーラのチェックボックスにチェックをいれてください。

## 該当ファイルのファイル名を変更
Anaconda2フォルダ内にある"python.exe"を同じディレクトリーにコピーして"python2.exe"を作成してください。
(コピーでなく名前の変更だけをしてしまうと設定に失敗してしまうようなので要注意)


次にAnaconda2のScripts内にあるファイル名を以下のように変更してください。

`anaconda.exe -> anaconda2.exe`
`anaconda-script.py -> anaconda2-script.py`
`conda.exe -> conda2.exe`
`conda-script.py -> conda2-script.py`
`easy_install.exe -> easy_install2.exe`
`easy_install-script.py -> easy_install2-script.py`
`pip.exe -> pip2.exe`
`pip-script.py ->pip2-script.py`
`spyder.exe -> spyder2.exe`
`spyder-script.py -> spyder2-script.py`

以上で設定完了、実現したいことの通りにできました！

## 参考ブログ
http://whitecat-student.hatenablog.com/entry/2016/12/28/193156
Effective C++ 読書メモ　

Effective C++を読み始めたので、ちょこちょこメモを書いていきたいと思います。メモの取り方としては、下の流れで書いていこうと思います。
１）読みながら気になったキーワードを書く
２）キーワードを補足しながら、文章を足していく。
２）コードをGitHubにあげる。https://github.com/brookvalewalk
最初から完璧なものを書こうとすると、なかなか投稿できないし継続できないと思いますので。Qtも習得中なので、コードはQtCreatorでプロジェクトを作成して、GitHubにもソースを上げたいと思います。では、第1回目スタート〜。

# 0.イントロダクション
## 用語法
### 宣言
**コンパイラ**に対して、識別子何かの名前と型を知らせるものです。

```c++:main.cpp
QString sayHello(); // 関数の宣言
class MyWidget;     // クラスの宣言
```

### 定義
宣言で省略した詳細をコンパイラに知らせるもの。

```c++:main.cpp
QString sayHello() {

    return "Hello!";
}

// クラスの定義
class MyWidget
{
public:
    MyWidget(QString word){
        greatingWord = word;
    }
    ~MyWidget();

private:
    QString greatingWord;

};
```

### 初期化
- オブジェクトに最初に値を与えるプロセス。
- デフォルトコンストラクタ  
引数を取らないコンストラクタ
- explicitキーワード  
暗黙の型変換を防止するのが目的。explicitなしで宣言すると意図しない型変換が行われるのでバグの要因になる。
- コピーコンストラクタ  
オブジェクトを「同じ型の別のオブジェクト」で初期化するときに使われる。
- コピー代入演算子  
オブジェクトを「同じ型の別のオブジェクト」を代入するときに使われる。

### 参考文献
- What is the difference between a definition and a declaration?  
https://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration
- 宣言と定義 (C++)   
https://msdn.microsoft.com/ja-jp/library/0e5kx78b.aspx　　
- C++宣言と定義の早見表  
http://flat-leon.hatenablog.com/entry/cpp_decl_define_quick_ref


---
# １項「C++を複数の言語の連合とみなそう」
- C++は、もともとCにいくつかのオブジェクト指向的特徴を付け加え、「クラス付きC」と呼ばれていたが、誕生以来、改良され続けきた。
- 今日では、C++は単一の言語ではなく、関連する下記４つの言語の連合として捉えるべき。
    - C
    - オブジェクト指向C++
    - テンプレートC++
    - STL

### 参考文献
- book-notes/effective-c++-3rd-edition.markdown  
https://github.com/mgp/book-notes/blob/master/effective-c%2B%2B-3rd-edition.markdown
@import のディレクトリ内にファイルがないと assets:precompile でコケる

同じ轍を踏まないためにも、人柱になった自分を供養するためにも、ここにメモしておきたいと思います。
ちなみにアホかと思いますが、この件で4~5時間くらい悩んでいました。


# 前提

以下の条件でCSSをコンパイルしたい要件だったので、普通に何も考えずに `assets:precompile` するわけにはいきませんでした。

- Railsでassets:precompileする対象のマニフェストファイルに、 `require_self` `require_tree` などのディレクティブは書かない
- 必要なディレクトリ・ファイルはすべて `@import` して読み込む順番を制御する
- `assets/stylesheets/` 以下のCSSファイルをごっそり整理するために、ファイルを削除しまくったり、一時的に空のディレクトリを用意したりしておく必要がある

# TL;DR

結論を先に書くと、 `@import` する対象のディレクトリ内に何もファイルを置いていない状態だと、エラーが起きてしまいます。なので、空のファイルであっても、便宜的に置いておく必要があったようです。ちなみに、 `.keep` ではだめでした。ちゃんと `assets:precompile` の対象となる拡張子 （.scss、.coffeeなど）じゃないとだめなようです。

```:assets/stylesheets/以下
mixins/
  └ _buttons.scss # 中身はまだ空っぽ
variables/
  └ _colors.scss # 中身はまだ空っぽ
templates/
  └ users/
      └ foo.scss # 中身はまだ空っぽ
      └ bar.scss # 中身はまだ空っぽ
application.scss
```

```css:application.scss
@import "variables/*";
@import "mixins/*";
@import "templates/**/*";
```

# なぜこういうディレクトリ構成にしたかったか
通常、Railsでアセットパイプラインを管理する場合、 `assets/stylesheets/` 以下に、マニフェストファイルを置いておくと思います。デフォルトだと以下のようなディレクティブの書かれたファイルがおそらくあるでしょう。

```css:application.css
/* ...
*= require_self
*= require_tree .
*/
```

ただこの場合だと、**呼び出すファイルの順番をコントロールできないようです**。

[2.4 マニフェストファイルとディレクティブ | Rails Guide アセットパイプライン](https://railsguides.jp/asset_pipeline.html#%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96)

> ディレクティブは記載した順に実行されますが、require_treeでインクルードされるファイルの読み込み順序は指定できません。従って、特定の読み込み順に依存しないようにする必要があります。

たとえば共通で使っている変数なんかもいちいち各ファイルで呼び出さないといけなかったりします。うーんこれはDRYじゃない。

```css:foo.css
@import "../variables/*";

.foo {
  /* some styles */
}
```

```css:bar.css
@import "../variables/*";

.foo {
  /* some styles */
}
```

そこで、マニフェストファイル内ですべて `@import` しちゃえ！と思って、requireなんとかをやめてみたというわけです。そしたら、冒頭のようなディレクトリ構成でも、各ファイルで `@import` する必要もなくなるでしょう。

はたして、この構成が効率良いのかはまだ検証の余地があると思いますが、コントロールできる範囲が明確になって良き…といった感じです。
pythonをatomで開発する際のプラグインのエラー

#linter-flake8のエラー

Linter] Error running Flake8
Make sure `/Users/user_name/.virtualenvs/env1/bin/flake8
` is installed and on your PATH


flalerを入れ直したら治った

`pip install -e git+https://gitlab.com/pycqa/flake8#egg=flake8
`
psql -U postgresで接続できないとき

# 問題
- DBを作成しようとしていたが、 `$ psql -U postgres` でpostgresに接続できない

こうなる
 
```
[vagrant@localhost hoge]$ psql -U postgres
psql: FATAL:  Peer authentication failed for user "postgres"
```

# 解決策
- pg_hba.confをいじって、trust認証に変更
- postgresql再起動後、接続できるようになった！


### before

```
# "local" is for Unix domain socket connections only
local   all             all                                     peer
```

**peer** → **trust**

### after

```
# "local" is for Unix domain socket connections only
local   all             all                                     trust
```


# その他
- `pg_hba.conf` は、 `/var/lib/pgsql/data` にある（はず。defaultでは。）
- 解決に参考にしたページ：　[PostgreSQLのPeer認証と他の認証方法への変更
](http://www.utsushiiro.jp/blog/archives/327)
- `trust認証` についてはよくわかっていません

--- 

以下、追記（2018.10.9）

## trust認証について
[参考](https://www.postgresql.jp/document/9.2/html/auth-methods.html)
> trust認証が指定されるとPostgreSQLは、サーバに接続できる全ての人に対して （データベーススーパーユーザさえも）その人が指定する任意のデータベースユーザ名としてのアクセス権限が付与されていると想定します。
> trust認証はユーザが1人のみのワークステーション上でローカル接続を行う場合は適切であると同時に非常に便利です。 複数ユーザが存在するマシン上では一般的に適切ではありません。

今回は自分の開発環境における話だったのでtrust認証にしています。

## Peer認証について
[参考](https://cpoint-lab.co.jp/article/201807/postgresql-%E5%AF%BE%E5%90%91peer%E8%AA%8D%E8%A8%BC%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%82%8B%E3%81%A8%E3%81%8D/)

> Peer認証とは、カーネルからクライアント上のシステムユーザ名を取得し、PostgreSQLデータベースユーザと同一である場合のみ接続が許可される仕組みです。 つまり、Postgresql内のユーザーとUNIXユーザで、ユーザー名が一致してさえいれば認証情報なしでログイン出来てしまう仕組みです。

今回接続できなかった理由です。
unixユーザ `vagrant` としてPostgresqlに接続しようとしていましたが、Postgresql内のユーザに `vagrant` が存在していなかったため接続できなかったと考えられます。