OmniAICreator/Qiita-1.07M huggingface dataset:
MacOSにhping3をインストール

#Macへhping3 インストール

何かと便利なpingツール

##インストール

###Xcode
free版で問題ない
https://developer.apple.com/xcode/downloads/

```bash
xcode-select --install
```

###MacPorts
pkgをダウンロードして入れる

https://www.macports.org/install.php

パス適用

```bash
vim .bash_profile
---
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export MANPATH=/opt/local/share/man:/opt/local/man:$MANPATH
---

source .bash_profile
```

アップデート　リスト更新

```bash
sudo port selfupdate
sudo port sync
```

###hping3

```bash
sudo port install hping3
```

```bash
hping3 -v
hping version 3.0.0-alpha-1 ($Id: release.h,v 1.4 2004/04/09 23:38:56 antirez Exp $)
```
Autolayout時にUIViewのframeを変更する方法


Autolayoutを使っていると、UIViewの大きさを変えたり、位置を変更したりができない。

`imageview.frame = CGRectMake(0, 0, 100, 100);`

これが効かない。

##AutoLayoutを解除する
特定のViewだけAutoLayoutを解除すると効くようになる。
`translatesAutoresizingMaskIntoConstraints`を使う。

## Swift 2.x系
```swift
//AutoLayout解除
imageview.translatesAutoresizingMaskIntoConstraints = true

//Viewのframe変更
imageview.frame = CGRectMake(0, 0, 100, 100);
```

## swift 1.x系
```swift
//AutoLayout解除
imageView.setTranslatesAutoresizingMaskIntoConstraints(true)
//Viewのframe変更
imageview.frame = CGRectMake(0, 0, 100, 100);
```


## objective-c
```objective-c
//AutoLayout解除
imageView.translatesAutoresizingMaskIntoConstraints = YES;
//Viewのframe変更
imageview.frame = CGRectMake(0, 0, 100, 100);
```



あまり多様するのはよくないけど、ちょっと変更したい時に。
あるclass名が設定されているタグだけを xpath で参照したい

以下のタグのうち、class に「unko」が設定されているものだけを xpath で参照したいんだけど、

```html
<li class="foo bar unko" /> <!-- ←こいつだけ参照したい -->
<li class="hoge fuga no-unko" />
<li class="aaa bbb unko-unko" />
```

以下ではヒットしないし、

```xquery
//li[class="unko"]
```

以下では全部ヒットしてしまう。

```xquery
//li[contains(@class, "unko")]
```

どうにかすっきりかけないものか...うーん...
squid で認証ありプロキシによるストレスを軽減する

認証ありのプロキシを通さないと外部にアクセスできない。
毎回毎回ユーザ名、パスワードを入力しなければならず、ストレスが溜まる。

そんな環境でストレスを軽減するためには squid を使おう。

### インストール
squid のインストールは検索すると、いくらでも出てくるのでそれらを参照で。
ここでは Homebrew でインストール。

```shell-session
$ brew install squid
```

### 設定
Homebrew でインストールした場合、設定ファイルは /usr/local/etc/squid.conf にあるので、以下を追加する。
(途中で折り返されるかもしれないが1行で。)

```squid
cache_peer proxy_fqdn parent proxy_port icp_port no-query no-netdb-exchange login=user:password
```

* proxy_fqdn : 認証ありプロキシのFQDN。親として指定する
* proxy_port : 上記プロキシのポート番号
* icp_port : ICPのポート番号。詳細は squid のドキュメント、RFC 2186, 2187 を参照
* user : 上記プロキシのユーザ名
* password : 上記プロキシのパスワード

ユーザ名、パスワードを直接記述することになるので、 squid.conf のパーミッションはしっかり設定！


あとは、
* ネットワーク設定やWebブラウザの設定でプロキシに 127.0.0.1:3128 を設定
* 環境変数 (http | https | ftp)_proxy に 127.0.0.1:3128 を設定

としておけば、毎回ユーザ名、パスワードを入力する作業から解放される。

### 補足

今回の設定は、認証ありプロキシがBasic認証の場合向けで、LTLMとかだと別な設定が必要かも。

Homebrew の /usr/local/etc/squid.conf はシンボリックリンクなので、 ```brew upgrade``` で突然デフォルト設定になることがあるので注意。

今回、これを書いたのは、まさにそれにハマって設定し直すのに時間がかかったため。
Railsでテーブルを削除したい時の対処法

rollbackできない時の対処法。

```SQLite3::SQLException: table "users" already exists: CREATE TABLE "hoge"```

```$rails dbconsole```

該当するテーブルを削除
```sqlite> drop table hoge;```

削除されたか確認する
```sqlite> .schema
CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL);
CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version");```
webapi作ってみた


# 前提

* DBに直接アクセスさせたくない
* しかしDBの内容を読み込ませたい
* DBは1週間に一回更新があるかどうか
* データ量が1MBくらいと小さい
* 読み取り専用

この場合、DBのダンプ情報をリモートからアクセスできればやりたいことができる。

# apiサーバ

```php:api.php
if ($_SERVER["REMOTE_ADDR"] != "123.123.123.123"
 && $_SERVER["REMOTE_ADDR"] != "123.123.123.124") {
  die("access denied.");
}
define('CACHE_FILE', 'api.cache');
// 30分以上前の場合、キャッシュを使う。
if (filemtime(CACHE_FILE) > strtotime('-30 minute')) {
    echo "[quit] cache data already updated. retry after 30 minutes.";
    die();
}

function encode($arr) {
    return base64_encode(serialize($arr));
}
function decode($str) {
    return unserialize(base64_decode($str));
}
```

DBの値を配列に格納し`encode()`に通す。

* serializeするだけだと日本語が化けるのでbase64_encodeした。
* apiを利用する側は`decode()`を通せばよい。
eLTAX で Java が SecurityException を吐きやがる場合の対処法

去年は使えたはずの eLTAX (地方税関係の手続きシステム) が使えなくなった! 困った! という人向けに。

Java 7 Update 51 (2014年1月14日リリース) から Java アプレットのセキュリティまわりのチェックが厳しくなった。具体的には、電子署名が検証できないアプレットを弾くようになった。

このチェックを外すためには、Java コントロールパネルの「セキュリティ」→「例外サイト・リスト」に該当サイトを追加するとよい。

eLTAX の場合であれば「https://www.portal.eltax.jp/」を登録するとよい。

っていうか、とっとと署名つけてくださいよ > eLTAX さん。
inkscapeで数値入力ができない場合のworkaround


https://bugs.launchpad.net/inkscape/+bug/999422

```javascript:start_inkscape.js
// Windows Script Hostのオブジェクトを生成
var wshell = new ActiveXObject("WScript.Shell");
var env = wshell.Environment("Process");

// 言語をEnglishに設定
env("lang") = "en";

// Inkscape起動
wshell.run('\"C:\\Program Files\\Inkscape\\inkscape.exe\"', 1);
```

```
cscript start_inkscape.js
```
XCodeで空白のみの行を削除する設定


Preferences > Text Editing にある Including whitespace-only lines にチェックを付ける

![スクリーンショット 2014-09-02 9.52.23.png](https://qiita-image-store.s3.amazonaws.com/0/30441/a6650cdc-8f11-d720-89f6-f3b120cc38ff.png "スクリーンショット 2014-09-02 9.52.23.png")
各Web地図サービス、Geo系ライブラリの引数(緯度経度)メモ


緯度:lat 
経度:long

## LatLong系

### [Google Maps API](https://developers.google.com/maps/?hl=ja)

```js
new google.maps.LatLng(<lat>, <long>);
```

### [YOLP(Yahoo map)](http://developer.yahoo.co.jp/webapi/map/)

```js
new Y.LatLng(<lat>, <long>);
```

### [Bing Maps](http://www.bingmapsportal.com/)

```js
 new Microsoft.Maps.Location(<lat>, <long>),
```

### [LeafletJS](http://leafletjs.com/)

```js
new L.LatLng(<lat>, <long>)
```


<br />

<br />

## LongLat系




### [OpenLayers v2](http://mapabc.wikidot.com/openlayers:ref-topic)

```js
new OpenLayers.LonLat(<long>, <lat>)
```

### [OpenLayers v3](http://openlayers.org/)

```js
ol.proj.transform([<long>, <lat>], 'EPSG:****', 'EPSG:****')
```
### [D3.js Geo](https://github.com/mbostock/d3/wiki/Geo-Projections) 

```js
d3.geo.mercator().center( [<long>, <lat>] )
```

### [Proj4js](http://shimz.me/blog/map/3103)

```js
new Proj4js.Point(<long> , <lat>)
```
d3.jsonでpostリクエストを送信する


メモ

```:js

var parm = {name:"test", email:"xxx@xxx.com" }

d3.json("http://hoge.com/api")
	.header("Content-Type", "application/json")
	.post(JSON.stringify(parm), function(error, data) {
		console.log(data);
	});

```
herokuデータベースのセキュリティリスク

herokuに上がっているデータベースの情報をぶっこ抜かれるリスクを考えてみた。

通信情報を盗まれるのは、httpsを有効にして対処するとして、
データベースの情報を閲覧されてしまう危険性はどこにあるのか。。

考えた結果、herokuへログインするrsaキーとパスワードを盗まれて直接herokuからデータベースへ乗り込まれるのが一番怖いんじゃないか？と思った。おそらくまちがってはいまい。

でも他になんかないか。。。？
bashのSECONDS変数で簡単に処理時間を測定する

bashで特定の処理にかかった秒数を測定するには、dateコマンドで前後の秒数をとって引き算するのが一般的です。

```bash
#!/bin/bash

start_time=`date +%s`

### 時間測定したい処理
sleep 3

end_time=`date +%s`

time=$((end_time - start_time))

echo $time
```

しかし別の方法として、bashの特殊変数の1つであるSECONDS使う方法があります。
この変数を参照するとbashが起動されてからの秒数が取得でき、任意のタイミングで代入によってリセットすることができます。

```
$ echo $SECONDS
31
$ echo $SECONDS
35
$ SECONDS=0
$ echo $SECONDS
2
$ echo $SECONDS
5
```

この変数を使うと、とても簡単に処理時間が測定できます。

```bash
#!/bin/bash

SECONDS=0

### 時間測定したい処理
sleep 3

time=$SECONDS

echo $time
```


```
$ sh seconds.sh
3
```
矩形スプライトを作る

矩形スプライトを作って配置する場合、その画像を予め作っておき、

> auto sprite = Sprite::create("rect.png");

で生成してもよいのだが、以下のように create() でスプライトを
生成し、setTextureRect(const Rect&) で矩形を生成することも可能だぞ。

> auto sprite = Sprite::create();
> sprite->setTextureRect(Rect(0, 0, 100, 200));

矩形の色を指定する場合は setColor(const Color3B&) を、
透明度を指定する場合は setOpacity(GLubyte) をコールするといいぞ。

> sprite->setColor(Color3B(0, 255, 128));
> sprite->setOpacity(128);
panicはともかくrecoverに使いどころはほとんどない

Goを書いていてrecoverを使うことはまずほとんどない。頻繁にrecoverを書いているとしたらなにかが間違っているのでプログラミングスタイルを見直すこと。

## Goでのエラーハンドリング

Effective Goなどで説明されているように、Goではエラーは関数の返り値として返される。たとえばio.ReaderのRead関数は、読み込んだバイト数と、（nilかもしれない）エラーの2つの値を返す。Goでは基本的に、エラーは常にこういう通常の値としてハンドルするべきで、エラーの時のための特別な制御構造（try 〜 catch）のようなものを使うのは、利点より害のほうが多いという考え方をとっている。

（同じような考えで例外を使用禁止にしている大規模C++プログラムはいくつもある。たとえばChromiumなどはそうだ。LLVM/Clangもパフォーマンス上の問題で例外を使っていない。C++コンパイラを書いている人たちでも、自分たちのC++コンパイラでは例外を使わずにコードを書いている。）

panicは基本的に本当に例外的な状況で、エラーを表示してプロセスを終了するしかないようなときにだけ使うことが想定されている。

ではrecoverはどう使うかというと、panicが本当に例外的な状況で使われるものである以上、使いどころはない、ということになる。結論としては以上、なのだが……

## それでもrecoverを使っているケース

稀にrecoverが（議論の余地はあるものの）正当な理由で使われることもある。ちょうどgolang-devで[スレッド](https://groups.google.com/forum/#!topic/golang-dev/rXs4TG1gdXw/discussion)が立っていたのだが、標準ライブラリでは数カ所でrecoverが使われている。

__encoding/gob__
深くネストした再帰下降パーザから、入力にエラーがあった場合に一気にトップレベルの関数に脱出するためにpanic/recoverが使われている。recoverしたエラー値は呼び出し元に通常の返り値として返される。

__encoding/json__
同上

__bytes/buffer__
バッファサイズを2倍にしていくところで、メモリ割り当てに失敗したときユーザにエラー値を返すためにrecoverが使われている。

__net/http__
リクエストハンドラがpanicしたのをrecoverして単一のHTTPリクエストがプロセス全体を終了させないようにしている（これがよいことかどうかは議論の余地があるし、しかもドキュメントされていない）

Goの標準ライブラリは結構大きなGoのコードベースといっていいと思うが、recoverが使われている箇所は少ない。GoコアメンバのAndrew Gerrandさんもそのスレッドで、いままでにrecoverを書いたのは片手で数えられるくらいしかないといっているくらいなので、とりあえず使わなくてよいという認識で良さそうだ。

特に注意したいのが、パッケージのAPIとしてpanicを使うようなやり方だ。JavaのFileReaderみたいな「この関数はファイルがオープンできなかったときにXXXという例外を投げます」というようなAPIを用意するのは完全に間違っているのでやらないこと。
Macにパッケージで入れたNode.jsをアンインストールする


# はじめに

こんにちは。インフラエンジニアレベル１の[f_prg](http://twitter.com/f_prg "f_prg")です。
nvmを使おうとしたところ、私のMacには既にpkgファイルからダウンロードしたnodeを使っていたので
削除した際の内容を紹介しようと思います。

# アンインストール
## コマンド
下記コマンドでアンインストールできます。

```bash
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
```

# まとめ
私は最初なんかWarningが出てきまして２回目で成功しました。
コマンドをコピペしてやったので、sudoでパスワード確認が通らなかった部分があったようです。
一回sudoをしてパスワード確認が入らないようにしておくとよいと思います。

# 参考資料・リンク
[http://stackoverflow.com/questions/9044788/how-do-i-uninstall-nodejs-installed-from-pkg-mac-os-x](http://stackoverflow.com/questions/9044788/how-do-i-uninstall-nodejs-installed-from-pkg-mac-os-x "http://stackoverflow.com/questions/9044788/how-do-i-uninstall-nodejs-installed-from-pkg-mac-os-x")
rbenv環境でBundlerを使ってgemを管理する

ともあれBundlerをインストール。

	$ rbenv exec gem install bundler
	$ rbenv rehash

Gemfileを作成する。

	$ rbenv exec bundle init

Gemfileを編集する。

```Gemfile
source "https://rubygems.org"

gem "sinatra"
gem "pry"
```

gemをインストールする。

	$ rbenv exec bundle install --path vendor/bundle

インストールされたgemを確認する。

	$ bundle list
        Gems included by the bundle:
          * bundler (1.7.2)
          * rack (1.5.2)
          * rack-protection (1.5.3)
          * sinatra (1.4.5)
          * tilt (1.4.1)

コマンドを実行する。

	$ rbenv exec bundle exec pry
エコーエリアや *Messages* バッファにメッセージを表示させたくない

`message`を呼んでもエコーエリアや`*Messages*`バッファにメッセージを表示させたくない場合があります。

具体的には`run-with-idle-timer`を使って`recentf-save-list`をアイドル時に自動的に実行させるようにしているのですが、実行時に`Wrote /home/itiut/.emacs.d/.recentf`というのがいちいちエコーエリアに表示されて少しうるさく感じます。

方法
----
`defadvice`を使って`message`をフックさせて何かするとかも考えられるのですが、わりとベーシックな関数だと思われるのであまり弄りたくありません。

マクロの`with-temp-message`を使えばそれっぽく見せることができました。
`(with-temp-message MESSAGE &rest BODY)`は、`BODY`を実行している間は`MESSAGE`をエコーエリアに表示させておき、`BODY`の実行が完了したらエコーエリアに元のメッセージを復元してくれるというものです。

`MESSAGE`に`(current-message)`で現在のメッセージをセットすれば、`BODY`の実行時にも現在のメッセージが引き継がれ、`BODY`内で`message`が呼ばれても`BODY`の実行が一瞬で完了するようであれば、あたかもメッセージがエコーエリアに表示されなかったように見えます。

そして`with-temp-message`を使うときに`message-log-max`を`nil`にしておくと、メッセージは`*Messages*`バッファに追記されません。

以上を元に`with-suppressed-message`というマクロを作成しました。

```lisp
(defmacro with-suppressed-message (&rest body)
  "Suppress new messages temporarily in the echo area and the `*Messages*' buffer while BODY is evaluated."
  (declare (indent 0))
  (let ((message-log-max nil))
    `(with-temp-message (or (current-message) "") ,@body)))
```

`with-temp-message`では`MESSAGE`が`nil`のときは元のメッセージをエコーエリアに復元してくないので、`(current-message)`が`nil`となる場合には空文字列を`MESSAGE`にセットしています。

使用例
----
`with-suppressed-message`中で`message`を呼んでも、メッセージが表示されていないように見えます。

```lisp
(with-suppressed-message
  (message "foo")
  (message "bar")
  (message "baz"))
```

冒頭の`run-with-idle-timer`の部分はこうなりました。

```lisp
(run-with-idle-timer 30 t '(lambda ()
                             (with-suppressed-message (recentf-save-list))))
```
Browser-renderable Geospatial Data Formats


| Encoding               | Tiled | Binary | Format |
|:-----------------------|:------|:-------|:-------|
| KML                    | no    | no     | XML    |
| GeoJSON                | no    | no     | JSON   |
| CZML                   | no    | no     | JSON   |
| TopoJSON               | no    | no     | JSON   |
| Geobuf                 | no    | yes    | Protocol Buffer |
| GeoJSON Tile           | yes   | no     | JSON   |
| TopoJSON Tile          | yes   | no     | JSON   |
| vector-tile-spec (MVT) | yes   | yes    | Protocol Buffer |
ISO 19136 の Scope について

ISO 19136 Geography Markup Language の「1 Scope」の第一段落は、次のようになっている。

The Geography Markup Language (GML) is an __XML encoding__ in compliance with ISO 19118 for the transport and storage of geographic information __modelled according to the conceptual framework used in the ISO 19100 series of International Standards__ and including both the spatial and non-spatial properties of geographic features.


規格の Scope（適用範囲）は特許の請求項のようなものではないかと思っており、Scope が広い方が利用範囲が広くなるが、上記のような書かれ方の場合、用途が XML を求めない場合には、また、19100シリーズで使われている概念的モデリングフレームワークが適用できない場合には、適用範囲外ということになるのではないだろうか。適用範囲外とあらば、WTO規定を背景にしたISの影響力も及ばなくなってしまうのではないだろうか。

例えば、タグアーキテクチャかつ用途がJSONを求める場合には、明らかにGMLのScope外になってしまい、よって「GMLに従っていない」というよりは「GMLに準拠しようにもできない」という形になる。卵が従うべきルールにみかんが従いようがないというのと同じだ。
Unity+iOSでエラーになるLINQのまとめ

# まとめ

　以前Unityでは、AOTコンパイラの不具合により、iOSなどAOTコンパイルが必要なプラットフォームではいくつかのLINQメソッドを使うと実行時例外が発生することがありました。

　現在Unityでは、かつてAOTコンパイルが行われていたプラットフォームで、IL2CPPという技術が使われています。

　私が把握している限り、IL2CPPでは本投稿「Unity+iOSでエラーになるLINQのまとめ」で紹介したメソッドは、問題なく使えているようです。そのため本投稿の記事本文は、削除しました。

　過去の内容を見たい場合は、[編集履歴](http://qiita.com/RyotaMurohoshi/items/6fb02e50d9e08b487f47/revisions)よりご覧ください。
スクロールイベントを封じる方法


Google Glass
https://www.google.com/glass/start/

のサイトのように、ユーザのスクロール入力を制御した
インターフェースのサイトを設計したいとき、
まずユーザのスクロール入力によるデフォルトの挙動を防ぐ必要があります。

つまり、スクロールによって画面が上下しないようにするには、

```js
$(window).on('scroll', function(){
  window.scrollTo(0, 0);
});
```

としてあげることで実現できます。
差分ファイル作るときにgitで特定の文字が含まれるファイル名を除外したいときはコレ。


.gitattributesが上手く動かせなかったので、
差分ファイルのパスリスト取得後にsedで除外処理書いたら上手くいった。

もっとうまいやり方ありそう…。


```bash:test
git archive --format=zip --prefix=output_dir_name/ HEAD `git diff --name-only HEAD コミット | sed '/除外テキスト/d'` -o ../output.zip


# /path/to/fuga_tpl.htmlを除外
git archive --format=zip --prefix=output_dir_name/ HEAD `git diff --name-only HEAD コミット | sed '/_tpl*/d'` -o ../output.zip

```



### 人をダメにするショートカット （textExpander）

![140902_0037_.png](https://qiita-image-store.s3.amazonaws.com/0/5472/69387fdd-fb50-70de-2ebc-69628aa65792.png "140902_0037_.png")


```bash:textExpander

# ;nouhin

git archive --format=zip --prefix=%y%m%d_%filltext:name=案件名%_nouhin/ %filltext:name=ブランチ名:default=HEAD% `git diff --name-only %filltext:name=ブランチ名:default=HEAD% %filltext:name=commitid:default=% | sed '/%filltext:name=除外テキスト:default=_tpl*%/d'` -o ../%y%m%d_%filltext:name=案件名%_nouhin.zip


```
ExpressでViewとかEngineをカスタマイズする方法

[vulcanize-middleware](https://github.com/k2wanko/vulcanize-middleware)を作る時、

JadeとかレンダリングしたHTMLを送信前に取得するにはどうすればいいんだろー

とか　思いながらexpressを調べてた時に知ったことをメモしときます。


# 独自のtemplate engineを使う - [app.engine(ext, callback)](http://expressjs.com/4x/api.html#app.engine)

jadeやejsやhoganやhandlebarsなど様々なHTMLを簡単に書くためのテンプレートエンジンが色々あります。

「よっしゃ！いっちょオレオレテンプレートエンジン作ったる！」と思い立った時こうすることで作ることができます。

```js:app.js
// 第一引数にfileの拡張子
// 第二引数に関数を入れます。
app.engine('oreno', function(path, options, fn){
  // ToDo: 最高のHTMLテンプレートの実装
});

```

pathにはソースファイルのフルパスが入ります。

第三引数のfunctionの第二引数にHTMLを入れて実行することで完了です。

htmlを返すのはnode.jsでお馴染みのやり方で。

```js
//parseが成功なら
return fn(null, html);

//失敗なら
fn(new Error(/*Error Message*/));

```

実装ができたら以下のようにファイルを`app.set('views', path);`で指定した
ディレクトリの下に作成すればOKです。

```:index.oreno

俺の考えた最強のテンプレートエンジン！

```

ちなみに　もし　パッケージを公開する場合は拡張子名でパッケージを登録し

以下のコードのように`__express`に関数をセットするらしいです。

```js:oreno.js

exports.__express = function(path, options, fn){
  // ToDo: 最高のHTMLテンプレートの実装
};

```

以下のコードで自動でrequireして使ってくれます。

```shell-session
$ npm install -save oreno
```

```js:app.js
app.set('view engine', 'oreno');
```


# 独自のカスタムViewを使う

独自Viewのメリットがいまいちわからないんですが
サンプルではgithubに置いてるファイルのプロキシサーバーにする感じでした。

ちなみに自動でテンプレートエンジンを呼んでくれるのはこのViewのおかげです。

独自Viewを定義するにはView#constructorとView#renderを実装すればいいようです。

```js
// デフォルトのViewの取得方法
var DefaultView = app.get('view');

var oreno = require('oreno').__express;

var CustomView = function(){

  function getAbsPath(root, name) {
    //いい感じにファイルの絶対パスを取得して返す
  }

  function CustomView(name, options) {
    this.path = getAbsPath(options.root, name);
  }

  CustomView.prototype.render = function(options, fn){
    oreno(this.path, options, fn);
  };

  return CustomView;
};

app.set('view', CustomView);

```

# まとめ

app.engineとデフォルトのViewの振る舞いをおさえとけばテンプレートエンジンを作るときも安心ですね。

まぁ一番上で紹介したvulcanize-middlewareに関してはちっともここらへん触れなくても実装できるっぽかったですがorz
Terraformで設定するdigitaloceanのパラメータ一覧


erraformで設定するdigitaloceanのパラメータの値がわからなかったのでまとめました。

```
resource "digitalocean_droplet" "node" {
    image = "ubuntu-14-04-x64"  // images
    name = "xxxxx"
    region = "sgp1"  // regison
    size = "512mb"  // size
}
```

## 取得方法
[digitalocean api] (https://developers.digitalocean.com/)

## regions
### curl
> curl -X GET "https://api.digitalocean.com/v2/sizes" -H "Authorization: Bearer $TOKEN"

### regions一覧(JSON抜粋)
``` 
"slug":"nyc1"
"slug":"ams1"
"slug":"sfo1"
"slug":"nyc2"
"slug":"ams2"
"slug":"sgp1"
"slug":"lon1"
"slug":"nyc3"
```

## size
### curl
> curl -X GET "https://api.digitalocean.com/v2/sizes" -H "Authorization: Bearer $TOKEN"

### size一覧(JSON抜粋)
```
"slug":"512mb",
"slug":"1gb",
"slug":"2gb",
"slug":"4gb",
"slug":"8gb",
"slug":"16gb",
"slug":"32gb",
"slug":"48gb",
"slug":"64gb",
```

## images
### curl
> curl -X GET "https://api.digitalocean.com/v2/images" -H "Authorization: Bearer $TOKEN"

### images一覧(JSON抜粋)
```
"slug":"ruby-on-rails"
"slug":"node"
"slug":"django"
"slug":"lamp"
"slug":"lemp"
"slug":"docker"
"slug":"mean"
"slug":"dokku"
"slug":"gitlab"
"slug":"ghost"
"slug":"centos-5-8-x64"
"slug":"centos-5-8-x32"
"slug":"centos-6-4-x32"
"slug":"centos-6-4-x64"
"slug":"fedora-19-x32"
"slug":"fedora-19-x64"
"slug":"fedora-20-x32"
"slug":"fedora-20-x64"
"slug":"centos-6-5-x64"
"slug":"centos-6-5-x32"
"slug":"centos-7-0-x64"
"slug":"ubuntu-14-04-x64"
"slug":"ubuntu-14-04-x32"
"slug":"debian-7-0-x64"
"slug":"debian-7-0-x32"
"slug":"debian-6-0-x32"
"slug":"debian-6-0-x64"
"slug":"ubuntu-10-04-x32"
"slug":"ubuntu-10-04-x64"
"slug":"ubuntu-12-04-x64"
"slug":"ubuntu-12-04-x32"

```
Arduino UNO + Sidekick Basic Kitでファミマの入店音を演奏させる


先日千石電商にてArduino UNO + Sidekick Basic Kitの入ったArduino スターターキットを購入しました．
作曲を個人的にやっているのですが，Buzzerが入っていたのがとても気になったので早速いじってみました．
ということで，今回はArduino UNOとBuzzerを使ってファミマの入店音を再現してみたいと思います．

回路は次のようになります：

[http://www.seeedstudio.com/wiki/Arduino_Sidekick_Basic_Kit](http://www.seeedstudio.com/wiki/Arduino_Sidekick_Basic_Kit) の "5_Music"

```Arduino_1.0.5 

#define NOTE_A 440
#define NOTE_B 493
#define NOTE_Cis 554
#define NOTE_D 587
#define NOTE_E 659
#define NOTE_Fis 739
#define NOTE_Gis 830
#define NOTE_A2 880
 
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.125
#define SIXTEENTH 0.625
 
// notes in the melody:
int tune[] =
{
    NOTE_Fis, NOTE_D, NOTE_A, NOTE_D, NOTE_E, NOTE_A2,
    NOTE_E, NOTE_Fis, NOTE_E, NOTE_A, NOTE_D
};                                    
/* note durations: 1 = one note*/
 
float duration[]=
{1,1,1,1,1,3,
 1,1,1,1,4};
int length;   
int tonePin=11;                // buzzer pin
void setup()
{ Serial.begin(9600);
    pinMode(tonePin,OUTPUT);   //  initialize the digital pin as an output
    length = sizeof(tune)/sizeof(tune[0]);
}
void loop()
{
    for(int x=0;x<length;x++)
    {tone(tonePin,tune[x]);
        delay(300*duration[(x%100)]);    // to distinguish the notes, set a minimum time between them.
 
        noTone(tonePin); // stop the tone playing:
    }
}

```

Arduinoとても楽しいですね！いろいろやってみたいと思います！

[実際に動かした動画](https://vine.co/v/OBthbK6ZAM3)
AWSシンプルアイコンをGraphviz等で使うときのTIPS

## 概要

Amazonが無償提供しているAWSシンプルアイコンのeps / svgを使うと、AWSの構成図等をGraphviz等のソフトウェアで描くことができる([Pandoc+beamer+GraphvizでAWSの図を描く](http://qiita.com/ooharak/items/78f79fe8a57668550a82)参照)。
ただそのさい多少のTIPSがあるのでまとめる。

## ファイル名

ささいな点だが、AWSからダウンロードしたままのファイル名は`Compute & Networking_Elastic Load Balancing.eps`のように空白を含んでいて扱いづらいので、私はelb.epsなどのように適宜リネームして使っている。

~~~sh
$ find ~/Downloads/AWS_Simple_Icons_svg_eps/ -name '*Load\ Balancing.eps' -exec cp {} elb-org.eps \;
~~~

## EPSの形式

AWSアイコンのepsファイルは、epsに対応しているはずのGraphvizなどの一部のソフトウェアでは正しく扱えないことがある。

これはこのファイルが実際にはDOS EPS Binaryとよばれる形式であるため。dosepsbinというツールを使うと、DOS EPS Binary形式からGraphviz等が読み込めるepsを抽出することができる。

~~~sh
$ dosepsbin --eps-file elb.eps elb-org.eps
~~~

## 余白

AWSアイコンはデフォルトでは余白に囲まれており、そのままだとGraphviz等でレイアウトしたときに下図のorgのように納まりが悪いため、下図fitのようにフィットさせるべく、余白をトリムする必要がある。

![k.png](https://qiita-image-store.s3.amazonaws.com/0/53185/e2534d2c-5d6b-fa8e-1fca-257d48d72532.png)

私はepsをpngに変換したものとsvgを使っているので、この２つについてトリム方法を紹介する。

### pngのトリム

有名なImageMagickが使える。epsからの変換を含めて書くと次の通り。

~~~sh
$ for n in *.eps; do gs -dNOPAUSE -dBATCH \
 -q -sDEVICE=pngalpha -dEPSCrop -sOutputFile=- -r72 $n \
 | convert -trim - ${n%eps}png; done
~~~

### svgのトリム (解決)

色々調べたが、SVGを直接トリムしようとすると[Inkscapeを使った方法](http://graphicdesign.stackexchange.com/questions/22326/how-to-fit-svg-drawings-to-their-canvas-on-the-command-line)ぐらいしかない。

2014.9.6: 今回対象としているAWSシンプルアイコンは幸いにもepsでも提供されている。epsについては、Ghostscriptのbboxデバイスを使うことで、トリムされたバウンディングボックスを得ることができる。さらにGhostscriptの出力デバイスにはsvgデバイスがあるので、結局、これを組み合わせることで、コマンドラインだけでトリムしたSVGを得ることができた。

まずbboxをもとにトリムしたepsを作成するスクリプトを示す。
https://gist.github.com/ooharak/214cfc1b36f73befcdbb

これで得たepsに対し以下を実行することで、トリムしたSVGが得られる。

~~~sh
./epstrim.sh elb.eps | \
  gs -dNOPAUSE -dBATCH -q -sDEVICE=svg -dEPSCrop -sOutputFile=out.svg -
~~~
iPhoneアプリバージョンアップ申請メモ ※2015/1/10更新

※ iTunes Connect上でのフローが度々変わるので気づいた度にアップデートしていきます。変更に気づいた方からの編集リクエスト歓迎します。

## __XcodeからアプリをiOS App StoreにSubmit__

1. Xcodeを立ちあげ、Product > Archiveをクリック
2. 最新のArchiveを選択し[Validate...]ボタンをクリック
3. SubmitしたいAppleIDを選択して[Choose]ボタンをクリック
4. [Validate]ボタンをクリック
5. Validation Successfulとなったら[Done]をクリック
6. [Submit...]ボタンをクリック
7. SubmitしたいAppleIDを選択して[Choose]ボタンをクリック
8. [Submit]ボタンをクリック
9. Submission Successfulとなったら[Done]をクリック

## __iTunes Connectから更新情報を作成する__
1. [iTunes Connect](https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa) の[My Apps](https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/ra/ng/app)にアクセス
2. 更新したいアプリ選択
3. [New Version]ボタンをクリック
4. 新しいバージョンの番号を記入して[Create]ボタンクリック
5. What's New in This Versionに変更内容を記入
6. 必要であればその他内容も編集して保存する
7. Buildの項目の+ボタンをクリック
8. Submitしたbuildバージョンを選択し[Create]ボタンをクリック
9. [Save]ボタンをクリック
10. [Submit for Reveiw]ボタンをクリック
11. 質問項目を聞かれるので適切に選択し[Submit]ボタンをクリック
12. 現行バージョンの隣に新しいバージョンでWaiting For Reviewとなっているのを確認

## __参考: 特急レビューをお願いする（緊急時のみ推奨）__

バグ修正の時には超特急レビューをする方法があるようです。
こちらの記事などを参考にしてみてください。
http://qiita.com/annaok/items/a9d971bcf0005719aa22
Vagrantとは

##お手軽に仮想環境を作れる、簡単開発環境構築。
VagrantはVirtualBoxのフロントエンド


##べんりなとこ

* 簡単に開発用仮想マシンを構築できる
* 簡単にテスト環境を作れる
* 簡単に作れるので簡単に開発環境を捨てられる
* 簡単に実行環境を開発と本番で揃えられる
* 簡単にチームの全員が同じ開発環境を使える
* サーバー管理ツール「Chef」「Puppet」と連携できる


##もう少し具体的に？
```
「あ？俺のWinでは動いたんだけど？」「おいらのmacたんだと動かない！」
```

```
「マニュアルできた！」
↓アップデート
↓「マニュアル更新しなきゃ！」
↓アップデート
「うわああああああ」
```

なんてことがなくなる?
Rails(ORM=Mongoid)でランダムに1件レコードを取得する方法


## scopeを1行設定するだけの簡単実装
```ruby:model.rb
class Model
  include Mongoid::Document
  
  scope :random, -> { skip(rand(self.count)) }

end
```

```ruby:1件ランダムに取得する
% rails c
001 > Model.random.first
```

```ruby:条件にマッチした中からランダムに取得する
% rails c
001 > Model.where(:age.gt => 18).random.first
```

## 実行した環境情報
### OS, Kernel
```shell:inxi
% inxi -SM
System:    Host: hakuba.vps.sakura.ne.jp Kernel: 2.6.32-279.11.1.el6.x86_64 x86_64 (64 bit)
           Console: tty 5 Distro: CentOS release 6.5 (Final)
Machine:   System: Red Hat product: KVM v: RHEL 6.2.0 PC
           Mobo: N/A model: N/A Bios: Sea v: 0.5.1 date: 01/01/2007
```

### Ruby, Rails
```shell:rake_about
% rake about
About your application's environment
Ruby version             2.1.2-p95 (x86_64-linux)
RubyGems version         2.2.2
Rack version             1.5
Rails version            4.1.5
```

### mongoid
[mongoid : 4.0.0 - Track your Gems at VersionEye](https://www.versioneye.com/ruby/mongoid/4.0.0)

![Rails (800×450)](http://lorempixel.com/800/450/cats/Rails/)
テキストを音声にするサービス

[VoiceText Web API](https://cloud.voicetext.jp/webapi)
リクエストを投げるだけでMP3にしてくれるというナイスなサービスを見つけたのでやってみます。

ただ[二次利用の規約](https://cloud.voicetext.jp/webapi/terms-of-service)が微妙なので、どこまで使っていいかわからないんですよね。

> 本サービスで作成した音声データの商用利用、二次利用及び配布する行為は禁止されております。
> (3)本サービスで作成した音声データの商用利用、及び二次利用する行為(第三者へ再生を超えた保存目的での提供など)

例えばゆっくり実況のような用途には使えないように見えます。
なのでせっかく声を取得したとしてもほとんど使い道がないという。

あと既に[PHPのライブラリ](https://cloud.voicetext.jp/webapi/docs/libraries)がふたつもあるので一から実装する意味はないのですが、簡単なのでまあいいや。

```php
<?php
	// 設定
	const API_URL = 'https://api.voicetext.jp/v1/tts';
	const API_KEY = 'hoge:';
	
	// 音声パラメータ https://cloud.voicetext.jp/webapi/docs/api
	$post = [
		'text'         =>'こんにちは',
		'speaker'      =>'haruka', // show / haruka / hikari / takeru
		'emotion'      =>'happiness', // happiness / anger / sadness
		'emotion_level'=>'1', // 1-2
		'pitch'        =>'100', // 50-200
		'speed'        =>'100', // 50-200
		'volume'       =>'100', // 50-200
	];
	
	// CURL
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, API_URL);
	curl_setopt($ch, CURLOPT_USERPWD, API_KEY);
	curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
	curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
	curl_setopt($ch, CURLOPT_HEADER, false);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
	
	$data = curl_exec($ch);
	curl_close($ch);

	file_put_contents('hello.mp3', $data);
```

はい、びっくりするほど簡単でした。
まあレスポンスを全く見てないなど手抜き感満載ですが、どうせ公開するわけでもないしかまわないでしょう。

で、肝心の声質はというと、完全棒読みのゆっくりよりはずっと感情がこもっていますが、調声が可能なVOICEROIDにはやはり全く敵いません。
どちらにも振り切れてないからいまいち使いづらいというか、そもそも何処で使っていいのかよくわからない。
InstanceStoreとElasticBlockStore要点まとめ

[[AWSマイスターシリーズ] Instance Store & Elastic Block Store](http://www.slideshare.net/AmazonWebServicesJapan/aws-instance-store-e)

##AWS上のストレージサービス

|  | EC2にマウント | バックアップ | 複数地点での冗長化 | 揮発性 |
|:-----------|:------------:|:------------:|:------------:|:------------:|
| InstanceStorage|o|||o|
| EBS|o |
| StorageGateway|o |o|
| S3 ||o|o|
| Glacier||o|o|
|kinesis|||o|
|SQS|||o|
|RDS|||o|
|DynamoDB|||o|
|SimpleDB|||o|
|ElasticCache||||o|

##InstanceStore　ポイント

- サイズ、個数、ディスクタイプ等がEC2インスタンスタイプで決まっている
- ローカルディスクのためネットワークの影響を受けにくい
- インスタンスを停止するとデータは消去される
**＊再起動の場合は消えない**
- スナップショット機能はなし
- インスタンス間での付け替え、共有不可
- 一つのEC2に対して複数のアタッチは可能

###EC2に接続するEphemeralDisk数の変更
EC2起動後はInstanceTypeを変更しても、InstanceStoreは変更できないため再度AMIから選択する必要がある。
サイズの変更はできないので、複数のDiskをOSからストライブし拡張する。

###スワップ領域としての活用
※AWSは物理環境では無いため、メモリのオーバーコミットができない。
→メモリ容量の小さいt1.microとc1.mediumのLinuxでは900MBのデバイスが割り当てされておりSwapOnすることで利用が可能になる

###EphemeralDiskのBlockDeviceMappingの表示
EC2は確認できない。AMIは可能。
起動中のEC2のBlockDeviceMappingを確認するには以下コマンドからメタデータ情報を参照する

```
$ GET http://{pubricIP}/latest/meta-data/block-device-mapping/
```

###M3インスタンスでのInstanceStore
新型CPUを搭載したインスタンスタイプ、従来はEBSのみの接続だったがSSDが選択可能になった。

##EBS　ポイント

- １GBから１TBまで
- データは永続的に保存される
- 一つのEC2に複数のEBSをアタッチできる
- AZに存在する
- 他のEC2に付け替え可能
- スナップショットから他のAZにEBSを複製可能
- ネットワーク接続だがネットワークを意識せず利用できる

###スナップショットとは

- EBSの特定時点のスナップショットをS3に保存(安価な長期保存ができる)
- 2回目以降は差分のみS3に保存される
- スナップショットのバージョン管理ができる
- EBSボリュームを作成・復元ができる（AZまたぐのも可能）
- AWSアカウント間での共有が可能
- EBSのサイズ変更はスナップショットを活用する

###初のリージョン間機能　SnapshotCopy
作成したスナップショットをリージョン内、リージョン間問わずコピーする機能
対象：EBS、MarketPlace、VMimport経由のAMI、StorageGateway、RDS、Redshiftのスナップショット

###Provisioned IOPS

- IOPSが指定できるEBS（EBS-Optimizedインスタンスの利用を前提としている）
- IOPS値は100から4000の間で1刻みで指定可能（通常は2000まで）
- EC2の作成時に合わせて作成

###EBS-OptimizedInstance

- EBSようにネットワーク帯域を最適化
- 確保される帯域500Mbps〜2000Mbps（HPC以外・従来は1000Mbpsまで）
- StandardEBS選択時にも効果あり
- ProvisionedIOPSと組み合わせることでI/Oが最適化される
- 対応インスタンスタイプが大幅に増加した

###PIOPSとEBS-Optimizedの組み合わせ
StandardEBS　-　EBS-Optimized EC2 →　IOが安定
PIOPS EBS - EBS-Optimized EC2　→　高速なIOが安定
PIOPS EBS - EBS-Optimized EC2 →　非推奨
Qiitaに書くときに示しておきたい環境情報


## はじめに
自分の場合、CentOS上でRailsを動かしていることが多いので、OSディストリビューションやカーネル(32bit or 64bit)情報、rubyやRailsのバージョンなどを示すのが良いと思う。

参考にするときに環境情報が分からないと困ることがあるので、みんな載せると良いと思う。フレームワークや言語によってちょっとずつ違うと思うので修正すると良いんじゃないかな。

まずは自分から載せてみよう。

## 環境情報
### OS, Kernel
```shell:inxi
% inxi -SM
System:    Host: hakuba.vps.sakura.ne.jp Kernel: 2.6.32-279.11.1.el6.x86_64 x86_64 (64 bit)
           Console: tty 5 Distro: CentOS release 6.5 (Final)
Machine:   System: Red Hat product: KVM v: RHEL 6.2.0 PC
           Mobo: N/A model: N/A Bios: Sea v: 0.5.1 date: 01/01/2007
```

### Ruby, Rails
```shell:rake_about
% rake about
About your application's environment
Ruby version             2.1.2-p95 (x86_64-linux)
RubyGems version         2.2.2
Rack version             1.5
Rails version            4.1.5
```

## OSやカーネル情報を調べる便利コマンド
[Linuxのハードウェアに関する詳細情報を取得する『Inxi』コマンド | 俺的備忘録 〜なんかいろいろ〜](http://orebibou.com/2014/08/linux%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%A9%B3%E7%B4%B0%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%80%8Einxi/)を参考に`inxi`をインストールして使ってる。

```shell:Install_inxi
% sudo yum -y install inxi --enablerepo=epel

Installed:
  inxi.noarch 0:2.1.90-1.el6

Dependency Installed:
  hddtemp.x86_64 0:0.3-0.20.beta15.el6   libXxf86dga.x86_64 0:1.1.3-2.el6
  libXxf86misc.x86_64 0:1.0.3-4.el6      libdmx.x86_64 0:1.1.2-2.el6
  lm_sensors.x86_64 0:3.1.1-17.el6       lm_sensors-libs.x86_64 0:3.1.1-17.el6
  xorg-x11-utils.x86_64 0:7.5-6.el6

Complete!
```
Brainf*ck の派生言語作成ツール orenono gem で「デスマーチ言語」を作ってみる

# Brainf*ck の派生言語作成ツール orenono gem で「デスマーチ言語」を作ってみる

## 概要
Brainf*ck の派生言語作成ツール orenono gem で「デスマーチ言語」を作ってみます。

orenono gem については下記記事参照。
[Ruby で Brainf*ck の派生言語を作成するための gem 『orenono』を作成してみた](http://qiita.com/tbpgr/items/9d68fdb0d0e7bbccdd2c)

## 前提

orenono gem をインストール済み

## 文法定義

orenono init で Orenonofile を生成し、中身を編集して文法を定義します。

* Orenonofile を生成する

~~~bash
$ orenono i
$ ls Orenonofile
Orenonofile
~~~

* Orenonofile を編集する

~~~
# encoding: utf-8

increment "1時間残業追加"
decrement "1時間サービス残業"
start_loop "勤務開始"
end_loop "勤務終了"
next_cursol "次のタスク"
previous_cursol "前のタスク"
display "納品"
read "要件追加"
~~~

## デスマーチ言語 プログラム

~~~text:hello_world.bf
1時間残業追加1時間残業追加1時間残業追加1時間残業追加1時間残業追加
1時間残業追加1時間残業追加1時間残業追加1時間残業追加
勤務開始
	次のタスク
		1時間残業追加1時間残業追加1時間残業追加1時間残業追加1時間残業追加
		1時間残業追加1時間残業追加1時間残業追加

	次のタスク
		1時間残業追加1時間残業追加1時間残業追加1時間残業追加1時間残業追加
		1時間残業追加1時間残業追加1時間残業追加1時間残業追加1時間残業追加
		1時間残業追加

	次のタスク
		1時間残業追加1時間残業追加1時間残業追加1時間残業追加1時間残業追加
	前のタスク
	前のタスク
	前のタスク
		1時間サービス残業
勤務終了

次のタスク
	納品 # => H
次のタスク
	1時間残業追加1時間残業追加
		納品 # => e
	1時間残業追加1時間残業追加1時間残業追加1時間残業追加1時間残業追加
	1時間残業追加1時間残業追加
		納品 # => l
		納品 # => l
	1時間残業追加1時間残業追加1時間残業追加
		納品 # => o
次のタスク
	1時間サービス残業
		納品 # => ,
	1時間サービス残業1時間サービス残業1時間サービス残業1時間サービス残業1時間サービス残業
	1時間サービス残業1時間サービス残業1時間サービス残業1時間サービス残業1時間サービス残業
	1時間サービス残業1時間サービス残業
		納品 # => space
前のタスク
	1時間残業追加1時間残業追加1時間残業追加1時間残業追加1時間残業追加
	1時間残業追加1時間残業追加1時間残業追加
		納品 # => w
	1時間サービス残業1時間サービス残業1時間サービス残業1時間サービス残業1時間サービス残業
	1時間サービス残業1時間サービス残業1時間サービス残業
		納品 # => o
	1時間残業追加1時間残業追加1時間残業追加
		納品 # => r
	1時間サービス残業1時間サービス残業1時間サービス残業1時間サービス残業1時間サービス残業
	1時間サービス残業
		納品 # => l
	1時間サービス残業1時間サービス残業1時間サービス残業1時間サービス残業1時間サービス残業
	1時間サービス残業1時間サービス残業1時間サービス残業
		納品 # => d
	次のタスク
	1時間残業追加
		納品 # => !
~~~

* インデントは読みやすさのために追加しているだけで、処理には不要です。
* 8つの用語以外は無視されるので、コメント扱いになっています。 ` #=> H` などはコメント。

## 実行結果

~~~bash
$ orenono e hello_world.bf
Hello, world!
~~~

## 参考
サンプルと等価な Brainf*ck のソースコード

~~~
+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
------------.<++++++++.--------.+++.------.--------.>+.
~~~

### orenonoスライドショー
http://tbpgr.github.io/orenono_slide/#/

## 参照
* [Ruby で Brainf*ck の派生言語を作成するための gem 『orenono』を作成してみた](http://qiita.com/tbpgr/items/9d68fdb0d0e7bbccdd2c)
* [orenono gem GitHub](https://github.com/tbpgr/orenono)
* [orenono gem RubyGems](http://rubygems.org/gems/orenono)
システムの起動時にアプリを起動する


ググれば出てくるんだけど、情報が古いので書きなおしてみた。

## 全体

Android OS の起動が終わると ``android.intent.action.BOOT_COMPLETED`` がブロードキャストされるので、それを捕まえて任意の処理をする。


## 起動時に呼び出されるコード

ブロードキャストを捕まえたときに呼ばれるコード。``MyActivity`` を開始している。BroadcastReceiver から Activity を開始するには ``Intent.FLAG_ACTIVITY_NEW_TASK`` が必要なので注意。


```java:StartupReceiver.java
public class StartupReceiver extends BroadcastReceiver {
    private static final String TAG = "StartupReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "onReceive:" + MyApplication.data);
        Intent intentActivity = new Intent(context, MyActivity.class);
        intentActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intentActivity);
    }
}
```

## AndroidManifest.xml で受信登録

``StartupReceiver`` を登録する。
忘れちゃいけないのが ``android.permission.RECEIVE_BOOT_COMPLETED`` による権限の設定。これがないと受信できない。

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.amay077.reboottest" >

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MyActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>
        <receiver android:name=".StartupReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
    </application>

</manifest>
```

## 端末を再起動して試す

* [AndroidのBOOT_COMPLETEDの受信とテスト | 9ensanのLifeHack](http://9ensan.com/blog/smartphone/android/android-boot_completed-adb-shell-am-broadcast/)

で知った ``adb shell am broadcast -a android.intent.action.BOOT_COMPLETED`` は GenyMotion でも使えました。
``RECEIVE_BOOT_COMPLETED`` の位置によっては、テストが成功したりしなかったりだと書かれておられますが、上記の ``AndroidManifest.xml`` では、テストも実際の再起動も成功しました。

## 参考

* [システムの起動時にサービスを実行する « Tech Booster](http://techbooster.jpn.org/andriod/application/1100/)(2010年なのでだいぶ古い、要注意)
* [AndroidのBOOT_COMPLETEDの受信とテスト | 9ensanのLifeHack](http://9ensan.com/blog/smartphone/android/android-boot_completed-adb-shell-am-broadcast/)(2012年、まだまだ古い)
* [broadcastreceiver - BOOT_COMPLETED not working Android - Stack Overflow](http://stackoverflow.com/questions/20441308/boot-completed-not-working-android/20441442#20441442)(2013年、これなら何とか)
* [BOOT_COMPLETEDが受信出来ない - Google グループ](https://groups.google.com/forum/#!topic/android-group-japan/D1EKohMIji0) SDカードにインストールされるとこのブロードキャストを受信できないそうです
LaravelのルートフィルターでIP制限を実現する

##はじめに

Laravelで特定の機能にIP制限をかけてみます。今回は、ウェブサーバ側の設定ではなく、ルートフィルターで実現してみました。

## かいてみる

```php:app/config/app.php
// 略

/*
  |--------------------------------------------------------------------------
  | 管理画面情報
  |--------------------------------------------------------------------------
 */
'admin' => [
    'allowipaddresses' => ['127.0.0.1', '100.100.100.100'],
],

// 略
```

```php:filters.php
// 略

Route::filter('auth.allowipaddresses', function($request) {
    $clientIp = Request::getClientIp();
    $allowIpaddresses =Config::get('app.admin.allowipaddresses');
    if(!in_array($clientIp, $allowIpaddresses)){
        // 許可されていないIPアドレスからの接続はトップにリダイレクト
        return Redirect::to('/');
    }
});

// 略
```

```php:routes.php
// 略

/*
  |--------------------------------------------------------------------------
  | 管理画面
  |--------------------------------------------------------------------------
 */
Route::group(['before' => ['force.ssl', 'auth.allowipaddresses', 'auth.admin']], function() {
    Route::controller('admin', 'AdminController');
});

// 略
```

では、また！
AmazonのURLは短縮できる

Amazonで本のページのURLをDBで管理しようと思ったら、長かったので短縮できないか調べてみた。
※「[PHPでISBNを用いてAmazonAPIから本の情報を取得](http://qiita.com/na1412/items/1965d42a41b9eccd5126)」する際に使用しました。

##AmazonのURLを短縮してみる
###たとえばこんなURLを短縮
Amazonの商品ページ「[Amazon Web Services入門 ― 企業システムへの導入障壁を徹底解消](http://www.amazon.co.jp/Amazon-Web-Services入門-―-企業システムへの導入障壁を徹底解消/dp/4844336479)」という本のURLは

http://www.amazon.co.jp/Amazon-Web-Services入門-―-企業システムへの導入障壁を徹底解消/dp/4844336479

長い…
DBで管理するならできるだけ短くしたい！

ということで**短縮すると…**

http://www.amazon.co.jp/dp/4844336479

たったこれだけに！！！
さらに文字数も必ず**37文字**になるのでDBでの管理にも最適！

最初のURLのhttp://www.amazon.co.jp/
まではそのままで、「/dp」以降の数字10桁を後ろに繋げるだけでOK!
PHPならこんな感じ

```php
$bookURL = 'http://www.amazon.co.jp/Amazon-Web-Services入門-―-企業システムへの導入障壁を徹底解消/dp/4844336479';
$URL = substr($bookURL, 0, 24). substr($bookURL, -13);
```


###さらに短縮…
http://www.amazon.co.jp/
部分は短縮できて
http://amazon.jp/
になるんです

なので、最も短くすると
http://amazon.jp/dp/4844336479
と文字数が**30文字**に！

プログラムで作成する場合は
http://amazon.jp/dp/
までを決め打ちで作成し、
数字10桁は該当する商品のを取得し、後ろに繋げるといいと思います。


##ちなみに
「/dp」以降の数字10桁は何かというとASINと言い、
**「Amazon Standard Identification Number」**の略で、Amazon上での商品を管理する番号になります。
詳しくはAmazonの[ISBN/ASINについて](http://www.amazon.co.jp/gp/help/customer/display.html?nodeId=747416)を見て下さい。


以上で、「AmazonのURLを短縮してみた」でした！
jit-gruntがないといわれる

package.jsonにjit-gruntその他が追加されていてますので、npm installで変更を反映しようとしました。

```
npm install

略
npm WARN package.json jit-grunt@0.8.0 No README data
略
```
npm installを行いました。次にgruntコマンドを実行しました。

```
grunt test:unit
Loading "Gruntfile.coffee" tasks...ERROR
>> Error: Cannot find module 'jit-grunt'
Warning: Task "test:unit" not found. Use --force to continue.

Aborted due to warnings.
```
jit-gruntがないと言われます。

仕方ないのでjit-gruntだけ別に入れてみました。

```
npm install jit-grunt

略
npm WARN package.json karma-coffee-preprocessor@0.2.1 No README data
略
jit-grunt@0.8.0 node_modules/jit-grunt
```
もう一度gruntコマンドを試します。

```
grunt test:unit
Running "test:unit" (test) task

Running "clean:server" (clean) task
Cleaning .tmp...OK
略
```
今度はうまくいきました。なぜnpm installだけだと入らなかったのでしょうか(^o^;)
Node.jsのpackage.jsonのバージョン指定の"~（チルダ）"と"^（キャレット）"の違い

参考：https://www.npmjs.org/doc/misc/semver.html

1.2.3につける場合を例に説明する

# ~: マイナーバージョンは最新で、それ以外は固定
1.2.3 <= **~1.2.3** < 1.3.x


# ^:メジャーバージョンは固定で、それ以外は最新
1.2.3 <= **^1.2.3** < 2.x.y
ffmpegで動画の中に動画を表示する（実況中継の隅っこにある解説者の映像のような）


# はじめに

スポーツの実況中継などで、画面の隅っこに解説者の顔が映っているような映像ってありますよね。ここでは、そんな実況中継のように、動画の中に動画を表示する方法をメモします。

[完成イメージ](http://bit.ly/1tSVTVM)

※FFmpegの基本的な使い方については[動画処理の定番ツール「FFmpeg」ことはじめ](http://qiita.com/kitar/items/59f80bba2ca997e0f5e6)もご参考ください

# 準備

合成に利用する動画を用意し、それぞれ特定の時間帯だけを取り出したり、大きさを調整したりします。

## 動画を用意する

はじめに、合成するための動画を用意します。
このメモでは、YouTubeより以下の2つの動画を拝借することにします。

* [試合の動画](https://www.youtube.com/watch?v=YbAse4HVxc8) (2014 Clemson vs Ohio State-Orange Bowl Football Game)
* [解説者の動画](https://www.youtube.com/watch?v=AyLS9_odVSo) (Giraffe eating from a thorny acacia tree)

## 試合の動画を合成用に加工する

今回拝借した動画は3時間以上あるので、その中から10秒だけ取り出します。

```bash
ffmpeg -i football.mp4 -ss 1040 -t 10 football_trimmed.mp4
```

* -ss 開始秒数
* -t 切り取る秒数

試合の動画は加工後[こんな感じ](http://bit.ly/1tSYvmD)になりました。

## 解説者の動画を加工する

こちらもひとまず10秒だけ取り出します。

```bash
ffmpeg -i giraffe.mp4 -ss 24 -t 10 giraffe_trimmed.mp4
```

次に、画面の一部分を切り取ります。（できるだけ顔が大きく映るよう）

```bash
ffmpeg -i giraffe_trimmed.mp4 -vf crop=x=222:y=78:w=732:h=542 giraffe_cropped.mp4
```

* xとy 切り取るハコの左上の座標
* wとh 切り取るハコの大きさ

さらに、サイズを調整します。（解説者窓にしては大きすぎるので）

```bash
ffmpeg -i giraffe_cropped.mp4 -s 350x260 giraffe_resized.mp4
```

解説者の動画は加工後[こんな感じ](http://bit.ly/1tSYfDY)になりました。

# 合成

さて、準備ができたらあとは1コマンド叩くだけ。

合成！

```bash
ffmpeg -i football_trimmed.mp4 -vf "movie=giraffe_resized.mp4[inner]; [in][inner] overlay=910:440 [out]" combined.mp4
```

* overlay 動画を挿入する位置（解説者映像の左上の座標）

-

以上にて[このような動画](http://bit.ly/1tSVTVM)が出来上がります。
cpのオプションでバックアップを作成

ネットワークマウントとかだと、そもそもディスクアクセスに失敗することが危惧されるので、cpでさえバックアップを取っておきたい。

という時、`cp` のオプションでバックアップを作成できる:

```bash
cp --backup
```

デフォルトだと、バックアップファイル名は後ろに~が付くが、その辺も設定可能：
http://ameblo.jp/itboy/entry-11849277620.html
[rbenv]コマンド備忘録

##rbenvの使い方

・バージョンを確認

```
$rbenv -v
```

・現在利用しているrubyのバージョンを確認

```
$rbenv version
```

・インストール済みで利用可能なrubyのバージョンを表示

```
$rbenv versions
```

・デフォルトで利用するバージョンを指定

```
$rbenv global バージョン
```

・カレントディレクトリで利用したいバージョンを指定

```
$rbenv local バージョン
```

・インストール可能なバージョン一覧を表示

```
$rbenv install -l
```

・指定バージョンをインストール

```
$rbenv install バージョン
```

##rubyバージョン切り替え後の環境確認
・利用中のrubyに対応するgem内のコマンドラインツールを利用可能にする

```
$rbenv rehash
```

・利用しているrubyにおけるgemのインストール先を表示

```
$gem env
```

・Bundlerを利用しているときのgemのインストール先を表示

```
$bundle exec gem env
```


##チップス
デフォルトgem以外のgemを削除したい場合下記を実行
参考：http://stackoverflow.com/questions/15100496/uninstalling-all-gems-ruby-2-0-0

```language:sh
for i in `gem list --no-versions`; do gem uninstall -aIx $i; done
```
AWS SDK for iOSから直接SNSにEndpointを登録する方法

どこのサイトを見てもAWS SNSの利用方法に関して、GUIを使ったものや、サーバーを介した方法しか紹介ばかりだったので、AWS SDKから直接SNSにEndpointを登録する方法をご紹介します。
サーバーを介さずにEndpointを登録出来るため、小さなアプリの場合はわざわざサーバーを建てなくてもAWSでPush機能が完結します。
##そもそもSNSとは
SNSとはSimple Notification Serviceの略で、ざっくり言うと「簡単にPush通知のサーバーが建てれますよ」というサービスです。
SNSでは"$1/100万Push"という価格も魅力的です。

##はじめに
ほかのサイトでもかなり紹介されているので、本記事ではSNSにアプリケーションを建てる部分は完全に省略します。

[クラスメソッド様の記事がわかりやすいです](http://dev.classmethod.jp/cloud/aws-amazon-sns-mobile-push-ios/)

ざっくりな流れとしてはiOS Dev CenterでPush Notification用の証明書を取得して、その鍵情報をキーチェーンアクセスでp12型に変換します。あとはSNSのコンソールでCreateAppして貼り付けてあげれば完了です。

##まずはDeviceTokenを取得
アプリでPush通知を扱う際はapplication:didFinishLaunchingWithOptions:メソッドにPush通知を利用する事を登録する必要があります。

```Objective-C:AppDelegate.m
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeBadge|
     UIRemoteNotificationTypeSound|
     UIRemoteNotificationTypeAlert)];
```

すると以下のメソッドが呼ばれるようになるのでその中でPush通知をサーバーに登録していきましょう。

```Objective-C:AppDelegate.m
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
```

deviceTokenはNSData型な上、そのままString型に変換すると前後に<>が付くだけで無く、空白が入ってしまうので適当に整形する必要があります。
これは人によって好みがあると思うので、適宜整形して下さい。

```Objective-C:AppDelegate.m
NSString* token = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]
      stringByReplacingOccurrencesOfString: @">" withString: @""]
     stringByReplacingOccurrencesOfString: @" " withString: @""];
NSLog(@"%@",token);
```
これでdeviceTokenが取得出来たかと思います。

##SNSにデータを送信する
AWSSNSをクラスを利用する際はAWSSNS.hをインポートしてください。

```Objective-C:AppDelegate.h
#import <AWSiOSSDKv2/AWSSNS.h>
```

また、 **AWSCredentialsProviderプロトコルを実装し、accessKeyとsecretKeyプロパティを実装して下さい**

```Objective-C:AppDelegate.h
@interface AppDelegate : UIResponder <UIApplicationDelegate,AWSCredentialsProvider>

.
.
.

@property (nonatomic, strong) NSString *accessKey;
@property (nonatomic, strong) NSString *secretKey;

@end
```

あとはAWSSNSクラスのインスタンスを作り、その際にConfigurationにselfを指定する事で以下のように実装することができます。
もちろん他のクラスにアクセスキーなどをもたせればgitなどでの管理も楽になりますね。
登録したいデバイスの情報はAWSSNSCreatePlatformEndpointInputクラスのインスタンスを作成してプロパティに値を入れることで設定が可能です。


```Objective-C:AppDelegate.m
	self.accessKey = @"アクセスキー";
    self.secretKey = @"シークレットキー";
    AWSSNS* client = [[AWSSNS alloc]initWithConfiguration:
                      [AWSServiceConfiguration configurationWithRegion:AWSRegionAPNortheast1 credentialsProvider:self]];
    AWSSNSCreatePlatformEndpointInput* input = [AWSSNSCreatePlatformEndpointInput new];
    input.customUserData    = @"ユーザー情報";
    input.token             = token;
    input.platformApplicationArn = @"arn:aws:sns:ap-northeast-1:数字:app/APNS_SANDBOX/アプリ名";
    [client createPlatformEndpoint:input];

```

実際にSNSのコンソールを開いてみてデバイスの情報が入っている事を確認したらPublishして試してみてください。
ブックマークレットをドラッグ＆ドロップで登録するボタンを jQuery Mobile で作る


# こういうボタンが作れます
この [youtube](https://www.youtube.com/watch?v=KYJBMvfGMI8)のようにドラッグ＆ドロップでブックマークレットをブラウザに登録するボタンをつくります

# 概要
ブックマークレットをドラッグ＆ドロップで登録するUI は、ブックマークレットの a タグに CSS でボタン風の UI をあてるこことで実装することが多いですが、jQuery Mobile だと CSS を用意しなくても実装できます

# 例
下記で”ブックマーク文字列”を、bookmarklet の javascript と置き換えてください

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
	<title>ブックマークレットの登録</title>
	<meta name="viewport" content="width=device-width, initital-scale=1">
	<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.css" />
	<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
	<script src="custom-scripting.js"></script>
	<script src="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.js"></script>
</head>

<body>

<div data-role="page"> 
	  
<div data-role="header" data-position="fixed">
    <h1>ブックマークレットの登録</h1>
</div>

<div data-role="content" data-theme="c" class="no-cache">
<h2><p> 下のボタンをお気に入りバーやサイドバーにドラッグ&ドロップしてください</p></h2>
<a href="javascript:ブックマーク文字列" onclick="return false" data-role="button">お気に入りに登録されるタイトル</a>
</div>

<div data-role="footer" data-position="fixed">
    <h4>Copyright© とか</h4>
</div>
</div> <!-- page -->

</body>
</html>
```

# ポイント
以下の２つの属性を a タグに追加する
- data-role="button" ボタン風の UI にする属性
- onclick="return false" ドラッグ＆ドロップ用の挙動

# 制限
iOS の Safari では、ドラッグ＆ドロップができません
railsで複数の単語を複数のカラムに対して検索する方法

#利用例
userがaddressとnameを持っていて、「博多　田中」で検索したら「博多の田中さん」に該当するグループを出力したい場合。

#実装方法
ransackを使います

````none:Gemfile
  gem 'ransack'
````

````app/views/users/index.html.erb
<%= search_form_for @q, url: users_path do |f| %>
  <%= f.text_field :search_words %>
  <%= f.submit 'Search' %>
<% end %>
````

````app/controllers/users_controller.rb
def index
  words = params[:q].delete(:search_words) if params[:q].present?
  if words.present?
    params[:q][:groupings] = []
    words.split(/[ 　]/).each_with_index do |word, i| #全角空白と半角空白で切って、単語ごとに処理します
      params[:q][:groupings][i] = { name_or_address_cont: word }
    end
  end
  @q = User.ransack(params[:q])
  @users = @q.result(distinct: true)
end
````

#注意点
groupingsというキーに入れることが重要です。
名前が違うと期待通り動作しません。

以上、誰かのお役に立てれば幸いです。

#参考
multiple word column ransack searchなどで検索しました。
https://github.com/activerecord-hackery/ransack/issues/85
https://github.com/activerecord-hackery/ransack
HTML5のhr要素について

##hr要素
**HTML 5 に於ける`<hr>`要素は、段落単位の区切りとして定義されている。**



シーンの変わり目や、リファレンス本のセクションの中での他のトピックへの変わり目で使用する。
例えば、`section`要素と`section`要素の間には置くことができない。`section`要素がテーマの変わり目という意味を含んでいる為必要がない。

>視覚的な区切り線としてではなく、あくまで意味的な用途として使用が推奨されている


* `<hr>`はsection内で使うようにする。
* セクション間の区切り線として配置するのは適切ではない。
* 意味的なものではなく、単に視覚的な区切り線を実現したい場合はcssを使用する。
Unityでカメラがオブジェクトに近づくとだんだん透明になって消える。

平面ポリゴンをカメラが潜る時にオブジェクトの描画がいきなり消えてしまい
パチっとした感じの気持ちの感じになってしまいます。
それを回避するのに近づくとだんだん透明になる処理を入れたらどうでしょうか？
ColliderのTriggerにチェックを入れてOnTriggerStay中に
2つのオブジェクトの距離を計り、オブジェクトが近づくごとに透明になるスクリプトになります。

カメラには、rigidbodyとBOX Colliderを使っています。
オブジェクトには、BOX Colliderを入れています。

![スクリーンショット 2014-09-01 18.17.19.png](https://qiita-image-store.s3.amazonaws.com/0/38279/db882d37-9aff-175c-041b-69c42a318c3d.png)

近づくと消えて行きます。
![スクリーンショット 2014-09-01 18.16.45.png](https://qiita-image-store.s3.amazonaws.com/0/38279/b0fff9d4-a98d-ff2f-92df-57ad88b32419.png)

スクリプトはこんな感じです。

```csharp
using UnityEngine;
using System.Collections;

public class MoveCamera : MonoBehaviour {
	public GameObject objA;
	public GameObject objB;

	
	void Update () {
		transform.position = new Vector3 (transform.position.x, transform.position.y, transform.position.z + 1);	
	}

	//他オブジェクトと接触した瞬間に呼ばれるメソッド
	void OnTriggerEnter(Collider other){
		
	}

	//他オブジェクトと触れている間に呼ばれるメソッド
	private void OnTriggerStay(Collider other)
	{
		transform.position = new Vector3 (transform.position.x, transform.position.y, transform.position.z + 1);

		Vector3 Apos = objA.transform.position;
		Vector3 Bpos = objB.transform.position;
		float dis = Vector3.Distance(Apos,Bpos);

		Color color = new Color(Random.value, Random.value, Random.value, dis/100);
		objB.renderer.material.color = color;
		Debug.Log("dis/100 : " + dis/100);
	}

	//接触した他オブジェクトから離れた瞬間に呼ばれるメソッド
	private void OnTriggerExit(Collider other)
	{

	}

}
```
cssの垂直方向 (縦方向)中央揃え

要素を、縦中央に揃える方法。
**通常普通のvertical-alignだけでは縦方向中央には揃わない。**


```lang:HTML
<div id="wrapper">
 <div id="contents">block要素</div>
</div>
```

##position: absolute;を使う

```lang:CSS
#wrapper{
	position: relative;
	width: 200px;
	height:200px;
	background-color: #eee;
}
#contents{
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	margin: auto;
	width: 80px;
	height:50px;
	line-height:50px;
	text-align:center;
	background-color: #ccc;
}
```
※width, height指定必須。配置したい要素が`img`の時だけheight指定無しでもOK。


***

##CSS3のtable-cellを使う
```lang:CSS
#wrapper{
	display: table-cell;
	text-align: center;
	vertical-align: middle;
	width: 200px;
	height: 200px;
	background-color: #eee;
}

#contents{
	text-align: center;
	vertical-align: middle;
	margin: 0 auto;
	width: 80px;
	height: 50px;
	line-height: 50px;
	background-color: #ccc;
}
```