OmniAICreator/Qiita-1.07M huggingface dataset:
Oculus Questを買ってしばらくしたので感想を書いてみる

OculusQuestが届いてしばらく遊んだので感想とか書いておきます。
##良いところ
一言で言えば、本格VRが遊べる機器が5万円で買えます。
細かいレビューは検索すればいくらでもでてくるので割愛します。

##悪いところ

###締めつけ感
他の人のレビューでは顔のフィット感も申し分ない、という意見がよく目立つのですが、
私個人では頬に跡が残るぐらいの締めつけ感があります。
Oculus Goでは軽いせいかそこまで跡は残ってないのですが、Questは1時間もすれば顔が痛い感じがあります。

###画面の出来
高解像度、有機ELという画面ですが、思ったほど良くないイメージです。
ディスプレイの光ってない部分が格子状に見える(スクリーンドア)のが思ったより目立ちます。
また、暗いところに光源が一つ、みたいなシーンになるとレンズのモアレも気になります。
見た目だけで言えば、Goの方が見やすい印象です。
こちらの方のBlogを参考にしてもらえればわかりやすいかと思います。
https://kimono-oyaji.com/vr-goggles-oculus-quest-05-2/

もっとも、一旦ゲームなどに夢中になればあまり気にはなりません。

###アプリへの不安
現在、VRChat、BeatSaverを始め、有名タイトルがずらりと並んでいますし、
チュートリアル用のソフトだけでも未来を感じて良いです。
ただ、Oculus社はQuest付属のストアはアプリ審査を厳しくする方針を示しました。
AndroidやiOSのストアに自作ソフトを並べるのは難しくありません。
しかし、Quest向けストアだけは、他のプラットフォームで結果を残すか、
企画書を送って承認されないと出せないという仕組みになっています。
安心できるゲームが多いというメリットは有るのですが、
その分少数にしか刺さらない攻めたゲームは期待できません。

現在のストアに並んでいるソフトは移植作が多く、値段も3000円前後が中心です。
他のプラットフォームで買ったのに同じものをまた3000円出して買うのは中々気が引けます。
Goでは1000円前後が中心だったので割高感を受けます。

ただし、現在開発に関しては自由に行なえますし、ストアを経由せず、apkを入手してインストールすることも出来ます。
[SideQuest](https://github.com/the-expanse/SideQuest)を入れると幸せになるでしょう。
$\tiny{DMMアプリはないけど、NSFW的なアプリもあります。}$

## アプリについて

###VRChat
出来は満足です。
World/Avatarによってはひどいことになりますが、概ね問題は起きません。
人数も10人を超えるあたりから音声が途切れ途切れになったりしますが、それ以下なら普通に話せます。

しかし、何より良いこととしてQuestを買った人がいるおかげで、
毎日のように初めての人が集まってくる事です。

vrchatはチャットツールなんで会話相手がいないと楽しくないです。
初めての人が多いほうが初めて同士で会話しやすいし、
既存の人も初心者迎え入れモードなので会話に参加しやすいです。

これが初心者の少ない環境になると、身内で固まっていて入りづらいんですよね。
そういう意味でQuest発売で新規の人が増えている今こそ参加しやすいタイミングです。

###VirtualDesktop

PCの画面をVRで見るソフトです。
これがすごいのは、VRゲームも遊べるところです。

要は、Questさえあれば、PC向けVR機器がいらないわけです。
てか、無線でPC向けVRゲームが遊べるって神すぎですよね…。
若干のラグを感じますが、VR酔いするほどではないです。

ただ、VRを使えるという部分は[Oculus社と一悶着](https://www.moguravr.com/virtual-desktop-3/)あったようで、
ストアにあるアプリでは動きません。
アプリを買った上で[SideQuest](https://github.com/the-expanse/SideQuest)(非公式APKをインストールする補助ソフト)を使って
公式ページにあるapkに置き換える必要があります。
https://www.vrdesktop.net/

##OculusGoとの比較
Questが出たら、Goは完全にいらないもの、と思ってたのですが、
軽くて見た目も良くてアプリも自由に出せるという点で、違う立ち位置になるなという感想です。

Questはわかっている個人が使う分には問題ないのですが、
ビジネス向けにわかってない人が取り扱い、わかってない人が使用する場合、
正直かなり面倒なハードだなと思っています。

トラッキングが切れるとガーディアンの画面になり、不意に「ここは何？」みたいになります。
メッセージウィンドウも最初はピントが合わずに読めないんです。
遠くを見ている時に近くにものを出されても二重に見えるあの現象が起きます。

コントローラも複雑だし、Goのシンプルな片手コントローラのほうが取り回しはいいので、
6DoFがどうしても必要、というコンテンツでもない限り、
Goの取り回しのしやすさはもう少し続くんじゃないかと思います。

##まとめ

このBlogでは悪い点ばかりをのべてますが、良い点を割愛しただけで、良い点のほうが多いです。
現状、最もおすすめできるVR機器で、一年以内にこれ以上のハードは出ないと思います。
理由として、機能と価格面でどうしても折り合いがつかない事は明らかだし、
ソフトのラインナップもここまで揃える政治力がある会社は稀でしょう。

では良きVRライフを。
【超基本】jQueryのFormDataを非同期通信で使う

初投稿です。自分用の備忘録のために残します。

##おことわり
rails, jqueryを初めて３週間のプログラミング超初心者です。間違っている箇所がありましたら、声をかけていただけると幸いです。

##FormData
>FormData オブジェクトは、XMLHttpRequest を使用して送信するためのキーと値のペアのセットを収集可能にします。本来はフォームデータの送信に使用することを想定していましたが、キーのついたデータを伝送するためにフォームとは独立して使用することもできます。伝送されるデータは、フォームのエンコードタイプが multipart/form-data に設定されている場合に、submit() メソッドで送信する際に使用するデータと同じ形式です。
参照：[MDN]
(https://developer.mozilla.org/ja/docs/Web/Guide/Using_FormData_Objects)


つまり、指定したHTMLのクラスやidをしているすることで、そのフォームに入力されたキーと値を引っ張ってこれるというオブジェクト。
「XMLをしようして・・・」と書いてありますが、JSON形式でもOK

##例えば


```message.js
$('#new_message').on('submit',function(e){
    e.preventDefault();
    var formData = new FormData(this);
```



3行めのFormData（this）のthisは１行目の＃new_messageのこと。
それをformDataという変数に突っ込んでいます。

じゃあ、#new_messageにはどんなキーがあるのかというと、
　

```create.json.jbuilder
json.content    @message.content
json.name       @message.user.name
json.time       @message.created_at.to_s
json.id         @message.id
json.img_url    @message.image
```


ここでは「キー」というのは、データベースに登録したカラムのことでcontentだったり、created_atだったりします。
「値」はフォームなので、ユーザーが入力したものになります。timeとかはメッセージを入力した時間ですね。
　


これらの「キー」と「値」をセットにし、JSON（またはXML）形式で引っ張ってくるのがDataFormオブジェクトです。


##この記事を書くのに使用したページ
1.[MDN] (https://developer.mozilla.org/ja/docs/Web/Guide/Using_FormData_Objects)
2.[Markdown書き方メモ](https://qiita.com/Minalinsky_1911/items/b684cfabe0f2fde0c67b#%E3%83%AA%E3%82%B9%E3%83%88)
3.[Markdown記法 チートシート] (https://qiita.com/Qiita/items/c686397e4a0f4f11683d#lists---%E3%83%AA%E3%82%B9%E3%83%88)
【実録】jetson-nano環境構築は簡単だ（笑）

[前日の記事読むとき参考になる](https://qiita.com/MuAuan/items/eaf0940491d7232377c7)と思うので、ウワンの行動が丸見えだけど、
Jetson-nanoのインストールのTwitterでの時系列つぶやきを、いつ、何をやったかの目安として記事にしておきます。
※試行錯誤込みですが、。。
**つぶやき開始（前夜のまとめ）；7:07 AM - 12 Jun 2019**
**つぶやき終了（Qiita記事の報告）；9:35 AM - 14 Jun 2019**
なお、時系列は時間をさかのぼるように配列しました。
※環境構築に、検索込み、Try&Errorなのでまあ二日は速い（簡単だ）よね

```
と言うことで、とりあえずqiitaに書きました!
なのはクセ無いね♪
「【Jetson_nano】インストールからTensorflow,Chainer,そしてKeras環境構築出来たよ♬」
https://qiita.com/MuAuan/items/eaf0940491d7232377c7
9:35 AM - 14 Jun 2019
```

```
tensorflow-gpuとその前段にhdf5-toolsを入れ直して（実質必要無かった）Kerasも動きました!
（python3とpipenv runの両方とも） 
2:45 AM - 14 Jun 2019
```
![keras_run.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/8a7c7f2c-38a6-5656-eb81-195f208c1f30.jpeg)

```
ついにgfortranに引き続いて、kerasがインストール出来ました！ 
2:15 AM - 14 Jun 2019
```
![gfortran_keras.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/6d86cbc4-aae0-e4a2-2324-95ac9e0a8788.jpeg)


```
CYTHONは入りました…scipyは何度か失敗…kerasインストール中(笑)
4:52 PM - 13 Jun 2019
```

```
OPENCVは入ってるみたい…試してないけど、あとpyenvでscipy入るか試しているところ…日本語化はうまく行っていないがまだまだこれから…
8:19 AM - 13 Jun 2019
```

```
最後、activateと云うのが出てきて、少し調べたがとりあえずChainerとmatplotlibもインストール出来ました…残るはscikit-learnとOPENCVだけど…行けるかな(笑) 
5:59 AM - 13 Jun 2019
```

```
やはりGPUのfree spaceが数百MBなので、これがナノの致命傷になりそう(^^) 
4:49 PM - 12 Jun 2019
```

```
クロックアップしたら、12⇛9s/epoch MNIST60000データまで改善したので、1060の4-5ばい位かかる…少し遅い(^^) 
4:47 PM - 12 Jun 2019
```

```
とりあえず、tensorflow.kerasでkerasバージョンのMNISTま動きました!
速度は7倍遅いので、GPU使っているか怪しいけど(笑) 
8:27 AM - 12 Jun 2019
```

```
とりあえず今日中にhttp://MNIST.py  tensorflow版動いたみたい…そうかメモリーがデフォ124MBなので止まりました(T_T) 
7:54 AM - 12 Jun 2019
```

```
JUPYTER notebook もインストール出来そうです 
7:36 AM - 12 Jun 2019
```
![jupyternotebook.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/ae2ba37d-0e9d-a298-b200-eea2fe279f28.jpeg)


```
④に入る前にこのコマンド叩いてます…このおまじないないとうんともすんとも動きませんでした！
7:28 AM - 12 Jun 2019
```
![omajinai.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/a51e2cd9-172a-b2a0-36eb-13768bcb2797.jpeg)


```
install1時間弱で終わりました♪
7:23 AM - 12 Jun 2019
```
![tensorflow-gpu1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/8bb4e2e2-0afc-452a-bd77-8e39d873b678.jpeg)


```
JETSON tx1,tx2そしてcarrierに乗せるのもやったけど、nano一番簡単かもウワン 
7:21 AM - 12 Jun 2019
```

```
ナノは小さいけど、ケーブルだらけ(笑) 
7:13 AM - 12 Jun 2019
```
![nano_cable.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/e49cdd0c-7d02-9985-720c-4e6cea6444f7.jpeg)


```
nano install 
①ほぼNVIDIAさんのサイト通りでSDカードまでOK
②ナノ本体に指してケーブル繋げて、電源が5v2Aがなかなか無くて探し回って見っけました→無事に起動
③初期化はENGLISHで実行、ネットワークは有線LAN繋げました→無事ブラウザ接続確認
④Pythonとtensorflow-gpu install中
#nano
7:07 AM - 12 Jun 2019
```
![nano_install.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/93aa06be-5d92-2e1a-bb09-042b5f4e2905.jpeg)

###まとめ
・ほぼ二日～三日の夕方からで環境構築できたので、待ち時間入れても二日では楽々構築できるということで、jetson-nanoの環境構築は簡単です

・物体検出や暗視カメラはすぐやろうと思う
・この性能ならいろいろ使えそうなので、GPUのメモリーの大きいモデル（せめて８GB）の発売して欲しいなぁ～
超シンプルなKinesis CLIの使い方メモ


Kinesisをいろいろ試してみる時にKinesis CLIを使ってデータを登録して動きを確認した。
プログラムを作るよりもKinesis CLIを使った方が便利に試せる。
そのときに使ったコマンドのメモ。


## ストリームの操作
#### ストリームの作成
一つのShardは一秒間に1MBまたは1000件のデータ書き込みまでしかできないという制限がある。これを超えるリクエストが想定されるストリームの場合、shardの数を増やす必要がある。

```
aws kinesis create-stream --stream-name Foo --shard-count 1
```

#### ストリームの削除

```
aws kinesis delete-stream --stream-name Foo
```

####ストリームの一覧を表示

```
aws kinesis list-streams
```

#### ストリームの状態を確認

```
aws kinesis describe-stream --stream-name Foo
```

## データ操作

####ストリームにデータを登録する
``data``に登録したいデータを記述する。JSONで記述する場合、JSON内のダブルコーテーションはバックスラッシュでエスケープする必要がある点に注意する。

```
aws kinesis put-record --stream-name Foo --partition-key 123 --
data "{\"name\":\"tanaka\", \"age\": 23}"
```		


####データの取り出し

- 最初にShard-iteratorを取得し、それを使ってデータを取得する。
ShardIteratorはどこまでのデータを取得したかを示すアンカーの役割をしている。
- 同じShardIteratorを使ってget-recoredsすると、同じデータが何度も取れる。
- get-recordsした時に送られてくるnextShardIteratorを使うと、受信したデータ移行のデータのみを取得することができる。

```
#Shard Iteratorの取得
SHARD_ITERATOR=$(aws kinesis get-shard-iterator --shard-id shardId-000000000000 --shard-iterator-type TRIM_HORIZON --stream-name Foo --query 'ShardIterator') 

#レコードの取得
aws kinesis get-records --shard-iterator $SHARD_ITERATOR
```



		
出典：

- Perform Basic Kinesis Data Stream Operations Using the AWS CLI
https://docs.aws.amazon.com/streams/latest/dev/fundamental-stream.html

- Kinesisの制限
https://docs.aws.amazon.com/streams/latest/dev/service-sizes-and-limits.html
minikubeのVMから別VMのディレクトリをマウント

# 前提

Kubernetes実践入門 3.7.3 「ストレージの準備」
がしたい

- minikubeのvm driverはVirtualBox
- 別VMもVirtualBox
- OSはUbuntu19.04

# 手順

NFSサーバは書籍に書いてあるとおりのセットアップで問題ない

```shell
sudo apt update
sudo apt install nfs-kernel-server
sudo mkdir /share
sudo chmod 777 /share
sudo vi /etc/exports
/share *(rw,insecure)
```

minikubeのVMからマウントするとき別VMのIPアドレスが必要

```shell
sudo mount -t nfs <別VMのIP>:/share /mnt/share
```

このとき別VMのネットワーク設定で、ホストオンリーアダプターを有効化しておき、
上記コマンドではホストオンリーアダプターのIPアドレスを指定する。
ZendFramework メモ (1)

# 目的とゴール
業務効率化へ向けた調査メモレベルを展開

# Zendframeworkとは
Zend Frameworkは、プロフェッショナルなPHP開発のための60以上のパッケージのコレクションです。各パッケージはGitHubから入手でき、 Composerからインストールできます 。

# 準備
以下のサイトからダウンロードしましょう
[https://framework.zend.com/downloads/skeleton-app](https://framework.zend.com/downloads/skeleton-app)

# ZF1とZF2の違い
ZF1と、ZF2はまず導入方法が違う。
##ZF1は、[http://bit.ly/POQMDO](http://bit.ly/POQMDO)からファイルをダウンロードして展開。展開したファイルから「zf.sh」からプロジェクトを作成
```
$ zf create rpoject app
```
##ZF2は、Composerからインストール

### Composerとは
新しく作られたPHPライブラリなどをインストールするための機構、Linux系OSのnpmを参考に作られている。ライブラリ同士の依存関係を解消し、コマンドから一発ですべてが入る。

```PHP
$ php composer.phar create-project --repository-url="http://packeage.zendframework.com" zendframework/skeleton-application path/to/installl
```

# 初期画面
ZF2からtwitter社のBootstrapが採用されている

# パフォーマンスの違い
ZF2からは「ZendSkeletonApplication」(Clone By Github)
計測方法として出力方法がGNUPlotでグラフを書き出すが、
以前より少しスピードは遅くなっているが、ZF1より機能が豊富かつ、ClassMapAutoloadのキャッシュやApplicationCacheなどで早くなる

# 参考
[https://www.slideshare.net/nully/zend-framework2zf1zf2](https://www.slideshare.net/nully/zend-framework2zf1zf2)
bluetoothの研究　その5

#概要

bluetoothを理解したかった。
bt04を使ってみる。

#写真

![DSCN0349.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e9315b3c-47dc-b781-af84-ab960d7ef581.jpeg)

#接続

windowsにch340なシリアルUSBをつなぐ。
ch340に、bt04つなぐ。


#設定

テラタームの設定

9600-8-1-ｎ

![tera.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/53976e57-8008-4f22-c0eb-41703702ef69.jpeg)

#結果

![bt04-a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a88058f9-7f41-afde-b504-dd477990e7dd.jpeg)

#help

```
at
OK
AT+HELP
Command              Description
----------------------------------------------------------------
AT                   Check if the command terminal work normally
AT+RESET             Software reboot
AT+VERSION           Get firmware, bluetooth, HCI and LMP version
AT+HELP              List all the commands
AT+NAME              Get/Set local device name
AT+PIN               Get/Set pin code for pairing
AT+BAUD              Get/Set baud rate
AT+CLEAR             Remove the remembered remote address
AT+LADDR             Get local bluetooth address
AT+DEFAULT           Restore factory default
AT+COD               Get/Set local class of device
AT+IAC               Get/Set inquiry access code
AT+ROLE              Get/Set master or slave mode
AT+STATE             Get current state
AT+UARTMODE          Get/Set uart stop bits and parity
AT+ENABLEIND         Enable/Disable Indication print
AT+LSP               List Paired Device List
AT+RESETPDL          Reset Paired Device List
AT+REMOVEPDL         Remove one entry from Paired Device List
-----------------------------------------------------------------
Note: (M) = The command support master mode only, other commands
support both master and slave mode.
For more information, please visit http://www.bolutek.cn
Copyright@2012 www.bolutek.cn. All rights reserved.


```

#ペアリング

androidと1234でOK。



以上。
python の　お勉強　３日目

##Tkinterを使ってグラフを描いてみる
（プログラミングの勉強として作っていきます。）
　プログラミングの流れ
1. 数値を入力する画面をレイアウトする。
2. 入力された数値をからグラフを描く。
3. 可能なら同じwindowの中にグラフを描く
　
２.は今の実力？で可能に思いますが時間がかかりそうなので次回以降
３.は検索中です。

レイアウト
数値（整数）データを４つ入力してグラフに描く画面を作る
このレイアウト画面は　python doc help
から引用して一部変更しました。
（文法はあまりわかっていない）

```
#python Gui/Graphic help :learnpython SpanningMulipleCells
from tkinter import *
from tkinter import ttk

root = Tk()

content = ttk.Frame(root)
frame = ttk.Frame(content, borderwidth=5, relief="sunken", width=200, height=200)
namelbl1 = ttk.Label(content, text="Before")
name1 = ttk.Entry(content)
namelbl2 = ttk.Label(content, text="30mim")
name2 = ttk.Entry(content)
namelbl3 = ttk.Label(content, text="1hour")
name3 = ttk.Entry(content)
namelbl4 = ttk.Label(content, text="2hour")
name4 = ttk.Entry(content)
#onevar = BooleanVar()
#twovar = BooleanVar()
#threevar = BooleanVar()
#onevar.set(True)
#twovar.set(False)
#threevar.set(True)

#one = ttk.Checkbutton(content, text="One", variable=onevar, onvalue=True)
#two = ttk.Checkbutton(content, text="Two", variable=twovar, onvalue=True)
#three = ttk.Checkbutton(content, text="Three", variable=threevar, onvalue=True)
ok = ttk.Button(content, text="Okay")
cancel = ttk.Button(content, text="Cancel")

content.grid(column=0, row=0)
frame.grid(column=0, row=0, columnspan=3, rowspan=8)
namelbl1.grid(column=3, row=0, columnspan=2)
name1.grid(column=3, row=1, columnspan=2)
namelbl2.grid(column=3, row=2, columnspan=2)
name2.grid(column=3, row=3, columnspan=2)
namelbl3.grid(column=3, row=4, columnspan=2)
name3.grid(column=3, row=5, columnspan=2)
namelbl4.grid(column=3, row=6, columnspan=2)
name4.grid(column=3, row=7, columnspan=2)
#one.grid(column=0, row=8)
#two.grid(column=1, row=8)
#three.grid(column=2, row=8)
ok.grid(column=3, row=8)
cancel.grid(column=4, row=8)

root.mainloop()
```
Macフリーズ時、快適に動かせる為にやる7つのこと

#Mac book proのフリーズはつらい。。
2018年6月の発表会で新型のmacbookproが出なかったのでその場で購入したら、7月にnewモデルが出て悲しい気持ちになりました。。
仕方なくそのモデルで頑張って、分割してようやく支払いが終わるという１２月に
### **ついに来ましたフリーズ地獄**
ブラウザを更新しても次のページが見れない。
デスクトップを移動しても横の画面に移動しないなど
**なかなかパンチの効いたエラーを出してきます。**

そこでAppleの公式ページを中心に色々と解決方法をまとめてみました。

# 解決方法
1. アプリの強制終了や再起動
2. First Aid
3. SMC（システム管理コントローラ）をリセット
4. セーフモード
5. NVRAM または PRAM をリセットする
6. macOSの再インストール
7. ディスクを消去し、Timemachineから復元

# 手順
### 1. アプリの強制終了や再起動

左上のりんごマークから強制終了を選択→chromeなど消費が激しいアプリを落とす
<img width="291" alt="Screenshot 2018-12-13 at 12.19.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/181534/23544647-ab34-119f-a927-7e36c5b99428.png">
<img width="335" alt="Screenshot 2018-12-13 at 12.20.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/181534/222605db-338b-7e77-5e92-582552e71709.png">
それでもパソコンが重い場合には再起動をかける

### 2. First Aid
ディスクユーティリティアプリから本体のディスク(Macintosh HD)を選択してFirst Aid
<img width="147" alt="Screenshot 2018-12-13 at 12.28.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/181534/43ffafdb-54d4-a1cc-4b13-a4c870e251dd.png">
<img width="819" alt="Screenshot 2018-12-13 at 12.28.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/181534/3b12a11b-271b-c007-f8ef-eadc0fb6da4c.png">
Fisrt Aid中はパソコンが動かせなくなるのでポップアップで確認される。(大事なデータは必ずやる前にセーブしてください)
<img width="420" alt="Screenshot 2018-12-13 at 12.31.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/181534/d8dd02c0-233b-8db5-724c-b3447b2b6cd9.png">

ここからは一旦Macを終了されるやり方になります。(再起動以外)
### 3. SMC（システム管理コントローラ）をリセット
パソコンによってやり方が異なるので[こちら](https://support.apple.com/ja-jp/HT201295)を参考に
### 4. セーフモード
再起動or終了して立ち上げるときにshiftを押し続ける。
りんごマークが出てきたら手を離す。
これにより余計な機能を省いて起動することができ、軽い動作で動かすことができる。
https://support.apple.com/ja-jp/HT201262
### 5. NVRAM または PRAM をリセットする
option+command+P+Rを押しながら立ち上げる
詳しくは[こちら](https://support.apple.com/ja-jp/HT204063)
### 6. macOSの再インストール
最終手段ですねー
頑張りましょう
dockerをRootlessで実行する

Ubuntu18.04で確認。

https://qiita.com/inductor/items/75db0c1c0d49646dd68a と少し環境が異なり、さらに手順が必要だったため記録します。

ユーザのsystemdが起動しているか確認します。

```
systemctl --user status
```

ユーザのsystemdが使えないと言われた場合、以下を実行し、XDG_RUNTIME_DIRを.bashrcに設定します。

```
sudo loginctl enable-linger jenkins
```

```bash:.bashrc
export XDG_RUNTIME_DIR=/run/user/$UID
```

再ログインして、ユーザのsystemdで立ち上がっていることを確認してください。

以下の通り実行して、dockerをインストールします。

```sh
curl -sSL https://get.docker.com/rootless > rootless.sh
export FORCE_ROOTLESS_INSTALL=1
bash rootless.sh
```

DOCKER_HOSTを.bashrcで書き換えます。

```
export PATH=$HOME/bin:$PATH
export DOCKER_HOST=unix:///run/user/$UID/docker.sock
```

dockerが起動していることを確認します。

```
docker ps
```
最速で目標達成する方法（学習法）


## 流れ

### 1. ゴールを定める（仮でも良い）。←ここが最も大切

### 2. それに対し、現状の課題を把握。

### 3. それに対し、解決策（必要なこと）を把握。

### 4. 上記で定めたことを軸に、必要なことだけ学習する。

難易度が低いものの場合。
・わからなくなったら、ググるスタイルで学習する。
・全体を理解しようとしない（本一冊やりきろうみたいなのは非効率）。

難易度が高いものの場合。
・繰り返しの学習で習得することを念頭におく（スポーツと一緒）。
・難易度の設定は、ギリギリ理解ができそうな内容のものを選ぶと効率的。
（楽にこなせているというのは非効率。気が緩むとついつい楽な方へ行くので注意。） 

### 5. 適宜軌道修正

### 6. アウトプットする
1で定めた目標を実現する。


## その他、参考になりそうなキーワード

・遅延評価勉強法
・YAGNI
・フェルミ推定
・具体と抽象を往復
・自分の頭で柔軟に考える

---
開発環境 for webpack + typescript

## 使うもの

`webpack`と`tsc`、[`nodemon`](https://github.com/remy/nodemon)さえあれば十分

```shell
npm install -g nodemon
```

## コマンド

それぞれ別ターミナルで実行

```shell
npx webpack --watch
```

```shell
npx tsc --watch
```

```shell
nodemon --watch built ./index.js
```
ATOM 内でターミナルを開きたい

# ATOM 内でターミナルを開きたい
VSCode でできるような同一画面上でターミナルも開きたい場合ってあるかと思います。
それを ATOM でもできるようにした際にかなり苦戦したのでまとめました。
パッケージを入れてどーん！という風にはいきませんでしたので。。。

## 前提
* OS: macOS Mojave 10.14.5
* ATOM: 1.37.0 x64
    * 英語表記にて使用しています(英語に慣れたい、英語はかっこいいとの理由から)。

## 前知識
* ATOM ではプラグインをパッケージと呼びます。
* パッケージをインストールするには 「Preference」 を開き 「Install」 から任意のパッケージを検索し、「Install」 ボタンをクリックします。
    * または 「Welcome Guide」 にも 「Install a Package」 という項目があります。

## terminal-plus
Install 画面から 「teminal」 と検索すればまず目に入るのではないでしょうか。
ダウンロード数も 630,000 オーバーと信頼されてそうな予感です。
なので早速 Install。
...

しかし動きません。
レファレンス通り 「+」 ボタンを押せども枠が出来上がるだけでコマンドが打てそうな気配がありません。
実際打ってみてもうんともすんとも言いません。なんということでしょう。

このとき Google で色々と検索して時間を使ってしまいましたが答えはすぐ近くにあるものなのです。
Github の [terminal-plus の issue 563](https://github.com/jeremyramin/terminal-plus/issues/563) のページを開きましょう。
はい、Doesn't work.
いろいろ下をたどっていくと terminal-plus を fork した platformio-atom-ide-terminal というものがあるようです。

## platformio-atom-ide-terminal
terminal-plus を fork して作られた ATOM パッケージ。 [github](https://github.com/platformio/platformio-atom-ide-terminal)
ATOM の Install から 「platformio-ide-terminal」 検索して Install ボタンをクリック。
これで ATOM 内でターミナルが使えるようになります。

## 総括(自戒)
困ったら公式をよく見るんや。
デジタル署名について混乱した話

#デジタル署名の定義
Weblioさんによる解説はこう↓

>デジタル署名とは、電子文書の正当性を保証するために付けられる、暗号化された署名情報のことである。 電子商取引をする場合などによく利用され、文書の作成者本人であることと、途中で文書が改ざんされていないことを証明する。 一般にデジタル署名では、公開鍵暗号方式を利用する。

公開鍵暗号方式を使うんだね！
**公開鍵で暗号化して、秘密鍵で復号するあれね！**

>一般にデジタル署名では、公開鍵暗号方式を利用する。具体的には、送信する情報（データ）からハッシュ関数というプログラムを使ってメッセージダイジェストと呼ばれるデータを作り出す。これを送信者の共通鍵（秘密鍵）で暗号化したものをデジタル署名という。送信者は、送信するデータと一緒にデジタル署名を送る。
受信者は、情報と一緒に送られてきたデジタル署名を送信者の公開鍵で復号して、メッセージダイジェストを入手し、同時に受け取った情報（データ）を基に、送信者が使ったものと同じプログラムでメッセージダイジェストを作り出す。両方のメッセージダイジェストが同じものであれば、間違いなく本人が送ったもので、途中で改ざんもされていないということが証明される。


**秘密鍵で暗号化して公開鍵で復号しちゃうの！？**
公開鍵暗号方式って公開鍵で暗号化して秘密鍵で復号するんじゃないの？  って思ったりしないですか？
今回はそういうモヤッとした方向けのお話

#公開鍵暗号方式
それじゃ、まずは公開鍵暗号方式の復習から

公開鍵暗号方式の仕組みは
かなりざっくり言うと、**誰にでもメッセージを暗号化できるけど　復号できるのは秘密鍵を持っている人だけ**
よくある例えが**公開鍵暗号方式は「南京錠」とそれを開ける「鍵」**っていうもの。
>公開鍵＝南京錠
秘密鍵＝鍵
①Aさん（受信者）がBさん（送信者）に南京錠を渡す
②Bさんは秘密の手紙がはいった箱に南京錠をかけて（暗号化）、Aさんに送る
③Aさんは秘密の手紙を受け取り、南京錠を開ける（復号）

ここでのポイント
**復号できるのが「秘密鍵を持っているひとだけ」ということ**


#デジタル署名とは

さて、いよいよ本題のデジタル署名ですが、やりたいことはこの2つ

>①データの送信元は正しいのか？なりすましをチェック
②送られてきたデータは途中で書き換えられていないか？改ざんをチェック

##なりすましチェック
①のなりすましをチェックするために使われるのが「サイン」「署名」
本人であることを証明できるもの、サインとか指紋とかをイメージするとよい
これを送るデータにくっつけることによって、受け手は「あ、本人ね」と分かります
ここで公開鍵暗号方式の特徴を思い出してください
**復号できるのが「秘密鍵を持っている人だけ」という点**

デジタル署名はこの点を応用して
**サインを作成できるのは「秘密鍵を持っている人だけ」という仕組みになっています**
これでなりすましをチェックすることが可能
**秘密鍵を持っている人以外は署名を作れません**

暗号通信と署名では目的が違うのです

- 暗号通信：誰にも見られたくないデータを受信者にしか分からないようにする
    - 暗号通信で**秘密鍵を持っているのは受信者**
- 署名：送信者にしか作れないサインをつけてデータを送る
    - 署名で**秘密鍵を持っているのは送信者**

秘密鍵で暗号化して公開鍵で復号する、というのは混乱してしまうので
こう理解するとよい
>秘密鍵で署名（本人である証）を作って、公開鍵でその署名を照合する
（ちゃんと言うと、秘密鍵で認証して公開鍵で検証）

ここまでの説明が
①データの送信元は正しいのか？なりすましをチェック**←こっち**
②送られてきたデータは途中で書き換えられていないか？改ざんをチェック

では、改ざんチェックはどうしてるのかしら？

##改ざんチェック

改ざんの防止では、データが途中で書き換えられていないか確かめるために、
**データから適当な文字列を生成して、それを送るデータにくっつけます。**

例えば送るデータ*「吾輩は猫である、名前はまだない」*の文章から
適当な文字列を生成した結果*「QAWSEDRFTGYH」*だとします。

- 受信したデータ
    - *「吾輩は猫である、名前はまだない」*
    - *「QAWSEDRFTGYH」*

受け手が*「吾輩は猫である、名前はまだない」*というデータを元に
同じ方法で適当な文字列を生成した結果*「QAWSEDRFTGYH」*になりました。

文字列の生成の方法は共通なら、
もらったデータから生成した文字列とデータにくっついていた文字列が一致していれば、
途中で文章が変わっていないとわかります。
**もし仮に改ざんが起きていた場合、送信側と受信側で生成される文字列が一致しないはず。**

デジタル署名のこの改ざん防止方法を説明する際に

- データを変換して文字列を生成することを「ハッシュ化」
- 生成した文字列を「ダイジェストメッセージ（ハッシュ値とも）」
- 文字列生成の方法を「ハッシュ関数」

と呼んでいます。

#まとめ

- デジタル署名の目的は２つ
    - なりすまし防止
    - 改ざん防止

**なりすまし防止のために公開鍵暗号方式を応用している**

- 公開鍵暗号方式
    - 公開鍵で暗号化、秘密鍵で復号    
- 公開鍵暗号方式を応用したデジタル署名
    - 秘密鍵で署名作成、公開鍵で署名検証


（おことわり）
電子署名とデジタル署名をごっちゃにするな！定義まちがってるんじゃないの？などなど
スタミナ切れで説明しきれていない部分があると思いますが、大目に見てください
iPhone 横向きでポップオーバー表示するとこわれた＼(^o^)／

# はじめに
タイトル通り。なんかポップオーバーがおかしい！？

同じ境遇の人の一助になれば幸いです。

# 現象
iPhone 画面横向きでポップオーバー表示すると下記のように表示がおかしい。

横はなんかおかしい
![landscape](https://user-images.githubusercontent.com/34936885/59527608-086ea700-8f17-11e9-865e-ebfee9b5119a.png)

縦は普通
![portrait](https://user-images.githubusercontent.com/34936885/59527557-e07f4380-8f16-11e9-9b07-03c47ee2eba7.png)

発生した[ソース](https://github.com/adventam10/SwiftArchitecture/tree/Popover_bug)

発生した環境

* Xcode10.2.1 iOS12.2（シミュレータ）

発生しなかった環境

* Xcode10.2.1 iOS10.1.1（実機）
* Xcode10.1 iOS10.1.1（実機）
* Xcode10.1 iOS12.1（シミュレータ）

# 原因
デリゲートが間違っていた。

これじゃなくて

```swift
extension PrefectureListViewController: UIPopoverPresentationControllerDelegate {
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
    }
}
```

こっち

```swift
extension PrefectureListViewController: UIPopoverPresentationControllerDelegate {
    func adaptivePresentationStyle(for controller: UIPresentationController,
                                   traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        return .none
    }
}
```

iPhone でポップオーバーを表示するには adapt~ のやつで `.none` 返さないといけないということだけ覚えていて Cmd + Ctr + J でとんで一番上にあった！！と思って実装したら違うやつだった...
<img width="861" alt="delegate" src="https://user-images.githubusercontent.com/34936885/59527872-b8dcab00-8f17-11e9-8ecf-44b7f824b301.png">

ちゃんと [Developer](https://developer.apple.com/documentation/uikit/uiadaptivepresentationcontrollerdelegate/1618343-adaptivepresentationstyle) にも iOS 8.3 以降は `adaptivePresentationStyle(for:traitCollection:)` 使おうみたいなことが書いてある。
>
In iOS 8.3 and later, use the adaptivePresentationStyle(for:traitCollection:) method to handle all trait changes instead of this method. If you do not implement that method, you can use this method to change the presentation style when transitioning to a horizontally compact environment.

今回は Xcode10.1 では動作していたので気づくのが遅れてしまった...

# さいごに
雰囲気で実装するのはやめよう！
ClovaからLINEにメッセージを送る（python編）

#結論から言うと
clovaからLINE botにメッセージを送信するときにはmessaging APIの中の[push Message](https://developers.line.biz/ja/reference/messaging-api/#send-push-message)を使えば送信できます。そのためにはbotのアカウントはclovaスキルを作成したときのブロバイダと一致していなければいけません。さらにclovaから送信されるwebhookリクエストの中からユーザを特定するためのuserIdを取り出す必要があります。

#がここで問題が
久しぶりに自分が作ったclovaスキルをデプロイすると、何故かエラーが起きていました。よく見るとuserIdの参照ができていないようです。

```python:これがエラーの出た箇所

@clova.handle.intent("SampleIntent")
def reason_handler(clova_request):
    UserID = clova_request.user_id
    keyword = clova_request.slot_value("Reason")
    app.logger.debug(keyword)
    app.logger.debug("Intent started")
    app.logger.debug("UserID: {}".format(UserID))
    app.logger.debug("Get Word: {}".format(keyword))
```
このうちの```clova_request.user_id```の参照が正しくないようです。これを作成したのが2018年末から2019年年始にかけてのことだったのですが、その時は動いてたんです。そのころから仕様が変わっているのかな？と疑問に思って調べてみました。すると[このリンク](https://github.com/line/clova-cek-sdk-python-sample/blob/master/home-extension.py)にたどり着き、こんな記述を見つけました。

```python:サンプル
@clova.handle.intent("TurnOn")
def turn_on_handler(clova_request):
    user_id = clova_request.context.user.id
    slots = clova_request.slots
    home_state = user_home_state.get(user_id, HomeState())
    device_name = None
```
つまり、```clova_request.user_id```を```clova_request.context.user.id```に変更してみました。するともスキルは問題なく動作し、LINEにメッセージを送信することができました。

#でも他に変更がありそう…
と思って調べてみたら[Clova developer center](https://clova-developers.line.biz/#/updatehistory/)のアップデート履歴にしっかりアップデート内容が記載されていました。そこは流石に良心的ですね…

#宣伝
現在スキルストアで「バーチャル面接」がリリースされています。LINE botと連携して楽しめるので、是非使ってみてください！
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/dca73bad-4aa4-2222-3dc6-31b948f6a3c4.png)
google homeを育児に活用する

# google homeが育児にとても便利だったので共有します。



## やったこと

- ミルクの時間と量を記録する(病院できかれることがある)
    - OK google, ミルク 80 → ミルク80mlを記録しました。
- おしっことうんちの時間を記録する(病院できかれることがある)
    - OK google, おしっこ → おしっこの時間を記録しました。
- lineにメッセージを飛ばす (例:おむつ買ってきて)
    - OK google, line おむつ買ってきて → lineにとぶ
- ミルクの時間を通知する (新生児は3時間おきにミルクタイムがくるので通知がないと辛くなってくる)

## やってみてわかったこと

- 新生児のミルクは１日8回、おむつは15回くらいで記録をつけてないと今週ちゃんとミルクが飲めてるんだっけ？など不安になる
- 育児中は手が使えないことがあるので音声で命令だせるのがすごく重宝する 
- google assistantに[育児ノート](https://assistant.google.com/services/a/uid/000000a0f0ff0bd4?hl=ja-JP)という似たようなことを実現できるアプリがあるが、リッチなことができるがその反面ミルクの時間を記録するだけでも[OK google 育児ノートにつないで→はい、育児ノートを起動します→ミルク→記録しました→終了する場合は終了といってください→終了]のやり取りが面倒だったので、自分で作り直した[OK google ミルク→ミルクを記録しました]みたいなかんじを実現


## 実現手段

[IFTTT](https://ja.wikipedia.org/wiki/IFTTT)を使いgoogle home → Google Sheets (or line)に飛ばす


## 実装

ifttt→google sheetsの基本的な連携方法は[ここ](http://takopomm.hatenablog.com/entry/2017/12/09/023000)を参照ください

### おしっこの時間記録

<img width="347" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53186/a7543305-bae4-b003-edac-f79736d5e0a7.png">

<img width="338" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53186/9e1ef78f-0f7f-1f48-f64e-38f197e03b6c.png">

### うんちの時間記録

<img width="327" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53186/7c34f4e8-0314-07ff-1665-a6d8e2ddd59f.png">
<img width="329" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53186/d8eded1f-7d89-3cf6-749a-f600905d6b20.png">

### ミルクの時間と量を記録する
<img width="325" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53186/fbe61037-435a-0eda-addd-f14038676c29.png">
<img width="325" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53186/06ba31a9-1af3-3c4f-c157-059b8919a5b0.png">

### lineにメッセージを飛ばす

[これをつかう](https://ifttt.com/applets/Z58dNKiE-ok-google-line)

### lineにミルクの時間を通知

iftttで以下のレシピを自分で作る (1日8回つうちしたい場合は8個作る(もっとスマートな方法があるかもしれない))

<img width="210" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53186/96c6a7bd-3fad-1e16-89de-04df5a515f49.png">


実際は利便性を上げるために、おしっこうんちで両方を同時に記録したり、ミルクじゃなくて母乳ようのレシピもかいた。ミルクと違い母乳は量ではなくかかった時間を記録する(授乳開始、授乳終了のコマンドを用意した)。外出中のgoogle homeを起点にできないようにスマホのボタンでも記録できるようにした[こんな感じ](https://ifttt-japan.club/knowledge/this/button-widget)。google sheets上で記録した時間がtextになってしまうのでdate timeでパースするかifttt上time stampのうちかたを工夫したほうがいい[参考文献](https://teratail.com/questions/124886)
[JavaScript]Circle CIで変更箇所のファイルのみを静的解析(Lint)する①

# 概要
この記事は、Circle CIで変更のあったファイルのみを静的解析する方法を記載しています。

結論は[コチラ](https://qiita.com/mgmgOmO/items/3e30ec91d4bc9b53751d#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E8%AA%AC%E6%98%8E)なので、既に手順が分かる人は飛ばしてください。

変更箇所のみの解析は、以下の場合などに有効です。
・既にあるプロジェクトに静的解析ツールを導入する場合
・対象ファイルが多くて解析に時間がかかる場合

## Circle CIとは
[**Circle CI**](https://circleci.jp/)とは継続的インテグレーション(CI)のためのクラウドサービスです。
Gitレポジトリにpushするとビルド・テスト・デプロイを自動で行うなどしてくれます。

## 静的解析とは
**静的解析(Lint)**とは、実行ファイルを実行することなく品質検証する手法のことです。フォーマッターと併用して使用したりします。

今回導入する静的解析ツールは[ESLint](https://eslint.org/)です。
パッケージ管理ツール**npm**は設定済みとします。

# 手順
## 静的解析ツール(Linter)の設定

### 1. インストール
チームで開発するためにパッケージを**ローカルインストール**します。
[CLI 環境構築 グローバルインストールとローカルインストールの違いについて](https://qiita.com/aya02/items/4c9c827f6a782ef65d57)

```bash
$ npm install --save-dev eslint
```

### 2. エイリアスの設定
パッケージをローカルインストールした時は、実行時のパス指定が面倒なためタスクランナーにエイリアスを登録します。
`package.json`の`scripts`に以下のように追記します。

```package.json
{
    "scripts": {
        "eslint": "eslint"
    }
}
```

### 3. 動作確認
以下のコマンドでLintが実行できることを確認します。

```bash
$ npm run eslint path/to/file.js
```

**出力結果**

```
> @1.0.0 eslint /xxx/xxx
> eslint "file.js"
```

## Cricle CIの設定
Circle CIとGitの連携は設定済みとします。

### 1. 設定ファイルを書く
`.circleci/config.yml`を作成し、設定を記載します。

```.circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: circleci/node:7.10

    steps:
      - checkout

      # Linter含むパッケージをインストールする
      - run: npm install

      # 差分のあるjsファイルのみLintを実行する
      - run: 
          name: js lint
          command: git diff --name-only --diff-filter=ACMR origin/develop..origin/${CIRCLE_BRANCH} -- '*.js' | xargs -r npm run eslint
```

### 2. 動作確認
適当な`xxx.js`を作成し、コミットしたのちにリモートにプッシュします。
ターミナルでも以下のコマンドを打ち、差分ファイルのみ表示されることを確認します。

```bash
git diff --name-only --diff-filter=ACMR origin/develop..origin/${CIRCLE_BRANCH} -- '*.js'
```

**出力結果**

```
Exit code: 0
#!/bin/bash -eo pipefail
git diff --name-only --diff-filter=ACMR origin/develop..origin/${CIRCLE_BRANCH} -- '*.js' | xargs -r npm run eslint
> @1.0.0 eslint /xxx/xxx
> eslint "xxx.js"
```

最後に、[Circle CI](https://circleci.com/)の画面でプロジェクトのジョブを確認し、Successと表示されれば成功です。

### コマンドの説明
`.circleci/config.yml`の最後のコマンドについて解説します。

```bash
git diff --name-only --diff-filter=ACMR origin/develop..origin/${CIRCLE_BRANCH} -- '*.js' | xargs -r npm run eslint
```

`git diff BRANCH1..BRANCH2`：ブランチ同士の差分を取ります。
`--name-only`：ファイル名のみを取得します。
`--diff-filter=ACMR`：A(追加)/C(コピー)/M(変更)/R(名前変更)の操作があったファイルのみを取得します。
`-- '*.js'`：対象ファイルであるjsファイルのみを取得します。
`${CIRCLE_BRANCH}`：現在の作業ブランチを取得します。
`xargs`：前のコマンドの結果を引数として後ろのコマンドに渡します。
` -r `：引数に何も結果がない場合にスキップします。(Linuxのみ)

以上です！

## 参考
[ESLint をグローバルにインストールせずに使う - Qiita](https://qiita.com/mysticatea/items/6bd56ff691d3a1577321)
[CircleCI2入門③ CirlceCI上でLintを実施する | Yuuの悠々自適Blog](http://yuu.1000quu.com/circleci2_introduction_3)
[ピクシブ百科事典に静的解析のCIを導入した話 - pixiv inside](https://inside.pixiv.blog/mdan/7037)

## 最後に
~~次回はPHPの設定の記事を書く予定です。~~ 書きました。
[[PHP]Circle CIで変更箇所のファイルのみを静的解析(Lint)する② - Qiita](https://qiita.com/mgmgOmO/items/183cb39cc54141df8724)
記事に間違いや不明な点があれば遠慮なくご指摘ください。
ABC129復習

A-AirPlane
https://atcoder.jp/contests/abc129/tasks/abc129_a
(方針)![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437175/1043ecd1-21cf-6207-9070-09ddb81e5b11.png)

A,B,Cそれぞれの空港から出発するとかかる時間はp+q,q+r,r+pとなるのでこの3つのうちの最小値を出力する。

```airplane.py
p,q,r=map(int,input().split(" "))
a=p+q
b=q+r
c=r+p
l=[a,b,c]
l.sort()
print(l[0])
```
B-Balance
https://atcoder.jp/contests/abc129/tasks/abc129_b
(方針)n最大100なので全部のパターンを試していけばよい。

```b.py
def sum(l):
    a=0
    for i in range(len(l)):
        a+=l[i]
    return a
n=int(input())
result=[]
w=(input()).split(" ")
w=[int(k) for k in w]
for i in range(1,n,1):#n-1回ループ
    wa=abs(sum(w[i:])-sum(w[:i]))
    result.append(wa)
print(min(result))
```

C-Typical Stairs
https://atcoder.jp/contests/abc129/tasks/abc129_c
(方針)https://youtu.be/L8grWxBlIZ4?t=2551
初めてのdp(動的計画法)。数列漸化式みたいなもん 
DAGの説明も読もうhttps://youtu.be/L8grWxBlIZ4?t=3759

```c.py
n,m=map(int,input().split(" "))
l=[None for k in range(n+2)]
l[n]=1
l[n+1]=0
for i in range(m):
    l[int(input())]=0
for i in range(n-1,-1,-1):
    if l[i]==None:
        l[i]=l[i+1]+l[i+2]
print(l[0]%1000000007)
```

D-Lamp
https://atcoder.jp/contests/abc129/tasks/abc129_d
(方針)横と縦を分けて考える。計算量の関係からnumpyをつかう
実装できなかったので後日
まずはDまで解けるようにしたい

```d.py

```
PyCharmでのGitHubプロジェクトの取得

「ひとりまーじゃん」アプリをバージョンアップしたいなーと思ったのですが、
思いの外たくさんの人に見てもらえたので（感謝！）
今のバージョンはそのまま残しておきたいと思います。
なので、別プロジェクトを作ってそこで改良を加えようと思います。

僕は生まれたときからPycharmerなので、
PycharmでのGitHubプロジェクト取得方法を以下にメモっておきます。

#GitHubプロジェクトの取得

Pycharmを起動すると作業するプロジェクトを選ぶ画面が出てきます。
<img width="889" alt="スクリーンショット 2019-06-14 21.03.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/6599bafa-05ec-83ab-9bbb-65b72964e816.png">

いつもだとここで作業するプロジェクトを選んでいるのですが、
ここで「バージョン管理からチェック・アウト」→「Git」を選択します。
<img width="657" alt="スクリーンショット 2019-06-14 21.02.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/55d737ac-6c66-f659-6d22-e4fedc8a4aae.png">

URLに取得したいGitプロジェクトのURLを
ディレクトリーは、ローカルで管理したいディレクトリ名を
入力してクローンを押下。

<img width="774" alt="スクリーンショット 2019-06-15 1.08.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/76c2f4a2-0dab-206a-da9a-68df504af850.png">

「バージョン管理からチェックアウト」→「はい」

<img width="1552" alt="スクリーンショット 2019-06-15 1.11.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/77d797f3-f5bc-4e86-7294-7959517cd75f.png">

無事取得できましたー。

#GitHubプロジェクトとの連携削除

この状態だとGitHubと連携されている状態なので、
新しいプロジェクトにはまだなってません。

↓Gitと結びついている状態。
<img width="1440" alt="スクリーンショット 2019-06-15 1.13.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/ea37479d-3469-8197-6b5a-5418034dbf71.png">

なので、一旦Gitとの結びつきを消していきます。

###.gitディレクトリ削除
pycharm上で画面下部にある「ターミナル」を押すとターミナルウインドウが
出てきます。
このウインドウにでｌｓコマンドを打つと…
`ls -al`
<img width="1156" alt="スクリーンショット 2019-06-15 1.27.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/667cd2d0-6b9a-7389-a0b3-5059c74695dd.png">
.gitというディレクトリがあります。
こいつがGitとの結びつきを管理しているので消します。
`rm -rf .git`

<img width="1156" alt="スクリーンショット 2019-06-15 1.31.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/2e6b2c32-d834-be7f-c24c-ef0c098a1300.png">

消えましたー。
でもまだPycharmはGit管理されてると思いこんでいます。
<img width="1440" alt="スクリーンショット 2019-06-15 1.36.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/ed91ce8d-6b9e-06cb-300a-36dbf30925b9.png">
諦めが悪いですね。

###Git管理設定の削除
「Pycharm」→「環境設定」→「バージョン管理」と選んでいくと…。
<img width="1251" alt="スクリーンショット 2019-06-15 1.42.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/47873495-45aa-9999-f547-1307335a4db2.png">
バージョン管理の情報を見ることが出来ます。
プロジェクトのパスを赤字で出してるってことは、Pycharmもなにかおかしいって
思ってるんでしょうね。
なので、「-」ボタンを押して綺麗サッパリ忘れさせてあげます。
これで完全にGitとの連携を削除出来ました！
<img width="1440" alt="スクリーンショット 2019-06-15 1.47.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/85ba1b5b-2181-e267-3764-c9207c68a326.png">

これで後は好き放題出来ますね。
特に他人のプロジェクトを落としてくるとなんか壊しちゃうんじゃないかって
不安になりますが、Gitとの連携を切ってしまえば安心です！
（流石にプロジェクトを落としただけでGit上のプロジェクトが
壊れるってことはないでしょうが…。）

心機一転、Gitに新しいプロジェクトを作ってバージョンアップ進めていきますー。
参考）[PyCharmからGitHubへの連携](https://qiita.com/kph7mgb/items/3c2a000d1ddb2b1aa3e7)
SikuliX 1.1.4 インストール方法

#インストール方法イマイチわかりずらい問題

ワタシニホンジン、えいごよめなーい


#ダウンロード
##Java8を入れる
https://adoptopenjdk.net/
サポート期間はバージョン8が一番長いので以下の図のまま(基本的にデフォルトのまま)青いボタンを押します。
ダウンロードしたらこれまたデフォルトでYESマンのままでOK
条件　OpenJDK8,　Hotspot

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/6e626869-2ca4-2c26-6b9b-f22b3460f832.png)

##SikuliXをダウンロード
下図から
①Jythonインタプリタ(jython-standalone-2.7.1.jar)
②sikulix.jar
をダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/b73c669b-e142-fcb1-297b-08b4d032ee0e.png)

#SikuliXのインストール
##設置
任意のフォルダにダウンロードした2つのファイルを置きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/b8e79d9a-789a-8d71-ce26-e59a400d36c1.png)

##sikulix.jarをダブルクリックで起動
IDEが起動しました。あとはいろんな自動化をお楽しみください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/657f4941-7ee1-71a2-7594-59a8f59c0077.png)

##なおjython-standalone-2.7.1.jarは消える模様
成仏・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/42038310-7c2f-9623-3075-256ffca66941.png)
ではなく自動でユーザーの特定のフォルダにインストールされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/064d9f62-c9da-8df2-aa98-79a863548536.png)
おわり
VPNに接続するもののネットワークにつながらなかった意外な原因

## VPNは２回線あるのに誰かが接続しているとLANにつながらない

客先作業やリモートワークのためVPNで職場のLANに入れるようにしている。

* ルータはYAMAHAのRTシリーズ
* anorymous VPN で２個のトンネルを用意
* IPアドレスはDHCPで割り当てられる

朝・夜や週末は問題なくつながるのだが（いつ仕事してるんだか:sweat:）、平日昼はVPN(PPTP)には接続するものの、LANにはつながらないことがある。そのときは、たいてい誰かが接続中だ。

今日も朝は大丈夫だったのに、昼前につなごうとしたらまたダメになった。つながらないと困るので、ちゃんと調べようとルータの状態を調べることにした。

裏技で事務所のPCにリモートデスクトップ接続し、ルータのログを確認

確かに一人接続してしており、自分が接続しようとしたときはエラーになっていた。

ログをよーくみると、接続できた方にDHCPで割り当てたIPアドレスが書かれている。

```
192.168.XXX.8
```
ということは、２つ目の接続は

```
192.168.XXX.9
```
に違いない。

見えた！

職場と家のネットワークアドレスが同じで、家もDHCPでIPアドレスが割り当てられるのだが、それがいつも

```
192.168.XXX.9
```
なのだ。

家のルータのDHCPアドレスプールを職場と重複しないよう設定し直して、Wi-Fiを再接続

そして、職場のVPNに接続

つながった！

接続元と接続先のネットワークアドレスが同じなのによくつながるよなと思っていたけれど、IPアドレスの割り当てがかち合うとはね。
serverlessのデプロイがCircleCIで落ちる

# エラー
こんな感じのエラーが出て落ちることがある。

```bash
Status: Downloaded newer image for lambci/lambda:build-python3.7
ERROR: Could not open requirements file: [Errno 2] No such file or directory: '/var/task/requirements.txt'
```

# 原因
プラグイン `serverless-python-requirements` の `dockerizePip` を利用すると起こることがある。

# 対策
CI環境ではビルドにLinuxのイメージを利用し `dockerizePip` を使わない。
CircleCIでは環境変数 `CI` に必ず `true` が入ることを利用して `dockerizePip` をfalseにします。([参考](https://circleci.com/docs/ja/2.0/env-vars/#%E5%AE%9A%E7%BE%A9%E6%B8%88%E3%81%BF%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0))
ローカルマシンでは環境変数 `CI` に `false` を設定しておく必要があります。

```yaml:serverless.yamlのcustom
custom:
  pythonRequirements:
    dockerizePip: ${self:custom.isCI.${env:CI}}
    layer: true
  isCI:
    true: false
    false: true
```

# 備考
- [Travis CI](https://docs.travis-ci.com/user/environment-variables/#default-environment-variables)でも `CI` には `true` が入る模様。いい文化ですね。
Nuxt.jsで動的な値を利用してリンクを作成する

## 環境
Nuxt.js 2.7.1

## フォルダ構成

```
pages/
--| users/
-----| _id.vue
-----| index.vue
```

## 実装
pathではなくnameを利用

```vue
<nuxt-link :to="{ name: 'users-id', params: { id: id } }">{{ userName }}</nuxt-link>
```

## ルーティングの確認
自動生成された動的ルーティングを確認したい場合は.nuxt/router.jsを確認

```router.js
    routes: [{
      path: "/users/:id",
      component: _ae4a17c4,
      name: "users-id"
    }]
```

## 参考
[ルーティング - Nuxt.js](https://ja.nuxtjs.org/guide/routing/)
nem2-sdkを使ってブラウザ上で暗号資産を送金する

今回はnem2-sdk.jsを利用してブラウザ上でトランザクションを生成してみましょう。

- 解説の流れ
    - sdkの読み込み
    - トランザクションの署名
    - ノードのステータス確認
    - トランザクションの結果確認


nem2-sdkを読み込み変数nemとして宣言します。

```html
<script src="https://s3-ap-northeast-1.amazonaws.com/xembook.net/nem2-sdk/nem2-sdk-0.14.1.js"></script>
<script>
const nem = require("/node_modules/nem2-sdk");
</script>
```


TransferTransactionクラスを生成します。

```js
const RECIPIENT = "SCA7ZS2B7DEEBGU3THSILYHCRUR32YYE55ZBLYA2";
const recipientAddress = nem.Address.createFromRawAddress(RECIPIENT);
const transferTransaction = nem.TransferTransaction.create(
	nem.Deadline.create(),
	recipientAddress,
	[nem.NetworkCurrencyMosaic.createRelative(0)],
	nem.PlainMessage.create('From XEMBook'),
	nem.NetworkType.MIJIN_TEST);
```

締め切り、宛先、モザイクの種類と量、メッセージ、使用するネットワーク

次に、送信者の秘密鍵で署名します。

```js
const privateKey = PRIKEY; 
const account = nem.Account.createFromPrivateKey(privateKey,nem.NetworkType.MIJIN_TEST);
const signedTransaction = account.sign(transferTransaction,GENERATION_HASH );
```

ネットワーク上にアナウンスし、結果をサブスクライブします。

```js

const NODE = 'https://jp5.nemesis.land:3001';
const GENERATION_HASH = "17FA4747F5014B50413CCF968749604D728D7065DC504291EEE556899A534CBB";
 
const transactionHttp = new nem.TransactionHttp(NODE);

	transactionHttp
	    .announce(signedTransaction)
	    .subscribe(x =>{ 
			console.log(x);
		}, 
		err => console.error(err)
		);
	});
```

サブスクライブの結果をコンソール出力すると以下のようなレスポンスが確認できます。

```
{message: "packet 9 was pushed to the network via /transaction"}
```

これには大した内容は含まれていません。ノードに届いたと認識することしかできません。
ここから、トランザクションが正常なフォーマットだったか、無事にチェーンに取り込まれたかを確認する必要があります。

トランザクションが正常なフォーマットだった場合、

http://NODE_IP:3000/transaction/{hash}/status

にアクセスすることで、状態がわかります。{hash} は signedTransaction.hash で取得できます。このような表記になっているはずです。

```json
{
  "group":"unconfirmed",
  "status":"Success","hash":"0C72C6562E75169429A608F4B395ABD617416E1A6A6F6AB798E0A79D9BCE61A1",
  "deadline":"111841344358",
  "height":"0"
}
```
group がunconfirmedになっています。数十秒も待たずにconfirmedになるはずです。

status が　Successとなっていれば正常なフォーマットだったと考えて間違いありません。手数料不足などの場合はエラーメッセージが表示されています。不正なフォーマットだった場合は以下のような表記になります。

```json
{"code":"ResourceNotFound","message":"no resource exists with id hash"}
```

groupがconfirmedになれば以下のURLでトランザクションの詳細を確認することができます。

http://NODE_IP:3000/transaction/{hash}

```
{
"meta":{
 "height":"48133",
 "hash":"0C72C6562E75169429A608F4B395ABD617416E1A6A6F6AB798E0A79D9BCE61A1",
 "merkleComponentHash":"0C72C6562E75169429A608F4B395ABD617416E1A6A6F6AB798E0A79D9BCE61A1",
 "index":0,
 "id":"5DA82E31998ACC38025B186D"
},
"transaction":{
 "signature":
 "9947FB3261B430F319FDB6ED25B6222016B3ED0C1CB5CDBAA0E3E680E5E9CB48792555DBB6968AD88CA08DE0A8BCB25BB8709869B5D8C1B8A8DE91371CA7FC0F",
  "signerPublicKey":"AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26",
  "version":36865,
  "type":16724,
  "maxFee":"100000",
  "deadline":"111841344358",
  "recipientAddress":"90758EB47C28D6143BAA3DE6A8D9C319B503A1BFD8E789E9E2",
  "message":{
    "type":0,
    "payload":"48656C6C6F204E656D3221"
  },
  "mosaics":[
    {"id":"D525AD41D95FCF29","amount":"0"}
  ]
}
}

```
Windows で Docker環境をつくる

## はじめに
WSL2とかWindowsTerminalが来るともう少し
使いやすくなりそうなのですがもう少し先なので
備忘録がてら投稿(重要な点のみ記載してます)

## 環境

本記事は以下の環境等を使用しております。

| 環境 | Version |
|:-----|:--------|
| Windows | 10(64bit) |

## 前準備 
[Hyper-V環境であること](https://qiita.com/osugizmo/items/cac4b3170f42edd39dcb)

## Docker for Windows をインストール
[download.docker.com](https://docs.docker.com/docker-for-windows/install/#install-docker-desktop-for-windows-desktop-app)からダウンロード、インストール、起動

## Docker起動時のトラブルシューティング
|一度サインアウトする|
|:---|
|![2966FA85-9763-4A66-91EF-79CE61E98A3B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269640/b2551c99-dfa5-6743-0879-a08a723b4eac.png)
|

|docker-usersグループにユーザーを追加してサインアウト|
|:---|
|![902F39E0-2CD4-4C1A-A808-F93055A112BA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269640/4b0966c1-5d55-ba28-bede-340004a6a33c.png)
|

## 起動イメージの場所を変更(必要であれば)
タスクトレイのDockerアイコンを右クリック、Settingを押下
以下画面のDisk image locationを変更後、再起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269640/7cdb34bd-efb4-550e-58ab-51f07fcc1bd8.png)



## 最後に
正常に起動ができたらコマンドプロンプトやPowerShellなどで
以下を実行してバージョン表示されれば成功

```shell:terminal
docker —-version
```
```shell:terminal
docker-compose —-version
```
CircleCIでpythonとnode.jsを同時に使いたい

# 結論

両方入ったイメージを使う。
以下の例はpython3.7.1にnodeが含まれたイメージ。

```yaml
    docker:
      - image: circleci/python:3.7.1-node
```

# 利用できるイメージ一覧
- [このリスト](https://circleci.com/docs/2.0/docker-image-tags.json)に含まれていれば利用できる。

# 備考
CIの設定の中に、ごちゃごちゃといろいろ入れる記述をするのはスマートではないのでなるべく避けたい。
[JS]アロー関数の「v」の正体が、かなり地味に判明した件

#今回のコード
```javascript
const a = v => console.log(1);
a(); // => 1
```

# アローじゃない形にすると
```javascript
const a = function(v){
	return console.log(1);	
}
a(); // => 1
```
↑元々はこういう形だったのが…

```javascript
const a = function(v){return console.log(1);}
a(); // => 1
```
↑改行がなくなって…

```javascript
const a = (v) => {return console.log(1);}
a(); // => 1
```
↑「function」もなくなって…

```javascript
const a = (v) => console.log(1)
a(); // => 1
```
↑「{」と「return」と「;」と「}」さえもなくなって…

```javascript
const a = v => console.log(1)
a(); // => 1
```
↑ついでにvについていた「(」と「)」もなくなって…完成！（もう、原型ない）

# 「v」を探してもどこにもない
突然現れた「v」がどこから現れたのか？
僕は、1人で探し続けていましたが、どこにもあるはずありませんでした。

それもそのはず。
「v」は、この1行の中で便宜上定義されたもので、この1行以外ではスコープ外となってしまい、そもそも使えないです。
ヤバい、1週間経過してる（汗

# 最後のポストは先週金曜日だ！（汗
- お仕事でショックな事があったり、出張だったり、朝早かったりと色々あったので最後のポストは先週の金曜日になってしまった
- う〜ん、駄目ね毎日やらないと

# でもGithub Desktopはホント簡単
- 自宅のMBAでも簡単にクローン、プルが出来て今まで苦労が噓みたい
- 一先ずローカルにリモートリポ出来たので今日は一旦これで終わり。また明日
- GitなりGithubにうげっ〜と思っている方々、Github Desktopは便利で簡単なのでオススメです。楽な方法を選択してみましょう。楽って大切ですよ :heart: 

# 今日の気持ち
- 今週はホント色々あった。その中で思ったのはあくまでも自分の場合だけど、問題を作り出しているのは自分自身なんじゃないかなと思う
- 今まで読んだ本にも書いてあったけど、執着なり自分を苦しめるのは自分自身なんだと
- でもあまりにも自分自身が！って思うと疲れるので問題だ、嫌だと思った事どうしてそうなってしまったのかを記録しておこう。そして同じ事をしないようにする
npmでpackage-lock.jsonを使ってインストールする

# 結論

```bash
npm ci
```

# 環境
- npm: `6.9.0`
- node: `v12.4.0`


# メモ
- `npm i` だとlockファイルを更新してしまう。
- yarnを使いすぎてnpmの使い方が忘却の彼方に..
正規表現における\A と\zそして、「.*」の意味について

#1.正規表現とは？

文字列に特定の文字が含まれているかを確認することや、特定の文字を取り除くなどの操作を行うことをいう。

たとえば、ユーザーにフルネームを入力してもらう時、苗字と名前との間にスペースが入っていた場合に自動でそのスペースを取り除くこと。これにより、全体としての統一性を図ることが、正規表現の役割である。

#2.\A と\zの意味

\A と \z は、文字列の先頭と末尾を指定する場合に使用される。正規表現によるバリデーション等で、完全一致を示す目的で\A と\zが用いられる。この点、Rubyの場合、 ^ と $ を使って完全一致のバリデーションを行うが、この場合には、脆弱性が入りやすくなるため使用されることは少ない。そのため、文字列のバリデーションなどに正規表現を用いる場合は、\A と \zを文字列の先頭・末尾を示すメタ文字として使用する。

具体例などについては、以下の記事を参照。
https://qiita.com/jnchito/items/ea7832df6f64a9034872

#3.「.*」の意味
「.」は、任意の文字１文字という意味である。また、「ワイルドカード（*）」とは、直前の文字の0回以上の繰り返しを意味する。これは、あらゆる文字を表現する目的で使うことが多いらしい。

#4.おわりに
\A と\zの意味や.*」の意味について、調べてアウトプットしてみたがまだまだ理解が甘いので、引き続き調べて、随時更新していきます！

＜参考記事＞
2.\A と\zの意味と使い方について
・https://qiita.com/shunhikita/items/772b81a1cc066e67930e
・https://qiita.com/jnchito/items/ea7832df6f64a9034872
・https://blog.tokumaru.org/2014/03/z.html

3.「.*」の意味と使い方について
・http://www-creators.com/archives/3780
・http://gimite.net/help/devas-ja/all_regex.html
・http://www.mnet.ne.jp/~nakama/
Raspberry Pi3にHass.io(Home Assistant)セットアップ

## 前提条件

### Raspberry Pi3のセットアップ

→ [Raspberry Pi 環境構築](https://qiita.com/motojin1211/items/461461fe0e3088fadfc2)

## Hass.ioのコンテナー起動

### 関連パッケージインストール

```bash
$ sudo apt -y install jq apparmor-utils network-manager
```

### Hass.io起動

```bash
$ curl -sL https://raw.githubusercontent.com/home-assistant/hassio-installer/master/hassio_install.sh | sudo bash -s -- -m raspberrypi3
$ docker container ls
CONTAINER ID        IMAGE                                      COMMAND               CREATED             STATUS              PORTS               NAMES
d2e3d7a01363        homeassistant/raspberrypi3-homeassistant   "/usr/bin/entry.sh"   24 seconds ago      Up 22 seconds                           homeassistant
991a24eb488b        homeassistant/armhf-hassio-supervisor      "python3 -m hassio"   5 minutes ago       Up 37 seconds                           hassio_supervisor
```

## Hass.ioアクセス

`http://«your_RaspberryPi3_IP»:8123`

### (1/4)初期画面

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/d3f9ff23-ea09-ca67-e403-e995030c7e3d.png" width=30%>

### (2/4)アカウント登録画面

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/4aff6125-b409-5036-15c9-ceff9c80c730.png" width=50%>

### (3/4)ホーム名と位置設定画面

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/a1b1351e-9073-9efa-7780-5e545084bf7a.png" width=50%>

### (4/4)デバイス統合設定画面

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/37d8d48e-09b2-ef6a-c4d0-b4f7c56c9ee6.png" width=50%>
PHP では三項演算子をネストさせないようにした方が良い

## TL;DR

既出ネタ。PHP では三項演算子をネストさせないようにした方が良い。

## Ruby

```
$ ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
```

```rb:rb
a = true
b = true

puts a ? 'あ' : b ? 'い' : 'う' #=> あ
```

## Perl

```
$ perl -E'say$^V'
v5.18.4
```

```pl:pl
local $\ = "\n";

my $a = 1;
my $b = 1;

print $a ? 'あ' : $b ? 'い' : 'う'; #=> あ
```

## Node.js

```
$ node -v
v12.4.0
```

```js:js
let a = true;
let b = true;

console.log( a ? 'あ' : b ? 'い' : 'う' ); //=> あ
```

## Swift

```
$ swift --version
Apple Swift version 5.0.1 (swiftlang-1001.0.82.4 clang-1001.0.46.5)
Target: x86_64-apple-darwin18.6.0
```

```swift:swift
let a = true
let b = true

print( a ? "あ" : b ? "い" : "う" ) //=> あ
```

## PHP

```
$ php -v
PHP 7.1.23 (cli) (built: Feb 22 2019 22:19:32) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
```

[比較演算子](https://www.php.net/manual/ja/language.operators.comparison.php)
> 三項演算子を "積み重ねて" 使用することは避けましょう。 ひとつの文の中で複数の三項演算子を使用した際の PHP の振る舞いは、 少々わかりにくいものです。

```php:php
<?php
$a = true;
$b = true;

# ……🤔?
echo $a ? 'あ' : $b ? 'い' : 'う'; #=> い
echo PHP_EOL;


# 正しい(?)書き方
echo $a ? 'あ' : ( $b ? 'い' : 'う' ); #=> あ
echo PHP_EOL;
```

## おわり

おわりです

## 参考と注釈

* [PHPの三項演算子をネストした時の挙動がおかしい話](https://blog.sanojimaru.com/post/18643546415/phpの三項演算子をネストした時の挙動がおかしい話)
* [PHPで三項演算子を二重にするとどうなるか？ - Qiita](https://qiita.com/clown0082/items/ce0eb19cdda9379858ca)
3tenePro+Live2DでLive2Dモデルをインポートする方法

# 準備するもの
- 3tenePro+Live2D(有料、今回はWindows版を前提で書きます)
- Live2Dモデル
  - テクスチャアトラス
  - .moc3
  - .model3.json
  - .physics3.json

Live2Dモデル各ファイルのエクスポートについては省略します。
 
# インポート
1. 3teneProを起動して、左のメニューから「アバターを選択」を開く
![avater.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220801/fa7322b7-799c-dc8b-e804-0a83973d101e.png)

2. 「アバターの選択」画面が開かれるので＋マークのあるシルエットを選択
![select.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220801/b3204eae-6033-6ad4-e9cd-76dbf1c12d42.png)

3. ファイル選択が開くのでPathをコピーする
![file.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220801/bf885b9a-8dd7-fd87-b2d2-a2d511e1b091.png)

4. 2DmodelフォルダにLive2Dモデルの各ファイルを置く
標準だとおそらく`C:\Program Files\PLUSPLUS\3tenePro+Live2D\3tene_Data\StreamingAssets\2Dmodel`
この直下に置いてもいいのですが、モデルが増えてくるとファイルがごちゃごちゃするので`2Dmodel`の直下にアバターごとに`hoge`フォルダを作ってその中にLive2Dモデルの各ファイルを置く方がスッキリします。

5. 再度アバターの選択画面からファイル選択を開き、4.で置いた.model3.jsonを選択

6. おめでとう！　これでLive2Dアバターが読み込めたはずだ！