OmniAICreator/Qiita-1.07M huggingface dataset:
Mac Finderの並び順について-微妙に追加順にならない時の対処法-

##「今日」の単位の中で追加順になっていない…

皆さんこんな時はないでしょうか？
さっきダウンロードしたファイルをFinderから選びたいというシチュエーション。
例えばa、b、cの順にファイルをダウンロードしたとして、cを選びたいとします。
Finderの並び順は、歯車アイコンの並び順序から追加日にしています。

![order_sample.png](https://qiita-image-store.s3.amazonaws.com/0/126861/6a6ade3d-af9d-3200-bb86-9f992b1fdf7a.png)

追加順になっているから、当然cファイルは一番上にきているはず。
…が、なっていない！！

この例ではファイル数が少ないのであまり困らないと思います。
しかし、ファイル数が多く名前も似ている場合は、さっきダウンロードしたファイルがどれだかわからなくなってしまう時があると思います。
（あれ、さっきダウンロードしたファイルどれだっけ？みたいになると結構ストレス）

今日、過去7日間、過去30日間、それ以前、、、
この辺は時系列でちゃんと区別されているのに、「今日」みたいなくくりの中で時系列になっていない。
これって仕様なのかなって思ってたんですが、設定で変更することができます。

## Finderの並び順序は2段階ある
実は並び順の設定が他にもあるんです。

コンテキストメニュー（右クリック）から表示オプションを表示
![context_menu.png](https://qiita-image-store.s3.amazonaws.com/0/126861/742e5ed6-3442-e5e8-6882-0daab1aad4e0.png)

その中に表示順序の設定があります。
![order_menu.png](https://qiita-image-store.s3.amazonaws.com/0/126861/698e4a47-e65b-5a89-847d-879447f99581.png)

ここの設定を追加日に変更すると…

![order_success.png](https://qiita-image-store.s3.amazonaws.com/0/126861/96a491a8-3df0-c832-9408-a873efe61ae9.png)

ちゃんと追加順にならんだ！！＼(^ω^)／

**並び順所で大きなカテゴリごとに並び替えがされ、**
**表示順序でそのカテゴリ1つの中の並び替えがされる**
ということなんですね。


## 参考
* [Mac OS Finderの表示順Tips \| Thinking every day, every night](https://ameblo.jp/jochi-masaharu/entry-12127543477.html)
macOS の Launchpad で削除できないアイコンを削除する

Launchpad に表示されるアプリケーションで、App Store からインストールしたものは左クリック長押しで削除が行えます。
また、`/Applications` または`~/Applications` フォルダーから該当のアプリケーションを削除することで、Launchpad 上のアイコンは消えてなくなります。

上記の場合はアプリケーションごと削除されますが、アプリケーション自体は残しつつ、Launchpad 上のアイコンのみ削除したい場合は少し複雑です。

# 具体例
例えば、Adobe Creative Cloud をインストールした場合、自分の環境では謎のアプリケーションが Launchpad 上に表示されるようになりました。
<img width="1440" alt="スクリーンショット 2018-09-30 16.56.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/121248/ccc970df-7693-477a-fbe2-a1eaa1978608.png">

個人的には `Creative Cloud.app` が Launchpad 上に表示されて欲しかったのですが、`CCXProcess` や `adobe_licensing_helper` などと、バックグラウンドで稼働するとみられる Adobe のアプリケーションが表示されてしまいました。

これらのアプリケーションは本体を削除することで Launchpad 上から消えてなくなるかと思いますが、フォアグラウンドで稼働する Adobe のアプリケーションに影響を与えそうなので、アイコンだけ削除したいという要件が生まれました。

クリックしてもアプリケーションウィンドウが表示される気配はないので…。

# 方法
Launchpad が使用しているデータベースは `/private/var/folders` にあるため、直接 SQL 文を発行して該当のアプリケーションを削除していきます。

```bash
$ sqlite3 $(sudo find /private/var/folders -name com.apple.dock.launchpad)/db/db
```

実際にデータベースの中身を確認していきます。

```sql 
sqlite> SELECT name FROM sqlite_master WHERE type = 'table';
dbinfo
items
apps
widgets
groups
downloading_apps
categories
app_sources
widget_sources
image_cache
sqlite> SELECT * FROM apps WHERE title='adobe_licensing_helper';
117|adobe_licensing_helper|com.adobe.ngl.p7helper|||559925096.73854|book
sqlite> SELECT * FROM apps WHERE title='CCXProcess';
122|CCXProcess|com.adobe.CCXProcess|||559925223.154941|book
```

`apps` テーブルに該当のアプリケーションが登録されていることが確認できました。
実際にレコードを削除してみます。

```sql
sqlite> DELETE FROM apps WHERE title='adobe_licensing_helper';
sqlite> DELETE FROM apps WHERE title='CCXProcess';
```

最後に Dock プロセスを再起動します。

```bash
$ killall Dock
```

無事に Launchpad 上からアイコンが消えてなくなりました！
<img width="1440" alt="スクリーンショット 2018-09-30 17.32.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/121248/65dd5bcf-456d-a9b2-bdc8-d7a758a8a48e.png">

なお、上記の方法はシステム側が使用しているデータベースに変更を加えているため、実際に試される際はあくまで自己責任でお願いします。

# 補足

ちなみに Launchpad に表示されなかった `Creative Cloud.app` は、ドラッグ & ドロップで Launchpad.app で開いてもアイコンは表示されなかったので、エイリアスを作成して `/Applications` に配置することで、一応 Launchpad 上にアイコンが表示されるようになりました。

しかし、Launchpad に表示されているアイコンはエイリアスのアイコン(左下に矢印が付いているもの)なので、もっと良い方法がありましたらコメントください…。
Anacondaへのgraphvizインストール手順

# はじめに

データサイエンス初学者向けです。

おそらくMacユーザーでanacondaを入れている方は以下の環境を構築している場合が多いのではないかと思います。この環境下において、graphvizをjupyter上で使用できるようにする手順をまとめています。備忘録レベルです。



# 環境

- python3.6.5
- Anaconda3-5.2.0
- macOS High Sierra 10.13.6



# 手順

## graphvizをインストール

まずはHomebrewでgraphvizをインストールします。ターミナルから以下のコマンドを打てばインストールできます。



```ter
brew install graphviz
```



## Anacondaでライブラリをインストール

AnacondaNavigatorでEnvironmentsを選択して以下のライブラリを検索してApplyする。

- python-graphviz
- pydotplus



これでjupyter上でgraphvizを使う準備は完了です。



# サンプル

決定木のモデルに使用するとこのような形になります。



```python
from sklearn.tree import export_graphviz
import pydotplus
from IPython.display import Image

(中略)

export_graphviz(clf, out_file="tree.dot", feature_names=X.columns, class_names=["0","1"], filled=True, rounded=True)

graph = pydotplus.graph_from_dot_file(path="tree.dot")
Image(graph.create_png())
```



- clf ：学習済の決定木モデル
- X ：trainデータ

![決定木.png](https://qiita-image-store.s3.amazonaws.com/0/260591/1b4c46d9-95ac-4359-143d-507e94a39f19.png)

↑
こんな感じで表示されます。
JenkinsおじさんがDrone CI オンプレ版 使ってみた

# はじめに
Drone CIは、クラウド版とオンプレ版があるコンテナベースのCIツール。
職場ではJenkinsおじさんをしているが、Jenkinsから卒業したいので味見含めて、オンプレ版のDroneCIを触ってみた。

# 環境
Linux Mint 19

# 起動
## 下準備
- docker,docker-composeのインストール
- ngrokのインストール [参考](https://qiita.com/Esfaan/items/74e71edfe17d9935d47e)

ローカルでDroneCIを動かす場合に、パブリックからアクセスする必要があるので、ngrokの利用が必要。
[公式](https://ngrok.com/download)だとアカウント作成が手順に含まれるが、そこは割愛して問題ない。

## drone ci 起動
### ngrokの起動
適当にポートを指定してngrokを起動させておく。

```
ngrok http 9999
```

### githubアカウントとの連携
ここは[参考記事](https://qiita.com/kurkuru/items/585ca5c83c48664273b2)を参照。
oauthに必要なclient,secretなどをコピーしておく。

### .envファイルの作成

```
DRONE_GITHUB_URL=https://github.com
DRONE_GITHUB_CLIENT=ここはgithubから取得
DRONE_GITHUB_SECRET=ここはgithubから取得
DRONE_SECRET=abcdefg
DRONE_HOST=https://849403dd.ngrok.io
```
DRONE_SECRETは、任意のランダム文字列
DRONE_HOSTは、ngrok実行時に表示されるURL。このホストにアクセスすると、ローカルPC上で動作するDroneCIにフォワードする。

### docker-compose.ymlの作成
[公式](http://docs.drone.io/installation/)に記載してあるサンプルをそのままコピーして作れば良い。
drone-serverのportのみngrokと整合性を取る必要がある。今回の場合

```
ports:
 - 9999:8000
 - 9000
```
になる。

### 起動
docker-compose.ymlとenvファイルを同じフォルダに配置して、

```
docker-compose up
```
起動確認は、https://849403dd.ngrok.io/login にアクセスして、認証ページに飛べばOK。
droneciでログインすると自分のレポジトリの一覧が見えるはず。

# お試しビルド
レポジトリに下記の.drone.ymlというビルドスクリプトを追加してビルド。

```.drone.yml
pipeline:
        # ステップは順に実行
        gradle-sample:
                # ステップごとにベースとなるdockerイメージを指定
                image: openjdk
                # コマンド一覧
                commands:
                        - ./gradlew hello
        gradle-hello:
                image: openjdk
                commands:
                        - ./gradlew hello
```                                                            
githubのレポジトリ：
https://github.com/yohachiSuga/gradle-sample

.drone.ymlの記法は[公式](http://docs.drone.io/images/)が詳しい。
Droneのポータル＞Settingsでビルドトリガーを変更可能。

# プラグイン
drone.ioのプラグインは全てDockerコンテナ
マーケットプレイスは[公式](http://plugins.drone.io/)から。

Jenkinsのジョブを実行するプラグインもある。
特別なジョブ（UIテストやマルチプロセスのテスト等）をJenkins側で定義してdroneから呼び出したり、Jenkinsからの移行の初手に使いそう。
http://plugins.drone.io/appleboy/drone-jenkins/

# 所感
 - Jenkinsと違ってコンテナベースなので、同じパイプラインでもステップごとに携帯性があるのが特徴的。
 - Jenkinsだと、分散ビルドを行おうとすると、各プラグインが対応しているよね？とか色々確認がいる。一方でコンテナベースはそれが不要みたいで、簡単にスケールできそう。
 - Jenkinsはpipeline as codeは任意だけど、droneはそれを強制化できるのがgood。
 - Jenkinsは自由度やプラグインの多彩さがメリットだけど、管理コストを考えると、個人的にはコンテナベースのCIツールに分配が上がる気がする。

# 参考記事
https://qiita.com/kurkuru/items/585ca5c83c48664273b2
LPIC level1 受験記録

# LPIC level1を受けたので勉強した内容と方法を残します
のっぴきならない理由でLPICを受験しました。
勉強期間2週間くらいでLPIC level1を取れたので勉強方法をメモ。


## 前提知識の有無
自分はSE歴10年ちょい。
BtoBシステムのアプリ開発やってました。
Linuxについては一通りのファイル操作、パーミッション操作とviでソースが書けるくらいの知識はあり。

## 教材
-  [あずき本](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-Version4-0%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6-%E8%83%BD%E5%92%8C/dp/4798141917/ref=sr_1_2?s=books&ie=UTF8&qid=1538295582&sr=1-2&keywords=LPIC%E3%80%80level1) 
自分も一応買ってみたが、ざっと一通り眺めた以降は一度も開かなかった。
まったくLinux触ったこと無い人だったら概念から入るのに必要かもしれないが、
正直ある程度の経験(Linuxをある程度触っていてCLI叩いたことがある)があれば、
先ずはPing-tの問題を解いてみてから必要かどうかを判断するでよいと思う。

- [Ping-t](https://ping-t.com/) 
LPI公認の学習サイト。
1ヶ月2400円（長期になるほど割引あり）で使える。
結果的にこのサイトだけで受験対策は完璧に出来たので、純粋にお勧め。
今後level2取る時もこのサイトだけでいいんじゃないかというくらいの手応え。

## やったこと
1. あずき本をさらっと読む。(要らなかったかも) 　
大体4時間くらい。こんな雰囲気の問題なのかー。
というところはわかったが、Ping-tの問題解くだけでもいいな。という感想。

2. Ping-tにお布施をしてコマ門を全問1回正解するまで解く。　
LPICの問題ではコマンドのオプションとかをそらで書かされる問題が多く、
プログラマとしてはまず理性が拒否する。
そのため、コマンド打って手で覚えるのがとても大事。
学生に戻ったつもりでとりあえず1週は正解するまで解く。
101、102各々1週するのに大体8時間くらいかかりました。

3. Ping-tの通常問題を全問1回正解するまで解く。
コマ問を一週やっていると初見で大体60％くらいは解ける状態で開始できました。
全問銀メダルを取れるくらいやると終盤は大体得点率が80％くらいまで伸びたので、これくらいでいいかと。
101、102各々1週するのに大体6時間くらいかかりました。

4. 試験当日。
短期記憶勝負だと思ったので、101、102とも午後に受験予約。
午前中まで上記3までの作業をやって受験。

## 結果
平日は1日2時間。試験前日と当日午前で詰込みした結果、無事合格。
ちなみに合格時の点数は101が680/800点、102が710/800点。(合格ラインは500点)

以上。
Pythonのスコープは他の言語と異なる(global と nonlocal)

#他の言語からPythonへの移行する場合の注意
　Pythonのスコープ仕様が他の言語（C,C#,VBAなど）と異なっていた。そのため、バグ取りに時間がかかった。
　そこで、参考となるようにここに記述する。
###スコープのポイント
　<b>変数をglobalと宣言してもプログラム全体に影響を及ぼすわけではない</b>
####行ったこと
プログラムの都合上グローバル変数と、関数内関数を用いる必要がありました。
望むことは、関数内で全て使える変数を使うことです。

```python:test.py
#Python変数のスコープについて
val = 1
def testfunc():
    val = 2
    def testfunc2():
        global val  #ここでglobalと宣言
        print(val)
        return
    testfunc2()
    return
testfunc()
```

###コードの意図
この時に意図したのは変数Valが関数testfunc全体で使えることです。これは関数内で定義した関数testfunc2でも使えることを意図しました。  
　関数testfunc2での出力は”２”になるはずです。しかし、結果は”１”でした。関数testfunc内での代入が影響していなかったのです。
驚いたことにこの様に”global"と宣言したことに対して影響されるのは、コードのメインルーチンのコーディング部分と、関数testfunc2内であって、関数testfuncでの影響は受けなかったのです。
　意図したコードが正しく動くためには下記のようなコーディングが必要です。

```python:test2.py
#Python変数のスコープについて
val = 1
def testfunc():
    val = 2
    def testfunc2():
        nonlocal val
        print(val)
        return
    testfunc2()
    return
testfunc()
```

この様にコーディングすることによって、変数Valはtestfuncとtestfunc2の双方で変更することができます。
また、次の様にすることによって、メインルーティンとtestfunc,testfunc2で変更することができます。

```python:test３.py
#Python変数のスコープについて
val = 1
def testfunc():
    global val
    print(val)
    def testfunc2():
        print(val)
        return
    testfunc2()
    return
testfunc()
```

このバグ取りにかなり時間がかかったので、他の人も嵌ってしまうかも？と思って記述しました。
docker-composeでGitBucket

docker-composeでGitBucketを起動する。

## GitBucketって？

GitBucketはさ[たけぞう](https://twitter.com/takezoen)んという方が開発されているGitHubのクローンアプリです。
Scalaで書かれており、驚くほど簡単に導入することができるのが特徴です。

OSSのGitHubクローンといえばGitLabがメジャーですが構築の手順が複雑かつ面倒なため、
使い始める前に構築段階で挫折した経験のある人も多いのではないでしょうか。

ちなみにGitBucketは今も頻繁に更新されているのでたけぞうさんのブログはチェックが必要ですね。
http://takezoe.hatenablog.com/

## 最速で起動してみる

git-hubのREADMEにもある通り以下のコマンドラインで最速起動ができます。
試す分には下記コマンドで運用を考えたらyamlを書く感じで行きましょう

``` bash
# docker run -d -p 8080:8080 gitbucket/gitbucket

# docker container ls | grep git
46627b46aa90        gitbucket/gitbucket    "/gitbucket/wait-for…"   24 minutes ago      Up 23 minutes       0.0.0.0:8080->8080/tcp, 0.0.0.0:29418->29418/tcp   gitbucket_gitbucket_1_f00c40995bff
```

上記状態であとはdockerホストのIP+ポート番号で試し実行は完了です。
ログインは[root:root]でログインできます。

postgresだったりDB使ったりデータのバックアップ先を指定してた書き方の例としては下記のような感じでしょうか。
どちらにしろ事前準備も殆ど必要なく構築できているのがわかりますね。

``` yaml:docker-compose.yml
version: '2'

services:
  gitbucket:
    image: gitbucket/gitbucket
    restart: always
    ports:
      - 8080:8080
      - 29418:29418
    volumes:
      - ./data:/gitbucket
    depends_on:
      - db
    environment:
      - GITBUCKET_DB_URL=jdbc:postgresql://db/gitbucket
      - GITBUCKET_DB_USER=gitbucket
      - GITBUCKET_DB_PASSWORD=gitbucket
    command: ["/gitbucket/wait-for-it.sh", "db:5432", "--", "java", "-jar", "/opt/gitbucket.war"]

  db:
    image: postgres:9.5-alpine
    restart: always
    environment:
      - POSTGRES_DB=gitbucket
      - POSTGRES_USER=gitbucket
      - POSTGRES_PASSWORD=gitbucket
    volumes:
      - ./db:/var/lib/postgresql/data
```

コード管理としてgit hubを利用できない(公開できない)場合なんかの
ローカルリポジトリとしては必要十分な機能を備えているのでお勧めです。
dockerでreactとデータベースを組み合わせたサンプルプログラム

2018/09/30 下書き保存にこの記事を見つけたものの，これを書いた時のことを全く思い出せない．とりあえず投稿．

# はじめに

- ubuntu 16.04
- docker-composeが使える状態
- ``sudo docker-compose up``で全てのサービスが起動することを目指す
- https://qiita.com/hoture/items/573247b12ff0bc4e5d3c をベースにする
   - dockerを使う部分が差分

# サーバーの下地を作る

```bash
cd ~/
mkdir aho
cd aho
touch docker-compose.yml
```

docker-compose.ymlに以下を記述する

```yaml:docker-compose.yml
version: "2"
services:
  server-node:
    build: ./docker/server
    environment:
      - NODE_ENV=production
    volumes:
      - ./docker/server:/usr/src/app
```

``sudo docker-compose run --rm server-node /bin/bash``して中に入る．

```bash
yarn init -y
cat package.json
yarn add --dev express mongoose babel-cli babel-preset-es2015 body-parser
cat package.json
```

で，packge.jsonにscriptsを追記して，以下のようになる．

```json:packge.json
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-preset-es2015": "^6.24.1",
    "body-parser": "^1.18.2",
    "express": "^4.16.2",
    "mongoose": "^5.0.0-rc1"
  },
  "scripts": {
    "start": "babel-node index.js"
  }
}
```

また，

```bash:.babelrc
{
  "presets" : ["es2015"],
}
```
も作っておく．


# クライアントの下地を作る

docker-compose.ymlに以下を記述する

```yaml:docker-compose.yml
version: "2"
services:
  server-node:
    build: ./docker/server
    environment:
      - NODE_ENV=production
    volumes:
      - ./docker/server:/usr/src/app
  client-node:
    build: ./docker/client
    environment:
      - NODE_ENV=production
    volumes:
      - ./docker/client:/usr/src/app
```


で``sudo docker-compose run --rm client-node /bin/bash``して中に入る．


```bash
cd /usr/src/app
yarn global add create-react-app
create-react-app client
cd client
yarn add --dev redux axios
cd src
touch reducers.js actions.js
```

https://qiita.com/hoture/items/573247b12ff0bc4e5d3c
https://medium.com/@TButterwith/client-and-server-hot-reloading-with-react-and-docker-8829c3842776
swiftの型変換は変換元と変換先どちらに実装する？

## まとめ
型変換は、変換先のinitに実装する。
依存関係で、変換先に実装するべきでないときはextensionで実装する。
extensionによる汚染が気に食わない場合は、```private extension```などを使う。

## 例
以下の例でUser<->PostUserParameterの相互変換について考えてみる。

```CoreModule/User.swift

// このアプリの関心事中心に整理されたモデル
struct User {
}
```

```NetworkModule/PostUserParameter.swift
/// なんかのサーバーにデータを投げるときのパラメータ
struct PostUserParameter {
}
```

## ケースA NetworkModule belongs to CoreModule
[![alt](http://www.plantuml.com/plantuml/svg/SoWkIImgAStDuIf8JCvEJ4zLSCulIlNDJodDILMeLgY52_kbbfJd5sKZoN2X2Ea5v1UNX1Qd5WKa5YNcffQa5YdesY4PfWUIut98pKi1MWO0)](http://www.plantuml.com/plantuml/svg/SoWkIImgAStDuIf8JCvEJ4zLSCulIlNDJodDILMeLgY52_kbbfJd5sKZoN2X2Ea5v1UNX1Qd5WKa5YNcffQa5YdesY4PfWUIut98pKi1MWO0
)

この場合、User->PostUserParameterをPostUserParameter.initに実装するのは自然だと思う。swiftはどちらかというと、変換先のコンストラクタに実装することが多い気がする。

```PostUserParameter.swift
class PostUserParameter {
  init(user: User) {
    self = postUserParameter(from: user)
  }

}

private func postUserParameter(from user: User) -> PostUserParameter {
  // 略
}

```

迷うのは、PostUserParameter->Userのパターン。一番良いのは「そんなことをする必要がないようにデザインすること」だと思う。が、現実はそううまく行かない。

### パターンA getterで実装

```.swift
class PostUserParameter {
  var user: User {
    return user(from: self)
  }
}

private func user(from postUserParameter: PostUserParameter) -> User {
  // 略
}
```

依存関係は守られるが、変換コードはinitに書くノリに反している。これはUIKitのUIColor#cgColorなど、一応公式もやっている。ただUIKitのAPIもswiftのversionUpに伴い、ガリガリと書き直されまくっているので、参考になるかはわからない。

### パターンB extensionで相手のinitを追加

```PostUserParameter.swift
class PostUserParameter {
  // 略
}

extension User {
  init(postUserParameter: PostUserParameter) {
    self = user(from: postUserParameter)
  }
}

private func user(from postUserParameter: PostUserParameter) -> User {
  // 略
}
```

これは、私がよくやる手法。extensionによる汚染が気持ち悪いときは```private extension``` にしてごまかしている。


## ケースB CoreとNetworkに依存がない場合

[![alt](http://www.plantuml.com/plantuml/svg/SoWkIImgAStDuIf8JCvEJ4zLSCulIlNDJodDILMeLgY52_kbbfJd5sKZoS2b70iAa8NXNBtGujIYWFpYak3KehBCv5G5NLqxL7FqGB9WLOb5YRcf9Qb5-7L378UGvd98pKi1EHu0)](http://www.plantuml.com/plantuml/svg/SoWkIImgAStDuIf8JCvEJ4zLSCulIlNDJodDILMeLgY52_kbbfJd5sKZoS2b70iAa8NXNBtGujIYWFpYak3KehBCv5G5NLqxL7FqGB9WLOb5YRcf9Qb5-7L378UGvd98pKi1EHu0)

私の最近の考えでは、オブジェクト指向したいので、こういうデータモデル的なやり方はしないほうが良いというもの。
とはいえ、こういう感じにせざるを得ない時にどうするか。

```UserPostService.swift
class UserPostService {
  func post(user: User) {
    networkService.postUser(PostUserParameter(user: user))
  }
}
 
extension PostUserParameter {
  init(user: User) {
    self = postUserParameter(from: user)
  }
}

extension User {
  init(postUserParameter: PostUserParameter) {
    self = user(from: postUserParameter)
  }
}
```

というふうに、[パターンB extensionで相手のinitを追加](### パターンB extensionで相手のinitを追加)の乱用でやる。
台風の影響が凄いので、CSSだけでtyphoon作ってみた

台風🌀は、とても強い。

つまり、台風🌀を生み出す力を手に入れれば、とても強い人間になれる。

僕は強くなりたい。

というわけで、作ってみました。

![typhoon.gif](https://qiita-image-store.s3.amazonaws.com/0/201590/032db49b-2d13-dedc-263e-848907f01861.gif)


# 台風の絵文字って?
そもそも、台風の絵文字にはいろいろな種類がある。
[このサイト](https://emojipedia.org/cyclone/)で一覧できるんだけど、
代表的なのはこんな感じ。
>
apple|google|microsoft
---|---|---
![apple.png](https://qiita-image-store.s3.amazonaws.com/0/201590/9719e2a9-7e84-1ef1-52fe-e9d9d1930f97.png) |  ![google.png](https://qiita-image-store.s3.amazonaws.com/0/201590/53690ade-184f-c630-a144-c2a920d85191.png) | ![mycrosoft.png](https://qiita-image-store.s3.amazonaws.com/0/201590/b9369336-491c-a5bc-cfc3-5d804dd493fd.png)
[https://emojipedia.org/cyclone/](https://emojipedia.org/cyclone/)より

appleの絵文字は、単なる渦巻きだし、microsoftだとちょっと複雑すぎるので、
作りやすそうなgoogleの絵文字を再現してみます！

# まずは形をつくる
## 原型をつくる
まずは、細かいところを気にせずに原型を作ってみます。
枠線、背景のグラデーションなどに気を配ります。

<p data-height="450" data-theme-id="0" data-slug-hash="PywxPR" data-default-tab="css,result" data-user="spice-z" data-pen-title="typhoon-origin" class="codepen">See the Pen <a href="https://codepen.io/spice-z/pen/PywxPR/">typhoon-origin</a> by Spice (<a href="https://codepen.io/spice-z">@spice-z</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## ととのえる
次に、ギザギザの部分を作ってみます。
こういう形をcssで作るのはあまりやったことがないのだけれど、構造を考えたりするのが難しいですね。
どうやって作ろうか悩んだけど,
```border-radius```を駆使した白色を重ねて実装することにしました。
そうして出来上がったのがこちら！

<p data-height="441" data-theme-id="0" data-slug-hash="vVEQrj" data-default-tab="css,result" data-user="spice-z" data-pen-title="typhoon-shape" class="codepen">See the Pen <a href="https://codepen.io/spice-z/pen/vVEQrj/">typhoon-shape</a> by Spice (<a href="https://codepen.io/spice-z">@spice-z</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

結構違う形になってしまいましたが、これはこれで良いと思います。
とんがり具合を作るのが、難しかったですね。


# そして動かす
本当は反時計回りなのですが、google仕様だと時計回りなので、そちらに合わせます。
回転しながら、北東に進もう。
そうして出来上がったのがこちら！

<p data-height="458" data-theme-id="0" data-slug-hash="ZqYVQL" data-default-tab="css,result" data-user="spice-z" data-pen-title="typhoon-rotate" class="codepen">See the Pen <a href="https://codepen.io/spice-z/pen/ZqYVQL/">typhoon-rotate</a> by Spice (<a href="https://codepen.io/spice-z">@spice-z</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
うん、いい感じだ！

# 感想
１〜２時間で作れたのですが、一番苦労したのは、```border-radius```の部分でした。
それほど駆使した経験がないので、
[CSSでいろんなカタチを表現してみる](https://morobrand.net/mororeco/css/css-shape/)
[css border-radius の使い方。円や扇をジェネレータで描いてみる](http://ailaby.com/webtool/border_radius/)
これらのサイトを参考にさせていただきました。
cssでイラストを書いたことはなかったのですが、案外なんでもできそう。
機会があれば、また作ってみようかな！
[Javascript] ランダムな数字を出力する

## 乱数を出力するプログラム

0~10の間のランダムな値を返す

```javascript
var rand = Math.floor(Math.random() * 11);

console.log( rand );
=> 3 // 実行するごとに1~10の範囲でランダムな値を返す
```

## 0~引数に渡した値より小さい乱数を返す関数

```javascript

function randomInt(num){
  var rand = Math.floor(Math.random() * num);

  return rand;
}


randomInt(100);
=> 78 // 実行するごとに1~10の範囲でランダムな値を返す
```

## 最大値と最小値を渡し、ランダムな値を返す


```javascript

function randomIntMinMax(min, max){
  var rand = Math.floor(Math.random() * (max + 1 - min)) + min

  return rand
}

randomIntMinMax(10, 100);
=> 78 // 実行するごとに10~100の範囲でランダムな値を返す
```
sourcetreeで複数のgitアカウント管理

## はじめに
gitアカウントを複数使い分けているときに発生したトラブルの解決法です。
プロジェクトによってGithub, GitBucket, BitBucketなど複数のアカウントを使い分けたい場合にも有効です。

## 環境
Mac

## エラー
ちなみに、うまく設定できていないとpushするときなどに以下のようなエラーが出ます。
**"remote: Permission to ユーザー名1/リポジトリ名 denied to ユーザー名2."**

## 構成
以下のようなGitで管理しているプロジェクトの場合を想定しています。

```
project
├ .git
│　 └config
```

## 手順

### Sourcetreeで設定する場合
以下のように設定してください。
<img width="1084" alt="スクリーンショット 2018-09-30 16.52.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/290840/2cc8ab08-ff2b-92fb-f638-71a25998b7d0.png">


### .gitのconfigを編集する場合
Sourcetree画面の「Congig ファイルを編集」からも編集できますがうまく反映されないことがあるため、以下はMacのターミナルを使った場合です。

```
$ vi gitプロジェクト/.git/config
```
以下のようにプッシュ先を登録してあげます。
**pushurl = https://[gitアカウント名]@github.com/User/test.git**

ちなみに、以下のようにするとパスワードも設定できます。
**pushurl = https://[gitアカウント名]:[パスワード]@github.com/User/test.git**

```config:config
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = https://github.com/User/test.git
	fetch = +refs/heads/*:refs/remotes/origin/*
	pushurl = https://gitTestUser@github.com/User/test.git
[branch "master"]
	remote = origin
	merge = refs/heads/master
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　・
```

これで指定したアカウントでpushできるようになっているはずです。

## 【番外編】クローンで失敗する場合
アカウントを複数使用していると、URLからクローンするときにURLの認証で失敗します。クローンの時も同様にURLに「アカウント名」と「パスワード」を入れることができます。

**https://[gitアカウント名]:[パスワード]@github.com/User/test.git**
featureブランチのGitマージは頼むからSquashを使ってくれ

## 結論
個人の`feature`ブランチからのマージは **Squash and Merge** する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/93055/dd3a2320-9a68-a5e9-3c4f-e4ff860f9d6f.png" width="450" />

* * * * 

## Squashマージって何ですか?
多くの記事で扱っているため、本記事では省略します。

- [Git超絶まとめ](https://qiita.com/masashi127/items/2e103c3fba9d1b058961#merge)
- [GithubでのWeb上からのマージの仕方3種とその使いどころ](https://qiita.com/ko-he-8/items/94e872f2154829c868df)
- [git merge --squash でブランチでの変更を1コミットにまとめてマージ](https://qiita.com/ttskch/items/3f9b798fe3fb5e129489)
- [慣れてきたらコミットをまとめてPull Requestしよう（git merge --squash）](https://www.granfairs.com/blog/cto/git-merge-squash)

## なぜSquashをつかうべきなのか?

#### バージョン管理上見えなくてよい個人の作業記録をツリー上から無くせる
以下は **Create a Merge commit**して`feature`ブランチをマージした後のツリー。
<img src="https://qiita-image-store.s3.amazonaws.com/0/93055/fc31dbb0-74be-9504-8d1a-304edc252ba0.png" width="500"/>
作業の詳細なステップを含め、ツリーにすべての過程が残ってしまいます。

- 細かい作業コミットによってツリー全体が長くなってしまう
    - １つ１つの作業に加えて`feature`ブランチの表現も残すため、縦にも横にも長くなる
- コメントの粒度がまちまちで見づらい
    - 本来は作業コミットのコメント１つ１つに気を使ってほしいが そこまで縛るのは難しい
    - 人によっては常に同じコミットコメントだったりしてカオス...

#### Approveされた作業単位でまとまって見やすい
以下は **Squash and Merge**して`feature`ブランチをマージした後のツリー。
<img src="https://qiita-image-store.s3.amazonaws.com/0/93055/07d4dfb1-f5bb-78c3-190c-9a0c8e97458b.png" width="450"/>
`release`ブランチに5つの`feature`ブランチを順次マージしたあとの図です。
知りたい情報だけが整列していてノイズが少なく、とっても見やすいですよね。

- Pull Requestの単位でコミットログが作られる
- `feature`ブランチ内で行った作業コミット・バックマージなどが消え、ツリーがシンプルに保たれている

もちろん Pull Requestのタイトルがわかりやすいことが前提ですが :joy: 

## ただし、副作用を知っておく
頭ごなしに「Squashいいぞ」というわけでもないことを知っておこう。

#### Squashを乱用するとConflictして苦労する
コミット履歴（元のブランチとの関係）が残らないため、バックマージを必要とするブランチにSquash and Mergeを適用してしまうとソースコードの変更の前後関係が不明となり**ほぼ全行のコードでConflict**をおこして大変な事になってしまう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/93055/7f024278-cca4-93d3-eeec-ab3485679fc5.png" width="550"/> 
あくまで個人の`feature`ブランチのみでSquash and Mergeを使用することをオススメする。

#### １Pull Request上で複数人がコミットをするようなケース (OSSなど)
ここまで聞くと「`feature`ブランチならすべてSquashだろ！」と言い出しそうですが、手放しにそうとも言えないようだ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/93055/7d3080ea-1e96-227b-f813-23f6f52226c8.png" width="450"/> 
ここで紹介する副作用はSquashマージすることによりコントリビュートが消えてしまう問題。

- [他人のコミットをgit merge --squashするべきでないのではという話](https://qiita.com/pshiko/items/1e9acd114b7e85884866)

OSSでSquash and MergeをするときはPull Requestが個人の作業に閉じているかを確認した上で実施したほうが良さそうだ。

## まとめ
- 個人の作業ブランチは**Squash and Merge**して、プロジェクトのソースコードツリーをシンプルに保つ心がけをしよう
- Squashの副作用を把握して事故をなくそう
dockerでPHPUnitを強制終了したらプロセスがゾンビ化したのでその対処法

##開発環境
- Docker for Mac 18.06.1
- macOS High Sierra 10.13.6

##docker-compose, dockerのコマンドを受け付けなくなった
docker環境でPHPUnitを動かしていたら固まってしまい、強制終了した。(馬鹿)
dockerを再起動しようとしたらできない。。。コマンドも何も受け付けない。。。

####コンテナ
- workspace (CentOS, php56, apacheが一緒になってる)
- mysql
- phpmyadmin
- mailhog

こんな構造なのだが、どうもworkspaceとmysqlのコンテナだけ```docker stop(kill)```しても

```shell
ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.
If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).
```
だったり

```shell
ERROR: for docker_workspace_1  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=70)
Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "compose/cli/main.py", line 61, in main
  File "compose/cli/main.py", line 113, in perform_command
  File "contextlib.py", line 35, in __exit__
  File "compose/cli/errors.py", line 56, in handle_connection_errors
TypeError: log_timeout_error() takes exactly 1 argument (0 given)
docker-compose returned -1
```

こんな感じのエラー文が出てきてしまい、どうもできなかった。

##解決法 : プロセスを強制終了させる
psコマンドで実行中のプロセスを確認します。
```$ ps aux | grep [d]ocker```
すると、

```shell
user        1060   1.7  0.2  8732004  16860   ??  S    18 918  331:06.42 com.docker.hyperkit......
user        1042   0.0  0.1 558551164   8136   ??  S    18 918    0:15.80 com.docker.driver.amd64-linux......
user        1041   0.0  0.1  4408520   6072   ??  S    18 918    1:31.58 com.docker.vpnkit......
root                84   0.0  0.0  4295724      8   ??  Ss   18 918    0:00.01 ......
```
こんな感じで一覧が出てくるので、PID(左２番目の数字)を全部消してあげましょう。

```$ kill {PID}```

そうすると、Docker for Macごと停止していると思うので、Docker for Macを起動してあげます。

####コンテナ再起動
```docker-compose up -d```

これでコンテナが復活していることでしょう！
Javaで扱うJSONを振り返る

#前書き
JSONを扱うにあたり知識が抜けていることに気がついた。
これだけあればjavaで最低限JSONの扱いは可能というレベルまでまとめたいと思う
（ライブラリはJSONICを利用）

#JSONの基本
JavaでJSONを扱うといったらJSONの書式で書かれたStringを扱うこと
　String→POJO
　POJO→String　　など

###JSONの書式ルール（読み方）
　①リスト構造は[ ]で囲われる
　②POJO構造は{ }で囲われる
　③一番親となるPOJO構造の名前を指定している部分はない
　以上３つを覚えておくとすぐ読めると思う

サンプル

```
 {
    "id": 1,
    "name": "shoes",
    "price": 12000,
    "shops": [
      {
         "name": "Astore",
         "location": "tokyo"
      },
      {
         "name": "Bstore",
         "location": "oosaka"
      }
    ]
 }
```

サンプルのPOJO

```
	public class Product {
		public Integer id;
		public String name;
		public Integer price;
		public List<Shop> shops;
	}

	public class Shop {
		public String name;
		public String location;
	}
```

##Jacksonの扱い
上記のJSONとPOJOを使った場合

###JSON→Java

```
		String json = "{\"id\": 1,\"name\": \"shoes\",\"price\": 12000,\"shops\": [{\"name\": \"Astore\",\"location\": \"tokyo\"},{\"name\": \"Bstore\",\"location\": \"oosaka\"}]}";
		ObjectMapper mapper = new ObjectMapper();
		Product data = mapper.readValue(json, Product.class);
```
リストやマップの構造で送られてきた場合

```
		ObjectMapper mapper = new ObjectMapper();
		List<Product> products = mapper.readValue(json, new TypeReference<List<Product>>() {});
```


###Java→JSON

```
		ObjectMapper mapper = new ObjectMapper();
		String json = mapper.writeValueAsString(product);
```

###その他
・POJOは各propertyがpulicであるかGetter/Setterを持っていないとエラーになる
・JSON→Javaの変換時にPOJOが持たないpropertyがあるとエラーになる
　　→　POJOに「@JsonIgnoreProperties(ignoreUnknown=true)」をつけるとエラーにならない
　　→　必要なデータだけを抜き出すことができる
opencvをソースからビルドする

Ubuntu 18.04 に入っているopencvは3.2 でした。3.4が必要になったので、ソースコードからビルドしました。

# 準備

```
 sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
 sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
```

# ソースコードの入手

```
git clone https://github.com/Itseez/opencv.git
git clone https://github.com/Itseez/opencv_contrib.git
(cd opencv; git checkout -b work 3.4.3)
(cd opencv_contrib; git checkout -b work 3.4.3)
```

# ビルド

```
cd opencv
mkdir build
cd build/
cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j8 2>&1 |tee make.log
```

cmake のときに `-DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules` をつけることでcontribの方もまとめてビルドされます。

# インストール

```
sudo make install
sudo ldconfig
```

# つまずいたところ

自分でffmpegをビルドしたときに /usr/local/lib にできた以下のライブラリがリンクエラーを引き起こしたので、いったんこれらのファイルを別のディレクトリに退避させました。
(どうもダイナミックリンクライブラリを想定しているところにスタティックリンクライブラリを見つけてしまって誤動作しているっぽい。）

```
libavcodec.a   libavfilter.a  libavutil.a    libswresample.a
libavdevice.a  libavformat.a  libpostproc.a  libswscale.a
```

# 参考

https://docs.opencv.org/3.1.0/d7/d9f/tutorial_linux_install.html
MacからRaspberry Pi 3 Model B+にSSHで接続する

## 目的

Raspberry Pi用にディスプレイとキーボードを用意して他のPCと併用して操作するのが面倒なので、MacのターミナルからSSHでRaspberry Piにログイン出来るようにする

## 実施環境

* macOS High Sierra
* Magic Keyboard US MLA22LL/A with Lightning Cable
* Raspbian
    - Version 9.4
    - Kernel version 4.14

## 手順

### 事前準備

下記を実施する

* [MacでRaspberry Pi 3 Model B+用起動ディスク作成(RASPBIAN STRETCH LITE)](https://qiita.com/mitsuaki1229/items/3a7d0e33ae921735dd58)

### ログイン

1. Raspberry Piにキーボードを有線接続し起動する
1. デフォルトのユーザIDとパスワードを入力する

```
raspberrypi login: pi
Password: raspberry
```

### キーボード設定

記号を打つとき混乱するので、デフォルトのUKキーボードレイアウトから、接続しているキーボードのレイアウトに変更する

1. 設定画面の表示
    
    ```
    $ sudo raspi-config
    ```   
1. キーボード設定をUKから変更する
    1. "4 Localisation Options Set up language and regional settings to match your location"を選択し、return
    2. "13 Change Keyboard Layout Set the keyboard layout to match your keyboard"を選択し、return
    3. Appleを選択し、return
    4. English (US)を選択し、return
    5. English (US) - English (Macintosh)を選択し、return
    6. Configuring keyboard-configurationで
        - Thedefaultfor the keyboard layoutを選択し、return
        - No compose keyを選択し、return
    7. Raspberry Pi Software Configuration Tool (raspi-config)でFinish(横キーを操作すると選択できる)を選択し、return
1. コンソールでキーボードを入力し、キーボードレイアウトが変更されている事を確認する

### Wi-Fi接続

1. 接続可能な機器を検索する
    
    ```
    $ sudo iwlist wlan0 scan | grep ESSID
    ESSID:"SSID"
    ```
1. Wi-Fi接続設定を追記する
    
    ```
    $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
    ```
    ```:wpa_supplicant.conf
    network={
        ssid="SSID"
        psk="SSIDに紐づくWiFiのパスワード"
    }
    ```
1. Raspberry Piを再起動する
    
    ```
    $ sudo reboot
    ```
1. inet にアドレスが振られている事を確認する
    
    ```
    $ ifconfig wlan0
    〜 省略 〜
        inet 192.169.xxx.xxx newmask 255.255.255.0 broadcast 192.168.100.255

    〜 省略 〜
    ```

### SSH接続設定

1. RaspbianのデフォルトではSSHが無効化されているため、有効化する
    
    ```
    $ sudo touch /boot/ssh
    $ sudo reboot
    ```
1. Macから接続を試みる
    
    ```
    $ ssh pi@192.169.xxx.xxx
    ~ 省略 ~
    Are you sure you want to continue connecting (yes/no)? yes
    ~ 省略 ~
    xxxxxxxx@192.169.xxx.xxx's password: raspberry    
    ```

## 備考

リセットするたびに手動で設定するのが面倒なので、設定済みの起動ディスクを作成出来るようにしたい。。

## 参考

* [コマンドラインによるWiFiの設定](http://igarashi-systems.com/sample/translation/raspberry-pi/configuration/wireless-cli.html)
* [Raspberry Pi 3を初回起動してからSSH接続まで](http://ykubot.com/2017/01/17/raspberry-pi-3-initialize/)
vee-validateを使ってみる (locate: ja)

## 概要
vue.jsでSPAを作成する必要があったので、入力検証について調べた内容をまとめる。

## ライブラリについて
いろいろライブラリがあるようですが、vee-validateが一番ドキュメントが多く、利用ユーザーも多いようなので、とりあえず使ってみたいと思います。

## 実装方法
各ライブラリは、CDNで読み込んでお手軽に作ってみる。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Validation</title>
</head>
<body>
  <div id="app">
    <h1>Vee-Validateのテスト</h1>
    <div>
      <label>タイトル</label>
      <input type="text" name="title"
             v-model="title"
             data-vv-as="タイトル"
             v-validate="'required|max:10'"
      />
      <div v-show="errors.has('title')">
        <p>{{ errors.first('title') }}</p>
      </div>
    </div>
    <button type="button" v-on:click="submit">作成する</button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.13"></script>
  <script src="https://cdn.jsdelivr.net/npm/vee-validate@2.1.0-beta.9/dist/vee-validate.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/vee-validate@2.1.0-beta.9/dist/locale/ja.js"></script>
  <script>
    // 日本語を設定する
    VeeValidate.Validator.localize('ja');
    Vue.use(VeeValidate);
    
    new Vue({
      el: '#app',
      // データ
      data: {
        title: null,
      },
      // created() { this.$validator.localize('ja'); },
      // watch: { $route () { this.$validator.localize('ja'); }},
      methods: {
        submit: function () {
          // バリデートの判定
          this.$validator.validateAll().then((result) => {
            if (result === false) {
              // エラー時の処理
              alert('Validate NG.');
              return false;
            }
            //エラーがなかった時の処理を下に記述
            alert('Submit OK.')
          });
        }
      }
    });
  </script>
</body>
</html>
```
## 実行結果
日本語にも対応できていていい感じですね。
エディタとブラウザだけで、構築できるのでお手軽です♪。
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/142279/ab99a4cd-61a6-51c5-b77e-0cc667020581.png)

## 追記
npmでインストールしてcomponentで利用した場合は、
以下のようにして設定しないと日本語になりませんでしたので追記。

```html
<template>
　　 <div>
    <input name="title" v-model="title" v-validate="'required'">
    <div v-show="errors.has('title')">
     <p>{{ errors.first('title') }}</p>
    </div>
  </div>
</template>

<script>
import VeeValidate from'vee-validate'
import ja from 'vee-validate/dist/locale/ja'

// メッセージを日本語に設定する
VeeValidate.Validator.localize('ja', ja);
Vue.use(VeeValidate);

export default {
```

## 参考サイト
- [VeeValidate - Localization](https://baianat.github.io/vee-validate/guide/localization.html#aliases)
- [Locale.vue](https://codesandbox.io/s/y3504yr0l1?from-embed)
- [VeeValidate を使って、vue.jsで簡単にバリデートしてみた](https://qiita.com/youdie/items/417ed2df1bcb6a60001c)
- [VeeValidate を使って、vue.jsで簡単にバリデートしてみた](https://qiita.com/youdie/items/417ed2df1bcb6a60001c)
WindowsでSPAを爆速開発したかった

# 概要
[Nuxt.js + Netlifyで爆速構築するサーバーレスSPA開発入門](https://qiita.com/isihigameKoudai/items/e3b136e9964f1d30d73d)を基に爆速開発をしたかったのだけど、思いの外躓きが多かった。

# 導入
まず、Nodistが古くてnpxに対応しておらず、npmで何やかんやするところからうまくいかない。

- Nodistをアンインストール。
- [nvm-windows](https://github.com/coreybutler/nvm-windows)を導入して解決。
- nvmのwindows版なので、nvmを知っていれば特に問題はない。

# リポジトリ作成
Githubだとプライベートリポジトリが有料なのでGitlabを使おうとした。

- gitlabのリポジトリ作成＋クローン
  - [別記事にまとめた](https://qiita.com/yama-t/items/304b43ab7abdb18b34c6) が、GitHub連携で作成したアカウントにパスワードを設定しないとクローンが上手くいかなかった。

# プロジェクト作成
1. クローンしたリポジトリの1つ上の階層まで移動。
1. `npx create-nuxt-app [リポジトリ名（フォルダ名）]`で、既存リポジトリに対してnuxtプロジェクトを生成

リポジトリ内で実行してしまうと、新しくフォルダを作り、その中にnuxtプロジェクトを作成してしまう。
ファイル移動で対応すると、`npm run build` が上手く行かなくなるおかげで3回ぐらい作り直した。

# lint設定
プロジェクト作成時にes-lintを入れておくと、かなり強力な警告を出してくれるが、vueファイルのインデントのスペースが1つ余計なだけでエラーを出し、画面確認をさせてくれないので趣味でやるには厳しすぎる…

- .eslintrc.js の設定を修正する（デフォルトはvue/recommended）
- [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue)のFAQに載っていた。

```.eslintrc.js
extends: [
  'plugin:vue/base'
],
```

# エディタ設定
## シンタックスハイライト
Atomでvueファイルを編集しようとしたが、そのままだとシンタックスハイライトが効かない。

- [language-vue-component](https://atom.io/packages/language-vue-component) を導入
- 「Vue Component」のシンタックスが適用できるようになる。

## emmet
シンタックスハイライトが効くようになったが、[emmet](https://emmet.io/)のコマンド（展開）が使えないまま。
キーマップの設定ファイルに下記を追加する。
[emmet-atomのissue](https://github.com/emmetio/emmet-atom/issues/364) のコメントにあった。

```keymap.cson
atom-text-editor[data-grammar~="vue"]:not([mini])':
  'tab': 'emmet:expand-abbreviation-with-tab'
```

# ここまでやってやっと
思うようにファイルをエディタで編集して、確認できる環境ができた。

# その他
- ~~vuetifyを導入してみたけど、レイアウトは使わずに自分で書きそう。コンポーネントだけ使う。~~ 結局レイアウトも使った。
OpenVR-InputEmulatorと連携するアプリケーション作りたい(ビルド設定編)

#OpenVR-InputEmulatorと連携するアプリケーション作りたい
やってみたらビルド設定が結構大変！
のでマニュアル化

#1. ファイルの準備
以下のファイルを用意します。

OpenVR-InputEmulatorのソース
https://github.com/matzman666/OpenVR-InputEmulator
→zip展開するかpullしておく

OpenVRのソース
https://github.com/ValveSoftware/openvr
→zip展開するかpullしておく

Boost 1.63 Binaries (boost_1_63_0-msvc-14.0-64.exe)
https://sourceforge.net/projects/boost/files/boost-binaries/1.63.0/
→exeファイルをいい感じのところにインストール

Visual Studio 2015 Community
「Visual Studio Dev Essentials」で探して！
→C++を有効にしてインストール

#2.ライブラリのビルド
アプリケーションのビルドには以下のライブラリが必要になります。
・libvrinputemulator.lib
・boostのアレソレ
・openvr_api.lib
・openvr_api.dll

このうち、libvrinputemulator.libは存在しないのでビルドする必要があります。

OpenVR-InputEmulator-1.3\lib_vrinputemulatorにあるlib_vrinputemulator.vcxprojをVS2015で開き、
プロジェクトのプロパティを開いて、「すべての構成」に切り替え。
「VC++ディレクトリ」の「インクルードディレクトリ」に

```
D:\boost_1_63_0;E:\OpenVR-InputEmulator-1.3\lib_vrinputemulator\include;E:\openvr-master\headers;$(IncludePath)
```

みたいな感じで入れる。(boost_1_63_0と、OpenVR-InputEmulator-1.3と、openvr-masterを追加する)

「ライブラリディレクトリ」に

```
D:\boost_1_63_0\lib64-msvc-14.0;E:\OIEtest;$(LibraryPath)
```

みたいな感じに入れる。(boost_1_63_0)を追加。

ReleaseとDebugの両方でビルドする。
OpenVR-InputEmulator-1.3のフォルダに、DebugとReleaseが増えて、libファイルが入っているはず。

#3.プロジェクトの設定
Win32コンソールアプリケーションで空のプロジェクトを作る。
参考: https://qiita.com/gpsnmeajp/items/1905a74419f8055484d5

ソースファイルとして、
・client_commandline.cpp
・client_commandline.h
・main.cpp
を入れるとわかりやすい。

プロジェクトの構成はx64にすること。

先程のと同じプロジェクトの設定をした上で、
「リンカー」→「入力」→「追加の依存ファイル」を「libvrinputemulator.lib;openvr_api.lib;%(AdditionalDependencies)」にする。


ソースファイルが入っているのと同じ場所に
・libvrinputemulator.lib (構成がDebugならDebugフォルダから、ReleaseならReleaseフォルダから取り出したものを入れる)
・openvr_api.lib
を入れる。

コンパイル成功後、EXEファイルと同じ場所にopenvr_api.dllを入れること。
paizaで使ったメソッド2

##文字列の操作

```javascript
var s = ‘hello, world’
```
#### charAt

```javascript

s.charAt(0)             //最初の文字
"h"
s.charAt(s.length -1)   //最後の文字
"d"
```
#### substring,sline

```javascript
var s = ‘hello, world’

s.substring(1,4)        //2番目から４番目の文字
"ell"
s.slice(1,4)　　　　　　　　　　　　　　　　　　　　　　　　//上と同じ
"ell"
s.slice(-3)　　　　　　　　　　　　　　　　　　　　　　　　　　//最後の3文字
"rld"
s.slice(-4)　　　　　　　　　　　　　　　　　　　　　　　　　　//最後の4文字
"orld"
```
####index
```javascript
s.indexOf('l')          //最初のlの位置
2
s.indexOf('l',4)　　　　　　　　　　　　　　　　//４文字目以降で最初のlの位置
9
s.lastIndexOf('l')　　　　　　　　　　　　//最後のlの位置
9
```
####splitなど
```javascript
s.split(',')
(2) ["hello", "world"]
s.replace('h','H')　　　　　　　　　　　　//hをHに置き換える
"Hello,world"
s.toUpperCase()　　　　　　　　　　　　　　　　　　//小文字を大文字に置き換える
"HELLO,WORLD"
s.toLowerCase()　　　　　　　　　　　　　　　　　　//大文字を小文字に置き換える
"hello,world"
```
GraphQLの一個のクエリでネストのモデルを一括操作する

# やりたいこと = 階層構造つまりネストになっているモデルを追加したり更新したい

[Prismaのクエリのドキュメント](https://www.prisma.io/docs/1.17/data-model-and-migrations/data-model-knul/#relations)に詳細が記載されている。

GraphQLのORMツールであるPrismaを使う場合にどんなクエリを使うとうまくいくか、概要を述べる。

# 階層構造 (nested model) を扱うには単純なクエリではうまくいかない

以下のようなParentとChildという二つのモデルの関係を`1対N`のリレーションと呼びます。

```
Parent
├ Child1
└ Child2 (1～2は同じChildというType。2個に限らず0以上の何個でもよい)
```

## やりたいことの具体例2つ(追加、更新)

これに新規の子Type`Child3`を追加して、

```
Parent
├ Child1
└ Child2
★Child3（追加）
```

その時に同時に`Parent2`も追加してしまいたい(後述する`create`)

```
Parent
├ Child1
└ Child2
★Parent2
├ Child3（追加）
```

そして親`Parent`につなぎたい(後述する`connect`)

```
Parent
├ Child1
├ Child2
└ Child3（接続）
```

ただ、２個目の接続というあたりをGraphQLでどうやるの？というのが普通と違う。


# 1対Nリレーション の更新クエリ (Nested mutation)

- 1対NのN (子)のTypeのインスタンス1個を作る (`createChild`. `Child`にはType名が入る)
- 作成するクエリの中で、親Typeをどうするかを指定する
    - 新規追加する (`create`)
    - 既存の親インスタンスに接続する(`connect`)

**「子を編集するときに親も編集する」というこれらのクエリを[Nested mutation](https://www.prisma.io/docs/prisma-graphql-api/mutations-qwe2/#nested-mutations)**という。

`create`のnested mutationであればこうする。

```graphql

mutation {
  createChild(data: {
    name: "ルークスカイウォーカー"
    parent: {
      create: {
        name: "ダースベイダー卿"
      }
    }
  }) {
    id
    car {
      id
    }
  }
}
```

ほかにもこんなクエリが書ける。

- その他 (`updateChild`等で使用)
    - 親の値を変える (`update`)
    - 既存の親がいれば更新し、いなかったら追加する (`upsert`, 主に`N対M`で使用)
    - 親を消す (`delete`)
    - 親を消さないで接続だけ切る (`disconnect`)
React の setState() の引数が関数の場合とオブジェクトの場合の違いについて整理する

本稿の[サンプルコードとデモサイト](https://qiita.com/im36-123/items/857c96ff60024c0d8a1c#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A8%E3%83%87%E3%83%A2%E3%82%B5%E3%82%A4%E3%83%88)を用意しました。

# 概要
本稿では React の `setState()` の引数に関数を渡す場合と、オブジェクトを渡す場合の挙動の差異についてまとめます。

React では `setState()` を使って state の変更ができます。 `setState()` には引数に関数かオブジェクトを渡せますが、 __オブジェクトを渡したときは予期せぬ動作になるかもしれないよ__ ということについて書きます。

# サンプルアプリ
それぞれの挙動を見るにあたって下記のサンプルコードを使います。
ボタンがクリックされるたびに `state.count` が +1 される単純なアプリです。

```react
import React, { Component } from "react";
import ReactDOM from "react-dom";

class Counter extends Component {
  state = {
    count: 0
  };

  render() {
    return (
      <div>
        <h1>Count: {this.state.count}</h1>
        <button onClick={this.handleClickFunction}>Count up</button>
        <button onClick={this.handleClickObject}>Count up</button>
      </div>
    );
  }

  handleClickFunction = () => {
    this.setState(prevState => {
      return { count: prevState.count + 1 };
    });
  };

  handleClickObject = () => {
    this.setState({ count: this.state.count + 1 });
  };
}

const rootElement = document.getElementById("root");
ReactDOM.render(<Counter />, rootElement);
```

結果は下記のようになります。
![Sep-30-2018 15-05-09.gif](https://qiita-image-store.s3.amazonaws.com/0/280341/227403e2-43cb-a52d-f375-8383dec5c8de.gif)
ボタンをクリックするたびに 1 ずつカウントアップされています。

さて、それでは、それぞれのメソッド内で `setState()` を複数にした場合はどうなるでしょうか。

# 引数に関数を渡した場合
まずは、 `setState()` に関数を渡す場合について見ていきましょう。
このようにコードを書き換えた場合です。
ボタンがクリックされるたびに、`state.count` +2 されそうです。

```jsx
...
handleClickFunction = () => {
  this.setState(prevState => {
    return { count: prevState.count + 1 };
  });
  this.setState(prevState => {
    return { count: prevState.count + 1 };
  });
};
...
```
結果はこのようになります。
![Sep-30-2018 15-03-30.gif](https://qiita-image-store.s3.amazonaws.com/0/280341/baa4c3ba-6ecb-0948-9743-befb25fbb302.gif)
いいですね。予期した動きになっています。

# 引数にオブジェクトを渡した場合
それでは、引数がオブジェクトの場合はどうでしょう。
コードをこのように変更します。

```jsx
...
handleClickObject = () => {
  this.setState({ count: this.state.count + 1 });
  this.setState({ count: this.state.count + 1 });
};
...
```
結果は下記のとおりです。
![Sep-30-2018 15-07-16.gif](https://qiita-image-store.s3.amazonaws.com/0/280341/24213e16-c8df-af64-08f7-12e63de55c68.gif)

引数にオブジェクトを渡した場合は単に、`state.count` に +1 した場合と同じ挙動になっています。

# なぜこうなるのか
`setState()` は、引数に __オブジェクトが渡された場合__ に、 state を即時にアップデートすることを __保証しません__。
Reactは、パフォーマンスを高めるため、複数の `setState（）` を単一の更新にバッチするためです。

そのため、1つの関数内で state の更新を連続的に行うときは、引数に関数を渡しましょう。

# まとめ
関数を渡す場合とオブジェクトを渡す場合の違いについて書いてある記事があまりなかったので書きました。
本稿の内容は[参考](https://qiita.com/im36-123/items/857c96ff60024c0d8a1c#%E5%8F%82%E8%80%83)に載せた React のドキュメントに詳しく書いてあります。

# サンプルコードとデモサイト
本稿の内容の最終的なコードを下記に用意してあります。
[im36-123/differences_of_set_state](https://github.com/im36-123/differences_of_set_state)
[デモサイト](https://im36-123.github.io/differences_of_set_state/)

# 参考
[React.Component – React](https://reactjs.org/docs/react-component.html#setstate)
[Component State – React](https://reactjs.org/docs/faq-state.html#what-does-setstate-do)
[State and Lifecycle – React](https://reactjs.org/docs/state-and-lifecycle.html)
Windows 10 の Magic Keyboard 「英数」・「かな」

# はじめに
Windows 10 を使用するにあたり、Magic Keyboard のキーバインド設定につまずきました。
特に「英数」・「かな」の設定が上手くいかなかったので、今後同じ箇所でつまずかれる方の役に立てばと思います。

# 環境

* [Microsoft Windows 10 Pro](https://www.amazon.co.jp/Microsoft-Windows-April-Update適用-パッケージ版/dp/B07765H5G4/ref=sr_1_4?ie=UTF8&qid=1538288847&sr=8-4&keywords=windows10%2Bpro&th=1)    
* [Magic Keyboard - 日本語（JIS）](https://www.apple.com/jp/shop/product/MLA22J/A/magic-keyboard-日本語jis)

# 必要なもの
* [Boot Camp サポートソフトウェア](https://support.apple.com/kb/DL1836?viewlocale=ja_JP&locale=ja_JP)
* [KeySwap for XP](https://www.vector.co.jp/soft/winnt/util/se228667.html)

# Boot Camp サポートソフトウェア
Windows 10 環境では、Magic Keyboard の「英数」・「かな」が上手く動作しませんでした。
特に「英数」に関しては、キー自体が反応しませんでした。
まずは、キーが反応するように Boot Camp サポートソフトウェアを導入する必要があります。

1. [Boot Camp サポートソフトウェア](https://support.apple.com/kb/DL1836?viewlocale=ja_JP&locale=ja_JP) をダウンロードします。[^1]
2. ダウンロードしたファイルを解凍します。
3. 解凍したフォルダの中にある “bootcamp5\BootCamp\Drivers\Apple\AppleKeyboardInstaller64.exe” をインストールします。

Boot Camp サポートソフトウェアの手順は以上になります。

# KeySwap for XP
KeySwap for XP は、自由にキーバインドの設定を行えるツールになります。
有名な ChangeKey というツールもありますが、今回 ChangeKey では上手く設定できなかったため
こちらを紹介させていただきます。

1. [KeySwap for XP](https://www.vector.co.jp/soft/winnt/util/se228667.html) をダウンロードします。
2. ダウンロードしたファイルを解凍します。
3. 【変換】を【ひらがな】(70)、【無変換】を【半角/全角】(29) に設定します。
<img width="500" alt="keyswap" src="https://qiita-image-store.s3.amazonaws.com/0/296531/3e8bb8b4-4274-3301-44a8-1714a12a0f2b.png">
4. 最後に再起動すれば設定が反映されます。

# さいごに
これで「英数」・「かな」が使用できるようになります。
あとは必要に応じて「caps」と「control」を入れ替えるなど、自分にあったキーバインドを設定してください。

[^1]: 執筆当時のバージョンは、5.1.5722 でした。
React Native と expo の tips 自分用

tipsが多くバラバラに上げるのもあれなので整理。
自分がハマったところ(勘違いやミスりそうなこと)が多く技術的なことは少なめかも。

## TouchableOpacityのonPressが自動で動いてしまうのを止めさせる。

これは自動で動いてしまう。(コード的にもNGのようだ)

```JSX:Buttonでの書き方
TouchableOpacity onPress={this.function(item)}
```

こちらは自動で動かない。(こちらが正しい)

```JSX:TouchableOpacityの場合
TouchableOpacity onPress={() => this.function(item)}
```

https://stackoverflow.com/questions/42329240/react-native-onpress-being-called-automatically

stackoverflowのスレにも書かれているけれども、
renderされた時に、関数を呼び出して結果を返そうとするみたいだ。

Buttonの場合は、上の書き方でよろしい。
勘違いするとハマる…。

## 外部コンポーネントのrenderItemに要素を渡す場合

```JSX:FlatList
<FlatList
  renderItem={({item}) => <ImportRenderItem item={item} />}
/>
```

## 親のfunctionを子コンポーネント Buttonで発火させる。

```JSX:parent
_onPush = () => {
  console.log('push button')
}


// render内
// ハマりどころはここで(actionを)onPressにしちゃわないこと
<ChildButton action={this._onPush}/>
```

```JSX:child
class ChildButton extends React.Component {
  render() {
    return (
      <Button title="button" onPress={this.props.action} />
    )
  }
}
```

### 注:functional componentのときは

```JSX:parent
<FunctionalButton action=this._onPush />
```

```JSX:in_functional_component
const FunctionalButton = (props) => {
  render() {
    return (
      <Button title="button" onPress={props.action} />
    )
  }
}
```

Functional側でthisが無いってだけなんだけれど、propsで受けているから当然だよね。

## HotReloadなどでソースの変更が反映されない場合の対処法

端末がホワイトアウトして、変更が反映されているように見えるけれどbuild失敗している。

```
Failed building JavaScript bundle.
```

って、conosoleなりに表示され、加えて失敗している原因も表示されているので、落ち着いて対処しましょう。

## react-native-navigationでScreen情報を取得

```JSX:
//遷移先にて
this.props.navigation.state.routeName
```

## snapshotから値を取りたいのにPromiseが返ってくる時

```
Promise {_40: 0, _65: 0, _55: null, _72: null}
```

こんな感じで。

対策としては、async/awaitなどして値をとってください。

## Invariant Violation: Tried to get frame for out of range index NaN

FlatListのdataはarrayだけだぜ?object渡していないかい?

## app.jsonを使う
app.json = Constants.manifest
Constants.manifest以下はexpo配下になる。

```json:app.json
{
  "expo": {
    "name": "app_name",
  }
}
```

```JSX
console.log(Constants.manifest.name) // app_name
```
私の未来予想図

# オープニング
BITでは、私たちの将来について考えます。世界のために何をするか, どのような人々が私たちと関わりますか, どんな世界を未来が見たいか、どんな仕事をするか、私はそれを考えます。で、未来予想図を作ります。　これを私の未来予想図の説明です。

## キーワード
- ミックス診断 (Mix Reality)
- ビジュアルな技術
- コミュニケーションの技術

##私の考える未来予想図
ミックス治療はVRとARとホログラムとコミュニケーション技術で組み合わせて遠くな場所に専門医と若いと他の医者をコミュニケーションしてもっと治療な方法ほやい取りすることができます。
2050年に、私は医者が隔離された地域で患者を治療するのに役立つエンジニアになりたい、特にインドネシアです。私は難しい状況に専門医と毛危険が少ない医者でコミュニケーション技術を作りたいです。
まず孤立した地域で手術をしたい医者は専門医をデバイスとモバイルで連絡して経験が少ない医者を何か問題があるなら伝えて、そして専門医はミックス診断で解決策する。ミックス診断はVRやARやホログラムなどを使います。
ホログラムで患者の状況がお互いに見える。それで専門医と医者が同時に患者の病気を治することができます。

## 私がこのような世界を欲しい理由
インドネシアに、隔離された地域はたくさんあります、例えばパプア。パプアに医者の力がとても必要です。パプアにほとんど経験が少ない医者だけがいます。経験が少ない医者はただ小さい手術だけすることができます。
経験が少ない医者と経験がたくさん医者がお互いに仕事することができません。ミックス治療で経験が少ない医者はたくさん経験な医者で実時間に手術することができます。ミックスレアリティで問題解決することができます。そしてメヂカル知識をちゃんとつたえます。

## 私は何をしますか
- BITでちゃんと目的をかんがえて卒業します。
- 日本のITの会社働いてIT技術や画像処理やミックスな技術やコミュニケーションの技術など勉強します。
- 旅行して(この旅行はメヂカルのために旅行します、メヂカルな技術を勉強してとどうやってITで新しい技術を作るを考えます)。
- 友達と会社で作って、まずプロダクトを売ります。
- また旅行を行きます、(今回の旅行はプロダックを売り込む)

##エンディング
未来予想図について私はいろいろなことを考えました。BITでみんなはどのようなエンジニアになりたいですか、今まで考えませんでした、これからどちらの道を取るかもう決めました。


**これは私の未来予想図です、もし質問とご意見があったら是非コメントとメールしてください**
小文字を大文字にする方法 [D014:小文字を大文字に][paiza]

###:runner:文字列をtoUpperCaseメソッドで大文字に変換する:basketball_player_tone5:###

文字列に対して呼び出す

```javascript
var line = "abc"
var str = line.toUpperCase();
 
↓↓↓↓↓↓↓ あなたの記事の内容
    console.log(str);
    =>ABC
```
⬆️大文字を小文字に変換するときは、toLowerCaseメソッドを使用

───────
#### Uppercaseを使って文字列の先頭を大文字にしたものを出力する

```javascript

var str = "repezen";
var str_uppercase = str[0].toUpperCase() + str.slice(1);

console.log(str_uppercase);
=> "Repezen"
```
↑↑↑↑↑↑↑ 編集リクエストの内容