OmniAICreator/Qiita-1.07M huggingface dataset:
【備忘録】Gitのコミットを綺麗にまとめる色々な方法

Gitのコミットを綺麗にまとめる方法
==============================

とりあえず方法を２つ（他に簡単な方法があれば知りたい）

* `git rebase -i` を用いる方法
* `git merge --squash` を用いる方法

git rebase -i を用いる方法
------------------------------

>特徴
>* squash や fixup など各コミットについて個別に細かい指定が可能
>* 一般的なやり方（？）

[サルでもわかるGit入門](http://www.backlog.jp/git-guide/stepup/stepup7_5.html)をまとめると以下の手順

1. `git log` などで現在作業しているブランチの最初のコミットを確認
2. `git rebase -i HEAD~(ブランチの最初から何回コミットしたか)` を実行  
例）$ git rebase -i HEAD~3
3. テキストエディタが開くので最初の行以降の `pick` になっている項目を `squash(もしくは省略でs)` に変更して保存、終了
4. もう一度テキストエディタが開くので、コミットメッセージを編集して保存、終了
5. push

git merge --squash を用いる方法
------------------------------

>特徴
>* コミット個別の設定云々よりもとにかく１つにまとまればＯＫの場合はこちらが簡単
>    * 最初のコミットが何個前か〜、順番が〜、コメントが〜、等を考えなくて良い
>* 新規の別ブランチを使うので操作の失敗に強い（気がする）

[サルでもわかるGit入門](http://www.backlog.jp/git-guide/stepup/stepup7_7.html)をまとめると以下の手順

1. 現在のブランチがpushするブランチ名になっているか確認。もし なっていたらリネームする。
2. ブランチのリネームは `git branch -m <古いブランチ名> <新しいブランチ名>` で可能
3. push するブランチを新たに作成。**※新規ブランチ作成はブランチ元をチェックアウトして行うこと**
4. 新たに作成したブランチをチェックアウトして `git merge --squash <まとめたいブランチ>` を実行
5. コミットしてpush

```
具体例）
feature ブランチから feat/Proc1 を作成して作業していたが、push前に１つにまとめたい場合。

1. まずは作業していたブランチをリネーム

    $ git branch -m feat/Proc1 feat/Proc1_hist

2. feature ブランチからコミットログの無い feat/Proc1 を新たに作成

    $ git checkout feature
    $ git checkout -b feat/Proc1    // ブランチ作成と同時にチェックアウト

    これで
    * feat/Proc1_hist ：コミットログが溜まっている作業ブランチ
    * feat/Proc1      ：push用のブランチ（コミットログ無し）
    が出来る

3. feat/Proc1 に対して feat/Proc1_hist を squash でマージ

    $ git merge --squash feat/Proc1_hist

    ※ もし merge に --no-ff を設定していたら --ff も付ける

4. feat/Proc1_hist のコミットがまとめて stage されているのでコミット＆push

    $ git commit
    $ git push origin feat/Proc1

    ※ 作業が完了したら必要に応じて feat/Proc1_hist を削除。

```
[perl] テスト用にランダムな電話番号、URL、メールアドレスを沢山作る

テストで大量にデータを登録する必要が出てきた時のメモ
スクリプトでそれっぽい内容を出力します

# 使い方

以下のようにperlスクリプトを書いて、実行します

<pre>
#!/usr/bin/perl

# 電話番号
print make_random_phonenumber."\n";

# メールアドレス
print &make_random_mailaddr."\n";

# URL
print &make_random_url."\n";
</pre>

ループにして何万件出力するとか、
CSV風にprintして、テキストファイルにリダイレクトするなど、利用の際には適宜変更してください

# サブルーチンのコード
```pl
sub make_random_mailaddr
{
  return &random_alpha(20)."@".&random_alpha(10).&random_domain();
}

sub make_random_url
{
  return "http://".&random_alpha(int(rand(62))+1).&random_domain()."/".&random_alpha(int(rand(256
)));
}

sub random_alpha
{
  my ($length) = @_;
  my $str = "";
  my $i;

  for ($i=0;$i<$length;$i++) {
    my $c = 97 + int(rand(25));  # a-z
    $str .= chr($c);
  }

  return $str;
}

sub random_string
{
  my ($length) = @_;
  my $str = "";
  my $i;

  for ($i=0;$i<$length;$i++) {
    my $c = 48 + int(rand(74));  # 0-z
    $str .= chr($c);
  }

  return $str;
}

sub random_domain
{
  my @domain = (
".com", ".net", ".org", ".biz", ".info". "name", ".mobi", ".asia", ".in.net", "jp.net",
".tel", ".xxx", ".jpn.com", ".ar.com", ".br.com", ".cn.com", ".de.com", ".eu.com",
".gr.com", ".hu.com", ".kr.com", ".no.com", ".qc.com", ".ru.com", ".sa.com", ".se.com",
".uk.com", ".us.com", ".uy.com", ".za.com", ".gb.net", ".se.net", ".uk.net", ".ae.org",
".jp", ".co.jp", ".or.jp", ".ac.jp", ".ed.jp", ".go.jp", ".hokkaido.jp", ".miyagi.jp",
".fukushima.jp", ".aomori.jp", ".iwate.jp", ".yamagata.jp", ".akita.jp", ".tokyo.jp",
".kanagawa.jp", ".saitama.jp", ".chiba.jp", ".ibaraki.jp", ".gunma.jp", ".tochigi.jp",
".niigata.jp", ".nagano.jp", ".yamanashi.jp", ".aichi.jp", ".shizuoka.jp", ".gifu.jp",
".ishikawa.jp", ".toyama.jp", ".fukui.jp", ".osaka.jp", ".hyogo.jp", ".kyoto.jp",
".nara.jp", ".mie.jp", ".shiga.jp", ".wakayama.jp", ".hiroshima.jp", ".okayama.jp",
".yamaguchi.jp", ".shimane.jp", ".tottori.jp", ".ehime.jp", ".kagawa.jp",
".tokushima.jp", ".kochi.jp", ".fukuoka.jp", ".kumamoto.jp", ".kagoshima.jp",
".nagasaki.jp", ".oita.jp", ".miyazaki.jp", ".saga.jp", ".okinawa.jp", ".ac", ".am",
".be", ".bz", ".cc", ".cm", ".cn", ".co", ".cx", ".cz", ".fm", ".gs", ".hn",
".in", ".la", ".me", ".mn", ".ms", ".mu", ".mx", ".sc", ".so", ".com.so", ".org.so",
".net.so", ".tv", ".tw", ".co.uk", ".me.uk", ".org.uk", ".us",
".vc", ".vg", ".vn", ".ws", ".pw", ".com.co", ".net.co", ".nom.co"
);
  return $domain[int(rand($#domain))];
}
```
選択中のテキストを指定したWebサービスで検索させるというよくある検索ツールをAtom用パッケージに実装した

Atom用のパッケージでもWebBrowserを開くものはあるが、検索エンジンを指定して開いたり、検索結果が見やすいようにモバイル用UAが欲しかったりしたので自作パッケージを作ってみた。

[Web-search](https://atom.io/packages/web-search)

イメージはScreencastを見てもらうのが一番手っ取り早いかも。

![screencast](https://raw.githubusercontent.com/nobuhito/atom-web-search/master/screencast.gif)

テキストを選択してコマンドを叩く検索ページを指定すると、検索結果を右側に表示するだけ。

デフォルトではUAはiOS9のiPhone用Safariになっているが、これは差し替えることが出来る。

また、検索エンジンとしてはGoolgeとWekipediaだけを登録しているが、自由に追加できるのであそこなども自由に登録できるようになっている。

言わなくても分かるよね。
JAVA-miでソースコードの分割(Package利用)実行してつまずきやすい処

▪️test22.java

```java
package calcapp.main;

public class test22 {
	public static void main(String[] args) {
		int a = 10; int b = 2;
		int total = calcapp.logics.test23.tasu(a, b);
		int delta = calcapp.logics.test23.hiku(a, b);
		System.out.println("足すと" + total + "、引くと" + delta);
	}
}
```

▪️test23.java

```java
package calcapp.logics;
public class test23 {
	public static int tasu(int a, int b) {
		return (a + b);
	}

	public static int hiku(int a, int b) {
		return (a - b);
	}
}
```

▪️miでのpackage利用の注意点
package を書かないとちゃんと実行しますよね。
packege を書いたら、その階層でディレクトリを作成してその中に入れて下さい。
そうしないとうまく動作しません。
この場合は、
mkdir -p calcapp/main
mv test22.java calcapp/main/.
mkdir -p calcapp/logics
mv test23.java calcapp/logics/.
javac calcapp/logics/test23.java
javac calcapp/main/test22.java
java calcapp/main/test22

こんな感じで使います。

calcapp/main
は、
calcapp.main
という意味です。
java のソース上では、. は、階層の下という意味に解釈されます。
そのまま . という名前の一部にはできません。

java calcapp/main/test22は
java calcapp.main.test22でも実行できます。

▪️実行結果
足すと12、引くと8
![スクリーンショット 2015-10-20 17.19.29.png](https://qiita-image-store.s3.amazonaws.com/0/95187/dc5ae9d5-2a24-4753-536c-902d2ff489c8.png)
[ことクロ3]　Kotlinで、クロージャ&Delegate(s)入門

# 0) 序

思い立って、"Kotlinでスマートフォン・クロスプラットフォーム開発"に入門中。
(=> タイトルとしては、長くてノイジーな気がするので、以後、"ことクロ")。
現時点では、[Kotlin向けAndroidStudio環境構築](http://qiita.com/kmry2045/items/51b4ef66ae99756fc3ce)のみ。

目指せ、Kotlin on RoboVM@iOS。 cf.[Jetbrain社roboVMブログ](http://blog.jetbrains.com/idea/2015/10/robovm-and-the-move-to-the-intellij-platform/)

まずは、情報がwebに限られるKotlinに急がば回れで、慣れるていく。本日は、同じJVM言語仲間であり、AndroidStudio等のビルドツールGradleの記述言語であるGroovyとの比較で、Kotlinのクロージャ&Delegateを入門。

#1) クロージャ
##クロージャの使いどころが気になる時は。
KotlinもGroovyもJavascriptも同じようなクロージャ。必要に応じ、クロージャ入門記事を参照しつつ、[クロージャってどんなときに使うの？](http://qiita.com/HirofumiYashima/items/ed17c83f26de3d510b93)をちら見。
個人的には、①やっつけで機能豊富な(豊富すぎる)関数を作る場合か、②便利で自由度の高い関数を作る場合か、その他か、といった程度に理解。

## Kotlin

今風の言語でクロージャが使えるのは当たり前、ということか、有志の[プログラミング言語Kotlin 解説](https://sites.google.com/site/tarokotlin/3-kotlinno-biao-zhunapi/sec32)では、
"Kotlinではクロージャ（Closure）を扱えます。つまり、ローカル関数などが、その外側の関数内で宣言されている変数の値を読み書きすることができます。"と、そっけない。

Kotlinでは、関数にはふつうの関数fun x(){...}と、リテラル関数　val x={...}があって、若干意味が異なる。
IntelliJ EAP15を使って試してみると、両者とも問題なくクロージャが使えた(関数の外の変数nの値を変更できている)。
文字列の扱いも当然お手のものだね:

![](http://f.cl.ly/items/3q183d2M0o0B2J032M11/kt_closure.PNG)

## Groovy
Groovyは必要に応じ学ぶ方針なので、チラ見で済ませてしまう:
[GroovyのClosureを使ってみる](http://qiita.com/kaneko_tomo/items/62a70afa088370bdefbc)

はい、rubyっぽく書けるとのことですね。
　
#2) Delegate(s)
##KotlinとGroovyとで意味合いが違う..模様。
委託・委任するといった意味の動詞delegate。英語としてはビックワードの類で、プログラミングの世界では、実装依存になりがちなUIライブラリなどでよく使われるターム。

Kotlinでは、Classのプロパティを初期化したくない時(とりあえずの値としてnullを入れるのが嫌な時など)に、Delegated Proptertyが使われる。nullを許容するJavaの世界と、Nullを排除するKotlinの世界の間を、lazyなDelegated Proptertyがとりもつ感じなのだろう。
Groovyでは、クロージャのスコープ把握の制御などに、キーワードdelegateが用いられている。
参考　[[Groovy]クロージャのthis、owner、delegateについて](http://qiita.com/saba1024/items/b57c412961e1a2779881)

## Kotlin
[声に出して読みたいKotlin](http://yyyank.blogspot.jp/2014/12/nullkotlin-ktac2014.html)の後半を見るにいろいろな、Delegatesパターンがあるらしい。詳しくは後にKotlinでJavaのUIライブラリいじるときに探ることとする。

とりあえず、形名 by Delegates.notNullというパターンを実行してみる。このあたりの表現の補完はIDE便利

![](http://f.cl.ly/items/3n1y1f0A0Y3L3k353y02/delegates.PNG)
## Groovy
クロージャの中では、暗黙的に使用できる変数delegateがある。GradleでのDSLにも使われている。build.gradleをがりがり書く場合には理解しておくべきなのだろう。

参考 "Groovyを知らない人のためのbuild.gradle読み書き入門"の[この部分](http://j.mp/groovy_im_delegate)。

そして、RxJava/RxAndroidでFRPなどの話になってくると、Groovyのdelegate入りクロージャがより重要になってくるんでしょうね。

参考　[GroovyOnAndroidやRxJavaをやりたい人のための、Groovyのクロージャの書き方・使い方メモ](http://qiita.com/RyotaMurohoshi/items/2a30a74c0074e11d0207)
#所感。と、Kotlin本！

AndroidStudio使う関係で、Groovyとの対比でKotlinを調べたが、やはり、言語としての歴史があるGroovyに比べ、Kotlin情報は少なめ。。Kotlin本はないわけだし・・・と思っていたところ、先行公開版(MEAP)として、["Kotlin in Action"](https://www.manning.com/books/kotlin-in-action#downloads)が既に4章まで、出ていることを発見！・・11章が、"KOTLIN FOR ANDROID"。

まずは、"Kotlin in Action"の1章を読んでみる。
jQueryを使用した画像管理実装メモ


## メモ
JavaScript(jQuery), PHPを使用しての画像管理処理機能の実装メモです。
仕様としては、画像登録、画像削除の機能および一覧です。

登録は、id="file"でfileインプットを呼び出してonchange 画像を選んだら submitさせます。
削除は、対象チェックがついたものをjQueryで抽出しjsonで整形、PHPで配列に戻し処理します。

location.hrefのdeleteフラグはフレームワークによってはviewが更新されなかったので当方のほうでフラグとして更新をかけてますが、プレーンなものではいらないかもしれません。locationがajax的にかっこ悪いです･･･。



```JavaScript:hoge.html
<script>
$(function() {
    //画像アップロード
    $("#file").change(function() {
        $(this).closest("form").submit();
    });
    //画像削除
    $("#close").click(function() {
        area = $('[type="checkbox"]:checked').map(function(){
          return 'area[]=' + $(this).val();
        }).get().join('&');
        
        $.ajax({
            url: '/edit/',
            type: 'post',
            data: {
                checked: area
            },
            timeout: 10000,
            dataType: 'json',
            cache: false,
            complete: function(xhr, textStatus) {
                location.href = "/edit/index.php?delete=1";
            }
        });
    });
});
</script>

```

```html:hoge.html
<form action="/edit/" method="POST" name="form" enctype="multipart/form-data">

    <button type="button" onclick="$('#file').click();" >アップロード</button>
    <button type="button" id="close" >デリート</button>


    <div class="hoge">
        <div class="box-img">
            <img src="/images/hoge1.jpg">
        </div>
        <p class="center">hoge1.jpg</p>
        <label class="checkbox"><input type="checkbox" name="check[]" value="hoge1.jpg"></label>
    </div>

    <div class="hoge">
        <div class="box-img">
            <img src="/images/hoge2.jpg">
        </div>
        <p class="center">hoge2.jpg</p>
        <label class="checkbox"><input type="checkbox" name="check[]" value="hoge2.jpg"></label>
    </div>

    <div class="hoge">
        <div class="box-img">
            <img src="/images/hoge3.jpg">
        </div>
        <p class="center">hoge3.jpg</p>
        <label class="checkbox"><input type="checkbox" name="check[]" value="hoge3.jpg"></label>
    </div>


	<input type="file" id="file" name="file" accept=".jpg,.png" style="display:none;" onchange="$('#file').click();"/>
</form>

```


```php:index.php
<?php
$Path ='/hoge/';
$deleteFlg = $_GET["delete"];

$checked = array();
$query = $_POST["checked"];
parse_str($query, $checked);


if(count($checked['area'])){
	//削除処理
     foreach ($checked['area'] as $value){
         $filePath = $Path . $value;
         unlink($filePath);
     }
}elseif($deleteFlg!=1) {
	//登録処理
	move_uploaded_file($_FILES['file']['tmp_name'], $Path . $_FILES['file']['name']);
	$imgPath = $Path . $_FILES['file']['name'];
	$imgData = getimagesize($imgPath);
}

//既存ファイル読込処理
$imgList = array();
$resDir = opendir($Path);
while($filename = readdir($resDir)){
    if($filename != '.' || $filename != '..' ){
        $imgList[] = $filename;
    }
}

```
archlinuxarm 無線設定メモ


`systemd-networkd` を使う。`wpa_supplicant` が必要。Wi-Fi USBドングルを刺す。認識されて netdev `wlan0` が出てきたとする。

systemd の流儀で次のファイルを作る。`wlan0` となっているところは適宜読み替える。

```text:/etc/systemd/network/wlan0.network
[Match]
Name=wlan0

[Network]
DHCP=yes
```

`wpa_supplicant` の `systemd` サービス登録方法はいくつか[種類がある](https://wiki.archlinuxjp.org/index.php/WPA_supplicant#.E8.B5.B7.E5.8B.95.E6.99.82_.28systemd.29)。良く紹介されるのは `systemctl enable wpa_supplicant@wlan0` とコマンドを打つこと。下準備は特にいらない。

`systemctl start wpa_supplicant@wlan0` とするとエラーになっている（`systemctl status wpa_supplicant@wlan0`）のでわかるが、`/etc/wpa_supplicant/wpa_supplicant-wlan0.conf` という名前の設定ファイルが必要になる。

適当に作る。

```text:/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
network={
    ssid="TheSSID"
    psk="network_pass_phrase"
}
```

後は再起動してみて、systemd からインタフェース有効化まで行われることを確認する。
【Swift2.0】文字数取得をcountで呼べるように変更

Swift2.0から文字数取得は

```
"Test".characters.count
```

になりますが、ちょいと長いのでサクッとcountで取得できるように、
Stringクラスを拡張。

```
extension String {
    var count: Int {
        get { return self.characters.count }
    }
}
```
processingでAndroid端末に画像保存

最近Processingを使ってAndroid端末用のドローイングツールを
作った時に画像をギャラリーに保存する方法を調べたのでメモします。

~~~java

import android.view.MotionEvent;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.app.Activity;

Intent intent;

void setup () {
	size (displayWidth, displayHeight, JAVA2D);
  	colorMode (RGB, 256);
	background (255);
	//Android端末のファイル保存環境を取得
	intent = new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()));
}

void draw () {
	fill (random (256), random (256), random (256));
	ellipse (random (width), random (height), 20, 20);
}

void mouseReleased () {
	String img_name = Environment.getExternalStorageDirectory() + "/test_image.png";
	save (img_name);
	sendBroadcast (intent);
}

~~~
Nightmareで郵便局から住所をスクレイピング

# 目的

郵便局のサイトでは http://www.post.japanpost.jp/cgi-zip/zipcode.php?zip=100-0001 といったURLで、郵便番号から住所を引くことができます。
ただ何かしらの自動処理に組みこもうとすると、APIは提供されておらず、更新あるたびに[CSVダウンロード](http://www.post.japanpost.jp/zipcode/download.html)するのも面倒なので、スクレイピングしてみました。（[zipcloud](http://zipcloud.ibsnet.co.jp/doc/api)などの外部API化サービスには後で気づきました……）

※郵便局のサイトは、[robots.txt](http://www.post.japanpost.jp/robots.txt)と[利用規約](http://www.post.japanpost.jp/sitepolicy.html)を見るかぎり自動アクセスを禁止していないようです。アクセス頻度は常識的な範囲にとどめてください。

# Nightmare

[Nightmare](http://www.nightmarejs.org/)(v2)は、[Electron](http://electron.atom.io/)ベースのブラウジング自動化ライブラリです。
今回はページ取得だけに使う……のは寂しいので、 http://www.post.japanpost.jp/zipcode/index.html の検索フォームからわざわざページ遷移してみます（ぉぃ

# HTML

本記事投稿時点では、`class="data"`で引っかけると住所のテキストが見つかります。

```html
<tr>
  <td class="data"><small>100-0001</small></td>
  <td class="data"><small>東京都</small></td>
  <td class="data"><small>千代田区</small></td>
  <td>
  <div class="data">
    <p><small><a href="zipcode.php?pref=13&city=1131010&id=46366&merge=">千代田</a></small></p>
    <p class="comment"><small>チヨダ</small></p>
  </div>
</td>

```
# コード

[Nightmare公式の実行例](https://github.com/segmentio/nightmare#execution)では非同期制御のため、[co](https://github.com/tj/co)に似た[vo](https://github.com/lapwinglabs/vo)というライブラリを使っていますが、ここでは標準の`Promise.resolve`で`Promise`化してみました。
[APIドキュメント](https://github.com/segmentio/nightmare#api)には書いてないですが、Nightmareは`then`というメソッド持っているので、[Thenable](http://azu.github.io/promises-book/#Thenable)っぽいです。また、coやvoでも`yield`構文で使えるので、[Yieldable](https://github.com/tj/co#yieldables)でもあるみたい。

```js:main.js
'use strict';

var Nightmare = require('nightmare');
var nightmare = Nightmare();

Promise.resolve(
  nightmare.
    goto('http://www.post.japanpost.jp/zipcode/index.html').
    type('input[name="zip"]', process.argv[2]).
    click('input[src="/img/zipcode/btn_add_search_s.gif"]').
    wait('.data').
    evaluate(() => {
      var data = document.getElementsByClassName('data');
      return {
        zip:  data[0].innerText,
        pref: data[1].innerText,
        city: data[2].innerText,
        aza:  data[3].children[0].innerText
      };
    }
  )
).
  then((address) => {
    console.log('〒' + address.zip + ' ' + address.pref + address.city + address.aza);
  }).
  catch(console.error);

nightmare.end();
```

直感的にメソッドチェーンできて良いですね＞＜ｂ
きちんとセレクタで掴めているか確かめる際は、`Nightmare({fullscreen: true});`として適当にwait()挟んでおくと、ブラウジングの様子が見れて便利です。

# 実行結果

```
> node main.js 1000001

〒100-0001 東京都千代田区千代田
```

`yield`とか`Promise`使っているので、node環境によっては`--harmony`オプション必要かも。

# 環境

```js:pacakge.json
{
  "dependencies": {
    "nightmare": "^2.0.7"
  }
}
```


```
> node -v
v4.2.1
```
[PHP] POST送信する後にヒストリーバックすると「有効期限切れ」になる


POST送信する後にヒストリーバックすると「有効期限切れ」になる現象を回避する方法について記載。

`session_start();`
記述らへんに以下の記述を追加


```php
session_cache_expire(0);
session_cache_limiter('private_no_expire');
session_start();
```


以上
Omniauthで認証時に、パラメータを持ち帰る


## やりたいこと

- いろんなところに Sign in/ Sign up ボタンある
- Sign in/ Sign up後に元いたページとか適切な場所に戻ってこれる
- 当たり前だけど各ページに認証関連のコードは書きたくない。Controller 1個に集約したい

## 概要

パラメータ名を state にすると、認証後まで持って帰って来てくれる。
ので、stateに必要な情報を入れておいて戻ってきたら redirect などなどすれば良い。

## 実際のところ

sessions コントローラでやります。ルーティングは、Omniauthのいつもの感じ。

```ruby:routes.rb (抜粋)
  match "/auth/:provider/callback" => "sessions#user_sign_in_up", :via => [:get, :post]
  get 'sessions/sign_out' => 'sessions#user_sign_out'
```

Viewに設置するボタンは、今回、Sign in / Sign up を別ボタンにしました。
Sign in でアカウント未登録ならハネるし、Sign up でアカウント登録済でもハネます。

```haml:hoge.html.haml
= button_to 'Sign in', '/auth/google',  { method: :get, class: 'btn btn-info', params: { state: { action: 'sign_in', return_to: '/', } } }

= button_to 'Sign up', '/auth/google',  { method: :get, class: 'btn btn-info', params: { state: { action: 'sign_up', return_to: '/targets/new', } } }
```

stateの中に、action（Sign in なのか、Sign up なのか）と、return_to（戻り先）を入れて送っておきます。
まだ実装していませんが、Sign up 前にもなにかサービス利用が出来て、そのデータをとっておきたい場合も、stateの中に保持することになるかと。
パラメーターでデータを持ち回るのは色んな意味でダメなので、適切なテーブルに保存しておいてidだけ渡す感じになると思います。

パラメータは、request.env["omniauth.params"]でとれます。
stateの中身は、action=sign_in とかのテキストになってるのでパースします。
あとは仕様通りに。今回は、セキュリティを意識して、認証失敗の時は追加情報を出さない感じに作ってます。

```ruby:sessions_controller.rb
class SessionsController < ApplicationController
  def user_sign_in_up
    auth = request.env["omniauth.auth"]
    state = Rack::Utils.parse_nested_query request.env["omniauth.params"]['state']
    button_action = state['action']
    return_to= state['return_to']

    if current_user
      notice_or_alert={ alert: "Already sigend in." }
    else
      case button_action
      when 'sign_in'
        user = User.find_by(provider: auth["provider"], uid: auth["uid"])
      when 'sign_up'
        user = User.create_with_omniauth(auth)
      else
        notice_or_alert={ alert: "Sign in / Sign up failed." }
      end
      if user && user.active
        session[:access_token]= user.access_token
        notice_or_alert={ notice: "Signed in." }
      else
        notice_or_alert={ alert: "Sign in / Sign up failed." }
      end
    end

    redirect_to return_to || root_url, notice_or_alert
  end

  def user_sign_out
    session[:access_token] = nil
    redirect_to root_url
  end
end
```



## 参考にさせて頂いたサイト
Thanks a lot!
http://stackoverflow.com/questions/9890985/passing-parameters-through-omniauth
http://bang.hateblo.jp/entry/2012/10/09/002003
Excel の WEBSERVICE 関数で外部データ取得

Excel 2013 から導入された **WEBSERVICE** 関数を使うとマクロを使わずに外部のデータを取得することができます。この記事では **WEBSERVICE** 関数の使い方やはまりどころなどを紹介します。

# 基本情報

* [WEBSERVICE 関数 - Excel](https://support.office.com/ja-jp/article/WEBSERVICE-%E9%96%A2%E6%95%B0-0546a35a-ecc6-4739-aed7-c0b7ce1562c4)

以下の書式で使用することができます。

```
WEBSERVICE(URL)
```

**URL** (必須) によって指定された URL に対して GET リクエストを発行して、その結果文字列を返す、というのが基本的な挙動です。以下のような注意書きがついています。

> * 引数がデータを返せない場合、エラー値 **#VALUE!** が返されます。
> * 引数が無効な文字列と判明した場合、または引数がセルの許容範囲である 32767 文字を超える文字列になった場合、エラー値 **#VALUE!** が返されます。
> * URL の文字列が GET 要求の許容範囲である 2048 文字を超える場合、エラー値 **#VALUE!** が返されます。
> * ftp:// や file:// などのサポートされていないプロトコルの場合、WEBSERVICE はエラー値 **#VALUE!** を戻します。

# 使い方

ためしに Qiita の robots.txt <http://qiita.com/robots.txt> を取得してみましょう。
手順は以下のとおりです。

#### 1. 新規の Excel ワークシートを作成
#### 2. A1 セルにて以下の関数を入力

```
=WEBSERVICE("http://qiita.com/robots.txt")
```

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/71830264-d9f8-cdd7-541c-ffd48ab6a0dc.png)

#### 3. セルに robots.txt が挿入される

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/95382290-d3d0-f08a-87a2-d8219922c87b.png)

セルの幅・高さを調整して **折り返して全体を表示** を有効にするとこのような表示になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/90424a08-3380-307c-e2f9-7d43b0966eb2.png)

エラーが起きるケースではこのような表示になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/5370a38a-5e52-20bc-1468-af2645df9bf7.png)

# サーバ側では？

手元のサーバで試してみたところ、WEBSERVICE 関数からのリクエストには以下のような HTTP ヘッダが設定されていました。サーバ側では **User-Agent** を使って判定することができるかもしれません。

```
Connection: Keep-Alive
User-Agent: Excel/15.0
Host: localhost
```

あと、コンテンツの文字コードは **UTF-8** にしておくのが無難なようです。 ためしに **text/plain; charset=Shift_JIS** のように設定したコンテンツは EXCEL 側で文字化けを起こしていました。


# 制限事項

## ファイル形式

WEBSERVICE 関数は [FILTERXML 関数](https://support.office.com/ja-jp/article/FILTERXML-%E9%96%A2%E6%95%B0-4df72efc-11ec-4951-86f5-c1374812f5b7) と組み合わせることで、XML を返す Web API からのデータの取得が想定されています。もしも JSON や CSV のようなデータ形式を扱おうとすると、EXCEL の関数だけでパースをしなければならないので難易度が高いです（マクロを使ったほうが簡単）。

## 入力文字数

**URL の文字列が GET 要求の許容範囲である 2048 文字を超える場合** にエラーになるという制限があるので、たとえば SPARQL Endpoint に SPARQL Query を投げるようなケースでは注意が必要になります。


## 出力文字数

**セルの許容範囲である 32767 文字を超える文字列になった場合** にエラーになるという制限があるので、あまり大きなレスポンスが返ってくるようなサービスと組み合わせるとうまくいかないことがあります。

## 関数の同時呼び出し

WEBSERVICE 関数を入力したセルを別のセルにコピー＆ペーストする場合には、ペーストされた直後に一斉に WEBSERVICE 関数が実行されることになります。これは結構負荷の高い処理になりがちなので注意が必要です。Excel から一時的に応答がなくなったり、挙動が不安定になることもあります。なお、一度実行された結果は計算結果としてキャッシュされるので、明示的に指定しないかぎり再計算は発生しない挙動のようです。

## セキュリティ

WEBSERVICE 関数を使ったワークシートを作成して、保存してみます。

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/2208690b-b088-75b5-62ac-d5af9e4e02bd.png)

これを再度開いたとき、デフォルトでは **Web サービス機能は無効になっています** との警告が出ます。

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/0f2dc1fa-380a-f793-e477-2475de560bcd.png)

このように WEBSERVICE 関数は明示的に有効化して使用する必要があります。マクロなんかと同様のセキュリティレベルにあるといえます。用途に応じては、関数部分を値だけコピーしたり、そもそも CSV にして配布する、といった方法が歓迎されるかもしれません。


# まとめ

WEBSERVICE 関数を紹介しました。マクロを使わずに外部サービスのデータを利用できる便利なものですが、反面、制限が多く使い方にも注意が必要です。
input type="search"にスタイルを効かせる

```html
<input type="search">
```

検索ボックスをcssで角丸にしようとしたら、Safariでスタイルが適用されなかった。。
ブラウザデフォルトの設定が効いてしまう様子。

以下スタイルを追加してあげるとpaddingやら丸角やらが適用された。解決。

```css
/* プロパティが効くようにする */
.input[type="search"] {
  -webkit-appearance: textfield;
}

/* フォーカス時に四角いアウトラインでるので消す */
.input[type="search"]:focus {
  outline-style: none;
}

/* paddingで消せない余白を消す */
.input[type="search"]::-webkit-search-decoration {
  display: none;
}
```

IE9以下はtype="search"自体使えないので、IE9も対象の場合はsearchを使わない別の方法を考えまそう。
rubyのワンライナーで，シングルクォートを含む文字を扱う

rubyのワンライナーで，シングルクォートを含む文字を扱う


index.html中の　「<text 」 の後ろに　「pointer-events='none'」を追加したいが，

バックスラッシュでエスケープすればいいんだと思って，
```ruby -pe 'gsub(/<text /,"<text pointer-events=\'none\' ")' index.html
```
と書くと，＞が表示されてしまって置換できない．


# 文字コードで指定する方法
```
ruby -pe 'gsub(/<text /,"<text pointer-events=\u0027none\u0027 ")' index.html  
```

# シングルクォートから一度出る方法
```
 ruby -pe 'gsub(/<text /,"<text pointer-events='\''none'\'' ")' index.html  
```

# $'文字列'と　＄を付けて，バックスラッシュでエスケープする
```
 ruby -pe $'gsub(/<text /,"<text pointer-events=\'none\' ")' index.html  
```


なんてことはない，＄を付ければよかったんだ．

2015/10/21 追記　riocamposさんから教えていただきました

# ワンライナーの引用符を " で区切って、gsub の第2引数の引用符を % 記法で書く
```
ruby -pe "gsub(/<text /, %[<text pointer-events='none' ])" index.html
```

もできました．
Android6.0(marshmallow)にOSをUpdateしたらアプリのBLE機能が動かなくなった時の対処方法


はじめに
========

社内で動かしていたちょっとした端末がAndroid5.0から6.0にいつのまにかUpdateされていて、
その上で動かしていた自作アプリがBLEの信号を受信できなくなっていたのをなおした時のメモです。

症状
=====

* Android5.0の時は問題なくBLE周りの機能が使えていた。
* Android6.0にUpdateされたら動かなくなっていた
* 下記のようなログが出ている


	```
	BroadcastQueue﹕ Permission Denial: receiving Intent 	{ act=android.bluetooth.device.action.FOUND 
	```
	
対処法
======

この辺に詳しく書いてあるようです。
[Is Your Beacon App Ready for Android 6.0?](http://developer.radiusnetworks.com/2015/09/29/is-your-beacon-app-ready-for-android-6.html) 

私の場合は、 `AndroidManifest.xml` に

```
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
```

を追加したらなおりました。

全体のPermissionは以下のようになっています。

```
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp" >

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />    ← この行を追加した

    <application ...
```

※ **注意**：BLEのみ必要なら余計なPermisionもあるかもしれません・・・

さいごに
=======

それにしてもいつの間にかUpdateされるとは、、、
AWSのS3で静的Webサイトを公開する手順まとめ


AWSをアカウントでログインしてからS3の項目へ遷移してからの手順

#バケットを作成

* ドメインを設定する場合はバケット名はドメイン名にしておく


#プロパティの設定
* アクセス許可
	* 「全員」リストをチェック
	* バケットポリシー追加・編集(なくてもいいかも)

```	
{
	"Version": "2015-10-20",
	"Statement": [
		{
			"Sid": "AllowPublicRead",
			"Effect": "Allow",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::ドメイン.com/*"
		}
	]
}
```

* 静的ウェブサイトホスティング
	* 静的ウェブサイトホスティングを有効にするにチェック
	* インデックスドキュメントを設定（普通はindex.html）


#ファイルアップロード
Webサイトからでも、CyberDuckのS3プロトコルを使っての転送でもお好きな方をどうぞ


#性的Webサイトを公開したい場合

[AWSのS3で性的Webサイトを公開する手順まとめ](http://qiita.com/nekoruri/items/817d9fefa9af4e8b41e1)
こちらをご参照ください。
AWSメタデータを簡単取得するawsmetaコマンド作った（キモはコマンド補完）

できたー！

## Demo

デモ動画見れば何が出来るか分かると思う。

[![asciicast](https://asciinema.org/a/28360.png)](https://asciinema.org/a/28360)

## Install

ただのシェルスクリプト1個なので、PATHの通った好きなとこにコピーして使えばOK。bashの補完も作ったのでそれも読み込んでおくといい感じになる。

```
git clone https://github.com/kawaz/awsmeta.git
cp awsmeta/bin/awsmeta /usr/local/bin/
cp awsmeta/etc/bash_completion.d/awsmeta.sh /etc/bash_completion.d/
```

## Usage

シンプルな感じに取得。深いパスや複数まとめても取れる。

```console:
$ awsmeta instance-type
t2.micro
$ awsmeta instance-type placement/availability-zone
t2.micro
ap-northeast-1c
```

## Completion

補完が効く！これが重要。

```console:
$ awsmeta ins<TAB>
$ awsmeta instance-<TAB><TAB>
instance-action  instance-id      instance-type
$ awsmeta instance-i<TAB>
$ awsmeta instance-id
i-8c7e372e
```

今までは `curl http://169.254.169.254/latest/meta-data/instance-id` とか長くて補完も効かないタイプを強いられてたのが地味に辛かったので補完したかったんよホント…。

## Git Repository
https://github.com/kawaz/awsmeta
文の中から最も長い単語を返すプログラム

```
sentence = "hippopotamus Freegan seitan ennui swag chia, cronut flexitarian crucifix migas
Kickstarter cold-pressed roof party. Organic cred cliche stumptown,
cronut yr vinyl squid lomo. Helvetica meh PBR, pour-over Pitchfork hoodie cardigan mixtape umami."


def longest_word(sentence)
  sentence.split.max_by{|word| word.length}
end

p longest_word(sentence)

#=> "hippopotamus"
```

```
Ruby:String#split

splitメソッド 区切り文字として文字列を分割し、配列を返す。
引数に代入した文字列を配列にしてそのまま返す
s = "hello world ruby"
p s.split #=> ["hello,", "world,", "ruby"]
```
```
Ruby:Enumerable#max_by

max_byメソッド ブロックの戻り値が最大値となる要素を返します
ブロック引数itemに要素をいれながらブロックを繰り返し実行し、
ブロックの戻り値を集める。

animals =  ["mouse", "cat", "hippopotamus", "giraffe"]
p animals.max_by { |item| item.size} # or length
```

#参考URL
https://teratail.com/questions/17994
Qiita記事の既読/未読を管理するChrome拡張を作ってみた


#概要
##背景
私は気になったQiitaの記事を見つけると、 **その場では読まずにとりあえずストックして後で読むという使い方**をしています。例えばメールマガジンの先週ストックが多かった投稿ベスト20なんかで気になる記事は読まずにバンバンストックしています。そしてストック一覧を見て記事を読もうとすると、 **一見してどれを読んだかすぐにはわからなくて困ってしまいます**。Pocketのアーカイブ機能や、feedlyの既読機能のようなものがあればなぁと思っていました。

私が知らないだけで実はそういう機能があるのではと思い、Qiitaのサポートに問い合わせた所、 **現状そのような機能は存在しない**とのこと。このような機能を所望している人が少しでもいたら、と思いQiitaの記事に既読/未読のラベリングができる非公式Chrome拡張を作成するに至りました。

Chromeウェブストアで無料配布しています。
[Jonda -Qiita既読管理-](https://chrome.google.com/webstore/detail/jonda-qiita%E6%97%A2%E8%AA%AD%E7%AE%A1%E7%90%86/hlahgbooemlpefbkjofdhgeimddanilf?hl=ja&gl=JP)

また、ソースもGitHubのリポジトリを作成しているので何かの役に立てば幸いです。
[cabbage63/jonda](https://github.com/cabbage63/jonda)

紹介ブログ記事
[Qiitaの未読・既読を管理するChrome拡張を公開しました|きゃべログ](http://cabbalog.blogspot.jp/2015/11/qiita-read-chrome-extension.html)

##簡単なデモ
![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/44209/9fffbc08-5efe-183b-6423-387c293e01e4.gif "demo.gif")

#機能
##既読/未読を管理、可視化、変更
ストック一覧の記事のリストにボタンを設置することで実装しています。ボタンにより未読/既読の切り替え・確認ができるようになっています。なお、未読/既読のステータスは端末単位で管理しているので、他の端末を使用してもステータスを引き継ぐことはできません。

##ストック記事一覧ページに未読/既読ボタンを配置
ユーザのストック一覧の記事リストにボタンを設置するようにしています。設定を変更することにより、自身のストック記事だけでなくすべてのユーザのストックした記事についても既読管理をすることが可能になっています。
![stocklist.JPG](https://qiita-image-store.s3.amazonaws.com/0/44209/ea5917a1-ec2f-fe14-4010-02932bcb30d0.jpeg "stocklist.JPG")


##検索結果の記事一覧にもボタン設置可能
記事をキーワード検索する際にもボタンを表示することが可能になっています。
これにより検索時に読んだことがない記事を探すことが容易になります。
![search.JPG](https://qiita-image-store.s3.amazonaws.com/0/44209/6a49957e-52e7-cc12-d3bc-20f067a16319.jpeg "search.JPG")


##記事中からも既読/未読の切り替えが可能
ストックしている記事を別の機会に読んだ時に、読んですぐにステータスを変更するために記事中でもステータス変更可能にしています。こちらもボタン一つでステータスが変更できます。Advent Calendarのようにヘッダの色が変わっている時もしっかりデザインが馴染むようになっているのがちょっとしたこだわりポイントです。
![article.JPG](https://qiita-image-store.s3.amazonaws.com/0/44209/14ae3adf-aa53-53d7-9dca-7dbf971f4f51.jpeg "article.JPG")

#使い方
##ボタンが表示されるページ
- ユーザのストックした記事
	- qiita.com/[ユーザ名]/stock
- 検索結果
	- qiita.com/search?utf=8....
- 記事のヘッダ
	- qiita.com/[ユーザ名]/items/[記事ID]

##設定を変更
Chromeのメニュー＞その他のツール＞拡張機能でこのアプリを探し、オプションをクリックすることで設定が変更できます。ここではどの記事を管理範囲にするかを設定できます。
初期設定ではすべてのユーザのストックを管理するようになっていますが、自分のストックのみ管理するように変更することも可能です。検索結果のボタン表示/非表示もこちらで設定できます。

#Chrome拡張どうやって作るか
Chromeの拡張は基本的にJavascriptをシコシコ書いて作っていきます。やりたいことがある程度はっきりしていれば簡単なものならすぐに公開するまで出来ます。私自身Javascriptの初心者ですが、この拡張機能自体も製作開始から1週間で作ることができました。勉強になりますし、楽しいので結構おすすめです。

せっかく初めてChrome拡張を作成したので、得た知見を元に入門記事でも書こうと思っています。その前にこの拡張機能を構成しているざっくりした技術を紹介しておきます。

- HTMl
	- オプションページはHTMLで書きます
- CSS
	- JSからHTML弄るとデザイン崩れが起こるので、それを補正するのに使ったり
	- オプションページのデザインに使ったり
- Javascript
	- 機能実装は99.9%これ
- jQuery
	- DOMいじりにとても役立つ
- ChromePlatform APIs
	- やりたいことはだいたいこれを使えばできる
	- 例えばローカルにデータ保存したいならchrome.storage
psql のプロンプトでタイムスタンプを表示するには

# きっかけ

psql でマニュアルでオペレーションした場合は、記録のため Github のイシューやその他のドキュメントにコンソールの結果をそのまま貼り付けることがよくある。が、しかし、**いつやったの？**　という情報は含まれていないため思い出しながら記録することになる。

これが面倒だ。psql のプロンプトにそのままタイムスタンプを表示したい。

# 方法

`.psqlrc` にこう書けばいい（**1行目に注目**）

```bash
\set PROMPT1 '%[%033[1m%]%M %n@%/ %`date`\n%R%x%#%[%033[0m%] '
\set PROMPT2 '%R%x%# '
\pset border 1
\pset format wrapped
\pset linestyle unicode
\pset null <NULL>
\x auto
\set COMP_KEYWORD_CASE upper
```

プロンプトの変数において、`` %`command` `` という書き方ができるのだ。command はシェルのコマンドだ。
なのでもちろん、`date "+%Y/%m/%d-%H:%M:%S"` のようにフォーマットすることも可能だ（ぼくはしないけど）

## 実際の出力はこんな感じ

```
[~]$ psql
境界線のスタイルは 1 です。
出力フォーマットは wrapped です。
境界線のスタイルは unicode です。
Null 表示は "<NULL>" です。
拡張表示が自動的に使用されます
psql (9.3.9)
"help" でヘルプを表示します.

[local] vagrant@vagrant 2015年 10月 20日 火曜日 14:26:56 JST
=#
[local] vagrant@vagrant 2015年 10月 20日 火曜日 14:26:56 JST
=#
[local] vagrant@vagrant 2015年 10月 20日 火曜日 14:26:57 JST
=#
[local] vagrant@vagrant 2015年 10月 20日 火曜日 14:26:58 JST
=#
```

### 参考URL

- http://www.postgresql.org/docs/9.3/static/app-psql.html#APP-PSQL-PROMPTING
- https://robots.thoughtbot.com/improving-the-command-line-postgres-experience
JAVA-ソースコードの分割(Package利用)

▪️test45.java ソースコード

```java
package calcapp.main;

public class test45 {
	public static void main(String[] args) {
		int a = 10;
		int b = 2;
		int total = calcapp.logics.test47.tasu(a, b);
		int delta = calcapp.logics.test47.hiku(a, b);
		System.out.println("足すと" + total + "、引くと" + delta);
	}
}
```

▪️test47.java ソースコード

```java
package calcapp.logics;

public class test47 {
	public static int tasu(int a, int b) {
		return (a + b);
	}

	public static int hiku(int a, int b) {
		return (a - b);
	}
}
```

▪️実行結果
足すと12、引くと8![スクリーンショット 2015-10-20 14.43.04.png](https://qiita-image-store.s3.amazonaws.com/0/95187/e5f37e2f-ab8a-b3f2-d44b-308cc66e2615.png)

▪️例①完全限定クラス名の入力を省略する
import文を使用する

▪️例① test45.java ソースコード

```java
package calcapp.main;
import calcapp.logics.test47;

public class test45 {
	public static void main(String[] args) {
		int a = 10;
		int b = 2;
		// FQCNでなくてもエラーにならない
		int total = test47.tasu(a, b);
		// FQCNを指定しても良い
		int delta = calcapp.logics.test47.hiku(a, b);
		System.out.println("足すと" + total + "、引くと" + delta);
	}
}
```

▪️例① test47.java ソースコード

```
package calcapp.logics;

public class test47 {
	public static int tasu(int a, int b) {
		return (a + b);
	}

	public static int hiku(int a, int b) {
		return (a - b);
	}
}
```
▪️例① 実行結果
足すと12、引くと8

![スクリーンショット 2015-10-20 15.29.10.png](https://qiita-image-store.s3.amazonaws.com/0/95187/2a47cd7c-8599-330a-bf2b-5834e6e868ed.png)
rundockを使って複数のマシンにitamaeを実行する

itamaeを複数のマシンに走らせたい場合に、いちいち<code>itamae ssh -j [nodeファイル指定] -j [host_name] [recipeファイル]</code>としていくのは結構面倒ですよね。適用させるマシンが増えれば増えるほど面倒くさい。
そうなると多分シェルを使うとかになると思いますが、別のやり方もあります。それがrundockです。

# インストール
今回はitamaeを使うという前提で。

```Gemfile
gem 'itamae', '~> 1.5'

# 複数の環境でitamaeを提供する
gem 'rundock'
gem 'rundock-plugin-operation-itamae'

```

itamae1.5以上でないと実行にエラーが起きる。

# rundock
## シナリオファイル
どのマシンにどのレシピを実行するかをyaml形式で書きます。今回は次のように書きます。

```yaml
- target: dev-el4
  itamae:
    - cookbooks/redis_elasticsearch.rb
    - node_json: nodes/redis_elasticsearch.json
    - log_level: info
    - sudo: true
- target: dev-el2
  itamae:
    - recipes/redis/redis.rb
    - node_json: nodes/redis.json
    - log_level: info
    - sudo: true
---
dev-el4:
  host: 127.0.0.1
  ssh_opts:
    port: 2200
    user: vagrant
    key: /usr/local/project/itamae_recipe/.vagrant/machines/el4/virtualbox/private_key
---
dev-el2:
  host: 127.0.0.1
  ssh_opts:
    port: 2201
    user: vagrant
    key: /usr/local/project/itamae_recipe/.vagrant/machines/el2/virtualbox/private_key
---
```

## 実行コマンド
実行は<code>rundock do scenario.yml</code>
dry runするときは、<code>rundock do scenario.yml --dry-run</code>

シナリオ実行すると適用するitamaeが実行されます。

![rundock適用結果.png](https://qiita-image-store.s3.amazonaws.com/0/1686/227af24e-98ab-29a4-914d-a4a34cfba0d3.png)
近接センサーで画面をOFFにする方法

Androidの通話アプリは、近接センサーを利用して画面のON/OFFをしています。
これと同じ事を実装したかったので、てくぶ([Androidのセンサーを利用する](http://techbooster.org/android/device/1437/))を読んで TYPE_PROXIMITY の値を取らないとなあ、とか調べていました。

Androidのよくあるパターンだと、こういうのは泥臭い実装が必要だったりするんですよね。



#**超簡単でした**

```
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "tag");
wl.acquire();

...(この間有効)...

wl.release();

※WakeLockのPermissionが必要です
```

このPowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCKというフラグが、まさしく「近接センサーが反応している間だけ画面をOFFにする」という機能を提供しているのでした。

http://developer.android.com/intl/ja/reference/android/os/PowerManager.html#PROXIMITY_SCREEN_OFF_WAKE_LOCK

SDKドキュメントによるとAPIレベル21となっていますが、@hide宣言されてるだけでAndroid2.2でも存在していますので、```compileSdkVersion```に21以降を指定してコンパイルすれば古い端末でもばっちり動作します。

ネタ元：
http://stackoverflow.com/questions/3018716/android-turn-off-screen-when-close-to-face

以上です。
WinMergeを使ってgitリポジトリから差分レポートを作成する


# 背景
改修作業の納品物としてdiffレポートを作成したいことがあります。
比較的少ない手数で、見栄えの良いレポートを作成したいです。
WinMergeのレポート作成機能を使います。

- [WinMergeのレポート機能をつかう](http://netwiz.jp/misc/winmerge_rep.html)

# 要点
## コミットごとにディレクトリを作る

WinMergeはgitのcommitやbranchを認識しません。
比較したいコミットに合わせてディレクトリを二つ作りましょう。

```bat
git clone git@github.com:luxiar/syamo.git old
cd old
git checkout 1a5235170c4c157c1b0b865e7aeca68bde17eab9
cd ..
git clone git@github.com:luxiar/syamo.git new
```

## checkout-indexで.gitディレクトリを除外する

WitMergeは.gitディレクトリを除外しません。
git checkout-indexを使って.git抜きのディレクトリを作りましょう。

```bat
git checkout-index -a -f --prefix=export/
```

# 手順
以上の要点を踏まえまして、以下の手順でレポートを作成します。

## 比較用のディレクトリを作成

```bat
git clone git@github.com:luxiar/syamo.git old
cd old/
git checkout 4f4e835c0541f794daddbd0d113f49bb46a6052c
git checkout-index -a -f --prefix=export/
cd ..
git clone git@github.com:luxiar/syamo.git new
cd new/
git checkout-index -a -f --prefix=export/
```

## WinMergeを起動

```bat
cd ..
WinMergeU.exe /r old/export new/export
```

## レポート作成
1. `ツール(T)` > `レポート作成(R)`
2. `レポートファイル名(R)`に出力ファイル名（例えばreport.html）を入力
3. `スタイル(S)`で`シンプルHTML形式`を選ぶ
4. `OK`ボタン押下


# 感想
コマンドラインだけで完結できる方法をご存知の方がおられましたら
教えていただけると幸いです。

# 参考
- [コマンドライン パラメータ | WinMerge](http://so-zou.jp/software/tech/tool/diff/winmerge/commandline/)
- [WinMargeのレポート機能を自動で出力したいんだお！ : 実験ぶろぐ（仮）試供品](http://needtec.exblog.jp/17762685/)
- [GitからWinMergeを起動してソースを比較し編集したい - For myself tomorrow](http://tigawa.github.io/blog/2014/02/12/difftool/)
Using NSTextView in Xamarin.Mac

##tl;dr
###テキストを追加する
```cs
textView.InsertText("foo");
```

###スクロールする
```cs
// 末尾にスクロール
var range = new NSRange(textView.Value.Length, 0);
textView.ScrollRangeToVisible(range);
```

##NSTextView in Xamarin.Mac
`NSTextField`は単一行，`NSTextView`はもうちょっと高度な編集UIを提供するという認識で大丈夫かと。
`NSTextView`->`NSTextContainer`->`NSLayoutManager`->`NSTextStorage`，従ってテキスト操作は`NSTextStorage`をいじっていくことになる。
本稿ではよく使うであろう，文字列の挿入とスクロール状態の変更について記しておきたい。よく忘れるので。

##Insert
テキストを挿入するのは簡単。

```cs
textView.InsertText("foo");
```
**現在のカーソル位置**に挿入される。ので，末尾に追加したければカーソル位置を末尾に移動すればよい。

```cs:Append
var wholeRange = new NSRange(StatusLabel.Value.Length, 0);
textView.SetSelectedRange(wholeRange);
textView.InsertText("bar");
```
`InsertText`は，ユーザーが入力したのと同じ扱いであるため，`IsEditable==true`時にしか利用できない。
先述のとおり，本来は下記のように`NSTextStorage`を操作する。これは`IsEditable`プロパティに影響されない。

```cs:NSTextStorage
var stor = textView.TextStorage;
stor.BeginEditing();
// 末尾に追加
stor.Append(new NSAttributedString("foo"));
// インデックスを指定して挿入
stor.Insert(new NSAttributedString("bar"), 0);
stor.EndEditing();
```
内部では`NSAttributedString`をブロックとして持っているので，このブロック毎にインデックスが振られている。
詳細は割愛するが，`NSAttributedString`はリッチテキストなので，`NSStringAttributes`を指定すれば前景色など装飾要素を設定できる。たとえば背景色を青くするなら，

```cs
var s = new NSAttributedString("blue", new NSStringAttributes{BackgroundColor = NSColor.Blue});
```

##Scroll
`ScrollRangeToVisible`を呼ぶだけ。Rangeは表示したい文字列が含まれる範囲。要は指定したカーソル位置がビューの最下行にくるように，うまいことスクロールするというメソッド。
末尾に移動するならこんな感じになる。

```cs:ScrollToEnd
textView.ScrollRangeToVisible(new NSRange(textView.Value.Length, 0));
```

##Conclusion
選択されている矩形を取得したり，テキストの装飾要素をコントロールしやすかったりと高機能なので，慣れてくるとなかなか使いどころの多いニクいやつ。
node.js(express)をforeverでdaemon化

    Amazon linux2015.03上で行いました。

## 目的
expressをdaemonとして動かす。

## 設定
### foreverのインストール
```bash
npm install -g forever
```

### 起動スクリプトを書く。
`/etc/init.d/forever`へ下記を追加して実行権限をつける。

```bash
#!/bin/bash
# chkconfig: 2345 75 25
# description: forever stop:stop Script

# export NODE_ENV=
# export NODE_CONFIG_DIR= #お好みで
# harmonyで動かしています。
start() {
    echo -n "Starting forever: "
    /usr/node/bin/forever start --workingDir=/path/to -c "node --harmony" -a --uid hogehoge /path/to/bin/www
    return 0
}
stop() {
    /usr/node/bin/forever stop hogehoge
    return 0
}
case "$1" in
  start)
    stop
    start
    ;;
  restart)
    stop
    start
    ;;
  stop)
    stop
    ;;
   *)
    echo $"Usage: $0 {start|stop|restart}"
    exit 2

esac
```

### OS起動時に動くよう設定する
```bash
chkconfig forever on
```
InnoDB plugin有効化

MySQL5.1利用時にInnoDB pluginを有効化するときの備忘録

#my.cnfの編集

以下2行を追加して、MySQLを再起動

```
[mysqld]
ignore-builtin-innodb
plugin-load=innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;innodb_locks=ha_innodb_plugin.so;innodb_lock_waits=ha_innodb_plugin.so;innodb_cmp=ha_innodb_plugin.so;innodb_cmp_reset=ha_innodb_plugin.so;innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpmem_reset=ha_innodb_plugin.so
```

#InnoDB pluginが有効になっているかの確認

InnoDB pluginで追加されたシステム変数(innodb_version)を調べる。

```
mysql> select @@innodb_version;
+------------------+
| @@innodb_version |
+------------------+
| 5.1.73           |
+------------------+
1 row in set (0.00 sec)
```
Gitのリモートブランチを削除するまとめ


覚書き。

# リモートブランチを削除する

```
git push --delete origin branch_name
```

もしくは

```
git push origin :branch_name
```

※リポジトリの運用方法に配慮して削除すること。

# 他人が削除したリモートブランチがローカルに残ってる

```
git branch -a
```

を実行したときに、恐ろしい量のbranchリストが出てくるって人はこれが原因かもしれない。
他人が追加したリモートブランチはfetchで取ってこれるが、削除したブランチはそのまま残る。
削除されたリモートブランチをローカルに適用するにはオプションが必要。

```
git fetch --prune ( git fetch -p )
```

# そんなオプションは面倒

ホームディレクトリの.gitconfigに設定することで、fetchに自動でpruneを実行してくれる。
リポジトリの運用上問題が無ければ設定した方が楽かもしれない。

コマンドで、

```
git config --global fetch.prune true
```

を実行するか、
ホームディレクトリの.gitconfigに

```
[fetch]
	prune = true
```

を追記する。

(コマンドを実行すれば追記されます)

以上
音楽再生アプリでロック画面に再生ボタンやタイトルを表示するときのプロパティ


備忘録。
###タイトル
`MPMediaItemPropertyTitle`
###アートワーク
`MPMediaItemPropertyAlbumTitle`
###アーティスト名
`MPMediaItemPropertyArtist`
###音楽の長さ
`MPMediaItemPropertyPlaybackDuration`
###音楽の再生時点
`MPNowPlayingInfoPropertyElapsedPlaybackTime`

##参考
[かゆいところに手が届きそうなAVFoundationとMediaPlayerによる音楽再生アプリ作成メモ](http://qiita.com/yimajo/items/c30c4d5f5eab06172028)
[iPhoneで再生中の曲情報を取得する方法](http://qiita.com/yuch_i/items/3d7b0186e47cb99b91df)
[Swift でミュージックを取り込むアプリを作る時のノウハウ 5 つ](http://qiita.com/pika_shi/items/838315c7c8e264c9bb97)
[iOS MPNowPlayingInfoCenter track duration counts down](http://ask.ttwait.com/que/28914245)
日本語以外の文字と記号を排除し日本語の平文コーパスを作成する呪文

日本語の自然言語ライブラリの中には、ヘブライ語や韓国語をぶちこんだ瞬間にエラーで処理が止まるライブラリ多いです。そんなときに便利な呪文を紹介します。

# たとえばPyCon2015で紹介されたのjanomeは韓国語が混入するとエラーで死ぬ
janomeはMeCabをインストールする手間を省いてくれる素晴らしい形態素解析器なのですが、日本語以外の文字が1文字でも混入するとエラーで死にます。wikipediaの左言語切り換えバーを読み込んだ例だと...

```py:wikipediaの左のバーより
text = "他言語版Italiano한국어PolskiSimple English"
t = Tokenizer()
for token in t.tokenize(text):
     print token

---------------
Traceback (most recent call last):
  File "tests.py", line 98, in <module>
    for token in t.tokenize(text):
  File "lib/python2.7/site-packages/janome/tokenizer.py", line 107, in tokenize
    pos += lattice.forward()
  File "lib/python2.7/site-packages/janome/lattice.py", line 124, in forward
    while not self.enodes[self.p]:
IndexError: list index out of range
```

# そんなときはこの呪文

```py:
import re
import nltk

def filter(text):
   """
   :param text: str
   :rtype : str
   """
   # アルファベットと半角英数と記号と改行とタブを排除
   text = re.sub(r'[a-zA-Z0-9¥"¥.¥,¥@]+', '', text)
   text = re.sub(r'[!"“#$%&()\*\+\-\.,\/:;<=>?@\[\\\]^_`{|}~]', '', text)
   text = re.sub(r'[\n|\r|\t]', '', text)

   # 日本語以外の文字を排除(韓国語とか中国語とかヘブライ語とか)
   jp_chartype_tokenizer = nltk.RegexpTokenizer(u'([ぁ-んー]+|[ァ-ンー]+|[\u4e00-\u9FFF]+|[ぁ-んァ-ンー\u4e00-\u9FFF]+)')
   text = "".join(jp_chartype_tokenizer.tokenize(text))
   return text


text = "他言語版Italiano한국어PolskiSimple English"
text = filter(text)
t = Tokenizer()
for token in t.tokenize(text):
     print token


------------------
他	接頭詞,名詞接続,*,*,*,*,他,タ,タ
言語	名詞,一般,*,*,*,*,言語,ゲンゴ,ゲンゴ
版	名詞,接尾,一般,*,*,*,版,バン,バン
```
FizzBuzz改


```
#FizzBuzzを判定するメソッド

def fizzbuzz(num)
  return :FizzBuzz if num % 15 == 0
  return :Bizz if num % 5 == 0
  return :Fizz if num % 3 == 0

  num
end

配列をfizzbuzzメソッドで判定し、判定後の値を返す。

(1..100).map { |num| fizzbuzz(num)}.each do |num|
  puts num
end

#コードの説明

1から100の数値を変数|num|に代入して、
fizzbuzzメソッドで変数numに代入された数値を判定して、
eachメソッドで一つずつ変数|num|にいれて、putsメソッドで出力する


```

```
mapメソッドに関して

各要素に対して、{}ブロック内の式を実行した結果を返します

[1, 2, 3].map { |n| n * 3}
[3, 6, 9]
```
SwiftでStatusBarのみ色変えたい場合

一般的にはUINavigationBarの色を変えて、ステータスバー透過とかでナビゲーションバーの色とステータスバーの色が同じに出来たかと思いますが、ステータスバーの色だけ変えたいという場合もあるかと思います。

そんな場合は、`viewDidLoad`の中とかで、UIView作成してステータスバー上に乗せてしまえば良いようです。

```swift

let statusBarBackground = UIView(frame: CGRectMake(0 , 0, CGRectGetWidth(self.view.frame), CGRectGetHeight(UIApplication.sharedApplication().statusBarFrame)))
statusBarBackground.backgroundColor = UIColor.redColor()
self.view.addSubview(statusBarBackground)

```
高さ揃えを実装するときの候補jsとその実装方法

色々あって何を使うか悩んだり、どう使うか忘れるので覚書です。

## heightLine.js
[配布先](http://blog.webcreativepark.net/2007/07/26-010338.html)

利点：
1. 親要素にclassをふることで、子要素の高さを揃えられ、手間が減る。
- 統一したいブロック要素に「.heightLine」
- グループ別けして統一「heightLine-（group1）」かっこ内は任意の名前でok
- 親要素にclassを振って子要素全ての高さを統一「.heightLineParent」

## jQueryAutoHeight.js
[配布先](http://www.tinybeans.net/blog/download/jquery-plugin/jquery-auto-height.html)

利点：
1. n番目ごとかを選べる
2. min-heightとheightを選べる
3. js用に新規classを振らずにすむ（既存の名前でjsを動かせる）
4. clearが出来る

- 統一したいブロック要素を指定する

```
<script type="text/javascript">
jQuery(function($){
    $(揃えたいセレクタ).autoHeight();
});
</script>
```
- 揃えたい数を決めて一行毎に高さを揃える

```
jQuery(function($){
    $(揃えたいセレクタ).autoHeight({column:そろえたい数});
});
```
- 更にfloatを解除できるようにする

```
jQuery(function($){
    $(揃えたいセレクタ).autoHeight({column:そろえたい数, clear:1});
});
```

- heightで揃えるように変更する

```
jQuery(function($){
    $(セレクタ).autoHeight({height:'height'});
});
```

## jquery.tile.js
[配布先](http://urin.github.io/jquery.tile.js/)

利点：
1. n番目ごとかを選べる
2. js用に新規classを振らずにすむ（既存の名前でjsを動かせる）

- 統一したいブロック要素を指定する

```
<script type="text/javascript">
$(function(){
    $('揃えたいセレクタ').tile(そろえたい数);
});
</script>
```

### 一塊の中だけで判断して高さをそろえる
・親要素が複数
・さらに子要素も不特定多数で増減する
ような場合。

「.hogeを3つごとに高さ揃えする」といった指定だと
親要素をまたがっても、3つ目ごとの要素で高さを揃えられて、ちぐはぐなことになるときがある。
その場合はeachをつけることで解決。
以下はtile.jsの場合。

```
<script type="text/javascript">
	$(function(){
		$('揃えたい親セレクタulとか').each(function(){
			$(this).find('その子要素liとか').tile(そろえたい数);
		});
	});
</script>
```
ubuntu の ls で ディレクトリが 777 の時、背景色が見づらいので直したい

`OTHER_WRITABLE` の値を書き換えると直る.

```
dircolors -p > ~/.dircolors
```

```
vi ~/.dircolors

# OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky
OTHER_WRITABLE 36
```

dircolors を使うように、という記事は多いけど、その後どうするの？というのが探すのに苦労したので、記録しておく。
Railsでファイル変更に応じてリロードしてくれるBrowserSyncを手軽に導入する

[BrowserSync](http://www.browsersync.io/)はgrunt, gulpそしてブラウザエクステンションがなくても利用でき大変便利です。LiveReloadより楽だと思います。

- ファイル更新を検知してブラウザを自動更新
- 複数のブラウザの動きを同期

などしてくれます。

インストールはnpmからです。

```
npm install -g browser-sync
```

`browser-sync init`として、設定ファイルをプロジェクト内に作成することも出来るのですが、.gitignoreすら汚したくない場合もあると思うので、スマートにコマンドに引数を渡してみます。


```
rails s
```
したあと、

プロジェクトルートで、

```
browser-sync start --proxy localhost:3000 --files "app/assets/stylesheets/*.css.*","app/views/**/*.html.*","app/assets/javascripts/**/*.js.*"
```
でOKです。localhost:3001でブラウザが立ち上がります。

簡単なので是非活用して開発効率をあげましょう。
UIViewController の設計指針

主に Interface Builder を使用せずガリガリコーディングする人向け。基本的には [UIViewController](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/) のマニュアルを読めって感じなのだが...

# ビューコントローラーの初期化

## `- initWithNibName:bundle:`

すべきこと:

- 必要な全プロパティの初期化 (`view` プロパティを除く)

すべからざること:

- `view` プロパティの初期化

# ビュー

## `view` プロパティ

このプロパティのゲッターは普通のゲッターではない。`view` が未初期化の時にゲッターを呼ぶと、中で `loadView` と `viewDidLoad` が呼ばれ、結果のビューが返される。

ビューが初期化済みかどうか知るには `isViewLoaded` を呼ぶ。

## `- loadView`

Interface Builder 使用時は `loadView` をオーバーライドしてはならない。

すべきこと:

- ビューを生成し `self.view` に代入する。

すべからざること:

- `self.view` 以外のプロパティの変更
- 親クラス (`UIViewController` 自身) の `loadView` の呼び出し

## `- viewDidLoad`

`loadView` が呼ばれた直後に呼ばれる。

すべきこと:

- 必要に応じて `self.view` の状態を変更する。

すべからざること:

- `self.view` 以外のプロパティの変更

`view` プロパティは `initWith...` では初期化されず、初めて `view` プロパティが参照されるときに初期化される。いつプロパティが参照されるかは不確定なので (特にビューコントローラーを作った後すぐ表示しない場合)、タイミングが重要な処理を `loadView`/`viewDidLoad` に書いてはいけない。特に、ビューが表示される直前にナビゲーションバーを隠すとか画面の向きに応じてレイアウトするとかの処理をここに書くのは誤り。

`view` の子ビューを生成するのは本来は `view` 自身の仕事だが、カスタムビュークラスを作るのをサボって `UIView` のインスタンスを `view` として使う場合は `loadView`/`viewDidLoad` から `view` に子ビューを追加して良い。

# 表示関連イベント

`viewWillAppear:` の後 `viewDidAppear:` が呼ばれるとは必ずしも限らない。同じく、 `viewWillDisappear:` の後 `viewDidDisappear:` が呼ばれるとは必ずしも限らない。UIViewController のマニュアルにある状態遷移図を見ること。

## `- viewWillAppear:`

ビューが見え始める時に呼ばれる

## `- viewDidAppear:`

ビューが完全に見える状態になった時に呼ばれる

## `- viewWillDisappear:`

ビューが見えなくなり始める時に呼ばれる

## `- viewDidDisappear:`

ビューが完全に見えなくなった時に呼ばれる

これらのメソッドは、親クラスの同メソッドを呼び出さなければならない。さもないと、子ビューコントローラーの同メソッドが呼ばれなかったりする。

# レイアウト

以下のメソッドを必要に応じてちまちま実装するのは面倒なので、自動レイアウトで済むところはなるべくそれに任せた方が良い。

## `- viewWillLayoutSubviews`

`self.view` の `layoutSubviews` が呼ばれる直前に呼ばれる。

すべからざること:

- `self.view` (の子ビュー)の frame や bounds を調整する

## `- viewDidLayoutSubviews`

`self.view` の `layoutSubviews` が呼ばれた直後に呼ばれる。 `self.view` の子ビューのレイアウトを手動調整する必要がある場合は基本的にここでする。

すべからざること:

- `self.view` の子ビューの子ビューのレイアウトを調整する。

## `- viewWillTransitionToSize:withTransitionCoordinator:`

ビューのサイズが変化する前に呼ばれる。(iOS 8 以降)

すべきこと:

- 親クラスの同メソッドの呼び出し

## `- sizeForChildContentContainer:withParentContainerSize:`

子ビューコントローラの適切なサイズを求めるために呼ばれる。(iOS 8 以降)

すべからざること:

- 状態の変更

## `- preferredContentSizeDidChangeForChildContentContainer:`

子ビューコントローラの推奨サイズが変化したとき呼ばれる。(iOS 8 以降)

## `- systemLayoutFittingSizeDidChangeForChildContentContainer:`

子ビューコントローラのサイズが自動レイアウトによって変化したとき呼ばれる。(iOS 8 以降)

## `preferredContentSize` プロパティ

ビューの推奨サイズを設定する。特に、ビューがポップオーバーで表示されるときのサイズに影響する。
GNU parallel

# bash parallel 備忘録
### 並列処理をお手軽に実行したい際に有効なコマンド
#### smtp-cli コマンドを使用して MTAに負荷をかけたい場合など。
#### 以下は、10並列でメール送信した例。色々奥が深いので、勉強しようと思います。

```bash:send-mail.sh
#!/bin/bash
./smtp-cli  --disable-starttls  --verbose   --server=xx.xx.xx.xx:25 \
   --mail-from=hogehoge@hogehoge.ne.jp   --rcpt-to=hoge@hogehoge.co.jp \
   --from=hogehoge@hogehoge.ne.jp  --to=hoge@hogehoge.co.jp   --subject=test-${1}
```

```bash
[user@hoge script]$ seq 1 10 | parallel --no-notice ./send-mail.sh {}
Connection from 172.16.117.131:51293 to 172.16.130.6:25
[220] 'hogehoge.ne.jp ESMTP'
> EHLO localhost
[250] 'hogeho.ne.jp'
[250] 'PIPELINING'
[250] 'SIZE 157286400'
[250] 'ETRN'
[250] 'STARTTLS'
[250] 'AUTH PLAIN LOGIN'
[250] 'AUTH=PLAIN LOGIN'
[250] 'ENHANCEDSTATUSCODES'
[250] '8BITMIME'
[250] 'DSN'
> MAIL FROM: <hogehoge@hogehoge.ne.jp>
[250] '2.1.0 Ok'
> RCPT TO: <hoge@hogehoge.co.jp>
[250] '2.1.5 Ok'
> DATA
[354] 'End data with <CR><LF>.<CR><LF>'
[250] '2.0.0 Ok: queued as EFE3B340037'
> QUIT
[221] '2.0.0 Bye'
Connection from xxx.xxx.xxx.xxx:xxxxx to xxx.xxx.xxx.xxx:25
[220] 'hogehoge.ne.jp ESMTP'
> EHLO localhost
[250] 'hogehoge.ne.jp'
[250] 'PIPELINING'
[250] 'SIZE 157286400'
[250] 'ETRN'
[250] 'STARTTLS'
[250] 'AUTH PLAIN LOGIN'
[250] 'AUTH=PLAIN LOGIN'
[250] 'ENHANCEDSTATUSCODES'
[250] '8BITMIME'
[250] 'DSN'
> MAIL FROM: <hogehoge@hogehoge.ne.jp>
....省略
```