OmniAICreator/Qiita-1.07M huggingface dataset:
iOS4.x 対応のソースコードから「新しいAPI」を使っている箇所を探す


　アプリを iOS4.x でも動作させたい場合、Xcode のプロジェクト設定で Deployment Target を "4.x" (4.3とか) に設定します。
一方で Base SDK は最新のものしか選べません、今だと "7.1"。

　この状態だと、コード中で iOS5以降に追加された API を使っていると、iOS4.x端末では当然クラッシュします。

　Target を 4.x にしてるんだから、クラッシュしそうなコードがあったら Xcode が検出して警告して欲しいんですが、そういう機能はないみたいです。(実はあるのでしょうか？ Android だと警告どころかビルドエラーになるので、iOSアプリ開発は大変不便だな、と思ってしまいます。Obj-C は JavaScript みたいなもんだから仕方がない、のは分かりますが)

　 [OCLint](http://oclint.org/) という静的コード解析ツールを見つけましたが、機能をざっと見ても、APIバージョンをチェックするものはなさそうです。（試したことはありません）

　しかし「動かしてみないと分からない」のは不安すぎるので、なんとかして「新しいAPIを使っていないか？」をチェックする方法を考えて、行ってみました。

## 新しいAPIを使っている箇所を見つける方法

### A. iOS Developer Center に API の更新内容がまとめられたページがあります。

* [iOS 4.3 to iOS 5.0 API Differences](https://developer.apple.com/library/ios/releasenotes/General/iOS50APIDiff/index.html#//apple_ref/doc/uid/TP40011042)
* [iOS 5.1 to iOS 6.0 API Differences](https://developer.apple.com/LIBRARY/ios/releasenotes/General/iOS60APIDiffs/index.html)
* [iOS 6.1 to iOS 7.0 API Differences](https://developer.apple.com/LIBRARY/IOS/releasenotes/General/iOS70APIDiffs/index.html)


### B. これらのページから「変更のあった API のリスト」を抽出します。

具体的には以下のようなリストを作ります。
>Added vImageAlphaBlend_ARGB8888
>Added vImageAlphaBlend_ARGBFFFF
>…

この作業は自動化したいのですが、お試しなので手動でテキストエディタと **EXCEL** を駆使して作成しました。

### C. あとは、自分のソースコードに対して、順次 grep をかけるスクリプトを作ります。

修正リストの中には、 ``-[ALAsset setImageData:metadata:completionBlock:]`` のように名前付き引数だったりする API もあるので、正規表現でなるべくヒットするように置換します。

```sh:find_new_api.sh
grep -nr "ALAsset.*setImageData.*metadata.*completionBlock:.*;" ./src/*
grep -nr "vImageAlphaBlend_ARGB8888.*;" ./src/*
grep -nr "vImageAlphaBlend_ARGBFFFF.*;" ./src/*
…
```

### D. このスクリプトを実行して何か出たら、そこが「新しいAPIを使ってる箇所」です。

## まとめ

### 注意点

* クラス自体が追加されているものも、メソッドの追加として探しているので、他のクラスと誤認することがあります。
* 正規表現が完全に正しいかよくわかりません（ソースコードに改行含む場合とか）


簡単で、不格好な方法ですが、十分に機能してくれますし、開発者の知識やテストだけに頼るのに比べれば随分と安心できます。

APIの更新情報を JSON か何かで提供してくれたら、もうちょっと楽なんですけども。。。

iOSアプリの開発者のみなさんは、どうやって iOS の下位バージョン互換性を担保しているのでしょうか？
Erlangで例外スタックトレースに引数情報を乗せる方法

erlang:error/1を使って例外(ex. badarg)を送出すると、補足した後のerlang:get_stacktrace/1の結果に例外が発生した関数のアリティ情報(引数数)しか載っていなくて苦労した覚えがあるが、erlang:error/2を使えば、引数の完全な情報を載せることができる模様。

```erlang:exception_test.erl
-module(exception_test).

-export([hoge/1, fuga/1]).

%% @doc erlang:error/1を使って例外送出
hoge(_Arg) ->
  error(badarg).

%% @doc erlang:error/2を使って例外送出
fuga(Arg) ->
  error(badarg, [Arg]).
```

```erlang:shell
$ erl
Erlang R16B03-1 (erts-5.10.4) [source] [64-bit]
Eshell V5.10.4  (abort with ^G)

> c(exception_test).
{ok, exception_test}

%% erlang:error/1の場合のエラー表示およびスタックトレース
> exception_test:hoge(erlang).
** exception error: bad argument
     in function  exception_test:hoge/1 (exception_test.erl, line 8)

> catch exception_test:hoge(erlang).
{'EXIT',{badarg,[{exception_test,hoge,1,
                                 [{file,"exception_test.erl"},{line,8}]},
                 {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]},
                 {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]},
                 {shell,exprs,7,[{file,"shell.erl"},{line,674}]},
                 {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]},
                 {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}

%% erlang:error/2の場合のエラー表示およびスタックトレース
> exception_test:fuga(erlang).
** exception error: bad argument
     in function  exception_test:fuga/1
        called as exception_test:fuga(erlang)  % 引数情報が表示される

> catch exception_test:fuga(erlang).
{'EXIT',{badarg,[{exception_test,fuga,
                                 [erlang], % アリティの代わりに引数が取得できる
                                 [{file,"exception_test.erl"},{line,13}]},
                 {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]},
                 {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]},
                 {shell,exprs,7,[{file,"shell.erl"},{line,674}]},
                 {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]},
                 {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}
```
Railsでajax限定のルーティングを設定する


コントローラのアクションをajaxにだけ許可したい場合、アクション自身にこう書くこともできます。

``` ruby
def sugoi_action
  raise AbstractController::ActionNotFound unless request.xhr?

  # 何かすごい処理
end
```

でもせっかくroutesがあるのに、アクションでそれぞれ制御するのはできれば避けたいです。こういう情報はひとまとまりで扱いたいです。

## constraintsでajaxだけを許可する

railsのルーティングでは、constraintsというハッシュでそのアクションを許可する条件を指定できます。

例えばこんな風に。

``` ruby:config/routes.rb
match 'path/:id', constraints: { id: /[A-Z]\d{5}/ }
```

constraintsは標準ではajaxリクエストを判定するオプションは用意されていません。
でもご安心を。constraintsは独自に作ることもできるのです。

今回はこんな感じでajaxだけを許可するconstraintsを作ってみました。

``` ruby:lib/constraints/only_ajax_constraints.rb
class OnlyAjaxRequest
  def self.matches?(request)
    request.xhr?
  end
end
```

``` ruby:config/routes.rb
get 'hogehoge' => :hogehoge, :constraints => OnlyAjaxRequest
```

`lib/constraints`へのパスを通します。

``` ruby:config/application.rb
config.autoload_paths += %W(#{config.root}/lib/constraints)
```

これで、直接アクセスしようとした時に404が帰ってくるようになりました！


## 参考

- [Routing Only AJAX Requests In RoR](http://railsadventures.wordpress.com/2012/10/07/routing-only-ajax-requests-in-ror/)
- [ActionDispatch::Routing::Mapper::Base](http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Base.html#method-i-match)
- [ActionDispatch::Routing::Mapper::Scoping](http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Scoping.html#method-i-constraints)
HerokuでRoot domainを設定したい


`www.example.com`じゃなくて、`example.com`みたいなドメインをRoot domain、Naked domain、Apex domainとか呼ぶけれども、このようなドメインはAレコードでIPを直接指定する必要があるので、HerokuみたいにCNAMEを設定しないといけないサービスには基本的には使えない。

> Zone apex domains (aka "naked", "bare" or "root" domains), e.g., `example.com`, using conventional DNS A-records are [not supported on Heroku](https://devcenter.heroku.com/articles/apex-domains). However, there are alternative configurations that allow for root domains while still being resilient in a dynamic runtime environment.
>
> https://devcenter.heroku.com/articles/custom-domains#root-domain

Herokuのドキュメントにはこのように書いてあって、2つほど代替の手段が紹介されてる。

一個目はApex domainに対してCNAMEのような指定ができるDNSサービスを利用する方法。以下のようなDNSサービスが対応しているらしい。

* [ALIAS at DNSimple](http://support.dnsimple.com/articles/alias-record)
* [ANAME at DNS Made Easy](http://www.dnsmadeeasy.com/technology/aname-records/)
* [ANAME at easyDNS](http://docs.easydns.com/aname-records/)
* [CNAME at CloudFlare](https://support.cloudflare.com/hc/en-us/articles/200169056-Does-CloudFlare-support-CNAME-APEX-at-the-root-)
* [ALIAS at PointDNS](https://devcenter.heroku.com/articles/pointdns)

もうひとつは、`example.com`みたいなドメインを`www.example.com`みたいなサブドメインにリダイレクトするというSubdomain redirectionという方法。

Route53を使ってる場合はS3を経由してその設定ができるらしい。

[Configuring Amazon Route 53 DNS for your Heroku App | Heroku Dev Center](https://devcenter.heroku.com/articles/route-53#naked-root-domain)

だいぶまわりくどい方法に見えるけどRoute53使ってる場合は現状だとこれしかないっぽい。

無理せずRoot domainは使わないというのがよさそう。
AVRのFuse


fuseを書き換える際は、クロック設定を間違えたり、書き込み賦課にしてしまったりすると復旧不可能にもなるので気をつける。



mega88p
=======
ArduinoISPが書き込むfuseの意味は？

```
avrdude: safemode: lfuse reads as E2
avrdude: safemode: hfuse reads as DD
avrdude: safemode: efuse reads as 7
```

http://www.avr.jp/ ここにいくとデータシートの日本語訳があるので、参考にしながら解読していく。
mega88P.pdfのP181”28.2.ﾋｭｰｽﾞ ﾋﾞｯﾄ"等に書いてある。

拡張ヒューズバイト(efuse=0x07)
---------------------------
bit3-7:1(未使用)
bit2:BOOTSZ1 = 1
bit1:BOOTSZ0 = 1 => ブートローダの設定(128word)
bit0:BOOTRST = 1 => 応用領域から起動(ブートローダを使わない)

ヒューズ上位バイト(hfuse=0xDD)
---------------------------
bit7:RSTDISBL   = 1 RESETピン有効
bit6:DWEN       = 1 デバッグWIRE不許可
bit5:SPIEN      = 0 直列プログラミング許可
bit4:WDTON      = 1 WDTはWDTCSRで許可
bit3:EESAVE     = 1 EEPROMは未保護
bit2:BODLEVEL2  = 1 
bit1:BODLEVEL1  = 0
bit0:BODLEVEL0  = 1 => 2.7Vでリセット

ヒューズ下位バイト(lfuse=0xE2)
---------------------------
bit7:CKDIV8 = 1 8分周しない
bit6:CKOUT  = 1 クロック出力しない
bit5:SUT1   = 1 
bit4:SUT0   = 0 => 遅い起動(=安定)
bit3:CKSEL3 = 0
bit2:CKSEL2 = 0
bit1:CKSEL1 = 1
bit0:CKSEL0 = 0 => 内蔵RC発振クロック(8MHz)











mega328
=======
(todo)


mega328p
========
(todo)


tiny2313
========
(todo)
textareaの回りが下寄せになってしまうときの対処法

textareaの回りの要素が下寄せになってしまって困ったのでメモ。
これはtextareaのvertical-align属性が原因です。CSSを書けば簡単に解決できます。

```css:css
textarea{
    vertical-align:top;
}
```

こいつはなかなか厄介で、僕の場合はtable-cellを適用したdivの中にtextareaを入れていたんですが、隣のtable-cellのdivにもvertical-alignの影響が出ました。

最初てっきり、table-cellがなんかマズいんだと思って調べてたんですが、当然全く見つからず。textareaが原因だと分かるまで少しかかってしまいました。textareaを使う際はお気をつけ下さい。
PlayFrameworkのScala Template内で変数を定義する

Scala Template内でも簡単に変数を定義することができる。

```scala
// 定義サンプル
@hoge = @{"aaa"}
@one = @{1}
@two = @{2}

@main("タイトル") {
    // 出力サンプル
    @hoge    // aaa が出力される
    @{one + two} // 3 が出力される
}
```

※HTMLコンテンツのブロック内には定義できないので注意。
Multiple snippets in Atom.io

Edit: I just realized that the title is very ambiguous -- this is not about trying to support multiple snippet bodies for a given prefix. Sorry (it pains me too).

Quick post to complain about Atom.io's lack of documentation and its "gotcha" nature -- if you want to use multiple snippets for a language in Atom.io, you cannot have multiple source keys in your snippet.cson file or you will get stupid, random behavior.

# How to do it correctly

```coffeescript
'.source.js':
  'console.log':
    'prefix': 'log'
    'body': 'console.log($1)'
  'jshignore':
    'prefix': 'jsh'
    'body': '/*jshint ignore:start  */\n\t${1:code}\n/*jshint ignore:end  */'
  'map with anonymous function':
    'prefix': 'map'
    'body': 'map(function (${1:value}) {\n\t$2\n});'
```

So the structure for the correct usage of snippets is this:

```
LANG_KEY:
  DESCRIPTION
    'prefix': TRIGGER
    'body': SNIPPET
  DESCRIPTION_2
    [SNIPPET BODY]
```

Documentation doesn't say anything and the "snip" default snippet in the file gives you the whole tree, so I assumed every snippet needed to be inside of a new object rather than being members of the language objects (If this is actually the intended usage, then this is just one of many bugs).

# How to do it wrongly

```coffeescript
'.source.js':
  'console.log':
    'prefix': 'log'
    'body': 'console.log($1)'
'.source.js':
  'jshignore':
    'prefix': 'jsh'
    'body': '/*jshint ignore:start  */\n/*jshint ignore:end  */'
'.source.js':
  'map with anonymous function':
    'prefix': 'map'
    'body': 'map(function ($1) {\n\t$2\n});'
```

So doing it incorrectly will work somewhat, but in my case, only 'log' and 'map' were triggered while 'jsh' never triggered. Well, now we know.

# Closing remarks

As of today, searching 'snippet' on Atom.io docs gives you some useless results:

![](http://i.imgur.com/bwyWg0b.png)

Well, let's hope that as v1.0 gets closer, the documentation gets better (also hope for less bugs).
SQL-Tips。複数の条件のCountを一回で取得する。

#概要
複数の条件のCountを一回のSQL発行で取得したい場合がある。
例えば、ユーザマスタから
全ユーザ・男性ユーザ・女性ユーザのそれぞれの数を取得したい場合などだ。
そのような場合に使えるTipsを書く。
　※SQLite3で検証。

#サンプルコード

```sql:CountTags.sql
SELECT
   COUNT(*),
   COUNT(gender = 'm' OR null), 
   COUNT(gender = 'f' OR null)
FROM
   m_user
;
```

#解説
COUNTはNULL以外の数をカウントする。
そして、ORは「false OR null -> null」かつ「true OR null -> true」となる。
ubuntuでMMDAgentが起動してくれない

MMDAgent本体をインストールしたり、
サンプルをダウンロードして解凍して云々の方法は省略。
というか起動しないって時点で準備は済んでるはず。

###本題###

現在の最新版のサンプルスクリプトはver1.4（2013/12/25)なのだけれど、
これをダウンロードして解凍してリネームしていざ起動！ってやると落ちる。
なぜかはわからないけど落ちる。
そこでURLの~/MMDAgent_Example-1.4/MMDAgent_Example-1.4.zipの
二箇所の1.4を1.1に変えてダウンロードしたやつを使ってみると無事メイちゃんとご対面。
素敵なMMDAgentライフを。
【Vim】Conceal機能ってぶっちゃけ見にくいと思う

# Conceal機能とは
Vim7.3からの新機能らしい．
今回は標準で有効にされちゃってるTeXについて扱います．
下で例を示しますが，一部をマルチバイト文字使ってオシャレに置き換えをしてくれます．


参考：[【VIM】新機能“CONCEAL”構文属性を使う](http://blog.remora.cx/2011/02/use-vim-conceal.html)

### 例

- 数式

```math
 \left( 
   \sum_{k=1}^n a_k b_k \right)^{\!\!2} 
   \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 
  \right) 
```

- TeX

```tex
 \left( 
   \sum_{k=1}^n a_k b_k \right)^{\!\!2} 
   \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 
  \right) 
```

- 数式

```math
\int^{\infty}_{0} 
\frac{x^p}{e^x-1}dx = \Gamma(p+1)\zeta(p+1)
```

- TeX

```tex
\int^{\infty}_{0} 
\frac{x^p}{e^x-1}dx = \Gamma(p+1)\zeta(p+1)
```


- Conceal
![スクリーンショット 2014-05-14 22.21.17.png](https://qiita-image-store.s3.amazonaws.com/0/35173/6fc77401-d8eb-4ca2-3d90-e199e288a4d0.png)



# 無効化しよう
以下の理由から無効化します

- **ぶっちゃけ僕は見にくいと思う**
    - 適切な色設定をすれば見やすくなるかもしれない
- 編集中に置き換えた文字から通常の文字に戻すときに展開されてカーソルがあっちこっち移動するのがうざい
    - これが致命的！カーソルの位置と編集してる文字が一致しない
- \$\$　\$\$ や \\[　\\] が見えなくされるのが有り得ない

無効化は.vimrcに追記することでできます．

```vim
"" texのconcealを無効化（#^ω^）
let g:tex_conceal=''
```
cssだけで矢印を書いてみたよ


# やりたかったこと

スマホサイトの制作にて。
リンクの右の方に出てくる、> 形の矢印、あるじゃないですか。

デザイナーさんから「そこは画像で切り出す」と言われたのですが、いやいや、css でできるじゃないか（やり方しらないけど）と思ってやり方探しました。

# コード

ありました。
ほぼコピペでばっちり動いたので、ここにはコードを貼りません。
下記リンクを参照してください。

参考にしたのは、1-4. 矢印アイコン #1 です。

[スマートフォンサイト制作時に覚えておきたいCSS 15](http://www.nxworld.net/tips/15-smartphone-css-tips.html "スマートフォンサイト制作時に覚えておきたいCSS 15")

この記事すっごく役に立ちそうです。
ありがたい。


# 注意点
ほぼコピペ、でしたがちょっとだけ変えました。

最初は、

```css
ul li a::after {
	/*省略*/
}
```

こういうコードだったので、コピペしたら想定していなかった所に > が出てきて大変なことに（笑）

実は、ページ内に、ul li a とマークアップした箇所がいくつかあったのです。

そこで、矢印をつけたいところだけ、クラスを指定しました。

```css
.list_link li a::after {
	/*省略*/
}
```

```html
<ul class="list_link">
	<li><a href="#">list 01</a></li>
</ul>
```

# まとめ
矢印をつける方法として、アイコンフォントを使う手もあるようです。
[こちら](http://www.qript.co.jp/blog/technique/298/, "気軽に使えるアイコンフォントまとめ")のページで紹介されているようなアイコンフォント、そのうち使ってみたいなと思いました。

[気軽に使えるアイコンフォントまとめ](http://www.qript.co.jp/blog/technique/298/ "気軽に使えるアイコンフォントまとめ")
【Unity】スクリプトからPrefabのインスタンスを作る方法

スクリプトにアタッチせずに、スクリプトから直接Prefabを指定してインスタンスを生成する方法の紹介をします。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/43772/94b6e11d-889d-db8e-680e-88d69c8be20c.png)
まずProjectビューに「Resources」フォルダを作って、そのフォルダの下にプレハブを配置します。図ではさらに「Prefabs」フォルダを作ってその下に配置していますが、これは無くても問題ありません。

これにより、Resources.Load()を使用することで、スクリプトからプレハブを取得することができます。

```csharp
// プレハブを取得
GameObject prefab = (GameObject)Resources.Load ("Prefabs/Shot");
// プレハブからインスタンスを生成
Instantiate (prefab, position, Quaternion.identity);
```

今回は、Prefabsというフォルダの下に配置したので、指定する文字列は"Prefabs/Shot"となります。もし"Resources"ファルダの直下に配置するのであれば"Shot"を指定することとなります。

これにより、アタッチが不要となるので、static関数からプレハブをインスタンス化することが可能となります。
C 言語のvolatile について

### volatile とは ?
変数の操作時の最適化を抑制する。

### どいうこと ?
<pre>
(例)
var1 = 0x01;
var1 = 0x02;
var2 = 0x04;

[volatile なし(最適化がかかる場合)]
コンパイラによって以下の処理に変換されてしまう可能性がある。

1. var1 = 0x01 は不要と判断され削除されるケース
　　var1 = 0x02;
　　var2 = 0x04;
2. var1 と var2 に依存関係はないので順番を変更されるケース
　　var2 = 0x04;
　　var1 = 0x02;

[volatile あり(最適化がかからない場合)]
記述通りの順番で処理が行われる。
　　var1 = 0x01;
　　var1 = 0x02;
　　var2 = 0x04;
</pre>
YAMLでfabricのenvを設定するタスクを定義する

# 環境定義用のタスク

fabricでサーバ構成を役割別に定義する方法は`env.roledefs`にホスト一覧を指定するタスクを定義する方法があります。

```environments.py
@task
def env_test():
    u'''テスト用設定'''
    env.roledefs = {
        "web": ["www.test"],
        "db" : ["db.test"]
    }

@task
def env_production():
    u'''本番用設定'''
    env.roledefs = {
        "web": ["www01","www02"],
        "db" : ["db01"]
    }
```

しかし、ちょっと冗長なのでYAMLから自動生成してみた。

# YAML版

```yaml:env.yaml
test:
    roledefs:
        web: [www.test]
        db: [db.test]
production:
    roledefs:
        web: [www01, www02]
        db: [db01]
```

こんな感じでデータを読み込んでタスクを作るヘルパーを定義。
(参考: http://www.backlog.jp/blog/2013/09/fabric-advanced.html)

```python:helper/yaml_loader.py
# -*- coding: utf-8 -*-

import os, time
import yaml
from fabric.api import env,task

def load_env_from_yaml(yaml_file, namespace):
    u'''yamlファイルから実行環境タスクを作成'''
    if os.path.exists(yaml_file):
        env_data = yaml.safe_load(open(yaml_file).read())
        for env_name, env_dict in env_data.items():
            __create_env_task(env_name, env_dict, namespace)
    else:
        print('No {0} found. skipped.'.format(yaml_file))

def __create_env_task(env_name, env_dict, namespace):
    u'''実行環境タスクの定義'''

    f = lambda: env.update(env_dict)
    f.__doc__ = u'''Set environment for {0}'''.format(env_name)

    task_name = 'env_{0}'.format(env_name)
    wrapper = task(name=task_name)
    rand = '%d' % (time.time() * 100000)
    namespace['task_%s_%s' % (task_name, rand)] = wrapper(f)
```

 fabfile.py で読み込んで使う。

```fabfile.py
import os
from helper.yaml_loader import load_env_from_yaml

# Execute fabric at fabfile.py directory.
__fabric_dir = os.path.abspath(os.path.dirname(__file__))
os.chdir(__fabric_dir)

# Load Environments
load_env_from_yaml('env.yaml', globals())
```

`globals()`はfabfileから渡してあげないとタスクが使えないのに注意。

# TODO

- 例外処理
- 見やすさのために task_name, task_descriptionを定義できるようにする。
- `env`で使っちゃいけないキーってあるのかな。（とはいえ前述の方法では書けちゃうんだけど）
[やりたい事別]個人的に使って役立ったGitコマンドまとめ(2014/05/14版)


使って覚えたGitコマンドをメモしていきます。

##commitが消えてしまったcommit状態に戻す
###①commit履歴と状態確認 (git log)
```commitの履歴を確認します
$ git log
commit 9f785932913bc1d9a054e269ca82ff14fa31edd4
Author: sugawara ryousuke <hogehoge@gmail.com>
Date:   Wed May 14 15:35:35 2014 +0900

    ページ表示まで

commit 6d245ae928f80f15cc41435d35eed8acd6244585
Author: sugawara ryousuke <hogehoge@gmail.com>
Date:   Wed May 14 14:21:08 2014 +0900

    app.jsだけの起動確認 DBとの接続完了
．
．
．
```
commit状態を確認しましたが、何らかの要因で直前のcommitなどが無いです汗
ココで言うと、`9f78593`よりも最新commitがあるのに表示されていません。

###②作業履歴を確認する (git reflog)
```
$ git reflog
9f78593 HEAD@{0}: checkout: moving from dev-n0bisuke-2 to dev-n0bisuke
f5b4843 HEAD@{1}: checkout: moving from 000e2bc49e795dab3be3214ccc5a6a32cb504efb to dev-n0bisuke-2
000e2bc HEAD@{2}: commit: readAPI&unreadAPI復旧
b2dd355 HEAD@{3}: commit: moreAPI復活
d1620c6 HEAD@{4}: commit: get/mesまで復元
9f78593 HEAD@{5}: checkout: moving from dev-n0bisuke to 9f785932913bc1d9a054e269ca82ff14fa31edd4
9f78593 HEAD@{6}: reset: moving to HEAD^1
9a8a90f HEAD@{7}: commit: 修正
9f78593 HEAD@{8}: commit: ページ表示まで
6d245ae HEAD@{9}: commit: app.jsだけの起動確認 DBとの接続完了
```
`9f78593`のcommitよりも最新の作業が見つかりました!

###③特定作業の段階に復元する (git cherry-pick コミットid)
```
$ git cherry-pick 000e2bc
```
これで `000e2bc HEAD@{2}: commit: readAPI&unreadAPI復旧`のコミットまで復元することができます
※git resetでも良いかも

##特定commit時点の特定ファイルを確認する

###commit１つ前の時点のファイルを閲覧する (git show HEAD^:ファイルパス)
```
$ git show HEAD^:path/hoge/app.js
```

###commitログ000e2bc時点のファイルを閲覧する
```
$ git show 000e2bc:path/hoge/app.js
```

###commitログ000e2bc時点のファイルを現在のファイルに書き込む
```
$ git show 000e2bc:path/hoge/app.js >> path/hoge/app.js
```
現時点のファイルの記述内容に追記されます。手動マージしましょう。

##コミット状態をリセットする
--hardオプションを付ける事でcommitログと状態を戻せます。
### １つ前のcommitの状態に戻す
```
$ git reset --hard HEAD^
```

### 2つ前のcommitの状態に戻す
```
$ git reset --hard HEAD^^
```

--softオプションを付ける事でcommitログを戻せます。
### ファイルの状態はそのままで、コミットid000e2bcのcommitログに戻す
```
$ git reset --soft 000e2bc
```


##不要になったブランチの削除
ブランチを切ったりマージしたりとブランチ操作していくと使わなくなるブランチが出てきます。不要なブランチは削除して整理しておきましょう。
###①ローカル＆リモートのブランチ確認 (git branch -a)
```ローカル＆リモートのブランチ確認
$ git branch -a
  dev-n0bisuke
* master
  stash
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/dev-n0bisuke
```

###②ローカルブランチ削除 (git branch -d ブランチ名)

```ローカルブランチ削除
$ git branch -d dev-n0bisuke

一応確認
$ git branch -a
* master
  stash
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/dev-n0bisuke
```

###③リモート(origin)ブランチの削除 (git push ラベル名 :ブランチ名)
```リモート(origin)ブランチの削除
$ git push origin :dev-n0bisuke
- [deleted]         dev-n0bisuke

一応確認
$ git branch -a
* master
  stash
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
```

GithubやBitbucketなどのリモート側を確認してみましょう!
Googleドライブのフォームデザインをほんの少しだけカスタマイズ


Googleフォームが新しくなり、デザインテンプレートも使えそうなパラメーターも減ったような感じなのでちょっと整理。

*※埋め込む場合限定*


## 使えそうなパラメーター

|パラメーター|値        |備考                        |
|------------|----------|----------------------------|
|ttl         |1か0      |タイトルの表示              |
|f           |フォント名|serif, sans-serifなど       |
|tc          |文字色    |000000とかblackとかで指定   |
|htc         |補足文の色|赤字にして注釈みたいな用途？|


## 使用例

```html
<iframe src="https://docs.google.com/forms/d/xxxxxxxxxx/viewform?embedded=true&ttl=0&f=serif&tc=333333&htc=red" width="760" height="1000" frameborder="0" marginheight="0" marginwidth="0">読み込み中...</iframe>
```


## 雑感

一番使いたかった背景色（bc）とリンク色（c）の指定は、Google側がCSS指定したようで効かなくなってしまって残念。デザインテンプレも含め、変わるといいな。（2014/05/14現在）

ついでに調べてたらフォームのソース引っ張ってきてコピペ運用している方々が見られましたが、[Google 利用規約 – ポリシーと規約 – Google](http://www.google.com/intl/ja/policies/terms/) で以下のようにあって不安が残るのでやめとくつもり。

> Google が提供するインターフェースおよび手順以外の方法による本サービスへのアクセスを試みてはなりません。

だってほらGoogle先生って、怒ると怖いから…((((；ﾟДﾟ))))


## 参考・引用

- [Google Formの背景を変更したりcssでカスタマイズする方法 | Shinichi Nishikawa's](http://nskw-style.com/2012/google-2/google-docs-form-css.html)
- [Testing an input form](http://www.ryenats.org.uk/test-form.htm)
Jenkinsビルドの「シェルで実行」の失敗/成功を操作する


初めてjenkinsを使ってみました。

シェルで実行で

```
vagrant up
knife solo prepare hostname
knife solo cook hostname
vagrant halt
vagrant destroy
```

みたいな事をやってました。
この時、knife solo cook の部分で失敗すると以降のコマンドが実行されないみたいで、vagrantのインスタンスが立ち上がりっぱなしで面倒だなぁと思ってました。

なんとかしたかったので調べてみました。

##エラーを無視する1

Jenkinsの「シェルの実行」はビルドを行うとシェルスクリプトファイルに落とした後、

```
/bin/sh -xe
```

で実行されるみたいです。

* オプション-x：シェルスクリプトで実行した結果を逐一表示
* オプション-e：実行中、エラー(exit codeが0以外)が発生した時点でエラーを出力して終了

つまり、ビルドが終了してたのは -e オプションのせいなのでこのオプションなしに実行できれば処理が止まる事はなさそうです。
シェルで実行のシェルのオプションを変えるには、コマンドの一番上に

```
#!/bin/sh -x
```

と書いてやれば、エラーでストップせず最後まで実行されました。

ただし、この場合のJenkinsのビルドの失敗/成功は「最後に実行されたコマンドの結果」になるようで実際にはエラーなのにJenkis側ではビルド成功となってしまいました。よろしくないです

(参考)
http://qiita.com/mechamogera/items/f689b95670127d5bf046

##エラーを無視する2

```
knife solo cook hostname || true
```

こんな感じにするとこのコマンドの結果は必ず成功になりました。
もちろん実際には失敗なのにJenkis側ではビルド成功になるのでよろしくないです。


##実行の結果を最後に持ってくる

会社の人に相談したらこんな感じで教えてもらえました

```
vagrant up
knife solo prepare hostname
knife solo cook hostname || RET=$?
vagrant halt
vagrant destroy
exit $RET
```

変数にexit codeを代入して、スクリプトの最後でそのexit codeで終了させていますので失敗してもビルドが継続され、Jenkisのステータスも失敗になります。よろしいかんじです。

そんなに複雑なスクリプトではない場合はこれで対応できますね。
リモートデスクトップ接続時クラッシュ

# リモートデスクトップ接続時クラッシュ
障害対策メモ
発症機：Windows7（32ビット）

## 症例：mstsc.exe
Windowsに標準搭載されているリモートデスクトップ接続アプリが接続先アクセス時にエラー発生のためクラッシュする現象が発生

## 検証：mmc.exe
コントロールパネル->管理ツール->イベントツール
を起動し、リモートデスクトップ接続アプリのクラッシュ時のエラーコードを取得
それをもとに原因調査

## 対策：Windowsアップデート削除
コントロールパネル->プログラムのアンインストール->インストールされた更新プログラム
を起動し対象パッチを削除。下記のアップデートプログラムに起因する可能性があり
下記アップデートプログラムを検索し、アンインストールを実行することで回避を確認
障害発生時の時間的切り分けが可能ならば、最新のアップデートプログラムだけを消すことでも対応可
下記のパッチのいずれか、切り分けが難しいならば全てを削除

KB2813347
KB2574819
KB2830477
KB2857650
KB2913751

## 対応：該当Windowsアップデート非表示
上記パッチをアップデート画面から
右クリック、更新プログラムの非表示
パッチに起因していたので今後のアップデートでも起こり得る可能性あり
pleiadesプラグイン適応のeclipseでアップデート適用後のクラッシュ

# pleiadesプラグイン適応のeclipseでアップデート適用後のクラッシュ
障害対策メモ
発症機：Windows7（32ビット）

## 症例：eclipse (pleiadesプラグイン適用済み、アップデート後）
pleiadesプラグイン適用済みのeclipseで、eclipse自体のアップデートをかけて次回起動するとエラーになり起動不可になる現象

## 検証：
WORKSPACE_HOME/.metadata/.log
ECLIPSE_HOME/configuration/jp.sourceforge.mergedoc.pleiades/pleiades.log
WORKSPACE_HOMEとはEclipseのワークスペースルートディレクトリ
ECLIPSE_HOMEとはEclipse配置ルートディレクトリ
それをもとに原因調査

## 対策：
1. Eclipse 起動オプション -clean を指定して起動
2. configuration/jp.sourceforge.mergedoc.pleiades/ ディレクトリーを削除して起動

## 参照
http://sourceforge.jp/projects/mergedoc/releases/38225/note
VirtualBoxがなんか動かんと思ったらIntel VTが有効か調べる

これ昔Vagrant動かそうとして散々ハマって急に思い出したからメモとして書く

VirtualChecker 3.0
http://openlibsys.org/index-ja.html

これ使って有効になってなかったらなんか悲しい感じになるのでBIOS起動して有効にする。
PelicanでGitHub Flavored Markdown(GFM)をマジで使いたい！


なんか前にも似たようなのを書いた気がしますが。
素のMarkdownはちょっときついですよね。
ということでPelicanのMarkdownをGFMに近づけます。
ほとんど差はなくなります。

Pelicanのというか、PythonのMarkdownライブラリを使うとき全般の話っすね。

## 結論

以下のパッケージをインストールする。

```console
$ pip install mdx_linkify
$ pip install mdx_del_ins
```

pelicanconf.py に以下を追記する。

```python
MD_EXTENSIONS = ['linkify', 'del_ins', 'fenced_code', 'codehilite(css_class=highlight)', 'tables']
```

おしまい。

詳しく見ていきたい人以外はここでお別れです。

### 単語の中のアンダースコア

普通のMarkdownは、単語の中にアンスコ(_)が複数あると悲しいことになります。

wow_great_stuff が wow<em>great</em>stuff みたいな。

これはこれでファンキーで良いと感じる人もいるかもしれませんが、普通は嫌だと思います。
なのでまずはこうならないようにします。

と思ったら、PythonのMarkdownはすでにこの機能がついてました。
何もしなくてよかった！

めでたしめでたし！

さようなら！

### URLの自動リンク

こんにちは！

リンクを貼るときはこうしますよね。

```markdown
[http://example.com](http://example.com)
```

カッコこれでよかったっけ？前のほうが丸いやつだっけ？あれれ？
とかすぐわかんなくなるしめんどいんですよね。ぶっちゃけそうなんですよ。
ここはやっぱり気を利かせて自動リンクするくらいの心遣いをして欲しいところですよね。
こっちは金払ってるんだから。払ってなかった。

残念ながらこれは標準機能だけではできません。
自分で正規表現とかで気合いをいれて拡張を書いてもいいですが、
**mdx_linkify** というサードパーティ製の拡張がよく出来ていますので、使いましょう。

pipでこんな感じでスタイリッシュにインストールしたら、

```console
$ pip install mdx_linkify
```

pelicanconf.py にこう書いといてください。

```python
MD_EXTENSIONS = ['linkify']
```

### 取り消し線

GFMでは、

```
~~黒歴史~~
```

とすることで、~~黒歴史~~ このように取り消し線をつけることができます。
このように・・・あれ？消えてない？俺の黒歴史が消えてないよ？
どうやらここのMarkdownでも使えないようです。

<del>白夜の夜、漆黒の暗闇。そう、僕は堕天した熾天使。隣の席の君の横顔を眺める。フフフ、君は本当の僕をまだ知らない。</del>

ふう、あぶない。

えーと、残念ながらこれも標準機能だけではできません。
**mdx_del_ins** という拡張を使います。

```console
$ pip install mdx_del_ins
```

pelicanconf.py はこうなりました。

```python
MD_EXTENSIONS = ['linkify', 'del_ins']
```

### コードブロック

Markdownではインデントでコードブロックを表現しますが、もはやGFMのバッククォート3つの書き方がデファクトな勢いです。

    Here's an example:
    
    ```
    function test() {
      console.log("notice the blank line before this function?");
    }
    ```

これは標準の組み込み拡張の **Fenced Code Blocks** を使います。

pelicanconf.py が少しずつ充実してきます。


```python
MD_EXTENSIONS = ['linkify', 'del_ins', 'fenced_code']
```

### シンタックスハイライト

プログラムなんて何も分からない僕のような無知蒙昧な人間には関係ないことですが、
シンタックスハイライトという機能があるようです。
愚鈍な僕には何に使うのか不明ですが、こういうことができるようです。

    ```ruby
    require 'redcarpet'
    markdown = Redcarpet.new("Hello World!")
    puts markdown.to_html
    ```

```ruby
require 'redcarpet'
markdown = Redcarpet.new("Hello World!")
puts markdown.to_html
```


黙って **CodeHilite** を追加すればいいんじゃないですかね！

```python
MD_EXTENSIONS = ['linkify', 'del_ins', 'fenced_code', 'codehilite(css_class=highlight)']
```

### テーブル

こういうふうに書くことでテーブルがかけます。

```
 item         | expenses
------------- | -------------
TENGA         | 606
TENGA HARD    | 655
```

 item         | expenses
------------- | -------------
TENGA         | 606
TENGA HARD    | 655

**Tables** を追加の方向で。

```python
MD_EXTENSIONS = ['linkify', 'del_ins', 'fenced_code', 'codehilite(css_class=highlight)', 'tables']
```

## まとめ

ここまでの設定でGFMと同じ感じで使えます！
ちなみにPelicanは、デフォルトのエクステンションとして codehilite と extra が有効になっています。

codehiliteに`(css_class=highlight)`を付けて指定していたのは、デフォの指定とクラスが異なることで、CSSが有効に機能しないことを避けるためでした。

ちなみに、今回の例では extra は指定していませんが、extra には他にも便利な機能があります。
`MD_EXTENSIONS`は追加ではなく上書きになるので、extra の機能は無効になってしまいます。
もしextraの機能が欲しい場合には追加してください。

詳しくはこちら。
http://pythonhosted.org/Markdown/extensions/
Scalaのfor文について考える

Scala勉強中にfor文がわからなかったので考えました。
的外れなことを言ってるかもしれないので、そのときは突っ込みをお願いします。

# Scalaのfor文

[Scalaプログラミング入門](http://www.amazon.co.jp/dp/4822284239)の読書中にfor文が出てきました。

```scala
for {i <- 1 to 10
     j <- 1 to 10}
    println(i * j)
````

何これ気持ち悪い。

これでどうなるのかは何か他の言語をやっていればわかります。
標準出力（とは限らないけども）に対してi*jの結果を100行出力しているだけですよね。

それはわかるのですが、手続き型言語にはない気持ち悪さを感じます。

# 手続き型言語のfor文

PHPの場合だったら

```php
for ($i = 1; $i <= 10; $i++) {
    for ($j = 1; $j <= 10; $j++) {
        echo ($i * $j) . "\n";
    }
}
````

という感じでわかりやすいですね。
言語によりますが、変数に値を設定して処理を実行し、条件に合わなくなるまで処理を続けるだけです。

今回のような二重ループでも考え方は同じで、あくまでも一回目のループとその中での二回目のループとあるだけです。

でも、Scalaのfor文（特に二重ループのとき）はこの説明に一致してないように思えます。
たぶん、気持ち悪さの鍵はここにありそうです。

# ScalaのBNF

構文で分からないときは[BNF](http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AB%E3%82%B9%E3%83%BB%E3%83%8A%E3%82%A6%E3%82%A2%E8%A8%98%E6%B3%95)です。
ほとんどの言語でBNFは公開されているので覚えておくと構文を調べやすくて便利です。

[The Scala Language
Speciﬁcation
Version 2.9
 - http://www.scala-lang.org/docu/files/ScalaReference.pdf](http://www.scala-lang.org/docu/files/ScalaReference.pdf)

上のP89のFor Comprehensions and For Loopsにfor文のBNFがあります。

> ````
> Syntax:
>     Expr1 ::= ‘for’ (‘(’ Enumerators ‘)’ | ‘{’ Enumerators ‘}’)
>                  {nl} [‘yield’] Expr
>     Enumerators ::= Generator {semi Enumerator}
>     Enumerator ::= Generator
>                  | Guard
>                  | Pattern1 ‘=’ Expr
>     Generator ::= Pattern1 ‘<-’ Expr [Guard]
>     Guard ::= ‘if’ PostfixExpr
> ````

ここでの肝が **Enumerators** になります。
気持ち悪さの鍵はこれです。（たぶん）

手続き型言語のfor文では変数の準備とループの終了条件を定義しましたが、Scalaのfor文では列挙の定義をします。
そのため、変数を準備して終了条件を満たすというまで処理を実行するのではなく、列挙された値の組み合わせに対して処理を実行すると考えると腑に落ちます。

つまりは手続き型言語はフロー制御としてfor文がありますが、Scalaでは列挙された値の組み合わせの操作としてfor文があるようです。

ちなみにScalaにはbreakやcontinueがないというのもそこの違いで考えると腑に落ちます。
([この記事](http://qiita.com/tanigon/items/96f45b3dcdd15b04cc89)を見るとbreakはあるようですけど汚すぎるだろうと）
手続き型言語ではフロー制御としてbreak、continueがありますが、Scalaではそもそもフローなんてなくて、列挙された値の組み合わせに対して処理を実行するだけだから構文として用意されていないのだろうなと。

# おまけ

ここまで書いて日本語リファレンス見つけたのでしっかり読みました。

[Scala言語仕様 - http://www.scala-lang.org/old/sites/default/files/linuxsoft_archives/docu/files/LangSpec2.8-ja_JP.pdf](http://www.scala-lang.org/old/sites/default/files/linuxsoft_archives/docu/files/LangSpec2.8-ja_JP.pdf)

上の6.19 for 内包表記と for ループに書いてある通り、Scalaのfor文はただのエイリアスですね。

```scala
(1 to 10).foreach { case i => (1 to 10).foreach { case j => println(i * j) } }
````

最初に記載したコードは内部的に上記のコードに置き換えられるようです。
なんかいろいろと無駄な考察をしましたが、要はコレクション操作ですよ。それだけの話ですよ。

JSerとしては最初からこっちを出しておいてくれれば何も考えなかったのにという気分です。

---

Scalaは構文レベルで脳みその切り替えが必要なので、なかなか難しいです。
動くアプリケーションを作るだけならそこまで苦労しなさそうですが、思想と作法が全然わかんねーのでちゃんとしたコードを書けるようになるには結構かかりそうですね。
Struts 1 脆弱性対策 (CVE-2014-0114)

Struts 1 の脆弱性に対する対策（Commons BeanUtils 1.8 未満）

```java:SafeBeanUtilsBean.java
import java.lang.reflect.InvocationTargetException;
import java.util.regex.Pattern;
import org.apache.commons.beanutils.BeanUtilsBean;

public class SafeBeanUtilsBean
		extends BeanUtilsBean {

	private static final String EXLUDE_NAME_REGEX = "(^|\\W)[cC]lass\\W";
	private static final Pattern EXLUDE_NAME_PATTERN = Pattern
			.compile(EXLUDE_NAME_REGEX);
	private static boolean isExcludedName(String name) {
		if (name == null) {
			return false;
		}
		return EXLUDE_NAME_PATTERN.matcher(name).find();
	}

	public void setProperty(Object bean, String name, Object value)
			throws IllegalAccessException, InvocationTargetException {
		if (isExcludedName(name)) {
			return;
		}
		super.setProperty(bean, name, value);
	}

}
```

```java:BeanUtilsBeanListener.java
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.apache.commons.beanutils.BeanUtilsBean;

public class BeanUtilsBeanListener
		implements ServletContextListener {

	public void contextInitialized(ServletContextEvent sce) {
		BeanUtilsBean.setInstance(new SafeBeanUtilsBean());
	}

	public void contextDestroyed(ServletContextEvent sce) {}

}
```

setProperty されなきゃいいんじゃね？ということで書いてみました。

* Struts の脆弱性対策のみならこれで十分っぽい。
* setProperty のみに影響。getProperty 系は対応いらないよね。。。？
* 厳密にやるなら `PropertyUtilsBean` の setProperty 系メソッドの方に対策したほうがいいかも。

(2014/05/16 修正)
EXLUDE_NAME_REGEX は com.opensymphony.xwork2.ExcludedPatterns#CLASS_ACCESS_PATTERN からそのまま持ってきたのですがよくよく見るとどうもおかしいです。
これだと hogeClass.fuga みたいな文字列でもマッチしてしまいます。。。
と思ったら、やはりすでに報告されてました。
https://issues.apache.org/jira/browse/WW-4333
あとは Ignore Case だと cLass みたいなプロパティにもマッチしますね。

というわけで、どちらかと言うとMBSDさんの正規表現のほうがよいのかなあということで修正しました。
パラメータ名に日本語とかを使ってると無視される可能性もありますが現実的にこちらに引っかかるケースのほうが少ないでしょう、ということで。

本来なら Character#isJavaIdentifierPart とかで前後の文字をチェックするのがいいのかもしれません。

他に思いつくとしたら `(^|[\.\[\]\(\)"'])[Cc]lass[\.\[\]\(\)"']` こんな感じでしょうか。
これならおそらく BeanUtils で使用可能なプロパティ名は全てカバーできる気がします。

あとは　Struts 2.3.18 がリリースされたらもう一度確認してみようと思います。
特定の IAM Role を持った別アカウントの EC2 インスタンスから S3 へのアクセスを許可する Bucket Policy

タイトル長すぎ！

[IAM ロールを使用したクロスアカウント API アクセスのウォークスルー - AWS Identity and Access Management](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/cross-acct-access-walkthrough.html) を読んでみたんだけど、やたら面倒だったり、若干やりたいこととずれてたりしたので、bucket policy でなんとかしてみた。

```text
+--AWS Account A------+              +---AWS Account B----+
|    EC2 Instance   --+------------+----> S3 Bucket      |
|     (IAM Role)      |            |   (Bucket Policy)  |
+---------------------+              +-------------------+
```

```json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::XXXXXXXXXXXX:role/SomeRole"
			},
			"Action": "s3:ListBucket",
			"Resource": [
				"arn:aws:s3:::bucket-name"
			]
		},
		{
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::XXXXXXXXXXXX:role/SomeRole"
			},
			"Action": [
				"s3:GetObject",
				"s3:PutObject",
				"s3:DeleteObject"
			],
			"Resource": [
				"arn:aws:s3:::bucket-name/*"
			]
		}
	]
}
```

Principal には、アクセスする側（アクセスを許可される側、AWS Account A）の Role の ARN を指定する。

![iam.png](https://qiita-image-store.s3.amazonaws.com/0/6870/77ff95a1-f8c3-28b5-2279-6b68dcfcdf98.png)

アクセスする側の Role に対しては、S3 へのアクセスを許可する Policy を書いてあげる。おおざっぱに書くならこんな感じ。バケット指定さぼってます。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket", "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}
```

これで別アカウントの EC2 インスタンスから aws s3 コマンドでもにょもにょできた。

参考:

 - [IAM policies and Bucket Policies and ACLs! Oh My! (Controlling Access to S3 Resources) - AWS Security Blog](http://blogs.aws.amazon.com/security/post/TxPOJBY6FE360K/IAM-policies-and-Bucket-Policies-and-ACLs-Oh-My-Controlling-Access-to-S3-Resourc)
 - [Bucket Policy Examples - Amazon Simple Storage Service](http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html)
bash_historyを便利に使う


##historyコマンドに関して

historyコマンドはよく使ってたけど
最近ちょっと設定するだけでもっと便利に使える事を知りました
まず基本的な事として、historyの出力結果から
!を先頭に付与して実行する事でhistoryのコマンドを実行出来ます。

```
$ history
  .
  .
  498  rails console
  499  ls
  500  cd
  501  ls
  502  history
  503  pwd
  504  cd srvadmin/
  505  history
$ !498
rails console
WARNING: Nokogiri was built against LibXML version 2.8.0, but has dynamically loaded 2.9.1
Loading development environment (Rails 4.0.3)
irb(main):001:0>

```

##hisrotyに記憶するコマンドの数を増やす

centOSではデフォルトで1000件？っぽいですが増減する事が可能です
~/.bashrcに下記を記述

```

export HISTSIZE=2000

```

これでhistoryが2000件になります。
ある程度増やしても動作が重くなったりしないので
思い切って増やしておくと後で救われる時がたまーにあります。


##重複するコマンドを取り除きたい

lsコマンドやpwdコマンド等、同じコマンドに関しては
重複を取り除いて履歴を持つ事が出来ます。
~/.bashrcに下記を記述

```

export HISTCONTROL=ignoredups 

```

##Screen使っても履歴を共有したい(bashの場合)

Screenを利用して作業していると
A画面とB画面でコマンドが共有されません。
対象サーバの~/.bashrcに下記を追加する事により
historyが共有出来るようになります。

```

function share_history {
    history -a
    history -c
    history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend
export HISTSIZE=9999

```

参考
http://iandeth.dyndns.org/mt/ian/archives/000651.html
http://takuya-1st.hatenablog.jp/entry/20090828/1251474360
Sublimeでsnippetを修正したいとき

Sublimeでsnippetを追加するには"Tools->New Snippet"でいいんですが，一度作っちゃったsnippetを修正したいなーって時に困りました．結局ただのファイルなんで，保存したところから開けばいいんですが，その場所はどこだろう？ってことです．

結果，過去に作成したsnippetは"Sublime Text2->Preferences->Browse Packages"して"User"というpackageの中に入ってました．ユーザー設定も一つのpackageとして管理してるんですね．
Perlライブラリ無し縛り - 引用符内改行ありのCSVパース

* ダブルクォーテーションに囲まれた文字列中の改行、カンマを区切り文字として扱わない
* ライブラリは使わない。インタプリタの機能のみを使う

```pl
&csvparse( sub{ <DATA> } , sub{ print map("[$_]",@{$_[0]}),"\n"; } );

sub csvparse{
    my ($read,$callback)=@_;
    while( defined(my $line=$read->()) ){
        for(;;){
            $line =~ s/"([^"]+)"/"\a".unpack('h*',$1)."\a"/ge;
            last unless $line =~ /"/ && defined(my $next = $read->());
            $line .= $next;
        }
        chomp $line;
        my @csv = split(/,/,$line);
        s/\a([^\a]+)\a/pack('h*',$1)/ge foreach( @csv );
        $callback->( \@csv );
    }
}
__END__
nihon,go ahaha,ihihi
ahaha,"ihihi , ufufu","ohoho
mumumu
ahaha
gahaha"
XXXXX,"YYYYY","DDDDD,XXXXXX"
```

* CSV解析関数 csvparse の
  * 第一引数は、1行を取得するクロージャを渡す。
  * 第二引数は、分解した CSV を引き渡すクロージャーを渡す。

```
$ perl csv.pl
[nihon][go ahaha][ihihi]
[ahaha][ihihi , ufufu][ohoho
mumumu
ahaha
gahaha]
[XXXXX][YYYYY][DDDDD,XXXXXX]
```

初出：[MHI 5.0 - [Perl] ライブラリ無し縛り - CSVパース](http://nyaos.org/d/index.cgi?p=%282012.10.01%29#p1)
【Unity】Instantiateで生成したGameObjectのScriptに引数を渡す方法

Instantiate で生成した GameObjectにアタッチしている Script に引数を渡す方法を紹介したいと思います。

例えば、自機から発射されるShotプレハブにShot.csのScriptをアタッチし、
![001.png](https://qiita-image-store.s3.amazonaws.com/0/43772/1116b23e-3af0-eeca-c1aa-66b680e3a931.png)

Shot.csを以下のように定義しているとします。

```csharp:Shot.cs
public class Shot : MonoBehaviour {
  // 移動速度を設定
  // @param direction 角度
  // @param speed 速さ
  public void Create(float direction, float speed) {
    Vector2 v;
    v.x = Mathf.Cos (Mathf.Deg2Rad * direction) * speed;
    v.y = Mathf.Sin (Mathf.Deg2Rad * direction) * speed;
    rigidbody2D.velocity = v;
  }
}
```

自機(Player.cs)から弾を撃ち、Shot.Create()で移動速度を設定するには以下のように記述します。

```csharp:Player.cs
  GameObject prefab; // あらかじめアタッチしたShotオブジェクト
  // 弾を生成
  GameObject shot = Instantiate (prefab, transform.position, transform.rotation) as GameObject;
  // Shotスクリプトオブジェクトを取得
  Shot s = shot.GetComponent<Shot>();
  // 移動速度を設定
  s.Create(direction, speed);
```

Instantiateの戻り値は GameObject なので、そこからScriptコンポーネントをGetComponent()で取得すれば、関数を実行するなり、引数を渡すなりが自由にできます。

ポイントとして、Instantiate が返すのは GameObject であってアタッチしているスクリプトのオブジェクトではありません。
そのため、GameObjectからコンポーネントを取り出す処理を挟む必要がある、というところです。
mod_extfilterとmod_deflateを併用してハマった話

一言でいうなら、SetOutputFilterを書く順番には気を付けましょう。で終わってしまう話。
ちょっとハマったので、調べたついでにメモしておく。

## やりたかったこと
mod_extfilterでレスポンスを書き換えて、mod_deflateで圧縮して返したい。

## やったこと
confファイルに以下のように書いた。fooをvarに置換して返すフィルタを定義。

```
ExtFilterDefine testfilter mode=output intype=text/html cmd="/bin/sed s/foo/var/"

<IfModule mod_deflate.c>
  DeflateCompressionLevel 9
  <Location />
    SetOutputFilter DEFLATE
    SetEnvIfNoCase Request_URI \
              \.(?:gif|jpe?g|png)$ no-gzip dont-vary
    Header append Vary User-Agent env=!dont-vary
  </Location>
</IfModule>

Listen 4040
<VirtualHost *:4040>
  DocumentRoot /var/www/html

  <Directory "/var/www/html">
    SetOutputFilter testfilter
    ....
  </Directory>
</virtualHost>
```

以下のテキトーなファイルを置いて試してみる

```
cat /var/www/html/hoge.html

<html>
<head>
<title>てすと</title>
</head>
<body>
foo
</body>
</html>
```

curlを投げて確認したところ・・・あれ？置換されてないぞ

```
curl http://localhost:4040/hoge.html -H "Accept-Encoding: gzip" | gunzip

<html>
<head>
<title>てすと</title>
</head>
<body>
foo
</body>
</html>
```

## 解決方法
SetOutputFilterを書く場所が悪く、先にDEFLATEで圧縮されたため、extfilterで置換がかからなかった。
このように書けば期待通りになった。

```
ExtFilterDefine testfilter mode=output intype=text/html cmd="/bin/sed s/foo/var/"

<IfModule mod_deflate.c>
  DeflateCompressionLevel 9
  <Location />
#    SetOutputFilter DEFLATE   <=ここの行が不要で（丸コピで気にもしてなかった...）
    SetEnvIfNoCase Request_URI \
              \.(?:gif|jpe?g|png)$ no-gzip dont-vary
    Header append Vary User-Agent env=!dont-vary
  </Location>
</IfModule>

Listen 4040
<VirtualHost *:4040>
  DocumentRoot /var/www/html

  <Directory "/var/www/html">
    SetOutputFilter testfilter;DEFLATE   <= ここにDEFLATEを追記する。フィルタの順番に注意
    ....
  </Directory>
</virtualHost>
```

確認してみると・・・期待通り！

```
curl http://localhost:4040/hoge.html -H "Accept-Encoding: gzip" | gunzip

<html>
<head>
<title>てすと</title>
</head>
<body>
var
</body>
</html>
```
pandoc install on MacOS 10.9


pandocをMacOS10.9にインストールしようとしてちょいと困ったのでメモを残しておく．

http://qiita.com/sky_y/items/80bcd0f353ef5b8980ee
を参考にしてpandocをインストールしようとした．

--------


http://www.haskell.org/platform/ から，Haskell platformをダウンロードしてきて，インストール．

```bash
$ cabal update
$ cabal install cabal-install
$ cabal install pandoc
```

としたら，残念ながら，途中で，

```bash
Failed to install conduit-1.1.2.1 
cabal: Error: some packages failed to install: 
conduit-1.1.2.1 failed during the building phase. The exception was: 
ExitFailure 1 
http-conduit-2.1.2 depends on conduit-1.1.2.1 which failed to install. 
pandoc-1.12.4 depends on conduit-1.1.2.1 which failed to install. 
pandoc-citeproc-0.3.1 depends on conduit-1.1.2.1 which failed to install. 
yaml-0.8.8.2 depends on conduit-1.1.2.1 which failed to install. 
```

と言われてインストールできなかった．
どうもMacのclangコマンドを使うとだめだから，Haskellのcpphsを使えとのこと．

```bash
$ cabal install cpphs
```

として，

```bash
$ cabal install --ghc-options '-pgmPcpphs -optP--cpp' pandoc
```

でインストールできた．まぁ，このオプションが何を言いたいのかは知らんがね．．．

実際には，インストールしたcpphsへのパスが通っていなかったので，探してパスを通してやらんといけなかった．

```bash
$ which cpphs
/Uesrs/kobayashi/Library/Haskell/bin/cpphs
```

となっている．(ユーザ単位での`cabal install cpphs`であったため．．．)
[Rails 4.x] Turbolinksを使用した遷移時にだけ Progress Bar を使う

# Progress Bar（プログレスバー）とは

こんな感じです。(ちょっと違いますが...)

![Download-Progress-Bar.jpg](https://qiita-image-store.s3.amazonaws.com/0/18705/7d232084-2573-d6da-02a8-435d062e988a.jpeg)

youtubeで画面遷移をするとき、画面のうえのほうで左から右へ何かが流れていく、あれです。

それを、Turbolinksで遷移した際に表示できる様にします。

# これを使います

https://github.com/caarlos0/nprogress-rails


# インストール & 設定

## Gemfile

```rb
gem 'nprogress-rails'
```

```shell-session
$ bundle install
```

もしくは

```shell-session
$ gem install nprogress-rails
```

# application.js(.coffee)に追記

```js
//= require nprogress
//= require nprogress-turbolinks
```

# application.css.scssに追記

```css
*= require nprogress
*= require nprogress-bootstrap
```

# もうちょっと細かい設定

application.js(.coffee)に追記。

```js
NProgress.configure {
  showSpinner: false,
  ease: 'ease',
  speed: 500,
}
```

これだけで動きます。

http://qiita.com/saboyutaka/items/34d65201600ba00ea930

# 詳細

https://github.com/caarlos0/nprogress-rails
Debian/Ubuntuのデフォルトロケールを変更する



OSインストール時に英語を選択していた場合、
> LANG=ja_JP.UTF-8

にするとaptなどを実行したときにWarningが表示されてしまうことがあります。
そんなときに以下の設定をします。


Debian
-------------------------

```terminal
$ sudo apt-get install locales
$ sudo vim /etc/locale.gen
ja_JP.UTF-8の行のコメントを解除
$ sudo locale-gen
$ sudo update-locale LANG=ja_JP.UTF-8
```



Ubuntu
-------------------------

```terminal
$ sudo apt install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
```
pacoからporgへ

新しい環境にpacoを入れようと思って[pacoのサイト](http://paco.sourceforge.net/)へいったら、こんなことが書かれていました。

    Dear users of paco:

    This project is no longer active. Development of paco continues under a new project called porg. Please visit its web site for more information. Any feedback would be appreciated.

なんと、porgという後継プロジェクトに移ってしまったようです。

porg
http://porg.sourceforge.net/

ちなみにpacoやporgというのはソースコードから自分でビルドしてインストールするソフトウェアをパッケージ管理するためのツールです。

参考：[pacoでソースビルドをパッケージっぽく管理する - Qiita](http://qiita.com/pasela/items/9c6cd7b9e477ed0501c8)

porgのインストール
------------------

というわけで、porgを入れてみましょう。

この記事を書いている時点ではv0.2が最新でしたが、新しいバージョンが出ている場合はバージョン番号の部分を読み替えてください。

```bash
# ダウンロードと展開
wget http://downloads.sourceforge.net/project/porg/porg-0.2.tar.gz
tar xf porg-0.2.tar.gz
cd porg-0.2.tar.gz

# GUI版のgrop(gtkmmが必要)を必要としない場合は--disable-gropをつける
./configure --disable-grop

# ビルドしてインストール
make
sudo make install

# 自分自身を管理対象に加える
sudo make logme
```

pacoとほとんど同じですね。

で、pacoの管理データをpaco2porgで移行することができます。
今までpacoを使っていた人は移行しておきましょう。

```bash
sudo paco2porg
```

manを見た感じ使い方はpacoとほぼ同じようでしたが、若干機能（オプション）が減っている気が……。
わりと最近（porg-0.0が2014年3月11日、porg-0.2が2014年4月23日）始まったプロジェクトのようなので、まだ機能が追いついてないのかもしれません。
覚えないと仕事にならないeclipse ショートカットキー(Windows)

初心者向けの最低限をまとめてみました。

| コマンド | キーバインド | 詳細 |
|:---------|:-------------:|:-----------|
| 宣言を開く(Open Declaration) | ```F3``` | あるメソッドや変数の宣言部分までジャンプする |
| Javadocつける (Add Javadoc Comment) | ```Alt + Shift + J``` | |
| getter/setter の生成(Generate getters and setters) | ```Alt + Shift + S``` でソースのクイックメニューを開き、Generate getters and settersを選択 | フィールドからgetter setter を自動生成 |
| インポートの編成 (Organize Imports) | ```Ctrl + Shift + O``` | インポートをいい感じに揃えてくれる |
| ブロックコメントの追加(Add Block Comment) | ```Ctrl + Shift + /``` | コメントアウト |
| ブロックコメントの除去(Remove Block Comment | ```Ctrl + Shift + \``` | |
| コメントの切り替え(Toggle Comment) | ```Ctrl + Shift + C``` | |
| フォーマット(Format) | ```Ctrl + Shift + F``` | 体裁を整える |
| アクティブ要素のフォーマット(Format Active Elements) | ```Ctrl + I``` | |
| メソッドの抽出(Extract Method) | ```Alt + Shift + M``` | |
| メソッド シグニチャーの変更(Change Method Signature) | ```Alt + Shift + C``` | |
| テンプレート候補の表示(Template Candidate Display) | ```Ctrl + Space``` | |

その他、デバッグ機能や同期化ビューの使い方くらいは知っておいてほしい感じ。

参考：
http://www.crystal-creation.com/software/tech/tool/ide/eclipse/shortcut/
http://qiita.com/shuntaro_tamura/items/530e5068d48ae6d92fb8
brew update しようとしたら色々久々過ぎた

```
$ brew update
Error: undefined method `to_sym' for nil:NilClass
Please report this bug:
    https://github.com/mxcl/homebrew/wiki/troubleshooting
/usr/local/Library/Homebrew/cmd/update.rb:123:in `report'
/usr/local/Library/Homebrew/cmd/update.rb:121:in `each_line'
/usr/local/Library/Homebrew/cmd/update.rb:121:in `report'
/usr/local/Library/Homebrew/cmd/update.rb:35:in `update'
/usr/local/Library/brew.rb:95:in `send'
/usr/local/Library/brew.rb:95
```

Rubyが1.9.3なのが悪いのかなーと思って
`rvm install 2.0`
すると今度はrvmも古いらしく怒られ。
ごめんなさいごめんなさいしながら言われた通り
`rvm get stable`
その後逆向きに
```
rvm install 2.0
brew update
```
して完了。
fluentd -> elasticsearchでつっこんだデータのstringになっているやつをintegerに変換する

# [2015/08/25]追記
この方法では一時的にそのindexではうまくいきますが、fluentdから送られるデータは変わっておらず、新しいindexを作成するタイミングでまた同じ状況になってしまいます。
下記が現状での正しい対処法です。
[Elasticsearchでintegerになっていて欲しいところがstringになっていた時の対処法 - Qiita](http://qiita.com/tarr1124/items/1123fb733e8e72829026)

# 概要
fluentd + elasticsearch + kibanaを作成して、apacheのlatencyでsortしようとしたら、なんか上手くいかない。latencyがstringではいっていることに気づいた。

*確認法*

```
$ curl -X GET localhost:9200/apache_access-201405/access_log/_mapping?pretty=true
{
  "apache_access-201405" : {
    "mappings" : {
      "access_log" : {
        "properties" : {
          "@timestamp" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "X-Forwarded-For" : {
            "type" : "string"
          },
          "agent" : {
            "type" : "string"
          },
          "host" : {
            "type" : "string"
          },
          "latency" : {
            "type" : "string"
          },
          "referer" : {
            "type" : "string"
          },
          "request" : {
            "type" : "string"
          },
          "size" : {
            "type" : "string"
          },
          "status" : {
            "type" : "string"
          }
        }
      }
    }
  }
}
```

# 解決法
いろいろと調査をした結果、templateというものを設定する必要があるらしい。
[Elasticsearch の index templates で解析方法を指定する（または、default mapping が効かない時に） - Qiita](http://qiita.com/yosisa/items/b0bb44548bbd527005cc)

```
$ curl -XPUT localhost:9200/_template/accesslog -d '
{
  "template": "apache_access-*",
  "mappings": {
    "access_log":{
      "properties":{
        "latency":{
          "type":"integer"
        }
      }
    }
  }
}
'
```

こういう感じに設定される

```
$ curl -XGET localhost:9200/_template/
{"accesslog":{"order":0,"template":"apache_access-*","settings":{},"mappings":{"access_log":{"properties":{"latency":{"type":"integer"}}}},"aliases":{}}}
```

即反映されなかった（よくわからなかった）ため、いったんindexを削除して作りなおしたりした。
CreateJSでbitmapくりかえし

var graphics = new createjs.Graphics();
graphics
     .beginBitmapFill(bmd, "repeat")
     .drawRect(0, 0, 640, 960);
var shape = new createjs.Shape(graphics);
stage.addChild(shape);

//JSのcreatePatternつかってるぽい
//http://www.w3schools.com/tags/canvas_createpattern.asp
多段SSHやポートフォワーディングを '.ssh/config' に書く

SSHまわりで色々苦労したので、自分用メモを残します。

## SSHの設定 (`~/.ssh/`のパーミッションの設定)
* `~/.ssh/` : SSHの設定ファイルを置く場所
* パーミッションの設定がシビアなので注意

```bash
$ ls -al ~/.ssh/
drwx------@ .               # ~/.ssh のパーミッションにも注意
drwxr-xr-x+ ..
-rw-r--r--  config          # SSH の設定ファイル
-rw-r--r--  known_hosts
-rw-------  authorized_keys # 公開鍵置き場
-rw-------  id_rsa          # 秘密鍵
-rw-r--r--  id_rsa.pub      # 公開鍵
```

### パーミッションの設定
```bash
$ chmod 700 ~/.ssh
```

## 公開鍵認証
* SSHを安全に行いたい
* SSHするたびにパスワードを入力するのはめんどくさい

### 手順
クライアント側を`client`、ホスト側(サーバなど)を`host`とします。

<!-- 離れたenumerateの表現ができない -->
#### 1. **クライアント側**にて`ssh-keygen`コマンドにて鍵のペアを作成

```bash:client
$ ssh-keygen -C "comment "                                      # -C はコメント(任意)
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/lasta/.ssh/id_rsa): # 生成される鍵のファイル名の指定(任意)
Enter passphrase (empty for no passphrase):                     # 鍵へのパスワード(任意) ※注1
Enter same passphrase again:
```

**※注1**
: ここでパスワードをかけると、公開鍵認証をした上でパスワードも求められます

#### 2. ホストへ公開鍵(`.pub`ファイル)を転送

```bash:client
$ scp ~/.ssh/id_rsa.pub user@host:~/
```

#### 3. **ホスト側**にて公開鍵を登録
```bash:host
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
```

鍵の登録が済んだら、**host側では**`id_rsa.pub`を削除しても問題ありません。

### 公開鍵認証にてSSH接続を行う
```bash:client
$ ssh user@host -i ~/.ssh/id_rsa
```

パスワードを求められなかったら成功です。
秘密鍵の指定を毎度するのは面倒なので、対策はこの後説明します。

## `.ssh/config`
* SSHの設定ファイル
* SSH接続の度に秘密鍵を指定するのは面倒
* ホスト名とユーザー名を毎回書くのも面倒
* 多段SSHの書き方いつも忘れる
* shellの`alias`は柔軟性がない(scpなどの時に困る)

```bash:client
$ ssh -i ~/.ssh/id_rsa user@host # この表記と
$ ssh host                       # この表記が等価になる
```

```ssh:~/.ssh/config
Host         host           # 実際にコマンドで入力する名前 (任意)
HostName     host.hoge.fuga # ホスト名
User         user           # ログインユーザ名
IdentityFile ~/.ssh/id_rsa  # 秘密鍵のファイル名
```

### 多段SSH
* client -> host1(踏み台サーバ) -> host2(目的のサーバ) とログインしたい
* host2へ鍵を置くことも忘れない

```bash
user@local:~$ ssh user@host1
user@host1:~$ ssh user@host2
```

と毎度書くのは面倒です。

```bash
user@local:~$ ssh host2
```

だけで済ませたいですね。

```ssh:~/.ssh/config
Host           host1
HostName       host1.hoge.fuga
User           user
IdentityFile   ~/.ssh/id_rsa

Host           host2
HostName       host2.foo.bar
User           user
IdentityFile   ~/.ssh/id_rsa
ProxyCommand   ssh -CW %h:%p host1
```

### ポートフォワーディング
* アクセス制限がかかったウェブページを外部から閲覧したい
* 同様な環境からメールを送受信したい
* コマンドが複雑で分かり難い

```bash:ポートフォワーディングの例
ssh -L 10025:localhost:25 user@host.hoge.fuga 
```

と毎度書くのは面倒です。

```bash
ssh phost
```

だけで済ませたいです。

```ssh:多段SSHかつポートフォワーディングの場合
Host           phost1
HostName       host1.hoge.fuga
User           user
LocalForward   10025 localhost:10025
IdentityFile   ~/.ssh/id_rsa

Host           phost2
HostName       host2.hoge.fuga
User           user
LocalForward   10025 host2.hoge.fuga:25
ProxyCommand   ssh -CW %h:%p phost1
IdentityFile   ~/.ssh/id_rsa
```