OmniAICreator/Qiita-1.07M huggingface dataset:
gibo の名前を正規化するスクリプト

# 経緯

[.gitignore は自動生成してる](http://qiita.com/kitsuyui/items/185c2ca26d1ea4be5d75) にも書いたとおり gibo を使っている。

gibo では大文字・小文字のどちらでも参照することはできる。
でも自分自身で書く範疇では[大文字・小文字をきちんと区別して](http://qiita.com/kitsuyui/items/a007284ac7bf540984dd)表記したくなった。

手軽に gibo で定めている正式名称を得る方法が欲しい。

# スクリプト

そこで「標準入力で受け取った言語名・フレームワーク名を正しい表記にして返す」スクリプトをさっと書いてみた。
その名も **giboexact**

```bash:giboexact
#!/usr/bin/env bash
set -uo pipefail
set noclobber
umask 0777

export PATH='/bin:/usr/bin'
export LANG='C'

gibodir="$HOME/.gitignore-boilerplates"

while IFS='' read word
do
    ls -1 "$gibodir" "$gibodir"/Global \
    | sed -e 's/.gitignore$//' \
    | grep -i "^$word$"
done
```

egrep|grep, GNU|BSD のオプションの違いに苦戦するのが嫌だったので、すこし冗長だが sed を経由している。
また、 Bash を前提にしているが、 Bash 固有の文字列置換は使わないようにした。

# 使い方

標準入力に入力したものが標準出力で正規化されて出てくる。
以下の例では何もリダイレクトしていないので、 1 行ずつ交互に入力・出力を繰り返す。 (cat 等と同じような挙動 )

```sh-session
$ chmod +x giboexact
$ ./giboexact
python
Python
wordpress
WordPress
linux
Linux
$ # (注 ^D で終了している)
```

# 他

書式にこだわるなら、さらにこの結果を | sort -n | uniq とパイプしてアルファベット順・重複なしを保証しよう。
[アドオン]Webアプリケーション開発に役立つFirefoxアドオン

# Web開発に使うFirefoxアドオン

## [Live HTTP Headers](https://addons.mozilla.org/ja/firefox/addon/live-http-headers/)

シンプルにHTTPヘッダーを表示する。

## [Firebug](https://addons.mozilla.org/ja/firefox/addon/firebug/)

定番のアドオン。見ているページのCSSやHTMLを書き換えたり、JavaScriptをトレースしたり…デザインからプログラミングまでサポートしてくれる。

## [ReloadEvery](https://addons.mozilla.org/JA/firefox/addon/reloadevery/?src=userprofile)

ブラウザを一定時間おきにリロードする。

## [Web Developer](https://addons.mozilla.org/ja/firefox/addon/web-developer/)

いろんな開発機能を追加。HTML/CSSの検証などに使っていました。他にも、JavaScriptの無効化、Cookieの無効化、CSSの編集などができるようです。機能が多く、使いこなせたらすごいかもしれない。


他にも使える物が見つかったら追記します！コメント歓迎です。
gzip圧縮されたローカルファイル読み込み

こんにちは。
html/jsでのローカルファイル読み込みについて、gzip コマンドで圧縮されたutf-8テキストファイル（*.gz）にも対応させたかったので、ファイルを受け取る関数を少し拡張してみました（下記の ```readFile()```）。

```readFile.html
<script src="https://cdnjs.cloudflare.com/ajax/libs/pako/1.0.11/pako.min.js"></script>
<script src='./getSuffix.js'></script>
<script>
function readFile(aFile) {
    var gzipped = getSuffix(aFile.name, 'gz')['compression'];
    var reader = new FileReader();
    reader.onload = function(e){
        var result = reader.result;
        if (gzipped) {result = pako.inflate(result, {to: 'string'});}
        handleTextContent(result); // result を処理する関数
    };
    if (gzipped) {reader.readAsArrayBuffer(aFile);}
    else {reader.readAsText(aFile, 'utf-8');}
}
</script>
```

```getSuffix.js
// extract suffixes from a file name
// e.g., getSuffix('example.json.gz', ['gz', 'bz2']) => {'extension': 'json', 'compression': 'gz'}
function getSuffix(filename, extCompression) {
    var suf = [], fnameSplit = filename.split(".");
    if (fnameSplit.length >= 2) {
        suf.unshift(fnameSplit.pop());
        if (_includes(extCompression, suf[0])) {
           suf.unshift(fnameSplit.pop());
        }
    }
    return {'extension': suf[0], 'compression': suf[1]};
}

function _includes(array, elem) {
    if (!(array instanceof Array)) {array = [array];}
    return array.indexOf(elem) >= 0;
}
```
初めてのPythonでMongoDB

※この記事は[ブログ](http://furicotech.blogspot.jp/2015/05/introduction-to-mongodb-with-python.html)と同内容です。

# はじめに

先日、 [(第54回)Python mini Hack-a-thon](http://pyhack.connpass.com/event/14106/) に参加した時、PythonでMongoDBを使ってみることを試したので、簡単にまとめておこうと思います。

といっても使ってみること自体は特に難しいところもなかったため、参考にしたドキュメントのリンクのみ貼っておきます。

# 参考にしたドキュメント

* [MongoDBの薄い本(The Little MongoDB Book)](http://www.cuspy.org/diary/2012-04-17)
* [Getting Started with MongoDB (Python Edition)](http://docs.mongodb.org/getting-started/python/)

前者はMongoDBの入門書です。和訳感謝。

40ページくらいの本当に薄い本で、

* MongoDBって何？
* どんな特徴があるの？
* どうやって使うの？

ということを手っ取り早く掴むことができました。

後者は公式のドキュメントです。

PythonでMongoDBを操作する方法が簡潔にまとまっており、基本的なことを短時間で理解することができました。

# 使ってみた感想

『MongoDBの薄い本』には次のように書かれています。

> スキーマレスの本当の利点はセットアップの省略とオブジェクト指向プログラミングとの摩擦の低減です。
> （原文）the real benefit of dynamic schema is the lack of setup and the reduced friction with OOP.

まさにこれを実感しました。

PostgreSQLなどのRDBMSをPythonで操作する場合、普通はドライバの他にSQLAlchemyなどのORマッパーを使うと思います。

さらにスキーマ管理などを行おうと思ったら、Alembicなどのマイグレーションツールも必要になります。

これらのパッケージの使い方の学習なども考えると、導入までの道のりが結構たいへん。。。

ところが、MongoDBの場合はとりあえずドライバだけ入れればOKです。

DDLによるスキーマの設定も不要で、ORマッパーなどがなくても、オブジェクトを操作する感覚でDBも操作することができます。

とりあえず使えるようになるまでのステップは、RDBMSの場合と較べてかなり短くて済むと感じました。

今後、色々試してもっと理解を深めていきたいです。
SSHログインできない時（Permission denied (publickey,gssapi-keyex,gssapi-with-mic)）のとある解決策

# SSHでエラー
```
ssh -vvv login_user@host
...
debug1: No more authentication methods to try.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```
上記は原因が多く考えられるエラーであり、直すのが大変。
中でも見落とされやすいのが、`~/.ssh/authorized_keys`の**所有者がroot**だったりした場合。
`authorized_keys`の所有者はログインするユーザでなければならないため、

```
chown login_user ~/.ssh/authorized_keys
```
とする必要がある。

## 参考（SSH接続の基本的な設定などもこちらで）
http://pc-diary.com/blog/2010/11/ssh.html
Laravel5でmigrate実行時に「Application In Production!」とconfirmが出るのをなくす

Laravel5にてproduction環境にて以下を実行するとconfirmが出る

```
$ php artisan migrate
**************************************
*     Application In Production!     *
**************************************

Do you really wish to run this command? [y/N]
```

デプロイツールなどで実行するときに邪魔なのでなくす。
なくすにはforceオプションを使用すればよい。

```
$ php artisan migrate --force
```

#詳細

```php:vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php
class MigrateCommand extends BaseCommand {

	use ConfirmableTrait;

```

```php:vendor/laravel/framework/src/Illuminate/Console/ConfirmableTrait.php
trait ConfirmableTrait {
	//...
	public function confirmToProceed($warning = 'Application In Production!', Closure $callback = null)
	{
		$shouldConfirm = $callback ?: $this->getDefaultConfirmCallback();

		if (call_user_func($shouldConfirm))
		{
			if ($this->option('force')) return true;
			//...
		}
	//...
	}
	//...
	protected function getDefaultConfirmCallback()
	{
		return function() { return $this->getLaravel()->environment() == 'production'; };
	}
```

のように

* productionのときだけconfirmが実行される
* forceオプションが付いてたらスルーする

と実装されている。
SublimeTextに日本語インラインを対応させる！

<h1>SublimeTextに日本語インラインを対応させる！</h1>
<p>　sublimeTextでは、デフォルトで日本語インラインに対応していないため、入力中日本語が小窓で表示されてしまう。（OSXでは標準で出来ました。バージョンによるのかな？）</p>
<p>　これをインラインさせるには、以下の手順が必須です。</p>
<ol>
  <li>Package Controlをひらく</li>
    <ul>
      <li>Windows: Controll + Shist + P</li>
      <li>OSX: Command + Shift + P</li>
      <li>Package Controlをインストールしていない場合<br>
          <a href="http://keidrun.tumblr.com/post/73033053898/tips-sublime-text-sublime-text">こちらを参考にインストールしてください。<a/>
      </li>
    </ul>
  <li>2．Package Control: Install Packageを選択しIMESupportをインストール</li>
</ol>
目的のRealmDBの中身をRealmBrowserで一瞬で開く方法

Realm関連の小ネタです。
iOSシミュレータでアプリを開発している時にRealmDBの中身を一瞬で確認できます。

## 手元の環境

Xcode 6.3.1 で動作確認しました。それ以外の環境での動作確認は行っていません。

## 準備1: Realm Browser のインストール

**2015/07/27 更新**

Realm Browser が [Mac App Store](https://itunes.apple.com/app/realm-browser/id1007457278) からDL可能になりました！！！

~~やること：Realm Browser をパスが通ったところに配置する~~

~~1. http://realm.io/ から Objective-C あるいは Swift 用のzipファイルをダウンロードする~~
~~2. zipを解凍して、browser ディレクトリの中にある "Realm Browser" をパスが通ったところに配置する（例えば、/Applications)~~
~~4. Finder から "Realm Browser" を選択し、コンテキストメニューを表示させてから「開く」を選択~~
~~（第三者からのアプリケーションを実行するには、手動での検証が必要なため）~~

## 準備2: open-realm.sh のインストール（省略可）

やること：今回作ったスクリプト [open-realm.sh](https://gist.github.com/gologo13/b9971f2a47150733a937) をインストールする

こちらも同様にパスが通ったところにおいてください。

｢スクリプトなんかインストールしたくない！｣という方はワンライナーの方法も紹介するので、この準備はスキップしていただいて大丈夫です。

## コマンド

準備が終われば、以下のコマンドを実行してください。
実行すると Realm Browser が開くはずです！

```shell 
$ open-realm.sh
```

ワンライナー

```shell
$ open $(find ~/Library/Developer/CoreSimulator/Devices/$(ls -t1 ~/Library/Developer/CoreSimulator/Devices/ | head -1)/data/Containers/Data/Application/ -name \*.realm)
```

**開かなかったら教えて下さい!!!**

### 追記

shellの設定ファイルにaliasを書くやり方もあるったので、追記します。


```shell 
# RealmBrowser
if [ `uname` = "Darwin" ]; then
    alias open-realm="open $(find ~/Library/Developer/CoreSimulator/Devices/$(ls -t1 ~/Library/Developer/CoreSimulator/Devices/ | head -1)/data/Containers/Data/Application/ -name \*.realm)"
fi
```
DreamweaverにSCSSファイルを対応させる！

<h1>DreamweaverにSCSSファイルを対応させる！</h1>
<p>　Dreamweaverの補完機能を使って、SCSS,SASSを書きたい。DreamweaverはCS6以下SCSSファイルの入力には対応していない。しかしもしこれが実現できれば、複数人でもらくらく同時進行、ファイルの管理も容易になるし、補完機能で入力がずっと楽になる。そこで<strong>Dreamweaverの設定ファイルを編集</strong>してSCSSファイルに対応させようと思う。</p>
<h3>まず改めて、あくまで自己責任というのは言うまでもない。<br>
設定ファイルをいじるのだから当然だろう。バックアップは必須。</h3>

<h2>Windowsでの手順</h2>
<ol>
  <li>Dreamweaverを開き、編集タブから環境設定を開く</li><br>
  <li>環境設定内、「ファイルタイプ／エディター」からコードビューに開くにSCSSファイルを追加する</li><br>

  <li>Extensions.txtを開く<br>C:/Users（ユーザー名）/AppData/Roaming/Adobe/Dreamweaver （バージョン）/ja_JP/Configuration/Extensions.txt</li><br>
  <li>Extensions.txtを編集する<br>
     以下二箇所にSCSSを加える！<br>
     HTM,HTML,...CS,CSS,SCSS,...,SVG:<strong>All Documents<br></strong>
     CSS,SCSS:<strong>Style Sheets</strong>
  </li><br>
  <li>MMDocumentTypes.xmlを開く</li>
     C:/Users（ユーザー名）/AppData/Roaming/Adobe/Dreamweaver （バージョン）/ja_JP/Configuration/DocumentTypes/MMDocumentTypes.xml<br><br>

  <li>MMDocumentTypes.xmlを編集する</li><br>
    SCSSを追加しましょう。<br>
    documenttype id="CSS" internaltype="Text" winfileextension="css,<strong>scss</strong>" macfileextension="css,<strong>scss</strong>" file="Default.css" writebyteordermark="false" mimetype="text/css" 
</ol>
<h2>OSXでの手順</h2>
<ol>
  <li>Dreamweaverを開き、Dreamweaberタブから環境設定を開く</li><br>
  <li>環境設定内、「ファイルタイプ／エディター」からコードビューに開くにSCSSファイルを追加する</li><br>
  <li>Extensions.txtを開く<br>/Applications/Adobe Dreamweaver （バージョン）/Configuration</li><br>
  <li>Extensions.txtを編集する<br>
     以下二箇所にSCSSを加える！<br>
     HTM,HTML,...CS,CSS,SCSS,...,SVG:<strong>All Documents<br></strong>
     CSS,SCSS:<strong>Style Sheets</strong>
  </li><br>
  <li>MMDocumentTypes.xmlを開く</li>
     /Applications/Adobe Dreamweaver （バージョン）/Configuration/DocumentTypes/
<br><br>

  <li>MMDocumentTypes.xmlを編集する</li><br>
    SCSSを追加しましょう。<br>
    documenttype id="CSS" internaltype="Text" winfileextension="css,<strong>scss</strong>" macfileextension="css,<strong>scss</strong>" file="Default.css" writebyteordermark="false" mimetype="text/css" 
</ol>

<h2>⚠補足⚠</h2>
<h3>上記ファイルを編集しても変わりが無ければ、ファイルの検索からローカルの同じ名前のファイル（MMDocumentTypes.xml , Extensions）を探し、対象のファイル全てに編集を加えましょう。私はこれではまりました。</h3>
Qiitaの記事を参照したらNodejsを上手くインストールできた話

ubuntu14.04LTSにnodejsをインストールが上手く出来た。

詳しくは下の方のエントリを見ていただければOK
http://qiita.com/moris/items/281a588b9773357b27f7

Nodeビギナーズブック
http://www.nodebeginner.org/index-jp.html
を読んで、独学と行きますか！ :smile:
yeomanでError: Cannot find module '../package.json'が表示される問題の対策


[Yeoman入門(第二部、generatorを作る)](http://yosuke-furukawa.hatenablog.com/entry/2013/07/14/131903)を参考にgeneratorを作成していたら、``` yo helloworld ```した際に下記のエラーが発生したので、その原因と対策についてメモ。


```
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: Cannot find module '../package.json'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at module.exports.yeoman.generators.Base.extend.initializing (/Users/ryo/Programming/web/generator-helloworld/generators/app/index.js:8:16)
    at /Users/ryo/Programming/web/generator-helloworld/node_modules/yeoman-generator/lib/base.js:421:16
    at processImmediate [as _immediateCallback] (timers.js:336:15)
```

# 原因?と対策
generator-generatorのバグっぽい。
このバグを修正したパッチ([path fix for package.json file #112](https://github.com/yeoman/generator-generator/pull/112))がマージされているので、もうしばらく待てば治ると思うけど、一応対策メモ。

generators/app/index.jsの``` require('../package.json') ```を``` require('../../package.json') ```に直すだけ。

```generators/app/index.js
...
module.exports = yeoman.generators.Base.extend({
  initializing: function () {
    // this.pkg = require('../package.json'); <- このパスがおかしい
    this.pkg = require('../../package.json');
  },
…
```
Laravelのルーティング

それぞれのアプリケーション同士をつなげるためのルーティングをしていきます。

Laravelでのルーティングは アプリ名>appフォルダ以下にあるroutes.phpで主に行っていきます。

routes.phpを開いてみると、
`<?php
/*コメント*/
Route::get('/', function()
{
	return View::make('hello');
});`
てな感じです。

これはget()でルート('/')のアドレスが呼ばれたときにapp>viewsフォルダ内のhello.phpをよびだします。

例えば、app>views以下にtest.phpを作り、
`<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Hello World</title>
    </head>
    <body>
        <h1>Hello World</h1>
    </body>
</html>`

とHello Worldを表示させます。

そしてroutes.phpは
`Route::get('/', function()
{
	return View::make('test');
});`
となります。.phpはいりません。
保存してプレビュー表示してみると

![Screenshot (72).png](https://qiita-image-store.s3.amazonaws.com/0/52622/09a4559c-4f6c-158f-ded3-ee31e108a2f5.png)

こうなります。

getのアドレス名(ルートのときは/)は任意で決めることができ、
アドレスshowでhello.phpを開きたいときは
routes.php
`<?php
Route::get('show', function()
{
	return View::make('hello');
});`

呼ぶ側でたとえば
`<a href = "show" >こんにちは</a>`

このリンクがクリックされたとき、routes.phpを介してhello.phpが呼ばれます。
Go : defer の実行サンプル

Q）defer is 何？
A）returnする直前に特定の処理を実行することができるもの
ちょっと違うけどfinallyに似たものっぽい

http://play.golang.org/p/o0JpMi0UMZ

```go:hoge.go
package main

import "fmt"

func hoge(i int) string {
	defer fuga()
	if i%2 == 0 {
		return "偶数"
	}
	return "奇数"
}

func fuga() {
	fmt.Println("--- hoge end ---")
	return
}

func main() {
	for i := 1; i <= 5; i++ {
		fmt.Printf("%d is %s\n", i, hoge(i))
	}
}
```

実行結果
```
--- hoge end ---
1 is 奇数
--- hoge end ---
2 is 偶数
--- hoge end ---
3 is 奇数
--- hoge end ---
4 is 偶数
--- hoge end ---
5 is 奇数
```

エラー処理や並列処理、early return関数に有効そう
ただし、finallyとは処理順序が違うので注意
smallbasicでリカーシブル

局所変数が無いので、Stakを利用するようです。
#階乗
```
n = 6
Stack.PushValue("s", n)
Stack.PushValue("s", n) 
fact()
ret = Stack.PopValue("s")
n = Stack.PopValue("s")
TextWindow.WriteLine(n + "! = " + ret)
  
Sub fact
  n = Stack.PopValue("s")
  If (n < 0) Then
    TextWindow.WriteLine("ng")
    Stack.PushValue("s", 0)
  ElseIf (n = 0) Then
    Stack.PushValue("s", 1)
  Else
    Stack.PushValue("s", n)
    Stack.PushValue("s", n - 1)
    fact()
    s = Stack.PopValue("s") * Stack.PopValue("s")
    Stack.PushValue("s", s)
  EndIf
EndSub
```
#コフ曲線
```
Turtle.Speed = 9
Turtle.X = 100
Turtle.y = 300
Turtle.Show()
Turtle.TurnRight()
Turtle.PenDown()
n = 4
go()
Turtle.Hide()

Sub go  
  If n < 1 Then
    Turtle.Move(5)
  Else
    Stack.PushValue("s", n)  
    n = n - 1
    go()
    Turtle.Turn(-60)
    go()
    Turtle.Turn(120)
    go()
    Turtle.Turn(-60)
    go()
    n = Stack.PopValue("s")
  EndIf
EndSub
```
#ファイル一覧
```
rootDir = "D:\"
Stack.PushValue("dirs", rootDir)
While (Stack.GetCount("dirs") > 0)
  dirName = Stack.PopValue("dirs")
  files = File.GetFiles(dirName)
  For i = 1 To Array.GetItemCount(files)
    TextWindow.WriteLine(files[i])
  EndFor
  subDir = File.GetDirectories(dirName)
  For i = 1 To Array.GetItemCount(subDir)
    Stack.PushValue("dirs", subDir[i])
  EndFor
EndWhile
```
実行可能Jarだけど、依存するJarを内包しない形式にしてみました

依存する外部Jarを内包せずにJarを作成することができました。依存する外部Jarはlibs/下に収めます。

## build.gradle

```groovy:マニフェストにClass-Pathを追加する
jar {
  manifest.attributes(
    // 依存する外部Jarはlibs/下にあるものとしてClass－Pathを設定します
   'Class-Path': configurations.runtime.files.collect { 'libs/' + it.name }.join(' ')
  )
}
```

```groovy:依存する外部Jarをlibs/下にコピーします
task copyDependencies << {
 new File('libs').mkdirs()
 copy {
  from configurations.runtime
  into 'libs'
 }
}
```

## 参考

* [Gradle, Java plugin, Jar MANIFEST, Class-Path is empty](https://gist.github.com/simon04/6865179#file-gistfile1-md)
* [Gradleで依存関係のあるjarを特定のディレクトリにコピー](http://rainyanddummdays.blogspot.jp/2013/02/gradlejar.html)
Ansible Vault を賢く使う

Ansible でパスワードやAPIキーなどの機密情報を扱う場合には [ansible-vault](http://docs.ansible.com/playbooks_vault.html) を使うことで暗号化されたファイルとして変数を保存できます。

簡単な使い方は以前書きました
[Ansible Vault を試す](http://qiita.com/yteraoka/items/d18e3c353b6e15ca84a8)

しかしながら、ansible-vault はファイル単位での暗号化であるため、暗号化の不要な項目までまるっと暗号化され、どんな変数が定義されているのかすらわからなくなってしまうという問題がありました。
これは結構不便です。

そんなことをずっと思っていたのですが、ふとドキュメントを読んでいたらこの問題の解決策が書いてありました。

[Splitting Out Host and Group Specific Data](http://docs.ansible.com/intro_inventory.html#splitting-out-host-and-group-specific-data)

なんと、バージョン 1.4 という ansible-vault 登場(1.5)以前からある機能でした！！

が、

> As an advanced use-case, you can create directories named after your groups or hosts, and Ansible will read all the files in these directories. An example with the ‘raleigh’ group:

からはじまる Ansible Vault を使う場合はサブディレクトリを入れると良いよという説明が加えられたのは 1.8 の時でした。

どういう機能かというと、たとえば `appservers` というグループに属するホストで DB のパスワードを扱いたい場合、`group_vars/appservers` というファイルにパスワード以外の秘密にしなくても良い変数があったとしても vault で暗号化してしまうと上で書いたような使い辛さがあります。

~~でも実は `group_vars/appservers/public.yml`, `group_vars/appservers/db_password.valut` という具合にグループ名をディレクトリとし、その配下に任意の名前でファイルを置いておけば全部読み込んでくれるのです。~~

こういうことであれば、暗号化するファイルは変数名をファイル名にするというルールにすることでどこでどんな変数が定義されているかが復号のためのパスワードを知らない人でもわかります。

~~また、テキストファイルであれば `.yml` サフィックスをつけておけば editor へのヒントになるし、vault で暗号化しているなら `.vault` というサフィックスにすることで名前を見ただけで暗号化されていることが分かりますね。~~

* * *

**2017-09-28 追記**

Ansible 2.2.1 から変数ファイルは `.yml`, `.yaml`, `.json` という拡張子のファイルもしくは拡張子のない（ドットを含まない）ファイルしか読み込まないようになっていました。（https://github.com/ansible/ansible/issues/18223 あたりから辿れる）

[Best Practices の Variables and Vaults 項](http://docs.ansible.com/ansible/latest/playbooks_best_practices.html#variables-and-vaults) では

`group_vars/{group_name}/vars`, `group_vars/{group_name}/vault` というファイルを作り、`vars` ファイルに

```
password: "{{ vault_password }}"
some_secret: "{{ some_secret }}"
```

`vault` ファイルに

```
vault_password: "XXXXXXX"
some_secret: "YYYYYYYY"
```

と書いて暗号化するべしと書いてあります。

* * *

もうひとつおまけ

Ansible Vault を使った playbook ではそのルートフォルダに `ansible.cfg` を置いて

```yaml:ansible.cfg
[defaults]
ask_vault_pass = True
```

と書いておけば `--ask-vault-pass` オプションをつけ忘れて

```
ERROR: A vault password must be specified to decrypt ...
```

と怒られることが無くなります。

```yaml:ansible.cfg
[defaults]
vault_password_file=/some/where/password.txt
```

とすることもできます。グローバルな設定に書いちゃうとパスワードが違うかもしれないので注意。
Gaurun〜A general push notification server in Go〜

# Gaurun〜A general push notification server in Go〜

https://github.com/mercari/gaurun

[Go Conference 2015 Summer](http://gocon.connpass.com/event/14063/)でトークが採択されたこともあるので、自分が所属している会社で開発しているプッシュ通知サーバである[Gaurun](https://github.com/mercari/gaurun)をOSSで公開しました。詳しくは2015年6月21日開催の[Go Conference 2015 Summer](http://gocon.connpass.com/event/14063/)で・・・というのもアレなので軽く[Gaurun](https://github.com/mercari/gaurun)について紹介します。

# メルカリのプッシュ通知システムの構成と変遷

昨年9月にメルカリに入社した当時、メルカリのアプリ内で発生したイベントのプッシュ通知処理はすべてPHPで書かれたAPIサーバ上で**同期処理（！）**として実装されていました。例えばAPIサーバにコメント書き込みのリクエストが来たらコメントのデータをDBに書き込んだ後プッシュ通知を行ってクライアントにレスポンスを返す、という具合にです。

当然のことながらスマートフォンアプリでよく利用されるAPNSやGCM(あるいはAmazon SNS)によるプッシュ通知は外部サーバとの通信を伴うため非常に時間がかかります(数百msecから数sec)。実際、当時Treasuredataでアクセスログに記録されているレスポンスタイムを降順に集計するとプッシュ通知のイベントが発生する可能性のあるAPIが上位を占めていました。

## php-Parallel-PreforkとQ4Mによる非同期プッシュ通知

そこで私が入社して最初にやった仕事が[php-Parallel-Prefork](https://github.com/travail/php-parallel-prefork)と[Q4M](http://q4m.github.io/)を利用してこの部分を非同期で行うようにしたことでした。幸い既にそのためのフレームワークが整備されていたので、これは比較的簡単に実施でき、またAPIサーバのパフォーマンス向上に対して大きな効果がありました。

## これから数百万件のプッシュ通知送りたいんだけど・・・

アプリ内で発生したイベントのプッシュ通知の数自体は全体のリクエスト数と比べるとあまり多くありません。一方でキャンペーンやユーザへのお知らせ等で瞬間的に大量のプッシュ通知を実行するというタスクが時々発生します。それこそいきなり「これから数百万件のプッシュ通知送るけどいい？」とか。

この問題に対して当初はphp-Parallel-Preforkを起動したサーバをたくさん並べて対処していましたが、これはあまりパフォーマンスが良くなくてスケールしませんでした。

## nginx + Go(net/http)による汎用プッシュ通知システム

大量プッシュ通知処理をスケールさせるにはプログラムに高い並行性が要求されるのでそもそもPHPには不向きなタスクです。そこでGCMとAPNSへのプッシュ通知処理を独自のAPIでラップしてプロキシするHTTPサーバをGoで書き、前段にnginxを配置してロードバランシングする構成にしました。このHTTPサーバが後のGaurunです。

![push.png](https://qiita-image-store.s3.amazonaws.com/0/1608/88db9cf2-dffb-e3ff-e0db-a3eadc65e48e.png)

結果的にこの構成にすることで大量のプッシュ通知処理を簡単にスケールすることができるようになりました。また、APNSやGCMとのキープアライブやそれぞれのプロトコルの違いについてもクライアント側では特に意識する必要もなくなり、プログラムロジックが簡略化されるといった副次効果もありました。

# Gaurun事始め

続いてGaurun自体の簡単な紹介です。

## Gaurunのダウンロードとビルド

今のところGaurunのビルド済みバイナリは配布していないので実行するには別途Goの環境を用意してコンパイルする必要があります。

```bash
$ git clone https://github.com/mercari/gaurun.git
$ cd gaurun
$ make gom
$ make bundle
$ make
```

## Gaurunの起動と設定ファイル

Gaurunを起動するにはTOMLによる設定ファイルが必要です。

```bash
$ bin/gaurun -c conf/gaurun.toml
```

設定ファイルの詳細は[CONFIGURATION.md](https://github.com/mercari/gaurun/blob/master/CONFIGURATION.md)にまとまっています。

## HTTP API

Gaurunには以下の4つのAPIがあります。詳細は[SPEC.md](https://github.com/mercari/gaurun/blob/master/SPEC.md)にまとまっています。

|API名          |解説|
|---------------|------|
|POST /push     |プッシュ通知リクエストを受付|
|GET /stat/go   |Goランタイムのモニタリング用データ取得|
|GET /stat/app  |Gaurunのモニタリング用データ取得|
|GET /config/app|Gaurunの設定データ取得|

## クライアントのサンプルプログラム

Gaurunサーバにプッシュ通知のリクエストを送るための[クライアントプログラムのサンプル](https://github.com/mercari/gaurun/blob/master/samples/client.go)があります。

# さいごに

今回は非常に簡単な紹介に留めましたが、[Go Conference 2015 Summer](http://gocon.connpass.com/event/14063/)ではもう少し詳しく突っ込んだ話をしようかと思います。
CircleCIにssh接続する方法



[Player! - 新しいニュースメディア、新しいスポーツライフ(プレイヤー)](http://bit.ly/player-ookami)ではiOS側のCIをCircleCIへ移行しようとしています。

CircleCIでログやらプロセスなど詳細を確認したい場合はssh接続して確認することが出来ます。ここではその方法を紹介します。

1. ビルド画面の右上辺りの`with ssh`ボタンをクリック
  ![20141105150415.png](https://qiita-image-store.s3.amazonaws.com/0/68131/57bc9a7a-d66a-cb00-eeea-3395ac9e35f0.png "20141105150415.png")

2. SSH Infoという項目でアクセス情報を確認
  ![20141105150434.png](https://qiita-image-store.s3.amazonaws.com/0/68131/5646b7df-9d22-4c1a-796f-095e00dce15b.png "20141105150434.png")

3. 2の情報を利用してssh接続する
  注意事項として、ssh keyはGitHubで利用しているものを使うこと。
ssh keyを指定してアクセスする場合はこんな感じになります。
```ssh -i ~/.ssh/github -p 64682 ubuntu@54.81.219.109
```

30分はboxが起動したままになっているので、調査が終わったらキャンセルしましょう。（キャンセルを押さないと30分間起動しっぱなしになってQueueが処理されません）

※写真はCircleCIさんのドキュメントのものが最高に分かりやすかったので、拝借しました。

## 元記事

http://nafuruby.hatenablog.com/entry/2014/11/05/150019

## 参考リンク

https://circleci.com/docs/ssh-build
Cloud9でLaravel4.2を使ってみる

授業で習ったことの覚え書です。
Cloud9上でLaravelを動かしてみたいと思います。
まず、Cloud9で新規プロジェクトを作成し、ターミナルでLaravelプロジェクト作成コマンド
`composer create-project laravel/laravel アプリ名 --prefer-dist 4.2`
を実行します。
すると、Laravelプロジェクトがインストールされます。

Cloud9の"Run"ボタンでサーバーを起動し、Preview > Preview Running Applicationでプレビューをみることができます。 

実行してみると、
![Screenshot (70).png](https://qiita-image-store.s3.amazonaws.com/0/52622/9e8a0f7c-70d8-4a0c-db22-a406e5e36e74.png)

と表示されます。
SwiftでCoreAPIを使う[認証編]

追記:[SwiftyDropbox](https://github.com/dropbox/SwiftyDropbox)もあります。beta版ですが、こちらの方がサンプルが多く使いやすいです。

# 1.DropboxSDKのimport
[SwiftでObjective-CのFrameworkを読み込む方法](http://qiita.com/skatata/items/1facd024d239b9545031)
この記事を参考にさせてもらいました。m(__)m

# 2.認証

ボタンを押したらDropboxを接続させます。

```lang:AppDelegate.swift
let dbAcount = DBSession(appKey: "YOUR_APP_KEY", appSecret: "YOUR_APP_SECRET", root:"ROOT" )
        DBSession.setSharedSession(dbAcount)
```

`ROOT`は`kDBRootDropbox`か`kDBRootAppFolder`のどちらかです。

```lang:ViewContoroller.swift
@IBAction func MyButton(sender: UIButton) {
	if !DBSession.sharedSession().isLinked(){
            DBSession.sharedSession().linkFromController(self)
    }
}

```

こんな感じに出来上がりました！
[![Gyazo](http://i.gyazo.com/0b29d982f60230144f8db1c859da5eec.gif)](http://gyazo.com/0b29d982f60230144f8db1c859da5eec)
GulpでBrowserSyncと動的ページ(PHPなど)の連携


前に、BrowserSyncについて書きました。

[GulpによるLiveReload入門(Windows版)](http://qiita.com/8845musign/items/39e6264949aaf266ae98)

紹介した方法ではPHPのようなサーバサイドスクリプトで動作する
動的ページをLivereloadすることはできません。

BroserSyncにはPHPやRubyなどを実行させる機能がないためです。

ですが、BrowserSyncをProxyサーバとして動作させ、XAMPPやVagrantといった
実行環境と連携させることでLiveReloadが可能となります。

## 前提条件

* Vagrant上ででPHPで書かれたWebアプリケーションを動作させている
* アプリケーションは http://192.168.33.10 でアクセス可能 
* Vagrant上のファイルとローカルPCの間で以下のディレクトリが同期(共有)されている
    * /vagrant/html
    * /Users/8845musign/Documents/vagrant/html  
    下のディレクトリを更新するとVagrantで動作しているWebアプリケーションに即時に反映(リロードではないですよ！)される 

XAPMMで``http://localhost``などのURLでアプリケーションが動作している状態でも可だと思います。（検証していませんが） 

※VagrantはWinやMac上でVirtualBoxを使い、簡単にLinuxなど動かせるツールです。詳しくはググってください。


## gulpfile.js 

ファイルは/Users/8845musign/Documents/vagrantに配置するとします。

```js
var gulp          = require("gulp");
var browserSync   = require('browser-sync').create();
var reload        = browserSync.reload;

//監視するファイルのパス
var source        = "html/**/*"

gulp.task('browser-sync', function() {
  browserSync.init({
  	//Webアプリケーションが動作しているアドレス(例ではIPアドレス)
    proxy: "192.168.33.10"
  });
});

gulp.task("watch", function () {
    gulp.watch(source, reload);
});

gulp.task("default", ["browser-sync", "watch"]);
```

変数souceの書き方は雑です。全ファイル監視する必要はないので、あくまで参考です。

このgulpfile.jsをローカルPCで実行します。

## BrowserSyncが何をやっているのか

私もあまりProxyについてよく理解していないのですが、

実際の動作はイメージするに、

1. ブラウザがBrowserSyncにアクセス
2. BrowserSyncが設定されたURLへアクセス（XAMPPもしくはVagrantなどのサーバ）へアクセス
3. サーバが出力して受けとったHTMLにLiveReloadを実行するためのスクリプトを差し込んでブラウザに送る

のような動作をしているのかと…
たぶん、サーバとブラウザの間に透過的に処理を挟んでいるのでしょう。

### 実験

上のgulpfile、proxyの値のみ変更しました。htmlディレクトリ以下のファイルを更新すると、BrowserSyncによって開かれたYahoo!のページがリロードされます。

```js
var gulp          = require("gulp");
var browserSync   = require('browser-sync').create();
var reload        = browserSync.reload;

var source        = "html/**/*"

gulp.task('browser-sync', function() {
  browserSync.init({
  	//変更
    proxy: "www.yahoo.co.jp/"
  });
});

gulp.task("watch", function () {
    gulp.watch(source, reload);
});

gulp.task("default", ["browser-sync", "watch"]);
```

特に意味はありませんが、自分はなるほど！となりました。

## つまり

URLでアクセスできるものならなんでもLiveReloadの対象にできるので、
JavaやC#で動いているWebアプリケーションなんかにも当然使えそうです。

以上です。ではでは！
VPCプライベートネットワークからS3へ接続する

従来はVPC内のインスタンスからS3に接続するためには、インスタンスがパブリックネットワーク内にある必要がありました。しかし、VPCエンドポイントという特別な裏口ができたので、プライベートネットワーク内のインスタンスもこの裏口からS3に接続することが可能になりました。

# VPC内のプライベートネットワークからS3への接続方法

## 1 VPCエンドポイントを作成する

1-1: VPCコンソール > エンドポイント作成

![endpoint1](https://s3-ap-northeast-1.amazonaws.com/qiita-3-shake.com/vpc_endpoint1.png)

1-2: VPCを選択

＊VPC-ID : VPCエンドポイント = 1:1になります

1-3: バケットポリシーを設定

今回はFull Accessの設定としました。特定のバケットへの通信のみ許可する場合は、こちらでポリシーを追加すると良いと思います。

![endpoint2](https://s3-ap-northeast-1.amazonaws.com/qiita-3-shake.com/vpc_endpoint2.png)

1-4: ひもづけるルーティングテーブルを選択

＊インターネットゲートウェイに紐付いていない、ローカルNWのみ通信可能なルーティングテーブルを選択してください

![endpoint3](https://s3-ap-northeast-1.amazonaws.com/qiita-3-shake.com/vpc_endpoint3.png)

そうすると、ルーティングテーブルが次のようにupdateされます

![endpoint4](https://s3-ap-northeast-1.amazonaws.com/qiita-3-shake.com/vpc_endpoint4.png)

以上で設定は終わりです！

### 注意点
【設定時の話】
VPCエンドポイントを設定時、既存インスタンスからS3への接続が途切れるそうです（未検証）。設定時はタイミングを見計らうといいと思われます

【バケットポリシーの話】
従来、S3接続のIP制限はバケットポリシーにCIDRを記載していました。

ドキュメントには

>When using Amazon S3 endpoints, you cannot use a bucket policy or an IAM policy to allow access from a VPC CIDR range (the private IP address range). VPC CIDR blocks can be overlapping or identical, which may lead to unexpected results

とあり、Source-IPがプライベートIPになったからって、IP制限を直接バケットポリシーに書かないでね、とかいてあります。特定インスタンスからS3接続を許可したい場合は、Security-Groupのoutband規制で絞るなど、他の方法で回避するのでしょうか。

## 2 確認

以下の通り、インターネットに通信できない状態ですが

```
[root@ip-172-31-6-140 ~]# curl https://www.google.co.jp/curl: (7) Failed to connect to 2404:6800:4008:c01::5e: Network is unreachable
[root@ip-172-31-6-140 ~]#
```

無事、s3上にある画像ファイルをDLすることができました。

```
[root@ip-172-31-6-140 ~]# aws s3 cp s3://test-3-shake.com/20150305051314_thumb.jpg .
download: s3://test-3-shake.com/20150305051314_thumb.jpg to ./20150305051314_thumb.jpg
[root@ip-172-31-6-140 ~]#
```

### 通信内容をtcpdumpしてwiresharkで見てみた

![hoge](https://s3-ap-northeast-1.amazonaws.com/qiita-3-shake.com/hoge_cap.png)

S3との通信内容をtcpdumpしてみました。ご覧の通り、S3（54.231.230.6）へはインターネット経由で接続していることがわかります。（パブリックネットワークからS3へ接続した時と変わりありません）

プライベートネットワーク内のインスタンスとS3との接続自体がローカル通信（= 接続速度速くなる）であることを期待していたのですが、そういう訳ではないようです。

セキュリティ要件が厳しく、プライベートネットワーク内のインスタンスからS3へNATインスタンス越しに接続している方には、とても嬉しいニュースかなと思います！
<!DOCTYPE html>はちゃんと書きましょう

HTMLを学び始めた人にとってみたら「これ必要なの？」っていう記述がいっぱいあると思います。
その最たるものが`<!DOCTYPE html>`だと思います。
`<meta charset="UTF-8">`を書いたほうが良いのはわかる。文字化けの原因になるし。
でも`<!DOCTYPE html>`は別になくてもよくね？ちゃんと表示されるし。

はい、その通りだと思います。

でも、[HTML文法の仕様書](http://www.w3.org/TR/html5/syntax.html#the-doctype)を見るとちゃんと A DOCTYPE is a required preamble. (DOCTYPEは必要な前置きだ)と書かれています。
ここにそう書いてあるんだから、必要なんです。
赤信号だったらたとえ車が来てなかろうが止まらなければいけないのと同じです。

また、`<!DOCTYPE html>`を書いていない場合、ブラウザーによっては互換モードとして動作してしまう場合があり、HTML5で導入された新しい要素などが正しく動作しない場合があります。
参考：http://www.htmq.com/html5/doctype.shtml

このような不測の事態を避けるためにも、日頃からきちんと`<!DOCTYPE html>`を書いておくことをおすすめします。

HTMLをこれから覚えようとしている皆さんはきちんと`<!DOCTYPE html>`を書くようにしましょう！
Retrofit 1.9未満だとStethoを使えないので注意


まさに聴診器のようにアプリを診察できる[Stetho](http://facebook.github.io/stetho/)がよさそうだったので手を出してみたら変なところでハマったのでメモしておきます。

Stethoのわかりやすい紹介はこちら ⇒ [StethoでAndroidのNetwork Performanceを見る](http://qiita.com/wasabeef_jp/items/1e7bdb78766708206d3d)


# 現象
上の紹介の通りに`build.gradle`に記述してApplicationクラスで初期化するとビルドは通りますが、実行時に通信エラーになります。

```
W/System.err﹕ java.io.IOException: Address already in use
W/System.err﹕ at android.net.LocalSocketImpl.bindLocal(Native Method)
W/System.err﹕ at android.net.LocalSocketImpl.bind(LocalSocketImpl.java:303)
W/System.err﹕ at android.net.LocalServerSocket.(LocalServerSocket.java:52)
W/System.err﹕ at com.facebook.stetho.server.LocalSocketHttpServer.bindToSocket(LocalSocketHttpServer.java:278)
W/System.err﹕ at com.facebook.stetho.server.LocalSocketHttpServer.listenOnAddress(LocalSocketHttpServer.java:138)
W/System.err﹕ at com.facebook.stetho.server.LocalSocketHttpServer.run(LocalSocketHttpServer.java:134)
W/System.err﹕ at com.facebook.stetho.Stetho$1.run(Stetho.java:80)
E/stetho﹕ Could not bind to socket.
```

# 原因
タイトルの通りで、 **Retrofit 1.9未満だと使えない** って話です。
古いバージョンだと[okhttpのInterceptor](https://github.com/square/okhttp/wiki/Interceptors)に対応しておらず、初期化時に`StethoInterceptor`を追加すると動かなくなるらしいです。

```java
OkHttpClient client = new OkHttpClient();
client.networkInterceptors().add(new StethoInterceptor()); // ⇦ ココ
```

なので、Retrofitを1.9以上に、できれば最新まであげれば解決します。
ライブラリは定期的にアップデートしていくようにしないとダメですね。

以上です。

参考 : https://github.com/facebook/stetho/issues/36
PHP DIコンテナベンチマーク

http://www.sitepoint.com/php-dependency-injection-container-performance-benchmarks/

パフォーマンスにおいて2グループに分かれるように見えるとか書いてあるけど理由は特に書いてない。
ベンチマークだとパフォーマンスに差があるように見えるけどリアルアプリケーションならどれ選んでも誤差でしょという結論のようだ。
ssh設定メモ：鍵ファイルのパーミッション

## 望ましい設定

.ssh : 700
.ssh/id_rsa : 600

```
james$ chown 700 .ssh
james$ chown 600 .ssh/id_rsa
james$ ls -al .ssh
drwx------   6 james staff   204  5 12 17:50 .
-rw-r--r--   1 james staff   278  5 12 17:44 config
-rw-------   1 james staff  1676  5 12 17:46 id_rsa
-rw-r--r--   1 james staff   448  5 12 17:48 known_hosts
```

## 環境
Mac OSX Yosemite

## いきさつ
Windowsで使っていたキーとconfigをコピーして使おうとしたらエラーが出て、`git clone`が失敗。。。

```
$ git clone ssh://git@example.com/var/git/hello/helloworld.git
Cloning into 'helloworld'...
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/james/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /Users/james/.ssh/id_rsa
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

鍵ファイルのパーミッションが緩すぎるらしいです。
しっかりしてますね。

ソース：[Permissions on private key in .ssh folder?](http://superuser.com/questions/215504/permissions-on-private-key-in-ssh-folder)

もっとちゃんとしたソースが欲しかったけど面倒臭かった。すみません。
macでnginx+phpを動かす

brew nginx

/usr/local/etc/nginx/nginx.conf

```
server {
  root /usr/local/var/www;
  
  #コメントを外して、fastcgi_paramを修正
  location ~ \.(php|html)$ {
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
      include        fastcgi_params;
  }
}
```

sudo cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf
/private/etc/php-fpm.conf

```
security.limit_extensions = .php .html
error_log = /usr/local/var/log/php-fpm.log
```

touch /usr/local/var/log/php-fpm.log

php-fpm
nginx
RailsでJSON APIのバックエンドを作っていたら、Deviseの認証周りで422 Unprocessable Entityエラーを吐いてしまった場合

# 症状

RailsでJSON API用のバックエンド（管理画面はactive adminを利用し、そこだけはhtmlを利用）を作っています。
認証周りにDeviseを利用しました。
Routingは↓な感じで。

```rb:config/routes.rb
  namespace :api, format: 'json' do
    namespace :v1 do
      devise_for :users, controllers: {
        sessions:      'api/v1/users/sessions',
        registrations: 'api/v1/users/registrations',
        passwords:     'api/v1/users/passwords'
      }
    end
  end
```

で以下の様なテストをしました。

```rb
$ curl -H "Content-Type: application/json" -d '{"user":{"email":"hoge@hoge.hoge","password":"12345678"}}' -X POST http://localhost:3000/api/v1/users
```

結果↓

```rb
{"errors":{"email":["can't be blank"],"password":["can't be blank"]}}
```

# 対応

```rb:app/controllers/api/v1/registration_controller.rb

def sign_up_params
  params.require(:user).permit(:email, :password, :password_confirmation)
end

def create
  build_resource(sign_up_params)
  super
end
```

createは自前でコードを書いてもいいのですが、とにかくこれでうまくいきました。

```rb
curl -H "Content-Type: application/json" -d '{"user":{"email":"hoge@hoge.hoge","password":"12345678"}}' -X POST http://localhost:3000/api/v1/users
{"id":1,"email":"hoge@hoge.hoge","authentication_token":null,"created_at":"2015-04-12T09:41:31.842Z","updated_at":"2015-04-12T09:41:31.881Z"}%
```

# References

- http://hyottokoaloha.hatenablog.com/entry/2015/04/04/151809
- http://lucatironi.github.io/tutorial/2012/10/15/ruby_rails_android_app_authentication_devise_tutorial_part_one/
Kobito for Windowsでの投稿失敗

> 投稿テストです。

> Gitでログインしようとすると固まるよねと書こうと思ったらもう直っていた。

> 起動が軽いのがよいです。

という感じのことを書こうとしたら、アップロードしようとすると無反応でした。
js2xmlparserでインデントをスペースにする

具体例がみつからなかったがいろいろやってるうちに出来たのでメモ

```
    var options = {
      prettyPrinting: {
        enabled: true,
        indentString: " "
      }
    };
```
上のように定義しておいて、

```
js2xmlparser("foo", bar, options);
```

js2xmlparserはオプションいろいろで便利そうです
pタグの中にh1,h2などのタグを置いてはいけない

HTMLを学び始めた人がよくハマる罠。

```html
<p>
  ...
  <h1>見出し</h1>
  ...
</p>
```

のような書き方をしてはいけないよというお話です。

---
`<p>` は段落(paragraph)を意味するタグで、`<h1>`,`<h2>`などは見出し(heading)を意味するタグです。
文章の構造が

```
見出しA
段落A
段落B
見出しB
段落C
段落D
```

というようになっていた場合、

```html
<h1>見出しA</h1>
<p>段落A</p>
<p>段落B</p>
<h1>見出しB</h1>
<p>段落C</p>
<p>段落D</p>
```

のように囲うべきです。

```html
<p>
  段落1
  <h1>見出し</h1>
  段落2
</p>
```

のような構造は不自然です。

またWebブラウザーもこの下のような文書構造は許可しておらず、このような書式を見つけるとブラウザーは自動的に`</p>`を見出しの前に補完します。つまり下記のようなHTMLとして扱われます。

```html
<p>
  段落1
</p><!-- ←これがブラウザーにより自動的に補完される -->
  <h1>見出し</h1>
  段落2
</p> <!-- ←これは無意味なタグとして無視される -->
```

このようになると何が問題かというと、**段落2の部分は`<p>`要素の子ではない**ということになるので、例えば

```css
p {
  color: blue;
}
```

のようなスタイルが意図したとおりに適用されなくなります。
一見段落1と見出しと段落2が青くなるように見えますが、実際には段落1のみに適用されます。

知らないとハマることになるので、HTMLを学び始めた人は最初からきちんとした構造のHTMLを書くように気をつけましょう。
Catch というマクロライブラリで C++ のコードをテストする

#概略

C++ のコードをテストする道具として、[Catch](https://github.com/philsquared/Catch) というかんたんツールを見つけたので使ってみた。

#背景

近年()、ハードウェア性能の急速な**退化**などの要因で、私が新しくプログラムを書くときの選択肢として、C, C++ が少しずつではあるが再登場してきた。
というか、普通に JavaScript とかより抽象度が**高い**し、シー言語たのしいいい。

ところで、私は C, C++ 用のものを含め、ユニットテストのふれーむわーくなるものを使いこなせたためしがない。主な理由は2つあって:

1. 重厚長大かつ意味不明: なんで `assert( f(v) == v' )` を確かめるためだけに、どっかの知らんやつが考えたさいきょうのお作法を何時間も解読しなきゃいけねーんだよ。
2. そもそも `f(v) == v'` 的なものは、だいたい自明に実装する。本当にテストしたいことの8割方は、ループの不変条件とか、「UIのボタンが絶対に迷子にならない不変条件」とかだ。

#Catch

[Catch](https://github.com/philsquared/Catch) は、C, C++ のテストツールだが、特長は、上述のような頑固な **static おじさんでも10分で使える**簡潔さにある。

使い方は、

1. ヘッダファイルを1つだけ `#include` して、
2. そこで定義されたそれっぽいマクロでテストケースを書いて、
3. コンパイルして
4. 出てきたバイナリを実行

これだけ。具体例を、[公式のチュートリアル](https://github.com/philsquared/Catch/blob/master/docs/tutorial.md) から適切な範囲で引用() してみよう:

```cpp
#define CATCH_CONFIG_MAIN  // This tells Catch to provide a main() - only do this in one cpp file
#include "catch.hpp"

unsigned int Factorial( unsigned int number ) {
    return number <= 1 ? number : Factorial(number-1)*number;
}

TEST_CASE( "Factorials are computed", "[factorial]" ) {
    REQUIRE( Factorial(1) == 1 );
    REQUIRE( Factorial(2) == 2 );
    REQUIRE( Factorial(3) == 6 );
    REQUIRE( Factorial(10) == 3628800 );
}
```

例題はありがちな `fib` で、簡単のためにテストしたい実装を同じソースに埋め込んでいる。もちろん、ふだん使うときは実装は別のソースにわけてリンクする、というかもういっそ `#include "oreore-code.cpp"` でもいいんじゃないかな...

これをコンパイルして実行すると、こんな感じ:
![image](https://qiita-image-store.s3.amazonaws.com/0/49976/bb8db87d-bae8-2dd0-49bb-84ee881ed792.png)

試してないが、CI[^1] 用の出力を出したり、びへいびやーどりぶん的な書き方もできるらしい[^2]。

[^1]: 余談だが、このギョーカイで 「Integration」 という言葉が何を意味しているのか、さっぱり理解できていない。
[^2]: 余談だが、いつから BDD という略語が「二分決定図」以外のものを指すようになったんだ？

#まとめ

手早くすませることが求められて、それが実現可能ならば、そのようにしましょう。

#補足

~~Q. `private` メソッドのテストはどうすんの？~~
~~A. `#define private public` しろ。
   [公式の issue に本当にそう書いてある](https://github.com/philsquared/Catch/issues/258)~~

`やめとけ。この話終わり！` で `close` されていたのでお詫びして訂正いたします。

--
pandocでmarkdownをtexに変換するとtableがおかしくなる件


#概要

markdownのtebalをpandocでtexにコンバートすると、他の図などが変にはみ出てしまうことがある。  
どうやら変換後のlongtableの問題らしいが、texは詳しくないのでよく分からないし、pandocの処理を変える方法も分からない。

#解決方法

普段pipe tableを使っていたのだが、

```
| Right | Left | Default | Center |
|------:|:-----|---------|:------:|
|   12  |  12  |    12   |    12  |
|  123  |  123 |   123   |   123  |
|    1  |    1 |     1   |     1  |

  : Demonstration of pipe table syntax.
```

multiline tablesやgrid tableなら上手く処理される。

```

-------------------------------------------------------------
 Centered   Default           Right Left
  Header    Aligned         Aligned Aligned
----------- ------- --------------- -------------------------
   First    row                12.0 Example of a row that
                                    spans multiple lines.

  Second    row                 5.0 Here's another one. Note
                                    the blank line between
                                    rows.
-------------------------------------------------------------

Table: Here's the caption. It, too, may span
multiple lines.

: Sample grid table.

+---------------+---------------+--------------------+
| Fruit         | Price         | Advantages         |
+===============+===============+====================+
| Bananas       | $1.34         | - built-in wrapper |
|               |               | - bright color     |
+---------------+---------------+--------------------+
| Oranges       | $2.10         | - cures scurvy     |
|               |               | - tasty            |
+---------------+---------------+--------------------+
```

各tableの詳しい記法は[Pandoc User’s Guide](http://pandoc.org/README.html#tables)を参照。

マジか。なんでpipeだけ駄目なんだろう。気に入ってたのに。仕方ないからmutilineを使うことにするか。
pan
adb install/uninstall で "rm failed for -f, Read-only file system" エラーが出てSDカードの容量が減っていく場合の対処法

# 環境

OS: Yosemite
adb version: 1.0.32
Device: Nexus One (Android 2.3.6), SH-02E (Android 4.1.2)
※rootは取っていない

# 状況

```
adb install hoge.apk
adb uninstall moge.fuga.hoge
```

- すると成功するけど `rm failed for -f, Read-only file system` と言われる
- 何度か繰り返していると `INSTALL_FAILED_INSUFFICIENT_STORAGE error` になってインストールできなくなる  
（一つのアプリを入れたり消したりしているだけで、他のアプリを入れたり、他のファイルをSDカードに保存したりしていないのに）
- 実機の Manage App 画面でSDカードの容量を確認すると空き容量が異常に少なくなっている
- 他の手持ちのAndroid端末では再現していない

# 対処法

エラーメッセージ的にインストール・アンインストール時のゴミファイルの削除ができていない様子なので、

(1) `adb install` 実行時に、apkがどこに送られてるかをターミナルで確認

(2) `adb shell` で実機に入って該当の場所の不要なapkを削除

```shell:例
adb shell
cd /data/local/tmp
ls
rm hoge.apk
exit
```

(3) 実機の Manage App 画面から対象のアプリをアンインストール

で、容量が元に戻った。

これに気づくまでは Safe boot して Clear Storage していて、すごく手間だった（毎回Activateする必要があるので）のですが、解決。
RailsでJSON API用のバックエンドを作っていたら、ActiveAdminが 401を吐いた場合

# 症状

何事も無ければ、active_adminを使っている場合、/adminにアクセスしたら、以下の様な画面が見れるはずです。

![Screen Shot 2015-05-12 at 18.20.30.png](https://qiita-image-store.s3.amazonaws.com/0/18705/99ecd96b-1124-00bc-306e-b4e52701e884.png)

しかし、今回こんな感じになりました。

![Screen Shot 2015-05-12 at 17.35.24.png](https://qiita-image-store.s3.amazonaws.com/0/18705/d6239731-fbbf-914e-7c72-c8f215dc3b90.png)

```rb
Started GET "/admin" for ::1 at 2015-05-12 18:06:23 +0900
Processing by Admin::DashboardController#index as HTML
Completed 401 Unauthorized in 0ms
```


# 原因

Deviseを認証に利用しようとして、設定ミスをしていました。

```rb
  # ==> Navigation configuration
  # Lists the formats that should be treated as navigational. Formats like
  # :html, should redirect to the sign in page when the user does not have
  # access, but formats like :xml or :json, should return 401.
  #
  # If you have any extra navigational formats, like :iphone or :mobile, you
  # should add them to the navigational formats lists.
  #
  # The "*/*" below is required to match Internet Explorer requests.
  config.navigational_formats = ['*/*', :json]
```

↓にしたら直りました。

```rb
  config.navigational_formats = ['*/*', :json, :html]
```
Google Cloud Repositories 備忘(Mac向け)

###ターミナルを開き任意のディレクトリに移動
例: 
cd Users/ichiro-tanaka
とか

###Google Cloud SDKのインストール
https://cloud.google.com/sdk/?hl=ja

・上記ディレクトリで下記コマンドを実行
curl https://sdk.cloud.google.com | bash

・一旦ターミナルを閉じる

###GCPログイン
・ブラウザ(デフォルトブラウザ)でGoogle Cloud Platform　に事前にログインしておく

・ターミナルを再度開き下記コマンドを実施
gcloud auth login

・デフォルトブラウザが開くので、ブラウザ上で「自アカウント」を選択し、「承認」する

###GCPプロジェクト初期化(git clone)
・ソースをチェックアウトする任意のディレクトリを作成する or 移動する
例：
mkdir Users/ichiro-tanaka/souces
cd souces

・チェックアウト(git clone)
上記ディレクトリ配下で下記コマンドを実施する
旧：<del>gcloud init プロジェクトID</del>
新：gcloud source repos clone default ターゲットディレクトリ
※2015/03/07修正。いつの間にかコマンドが変更されていました・・・。

例の場合だと、/Users/ichiro-tanaka/sources/プロジェクトID/default/パッケージ名
な感じでフォルダが作成される

以降のソースの取得・追加・更新・削除はgitコマンドを使用して行う

###コミット時のauthorを設定(※初回のみ)
・プロジェクトID名のディレクトリに移動する
例：
cd /Users/ichiro-tanaka/プロジェクトID/default 

・authorを設定
上記ディレクトリ配下で下記コマンドを実施
git config --global user.name 名称
例：
git config --global user.name ichiro.tanaka@gmail.com

・ここで設定したauthorがソース反映時のユーザになる
Google Develpers Console の「ソースコード」＞「閲覧」の一覧の「作成者」に表示される名称になります

・adressを設定
上記ディレクトリ配下で下記コマンドを実施
git config --global user.email メールアドレス
例：
git config --global user.email ichiro.tanaka@gmail.com

###ソースの取得(リモートリポジトリ→ローカル)
・プロジェクトID名のディレクトリに移動する
例：
cd /Users/ichiro-tanaka/プロジェクトID/default 

・リポジトリファイル取得
上記ディレクトリ配下で下記コマンドを実施
git pull

###ソースの新規追加ファイル、更新ファイルをリポジトリに反映
・プロジェクトID名のディレクトリに移動する
例：
cd /Users/ichiro-tanaka/プロジェクトID/default 

・新規ファイルを追加(新規ファイルが存在する場合)
上記ディレクトリ配下で下記コマンドを実施
git add -a
git add -a *.png

拡張子していだとその拡張子のファイルのみが追加されます。

・追加ファイル・更新ファイルを反映
上記ディレクトリ配下で下記コマンドを実施
git commit -a -m "コメント" 

・リモートリポジトリに反映
上記ディレクトリ配下で下記コマンドを実施
git push
LoopbackのRESTサービスを公開しない（一部使用できない）ようにする

[こちらの記事](http://qiita.com/yosi-q/items/b1640b89ab03e608935a)で、Loopbackを使ったRESTfulなWebサービスをさくっと作ってみたのですが、
正直こんなにいらない、公開したくないというケースはあるはず。

不要なサービスを塞ぐ方法をメモ。

# 自動生成によって作成されたスクリプト（Remind）

Yoemonでモデルを作成した際に、モデル定義のJSONファイルと、
下記のスクリプトファイルが出来上がる。

```js:sample-model.js
module.exports = function(SampleModel) {

};
```

塞ぎの制御では**スクリプトファイルを変更する**。

# 塞ぎ定義を追加する

## ``Model.disableRemoteMethod(name, isStatic)``
塞ぎの定義は```Model.disableRemoteMethod(name, isStatic)```を使用する。
詳しくは[APIドキュメント](http://apidocs.strongloop.com/loopback/#model-disableremotemethod)で確認していただくとして、
概要としては下記のようなもの。

 * name ：メソッド名
 * isStatic ：staticなメソッドかどうか(staticならtrue)

「staticなメソッドかどうか」ってどういうことだ！というところですが、
[PersistedModelのstaticメソッド](http://apidocs.strongloop.com/loopback/#persistedmodel
)かどうかという話のようです。
モデル間のリレーション関係などは除いて、モデル単体でデフォルトで作成されてくるREST APIのメソッドは
すべて「static」ということで問題ありません。
（リレーションがある場合のものは別に整理することにしよう。忘れないように。）

2015/05/13追記：
[こちら](http://docs.strongloop.com/display/public/LB/Accessing+related+models)にリレーション関係のmethodのリストがあったのでメモ。

## 実際の塞ぎ

例えば、HTTP POSTで投げたときに使われる「create」を塞ぐ場合は下記のとおり。

```js:sample-model.js
module.exports = function(SampleModel) {

  SampleModel.disableRemoteMethod('create', true);
};
```

この定義を加えた上で、Nodeアプリケーションを再起動して、
explorer（Express画面）を確認すると、１行消えている。

**AFTER**
![after.png](https://qiita-image-store.s3.amazonaws.com/0/19870/0e1cdad6-ec4a-9b3b-e12e-9bd8aa0a4c5f.png)

**BEFORE**
![before.png](https://qiita-image-store.s3.amazonaws.com/0/19870/aa0bc82e-c32d-5f5f-6e40-581621255c76.png)

こんな感じで、使いたいものだけを残すのも簡単にできるのでした。
AnkoでFragment用のレイアウトを作る


レイアウトをコードで書けるDSLのAnkoですが、[ドキュメント](https://github.com/JetBrains/anko)を見てもFragmentのonCreateViewで返すViewをどう作ればいいのかよく分からず躓いたのでメモ。

これであってるのかな？もっといい方法があれば教えて下さい。

```kotlin
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    // val view = inflater!!.inflate(R.layout.fragment_main, container, false)
	
    val image = UI {
        imageView {
            id = View.generateViewId()
            contentDescription = "test image"
            image = if (Build.VERSION.SDK_INT < 21)
                getResources().getDrawable(R.drawable.bike)
            else
                getResources().getDrawable(R.drawable.bike, null)
        }
    }.toView()

    val view = UI {
        relativeLayout {
            padding = dip(16)

            addView(image.layoutParams() { centerInParent() })

            textView {
                text = "test image"
            }.layoutParams(width = wrapContent, height = wrapContent) {
                below(spinImage.getId())
            }
        }
    }.toView()

	// imageに対する処理とか
	
	return view
}
```

まだ、Ankoが便利なのかよくわかってない。

面倒ポイントとしては

- RelativeLayoutだとどうしてもViewのIDが必要になるので自分で生成しないといけない。
	- `dip`みたいにAnko側でIDを生成してくれるUtilがあると助かるんだけど… `View.generateViewId()`はAPI 17からだし…
- Viewの一部を外で使いたいとき若干手間
Golangの勉強をしてみた


先日、なんとなくGolangの勉強をしたので、その時にどうやって取り組んだかを残しておきます。

## 環境を準備

まずは開発環境を作る必要がある。今回は最近Pro版も出たNitrousを使った。

[https://lite.nitrous.io/](https://lite.nitrous.io/join/WRQhKZ9dQlg?utm_source=nitrous.io&utm_medium=copypaste&utm_campaign=referral)
（招待コードをリンクに入れてあるので、気に入らない方はコピペして上記URLにアクセスして下さい）

自分のPCにインストールしても良いが、すぐに開発環境が手に入るのでNitrousの無料版(Lite)はおすすめ。


## 教材

まずは「[プログラミング言語Goツアー](http://go-tour-jp.appspot.com/)」から。

次に「[Webアプリを作ってみよう](http://golang.org/doc/articles/wiki/)」をやってみた。


## 知識面の補強

「プログラミング言語Goツアー」をやった後に次のスライドを読むと、イマイチ良く分かっていなかった部分を一気に把握することができて素敵でした。
[An Introduction To Programming In Go](https://speakerdeck.com/petejkim/an-introduction-to-programming-in-go)

## ソースコードの管理

Goのお作法もわかるので一読をお勧めします。

[ ghqを使ったローカルリポジトリの統一的・効率的な管理について ](http://blog.kentarok.org/entry/2014/06/03/135300)

[ghq + peco/percol ](http://weblog.bulknews.net/post/89635306479/ghq-peco-percol)


## Herokuで動かす方法

色々と調べていたら、Herokuで動かす記事が結構多かった。
Nitrousで勉強する環境としては十分だが、他の知識も習得できるので勉強になった。

[GoアプリをHerokuにデプロイする](http://t32k.me/mol/log/go-on-heroku/)

[Golangで作ったWebアプリをHerokuにデプロイする。 ](http://yukihir0.hatenablog.jp/entry/2015/01/01/161012)

[Martini(+Ginkgo)をWerckerでCIしてHerokuにデプロイ](http://deeeet.com/writing/2014/04/23/martini/)


## Webアプリを作るために

Githubで探して見たところ、以下のものがありました。

**Martin**
http://martini.codegangsta.io/

Sinatraっぽくて、ササッと作りたい時に使えそう。

**Martinの機能拡張**
https://github.com/martini-contrib?page=1

**Ravel**
https://revel.github.io/

フルスタックのフレーム。

ホテルの予約システム（サンプルプログラム）
https://revel.github.io/samples/booking.html

**kocha**
http://naoina.github.io/kocha/

**Goji**
https://goji.io/

## IDE

ローカルで開発する場合はIDEがあると便利です。

IntelliJにgo-lang-idea-pluginを追加するといい感じでした。インストール方法は、以下のリポジトリのReadMeに書かれています。
https://github.com/go-lang-plugin-org/go-lang-idea-plugin

「LiteIDE」というツールもありました。使用感はIntelliJの方が良いと感じました。
https://code.google.com/p/golangide/

## 感想

私の場合、もともとコンパイル系の言語は使ってきた歴が無いに等しいのだが、Golangはとてもとっつきやすい言語だなと感じた。

スクリプターでも使いやすいので、使い始める人が多いというのは納得。実行速度が非常に速いという特徴もあるようで、興味深い言語でした。
smallbasicのエクステンションを作る

#コンパイラを準備する。
自分は、visual studio 2010 profissionalを準備
#クラスライブラリを作る
ｃ＃で.Net　Framework 3.5を指定してClassLibrary1を作る。
#サンプルコード
Flickrが動かないので、美人のURLを取得するコードを書いた。

```csharp:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SmallBasic.Library;
using System.Net;
using System.Text.RegularExpressions;

namespace ClassLibrary1
{
    /// <summary>
    /// オリジナル　エクステンション
    /// </summary>
    [SmallBasicType]
    public static class Class1
    {
        /// <summary>
        /// 美人　サムネイル
        /// </summary>
        /// <param>なし</param>
        /// <returns>１０個のURL</returns>
        /// <example>Class1.Bijin()</example>
        public static Primitive Bijin()
        {
            var result = new Primitive();
            WebClient wc = new WebClient();
            string html = wc.DownloadString("http://bjin.me/api/?type=rand&count=10&format=json");
            string anchor = "thumb\":\"(?<url>.*?)\",\"pubDate";
            Regex re = new Regex(anchor, RegexOptions.IgnoreCase | RegexOptions.Singleline);
            var i = 0;
            for (Match m = re.Match(html); m.Success; m = m.NextMatch())
            {
                string url = m.Groups["url"].Value;
                string ul = url.Replace("\\/", "/");
                result[i] = ul;
                i++;
            }
            return result;
        }        
    }
}
```
参照設定で "C:\Program Files\Microsoft\Small Basic\SmallBasicLibrary.dll" を加える。
XMLドキュメントコメントに記述しておくとインテリセンスに表示される。
プロジェクトのプロパティにて [ビルド] - [XML ドキュメント ファイル(X):] のチェックしてビルドする。
#デプロイ
ビルドして、できたアセンブリ(.dll)とXMLドキュメント(.xml)を、
"C:\Program Files\Microsoft\Small Basic\lib" にコピー 。
lib フォルダは自分で作る。
#テスト
```
b = Class1.Bijin()
For i =0 To 9
  myimage = ImageList.LoadImage(b[i])
  height = ImageList.GetHeightOfImage(myimage)
  width = ImageList.GetWidthOfImage(myimage)
  GraphicsWindow.Clear()
  GraphicsWindow.Height = height
  GraphicsWindow.Width = width
  GraphicsWindow.DrawImage(myimage, 0, 0)
  Program.Delay(9000)
EndFor
GraphicsWindow.Hide()
```