OmniAICreator/Qiita-1.07M huggingface dataset:
iOSの3種類のカメラ実装


いまさらだけどよく忘れるので、備忘録。

iOSでカメラ機能を実装するには、3種類の方法がある。
簡単にいうと、`UIKit.framework`を使うか、`AVFoundation.framework`を使うか、の違い。

─────────
`framework`
　├ `class` 
　├ メリット
　├ デメリット
─────────

## ① `UIKit.framework`

### `UIImagePickerController` 

>[UIImagePickerController Class Reference - Apple Developer](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImagePickerController_Class/)

#### メリット

- 簡単
- 写真、動画、編集など、一通りのことはできる
- モックなどをさくっと作るときに便利

#### デメリット

- 複雑なことはできない
- 撮影中のプレビュー画面を加工したりとかはできない

## ② `AVFoundation.framework`

### `AVCaptureStillImageOutput` 

>[AVCaptureStillImageOutput Class Reference - Apple Developer](https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVCaptureStillImageOutput_Class/)

#### メリット

- 撮影中の映像をそのまま画面に表示することができる
- プレビュー画面に別のViewを重ねたりできる
- **オリジナルのカメラUIを作りたい場合**はこれ

#### デメリット

- `UIImagePickerController`に比べて実装が複雑

ちなみに、"still"な"image"で「静止画」

## ③ `AVFoundation.framework`

### `AVCaptureVideoDataOutput` 

>[AVCaptureVideoDataOutput Class Reference - Apple Developer](https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVCaptureVideoDataOutput_Class/)

#### メリット

- 撮影中の画像を1枚ずつ加工したいときはこれ
- 撮影中のプレビューにフィルター効果をつけて、漫画風とかイ◯スタっぽくしたり(リアルタイムで加工できるのがポイント)
- **vineみたいに繋ぎ取りしたい場合**もこれ
- 基本的に**動画撮影用**だが、静止画も撮影(キャプチャ)できる。(無音カメラとかはこの方法)

#### デメリット

- `UIImagePickerController`に比べて実装が複雑


参考

>- [iOSのカメラ機能を使う方法まとめ](http://dev.classmethod.jp/smartphone/ios-camera-intro/)
>- [ Vineと同じように繋ぎ撮りできるカメラを作る](http://dev.classmethod.jp/smartphone/ios-camera-intro/)


おわり
IExで設定済みのaliasを一覧表示したい

`__ENV__.aliases`で設定済みのaliasを表示できます。

```iex
iex(1)> __ENV__.aliases
[]
iex(2)> alias Rumbl.Repo
nil
iex(3)> alias Rumbl.User
nil
iex(4)> __ENV__.aliases
[{Repo, Rumbl.Repo}, {User, Rumbl.User}]
```


もうちょいマシな方法がありそうなもんですが見つけられませんでした。
良い方法があったら教えてください。
なんで愛が生まれるのか

## この記事の概要

いろんな言語で愛が生まれまくってるけど誰も説明記事書いてなかったので
説明してみる


##生とは
| Unicode | Utf-8 | バイナリ |
|----|----|----|
| U+751F  | \xe7\x94\x9f  | 11100111 10010100 10011111 |

##死とは
| Unicode | Utf-8 | バイナリ |
|----|----|----|
| U+6B7B | \xe6\xad\xbb | 11100110 10101101 10111011 |

##愛とは
| Unicode | Utf-8 | バイナリ |
|----|----|----|
| u+611B  | \xe6\x84\x9b | 11100110 10000100 10011011 |

##結局みんな何してるの？

下記のようなコードを書くと愛になります。

```go:Goの場合
package main

import "fmt"

func main() {
    fmt.Println(string('生' & '死'))
}
```

一体何してるのかわからない人に説明すると
ビット積という計算をしています。

簡単にいえば、対象となる値が両方 1 の場合は 1 、そうじゃない場合は０となります。
生と死の値が同じ所だけ赤文字にしてみました。

| 文字 | バイナリ |
|----|----|
| 生 | 1 1 1 0 0 1 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 |
| 死 | 1 1 1 0 0 1 1 0 1 0 1 0 1 1 0 1 1 0 1 1 1 0 1 1 |
| 愛 | <Font color="red">1</font> <Font color="red">1</font> <Font color="red">1</font> <Font color="red">0</font> <Font color="red">0</font> <Font color="red">1</font> <Font color="red">1</font> 0 <Font color="red">1</font> <Font color="red">0</font> 0 0 0 <Font color="red">1</font> 0 0 <Font color="red">1</font> <Font color="red">0</font> 0 <Font color="red">1</font> <Font color="red">1</font> 0 <Font color="red">1</font> <Font color="red">1</font> |

わかってしまえば簡単なことですね
PythonでCIDR表記のネットマスクをドット付き十進表記に変換

ネットマスクをドット付き十進表記 (A.B.C.D) から CIDR 表記へ変換する方法は[以前に投稿した](http://qiita.com/quenhulu/items/9afd872d35bbf5b61582)のですが、その逆に変換する必要に迫られたので書いてみました。

なおエラー処理はしていませんので、おかしなネットマスクを渡すとおかしな値が帰ってきます。ご注意ください。

# コード
```py
import socket
import struct

def mask2cidr(mask):
    """Convert netmask from Dotted address to CIDR."""
    return bin(struct.unpack('!L', socket.inet_pton(socket.AF_INET, mask))[0])[2:].index('0')
```

# テスト
```py
>>> mask2cidr('255.255.255.0')
24
>>> mask2cidr('255.255.240.0')
20
>>> mask2cidr('255.255.255.192')
26
```

# 参考
- [PythonでCIDR表記を変換 - Qiita](
http://qiita.com/quenhulu/items/9afd872d35bbf5b61582)
AWS Lambdaではまった個人的メモ

# このページについて

AWS Lambdaを使っていてハマったところをつらつらと書いてあります。
その時その時の対応を書いているのでRuntimeやバージョンが変わると対応も変わるかもしれません。

## Handler

（RuntimeがNode.js 4.3の場合）
ConfigurationのタブページのHandlerが index.handler と指定されている場合、zipファイルに含めるjsファイルのファイル名は *index.js* としないとならない。
hogehoge.handlerだとhogehoge.jsになる。

Handlerが index.myHandler と指定した場合は、ソースコード内の exports.handler は *exports.myHandler* と指定する。

![handler.png](https://qiita-image-store.s3.amazonaws.com/0/92970/7d7933e4-915b-0de0-50f0-ffffc229feb5.png)

## Save and test

[Save and test]ボタンでzipファイルをアップロードしてもアップロードしたコードでテストが動かないことがあるので注意。
[Save]ボタンをクリックしたのち、英国紳士らしく紅茶を一口すすってから[Test]ボタンをクリックする余裕が欲しい。
Electronのes6対応

Electronで内部的に使われているnodeのバージョンはv5系です。
`process.versions`を確認すると内部で使われている`node`と`chrome`のバージョンが確認できます。

```js
console.log(process.versions);
// => { http_parser: '2.6.2',
//   node: '5.10.0',
//   v8: '4.9.385.28',
//   uv: '1.8.0',
//   zlib: '1.2.8',
//   ares: '1.10.1-DEV',
//   modules: '47',
//   openssl: '1.0.2g',
//   electron: '0.37.8',
//   'atom-shell': '0.37.8',
//   chrome: '49.0.2623.75
// }
```

node 5.10.0は本来ならば、デストラクチャリングに対応していません。
しかしながら、Electron v0.37からは、デストラクチャリングが使えるので以下のように書くことができます。

```js:before
const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
```

```js:after
const {app, BrowserWindow} = require('electron');
```

Electronのメインプロセスでは、内部のnodeのバージョンでes6対応が決まると勘違いしていましたが、どうやら違うようです。
問題はv8のバージョンっぽいですね。

[What’s new in Electron 0.37 - Atom Blog](http://blog.atom.io/2016/03/25/electron-37.html)

上記のリンクによると現在ElectronのES2015対応は91%です。

個人的にはデストラクチャリングが使えればわりと満足なので、async/awaitを使う必要がなければ、バベる必要もないと思います。
c++ builder XE4, 10.2 Tokyo > 自分自身(ソフト)を再起動する

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

自作ソフトウェアを自分自身で再起動したいとする。
ただし、「二重起動を禁じている」とする。(参照 http://qiita.com/7of9/items/4d3676e6a983ecf21500)

参考 http://www.delphipages.com/forum/showthread.php?t=192827

以下の処理で再起動できた。

```Unit1.cpp
Application->Terminate();
ShellExecute(NULL, NULL, Application->ExeName.c_str(), NULL, NULL, SW_NORMAL);
```

上記が今回対象となったソフト以外でも正常に動くかどうかの保障はない。


以下でも再起動できた。
終了と起動のタイミングによってはうまく再起動しないかもしれない。

```Unit1.cpp
ShellExecute(NULL, NULL, Application->ExeName.c_str(), NULL, NULL, SW_NORMAL);
Application->Terminate();
```
Ruby | ブロック処理を繰り返して配列を作る

`times` と `map` を組み合わせれば良い。

```rb
3.times.map { rand(10) }

# => [3, 2, 4]
```

# 環境

- ruby 2.3.1



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Log4J2で単一パッケージから複数のAppenderを設定してログ出力する

Appender設定を複数指定し、それぞれレベル指定をした上で、親となるLogger要素にも基準となるレベル指定が必要でしたので、忘れないようメモ。

```log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="off">
	<Properties>
		<Property name="logformat">%date{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%15thread] %class#%method@%4line : %message %n</Property>
	</Properties>

	<Appenders>
		<Console name="stdout" target="SYSTEM_OUT">
			<PatternLayout pattern="${logformat}" />
		</Console>

		<File name="file" fileName="logs/app.log">
			<PatternLayout pattern="${logformat}" />
		</File>
	</Appenders>

	<Loggers>
		<Logger name="package.sample" additivity="false" level="DEBUG">
			<AppenderRef ref="stdout" level="DEBUG"/>
			<AppenderRef ref="file" level="INFO"/>
		</Logger>
	</Loggers>
</Configuration>
```
PhpStorm + Xdebugでリモートデバッグ時にデバッグクライアントに繋がらない。

# 事象

PhpStorm + Xdebug でリモートデバッグを行なおうとしたがデバッグクライアントに繋がらない。
リモートデバッグとは言いつつも apache はローカル環境で起動してます。


```
I: Checking remote connect back address.
I: Checking header 'HTTP_X_FORWARDED_FOR'.
I: Checking header 'REMOTE_ADDR'.
I: Remote address found, connecting to ::1:9001.
E: Could not connect to client. :-(
```

# 原因

xdebug.remote_host に localhost や 127.0.0.1 してても ipv6のループバックアドレス（::1）に変換されて接続しに行って拒否られているようだ。 


# 解決方法

php.ini の xdebug セクションに

```
xdebug.remote_connect_back=0
```

 または 


```
xdebug.remote_connect_back=off
```

を設定する。
これで繋がった。

もしかしたら hosts に

```
localhost 127.0.0.1
```
て書いても行けるかも。
Fixing multibyte filenames sent via adb


adbで送られたファイル名を修正する

- On OSX, when you access Android using mass-storage mode, filenames are written in UTF-8.
- However, when you send files via adb, filenames are written UTF-8-MAC, i.e. filenames are not normalized.
- These files looks corrupted;
  - when the SD-card is inserted to OSX, the files can be Tab-Completed in Terminal, but they cannot be open()ed in anyways.

- OSXでは、Androidにマスストレージモードでアクセスすると、ファイル名はUTF-8で書き込まれます。
- しかし、adb経由でファイルを送信すると、UTF-8-MACで記録されます(正規化されません)。
- これらのファイルは破損しているように見えます；
  - SDカードを取り出してOSXに入れると、ターミナルでは、タブ補完は効くが一切開けないといった奇妙な状態になります。

----

- To address this issue, we have to rename via adb, because mass-storage mode cannot rename files properly. you can try following Ruby script.
  - Well, C(++) edition executable on Android is appreciated.
  - Androidで実行できるC(++)版がありましたら歓迎します。

```tonfc_android.rb
#!/usr/bin/ruby
$<.each{|_s|
	_s.chomp!
	s=_s.dup
	s.force_encoding(Encoding::UTF_8_MAC)
	nfc=s.encode(Encoding::UTF_8)
	if _s!=nfc
		puts nfc
		system("adb shell mv '#{_s}' '#{nfc}'")
	end
}
```
Elixirでも愛が生まれた

```ex
use Bitwise
 
[life] = '生'
[dead] = '死'
IO.puts <<(life &&& dead)::utf8>>
```

http://ideone.com/1VXNYL


元ネタ
http://qiita.com/dongri/items/041ff3e7dde6c99beeb0
windows update が終わらなかったり、エラーになったときにやること（windows8.1)

# 終わらない

こちらの手順で手動更新
http://freesoft.tvbok.com/win8/windows81_not_end_update.html

各更新プログラムは**ダウンロード -> 実行**では、終わらずキャンセルもできなかったが、
**ダウンロード -> 再起動 -> 実行**、ですぐに終わった



# エラー

## エラーコード8007000D
コントロールパネル　→　システムとセキュリティ（問題の発見と解決）　→　システムとセキュリティ（Windows Update で問題を解決する）

## エラーコード80073712

管理者としてコマンド プロンプトを開き、

`Dism /Online /Cleanup-Image /ScanHealth`
`Dism /Online /Cleanup-Image /Restorehealth`

だけだとダメで


`Dism /Online /Cleanup-Image /Restorehealth /LimitAccess`

したらうまくいった


# 参照
http://freesoft.tvbok.com/win8/windows81_not_end_update.html
https://technet.microsoft.com/ja-jp/library/hh824869.aspx
CentOS7 ibus-kkc,ibus-Anthy キーボードが英語になる

■環境
CentOS Linux release 7.2.1511 (Core) 
GNOME Shell 3.14.4

■現象
日本語　の　箇所が　？　になっている。

![Screenshot from 2016-05-09 17-42-16.jpg](https://qiita-image-store.s3.amazonaws.com/0/71525/72a210e3-e6bb-52c3-fca6-c406df3da084.jpeg)

■キーマップの設定と確認
`$ localectl set-keymap jp106`
`$ localectl set-keymap jp-OADG109A`
`$ localectl`

```lang:結果
   System Locale: LANG=ja_JP.utf8
                  LC_NUMERIC=ja_JP.UTF-8
                  LC_TIME=ja_JP.UTF-8
                  LC_MONETARY=ja_JP.UTF-8
                  LC_PAPER=ja_JP.UTF-8
                  LC_MEASUREMENT=ja_JP.UTF-8
       VC Keymap: jp-OADG109A
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```

■ibus-kkcの場合

/usr/share/ibus/component/kkc.xml

layoutをjpにする。

```lang:xml
<layout>jp</layout>
```

■ibus-anthyの場合
/usr/share/ibus-anthy/engine/default.xml

layoutをjpにする。

```lang:xml
<layout>jp</layout>
```

追記：既存ユーザの場合
/home/user/.config/ibus-anthy/engines.xml

layoutをjpにする。

```lang:xml
<layout>jp</layout>
```


■次の入力ソースへ切り替えるをカスタマイズ
アプリケーション - システムツール - 設定 - キーボード
　ショートカット - タイピング
　　次の入力ソースへ切り替える　を自分用に設定

![Screenshot from 2016-05-09 17-56-32.jpg](https://qiita-image-store.s3.amazonaws.com/0/71525/a5f4ffb6-cdda-fd5d-467f-e30d991a0b90.jpeg)

■切り替え時の表示

![change.jpg](https://qiita-image-store.s3.amazonaws.com/0/71525/b2e55eb7-a373-3736-7b5e-b44dcdad38ea.jpeg)






★参考にさせていただいた場所
>[ibus-mozcのキーボードレイアウトが英語になるトラブルの対処法](http://note.kurodigi.com/ibus-mozc-kbdlayout/)
>[CentOS7で、109キー日本語レイアウトを有効にする](http://qiita.com/sh1k1ya/items/c025bb4d9ca207aacaaa)
「することができる」は有害と考えられる

# 「することができる」とは

技術文書を読んでいると「することができる」「することが可能である」という表現を目にします。実はこの「することができる」という表現は冗長なため有害、つまり多用すべきでないという考えがあります。

気になって「することができる」についてGoogleで検索してみました。結果、「することができる」という表現について書いたブログ記事をいくつか見つけました。以下、発見したブログ記事の一覧です。

- [読みやすい文章の極意は「修飾語」にあり](http://www.atmarkit.co.jp/ait/articles/1001/19/news106_2.html)
- [読みやすい文章を書くために心がけたい１０のポイント](http://www.sekaihaasobiba.com/entry/2017/12/10/202321)
- [感性工学的テキスト商品学～書き言葉のマーケティング](http://www.norari.net/stext/031102.php)

列挙したブログ記事の全てで「することができる」を多用しないように警告しています。

# 「することができる」を自動で検知

私も「することができる」「することが可能である」のような冗長表現をできるだけ利用しないように気をつけています。「することはできる」は有害、 **中身がないのに、長い表現** と考えているためです。書籍「[ドキュメント作成システム構築ガイド](http://www.amazon.co.jp/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E4%BD%9C%E6%88%90%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A7%8B%E7%AF%89%E3%82%AC%E3%82%A4%E3%83%89-GitHub%E3%80%81RedPen%E3%80%81Asciidoctor%E3%80%81CI%E3%81%AB%E3%82%88%E3%82%8B-%E3%83%A2%E3%83%80%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0-%E4%BC%8A%E8%97%A4-%E6%95%AC%E5%BD%A6/dp/477418036X/)」を執筆した際には、RedPen で「することが」のような冗長表現を自動検知していました。以下、作成した冗長表現を検知する RedPen 用のスクリプト（[redundant-ja-expression.js](https://github.com/continuous-manual-writing/book-source/blob/master/js/redundant-ja-expression.js)）です。

```js
var redundantExpressions =
  new Array('することが', 'ことも', '可能で', '可能と', 'ことにします',
  'ことにして', '言えます', 'しかしながら' , '一面においては', 'その結果として', 'このような', 'そのような', '意味において', 'まず初', 'まず最初','完全に','となって','そういった','を行う','をおこなう','するもの','したもの', '特に', '万一','かどうか', 'させること','行なった' , 'ことは','ことによって', 'してやり', 'してやる','のではないか', 'となります','一番最初','では次に','いますので','一切','きっと','する方法で','まずはじめ','するのです');

function validateSentence(sentence) {
  for (var i = 0; i < redundantExpressions.length; i++) {
    if (sentence.content.indexOf(redundantExpressions[i]) != -1) {
	addError('冗長な表現 "' + redundantExpressions[i] + '" を利用しています。', sentence);
    }
  }
}
```




RedPen により検知された「することが」は短い表現に置き換えました。しかし、まだ確証はもてません。本当に「することができる」は有害な（多用するべきでない）表現なのでしょうか。

# 「理科系の作文技術」における「することができる」

木下先生によって書かれた「理科系の作文技術」は技術文書のバイブル的な本です。この書籍で「することができる」はどの程度利用されているか調べました。出現回数を調べるのに、PDFフォーマットの「理科系の作文技術」を利用しました。以下、PDF版の書籍で「することができる」を検索している様子です。

<img width="940" alt="Screen Shot 2016-05-09 at 17.37.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/61252/0b2cc57d-2e04-a550-5e85-376ab95fe500.png">

すると「することができる」は5回だけ利用されていました。「することが可能」は一度も利用されていません。本の長さを考えれば出現回数が少ないのがわかります。やはり「することができる」は多用するべきでない表現とわかりました。

# なぜ人は「することができる」を使用するのか

私も論文を書き始めたばかりの頃、「することができる」「することが可能」を多用していました。持って回った表現を書いている自分が格好いい（頭がよくなった）と感じたのです。とはいえ冗長な表現は「読みやすさを」損ないます。特に長い文で「することができる」のような冗長な表現が利用されると、文の意図が理解できなくなります。長い文の分割方法については[こちら（文が長すぎる問題とその対処）](http://qiita.com/takahi-i/items/54dfd5d466cbc55c7146)で解説しました。参考にしてください。また文書中の長すぎる文を検知するには、RedPen が提供する機能 [SentenceLength](http://redpen.cc/docs/latest/index_ja.html#sentencelength) を利用します。

# 結論
「することができる」は多用するべきでない表現です。ドキュメントを書くときには気をつけましょう。最後に、本稿の題目に含まれる「と考えられる」も冗長な表現です。技術文書では「と考えられる」も多用しないでください[^1]。

[^1]:  「有害と考えられる」はダイクストラの論文「Go To Statement Considered Harmful」に由来する表現です。題目としての語呂がよかったので例外的に使用しました。また、「することができる」ではない冗長表現の例として紹介できると考えました。
BeagleBoneBlackで外付けLED BoneScript



なんか以前上げたはずのBonscriptで書いたはずのLチカが消えていたのであげる

```light.js
  1 var b = require('bonescript');
  2 var led = "P9_11";
  3 var state = 0;
  4
  5 b.pinMode(led, 'out');
  6 toggleLED = function() {
  7   state = state ? 0 : 1;
  8   b.digitalWrite(led, state);
  9 };
 10
 11 timer = setInterval(toggleLED, 1000);
 12
 13 stopTimer = function() {
 14   clearInterval(timer);
 15   b.digitalWrite(led, 0);
 16 };
 17
 18 setTimeout(stopTimer, 15000);
```
Groovyでも愛が生まれた

```groovy
def a = "生"
def b = "死"
println ((a as char & b as char) as char)
```

## ここから確認できます。
- https://groovyconsole.appspot.com/
    - 日本語は化けちゃったので↑コピペでお願いします。

## ネタ元
- [愛が生まれた](http://qiita.com/dongri/items/041ff3e7dde6c99beeb0)
- [PHPでも愛が生まれた](http://qiita.com/shinderuman@github/items/c5fa3ea270d7ee33ff87)
MySQL クライアントでの検索結果をカンマ区切りで表示する

何もしないと

```
mysql> select id from users;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
+----+
7 rows in set (0.00 sec)
```

のように表形式で表示されてしまうので
pager を使ってごにょごにょすると

```
pager cat | sed -n "s/| //gp" | sed -n "s/ |//gp" | sed -e "1d" | tr "\n" "," | xargs echo | sed -e "s/,$//g"
```

```
mysql> select id from users;
1, 2, 3, 4, 5, 6, 7
7 rows in set (0.00 sec)
```

できた :tada: 

安心して下さい `nopager` で元に戻ります。

```
mysql> nopager
mysql> select id from users;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
+----+
7 rows in set (0.00 sec)
```
Chefを使ってプロビジョニング


## Chefレポジトリを作成する

* レポジトリ作成
	
	```
	sudo knife solo init chef-repo
	```


* gitに登録
	
	```
	cd chef-repo
	git init
	git add .
	git commit -m 'first commit'
	```


## cookbookの作成

* cookbookを作成する

	```console
	$ knife cookbook create your_cookbook_name -o site-cookbooks
	```


## knife solo prepare


* サーバ用のノードjsonファイルが./node/配下に作成される
	
	```console
	$ sudo knife solo prepare 192.168.1.1
	```

## サーバ用設定
* jsonファイルへ適用するレシピを指示したりパラメータを書き込む
	
	```console
	# vi nodes/192.168.1.1
	```


## Chef Solo 実行

* レシピをノードに適用
	
	```console
	$ sudo knife solo bootstrap 192.168.1.1
	```
	


# サードパーティーのcookbookを使う場合

## berkshelf

### berkshelf導入

* Gemfile作成
	
	```:(chef-repo)/Gemfile
	$ cat << EOS > Gemfile && cat Gemfile
	source :rubygems
	gem 'berkshelf'
	EOS
	```

* bundle実行
	
	```
	bundle --path vendor/bundle
	```

### cookbookの取得

* Berksfile作成
	* [https://supermarket.chef.io/cookbooks-directory](https://supermarket.chef.io/cookbooks-directory)から先人が作成したcookbookを拝借する。
		
		```:(chef-repo)/Berksfile
		# Berksfile
		site :opscode
		cookbook 'yum'
		cookbook 'nginx'
		...
		(必要なものをリストアップ)
		```
	


* クックブック取得

	```console
	$ bundle exec berks --path cookbooks
	```
全てのテーブルのレコード数をカウントする

```groovy
@GrabConfig(systemClassLoader = true)
@Grab('mysql:mysql-connector-java:5.1.31')
import groovy.sql.Sql

def db = Sql.newInstance("jdbc:mysql://localhost:3306/dbname", "root", "", "com.mysql.jdbc.Driver")

db.eachRow('show tables') { row ->
    def tableName = row[0]
    db.eachRow("select count(*) as cnt from " + tableName) {
        println "$tableName: $it.cnt"
    }
}
```
ADX2 LEを使おう その４


ここではプログラムを組む上での注意点を説明していく。
今回は汎用的なサウンドの使い方であり特殊処理に関しては触れないものとする。

##フレームワーク化する
実際の開発ではCRIの関数をそのまま呼び出すことはほとんどなく
SoundManagerを作ってその中にCRIの関数を書くことになる。

ゲームのサウンドは特殊なことを行う場合以外は、BGM、SE、VOICEの再生と停止、音量設定くらいしかない。
しかし直接CRIの関数呼び出してやると１つの動作をさせるのに何行も書かなくてはいけなくなってしまうので
これらをフレームワーク化することで利便性を高める。

##サウンドマネージャーに必要なメソッド
サウンドマネージャーはシングルトンで構築し、どこからでもアクセスできるようにしておく。
必要になりそうな汎用的なメソッドを以下に並べる。

- Initialize
- Finalize
- Load
- Unload
- PlayBGM
- StopBGM
- IsPlayingBGM
- SetVolumeBGM
- GetVolumeBGM
- PlaySE
- StopSE
- IsPlayingSE
- SetVolumeSE
- GetVolumeSE
- PlayVoice
- StopVoice
- IsPlayingVoice
- SetVolumeVoice
- GetVolumeVoice
- StopAll
- Suspend
- Resume

各メソッドの説明とメソッド内での注意点を記載する。

##Initialize
初期化処理を記述する。

#### ターゲットプラットフォーム用の初期化
プラットフォームごとに初期化方法が異なるため、CRIのサンプルを元に正しい初期化処理を行う。

####BGM、SE、VOICEそれぞれのプレイヤー数の確保
プレイヤー１つにつき１つ音を鳴らすことができる。
プレイヤーが８つある場合は、同時に８音鳴らせるということになる。
プレイヤー数はゲームによって異なるが、汎用的な数を設定するのであれば
BGMは１、SEは８、ボイスは４あれば十分である。
また、今回のBGMは１つしか再生しないことを前提に説明を進めていく。

####フェード設定
サウンドのフェードイン、フェードアウトを行う場合、CRIではプレイヤーごとにフェード設定をしてやる必要がある。
大抵の場合フェード処理は必要になってくるため、全てのプレイヤーにフェード設定をしておいたほうが無難である。
AttachFaderというメソッドでフェードを有効にするが、デフォルトでフェードインとフェードアウト５００ミリ秒設定になっているため、SEとVOICEのフェードイン時間は0に設定したほうがよい。

####ACFファイルの読み込み
全体設定であるACFファイルを読み込んでおく

####必要なACBファイルの読み込み
ゲーム内で読み替えを行わず、最初から最後まで使用するものは初期化の時点で読み込んでおく

##Finalize
終了処理を記述する。
読み込んだファイルの解放、プレイヤーの解放、ADX2の解放で終わるはず。

##Load
ACBファイルの読み込むを行う。
ここで行うのは読み替えを行うもので、最初から最後まで使用するものはInitializeで済ませてよい。

##Unload
ACBファイルの解放を行う。
ここで行うのは読み替えを行うもので、最初から最後まで使用するものはFinalizeで済ませてよい。

##PlayBGM
BGMの再生を行う。

####引数
- BGM名 or BGMのインデックス
- ディレイ(開始までのWait時間、デフォルトで0秒)
- フェードイン時間(デフォルトで0.5秒)
- フェードアウト時間(デフォルトで0.5秒)

####注意点
- 現在再生されているBGM名が指定された場合は何もしないようにする。
- CRIはフェード機能を有効にしている時、BGM1を再生中にBGM2を再生しようとした場合、自動的にフェードで切り替えを行ってくれるため、フェードインやフェードアウトの時間は0にしないほうがよい。

##StopBGM
BGMの停止を行う

####引数
- フェードアウト時間(デフォルトで0.5秒)

####注意点
フェード時間が0より大きい値が指定されている状態で停止後に即時にリソースを解放している場合、フリーズの原因となることがあるため、即時解放のときはフェードアウト時間を0にしてやる必要がある。

##IsPlayingBGM
BGMの再生中の有無を取得する。
状態がPrepかPlayingのときは再生中と判断するのがよい。

##SetVolumeBGM
BGMの音量を設定する

##GetVolumeBGM
BGMの音量を取得する

##PlaySE
SEの再生を行う。

####引数
- SE名 or SEのインデックス
- 再生するプレイヤーのインデックス(-1を指定すると空いているプレイヤーを使用する)
- ループの有無
- ディレイ(開始までのWait時間、デフォルトで0秒)

####戻り値
再生するプレイヤーのインデックス、空いているプレイヤーがなかった場合は-1。

####注意点
- 初期化の段階で行っているので問題ないと思うが、フェードインの時間は0秒にしておく。

##StopSE
SEの停止を行う

####引数
- 停止するプレイヤーのインデックス(-1が指定された場合は全てのSEを停止)
- フェードアウト時間(デフォルトで0.5秒)

####注意点
BGMと同じ

##IsPlayingSE
プレイヤーのインデックスを指定するところ以外は、BGMと同じ

####引数
- プレイヤーのインデックス

##SetVolumeSE
SEの音量を設定する

##GetVolumeSE
SEの音量を取得する

##PlayVoice
Voiceの再生を行う。

####引数
- Voice名 or Voiceのインデックス
- キャラクター名 or キャラクターのインデックス
- 再生するプレイヤーのインデックス(-1を指定すると空いているプレイヤーを使用する)
- ディレイ(開始までのWait時間、デフォルトで0秒)

####戻り値
再生するプレイヤーのインデックス、空いているプレイヤーがなかった場合は-1。

####注意点
- 初期化の段階で行っているので問題ないと思うが、フェードインの時間は0秒にしておく。
- 読み込んでいないキャラクターを指定された場合は、再生タイミングで読み込むようにする。ただし、際限なく読み込んでしまうとメモリを圧迫してしまうため、一定以上の読み込みを行ったら古いものから解放するようにしておくとよい。

##StopVoice
Voiceの停止を行う

####引数
- 停止するプレイヤーのインデックス(-1が指定された場合は全てのVoiceを停止)
- フェードアウト時間(デフォルトで0.5秒)

####注意点
SEと同じ

##IsPlayingVoice
SEと同じ

####引数
- プレイヤーのインデックス

##SetVolumeVoice
Voiceの音量を設定する

##GetVolumeVoice
Voiceの音量を取得する
Systemd で デバイスドライバの modprobe と rmmod を行う

## はじめに

[「FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(ブートイメージの提供)」@Qiita](http://qiita.com/ikwzm/items/cdeb3c9c352776eac683)で FPGA+SoC の Linux Kernel と Debian8 rootfs を提供した記事を書きましたが、その際初めて systemd に触れて、デバイスドライバを起動時に自動的にロードしたり、停止時に自動的に取り外したい時に、ちょっと躓いたのでその覚え書き。

systemd は Debian では Debian8(jessie) から採用されたシステム管理システムです(ややこしい)。

主にこちらの記事が参考になりました。というより、ほぼそのまんま。

- [「systemdの*.serviceファイルの書き方」@Qiita](http://qiita.com/masami256/items/ef0f23125cf8255e4857)

## service ファイルの記述例

dtbocfg (Device Tree Blob Overlay Configuration File System)の例を以下に挙げます。

```service:device-tree-overlay.service
[Unit]
Description=Device Tree Overlay Service.
After=udev.target
After=dbus.target
After=avahi.target
After=syslog.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/modprobe dtbocfg
ExecStop=/sbin/rmmod dtbocfg

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

ポイントは \[Service\] の Type=oneshot と RemainAfterExit=yes です。
特に RemainAfterExit=yes を指定しないと、サービスをスタートさせてデバイスドライバをロード(modprobe dtbocfg)した後、すぐに停止してデバイスドライバは取り外し(rmmod dtbocfg)てしまいます。
もともと systemd の ExecStart で指定するコマンドやスクリプトは実行するとそのままシステムに常駐することを想定しているようです。しかし、modprobe はデバイスドライバをロードしたらすぐに終了して戻ってきてしまうので、RemainAfterExit=yes を指定しないと systemd はサービスが終わったものと認識してすぐに ExecStop を実行します。

もうひとつおまけに fpgacfg (FPGA Configuration Interface for Linux FPGA Manager Framework) の例。

```service:fpga-manager.service
[Unit]
Description=FPGA Manager Service.
After=device-tree-overlay.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/modprobe fpgacfg
ExecStartPost=/usr/bin/fpgacfg-service.rb --install
ExecStop=/sbin/rmmod fpgacfg
ExecStopPost=/usr/bin/fpgacfg-service.rb --remove

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

fpgacfg は Device Tree Overlay を使うので、\[Unit\] の After=device-tree-overlay.service で device-tree-overlay.service を先に起動しておくようにします。
また、fpgacfg は device-tree に記された Low Level FPGA Driver と接続/切断する必要があります。fpgacfg はそのための専用のスクリプト(fpgacfg-service.rb)を用意しています。ExecStartPost でデバイスドライバのロード直後に "/usr/bin/fpgacfg-service.rb --install" を実行し、ExecStopPost でデバイスドライバの取り外し直後に "/usr/bin/fpgacfg-service.rb --remove" を実行するようにしています。


## service を systemd に登録

上記の service ファイルを /etc/systemd/system にコピーします。


## service を Linux 起動時に自動的に起動する

システムが起動してから次のようにコマンドを叩けば、次の Linux 起動時に自動的に service も起動します。

```
shell$ sudo systemctl enable device-tree-overlay.service
Created symlink from /etc/systemd/system/multi-user.target.wants/device-tree-overlay.service to /etc/systemd/system/device-tree-overlay.service.
shell$ sudo systemctl enable fpga-manager.service
Created symlink from /etc/systemd/system/multi-user.target.wants/fpga-manager.service to /etc/systemd/system/fpga-manager.service.
```
open-rui.rb の 「407 "Proxy Authentication Required" (Net::HTTPServerException)」に対するアレ


自分、Proxy の認証ユーザー名に "@" 挟んでるんで、環境変数 http_proxy にプロキシ設定する時に `@`  を`%40` に置きかえて設定してます。すると良く見る open-uri.rb のパッチを当てただけだとやっぱりダメで

``` open-uri.rb.patch
--- lib/ruby/2.2.0/open-uri.rb.orig
+++ lib/ruby/2.2.0/open-uri.rb
@@ -254,6 +254,12 @@
   def OpenURI.open_http(buf, target, proxy, options) # :nodoc:
     if proxy
       proxy_uri, proxy_user, proxy_pass = proxy
+      if proxy_uri.userinfo
+        proxy_user, proxy_pass = proxy_uri.userinfo.split(':')
+        proxy_user = URI.decode proxy_user
+#        proxy_pass = URI.decode proxy_pass
+        proxy_uri = URI.parse(proxy_uri.scheme + '://' + proxy_uri.host + ':' + proxy_uri.port.to_s)
+      end
       raise "Non-HTTP proxy URI: #{proxy_uri}" if proxy_uri.class != URI::HTTP
     end

```

URI.decode が必要でした。password 側の decode はやりすぎかなとも思うけど、必要な人もいるよね、きっと。パスワードに '@' とか ':' とか付けたいよね。でも他の多くの場所で破滅しそう。

password 側の decode は試してないので確認してみてください。
RTX810でローカルサーバーを公開(NAPT)する設定

マニュアルの6章「外部にサーバーを公開する」の部分です。
「静的IPマスカレード」を使って設定します。

マニュアルダウンロードは[こちら](http://www.rtpro.yamaha.co.jp/RT/manual.html)

たとえば、ローカルネットワーク内の 192.168.100.100 のマシンの3000番ポートで立ち上げておいたWebアプリケーションに外部から8080番ポートでアクセスしたい場合は以下のように設定します。

* プロトコル: tcp
* ポート: 8080=3000
* 使用ホストIPアドレス: 192.168.100.100

マニュアルにはポート変換の記載がないのですが、`(外部IPアドレス)=(内部IPアドレス)`という形式で記載すると変換することができます。

また、マニュアルにはファイアウォールの許可設定も追加するように記載されていますが、IPマスカレードを設定すると自動的にファイアウォールの設定が追加されました。

あとは公開するマシン側で、ファイアウォールやセキュリティソフトのアクセス制限を解除すればOKです。
gitでcommit前にbinding.pryがないかチェック(git-hook)


### ざっくり

[`git-hook`](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)の機能を使って
コミット前になんちゃらするやり方です

### やり方

フックしたいプロジェクトのディレクトリまで移動して、
以下を実行してpre-commitファイルを作成

```
touch .git/hooks/pre-commit
```

そこに以下を追加
（こちらを丸コピ
http://qiita.com/quattro_4/items/f9e0884f2efe7e8c033a）

```rb
#!/usr/bin/env ruby

class String
  # colorization
  #   from http://stackoverflow.com/questions/1489183/colorized-ruby-output
  def colorize(color_code)
    "\e[#{color_code}m#{self}\e[0m"
  end
  def red ; colorize(31) ; end
  def green ; colorize(32) ; end
  def yellow ; colorize(33) ; end
  def pink ; colorize(35) ; end
end


checks = %w{
  debugger
  byebug
  logger
  puts
  binding.pry
  save_and_open_page
  console.log
}

errors = []

files_changed = `git diff --cached --name-only HEAD`
files_changed.each_line do |filename|
  filename.chomp!
  changes = `git diff --cached -U0 HEAD -- "#{filename}"`
  checks.each do |check|
    result = changes.split(/\n/).grep(/^\+.*\b#{check}\b/)
    unless result.empty?
      errors << {:name => check, :file => filename, :matches => result}
    end
  end
end

unless errors.empty?
  errors.each do |error|
    puts "'#{error[:name]}' found in file: #{error[:file]}".yellow
    error[:matches].each {|m| puts "  -> #{m}" }
  end
  puts "COMMIT REJECTED. Please remove them before commiting OR use --no-verify".red
  exit 1
end
```

実行権限を付与して
おしまい。

### 余談

最初、もともとある.git/hooks/pre-commit.sampleをコピーして
もともとの記述をコメントアウトして
上記のコードを追加していたら、

```bash
.git/hooks/pre-commit: line 53: class: command not found
```
というエラーが出てはまった。。。

原因は
pre-commit.sampleの1行目が

```
#!/bin/sh
```

になっていて、
52行目に

```
#!/usr/bin/env ruby
```

この記述を書いていたのだが、
どうやらこいつは
１行目に書いていないとダメらしいです。。。

「#!」のことを「シェバング（シバン）」(shebang) というらしい。
https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_%28Unix%29

### thank you..<i class="fa fa-heart"></i>
http://qiita.com/quattro_4/items/f9e0884f2efe7e8c033a
Androidエミュレータにローカルマシンのファイルをコピーする方法

テストなどでエミュレータにファイルを配置したい場合のコマンドです。
エミュレータ内に単にadb pushしても内容がすぐに反映されない場合があるので、adb push後に強制的にメディアスキャンを発生させます。

```
# adb push <ローカルファイルパス> <リモートファイルパス>
adb push ~/Documents/test.jpg /storage/Download/

# メディアスキャンを発生させて新しいファイルをインデックスさせる
adb shell am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard
```
Mac OS Xのブラウザのファイル選択でサイドバーの一部が消えてしまう問題の対処

Finderのサイドバーのお気に入りの使い勝手が非常に便利です。

![Screen Shot 2016-05-09 at 3.28.26 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/885a742b-6bc3-0e4e-1643-ee4878ce9b91.png)


ですがブラウザを使っているとサイドバーのお気に入りが消えてしまうことがありました。

通常は一番上にFavoritesがあるのですが、何かの拍子に消えてしまいます。

![Screen Shot 2016-05-09 at 3.20.49 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/cdc5cd08-4f87-586f-bc34-5591d3190fa3.png)

Chrome, Safariに限らず、他のブラウザでも起こります。


マシンを再起動すれば直るのですが、開発途中とかだと萎えてしまうのでなんとか再起動せずに回避したかったです。

ということで、ターミナルからFinderのプロセスをKillすることで直りました。

```bash
$ pkill Finder
```

若しくはアクティビティモニタからFinderのプロセスを終了でも良いかと思います。

![Screen Shot 2016-05-09 at 3.27.22 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/b4316813-d0ae-e533-8bf9-23b5ca7c422c.png)


# OSのバージョンでは不可？
少し前まではFinderを再起動しても直らなくて、何をやってもダメなのでOSごと再起動をしていましたが、最近は直るようです。

**(2016年6月8日追記)**
と思ったのですが、OS X 10.11.5では上記のやり方ではうまく直りませんでした。
debian & ubuntu memo

# Where are utils?
- dig = `dnsutils`
- ps,pstree,top = `procps`
- ss = `iproute2`

# Ignore `apt install` interactive

`DEBIAN_FRONTEND=noninteractive apt install ...`

# Rosetta stone
https://certsimple.com/rosetta-stone
http://bhami.com/rosetta.html

# from `yum/rpm` to `apt/dpkg`
1st, `apt-get update`. It ___DO NOT___ update packege, just only update `apt-cache`

- `yum update` : `apt upgrade`
`upgrade` apply miner version updates.
- `yum update <hoge>` : `apt install <hoge>`
- `yum search <hoge>` : `apt search <hoge>`
- `rpm -qa` : `dpkg -l`
- `rpm -qi <hoge>` : `dpkg -s <hoge>` or `dpkg -p <hoge`
- `rpm -qf <file>` : `dpkg -S <file>`
- `rpm -ql <hoge>` : `dpkg -L <hoge>`

## Where is changelog ?
`apt-get changelog <hoge>`. but this command read latest ver's changelog on remote repository. Moreover, unfortunately some URL returns 404... 
We can read changelog `zless /usr/share/doc/<hoge>/changelog.Debian.gz`. 

# `init.d` or `systemd` ?
ubuntu 14.04 = init.d
ubuntu 16.04 = systemd
Debian 7 = init.d
Debian 8 = systemd
【rails調査】has_manyとかbelongs_toとかのDBアソシエーションがどんなsql投げてるか調べてみた。

最近はSequelProに頼らず、sqlを書いてDBを確認するようになりました。
reactでcomment部分を作ろうとしたときに、railsのアソシエーションが使えなくて、ちょっと困ったのでsqlを調べて、自前で書けたらもしかしたら行けるかも。という気持ちの元調べてみました。

SequelPro（便利）
http://www.sequelpro.com/

## 調べた感想

 - 意外と簡単なsqlしか投げてなかった!!
 - でも、一回オブジェクトを取得したらキャッシュしてくれていてステキな仕組みだった笑

## 調べたコマンド

 - all
 - belongs_to
 - has_many
 - has_many & first & belongs_to
 - キャッシュ機構


## all

`$ rails console`で中に入ってmodelメソッドをうって行きます。

最初はとりあえず

`posts = Post.all`

<img width="850" alt="スクリーンショット 2016-05-09 14.17.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/23873/5f602dc0-9a03-5112-6441-c1deeea8f364.png">

```sql
Post Load (0.7ms)  SELECT `posts`.* FROM `posts`
```

## belongs_to

`posts[2].user`

<img width="815" alt="スクリーンショット 2016-05-09 14.03.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/23873/aec3fa30-42f7-d6ca-70e4-74fa63960f09.png">

```sql
User Load (8.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1
```

## has_many

`posts[2].comments`

<img width="1108" alt="スクリーンショット 2016-05-09 14.03.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/23873/50b30a43-15bc-dbb7-d814-7d67f0141b2c.png">


```sql
Comment Load (0.4ms)  SELECT `comments`.* FROM `comments` WHERE `comments`.`post_id` = 4
```

## has_many & first & belongs_to 

`posts[1].comments.first.user.name`

<img width="928" alt="スクリーンショット 2016-05-09 14.06.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/23873/3148fb6c-0b97-c35d-2ea1-c87d341129a9.png">



```sql
  Comment Load (0.4ms)  SELECT  `comments`.* FROM `comments` WHERE `comments`.`post_id` = 2  ORDER BY `comments`.`id` ASC LIMIT 1
  User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
```

## キャッシュ機構

<img width="1065" alt="スクリーンショット 2016-05-09 14.26.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/23873/df4af6a7-a6cb-a243-0b76-7058d620bc16.png">


写真の通り、
１回目の
`[2] pry(main)> posts[1].comments.first.user.name`の時には

```sql
  Comment Load (0.4ms)  SELECT  `comments`.* FROM `comments` WHERE `comments`.`post_id` = 2  ORDER BY `comments`.`id` ASC LIMIT 1
  User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
```

が吐かれるのですが

`[3] pry(main)> posts[1].comments`のようにコメントたちを取得した後の

2回目の
`[4] pry(main)> posts[1].comments.first.user.name`の時には

```sql
User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
```

しか吐かれません！

おおおってなりました笑
（rails特有のものでなく、sqlだったらあたりまえの内容だったらごめんなさい！）

## 結果

アソシエーションやっぱり便利だなと思いつつ、特別な事をやってるわけじゃないんだなって印象。
だから、reactでアソシエーションっぽく使うのは難しそうなので、普通にajaxでparameter投げて取得するのがいいかもしれない…！
Butter Knife 8.0.1の設定方法

#はじめに
Butter Knifeの8.0.1を導入したときにハマったので、設定方法をメモしておきます。

#Butter Knifeの公式ページの設定方法
[公式ページ](http://jakewharton.github.io/butterknife/)には設定方法が

![butterknife_info.png](https://qiita-image-store.s3.amazonaws.com/0/117889/4864b383-9ad0-39be-ab04-c5f9ab9d7f18.png)

と書いてあったので、appのbuild.gradleのdependenciesに追記。
>compile 'com.jakewharton:butterknife:8.0.1'
apt 'com.jakewharton:butterknife-compiler:8.0.1'

#何か足りないみたいだ
以下のエラーが出力されてしまって、これだけでは不十分らしい。

>Gradle DSL method not found: 'apt()'

#README.mdを確認してみた
[Downloadの項目](https://github.com/JakeWharton/butterknife#download
)にもう少し詳しく書いてありました。

![readme_info.png](https://qiita-image-store.s3.amazonaws.com/0/117889/4632f29c-9209-c9a3-3e57-68a9f81d2832.png)

#足りない箇所を追記
README.mdに書いてあった内容をbuild.gradleに追記して、ビルドできるようになりました。

##プロジェクト名のbuild.gradle
dependenciesにclasspathを追記。
>classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

##appのbuild.gradle
applyを追記。
>apply plugin: 'com.neenbedankt.android-apt'

dependenciesは、先ほど追記した以下の内容です。
>compile 'com.jakewharton:butterknife:8.0.1'
apt 'com.jakewharton:butterknife-compiler:8.0.1'

#参考
- http://jakewharton.github.io/butterknife/
- https://github.com/JakeWharton/butterknife
HTC Vive + unityでSteamVR Pluginのサンプルが動かない時の対処法

備忘録です。　動くまでどんどん増やしていきます。

## buildがうまくできない

### 1. 【Assets/SteamVR/Scripts/SteamVR_LoadLevel.cs(357,33): error CS0103: The name `Process' does not exist in the current context】

以下の通り書き換え
```
Process.GetCurrentProcess().Kill();
　　　↓
System.Diagnostics.Process.GetCurrentProcess().Kill();
```

## buildしたものが実行されない

### output_log.txtを確認

#### 1. 【Connect to VR Server Failed (301)】

steamVRが動いてるかどうか確認してみましょ
PHPでも愛が生まれた


* http://qiita.com/dongri/items/041ff3e7dde6c99beeb0


```php
<?php
echo '生' & '死' . PHP_EOL;
```

ここから確認できます
https://paiza.io/projects/e4tLgPT4e9oZQXW5fVtZaQ
Qiitaにgifアニメを投稿する僕が考える一番簡単な方法【GIPHY CAPTURE】

記事を投稿する際、完成形のイメージなどを簡単なアニメで見せたいときがありますよね。
そんなときに画面をgifキャプチャツールなどで、キャプチャしてQiitaに貼り付けると思いますが、
皆さんどうしてますか？

▼こんな感じ

![](http://i.giphy.com/26vUMGpwGCXVWRLI4.gif)

## 前提：Qiitaにgifファイルをドラッグしてもダメなことが多い
Qiitaの投稿画面にgifファイルをドラッグしてもファイルサイズが重いと
アニメーションgifになってくれません。

大抵の場合、
gifアニメ化 ⇒ 圧縮 ⇒ ドラッグして動作するか確認..
という工程が必要かと思います。


## 2016年もっとも簡単だと思う方法

**[GIPHY CAPTURE](http://giphy.com/apps#giphycapture)**というアプリを使います。

今まで色々なgifキャプチャツールを使ってきましたが、
一番使い勝手のよいアプリだと思います。（基本無料）

### 1. キャプチャする範囲を決めます
ドラッグして自由に範囲を指定可能
![スクリーンショット 2016-05-09 14.01.59.png](https://qiita-image-store.s3.amazonaws.com/0/30423/6b217938-ce9c-5ee6-f6fa-7bb72da21ebc.png)

### 2. 編集し、アップロードします

なんと、サイズの指定はもちろん、
**再生時間のトリミングが可能!!**
です。

UPLOADボタンを押すと、[http://giphy.com/](http://giphy.com/)にgifファイルがUPにされるので、
後はサイトにアクセスし、[GIF DOWNLOAD]の直リンクをQiitaの投稿画面に貼るだけ

![スクリーンショット 2016-05-09 14.08.24.png](https://qiita-image-store.s3.amazonaws.com/0/30423/16ab899d-b1ff-fbc4-ee73-6587acd80159.png)
編集して

![スクリーンショット 2016-05-09 14.03.27.png](https://qiita-image-store.s3.amazonaws.com/0/30423/a1c40035-4738-64cc-0364-7bd17909caee.png)
UPして

![スクリーンショット 2016-05-09 14.11.03.png](https://qiita-image-store.s3.amazonaws.com/0/30423/8a3dbafd-5e79-7338-fcf0-191ec965c570.png)
gifファイルの直リンクを取得..


### 簡単！
### 追記：はてなブログなどにも応用できます!
【Linux】ZorinOSにapache2をインストールして稼働させてみる。ついでにPHPも

# はじめに
ザ・ウインドウズユーザな私にとって、これほど嬉しいLinuxはない！
ということで、[Zorin OS](http://zorinos.com/)というものにApacheを導入してみます。
![00.png](https://qiita-image-store.s3.amazonaws.com/0/63338/803faa87-c345-640c-96cd-b646afcb1fcb.png)




# Apacheのインストール
お決まりの「端末」ソフトで、インストールを行います。

```lang:端末
$ sudo apt-get install apache2
```
![01.png](https://qiita-image-store.s3.amazonaws.com/0/63338/7f871c46-a8b1-3330-c0a4-5bde235203d1.png)




# Apacheの稼働
```lang:端末
$ sudo systemctl start apache2
```

![02.png](https://qiita-image-store.s3.amazonaws.com/0/63338/2056eb13-c61b-30c2-8f6d-43384c366661.png)



# Apacheの稼働確認
ブラウザ（Firefox）で、localhostを見てみましょう。

```lang:Firefox
http://localhost/
```
![03.png](https://qiita-image-store.s3.amazonaws.com/0/63338/eed8e49d-1124-7249-a05f-2cd7f7d583f3.png)

こんなのが出てれば起動できてます！
余談ですが、[何でG●●gleChr●meがこんなにシェアが大きい](http://www.rbbtoday.com/article/2016/05/06/141808.html)んですかね……
やっぱGoogleだから？Androidに標準インストールだから？
私は断然**Firefox（火狐）派**です（強調）




# phpをインストールしてみる
（1）PHPのインストール
（2）Apacheの再起動

## （1）PHPのインストール
```lang:端末
$ sudo apt-get install php5 libapache2-mod-php5
```

![04.png](https://qiita-image-store.s3.amazonaws.com/0/63338/54df9f74-1384-f0a6-883b-19a68ee060ec.png)


## （2）Apacheの再起動
phpのインストールが終わったらApacheを再起動します。

```lang:端末
$ sudo systemctl restart apache2
```

![05.png](https://qiita-image-store.s3.amazonaws.com/0/63338/283234ef-2a45-4b44-3164-4d2a20dadf82.png)




# PHPの動作確認
（1）PHPファイルの作成
（2）ブラウザで確認

## （1）PHPファイルの作成
```lang:端末
$ sudo gedit /var/www/html/testphp.php
```

エディタが立ち上がるので、

```lang:gedit
<?php phpinfo(); ?>
```

と入力して、保存



## （2）ブラウザで確認
```lang:Firefox
http://localhost/testphp.php
```

![06.png](https://qiita-image-store.s3.amazonaws.com/0/63338/3648107d-d839-90a6-f461-6f4dd7826e9f.png)



とりあえず、こんな感じでしょうか。




#参考サイト様
- [３分でUbuntuにPHP5をインストールする方法](http://dqn.sakusakutto.jp/2008/08/ubuntuphp5.html)
QiitaのGoogle AnalyticsのレポートをTreasureDataに送ってみる

Qiitaには、GoogleAnalytics(GA)を[埋め込む機能](https://qiita.com/settings/analytics)がある。

GAを見てみると、300 PV/Week というしょんぼりした数値・・・😞

![](https://i.gyazo.com/3f21db631cf875981e20b3438d0717b7.png)

以前、設定していて放置していたが、[TDのブログ](https://blog.treasuredata.com/blog/2016/04/22/google-analytics-data-silo-better-customer-analytics/)でもGoogle AnalyticsのログをJavascript SDKを使って送る方法が掲載されたので、QiitaのGAのレポートをトレジャーデータに送ってみる。



# セットアップ手順

1. Google Analytics Profile ID
2. Treasure Data API key
3. Standalone Google Script Service with Analytics API enabled.
4. Setup Google App Script
5. Setup Trigger to run the script

# Google Analytics Profile IDの取得

Google Analyticsにログインした状態で、[Management](https://analytics.google.com/analytics/web/#management/Settings/
)ページに行く。

すると、URLに`a<ACCOUNT_ID>w<WEB_PROPERTY_ID>p<PROFILE_ID>/`が付与されるので、p以下の値をメモる。
例: `https://analytics.google.com/analytics/web/#management/Settings/a11111111w111111111p11111111/`


# Treasure DataのAPI KEYの取得

TreasureDataにサインアップした状態で、[プロフィール](https://console.treasuredata.com/users/current)のページにアクセスする。

Generate NewでWrite Only Keyを新規発行してメモする。

![](https://i.gyazo.com/14eb2e3805b6859cbc285f7db1c961b2.png)


# Google Analytics APIを有効化

[Google Console](https://console.developers.google.com/apis/api/analytics/overview)にアクセスして、Analytics APIを有効化する。
Google App Scriptのプロジェクトと同じにするために、次の設定を行う際にリソース->Developer Consoleプロジェクトを開いて、スクリプトが関連づけられているプロジェクトから、有効化をすると楽かもしれない。

# Google App ScriptでJavascript SDKを使ってTDにログを送る。

[Google App Script](https://script.google.com/)にログインする。

また、上記ではプロジェクトに対してGoogle Analytics APIの有効化を行ったが、
Google App ScriptからもAnalyticsAPIの有効化を行う（参考:[GoogleAppsScriptでGoogleAnalyticsのAPIを利用](http://qiita.com/sebisawa/items/1ae2f871fb8ff3366064))。
リソース -> Googleの拡張サービスから、Google Analytics API (v3)を有効化する。

[kiyoto-san](https://gist.github.com/kiyoto)の[スクリプト](https://gist.github.com/kiyoto/d9749338fd5fd8330637807a865a982d)をコピる。


そして、コピペしたコードの一部を編集する。

特に、`groupBy`と`metrics`と`sortBy`で使える変数は、[Analytics Reporting API V3](https://developers.google.com/analytics/devguides/reporting/core/v3/)を参照すること。ちなみに、現在v4がでているので、そのうちスクリプトを修正する必要があるかと思います。

修正点1: profileIdなどを上記で準備した値に変更

```
INPUTS = {
  groupBy: ['country'],
  metrics:['visits'],
  sortBy:['visits'],
  profileId: 'YOUR_GA_PROFILE_ID',
  databaseName: 'google_analytics',
  tableName: 'sample_report',
  tdAPIKey: 'YOUR_TD_API_KEY'
}
```
修正点2: 条件チェックを外す

```js
-    if (!dimName.startsWith("ga:")) { dimName = "ga:" + dimName; }
+    dimName = "ga:" + dimName;
```

修正点3: 廃止予定の関数を修正

```
-  var yesterdayStr = Utilities.formatDate(yesterday, Session.getTimeZone(), 'yyyy-MM-dd');
+  var yesterdayStr = Utilities.formatDate(yesterday, Session.getScriptTimeZone(), 'yyyy-MM-dd');
```

![](https://i.gyazo.com/f6ae42e696a5c5203b97e61cb830fdb1.png)


関数を選択で、`main`を選択し、実行すると、国毎に集約されたPV数が出力される

![](https://i.gyazo.com/e2c8cabc6f4b0743a1c01dc370345aa2.png)

# トリガーの設定

上記で作成したスクリプトをトリガーを使って定期的に実行する。下記の設定で毎日1~2時頃に前日のGAのレポートをTDに出力できる。

![](https://i.gyazo.com/4cd6aae806f849dcef41657cc923c3a8.png)

# まとめ

今回は、Qiitaのデータを取得しているGoogle Analyticsのレポートを、Google App ScriptからTDのJavascript SDKを利用して、定期的にデータを送る方法を紹介しました。
PhpStormでJSON-LDが直接書きにくい（実質、直接書けない）

# phpstormではJSON-LDがシンタックスハイライトされない。

**※カラースキームはNetBeansですがPhpStormです。
Version: 2016.1 / Build: 145.258**
<img width="729" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/25480/aca348a5-cb34-8b13-f96a-2e3c5f2c6259.png">

ふと、気が向いてパンくずのmicrodataをJSON-LDにて書いてみようと思ったのだが
どうにも綺麗にはいかなかったので、取り急ぎの対応方法と
何か知見を与えてくれる方が現れないかなぁと思い書いてみた。

## 標準的なJSON-LDによるmicrodata記述
まず、一番上に記述しているのが、標準的な物である。
コードについては、それっぽい所からサンプルを拝借しているが
基本的には [Google Schemas の JSON-LD](https://developers.google.com/schemas/formats/json-ld) の話と思って頂きたい。

`script`タグこそハイライトされているが
内部は認識しておらず、プレーンなままである。
そして、最悪このままでもとりあえず記述出来れば良い、という方もいるかもしれないが
問題点は画像内（１）で、謎の改行が数行入っているが、これはPhpStormの標準機能の
コードフォーマットをする度に、１行追加されていくのである。
（ショートカットキー１回押す毎に１行という事）

プレーンなだけでなく、普通に認識されてないのでフォーマットも正しく動作しない。

## まず試した、typeの変更
次に、画像内（２）のように、`ld+`を削除し、JSONとして認識された所
コードフォーマットもうまくいき、綺麗に展開された。しかし、`ld+`が無いとSchemaの意味って恐らく無いよね？

## 現実的な対応
`script`の`type`に`type="application/ld+json"`を増やす事も考えたが
僕は、そこまでの設定を知らないため、知っている中で対応出来る方法を探した。
そこで、出てきたのがヒアドキュメント内のハイライトである。
<img width="761" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/25480/b63d4cb2-bdc8-4c66-7f1c-9d3c301f6a0a.png">
この画像は、実際にJavascriptをハイライトする設定をコピーし、JSONの設定をした物である。
(<<< JS をコピーしてIDでJSONファイルを選び、Places PatternsをJSONに書き換えるだけ）

この機能自体は他言語内で対象言語をハイライトしたりするものだが
ヒアドキュメント向けの設定が既に有ったため、すぐに対応が出来た。

この設定を入れることで、画像のようにハイライトされた。
しかし、展開はされず、ハイライトのみである。
あと微妙に悲しいのが、画像内（３）部分に改行を入れると、
画像内（１）の無限に改行が出てくる状態になってしまう。

## 最後に、賢いやり方
僕はまだJSON-LDを使い始めたばっかりなのでうまく使いこなせませんが
[PHP向けJSON-LDのライブラリ](https://github.com/digitalbazaar/php-json-ld)がありますので
そちらでコード出力すれば良いと思います。

おわり。
メモ: archLinuxにLXD2.0をインストール(失敗)

## 参考

* [LXD - ArchWiki](https://wiki.archlinuxjp.org/index.php/LXD)

## インストール

```
yaourt lxd
```

> LXD allows everyone in the lxd group to talk to LXD.
> 
> LXD needs sub{u,g}ids for root, so that it can create unprivileged containers.
> Execute the following to set the sub{u,g}ids:
> 'echo "root:1000000:65536" | sudo tee -a /etc/subuid /etc/subgid'

とのことで以下実施

```bash:
echo "root:1000000:65536" | sudo tee -a /etc/subuid /etc/subgid
```

## lxdグループに追加

```
usermod -a -G lxd <user>
```

## lxdデーモン起動

```
systemctl start lxd
systemctl enable lxd
```

## コンテナ起動

```
lxc launch images:ubuntu/xenial/amd64 ubuntu
```

* lxcbr0が無いため起動できない。

```
lxc profile edit default
```

* docker0 を指定した。


```bash:激しいエラー
lxc 20160509135641.123 ERROR    lxc_cgfsng - cgfsng.c:recursive_destroy:999 - Error destroying /sys/fs/cgroup/net_cls//lxc/ubuntu-1
lxc 20160509135641.123 ERROR    lxc_namespace - namespace.c:lxc_clone:67 - failed to clone (0x10000000): Invalid argument
lxc 20160509135641.123 ERROR    lxc_cgfsng - cgfsng.c:recursive_destroy:999 - Error destroying /sys/fs/cgroup/blkio//lxc/ubuntu-1
lxc 20160509135641.123 ERROR    lxc_namespace - namespace.c:lxc_clone:67 - failed to clone (0x10000000): Invalid argument
lxc 20160509135641.123 ERROR    lxc_cgfsng - cgfsng.c:recursive_destroy:999 - Error destroying /sys/fs/cgroup/devices//lxc/ubuntu-1
lxc 20160509135641.123 ERROR    lxc_namespace - namespace.c:lxc_clone:67 - failed to clone (0x10000000): Invalid argument
lxc 20160509135641.123 ERROR    lxc_cgfsng - cgfsng.c:recursive_destroy:999 - Error destroying /sys/fs/cgroup/memory//lxc/ubuntu-1
...
```

> セキュリティ上の理由で、デフォルトの Arch カーネルでは非特権ユーザーでコンテナを実行できるようにはなっていません。しかしながら LXD はそうできることを必要とします。カーネルを自分でビルドして CONFIG_USER_NS を有効にするか、AUR の linux-user-ns-enabledAUR を使用してください。 

なるほど、`linux-user-ns-enabled`をインストールすれば良さそうですね

```bash:そういえばあったな
lxd の提案パッケージ
    lvm2: for lvm2 support [インストール済み]
    thin-provisioning-tools: for thin provisioning support [インストール済み]
    btrfs-progs: for btrfs support
    linux-user-ns-enabled: kernel with CONFIG_USER_NS enabled
```

```bash:インストール
yaourt linux-user-ns-enabled
```

（ビルド成功しなかったので諦める・・・）
Google Maps Android API

## マーカー追加

```java
  
private void addMarker(String title, String snippet, LatLng latlng) {
    mMap.addMarker(new MarkerOptions()
        .title(title)
        .snippet(snippet)
        .position(latlng));
}

```

## マップをタップした時のイベント

```java

mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
    @Override
    public void onMapClick(LatLng point) {
        addMarker("タイトル", "スニペット", point);
    }
});

```

##  マーカーがタップされた時のイベント

```java

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        Toast.makeText(getApplicationContext(), "マーカーがタップされたよ", Toast.LENGTH_LONG).show();
         return false;
    }
});

```

## マーカードラッグイベント

※ マーカー追加オプションでドラッグを有効にすること

```java

mMap.addMarker(new MarkerOptions()
    .title(title)
    ##.draggable(true) ## 
    .snippet(snippet)
    .position(latlng));
```

```java

mMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() {
    @Override
    public void onMarkerDrag(Marker marker) {
        Log.d("デバッグ","ドラッグ中");
    }

    @Override
    public void onMarkerDragEnd(Marker marker) {
        Log.d("デバッグ","ドラッグ終了");
    }
    @Override
    public void onMarkerDragStart(Marker marker) {
        Log.d("デバッグ","ドラッグ開始");
    }
});
```

## 情報ウインドウを表示
```java
private void addMarker(String title, String snippet, LatLng latlng) {
        Marker marker = mMap.addMarker(new MarkerOptions()
                .title(title)
                .draggable(true)
                .snippet(snippet)
                .position(latlng));

        marker.showInfoWindow();
}

```

## 地図を移動

```java

LatLng sydney = new LatLng(-33.867, 151.206);
int zoom = 15;
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, zoom));

```
NIFTY CloudのWebコンソールからサーバを操作する

VMインポートに失敗した時とか、iptablesの設定ミスっちゃったとかでsshできない時、LDAPの設定ミスって一般ユーザでログイン出来ないんだけどrootにssh許してない時とかに有効です。
以下の内容は[公式] (http://cloud.nifty.com/service/console.htm)に書いてあることと変わりません。
# OS
Windows必須
※ Mac、Linuxはブラウザのプラグインがないので使えない、つらい...

# ブラウザ
コンソール|クライアントOS|対応ブラウザ
---|---|---
64bit|64bit|Internet Explorer 10/11、Firefox 最新版、Chrome 最新版
32bit|64bit/32bit|Internet Explorer 10、Firefox 最新版

+ Win7で32bitでChromeが **使えない** ことは確認した
+ Win7で32bitでFireFoxが **使える** ことは確認した
+ ~~IEはなくなry~~

# 通信ポート
20,000以上のハイポート

# 注意点
+ 1サーバ１セッションで、後勝ちな感じっぽいので誰かのセッション奪ってしまうこともありそう

# コンソールエラー内容
http://cloud.nifty.com/guide/cp/login/console_error.htm
MySQLでrootのパスワードを忘れてしまった時の対処法


たまにやってしまうので備忘録として。
CentOS、MySQL5系を想定

### MySQLの停止
起動していたらMySQLを停止してください

```
sudo service mysqld stop
```

### MySQLをセーフモードで起動

```
sudo mysqld_safe --skip-grant-tables &
```

### MySQLへrootログイン

パスワードは不要でログインできます

```
mysql -u root
```

### rootパスワードのリセット

```
use mysql;
update user set password=PASSWORD("YOUR_NEW_ROOT_PASSWORD") where User='root';
flush privileges;
```

YOUR_NEW_ROOT_PASSWORDにお好みのパスワードを入力してください。

#### セーフモードで起動してたMySQLを停止し通常モードで起動

```
sudo service mysqld stop
sudo service mysqld start
```

これでOK.
【Android】Windows PCでエミュレーターを起動しようとしたら "Failed to create HAX VM" って怒られたときの対処法

Androidのエミュレータも最近バージョンアップが進んでだいぶ快適に動作するようになりましたね。
OS2.x時代の全く起動してくれなかった頃が懐かしい今日この頃です。

が、新しいWindows PCで意気揚々とエミュレータを実行したら起動時にエラーが出て全く起動できなかったことがあったので、その対処法をまとめました。

# 事象
Windows PCでAndroidのエミュレータを起動しようとしたら以下のエラーで怒られる。

> Open the vm device error:\\.\hax_vm00, ec:2
Hax is enabled
Hax ram_size 0x60000000
Failed to open vm 0
Failed to create HAX VM
No accelerator found.
failed to initialize HAX: Invalid argument

# 原因
Windowsの（IntelのCPUを搭載している）PCでは、HAXMという機構を使ってAndroidのエミュレータを起動しているのだが、どうやらWindowsの仕様によりHAXMを他のユーザーが起動していると現在のユーザーでは使用できない、みたいなのがあるらしい。
自分専用のPCで自分が管理者で使っている、という場合であれば問題ないのだが（個人PCはほとんどこのパターンだと思うけれど）、共有PCで他のユーザーがログインしている状態で自分のユーザーでログインし直したり、貸与されているPCで自分が管理者ではない（管理者ユーザーで起動されて、自分のユーザーとしてログインする）みたいなパターンではこれが起こり得る。

# 対処法
+ その１：自分がHAXMを起動できる場合
    + 他のユーザーが起動しているHAXMを一旦停止し、自分のユーザーで起動し直す
+ その２：自分がHAXMを実行できない場合（おそらく管理者権限でHAXMが実行されている場合）
    + 管理者としてコマンドプロンプトを起動し、そこからエミュレータを起動する

# intelhaxmの起動、停止方法
コマンドプロンプトを開いて以下を実行する
__停止__
`sc stop intelhaxm`

__起動__
`sc start intelhaxm`

※ 管理者として実行したい場合は、コマンドプロンプトを開くときに「右クリック」＞「管理者として実行」を選択する。

# コマンドプロンプトからのエミュレーターの起動方法
`$ANDROID_SDK_HOME\tools\emulator -avd  エミュレータの名前`

# 参考
+ __この事象の対処法__
    + https://code.google.com/p/android/issues/detail?id=201580
+ __scコマンドについて__
    + http://www.atmarkit.co.jp/ait/articles/1505/25/news028.html
+ __コマンドラインでのエミュレーターの実行について__
    + http://www.javadrive.jp/android/emulator/index3.html