OmniAICreator/Qiita-1.07M huggingface dataset:
時代遅れかもしれないSpring Web  Flow入門 1

#Spring Web Flow
##Spring Web Flow概要
[本家サイト](http://projects.spring.io/spring-webflow/)
多分、昔からのSpring MVC(Grails)使いなら、経験もあるだろうProject。
ターゲットとなるアプリは
* 開始と終了のある一連の業務フローを実行する。
* ユーザーは定義された順序で複数画面を経由して操作を行う。
* 最終的なフローが終了されるまで、変更は反映されない。
* フローが終了すると、そのフローは繰り返されない。

上位のような場合、従来はHTTPセッションにキャッシュしておいて、フロー終了時にコミットする、というのが一般的だと思います。（要件によってはDBに一時情報を入れる場合もあり。）
ただ、戻るボタン、複数タブ、セッションクリアのタイミング等々、色々とバグの温床になります。
そういった課題に対して解決策を提示してくれているのがSpring Web Flowです。
よさそう、よさそうと思っていたけど、試していなかったので、やってみます。

JSFとも連携できますが、この記事ではSpring MVCを前提にします。

###フロー定義
Spring Web Flow では、Spring MVCのようなコントローラは記述しません。フロー定義と呼ばれるxmlに画面（View）と処理(Action)の遷移を記述します。フロー定義に基づいて、フレームワークが提供するコントローラが画面遷移と処理を実行します。
フロー定義の例

```xml:sample-flow.xml
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/webflow
                          http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">

    <!-- フォームオブジェクトの初期化 -->
    <var name="sampleForm" class="sample.SampleForm"/>
	
	<!-- 初期画面「start」ステート。 event1が発行された場合、「action」ステートに遷移する。
	     イベント発生時には、modelで指定されたオブジェクトにパラメータをバインドさせる。
	       -->
	<view-state id="start" view="start" model="sampleForm">
	   <transition on="event1" to="action"/>
	</view-state>
	
	<!-- 「action」ステート　処理を実行し、実行結果に基づいてステートを遷移させる。 -->
	<action-state id="action">
	   <!-- アクションの実行 -->
	   <evaluate expression="sampleAction.execute(sampleForm,messageContext)"/>
	   <transition on="success" to="end">
	       <!-- アクションの結果を「actionResult」の名前でフロースコープに保存。 -->
	       <set name="flowScope.actionResult" value="currentEvent.attributes.result"></set>
	   </transition>
	   <transition on="error" to="start" />
	</action-state>
	
	<!-- 「end」ステート。フローの終了 -->
	<end-state id="end" view="end"></end-state>
</flow>

```
アクセスするURLはフロー定義が配置されたパスによって決まります。
フロー定義配置の例
* ルートフォルダ（設定可能）
  |
  |-flow-sample-「sample-flow.xml」

上記の例では「/flow/sample」が当該フローを示すURLとなります。初期画面はフロー定義の先頭に記述されたステートです。フロー内部の遷移はリクエストパラメータに応じて行われます。URLは常に「/flow/sample」です。
###画面
画面は「view-state」によって定義します。view属性に指定したパスに存在するJSP,もしくはTemplateが「view-state」に紐づく画面になります。
###処理
フロー内部での処理は、ステート内部の「evaluate」要素に記述します。Java言語と同じように、インスタンス名.メソッド名で処理を呼び出します。インスタンスはSpringのコンテナに管理されているBeanを利用できます。



##Spring Web Flowのメリット
HTTPは基本的にはステートレスで、一回の通信で終わりであるため、HTTPにフィットしたコントローラの処理は、１リクエスト毎に記述するしかありません。
Spring Web FlowはそうしたHTTPの特徴を隠して、複数リクエストにまたがるフローを一つの処理であるかのようにフロー定義上に表現できます。

##Spring Web Flowのデメリット
昨今のWeb開発の潮流はコントローラ部分はクライアントサイドで行い、サーバ側は可能な限り、ステートレスであろうとしているようです。これは大量アクセス、画像や動画、音声などのコストの高いデータのやり取りをするようになったことや、よりリッチなUIが求められるようになったことによるものでしょう。
そうした潮流からみると、サーバ上で状態を管理するSpring Web Flowは時代遅れなのかもしれません。
Jsonフォーマットを使った軽量なWebサービスにおいて、複数リクエストにまたがるフローを表現する方法として、HETEOASなどが提案されています。
[Spring HETEOAS](http://projects.spring.io/spring-hateoas/)
PowerMedia XMS Trail版インストール手順


#要約
[PowerMedia XMS](http://www.dialogic.com/products/media-server-software/xms.aspx)でISOイメージからトライアル版をインストールする手順と，CentOS 6.4->CentOS 6.6へアップデートすると管理仮面にアクセスできなくなる問題を解消する手順を記載する．

#実行環境
- Host OS：Mac OS X 10.10
- Virtualbox:4.3.20
- Powermedia XMS:PowerMedia-2.3.8731-x86_64.iso(Trial CentOS 6.4同梱)
- Guest OS:6.4->6.6

##インストール手順
ドキュメントは以下を参照．
[XMS2.3 document](http://www.dialogic.com/manuals/xms/xms2.3.aspx)->
`PowerMedia XMS WebRTC Installation and Configuration Guide - updated September 24, 2014`

* VirtualBoxで新規VMを作る．
 * NWの動作モード:ブリッジ  
~~* ポートフォワーディングを設定する(Host, Guestは共にIPを設定しない)~~
		~~* Host:8080 => Guest:80~~
		~~* Host:8081 => Guest:443~~
* 作成したVMのセカンダDVDドライブにトライアル版のISOファイルを設定する  
`PowerMedia-2.3.8731-x86_64.iso`
* VMを起動する
 * プロンプトでEnter
 * CUIでIPv4にチェックを入れる
 * パッケージインストール後，リブート画面に遷移する
 * リブート前にセカンダリDVDドライブをイジェクトする
 * [Reboot]を選択する
* Rootでログインする  
`id:root pwd:powermedia`
* コンソールで新規ユーザを作成する

```console
#useradd webrtc  
#passwd webrtc
```

* キーボードを日本語設定にして再起動する

```console
#vim /etc/sysconfig/keyboard
KEYTABLE="jp106"
MODEL="jp106"
LAYOUT="jp"
KEYBOARDTYPE="pc"
:wq
#/sbin/shutdown -r now
```

* セキュリティーアップデートを適用する  
インストール後，CentOS 6.4->6.6へアップデートされる．
`grep 443 /etc/httpd/conf.d/*`とすると複数の`Listend 443`が出てきて`/etc/httpd/conf.d/xms.conf`のSSL設定と重複するのでアクセスができない．

```console
#yum update -y
#cd /etc/httpd/conf.d/
#mv ssl.conf ssl.conf.org
#service httpd restart
```

## 動作確認
ホストOSから管理画面にアクセスできることを確認する．
~~`https://[Host OS's IP]:8081`~~
`https://[XMS Server's IP]`

#参考文献
[yum update httpd後にhttpdが起動しない。](http://www.ah-2.com/2014/06/11/yum_update_httpd_fail_restart.html)
Milkodeでソースコード検索

## 概要

複数のプロジェクトのソースコードを横断的に検索したい場合に、
Milkodeが便利です。
検索が高速（20000ファイルでも1秒以内とのこと）で、階層や拡張子で絞り込むことができます。

[Milkode - 行指向のソースコード検索エンジン](http://milkode.ongaeshi.me/index.html)

* 検索結果例

![MilkodeResult.png](https://qiita-image-store.s3.amazonaws.com/0/53590/5e7c3ef2-4f8e-0649-371f-ac17a63bd8b6.png)

## 環境

Ubuntu14.04

## インストール

```
$ sudo apt-get install ruby
$ sudo apt-get install ruby-dev
$ sudo apt-get install g++
$ sudo gem install milkode
```

## Milkodeのデータベースを作成

`$ milk init --default`

## パッケージ登録

MilkodeのソースとSinatraのソースを登録してみました

* Git clone

```
$ sudo apt-get install git
$ git clone https://github.com/ongaeshi/milkode.git
$ git clone https://github.com/bmizerany/sinatra.git
```

* パッケージの追加

```
$ milk add milkode/
$ milk add sinatra/
```

* パッケージの更新

`$ milk update --all`

## Milkodeのウェブアプリを起動

`$ milk web -o 0.0.0.0 -n`

## ウェブアプリにアクセスして検索

http://localhost:9292/

![MilkodeIndex.png](https://qiita-image-store.s3.amazonaws.com/0/53590/8799990d-dd2f-d0cc-b2c5-d703b8220396.png)
RESTfulAPIのFrontWebをAngular.jsで構築する準備



## 環境

+ node.js v0.11.14
+ npm v2.1.11
+ bower v1.3.12
+ grunt cli v0.1.13
+ Yeoman v1.3.3
+ Angular.js
+ Bootstrap3


## インストール

nodeとnpmをインストールします。

```Shell
$ brew install node
$ brew install npm
```

npmで以下ライブラリをインストールします。

```Shell
$ npm install -g yo grunt-cli bower generator-angular
```

## ジェネレート

Yeomanで雛形プロジェクトをジェネレートします。


```Shell
$ mkdir Test
$ cd Test
$ yo angular --minsafe [YOUR_APP_NAME]
```

angular-bootstrapを追加しておきます。

```Shell
$ bower install angular-bootstrap --save
```


## 開発用RESTFulAPIサーバへのProxy設定

`/api`というPrefixでパスにアクセスした場合に、localhostの3000ポートにプロキシする設定を行います。


```Grunt.js
    // The actual grunt server settings
    connect: {
      options: {
        port: 9000,
        hostname: 'localhost',
        livereload: 35729
      },
      // 追加 ここから
      proxies: [
        {
          context: '/api',
          host: 'localhost',
          port: 3000
        }
      ],
      // 追加 ここまで      
      livereload: {
        options: {
          open: true,
          middleware: function (connect) {
            return [
              require('grunt-connect-proxy/lib/utils').proxyRequest, // 追加　
              connect.static('.tmp'),
              connect().use(
                '/bower_components',
                connect.static('./bower_components')
              ),
              connect.static(appConfig.app)
            ];
          }
        }
      },

```

## サーバ起動

localhostの9000ポートでアクセスできるようになります。

```Shell
$ cd Test
$ grunt serve
```

## REF

+ [Yeoman で AngularJS ＆ UI Bootstrap の開発環境構築](http://qiita.com/hkusu/items/7d748b55ba73cc8a3675)
LIVAにCoreOSを突っ込んでdocker専用マシンにする


###前置き

LIVAのOSレスモデル[liva-c0-2g-64g-w]に、CoreOSを入れてDocker専用の静音マシンにします
無線LANもHDMIも音声出力も無視する贅沢仕様です

LIVAは見た目通り、物理マシンですのでCoreOSのBareMetalインストールを選択します

[Installing CoreOS to Disk](
https://coreos.com/docs/running-coreos/bare-metal/installing-to-disk/)

しかしながら、CoreOSが配布するisoイメージでは、LIVAはCDブート出来ませんでした。（2014.12.30現在）

また、先日までLIVAが内蔵するeMMCモジュールがCoreOSシステムで認識出来ませんでした。

年末なのでチャレンジを再開しようとしたところ、CoreOSのIssueが上がっていて、問題が解決していました。
https://github.com/coreos/bugs/issues/209

そこで、CoreOSのAlpha Channelのイメージを使ってインストールを行います。

たぶんチャレンジする人がほぼ居ないか、ちょっと情報があれば分かる特異な方だと想うので記事の内容は自分メモです

何かありましたら、コメント頂ければ分かる範囲でお答えします


##インストール
まず、LIVAがboot出来るubuntu 14.10 desktopを使ってOSブートします

CoreOSのインストールには公式に配布されているスクリプトを使います
https://raw.githubusercontent.com/coreos/init/master/bin/coreos-install

```bash
wget https://raw.githubusercontent.com/coreos/init/master/bin/coreos-install
chmod 755 coreos-install
sudo ./coreos-install -d /dev/mmcblk0 -C alpha
```

CoreOSのインストールの説明を見ると、カスタマイズのためのcloud-config.ymlを引数に設定出来ますが
インストールに使っているubuntuには、cloud-initが入ってないが入っていないため設定処理がスキップされます。

そこで、インストール後に個別にcloud-config.ymlを突っ込みます

突っ込む先は、/dev/mmcblk0p6 です。適当にマウントしてファイルを書き込みます。
これは、CoreOSの/usr/share/oemにファイルを書き込むのと同等の処理ですが、
事前に行わないと、ブートは出来てもログイン出来ないCoreOSがブートするだけになります。
/dev/mmcblk0p6がブートすると、/usr/share/oemにマウントされます


## レスキューログイン
通常は、[Bypass Authentication](https://coreos.com/docs/running-coreos/platforms/iso/#bypass-authentication)を使い自動ログインにしてしまうところですが
LIVAの場合、UEFIのせいかgrubのパラメータがうまく食えません。

仕方ないので、ubuntuを使ってbootし、UEFIパーテション(/dev/mmcblk0p1)をマウントし、
grub.confの中のefi boot用のパラメータに、'console=tty1 coreos.autologin=tty1'を追加しておくことで、
常時ログイン状態に出来ます。
あとは、ブート後のシステムで、/usr/share/oem/にcloud-config.ymlを置けばOKです
AWSのElasticBeanstalkで気をつけること

```
eb stop
```
すると`.elasticbeanstalk/optionsettings.xxxx`が上書きされて`SecurityGroups`の項目が
なくなってしまう。
再度

```
eb start
```

する前に`SecurityGroups`の項目を追加する必要がある。

これは仕様か？
hub でディレクトリごとに GitHub アカウントを使い分ける方法


## TL;DR

- hub 2.x 以降, 設定ファイルは環境変数 `GH_CONFIG` を参照している
- これをディレクトリごとに切り替えるために direnv を入れる
- 切り替えたいディレクトリで `echo export GH_CONFIG=$(pwd)/.hub > .envrc` しておきあとは hub を普通に使うだけ

## hub でディレクトリごとに GitHub アカウントを使い分ける


仕事と自宅で別の GitHub アカウントを使う場合など, hub が store しておく token を複数持ちたい場合がありますよね.
そんなときに, 以下の方法を取るとディレクトリごとに任意の GitHub token を選択することができ, 公開リポジトリにうっかり会社のアカウントで `hub pull-request` して失敗することがなくなります.

### 方法

以下は golang で書かれた hub 2.x の話になるので, まず hub 2.x を入れます.


```bash
brew install --HEAD hub
```

hub は取得した token を `~/.config/hub` に保存します. そこの処理を見てみましょう.

[hub/config.go](https://github.com/github/hub/blob/a0835d446bfabbe52df4c5906beee074234a70dd/github/config.go#L164)

```go
func configsFile() string {
	configsFile := os.Getenv("GH_CONFIG")
	if configsFile == "" {
		configsFile = defaultConfigsFile
	}

	return configsFile
}
```
 
defaultConfigFile は `defaultConfigsFile = filepath.Join(os.Getenv("HOME"), ".config", "hub")` と定義されています. これが `~/.config/hub` なのですが, 環境変数 `GH_CONFIG` がそれに先んじて参照されているため, `GH_CONFIG` に適当なファイルパスを指定しておけば良さそうです.

こういうときに便利なのが direnv です.

[zimbatm/direnv](https://github.com/zimbatm/direnv)

導入方法と紹介は以下の記事に詳しくあります.

[direnvを使おう - Qiita](http://qiita.com/kompiro/items/5fc46089247a56243a62)

これは, ディレクトリごとに任意の環境変数を設定できる優れものです.
今回の場合だと GitHub アカウントを変えたいディレクトリで,

```
echo export GH_CONFIG=$(pwd)/.hub > .envrc
```

とすると, ディレクトリ直下に `.envrc` ができ環境変数 `GH_CONFIG` が読み込まれます. あとは `hub pull-request` すると user_name, password を聞かれるので, 設定したいアカウント情報を入力するとそのアカウントで Pull Request が作成されます:congratulations:

今回の設定だと `.hub` に GitHub token が保存されます. 間違って commit に含まれないように `.hub` を共通の `.gitignore` に追加しておきましょう. また, このやり方だと毎回 token を生成してしまうので, `~/.config/hub_second` などのようにアカウントごとに特定の名前を付けるようにして,

```
echo export GH_CONFIG=$HOME/.config/hub_second > .envrc
```

というふうに生成するのも良いでしょう.
raspberryを有線から無線へ


# 準備したもの
* WLI-UC-GNM（BUFFALO）

---

# やった事

（１）interfacesファイルに設定を追加
（２）wpa_supplicant.confにssidの設定を追加
（３）raspberry piを再起動

---

## やった事詳細

### （１）interfacesファイルに設定を追加

* wpa-roamという項目はコメントアウト
* iface default inet dhcpもコメントアウト
* 固定IPにしたかったので、wlan0の設定はstaticで
* 元々有線だったのでeth0の設定は残しっぱなしです

```/etc/network/interfaces
auto lo

iface lo inet loopback
iface eth0 inet static
  address    192.168.0.100
  network   192.168.0.0
  netmask   255.255.255.0
  broadcast 192.168.0.255
  gateway   192.168.0.1
  dns-nameservers 192.168.0.1

allow-hotplug wlan0
iface wlan0 inet static
  address   192.168.0.100
  network   192.168.0.0
  netmask   255.255.255.0
  broadcast 192.168.0.255
  gateway   192.168.0.1
  dns-nameservers 192.168.0.1
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp
```

## （２）wpa_supplicant.confにssidの設定を追加

`wpa_passphrase`コマンドを使用して、アクセスポイントの情報を追加します。
下記[SSID][暗号化キー]については使用している無線APの情報をセット。

* network以外の設定は既存のままです

```実施コマンド
wpa_passphrase [SSID] [暗号化キー] #確認用
wpa_passphrase [SSID] [暗号化キー] >> /etc/wpa_supplicant/wpa_supplicant.conf
```

```
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="[SSID]"
        #psk="[暗号化キー]"
        psk=[ハッシュっぽい値]
}

```

## （３）raspberry piを再起動
※再起動コマンド割愛。
再起動後に、ping、traceroute実施でさくっと繋がりました。

## 雑感

案外簡単に出来てしまってちょっと拍子抜け。
サイトを検索する時間も含めて設定時間は30分程度でした。
raspberryは子供用PCとして安価でいいなー。

---

* 参考サイト
	* [こじ研](http://www.myu.ac.jp/~xkozima/lab/raspTutorial1.html)
	* [入門者のためのRASPBERRY PI で天体撮影 19 無線LAN設定](http://www.palm-dreams.com/blog/?p=419)
	* [ぱせらんメモ](http://d.hatena.ne.jp/pasela/20121224/raspi_wlan)
	* [Raspberry Pi + 無線LAN セットアップ](http://qiita.com/daicham/items/e24ce76f8815d339d070)
Propertyの値が変わったらTableViewの表示を変更


#目的：
Propertyの値が変わったらtableViewの表示を変更する
#環境：
Xcode Version 6.1.1
#実装方針：
　swiftになってから導入されたdidSetを上手くつかって実装する。具体的にはPropertyの値が別のActionで変わったのをTriggerとしてtableViewのreloadをします。
　ViewControllerが肥大化するのを避ける為tableViewのDataSourceやDelegateは別で準備しておきます。
#ソースコードと詳細説明

```sample.swift
private var keyword:String!{
	didSet{
		self.tableView.delegate = self.tableSource
		self.tableView.dataSource = self.tableSource
		self.tableView.reloadData()
	}
}
```

　サンプルではkeywordというpropertyが何かのActionで変化すると、それをtriggerとしてtableViewがreloadされる仕組みです。
　Objective-CではNotificationCenterで処理していましたがdidSetがあると便利ですね。
【Maven】いろいろな依存ライブラリのバージョン指定方法

maven dependencyに指定するversionの指定方法まとめ。

| 記述       | 意味 |その他|
|:-----------|------------:|:------------|
| 1.0        | 1.0を指定(Soft) ||
| (,1.0]     | 1.0以下を指定 ||
| (,1.0)     | 1.0未満を指定 ||
| [1.0]      | 1.0を指定(Hard) |"1.0"指定と違いがよくわからなかったけど、この指定方法だと"絶対に1.0"ってことかな･･･|
| [1.0,)     | 1.0以上を指定||
| (1.0,)     | 1.0より上を指定 ||
| (1.0,2.0)     | 1.0より上、2.0未満を指定||
| [1.0,2.0)  | 1.0以上、2.0未満を指定||
| [1.0,2.0]     |     1.0以上、2.0以下を指定||
| (,1.0],[1.2,)     | 1.0以下もしくは1.2以上を指定||
| (,1.1),(1.1,)     |     1.1以外|指定したバージョンを除外した中で最新のものが適用された|
Macでプレゼンまたは年末の大掃除の際に便利な小技

#Macでプレゼンか年末の大掃除の際に便利な小技
Macでプレゼンのデモ等でミラーリングで画面表示する際に、または年末でデスクトップの大掃除をしなければならない際に使うと便利な小技を紹介します。**あくまで自己責任でお願いします。**

**すぐに使いたい方はAppleScriptsとの連携からお読みください**

# defaults編
Macにはdefaultsという「plist」、アプリやシステムの設定ファイルに、設定値を追加、変更、削除、検索するコマンドがあります。今回はこれを活用して、小技を実現します。
今回はdefaultsコマンド自体には詳しく説明しません。ざっと書くなら以下の感じ。

```bash
defaults [read|write] [変更したいファイル名（拡張子の.plistはのぞく）] [追加・変更の項目値] [設定値]
```

このコマンドを使うとMacのデスクトップのアイコンを非表示にできます。

**デスクトップ上のアイコン表示を無効にする**

```bash
defaults write com.apple.finder CreateDesktop -bool FALSE;killall Finder
```
実行するとFinderが再起動してデスクトップのアイコンを非表示にできます。

**デスクトップ上のアイコン表示する**

```bash
defaults delete com.apple.finder CreateDesktop;killall Finder
```

# AppleScriptsとの連携
上記の方法だと、毎回コマンドを入力する必要があり、あまり便利ではありません。そこでAppleScriptと連携してツールにしていきます。

Macの[アプリケーション]-[ユーティリティ]-[AppleScript エディタ.app]を起動して、以下のコードを貼付けます。

```applescript
display dialog "デスクトップアイコンを隠しますか?" buttons {"表示", "非表示"} with icon 2 with title "Switch to presentation display" default button 1
set switch to button returned of result
if switch is "非表示" then
	do shell script "defaults write com.apple.finder CreateDesktop -bool FALSE;killall Finder"
else
	do shell script "defaults delete com.apple.finder CreateDesktop;killall Finder"
end if
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/18287/626ba375-05fa-7183-1f12-94bdb4fef249.png" width="400">

エディタ上部の[実行]ボタンを押して、実行しています。実行するとダイアログが表示されて、表示または非表示を選択できます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/18287/56a13bd6-e79d-c98c-871e-089f744b1f21.png" width="400">

# アプリケーション化
AppleScriptを使ってボタン操作でデスクトップのアイコンの表示、非表示ができるようになりましたので、アプリケーションにしていきます。

アプリケーションにするには、[AppleScriptエディタ]の[ファイル]-[書き出し]をクリック。
![スクリーンショット 2014-12-30 23.31.28.png](https://qiita-image-store.s3.amazonaws.com/0/18287/584502ce-2ee6-fd08-572e-a541d1b3c52f.png)

ファイルフォーマットにアプリケーションを選択して、お好きなアプリケーション名を入力し、保存をクリックします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/18287/dcf645ea-593f-78b3-42e9-d27c85988360.png" width="400">

アプリケーション化完了です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/18287/064204ec-0b84-c6ab-6eb3-397810df92e9.png" width="400">

# まとめ
Macの隠し機能とAppleScriptをつかうことで、Macでプレゼンのデモ等でミラーリングで画面表示する際にデスクトップが荒れているとちょっと恥ずかしい気持ちにならなくて済みます。でも、できる限りツールを使わずデスクトップはきれいにしておくとよいでしょう。
MacBook Pro (Retina, 13-inch, Mid 2014)の解像度を変える

#解像度を変える
MacBook Pro (Retina, 13-inch, Mid 2014)の標準である「ディスプレイに最適」は、MBAの画面より狭いです。
渡しの場合、Retinaだからといって美しさを求めている訳ではないので、解像度は高い方が嬉しい。

##解像度の種類
解像度は4つあります。
###擬似解像度：1024 x 640
これは無いわぁ〜
###最適（Retina）
なんでこれが標準？
###擬似解像度：1440 x 900
MBPと同じこれが標準じゃないの？
###擬似解像度：1680 x 1050
オヤジの眼には辛いけど、広い画面が好き

##変更方法
「システム環境設定」から「ディスプレイ」を開きます。
![スクリーンショット 2014-12-29 15.23.09.png](https://qiita-image-store.s3.amazonaws.com/0/26668/265e9497-bff5-d0d7-c576-93c9a18426d2.png)
変更をチェックします。
![スクリーンショット 2014-12-29 15.23.36.png](https://qiita-image-store.s3.amazonaws.com/0/26668/b8515608-e965-514e-7c0e-17ef11be403c.png)
解像度を変更します。
![スクリーンショット 2014-12-30 22.06.12.png](https://qiita-image-store.s3.amazonaws.com/0/26668/14b20d17-b9dd-2387-3f0f-4d3f895c872a.png)
〘C#〙基礎

##フィールド変数のアクセス修飾子

| アクセス修飾子 |内容|
|:-----------|:------------|
| public | 制限なく、どこからでもアクセスすることが可能 | 
| ineternal | 同一のプログラム内からアクセスを許可する | 
| protected | フィールド定数を宣言した型（クラスまたは構造体）と、型から派生した方からのアクセスを許可 | 
| private | フィールド定数を宣言した型内からのアクセスだけを許可する | 
| protected　internal | protectedの範囲にinternalの範囲を加えたスコープを許可。フィールド定数を宣言した方とその方から派生した方に加え、同一のプログラム内からのアクセスを許可 | 

##visual　C#演算子の種類

| 演算子の種類 | 演算子 |
|:-----------|:------------|
| 代入演算子 | =　+=　-=　*=　/=　%=　&= |= ^| <<=　>>=　?? | 
| 算術演算子 | +　-　*　/　% | 
| 連結演算子 | + | 
| 比較演算子 | ==　!=　<　>　<=　>=　is　as | 
| 論理演算子 | &　|　^　!　~　&&　||　true　false | 
| シフト演算子 | <<　>> | 
| インクリメント | ++ | 
| デクリメント | -- |
google driveの特定のフォルダをlinux(centos)上で同期させる

gitでファイル連携は不慣れな人には学習コストがかかり過ぎるので普段から使っているgoogle driveで連携出来たほうが楽だと気付き、AWS EC2(AMI)上でgoogle driveの同期を取ることにしたメモ

### 依存ツールインストール
go-lang系が必要なので先に入れる

```shell-session
sudo yum install golang git mercurial
```

### 設定
```shell-session
mkdir $HOME/go
cat <<EOF >> ~/.bash_profile
export GOPATH=$HOME/go
export GOROOT=/usr/lib/golang
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
EOF
```

### drive連携ツールインストール
#### 旧
https://github.com/rakyll/drive

```shell-session
go get github.com/rakyll/drive/cmd/drive
```
#### 新
```shell-session
go get -u github.com/odeke-em/drive/cmd/drive
```

### 同期
#### pull
google drive上の フォルダA/フォルダB/フォルダC を同期する例

```shell-session
drive init drive-sample
# ここで認証が走るので出てきたURLをブラウザで開く
cd drive-sample
drive pull --no-prompt フォルダA/フォルダB/フォルダC
```
#### push
フォルダA/フォルダB/フォルダC/sample.txtを作ってdriveにuploadする例

```shell-session
drive push --no-prompt フォルダA/フォルダB/フォルダC/sample.txt
```


### driveコマンドのupdate
* 2015.05.31現在バージョンが0.2.2となっている
* 現在業務で使っているバージョンが0.0.7
* 流石にバージョンを上げておきたいが戻せるようにもしたい

#### 手順
* $GOPATH/src 以下にgit cloneされているので使いたいタグ(バージョン)でチェックアウトしてbuildをすれば好きなバージョンが使えるようになる

```shell-session
cd $GOPATH/src/github.com/odeke-em/drive
git checkout v0.0.8
cd cmd/drive
go get -x

drive version
drive version 0.0.8
```
grepでコマンドのオプションを検索したい場合は-wを使う

コマンドのオプションを`-h`で調べることが多いのですが、
こういうとき`-w`オプションが大活躍。

## -wオプション使わない場合

```bash:
$ grep --help | grep "\-o\>"
  -o, --only-matching       show only the part of a line matching PATTERN
```

もしくは`grep --help | grep "\<o\>"`か。

## -wオプションを使う場合

```bash:-oオプションを調べたい場合
$ grep --help | grep -w o
  -o, --only-matching       show only the part of a line matching PATTERN
```

```bash:-wオプションを調べたい場合
$ grep --help | grep -w w
  -w, --word-regexp         force PATTERN to match only whole words
```
Upgrade MongoDB v2.4.9 => 2.6.6


年末ですが MongoDB のバージョンを上げたので手順メモを残しておきます。

## Summary

MongoDB のバージョンアップ手順です。
バージョンによって手順は異なりますので、必ず公式ドキュメントとChangeLogを確認してください :octocat:

MongoDB は `Replica Set` 構成です。

## 環境

- MongoDB : v2.4.9
- OS : Arch Linux
- Package manager : pacman
- Service manager : systemd v217

## 手順

- SECONDARY -> PRIMARY の順で作業します

### Backup INDEX

作業前に最新のバックアップをとっておきましょう！

### Package update

```
pacman -Syu
```

### Set ulimit

`LimitNOFILE=64000` を追加する

```
vim /usr/lib/systemd/system/mongodb.service

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target

[Service]
User=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongodb.conf
# Add this line
LimitNOFILE=64000

[Install]
WantedBy=multi-user.target
```

### Check database (最初の１台だけ)

ref: http://docs.mongodb.org/manual/reference/method/db.upgradeCheckAllDBs/#db.upgradeCheckAllDBs

```
mongo admin
> db.auth('user', 'pass')
> 
> // slaveOkにしないとcheckできない！
> db.getMongo().setSlaveOk()
> db.upgradeCheckAllDBs()
...
true # true を確認する
```

### Step down primary (PRIMARYのみ)

```
mongo
> rs.stepDown();
```

### Daemon reload

```
systemctl daemon-reload
```

### mongodb restart

```
systemctl restart mongodb
```

### Upgrade User Authorization Data (PRIMARYのみ)

ref: http://docs.mongodb.org/manual/release-notes/2.6-upgrade-authorization/

```
db admin
db.auth('user', 'pass')
db.getSiblingDB("admin").runCommand({authSchemaUpgrade: 1 });
```

### 動作確認

実際にアプリケーションから接続して動作確認
サイボウズのカスタムアプリで、日付から現在の年齢を計算させる方法

　皆さんこんにちわ。岩舘電気の中の人、再びです。

　Iwate Developers Advent Calendar 2014 で Qiita に初投稿をさせていただきましたが、もう一本ネタを披露させていただきます。

　ビジネスアプリとして人気のあるサイボウズですが、サイボウズにはカスタムアプリという機能という名称の簡易データベースソフトが搭載されていて、DBの初歩的知識があれば簡単にデータベースが作成できてしまいます。中小企業では何でもかんでも Excel でデータを管理しがちですが、社員で情報を共有したい場合はデータベースに移した方が良い場合もあります。たとえば弊社では大量の図面を保管していますが、Excel で管理していた図面台帳をサイボウズのカスタムアプリに移しました。これによって検索性や一覧性が向上し、また読み書きの権限設定もアカウントごとに設定できるので、事故も未然に防ぐことができます。

　ただ、あくまで簡易DBアプリですので、本格的なことはできません。たとえば、カスタムアプリではリレーションの設定ができるものの、単純な内部結合しかできないようですし、またルックアップした（参照先の）データでソートをかけることが出来ないため、せっかくテーブル（カスタムアプリ）を正規化（分割）しても、結合の際に狙った結果が得られなかったりします。

　もっとも、こういった制限は、簡単さとのトレードオフの関係にあると言ってもよいでしょう。「粒度」という言葉がありますが、粒度の大きさと学習コストは、大雑把に言って反比例すると言えるかと思います。サイボウズのカスタムアプリはＩＴの初歩的知識を持った一般社員がデータベースを作成するのにちょうど良い粒度なのかもしれません。

　閑話休題、「簡易」なサイボウズのカスタムアプリですが、なんとどういうわけか Javascript を読み込んでカスタマイズすることも可能だということがわかりました。いきなり粒度が小さな話になってしまいますが、もしかしたらJavascriptを使ってイケてるアプリを作れるかもしれません。
　カスタムアプリの標準機能では、日付データ型に入れた誕生日から年齢を自動計算させることができないのですが、Javascript が使えるなら出来るだろう・・・ということで、さっそくやってみました。

　ちなみに中の人は Javascript は初学者なうえ、html を触ったのは Mosaic とか Netscape の時代の人なので、とりあえず「ノンプログラマのためのJavaScript」なんて本を買い、基礎を学習するところから始めました。とほほ。ちなみにこの本、買ってすぐコーヒーをこぼしてしまったのはここだけの内緒です。（コーヒーの染みもカスタマイズの一環です。ええ。）

　さて、「サイボウズ」「年齢」などのキーワードで検索してみると、やはりすでにやりたいことをやっている人がいるもので、次のサイトに目的のコードが見つかりました。
http://cybozu.kanshin.jp/keyword/751380

　車輪の再発明は不要、とばかりに、まずはここにあるスクリプトをコピペしてサイボウズに読み込ませてみます。しかしながら \_\_modules のところでUncaught reference errorが出てしまいます。おかしいなと思って\_\_modules について検索しても、どういうわけかまったく情報が出てこないのですが、おそらくはパッケージ版のサイボウズで管理者が使えるオブジェクトではないかという気がしています。クラウド版で使うには書き直さなくてはなりません。

　というわけで、書き直してみました。
(2015/02/12追記：DBView のみならず、アップデートや新規追加画面でも書き換えをしてしまっていました。修正が必要ですので少々お待ちください。)

```
$(document).ready(function () {

InnerCalculateAgeFromBirthday("record-value-12", 133, "歳");
InnerCalculateAgeFromBirthday("record-value-13", 133, "年");

	function InnerCalculateAgeFromBirthday(tdclass, app_num, suffix){
	//function InnerCalculateAgeFromBirthday(変換したい class, アプリケーションID, 接尾語)
		var did = $(':hidden[name="DID"]').val();
		console.log(did);
		
		if (did==app_num){

			var d=new Date();
			today=d.getFullYear()*10000+d.getMonth()*100+100+d.getDate();
			var $tdobj=$("td").each(function(){
				if(typeof(this)!="number"){
					if(this.getAttribute("className")==tdclass||this.getAttribute("class")==tdclass){
						var b=new Date(this.innerHTML);
						birthday=b.getFullYear()*10000+b.getMonth()*100+100+b.getDate();
						var age=Math.floor((today-birthday)/10000);
						this.innerHTML+=" ("+age+suffix+")";
					}
				}
			});
		}
	}
});
```

使い方は関数の中に書いてある通り、変換したい列の class、アプリケーションID番号、そして変換した数字の後に付ける添え字を与えてやります。実際に実行した結果がこちらになります。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/61220/6bdd4fa2-9575-6ac8-1879-55273f32ce8e.png)

無事うまく変換されましたね。これでより直観的にデータを閲覧することができます。

将来は西暦と和暦の変換もできるようにしたいですね。うまくいったら投稿したいと思います。
MySQLキャッシュのON/OFF設定コマンド

[前回](http://qiita.com/yousuke_arai/items/129be68fc196d71f2b07)の続きのようなものですが。。

◆設定コマンド
`set @@global.query_cache_type = 1;`

◆値の意味

```lang:「0」の場合
キャッシュOFF(キャッシュしない、キャッシュ結果を読まない)
```

```lang:「1」の場合
キャッシュなしオプションを付けない限りキャッシュする
※次のようなクエリだとキャッシュしない
「SELECT SQL_NO_CACHE id, vakue FROM table;」
```

```lang:「2」の場合
キャッシュありオプションを付けたときに限りキャッシュする
※次のようなクエリだとキャッシュする
「SELECT SQL_CACHE id, value FROM table;」
```
　

※またキャッシュに割り当てるメモリサイズが0になっている場合は実質無効なので設定が必要でした。

◆サイズ確認コマンド
`select @@global.query_cache_size;`

```
mysql> select @@global.query_cache_size;
+---------------------------+
| @@global.query_cache_size |
+---------------------------+
|                         0 |
+---------------------------+
1 row in set (0.00 sec)
```

◆サイズ設定コマンド
`set @@global.query_cache_size = 51200;`
※最低が40KBらしいので今回は50KBにしてみました。
Android 描画フロー

# View

android.view.View がすべてのビューの基底クラスになっており、次のようなコールフローで処理される

* View#draw
    * drawBackground
        * mBackground が設定されていれば描く
    * onDraw
        * サブクラスオーバーライド用
    * dispatchDraw
        * View では何もしない (ViewGroup でオーバーライドする)
    * fading edge 設定時にグラデーションをかける
    * onDrawScrollBars
        * 必要ならばスクロールバーを描く
    * mOverlay.getOverlayView().dispatchDraw

# ViewGroup

子供のビューを持つビュー (例えば ListView や LinearLayout) の基底クラス。dispatchDraw をオーバーライドして再帰的に子ビューを描画する

* dispatchDraw
    * animetionフラグが立っていたら、アニメーション処理
    * CLIP_TO_PADDING ならクリッピングを設定
    * 子ビューごとに drawChild
        * 子ビューの draw を呼ぶ

# AbsListView

* draw
    * super.draw
    * edge grow 処理
* dispatchDraw
    * CLIP_TO_PADDING ならクリッピングを設定
    * !mDrawSelectorOnTop なら drawSelector
    * super.dispatchDraw
    * mDrawSelectorOnTop なら drawSelector

# ListView

* dispatchDraw
    * divider 描画
    * super.dispatchDraw
tmuxを使用してみた。（初心者用語集）

# tmuxを使ってみた。
先輩に勧められて導入したターミナルマルチプレクサ「tmux」を導入したものの多機能すぎて全然使えてない・・・。改めて、勉強し始めたのでメモメモ。

# 環境
* Mac OSX 10.9.5
* homebrew 0.9.5

# tmux install
今回は、Mac OSXへHomeberwで導入する。自家醸造とっても便利で助かります。
（*Homebrewの導入方法は別途調べてね。）

```
$ brew install tmux
```

# 設定ファイルについて
tmuxの設定ファイルは、ホームディレクトリに.tmux.confで作成する。
書き方がなかなか覚えられない・・・。用語と合わせて、簡単に説明します。

# 用語について
tmuxの設定ファイルを編集する際に出てくる用語について、ざっくり説明。
違ってたらコメントお願いします。m(_ _)m


#### プレフィックスキー（prefix）
tmuxにある様々な機能のショートカットを使用する際に最初に実行するコマンド。
prefix実行後に機能に対応するショートカットキーを押下することで多機能のショートカットを実現する。

```.tmux.conf(default)
set -g prefix C-b
```
Ctrl + b でプレフィックスを実行します。

#### キーバインド（bind）
プレフィックスから派生するショートカットのこと。

```.tmux.conf(example)
bind r source-file ~/.tmux.conf \; display "Reloaded!"
```
Ctrl + b でプレフィックスを実行してすぐに r を入力することで~/.tmux.confをリロードします。

#### アタッチ（attach）
クライアントのターミナルツールとtmuxでセッションを繋ぐこと。

```
$ tmux
```
tmuxコマンドでアタッチします。
また、デタッチしたセッションを確認して繋ぎ直す時は以下のようになります。

```
$ tmux ls
0: 1 windows (created Tue Dec 30 21:37:43 2014) [204x49]
1: 1 windows (created Tue Dec 30 21:38:00 2014) [204x49]
2: 1 windows (created Tue Dec 30 21:38:08 2014) [204x49]
$ tmux a -t 0
```
これでデタッチしたセッションを選んで繋ぐことができます。

#### デタッチ（detach）
クライアントのターミナルツールとtmuxのセッションを閉じること。
デタッチしたtmuxのセッションは、ターミナル上では閉じてしまうけれど、バックグラウンドでは生きているので、再度アタッチすることでデタッチした時の状態からスタートできます。
開発別でペイン（ウィンド）を分けて置きたいときに便利です。

Ctrl + d でデタッチできます。

まだ分からないことが多いのでちょいちょい更新したいです。
個人的にわかりやすいSQLの書き方

最初は1行で書いていたんですが、内容が複雑になっていくにつれ煩雑になるので
どう書けば分かりやすいのかを自分なりにまとめてみます。

***

* ひよっこなのでできる限り分かりやすいのが良い
* インデントの幅は統一したい
* 分かりやすいからといって、SQL一文でやたらと行数取るのはなんとなく嫌

…で、書き進めると以下のようになりました。

* 予約語・関数などは大文字
* 主に、それぞれの句で行を分ける
* 各句の内容が長くなってきたら、インデントしつつ複数行にしてもOK
* ANDやらORやらが増えて（）が分かりにくくなったら、インデントしつつ複数行にしてもOK

```mysql:てきとうなサンプル
SELECT b.value
FROM table_a AS a
INNER JOIN table_b AS b ON b.value = a.value1
LEFT JOIN table_c AS c ON c.value1 = 'hoge1' AND c.value2 = 'hoge2' AND c.value3 = 0 AND c.value4 = b.value
LEFT JOIN table_d AS d ON d.value1 = 'hoge1' AND d.value2 = 'hoge2' AND d.value3 = 0 AND d.value4 = b.value
WHERE a.value2 = 'hogehoge'
  AND b.status = 1
  AND (
    (c.date IS NULL AND ADDDATE(d.date, INTERVAL 86399 SECOND) > NOW())
    OR (c.date IS NULL AND d.date IS NULL)
    OR ADDDATE(c.date, INTERVAL 86399 SECOND) > NOW()
  )
LIMIT 10
```

上記のようにLEFT JOIN～が長い場合は、そこも改行しても良いかもしれません。

```mysql:てきとうなサンプル（LEFT_JOIN複数行版）
SELECT b.value
FROM table_a AS a
INNER JOIN table_b AS b ON b.value = a.value1
LEFT JOIN table_c AS c
  ON c.value1 = 'hoge1' AND c.value2 = 'hoge2' AND c.value3 = 0 AND c.value4 = b.value
LEFT JOIN table_d AS d
  ON d.value1 = 'hoge1' AND d.value2 = 'hoge2' AND d.value3 = 0 AND d.value4 = b.value
WHERE a.value2 = 'hogehoge'
  AND b.status = 1
  AND (
    (c.date IS NULL AND ADDDATE(d.date, INTERVAL 86399 SECOND) > NOW())
    OR (c.date IS NULL AND d.date IS NULL)
    OR ADDDATE(c.date, INTERVAL 86399 SECOND) > NOW()
  )
LIMIT 10
```

> 分かりやすいからといって、SQL一文でやたらと行数取るのはなんとなく嫌

こことの兼ね合いが徐々に苦しくなっていますが、
個人的にはこの程度の区切り方が好みです。
Herokuで何か(Node.jsとか)とPhantomJSをつかう方法

#### なぜ使いたいか

AngularJSなどフロント側のrouteで運用していると、renderされたviewをSEOなどのボットに返したい！などPhantomJSの出番がやってきます。PhantomJSをHerokuにもサクッと入れる方法を紹介します。

#### どうやるか

PhantomJSのbuildpackを使えばいいんですが、Node.jsやRubyなども使いたいと思うので、複数のbuildpackを扱える[heroku/heroku-buildpack-multi](https://github.com/heroku/heroku-buildpack-multi)を使います。

herokuのconfigにbuildpack使うよって登録します。

```
heroku config:add BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-multi.git
```

どのbuildpackを使うかを`.buildpacks`で指定します。

- Node.jsの場合

```:.buildpacks
https://github.com/heroku/heroku-buildpack-nodejs.git  
https://github.com/stomita/heroku-buildpack-phantomjs.git
```

- Rubyの場合

```:.buildpacks
https://github.com/heroku/heroku-buildpack-ruby.git
https://github.com/stomita/heroku-buildpack-phantomjs.git
```

#### Node.jsの時の補足

gruntなどでbuildしている場合は`.buildpacks`もpushされるようにbuildに含めてあげましょう。

また[buildpack-nodejs](https://github.com/heroku/heroku-buildpack-nodejs)を使う使う場合はpackage.jsonで指定したnode.jsのversionを合わせてあげましょう。

```:package.json
"engines": {
  "node": "0.10.x",
  "npm": "2.x"
},
```

このへんは[buildpack-nodejs](https://github.com/heroku/heroku-buildpack-nodejs)のREAD.MEに書いてあります。
自分はここのversionが違って`heroku push`の以下のタイミングで止まってしまいました。

```
=====> Downloading Buildpack: https://github.com/heroku/heroku-buildpack-nodejs.git
```

以上、SEOやOGPにも対応した素敵なアプリケーションを作ってください。
Apacheのログの日本語をデコードする

Apacheのログは日本語がエスケープされておりそのまま読むことが出来ません。

次のコマンドでデコードできます。また、access_logとerror_logとでエスケープが違うので注意です。

```:access_log
tail -f access_log | perl -ne 'use URI::Escape; print uri_unescape($_);'
```

```:error_log
tail -f error_log | perl -nle 's/\\x(..)/pack("C",hex($1))/eg;print $_'
```

`tail -f`はログの末尾を常に表示し続けるコマンドです。ログが追加されると自動で追加された行が表示されます。
AndroidAnnotationsでよく利用するアノテーション


# AndroidAnnotations

AndroidAnnotationsはAndroidの開発でよく記述するお決まりの処理を
アノテーションを利用することで自動的に生成してくれるライブラリ

[公式サイト](http://androidannotations.org/)

# アノテーション一覧

## @EActivity, @EFragment

Activity(Fragment)につけると指定したレイアウトファイルを読み込んでくれる
またAndroidAnnotationsのアノテーションを利用するにはActivity, Fragmentにこのアノテーションをつける必要がある

```java
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {
}
```

## @EBean

Activity, Fragment以外のクラスでAndroidAnnotationsのアノテーションを利用するときにつける
このアノテーションをつけたクラスは同じく@EBeanをつけることで取得できる

※ このアノテーションをつけたクラスは、引数なしまたはContextを受け取るだけのコンストラクタを1つしか定義できない

```java
@EBean
public class MyClass {
}

@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {
  @EBean
  MyClass myClass;
}
```

## @ViewById

Viewの変数の宣言につけるとfindViewByIdを自動的に行ってくれる
下記の例では 
button = findViewById(R.id.button)
を自動的に行ってくれる

```java
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

  @ViewById(R.id.button)
  Button button;
}
```

## @Click, @LongClick

メソッドにつけると、指定したViewがクリックされたときのそのメソッドを呼ぶようになる

```java
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

  @ViewById(R.id.button)
  Button button;

  @Click(R.id.button)
  public void doProcessing(View view) {}
}

```

## @AfterViews, @AfterInject

メソッドにつけるとレイアウトの読み込みやfindViewByIdなどが終わった後にそのメソッドが実行される

@EBeanをつけたクラスの場合は@AfterInjectを利用する


```java
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

  @AfterViews
  public void afterViews() {}

}
```

## @Extra, @FragmentArg

プロパティ変数の宣言につけて、intentからデータを取得する
intent.putExtra("key1", "text1")
と設定した上で画面を遷移すると下記のようにしてデータを取得することができる
Fragmentの場合はsetArguments()で渡したデータが取得できる

```java
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {
  
  @Extra(value="key1")
  String text1; 

  @Extra(value="key2")
  String text2 = "default text"; // key2が見つからなければ"default text"が入る"

}
```

## @SystemService

getSystemServiceで取得できる各種インスタンスを取得する
変数の型を見て自動的に取得するインスタンスを判別してくれるので特に引数の指定などはない

```java
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {
  
  @SystemService
  LayoutInflater inflater;

}
```

## @StringRes, @StringArrayRes

getString(R.string.text), getStringArray(R.array.texts)を自動でやってくれる。


```java
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {
  
  @StringRes(R.string.text)
  String text;

  @StringArrayRes(R.array.texts)
  String[] texts;

}
```

## @UiThread

このアノテーションをつけたメソッドはUIスレッド上で実行されるようになる

```
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {
  
  @UiThread
  public void uiThreadProcessing(){}

}
```

下記のようにHandlerを通じて実行されるようにコードが生成される

```java
handler.post(new Runnable(){
  @Override
  public void run(){
    uiThreadProcessing();
  }
});
```

## @Background

このアノテーションをつけたメソッドはバックグラウンドで実行されるようになる

```
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {
  
  @Background
  public void backgroundProcessing(){}

}
```
Calabash for Android 導入

from. [Yukiの枝折 - Android:Calabash for Android 導入](http://yuki312.blogspot.jp/2014/12/androidcalabash-for-android.html)

はじめに
---

Calabash for Androidは, Ruby製のビヘイビア駆動開発(BDD:Behaviour Driven Development)ツール Cucumberを使ってAndroidアプリをテストできるライブラリ. 
Rubyのパッケージ管理システム`gem`でインストールできる. 

今回の確認環境は次の通り.

 - Mac OSX Mavericks 10.9.5
 - RVM version 1.26.7
 - Ruby 2.2.0p0

準備
---

Rubyの環境を整えるためにHomebrewをインストールする

```bash
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

Homebrewが正しくインストールされたかをチェック. エラーが出た場合はメッセージに従う

```bash
brew doctor
```

RVMをインストールする

```bash
\curl -sSL https://get.rvm.io | bash -s stable
```

`PATH`を設定するために.bashをリロード

```bash
source ~/.bash_profile
```

RVMのバージョンを確認

```bash
rvm version
```

Rubyの最新バージョンを確認

```bash
rvm list known
```

Ruvyの最新バージョンをインストールし, デフォルトに設定する. 

```bash
rvm install ruby-2.2.0 --default
```

`PATH`を設定するために.bashをリロード

```bash
source ~/.bash_profile
```

Rubyのバージョンを確認

```bash
ruby -v
```

Rubyのインストールロケーションを確認

```bash
which ruby
```

Calabash for Androidのインストール

```bash
gem install calabash-android
```

AndroidSDKのパスを`ANDROID_HOME`環境変数で定義

```bash
// .bash_profileに下記を追記
export ANDROID_HOME=[AndroidSDKへのパス]
```

`PATH`を設定するために.bashをリロード

```bash
source ~/.bash_profile
```

`ANDROID_HOME`が正しく設定できているか確認

```bash
echo $ANDROID_HOME
```

テスト対象のAndroidプロジェクトに移動. 
AndroidManifest.xmlがあるディレクトリに移動し下記コマンドを実行. 

```bash
calabash-android gen
```

`gen`によりcucumberのスケルトンが作成される(作成される各種ファイルについては後述)

calabashテスト実行時にインストールされるテストアプリに付与する署名を指定する. 
この署名はテスト対象のアプリと同じ署名とする. 署名の指定は次のコマンドで行う. 

```bash
# 実行するとカレントディレクトリに.calabash_settingファイルが生成される
calabash-android setup
```

テストを実行するには同階層で下記コマンドを実行する. 

```bash
calabash-android run [テスト対象のapk]
```

実行するとテストが実行される. 
cucumberが途中で上手く動作しない場合は`-v`オプションを付与することで詳細なログが出力される. 

> **NOTE**
> `calabash-android gen`, `calabash-android setup`, `calabash-android run`はAndroidManifest.xmlと同階層で実行する. 

 


参考
---

 - [Calabash for Android](https://github.com/calabash/calabash-android)
 - [Calabash-AndroidでBDDしようぜ!](http://www.slideshare.net/chariderpato/calabashbdd)
Railsのデフォルトで生成されるGemfileのバージョンごとの違いが知りたいとき

http://railsdiff.org/ を使うといいそうです。

### 参考

ruby - list of default Gemfiles according to versions of rails - Stack Overflow http://stackoverflow.com/questions/27702035/list-of-default-gemfiles-according-to-versions-of-rails
[JavaScript] 暗黙の型変換について


次のコードの出力結果について。

```js
1 + true
```

普通はエラーになると思う。でもJavaScriptは以下の結果を返す・

```js
2
```
!?

## 暗黙の型変換について
true, falseのようなブール式と数値演算に何で互換性があるのか・・・。普通はエラーになるところだが、JavaScriptはエラーを出す代わりに、暗黙の型変換に従って、我々が出力したい型に値を強制させる。

数と文字列を組み合わせたら、文字列は優先されるのも前述の強制が絡んでいる。

暗黙の型変換は悪いことだらけではなく、ユーザーからの入力を自動的に変換してくれる、などメリットもある。予期せぬ結果が出力された時に、暗黙の型変換に注意をして無駄な作業を無くそう！！！！
Nodeやio.jsのpreバージョンをビルドしてnvmから使う

```
git clone git@github.com:joyent/node.git
cd node
./configure --prefix=~/.nvm/versions/v0.13.0-pre
make -j10
make install
```

```
git clone git@github.com:iojs/io.js.git
cd io.js
./configure --prefix=~/.nvm/v0.11.15-pre
make -j10
make install
```

nodeの方は現在のmasterブランチをビルドすると`v0.13.0-pre`になり、io.jsは`v0.11.15-pre`になる。このバージョン番号をうまくあわせないと認識できないっぽい。

https://github.com/creationix/nvm/blob/master/nvm.sh#L161
このへん読むとv0.12.0を境に配置ディレクトリが変わるっぽいので配置先もあわせた。

でもnodeは`v0.12`ブランチのが進んでいる?のでこっちのがいいかもしれない。
https://github.com/joyent/node/commits/v0.12

```
$ nvm ls
    v0.10.31
    v0.11.14
    v0.11.15-pre
->  v0.13.0-pre
    system
```

```Node.js
$ nvm use v0.13.0-pre
$ node --v8-options | grep harmony
  --harmony_typeof (enable harmony semantics for typeof)
  --harmony_scoping (enable harmony block scoping)
  --harmony_modules (enable harmony modules (implies block scoping))
  --harmony_symbols (enable harmony symbols (a.k.a. private names))
  --harmony_proxies (enable harmony proxies)
  --harmony_collections (enable harmony collections (sets, maps))
  --harmony_generators (enable harmony generators)
  --harmony_iteration (enable harmony iteration (for-of))
  --harmony_numeric_literals (enable harmony numeric literals (0o77, 0b11))
  --harmony_strings (enable harmony string)
  --harmony_arrays (enable harmony arrays)
  --harmony_maths (enable harmony math functions)
  --harmony_promises ((dummy flag, has no effect))
  --harmony (enable all harmony features (except typeof))
```

```io.js
$ nvm use v0.11.15-pre
$ node --v8-options | grep harmony
  --es_staging (enable all completed harmony features)
  --harmony (enable all completed harmony features)
  --harmony_scoping (enable "harmony block scoping" (in progress))
  --harmony_modules (enable "harmony modules (implies block scoping)" (in progress))
  --harmony_arrays (enable "harmony array methods" (in progress))
  --harmony_classes (enable "harmony classes (implies block scoping & object literal extension)" (in progress))
  --harmony_object_literals (enable "harmony object literal extensions" (in progress))
  --harmony_regexps (enable "harmony regular expression extensions" (in progress))
  --harmony_arrow_functions (enable "harmony arrow functions" (in progress))
  --harmony_tostring (enable "harmony toString" (in progress))
  --harmony_proxies (enable "harmony proxies" (in progress))
  --harmony_strings (enable "harmony string methods")
```

`--harmony_classes` `--harmony_arrow_functions`オプションなどがio.jsの方がV8が新しいので入っていることがわかる。

見分けつかなくなるのでaliasはっておくのがよさそう

```
nvm alias iojs v0.11.15-pre
```
オブジェクト指向vs関数型プログラミングの壮絶な宗教戦争っていつしてたの……？


なんか荒れてますが、私も一言いいたいです！！
オブジェクト指向がそうであるように、関数型も銀の弾丸ではありません！！！

-

#参照透過性はすばらしい

[この記事](http://qiita.com/kenokabe/items/9c650ec8bcb1418c596d)をぼやーんと眺めてました。

高精度煽り除去フィルタを通して読むと、関数型のアプローチがよい、と言う話ですね。

実際コードを書いてると、自分の書いたコードに関するバグは、体感、８割くらいが副作用に起因するものです。

副作用があると、呼び出し元が考慮すべきパターンが増えます。Mの状態を持つオブジェクトと、Nの状態を持つオブジェクトをつなぐと、MxNのパターンになるわけです。これはつなぐたびに積算されるため、爆発します。

副作用が無い場合、状態数は1なわけです。1x1は？1です！！よって、状態の組み合わせ爆発は起きません。考慮すべきは、入力値のパターンだけで十分なわけです。

他にもいろいろメリットが！！
すばらしき参照透過性！！関数世界最高ですね！！！

#でも話はここで終わらない

ですが、実際の開発では、ここで話は終わりません。

## 作用だけではプログラムは組めません！！

論理だけでは現実世界に作用を及ぼせません。
画面の表示、ディスクの書き込み、サウンドのプレイバック、etc...、プログラムが意味を持つためには、 **必ず副作用が必要になります**。

関数型世界では、副作用は外に追い出すことで、すばらしき関数型世界を守ります。

要するに、この二次元配列とx,yの構造体を返したら、x,yの位置に二次元配列で表現された画像を表示する事を、 **関数世界外** が行ってくれるのです。

よさそうです。ですが、これは暗黙の前提を一つ置いています。 **必要な副作用がすべて提供されている** という・・・。

これは無茶な前提です。たとえばLeap Motionを使ったCooooolなゲームを作りたい、という場合、関数型世界で提供されてないと手も足も出ません。
おっとOpenGLもOpenALも、GLFWも無いかもしれません！！このようなライブラリをどうにかして呼ぶ必要があるわけです。そこで、ffiなりなんなり、関数型世界外の力を借りる必要があります。

そうです、 **無いなら作らないといけないのです。** だってエンジニアだもん！！
ですが、関数型世界で提供されていない副作用を扱うためには、いらぬ苦労を強いられるのです。

## 作用だけでは時間変化を扱えません！！
前FRPっていってたじゃないって？
そうですが、これも上とかぶるのです。

FRPなんですが、関数のトリガは関数世界外から行う必要があるわけです。 **関数世界からは起動できません。** 
すべての可能なトリガが提供されていたらいいですが……

そうです、 **無いなら作らないといけないのです。** だってエンジニアだもん！！
ですが、関数型世界で提供されていない副作用を扱うためには、いらぬ苦労を強いられるのです。
（再び！）



#関数型世界が世界を取るためには？

関数型世界では、副作用は特別なものです。これを関数世界の「外側」とします。

その外側をエンジニアが記述する必要がなくなった時、関数型世界の理想郷はひらかれるのではないでしょうか。

#余談

##関数型言語で組めばすぐ並列化できるという幻想

なんでこれがまかり通ってるのか疑問です。

関数型言語でも、並列化を行うためには思考コストを払う必要があります。
これに関しては単純な例を挙げれば十分かと思います。

* fの計算結果にgが依存していると、fが終了しないとgを計算できない（暗黙のうちに正格評価を前提にしてたため、書き直しました）

計算結果に依存しないように、注意深くアルゴリズムを選択する必要があるのです。
その思考コストが相対的に安くなるのは間違いないですが、無視できるほど少なくはなりません。
こと並列化に関しては、関数型言語よりも、ストリーム指向の言語の登場が待たれます。


##ぼくのかんがえたさいきょうのぱらだいむ
オブジェクトは問題を分割し、副作用を扱うのが得意です。
関数は論理記述に優れています。
手続きは、時間変化を伴う処理を記述できます。

関数で書いたオブジェクトを、手続きで指示を与える。これが理想ではないでしょうか。
プログラミング言語も、実際そのように動いてるように見えます。

* Java 手続き、オブジェクト世界に関数型を導入(lambda)
* JavaScript 関数型、オブジェクト世界に手続きを導入(yield)

## 結局React.jsって？
React.js触りました！！！
React.js、というよりVirtual DOMのすごさは、関数型vsオブジェクト指向の文脈でとらえるとわかり辛いです。
なので、誰もが納得する、以下の事実を利用します。

* **差分更新は実行速度は速いけどエンバグしやすい**
* **全更新はバグりにくいけど実行速度が遅い**

な　ら　ば　！！

* React.jsがVirtual DOM -> DOMの差分更新を受け持ってあげるから、君たちは安心してVirtual DOMを全更新してね！！

です！
Mac ユーザのための親指付近（かな・変換・無変換）のキーバインドを簡単に変更して Windows での文字入力を快適にする

## はじめに

会社PCが Windows(ThinkPad X1 Carbon) , 自分PCが Mac(MBA) なので、
半角全角切り替えのキーが混乱するし、
Windows の「半角全角」キーは遠くて使いにくい！！！
って会社でぼやいてたら、
先輩がいいこと教えてくれたので、メモっとく。

「無変換」「変換」のキーって使わへんやん。。。ということで、
Mac での作業っぽく、親指で半角全角を変更できるようにしてみた。

キーバインド設定するアプリ入れてたから、それでやろうと思ったら、
Google日本語入力の設定で簡単に切り替えられるらしい。
なんとも便利な世の中になったであるよ。

## 簡単設定方法

タスクバーのGoogle日本語入力のツールをクリックして、

```
ツール -> プロパティ
```

を選択する。すると、「一般」のタブが表示されます。
その表示の下方にある、

```
キー設定
　キー設定の選択 -> 編集
```

を選択します。

![000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/62698/c6fa3cc6-f690-55ea-5591-6a5a5398e875.jpeg)

ここから、該当する Key を設定していきます。

| モード | 入力キー | 変更前コマンド | 変更後コマンド |
|:-----------:|:---------|:----------------------|:------------:|
| 変換前入力中 | Henkan   | 変換 | IMEを有効化 |
| 変換前入力中 | Hiragana | ひらがなに入力切替 | IMEを有効化 |
| 変換前入力中 | Katakana | 全角カタカナに入力切替   | IMEを有効化 |
| 変換前入力中 | Muhenkan | ひらがな・カタカナを切替 | IMEを無効化 |

![000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/62698/ebbdf322-8e86-4c16-d96a-9fbc48692abb.jpeg)

![000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/62698/a9b9d9bc-69cf-76ba-adfe-2cfcdb1abba1.jpeg)


| モード | 入力キー | 変更前コマンド | 変更後コマンド |
|:-----------:|:---------|:----------------------|:------------:|
| 入力文字なし | Henkan   | 再変換 | IMEを有効化 |
| 入力文字なし | Hiragana | ひらがなに入力切替 | IMEを有効化 |
| 入力文字なし | Katakana | 全角カタカナに入力切替   | IMEを有効化 |
| 入力文字なし | Muhenkan | 次のかな文字種に入力切替 | IMEを無効化 |

![000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/62698/f38b41cf-17de-2b5d-dd39-046e04dddead.jpeg)

| モード | 入力キー | 変更前コマンド | 変更後コマンド |
|:-------:|:---------|:----------------------|:------------:|
| 直接入力 | Henkan   | 再変換 | IMEを有効化 |
| 直接入力 | Hiragana | IMEを有効化 | IMEを有効化 |
| 直接入力 | Katakana | IMEを有効化 | IMEを有効化 |

![000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/62698/a5fe9a30-6fd2-7333-97ef-8e4158c04a8c.jpeg)

すべての設定が完了したら、「` OK `」でキー設定を閉じた後、

![000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/62698/202f644f-baf4-5d69-2979-e876b03c9ea0.jpeg)

キー設定の選択の、左のドロップダウンリストが自動的に「カスタム」に変わっているので、

```
適用 -> OK
```

上記にて設定完了です。次回アプリケーション起動時より反映されます。

超快適になった！！！！！
なんでもっとはやくやらなかったんだろう・・・。
こういう Hack もすごく大事だな・・・と思った出来事であったよ。

ちゃんちゃん。

以上
A/B TEST with optimizely.com


## Optimizely.com?
https://www.optimizely.com
https://www.optimizely.jp

Enjoy the Benefits of Testing with Optimizely

- Improve conversions, increase engagement, and drive revenue
- Get started instantly
- Free—no credit card required


## Tutorial A/B TEST
- login optimizely.com or optimizely.jp
- new experiment
- add goal
- add javascript into your website


## Analyze
- login optimizely.com or optimizely.jp


## How to Test
http://blog.optimizely.com/2013/04/30/71-things-to-ab-test/
Backbone.MarionetteアプリをBrowserifyでバンドルする(Gulp編）


Backbone.MarionetteとHandlebarsを使ったアプリをBrowserifyでバンドルするメモです。

フレームワークやライブラリとアプリを分離してバンドルします。

gulpfileはCoffeeScriptで記述しています。

## package.json

### browserifyのトランスフォームの指定

Handelbarsのトランスフォームを指定します。
タスクで設定できそうなのに、package.jsonで指定しないと動作しませんでした。
私が何か間違っているかもです。

```
  "browserify": {
    "transform": [
      "hbsfy"
    ]
  }
```

### フレームワーク

    "jquery": "~2.1.1",
    "underscore": "~1.7.0",
    "backbone": "~1.1.2",
    "backbone.marionette": "~2.3.0",
    "handlebars": "^2.0.0"

### Gulp

    "gulp": "^3.8.10",
    "coffee-script": "^1.8.0",
    "gulp-coffee": "^2.2.0",
    "gulp-rename": "^1.2.0",
    "vinyl-source-stream": "^1.0.0"
    "browserify": "^8.0.2",
    "hbsfy": "^2.2.1",

## gulpfile.coffee

vendor.jsには、jquery,underscore,backbone,backbone.marionette,handlebarsをバンドルします。
app.jsにはアプリケーションとhandlebarsのテンプレートをバンドルします。

browserifyのバンドルを分離するためにrequireとexternalを使っています。
requireはaliasの設定も兼ねています。

```javascript:browserifyタスク

dir =
  src: "./assets"
  hbs: "./template"
  dst: "./public/assets"

gulp.task 'vendor.js', ->
  browserify
    entries: ["#{dir.src}/js/vendor.js"]
    require: [
      'jquery'
      'underscore'
      'backbone'
      'backbone.marionette'
      'handlebars'
    ]
  .bundle()
  .pipe(source "vendor.js")
  .pipe(gulp.dest("#{dir.dst}/js"))

gulp.task 'app.js', ->
  browserify
    entries: [
      "#{dir.src}/js/boot.js"
      "#{dir.src}/js/app.js"
      "#{dir.hbs}/template1.hbs"
      "#{dir.hbs}/template2.hbs"
    ]
  .require("#{dir.src}/js/app.js", {expose: 'nzkc/app'})
  .require("#{dir.hbs}/template1.hbs", {expose: 'app/template/template1'})
  .require("#{dir.hbs}/template2.hbs", {expose: 'app/template/template2'})
  .external([
    'jquery'
    'underscore'
    'backbone'
    'backbone.marionette'
    'handlebars'
  ])
  .bundle()
  .pipe(source "app.js")
  .pipe(gulp.dest("#{dir.dst}/js"))

gulp.task 'browserify', ['vendor.js', 'app.js']


```

### vendor.js

vendor.jsは以下のとおりです。

```
var Backbone = require('backbone');
Backbone.$ = require('jquery');
require('backbone.marionette');
```

Gruntより簡単に書けて、速いですね。
いくつものフィルタを通すことが多いですから、pipeは助かります。

各ファイルの指定を一つずつやっているところは改善したいところです。

gulp-browserifyはblacklistedされて、アップデートも止まっていますが、直接browserifyを使えば、困ることはありません。むしろ、細かなオプションが利用できるので、そのまま使う方がよさそうです。
Backbone.MarionetteアプリをBrowserifyでバンドルする(Grunt編）


Backbone.MarionetteとHandlebarsを使ったアプリをBrowserifyでバンドルするメモです。

フレームワークやライブラリとアプリを分離してバンドルします。

GruntfileはCoffeeScriptで記述しています。

## package.json

### フレームワーク

    "jquery": "~2.1.1",
    "underscore": "~1.7.0",
    "backbone": "~1.1.2",
    "backbone.marionette": "~2.3.0",
    "handlebars": "^2.0.0"

### Grunt

    "grunt": "~0.4.5",
    "browserify": "^8.0.2",
    "grunt-browserify": "~3.2.1",
    "remapify": "^1.3.0",
    "hbsfy": "^2.2.1",

## Gruntfile.coffee

vendor.jsには、jquery,underscore,backbone,backbone.marionette,handlebarsをバンドルします。
app.jsにはアプリケーションとhandlebarsのテンプレートをバンドルします。

```javascript:browserifyタスク

browserify:
options:
  preBundleCB: (b) ->
    b.plugin remapify, [
      {
        cwd: "./assets/js"
        src: "*.js"
        expose: "app"
      }
    ]

app:
  files:
    "<%= dir.dst %>/js/app.js": [
    "<%= dir.src %>/js/*.js"
  ]

  options:
    transform: ["hbsfy"]
    ignore: ["<%= dir.src %>/js/vendor.js"]
    external: [
      "jquery"
      "underscore"
      "backbone"
      "backbone.marionette"
      "handlebars"
    ]
    alias: [
      "<%= dir.hbs %>/template1.hbs:app/template/template1"
      "<%= dir.hbs %>/template2.hbs:app/template/template2"
    ]

vendor:
  files:
    "<%= dir.dst %>/js/vendor.js": ["<%= dir.src %>/js/vendor.js"]

  options:
    alias: [
      "jquery"
      "underscore"
      "backbone"
      "backbone.marionette"
      "handlebars"
    ]

```

### vendor.js

vendor.jsは以下のとおりです。

```
var Backbone = require('backbone');
Backbone.$ = require('jquery');
require('backbone.marionette');
```

## マッピングとエイリアス

相対パスでrequireのパスを記述するのが面倒なので、マッピングとエイリアスを利用します。

grunt-browserifyの2.x以前ではaliasMappingが使えたのですが、今では（3.2.1）使えなくなってしまいました。2.x以降で同様なことを行うには、remapifyを利用すればできるようですが、思ったように動作しませんでした。

https://github.com/jmreidy/grunt-browserify

```
A note on alias mappings, which was a functionality pre 2.0
that was removed: its behavior can be reproduced with @joeybaker's remapify plugin,
as demonstrated in the code below:
```

具体的には、以下のようにbrowserifyタスクの共通optionsでremapifyにマッピング情報（.jsと.hbs）を設定したいのですが、引数のマッピング情報を二つ以上渡すと、"Fatal error: Cannot read property '1' of null"となります。
これも微妙でcwdで指定したパスにファイルが存在しなければ、とりあえずエラーは回避できるという状況です。

```
remapify = require 'remapify'

browserify:
  options:
    preBundleCB: (b) ->
      b.plugin remapify, [
        {
          cwd: "./assets/js"
          src: "*.js"
          expose: "app"
        }
        {
          cwd: "./template"
          src: "*.hbs"
          expose: "app/template"
        }
      ]
```

仕方なく、hbsファイルに関してはaliasを併用して、動作するようにしましたが、ここは改善したいところです。

これで動作していますが、ただしくバンドルを分離しているのか、ちょっと不安です。Gulpでもバンドルしたのですが、出力された内容が微妙に違うので自信ないです。