OmniAICreator/Qiita-1.07M huggingface dataset:
プロダクションコードとテストコードとで異なる source/target バージョンを設定する方法

# はじめに

Gradle な Java プロジェクトにおいて、プロダクションコード (`src/main/java` ディレクトリ配下の Java コード) は Java 7 相当のコンパイル (`javac` コマンドで `-source 1.7 -target 1.7` のオプションを指定する場合に相当) をしたいけど、テストコード (`src/test/java` 配下の Java コード) は Java 8 相当のコンパイルをしたい！ みたいな場合に、build.gradle でどのように `sourceCompatibility` や `targetCompatibility` を指定すればいいのか分からなかったので検証してみたメモです。

いままではプロダクションコードとテストコードで異なる source/target バージョンを指定する必要なんてなかったのだけど、[JUnit 5 はランタイム時に Java 8 を必要とする](http://junit.org/junit5/docs/current/user-guide/#overview-java-versions) らしいので、プロダクションコード側では Java 7 でのコンパイルが必要、でもテストコードでは JUnit 5 を使いたい！ みたいな場合にはこの設定を参考にできるかと思います。


# sourceCompatibility / targetCompatibility の設定方法

以下の build.gradle の例にあるとおり、

- プロダクションコードの設定
    - 普通に指定する
- テストコードの設定
    - `compileTestJava` タスクのプロパティで指定する

とすれば OK です。

```groovy
apply plugin: 'java'

// ⭐️ プロダクションコードに適用される source/target compatibility の設定
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7

// ⭐️ テストコードにだけ適用される source/target compatibility の設定
compileTestJava {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

// 以下のように、sourceSets プロパティを使う方法を試してみたけど、これはうまく行かなかった
//sourceSets {
//    main {
//        sourceCompatibility = JavaVersion.VERSION_1_7
//        targetCompatibility = JavaVersion.VERSION_1_7
//    }
//    test {
//        sourceCompatibility = JavaVersion.VERSION_1_8
//        targetCompatibility = JavaVersion.VERSION_1_8
//    }
//}

repositories {
    mavenCentral()
}

dependencies {
    // ...
}
```
JDBCを使って任意のSQLを叩くツール

※本記事の後半に修正したものが記載されています。

```java:DB.java
import java.sql.*;

public class DB {
  public static void main(String[] args) throws Exception {
    if (args.length != 1 || "".equals(args[0].trim())) {
      System.err.println("Error: <SQL>");
      System.exit(1);
    }
    String sql = args[0];
    Connection conn = null;
    try {
      String url = "jdbc: ... ";
      conn = DriverManager.getConnection(url);
      Statement stat = conn.createStatement();
      ResultSet result = stat.executeQuery(sql);
      while (result.next()) {
        System.out.println(createRowString(result));
      }
    } finally {
      if (conn != null) conn.close();
    }
  }

  private static String createRowString(ResultSet result) {
    StringBuilder buf = new StringBuilder();
    for (int i=1 ;; i++) {
      try {
        String s = result.getString(i);
        buf.append(s);
        buf.append('\t');
      } catch(SQLException e) {
        break;
      }
    }
    return buf.toString();
  }
}
```

url は例えばJavaDB(Apache Derby)だと以下のような文字列。

```
jdbc:derby:/path/to/database/dir;create=true;user=<username>;password=<password>
```

これを使えば以下のようにSQLを実行できる。結果はタブ区切りで出力される。

```
$ javac -cp .:<その他必要なjarファイルパス> DB.java
$ java -cp .:<その他必要なjarファイルパス> DB "SELECT * FROM xxtable"
aaa  AAA  111
bbb  BBB  222
ccc  CCC  333
```

SELECT文で * を使って任意のカラムを出力する場合、いくつカラムが出るかわからないのでcreateRowString()なんてメソッド作って頑張ったけど、もっといい方法ないのかな・・・

---
2016/12/28追記
[saka1029](http://qiita.com/saka1029)さんにカラム数取得方法をコメント貰ったのでちょっと編集。

2017/01/03編集
UPDATE文やDELETE文が実行できなかったのでできるようにした。

```java:DB.java
import java.sql.*;

public class DB {
  private static final  String URL = ... ;
  public static void main(String[] args) throws Exception {
    if (args.length != 1 || "".equals(args[0].trim())) {
      System.err.println("Error: <SQL>");
      System.exit(1);
    }
    String sql = args[0].trim();
    Connection conn = null;
    try {
      conn = DriverManager.getConnection(URL);
      Statement stat = conn.createStatement();
      if (isSelectStatement(sql)) {
        doSelect(stat, sql);
      } else {
        doUpdate(stat, sql);
      }
    } finally {
      if (conn != null) conn.close();
    }
  }

  private static boolean isSelectStatement(String sql) {
    String type = sql.split(" ")[0].toLowerCase();
    return "select".equals(type);
  }

  private static void doSelect(Statement stat, String sql) throws Exception {
    ResultSet result = stat.executeQuery(sql);
    while (result.next()) {
      System.out.println(createRowString(result));
    }
  }

  private static void doUpdate(Statement stat, String sql) throws Exception {
    int rowCount = stat.executeUpdate(sql);
    System.out.println("rows = " + rowCount);
  }

  private static String createRowString(ResultSet result) throws SQLException {
    ResultSetMetaData metadata = result.getMetaData();
    int columnCount = metadata.getColumnCount();
    StringBuilder buf = new StringBuilder();
    for (int i=1 ; i<=columnCount ; i++) {
      String s = result.getString(i);
      buf.append(s);
      buf.append('\t');
    }
    return buf.toString().trim();
  }
}
```
Elasticsearch+Kibana(v5.0以降)で、「VIEW IN SENSE」を使えるようにする方法

[Elasticsearchの公式チュートリアル](https://www.elastic.co/guide/en/elasticsearch/guide/master/getting-started.html)に、「VIEW IN SENSE」というリンクがあります。

![チュートリアル](https://qiita-image-store.s3.amazonaws.com/0/10290/c9ffd1b1-0499-4ec7-81ba-ee0b39938626.png)

本記事は、Dockerを使って環境構築し、これをクリックしてデモを試せるようになるところまでのメモ書きです。

### ローカルサーバを立てる

ElasticsearchとKibanaの入ったDockerイメージが公式から提供されていますので、それを使います。

```
$ docker pull elasticsearch
$ docker run --name=elastic -p 9200:9200 -d elasticsearch
$ docker pull kibana
$ docker run --link elastic:elasticsearch -p 5601:5601 --name=kibana -d kibana
```

> [v5.0以降、SenseはKibana本体に吸収され、消滅しました](https://github.com/elastic/sense/blob/master/README.md)。

### チュートリアル画面の設定を変更する

「VIEW IN SENSE」の横の歯車をクリックすると、URLを設定するダイアログが表示されます。

![URL設定](https://qiita-image-store.s3.amazonaws.com/0/10290/64142285-f8f1-a4a5-dc42-ee30d7969fb6.png)

ここに、次のURLを設定し、「Save」をクリックします。

**http://localhost:5601/app/kibana#/dev_tools/console**

「VIEW IN SENSE」をもう一度クリックすると、Kibanaの画面が立ち上がり、コードを動作させてみることができるようになります。
備忘録_リセットCSS

いつもなんとなく使ってしまっていたリセットCSSに関して調べたの備忘録
それぞれの中身に関しては別の備忘録へ

## normalize.css

### 最新バージョン

- v5.0.0 / 2016.10.3

### 対応ブラウザ(v5.0.0)

- IE8+
- Safari6+
- Chrome / Edge / FF / Opera => last two

### normalizeに関して

バグや一般的なブラウザの矛盾を修正し、かつ有用なデフォルトの設定は残す

### 補足

サクッとnpmでDWいける

```
$ npm install --save normalize.css
```

[GitHub - normalize.css](https://github.com/necolas/normalize.css)



## sanitize.css

### 最新バージョン

- v4.1.0 / 2016.7.1

### 対応ブラウザ(v4.1.0)

- IE10 - 11
- Safari8 - 9+
- Chrome50 - 51+
- Edge11 - 12
- FF46 - 47+
- Opera37 - 38+
- iOS 7-8+
- Android 4.3 - 4.4+

※IE9 / Safari7 に対応させるにはcssを追加する必要あり

### sanitizeに関して

バグや一般的なブラウザの矛盾を修正し、かつ有用なデフォルトの設定は残す
また、モバイルにも対応している

### 補足

サクッとnpmでDWいける

```
$ npm install --save sanitize.css
```

[GitHub - sanitize.css](https://github.com/jonathantneal/sanitize.css)



## ress.css

### 最新バージョン

- v1.1.2

### 対応ブラウザ

Normalizeを継承
> Inherit from Normalize

### ressに関して

Normalizeをベースにカスタマイズしたらしい。
※軽く見た感じNormalizeと違う部分結構ありそうです

### 補足

サクッとnpmでDWいける

```
$ npm install --save ress
```

[GitHub - ress.css](https://github.com/filipelinhares/ress)



## Reset CSS

### 最新バージョン

- v2 / 2011.1.26

### 対応ブラウザ(v2)

### Reset CSSに関して

ブラウザのデフォルトCSSをリセットする
※v2でHTML5に対応した

### 補足

下記のページからコピペで

http://meyerweb.com/eric/tools/css/reset/



## minireset.css

### 最新バージョン

- v0.0.2 / 2016.8

### 対応ブラウザ

要確認

### miniresetに関して

2016年8月に出たばかりのリセットCSS

### 補足

サクッとnpmでDWいける

```
$ npm install --save minireset.css
```

[GitHub - minireset.css](https://github.com/jgthms/minireset.css)
CustomStringConvertible を安全に String にするには

CustomStringConvertible でミスっても型検査で気付けない問題の対処方法です。


# 本題

Swift は、ある型が文字列での表現形式を持っていることを表明する 
 `CustomStringConvertible` という protocol があります。

この protocol は、`description` という文字列のプロパティを持っていれば実装できます。そして、`String(describing:)` は与えられた引数が `CustomStringConvertible` ならば、この `description` を使うという仕様になっています。 例えば、次のように書けます:

```swift
struct Foo: CustomStringConvertible {
  let description: String
}


let foo = Foo(description: "😇")
let fooString = String(describing: foo) // OK
```

さて、ここで問題なのは `String(describing:)` がどんな型でも受け取れてしまうことです。そのため、**`CustomStringConvertible` を実装し忘れても、型チェックでは気づけないのです**:

```swift
extension String {
  init(describingSafely x: CustomStringConvertible) {
    self = x.description
  }
}


struct Ok: CustomStringConvertible {
  let description = "ok"
}

struct Ng {
}

print(String(describing: Ok())) // OK
print(String(describing: Ng())) // OK 😇ｱｯ
```

そのため、下のような厳しめな対応をしておくと、`CustomStringConvertible` を忘れることがないでしょう:

```swift
extension String {
  init(describingSafely x: CustomStringConvertible) {
    self = x.description
  }
}


struct Ok: CustomStringConvertible {
  let description = "ok"
}

struct Ng {
}

print(String(describingSafely: Ok())) // OK
print(String(describingSafely: Ng())) // NG 😊
```

# まとめ

厳しい
yum「bad interpreter」エラーの対処

yumコマンド叩くと
「/usr/bin/yum: /usr/bin/python: bad interpreter: そのようなファイルやディレクトリはありません」
といったエラーが出た際の対処




yum本体のディレクトリへ移動
```
cd /usr/bin/
```


pythonのパスを確認
```
ll | grep python
```

/usr/bin/yumのファイルを確認
```
vi /usr/bin/yum
```

以下のパスになっています

```
#!/usr/bin/python
```

/usr/bin/pythonのシンボリックリンクがないようだったので作成
(上記で確認したpythonのパスをリンク先に指定します)
```
ln -s /usr/bin/python2.6 /usr/bin/python
```



これでyumコマンドが通るようになりました。


以上
後悔しないユーザ ID の決め方チェックポイント

まだユーザ ID を決めてない人、転生を考えている人向け。
**共通の ID を使いたいことが前提に書く。**

---

ユーザ ID は Twitter, Qiita, GitHub, Hatena などサービス上で自分の第二の名前となる大事なものなので慎重に決めたい。

サービスによるが基本的に、
ユーザ ID は **登録したら変更できない**。(例外: Twitter, GitHub)
非アクティブユーザだろうと一度取られた ID は解放されないので **早い者勝ち**。 (例外: GitHub)。


そこで ユーザ ID の選び方、チェックすべきポイントをまとめた。



# 取れるかどうか
これ。一番よくあるのが **すでに取られてるパターン**。登録が遅かったか、調査ミス。
ドメインも調べた方がいいし、決めたらすぐに取得しておくべき。

俺も安易に決めて https://twitter.com/elzup と https://www.facebook.com/elzup/ を取りそこねた。

![ss_ 2016-12-30 12.25.25.png](https://qiita-image-store.s3.amazonaws.com/0/40717/1800b148-12c9-68c7-eb97-3b06142d255c.png "ss_ 2016-12-30 12.25.25.png")

https://namechk.com/ (海外のサービスのみ) のような ID チェックサービスで確認しておくことをすすめる。

# 呼称と近いかどうか
リアルの知り合い同士の愛称や、ネット上で定着している呼称があってそこに合わせる場合はその発音と近いかどうかは大事。

補完ツールでリプライしたいときに楽だからである。関連性の全くない id を使われると厄介で、その人について id と 呼称別々に覚えなくてはいけなくなるので正直やめてほしい。

俺自身も「えるざっぷ」 @elzup なので、'r' か　'l'、'u' か 'a' かで若干紛らわしい。

個人的には「能登だでぃ子」さんの [@ntddk](https://twitter.com/ntddk) とか一発で頭に入って離れなくなったので好き(そもそも名前にインパクトある)。

# アルファベット順
![84b30352-2e02-8228-f138-d54c3f6840d6.png](https://qiita-image-store.s3.amazonaws.com/0/40717/2b441298-fafc-89df-f8dc-f748099c80ee.png "84b30352-2e02-8228-f138-d54c3f6840d6.png")
ちょっとした優位性。アルファベット順に並べられたときに先頭に顔を出せることもあるのでその辺も考えるとよい。



# 6文字以上
まれにある。この場合5文字以下だと超困る。僕はそもそも違うのを使っていたけれど、Google ユーザID もこれ。

# 記号
ハイフンやアンダースコアは使えないサービスもある。

# 単語 + 数字について
そのぶん長い ID になるし、人によっては妥協点でもあるかもしれない。でも補完のときは数字部分は覚えなくても大丈夫だし、かぶる確率も低い。
POSAで紹介されるアーキテクチャパターンまとめ

Patten-Oriented Software Architecture（POSA） Vol.1で紹介されているアーキテクチャパターンをまとめた．

### 混沌から構造へ（From Mud to Structure）

* [Layers](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/15/230224)

* [Pipes and Filters](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/16/215631)

* [Blackboard](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/17/212705)

### 分散システム（Distributed Systems）

* [Broker](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/18/000243)

### 対話型システム（Interactive Systems）

* [Model-View-Controller](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/18/205055)

* [Presentation-Abstraction-Control](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/18/230933)

### 適合型システム（Adaptable Systems）

* [Microkernel](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/19/105525)

* [Reflection](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/19/185229)
Unity2D ～超手抜き画面端ループ移動～

#はじめに
よくある右に行ったら左に出てくるみたいなやつ
↓これ
![mario02.jpg](https://qiita-image-store.s3.amazonaws.com/0/156510/8ac252e9-a507-ee5b-8f34-665235e57362.jpeg)


#コード
本当はカメラの端のワールド座標取るとか賢い感じにやるべきだとは思いますが、面倒くさい人の為に超簡単に作りましょう。

1.プレイヤーを端に移動させます。
![gster.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/1d17b6dd-3578-90d6-ce47-ec37ec702ccc.png)

2.プレイヤーのTransform.xを見ます
![sertst.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/f5f87ece-b7e0-67c9-e8b1-d476a9a7fbf4.png)

3.反対も同じ感じでやります
![grsasgrg.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/c1aa68b1-8e2a-ce8f-85b8-91b380b493ab.png)
![gdshhsh.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/8828d32a-429f-773d-a643-f99e1547fefb.png)

左端が-5f 右端が5fくらいかな？

4.端まで行ったら逆へワープする感じでコード書きます！

```csharp
    void fieldLoop()
    {
        if(rb2d.transform.position.x > 5.2)
        {
            Vector3 rb2dPos = rb2d.transform.position;
            rb2dPos.x = rb2dPos.x - 10f;
            rb2d.transform.position = rb2dPos;
        }
        if (rb2d.transform.position.x < -5.2)
        {
            Vector3 rb2dPos = rb2d.transform.position;
            rb2dPos.x = rb2dPos.x + 10f;
            rb2d.transform.position = rb2dPos;
        }
    }
```
Playerのscriptに書いてメインループ内で fieldLoop(); 読み込ませたらok

5.完成★
左が-5f 右が5fと想定して5を超えたら10引く-5を超えたら10足す
簡単ですね！！

※右端に行ったら左端から体が少し出るとかは出来ないのでそういう感じにしたい方は他の方法で

いつかその方法がわかったら記事上げときます（）
docker pull時にtime outになる問題の解決

# 概要

　Windowsでdocker pull コマンドでイメージを取得する際に、Time outになる問題
　すでに[同様の記事](http://qiita.com/tifa2chan/items/e296c5e49d67d6586a80)が上がっていましたが、私の原因が異なるため別途残させていただきます

# エラー

```
Network timed out while trying to connect to https://index.docker.io/v1/repositories/library/hello-world/images.
You may want to check your internet connection or if you are behind a proxy.
```

# 原因＆解決策

**フレッツ光網の遅延による可能性が大**
なので、回線のスピードテストを試してください
回線速度が遅すぎて（1Mbps切るレベル）、DNSの逆引きすらできない状況

いろいろ（IPv6をOFF）調べてみて試してたが、解決に至らず。Dockerログを確認したところ、どうやらDNSが設定されていなかったことが原因でした。
家の回線がPPPoEでのダイアルアップ接続のため、NICのDNS設定が自動設定になっていました。それをグーグルが提供しているDNSサービスに「8.8.8.8」に変更したところ問題なくpullできるようになりました

ちなみにWindowsのDockerログの場所は```C:\Users\xxxxxx\AppData\Local\Docker```にあります
同様な原因で困っている場合は、まずはログを確認してみましょう
vimでejs

Vimでejsを開く時にシンタックス系がきかないのでHTMLに寄せるはなし。

```:.vimrc
au BufNewFile,BufRead *.ejs set filetype=html
```
引用元はstackoverflowの[このスレッド](http://stackoverflow.com/questions/4597721/syntax-highlight-for-ejs-files-in-vim)ですです。
Rubyの無限ループでループカウンタを使う

Rubyで無限ループは以下のように書ける。

```ruby
loop do
  puts "無限ループって怖くね？"
end
```

しかし、この方法だとループカウンタが使えない。

以下のように、`loop_with_index`メソッドをKernelモジュールに定義することで、
あたかも構文のようにループカウンタ付きの無限ループが記述できる。
(標準的なもっと良いやり方があるのかもしれない)

---------------------
2017/7/12 追記
Ruby2.1以降であれば、コメントで教えてもらった方法が一番良さそうです。

```ruby
1.step do |i|
  puts "無限ループ#{i}回目"
  # => 無限ループ1回目
  # => 無限ループ2回目
  # => 無限ループ3回目
end
```

---------------------



```ruby
module Kernel
  def loop_with_index(ini = 0)
    cnt = ini
    loop do
      yield(cnt)
      cnt += 1
    end
  end
end
```
 
以下のように使える。

```ruby
loop_with_index do |i|
  puts "無限ループ#{i}回目"
  # => 無限ループ0回目
  # => 無限ループ1回目
  # => 無限ループ2回目
end
```

ループカウンタの初期値も設定できる。

```ruby
loop_with_index(5) do |i|
  puts "無限ループ#{i}回目"
  # => 無限ループ5回目
  # => 無限ループ6回目
  # => 無限ループ7回目
end
```

## おまけ
昔(Ruby 1.8以前)はこういうバッドノウハウ的な手段もあったようだ。

[無限ループ内でループ回数を数えるメモ](http://d.conma.me/entry/20081228/1230459203)
HugoのMarkdownでサイト変数を使う


静的サイトジュネレータのHugoでは、テンプレートから参照できる変数を定義できます。
これはテンプレートから参照するためのものですが、
Markdownのページでも使用したい場合がありましたので、ショートコードを使った方法を考えました。


# 1. 目的

Markdownで記述するページで変数を使う方法を記載します。
変数にはいくつか種類がありますが、サイト全体に適用されるサイト変数（Site Valiables）を使います。
参照の仕組みはMarkdown内の表示を部品化できるショートコード（Shortcodes）を使います。

* [Hugo - Template Valiables](https://gohugo.io/templates/variables/)
* [Hugo - Shortcodes](https://gohugo.io/extras/shortcodes/)

本来のショートコードの使い方ではないですし、もっとスマートな方法があるかもしれませんが、とりあえず。

# 2. 方法

## 2.1. サイト変数の定義

サイトの設定ファイルconfig.tomlに対し、サイト変数を定義します。
これで、テンプレートからは".Site.Params.[変数]"という感じで呼び出せます。

```:config.toml
・・・

[Params]
company = "xxx株式会社"
zip = "〒000-0000"
address = "東京都・・・"
tel = "00-0000-0000"
fax = "11-1111-1111"
email = "info@xxx.co.jp"
・・・
```

## 2.2. ショートコードの記述

layouts/shortcodes/にval.htmlを作成し、サイト変数に合わせて以下のコードを記載します。
※if文の条件で文法的な確認が取れていないのですが、以下で変数内容の比較ができました。

```:layouts/shortcodes/val.html
{{ if index .Params 0 | eq "company" }}{{ .Site.Params.company }}
{{ else if index .Params 0 | eq "zip" }}{{ .Site.Params.zip }}
{{ else if index .Params 0 | eq "address" }}{{ .Site.Params.address }}
{{ else if index .Params 0 | eq "tel" }}{{ .Site.Params.tel }}
{{ else if index .Params 0 | eq "fax" }}{{ .Site.Params.fax }}
{{ else if index .Params 0 | eq "email" }}{{ .Site.Params.email }}
{{ end }}
```

## 2.3. Markdownの記述

ショートコードのval（val.html）を呼び出す記述で、パラメータで変数名を指定します。
{{< val [変数名] >}}

上記の記述でパラメータに応じたサイト変数を表示できます。


```:content/page.html
・・・

### 問い合わせ先

TEL: {{< val tel >}}　# → TEL: 00-0000-0000
FAX: {{< val fax >}}　# → FAX: 11-1111-1111

・・・
```


以上です。
もっと良い方法があれば教えていただけると幸いです。
AppStore, Google Play Store から アプリ固有のidを抜き出す

業務でAppStore (iOS), Google Play Store (Android) からアプリ固有のidを抽出する必要があったため備忘録です。Perlでの記述になりますが、正規表現なので他の言語でもほぼ変わらないかと

# Google Play Store (Android)

```pl
my $android_url = 'https://play.google.com/store/apps/details?id=com.ea.game.maddenmobile15_row&hl=ja';

# 'details?id=bundle& : details?id= に続きかつ、[^&]+ で &を含まないような文字列
print $android_url =~ /details\?id=([^&]+)/ ? "$1\n" : undef; 
```

```shell-session
$ perl android_extract_id_from_url.pl
com.ea.game.maddenmobile15_row
```

# App Store (iOS)

```pl
my $ios_url = 'https://itunes.apple.com/us/app/yelp/id284910350?mt=8';

# id に続く数列
print $ios_url =~ /id(\d+)/ ? "$1\n" : undef;
```

```shell-session
$ perl ios_extract_id_from_url.pl
284910350
```
GitHubのPull Requestが勝手にmergeされることがある話

# はじめに
タイトル通り。GitHub上でPullRequestを作った後、誰もmergeしていないはずなのに何故か勝手にmergeされていて焦った。

# 準備
* GitHubで適当なレポジトリを作る
* 作ったレポジトリをclone  

```
$ git clone git@github.com:hogehoge.git
```
* 適当なファイルを作ってmasterブランチにcommit & push

```
$ git checkout master
$ touch sample0.txt
$ git add .
$ git commit -am "Initial commit"
$ git push -u origin master
```

# 勝手にマージされる事例

## パターン1
* 適当なブランチを作る

```
$ git checkout -b branch1
```

* 適当に何かしてコミット

```
$ touch sample1.txt
$ git add .
$ git commit -am "Commit on branch1"
$ git push --set-upstream origin branch1
```

* GitHub上で、 `branch1 -> master` の Pull Request を作る … (1)
* ローカル上で、`master`に`branch1`をmerge & push

```
$ git checkout master
$ git merge branch1
$ git push -u origin master
```

これで、(1) で作ったPull Requestが勝手にマージされている。

## パターン2
* 適当なブランチを作る

```
$ git checkout -b branch2
```

* 適当に何かしてコミット

```
$ touch sample2.txt
$ git add .
$ git commit -am "Commit on branch2"
$ git push --set-upstream origin branch2
```

* GitHub上で、 `branch2 -> master` の Pull Request を作る … (2)
* ローカル上で、`master`を`branch２`にrebase & push (この場合はfast-forwardなのでmergeと変わらないが)

```
$ git checkout master
$ git rebase branch2
$ git push -u origin master
```

これで、(2) で作ったPull Requestが勝手にmergeされている。

# 終わりに
初見だと勝手にmergeされていてビビるが、冷静に考えると当然のことだった。
勝手にmergeされて然るべきときには勝手にmergeされることを知った。

merge先が`master`とか`develop`のときにはこんなことは無いと思うが、
featureブランチで開発していて細かい機能を追加 → featureブランチにPull Request
みたいなときにはうっかりするとやってしまうことがある気がする。(あった。)
アーキテクチャ アンチパターンのまとめ

ソフトウェア アーキテクチャ アンチパターン（Software Architecture Antipattern）をまとめた．

基本的に下記の本を邦訳した内容になっている．
[https://www.amazon.com/AntiPatterns-Refactoring-Software-Architectures-Projects/dp/0471197130]
この本自体は1998年に出版されている．古典に入るか入らないかという瀬戸際な気がする．
その証拠にネット上にはほとんど日本語情報がなく，苦労した.

### アーキテクチャアンチパターンって何？

システムレベルやエンタープライズレベルのアプリやコンポーネントの構造（アーキテクチャ）に焦点を当てたアンチパターンのこと．
アーキテクチャの価値については研究などから認知されている．（なのに日本語情報は少ない）
たとえば，以下のようなことが知られている．

1. 良いアーキテクチャはシステム開発に必須
2. アーキテクチャ駆動の開発は，要件，ドキュメント，方法論などに駆動されるソフト開発より優れている．

じゃあアーキテクチャは何なの，というと, 
ソフトアーキテクチャはシステム全体のアーキテクチャのサブセットであると言える．
アーキテクチャの原則として以下のものがある.

1. アーキテクチャはシステム全体へのビューを提供する．
これはシステムのある部分に着目した分析やモデルとはまったく異なるものである，
2. システム全体をモデル化するには，多数のビューポイントが必要となる．
ステークホルダーごとのビューポイントが必要．

### アーキテクチャアンチパターン目次

アンチパターンとは，「やってはいけない例」を類型化したもののこと．
パターンごとに「どんな問題が起こるか？」や「どう解決するか？」をまとめてみた．

* [Autogenerated Stovepipe](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/22/231423)
* [Stovepipe Enterprise](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/23/234406)
* [Jumble](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/25/223728)
* [Stovepipe System](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/27/190238)
* [Cover Your Assets](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/27/201600)
* [Vendor Lock-in](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/27/224408)
* [Wolf Ticket](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/28/201447)
* [Architecture By Implication](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/28/234946)
* [Warm Bodies](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/29/204058)
* [Design By Committee](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/29/212219)
* [Swiss Army Knife](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/29/224209)
* [Reinvent the Wheel](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/01/060857)
* [The Grand Old Duke of York](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/01/191455)

技術的な話だけかと思っていたら，Design By CommitteeやWarm Bodiesなどのようにプロジェクトマネジメント的な話も結構あった．
でもプロジェクトマネジメントのアンチパターンは別にあるようで，よくわからない．
Julia でも array.map() do ... end と書ける

　[Julia Advent Calendar 2016](http://qiita.com/advent-calendar/2016/julialang) です。12月9日の記事を 12月27日に投稿しました。

　Julia でも、Ruby のようなオブジェクト指向の構文で書きたい。その要望に [`Lazy.jl`](https://github.com/MikeInnes/Lazy.jl) パッケージが応えます。

# (その1) 文字列置換

　文字列を置換するには `replace` を使います。

```julia
julia> s="123"
"123"

julia> s=replace(s,"2","b")
"1b3"

julia> s=replace(s,"3","c")
"1bc"
```

　`replace` は、元の文字列を更新しません (文字列は immutable だから)。ですので、文字列置換を複数回行うには、`s=replace(s,from,to)` を繰り返して適用することになります。面倒ですね。
　Ruby では、これをメソッド・チェーンできれいに書けます。一時変数も不要です。

```Ruby
＃ Ruby
"123".sub("2","b") # => "1b3"
"123".sub("2","b").sub("3","c") # => "1bc"
```

　Julia では、 [`Base.|>`](
http://qiita.com/antiplastics/items/ea144b4589e9563a8e4a#comment-1d5921eda989c397d62d) を使って function chain を書けますが、無名関数を書く必要があり、いまいちイケていません。([別記事へのコメント](
http://qiita.com/antiplastics/items/ea144b4589e9563a8e4a#comment-1d5921eda989c397d62d) )

```julia、

julia> "123" |> (x -> replace(x,"2","b")) |> (x -> replace(x,"3","c"))
"1bc"
```


　さて、クリスマス・プレゼントに、`Lazy.jl` パッケージを頂きました。
　`@>` マクロを使えば、Julia でも似たように書けますよ。

```julia
julia> Pkg.add("Lazy")

julia> using Lazy

julia> @> "123" replace("2","b")
"1b3"

julia> @> "123" replace("2","b") replace("3","c")
"1bc"
```

　繰り返し文字列置換を適用できて、大満足です。


# (その2) map, foreach

　Julia の `map` は `map(func, collection...)` という引数をとります。func を `do...end` ブロックで後置する構文もあります。いずれにせよ `map` から始まります。

```Julia
julia> map(x-> sin(x), [1,2,3])
3-element Array{Float64,1}:
 0.841471
 0.909297
 0.14112

julia> map([1,2,3]) do x sin(x) end
3-element Array{Float64,1}:
 0.841471
 0.909297
 0.14112

````
 
　Ruby の`map` は、配列に対する操作を簡潔に書けますね。

```Ruby
# Ruby
[1,2,3].map do |x| Math.sin(x); end
# => [0.8414709848078965, 0.9092974268256817, 0.1411200080598672]
```

　Ruby がうらやましい ? 
　いやいや、`@>>` マクロを使えば、Julia でも似たように書けますよ。

```Julia
julia> @>> [1,2,3] map() do x sin(x) end
3-element Array{Float64,1}:
 0.841471
 0.909297
 0.14112
````


　計算結果が不要なら `foreach` を使いましょう。

```Julia
julia> @>> [1,2,3] foreach() do x println(sin(x)) end
0.8414709848078965
0.9092974268256817
0.1411200080598672
```


# 種明かしは初夢で

　[`Lazy.jl`](https://github.com/MikeInnes/Lazy.jl) のドキュメントをどうぞ。 
　https://github.com/MikeInnes/Lazy.jl#macros

# (その3) map を連結できる
2017/01/03 追記

( 初夢を見ました。まだ種明かしはしませんが )

```Ruby
# Ruby
[1,2,3].collect{|x| Math.sin(x)}.collect{|x| x+1 }
# => [1.8414709848078965, 1.9092974268256817, 1.1411200080598671]
```

Julia でも `map` を連結できます。

```Julia
julia> @>> [1,2,3] map() do x sin(x) end map() do x x+1 end
3-element Array{Float64,1}:
 1.84147
 1.9093 
 1.14112
```
動作確認

#はじめに
[前回](http://qiita.com/AkimotoMasane/items/af8f301a6bf6d2dad6ce)STM32CubeMXで作成したプロジェクトをMDK ARMで動作させてみました。

#手順
プロジェクトをMDK ARMで実行します。

手順１）MDK ARMを起動する
MDK ARMを起動します。

手順２）プロジェクトを開く
メニューからプロジェクトファイルを開きます。
Project ⇒ Open Project ...
をクリックします。

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/34ff9e6e-71ad-bb99-7e1b-100aa6e21edf.jpeg)

手順３）プロジェクトファイルを選択
Select Project File画面でプロジェクトファイル（*.uvprojx）を選択します。

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/d29f2f7b-9ac5-571f-f53e-8e1cadd7bf08.jpeg)

手順４）ビルド
プロジェクトをビルドします。
Project Windowで右クリックして「Rebuild all target files」を選択します。

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/b26da631-4164-5222-caff-076f962b0484.jpeg)

手順５）ダウンロード
メニューから実行ファイルをSTM32の内蔵フラッシュに書き込みます。
Flash ⇒ Download
をクリックします。

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/6ccc420f-e508-51b6-5678-d50328856220.jpeg)

ダウンロードに成功するとBuild Output画面に「Flash Load finished」というメッセージが表示されます。

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/e340ec58-e9c2-1294-b1bb-885798c4ff44.jpeg)

手順６）実行
ダウンロードに成功したらメニューからデバッグを開始します。
Debug ⇒ Start/Stop Debug Session
をクリックします。

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/169f44ac-3b0e-b288-9fd0-323f85cff6b5.jpeg)

評価版のため下記の警告が出るので「OK」ボタンを押します。

![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/cef334df-9452-4aa2-9f69-434b385663b8.jpeg)

手順７）メイン関数
正常に実行することができたらメイン関数まで実行されブレークした状態となります。
ブートでクロックの発振安定待ちをしているのでメイン関数まで実行されれば、
外部発振子で動作することができていると思われます。

![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/3c52e669-4713-ee3e-c393-5e324ea94fd2.jpeg)


#まとめ
外部発振子で動作しているようなので、次はI2Cを有効にしてセンサーデバイスにアクセスしようと思います。
redux-formのFieldの値の更新に処理を差し込む

### 2017-01-31 redux-formで対応

https://github.com/erikras/redux-form/releases/tag/v6.5.0

> **Event callbacks!**

Yay!
6.5.0以降は単純に以下でOK

```js
<div>
  <Field name='test_name' component='select' onChange={e => this.setState({test_state: e.target.value})} >
    <option value='test'>test</option>
    <option value='test2'>test2</option>
  </Field>
  {(this.state || {}).test_state === 'test'? 'テスト' : 'テストでない'}
</div>
```

`e.preventDefault()`でredux-formの処理をさせないようにもできる。（選ばせたくない時なんかに使う？）
これにて一件落着。

### やりかた

`Component`を作る処理を書いて、`onChange`の処理を上書きする。こういう感じ

```js
render() {
  const bindStateSelect = ({input: {onChange, ...inputs}, children: children, bindState: bindState}) => 
    <select onChange={
      e => {
        const o = {};
        o[bindState] = e.target.value;
        this.setState(o);
        onChange(e);
      }
    } {...inputs}>{children}</select>

  return (
    <div>
      <Field name='test_name' component={bindStateSelect} bindState='test_state'>
        <option value='test'>test</option>
        <option value='test2'>test2</option>
      </Field>
      {(this.state || {}).test_state === 'test'? 'テスト' : 'テストでない'}
    </div>
  )
}
```

`Field`の`onChange`に直接渡すと、それで上書きされて全く使えない状態になる。色々探っているうちにこういう形になった。
`onChange`が指定されてたら`handleChange`を後ろにくっつけるみたいな生成にしてくれたら、こういうことはしなくて良くなるんじゃないかと思うんですが……

### 経緯

`Field`の値が変わったら描画内容を変えるのをやりたかった。例は文言変わるだけですが実際は出すcomponentを変えたりする形です。

正攻法なら`reducer`を追加してやることになると思う。
まず、`Field`を使わずに自分で`action`を呼ぶコードを`onChange`で書き、`submit`の中でマージする。これには何のためにredux-form使っているのかという迷いがあります。（ちょっと凝ったことをするとこうなるけど）
次に、`Field`の値変更時に`@@redux-form/CHANGE`という`action`が投げられるので、`reducer`内で拾って処理する。良さそうな気がしますが、ドキュメントに書いてあるわけではないのでバージョン上げたら動かないとかなりそう。
なので、ひとまず上の方法を考えてみた。

こういうのやってると小さい`reducer`がいっぱいできて、実害はともかくウーンという感じになる。簡単な画面切り替え程度を手軽にやるならこんなもんで……。この辺も見つつ
http://qiita.com/rchaser53/items/41a6a149ca00cf405eca

思ってたより苦戦したので備忘録まで
備忘録_IEのサポート期限に関して


## 結論から

2017年4月まではIE9をターゲットにして、そのあとはIE11をターゲットにする
※心の声です。もちろん簡単にはいきません。つい先日IE7案件あったのは内緒の話。。。


## Windows Vistaの場合

### 利用できるIEのバージョンは下記の通り

- IE7
- IE8
- IE9

### MSのサポート期間

- 2016年1月 / IE7, IE8 => 現状サポート切れ
- 2017年4月 / IE9      => サポート中 


## Windows7の場合

### 利用できるIEのバージョンは下記の通り

- IE8
- IE9
- IE10
- IE11
- エンタープラズモード(最新版)

### MSのサポート期間

- 2016年1月 / IE8, IE9, IE10 => 現状サポート切れ
- 2020年1月 / IE11, エンタープラズモード(最新版) => サポート中 


## Windows8の場合

### 利用できるIEのバージョンは下記の通り

- IE10

### MSのサポート期間

- 2016年1月 / IE10 => 現状サポート切れ


## Windows8.1の場合

### 利用できるIEのバージョンは下記の通り

- IE11
- IE11エンタープライズモード

### MSのサポート期間

- 2023年1月 / IE11, エンタープラズモード(最新版) => サポート中


## Windows10の場合

### 利用できるIEのバージョンは下記の通り

- IE11
- IE11エンタープライズモード
- Microsoft Edge


### MSのサポート期間

- 2025年10月 / IE11, エンタープラズモード(最新版), Edge => サポート中


## エンタープライズモードに関して

IE11に搭載された機能(動作モード)であり「互換表示」機能とは別。
IE8でしか動かないようなソフトに対応することができるが、エンタープライズモードも万能ではないのでその辺には注意する。

## IEもろもろ

http://qiita.com/y_sekitoba/items/2d41fa6c89aeed71cefb
http://qiita.com/y_sekitoba/items/6cf6e5b9c1f410ecdea1
http://qiita.com/y_sekitoba/items/aa1fbab186eaa676b5dc
sqlite3のblob操作API

sqlite3でcからblobを操作してみた。
（とりあえずエラーは考えないことにして）

    #include <stdio.h>
    #include <sqlite3.h>
    
    int main(int argc, char** argv) {
        sqlite3* dp = NULL;
        sqlite3_stmt *pStmt = NULL;
        char hash[4] = {1, 3, 5, 7};
        int ok;
    
        sqlite3_open(":memory:", &dp);
    
        sqlite3_exec(dp, "CREATE TABLE TESTTBL(NAME VARCHAR PRIMARY KEY, HASH BLOB);", NULL, NULL, NULL);
    
        sqlite3_prepare_v2(dp, "INSERT INTO TESTTBL (NAME, HASH) VALUES ($1, $2);", -1, &pStmt, NULL);
        sqlite3_bind_text(pStmt, 1, "Bob", -1, SQLITE_STATIC);
        sqlite3_bind_blob(pStmt, 2, hash, 4, SQLITE_STATIC);
        //sqlite3_bind_blob(pStmt, 2, hash, 4, SQLITE_TRANSIENT);
        //hash[0] = 2;
        sqlite3_step(pStmt);
        //hash[1] = 4;
        sqlite3_finalize(pStmt);
    
        sqlite3_prepare_v2(dp, "SELECT NAME, HASH FROM TESTTBL;", -1, &pStmt, NULL);
        while (sqlite3_step(pStmt) == SQLITE_ROW){
            const unsigned char *name = sqlite3_column_text(pStmt, 0);
            int size = sqlite3_column_bytes(pStmt, 1);
            char * b = (char *)sqlite3_column_blob(pStmt, 1);
            printf("name: %s, hash:", name);
            for (int i = 0; i < size; ++i) {
                printf(" %x", b[i]);
            }
            printf("\n");
        }
        sqlite3_finalize(pStmt);
    
        sqlite3_close(dp);
    
        return 0;
    }

sqlite3_bind...のカラムは１から始まるけど、sqlite3_column...のカラムは０から。

SQLITE_STATICの場合、hash[0] = 2;は結果に影響するけどhash[1] = 4;は影響しない。
つまりsqlite3_step()が終わるまではblobのメモリを維持しなきゃいけない模様。
何も考えずにSQLITE_TRANSIENTにしても普通は問題無いかも。
Windows10のJulialangでffiを試す

macOSやLinuxは公式の通りのコードでうごくがWindowsは[PythonのCtypesのページ](http://docs.python.jp/2/library/ctypes.html)を参考にするとよい模様。

```jl
t = ccall( (:printf, "msvcrt"), Int32, (Cstring,),"Hello World!")
```

# 関連投稿

- [アプリに組み込んだJuliaを0.6に対応するには - Qiita](https://qiita.com/kjunichi/items/4a41cb84de48f2714d27)

# 関連記事

- [aobenchをjuliaでやってみた](https://abrakatabura.hatenablog.com/entry/2016/07/15/074022)
- [Windows(MSVC)でmrubyからGPU対応のTensorflowを動かせた](https://abrakatabura.hatenablog.com/entry/2017/01/28/125353)
- [JuliaでYoutuberを目指す](https://abrakatabura.hatenablog.com/entry/2017/12/14/221520)
- [Juliaで日本語のワードクラウドをやってみた](https://abrakatabura.hatenablog.com/entry/2018/06/24/102702)
- [Julia言語からmruby-webcamを使ってWebカメラの画像を取得した](https://abrakatabura.hatenablog.com/entry/2019/04/30/152311)
Webページのリンクが別タブで開かれるか表示するChrome拡張機能作った

この記事は諸事情により、[このリンク先](https://sublimer.hatenablog.com/entry/2017/07/01/000000)に移行しました。
This article has moved to [this link](https://sublimer.hatenablog.com/entry/2017/07/01/000000) due to various reasons.
ESP8266 > Amazon Dash Buttonの接続先アクセスポイントになる > v0.2 (失敗) > モバイルルータの皮をかぶったESP8266

```txt:使用機材
ESP-WROOM-02 ユニバーサル基板実装
```

v0.1 http://qiita.com/drafts/89b24045bf5e44f97be4/edit

## 概要

ESP8266でAmazon Dash Button(以下ADB)のボタン押下を受けようとしている。

## v0.2

### 今回の調査

- モバイルルータのSSID, WPA KEYでADBをセットアップする
   - モバイルルータ: 401HW
- 同じSSID, WPA KEYのESP8266 をアクセスポイントにする
- ESP8266 でUDPポート53のチェックをする。

### code v0.2

SSIDとPasswordはセキュリティの関係上、意図的に別の文字にしています。

```c:esp8266_161226_detectAmazonDash.ino
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

/*
 * v0.2 Dec. 27, 2016
 *   - use [SSID],[password] for mobile router
 * v0.1 Dec. 26, 2016
 *   - implement loop()
 *   - implement setup()
 *   - add WiFi_setup()
 */

static const char *kSsid = "401HWa-XX314";
static const char *kPassword = "3141592a";
static const int kLocalPort = 53; // for DNS check from Amazon Dash Button
static WiFiUDP wifiUdp;

void WiFi_setup() {
//  WiFi.softAPConfig(IPAddress(8, 8, 8, 8), IPAddress(8, 8, 8, 1), IPAddress(255, 255, 255, 0));

  WiFi.softAP(kSsid, kPassword);
  IPAddress myIP = WiFi.softAPIP();
  Serial.println("AP IP address: ");
  Serial.println(myIP);

  wifiUdp.begin(kLocalPort);  
}

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.print("Configuring acess point...");

  WiFi_setup();
}

void loop() {
  int rcvdSize = wifiUdp.parsePacket();
  if (rcvdSize == 0) {
    delay(100); // msec
    return;
  }

  Serial.println("Received");
}
```

### 結果

- ADBボタンの登録: 成功
- ESP8266でのボタン押下検知: 失敗

同じSSIDだからといって、受信できるわけではなさそう。
IMEIのチェックとかしているのだろうか。

最近のADBはDNS問い合わせでなくDHCP問い合わせに変わってきている、という情報を見てport67も確認したがだめだった。
http://stackoverflow.com/questions/37302925/amazon-dash-button-stopped-arping
Leaflet で地理院標高タイルから等高線を描いてみる

# はじめに

[地理院標高タイル](http://maps.gsi.go.jp/development/demtile.html) を使ってブラウザ上で直接等高線を描いてみます。

標高データ (二次元配列) に対して [CONREC](http://paulbourke.net/papers/conrec/) のようなアルゴリズムを用いてベクタデータを生成、描画していくのが一般的だと思うのですが、この記事では二次元配列から直接等高線ラスタ画像を生成する方式を紹介します。

# デモ

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/9c77abf6-fffd-9f87-6a37-015824136969.png)

- デモ <https://bl.ocks.org/frogcat/raw/cac7e74534e1c9eb68b95487d0df5465/>
- ソース <https://gist.github.com/frogcat/cac7e74534e1c9eb68b95487d0df5465>

# 解説

## 基本

前稿 [地理院標高タイルと Leaflet でつくるCS立体図](http://qiita.com/frogcat/items/b9aaa3df866a89d46ef5) では標高データを取得して曲率・傾斜を計算して画像を合成していましたが、やっていることはほとんど変わりありません。曲率・傾斜の代わりに等高線を計算しただけです。

## 等高線

冒頭述べたとおり、通常は二次元配列からベクタデータを生成します。標高データが粗で画素が密な場合にはこのような方法は有効です。ただ、地理院標高タイルはとても密です。たとえばズームレベル14以下で地図を表示した状態であれば、画面上のすべてのピクセルに対して標高値がわかる、というレベルで密なデータが整備されています。

ここで、以下のような `a,b,c,d` の4つのピクセルからなるグリッドについて、標高値10 の等高線を引きたいものとします。

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/b4692e3b-bc5d-e197-1170-fc85541c9f5f.png)

- a=20, b=0 の場合、a と b の間に等高線が通る
- a=20, c=0 の場合、a と c の間に等高線が通る
- a=20, d=0 の場合、a と d の間に等高線が通る
 
ベクトルの場合はここで等高線の経路をさらに詳細に計算することになるのですが、ラスターの場合は単に a を塗りつぶすのみです。上記のデモで実際に等高線の塗りつぶし判定を行っているのは以下のようなルーチンです。

```logic.js
// dem を取得
var dem = xhr.responseText.split(/[,\n]/).map(function(a) {
  return Math.floor(parseFloat(a) / 100);
});
var ctx = canvas.getContext("2d");
var img = ctx.createImageData(0x100, 0x100);
for (var i = 0; i <= 0xffff; i++) {
  if ((i & 0xff) === 0xff || (i & 0xff00) === 0xff00)
    continue;
  if (dem[i] !== dem[i + 1] || dem[i] !== dem[i + 0x100] || dem[i] !== dem[i + 0x101]) {
    img.data[i * 4 + 0] = 0xff;
    img.data[i * 4 + 1] = 0xff;
    img.data[i * 4 + 2] = 0xff;
    img.data[i * 4 + 3] = dem[i] % 5 === 0 ? 0xff : 0x70;
  }
}
ctx.putImageData(img, 0, 0);
```

右、下、右下のセルの値と自分の値を比較して自分自身を塗りつぶすかどうかを判定する、というものなので難しい計算はしていません。スマホでも動作するレベルの負荷です。等高線の本数が増えても比較的影響が少ないはずです。

# まとめ

標高タイルから等高線描画する方法を紹介しました。標高タイルが密に整備されているからこそできるチート、という感もありますが比較的高速に等高線を描画することが可能です。よい使いどころがあれば応用してみてください。
Redisをサクッと動かすまで

このエントリはRedisをサクッと動かすまでを描いたものです。フェイルオーバ等は一切考えておらず、Redisを試してみたい人向けに描きました。


### 環境
* CentOS 6.x
* Redis 3.26(2016/12/26　最新)

### インストール
まずはRedisをインストールします。
CentOS 6系-64bitの場合
他の場合は[こちらから](http://qiita.com/KurosawaTsuyoshi/items/9a2b61af6e13dfa5641b "こちらから")

*redhatのレポジトリ追加*

```
sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
sudo rpm -Uvh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

*Redisインストール*

```
sudo yum install --enablerepo=remi redis
```

*Redis起動&確認*

```
sudo service redis start
ps -ef | grep redis
redis-cli info | grep redis_version
```

### Redisの設定ファイル編集

Redisの設定ファイルは/etc以下にあります。

* redis-sentinel.conf
* redis.conf

設定ファイルのpermissionまわりと設定ファイルを編集していきます。

*設定ファイルのpermission*

```
sudo chown redis:redis /etc/redis.conf
sudo chown redis:redis /etc/redis-sentinel.conf
sudo chmod 755 /etc/redis.conf
sudo chmod 755 /etc/redis-sentinel.conf
```

*redis.conf編集*


```
daemonize yes
pidfile redis_6379.pid
dbfilename 6379.rdb
maxclients 1024
```

簡単に説明すると、

| 設定項目 | 説明 |
|:-----------|:------------:|
| daemonize | デーモンで起動するか否か |
| pidfile | pidfile名(Redisのプロセスファイルの名前) |
| dbfilename       | 永続担保のファイル名(Redisはデータを永続的に担保するためあるタイミングでファイルにwriteする。そのファイル名) |
| maxclients    | 同時接続可能数 |



### 起動
これで準備は整ったので実際に起動して確かめてみます。

```
sudo /etc/init.d/redis start
ps -ef | grep redis
```

プロセスが動いていることを確認

*起動*

```
redis-cli -p 6379
127.0.0.1:6379> ping
PONG
```

こんな感じで動いていることを確認。
あとはフレームワークなりでenvファイルやdbのconfigファイルにredisのhostとportを追記してやれば、applicationでも使えるようになります。

### 参考文献

* http://qiita.com/KurosawaTsuyoshi/items/f8719bf7c3a10d22a921
* http://techlog.tech/articles/00004
PidoraにPythonをインストールする。

#動機
RaspberryPiにPidoraをインストールしたブツに、Pythonが欲しくなったので、作りました。

#仕様
* すべて,```/opt```にぶち込みます。
* 終了後の掃除動作までは作ってないです。(Raspberry Piがいつ落ちるかわからないため)

#動作確認環境
* Raspberry Pi 1 Model B+
* Pidora release 2014 (Raspberry Pi Fedora Remix)  URL:http://pidora.ca/

#ソースコード
bashスクリプトです。
必要になったら、他の機能を追記します。

```bash:install_python
#!/usr/bin/env bash

VERSION=3.6.0

yum groupinstall "Development tools" -y
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel -y

cd /opt/
curl -O https://www.python.org/ftp/python/${VERSION}/Python-${VERSION}.tgz
tar zxf Python-${VERSION}.tgz

cd Python-${VERSION}
./configure --prefix=/opt/local
make && make altinstall
```

#参考
http://qiita.com/a_yasui/items/5f453297855791ed648d
ターミナルを1から10まで覚えたいわけじゃないノンプログラマーのための最も無駄のないGulp導入手順

##まず前提に...
この記事はほとんど自分向けメモです！
Gulp導入の記事はあるけどもっと必要最低限の情報に絞られた記事が欲しいと思い自分で書きました。

###この記事が役に立つかもしれない人
- 以前一度でもGulpを導入したが手順を思い出すのがだるい
- 今まで導入したことないが、JSとかコマンドラインとか深く知らんでいいからとにかく使いたいんや、早く！
- コピペ！コピペ！コピペ！

では、淡々と書きます。

##Gulp導入手順

###Node,jsのインストール
####サイトから落とす
[Node.js](https://nodejs.org/ja/)

####コマンドラインの起動
- Windows:コマンドプロント
- Mac:ターミナル

####Node.jsのバージョンを確認する場合(必要なければとばして良い)


```
node -v
```

###Gulpをグローバルにインストール

```
npm install -g gulp-cli
```

###プロジェクトの初期設定をする
####プロジェクトフォルダへ移動
Windowsの場合

```
cd C:¥Users¥MyName¥フォルダ名
```

Macの場合

```
cd /Users/MyName/フォルダ名
```

Macの場合`cd ドラッグ＆ドロップ`でも可能

####package.jsonファイルを作成

```
npm init
```

プロジェクト名やらなんやら設定が出てくるから必要なら設定

*私の場合MacOSでプロジェクト名に半角大文字を使っていてエラーが出ました(Windowsは知りません)、元々のプロジェクト名から変更しましょう。*

###プラグインをインストール

```
npm install --save-dev プラグイン名
```

####プラグインはここで探す
[gulp](https://www.npmjs.com/package/gulp)

*後でベタなやつを書いておくかも*

####gulpfile.js作って動かす
コピペ！自動化したいなら`watch()`忘れずに！

*後でもうちょっと書くかも*


###今いるローカル環境にGulpをインストール

```
npm install --save-dev gulp
```

##以上！！！
とりあえず使える準備はできるはず！
ひたすら、コピペしたコマンド叩いてもらったらすぐだと思う。

Gulp自体の説明とか、もっと初期設置の細かな説明はググってみてみたらいいと思うんだ。
AWS Key Management Serviceで暗号化した文字列をNode.jsで復号する


# モチベーション
AWS Lambdaでチャットワークにつぶやく際に使うAPI keyを暗号化したいです。

# 作戦
AWS Key Management Service（以下KMS）を使います。
KMS上に保存したマスターキーでAPI keyを暗号化します。
暗号化したAPI keyはソースコードに埋め込むことが出来ます。
これをNode.jsで復号します。

# 手順
## マスターキーの登録
IAM操作可能なユーザーでマスターキーを登録します。
IAM管理画面の[暗号化キー](https://console.aws.amazon.com/iam/home#/encryptionKeys/)から設定します。

暗号化キーの作成の前に、リージョンの選択してください。
暗号化キーはリージョンごと管理されています。

暗号化キーには識別子として、エイリアスを指定できます。
ここではチャットワークのAPI_KEYなので`chatbot`とします。

暗号化キーには管理できるユーザと利用できるユーザを別々に指定することができます。
Lambdaで使う場合はLambdaの実行ユーザーは、`キーユーザー`として登録するのが良いでしょう。

## awsコマンドの設定
設定していなければ、awsコマンドの認証情報を設定します。

```
~ aws configure
AWS Access Key ID [****************DBSA]: YOUR_AWS_ACCESS_KEY_ID
AWS Secret Access Key [****************X5Ex]: YOUR_SECRET_ACCESS_KEY
Default region name [ap-northeast-1]:
Default output format [text]: json
```

AWS Access Key IDとAWS Secret Access KeyはIAM操作可能なユーザーで作成します。
[Getting Set Up with the AWS Command Line Interface - AWS Command Line Interface](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html#cli-signup)

## 秘密情報（文字列）の暗号化
awsコマンドで文字列`hello_world`を暗号化します。
マスターキーを登録した際のエイリアスを`--key-id alias/chatbot`のように指定します。

```
aws kms encrypt --key-id alias/chatbot --region ap-northeast-1 --plaintext hello_world
```

```
{
    "KeyId": "arn:aws:kms:ap-northeast-1:275624216953:key/c069b141-823a-4756-b973-dce51241b4b2",
    "CiphertextBlob": "AQECAHjf+WkQYtH+9sxLq9RViQWd+oHbIcUOdX1uNHBK2hEXhAAAAGkwZwYJKoZIhvcNAQcGoFowWAIBADBTBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDMI9ixmjyICcSa4+egIBEIAmojl8e63GFxuAUf7ZjzGQl0/R5Noe3E88GwIwYS++KnP5aE0NGHc="
}
```

CiphertextBlobの値が暗号化後の文字列です。

## 秘密情報の復号
### ソースコード

CiphertextBlobの値をBASE64でデコードして、AWS.KMSのdecrypt関数に渡します。

```js:index.js
const AWS = require('aws-sdk')

const CiphertextBlob = 'AQECAHjf+WkQYtH+9sxLq9RViQWd+oHbIcUOdX1uNHBK2hEXhAAAAGkwZwYJKoZIhvcNAQcGoFowWAIBADBTBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDMI9ixmjyICcSa4+egIBEIAmojl8e63GFxuAUf7ZjzGQl0/R5Noe3E88GwIwYS++KnP5aE0NGHc='

new AWS.KMS({
    region: 'ap-northeast-1'
  })
  .decrypt({
    CiphertextBlob: new Buffer(CiphertextBlob, 'base64')
  }, (err, data) => console.log(data.Plaintext.toString()))
```

### 実行

```
node .
```

### 結果

```
hello_world
```

# 補足
今はLambdaで環境変数が使えます。
API keyの保存には、環境変数を使う方がよいかもしれません。
[【アップデート】AWS Lambdaで環境変数を使えるようになりました！！！ ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/aws-lambda-env-variables/)


# 参考
- [AWS Lambdaで使う秘密情報をKMSを使って渡す (with Node.js) - Qiita](http://qiita.com/t_hori/items/d65843356fbf20e71d76)
- [AWS KMSで暗号化した認証情報をAWS Lambda実行時に復号化する(Node.jsでのkms.decrypt使用例) - Qiita](http://qiita.com/na0AaooQ/items/cfd9f2babd2ce604049b)
Behat/Mink のコンテキストを phpspec でテストする


Behat/Mink 用のオレオレコンテキストを作った時に、たとえばエラーになるべきとこでエラーになるかとか、そういうのを phpspec で確認する方法。

テストのためのテストってなんだか無限ループな感じですが、汎用的なエクステンションを作ってて、そのためにテストをしたいのです。

## 前提条件

Behat の WebDriver には以下の2種類を使う。

* Goutte
* Selenium2


## テスト対象のコード

この記事では以下のようなコンテキストがあることを想定しています。

```
	/**
	 * Check http status code.
	 * Example: the HTTP status should be 400
	 *
	 * @param string $expect The HTTP status code.
	 * @then /^the HTTP status should be (?P<expect>[0-9]+)$/
	 */
	public function the_http_status_should_be( $expect )
	{
		$status = $this->getSession() ->getStatusCode();
		$this->assertSame( $status, intval( $expect ), sprintf(
			'The HTTP status is %1$s, but it should be %2$s',
			$status,
			$expect
		) );
	}
```

`*.feature` に以下のような感じの記述をして期待通りのステータスコードが戻ってくるかを確認するためのコンテキストです。

```

  Scenario: Check http status code

    When I am on "/"
    Then the HTTP status should be 200

    When I am on "/the-page-not-found"
    Then the HTTP status should be 404
```

## Spec ファイルの記述

以下のテストは、本来 200 であるはずの URL にアクセスした時に 404 であるべきと指定したら例外が戻ってくるかを確認しています。

```php
<?php

namespace spec\VCCW\Behat\Mink\MyExtension\Context;

use PhpSpec\ObjectBehavior;

use Behat\Mink\Mink,
    Behat\Mink\Session,
	Behat\Mink\Driver\GoutteDriver,
	Behat\Mink\Driver\Goutte\Client as GoutteClient,
	Behat\Mink\Driver\Selenium2Driver;

class RawMyContextSpec extends ObjectBehavior
{
	public function it_should_return_exception()
	{
		$this->init_mink( 'goutte' );
		$session = $this->getSession();

		$session->visit( 'http://127.0.0.1:8080/' );
		$message = 'The HTTP status is 200, but it should be 404';
		$this->shouldThrow( new \Exception( $message ) )->during(
			'the_http_status_should_be',
			array( 404 )
		);
	}

	private function init_mink( $driver )
	{
		$mink = new Mink( array(
			'goutte' => new Session( new GoutteDriver( new GoutteClient() ) ),
			'selenium2' => new Session( new Selenium2Driver() ),
		) );
		$mink->setDefaultSessionName( $driver );
		$this->setMink( $mink );
	}
}
```

### ポイント

* `init_mink()` メソッドで Mink インスタンスを作成する。
* `init_mink` の引数 $driver で、どのドライバーを使用するかを指定する。

Mink とかそのドライバーのドキュメントを読めばなんだそんなことかって感じだったんですが、数ヶ月前に挑戦してその時はあきらめたので、やっとできてよかった。
C++ Builder > TClientSocketを使った送信例

```txt:動作環境
C++ Builder XE4
Windows 7 Pro: 送信元
Windows 10 Pro: 送信先
```

TClientSocket を使った送信の例。

```Unit1.cpp
void __fastcall TMainForm::debugB_tcpClick(TObject *Sender)
{
	char zbuf[20] = {0};
	ClientSocket->Host = "192.168.2.7";
	ClientSocket->Port = 2000;
	ClientSocket->Open();

	for(int loop=0; loop<3; loop++) {
		Application->ProcessMessages();
		Sleep(300);
	}

	strcpy(zbuf, "TEST");
	ClientSocket->Socket->SendBuf(&zbuf[0], strlen(zbuf));

	Application->ProcessMessages();
	Sleep(300);

   	ClientSocket->Close();
}
```

送信先(IP:192.168.2.7)には以下のツールを使わせていただきました。
どうもありがとうございます。
[TCP/IPテストツール by のんさん](http://www.vector.co.jp/soft/winnt/net/se411272.html)

### 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6eab41e4-e65a-2395-d423-14b3b7591781.png)

一応動いたが、Sleep()処理などはきちんとは検討していない。

### 備考

TClientSocketを今後使うことはないだろうが、過去のソフトの不具合対策にその振る舞いを確認しないといけない、と理由から今回調べた。

関連: [C++ Builder > TClientSocket の情報 > インストール / 非推奨かどうか / 代替案](http://qiita.com/7of9/items/897eee6f09b6d37af499)
備忘録_ブラウザ利用シェア


ブラウザシェアに関して軽く調べたの備忘録。
あくまでターゲットブラウザの選定の目安程度にする。

***間違っている部分などありましたらご指摘いただけると幸いです。***

## シェアを調べることができるサービス

- [statcounter](http://gs.statcounter.com/)
- [clicky](https://clicky.com/)
- [w3counter](https://www.w3counter.com/)
- [marketshare](http://marketshare.hitslink.com/)


## statcounter

### 計測方法に関して(※ユニークビジター数ではない)
statcounterを使用する多くのサイト(250万サイト以上)にトラッキングコードがインストールされており、そこからのヒット数(PVのイメージ)から導き出されている。

ちなみに、日本でのサンプルサイズに関しては下記の通り
公式より参照 : http://gs.statcounter.com/faq#sample-size

デスクトップ : 約1億5000万
モバイル    : 約5000万

### 日本データページ
http://gs.statcounter.com/#browser-JP-monthly-201511-201611


## clicky

### 計測方法に関して(※ユニークビジター数ではない)
Clicky Web Analyticsが利用されている50万サイト、約500万人のPVか導き出されている

### 日本データページ
https://clicky.com/marketshare/jp/web-browsers/


## w3counter

### 計測方法に関して(※ユニークビジターかどうか不明)
w3counterの無料版Analyticsを利用しているすべてのサイトへのトラフィックに基づいて導き出されている。

### 日本データページ
なし。グローバルデータのみ
https://www.w3counter.com/globalstats.php


## marketshare

### 計測方法に関して(※ユニークビジター数で計測)
marketshareグループに登録されている4万(世界で)を超えるサイトから情報をもとに導き出されている。


### 日本データページ
下記サイトでごにょごにょ。
http://marketshare.hitslink.com/
Amazon Linuxの初期設定

# Amazon Linuxの初期設定の備忘録

## 文字コード

/etc/sysconfig/i18n
の中を

```
LANG=ja_JP.UTF-8
```

に変更し、ログインしなおす

## タイムゾーン

- /usr/share/zoneinfo/Asia/Tokyo を /etc/localtime にリンク

```bash
cp /etc/localtime /etc/localtime.bak
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

- /etc/sysconfig/clock を編集

```
ZONE="Asia/Tokyo"
```

## vim設定

```
set number
set encoding=utf-8
set tabstop=4
set autoindent
set expandtab
set shiftwidth=4
```

## SFTPの操作をログに残す
http://qiita.com/Teppei1224/items/b62e5f1af335a29217e0

## PHPをインストール

```bash

yum install php71.x86_64 php71-cli.x86_64 php71-common.x86_64 php71-json.x86_64 php71-mbstring.x86_64 php71-mysqlnd.x86_64 php71-pdo.x86_64 php71-process.x86_64 php71-xml.x86_64
```

### Composer
```
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
```

設定

```
date.timezone = Asia/Tokyo
session.use_strict_mode = 1
session.gc_maxlifetime = 43200
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
expose_php = Off
```

## MySQLをインストール

- yumリポジトリをインストール

http://dev.mysql.com/downloads/repo/yum/

```
rpm -Uvh mysql57-community-release-el6-9.noarch.rpm
```
/etc/yum.repos.d/mysql-community.repo で、mysql57-community以外のenable=0

- MySQLをインストール

```
yum install mysql-community-client mysql-community-common mysql-community-libs mysql-community-server
```

- 設定

```
character_set_server=utf8mb4
wait_timeout=14400
interactive_timeout=14400
```

- 初期パスワード
/var/log/mysqld.log に書いてある

- セキュリティ
mysql_secure_installation
XamarinでApplication.Currentがnullになった！？

##XamarinのPCL使っているとApplication.Currentがnullになりました。

まず、何がしたかったというとApplication.Current.Propertyを使って数値の保存を行いたかったんです。
しかし、いくらデバッグをしてもCurrentがNullになり、保存、読み込み全てできないのです。

仮に

```csharp:App.cs
using Xamarin.Forms;

namespace Hoge
{
	public partial class App : Application
	{
		private Hoge hoge = new Hoge();
		public App()
		{
			InitializeComponent();

			MainPage = new NavigationPage(hoge)
			{
				BarBackgroundColor = Color.FromRgba(0.2, 0.6, 0.86, 1),
				BarTextColor = Color.White
			};
		}
	}
}

```


```csharp:Hoge.cs
using System;

using Xamarin.Forms;

namespace Hoge
{
	public partial class Hoge : ContentPage
	{

		public Hoge()
		{
			InitializeComponent();

			var hoge = Application.Current.Properties["hoge"];
		}
	}
}

```

があったとすると、Application.Current.Properties["hoge"]でCurrentがnullと言われます。
パッと見は良さげなんですけどね…

解決方は簡単で、App.csを

```csharp:App.cs
using Xamarin.Forms;

namespace Hoge
{
	public partial class App : Application
	{
		public App()
		{
			InitializeComponent();

			MainPage = new NavigationPage(new Hoge())
			{
				BarBackgroundColor = Color.FromRgba(0.2, 0.6, 0.86, 1),
				BarTextColor = Color.White
			};
		}
	}
}

```

にするだけです。Xamarinのタイミングの問題らしく、Appがインスタンス化されてないと、Currentがnullらしいです。
Haxeと定数Enum

イベントを受け取るような処理ってよく書きますよね。

```hx
// こんな感じのコード

event.on("ready", function() {
    // somewhere
});

event.on("close", function() {
    // somewhere
});
```

上記のようなコードで、第一引き数の文字列のイベント名は型で定義してしまいたいところです。

```hx
// 第一引き数をStringではなく、以下のコードのように型で定義したい。

function on(eventName: EventType, cb: Void -> Void) {
    // somewhere
}
```

haxeではこのような問題を`@:enum`と抽象型を利用して解決することが出来ます。

```hx
// このようにイベントの文字列を定義する抽象型を作っておく
@:enum abstract EventType(String) from String to String {
    var ready: String = "ready";
    var close: String = "close";
}
```

```hx
// 文字で指定していたEventTypeに型チェックが効くようになった！

event.on(EventType.ready, function() {
    // somewhere
});

event.on(EventType.close, function() {
    // somewhere
});
```

`EventType.xxx`と記述した箇所はコンパイル時に文字列に変換されます。

この方法を覚えておくと、様々な場所で応用が効いて大変便利です。
clang (MSYS2)

# 前提
MSYS2 がインストール済み。

# インストール
MinGW 64-bit ターミナルで実行。

```
pacman -S git
pacman -S make
pacman -S mingw-w64-x86_64-gcc
pacman -S mingw-w64-x86_64-cmake
pacman -S mingw-w64-x86_64-clang
pacman -S mingw-w64-x86_64-boost
```

# 設定
環境変数を設定。

```
export CC=clang
export CXX=clang++
```