OmniAICreator/Qiita-1.07M huggingface dataset:
Hugoで新規記事を作成するときのTips的なメモ


静的サイトジェネレーターのHugoを使って新規記事作成時のあれこれ

## 記事のテンプレートを作成したい

通常は`hugo new`で記事を新規作成します。

```bash
$ hugo new post/hello.md
```

で作成すると

```post/hello.md
+++
date = "2016-06-09T03:15:52+09:00"
draft = true
title = "hello"

+++

```

みたいなものが自動生成されます。このデフォルトのFront Matter(+++で囲まれてるページ独自の変数)部分をカスタマイズしてみます。[HugoのArchetypesのドキュメントページ](https://gohugo.io/content/archetypes)にも書いてますが`archetypes/default.md`を作成します。

```archetypes/default.md
+++
categories = ["", ""]
date = ""
description = ""
draft = true
image = ""
tags = ["", ""]
title = ""
author = ""
+++

```

これを作った上でもう一度記事を作成してみましょう。

```bash
$ hugo new post/world.md
```

```post/world.md
+++
author = ""
categories = ["", ""]
date = "2016-06-09T03:22:03+09:00"
description = ""
draft = true
image = ""
tags = ["", ""]
title = "world"

+++

```

こんな感じで、`title`と`date`の項目は自動で入力してくれました。`draft=true`などデフォルト値で固定で入れたい場合は`archetypes/default.md`に記載しておきましょう。

## テンプレートを複数用意したい

テンプレートは`archetypes/default.md`以外にも準備可能です。
例えば、`archetypes/blog.md`を用意するとblogディレクトリ配下の投稿のテンプレートを作ることができます。

こんな例です。

```archetypes/blog.md
+++
categories = ["", ""]
date = ""
description = ""
draft = true
image = ""
tags = ["", ""]
title = ""
author = ""
+++

## はじめに

## ~~~とは

## ~~~の紹介

## まとめ

```

実際に記事を作ってみます。

```bash
$ hugo new blog/test.md
```

```blog/test.md
+++
author = ""
categories = ["", ""]
date = "2016-06-09T03:32:08+09:00"
description = ""
draft = true
image = ""
tags = ["", ""]
title = "test"

+++

## はじめに

## ~~~とは

## ~~~の紹介

## まとめ
```

## Front Matterのフォーマット指定を指定したい(-f フラグ)

`hugo new`のフラグ指定は

```bash
$ hugo new パス フラグ
```

という使い方です。

デフォルトはTOMLですが、JSONにしたいときは以下のようにすれば大丈夫です。

```bash
hugo new blog/hello.md -f JSON
```

で指定するとこのような形で

```json:test-blog.md
{
   "author": "",
   "categories": [
      "",
      ""
   ],
   "date": "2016-06-09T03:46:15+09:00",
   "description": "",
   "draft": true,
   "image": "",
   "tags": [
      "",
      ""
   ],
   "title": "hello"
}
```

## エディタを指定して書き始める (--editor フラグ)

**これが個人的にイチオシ**です。 --editor="エディタ名"です。
僕はAtomをよく使うのでこんな感じ

```bash
$ hugo new blog/hello.md --editor="atom"
```

これで指定するとそのままエディタ画面で編集開始できて便利です。

>参考: [hugo newで作られる記事ファイルのfront matterをカスタマイズする](http://dqn.sakusakutto.jp/2015/07/configure_hugo_new.html)


## 雑感

もう少し細かく指定できる方法ってないのかな

```
hugo new post/hello.md -var hoge=huga
```

↓

```post/hello.md
+++
date = "2016-06-09T03:15:52+09:00"
draft = true
title = "hello"
hoge = "huga"
+++

```

みたいなことやりたい
CUDA 8.0 RC （7.5 / 7.0） を Ubuntu 16.04 （14.04）LTS 上にセットアップする

以前のバージョンでの手順はBlog等で多数公開されていますが、結構変わっていたので、メモとして残します。内容としては、CUDAを....というよりはnVidiaドライバーの新規セットアップです。
文中に紹介している nVidia サイトの URL 類は、すべて開発者登録（無償）とログインが必要です。
***
ubuntu 14.04.4 LTS と CUDA 7.5 の組み合わせでも、基本的には同じ手順です。
/etc/modprobe.d/nvidia-installer-disavle-nouveau.conf が自動生成されない等、若干の相違があるだけです。
***
CUDA 7.0 の場合はパッケージに含まれているドライバーのためのカーネル構成情報が古いのか？この手順では解決しませんでした。
ドライバーインストールエラーが確認された後で、CUDA ドライバーだけ最新のものをインストールしてください。
***
# 公式ドキュメントを読め

まずは5月付けの最新ドキュメントを読みましょう。最低限読まなくてはならないのは、四章 RUNFILE INSTALLATION です。

NVIDIA CUDA INSTALLATION GUIDE FOR LINUX
DU-05347-001_v8.0 | May 2016
http://developer.download.nvidia.com/compute/cuda/8.0/secure/rc1/docs/sidebar/CUDA_Installation_Guide_Linux.pdf


# 公式ドキュメントを読まずにハマりました

とりあえず CUDA 8.0 RC をダウンロードします、

CUDA Toolkit 8.0 Release Candidate Downloads 
https://developer.nvidia.com/cuda-release-candidate-download

<img width="476" alt="cuda8-1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/81674/b635cd44-23ea-b62a-cdc2-eaf745a4df15.png">

Webページ下部に示される手順に沿って作業してみますが....
（実はここに最初に示した公式ドキュメントのリンクが登場しています。）


# Nouveau を止める

標準では Ubuntu 16.04 のカーネルで Nouveau が動いており、これが NVidia ドライバーのインストールを妨げます。

## まずはX-Serverを止める

GUI環境でインストーラーを実行すると、X-Serverを止めて実行しろと怒られます。
対応手順はインストーラーに実行権限を付与した後で....

```
sudo /etc/init.d/lightdm stop
CTL+ALT+F2でコンソール切り替え
sudo sh cuda_8.0.27_linux.run
```

こんどは Nouveau ドライバーが邪魔だといわれます。再起動してもう一回試せと。

確認してみると、
/etc/modprobe.d/nvidia-installer-disable-nouveau.conf
ファイルが生成されています。

```
blacklist nouveau
options nouveau modeset=0
```

## Nouveau 外しをカーネル構成に反映する

インストーラーの初回実行で生成されたこの conf を、（次回起動時の）カーネル構成に反映します。

```
sudo update-initramfs -u
```

***
**メモ**
*インストーラーを複数回実行する必然性はありません。*
*/etc/modprobe.d/nvidia-installer-disavle-nouveau.conf ファイルは、最初から手動で用意しても構いません。*
*二回実行すれば、一切のconfファイル編集は行わずに済むのは確かです。*
***

ここで再起動すると、GUIがVGAで起動します。
先達諸兄のBlog等々による旧バージョン対応記述では "GUIが起動しないように設定する" としている例が多いのですが、要は起動されたカーネルから nVidia ドライバーと干渉する nouveau が外れていればそれで良いです。

```
lsmod | grep nouveau
```
で、nouveau が起動していないことが確認できます。

もう一度VGAなGUIを止めましょう。

```
sudo /etc/init.d/lightdm stop
CTL+ALT+F2でコンソール切り替え
sudo sh cuda_8.0.27_linux.run
```

今度はドライバーのインストールを通過しましたね？

インストーラーの指定確認項目の中で唯一 no がデフォルトである nvidia-xconfig 項目は、迷った末に yes を選択しました。つまりは nouveau 外しのカーネル構成をそのまま使いますので、リブートすれば作業は終了です。
GUI起動直前に、nVidiaロゴマークが出現します。


# 参考
+ archlinux: カーネルモジュール<br/>https://wiki.archlinuxjp.org/index.php/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB
Gitで複数のブランチを一括削除する

ブランチが必要以上に多いときありますよね...

```
$ git branch
test01
test02
test03
master
```

test01~03までの作業は終了したので、ブランチを削除したい！

けどコマンドを三回叩くのは面倒だな....

そんなときは次のコマンドを実行して下さい！！

```
$ git branch | grep test | xargs git branch -d
```

testの部分はブランチ名の共通している文字を選択してください！！

これでブランチの一括削除ができました！
めざせpythonライブラリマスター （50）xlwings

#【ライブラリ説明】
　Excelを開いたままpythonでExcel操作ができる
　グラフも描けるし、vbaからpythonを呼び出すことも可能

#【準備】
　virtualenv上でxlwingsをインストールしましたが、win32apiに関するエラーが
　出たため[python27](https://www.python.org/downloads/)を使用しました。

#【プログラム】
```py:xlwings.py
# -*- coding: utf-8 -*-

import xlwings as xw
wb = xw.Workbook()
xw.Range('A1').value = 'Foo 1'
xw.Range('A1').value
# u'Foo 1'

xw.Range('A1').value = [['Foo 1', 'Foo 2', 'Foo 3'], [10.0, 20.0, 30.0]]
xw.Range('A1').table.value
# [[u'Foo 1', u'Foo 2', u'Foo 3'], [10.0, 20.0, 30.0]]

xw.Sheet(1).name
# u'Sheet1'
```

#【参考サイト】
　[ホームページ](http://xlwings.org/)
　[document](http://docs.xlwings.org/en/stable/index.html)
OS X に PostgreSQL を Homebrew でインストールして brew services で起動する

OSS-DB 技術者認定試験の勉強で PostgreSQL を Mac のローカルにインストールすることにしたのでその方法をメモっとく。

大したこと書いてないんだけど `brew services` というので起動できるということを知ったので記事にした。

# PostgreSQL を Homebrew でインストールする #

Homebrew を最新にしてから PostgreSQL をインストールする。

```shell-session
$ brew update
$ brew install postgresql
```

# PostgreSQL を起動する #

この記事では Homebrew のサービス管理機能の [Homebrew/homebrew-services](https://github.com/Homebrew/homebrew-services) を使用する。

PostgreSQL は `brew services start postgresql` で起動できる。

```shell-session
$ brew services start postgresql
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
```

`brew services` を利用することで OS X の `launchctl` で plist を登録したり、登録解除したりしてた作業が簡単になる。`launchctl` に登録されるので明示的に停止しないと Mac を起動するたびに PostgreSQL が自動起動する点は注意してほしい。

また、`brew services list` で起動状況が確認できる。蛇足だけど出力結果に出ているように MySQL もこれで管理できるよ。

```shell-session
$ brew services list
Name       Status  User   Plist
mysql      stopped        
postgresql started takuya /Users/takuya/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```

# PostgreSQL のデータベース一覧を表示する #

`psql -l` で PostgreSQL に接続できて、データベース一覧が取得できることを確認しよう。

```shell-session
$ psql -l
                          List of databases
   Name    | Owner  | Encoding | Collate | Ctype | Access privileges 
-----------+--------+----------+---------+-------+-------------------
 postgres  | takuya | UTF8     | C       | UTF-8 | 
 template0 | takuya | UTF8     | C       | UTF-8 | =c/takuya        +
           |        |          |         |       | takuya=CTc/takuya
 template1 | takuya | UTF8     | C       | UTF-8 | =c/takuya        +
           |        |          |         |       | takuya=CTc/takuya
(3 rows)

```

# PostgreSQL を停止する #

予想はつくと思うけど、PostgreSQL を `brew services stop postgresql` で停止できる。

```shell-session
$ brew services stop postgresql
Stopping `postgresql`... (might take a while)
==> Successfully stopped `postgresql` (label: homebrew.mxcl.postgresql)
```

# 参考文献 #

[Homebrew/homebrew-services](https://github.com/Homebrew/homebrew-services)
MacでPHP環境を整備


* 自分の環境はHomebrewを導入しているので、今回はHomebrewを通してphpenvを入れます。
* が、なかなかうまく行かず手こずった…。

## phpenv

### インストール

* 先にhomebrew/phpをtap


	```console
	$ brew tap homebrew/php
	```
	
* phpenvインストール

	```console
	$ brew install phpenv
	```

### パス設定
* インストール先へパスを通す

	```console
	$ echo 'export PHPENV_ROOT=${HOME}/.phpenv'     >> ~/.bash_profile
	$ echo 'export PATH=${PHPENV_ROOT}/bin:${PATH}' >> ~/.bash_profile
	$ echo 'eval "$(rbenv init -)"'                  >> ~/.bash_profile
	$ source ~/.bash_profile
	```

* 確認

	```console
	$ phpenv --version
	rbenv 1.0.0-21-g9fdce5d
	```

## php-build
* phpenvのプラグイン。
	* brew経由だと/usr/local/bin/php-buildにインストールされ、上記で入れたphpenvとは連携されなくなってしまう。
* gitからcloneする。
	
	``` console
	$ git clone git://github.com/CHH/php-build.git $HOME/.phpenv/plugins/php-build
	```
	
## php
### 事前準備
* 必要なライブラリを入れておく。これもbrewで。
	
	```console
	$ brew install gcc re2c libmcrypt autoconf automake libiconv
	```
	
	* これやってないと、インストールしようとするPHPのバージョンによっては各所で怒られる(た)。
			
		```console
		
		-----------------
		|  BUILD ERROR  |
		-----------------
		
		Here are the last 10 lines from the log:
		
		-----------------------------------------
		configure: WARNING: This bison version is not supported for regeneration of the Zend/PHP parsers (found: 2.3, min: 204, excluded: 3.0).
		configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
		configure: error: mcrypt.h not found. Please reinstall libmcrypt.
		-----------------------------------------
		
		```
		* とかとか。

### PHP拡張モジュール無効化
* 自分の場合、最低限の構成でインストールしたかったので、configure optionを全て無効に設定した。
	
	```console
	$ cd ~/.phpenv/plugins/php-build/share/php-build/
	$ cp default_configure_options default_configure_options-origin
	$ echo '--disable-all' > default_configure_options-disable-all
	$ cp default_configure_options-disable-all default_configure_options
	```

### インストール

* インストール可能バージョンの確認

	```console
	$ phpenv install --list
	```
	* ずらずらバージョンが表示される。

	
* インストール実行

	```console
	$ phpenv install 5.6.9
	```


### デフォルトバージョン指定
* デフォルトで使用するバージョンを指定する

	```console
	phpenv global 5.6.9
	```

* 確認
	
	```console
	$ php --version
	
	```
	* VersionがインストールしたものになっていればOK。

	```console
	$ echo '<?php phpinfo();' | php
	```
	
	* phpinfo()をコールして情報が表示されればOK。
license > Unity > Unity Personal : 年間売上10万USDの上限

Unityのライセンス

2016年6月9日現在

http://blogs.unity3d.com/jp/2016/05/31/new-products-and-prices/

> Unity Personal
> Personalは今まで通りです。無料で全ての機能が利用可能です。最高の状態でどなたでもゲームを開発できるようにしました。利用するには、年間10万ドルの売上あるいは資本の上限があります。

上記の範囲を超える場合は

> Unity Pro – 月125ドル、1年以上の契約期間が前提です。売上上限はありません。
license > Visual Studio Community 2015 > 年間収益100万USDの上限

関連 http://qiita.com/7of9/items/78c9a2eae71a36cd4717


Visual Studio Community 2015のライセンス条項
(2016年6月9日現在)
https://www.visualstudio.com/ja-jp/mt171547.aspx

> ...
> または (b) 年間収益が 100 万米ドル (もしくは他の通貨での相当額) を超える、組織およびその関連会社のことです。
license > Visual Studio 2015 > スタンドアロン / 標準 / サブスクリプション

Visual Studioのライセンスについての調査

2016年6月9日現在

https://www.visualstudio.com/ja-jp/products/how-to-buy-vs.aspx

- スタンドアロンライセンス 499USD
- 標準サブスクリプション
  - Microsoftストア: 1,199USD
  - ? : 799USD
- サブスクリプション
  - 年間: 539USD / 年
  - 毎月: 45USD / 月

標準サブスクリプションの２種類の違いは以下を見るとProfessional / Enterprise の違いのようだ。
https://www.microsoft.com/ja-jp/dev/vs-cloud-subscription.aspx
Zybo > Chronicles blog 36 > NeoPixel communication protocol > <STX> <Pixel Number> <Green><Red><Blue><ETX>

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-36-Driving-Adafruit-RGB/ba-p/472854

> Now because I do not want to re-invent the wheel—why would any engineer?—my simple protocol uses 8-bit ASCII characters to exchange data. (An ASCII table is here.) Using this protocol, each pixel can be can be addressed by sending the following data format:

```
<STX> <Pixel Number> <Green><Red><Blue><ETX>
```

`<Pixel Number>`の書式が不明。
各色情報の書式が不明。

各色は8bitなので16進数表記で0x00から0xFFを送ることになるが、そのまま送ると`<STX>,<ETX>`とかぶることがあるだろう。
BCD(Binary Coded Decimal)形式送信なのか、あるいはACSIIで0..255を送るのか。
Concrete CMS サイト公開前チェックリスト


Concrete CMS (concrete5) でサイトを公開する前に、最低限確認しておきたいチェックリストです。

- admin (ID=1) のユーザ名をadmin から違うものに変更しパスワードを強固なものにする
- ダミーデータ、ユーザーやファイルの削除
- ファイルアップロード最大サイズの設定
    - 大きすぎるファイルをアップロードするのであれば、最大アップロードサイズを設定するか確認する
    - 最大画像サイズを設定する
    - 考慮する点：画質、画像サイズ。c5 のリサイズ機能はサーバー側なので専用ソフトで行うほうが良い。
- favicon や OGP の設定
    - favicon を登録
        - 冗長化してたら要確認。config に入るから
    - Open Graph Tags Lite をインストールするか
	    - 冗長化してたら要確認。config に入るから
    - OPG Tags Lite の基本設定の確認
    - 各ページの OGP 情報の確認 
- SEO などのタイトル設定
    - サイト名は登録されているか
    - ページ名は登録されているか
    - URL Slug はきちんと登録されているか
- キャッシュ設定の確認
    - 開発用等、臨時URLのアクセス禁止 (別々の URL で同じ Concrete CMS にアクセスでき、フルページキャッシュを使用する場合)
- デバッグモードを OFF にし、エラーが表示されないように
- 自動実行ジョブ or タスクの確認と定期実行の設定
    - 索引インデックスの作成 (ページリストや検索ブロックを使っている場合)
    - sitemap.xml の作成と確認
        - 特に正しい URL で出力されているか
    - 実行するジョブの確認
        - 「古いページバージョンを削除」など
    - 手動実行で動作確認 (SSH もしくは URL で)
    - Cron or systemd timer で動作確認
- プリティURL確認。 (index.php を隠す)
- リンクチェック
    - 記事ブロック内のリンクで、間違ったリンクの貼り方をしていないか。
        - 編集モードでのリンクは `[サイトURL]/index.php?cID=[数字cID]` になっている
        - 編集モードを終了した時は `[サイトURL]/[URLスラッグ] で表示される
    - 非表示にしたページが間違ってリンクされているところなどは無いか？
- Security Content Policy, CORS などの設定
- テスト用ブラウザに広告ブロッカーなどJSをブロックするプラグイン
	- オンにした状態でのテスト
	- オフにした状態での動作テスト
- SMTP サーバーの確認
	- サーバー内の PHP Mail から送るか？
	- 外部の SMTP サーバーを利用するか？
	- SMTP サーバーの設定はしてあるか
- システムメールアドレスの確認 (フォームから送られるメールの差出人等)
- カノニカル URL 設定確認。(かならず URL を設定する。)
- DNS 切り替え確認
    - Web サイトの DNS レコード
    - SSL 証明書の確認
    - (c5 がメールを送る時) SPF か DKIM レコード設定の確認
- BASIC 認証や IP 制限の確認
    - BASIC 認証が間違って実装 or 実装忘れがないか
    - IP 制限解除忘れ、IP 制限実施忘れがないか
- サイト公開後、公開されるはずのないページが公開されていないか
    - コンテンツ表示部分
        - スケジュール公開ページがきちんとスケジュール公開設定されているか
        - 古いバージョンが承認状態になっていないか
    - 管理画面部分
        - ユーザー
        - ファイル
        - 公開プロフィール
        - ログイン
    - サイト公開後に改めて非公開にするページが有った場合、そのページの権限チェック
- ブラウザの動作確認
	- Chrome 最新版
	- Safari 最新版
	- Firefox 最新版
	- Edge 最新版
	- iOS 最新版
	- Android 最新版
	- そのほかお客様から求められたバージョン
- 公開後の不具合テストなどで使うテスト環境の構築
- コードデプロイ方法などの確認
- 公開前の最終バックアップ取得
- Google Analytics などのアクセス解析コード挿入
- Google Search Console への登録
    - Google にどうやってページ情報を送るのかの基本方針の確認
    - 各ページで「sitemap.xml を除く」設定が必要なページの確認
    - sitemap.xml の生成をするのか？
    - Google Search Console への sitemap.xml の設定
- Mautic などのマーケティングオートメーションツールの解析コードの挿入

## サイト公開後チェックリスト

特にサイト公開前後で、臨時ドメインからの切り替えがある場合

- カノニカル URL の本番設定
- sitemap.xml の生成
- ページキャッシュの設定本適用
- キャッシュクリア
Zybo > Chronicles blog 35 > Verification strategy

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-35-Driving-Adafruit-RGB/ba-p/471438

各種verificationをどうするか。

以下の例が示されている。

> This is a fairly simple design example so the verification strategy I will be undertaking is:
 
> 1. Verify the hardware interfaces between the MicroZed, I/O Carrier Card, and the NeoPixel array.
1. Simulate the NeoPixel driver using a VHDL simulator.
1. Develop test software to read and write from all BRAM addresses, ensuring that the PS (Processor System) can correctly address the memory.
1. Develop test software to drive the first NeoPixel in the array, to verify the functioning of the NeoPixel driver, and then verify the timing waveforms sent to the NeoPixel array using an oscilloscope.
1. Develop test software to drive a number of pixels located at different points on the NeoPixel array (e.g. second pixel, mid pixel and final pixel in the array).
1. Use a terminal program to verify that the final software can respond properly to correct commands, incorrect commands, out of sequence commands, etc.
1. Perform final functional verification using a developed GUI to prove the final design works as specified originally.

PSを`PS (Processor System)`と書いているが、正しくは`PS (Processing System)`だ。

VHDL simulatorというのが具体的にどれを示すのかは未消化。
Zybo > Chronicles blog 34 > NeoPixel driverの設計 > 1.25usec bit time clocked at 50nsec per clock tick > 25-bit shift register

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-34-Driving-Adafruit-RGB/ba-p/466228

NeoPixelの駆動に25bit shift registerが必要な理由は以下のように記載されていた。

> A 1.25µsec bit time clocked out at 50nsec per clock tick means that we’ll need a 25-bit shift register, which matches the code snippet shown above. 

1.25 usec = 1250 nsec 
1250 nsec / 50nsec = 25

25回で送出するためという理由。NeoPixelが24bitの色情報を持つのとは関係なさそうだ。

1.25usecというのは以下で決めている

> The overall waveform periods for a one or a zero differ as well. The specification calls for periods of 1.15µsec for a zero and 1.3µsec for a one. However, the NeoPixel’s overall bit-time tolerance is ±300nsec, so we can use a 1.25µsec time period for both one and zero waveforms and still meet specified timing.
技術英語 > I've [been so preoccupied with] this other matter.

@ Star Trek Voyager > INVESTIGATIONS

ドクターにインタビューすると約束していたNeelix。インタビューしないことについてドクターから問合わせがあり

> I've <font color=red>been so preoccupied with</font> this other matter.

http://eow.alc.co.jp/search?q=preoccupied&ref=sa
> 1. 夢中になった、没頭している、気をとられている、頭がいっぱいで
2. 先取りされた、すでに占有されている、先約の、すでに使われている

http://www.merriam-webster.com/dictionary/preoccupied
> : thinking about something a lot or too much
$.Deferred 結果問わず全部終わるまで待機する方法


# 状況
C#の全スレッド完了まで待機のように$.whenを使おうとしたが、
どうも挙動を確認すると、いずれか一つでもfailになれば、failとalwaysが呼ばれているらしい。

こちらが期待した動きではなく、ネットで調べても期待するものがなかったので自分で作ってみた。

# コード
~~~javascript
/**
* 全てのTaskが完了(失敗/成功問わず)したらresolveを返す.
*/
function waitForAll(tasks) {
    var result = new $.Deferred();
    var completeCount = 0;
    for(var i = 0; i<tasks.length; i++) {
        $.when(tasks[i]).always(function() {
            completeCount++;
            if(completeCount >= tasks.length) {
                result.resolve();
            }
        });
    }
    return result.promise();
}
~~~

# 使いどころ

業務では

- 複数のAjaxを実行
- 失敗は失敗情報を表示
- 成功は成功情報を表示
- 全ての表示が終わるまでローディング画面表示

という要件で利用。

###コードにするとこんな感じ

~~~javascript
$.blockUI(CAPTION);
$.when(waitForAll([
	buildInfoA(),
	buildInfoB(),
	buildInfoC()
]))
.always(function(){
	$.unblockUI();
});
~~~


以上です。
constexpr + union + コンストラクタ

[constexpr で扱えて，実行時の効率もよいデータ構造＋アルゴリズム](http://sscrisk.hatenablog.com/entry/20110720/1311148645) を見て
これは良いと早速使ってみたが、どうも挙動がおかしい。

と思ったらどうやらVC++のバグっぽい。

```cpp
#include <iostream>
#include <string>
#include <array>

using namespace std;

struct address1 {
	int a;
};

struct address4 {
	unsigned int a1:8;
	unsigned int a2:8;
	unsigned int a3:8;
	unsigned int a4:8;
};
ostream& operator<<(ostream& stream, const address4& a) {
    return stream << a.a1 << "." << a.a2 << "." << a.a3 << "." << a.a4;
}

union X1 {
	address1 a;
	address4 b;
	int c;
};

union X2 {
	int a;
	address4 b;
	int c;
};

static constexpr int initial = 0x0100007f;
constexpr X1 x1_global {{initial}};
constexpr X2 x2_global {initial};
const X1 x1_global_nonexpr {{initial}};
const X2 x2_global_nonexpr {initial};

int main() {
	static constexpr X1 x1_static {{initial}};
	static constexpr X2 x2_static {initial};
	static const X1 x1_static_nonexpr {{initial}};
	static const X2 x2_static_nonexpr {initial};
	constexpr X1 x1_local {{initial}};
	constexpr X2 x2_local {initial};
	const X1 x1_local_nonexpr {{initial}};
	const X2 x2_local_nonexpr {initial};
#define TEST(v) 	cout << __FILE__ "(" << __LINE__ << "): " #v ": " << v.b << endl;
	TEST(x1_global)
	TEST(x2_global)
	TEST(x1_global_nonexpr)
	TEST(x2_global_nonexpr)
	TEST(x1_static)
	TEST(x2_static)
	TEST(x1_static_nonexpr)
	TEST(x2_static_nonexpr)
	TEST(x1_local)
	TEST(x2_local)
	TEST(x1_local_nonexpr)
	TEST(x2_local_nonexpr)
}
```

実行結果

```bat
> cl /nologo /Ob1 /Oi /GS /Gy /GL /GA /RTCu /Zc:inline /EHsc /W3 /WX /MT prog.cpp
prog.cpp
コード生成しています。
コード生成が終了しました。
> prog.cpp.exe
prog.cpp(49): x1_global: 0.0.0.0
prog.cpp(50): x2_global: 127.0.0.1
prog.cpp(51): x1_global_nonexpr: 127.0.0.1
prog.cpp(52): x2_global_nonexpr: 127.0.0.1
prog.cpp(53): x1_static: 0.0.0.0
prog.cpp(54): x2_static: 127.0.0.1
prog.cpp(55): x1_static_nonexpr: 127.0.0.1
prog.cpp(56): x2_static_nonexpr: 127.0.0.1
prog.cpp(57): x1_local: 127.0.0.1
prog.cpp(58): x2_local: 127.0.0.1
prog.cpp(59): x1_local_nonexpr: 127.0.0.1
prog.cpp(60): x2_local_nonexpr: 127.0.0.1

```

gccでの結果は [[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](http://melpon.org/wandbox/permlink/gpb9t11NBgQnNVVg) を見てほしい。

どうもグローバルもしくはスタティックでconstexprでunionでunionの最初の要素がクラスだと、
コンストラクタが呼ばれないっぽい。

変換テーブルの初期化に使える!って思ったのになぁ…(´・ω・`)
DockerでGradle Projectのbuildをする

# 方法

gradleがインストールされているDocker containerに、gradleのprojectをvolumeで見せてbuildする。

```sh
$ cd /path/to/gradle/project

$ docker run \
  -v $PWD:/app \
  -w /app \
  -u $UID:$GID \
  takitake/gradle-alpine \
  gradle wrapper && ./gradlew clean build
```

## 解説

```
-v $PWD:/app
```

``.``だと、不正なファイルパスだと怒られてしまうので、絶対パスで指定する。

```
-w /app
```

マウントしたディレクトリへ移動。

```
-u $UID:$GID
```

現在のユーザ権限でjar/warを作らせる。

```
takitake/gradle-alpine
```

Alpineの勉強がてら、Docker Image作ったので使ってやってください。
https://hub.docker.com/r/takitake/gradle-alpine/

# ちなみに、実行方法

```sh
$ docker run \
  -v $PWD:/app \
  -w /app \
  -u $UID:$GID \
  -p 8080:8080 \
  java:8-jre-alpine \
  java -jar build/libs/xxx.jar
```

Officialなjava imageがあるので、それを使うのが手っ取り早いし軽いです。
Terraform FAQ

随時更新


# AWS
## `aws_s3_bucket`の`policy`が毎回 change 扱いになるんだけど？

仕様です。

以下の点に気をつけることで、回避できることもあります。

* `Action`をソートする
* `Action`が一つの場合、Array ではなく String で記述する
* `Sid` は省略しない

terraform-0.7 からは [aws_iam_policy_document](https://github.com/hashicorp/terraform/pull/6881) というリソースが追加されており、バケットポリシーでも改善するかもしれません。

### 関連する Issue/PullRequest

* [aws_s3_bucket - Fix policy normalization to match AWS API](https://github.com/hashicorp/terraform/pull/4278) 


## `aws_sns_topic` の `delivery_policy` が毎回 change 扱いになるんだけど？

仕様です。

以下の点に気をつけることで、回避できることもあります。

* スペースと改行(\n)を削除する

### 関連する Issue/PullRequest

* [SNS delivery policy always re-applies](https://github.com/hashicorp/terraform/issues/6754)

## `aws_sqs_queue` の `policy` が毎回 change 扱いになるんだけど？

仕様です。

以下の点に気をつけることで、回避できることもあります。
* スペースと改行(\n)を削除する

スペースと改行を削除しパラメータの順番に気をつければ回避できるでしょう。

### 関連する Issue/PullRequest

* [SNS topic subscription to SQS in different account is recreated with every apply](https://github.com/hashicorp/terraform/issues/6909)

## `iam_user` リソースが削除できないよ？

IAM ユーザに以下の情報が残っていませんか？

* Access Key
* Password
* MFA Device

`iam_user` リソースを削除する前にユーザに紐づいている情報は削除する必要があります。

## `aws_instance` の `security_groups` を変更するとインスタンスが再作成されますが、どうにかならないですか？

`security_groups` ではなく `vpc_security_group_ids` を利用しましょう。

[Terraformで立てたEC2に後からSGを追加しようとするとEC2が再作成される](http://cross-black777.hatenablog.com/entry/2016/02/25/090000)
Wintabに干渉せずにペンタブの傾きデータを取りたい

#どうして必要だったか
生放送向けにLive2Dが操作に連動する仕組みを作っていた時
ペンタブの動きを傾きまで真似るようになれば、より描いている感がでるだろうということで
ペンタブの老舗、[Wacomのデベロッパー向けサイト](http://wdnet.jp/)で情報収集
そこでWintabというペンタブなどのデジタイザむけのAPIを知って
当初はこれを使って傾きデータを取得する方法をとっていた

#wintabではなにがダメだったか
Wintabというのは基本ペイントソフト向けのAPIである
想定としてペンタブ情報を扱うのはペイントソフトだけ
そこでWTOverlapとWTEnableによるフォーカスが問題となった
ペンタブ情報を取得するにはWintabのフォーカスを取らねばならないが
**フォーカスを取るとペイントソフトへの情報が途絶する**
お絵かき配信を目的とした場合は本末転倒になる

#HIDへのアクセス
Wintab内でアレコレ干渉しないように頑張ってみたものの、どうしても干渉する
そこで方針を転換した
ペンタブはだいたいUSBで接続されるが、USB接続の操作系デバイスはWindowsに
”ヒューマンインタフェースデバイス”として認識される
ワコムのペンタブも例外ではない
![hid.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/afe920fb-2729-465d-5078-65363fb3f3b0.png)

USBからデータが来て動いているのだから何かしらのアクセス方法があるだろうと調べると
そのまんまHIDという仕組みでUSBとIOアクセルできるようになっていた
もともとはデバイスドライバを作るためのモノで
USBが出回り始めた頃の技術でhid32.dllのAPIを使ってアクセスする方式だ
こまかい方法はなかなか取れないバグもあって正当な方法を示せないので他を参照してもらいたい

#wintabの実態として
ワコムのWindowsFAQにこういう記述がある
![wacom.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/50254a3f-f2fa-7807-9d61-8d4cbd570aa8.png)
VID、UsagePage、UsageはHIDアクセスに必要なデバイス特定コード
VIDはメーカーで固定なのでそのまま使うのだが
hclientでデバイスリストを覗くとワコムのVIDが他にも幾つか出てくる
UP=0xd、U=0x01は正当に見えてフォーカスを持っていないとデータが来ない
つまるところWintabの処理済みデータが入っていると思われる
**現在の生データがはいってるのは別のポートで
UP=0xff00、U=0xaである**
こちらのデータはフォーカスを持っていなくてもデータが来る。
しかしデータが整形されていないのでこちら側でデータの整形をしなければならない
![整形.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/9b20ba80-2d69-a27f-ee97-5c5bed2eee66.png)
整形はこんな感じ

#総評として
どうしてもWintabに干渉せずにデータを取りたかったので行った今回の方法
問題点としては標準APIではないので最悪デバイスごとにプログラムを用意しないといけないのが最大のデメリット
ワコム以外のペンタブなら確実に必要になります
Wintabに標準でデータを取るAPIが用意されれば一番よいのですけどね……
それでもお絵かきLive2D配信では干渉しないのは必須機能
Ruby で文字実体参照や数値文字参照をデコードする方法

何を使って実装するのが妥当なのか。

Oga と htmlentities は `String#gsub` での置換で実装されている。
一方で Nokogiri はパースしてからテキストノードの値として取得する実装っぽい。

Oga を使っているなら Oga を使い、そうでないなら、htmlentities を入れて使うのが手頃だろうか。

CGI.unescape_html
----

文字参照は `&amp; &gt; &lt; &quot;` のみ対応。

- [singleton method CGI.unescapeHTML (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/method/CGI/s/unescape_html.html)

```rb
CGI.unescape_html('&copy;') # => "&copy;"
CGI.unescape_html('&amp;')  # => "&"
CGI.unescape_html('&#10;')  # => "\n"
```

gem: htmlentities
----

- [threedaymonk/htmlentities: HTMLEntities is a simple library to facilitate encoding and decoding of named (&yacute; and so on) or numerical (&#123; or &#x12a;) entities in HTML and XHTML documents.](https://github.com/threedaymonk/htmlentities)

```rb
HTMLEntities.new.decode('&copy;') # => "©"
HTMLEntities.new.decode('&amp;')  # => "&"
HTMLEntities.new.decode('&#10;')  # => "\n"
```

gem: Nokogiri
----

- [sparklemotion/nokogiri: Nokogiri (鋸) is an HTML, XML, SAX, and Reader parser with XPath and CSS selector support.](https://github.com/sparklemotion/nokogiri)

```rb
Nokogiri::HTML.parse('&copy;').text # => "©"
Nokogiri::HTML.parse('&amp;').text  # => "&"
Nokogiri::HTML.parse('&#10;').text  # => "\n"
```

gem: Oga
----

[YorickPeterse/oga: Oga is an XML/HTML parser written in Ruby.](https://github.com/YorickPeterse/oga)

```rb
Oga::HTML::Entities.decode('&copy;') # => "©"
Oga::HTML::Entities.decode('&amp;')  # => "&"
Oga::HTML::Entities.decode('&#10;')  # => "\n"
```
facebook login reviewを申請する（user_likes）

# facebook login reviewとは

https://developers.facebook.com/docs/facebook-login/review/what-is-login-review

public_profile, friend_list, email以外の全てのpermissionはpublicなAppで使うためには、Facebook login review（FBに申請して審査員がOKする）が必要ということ。

## permissionについて
大まかに分けて
1. read permission
2. publish permission

の2つがあり、Clientの部分でも書き方が異なるので、確認が必要


#大体の手順

1. アプリ開発
2. ログイン部分を問題なく作る（まず公開せずにdevelopment modeで試すのが王道のよう（Publicにしてしまうと申請が通るまでそのPermissionを使えないので、見せることができなくなる））
3. 使うPermission部分を見せれるようにする
4. Submit（https://developers.facebook.com/docs/facebook-login/review/how-to-submit を読んで、提出）

# 難しい部分

Permissionの申請のために、Permissionをどうやって使ってるかをAPP上で見せないといけないという、矛盾しているような要求

## 解決策1 (Graph API explorerを使う(user_likes申請でもこれを利用))

1. Graph API explorerにAPPのAdminでログインし、自分のAPPを選択し、自分に直接申請しているPermissionを上げる。すると、AppからのAccessTokenがもらえるために、FBアプリとしては、そのPermissionをもらった状態でログインしたことになる。（確認方法は以下に示す。
2. この状態で、Client（iOS, Android, Webなど）からFBアカウントでログインしようとすると、すでにPermissionをとっているという画面が出るので、そのままContinueをクリックすると、申請するPermissionを持ったAccessTokenでログインすることができる
3. この状態で、Appが申請するPermissionを使った機能を示せればOkということになる！

ただし、この方法では、ログイン画面で、必要なPermissionをもらう部分がScreencastにできない（が、申請は通った）


<img width="203" alt="Screen Shot 2016-06-09 at 12.11.38 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/7059/122b7451-969e-ccdf-c13c-0a19c96cc689.png">
のSettingsをクリックし、
<img width="188" alt="Screen Shot 2016-06-09 at 12.13.43 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/7059/f02aa01f-9826-51fc-51f8-324df65c88e3.png">
Appをクリックすると、自分がログインしているAPPが出る。前にログインしたAccessTokenを無効にしたければ、ここで消せば良い。

# 解決策2（Test Userを使う(publish_actionを申請する場合に有効)）

FB APPにはTest Userというものが存在している。詳細は、以下のリンク参照

https://developers.facebook.com/docs/apps/test-users

簡単にいえば、TestするためだけにUserを作れるというもの。

できること
1. FBへのログイン
2. Test Userのアカウントを使って自分の開発したAppへのログイン
3. Appを使ってFBのWallに投稿

できないこと
1. 実在ユーザと友だちになる
2. PageにLikeをする

なので、Publish Permissionを申請するためには結構使えるものである。
ただし、user_likes(read permission)を申請するのには使えない。FB上でLikeができないので、user_likesを使ってできる結果を見せようがない。

# 結論

user_likesを申請するのに使ったもの

1. APP内でuser_likesを使った直接の結果を見せる（必須）
2. userへuser_likesのあげ方は、graph API explorerを利用

欠けたもの：
1. Login画面での、Permissionの確認（Explorerであげたので、すでにログイン済みとなり、Permission確認画面がでない）

実際のところ、動画で細かく説明してあれば、実際にReviewerがどこまでチェックの必要がほとんど無くなる場合もあるので、今回は、動画に字幕をつけて説明した。

明らかにした部分：
1. FBでログインしてない時に、結果がない
2. ログインすると、FBのuser_likesがとれて、それによって、これが提供できる

という部分を書いてあげれば大丈夫な模様。


# 参考資料

以下の資料がとても参考になる

http://snowadays.jp/2014/06/2851

http://sakura-bird1.hatenablog.com/entry/2015/10/04/235900
Ansible2.1で追加されたモジュール・機能のうち、目立っていないモノ一覧

# 注：完全な一覧の記事はこちら。

[Ansible 2.1 の新モジュール、新オプション一覧 - Qiita](http://qiita.com/muziyoshiz/items/9c81f6f2e98567681e84)

# 注：以下、あまり目立たないものの一覧です。

モジュール・サブモジュールで書ける様になったら嬉しい場合があります。

公式が追加機能一覧つくってくれれば良いのですが、出た時に見当たらなかったのでドキュメントからggrました。

なお、一覧はざっと検索して目に引っかかったものだけです。

主だった話は公式やニュース記事でどうぞ。

[Introducing Ansible 2.1: Networking, Windows, Azure, and Containers](https://www.ansible.com/blog/ansible-2.1)

[構成管理ツール「Ansible 2.1」リリース、新たにWindowsでも利用可能に | OSDN Magazine](https://en.osdn.jp/magazine/16/06/02/150000)

## Ansible2.1で目立っていない追加モジュール
- [git_config - Read and write git configuration — Ansible Documentation](https://docs.ansible.com/ansible/git_config_module.html)
- [yum_repository - Add and remove YUM repositories — Ansible Documentation](https://docs.ansible.com/ansible/yum_repository_module.html)
- [gitlab_user - Creates/updates/deletes Gitlab Users — Ansible Documentation](https://docs.ansible.com/ansible/gitlab_user_module.html)
- [gitlab_project - Creates/updates/deletes Gitlab Projects — Ansible Documentation](https://docs.ansible.com/ansible/gitlab_project_module.html)
- [gitlab_group - Creates/updates/deletes Gitlab Groups — Ansible Documentation](http://docs.ansible.com/ansible/gitlab_group_module.html)
- [make - Run targets in a Makefile — Ansible Documentation](https://docs.ansible.com/ansible/make_module.html)

## Ansible2.1で目立っていない機能追加がある機能
- [Inventory — Ansible Documentation](http://docs.ansible.com/ansible/intro_inventory.html)
- [Configuration file — Ansible Documentation](http://docs.ansible.com/ansible/intro_configuration.html)
- [Jinja2 filters — Ansible Documentation](http://docs.ansible.com/ansible/playbooks_filters.html)

## Ansible2.1で目立ってないけど追加オプションでいいなと思ったやつ
- `mysql_user`の`host_all=yes`

### ggr
`"New in version 2.1." site:http://docs.ansible.com/`
Redmine のリポジトリページを開いた時にリビジョン入力欄を選択させないようにする

# 環境

* Redmine 3.2.1
* Firefox 46.0.1

# 問題

例えば、以下のようなページの途中 (ファイルの 641 行目) へのリンクの場合、

http://www.redmine.org/projects/redmine/repository/entry/tags/3.2.1/public/javascripts/application.js#L641

ページを開いたら該当の場所が表示されて欲しいが、リビジョンの入力欄が選択されて以下の図ようにページの先頭付近が表示されてしまう。

![Screen Shot 2016-06-09 at 00.35.43.png](https://qiita-image-store.s3.amazonaws.com/0/38075/58c101c4-5e50-2671-f6c8-960596d28a75.png)

この例に対しては以下で修正された模様。しかし自分の環境では相変わらず発生する。

http://www.redmine.org/projects/redmine/repository/revisions/14396

また、この例のようなページの途中へのリンクでなくても、バックスペースキーで戻ったりスペースキーでスクロールしたりしたいので、入力欄が選択されるのは困る。

# 修正

```diff
--- a/redmine-3.2.1/public/javascripts/application.js	2016-06-09 00:31:47.825000000 +0900
+++ b/redmine-3.2.1/public/javascripts/application.js	2016-06-09 00:41:30.878000000 +0900
@@ -640,7 +640,7 @@
 
 function defaultFocus(){
   if (($('#content :focus').length == 0) && (window.location.hash == '')) {
-    $('#content input[type=text], #content textarea').first().focus();
+    $('#content input[type=text], #content textarea').not('.contextual *').first().focus();
   }
 }
 
```

これで期待通りになった。
objective-cからswiftでのbool型の違い

SwiftでのBool型はobjective-cと微妙に違ったのでメモ

Swiftで真偽判定ではtrue falseしか使えない！
YES,NO 0,1は使用できないので注意！！
何も考えずYESとかに書き直すとXcodeに怒られます。
UnityC#でsetter使おうとしたらエディターが無言で落ちる

```GameConfig.cs
static bool _isEternal = false;
public static bool isEternal {
	set {
		isEternal = value;
	}
	get {
		return isEternal;
	}
}
```

別のクラスから、GameConfig.isEternal = true;すると落ちる。
変数名指定ミスにより無限ループしてるのが原因だった。
何が何でもGoogle APIのRefresh Tokenを取得したい

Google　APIにRefresh Tokenを返してもらうようにするには、`acces-type=offline`、`approval-prompt=force`でトークンを要求すると良いよって日本語・英語問わずそこかしこに書いてあります。
たとえば、Passportを使っていたらこんな感じにってね。

```js:example1.js
  .get('/', passport.authorize('google-authz', {
    failureRedirect: '/',
    scope: [
      'https://www.googleapis.com/auth/calendar',
      'profile'
    ],
    accessType: 'offline',
    approvalPrompt: 'force',
    session: false
  }))
```

これでテストすると実際にRefresh Tokenを取得できて、「やったー！」って思うんだけど、2回目以降はRefresh Tokenが帰ってこないんです。しょぼーん。。。

あーでも無いこーでも無いと悩んだ挙句、見つけました。

[Get refresh token google api](http://stackoverflow.com/questions/8942340/get-refresh-token-google-api)の中の小さなコメント

> Edited answer to something that is working as this answer is old and no longer seems to work. I spent significant time trying this as there are multiple places saying to use this method. I finally read the documentation (which I should have done first) and it says you must use prompt=consent. Reference: developers.google.com/identity/protocols/… – Goblinlord Jan 5 at 0:49

Goblinlordさん、ありがとう！

分かってからよく見ると、Shahadat Hossain Khanさんも答えてました。

ということで、上の例は次のようにするのが正解みたい。

```js:example2.js
  .get('/', passport.authorize('google-authz', {
    failureRedirect: '/',
    scope: [
      'https://www.googleapis.com/auth/calendar',
      'profile'
    ],
    accessType: 'offline',
    prompt: 'consent',
    session: false
  }))
```

こうすると、ちゃんと毎回Refresh Tokenを取得できました。

***

今日の教訓

> I finally read the documentation (which I should have done first)　...

which I should have done first, which I should have ...
(ﾟ◇ﾟ)ゞ

ではまたね。
「ソフトウェア開発上の問題の多くは、技術的というより社会学的なものである」

上司の薦めで、[ピープルウェア](http://www.amazon.co.jp/%E3%83%94%E3%83%BC%E3%83%97%E3%83%AB%E3%82%A6%E3%82%A8%E3%82%A2-%E7%AC%AC3%E7%89%88-%E3%83%88%E3%83%A0%E3%83%BB%E3%83%87%E3%83%9E%E3%83%AB%E3%82%B3/dp/4822285243)を読んでみました。ここ最近、自分が問題意識をもっていたことと重なることが多く、得るものが多かったです!

ソフトウェア開発における生産性についての本ですが、違う業種や、趣味での活動でもあてはまることは多くあると思います。むしろ、IT関係以外の方にこそ、読んでもらいたいくらいです。

# ソフトウェア開発上の問題の多くは、技術的というより社会学的なものである

冒頭に書いてあるこの言葉が、響きました！ 
自分が新人の頃はもっと技術があればとは思ったのですが、ここ最近は、技術レベル以前のところで躓いているのでは感じるようになったので、やはりそういうことだったかと。

# エンドユーザの要求をはるかに超えた品質水準は、生産性を上げる一つの手段である

一見すると、品質を追求しないで手抜きをした方が作業時間も短く、動くもの程度であればたくさんつくれるような気もしますが、そのスタンスでやってその後のバグで手痛い目に合うことも何度かあり。。。

本の中では、「今の段階だと、MTBFは1.2時間で非常に不安定だが、3週間後には2000時間とかなり良くなる」という例が出ます。早期のリリースを優先するあまり、低品質な製品をユーザは受け入れてしまっているということのようです。更にいえば、ユーザと開発者では必要とする品質に大きな差があり、ユーザの水準にあわせると、長期的にはコストが増えてしまうということ。

ユーザから見れば、極悪なスパゲティコードであっても要求する機能が満たされていればOKですが、開発者からすれば、要求機能を満たした上でコードの品質も追求する、ということでしょうか。最近なら、git管理の品質も加わって、コミットコメントやコミット粒度をどうするか、というのもあるでしょう。

もっと、開発者側の水準がもたらすものを重要視するような流れが増して欲しいものです。

# チーム形成の不思議な化学反応

- 品質至上主義
- 満足感を与える打ち上げ
- エリート感覚の醸成
- チームに異分子を混ぜることの奨励
- 成功しているチームを守り、維持
- 戦術でなく戦略を与える

自分がいる合唱団に、この7つそれぞれにあてはまるかなと思うものがあり、この辺がうまくいく要因なのかと。

# チーム殺し、7つの秘訣

- 守りのマネジメント
- 官僚主義
- 作業場所の分散
- 時間の分断
- 製品の品質削減
- はったりの納期
- チーム解体の方針

# チーム殺しにつながる、残業の予期しない副作用

がんばって残業できる人と、そうはできない人の、ある種の二つの派閥ができてしまい、その状態が長引くことで、残業しまっくてる人たちが、私生活の乱れからのストレス増加や、残業できない人達を疎遠に感じるようになったりして、チームに亀裂が入るという... 

我々はなんと悲しい生き物なのだろうか。


## 気になったキーワード

- 会社のルーチンワークは、就業時間に見合うところまで膨張する傾向がある
- エントロピーは組織内では常に増加する
- メソドロジーの愚かさ
- 悪意の追従
- リスクから逃げない
- よりよい変化のモデル
- 眠れる巨人よ、目を覚ませ

# 参考サイト

http://hakobe932.hatenablog.com/entry/2014/05/11/024714

http://soqdoq.com/demarco/

http://matatabi.hatenablog.jp/entry/2014/01/28/020420

https://www.issj.net/mm/mm08/05/mm0805-pg-at.html

https://ja.wikipedia.org/wiki/%E3%83%94%E3%83%BC%E3%83%97%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2
velocity.jsでfadein animationなどを使用してた場合にレイアウトが崩れる原因

velocity.jsを使用している際に、
「fadeInさせた要素が何故かレイアウト崩れちゃう！」
ということがありませんか？

なかなか無いと思います。
ですが備忘録として書いておきます。

## 原因

これはvelocity.jsでのfadeInなど、表示させる系のanimationは、指定したDOMに`display:block;`のstyleを付与するために起こることが多いです。
(自分はこれで2回時間を喰わされました。)


## 対処法

1. `display:flex`などのプロパティをつけている要素をanimationのtargetにしない
2. `.velocity().css('display','inline');`などでdisplayの上書きをする
JenkinsのスレーブをWindowsサービスとして動かす

# はじめに
JenkinsのマスターをLinuxで、スレーブをWindowsサービスで動かすということをやりたくて
色々調べたのですが、できるまでに結構時間がかかったので、メモ書きレベルですが残しておこうと思います。
マスター側の設定はハマるポイントがないので、かなり省略します。

# 環境
マスター：CoreOS on VirtualBox 5
スレーブ：Windows 7 64bit

![Jenkins Slave1.jpg](https://qiita-image-store.s3.amazonaws.com/0/62776/bb128e3c-c9b4-2309-2bce-d0335cfa0436.jpeg)

# スレーブ(Windows)側の設定
1. レジストリエディタでHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\SystemにLocalAccountTokenFilterPolicyという名前で作って、1を設定　→[詳細はこちら](https://technet.microsoft.com/ja-jp/library/cc754102(v=ws.10).aspx)
1. HKEY_CLASSES_ROOT\CLSID\76A64158-CB41-11D1-8B02-00600806D9B6}を右クリック→アクセス許可→所有者を管理者(Administorators)に変更。マスターのノード設定で管理者ユーザーにするユーザーにフルコントロールを与える。そのあとに、所有者をNT SERVICE¥TrustedInstallerに戻す
2. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurePipeServers\winregにマスターのノード設定で管理者ユーザーにするユーザーにフルコントロールを与える。
2. WindowsサービスのRemote Registry Serviceを起動
3. ファイヤウォールでtcpのポート135, 139, 445を受信許可
4. ファイヤウォールでudpのポート137, 138を受信許可
5. ファイヤウォールでC:\WINDOWS\system32\dllhost.exe を受信許可


# マスター(Linux)側の設定
1. Jenkinsのページを開いて、新規ノードを追加
2. リモートルートはスレーブに置かれるJenkinsのワークスペースの位置になるのでお好きなところを選択
3. 起動方法は、WindowsサービスとしてこのWindowsスレーブを制御 を選択
3. スレーブ(Windows)の管理者ユーザー名とパスワードを入力
4. スレーブのサービスを動かすユーザーは、基本Use Local System Userで良い。他のユーザーにしたり、管理者ユーザーを使うこともできるが、それらのユーザーにWindowsでサービス起動権限を振らないと動かないので、Local System Userで特段問題ないはずです。
5. 保存
6. 保存した後は、Jenkinsマスター側が自動的にリモートルートの位置にjarとかexeとかをもりもりコピーし、気が付くとWindowsサービスにJenkinsスレーブサービスが出来上がり勝手に起動します。

# 動作の概要(推測)
おそらくスレーブのサービスが起動するまでは下図のようなことが起こっていると思っています。※推測なので誤りが多分に含まれているかもしれません。

![jenkins slave2.jpg](https://qiita-image-store.s3.amazonaws.com/0/62776/cb033eae-fe34-3722-585e-fd8d957ae56a.jpeg)

![jenkins slave3.jpg](https://qiita-image-store.s3.amazonaws.com/0/62776/d7a9549e-db11-ddaf-c56d-96bb314699b7.jpeg)

![jenkins slave4.jpg](https://qiita-image-store.s3.amazonaws.com/0/62776/242de13c-e45e-2c58-a833-cc2178d3e0c7.jpeg)

![jenkins slave5.jpg](https://qiita-image-store.s3.amazonaws.com/0/62776/c4d189f7-d871-f7ed-ed4b-6731972589a1.jpeg)

# その他
環境のせいなのか定かでないですがマスターからスレーブにjarやらを転送するのが、とてつもなく遅かったです。550KB程度のjar送るのに10分くらいかかったり、、、
JupyterにIRuby環境を整える


[前回の記事](http://qiita.com/tdrk/items/e6c293021cbcb0e96cd2)からの続き。
せっかくなのでJupyter上でRubyも書きたいので、その設定。

## 必要パッケージを準備

まず、必要な `rbczmq` を入れるために環境を整える。

``` bash
sudo apt-get install libtool libtool-bin pkg-config build-essential autoconf automake uuid-dev
```

次に、 `rbczmq` をはじめとするgemをインストールする。

``` bash
gem install rbczmq pry iruby
```

Jupyter上でIRubyを使うだけであれば、 `pry` は必要ないが、Jupyter上でもpryは使えるので入れておく。

### pryとは？
irbの代わりになるREPL。
デフォルトでシンタックスハイライトが付いているなどの便利屋さん。
いろいろ機能があるので、その紹介は別サイトに譲る。
【参考サイト】
http://labs.timedia.co.jp/2011/12/rubyist-should-use-pry.html
https://github.com/pry/pry
.git以外を削除してリポジトリ変えたい時

- .git以外を削除してリポジトリ変えたい時

```
#git以外削除
ls -a | grep -v -E '\.$|\.\.$|\.git' | xargs rm -rf
#複数指定時
ls | egrep -v '^hoge|tmp$'|xargs rm -r

#git以外コピー
rsync -a pogepoge/ ~/tmp/hoge/ --exclude '.git' --exclude 'config/database.yml'
```
GAE/Go+WebPushAPI+FCMでPush通知

## まとめ

* Node.js実装をそのままGoにポートした
* FCM周りはサーバKeyだけ取得すればOK

## 前提

https://console.cloud.google.com
1. Projectを取得していること
2. GCMのAPIを有効化していること

https://console.firebase.google.com
1. Projectを取得していること

## Client

https://developers.google.com/web/fundamentals/getting-started/push-notifications/step-04?hl=en

ここを見てその通りに実装します。
注） p256dhとauthはclientかserverのどちらかでsafe URLに置換する必要があります。

概要は以下のような感じです
1. Event Listenerを登録する
2. Server Workerでsubscriptionを取得する
3. GAEにsubscriptionを送信する
4. GAEのデータストアにsubscription情報を保存する

## Server

### とりあえずPUSH通知だけしたい場合

AuthorizationヘッダにFCMのServer Keyを設定してFCMサーバ(https://fcm.googleapis.com/fcm/send) にPOSTするだけ


### Payload付きでPUSH通知したい場合
Payloadを暗号化する必要があります

Node.jsの暗号化実装
https://github.com/GoogleChrome/web-push-encryption

自分はGoで使いたかったのですが見当たらなかったので用意しました
https://github.com/koichiroo/webpushencrypto/blob/master/encrypto.go
paddingが0固定になっているのでその内直します。。

以下使い方です。環境はGAEを想定しています。

```go:使い方
import "github.com/koichiroo/webpushencrypto"

const (
    fcm = "https://fcm.googleapis.com/fcm/send"

    gcm = "https://android.googleapis.com/gcm/send"

    serverKey = "プロジェクトによる"
)

func webpush() error {
    encrypt, err := webpushencrypto.GetEncryptoMessage(key, auth, payload)
    if err != nil {
        return err
    }

    safeSalt := convertSafeURL(base64.URLEncoding.EncodeToString(encrypt.Salt))
    safeKey :=  convertSafeURL(base64.URLEncoding.EncodeToString(encrypt.PublickKey))
    endpoint := strings.Replace(sub.Endpoint, gcm, fcm, -1)
    req, err := http.NewRequest("POST", endpoint, bytes.NewReader(encrypt.Payload))
    if e != nil {
        return
    }
    defer req.Body.Close()
    req.Header.Set("Authorization", strings.Join([]string{"key", serverKey}, "="))
    req.Header.Set("Encryption", fmt.Sprintf("salt=%s", safeSalt))
    req.Header.Set("Crypto-Key", fmt.Sprintf("dh=%s", safeKey))
    req.Header.Set("Content-Encoding", "aesgcm")
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("TTL", "0")
    res, err := urlfetch.Client(ctx).Do(req)
    if err != nil {
         return
    }
    defer res.Body.Close()
}

func convertToSafeURL(s string) string {
    s = strings.Replace(s, "+", "-", -1)
    s = strings.Replace(s, "/", "_", -1)
    s = strings.Replace(s, "=", "", -1)
    return s
}
```

keyはsubscriptionのp256dh、authはsubscriptionのauthです。
Server KeyはFirebaseのプロジェクトを作成すれば自動的に取得されているものです。
endpointはService WorkerがandroidのURLを取得してくるのでFCM用に置換しています。
payloadは何でもいいですが、今回はMarshal済のJSONを想定しています。

## 感想

わかってしまえば簡単なのですが、意外とハマりました。
`Crypto-Key`ヘッダの`dh=`を`df=`でずっと送信していた。。typoは怖い
再起動なしで新規デバイスをスキャンさせる方法

たまに使う & いつも忘れるのでメモしておく

デバイスの割当変更等でストレージの構成変更を実施した後、再起動せずにホスト側でデバイスをスキャンして認識させるときのコマンド

RHEL6, CentOS6, CoreOSで動作することを確認済

```
# echo "1" > /sys/class/fc_host/hostn/issue_lip

または

# echo "- - -" > /sys/class/scsi_host/hostn/scan
```

スキャン後、デバイスが認識されていることを確認

```
# ls -al /dev/disk/by-path/
```

他にも手段があるが、動作未確認

## 参考
[Red Hat Enterprise Linux ストレージ管理ガイド - ストレージの相互接続をスキャンする](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/scanning-storage-interconnects.html)
SharePoint Client Object Model でページ上のWebパーツ オブジェクトを取得するコード

```javascript
// コンテキスト取得
var custCtx = SP.ClientContext.get_current();
 
// サイトオブジェクト取得指示
var custWeb = custCtx.get_web();

// ページファイル オブジェクトの取得指示（現在のページ）
JSRequest.EnsureSetup(); // リクエストユーティリティ初期化
var custPage = custWeb.getFileByServerRelativeUrl(JSRequest.PathName);
// ページファイル オブジェクトの取得指示（指定のページファイル）
//var custPage = custWeb.getFileByServerRelativeUrl('（サーバー相対URL）');

// ページファイル オブジェクト取得予約
custCtx.load(custPage);

// Webパーツマネージャ オブジェクトの取得指示
var custWpMgr = custPage.getLimitedWebPartManager(SP.WebParts.PersonalizationScope.shared);

// Webパーツマネージャ オブジェクトの取得予約
custCtx.load(custWpMgr);

// Webパーツコレクション オブジェクトの取得指示
var custWebparts = custWpMgr.get_webParts();

// Webパーツコレクション オブジェクトの取得予約
custCtx.load(custWebparts, "Include(WebPart.Title,WebPart.ZoneIndex)");

// サーバーへのクエリー実行（ここまでのコンテキストに含まれる指示予約を送信）
custCtx.executeQueryAsync(
    function(sender, args) { // クエリー実行時コールバック処理

        // ページファイル の内容を取得
        console.log(custPage);

        // Webパーツマネージャ の内容を取得
        console.log(custWpMgr);

        // Webパーツコレクション の内容を取得
        console.log(custWebparts);

        var webPartEnumerator = custWebparts.getEnumerator();
        while (webPartEnumerator.moveNext()) {
            var oWebPart = webPartEnumerator.get_current().get_webPart();
            
            console.log(String.format(
                "Title:{0}, Zone:{1}",
                oWebPart.get_title(), oWebPart.get_zoneIndex()
            ));
        }

          // 列の設定を更新したら、サーバーに送信が必要です！
          //custCtx.executeQueryAsync(
          //    function(sender, args) { // クエリー実行時コールバック処理
          //        console.log('送信ヨシ！');
          //    },
          //    function(sender, args) { // クエリー失敗時コールバック処理
          //        console.log('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
          //    }
          //);
    },
    function(sender, args) { // クエリー失敗時コールバック処理
        console.log('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
    }
);
```
Goのjson.Unmarshalで値にJSONのnumber、string両方の可能性がある場合

json.UnmarshalでJSONをデコードする際に、特定のキーの値がJSON number、string両方で来る可能性がある場合に困ったのでその対処方法です。[json.Number](https://golang.org/pkg/encoding/json/#Number)を使うことで両方に対応できるようです。

具体的には以下の2つのようなJSONの両方のデコードが必要になる場合です。

```json
{"n" : 100}    # JSON numberで来る場合
{"n" : "100"}  # JSON stringで来る場合
```

以下のように単純にstructのintフィールドを使った場合、JSON stringで値が来る場合にエラーになります。

```go
type Foo struct {
    N int
}

var foo Foo
// nの値が文字列
data := []byte(`{"n":"100"}`)

if err := json.Unmarshal(data, &foo); err != nil {
    // エラーになる
    log.Fatalf("unmrshal failed: %v", err)
} else {
    fmt.Println("unmarshal success ", foo.N)
}
```

下記のように変換に失敗します。[Go Playgroundで実行](https://play.golang.org/p/et-3oi0Exv)

```
2009/11/10 23:00:00 unmrshal failed: json: cannot unmarshal string into Go value of type int
```

## stringオプションではダメ

下記のようにtagに`string`オプションを指定することで、文字列からintに変換することはできますが、この場合、JSON numberが来るとエラーになります。[Go Playgroundで実行](https://play.golang.org/p/WzNQ4f-qmN)

```
type Foo struct {
    N int `json:",string"`
}
```

参考: https://golang.org/pkg/encoding/json/#Marshal

## json.Numberを使う

[json.Number](https://golang.org/pkg/encoding/json/#Number)というJSON numberを表現する型を使うことで、JSON number, string両方に対応することができます。内部的にはstringなので、`Int64()`, `Float64()`などのメソッドを使って必要に応じて型を変換する必要があります。

```go
func main() {
    // JSON string
    unmarshalWithNumber(`{"n": "100"}`)
    // JSON number
    unmarshalWithNumber(`{"n": 200}`)
}

func unmarshalWithNumber(data string) {
    type Foo struct {
        // 型をjson.Number型にする
        N json.Number
    }

    var foo Foo
    if err := json.Unmarshal([]byte(data), &foo); err != nil {
        log.Fatalf("unmrshal failed: %v", err)
    } else {
        fmt.Println("unmarshal success", foo.N)
    }
}
```

結果。[Go Playgroundで実行](https://play.golang.org/p/qoitPfK7MU)

```
unmarshal success 100
unmarshal success 200
```


## 独自の型を定義して便利に

json.Numberの場合、内部はstringのため数値として扱うには毎回変換が必要で少し面倒です。[golang.org/x/oauth2](https://github.com/golang/oauth2)で採っている方法のように、独自の型を定義して扱うのが良さそうです(参考: [internal/tokens.go#L59-L90](https://github.com/golang/oauth2/blob/71d9edd725fe4ce4c692fcb20765be558df45ad3/internal/token.go#L56-L90)の`expirationTime`)。このライブラリではOAuth2のService Providerの一部がnumberでなくstringで返す仕様の対応に使っています。

```go
func unmarshalWithNumber(data string) {
    type Foo struct {
        // 独自の型
        N MyNumber
    }

    var foo Foo
    if err := json.Unmarshal([]byte(data), &foo); err != nil {
        log.Fatalf("unmrshal failed: %v", err)
    } else {
        fmt.Println("unmarshal success", foo.N)
    }
}

type MyNumber int64

// UnmarshalJSONを実装して、内部のint64に変換しておく
func (m *MyNumber) UnmarshalJSON(b []byte) error {
    var number json.Number
    if err := json.Unmarshal(b, &number); err != nil {
        return err
    }
    i, err := number.Int64()
    if err != nil {
        return err
    }
    *m = MyNumber(i)
    return nil
}
```

[Go Playgroundで実行](https://play.golang.org/p/JM7_Nt96Ij)
logrotate でデフォルト以外のフォーマットで日付ファイル名にしたいとき

logrotate でデフォルト以外のフォーマットで日付ファイル名にしたい場合の設定についてまとめます。

## <i class="fa fa-wrench" style="font-size:1em;"></i> デフォルト
logrotate で日次ローテート＋日付文字列を付けたい場合、
`daily` と `dateext` を指定します。

```
/path/to/target/some.log
{
  rotate 36500
  daily
  dateext
  missingok
  notifempty
  delaycompress
  nocompress
  copytruncate
}
```

結果、 `元のファイル名 + -YYYYMMDD` のファイル名で生成されます。
上記の例で、2016/06/08実行したとしたら `/path/to/target/some.log-20160608` になります。

## <i class="fa fa-wrench" style="font-size:1em;"></i><i class="fa fa-wrench" style="font-size:1em;"></i> 任意のフォーマットに変更する
末尾に付与する日付を任意のフォーマットに変更したい場合は
`dateformat` を指定します。

```
/path/to/target/some.log
{
  rotate 36500
  daily
  dateext
  dateformat _%Y-%m-%d
  missingok
  notifempty
  delaycompress
  nocompress
  copytruncate
}
```

結果、 `元のファイル名 + _YYYY-MM-DD` のファイル名で生成されます。
上記の例で、2016/06/08実行したとしたら `/path/to/target/some.log_2016-06-08` になります。


## <i class="fa fa-wrench" style="font-size:1em;"></i><i class="fa fa-wrench" style="font-size:1em;"></i><i class="fa fa-wrench" style="font-size:1em;"></i> 末尾以外の場所に日付を挿入する
末尾以外の場所に日付を挿入したい場合は `postrotate` で名前を変更します。

```
/path/to/target/some.log
{
  rotate 36500
  daily
  dateext
  dateformat _%Y-%m-%d
  missingok
  notifempty
  delaycompress
  nocompress
  copytruncate
  postrotate
    mv /path/to/target/some.log-`date '+%Y%m%d'` /path/to/target/some.`date '+%Y-%m-%d'`.log
  endscript
}
```

結果、 `元のファイル名(拡張子抜き) + .YYYY-MM-DD.log` のファイル名で生成されます。
上記の例で、2016/06/08実行したとしたら `/path/to/target/some.2016-06-08.log` になります。
MacをPHP7へバージョンアップする

# はじめに
なんとなく、MacのPHPをPHP7へとバージョンアップしたくなったのでしてみることにしました。

ちなみに、僕のMacはこんな感じ。

- OS X Yosemite 10.10.5
- PHP5.5.10

# brewでいってみよう

ということで、下記コマンドを打っていけばイケます！

updateはどうでもいいかもです(｀･ω･´)ゞ

```bash:
$ brew update
$ brew install homebrew/php/php70
$ vim ~/.bashrc
```

で、PATH通してくれ、と言われるはずなので。

```bash:.bashrc
  export PATH="$(brew --prefix homebrew/php/php70)/bin:$PATH"
```

そして、よしなにしてあげれば。

```bash
$ source ~/.bashrc
$ php -v

PHP 7.0.7
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
```

# 終わりに
エラー出るかなと思ったけど何もなかった。
おめでとう。