OmniAICreator/Qiita-1.07M huggingface dataset:
Vivaldiの設定

## 私のVivaldi設定

とりあえず備忘録として現時点(2018年8月)のVivaldi設定をさらす。

### 起動
![WS000010.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/e5179e2b-74c3-d871-569c-7005efdc5c4d.jpeg)

現時点でもVivaldiをメイン(既定)にしていない。動画関係がまだ不安定だ。paizaのサイトも開けるものと開けないものがあった。
あとはスピードダイアルこそが正義なのでそこは譲れない。

### 外観
![WS000011.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/b317fb7c-d72f-6f28-abed-f57ffeaaac96.jpeg)

ここは特にこだわりないためいじってない…はず。

### テーマ
![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/5268b3e0-b94c-a038-aac7-99d766488fa0.jpeg)

### スタートページ
![WS000013.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/10c6f59f-a3c1-1e43-b605-02307ff053e8.jpeg)

### タブ
![WS000014.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/61234503-d883-f79b-6140-d96854d36fe6.jpeg)

タブサムネイル表示は決して軽くないVivaldiにおいては、さらに動作を重くするだけだし何よりうざいのでチェックを外しておく。

### パネル
![WS000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/85b253c7-4e22-dae6-b831-46401170fdaf.jpeg)

### アドレスバー
![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/72884ec4-820b-6eef-5141-6d80ddbafa9f.jpeg)

「アドレスをエンコードしてコピー」はチェックがついていると何かと便利な場面が多い。
URLも完全に出したい派。

### ブックマーク
![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/27d8d349-b684-1b0d-1f2e-778fa9b3bddf.jpeg)

### クイックコマンド
![WS000018.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/9d0587a1-8759-b10d-daa5-9c46cde6a0c6.jpeg)

### キーボード
![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/263d4b42-f106-9b5a-f743-8d2800acd142.jpeg)

ウィンドウ、表示、タブ、ページのカテゴリごとにキー割り当てを行える。私は標準のまま。

### マウス
![WS000020.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/d4da8f13-c1f2-7485-a882-a277a12dfa15.jpeg)

マウスジェスチャーは正義。
スクショでは写せないので主要なマウスジェスチャーは以下のように設定している。

- 新しいタブ　：上から下
- タブを閉じる　：下から上（新しいタブとは逆の動き）
- 再読み込み　：下から上へいってまた下へ
- 読み込みの中止　：正方形を描く
- メモパネル　：左から右へいってまた左へ

### 検索
![WS000021.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/c51e616b-755e-cf1e-55f1-9033d450bb02.jpeg)

既定はなぜかBingなのでGoogleに変更。

### プライバシー
![WS000022.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/42d703c4-be58-27ee-bead-0890c9cd1591.jpeg)

Vivaldiの検索候補表示は若干うざかったのでオフにした。よく使うけれどあまり重要じゃないサイトはパスワードを保存してしまっている。

### 更新
![WS000023.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/e0b6f5e7-89a8-9698-6f0c-6ae15e77764f.jpeg)

最新が好きなもので…

### ダウンロード
![WS000024.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/d1a2e9fb-404d-fa78-0779-b6ce9390d3db.jpeg)

SSDを使用しているからという理由でWindows標準のダウンロードフォルダではなくて別場所に保存するように設定してるだけ。

###  ウェブページ
![WS000025.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/8a965cb1-74b6-5cd4-c32b-01687e6e9111.jpeg)

### 拡張
Chormeと同じレンダリングエンジンを使用していることもあって、Chormeの拡張機能もほぼ使える。
現在入れているのはこれ。
![WS000027.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/f6e636e9-33c6-6c69-ae0a-5795a258782f.jpeg)



## 最後に
私の場合いろいろ自分で拡張してカスタマイズするというのがそんなに好きじゃない。元々客先派遣で色々な現場にとばされる環境で仕事してきたので自分好みにカスタマイズしてもPJから離れるときはサヨナラなのだ。だから拡張機能など入れなくてもスピードダイアルやメモ機能、マウスジェスチャが標準で入っているOperaが好きだった。
そのOpera最強伝説も中国に買収され、ひとつの時代が終わったとガックリしていたところにOperaの生みの親、ヨン・スティーブンソン・フォン・テッツナー氏がVivaldiブラウザを発表してくれた。

Chormeの拡張機能のマウスジェスチャがもっさり不安定だったからよかった。
ぶっちゃけ私は**マウスジェスチャ**さえあればなんでもいい。
Scalaの制御構文を勉強した時のメモ

https://dwango.github.io/scala_text/control-syntax.html

を見て学習したことのメモ

## ```{}```式

{}式の一般形は

```
{ (<式>(;|<改行>))* }
```

### 例

```scala
{ println("A"); println("B"); 1 + 2 }
```

改行を入れればセミコロンを省略することができます。

```
{
println("A")
println(("B")
1 + 2
}
```

返り値は最後に評価された式になる。（この場合3）


## if式

```
if (条件式) {
  式
} else if (条件式) {
  式
} else {
  式
}
```

elseの部分は省略可能で、その場合に条件が一致しなかった時はUnit型の値が帰ってくる

> Unit型はJavaではvoidに相当するもので、返すべき値がないときに使われ、唯一の値()を持ちます。
https://dwango.github.io/scala_text/control-syntax.html

## while式

```scala
while (条件式) {
  式
}
```

または

```scala
do {
  式
} while(条件式)
```

条件式のところは```Boolean```型である必要がある。

## for式

```scala

for (ジェネレータ) {
  式
}
```

ジェネレータとは```変数名 <- exp```で書くことができる。
具体的には

```scala
for (x<- 1 to 5) {
  println(x)
}

=>
1
2
3
4
5
```

toとuntilがあり

```
1 to 5　(1,2,3,4,5)
1 until 5 (1,2,3,4)
```

```for ()```のなかでifを使うこともできて条件に合致するものだけを取り出すことができる。

### Listを使った処理

```for(e <- List("A", "B", "C", "D", "E")) println(e)```のように書くとListの中身一つ一つに対して処理することができる。

さらに```yield```を付け加えることで配列に変更を加えたものを得ることもできる。

```scala
for(e <- List(("A", "B", "C", "D", "E")) yield {
  "This is" + e
} 
```

## match式

複数の分岐を表現できる制御構造

```scala
val taro = "Taro"

taro match  {
  case "Taro" => "Male"
  case "Kenshi" | "Takeshi" => "Male" #処理をまとめる
  case "Nanami" => "Female"
  case "Haruki" if 条件式 => "Female"
  case _ => "Other"  #何にもマッチしなかった時
}
```

のように書くことができる。

### パターンマッチによる値の取り出し

```scala
val list = List("A", "B", "C")

list match {
  case List("A", b, c) =>
    #listの最初が"A"の時の処理、b,cにはlistの同じ位置にある値が格納されている。
  case _ =>
     println("nothing")
}
```
シェルスクリプトで簡単 Amazon Dash Button ハック

「子供のオムツを替えたタイミングを記録する」ために Amazon Dash Button を使って「うんちダッシュボダン」を作ったので、その作り方について。

![](https://qiita-image-store.s3.amazonaws.com/0/16369/8afd0689-f57e-9ed1-78b0-3289118625e7.gif)

## 汎用ボタンとしての Amazon Dash Button
Amazon Dash Button は、ボタンを押すだけで Amazon で商品が注文されるというアレだが、ちょっしたハックをすることで汎用ボタンとして使うことが出来る。

**家の中のどこにでも置いておける汎用ボタン**、これは驚異的に便利。

同じものを自分で作ろうとすると、電源はどう取るとかネットワークにどう繋ぐとか配線を考えないとぐちゃぐちゃになるとかして非常に面倒くさい。

これがたったの 500 円で買えるのだから Amazon は神。

もちろんそのままボタンを押すだけでは普通に商品が注文されてしまうので、ボダン押下を検出しつつ注文が飛ばないようにハックする。

[maddox/dasher](https://github.com/maddox/dasher) や [Nekmo/amazon-dash](https://github.com/Nekmo/amazon-dash) といったツールも存在するが、ハックの仕組み自体が単純なので `tcpdump` コマンドさえ使えればシェルスクリプトだけでも実現できる。

以下、Amazon Dash Button ハックの仕組みと、ラズパイで動かした際のスクリプトについて解説する。

## Amazon Dash Button の押下を検出できる仕組み

0. Dash Button は通常は電源がオフになっていて、ボタンを押したときだけ電源が入る
0. ボタンが押された (電源が入った) タイミングで DHCP で IP アドレスを取得しにいく
0. DHCP で IP アドレスが割り当てられる際に、ネットワーク全体に ARP パケットが Broadcast される [^dhcp_arp]
0. この ARP パケットを拾うことで、Dash Button が押されたことを検出できる
0. Dash Button は IP アドレスが割り当てられたあと Amazon のサーバと通信して商品を注文しようとする
0. あらかじめ Dash Button の初期設定を途中でキャンセルしておくことで注文が失敗する
    - 初期設定を途中でキャンセルする詳しい方法はググって欲しい

[^dhcp_arp]: DHCP では、割り当てた IP アドレスが同じネットワーク内で重複していないか確認するために ARP パケットを飛ばす

## 環境
今回は以下のような環境で動かした。

- Raspberry Pi 3B
- Raspbian
- `tcpdump` をインストール済み
    - `apt install tcpdump` で入る
- `awscli` をインストール済み 
    - (今回はボタンを押したら AWS Lambda が実行されるようにしたいので)
    - `aws configure` で認証情報を設定済み

ラズパイでなくても、自宅のネットワークに接続されていて `tcpdump` が使えるマシンならなんでもよい。

## スクリプト
``` bash:/home/pi/amazon-dash.sh
#!/bin/bash -eu

while true
do
  MAC_ADDR=$(sudo tcpdump -c 1 -e arp 2>/dev/null | awk '{print toupper($2)}')
  case $MAC_ADDR in

    # 以下は検出したい Dash Button の MAC アドレスに書き換える
    # MAC アドレスは tcpdump -e arp で調べる
    34:D2:70:AA:BB:CC)
      # 以下、ボタン押下時に実行したいスクリプト
      echo "Amazon Dash Button (${MAC_ADDR}) is pressed!"
      aws lambda invoke /dev/null --function-name myfunction > /dev/null &
      ;;

  esac
done
```

`case` の中身を増やせば複数の Dash Button の検出にも対応できる。

このスクリプトを実行中に Dash Button を押せば、記述したスクリプトが実行される。この場合だと、`myfunction` という名前の AWS Lambda Function が実行される。

スクリプトの実行に時間がかかる場合は `&` を指定してバックグラウンドで実行するなどしないと、連続してボタンが押された場合に検出できないことがあるので注意が必要。

## 自動起動させる
ラズパイ起動時に上記スクリプトが自動で起動するように Systemd の設定をしておく。

``` :/etc/systemd/system/amazon-dash.service
[Unit]
Description=amazon-dash

[Service]
User=pi
ExecStart=/home/pi/amazon-dash.sh

[Install]
WantedBy=multi-user.target
```

このような設定ファイルを配置して

``` console
$ sudo systemctl enable amazon-dash
```

これで完了。

## 動かした様子
![](https://qiita-image-store.s3.amazonaws.com/0/16369/8afd0689-f57e-9ed1-78b0-3289118625e7.gif)
【Rails】通知の時間を「○日前」「○分前」のよう表示する便利メソッドを見つけた

# 通知機能を作成したものの…
RailsでQiitaのようなアプリを作成して、通知機能を作成した。
ちなみに参考にした記事はこちら。めっちゃわかりやすい。
https://rails-school.net/rails-notification/

ただ、何もしないと、

![スクリーンショット 2018-08-04 19.20.12.png](https://qiita-image-store.s3.amazonaws.com/0/209138/2372f23f-d33e-febf-0a04-7d82bf63bc95.png)


こんな感じになってしまう。なんというか、しっくりこない！
これはNotificationモデルの`created_at`を列挙しているだけなので、機械的に時間を列挙している。


# いい感じの「○日前」「○分前」を検討した。
## もっと通知っぽくしたい！
そこで、ツイッターの通知みたいないい感じの「○日前」「○分前」を検討した。


|条件|表示例|    
|:-----------------:|:------------------:|
|60分以内|"10分前"|  
|24時間以内|"5時間前"|
|30日以内|"14日前"|
|それ以前|created_atそのまま|

これならばいい感じに通知っぽくなるのではないか！
こんな感じの時間表示をしてくれるメソッドやgemを探したけれど特に見つからなかったので自分で作ることにした。

それがこちら

```ruby:notification.rb
def how_long_ago
  if (Time.now - self.created_at) <= 60 * 60
    # 60分以内なら
    ((Time.now - self.created_at) / 60).to_i.to_s + "分前"
  elsif (Time.now - self.created_at) <= 60 * 60 * 24
    # 24時間以内なら
    ((Time.now - self.created_at) / 3600).to_i.to_s + "時間前"
  elsif (Date.today - self.created_at.to_date) <= 30
    # 30日以内なら
    (Date.today - self.created_at.to_date).to_i.to_s + "日前"
  else
    #　それ以降
    self.created_at
  end
end
```

注意すべきところは二つ
・途中まではDateTime型での引き算になるが、途中からは`to_date`メソッドを使ってDate型に変換しないと「○日前」が実際の日付とずれてしまう
・引き算の結果を`to_i`で整数に変換して`to_s`で文字列に変換して、文字列を連結させる。

#　結果
`notification.created_at`を`notification.how_long_ago`に変えてみると、

![スクリーンショット 2018-08-04 19.19.12.png](https://qiita-image-store.s3.amazonaws.com/0/209138/7218ed5d-e0dc-3a8e-4908-f272e7672a54.png)

いい感じに通知っぽくなった！


# 追記
`time_ago_in_words`という完璧な方法がありました…とほほ
新人エンジニアの時に知っておきたかったこと[情報管理編]

## はじめに
この記事は[新人エンジニアの時に知っておきたかったこと](https://qiita.com/hirokisan/items/cd45d3f6e5fa688235fc)に含まれます。
他の記事は上記のリンクから遷移可能です。あわせてご覧ください。

## 情報管理
エンジニアとして技術を磨くにあたり、情報管理は重要な習慣となります。
仕事やプライベートで収集した情報の中で今後も参照したい情報は少なからずあるものです。
そういった情報に素早くアクセスするための情報管理を身につけておくことは、エンジニアとして効率よくスキルアップする上で大切な習慣のはずです。
そこで、この記事では私が実践している情報管理の1つの方法をご共有します。

### 対象者
この記事の対象者としては、新人エンジニアの方々を想定しています。
特に、ターミナルアプリを常用する方が対象です。
情報検索の際にGrepを多用することが主な理由です。
もしGrepを使用せずにディレクトリ内の文字列検索が可能であれば、
ターミナルアプリを常用しない方であってもこの記事でご共有する情報管理方法をご利用いただけるはずです。

### 目標
この記事で扱う情報管理法は以下の目標達成を目指します。

- [情報の保管]　各技術やツールの使い方、便利なスニペットを保管する
- [情報の検索]　ストックした情報の中から欲しい情報を取得する
- [情報へのアクセス]　PCだけではなく、スマホからもストックした情報にアクセスできるようにする
- [バージョン管理]　必要に応じてストックした情報をバージョン管理する

### 使用するツール
#### ターミナルアプリ（[iTerm](https://www.iterm2.com/)など）
保管している情報を検索（Grep）する際に使用します。
Gitを用いてソース（情報）管理する際にも使用します。

#### エディタ（[Vim](https://www.vim.org/)など）
情報を追加・修正する際に使用します。
Vimや[Atom](https://atom.io/), [Visual Studio Code](https://code.visualstudio.com/)などあります。

#### モバイルアプリ（[Byword](https://bywordapp.com/)など）
外出時など、手元にPCがない場合に管理している情報にアクセスするために使用します。
また、markdown形式で情報を編集することも可能です。

#### バージョン管理（[Git](https://git-scm.com/)など）
バージョン管理は必須ではありませんが、いつ・どんな情報を追加したのかや変更履歴を知りたい場合に重宝します。

#### クラウドストレージ（[Dropbox](https://www.dropbox.com/ja/), iCloud等）
クラウドストレージに情報を保管することで、デバイスに依存することなくどこからでも情報にアクセスできるようになります。
ローカルのPCやスマホが壊れたとしても、クラウドストレージに保管した情報に影響は出ません。
PCとスマホで同じクラウドストレージ上の情報を参照・編集可能なので情報を一元的に管理可能です。

### サンプルソース
このサンプルコードは使い方を理解するためのものです。
実施に運用するにあたっては、各自のディレクトリ構成、ファイル構成で運用してみてください。

[hirokisan/InfoManage](https://github.com/hirokisan/InfoManage)

こちらからサンプルソースを取得可能です。
<img width="802" alt="スクリーンショット 2018-07-23 22.54.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/97975/de9b0f18-d4f2-5024-776e-19b8b70bfc11.png">

#### Info.md
良さげなソースURLをタイトルとともに蓄積していきます。

#### Snippets.md
良さげなコードや使い方を蓄積していきます。

#### Memo.md
情報収集の際に気になったことや、メモしておきたいことを蓄積していきます。

#### Account.md
アカウント情報管理に使用します。
セキュリティに問題があるかもしれませんが、非公開リポジトリで管理する分には問題ないかなという感じです。

#### Task.md
タスク情報を管理するために使用します。

### 初期設定
#### ~/Dropbox/以下にサンプルソースをcloneします。

```
git clone https://github.com/hirokisan/InfoManage.git ~/Dropbox/
```

#### BywordでDropboxと連携する
スマホから情報にアクセスしないのであれば、必要ありません。
<img src="https://qiita-image-store.s3.amazonaws.com/0/97975/e7c21a86-cc92-4135-bd2d-d2e1476c89e1.jpeg" width="40%">

### 使い方
#### 情報を追加する
![2018-07-24 21_52_27.gif](https://qiita-image-store.s3.amazonaws.com/0/97975/4317e291-8f83-195d-fabd-d35b743523d1.gif)

#### 情報を検索する
Grepで検索して該当する情報にアクセスします。
![2018-07-23 23_11_18.gif](https://qiita-image-store.s3.amazonaws.com/0/97975/94a69be0-a65c-880b-aa6f-795976ccaa7e.gif)

[unite.vim](https://github.com/Shougo/unite.vim)を使うとファイル検索が快適になります。
![2018-07-24 21_57_27.gif](https://qiita-image-store.s3.amazonaws.com/0/97975/62a2368b-6ea1-2c54-0ee9-bede46df34fa.gif)

### まとめ
この記事では情報管理の1つの方法をご共有しました。私はこの方法を数年続けています。
情報収集の際に良さげな情報やソースリンクを蓄積していくことで、困った時に「あ、前にもこんなことあったなぁ」という薄っすらとした記憶を頼りに検索(Grep)してみると解決策にたどり着けたりします。
自分自身、情報管理をどうしようかと試行錯誤の末、今のところはこの方法に落ち着いています。

これは1つの方法ですので、みなさんもご自身に合った情報管理法を見つけてみてください。
git push heroku master 実行後に no such app as...etc

##git push heroku master実行後にエラー
以下がエラーコード

```
!  No such app as アプリ名
 !  
 !  SSH Key Fingerprint: 鍵

fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

原因はアプリの名前を変更した為に起こったもので、なら元の名前に変えればいいのではないかとなりますが、heroku上にdeployしたアプリ名と整合性が取れない？為に失敗

```
heroku rename 新しいアプリ名
```

##解決コード

```
git remote rm heroku
heroku git:remote -a newname #newname部分はrenameした名前
```
公式サイトより拾ったコードで無事、アプリ名を変更した際にpushできなくなる問題は解決。

参考サイト

[Heroku push app problem](https://stackoverflow.com/questions/6447081/heroku-push-app-problem)
[Updating Git remotes](https://devcenter.heroku.com/articles/renaming-apps#updating-git-remotes)
Python(ちょっと)経験者がProgateのPythonコースを全受講して、基礎知識を復習してみた

#概要
https://prog-8.com/languages/python

Progateというプログラミング学習サービスがあります。
入門者向けですが、初学者が基礎を押さえる上で非常に役に立ち、多くの人に活用されているようです。
このサービスは様々な言語を対象としていますが、今回はPythonのお話です。

具体的には、

**入門者は超えたはずだが、まだまだ知識は不十分と感じている状態で、自分が分かっている/いない部分を把握する手段**

としてProgateを使ってみました。本記事はその記録です。

#スキルレベルの現状
私は現在、業務でPythonを使っています。
少し掘り下げたプロファイリングとしては、

学生時代

- 大学の専攻は機械工学
- 授業ではCを少し扱った程度
- 研究室では実験結果の評価手段として、MatlabやSPSSで統計を扱ったことがある

社会人

- 現在入社3年目
- Pythonは入社してから勉強し始めた
- 実際はPythonを扱って1年半程度 
- Pythonを用いた実装でいくつかのプロジェクトを担当している
- 深層学習ライブラリも少々

といったところです。

基本的に独学で、まとまった時間を取って勉強して習得したというよりは、業務を進める上で必要なところを調べ、勉強し、取り組んでいるうちにある程度身についた、という実感です。

「ある程度身についた」とは言ったものの、実践を積み上げていく上での基礎は本当に身についているのでしょうか？それを確認するのが今回の目的です。

#Progate Pythonコースの構成(2018.08.01時点)

- I 基本
- Ⅱ 繰り返し処理
- Ⅲ 関数・モジュール
- Ⅳ クラス
- Ⅴ  継承

#受講前の知識レベル 自己評価
事前に必要/不必要は判断せず、全コースを受講してみます。

理解している↓

- I 基本
- Ⅱ 繰り返し処理
- Ⅲ 関数・モジュール

使ったことはあるが、知識としては怪しい↓

- Ⅳ クラス
- Ⅴ  継承

#結論
不安を感じていない内容のコースは受けなくても大丈夫。
自信のないコースを使って知識を整理するのは、なかなか良い助けになる。

#受講後の感想
有料サービスであるため、あまり具体的に書き残すのはよろしくありません。
そこで、新たな気付きがあったか？という観点で感想を書きます。

###I 基本
きわめて基礎。Pythonを扱ったことがある人なら、やる必要なし。

###Ⅱ 繰り返し処理
同上。
ただ、辞書型変数の繰り返し処理では一つ新たな気付きがあった。

###Ⅲ 関数・モジュール
同上。

###Ⅳ クラス
このあたりから不安があった。
記法に新たな気付きはなかったが、概念を整理するのに助かった。

###Ⅴ 継承
良い学びになった。
個人的には特に、メソッドのオーバーライドとsuper()による親クラスの呼び出しが勉強になった。

#最後に
プログラミング勉強のためのプラットフォーム、便利ですよね。

プラットフォームというほどではないですが、コースⅢの関数までは分かっている人で、「〇〇を入力として✕✕のような出力を出す関数を書け」という練習を量こなしたい人には、[Coding Bat Python](http://codingbat.com/python)というサイトがおすすめです。
Rails consoleで日本語入力ができるようにする

# Rails consoleでは日本語入力ができない
例えばRailsアプリケーションで、新しいユーザーとして「織田信長」を開発環境で作成したいとする

```
$ rails c
irb(main):001:0> User.new(name: "織田信長")
irb(main):002:0> User.save
```

これで作成できるだろうと思ったのだが、何もしていないと`rails c`では日本語が文字化けしてしまい、日本語入力ができない。

# 調べてみた
いろんな記事を見てみたのだが、結局はrubyが`readline`を参照してくれれば、ちゃんと日本語を認識してくれるらしい。

参考記事：
https://qiita.com/irohiroki/items/c82657b5cb4bdb2aaac4

こちらの記事を参考に直そうと思ったのだが、思ったより簡単にできてしまったのでご紹介しようと思う。


# 実際の手順
## Rubyをアンインストール
自分のrubyのversionを調べてアンインストールしましょう。

```
$ ruby -v                                                                                   
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin17]
$ rbenv uninstall 2.4.1   
```

## readlineのインストール
homebrewを使っている場合

```
$ brew install readline
```

## rubyの再インストール
```
$ rbenv install 2.4.1
```

## gemを入れる
一度rubyをアンインストールしてしまったのでgemももう一度入れ直す必要があります。

```
$ gem install bundler
$ bundle install
```

## 実はこれで終わり！
改めて`rails c`したら日本語をしっかり認識してくれた！
readlineをインストールしてからrubyを入れ直すと、自動的にreadlineを参照してくれるのかも？
参照しているパスなどを変更する必要もなかった。
（これで動かなかった人はターミナル再起動を試してみてください）


# 確認方法
今回インストールしたreadlineを参照している元は`readline.bundle`とかいうやつ。
こいつがreadlineを参照してくれていれば、無事readlineに切り替わっているということになる。

まずは、readline.bundleの場所を調べる

```
$ find ~/.rbenv/versions -name readline.bundle
/Users/kouch/.rbenv/versions/2.4.1/lib/ruby/2.4.0/x86_64-darwin17/readline.bundle
/Users/kouch/.rbenv/versions/2.4.3/lib/ruby/2.4.0/x86_64-darwin17/readline.bundle
```

今回は2.4.1の方を確認したい。
`otool -L`というコマンドを使うと、そのファイルが参照しているライブラリの一覧を見せてくれる。

```
$ otool -L /Users/kouch/.rbenv/versions/2.4.3/lib/ruby/2.4.0/x86_64-darwin17/readline.bundle 
/Users/kouch/.rbenv/versions/2.4.3/lib/ruby/2.4.0/x86_64-darwin17/readline.bundle:
	/usr/local/opt/readline/lib/libreadline.7.dylib (compatibility version 7.0.0, current version 7.0.0)
	/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)
	/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
```

上記のように、ここでreadlineが出てくれればOK

# 最後に
`rails c`やirbで日本語が使えないと何かと不便なので、早めに対応させておきたいですね。
[Azure] Azure Container Instance(ACI)でMySQL/MariaDBを使うときはmysql:5.6を使え

**【追記】**

「Azure Container Instance(ACI)ではMySQL/MariaDBが実質使えない!?かも!?」
というタイトルで記事を公開しました。
もう少し試したところ、mysql:5.6イメージであれば動きました。


# TL;DR;

* Azure Container Instance(ACI)は、Azure StorageのFile共有をボリュームマウントできる
* File共有はCIFS(SMBマウント)なので、MySQL/MariaDBからのファイル操作要求に応えられない部分がある
* 要求に応えられないので、MySQL/MariaDBが動かない
* MySQL/MariaDBを動かすためには、ボリュームマウントを諦めなくてはいけない

つまり、ACIではMySQL/MariaDBのデータを永続化できない。



# 試したこと

## Storageアカウントのバージョン

汎用(v1)、汎用(v2)どちらもダメでした。
冗長はLRSです。

## Dockerイメージ

official mariadb、official mysql、bitnami mariadb、bitnami mysqlのいずれもダメでした。

**【追記】**

official mysql 5.6なら動くかもしれません。



# （おまけ） ACIの作成

作成するときは、あらかじめyamlファイルを用意してazure cliに食わせます。

ACIは[ポータル](https://portal.azure.com/)からも作成できますが、azure cliからでないとグループを作成できないです。


これはmariadbとredmineをデプロイするyamlファイルです。内容的にはdocker composeみたいなものです。

```yaml:aci-deploy.yaml
apiVersion: 2018-06-01
location: westus2
name: redmine
properties:
  volumes:
  - name: dbshare
    azurefile:
      shareName: dbshare
      readOnly: false
      storageAccountName: mystore
      storageAccountKey: ***************************************
  - name: redmineshare
    azureFile:
      shareName: redmineshare
      readOnly: false
      storageAccountName: mystore
      storageAccountKey: ***************************************
  containers:
  - name: mariadb
    properties:
      image: mariadb
      resources:
        requests:
          cpu: 1
          memoryInGb: 1
      ports:
      - port: 3306
      environmentVariables:
      - name: MYSQL_ROOT_PASSWORD
        secureValue: password123
      - name: MYSQL_DATABASE
        value: redmine
      volumeMounts:
      - name: dbshare
        mountPath: /var/lib/mysql
  - name: redmine
    properties:
      image: redmine
      resources:
        requests:
          cpu: 1
          memoryInGb: 1
      ports:
      - port: 80
      - port: 443
      environmentVariables:
      - name: REDMINE_DB_MYSQL
        value: localhost
      - name: REDMINE_DB_USERNAME
        secureValue: root
      - name: REDMINE_DB_PASSWORD
        secureValue: password123
      volumeMounts:
      - name: redmineshare
        mountPath: /usr/src/redmine/files
  osType: Linux
  ipAddress:
    type: Public
    ports:
    - protocol: tcp
      port: '80'
    - protocol: tcp
      port: '443'
    dnsNameLabel: my-redmine
  restartPolicy: Never
tags: null
type: Microsoft.ContainerInstance/containerGroups
```

次のように`az`コマンドを実行します。

```shell-session
az container create -g リソースグループ名 -f aci-deploy.yaml
```

## リファレンス

[yamlファイルのリファレンス](https://docs.microsoft.com/ja-jp/azure/templates/microsoft.containerinstance/containergroups) 


# ほんとは。。。

「Azure Container InstanceでRedmineを動かす方法」みたいな記事を書くつもりでいたのに、まさか失敗報告になるなんて。。。
SpresenseでHello world

 
# はじめに

SONY Spresenseという変態（誉め言葉）ボードが出たので思わず目的もなくポチってしまったのでメモを残していこうと思います。

![20180804_070814380_iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/17219/0f12e64c-b06a-071e-4c51-32b26044acf5.jpeg)

とりあえずArduino的に使うのは全く興味ないので「とりあえず」はNuttXをいじろうと思います。基本的には公式ページ

[https://developer.sony.com/ja/develop/spresense/developer-tools/get-started-using-nuttx/set-up-the-nuttx-environment#HOW_TO_BUILD_CONFIGURATION_JA](https://developer.sony.com/ja/develop/spresense/developer-tools/get-started-using-nuttx/set-up-the-nuttx-environment#HOW_TO_BUILD_CONFIGURATION_JA)

に情報があるのでそれ通りにやればよいという話ですが何点か補足を兼ねて書いておこうと思います。まず用意した環境はコンナカンジ。

- PC (Win10) 母艦
- Virtualbox
- Ubuntu 16.04 LTS ServerのVM (Virtualbox用)
- Spressense(メインボード+拡張ボード)
- USBケーブル (マイクロ)

これで全てデス。UbuntuはGUIいらないのでServerを最小限の構成でインストールしています。またインストール後は母艦からputtyでVMにつないでいます。

# ソースを取得するための前準備

まず最初にgithubにアクセスする為にユーザー登録及びssh keyの登録が必要になるようです。

[https://qiita.com/yysskk/items/974c9c55d66a26515651](https://qiita.com/yysskk/items/974c9c55d66a26515651)

あたりを参考にすると良さそうです。書く順番が逆になってしまっていますが、こちらはVMへの登録が必要なのでVMの設定が先なので注意

# 開発環境用のVM(Virtual Machine)
 
## バージョン

開発環境のOSとしてUbuntu 64bitが奨励されているようです。Ubuntuは長期メンテされる偶数のバージョンを使う感じでよいと思いますが2018/08/04時点での最新は18.04 LTSになります。最初こちらでやろうと思ったのですが、標準で色々必要なパッケージが無かったりして面倒くさそうだったのでとりあえず16.04 LTSにしました。ある程度余裕が出来てきたら再度環境を見直してみます。

## 追加で必要なパッケージ

それからServerの場合作業を行う前に事前に二つのパッケージのインストールが必要になります。

> $ sudo apt-get install openssh-server

こちらは母艦からつなぐために必要です。Virtualboxのコンソールからいじる場合は不要ですがファイルの転送とかにも使えるのであっても良いと思われます。

> $ sudo apt-get install build-essential

make等のコマンドが足りないのでこれを入れておく必要があります。

## ネットワーク関連

また、母艦との通信を行うために下記の設定をしています。よくブログでホストオンリーアダプターを設定せいという記述がありますが外との通信もしたいのでブリッジを選んでいます。

![2018-08-04 (3).png](https://qiita-image-store.s3.amazonaws.com/0/17219/dd35d47e-1fd1-3c91-2f9b-072efcca72c6.png)

## USB

あとVMでUSBにアクセスさせる為に下記の設定をしています。とりあえずターゲットをPCとUSBで接続し、右サイドの＋付きのアイコンをクリックするとUSBシリアルブリッジのCP2102Nが見えると思うので、それを選択してUSBデバイスフィルターに追加します。

![2018-08-04 (4)_2.png](https://qiita-image-store.s3.amazonaws.com/0/17219/d252cf21-4e95-cbf0-6f3f-250624b445f4.png)

最後にUbuntu側からシリアルポート(USB)へアクセスする場合「/dev/ttyUSB0」（末尾の数字はぶら下がっているデバイスの数にもよります）へのアクセスをしますがこちらは基本的には管理者権限がいるので

> $ sudo ./tools/flash.sh -l /home/dev/spresense/firmware/spresense -c /dev/ttyUSB0
> $ sudo ./tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
> $ minicom -D /dev/ttyUSB0 -b 115200 -s

のような形でsudoを使う必要があるので注意です。これへの対策はオフィシャルのドキュメントの「1.1.2. USB接続の設定」に書かれている物が該当するはずです。

# 最後に

とりあえずここまでを終えると準備完了です。あとは手順通りにやれば下記の様にHello worldが動くはずです。手順は使用するバージョンまで固定しているのでハマりポイントは少ないのではないかと思います。

![2018-08-04 (6).png](https://qiita-image-store.s3.amazonaws.com/0/17219/75dca44a-6d13-659c-5142-28bcdcf44f8c.png)

とりあえず最低限の環境は出来たので、ここから色々弄ってみたいと思います。
Macで大量の画像ファイルのフォーマットを変換する

# Motionの出力をアルファムービーにしたかった

Sofdec2のアルファムービーを作ろうとMacのMotionを使ったのだが、
アルファムービーは連番の画像を元にするようで、
だが、どうもMacのMotionはbmpとかの連番は吐いてくれない。

しかたないので、とりあえずtiffで連番出力

そして、以下のshを作って、bmpに変換してみた

## tiffからbmpにする
``` conv.sh
for FILE in */*.tiff
do
    FILENAME=`echo ${FILE} | sed 's/\.[^\.]*$//'`
	ffmpeg -i ${FILENAME}.tiff ${FILENAME}.bmp 
done
```

変換にはffmepg使ってます。

このshをイメージシーケンス画像の入っているフォルダの場所で実行すると、フォルダ内の画像が変換される。
（同じところに出力されるので、種類とかであとでわける）

というtips（自分用備忘録）でした。


# 参考
[ffmpegで複数動画ファイルを一括変換するShellscriptを書いたのでメモ](https://qiita.com/shunchan0677/items/b44aa374960989c63dd4)

# あとがき

あ、*.tiffとか指定でもできそうな予感
コミットメント対予測　スクラムの微妙だけれど重要な変更。を6行にしてみた。

こちらのページを個人的にまとめてみた。
https://www.scrum.org/resources/commitment-vs-forecast

# 6行まとめ
コミットメントという振る舞いを捨てて予測という振る舞いにシフトしましょう。
コミットメントという振る舞いは、チームを取り繕いへ導く負のプレッシャーである。
予測という振る舞いは、チームが品質と価値、継続的改善を提供することに集中する。
ビジネスに直面している人々は、ソフトウェア開発とは複雑なものであることを認識し、
チームは出来る限りのことをするプロフェッショナルですから信頼し職務を任せましょう。

# なぜ?
プロジェクトマネジメントの方法には向き不向きがあるから考慮しましょう。
言った見積もり、スケジュールを守ることで品質が貶められることがあることを考えませう。

スクラムだからスケジュール守れます。とか、早く終わります。みたいな幻想無いからね。
結果そうなることもあるでしょうけれど。
RubyGems 作成方法（超初心者）

# RubyGemsをローカルに作成(example: ruby_learner)
## Gemの入れ物を用意する
- `$ bundle gem ruby_learner -t`
  
```terminal

 create  ruby_learner/Gemfile
 create  ruby_learner/Rakefile
 create  ruby_learner/LICENSE.txt
 create  ruby_learner/README.md
 create  ruby_learner/.gitignore
 create  ruby_learner/ruby_learner.gemspec
 create  ruby_learner/lib/ruby_learner.rb
 create  ruby_learner/lib/ruby_learner/version.rb
 create  ruby_learner/.rspec
 create  ruby_learner/spec/spec_helper.rb
 create  ruby_learner/spec/ruby_learner_spec.rb
 create  ruby_learner/.travis.yml

```
## Gemの基本設定(gemspecファイルについて)
- TODOの部分は極力入力する。(ただし、以下の部分はreleaseの時のエラーの原因になるのでコメントアウトしましょう。)
    
```ruby_learner.gemspec
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'                                                                           
# to allow pushing to a single host or delete this section to allow pushing to any host.                                                                                 
if spec.respond_to?(:metadata)                                                    
  spec.metadata["allowed_push_host"] = "TODO:Set to 'http://mygemserver.com'"    
else
  raise "RubyGems 2.0 or newer is required to protect against "                 
    "public gem pushes."                                                          
end
```
- そのgemの開発だけに必要なものはadd_development_dependency で指定する。

```ruby_learner.gemspec
spec.add_development_dependency "bundler", "~> 1.16"
```

- gemの実行に必要なgemはadd_dependencyで指定する。

```ruby_learner.gemspec
spec.add_dependency "minitest", "~> 5.10.3"
```

## Gemの基本設定(実行ファイルについて)
- lib内に実行領域が存在する。Gemと同じ名前のファイルがあるのでそれが実行されると考える。

## ローカルでのテスト実行の例
- gemのディレクトリ上でrakeコマンドを実行する。

```terminal
$ rake build
$ rake install:local
```

# リリースまでの流れ

## GitHubでのアカウント作成とGemのディレクトリを新規リポジトリに登録する
- 省略

## RubyGemsでの操作
- アカウント作成はこちら > ` https://rubygems.org/sign_up`
- 自分のアカウントのEdit profileからAPI ACCESSの以下のコマンドを実行する。

```terminal
curl -u USERNAME https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
```

- APIがきちんとコピーされているか確認する。`cat ~/.gem/credentials`

## リリースコマンド(変更は全てgithub上にpushしておきましょう。)
- `bundle exec rake release`
- 同じversionでのリリースはできないので、versionは更新して追加リリースの場合は`rake release`を実行しましょう。
- versionの更新は、gemのディレクトリ内の`lib/#{gem_name}/version.rb`の値を変更しよう。

# Versionをあげた際の注意
- versionをあげるとローカルに保存したgemは全くの別物としてインストールされます。
- gemを削除したい場合は`gem uninstall #{gem_name}`で行えます。(最新版と過去版の２つある場合は選択できるようになっています。)
- ちなみに、`gem list #{gem_name}`でバージョンの確認を行えます。
AutokerasをPyTorch0.4.1環境にインストールしてみる

# はじめに
Autokerasの0.2台が公開されました。
こちらの記事によると、Autokerasは「GoogleのAutoMLのより安価な代替」と言及されています。
https://towardsdatascience.com/autokeras-the-killer-of-googles-automl-9e84c552a319

ということで、興味を持って```pip install autokeras```でインストールを試みるも、エラーが表示されてできなかったため、
なんとか試行錯誤し、インストールした結果を記します。

2018/08/04追記：
申し訳ありませんが、動作保証は致しかねます。

# 環境
Windows 10 Home
Python 3.6.6

# トラブル
まず、公式ページの案内通り、
```pip install autokeras```
で何度かインストールを試みましたが、

```
(tensorflow) C:\Users\name_>pip install autokeras
Collecting autokeras
  Using cached https://files.pythonhosted.org/packages/db/ad/58e64a09febc4a0bdc2b0fd2440628301c09a01a96cef3cf4ca6e3c0e971/autokeras-0.2.1.tar.gz
Collecting torch==0.4.0 (from autokeras)
  Could not find a version that satisfies the requirement torch==0.4.0 (from autokeras) (from versions: 0.1.2, 0.1.2.post1)
No matching distribution found for torch==0.4.0 (from autokeras)
```
といったメッセージが表示され、インストールができませんでした。
この時点ではPytorchをインストールしていなかったため、
憶測ですが、pipがPyTouch0.4.1をインストールしようとして不整合を起こしていたのかもしれません。

ですので、以下の手順でAutokerasインストール時のバージョンチェックの回避を試みたいと思います。

# 手順
1. Pytorchをインストール
2. Autokerasのインストール用のアーカイバをダウンロード
3. Setup.pyを書き換え
4. pipでインストール

2018/08/04追記：
Setup.pyを書き換えたバージョンは、
https://github.com/MenEnger/autokeras/tree/MenEnger-patch-1-1
に置いています。

## Pytorchをインストール
普通に、
```pip install pytorch```
ですね。(Anaconda環境なら```conda install pytorch```でしょうか？)

## Autokerasのインストール用のアーカイバをダウンロード
1.以下のサイトから最新版のアーカイバをダウンロードしてください。
https://pypi.org/project/autokeras/0.2.1/#history
2. 任意の場所に解凍してください。


## Setup.pyを書き換え
1. ダウンロードしたアーカイバを解凍し、その直下のSetup.pyをLinuxの改行コードに対応しているエディタ(VScode、サクラエディタ等)で開いてください。

2. 6行目の```torch==0.4.0```を```torch==0.4.1```に書き換え、保存してください。

3. Setup.pyが配置されているフォルダごとtar.gzで圧縮してください。

## pipでインストール
1.コマンドプロンプトを起動してください。
2. 圧縮したアーカイバが存在するフォルダに移動し、
```pip install autokeras-0.2.1.tar.gz```
を実行してください。

# あとがき
書いていて気づいたのですが、最初にPytorch0.4.0をインストールすればよかったかもしれません(笑)

また、
http://autokeras.com/#example
にExampleとして掲示されているコードを実行しましたが、当然ながら「x_trainは未定義です」といったメッセージが表示されました。
ちなみに、以下のコードです。

```python

import autokeras as ak

clf = ak.ImageClassifier()
clf.fit(x_train, y_train)
results = clf.predict(x_test)
```


また、
http://autokeras.com/start/#example
の例についても、
```clf.fit(x_train, y_train, time_limit=12 * 60 * 60)```
の行で、
```TypeError: 'float' object cannot be interpreted as an integer```
が表示されるので、Exampleはまだ不完全なのでしょうか。
cakephp3 都道府県を複数選択

都道府県を複数選択させたい。
multipie とかやるとCSS編集ができないので、編集しやすいように
foreach を使う方式で。

```bootstrap.php

//都道府県
Configure::write('pref',[
            '北海道',
            '岩手県',
            '宮城県',
            '秋田県',
            '山形県',
            '福島県',
            '東京都',
            '茨城県',
            '栃木県',
            '群馬県',
            '埼玉県',
            '千葉県',
            '神奈川県',
            '富山県',
            '石川県',
            '福井県',
            '新潟県',
            '山梨県',
            '長野県',
            '岐阜県',
            '静岡県',
            '愛知県',
            '三重県',
            '滋賀県',
            '京都府',
            '大阪府',
            '兵庫県',
            '奈良県',
            '和歌山県',
            '鳥取県',
            '島根県',
            '岡山県',
            '広島県',
            '山口県',
            '徳島県',
            '香川県',
            '愛媛県',
            '高知県',
            '福岡県',
            '佐賀県',
            '長崎県',
            '熊本県',
            '大分県',
            '宮崎県',
            '鹿児島県',
            '沖縄県'
    ]
);

```



```view.ctp

<?php
use Cake\Core\Configure;

$config = [
    'pref' => Configure::read('pref')
];

?>


<?=$this->Form->create($valid);?>



<? foreach ($config['pref'] as $v): ?>



                    <label for="pref-<?=$v;?>">
                    <? if (in_array($v,$this->request->data['pref'])): ?>

                        <input type="checkbox" name="pref[]" value="<?=$v;?>" id="pref-<?=$v;?>" checked>

                    <? else: ?>

                        <input type="checkbox" name="pref[]" value="<?=$v;?>" id="pref-<?=$v;?>">


                    <? endif; ?>
                        <?=$v;?>
                    </label>


                <? endforeach; ?>



<?=$this->Form->button('Submit');?>

<?=$this->Form->end();?>


```
Dockerを使ってownCloudの8.2.2から10.0.9にアップグレードしてみた


某所で動かしているownCloudをいい加減docker化しようとしてデータをマイグレードしながら現在の最新に更新した。

# データのバックアップ

現在稼働している鯖から、ファイルとDBを引っ張ってくる。

* ファイルのアーカイブ

```bash:
$ cd /var/www/html
$ tar cvf ~/tmp/ownclouddata.tgz .
```

* DBのバックアップ

```bash:
$ mysqldump -u hoge -p owncloud > ~/tmp/owncloud.sql
```

取得したファイルをローカルに持ってくる。

# Dockerに移す

## 基本のdocker-compose.yml

結果的にこのファイルのimageとvolumesを書き換えながら、バージョン上げて行く。（以下は最終の状態） #ベタだよなorz
ひとまず、マイグレーション用の暫定です。。。


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

services:
        owncloud:
            #image: owncloud:9
            image: owncloud:10
            #build: oc9.0
            restart: always
            depends_on:
                - db
            ports:
                - 10080:80
            volumes:
                #- old-data:/var/www/old
                #- oc9.0-data:/var/www/oc9.0
                - oc9.1-data:/var/www/oc9.1
                - oc10.0-data:/var/www/html
            links:
                - db
        db:
            image: webhippie/mariadb:latest
            restart: always
            environment:
              - MARIADB_ROOT_PASSWORD=hoge
              - MARIADB_USERNAME=age
              - MARIADB_PASSWORD=hogehoge
              - MARIADB_DATABASE=owncloud
              - MARIADB_MAX_ALLOWED_PACKET=128M
              - MARIADB_INNODB_LOG_FILE_SIZE=64M
              - MARIADB_INNODB_LARGE_PREFIX=ON
              - MARIADB_INNODB_FILE_FORMAT=Barracuda
            volumes:
                - mysql-data:/var/lib/mysql
                
volumes:
        mysql-data:
            driver: local
        old-data:
            driver: local
        oc9.0-data:
            driver: local
        oc9.1-data:
            driver: local
        oc10.0-data:
            driver: local
```

## データの準備

鯖からバックアップしてきたファイルをボリューム ```old-data```に展開する。MySQLのコンテナを起動して、DBをリストアしておく。

## ひたすら更新

### 8.2.2→9.1 (ダメー)

公式のイメージでは8.2、9.1、10.0系しかないようで、9.0系がない。
8.2→9.1だとバージョンまたぎと言われるので、ここは9.1のイメージを作る。
一からかくのも面倒なので、公式のDockerファイルを利用して9.0系のイメージを作成した。

[公式](https://github.com/docker-library/owncloud)のDockerfileのOWNCLOUD_VERSION, OWNCLOUD_SHA256を以下のように更新。

```dockerfile:owncloud/9.1/apache/Dockerfile
ENV OWNCLOUD_VERSION 9.0.11
ENV OWNCLOUD_SHA256 99b5bb5f799e2cd6275ec0a5c633e940318038b4009fc125a23275b8666d41ec
```

### 8.2.2→9.0, 9.0→9.1, 9.1→10.0

docker-composeで立ち上げた後、owncloudのコンテナに入る。```docker exec -it コンテナ名 /bin/bash```

その後、旧バージョンのdataディレクトリとconfig/config.phpをコピーする。

```bash:
$ cp -rp ../{olddir}/data .
$ cp -p ../{olddir}/config/config.php config
```

コピーしたら、ブラウザからowncloudにアクセスする。
アクセスすると、アップグレードの案内でるのでポチッとする。

これをひたすら繰り返す。
EventBusの登録・解除をLifecycleで（少し）エレガントに書く

# EventBus + LifecycleObserver

アクティビティ等で[EventBus](https://github.com/greenrobot/EventBus)を使用するには`register`と`unregister`が必要なのですが、毎回`onStart`/`onStop`にコードを書くのがアレなので、[Android Lifecycle Architecture](https://developer.android.com/topic/libraries/architecture/lifecycle)を使用して、少しエレガントに書きます。

まずは、ライブラリが必要なので、`build.gradle`に以下を追記します。
（EventBusはもう追加してある前提です）

```
implementation "android.arch.lifecycle:extensions:1.1.1"
```

続いて、Observerを作成します。

```kotlin:EventBusLifecycleObserver.kt
class EventBusLifecycleObserver(private val owner: LifecycleOwner) : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun register() {
        EventBus.getDefault().register(owner)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun unregister() {
        EventBus.getDefault().unregister(owner)
    }
}
```

`onStart`でregisterして、`onStop`でunregisterするだけのオブザーバです。

これをMainActivityから使用する場合は、次のように`LifecycleOwner`をimplementsして、`onCreate`内で`addObserver`してあげます。

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity(), LifecycleOwner {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lifecycle.addObserver(EventBusLifecycleObserver(this))
    }
    ...
```

これでMainActivityでイベントを`@Subscribe`することができるようになります。

アクティビティ内に色んな処理が増えてくると、onXXXX系メソッドがすぐに汚れちゃうんですが、このようにLifecyleを使用すればスッキリします。もうこれなしでは生きていけません。

# 余談

どうせほとんどのアクティビティでEventBusを使用するんだという場合には、アクティビティの抽象クラスを作っておいて、オプションで使用する／しないを選択できるようにしてもいいかもしれません。

```kotlin:BaseActivity.kt
abstract class BaseActivity(private val useEventBus: Boolean = false)
    : AppCompatActivity(), LifecycleOwner {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (useEventBus) {
            lifecycle.addObserver(EventBusLifecycleObserver(this))
        }
    }
}
```

これで継承時にオプションを渡す感覚で使用するこができます。

```kotlin:MainActivity.kt
class MainActivity : BaseActivity(useEventBus = true) {
```

Kotlin、素敵過ぎます。
Git コマンド チートシート

## ブランチ作成＋チェックアウト
```bash
git checkout -b <作成するブランチ名>
```

## リモートからチェックアウト
```bash
# git checkout -b <ローカルに作成するブランチ名> <リモートのブランチ名>
git checkout -b develop origin/develop
```
## 複数行のコミットコメントを行う
```bash
$ git commit -F- <<EOM
> 書きたいこと書く
>
> ・・・
> ・・・
> EOM
```

## pushしちゃったコミットコメント修正
```bash
# 修正
git commit --amend -F- <<EOM
> ・・・コミットコメント書く
EOM

# 強制push
git push -f origin feature/top
```
参考：[typoしてpushしてしまったコミットコメントを修正してpushしなおす方法](https://qiita.com/ykawakami/items/71b462057a8d714d7382)

## 特定のファイルのみ特定のコミットに戻す
```bash
git checkout <コミットID> <ファイルパス>
```

## ステージされているものを下す
```bash
git reset HEAD <ファイルパス>
```
参考：[【git】git addを取り消す - tweeeetyのぶろぐ的めも](http://tweeeety.hateblo.jp/entry/2015/06/10/212631)

## pushしてしまったファイルを、反映から外したい
```bash
# これで戻したいとこまで戻す
git checkout <コミットID> <ファイル名>

# 1回push(これで、リモートには反映戻したことになる)
git push origin <ブランチ名>

# ローカルでは最初の状態を維持したいので、再度checkout
git checkout <戻したい状態の時のコミットID> <ファイル名>

# ステージから外す
git reset HEAD <ファイル名>
```

## 作業中にほかのブランチにチェックアウトするとき
```bash
# 今の修正内容を一時退避
git stash

# これでcheckoutできる
git checkout <ブランチ名>

# やりたいことやる
・・・

# 作業ブランチにもどったら、退避させてた内容戻す
git stash pop
```
参考：[【Git】ブランチの切り替えとかプルとか出来ないときの対処法](https://qiita.com/konweb/items/061475d6376db957b3c4)

## ローカルのブランチを最新の状態に
```bash
# 対象のブランチにcheckoutしてから
git pull origin <ブランチ名>
```

## 一番直前のコミットの時の状態にファイルを戻す

```bash
git checkout <ファイルパス>
```

## リモートで削除されたブランチを、ローカルでも削除する
```bash
git remote show origin

git remote prune --dry-run origin

git remote prune origin
```
参考： [削除されたremoteブランチがローカルのRepoに残っていて、それを削除する方法](https://qiita.com/kony/items/f0fb18b04bd5337132e3)
rubyのversionが切り替えられない時

#cocoapodsのエラーで、Rubyが古いことが原因だと思われる時の話

とりあえずこのコマンド打ち込め笑
`export PATH=$HOME/.rbenv/bin:$PATH`


##手順
まず、rubyのversionを確認
rbenvのversionを確認

###rbenvのversionが古い時
rbenvのアップデートはいけると思う（頑張って）

###rubyのversionが古い時
・rubyのversionが単に古いのであればupdate
・rubyのversionは新しくできたはずだが、versionが古い方から変えられない時は、とりま次のコマンドを打ち込もう！！
`export PATH=$HOME/.rbenv/bin:$PATH`
うまくいかない時は、
`export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"`
こっちも試してみよう！！

基本的にはこれで対応できるはずです！！
CVVTuberExampleがMacで動かないことへの対処方法

## 環境
- macOS HighSiera 10.13.5
- Unity 2018.2.2f1 Personal

## 症状
CVVTuverExample をプロジェクトにインポートすると下記のようなエラーが無数に発生し、
ReadMeの指示通りにセットアップを行ってもゲームをRunさせることができなかった。

```
Failed to change file flags for '/Applications/Unity/Unity.app/Contents/Resources/PackageManager/BuiltInPackages/com.unity.modules.ai/package.json.meta'. errno: 13
```

<img width="1440" alt="error_log.png" src="https://qiita-image-store.s3.amazonaws.com/0/138421/dbf53cc5-c1a6-7116-f5ab-27dd8e18b459.png">

※「OpenCV for Unity」「Dlib FaceLandmark Detector」はインポート済

## 原因
Unityのエディタ関連ファイルのオーナーが、現在ログインしているユーザ以外のものになっているため。
この状態でエディタが特定の場所に置いてあるファイルにアクセスしようとすると上記のようなエラーとなる。

## 対処
ターミナルを開き次のコマンドを入力する。
※Unityはデフォルトの場所にインストールしているという前提

```
// エディタ関連ファイルのあるフォルダの階層まで移動
cd /Applications/Unity/Unity.app/Contents/Resources/PackageManager

// エディタフォルダ以下のオーナーを変更
sudo chown -R [CURRENT_USER_NAME] Editor
```

\[CURRENT_USER_NAME\]の部分は現在ログイン中のユーザ名に置き換える。
ターミナルを開き、「$」の直前の部分を確認することでわかる。

![teminal.png](https://qiita-image-store.s3.amazonaws.com/0/138421/93be0dce-a2af-84ad-5998-b2a72ca25a13.png)

## 結果
無事動作した。

<img width="1440" alt="result.png" src="https://qiita-image-store.s3.amazonaws.com/0/138421/80dac513-5bd5-35af-d699-4e3d79325737.png">

## 参考
- [参考:Uniryフォーラム](https://forum.unity.com/threads/failed-to-change-file-flags-errno-13.397604/#post-3556758)

## おわりに
そのうち 「必要アセット購入 - Unityインストール - CVVTuberExampleを動かす」までの一連の流れを記事にしようと思います。
import PIL (Pillow)すると動かないゾ

python3でPillow(PILのfork)をインストールして、

```python
import PIL
img = PIL.Image.open(~~)
```
などとPILを直接importするとPILにImageはありません見たいなエラーが出て動かない

```python
import PIL.Image
img = PIL.Image.open(~~)
```
といったようにPIL以下をimportすると動くようになる。

```python
from PIL import Image
```
という書き方でも可能。個人的にはImageという名前を取られるのでしんどみを感じる。

これについて、DiscordのPython.jp鯖でお世話になった。なにやらPIL.py?に\_\_init\_\_が無いから前者では動かないらしいということだった。(正直よくわかってない)
初見殺しだ...という感想を得た。
ディスクユーティリティでのapfsコンテナのイメージ作製と復元

#背景

iMac用に利用していた外付けのSSD(250GB)が手狭になってきたので新しいSSD(500G)へ移行を行なった。

#イメージ作製

apfsの場合コンテナ配下の仮想ディスクをイメージに変換する部分が選択できない。
しかし**コンテナdisc**をイメージに変換する事はできる為こちらを利用してバックアップイメージを作成する。

#復元

コンテナ単位でイメージを作成しているのでコンテナ単位で復元できると思いきやできない。。
その為以下の方法でイメージの復元を行う

##バックアップイメージのマウント

バックアップのイメージをいったんマウントする。ダブルクリックとかで

##復元用discの作成

復元もとが同じディスクであればとくにすることは無いが、新しいdiscであったりした場合や構成を変更したい場合は、ディスクユーティリティ等でフォーマットやパーティションの作成をしておく。

##復元

ディスクユーティリティで新しいディスクのコンテナ配下の仮想ディスクを右クリックすると復元を選択する事ができる。
この際に新しいディスクのコンテナ配下の仮想ディスクは全て**アンマウント**しておく必要がある、
そして復元もとをあらかじめマウントしたバックアップイメージのディスクを選択し復元という流れで復元する事ができた。
[TensorFlow] tf.gfile.GFile / tf.gfile.FastGFileの利点

# その前に : 両者は同じ
公式ドキュメントによると、 [tf.gfile.GFile](https://www.tensorflow.org/api_docs/python/tf/gfile/GFile) も [tf.gfile.FastGFile](https://www.tensorflow.org/api_docs/python/tf/gfile/FastGFile) も以下のように同じ文言。

> File I/O wrappers without thread locking.

[ソース](https://github.com/tensorflow/tensorflow/blob/f9acd38eb687208dcee8622510b9a611e51d21a4/tensorflow/python/platform/gfile.py#L39)を見ても同じだし、github の Issues にも[同様のコメント](https://github.com/tensorflow/tensorflow/issues/12663#issuecomment-360641998)があった。


# 本題 : tf.gfile.GFile / tf.gfile.FastGFileの利点
[stackoverflow](https://stackoverflow.com/questions/42922948/why-use-tensorflow-gfile-for-file-i-o/) によると、tf.gfile.(Fast)GFile の役割は以下のようなものらしい。

1. Python のファイルオブジェクトに近い API を提供し
2. TensorFlown の C++ FileSystem API をベースにした実装を提供すること

すなわち、**Google Clound Storage (gs://)** や **Hadoop Distributed File System (hdfs://)** をはじめとした様々なファイルシステムでデータセットやチェックポイントの読み書きが可能になっているそうだ。
なので、これらのファイルシステムを使うときは必須なのだろう（使ったことはない）。

ただ、上記 stackoverflow では、

> in the case all my files are local will I get any computational advantage by using tf.gfile?

との質問に対し

> No, probably not.

との回答もしているので、ローカルファイルだけを扱うのであれば Python 組み込みのファイル関数で代用してもよさそう。
Apache（アパッチ）とは

# Apache（アパッチ）とは
アパッチは、「Webサーバーのソフトウェア」です。

webサービスは、ざっくり言うと

- ユーザー（パソコンでwebページを見る人）
- サーバー（webページを置いておく場所）

に分かれます。
そして、ユーザーがサーバーに「このwebページを見せて」とwebページの住所（URL)を送ると、サーバーはその住所にあるWebページをユーザーに送ります。

このとき、「ユーザーのお願いに対して、それに合ったWebページを送る」という動作がプログラムされているということになります。

そう言ったサーバー側のソフトウェアをApacheと呼びます。
google スプレッドシートに曜日を関数で入力する

最近、excelではなくGoogle spreadsheetを使うことが多くなったので、自分がわかりやすいように、メモしておきます。

#やりたいこと
GSSで日付を入れると、隣のセルに曜日を自動で（関数を利用して）、出力させたい。

#まずは、日付を表示する

日付を表示するセルを選択して、日付を2018/8/1のように西暦から入力する。

#関数を使って曜日を表示する
曜日を表示したいセルに　=TEXT(B5,"dddd")　と入力する。
（=とか"とかを半角で入力することに注意）
一文字で「土」とだけ表示したい場合は、=TEXT(B5,"ddd")　と入力する。
<img width="364" alt="スクリーンショット 2018-08-04 09.59.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/262477/1b616c72-9680-8e99-997d-9d434bf0a97c.png">


#連続で日付を表示させる
あとは、セルを選択した状態で、セルの右下をクリックした状態で下にずらしていけば、連続した表示が簡単に表現できる。
<img width="257" alt="スクリーンショット 2018-08-04 17.02.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/262477/d9bde899-e714-08a0-c139-568ee60dddf9.png">

## Google SpreadSheetで勤怠記録を作ろうと思っている人へ
デメリットとして・・・
Google SpreadSheetのマクロには、Excel VBAと違って新しいシートを作成したり、コピーしたりする命令がないので、結局のところ手作業で翌月分のシートを作成しないといけなくなります。
そのため、従業員が20名くらいの事業所なら手作業でやってられますが、もっと多い場合だと、Google Spreadシートよりも別の手段を考えたほうが効率的だと思います。


以上です。
TypeScript Handbook の Advanced Types をちょっとだけ掘り下げる - その4 String Literal Types / Numeric Literal Types

# はじめに

本記事は [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/basic-types.html) の [Advanced Types](https://www.typescriptlang.org/docs/handbook/advanced-types.html) に書かれているものをベースに、説明されている内容をこういう場合はどうなるのかといったことを付け加えて *ちょっとだけ* 掘り下げます。完全な翻訳ではなく、若干元の事例を改変しています。
今回は **String Literal Types** / **Numeric Literal Types** の二つの節について掘り下げます。

その1 Type Guards and Differentiating Types は [こちら](https://qiita.com/kobanyan/items/7a38ed5abad71cb8e93d)
その2 Nullable types は [こちら](https://qiita.com/kobanyan/items/c574ef8a20cc0590f739)
その3 Type Aliases は [こちら](https://qiita.com/kobanyan/items/58134cac1f92e31595c2)
その5 Discriminated Unions は [こちら](https://qiita.com/kobanyan/items/ca56df27de50ec267995)
その6 Index types は [こちら](https://qiita.com/kobanyan/items/dcdf12bbd8b793fe5bd7)
その7 Mapped types は [こちら](https://qiita.com/kobanyan/items/2fdd6b0ed7411ff9980e)


# String Literal Types

文字列リテラル型は、ユニオンやエイリアス、 Type Guard と組み合わせることで enum のような機能を実現することができます。

```typescript
type Easing = 'ease-in' | 'ease-out' | 'ease-in-out';
class UIElement {
  animate(dx: number, dy: number, easing: Easing) {
    if (easing === 'ease-in') {
    } else if (easing === 'ease-out') {
    } else if (easing === 'ease-in-out') {
    } else {
      // null か undefined (コンパイラオプションの `--strictNullCheck` が有効な場合、不要)
    }
  }
}

let button = new UIElement();
button.animate(0, 0, 'ease-in');
button.animate(0, 0, 'uneasy'); // コンパイルエラー
```

Easing という型エイリアスの変数には三つの文字列のいずれかだけを渡すことができ、それ以外の文字列が渡された場合には、エラーが起きます。
Easing に含まれる文字列が返って来るとしても string 型を渡すとエラーになります。

```typescript
function getEasingString(): string {
  return 'ease-in';
}
function getEasing(): Easing {
  return 'ease-in';
}
button.animate(0, 0, getEasingString()); // コンパイルエラー
button.animate(0, 0, getEasing());       // OK
```

宣言時に定数を渡すことはできません。

```typescript
const EASE_IN = 'ease-in';
const EASE_OUT = 'ease-out';
const EASE_IN_OUT = 'ease-in-out';
type Easing = EASE_IN | EASE_OUT | EASE_IN_OUT; // コンパイルエラー : "Cannot find name 'EASE_IN'."
```

エイリアスを渡すことはできます。

```typescript
type EASE_IN = 'ease-in';
type EASE_OUT = 'ease-out';
type EASE_IN_OUT = 'ease-in-out';
type Easing = EASE_IN | EASE_OUT | EASE_IN_OUT; // OK
``` 

文字列リテラル型はオーバーロード宣言にも利用できます。

```typescript
function createElement(tagName: 'img'): HTMLImageElement;
function createElement(tagName: 'input'): HTMLInputElement;
// ... さらにオーバーロード ...
function createElement(tagName: string): Element {
  // 処理
}
createElement('img'); // 戻り値は HTMLImageElement として扱われる
```

# Numeric Literal Types

数値リテラル型も同様の機能です。

```typescript
function rollDice(): 1 | 2 | 3 | 4 | 5 | 6 {
  // ...
}
```
Laravel-Mix, BrowserSyncで画面を自動リロードする方法

# 環境
|                  |            バージョン|  
|------------------|------------------:|
| macOS High Sierra|           10.13.5 |  
| Laravel          |               5.5 |
| HostOS Ubuntu    |        18.04 LTS  |

# 前提
Laravelのプロジェクトを作成。
https://readouble.com/laravel/5.5/ja/homestead.html

Laravel-Mixの導入はこちらを参考にしてください
https://readouble.com/laravel/5.5/ja/mix.html#running-mix

# Laravel-Mixとは
Laravel-Mix(前, Laravel Elixir)とはwebpackの設定を簡単に行えるAPI.

# Laravel-Mixの導入
npm install で導入完了.

# webpack.mix.jsの記述
webpack.mix.jsに色々書くと, アセットをどうコンパイルすべきか設定する.

```webpack.mix.js
mix.browserSync({
    host: 'hoge.test',
    proxy: {
        target: "http://hoge.test",
        ws: true
    },
    browser: "google chrome",
    files: [
       './**/*.css',
       './app/**/*',
       './config/**/*',
       './resources/views/**/*.blade.php',
       './resources/views/*.blade.php',
       './routes/**/*'
    ],
    watchOptions: {
      usePolling: true,
      interval: 100
    },
    open: "external",
    reloadOnRestart: true
});

```
browserSyncとはファイルの変更を監視し、変更があればブラウザをリロードしてくれるツール.

# 変更の監視
npm run watch-pollにより変更を監視する.

```terminal:console
       Local: http://localhost:3000
    External: http://hoge.test:3000
```

このようなものがターミナルに表示される
このURLをブラウザで表示すると, アプリケーションをブラウザから確認できる.
ファイルに変更を加えると, ブラウザに変更が反映される.
Returnがなんだかよくわからない

##この記事の目的
Return構文の使い方がよくわからないので整理してみる。
またこの記事をみて後から、またわからなくなった時にわかるようにする。

###そもそもReturnとは何なのか
Returnを使えば戻り値をメソッド呼び出し元に返すことができるとある。
これはどういうことなのか？
少し実験してみた。

```sample.rb
def addition(num1, num2)
  result = num1 + num2
  return result
end

num1 = 5
num2 = 6

result = addition(num1, num2)
puts "合計：#{result}"
```

順を追って見ていきます。



`num1 = 5`
`num2 = 6`

ここでnum1,num2に数字を代入しています。
（ここは大丈夫ですね。）

次にいきましょう。

`result = addition(num1, num2)`
resultという変数の右辺でadditionメソッドを呼び出していて、引数にnum1, num2を渡しています。


次にインスタンスメソッド内に入っていきます。

`result = num1 + num2`

メソッド内でresult変数を定義して、受け取った引数であるnum1とnum2の足し算を行っています。

次に本題のreturnのところ

`return result`
先ほどのresultの右辺で行った足し算の結果をメソッドの呼び出し元に返しています。

結果を確認してみるとこんな感じで帰ってきてます。

>合計：11

呼び出し元である`sum = addition(num1, num2)`に無事値が戻っていることがわかります。

もう少しわかりやすく書いてみる。
`return result`の部分を`return "#{result}です。"`に変更してみる。

```sample.rb
def addition(num1, num2)
  result = num1 + num2
  return "#{result}です。"
end

num1 = 5
num2 = 6

result = addition(num1, num2)
puts "合計：#{result}"
```

実行してみると下記の通りに変わっています。
>合計：11です。

result = addition,,,のところで定義している以上のものが返ってきているのが分かります。


###returnは省略できる
１番初めの例の場合はreturnの１行を省略することが可能。
省略した場合はメソッド内で最後の式を評価した値が戻り値となる。

```sample.rb
def addition(num1, num2)
  result = num1 + num2
end

num1 = 5
num2 = 6

result = addition(num1, num2)
puts "合計：#{result}"
```
実行結果は変わりません
>合計：11


↑ナニイっテルンデスカ？(・・?)っていう方は下を見てください。
http://mugenup-tech.hatenadiary.com/entry/2014/07/03/195554


```sample.rb
def addition(num1, num2)
  result = num1 + num2
  puts "#{result}"　
end

num1 = 5
num2 = 6

result = addition(num1, num2)
puts "合計：#{result}"
```

実行結果
>11
合計：

11はメソッド内で出力しているもので、下がメソッドを呼び出した方である。
putsなどの出力した式は評価した式にはnilが返ってしますので注意ですね。
Scalaとは？

https://dwango.github.io/scala_text/introduction-to-scala.html

を見ながらScalaに入門したときの学習メモ

## オブジェクト指向プログラミングと関数型指向プログラミングの統合

- Scalaの特徴はJavaをベースとしたオブジェクト指向言語をもとに関数型の概念をとりこんでいること。
- Scalaの世界では関数は実際にはオブジェクトであり、メソッドに引数を渡しているように見えても関数オブジェクトが生成されている。
- 関数をオブジェクトとして統合することによって言語仕様を肥大化させることなく、オブジェクト型と関数型の統合を実現している。

## Javaとの互換性

- ScalaはJavaとの互換性を考えて作られているので、JavaのライブラリはScalaから呼び出すことができる。大量にある既存のJavaライブラリを使うことができるのが利点
- Scalaのプログラムは基本的にJavaと同じようにバイトコードに変換され実行されるので高速で性能予測が容易。
- 運用においてJVM系の大量なノウハウを使うことができる

**バイトコードとは**
> バイトコード (bytecode) は、仮想マシンによる実行のために設計された、実行可能なプログラムのバイナリ表現である。ソフトウェアによって処理されるため、大抵は実機の機械語より抽象度の高い中間コードになっている。プログラミング言語の実装において、特定のハードウェアへの依存度を下げ、またインタプリタの実装を容易にするために用いられる。コンパイラの中間コードとして用いられることもある。
引用：[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89)

*JVMとは*
- Javaを動かすための仮想マシン

参考文献: https://wa3.i-3-i.info/word12706.html

## 非同期プログラミング、並行・分散プログラミング

- 非同期の処理を実現するための標準ライブラリがFuture

非同期プログラミングとはAとBの処理があった時にAが完璧に終了してからBをやるのではなくAの実行中の待機時間にBのタスクも並行して行うこと

https://hatena.github.io/Hatena-Textbook-JavaScript/async.html

内部に大量のシステムがあり、外部からも大量のリクエストが飛んでくる時に力を発揮する。

**並行・分散プログラミングとは**

プロセッサの高速化に限界が見えて、処理の高速化が漸近してきた。

さらに高速化するためにはプログラムを複数のプロセッサで動かすしかないというもの

具体的な内容とかは難しくてよくわからない

https://www.slideshare.net/pfi/ss-9780450
ZenHubのBoardで統合したはずのRepositoryのIssueがデフォルトで表示されない問題

# ■ 概要 
下のBoardのようにRepo addで4つのRepositoryをマージして表示設定したはずなのでデフォルトではひとつにRepositoryのIssueしか表示されません。。

<img width="579" alt="スクリーンショット_2018-08-04_16_03_58.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/9765abc6-48cf-3f9f-3fef-4dbe9dae7ad1.png">

毎回、ぼちぼちRepositoryを選択するのがめんどうです。

# ■ 解説方法
解決方法といっても、すぐ横にある『Show all』ボタンを押すだけで解決しました。
<img width="702" alt="スクリーンショット_2018-08-04_16_09_34.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/c844412c-9f1c-ebec-2f44-c6064456319c.png">

ただ、再度Zenhubを開くとデフォルトの設定になってしまいますが、ひとまずボタンをぼちぼちすることはなくなりました。
一応、ZenHubIO/supportにIssueは提出済みです。
https://github.com/ZenHubIO/support/issues/1478