OmniAICreator/Qiita-1.07M huggingface dataset:
指定したカテゴリの最上位の親カテゴリを取得する関数

カテゴリIDを指定するだけで最上位の親カテゴリの情報を返してくれる関数です。

```php:
    function get_top_categoryData($cat_id){
    
        $category_data=get_category($cat_id);

        while($category_data->category_parent != 0){
            $category_data=get_category($category_data->category_parent);
        }

        return $category_data;
    
    }
```





指定したIDが最上位の場合はそのまま指定したIDのカテゴリ情報を返します。

　

**利用例**
取得したカテゴリの最上位カテゴリの名称を表示
※例なので、カテゴリは記事にひとつのみ設定されている想定です。

```php:
$post_category = get_the_category();

$post_top_category = get_top_categoryData($post_category[0]->term_id);

echo $post_top_category->name;
```

　
親カテゴリによって表示を切り替える機会などが多いので、そういった場合に使うと記述量が減るので便利です。
便利なAutoHotkey言語を宣伝する記事

##初めに
主にWin上で *”使える”* スクリプト言語である**「AutoHotkey」(略称AHK)**について語る記事です。
Qiitaを始めた記念に、テスト投稿も兼ねて超マイナー言語ながら便利なAHKの使い方を簡単に紹介するだけの記事です。良かったら読んでください。

当方の無知＆不勉強のために説明文に少し、もしくは多分に間違いが存在するかも知れませんが、その折はクールにツッコミを下さればなるべくナイスな訂正記事を返すのでよろしくお願い致します。

そもそもAutoHotkeyって何だって方は[AutoHotkey Wiki](http://ahkwiki.net/Top)をご覧下さい。


##AutoHotkeyの利便性

AutoHotkeyはもともとWindowsで動くホットキーランチャを記述するための言語だったらしいんですが、
（呼び出す動作をプログラムで制御できるため、通常のコマンドで呼び出すランチャよりも便利な側面があった）
機能拡張を繰り返した現在ではGUIでもOS・他プロセスの制御でも何でもござれな多機能言語に変貌され、上手く使えば短い記述で大きなパフォーマンスを発揮するツールを作ることができます。


以下にいくつか例を示します。

```lang:「autohotkey.ahk」記述サンプルコードⅠ
; 左クリックを押しながらホイールスクロールで次を検索／前を検索
LButton & WheelUp::Send, +{F3}
LButton & WheelDown::Send, {F3}

; ホイールスクロールでシーク移動（動画プレーヤー「NicoPlayer」ウィンドウ内でのみ有効）
#IfWinActive, ahk_class CNicoPlayer
WheelUp::Send, +{Left}
WheelDown::Send, +{Right}
```

いかがでしょうか？
ホットキーの定義を書いたものですが、わずか数行。上記のコードを保存して「AutoHotkey.exe」を実行・常駐させておくだけで既にこれらのホットキーは有効となっています。
たったこれだけで、スクロールするしか能の無いマウスホイールをさまざまな別動作に割当てできる、この開発速度と多機能性がAutoHotkeyの強みです。

以下は複数行に渡るコードの例。

```lang:「autohotkey.ahk」記述サンプルコードⅡ
; [Win]キーを押しながら[G]キーで、テキストボックスを呼出し、入力した語句をGoogleで検索
#g::
　InputBox, OutputVar, Search for Google
　Run, C:\Program Files\Internet Explorer\iexplore.exe "https://www.google.co.jp/search?hl=ja&q=%OutputVar%"
return

; 右クリックを押しながら左クリックで、選択した文字列をGoogleで検索
RButton & LButton::SearchSelectedWord()

SearchSelectedWord(){
　Send, ^c
　ClipWait, 1
　Run, C:\Program Files\Internet Explorer\iexplore.exe "https://www.google.co.jp/search?hl=ja&q=%Clipboard%"
}
```

*【参考画像】前者のホットキーを呼び出した例：*
![2015-03-09_184611.jpg](https://qiita-image-store.s3.amazonaws.com/0/69876/3f5cd968-4d83-0c5c-bd7a-0259a234fec5.jpeg)

こちらは「Googleで検索」という、普段何気なく行っている使用頻度の高い作業をホットキー一発で行うコードです。
複数行に渡る操作を前者はそのまま記述、後者は関数化していますが、これだけ短いコードだと正直どちらのスタイルでも構いません。
極力短いコードで必要な作業を記述できる、という速さが重要なのです。...個人的には。

いや、ツール作成にあまり手間や時間がかかると「途中で飽きた」となったり「そもそも作る気にならん」と敬遠されるのが経験上あまりにも多いわけでして。
特に個人で開発する上ではAutoHotkeyのスピードは強力な武器となります。

　
その分、コード規約が緩い(C#、Javaと比較して)など多人数で開発するには不向きな面もあるのですが、規模の大きいプログラムが作れないわけではないんでご安心を。
次回の記事ではもう少し複雑なコードを紹介する予定です。

初記事で走り書きのため短いですが本記事はここまで。
下記の作品置き場(GitHub)にもいくつかAHKを使ったGUIアプリを公開しているので良ければ参考にご閲覧どうぞ。

***
著者：akatubame
GitHub：https://github.com/akatubame/
***
Bracketsバージョン1.2の変更点

基本的に[GitHub公式リポジトリのリリースノート](https://github.com/adobe/brackets/wiki/Release-Notes:-1.2)の翻訳になります。
当方大変未熟者ですので、間違い等ありましたらご指摘いただけますと幸いです。。。


# バージョン1.2の変更点

## コード編集
* [ドラッグ＆ドロップでテキストを並べ替え](https://github.com/adobe/brackets/pull/9584): `dragDropText`環境設定を有効にすると、選択したテキストをドラッグ＆ドロップできます。[複数選択](https://github.com/adobe/brackets/wiki/Working-with-Multiple-Selections)にも対応しています。(by [Marcel Gerber](https://github.com/MarcelGerber))
![settings.png](https://qiita-image-store.s3.amazonaws.com/0/48404/72292ae4-2159-15a3-2810-6a80ae1700c7.png)
<br>

* [CSSカラー名のヒント](https://github.com/adobe/brackets/pull/10410): カラースウォッチのプレビューなど、CSS／LESS／SCSSで標準の名前付きカラーのコードヒントが表示されます。(by [Marcel Gerber](https://github.com/MarcelGerber))
![codehint-color.png](https://qiita-image-store.s3.amazonaws.com/0/48404/c051031e-4788-d6d3-ce7f-86be2043fdb1.png)
<br>

* [SVGコードヒント](https://github.com/adobe/brackets/pull/10294): .svgファイルで、タグ、属性、名前付きカラーのコードヒントが表示されます。(by [Amin Ullah Khan](https://github.com/sprintr))
* [Dartシンタックスハイライト](https://github.com/adobe/brackets/pull/10308)(by [Marcel Gerber](https://github.com/MarcelGerber))

## 検索
検索／置換のスクロールバーで、現在選択されている検索結果の[目盛りマークが強調表示](https://github.com/adobe/brackets/pull/10413)されるようになりました。

## UI表示
[Windowsの高DPIのサポート](https://github.com/adobe/brackets-shell/pull/502): 高DPIディスプレイでは、テキスト、アイコン、イメージが自動的により鮮明にレンダリングされます。

## キーボードショートカット
[名前付きキーが使用可能に](https://github.com/adobe/brackets/pull/10247)ユーザーキーマップ、及びエクステンションのキーボードショートカットにて、PageUp、PageDown、Home、End、Insert、Deleteが使用可能になりました。

## 安定性
[Windows:ウィンドウ位置に関する挙動の改善](https://github.com/adobe/brackets-shell/pull/498):セカンダリディスプレイ接続解除時、画面解像度変更時にウィンドウ位置を保持するよう改善されました。

## Linux
[ファイル→開く　から最後に編集したファイルを表示するようになりました。](https://github.com/adobe/brackets-shell/pull/496)（現行のMac、Windows版と同じ挙動）(by [Marcel Gerber](https://github.com/MarcelGerber))

## ローカライズ
中国語（簡体字）、チェコ語、フィンランド語、フランス語、ドイツ語、日本語、ルーマニア語、セルビア語の訳が更新されました。(by [Hanhua Hong](https://github.com/mistyhua), [Pavel Dvořák](https://github.com/dvorapa), [valtlait](https://github.com/valtlait), [Marcel Gerber](https://github.com/MarcelGerber), [Goran Vasić](https://github.com/goranvasic), [Micleușanu Nicu](https://github.com/micnic))

# UIの変更

## 分割ビュー
非選択状態のペインを半透明にする処理が廃止されました。継続して該当機能を使用したい場合は、[Zen Paneエクステンション](https://github.com/stowball/brackets-zen-pane)を利用することにより維持可能です。

# API Changes

## jQuery -  2.1.1 から 2.1.3へアップグレード

**Event listeners** - エクステンションがBracketsコアモジュール、モデルオブジェクトにて`$().on()/off()`を使用すると警告が出るため、Brackets1.1で勧告された通り`.on()/off()`を直接呼び出してください。(DOMにて使用する場合は、引き続きjQueryイベントをご使用ください)

# 新拡張API、改善された拡張API

## Colors
CSS/SVGの標準の名前付きカラーリストを使用する場合は、`ColorUtils.COLOR_NAMES`を使用してください。

# 確認されている不具合等

* Bracketsのヘルパープロセスが正常に動作しているにも関わらず、Mavericks(OS X 10.9)のアクティビティモニターにて、"Not Responding（応答なし）"と表示される。([#5794](https://github.com/adobe/brackets/issues/5794))　テキストをクリックまたは入力してみてBracketsが正常に動作する限り、無視して問題ありません。
* インストーラー・DMGディストリビューションにはユニットテストコードが含まれていないため、Debug > Run Testsは使用できません。ユニットテストをするには、[GitHubからBracketsをpull](https://github.com/adobe/brackets/wiki/How-to-Hack-on-Brackets#getcode)してください。
第29回オフラインリアルタイムどう書くの問題をRubyで解く

問題はこちら
http://nabetani.sakura.ne.jp/hena/ord29devdice/

当日参加できなかったので今日解きました。
PATを自力で書き出す気力が無かったので、問題と解答から生成するという超反則技を使いました。

```rb
PAT=[
"12S453", "14653D", "15S3D4", "1T6D45",
"215T64", "2S541T", "354S21", "3D415S",
"41T2S5", "45312S", "46T512", "4D3S51",
"51246T", "53D146", "54D6T1", "5S2T14",
"641D35", "6T154D", "D35641", "D451T6",
"S21354", "S514D3", "T145S2", "T64215",
]
def solve(q)
  xs = q.chars.select{|x| x=~/[a-z]/}
  r = Regexp.new(xs.inject(q.gsub('/','')){|w,x| w.gsub(x,'(.)')})
  as = PAT.each_with_object([]){|pat,as|
    ms = pat.scan(r).flatten
    as << xs.zip(ms).map{|x,m| "#{x}=#{m}"}.join(",") unless ms.empty?
  }
  case as.size
  when 0
    'none'
  when 1
    as[0]
  else
    'many'
  end
end

DATA.readlines.each do |line|
  no,q,a = line.strip.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans
  puts ans == a ? ' o' : ' x'
end
__END__
0	Tx4/5yz	x=1,y=S,z=2
1	14S/xyz	none
2	1w6/xyz	many
3	4w3/12S	w=5
4	4w3/S51	w=D
5	15S/wD4	w=3
6	54D/6Tw	w=1
7	S21/35w	w=4
8	w2x/354	w=S,x=1
9	wx1/54D	w=6,x=T
10	45w/12x	w=3,x=S
11	5w2/x14	w=S,x=T
12	Dw5/x41	w=3,x=6
13	w4x/1y6	w=D,x=5,y=T
14	15w/xy4	w=S,x=3,y=D
15	D35/wxy	w=6,x=4,y=1
16	4wx/51y	w=6,x=T,y=2
17	wTx/D4y	w=1,x=6,y=5
18	wxy/z3D	w=1,x=4,y=6,z=5
19	wx5/1yz	w=D,x=4,y=T,z=6
20	w53/xyz	w=4,x=1,y=2,z=S
21	wx1/yzD	w=6,x=T,y=5,z=4
22	wxS/3yz	w=1,x=5,y=D,z=4
23	wx2/y1z	w=5,x=S,y=T,z=4
24	4wx/2yz	w=1,x=T,y=S,z=5
25	T6w/xyz	w=4,x=2,y=1,z=5
26	Swx/yDz	w=5,x=1,y=4,z=3
27	wDx/yzS	w=3,x=4,y=1,z=5
28	wxy/5Sz	w=T,x=1,y=4,z=2
29	wSx/4yz	w=2,x=5,y=1,z=T
30	wxS/y5z	w=1,x=2,y=4,z=3
31	wxy/35z	w=S,x=2,y=1,z=4
32	wxy/T6z	w=2,x=1,y=5,z=4
33	wxD/yz1	w=5,x=4,y=6,z=T
34	1wx/yz5	w=T,x=6,y=D,z=4
35	wx3/y5z	w=4,x=D,y=S,z=1
36	6wx/y3z	w=4,x=1,y=D,z=5
37	5wx/4yz	w=1,x=2,y=6,z=T
38	wx4/Syz	w=3,x=5,y=2,z=1
39	w3D/xyz	w=5,x=1,y=4,z=6
40	w3x/6yz	w=D,x=5,y=4,z=1
41	wxy/z12	w=4,x=6,y=T,z=5
42	1wS/xyz	many
43	wxy/Dz5	many
44	3w4/xyz	many
45	wxy/5zD	many
46	wxy/Tz4	many
47	5wD/xyz	many
48	wDx/y5z	many
49	wxy/3z4	many
50	wxy/5z2	many
51	Dyz/S1x	none
52	w1z/xyS	none
53	15x/T6y	none
54	zy4/5x6	none
55	2xy/4Tz	none
56	xzS/y1w	none
57	Syx/4z5	none
58	xwS/Tzy	none
59	D5z/xwy	none
60	yxD/z35	none
```

###PAT生成スクリプト
この結果をコピペ整形しました。

```rb
pat=[]
DATA.readlines.each do |line|
  no,q,a = line.strip.split(/\s+/)
  next if a == 'none'
  next if a == 'many'
  q = q.split('/').join
  a.scan(/(.)=(.)/) {|fm,to|
    q.gsub!(fm,to)
  }
  pat << q
end
p pat.uniq.sort
__END__
0	Tx4/5yz	x=1,y=S,z=2
1	14S/xyz	none
2	1w6/xyz	many
以下全部の問題文
```
RecordSoundBoxを少し変更してGoogleSpeechAPIv2で指定されている音声フォーマットのファイルを作成する

## 概要
GoogleSpeechAPIv2で使用するための音声ファイルをRecordSoundBoxを利用して生成した際のメモ

ちなみにターミナル等で音声ファイルを生成したいときは以下

```
soxインストール
brew install sox

recコマンドで録音
rec --encoding signed-integer --bits 16 --channels 1 --rate 16000 test.wav
```

## 変更箇所
RecordSoundBoxの中で使用されているALAudioDeviceをALAudioRecorderに置き換える。

```python:MyClass.py
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self, False)
        try:
            #self.ad = ALProxy("ALAudioDevice")
            self.audioRecorder = ALProxy("ALAudioRecorder")
        except Exception as e:
            #self.ad = None
            self.audioRecorder = None
            self.logger.error(e)
        self.filepath = ""

    def onLoad(self):
        self.bIsRecording = False
        self.bIsRunning = False

    def onUnload(self):
        self.bIsRunning = False
        if( self.bIsRecording ):
            #self.ad.stopMicrophonesRecording()
            self.audioRecorder.stopMicrophonesRecording()
            self.bIsRecording = False

    def onInput_onStart(self, p):
        if(self.bIsRunning):
            return
        self.bIsRunning = True
        sExtension = self.toExtension( self.getParameter("Microphones used") )
        self.filepath = p + sExtension
        self.log(self.filepath)
        #if self.ad:
        if self.audioRecorder:
            self.log('audioRecorder created!!!')
            channnels = [0,0,1,0]
            self.audioRecorder.startMicrophonesRecording(self.filepath,'wav', 16000, channnels)
            #self.ad.startMicrophonesRecording( self.filepath )
            self.bIsRecording = True
        else:
            self.logger.warning("No sound recorded")

    def onInput_onStop(self):
        if( self.bIsRunning ):
            self.onUnload()
            self.onStopped(self.filepath)

    def toExtension(self, sMicrophones):
        if( sMicrophones == "Front head microphone only (.ogg)" ):
            return ".ogg"
        else:
```
## 実際に利用できるかチェック

1. sshで接続して/tmp以下に生成された音声ファイルを/home/naoの適当な場所にコピー
2. コレグラフの接続→上級向け→ファイルの転送を使ってダウンロード(FTPクライアントはお好みで)
3. [こちらのRubyスクリプト](http://qiita.com/ysk_1031/items/8b8990a65bc586f33a20)を利用させていただき、speechAPIを叩いて確認(キー等は取得済みとする)

```
% ruby ./speech_api_example.rb recordings.wav
{"result"=>[]}
{"result"=>[{"alternative"=>[{"transcript"=>"アップフロンティア", "confidence"=>0.95207101}, {"transcript"=>"アップフロント"}, {"transcript"=>"フロンティア"}, {"transcript"=>"frontier"}, {"transcript"=>"アップフロントよ"}], "final"=>true}], "result_index"=>0}
```

いけました。
2015年のおすすめテンプレートサイト


##はじめに

ワンライナーは、[hugo](https://github.com/spf13/hugo)や[middleman](https://middlemanapp.com/)を実行できる事が前提となります。


##hugo-incorporated

https://github.com/nilproductions/hugo-incorporated

```bash:
git clone https://github.com/nilproductions/hugo-incorporated && cd hugo-incorporated &&  mkdir -p themes/hugo-incorporated/static && hugo server -w
```

##lanyon-hugo

http://tummychow.github.io/lanyon-hugo/


```bash:
git clone https://github.com/tummychow/lanyon-hugo && cd lanyon-hugo && sed -i "" 's#"baseurl": "http://tummychow.github.io/lanyon-hugo/"#"baseurl": "http://tummychow.github.io"#g' config.json && hugo server
```

##davidl

https://github.com/flexbox/davidl


```bash
git clone https://github.com/flexbox/davidl && bundle install && bower install && middleman server 
```

##landing-page-theme

https://github.com/swcool/landing-page-theme


```bash:
git clone https://github.com/swcool/landing-page-theme && cd landing-page-theme && gem install jekyll && jekyll server
```

##middleman-simple-template

https://github.com/syui/middleman-simple-template 




```bash:
git clone https://github.com/syui/middleman-simple-template && cd middleman-simple-template && bundle install && middleman server
```

詳しい解説はこちら

http://syui.github.io/blog/2015/03/09/hugo-template/


##追記

テンプレートをプレビューするまでの簡易スクリプトを書きました。良さそうなテンプレートがあれば、ぜひ教えてください(プルリクエストしてください)。

以下の方法でテンプレートの追加が可能となります。

また、スクリプト、ツール自体酷い出来ですので、そちらの方もよろしければ、変更してください。


1 スクリプトの実行

```bash:
$ git clone https://github.com/syui/blogstart

$ cd blogstart

$ ./blogstart
```

実行環境... Mac, peco, 


2 プレビューが出来るまでの一連の実行コマンドのコピー、及び追加

```bash:
# コマンド一覧をクリップボードに保存
$ cat << EOF | pbcopy
git clone https://github.com/syui/middleman-simple-template

cd middleman-simple-template

bundle install

middleman server
EOF

# make-themeのメニューを実行する
$ ./blogstart
```


3 スクリプトの書き換え

同じく、`!add-theme`を選択する。

4 プリリクエストを送る
Google Analytics SDK は最新か？

#はじめに
日本語で最新と表示されるSDKは最新ではないかも？を疑って欲しいです。
iOSではIDFAの確認などもあり、はまりどころになっています。

#コンテンツの内容

##日本語版

`3.08`が最新

![スクリーンショット 2015-03-09 18.12.00.png](https://qiita-image-store.s3.amazonaws.com/0/12362/dc22f8c7-bc90-167e-7303-77d9495f295c.png)

##英語版
`3.10`が最新
![スクリーンショット 2015-03-09 18.11.43.png](https://qiita-image-store.s3.amazonaws.com/0/12362/af4ab14a-875d-2de3-52e8-ccadb72be66e.png)

#URL
最後のパラメータが`ja`か、`en`だけの差です。
##日本語
https://developers.google.com/analytics/devguides/collection/ios/resources?hl=ja

##英語
https://developers.google.com/analytics/devguides/collection/ios/resources?hl=en

#さいごに
英語版を確認する癖を付けておけば良いだけ
Androidについては、英語版も日本語版も同じ`英語ページ`で表示されていたので
間違えないようです :disappointed_relieved: 

https://developer.android.com/google/play-services/setup.html?hl=ja
Goのメソッドを（ちょっとだけ）賢く補完するための yasnippet 

# やりたいこと
![opt.gif](https://qiita-image-store.s3.amazonaws.com/0/62053/74b49d79-f959-0163-baba-61824a6d9ed6.gif)

gifのように構造体があって，

```go:
type Person struct {
	name string
	age  int
}
```

こんなふうなメソッドを補完したい

```go:
type Person struct {
	name string
	age  int
}

// *Person って補完して欲しい
func (this *Person) ()  {
	
}
```

# snippet の定義
```:~.emacs.d/snippets/go-mode/method
# -*- mode: snippet -*-
# name: method
# key: method
# --
func (${1:this} *`(extract-strcture-name)`) ${2:name}($3) $4 {
  $0
}
```

# snippet に埋め込むelisp関数
```lisp:init.el
(defun extract-strcture-name ()
  "Extract structure name above current point."
  (save-excursion
    (when (re-search-backward "type \\([^ ]*\\) struct {" nil t)))
  (insert (match-string 1)))
```
「ネットワークインターフェイスあたりのセキュリティグループ数」の上限緩和申請方法


# VPCセキュリティグループの制限

VPCセキュリティグループには **ネットワークインターフェイスごとに5個まで** という制限がある。
ついでに **セキュリティグループあたりのルール数は50個まで** という制限もあり、
そのうえ **ルール数 ✕ セキュリティグループ数は250個まで** という制限もある。

[Amazon VPC Limits](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html)

# 上限緩和申請方法

素直にサポートセンターから上限緩和申請しようとしてもそのような選択肢は見つからない。
サポートセンターのケース作成時に各項目を下記のように入力することで申請できる。

規定のフォームではないが2時間弱で対応してくれた。
サポートプランにも依るかもしれない。

| 項目 | 入力内容 |
|---|---|
| 内容(Regarding) | 「サービス制限の増加(Service Limit Increase)」を選択 |
| 制限タイプ(Limit Type) | 「VPC」を選択 |
| 制限(Limit) | 何かしら適当に選択 |
| 申請理由の説明<br>(Use Case Description) | ネットワークインターフェイスあたりのセキュリティグループ数の上限緩和である旨を明記した上で<br>・変更後のネットワークインターフェイスあたりのセキュリティグループ数<br>・変更後のセキュリティグループあたりのルール数<br>を記載 |

# 注意点

**ルール数 ✕ セキュリティグループ数は250個まで** という制限内で申請すること。
例えば、ネットワークインターフェイスあたりのセキュリティグループ数を5→10個に変更した場合、セキュリティグループあたりのルール数は50→25個にする。

参考に・・・

| SG数/ENI | ルール数/SG | 総ルール数 |
|---|---|---|
| 5 | 50 | 250 |
| 6 | 41 | 246 |
| 7 | 35 | 245 |
| 8 | 31 | 248 |
| 9 | 27 | 243 |
| 10 | 25 | 250 |
WordPressの投稿中の一番最初の画像のURLを取得する

忘備録。
アイキャッチ画像等が指定されない投稿でも、サムネイルとして画像を使いたい場合等に、投稿内にでてくる一番最初の画像で代替してしまおうという時に使うためのもの。

```php

// 投稿内に出てくる一番最初の画像を取得する
function catch_post_image() {
	global $post;
	$first_img = '';
	preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);

	if (isset($matches[1])) {
		$first_img = $matches[1][0];
	}
	
	if(empty($first_img)){
		$first_img = '';
	}

	return $first_img;
}

```
rails 4 の fragment cache（フラグメントキャッシュ）まとめ

# fragment cache とは
rails で利用できる view の一部分をキャッシュする機能。rails 3以上ならデフォルトで利用できる。railsは view のレンダリングが遅いので、アクセスの多いサイトはキャッシュの利用が必要になってくる。

```erb
<% cache {some_key} do %>
  cache したい HTML
<% end %>
```
上記のように、{some_key} を指定すると、その中身をキャッシュしてくれる。{some_key} の部分は、省略もできるし、Stringやオブジェクトも指定できる。

# 基本は skip_digest: true かつ expires_in: オプションをつける

```erb
<% cache "data", expires_in: 1.minutes, skip_digest: true do %>
  <%= @data.text %>
<% end %>
```
リアルタイムに更新が反映されなくていい箇所は、上記のように時間によってキャッシュを expire させるのがややこしいことを何も考えなくて良いので楽である。expires_in: 1.seconds でもキャッシュするHTML内でSQLを発行している場合、十分早くなる。

コントローラ側も特に fragment_exist? のようなことはやらず下記のように普通にロードすれば良い。ActiveRecordは遅延評価なので、viewで表示に必要な場合のみSQLが発行される。

```rb
def index
  @data = Data.where.order("id DESC")
end
```

# キーにStringを指定した場合
```erb
<% cache "key" do %>
  cache したい HTML
<% end %>
```
この場合は、Stringのキーに対応した形でシンプルにHTMLがキャッシュされる。内部的に実際には使われるキーにはデフォルトだと中身のHTMLを元に作ったdigestが付与されるため、cacheしたいHTML自体が変更されれば、digestが変更され、自動でキャッシュが更新される。

しかし下記のような場合

```erb
<% cache "key" do %>
  <%= @some_db_data %>
<% end %>
```
`@some_db_data`の中身が変更されても、キャッシュには変更が反映されない。キャッシュのキーに含まれるdigestはあくまでHTMLを元に作られるため、データの変更があってもdigestは変更されないからである。

また、自動で付与されるdigestを利用しないようにするには

```erb
<% cache "key", skip_digest: true do %>
  <%= @some_db_data %>
<% end %>
```
とする。この場合、HTMLに変更があったとしても、キャッシュには反映されず変更前のものが表示される。

# キーを省略した場合
```erb
<% cache do %>
  cache したい HTML
<% end %>
```
上記のように、キーを省略した場合は、ページのurlからキーが自動で作られる。url依存のキーなので、同じページでこの形を複数記述すると、キーのバッティングがおきて、どちらかのキャッシュが上書きされて大変なことになる。

# キーにオブジェクトを指定した場合
```erb
<% cache @object do %>
  <%= @object.text %>
<% end %>
```
オブジェクトを指定した場合は、`@object.cache_key`がキャッシュのキーとなる。ActiveRecordのオブジェクトの場合、IDや、updated_at を元にキーが作成されるので、オブジェクトのupdated_atが変更されると自動でキャッシュも更新される。

```erb
<% cache @objects do %>
  <% @objects.each do |object| %>
    <%= object.text %>
  <% end %>
<% end %>
```
上記のように配列にした場合は、各オブジェクトに対して cache_key が呼ばれてそれを連結したものがキャッシュのキーになる。よって配列の順番や中身が変更されればキャッシュは更新される。

# つまづいた点
コントローラ側で

```rb
def index
  @objects = SomeModel.findAll
end
```
として、view側で

```erb
<% cache "object#{@objects.first.id}" do %>
  <% @objects.each do |object| %>
    <%= object.text %>
  <% end %>
<% end %>
```
と書いた場合と

```erb
<% cache "objects" do %>
  <% @objects.each do |object| %>
    <%= object.text %>
  <% end %>
<% end %>
```
と書いた場合で負荷テストの結果が大幅に変わった。
後者の方が大きく早かったのだけど、単純に後者は`@objects`へのアクセスががないので、SQLがそもそも発行されていないというのが原因だった。気づいてみればなるほどという感じだけど。。。

# russian doll caching（ロシアンドールキャッシング）とは
ネストされたフラグメントキャッシュの内側のキャッシュが更新されると、外側のキャッシュも更新してくれる機能。rails 4ならデフォルトで利用可能。

```erb
<% cache @company do %>
  <h1><%= @company.name %></h1>
  <ul>
    <% cache @company.members %>
      <% @company.members.each do |member| 
        <li><%= member.name %></li>
      <% end %>
    <% end %>
  </ul>
<% end %>
```
上記のようなネストされた構造のとき、membersに変更があったとしても、companyに変更がなければcompanyのキーが変更されず、キャッシュは更新されない。
しかし、memberのmodelに

```rb
class Member < ActiveRecord::Base
  belongs_to :company, touch: true
end
```
と書いておくと、ネストされた親のキーにも更新が伝搬してくれるようになる。
tmux上からxcodebuild(xctool)でテストするとiOS Simulatorがタイムアウトする


xcodebuild(もしくはxctool)でテストを実行すると、以下の様なログでSimulatorの起動がタイムアウトする現象にでくわした。


```
  run-test MyAppTests.xctest (iphonesimulator8.1, application-test)
    [Info] Installed 'jp.horimislime.MyApp'. (614 ms)
    [Info] Launching test host and running tests ... (0 ms)
    [Info] The simulator failed to start, or the TEST_HOST application failed to run. Simulator error: Simulator session timed out.; will retry 2 more times. (0 ms)
    [Info] Verified iOS Simulators... (0 ms)
    [Info] Shut down iOS Simulator... (1230 ms)
    [Info] Stopped any existing iOS simulator jobs to get a fresh simulator. (5 ms)
    [Info] The simulator failed to start, or the TEST_HOST application failed to run. Simulator error: Simulator session timed out.; will retry 1 more time. (0 ms)
    [Info] Verified iOS Simulators... (0 ms)
    [Info] Shut down iOS Sim
    
〜中略〜
Failures:

  0) -[TEST_BUNDLE FAILED_TO_START] (MyAppTests.xctest)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
There was a problem starting the test bundle: The simulator failed to start, or the TEST_HOST application failed to run. Simulator error: Simulator sessi
    
```

色々試してるとtmux上でxcodebuildした時だけ再現して、素のshellで実行すると問題ないので悩んだ...

どうやらtmux上でpbcopy/pbpasteが動かない有名な問題と似た原因らしい。
[ChrisJohnsen/tmux-MacOSX-pasteboard](https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard#why-pasteboard-breaks)
> tmux uses the daemon(3) library function when starting its server process. In Mac OS X 10.5, Apple changed daemon(3) to move the resulting process from its original bootstrap namespace to the root bootstrap namespace. This means that the tmux server, and its children, will automatically and uncontrollably lose access to what would have been their original bootstrap namespace (i.e. the one that has access to the pasteboard service).

OSXの各プロセスはnamespaceを持っていて、プロセスから他のプロセスを呼ぶ場合namespaceによってアクセスが制限される場合がある。tmuxサーバ(とクライアント)のプロセスとOSXのクリップボードプロセスは互いにアクセスできないnamespace上で動いているせいで、tmuxウインドウから素直にpbcopy/pbpasteが使えないらしい。

tmux上でxcodebiuldするとiOS Simulatorが起動できないのもこのnamespaceが問題らしく、クリップボード問題と同様に`brew install reattach-to-user-namespace`して.tmux.confに一行追記したらあっさりxcodebuildが成功した。

```:tmux.conf
set-option -g default-command "reattach-to-user-namespace -l zsh"
```

----
このOSXプロセスによる問題、Jenkins上でxcodebuildしてハマる人が多いらしく情報多かった。

SOのスレッドによると
[jenkins - Timeout when running xcodebuild tests under Xcode 6 via SSH - Stack Overflow](http://stackoverflow.com/questions/25380365/timeout-when-running-xcodebuild-tests-under-xcode-6-via-ssh)

- OSXのJenkinsは初期設定だとLaunchDaemons経由で起動する
	- LaunchDaemonsで起動したプロセスはGUIへのアクセスが許可されていない
	- XCode5時代のxcodebuildはなぜかこのcontextで動いたらしいが、6以降は不可
- LaunchAgentsから立ち上げたプロセスはGUIアプリを扱うことができる
	- Jenkinsジョブ上でiOS Simulatorを使うなら起動方法を変えると良い

OSXのsshdもLaunchDaemonsで動いているようなので、SSH越しにリモートサーバのSimulatorを起動する場合も設定を変える必要があるみたい。
sed で置換

sed でファイル内の特定の文字を、改行を含む別の文字列に置き換えたい時のメモ。

**追記**
sed には a(append) コマンド、 i(insert) コマンドがあるようで、こちらでも可能でした。
コメントで教えて頂きました。ありがとうございます！

```
$ echo "hoge" | sed -e '/hoge/a fuga'
hoge
fuga

$ echo "hoge" | sed -e '/hoge/i fuga'
fuga
hoge
```

**追記ここまで**

`hoge` の後に、`fuga` を追加したい場合

```
$ echo "hoge" | sed -e 's@hoge@\0\nfuga@'
hoge
fuga
```

`hoge` の前に、`fuga` を追加したい場合

```
$ echo "hoge" | sed -e 's@hoge@fuga\n\0@'
fuga
hoge
```

`hoge` の前に、`fuga` と`hogera`を追加したい場合

```
$ echo "hoge" | sed -e 's@hoge@fuga\nhogera\n\0@'
fuga
hogera
hoge
```


sed で改行を含む置換は面倒と散見されたけど、
この方法だと普通に `\n` でいけるみたい。
文字中の `()[]` は `\(\)\[\]` とエスケープが必要。

```
$ sed --version
GNU sed version 4.2.1
```


# 参考

* [.htaccess - search and replace within specific htaccess files - linux - Stack Overflow](http://stackoverflow.com/questions/7789581/search-and-replace-within-specific-htaccess-files-linux)
nginxでvirtualhostを設定する

nginxにvirtualhost設定をしたときのメモ。

#### 環境
---
 * VirtualBox 4.3
 * ubuntu 14.04
 * nginx 1.6.2

#### default.conf設定
---

/etc/nginx/conf.d/default.conf

```bash
server {
    listen       80;
    server_name  hoge1.com;
    
    access_log  /var/log/nginx/log/hoge1.access.log  main;
    
    location / {
        root   /usr/share/nginx/html/hoge1;
        index  index.html index.htm;
    }
}

server {
    listen       80;
    server_name  hoge2.com;
    
    access_log  /var/log/nginx/log/hoge2.access.log  main;
    
    location / {
        root   /usr/share/nginx/html/hoge2;
        index  index.html index.htm;
    } 
}

server {
    listen       80;
    server_name  hoge3.com;
    
    access_log  /var/log/nginx/log/hoge3.access.log  main;
    
    location / {
        root   /usr/share/nginx/html/hoge3;
        index  index.html index.htm;
    }
}            
```
※hoge1,hoge2,hoge3.comを用意した

configtestをしてみる

```bash
$ sudo /etc/init.d/nginx configtest
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```
※問題無し

#### location-root(documentroot)にディレクトリを用意し、index.htmlを配置
----

```bash
$ cd /usr/share/nginx/
$ sudo mkdir hoge1 hoge2 hoge3
$ cd hoge1
$ sudo vim index.html
----
hoge1.com
----
※hoge2,hoge3にも同じ事をします
```

#### ポートフォワーディング(windows + virtualbox + ubuntuのみ)
---
[virtualbox + ubuntu tips](http://qiita.com/duke-gonorego/items/cf3a5d10d868cb65cc54)の「ubuntuへwindowsからターミナルで接続したい」を参考に、ubuntuへの80へのポートフォワーディング設定をする。
※とりあえずホスト「10000」、ゲスト「80」に設定した

#### windowsのhostsファイルを設定する(windows + virtualbox + ubuntuのみ)
---
nginxのconfに設定したドメインを解決させる
C:\Windows\System32\drivers\etc\hosts

```bash
127.0.0.1	hoge1.com
127.0.0.1	hoge2.com
127.0.0.1	hoge3.com
```

#### nginxを再起動する
---

```bash
$ sudo /etc/init.d/nginx restart
```

#### ブラウザで確認
---

```
http://hoge1.com:10000/index.html
http://hoge2.com:10000/index.html
http://hoge3.com:10000/index.html
```

#### ログ確認
---

```bash
$ cd /var/log/nginx/log
※hoge*.access.logにアクセスログが出力されます
```
ディレクトリ移動したらls pushd popd cd autocd対応版

cd実行後にlsを実行するには他のサイトでも紹介されているようにcdのaliasを定義すればいい。

じゃあpushdは? popdは? autocdは?
となるといちいち全部のalias定義するのは面倒だからディレクトリを移動したらlsするようにする

#ディレクトリを移動したら自動でls
.bashrcあたりに下記のコードを追記する。

```bash
autols(){
  [[ $AUTOLS_DIR != $PWD ]] && ls
  AUTOLS_DIR="${PWD}"
}

export PROMPT_COMMAND="autols" 
```

最後の行が肝心で、`PROMPT_COMMAND`にコマンド名を設定するとプロンプトが表示される前に、そのコマンドが実行される。  


#ターミナル起動時には実行しない
上記のコードだと新しくターミナルを立ち上げるとホームディレクトリの内容が表示されて個人的には鬱陶しい。

```bash
autols(){
  [[ -n $AUTOLS_DIR ]] && [[ $AUTOLS_DIR != $PWD ]] && ls
  AUTOLS_DIR="${PWD}"
}

export PROMPT_COMMAND="autols" 
```
る。

別の書き方もあるので紹介する。

###起動時に`AUTOLS_DIR`に値を設定しておく

```bash
AUTOLS_DIR="$PWD"
autols(){
  [[ $AUTOLS_DIR != $PWD ]] && ls
  AUTOLS_DIR="${PWD}"
}

export PROMPT_COMMAND="autols" 
```

###変数展開を使う
[シェルの変数展開](http://qiita.com/bsdhack/items/597eb7daee4a8b3276ba)

```bash
autols(){
  [[ ${AUTOLS_DIR:-$PWD} != $PWD ]] && ls
  AUTOLS_DIR="${PWD}"
}

export PROMPT_COMMAND="autols" 
```


#おまけ

##lsで色がでない

Linuxの場合は下記のようにlsにオプションを渡せばいい。

```bash 
ls --color=always
```

OSXなどDarwinもオプションを渡せばいいのだが、手元に環境がないため各自で調べて欲しい。


##autocd
ちなみにちなみに.bashrcに

```bash
shopt -s autocd
```

と書くとcdを省略して/etcとか~/Downloadsとかでディレクトリを移動できるようになる。

##zshの場合

```zsh
setopt autocd
autoload -Uz add-zsh-hook
add-zsh-hook precmd autols

autols(){
  [[ ${AUTOLS_DIR:-$PWD} != $PWD ]] && ls
  AUTOLS_DIR="${PWD}"
}
```

詳しい説明は省くが、`add-zsh-hook precmd autols`がbashの`export PROMPT_COMMAND="autols"`にあたる。
Node.js CLI/TUI ライブラリ一覧

# はじめに
ここで紹介してるライブラリはほとんど全角文字に対応していないので、日本語を使うと表示が崩れます。

# ライブラリ
## blessed
https://github.com/chjj/blessed
テキストユーザインタフェースを作る ncurses 的なやつ

> 追記 2015/4/18
blesseed v0.1.1 で日本語もサポートされるようになりました。
![表示が崩れない](https://qiita-image-store.s3.amazonaws.com/0/31573/b528ab2e-1aa1-3437-370c-435437bca2e1.png)

```coffeescript:blessed-jp.coffee
blessed = require "blessed"

screen = blessed.screen {
  fullUnicode: true
}
screen.key "q", -> process.exit()

list = blessed.list
  style: selected: bg: "blue"
  keys: true
  vi: true

screen.append list
list.add "hoge"
list.add "あいうえお"
list.add "fuga"
screen.render()
```


## Sparkline
https://github.com/shiwano/sparkline
▁█▄▆▂ <- こんな感じのデコボコ作る奴

## drawille
https://github.com/madbence/node-drawille
https://github.com/madbence/node-drawille-canvas
点字使って図形

## blessed-contrib
https://github.com/yaronn/blessed-contrib
blessed に Sparkline, drawille を使ったウィジェット追加したやつ

## cli-table
https://github.com/Automattic/cli-table
簡単な表を作る

## node-progress
https://github.com/tj/node-progress
プログレスバーを表示する

```coffeescript:progress.coffee
ProgressBar = require "progress"

bar = new ProgressBar ":bar :current/:total", {
  total: 10
  width: 20
}

do f = ->
  bar.tick()
  setTimeout f, 100 unless bar.complete

```

## East Asian Width
https://github.com/komagata/eastasianwidth
文字列の幅を計算するライブラリ
日本語に対応した物を作りたい場合は必須

# おまけ: TUI アプリ
## vtop
https://github.com/MrRio/vtop
blessed とか使って top コマンドをいい感じにしたやつ

## ✋ slap
https://github.com/slap-editor/slap
sublime 風のテキストエディタを blessed を使用して実装

```bash:python3がデフォのOSの場合以下のコマンドでインストールする
sudo npm i -g slap --python=python2
```

終了は Ctrl-q で
Redmine3.0で使用できなかったプラグイン（2015/3/9付け）

Redmine2.6 → 3.0 へDB込みで移行した場合に、使用不可になるプラグインがあったのでメモ。

#### 使用可能
* [redmine_vividtone_my_page_blocks](https://github.com/vividtone/redmine_vividtone_my_page_blocks)
* [redmine_absolute_dates](https://github.com/suer/redmine_absolute_dates.git)
* [redmine_work_time](https://bitbucket.org/tkusukawa/redmine_work_time) ←最新のdefaultブランチで対応されてました
* [redmine_side_menu](https://github.com/ameya86/redmine_side_menu.git)
* [redmine_importer](https://github.com/zh/redmine_importer.git)
* [redmine_default_version](https://github.com/benasher44/redmine_default_version.git)
* [redmine_add_subversion_links](https://github.com/masamitsu-murase/redmine_add_subversion_links.git)

* [redmine_code_review](https://bitbucket.org/haru_iida/redmine_code_review)
→redmine_side_menuと排他ですが使えました。（2015/3/10修正）

#### 使用不可
* [redmine_issue_extensions](https://github.com/planio-gmbh/redmine_issue_extensions.git)
* [redmine_xls_export](https://github.com/two-pack/redmine_xls_export.git)
* [redmine_charts2](https://github.com/pharmazone/redmine_charts2.git)
* [redmine_knowledgebase](https://github.com/alexbevi/redmine_knowledgebase.git)
* [redmine_time_tracker](https://github.com/hicknhack-software/redmine_time_tracker.git)


time_trackerは置いといて、他の４つのプラグインが使えないのは痛い。


環境は以下の通り。
![image01.png](https://qiita-image-store.s3.amazonaws.com/0/63464/1c622c56-43d8-8850-8a94-c9d688a47429.png)
同じ/異なるStoryboardでの画面遷移

下記の2つのStoryboard (Main, Another) と、それに紐付く3つのViewControllerがあったとして、ViewController1 から ViewController2 への同じStoryboard内での画面遷移と、ViewController2 から ViewController3 への異なるStoryboardでの画面遷移の方法をまとめます。

* Main.storyboard
 * ViewController1 (Initial View Controller)
 * ViewController2
* Another.storyboard
 * ViewController3 (Initial View Controller)


# 同じStoryboard内での遷移

Main内の ViewController1 から ViewController2 に遷移。

## Segueを利用する

### ユーザ側のアクションで遷移させたい場合 (例: ボタンをタップしたら遷移)

Storyboard上で、ViewController1 の UIButton などから ViewController2 にSegueを繋ぐ (のみでOK)。

![sc.png](https://qiita-image-store.s3.amazonaws.com/0/4031/981a9ec9-d7be-4c46-db54-5892ca5cfe79.png)

### アプリ側で画面遷移を制御したい場合 (例: データを受信したら遷移)

1) Storyboard上で、ViewController1 の View Controller から ViewController2 にSegueを繋ぐ。
2) Segueの名前を設定。

![sc2b.png](https://qiita-image-store.s3.amazonaws.com/0/4031/636e4506-1406-2c09-1ab7-0e49ee5c169b.png)

3) 遷移させたい場面で下記のコードを記載。

```swift:ViewController1.swift
performSegueWithIdentifier("screenTransition", sender: self)
```

## Segueを使用しない

遷移させたい場面で下記のコードを記載。

```swift:ViewController1.swift
let next: UIViewController = storyboard.instantiateViewControllerWithIdentifier("ViewController2") as! UIViewController
presentViewController(next, animated: true, completion: nil)
```


# 異なるStoryboardへの遷移

Main内の ViewController2 から Another内の ViewController3 に遷移。

```swift:ViewController2.swift
let storyboard: UIStoryboard = UIStoryboard(name: "Another", bundle: nil)
let next: UIViewController = storyboard.instantiateInitialViewController() as! UIViewController
presentViewController(next, animated: true, completion: nil)
```

ViewController3 が Another.storyboard の Initial View Controller に設定されていれば、コントローラ名の明記は不要。

![sc3.png](https://qiita-image-store.s3.amazonaws.com/0/4031/426f4544-d6ef-c81c-2ca4-aa452df67095.png)
ファイル一行目をファイル名に変換するスクリプト

ファイル一行目をファイル名に変換するスクリプト書いた

```bash:rename.sh
#!/bin/bash

for file in *.txt; do
  firstline=$(cat "$file" | head -1 | sed -e 's/\//-/g')
  [ -n "$firstline" ] && [ ! -e "${firstline}.txt" ] &&
  mv "$file" "${firstline}.txt"
done
```

何かおかしいところがあったら教えて下さい！
エクスプローラーの右クリックメニューからBrowserSyncを実行する

HTMLのあるフォルダでシフトキーを押しながら右クリックして「コマンドウィンドウをここで開く」を選んで

    browser-sync start --server --files **

と入力するのがめんどくさかったので、フォルダ内で右クリックした時のメニュー内に上記コマンドを実行するショートカットを作りたいなと思って調べてみました。
レジストリに簡単な値を追加するだけでできたので、手順を紹介します。

※誤ったレジストリ操作によりPCが不安定になったり起動しなくなったりしても責任は負いかねます。自己責任でご利用ください。

レジストリエディタを開いて HKEY_CLASSES_ROOT\Directory\Background\shell と辿ります。
そしてshellを右クリックして、新規→キーと選択します。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/56668/20a04187-a7f8-b6c8-d257-e81245b7fe02.png)

新しいキーが作られるので適当に名前を付けます。ここで付けた名前が右クリックメニューに表示されるようになります。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/56668/97a7b835-e6b4-0689-a4a8-d80069221f00.png)

作られたキーを右クリックして、 command という名前のキーを作ります。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/56668/e286e6a2-23dc-38f3-ee48-555245699326.png)

(既定) というところをダブルクリックして、値のデータを `[[browser-sync.cmdへのフルパス]] start --server --files **` のようにします。
browser-syncのフルパスは、 *ユーザーのホームディレクトリ\AppData\Roaming\npm\browser-sync* です。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/56668/207269ca-7f47-8af4-2cb8-ec66ee1289a1.png)
![7.png](https://qiita-image-store.s3.amazonaws.com/0/56668/952b7e9f-b46f-6739-c0e1-519af436ac71.png)
![8.png](https://qiita-image-store.s3.amazonaws.com/0/56668/3066110f-632c-6290-8337-6b101f0fda5f.png)

これでエクスプローラーの右クリックメニュー内にBrowserSyncという項目が出てくるようになります！

![9.png](https://qiita-image-store.s3.amazonaws.com/0/56668/8eb90501-13f8-3527-787a-6a14d5a60a5e.png)
virtualbox + ubuntu tips

windowsにvirtualbox + ubuntuの環境を構築したときに
使いやすくするためのメモ

#### 環境
---
 * VirtualBox 4.3
 * ubuntu 14.04

#### ubuntuへwindowsからターミナルで接続したい
---
virtualbox上のubuntuのターミナルで操作しても問題はないのですが、
使い慣れたターミナルを利用したいというときに。

1.ubuntuのSSHサーバをインストールする

```bash
$ sudo apt-get install openssh-server
```

2.設定ファイルの編集

```bash
$ sudo vi /etc/ssh/sshd_config

---変更箇所---
PermitRootLogin no
---変更箇所---

---変更箇所---
PasswordAuthentication yes
---変更箇所---
```

3.sshサーバ再起動

```bash
$ sudo /etc/init.d/ssh restart
```

4.確認

```bash
$ sudo lsof -nPi:22
---例---
sshd    10283  root    3u  IPv4  49690       TCP *:22 (LISTEN)
---例---
```

5.ubuntuを一度終了し、以下を実施

 1. VirtualBoxマネージャを開く
 2. 「設定」→「ネットワーク」→「アダプタ1」→「高度」を選択
 3. 「ポートフォワーディング」を選び、「＋」を押下し、以下のように入力しOKを押す

 ```bash
　ホストポート：2222(任意の数値)
　ゲストポート：22
 ```

6.ubuntuを起動し、poderosa等で接続してみる

 1. ホスト名「localhost」、プロトコル「SSH2」、ポート「2222(先ほど設定した値)」、アカウント(作成したアカウント)、認証方法(任意)、パスフレーズ(任意)を設定する
 2. ログインする

#### vimインストール

```bash
$ sudo apt-get install vim
$ vim .bashrc
alias vi='vim'
$ source .bashrc
```

#### bashプロンプト表示切替

```bash
$ cd ~/
$ vim .bashrc
※最終行辺りに
---
PS1='[\u@\H \W]\$ '
---
$ source .bashrc
```
[Rails4] rbenvで管理している Ruby をバージョンアップする(Mac OSX, Linux[CentOS, Ubuntu]など)

結局やることはrbenv, ruby-buildのアップデートになります。
rbenv環境をgit入れたのか、brewで入れたのかでやり方が異なるようです。

# 事前確認

```rb
$ rbenv install -l
```

インストール対象リストを確認しておきます。

# Homebrew

Macではbrewで入れることが多いかと思います。

```rb
$ brew update
$ brew upgrade rbenv ruby-build
```

# git

CentOS, UbuntuなどでGitで入れている場合は、最新のバージョンをgitで落として来ればいいです。

```rb
$ cd ~/.rbenv
$ git pull
$ cd ~/.rbenv/plugins/ruby-build
$ git pull
```

# 確認

インストール出来るバージョンが増えたりしているかと思います。

```rb
$ rbenv install --list
```

お好きなモノをインストール。

```rb
$ rbenv install 2.2.1
Downloading ruby-2.2.1.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/5a4de38068eca8919cb087d338c0c2e3d72c9382c804fb27ab746e6c7819ab28
Installing ruby-2.2.1...
Installed ruby-2.2.1 to /Users/watashi/.rbenv/versions/2.2.1
```

global指定してみます。

```rb
$ rbenv global 2.2.1
$ ruby -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14]
```

# Bundlerをインストール

rbenvでrubyを管理していると、インストールされるgemはrubyのバージョンに紐づくので、新しくrubyを入れたら、gemをインストールし直す必要があります。
bundlerを使って、プロジェクトに必要なgemを管理している場合は、bundlerを入れなおします。

```rb
$ bundle install
rbenv: bundle: command not found

The `bundle' command exists in these Ruby versions:
  2.2.0
```

ruby2.2.0にはあるけど、今のバージョンには、bundleコマンドが無いよって言われます
そこでBundlerをいれます。

[このへん](https://rubygems.org/gems/bundler)を参考に。

```rb
$ gem install bundler -v '1.8.4'
Fetching: bundler-1.8.4.gem (100%)
```

# Railsをインストール

↑と同じような理由でrailsを入れなおします。

```rb
$ gem install rails
```

# Yosemiteでのbrewのエラーもあるらしいです

[こちらを](http://qiita.com/sue738/items/7ab03ecc9f6fcf37408d)
wordpress　フック系メモ

使ったことのあるフックを備忘録代わりに挙動・使用用途などをメモ

#アクションフック
`add_action('フック名', '関数名')`　で指定する

##parse_query

クエリのパース処理の最後の実行される。

取得するパラメータを自前で定義した際の入力チェック・加工処理時に使用。


##pre_get_posts

クエリが実行する直前に実行される。

月別アーカイブなどから特定カテゴリのみ検索条件からはずす場合などに使用。

活用するとかなり便利なフック。


##generate_rewrite_rules

パーマリンクの設定・リフレッシュ時などに実行される模様。

パーマリンク設定に追記・修正を加える場合に使用。

追記後に管理画面からパーマリンク設定を更新する必要あり。
※`$wp_rewrite->flush_rules()`の記述でも対応できるが、書き方によっては多少オーバーヘッド出るとか


#フィルターフック
`add_filter('フック名', '関数名')`　で指定する

##query_vars

URLを解析する直前に実行される。

自前でパラメーターを定義する際に使用。


#フックはいろいろと便利

フックを活用するとコアファイルを汚さない改修が加えれるだけでなく、普通に書けば複雑になる処理が簡略化できたり、サイト全体の処理をfunction.phpでまとめることができたりといろいろと便利ですね。
Java/Scala/PHPの日付フォーマット対応表


PHPの`date`関数に使える日付フォーマットと、Java/Scalaの`SimpleDateFormat`や`joda-time`で使える日付フォーマットの対応表です。

## 日付フォーマット対応表


	|	PHP	|	Java/Scala	|	例
---|---|---|---
年(2桁)	|	y	|	yy	|	99や06
年(4桁)	|	Y	|	yyyy	|	1999や2006
月	|	n	|	M	|	1 から 12
月(ゼロ埋め)	|	m	|	MM	|	01 から 12
月(テキスト)	|	M	|	MMM	|	Jan から Dec
日	|	j	|	d	|	1 から 31
日(ゼロ埋め)	|	d	|	dd	|	01 から 31
時(12時間)	|	g	|	h	|	1 から 12
時(24時間)	|	G	|	H	|	0 から 23
時(12時間、ゼロ埋め)	|	h	|	hh	|	01 から 12
時(24時間、ゼロ埋め)	|	H	|	HH	|	00 から 23
分	|	なし	|	m	|	0 から 59
分(ゼロ埋め)	|	i	|	mm	|	00 から 59
秒	|	なし	|	s	|	0 から 59
秒(ゼロ埋め)	|	s	|	ss	|	00 から 59


## よく使うフォーマットの対応表

PHP	|	Java/Scala	|	例
---|---|---
Y-m-d H:i:s	|	yyyy-MM-dd HH:mm:ss	|	2006-01-02 15:04:05
Y/m/d H:i:s	|	yyyy/MM/dd HH:mm:ss	|	2006/01/02 15:04:05


## 関連

* [Scala: joda-timeで日付をISO-8601形式にフォーマットしたい - Qiita](http://qiita.com/suin/items/6070551c95bdae88dd2b)
【CSS】背景のアニメーション

とある要素にhoverしたとき、背景画像をちょっと大きくしたいなと思ったので

```css
a {
  background-size: auto 100%;
  transition: 0.3s;
}
a:hover {
  background-size: auto 110%;
}
```

(ベンダープレフィックス、その他の要素は省略)

としてたのですがががが。。。
IE11が動かないorz

ほかのCSSアニメーションは何の違和感もなく動いているのに、background-sizeだけは反応してくれない
スムーズな動きは全くなく、transitionなんて無かったかのようにカクカク動きやがる
IEなんて無くなればい(ry

さてどうしたもんか
ここでjsを使うのもなぁ、、、ということで
scaleで対処することにしました

```css
a img {
  transform : scale(1);
  transition: 0.3s;
}
a:hover img {
  transform : scale(1.1);
}
```

これでIE11でも問題なく動いてくれましたとさまる
Xcode の iOS Simulator を単体で開く方法



### 1. iOS Simulater がある場所を開く

ターミナルで

```shell-session
$cd /Applications/Xcode.app/Contents/Developer/Applications
$open .
```

### 2. iOS Simulater をアプリケーションフォルダにコピー

1 で開いたディレクトリに iOS Simulater が入ってるので,
それをアプリケーションフォルダにドラッグ&ドロップ


### 3. iOS Simulater を起動する

アプリケーションフォルダにある iOS Simulater をダブルクリック.
単体でシミュレータが起動します.
perlのワンライナーで複数行の置換を行う

perlのワンライナーでよく出てくるのはこんなもの

```
$ echo "hoge\nfuga\npiyo" | perl -pe 's/ge/GE/; s/pi/PI/;'
hoGE
fuga
PIyo
```

この場合、1行ずつ評価するため複数行の書き換えは出来ない。

複数行の場合`-0`オプションを使ってオプション修飾子に`m`つけて実行すれば良い。

```
$ echo "hoge\nfuga\npiyo" | perl -0pe 's/ge\nfu//m'
hoga
piyo
```

# 解説
`-p`はデフォルトでは1行ずつ`-e`の引数を評価する。つまりセパレータが`\n`。
`-0`でセパレータがヌル文字(`\0`)になる。つまり、ファイル全体を一度に読み込むことになる（よって、**巨大なファイルに実行するのはおすすめしない**）。
また、正規表現のオプション修飾子に`m`を指定し複数行モードにする（`s/hoge/fuga/m`←この`m`）

# その他
perlのワンライナー自体はここらへん見たらいいと思う

- [404 Blog Not Found:perl - ワンライナーの書き方入門](http://blog.livedoor.jp/dankogai/archives/51026593.html)
- [環境に依存しないワンライナーを書くならsedよりperlの方がいい - Qiita](http://qiita.com/takc923/items/8654d69008e921c9c9fb)
VirtualBoxとRDPのクリップボード共有が競合する

VirtualBoxの[一般]-[高度]-[クリップボードの共有]を[双方向]、
RDPの[ローカルリソース]-[クリップボード]チェックボックスをオン、
以上の設定で、ホストからゲストへRDP接続すると、
ホスト・ゲストともにクリップボードが一切使えなくなる。
（ゲストを閉じるかRDPを切断すると回復する）

参考
VirtualBox 4.3.24 r98716
ホスト Windows 7 Pro x64
ゲスト Windows 10 TP x64
ES6のArrow Functionでの注意点

# ES6のArrow Functionでオブジェクトを返す場合

ちょっと悩んだので備忘録。

```js
()=> {name:'taro', age:20} // syntax error
```

上記のように書きたいけど、arrow functionはブロックを取ることもできるのでオブジェクトなのかブロックなのか曖昧になってしまいエラーになる。

```js
()=> ({name:'taro', age:20}) // OK
```

括弧を付けてあげれば良い。
Qiita/Qiita:Team Meetup #10 Nagoya LT資料 (スタンドファーム株式会社)


# 自己紹介

スタンドファーム株式会社
![standfirm](http://standfirm.jp/theme/standfirm/images/logo.png)
http://standfirm.jp/

請求書のクラウド管理サービスMisocaを開発運営。
![misoca](http://www.misoca.jp/wp-content/themes/misoca/img/logo.png)
http://www.misoca.jp/

喋る人
株式会社ファントムタイプ
代表取締役 小久保 祐介
![yusuke_kokubo](https://pbs.twimg.com/profile_images/453092579995688961/CgzRIq0-_bigger.png)
http://www.phantomtype.com/
Misocaの開発、チームビルディング、プロダクトデザインに携わる。

# Qiita:Teamを導入しようと思った経緯

2014年5月くらい

## 抱えていた問題その１・それでまでの朝会

スタンドアップで各自が口頭で報告をしていた

* 声を聞き取れないと何を言ってるのかわからない
* 個人差が大きい
* 言ったもんがち
* 事前の情報共有がないので各自の仕事を理解するのが困難

## 抱えていた問題その２・それまでの日報

Google Spreadsheetで書いていた

* 報告書を書くだけでみんなで共有しているわけではなかった
* 見に行くのが面倒くさい
* 見たことを相手に伝える手段がない
* markdownで書けない

## Qiita:Teamを導入してみる

* 自然とみんなで共有する空間
* 見に行くのが簡単
  * トップページに最近の更新がすべてある
* 「いいね！」ボタンによって見たことを伝えられる
* テンプレートを編集できるので会社の文化にあわせてカスタマイズできる
* markdownで書ける
* 画像のアップロードが簡単にできる
    * (GitHubと同じ要領)

## Qiita:Teamで朝会が変わった

* 前日書かれた日報を1つずつみんなの前で共有していく
    * 記事を読むことが挨拶代わり
    * (高速化のために事前に各自が全員分の日報に目を通しておくという暗黙のルールがある)
* 日報で困ったことや相談したいことを朝会のときにみんなで話す
    * その場ですぐに解決できる問題ならその場で解決する
* そのため日報を書くことを全員が意識付けられる

# どのように使っているか

## 日報

* 今日やったこと
* 明日やること
* 困ったことや相談したいこと
* こんな気分/他、お知らせしておきたいこと
* ポエム
    * まったく仕事に関係ないこと

> ![スクリーンショット 2015-03-09 10.52.09.jpg](https://qiita-image-store.s3.amazonaws.com/743/20755/3423d653-73a8-df17-8188-b650e77b0d64.jpeg)

----

> ![スクリーンショット 2015-03-09 10.54.07.jpg](https://qiita-image-store.s3.amazonaws.com/743/20755/c1fc1ec8-8a18-2a63-d2cd-6eafd9666b18.jpeg)

----

> ![スクリーンショット 2015-03-09 12.09.27.jpg](https://qiita-image-store.s3.amazonaws.com/743/20755/832b1204-0bb9-4127-fee6-bb334f092c49.jpeg)



## 議事録

* 朝会で話したこと
* 打ち合わせ

> ![スクリーンショット_2015-03-09_11_23_18.png](https://qiita-image-store.s3.amazonaws.com/743/20755/d45fef77-02ba-e922-b437-db5c7a6cf0fc.png)



## 開発用の文書

議論をするためではなく、情報を共有する場として活用している。

* 仕様
* 設計
* リファクタリング用のメモ
* 技術上の課題
* 実装上のメモ
    * 外部連携をするときのローカルでのテスト方法

> ![スクリーンショット 2015-03-09 11.01.12.jpg](https://qiita-image-store.s3.amazonaws.com/743/20755/75a3bd6a-9a2a-798a-7e0d-8e2d3dccc683.jpeg)


## マーケティング施策

MisocaのWebマーケティングを進めていくにあたっての方針や成果を共有している。
もちろんマーケティングに携わらない人でも見れるし意見も言える。

* やりたいこと
* やったこと(作業報告)
* マーケティング上のアイデア

> ![スクリーンショット_2015-03-09_11_04_25.png](https://qiita-image-store.s3.amazonaws.com/743/20755/2d9e40b4-ae16-f0ac-498f-cdd33242a59a.png)


## 不具合報告

Qiita:Teamに報告を書いて、火曜日に開発チームで情報を共有している。

* 概要
* 発生期間
* 原因
* 対応
* 再発防止

## その他、思いついたアイデア

* 仕事の進め方の提案

> ![スクリーンショット 2015-03-09 11.07.50.jpg](https://qiita-image-store.s3.amazonaws.com/743/20755/f5d3edf9-c372-d052-6c8b-00879a0ef0ff.jpeg)


# (まとめ) Qiita:Teamとは

「チームで様々な情報を共有するための優れたツール」

# おすすめの使い方

* まずは日報から
   * 自社の文化にあわせてテンプレートをカスタマイズ

# おまけ

Misocaの開発メンバー募集中です。
nginxでPHPを動かす

前回[virtualbox + ubuntuにnginxをインストール](http://qiita.com/duke-gonorego/items/32f647bd4a6668c5414d)でnginxは起動できたので、
では早速PHPを動かしてみたいと思います。

### 環境
---
 * VirtualBox 4.3
 * ubuntu 14.04
 * nginx 1.6.2
 * PHP-fpm 5.5.9

### PHP-fpm(FastCGI Process Manager)インストール
---

```bash
$ sudo apt-get install php5-fpm
$ ps aux | grep php-fpm 
```

### nginxの設定
---
/etc/nginx/conf.d/default.conf

```bash
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   unix:/var/run/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
```
※上記コメントアウト行のコメントアウトを削除する
※rootに任意のパスを設定する
※fastcgi_passにphp5-fpmを指定
※fastcgi_paramを上記のように修正

### nginx起動
---

```bash
$ sudo /etc/init.d/nginx start
```

### phpinfoを出力してみる
---
/usr/share/nginx/html/index.php

```php
<?php
phpinfo();
```
※画面に表示されることを確認
Paperclip で保存する画像のアスペクト比のチェックをする

# はじめに
Paperclip を使い、取り扱う全ての画像を一括で管理する Picture モデル (ポリモーフィック継承) で、
保存される画像についてそれぞれ異なるアスペクト比をチェックする方法を実装した時のメモ。

# 実装内容
User のプロフィール画像は、正方形 (縦横は 1 対 1 ) を保持できる
※ 200 × 200 等の画像
Item の画像は、長方形 ( 縦横は 5 対 8 ) を保持できる
※ 400 × 640 等の画像

# サンプルソース

```rb:app/models/user.rb
class User < ActiveRecord::Base
  has_one :profile_image, class_name: Picture, as: :holder, dependent: :destroy
  accepts_nested_attributes_for :profile_image, allow_destroy: true
end
```

```rb:app/models/item.rb
class Item < ActiveRecord::Base
  has_many :pictures, as: :holder, dependent: :destroy
  accepts_nested_attributes_for :pictures, allow_destroy: true
end
```
```rb:app/models/picture.rb
class Picture < ActiveRecord::Base

  WIDTHS = %i{640 200 142 80}
  STYLES = WIDTHS.map {|width| [:"w#{width}", "#{width}x>"]}.to_h
  PICTURE_TYPES = { user: 1, item: 0.625 } # height / width
  CONTENT_TYPE = %w{image/jpeg image/jpg image/png image/gif}

  belongs_to :holder, polymorphic: true

  has_attached_file :image, { styles: STYLES }
  validates_attachment_size :image, less_than: 1.5.megabytes
  validates_attachment_content_type :image, content_type: CONTENT_TYPE
  validate :validate_image_aspect_ratio, if: -> { image.present? && CONTENT_TYPE.include?(image_content_type) & holder.present? }

  private
  def validate_image_aspect_ratio
    key = holder_type.underscore.to_sym
    if PICTURE_TYPES.keys.include?(key)
      geometry = Paperclip::Geometry.from_file(image.queued_for_write[:original])
      errors.add(:image, :invalid_aspect_ratio) unless PICTURE_TYPES[key] == (geometry.height / geometry.width)
    end
  end
end
```

# サンプルの説明

`PICTURE_TYPES` で `holder` に当たる `user` と `item` のアスペクト比 ( 縦横比 ) を記載し、
`validate_image_aspect_ratio` でそれらをチェックしています。

`image.queued_for_write[:original]` でオリジナルのファイルから `Paperclip::Geometry` オブジェクトを
生成し、縦横のサイズをを取得し、チェックしています。

今後、`holder` に入るモデルが増える場合は、`PICTURE_TYPES` にそれぞれ追加することで対応できます。

ただし、1つのモデルが、複数のアスペクト比の画像ファイルを保存できるようになっていないので、
その場合は、下記のよう感じに修正すれば出来るはず。。。チェックしてませんが。

```rb
PICTURE_TYPES = { user: [1, 1.6], item: [0.625] } # user に正方形の他の 640 × 400 も追加
```

```rb
errors.add(:image, :invalid_aspect_ratio) unless PICTURE_TYPES[key].include?(geometry.height / geometry.width)
```
Androidで簡易ダイアログ（AlertDialog）

## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)はじめに

**ここで紹介するやり方は現在非推奨です。** 画面回転（縦向き ⇔ 横向き）等でActivityが再生成されるとダイアログが消え、いわゆるメモリリーク問題が起きますので、ご注意下さい。

使いどころとしては、開発中しばしば LogCat が出なくなる（特に Mac ＋ Eclipse）ような環境で、一時的にログを出したい時などに限定して使ってます。


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)サンプルコード

### ▼「OK」ボタンのみ

```java:Java
import android.app.AlertDialog;

new AlertDialog.Builder(this)
	.setTitle("TEST")
	.setMessage("Hello, Dialog!")
	.setPositiveButton("OK", null)
	.show();
```

### ▼「はい/いいえ」ボタン

```java:Java
import android.app.AlertDialog;
import android.content.DialogInterface;

new AlertDialog.Builder(this)
	.setTitle("TEST")
	.setMessage("Hello, Dialog!")
	.setPositiveButton("はい", new DialogInterface.OnClickListener() {
		public void onClick(DialogInterface dialog, int which) {
			Log.d("AlertDialog", "Positive: which=" + which);
		}
	})
	.setNegativeButton("いいえ", new DialogInterface.OnClickListener() {
		public void onClick(DialogInterface dialog, int which) {
			Log.d("AlertDialog", "Negative: which=" + which);
		}
	})
	.show();
```

#### 補足

上記サンプルコード中の「this」は Activity を指します。


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)メモ

現在では DialogFragment を使うことが推奨されています。

▼[Android] DialogFragmentを使ってダイアログを表示する
http://qiita.com/ux_design_tokyo/items/61ca074566d1570b37d3


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)参考URL

ダイアログを制するものが Android を制する！｜八角研究所
http://www.hakkaku.net/articles/20090924-581

ダイアログの表示はshowDialogで！
http://androidr.sblo.jp/article/44022356.html

ANDROID: 画面を回転させないようにする
http://319ring.net/blog/archives/1502

(･o･ゞ いじょー。
AVAssetImageGeneratorから取得した画像が画面に表示されている向きと一致しない場合の対応

### 発生した問題
AVAssetImageGenerator を使って動画から静止画を抽出しようとした際に、動画を撮影した際の端末の向きによって画面に表示されている方向とは別方向で静止画が取得されてしまう現象が起きたので、それの対応方法

### 参考（端末の向き）
![Supported Interface Orientations.png](https://qiita-image-store.s3.amazonaws.com/0/47143/642b0965-7909-e234-bec8-b2fd8dc15015.png)

### 再現コード

```swift:Swift
var asset: AVURLAsset

〜〜〜

let generator = AVAssetImageGenerator(asset: asset)
let captureImage: CGImageRef = generator.copyCGImageAtTime(asset.duration, actualTime: nil, error: nil)
var image = UIImage(CGImage: captureImage)
```

### 対応コード

```swift:Swift
var track = asset.tracksWithMediaType(AVMediaTypeVideo)
if let media = track[0] as? AVAssetTrack {
  var naturalSize: CGSize = media.naturalSize
  var transform: CGAffineTransform = media.preferredTransform

  if transform.tx == naturalSize.width && transform.ty == naturalSize.height {
     UIImage(CGImage: captureImage scale: 1.0 orientation: UIImageOrientation.Down)
  } else if transform.tx == 0 && transform.ty == 0 {
     UIImage(CGImage: captureImage scale: 1.0 orientation: UIImageOrientation.Up)
  } else if transform.tx == 0 && transform.ty == naturalSize.width {
     UIImage(CGImage: captureImage scale: 1.0 orientation: UIImageOrientation.Left)
  } else {
     UIImage(CGImage: captureImage scale: 1.0 orientation: UIImageOrientation.Right)
  }
}
```