OmniAICreator/Qiita-1.07M huggingface dataset:
git mergeの履歴の違いを図にして整理してみた

# これは何？
* git merge コマンドには、`--no-ff`オプションや`--squash`オプションがあり。
* もう語り尽くされている部分ですが、それらの違いを整理して図にしてみたものです。

# 前提
* merge前のブランチは、`git rebase master`しておく。

# git merge の履歴の違い

![git-merge-explain.png](https://qiita-image-store.s3.amazonaws.com/0/39825/2e3c6109-19f1-58c5-8565-63bdcd69b704.png)


# ネットワーク図的な特徴

* --no-ff : マージコミットが作られる　＋　コミットログのネットワーク図を見ればどこから分岐してどこにマージされたのか視覚的にすぐわかる。
* --squash : コミットが1つにまとまって綺麗　＋　コミット履歴が1列になる　＋　masterブランチとの関係性が途切れる
* オプションなし　：　コミット履歴が一列になる。（masterブランチとbranchXブランチが同じ位置にくる）
Arel::Nodes::NamedFunctionの引数はArel::Nodes.build_quotedで処理しましょう

[ransacker_translator](https://github.com/patorash/ransacker_translator)というgemを作っているのですが、そのときに不具合に遭遇したのでメモっておきます。

Railsを4.2にバージョンアップしたところ、Ransackで独自に作った検索条件のところでテストが落ちてしまいました。

> RuntimeError: unsupported: String

原因は、Arel::Nodes::NamedFunctionの引数の配列に素の文字列を渡していたことにありました。
それらを全てArel::Nodes.build_quotedで処理する必要があるようです。

参考URL: [Regression with NamedFunction and InfixOperation](https://github.com/rails/arel/issues/323)


修正前のコード

```rb
Arel::Nodes::NamedFunction.new(db_function_name, args)
```

修正後のコード

```rb
Arel::Nodes::NamedFunction.new(db_function_name, args.map { |it| Arel::Nodes.build_quoted(it) })
```
redmine_stealthをRedmine2.6にインストールしてみた


redmine_stealthをRedmine2.6にインストールした時に、軽くハマったのでメモ。

インストール自体は [公式サイト](http://www.redmine.org/projects/redmine/wiki/PluginRedmineStealth) の手順通り、
RedmineのPluginディレクトリでgithubからソースを持ってくるだけ。

`# cd /var/lib/redmine/plugins/
 # git clone http://github.com/teleological/redmine_stealth.git`

Redmineを再起動させる為に、

`# touche /var/lib/redmine/restart.txt`

してからRedmineにブラウザアクセスすればOK…
のはずが、

> Web application could not be started
Undefined method `roots' for Rails:Module (NoMethodError)
/var/lib/redmine/plugins/redmine_stealth/init.rb:28:in `block in <top (required)>'
/var/lib/redmine/lib/redmine/plugin.rb:75:in `instance_eval'
/var/lib/redmine/lib/redmine/plugin.rb:75:in `register'
/var/lib/redmine/plugins/redmine_stealth/init.rb:19:in `<top (required)>'
/var/lib/redmine/vendor/bundle/ruby/2.1.0/gems/activesupport-3.2.19/lib/active_support/dependencies.rb:251:in `require'
/var/lib/redmine/vendor/bundle/ruby/2.1.0/gems/activesupport-3.2.19/lib/active_support/dependencies.rb:251:in `block in require'
/var/lib/redmine/vendor/bundle/ruby/2.1.0/gems/activesupport-3.2.19/lib/active_support/dependencies.rb:236:in `load_dependency'
/var/lib/redmine/vendor/bundle/ruby/2.1.0/gems/activesupport-3.2.19/lib/active_support/dependencies.rb:251:in `require'
/var/lib/redmine/lib/redmine/plugin.rb:150:in `block in load'
・
・
・

という切ない表示。
調べたら[公式サイトのIssueに2.3.0での対処法](https://github.com/teleological/redmine_stealth/issues/27)が書いてあったので、それを真似して、

`# vi /var/lib/redmine/plugins/redmine_stealth/init.rb`

`plugin_locale_glob = respond_to?(:directory) ?
File.join(directory, 'config', 'locales', '*.yml') :
File.join(Rails.root, 'vendor', 'plugins',
	'redmine_stealth', 'config', 'locales', '*.yml')`

この部分をコメントアウトして、
`plugin_locale_glob = File.join(Rails.root, 'plugins', 'redmine_stealth', 'config', 'locales', '*.yml')`
という行を追加して再度挑戦。
無事に起動しました。

(Pathは実際の設定に併せて編集しています)
GitHubの複数のリモートブランチを一括で削除する

GitHub上にブランチが溜まってきたときに、ブラウザからポチポチ一つずつ削除するのは面倒ですよね。

## やり方

ローカルのブランチ一覧から<文字列>にマッチするGitHubのリモートブランチを一括で削除します。

```
$ git branch | grep <文字列> |  while read branch ; do git push origin :${branch} ; done ; 
```

以下のように指定されたブランチを空プッシュすることでリモートブランチを削除することができるので、それをループさせて実行した形になります。

```
$ git push origin :{branch}
```

## 参考

こちらの方が賢かったです。

[Gitでリモートのマージ済みのブランチを一括削除する](http://qiita.com/fukayatsu/items/b1a5e1c0b98acaa6261d)
Elastic Beanstalkでコマンド実行のタイムアウトを短くする

設定で失敗すると、タイムアウトするまで何もできなくなるので、試行錯誤の際にはタイムアウトを短くしたい。

```
option_settings:
  - namespace: aws:elasticbeanstalk:command
    option_name: Timeout
    value: 900
```

この900を300(5分)とかに変えてcommitして`eb deploy`。
非同期Nodeアプリケーションのテスト

asyncモジュールを使った非同期Nodeアプリケーションのテスト方法を模索してみました。

とりあえず以下のようにしたら動きましたが、何かツッコミあれば下さい。

まず、アプリケーションですが、

1. 指定したURLの画像ファイルをダウンロードし、
2. そのファイルをGoogle Driveにアップロードし、
3. 新しいURLを取得する

というものです。

`argFtu`で渡しているのは、まるごと`ftu`インスタンスそのものです。

```js:app.js
var async = require('async');
var fileToUpload = require('./FileToUpload.js');
var ftu;

async.waterfall([
    function (callback) {
        /*** At first, download image file ***/
        ftu = new fileToUpload.FileToUpload('http://xxx.com/xxx.jpg', callback);
    },
    function (argFtu, callback) {
        /*** Secondary, upload the image file to Google Drive ***/
        argFtu.uploadToGoogleDrive(callback);
    },
    function (argFtu, callback) {
        console.log(argFtu.newUrl);
        callback(null, 'done');
    }
]);
```

この`FileToUpload`クラスをテストします。テストのフレームワークは**Mocha + expect.js**です。

```js:test.js
var fileToUpload = require('../FileToUpload.js');
var ftu;

describe('FileToUpload', function () {
    beforeEach(function (done) {
        var callback = function () {};
        ftu = new fileToUpload.FileToUpload('http://xxx.com/xxx.jpg', callback, done);
    });

    it('ファイルをアップロードすることができる', function (done) {
        var callback = function () {};
        expect(ftu.uploadToGoogleDrive(callback, done)).to.be.a('string');
    });
});
```

テストでは、**async**モジュール用の`callback`関数はいらないので、`function () {}`を突っ込みます（もっと良い書き方があれば教えて下さい）。

それでも非同期テストのために`done()`が残るので、**FileToUpload.js**の中で無効化しています。

```js:FileToUpload.js
            ...

            file.on('finish', function () {
                file.close(function () {
                    console.log('File download is done\n');
                    callback(null, _this); // for async module
                    if (done != null) {
                        done(); // for mocha async testing
                    }
                });
            });

            ...

                }, function (err, response) {
                    _this.newUrl = response.webContentLink;
                    _this.newUrl = _this.newUrl.replace('&export=download', '');
                    callback(null, _this); // for async module
                    if (done != null) {
                        done(); // for mocha async testing
                    }
                    return _this.newUrl;
                });

            ...
```

これで、アプリケーションもテストも（いちおう）正常に動きます。

---
ブログやっています：[Weed software](http://weed.cocolog-nifty.com/wzero3es/)
Haskellで円周率の近似値を出してみた

今年は積極的にいろいろ発信していくっていうのが一つの目標なのでQiitaで初投稿。
（Markdownにも慣れないとね）


元ネタはCodeIQの問題
[Egisonで円周率の計算](https://codeiq.jp/challenge.php?challenge_id=1281)

Egisonは知らないけど、同じく関数型言語Haskellを勉強中なので解けるかどうかチャレンジ。

```Haskell
getPi :: Int -> Double
getPi n
    | n <= 1 = 4
    | otherwise = 4 / f [1 .. n]
        where
            odd' n = 2 * (realToFrac n - 1) + 1
            f [] = 1
            f (x:xs) = odd' x + (realToFrac x ^ 2) / f xs
```
実行結果
```
*Main> getPi 15
3.141592653506836
it :: Double
```
おお、なんかそれっぽい。
たぶんできた！（はず）

けどこれがちゃんと「関数型」な考え方ができてるかどうかはそんなに自信なし。。。
というわけでまだまだ勉強始めたばかりですが、今年はHaskeller目指して頑張ろう。
アニメーション最強のVelocity.jsの使い方

## はじめに
今話題の[Velocity.js](http://julian.com/research/velocity/)について初歩の初歩だけまとめました。

**※追記：↓対抗馬のanime.jsについて記事書きました※**
[アニメーションライブラリ決定版か!?anime.jsで軽量・軽快に実装！](http://qiita.com/kyota/items/c46f44340a384e059a5e)

## Velocity.jsとは
jQueryのプラグイン。
`$.animate`と互換性を持ち、さらに高機能で非常に軽快なアニメーションをする。

## アニメーション技術補足
### jQuery Animation
便利だが重い。コマ落ちし過ぎ。

### CSS Transition, CSS Animation
軽いが、アニメーションを繋ぐなどが出来なかったりなど使い勝手が悪い。
結局、JavaScriptを頼らないと使い物にならないことが多い。

### Transit.js
有名なアニメーションライブラリのひとつであるjQueryプラグイン。
CSS Animationを制御しているため、軽快。
そして、3d-transformも使えるので表現が豊か。
だが、Velocity.jsにも軽快さは負ける。

- [Transit.js（公式サイト）](http://ricostacruz.com/jquery.transit/)

### Web Animations API
GoogleとMozillaが中心となって策定を進めているが、まだドラフトなのと、対応ブラウザが少ない。

### Velocity.js
速い、軽い、便利。
現在、最強（だと思う）

Velocity.jsは、CSSアニメーションを使わずに、JavaScriptのrequestAnimationFrameを使用して、アニメーションさせています。
requestAnimationFrameは、フレーム毎に再描画されるので、jQuery Animationと違いスムーズに描画されます。

## 使い方
最低限の内容をJavaScriptのコメントに記載。

### HTML
```html
<i></i>

<script src="http://code.jquery.com/jquery-2.1.3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.1.0/velocity.js"></script>
```

### CSS
```css
i {display: block; width: 50px; height: 50px; background: #ccc; position: absolute;}
```

### JavaScript
```js
$('i').velocity(
    {
        width: '100px',
        height: '100px',
        backgroundColor: '#000000',
        translateX: '+=200px',
        translateY: '+=200px'
    }, {
        // Option
        duration: 500, // アニメーション時間
        easing: 'ease-in-out', // イージング : linear, swing, ease, ease-in, ease-out, ease-in-out, [200, 15]
        begin: function(){console.log('start');}, // or null
        progress: null, // 進捗率
        complete: function(){console.log('end');}, // or null
        loop: 1, // 繰り返し : or false
        delay: 0, // 開始、ループ時に遅延させる Ex.1000
        display: 'none' // 表示・非表示 : false, 'none', 'block'
    }
);

// 省略記法
// $('i').velocity({...}, 500, 'ease-in-out'); 

// チェーンで繋ぐことも可能
// $('i')
//    .velocity({...}, 500, 'ease-in-out')
//    .velocity({...}, 500, 'ease-in-out'); 

```

#### jQuery無し版

jQueryを入れなくても使えます。

```js
Velocity(document.querySelector('i'), {...});
```

上記のように`Velocity(DOM指定, {アニメーション指定})`と書きます。

## 参考URL
- [Velocity.js（公式サイト）](http://julian.com/research/velocity/)
- [Velocity.js is next generation animation engine.](http://www.slideshare.net/yoheiminami/velocityjs)
- [Volocity.jsを使ってアニメーションのパフォーマンスを比較してみた](http://beijaflor.hatenablog.jp/entry/2014/06/18/090706)
SVNチェックアウトメモ

# はじめに
SVNのプロジェクト管理のディレクトリが開発ファイル、各ドキュメント、デザインファイル等の管理でルートのチェックアウトがヘビーになってきた場合、特定のフォルダのみ”がっつり”チェックアウトしたい

# 黒い画面だと

チェックアウト

```
cd ＜フォルダ＞
svn co --depth immediates ＜URL＞
```

の後

```
svn up --set-depth immediates ./＜ファイルパス＞
```

で1階層ずつとれる。で、適度なとこで

```
svn up --set-depth infinity ./＜ファイルパス＞
```

で全部とる

要はフォルダをdepth指定して、いらないものはempty、必要なものをinfinityにしてUpdateすればよい



### depth指定

そのフォルダをアップデートするときの階層指定

* empty：アップデートしない
* immediates：1階層下までアップデート
* infinity：以下すべてアップデート

まだあるけど使うのはこれくらい

#SmartSVNだと

### チェックアウト時

![51097d78ede47e01fb2ee2e2f02c1bdd.png](https://qiita-image-store.s3.amazonaws.com/0/37103/bed73da1-4bb9-e4be-7695-b74114f73774.png)

Checkout Depthを「immediate〜」にする

### Update時

![2514aaf4b7737930cc42c4e0958f0c3c.png](https://qiita-image-store.s3.amazonaws.com/0/37103/fdf8af7f-97bb-cd29-2304-21f04a9465ce.png)

Depthを「immediate〜」にする

![54b506d829e1cc3cb3bba697597d4e2f.png](https://qiita-image-store.s3.amazonaws.com/0/37103/5f3921af-e53c-7966-23b9-1fae9d780b0b.png)

Advancedに切り替えて「Set depth to working copy」にチェックを入れてUpdate
お目当てのフォルダが取得できたらBasic指定で「Fully〜」にしてがっつりとる
それ以下いらないフォルダは「Only this directory」の設定にしてしまう
Java の file.encoding の不思議

osx で Region を Japan にして Language を English に設定すると、


```
$ mvn help:system > en_US.systemproperties
(設定変更してリブート)
$ mvn help:system > en_JP.systemproperties
$ diff en_JP.systemproperties en_US.systemproperties
< file.encoding=UTF-8
---
> file.encoding=US-ASCII
(snip)
< LC_CTYPE=
---
> LC_CTYPE=en_US.UTF-8
(snip)
> LANG=en_US.UTF-8
```

となって大変ハマる（年末年始でマシンの電源切ったりリブートしたりすると）。

確認したバージョンは以下。

```
$ java -fullversion
java full version "1.8.0_25-b17"
```

LC_CTYPE あるいは LANG のいずれかが設定されていれば、file.encoding=UTF-8 になるようだった。ふむ。
【iOS画面回転制御】Universalアプリで、iPhoneかiPadなのかで回転OK/NGを決めたい場合

拙作、"ICF inputter" http://bit.ly/ICFinputteriOS
これをUniversal対応にすべくアクションしておりました。
※Androidも開発しました…　http://bit.ly/ICFinputAndr

このソフトは、「簡易な方法で医療記録をつける」ことに主眼をおいたもので
たとえば在宅医療の患者宅で、パッとメモ程度の記録を残して
後でevernoteなどに連携して編集することを想定しています。

なので、「使い勝手の良さ」をとにかく重要視したかったわけです。
デバイスごとのボタン配置・ボタンの大きさ＝フォントの大きさの指定は必須。
私は13個あるパーツの座標の配置とフォント指定をひたすらトライ＆エラーしました。

ただ、このソフトはiPhoneのLandscapeポジションで使うことはないと思われます。
それ故
・iPhoneはホームボタンが下のときのPortraitのみでOK.
　→回転禁止にしたい。
・iPadはLandspaceにしたほうが使い勝手がよい＆Portraitでも使うことが想定されたので
　→回転OKにしたい。

なのに、一部条件のときに
-(BOOL)shouldAutorotate;　でNOにしても

<b>画　面　が　廻　る</b>
ので困っていたところ。。。
<a href="http://cccookie.hatenablog.com/entry/2014/06/17/121248">cccookieさんの記事</a>が参考になりました。ありがとうございます。

cccokkieさんは別に親クラスを作っていらっしゃいますが、私はViewContoller.mのところでどうにもならなくて困っていたため、
<div class="code-frame" data-lang="she'll">
<div class="code-lang"><span class="bold">AppDelegate.h</span></div>
<div class="highlight"><pre>
//邪魔にならないところにつけたす。回転制御。
@interface UINavigationController (rotateControl)
- (BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;
@end
</pre></div>
</div>

<div class="code-frame" data-lang="she'll">
<div class="code-lang"><span class="bold">AppDelegate.m</span></div>
<div class="highlight"><pre>
#import "AppDelegate.h"

@implementation UINavigationController (rotateControl)

- (NSUInteger)supportedInterfaceOrientations
{
    return [self.visibleViewController supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotate
{
    return [self.visibleViewController shouldAutorotate];
}
@end
</pre></div>
</div>

を追記したところ、ViewContoroller.mで

<div class="code-frame" data-lang="she'll">
<div class="code-lang"><span class="bold">ViewContoroller.mより</span></div>
<div class="highlight"><pre>
-(BOOL)shouldAutorotate{
    AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
    if(appDelegate.iPad == 1){
        return YES;
    }else{
        return NO;
    }
}
</pre></div>
</div>
としていたコードが動くようになりました。

お困りの方の一助となれば幸いです。
Jenkins Build Flow Pluginで複数のジョブを並列実行する

Jenkinsで複数のジョブを続けて実行したい場合、[Build Flow Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Build+Flow+Plugin) を使うと簡単なDSLで書くことができます。

複数のジョブを並列に実行したい場合は、単純に`parallel`で複数のジョブを並べるだけ。

```groovy
parallel (
    { build("job1") },
    { build("job2") },
)
```

ビルドパラメータを等を使って、並列実行するジョブを動的に変更させたい場合は、クロージャのリストを作って`parallel`に渡せばOK。

ビルドパラメータで、`jobs`という名前でカンマ区切りのビルド名を指定する場合は以下のような感じ。

```groovy
def builds = []
params.jobs.split(',').each() { job ->
    builds.add( { build(job) })
}
parallel(builds)
```
シェルスクリプト内で続行するかどうかをyesかnoで確認するやつ

## 概要

シェルスクリプトの途中で「続行しますか？」的なやつ。


## コード

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

echo "Continue? (yes/no)"
while true ; do
    read ANSWER
    case ${ANSWER} in
        yes)
            break
            ;;
         no)
            echo "Terminated."
            exit 0
            ;;
          *)
            echo "Characters other than "yes" or "no" has been entered. Please re-enter."
            ;;
    esac
done
```


## 使用例

yes

```bash:yesno.sh
$ sh yesno.sh
Continue? (yes/no)
yes
$  
```

no

```bash:yesno.sh
$ sh yesno.sh
Continue? (yes/no)
no
Terminated.
$  
```

hoge

```bash:yesno.sh
$ sh yesno.sh
Continue? (yes/no)
hoge
Characters other than yes or no has been entered. Please re-enter.

```


## 所感
関数化しちゃうと便利。

いや、スクリプトの途中で何回も念を押すというのはどうなんだ。
swapしちゃった時の開放


どうでもいいことでもQiitaに入れてみよう実験。
メモメモ。

Swapしちゃった時に開放したい場合。

	swapoff -a
	swapon -a


もしくは、

	sync;echo "3" > /proc/sys/vm/drop_caches
	echo "0" > /proc/sys/vm/drop_caches


で。
もちろん元になったプロセスとかはなんとかしましょうね(；´∀｀)

## 解放前
	$ free -m
    	         total       used       free     shared    	buffers     cached
	Mem:         16041      13577       2464          0        134       5042
	-/+ buffers/cache:       8400       7641
	Swap:         2047        202       1845


## 解放後

	$ free -m
	             total       used       free     shared    buffers     cached
	Mem:         16041      12776       3265          0        134       4638
	-/+ buffers/cache:       8003       8038
	Swap:         2047          0       2047
Centos6.5 に Go.lang と mysql ドライバをインストールしてみた

## OS別の最新版ダウンロード URL

GO言語のダウンロードは以下から行います

```
https://golang.org/dl/
```

## Centos6.5でのGOインストール手順

### ディストリビューションの確認

```
cat /etc/redhat-release                                                                                       
----
CentOS release 6.5 (Final)
```

### インストール

```
cd /usr/local/src
wget https://storage.googleapis.com/golang/go1.4.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.4.linux-amd64.tar.gz
```

### パスの設定

```
export GOPATH=/usr/local/go/
export PATH=$PATH:/usr/local/go/bin
```


### .bashrc にパスを追記

次回ログイン時も有効になるように設定しておく

```
cat << '_EOT_' >> ~/.bashrc
GOPATH=/usr/local/go/
PATH=$PATH:/usr/local/go/bin
_EOT_
```

### MySQLドライバのインストール

```
go get github.com/go-sql-driver/mysql
```

## サンプルプログラムの実行

```
cat << '_EOT_' > /tmp/hello.go

package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
_EOT_


go run /tmp/hello.go
---
hello, world
```
## 上記サンプルをコンパイルして実行

```
go build /tmp/hello.go
./hello 
---
hello, world
```

## httpを書いてみる

```

cat << '_EOT_' > /tmp/http.go

package main

import (
    "fmt"
    "html"
    "net/http"
)

func HelloServer(w http.ResponseWriter, req *http.Request) {
    title := html.EscapeString(req.URL.Path[1:])
    strpost := req.FormValue("strpost")
    strget := req.FormValue("strget")
    output := `
<html>
  <head>
   <title>` + title + `</title>
  </head>
  <body>
  <h1>post/getのテスト</h1>
     <h2>post</h2>
        post=`+ html.EscapeString(strpost) + `</br>
     <h2>get</h2>
        get=`+ html.EscapeString(strget) + `</br>
  </body>
</html>
`
fmt.Fprintf(w, "%s", output)
}

func main() {
    http.HandleFunc("/hello", HelloServer)
    http.ListenAndServe(":8080", nil)
}
_EOT_

go run /tmp/http.go
```
Pull Requestベースの開発で最低限必要なGit操作チートシート


# 記事の目的
チームではgitとPull Request(プルリクエスト、プルリク)を使った開発をしているが、gitもプルリクも初めての人が入ったときに一番最初に覚えて欲しい内容のメモ。
日常的に利用するコマンドのチートシートにしたいため、cloneやremoteなどの設定は終わっている前提。
(現状下書き段階なので適当にアップデートしていきます。たぶん。)

こういう内容も入れてはどう？というコメントもあれば。
ただ、"最低限"の内容にこだわっているのであまり文量は増やさない方針。

# コマンドチートシート

## 最低限の最低限

作業フローは経験したことがあるけどコマンドうろ覚えの人用。

```bash:
$ git checkout master  # 開発環境上のブランチをmasterに切り替え
$ git pull             # 開発環境上のコードを最新にする
$ git checkout -b feature/kakkoii_kinoh # masterブランチを元にして新しいブランチを作成
## 作業する ##
$ git add your/path/to/file # 指定したファイルの変更をステージングに上げる
$ git commit -m '◯◯の機能を実装' # コメントを付けてコミットする
## 必要なだけ作業→コミットを繰り返す ##
$ git push origin feature/kakkoii_kinoh # ブランチをリモートリポジトリにPushする
## github上でプルリクを出す ##
```

# 実際の流れをもうちょっと詳しく

## 作業用ブランチの作成

新しい機能を作るためのブランチを作成

```bash:
$ git checkout master  # 開発環境上のブランチをmasterに切り替え
$ git pull             # 開発環境上のコードを最新にする
$ git checkout -b feature/kakkoii_kinoh # masterブランチを元にして新しいブランチを作成
```

現在自分がどのブランチにいるかは以下のコマンドで確認

```bash:
$ git branch # 開発環境上に存在するブランチ一覧と、現在のブランチを表示
```

## 作業する

一段落つくまで作業する。
粒度はプロジェクトによって異なる。

作業内容は以下のコマンドで確認

```bash:
$ git diff   # どのファイルがどう変更されているか(差分)を表示
$ git status # どのファイルが変更されているかを表示
```

## 作業内容をステージングエリアに上げる

```bash:
$ git add your/path/to/file # 指定したファイルの変更をステージングに上げる
```

ステージングに上がったどうかの確認

```bash:
$ git status # どのファイルがステージングに上がったかを表示
```


### 


## コミットを作る

```bash:
$ git commit -m '◯◯の機能を実装' # コメントを付けてコミットする
```

確認用コマンド

```bash:
$ git show        # 直前のコミットに含まれる差分を表示
$ git show --stat # 直前のコミットに含まれるファイル一覧を表示
$ git status      # コミットされずに残っているファイルの確認
```

## Pushする

コミットを作った時点ではまだリモートリポジトリには反映されていない。
つまり、自分の開発環境でだけの操作で、他の人からは見えない状態。

次のコマンドを実行すると、他の人からも変更が見えるようになる。

```bash:
$ git push origin feature/kakkoii_kinoh # ブランチをリモートリポジトリにPushする
```

## Pull Requestを出す

github上でプルリクを出す。


## 次の作業(最初)に戻る

お疲れ様でした。
それではまたmasterブランチに戻って新しい作業を続けましょう！


# 参考

現場で使うGitのテクニック - Qiita
http://qiita.com/treby/items/9184251b545d9ebc3198#%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%81%82%E3%82%8C%E3%81%93%E3%82%8C

プロジェクトGit運用手順まとめ - Qiita
http://qiita.com/Sanche/items/9b2b50f065c9042414f0
Google App Engine/Python 開発環境構築手順（2014年後半）

以下、Mac OS X の場合の説明です。手元環境 Mac OS X 10.8.5 にて実施した手順を記載しています。

#前準備
Googleアカウントを用意しておく。アカウントのIDおよびパスワードは、google cloud SDK の各種ツールを使用する際に頻繁に要求されるので、手順を開始する前にあらかじめ決めておく（なければ作成しておく）ことが必要。
Googleアカウントは、GAEプロジェクトの管理者とするために最低１つは必要。

#Google Cloud SDK インストール
##1. Python2.7 インストール
MacOS Xには最初からインストールされている。
念のためバージョンを確認するとよい。
確認方法は、ターミナルを起動し、コマンド```python```を実行。

##2. google cloud SDK インストール
（https://developers.google.com/cloud/sdk/?hl=ja より抜粋）
ターミナルから以下のコマンドを実行する。

```bash:
curl https://sdk.cloud.google.com | bash
```
プロンプトの指示に従って続行する（インストール先の指定など）。
curlの処理が終わったら、ターミナルをいったん終了させ、再度開く（環境変数の変更を反映させるため）。続けて以下のコマンドを実行する。

```bash:
gcloud auth login
```
続けて以下のコマンドを実行する。

```bash:
gcloud components update gae-python
```
これにより、ローカル開発サーバのツール一式（GAELauncherなど）がインストールされる。

##3. pychecker（ソースコード解析ツール）インストール
[Google Python スタイルガイド](http://google-styleguide.googlecode.com/svn/trunk/pyguide.html)（日本語訳は少し古いけど[こちら](http://works.surgo.jp/translation/pyguide.html))にて、pychecker によるソースコードのチェックを推奨しているので、インストールする。
1. http://sourceforge.net/projects/pychecker/files/ からダウンロードし、
2. ダウンロードした tar を任意の場所に展開し、
3. ターミナルでその場所に移動して、次のコマンドを実行。

```bash:
sudo python setup.py install
```
 
#ローカル開発サーバ 動作チェック
ここまでやれば、ローカル開発サーバが起動する状態になっているはずなので、実際やってみる。
1. GAE Launcherを起動する。
GAELauncherの場所は、既定値では：

```
~/google-cloud-sdk/platform/GoogleAppEngineLauncher.app
```
2.[file]メニューから[New Application…]を選択
![スクリーンショット 2014-12-08 16.30.26.png](https://qiita-image-store.s3.amazonaws.com/1824/60551/bbdefd78-70dd-31b4-620f-0f2e7a700651.png)
3. Application ID に任意の名前を付け、Application Directory に任意の場所を選択し、[Create]ボタン押下
4. 作成されたプロジェクトを選択し、[Run]ボタン押下
5. アイコンが緑色になったら起動完了。[Browse]ボタン押下するとブラウザが起動し、Hello worldが表示されるはず。

#エディター環境整備
開発する際のエディター、IDE環境は何でも良いのだが、今回はAptana3を使う場合の手順を記載する。
Eclipse系なら同様の手順でよい。（はず）

1. Aptana Studio 3 インストール
2. pleiades インストール（日本語化プラグイン）
3. Emmet インストール（HTML/CSSタグ入力支援プラグイン）<br />
Aptana を起動し、<br />[ヘルプ]メニュー→[新規ソフトウェアのインストール]を開き、<br />作業対象URLに http://emmet.io/eclipse/updates/ を入力してインストールする。
4. Command Line Tools for OS X インストール<br />
OS X 10.8 で、Eclipseにて、Pythonインタープリタが認識できないという問題があり、それを解消するため。<br />
http://stackoverflow.com/questions/5595276/pydev-eclipse-python-interpreters-error-stdlib-not-found<br />
http://stackoverflow.com/questions/11702139/pydev-debugger-unable-to-find-real-location-for-python-2-7-after-os-10-8-upgrad
5. Aptana を起動し、環境設定から PyDev インタープリタを登録する。<br />
Python2.7 のパスは以下を指定する。<br />
```
/Library/Frameworks/Python.framework/Versions/2.7/bin/python
```<br />
GUIから選択する場合は以下のように降りていく。<br />
```
Machintosh HD/システム/ライブラリ/Framework/...
```

※Aptana3 に、google plugin for eclipse を入れると、Aptanaが起動しなくなってしまうので、入れない。理由不明。java開発じゃないので使わなくてよい。

※※「新規ソフトウェアのインストール」で「１つ以上の必須項目が見つからないため、インストールを完了できません。」のエラーになった場合、「使用可能なソフトウェア・サイト」で、「Eclipse Indigo Update Site」にチェックが外れているのが原因かもしれない。
チェックつけてリトライしてみるとよい。


以上おわり

#参考リンク
http://qiita.com/yuko/items/aaac6ea9536cd529106f
http://qiita.com/yuko/items/1c4ee5b081c5b6a3ac8a
android データ保存

```MainActivity.java

//Preferences生成
SharedPreferences getpref = getSharedPreferences("pref", MODE_PRIVATE);

//Preferencesにversionを空で設定
                String appLatestVersion = getpref.getString("version", "");

//Preferences編集
SharedPreferences.Editor e = getpref.edit();

//versionを編集
 e.putString("version","hoge").commit();

```
用docker和golang做一个中文分词应用


##Docker
什么是docker？https://www.docker.com/
Docker - An open platform for distributed applications for developers and sysadmins.

## Docker 对于开发人员

之前的麻烦
1. 软件安装麻烦
2. 可移植性差
3. 隔离性差
4. 虚拟机笨重


现在
1. Docker是轻量的 (接近原生app的性能)
2. 建立app很简单 (就是简单的pull image)
3. 不同的app之间完全隔离
4. 标准化(os, 到语言)

##实作
###中文分词
https://github.com/raquelken/gommseg

###例子
```go
package main

import (
	"fmt"
	"github.com/raquelken/gommseg"
	"strings"
)

func main() {
	text := "枯藤老树昏鸦 小桥流水人家 古道西风瘦马 夕阳西下 断肠人在天涯"
	texts := strings.Split(text, " ")
	for _, t := range texts {
		words := gommseg.Ana.Cut(t)
		for _, word := range words {
			fmt.Println(word)
		}
	}
}
/*
枯
藤
老树
昏
鸦
小桥流水
人家
古道
西风
瘦马
夕阳西下
断肠
人在天涯
*/
```

##编写完整的docker应用

###中文分词API
```go
package main

import (
	"encoding/json"
	"fmt"
	"github.com/raquelken/gommseg"
	"log"
	"net/http"
)

func tokenizeHandler(w http.ResponseWriter, r *http.Request) {
	text := r.URL.Query().Get("t")
	words := gommseg.Ana.Cut(text)
	b, err := json.Marshal(words)
	if err != nil {
		log.Fatal(err)
	}

	w.Header().Set("Content-type", "application/json; charset=utf-8")
	fmt.Fprintf(w, string(b))
}


func main() {
	http.HandleFunc("/tokenize", tokenizeHandler)
	http.ListenAndServe(":8080", nil)
}

/*
go run app.go
curl http://localhost:8080/tokenize?t=菱形图案圆领针织衫
["菱形","图案","圆领","针织衫"]
*/

```

###Dockerfile
```dockerfile
From google/golang

# go get all of the dependancies
RUN go get github.com/raquelken/gommseg

COPY app.go / 

#RUN go build app.go
EXPOSE 8080
CMD go run app.go
```

### build docker image
```sh
docker build -t="mmseg_app" .
```

### run app
```sh
docker run -i -t -c 1024 -p 40080:8080 mmseg_app
curl http://localhost:40080/tokenize?t=菱形图案圆领针织衫
// ["菱形","图案","圆领","针织衫"]

```

###帮助 
```sh
docker COMMAND --help
docker run --help
```

###有用的命令
```sh
docker ps -l // check docker proccess
docker rm container // rm container
docker rmi image // rm image
docker images // check images
docker stop $(docker ps -a -q) // stop all containers
docker rm $(docker ps -a -q) // rm all containers
```

###有用的docker文档
http://yeasy.gitbooks.io/docker_practice
AviaryからAdobe Creative SDKに移行したらハマった、というかハマり中

AviaryがAdobeに買収されて、Aviary SDKがAdobe Creative SDKに統合されました。
で、そのmigrationを行ったところ、実機でアプリが落ちるようになってしまいました。新規インストールでも落ちないためちょっと厄介です。

どうやら、AVYContentManager内で、AFPermissionContainerをデシリアライズしようとして落ちる模様です。おそらく古いSDKでこのオブジェクトを保存しちゃうとダメなんでしょう。

年末にAdobeにreport済みですが、特に反応なし。現在回避策を検討中。
クラッシュを発生させるNSKeyedUnarchiverの入力をダンプして、再現コード生成に成功。Adobeに報告済み。
あとは彼らが修正してくれるのを祈るか。。。

使用しているSDK
CreativeSDK-iOS-v0.7.2072

クラッシュ確認した端末
iPhone5s iOS8.1.1

##回避案1 NSKeyedUnarchiverで対応
スタックトレースからNSKeyedUnarchiverの、unarchiveObjectWithData呼び出しのなかで、AFPermissionContainerがデコードできずに落ちていることは間違いないようです。
method swizzlingによりunarchiveObjectWithDataをnil返す実装に入れ替えることで、とりあえず落ちない状態に持っていくことはできました。もちろん、AVYContentManager初期化後にすぐに実装は元に戻しています。

## 追記
CreativeSDK-iOS-v0.8.2074.zipでも修正されていない模様。
100%クラッシュを再現するコード付きでレポート済みなのですが、優先度あげてもらえてないのかなぁ。
SwiftのUIColorで16進数形式（Hex）を扱えるように拡張する

UIColorExtention.swiftというファイルを新規作成して、下記コードをいれます。

```swift:UIColorExtention.swift
import Foundation

extension UIColor {
    convenience init(red: Int, green: Int, blue: Int) {
        assert(red >= 0 && red <= 255, "Invalid red component")
        assert(green >= 0 && green <= 255, "Invalid green component")
        assert(blue >= 0 && blue <= 255, "Invalid blue component")
        
        self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0)
    }
    
    convenience init(netHex:Int) {
        self.init(red:(netHex >> 16) & 0xff, green:(netHex >> 8) & 0xff, blue:netHex & 0xff)
    }
}
```

使用するときは下記のように0xに続けて16進数を記入します。

```swift
UIColor(netHex: 0x5EBABA)
```
Travis CI経由でgh-pagesにmiddlemanで構築した静的サイトをデプロイ。



以前から興味があったmiddlemanを使ってGitHubにホストした自分のページを作りました。

その中で、Travis CI経由でGitHub Pagesにデプロイする方法を見つけたので試してみたときのメモです。

## やりたいこと

[https://github.com/kimihito/kimihito.github.io](https://github.com/kimihito/kimihito.github.io) にコードは置く。

- ``` develop ``` ブランチでは ``` middleman build ``` する前のコードがあってほしい。

- ``` master ``` ブランチは ``` middleman build && middleman deploy ``` された後のコードが置いてあって欲しい。

- Travis CI側で、 ``` develop ``` ブランチにpushしたら自動的に ``` middleman build && middleman deploy ``` して ``` master ``` ブランチにPushしていてほしい


## やったこと

[Middleman Blog を Travis-CI で GitHub Pages に継続デプロイ - Atsushi Nagase](http://ja.ngs.io/2013/12/09/middleman-travis-ci/)

の手順と同じように、

#### 1. Travis CIにリポジトリを登録

#### 2. GitHubでPersonal access tokensを生成

#### 3. travis より暗号化されたキーを取得

  ```--add``` オプションをつけることで自動で .travis.ymlに追加される

  ```bash:
  $ travis encrypt -r kimihito/kimihito.github.io "GH_TOKEN=GitHubのPersonal access tokens" --add
  ```

#### 4. .travis.yml を書く

今回は```develop```ブランチにPushされたときに```middleman deploy``` が行われるようにする


  ```yaml:
  language: ruby
  script: bundle exec middleman build
  env:
    global:
      - GIT_COMMITTER_NAME='TravisCIでのユーザ名@travis-ci'
      - GIT_COMMITTER_EMAIL='メールアドレス'
      - GIT_AUTHOR_NAME='TravisCIでのユーザ名@travis-ci'
      - GIT_AUTHOR_EMAIL='メールアドレス'
      - secure: "(3 で取得した secure の値)"
  after_success:
    - '[ "$TRAVIS_BRANCH" == "develop" ] && [ $GH_TOKEN ] && bundle exec middleman deploy >/dev/null 2>&1'
  ```

#### 5. ```config.rb``` にデプロイ設定を記述

```ruby:
activate :deploy do |deploy|
  deploy.method = :git
  deploy.branch = 'master' # master ブランチにデプロイするように設定
  deploy.remote = "https://#{ENV['GH_TOKEN']}@github.com/kimihito/kimihito.github.io.git" # GitHubのリポジトリ情報を入れる
  deploy.build_before = true #デプロイするときにビルドするように設定
end

```

これで```develop```ブランチにpushすると```master```の方にビルドされたものがforce-pushされます。


### ハマったところ

[ここで述べられているように](http://www.ckazu.info/blog/2013/11/08/deploy_by_travis_ci/)、```middleman deploy```で作られる ```master``` ブランチへのコミットが、ビルドしてしまうので、```middleman deploy``` の際に入る[コミットメッセージに[ci skip]を追加しました](https://github.com/kimihito/middleman-deploy/commit/ff10da8460e0c92650bb0b6f112d1636144aa8dc)。



## 参考

- [Middleman Blog を Travis-CI で GitHub Pages に継続デプロイ - Atsushi Nagase](http://ja.ngs.io/2013/12/09/middleman-travis-ci/)

- [Middleman で作った web サイトを Travis + GitHub pages でお手軽に運用する - tricknotesのぼうけんのしょ](http://tricknotes.hateblo.jp/entry/2013/06/17/020229)

- [Middleman の記事更新を Travis-CI でする - ckazu.info](http://www.ckazu.info/blog/2013/11/08/deploy_by_travis_ci/)
Microsoft Azureで独自ドメイン設定（ムームードメイン）


## Azureで Webサイトを作る

まずは、Azureにログインして、画面左下の「新規」から「コンピューティング→WEBサイト→簡易作成」などで Webサイトを作ります。

![2015-01-05_9-01-13.png](https://qiita-image-store.s3.amazonaws.com/0/3977/1d32881b-8e1f-c1ca-19f7-8211a4da5635.png)

作れたら、リストに作った Webサイトが表示されるのでこれをクリックして「構成」をクリックします。画面の真ん中あたりにある「ドメインの管理」をクリックします。

![2015-01-05_9-05-09.png](https://qiita-image-store.s3.amazonaws.com/0/3977/825a45ac-1f96-d91b-e8de-ccc55cc02106.png)

独自ドメインは、「共有」以上のプランでないと作れないので、ボタンがクリックできない場合はプランをアップグレードしましょう。

次のような画面が表示されるので、これを表示しておいて、ムームードメインの設定に移ります。

![2015-01-05_9-07-22.png](https://qiita-image-store.s3.amazonaws.com/0/3977/e25f4cad-5e37-d0d6-d411-28aff364417a.png)

## ムームードメインの設定

ムームードメインで、設定した独自ドメインの設定をしたら（取得していない場合は、あらかじめ取得しておきましょう）、「ドメイン管理→ドメイン操作→ムームーDNS」をクリックし、Azureに割り当てたいドメインの「利用する」ボタンをクリックします。

![2015-01-05_9-11-26.png](https://qiita-image-store.s3.amazonaws.com/0/3977/dc292cd8-a646-0804-2665-1e5ba3d8e923.png)

ムームーDNSの設定画面で、「設定2」の方を次のように設定していきます。

![2015-01-05_9-12-23.png](https://qiita-image-store.s3.amazonaws.com/0/3977/fd222d33-0ed1-5f14-1631-ac06f90c60a0.png)

CNAMEの設定が2つと、Aレコードの設定が1つ。設定する内容はそれぞれ、先ほどのAzureの設定画面に記述されています。このまましばらく待ちます。

## Azureでドメインの割り当て

ドメインの確認が完了すると、Azureで設定できるようになります。先ほどの「ドメインの管理」の画面に、設定したい独自ドメインを入力します。この時、緑のチェックマークが付けば設定完了です。赤い×のマークが出る場合は、正しく設定されていないか、まだ浸透していないようです。
Notepad++でMarkdownを利用するには

# PreviewHTMLを強化し、Pandocをインストールする
手順さえ分かれば、MarkdDown記法とプレビューもNotepad++には
簡単に導入することができます。

## PreviewHTMLを強化する

プラグインマネージャでインストールできるPreviewHTMLは古いので、公式サイトからダウンロードして使用します。

[Preview HTML公式サイト](http://chiselapp.com/user/vor0nwe/repository/npp_preview/home)

次に、Notepad++でMarkdown記法のシンタックスハイライト表示ができるよう、
下記サイトから必要なファイルをダウンロードします。

[Top 10 Notepad++ Plugins For Writers And Coders](http://www.guidingtech.com/31357/notepad-plus-plugins/)
「1. Install Markdown」の「Step 1: Download this language file.」をクリックすると
ダウンロードが始まります。

（2017.08.23 追記）
Zip を解凍して、「default_theme」を開き、「userDefineLang_markdown.xml」を、Notepad++ がインストールされているフォルダの直下に設置します。

※ この言語ファイルは、文書ファイルの背景が白であることを想定されて作られています。
Monokai などの黒系テーマを使っている人は要注意です（カスタマイズできそうですが…）。

「言語」メニューより、「言語を定義...」を選択し、「インポート」から、先程設置した、「userDefineLang_markdown.xml」を選択します。

Notepad++ を再起動すると、「言語」メニューの下の方に、「Markdown」が追加されます。

## MarkDown記法をHTMLに変換するPandocをインストールする

### インストール方法
Chocolateyを使っているならコンソールで以下のコマンドをたたけばOKです。

`
choco install pandoc
`

次にHTMLのテンプレートを生成する。

`
pandoc -D html5 > template.html
`

テンプレートの置き場所はバージョンチェックで分かります。

`
pandoc --version
`

「Default user data directory:」で書かれているディレクトリが無ければ生成し、
/pandoc ディレクトリ以下に「templates」フォルダを作って、その中にtemplate.htmlを設置します。

基本的には、生成されたテンプレート内にCSSを直接記述することで、
下記の画像のように独自のデザインを適用することができます。

![markdown.png](https://qiita-image-store.s3.amazonaws.com/0/44077/11b7f03d-b6d7-0a29-bcc4-8d751bdfb0ed.png)
親愛なる甥に送るｃ学習のまとめ#２



#環境構築にあたり考慮すべきこと
色んなデバイス上で、色んなプログラムが必要なのです。
メモリをシビアに使うプログラムもあれば、大型のプログラムもあります。
いずれにしろ、ｃが書けないと辛いです。
Linux環境は必須。
Win環境も理解しておくほうが良いでしょう。
最強の環境はMacだと思うけど、「自分で購入すべし」。

#構築順
##１．bcc32
まずは、bcc32を実現。
プログラム出来るようにはなります。

##２．VmwarePlayer
仮想環境であれば何度でも失敗できます。
失敗を恐れずに取り組みましょう。

##３．Linux実機環境
中古PCで頑張りましょう。
その前Linuxの系統を紹介しておきます。
Debian系
RPM系
Slackware系(Slacksとも言います)
独立系

##参照：http://distrowatch.com/
ディストリは選び放題なのです。

日本国内では、
サーバーはRPM系のCentOS
クライアントはDebian系のUbuntu
![kobito.1420413914.926646.png](https://qiita-image-store.s3.amazonaws.com/0/33317/92f8f3aa-0d2b-693f-9427-f826d56818a6.png "kobito.1420413914.926646.png")

###初心者向け
Ubuntu

###軽量
DSL http://www.damnsmalllinux.org/


#書籍
色々あるけど、この書籍は素晴らしいです。
まさに独習。
http://www.amazon.co.jp/%E7%8B%AC%E7%BF%92C-%E7%AC%AC4%E7%89%88-%E3%83%8F%E3%83%BC%E3%83%90%E3%83%BC%E3%83%88%E3%83%BB%E3%82%B7%E3%83%AB%E3%83%88/dp/4798115770/ref=sr_1_29?s=books&ie=UTF8&qid=1420411451&sr=1-29&keywords=c%E8%A8%80%E8%AA%9E

![kobito.1420414256.025754.png](https://qiita-image-store.s3.amazonaws.com/0/33317/3c3f9c2c-bb27-9756-3ec2-bbb4620e9438.png "kobito.1420414256.025754.png")
【C++】 緯度経度より距離を求める

# はじめに

* [緯度経度より距離を求める方法・備忘録 ｜ 地球は丸い！](http://www.kiteretsu-so.com/archives/1183)

上記のサイトを参考というか、このサイトではPHPで書かれているのをC++に書き換えてみました。では、どうぞ↓

# ソースコード

```cpp:distanceMeasurement.cpp
#include <iostream>
#include <math.h>

#define rad2deg(a) ((a)/M_PI * 180.0) /* rad を deg に換算するマクロ関数 */
#define deg2rad(a) ((a)/180.0 * M_PI) /* deg を rad に換算するマクロ関数 */

using namespace std;

typedef struct{
	char positionName[120];
	double latitude;
	double longitude;
}coordinate;

int main(){
	double earth_r = 6378.137;
	double laRe,loRe,NSD,EWD,distance;
	coordinate A;
	coordinate B;
	cout<<"１つ目の場所についての情報を入れてください。"<<endl;
	cout<<"地名：";
	cin>>A.positionName;
	cout<<"緯度：";
	cin>>A.latitude;
	cout<<"経度：";
	cin>>A.longitude;
	cout<<"２つ目の場所についての情報を入れてください。"<<endl;
	cout<<"地名：";
	cin>>B.positionName;
	cout<<"緯度：";
	cin>>B.latitude;
	cout<<"経度：";
	cin>>B.longitude;
	laRe = deg2rad(B.latitude - A.latitude);
	loRe = deg2rad(B.longitude - A.longitude);
	NSD = earth_r*laRe;
	EWD = cos(deg2rad(A.latitude))*earth_r*loRe;
	distance = sqrt(pow(NSD,2)+pow(EWD,2));
	cout<<A.positionName<<"と"<<B.positionName<<"の距離は"<<distance<<"km"<<endl;
}
```

## 実行結果

```
１つ目の場所についての情報を入れてください。
地名：大阪駅
緯度：34.702113
経度：135.494807
２つ目の場所についての情報を入れてください。
地名：東京駅
緯度：35.681541
経度：139.767103
大阪駅と東京駅の距離は405.91km
```

## 補足

座標はGoogleMapを利用して取得しました。
今回取得した距離はおおよその直線距離で実際の距離とは異なります。
精度を高めるにはもっと複雑な計算が必要ですが今回は簡易な方法で行いました。
JavascriptのpreventDefault

古いjQueryを使っていると「preventDefaultは非推奨だから、defaultPreventedを使え」と怒られる。
jQueryが古いというのに気づかずにしばらく悩んだが、ネットを検索して対処。
このへんの挙動はWeb全体の動きに影響してくるから、あまりブラウザ側では変更して欲しくない箇所。
写真撮ってメール送信するだけのiPhoneアプリを作る

#きっかけ
iPhoneのカメラもずいぶん高性能になり、出張報告やホワイトボードの撮影等、仕事に使うケースも増えたのではないでしょうか。

そんな時は、写真を撮って撮影後の写真をアプリから選択し、アクションとしてメール送信を選択して送信する。もちろんこれでOK・・なのですが、これって意外と面倒くさい。

チョイスは後でやるから、とりあえずどんどん、自分宛てにメール送信してしまっておきたい。撮影とメール送信を1アクションでやってしまいたい。

そう思ってアプリを探したのですが、これが意外と見つからない。

ええい面倒だ、作ってしまえ、と思って作った、これがきっかけです。

#ソース
さすがにアプリとして公開するのもアレなので、Githubに公開するにとどめます。

[fujisan3/PhotoMail](https://github.com/fujisan3/PhotoMail)

※送信先として、事前に設定アプリからメールアドレスを設定しておいてください

#ポイント
Qiitaをご覧になる皆さんに役立つようなTIPSは特にありませんので簡単に。

・ カメラ撮影はUIImagePickerController、メール送信はMFMailComposeViewControllerの機能をそのまま使うので、ほとんどコード書いてません

・ 撮影後のデリゲートメソッド（imagePickerController:didFinishPickingMediaWithInfo）の中で、そのままメールを送信画面を表示しています。

```lang:ViewController.m
@interface ViewController () <UIImagePickerControllerDelegate, UINavigationControllerDelegate, MFMailComposeViewControllerDelegate> {
    UIImagePickerController *c_picker;
}
```

```lang:ViewController.m
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    [self dismissViewControllerAnimated:YES completion: ^ {
        self.imageView.image = image;
        
        // アルバムに画像を保存
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
        
        // そのままメール送信画面へ
        [self sendMail];
    }];
}
```

#おわりに
撮って送るだけの簡単なアプリですが、Evernoteの登録用メールアドレスを設定したり、IFTTTのトリガーとして使ったりと、割と重宝しています。

ではでは
EmacsLispでHTTPアクセスするコードを書いてみた


# 概要

EmacsLispでhttpアクセスをする関数を良く探すのでEmacsWikiのUrlPackageを一部改良したものを残します。

# コード
## POST
### 定義

+ 引数 url アクセス先のURL
+ 引数 args 送信するPOSTパラメータのリスト
+ 返り値 レスポンスbodyの文字列

```el
(defun url-http-post (url args)
  "Send ARGS to URL as a POST request."
  (let (
        (response-string nil)
        (url-request-method "POST")
        (url-request-extra-headers
         '(("Content-Type" . "application/x-www-form-urlencoded")))
        (url-request-data
         (mapconcat (lambda (arg)
                      (concat (url-hexify-string (car arg))
                              "="
                              (url-hexify-string (cdr arg))))
                    args
                    "&")))
    (switch-to-buffer
     (url-retrieve-synchronously url))
    (goto-char (point-min))
    (re-search-forward "\n\n")
    (setq response-string
          (buffer-substring-no-properties (point) (point-max)))
    (kill-buffer (current-buffer))
    response-string))
```

### 使用例

```el
(url-http-post "http://example.com/post.php"  '(("hoge" . "fuga") ("piyo" . "1"))) ;; => "[{\"hoge\":\"fuga\"},{\"piyo\":\"1\"}]"
```

## GET

### 定義

+ 引数 url アクセス先のURL
+ 引数 args 送信するGETパラメータのリスト
+ 返り値 レスポンスbodyの文字列

```el
(defun url-http-get (url args)
  "Send ARGS to URL as a GET request."
  (let (
        (response-string nil)
        (url-request-method "GET")
        (url-request-data
         (mapconcat (lambda (arg)
                      (concat (url-hexify-string (car arg))
                              "="
                              (url-hexify-string (cdr arg))))
                    args
                    "&")))
    (switch-to-buffer
     (url-retrieve-synchronously
      (concat url "?" url-request-data)))
    (goto-char (point-min))
    (re-search-forward "\n\n")
    (setq response-string
          (buffer-substring-no-properties
           (point) (point-max)))
    (kill-buffer (current-buffer))
    response-string))
```

### 使用例

```el
(url-http-get "http://example.com/get.php" '(("hoge" . "fuga") ("piyo" . "1")))  ;; => "[{\"hoge\":\"fuga\"},{\"piyo\":\"1\"}]"
```

# 参考

http://www.emacswiki.org/UrlPackage
Pythonで高速なRPCを実装する


Pythonで高速なRPCを実装するためのライブラリである[Mprpc](http://mprpc.readthedocs.org/en/latest/)を紹介します。

内部では、[MessagePack RPC](http://msgpack.org/)プロトコルを用いていて、Java、C++、PHP、Rubyなど既存の[他言語のクライアント](https://github.com/msgpack-rpc/msgpack-rpc)とも通信が可能になっています。

下記のように簡単にRPCサーバを記述することが出来ます。

```sum_server.py
from gevent.server import StreamServer
from mprpc import RPCServer

class SumServer(RPCServer):
    def sum(self, x, y):
        return x + y

server = StreamServer(('127.0.0.1', 6000), SumServer())
server.serve_forever()
```

*RPCServer*クラスを継承してメソッドを定義すると、定義されたメソッドが自動的にRPCの関数として登録されます。

```sum_client.py
from mprpc import RPCClient

client = RPCClient('127.0.0.1', 6000)
print client.call('sum', 1, 2)
```

このような感じでクライアントを記述できます。

```
$ python sum_server.py &
[1] 30945
$ python sum_client.py
3
```

最後に、既存の公式MessagePack RPC実装([Tornado](http://www.tornadoweb.org/)ベース)及びdotCloudの[ZeroRPC](http://zerorpc.dotcloud.com/)とパフォーマンスを比較してみます。使用しているコードは[こちら](https://github.com/studio-ousia/mprpc/tree/master/benchmarks)にあります。

```
% python benchmarks/benchmark.py
call: 9508 qps
call_using_connection_pool: 10172 qps

% pip install msgpack-rpc-python
% python benchmarks/benchmark_msgpackrpc_official.py
call: 4976 qps

% pip install zerorpc
% python benchmarks/benchmark_zerorpc.py
call: 655 qps
```

![パフォーマンス比較](https://camo.githubusercontent.com/c7427f7a2ad9da99cda87417540ff145dca5b442/68747470733a2f2f7261772e6769746875622e636f6d2f73747564696f2d6f757369612f6d707270632f6d61737465722f646f63732f696d672f706572662e706e67)

既存のMessagePack RPCクライアントの約2倍、ZeroRPCの約14倍高速に動作していることが分かります。
フォーマット文字列の引数にハッシュを与えると規定文字列に対して式展開っぽいことができる

# きっかけ
>URI のテンプレートをパラメタとして渡せるようにしたいとします。
パーセント記法による書式文字列を渡す方法が考えられます。

>```sample3.rb
hoge = 'http://hoge/hoge/page=%{n}'
mk_uri_gen = ->(tmpl){ (1..Float::INFINITY).lazy.map {|n| tmpl % {n: n} } }

>ug = mk_uri_gen.(hoge)
p ug.next    #=> "http://hoge/hoge/page=1/"
p ug.next    #=> "http://hoge/hoge/page=2/"
p ug.next    #=> "http://hoge/hoge/page=3/"
    :
```

>[Ruby: Enumerator::Lazy で URI生成 - Qiita](http://qiita.com/lnznt/items/a84d0fcda076d5c1a842)（理解しやすいように若干変更）

ん？この **パーセント記法** はなによ？いわゆるフォーマット文字列？パーセントの後ろにある`{n: n}`は？もしやハッシュ？つまり、これを使えば、予め与えた規定の文字列の`{キー文字列}`に対して式展開っぽいことができるってこと？そんなの（我がバイブルの）[Ruby逆引きハンドブック](http://www.amazon.co.jp/gp/product/4863540221/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4863540221&linkCode=as2&tag=riocampos-22)p.215に載ってないよ？

と驚いたのがきっかけです。
# るりま参照
>##module function Kernel.#format
`sprintf(format, *arg)` -> `String`
`format(format, *arg)` -> `String`
`format` 文字列を C 言語の `sprintf` と同じように解釈し、 引数をフォーマットした文字列を返します。
[PARAM] `format`:
フォーマット文字列です。
[PARAM] `arg`:
フォーマットされる引数です。
　：
`%{name}`
`Symbol` のインスタンス `name` をキーとする `Hash` を引数にした場合、 対応する値を**フォーマットせずに参照**します。 幅や精度を指定するために使用することができます。

>```ruby
p sprintf('%{foo}f : %{bar}+d', foo: 1, bar: 2) #=> "1f : 2+d"
```
[module function Kernel.#format](http://rurema.clear-code.com/1.9.3/method/Kernel/m/format.html)（引用者による強調）

こんなものがあったんだ！知らなかった…。フォーマット文字列なのに **フォーマットせずに参照** というのがポイントですなぁ。
## 注意点
`Kernel.#sprintf` や `Kernel.#format` ではなく `%` を使う場合には、ハッシュを明示する必要があります。
上記のるりまでの例を `%` で書き換えると以下のようにハッシュリテラルが必要です。

```ruby
p '%{foo}f : %{bar}+d' % {foo: 1, bar: 2} #=> "1f : 2+d"
```

# なかま

>`%<name>`
`Symbol` のインスタンス `name` をキーとする `Hash` を引数にした場合、 対応する値をフォーマットして参照します。

>```ruby
p sprintf('%<foo>f : %<bar>+d', foo: 1, bar: 2) #=> "1.000000 : +2"
```

という **フォーマットして参照** するのもあるようです（というかフォーマット文字列なのだからこちらが真っ当な使い方）。
% を使う場合はやはりハッシュ明示。

```ruby
p '%<foo>f : %<bar>+d' % {foo: 1, bar: 2} #=> "1.000000 : +2"
```
# まとめ
% 記法はいろいろありすぎて覚えられないから注意すべし（俺が
pythonのdictionaryでKeyErrorを出さないようにする


# KeyError

```py
test = {}
print test['a']
```

このサンプルを実行すると

```
KeyError: 'pagename'
```

の例外が発生します。コレを回避するためには、事前に`in`, `has_key`などを用いてキーが存在するか否かをチェックする必要があります。

```py
test = {}
if 'a' in test:
	print test['a']
else: 
	print ''

```

このようなコードになるのですが、上記のような場合は`get`という便利なメソッドが用意されているようです。

# get(key[, default])

[Documents](http://docs.python.jp/2/library/stdtypes.html)より引用

```txt
もし key が辞書にあれば、 key に対する値を返します。そうでなければ、default を返します。 default が与えられなかった場合、デフォルトでは None となります。そのため、このメソッドは KeyError を送出することはありません。
```

第二引数を指定すればデフォルト値も指定できるようです。
getを用いて上記コードを書き換えてみます

```py
test = {}
print test.get('a')
```

とてもシンプルになりました。
gitでの「あの時のコミット」へのショートカット用キーワードいろいろ

Gitを使ってると、「あーあの時のコミットを参照したいなー」と思うことよくありますよね？
そんな時Gitには便利なショートカットというかキーワードみたいなものが利用できます。

今回はそのキーワード(と便宜上呼びます)を、基本的なものから、「あーこれ欲しかったんだよねー」的なものや、
正直何に使うのか良くわからないものまで色々見つかったのでメモ。

間違いや、よく分からないところについて知っている方がいらっしゃったら是非コメントください！:bow:

# HEAD

最もメジャーかつ一番良く使いそうなやつです。
自分のローカル内のコミットも含めた上で、一番新しいリビジョンを指し示すことができます。

利用方法として一番ポピュラーなのは、 `git reset` や `git revert` を利用するときにヘッダ位置を指定するときですね。
`~n` や `^n` 等と併用することが多いです。

例えば

```bash
git reset HEAD~1
```

とすれば、ローカル内のリビジョンを **最新から一つ前** の状態に戻すことができます。 `HEAD~2` なら2つ前です。
無駄なコミットや間違ったコミットをとりあえず元に戻しちゃいたいときとかに良く使います。

# FETCH_HEAD

実は今回の記事は個人的にこれを調べてて色々見つけたのがきっかけだったり。ずっと欲しかったんですこれ。
`FETCH_HEAD` は、 **現在フェッチされているリモートブランチの最新リビジョン** を習得できます。

用途としては、「色々ごちゃごちゃいじっちゃったけど結局これ全部自分の変更元に戻してリモートと同じクリーンな状態にしたいなぁ…」なんて時に使います。

```bash
git reset --hard FETCH_HEAD
```

これでスッキリです！
自分がローカルで行った変更やコミットだけが、綺麗さっぱり消えてくれます！

# ORIG_HEAD

これはちょっと特殊で、 `git merge` 等の *大幅な変更* が入るようなコマンドが実行されるときに、
内部で自動的に記録しておいてくれるヘッダ番号らしいです。
どのようなコマンドの時にORIG_HEADが更新されるのかはわかっていませんが、
少なくとも `git merge` の際にはそれを記録するようなので、
これを使うことで、もし変なブランチをマージしてしまったとしても、以下のように簡単にマージ前の状態に戻すことができます。

```bash
git reset --hard ORIG_HEAD
```

いざマージしようとしたらCONFLICTを起こしちゃってぐちゃぐちゃになってしまった場合に、
とりあえず元に戻したい場合なんかにも使えるようです。

これでもうマージ怖くない！

# MERGE_HEAD

これは `git merge` を行う際にマージ **元** となるリビジョンを示しています。
うーん何に使うのか使い道が思い当たらない・・・。

# CHERRY_PICK_HEAD

これも良くわからなかったです。
`git cherry-pick` 実行時の取得元のリビジョンを指してるのかなぁと思いますが…やはり使い道が分からない＞＜；

一応ヘルプでの原文は

> records the commit which you are cherry-picking when you run git cherry-pick.

となっています。

# 実はまだまだあるらしい

本記事下部に記載した参考リンクのStackOverFlow内では、gitのソースコードの中には、
さらにこの他に`BISECT_HEAD`, `REVERT_HEAD`, `REJECT_NON_FF_HEAD` 等というものもあるらしいという事が書かれています。
ただ公式にマニュアルとかがあるわけでは無いような気がするので、あまり乱用するのはよくないかもしれませんね。

# 参考

- [git - ORIG_HEAD, FETCH_HEAD, MERGE_HEAD etc - Stack Overflow](http://stackoverflow.com/questions/17595524/orig-head-fetch-head-merge-head-etc)
- [gitでマージ作業を中止して元の状態に戻す - TIM Labs](http://labs.timedia.co.jp/2011/01/git-undo-merge.html)

# 最後に

あまり英語が得意じゃないので、間違ってる事や、「他にもこんなイカした使い方があるぜ！」等々ありましたら
是非コメントにて教えて頂ければと思います:bow:
Composerを使ってPHPUnitを使えるようにしSeleniumも一緒に動かす。


今までは他の人がVirtualBoxのCentOSにセットしてくれたPHPUnitを使っていたのだが、自分のPC(MacBookPro)にPHPUnitを入れる必要が出てきた!


# Homebrew・Gitインストール
PHPUnitを入れるために必要なHomebrewを入れる。

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

`git --version`でキチンと動作すればOK!

# Composerダウンロード
PHPUnitを入れるならコレを使わないと！ということでComposerダウンロード。
`curl -sS https://getcomposer.org/installer | php`
それをパスが通っているトコに移動！
`sudo -s mv composer.phar /usr/bin/composer `

# PHPUnitインストール
Composerを使ってPHPUnitをインストールする。
`composer global require "phpunit/phpunit=4.3.*"`
*phpunit*コマンドを使うためにパスを通す。~/.bash_profileにも記載しておこう。
`export PATH=$PATH:~/.composer/vendor/bin/`
パスが通っているかどうかを確認。
`phpunit --version`


# PHPUnitにSeleniumパッケージ追加
私はPHPUnit-seleniumを動かすので、それを動かせるようにしないといけない。
composer.jsonの*require*に*"phpunit/phpunit-selenium": ">=1.2"*の行を追加する。パスは*~/.composer/composer.json*

```json:composer.json
{
    "require": {
        "phpunit/phpunit": "4.3.*"
         ,
        "phpunit/phpunit-selenium": ">=1.2"
    }
}
```
書き換えたらComposerを更新する。
`composer update`

試しにテストプログラムを動かしてみて動いたらOK。
`phpunit test.php`

テストプログラム参考。ローカルでSeleniumサーバを起動してみよう！

```php:test.php
<?php
class Example extends PHPUnit_Extensions_Selenium2TestCase
{
	public function setUp()
	{
          $this->setBrowser('firefox');
          $this->setHost('localhost');
          $this->setPort(4444);
          $this->setBrowserUrl('http://www.yahoo.co.jp/');
	}
    
	public function testExample()
	{
           $this->url("http://www.yahoo.co.jp/");
	}
}  
?>
```
SauceLabの環境でPHPUnit-Seleniumを動かす

自動テストを動かす様々な環境を個人で用意していくのは、かなり面倒ですが、SauceLabというものがあります。
https://saucelabs.com/
無料会員もあります！というか私も無料会員です。
いっぱいあって大変便利です。
というわけで、SauceLabでPHPUnit-Seleniumを動かしまーす！！

方法は公式サイトにもチュートリアルがありますが
https://docs.saucelabs.com/tutorials/php/
**私は英語を読むのがキライなんだ…**
それで私が筋金はいったバカなのも相まって敬遠していたのですけど、改めて読んでみると「もしかして簡単なんじゃね？」と思ってやってみたら、<font color="orange">あら簡単！:sparkles: </font>
MacなのでPHPが入っていたのもあり、余計に簡単でした。
入っていないPCの人は、まず入れましょう。この公式サイトの上部にも書かれているようですので。


## フォルダ作成&移動
この通りです、この通りの意味です。
`mkdir ~/sauce-tutorial && cd ~/sauce-tutorial`

## ファイルダウンロード
ファイルをダウンロードしてきます。その際、登録したアカウントでのユーザ名と*YOUR_USERNAME*に、アクセスキーを*YOUR_ACCESS_KEY*の箇所に入れます。アクセスキーはログインした後のアカウント画面の下部に記載されています。
**また、ログインしてから先ほどのチュートリアルを見ると自動で入れてくれたものが手に入りますよ！**
```curl -s https://raw.githubusercontent.com/jlipps/sausage-bun/master/givememysausage.php | SAUCE_USERNAME=YOUR_USERNAME SAUCE_ACCESS_KEY=YOUR_ACCESS_KEY php```
<br />
**と、コレだけです。**

ちゃんと動くかどうかは、*~/sauce-tutorial*に移動したあと下記のコードを打つことで確認できます。
`vendor/bin/phpunit WebDriverDemo.php`
これでSauceLabの自分のページに結果が反映されていればOK!!
modern.ieを活用してMacでWindowsでの自動テストをする

MacBookでWebの自動テストを行っていると否応無しに出てくる問題が<font color="blue">InternetExplorerのテストが出来ない :droplet: </font>という点である。**イチバン仕様がガラパゴスなのに、である。**
というコトで、どうにかせな！と見つけたのがmodern.ieです。
https://www.modern.ie/ja-jp
VirtualBoxに入れることでリアルなWindows環境が手に入ります！！

VirtualBoxにmodern.ieを入れる作業はココを見ればOK。
https://www.modern.ie/ja-jp/virtualization-tools#downloads
ホストオンリーアダプターの設定も忘れずに！！
Windowsを開けた！というとこからスタートです。

# Java・Selenium・Chrome・Firefoxのダウンロード
Seleniumと動かすのに必要なJava、そしてどうせなら！！ってコトでChromeもFirefoxもテストできるように！と、これら４つをダウンロードします。
**SeleniumはJavaと同じフォルダに入れるのがオススメです！**

# ポート4444をこじ開ける
<font color="red">**ココをこじ開けないとMacのPHPUnit側からの指令が届きません！！**</font>
最初はファイヤーウォールで閉じられているので開けましょう。
こじ開けるのにファイヤーウォール詳細設定まで行きます。コントロールパネルからファイヤーウォールのあるところまで行き左にある「Advanced setting」の箇所をクリックして以下の写真の画面まで出します。
![スクリーンショット 2015-01-04 20.30.03.png](https://qiita-image-store.s3.amazonaws.com/0/59687/7b6a8625-162b-99b2-1046-fd2c53d885ac.png)
そして右にある「New Rule」をクリックして新しいルールを下記のように設定します。

+ Ruletype → Port
+ Protocol → TCP
+ Port     → 「Specific local ports」4444
+ Action   → Block以外のいずれか。User指定の場合は登録してね。
+ Profile  → 全てにチェックのままでOK

そして名前を付けて登録すればオーケー。
かなり、手探りでココはしたので、どなたかもっと良いアドバイスいただけたら、と！

# ChromeDriverとIEDriverをダウンロード
ChromeとIEを動かすのに必要なDriverを下記からダウンロードする。**ダウンロードしたDriverはSeleniumServerと同じ場所におこう。**
http://docs.seleniumhq.org/download/

# 起動バッチ作成
いちいちコマンドプロンプトを立ち上げているのは、かなり効率が悪いのでデスクトップにバッチファイルを配置する。
これは、その一例。

```bat:Selenium.bat
cd C:\Program Files\Java\jre1.8.0_25\bin
java -Dwebdriver.chrome.driver=
chromedriver.exe -Dwebdriver.ie.driver=IEDriverServer.exe -jar selenium-server-standalone-2.44.0.jar
```
これを起動と同時に立ち上げるようにするのもよろし。