OmniAICreator/Qiita-1.07M huggingface dataset:
Mac 環境構築メモ

自分用メモ。
新しく Mac 環境を構築する際に必ず入れるであろうものを厳選していく。

## Mac の諸々設定

- Dock の配置を右に。自動で隠れるようにする
- ディスプレイOFFと同時にスリープしないようにする
- キーボードのキーリピートを最速にする
- 修飾キーの `caps` を `control` に変更
- 入力ソースの切り替えショートカット (⌘+スペース) を OFF にする
- マウス、トラックパッドのカーソル移動を早くする 
- コンピュータ名を適宜変更する
- 時計表示で日付も合わせて表示させる


## 準備

以下のアプリケーションをインストールする。

| 名称 | メモ |
|:-----------|:------------|
| Google Chrome | ブラウザ |

## AppStore 経由でインストールするアプリケーション

| 名称 | メモ |
|:-----------|:------------|
| DaisyDisk | ディスク容量を可視化してくれる |
| JPEGmini | JPEG 圧縮 |
| LINE | LINE クライアント |
| The Unarchiver | 圧縮・解凍ツール |
| Xcode | IDE |


## 直接インストールするアプリケーション

| 名称 | メモ |
|:-----------|:------------|
| AppCleaner | アプリケーションを完全削除する |
| Atom | エディタ |
| Charles | プロキシツール |
| Clipy | クリップボード拡張 |
| Cyberduck | SFTP クライアント |
| DiffMerge | Diff ツール |
| Docker for Mac | Docker クライアント |
| Dropbox | オンラインストレージ |
| Firefox | ブラウザ |
| Google IME | Google 謹製 IME |
| ImageOptim | 画像最適化ツール |
| IntelliJ IDEA | IDE |
| iTerm2 | ターミナル |
| Java | JDK |
| MySQL Workbench | MySQL GUI クライアント |
| Rectangle | ウィンドウサイズ・位置をショートカットキーで変更する |
| Skype | チャットツール |
| Slack | チャットツール |
| SourceTree | Git GUI クライアント (AppStore経由だとv2系がインストール出来ない) |
| Vagrant | 仮想化ツール |
| VirtualBox | 仮想化ツール |
| Visual Studio Code | エディタ |
| WebStorm | IDE |

## Homebrew

[Homebrew](http://brew.sh/) をインストールする。

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

brew install でインストールするもの。

| 名称 | メモ |
|:-----------|:------------|
| csshx | 複数ターミナル一括実行 |
| git | Git |
| go | Golang |
| jpeg | JPEG 最適化 |
| maven | Apache Maven |
| memcached | メモリキャッシュ |
| mobile-shell | mosh |
| mysql | MySQL |
| node | Node.js |
| nodebrew | Node.js マネージャ |
| optipng | PNG 最適化 |
| peco | 標準出力から、行レベルで選択・インクリメントサーチできるツール |
| postgresql | PostgreSQL |
| tree | 配下のファイル・ディレクトリをツリー表示する |
| Vim | `brew install vim --with-lua` で入れる |

## npm

npm install -g でインストールするもの。

| 名称 | メモ |
|:-----------|:------------|
| bower | Web 用パッケージマネージャ |
| casperjs | PhantomJS ユーティリティ |
| express | Node.js Web フレームワーク |
| grunt-cli | ビルドツール |
| gulp | ビルドツール |
| JSHint | 構文チェッカー |
| nodebrew | node バージョンマネージャ |
| node-inspector | node デバッグツール |
| phantomjs | ヘッドレスWebKit |
| tsd | TypeScript 型定義ファイル (d.ts) マネージャ |
| typescript | TypeScript |

## go get

go get でインストールするもの。
brew で入れても良いものもある。

| 名称 | リポジトリ | メモ |
|:-----------|:-----------|:------------|
| godoc | code.google.com/p/go.tools/cmd/godoc | Goドキュメントツール |

## apm

とりあえず、今手元でインストールされていたものを書いておく。

```
├── atom-csscomb@1.9.5
├── atom-material-syntax@0.3.3
├── atom-material-ui@0.8.1
├── autocomplete-go@0.2.0
├── autocomplete-ruby@0.1.0
├── environment@1.1.1
├── git-history@3.2.0
├── go-config@0.3.3
├── go-get@0.1.1
├── go-plus@3.5.3
├── language-nginx@0.6.1
├── language-terraform@0.7.2
├── linter@1.11.3
├── linter-eslint@6.0.0
├── linter-rubocop@0.4.7
├── linter-ruby@1.2.2
├── open-recent@5.0.0
├── rubocop-auto-correct@1.2.0
├── seti-syntax@0.4.1
├── seti-ui@0.8.1
├── sort-lines@0.14.0
├── split-diff@0.7.4
└── yard@0.3.1
```
RSpecとCapybaraでつまづいたので

# ArgumentError: rack-test requires a rack application, but none was given
Rails Tutorialを見ていて、
http://railstutorial.jp/chapters/static-pages?version=4.0#sec-TDD
を実践中に、Capybaraを使ってRSpecを回そうとしたところ、下記のようなエラーに遭遇。

>  1) Static pages Home page should have the content 'Sample App'
     Failure/Error: visit '/static_pages/home'
     **ArgumentError: rack-test requires a rack application, but none was given**

spec/spec_helper.rbで
`require 'capybara/rspec'`
としているのに・・・
Tutorialでも動いているのに・・・オカシイ。

# Seleniumの導入
下記URLを見て、Capybaraの設定してないと気づく。
http://stackoverflow.com/questions/17666623/running-capybara-without-rack-produces-errors-when-using-url-parameters

```:spec/spec_helper.rb
Capybara.configure do |config|
  config.run_server = false
  config.default_driver = :selenium
  config.app_host = 'http://0.0.0.0:3000/' # localhost(rails s)
end
```

これでRSpecが一応動くようになった。
(テスト駆動開発をまだちゃんと理解してないのでアレなんだが、
RSpec回すたびに、ブラウザが表示されてしまうのはどうにかならないかな。。。)
追記：これはseleniumの仕様・・・らしい？

参考までに、
Ruby - 2.1.1
Rails - 4.1.4
RSpec - 3.0.2
Capybara - 2.4.0
swift:Storyboardから@IBOutletを作った時にproperty not initialized at super.init callのエラーが出た場合の対処

# StoryBoardから@IBOutletのソースを生成します
## こんなソースが生成されます
```swift:SampleViewController
    @IBOutlet strong var btn: UIButton
```
## コンパイル時エラーが発生
`
<unknown>:0: error: property 'self.btn' not initialized at super.init call
`

# strongを外しましょう

```swift:SampleViewController
    @IBOutlet var btn_info: UIButton
```
Node.js + Sequelize で複数レコードの更新

備忘録です．
Node.js の ORM である Sequelize を使って検索した複数レコードに対して更新をかける処理を書きます．
Document( http://sequelizejs.com/docs/1.7.8/installation )では詳しく触れてなかったような。。。

# 環境

+ MacOSX (10.9)
+ Node.js (v0.10.29)
+ npm (1.4.14)
+ Squelize (1.7.9)
+ mysql (2.4.1)
+ Underscore.js (1.6.0)

# 対象レコード
サンプルなので適当です．
`id: 1, title: 'sample', description: 'aiueo'`,
`id: 2, title: 'sample', description: 'waaai'`
とか適当に用意してみた．

# サンプルコード
```js:sample.js

// Sequelize の準備
var Sequelize = require('sequelize');
var sequelize = new Sequelize('sample', 'user', 'password', {
  host: 'localhost',
  port: 3306
});

// Underscore.js 使いたいひと
var _us = require('underscore');

// テーブル定義，作成
var Sample = sequelize(define('Sample', {
  title: Sequelize.STRING,
  description: Sequelize.TEXT
});
Sample.sync();

// 検索，更新
Sample.findAll({where: {title: 'sample'} })
  .success(function(sample) {
    sample.forEach(function(element) {
      element.updateAttributes({
        description: 'pure'
      }).success(function() {
        console.log('success.');
      });
    });

    // Undersocre.js 使いたいひと
    _us.each(sample, function(element, index, array) {
      element.updateAttributes({
        description: 'underscore'
      }).success(function() {
        console.log('success.(underscore)');
      });
    });
  });
});
```

変わったかな？

# ひとこと
今日は目が痛い日でつらたん．コンタクトしたまま寝てはいけない…
LBFGSを使ってみる

# はじめに
`f(x)=x^4 - 4x^3`の最小値を、LBFGSという手法を用いたCommon Lispのプログラムを書いて求めます。
使うライブラリはcl-liblbfgs。liblbfgsというLBFGS法のCによる実装をCommon Lispから呼べるようにしたもので、私が書いたものです^^;  

LBFGSは、従属変数に制約のない関数の最小値を求める問題を解いてくれます：`minimize f(x), x = (x1, x2, ..., xN)`
今回の場合、`f(x)=x^4 - 4x^3`で、`N=1`です。

# cl-liblbfgsのインストール

1. [liblbfgs](http://www.chokkan.org/software/liblbfgs/index.html)のビルド
2. https://github.com/mhkoji/cl-liblbfgs をロード
3. liblbfgsをビルドして`liblbfgs.so`というファイルが生成されたことを確認したら、`(push <path/to/liblbfgs.so> cffi:*foreign-library-directories*)`

# 最適化のコード

```
(use-package :cl-liblbfgs)

(cffi:defcallback progress :int
    ((instance  :pointer)
     (xs        :pointer)
     (g         :pointer)
     (fx        lbfgsfloatval-t)
     (xnorm     lbfgsfloatval-t)
     (gnorm     lbfgsfloatval-t)
     (step      lbfgsfloatval-t)
     (n         :int)
     (k         :int)
     (ls        :int))
  (declare (ignore instance xs g n ls))
  (format t "Iteration ~A:~%" k)
  (format t "  fx = ~A~%" fx)
  (format t "  xnorm = ~A, gnorm = ~A, step = ~A%" xnorm gnorm step)
  (format t "~%")
  0)


;; f(x) = x^4 - 4x^3
;; g(x) = 4x^3 - 12x^2
(cffi:defcallback eval-1 lbfgsfloatval-t
    ((instance :pointer)
     (xs       :pointer)
     (g        :pointer)
     (n        :int)
     (step     lbfgsfloatval-t))
  (declare (ignore instance step n))
  (let ((x (cffi:mem-ref xs 'lbfgsfloatval-t 0)))
    (let ((fx (- (* 1.0d0 x x x x) (* 4 x x x)))
          (gx (- (* 1.0d0 4 x x x) (* 12 x x))))
      (setf (cffi:mem-aref g 'lbfgsfloatval-t 0) gx)
      fx)))

(defun main-1 ()
  (cffi:with-foreign-objects ((xs 'lbfgsfloatval-t 1)
                              (param '(:struct lbfgs-parameter-t)))
    ;; 0.0d0だと死ぬ
    (setf (cffi:mem-aref xs 'lbfgsfloatval-t 0) 100.0d0)
    (lbfgs-parameter-init param)
    (let ((ret (lbfgs 1
                      xs
                      (cffi:null-pointer)
                      (cffi:callback eval-1)
                      (cffi:callback progress)
                      (cffi:null-pointer)
                      param)))
      (format t "L-BFGS optimization terminated with status code = ~A~%"
              ret)
      (format t "  x = ~A~%" (cffi:mem-aref xs 'lbfgsfloatval-t 0)))))

```
`eval-1`がライブラリから繰り返し呼ばれ、各`x`での`f(x)`の値と、`f(x)`の微分である`g(x)`の値を求めます。
LBFGSはこれらの値をもとに次の`x`の値を決めるようです。`f(x)`は関数の返り値となり、`g(x)`は`g`に直接代入します。

これを実行すると、最終的に`x`が3付近の値になります。
`f(x)=x^4 - 4x^3`は`x=3`のときに最小となるので、だいたいあっているわけです。
追記：利用していない請求が来たのですが！　原題：実質無料？（月$0.50)のfortacloudの無料VPSサービスの使い方 

#追記：利用していない請求が来たのですが！

利用していない請求が来たのですが！しかもカード情報を削除できない！こうなったら番号を失効させて変更すると色々と手数料と支払いの変更が必要になります。ああ、なんてことだ！$30って見に覚えのない請求が来ました。これは本当に騙されたのか？
サポートに連絡しても機械的なメッセージが返されるだけなので**もうこれは無料VPS欲しさに集ってきた人々から良心的（笑）なお金を巻き上げる為の装置と化している！**

これを見てくれ！
http://www.serchen.com/company/fortatrust/#6706
>I am still not able to get them to cancel the service. You can never reach them on the phone directly and all calls go to an answering service that always claims they can't do anything. Avoid this company, please. I think I'm the most affected. We are a non-profit church and we paid almost U$800 for a year dedicated server. They are avoiding all phone calls, tickets, emails. We still can't have access to the server (we paid 3 weeks ago). This is the worst hosting company I've ever seen! There is no way to contact support. They are not returning my emails at all for days! 
One star is a gift for them, this is one of the companies you have to write down in your blacklist. So, I paid, and I don't have access to the server yet. What am I supposed to think with this?

欲しい情報だけ抜き出すと、**通話、チケット、電子メールのすべてに応答しない。しかもサービスを利用できない。**利用していないのにカードで支払い手続きが行われたお金を返却しない。

なんてことだ！この記事を見て試しに利用してしまった人には本当に申し訳ないことをした。
本当に人柱と化してしまうとは　OTL　


#fortacloud？なにそれ？

　全くもって分かりません。新興のサーバーレンタルサービスですか？FREE VPSに惹かれて蝶のように羽ばたいて来てしまいました。日本語の資料もないのでせっかくだから人柱というものになってみました。気になったなら申し込んでも良いのじゃないかな？もちろん自己責任ですが。

http://fortacloud.co/


#FREEと言いながら１月あたり$0.50です！

　そのようです。最初の月は$0.55 USDでその後に$0.50 USDとなるようです。FREEじゃぁなかったんですね。

#１回VPSイメージを作成後、削除そして再作成すると！

　このアカウントで無料のままVPSを使えなくなります。ユーザーインターフェースがしっかりしているのでサービス内部もしっかりしているのかと思いきや、一度作って削除したホスト名は登録できないなど、かなり内部はいい加減な状態管理のようです。２４時間サポートのようですが、投稿したチケットの返答が自動返信と、かなりアレのようです。
　この手のカッコイイユザーインターフェースの普及によってバックエンドがアレになるのは本当にアレです。はい。びんぼっちゃまです。

#サービスの利用規約、本当に注意してね。

http://www.fortatrust.com/aup/

　海外のレンタルサーバーにありがちな事ですが、通信に関しては有料である事があります。e.g. Amazon AWS
　これもその手のサービスです。5TB分の通信を超えると通信に関してさらに請求されるようです。（要調査）

#とりあえず、無料のアカウントだとCentOSの一択だね

　現在無料で選べるおすすめのOSイメージはCentOS6.5 ISOだと思いますよ。

#一人１つしか無料VPSは申し込めないよ

　注文まで画面は遷移しますが、無料VPSの購入手続きを使用とすると弾かれます。ですよね。あああ、でも、大人の力で１人で何個も契約しちゃうと日本からサービスの申し込みを弾かれちゃうから１人１つを守ったほうが良いと思うよ。

#Networkingでルーターの設定をしないとVPSにアクセス出来ないよ

　自宅サーバーと同じ要領でルータのポートを開放しないと接続できないよ。とりあえず、セキュリティーは完全無視でポートフォアワーディングを1-65000にしてInboundとOutboundを1-65000まで許可しちゃおう！

　これでVPSと直通になるよ。だけど、やっぱりセキュリティーの設定的にすごく良くないから見なおしたほうが良いと思うよ。


#終わり。

　月0.5ドルでサーバーを借りることが出来たぞ！サービスの質が改善したら多分、全世界で流行ると思うよ。めでたしめでたし。俺達の戦いはこれからだ！

#蛇足（海外での評判）

* https://www.trustpilot.com/review/www.fortatrust.com
* http://www.serchen.com/company/fortatrust/
* http://www.webhostingstuff.com/review/FortaTrust.html
* http://top10-websitehosting.co.uk/fortatrust-review/
* http://forum.youhosting.com/topic4699-fortatrust-vps-review.html

　特に気になったのがコレ

`Worst hosting provider I ever used`

うん。まったくもってそのとおりだと思う。
Vagrant Tips#3 rbenvを使ったRuby環境をセットアップする(centos)

##[Vagrant Tipsのサマリページはこちら](http://qiita.com/yukimura1227/items/7e34bb12d36e8aa2e6c3)

# この記事のサマリ
rubyを利用する際に、いろいろなバージョンを切り替えてお試しできるrbenvが非常に便利なので、vagrantで構築するsandbox環境でrbenvをセットアップするスクリプトを紹介します。

# 対象読者
いろんなバージョンのRubyをお手軽に試してみたい方

# 動作確認バージョン
`vagrant version`の結果
Installed Version: 1.7.4

# 経緯
rubyの勉強するのに、rbenvがオススメと聞いたので。

# rbenvを使ったRuby環境をセットアップする(centos)
Rubyを実行する上で、当然Ruby本体のインストールが必要なのですが、Ruby自体のバージョンや、実装方法（CRubyやJRubyなどなど）が存在するため、単にRubyのインストールを行っても、バージョン依存でうまく動かなかったりすることがあります。
そんな時、このrbenvというパッケージが役に立ちます。このrbenvを利用することで複数のRubyのバージョンをインストールすることができ、容易にバージョンを切り替えることができるようになります。
Rubyであれこれ実験する時用に、Vagrantにrbenv＆Ruby 2.1.2のインストールさせましたので、Tipsとして残しておきます。

```ruby:VagrantFile
Vagrant::Config.run do |config|
  config.vm.box = "centos64_6_5"
  config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box"

  config.vm.provision "shell", path: "setup_rbenv.sh"

end
```

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

RBENV_INSTALL_DEST_DIR=/usr/local/rbenv
COMMON_BASH_SETTING_FILE=/etc/profile

echo "install gcc..."
sudo yum -y install gcc

echo "install openssl-devel..."
sudo yum -y install openssl-devel

echo "instal readline-devel..."
sudo yum install -y readline-devel

which git
if [ $? -ne 0 ]
then
  echo "install git..."
  sudo yum -y install git
fi

echo "download rbenv..."
sudo git clone https://github.com/sstephenson/rbenv.git ${RBENV_INSTALL_DEST_DIR}

# add rbenv path To $PATH
echo "append rbenv path info To ${COMMON_BASH_SETTING_FILE}..."
echo "export RBENV_ROOT=\"${RBENV_INSTALL_DEST_DIR}\"" >> ${COMMON_BASH_SETTING_FILE}
echo 'export PATH="${RBENV_ROOT}/bin:$PATH"' >> ${COMMON_BASH_SETTING_FILE}
echo 'eval "$(rbenv init -)"' >> ${COMMON_BASH_SETTING_FILE}

# ${COMMON_BASH_SETTING_FILE} reload
echo "${COMMON_BASH_SETTING_FILE} reload"
source ${COMMON_BASH_SETTING_FILE}

echo "download rbenv plugin(ruby-build)..."
git clone https://github.com/sstephenson/ruby-build.git ${RBENV_INSTALL_DEST_DIR}/plugins/ruby-build

# install ruby
echo "ruby install..."
rbenv install -v 2.1.2

rbenv global 2.1.2

rbenv rehash

# set rbenv owner
chown -R vagrant:vagrant ${RBENV_INSTALL_DEST_DIR}
```
rootユーザでもvagrantユーザでも利用できるように、/usr/local/rbenvにrbenvのインストールを行い、/etc/profileにパスの設定を記述しています。
また、rbenvのownerは、vagratユーザにしています。
Vagrant Tips#2 Oracleのjdk(1.7系)をインストールさせる

##[Vagrant Tipsのサマリページはこちら](http://qiita.com/yukimura1227/items/7e34bb12d36e8aa2e6c3)

# この記事のサマリ
`vagrant up`したら、jdk1.7系を自動的にダウンロードして、そのままjavaが使える環境が出来上がります。

# 対象読者
java(7系)のsandbox環境が欲しい方

# 動作確認バージョン
`vagrant version`
Installed Version: 1.7.4

# 経緯
さくっと利用できるjavaのsandbox環境が欲しかったので。

# Oracleのjdkをインストールさせる
javaで開発している場合は、自動的にjdkをインストールしたいことがあると思います。ただ、yumなどを利用して実行すると、デフォルトの設定では自動的にopen-jdkがインストールされてしまいます。しかしながら、実際の開発ではoracleが提供するjdkを利用したいというケースは多いのではないでしょうか？ここでは、wgetでoracleのjdkを取得し、`vagrant up`を実行した際に、oracleから取得したjdkを自動的にインストールするようなサンプルを紹介いたします。
puppetやchefのようなツールは利用せず、一番シンプルなshellによるprovisioningを行っています。

```ruby:Vagrantfile
Vagrant::Config.run do |config|
  config.vm.box = "centos64_6_5"
  config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box"

  config.vm.provision "shell", path: "setup_jdk7.sh"

end
```

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

BASE_DIR="/vagrant"
RPM_DIR="${BASE_DIR}/rpm"
JDK_VERSION=7u80
BUILD_NO=b15
JAVA_RPM_NAME="jdk-${JDK_VERSION}-linux-x64.rpm"
JDK_DOWNLOAD_URL="http://download.oracle.com/otn-pub/java/jdk/${JDK_VERSION}-${BUILD_NO}/${JAVA_RPM_NAME}"

# create dir
if [ ! -d ${RPM_DIR} ]
then
  mkdir -p ${RPM_DIR}
else
  echo "${RPM_DIR} Is Already Exists So Need Not Create"
fi

# if "rpm for jdk file" is noting
if [ ! -f ${RPM_DIR}/${JAVA_RPM_NAME} ]
then
  wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" ${JDK_DOWNLOAD_URL}  -O /tmp/${JAVA_RPM_NAME}
  mv /tmp/${JAVA_RPM_NAME} ${RPM_DIR}/
else
  echo "${JAVA_RPM_NAME} Is Already Exists So Need Not Wget"
fi

# install jdk
sudo rpm -ivh ${RPM_DIR}/${JAVA_RPM_NAME}
```

上記shellでは、まだjdkのrpmファイルをダウンロードしていなかったらwgetによりoracleからjdkのインストール用rpmをダウンロードし、あったら既にダウンロード済みのjdkのインストール用rpmを使うようにしています。
jdkのバージョンを変更したい場合は、wgetで該当バージョンを取得するためのコマンドを調べていただき、wgetしているコマンドの組み立て部分を見直していただければそのまま利用できるかと思います。
Vagrant Tips#1 ローカルにあるboxをVagrantfileから自動的に読み込む

##[Vagrant Tipsのサマリページはこちら](http://qiita.com/yukimura1227/items/7e34bb12d36e8aa2e6c3)

# この記事のサマリ
Vagrantでboxを取得する際に、ネットワークに接続せずにディレクトリから直接取得したい場合は、スキーム名に「file」を指定して、file://[ディレクトリ]のように指定すると実現できます。

# 対象読者
例えば、プロジェクト等でvagrantを利用していて、メンバー全員がhttpで外部にboxを取得するのは、ネットワーク負荷的にもネチケット的にも避けたいような場合で、共有ディレクトリにboxを置いて管理してみようかなといった方を対象としています。

# 動作確認バージョン
`vagrant version`の結果↓
Installed Version: 1.7.4

# 経緯
vagrantを、チームのみんなに使ってもらうといった場合に、ネットワークに負荷がかるの嫌だなぁと思い、何か対策が無いかなぁと思って、考えた案の一つです。

# ローカルにあるboxをVagrantfileから自動的に読み込む
Vagrantでは、boxと呼ばれる仮想マシンをパッキングしたものを利用します。boxは、自分でカスタマイズしたものを作成することもできますが、以下のサイトに有志の方々が良く使うboxを公開してくださっています。
- http://www.vagrantbox.es/
通常boxを利用する場合、以下のような流れで仮想マシンを起動します。
１．「vagrant init ＜boxの名前(1)＞ ＜boxの取得先URL(2)＞」というコマンドで、Vagrantfileを作成
２．「vagrant up」というコマンドで、(1)で指定した名前のboxがVagrant本体に登録済み出なかった場合は、(2)で指定したURLからboxをダウンロードし、Vagrant本体に(1)の名前でboxを登録

ダウンロードされるのは、最初の１回だけですので、個人で利用する分には、(2)で外部にhostingされているサイトからダウンロードして実行するで問題ありません。
しかし、大規模なシステム開発を対象とした場合、全員がboxをダウンロードするのは、ネットワーク負荷を考えると、よろしくありません。
上記負荷を避けようとした場合、たとえば共有ファイルサーバなどにboxを配置してLANに閉じて作業をするといった対策案が挙げられます。
具体的には、Vagrantfileを以下のように設定することで、実現可能です。(下記の例は、ローカルマシンにダウンロードしたboxを利用していますが、ネットワークドライブを指定することも可能です。)

```ruby:Vagrantfile
# centos64_6_5という名前のboxが無かったら、
#./box/opscode_centos-6.5_chef-provisionerless.boxからboxを登録して利用する
Vagrant::Config.run do |config|
  config.vm.box = "centos64_6_5"
  config.vm.box_url = "file://./box/opscode_centos-6.5_chef-provisionerless.box"
end

```

上記のように、box_urlに、「file://」+「boxへのファイルパス」と記述してあげるのがポイントです。こうすれば、ローカルのファイルやネットワークドライブのファイルを直接参照することができます。（LAN内にwebサーバを建てて、boxをhostingする必要もありません。）
HTMLを書き始める前に意識しておくべき点

HTML、CSSを書く際に注意しておくべき点をまとめる

## 1. インデント

HTMLやCSSに限った話ではなく、コードのインデントは可読性に大きく関わる。
HTMLの場合はそれだけではなく、プレーンテキストの前後に改行があるかないかで表示がずれることがある。
なので、同様のレイアウトでもコーダーのインデントの裁量で違和感を覚えるページができる可能性がある（同様のレイアウトがあるのならテンプレート化すべきだが）


## 2. 命名規則

クラス名やIDの命名規則は、始まる前に意識の統一を図るべきである。
CSSが複数ファイルに分かれている場合などに、意図しないスタイルの適用ならまだしも、知らずにスタイルをオーバーライドしてしまう可能性がある。
ある程度コードができてから調整するよりは、始まる前に時間をとって話し合ったほうが確実にトータルコストは少ない。
最近（2014/07/20現在）BEMというHTMLの命名規則が有名なので、そちらを紹介しておく。

* [公式ドキュメント](http://bem.info/method/)
* [日本語による解説](https://app.codegrid.net/entry/bem-basic-1)

## 3. CSSリセット若しくはノーマライズCSSを使う

マルチブラウザを目標にしていなくても、拡張や変更が無いとは限らないし、理由がなければ入れておきたい。
どちらを使うかは、それぞれ微妙に役割が異なるので一概には言えないが、最近はノーマライズCSSが主流のようである。
[normalze.css ダウンロードページ](http://necolas.github.io/normalize.css/)

DOCTYPEを宣言することは大前提。
 

## 4. HTMLのtype属性は省略しない

* HTML上は\<input /\>と\<input type="text" /\>は同じ表示となるが、JavascriptやCSSで属性セレクタを使用すると、結果が異なる。（input[type="text"]では、後者の要素のみが取れる）
* \<button\>のデフォルトはsubmitになっているため、Javascriptでsubmitするようにイベントリスナをバインドしている場合、二重submitになる場合が少なくない。


## 5. CSSのセレクタの使い方に注意する

この項目はBEMの理念と矛盾するところがあるので、妖怪人間の方々は読み飛ばしてください。

* 出来る限り子孫セレクタを使用すること（隣接セレクタや小セレクタは拡張・変更に弱いのでおすすめしない）
* 複数クラスを用いて、スタイル適用を拡張するようにする
例）

```html
  <style>
      .button {
        /* 何かボタンっぽく見せるスタイル */
      }
      .button.warn {
        background: #FF0;
      }
      .button.alert {
        background #F00;
      }
  </style>
  <div class="button warn">Warning</div>
  <div class="button alert">Alert</div>
```



---

以上、大まかなポイントをまとめたが、本来はどこかのコーディング規約をそのまま採用し、BEMを採用すると決定してしまえば確実かつ、安全である。
ルールが外部で明確に定められているので、認識に齟齬も生じにくい。
参考までに、

* [Googleのコーディング規約](https://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml)
* [日本語による解説](http://www.hp-stylelink.com/news/2013/10/20131001.php)
Androidアプリ開発②-開発環境構築(Android Studio編)

#開発環境セットアップ - Android Studio
※詳しい手順など省略している部分もあります。
##前提
###Android Studioとは
Googleが去年の「Google I/O 2013」にて発表したAndroid向けのIDE(統合開発環境)。
IntelliJ というIDEをベースに新たに作り直したものらしいです。
いままではEclipse + ADT Plugin(Android Development Tools)を使ったことがありましたが、
今回はこちらのAndroid Studioを用いて開発を進めていきたいと思います。

##Android Studioセットアップ
本題のAndroid Studioのセットアップ。
###ダウンロード
* http://developer.android.com/sdk/installing/studio.html よりダウンロード
* Windwos、Mac、Linuxと各種OSに対応
* 今回はWindowsを使用するのでそちらをダウンロード

###インストール
はじめにJDK探索があり間違ってJREを探してきてしまう場合がありますが、後ほど設定変更できます。
インストール自体は上記以外で躓くポイントは特にないと思います。

###Android Studioが起動しない場合
インストール自体は楽々と進めることができましたが、いざ起動しようとすると以下のようなエラーが出現しました。
　　　　　　　　![AS1.PNG](https://qiita-image-store.s3.amazonaws.com/0/49431/b2707484-ae11-36cd-3425-e5926a5e2702.png)

これは、ベースとなったIntelliJのwindows版を起動する際にJREが必要になるみたいです。
今回のAndroid StudioにはJREがバンドルされていないみたいなので、起動させるには一手間かける必要があります。

#####解決策
起動用のJDKの設定として環境変数JAVA_HOMEにJDKのパスを定義してあげます。

###起動
インストールが完了しJAVA_HOMEの設定も完了したらスプラッシュスクリーンが出て起動します。

　　　　　　　　　　![AS3.png](https://qiita-image-store.s3.amazonaws.com/0/49431/ffe8d69c-3525-737a-f0d8-74cc4900c782.png)

初期画面からプロジェクトの作成などが行えます。

　　　　　　　<img src="https://qiita-image-store.s3.amazonaws.com/0/49431/ab4c874f-7a5f-af43-4da8-c6380cd06a9b.png" width=70%>

##まとめ
これにてAndroid Studioのセットアップは完了です。
Eclipseの場合と違って、Android SDKを手動でインストールする必要はなくAndroid Studioに含まれているようです。
Android OSのバージョンごとに必要なAPIなどはプロジェクト作成時にダウンロードされます。
したがって、初回のプロジェクト作成時は5分程度時間がかかります。
また、手動でもダウンロードできるようになっていますのでプロジェクト作成前にあらかじめ用意することもできます。

次回はプロジェクト作成から「Hello World!」の出力までを行いたいと思います。
A Tour of Go  Exercise: Maps

どういう風に出力されるのかを最初の文章だけコメントに記述しました。
文字列を配列に半角スペースごとに分割する
http://golang.org/pkg/strings/#Fields
その配列をループでまわして単語ごとにkey:valueで格納していって、重複していればvalueをインクリメントするって感じかなー

```go
package main

import (
    "code.google.com/p/go-tour/wc"
    "strings"
    "fmt"
)

func WordCount(s string) map[string]int {
    // I am learning Go! -> [I am learning Go!]
    // func Fields(s string) []string
    sf := strings.Fields(s)
    // Go!
    fmt.Println(sf[3])
    // 4
    num := len(sf)
    ret := make(map[string]int)
    /*
	map[I:1]
	map[I:1 am:1]
	map[I:1 am:1 learning:1]
	map[learning:1 Go!:1 I:1 am:1]
	*/
    for i := 0; i < num; i++ {
        (ret[sf[i]])++
        fmt.Println(ret)
    }

    return ret
}

func main() {
    wc.Test(WordCount)
}
```

## maps

http://golang.jp/effective_go#maps
RuboCop | Style/RedundantReturn

# RuboCop | Style/RedundantReturn

## 概要

RuboCopの「Style/RedundantReturn」警告について。

Rubyでは最後のステートメントの *return* は省略可能であるため、
省略できる *return* を省略しているかどうかチェックする。

デフォルトは複数の戻り値に対する *return* に関しても警告を出す。

### 設定値一覧

|設定対象|対象|内容|デフォルト|
|:-----|:--|:---|:---:|
|AllowMultipleReturnValues|false|複数の戻り値に対する *return* に関しても警告を出す |-|
|AllowMultipleReturnValues|true|複数の戻り値に対する *return* に関しても警告を出さない|○|

## RedundantReturn

各設定値での検証結果をまとめます。

### 検証プログラム

~~~ruby:raise_args
def hoge1
  return 'msg'
end

def hoge2(msg)
  return msg
end

def hoge3(msg)
  return msg.upcase, msg.downcase
end

def hoge4(msg)
  return 'five' if msg.size == 5
  msg
end
~~~

### 実行結果 デフォルト の場合

~~~yaml:.rubocop.yml
RedundantReturn:
  AllowMultipleReturnValues: false
~~~

~~~bash
Inspecting 1 file
C

Offenses:

redundant_return.rb:2:3: C: Redundant return detected.
  return 'msg'
  ^^^^^^
redundant_return.rb:6:3: C: Redundant return detected.
  return msg
  ^^^^^^
redundant_return.rb:10:3: C: Redundant return detected.
  return msg.upcase, msg.downcase
  ^^^^^^

1 file inspected, 3 offenses detected
~~~

### 実行結果 compact を設定にします

~~~yaml:.rubocop.yml
RedundantReturn:
  AllowMultipleReturnValues: true
~~~

~~~bash
Inspecting 1 file
C

Offenses:

redundant_return.rb:2:3: C: Redundant return detected.
  return 'msg'
  ^^^^^^
redundant_return.rb:6:3: C: Redundant return detected.
  return msg
  ^^^^^^

1 file inspected, 2 offenses detected
~~~

## 補足

この警告は rubocop -a で修正可能です。

## RuboCopまとめ記事
http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
使っているソフト等

マシン以降にあたり、インストールしてそれなりに使ったりしているものたちのメモ。
リンク先は、基本ダウンロードのリンクがあるページ。
（コマンド使えよとかの突っ込みはなしで）

## ブラウザ
[Googole Chrome](http://www.google.co.jp/intl/ja/chrome/browser/)
必ず入れてる拡張機能は、Awesome ScreenshotとSave to Pocket

[Firefox](https://www.mozilla.org/ja/firefox/new/)

## 開発とかで使う
[Sublime text](http://www.sublimetext.com/2)
言わずと知れたテキストエディタ
Packageについては、EmmetとHayakuとConvertToUTF8は必須で入れてます

[TeraPad](http://www.forest.impress.co.jp/library/software/terapad/)
ごくたまに使うテキストエディタ

[xampp](http://sourceforge.jp/projects/xampp/releases/)
サイトごとにローカルホストを設定する
今使っているのは【Version 1.7.3】

[WinSCP](http://sourceforge.net/projects/winscp/files/WinSCP/5.1.7/)
SFTP、FTPS、FTPクライアント

[PuTTY](http://hp.vector.co.jp/authors/VA024651/PuTTYkj.html)
SSHクライアント、鍵制作・管理

[IEtester](http://www.my-debugbar.com/wiki/IETester/HomePage)
IEの古いバージョンを見る

[Fiddler2](http://www.telerik.com/download/fiddler)
見ているサイトのファイルをローカルのものと置き換える

[WinMerge](http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html)
差分表示

[Node.js](http://nodejs.org/)

[Ruby](https://www.ruby-lang.org/ja/installation/)
RubyInstallerでインストールした
ruby 2.0.0p451 (2014-02-24) [x64-mingw32]

## コマンド系
compass

grunt
bower
coffee-script
yo
phantomjs


## バージョン管理
[Git](http://git-scm.com/downloads)
TotoiseGit使うにも必要

[TotoiseGit](https://code.google.com/p/tortoisegit/wiki/Download)
GitのGUIソフト

[TotoiseSVN](http://tortoisesvn.net/downloads.html)
SubversionのGUIソフト

## ツール系
[CLCL](http://www.nakka.com/soft/clcl/)
コピーの履歴を残したり、よく使うものを登録できたり

[Lhaplus](http://www.forest.impress.co.jp/library/software/lhaplus/)
zip圧縮・解凍。パスワードを付けるのも可能

→Win7で右クリックのメニューに出てこないとき
http://lifeworker.jp/it/2012/04/02/1653.html

[IrfanView](http://www.forest.impress.co.jp/library/software/irfanview/)
psdもプレビューできる

[PNGGauntlet](http://pnggauntlet.com/)
PNG圧縮

[PSSTPSST](http://www.sweetwarp.com/psstpsst/)
リネームソフト
ASP.NET vNextのサンプルをLinuxで動かした時のメモ

手順
# ConsoleAppを動かすまで

* Ubuntu 14.04を使用
* https://github.com/aspnet/Home に書いてある通りにインストールする。但し、以下の微修正が必要
* monoのインストールはsource(3.4.1の作りかけ)からになるので、gitでcloneする。
* 今日見たらテストが落ちてて最新のmaster動かなかったので、git checkout d8eaf05 してちょっと戻す
* ビルドに必要なソフトをsudo apt-get install build-essential autoconf libtool checkinstall curl で入れる
* ./autogen.shを実行する
* make get-monolite-latestをして、コンパイルに必要なmonoを入れる
* makeを実行
* checkinstallでパッケージ化しつつインストールする
* mono --versionで3.4.1になっていることを確認
* curl https://raw.githubusercontent.com/aspnet/Home/master/kvminstall.sh | sh && source ~/.kre/kvm/kvm.sh を実行し、kvmをインストール
* kvm install latestで最新のkを入れる
* https://github.com/aspnet/Home をcloneし、samples/ConsoleAppに移動
* kpm restoreでパッケージを戻す
* k runでコンソールアプリを起動

# HelloWebを動かすまで

* 上記状態でHelloWebサンプルに行き、k webコマンドを実行するとhttpapi.dllが無いと怒られる
* https://github.com/aspnet/Home/blob/master/samples/HelloWeb/project.json をよく見ると、Microsoft.AspNet.Server.WebListenerをサーバとして使っている。これがどうも現状はLinux未対応らしい(IIS依存なのかな)
* 仕方ないので、これを別のサーバに置き換える作業を行う
* https://github.com/davidfowl/HelloWorldVNext/blob/master/src/helloworldweb/project.json こちらのjsonを見るとサーバとして、KestrelとNowinの2種類が使えることが分かる
* KestrelはNode.jsでも使っているlibuvを使ったサーバで、高性能を期待できるのだが、絶賛開発中でまだMacとWindowsにしか対応していない(Linuxの対応のPRは見つけたが)
* NowinはOWIN向けのピュアC#サーバで、monoが動けば動くHttpListener非依存のサーバである(これも開発中だが)。今回はこれをASP.NET vNext用に調整する
* 調整のやり方は、https://github.com/davidfowl/HelloWorldVNext/tree/master/src/Nowin.vNext このフォルダの中身がNowinをvNextで使う実装なので、このフォルダを丸ごとHelloWebフォルダの隣に置く
* HelloWeb/project.jsonのwebコマンドのところを Microsoft.AspNet.Hosting server=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001 から Microsoft.AspNet.Hosting --server Nowin.vNext に書き換える
* k runでHelloWebを起動(OWINのWelcomeページっぽいのが見えます)
zsh

#.zshrc
## history

```
HISTFILE=~/.zsh_history
HISTSIZE=6000000
SAVEHIST=6000000
setopt hist_ignore_dups     # ignore duplication command history list
setopt share_history        # share command history data
```

#confitional expression
##case
```zsh
#! /bin/zsh

_APP_PATH=~/program/angularjs/logging

case "$1" in
'start')
	ps aux | grep mongod 2>&1 > /dev/null
	if [ $? -ne 0 ]; then
		#/usr/local/bin/mongod
		mongod --fork --quiet --dbpath /usr/local/var/mongodb --logpath /usr/local/var/mongodb/mongod.log
	else
		echo "mongod process already up."
	fi

	${_APP_PATH}/node_modules/forever/bin/forever start ${_APP_PATH}/app.js
	;;
'stop')
	${_APP_PATH}/node_modules/forever/bin/forever stop ${_APP_PATH}/app.js
	;;
'restart')
	${_APP_PATH}/node_modules/forever/bin/forever restart ${_APP_PATH}/app.js
	;;
*)
	echo "Usage: $0 { start | stop }"
	exit 1
	;;
esac
exit 0
```
NeoBundle のキャッシュ機能

# NeoBundle のキャッシュ機能

キャッシュを使うことで、体感できるかな？　っていうくらい起動が速くなった。
neobundle#has_fresh_cache() で指定したファイルより新しいキャッシュがあったらキャッシュを読み込み（NeoBundleLoadCache）、なければプラグインを読み込んでキャッシュを保存（NeoBundleSaveCache）。
自分は `$VIM/_vimrc_bundle` にプラグインの読み込み (NeoBundle ~) を書いているので neobundle#has_fresh_cache() にそれを指定。


`$VIM\_vimrc` 抜粋

```vim:
if has('vim_starting')
  set rtp+=$HOME/_vim/bundle/neobundle.vim/
endif
call neobundle#begin(expand('~/_vim/bundle'))

NeoBundleFetch 'Shougo/neobundle.vim'

if neobundle#has_fresh_cache(expand('$VIM/_vimrc_bundle'))
  NeoBundleLoadCache
else
  source $VIM/_vimrc_bundle

  NeoBundleSaveCache
endif

call neobundle#end()

```
Goでローカルのタイムゾーンを設定する

Goでタイムゾーンを変えたい場合は[func (Time) In](http://golang.org/pkg/time/#Time.In)を使います。

```go
package main

import "time"

const location = "Asia/Tokyo"

func main() {
    loc, err := time.LoadLocation(location)
    if err != nil {
        loc = time.FixedZone(location, 9*60*60)
    }
    now := time.Now().In(loc)
}
```

このようにタイムゾーンを変更したい処理が一箇所ならいいのですが、複数あると面倒な上に変更漏れがあるとバグの原因を見付けるのが大変です。そんな時は`time.Local`でローカルのタイムゾーンを変更してしまいます。

http://golang.org/pkg/time/#Location
> ```go
var Local *Location = &localLoc
```
> Local represents the system's local time zone. 

```go
package main

import "time"

const location = "Asia/Tokyo"

func init() {
    loc, err := time.LoadLocation(location)
    if err != nil {
        loc = time.FixedZone(location, 9*60*60)
    }
    time.Local = loc
}

func main() {
    now := time.Now()
}
```

ただし、[time.Timeから日付だけを取り出す](http://qiita.com/umisama/items/b50df4888665fc36346e)で指摘されているように[func (Time) Truncate](http://golang.org/pkg/time/#Time.Truncate)はタイムゾーンが考慮されていません。他にも同様のメソッドがあるかもしれませんので、時間が正しい事の確認は確実に行ってください。
defineでユーザが定義した定数の一覧を取得する

マニュアル([get_defined_constants()][link1])を見れば書いてあることなんですが、急いでる時になかなか出てこないので、備忘録として。

```php:ユーザ定義の定数を出力するプログラム
define('hoge',1);
$all = get_defined_constants(TRUE);
var_dump( $all['user'] );
```

```:出力結果
array(1) {
   ["hoge"]=> int(1)
}
```

[get_defined_constants()][link1]関数を使えばいいのですが、引数にTRUEを渡すのがポイント。これで定数が下記のようにカテゴリ化されます。


```:get_defined_constants(TRUE)の出力結果（一部）
Array
(
    [Core] => Array
        (
            [E_ERROR] => 1
            [E_RECOVERABLE_ERROR] => 4096
            [E_WARNING] => 2
            [E_PARSE] => 4
            [E_NOTICE] => 8
...
        )

    [calendar] => Array
        (
            [CAL_GREGORIAN] => 0
            [CAL_JULIAN] => 1
            [CAL_JEWISH] => 2
            [CAL_FRENCH] => 3
...
```

ユーザが[define()][link2]で定義した定数は「user」というキーに連想配列で格納されますので、サンプルコードのように$all['user']でユーザ定義定数を取得できるというわけです。

[link1]:http://php.net/manual/ja/function.get-defined-constants.php
[link2]:http://php.net/manual/ja/function.define.php
【iOS】CollectionViewにヘッダーとフッター両方を追加する

CollectionViewにヘッダーとフッダーを表示したいと思って、以下のようにstoryboardを組んだのはいいものの、
collectionView:viewForSupplementaryElementOfKind:atIndexPath: 内で、return headerView;とか、return footerView; だと1つしか返せないので、ヘッダーとフッダーの出し分け方法を探したのだけれど、少し時間がかかったのでメモ。


![スクリーンショット 2014-07-20 21.39.49.png](https://qiita-image-store.s3.amazonaws.com/0/35979/a14671c9-b424-be1b-fe2b-dd6f1960049f.png)


## kindでヘッダーかフッダーか判断して、該当のビューを返す
 * kind == UICollectionElementKindSectionHeader →　ヘッダー
 * kind == UICollectionElementKindSectionFooter →　フッダー


```objc
/* ヘッダービューを(補助ビュー)生成してビューに返す */
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    UICollectionReusableView *reusableview = nil;
    
    if (kind == UICollectionElementKindSectionHeader) {
        headerView = [self.mCollectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"Header" forIndexPath:indexPath];
        
        //headerに画像をセット
        NSURL* imageUrl = [NSURL URLWithString:brandDetail.dBrandIconImage];
        UIImage *placeholderImage = [UIImage imageNamed:@"code.png"];
        [headerView.mBrandView sd_setImageWithURL:imageUrl placeholderImage:placeholderImage];
        headerView.mBrandName.text = brandDetail.dBrandName;
      
        reusableview = headerView;
    }
    
    if (kind == UICollectionElementKindSectionFooter){
        footerView = [self.mCollectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"Footer" forIndexPath:indexPath];
        
        
        reusableview = footerView;
    }
    
    return reusableview;
    
}
```

何か間違ございましたら、ご指摘お願いします。
Androidのカメラでフラッシュ制御や露出補正が効かないときの原因候補

ほぼメモです

## 症状  
* setFlashMode() で撮影時にフラッシュが点かないようにしてるのに暗い所で撮影すると点いてしまう
* setExposureCompensation() で露出補正のレベルを変えてるのに変化がない
* Nexus5ではこうなるのに他端末(Xperiaなど)ではこうならない

## 原因
**setSceneMode()** を呼んでいることが原因でした
[Android Developers](http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setSceneMode(java.lang.String))によると、
`Changing scene mode may override other parameters (such as flash mode, focus mode, white balance).`
つまり、「このメソッドを呼び出すと、フラッシュ、フォーカス、ホワイトバランスとかのパラメータが上書きされるかもしれんぞ」だそうです
そしてバッチリ上書きされてたってワケですHAHAHA

## 結論
Android Developersはちゃんと読もう
Swiftでfizzbuzzの試み


# 無駄に関数を返す関数を書いてみた

```swift
let fizz = "Fizz"
let buzz = "Buzz"

func getGenerator(num: Int, out:String) -> (Int -> String) {
    func getStr(targetNum:Int) -> String {
        if targetNum % num == 0 {
            return out
        } else {
            return ""
        }
    }
    return getStr
}
for i in 1..<101 {
    var result:String? = "";
    for s in [3,5] {
        var getStr = getGenerator(s, s == 3 ? fizz : buzz)
        result = result! + getStr(i)
    }
    if result != "" {
        println(result!)
    } else {
        println(i)
    }
}
```

## 所感
まだ Swift本の"A Swift Tour" の途中までしか読んでないから色々よくわかってないけど、直感的に三項演算子とかも使えて面白かった。
String型の変数の結合の時に "! をつけろ" とコンパイラが怒るので直したんだけど、よくわからない。

個人的に、Obj-Cよりは取っ付きやすくて楽しい。

# 読みやすさを心がけてみた

```swift
let fizz = "Fizz"
let buzz = "Buzz"
func fizzbuzz(a:Int) {
    if (a % 15 == 0) {
        println(fizz + buzz)
    } else if (a % 5 == 0) {
        println(buzz)
    } else if (a % 3 == 0) {
        println(fizz)
    } else {
        println(a)
    }
}
var array = [Int]()
for i in 1..<100 {
    array.append(i);
}
array.map{ fizzbuzz($0) };
```
AppStoreにあるアプリのヘッダーファイルを抽出する

はじめに

AppStoreのアプリのヘッダーをclass-dumpでダンプしようとすると、

```
CDStructures.h
```
というファイルしかダンプすることが出来ません。（SpringBoardとかは普通に抽出できますよね）
アプリのヘッダーファイルを抽出するには一度アプリの暗号化を解除する必要があります。

暗号化を解除するためにはClutchを利用します。
https://github.com/KJCracks/Clutch

githubからダウンロードしてbuild.shを実行すれば簡単にビルドすることが出来ます。
ビルドしたら
build/Release-iphoneos/Clutch.app/Clutch
をiOSの
/bin/
にコピーします。

iOS上、またはSSHでコマンドを実行
```
$clutch appname
```
するとappnameの暗号化が解除されたipaが出力されます。


そのipaの中にあるバイナリをclass-dumpすると正常にヘッダーを取り出す事ができます。
RHEL/CentOSにおけるUIDとGIDの取れる範囲は？

# UIDとGIDの取れる範囲を知りたい

## モチベーション

* UIDとGIDの割り当てをシステムに任せたくない
    * グループだけ作ると以降のUIDとGIDが１つずれることになる 
* UIDとGIDを指定したいが、取れる範囲がわからない

## login.defsを確認

* 取れる範囲は"500～60000"であることがわかった
    * 実際には"70000"を指定して作成できるが、"500～60000"の範囲に収めるのが無難かな
* 詳細は`man login.defs`で確認するか[LOGIN.DEFS(5)](http://linuxjm.sourceforge.jp/html/shadow/man5/login.defs.5.html "LOGIN.DEFS(5)")を参照する

```shell-session
# egrep -i 'gid|uid' /etc/login.defs
```

```bash:/etc/login.defs
# Min/max values for automatic uid selection in useradd
UID_MIN                   500
UID_MAX                 60000
# Min/max values for automatic gid selection in groupadd
GID_MIN                   500
GID_MAX                 60000
```
A Tour of Go Exercise: Slices

# Exercise: Slices

http://go-tour-jp.appspot.com/#36

```go
package main
 
import "code.google.com/p/go-tour/pic"
 
func Pic(dx, dy int) [][]uint8 {
    ret := make([][]uint8, dy);
    for y := 0; y < dy; y++ {
        ret[y] = make([]uint8, dx);
        for x := 0; x < dx; x++ {
            //ret[y][x] = uint8(x^y);
            //ret[y][x] = uint8(x+y)/2;
            //ret[y][x] = uint8(x*y);
            //ret[y][x] = uint8((x^y)+(x+y)/2)
            ret[y][x] = uint8((x^y)*(x+y)/2)
        }
    }
    return ret
}
 
func main() {
    pic.Show(Pic)
}
```

## go言語のsliceを理解しよう
http://www.slideshare.net/yasi_life/go-14075425

## Go Slices: usage and internals

http://blog.golang.org/go-slices-usage-and-internals

## goのスライスの内部実装

http://jxck.hatenablog.com/entry/golang-slice-internals

## Goプログラミング言語仕様

http://golang.jp/go_spec#Slices

## Go by Example: Slices

https://gobyexample.com/slices
[Swift] 三項演算子のハマり所

# bool値による分岐
```swift:okの例
var boolValue = true
var ret1 = boolValue ? "a" : "b"    // ret1 = "a"
var ret2 = !boolValue ? "a" : "b"   // ret2 = "b"
```
- 論理否定演算子「!」もC, Objective-Cと同じように使えます。

```swift:構文エラーの例
var boolValue = true
var ret1 = boolValue? "a" : "b"    // 構文エラー
var ret2 = !boolValue? "a" : "b"   // 構文エラー
```
- 変数名の直後に半角スペースを置かずに?をつけると、「オプショナル型の宣言」と解釈されるためエラーになる。
- 三項演算子の場合は?の前に半角スペースを忘れずに

# nilかどうかによる分岐
```swift:okの例
var stringValue : String? = "hogehoge" // Optional型
var ret = stringValue ? "a" : "b" // ret = "a"
stringValue = nil
var ret2 = stringValue ? "a" : "b" // ret = "b"
```
```swift:構文エラーの例
var stringValue : String = "hogehoge" // Optional型ではない
var ret = stringValue ? "a" : "b" // 構文エラー: Type 'String' does not conform to protocol 'LogicalValue'
```
- 評価に使う値がOptional型か否かによって挙動が異なる。
- Optional型の場合、nilの場合はfalse、nil以外はtrueと評価される。
- Optional型ではない場合は構文エラー。Optional型ではない値は、true/falseの評価には使えない。

# 文字列一致による分岐
```swift:okの例
var stringValue : String = "hogehoge"
var ret1 = stringValue == "hogehoge" ? "a" : "b" // ret1 = "a"
var ret2 = stringValue == "Hogehoge" ? "a" : "b" // ret2 = "b"
```
- 値が等しいか判断する"=="演算子は大文字小文字を区別します


# まとめ
- Swiftの三項演算子はCやObje-Cと同じように使えますが、Optionalの？には注意しましょう。
- 例によって、気になる点がありましたら気軽にコメントください！
[PHP] Travis CI で mailcatcher を使ってメール送信内容をテストする

以前 [PHP から送信したメールを mailcatcher でテストする](http://qiita.com/suzuki86/items/8bcf269cfa72180b74f9) 記事を書きましたが、それを Travis CI でできるか試したらできましたので投稿します。

まずは `.travis.yml` の `before_script` で mailcatcher が使えるように準備します。

1. gem コマンドで mailcatcher をインストールする
2. PHP が mailcatcher を使うように php.ini を設定する
3. mailcatcher を起動する

```.travis.yml
language: php
php:
  - 5.3
before_script:
  - gem install mailcatcher
  - phpenv config-add travis.php.ini
  - mailcatcher
script:
  - phpunit SampleTest.php
```

次に `travis.php.ini` に `sendmail_path` を下記のように設定します。記述方法については[公式のドキュメント](http://mailcatcher.me/)にかかれています。

```travis.php.ini
sendmail_path = /usr/bin/env catchmail -f from@example.com
```

最後にテストコードです。mb_send_mail で送信したメールを、 mailcatcher が提供してくれる API 経由で取得して期待したものになっているか確かめます。

```SampleTest.php
<?php

class SampleTest extends PHPUnit_Framework_TestCase{
  public function testMailcatcher(){
    mb_language('ja');
    mb_internal_encoding('UTF-8');
    mb_send_mail('to@example.com', 'test subject', 'test body');
    $messages = json_decode(file_get_contents('http://127.0.0.1:1080/messages'));
    $message = json_decode(file_get_contents('http://127.0.0.1:1080/messages/' . $messages[0]->id . '.json'));
    $this->assertEquals('<to@example.com>', $message->recipients[0]);
    $this->assertEquals('test subject', $message->subject);
    preg_match_all('/\n\n(.*)/', $message->source, $matches);
    $this->assertEquals('test body', mb_convert_encoding($matches[1][0], 'UTF-8', 'ISO-2022-JP'));
  }
}
```

動作確認できたコード一式を GitHub に置きました。
https://github.com/suzuki86/sample-of-using-mailcatcher-on-travisci

そのリポジトリに対する Travis CI でのビルドです。
https://travis-ci.org/suzuki86/sample-of-using-mailcatcher-on-travisci
Windows でのファイル検索の高度なヒント

# 意外と知らない？検索機能
Windowsでファイルを検索するのに「ファイル検索BOX」を使用していない人が多くてビックリした、という話。※IT業界にいても知らない人が多い・・

> [Windows での検索の高度なヒント](http://windows.microsoft.com/ja-jp/windows7/advanced-tips-for-searching-in-windows)

これでok。「hage.txt」を探すのは簡単でも。
「hage.txt」以外を探すときは、「NOT hage.txt」と検索します。NOT は必ず大文字ね。

意外と自分でも忘れるので自分めも。
FuelPHPをWindows環境にインストール(publicディレクトリのみ公開ディレクトリにする設定)

#はじめに
fuelphpをwindows + xampp環境へインストールする手順。
*public*ディレクトリのみ公開することが推奨されているけど、既存のルートディレクトリには影響を与えたくない人用メモ

my作業環境は、

* xamppは、`C:\xampp`にインストールしてある。
* デフォルトのルート・ディレクトリは、`C:\xampp\htdocs`
* ダウンロードしてきたfuelphpは、`C:\xampp`直下に配置して作業した。


---
[2014/08/27 追記] 
[virtualhostの設定](#1-4)
[hostsファイルの設定] (#1-5)
をやるかわりに、publicフォルダのシンボリックリンクをhtdocsに作成することでも実現できる(こっちのほうが楽)

```bat
cd C:\xampp\htdocs
mklink /d fuelphp "C:\xampp\fuelphp\public"
```
[http://localhost/fuelphp](http://localhost/fuelphp)で接続できるか確認する
接続ドメインも変更したいなら、hostsファイルの設定は必要かー

参考：[htdocs配下にソースおかなくても実行できるようにする](http://qiita.com/re-24/items/746c2e3a4dfdf4327da8)

---

#ダウンロード
[http://fuelphp.com/](http://fuelphp.com/)
fuelphpの本体をダウンロード
(作業時点のverは、1.7.2)

解凍して任意の場所に *test_fuelphp* 名前で配置
(今回は、`C:\xampp\test_fuelphp`)

解凍したディレクトリ内には、`fuel`と`public`というディクレトリがあるので
`public`ディレクトリが公開用ディレクトリになるように設定していく。

#composer
バージョン1.6から *composer* を使って依存ライブラリをダウンロードするので、その手順
これやらないと動かない。

*fuelphp*に、 *composer* が同梱されていので別途インストールしなくても平気

```
cd c:\xampp\test_fuelphp

# composer自体のupdate
php composer.phar self-update 

# composerを使ってダウンロード
php composer.phar update
```

##エラーが出る場合
>Failed to download fuel/docs from dist: You must enable the openssl extension to
> download files via https

のようなエラーが出てる時は

`C:\xampp\php\php.ini`を↓のように編集して、apacheを再起動する。

```ini:php.ini
;extension=php_openssl.dll
```

↓コメントを外す

```ini:php.ini
extension=php_openssl.dll
```


# virtualhostの設定
`C:\xampp\apache\conf\extra\httpd-vhosts.conf`を編集


* コメントアウトされてたらコメントを外す

```apache:httpd-vhosts.conf
##NameVirtualHost *:80
```

↓ コメントされていたらコメントを外す

```apache:httpd-vhosts.conf
NameVirtualHost *:80
```

* `httpd-vhosts.conf`の末尾に追加

```apache:httpd-vhosts.conf
<VirtualHost *:80>
    DocumentRoot C:\xampp\test_fuelphp\public
    ServerName test.fuelphp
    <Directory C:\xampp\test_fuelphp\public>
        Order Allow,Deny
        Allow from All
        Options from All
        AllowOverride All
        DirectoryIndex index.php index.html
    </Directory>
</VirtualHost>

```
(あんまココらへんの記述わかってないけど…)

* 既存のルートディレクトリに`localhost`で変わらず接続できるように追加

```apache:httpd-vhosts.conf
<VirtualHost *:80>
    ServerName localhost
    DocumentRoot C:/xampp/htdocs
</VirtualHost>
```

# hostsファイルの設定
`C:\Windows\System32\drivers\etc`にある*hosts*ファイルを編集

```
127.0.0.1 test.fuelphp
```
の一行を追加

# 確認
いろいろ設定が終わったらapacheを再起動させて

[http://test.fuelphp/](http://test.fuelphp/)
で接続してWellcomeってページが表示されればOK
開発中のライブラリをirbしようとして `cannot load such file` と怒られた時

## 背景 ##

あるライブラリの挙動を知りたいとき、ソースをダウンロードしてirbとかpryとかでちょっとした挙動を確認する時

```
core_ext/kernel_require.rb:45:in `require': cannot load such file -- hogehoge (LoadError)
```

と怒られる時あると思います。

今はbundlerを使っているgemが多いので、 `bundle exec irb` とやればいいと思いますが、bundlerを使っていないgemの時の対処方法です。


## 解決 ##

```
irb -I lib
```

これでok。

Iオプションはロードパスを追加するコマンドライン引数です。

[rubyリファレンスマニュアル Rubyの起動](http://docs.ruby-lang.org/ja/2.0.0/doc/spec=2frubycmd.html )
Pythonで逐次探索

逐次探索
===
逐次探索とは、先頭から順に探したいものを探して、見つかれば終了するやつです。 

関数定義の練習も兼ねています。

```python:
# coding: UTF-8

def giiko_search(TargetValue, List): #(検索値, 探索対象)
    #第2引数がlist型であることの確認
    if isinstance(List, list) == False: 
        print '引数はリストじゃないぞ'
        return 0
    
    #Listが空ではないことの確認
    if len(List) == 0:
        print '空のリストだぞ'
        return 1

    #探す
    for i in range(len(List)):
        if List[i] == TargetValue:
            print str(i+1) + '番目で' + str(TargetValue) + 'かくにん！よかった'
            return 2

    print '見つからなかったぞ'
    return 3

List = ['Fred', 'Alex', 'Diana', 'Byron', 'Carol']
giiko_search('Diana', List)
```


[実行結果](http://codepad.org/GBVpRoXR)

in演算子
---
答え合わせの[Wikipedia](http://ja.wikipedia.org/wiki/%E7%B7%9A%E5%9E%8B%E6%8E%A2%E7%B4%A2)ではもっと簡単なものが紹介されていました。

```python:
def search(list, x):
    return x in list
```
ポイントは[in演算子](http://www.pythonweb.jp/tutorial/list/index10.html)で、これは左側`x`が右側`list`の中に含まれる場合True、ない場合Falseを返すらしいです。
つまり、`search(list, x)`は「ある」か「ない」かの2値を返してくれる関数だということです。
No. 37(アルゴリズムパズル)(その2)

$k$を1以上の整数とする。$2k ¥times k$の盤面上に$2k$個の貨幣を同じ列に2つ以下、同じ行に1つ以下になるようになった配位の作り方を考える。それが問題である。

色々な方法が考えられるけれども、再帰的に作れるようなものを考える。
![IMG_20140720_161831.jpg](https://qiita-image-store.s3.amazonaws.com/0/227/278be8b0-3653-f4b8-fd29-1ab0542fc622.jpeg)

上の図のように、$\Omega_{s}^{\prime}$を$\Omega_{s-1}^{\prime}$と関連付ける。すると、左上の2マス以外は条件から貨幣を置くことはできない。$k=s-1$のときと、$k=s$のときに置く貨幣の数の差は2なので、残されたおけるマスにそれを配置すれば$k=s$のときの配位ができる。

$k=1$のときを調べて、再帰的に考えると、任意の$k$についての配位が得られる。実はこの配位は同じ斜めのマスも、貨幣の数は2以下になっている。次回はこのことについて検証する。
No. 37(アルゴリズムパズル)(その1)

この文章は書籍『[アルゴリズムパズル](http://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%83%91%E3%82%BA%E3%83%AB-%E2%80%95%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%95%B0%E5%AD%A6%E3%83%91%E3%82%BA%E3%83%AB%E5%85%A5%E9%96%80-Anany-Levitin/dp/4873116694)』の問37の解答を作るために書いたノートの一部です。

整数$n > 1$は、2以上の偶数または奇数である。nが偶数、奇数のいずれの場合にも条件を満たす貨幣の配位を作り出す方法を示せば、それが問題の解答になる。

まずは2以上の偶数の場合の貨幣の配位の作り方を考える。$n$を1以上の整数$k$を使って$n=2k$であらわし、このときの貨幣の配位を$\Omega_{2k}$と書くことにする。

![IMG_20140720_155926.jpg](https://qiita-image-store.s3.amazonaws.com/0/227/a4d28f5a-12d1-fcef-9b39-7631474e0669.jpeg)

$\Omega_{2k}$は、上の図のように$\Omega_{k}^{\prime}$を2つ並べることで作ることができる。$\Omega_{k}^{\prime}$は$2k\times k$の盤面に同じ列、斜めには2以下の貨幣、同じ行には1つ以下の貨幣を合計2k個置いた配位である。ただし、斜めの効果が横に並んだ配位に互いに影響を与えるので、このままでは互いに独立に考えることができない。そこで、左右のマスについては、右と左が繋がっていると考えた上で、上のように書いた配位が作れるかを考える。すると、左と右の配位は完全に別々に考えることができるようになる。

任意の$k$について$\Omega_{k}^{\prime}$の作り方を見つけられれば良いのだけれども、今のところ、うまい方法が思いつかない。更に問題を簡単にするために、斜めの制限をはずして、次回考えてみる。
Cross-OriginでWebフォントを使うとき注意すべきこと

皆さん、Webフォント使ってますか？

Qiitaでも有名なアイコンフォントが使われてますね。FontAwesomeです。

今のところStableだとかBetaのChromeでQiitaを見ても何の問題も無いでしょう。(今回の辺りでは。)

## しかし、うちのChrome(38)ではこのようになってしまいます。

![Chrome38.png](https://qiita-image-store.s3.amazonaws.com/0/23997/ce673a91-6924-ff59-7c9f-f960ea7992a3.png)

見事に豆腐です。

## Why?

ここでDevツールを開いてエラーログを見てみましょう。
![Chrome38log.png](https://qiita-image-store.s3.amazonaws.com/0/23997/93979e36-ff19-3d91-8f57-08dc37dd3537.png)

そう。QiitaのFontAwesomeはcdn.qiita.comと言うCDNを経由して配信されていたんですね。でもChrome38以降のBlinkではフォントに対してもOriginチェックがあるらしい…

## ちなみに
![Chrome37.png](https://qiita-image-store.s3.amazonaws.com/0/23997/9d62f5d0-8b97-9bf6-a223-c0e1eca2b3bb.png)
このことはChrome37までで既に予告されてたんですね。(手元にあったのがChromium37だったのでそれ以前のは確認できてませんが。)

## まとめ

CDNとか経由してフォント配信する際はクロスオリジン許可してやるのをお忘れなく!

----

## 追記 7/22 Qiitaの対応

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/hnle0">@hnle0</a> 対策を実施したのですが確認してみていただけませんか？</p>&mdash; └|∵|┐ (@yuku_t) <a href="https://twitter.com/yuku_t/statuses/491409402386083840">2014, 7月 22</a></blockquote>

とりあえず修正されたっぽいので確認してみることに…

![スクリーンショット (362).png](https://qiita-image-store.s3.amazonaws.com/0/23997/33eff192-7635-ff39-f8dc-f6db2aa81f24.png)
うん、豆腐が消えたね!いつも通りのQiitaだよ！
docker

# commands
## docker volume

- show docker volume list

```
$ docker volume ls
DRIVER              VOLUME NAME
local               0fbc052c705e8e358f1fafade763fe6688991bcd3f52c41448b9b0c733558715
local               fabdc7aa22ddb84799296bf69660235dac58e41a69885f6f3ab2076f22d16455
local               html
```

- show volume information (volume data path can be found)

```
$ docker volume inspect html
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/graph/volumes/html/_data",
        "Name": "html",
        "Options": {},
        "Scope": "local"
    }
]
```

# docker-compose
## command
- up containers by recreating images in daemon mode

```
docker-compose up -d --build
```
Pythonで挿入法による整列アルゴリズム

習作
=============

読んでた本がアルゴリズムの章にきたので。[挿入ソート](http://ja.wikipedia.org/wiki/%E6%8C%BF%E5%85%A5%E3%82%BD%E3%83%BC%E3%83%88)の練習です。
[こんな感じに](http://commons.wikimedia.org/wiki/File:Insertion-sort-example-300px.gif#mediaviewer/File:Insertion-sort-example-300px.gif)配列の中身をABC順に並び替えます。

```py:insertion_sort.py
# coding: UTF-8
#↑がないと日本語をコードに含めることができない
List = ['Fred', 'Alex', 'Diana', 'Byron', 'Carol' ]

# 挿入法
N = 2 #挿入法は2番目の要素に手を出すことからはじまる

while len(List) >= N: #Nの値がListの長さを超えないかぎり
    pip = List[N-1] #N番目要素をピポット、中身を一時的な場所に移動し、
    List[N-1] = 'BLANK' #そこを隙間にする（隙間の明示が必要というわけではない）
    
    sukima = N-1 #最初の隙間の位置
    while sukima != 0: #「隙間より上に名前がある（＝現在の隙間は2番目以降の要素である）」かぎり
        if List[sukima-1] > pip: #「隙間の直上がピポットより大きい」なら
            List[sukima] = List[sukima-1] #隙間にそれを落として
            sukima = sukima-1 #上が新しい隙間になる。
        else: break

    List[sukima] = pip #ピポットを隙間に戻す。
    N = N + 1 #インクリメントして処理を繰り返す

# 出力
for x in List:
    print x 
```

途中でピボットと要素の文字列の大きさを比較します。
ここで「文字列の大きさ」とはどういうことなのか、僕にはよくわかりません。
しかし`min(List)`はArexを返すし、`max(List)`はFredを返すので、
ABC順に後ろであるほど文字列が「大きい」ということなのだろうと推測します。


実行結果
=============
[結果](http://codepad.org/SSCKU3R7)
うまくいくと楽しい。

参考文献
=============
[入門 コンピューター科学](http://www.amazon.co.jp/dp/4048869574/) p218〜p222