OmniAICreator/Qiita-1.07M huggingface dataset:
社員のやる気を出すためには、やる気を出させようとしてはいけない。プラスをプラスするのではなく、マイナスをマイナスするのが良い。株式会社アクシアの記事、抜粋まとめ + エンジニアひとりごと。

社員のやる気を出すためには、やる気を出させようとしてはいけない。プラスをプラスするのではなく、マイナスをマイナスするのが良い。株式会社アクシアの記事、抜粋まとめ + エンジニアひとりごと。

# Ref

[社員のやる気を引き出せると思っていた無能経営者の話 - 株式会社アクシア](https://axia.co.jp/2018-04-24)

[社員のやる気を奪う業務改善７つの法則 - 株式会社アクシア](https://axia.co.jp/2018-04-23)

# 「社員のやる気を引き出すこと」ではなく、「社員のやる気を奪わないこと」だと考えました。

マイナスをマイナスするなり。エンジニアは問題解決が好きだし、マイナスのマイナスは得意だよね。

# 業務改善したいのであれば、まずは特別ミーティングを定時後ではなく業務時間内で行うようにしましょう。

身を削るようなブラックな働き方はやめよう。

# せっかく前向きな姿勢で意見を出してくれた人が損してしまうような理不尽なことはやめましょう。

自由な意見を言えるようにして、心理的安全性を保とう。

# これについては残業削減した実績も経験もない人が時々「業務効率化すれば残業削減できる」とか言ってますけどウソですからね。

エンジニアはエネルギーと集中力の仕事。時間を伸ばしても良いことなんて絶対ない。


---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Qiitaに記事を全部で1000個書いた。GoogleAnalyticsのアクセス解析を入れたら1日3000ユーザーのアクセスがあることがわかった。Qiitaすごいな。

Qiitaに記事を1000個書いた。GoogleAnalyticsのアクセス解析を入れたら1日3000ユーザーのアクセスがあることがわかった。Qiitaすごいな。


![image](https://user-images.githubusercontent.com/13635059/51286947-a6c61180-1a38-11e9-8f4d-42e86db820cf.png)
![image](https://user-images.githubusercontent.com/13635059/51286983-ce1cde80-1a38-11e9-9478-6efedabbe80b.png)


ちなみにいま、記事は1000個いかないぐらい。

[YumaInaura - Qiita](https://qiita.com/YumaInaura)

![image](https://user-images.githubusercontent.com/13635059/51286901-623a7600-1a38-11e9-8d8a-447ec96a7348.png)

---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PHP　strrevの使い方

#strrevの使い方

**strrev→文字位置を逆にして出力してくれる。**

Stressed→stress(動詞)の過去形、過去分詞形　　　　圧力、重力をかける

*1.変数を置くパターン*
`<?php
$a='stressed';
echo strrev($a);
?>`

*2.そのまま打ち込むパターン*
`<?php
echo strrev('stressed');
?>`

出力　desserts
Kotlin 1.3のCoroutineの使い方⑤（スコープビルダー）

# 検証環境
この記事の内容は、以下の環境で検証しました。

* Intellij IDEA ULTIMATE 2018.2
* Kotlin 1.3.0
* Gradle Projectで作成
* GradleファイルはKotlinで記述（KotlinでDSL）

# 準備
詳細は下記の準備を参照してください。
https://qiita.com/naoi/items/8abf2cddfc2cb3802daa

# Scope builder
[前回](https://qiita.com/naoi/items/c67d3bd6a5163aa9f2f3)に引き続き、[公式サイト](http://kotlinlang.org/docs/reference/coroutines/basics.html#scope-builder)を読み解いていきます。

このブロックのタイトルは「Scope builder」となっています。
なんとなくですが、スコープを作れるのではと勘ぐってしまうタイトルです。

それでは、読み進めていきます。

>In addition to the coroutine scope provided by different builders, it is possible to declare your own scope using coroutineScope builder. 
>It creates new coroutine scope and does not complete until all launched children complete. 
>The main difference between runBlocking and coroutineScope is that the latter does not block the current thread while waiting for all children to complete.

意訳込みですが翻訳すると以下のようなります。

>異なるスコープのビルダーに加えて、 **coroutineScope** を使用すれば、独自のスコープも定義できます。
>**coroutineScope** で新しく定義したコルーチンは、起動したすべての子コルーチンが完了するまで、終わりません。
> **runBlocking** と **coroutineScope** との違いがあります。 **runBlocking** は起動した子コルーチンが完了するまで処理をまちます。 **coroutineScope** は子コルーチンの完了をまちません。

なるほど、上記の説明を読むとサンプルコードと実行結果がなっとくできます。
公式サイトのサンプルコードは以下のようなっています。

```kotlin
import kotlinx.coroutines.*

fun main() = runBlocking { // this: CoroutineScope
    launch { 
        delay(200L)
        println("Task from runBlocking")
    }
    
    coroutineScope { // Creates a new coroutine scope
        launch {
            delay(500L) 
            println("Task from nested launch")
        }
    
        delay(100L)
        println("Task from coroutine scope") // This line will be printed before nested launch
    }
    
    println("Coroutine scope is over") // This line is not printed until nested launch completes
}
```

結果が以下のとおりです。

```text
Task from launch-launch
Task from coroutine scope
Task from runBlocking
Task from nested launch
Coroutine scope is over
```

runBlockingは子コルーチンが終わるまで待っているから、「Coroutine scope is over」の出力が一番最後なんですね。

これらの説明を図にするとこんな感じです。

![Scope Builder.png](https://qiita-image-store.s3.amazonaws.com/0/99960/a5478d33-8652-da3f-04f1-40a17a392ed9.png)


ということは、coroutineScopeだけでコルーチンを実装していくと、どこかでjoinしない限りは子コルーチンの完了を待ちません。
結果的にrunBlockingを使う事が望ましいわけですね。

# まとめ
このブロックで理解できたことは以下のことだと思います。

* coroutineScopeで独自のスコープを定義できる
* coroutineScopeは子コルーチンの完了をまたない
* runBlockingは子コルーチンの完了を待つ
WinからMacに乗換えた人へ贈る、「外付HDD取外ボタン」をメニューバーに出す方法

- TimeMachine用の外付けHDDを外す際のクリック数を減らしたかったのでメモ。
- Windows(タスクバーから右クリックでできる)が長かった僕としては、メニューバーに出てると嬉しかった。

## Semulov 入れましょう

https://www.kainjow.com/ からダウンロードできます。
見た目は↓のような感じです。

![Semulov](https://images.sftcdn.net/images/t_app-cover-l,f_auto/p/942f8148-a4d6-11e6-830d-00163ec9f5fa/3065532181/semulov-screenshot.jpg)

## 通知がウザければOFFに

よく分からんのですが、システムが勝手に mount/unmount してくることがあるっぽくて、そのときに毎度通知が(右上に)出てくると気が散ります。

その場合は↓の方法で通知をオフにすると良いと思います。
https://timetoenjoy.info/archives/543


## 並び順はCommandで変えれます

![move icon on menubar in MacOS](https://usedoor.jp/wp-content/uploads/mac/menubar-icon-narabi-junban-henkou/001.png)

出典: https://usedoor.jp/howto/digital/mac-os/menubar-icon-narabi-junban-henkou/
￼スターバックスカードの登録には膨大なコストがかかる。アプリで番号入力を間違うとバックスペースできずに最初からやり直し。人間に優しいデバイスやインターフェイスの世界が来てほしい。

￼スターバックスカードの登録には膨大なコストがかかる。アプリで番号入力を間違うとバックスペースできずに最初からやり直し。人間に優しいデバイスやインターフェイスの世界が来てほしい。

![image](https://user-images.githubusercontent.com/13635059/51286531-c4927700-1a36-11e9-948b-638fcb62cdf2.png)

取るに足らないことだと思うかもしれないが、買うの迷う位には迷う。

# 今日もバレンタインのスターバックスカードが出ていたので、一瞬で買った。

だけどスターバックスカードの登録にあまりにエネルギーを使うので、本当に欲しいカードだったのに30秒ぐらい躊躇したぞ。

何故かと言うと、まず裏側のシールが、コードが書かれているところをめぐるところがすごく話しにくい。僕は体がすごく不器用なので、冬だと言うこともありかじかんでいるし、これをきれいに剥がすだけでとても辛い。

# 相当頑張らなくては汚い感じになってしまうしものすごくべとべとする。

これを侮るなかれ。本当にべとべとするし本当に大変だからやってみてほしい。

もう一つはカードの登録。アマゾンみたいに、ギフトカードをスキャンして読み取る方式にはなっていない。まさかのテレ数字を入力しなければいけない。

これがなんと20桁もある。気が遠くなる。人間はカードを見たりスマホの画面を見たりして、20桁の数字を間違わずに入力すると言う事はめちゃくちゃ難易度が高いじゃないか。

# しかも、この登録フォームが1文字でも間違うと、うまくバックスペースで該当の箇所だけ削除できない作りになっていて、いちど1文字でも間違ったらまたやり直しだ。

スターバックスはカードのウェブ登録を推奨しているのに、なんでこんなに悪いインターフェースしかないのだろう。お金をかけていないんだろうな。

まぁアマゾンのギフトカードの規模から比べたら、そこまで膨大なお金をかけられないのはわかるけれど。

これは前にも語ったことけれど、スターバックスカードの登録でエネルギーを使い果たしてしまうと、せっかく朝マインドフルネスのようなものを感じにスターバックスに来ているのに、それが全部没収されてしまうような感じだ。世界ふしぎ発見。ひとし君人形が回収される。

# だからインターフェイスと言うものは、やっぱり人間の、人間による、人間らしい時間を奪わないために配慮してほしいと思うところだ。

---

https://twitter.com/yumainaura

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












<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ときめきメモリアルが「ワクワクメモリアル」だったらどうする？エンジニアならわかる、言葉や名前の魔法。プログラミングは名前が9割。

ときめきメモリアルが「ワクワクメモリアル」だったらどうする？エンジニアならわかる、言葉や名前の魔法。プログラミングは名前が9割。

# お片付けの魔法のこんまりさんが、海外で大変な人気を博していると聞いたぞ

[ネットフリックスの新番組、公開しました！ | 近藤麻理恵オフィシャルブログ「こんまりのときめき片づけDays」Powered by Ameba](https://ameblo.jp/konmari/entry-12430345873.html)

単に部屋の片付けにとどまらず「ときめきで物事を選ぶ」という、強力すぎる人生のキーワードを与えてくれた。

こんまりさん。自分が決断すること、選ぶことの全てに適用できる気がする。

今は使い古されてしまった感もある「ワクワク」という言葉じゃなくて「ときめき」という表現が、すごく良い。

https://twitter.com/yumainaura/status/1085335268939317248?s=12

# ときめきとわくわくって何が違うんだろう。

このたった4文字の違いだけで、人間には異なる肉体的反応が起こる。それは確実だ。

肉体的反応と言うのは、感情的反応と言い換えても良い。もしそれが嘘だと思うなら、ときめきと口に出してみて、ワクワクと口に出してみた、どちらを口に出したいかを比較してみると良い。

これが信じられないという人は、まぁ、今僕が語っている言葉もそもそも言語的なニュアンスを帯びて伝わっていないはずなので、そもそもこの文章は読んでいないだろう。

# わくわくと言う言葉は、なんというか、自己啓発の世界によって使い古されてしまった感じがある。

だけどこんまりさんのこの本の良いところは、ときめきと言う言葉を使ったことだ。

ときめきと言うのは、いいふるされていない言葉だ。昔ときめきメモリアルと言う恋愛ゲームがあって、エンジニアであれば、というか粗さの男であれば必ず遊んだことのあるようなゲームだけど、あれもタイトルにときめきとついてるのが良い。

# これがもしわくわくメモリアルだったら、僕らはワクワクしてワクワクメモリアルをプレイできなかったことだろう。

ヒット作品にはならなかったかもしれない。それぐらい言葉の威力と言うのはすごい。エンジニアだって、1つのメソッドに付ける名前や、1つのクラスに付ける名前と言う物の魔法的な威力を知っている事だろう。

ときめきメモリアル。わくわくメモリアル。言葉の魔法を感じるには、この言い方がものすごく、年代によっては、響くような気がしてきたぞ。

なのでアラサーのエンジニアとプログラミングの名前の魔法について話すときは、このときめきメモリアルとわくわくメモリアルの例えを出すといいと思うで。

なので今、ときめきと言う言葉は偉大なのだ。だけどこれも、自己啓発の世界などによっていいふるされてしまったら、僕らの言葉に対する脳の履歴が変わって、また魔法を失ってしまうかもしれない。

ちなみにわくわくと言う言葉はわかる人にはわかり、わからない人にはわからない言葉だと思う。たった4文字の言葉なのだから、それが肉体的に、脳にどう理解されているかと言う事は、どんな脳の反応が起こるかと言う事は、個人によって本当に複雑で千差万別な反射だ。

---

https://twitter.com/yumainaura

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











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Laravel5 QueryBuilderでgroupByが動かない時の対応方法

#環境
- Laravel 5.7
- PHP 7.2

#事象
例えばQueryBuilderで以下のようなクエリを書くとエラーが発生。

```php
$users = DB::table("users")
            ->groupBy("name")
            ->get();
```

`SQLSTATE[42000]: Syntax error or access violation: 1055 'laravel_test.users.id' isn't in GROUP BY (SQL: select * from `users` group by `name`)`

海外のサイトに解決方法がありました。
<a href="https://itsolutionstuff.com/post/laravel-55-group-by-doesnt-work-fixedexample.html" target="_blank">Laravel 5.5 group by doesn't work - fixed</a>

#解決方法
config/database.phpファイルで "strict"モードをfalseにします。

```php:config/database.php
...
'strict' => true,
To
'strict' => false,
....
```

##MySQL の strict モード
Laravel5.3以上では、`strict` が `false` から `true` にデフォルト値が変わっています。`strict` が `true` の場合、以下の `sql_mode` がセットされます。

```php
set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
```

この `ONLY_FULL_GROUP_BY` を許容しないために発生している事象でした。
他にも `NO_ZERO_DATE` や `NO_ZERO_IN_DATE` などを使うケースでは要注意。

でも LaravelのQueryBuiderって `DISTINCT` で重複除去できないので `groupBy` 普通に使う気がするんですが…そういう時はQueryBuider使うなって事なんですかね…。
眠れない夜のために（２）〜延々と羊を数え続ける関数〜sheeps.


眠れない夜にこのプログラムを実行して、延々と画面を見続けましょう。
多倍長数なので、オーバーフローするまで寝ないで見続けると、多分、人間は死にます。

```
(defun sheeps () (do ((i 1 (+ i 1))) (() ()) (format t "羊が~A匹~%" i)))
```

clispのインストール（Ubuntu,Debian)

```
sudo apt-get install clisp
```
python版

```sheeps.py
#!/usr/bin/python3
print ("1 sheep.")
i=2
while True:
  print(i,"sheeps.")
  i+=1
```
AI女子、無料GPUでYOLO v3はじめました。

#はじめに
AIスタートアップでWEBアプリ開発をやりながら、pythonとAIを勉強中です。
画像認識でやりたいことがあり、まずは開発環境の構築とアルゴリズムを使ってみるところまでを実践しました。

#今回やりたいこと
* YOLOv3を使う
* 無料でGPUを使う

#YOLOとは
物体検出アルゴリズムのうちの１つです。（物体検出は他にFaster R-CNNやSSDなどのアルゴリズムがあります。）
YOLOの特徴は、速くて高精度なことで、現在v3が最新バージョンです。
今回ニューラルネットフレームワークはDarknetを使ます。（フレームワークは他に、TensorflowやChainer、Caffeなどがあります。）
ちなみに、YOLOはYou only look onceの略で、You only live once(人生一度きり)をもじっているそうです。

#YOLOで物体検出する
##Darknetのインストール
```
git clone https://github.com/pjreddie/darknet
cd darknet
```
##設定
Makefileで下記をはじめとする設定を変更できます。

```
GPU=0
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0
```
##実行
設定を変更したら、実行します。

```
make
```
##weightsのダウンロード
今回は学習済みモデルを使用するので、ダウンロードします。
v2: https://pjreddie.com/media/files/yolov2.weights
v3: https://pjreddie.com/media/files/yolov3.weights

```
wget https://pjreddie.com/media/files/yolov3.weights
```
##物体検出
それでは物体検出してみます。
###v2の場合

```
./darknet detect cfg/yolov2.cfg yolo.weights ./data/dog.jpg
```
![predictions.jpg](https://qiita-image-store.s3.amazonaws.com/0/223989/44449ff6-2413-20be-2f4c-ddbe93123016.jpeg)

```
./data/dog.jpg: Predicted in 8.501023 seconds.
dog: 82%
truck: 64%
bicycle: 85%
```

###v3の場合

```
./darknet detect cfg/yolov3.cfg yolov3.weights ./data/dog.jpg
```
![predictions.jpg](https://qiita-image-store.s3.amazonaws.com/0/223989/3f4946bc-1035-aa04-d8b3-e7059ec27520.jpeg)

```
./data/dog.jpg: Predicted in 19.580538 seconds.
bicycle: 99%
truck: 92%
dog: 100%
```

v2とv３は今回2倍以上時間はかかったけど、確実に精度が上がっていることがわかりました。

|物体検出|YOLO v2|YOLO v3|
|---|---|---|
|自転車|82%|99%|
|トラック|64%|92%|
|犬|85%|100%|
|時間|8.5秒|19.6秒|

#無料GPU環境の構築
YOLOを使うことができたので、早速学習させたいのですが、大量データを学習させる時はGPUを使いたいと思いました。
調べたところ、無料で簡単にGPUが使えるGoogle Colaboratory（グーグル・コラボレイトリー）が最強のようです。
Google Colaboratoryは、クラウドのJupyterノートブック環境です。
ここから使えます。
https://colab.research.google.com/notebooks/welcome.ipynb

##GPU有効化
ColaboratoryでGPUを使う場合、タブの
「ランタイム」→「ランタイプのタイプを変更」→「ハードウェア アクセラレータ」→「GPU」
で保存します。
<img width="1415" alt="スクリーンショット 2019-01-17 8.38.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/223989/6505cd36-5fed-36f5-89d1-76cc27cd958e.png">

<img width="1415" alt="スクリーンショット 2019-01-17 8.37.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/223989/37f10aa2-5477-613e-847b-b7b619ce31f1.png">

以上でGPU環境が整いました。なんて簡単！

##注意
ただし、Google Colaboratoryでは、下記の条件でインスタンスが全てリセットになってしまうので注意が必要です。

* 12時間ルール：新しいインスタンスを起動してから12時間経過
* 90分ルール：ノートブックのセッションが切れてから90分経過

対策はこちらの記事にも書かれていました。
https://qiita.com/enmaru/items/2770df602dd7778d4ce6

環境が整ったので、次回は実際にYOLOを使って学習させてみます！
再帰的な関数を用いてフィボナッチ数列を実装します

## はじめに
Pythonを用いてフィボナッチ数列を実装します。

## フィボナッチ数列とは

フィボナッチ数列は、以下のルールで成り立つ数列です。

1番目の数値は 1
2番目の数値は 1
3番目以降の数値は、直前の2つの数値の和となります。
3番目は 1 + 1 = 2
4番目は 1 + 2 = 3
5番目は 2 + 3 = 5
6番目は 3 + 5 = 8
7番目は 5 + 8 = 13
8番目は 8 + 13 = 21
9番目は 13 + 21 = 34
10番目は21 + 24 = 55

## Pythonの再帰回数の上限に注意
Pythonでフィボナッチ数列を再帰関数で実装する場合は、再帰関数の上限（最大再帰数）に注意してください
#### 参考リンク
* https://note.nkmk.me/python-sys-recursionlimit/

#### コード
``` py
import sys

def fibonacci(num : int) -> int:
    """フィボナッチ数列の値を返す
    
    フィボナッチ数列を返す関数であり、1番目から数え始める。
    0以下の値を受け取った場合は-1で返す
    
    Args:
        フィボナッチ数列の何番目の値 (1から数え始める)
    
    Returns:
        指定された番号のフィボナッチ数列を返す
    """
    
    if num <= 0:
        return -1
    
    if num == 1:
        return 1
    
    if num == 2:
        return 1

    return fibonacci(num - 2) + fibonacci(num - 1)


print(f"Recursion upper limit : {sys.getrecursionlimit()}")

# 1番目から10番目までのフィボナッチ数列を出力 (正常ケース)
for i in range(1, 11):
    result = fibonacci(i)
    print(f"[Normal Case] input : {i}, result : {fibonacci(i)}")

# 0番目のフィボナッチ数列を出力 (エラーケース)
print(f"[Error Case] input : {0}, result : {fibonacci(0)}")

# -1番目のフィボナッチ数列を出力 (エラーケース)
print(f"[Error Case] input : {-1}, result : {fibonacci(-1)}")

```

```
Recursion upper limit : 1000
[Normal Case] input : 1, result : 1
[Normal Case] input : 2, result : 1
[Normal Case] input : 3, result : 2
[Normal Case] input : 4, result : 3
[Normal Case] input : 5, result : 5
[Normal Case] input : 6, result : 8
[Normal Case] input : 7, result : 13
[Normal Case] input : 8, result : 21
[Normal Case] input : 9, result : 34
[Normal Case] input : 10, result : 55
[Error Case] input : 0, result : -1
[Error Case] input : -1, result : -1
```

## LRUキャッシュを用いて高速化
LRUキャッシュを使用することで、処理を高速化できます

https://qiita.com/ka201504/items/64c3f70a2383ec0eef09

#### コード
``` py
from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(num):
    
    a, b = 1, 1
    
    for _ in range(1, num):
        a, b = b, a + b
    
    return a


print(fibonacci(10))
print(fibonacci(100))
```

```
55
354224848179261915075
```
Vimでうるさくない畳み込み

# 問題
[vim-plug](https://github.com/junegunn/vim-plug)を使っていてプラグイン固有の設定は```Plug 'repo/name'```直下に書いて畳み込む方針をとっているのだが、

- [x] 何行畳み込まれているか表示しなくていいからインデント(今回はPlugの文字)を揃えてほしい
- [x] pane端まで伸びる・・・が邪魔
- [x] molokaiだと文字が薄くて見ずらい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/45682/b88f4eab-f25c-fc81-f6ad-88bf877bb5bc.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45682/134786da-6f3a-2275-20e6-285c77ed59cf.png)

# 解決
```vim:~/.vimrc
set foldtext=getline(v:foldstart)
set fillchars=fold:\ 
au Colorscheme * hi Folded ctermfg=HotPink guifg=HotPink
```
スッキリ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45682/0a348211-3b40-3574-2c29-deeec2d55469.png)
Django REST framework & Reactで初めてのSPAを作ってみた

作家の人気投票ができるサイト[Book Timeline](https://book-timeline.herokuapp.com/)を作ってみました。自分の好きな作家を人気投票の対象に登録することができます。投票はそれぞれの作家のページからQiitaのいいねボタンみたいな感じでスターボタンがあるので、それを押すと一票いれることができます。色々と遊んでみてください！
<img width="1440" alt="スクリーンショット 2019-01-16 22.37.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/259118/86c0cbe6-2872-a7a3-c647-aa0a97fc3c6f.png">

# 使った技術
* Django REST framework
* React
* Heroku

バックエンドをDjango、フロントエンドをReactで作っています。といっても、ベースはDjangoでtemplateからReactのビルドファイルを読み込んでいるような形になっています。Django + Reactの構成って調べてみると色々あってどれがいいのか迷ったのですが、最終的には[この記事](https://www.valentinog.com/blog/tutorial-api-django-rest-react/)を参考にして同じ構成でやってみました。  
Reactといえば、SPAですが[Book Timeline](https://www.book-timeline.site/)も例に漏れずSPAになっています。ページ間の遷移による読み込みがなく、特にパフォーマンスチューニングもしてませんが（する知見を持っていない）、割とサクサク動いてくれている気がします。DBからのデータの取得などは、Django REST FrameworkでAPIのエンドポイントを作成し、Reactから`fetch`で非同期でとってきています。  
書籍の情報の取得には外部APIを利用しています。書籍情報を取得できるAPIは、[OpenBD](https://openbd.jp/)やら[Google Books API](https://developers.google.com/books/?hl=ja)やら[国立国会図書館のAPI](http://iss.ndl.go.jp/information/api/)やら色々あるのですが、今回は[楽天ブックス書籍検索API](https://webservice.rakuten.co.jp/api/booksbooksearch/)を使いました。それぞれのAPIで結構特徴が異なるので目的に応じて使い分ける、または組み合わせて使うのが良いかと思います。  

# 個人開発のすゝめ
個人開発おすすめです。  
やはりフロントエンド、バックエンドからインフラまで一人でやらなければならないので、知識がついた気がします。会社でコードを書いているとベース部分は他の人が作っちゃってて、ロジック部分だけコーディングして...といった感じでpython一応書けるけど、環境構築よくわからないとかインフラ全然わかりませんとなってしまいがちだったんですが、企画・設計・開発・リリースまで一通り経験できたのは良かったのかなと思います。（こんなにきっちりフェーズ分けてはやってないんですが...）  
あとReactは、きちんとComponent分けをして実装すれば、そのまま再利用可能なので、書いたコードが自分の資産にもなります。他の言語と比べてもその特色は強い気がします。コンポーネントを記述したファイルをコピーするだけで済んじゃいますからね。  
それと、自分一人でできることが増えてくると、なぜだか色々とアイデアが浮かんでくるようになりました。まぁたいていは、翌朝になってみると大したことのないアイデアだなぁとなるんですが。。。きっといつかはすごいものを思いつくことでしょう。。。ご期待ください。  
ただやっぱりモチベーションの維持は大変だなぁと感じながらやってました。納期があるわけでもないものを自分の意思だけで仕事以外の時間を使って続けるのって大変に決まってますよね。私はやりたくない時、やる気が起きない時はやらないことにしてました。則天去私、天の意思に任せます。もしくは、個人開発によってガッポガッポお金が懐に入って来たときのことを想像して、自分を奮い立たせましょう。
Enjoy coding!!

# 補足
[Book Timeline](https://book-timeline.herokuapp.com/)よろしくお願いします！
技術書だけじゃなくて、小説も読んでみませんか。
Flutterで背景透過したModalを出したい

![transparent.gif](https://qiita-image-store.s3.amazonaws.com/0/31237/7ec00eb2-0a1b-4376-af53-7f4d4de988b9.gif)

なるほどねという感じ。
https://github.com/flutter/flutter/blob/master/examples/flutter_gallery/lib/demo/material/dialog_demo.dart#L196

にあるようなサンプルでは `MaterialPageRoute` を使うことを推奨されているが、これはiOSでいうところの `vc.modalPresentationStyle = .overCurrentContext` みたいのは持ってない。

どうするかというと　`PageRouteBuilder` というのを代わりに使う。

遷移元

```dart

Navigator.push(context,
  PageRouteBuilder(
    opaque: false,
    pageBuilder:
        (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
      return NextScreen(); //遷移先
    },
    transitionsBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
      return SlideTransition(
        position: new Tween<Offset>(
          begin: const Offset(0.0, 1.0),
          end: Offset.zero,
        ).animate(animation),
        child: new SlideTransition(
          position: new Tween<Offset>(
            begin: Offset.zero,
            end: const Offset(0.0, 0.0),
          ).animate(secondaryAnimation),
          child: child,
        ),
      );
    },
  ),
);
```
遷移先には特に工夫はいらないが `backgroundColor: Colors.black.withOpacity(0.5)` とかをRoot Widgetにやっておけばいい感じになる。
vim/neovimの起動時間・プラグイン読込時間を調べる

nvim, vimの起動時間を調べるには起動時に `--startuptime` オプションをつけて起動します。
最後の引数はログを書き込むファイルパスです。

```shell-session
$ nvim --startuptime ./startup.log
$ vim --startuptime ./startup.log
```

nvim(,vim)ログを表示してみます。`:e startup.log`

```nvim_--startuptime_startup.log
times in msec
 clock   self+sourced   self:  sourced script
 clock   elapsed:              other lines

000.057  000.057: --- NVIM STARTING ---
000.657  000.600: locale set
006.141  005.484: inits 1
006.167  000.026: window checked
006.400  000.233: parsing arguments
006.471  000.072: expanding arguments
006.537  000.065: inits 2
008.823  002.287: init highlight
008.971  000.034  000.034: sourcing $VIM/sysinit.vim
009.409  000.272  000.272: sourcing /home/vagrant/.config/nvim/autocmd.rc.vim
009.660  000.153  000.153: sourcing /home/vagrant/.config/nvim/keymap.rc.vim
029.147  000.064  000.064: sourcing /usr/share/vim/vimfiles/ftdetect/dockerfile.vim
029.239  000.047  000.047: sourcing /usr/share/vim/vimfiles/ftdetect/pullrequest.vim
029.382  018.686  018.574: sourcing /usr/share/nvim/runtime/filetype.vim
...長いので割愛
```

どのプラグインがボトルネックになっているか調べたかったので、各プラグインの読込時間順に並べます。
1列目が起動時間の累積和, 2列目が各プラグイン読込にかかる時間なので、2列目でソートしてやると各プラグインの読込時間を調べることができます。

```vim
:%!sort -k2nr
```

```nvim_--startuptime_startup.log_sorted
1003.628  404.487: VimEnter autocommands
181.330  172.312  002.493: sourcing /home/vagrant/.config/nvim/init.vim
179.070  136.496  016.331: sourcing /home/vagrant/.local/share/dein/state_nvim.vim
167.905  117.085  116.138: sourcing /usr/share/nvim/runtime/autoload/provider/python3.vim
484.293  085.625  081.062: sourcing /home/vagrant/.local/share/dein/.cache/init.vim/.dein/plugin/yankring.vim
233.473  052.029  001.100: sourcing /usr/share/nvim/runtime/syntax/syntax.vim
397.464  048.698  048.698: sourcing /home/vagrant/.local/share/dein/.cache/init.vim/.dein/plugin/unimpaired.vim
563.897  039.847: opening buffers
282.280  039.627  019.037: sourcing /home/vagrant/.local/share/dein/.cache/init.vim/.dein/plugin/NERD_tree.vim
232.993  034.920  033.932: sourcing /usr/share/nvim/runtime/filetype.vim
1035.363  031.718: first screen update

...長いので割愛

 clock   elapsed:              other lines
 clock   self+sourced   self:  sourced script
times in msec
```

上位に挙がってくるプラグインはlazyやon_eventなどで起動を遅らせる処置が必要そうです。
gitメモ

Gitの操作でメッセージを入力することがあるらしい
その際にVisual Studio Codeを設定するといいらしい

※その前にコマンドラインから呼び出せるような設定になってる？
VSCでshift+command+Pを押す
shellと入力
シェルコマンドPATHにcodeコマンドをインストールします
をクリック 

Visual Studio Codeを設定する
＄ git config --global core.editor "code --wait"
Pythonで分析する際に使うコード【備忘録】


# 概要
Pythonで分析をする際に，
よく使うはずなのに結構忘れてしまうコードがあるため，備忘録を作成する．
まとめかたに工夫はなく，あくまでも今後Pythonを使用する際のメモ程度なのでご勘弁を．

# Pythonでよく使うCodeまとめ

## 目次
- データの概要確認
- 前処理
- Standard Scaler
- 欠損値の可視化
- Plot
- Feature Importance using Random Forest

###データの概要確認
```Py
Dir(library)
Help(library)
DF.describe()
DF.head()
DF.type()
DF.shape
DF.dtypes
DF.groupby("A").mean()
DF.groupby("A").agg([np.median,...]) : any
DF.sample(5)
DF.index
DF.columns
```

###前処理

```Py
DF[DF["A"]>200] # 200以上の項目を抽出
DF.at[1 ,"A"] = -1 # 項目"A"の1を-1に変更
DF["A"].map({0:"A",1:"B"}) # dummy変数の作成
DF.dropna() # NA部分の削除
DF.fillna(0) # NA部分を0で置換
df.interpolate() # NaNを前後の値から補間
sklearn.preprocessing.imputer # NaNを補間
sklearn.preprocessing.StandardScaler # [0,1]にScale
```

### Standard Scaler
```Py
# スケールの取り出し(新しいデータが来たときに、固定された正規化定数で対応が可能)
scaler = preprocessing.StandardScaler().fit(df)
# スケールを出す
print("mean:{} std:{}".format(scaler.mean_,scaler.scale_))
# スケーリングを行う
df_scaled = scaler.transform(df)
print(df_scaled)
```

### 欠損値の可視化
```Py
import missingno as msno
msno.matrix(DF)
# 下の方が色的に綺麗
msno.matrix(df=train, figsize=(20,14), color=(0.5,0,0))
```

### Plot
```Py
# Histogram の Plot
plt.title('Histogram')
plt.xlabel('Score')
plt.ylabel('Number of students')
plt.hist(scores, range=(0, 100), bins=100)
plt.savefig(files['histogram'])

df.plot.scatter(x="A",y="B")

# Seaborn によるヒートマップ
sns.pairplot()
sns.heatmap()

# Seaborn による Plot
sns.set()
plt.plot(function_1_1)
```

### Feature Importance using Random Forest
```Py

from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(n_estimators=80, max_features='auto')
rf.fit(X_train, y_train)
print('Training done using Random Forest')
ranking = np.argsort(-rf.feature_importances_)
f, ax = plt.subplots(figsize=(11, 9))
sns.barplot(x=rf.feature_importances_[ranking], y=X_train.columns.values[ranking], orient='h')
ax.set_xlabel("feature importance")
plt.tight_layout()
plt.show()
```

### まとめ
とりあえず，よく使うものだけをまとめてみました．
時間があれば少しずつ追加して，もう少しまとめていけると嬉しいです．
rails seedデータ流し込みエラー対策

rails db:seedでエラー発生

エラー文
rake aborted!
ActiveRecord::RecordInvalid: Validation failed: Email has already been taken


$ rake db:drop
$ rake db:create
$ rake db:schema:load
$ rake db:seed

gitで前まで戻る、

rails db:migrate
rails db:migrate:reset
rails db:migrate
rails db:seed　でエラー発生


https://qiita.com/suzuki_koya/items/02d5e349bff179c44454
【備忘録】globの使い方

#そもそもglobとは
globモジュールでは、引数に指定されたパターンにマッチするファイルパス名を取得することが出来ます。
特定のディレクトリに存在するファイルに処理を加えたい場合などに、使用します。
マッチングさせるパターンの書き方は、Unixシェルで使用される書き方と同じです。

#globの書き方
1.globをインストールする

```sample.py
import glob
```
globモジュールのglob()関数を用い、引数としてパターンを与えると実行されたディレクトリ内で、パターンにマッチするファイル名が返却されます。

2.使い方

例えば、カレントディレクトリ内に
picture1.jpg, picture2.jpg, picture3.png, picture4.jpg
があるとします。

```sample.py
glob.glob('*.jpg')
```
を実行すると

```
[picture1.jpg, picture2.jpg, picture4.jpg]
```
が返されます。

もし、ディレクトリ内のファイルを全て返したい場合は

```sample.py
glob.glob('*')
```
としましょう。

#簡単な実用例

picture1.jpg, picture2.jpg, picture3.png, picture4.jpg
というファイル構成のディレクトリ内で

```sample.py
import glob

for x in glob.glob('*.jpg'):
   print(x)
```
上記のコードを実行すると

```
picture1.jpg
picture2.jpg
picture4.jpg
```
という結果が表示されます。


他にも、


```sample.py
import glob
import os

for x in glob.glob('*.jpg'):
    os.remove(x)
    print(x + “は削除されました。”)
```
上記のコードを実行すると

```
picture1.jpgは削除されました。
picture2.jpgは削除されました。
picture4.jpgは削除されました。
```
と表示され、ディレクトリ内の指定されたファイルが削除されます。

**拡張子やファイル名を指定してファイルを操作するのに非常に役に立ちそうです！**

#参考サイト
[Pythonでglobモジュールを使う方法【初心者向け】](https://techacademy.jp/magazine/18928)

参考になりました。ありがとうございました。
Homebrew+Windows10+WSLでpyenv、python のインストール

関連：[Homebrew 1.9.0 でWindows+WSLに対応したので導入してみた](/R-Koubou/items/26498fc0bfa011667961)
pyenv＋puthonのインストールに関する備忘録。

## TL;DR

ググった限り、他サイトの記事やpyenvのwikiでは、シェル変数への代入による解説だったが、環境変数に代入が正解だった。
（Unix/Linuxの慣習で、文書等でexportが省略されていても、それは環境変数への代入を意味する、なのであれば自分の知識不足…）

~~~bash
export CFLAGS="-I$(brew --prefix readline)/include -I$(brew --prefix openssl)/include -I/usr/include"
export LDFLAGS="-L$(brew --prefix readline)/lib -L$(brew --prefix openssl)/lib -L/usr/lib"
export LD_LIBRARY_PATH="$(brew --prefix readline)/lib"
pyenv install 3.7.2
~~~

### 環境

- Windows10 Pro
    - Version 1809
    - Build 17763.253

- WSL
    - Ubuntu 18.04

### 事前準備

~~~bash
# pyenv の依存ライブラリのインストール
# 引用元： https://github.com/pyenv/pyenv/wiki/Common-build-problems
# Ubuntu/Debian:
sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl
# Alternative of libreadline-dev:
sudo apt install libedit-dev
~~~

### pyenvインストール

~~~bash
brew install pyenv
~~~

### pyenv install x.x.x

pyenvのwikiに記載されている Ubuntu の方法＋αで python のインストールで警告などが解消できた。
https://github.com/pyenv/pyenv/wiki/Common-build-problems

1. wiki記載のライブラリを apt でインストール
2. CFLAGS、LDFLAGS、LD_LIBRARYの設定

2についてはググっていた限り

~~~bash
CFLAGS="#####"
LDFLAGS="#####"
pyenv install 3.7.2
~~~

pyenvのwikiを始め、シェル変数としての代入を記載をしているサイトが多く、
どうしても readlineモジュールについてだけはコンパイルで

~~~bash
WARNING: renaming readline since importing it failed: libreadline.so.8: cannot open shared object file: No such file or directory
~~~

と出てしまい、python本体のビルドは成功するものの、最後に表示される

~~~bash
WARNING: The Python readline extension was not compiled.
~~~

という1行が残り続けもやっとしていたが`pyenv install`実行前にシェル変数ではなく、記事冒頭の環境変数へ代入で解消できた。
Homebrew 1.9.0 でWindows+WSLに対応したので導入してみた

恐らく **macOS+Homebrewを使っていて、Windows上でも同等の環境を構築したい** 人向け、かと思います。

## macOSと「ほぼ」同じ感覚でHomebrewが使える

※ほぼ、と書いたのは素のWSL上のUbuntuに対して後述の必要最低限のaptによるパッケージインストールが必要だったため。
※formulaによっては適宜 `sudo apt install` が必要かもしれない。

### 背景

転職・仕事の都合でmacOSからWindows10メインになったため、WindowsのGUIツールなどの流儀に合わせていたが、
2019/01/09 にリリースされた Homebrew 1.9.0 でWindows+WSLのβ対応がされた＆Win10の環境構築中だったのでmacOS環境からの移行がスムーズにいけるかも？、という思いから試してみた。

#### リリースノート 1.9.0 -- Homebrew
https://brew.sh/2019/01/09/homebrew-1.9.0/

### 結果

自分が使う範囲でのformulaはビルド・インストールはできた。
.bashrcもmacOS依存のパスなど数行書き換えればそのままでOKだった。

以下、導入までにやったことを備忘録も兼ねて。

- [pyenv+pythonの構築はこちら](/R-Koubou/items/5c5bd67ea01264a4f264)


### 環境

- Windows10 Pro
    - Version 1809
    - Build 17763.253

- WSL
    - Ubuntu 18.04 (今回はWSLを初めてインストールした直後のクリーンな状態）

### 事前準備

Ubuntu側のアップデート、コンパイル関連のツールをインストール

`コンパイル関連のツールをインストールせずに進めると、依存関係の解決でgccやmakeをHomebrew上に`
`インストールされるが、make+Cコンパイラを要する一部formulaで失敗した。）`

~~~bash
# Ubuntu 内のパッケージのアップデート
sudo apt update
sudo apt upgrade
# コンパイル関連のツールインストール
# ※gccとmakeだけでも十分かもしれない
sudo apt install gcc
sudo apt install g++
sudo apt install make
sudo apt install autoconf
sudo apt install pkg-config
~~~

### Homebrew のインストール・セットアップ

普段から任意のディレクトリにインストールしているので以下のコマンドでインストール

~~~bash
# カレントディレクトリにHomebrewをインストール
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C ./

# アップデート
brew update
~~~

### 使用準備完了

この時点でmacOSで使用していた時と同じ感覚でformulaのインストールができた。
まだ最小限ではあるが、formulaは無事使用できる状態になった

#### tap

~~~
brew tap homebrew/bundle
brew tap homebrew/cask
brew tap homebrew/cask-versions
brew tap homebrew/core
~~~
Windows7 でLinux コマンドを使いたい：Windows7 の残照

# Windows でLinux コマンドを使いたい
良い時代になりましたね。
もしもあなたのWindows OS がWindows10 であれば、Windows Subsystem for Linux（以降WSL）が使えます。
[Windows Subsystem for Linux Documentation](https://docs.microsoft.com/en-us/windows/wsl/about)
[Windows Subsystem for Linux（Wikipedia）](https://ja.wikipedia.org/wiki/Windows_Subsystem_for_Linux)

そして、たとえばOS がWindows7 だったとしても、まだWindows10 への無償アップデートは可能なようです。（2019年1月1日現在：筆者が実際に実行した結果OKでした）
[Windows 10 のダウンロード](https://www.microsoft.com/ja-jp/software-download/windows10)
> PC への Windows 10 のインストールをご希望ですか?
開始するには、Windows 10 をインストールするためのライセンスが必要です。その後、メディア作成ツールをダウンロードして実行することができます。

# Windows7 でLinux コマンドを使いたい
筆者所有のWindows7 PC にて、今さらながらWindows10 へアップデートを済ませ、Linux コマンドの使用が可能となり、Python3 のインストールやら開発環境の整備が順調に進んでいたそのとき悲劇は起こったのでした。

シャットダウンもしていないのに気づいたらリブートがかかり、OS ではなくBIOS の起動画面で停止したまま沈黙するPC。（そこで何を待っているんだ……）

とりあえず、復旧をかけてみたところ無事にOS 起動画面までたどり着いたので安心したものの、見慣れたOS 起動画面が。

……って「Windows7 に戻っとるやないかいっ！」

おそらくいずれかのハードウェアなり、ドライバなりがWindows10 に耐えきれなかったのでしょう。

そんなわけで筆者は改めて「Windows7 でLinux コマンドを使う」ための旅に出ました。Windows7 のサポート期限切れのことは一年後に考えるとして、残りの一年をWindows7 のままアップデートせずに使い続けることを選んだのでした。

この旅の目的地にはいくつかの選択肢がありました。

1. 古くからのWindows かつUnix ユーザなら「Cygwin」という名前に郷愁を覚えることでしょう。（インターネット老人会とか言わないで）
 - [Cygwin](https://www.cygwin.com/)
 - [KaoriYa](https://www.kaoriya.net/)（ついでに）

2. 最近知った「busybox」という選択肢。容量が逼迫してたらこちらを選択したかも。
 - [busybox-w32](http://frippery.org/busybox/)
 - [インストール不要！WindowsでLinuxコマンドを使う](https://qiita.com/tetsuy/items/22cba0bc2048967b270a)（Wikipedia へのリンクあり）

3. 最終的に選択した目的地はGit for Windows をインストールついでに「Git Bash」を使うという選択肢。
 - [Git for Windows](https://gitforwindows.org/)

番外編：
世界には「PowerShell あれば別にLinux コマンドなんか要らんやん」というツワモノ達が。（筆者はひっぱたかれるくらい軟弱者です）
[PowerShell](https://docs.microsoft.com/ja-jp/powershell/scripting/overview?view=powershell-6)
[PowerShell/PowerShell、コマンドプロンプト、Linuxコマンド対応表](https://win.just4fun.biz/?PowerShell/PowerShell%E3%80%81%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%80%81Linux%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%AF%BE%E5%BF%9C%E8%A1%A8)

とりあえず、旅を終えてこれを書いています。めでたしめでたし。
年末休みにnodeでAPIサーバを勉強した復習〜part4 async/awaitの説明

#おおまかな非同期説明

##callback hell

nodeは非同期フレームワークである
非同期とはなにかというのを全て説明するのは面倒なので調べて欲しいが
I/Oの時間のかかる処理を待たずに遅延実行する事によりCPUを有効に使う方法だ
I/Oの処理が終わったら実行を継続するため、次の処理をコールバック関数で渡す事になる
例えば

```js
var fs = require('fs');
fs.readFile('hoge.txt', 'utf8', function (err, text) {
  if(err){
    // エラー処理
  else{
    // 正常処理
  }
...
});
```

のように、引数の最後にあるのが読み込み終了時のコールバックだ
これで、I/Oを待たずCPUは次の処理を行い、I/Oから戻ってきたらコールバックが処理され
非同期に実行できるようになった

しかしこのままでは callback hellになる

http://callbackhell.com/

上記はぬるいHellだが、私はnode初期の頃に恐ろしい地獄を作ったこともある
callback hellは個人的には楽しいが、色々な問題に直面する

実行順がぱっと見でわかりにくい
例外の扱いが難しい
デバッグが難しい

などがあるため、promise/futureや async/awaitを使うべきだ

```js
function hogeAsync(msg, callback){
  console.log(msg);
  
  if(callback!=null) callback();
}

hogeAsync("1", hogeAsync("2", hogeAsync("3")));
```

（console.logはそんな時間かからないが　サンプルなのでそんなかんじで）
期待する結果は？
答えは 321　だ！
更にエラー処理等が入ると実行順序はますますわかりにくくなる


##promise/future
昔のAWS Lambdaでは async/awaitが使えなかったはずで
その時にpromise/futureを使っていた

promise/futureでは、非同期処理をメソッドチェーンで同期的につなげることができる
callback hellと違い、実行順もイメージ通りになる

```js
function hogeAsync(msg){
  const promise = new Promise((resolve, reject) => {
    console.log(msg);
    resolve();  
  });
  return promise;
}

hogeAsync("1")
.then(()=>hogeAsync("2"))
.then(()=>hogeAsync("3"))
```

結果は期待通り、１２３だ


##async/await

promise/futureでも非同期処理を同期的に扱うことが出来たが
メソッドチェーンでつなぐため、非同期のネストが深くなったり
間に制御構文を入れた場合にも読みにくくなるし
例外処理が面倒だ

そこでasync/awaitを使う
実はasync/awaitは内部はpromiseである
promiseにかぶせて、より同期的に見せているだけである

async/awaitはメソッドチェーンで繋がず、文を終わらせるためネストが深くなり辛い
また、例外を全部同じところで取れるし
エラー時のスタックトレースも比較的楽になる
そのため、現時点では async/awaitがベストだと思う

promise/futureとasync/awaitの比較
https://qiita.com/Anders/items/dfcb48d8b27ceaffb443

```js
function hogeAsync(msg){
  const promise = new Promise((resolve, reject) => {
    console.log(msg);
    resolve();  
  });
  return promise;
}

async function hoge(){
await hogeAsync("1");
await hogeAsync("2");
await hogeAsync("3");
};
hoge();
```

当然結果は 123

また、async属性を関数につければ、自動的にpromiseを生成しreturnするので
下記のように省略できる

```js
async function hogeAsync(msg){
    console.log(msg);
}

(async () => {
await hogeAsync("1");
await hogeAsync("2");
await hogeAsync("3");
})();
```





#async/awaitの説明

結局Promiseを見えなくして使ってるだけなのですよ
説明はググって

##複数の非同期関数を同期させる
Promiseではallを使うと、複数の非同期関数をまとめて同期出来たが
async/awaitでも同じものを使う

Promise.all
https://qiita.com/im36-123/items/c0678a46ee0f8e44e150



#expressの場合
nodeでAPIサーバに使われるExpressフレームワークはなんとPromiseに対応されていない
が、コールバック地獄は勘弁
なので　下記のように少しでも使いやすくする


expressで非同期するときのパターン
https://qiita.com/yukin01/items/1a36606439123525dc6d
https://medium.com/@Abazhenov/using-async-await-in-express-with-node-8-b8af872c0016

同じく
http://www.acuriousanimal.com/2018/02/15/express-async-middleware.html

つまり、node-async-handlerを使って、例外はnextに投げておけば、とりあえずの所はちゃんと動く

##asynchell
https://qiita.com/rana_kualu/items/e6c5c0e4f60b0d18799d

async/await使っても Hellになる事ある
とりあえず、関数の依存関係は考えることと
promise.all　がとても便利ってこと
macでGitHub Desktopで真っ白な画面が出て動かなくなった場合の対処法

# 症状

macで GitHub Desktop を起動してもウインドウが出てこなくなった。
上部のメニューは出てくるが、その中のFile->New Repositoryなどをクリックすると、真っ白なウインドウが表示されて何もできない。

## 再現手順

不明。
直前にリポジトリの削除を行ったが、削除に失敗していた気がする（自信無し）。

## 環境

macOS High Sierra 10.13.6（17G4015）
MacBook Pro (15-inch, 2017)
GitHub Desktop version 1.5.1

# 調査

macを再起動しても治らず。
アンインストール→インストールしても治らず。

ググッたらこのあたりが引っかかったが、よくわからなかった。
[GitHub Desktop launches with white screen and is unresponsive · Issue #4054 · desktop/desktop](https://github.com/desktop/desktop/issues/4054)


# 解決

アプリを終了したあと、```/Users/ユーザー名/Library/Application Support/GitHub Desktop``` フォルダをリネームしてアプリを再起動したら起動した。
ユーザー設定ファイルが壊れていたのか。
MQL4でRCIを計算する

MQL4では一般的なテクニカル指標の値を簡単に算出できるよう、組み込み関数が用意されております。
たとえば移動平均線であればiMA関数、ボリンジャーバンドであればiBands関数を使用することで、その値を容易に取得可能です。

個人的にRCIは比較的有名なテクニカル指標だと認識しているのですが、残念ながらMetaQuotes社はそう認識していないらしく、MQL4の組み込み関数としてiRCIといった関数は用意されていません。

RCIのように組み込み関数が用意されていないテクニカル指標の値を取得する場合、通常はiCustom関数を使用します。
iCustom関数はMT4内に保存しているインジケーターを指定し、その計算結果を取得することができる関数です。
予めRCIをMT4に保存しておくことで、RCIの結果を取得できます。
しかしプログラム内でiCustom関数を使用することがネガティブに感じる場面もありますので、直接RCIの値を取得できるiRCI関数を作成しました。

## iRCI関数

```cpp
double iRCI(const string symbol, int timeframe, int period, int index)
{   
    int rank;
    double d = 0;
    double close_arr[];
    ArrayResize(close_arr, period); 
    
    for (int i = 0; i < period; i++) {
        close_arr[i] = iClose(symbol, timeframe, index + i);
    }
    
    ArraySort(close_arr, WHOLE_ARRAY, 0, MODE_DESCEND);

    for (int j = 0; j < period; j++) {
        rank = ArrayBsearch(close_arr,
                            iClose(symbol, timeframe, index + j),
                            WHOLE_ARRAY,
                            0,
                            MODE_DESCEND);
        d += MathPow(j - rank, 2);
    }

    return((1 - 6 * d / (period * (period * period - 1))) * 100);
}
```

第一引数はRCIを取得するチャートの通貨ペア名、第二引数は時間足です。
第三引数がRCIを算出する期間、第四引数がRCIを算出するローソク足の位置（最新のローソク足を0とした値）となっております。

特に変わった処理をしているわけではなく、RCIの定義通りに処理しているだけです。
パラメーターの名称や順序は他の組み込み関数と似た感覚で使用できるよう配慮して作成しましたので、MQL4を少しイジったことのある人であれば、すんなりと受け入れていただける構成かと思います。


## iCustom関数の使用がネガティブなケース
ここからは余談です。
今回iCustom関数を使用せず、iRCI関数を用意した経緯について解説します。

iCustom関数の欠点として、呼び出す対象となるインジケーターが同一のMT4内に保存されている必要があります。
このためiCustom関数からRCIを使用したプログラムを配布する際には、インジケーターファイルRCI.ex4も一緒に配布する手間が増えます。
配布するファイルが増えると説明の手間も増えますし、利用者がRCIを正しく保存しなかったために異常な挙動が起きたといったトラブルの発生も考えられます。

上記の問題には解決方法があり、#resourceを使用してコンパイル時にRCI.ex4自体プログラム内に取り込むことがMQL4では可能です。
これによりRCI.ex4が存在しないMT4でもRCIの値を正しく取得して動作可能ですので、利用者へ配布時にRCI.ex4を配布する必要はなくなります。
ただし#resourceを使用する場合、コンパイル時にはRCI.ex4が存在している必要があります。

開発者の方がご自分でコンパイルして配布する分には問題になることはありませんが、そのプログラムがクライアントから依頼を請けて作成しているファイルの場合は問題が発生します。
クライアントにソースコードを納品している場合、クライアント側でほぼ確実にコンパイルが行われます。
このときRCI.ex4が必要となるので、納品時にRCI.ex4も納品する必要があります。
納品するファイルが増えますと、先程と同じく説明の手間が増える・利用者（この場合クライアント）のミスによるトラブル発生の確率が高まるといった問題が発生します。

この問題を避けるためには、関数として作成し、1つのファイルで完結したプログラムとして作成することが望ましかったので今回iRCI関数を作成しました。
Macにatomをインストールしたらプロジェクトディレクトリが保存されない

# 経緯
1. macbookairを買ったのでatomをインストール
2. プロジェクトディレクトリを追加して一旦閉じる
3. 再起動後プロジェクトディレクトリが消えている

なぜ？？

# 結論
mac独自の仕様らしい
project-managerを使い、毎回プロジェクトを指定する必要がある

## 手順
1. project-managerをインストール
    - ⌘,→Install→project-manager
2. csonファイルを編集しプロジェクトを定義
    - ⌘+Shift+P -> Project Manager: EditProjects
    - 記入例は後述
3. ⌘＾Pで定義したプロジェクト一覧が出るので選択してクリック
4. ツリービューに追加される

## projects.cson記入例
### 実例
```
[
  {
    title: "project_name"
    paths: [
      "/path/to/dir1",
      "/path/to/dir2",
    ]
  }
]
```
### 意味
- title : ⌘＾Pで一覧表示される時の名前
- paths : ツリービューに追加されるディレクトリ

# 所感
いちいち起動するたびにワンステップ挟むの面倒臭いよぉ
と思ったけど、必要最小限のディレクトリしか表示させないようにすることも可能。
もし今後プロジェクトツリーに追加するディレクトリが今後大量に増えてきたら、こっちのが方式の方が便利になるかも。。。？
【Unity】フットスライディング（足滑り）を解決する

## フットスライディング（足滑り）

![foot2.gif](https://qiita-image-store.s3.amazonaws.com/0/33251/e498786d-87ba-3a47-641b-338f673e6cb9.gif)
キャラクターの動く速度と、アニメーションが同期してない場合に、
フットスライディング（足滑り）が起こります。

![foot1.gif](https://qiita-image-store.s3.amazonaws.com/0/33251/22c81a72-5735-22b2-f7b0-ad022ed50e58.gif)
こんな感じに、リアルで「地に足がついている」ように見せる方法を紹介します。

※ キャラクターををお借りしました
[Sci-Fi Soldier](https://assetstore.unity.com/packages/3d/characters/humanoids/sci-fi-soldier-29559)

## 解決方法

前提として、3DCGソフト側でモーションに合わせて実際に移動させておきます。
その移動量を使って、ゲーム中の移動とアニメーションを同期させます。

```C#
using UnityEngine;

// Enable animator ApplyRootMotion
// Add movement amount of Z in animation
public class CharacterController : MonoBehaviour
{
    [SerializeField]
    float _moveSpeed;

    Animator _animator;
    float _movementInWalk;

    private static readonly int _walkNameHash = Animator.StringToHash("Walk");

    // Use this for initialization
    void Start()
    {
        _animator = GetComponent<Animator>();

        _movementInWalk = ExamineMovement(_walkNameHash);

        Walk();
    }

    void OnAnimatorMove()
    {
        // Update movement in animation
        var deltaPos = _animator.deltaPosition;
        transform.localPosition += deltaPos;
    }
    
    // Measure the amount of movement to the Z axis during animation
    private float ExamineMovement(int nameHash)
    {
        _animator.Play(nameHash);
        _animator.Update(0f);

        var currentClip = _animator.GetCurrentAnimatorClipInfo(layerIndex: 0)[0].clip;
        _animator.Update(currentClip.length);

        var movement = Vector3.Project(_animator.deltaPosition, transform.forward).magnitude / currentClip.length;
        return movement;
    }

    private void Walk()
    {
        _animator.speed = _moveSpeed / _movementInWalk; // Adjust the animation speed according to the moving speed
        _animator.PlayInFixedTime(_walkNameHash, layer: 0, fixedTime: 0f);
    }
}
```

`ExamineMovement`メソッドでアニメーション中での移動量を計測しています。
（ここではZ軸の移動量のみを対象にしています）

`Walk`メソッドで、アニメーションの再生速度を調整しています。
ゲーム中での移動量と、アニメーション中での移動量が同期するように、再生速度を設定しています。

`OnAnimatorMove`メソッドをオーバーライドして、アニメーション中の移動量をゲームにそのまま反映します。
働きたくなるタイマー～Pythonista3～

今回は、働きたくなるタイマーを作っていきたいと思います。
##このアプリを作る理由
働くことに対してやる気が出ないから。
稼いだ金額を視覚化し、モチベーションアップに。
##どんなアプリにする
・稼いだ金額がリアルタイムで増える
・タイマー形式のアプリ
・1秒ごとに、金額が上がる。

※
時給1150円　×　労働時間7.5時間　=　日給8625円
労働時間7.5時間　＋　休憩時間1時間　＝　会社にいる時間8.5時間(30600秒)
日給8625円　÷　会社にいる時間30600秒　=　秒給0.28186....

```py
import ui
import threading
import datetime

def count_down(textfield):
  global times
	
  if times < 8625: #日給8625円に到達するまでループ
    t = threading.Timer(1, count_down,args=[textfield])
    t.start()
    times += 0.2819 #1秒ごとに0.2819円獲得
    textfield.text = str(times)
	
def button_tapped(sender):
  global times

  ima = datetime.datetime.now()
  nanji = ima.hour
  ji = (imananji - 9) * 3600 #仕事開始が9時なので、9時からの経過時間(秒)
  nanpun = ima.minute
  hun = nanpun * 60
  byou = ima.second
  keika = ji + hun + byou
  kakutokukin = keika * 0.2819 #仕事開始からの獲得金
	
  textfield = sender.superview['textfield1']
  times = kakutokukin
  count_down(textfield)
		
v = ui.load_view()
v.present('sheet')
```

こんな感じです↓
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">タイマー <a href="https://t.co/EITuTRKAPE">pic.twitter.com/EITuTRKAPE</a></p>&mdash; 海洋 (@jmH6MzOrntn4jAs) <a href="https://twitter.com/jmH6MzOrntn4jAs/status/1085564819657318400?ref_src=twsrc%5Etfw">2019年1月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



##改善点
 ”お金を稼いでる感” が出し切れてない。
BGM、お金が降ってくるアニメーションなどを追加したい。

##参考
pythonistaでタイマーを作る
>http://www.narinarissu.net/entry/20170902/1504359764
【JavaScript】【for文駆逐作戦】filterメソッドの使い方

## この記事の内容
- javaScriptの「filter」の使い方について
- for文は駆逐していく方針

## なぜ駆逐するのか
- 読みづらいし、ナウくないから。
- 単純にfilterって書かれてたら、「フィルタかけてんだな」って他の人が気付きやすい（可読性UP↑）

## さっそく書き方

### いつもの「for文」
```javascript

var products = [
  {name: 'PS4', type: 'SONY', quantity: 1, price:30000},
  {name: 'Switch', type: 'NINTENDO', quantity: 1, price:32000},
  {name: 'DreamCast', type: 'SEGA', quantity: 1, price:40000},
  {name: 'ゲームボーイカラー', type: 'NINTENDO', quantity: 2, price:42000},
];

var resultProducts = [];

  for (var i = 0;  i < products.length;  i++ ) {
    if (products[i].type === 'NINTENDO') {
      resultProducts.push(products[i]);
    }
  }
console.log(resultProducts);
//[{name: 'Switch', type: 'NINTENDO', quantity: 1, price:32000},{name: 'ゲームボーイカラー', type: 'NINTENDO', quantity: 2, price:42000}]


```
- for文の中でif文で条件判定し、空の配列に格納している
- ↑ってみると本当はただフィルタリングしたいだけなのに、、大層なことやってるでって感じがする😇


### 最新の「filter文」

```javascript

var products = [
  {name: 'PS4', type: 'SONY', quantity: 1, price:30000},
  {name: 'Switch', type: 'NINTENDO', quantity: 1, price:32000},
  {name: 'DreamCast', type: 'SEGA', quantity: 1, price:40000},
  {name: 'ゲームボーイカラー', type: 'NINTENDO', quantity: 2, price:42000},
];

// typeがNINTENDOでpriceが40000以上のものをフィルターしたい！

var result = products.filter(function(product){
  return product.type === 'NINTENDO' &&
    product.price > 40000;
});

console.log(result); 
//  {name: 'ゲームボーイカラー', type: 'NINTENDO', quantity: 2, price:42000}

```

### 補足　（filterの特徴）
- コールバック関数の戻り値は、「true」か「false」を返す
- 「true」だった場合、要素が配列に入る！（フィルタリングしてる）
- そもそも「return」を忘れてはいけない

### まとめ
- もはやfor文で表現する方が面倒臭くなってきた
- 役割によって、メソッドを使い分けた方が断然いい気がしてきました。
- そしてプロパティの取り出しを自由自在にすることが、真のJavaScripterになるということと悟りました。
Redux-Trampoline書いてみた

## redux-thunk

redux-thunkとは！
functionをdispatchしたら実行してくれる。
それだけのことでAction Creatorであらゆるビジネスロジックを扱える気がするんだ。

redux-thunkのソースコード

```js:redux-thunk
function createThunkMiddleware(extraArgument) {
  return ({ dispatch, getState }) => next => action => {
    if (typeof action === 'function') {
      return action(dispatch, getState, extraArgument);
    }

    return next(action);
  };
}

const thunk = createThunkMiddleware();
thunk.withExtraArgument = createThunkMiddleware;

export default thunk;
```

たった14行。extraArgumentの対応を除けばもっと短い。

```js:こういうことでしょ？
export default ({ dispatch, getState }) => next => action => {
  if (typeof action === 'function') {
    return action(dispatch, getState);
  }

  return next(action);
};
```

## 再帰呼び出しのtrampoline
https://qiita.com/41semicolon/items/985bdd2f551d9392463c
こちらの記事を参考にしました。

```js:trampoline
function trampoline (fn) {
  return (...args) => {
    let result = fn(...args);
    while (typeof result === 'function') {
      result = result();
    }
    return result;
  };
}
```

あれ、これって……なんかさっき見たような。

## redux-trampoline
てな訳で書いてみました。

```js:redux-trampoline/index.js
export default ({ dispatch, getState }) => next => action => {
  while (typeof action === 'function') {
    action = action(dispatch, getState);
  }

  return next(action);
};
```

## 使ってみる
カウントダウンの例は例の記事から拝借しました。

```js:actions/index.js
export const LOG_COUNT = 'LOG_COUNT';

export const countDown = num => dispatch => {
  if (num === 1) {
    return { type: LOG_COUNT, num };
  }
  if (num % 1000 === 0) {
    // 渡されたdispatchを使うと途中経過も送れる
    dispatch({ type: LOG_COUNT, num });
  }

  return countDown(num - 1);
};
```

```js:reducers/index.js
const result = (state = null, action) => {
  // actionTypeを省略する横着
  return action.num;
};

export default result;
```

```js:index.js
import { createStore, applyMiddleware } from 'redux';
import trampoline from './redux-trampoline';
import result from './reducers';
import { countDown } from './actions';

const store = createStore(result, applyMiddleware(trampoline));
const unsubscribe = store.subscribe(() => console.log(store.getState()));

store.dispatch(countDown(30000));

unsubscribe();
```

### 実行結果

```:result
30000
29000
28000
27000
26000
25000
24000
23000
22000
21000
20000
19000
18000
17000
16000
15000
14000
13000
12000
11000
10000
9000
8000
7000
6000
5000
4000
3000
2000
1000
1
```

## applyMiddlewareについて
Reduxのチュートリアル本当に素晴らしいんだ。
https://redux.js.org/api/applymiddleware
一括指定プロパティ（ショートハンド）

CSSのショートハンドについてです。
何かと便利なものです。
しかし、どのような動きをするのか理解しておかないと予想外のトラブルに悩まされます。

#これは何？
いくつかのCSSプロパティをまとめて設定できるプロパティです。
例：`bakground` `border` `font` etc

#使い方
普通のプロパティと同じように値を設定します。
設定内容は、ショートハンドごとに異なります。

#メリット
少ないコードで一括で設定できますので、コードの見通しが良くなります。
特にサービスのページの場合、保守する際にコードの見通しが良い事は大きなプラスです。
後は、工数削減ですね。（ちりも積もれば）

#大事な事
ユーザーが設定しなかった値について、そのプロパティの初期値を上書きします。
継承値も上書きされます。
この事を念頭におかないと予期せぬstyle崩れが発生します。

##例

```CSS
.hoge{
  background-color: red;
  background: url(https://placehold.jp/150x150.png) no-repeat blue;
}
/* この場合、背景色はblueになります */

.huga{
  background-color: red;
  background: url(https://placehold.jp/150x150.png) no-repeat;
}
/* 背景色がredから上書きされます。（色無し） */
```
ちなみに、帰宅間際に表示崩れ対応で捕まった事がありました。原因はこれでした。
（ショートハンドでstyleを設定したらしいが、他ページで崩れていた）
どういう動きになるかを理解していれば、大変便利なものです。


#参考
https://developer.mozilla.org/ja/docs/Web/CSS/Shorthand_properties
OP53B環境のK8sでcert-manager + Route 53（や他のクラウドDNS）を使う

# 対象となる環境
* OP53B環境にKubernetesクラスタがある
    * セキュリティの都合やDDoS対策のためにクラスタから社内DNSにしか繋がらないなど
* DNSの管理自体はAWS Route 53やGoogle Cloud DNSなどクラウドのサービスを使っている
* Let's encryptでのSSL証明書の発行、管理をいい感じにしたい
    * cert-managerを使いたい

# 問題
``Error preparing issuer for certificate default/hogehoge.net: read udp 10.100.4.67:35222->205.251.196.87:53: i/o timeout``
とか出て動かない
# そもそもcert-managerはどんな感じで動いてるのか(ACME DNS-01)
###Route 53の場合

1. Let's encryptサーバにリクエストしてDNSの所有者確認用のトークンをもらう
2. Route 53のAPIを叩いて上でもらったトークンをDNSのTXTレコードに入れる
3. TXTレコードがちゃんと引けるか実際に確認する
4. Let's encryptサーバにトークンが入ったことを通知して、証明書をもらう

この3.においてcert-managerはクラスタが使用しているDNSではなく、Route 53ならRoute 53のDNSサーバを使って引こうとします。
反映の早さを考えると理にかなった実装ですが、前述の通りOP53B環境では確認ができずスタックします。

# 解決策
## 必要な環境
* cert-manager v0.6.0-alpha.1以降

## インストール
※この記事を書いている段階ではstableになっていないので、とりあえずな方法を使っています。
[Helm Chart](https://hub.helm.sh/charts/stable/cert-manager)のv0.6.0以降がリリースされていればそちらをおすすめします。

### とりあえず普通に入れる
```
$ helm install \
    --name cert-manager \
    --namespace kube-system \
    stable/cert-manager
```

### v0.6.0から必要になるCRDを入れる
```
$ kubectl apply \
    -f https://raw.githubusercontent.com/jetstack/cert-manager/v0.6.0-alpha.1/deploy/manifests/00-crds.yaml
```

### イメージをv0.6.0-alpha.1にする
```diff

$ kubectl edit deployment cert-manager -n kube-system
spec:
  template:
    spec:
      containers:
+       image: quay.io/jetstack/cert-manager-controller:v0.6.0-alpha.1
-       image: quay.io/jetstack/cert-manager-controller:v0.5.2
```

## コンフィグ
```diff

$ kubectl edit deployment cert-manager -n kube-system
spec:
  template:
    spec:
      containers:
      - args:
+       - --dns01-recursive-nameservers=INTERNAL_DNS_SERVER:53
+       - --dns01-recursive-nameservers-only=true
```
これで、強制的に``--dns01-recursive-nameservers``で指定したDNSで引くようになって動くようになります（当然若干時間はかかるようになります）