OmniAICreator/Qiita-1.07M huggingface dataset:
[Rails]submitタグにつけておきたいdisable_withオプション


ミニネタです。でも結構便利。

データのpostに時間かかると動いてるのかどうかわからなくてボタン連打しちゃうときある。そういった場合に「送信中...」など分かりやすい文言に差し替えてかつクリック禁止にしてくれる。

```erb
<%= form_for @post do |f| %>
  ...
  <%= f.submit "送信する", data: { disable_with: "送信中..." } %>
<% end %>
```

これだけなので便利。

[追記]remote: trueしてる場合にはちょっとコツがいるようです
http://d.hatena.ne.jp/zariganitosh/20070623/1182551690
DjangoでAngularJSを使うときにCSRF Protectionを解決する方法


## 概要

Djangoで標準のViewや[Django REST framework](http://www.django-rest-framework.org/)などで作成したエンドポイントに対して、AngularJSの`HttpProvider`でpostすると、403エラーが返ってくる。

```javascript
$http.post('/api/entries', {'title': '日記', 'body': '今日はいい天気です'})
```

### Response

```json
{detail: "CSRF Failed: CSRF token missing or incorrect."}
```

## 原因

これは、AngularJSを使っていることはあまり関係なく、DjangoのCSRF Protectionを上手く回避できていないのが原因。

CSRF Tokenを格納するRequest Headerの値が、AngularJSがデフォルトで使用する値と、Djangoが認識する値で違っているのに由来しているらしい。

以下のドキュメントを読むと、Djangoでは、Ajaxリクエストをするときに、`csrftoken`の値を`X-CSRFToken`というヘッダ名で送信しないといけない。

[Cross Site Request Forgery protection | Django documentation | Django](https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax)



## 解決策

AngularJSの`HTTPProvider`には、CSRF Protectionの挙動を変更するオプションが用意されており、これを指定してあげると、CSRF Tokenを送る際のヘッダ名や、参照するcookieのキーを変更できる。

[AngularJS: API: $http](https://docs.angularjs.org/api/ng/service/$http#cross-site-request-forgery-xsrf-protection)

Django向けの設定を行うには以下のように設定してあげると良い。

```javascript
var myApp = angular.module('myApp', []).config(function($httpProvider) {
	$httpProvider.defaults.xsrfCookieName = 'csrftoken'
	$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'
});
```

これで、特に何もせずとも、AngularJSが自動的に`csrftoken`を解釈して送信してくれる。めでたい。

## 余談

DjangoでAngularJSを使うにはもう一ヶ所ハマりどころがあって、AngularJSの変数展開がDjangoのテンプレートエンジンと競合しているため、デフォルトでは変数展開を行うことができない。

下記を参照にシンボルを変更すると幸せになれる。

[AngularJS と jinja2 の変数スコープの競合を解決する方法 - Qiita](http://qiita.com/naoiwata/items/61dd023355c7759a68ac)
Knockout.jsでモデル間のデータ共有を行う

ViewModel間のデータ共有や、Knockoutの外の世界とのデータやりとりについて、knockout-postboxを利用する方法についてまとめました。

# knockout-postboxを利用したデータ共有

## knockout-postboxとは
[knockout-postbox](https://github.com/rniemeyer/knockout-postbox)は、Knockout.jsのcommiterであり、ほぼ公式ブログな[Knock Me Out](http://www.knockmeout.net/)の著者であるRyan Niemeyer氏が作ったプラグインで、Knockoutの持つpub/subの仕組みを応用してモデル間のデータ共有を簡単に行うことができます。

https://github.com/rniemeyer/knockout-postbox

## インストール
bower経由のインストール、またはzipアーカイブからknockout-postbox(.min).jsを取得して、knockout.jsと一緒に読み込みます。

```shell-session
$ bower install knockout-postbox
```

```html
<script type="text/javascript" src="knockout.js"></script>
<script type="text/javascript" src="knockout-postbox.js"></script>
```

## 使い方

### データの変更をモデル間で通知する

Knockoutで監視している値の変更を通知するには、publishOn()を使います。
引数に任意のtopicを指定して下記のように指定します。

```JavaScript
var viewModel = function() {
  // var count = ko.observable(0); を以下のように変更する
  var count = ko.observable(0).publishOn("shared_counter");
}
```

通知を受け取るには、subscribeTo()を使います。
publishOn()と同様に、通知を受け取りたいtopicを渡して下記のように指定します。

```JavaScript
var anotherModel = function() {
  var shared_count = ko.observable(0).subscribeTo("shared_counter");
}
```

デモ: http://jsfiddle.net/castor_4bit/myBk3/

### データの変更を外部に通知する

postboxを利用したpub/subは、モデル間以外でも利用可能です。

publishされた通知を外部で受け取るには、ko.postbox.subscribe()を使用します。

```js
ko.postbox.subscribe("shared_counter", function(value) {
  // ここで受け取った value を使った処理ができます
});
```

また、subscribeしているModelに対して、外部からpublishすることも可能です。

```js
ko.postbox.publish("shared_counter", 100 /* 通知する値 */);
```

### データを同期する

複数のモデル間などで相互にpublish/subscribeするような場合には、以下のように記述できます。

```js
var viewModel = function() {
  var count = ko.observable(0).syncWith("shared_counter");
}
var anotherModel = function() {
  var shared_count = ko.observable(0).syncWith("shared_counter");
}
```

デモ: http://jsfiddle.net/castor_4bit/u6v8A/1/

## 補足(オプション)

subscribeToの第2引数に true を渡すと、初期化時に最後にpublishされた値が適用されます。デフォルトでは false です。

```js
var count = ko.observable().subscribeTo("shared_counter", true);
```

subscribeToの第3引数に true を渡すと、初期化時に最後にpublishされた値が適用されます。（第2引数を省略して関数を渡しても動作します）

```js
var count = ko.observable().subscribeTo("shared_counter", true, function(value) {
  return value * 2;  // 常に2倍の値で同期される
});
```

subscribeを解除するには、unsubscribeFrom()を使います。

```js
count.unsubscribeFrom("shared_counter")
```

publishOnの第2引数に true を渡すと、初期化時にも値の変更としてpublishされます。デフォルトでは true です。

```js
// 初期値100がpublishされる
var count = ko.observable(100).publishOn("shared_counter", true);
```

publishOnの第3引数に比較関数を渡すと、条件を *満たさない場合* のみpublishされます。デフォルトでは === での比較結果が false の場合にpublishされます。

```js
var count = ko.observable(100).publishOn("shared_counter", true, function(newValue, oldValue) {
  return newValue < oldValue;  // 新しい値が大きい場合のみ通知される
});
```

publishを解除するには、stopPublishingOn()を使います。

```js
count.stopPublishingOn("shared_counter");
```

syncWith()にもそれぞれ同様のオプションが存在しますが、詳細は公式READMEを参照ください。


中規模以上のアプリケーションなどでは共用のコンテキストを保持するようなことが多いかもしれませんが、ページの一部分にKnockoutを適用する場合など、ViewModel同士や外部とのやりとりに依存関係を持ち込まずに実装できるという点で、結構重宝しています。
激しい進捗確認の嵐でマシンリソースを高速に喰いつぶすワンライナー

```bash
while : ; do yes 進捗どうですか？ | xargs -P 0 echo &
```

イメージ画像↓
![Screenshot from 2014-07-21 00:07:31.png](https://qiita-image-store.s3.amazonaws.com/0/27745/c9b22c1d-2c08-0bef-8ae5-5832d77ede91.png)

スクショをよく見てください。一部テキストが壊れています。激しいでしょ？

一応解説をば
==========
単純に`while`で永遠ループしているのですが、中身が問題です。
`yes`では、引数のテキストを改行区切りで無限に出し続けます。
これだけでもまぁまぁ負荷がかかりますが、端末への出力がボトルネックになってしまいます。
そこで、永遠に出力され続ける進捗確認を並列化した`echo`に投げます。
`xargs`では、受け取った文字列を任意のプログラムに引数として渡すことができるのですが、オプションの並列化機能を利用し、CPUの限界まで並列化しています。
macのインストール用の覚え書き


## homebrewを入れる
```
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
```

## xcodeのコマンドラインのやつを入れる。

## homebrew-caskを入れる
```
brew tap phinze/homebrew-cask
brew install brew-cask
```

## homebrew-caskで入れてる奴ら
alfred
evernote
kobito
skitch
appcleaner
gimp-lisanet
macs-fan-control
splashtop-personal
bathyscaphe
github
macwinzipper
the-unarchiver
caffeine
google-chrome
microsoft-intellipoint
vlc
coteditor
google-drive
onyx
day-o
iterm2
plain-clip
dropbox
karabiner
scroll-reverser

## homebrewでいれるもの
tree

## apple storeでいれるもの
pic togo for Flickr
Found
FreeMan
Divvy
Keynote
Numbers
Pages
iMovie
iPhote
FreeSpace Tab
Xcode
CPU LED

## その他
MacVim-Kaoriya(https://github.com/splhack/macvim/releases/latest)
フォントとか（Mig 1M）
HHK for Man のドライバ
Sonetのカスペルスキー
ATOKパスポート版
Solarizedカラースキーマ
CentOSにapacheをインストールして、DocumentRootを変更したらあれこれ躓いた


# 前提

- CentOS 6.5
- apache 2.2.15

# 手順

## apacheのインストール

```bash
sudo yum -y install httpd
```

## DocumentRootの変更

```bash
sudo vim /etc/httpd/conf/httpd.conf
```

```httpd.conf
# DocumentRoot /var/www/html デフォルト
DocumentRoot /home/user/www/html
```

userでwww/htmlを作成する

```bash
cd ~
mkdir -p www/html
```

このあと、httpdを再起動したら 

```bash
Syntax error on line 293 of /etc/httpd/conf/httpd.conf:DocumentRoot must be a directory
```

が出てhttpdを起動できず.

## SELinux

ここ[(ApacheのDocumentRootを変更すると、Apacheが起動しない。)](http://d.hatena.ne.jp/Michael_e29/20120207/1328585107)を見ると、SELinuxというセキュリティ管理機能が原因で、エラーになっているらしい。

けど上記サイトに記載されている方法では解決せず、[stackoverflow](http://stackoverflow.com/questions/14786881/apache-restart-causes-documentroot-must-be-a-directory-even-though-it-is-a-dire)と、https://www.centos.org/forums/viewtopic.php?t=1742 を参考に

```bash
sudo yum -y install policycoreutils-python # semanageなどSELinuxを制御するツール一式がインストールされる
sudo setsebool -P httpd_enable_homedirs on
sudo chcon -R -t httpd_sys_content_t /home/user/www

sudo service httpd restart

```

でSyntax errorの問題は解決して起動した。 

[ターゲットポリシー](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/chap-Security-Enhanced_Linux-Targeted_Policy.html)のドキュメントを読んだ限りだと、httpdなどのLISTENするプロセスは、制限されたドメインで実行されるようで、制限されたプロセスが、ファイルにアクセスするためには、アクセス対象のファイルにドメインに対応したラベル(上の場合httpd_sys_content_t)が設定されている必要があるらしい。


## iptables
外部からアクセスするために、ファイアウォールの設定

```/etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
```

を追加して、80番ポートを有効にする。
有効にしたらiptablesを再起動

```bash
service iptables restart
```

## index.htmlがForbidden

次の問題は、http://xxx.xxx.xxx.xxx/index.html
にアクセスしてもForbiddenが表示されてアクセスできないこと（事前に/home/user/www/html/index.htmlを作成している)。


### ディレクトリのパーミッション

DocumentRootに設定したディレクトリの各階層に対してアクセス権o+xを設定をする必要があるとのこと。

http://unix.stackexchange.com/questions/109283/apache-throws-403-forbidden-after-moving-documentroot-centos-6-4#comment168421_109283

自分の環境では、これでひとまず解決.

# おまけ SELinuxの状態確認と設定

## 有効無効の確認

``` bash
getenforce # Enforcingなら有効, Permissiveなら無効
```

##  有効無効の設定
``` bash
set setenforce 0 # 0なら無効, 1なら有効
```

## 各種フラグ確認
``` bash
getsebool -a | grep httpd # httpdに関して調べるなら
```

## 各種フラグ設定
```bash
setsebool -P flagname 0 or 1 # -P は永続性オプション. flagnameはgetseboolで確認できる.
```

## ファイルやディレクトリのラベルの確認方法

```bash
ls -Z
```


# 参考

http://stackoverflow.com/questions/14786881/apache-restart-causes-documentroot-must-be-a-directory-even-though-it-is-a-dire

https://www.centos.org/forums/viewtopic.php?t=1742

http://rfs.jp/server/security/selinux01.html

http://park1.wakwak.com/~ima/centos4_apache0002_p2.html

http://unix.stackexchange.com/questions/109283/apache-throws-403-forbidden-after-moving-documentroot-centos-6-4#comment168421_109283


SELinuxを理解するために、下のドキュメントは一読した方がよいかも.
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/chap-Security-Enhanced_Linux-Working_with_SELinux.html
Cocos2d-x 3.2をインストールする

学生時代Cocos2d-x 2.2を触っていたのですが、
バージョンアップしていたので記事にしてみた。

##ダウンロード

1. [公式サイト](http://www.cocos2d-x.org/)からcocos2d-x-3.2.zipをダウンロードします。
2. 解凍して作業用のフォルダに置きます。

##セットアップ

Android向けに制作する場合、以下のインストールが必要になります。

* Android NDK
* Android SDK
* ANT

今回は省略させていただきます。

Pythonコマンドで"cocos2d-x-3.2/setup.py"を実行します。

```
python cocos2d-x-3.2/setup.py
```

途中でAndroid NDK，Android SDK，ANTのパスを聞かれるので入力してください。
（必要ない場合はスキップして結構です。）

正常に完了すると、".bash_profile"に環境変数が設定されるので、
sourceコマンドでそれを反映させます。
（zshを使っている人はzsh_profileで行ってください）

```
source ~/.bash_profile
```

以上でCocos2d-x-3.2のインストールは完了です。
Mac OS X環境にrmagickをインストールする決定版

盛大にハマったのでメモ。

こんなエラーが出てるなら役に立つかもしれません。

```bash
ERROR:  Error installing rmagick:
	ERROR: Failed to build gem native extension.

    /Users/user/.rbenv/versions/2.1.1/bin/ruby extconf.rb
checking for Ruby version >= 1.8.5... yes
checking for clang... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
/usr/local/bin/Magick-config: line 41: pkg-config: command not found
/usr/local/bin/Magick-config: line 47: pkg-config: command not found
/usr/local/bin/Magick-config: line 50: pkg-config: command not found
/usr/local/bin/Magick-config: line 53: pkg-config: command not found
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... no

Can't install RMagick 2.13.2. Can't find MagickWand.h.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
```

```bash
ERROR:  Error installing rmagick:
	ERROR: Failed to build gem native extension.

    /Users/user/.rbenv/versions/2.1.1/bin/ruby extconf.rb
checking for Ruby version >= 1.8.5... yes
checking for clang... yes
checking for Magick-config... no
Can't install RMagick 2.13.2. Can't find Magick-config in ...
```

なにはともあれImageMagickをインストール
既に入ってたら再インストールした方が良いかもです。

```bash
brew install imagemagick
```

続けてpkg-configもインストール
これも再インストール推奨です
※自分の環境ではこれを再インストールして上手くいきました

```bash
brew install pkg-config
```

ここでやっとこさrmagickが入りました。

```bash
gem install rmagick
```

この件に関する記事は沢山見つかったのですが、
pkg-configを再インストールするのは見た事の無いパターンだったので残しておきます。
VirtualBox上のLinuxゲストマシンにリモートデスクトップ接続する

* ここで紹介する以外にも以下の方法が考えられます
    1. X11Forwarding + Xming
    2. tigervnc + VNCクライアント
    3. tigervnc + tigervnc-applet + ブラウザ
    4. tigervnc + xrdp + リモートデスクトップ

* ゲストマシン上の個別のアプリケーションだけをホストOS側に表示するなら、1.で可能です
* デスクトップ画面全体を表示するなら、2.、3.、4.、およびここで紹介する方法を採る必要があります

---
# VirtualBox上のLinuxゲストマシンのデスクトップ画面にリモートアクセスしたい

## モチベーション

* VNCクライアントは諸事情で使えない
* Windowsのリモートデスクトップを使ってLinuxゲストマシンにアクセスしたい


## 1. VirtualBoxの設定

* リモートディスプレイを有効化する
    * ポートは"3389"から使用していない"13389"に変更する
    * ホストOSがWindowsの場合"3389"はリモートデスクトップで使用するポートで衝突する

![VirtualBox-remote-display](https://lh3.googleusercontent.com/-mZQuPF_7u80/U_81A8LhYqI/AAAAAAAAAEg/WxpkNB0ABhU/w705-h457-no/VirtualBox-remote-display.png "VirtualBox-remote-display")


## 2. リモートデスクトップ接続する

* リモートデスクトップを起動して`<ホストOSのIPアドレス>:13389`を指定して接続する

![リモート デスクトップ接続](https://lh4.googleusercontent.com/-kMvXOikUXME/U_80_kEBiYI/AAAAAAAAAEU/fA86yKFzyjk/w528-h342-no/%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E6%8E%A5%E7%B6%9A.png "リモート デスクトップ接続")

![リモートデスクトップ画面](https://lh4.googleusercontent.com/-XxzDM1GUKFs/U_81ABINarI/AAAAAAAAAEo/ZP2yxTdZi1E/w941-h659-no/%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E7%94%BB%E9%9D%A2.png "リモートデスクトップ画面")

## 3. 日本語入力できるようにする

* 現状のままだと日本語入力することができないので、できるようにする

* CentOSではインプットメソッド（IM）フレームワークとしてiBus(Intelligent Input Bus)を使用している
    * なお、iBusのほかにSCIM、UIMなどがある

### 3.1 iBusパッケージがインストールされているか確認

```shell-session
# rpm -qa | grep "^ibus" | sort
ibus-1.3.4-6.el6.x86_64
ibus-anthy-1.2.1-3.el6.x86_64
ibus-gtk-1.3.4-6.el6.x86_64
ibus-libs-1.3.4-6.el6.x86_64
```

### 3.2 iBusの初期設定

```shell-session
# ibus-setup 
```

* iBusデーモンを起動する

![ibus](https://lh6.googleusercontent.com/-ilptc1MFja8/U_818CP6RiI/AAAAAAAAAFY/PxpDRki4dko/w326-h161-no/iBus-001.png "ibus")
![ibus](https://lh5.googleusercontent.com/-L6anxm4Hc0A/U_81_eVIPjI/AAAAAAAAAF4/4dnwU6DsIlA/w448-h180-no/iBus-002.png "ibus")

* インプットメソッドとして日本語Anthyを設定する

![ibus](https://lh4.googleusercontent.com/-6TJ8wcfjtqE/U_81-mXKDSI/AAAAAAAAAF0/ln6YumBwETk/w429-h521-no/iBus-003.png "ibus")
![ibus](https://lh4.googleusercontent.com/-MZDY-mF0S2I/U_818zNxviI/AAAAAAAAAFg/-A8mg5qdL9w/w429-h521-no/iBus-004.png "ibus")
![ibus](https://lh4.googleusercontent.com/-lo7tp-5XMTk/U_817NzH60I/AAAAAAAAAFU/ZR1R5UKiLyk/w429-h522-no/iBus-005.png "ibus")
![ibus](https://lh5.googleusercontent.com/-Stlr8Nn_kqs/U_816CBfTJI/AAAAAAAAAFI/wS-ks8Ok35w/w429-h527-no/iBus-006.png "ibus")

### 3.3 環境変数の設定とiBusデーモンの起動

* iBus用の環境変数をセットする

```shell-session
# export GTK_IM_MODULE=ibus
# export XMODIFIERS="@im=ibus"
# export QT_IM_MODULE=ibus
# printenv | grep ibus
QT_IM_MODULE=ibus
XMODIFIERS=@im=ibus
GTK_IM_MODULE=ibus
```

* iBusデーモンを起動する
    * -r: すでに起動中のデーモンを置き換える
    * -d: バックグランドで実行
    * -x: ximサーバを実行。ximはX Window Systemの各国語入力用のプロトコル

```shell-session
# ibus-daemon -rdx
```

* 半角/全角キーで入力切替

### 3.4 環境変数のセットとiBusデーモンの起動を自動化する

* `~/.bash_profile`に以下追記する

```bash:~/.bash_profile
export QT_IM_MODULE=ibus
export XMODIFIERS="@im=ibus"
export GTK_IM_MODULE=ibus
ibus-daemon -rdx
```

---
Swiftでウインドウレベルを設定しようとした時の罠

NSWindowのウインドウレベルはSwiftでは以下のように読み書き可能なプロパティとして定義されています。

```swift:NSwindow
var level: Int
```

Cocoaではウインドウレベルとして設定する値用の`NSNormalWindowLevel`などのマクロが定義されているのですが、困ったことにSwiftではそういったものは定義されていません。

マクロを使わない場合、`CGWindowLevelForKey()`の戻り値を設定するようです。幸いこれはSwiftでも定義されていました。

```swift
func CGWindowLevelForKey(_ key: CGWindowLevelKey) -> CGWindowLevel
```

おそらくマクロはこの関数の呼び出しに展開されるのでSwift側にはなかったのでしょう。単純な定数定義はSwiftでも定数として参照できますが、それ以外のマクロ定義は無視されるからです。

この関数を使うためには引数に指定するキーが必要です。`CGWindowLevelKey`
型が例によって```RawOptionSet```のサブクラスになっていてそこに定数が定義されていると思いきや、なんと単なる```Int32```のエイリアスでした。

```swift
typealias CGWindowLevelKey = Int32
```

幸い```kCGNormalWindowLevelKey```などのenumはSwiftでも定数として存在しているのでこれを使えば良さそうです。

これらを組み合わせて使えばOKと思いきや、以下のように型の不整合があります。

- enumは```Int```になるが```CGWindowLevelKey```は```Int32```のエイリアス
- levelプロパティは```Int```だが```CGWindowLevelForKey()```の戻り値は```CGWindowLevel```(```Int32```のエイリアス)

ということで最終的にキャストしまくることで指定できました。

```swift
window.level = Int(CGWindowLevelForKey(Int32(kCGFloatingWindowLevelKey)))
```


参考

- https://developer.apple.com/library/prerelease/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/index.html#//apple_ref/occ/instm/NSWindow/level
- https://developer.apple.com/library/prerelease/mac/documentation/GraphicsImaging/Reference/Quartz_Services_Ref/index.html#//apple_ref/c/func/CGWindowLevelForKey
- https://developer.apple.com/library/prerelease/mac/documentation/GraphicsImaging/Reference/Quartz_Services_Ref/index.html#//apple_ref/c/tdef/CGWindowLevelKey
他社のiOSアプリ開発の現場で聞きたいこと


他社のiOSアプリ開発者と話す時、いつも同じことを聞いていたのでそれをまとめておく

特にiOSに関連深い事柄

- バージョン管理システムは何を使っているか
 - ホスティングサービスは何を使っているか
 - プロジェクト管理ツールは何を使っているか
 - コードレビューはどのように行っているか
- ブランチの運用はどのようにやっているか
- Storyboardやプロジェクトファイルなどでコンフリクトが起こらないように工夫しているか

その他、開発の進め方に関連深い事柄

- アジャイル開発（もしくはその一部のどのような部分）を取り入れているか
- 「開発環境の改善とかコミュニケーション改善で自慢したいところ」はあるか
- 現状の開発に関する不満点や改善したい点などあるか
- テストはどのようにやっているか


実際に自分が訊いてきたものは下記にまとめている

- [iOSアプリ開発の現場で訊いてみた！ユビレジ編](http://qiita.com/yimajo/items/bb75fb91c0d48a6d2196)
- [iOSアプリ開発の現場で訊いてみた！フリル編](http://qiita.com/yimajo/items/26c8e29e44a34a683a78)




## バージョン管理システムは何を使ってる？

Xcode標準のバージョン管理システムはgitのため聞く必要もないことだけど、例えばそこであえてsvnを使っているのであればそれには何かしら外部要因があるはずなので、確認したいところ。

また、ホスティングサービスを使っているならGitHubを使っているのか、Bitbucketなのかというのも話として知っておきたい。

これと同時にプロジェクトの管理ツールなどについても聞いておきたい。

### コードレビューをどのように行ってる？

コードレビューをどのようなやり方で運用しているかというのも聞きたい。
大抵、自分の得意分野でもなくパターン数が多く複雑な処理の場合のコードレビューは面倒で、時間を取られるため時間がもったいなく感じ、自分の作業を進めたいという気持ちになると思う。

そういう気持ちにならないようにするために、どのような工夫をしているのかというのも聞くとためになるし、開発工数として計上しているかどうかなどの開発フロー全体について聞き出しやすい。


## ブランチの運用はどのようにやってる？

バージョン管理システムでのブランチ運用は経験とその会社のルールがよく反映されている。

具体的な参考例として下記のエンジニアブログの記事が知りたい内容になる

LINE iOSアプリ開発についてのご紹介
http://developers.linecorp.com/blog/?p=2921

この特徴を箇条書きにするとLINEでの開発スタイルが分かりやすい

- バージョンごとのmasterがある（バージョンごとにデプロイ可能なものを積む）
 - 次の次のバージョンで実装など先の計画に対して実装をすすめるリソースがあるからっぽい
- リリースされたら上位のバージョンのブランチにマージして消していく
- 元々はgit-flowを元にして変化していった

##  Storyboardやプロジェクトファイルなどでコンフリクトが起こらないように工夫してる？

StoryboardやプロジェクトファイルはXMLファイルの仕様が公開されておらず、そのため手動でのマージは難しくコンフリクトしないような工夫をしていることは多いだろう。何か工夫があれば教えて欲しい。

## アジャイル開発はどの程度取りいれてる？

使い古されたアジャイル開発というものについて、それぞれの職場ではどのような部分を取り入れ、どのような部分を取り入れていないのかということも興味がある。

具体的なコーディングに近い部分や、AppStoreの審査があることによるリリースサイクルの戦略など的を絞りたい。

時間があればスクラムについても聞きたい。スクラムはアジャイル開発の中でもチームでの開発手法のフレームワークであって、その開発チームのやり方を掘り下げていくことが出来る。

- XP（エクストリームプログラミング）
 - ペアプログラミングはやってる？
- スモールリリースしてる？
 - どのようなサイクルで申請するかなど具体的なことは決まっている？
- スクラムは取り入れてる？
 - スクラムマスターは明確に決まっている？
- 他にアジャイルで取り入れて良いなって部分ある？

コーディングと関連性が薄い部分については、スクラムなどについて聞きたい。

スクラムマスターが明確に決まっているかどうかを知りたいのは、経験が多く責任感が強い人が自然とスクラムマスターの役割を担っているのか、それともチームやプロダクトオーナーがスクラムマスターという役割の重要さを明確に理解した上でメンバーが役割を担っているのかを知りたいため。

多くの場合前者で、誰かが暗黙的にスクラムマスターを担ったりする事が多いと感じていて、その場合はメンバーに恵まれているとは思うが、責任感ゆえに暗黙的にスクラムマスターになった当人は疲労していたりしないのか、疲労しないようにする心構えなどがあるのかなどが知りたい。

##「開発環境の改善とかコミュニケーション改善で自慢したいところ」とかある？

例えば何かの手段が自動化されている等、そういうことを聞ければありがたい。

## 現状の開発に関する不満点やさらに改善したい点などある？

聞くと刺激を受けることもあるだろうし、ディスカッションしてる中で問題の原因点などが浮き彫りになる。

## テストはどうやってる？

- テストの自動化はやってる？
 - 単体テストの自動化してる
 - UIのテストの自動化してる
 - 使っているライブラリは？
- QAテストはどういうふうにやってる？
 - 何人ぐらいでやってる？

テストを自動化しなければいけないとは思わないけど、色々なチャレンジもあると思うので知りたい。

# まとめ

自分としては開発や会社全体のことを聞いても抽象的な質問になってしまうので、質問に答えやすいように具体的で細かなことを聞いて、全体に繋がっていければと思う。
Dartのオブジェクトは関数だ

現在よく使われているいろいろな言語と同様に、Dartの関数はファーストクラスのオブジェクトである。さらに、Dartにおいては逆にオブジェクトが関数になることができる。

次の2つのコードは全く同じ意味を持つ。

1つ目はオブジェクトの関数を呼び出す方法

```dart
class Caller {

  String call(String str) {
    return str;
  }
}

main() {
  var caller = new Caller();
  print(caller.call("laco")); // laco
}
```

2つ目はオブジェクトを関数として呼び出す方法

```dart
class Caller {

  String call(String str) {
    return str;
  }
}

main() {
  var caller = new Caller();
  print(caller("laco")); // laco
}
```

# 特別なメソッド: call()

Dartでは`call()`という名前のメソッドを定義したクラスのオブジェクトは関数になる。引数は自由に設定できるが、オーバーロードはないので一つしか`call()`は定義できない。  

この`call()`が定義されたクラスは「関数のように振る舞う」のではなく「関数そのもの」なので、以下のような結果になる

```dart
class A{
  void call(){
  }
}

class B{
  void calls(){
  }
}

main(){
  print(new A() is Function); //true
  print(new B() is Function); //false
}
```

# 関数としてオブジェクトを渡す
Dartでは`typedef`を用いて、独自の関数型を作る。C#をやったことがある方ならDart版delegateだと思っていい。例えば`String`を引数に取り、`String`を返す関数は以下のように定義する。

```dart
/**
 * The function of [String] -> [String] converter
 */
typedef String StringConverter(String seed);
```

定義した関数型は次のように用いることが出来る。

```dart
String convert(StringConverter func, String seed) {
  return func(seed);
}
```

この`StringConverter`型は、『Stringを引数により、実行するとStringを返す』関数ならなんでも受け入れることが出来るので、先ほどの`call()`と合わせると以下のように関数としてオブジェクトを渡すことができる。継承などは一切必要ない。

```dart
class TripleCaller {

  String call(String str) {
    return "${str}" * 3;
  }
}

/**
 * The function of [String] -> [String] converter
 */
typedef String StringConverter(String seed);

String convert(StringConverter func, String seed) {
  return func(seed);
}

main() {
  var laco = new TripleCaller();
  print(convert(laco, "laco")); // lacolacolaco
}
```

もちろん関数型など作らずとも次のように書いてもよい。全ては実行時に解決される。

```dart
String convert(Function func, String seed) {
  return func(seed);
}
```
Page Speed Insightsの情報をGoogle Apps Scriptで取得する方法

#Page Speed Insights
[Page Speed Insights](https://developers.google.com/speed/pagespeed/insights/)はWebサイトのパフォーマンス診断などを行ってくれるサービスです。URLを指定するだけで、デスクトップとモバイルのパフォーマンススコアとUXスコア（モバイルのみ）を表示してくれます。

[Page Speed Insightsのサイト](https://developers.google.com/speed/pagespeed/insights/)から利用できるほか、[Chrome拡張](https://chrome.google.com/webstore/detail/pagespeed-insights-by-goo/gplegfbjlmmehdoakndmohflojccocli)や[Firefox拡張](https://dl-ssl.google.com/page-speed/current/page-speed.xpi)でも利用することができます。

#Page Speed InsightsをGoogle Apps Scriptから利用
Page Speed InsightsはAPIも提供していますので、各種アプリケーションからPage Speed Insightsのデータを取得することができます。

今回はGoogle Apps Scriptから利用する方法を説明します。これにより、たとえばGoogleスプレッドシートに自社のサイトのURLを並べておけば、それに対するPage Speed Insightsのスコアや各種情報を一覧の形式で見ることなどが可能となります。

ステップは次のとおりです。

* APIキーを取得
* スクリプト作成（以下のサンプルをコピー）
* 欲しいSpeed Insightsのデータを指定して利用

## APIキーの取得
[Google Developer Console](https://console.developers.google.com/)から取得します。詳しくは[こちら](https://developers.google.com/speed/docs/insights/v1/getting_started#auth)から。

## スクリプト作成
以下を参考にスクリプトを作成します。

```js:PageSpeedInsights
function pageSpeed(url, strategy, locale) {
  var APIkey = '取得したAPIキー';
  locale = locale || 'ja_JP'; // default is 'en'
  strategy = strategy || 'desktop'; // 'desktop' or 'mobile'
  var url = 'https://www.googleapis.com/pagespeedonline/v1/runPagespeed?url=' + url + '&key=' + APIkey + '&local=' + locale + '&strategy=' + strategy;

  try {
    var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true });
  }
  catch (err)
  {
    Logger.log(err);
    return(err);
  }

  var parsedResult = Utilities.jsonParse(response.getContentText());
  var pageSpeedResults = {};
  
  pageSpeedResults['score'] = parsedResult.score;
  //Logger.log(pageSpeedResults);

  var pageStats = ['numberResources', 'numberHosts', 'totalRequestBytes', 'numberStaticResources', 'htmlResponseBytes', 'cssResponseBytes', 'imageResponseBytes', 'javascriptResponseBytes', 'otherResponseBytes', 'flashResponseBytes','textResponseBytes', 'numberJsResources', 'numberCssResources'];
  
  for (var i=0; i < pageStats.length; i++) {
    var key = pageStats[i];
    pageSpeedResults[key] = parsedResult.pageStats[pageStats[i]];
    //Logger.log(pageSpeedResults);
  }
  
  return(pageSpeedResults);
}
```
APIkeyには取得したAPIキーをコピペします。

この例では、スコアとPageStatsの各種情報（ページを構成する各種リソースのサイズや数）を扱うようにしていますが、それ以外の情報を扱う場合はPage Speed Insightsが返すJSONから取得するようにします。JSONで返却されるレスポンスは[ここ](https://developers.google.com/speed/docs/insights/v1/getting_started#example_commandline)をご覧ください。

##スクリプトでの利用

作成した関数は次のように利用できます。

```js:sample
// http://qiita.com/ のデスクトップのPage Speed Insightsのスコアを取得
var desktopScore = pageSpeed('http://qiita.com/').score;

// モバイルのスコアを取得
var mobileScore = pageSpeed('http://qiita.com/', 'mobile').score;

// デスクトップのHTMLリソースのサイズ（バイト）を取得
var htmlSize = pageSpeed('http://qiita.com/').htmlResponseBytes;
```

Googleスプレッドシートの中での関数として利用することもできますが、大量のURLを処理する場合は時間がかかりますので、スクリプトを組んで必要な時に値を取得するほうが良いでしょう。
Ruby で Growl に通知するサンプルのつづき

以前に [Ruby で Growl に通知するサンプル](http://qiita.com/bsdmad/items/054bd3ad4c0908949d39) という投稿をしたが、実際のアプリで Macbook Pro から Windows への通知をしようと思ったら上手く動かなかった。

localhost では OK でネットワーク経由では NG という状況で、Growl for Windows の設定をあれこれ弄ってもダメ。でもコマンドラインツールからはちゃんと通知できる、ということでプログラムを見なおしたところ register メソッドを発行しないとダメなことに気づいた。

で、notify の前に register メソッドを発行すれば良いかと思ったが、毎回 register  されて Growl for Windows に通知が出てしまって煩わしいため、以下の様なコードで対処した。

```rb:growl.rb
require 'ruby-growl'

class Growl
  def initialize(ip, name = 'ruby-growl')
    @g = ::Growl::GNTP.new ip, name
    @g.password = 'PASSWORD'
    @g.add_notification "notification", "#{name}"

  end

  def notify(title, message, url)
    begin
      @g.notify "notification", title, message, 0, true, nil, url
    rescue Growl::GNTP::UnknownApplication
      @g.register
      retry
    end
  end
end
```

今更 growl 使う人は少ないのかもしれないけど、何かの参考になれば。
Webアプリ開発実践：Djangoでシフト作成ページを作ろう！（herokuで公開・実験編）

とりあえず現時点での状態をHerokuで公開しておくことにしました。こんな感じ（未実装の部分もかなり残っていますがあしからず）。

http://polar-crag-7122.herokuapp.com/

公開用アカウント（name:hoge,pass:hogehoge）

ちょっとソースコードが訳分からなくなったりしてきたので、これはひとまず本番前の勉強だったということにして改めて作り直すことにしました（随時投稿するつもり）。

-

### Herokuで公開するまでの流れ

主に[自分の過去の投稿](http://qiita.com/search?q=heroku+user%3Ajuniskw)を参考に進めたのだが、なんだかその時とは違った現象が起こったりしたので記録しておく。

まずは **Procfile** を書いたり **requirements.txt** を用意したりして準備。

###### Procfile

```
web: gunicorn shift_maker.wsgi
```

以前はこの書き方だと上手くいかなかったのだが以下を参考に **wsgi.py** を編集したら普通にできた（コメントのところにある **sys.path.append** を加える）。
http://qiita.com/juniskw/items/b9278557daf471a89205

あとは[チュートリアル](https://github.com/herokaijp/devcenter/wiki/django)に沿って進めていく。 **settings.py** や **wsgi.py** も微妙にHeroku用の編集が必要なので要注意。それから```foreman start```を実行してちゃんと動くかテスト・・・うん、大丈夫そうだ。

そしていよいよ```heroku create```。ここでも特にエラーは出ない。

じゃあ見てみようということで```heroku ps:scale web=1```すると・・・

>Scaling dynos... failed
 !    No app specified.
 !    Run this command from an app folder or specify which app to use with --app APP.

あれ？という感じ。アプリ名を指定して再挑戦。

```
heroku ps:scale web=1 --app my-app-0001
```

>Scaling dynos... failed
 !    App must be deployed before dynos can be scaled.

ちょっと変わった。
ここで「あ、そういえばまだpushしてない」と思い```git push heroku master```。
だが今度は・・・・

>fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.

>Please make sure you have the correct access rights
and the repository exists.

ということで上手くいかない。「前はこんなことしなかったと思うんだけどなあ」と思いつつも

```
git remote add heroku git@heroku.com:my-app-0001.git
```

これを実行し、```git push heroku master```。すると今度は上手くいった、と思いきや・・・・

>  !     Push rejected, no Cedar-supported app detected

>To git@heroku.com:my-app-0001.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@heroku.com:my-app-0001.git'

何だろうかこれは？Cedar？
ということでググる。以下のページがドンピシャだったので参考にさせていただいたところ上手くいった。
http://tkoyama1988.hatenablog.com/entry/2013/12/13/072150

あとは試しにアクセスしてみたときにログインページで見覚えのないエラーが出て一瞬パニックになったが、要はデータベースを構築していなかっただけ。

```
heroku run python manage.py syncdb
```

これでOK。
【個人メモ】CoffeeScriptのinitial commitの環境を動かしてみる

# CoffeeScriptの一番始めのコミットの状態を再現

できるのかな、と思ったのでやってみる。

[CoffeeScriptのinitial commitの状態](https://github.com/jashkenas/coffeescript/tree/8e9d637985d2dc9b44922076ad54ffef7fa8e9c2)

2009年が初回コミットの状態とのこと。
だいぶ昔だな。

Rubyのバージョンは2.1.2で試している。
bundlerはインストール済み。

# 作業の流れ

## initial commitの状態に戻す

リポジトリをcloneして、initial commitの状態に戻す。

```shell-session
> git clone git@github.com:jashkenas/coffeescript.git
> cd coffeescript
> git checkout -b initial-commit 8e9d637985d2dc9b44922076ad54ffef7fa8e9c2
```

## 当時のソースを修正する

grammer.yのrequireを変更する。

```diff
diff --git a/grammar.y b/grammar.y
index 580ca76..1c3e09b 100644
--- a/grammar.y
+++ b/grammar.y
@@ -190,8 +190,8 @@ rule
 end
 
 ---- header
-  require "lexer"
-  require "nodes"
+  require "./lexer"
+  require "./nodes"
```

parser_test.rbのrequireを変更する

```diff
diff --git a/parser_test.rb b/parser_test.rb
index c383224..8880b1a 100644
--- a/parser_test.rb
+++ b/parser_test.rb
@@ -3,7 +3,7 @@
 `racc -o parser.rb grammar.y`
 
 # Parse and print "code.jaa".
-require "parser.rb"
+require "./parser"
 js = Parser.new.parse(File.read('code.jaa')).compile
 puts "\n\n"
 puts js
```

## Gemfileを追加する

[racc](https://github.com/tenderlove/racc)というツールを使って構文解析を行っている。
インストールをするために、Gemfileを追加する。

```ruby:Gemfile
source 'https://rubygems.org/'

gem 'racc'
```

## bundle installを行う

```
> bundle ins --path vendor/bundle
```

## parser_test.rbを実行する

```
> bundle ex ruby parser_test.rb
```

parser_test.rbはcode.jaaの中身をパースしている

# code.jaaの中身

これがいっちばん最初のCoffeeScript

```rb
# I'm a comment and I'm ok.
# Return
# Case

square: x => x * x.

sum: x, y => x + y.

odd: x => x % 2 is 0.

even: x => x % 2 aint 0.

object_literal: {one: 1, two: 2, three: 3}

multiline_object: {
  pi: 3.14159
  list: [1, 2, 3, 4]
  three: 3
  inner_obj: {
    freedom: => _.freedom().
  }
}

run_loop: =>
  fire_events(e => e.stopPropagation().)
  listen()
  wait().

if submarine.shields_up
  full_speed_ahead()
  weapons.fire_torpedos()
else
  run_away().

eldest: if 25 > 21 then liz else marge.
```

# code.jaaをコンパイルした結果

parse_test.rbを実行した結果。

```js
var square = function(x) {
  return (x * x);
};
var sum = function(x, y) {
  return (x + y);
};
var odd = function(x) {
  return ((x % 2) === 0);
};
var even = function(x) {
  return ((x % 2) !== 0);
};
var object_literal = {                                                
  one: 1,
  two: 2,
  three: 3
};
var multiline_object = {
  pi: 3.14159,
  list: [1, 2, 3, 4],
  three: 3,
  inner_obj: {
    freedom: function() {
      return _.freedom();
    }
  }
};
var run_loop = function() {
  fire_events(function(e) {
    return e.stopPropagation();
  });
  listen();
  return wait();
};
if (submarine.shields_up) {
  full_speed_ahead();
  weapons.fire_torpedos();
} else {
  run_away();
}
var eldest = (25 > 21) ? liz : marge;
```

# 所感

5年前のコードがちょこっとの修正で
Ruby 2.1.2の環境で動くの、とても良い。
初心者向けWIPワークフロー&レビュー時の注意


社内で使っているWIPワークフローのメモ書きです（初心者向け）

### 1.作業を開始する

```
# masterブランチに移動
git checkout master

# masterブランチを最新にする
git pull origin master 

# 新しい作業ブランチを作成
git checkout -b new_branch

# 空コミットを作る
git commit --allow-empty -m "[WIP] 今回開発する内容を書く"

# push 
git push origin new_branch
```

この後、Githubの画面に行ってpull requestを送ります。

### 2.タスクを洗い出す

Githubのプルリクエストにタスクを積みましょう。
下記のようにコメントすればチェックリストが作れます。

```
- [ ] タスク名
```

タスクを洗い出す中で気になる事などあったり、タスクの洗い出しが完了したら積極的にメンション飛ばしてやり取りしましょう。メンションは```@ユーザ名```で入れれます。

### 3. 開発

できるだけ小さい単位でコミットしましょう
コミットメッセージ間違えたら--amendで修正してください。

```
git commit --amend -m "修正メッセージ"
```

### 4.レビューを依頼

レビューを依頼する時には下記注意してください。

* タスクの終わったものはチェック。
* UIの確認が必要なものはGifアニメでキャプチャして添える
* ラベルで「レビュー待ち」にステータス変更
* 完全に終了の場合はプルリクから[WIP]を削除

以上です。その他気づいた事があれば追記していきます。
【CSS】テキスト関連

テキスト関連のCSSをまとめる。随時更新。

参考：[スタイルシートリファレンス](http://www.htmq.com/style/index.shtml)

#text-align
要素の中で文字の位置を指定する。tableやpタグで使う。

left
左寄せにします。
right
右寄せにします。
center
中央揃えにします。

#white-space
ソース中のスペース・タブ・改行の表示の仕方を指定する

normal
ソース中の連続する半角スペース・タブ・改行を、1つの半角スペースとして表示します。ボックスの大きさが指定されている場合には、その大きさに応じて自動的に改行されます。

pre
ソース中の連続する半角スペース・タブ・改行を、そのまま表示します。

nowrap
ソース中の連続する半角スペース・タブ・改行を、1つの半角スペースとして表示します。ボックスの大きさが指定されている場合にも、自動的に改行されません。

##vertical-align
親ボックスの縦方向の揃え位置を指定する。
インライン要素とテーブルセルのみ適用可能。ブロック要素には適用できない。

* baseline
デフォルト
* middle
中央揃え
dplyrで文字列オブジェクトで列名を指定したいとき（ad hoc）

うまい方法がないですが、メモ程度に。

## 参考
下のスレッドでは、evalを使うか、列の内容を呼び出して無理矢理評価するか、でした。
http://stackoverflow.com/questions/24569154/use-variable-names-in-functions-of-dplyr
Windows8.1で、CentOS7.0の仮想マシンを作ってみました。

Windows8.1で、CentOS7.0の仮想マシンを作ってみました。

=========================
【使用したPCのスペック】
・本体：Sony VAIO Duo 11
・OS：Windows8.1(64bit)
・プロセッサ：Intel(R) Core(TM) i5-3317U CPU@1.70GHz
・メモリ(RAM)：4.00GB

=========================
【手順１：BIOSの設定を変更】
・BIOS設定画面を起動し、「Advanced」タブの「Intel Virtualization Technology」の設定を「Enabled」に変更

以下の記事を参考にしました。
>VMwareで「ロングモードには対応していません」エラーが出たので対処
>http://www.teradas.net/archives/8704/

BIOSの設定画面の起動手順は、使用しているPCによって異なるようです。
ちなみに、筆者のPC（VAIO Duo 11）については、メーカーのサポートサイトに載っていました。

>[Windows 8]BIOSセットアップメニューを起動／終了する方法
>http://qa.support.sony.jp/solution/S1209070041484/



=========================
【手順２：VMware Player6.0のインストール】
>ダウンロード VMware Player6.0
>https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/6_0

・上記サイトより「VMware Player for Windows」の「ダウンロード」を選択
（VMware-player-6.0.3-1895310.exe（94.3M）がダウンロードされる）

・ダウンロードした実行ファイルを起動し、画面の指示に従ってインストール

=========================
【手順３：CentOS7.0のISOファイルをダウンロード】
>Download CentOS
>http://www.centos.org/download/

・上記サイトより「DVD ISO」または「Everything ISO」を選択
・ミラーサイトの一覧が表示されるので、任意のミラーサイトを選択してダウンロード
（CentOS-7.0-1406-x86_64-DVD.iso（3.9GB)　または、
　CentOS-7.0-1406-x86_64-Everything.iso（6.6 GB）がダウンロードされます）

ちなみに、筆者は初め、仮想マシン起動後に以下のような画面が表示され、
セットアップが行えませんでした。

>ISOLINUX 4.05 2011-12-09 ETCD Copyright (C) 1994-2011 H. Peter Anvin et al
>EDD: Error 8000 reading sector 2018812
>No DEFAULT or UI configuration directive found!
>boot:

原因は、ISOファイルがきちんとダウンロードできていなかっただけでした。。。
※問題のISOファイルをWindows8.1でマウントしようとすると、
　「ディスク イメージ ファイルが壊れています」エラーが表示されました。

再度ダウンロードし直したら、普通にセットアップできました。

=========================
【手順４：CentOS7.0のインストール】
・VMware Playerを起動し、「新規仮想マシンの作成」をクリック
・インストール元は「インストーラ ディスク イメージ ファイル」を選択
・参照先は、ダウンロードしたISOファイルを選択
・「ゲストOSの選択」は「Linux」を選択
・「バージョン」は「CentOS 64ビット」を選択
↓
仮想マシンの一覧に追加されるので、「仮想マシンを開く」を選択
↓
仮想マシンが起動するので、画面の指示に従ってセットアップを行います。

=========================

以上です。
出来てしまえば何てことはないのですが、
筆者のLinux経験が浅いためか、結構苦戦しました。。。

次回は、
CentOS7.0に、各種ミドルウェアを入れてみようと思います。
CSVからLSTVを出力するいくつかの実装

Railsで、ファイルの形式変換をする処理をRubyで実装していたのですが、何となく遅い。
裏でいつの間にか変換しておいてくれれば、Rubyにこだわる必要ないんだよなあ。

という事で、いくつかの実装系でどれくらい性能が違うのか試して見ました。
ターゲットは「OS寄りっぽい処理系のAWK」「スクリプト言語（というかRuby）」「コンパイル言語からGo」です。チョイスは好みで決めました。

# 検証処理

* 100,000行のCSVがある。

```
$ head data.csv 
pref,code,id,value,cost,rank
新潟,00662,6425,7086,9441,94
京都,07758,577,4514,8715,55
 :
```

* これのをLTSV形式に変換したファイルを出力したい。

```
$ head output.ltsv
pref:新潟<TAB>code:code<TAB>id:6425<TAB>value:7086<TAB>cost:9441<TAB>rank:94
pref:京都<TAB>code:07758<TAB>id:577<TAB>value:4514<TAB>cost:8715<TAB>rank:55
 :
```

#実装

## Ruby

```csv2lsv.rb
require 'csv'

work_dir = File.dirname(__FILE__)

File.open( File.join(work_dir,"ruby_output.ltsv"), "w" ) do |f|
  CSV.foreach( File.join(work_dir,"test_data.csv"), headers: true) do |line|
    f.puts line.map{|k,v| "#{k}:#{v}"}.join("\t")
  end
end
```

実行

```console
$ ruby csv2lsv.rb
```

## AWK

```csv2lsv.awk
BEGIN {
  FS = ","
}

NR==1{
  for(i=1;i<=NF;i++){
    header[i] = $i
  }
}

NR>1{
  printf ("%s:%s", header[1], $1)
  for(i=2;i<=NF;i++){
    printf("\t%s:%s", header[i], $i)
  }
  printf("\n")
}
```
実行

```console
$ awk -f csv2lsv.awk test_data.csv > awk_output.ltsv
```

## Go

<ins datetime="2014-07-26T12:00+09:00">
[追記:2014/07/26]
下記Goプログラムは、巨大CSVの処理時にRubyやAwkプログラムと挙動が異なり（出力行数や出力行順がちがう）、また出力結果に冪等性がないことがわかりました。修正中です…
</ins>

```csv2lsv.go
package main

import (
	"bytes"
	"encoding/csv"
	"flag"
	"io"
	"os"
)

func main() {
	flag.Parse()

	read_file, _ := os.Open(flag.Arg(0))
	write_file, _ := os.OpenFile(flag.Arg(1), os.O_WRONLY|os.O_CREATE, 0600)
	defer read_file.Close()
	defer write_file.Close()

	reader := csv.NewReader(read_file)
	writer := write_file

	// CSV to LSTV
	line := 0
	var headers []string
	for {
		// read a line
		columns, err := reader.Read()

		// EOF : exit loop
		if err == io.EOF {
			return
		}

		switch line {
		case 0:
			headers = columns
		default:
			ltsv := bytes.NewBufferString("")
			line_head := true

			for i := 0; i < len(headers); i++ {
				if line_head {
					line_head = false
				} else {
					ltsv.WriteString("\t")
				}
				buffer := headers[i] + ":" + columns[i]
				ltsv.WriteString(buffer)
			}
			writer.WriteString(ltsv.String() + "\n")
		}

		line++
	}

}
```

実行

```console
$ go run csv2ltsv.go test_data.csv go_output.ltsv
または
$ go build csv2ltsv.go ; ./csv2lstv  test_data.csv build_go_output.ltsv
```

# 実行速度
```console
$ time コマンド
```
を5回実行し、そのうち最良/最悪の2回を省いた3測定の平均時間を計算しました。

* ruby 2.1.2p95
* GNU Awk 3.1.8
* go1


| 実装 | 実行時間(s) |
| --- | -----|
| ruby | 4.42 |
| awk | 0.88 |
| go run | 1.80 |
| go build | 1.48 | 

※ go buildはビルド時間を含めない

# 思ったこと

Goは不慣れのため、ライブラリを使うなど最適化できる余地があるかもしれません。
アルゴリズムも微妙にそれぞれ違いますし。

実装の単純さは　Ruby >= AWK >> Go
性能は AWK > Go > Ruby
単純なファイル操作はAWKが優秀ですね！　なんでこんなに速いのですが、きっと内部で変態的なことが起きているのでしょう。

という訳で、AWKでごにょごにょ作ったファイル処理をRubyの[Childprocess](https://github.com/jarib/childprocess)をつかって裏で実行させるか、[whenenver](https://github.com/javan/whenever)で定期的に実行させると良いのかなと思ってます。
Macでアプリ毎にIMEの状態を保つ

MacOSXの標準の機能で日本語入力の設定をアプリ毎に設定できます。これでターミナルに移るたびに切り替えの必要なし！

設定は「キーボード」→「入力ソース」から、一番下の「書類ごとに入力ソースを自動的に切り替える」をチェックするだけ。

![スクリーンショット_2014-07-21_11_48_53.png](https://qiita-image-store.s3.amazonaws.com/0/10446/12079cc8-744f-6000-a980-e76f7862fca9.png)

こんな便利な機能今まで知らなかったなんてorz
Composer超入門

Composerをこれから試そうと思っている人向けの文書です。

# Composerって何？

ComposerはPHPプロジェクトの依存ライブラリを根こそぎvendor/以下にダウンロードしてくれるツールです。

詳しくは http://getcomposer.org/ を参照のこと。本家ドキュメントは超充実していますが、本家に和訳が無いせいか日本ではまだまだ普及段階といった印象です。

# Composer用語のまとめ

- composer.json - そのプロジェクト自身の情報と、依存するライブラリ情報などを記述するJSON形式のファイル。これを元にComposerが仕事をする。
- package - トップディレクトリにcomposer.jsonが含まれているVCSリポジトリまたはzipファイル。
- [Packagist](https://packagist.org/) - Composer用のpackage集約サイト。ここに登録されているpackageは短い名前でcomposer.jsonに記述できる。

# 開発者視点でのComposer+Packagistの良いところ

- 外部ライブラリ利用の精神的ハードルが下がる
  - Composerがオートローダーを提供してくれるので、個別にrequire文を書いたりする手間が要らなくなる
  - [Symfony Components](http://symfony.com/components)などの巨大ライブラリへの抵抗感が薄れる

# 開発リーダー視点でのComposer+Packagistの良いところ

- 利用しているライブラリの出所が明らかになる
- 利用ライブラリのバージョンをそろえる方法が標準化できる
  - 社内ライブラリを使うときなど、 git submodule を使ってウギャーってならずに済むかも
- 依存ライブラリ・ツールをプロジェクトごとにインストールできるので、システムグローバルにインストールされたもののバージョンの違いで悩まされる心配が減る
  - 特にPHPUnitをComposer管理するのはオススメです。一部マシンに古いPHPUnitが入っていてテストが通らないという事件は過去のものになります。

# ライブラリ作者視点でのComposer+Packagistの良いところ

- Packagistを使う場合はGitHubかBitBucketの利用がほぼ前提になっており、VCSだけで管理を完結させることができる
 - GitHubのservice hookに対応しており、git pushするだけでPackagistにも変更が反映される
 - 「v1.0.0」のようなtagを打てば、それがpackageのバージョン番号になる
 - 安定版と開発版の管理もbranchやtagの操作で実現できる

packageの管理者がいちいちWebインターフェースを操作する必要がないのは良い仕組みだと感じます。残念ながら、packageの登録時だけはブラウザを開く必要があります。念のため。

# その他文書へのリンク

- https://getcomposer.org/doc/ - 本家ドキュメント。PDFは100ページ超です。
- http://kohkimakimoto.github.io/getcomposer.org_doc_jp/doc/ - 本家ドキュメントを個人で和訳されている方がいらっしゃいます。まだ途中みたいですけど、続きも期待してます！
paiza learningの足し算問題が解けない


paiza learningの足し算問題。内容は、「半角スペースで区切られた2数を足して標準出力に出す」というもの。
pxemだと、「.\_\.\_\.+.nak.-.o.pxem」と書ける。

これがBash単体だとどうしても解けない。

```bash:1.sh
read line
a=($line)
expr ${a[0]} + ${a[1]}
```

```bash:2.sh
read line
a=($line)
echo $((a[0]+a[1]))
```

```bash:3.sh
read line
r=0
for i in $line;do
r=$((r+i))
done
echo $r
```

いずれも、「提出前動作確認」ではSuccessになるのだが、提出してみるとランタイムエラーになってしまう。

一応こうすれば100点になる。

```bash:4.sh
awk '{n+=$1+$2} END{print n}'
```

しかし、気持ち悪い。なんとかできないだろうか。
Jenkins 環境セットアップ


## 環境
Mac OS X


## Jenkins インストール
Homebrew でインストールする。

```
$ brew install jenkins
```

## Jenkins を起動する

```
$ java -jar /usr/local/opt/jenkins/libexec/jenkins.war
...
情報: Jenkins is fully up and running
```

起動が成功したら、http://localhost:8080/ にアクセスすると Jenkins の画面が表示される。
## よく使うプラグインをインストールする

| 名称| メモ |
|:---|:-----|
| AnsiColor Plugin | コンソールの色付け表示 |
| Build Trigger Badge Plugin | ビルドトリガーをアイコン表示する |
| Copy project link plugin | ジョブのコピーリンクを追加 |
| EnvInject Plugin | 環境変数設定 |
| Extended Choice Parameter plugin | ビルドパラメータの選択指定の拡張 |
| Extensible Choice Parameter plugin | ビルドパラメータの選択指定の拡張 |
| JobConfigHistory Plugin | ジョブ設定の更新履歴を保持 |
| Git Plugin | リポジトリ対象に Git を追加 |
| Parameterized Trigger Plugin | ビルドパラメータの引き継ぎ |
| Rebuild Plugin | ビルド再実行 |
| Timestamper | コンソールにタイムスタンプを表示 |
UrlFetchApp.fetch() などのレスポンスをGoogleドキュメントに保管

Google Apps Scriptでの開発時の簡単なTips。

Google Apps Scriptではデバッグ用にLogger.log()を使って出力することがありますが、ログ領域にはサイズ制限があるため、出力が途中で途切れてしまうことがままあります。特に、サーバーから得た情報を確認したい場合などにこの問題に遭遇します。また、ログ領域では検索などもやや不便です。

そんな時には、Googleドライブにドキュメントを作成し、そこに出力することが便利です。

たとえば、UrlFetchApp.fetch()の出力をドキュメントで作成するには、次のようなコードを入れるだけです。

```js:sample

var response = UrlFetchApp.fetch(url);

var doc = DocumentApp.create('デバッグ用のFetch結果'); 
var body = doc.getBody();
body.appendParagraph(response.getContentText());
```
上の例では、「デバッグ用のFetch結果」というドキュメントが作成されるので、中身を確認後に不要になった時点で削除します。
タブアイテムにbadgeを取り付ける方法

Githubに上げられているandroid-viewbadgerのjarファイルを活用すればいとも簡単にバッジを取り付けることが出来ます。

Github参考URL
https://github.com/jgilfelt/android-viewbadger

しかし、アイコンとオーバーラップするバッジの表示位置設定されていなかったことや、バッジの色の指定が出来なかったこと、また４つ以上のタブを作った時に横幅が足りなくなって潰れてしまうことがあったことなどで、個人的にはバッジを作って取り付ける方が柔軟性が高いように感じました。

<h2>
バッジを自分で作ってみる
</h2>

そこで、自分でバッジを作成してみます。

res/drawbable/
badge.xml

```
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="oval" >

    <stroke android:width="2dp" android:color="#3cb371" />

    <corners android:radius="10dp"/>

    <padding android:left="2dp" />

    <solid android:color="#3cb371"/>

</shape>
```

res/layout/
tabbadge.xml

```
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="0dip" 
    android:layout_height="64dip"
    android:layout_weight="1" 
    android:layout_marginLeft="-3dip" 
    android:layout_marginRight="-3dip" 
    android:orientation="vertical"
    >
    
    <ImageView
        android:id="@+id/chat_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/tabicon"
        android:layout_centerHorizontal="true"/>

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/chat_icon"
        android:layout_toRightOf="@+id/chat_icon"
        android:layout_marginLeft="-8dp"
        android:layout_marginTop="0dp"
        android:paddingTop="2dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:paddingBottom="2dp"
        android:textSize="8sp"
        android:textStyle="bold"
        android:textColor="#ffffff"
        android:background="@drawable/badge"
        />
</RelativeLayout>
```


badge.xmlはTextViewとしてImageViewの上に配置します。（RelativeLayoutなので自分で細かい位置を設定する）ここで指定したImageViewはタブアイコンとなります。

次にjavaファイルのonCreate内を見てみます
<pre>LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		View chatTab1 = inflater.inflate(R.layout.tabbadge, null);
		TextView tv1 = (TextView) chatTab1.findViewById(R.id.tv1);</pre>
まずLayoutInflaterでtabbadge.xmlのビューを作成しました。setContentViewではそのクラスの元になるview,このlayoutInflaterはあくまでもバッジの作成のみに使用されています。


<pre>TabSpec firstTab = tabHost.newTabSpec("First").setIndicator(chatTab1)
				.setContent(R.id.first_content);
		tabHost.addTab(firstTab);
</pre>
タブを作った後はsetIndicatorの中に上で定義したchatTab1を入れてあげれば完成。

こうすることでバッジの色や位置を自由に指定することが可能になり、タブの数が４、５個あっても大きさと場所さえ上手く調整すれば綺麗に表示されるようになります。



バッジの作り方参考URL
http://stackoverflow.com/questions/6394768/adding-badge-to-tab-in-android
WebViewにVersionNameとVersionNumberを指定する

WebViewのアプリ作成時には、サーバー側でどこから流入してきたのかトラックを取るためにUserAgentにVersionNameと"from-app","from-android"といったような流入元を指定してあげると便利です。

まずAndroid ManifestでVersionNameが指定されているのかを確認します。

```
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.exmaple.projectname"
    android:versionName="1.0" >
```

次にJavaの中でパッケージ情報を獲得するコードを書きます。

<pre>try {
	packageInfo = getPackageManager().getPackageInfo(getPackageName(),getPackageManager().GET_META_DATA);
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}

String userAgentString = view.getSettings().getUserAgentString();
view.getSettings().setUserAgentString(
				userAgentString + " from-app v" + packageInfo.versionName);
</pre>

この後でview.getSettings().getUserAgentString()のStringを作成してログをとればサーバー側で確認せずともandroid側からも簡単に確認できます。
Android Studioで覚えておくと便利なこと


EclipseからAndroid Studioに乗り換えたのですが、設定画面の見方やショートカットの違い等にいろいろ戸惑ったのでメモ。

※Macの場合での説明中心です。

→Windowsの説明が追加されました！ありがとうございます！

## 設定画面

Menu > Preferences からAndroid Studio全体の設定が確認・変更できます。
Windowsの場合は、 File > Settings... から確認できるようです。

#### テーマを変更する

Appearance > Theme

#### マウスオーバーでドキュメントを表示する

Editor > Show quick doc on mouse over

#### 行番号・空白文字をつける

Editor > Appearance > Show line numbers

Editor > Appearance > Show whitespaces

#### ゲッター・セッター生成時にPrefixやSuffixを除く

通常、Androidのコーディング規約に沿って、privateなフィールドにはmをつけることがあるかと思います。しかし、getterやsetterを自動生成するときにgetmXX、setmXXとなっては困ります。これを防止するには下記を参照してください。

Code Style > Java > Code Generation > Name prefix にmを入れておく

#### 自動インポート

Android Studio(idea)では編集する度に自動的に保存されています。そこで、自動保存時にオプティマイズインポートを設定することで、インポートを気にすることが（ほとんど）なくなります。

Editor > Auto Import > Optimize import on the fly  
Editor > Auto Import > Add unambiguous on the fly

## ショートカット

デフォルトではショートカットのキーバインドが異なります。Eclipseのキーバインドに変更することも可能です。変更や確認がしたい場合は、設定画面のKeymapというところを参照してください。

option…⌥  
control…⌃  
command…⌘  
shift…⇧

で説明しています。

|名前|説明|Mac|Win|
|:--|:--|:--|:--|
|Rename|名前の変更|⇧F6|⇧+F6
|Auto Format|自動フォーマット|⌘⌥L|Ctrl+Alt+L
|Organize Imports|自動インポート|⌃⌥O|Ctrl+Alt+O
|Toggle Comment|選択行のコメント化・アンコメント化|⌘/ (Eclipseと同様)|Ctrl+/
|Extract variable|ローカル変数の定義(Eclipseなら⌘2 L)|⌘⌥V|Ctrl+Alt+V
|Extract field|フィールドの定義(Eclipseなら⌘2 F)|⌘⌥F|Ctrl+Alt+F
|Extract constant|定数定義|⌘⌥C|Ctrl+Alt+C
|Exctract method|メソッドの定義|⌘⌥M|Ctrl+Alt+M
|Move Tab|右のタブや左のタブに移動|⇧⌘[ or ]|Alt+← or → 
|Run|アプリをビルドして実行する|⌃R|⇧+F10
|Debug|アプリをビルドしてデバッグ実行する|⌃D|⇧+F9
|Delete Line|行を削除する|⌘⌫|Ctrl+Y
|Declaration|定義にジャンプする|⌘B|Ctrl+B
|Back|戻る（定義にジャンプしてから戻るなど）|⌥⌘←|Ctrl+Alt+←
|References(Find Usages)|参照されている箇所を表示する|⌥F7|Alt+F7
|Quick fix(Show Intention Actions)|行またはブロックのエラーの修正方法を表示する|⌥enter|Alt+Enter
|Add JavaDoc|クラスやメソッドのJavaDocを追加する|/**enter|/**enter
|Generate|オーバライドやコピーライトの作成|⌘n|Alt+Insert
【個人メモ】Golang HTTP リクエストの内容をログに出す

# サンプルを元に。

[Google Groupの投稿](https://groups.google.com/d/msg/golang-nuts/s7Xk1q0LSU0/vSvGnerlDZ4J)を元に、以下のスクリプトを書いた。
元にするスクリプトがあるため、著作権は元のスクリプトに準ずる。

```go
package main

import (
	"bytes"
	"fmt"
	"log"
	"net/http"
	"text/template"
)

type LineOfLog struct {
	RemoteAddr  string
	ContentType string
	Path        string
	Query       string
	Method      string
	Body        string
}

var TemplateOfLog = `
Remote address:   {{.RemoteAddr}}
Content-Type:     {{.ContentType}}
HTTP method:      {{.Method}}

path:
{{.Path}}

query string:
{{.Query}}

body:             
{{.Body}}

`

func Log(handler http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		bufbody := new(bytes.Buffer)
		bufbody.ReadFrom(r.Body)
		body := bufbody.String()

		line := LineOfLog{
			r.RemoteAddr,
			r.Header.Get("Content-Type"),
			r.URL.Path,
			r.URL.RawQuery,
			r.Method, body,
		}
		tmpl, err := template.New("line").Parse(TemplateOfLog)
		if err != nil {
			panic(err)
		}

		bufline := new(bytes.Buffer)
		err = tmpl.Execute(bufline, line)
		if err != nil {
			panic(err)
		}

		log.Printf(bufline.String())
		handler.ServeHTTP(w, r)
	})
}

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "OK")
	})

	http.ListenAndServe(":8080", Log(http.DefaultServeMux))
}
```

# ビルド・実行

main.goという形で上のスクリプトを保存して、

```
> go build main.go
```

でビルドして、

```
> ./main
```

で実行する

# テスト

## curlコマンドによるテスト

以下コマンドを打つ。
curlコマンドで、先ほど立ち上げたサーバに対しリクエストを送る。

```
> curl -X POST 'http://localhost:8080/test?hoge' -d '{"message": "Welcome to underground"}'
```

立ち上げたサーバ側の標準出力に、リクエストの内容が表示される。

![Screen Shot 2014-07-21 at 9.20.49.png](https://qiita-image-store.s3.amazonaws.com/0/3985/30ea48ed-a9f5-d8b5-29e9-9377ee94cf5e.png)

## faraday経由でテスト

faradayを使って、リクエストを送ってみる。

```test.rb
require 'faraday'
require 'json'

conn = Faraday.new(url: 'http://localhost:8080/') do |faraday|
  faraday.request :url_encoded
  faraday.response :logger
  faraday.adapter Faraday.default_adapter

end

conn.post do |req|
  req.url '/'
  req.headers['Content-Type'] = 'application/json'
  req.body = { user: { id: 1, name: 'futoase' }, message: 'Welcome to underground...' }.to_json
end
```

以上のスクリプトを実行し、
サーバ側にリクエストを送る。

```
> ruby test.rb
```

結果。faradayのREADME.mdに書いてある通り。

![Screen Shot 2014-07-21 at 9.35.45.png](https://qiita-image-store.s3.amazonaws.com/0/3985/26ff737e-0af9-e3a2-d1f3-2924a74d37fe.png)

# 終わり

目的がデバッグであり、リクエストの内容を観たいのであれば、
[net cat](http://netcat.sourceforge.net/)を使おう。

```
> nc -l 8080
```

で終わる。

```
> curl -X POST http://localhost:8080/ -H "Content-Type: application/json" -d '{"message": "Welcome to underround"}'
```

![Screen Shot 2014-07-21 at 9.42.41.png](https://qiita-image-store.s3.amazonaws.com/0/3985/05c6e863-7afc-af61-6c38-659913b388a3.png)