OmniAICreator/Qiita-1.07M huggingface dataset:
Google Testのビルド方法


ソースから[Google Test](https://github.com/google/googletest)をビルドする手順の覚書。

# 追記
`cmake`/コンパイラ呼び出しのラッパーツール https://github.com/thombashi/cmakew でWindows/Linuxで簡単にビルドできるようにしてみた。

## e.g. LinuxでGoogle Test 1.8.0をビルド
```
$ wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz
$ tar xvf release-1.8.0.tar.gz
$ cmakew googletest-release-1.8.0/
... 色々出力 ...
$ find build/ -name "*.a"
build/googlemock/gtest/libgtest.a
build/googlemock/gtest/libgtest_main.a
build/googlemock/libgmock.a
build/googlemock/libgmock_main.a
```

別途コンパイラは必要(Linuxならgcc等、Windowsならmsbuild)

---
以下は `cmakew` を使わない手順。

# 前提
## 環境
- Windows (64 bit)
- Visual Studio Community 2015
- cmake 3.6.2

## ビルドが不要なケース
以下を満たす場合は[Visual Studio 2015にGoogle Testを導入する覚書](http://qiita.com/vmmhypervisor/items/3217f790be3b0dc2e2e9)の手順でビルドせずにGoogle Testをインストールできる。

- `gtest_main`が不要
    - 自前でテスト用のmain関数を書く必要有り
- Visual Studioを使用している
- NuGetが使用できる環境

## 前準備
1. https://github.com/google/googletest/releases を開く
2. `release-1.8.0`の source を download
3. 解凍して、`gtest-1.8.0`に rename
4. Build作業用に`gtest-1.8.0/build`を作ってcdする


# Google Testのビルド手順
## cmake
以下のcmakeコマンドを実行。

`cmake .. -DBUILD_GTEST=ON -DBUILD_GMOCK=OFF -G "Visual Studio 14 Win64"`

```console:cmake出力
gtest-1.8.0\build>cmake .. -DBUILD_GTEST=ON -DBUILD_GMOCK=OFF -G "Visual Studio 14 Win64"
-- The C compiler identification is MSVC 19.0.24215.1
-- The CXX compiler identification is MSVC 19.0.24215.1
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PythonInterp: C:/Python27/python.exe (found version "2.7.12")
-- Looking for pthread.h
-- Looking for pthread.h - not found
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: <working dir path>/gtest-1.8.0/build
```

`googletest-distribution.sln`が`build`以下に作成される。

## Build
`googletest-distribution.sln`をVisual Studio 2015で開いて
`ALL_BUILD` を build すると、Google Test ライブラリのバイナリファイルが出力される。 
Debug build　の場合の出力:

- `build\googletest\Debug`
    - gtest.lib
    - gtest.pdb
    - gtest_main.lib
    - gtest_main.pdb
Google日本語入力の辞書ツールを Alfred で開けなくなったので無理やり開けるようにした

Google日本語入力の辞書ツールを Alfred から開けなくなってしまいました。

![fail1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/99db6777-ca39-b255-b824-9b824f1f7cbc.png)

![fail2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/07843a37-22fc-4928-b900-475d39ed4181.png)

原因を調べようとあちこち検索してみたのですが、わかりませんでした。
原因はさておき、代替手段を用意することにしました。
ちなみにメニューから選択すれば普通に使えるのですが
どうしても Alfred からキーボードを使って起動したいです。 **絶対です** 。

![from_menu.png](https://qiita-image-store.s3.amazonaws.com/0/43480/45935e37-e7c0-5104-b5a7-6c26499ee2a9.png)

## <i class='fa fa-search'></i> DictionaryToolをどこから起動すればよいか調べる
`/Applications/GoogleJapaneseInput.localized/DictionaryTool.app`
こいつを直接実行してもAlfredから呼び出したときと同じエラーになりました。

次に アクティビティモニター の「プロセスのサンプルを収集」を使って手がかりを探してみました。
すると、以下を発見しました。

```
Process:         DictionaryTool [3960]
Path:            /Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/DictionaryTool.app/Contents/MacOS/DictionaryTool
```

こいつをコマンドで直接叩いてみたら辞書ツールを起動することができました。

## <i class='fa fa-wrench'></i> Automator で app として登録する
![automator_logo.png](https://qiita-image-store.s3.amazonaws.com/0/43480/41da7bad-a7a0-4419-5fa1-b1618f6cec79.png)

次に Automator を使って、先程みつけたパスを app として登録することにしました。
Automator の利用方法自体については割愛します。

以下のコマンドを「シェルスクリプトを実行」に設定しました。

```bash
"/Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/DictionaryTool.app/Contents/MacOS/DictionaryTool" &
```

![automator.png](https://qiita-image-store.s3.amazonaws.com/0/43480/2e2b5515-d578-4b88-a13c-05a011fb1a88.png)

## <i class='fa fa-flask'></i> Alfred からの起動確認
![alfred.png](https://qiita-image-store.s3.amazonaws.com/0/43480/9edebbe0-3b5f-bd18-31e0-7baf82ff9ea2.png)

無事起動できました

![dictionarytool.png](https://qiita-image-store.s3.amazonaws.com/0/43480/8df33e2f-cf41-47fd-bc16-acc10f97cab8.png)

## <i class='fa fa-pencil'></i> メモ
無理やり解決してみました。
ただ、ふつーに問題を解決する方法があるかもしれないので
こんな変なことをする必要はない気もします。

あと、そもそもどのくらいの人がこの事象に遭遇してるのか分からない。
隣の人の環境では再現してたけど。
Hugo使ってみた

静的サイトジェネレータHugoが良いらしいと噂を聞いたので試してみました。良さそうなら今WordPressで動かしている自分のブログをHugoにしてしまいたいなと思って。

## インストール
    $ brew install hugo
    
Macでhomebrew使ってる人ならこれだけでok。

## サイトを作る
適当なディレクトリに移動して下記のコマンドを実行。「my_site」は好きな名前でok。

    $ hugo new site my_site
    
するとmy_siteディレクトリが作られてその中にhugoのファイル一式が入ってます。作成したディレクトリ内で

    $ hugo server
    
と、打つとhugoのサーバが起動。「localhost:1313」で立ち上がったページを見ることができます。ただし、今は何のファイルもないのでページを見てもまっしろしろすけ。

## ポストを作ってみる
    $ hugo new post/welcome.md
    
で、contentディレクトリの中にpostディレクトリとwelcome.mdという記事の雛形となるファイルが生成されます。

エディタで「welcome.md」を開いてdraftの行を削除。

    +++
    date = "2016-09-29T23:01:24+09:00"
    title = "welcome"

    +++

の下に適当に本文を追加。

	 +++
    date = "2016-09-29T23:01:24+09:00"
    title = "welcome"

    +++
	Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

これで記事の準備ok。

最初、draftのところを削除しないとファイルが出力されないことに気づかなくて結構ハマった。

## テーマを適用してみる

せっかくだからテーマも使ってみましょう。そんなに数は多くないけど公式で幾つかテーマを紹介しているのでその中から[hugo-zen](http://themes.gohugo.io/hugo-zen/)を使ってみることにします。

my_siteの直下にいる状態のターミナルで下記のコマンドを実行。

    $ git clone https://github.com/rakuishi/hugo-zen.git themes/hugo-zen
    
するとthemeディレクトリの中にhugo-zenが入ってるはずです。

config.tomlファイルを開いてファイルの最下部に↓を追記。
 
    theme = "hugo-zen"

	$ hugo
	$ hugo server

とやれば`http://localhost:1313/`でいい感じに出来上がったサイトが表示されるはず。

## 参考
-  [Hugo \- Hugo Quickstart Guide](http://gohugo.io/overview/quickstart/)

- [web帳 \| 爆速 静的サイトジェネレータ「HUGO」が快適すぎる件。](http://www.webcyou.com/?p=7129)
SourceTreeでのコミットを禁止する

ことの発端はこの発言。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">世間ではSourceTreeがよく使われているらしい。だが安心してほしい。弊社のコードでは、Source Treeを使うとコミットができないようになっている。もちろんcliなら問題ないので自然とcliの操作に慣れることができるだろう。</p>&mdash; 衣装をください (@hnle0) <a href="https://twitter.com/hnle0/status/779547685380501504">September 24, 2016</a></blockquote>

まあどういうことかと言うと、現在進行中のプロジェクトではコードの質を担保するため、Linter、この場合はphpcsに引っかかったものをprecommitを使うことで阻止していた。

ところが、PHP7.0+前提のコードを書いているため、Macにデフォルトで搭載されているPHP5.5(これはSierraでも変わらなかったのか)ではSyntax Errorを起こす。
具体的には、phpcsが走る際にcomposerのオートロードでLaravelのhelper関数をロードするときにエラーが発生する。PHP7関係ない。

そのため、`.bash_profile`や`.zshrc`できちんとphp5.6+にPATHが通っていれば問題なようだが、そうでなかった場合に上記の理由によりSourceTreeからコミットできないメンバーが居た。

それをネタにツイートしたのだが、「嘘じゃん、コミットできるじゃん」と指摘されたので「ならば禁止してやろう」という事になった。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">普通にSourceTreeでコミットきるんだけどって上から指摘されたのでSourceTree判定ShellScript(ガバガバ)書きました。 <a href="https://t.co/2Oljv3zsfV">https://t.co/2Oljv3zsfV</a></p>&mdash; 衣装をください (@hnle0) <a href="https://twitter.com/hnle0/status/779580943182934016">2016年9月24日</a></blockquote>
（誤字がガバガバ）

枕が長すぎたけどココからが本題。

## まずprecommit

`.git/hooks/pre-commit`にコミット前に走らせたいスクリプト等を置いておけばそれが走り、0以外で終了すればコミットが中断される。

とは言え、.git以下は言うまでもなく共有が面倒なので[npmモジュール`pre-commit`を利用してチーム全体で低品質なコードをコミットできないようにする](http://qiita.com/potato4d/items/5dfebb9da1c5fe400809)の手法を使用している。

pre-commitのためだけにnpmを使っているが、どうせ全員の環境にあるし`npm install`しといて〜だけで共有できてとても手軽である。もちろん、一度`npm install`を済ませれば後の変更にはいくらでも耐えれる。

pre-commmitでシェルスクリプトが走るようにしておけばいいだろう。

## SourceTree からのコミットを検出
SourceTreeからのコミットを禁止するのだから、それを検出する必要がある。

きっと何かそれらしい環境変数(シェル変数)をSourceTreeが付けてるだろうという甘い考えでそれらを眺めてみたのだが、割とココが厄介だった。

まず、固有の変数というものが見当たらなかった。
ならばSourceTreeの文字列を含むものを、と探してみたのだが、それらしいものもなんというかイマイチ。
強いて言えばPYTHONPATHのようなPATHにSourceTree.appのパスが含まれているが、これを使うのはどうかという感想。

ただ一つ、SourceはGitの`credential.helper`として`sourcetree`というSourceTreeに内臓のものを利用しているらしいと言うことがわかった。
(ちなみに普段CLIの際、自分は`osxkeychain`を利用している。)

ならば、これを利用するしか無い。(これって設定で変えられたりしないよな？)

## シェルスクリプトを書く
別にシェルスクリプトで書かなくてもいいのだが、正直これで済ませるのが一番手っ取り早いので上記の条件をシェルスクリプトにした。
ただ単にhelper見るだけだけど。


```sh:test.sh
if [[ `git config --get credential.helper` = "sourcetree" ]]
then
 echo "SourceTree でのコミットは認めていません。" ; exit 1
fi
```

これをpre-commitスクリプトに書くだけ。神。

<img width="1392" alt="スクリーンショット 2016-09-26 1.07.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/23997/c1b23656-bc3d-7174-d1e0-3ab427cc3311.png">

もちろんcliやその他のアプリからは問題なくコミット可能。神。

-----

なおSourceTreeでのコミット禁止とかSourceTreeが嫌いみたいに見えるかもしれませんが毎度複雑になりすぎたツリー見るにはGUIさまさまです。

流石につらすぎる。まあSourceTreeにはつらい思い出もあるけど……
pyqtgraph で描画したグラフを画像に保存する


- 不人気に定評がある
- matplotlibと違って数万点のプロットでも高速・快適にインタラクティブにグリグリ動かせる

そんな pyqtgraph でのグラフの描画と、それを画像に保存する方法をまとめてみた。



pngで保存する例

```python:graph_png_img_save.py
import numpy as np
import pyqtgraph as pg
import pyqtgraph.exporters # pg.exporters を呼ぶために必要

app = 0 # jupyterなどで kernel が死なないようにするおまじない（PyQt4のみ。PySideでは不要）
app = pg.QtGui.QApplication([])

win = pg.GraphicsWindow()
ppp = win.addPlot()
win.nextRow() # 下方向へ改行 これをコメントアウトすると右にqqqができる
qqq = win.addPlot()

ppp.plot( np.arange(10), np.random.randn(10) ) # x , y
qqq.plot( np.arange(100) ) # y だけでもええようになる。

pg.QtGui.QApplication.processEvents()
exporter = pg.exporters.ImageExporter(win.scene()) # exportersの直前に pg.QtGui.QApplication.processEvents() を呼ぶ！
exporter.export("aaa.png")    
app.exec_()
```
PhpStorm(on Windows10) 基本設定メモ(4) - PHPUnit設定

$sin^{-1}x$番煎じのメモ

PHPUnit設定(Windowsに導入)

 * [PhpStorm(on Windows10) 基本設定メモ(1) - php+xdebug環境](http://qiita.com/ckit_idle/items/8b0361f0eedc5d41c4f7)
 * [PhpStorm(on Windows10) 基本設定メモ(2) - Editor設定+plugin](http://qiita.com/ckit_idle/items/8df858d5b77135a440aa)
 * [PhpStorm(on Windows10) 基本設定メモ(3) - SVN/Git設定](http://qiita.com/ckit_idle/items/35eb68d9eab8ba1876fa)
 * PhpStorm(on Windows10) 基本設定メモ(4) - PHPUnit設定(本記事)
 * vagrant+remote debug設定(書く予定)

| software   | version  |
|:-----------|---------:|
| PhpStorm   | v2016.02 |

# Composer install

本記事ではPHPUnitはComposer経由で利用します（手動でダウンロードしても勿論できますが）

[Composer Getting Started](https://getcomposer.org/doc/00-intro.md#installation-windows)
Composer-Setup.exeをダウンロードして実行

OpenSSLをOnにするの推奨だと怒られた場合はphp.iniを以下のように編集

```
;extension=php_openssl.dll
↓
extension=php_openssl.dll
```

# PhpStorm Setting

## Composer Settings

projectを右クリックして
Composer > Init Composer...

```
Path to PHP executable: <PHP_PATH>
Path to composer.phar: <COMPOSER_PATH>
```

勝手にcomposer.jsonが開くので、右クリックして
Composer > Add dependency...

phpunit/phpunitを選択してinstall

## PHPUnit Settings

ツールバーのFile > Settings...

### Languages & Frameworks > PHP > PHPUnit

```
Use Compose autoloaderにチェック
Path to script: <PROJECT_PATH>\vendor\autoload.php
```

## Run Config

ツールバーの Run > Edit Configurations...

+を押してPHPUnitを指定

TestRunnerを適当に指定

```
Name: UnitTest
Directory: <UNITTEST_PATH>
```

# 使ってみる

（PHPUnitを使ってテストクラス書いておく）
UnitTestを指定してRun
LINE BOT API からLINE Message APIへの移行

LINE Bot APIがトライアルサービスを終了する予定だということなので、移行先である LINE Message APIへコードを移行してみました。移行にあたっての作業は以下の通りでした。

## JSON構造の変更
Webhookで呼び出される場合のパラメータのJSONを始め、各種APIの引数と戻り値のJSON構造が変更になっています。

## 認証方法の変更
Message APIを呼び出す場合の認証はchannel_idとchannel_secret、channel_aclからchannel_tokenに一本化されています。これは非常に分かりやすいですね。

## ユーザー識別の変更
ユーザーの識別子がmessage.idからsource.userIdに変更になっています。

## Content-Lengthの指定
これ、Message API仕様書に漏れていたので少し悩みました。普通にPOSTとするとBad requestが帰ってきます。Bad request＝Content-Lengthというのは、Web APIを利用すると直面するあるあるなのですが、今回はリクエストのJSONにも手を入れていたので、JSONのどこかでカンマが抜けているのか、クオーテーションがおかしいのか、という誤記の方に注意がいってしまいました。

（2016.10.01追記）
## 画像の送信
応答メッセージ中に画像URLを設定する場合、httpsにしないとinvalid uri schemeになります。

## 困っていること
### 日本語が送れない
2016.9.29時点で日本語のメッセージを送るとエラーになります。Content-Typeをapplication/json; charset=utf-8としてもダメでした。ここは引き続き調査したいと思います。
2016.10.1時点で、まだダメです。
WordPress でメディアがアップロードできなかった


## 状態
* BlueOnyx 上にサブドメインとして追加したサイト
* WordPress でメディアがアップロードできない
* エラー内容 `一時フォルダが見つかりません。`
* テーマのインストールとかはできる
* もちろん WordPress 自体は閲覧できるし、ドメインも浸透している
* メインサイトの方の WordPress ではアップロードが行えている

## 一時フォルダってどれのこと？
WordPress のことはあまり詳しくないので、一口に「一時フォルダ」といっても WordPress に用意されてあるものなのか、それともルート直下にある tmp フォルダなのかわからなかった。

### とりあえずエラー出たページの php ファイルを開いてみる。
アップロードが行われているのは27行目あたり。

```/wp-admin/media-new.php
if ( $_POST ) {
	if ( isset($_POST['html-upload']) && !empty($_FILES) ) {
		check_admin_referer('media-form');
		// Upload File button was clicked
		$upload_id = media_handle_upload( 'async-upload', $post_id );
		if ( is_wp_error( $upload_id ) ) {
			wp_die( $upload_id );
		}
	}
	wp_redirect( admin_url( 'upload.php' ) );
	exit;
}
```

アップロード失敗しているときに最初に見るのは $_FILES の中身だ。
`print_r( $_FILES ); exit;` をとりあえずコードに突っ込みアップロードしてみると、tmp_name がないし、error に 6 が入っていた。

**あ！これって /tmp フォルダが原因のやつだ！**

良くあるやつですな。
エラーログを見ると `PHP Warning:  File upload error - unable to create a temporary file in Unknown` とある。
はいはい。いつものやついつものやつ。

で、該当のフォルダを見に行くとパーミッションが以下のようになっていた。
`drwxrwxrwxt`
最後の t はスティッキービットと呼ばれるやつで、詳しいことは [WikiPedia](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AD%E3%83%BC%E3%83%93%E3%83%83%E3%83%88) 先生にでも聞いてほしい。
簡単に言うと所有者しか操作できないってことだ。
で、所有者は root である。
まぁ、ここまではよくある話だ。
セキュリティを担保するために良く行われる設定なので特に問題はない。
そしてメインの WordPress でアップロードできるので問題はここではない。

## じゃぁどこよ？
BlueOnyx の設定画面を開きましょうかね。
![BlueOnyx-PHP-setting.png](https://qiita-image-store.s3.amazonaws.com/0/71497/baef7137-e39b-e2cc-fd96-12272f314710.png)
はい。こちらになります。
Open Basedir (Vsite) ってところが空っぽなせいじゃね？
/tmp/ を入れて Save っと。
だがしかし、
**反　映　さ　れ　な　い　！**
何故って思ったけど、よくわからない。
誰か教えて。

## 無理やり解決したよ。
この設定の実体ファイルがどこかにあるはずなので探し回った。
`/etc/httpd/conf.d/subdomains/` の直下にあった。
> php_admin_value open_basedir /usr/xxxxxxxxxxx/configs/php/:/home/.sites/XXX/siteXXX/

無いと思っていたが、 open_basedir の記述が書かれている。
もしかしたら弄れないような仕様なんだろうか？(それなら管理画面にないと思うけど)

ま、よくわからないので以下のように書き換えて、 Apache をリロード。
> php_admin_value open_basedir /usr/sausalito/configs/php/:/tmp/:/home/.sites/111/site30/

これでアップロードできるようになった。

## 注意事項
これはあくまで BlueOnyx のサーバ管理者だからできたことで、普通のユーザにはできない。
何か方法があればいいんだけど…。
Riot.js入門-4


今回はRiot.jsのコンポーネントのロジック内で使用できる各種インスタンスプロパティを紹介します。

## opts
``this.opts`` はマウント時に外部から渡される値が格納されています。

### riot.mount関数から渡す

```
riot.mount('sample', {title: 'Riot.js入門'})
```

このように第二引数（第一引数にマウントさせるHTML Elementを渡してる場合は第三引数）に渡すと ``this.opts.title`` に値が入ります。

### 入れ子から渡す
```
<sample title="Riot.js入門" />
```
このようにアトリビュートに渡すと、こちらも同様に ``this.opts.title`` に値が入ります。


## root
``this.root`` は自身のHTML Elementが入ります。

## parent
``this.parent`` は入れ子限定のプロパティで、自身を入れ子にしている親インスタンスが入ります。

## tags
``this.tags`` は入れ子の子インスタンスが入ります。

```sample.tag
<sample>
	<div data-is="a"></div>
	<div data-is="b"></div>
	<div data-is="b"></div>
	
	<script>
		console.log(this.tags.a); // RiotTagインスタンス
		console.log(this.tags.b); // RiotTagインスタンスの配列
		console.log(this.tags.b[0]); // RiotTagインスタンス
	</script>
</sample>
```
``this.tags.カスタムタグ名`` でアクセスでき、同じカスタムタグがマウントされている場合は配列になります。

## 名前付き要素
`` name `` または ``id`` アトリビュートのある要素は、JavaScriptから簡単にアクセスできるよう、自動的にコンテキストに追加されます。

```sample.tag
<sample>
	<div id="home"></div>
	<input name="inputer" value="test"></p>
	
	<script>
		console.log(this.home); // DivのHTML Element
		console.log(this.inputer.value); // InputのHTML Elementのvalue値
	</script>
</sample>
```
Riot.js入門-2


今回はRiot.jsの基本構造の紹介です。

## 基本構造

```sample.tag
<sample>
	<!-- HTML:Template -->
	<h1>hello world</h1>
	
	<!-- CSS:Style -->	
	<style>
		h1 {
			color: #f00;
		}
	</style>
	
	<!-- Javascript:Logic -->
	<script>
		console.log('Riot.js入門');
	</script>
</sample>
```

コンポーネントは、このように上から順にテンプレート→スタイル→ロジックと定義していきます（この順番は厳密なものではありません）。

何も珍しいことはないですね。見慣れたHTMLそのものです。

### スコープ
これで問題なく動くのですが、このままだとスタイルがページ全体に適応されてしまいます。

コンポーネントは **『内部で完結していて、外部に影響を与えないこと』** が大事なので、影響範囲をコンポーネントの内部のみに適応する書き方をします。

```
<style scoped>
	:scope {
		display: block;
	}
	
	h1 {
		color: #f00;
	}
</style>
```

この ``scoped`` アトリビュートを記述することで、同一ページにある他の ``h1`` タグには影響を与えず、``sample.tag`` の中の ``h1`` にのみスタイルを適応できます。

ついでに ``:scope`` は ``<sample />`` 自身のスタイルを定義できます（この場合は ``<sample />`` はブロック要素になる）。

### プリプロセッサ

デフォルトのままだと ``style`` の中にはCSS、``script`` の中にはes5標準のJavascriptしか書けませんが、

``type`` アトリビュートを用いることで、好きなプリプロセッサを利用することができます。

````
<style type="text/scss">
	.hogehoge {
		.fugafuga {
			/* hogehoge */
		}
	}
</style>

<script type="text/babel">
	const TITLE = 'Riot.js入門';
</script>

````

Rito.jsが公表でサポートしているのは以下の通りです。

#### CSS

* less
* sass
* scss
* stylus

#### JS

* livescript
* typescript
* es6 - (babel-coreまたはbabelを使用)
* babel - (babel-core v6.x またはes2015プリセットを使用)
* coffee または coffeescript
nvmとNode.jsにまつわるアップデートとメモ

## Node.jsのバージョンアップ(nvm)

```bash
$ nvm ls-remote
$ nvm install v6.7.0
# 一度それまでに使っていたバージョンに戻す
$ nvm use v6.6.0
$ npm list -g --depth=0
# リストを適当に編集
# ディレクトリの一覧と同じ
# ll ~/.nvm/versions/node/v6.6.0/lib/node_modules/
$ nvm use v6.7.0
# インストールするんだけど不要なの消さないとなぁ…
$ npm install --global babel-cli babel-preset-es2015 bower childish-process concurrently create-react-app eslint eslint-config-google eslint-plugin-import eslint-plugin-node express-generator generator-express generator-express-kick-starter generator-mongoose generator-ng-fullstack generator-node-express-mongo generator-polymer generator-vulgar generator-webapp grunt-cli gulp gulp-babel gulp-cli gulp-compass gulp-if gulp-load-plugins gulp-notify gulp-uglify istanbul jshint jspm karma mocha node-gyp node-inspector nodemon npm npm-check-updates nw-gyp phantom typings vulgar-cli webpack webpack-dev-server yo yuidocjs
# 不要なバージョンがあれば削除
$ nvm uninstall v6.6.0
# aliasでNode.jsバージョンを新しいバージョンで固定する
$ nvm alias default v6.7.0
$ nvm ls
```

## package.jsonのアップデート

```bash
# ncuが無ければインストール
$ npm install -g npm-check-updates
# package.jsonのあるディレクトリで実行
$ npm update
$ ncu -u
$ ncu -a/--upgradeAll.
```

## npmモジュールのアップデート

```bash
$ npm i -S pug@latest
```
Pythonで日次作業の効率化を図ってみた

効率化というほど効率よくなっているかは微妙ですが、仕事の合間にやってみました。

###概要
ファイルサーバからローカルにいくつかのファイルをコピーしてきます。ついでにディレクトリも作成します。

###背景
その日のタスク一覧を印刷して担当者に配るというとても新人らしい日次作業を割り当てられています。ローカルにディレクトリを作成して、ファイルサーバからそこにファイルをコピーするという準備が必要です。ちょろっとコードを書けばワンクリックで準備が終わるようになりそうだと思い、やってみました。

###本論
ローカルにyyyymmddという規則でその日分のファイルを入れるディレクトリを作ります。その後にファイルサーバからタスク一覧ファイルをコピーしてきます。

まずスクリプト実行時の時刻を取得し、それを基に年月日を文字列として得ます。
```os.mkdir(path)```でディレクトリを作成。これで第一段階は終了。
次に、ファイルサーバのタスク一覧があるディレクトリのファイル一覧を```os.listdir(path)```で取得します。
コピー対象のファイル名は先頭に共通した文字列【hoge】を持っているので、```str.startswith(prefix)```で該当するファイルを探すことができます。
ファイル一覧はリストなので、ループで一つずつ回しながらファイルを探し、見つけ次第```shutil.copy(src,dst)```でファイルサーバから作成したディレクトリへコピーします。

これにて日次作業の準備は完了です。後はちまちまと印刷したりするだけです。

```
#encode:utf-8

import os
import shutil
from datetime import datetime

if __name__ == "__main__":

    #現在時刻を取得
    today = datetime.now().strftime('%Y/%m/%d %H:%M:%S')
    y = datetime.now().strftime('%Y')    
    m = datetime.now().strftime('%m')
    d = datetime.now().strftime('%d')

	#フォルダ名(yyyymmdd)
    dirname = y + m + d
	#フォルダ作成
    os.mkdir(dirname)

    #コピーしたいファイルがあるディレクトリ.
    copydir = 'B:/foo/bar/baz/'
	#ディレクトリに置かれたファイルの一覧を取得
    files = os.listdir(copydir)

    for n in range(len(files)):
		#共通した文字列を持つファイルをyyyymmddフォルダにコピー
        if files[n].startswith('【hoge】'):
            print(files[n])
            shutil.copy(copydir + files[n] , './' + dirname + '/' + files[n])
```

###[2016.10.01追記]
【修正】
明らかに間違っている箇所なので```encode:utf-8``` → ```encoding:utf-8```に修正しました。コメントでの指摘、ありがとうございました。

**【悲報】**
フェーズが進んだため日次作業は終了と言われました。
せっかく書いたコードですが、しばらく出番はなさそうです('ω')
とはいえ機能が単純なので他への応用もできるかもしれません。
RustでFacebook Messenger Bot 作成

[rmessenger](https://github.com/nocotan/rmessenger)

Rust用FacebookMessengerのWrapperです.

##インストール
Cargo.tomlに以下を追記

```toml
rmessenger = "0.0.4"
```

##使いかた
[GitHubのREADME](https://github.com/nocotan/rmessenger/blob/master/README.md)のとおりですが、

###テキストメッセージ

```rust
extern crate rmessenger;
use rmessenger::bot;

fn main() {
    let bot = bot::Bot::new("<YOUR ACCESS TOKEN>", "<YOUR APP SECRET>");
    bot.send_text_message("<recipient_id>", "hello!");
}
```

ふつうのテキストメッセージの他に[Generic Template](https://developers.facebook.com/docs/messenger-platform/send-api-reference/generic-template)の形式でも送信できます.


```rust
extern crate rmessenger;
use rmessenger::bot;

fn main() {
    let bot = bot::Bot::new("<YOUR ACCESS TOKEN>", "<YOUR APP SECRET>");
    bot.send_generic_message("<recipient_id>>",
                             "[{'title': 'example',
                                'image_url': 'https://petersfancybrownhats.com/company_image.png'
                                }]");
}
```

[crates.ioはこちら](https://crates.io/crates/rmessenger)
[WordPress] メタデータのお掃除

sql 叩いて直接 wp_posts から記事データ消したとかで、関連するメタデータが残ってることがあります。
それらを一括で削除するための SQL

```sql:remove_postmeta.sql
/* postmeta のお掃除 */
DELETE
 FROM wp_postmeta
 WHERE NOT EXISTS (
  SELECT 'x'
   FROM wp_posts
   WHERE wp_posts.ID = wp_postmeta.post_id
  );
/* comment のお掃除 */
DELETE
 FROM wp_comments
 WHERE NOT EXISTS (
  SELECT 'x'
   FROM wp_posts
   WHERE wp_posts.ID = wp_comments.comment_post_ID
  );
/* commentmeta のお掃除 */
DELETE
 FROM wp_commentmeta
 WHERE NOT EXISTS (
  SELECT 'x'
   FROM wp_comments
   WHERE wp_comments.comment_ID = wp_commentmeta.comment_id
  );
/* term_relationships のお掃除 */
DELETE
 FROM wp_term_relationships
 WHERE NOT EXISTS (
  SELECT 'x'
   FROM wp_posts
   WHERE wp_posts.ID = wp_term_relationships.object_id
  );
/* taxonomy に紐づけられた記事数の再カウント */
UPDATE wp_term_taxonomy
 SET count = (
  SELECT COUNT(object_id)
   FROM wp_term_relationships
   WHERE wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
  );
```
IoTスタートアップが試作や製造を依頼できそうな会社一覧


順次追加していきます。
追加すべきものがあればお気軽に編集リクエストください。

# ケース加工

- [タカチ](http://www.takachi-el.co.jp/)
  - タカチのケースであれば加工もやってもらえます
- [奥澤](http://www.case-okuzawa.co.jp/)
  - 秋葉原ラジオデパート地下1階
- [proto labs](https://www.protolabs.co.jp/)
- [Smart Prototyping](http://smart-prototyping.com/Prototyping-Services/Mechanical-Prototyping)


# 電子回路試作・製造

- [南デザイン](http://www.minamidesign.co.jp/)
- [富良野電気](http://www.furano.co.jp/)
- 魔法の大鍋
- [Jigowatts Inc.](https://jigowatts.jp/)


# 便利なモジュールをつくっている会社

依頼じゃないですが便利な既存モジュールは外注みたいなものなので

- [東京デバイセズ](https://tokyodevices.jp/)
CSS3 Flexbox のまとめ

# 幅
幅が潰れてしまうことがあったのだが、この記事の説明で幅の指定方法がわかった。

Flexboxを使うなら知っておきたい「flexアイテム」の幅の計算方法
http://parashuto.com/rriver/development/how-flex-item-width-is-calculated

# 並び方
CSS3 Flexbox の各プロパティの使い方をヴィジュアルで詳しく解説
http://coliss.com/articles/build-websites/operation/css/css3-flexbox-properties-by-scotch.html

# 並び方が試せるツール
Flexbox Playground
https://demos.scotch.io/visual-guide-to-css3-flexbox-flexbox-playground/demos/
Packed構造体の表示

忘れていたのでメモ。

Packedな構造体のメンバの値をシミュレーション中に1回で表示させるのにPretty Printという機能がある。
「%p」で指定する。

```sv
`timescale 1ns/1ps

typedef struct packed {
    logic [7:0] r;
    logic [7:0] g;
    logic [7:0] b;
} rgb_t;

module tb();
    rgb_t rgb;

    initial begin
        for(int i=0; i<10; i++) begin
            rgb.r = $random();
            rgb.g = $random();
            rgb.b = $random();
            $display("%p", rgb);
        end
        $finish(1);
    end

endmodule
```

結果はこんな感じ。

```
'{r:'h24, g:'h81, b:'h9}
'{r:'h63, g:'hd, b:'h8d}
'{r:'h65, g:'h12, b:'h1}
'{r:'hd, g:'h76, b:'h3d}
'{r:'hed, g:'h8c, b:'hf9}
'{r:'hc6, g:'hc5, b:'haa}
'{r:'he5, g:'h77, b:'h12}
'{r:'h8f, g:'hf2, b:'hce}
'{r:'he8, g:'hc5, b:'h5c}
'{r:'hbd, g:'h2d, b:'h65}
```

16進か2進表示しかできないけど、個人的にはあまり問題にしていない。
機械学習を学んで、基本的な考え方をまとめました

# 機械学習とは
機械学習とは、与えられたデータから規則性を見つけ出し、その後の予測を行うことです。この規則性を数式で表したものをモデルといいます。

# 機械学習の基礎知識
機械学習でまず必要な知識は確率や統計です。また計算するために必要な知識として、微分と行列があります。

# 機械学習の流れ
機械学習は以下の手順で行います。
1. データ収集
2. データクレンジング
3. モデルの生成
4. モデルの評価

# データ収集とデータクレンジング
データ収集では、あるデータを集めれば、こういった予測ができると仮定してデータを集めます。収集したデータは、予測したいデータ（目的変数）と予測するために使用するデータ（説明変数）に分かれます。
収集したデータはそのまま使える訳ではなく、データクレンジングが必要になります。異常値や誤差など不適切なデータを除きます。一概に言えるわけではないので、データを見たりモデルの作成や評価を行いながらクレンジングを行っていくこともあります。
データクレンジングが終わると、説明変数から目的変数を求める式を見つけたいわけですが、そこで出て来るのがモデルです。

# モデルの生成
モデルは世の中にたくさんありますが、何も考えずに適用すればよいわけではなくて、モデルの前提や仮定を考慮してモデルを選ぶ必要があります。そのためモデルの導出方法を理解しておくことも大切なことだと思います。

# モデルの導出
モデルを導くには、尤度（ゆうど）関数を使います。尤度関数は尤も（もっとも）らしい度合を表す関数です。尤もらしさが最小や最大になる時が一番尤もらしい状態といえます。その考え方が最尤法です。
例えば回帰直線を求める最小二乗法。これはデータが直線で表わされることと誤差が正規分布になる事を仮定しています。そこで誤差の正規分布が最大つまり誤差が小さく中心に集まっている状態となるパラメータを求めるのが最尤法です。
さらに考えを拡張したのが、MAP推定です。尤度関数にベイズの定理を適用して、事前確率という任意の確率を与える事ができて、それを最尤法の考え方で同じように最小や最大を求めます。例えば最小二乗法の拡張であるridge回帰などが出てきます。
モデルの導出の基本は尤度関数と最尤法を理解するのが重要だと思います。

# モデルの評価
モデルを決めた後は、モデルの予測精度を評価します。よく使われるものに交差検証法があります。

# 交差検証法
データを例えば10分割します。分割した1つ以外でモデルを作成しパラメータを決定します。残った1つのデータで目的変数を求めていて、実際の値とのかい離を確認します。1つのデータを順に入れ替えて、モデルの精度を10回検証できることになります。1つを未知のデータとみなして評価するため、その後の予想の精度の信頼性にもつながります。

# まとめ
機械学習の基本は以下だと思います。
- 説明変数から目的変数を予測
- データ収集、データクレンジング、モデルの生成、モデルの評価の順番で実施
- モデル導出の基本は、尤度関数と最尤法

ただ基本的な考え方がわかっても実践するのが難しいです。実践から学ぶこと、苦労することがたくさんあります。
また機械学習はどんどん進化していていますので、新しい知識を学んだり、技術を取り入れたりすることは必須だと思います。
まずは基本を理解して、実践して、次のステップに進んでいきたいと思います。
Deviseでサインイン/サインアウト後のリダイレクト先を変更する



Deviseで複数のログイン機能を実装している際、サインインやサインアウト後のリダイレクト先が正しく遷移しません。
（例えば一般ユーザーのルートを[root_path]()、管理者ユーザーのルートを[admin_root_path]() などと設定している場合、管理者のサインアウト後も root_pathにリダイレクトされてしまいます）


DeviseのWikiを調べてみたところ対処法が載っていました。
Devise::Controllers::Helpersの [after_sign_in_path_for](http://www.rubydoc.info/gems/devise/Devise/Controllers/Helpers#after_sign_in_path_for-instance_method) と [after_sign_out_path_for](http://www.rubydoc.info/gems/devise/Devise/Controllers/Helpers#after_sign_out_path_for-instance_method) をそれぞれオーバーライドしてリダイレクトURLを返すようにすれば良いそうです。


**config/application.rb**

```ruby
class ApplicationController < ActionController::Base
 
 ~(省略)~

  private

  # ログイン後のリダイレクト先
  def after_sign_in_path_for(resource_or_scope)
    if resource_or_scope.is_a?(AdminUser)
      admin_root_path
    else
      root_path
    end
  end

  # ログアウト後のリダイレクト先
  def after_sign_out_path_for(resource_or_scope)
    if resource_or_scope == :admin_admin_user
      new_admin_admin_user_session_path
    else
      new_user_session_path
    end
  end
end

```


## 参考

[How To: Change the redirect path after destroying a session i.e. signing out](https://github.com/plataformatec/devise/wiki/How-To:-Change-the-redirect-path-after-destroying-a-session-i.e.-signing-out)
Excel VBAで.xlsxファイルをPDFに一括変換する

# Excel VBAで.xlsxファイルをPDFに一括変換する

## 背景

Linuxサーバ上で.xlsx形式の帳票を出力する機能を実装した際、クライアントから「PDF形式にもできない？」という要望が来ると「ぐぬぬ・・・」ということになる場合があります。

以前、Linuxサーバ上のOpenOfficeやLibreOfficeで.xlsxファイルからPDFへの変換を試したことがあるのですが、フォントや再現性の問題から実用的ではありませんでした。

そこで今回は、.xlsxファイルをPDFに一括変換するExcel VBAマクロを実装した.xlsmファイルを使ってクライアント側のExcelで一括変換してもらおうと思います！（もちろん実際にはクライアントとの交渉次第ですが。。。）

## マクロ全容

下記の内容のマクロを実装した「pdf.xlsm」のようなものを準備する想定です。

```
Sub convertToPdf()
  Dim buf As String
  Dim cnt As Long
  Dim files() As String
  Dim rc As Integer
  Dim item As Variant
  Dim fullname As String
  Dim fullnamePdf As String
  Dim objExcel As Object 'Excel.Application
  Dim objBook As Object 'Excel.Workbook
  Dim objFs As Object 'Scripting.FilesystemObject
  
  Set objFs = CreateObject("Scripting.FilesystemObject")
  
  buf = Dir(ThisWorkbook.Path & "\*.xlsx")
  cnt = 0
  Do While buf <> ""
    ReDim Preserve files(cnt)
    files(cnt) = buf
    cnt = cnt + 1
    buf = Dir()
  Loop

  If cnt = 0 Then
    MsgBox (".xlsxファイルが見つからないため終了します。")
  Else
    rc = MsgBox(".xlsxファイルが" & cnt & "件見つかりました。一括変換処理を行いますか？", vbYesNo + vbQuestion, "確認")
    If rc = vbYes Then
      Set objExcel = CreateObject("Excel.Application")
      objExcel.Visible = False
      For Each item In files()
        fullname = ThisWorkbook.Path & "\" & item
        fullnamePdf = ThisWorkbook.Path & "\" & objFs.GetBaseName(item) & ".pdf"
        Set objBook = objExcel.Workbooks.Open(fullname, , True)
        objBook .ExportAsFixedFormat 0, fullnamePdf
        objBook.Close (False)
        Set objBook= Nothing
      Next item
      objExcel.Quit
      Set objExcel = Nothing
      MsgBox ("処理が完了しました。")
    Else
      MsgBox ("処理を中断しました。")
    End If
  End If

  Set objFs = Nothing
End Sub
```

## マクロ解説

### .xlsxファイルの列挙

このマクロは.xlsmファイルで利用することを前提として、.xlsmファイルと同じフォルダにある.xlsxファイルを列挙します。

```
  Set objFs = CreateObject("Scripting.FilesystemObject")
  
  buf = Dir(ThisWorkbook.Path & "\*.xlsx")
  cnt = 0
  Do While buf <> ""
    ReDim Preserve files(cnt)
    files(cnt) = buf
    cnt = cnt + 1
    buf = Dir()
  Loop
```

列挙したファイル名は `files` 配列に格納し、 `cnt` でファイル数をカウントしています。

## .xlsxファイルをPDFに変換

Excelアプリケーションのオブジェクトを作成して別のExcelを起動し、 `ExportAsFixedFormat` で変換します。PDFファイルは「hoge.xlsx」に対して同じフォルダに「hoge.pdf」というファイル名で作成します。

```
      Set objExcel = CreateObject("Excel.Application")
      objExcel.Visible = False
      For Each item In files()
        fullname = ThisWorkbook.Path & "\" & item
        fullnamePdf = ThisWorkbook.Path & "\" & objFs.GetBaseName(item) & ".pdf"
        Set objBook = objExcel.Workbooks.Open(fullname, , True)
        objBook .ExportAsFixedFormat 0, fullnamePdf
        objBook.Close (False)
        Set objBook= Nothing
      Next item
      objExcel.Quit
      Set objExcel = Nothing
```

### 後処理

作成したオブジェクトを破棄します。

```
  Set objFs = Nothing
```
potatotips #33 に参加してきた

potatotips#33 にブログまとめ枠(iOS)で参加してきました。
当日の発表内容をまとめます。

発表資料のリンクもれがあれば コメントください。

# Firebaseでカンタン、私たちだけのオリジナル結婚アプリ(motokiee さん)

- 結婚式の写真を撮っても届かないので便利と思った
- 課題
  - Android どうしよう
      - 参加者 32/52 が iPhone だったので iOSのみにした
  - 配布
      - private にしたかったので Deploygate で
- Firebase 
  - Free プランで OK
  - 写真のアップロートには Storage を使った
  - Notifications で Push 通知
      - 内容は JSON で Storage に保存した
- 結果
  - 172 枚のアップロードがあった
  - 妻が喜んでくれたのが良かった

# オフライン時にNavigationBarの下に出てくるバーを作る(teruto_yamasakiさん)

- 発表資料
  - https://speakerdeck.com/snoozelag/ohurainshi-nadoninavigationbarfalsexia-nibiao-shi-surubawozuo-ru
- インターネットに接続できないことをお知らせするバーのこと
- UIViewController の View に NavigationBar の真下に追加して実装した
- 感想
  - やっぱり UINavigationBar のカスタマイズは難しい

# 大は小を兼ねるな(takasek さん)

- 日付管理どうします?
- ShachikuDate を実装するなら.. 
  - Date の extension として comptuted property を実装
  - これだと問題がいくつかある
- 実は日付があればいいだけ
  - `struct YMD`
  - 機能を小さくすれば解決することもある
- 機能が大きいと Xcode 8移行がスムースにいかないなどの問題がある
    - ライブラリの対応が済んでいないなど
- 結論
  - 大は小を兼ねるな

# UITableViewのスクロールに合わせてUIViewControllerを縦方向にページングする(marty-suzukiさん)

- 発表資料
  - https://speakerdeck.com/martysuzuki/uitableviewfalsesukurorunihe-wasete-uiviewcontrollerwozong-fang-xiang-nipezingusuru
- TableView をスクロールすると 別のTableViewController に遷移する
- Qiita に詳しく書きました
  - http://qiita.com/marty-suzuki/items/f6630543142c34d442ed

# Xcode8のCI事情(nafu003 さん)

- 発表資料
  - https://speakerdeck.com/nafu/xcode-8-ci-with-fastlane
- CI の対応状況
    - Bitrise, Travis はすぐに GM
    - Circle CI　はその 1 ~ 2 wk 遅れ
- Fastlane 使っている人は Swift 2.3 の Xcode 8 ビルドに注意
  - `toolchain option`
  - `use_legacy_build_api_option`
- 便利な Fastlane plugin を作ったら公開しよう

# WebPはもう時代遅れ!?(がんじー さん)

- BPG is Better Portable Graphics
  - 容量が小さい割に高品質
  - JPEG の半分で同品質の表示ができる
- ライブラリ作りました
  - https://github.com/chuganzy/HCImage-BPG
- WebP と比較
  - デコードが遅い
- 向いているところ
  - タイムラインは向いてない
  - 詳細ビューに向いている
- まとめ
  - 特許にも注意
  - 実戦投入にはまだ早いかも

# 使いたくないStoryboardを使わないでよくする為には(satomiretrieverさん)

- 画面遷移を把握したい？
  - Storyboard よりも Sketch などを使えばすむ話
  - デザインと実装は分けたほうがいい
- 初心者に向いている？
    - 初速よりも最終成果物の品質が大事

# 最近、CoreDataどうですか？(Noritaka Kamiyaさん)

- iOS 10 でうれしい update があった
    - CoreDataのfetchもついに型指定できるようになった
        - さよなら Force Cast
    - Persistence Container
        - Insert するだけで 100 行かかっていたのを簡略化
LLMNRのDiscovery queryについて

Microsoftが作ったLMNNRというプロトコルのDiscovery queryの送信について調べてみました。

LLNNRは、IP multicastを使って名前解決するためのプロトコルです。
LLNNRの正式名称は「Link-Local Multicast Name Resolution」で、[RFC4795](https://www.ietf.org/rfc/rfc4795.txt)で規定されています。

# LLMNRのプロトコル 概要
* UDP/IPを使う。
* IPv4： マルチキャストアドレス 224.0.0.252, MAC address of 01-00-5E-00-00-FC
* IPv6： マルチキャストアドレス FF02:0:0:0:0:0:1:3 , MAC address of 33-33-00-01-00-03
* UDPを使う。　ポートは5355
* Senderは上記のアドレスとポートにDicovery queryを送信する、Responderはそれに対してレスポンスを返す。


## LMNNRのDiscoveryパケット のフォーマット
* IPヘッダは宛先アドレスを224.0.0.252にする
* UDPヘッダは宛先アドレスを5355にする
* LLMNR
 * id とりあえず0を設定
 * flags とりあえず0を設定
 * qdcount よくわからないけど1を設定
 * ancount よくわからないけど0を設定
 * nscount よくわからないけど0を設定
 * arcount よくわからないけど0を設定
 * オプションに　query name　の文字列、query typeに1を設定

以上の調査の結果、AndroidでLLMNRのDiscovery queryの送信ができたので良かったです。
超便利！Zshで、実行しようとしているコマンドをエディタで編集する

Zsh使いには当然かもしれませんが・・・

# 動機

シェルでコマンドを入力している時に、複数行になったり、長くなったりすると編集するのが辛い。

特にワンライナーが長すぎて、何回もパイプが使われていると、非常に見づらい。

# `C-x C-e`を押してみよう

そんな時に、`C-x C-e` を押すと、エディタが立ち上がり、現在入力されているコマンドを編集できる。

エディタを抜けると、コマンドが編集されているので、あとはそれを実行すれば良い。

別ファイルに保存しておくこともできるので、「現在打っているコマンドを保存したい」みたいな用途でも使えるかもしれない。

自分は今までこれの実現のために、わざわざ`echo [command] > /tmp/a`みたいなことをしていた・・・

# 補足

ここで立ち上がるエディタは、環境変数`$VISUAL`で決まる。
なので`export VISUAL=emacs`などとすると変更できる。
Applicationクラスを使ってみる


## Applicationクラスを継承したクラスを作成

```java:MainApplication.java
public class MainApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        Log.d("TAG", "hello");
    }
}
```

##  AndroidManifestファイルに一行追記
Applicationクラスを使うにはAndroidManifest.xmlにクラス名を追記することで、アプリ起動時に自動的にインスタンス化される

android:name=".MainApplication"を追加

```xml:AndroidManifest.xml
    <application
        
        android:name=".MainApplication"
        
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
```
仕事のWebアプリで使っているおすすめGem for Rails5

#開発環境
* Rails 5.0.0.1
* Ruby 2.3

仕事でWebアプリケーションを作っている際に使ったGemで、特に気に入っている物をリストアップしました。それぞれRails5.0.0.1で動作確認済みです。

##Rails Assets
https://rails-assets.org/
Gemではないけど、紹介です。

```ruby:Gemfile
source 'https://rails-assets.org' do
  gem 'rails-assets-hogehoge'
end
```

と書くことで、bowerで管理しているパッケージをgemにラップしたものをbundlerで簡単にインストールできます。通常のgem同様にバージョン指定も出来るので、railsで使うjsライブラリを管理する際に非常に便利です。

とはいえ今時のフロントにはReactなどのJSフレームワークを使うことが多いので、npmで管理した方がよりナウい感じがしますね（

##draper
https://github.com/drapergem/draper
decoraterを提供してくれるGem。この手のやつは幾つかありますが、draperが一番有名そうなので使いました（小並感

```ruby:model
class Hoge
  # Viewで表示するときに使うメソッド
  def hogehoge_name
	"hogehoge#{name}"
  end
	
  def fugahuga_name
  def mogemoge_name
  ...
end
```

上記のようにレコードの内容をViewで表示する際にモデル側で処理したり、ViewHelperを使って処理していた部分を…

```ruby:decorator
class HogeDecorator < Draper::Decorator
  delegate_all

  def hogehoge_name
  	"hogehoge#{name}"
  end
  
  def fugahuga_name
  def mogemoge_name
  ...
end
```

このようにdecorator層に分離して、Viewで以下のようにdecorateされたメソッドを呼び出すことが出来ます。

```ruby:view
hoge = Hoge.new
hoge.decorate.hogehoge_name
```

モデルに蓄積されつつあるメソッドを分離することでモデルの見通しが良くなって、女の子にモテます。もてたい(´・ω・｀)

##gretel
https://github.com/lassebunk/gretel
パンくずリストを作るGemです。
この手のものも幾つかありますが、gretelは他の物とは違い、コントローラーにロジックを書く必要が無く、このGemが提供する設定ファイルconfig/breadcrumbs.rbにロジックを全て記載して、Viewに呼び出す記述をするだけで済みます。結果としてパンくずリストのロジックが一カ所に集まるので、見通しが良くなります。

```config/breadcrumbs.rb
crumb :root do
  link "Home", root_path
end

crumb :issues do
  link "All issues", issues_path
end
```

以上のようにDSLでロジックを書き…

```ruby:app/views/layouts/application.html.erb
<%= breadcrumbs separator: " > " %>
```

レイアウトにパンくずリストをレンダリングします。そして、個別のビューでどのロジックを呼び出すかを指定します。

```app/views/issues/show.html.erb
<% breadcrumb :issues %>
# => Home > All issues と表示される
```

##doorkeeper
https://github.com/doorkeeper-gem/doorkeeper
OAuth2による認証機能を追加し、Facebookログインのようにproviderアプリとして使ったり、外部にAPIをOAuth2で認証したアプリにのみ提供できたりします。ちょっとニッチですが、メインのアプリがサービスの母艦のようになってきたときに使えるGemです。

使い方はこちらから（ダイレクトマーケティング
DoorkeeperとDeviseでOAuth2によるログイン機能を作る
http://qiita.com/kyonsuke19101/items/407f3cdfec38d1108e9d

##ransack
https://github.com/activerecord-hackery/ransack
レコードを検索するときに、書きやすい形で検索機能を提供してくれるGem。ある程度複雑な検索でも対応できて便利。レコード数がやばいことになるまではお世話になります。ありがとうございます。

くわしくはこちらから
http://qiita.com/LuckOfWise/items/e020e896e71d47d0c6a4
http://qiita.com/nysalor/items/9a95d91f2b97a08b96b0

##gon
https://github.com/gazay/gon
railsからjsに簡単にデータを渡せるGem。いぶし銀の働きを見せます。

layoutのhead（もしくはjavascriptを読み込む直前）に`<%= Gon::Base.render_data({}) %>`を書いておいて準備完了。
controllerで`gon.hogehoge = 'しゅごい！'`と書いて、jsで`gon.hogehoge`で読み込めます。
さらに、レコードを渡すと、勝手に`.to_json`してくれるらしく、例えばnameフィールドを持つUserモデルがあったとすると、`gon.user = User.first`で渡すと、js側で`gon.user.name`でnameフィールドの要素にアクセスできます。らくちん。

js.erbでRailsから変数を渡してもいいですが、こういう方法も。

##enumerize
https://github.com/brainspec/enumerize
enum（列挙型）を実現できるようになるGemです。Rails4.1からデフォルトでenumを設定できるようになってますが、デフォルトのenumは正直使いづらいので、こちらの方がオススメです。

デフォルトのenumはFromから入力を受け付けることを余り考慮されてなく、Fromで楽に扱うためにはenum_helpというGemを使ったりしないと大変なので、最初からenumerizeを使った方が楽な印象です。

#おわりに
ブログでは技術Tips以外の記事も定期的にポストしています。
もしよかったらブログもどうぞ╭( ･ㅂ･)و
https://hackalive.net
Swift3+iOS8ではCIContextのイニシャライザでクラッシュするバグがあるもよう


`CIContext()`、`CIContext(options:)`などが実行時にクラッシュします。

```text:エラー
-[CIContext initWithOptions:]: unrecognized selector sent to instance 0xhogehoge
``` 

すでにバグレポートされているようです。
https://openradar.appspot.com/28200846

## 回避方法

stackoverflow([[CIContext initWithOptions:]: unrecognized selector sent to instance 0x170400960 in xcode8](http://stackoverflow.com/questions/39570644/cicontext-initwithoptions-unrecognized-selector-sent-to-instance-0x170400960/39650712))に書かれている方法だとうまく動かなかった（やり方がまずい？）ので、こんないい加減なクラスを用意して、ブリッジさせ、

```objc:ObjcUtility.h
#import <UIKit/UIKit.h>

@interface ObjcUtility : NSObject 

+ (CIContext *)cicontextWithOptions:(NSDictionary<NSString *, id> *)options;

@end

```

```objc:ObjcUtility.m
#import "ObjcUtility.h"

@implementation ObjcUtility

+ (CIContext *)cicontextWithOptions:(NSDictionary<NSString *, id> *)options {
    return [CIContext contextWithOptions:options];
}

@end
```

Swift側で`ObjcUtility.cicontext(options:)`を呼び出すことでイニシャライズの代理としてみました。

急いで書いたので間違いがあったらすみません。
Nginxのビルドバックを使ってBluemix上にリバース・プロキシを構築する


# はじめに
別々のアプリケーションに対して、クロスオリジン対応などで同じURLでアクセスしたいということがあるかと思います。
これを実現する方法として、Nginxビルドパックを利用してBluemix上にリバース・プロキシを構築する方法を紹介します。

想定する構成は以下の図のとおりです。

![overview.png](https://qiita-image-store.s3.amazonaws.com/0/73397/ae0a3f8b-251a-bb70-7fa6-da6124cd1abf.png "overview.png")

# 前提
CloudFoundryのCLIを利用します。CLI未導入の場合は、環境にあったインストーラーを[ダウンロードページ](https://github.com/cloudfoundry/cli/releases)より取得し、導入してください。


# 設定方法
## 使用するビルドパック
Nginxのビルドバックとして、[__Staticfile Buildpack__](https://github.com/cloudfoundry/staticfile-buildpack)というビルドバックを利用します。Nginx Buildpackもありますが、こちらは非推奨となったため使用しません。

Staticfile Buildpackの使用方法は、[Cloud Foundryのドキュメント](http://docs.cloudfoundry.org/buildpacks/staticfile/index.html)にも説明が記載されています。
このドキュメントの「Custom Nginx Configuration」に、独自のNginxの設定ファイルを使用するための方法として、以下の内容が記載されています。

> You can customize the Nginx configuration further, by adding nginx.conf and mime.types to your root folder. If you specified an alternate root folder, the files must be placed there.

cf pushを実行するディレクトリの直下に、設定ファイル（nginx.conf）をおいておくことで、独自の設定ファイルを使うことができます。

## 設定ファイルの準備
設定ファイルのサンプルです。

```nginx.conf
worker_processes 1;
daemon off;

error_log /home/vcap/app/nginx/logs/error.log;
events { worker_connections 1024; }

http {
  charset utf-8;
  log_format cloudfoundry '$http_x_forwarded_for - $http_referer - [$time_local] "$request" $status $body_bytes_sent';
  access_log /home/vcap/app/nginx/logs/access.log cloudfoundry;
  default_type application/octet-stream;
  include mime.types;
  sendfile on;

  gzip on;
  gzip_disable "msie6";
  gzip_comp_level 6;
  gzip_min_length 1100;
  gzip_buffers 16 8k;
  gzip_proxied any;
  gunzip on;
  gzip_static always;
  gzip_types text/plain text/css text/js text/xml text/javascript application/javascript application/x-javascript application/json application/xml application/xml+rss;

  tcp_nopush on;
  keepalive_timeout 30;
  port_in_redirect off;
  server_tokens off;

  server {
    listen <%= ENV["PORT"] %>;
    server_name localhost;

    location /a {
      proxy_set_header X-Forwarded-Proto https;
      
      proxy_pass http://nginx-backend-a.mybluemix.net/a;
      proxy_redirect http:// https://;
    }
    location /b {
      proxy_set_header X-Forwarded-Proto https;
    
      proxy_pass http://nginx-backend-b.mybluemix.net/b;
      proxy_redirect http:// https://;
    }
  }
}
```

設定ファイルの後半にある「location」の部分が転送設定です。この部分を環境に合わせて修正してください。
その他の設定は、Staticfile Buildpackのデフォルト設定を記載しています。

``location /a`` は、``http://nginx-proxy.mybluemix.net/a``へのアクセスに対する設定です。
``proxy_pass``として記載された``http://nginx-proxy-sample-backend-a.mybluemix.net/a``が転送先のURLとなります。
``proxy_set_header``と``proxy_redirect``は、HTTPSアクセスの転送に関する設定となります。

## Bluemixへのデプロイ
/work/nginxなど作業用のディレクトリを作成し、そのディレクトリの直下に設定ファイルnginx.confを配置してください。
コマンドを実行するためのターミナルを立ち上げ、作業用ディレクトリに移動後、以下のコマンドを実行してください。アプリケーション名やホスト名、メモリ量は環境に応じた値をセットしてください。

```
$ cf push アプリケーション名 -n ホスト名 -b https://github.com/cloudfoundry/staticfile-buildpack -m メモリ量
```

リバース・プロキシの構築は以上です。実際にURLにアクセスして稼働確認を実施してください。
さくらのVPSにバーチャルホスト(Virtualhost)を設定する

## バーチャルホスト(Virtualhost)の設定とは
さくらのVPSではマルチドメインでの運用することが可能。
バーチャルホスト(Virtualhost)を設定しておけば複数のドメインサイトを運営することができる。
gehogeho.comやexample.comなどサブドメなども管理できる。

##ネームサーバーの設定
バーチャルホストを利用するには、ドメイン側のネームサーバー設定とVPS側のネームサーバー設定の両方が必要。
※今回は、割愛します。


###ドメイン側のネームサーバーの設定
ドメイン側のネームサーバー設定は、各ドメイン管理会社によって違うので、取得したドメイン管理会社のサポートページを閲覧し、設定しておく。

[SAKURA Internet ネームサーバ利用申請方法](https://help.sakura.ad.jp/hc/ja/articles/206207381)
[お名前.com ドメイン設定](http://www.onamae.com/guide/details.php?g=17)
[ムームードメイン 取得したドメインを利用するには（設定方法）](https://muumuu-domain.com/?mode=guide&state=conpane)
などなど...


### VPS側のネームサーバーの設定
さくらのサポート情報に設定方法が記載されてますので、下記を参照。

[SAKURA Internet ネームサーバ利用申請方法](https://help.sakura.ad.jp/hc/ja/articles/206207381)


## バーチャルホストを有効

Apacheの設定ファイルを編集する。

```
$ sudo vim /etc/httpd/conf/httpd.conf
```

vimの検索機能で、```NameVirtualHost``` を検索する。

1. ```esc``` キーを押し、ノーマルモードにする。
2. ```/``` の後に ```NameVirtualHost``` で```Enter``` を押下する。
3. 該当箇所がハイライトされる。

```
# NameVirtualHost *:80

↓
NameVirtualHost *:80
```

## ディレクトリ作成

gehogeho.comの公開ディレクトリを作成。

```
$ mkdir -p /var/www/gehogeho.com/public_html/
```

※深いディレクトリを一気に作りたい時は ```-p``` オプションを指定する。


一般ユーザにもファイルの編集や新規ファイルを作成できるよう所有権を変更する。

```
$ sudo -R gehogeho(ユーザー名):gehogeho(ユーザー名) /var/www/gehogeho.com
```

## バーチャルホストの追加

こちらに、記載していく。

```
$ sudo vim /etc/httpd/conf/httpd.conf
```

ただ、拡張子が ```.conf``` というファイル名であれば読み込んでくれるようなので、 ```httpd.conf``` に聞いていくとドメインが増えた時に管理しずらいので新しくファイルを作成する。

```
$ vim /etc/httpd/conf.d/gehogeho.conf
```


下記をペーストする。

```ruby:gehogeho.conf
<VirtualHost *:80>
  ServerName gehogeho.com
  DocumentRoot "/var/www/gehogeho.com/public_html"
  DirectoryIndex index.html index.php index.cgi
  ErrorLog /var/log/httpd/gehogeho.com_error_log
  CustomLog /var/log/httpd/gehogeho.com_access_log combined
  AddDefaultCharset UTF-8
  <Directory "/var/www/gehogeho.com/public_html">
    AllowOverride All
  </Directory>
</VirtualHost>
```


| Apache コア機能    | 説明           |
|:-----------------|:------------------|
| ServerName             | サーバが自分自身を示すときに使うホスト名とポート |
| DocumentRoot           | ウェブから見えるメインのドキュメントツリーになる ディレクトリ |
| DirectoryIndex         | クライアントがディレクトリをリクエストしたときに調べる リソースのリスト |
| ErrorLog               | サーバがエラーをログ収集する場所 |
| AddDefaultCharset      | レスポンスのコンテントタイプが text/plain あるいは text/html の場合に追加するデフォルトの charset パラメータ |


## 反映させる

設定がうまくいってるか、テストする。

```
$ service httpd configtest
Syntax OK
```

設定を反映させるために、再起動する。

```
$ service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]
```
リーダブルコード~より良いコードを書くために~(1/3)

#概要
研究過程を経てやはり**良いコード**であると開発スピード/品質が高まると強く感じたので､どうすれば良いコードになるか改めて勉強した｡

教材は教授からお勧めしていただいたリーダブルコード( https://www.oreilly.co.jp/books/9784873115658/ )を読み､本記事では自分のためにもざっくりまとめました｡


#1.良いコードの定義
**他人が理解するのにかかる時間が短い**
#2.表面上の改善

- 変数や関数の名前に情報を詰め込む

>教材にはない教授から教えて頂いた方法
>>関数名:動詞-目的語(例) getPage(url) )
>>変数名:修飾語-名詞(例) memorySize or mem_size )


- tmpやretvalなどの汎用的な名前は避ける
    - tmpはswap時などに使えるなので「一時保存以外に役割がない」ことを示す
    - retvalにはこれは戻り値です以外の情報はない
    - 変数の目的や値を表すものがいい名前
    
>2乗の合計が帰ってくるならばretval ではなく sum_squares

- ループイテレータについて

> 例) i,j,kではなく 
>> club[i].members[j].user[k] × => club[club_i].members[members_i].user[users_i]

- 値の単位を明示する

>例) 単位がミリ秒 => var start_**ms** = (new Date()).getTime();
>>他) size => size_**mb** , limit -> max_**kbps**

- なるべく長い変数名はよくない
    - これまでのテクニックの否定になりそうだが､そうではなく**変数が見えるスコープが小さいなら多くの情報を詰める必要はない**ということである｡

```
if(debug){
	map{string,int}m;
	insert(&m);
	Print(&m);
}
```

> insert(&m)やPrint(&m)のmが**グローバル変数やクラスのメンバ変数ならmの目的がよく分からない**ので良くない
>>スコープが限定されたところだけ上の例ならif()~内でしか使われないなら簡素な変数名でもOK

- **(大事)途中から新しいメンバが入ってきても理解できる変数**

> 例) BackEndManagerを略してBEManagerとして伝わるか-> 否

- googleはクラスのメンバ変数の最後に**「_」**をつけ，すぐにローカル変数と区別できるようにしているらしい

```
class LogReader{

	private:
		int offset_;
}
```

- 変数に危険や注意を喚起する情報を追加

>例) これからエスケープが必要な変数には前に「raw_」をつける
  


#3.誤解されない名前
- 範囲指定するときは[start,stop]x -> [first,last] or [max,min]
- bool型の変数は頭に「is,has,can」

#4.美しさ
- (当たり前だが)見た目を美しくするとそのままコードの簡潔さ・拡張性につながる
- タブなどを使って変数などの縦の線を揃える
- メゾットや変数は分けてブロックで一塊にする(役割によってサブブロックを作っても良い)


```
例)
class TestClass{
	
	public:
		//変数ブロック
	
		//サブブロック:data
		int id;
		int wight;
		int height;

		//サブブロック:flag
		int isPublish;
		.
		.
		
		//メゾットブロック
		//サブブロック:handle method
		void checkOption();
		.
		.
		//サブブロック:database
		void insert();
}
```

- 一貫性を保つ
    - 次の二つのうちのどちらなのか
    
```
class Test{

};
```


```
class
{

};
```

#5.コメントすべきことを知る
- コードをすぐみたらわかることはコメントにしない
- コードを書いているときに持っている大切な考えをコメントとして記載する
- コメントとして書くもの(代表例)

|コメント|意味|
|:-----------------|------------------:|
|ToDo|あとで手をつける|
|FIXME|既知の不具合があるコード|
|HACK|あまりきれいじゃない解決策|
|XXX|危険　大きな問題がある|

- 定数の値を設定するに至った背景をコメントする

#6.コメントは正確で簡潔に
- あいまいになるため，コメント中は代名詞を使わない
- 名前付き引数コメントにする

> 例) connetct(10,false) x -> connect(timeout =10,use_encry = false)
>> ※ cやjavaの場合 connet(/\*timeout =\*/10,/\*use_encry =\*/ false)

- 関数の動作はできるだけ正確に説明する
    - コードの意図は詳細レベルではなく高レベルで記述 

#7.ループとロジックの単純化
- 制御フローを分かり易くする
    - 条件式の並び順
 
>例) if(bytes_extected > bytes_received)よりもif(bytes_received < bytes_extected)の方が良い
>>**左側:**調査対象の式で変化する **右側:**比較の対象であまり変化しない

- 行数を短くするのも良いがそれよりも**優先すべきは,他人が理解するのにかかる時間を短くすること**
    - 例えばif/elseを使わず三項演算子を使った方が行数が少なくなるが分かりづらくなることもある

- 早めに返してネストを削除する=なるべくネストの深さを減らす工夫をする
    - 理由:if文内にさらにif文があったりすると，ネストが増え次のelse文にいくまでに値などを忘れてしまう

- if/else文の条件は一般的に肯定形・単純・目立つものを先に処理する

#おわりに
今回は書籍の約1/3をざっくりまとめたので､残りの2/3もまとめて後日記事として投稿する
##おまけ
書籍内には下記の書籍もいくつか紹介/推奨していた

1. Code Complete 第2版<上><下>-完全なプログラミングを目指して-
2. リファクタリング-プログラムの体質改善テクニック
3. プログラミング作法
4. 達人プログラマー - システム開発の職人から名匠への道
5. Clean Code-アジャイルソフトウェア達人の技
docker on Ubuntu16

何度も落とし穴にハマるのが嫌なのでメモ。

- package 名は `docker.io`
- `/etc/NetworkManager/NetworkManager.conf` で `dns=dnsmasq` になっているのを外す

Ubuntu デフォルトインストール状態だと container から外に出られない。`NetworkManager` が俺専用 `dnsmasq` を起動させていて、`/etc/resolv.conf` に `127.0.0.1` と書かれている。docker はこの値を参照して環境を構築する。名前解決の際に、コンテナが内部で自分自身に問い合わせしてしまうのが直接的な原因。`/etc/NetworkManager/NetworkManager.conf` で `dns=dnsmasq` になっているのを外すと、`resolv.conf` には dhcp で取得したアドレスが書き込まれるようになる。コンテナがこの値を参照するので、名前解決で外に出ていくようになる。

`/etc/default/docker` にある `DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"` を有効にするというやり方もあるけれど、これらの google dns への問い合わせがフィルタされて使えない環境もあるので、あまり推奨できない…。