OmniAICreator/Qiita-1.07M huggingface dataset:
循環参照を防ぐためにweak変数に入れて、使う直前でstrong変数に入れるのが面倒くさいのでプリプロセッサマクロで解決する


## 何か既にもっと良いのがあった

[weakify/strongify マクロを使うと weak self パターンが簡単に書ける - @uasi](http://qiita.com/uasi/items/fd93314cba7d41e53499)

上記の記事で紹介されてる方法の方が良さそうです。

## 以下、僕の原文


何かブロック使ってると、以下のようなコードが典型的パターンとして出てくるじゃん。

```Hoge.m
__weak Hoge *weakSelf = self;
[someObj perform:^{
  Hoge *strongSelf = weakSelf;
  if (strongSelf){
    // your logic
  }
}];

```

これを、こうすると楽じゃね。 って思った。

```Your-Prefix.pch
#define weak_def __weak typeof(self) weakSelf = self;
#define strong_def typeof(self) strongSelf = weakSelf;
```

```Fuga.m
weak_def;
[someObj perform:^{
  strong_def;
  if (strongSelf){
    // your logic
  }
}];
```

変数名が隠蔽されるのが気に入らんという人は、プリプロセッサマクロに引数入れても良いと思います。 ```weak_def(mySuperWeak);``` とか定義できるようにしちゃえば良いかと。 まぁ、メリットが薄れるけど。

ReactiveCocoa入れてると ```@weakify(self)``` とか ```@strongify(self)``` とか使えるらしいし、じゃあそれ使えばって感じもしますが、Light-Weightな解にも価値があるだとうということで。
[Rails4]multi_dbを使ってみた


DBが最近ボトルネックになっているので、AWSのReadReplicaを使ってみようと思います。

## 環境
AWS RDS x2.large (MySQL5.6)
Rails 4.0.0

## 参考
Amazon RDSのリードレプリカ＋Rails4.0＋multi_dbを試してみました
http://d.hatena.ne.jp/ogin_s57/20130928/1380331765
ご本家
https://github.com/schoefmax/multi_db

## 実践

* RDSの『Instance Action』から[Create Read Replica]をポチる。名称を入れてcreateするだけ！素晴らしい。
* Rails側にmulti_dbを導入する。Gemfileに以下を追加。
observerを使ってるみたいだけど、rails4だと廃止されてるので、一緒に入れる必要があるみたいです。

```Gemfile
gem 'multi_db', '~> 0.3.1'
gem "rails-observers"
```

追記したらbundle install

* データベース定義に以下を追加
※環境_slave_databse: で定義を記述する。ここではdev環境

```config/database.yml 
development_slave_database:
  adapter: mysql2
  database: multi_db_development_read
  host: yyyyyyyy.ap-northeast-1.rds.amazonaws.com
  port: 3306
  username: root
  password: replica_password
```

* multi_dbを利用するためのコードを追記

```config/environments/<environment>.rb
  config.after_initialize do
    MultiDb::ConnectionProxy.setup!
  end
```

わりとあっさり出来ました。
後はコネクション数とか確認しながら、ReadReplicaの台数増やすとかかなぁ。
C++で静的配列の要素数を取得する


まぁ僕の好みはサイズ入りのクラスを作ることなんですが、
やんごとなき理由からレガシーなPOD配列使いたいこともあろうと思い、
ちょっとやってみた次第である。

#コード

```cpp
template<typename TYPE, std::size_t N> std::size_t numof(const TYPE (&)[N]){
	return N;
}
```

#使い方
```cpp
int test[16];
double test2[8];
float test3[4];
int test4;
myClass test5[256];

std::cout << numof(test) << std::endl;
//16

std::cout << numof(test2) << std::endl;
//8

std::cout << numof(test3) << std::endl;
//4

std::cout << numof(test4) << std::endl;
//コンパイルエラー！

std::cout << numof(test5) << std::endl;
//256
```

受け取っているのはただのリファレンスなので、重たい配列に適用させてもコピーが起こらないので安心。
しかしまぁ、それにしてもC++はこれくらい標準で入れといてくれても良かったのに、
とか思わないこともない。。。

#2014/05/31追記
(コメント欄xeno1991さんありがとうございます。)
動的配列を入れるとどうなるでしょう？
コンパイルエラーで落ちます。
残念ながら、動的配列の要素数を得る手法は(僕の知ってる限りでは)ありません。
std::vectorを使えということだろうか…うーん。
夏に向けてMacBookの発熱を抑える

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2094">元の記事はコチラ</a>
- - - - - - - - - - - 
すでに30℃を越えていて、コーディング中に汗が出てくる…。
いろいろアプリケーションを起動しているとMacbookが「ゥオオオォォォォッン」て鳴りだして鬼のように熱くなり、キーボードの上の部分が素手でさわれないくらい熱い…。
　　
しかも最近は、たいしたアプリを動かしてなくても発熱がひどい。
音もうるさいし、部屋全体が暑くなるし、集中できない！ということで対策です。
　　
<!-- extract -->

ちなみに、使っているのは2010年のMacbook。結構古いですがまだまだ現役。
Processor  2.4 GHz Intel Core i5
![Screen Shot 2014-05-30 at 11.20.40 AM](http://image.workabroad.jp/upload/2014/137/workabroad.jpg)

　　
###「ゥオオオォォォォッン」の正体

パソコンがうるさい時の原因はほぼファンでしょうから、中を開けて点検。
Macbookを開けるには、小さなプラスドライバーで良いですが、ファンのところのネジは★型なので、持ってない人は買う必要あり。
※ Macbookを開けるのは自己責任でお願いします。

↓　いつかシドニーで買ったドライバーセット
![IMG_20140530_110946](http://image.workabroad.jp/upload/2014/138/workabroad.jpg)
　　
↓　ネジは長さが違うので、どれがどこにはまるのか、並べておいた方がよいかも。
![IMG_20140530_105811](http://image.workabroad.jp/upload/2014/142/workabroad.jpg)
　　
↓　ファンをひとつ外してみました。
![IMG_20140530_104847](http://image.workabroad.jp/upload/2014/139/workabroad.jpg)
　　
↓　近づいてみると…。
![IMG_20140530_104838](http://image.workabroad.jp/upload/2014/140/workabroad.jpg)

　　
**やっぱり！** というか多分これが原因じゃないかな。
空気が出るところにめちゃくちゃホコリが溜まってます。冷却できてないってことです。
2つあるファンを取り出して掃除しました。

今のところコレだけで、Macbookが「ゥオオオォォォォッン」と鳴かなくなりました。
長年使ってるけど、中身を見たことないって人は、かなりの確率でホコリが溜まってると思います。メンテナンスしてみては？（くれぐれも自己責任で）

-----

しかし暑い。暑い暑い。まだ5月なのに！
日本の夏を体験するのは久々すぎるので、今からビクビクしています…。
暑いんだろうな〜嫌だな〜 :(

 → <a href="http://workabroad.jp/posts/2094">http://workabroad.jp/posts/2094</a>
sublimetext viモードでの一括置換

VintageEXを入れても一括置換で;%s/before/after/gcが使えないので、以下の方法で実施

(1) viの入力モードにする
(2) 置換したいワードに移動し、Ctrl + D
(3) もう一度 Ctrl + D する
(4) 文字を編集する
Dropboxの「〜の競合コピー」なファイルをfindで一括削除

ちゃんとgitだけで管理すればいいのに、めんどくさいからという理由でgitで管理してるフォルダをDropboxにおいちゃうと「〜の競合コピー」と言った感じのファイルが`.git`フォルダ以下に作成されたりして非常にめんどくさいことになることがあります。

## 解決策

該当するフォルダに移動して

```shell-session
find . -name '*ubuntu の競合コピー*' -exec rm {} \;
```

でOK。もちろん競合コピーのほうが新しかったら変更部分は全部消えちゃうのでその点はお忘れなく。
波ダッシュ、全角チルダ問題まとめ




## そもそも、波ダッシュと、全角チルダって?

### 波ダッシュ &#x301C;

* 0x8160(Shift_JIS)
* 0x301C(UTF-8)
* WAVE DASH(ユニコードポイント : U+301C)

日本語の文字

- 範囲を表す : 大阪 &#x301C; 東京 など
- 省略記号 :  &#x301C; からの

### 全角チルダ &#xFF5E;

* **Shift_JIS には無い**
* 0xFF5E(UTF-8)
* FULLWIDTH TILDE(ユニコードポイント : U+FF5E)

いろんな意味がある文字

- アルファベットの上につけて、鼻音を表す : ñ
- 数学記号 (ほぼ等しいの意味)
- ホームディレクトリを表す記号 : ~/download 


## Unicode 側での波ダッシュ割り当てミス

Shift_JISの波ダッシュ を Unicode に割り当てるときに、
波ダッシュの形を間違えて、"下がって上がる" ように表記してしまった

<img src="http://upload.wikimedia.org/wikipedia/commons/f/fe/Wave_Dash2.svg" width="100">


**※ unicode 8.0 で修正されました**
→ [UnicodeのWAVE DASH例示字形が、25年ぶりに修正された理由 -INTERNET Watch](http://internet.watch.impress.co.jp/docs/special/20150307_691658.html)

Windows XP 以前の環境 では、それにしたがって波ダッシュを表示している為、他の環境と表示が異なる

### Windows XP 以前の環境での、それぞれの表記

- 波ダッシュ 0x301C(UTF-8) : <img src="http://upload.wikimedia.org/wikipedia/commons/f/fe/Wave_Dash2.svg" width="10"> **正しくない**
- 全角チルダ 0xFF5E(UTF-8) : <img src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Wave_Dash.svg/18px-Wave_Dash.svg.png" width="10"> **正しい**

## Windows XP 以前の環境 だと、波ダッシュの意味で全角チルダが使われる

波ダッシュを入力しようと「から」を変換すると、全角チルダが出力される

- 勘違いなのか、上記間違いで見た目が意図したものと異なるのを回避したかったのか...不明

## 波ダッシュ(0x8160) を UTF-8 に変換すると、CP932と、Shift_JIS で変換結果が異なる実装がある

- いろんな実装毎に結構まちまちなのが問題
- このため、Shift_JIS と、UTF8を行ったり来たりする環境だと、途中で、波ダッシュが、全角チルダに変わったり、全角チルダを Shift_JIS で解釈しようとして、存在しない文字扱いになったりする
- 例えば、HTML の文字コードが Shift_JIS で内部の環境が、UTF-8 の web サービスとか

### 参考 : iconv の 変換ルール


| 元の文字コード | 変換前の文字 | 変換後の文字 |
|:-------------|:-----------|:-----------
| CP932        | 波ダッシュ(0x8160) | 全角チルダ(0xFF5E)
| Shift_JIS    | 波ダッシュ(0x8160)   | 波ダッシュ(0x301C)

- [libiconv/lib/cp932.h](https://github.com/bnoordhuis/libiconv/blob/5124dedfeb6c6f138c2d08d1d3abdc2eda240e0e/lib/cp932.h)

多分だけど、Windows 環境で 全角チルダ が 波ダッシュ として扱われていることを考慮している

## 参考

- [波ダッシュ - Wikipedia](http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5)
- [文字コードについて（シフトJISの問題）](http://park3.wakwak.com/~ozashin/sw_tips/webapp_tips/sjis_charset.html)

- [bnoordhuis/libiconv](https://github.com/bnoordhuis/libiconv)
Azure仮想マシンへのディスク追加


Azure仮想マシンのディスク容量はデフォルトだと数10Gしかないので、
データが溜まっていくようなケースで使用する場合には、追加ディスクをマウントする必要がある.

## ディスクの接続
1. Azure管理ポータルの仮想マシンのページで該当の仮想マシンを選択
2. [ディスクの接続]->[空のディスクの接続]
3. 適当なファイル名とファイルサイズを設定

※ キャッシュ設定は、REDOログファイルの領域にもなるため、[なし]を選択

## 接続されたディスクの識別子を確認
```
tail -f /var/log/syslog
```

おそらく`sdc`という文字列があるはず

## 接続したディスクにパーティションを作成
```
sudo fdisk /dev/sdc
```

````
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xf068a662.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-1048575999, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-1048575999, default 1048575999):
Using default value 1048575999

Command (m for help): p

Disk /dev/sdc: 536.9 GB, 536870912000 bytes
255 heads, 63 sectors/track, 65270 cylinders, total 1048576000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf068a662

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048  1048575999   524286976   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
```

## 作成したパーティションをフォーマット
```
sudo mkfs -t ext4 /dev/sdc1
```

## 作成したパーティションをマウント
```
sudo mount /dev/sdc1 /(path_to_mount)
```

## OS再起動時もマウントされるよう設定
`/etc/fstab`に下記1行を追加

```
/dev/sdc1  /(path_to_mount)  ext4  defaults  0 0
```

## 参考
- http://www.windows-maniax.com/kuniteru/azure1228.html
Azure仮想マシンへのSwap領域の割り当て


Azure仮想マシンのLinuxインスタンスにはSwap領域が割り当てれていない.
自身でインスタンスサイズに応じた適切な領域を割り当てる必要がある.

## 最適なSwapファイルサイズ
| インスタンスサイズ	| スワップファイルサイズ	|
|---				|---					|
| XS				| (メモリが小さいため利用できない)	|
| Small				| 2.625GB				|
| Medium          | 3.5GB					|
| Large				| 7GB					|
| Extra Large		| 14GB					|
| A6				| 16GB					|
| A7				| 16GB					|


## 手順1
### Swap領域の割り当て
```
sudo fallocate -l 2625m /mnt/swap
sudo chmod 600  /mnt/swap
sudo mkswap /mnt/swap
sudo swapon /mnt/swap
```

1. `fallocate`: 適切なサイズ (2.525GB) のスワップファイルをリソースをディスクに割り当てる
2. `chmod`: rootユーザーのみにスワップファイルへの読み取り/書き込み権限を持たせる
3. `mkswap`: ファイルをスワップ領域として設定する
4. `swapon`: スワップファイルを使用可能にする

これでひとまず完了.

`free`コマンドを叩いてみると`2687996Byte`のスワップ領域があることが確認できる

```
free
             total       used       free     shared    buffers     cached
Mem:       1720520     558552    1161968          0      24808     424484
-/+ buffers/cache:     109260    1611260
Swap:      2687996          0    2687996
```

### 再起動後も有効
VMをAzureでリサイクルする場合にもスワップの設定が維持されるようにする

```
sudo echo “/mnt/resource/swap5g   none  swap  sw  0 0” >> /etc/fstab
```

### 参考

- http://www.windows-maniax.com/kuniteru/azure1228.html
- http://blogs.msdn.com/b/windowsazurej/archive/2013/08/01/azure-blog-swap-space-in-windows-azure-virtual-machines-running-pre-built-linux-images-part-1.aspx

## 手順2
実はAzureのLinuxインスタンスには`Windows Azure Linux Agent`というものが入っているらしく、
手順1でやったように煩雑なコマンドを打つことなくよろしくやってくれるみたい

### /etc/waagent.confを編集
この部分を

```
ResourceDisk.EnableSwap=n 
ResourceDisk.SwapSizeMB=0
```

こんな感じに編集

```
ResourceDisk.EnableSwap=y 
ResourceDisk.SwapSizeMB=2625
````

### イメージを作成して新しい仮想マシンを作成
再利用可能なイメージを作成して、それで新しい仮想マシンを作成
以上!

複数台作る場合はこっちが楽そう.

### 参考
- http://blogs.technet.com/b/ksasaki/archive/2013/06/21/linux.aspx
最新のtmuxをUbuntuにインストール


aptでインストールできるtmuxのバージョンが少し古いので、最新のものをソースからインストールするための手順。

例として、/usr/loca/bin以下にインストール

### ビルドに必要なパッケージをインストール
```
apt-get build-dep tmux
apt-get install autoconf libtool pkg-config
```


### gitで最新のソースをダウンロード

``` 
cd /usr/local/src
git clone git://tmux.git.sourceforge.net/gitroot/tmux/tmux
```

### ビルドしてインストール
```
cd /usr/local/src/tmux
./autogen.sh
./configure --prefix=/usr/local 
make
make install
```
Railsで変更不可な導出カラムを設定する


例えば、こんなモデル

```
Circle:円形
 - radius: 半径
 - square: 面積　# このカラムは半径から導出したいので、直接変更できないようにしたい
```

```ruby
class Circle < ActiveRecord::Base
  def radius=(radius)
    super
    self[:square] = radius*radius*Math::PI
  end

  def square=(square)
  end
end
```

## ポイント
- squareのセッターメソッドを無効化
- radiusのセッターメソッドでsquareを計算
- squareにアクセスするにはself[:square]を用いる
Vimでプロジェクト固有の設定を適用する


基本の設定でははインデントはスペース2つ。
けど、プロジェクトAではインデントをハードタブにしたい。

といった時にプロジェクト固有のVimの設定ができると便利。
もちろんできます。

## .vimrc
まずは.vimrcにそれを実現する設定を記述

```~/.vimrc
augroup vimrc-local
  autocmd!
  autocmd BufNewFile,BufReadPost * call s:vimrc_local(expand('<afile>:p:h'))
augroup END

function! s:vimrc_local(loc)
  let files = findfile('.vimrc.local', escape(a:loc, ' ') . ';', -1)
  for i in reverse(filter(files, 'filereadable(v:val)'))
    source `=i`
  endfor
endfunction
```

これで、`.vimrc.local`というファイルがあると、それを読み込んでくれるようになる。

## .vimrc.local
あとは、下のようにプロジェクト固有の設定ファイルをつくってやればいい。

```path_to_project/.vimrc.local
set noexpandtab
set tabstop=4
set shiftwidth=4
```

## ついでに
.vimcrc.localをバージョン管理から除く

```~/.gitconfig
[core]
    excludesfile = ~/.gitignore
```

```~/.gitignore
.vimrc.local
```
SSHのknown_hosts


Capistarano実行しようとしたら`git clone`ができないってのがある。
`known_hosts`にgitのhostが含まれてないから。

これを解決するには
こんな感じに./ssh/configに書いておくといいみたい

```
Host github.com
  StrictHostKeyChecking no

Host bitbucket.org
  StrictHostKeyChecking no
```
[AngularJS][tips] Toggle ボタン作ってみた


最近ちまたで大流行?の AngularJS で Toggle してみたのでメモっておく.

やってることは

```
ng-click="hoge=!hoge"
```

ってやってるだけです.


## Sample

[こちら](http://jsdo.it/phi/iWT3)


## Code 

```html
<!DOCTYPE html>
<html ng-app>
    <head>
        <meta charset="UTF-8" />
        <title>AngularJS Sample</title>
        <link rel="stylesheet" href="https://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
        <link rel="stylesheet" href="https://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap-theme.min.css">
        <script src="http://code.angularjs.org/1.2.0-rc.2/angular.min.js"></script>
        <style>
        body {
            padding: 50px;
        }
        </style>
        <script>
        function SampleCtrl($scope) {
            $scope.flag = true;
        };
        </script>
    </head>
    <body>
        <div ng-controller="SampleCtrl" class="container">
            <button class="btn btn-info btn-lg" ng-click="flag=!flag" ng-class="{open:flag}">{{flag}}</button>
        </div>
    </body>
</html>

```


お手軽♪
iOS+OpenCV: CvVideoCameraのアスペクト比を正しくする

#問題点
* CvVideoCameraのアスペクト比がおかしい
 * ```UIViewContentModeScaleToFill```の状態。

#事前調査
* カメラ画像を表示しているUIImageViewの```contentMode```を変更しても反映されない。
* CALayerがなんたらかんたら。
* カメラの動作を開始しないとカメラの解像度が確定しない。
 * 動作開始後に調整しないといけない。
* カテゴリを使って既存クラスを拡張できる。（メソッドの追加）
 * CvVideoCameraに```startWithContentMode:```を追加する。

#完成品
```objc:CvVideoCamera+ContentMode.h
#import <UIKit/UIKit.h>
#import <opencv2/highgui/cap_ios.h>

@interface CvVideoCamera (WithContentMode)

- (void)startWithContentMode:(UIViewContentMode)contentMode;

@end
```

```objc:CvVideoCamera+ContentMode.m
#import <AVFoundation/AVFoundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <CoreMedia/CoreMedia.h>
#import <Foundation/Foundation.h>
#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>
#import "CvVideoCamera+ContentMode.h"

@implementation CvVideoCamera (WithContentMode)

- (void)startWithContentMode:(UIViewContentMode)contentMode
{
  [self start];
  
  //カメラの解像度を調べる
  AVCaptureInput *input = [self.captureSession.inputs objectAtIndex:0];
  AVCaptureInputPort *port = [input.ports objectAtIndex:0];
  CMFormatDescriptionRef formatDescription = port.formatDescription;
  CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription);
  NSLog( @"dimensions=%dx%d", dimensions.width, dimensions.height );
  
  if( parentView.layer.sublayers != nil )
  {
    CALayer *layer = [parentView.layer.sublayers objectAtIndex:0];
    NSLog( @"[before] frame%@ position%@", NSStringFromCGRect(layer.frame), NSStringFromCGPoint(layer.position) );
    
    //現在のアスペクト比
    CGFloat ratiox = dimensions.width / layer.frame.size.width;
    CGFloat ratioy = dimensions.height / layer.frame.size.height;
    //contentModeによる表示サイズ/位置の決定
    switch( contentMode )
    {
      case UIViewContentModeScaleAspectFit:
        ratiox = (ratiox > ratioy)? ratiox : ratioy;
        ratioy = ratiox;
        break;
      case UIViewContentModeScaleAspectFill:
        ratiox = (ratiox < ratioy)? ratiox : ratioy;
        ratioy = ratiox;
        break;
      default:
        NSLog( @"does not support" );
        break;
    }
    NSLog( @"ratio(%.3f,%.3f)", ratiox, ratioy );
    //新しい表示サイズ/位置をセット
    CGFloat x, y, w, h;
    w = dimensions.width / ratiox;
    h = dimensions.height / ratioy;
    x = (layer.frame.size.width - w)/2;
    y = (layer.frame.size.height - h)/2;
    layer.frame = CGRectMake( x, y, w, h );
    NSLog( @"[after] frame%@ position%@", NSStringFromCGRect(layer.frame), NSStringFromCGPoint(layer.position) );
  }
}

@end
```

#使い方など
* ```start```の代わりに```startWithContentMode:```を呼ぶ。
* ```ScaleAspectFit```と```ScaleAspectFill```のみ対応。
* 対症療法的に作ったので色々と不安。
秒速より速く vagrant ssh


# 前提

## こういう人に便利かも

 * `vagrant ssh` はやけに起動が遅いのでなんとかしたい
 * たくさんのVMを扱うことが多く、作ったり壊したりも頻繁
 * `~/.ssh/config` をVagrant用の設定だらけにしたくない

## 以下の場合は多分役に立たない
 * `vagrant ssh-config --host NAME >> ~/.ssh/config` からの `ssh NAME` で特に不便はない
 * 普段、同じ1〜2種類のゲストしか扱わない。
    * それ`vagrant ssh-config`で十分

# 手順

##  `.bashrc`等にシェル関数を登録しておく

やっていること

  * `vagrant up`が完了した時点で `vagrant ssh-config`を実行して`.vagrant_ssh_config` という名前で保存しておく。
     * バックグラウンドで実行させているが好みによってフォアグラウンドにするもよし
  * `vagrant ssh` したら代わりに `ssh -F .vagrant_ssh_config default`を実行する。`.vagrant_ssh_config`が見つからなかったら `vagrant ssh`で代用する。
  * `Vagrantfile` よりも下位のディレクトリにいても何とかしてくれる

```bash:.bashrc(1)
# vagrant upしたらかならず .vagrant_ssh_configを作成するバージョン
VAGRANT=`which vagrant`
vagrant() {
    if [ "x$1" = 'xup' ]
    then
        pushd . > /dev/null
        until [ -f Vagrantfile -o $PWD = '/' ]
        do
            cd ..
        done
        if [ $PWD != '/' ]
        then
            $VAGRANT $@
            $VAGRANT ssh-config > .vagrant_ssh_config &
        fi
        popd > /dev/null
    elif [ "x$1" = 'xssh' ]
    then
	pushd . > /dev/null
	until [ -f Vagrantfile -o $PWD = '/' ]
	do
		cd ..
	done
	if [ -f .vagrant_ssh_config ]
	then
		ssh -F .vagrant_ssh_config default
	else
		vagrant ssh
	fi
	popd > /dev/null
    else
        $VAGRANT $@
    fi
}
```

```bash:.bashrc(2)
# .vagrant_ssh_configが存在している場合、再作成しないバージョン

VAGRANT=`which vagrant`
vagrant() {
    if [ "x$1" = 'xup' ]
    then
        pushd . > /dev/null
        until [ -f Vagrantfile -o $PWD = '/' ]
        do
            cd ..
        done
        if [ $PWD != '/' ]
        then
            $VAGRANT $@
            if [ ! -f .vagrant_ssh_config ]
            then
                $VAGRANT ssh-config > .vagrant_ssh_config &
            fi
        fi
        popd > /dev/null
    elif [ "x$1" = 'xssh' ]
    then
	pushd . > /dev/null
	until [ -f Vagrantfile -o $PWD = '/' ]
	do
		cd ..
	done
	if [ -f .vagrant_ssh_config ]
	then
		ssh -F .vagrant_ssh_config default
	else
		vagrant ssh
	fi
	popd > /dev/null
    else
        $VAGRANT $@
    fi
}
```


# できれば改善したいポイント
 * 関数の作り方がやっつけクオリティ
 * VagrantなんだからRubyで書けばよかった
 * 応用で「簡単scp」とか作れると思うのでそのうち作りたい
Gitの設定

## 便利なツール
### Bash-Completion
![branch](https://qiita-image-store.s3.amazonaws.com/0/44308/78dc928b-b1db-ca5a-67f2-1806a7dba4e4.png)
Windowsでは上記のようにデフォルトで表示されているbranch名。これがないと結構、今いるブランチを見失う。
これをOSX他でサポートする為のもの。

参考：
http://d.hatena.ne.jp/deeeki/20110402/git_branch_ps1

### git-completion.bash
補完機能がないとタイポしまくります。補完機能入れましょう。

参考:
http://git-scm.com/book/ja/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%83%92%E3%83%B3%E3%83%88%E3%81%A8%E8%A3%8F%E6%8A%80
### git-new-workdir
他のbranchの同時作業のお供に。
git cloneなんてする必要がなくなるそうです。

参考：
http://subtech.g.hatena.ne.jp/secondlife/20121207/1354854068

### git-flow
branch管理をサポートしてくれる便利ツール（らしい）

参考：
http://www.atmarkit.co.jp/ait/articles/1311/28/news042.html

## 書いておきたいalias
###色分け表示する
```
$ git config --global color.ui true
```

###git log を見やすくするエイリアス
```
$ git config --global alias.l "log --oneline --graph --decorate"
```
これにいくつかのオプションを組み合わせてよく使う。

*branchのmerge作業をする時など、他のbranchのlogもあわせて表示したい時*

```
$ git l --all
```

*各commitでの更新状況を確認したい時*

```
$ git l --stat
```

###--no-ff でのmergeを行う
```
$ git config --global merge.ff false
```

fast forwardのマージだと分岐したbranch情報が消えてしまうので、意図的にnon fast forwardにしておくとbranch情報が消えないのでbranch管理が綺麗になる（気がする）

ただ、git pullが fetch & mergeの為、この場合もno-ffになるので単体での設定には注意が必要。

追跡中のbranchはrebaseがいいので

```
$ git config --global branch.autosetuprebase always
```

恒久的にrebaseにしたい場合は下のconfigを書くと良い。

```
$ git config --global pull.rebase true
```

###git statusが長すぎて見づらい
こんなconfigを書けばいいんじゃないかな

```
$ git config --global alias.s "status -sb"
```

###viが使えないemacsな人は
```
$ git config --global core.editor "emacs -nw"
```
サーバ上にアップとかする事も多い気がするので、個人的にはdefaultのvi推奨。Ubuntuの時だけ僕は変更してます。
Gitチートシート

##git log
##### log全体を見やすく表示
```
$ git log --decorate --oneline --graph
```
##### 変更したファイルも表示したい
```
$ git log --stat
```
##### ファイルA.cppを変更したcommitのみを表示したい
```
$ git log A.cpp
```
> --statオプションを付けると分かりやすくなるかもしれません。
> N file changedの表記は全てが表示されなくなりますので注意。

##### Testというコメントをつけているcommitのみを表示したい
```
$ git log --grep Test
```
##### 複数のbranchのlogを同時に見たい
```
$ git log branchA branchB branchC
$ git log --all
$ git log --remotes
```
> --allはremoteとlocalの全て、--remotesはremoteだけを表示する

##git add
##### unstageしたい
```
$ git reset HEAD filename
```
> add して既にstageに乗ってしまったものを、やっぱりcommitしたくない！　という時にunstageしたくなります。そんな時に。
> HEAD という事は……他にも便利に使えそうですね。
> このファイルだけ昔の状態に戻したり

##git checkout
##### branchを作成してcheckoutしたい
```
$ git checkout -b new_branch <src_branch>
```
> 新しいブランチを切る時はgit branchよりも使いやすい

##### commitしてないファイルがあるせいでcheckoutできない
```
$ git stash; git checkout branch
$ git checkout -f branch
```
> commitしていないデータを残したいのなら上のコマンドを、残したくないのなら下のコマンドを使うと良いかも。
> stashはstackにcommitしていないファイルを保存する最強コマンドの1つ。後述。

##git branch
##### branchのHEAD位置を移動したい
```
$ git branch -f branch_name dst_commit
```
> 今いるbranchは移動できません

##### remoteにあるbranchを知りたい
```
$ git branch -a
$ git branch -r
```
> 前者はリモートとローカル両方、後者はリモートだけを表示。

##git fetch
##### もう存在しないremote branchがいつまでも残ってる
```
$ git fetch --prune
```

##git diff
##### 単語単位の賢いdiffが見たい
```
$ git diff --color-words
```

##git merge
##### コンフリクトのお供に
```
$ git merge-tool
```
http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools

#### deleteの衝突
```
$ git rm --cached file
$ git rm file
```
> 前者はgitへの登録のみを削除し、後者はファイルの実体も合わせて削除する。

#### non fast forwardにしたい
```
$ git marge --no-ff branch_name
```
> fast forwardだとマージするbranchの存在がログ上から分からなくなるので、developへのマージに使う事がしばしば。

## git stash
まだcommitしていないファイルをstack上に移動し、最新のcommitの状態に戻す

```
$ git stash
$ git stash pop
$ git stash clear
```
> stashで保存した物をpopで取り出す。clearでstack上のものを削除する。
> 例えば、作業をbranchを切り替える前に初めてしまったなんて時にstash -> checkout -> stash pop (自動マージ)の手順で使えます。

#### ignoreされているファイルもstashしたい
```
$ git stash -a
```
> ignoreされているファイルに依存して、テストが通らない時に使える

#### 複数分のstackを扱いたい
```
$ git stash list
$ git stash pop --index stash@{0}
```
> listでstackを表示し、指定したものをpopする

## git blame
#### 誰がこの行を弄ったのか知りたい
```
$ git blame -L 1,1 A.cpp
```
結果

```
^9b6ca83 (soranoba 2014-06-25 14:49:25 +0900 1) #include<iostream>
```
> -L start,end で行の範囲指定ができる。
> 結果は「コミットハッシュ値 (checkout ハッシュ値で飛べる), コミットした人, 内容」で表示される

## git clean
#### git cloneした時の状態に戻したい
```
$ git clean -f -x -d

// 確認をする時はこちら
$ git clean -n -x -d 
```
> 外部モジュールが～　とかよくある奴への対策の1つ。submoduleには使えないと思いますので、必ずしもgit cloneした時の状態と同じにはならないので注意。
> 本当は、gitに関連づけられていないファイル/ディレクトリを削除するコマンドです。
Chrome 拡張 で Javadoc をインクリメンタルサーチ

ラムダ式や Date & Time API が導入されてとても便利になった Java ですが、いざ使い方を調べようと思っても、肝心の Javadoc はデザインが今っぽくなっただけで、ちっとも便利になっていません。

![20140530_001.JPG](https://qiita-image-store.s3.amazonaws.com/0/6755/c28054b3-70a9-3b02-937a-54049c19f6dd.jpeg)

このスクロールバーの小ささを見ても誰も何も感じないのでしょうか。

マウスホイールをぐりぐり転がし続ける生活に疲れ果てたので、無ければ作ろうと思って探したら、やっぱりありました。

# Javadoc Search Frame

その名のとおり Javadoc を検索するフレームを追加する Chrome 拡張です。

- [Chrome ウェブストア - Javadoc Search Frame](https://chrome.google.com/webstore/detail/javadoc-search-frame/mfgkihmpcjjnijmkchojlbccbmhcdfcd)

この拡張をインストールして Javadoc を開きなおすと、標準のフレーム部分が検索窓のついたフレームに置き換えられます。

![20140530_007.JPG](https://qiita-image-store.s3.amazonaws.com/0/6755/412f47f8-8031-9ecc-12a5-f99b2e2ed232.jpeg)

パッケージ名やクラス名を入力すると、インクリメンタルサーチした結果が表示されます。

![20140530_008.jpg](https://qiita-image-store.s3.amazonaws.com/0/6755/49639246-6f5a-ed9f-8a3e-7da376ab77b3.jpeg)

`Tab` で検索結果にフォーカスを当てて `Enter` で当該ドキュメントを開くことができます。

![20140530_010.JPG](https://qiita-image-store.s3.amazonaws.com/0/6755/e3f7d71b-8418-5182-116b-67036587a5f7.jpeg)

`Alt + Shift + S` で検索窓にフォーカスを戻すことができます。


## キャメルケース検索

Eclipse や Sublime Text 2 のように、クラス名の大文字だけで検索することもできます。

![20140530_011.JPG](https://qiita-image-store.s3.amazonaws.com/0/6755/d9aebf9b-6e8d-e153-0af5-468cfbd7d971.jpeg)

上記例の場合、`LDTime` や `LoDaTi` などと入力しても同じ検索結果が得られます。


## ワイルドカード検索

前方一致以外で検索したい場合は、ワイルドカードを使うこともできます。

![20140530_012.JPG](https://qiita-image-store.s3.amazonaws.com/0/6755/34962966-3327-cc96-4efe-7939583d2de1.jpeg)


## パッケージ指定検索

パッケージ名を指定して検索することもできます。この際、`j.u.Date` のようにパッケージ名を略記して検索することもできます。

![20140530_013.JPG](https://qiita-image-store.s3.amazonaws.com/0/6755/1672d0a2-0f96-f7e5-efe1-73d2ba2bf7f6.jpeg)


# Firefox 版

上記 URL の説明欄には

> Also available for Mozilla Firefox:http://userscripts.org/scripts/show/23200

と書いてあるのですが、少し探した限りでは見つかりませんでした。見つけた方はコメントください。


# まとめ

Java 8 で多数のインタフェース、クラスが追加され、もはやマウスホイールでは目的のドキュメントに辿り着くことすら困難になってきました。

いずれ Javadoc そのものが改善されるべきとは思いますが、それまでは今回紹介した拡張などを使って新機能の使い方を学習するとよいと思います。
XcodeをMolokaiするメモ

molokai xcodeでググって
https://gist.github.com/kristoferjoseph/1974303
とかをお借りして、

~/Library/Developer/Xcode/UserData/FontAndColorThemes
に入れる。

  参考
　非表示のユーザーライブラリフォルダーにアクセスする方法（Mac OS X 10.7 以降）
　http://helpx.adobe.com/jp/x-productkb/global/cpsid_91195.html

xcode開いて
xcode > preference > Fonts & Colors でテーマ選んで終わり。

文字サイズを変えるには
同じく　Fonts & Colors　から
変更したいテーマを選んで、　全選択して、サイズを変えておk。

こんな感じ。

![140530-0001.png](https://qiita-image-store.s3.amazonaws.com/0/26030/26c43488-fcba-dc03-2644-3437d2e45eec.png)


やったぜ。
Haskellの関数の動作チェック3

# 関数の使い方メモ

動作環境
GHCi, version 7.6.3

## map関数
```
Prelude> import Data.List
Prelude Data.List> map (2/) [1..5]
[2.0,1.0,0.6666666666666666,0.5,0.4]
Prelude Data.List> map (/2) [1..5]
[0.5,1.0,1.5,2.0,2.5]
Prelude Data.List> map (\(x,y) -> x*y) [(1,2), (3,4), (5,6)]
[2,12,30]
Prelude Data.List> map even [2..8]
[True,False,True,False,True,False,True]
```

## foldl関数
```
Prelude Data.List> foldl (++) "a" ["b", "c", "d"]
"abcd"
Prelude Data.List> foldl (+) 0 [1..10]
55
Prelude Data.List> foldl (*) 0 [1..10]
0
Prelude Data.List> foldl (\(x,y) (z,w) -> (x+z, y+w)) (0,0) [(1,2), (3,4), (5,6)]
(9,12)
```

## foldl1関数
```
Prelude Data.List> foldl1 (++) ["b", "c", "d"]
"bcd"
Prelude Data.List> foldl1 (+) [1..10]
55
Prelude Data.List> foldl1 (*) [1..10]
3628800
Prelude Data.List> foldl1 (\(x,y) (z,w) -> (x+z, y+w)) [(1,2), (3,4), (5,6)]
(9,12)
```

## foldr関数
```
Prelude Data.List> foldr (++) "a" ["b", "c", "d"]
"bcda"
Prelude Data.List> foldr (+) 0 [1..10]
55
Prelude Data.List> foldr (*) 0 [1..10]
0
Prelude Data.List> foldr (\x y-> length x + y) 0 ["abc", "defg", "hijkl"]
12
```

## foldr1関数
```
Prelude Data.List> foldr1 (++) ["b", "c", "d"]
"bcd"
Prelude Data.List> foldr1 (+) [1..10]
55
Prelude Data.List> foldr1 (*) [1..10]
3628800
```
日付型のapex:inputFieldとshowDatePicker

![2014-05-30_120811.png](https://qiita-image-store.s3.amazonaws.com/0/8407/51dbd1d6-8a4f-24af-8a66-5c031a6c914e.png)

Winter'14からshowDatePickerを指定することでinputFieldで表示される日付挿入リンクを非表示に切り替えられるようになっています。もうCSSで頑張らなくても大丈夫。

```
<apex:page standardController="Opportunity" showHeader="true" sidebar="false">
  <apex:sectionHeader title="apex:inputFild" subtitle="ShowDatePicker" />
  <apex:form >
    <apex:pageBlock >
      <apex:pageBlockSection columns="1">
        <apex:inputField value="{!Opportunity.CloseDate}" showDatePicker="true" />
        <apex:inputField value="{!Opportunity.CloseDate}" showDatePicker="false" />
      </apex:pageBlockSection>
    </apex:pageBlock>
  </apex:form>
</apex:page>
```
[Objective-C] Blocks再びメモ（Blocksを使ったメソッドチェーン）


こちらの記事（[Objective-Cでドット繋ぎでメソッドチェインを行う](http://qiita.com/saiten/items/8d39b3f382371f9b2daa)）を読んでいて、まだまだ理解が浅いなーと思ったので、自分で色々書きながらメモ。
（そしてARCの恩恵をとても受けているんだなーということを実感した）

## サンプルコード

まず、該当記事から少しコードを参考にさせて頂いて、以下のように簡単な例を書いてみました。
（Xcode上ではなく、コマンドラインからコンパイルする感じです）

```main.m
#import <Foundation/Foundation.h>

@interface NSArray (functional)

@property (readonly) NSArray *(^filter)(BOOL (^)(id));

@end


@implementation

- (NSArray *(^)(BOOL (^)(id)))filter
{
	// ARC環境下でない場合は、明示的にコピーを返さないとエラーになる
    return [^(BOOL (^block)(id)) {
        NSMutableArray *arr = [NSMutableArray array];
        for (id obj in self) {
            if (block(obj)) {
                [arr addObject:obj];
            }
        }
        return arr;
    } copy];
}

@end

int main()
{
	NSArray *arr = @[@1, @2, @3, @4, @5];
	NSArray *filtered = arr.filter(^BOOL (id num) {
			 	return [num intValue] > 3;
			 });

	NSLog(@"%@", filtered); // => 4, 5
	return 0;
}
```

### 実行

```console
$ gcc -o sample main.m -framework Foundation
$ ./sample
$ 2014-05-30 11:52:33.450 sample[48557:507] (
    4,
    5
)
```

### 少し分かりやすく変更

上記はblockの型をそのまま書いているのでとても分かりづらいですね。
なので、`typedef`を使って少しだけ分かりやすくすると以下の感じ。

```main.m
typedef NSArray *(^array_filter)(BOOL (^)(id));

// @property (readonly) NSArray *(^filter)(BOOL (^)(id));
@property (readonly) array_filter filter;

// - (NSArray *(^)(BOOL (^)(id)))filter
- (array_filter)filter
{
	// 省略
}
```

`typedef`を使うと少し分かりやすいですね。
また、参考にした記事を見てもらうと分かりますが、`NSarray`を拡張しているので、戻り値の`NSArray`に対してさらにプロパティアクセスができます。
つまり、メソッドチェーンが行える、ということですね。

実際に使うシーンというのはあるのか分かりませんが、blockの仕組みとともに覚えておいて損はないんじゃないかなーと思いました。
ActiveRecordで多対多の関係を定義する

”学生”と”授業”の関係を例にとる。

もし、"学生"と"授業"の関連に対してなんらかのパラメータを持たせたい場合（例えば授業の評価とか）は
has_many :throughで関係を定義したほうが良い。

```rb
#学生モデル
class Students < ActiveRecord::Base
  has_many :takes
  #takesという中間テーブルを介してlessonsと関連している
  has_many :lessons, :through => :takes
end
```

```rb
#受講モデル 受講という関連をモデル化
class takes < ActiveRecord::Base
  belongs_to :student
  belongs_to :lesson
end
```

```rb
#授業モデル
class Lessons < ActiveRecord::Base
  has_many :students
  #takesという中間テーブルを介してstudentsと関連している
  has_many :students, :through => :takes
end
```

ER図風AAで書くと
students --< takes >-- lessons

"学生"と”授業”の関連だけが表せればよいという場合は、has_many_belongs_toで定義すればよいだろう。

```rb
class Students < ActiveRecord::Base
  has_many_and_belongs_to :lessons
end
```

```rb
class Lessons < ActiveRecord::Base
  has_many_and_belongs_to :students
end
```

ER図風AAで表すと
students --< users_lessons >-- lessons

詳細は、Ruby on Railsの公式ドキュメントを参照のこと
http://guides.rubyonrails.org/association_basics.html

ググるワード
rails model association
Javaで空きメモリの量を簡単に調べる

開発中に空きメモリの量を調べたいことがたまにあります。
Androidアプリの場合はDDMSで調べられますが、これをつかうとアプリの動作が重くなったりするので、特にアプリのパフォーマンスが問題になるときはDDMSをつかえないことがあります。

そのときに、メモリの空き容量だけですが、実行速度に影響をあたえずに簡単に調べる方法があります。


* [Runtime#freeMemory()](http://docs.oracle.com/javase/jp/8/api/java/lang/Runtime.html#freeMemory--)

です。
このメソッドは空きメモリの量をlongで返します。
オブジェクトごとやクラスごとの消費量といった細かいデータがほしいときには使えませんが、
とにかく簡単にメモリの空き容量をログに出したいときには便利です。

[Runtime#freeMemory()](http://docs.oracle.com/javase/jp/8/api/java/lang/Runtime.html#freeMemory--)は次のように使います。

```java:MemoryTest.java
public class MemoryTest {
	public static void main(String[] args) throws IOException {
		List<String> list = new ArrayList<>();

		for (int i = 0; i < 10000000; i++) {
			list.add(new String());
			if (i % 1000 == 0) {
				System.out.println(Runtime.getRuntime().freeMemory());
			}
		}
	}
}
```
このプログラムを実行すると、徐々にGCが走ってもほとんどメモリが空かなくなってゆき最後にはOOMが発生する様子を観察することができます
【質問】Gtihub-flowで開発中，WIPなPull Requestのブランチをトピックブランチに取り込みたいときの最適解

# こんなリビジョングラフがあります
ほとんどモザイクで申し訳ないのですが…
![1.png](https://qiita-image-store.s3.amazonaws.com/0/20506/799965c0-a6b0-dca2-c50b-5ad0b39cd53d.png)

* masterは一番下のコミットです
* masterにマージされていない，WIPなPull Requestを出しているブランチが一番上のコミットのブランチです．（このブランチをAとします）
* 新たにmasterからトピックブランチを作りたいと思ってます（このブランチをBとします）

# やりたいこと

BのブランチにAを取り込みたい

単純に考えれば，Aをnon FastFowardでマージするのがセオリーなのかなって気はします．
ただ，Bをmasterに対してPull Requestを出すと，Aのコミット履歴もPull Requstのコミット一覧に混ざり，レビュワーが混乱します．
（一応マージコミットで判断はできますが…）
でもこれはAがmasterにマージされていない以上ある意味当然です．

Github-flowの原則で言えば，トピックブランチはmasterから派生してmasterへマージとなっていますが，Aがまだmasterにマージされていない以上，BのPull Request上にAのコミットが混ざるのは仕方ないことなのでしょうか．
それとも他に何か良い解があるんでしょうか．

(乱文で申し訳ありません…言いたいこと伝わっているか心配です…)
CSSでグラデーション

# ![](//qiita-image-store.s3.amazonaws.com/0/36751/ee230923-b0a1-2694-397f-5da0f854a844.png) 実行例

CSS（CSS3）だけでグラデーションをつけられます。
![css-grad.png](https://qiita-image-store.s3.amazonaws.com/0/36751/136fea74-8af5-ac85-a423-d9f44c65b1fe.png)

コードは下記の通り。

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style type="text/css">
.bg-grad
{
	width: 400px;
	height: 150px;
	padding: 25px;
	border: 5px solid #000000;
	background: #000099;
	/* Webkit系 */
	background: -webkit-gradient(linear, left top, left bottom, from(#ccccff), to(#000066));
	/* Mozilla系 */
	background: -moz-linear-gradient(top, #ccccff, #000066);
	/* IE10+ */
	background: -ms-linear-gradient(top, #ccccff, #000066);
	/* IE8-9 */
	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccccff', endColorstr='#000066', GradientType=0)";
	/* IE5.5-7 */
	/* filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccccff', endColorstr='#000066', GradientType=0); */
}
</style>
</head>
<body>
<p class="bg-grad">グラデーション</p>
</body>
</html>
```

# ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/ee230923-b0a1-2694-397f-5da0f854a844.png) 解説

ブラウザーによって、指定方法が異なります。

* webkit は Chrome、Safari
* moz は Firefox
* ms は IE

さらに IE の場合、

* IE10 以降は ```background: -ms-linear-gradient ...```
* IE8、9 は ```-ms-filter: "progid:DXImageTransform ...```
* IE5.5～7 は ```filter: progid:DXImageTransform ...```

と分かれます。ただし、filter: は新しいIEでも解釈されるため、-ms-filter: と filter: を同時指定するのはあまり意味がないそうです。

「じゃあ filter: だけ指定すればいいのでは？」とも思いますが、filter: はCSSの正しい書式（ ```属性:値;``` ）に従っておらず、コロンが２回登場します。そのため、ブラウザーによってはスタイルが崩れる危険性があるため、使用は控えたほうがいいそうです。-ms-filter: のほうはダブルクォーテーションで囲む書式に改良されたため問題ありません。

ちなみに、左から右へのグラデーションはこんな感じ。

```html
/* Webkit系 */
background: -webkit-gradient(linear, left top, right top, from(#ccccff), to(#000066));
/* Mozilla系 */
background: -moz-linear-gradient(left, #ccccff, #000066);
/* IE10+ */
background: -ms-linear-gradient(left,  #ccccff,  #000066);
/* IE8-9 */
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccccff', endColorstr='#000066', GradientType=1)";
/* IE5.5-7 */
filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#ccccff', endColorstr='#000066', GradientType=1);
```

# ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/ee230923-b0a1-2694-397f-5da0f854a844.png)参考URL

画像を使わないで、CSSを使ってグラデーションする！！（IE対応）
http://infinityforest.net/home/archives/830

-ms-filterは無意味
http://sayurin.blogspot.jp/2012/12/ms-filter.html
zshの起動が遅いと感じたら、zprofでプロファイリングしてみる

zshの設定を何も考えずに育てていくと、どんどん起動が遅くなっていくことがある。

最近遅いな、と思ったら、zprofでプロファイリングしてみよう。

まずは、zsh起動時に一番最初に読み込まれる ~/.zshenv の先頭に以下を追記して、zprofを実行。

```zsh:.zshenv
zmodload zsh/zprof && zprof
```

次に、.zshrc の最後など、最も最後に実行される箇所に

```zsh:.zshrc
if (which zprof > /dev/null) ;then
  zprof | less
fi
```

などと記述しておく。 less でも cat でもお好みで。

後は、zshを起動するだけで、zprof によるプロファイリング結果が出力されるので、不要なものを削るなり、ボトルネックの改善を行うなり。

これを試した環境では compinit が圧倒的に処理時間が長かったため、

```zsh:
compinit -C
```
として、セキュリティチェックをスキップすることで高速化を試みるなどを行った。


### 追記

uu59@github さんからいただいたコメントにあるように、こちらのページで詳しく説明されてます。

http://blog.uu59.org/2013-06-01-zsh-optimize.html
開発環境がわからない。

明解Ｃ言語（入門編）　を使ってＣ言語学びたいと思います！

開発環境を、
eclipseにするか
Visual Studioにするかで悩んでおります（笑）

いまいちVisual Studioの種類の違いがわからない。
Visual Studioは学生だとProfessionalが無料ということなんですが
違いがわからないから有難味がわかない（笑）
新しいマシンで.NETのWebアプリが動かない


ということがあったんだけど、どうも.NET Framework => IISの順番にインストールするとうまいこといかないっぽい。

.NET Frameworkに対して修復をかけてあげたらうまく動いたとのこと。

というか公式にも載ってたのね・・・。

- [ASP.NET インストールでのトラブルシューティング](http://msdn.microsoft.com/ja-jp/library/cc737943(v=ws.10).aspx)
homebrewでインストールしたmysqlのmy.cnfが読み込まれなかった


homebrewでmysqlをインストールしている。
5.5系を使っていたのを5.6系に変えたら`STRICT_TRANS_TABLES`でハマった。

対応として`mysql --help`として表示される`my.cnf`を編集したが反映されなかった。
`/usr/local/Cellar/mysql/x.x.x/my.cnf` が優先されていたので、そちらを編集する必要があった。

##関連しそう
- [MySQL - my.cnfの読み込み順序確認方法 - Qiita](http://qiita.com/kengos@github/items/2ede226c1bec86459920)
- [MySQL5.6にしていくつかのSQLでエラーが出るようになった | シーズクリエイターズブログ](http://www.seeds-std.co.jp/seedsblog/1035.html)
- [osx - How to get rid of STRICT SQL mode in MySQL - Stack Overflow](http://stackoverflow.com/questions/18762308/how-to-get-rid-of-strict-sql-mode-in-mysql)
forループを高速化したい

##どうにかして高速化したい
javascriptコードをメンテナンスするときにどうにも早くならない。。。
理論的なことよりは試そうと思い、forについて試したことが有ります。

##試したこと
forで処理する回数を増やして、ループ回数を減らす。
普通は無駄で可読性落ちると思うので、やらないようなことをしてみました。
とりあえず手元の開発者ツールで試してみると、２倍くらい早くなった（1000ms強から500msくらい）
ので、ベンチマーク記録のためにjsPerfに登録しました。
ベンチマークとしては２倍も違わないけど、少し早くなっています。

###途中経過
jsperfを試してもらっていますが、Chromeバージョンによってバラつきありますね。
あと、FireFoxのループ処理が速いですね。

##テストケース
下記に作ったので試してみてください。
'http://jsperf.com/max-for-loop-speed'

##問題
pushしかしていないのでこれで問題ないが、ちゃんとしたロジックを書くとなると
この解決方法は難しいのかな。。。
MacOSXに"smartmontools"を入れる

Homebrew環境だと以下のコマンドで入る様子。

```
$ brew install smartmontools
==> Downloading https://downloads.sourceforge.net/project/smartmontools/smartmontools/6.2/smartmontools-6.2.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/smartmontools/6.2 --sysconfdir=/usr/local/etc --localstatedir=/usr/local/var --enable-drivedb --enable-savestates --enable-att
==> make install
?  /usr/local/Cellar/smartmontools/6.2: 29 files, 1.6M, built in 20 seconds
```

デフォルトだとパスは通ってないので適当に指定していれるといいかと。
scrollViewDidEndZooming:withView:atScale: の scale値


UIScrollViewDelegateの関数で、ズームイン・アウト時に呼ばれるscrollViewDidEndZooming:withView:atScale:

この中の引数 atScale に入るスケール値が、iOS7.1.1 x iPhone5S の組み合わせの場合におかしいことになりました。

```
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
    NSLog(@"scale = %f", scale);
}
```

###### 結果
` scale =  0.00000000021.....` 


のように極端に小さかったり、あるいは 0 になったり。

同じコードでも、
・iOS6.1 x iPhone5
・iOS7.1.1 x iPhone4
では、正常に値が取れていました。


調べても、同じ現象の記事は見つからなく、
ただ、警告として

```
Conflicting parameter types in implementation of 'scrollViewDidEndZooming:withView:atScale:': 'CGFloat' (aka 'double') vs 'float'
```

と出ていたので、型を float から CGFloat(or double) に変えたところ、上手く値が取れました。

ここ
http://stackoverflow.com/questions/23093752/conflicting-parameter-types-for-scroll-view-delegate
にあるように、64bitだとCGFloatにしないと上手く値が取れないのかもしれませんが、
一方でAppleのリファレンスの
https://developer.apple.com/library/ios/documentation/uikit/reference/uiscrollviewdelegate_protocol/reference/uiscrollviewdelegate.html#//apple_ref/occ/intfm/UIScrollViewDelegate/scrollViewDidEndZooming:withView:atScale:
には、型がfloatと載っているのでよくわからないままですが、とりあえずこれでいけそうです。
zshでの自作関数と、それに対する補完関数を実装する


## やりたいこと

- zshでオリジナルな関数を実装したい
- 自作関数にも補完を効くようにしたい
    - ファイル一覧を表示させたい
- オプションも付けたい

## 参考

- [zsh の補完関数の自作導入編](https://gist.github.com/mitukiii/4954559)

## 自作関数

`rm`を`~/.Trash/`に`mv`するだけのコマンド(もらいもの)に置き換えており、`rmf`は`/bin/rm/`に置き換えている
以前は

```zsh
function rmf() {
  for file in $*
  /bin/rm $file
}
```
としてあった
これだとファイル一覧の候補や、`-r`などの`/bin/rm`が持つオプションをうまく使えなくて困っていた

## 結果

こんな感じ

![output.gif](https://qiita-image-store.s3.amazonaws.com/0/280/03e8ef78-70d4-6b37-fb51-6b7a3c33d28b.gif "output.gif")

`-`を入力した状態で`<Tab>`を押すとオプションが一覧表示され、何も入力していない状態かオプションが入力された状態で`<Tab>`だとファイル一覧の候補を表示する

## コード

```zsh

# rmfで削除
function rmf() {
  # -h, --helpしたら呼ぶ
  help() {
    echo 'rmf help!'
    echo 'Usage: rmf [option] filename'
    return
  }
  # 引数に対してループを回す
  for file in $*
  do
    # 引数一つ一つについてcase文で条件分岐
    case $file in
      # -hか--helpだった時はhelp()を呼んで終わり
      -h|--help)
        help
        return
        ;;
      # -rfか-frだった時は$optionに"-rf"を入れておく
      -rf|-fr)
        option="-rf"
        ;;
      -r)
        option="-r"
        ;;
      -f)
        option="-f"
        ;;
      # ワイルドカード
      # オプションではない時のメインとなる処理
      *)       
        echo 'removed:' $file
        /bin/rm $option $file
    esac
    # shiftで配列の先頭を削除出来る
    # shift  
  done
  return 1;  # 必要かどうかはわからない
}

_rmfcmd() {
  # 補完のための便利な関数_arguments
  _arguments \
    # -h, --helpを入力した時にはファイル一覧の候補を表示しない
    # 複数のオプションは{foo,bar}と書く
    # '[description]'でオプションの説明
    '(- *)'{-h,--help}'[show help]' \
    -r'[recursive]' \
    -f'[force]' \
    -rf'[recursive && force]' \
    # ファイル一覧を出す
    '*: :_files'
}

# 補完関数_rmfcmdを自作関数rmfにあてる
compdef _rmfcmd rmf
```

## まとめ

```zsh
alias rmf="/bin/rm"
```
これで大体事足りたのに気付いた
でもオプションの説明表示とかはこれでは出来なかったのでまあ良し...？
Easy access to mac with Alfred app

It was just 2 weeks since I had installed Alfred and since it is a useful application launcher, I decided to write a few memo about it.

What helps me a lot is the easy way of opening files through alfred without clicking anywhere.
Just press the short cut key to launch the installed app.
It was always set up to “Option + Spacebar”

![Alfred1.png](https://qiita-image-store.s3.amazonaws.com/0/41038/79065ea2-f065-1e80-293d-3ee02bf03227.png)

To open files just type the word "Open + Folder name"

Found other useful shortcuts
"sleep"	        to Sleep your Mac
"lock"	        to Lock your Mac
"restart"	to Restart your Mac
"shutdown"	to Shut Down your Mac

The other trick that I always use is the dictionary. You can easily define a word by just typing
"Define + the word". I don't know if it will be available in other language. I use it when searching an English word to the dictionary but it will definitely useful if there is a Japanese version too.
PowerShellのカラーテストスクリプト

16色ですが。
color.ps1とかで保存して、実行。他にいい書き方はないものかな。

```ps1
@(
    "black"
    "darkblue"
    "darkgreen"
    "darkcyan"
    "darkred"
    "darkmagenta"
    "darkyellow"
    "gray"
    "darkgray"
    "blue"
    "green"
    "cyan"
    "red"
    "magenta"
    "yellow"
    "white"
) | % {
    Write-Host $_ -ForegroundColor $_ -NoNewline
    Write-Host "`t`t" -NoNewline
    Write-Host $_ -ForegroundColor $_ -BackGroundColor white
}
```

![powershell_color.png](https://qiita-image-store.s3.amazonaws.com/0/1126/2a5a4ae3-b488-2ee5-27ed-4264b55889db.png)

普通のコマンドプロンプトでANSIエスケープシーケンスによる色を有効にしたい場合は[ANSICON](http://adoxa.altervista.org/ansicon/)を併用するといい感じになります。
Objective-CでJSON取得して表示する方法

# 条件

今回は適当に[東京電力電力供給状況API](http://tepco-usage-api.appspot.com/)からJSON形式で当日の「供給可能最大電力」と現在の「消費電力」を表示する。

-[東京電力電力供給状況API](http://tepco-usage-api.appspot.com/)を利用
-日時を取得し２時間前の消費電力を取得する
-西暦、月、日、時間をそれぞれ取得
-json形式で取得する

# 手順
## 日付を取得して西暦、月、日、時間をそれぞれ取得
```objc
//現在の日付を取得
NSDate *now = [NSDate date];

//NSCalendarでフォーマット
NSCalendar *calendar = [NSCalendar currentCalendar];

NSUInteger flags;
NSDateComponents *comps;
//西暦、月、日、時間をそれぞれ取得
flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit ;
comps = [calendar components:flags fromDate:now];
````

## 西暦、月、日、時間をそれぞれ変数に代入
```objc    
NSInteger year = comps.year;
NSInteger month = comps.month;
NSInteger day = comps.day;
//２時間前を取得する為-2する
NSInteger hour = comps.hour - 2;
```

## 東京電力のAPI取得URLを生成
```objc
//元のURL
NSString *orign = @"http://tepco-usage-api.appspot.com";
//http://tepco-usage-api.appspot.com/西暦/月/日/時間.jsonとなるように生成
NSString *url = [NSString stringWithFormat:@"%@/%ld/%ld/%ld/%ld.json",orign,year,month,day,hour];
```

## NSURLRequestの生成
```objc
//NSURLからNSURLRequestを作る
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
//サーバーとの通信を行う
NSData *json = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//JSONをパース
NSArray *array = [NSJSONSerialization JSONObjectWithData:json options:NSJSONReadingAllowFragments error:nil];
```

## NSLogで表示

```objc
NSLog(@"供給可能最大電力：%@万kW　消費電力：%@万kW", [array valueForKeyPath:@"capacity"], [array valueForKeyPath:@"usage"]);
```

# 完成系

```objc
NSDate *now = [NSDate date];
    
NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger flags;
NSDateComponents *comps;
    
flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit ;
comps = [calendar components:flags fromDate:now];
    
NSInteger year = comps.year;
NSInteger month = comps.month;
NSInteger day = comps.day;
NSInteger hour = comps.hour - 2;
    
NSString *orign = @"http://tepco-usage-api.appspot.com";
NSString *url = [NSString stringWithFormat:@"%@/%ld/%ld/%ld/%ld.json",orign,year,month,day,hour];
    
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSData *json = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSArray *array = [NSJSONSerialization JSONObjectWithData:json options:NSJSONReadingAllowFragments error:nil];
NSLog(@"供給可能最大電力：%@万kW　消費電力：%@万kW", [array valueForKeyPath:@"capacity"], [array valueForKeyPath:@"usage"]);
````
CoreOSをISOからインストール

[ISO](https://coreos.com/docs/running-coreos/platforms/iso/)からダウンロード。

Beta Channel、Alpha Channelとあるが、Alpha Channelのほうが新しい。

* [IP固定](http://qiita.com/tukiyo3/items/ffd286684a1c954396af)

```bash:IP固定
ip addr add 10.0.2.15/24 dev eth0
ip route add default via 10.0.2.2
echo "nameserver 8.8.8.8" > /etc/resolv.conf
```

```bash:cloud-config.yml
wget -O cloud-config.yml http://myserver/cloud-config-core01.yml
```

* 他のCoreOSサーバのcloud-config.ymlを参考にするには`/var/lib/coreos-install/user_data`

```bash:install
sudo coreos-install \
 -V current \
 -d /dev/vda \
 -C alpha \
 -c cloud-config.yml -v
```

![スクリーンショット 2014-05-29 15.53.20.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1675f58e-f22a-f936-bac7-1ed4250e756d.png)

しばらく待つとダウンロードが完了しインストールが開始される。

```yml:cloud-config.yml
write_files:
  - path: /etc/systemd/network/10-static.network
    permissions: 0644
    content: |
      [Match]
      Name=ens18

      [Network]
      Address=192.168.3.3/24
      Gateway=192.168.3.1
      DNS=8.8.8.8
      DNS=8.8.4.4

ssh_authorized_keys:
  - ssh-rsa ssh-rsa AAAA...
```

* [Customize with Cloud-Config](http://coreos.com/docs/cluster-management/setup/cloudinit-cloud-config/)
* [Network Configuration](https://coreos.com/os/docs/latest/network-config-with-networkd.html)
    * インストールして初回起動時にIPが付与されていない場合、OS再起動
    * もしくは `systemctl daemon-reload`

何度もインストールする場合はミラーしておいたほうがいい。

```bash:ミラーしとく
$ wget http://alpha.release.core-os.net/amd64-usr/324.2.0/coreos_production_image.bin.bz2
$ wget http://alpha.release.core-os.net/amd64-usr/324.2.0/coreos_production_image.bin.bz2.sig
```
Laravel4のフォームでDBから持ってきたデータをSELECTに並べる

Controllerでこんなかんじで一覧を取って渡す。

```php
$categories = Category::all()->lists('name','id');
return View::make('index',[
                           'categories' => $categories,
                           ]);
```

Eloquentの`lists`っていうメソッドで上記のように書くと以下のように連想配列が取れる。

```php
[
  "1" => "Category1",
  "2" => "Category2",
]
```

で、以下のように渡してやる。

```php
{{ Form::select('category_id', $categories, null, ['class' => 'some-class']); }}
```

`Form::select`は第3引数はデフォルトで選択されている項目、第4引数はHTMLの要素に指定する属性。
ResqueでQueueを処理し終わったかどうか確認する方法

```rb
queue_name = 'queue name'
if Resque.size(queue_name) > 0 || Resque.workers.map(&:job).compact.any? { |j| j['queue'] == queue_name }
  # 処理中
else
  # 処理が終了している
end
```
Cで作ったOSXのキーロガーのログを時系列でグラフ表示

# 概要

前回作成した[Cで作るOSXのキーロガー](http://qiita.com/61503891/items/4ae3ae64b2531b516321)で記録したログを時系列で表示してみる。

# ログの形式

前回作成したキーロガーでは以下のようにタイムスタンプと押下されたキーコードのログが出力される。

```shell-session
$ head -n 5 keystrokes.log 
1401328736 124
1401328737 125
1401328737 44
1401328737 44
1401328738 1
```

# Rubyで1分ごとのキー押下数をカウント

`Time#strftime`で分まで切り出してそれを`hash`と`eql?`で使い回して横着した。

```rb:keystrokes.rb
require 'date'

class Rank

  attr_reader :time

  def initialize(time)
    @time = time
  end

  def to_s
    @time.strftime("%Y-%m-%d %H:%M")
  end

  def hash
    @hash ||= to_s.hash
  end

  def eql?(other)
    self.hash == other.hash
  end

end

{}.tap{ |ranks|
  ARGF.readlines.each{ |line|
    time = DateTime.strptime(line.split.first, '%s').to_time
    rank = Rank.new(time)
    ranks[rank] ||= 0
    ranks[rank] += 1
  }
}.to_a.sort_by{ |rank|
  rank[0].time
}.each{ |number, rank|
  puts "#{rank.to_s}\t#{number}"
}
```

実行してみる。

```shell-session
cat keystrokes.log | ruby keystrokes.rb | head -n 5
5	2014-05-29 10:58
122	2014-05-29 10:59
105	2014-05-29 11:00
60	2014-05-29 11:01
62	2014-05-29 11:02
```

ふむ。

# Gnuplotに食わせる

`plot`に`<`を使うと食べてくれる。

```gnuplot:keystrokes.plt
set xdata time
set timefmt "%Y-%m-%d %H:%M"
set xtics format "%H"
set xtics 60*60

set grid
set style fill solid
set xlabel "Timeline."
set ylabel "The number of keystrokes."

set terminal png
set output "keystrokes.png"

plot "<cat keystrokse.log | ruby keystrokes.rb" using 2:1:1 with i lc rgb "royalblue" notitle
```

これをGnuplotで実行する。

```shell-session
$ gnuplot keystrokes.plt
```

# 結果

(´｡･ω･｡)<進捗どうですか…。

![keystrokes.png](https://qiita-image-store.s3.amazonaws.com/0/32894/5ae8c631-d2a3-3f00-d7e6-7d4668d6d46d.png)
cronでrubyを定期的に実行する(備忘録)

# 全体の流れ
1. `crontab -e` で開かれるファイルに実行間隔と実行したいコマンドを書く  
2. 実行される
3. やったぜ。

# crontabの書き方
こちらのサイトが例が多くて分かりやすいです 
[crontabの書き方](http://www.server-memo.net/tips/crontab.html)  
自分は最終的に`0 * * * * /bin/bash -cl 'cd (xx.rbのあるディレクトリ) && ruby -Ku xx.rb'`のようなものを書きました

# 詰まった点
## crontabを書いて保存しても更新されない
viで開くと保存されないみたい…?
'EDITOR=nano crontab -e' などで他のエディタを指定しましょう

## cron書いたのに定期実行してない
/var/mail ディレクトリにログが出ているので確認しましょう  

## 自分で'ruby xx.rb'とすると動くのにcronから実行するとエラーが出る
requireが無いとかのエラー
　→ rbenvのglobalを見るとsystemになっていたので、普段使ってる2.0.0-p247に変更したらエラーが消えました  
US_ASCIIが云々のエラー
　→ rubyの実行オプションに-Kuを追加したら消えました

# 参考
[橋本商会 crontabでrbenvのrubyを使う](http://shokai.org/blog/archives/7258)
[cronでrbenvのrubyを使う3つの方法](http://blog.livedoor.jp/sonots/archives/33204053.html)
[Ruby-cronで「invalid byte sequence in US-ASCII」例外発生！](http://www.mk-mode.com/octopress/2011/09/01/01002024/)
えせスナップショット

どこで見つけたか覚えてない。
面白いけど使うことないなー。

```
$ ifconfig | convert label:@- ifconfig.png
```

ImageMagicってすごいね。

![ifconfig.png](https://qiita-image-store.s3.amazonaws.com/0/11595/fe8819be-4def-6217-2881-d177519d3a1a.png)