OmniAICreator/Qiita-1.07M huggingface dataset:
App Engine for Go からgithub APIを叩く

# アクセストークンの生成

https://github.com/settings/tokens の手順に従いアクセストークンを生成する

# Github APIを叩く！

App EngineからHttp Requestを投げる時はurlfetch apiを利用する
Authorizationにアクセストークンを入れるのを忘れずに！


[Markdown API](https://developer.github.com/v3/markdown/) を叩いている雑な例

```
import (
	"bytes"
	"encoding/json"
	"io/ioutil"
	"net/http"

	"google.golang.org/appengine"
	"google.golang.org/appengine/urlfetch"
)

type MarkdownPostParam struct {
	Text    string `json:"text"`
	Mode    string `json:"mode"`
	Context string `json:"context"`
}

func init() {
	http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
	ctx := appengine.NewContext(r)

	param := MarkdownPostParam{
		Text:    "Hello Markdown,
		Mode:    "gfm",
		Context: "github/gollum",
	}
	paramBytes, err := json.Marshal(param)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	client := urlfetch.Client(ctx)
	req, err := http.NewRequest("POST", "https://api.github.com/markdown", bytes.NewReader(paramBytes))
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", fmt.Sprintf("token %s", "{your token}"))
	resp, err := client.Do(req)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

        body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
}
```
Sinatraのjson_encoderを入れ替える

# TL;DR
- Sinatraのjson_encoderを入れ替える
- ``` :json_encoder => some_encoder ``` で渡せる
- ```oj``` は Sinatra内部で呼ばれるmethodがないので別途作成して食わせる

# ref
- http://www.sinatrarb.com/contrib/json.html

# sample

- Gemfile

```
source "https://rubygems.org"

# utilities
gem "rake", '~> 10'
gem "yajl-ruby"
gem "oj"
gem "oj_mimic_json"

# rack-app
gem "thin"
gem "sinatra"
gem "sinatra-contrib"
gem "unicorn"
```


```app.rb
require 'sinatra'
require 'sinatra/json'
require 'yajl'
require 'oj'
require 'oj_mimic_json'
require './oj_encoder.rb'

get '/oj' do
  hash = {}
  hash['key'] = 'hoge'
  hash['key2'] = 'fuga'
  hash['uuid'] = SecureRandom.uuid
  json hash, :json_encoder => OjEncoder.new
end

get '/yajl' do
  hash = {}
  hash[:key] = 'hoge'
  hash[:key2] = 'fuga'
  hash[:uuid] = SecureRandom.uuid
  json hash, :json_encoder => Yajl::Encoder
end

get '/' do
  hash = {}
  hash[:key] = 'hoge'
  hash[:key2] = 'fuga'
  hash[:uuid] = SecureRandom.uuid
  json hash
end
```

```config.ru
require 'rubygems'
require 'sinatra'

require './app.rb'

run Sinatra::Application
```

```oj_encoder.rb
require 'oj'

class OjEncoder

  def initialize
    ::Oj.default_options = {:mode => :compat }
  end

  def encode(value)
    ::Oj.dump(value)
  end

end

```
JAVA 14.5練習問題(P558) trim()メソッド

■練習問題14-1
独自に書式を指定して「2015年11月11日16時」の様な文字列を生成の面倒なやり方(処理が冗長)

##■練習問題14-1　解答
```java
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Test03 {
	public static void main(String[] args) {
		// ①現在の日時をDate型で取得する
		Date now = new Date();
		Calendar c = Calendar.getInstance();

		// ②取得した日時情報をCalendarにセットする
		c.setTime(now);

		// ③Calendarから「日」の数値を取得する
		int day = c.get(Calendar.DAY_OF_MONTH);

		// ④取得した値に100を足した値をCalendarの「日」にセットする
		day += 100;
		c.set(Calendar.DAY_OF_MONTH, day);

		// ⑤Calendarの日付情報をDate型に変換する
		Date now2 = c.getTime();

		// ⑥SimpleDateFormatを用いて、Dateインスタンスの内容を表示する
		SimpleDateFormat f = new SimpleDateFormat("西暦yyyy年MM月dd日");
		System.out.println(f.format(now2));
	}

}

■練習問題14-1　解答 実行結果
西暦2016年02月20日
```
---
##■練習問題14-2　解答
■Account.java

```java
public class Account {
	String accountNumber; // 口座番号
	int balance; // 残高

	public String toString() {
		return "\\" + this.balance + "(口座番号=" + this.accountNumber + ")";
	}

}
```

■Test03.java

```java
public class Test03 {
	public static void main(String[] args) {
		// P558 練習問題14.5
		// ①
		Account a = new Account();
		a.accountNumber = "4649";
		a.balance = 1592;
		System.out.println(a);
	}
}
```

■練習問題14-2　解答 実行結果
\1592(口座番号=4649)

■練習問題14-2　解答 補足
\は、なぜかQiitaでは￥が全角で表示されないので、
\は￥マークの半角と思って下さい。

---
<FONT color="#ff0000">■trim()メソッド</font>
文字列の前後の空白を除去したいときは、Stringクラスのtrim()が使える

■例 trim()

```java
String val = " 左側に半角スペース、右側に全角スペース　　";
		System.out.println("trimして出力⇒" + val.trim());
		System.out.println("trimしないで出力⇒" +val);
```

■実行結果
trimして出力⇒左側に半角スペース、右側に全角スペース　　
trimしないで出力⇒ 左側に半角スペース、右側に全角スペース
.net の実装が気になるときはソースを読もう

#はじめに
C#の基本ライブラリのパフォーマンスや実装が気になるときは、ソースコードを読むといいですよ。
オープンソース化のお陰で読めるようになっています。
とても勉強になります。

##リファレンスソース
http://referencesource.microsoft.com/
だいたいある。

##corefx
https://github.com/dotnet/corefx
リファレンスソースで見つからないものはここで探す

##.NET Foundation 
https://github.com/dotnet/
大元のgithubのページ。色々なプロジェクトがあります。



ほかにも、いいサイトがありましたら教えてください。
可変文字列クラスを MutableString と命名すべき理由

[うまくクラス名を付けるための参考情報](http://qiita.com/KeithYokoma/items/ee21fec6a3ebb5d1e9a8)といふ記事を見掛けて、「動詞+er」のパターンがちょっと多くていまいちだなーとか思って書いた記事です。

以前[クラスの命名のアンチパターン](http://qiita.com/magicant/items/8134edf969f9629fa66e)といふ記事を書きましたが、これを読んで「Animation と Animator とではどっちがええんやろ?」と思った人への回答でもあります。

----

昔の Java では可変文字列クラスは `StringBuffer` と呼ばれてゐました。C# や最近の Java では可変文字列クラスは `StringBuilder` と呼ばれます。Objective-C では `MutableString` です[^ns]。

[^ns]: `NS` とかいふ接頭辞は省略しました。

私はこの中では `MutableString` が最も良いと思ってゐます。次点は `StringBuffer` です。 `StringBuilder` はダメです。

`MutableString` が良い理由は、完全にその名が体を表してゐるからです。直訳するとまさに「可変文字列」ですね。`MutableString` クラスにはそのインスタンスを可変文字列として扱ふためのメソッド (後述) が揃ってゐます。

`StringBuffer` もそこそこ良いですが、こちらは `Buffer` の意味がやや曖昧です。ファイルストリームの読み書きを高速化するための一時記憶領域と関係があるのかとか一瞬勘違ひしてしまひます。

`StringBuilder` がダメなのは、用途を限定しすぎてゐるからです。`StringBuilder` といふ名前を聞くと、それが単に不変文字列を生成するための道具にすぎない印象を与へます。もし `StringBuilder` が、`buildString` といふ名前のパブリックメソッドただ一つを持つインターフェースだったなら、その名前もアリだと思ひます。しかし実際の `StringBuilder` は、文字列の _n_ 番目の文字を調べたり、一部を書き換へたり、別の文字列を連結したりするためのメソッドも持ってゐます。このクラスのインスタンスの中には変更可能な文字の配列といふ内部状態が隠されてゐて[^impldetail]、それに様々な形でアクセスするためのメソッドがあるわけです。これは明らかに build(er) といふ一つの動詞(っぽい名詞)で表される概念を越えてゐます。要するに、全体としてこのクラスは可変文字列 (mutable string) なのです。

[^impldetail]: 実際にそれが配列によって実装されてゐるのかはさておき

----

一般に、オブジェクトは何らかの内部状態を持ってゐて、メソッドが呼ばれることによってその状態を変化させます。状態がどう変化するかといふ動詞の部分はメソッド名によって表されるので、クラス名は状態が何であるのかといふ名詞の部分を表すことの方に注力すべきです。すると、builder などの「動詞+er」のパターン[^agentnoun]は自然と避けられることになります。

例外的にこのパターンが許されるのは、`Iterator` や `EventListener` みたいに内部状態がほぼ完全に抽象化され、役割が動詞一つで表せるインターフェースの名前です。

[^agentnoun]: このパターンの名詞を agent noun と言ひます。
Doctrine ORM の結果を var_dump したい時

概要
-----

巨大なオブジェクトや、 Doctrine ORM の結果を var_dump() で出力しようとすると、出力が膨大すぎて、ブラウザが落ちてしまったり、 memory_limit に引っかかってしまったりする。

`\Doctrine\Common\Util\Debug::dump()` という関数も用意されているが、あまり手軽ではないし、これでも memory_limit で落ちたりする場合がある。

解決方法
-----------

そんな時は `serialize()` を使用すると、程良いサイズで dump 可能。しかも高速。

```php
var_dump(serialize($Object));
```

ただし `Closure` や `Symfony\Component\HttpFoundation\File\UploadedFile` など、 シリアライズできないオブジェクトもあるので注意すること。
[AWS][Slack] 3分でできるAWS CloudWatchアラートのSlack通知設定

アラートメールが多くてモバイルの通知設定をオフにしている、また未読が溜まりすぎてどうしようもないエンジニアの皆さん、こんにちは

ということで、さくっと3分でいきましょう！

## 設定方法
### 1. Slack Email integrationを設定
![Email___fusic_Slack.png](https://qiita-image-store.s3.amazonaws.com/0/22567/7fa5bcaa-29ed-5a0e-67da-f7ef3f9ebd7f.png)


これです。この機能が出た瞬間からこのためにあるのだと思ったくらいです。

![Email___fusic_Slack 2.png](https://qiita-image-store.s3.amazonaws.com/0/22567/2406222d-0bdc-f7d1-a610-99a829f74a9b.png)


### 2. 何時もの手順でAWS SNSにsubscriptionを設定
いつもは自分のメールアドレスを登録していると思いますが、さっきSlackから発行されたメールアドレスを設定してください

### 3. Slackチャンネルに届くsubscription確認メールをクリックして認証
![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/22567/22891e4f-527f-11a8-9d89-3b82f484b5c7.png)

ここも通知がSlackに来る以外は一緒ですね

### 4. もう終わりです
あとはいつもどおりAWS CloudWatch設定をして、通知先に先ほど登録したsubscriptionを選択するだけです

## こんな感じで届きます
![Slack 2.png](https://qiita-image-store.s3.amazonaws.com/0/22567/c2f72409-38a8-c8d3-4069-3748c5ce0450.png)


どうでしょうか？もしかすると3分もかからないかもしれませんね。
open frame works Ver 9でfreetype2 のディレクトリが変わっている

oF Ver 8.4から9になった際にfreetypeのディレクトリが変わった
 `#include "freetype2/freetype/~~~~~.h"`
が
`#include "freetype2/~~~~~.h"`
に

oF ver 8.4でビルドが通っていたプロジェクトがfreetypeが見つからない理由でビルドできないエラーの際は、上記を修正。
Android タイトルバーを隠す AppCompatActivity編

久々にAndroidのアプリを実装する必要があって公式サイトにアクセスしてみたら Android Studioが公式開発環境になったんですね。
隔世の感ありです。

でとりあえずEmpty Activityでプロジェクトを作ってみました。
<img width="633" alt="Screen Shot 2015-11-12 at 15.21.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/0151e731-a59d-28ef-73fc-e6c9b7643f6d.png">

プレビュー
<img width="450" alt="Screen Shot 2015-11-12 at 15.22.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/addab2e3-4b96-7cbc-4e11-3dc0d7eb50f1.png">

最初からタイトルバーが付いているんですね。いらないんで隠そうかと思ったら、supportv7から標準と思われるAppCompatActivity用の設定がggっても見当たらない....

結局
Manifest.xmlの修正でした。

```xml:AnroidManifest.xml
 android:theme="@style/Theme.AppCompat.Light.NoActionBar" 
```


<img width="312" alt="Screen Shot 2015-11-12 at 15.32.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/0d963538-ea4e-68f3-26cf-179f65cf06e7.png">


久々にAndroidと戯れる日々が続きそうです。
配列やtupleでユニークな値のカウントをとりたい


# やりたいこと

``` ['a', 'a', 'b', 'b', 'b']``` を、```[('a', 2), ('b', 3)]``` にしたい。そこから2個以上だけ取りたい。
SQLなら簡単そう。Pythonだけで出来ないものか。

# やり方
以下で出来た

```python
[(g[0], len(list(g[1]))) for g in itertools.groupby(array.sort())]
```

## Example
```python
>>> import itertools
>>> array = ['a', 'a', 'b', 'b', 'b']
>>> uniq = [(g[0], len(list(g[1]))) for g in itertools.groupby(array.sort())]
>>> uniq
[('a', 2), ('b', 3)]
```

## やりたかったこと
```python
>>> tuples = [('aaa', 'bbb'), ('aaa', 'bbb'), ('aaa', 'vvv'), ('bbb', 'ccc'), ('bbb', 'ccc')]
>>> uniq = [(g[0], len(list(g[1]))) for g in itertools.groupby(tuples.sort())]
>>> uniq
[(('aaa', 'bbb'), 2), (('aaa', 'vvv'), 1), (('bbb', 'ccc'), 2)]
>>>  filter(lambda f: f[1] > 1, uniq)
[(('aaa', 'bbb'), 2), (('bbb', 'ccc'), 2)]
```

2個以上のものだけ抜き取れた。


# 参考
http://stackoverflow.com/questions/2392929/how-to-get-unique-values-with-respective-occurance-count-from-a-list-in-python

-----

さらに便利なライブラリについてコメントを頂いたので。
# もっと便利な```collections```があった

```python
>>> from collections import Counter
>>> tuples = [('aaa', 'bbb'), ('aaa', 'bbb'), ('aaa', 'vvv'), ('bbb', 'ccc'), ('bbb', 'ccc')]
>>> uniq = Counter(tuples)
>>> uniq 
Counter({('aaa', 'bbb'): 2, ('bbb', 'ccc'): 2, ('aaa', 'vvv'): 1})
>>> filter(lambda f: f[1] > 1, uniq.items())
[(('aaa', 'bbb'), 2), (('bbb', 'ccc'), 2)]

```
```collections.Counter``` 使いましょう!!

# 参考
http://docs.python.jp/2/library/collections.html
gitwatch > python > Top 30 Python Projects In GitHub > OCT 19, 2014 BY DSK

Top 30 Python Projects In GitHub
http://www.idiotinside.com/2014/10/19/top-30-python-projects-in-github/

pythonのコードの勉強にいいのだろうか。


https://github.com/django/django/tree/master/django/utils
はリーディングしにくそうだった。

https://github.com/mitsuhiko/flask/tree/master/flask
はぱっとみて構造がわかりやすそう。
このあたりを読んでみる。
自前のRedmineで外部のGitリポジトリを追加してcrontabで更新する

自前で用意しているRedmineでGitHubとかのリポジトリを監視させる。
通常のRedmineだとローカルディスクにあるGitリポジトリしか見えないので手元に --bare でクローン。


このあたりはこの記事で完璧にできる
http://qiita.com/n_slender/items/54cd282c140fadbbb322

```
shell> git clone --bare hoge@github.com/hoge.git
```

crontabに書いておく。
gitコマンドはディレクトリを潜って指定できないらしいのでcdさせる

```
 */5 * * * * cd /home/yousan/git/hoge.git; git fetch --all
```
JAVA IntegerクラスのparseInt() toHexString() valueOf()メソッド

#toHexString()　整数を16進数表現に変換する

```java
■toHexString()の例　
		int nn = 43;
		String n2 = Integer.toHexString(nn);
		System.out.println(n2);

■実行結果
2b
```

```java
■toHexString()の例②　
		String n2 = Integer.toHexString(30);
		System.out.println(n2);

■実行結果
1e
```

##parseInt()　数字の文字列をint型に変換する

```java
String age = "23";
		Integer n = Integer.parseInt(age);
		System.out.println(n);

■実行結果
23
```

###valueOf() 数字の文字列をint型に変換する

```java
■valueOf()の例
		int ii = 15;
		Integer ii2 = Integer.valueOf(ii);
		System.out.println(ii2);

■実行結果
15
```

```java
■valueOf()の例②
	String bb = "62";
		Integer bb2 = Integer.valueOf(bb);
		System.out.println(bb2);

■実行結果
62
```

```java
■valueOf()の例②
	String bb = "62";
		int bb2 = Integer.valueOf(bb);
		System.out.println(bb2);

■実行結果
62
```

```java
■valueOf()の例②
		int bb2 = Integer.valueOf("50");
		System.out.println(bb2);

■実行結果
50
```
####Integer型の変数に入ってる値をint型に変換
```java
■Integer型の変数に入ってる値をint型に変換
		int ii = 15;
		Integer ii2 = Integer.valueOf(ii);
		System.out.println(ii2);
		int ii3 = ii2.intValue();//Integer型をint型に変換
		System.out.println(ii3);

■実行結果
15
```

#AutoBoxingとAutoUnboxing
```java
		int s1 = 5;
		Integer s2 = s1;
		int s3 = s2;
		System.out.println(s3);

■実行結果
5
```
RailsでNULLを一意性制約に含める

データベースでは、NULLは一意性制約に含まれない。

```rb:20151112123456_create_settings.rb
class CreateSettings < ActiveRecord::Migration
  def migrate(direction)
    super
    Setting.create!(category_id: nil) if direction == :up
  end

  def change
    create_table :settings do |t|
      t.integer :user_id

      t.timestamps
    end
    add_index :settings, :user_id, :unique => true
  end
end
```

```rb:setting.rb
class Setting < ActiveRecord::Base
  belongs_to :user
end
```

```mysql:
2.1.5 :001 > Setting.create(user_id: nil)
   (0.2ms)  BEGIN
  SQL (0.6ms)  INSERT INTO `settings` (`created_at`, `updated_at`) VALUES ('2015-11-12 13:28:57', '2015-11-12 13:28:57')
   (1.0ms)  COMMIT
 => #<Setting id: 2, user_id: nil, created_at: "2015-11-12 04:28:57", updated_at: "2015-11-12 04:28:57">
```

NULLのレコードはデフォルト設定として扱うなど、1件しか持ちたくない場合はバリデーションで実現できる。

```rb:setting.rb
class Setting < ActiveRecord::Base
  belongs_to :user
  validates :user_id, uniqueness: true
end
```

```mysql:
2.1.5 :001 > Setting.create(user_id: nil)
   (0.1ms)  BEGIN
  Setting Exists (0.3ms)  SELECT  1 AS one FROM `settings`  WHERE `settings`.`user_id` IS NULL LIMIT 1
   (0.2ms)  ROLLBACK
 => #<Setting id: nil, user_id: nil, created_at: nil, updated_at: nil>
```
brilloこっそりとAOSP化してるので見てみた

# はじめに

何気に [AOSP](https://android.googlesource.com/) を見ていたら、 [brillo](https://developers.google.com/brillo/) のmanifestやbranchが生えていたので確認してみた。

# Let's repo sync

```
$ repo init -u https://android.googlesource.com/brillo/manifest -b brillo-m7-dev
```
で行けます。

# manifest.xmlをmashmallowと比較してみる
## 追加されている(brillo固有の)git
```
+device/generic/brillo
+kernel/common
+platform/build/blueprint
+platform/build/kati
+platform/build/soong
+platform/external/avahi
+platform/external/c-ares
+platform/external/cros/system_api
+platform/external/curl
+platform/external/dbus
+platform/external/dbus-binding-generator
+platform/external/dhcpcd-6.8.2
+platform/external/fec
+platform/external/gentoo/integration
+platform/external/gentoo/overlays/gentoo
+platform/external/gentoo/portage
+platform/external/gmock
+platform/external/google-breakpad
+platform/external/iw
+platform/external/libbrillo
+platform/external/libcap
+platform/external/libchrome
+platform/external/libdaemon
+platform/external/libdivsufsort
+platform/external/libevent
+platform/external/libmicrohttpd
+platform/external/libunwind_llvm
+platform/external/libweave
+platform/external/minijail
+platform/external/modp_b64
+platform/external/rootdev
+platform/external/tlsdate
+platform/external/xmlrpcpp
+platform/prebuilts/android-emulator
+platform/prebuilts/clang/host/linux-x86
+platform/prebuilts/gdb/linux-x86
+platform/prebuilts/go/darwin-x86
+platform/prebuilts/go/linux-x86
+platform/prebuilts/ninja/darwin-x86
+platform/prebuilts/ninja/linux-x86
+platform/prebuilts/qemu-kernel
+platform/system/attestation
+platform/system/ca-certificates
+platform/system/connectivity/apmanager
+platform/system/connectivity/shill
+platform/system/firewalld
+platform/system/nativepower
+platform/system/tools/aidl
+platform/system/tpm_manager
+platform/system/trunks
+platform/system/update_engine
+platform/system/weaved
+platform/system/webservd
+platform/tools/bdk
+product/google/common
+product/google/example-ledflasher
```
これからそれぞれを分析していきますね。
MonacaでgoogleMap設定 (iOSビルド版)

# 問題

[Monaca](https://monaca.io/)と[mobile backend](http://mb.cloud.nifty.com)でアプリ開発中、地図を表示するためにGoogle MapのAPIを利用していますが、DebugアプリやAndroidでは問題なく表示していますが、なぜかiOSでビルドすると上手く表示しません。


# 原因

原因は設定ではgoogle mapのドメインが許可されていないことです。
monacaが採用したPhoneGap/Cordova の仕様により、セキュリティを守るため、外のドメインアクセスはホワイトリスト登録必要があります。


# 解決

* 登録方法：

Monaca開発環境でのios/MonacaApp-Info.plistファイルを開き、以下追加
※一番上にある<dict>の直後に追加することをお勧めします。

```
<key>ExternalHosts</key>           
<string>*.googleapis.com</string>
```

# 参考

Phonegapの仕様について
http://docs.phonegap.com/en/1.9.0/guide_whitelist_index.md.html

monacaでのiOS設定について
http://docs.monaca.mobi/cur/ja/reference/config/ios_configuration/
OSXで使えるAppleScriptを使ったコマンド集

# はじめに

`~/.bashrc` や `~/.zshrc` に追記してお使いください。
当方Yosemiteにて動作確認してます。(El Capitan に早いとこ上げたい…)

いいネタがあれば後から追加していく予定です。コメント欄でも是非紹介してください。

# テクニック

## 引数の参照

一番オーソドックスな方法です。

```applescript
on run argv
    log item N of argv
end run
```

```bash:例
osascript -e '
    on run argv
        log "Hello, " & item 1 of argv & "."
    end run
' "$variable"
```

## 環境変数の参照

以下のシンタックスで利用出来るはずなんですが、手元では全く動作確認出来なかったのでこれは見送ります。

```applescript
system attribute "ATTRIBUTE_NAME"
```

## 埋め込む文字列のエスケープ

引数として渡せない事情がある場合はこちらを採用します。

### ダブルクオートリテラルの作成: `"string"`

AppleScriptでは文字列リテラルにダブルクオートしか使えません。
変数の置換機能では限界があるのでPerlを利用します。
また**bashとzshで`echo`の挙動が違う**ので、`-E`でbashに合わせます。

```bash
variable='"'$(echo -E "$variable" | perl -pe 's/(?=[\\"])/\\/g')'"'
```

![スクリーンショット 2015-11-16 1.35.19.png](https://qiita-image-store.s3.amazonaws.com/0/25060/ffca2db8-415b-1e92-7612-e505732fb4a8.png)

```bash:(参考)&#32;PHPのようにドル記号を解釈する言語向けのエスケープ
variable='"'$(echo -E "$variable" | perl -pe 's/(?=[\\"\$])/\\/g')'"'
```

### シングルクオートリテラルの作成: `'string'`

今回は使えませんが、参考までにこちらも掲載しておきます。

```bash
variable="'"$(echo -E "$variable" | perl -pe "s/'/'\"'\"'/g")"'"
```

## フルパスの取得

AppleScriptではファイル名を指定するとき相対パスを受け付けてくれません。
OSXには`realpath`が無いのでPerlを利用することになります。

```bash
# 単一引数
perl -MCwd -e 'print Cwd::abs_path(shift)' "$variable"
# 複数引数
perl -MCwd -e 'print Cwd::abs_path($_) for @ARGV' "$variable"
```

```shell-session:使用例
example@localhost:/bin$ variable='bash'
example@localhost:/bin$ perl -MCwd -e 'print Cwd::abs_path(shift)' "$variable"
/bin/bash
```

# コマンド

## ターミナルプロファイルの変更

```bash
termprf() {
    osascript -e '
        on run argv
            if exists (window 1 of application "Terminal") then
                tell application "Terminal"
                    set current settings of window 1 to settings set (item 1 of argv)
                end tell
            end if
        end run
    ' "$1"
}
```

```shell-session:使用例
example@localhost:~$ termprf homebrew
```

## 壁紙の変更

```bash
chwall() {
    osascript -e '
        on run argv
            tell application "Finder" to set desktop picture to POSIX file (item 1 of argv)
        end run
    ' "$(perl -MCwd -e 'print Cwd::abs_path(shift)' "$1")"
}
```

```shell-session:使用例
example@localhost:~/Pictures/淫夢$ chwall ご満悦先輩.png
```
Macからサーバへ鍵認証でssh接続


いつも手順を忘れるのでメモ。

鍵がない場合はssh-keygenで作成しておいてください。

```
$ ssh-keygen -t rsa
```

接続するサーバに公開鍵(id_rsa.pub)をscpします。

```
$ scp ~/.ssh/id_rsa.pub [user_name]@[server_host]:~/
```

サーバにログインしてauthorized_keysを作成します。

```
$ ssh [user_name]@[server_host]
# ここからサーバでの作業
$ mkdir ~/.ssh
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ rm ~/id_rsa.pub
$ logout
```

これで、鍵で接続できるようになりました。  
鍵にパスワードを設定しなければ、何も入力せずに接続できます。

```
$ ssh [user_name]@[server_host]
```
【メモ】Maven環境で突然Deployできなくなって動かない時の対処

FAIL - Deployed application at context path うんちゃらかんちゃら but context failed to start 

突然これを言われて、原因不明だったので、新規にmavenプロジェクトを作り

移植したらすぐに解。

ソースコードが間違っているという訳でもなく、プロジェクトの設定ファイルが壊れたのが原因かと思います。


今回は解決してしまいましたが、企業の本番環境だとそうは行かないと思います、こういった時にどこを見てどう改善していくのかアドバイスをいただければと思います。
スマホからMacに立てたgulp-webserverに接続する

[gulp-webserver](https://www.npmjs.com/package/gulp-webserver)はgulpから簡易的なwebserverを立ち上げるgulp-plugin
live reload機能等もあり開発中は大変お世話になっている（詳しくは[こちら](http://qiita.com/oreo3@github/items/8b3bff9aed7b10ebe757)）

開発ではMacを使っていて、Macから確認する分にはいいのだが、やはり実機で確認したい

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
  </head>
  <body>
    <p>こんにちは、世界</p>
  </body>
</html>
```

（Macからは簡単に確認できる）
<img width="225" alt="Macから" src="https://qiita-image-store.s3.amazonaws.com/0/90613/fdf70fae-3a70-e244-7153-f1285843df5b.png" style="border:solid 1px #000;">

同じWi-Fi環境に接続できれば話は早いのだが、僕の環境ではそれは叶わなかったので
Macのインターネット共有機能を使って実現する

### Mac側の設定
1. システム環境設定の共有からインターネット共有をONに
<img width="738" alt="インターネット共有" src="https://qiita-image-store.s3.amazonaws.com/0/90613/16dce301-d8f9-2230-c7b0-87a7736982f0.png">

1. システム環境設定のネットワークからIPアドレスをメモ
<img width="691" alt="IPの確認" src="https://qiita-image-store.s3.amazonaws.com/0/90613/11437e02-b535-d3c0-4976-88bfd2e92384.png">


1. gulp-webserverのオプションでhostに'0.0.0.0'を指定

     ```js:gulpfile.js
     var gulp = require("gulp");
     var webserver = require("gulp-webserver");
     
     gulp.task('webserver', function() {
         return gulp.src('sample')
             .pipe(webserver({
                 host: '0.0.0.0', // gulp-webserverのオプションでhostに'0.0.0.0'を指定
                 livereload: true,
                 open: true
             }));
     });
     ```

あとはいつも通り起動

```bash
$ gulp webserver
[11:21:21] Using gulpfile gulpfile.js
[11:21:21] Starting 'webserver'...
[11:21:22] Webserver started at http://0.0.0.0:8000
[11:21:22] Finished 'webserver' after 249 ms
```

### iPhoneから確認 
1. 共有中のインターネットに接続
<img width="661" alt="インターネット共有" src="https://qiita-image-store.s3.amazonaws.com/0/90613/2e7fa9a2-2bf6-2bb9-b5c5-f52f67c58ece.png">

2. ブラウザから先ほどメモったIPにアクセス
（今回なら``http://169.254.200.8:8000/``にアクセス）
<img width="658" alt="おめでとう" src="https://qiita-image-store.s3.amazonaws.com/0/90613/fdb26eca-1c52-69e4-d68c-db5daca49643.png">
やったぜ！Androidでもなんでも繋げば見れた:sushi:
live reloadも効くのですばらしい

### 所感
終わってみれば設定もやることもめっちゃ簡単だったが、ここまでたどり着くのに相当苦労してしまった
というかそもそも[gulp-webserver](https://www.npmjs.com/package/gulp-webserver)のページに書いてた
> Why can't I reach the server from the network?
Solution: Set 0.0.0.0 as host option.

ただネットワーク周りのことは結局全然理解できてないので勉強しなきゃなーと思う
python > udp > echo server 

```txt:動作確認
CentOS 6.5
```

Unity(C#)などでも作ったがUDPポートでのエコーサーバーのpython版。
(作ったのは [Qiita検索](http://qiita.com/search?utf8=%E2%9C%93&q=user%3A7of9+%22echo+server%22&sort=rel))

ポート6000へ送ったものが返される。

```udpEcho.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

s.bind(('',6000))
s.setblocking(0)
data =''
address = ''
while True:
	try:
		data,address = s.recvfrom(120)
	except socket.error:
		pass
	else:
		print "from:", address
		print "recvd:", data
		s.sendto("recvd:" + data, address)
```

```txt:結果
$ python udpEcho.py
from: ('192.168.124.132', 55989)
recvd: aaaaa
```

UDP送信元には`recvd:aaaaa`などの文字がエコーバックされる。
gulp + browser-syncを使って自動で納品ファイルを生成したい

1. ソースフォルダ内のファイルを編集
2. sassのコンパイルやHTML/JSのコード圧縮しつつ、ブラウザシンク＆リロード
3. 階層構造を維持したまま納品用ディレクトリに生成
4. 随時ブラウザで確認しつつ、オッケーならディレクトリごと納品

ってな事をしたくてgulpを使ってみました。



```gulpfile.js
//プラグインの読み込み
var gulp			= require("gulp");
var imageMin		= require("gulp-imagemin");
var htmlMin			= require("gulp-htmlmin")
var sass			= require("gulp-sass");
var minifyCss		= require('gulp-minify-css');
var uglify			= require('gulp-uglify');
var browserSync		= require('browser-sync').create();

// ブラウザ同期
gulp.task('browser-sync', function() {
    browserSync.init({
		server: {
            baseDir: "./dest"
        },
		open: false//これがないとOSによっては、エラーで止まる場合がある
    });
    // 監視対象のファイルを指定
    gulp.watch('./dest/**/*.html', browserSync.reload);
    gulp.watch('./dest/**/*.css', browserSync.reload);
    gulp.watch('./dest/**/*.js', browserSync.reload);
});

//scss
gulp.task('scss', function () {
    gulp.src(["./src/**/*.scss"], { base: 'src' })
	.pipe(sass())
    .pipe(gulp.dest('./dest'));
});

// jsの圧縮
gulp.task('js', function () {
    gulp.src(["./src/**/*.js"], { base: 'src' })
    .pipe(uglify({preserveComments: 'some'}))
    .pipe(gulp.dest('./dest'));
});

// htmlの圧縮
gulp.task('html', function () {
    gulp.src(["./src/**/*.html"], { base: 'src' })
    .pipe(htmlMin({collapseWhitespace: true}))
    .pipe(gulp.dest('./dest'));
});

// 毎回実行して欲しい処理
gulp.task('watch',function(){
	gulp.watch([
					"./src/**/*.jpg" ,
					"./src/**/*.png" ,
					"./src/**/*.gif"
				], ['img']);
	gulp.watch('./src/**/*.html', ['html']);
	gulp.watch('./src/**/*.scss', ['scss']);
	gulp.watch('./src/**/*.js', ['js']);
});

gulp.task("default",["browser-sync","watch"]);
```

一応望み通りの挙動はしているものの、課題としては

- 画像圧縮のタイミングはここで良いのか
- 処理の流れが煩雑じゃないか
- CSS圧縮しとらんやないかいっ！

があります・・・。(；´Д｀)
linux > iptables > UDP > ポート6000への通信とその応答を通す

```txt:動作確認
CentOS 6.5
```

ポート6000に来るUDP通信を通して、その応答も通したい。

参考: [SO](http://stackoverflow.com/questions/28945114/iptables-sport-vs-dport-input-vs-output)

`/etc/sysconfig/iptables`に以下を加える。

```
# for line monitor UDP
-A INPUT -p udp --dport 6000 -j ACCEPT
-A OUTPUT -p udp --dport 6000 -j ACCEPT
```

```
# service iptables restart
```
論理削除とユニークキー制約の両立

# 概要

データベーステーブルの物理設計を行うとき、論理削除とユニークキー制約を両立させるための TIPS です。

## 基本形

``` sql
create table user (
    id int not null,
    email varchar(40) not null,
    password_sha256 varchar(64) not null,
    removed int not null default 0, -- 論理削除カラム
    constraint pk primary key (id)
);
```

メアドとパスワードでログインできる user テーブルを例とします。
removed = 0 が有効なレコードです。
退会時には removed = 1 に更新します。

``` sql
-- 入会
insert into user (id, email, password_sha256)
  values (1, 'foo@example.com', '**dummy**');

-- ログイン removed = 0
select * from user where removed = 0 and email = 'foo@example.com';

-- 退会 removed = 1 で更新
update user set removed = 1 where id = 1;
```

## email にユニークキー制約を付ける

``` sql
drop table user;
create table user (
    id int not null,
    email varchar(40) not null,
    password_sha256 varchar(64) not null,
    removed int not null default 0, -- 論理削除カラム
    constraint pk primary key (id),
    constraint uk_email unique key (email) -- ユニークキー制約
);
```

email にユニークキー制約をつけてしまうと、一度退会した会員が同じメアドで再度入会することができなくなってしまいます。

``` sql
-- 入会
insert into user (id, email, password_sha256)
  values (1, 'foo@example.com', '**dummy**');

-- ログイン removed = 0
select * from user where removed = 0 and email = 'foo@example.com';

-- 退会 removed = 1 で更新
update user set removed = 1 where id = 1;

-- 再入会
insert into user (id, email, password_sha256)
  values (2, 'foo@example.com', '**dummy**'); -- 重複エラー！
```

## そこで

``` sql
drop table user;
create table user (
    id int not null,
    email varchar(40) not null,
    password_sha256 varchar(64) not null,
    removed int not null default 0, -- 論理削除カラム
    constraint pk primary key (id),
    constraint uk_email unique key (email, removed) -- removed を含めたユニークキー制約
);
```

email と removed の複合ユニークキー制約にします。
退会時には removed = 1 ではなく、removed = id で更新するのがキモです。

``` sql
-- 入会
insert into user (id, email, password_sha256)
  values (1, 'foo@example.com', '**dummy**');

-- ログイン removed = 0
select * from user where removed = 0 and email = 'foo@example.com';

-- 退会 removed = id で更新
update user set removed = id where id = 1;

-- 再入会
insert into user (id, email, password_sha256)
  values (2, 'foo@example.com', '**dummy**'); -- 成功
```

この仕組みなら何度でも同じメアドで入退会を繰り返すことが可能です。

```
+----+-----------------+-----------------+---------+
| id | email           | password_sha256 | removed |
+----+-----------------+-----------------+---------+
|  1 | foo@example.com | **dummy**       |       1 |
|  2 | foo@example.com | **dummy**       |       2 |
|  3 | foo@example.com | **dummy**       |       0 | ← このレコードのみが有効
+----+-----------------+-----------------+---------+
```

# データベース

例で使用した sql は mysql でも postgresql でも動作するようにしましたが、mysql なら id は auto_increment を使うと良いでしょう。

なおこの記事は http://blog.utils.jp/2009/07/blog-post.html の書き直しとなります。
自分の中で、どんなテストを書いてどんなテストは書いていないのかをdumpしてみた


# 前提

こんな状況下で開発をしている自分個人の考え方。

- 新規サービスの立ち上げ
- プロジェクト内でエンジニアは自分一人
- iOSクライアントのみのサービス
- サーバサイド(Rails)はAPIがメイン
- 早ければ3ヶ月くらいでサービスを継続するかどうかの判断のタイミングがくる

# 考え方

上記の前提なので

1. 一人で全部作らないといけないから頑張り過ぎない事の方が大事
2. でも、まったくテスト書かないのは開発効率に響くので程よく書く
	- テストがまったくないコードは怖すぎるし…
3. だから、カバレッジとかからは目を背けよう(笑)

と考えている。

経験を積んでいけば、2の「程よく」の練度が上がるだろうと楽観視はしている。

# サーバサイド(Rails)について

使っているのは、`rspec`。

## API

1. 正常系のテストを必ず書く
	- `Request spec`
	- `autodoc` と `weak_parameters` を使えば、正常系のAPIドキュメントが出来上がる
	- ドキュメントをモチベーションにテストを書く
2. 異常系については起こると怖いものは書く
	- 「他人のコメントを消そうとしたときにエラーになるテスト」とか
	- それ以外のケースは自分が気になったら書く
3. モデルのテストはほぼ書かない
	- 自分が不安にならない限りは書かない
4. ライブラリ系
	- 自分が不安にならない限りは書かない

## Webページ

そもそも、Webページを設置するケースが少ないのであまり考えていない。

会員登録とか退会とか重要な機能については書こうかなぁとは思っている。

# クライアントサイド(iOS/Swift)のテスト

基本的には書いていない。理由は、

- API側のテストがしっかりしていると割と安定したものが作れている
- UIのテストはこのフェーズだと変更コストの方がでかいと感じている
- そもそも、書く実力がない…
- 手が回らない…

という感じ。あまりポジティブな理由ではない気はしている。
git > commit message > eval: Extract `find_var_ht_dict` from ... / FS-Cache: Don't override netfs's... > ファイル名 / パッケージ名 の1行目への記載例

gitのコミットメッセージの書き方で、パッケージ名を記載する方法が色々使われている例がどこかにあったが、URLを失念した。

検索していて、パッケージでなくファイル名を入れている例があった。

https://github.com/neovim/neovim/commit/ba1f3272003d7dceed572490b33c76deeee8f126
> eval: Extract `find_var_ht_dict` from ...

上記のevalは eval.cのことだろう。

探したかったのはこれではなく、PackageAというのがあった時

> PackageA: modify ...

や

> [PackageA] modify ...

などの書き方。

- パッケージ / モジュール
- 主に変更したファイル名

など、どういうメッセージを1行目に入れておくか、またその書き方は何がいいのかは試行錯誤中。

<hr>
[linuxのコミット](https://github.com/torvalds/linux/commit/b130ed5998e62879a66bad08931a2b5e832da95c)
> FS-Cache: Don't override netfs's...

上記のコミットは `fs/fscache/netfs.c`の変更をしている。
`FS-Cache`はパッケージ（モジュール）名のようだ。
VisualStudioにて、デザイナーを開いただけなのにコードが実行されてしまうとお嘆きの貴兄に

WindowsFormにてFormを継承しているとき、フォームデザイナを開くと継承元のコンストラクタが実行される。
（どうやらこれはVisualStudioの仕様である）

このとき、Settings.SettingsとかApp.Configを入力してくれるわけではないし、デバッグも当然効かないのでなんだかなー・・・・

こんなときは以下の処理を継承元のコンストラクタへ追記します。

If DesignMode then Exit Sub

当然ですがクラス内変数にも気をつけましょう。

Public Class BaseForm

	Protected userInfo as new cUserInfo ← コレ
webに触れるなら知っておきたいCSSの優先度

# 知っておきたいCSSの優先度

## スタイルの優先度のルール

読み込んだHTML内のメディア指定のCSS
↓ない場合
読み込んだHTML内のもの->ブラウザにユーザーが設定したもの->ブラウザデフォルト
※HTML内でインライン指定されていれば以下を再優先
↓上記の中で
セレクタの優先度を計算する
↓重なった場合
後から読み込んだものを優先


## セレクタの優先度の計算方法

セレクタには優先順位があり、点数を加算した結果、高得点のものが適用される。
点数が同じならば、後に書いたスタイルが優先される。

**※但し桁を超えて適用されることはない（2015/11/13追記）**
**コメントに頂いたようにバージョン的に考えたほうが理解しやすいかもしれません**
 
点数計算のやり方を以下に記述する

以下の点数を加算していく

|セレクタ     |例             |点数 |
|:---------|--------------|-----|
|全称セレクタ	|*	           |0    |
|タイプセレクタ	|p	           |1    |
|擬似要素	|:first-child  |1    |
|-|-|超えられない壁|
|擬似クラス	|[type="text"] |10   |
|classセレクタ	|.fugafuga	   |10   |
|-|-|超えられない壁|
|idセレクタ	|#piyopiyo	   |100  |
|-|-|超えられない壁|
|要素に直書き	|style=""	   |1000 |


計算例


| 例 | 計算 | 合計点 |
|------------------------|-------------------------------------------------------|--------|
| style="" | 1000(style属性) | 1000点 |
| #hoge | 100(ID属性) | 100点 |
| .a.b.c.d.e.f.g.h.i.j.k |  10(クラス属性)  * 11 | 110点 ※（2015/11/13追記）クラス属性をいくら集めてもID属性の１００点を超えられない |
| li.color.label | 1(要素名) + 10(クラス属性)   + 10(クラス属性) | 21点 |
| table tr td.color | 1(要素名) + 1(要素名) +   1(要素名) + 10(クラス属性) | 13点 |
| div +   *[href$="com"] | 1(要素名) + 0(全称セレクタ),+ 10(擬似クラス) | 11点 |
| h1 div + span | 1(要素名) + 1(要素名) +   1(要素名) + 10(クラス属性) | 3点 |
| li:last-child | 1(要素名) + 1(擬似要素) | 2点 |
| li:last-child | 1(要素名) + 1(擬似要素) | 2点 |


参考：[ほんっとにはじめての HTML5](http://honttoni.blog74.fc2.com/blog-entry-218.html)
整数numの約数を一覧とその数。


```javascript
function divisor(num){
	var results = [];
	for(var i=1; i<=num; i++) {
		if( (num%i == 0) ) {
			results.push(i);
		}
	}
	return results;
}

// テスト
r = divisor(1024);
console.log(r);
// [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

consooe.log(r.length);
// 11
```

http://newtgecko.blog.fc2.com/blog-entry-187.html
【AWS】Spot Instanceでハマった


前回の記事

>http://qiita.com/3utama/items/b730acf6a5e34a53c299

で、スポットインスタンス作成の自動化をしたんですけど、その後ハマったことを書いていきます。

# T2系はスポットインスタンスできない
なるべく安く！安く！って思いまして、t2.microのスポットインスタンスを作成しようとしたらリクエストがいつになってもopenのまま・・・

調べてみたら有りました。

>http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/t2-instances.html

この記事の

>T2 インスタンスはオンデマンドまたはリザーブドインスタンスとして使用できますが、スポットインスタンスとして購入することはできません。 詳細については、「Amazon EC2 インスタンス購入オプション」を参照してください。

・・・そうですか。
そこで、Amazon EC2 インスタンス購入オプションを参照。

>http://aws.amazon.com/jp/ec2/purchasing-options/

そこから

>スポットインスタンスの詳細については、こちらをご覧ください。

で

>http://aws.amazon.com/jp/ec2/spot/

の

>現在の価格については、スポット価格のページでご確認ください。

そして結局

>http://aws.amazon.com/jp/ec2/spot/pricing/

なげー。
そこで調べると、一番安のがt1.micro！・・・って、あれ？だいぶ前に廃止されたような・・・
でもでも、一覧に乗っているので問題ないよね！ってことでt1.microで作成してみました。

するとこんなエラーが・・・

>A client error (InvalidParameterCombination) occurred when calling the RequestSpotInstances operation: Non-Windows instances with a virtualization type of 'hvm' are currently not supported for this instance type.

要するにサポート対象外ですって・・・

公式サイトやマネージメントコンソールのPricing Historyって更新されてないのかな。
最新のAMIに対応した公式なスポットインスタンスの料金表ってどこにあるのだろうか・・・

**記事訂正**
*t1.microがspot対象外と記述しましたが、大間違いの知識不足でした・・・申し訳ありません。*
*エラーが出た原因はVirtualization typeがHVMのAMIからPVインスタンスを作成しようとしていたからのようです。*
*旧世代のインスタンスを作成したけりゃ元となるAMIも旧世代のAMIを選択しろや！っちゅことですな。*
*なので料金表も公式ページが最新ということでした。*
@understeer さん、コメントありがとうございました！
aws ruby v2について調べてみた


ec2について
------
公式サイト:http://docs.aws.amazon.com/sdkforruby/api/Aws/EC2/Client.html
まず、ec2を触るオブジェクトをインスタンス化する必要があるのだか、
それは、以下のようにする。

```ruby
ec2 = Aws::EC2::Client.new(
  region: region_name,
  credentials: credentials,
  # ...
)
```

regionはリージョン名を設定し、credentialsは認証情報を設定する。

regionを設定するには２つ方法がある。

* ENV['AWS_REGION']
* Aws.config[:region]

region名は、http://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html
を参考にしてほしい。
一応、載せておく。

Amazon API Gateway

|リージョン名	|リージョン	|エンドポイント	|プロトコル|
|-------|--------|---------|---------|
|アジアパシフィック（東京）|	ap-northeast-1	|apigateway.ap-northeast-1.amazonaws.com	|HTTPS|
|欧州（アイルランド）	|eu-west-1	|apigateway.eu-west-1.amazonaws.com	|HTTPS|
|US East (N. Virginia)	|us-east-1	|apigateway.us-east-1.amazonaws.com	|HTTPS|
|米国西部（オレゴン）	|us-west-2	|apigateway.us-west-2.amazonaws.com	|HTTPS|


credentialsを設定方法

* ENV['AWS_ACCESS_KEY_ID'] and ENV['AWS_SECRET_ACCESS_KEY'] を使用できるように設定
* Aws.config[:credentials] に記述
* ~/.aws/credentials に記述
* EC2 からsdkを使う

ec2Clientオブジェクトに何らかのメソッドを使うと、情報が取得出来たり、ec2を起動したりすることができる。

メソッド名は、[動詞]_[対象の名称] という感じで綺麗に整理されている。

例えば、
describe.... というメソッドを使うと、ec2に関する情報が取得できる。

```#describe_reserved_instances(options = {})``` を使うと、現在リソースを借りているインスタンスに関する情報が取得出来たりする。

```ruby
resp = client.describe_reserved_instances({
  dry_run: true,
  reserved_instances_ids: ["String"],
  filters: [
    {
      name: "String",
      values: ["String"],
    },
  ],
  offering_type: "Heavy Utilization", # accepts Heavy Utilization, Medium Utilization, Light Utilization, No Upfront, Partial Upfront, All Upfront
})
```

のように、フィルターの条件など指定することができる。
Chromeのデフォルトの検索期間を過去一年にする



Chromeでググるときに期間を一年程度にすることがよくあるが、毎回やるのも面倒なのでデフォルトにする方法をググッた。

1. Chromeの設定を開く
1. `Settings` > `Search` > `Manage search engines...`をクリックする
![Screen Shot 2015-11-11 at 5.09.11 PM.png](https://qiita-image-store.s3.amazonaws.com/0/281/2b479478-af33-2999-9d8e-0d3172ed35a4.png "Screen Shot 2015-11-11 at 5.09.11 PM.png")
1. 以下のようなGoogleのエントリがあるのを確認する
![Screen Shot 2015-11-11 at 5.08.29 PM.png](https://qiita-image-store.s3.amazonaws.com/0/281/edc529a3-20b0-3de5-3f33-80331241ad07.png "Screen Shot 2015-11-11 at 5.08.29 PM.png")
1. URLのクエリに`tbs=qdr:y`を含めたエントリを新規追加してデフォルトにする。もちろんもとのオプションをコピーして加えてもよい
![Screen Shot 2015-11-11 at 5.08.40 PM.png](https://qiita-image-store.s3.amazonaws.com/0/281/bfd0970b-9ce3-f12f-6bbc-9a07eea35f20.png "Screen Shot 2015-11-11 at 5.08.40 PM.png")
1. 新規タブで検索して過去一年の設定が有効になっているのを確認する
![Screen Shot 2015-11-11 at 5.14.11 PM.png](https://qiita-image-store.s3.amazonaws.com/0/281/c5d2d35c-6cd0-6eac-6867-f1254a9e0f6b.png "Screen Shot 2015-11-11 at 5.14.11 PM.png")

- そもそもどういうオプションを追加できるのか、は実際の検索画面でいじってURLを眺めればわかる（ドキュメントで保証された機能なのかどうかは調べてない）
- 「一年以上前の情報は（技術情報やニュースだけでなく全般に）いらないぜ」っていうスタンスは結構ラジカルで実際には不便も発生しそう（重要だが古い情報にリーチできない）だが使用感を見てみたい
- Chrome拡張もあった。
	- http://ground-sesame.hatenablog.jp/entry/2014/02/22/093102
タプルの書き方をサクッと変える

## (=>) = (,)

ElmのMLのとあるスレで貼られてたコードが初見で意味がわからず、なかなかググりにくい代物だった

- [Struggling with Signals - Google グループ](https://groups.google.com/forum/#!topic/elm-discuss/bLjRSI_sb6U)
- [command_event2.elm](https://gist.github.com/tcoopman/8a5767c88529c94e7b51)

こんな感じ

```elm
-- VIEW

(=>) = (,)　-- こいつがわからん


view : Signal.Address Command -> Model -> Html
view address model =
  div [ style [ "width" => "200px" ] ]
    [ h2 [headerStyle] [text model.topic]
    , div [imgStyle model.gifUrl] []
    , button [ onClick address RequestMore ] [ text "More Please!" ]
    , button [ onClick address ChangeSubject ] [ text "ChangeSubject!" ]
    ]


headerStyle : Attribute
headerStyle =
  style
    [ "width" => "200px"
    , "text-align" => "center"
    ]


imgStyle : String -> Attribute
imgStyle url =
  style
    [ "display" => "inline-block"
    , "width" => "200px"
    , "height" => "200px"
    , "background-position" => "center center"
    , "background-size" => "cover"
    , "background-image" => ("url('" ++ url ++ "')")
    ]
```

少し手元で動かして、成程できた

## (=>) = (,)は、タプル（がずらずら続くやつ）を書きやすくしてくれる

普通に書くと

```
imgStyle url =
  style
    [ ("display", "inline-block")
    , ("width", "200px")
    , ("height", "200px")|-|
    , ("background-position", "center center")
    , ("background-size", "cover")
    , ("background-image", ("url('" ++ url ++ "')"))
    ]
```

となる所を

```
imgStyle url =
  style
    [ "display" => "inline-block"
    , "width" => "200px"
    , "height" => "200px"
    , "background-position" => "center center"
    , "background-size" => "cover"
    , "background-image" => ("url('" ++ url ++ "')")
    ]
```

と書けるようになる。

- before:　`("display", "inline-block")`
- after:   ` "display" => "inline-block"`

- 丸括弧とカンマを毎回うつのがだるい人にはいいかも
- 自分としてはすぐに飛びつかなさそうだが、ちょいちょい試してみたい

## これだけでなんでこんな風に書ける？

一通り把握してみると、マジックとかでなく、すごいシンプルな話だった

- `("display", "inline-block")`
    - これがタプルの普通よくみる書きかた
- 実は`(,) "display" "inline-block"`とも書ける
    - [Elm Syntax](http://elm-lang.org/docs/syntax)
    - 関数`(,)`をつかってタプルを生成してる、ということ
    - こっちがElm本来（？）の書きかた
    - `("hoge","fuga")`は別途提供されたショートハンド、という位置付け
- ` (=>) = (,)`はさらに自分でショートハンドを追加してる、と位置付けれる
- さらに、`=>`を使うと、タプルがメンバーのリストの中でカンマ`,`はリストのメンバーの区切りとしてのみ使用
    - てことで、`()`が外せる

次のように１から5のように式を変形できるということか、と理解した

```elm
-- 1
[
  ("font-size", "20px")
  ("display", "inline-block")
]

-- 2
[
  (,) "font-size" "20px",
  (,) "display" "inline-block"
]

-- 3 (=>) = (,)　追記後

[
  (=>) "font-size" "20px",
  (=>) "display" "inline-block"
]
--4  (=>) = (,)　追記後
[
  ("font-size" => "20px"),
  ("display" => "inline-block")
]

--5  (=>) = (,)　追記後
[
  "font-size" => "20px",
  "display" => "inline-block"
]
```

タプルの要素の数が３つなら関数は`(,)`でなく`(,,)`になり、４つになれば、...という感じになるので、好みがわかれるだろうけど、これを可能にする仕組みの片鱗に触れることができたよかった
phpenv+php-buildとphpbrewの比較

手元で任意のバージョンのPHPをビルドして使い分けるプロジェクトとして、phpenv+php-buildとphpbrewの2つが有名かと思います。僕はphpenv+php-build派なんですが、phpbrewを少しだけ触ってみたので、両者の違いをまとめてみます。

## phpenv+php-buildの良いところ

* bashスクリプトで書かれているので多くの環境で前準備なしで動く
* シェルの補完をサポートしている
    * `phpenv install [TAB]`で候補が出てくる
* 最近サブコマンドとしてupdateとuninstallが実装された
    * 気軽さの意味でphpbrewに追いついた感
* PHPのalphaやbetaやRCのビルドレシピを配っている
    * リリース後1日から2日くらいのうちに降ってくる
* 最新snapshotのビルドレシピもある
    * 最新機能がすぐ試せる
* 独自パッチを適用する指定をレシピに書ける
    * 古いPHPのビルドに必要なパッチがphp-buildに含まれている
* メジャーどころの拡張モジュールは標準で有効
* XdebugやOPcacheあたりをデフォルトで入れてくる
* 広く使われている
  * Travis CIやCircleCIなどで複数PHPバージョンを提供するのに使われている

## phpenv+php-buildのイマイチなところ

* phpenvの実装が複数あって、どれを使ったらいいか初見ではわからない
* CHH/phpenvを使うとrbenvとコンフリクトする人が多い
    * 内部的にrbenvを使っているため
    * うまく.bashrcや.zshrcに記述すればコンフリクトしない気がするけど…
    * 絶対にrbenvとコンフリクトしないよう改造したphpenvもある
* phpenvをインストールした後、改めてphp-buildをインストールする必要があって面倒
* コマンドライン指定だけではconfigureオプションの変更ができず、レシピファイルを書き換える必要がある
* レシピを記述するdefinitionファイルの文法が独特で若干ハードルが高い

## phpbrewの良いところ

* 1コマンドで動くのでインストールが簡単
* configureオプションの変更がコマンドラインから簡単に出来る
* メジャーどころの拡張モジュールは標準で有効
* `$HOME/.phpbrew`以下のディレクトリ構成がシンプルでわかりやすい
* シェルの補完をサポートしている
    * `phpbrew install [TAB]`で候補が出てくる

## phpbrewのイマイチなところ

* phpbrew自体の動作に、自身がビルドしたのとは別のPHPが必要
* alphaやbetaやRCのビルドレシピを配っていない
* 最新snapshotのビルドレシピもない
* XdebugやOPcacheあたりは明示的に入れないと入らない
    * `phpbrew install 5.5.5 +opcache`などとする
    * 最近のPHPならOPcacheをデフォルトで有効にしておいて欲しい
    * PHPバージョンごとにXdebugの適切なバージョンが違うので自分で選ぶのは案外面倒
* configureオプション違いで同一バージョンを複数共存させたい場合のやり方がわからない

## 参考

- [phpenvやphpbrewの雑な比較 - Qiita](http://qiita.com/Hiraku/items/61eeec22f78e9a6217ee)
Xcode7.1にアップデートしてAlcatrazが消えたら


## 概要

Xcodeを7.1にアップデートして、Alcatrazが消えたら・・・。

## 手順

* Xcodeを終了する。
* 下記のコマンドを実行する。

```
$ defaults delete com.apple.dt.Xcode DVTPlugInManagerNonApplePlugIns-Xcode-7.1
```

* Xcodeを起動する。※起動時に「Load Bundles」を選択する。
coding > #define DEBUG_PRINT > 関数マクロとして使われる例がある

`#define DEBUG_PRINT`
を#ifdefによる処理の切替のためのフラグ用のマクロとして使おうと考えたが、

http://stackoverflow.com/questions/1941307/c-debug-print-macros
にあるように関数マクロとして使う例もあるようだ。

かぶったら面倒なので違う名前のマクロとした。
SecKeyGeneratePairs in Swift


## SecKeyGeneratePair in Swift
Swiftで公開鍵と暗号鍵を作成してみました．

## Crypto.swift
```swift:Crypto.swift
import Foundation
import CoreFoundation
import Security

class Crypto {
    func test() {
        // generating key pair
        let keyPair: (publicKey: SecKey?, privateKey: SecKey?) = generateKeyPair()
        // calculate blocksize
        let blockSize: Int = SecKeyGetBlockSize(keyPair.publicKey!)

        // preparing for encryption
        let plainText: String = "sample text to be encrypted and decrypted"
        let plainTextData: [UInt8] = [UInt8](plainText.utf8)
        let plainTextDataLength: Int = plainText.characters.count
        var encryptedData: [UInt8] = [UInt8](count: Int(blockSize), repeatedValue: 0)
        var encryptedDataLength: Int = blockSize

        // encrypting
        let encryptOsStatus: OSStatus = SecKeyEncrypt(keyPair.publicKey!, SecPadding.PKCS1, plainTextData, plainTextDataLength, &encryptedData, &encryptedDataLength)
        if encryptOsStatus != noErr {
            print("Encryption Error")
            return;
        }

        // preparing for decryption
        var decryptedData: [UInt8] = [UInt8](count: Int(blockSize), repeatedValue: 0)
        var decryptedDataLength: Int = blockSize

        // decrypting
        let decryptOsStatus: OSStatus = SecKeyDecrypt(keyPair.privateKey!, SecPadding.PKCS1, encryptedData, encryptedDataLength, &decryptedData, &decryptedDataLength)
        if decryptOsStatus != noErr {
            print("Decryption Error")
            return;
        }

        // checking
        let text: NSString = NSString(bytes: &decryptedData, length: decryptedDataLength, encoding: NSUTF8StringEncoding)!
        if text.compare(plainText) == NSComparisonResult.OrderedSame {
            print("success")
        } else {
            print("failure")
        }
    }

    func generateKeyPair () -> (publicKey: SecKey?, privateKey: SecKey?) {
        let parameters: [String: AnyObject] = [
            kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
            kSecAttrKeySizeInBits as String: 2048
        ]
        var publicKey: SecKey?
        var privateKey: SecKey?
        let osStatus: OSStatus = SecKeyGeneratePair(parameters, &publicKey, &privateKey)
        switch osStatus {
        case noErr:
            return (publicKey, privateKey)
        default:
            // TODO: error handling
            return (nil, nil)
        }
    }
}

let crypto = Crypto()
crypto.test()

```

## 使い方
XCode Playground で動くはずです．
git > desktop.ini > フォルダアイコンを変更した時に自動生成

gitで管理しているC++ Builderプロジェクトにてdesktop.iniというファイルが突然出てきた。

http://soft1.jp/trouble/w/w045.html
> フォルダのアイコンを変更したりすると、そのフォルダ内に自動的に Desktop.ini というファイルが作成されることがあります。

たくさんあるフォルダからそのフォルダだけ目立たせるためフォルダアイコンを変更した時に生成されたようだ。

.gitignoreに入れておいてよさそう。
curlでJSONをPOSTする


# curlコマンドでPOST
-dでPOSTのBODYを指定。
なんとなくUserAgentにiPhoneやgzip要求もつけてみる。

```
curl -H 'Content-Type:application/json' -H 'User-Agent:iPhone' -H 'Accept-Encoding:gzip,deflate' -d "{"key":"val","key2":",val2"}" http://~~~~~~~~~~
```

# [おまけ]同じPOSTを何回もするShellスクリプト
URL、回数、POSTするJSONを引数に持ち、1秒間隔を空けながら複数回同様のPOSTをする。
色々変えて使うといいかも。

```shell
#!/bin/sh

# Usage: xxxxxx.sh url times json
#
# Arguments:
#   url         
#   times       
#   json        it MUST be surrounded single-quartations
#
# Example
#   sh xxxxxx.sh http://localhost:8080/webapi/user/XXXXX 10 '{"token":"xxxxx","version":"1.3"}'
#

URL=$1
TIMES=$2
JSON=$3

if [ -z "$URL" ]; then
   echo "no url"
   exit;
fi
if [ -z "$TIMES" ]; then
   echo "no times"
   exit;
fi
if [ -z "$JSON" ]; then
   echo "no json"
   exit;
fi

n=1
until [ $n -gt $TIMES ]
do
  curl -H 'Content-Type:application/json' -H 'User-Agent:iPhone' -d "$JSON" $URL
	n=$(( n+1 ))
  echo ""
  sleep 1s
done

```
word2013 > トリミングをするのに15分奮闘した

```txt:動作確認
Word 2013 on Windows 8.1
```

Wordのトリミングの仕方がさっぱりわからなかった。

以下のページが参考になったが、それでも「どのように領域を選択するか」がわかりにくい。
http://softoffice-word.com/word-shape/word57.html

どうやら以下のようだ。

- トリミング時に8つの黒ぽちが表示される。
- 黒ぽちからドラッグすると、選択領域が「取り除かれる」

ただし、黒ぽちのドラッグが結構シビアで、少しずれたらトリミングできない。

SkitchのトリミングのUIはいいと思う。見習ってほしい。
OS X EI Caption(10.11.1)でAWS CLIのインストールエラー

# AWS CLIのインストール

* AWSに書いてある通り、以下のコマンドインストールしてみる。

```
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py
sudo pip install awscli
```

* 最後の awscli のインストールでエラーが発生した。

# エラー内容

```
Installing collected packages: six, python-dateutil, docutils, botocore, awscli
  Found existing installation: six 1.4.1
    DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip/basecommand.py", line 211, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip/commands/install.py", line 311, in run
    root=options.root_path,
  File "/Library/Python/2.7/site-packages/pip/req/req_set.py", line 640, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip/req/req_install.py", line 716, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip/req/req_uninstall.py", line 125, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip/utils/__init__.py", line 315, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
    copy2(src, real_dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
    copystat(src, dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
    os.chflags(dst, st.st_flags)
OSError: [Errno 1] Operation not permitted: '/var/folders/bx/w4hfkn2n577485gxw5jzzb700000gn/T/pip-EQXcQd-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'
```

* 色々、ググってみたら、sixがすでに入っているのが原因みたいなので、以下のコマンドで対応した。

```
sudo pip install awscli --upgrade --ignore-installed six
```
windows > ファイル名 > 「何か(20151112).txt」 にしない理由

```txt:動作確認
Windows 8.1
Windows 7
```

##症状

`何か(20151112).txt`
のような日付を括弧付けとしたファイルを僕は作らない。

理由としては<kbd>ctrl</kbd>+<kbd>c</kbd>の後に２回以上<kbd>ctrl</kbd>+<kbd>v</kbd>した時に間違いをおかすから。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d7c397e7-fc11-5ae6-6e25-08f07b6504e7.png)

Windowsでは括弧内の数値を増加させる処理が入る。

`(20151112)`というのは単純な数値として扱われ`(20151113)`という名前に変換されてしまうということ。

##対策

ファイル名の後ろに日付をつけるなら`何か_20151112.txt`のような記載がいいかもしれない。
Monad Transformer

# Example Usage of Monad Transformer

The best tutorial of Monad Transformer is "Monad Transformers Step by Step" by Martin Grabmulle. The tutorial is available online. Code is available [here] (https://github.com/seckcoder/Haskell-Demo/blob/master/src/Eval.hs)

# Construct your own Monad Transformer

To better understand Monad Transformer, you can implement your own Monad Transformers. For example:

https://github.com/seckcoder/Haskell-Demo/blob/master/src/MonadTransformer/MTL.hs

# Problems of Monad Transformers:

http://blog.ezyang.com/2013/09/if-youre-using-lift-youre-doing-it-wrong-probably/

http://stackoverflow.com/questions/9054731/avoiding-lift-with-monad-transformers

## One Monad Transformer shows up multiple times in the monad stack

```hs

-- Multiple Environments
type Eval a = ReaderT Env (ReaderT Env Identity) a

eval (Val n) = do env1 <- ask
                  env2 <- lift ask -- To get the inner environment, you need to lift the computation here
                  -- ...

```


# Alternative to Monad Transformers

http://okmij.org/ftp/Haskell/extensible/
Grenning > 当たりの本

@ テスト駆動開発による組み込みプログラミング by James Grenning

久しぶりに僕的に当たりの本。
どのようにテストをするか/テストしやすい状態にするかというのが書かれている。

ここ数年で目を通したコーディング関連本の中で当たりとして残ったのは「Code Complete」「Readable Code」「Linuxネットワークプログラミングバイブル」の3冊くらいだったが、4冊目に入るかもしれない。

「レガシーコード改善ガイド」が途中から非常に読みにくく感じたが、そういう人に対してはこちらの本を読む方が時間を有意義に使えるかもしれない。
Qiita > 検索 > タグ検索には"-"があっても問題ない / 大文字小文字は区別しない

Qiita(web)での検索についての疑問に対して調べた。

Stackoverflowなどでは`memory-leak`のような`-`などの文字が入ったタグが使われている。
こういう文字が入った場合の検索はどうか気になった。

一方で`memoryLeak`とした場合は、Qiitaの検索では大文字小文字関係なしで検索できるのは知っている。

[tag:mymemo-ext](http://qiita.com/search?utf8=%E2%9C%93&q=tag%3Amymemo-ext&sort=rel) : 検索成功
[tag:mymemoext](http://qiita.com/search?utf8=%E2%9C%93&q=tag%3Amymemoext&sort=rel) : 検索成功
[tag:mymemoExt](http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=tag%3AmymemoExt) : 検索成功

Qiitaのタグ検索の特徴 (2015年11月12日現在)

- "-"などの文字が入ってもOK (`C#`などもOK)
- 大文字、小文字は区別しない