OmniAICreator/Qiita-1.07M huggingface dataset:
Tensorflowを動かすためのGPU環境の構築概要

# はじめに

この記事は 2017/10/25現在の情報です。

TensorflowのためのGPU環境を用意したときに時間を要してしまったので注意点をまとめておきます。
これからTensorflowのGPU環境を用意する方の時間の節約になれば幸いです。

伝えたいこと: **Tensorflowを使うときはcudaとcudnnのバージョンに注意**

## 目次
1. 環境
2. Tensorflow対応のcudaのバージョンの注意
3. Tensorflow対応のcudnnのバージョンの注意
4. その他の注意点
5. ざっくり手順

# 1. 環境

Ubuntu 16.04 azure x86_64
(この記事の内容自体は環境に依存しない可能性が高いと思います）

# 2. Tensorflow対応のcudaのバージョンの注意

cudaのtoolkitをダウンロードするときは以下のページからダウンロードしますが、現時点での最新版が9.0になっています。つまり、普通にダウンロードした場合cudaのバージョンは最新の9.0です。

[CUDA Toolkit](https://developer.nvidia.com/cuda-release-candidate-download)

ただし、**現時点のTensorflowはcudaの9.0には対応していません。**

cuda9.0の環境を用意してTensorflowのGPU版を実行したところ、`libcusolver.so`に関してエラーが発生しました。

そのため、以下の記事で言及されているようにcuda toolkitのarchiveから8.0のバージョンをダウンロードする必要があります。

[Download and install CUDA 8.0 instead of CUDA 9.0](https://devtalk.nvidia.com/default/topic/1024550/download-and-install-cuda-8-0-instead-of-cuda-9-0/)

↓ここに8.0があります。
[CUDA Toolkit Archive](https://developer.nvidia.com/cuda-toolkit-archive)

# 3. Tensorflow対応のcudnnのバージョンの注意

cuDNNダウンロードリンク: [cuDNN Download](https://developer.nvidia.com/rdp/cudnn-download)

cuda8.0に対応する最新版のcudnnのバージョンはv7.0です。
ただしここにも注意が必要でv7.0ではTensorflowは対応していないようです。

Tensorflowを動かすと、`libcudnn.so.6`に関してエラーが発生します。
この場合対処する方法はあって、以下のように`libcudnn.so.6` に対してシンボリックリンクをはってあげればオーケーです。

```
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so.7.0.3 /usr/lib/x86_64-linux-gnu/libcudnn.so.6
```

以下の記事で言及されていました。なお、このことが事前に分かっていればcudnnのv6.0をはじから選択するのが無難ですね。

[Ubuntu 16.04LTSにKerasやTensorFlowを入れてGPGPUできるようにする](http://yyasui.hatenablog.com/entry/2017/08/23/215030)

# 4. その他の注意点

他に何かエラーが起きた場合、環境変数の設定がしっかりされているか確認すると良いと思います。
以下のように設定が必要です。

```bash:.bash_profile
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
```

しっかり書いておかないと例えば、以下のようなインストールをしたときにバージョンを勝手に変えられたりしました。

```
$ sudo apt install nvidia-cuda-toolkit
```

# 5. ざっくり手順

ざっくりと手順をまとめます。
公式の手順を追っていけば出来ると思います。
また、以下の大筋だけ把握しておけば検索して他の記事で細かいことは対応出来ると思います。

## ① NVIDIAドライバダウンロード

自分のGPU環境を選択して用意。
[NVIDIAドライバダウンロード](http://www.nvidia.co.jp/Download/index.aspx?lang=jp)

## ② cudaの準備

こちらのアーカイブのリンクから8.0のバージョンを選びましょう。
[CUDA Toolkit Archive](https://developer.nvidia.com/cuda-toolkit-archive)

## ③ cuDNNの準備

cuda8.0用のv6.0をダウンロードすればよいです。
(利用にはログインが必要になると思います。)

[cuDNN Download](https://developer.nvidia.com/rdp/cudnn-download)

各cudnnごとにインストール手順が`cuDNN Install Guide`という項目のリンクにあるのでそれを見るとインストール出来ます。

例えば、ubuntu16.04なら以下の3つをダウンロード、実行すればよいです。

```
cuDNN v6.0 Runtime Library for Ubuntu16.04 (Deb)
cuDNN v6.0 Developer Library for Ubuntu16.04 (Deb)
cuDNN v6.0 Code Samples and User Guide for Ubuntu16.04 (Deb)
```

## ④ Tensorflowのインストール

こちらから。
https://www.tensorflow.org/install/
Unity2017.1のRaycastバグ

最近Unity2017.1に更新したんですが、さっそくバグを踏みました。

UI Button Issue after upgrading to 2017.1
https://forum.unity.com/threads/ui-button-issue-after-upgrading-to-2017-1.488407/

これは私が投稿したものではないですが、症状は同じで、uGUIのUIオブジェクトのタッチ(マウスクリック)が効かなくなることがあるというもの。

さっくり原因を書くと、ImageやButtonなどのUIオブジェクトのScale.x, Scale.y, Scale.zのいずれかがゼロの場合に、Raycastの範囲が各軸の全体に広がってしまい、他のRaycastTargetへのタッチを邪魔してしまうということのようです。

例えばアニメーションでImageを消すのにScaleを使ったり、Scaleを指定するのにVector3ではなくVector2を使っている場合に発生します(Scale.zが0.0fになるため)。ただ、オブジェクトのツリー構成によっては発生しないこともあるようです。

Unity2017.2では修正されているようですが、こちらではまだ確認していません。
https://unity3d.com/jp/unity/whats-new/unity-2017.2.0
> UI: Fixed case of object scale interfering with input.

取り急ぎご連絡まで。
【不定期更新】Fragmentを使い始めた初心者による個人的メモ

#事の始まり
*―先生、Android開発がしたいです*

そんなことを述べて幕が開けた、私の大学卒業研究（開発課題実習）でしたが、私のまだ未熟な技術でAndroidアプリ開発は骨が折れる作業です。

ここでは私個人がこの開発課題実習でつまずいたFragmentに関する個人的なメモを残しています。チラシの裏のメモ書き程度にでもしてください。

なお、現在絶賛開発課題実習の真っ只中なので、内容は逐一更新されます。

##開発環境
OS：Windows 10
IDE：Android Studio 2.2.3
Compiler：Java 1.8.0_144
Debugger：Nexus 9　Android 7.1.1（実機デバッグ）

#FragmentをProjectに突っ込む方法
1.Android Studio上の「Project Tree」が「Android」になっていることを確認し、「app」の上で右クリックする
![スクリーンショット (48).png](https://qiita-image-store.s3.amazonaws.com/0/193858/3c7e0ed9-deda-51ca-ec49-44f2b809b33d.png)

2.New → Fragment → Fragment(Blank) を選択し、適当な名前をつけて"Finish"する
![スクリーンショット (49)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/193858/45f91c3a-acd9-92c0-dc2f-4e6ff83849dd.jpeg)

#Fragmentを静的にActivityに載せる
UIエディタ画面のコンポーネントパレットの
　"Layouts"　→　"＜fragment＞"を選択し、載せたいFragmentを選択する
![スクリーンショット (51).png](https://qiita-image-store.s3.amazonaws.com/0/193858/9821f09d-9d92-2e95-c35c-7c1d669adc19.png)
　※自作したFragmentのjavaソースは、独自のパッケージ名で表示されます。
　　今回の場合：com.example.miqa3893.monitor_controller

**何も表示されていなくても、デバッグ時に表示されるので安心。**

#Fragmentを動的にActivityに載せる
1.Fragmentを載せたいLayoutにIDを指定する。（ソースコードで指定する時にわかりやすくするため）

```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.miqa3893.monitor_controller.MainActivity">

    <LinearLayout
        android:id="@+id/fragment_container"
        android:layout_width="752dp"
        android:layout_height="935dp"
        android:orientation="horizontal"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="8dp">
    </LinearLayout>
</android.support.constraint.ConstraintLayout>
```

2.Activity側のjavaソースに以下を実装

```MainActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //自作したFragmentクラス
        HomeFragment fragment = new HomeFragment();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        //addメソッド
        // 引数1:先程指定したLayoutのID
        // 引数2:自作したFragmentクラスのインスタンス
        // 引数3:Fragmentを識別するタグ（String）
        transaction.add(R.id.fragment_container,fragment,"Home").commit();   //commit()を忘れないで
    }
```

**※先程の節で紹介した、FragmentのLayoutコンポーネントを直接入れ込むと、表示したいFragmentが二重に表示されます。**

（以降は編集中です）
CentOS7 で PM2 をサービス化

#PM2の起動を自動化＆落ちても再起動
PM2はNODE.JSのプロセスをデーモン化するツール。
このツール自体をさらにデーモン化する

PM2のインストール自体は

```
npm install pm2 -g
```
で簡単にできる
通常起動するのであれば

```
pm2 start スクリプトのパス
```
で出来る。
CentOS7ではSystemdでサービスを管理しているが
以下のコマンドを実行することでSystemd向けの.serviceファイルを生成してくれる。

```
pm2 starup centos
```
これを実行すると
/etc/systemd/system/pm2-***.service
というファイルが生成される。

私が実行したときは権限の関係でエラーが出ていたが、
普通はこれだけで出来るらしい。

エラー内容の確認をする場合は

```
journalctl -xe
```
を実行することでログを見ることが出来る。

ちなみに、コマンドの実行だけでOS起動時に一緒に起動されるようになっている。

私はPM2のプロセスが落ちたときにもプロセスの再起動をさせたかったので、
/etc/systemd/system/pm2-***.service
に対して

```
 Restart=always
```
の一行を追加しています。
バイナリデータを Golang の []byte リテラル表記に変換する簡単なお仕事

こんなの絶対誰かが作ってるし探せば転がってるんだろうけどググるのも面倒くさくなったので自分で作りました。

- [spiegel-im-spiegel/godump](https://github.com/spiegel-im-spiegel/godump)

以下は [README](https://github.com/spiegel-im-spiegel/godump/blob/master/README.md) に書いた内容。まぁ実質のコードはたったこれだけで

```go
package godump

import (
	"bytes"
	"fmt"
	"io"
)

//DumpBytes returns []bytes literal string
func DumpBytes(r io.Reader, name string) (io.Reader, error) {
	buf := new(bytes.Buffer)
	b := make([]byte, 1)
	var err error
	sep := fmt.Sprintf("var %s = []byte{", name)
	for true {
		if _, err = r.Read(b); err != nil {
			break
		}
		fmt.Fprintf(buf, "%s%#02x", sep, b)
		sep = ", "
	}
	fmt.Fprintln(buf, "}")
	return buf, nil
}
```

外部パッケージとして読み込む価値もないので，もし使いたいという奇特な方がおられるなら，中身見て適当にコピペしてください。

## Install

```
$ go get github.com/spiegel-im-spiegel/godump
```

Installing by [dep].

```
$ dep ensure -add github.com/spiegel-im-spiegel/godump
```

## Usage

```go
dump, err := godump.DumpBytes(bytes.NewBufferString("hello world"), "foobar")
if err != nil {
	return
}
io.Copy(os.Stdout, dump)
// Output:
// var foobar = []byte{0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64}
```

## Command Line Interface

```
$ godump -h
Usage:
  godump [flags] [binary file]

Flags:
  -h, --help          help for godump
  -n, --name string   value name (default "dumpList")
```

```
$ echo hello world | godump -n foobar
var foobar = []byte{0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x0a}
```

```
$ cat input.txt
hello world

$ godump -n foobar input.txt
var foobar = []byte{0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64}
```

[godump]: https://github.com/spiegel-im-spiegel/godump
[dep]: https://github.com/golang/dep "golang/dep: Go dependency management tool"
シェル | teeコマンドを使って標準出力を全てファイルにリダイレクトする

# 注意 (追記)

[Process Substitutionとexec redirectで画面出力を加工するときの問題点と解決、そして無限に寝る話 - Qiita](https://qiita.com/takei-yuya@github/items/7afcb92cfe7e678b7f6d)

## スクリプト

```:example.sh
exec 1> >(tee --append log.txt)

echo A
echo B
echo C
```

## 標準出力される

```
$ bash example.sh
A
B
C
```

## ファイルにも書き込まれている

```
$ cat log.txt
A
B
C
```

# 標準出力 / 標準エラー出力の両方をリダイレクトする場合

```
exec 2> >(tee -a error.log) 1>&2
```

# 参考

- [bash - Using exec and tee to redirect logs to stdout and a log file in the same time - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/145651/using-exec-and-tee-to-redirect-logs-to-stdout-and-a-log-file-in-the-same-time)

# 環境

- GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
AzureのWindows VM でサウンドをオンにする

# 前提
* Windows Server 2016のVM

# 手順
1. `スタート`→`Windows管理ツール`→`サービス`
2. `Windows Audio Endpoint Builder`と`Windows Audio`のサービスを起動する。自動起動したい場合は、スタートアップの種類を自動にする。
3. リモートデスクトップクライアントで、サウンドをローカルデバイスで再生する設定になっていることを確認する。

# 参考
[Enabling Audio on Azure VM](https://social.msdn.microsoft.com/Forums/azure/en-US/fbe0e7fa-f47d-46cd-b74b-2fa90aa05efd/enabling-audio-on-azure-vm?forum=WAVirtualMachinesforWindows)
RxBluetoothKitでの「状態の保存と復元」ハマりどころ

本記事は下記バージョンで試した内容を書いてます。

iOS 10.3.1
Xcode 8.3.3
Polidea/RxBluetoothKit 3.1.1
ReactiveX/RxSwift 3.6.1

# 何がおきたのか

接続済みPeripheralからのNotifyトリガーで状態復元しても、Notifyが受け取れない。

# 原因を調べてみた

```swift
public func listenOnRestoredState() -> Observable<RestoredState>
```
で流れてきたRestoredState.peripheralsに対してサービスとキャラクタリスティックを探索＆Notifyをsubscribeしていたが、そもそもサービス一覧が流れてこない。

# 対策

RestoredStateは使わずに、

```swift
public func retrieveConnectedPeripherals(withServices serviceUUIDs: [CBUUID]) -> Observable<[Peripheral]>
```

でPeripheral一覧取得してサービスとキャラクタリスティックを探索＆Notifyをsubscribeでうまくいった。

# おわりに

RxBluetoothKitでは状態の保存と復元できないのかと思って、危うく全部生のCoreBluetoothに書き換えるところだった･･･。
【Swift】alert(アラート)で"ok"とかボタン押したら画面遷移する

#Swift alertで"ok"とか何かしら押したら画面遷移するように設定
下記コードは"check"って書いてあるボタン押したらアラートが出て、"ok"押したら画面遷移するよってやつ

```gamenseni.swift


@IBAction func tapCheck(_ sender: UIButton) {

       //部品のアラートを作る
        let alertController = UIAlertController(title: "e.g.こんにちは", message: "e.g.日本語だよ", preferredStyle: UIAlertControllerStyle.alert)
        //ちなみにUIAlertControllerStyle.alertをactionsheetに変えると下からにょきっと出てくるやつになるよ
 
       //OKボタン追加
        let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:{(action: UIAlertAction!) in
            
        //アラートが消えるのと画面遷移が重ならないように0.5秒後に画面遷移するようにしてる
           DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            // 0.5秒後に実行したい処理
             self.performSegue(withIdentifier: "セグエのid", sender: nil)
            }
           }
        )
        
          alertController.addAction(okAction)
        
       //アラートを表示する
        present(alertController, animated: true, completion: nil)
        
 
    }

```

追記
0.5秒後に実行したい処理、今回は画面遷移だけどセグエにidつけてperformSegueやってるのでセグエ無しでやりたいとかやったら

```nosegue.swift

self.performSegue(withIdentifier: "セグエのid", sender: nil)

```

のところを
VCにidをつけて

```nosegue1.swift

let storyboard: UIStoryboard = self.storyboard!
let nextView = storyboard.instantiateViewController(withIdentifier: "VCのid")
self.present(nextView, animated: true, completion: nil)

```
にしてもok

##画面遷移先の背景がなぜか真っ黒
なんでか知らんが画面遷移先が真っ黒に！
右側のとこ(ど忘れ)でbackground設定しても反映されず...

```changehaikei.swift
view.backgroundColor = UIColor.yellow
```

とか背景変えるコードを適当にviewDidLoad()のとこに書けば解決
fluent-logger-node 2.6.0

[fluent-logger-node](https://github.com/fluent/fluent-logger-node) 2.0.1のリリース以来の記事です。

# 主な変更点

## v2.1.0 (2016-09-28)

* Streamサポート

## v2.2.0 (2016-10-18)

* 必ずobjectをemitするようにした
    * https://github.com/fluent/fluentd/issues/1279

## v2.3.0 (2017-03-16)

* EventTimeサポート
    * ナノ秒をサポート
* `connect` イベントをサポート

## v2.4.0 (2017-05-30)

* `internalLogger` オプションを追加
    * 内部のログは`internalLogger`を経由して出力するようになりました

## v2.4.1 (2017-07-26)

* `requireAckResponse` オプションの改善

## v2.4.2 (2017-09-26)

* socketを毎回削除するようにした（バグ）

## v2.4.3 (2017-09-28)

* リソースリークしていたので socket を毎回削除するようにしていたのをrevertした

## v2.4.4 (2017-10-10)

* winston transport のバグを修正

## v2.5.0 (2017-10-11)

* [Fluentd Forward Protocol v1](https://github.com/fluent/fluentd/wiki/Forward-Protocol-Specification-v1)のサポートを改善した
    * Message Mode, PackedForward Mode, CompressedPackedForward Mode をサポート
    * Handshake phase をサポート

## v2.6.0 (2017-10-23)

* log4js-node の 2.0 以降でlog appenderを検出する方法が変わったので[log4js-fluent-appender](https://github.com/okkez/log4js-fluent-appender)を作ったのでfluent-logger-node側でサポートしていたlog4js-node 1系のサポートをやめた

# 今後の予定

[Fluentd Forward Protocol v1](https://github.com/fluent/fluentd/wiki/Forward-Protocol-Specification-v1)の対応で残っているのがTLS対応だけなので、時間を作って対応させたいです。TLS対応が終わったら一段落です。
検索結果スクレイピング＆doc2vecで企業の業種分類（3）

[検索結果スクレイピング＆doc2vecで企業の業種分類（1）](https://qiita.com/tizuo/items/542c7484bdcee77c59fb)
[検索結果スクレイピング＆doc2vecで企業の業種分類（2）](https://qiita.com/tizuo/items/cd65b90a21e2990fffe5)
の最終回です。今回は作成したモデルをクラスタリングすべく、デンドログラムを書きます。
# 今回の構成
- [Google検索結果からのサイトURLの取得＆検索結果テキストの取得（beautifulsoup）](https://qiita.com/tizuo/items/542c7484bdcee77c59fb)
- [Doc2vecでベクトル化](https://qiita.com/tizuo/items/cd65b90a21e2990fffe5)
- デンドログラム作成←いまココ

[gensimのword2vecで語のベクトル表現を作り、その空間を試してみたい](http://pepper.is.sci.toho-u.ac.jp/index.php?%A5%CE%A1%BC%A5%C8%2F%A5%C6%A5%AD%A5%B9%A5%C8%A5%DE%A5%A4%A5%CB%A5%F3%A5%B0%2Fgensim-word2vec%A4%C7%A5%D9%A5%AF%A5%C8%A5%EB%B6%F5%B4%D6%A4%F2%BB%EE%A4%B9)を参考にDoc2vecのモデルからベクトル部分を抜き出してグラフ化しました。
最も困ったのは、Doc2vecのモデルにそのattributionはないよ、というエラーが頻発することと、普通に変更しても画像サイズが大きくならないことでした。

# ライブラリの読み込み
matplotlibとscipyを使います。

```python:
import gensim
import sys
import scipy.spatial.distance
import scipy.cluster.hierarchy
import matplotlib.pyplot as plt
import numpy as np
```
# モデルの読み込み
前回保存したモデルをロードします。

```python:
model = gensim.models.word2vec.Word2Vec.load('doc2vec.model')
```
# デンドログラム作成用にデータ成形
- タグ（ラベル）：model.docvecs.doctags　に入っています。
- 中身（ベクトル）：model.docvecs['任意のタグ名']で引いてこれます。
- 単語リスト：model.wv.vocab

ここまでわかればほとんど完成です。
タグのリストを作って、そのリストを元にモデルからベクトルを引き抜いて渡します。

```python:
vocnew = list(map(lambda x: x, model.docvecs.doctags))
voc = scipy.cluster.hierarchy.linkage(model.docvecs[vocnew])
```
# 出力
```python:
scipy.cluster.hierarchy.dendrogram(voc, labels=vocnew, ax=axes[0])
plt.show()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193707/bcab879e-ea53-426b-ccf9-bee8ebc73ff1.png)

## 画像サイズの変更
小さすぎて読めないので、画像を大きくしたいですよね。
窓分割してサイズ指定することはできたので以下にコードを書いておきます。他の方法があったら教えてください。

```python:
ig, axes = plt.subplots(2, 1, figsize=(30, 15))
```
size*100ピクセルで画像が出力されます。あまり大きいと重くなるので注意。

# おわりに
今回は体系的にまとめたかったのでデンドログラムを使いましたが、このままk-meansに適用することもできます。
企業を表すための変数としても使えるのではないかと思います。そうすると、企業名を明らかにしないままこの企業に紐づく別の変数を利用してモデルを作ったりすることができるようになります。
また何か面白い利用があったらシェアしたいと思います。
railsのカラムにそのほかを追加する方法

users index.html.slimに
```th
    = sortable "項目（country)など”、”表示される文字（国名）”　
　　　　　td 
    = user.項目（country)など```
以上のように追加する追加できる項目は
```show.html.slim```を参照
Arduinoで小さい電圧計を作ってみた（Grove化）

#Arduinoで小さい電圧計を作ってみた（Grove化）

##１．はじめに

Arduinoで電圧計を作成すること自体は他のサイトで既に行われており、私もそのサイトを参考にすることで無事作成することが出来ました。
参考サイト：http://hsh.s2jp.com/2011/09/arduino-voltmeter/

電圧計は、太陽発電してバッテリーに充電しているので、電圧を測り電池残量を計測するために作成しました。
また、Arduinoなどを入れるケースを小さくしたかったため、小型化に挑戦しました。

##２．ブレッドボードでテスト
サイトを参考にしながら正常に動作するかテストしました。
最初はブレッドボードに仮で作成しましたが、回路が間違っていたため、思った結果になりませんでした。
抵抗の種類が悪いのかなど関係のない箇所をずいぶんと調査してしまいました。
（おかげで抵抗の 1/4wとか1/2wとかの仕様の意味がわかりました。性能を保証できる電力量だったんですね。）

改めてサイトの回路を参考に電圧計を作成し、テストを行ったところ問題なく電圧を測ることが出来ました。


##３．小型化
まずは回路図を元に小型化が出来ないか手書きでスケッチを行ってから製造にかかりました。

###小型化のポイント
　・Arduinoとの接続ケーブルは取り外し可能にしたかったのでコネクタを作成。
　　※コネクタは自作しました。専用の圧着ペンチを使うことで端子を固定できます。
　　　圧着ペンチはケーブルの太さ、端子の太さを確認して少し大きめまで圧着できる工具を購入すると良いと思います。
　　
　・接続コネクタのArduino側はGroveシールドのA0と接続するように作成。
　・電源（バッテリー）との接続も取り外し可能にするためターミナルブロックを使用。

### 完成写真
![IMG_2646.jpg](https://qiita-image-store.s3.amazonaws.com/0/191429/07c45aee-21d7-7ba4-1edf-9bbc53d6376a.jpeg)
![IMG_2647.jpg](https://qiita-image-store.s3.amazonaws.com/0/191429/98e31d8a-7861-8fab-3e10-a80a94ffc6c4.jpeg)
![IMG_2645.jpg](https://qiita-image-store.s3.amazonaws.com/0/191429/39e32b04-a354-de1b-0956-3cd9a3ad0a75.jpeg)

　
##４．テスト
　動作テストを行いました。
　
　①テスターを使い、各端子が通電しているかチェック。
　②通電してはいけないところがつながっていないかチェック。
　③Arduinoを接続、電圧を測ってみて正しい値が取得できているかチェック。
   テスターで計測：1.32v
   自作の電圧計で計測：1.28v～13.0v
   
　 電池残量の増減を知りたいだけなので、今回はこの精度でOKとしました。

###テストコード
※今回は3.3vでArduino MEGAを動作させているので、参考サイトの電圧数だけ変更(5vから3.3v）にしています。

```cpp
void setup()
{
  Serial.begin(9600UL);
}

void loop()
{
  double value = analogRead(A0);
  value *= 3.3;
  value /= 1024;
  value /= 30;
  value *= 130;
  Serial.println(value);
  delay(1000);
}
```

###シリアルモニタの出力結果
![計測値.png](https://qiita-image-store.s3.amazonaws.com/0/191429/e93d2ab7-3e7a-7205-f3a8-54a5b80befee.png)

##５．まとめ
　参考サイトがあったおかげで無事に電圧計を作成することが出来ました。
　電圧計の小型化は小さくしすぎたため、放熱などが少し心配です。次作るならもう少し余裕のある大きさで作成したいと思います。
　ハンダ付けや端子の圧着ペンチの扱いなど工作技術が少しずつ向上してきました。
　電子回路の知識はまだまだですので、少しずつ勉強して行きたいと思います。
macOS の find コマンドで正規表現を使い、複数の拡張子を検索する

## TL;DR

```shell-session
$ find -E . -type f -iregex ".*\.(png|jpe?g)" 
```

## 経緯

### とりあえずググって調べると...

### -name と -or を使う方法を発見する。

`$ find . -type f \( -name "*.png" -or -name "*.jpg" -or -name "*.jpeg" -name "*.PNG" -or -name "*.JPG" -or -name "*.JPEG" \)`

##### 大文字、小文字を区別するので記述が長い。かなりイマイチ。

---

### -iname を発見する。

`$ find . -type f \( -iname "*.png" -or -iname "*.jpg" -or -iname "*.jpeg" \)`

##### 大文字、小文字を区別しないので記述が少し短くなった。

---

### 正規表現を発見する。 しかし ERROR になる。

`$ find . -type f -regex ".*\.(png|jpg|jpeg|PNG|JPG|JPEG)" `

##### なんでだ？ `man`してみる

---

### `$ man find` で　-E　オプションを発見する。

>-E      Interpret regular expressions followed by -regex and -iregex primaries as extended (modern) regular expressions rather than basic regular expressions (BRE's).  The re_format(7) manual page fully describes both formats.

##### 直訳すると

>-E 基本的な正規表現 (BRE) ではなく、-regex と -iregex のプライマリに続く正規表現を、拡張された (現代的な) 正規表現として解釈します。re_format(7) のマニュアルページでは、両方のフォーマットについて完全に説明しています。

---

### -E オプションで成功した。

`$ find -E . -type f -regex ".*\.(png|jpg|jpeg|PNG|JPG|JPEG)" `

##### 大文字、小文字を区別するので記述が長い。

---

### -iregex で記述すると大文字、小文字を区別しない。 

`$ find -E . -type f -iregex ".*\.(png|jpg|jpeg)"`

##### まだ`jpg`と`jpeg`のダブり感がある

---

### `jpg|jpeg`をさらに短縮させる。

`$ find -E . -type f -iregex ".*\.(png|jpe?g)"`

`jpe?g`の`?`は直前の文字（この場合は `e` ）が0回または1回出現することを意味する

##### これが最短か？

---

### オマケ

`$ find -E . -type f -iregex ".*.(png|jpe?g)" `

##### これでも動く。

---

### これは動かない。

`$ find -E . -type f -iregex "*.(png|jpe?g)" `

##### 参考：[findの正規表現は完全一致で](http://tekitobibouroku.blog42.fc2.com/blog-entry-75.html)
railsのカラムに最終ログイン日時を追加する方法

viewsのindex.html.slimに
```th
          = sortable "current_sign_in_at", "最終ログイン"```

```td
            = user.current_sign_in_at```
と追加すると実質的な最終ログイン日時が表示される。
またカラムに「最終ログイン」と表示される。

詳しくはhttp://www.uosansatox.biz/entry/2017/08/31/130238を参照。
C++ の boost ライブラリで多倍長浮動小数点数を扱う

#多倍長浮動小数点数とは

C++ には浮動小数点数を扱うための標準のデータ型として，float (32 bit) や double (64 bit) が存在します．

float と double の有効桁数はそれぞれ 7桁，16桁です．

これに対し，多倍長浮動小数点とは仮数部の桁数をより多く設定できる数です．
すなわち，float や double と比較してより多くの有効桁数を持つ数のことを指します．

本記事では，C++ において boost ライブラリを用いて多倍長浮動小数点数を扱う方法を簡単に紹介します．

なお，本記事が扱う内容は [Boost日本語情報サイト](https://boostjp.github.io/tips/multiprec-float.html) でわかりやすくまとめられているので，詳しく知りたい方はこちらをご覧ください．

#Boost Multiprecision Library
本記事は Boost ライブラリのプロジェクトのひとつである Boost Multiprecision Library を用います．
（Boost のインストール方法については割愛させていただきます．）

Boost Multiprecision Library には以下の二つの多倍長浮動小数点数が用意されています．

```
cpp_dec_float_50   //仮数部が 50 bit
cpp_dec_float_100  //仮数部が 100 bit
```

それでは，具体的な例を用いてそれぞれの有効桁数を確認してみます．

以下のプログラムは 2.0 の平方根を計算するプログラムです．

```
#include <iostream>
#include <cmath>
// Boost Multiprecision Library を include
#include <boost/multiprecision/cpp_dec_float.hpp>
using namespace std;
namespace mp = boost::multiprecision;

int main()
{
    float w = 2.0;
    float sqrt_w = sqrt(w);
    double x = 2.0;
    double sqrt_x = sqrt(x);
    mp::cpp_dec_float_50 y = 2.0;
    mp::cpp_dec_float_50 sqrt_y = sqrt(y);
    mp::cpp_dec_float_100 z = 2.0;
    mp::cpp_dec_float_100 sqrt_z = sqrt(z);

    cout << "float      : " << std::setprecision(std::numeric_limits<decltype(w)>::digits10 + 1) << sqrt_w << endl;
    cout << "double     : " << std::setprecision(std::numeric_limits<decltype(x)>::digits10 + 1) << sqrt_x << endl;
    cout << "float_50   : " << std::setprecision(std::numeric_limits<decltype(y)>::digits10 + 1) << sqrt_y << endl;
    cout << "float_100  : " << std::setprecision(std::numeric_limits<decltype(z)>::digits10 + 1) << sqrt_z << endl;
}
```

出力結果は以下の通りです．

```
float      : 1.414214
double     : 1.414213562373095
float_50   : 1.41421356237309504880168872420969807856967187537695
float_100  : 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727
```

その差は歴然で，多倍長浮動小数点数を用いた場合は float や double と比較して有効桁数が圧倒的に多くなっていることがわかります．

これらのデータ型の使用方法は非常に簡単です．
プログラムから分かる通り，`boost::multiprecision::cpp_dec_float_50` や `boost::multiprecision::cpp_dec_float_100` というデータ型が用意されているので，それを float や double といった通常のデータ型と同様に扱うだけです．

# まとめ

非常に簡潔な説明でしたが，C++ では Boost Multiprecision Library を用いて多倍長浮動小数点数を扱うことができます．
それらの有効桁数は build-in の float や double と比較して非常に大きいことがわかります．

数値計算系の実装をする際などに参考にしていただければと思います．
[Android] Android Studio 3.0 Stable channel now available

1. [Preview] (https://androidstudio.googleblog.com/2017/10/android-studio-30-now-available.html)

2. [Developers Blog](https://android-developers.googleblog.com/2017/10/android-studio-30.html)

3. [Release Note](https://developer.android.com/studio/releases/index.html#3-0-0)

# Android Plugin for Gradle 3.0.0

The new Android plugin for Gradle includes a variety of improvements and new features, but it primarily improves build performance for projects that have a large number of modules. When using the new plugin with these large projects, you should experience the following:

Faster build configuration times due to new delayed dependency resolution.
Variant-aware dependency resolution for only the projects and variants you are building.
Faster incremental build times when applying simple changes to code or resources.

`Note: These improvements required significant changes that break some of the plugin's behaviors, DSL, and APIs. Upgrading to version 3.0.0 might require changes to your build files and Gradle plugins.`

This version also includes the following:

- Support for Android 8.0.
- Support for building separate APKs based on language resources.
- Support for Java 8 libraries and Java 8 language features (without the Jack compiler).
- Support for Android Test Support Library 1.0 (Android Test Utility and Android Test Orchestrator).
- Improved ndk-build and cmake build speeds.
- Improved Gradle sync speed.
- AAPT2 is now enabled by default.
- Using ndkCompile is now more restricted. You should instead migrate to using either CMake or ndk-build to compile native code that you want to package into your APK. To learn more, read Migrate from ndkcompile.

For more information about what's changed, see the Android Plugin for Gradle Release Notes.

If you're ready to upgrade to the new plugin, see Migrate to Android Plugin for Gradle 3.0.0.
Project 内に Swagger Document を同梱する方法


## 1 Swagger Editor で Swagger を書く

https://editor.swagger.io/

プロジェクト内の適当な箇所に Yaml を配置する

## 2 環境構築

````
$ npm i json-refs swagger-ui-dist --save
````

## 3 コマンド記述

サンプルは Makefile で

````
swagger:
	rm -rf public/swagger
	cp -R ./node_modules/swagger-ui-dist public/swagger
	sed -i -e 's/http:\/\/petstore\.swagger\.io\/v2\/swagger\.json/\.\/swagger.json/' public/swagger/index.html
	./node_modules/.bin/json-refs resolve document/swagger/api.yml > public/swagger/swagger.json
````

上記例では、`public/swagger` フォルダに 展開しているので、上手くホスティングすれば、Swagger ドキュメントが確認できる。

## 備考

json-refs コマンドは yaml の json化だけでなく、`$ref`をつかった 外部参照にも対応しているので便利
LaravelでFromに遷移してきた時のRadioのデフォルト値の設定とSubmitで弾かれた時のRadioの値の維持


#前提
好きな食べものとして、AppleかBananaかを選ぶラジオボックスがあるとする。
「Banana」を選択してた状態でsubmitしたが、他の必須項目で未入力があり登録が完了せず戻ってきた際に「Banana」の選択状態が解除されていたので維持したい。
ついでに、このFormにきた際はデフォルトでAppleを選択状態にしておきたい。

#使う関数
`old()`

old()に関して
>
Laravel also provides a global old helper. If you are displaying old input within a Blade template, it is more convenient to use the old helper. If no old input exists for the given field, null will be returned:

```
<input type="text" name="username" value="{{ old('username') }}">
```

参考URL
[Accessing The Request](https://readouble.com/laravel/5.5/en/requests.html)

#普通にold()を書くだけだと
```
<input type="radio" name="like" id="apple" value='apple' {{ old('like') == 'apple' ? 'checked' : '' }}>
<label for="apple">Apple</label>

<input type="radio" name="like" id="banana" value='banana' {{ old('like') == 'banana' ? 'checked' : ''}}>
<label for="banana">Banana</label>
```

見たら分かるかもしれないが

```
{{ old('like') == 'apple' ? 'checked' : '' }}
```

formをsubmitしてValidateでの戻ってきた際にセッションのフラッシュデータと比較して同じであれば`checked`状態にするのだが

これだけだとFormページに遷移された時にどちらも選択されていない状態である

jsでcheckedにすることも可能だがlaravelだけで済ませたい場合は`old()に第2引数としてデフォルト値を指定`することで解決する

>You may pass a default value as the second argument to the input method. This value will be returned if the requested input value is not present on the request:

```
$name = $request->input('name', 'Sally');
```

参考URL
[Accessing The Request](https://readouble.com/laravel/5.5/en/requests.html)


#デフォルトでAppleを選択状態にさせておく

```
<input type="radio" name="like" id="apple" value='apple' {{ old('like','apple') == 'apple' ? 'checked' : '' }}>
<label for="apple">Apple</label>
```

`old('like','apple') == 'apple' `でデフォルトをinput valueと同じ値にしておけばよい

#Checkboxの場合
radioボタンの場合、何かしらの値が戻ってきますが(radioの時の例を使うと、AppleかBananaのどちらかがold('like')でとれる。つまり、例外を除いて何かしらのradio項目を選択した状態でsubmitすると仮定する)

Checkboxの場合チェックを入れなかった場合old('要素class名')で取得すると`null`が返ってきます。

ですので単純に

```
<input type="checkbox" name="apple" {{ old('apple') ? 'checked' : '' }}>
```

でnullでなければ選択状態にする。ことはできるのですが、
問題になってくるのは`デフォルトで選択状態にしたい場合`です。

デフォルトで選択状態にしたい場合、
このCheckboxが置いてあるFormに遷移してきたときも`old('apple')`は`nullだけどcheckedにしたい`、でもバリデーションで`nullが戻ってきた時はcheckedを外したい`。
となり、先程のコードではどちらも満たすことができません。

この問題を解決するには`$errors->any()`の値を見ると解決することができます。


`$errors->any()`は、バリデーションで引っかかった際に`true`を返します。

ですので、今回の場合、

- old('apple')が`true`(選択されてた場合はtrue)
- $errors->any()が`false`(Formに遷移してきた際はfalse状態)

どちらかの条件を満たす場合に`checked`状態にすればいいので以下のような判定式にすることで解決します

```
<input type="checkbox" name="apple" {{ old('apple') || !$errors->any() ? 'checked' : '' }}>
```
Mac版UnrealEngineのLightingBuildが動かないときのチェック項目

#Tl;Dr
- ファイアウォールでUE4Editorとのネットワーク通信が遮断されている可能性がある
    - SwarmAgent(Windows)やUnrealLightmass(Mac)はネットワークを通じてデータのやり取りをするため


# 詳細

※設定箇所はお使いのMacにより異なります
`画像はOS X Sierraのもの`

## 標準のFirewallを使用している人
- `システム環境設定 > セキュリティとプライバシー > ファイアウォール`のファイアウォールオプションをチェック  
一覧に`UE4Editor`と`UnrealLightmass`がない場合は通信が遮断されている可能性あり。追加しよう。
<img width="671" alt="スクリーンショット 2017-10-26 15.47.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/117589/a04bc41e-0565-2cc4-3e62-aef0efdd6140.png">

## その他のパーソナルファイアウォールを利用している人
- 各ベンダーの設定方法を確認すること


## 蛇足
- ESETは設定がわりと面倒。UE4のバージョンアップごとに設定を追加せねばならない…
angular-seedで@ngrx/storeを使う時に発生するエラーの回避方法

`@ngrx/store`はangularの状態をいわゆるredux的に管理できるようにしてくれる便利なツール。今回angular-seed環境で開発しているangularアプリに`@ngrx/store`を導入した時に発生したエラーの回避策について書いておく。

## ビルド時（実装時）

`@ngrx/store`　を読み込んだファイルのビルドを走らせると、以下のようなエラーが発生。

```
localhost/:62
SyntaxError: Unexpected token <
    at eval (<anonymous>)
    at evaluate (http://localhost:5555/node_modules/systemjs/dist/system.src.js?1507880419240:2821:16)
    at http://localhost:5555/node_modules/systemjs/dist/system.src.js?1507880419240:3620:21
    at dynamicExecute (http://localhost:5555/node_modules/systemjs/dist/system.src.js?1507880419240:1144:26)
    at doEvaluate (http://localhost:5555/node_modules/systemjs/dist/system.src.js?1507880419240:1091:13)
    at ensureEvaluate (http://localhost:5555/node_modules/systemjs/dist/system.src.js?1507880419240:999:13)
    at http://localhost:5555/node_modules/systemjs/dist/system.src.js?1507880419240:1017:20
    at Object.eval (http://localhost:5555/app/app.module.js:14:15)
    at eval (http://localhost:5555/app/app.module.js:65:4)
    at eval (http://localhost:5555/app/app.module.js:66:3) Not expecting this error? Report it at https://github.com/mgechev/angular-seed/issuese
```

`tools/config/projct.config.ts`の中の`additionalPackages`の配列に以下を追加する。

```ts
  let additionalPackages: ExtendPackages[] = [

    ...

    {
      name: '@ngrx/store',
      path: 'node_modules/@ngrx/store/bundles/store.umd.js'
    },
  ],
```

### 参考

 - https://github.com/mgechev/angular-seed/issues/457#issuecomment-287374671


## テスト実行時

テストコードを書く時も同様。何も設定せずにテストを実行すると以下のようなエラーが出る。

```
26 10 2017 15:15:35.117:WARN [web-server]: 404: /base/node_modules/@ngrx/store/bundles/store.umd.js
Chrome 61.0.3163 (Mac OS X 10.12.6) ERROR: 'Error: Fetch error: 404 Not Found
    at http://localhost:9876/base/node_modules/systemjs/dist/system.src.js?aebe9c95220342ad600bf928e092893ef1e9c861:1478:13
    at ZoneDelegate.invoke (http://localhost:9876/base/node_modules/zone.js/dist/zone.js?082dc1d83c7a42ddda9b652319d281eef1d450d5:391:26)
    at Zone.run (http://localhost:9876/base/node_modules/zone.js/dist/zone.js?082dc1d83c7a42ddda9b652319d281eef1d450d5:141:43)
    at http://localhost:9876/base/node_modules/zone.js/dist/zone.js?082dc1d83c7a42ddda9b652319d281eef1d450d5:818:57
    at ZoneDelegate.invokeTask (http://localhost:9876/base/node_modules/zone.js/dist/zone.js?082dc1d83c7a42ddda9b652319d281eef1d450d5:424:31)
    at Zone.runTask (http://localhost:9876/base/node_modules/zone.js/dist/zone.js?082dc1d83c7a42ddda9b652319d281eef1d450d5:191:47)
    at drainMicroTaskQueue (http://localhost:9876/base/node_modules/zone.js/dist/zone.js?082dc1d83c7a42ddda9b652319d281eef1d450d5:584:35)
    at <anonymous>'
```

`Karma.conf.js`の中の`files`の配列に以下を追加する。

```js
  files: [

    ...

    // @ngrx/store
    {
      pattern: 'node_modules/@ngrx/store/bundles/store.umd.js',
      watched: true,
      included: false,
    },
  ],
```

## まとめ

とりあえず、この2つの設定をしておけば、今の所他にエラーは出ていない。他に問題が発生した場合は、追記していく。
ardrone_autonomy 使い方

#ドローンコマンド集
##ARドローン(単機)
- シミュレータ起動
roslaunch cvg_sim_gazebo ardrone_testworld.launch

- 実機との接続（roscore起動前提）
rosrun ardrone_autonomy ardrone_driver
   - ipアドレスが192.168.1.1以外のドローンと接続するときは-ip ipアドレス　を最後につける

- 状態確認
rostopic echo /ardrone/navdata

- 移動
rostopic pub /cmd_vel geometry_msgs/Twist "linear:
  x: 0.1
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0"
  - *linear zは上下、angular zはスピン、　

- 離陸用コマンド
rostopic pub /ardrone/takeoff std_msgs/Empty

- 着陸用コマンド
rostopic pub /ardrone/land std_msgs/Empty

- カメラ　
  - 前面
rosrun image_view image_view image:=/ardrone/front/image_raw
  - 下
rosrun image_view image_view image:=/ardrone/bottom/image_raw
  - 切り替え
rosservice call /ardrone/togglecam

    - 同時に2台つなげると後のほう優先で処理される

参考リンク
http://tako104.way-nifty.com/blog/2017/05/ar-drone.html
https://www.ntt-tx.co.jp/column/yasui_blog/20160106/

##ARドローン（複数）
- 実機との接続

  - ipアドレスや名前の変更、接続台数を増やすにはlaunchファイルを編集（たぶん）

- 操作方法
　基本的には単機と一緒、ただし各コマンドの/ardrone/…の前に名前を加える必要がある。
　例）rostopic echo ardrone1/ardrone/navdata
参考リンク
https://github.com/AutonomyLab/ardrone_autonomy/issues/56
（特に2014/4/8の投稿）

##tum_ardrone
- GUI起動
  rosrun tum_ardrone drone_gui

- キー操作
  o　右回転
  u　左回転
  i　前進
  k　後進
  l　右
  j　左
  d　着陸
  s　離陸
  q　上昇
  a　下降
ドローンのためのROS

# ROS導入
##はじめに
ROSを導入するOSはLinuxにしましょう。自分はUBUNTU LTS 14.04を使ってます。以降にあるコマンドはすべて端末で入力する用です。
## 1.ROS
    $sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'
    $wget http://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add -
    $sudo apt-get update
    $sudo apt-get install ros-indigo-desktop-full
    $sudo rosdep init
    $rosdep update
    $echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
    $source ~/.bashrc
    $sudo apt-get install python-rosinstall

    $roscore   //動作確認用

ROSで始めるロボットプログラミング

## 2.ワークスペース
ワークスペースとはROSでいろいろいじる場所のことで、それを作ります。
    
    $mkdir -p ~/catkin_ws/src
    $cd ~/catkin_ws/src
    $catkin_init_workspace
    $cd ~/catkin_ws
    $catkin_make

~./bashrc の一番下の行source ~/catkin_ws/devel/setup.bashに

## 3.パッケージ
パッケージとは自分のプログラムをまとめて置いておくところで、ワークスペースの中に作ります。
  
    $cd ~/catkin_ws/src
    $catkin_create_pkg ros_start rospy roscpp std_msgs//ros_startのところは好きな名前で
    $cd ~/catkin_ws
    $catkin_make
    $source ~/catkin_ws/devel/setup.bash


## 4.ardrone_autonomy?
これを入れるとARドローンが動かせるようになります。細かい動かし方は別ページで

    $ cd ~/catkin_ws/src
    $ git clone https://github.com/AutonomyLab/ardrone_autonomy.git -b indigo-devel
    $ cd ~/catkin_ws
    $ rosdep install --from-paths src -i
    $ catkin_make

[http://ardrone-autonomy.readthedocs.io/en/latest/installation.html](http://ardrone-autonomy.readthedocs.io/en/latest/installation.html)

##5.tum_ardrone
    $cd catkin_ws/src
    $git clone https://github.com/tum-vision/tum_ardrone.git -b indigo-devel
    $cd ..
    $rosdep install tum_ardrone
    $catkin_make
  http://tako104.way-nifty.com/blog/2017/05/ar-drone.html

##6.bebop_autonomy（動作未確認）
    $sudo apt-get install build-essential python-rosdep python-catkin-tools
    $mkdir -p ~/bebop_ws/src && cd ~/bebop_ws
    $catkin init
    $git clone https://github.com/AutonomyLab/bebop_autonomy.git src/bebop_autonomy
    $rosdep update
    $rosdep install --from-paths src -i
    $catkin build
http://bebop-autonomy.readthedocs.io/en/latest/installation.html
Evernote for Mac でコードブロック（β）機能が存在しない場合の対策方法

## TL;DR

App Store 経由の Evernote for Mac には、コードブロック（β）機能が存在しない。[Evernote本家サイト](https://evernote.com/intl/jp) から最新版 Evernote をダウンロード。ダウンロード版の上書きインストールでコードブロック機能が表示される。

### 参考
[Evernote for Mac 6.5 Beta 1 (453071 Direct) でコードブロック登場](https://qiita.com/szk-3/items/e9b5dd4f5895558e8d16)
HubotでCoffeeScriptを使うのでコードの書き方メモ

# 概要
- Hubotを使うときのCoffeeScriptの書き方メモ

# 基礎編
## サンプルコード
```coffeescript:hello.coffee
module.exports = (robot) ->
  robot.hear /hello/, (msg) ->
    msg.reply 'hi'
```
「hello」と話しかけると「hi」と返信してくれるスクリプトです。

### 簡単な説明
```
module.exports = (robot) ->
```
Node.jsのモジュールをrobot引数で作っている(?)

```
robot.hear /hello/, (msg) ->
  msg.reply 'hi'
```
Robotクラスのインスタンスからhearメソッドを呼び出している。
/hello/は正規表現で受け取る発言を指定。
マッチしたらreplyメソッドによって'hi'と返信してくれる。

## 主要メソッド
### サンプルコード
```coffeescript:sample.coffee
module.exports = (robot) ->
  robot.hear /foo/i, (msg) ->
    msg.send "bar"

  robot.respond /hoge/i, (msg) ->
    msg.reply "fuga"
```

### チャットに反応させる
メソッドが2種類ある

- hear
- respond

#### hear
チャットに出てきたら反応する。
/foo/iにマッチしてたら会話の途中に出てきても反応する。
意図しないときに反応する可能性がある。

#### respond
HUBOT_NAMEもしくはHUBOT_ALIASが文頭に存在する場合のみ反応する。
例: 'piala-bot hello'

### Hubotに発言させる
メソッドが2種類ある

- send
- reply

#### send
Hubotに発言させることができます。

#### reply
発言者に対して返答してくれます。
Adapterによって返答の定義が異なるようです。

# 応用編
## Botに1つ選んでもらう
```coffeescript:select.coffee
module.exports = (robot) ->
  robot.hear /(.+)から選ぶ/, (msg) ->
    items = msg.match[1].split(/[　・、\s]+/)
    item = msg.random items
    msg.reply "#{item}"
```

### 結果
```bash
hubot > りんご、ばなな、ぶどうから選ぶ
hubot > ばなな
```

#### msg.match
正規表現にマッチした結果を返します。
なので、**りんご、ばなな、ぶどう** を返しています。

#### msg.random
Arrayからランダムで一つ返します。
**[りんご, ばなな, ぶどう]**から**ばなな**を返しています。


# 参考記事
[簡単な Hubot スクリプトをもっとつくろう (おみくじ系)](https://qiita.com/bouzuya/items/2e935c99647b93d8ee1d)
iOSブラウザにおけるリンク下線について（-webkit-text-decoration-skip）

##現象
iOSのウェブサイトを見ているとリンクの下線が文字に被っていて線が欠けているものがあった。
対象ブラウザ：chrome、safari

![リンク下線.png](https://qiita-image-store.s3.amazonaws.com/0/94307/b3d8074b-95d6-8f3c-ce6a-335625bb108d.png)

調べていくとこれはOSの問題らしくしかも日本語のときによく発生するものらしい。

-> 要は~~バグ~~と考えて良さそう、だが日本語しか起きてなさそうということを考えると今後修正はされないだろう。




##解決策
解決策は下記を挿入してあげると線がしっかり引かれる。

```css:css
a {
  -webkit-text-decoration-skip: none;
}
```


ただし、途中で英語がはいったりすると・・・・
<img width="216" alt="dO3u0594249483d5a1cac6e83fb58.png" src="https://qiita-image-store.s3.amazonaws.com/0/94307/587ed245-fabe-c54b-6a1e-897c24e104bd.png">
線と文字が被り可読性が悪くなり、調製が必要である。

##参考
CSS Text Decoration Module Level 3
https://www.w3.org/TR/css-text-decor-3/#underline-under
【tmux】Escやプレフィックス打った時の反応が遅い？？それどうにかなります

僕はプレフィックスを、
`cotrol + [`
に設定しているため、
コピーモードに移るときは
`[`
のキーをチョチョンっと連打するのですが、どうもデフォルトの状態だと、
プレフィックスキーを打ってからそれをプレフィックスと認識するまでに時間がかかります。（1秒くらい）

どうにかならんかな・・・って思ってたのですがどうにかなりました。


~/.tmux.confに

`set -sg escape-time 1`

を追加するだけでいけます。

幸せいっぱいですね。


追記
記事の内容とはあまり関係ありませんが、
`control + [`
は
Esc（エスケープキー）
と同値のためやめたほうがいいです。（僕はやめました）
viでファイル編集して保存するとなんか変な挙動になるなと思ったら・・・
LaravelでDB上はhasManyだけど1件だけ取りたいときはhasOneを使うといい

## どういうことか

Userが複数のPostを持っていて、その最新の1件だけ表示したいとき、公式ドキュメントに従うと

``` php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function posts()
    {
        return $this->hasMany('App\Post');
    }
}
```

とhasManyリレーションを定義して

``` php
$user->posts()->orderBy('created_at', 'desc')->first();
```

と書くのが一般的だと思いますが、最新の1件しか要らないことが予め分かっている場合

``` php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function latestPost()
    {
        return $this->hasOne('App\Post')
            ->orderBy('created_at', 'desc');
    }
}
```

とhasOneで定義して

``` php
$user->latestPost;
```

と書くこともできます。

## ほんとうか

[HasManyクラスのソース](https://github.com/laravel/framework/blob/86abc0648b62b52967f8d2f4884bdca982f5f75c/src/Illuminate/Database/Eloquent/Relations/HasMany.php)と[HasOneクラスのソース](https://github.com/laravel/framework/blob/86abc0648b62b52967f8d2f4884bdca982f5f75c/src/Illuminate/Database/Eloquent/Relations/HasOne.php)を見ると、hasManyでは

``` Illuminate/Database/Eloquent/Relations/HasMany.php
public function getResults()
{
    return $this->query->get();
}
```
となっているのに対し、hasOneでは

``` Illuminate/Database/Eloquent/Relations/HasOne.php
public function getResults()
{
    return $this->query->first() ?: $this->getDefaultFor($this->parent);
}
```

としているだけですので、Query Builderの使い方としても正しいと言えます。

## どうやって使い分けるか
今回のPostsの例でいうと、いずれにせよ一覧表示などを作ると思いますので、hasManyを定義したほうがいいです。
実際の業務で「有効期間内の最新のキャンペーンのみ適用したい」という場面があり、明らかに1件しか使わないのにDB上は古いキャンペーンが残ってしまうので、そのような場合hasOneで定義した方が有効だと思いました。
SmartGit > Tagsの並び替え > Sort Refs by Commit Time | 複数回の分岐後のプログラムTag履歴を追いやすくする工夫 > {old[分岐前プロジェクト固有番号]}/v0.1.0

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
SmartGit付属のMinGW32
grep (GNU grep) 2.24
head (GNU coreutils) 8.25
```

### やりたいこと

- リポジトリから別リポジトリへ分岐
- さらに別リポジトリへ分岐
- さらに...

というようにリポジトリを分岐していった時点で、Tagsの履歴を追えるようにしたい。

[git > バージョンTagをどこまで残すのか > git タグの付け替え > $git tag v2.0 v1.0 > foo/barタグ / {old}/v0.3.2タグ](https://qiita.com/7of9/items/0745bba8445facb4c3dd)
にて教えていただいた方法は{old}/というプリフィックスをつける方法だった。

SourceTreeでは{old}/というタグで折りたたみできるが、SmartGitでは折りたたみはできないようだ。
また、SmartGitのデフォルト設定では、以下のような順番になっている。

- {old}/v0.9.0
- {old}/v0.10.0
- {old}/v0.10.1

Tagsをコミット日時降順にしたい。

### Tagsの並び順設定

Branchesペインの右上にあるバーガーメニュ(三本線)をクリックするとTagsの設定ができるようだ。
「Sort Refs by Commit Time」を選択することで、Tagsが最新のものを最上部にすることができる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e3487b3c-37b9-4bf1-e245-a470dc595add.png)

分岐後に`v0.1.0`などのタグは`{old[分岐前プロジェクト固有番号]}/v0.1.0`のようにすることで、過去のTagsの追跡がしやすいようになると期待している。

- v0.2.1
- v0.2.0
- v0.1.0
- {old3080}/v1.0.0
- {old3080}/v0.9.0
- {old3080}/v0.8.0
- {old3055}/v1.0.0
- {old3055}/v0.7.3
- {old3055}/v0.7.2

@ C++のためのAPIデザイン by マーティン・レディ
推薦のことば by 手島孝人さん
> ピクサー社内のソースコードレポジトリをみてみると、古いものでは80年代に記述されたプログラムからすべての改変の履歴が残されていました。

長期のソース管理において、参照しやすい形で残すことが大切だと思う。
【tmux】設定ファイル(.tmux.conf)を編集し、即時反映・適用させる方法

今まで設定ファイルを書き変えたあと、tmuxから一度抜けて、再度tmuxとうってたのですが、
これどうも反映されないんですね。（おそらくtmuxの全プロセスを落としきらないとダメ）

まじかー、と思っててなんかsource的なコマンドないのかなぁと思っていたのですがありました。
もうそのまんまありました。

設定ファイルを編集あとに、

`tmux source ~/.tmux.conf`

なんとこれでいけます。

しかも別の窓上のtmuxにも即時反映されるのです。幸せいっぱいですね。
雑にJava9を試してみる

適当にDockerを準備します。

```
FROM java:9
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD ["java", "Main"]
```

`takeWhile`が新しく導入されたようです。
久々にJavaを触ったんですが、色々変わってて面白いですね。

```java
import java.util.stream.Stream;

public class Main {
  static public void main(String[] args) {
    Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
      .takeWhile(i -> i < 5)
      .forEach(System.out::println);
  }
}
```

実行します。

```
$ docker build -t my-java-app .
$ docker run -it --rm --name my-running-app my-java-app
1
2
3
4
```

よさそうですね。

jshellも試してみます。

```
$ docker run -it my-java-app jshell
```

![スクリーンショット 2017-10-26 05.14.33.png](https://qiita-image-store.s3.amazonaws.com/0/15319/094af2b1-822e-b1ac-e418-384485208890.png)

補完もされるし、すぐに試せていいですね。
REPLがあるとやはり便利です。
VSCode で拡張を作る時の参考情報

# 概要

lint 系の拡張を作りたかったので、はじめるにあたって参考になりそうなサイトをさがしはじめた

# まとめ

拡張を作るときのページと、マイクロソフト製の `wordcount` の拡張と、そのドキュメントがみつかった。

* [Your First Visual Studio Code Extension - Hello World](https://code.visualstudio.com/docs/extensions/example-hello-world)

Wordcount の拡張のドキュメント

* [Visual Studio Code Example - Word Count Extension](https://code.visualstudio.com/docs/extensions/example-word-count)

Wordcount のソースコード

* [Microsoft/vscode-wordcount: Sample Word Count extension for VS Code.](https://github.com/Microsoft/vscode-wordcount)

# 外部コマンドを実行する。

たぶん `spawn` なのではないか？

vscode-chef の中に、 validateCookbooks というのがあり、そのなかで、`foodcritic` を実行する部分があった。

* [vscode-chef/extension.ts at master · pendrica/vscode-chef](https://github.com/pendrica/vscode-chef/blob/master/extension.ts#L156-L158)

```ts
		let spawn = require("child_process").spawnSync;
		let foodcritic = spawn(foodcriticPath, cookbookPaths, { cwd: vscode.workspace.rootPath, encoding: "utf8" });
		if (foodcritic.status === 0) {

```

# 外部コマンドを実行すると、思ったがどうもこれではない？(要調査)


調査する
`executeCommand`

* [Visual Studio Code Complex Commands Reference](https://code.visualstudio.com/docs/extensionAPI/vscode-api-commands)
* [Visual Studio Code API コマンド編 -vscode.commands-](https://clickan.click/vscode-command/)



# 参考情報

* [adamwalzer/vscode-scss-lint: An scss-lint extension for vscode](https://github.com/adamwalzer/vscode-scss-lint)
jenkinsのスクリプト間で変数を共有したい

jenkinsのシェルスクリプトを書いていると、スクリプトAの結果をスクリプトBで参照したい場合などがあると思います。その時の手法を紹介します。

#EnvInject Plugin
こちらのプラグインを使います。
https://wiki.jenkins.io/display/JENKINS/EnvInject+Plugin

#使い方
##シェルスクリプトAの実行
PARAMという環境変数をvariables.txtというファイルに出力保存しておきます

```shell-session:shellA
TMP="test"
echo -e "PARAM=$TMP" >> variables.txt
```

##環境変数のインジェクト
先ほど保存したvariables.txtを読み込み、そこに定義された変数を環境変数として読み込みます。
![スクリーンショット 2017-10-26 14.00.46.png](https://qiita-image-store.s3.amazonaws.com/0/202533/94fa15bf-14b1-9561-bde7-24ba5f19f22f.png)

##変数を参照する
あとは他の環境変数のようにアクセスできます

```shell-session:shellA
echo $PARAM
# -> testと出力される
```
Macのターミナルからaws-cliを利用してs3バケットにアップロードする

# 概要

- 今回は`Homebrew`で`aws-cli`をインストール
- ターミナルからバケットへのファイルアップロード
- ターミナルからバケットへの**ディレクトリ階層を維持**したファイルアップロード

# インストール

## Homebrewからインストール

ターミナルで以下コマンドを実行

```bash:command
brew install awscli
```

以下のようなメッセージが表示されればインストール完了です。

<img width="760" alt="screencapture- 2017-10-26 11.19.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/684adb34-fb45-8cf9-bc0b-1fc16fe1e727.png">

## 確認

以下のコマンドを実行

```bash:command
aws --version
```

以下のようなメッセージが表示されれば**正常**にインストール出来ています。

<img width="484" alt="screencapture- 2017-10-26 12.37.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/ffbdbf83-fedb-0876-0a6a-8297d7433b71.png">

# 準備

`aws-cli`を利用する上では**基本設定**と**アクセス情報**が必要になります。
コマンドからの生成も可能ですが、記事にまとめる上でめんどくさいので**物理的**にファイルを配置しちゃいましょう。笑

※**${}部分**は各自の設定に合わせて**変更**してください

## cofig

`aws-cli`を使う上での**基本設定**を記載したファイル。

```ini:~/.aws/config
[default]
output = json
region = ${リージョン}
```

## credentials

AWSに接続するための**認証情報**

```ini:~/.aws/credentials
[default]
aws_access_key_id = ${AWS_ACCESS_KEY}
aws_secret_access_key = ${AWS_SECRET_KEY}
```

## 確認
二つとも配置するとこんな感じ

<img width="474" alt="screencapture- 2017-10-26 12.52.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/85830651-055a-9e0a-7ca4-88be95b71922.png">

# S3操作

## 確認

まずは、以下コマンドで**バケット情報**を取得出来るか確認します。

```bash:command
aws s3 ls s3://${バケット名}
```
正常に設定ファイルが出来ていれば**フォルダ**や**オブジェクト**の情報が出力されます。

いろいろとコマンドが用意されていますが、今回は
- **オブジェクト(ファイル)の転送**
のみを行います。

## その他のコマンドについて

他のコマンドについては、
[ **公式ドキュメント** ](https://aws.amazon.com/jp/cli/)
や、別記事の
[ **aws-cli　コマンド一覧(随時追記)** ](https://qiita.com/bakira/items/8a9481c99ed56a367415)
にてまとめているので良かったら**参考**にしてください。

AWSサービスの**ほぼ全て**を操作することが出来ます！

## 単一ファイルのアップロード

以下コマンドを実行してください。

```bash:command
aws s3 cp ${ファイル名} s3://${バケット名}
```
実行して、以下のようなメッセージが表示されると**正常**にアップロードされています。

<img width="458" alt="screencapture- 2017-10-26 13.02.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/94913aa1-d7ef-2af9-f527-d683e3e6aa35.png">

## フォルダ階層を維持してのコピー

以下のような構造にて、

```bash:command
cliSampleDir
└── fuga.txt
```

**何も考えず**に以下のようなコマンドを実行すると、

```bash:command
aws s3 cp cliSampleDir/fuga.txt s3://${バケット名}
```

 **バケット直下** に「fuga.txt」が作製されます。

<img width="543" alt="screencapture- 2017-10-26 13.56.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/4fe6d407-4deb-eb8f-719f-244a7d92d5a8.png">


**フォルダ階層も維持**してアップロードしたい場合は

```bash:command
aws s3 cp ${フォルダ名}/${ファイル名} s3://${バケット名}/${フォルダ名}/
```

とする必要があります。
また、**再帰的**に全てをアップロードしたい場合は

```bash:command
aws s3 cp ${フォルダ名}/ s3://${バケット名}/${フォルダ名}/ --recursive
```

で**丸ごと**いけます。(フォルダが存在しない場合は**自動**で作製されます。)

<img width="645" alt="screencapture- 2017-10-26 13.56.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/29c1f2c6-54a5-585b-95c3-c39c3dc00431.png">

# 終わりに

**AWSマネジメントコンソール**も便利ですが、黒い画面に**ビビらず**に`cli`をどんどん使っていきましょう！！笑
CentOS7上にDockerコンテナでRedmine3をインストールしBacklogsプラグインをインストールする

ほぼ自分のための備忘録。

# CentOS7にDockerコンテナ追加し、Redmine3を構築する。
下記記事の後半にDockerを使った構築方法が記載されています。
実際に記事の手順で構築しましたがそのままの手順でRedmineへのログインまで出来ました。
https://github.com/y503unavailable/redmine-centos-ansible

redmineに関する有用な情報が得られるのでhttps://toot.redmine.jpに参加しよう！

# Backlogsプラグインを追加する。
下記Dockerコンテナ内での作業します(なのでrootです)。

```
cd /var/lib/redmine
git clone -b feature/redmine3 
git://github.com/backlogs/redmine_backlogs.git 
cd redmine_backlogs
vi Gemfile
nokogiriとcapibaraをコメントアウト(行頭に#を追加)
cd ../..
bundle install --without development test
RAILS_ENV=production bundle exec rake redmine:backlogs:install
```
以上。
[Jira][ブックマークレット] Jira向けブックマークレット集

Jira で使用する用の地味に便利なブックマークレット集

# 表示中のページリンクを Jira のコメント記法形式で取得

```js
javascript:(
    function(){
        window.prompt("以下をコピーして下さい","["+document.title.replace('|','&#124;')+"|"+location.href+"]");
    }
)();
```

# 現在表示している Jiraページ の Issue ID を取得

HOGE-123 のような課題のキーを取得する。
Gitのブランチやコミットログに記載するなど用。

対応ページは以下

+ 課題表示画面
+ 課題一覧表示画面
+ 「バックログ」で選択中の課題
+ 「アクティブなスプリント」で選択中の課題

```js
javascript: (
    function () {
        var url = location.href;
        var issueID;
        /* Jira Software RapidView (バックログ, アクティブなスプリント) */
        issueID = url.match(/selectedIssue=(.+-[0-9]+)/);
        if (issueID != null && issueID.length > 1) {
            window.prompt("以下をコピーして下さい", issueID[1]);
            return;
        }
        /* 課題表示画面 */
        issueID = url.match(/browse\/(.+-[0-9]+)/);
        if (issueID != null && issueID.length > 1) {
            window.prompt("以下をコピーして下さい", issueID[1]);
            return;
        }
        /* 課題一覧表示画面 */
        issueID = url.match(/issues\/(.+-[0-9]+)/);
        if (issueID != null && issueID.length > 1) {
            window.prompt("以下をコピーして下さい", issueID[1]);
            return;
        }
    }
)();
```