OmniAICreator/Qiita-1.07M huggingface dataset:
windows 10でvagrantでwordpressを構築する際の注意点

構築環境が整っている状態で、'vagrant up'した時にエラー出ちゃう箇所を備忘録としてて、
記載します。

# 構築環境
スペックは以下のような感じでいつも構築しています。

まずはバージョン確認

**VirtualBox**
バージョン 5.1.24 r117012 

**Vagrant**

```
> vagrant -v
Vagrant 1.9.4
```

**Vagrant BOX**
VCCWのBOXを使います。
インストールの方法と設定は以下のURLを参照
http://qiita.com/Noe/items/f3ee87ef8b9e3b1d1dc8

```
> vagrant box list
vccw-team/xenial64  (virtualbox, 20161209)
```


# ここからがよくあるエラー
site,yml内のhostnameが競合している
site,yml内のipが競合している
windowsの場合hostファイルに上記で指定したhostnameとipを追加しないと表示されません。

参照：
http://qiita.com/ha_ru_ma_ki/items/ed4c93b72e2b8c41c3b0
Visual Studioで正規表現を使ってラクラク検索・置換

#Visual Studioでコード編集

配列要素`array[0], array[1], array[2]...`を使っていたが仕様変更により配列arrayのかわりに配列listを使うことに。さらに要素指定[i]も使いたくない

つまり

```
array[0] = machin;
  ...
array[1] = toto;
  ...
array[2] = hoga;
 ↓
list = machin;
  ...
list = toto;
  ...
list = hoga;

```

##置換は便利

![vs.PNG](https://qiita-image-store.s3.amazonaws.com/0/186209/bfe4e3a1-e4b4-8aaf-e48d-4e2ab65bbe9c.png)

たとえば`array→list`程度の変換であれば`Ctrl + F`→ 左上の矢印クリックで展開し、*置換したい文字列*と*置換後の文字列*を記し、ひたすらクリック置換(`Alt + R`)または全て置換(`Alt + A`)

##正規表現を使わないと

置換したい要素数が大きい場合、もちろん全て置換をしたいところですが意図しない文字列まで置換されるのは困ります。（例えば`arrayGroup`という名前の変数がある場合。）`Alt+W`で条件を絞るのもありですが、検索条件に柔軟性をもたせたい場合、正規表現を使った検索が有効です。

また、配列のインデックスを削除したい場合、`[`,`数字`,`]`に分けて検索したらヒット数が多すぎるし手間かかりすぎて論外。`[0]`,`[1]`…のように順番に検索して空文字`""`と置換するのもナンセンスだしそもそも検索・置換の意味が無いので論外。

**そこで正規表現です**

#正規表現とは

Visual Studioでの正規表現　https://msdn.microsoft.com/ja-jp/library/2k3te2cs.aspx

さらに発展させればリンク内にあるようにコード内の任意の文字列を置換することができそうだけどここでは深く入りません。

#確認バージョン

Visual Studio 2015
正規表現なのでかなりいろんなとこで使えるはずです。

##基本

![vs.PNG](https://qiita-image-store.s3.amazonaws.com/0/186209/bfe4e3a1-e4b4-8aaf-e48d-4e2ab65bbe9c.png)
`Alt + E`または一番下列左から三番目の`.*`ボタンをクリック。

- 基本的に`+`,`[`,`(`など*特殊文字・表現のきっかけとなりそうな文字*を文字列として検索したい場合は`\`でのエスケープが必要。逆にカッコ終わり`]`,`)`はエスケープ必要なし。

##例
ここではいくつか実際に使った例をピックアップ

###[0] ~ [99]を一括で削除

検索文字:`\[(\d|\d\d)]`

####解説
※注 `|`をリスト作成のmdの都合で使えないため`::`で代用

|目的|式|例|
|:-:|:-:|:-:|
|記号を文字列として探したい|`\`+`表現したい文字`|`\[` `\(` |
|2つの表現いずれかに一致したものを探したい(or検索)|`(a::b)`|`(\d::\d\d)`|
|任意の数字を探したい|`\d`|同上。この例は「一桁又は二桁の数字を探したい」と同義|

###型intを型doubleに置換したいが`class intMachin`の名前は変えたくない

検索文字:`int(?!Machin)`

####解説
`(?!文字列)`を文字列のあとにつけるとその文字列を含んだ表現を結果から排除してくれる。
この場合`intMachinint`と書いた場合は最初の`intMachin`は無視され、ｓのあとのintが結果として出ることに成る。


#結果
規則性のあるものを一気に置換したいときは便利
他にも便利な式が多いので
https://msdn.microsoft.com/ja-jp/library/2k3te2cs.aspx
をチェックすることをおすすめ。
Raspberry Pi zero WをWindows10からUSBでssh接続する（iTunes不要）

#Raspberry Pi zero WをmDNSで接続する
Raspberry Pi zeroはUSB一本でSSH接続ができる機能が搭載されています。
USB-Ethernetというものらしいのですが、MacやLinuxから接続する分には特に設定も要らず出来るのですが、Windows10から接続しようとすると、mDNS関係で色々と設定がいたので、その時のメモを残します。

##Windows10でのmDNS
WindowsからmDNSでの接続は永らく出来ず、Bonjourを入れることが必要でした。
Windows10からはmDNSの機能が搭載されたようなので出来るのではないかと試行錯誤してみましたが、Bonjourが必要なようです。。
というのもmDNSの外部問い合わせが来た時は出来ても、自分からの問い合わせは出来ない模様です。。
なのでBonjourを入れることからスタートしますが、iTunesを入れない場合はポートの開放が必要になるのでそこもまとめていきます。

##手順
###1.こちらのサイトからBonjourを落として下さい。
https://support.apple.com/kb/DL999?locale=ja_JP&viewlocale=ja_JP

###2.mDNS用のポートを開放します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132909/b6abac76-5828-ebdb-b351-62f05a9c981d.png)

コントロールパネルを開き(Windows10 CreatorsUpdateから検索しないと出てこなくなったみたいです。。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132909/9f9338df-48d0-200a-9740-a782f94c5cc6.png)

Windowsファイアウォールをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132909/f7dd923d-ab5a-1361-fb3f-aaf36e2731f7.png)

右端の詳細設定からセキュリティの強化されたWindowsファイアウォールに入り、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132909/da0eb689-7fa9-ac34-1ad1-8e55271f6940.png)

受信の規則を右クリック、新しい規則を選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132909/e14ea5f8-df82-657e-60dc-133888ac59b2.png)

ポートを選択して次へ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132909/afaa0e1c-426c-7762-26f7-9007ea561b51.png)

UDPを選んで、特定のローカルポートを5353に指定して、そのまま次へで進んでいきます。
名前は好きなもので構いません。

###3.Bonjourをインストールする

こちらからダウンロードできます。
https://support.apple.com/kb/DL999?locale=ja_JP&viewlocale=ja_JP

##4.ドライバをインストールする
Raspberry PI zero WをUSBで接続するとCOMとして認識します。
これを解消するため以下のドライバを適用して下さい。
http://domotique.caron.ws/wp-content/uploads/telechargement/RPI%20Driver%20OTG.zip

##5.SSHを有効にする
Raspberry PI zero WにはRaspbian liteを入れるのが最適だと思いますが、最近のバージョンではSSHが無効になっています。

Raspbianの入れ方は以下のQiitaの記事が参考になると思います。（ドライバの入れ方などもこちらを参考にさせて頂きました。）
http://qiita.com/marron-akanishi/items/2ce4ae07c71dc8358093

ただ、このままではSSHが有効になっていないのでWindows上で書き込み終わったSDを開いて、bootパーティションの中にsshという名前のファイルを作成して下さい。
これで有効になります。

##接続
Tera TermなどでSSHでraspberrypi.localにアクセスしてみて下さい。
初期ユーザ名はpi
初期パスワードはraspberry
です。

[Tera Term](https://ttssh2.osdn.jp/)

##参考

[Raspberry Pi ZeroをUSBケーブル1本で遊べるようにする](http://qiita.com/marron-akanishi/items/2ce4ae07c71dc8358093)

[WindowsでBonjour (mDNS)](http://abe-law-office.jp/blog/windows_bonjour)
Android開発中にGC overhead limit exceededで逝く

# 兆候
今日はいつになくAndroid Studioの挙動が重かった。
前の仕事でもビルドが重いことがあった。
ビルドに３分４分かかることなんてザラで、ビルドするデーモンプロセスを常駐化させたりとチューニングしても効果が薄かった。

でも今日は違った。

大したコード量も書いてないし、確かにDataBinding使ったり、DIツール導入したりしたけど、そんなビルドで重くなるような要素にはならないなと。

それでも、ビルドするのに12分かかった。
どんどん重くなっていった。
そしてビルドエラーにたどり着いた。

# GC overhead limit exceeded
またポエム書いちゃった。

単刀直入に言えば、
`transformJackWithjackfordebug` というタスクでビルドエラー吐く。
そのあとに続くメッセージが
`GC overhead limit exceeded`　だった。

詳しく分析してないけど、gradleのスクリプト走らせる時のJVMのヒープサイズが小さいとよく起こる問題らしい。
jackコンパイラがヒープめっちゃ使うのかも。

なお

```groovy
android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8 
    }
}
```

を指定している前提でした。

# 解決方法
```groovy
android {
    dexOptions {
         javaMaxHeapSize "2g"
    }
}
```

これ指定するだけで、ビルドからエミュレータまでの転送時間が２、３秒になった。
うそでしょ

# 追記
[Androidアプリのビルドを高速化するDex In Processが有効になる条件](http://qiita.com/takahirom/items/ee2ff0603679922705d7)
この記事によると、 `gradle.properties` の
`org.gradle.jvmargs` の値を `javaMaxHeapSize` を超えてないとダメみたい。

こういう関係性
`javaMaxHeapSize` < `org.gradle.jvmargs`


# 追伸
同じエラーで、これで解決しなかったらごめんなさいm(_ _)m
rubyでオブジェクトの形式を変換する

* to_i
    * 10進数の整数にする
* to_f
    * 浮動小数点の整数に変換
* to_a
    * to_aメソッドは、ハッシュを配列に変換して返します。[キー, 値]を並べた配列の配列ができます。
* to_h
    * 配列をハッシュに変換する。


```ruby:test
s = "1993"
puts s.to_i

s = "3.1415"
puts s.to_f

scores = { "Alice" => 50, "Bob" => 60, "Carol" => 90, "David" => 40 }
p scores.to_a
→[["Alice", 50], ["David", 40], ["Carol", 90], ["Bob", 60]] 

```
Rancherに追加したホストをdocker-machineにインポート

## 概要

Rancherでマシンドライバーを使って追加したホストをdocker-machineにインポートする方法です。

## 手順

インポートは以下の手順で行います。

 - 1) Rancherサーバからdocker-machineで使うファイル一式(マシン設定)をダウンロード
 - 2) ローカルマシン上の所定のディレクトリ配下に展開
 - 3) `docker-machine`コマンドに`-s`オプションを指定して起動

> なお、今回は解説しませんが、ダウンロードしたマシン設定ファイル(config.json)の中のパスを書き換えることで任意のディレクトリを使用してインポートする方法もあります。
  
## 前準備

以下はあらかじめ準備しておいてください。

- 手元のマシンに`docker-machine`コマンドをインストール
- サードパーティ製のマシンドライバーを使う場合はインストール  
(例えばさくらのクラウドの場合は[こちら](https://github.com/yamamoto-febc/docker-machine-sakuracloud)をインストール)
- docker-machine用の設定ファイルを格納するディレクトリ(`/var/lib/cattle/machine/machines`)を作成しておく

```console
$ mkdir -p /var/lib/cattle/machine/machines
```

## 1) Rancherサーバからdocker-machineで使うファイル一式をダウンロード

Rancherサーバでホスト一覧画面を表示し、該当ホストのマシン設定をダウンロードします。

> 「マシン設定」には各種証明書や秘密鍵、docker-machineでのマシンごとの設定ファイル(`config.json`)が含まれています。

ここでは「sakura-test-01」という名前のホストを対象とします。  
ホストの右上のボタンからメニューを表示し、「マシン設定」をクリックします。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/20668/817b5f61-cbc9-13e9-b0ac-b7393278a9a1.png)

![02.png](https://qiita-image-store.s3.amazonaws.com/0/20668/5f8f3042-5fb6-b414-fb21-81cfa618d782.png)

「ホスト名.tar」というファイルがダウンロードされます。(この例では`sakura-test-01.tar`)

## 2) ローカルマシン上に展開

ダウンロードしたファイルをローカルファイル上の所定の位置に展開します。

```bash
#/var/lib/cattle/machine/machines配下に展開
$ tar xvf sakura-test-01.tar -C /var/lib/cattle/machine/machines/
```

展開されたディレクトリ名を控えておきましょう。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/20668/804dc0e4-b0cb-fc56-7e59-b7644b922c96.png)


## 3) `docker-machine`コマンドに`-s`オプションを指定して起動

ダウンロードしたマシン設定ファイルを利用するために、`docker-machine`コマンドに`-s`オプションを指定します。

`-s`オプション、または`--store-path`オプションは、docker-machineで利用する証明書関連ファイルやマシンの設定ファイル(json)を格納するディレクトリを指定するものです。  
今回は先ほど2)で展開したディレクトリを指定すればOKです。

なお、`-s`オプションは環境変数`MACHINE_STORAGE_PATH`でも指定可能です。

```bash
#ダウンロードしたマシン設定ファイル一式を利用してdocker-machine起動
$ docker-machine -s /var/lib/cattle/machine/machines/展開したディレクトリ ls

#または環境変数で-sオプションを指定
$export MACHINE_STORAGE_PATH=/var/lib/cattle/machine/machines/展開したディレクトリ
$ docker-machine ls
```


### 実行例(docker-machine ls)

![04.png](https://qiita-image-store.s3.amazonaws.com/0/20668/7891b282-7d73-013a-686c-8df69ce90d8e.png)

あとは通常のdocker-machineのホストと同様に扱えるはずです。  

例えば、dockerコマンドの対象ホストを変更する場合は以下のように`eval $(docker-machine env)`を実行します。

```bash
$ eval $(docker-machine -s /var/lib/cattle/machine/machines/展開したディレクトリ env sakura-test-01)
```

この状態で`docker ps`を実行するとRancher関連のコンテナが表示されるはずです。

### 実行例(Rancherホスト上のdockerに接続)

![05.png](https://qiita-image-store.s3.amazonaws.com/0/20668/8b8db97a-551e-5fb3-e25e-970a6a9d1bdb.png)


以上でインポート完了です。  

Enjoy!!
Redux非同期処理に関しての備忘

後日追記

```list.js
import React, { Component, PropTypes } from 'react';
import { connect } from 'react-redux';
import { fetchComments } from '../actions/comments';

class CommentList extends Component {
  componentDidMount() {
    this.props.fetchData('https://594ecc215fbb1a00117871a4.mockapi.io/comments');
  }

  render() {
    if (this.props.hasError) {
      return <p> error </p>;
    }
    if (this.props.isLoading) {
      return <p> Loading...</p>;
    }

    return (
      <ul>
        {this.props.comments.map((item) => (
          <li key={item.id}>
            {item.comment}
          </li>
        ))}
      </ul>
    );
  }
}

CommentList.propTypes = {
  fetchData: PropTypes.func.isRequired,
  comments: PropTypes.array.isRequired,
  hasError: PropTypes.bool.isRequired,
  isLoading: PropTypes.bool.isRequired
};

const mapStateToProps = state => ({
  comments: state.comments,
  hasError: state.getCommentsError,
  isLoading: state.loadComments
});

const mapDispatchToProps= dispatch => ({
  fetchData: (url) => dispatch(fetchComments(url))
});

export default connect(mapStateToProps, mapDispatchToProps)(CommentList);
```
爆速、JSをビルドする。

# JavaScriptをファイル分割したいけど設定面倒い
Webpackとかの設定が面倒い、[import](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import)とかわけわかめという人向け。

```
$ cat js/*.js > dist/bundle.js
```
**終了。**
半分ネタです。これだけのことに何年かけてんの?とか重厚長大なライブラリやフレームワークが必要なのとか。名前空間の解決？そんなの、訓練されたJavaScripterなら脳内イメージぐらいできるよねとか、ビルドで例外キャッチ追加されて例外が見えなくなってしまったとか...、があるので半分で...。
まあ、ネタです。

そういや今週(2017/7/24~2017/7/30)、MDNフォント変えたのかな?
なんか字体がかっこよくなってる。
Snap svgを使ってみる。

# この記事の内容
Snap.svgを初めて使ってみた時の備忘録、チュートリアルでわかりにくかった点など。

## インストール
[公式](http://snapsvg.io/about/)からダウンロード、zipファイルを解凍、htmlで

```html:index.html
    <script src="lib/Snap.svg-0.5.1/dist/snap.svg.js"></script>
```
で読み込む。npmでもインストールできるがバージョンが古い、webpackのビルドに問題があるらしいので古いこのスタイルが結局一番ラクっぽい。

## トップノード(Paper)の設定
チュートリアルではSVG要素を生成する方法、セレクターで設定する方法、svgsvgelementを使う方法があるがここでは最初の方法をとる。

```js:init_svg.js
function init_svg(){
    const can=document.getElementById('canvas');
    const w=can.clientWidth;
    const h=can.clientHeight;
    const paper=Snap(w, h).remove();
    paper.appendTo(can);
}
```
親要素を持ってきてその幅と高さをSVG要素にセットそれを親要素にセットしている。最後のappendToは引数側にpaper要素を子要素としてセットしている。２番目の方法を用いるとサイズがうまく設定できなかった。成功すると上が下になる。

```html
<div id="canvavs"></div>
```
```html
<div id="canvavs">
   <svg ~~~~>
      <desc>Created with Snap</desc>
      <defs></defs>
   </svg>
</div>
```
になる。`<defs>`要素には再利用できるオブジェクトを定義してくためのものでSnapではなくSVGそのもの規格として定められている。[defs-MDN](https://developer.mozilla.org/ja/docs/Web/SVG/Element/defs)

## 線の描写と座標系
```js:init_svg.js
    paper.line(0.1*w, 0.8*h, 0.95*w, 0.8*h).attr( { stroke:'black', strokeWidth: 2} );
    paper.line(0.1*w, 0.8*h, 0.1*w, 0.05*h).attr( { stroke:'black', strokeWidth: 2} );
```
出来上がったHPは
![svg_001.png](https://qiita-image-store.s3.amazonaws.com/0/97133/a254bcef-ece3-1bc5-b61c-fc39d68b3d78.png)

こうなる外の枠はSVG全体を囲んでいるボックスである。注意深く見てもらえるとわかるが座標系は右**上**が(0,0)で左**下**が(x,x)である普通の座標設定(右**下**が(0,0)で左**上**が(x,x))と違うので注意が必要である。

## あとがき
まあ原型を見てもらえれば次にやりたいことが見えてくると思いますがとりあえずここで締めます。

- SnapはPaper(トップノード)を作るのがしんどい。
- 座標系が変。
- defsとかいう変なノードが作られる。（もしくは手でSVGを書くときは多分ここを使うと幸せになれます）
VMware Workstation v12.5.7 > 仮想OS上でUSBデバイス(USBメモリ、microSDカードリーダ)が「取り外し可能デバイス」のリストに現れなくなった場合の対処

```txt:動作環境
ホストOS: Windows 10 Pro (64bit) Creators Update適用済
VMware Workstation v12.5.7
ゲストOS: Windows 8.1 pro (64bit)
ゲストOS: Windows 7 pro (32bit)
```

microSDカードを仮想OS上で読もうとしたら、「取り外し可能デバイス」のリストに出てこない。
ホストOSに直接接続される。


参考: https://www.top-password.com/blog/fix-vmware-workstation-does-not-recognize-usb-drive/

上記を参考に以下の対応をした。

1. VMUSBArbService
    - 停止していた
    - 実行中に変更した
2. 仮想OSを再起動した

以上でUSBデバイスが「取り外し可能デバイス」のリストに表示されるようになった。

上記の状況で調べた結果、ゲストOSの.vmxファイル自体にはおかしな変更はなかった。

ホストOSのWindows Update時に何かが起きたのかもしれない。

### Windows Update後に再発
(追記2019/03/24) 

Windows Update後に再発したようだ。
ubuntu14.04でphantomjsをインストールした話

#前提
Vagrant 1.9.1
Ubuntu  14.04


#phantomjsのインストール
今回は私のローカル環境で起こったエラーをふまえての話
rootで作業を行っています

```ruby:phantomjsインストール
$ wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
$ $ tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2.1
$mv phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/
$ cd /usr/local/bin/
$ ls
phantomjs
```

これでphantomjsのインストールができているはず...

```ruby:version確認
& phantomjs --version
bin/phantomjs: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory
```

というエラーが出てきた...
調べてみるとfontconfigがインストールされていないようだったのでインストールしてみた。

```ruby:fontconfig
$ apt-get install fontconfig
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
```

違うプロセスで使用されているよってエラーだと考えた。
ここも調べるとlockファイルが存在しているためらしいので、消去する。

```ruby:delete
$ rm /var/lib/apt/lists/lock
$ rm /var/cache/apt/archives/lock
$ rm /var/lib/dpkg/lock
```

を実行して再度実行

```ruby:version確認
$ apt-get install fontconfig
$ phantomjs --version
2.1.1
```

とバージョンが確認できた!
curl の出力が grep でうまく色付けできない時の対処

grep でパターンマッチする部分に色づけしたいが、うまくいかなかったので調べた際のメモ。

結論から言うと CR が問題のトリガーになっていたので、curl の出力に限ったことではなかった。


## 症状

curl の結果を出力しつつ Server ヘッダに注目して見たいので、Server の部分に色を付けたい。

```
$ curl -s -D - google.co.jp | grep --color=auto -E '^|Server:'
```

![_curl_01.png](https://qiita-image-store.s3.amazonaws.com/0/44206/daf64ec0-0f4e-72ec-84e9-4362d91dfdf7.png)


上記はうまくいく。

色付けを行末までにしようと、正規表現に `.*` を追加する。

```
$ curl -s -D - google.co.jp | grep --color=auto -E '^|Server:.*'
```

![_curl_02.png](https://qiita-image-store.s3.amazonaws.com/0/44206/0555acc7-03a0-8194-1626-2c6ce33bb9dd.png)


色付けされると思いきや、見えなくなってしまった。


## 調査

hexdump で見てみる。

```
$ curl -s -D - google.co.jp | grep --color=auto -E '^|Server:.*' | hexdump -C
```

![_curl_03.png](https://qiita-image-store.s3.amazonaws.com/0/44206/44f73fa1-0954-dd09-2128-8e84d0a11161.png)


Server: 行は存在するが、エスケープシーケンスが見えていない。
`grep --color=auto` の場合は出力先が制御端末でないと自動的に色付けを解除するようだ。

`--color=always` で見てみる。
```
$ curl -s -D - google.co.jp | grep --color=always -E '^|Server:.*' | hexdump -C
```

![_curl_04.png](https://qiita-image-store.s3.amazonaws.com/0/44206/5393d2ac-2392-9bce-bbe6-0017a58b0893.png)


Server: もエスケープシーケンスもあるようなので、表示する際に何かうまくいっていないようだ。

ちょっと見づらいので、strace の write(2) の方を確認する。

```
## strace の出力先はファイルにする
## 端末に出そうとするとエスケープシーケンスが効いてしまうので注意
$ curl -s -D - google.co.jp | strace -y -o trace.txt -e write grep --color=auto -E '^|Server:.*'
$ grep "Server:" trace.txt
write(1</dev/pts/2>, "\33[01;31m\33[KServer: gws\r\33[m\33[K\n", 30) = 30
```

`<ESC>[K` は Erase in Line で、現在位置から行末までを消去するらしい。
`Server: gws` は色づけされているが、Carriage Return で行頭に飛んでから Erase in Line で消去されて改行されるので、表示されなくなっていた。

## 回避策

というわけで、`\r` を sed などで除去したうえで grep にかければ解決する。

```
$ curl -s -D - google.co.jp | sed 's/\r//g' | grep --color=auto -E '^|Server:.*'
```

![_curl_05.png](https://qiita-image-store.s3.amazonaws.com/0/44206/39f1291b-3956-d984-3cad-1992e2e06723.png)


また、ググると grep の環境変数での解決策も見つかる。

https://unix.stackexchange.com/questions/350352/grep-color-auto-breaks-when-m-is-inside-colored-match

`GREP_COLORS="ne"` とすることで、Erase in Line を追加しないようにしている。

```
$ curl -s -D - google.co.jp | GREP_COLORS="ne" grep --color=auto -E '^|Server:.*'
```

![_curl_06.png](https://qiita-image-store.s3.amazonaws.com/0/44206/b3a1b016-9710-333d-d6b5-bba1d4ae8151.png)
「@IBDesignable error: IB Designables: Failed to update auto layout status:」が出た時の対処方法

#問題
Storyboardを編集しようとすると、以下のエラーが出て編集ができなくなってしまいました。

```swift
@IBDesignable error: IB Designables: Failed to update auto layout status: Interface Builder Cocoa Touch Tool crashed
```

#原因調査
```~/library/Logs/DiagnosticReports/``` ディレクトリに吐き出されるクラッシュログを確認しました。

```
~/library/Logs/DiagnosticReports/IBDesignablesAgentCocoaTouch_20XX-MM-DD-HHmmss_jmpc-XXX.crash
```

#解決
UITextViewを継承した独自クラスで、以下のメソッドを override していないのが原因でした。

```swift
public override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
}
```

継承が必須なものであるのなら、なぜ required が指定されていないんでしょうかね。
.gitignoreをブランチごとに設定して、既にignoreしてしまったファイルをgit管理下に復活させる	


GoやReactなど、featureブランチではビルドしたファイルを管理したくない（=マージリクエストで差分が多すぎて何も見れなくなるのを防ぎたい）けれど、デプロイ用のブランチではビルドしたファイルを引っ張ってきたいので管理したいといった場合に、.gitignoreをブランチごとに設定する方法。

## .gitignoreの設定
[こちら](http://qiita.com/matsuoshi/items/f40d60a5c0a1a169a73b)を参考に設定しました。
対象のブランチをチェックアウトした状態で下記の手順を実施。

.gitignoreに以下を追記

```
[merge "ours"]
    name = "Keep ours merge"
    driver = true
```

次に.gitattributesに以下を追記

```
/.gitignore merge=ours
```

さらに、.gitignoreを該当ブランチで所望する設定に変更

## ignoreされていたファイルをgit管理下に戻す
私の場合、該当のビルドファイルが既に.gitignoreに追加されていて、そのファイルを特定のブランチでは管理対象にするために.gitignoreから除外した。
しかしながら、それだけでは一度ignoreされてしまったファイルはステージされない。
次のコマンドで対象のファイルをaddする。

```
git add -f [対象ファイル名]
```

めでたしめでたし。
初めてPDFファイルを結合してみた

#複数のPDFを簡単に結合する方法

オンライン上で簡単にPDFファイルを結合できる
**[Smallpdf](https://smallpdf.com/jp/merge-pdf)**を使ってみた

###1.結合するPDFファイル選択 
![2017-07-28_18h34_41.png](https://qiita-image-store.s3.amazonaws.com/0/182799/2f0e5090-0b12-fcd3-c150-aac54d27bd6b.png)

###2.表示されたファイルの順番を確認しOKなら「PDFの結合」をクリック
※ページの順番は左数え
※ページの順番を入れ替えるには、ファイルをドラッグアンドドロップ

![2017-07-28_18h37_39.png](https://qiita-image-store.s3.amazonaws.com/0/182799/346b1679-da39-9b6f-987f-05c4ca097bc7.png)

###3. 結合されたファイルをダウンロード
![2017-07-28_18h37_56.png](https://qiita-image-store.s3.amazonaws.com/0/182799/cd958b40-72d7-2bb3-4e5a-205d375a89df.png)

###～注意～
**無料版は、1時間で2回までしかファイルを結合できないgΣ(ﾟдﾟlll)ｶﾞｰﾝ**
![2017-07-28_18h38_58.png](https://qiita-image-store.s3.amazonaws.com/0/182799/955ad5c6-2d4c-785a-a932-70906afaa311.png)

#感想
PDFページは編集済み、フリーソフトはダウンロードしたくない。
「ただ、ファイルを結合したいだけ！！」なら
かなり使いやすい。
「pdfファイル 結合」でググったら検索上位！
今後も活躍してもらおう(｀・ω・´)ｼｬｷｰﾝ
「Projects using Symfony」に掲載されるまで

Symfonyの公式サイトには、[Projects using Symfony](https://symfony.com/projects)というコンテンツがあります。

これは、SymfonyやSymfony Componentを利用しているプロダクトを紹介しているページです。LaravelやComposer、DrupalやMagentoなど、メジャーなライブラリやCMSが並んでますね。

EC-CUBEも[E-commerce projects](https://symfony.com/projects/category/e-commerce)のページに掲載されています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/72858/bbf493fd-453e-4df0-9ddd-3660fa0f684f.jpeg">

このコンテンツに掲載してもらうのは特に難しいことではなく、[symfony/symfony-marketing](https://github.com/symfony/symfony-marketing)にPull Requestを送れば随時取り込んでもらえます。

以下はEC-CUBEを掲載してもらうために投げたPull Requestです。
https://github.com/symfony/symfony-marketing/pull/366

Pull Requestを投げた時点から少しファイル名などが変わったみたいですが、修正したり作成するのは3ファイルだけ。

- projects.yml
- projects/xxx.yml 
- projects/xxx.png

## projects.yml
プロダクト名を追記します。他のファイルのファイル名になる文字列です。ハイフンは使えないようです。

```projects.yml
- eccube
```

## projects/xxx.png

プロダクトのロゴ画像です。推奨は160x160。

## projects/xxx.yml

プロダクトの概要を記載します。こんな感じ。

```eccube.yml
name: EC-CUBE
url: http://www.ec-cube.net/
dependencies:
    - https://github.com/EC-CUBE/ec-cube/blob/master/composer.json
description: |
    EC-CUBE is an open source package used to build e-commerce sites.  It is the
    most popular shopping cart system in Japan. Since the release of the
    version in 2006, users can build e-commerce sites for free. Due to its drag
    and drop functionality, users with no programming experience can create
    original online shops with ease.
```

どのSymfony Componentを利用しているかは、`dependencies`で`composer.json`のURLを書いておけば自動的に表示されます。

Pull Requestがマージされてしばらくたつと、[Projects using Symfony](https://symfony.com/projects)にこんな感じで反映されます。マージ後即反映ではなく、少しタイムラグはあるみたいです(1~2日程度？)

<img src="https://qiita-image-store.s3.amazonaws.com/0/72858/4e5a8b80-ec8f-d7fe-722f-0de7c1886489.png">

マージされるまでのハードルもそれほど高くないようですし、SymfonyやSymfony Componentを使ってプロダクトを開発されているかたは、いちどトライしてみてはいかがでしょうか。
社内の「connpassの新着イベントを東京限定にしてほしい」に応えてみた

# 序

ニジボックスの社内で使っているSlackには、`tech-event`というチャンネルがあります。
割と何となくレベルで、目についたりしたイベントを適当に紹介してくスタイルでした。　[^1]

# 破

ある日。

> 「https://connpass.com/explore/ja.atom これをここに流すのってどうですか？」

というがが出たので登録してみました。その結果...

- Sota講習会 【Vstone Magicを始めよう】 Part 3（有料）
    - 東京都千代田区外神田1-9-9 内田ビル4F
- 第１回 UDONPy もくもく会
    - **香川県高松市**
- 福島ゲームジャム2017【熊本会場】
    - **熊本県熊本市**
- 名古屋『FP in Scala』読書会 #28 - 13.4.3 純粋なインタープリタ
    - **名古屋市**
- #5 はじめてのIT勉強会 in 仙台
    - **宮城県仙台市**


:tired_face: **遠い!!**:tired_face: 

connpassの新着イベントのフィードなので、そりゃもちろん登録されている全部が載ってきますよね。

## 社内の感想

> ちょっと頻度高い気が..

:tired_face: 

> 東京には限定してほしい

:tired_face: 

> left #tech-event

:tired_face: 


# 急

<img width="396" alt="スクリーンショット 2017-07-28 18.03.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/6805/e4486d9d-3f20-ffb4-b1b9-7631622d3e58.png">

## 作った

```python3:server.py
import xml.etree.ElementTree as ET
import re
from urllib.request import urlopen
from bottle import route, run, HTTPResponse


@route('/')
def index():
    place_re = re.compile(r'<br />開催場所: (?P<place>.+?)<br />')
    resp = urlopen('https://connpass.com/explore/ja.atom')
    tree = ET.parse(resp)
    root = tree.getroot()
    for entry in root.findall('{http://www.w3.org/2005/Atom}entry'):
        summary = entry.find('{http://www.w3.org/2005/Atom}summary')
        place = place_re.search(summary.text).group('place')
        if '東京' in place:
            summary.text = "場所: {}".format(place)
            continue
        if 'Tokyo' in place:
            summary.text = "場所: {}".format(place)
            continue
        root.remove(entry)
    resp = HTTPResponse(status=200, body=ET.tostring(root))
    resp.set_header('Content-Type', 'application/atom+xml; charset=utf-8')
    return resp


run(host='0.0.0.0', port=8000)
```


```
$ python3 ./server.py
```

1. 場所情報を抽出して
2. 東京ぽいエントリー以外を全部捨てて
3. SlackはURLプレビューあるから、Summaryを場所だけにして [^2]
4. 作り直したDOMをそのままXMLにし直す

というのをリクエストするたびにやるだけのプログラムです。


必要な情報量にまで削ぎ落とせたので、だいぶチャンネルはある程度にスリムになったので良しとしましょう。


[^1]: 極稀に、感想スレッドもあったり
[^2]: 最初のバージョンはsummary残してたのだけれど「URLだけでいいんじゃね？」という意見を元に編集することに
IoTのアーキテクチャとIoTの価値を図にまとめてみた

日本語で書かれた IoT のアーキテクチャの図を探してるんだけど、なかなか自分好みのが見つからなかったので書き起こしてみた。
![iot-architecture.png](https://qiita-image-store.s3.amazonaws.com/0/185984/256944e0-0540-f472-c004-062145c4f364.png)
uWSGIが大きすぎるcookie送るとエラーを吐く件

数時間調べたのでせっかくなのでメモ。

# 構成
Nginx 1.10.2 + uWSGI 2.0.14 のwebサーバ
python3.6 (Flask0.12)

# 現象

それなりの量のcookieを持ったリクエストを送信したら、Nginxのエラー画面が表示された

# 調査

* アプリのログ→エラーは出ない。アプリのエラー画面がでないのでその前で事件は起きていると推測。
* nginxのアクセスログ→該当リクエストでコード502返却
* nginxのエラーログ

```
[error] 2622#0: *1237033 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: localhost, request: "GET /foo?bar=hoge HTTP/1.1", upstream: "uwsgi://path/to/uwsgi.sock", host: "hogehoge.com", referrer: "https://xxxxxx"
```

#　原因

http://uwsgi-docs.readthedocs.io/en/latest/Options.html#buffer-size
> Set the max size of a request (request-body excluded), this generally maps to the size of request headers. By default it is 4k. If you receive a bigger request (for example with big cookies or query string) you may need to increase it. It is a security measure too, so adapt to your app needs instead of maxing it out.

つまり、bodyを除いたリクエストの受信可能な上限があって、デフォルト4K。
問題のリクエストではcookieにそこそこのjsonを格納して送信していたのだが、これが引っかかった模様。
大きいクエリストリングも注意らしい。

# 対策

uWSGIの設定をiniに記載していたため、

```uwsgi.ini
buffer-size=10240
```
を追記してuWSGI再起動してOK。
とりあえず10Kを設定したが、もっと大量のデータが想定される場合はそれ相応のサイズを設定してもいいのかも。


# 参考

https://github.com/unbit/uwsgi/issues/682
https://stackoverflow.com/questions/22697584/nginx-uwsgi-104-connection-reset-by-peer-while-reading-response-header-from-u/22792850#22792850
http://uwsgi-docs.readthedocs.io/en/latest/Options.html#buffer-size



~~プレミアムフライデー何それ美味しいの~~
アプリ版GAの新規ユーザー数は重複したものを含んでいる

BigQueryでGAデータを集計していると、新規ユーザー数が
管理画面とずれることがあったが、その原因がわかったので共有

## 日付でグループ化して集計しないと新規ユーザー数が管理画面とずれる

GAのセッションが切れるタイミングとして
GAウェブ版の公式ページを見てみると、以下の3種類

https://support.google.com/analytics/answer/2731565?hl=ja

- 操作が行われない状態で30分経過後
- 午前 0 時
- キャンペーンの切り替わり時

上記の通りであれば、以下の2つのクエリの結果が同一になるはずだが
前者のほうが少なく、後者が管理画面と一致した


```sql
#standardSQL

SELECT
    COUNT(DISTINCT fullVisitorId) AS users
FROM
    `${project}.${dataset}.${table}`
WHERE
    _TABLE_SUFFIX BETWEEN "20170725" AND "20170726"
    AND totals.newVisits > 0
;
```


```sql
#standardSQL

SELECT
    SUM(users)
FROM
    (
    SELECT
        date
      , COUNT(DISTINCT fullVisitorId) AS users
    FROM
        `${project}.${dataset}.${table}`
    WHERE
        _TABLE_SUFFIX BETWEEN "20170725" AND "20170726"
        AND totals.newVisits > 0
    GROUP BY
        date
    )
;
```

公式の定義どおりであれば、新規セッションは日付をまたいだ瞬間に
新規セッションではなくなるが、日付でグループ化して集計すると
多くなるところをみると、日またぎのセッションが存在する様子

後者がGAの管理画面と一致したので、
GAの新規セッションの一部はアプリ版においては重複のものを含んでいる


## たぶんアプリ版だけ?
実はアプリ版GAのセッションに関しての記載は以下
日付に関しては何も書かれていない

https://support.google.com/analytics/answer/7382392?hl=ja

なので日付をまたいだセッションが普通に存在できるはず

BigQueryと連携しているプロパティがアプリ版しかないので
手元でウェブ版の検証が出来ないけれど、多分重複はしないはず。。

それならそれでアプリ版GAの管理画面の集計ちゃんとしてほしい
《SVG》safariでgetTotalLength()が動かないときの対処法

safari10で `getTotalLength()` が動かなかったので備忘録。


## 原因

原因は `<rect>` とか `<polygon>` のメソッドとして `getTotalLength()`が実行できないことでした。safari以外ではうごていたので、ちょっと盲点でした。


## 対処法

スクリプトはそのままで動かしたかったので`<rect>` や `<polygon>` を全て　`<path>` に変換してあげました。

コマンドラインから変換できるようなツールとかもあったのですが、
今回はIllustratorで直接編集することにしました。


### Illustratorでパスを　`<path>`として書き出す

Illustratorで全てのパスを「複合パス」に変換します。
対象のオブジェクトを選択し、右クリックから「複合パスを作成」を選択します。

Illustratorで動くスクリプトを作成して、
SVGに書き出すときに処理していくのがいいかもしれないと思いました。


おわります。
WIP > Outlook 2016 > bug: 受信者が添付PDFファイルを受け取れない (添付ファイルがないメールを受け取る)

WIP (Work in progress)

```txt:動作環境
Outlook 2016
Windows 10 Pro (64bit) Creators Update適用済
```

確認した症状では受信者はPDFファイルを受けていない (添付がないメールを受ける)。

補足事項

- 新規メール送信では添付されない
- 返信メール送信では添付される
- Office 365アカウント
- 他の人から同じ宛先の新規メールでは添付される
    - OS: Windows 8.1 Pro + Outlook 2013
    - 受信側の問題ではなさそう

## 関連情報

### 署名関連
    
https://answers.microsoft.com/en-us/msoffice/forum/msoffice_outlook/pdf-files-not-being-sent-via-outlook/9244aafa-4834-465c-934f-b297097d3995

> DEdevonclancy replied on  December 29, 2015See post history
> After doing some research on my own, I have found that the problem had to do with outlook attaching my signature and logo to my email before I attach the pdf.  I don't know what the fix is other than disabling automatic signature and signing after attaching the pdf file.  Hope this will be helpful to others.

署名機能を外して問題が出なくなったという例がある。
ミサイル防衛

#概要
ミサイル防衛をシュミレーションしてみた。
航法は、不明。分る方、教えて。

#写真


![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/w/v/L/wvLl.jpg?t=1501231703)


![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/s/8/A/s8A8.jpg?t=1501232053)


#成果物

http://jsdo.it/ohisama1/wvLl
http://jsdo.it/ohisama1/s8A8
WP-REST APIで個別投稿毎にカテゴリ名を取得する

wordpressのRest APIでカテゴリ名を取得する方法をメモ。
個別の投稿の情報はwp-json/wp/v2/postsから取得ができるのですが、カテゴリに関してはカテゴリIDしか取得できません。

そこで、公式ページの[レスポンスを修正する](http://ja.wp-api.org/extending/modifying/)を参考に、カテゴリ名を取得する関数をfunctions.phpに追加します。

```php:functions.php
//カテゴリ名を取得する関数を登録
add_action( 'rest_api_init', 'register_category_name' );

function register_category_name() {
//register_rest_field関数を用いget_category_name関数からカテゴリ名を取得し、追加する
    register_rest_field( 'post',
        'category_name',
        array(
            'get_callback'    => 'get_category_name'
        )
    );
}

//$objectは現在の投稿の詳細データが入る
function get_category_name( $object ) {
    $category = get_the_category($object[ 'id' ]);
    $cat_name = $category[0]->cat_name;
    return $cat_name;
}

```

その後、http://[yourdomain]/wp-json/wp/v2/postにアクセスするとcategory_nameの値が取得できるようになります。
nodejs, ES6 で dependency injection with awilix

# 概要

nodejs でちょっとしたアプリ（WebAPI や DB からデータを取得して、AWS S3に登録する）を作ることになりました。
小さなコードなので、typescript とか使うのも面倒だなと思い、ES6 で書いていました。
プロトタイプ的に一通り実装したあと、プロダクト用に仕上げるに当たって、やはり DI 必要だなと思い、調べていたところ、awilix が使いやすかったという話です。

# そもそも何で DI が必要か

プロトタイプでは DAO を以下のように実装していました。

```dao.js
const webDAO = require("./net"); // WEB API 通信モジュール
const dbDAO = require("./db"); // DB 操作モジュール
const s3 = require("./s3"); // S3 操作モジュール

module.exports = {
    getData1: function(code){
        return webDAO.getData(code);
    },
    getData2: function(type){
        return dbDAO.getData(type);
    },
    putData: function(key, data){
        return s3.putObject(key, data);
    }
};
```

使う側は以下のような感じです。

```userSide.js
const dao = require("./dao");

const data1 = dao.getData1("sample");
dao.putData("sampleKey", data1);
```

で、これだと困ることがいくつかあります。

- ローカル環境では S3 じゃなくてファイルに出力したいこともある
- ローカル環境ではデータを固定にしたいこともある
- 一連の処理のテストコードを書きたいが、外部リソースに依存していては・・・

と言うわけで DI の出番です。

# Awilix が良いと思った理由

JS の DI framework って決定版的なものがないですよね、きっと。
[以前に typescript を使った時](http://qiita.com/sugiyasu-qr/items/cbf074ee17a9e119f783)は inversifyJS を使ったのですが、[JS対応はイマイチ](https://github.com/inversify/InversifyJS/blob/master/wiki/basic_js_example.md)だったので、他を探していたところ、[Awilix](https://github.com/jeffijoe/awilix)を見つけました。

シンプルで使い勝手が良さそうです。ES6 の Proxy を使っているらしいです。

# DI 版に修正する

※サンプルなので諸々テキトーです。

DI なので dao をコンストラクタで受け取るようにします。

```js
const awilix = require('awilix');

const container = awilix.createContainer();

// モックの DAO
function mock() {
    const fs = require("fs-extra");
    container.registerValue({
        dao: {
            getData1: function(code){
                return [];
            },
            getData2: function(type){
                return [];
            },
            putData: function(key, data){
                return fs.outputFile(`${key}.txt`, data);
            }
        }
    });
}

// プロダクト用の DAO
function prod() {
    const dao = require("./dao/dao");
    container.registerValue({dao: dao});
}

mock(); // 注：ここを環境によって切り替える。
// prod();


// 以下、使う側

class TestUser {
    constructor(opts) {
        this.dao = opts.dao; // モックまたはプロダクト用の DAO がインジェクトされる
    }

    test() {
        this.dao.getData1("sample");
    }
}

container.registerClass({
    testUser: TestUser
});

const testUser = container.resolve("testUser");
testUser.test();
```

サンプルなので諸々テキトーです。
[Usage](https://github.com/jeffijoe/awilix)が分かりやすいので、そちらを参照してください。

# まとめ

Awilix　で testable な　nodejs 開発をしましょー。
日付を漢数字和暦表記の文字列に変換する

NSDateから和暦の漢数字日付表記を得たかった。

> 平成元年一月七日
> 平成二十九年十二月二十三日

NSDateFormatterのみでは実現が難しそうだったので、漢数字変換に対応しているNSNumberFormatterとの合わせ技で解決した。
ついでに台湾の中華民国歴にも対応してみた。縦書きにすると漢数字が映える。

<img src="https://qiita-image-store.s3.amazonaws.com/0/3603/c0f426a4-9778-5f04-f07c-51acd00cb75a.png" width=375> <img src="https://qiita-image-store.s3.amazonaws.com/0/3603/f48d37da-02ad-2bb0-6d06-fbb99aaf2bf9.png" width=375>


```swift:Dateから漢数字和暦表記の文字列を得るextension
import Cocoa

// Calendarの生成が重いので、キャッシュしておくなりが良いかもしれない
let calJapanese = Calendar(identifier: .japanese)
let calTaiwanese = Calendar(identifier: .republicOfChina)

extension Date {

	/// 漢数字日付を得る
	func kanjinizedDateString(withLocale locale: Locale, calendar: Calendar) -> String {
		let sfx_year = "年"
		let sfx_month = "月"
		let sfx_day = "日"
		let firstYear = "元"
		let none = "ー"

		func kanjinize(_ num: Int?) -> String {
			guard let num = num else {return none}

			let nf = NumberFormatter()
			nf.locale = locale
			nf.numberStyle = .spellOut // 漢数字表記
			return nf.string(from: NSNumber(value: num)) ?? none
		}

		// 元号を得る
		let df = DateFormatter()
		df.locale = locale
		df.calendar = calendar
		df.dateFormat = "G"
		let era = df.string(from: self)

		// 一年は「元年」に置き換える
		let comps = calendar.dateComponents([.year, .month, .day], from: self)
		let yearStr = (comps.year ?? 0) > 1 ? kanjinize(comps.year) : firstYear
		let monthStr = kanjinize(comps.month)
		let dayStr = kanjinize(comps.day)

		return era + yearStr + sfx_year + monthStr + sfx_month + dayStr + sfx_day
	}

	/// 漢数字和暦日付を得る
	func japaneseKanjinizedDateString() -> String {
		let locale = Locale(identifier: "ja")
		return kanjinizedDateString(withLocale: locale, calendar: calJapanese)
	}

	/// 漢数字中華民国暦日付を得る
	func taiwaneseHanzinizedDateString() -> String {
		let locale = Locale(identifier: "zh-tw")
		return kanjinizedDateString(withLocale: locale, calendar: calTaiwanese)
	}

}
```

```swift:使い方
let date = Date()
date.japaneseKanjinizedDateString()
date.taiwaneseHanzinizedDateString()
```
```
"平成二十九年七月二十八日"
"民國一百零六年七月二十八日"
```

Playground

![](https://qiita-image-store.s3.amazonaws.com/0/3603/e00ac504-69e9-2272-8fd2-01514c976bec.png)
[メモ] Volumio2 + Raspberry Pi Zero W + I2S-DAC ボード で音楽再生


![Qiita-Volumi-07.png](https://qiita-image-store.s3.amazonaws.com/0/75594/83f9e35f-d7b4-1c7f-3c27-5df4773b5c18.png)
- ボリュームが 0 になってる...

## 概要
- [Volumio 2](https://volumio.org/) -  Audiophile Music Player
     - 基本的に、イメージをダウンロード > microSDに焼く > 起動
- まずはHotspotモードで、らずぱいに直接つなごう
    - 初回起動時は、Hotspotとして起動
        - Wifiのアクセスポイントへの設定がないとか、接続できない場合、HotSpotとして動く、っぽい
    - SSID: `Volumio` /パスワード: `volumio2` (デフォルト)
    - http://192.168.211.1/ で接続
    - iPhoneでは、(i)を押して、自動ログインをOffにしておく。
- 開発モード? http://192.168.211.1/dev のメニューにて、`ssh`を ON/OFFできたりできる
    - sshログイン: デフォルトユーザ: `volumio` / パスワード: `volumio`
- 曲データ
    - Sambaで、共有フォルダを開いて、曲データをコピーする
    - USBメモリに曲データを入れて挿す
    - ネットワーク共有フォルダを参照
    - AirPlay 対応 (iPhoneの音を鳴らせる)

## 環境
- Raspberry Pi
    - Zero W
    - Zero + USB Wifi
    - 2 model B + USB Wifi
    - (予定) 3 model B 
 
- I2S-DACボード : [Fe-Pi Audio Z V2](https://fe-pi.com/products/fe-pi-audio-z-v2)
     - NXP SGTL5000使用
     - らずぱいのKernel 4.9.13 以降で対応とのこと => 現行の2.201で対応してないので(2017.7.27現在 Kernel v4.4.x)、自前でイメージ作成


| Raspberry Pi |  Network| Audio |
|-----------------|------------------|------------------|
| Zero W | 内蔵 Wifi | DAC: Fe-Pi Audio |
| Zero | 8192cu USB Wifi| DAC: Fe-Pi Audio |
| 2 model B | 8192cu USB Wifi| 内蔵Audio |

## 手順メモ
1. イメージをダウンロードするか、自前で作成して、microSDに焼いて、起動。
2. しばらくまっていると、 Volumio というSSIDが見える<br>![Qiita-Volumi-01.png](https://qiita-image-store.s3.amazonaws.com/0/75594/ed061f62-4516-6bf8-badb-546376dd7ea4.png)
3. デフォルトパスワード: `volumio2` で接続する。しばらくすると、IPが振られる。
4. ウェブブラウザで、http://192.168.211.1/ へアクセス。<br>![Qiita-Volumi-02.png](https://qiita-image-store.s3.amazonaws.com/0/75594/ee5c0565-b883-805c-a4c3-1ecb9a401f22.png)

5. 右上の、設定アイコンから、PLAYBACK OPTIONSにて、Audioの設定をする。
    - I2S DACをONにして、DAC Modelを選んで、\[Save\]。再起動をすすめられるハズ。<br>![Qiita-Volumi-04.png](https://qiita-image-store.s3.amazonaws.com/0/75594/dceaf92e-f165-4eb9-eadd-fd5e448b3e58.png)
    - Fe-Pi のは、 Audio ResamplingをONにして、Target Bit Depthを16にしないといけなかった..(そうしないと、シャーシャーとノイズが再生される)<br>![Qiita-Volumi-05.png](https://qiita-image-store.s3.amazonaws.com/0/75594/8a70d0cb-3f4b-b498-494a-01cad152c778.png)

6. 設定したら、気持ち、再起動。<br>設定アイコン > SHUTDOWN >Restart
7. 曲データを入れる。エクスプローラから、`\\192.168.211.1` を開いて、Internal Storageにデータをコピーする。フォルダ内のJPGが表示される？っぽいので、アルバムごとにフォルダを作って、曲データとJPGをいれる。<br>![Qiita-Volumi-06.png](https://qiita-image-store.s3.amazonaws.com/0/75594/dc1d58d8-45ef-1b43-be37-426bd6351dff.png)
8. 設定アイコン > MY MUSIC で、 My Musicの　\[Rescan\]をおして、曲を認識させる
9. 再生<br>左下の、`Browse` > `Music Library` > `INTERNAL` で、フォルダや曲名が表示されるので、クリックにてすぐ再生か、曲名の右のほうにある縦の３つ点々をおして、Add to queue/キューに追加　で、再生予約する。(右下のQueueボタンにて、確認)
10. プレイリスト<br>うまくQueueを作って、右下のQueueを押して、右上のフロッピーディスクアイコン(Save queue as playlist)をおして、既存のものに追加か、名前をいれて、\[New\]。<br>再生は、左下Browse > ホームアイコン > Playlists で、プレイリスト名の右の点々をおして、PlayかAdd to queue


## その他
- APPEARANCE > Language から、日本語設定やら、背景やら設定
- NETWORKから、ネットワークの設定をして、自宅のネットワークに参加させると、MY MUSICからネットワークドライブを追加できる。(さんばcifsか、nfs)
- nodejsで実装されている
- squashfsやら、overlayfsやら使われてる
- イコライザ? ブラウザ上のUIはないっぽい？: https://github.com/thomasdoerr/volumio-equalizer
- メモ: 右下Browse > Homeアイコン > Web Radio > By Country > Japan > ...
LoRa機器の受信強度（RSSI）の取得方法

# これまでのお話

1. [LoRaでIoTプラットフォーム（ThingSpeak）にデータを上げる方法](http://qiita.com/openwave-co-jp/items/fc4695f6de36fc9cd398)
2. [LoRaWANでIoTプラットフォーム（The Things Network）にデータを上げる方法](http://qiita.com/openwave-co-jp/items/7edb3661ab5703e38e7c)
3. [LoRaにGPSを付けて、会社の周りを歩いてみた（Google Earthで位置情報をプロットする）](http://qiita.com/openwave-co-jp/items/8dae802638cf6ac62650)
4. [複数のLoRaノードをゲートウェイにアクセスさせるときに気を付けること](http://qiita.com/openwave-co-jp/items/80f86e61d538d78ee6bb)

# イントロダクション

今回は受信強度について、記載しようかと思います。

# 受信強度とは

```
受信信号強度検出、または電界強度検出。受信している電波信号の強さを数値化したもの。
```

参考：http://www.wdic.org/w/WDIC/RSSI

これまでLoRaのプログラミングをする上で何度も見てきた値なのですが、受信側の強さを表す値です。

受信強度が検出できるタイミングは、「信号を受信した時」のようです。（逆に言うと、何も受信していないときには受信強度は分かりません）

LoRaのライブラリは、RSSIを取得しようとすると、最後に受信した信号の値を返すようです。


以降に、RSSIの取得方法を説明します。


## 使用ソフト
- Arduino IDE(1.6.13)

## 使用プログラム
[LoRaでIoTプラットフォーム（ThingSpeak）にデータを上げる方法](http://qiita.com/openwave-co-jp/items/fc4695f6de36fc9cd398)で使用したプログラムを使います。

以降の「手順」では、上記のプログラムが各機器に書き込まれた状態を前提とします。


# 手順

## LoRa miniのプログラミング

LoRa miniに書き込んだソースに、RSSIを取得するための記述がコメントアウトされています。
下記キャプチャの個所のコメントを戻します。

![program.png](https://qiita-image-store.s3.amazonaws.com/0/169302/c8109ba4-90f2-d3fe-c955-4e489b52886b.png)

再度プロラムを書き込みます。

## 動作確認

シリアルモニタを開くとRSSIが表示されます。

![シリアルモニタ.PNG](https://qiita-image-store.s3.amazonaws.com/0/169302/6609cf50-8c72-626a-0bea-b5f56dbfcb23.png)

# 最後に
RSSIは、電波の送信側との距離や障害物の有無で値が大きく変化します。
RSSIの値を見ることで、だいたいどの距離まで安定して電波が届くかの判断ができるかと思います。
（経験即では、-130手前が当たりが通信できる限界でした）

LoRa設置場所の最も参考になる指標と言えるかもしれません。

# 注意

プログラミングにはArduino IDEを使用しますが、事前にArduino IDEに次の設定が必要です。

- Dragino向けの設定をしておく必要があります。
http://www.ibeacondo.com/download/LG01_LoRa_Gateway_Manual_JP.pdf
- RadioHeadライブラリをインターネットから取得して、インクルードしておく必要があります。
http://www.airspayce.com/mikem/arduino/RadioHead/RadioHead-1.63.zip

この記事で使用するソースは、使用するハードに依存している部分が大きいため、他のハードとの組み合わせでどうなるかは分かりません。

[株式会社オープンウェーブ](http://www.openwave.co.jp/)
slackを使いこなそう[権限編]

#slackにはいくつかの権限があります。
以下のURLを参考にしてください。

https://get.slack.help/hc/ja/articles/201314026-Slack-%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%81%AE%E7%A8%AE%E5%88%A5%E3%81%A8%E6%A8%A9%E9%99%90
CSSでスクロールバーをカスタマイズ

webkit系のSafariとChrome限定ですが、CSSプロパティ`::-webkit-scrollbar`でブラウザのスクロールバーをカスタマイズできます。
#####Mac OSのオシャレUI…
OS X以降のMacOSではスクローラブルな要素に対してもスクロールバーは非表示で、スクロールが始まったタイミングで初めてふわりと表示させる仕様になっています。
お洒落な演出ですが、この演出のせいでスクロールバー非表示のMacとスクロールバー常時表示のWinでレイアウトがずれてしまうという困った現象が起きます。
OSが違うだけで全く同じブラウザ相手なので[ブラウザハック](http://browserhacks.com/)も使えません。

でも`::-webkit-scrollbar`を覚えておけばもう安心！
#####応用
`::-webkit-scrollbar`を特定のクラスの中（下記の例なら`.container`内）に書けば、そのクラスの中だけでスクロールバーのデザインを変えることができます。
メディアクエリを使ってスマホ時とPC時のスクロールバーを異なるデザインにするのも良さそう。

####HTML&CSS
```html:index.html
<div class="container">
  <div class="inner"></div>
</div>
```
```css:scrollbar.css
/*スクロールバー全体*/
::-webkit-scrollbar {
    width: 10px;
}

/*スクロールバーの軌道*/
::-webkit-scrollbar-track {
  border-radius: 10px;
  box-shadow: inset 0 0 6px rgba(0, 0, 0, .1);
}

/*スクロールバーの動く部分*/
::-webkit-scrollbar-thumb {
  background-color: rgba(0, 0, 50, .5);
  border-radius: 10px;
  box-shadow:0 0 0 1px rgba(255, 255, 255, .3);
}

.container{
  width: 100%;
  height: 400px;
  overflow: auto;
}

.inner{
  background-image: url("http://lorempixel.com/800/800/");
  background-repeat: no-repeat;
  width:100%;
  height:800px;
}
```

####サンプル
https://jsfiddle.net/6m7bpu5e/4/
Microsoft Azure REST API を Postman から呼び出す方法

Azure REST API を Chrome アプリの Postman を使って呼び出す方法です。
#要約
Fiddler を使うと、簡単に、Bearer Token が取得できて、Azure REST API の呼び出し準備が簡単に整います。

#概要＆手順

[Using Postman to call Azure REST APIs](https://blogs.msdn.microsoft.com/benjaminperkins/2017/01/03/using-postman-to-call-azure-rest-apis/) の要約です。

必要なステップは以下の通り：

* Postman の入手 (この投稿では省略)
* Bearer Token の入手
* Postman で、Azure REST API を呼び出すための設定

# Bearer Token の入手
インタラクティブに Azure REST API を呼び出すのに、これが一番大変な作業じゃないかと思います。色々方法がありますが、最も簡単だと思われるのが、[Fiddler](http://www.telerik.com/fiddler) を使う方法です(Fiddlerについての解説もこの投稿では省略)。
[Fiddler](http://www.telerik.com/fiddler) からFiddlerをインストールし、メニューより、 Tools → Options... を選択し、Optionダイアログで、Decrypt HTTPS trafficにチェックを入れます。
![fiddler.png](https://qiita-image-store.s3.amazonaws.com/0/3816/3dc31d5b-1245-ff53-d373-d49d93ea6091.png)
その後、[Azure Portal](https://portal.azure.com)にログインすると(事前にログアウトしておくことをお勧めします)、サイトへのアクセスしたときのトラフィックがFiddlerに現れますが、その中から、https://management.azure.com にアクセスしている行を探します。

![bearer_.png](https://qiita-image-store.s3.amazonaws.com/0/3816/6053fcbe-3276-eb53-69df-b8e291103b51.png)
右側のペインのHeadersで**Security**の部分の、Authorization: Bearer に続く部分が、Bearer Tokenになるので、この部分をコピーします。
# Postman で、Azure REST API を呼び出す設定
作業は以下の3ステップ
1. URL を追加
2. Authorization と Content-Type の Header の追加
3. Send ボタンを押す

![get.png](https://qiita-image-store.s3.amazonaws.com/0/3816/14ec9a5f-84c7-d315-099f-8f4062559858.png)


ここでは、例として Web Apps の情報を取得する [REST API](https://docs.microsoft.com/ja-jp/rest/api/appservice/webapps#WebApps_Get) を呼び出してみます。URLは以下の通りです。

`https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Web/sites/{site}?api-version=2015-08-01`

{subcriptionID}、{resourceGroup}、{site}については、情報を取得する Web Apps の値に変更してください。

Headerには、Fiddler を使って入手した、Authorizationに Bearer Token と、Content-Type に application/json を追加します。

あとは、Send のボタンを押すだけで、画像のように、Web Apps の情報が返ってきます。
DockerでサクッとDBからER図を作成する

SchemaSpyというDBのスキーマを解析してテーブルの一覧やER図を出力してくれるツールがあります。
このツールの公式Dockerイメージが公開されており、非常に使いやすいので紹介させて頂きます。
https://hub.docker.com/r/schemaspy/schemaspy/

# コマンド
```
docker run -v "$PWD/schema:/output" --net="host" schemaspy/schemaspy:snapshot \
 -t <DB種類> -host <DBホスト名/IP>:<ポート> -db <DB名> -u <DBユーザー名> -p <DBパスワード>
```
このコマンドを実行するとカレントディレクトリのschemaディレクトリに解析結果のHTMLが出力されます。
（コンテナは自動的に終了します）

# docker run のオプション
`-v`オプションで指定したoutputのマウント先が出力先になります。
複数ファイル出力されるので、既存フォルダに出力しないことをオススメします。

また、`--net="host"`オプションを指定することで、ホストマシンと同じようにDBに接続できるようになります。

**注意点**
2017/07/28現在、DockerHubにsnapshotタグのイメージしか上がっていないため、
イメージ名は明示的に`schemaspy/schemaspy:snapshot`と指定しましょう。
（省略すると自動でlatestになる）

# SchemaSpyのオプション
`-t`で指定できるDBの種類は、デフォルトだと以下の4つになります。

- mysql
- mariadb
- pgsql　(PostgreSql)
- jtds　(SQL Server等)

SchemaSpyはJDBCドライバでDBに接続しているので、ドライバを追加することで接続先を増やすこともできます。
(docker run の`-v`でdriversディレクトリにマウントすることで追加できるらしいですが未検証)
jQueryを使用して、スムーズスクロールをVue.jsの構文で書く。

# Vue.jsのアプリの中にjQueryを共存させる方法です。
jQuery単体よりもスッキリして見やすくなったのではないかと思われます

vueのon:clickでscrollメソッドを呼び出し
scrollの(e)でスクロールする場所を指定しています。

### HTML
```html
 <div id="app">
  <a href="#" on:click="scroll('#a')">a</a>       
  <a href="#" on:click="scroll('#b')">b</a>       
  <a href="#" on:click="scroll('#c')">c</a>       
   <div id="a">
   </div>
  <div id="b">
   </div>
  <div id="c">
   </div>
 </div>
```

### Javascript
```js
var app = new Vue({
    el: '#app',
    data: {
    },
    methods: {
        scroll: function(e) {
            $("html,body").animate({
                scrollTop: $(e).offset().top
            }, 500)
        return false;
        }
    }
});
```
githubのTrendingになっているchromelessをWindowsで試す

## windowsでchromelessのexsampleを試すまで

### chromeless
https://github.com/graphcool/chromeless

下記を参考にnodistをインストール
http://qiita.com/satoyan419/items/56e0b5f35912b9374305


```
nodist + v8.0.0 //node v 6.0.0とかだとasync functionが使えないのでv7.0.0以上にすること
nodist v8.0.0
node -v //確認
npm install chromeless
cd C:\Users\ryo-sato\AppData\Local\Google\Chrome SxS\Application //chromeのパス
chrome.exe --romote-debugging-port=9222  --disable-gpu --headless
```

・C:直下にtmpフォルダを作る //スクリーンショット用
・C:\nodeのフォルダを作る //スクリプトを置く場所
・C:\node\testにexsampleスクリプトを記載


```
cd C:\node
node test
```

これでC:\tmpに下記の感じでchromeのスクリーンショットが保存される。

[https://gyazo.com/d923a2cc564e0b8145f73b60334b56cb]
slackを使いこなそう[登録編]

#slackを始めよう

##slackに招待してもらおう。
###招待してもらうのに必要な情報
- mail address
- 登録される人の名前(必ずではない)

 ##招待してもらったら上で教えたメールアドレスにメールが届きます。


```ruby:mail
Join student council (SLACK TEAM NAME) on Slack
[mail address] has invited you to join the Slack team
student council (From the 12th term). Join now to start collaborating!

[join Now]
```
[join Now]をクリックします。

そうすると以下のようなことが表示されたwebに飛びます。

```ruby:web
Join the Slack team for student council (From the 12th term)


Your name
(ここは招待してもらう時に名前を教えた人は、招待主が入力していればそれが表示されます。
基本的にここが入力されている場合は変更しないようにしましょう。)

Username

(自分で自由に設定してください。
注意: 特に設定されていないと、このusernameが表示されます。)

☑️It's ok to send me (very occasional)
email about the Slack service.
(☑️にチェックをつける)

[NEXT→]
(上の記入が終わっていたら[NEXT→]をクリック。)
```
次のページに行くよ!!

```ruby:web
Set your password
(ここでパスワードを設定します。)

[NEXT→]
(パスワードの記入が終わっていたら[NEXT→]をクリック。)
```
次のページに行くよ!!

```ruby:web
[I Agree]をクリック
```

##これで登録は完了

##アプリを入れよう
####iPhone
https://itunes.apple.com/app/slack-team-communication/id618783545

####Android
https://play.google.com/store/apps/details?id=com.Slack&hl=ja
AngularJSを触ってみた

AngularJSを触ったことなかったのでその練習台としてシグモイド関数を計算するサンプルを書いてみました．

Angularは簡単に言うと非同期処理を実現するためのライブラリで，ブラウザを更新をしなくてもアクションに足して瞬時に入力によって見え方を変える感じです．(ホームページ見るとわかる）

参考にしたのは税込を計算するこのサイト．
http://libro.tuyano.com/index3?id=4736003&page=2

```index.html
<!doctype html>
<html>
<head>
    <title>シグモイド関数の計算</title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
    <script src="script.js"></script>
</head>
<!--ng〇〇というのはAngularと紐づいていることを意味している-->
<body ng-app="myapp" ng-init="input_value=0">
    <h1>シグモイド関数の計算</h1>
　　<!--こう書くことによってctl.{関数名}のような感じで使える．-->
    <div ng-controller="sigmoidController as ctl">
    <div class="input">
        入力: <input type="text" ng-model="input_value">
    </div>
    <p>出力： {{ctl.calcSigmoid(input_value)}}</p>
    </div>
</body>
</html>
```

HTMLの中にjavascriptを書くこともできますが，javascriptはjavascriptで分けた方が保守の面からも良いでしょう．

シグモイド関数とは以下のような式です．
ニューラルネットの計算で利用されます．

```math
f(x)=\frac{1}{1+exp(-x)}
```

この処理を以下のjavascriptでしています．

```script.js
angular.module('myapp',[])
    .controller('sigmoidController',
        function(){
            this.calcSigmoid = function(input_value){
                return 1/(1 + Math.exp(-input_value)); 
            };
        }
    );
```


###実際の動作は以下のサイトでみれます．
http://whispon.com/sigmoid
numpy と matplotlib で三角関数をグラフで表示

<strong>数式を簡単に扱うモジュールとグラフに変換できるモジュールをインポートします。</strong>
```import numpy as np
import matplotlib.pyplot as plt
```

<strong>サイン、コサイン、タンジェントの表示</strong>
```x = plt.linspace(-np.pi,np.pi) # グラフの横表示の指定
plt.plot(x, np.cos(x), color='r', ls='-', label='cos') # コサインの表示
plt.plot(x, np.sin(x), color='b', ls='-', label='sin') # サインの表示
plt.plot(x, np.tan(x), color='c', marker='s', ls='None', label='tan') # タンジェントの表示
```

<strong>グラフの縦横表示指定</strong>
```plt.xlim(-np.pi, np.pi)
plt.ylim(-1.5, 1.5)```

<strong>グラフの縦横表示指定</strong>
```plt.axhline(0, ls='-', c='b', lw=0.5)
plt.axvline(0, ls='-', c='b', lw=0.5)```

<strong>グラフの縦横表示指定</strong>
```plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Graphs')
plt.show()```

<h1>全コード</h1>

```Main.py
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi)
plt.plot(x, np.cos(x), color='r', ls='-', label='cos')
plt.plot(x, np.sin(x), color='b', ls='-', label='sin')
plt.plot(x, np.tan(x), color='c', marker='s', ls='None', label='tan')

plt.xlim(-np.pi, np.pi)
plt.ylim(-1.5, 1.5)

plt.axhline(0, ls='-', c='b', lw=0.5)
plt.axvline(0, ls='-', c='b', lw=0.5)

plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Graphs')

plt.show()
```

<strong>表示</strong>
![download-1.png](https://qiita-image-store.s3.amazonaws.com/0/192270/5161f224-d947-02fa-42c1-08ac3fba55fd.png)
AWS CLI で IAM ユーザーを作る方法

ref:
- http://docs.aws.amazon.com/cli/latest/reference/iam/index.html


以下のコマンドでユーザーの作成が行える

```
$ aws iam create-user \
    --user-name sampleuser
{
    "User": {
        "UserName": "sampleuser",
        "Path": "/",
        "CreateDate": "2017-07-01T00::00Z",
        "UserId": "userId",
        "Arn": "arn:aws:iam::account-id-without-hyphens:user/sampleuser"
    }
}
```


作成したユーザーをグループに追加する場合は

```
 $ aws iam add-user-to-group \
    --user-name sampleuser \
    --group-name Developers
```

AWS Console でログインできるようにするには

```
$ aws iam create-login-profile \
    --user-name sampleuser \
    --password 'hogehoge' \
    --password-reset-required
{
    "LoginProfile": {
        "UserName": "sampleuser",
        "CreateDate": "2017-07-01T00::00Z",
        "PasswordResetRequired": true
    }
}
```

`--password-reset-required` をつけることで初回ログイン時にパスワード再設定が求められるようになる


aws cli などで API アクセスも行う場合は

```
$ aws iam create-access-key \
    --user-name sampleuser
```