OmniAICreator/Qiita-1.07M huggingface dataset:
orgmode for Sublime Text のススメ

* TODOリストや進捗メモなどは何を使っていますか?
* テキストエディタは何を使っていますか?

## おことわり
※ 私はOrg mode for Emacsを触ったことがありません
※ 私はOrg modeの機能及びシンタックスを知りません

## Install
### Package Control
導入済みの場合はパスする

* [Package Control](https://sublime.wbond.net/installation)

### orgmode for Sublime Text 2 & 3
* [orgmode for Sublime Text 2 & 3](https://sublime.wbond.net/packages/orgmode)

1. Ctrl + Shift + P (Mac: ⌘⇧P)
2. `Package Control: Install Package`
3. `orgmode`
4. SublimeTextを再起動

## 使い方
基本的には、[README.org](https://bitbucket.org/theblacklion/sublime_orgmode/src)に書いてある。
ここでは、目立って便利なもの(個人的主観)を紹介する。

### チェックリスト
* `-c[TAB]` -> `- [ ]` (未チェック)
* `-cc[TAB]` -> `- [X]` (チェック済み)
* `cs[TAB]` -> `[/]` (チェック済みカウンタ)

![mkTODO.gif](https://qiita-image-store.s3.amazonaws.com/0/13008/58ca1480-0d4b-754f-eb68-1bcd0982434e.gif "mkTODO.gif")

チェックリストの入力の補完。
orgmode for Sublime Textでは、タブキーにより補完する。
チェックボックスにカーソルを合わせてEnterキーを押すことで、チェックがトグルする。
チェック済みカウンタは、自動的に更新される。
子のチェックボックスが全てチェック済みになったら、自動的に親もチェック済みになる。

![useTODO.gif](https://qiita-image-store.s3.amazonaws.com/0/13008/26a36764-91b1-ba29-4e35-c5db1b3e79d7.gif "useTODO.gif")


### 外部リンク
* `l[TAB]` -> `[[LINK]]`

LINKにURLやメールアドレス(`[[mailto:hoge@fuga.com]]`)、**ローカルのファイルパス**を記述する。
カーソルを合わせてEnterキーを押すと、URLならばブラウザが、テキストファイルならばSublimeが新しいタブで開く。

### 内部リンク
* `i[TAB]` -> `{NUMBER}`
* `ii[TAB]` -> `{{HEADLINE}}`

`{NUMBER}` には数字を記述でき、Enterを押すことで同じ場所にジャンプする。

![interJump.gif](https://qiita-image-store.s3.amazonaws.com/0/13008/8518768f-0646-0a8c-6b22-d29adb34d504.gif "interJump.gif")


`{{HEADLINE}}`は、ヘッダの名前を記述する

![headlineJump.gif](https://qiita-image-store.s3.amazonaws.com/0/13008/41cf6b3d-17dd-59c1-3a41-da79604b6e15.gif "headlineJump.gif")
プルリクエストのマージ先ブランチを削除するとどうなるのか？

というのをやってみたところ、自動で `Close` された。

https://github.com/laiso/laiso.github.com/pull/2

* プルリクエストのブランチは `Open` 後は変更できない
* マージ不可能なプルリクエストはCloseされる

マージする前にプルリクエストの変更と同じコミットを取り込んで、「マージしても何も変更は生じない」という状態の時にもこうなった記憶がある。

## 権限のないプルリクエストがOpenしているとブランチ削除ができない

さらに調べたところによると、中央→個人リポジトリで運用しているレポジトリでは、上記のよう推測される結果になった。

![スクリーンショット 2014-10-29 7.34.02 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/0f56a398-d9c6-2ee9-b3cd-927a8a862eb0.png)

学びがありますね。
Auto ScalingのSuspend/Resumeを使って、Elastic BeanstalkインスタンスをTerminateしないで停止・再起動する

Elastic Beanstalkから作成したインスタンスは、再起動しようと停止するとAuto ScalingによりTerminateされてしまい新規インスタンスが作られてしまいます。そんなインスタンスをTerminateしなくて済む方法を確認

# 方法
過去にインスタンスの再起動がしたくてサポートに問い合わせてみた時の回答
>1．Terminate 処理を Suspend にします
>2．インスタンスを Stop します
>3．インスタンスを Start します
>4．ELB で該当インスタンスは InService になることを確認します
>※ELB に設定した Healthy Check 条件を満たすにも関わらず、InService にならなかった場合は、一度該当インスタンスを ELB から外し、再度登録します。その後、InService になるのを確認します
>5．SetInstanceHealth にて該当インスタンスを Healthy 状態にします
>6．Terminate 処理を Resume にします

1.と6.の「Terminate 処理のSuspend/Resume」がAWSのマネジメントコンソール上から見ても分からん・・・
CLIのヘルプからそれっぽいものを探してみる

# Auto ScalingのSuspendとResume
[Suspend and Resume Auto Scaling Process](http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/US_SuspendResume.html)

EC2のAuto Scaling Groupsから止めたいインスタンスのグループ名を調べてから、CLIのsuspend-processesを実行する。

```lang:Terminate処理をSuspend
$ aws autoscaling suspend-processes --auto-scaling-group-name <グループ名> --scaling-processes Terminate
$ aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name <グループ名>
--省略--
SUSPENDEDPROCESSES      Terminate       User suspended at 2014-10-29T07:34:26Z
--省略--
$
```
Suspended Processes が Terminate と出ればOK（マネジメントコンソールのDetailsでも表示される）。この間はインスタンスを停止してもTerminateされない。戻すときはresume-processesを実行する


```lang:Terminate処理をresume
aws autoscaling resume-processes --auto-scaling-group-name <グループ名> --scaling-processes Terminate
```

これでterminateなしで停止できるッ！と思ったらResumeした時点で**インスタンスをTerminateしてから新規にインスタンス作成**し始めた･･･

と、ここまで書いて公開していたが、後日以下の実施が漏れていたことに気が付いた
>5．SetInstanceHealth にて該当インスタンスを Healthy 状態にします

```lang:該当インスタンスをHealthy状態にする
aws autoscaling set-instance-health --instance-id <インスタンスID> --health-status Healthy

```

>一度手動で Stop したインスタンスは、その後 Start して正常な状態になっても Auto Scaling で自動的に Healthy になりません。
>従いまして、以下のドキュメントにあります SetInstanceHealth を利用して、該当インスタンスを Healthy 状態にしてから、 Terminate を Resume する必要があります。
>
>　SetInstanceHealth
>　http://docs.aws.amazon.com/AutoScaling/latest/APIReference/API_SetInstanceHealth.html

こういうことらしい。Resumeした時点でAuto ScalingがインスタンスをUnhealthy状態と判断してTerminateしたようだ
Suspendして再起動後に**インスタンスをHealthy状態にしてからresumeを実施**してみると、インスタンスはTerminateされずに起動した

# EBの検証

これ入れてやった方が早いか？
[AWS Elastic Beanstalk Command Line Tool](http://aws.amazon.com/code/6752709412171743)
[Getting Started with Eb](http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-reference-get-started.html)

インストールして初期設定後にstop/startを実施

```lang:インスタンスの停止
$ eb stop
Terminate environment? [y/n]: y
Stopping environment "test-env". This may take a few minutes.
--省略--
Stop of environment "test-env" has completed.
```

```lang:インスタンスの開始
$ eb start
Starting application "test".
Some of your option settings are ignored because they don't apply to your environment type.
Waiting for environment "test-env" to launch.
--省略--
Application is available at "test-env-XXXXXXXX.elasticbeanstalk.com".
```

これもインスタンスは一旦Terminateしてから新規にインスタンスを作成している

# 結論
* Auto ScalingのTerminate処理をSuspendしている間は、インスタンスを停止してもTerminateされない
* Terminate処理をResumeすることでAuto Scalingの設定を元に戻すことができる
* インスタンスを停止させるとUnhealthy状態と判断されるので、手動でHealthy状態にする必要がある
UbuntuにOracle JDK8をインストール

まず~~服を脱ぎます~~次の三つのコマンドを実行します。

```bash
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
```

そして、インストールしたいバージョンによって次のいずれかのコマンドを実行します。

## Oracle JDK 6

```bash
sudo apt-get install oracle-java6-installer
```

## Oracle JDK 7

```bash
sudo apt-get install oracle-java7-installer
```

## Oracle JDK 8

```bash
sudo apt-get install oracle-java8-installer
```

最後にターミナルで`java` `javac`を試して正しく動いていればOK
TravisCIからCasperJS実行

ローカルでは npm でインストール

```
$ npm install -g casperjs
$ casperjs --version
1.1.0-beta3
```

すでにTravisCI運用している gitリポジトリがある前提で簡単なテストを書いてみる
以下テストコードの元ネタは WEB+DB PRESS Vol.80 にあった CasperJS の紹介記事

```tests/hoge_test.coffee
casper.test.begin "ほげでGoogle検索", 8, (test) ->
  casper.start 'https://google.com', ->
    test.comment "Googleトップページ: " + @getCurrentUrl()

    test.assertHttpStatus 200
    test.assertTitleMatch /^Google$/
    test.assertExists 'form[action="/search"]', '検索フォームがある'

    @fill 'form[action="/search"]', q:'ほげ', true

  casper.then ->
    test.comment "検索結果: " + @getCurrentUrl()

    test.assertHttpStatus 200
    test.assertSelectorHasText 'title', 'ほげ'
    test.assertSelectorHasText 'h3.r a', 'ほげ', 'ほげのリンクを含んでいる'

    @click 'h3.r a'

  casper.then ->
    test.comment "最上位の検索結果をクリック: " + @getCurrentUrl()

    test.assertHttpStatus 200
    test.assertSelectorHasText 'title', 'ほげ'

  casper.run ->
    test.done()
```

http://docs.travis-ci.com/user/installing-dependencies/#Installing-Projects-from-Source
にcasperjsの記述あったのでローカルで入れたcasperjsとバージョン合わせたいのでバージョンの記述だけ変えて travis.yml に以下を追記

```.travis.yml

before_script:
  - wget https://github.com/n1k0/casperjs/archive/1.1-beta3.tar.gz -O /tmp/casper.tar.gz
  - tar -xvf /tmp/casper.tar.gz
  - export PATH=$PATH:$PWD/casperjs-1.1-beta3/bin/
script
  - casperjs test tests/hoge_test.coffee
```

git push して TravisCI でジョブが実行されるのを待つ
実行結果は以下な感じで失敗していますね。

```
Test file: tests/hoge_test.coffee
# ほげでGoogle検索
# Googleトップページ: https://www.google.co.jp/?gfe_rd=cr&ei=O55QVLjkN8_U8gfk8YHwBw
PASS HTTP status code is: 200
PASS Subject is strictly true
PASS 検索フォームがある
# 検索結果: https://www.google.co.jp/search?hl=ja&source=hp&q=ほげ&gbv=2&oq=&gs_l=
PASS HTTP status code is: 200
PASS Find "ほげ" within the selector "title"
PASS ほげのリンクを含んでいる
# 最上位の検索結果をクリック: http://ja.wikipedia.org/wiki/メタ構文変数
PASS HTTP status code is: 200
FAIL Find "ほげ" within the selector "title"
#    type: assertSelectorHasText
#    file: tests/hoge_test.coffee:23
#    code: test.assertHttpStatus 200
#    subject: false
#    selector: "title"
#    text: "ほげ"
#    actualContent: "メタ構文変数 - Wikipedia"
FAIL 8 tests executed in 4.057s, 7 passed, 1 failed, 0 dubious, 0 skipped.

Details for the 1 failed test:

In tests/hoge_test.coffee:23
  ほげでGoogle検索
    assertSelectorHasText: Find "ほげ" within the selector "title"
```
ShellスクリプトでURIエスケープするときの不思議な現象

よくシェルスクリプトで、文字列をURIエスケープするときの技としてnkfとtr = %で変換する方法が案内されてますが、文字列によってはおかしくなることがあるみたい。

##シェルスクリプト
```shell-session
#utf8で書いてます。
w="アイウエオカキクケ"
enc=`echo "${w}" | nkf -wMQ | tr = % | tr -d "\n"`
echo "nkf  [${enc}]"
enc=`echo "${w}" | perl -nle '{use utf8;use Encode;use URI::Escape;print uri_escape($_)}'`
echo "perl [${enc}]"
```
##出力
```shell-session
nkf  [%E3%82%A2%E3%82%A4%E3%82%A6%E3%82%A8%E3%82%AA%E3%82%AB%E3%82%AD%E3%82%AF%%E3%82%B1]
perl [%E3%82%A2%E3%82%A4%E3%82%A6%E3%82%A8%E3%82%AA%E3%82%AB%E3%82%AD%E3%82%AF%E3%82%B1]
```

なんで％が１個多くなるんでしょう...？
AndroidでのOutOfMemory対策

#OutOfMemory対策#

Android端末のMemoryはまだまだ小さく、heapの割り当ても少ないので、
OutOfMemory対策として、地道な作業をコツコツとやってみました。
昔のJavaのGC対策のようなものです。

#まずは現状を知る#
EclipseのMemoryAnalyzerなどで、heapdumpを見てみる。
どこでMemoryを使っているか確認してみてください。

#各種clean方法#

###ImageView###
特に重くなっていくImageview

```java:imageview
imageView.setImageDrawable(null); or imageView.setImageBitmap(null);
imageView.destroyDrawingCache();
```

###Loader###
止め忘れ防止として

```java:Loader
getSupportLoaderManager().destroyLoader(loder id)
```

###Animation###
cancel()も調べては見ましたが、実装見るとresetの方が良さそう

```java:Animation

Animation.reset();
````
###Adapter(ArrayAdapter)###

```Java:Adapter

Adapter.clear();
Adapter.notifyDataSetChanged();
```

###各メンバ変数###
nullをぶち込む

* * *


まだまだ他にもやるべき所や、間違っている部分あるかも知れません。
自分のアプリではある程度の安定は見られました。
基本的に、使いまわせるObjectは使いまわして、call側から設定してあげる
などの配慮をすると、AnimationやUIもカクカクしなくなったりします。
Drone 0.3 をいじりながら利用する

概要
-----
Drone 現在の最新バージョンは 0.2.1 ですが master を 0.3 と位置づけているらしく、commit数も 0.2.1 が 519 であるのに対して master は 964 と大きく乖離しています。

branch 内にスラッシュが入ってくると angular.js の routing を利用している都合でおかしくなったりとあります。

みんなでコードをいじってPRを送りましょう！


## 構成
内部のディレクトリ構成もガッツリ変わってしまっています。
ただ、大方見ないといけないのは server 配下だけです。

```
server
├── app
│   ├── scripts
│   ├── styles
│   └── views
├── blobstore
├── capability
├── datastore
│   ├── database
│   └── migrate
├── handler
├── middleware
├── pubsub
├── router
├── session
└── worker
    ├── director
    ├── docker
    └── pool
```

特にサーバ側の挙動として handlers 、 web 側として app/scripts を見ていれば概ね改造はできます。

また、クライアントサイドも angular.js に変わってしまったため魔術に翻弄されています。


## ソースから立ち上げる

ソースから立ち上げるには README を見るよりも Dockerfile を参考にするのが速道です。

### 1. go / docker のインストール
適当なホスト(ubuntu 14が余計な手間がかからないので楽です)を借りて、 go / docker は [こちら](http://docs.docker.com/installation/ubuntulinux/) を参考にしてインストールして下さい。

### 2. drone の取得
`go get github.com/drone/drone`
上記コマンドを実行し、ソースを GOPATH の中に取ってきます。

### 3. drone イメージの作成
`docker build -t drone/custom`
として images を作成します
(customは弄る気マンマンを意味しています)

### 4. drone.toml の作成
[README](https://github.com/drone/drone/blob/master/README.md) を参考にして github で application を登録して key / secret を取得したりします。
bitbucket も同じでした。
(この後 [gitbucket](https://github.com/takezoe/gitbucket) を対応させたいと考えています)

でファイルは ./config/drone.toml

### 5. drone container の立ち上げ
entrypointとかちゃんと指定されているんですが、ちょこちょこといじりながら見て行きたいので `--entrypoint=/bin/bash` としてコンテナに入って自分で立ち上げます。

`docker run -i --entrypoint=/bin/bash -p 80:8000 -v ~/go/src/github.com/drone/drone/config:/tmp -v /var/run/:/var/run  -t drone/custom`

> NOTE: `/var/run` をマウントしているのは、ホスト側の docker に対してコンテナ内の drone からテスト用コンテナの生成を通すためです。

で、入った後は `/usr/local/bin/droned` に実行ファイルがあるので、
`/usr/local/bin/droned --config=/tmp/drone.toml` 
とすれば、droneが80番ポートで立ち上がってきます。

### 6. ソースをいじって確認
この後は実際にコンテナ内でソースをいじり、確認します。
テストなどもありますが、とりあえず満足するところまではテストもbuildも端折って
`go run server/main.go --config=/tmp/drone.toml`
として色々試して下さい。

## まとめ
まだまだ、いろいろと使い勝手が良くないところも残っているのでみんなで改善していければよいかと思います。

(いろいろと深淵なる事情でgheもtravis-ciも使いづらいので、 gitbucket <=> drone を構築して、連携させようとしています。)
FTPでPermission Deniedされたときに確認すること

FTPでサーバーからファイルをダウンロードしようとしたときに、Permisson Deniedでダウンロードできないときは、サーバー側、ローカル側、どちらの権限がないのかを確認する必要があります。
うっかりローカルのカーレントディレクトリが書き込み権限のない場所にいたりすると、てっきりサーバー側のパーミッションの問題かと思って詰まったりします。
railsでslimテンプレートエンジンを使う

#手順
* slim-railsのインストール
* erbファイルをslimに変換する

##参考URL
http://stackoverflow.com/questions/19057030/how-to-make-rails-render-slim-templates-instead-of-erb-templates
http://www.mocchiblog.com/?p=14680

## slimのインストール
```text:GemFile
gem 'slim-rails'
```

```ruby:config/application.rb
class Application < Rails::Application
  #... 省略

  config.generators do |g|
    g.template_engine :slim
  end
end
```
## erbをslimに変換するコマンド
```shell-session:html2slimインストールコマンド
## これでerb2slimコマンドを入手
$ gem install html2slim

## .erbファイルを.slimファイルに変換
$ for i in app/views/**/*.erb; do erb2slim $i ${i%erb}slim && rm $i; done
```

### テンプレートの優先順位は
erb > slim らしい。
なので既存のerbファイルが残っているとslim側は動作しないので注意が必要
【PHP】指定の形式にフォーマット(sprintf)


```php:基本形
sprintf( フォーマット [, 引数１] [, 引数２]･・・)
```

##パディングしたい場合

```php:3桁で0パディング
echo sprintf("%03d",15)
//=>015
```

##sprintfとprintfの違い
sprintfはフォーマット結果を返す。つまり変数加工用。
printfはフォーマット結果を標準出力する。
Droneでmysqlを使うときにハマったメモ

## 概要
Drone で redis を使うときにはとても簡単に使えるのですが mysql はちょいと手間でハマったので共有

## Redis を使う
```yml
services:
  - redis
```

こう書いておくと、それだけで localhost:6379 と利用ができます。

簡単

## MySQL を使う
[公式サイト](http://docs.drone.io/databases.html#mysql)を見ると

```yml
services:
  - mysql
scripts:
  - mysql -u root -e 'create database test;'
  - mysql -u root -D test < schema.sql
```
と書いておけば localhost:3306 で利用できるような事が書いてありますがそれだとうまく行きませんでした。
キチンとホスト名を指定して書かないと話してくれないようです。

```yml
scripts:
  - mysql -u root -h127.0.0.1 -P 3306 -e 'create database test;'
  - mysql -u root -h127.0.0.1 -P 3306 -e 'GRANT ALL ON mydatabast.* TO ""@"%"'
  - mysql -u root -h127.0.0.1 -P 3306 -e 'GRANT ALL ON mydatabase.* TO ""@"localhost"'
  - mysql -u root -h127.0.0.1 -P 3306 -D test < schema.sql
```

おまけにテスト時には root でアクセスしていると思いきや、そうではないのできちんと GRANT しておく必要もあります。
(私の環境ではubuntu ユーザ)

## MySQL 5.6 を使ったりその他のDBを使いたい場合
[docker registry](https://registry.hub.docker.com/u/dockercore/drone/)には別のDBが使いたければ

```yml
services:
  - dockerfile/rethinkdb # same as dockerfile/rethinkdb:latest
  - barnybug/elasticsearch:1.0.1
```

こんな風にすれば指定できる、とあるのですが、mysql5.6を利用したところ、ログが出てこなくなってしまったので止む無くテスト時のtables.sqlでは5.5でできる範囲のみを書くようにしています。
SwiftではObjective-CのenumのPrefixは省略されます


公式ドキュメントにある通り、Objective-C上で定義されているPrefix付きのEnumをSwiftで利用する場合はシンプルに記述できます、というかPrefix付きではコンパイルが通りません。

```objectivec
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
    AFNetworkReachabilityStatusUnknown          = -1,
    AFNetworkReachabilityStatusNotReachable     = 0,
    AFNetworkReachabilityStatusReachableViaWWAN = 1,
    AFNetworkReachabilityStatusReachableViaWiFi = 2,
};
```

Objective-Cではこうですが、

```objectivec
AFNetworkReachabilityStatus status;
switch (status) {
    case AFNetworkReachabilityStatusReachableViaWWAN:
    case AFNetworkReachabilityStatusReachableViaWiFi:
        [self foo];
        break;
    default:
        [self bar];
        break;
}
```

Swiftではこうなります。

```swift
let status: AFNetworkReachabilityStatus = .ReachableViaWWAN

switch status {
case .ReachableViaWWAN, .ReachableViaWiFi:
    self.foo()
default:
    self.bar()
}

```



### 参考

https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/InteractingWithCAPIs.html
Support v4 library r21 で気をつけるポイント

悲しい:-(

:name_badge: tofu on fire...

## android.support.v4.media.session

MediaSession と MediaController は Lollipop で導入された API で、それぞれ support v4 ライブラリにバックポート(`MediaSessionCompat`と`MediaControllerCompat`)があります。リファレンスにも後方互換のためのクラスである旨記述がありますが、互換性があるのはインタフェースのみで、実装を見ると以下のように書いてあります。

```
// TODO: compatibility implementation
```

Kitkat 以前では何もしないので、動きません。
返り値があるメソッドは、`return null`だったり`return 0`だったりしますが、このあたりの言及はリファレンスにはありません。null チェックを怠るとぬるぽになります。

----

// TODO: 他にも何かあったら追記する

:name_badge: tofu on fire...
vimdiffで単語単位の差分表示: diffchar.vimが超便利


今日もプログラミングや文書作成にvimを巧みに操り続ける全国のvimmerの皆様におかれましては、vimを利用した差分表示であるvimdiffは欠かせないツールであることと思います。

当方も今までvimdiffについては[色を見やすく](http://qiita.com/takaakikasai/items/b46a0b8c94e476e57e31)したり[差分計算アルゴリズムを賢く](http://qiita.com/takaakikasai/items/3d4f8a4867364a46dfa3)したりと、カスタマイズによって使い勝手を向上させてきましたが、唯一実現できていなかったのが、「単語単位の差分表示」なのであります。

しかしついに、vimdiffで単語単位の差分を表示できるようにするvimプラグイン「diffchar.vim」を先日見つけました。
 ~~最初の公開が今年5月という新しいプラグインです。
[diffchar.vim - Highlight the exact differences, based on characters and words : vim online](http://vim.sourceforge.net/scripts/script.php?script_id=4932)~~
~~ということで、早速インストール。このプラグインは[GitHubにもミラー](https://github.com/vim-scripts/diffchar.vim)されており、~~

2019/01/07 追記： 現在、こちらで開発が続けらているようです。
https://github.com/rickhowe/diffchar.vim

すでにNeoBundleやdeinをお使いであれば導入はとっても簡単で一行.vimrcに追加して `:NeoBundleInstall` や `call dein#update()` するだけです。

```vim:~/.vimrc
" NeoBundleの場合
NeoBundle 'rickhowe/diffchar.vim'
" deinの場合 `if dein#load_state(path)` 〜 `endif` の間に
call dein#add('rickhowe/diffchar.vim')
```

実際サンプルで試してみましょう。まず、diffchar.vim導入前、vimdiffで差分を表示させると、次のようになりますね。

![スクリーンショット 2014-10-21 17.30.44.png](https://qiita-image-store.s3.amazonaws.com/0/48289/fc8b58c2-231a-d001-43f2-746e2d84ff06.png)

一つの行に複数箇所の変更が含まれる場合も、最初の変更から最後の変更までを含むような大きな１つの変更として認識されてしまっています。

しかしdiffchar.vimを導入すると！

![スクリーンショット 2014-10-21 17.32.40.png](https://qiita-image-store.s3.amazonaws.com/0/48289/df61e316-f1af-e5ca-0ac7-1679fe4c4443.png)

うおおおおぉ！すばらしい。単語単位の差分を表示できました。一行に複数の変更があってもちゃんと認識して表示。しかも、追加部分と変更部分で色分けもされています。

なお、以前は\<F7\>キーで単語単位の差分表示を切り替えるようになっていましたが、diffchar.vim Ver5.5以降、vimdiffコマンドによるvim起動時にはデフォルトで自動的に単語単位の差分表示が有効化されるようになりました（この動作は `g:DiffModeSync` により切替可能です）。

これでvimdiffで差分をチェックする作業が一層はかどりますね。

---
**※追記（2014/11/20）**
diffchar.vimはいくつかのオプションをグローバル変数によって設定することができます。詳しくは公式ドキュメントを参照いただきたいのですが、その中でも特に便利と思われるものをピックアップして紹介します。

`g:DiffUnit`
単語の境界として認識可能な場所を指定します。デフォルトは"Char"です。
"Char"   : 全ての文字間
"Word1"  : \\w\\+ と隣接する \\W の境目
"Word2"  : 非空白文字と空白文字の境目
"Word3"  : \\< または \\> に該当する境目
"CSV(,)" : カンマ(,)、セミコロン(;)及びタブ文字(\\t)による境目

デフォルトの"Char"だと、あらゆる文字間が境界として認識されうるので、変更箇所が変な位置で区切られたりして分かりにくい場合がありますから、そういう場合にはこのオプションを適切に指定します。なお、"Word3"はvimのオプションであるiskeywordの影響を受けます。逆に言えばiskeywordを設定している場合"Word3"を指定すると便利です。

`g:DiffModeSync`
この設定が"1"の場合、vimdiffコマンドによる起動などによりdiffモードが有効になった際、単語単位の差分表示も連動して有効にします。デフォルトは"1"です。
なお、単語単位の差分表示の有効・無効を手動で切り替えたい場合は\<F7\>キーを使います。

これらのオプションを.vimrcで指定する場合、プラグインを読み込んだ後(NeoBundleを使っている場合はNeoBundleによるプラグイン指定の後)に指定する必要があることに注意してください。以下は設定例です。

```vim:~/.vimrc
let g:DiffUnit = "Word3"
```

**※2019/01/07 : 本文および追記の内容を最新の状況に合わせて修正しました** 

---
※補足：autocmdのイベントはFilterWritePost、BufReadPost 、BufWinEnterなども試しましたが、FilterWritePostでは効果がなく、BufReadPostやBufWinEnterだとどうやらdiff表示途中に実行されてしまうらしく余計な箇所まで単語単位で差分表示しようとしてしまい表示が崩れます。VimEnterを指定したら期待した動作になりました。

※[自分のブログ](http://takaaki-kasai-tech.blogspot.jp/2014/10/vimdiff-word-diff-by-diffchar.html)より転載。（一部をQiita用に修正）
正規表現内で変数を展開したときにメタ文字をエスケープする

正規表現内で変数を展開するときにハマったのでメモ

以下のように変数\$aが変数\$bを含んでいるはずなのになぜか正規表現の返却値が空文字だった。

```pl
my $a = '(error)';
my $b = '(error)';

print $a =~ /${b}/; # ''
```

どうもメタ文字（カッコ）が文字列中に含まれていることが原因だったようです。
てっきり自動的にエスケープされるものだと思っていました。

なのでテキスト修飾子"\Q"と"\E"を使って明示的にエスケープしたらうまくいった。

```pl
my $a = '(error)';
my $b = '(error)';

print $a =~ /\Q${b}\E/; # '1'
```

##参考URL

http://stackoverflow.com/questions/2001176/how-can-i-escape-meta-characters-when-i-interpolate-a-variable-in-perls-match-o
http://www.kent-web.com/perl/chap7.html
Vagrantで起動したCentOSにmean環境構築して起動まで


mean.ioに書いてある手順だけではすんなりとはいかなかったので、自分用にメモ

## 参考

* http://mean.io/
* https://github.com/linnovate/mean/wiki/Getting-Started

## 環境情報

|対象|バージョン|
|:--|:--|
|CentOS| 6.6|
|NodeJS| 0.10.33|
|NPM| 1.4.28|
|MongoDB|2.6.5|
|mean-cli|0.4.0|

## 事前作業

VagrantでCentOS6を立ち上げておく

```
$ sudo yum update -y
```

## Gitのインストール

```
$ sudo yum install -y git
```

## MongoDBのインストール

```
$ sudo vi /etc/yum.repos.d/mongodb.repo
```

``` /etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
```

```
$ sudo yum install -y mongodb-org
$ sudo /etc/init.d/mongod start
```

## NodeJSのインストール

```
$ curl -sL https://rpm.nodesource.com/setup | sudo bash -
$ sudo yum install -y nodejs
```

## mean環境の作成と実行

```
$ sudo npm install -g mean-cli
$ mean init meantest
$ cd meantest && npm install
$ vi config/env/development.js
```

``` config/env/development.js
〜〜〜
debug: 'true',
hostname: '0.0.0.0', // 追加する
mongoose: {
〜〜〜
```

```
$ node server
```

※ hostnameを設定しないと、下記エラーがでたので、'0.0.0.0'を追加

```
Mean app started on port 3000 (development)

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: getaddrinfo ENOTFOUND
    at errnoException (dns.js:37:11)
    at Object.onanswer [as oncomplete] (dns.js:124:16)
```


## その他

下記でgruntでの起動も可能だが、エラーがでる

```
$ sudo npm install -g grunt-cli
$ cd meantest
$ grunt
```

下記のエラーが発生

```
Running "clean:0" (clean) task

Running "jshint:all" (jshint) task

   packages/system/app.js
     10 |var System = new Module('system');
             ^ Redefinition of 'System'.

>> 1 error in 47 files
Warning: Task "jshint:all" failed. Use --force to continue.
```

packages/system/app.jsのSystemを_systemとかに変更したら解消したが、他に良い方法はないのか・・・。

``` packages/system/app.js
'use strict';

/*
 * Defining the Package
 */
var Module = require('meanio').Module,
  favicon = require('serve-favicon'),
  express = require('express');

var _system = new Module('system');

/*
 * All MEAN packages require registration
 * Dependency injection is used to define required modules
 */
_system.register(function(app, auth, database) {

  //We enable routing. By default the Package Object is passed to the routes
  _system.routes(app, auth, database);

  _system.aggregateAsset('css', 'common.css');

  // The middleware in config/express will run before this code

  // Set views path, template engine and default layout
  app.set('views', __dirname + '/server/views');

  // Setting the favicon and static folder
  app.use(favicon(__dirname + '/public/assets/img/favicon.ico'));

  // Adding robots and humans txt
  app.use(express.static(__dirname + '/public/assets/static'));

  return _system;
});
```
RedshiftのクエリとLoadをManagement Consoleからキャンセルする

# リリース
今日、Redshiftで実行されているクエリやLoad処理をManagement ConsoleからTerminateすることができるようになりました。
今までは、Redshiftクラスタにログインをして該当クエリを特定して`cancel`を実行する必要がありました。詳細は: http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/cancel_query.html
これは非常に面倒で、クエリがつまりに詰まって、SuperUserキューでoperationを実行するしかないような場合は更にめんどくさい状態でした。特に、Redshiftのオペレーションとクエリ実行者が分かれている場合は尚更だったと思います。今までもManagement ConsoleからクエリやLoadの状態を閲覧することは可能でしたが、cancelはクラスタへのログインが必要でした。

# 試してみる
まずはManagement ConsoleにログインをしてRedshiftの画面をひらき、対象のクラスタを選択します。クラスタ詳細画面のQueriesかLoadsタブを開いてrunningになっていてcancelをしたいクエリを選択します。
![target query](https://qiita-image-store.s3.amazonaws.com/0/4769/38086e75-b527-b9ac-df7f-069f5dc0df92.png)

クエリを選択したら、画面上部のTerminate Queryを選択すると
![terminate screen](https://qiita-image-store.s3.amazonaws.com/0/4769/b5b22747-e186-0da7-c2ce-680f5f420738.png)
確認画面がでるので、よければConfirmをクリックするとcancelが実行されます。クリックしてから実際にクエリがcancelするまで少しラグがありますが、これで操作は完了です。

Terminateが成功すると
![terminated query](https://qiita-image-store.s3.amazonaws.com/0/4769/61932973-d0bd-af4e-5b7f-3b0fcc5a2b68.png)
のようにStatusがterminatedに変更になります。

また、クエリ詳細画面からもTerminate可能です。
![Screen Shot 2014-10-29 at 2.30.02 PM.png](https://qiita-image-store.s3.amazonaws.com/0/4769/4851cf5a-ad41-c552-836d-66a154581576.png)

Loadsタブ内での操作も同様です。

# IAM
AWSのサービスはIAMと呼ばれるアクセス制限の機能によって細かく操作の許可・拒否を選択することが出来ますが、RedshiftもIAMで機能の制限が可能です。
Redshiftクラスタ自体の管理をIAMユーザを作成しオペレーションチームに任せたいという場合などに便利かと思います。
今回のリリースでIAM Policy Actionで`redshift:CancelQuerySession`が追加になりました。参考: http://docs.aws.amazon.com/redshift/latest/mgmt/iam-redshift-user-mgmt.html

指定されていないユーザでクエリのTerminateを行おうとすると
![restricted by IAM](https://qiita-image-store.s3.amazonaws.com/0/4769/bf1375fc-4e51-b390-bf9c-45a2b5c2d2dc.png)
の様にエラーが出ます。

Redshiftクラスタの状態管理(主にReadonly)とクエリのTerminate権限をつけたIAM Policyは

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "redshift:Describe*",
        "redshift:ViewQueriesInConsole",
        "redshift:CancelQuerySession",
        "ec2:DescribeAccountAttributes",
        "ec2:DescribeAvailabilityZones",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeSubnets",
        "ec2:DescribeVpcs",
        "ec2:DescribeInternetGateways",
        "sns:Get*",
        "sns:List*",
        "cloudwatch:Describe*",
        "cloudwatch:List*",
        "cloudwatch:Get*"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

の様になります。

# まとめ
今回のリリースでほとんどの操作がManegement Consoleで実行出来るようになり、管理の手間が更に軽減されたと思います。
IAMも追加されていたりするので、新機能のリリースの際は是非一緒に御覧ください。


こちらは個人の意見で会社とは関係ありません。お約束です。
[翻訳] Ionicガイド(1/5)


ネイティブなHTML5モバイルアプリケーションを構築できるIonicフレームワークのガイドを翻訳しました。

http://ionicframework.com/docs/guide/


# チャプター1: Ionicのすべて

Ionicの[作者](http://drifty.com/)によって書かれた、HTML5モバイルアプリケーションを構築するためのIonicフレームワークの公式ガイド(http://drifty.com/) へようこそ。ここではあなたがIonicでアプリケーションを構築し始めるために知っておく必要なすべてが含まれており、より高度な開発のための基盤となります。

もし、あなたが過去に他のモバイル開発フレームワークを使用した経験があるのであれば、Ionicもほとんど同じように使えることでしょう。しかし、どのようなフレームワークでもとっかかりは常に困難なので、ここではシンプルに始めて基本的なコンセプトから発展していきます。しかし、最初に私たちは、Ionicがどのような開発に向いているのかや、なぜIonicを構築したのかなど、Iocniプロジェクト自体について少しだけ話す必要があります。

## Ionicとはなんなのか、そしてどのような開発にむいているのか？

Ionicはハイブリッドなモバイルアプリを構築するのを対象としたHTML5モバイルアプリ開発フレームワークです。ハイブリッドアプリは、アプリの中のブラウザシェルで実行されていて、ネイティブのプラットフォーム層にアクセスすることもできる、小型のウェブサイトです。ハイブリッドアプリは、特にプラットフォームのサポート、開発のスピード、およびサードパーティ製のコードの利用面で、純粋なネイティブアプリケーションと比べて多くの利点を持っています。

Ionicはあなたのアプリを魅力的にするために必要なすべてのルック＆フィールとUIの相互作用をしてくれるフロントエンドのUIフレームワークと思ってください。「ネイティブのためのBootstrap」のようですが、共通のネイティブモバイルコンポーネント、滑らかなアニメーションや美しいデザインを広い範囲でサポートします。

Ionicには、レスポンシブフレームワークとは異なり、iOSやAndoridのネイティブSDKで得られるような、いままでWebには存在しなかったような非常にネイティブなモバイルUIとレイアウトが含まれています。また、Ionicは既存のHTML5開発フレームワークをしのぐモバイルアプリケーション構築のための意固地ですが強力な方法と手段を提供します。

IonicはHTML5のフレームワークなので、ネイティブアプリケーションとして実行するためにはCordovaやPhoneGapのようなネイティブラッパーを必要とします。私たちはCordovaを使用するのを強く推奨します。以降ではIonicツールとしてCordovaを使用していきます。

## なぜ私たちはIonicを構築したのか？

私たちは、HTML5がデスクトップの分野で起きたように、そのうちモバイルでも決定的になると強く信じてIonicを構築しました。デスクトップコンピュータは十分強力になり、ブラウザ技術が十分に進むことで、ほとんどの人が自分のコンピュータ上での時間をブラウザ内で費やすことになりました。そして、開発者は圧倒的にWebアプリケーションを構築するようになりました。最近のモバイル技術の進歩により、現在ではスマートフォンやタブレットでこれらと同じWebアプリケーションの多くを実行できるようになりました。

私たちは、モバイルのWebサイト開発のための[素晴らしいツール](http://jquerymobile.com/)はすでに存在していると感じていたので、IonicではモバイルのWebサイトの代わりに *ネイティブ* またはハイブリッドアプリに焦点を当ててHTML5のモバイル開発フレームワークを構築することにしました。ですので、IonicアプリはChromeやSafariのようなモバイルブラウザで実行すると言うよりも、Cordova/PhoneGapのようなツールによってラップしてiOSののUIWebViewやAndroidのWebViewのような低レベルのブラウザシェルで実行します。

そして何よりも、プロジェクトを中心に強力なコミュニティを助長するためのオープンソースなアプリだけではなく、商用のアプリケーションでも使用することができる寛大なオープンソースライセンスを有した上で、可能な限り確実にオープンソースとなるようにしました。私たちは、オープンソースの精神がなかったり、コマーシャルライセンスを購入しないと、オープンソースとソースを公開しないプロジェクト両方には使用できないなどの、 *技術の上では* オープンソースなフレームワークがたくさんあると感じていました。

## Ionicでハイブリッドアプリを構築

Web開発に精通している人は、簡単にIonicでのアプリの構造を理解できることでしょう。その中核には、ネイティブアプリケーションシェルで実行されているだけのWebページです！つまり、HTML、CSS、およびJavaScriptの任意の種類を使用できることを意味します。唯一の違いは、他から参照されるウェブサイトを作成するのではなく、自己完結型のアプリケーション体験を構築します。

Ionicアプリの大部分は、HTML、JavaScript、およびCSSで書き込まれます。熱心な開発者は、カスタムCodovaプラグインやネイティブコードでネイティブ層へ掘り下げるかもしれませんが、それは素晴らしいアプリを作成するために必須ではありません。

また、Ionicはフレームワークのコア機能にたくさんのAngularJSを使用しています。CSS部分だけでもIonicを使用することができますが、今日のブラウザベースのアプリケーションを構築するための最良の方法の一つとして、私たちはAngularへの投資をお勧めします。

## 構築しましょう！

これで、あなたはIonicが何であるかを理解し、それが存在する理由、それを使って最初のアプリの構築を開始する準備ができました。必要なものをすべて取得してインストールし、Ionicで構築をはじめましょう！

[チャプター2: インストール](installation.html)


## ライセンス

この文章には、 Apache 2.0ライセンスで配布されている製作物が含まれています。

Copyright 2014 Hirotaka Mizutani

Apache License Version 2.0（「本ライセンス」）に基づいてライセンスされます。あなたがこのファイルを使用するためには、本ライセンスに従わなければなりません。本ライセンスのコピーは下記の場所から入手できます。

http://www.apache.org/licenses/LICENSE-2.0

適用される法律または書面での同意によって命じられない限り、本ライセンスに基づいて頒布されるソフトウェアは、明示黙示を問わず、いかなる保証も条件もなしに「現状のまま」頒布されます。本ライセンスでの権利と制限を規定した文言については、本ライセンスを参照してください。
同じ OmniAuth provider を１つのアプリで複数使いたい

path_prefix と callback_path を変えて複数登録すればいい

```rb
Rails.application.config.middleware.use OmniAuth::Builder do
  privider :twitter, 'x_key', 'x_secret', path_prefix: '/auth/xxx', callback_path: '/auth/xxx/twitter/callback'
  privider :twitter, 'y_key', 'y_secret', path_prefix: '/auth/yyy', callback_path: '/auth/yyy/twitter/callback'
end
```
命名規則についての覚書

いつも忘れてしまうので備忘録的に残しておきます。

* 参考とさせていただいたページ

http://www.okapiproject.com/java/java_codeconventions/jcc_naming.htm

#### ファクトリメソッド

メソッド内でオブジェクトをnewして、インスタンスを戻り値として返すようなもの。
この命名規則には2種類ある。

* 引数がない場合
    * 先頭に`new`をつける
* 引数がある場合
    * 先頭に`create`をつける

```
// 例1. 引数がない場合
function newDevice() {}

// 例2. 引数がある場合
createDeviceChecker($userAgent)
```

#### コンバータメソッド - 何か変換するようなメソッド

オブジェクトを別のオブジェクトに変換するときのメソッドです。
この場合、対象のオブジェクトの先頭に`to`をつける。

```
toStringData()
```

#### booleanを返すメソッド


boolean(true|false)をを返すメソッドについては下記5通りで命名します。

* 「is + 形容詞」
* 「can + 動詞」
* 「has + 過去分詞」
* 「三単現（三人称単数現在）動詞」
* 「三単現動詞 + 名詞」

```
// is+形容詞
isEnabled()
isIos()
isAndroid()
isWeb()

// can+動詞
canGet()
canRemove()
canDelete()

// has+過去分詞
hasCanged()
hasExcluded()
hasIncluded()

// 三単現動詞
contains()

// 三単現動詞+名詞
containsKey()
```
App Groupを使ってみた

iOS8の新機能、App Extensionでアプリを作ってる上で必要になったので、AppGroupを使ってみました。

・アプリとApp Extension間でのデータのやりとりをしたかった
・App Extensionでファイルの読み書きをしたかった

ってところらへんが背景にあります

ということで備忘録代わりに早速書いていきます

## 準備
App Groupを使うためにはiOS Dev CenterでApp Groupを登録する必要があります。

まずiOS Dev CenterのApp Groups上でGroup IDを追加します。
"group.com.test.apps"という感じで、アプリのBundle Identifierの前に"group."をつける形が良いかと思います
（そもそも登録時にデフォルトでgroup.って入ってますしね）

次に、共有したいアプリをXcodeで開いて、
Project > Capabilities > App GroupsをONにします。
ONにすると、先ほどiOS Dev Centerで登録したGroup IDが表示されるので、チェックボックスにチェックを入れます。
※このXcode上で行う設定は、共有したいアプリ全てに設定してください。

## 実装
準備ができたら実装に移ります。

プロジェクト内のファイルを、共通領域のshared containerに配置します。

```objc:sample

    //共通領域のファイルパスを取得
    NSURL *fileURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.test.apps"];
    fileURL = [fileURL URLByAppendingPathComponent:@"test.txt"];
    
    //ファイルが存在するかチェック
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:[fileURL path]];
    if (!fileHandle) {
        //ファイルがなかったらApp Group領域へ
        NSString *src = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"];
        NSData *textData = [NSData dataWithContentsOfFile:src];
        
        //共通領域にファイルを生成する
        NSFileManager *fileManager = [NSFileManager defaultManager];
        BOOL result = [fileManager createFileAtPath:[fileURL path] contents:textData attributes:nil];
        if (result) {
            NSLog(@"create file success >> %@", fileURL);
        } else {
            NSLog(@"create file error");
            return NO;
        }
        
    } else {
        //ファイルがあったら何もしない
        NSLog(@"file already exists >> %@", fileURL);
    }
```

こんな感じです。
ファイルをNSDataに落としてから、ファイルを生成し直すという処理にしてますが、ファイルコピーをすることができなかったのでこんな感じにしてます。

生成されたファイルを読み込むには、上述したソースの冒頭と全く一緒ですが、

```objc:sample
    //共通領域のファイルパスを取得
    NSURL *fileURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.test.apps"];
    fileURL = [fileURL URLByAppendingPathComponent:@"test.txt"];
```

で、ファイルパスは取れるので、後は読みこむなり、書き込むなり、煮るなり焼くなり好きにしてください。


◯余談
今回は使わなかったのですが、NSUserDefaultsもアプリ間で共有できるようです。

```objc:sample
   
   // Save to shared UserDefaults
   NSUserDefaults *ud = [[NSUserDefaults alloc] initWithSuiteName:@"group.test.apps"];
   [ud setObject:@"hogehoge" forKey:@"testKey"];
   [ud synchronize];

  
   // Load to shared UserDefaults
   NSString *test = [ud objectForKey:@"testKey"];
   NSLog(@"shared defaults value >>>> %@",test); // shared defaults value >>>> hogehoge

```

こんな感じかな・・。

App ExtensionやらApp Groupやら、まだまだ情報が少ないので気づいたことがあれば徐々に掲載していきたいですね。
VMWareでyum が壊れた件、直した件

yum が使えなくなるという恐ろしい事態に。

▼環境
VMWare CentOS 6.5

```
File "/usr/bin/yum", line 30
    except KeyboardInterrupt, e:
                            ^
```

というエラーになる。ヾ(｀ω´*)ﾉ"ｹｼｶﾗﾝ

▼対策
cd /usr/bin/
ll | grep python

でpython のバージョンとシンボリックリンクを確認。


cat /usr/bin/yum
で、yum を直接見に行って、

環境に合わせてシンボリックリンク。
ln -s python2.6 python

一行目: #!/usr/bin/python

を、
```
 #!/usr/bin/python2.6
```

とかに直すと元に戻った。

泣きそうでした。
【ニュース】Ruby 2.1.4などリリース（2014/10/27）

#10/27にリリースされました
- [Ruby 2.1.4 リリース](https://www.ruby-lang.org/ja/news/2014/10/27/ruby-2-1-4-released/)
- [Ruby 2.0.0-p594 リリース](https://www.ruby-lang.org/ja/news/2014/10/27/ruby-2-0-0-p594-is-released/)
- [Ruby 1.9.3-p550 リリース](https://www.ruby-lang.org/ja/news/2014/10/27/ruby-1-9-3-p550-is-released/)

既に ruby-build は更新されているので `rbenv install` でもインストール可能です。
#POODLE 脆弱性対策
>今回の変更により、安全でない SSL/TLS オプションがデフォルトで無効化されるようになりました
###Ruby の標準添付ライブラリ
今回の変更は、標準添付ライブラリに関しては、net/http、net/imap、net/pop においてデフォルトで反映されます。 DRb および WEBrick については、別途設定を受け付けるようになっているため、今回の変更は直接には反映されません。

>- [ext/openssl のデフォルト設定の変更について](https://www.ruby-lang.org/ja/news/2014/10/27/changing-default-settings-of-ext-openssl/)

このデフォルト設定の変更を無効化するパッチも上記リンクで公開されています。
また、
>何らかの事情で Ruby の更新はできないけれども安全でない SSL/TLS オプションへの対処は必要である

場合のモンキーパッチも公開されています。

#補足：1.9.3ユーザはそろそろ新しいバージョンへの移行を
来年2015年の2月までに移行しておきましょう。

>注意
Ruby 1.9.3 は現在セキュリティメンテナンスフェーズにあります。 これは、セキュリティ問題以外のバグに関しては、もはや修正が行われない、ということを意味します。 また、現時点の計画では、1.9.3 のメンテナンスは来年 2 月に終了する予定となっています。 1.9.3 のユーザーは、なるべく早く、より新しいバージョンの Ruby へ移行されるようお勧めします。
Modern React Flux application example (pt. 3)


Continuing from where we left off in part 2, I want to talk about Pure Render Mixin and "pure" components.


## Pure Render Mixin

Facebook documentation on this mixin is surprisingly good, check it out [here](http://facebook.github.io/react/docs/pure-render-mixin.html) first. The whole code can be seen on Github, and it's pretty nicely simple.

* [ReactComponentWithPureRenderMixin](https://github.com/facebook/react/blob/5d3b12bb3bd6a092cf00ede07b8255a8399c2e58/src/addons/ReactComponentWithPureRenderMixin.js)

* [shallowEqual](https://github.com/facebook/react/blob/5d3b12bb3bd6a092cf00ede07b8255a8399c2e58/src/utils/shallowEqual.js)

The main thing you should keep in mind is that if any of the old props/state are not equal to the new props/state i.e. `props.myProperty !== newProps.myProperty`

This works because it uses the lifecycle method `ShouldComponentUpdate` to return a boolean. If true, React will go ahead and rerun the `render` method in the component (and, consequently, call on the children to render themselves based on the props passed in).

You don't have to bring in the heavy React.addons to use this though, just bring it in specifically. After going through the React publish cycle, the pure render mixin will be exposed through `react/lib/ReactComponentWithPureRenderMixin.js`, like so:

```js
/** @jsx React.DOM **/
var React = require('react');
var ReactComponentWithPureRenderMixin = require('react/lib/ReactComponentWithPureRenderMixin');

module.exports = React.createClass({
  mixin: [ReactComponentWithPureRenderMixin],

  render: function () {
    return (
      <td className="example-table-element">
        {this.props.children}
      </td>
    );
  }
});
```

That's about it, just make sure your component doesn't do anything that makes `render` not an idempotent function of `props` and `state`.


## What's next?

[Part 4](http://qiita.com/kimagure/items/ce3e889399f4ac416223)

Next time, we'll talk about problems with using Pure Render Mixin for computed elements and profiling performance in our application.
Modern React Flux application example (pt. 1)

## TOC

1. (this page)

2. [part 2](http://qiita.com/kimagure/items/c97a85487d941900ab72)

3. [part 3](http://qiita.com/kimagure/items/b59dae2b7e1116e0087e)

4. [part 4](http://qiita.com/kimagure/items/ce3e889399f4ac416223)

## Disclaimer

This was written against React 0.11.x, but the only changes you need to make are to either transform to use Object.assign or use lodash's _.assign instead of React's merge and copyProperties. The code in this example will work either way, and React will present you with warning messages.


## Why yet another tutorial?

I've been pretty disappointed in the quality of react/flux examples I've read so far. To this effort, I'm going to try to write a series of Qiita posts on how to do some parts of modern React/Flux development. I'll touch on profiling performance in the last bits. Not that I will be much better, sorry.

If you already have your project set up, skip to [part 3](http://qiita.com/kimagure/items/b59dae2b7e1116e0087e) for actually useful bits.


## Github repo

Github repo for this article here: https://github.com/kimagure/react-flux-example/tree/master


## Project dependencies

```json
"devDependencies": {
  "gulp": "^3.8.9",
  "gulp-util": "^3.0.1",
  "jest": "^0.1.37",
  "jsx-loader": "^0.11.2",
  "webpack": "^1.4.8"
},
"dependencies": {
  "flux": "^2.0.1",
  "react": "^0.11.2"
}
```

You need React if you're going to use React, and you're going to need a pretty good Dispatcher for your Flux application, so why not just take advantage of the dispatcher that comes from facebook/flux?

## Quick overview of Flux

There's too many super wordy explanations of Flux out there, and it just discourages people from ever taking a stab at it. Here's all you need to understand to use it.

Main parts:

* Store - this is where your app state lives and gets modified.
* Dispatcher - this is what takes actions and feeds them into the store, one by one.
* Action - this is what your view triggers so that the dispatcher can handle them appropriately.

Summary of what happens:

| Part | What it does | What gets called to do something |
|------|--------------|----------------------------------|
| Action | Handle view/server events | Dispatcher, to handle actions |
| Dispatcher | Feed store jobs to do | Store, to consume actions |
| Store | Handle dispatched actions | Store, to emit changes |
| Store | Update app state and emit change event | Store, to handle change emit events |
| Store | Handle change event | Callbacks registered to the store (your application)

In a glorious diagram:

```
|--------|     |------------|     |--------------|     |------------------|     |-------------|
| Action | --> | Dispatcher | --> | Store (emit) | --> | Store (consumer) | --> | Application |
|--------|     |------------|     |--------------|     |------------------|     |-------------|
```


## What next?

[Part 2](http://qiita.com/kimagure/items/c97a85487d941900ab72)

1. Set up project for Flux work

2. Have a simple build process

3. Babby's first create entity
macのapache2でsslとオレオレ証明書の設定


### オレオレ証明書作成

```
cd /private/etc/apache2

sudo sh -c "openssl genrsa 2048 > server.key"
sudo sh -c "openssl req -new -key server.key > server.csr"
sudo sh -c "openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt"
```
common name のみ設定する

### httpd-ssl.conf有効化

```/private/etc/apache2/httpd.conf

# Secure (SSL/TLS) connections
Include /private/etc/apache2/extra/httpd-ssl.conf
```

### SSL の設定

以下はデフォルト変更してるのでちゃんとやるなら分離してください。

```/private/etc/apache2/extra/httpd-ssl.conf
77行目あたりを修正
DocumentRoot "/LocalDir/public"
ServerName hogehoge.jp:443
```

また最終行あたりにディレクトリの設定も追加する

```/private/etc/apache2/extra/httpd-ssl.conf
<Directory "/LocalDir/public">
    AllowOverride AuthConfig FileInfo Indexes Limit Options=All,MultiViews
    Options -MultiViews
    order deny,allow
    deny from All
    allow from localhost 127.0.0.1
</Directory>

```

### apache再起動

```
sudo /usr/sbin/apachectl restart
```
世界三大覚えてられないけど有用な知識 [2] Emacsで矩形に連番を挿入する "C-u C-x r N"

挿入したい位置を矩形選択して、 `C-u C-x r N`。

開始番号と書式(`%2d`がデフォルト)を指定する。

![C-uC-xrN.gif](https://qiita-image-store.s3.amazonaws.com/0/1994/fde7c7f0-36cf-0ce2-c6a1-113d31fdd619.gif)

# 参考

<blockquote class="twitter-tweet" lang="ja"><p>&quot;C-u C-x r N&quot;による矩形連番挿入をだいぶ自然に使えるようになってきた</p>&mdash; すぎゃーん (@sugyan) <a href="https://twitter.com/sugyan/status/279166059741839360">2012, 12月 13</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
hostsファイルの変更をブラウザで即反映させる方法

hostsファイルを変更しても
ブラウザではすぐに反映されない場合があります。
その対応のための手順。

他のブラウザに関しては、
順次追加よてい。

◎環境
OSX 10.9


# Chrome, Chromium

## 手順

1. hostsファイルの内容変更


2. 下記画面で、[clear host cache]ボタンを押下
[chrome://net-internals/#dns](chrome://net-internals/#dns)

3. 下記画面で、[flush socket pools]ボタンを押下
[chrome://net-internals/#sockets](chrome://net-internals/#sockets)



# 参考

- https://qiita.com/Hidehiko-Inoue/items/7b9d3bdb657c3d83095e

以上
新しいTestFlightを試したらエラーが出たので、対処法をメモ。

#はじめに
新しいTestFlightを試したときにエラーでハマったので、対処方法をメモしました。
TestFlight起因でないものもありますが、参考になればと思います。

#ErrorList
##appをArcheiveしてupload中に下記エラーが出る.
>No software with CFBundleIdentifier of 'xxxxxx' exists.

A)DevSiteにAppを登録したので、安心していましたが、配信の紐付けのために
DevSiteだけでなく、itunesConnectにもアプリIDの登録が必要でした。
ItuensConnectにアプリを登録すれば解消します。
(参考)http://stackoverflow.com/questions/26310548/no-software-with-cfbundleidentifier-of-xxxxxx-exists


##appをArcheiveしてupload中に下記エラーが出る.
>ERROR ITMS-9000:"Missing required icon file. The bundle does not contain an app icon for iPhone /
iPod Touch of exactly '120×120' pixels,in .png format for iOS versions >= 7.0."

A)今回はテスト用にdemoアプリを作ったのでアイコンを設定していなかったのでエラーが出た。
120×120のアイコンを追加したら解消しました。

##招待されたメールからTestFlightを起動すると下記エラーになってアプリが見つからない.
>You aren't currently testing any apps.
To Accept an invitation, you must click the link in the invitation email.

Gmailのアプリに来たメールをそのままクリックしてTestFlightを起動すると起こる。
Gmailを使っている場合はiOS標準のメーラーにアカウントを追加して、iOSのメーラーから招待メールをクリックする必要があります。
(参考)http://stackoverflow.com/questions/25802364/beta-testing-with-internal-testers-for-ios-8


##appを端末から起動するときに下記エラーになる
>process launch failed: failed to get the task for process 834

プロビジョニングがAdHocだった.

##appを端末から起動するときに下記エラーになる
>dyld: Library not loaded: >@rpath/Alamofire.framework/Alamofire
  Referenced from: >/private/var/mobile/Containers/Bundle/Application/xxxxxxxxxxx/MyApp.app/MyApp
>  Reason: image not found

自身の場合はAlamofireをフレームワークとして入れたのですが、そのライブラリが見つからないというエラーになっています。

1.Linked Frameworks and Libraries に登録されているか確認する
![スクリーンショット 2014-11-26 10.13.34.png](https://qiita-image-store.s3.amazonaws.com/0/43766/c8dbdbf6-d755-38f9-952e-f80d25c65f3a.png)

2.Copy Files Phaseに登録されているか見直す.
![スクリーンショット 2014-11-26 10.13.19.png](https://qiita-image-store.s3.amazonaws.com/0/43766/c437cac7-b87a-ae87-9780-94212ed8fdd8.png)

※Copy Files Phaseが無い場合は、左上の+からNew Copy Files Phaseを選択すること！
![スクリーンショット 2014-11-26 10.17.16.png](https://qiita-image-store.s3.amazonaws.com/0/43766/c143b41a-e00c-ff9d-3892-5477180c0f45.png)


#おしまい
思っていたよりも簡単にテスト用にインストールができるようになりました。TestFlight便利!!
世界三大覚えてられないけど有用な知識 [1] first commitを改竄するには git rebase -i --root

`git init` 直後のコミットは `git rebase -i HEAD@{1}` ではrebaseできない。
`user.name` や `user.email` を設定し忘れて `first commit` しちゃったときに困ったりする。

そんなときは

```
% git rebase -i --root
```

各commitをeditし、 `git commit --amend` する。

commitのauthorを変えるには

```
% git commit --amend --author="YOUR NAME <your_name@example.com>"
```

歴史を書き換えるのでリモートにはforce pushが必要。

# 参考

* [First commit が git rebase -i できない問題 → git rebase -i --root でできる - 納豆には卵を入れる派です。](http://d.hatena.ne.jp/ken_c_lo/20130421/1366558065)
* [Git の Commit Author と Commiter を変更する - Qiita](http://qiita.com/seamountain@github/items/d70216a5bc16a88ed932)
Yiiのログをうまくtailするコツ

Yiiのアプリケーションエラーログは、スタックトレースや環境変数のダンプなど、記述が詳細すぎて、発生をすぐに検知したり、時間的な流れを見たりするとき、そのままでは辛いです。(詳しく調べるのには向いてるんですが)

が、うまく grep してやれば tail もできますよというシェルのテクニック、これで、たとえばエラーが出たらすぐにわかるようになったりします。

```bash
$ tail -f runtime/frontend/logs/app.log | grep --line-buffered "\[error\]"
```

こういう調子のが

```
2014-10-23 12:18:00 [111.111.111.111][1][-][error][hoge\fuga\SomeException] exception 'SomeException' 
with message 'Failed to connect to: hogehoge enterprise backend' in /home/hogehoge/webapp/hoge/fuga/Connection.php:247
Stack trace:
#0 /home/hogehoge/webapp/hoge/fuga/Connection.php(247): SomeConnection->__construct('dsn://hogehoge...', Array)
#1 ...
    :
    :
#28 {main}
2014-10-23 12:18:00 [172.31.7.240][1][-][info][application] $_COOKIE = [
    '_csrf' => 'xxxxxxxxx'
    'SESSION' => 'yyyyyyyyyyyy'
    '_identity' => 'zzzzzzzzzzz'
]

$_SESSION = [
    '__flash' => []
    '__returnUrl' => '/'
    '__id' => 1
]

$_SERVER = [
    'USER' => 'hogehoge'
        :
        :
    'REQUEST_TIME' => 1414066680
]
2014-10-23 12:19:00 [111.111.111.111][1][-][error][hoge\fuga\SomeException] exception 'SomeException' 
with message 'Failed to connect to: hogehoge enterprise backend' in /home/hogehoge/webapp/hoge/fuga/Connection.php:247
    :
    :
```

こういう調子になる

```
2014-10-23 12:18:00 [111.111.111.111][1][-][error][hoge\fuga\SomeException] exception 'SomeException' 
with message 'Failed to connect to: hogehoge enterprise backend' in /home/hogehoge/webapp/hoge/fuga/Connection.php:247
2014-10-23 12:19:00 [111.111.111.112][1][-][error][hoge\fuga\SomeException] exception 'SomeException' 
with message 'Failed to connect to: hogehoge enterprise backend' in /home/hogehoge/webapp/hoge/fuga/Connection.php:247
2014-10-23 12:20:00 [111.111.111.113][1][-][error][hoge\fuga\SomeException] exception 'SomeException' 
with message 'Failed to connect to: hogehoge enterprise backend' in /home/hogehoge/webapp/hoge/fuga/Connection.php:247
```

まあ、本質的にはYiiに特化した話ではないけれど、Yiiのログを追う人のスクロール操作がやたら多いなあと感じるので、Yiiユーザーにはぜひ知っておいてもらいたい方法です。
Angular.jsでminify化対策 [#ng-study]


Angular.jsの勉強メモ

Angular.jsでは`$scope`や`$http`は仮引数として指定してあるのでminify化したときに引数名が変わって動かなくなるときがあるらしい。ので、minify化しても大丈夫なように書き換えるor専用のminifyツールを使うのがいいらしい。

* Codegrid https://app.codegrid.net/entry/angularjs-3

```original.js
var app = angular.module('myApp', []);

app.controller('MainCtrl', function($scope, $http, $timeout) {
  $scope.name = 'hokaccha';

  $scope.onClickBtn = re;

  function re(){
	$scope.name = this.name.split('').reverse().join('');
  };

});
```

もとのjsを書き換えると
↓


```convert.js
var app = angular.module('myApp', []);

app.controller('MainCtrl', ['$scope', '$http', '$timeout', function(s,h,t) {
  s.name = 'hokaccha';

  s.onClickBtn = re;

  function re(){
	s.name = this.name.split('').reverse().join('');
  };

}]);
```


##ngmin
* ↑で言っているAngular.js用のminify化ツール

gulp-ngmin https://github.com/sindresorhus/gulp-ngmin

あとで使ってみよう
Confluenceのサイドバーを隠したい


## やりたいこと

単純に、Confluenceのサイドバーを無くして画面いっぱいにコンテンツを表示したい...ということです。

## 方法：CSSでやっつける

動作に影響を与えたくない場合は、やはりCSSでの調整です。
こちらも、スペース単位でCSSを変更できるので、全体はそのままで良いけれど、自分のスペースだけ調整したいといった場合にお試し下さい。

### Documentation themeの場合

前々のバージョンだと、Documentation Themeを使っている場合が多いかと思います。
こちらは、Atlassian AnswersにもQ&Aがありました。

- Ref: [Hide Confluence sidebar default theme]
(https://answers.atlassian.com/questions/170155/hide-confluence-sidebar-default-theme)

```source:css
#splitter-sidebar {
    width:0 !important;
}
 
#splitter-button, 
#splitter .vsplitbar {
    display:none !important;
}
```


### Default theme（既定のテーマ）の場合

Confluence 5.x系だと、デフォルトテーマがDocumentation Themeではなくなった模様。
こちらについては上記のQ&Aでは回答が見つけられなかったので、いろいろ試したあげく、下記でなんとか消えました。

（CSSは得意ではありませんので添削いただけると幸いです...)

```source:css
div.theme-default .ia-splitter #main {
    margin-left: 0px;
}
.ia-fixed-sidebar, .ia-splitter-left {
    display: none;
}
div#main {
    margin-left: 0px !important;
}
div#footer {
  margin-left: 0px !important;
}
```

## スペースの下のあるページだけ適用させたい場合は？

多分、CSSを埋め込むマクロを登録して、ページの本文使えば消せるはず...。
HTMLマクロでも行けましたので、サンプルを載せておきます。

```source:Confluence-page-source
<ac:structured-macro ac:name="html">
  <ac:plain-text-body><![CDATA[<style>
div.theme-default .ia-splitter #main {
    margin-left: 0px;
}
.ia-fixed-sidebar, .ia-splitter-left {
    display: none;
}
div#main {
    margin-left: 0px !important;
}
div#footer {
  margin-left: 0px !important;
}
</style>]]></ac:plain-text-body>
</ac:structured-macro>
```