OmniAICreator/Qiita-1.07M huggingface dataset:
windows + docker-compose + rails環境 (rails 5.0.0) を構築する

# windows + docker-compose + rails環境

docker-composeなど入ってる前提です。

## 1 最低限準備するファイル

- Dockerfile
- docker-compose.yml
- Gemfile
- Gemfile.lock(空)

## 2 それぞれのファイルの内容

- Dockerfile (docker-hubの公式railsにある [onbuild](https://github.com/docker-library/rails/blob/9df9b5e6b1519faf22e1565c2caaebf7cc1c665b/onbuild/Dockerfile)を改良)

	※ 公式の物に関しては ONBUILD で bundlerを利用している為、docker-composeにあるチュートリアルのような
	形でrails new などを行おうとすると bundle in bundle 固有のエラーがおこる。[※参照](http://ota42y.com/blog/2015/01/28/bundle-in-bundle/)

```
# FROM rails:onbuild

FROM ruby:2.3

# throw errors if Gemfile has been modified since Gemfile.lock
# RUN bundle config --global frozen 1

# ------- add
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev postgresql-client

# ------ add and modify
WORKDIR /tmp
COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock
RUN bundle install

RUN mkdir -p /usr/src/app
ADD . /usr/src/app
WORKDIR /usr/src/app

# ONBUILD COPY Gemfile /usr/src/app/
# ONBUILD COPY Gemfile.lock /usr/src/app/
# ONBUILD RUN bundle install


# COPY . /usr/src/app

RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*

# pos
# RUN apt-get update && apt-get install -y mysql-client sqlite3 --no-install-recommends && rm -rf /var/lib/apt/lists/*

# EXPOSE 3000
# CMD ["rails", "server", "-b", "0.0.0.0"]
```

	いくつか、ゴミっぽいなと思うファイルとか残ってますが、とりあえずはこの状態で動作するので良しとします。



- docker-compose.yml

	onbuildの中にあったrailsのビルトインサーバーをこちらに記述しています。
	また、postgresコンテナとのリンクを記述してあります。

```
version: '2'
services:
  db:
    image: postgres
    expose:
      - "5432"
    environment:
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/usr/src/app
    ports:
      - "3000:3000"
    depends_on:
      - db

```

	この設定でrails new まで行えた場合はrailsプロジェクト内にある
	config/database.ymlの developmentに

	username: postgres
	password: password
	host: 生成したdbコンテナの名前

	の設定が必要になります。


- Gemfile


```
source 'https://rubygems.org'
gem 'rails', '4.2.6'
```
	
	とか。5.0.0以降の場合は gem 'rails', '>= 5.0.0.beta3', '< 5.1' とか


- Gemfile.lock(空)




## 3 コンテナ作成からプロジェクト作成までの流れ

### 3-1 コンテナイメージの作成

```
docker-compose build

```

### 3-2 rails new . / railsプロジェクトの作成

```
※これでエラーが出る場合
docker-compose run -d web rails new . --force --database=postgresql --skip-bundle
↓
※こちらで対処
docker-compose run -d web bundle exec rails new . --force --database=postgresql --skip-bundle

```


### 3-3 rails new したあとで、再度 docker-compose buildし直す

このままだと gemが色々無いよと言われるので。



### 3-4 /config/database.ymlの修正

	config/database.ymlの developmentに

	username: postgres
	password: password
	host: 生成したdbコンテナの名前


コンテナ名のパターンは、 プロジェクトフォルダの名前に依存してます。
railstest フォルダなら　-> railstest_db_1



### 3-5 docker-compose up

```
docker-compose up
```

これで一度コンテナを立ち上げる。まだdatabaseのcreateとmigrateを実行してないのでもちろん
エラーにはなるが。

docker-compose run -d web bundle exec rake db:setup



### 3-6 finish!
[ANN] Active Sample - Sample functionality for Active Record

https://github.com/JuanitoFatas/active_sample

```rb
User.count # => 0
User.sample => nil

User.count # => 100
User.sample => #<User id: 42, ...>
User.sample(2) => #<ActiveRecord::Relation [#<User id: 1>, #<User id: 42>]>

User.count # => 100
User.sample(200) => #<ActiveRecord::Relation [All Users but shuffled]>
```
コマンドプロンプトで/Cの引数をつけた時のスペースの挙動わけわからん

![assoccmd2.png](https://qiita-image-store.s3.amazonaws.com/0/43608/36797409-c137-0ae5-003f-fdb1b8c9a78b.png)

cLaunch使ってるのですが
コマンドプロンプトを
cLaunchのボタンのパラメータで色々出来るようなので
何かと日付日時を貼り付けることが多いので
この中に仕込んでしまおうと考えたんですが、

# 動かない
日付取得はここから
[【バッチ勉強】現在の日付と時刻をファイル名に指定する方法 | Tipstour](http://tipstour.net/command/8253)

```
set yyyy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%

set time2=%time: =0%

set hh=%time2:~0,2%
set mn=%time2:~3,2%
set ss=%time2:~6,2%
echo %yyyy%-%mm%%dd%-%hh%%mn%%ss%

```

##一行にしてみた

```
/C set yyyy=%date:~0,4%&set mm=%date:~5,2%&set dd=%date:~8,2%&set time2=%time: =0%&set hh=%time2:~0,2%&set mn=%time2:~3,2%&set ss=%time2:~6,2%&echo %yyyy%-%mm%%dd%-%hh%%mn%%ss%
```

でも
>set time2=%time: =0%

の部分がうまく動いてないみたい・・・
スペースの挙動調べてみて
引用符を二重にしたり
バックスラッシュ付けてみたりしたけど
それでもだめ・・・もうお手上げ・・・
Windows環境でChainerのGPUを使えるようにするまで

#はじめに
Windows10(64bit)環境にて、Chainer1.8.1をインストールしGPUで処理させた手順をメモとして残します。
最初、色々設定済みの環境でうまくいってしまったため、他の初期状態PCに設定する際、迷走を極めました。。
他の方の参考になればと思います。

#インストール手順
##1.Python3.5.1のインストール
色々便利なAnacondaをインストールします。
https://www.continuum.io/downloads
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97875/f84e4624-da80-f4cb-61f3-e9ffcbd50506.png)
"PYTHON 3.5"を選択。

##2.VisualStudio 2013 Community をインストール
https://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs.aspx
Visual Studio Community 2013 with Update 5 を選択。
VisualStudio2015 Communityが入っている状態でインストールしても問題ありませんでした。
※visual studioのインストールの際、Common Tools for VC++の項目にチェックが入っていなければ、入れて実行してください。

##3.CUDA 7.5をインストール
VisualStudio2013が入っていることが前提。
https://developer.nvidia.com/cuda-downloads
以下の条件でダウンロードし、実行。
>Operating System : Windows
>Architecture : x86_64
>Version : 10
>Installer Type : exe(local)

##4.cuDNNをインストール
事前にRegistする必要あり。
https://developer.nvidia.com/cudnn
取得したファイルを、” C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5”配下に展開

##5.Pycudaをインストール
以下から、pycuda-2016.1+cuda7518-cp35-cp35m-win_amd64.whlを取得し、インストールを実行
http://www.lfd.uci.edu/~gohlke/pythonlibs/#pycuda
```
[DOS]> pip install pycuda-2016.1+cuda7518-cp35-cp35m-win_amd64.whl
```

##6.Windows環境変数を追加
PATHの**最上位**に、“C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin”を追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97875/05edc237-2c20-beaf-5715-95d9dd7a28d7.png)

##7.Chainerのインストール(DOS上)
###※既にchainerをインストールしている場合は、一度アンインストールを実行
```
pip uninstall chainer
```
###chainerをインストール
```
[DOS]> pip install chainer --no-cache-dir
```

#Chainerのサンプルファイルを実行
chainerをファイルで取得し、c:/temp配下に展開
https://github.com/pfnet/chainer/tree/ver1.8.1
```
[DOS]> cd \temp\chainer-ver1.8.1\examples\mnist
[DOS]> python train-mnist.py --gpu 0
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97875/f6626207-6e7e-071a-376c-687e457e30c6.png)

上記のように表示されれば環境構築は完了です。
optipngを並列(マルチプロセス)で行う

```bash
find . -iname '*.png' -print0 | xargs -0 -n 1 -P 4 optipng -o7
```

* `-P 4` はコア数
* `-o7` はPNG圧縮の最高設定

もしくは `nproc` を使ってコア数を自動で判別させても良い。

```bash
find . -iname '*.png' -print0 | xargs -0 -n 1 -P `nproc` optipng -o7
```


参考
http://stackoverflow.com/questions/21801085/optimize-images-in-directory-using-multiple-cpu-cores
play-jsonでnullの含まれるListをパースする

PlayFrameworkではplay-jsonライブラリを使うことでJsonを簡単にパースすることができますが、今回nullの含まれるListをパースする時に少しはまったのでメモとして残しておきます。

play-jsonに関しては既に色々な方が説明記事を挙げてくださっています。

http://qiita.com/daneko0123/items/1f19f83b943cfd3b8829
http://dev.classmethod.jp/server-side/scala/play-json-5-frequent-patterns/

##環境
* Play2.5.1

##概要
今回、以下のようなnullが含まれるリストをSeq[Option[String]]の型にパースしようとしました。

```json:sample.json
{
 "id":"aaa",
 "age":18,
 "params":[
  "test1",
  null,
  "test2"
 ]
}
```

そこでパース用のクラスとして以下を用意したのですが、コンパイル時にエラーが出てしまいました。

```scala:Sample.scala
case class Sample(id:String, age:Int, params:Seq[Option[String]])

object Sample extends ((String,Int,Seq[Option[String]]) => Sample) {
  implicit val SampleRead: Reads[Sample] = (
    (JsPath \ "id").read[String] and
      (JsPath \ "age").read[Int] and
      (JsPath \ "params").read[Seq[Option[String]]] | Reads.pure(Seq.empty[Option[String]])
    )(Sample)
}

```

```text:error
No Json deserializer found for type Seq[Option[String]]. Try to implement an implicit Reads or Format for this type.
[error]       (JsPath \ "params").read[Seq[Option[String]]] | Reads.pure(Seq.empty[Option[String]])
```

##解決策
自分も完全に理解できているわけではないのですが、read[A]には暗黙的にReads[A]が渡されており、今回read[Seq[Option[String]]]に対応するReads[Seq[Option[String]]]の実装が無かったためエラーが出ていたようです。

というわけで、以下のように実装を追加しました。

```scala:Sample.scala
case class Sample(id:String, age:Int, params:Seq[Option[String]])

object Sample extends ((String,Int,Seq[Option[String]]) => Sample) {
  
  implicit val SeqOpStringRead = new Reads[Seq[Option[String]]] {
    override def reads(json: JsValue): JsResult[Seq[Option[String]]] = {
      json match {
        case JsArray(seq) => JsSuccess(seq.map(jsvalue => jsvalue.asOpt[String]))
        case _ => JsError("Invalid array")
      }
    }
  }

  implicit val SampleRead: Reads[Sample] = (
    (JsPath \ "id").read[String] and
      (JsPath \ "age").read[Int] and
      (JsPath \ "params").read[Seq[Option[String]]] | Reads.pure(Seq.empty[Option[String]])
    )(Sample)
}

```

これでコンパイルは通るようになり、以下のようにパースできました。

```text:parseResult
Sample(aaa,18,ListBuffer(Some(test1), None, Some(test2)))
```

以上です。Scala+Playはまだあまり詳しくないので、間違っている所やもっと良い方法などあれば教えていただけると助かります！
carrierwaveでファイルがアップされない場合のデフォルト画像をセットする

ユーザーがファイルをアップしてくれない場合は多々あります。

そんな場合のデフォルト画像の設定の仕方です。

image_uoploader.rbというファイルを作成してた場合の例です。



public以下フォルダに画像を置いて、かつ複数バージョンを指定している場合

```

class ImageUploader < CarrierWave::Uploader::Base
   version :thumb_300 do
     process :resize_to_fit => [300, 300]
   end

   def default_url
      "/images/fallback/" + [version_name, "default.png"].compact.join('_')
   end
end


```




app/assets以下に置いている場合はこんな感じ

```
class ImageUploader < CarrierWave::Uploader::Base
   version :thumb_300 do
     process :resize_to_fit => [300, 300]
   end

   def default_url
       ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
   end
end

```


とここまではreadmeに書いているのですが、大変はまりました。
何故かと言うと、空画像で投稿してrails consoleで確認しても出ないから。。
rails consoleででないのは普通みたいなので、viewやらで確認しましょう。。
collection_check_boxesでhiddenタグを挿入されないようにする方法

個人的なメモ

railsのフォーム画面で、`collection_check_boxes`を使ってcheckboxのデータを配列で受け取りたかったが、
最後に`hidden`タグが差し込まれるので配列の最後に空の文字列が入り込んでしまっていたので
`hidden`タグが挿入されないようにしたかった。

結論としては以下のように`include_hidden: false`オプションを指定したら良い。

```erb
<%= f.collection_check_boxes :topic_id, Topic.all, :id, :name, include_hidden: false %>
```

ドキュメントにはない模様なので、いつか使えなくなるかもしれないが取り急ぎ。

参考:
http://stackoverflow.com/questions/20744435/by-default-simple-form-collection-check-boxes-displays-hidden-field-at-the-end

ruby: 2.3.1
rails: 4.2.6
Zshのエイリアスの好きなところに引数を取りたい

## 何をしたいのか

例えば、こんな感じでエイリアスの途中に引数を取りたい。

```zsh
alias show-ssl-cert='openssl s_client -connect $1:443 -showcerts'
```

まあ関数定義にしちゃえば解決するんですけども、「これはエイリアスであって、断じて関数ではない」という気持ちのときもあるでしょう。

## 解決する

Zsh では無名関数が使えるようなので、こうします。

```zsh
alias show-ssl-cert='(){ openssl s_client -connect $1:443 -showcerts }'
```

結局関数にするんかい！というのは置いといて、これがaliasであろうことが伝わってきてよいですね。

## きっかけ

[ghq, peco, hubで快適Gitライフを手に入れよう！](http://qiita.com/itkrt2y/items/0671d1f48e66f21241e2)の記事で紹介されていたエイリアスが便利で感動しまして、peco に初期値を渡したいなと思ったのがキッカケです。

```zsh
alias g='(){ cd $(ghq root)/$(ghq list | peco --query "$*") }'
alias gh='(){ hub browse $(ghq list | peco --query "$*" | cut -d "/" -f 2,3) }'
```

## 参考文献

- [zsh で無名関数を作る](http://qiita.com/mollifier/items/5fd61010e711fb7add83)
「Go言語によるWebアプリケーション開発」でハマったところ

[Go言語によるWebアプリケーション開発](https://www.oreilly.co.jp/books/9784873117522/)でハマったところをメモ
##2章
###gomniauthが依存しているパッケージのせいでビルド出来ない。
`brew install bazaar`でうまくいくらしいけど、ダメだったので別の方法を探った。

- エラーコード

```
../../stretchr/codecs/bson/bson_codec.go:5:2: cannot find package "labix.org/v2/mgo/bson" in any of:
```

bsonパッケージが見つからないということなので原因を探ってみると、bsonパッケージのパスが古く新しいパスになっていないことが分かった。[Update bson package path #25](https://github.com/stretchr/codecs/pull/25) ~~プルリクはよマージしろ~~

`'/github.com/stretchr/codecs/bson/bson_codec.go'`のimportを直接いじる。

```bson_codec.go
 import (
  	"github.com/stretchr/codecs/constants"
 -	"labix.org/v2/mgo/bson"
 +	"gopkg.in/mgo.v2/bson"
  )
```

あとは`go get 'gopkg.in/mgo.v2/bson'`でパッケージをインストールでOK
IntelliJ + EditorConfig + erb でインデントがどうにもならない時の解決方法

例えば以下の様な`.editorconfig`をおいた場合、

```toml:.editorconfig
[*]
indent_style = space
indent_size = 2
```

erbが以下のような中途半端なインデントになって気持ち悪くてなんとかしたかった。

```erb:sample.erb
<div>
  ここはインデント2
</div>

<%= form_for @form do |f| %>
    <%= f.text_field(:text) %><%-- なぜかここはインデント4 --%>
<% end %>
```

なんかうまいことやればeditorconfigでなんとかなるかもしれないが、
とりあえずIntelliJの設定画面の
`Editor > Code Style > Other File Types`
の`Tab size`と`Indent`の数字をいじったら解消されることが判明、
一旦それで回避することにしたというメモ。
canvasでお絵かきアプリ


デモ：http://mo49.tokyo/qiita/20160505/

スマホ対応。
色、サイズ、絵文字の変更、消しゴム、デバイスを傾けると全消去機能つき。

```html
<canvas style="background: #f3f3f3" id="canvas"></canvas>
<div id="container">
	<ul>
		<li><input id="btn-color" type="color"></li>
		<li id="btn-eraser" class="btn btn-color" data-color=""><i class="fa fa-eraser" aria-hidden="true"></i></li>
	</ul>
	<ul>
		<li class="btn btn-size" data-size="1">1</li>
		<li class="btn btn-size" data-size="5">5</li>
		<li class="btn btn-size" data-size="10">10</li>
	</ul>
	<ul>
		<li class="btn btn-emoji" data-emoji=""></li>
		<li class="btn btn-emoji" data-emoji="⭐️">⭐️</li>
		<li class="btn btn-emoji" data-emoji="🍀">🍀</li>
		<li class="btn btn-emoji" data-emoji="😊">😊</li>
	</ul>
</div>
```


```javascript
var old_x = 0;
var old_y = 0;
var x;
var y;
var globalCompositeOperation  = 'source-over';
var selectColor = '#000';
var selectSize = 1;
var selectEmoji = '';

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext('2d');

window.onload = function() {
	canvas.height = canvas.width = 300;
	canvas.addEventListener("touchstart", touchStart, false);
	canvas.addEventListener("touchmove", touchMove, false);
	canvas.addEventListener("orientationchange", canvasDelete, true);
}

function touchStart(e) {
	old_x = e.touches[0].pageX;
	old_y = e.touches[0].pageY;
}

function touchMove(e) {
	e.preventDefault();

	x = e.touches[0].pageX;
	y = e.touches[0].pageY;

	drawLine(old_x, old_y, x, y);
	old_x = x;
	old_y = y;
}

function drawLine(x1, y1, x2, y2) {
    ctx.globalCompositeOperation = globalCompositeOperation;
    ctx.strokeStyle = selectColor;
	ctx.beginPath();
    ctx.lineJoin = "round";
    ctx.lineCap = "round";
    ctx.lineWidth = selectSize;
	ctx.moveTo(x1, y1);
	ctx.lineTo(x2, y2);
	ctx.fillStyle = selectColor;
    ctx.font = "20px sans";
    ctx.fillText(selectEmoji, x2-30, y2);
	ctx.closePath();
	ctx.stroke();
}

// 左に傾けると消去
function canvasDelete(e) {
	if (window.orientation >= 90) { // 左に90度 右なら-90度
		var alert = confirm("消去しますか？");
		if (alert == false) {return;}
		var ctx = canvas.getContext('2d');
		ctx.clearRect(0, 0, canvas.width, canvas.height);
	}
}

// 色の変更
$('#btn-color').on('change', function(){
	selectColor = $(this).val();
});

// 消しゴム
var flag_eraser = true;
$("#btn-eraser").on('click', function(){
	if ( flag_eraser ) {
		globalCompositeOperation = 'destination-out';
		flag_eraser = false;
	} else {
		globalCompositeOperation = 'source-over';
		flag_eraser = true; 
	}
});

// サイズの変更
$('.btn-size').on('touchstart', function(){
	selectSize = $(this).data('size');
});

// 絵文字の変更
$('.btn-emoji').on('touchstart', function(){
	selectEmoji = $(this).data('emoji');
});
```

[globalCompositeOperation プロパティ](http://www.html5.jp/canvas/ref/property/globalCompositeOperation.html)
[小学生１万人プログラミング] プログラミング教育の意義〜提供側の考え〜

ツテあってHour of Codeの日本事業局、みんなのコードが主催する小学生１万人プログラミングの東京会場に行ってきた。
2020年から小学校で必修化する「プログラミング教育」について、主催者側ならびにIT関係エンジニアから話を聞けたので、少しまとめる。

# プログラミングを習得してほしい訳ではない

参加した小学生の両親、主催者、協賛企業代表、会場を提供した日本マイクロソフト社の代表等々、全員が共通して答えたのは、「プログラミング技術を習得してほしい訳ではない」ということだ。
詳細な発言はここには書けないが、全員が共通する意識として「プログラムを書く人間と関わらない仕事はない」という未来像があるように思う。プログラミングと聞くとパソコンやスマートフォンのアプリを想像してしまいがちだが、この世のあらゆる製品は今やプログラムによって動いている。
IoTという考え方の登場で、ますますIT技術はその裾野を広げる。どんな業種であってもプログラムと無縁には生きられないというのが共通した意見だった。

以下に会場で聞いた話に加え、私見を交えて記す。

# ITエンジニアと会話するスキル

身の回りを見渡して、電気で動く製品の9割は何らかのプログラムが制御している。そして誰もが一度は思ったことがあると思う。「この端末上で○○ができたらいいのに」と。
そうした思いが実現しつつある動きが本当に多い。
タイムカードや面倒な画面で出退勤を入力せず、パソコン画面上からラインスタンプを送信するだけで出退勤を管理できる。有給の申請もスタンプでできる。こうした技術はすでに現実のものになっている。
CMでも見たことがあるだろう。会社や部署単位で名刺情報を共有し、誰が誰とつながっているかを全体的に把握できる。営業部隊ではこうした協力プレーができるかできないかは命運を分けるかもしれない。

こうした開発は、プログラマーだけではできない。世の大抵のプログラマーは会議や営業といった業務が嫌いだし、そうした仕事の苦労がわからない。出退勤の入力が面倒なら自動で入力するプログラムを書けばいい、というのが彼らの感覚だ。

仕事を便利に、世の中を豊かにしたいと思った時、ITエンジニアたちの協力で簡単に実現することは多い。
このとき、ITエンジニアたちがどういった情報を求めているのか。彼らの会話の理由は何なのか。それがわからなければ、協力を求めることもできない。

将来の産業において、プログラム知識は前提となるという意見もあった。
何らかの専門技術とプログラム知識、両方を持って初めて通用するという。ありとあらゆる専門家はプログラムの知識を持ち、プログラムを作る人間と障害なく会話できる必要があるという。

少し暴言になるが、プログラムなんてのは書きたい人間に書かせておけばいいと思っている。ただし、書かせる側はプログラマーが必要な情報を必要な形で提供し、不要な作業を貴重な人員にさせない配慮が欲しい。

# アイデアを生み出すのは誰か

では「○○できればいいのに」と発想できるのはどういう人か。これは私見だが、仕事に従事しているだけの人間にこうした発想は生まれないと思う。
もちろん、まったく発想がないとは言わない。必要は発明の母であり、世の不便を訴える声があるから製品ができる。
ただ、一方で「これは解決できるかもしれない」という感覚がなければ不便を訴える声もあがらない。
本当に多くの人間が、プログラムを効果的に使えば簡単に済むことを躍起になって手作業していることがある。あるいは、意思疎通が取れずに開発された使いにくいプログラムに振り回されている。
こうした不便、不満に対して「こうしてほしい」と声をあげるためには、まずプログラムに何ができるのかを知る必要がある。

# 「プログラムのできること」の感覚が変わる

プログラムは今、さらなる変革の兆しを見せている。機械学習が本格的に産業利用されている。
個人的に、プログラミング手法は手続き型、関数型、オブジェクト型と変化してきたと感じている。経験的に、オブジェクト型への変化は知識や理解という面において教えるのが難しかったと感じているが、一方で「別に関数型でも同じような動きをするプログラム開発は不可能じゃない」という意見も持っていた。
つまり、ITエンジニアに依頼する立場が理解するべき「プログラムでできること」のイメージ像はさして変化しないという意味では、一般的に求められいたプログラム知識は大して変わらないように思う。（実際にはオブジェクト型を使わなければ現実的でない技術も多いとは思うが）

ところがる機械学習は、従来の手法ではまず不可能といっていいかもしれない。そもそも、従来の手法は究極的には人間がどうやったら実現できるかを最初から最後まで考えている。ところが機械学習は人間が考えることを放棄した。私自身、機械学習についてはほとんど知識がないため間違っているかもしれないが、そのように感じている。
「これだけの事象からデータを収集し、良い結果を効率よく叩きだす方法は”たぶん”ある」と思えば、あとは情報収集部分と結果の良し悪しを判定する部分を作り、”たぶん”の中身をプログラム自身が探していく。
こうした手法で実現できる新しい便利な”何か”は、従来の「プログラムのできること」から大きく感覚の異なることのように思う。
また、機械学習は同時に「機械学習には向かない」といった事象も出てくるように思う。（たとえばデータ点数が極めて少ない事例）

こうした意識の変革に付いていく良い学習方法はわからない。ただ確実に言えることは、理解できていなければプログラムは書けないということだ。

# 興味深い意見

少し興味深い意見もあった。「小学校で必修化すれば、大人も学んでくれると思う」という意見だ。
もちろん、小学生にプログラミング学習する機会を与えることも大事だが、社会全体に対して”IT知識不足”を意識して欲しいという。
確かに、これは効果的かもしれない。少なくとも先生はプログラミングを勉強しなければいけない。おそらく、親も多少は興味を持つだろう。
こうした動きが社会全体の機運につながるかもしれない。
iOS アプリ内課金について質問させてください

はじめまして。
質問させてください。

以下のようなiOSアプリを作成しようとしています。

・画面下部にTabViewControllerを使って表示するページを切り替えが行えるようにする
・表示するページはWebViewを利用してWebページを表示する
・WebページはPHPで作成しMySQLにアクセスして動的にページを作成する
・あるタブをタップして表示するページを閲覧するにはiOS側でアプリ内課金を行う
・課金した後にその有料ページを期間限定で表示する
・期間は翌日の２４時までとする
・できればユーザー登録などはしたくない（ユーザーからすると手間がかかるため）

このようなアプリを作成したいのですがアプリ内課金の実装方法について質問させていただきます。
以下の２通りの方法のどちらかで実装しようと考えているのですが、どちらがアップルの審査に受かるかも含めて現実的か、もしくは他にいい方がないかどうかをご教授いただきたいです。

■方法１
・アプリ内課金の方法としては「消耗型」とする。
・課金をするとパスコードなどを発行し、これを購入するという形にする。
・課金後、有料ページの入力欄に発行したパスコードを入力すると有料ページが表示される。
・翌日の２４時以降にパスコードを変更し、初回課金時に発行されたパスコードでは閲覧不可にする。

◇疑問・問題点
・パスコードという形でアップルのプロダクトに登録できるのか？
・アプリ内課金をした後、翌日の２４時まではパスコードが変更にならないため複数回アプリ内課金が行えないように制御する必要があるが、この制御は可能なのか？
・アップルが発行するレシートを確認すれば、期間内にアプリ内課金が既に行われたかどうかを確認できるようなことがどこかのサイトに書かれていたのですがその認識で間違いないか？
・他のデバイスで同じアップルIDでサインインした場合、そのデバイスでもきちんとアプリ内課金が行われたということを保証する必要があるのか？

■方法２
・アプリ内課金の方法としては「非更新購読」とする。
・翌日の２４時までを購読期間として設定してその期間中は何度でも有料ページを閲覧可能にする。

◇疑問・問題点
・「非更新購読」の場合、課金されたかどうかや有効期限などを開発者側（アプリケーションやサーバー）で管理する必要があると参考にしたサイトに書かれていたのですが、これはユーザー登録が必要でどのユーザーがいつ課金したのかをDBで管理する必要があるということでしょうか？

以上。
できれば方法１でいった方がユーザー登録も不要で開発も簡単そうなのですが、どなたかいい方法をご教授願います。
ちなみにアップルデベロッパープログラムに問い合わせたら、アプリ作ってからレビューするといわれました。

■参考にしたサイト
http://qiita.com/kayo_h/items/4adeed1048064d9f41f2

■環境
Xcode7.3
swift2.0
TypeScriptでReact開発をするとPropTypesを書かなくてもよくなりそう


初めてTypeScriptでReact(tsx)を書いてみたのですが、ジェネリクスが上手く使われていて好きな感じでした。

```ts
import * as React from "react";

interface Props {
  count: number;
}
interface State {}

class App extends React.Component<Props, State> {
  render() {
    return (
      <div>{this.props.count}</div>
    );
  }
}
```

通常はReact独自の型定義記法であるPropTypesを書いていくのですが、[DefinitelyTypedの型定義ファイル](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/react/react.d.ts)が良い味を出してくれているおかげで、TypeScriptのエコシステムの範疇でPropTypesやStateの型定義を行うことができます。

実例
----------

どのくらい良い味が出ているかというと、`this.props.`まで書いたときに補完がモリモリ出てきます。

![スクリーンショット 2016-05-05 23.36.18.png](https://qiita-image-store.s3.amazonaws.com/0/2276/6fe83d02-4465-b196-9377-a533241a2b99.png "スクリーンショット 2016-05-05 23.36.18.png")

また、コンポーネントを使う側でもモリモリ補完が利きます。

![スクリーンショット 2016-05-05 23.40.45.png](https://qiita-image-store.s3.amazonaws.com/0/2276/0e1c65d3-6039-6800-6a2b-ca6d8824a16f.png "スクリーンショット 2016-05-05 23.40.45.png")

補完だけではありません。必須の（interfaceで?を付けていない）項目を渡していない場合には、エラーまで出してくれます。

![スクリーンショット 2016-05-05 23.52.39.png](https://qiita-image-store.s3.amazonaws.com/0/2276/83951317-2f5e-6d6a-b860-ca948ca3776d.png "スクリーンショット 2016-05-05 23.52.39.png")

まとめ
----------

控えめに言って最高かよ、という気持ちでした。実行時のワーニングに頼り切りになるPropTypes定義よりも安心感があります（ジャバer並感）。

現場からは以上です。

おまけ
----------

ウォーターセル株式会社では、Reactで仕事がしたいWebエンジニアを募集しています。地球人口100億人時代の食糧問題を解決する礎になるお仕事に興味がある方はご連絡ください。

* http://www.agri-note.jp/recruit/
* https://www.wantedly.com/projects/53479
Server-Sent Eventsでtail -Fっぽいやつ

ブラウザへのPUSH実装を考え、WebSocketを調べていたら、その何倍も手軽に実装できるServer-Sent EventsというAPIがあるということで、tail -Fっぽく、ファイルが更新されたらブラウザに差分をPUSHするスクリプトを書いてみました。

https://developer.mozilla.org/ja/docs/Server-sent_events/Using_server-sent_events

まず、サーバ側。Mozillaのサンプルを参考に、冒頭でContent-Typeを宣言し、１秒毎にファイルの更新をチェックし、最終更新時間(filemtime)が変わっていれば、差分を
`data: ファイルの差分`
という形式で出力します。

```php:test.php
<?php

header("Content-Type: text/event-stream\n\n");

$fname = "test.txt";
$ftime = "";
$ftime_old = "";
$contents = "";
$contents_old = "";

while (1) {
    $ftime = filemtime($fname);

    if( $ftime != $ftime_old ){
        $contents = file_get_contents($fname);
        echo 'data:  '.str_replace($contents_old,"",$contents)."\n\n";
        $contents_old = $contents;
    }

    $ftime_old = $ftime;
    clearstatcache();
    ob_end_flush();
    sleep(1);
}
```

次にブラウザ側。EventSourceオブジェクトを生成し、onmessageハンドラでサーバからPUSHされたデータを読み込み表示します。

```html:index.html
<ul id="eventList"></ul>
<script>
    var eventList = document.getElementById("eventList");
    var evtSource = new EventSource("test.php");

    evtSource.onmessage = function(e) {
        var newElement = document.createElement("li");

        newElement.innerHTML = e.data;
        eventList.appendChild(newElement);
    }
</script>
```
CentOS7にPHP7をyumでインストールする

CentOS7の標準リポジトリのPHPバージョンは5.4です。

PHP7をインストールするには自分でコンパイルする方法もありますが、
ここではyumを使って簡単にインストールする方法を紹介します。

ゴールまでいろいろインストールしていきますが、すでにインストールされているのはスキップで大丈夫です。


##リポジトリ追加
EPELとRemiリポジトリの追加が必要です。
Remiリポジトリ追加のためにはEPELリポジトリ追加が必要なので、先にEPELリポジトリを追加します。

**EPELリポジトリ**

```
# yum install epel-release
```


**Remiリポジトリ**

```
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

※RemiのrpmダウンロードURLは以下から参考にしました。
http://rpms.famillecollet.com/


##PHP7をインストール
```
# yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd
```

##php.iniの場所
vi /etc/php.ini
文字コード/改行コード変換コマンド nkf メモ


## 文字コードを判別する
`--guess`の省略形が`-g`。

```
$ nkf -g test.txt
Shift_JIS
```

## 文字コード変換
オプション

* `-j` : JIS(ISO-2022-JP)
* `-e` : EUC
* `-s` : Shift-JIS
* `-w` : UTF-8(BOM無し)

## 改行コード変換
オプション

* `-Lu` : unix形式(LF)
* `-Lw` : windows形式(CRLF)
* `-Lm` : macintosh形式(CR)

## 実行例
UTF-8に変換する。`--overwrite`でファイルを上書きできる。リダイレクトで同じファイルを指定すると空ファイルになるので注意。

```
$ nkf -w --overwrite test.txt
```
EspressoでRecyclerView内部のViewへのperformやcheckを行う方法

EspressoでRecyclerViewの内部のViewに対してperformやcheckをしたかったので、そのときのworkaroundです。

次のようなMatcher用のメソッドを作ります。

```java
    public static Matcher<View> withIdInRecyclerView(int id, int recyclerViewId, int position) {
        return allOf(ViewMatchers.withId(id), isDescendantOfRecyclerView(recyclerViewId, position));
    }

    public static Matcher<View> isDescendantOfRecyclerView(final int recyclerViewId, final int position) {
        return new BaseMatcher<View>() {
            @Override
            public boolean matches(Object arg) {
                if (arg instanceof View) {
                    View v = (View) arg;
                    View parent = v;
                    while (parent.getParent() != null && parent.getParent() instanceof View) {
                        if (parent.getId() == recyclerViewId && parent instanceof RecyclerView) {
                            RecyclerView.ViewHolder holder = findContainingViewHolder((RecyclerView) parent, v);
                            if (holder != null && holder.getAdapterPosition() == position) {
                                return true;
                            }
                        }
                        parent = (View) parent.getParent();
                    }
                }
                return false;
            }

            @Override
            public void describeTo(Description description) {
                description.appendText("isDescendantOfRecyclerView(")
                        .appendValue(InstrumentationRegistry.getTargetContext().getResources().getResourceEntryName(recyclerViewId))
                        .appendText(",")
                        .appendValue(position)
                        .appendText(")");
            }
        };
    }

    /* このメソッドは最近のRecyclerViewには標準で実装されています。 */
    @Nullable
    public static RecyclerView.ViewHolder findContainingViewHolder(RecyclerView recyclerView, View view) {
        View v = view;
        while (v != null && v.getParent() instanceof View) {
            if (v.getParent() == recyclerView) {
                return recyclerView.getChildViewHolder(v);
            }
            v = (View) v.getParent();
        }
        return null;
    }
```

こうしておくと次のようにシンプルに書けます。

```java
    int position = 123;
    onView(withId(R.id.recyclerview)).perform(scrollToPosition(position));
    onView(withIdInRecyclerView(R.id.button_hoge, R.id.recyclerview, position))
        .perform(click());
```
Crystal入門後編

![title.png](https://qiita-image-store.s3.amazonaws.com/0/43480/b4543e9d-0ef0-7ef0-1cf9-1f162c583474.png)

Crystal を本格的に覚え始めることになったので、
後続のために自分が探した情報を導入資料としてまとめます。
前編後編に分けてまとめます。今回は後編です。

前編を読んでない方はこちらからどうぞ。

[Crystal入門前編](http://qiita.com/tbpgr/items/c70bbdb28824ddbb3a78)

## <i class="fa fa-diamond" style="font-size:1em;"></i> Crystalのバージョン管理
Ruby の rbenv / rvm にあたるのが [crenv](https://github.com/pine/crenv) です。
[anyenv](https://github.com/riywo/anyenv/blob/master/share/anyenv-install/crenv) 経由でインストールすることもできます。

[Ruby 風な静的言語 Crystal の開発環境を crenv で簡単に構築する - pine613 - Qiita](http://qiita.com/pine613/items/54b8d98b8fd416ac73ec)

## <i class="fa fa-cubes" style="font-size:1em;"></i> パッケージ管理
Ruby でいうところの Bundler にあたるのが [Shards](https://github.com/crystal-lang/shards) です。

[Shards - GitHub](https://github.com/crystal-lang/shards)
[Shards - Twitter](https://twitter.com/shardscrystal)
[Crystal のパッケージマネージャー shards の使い方 - pine613 - Qiita](http://qiita.com/pine613/items/e71903532c24cbeb200a)

## <i class="fa fa-wrench" style="font-size:1em;"></i> REPL
Ruby でいうところの irb にあたるのが [icr](https://github.com/greyblake/crystal-icr) です。

```bash
$ icr
icr(0.17.3) > ary = [1, :hoge, "hoge"]
 => [1, :hoge, "hoge"]
icr(0.17.3) > ary.class
 => Array(Int32 | String | Symbol)
icr(0.17.3) > 'a'
 => 'a'
icr(0.17.3) > 'a'.class
 => Char
```

[crystal-icr - GitHub](https://github.com/greyblake/crystal-icr)

## <i class="fa fa-chrome" style="font-size:1em;"></i> Web Application Framework
Ruby でいうところの sinatra にあたるのが [Kemal](http://kemalcr.com/) です。

[Kemal Official](http://kemalcr.com/)

## <i class="fa fa-book" style="font-size:1em;"></i> ライブラリ
Crystal の有力ライブラリは下記にて紹介されています。

[awesome-crystal](https://github.com/veelenga/awesome-crystal)

## <i class="fa fa-newspaper-o" style="font-size:1em;"></i> Crystal情報
### <i class="fa fa-diamond" style="font-size:1em;"></i> Crystal for Rubyists
Crystal版SinatraことKemalの作者がまとめたRubyistがCrystalに入門する際に読む資料。
プロジェクトの作成、テスト、FizzBuzzをお題にしたTDD、オーバーロードなど分かりやすくまとまっています。

[Crystal for Rubyists](http://www.crystalforrubyists.com/book/index.html)

### <i class="fa fa-calendar" style="font-size:1em;"></i> 2015 Advent Calendar
[Crystal Advent Calendar 2015](http://www.adventar.org/calendars/800)
[Ruby脳にはCrystalつらい Advent Calendar 2015](http://qiita.com/advent-calendar/2015/crystal-for-rubyist)

### <i class="fa fa-question-circle" style="font-size:1em;"></i> Qiita
[Qiita の Crystal タグ](http://qiita.com/tags/crystal)
カンマ付き数字かどうかチェックする正規表現

指数とかには対応していませんが...。

## サンプル
```js
var reCommified = /^((?:[+\-]?0)|(?:[+\-]?[1-9][0-9]{0,2})(?:,\d{3})*)(?:\.(\d+))?$/;
var numString = "-123,456,789.1234";

var matched = numString.match(reCommified);

console.log(matched); //=> ["-123,456,789.1234", "-123,456,789", "1234", index: 0, input: "-123,456,789.1234"]
```
apt-get updateエラーの対応

#目的
・ubuntu(14.04)環境下で、apt-get updateでエラー対処メモ

#エラー例
##/bootディスクがいっぱい
apt-get install -fとかでやると、以下のエーラがでる
>failed to write (No space left on device)
No apport report written because the error message indicates a disk full error

ディスク容量を見るコマンドで、中身を見てみると、確かにいっぱい。特に/boot。
``` df -h
```

![image](https://qiita-image-store.s3.amazonaws.com/0/77499/5bc54d65-303e-d25f-d51f-db469d6a45e0.png)

このbootの中身を見ると、類似のデータが多そう
![image](https://qiita-image-store.s3.amazonaws.com/0/77499/f00b73ae-9d33-ac4b-6e99-e05a6cb045a9.png)
ということで、真ん中の数字が-3.19.0-4*のデータを全て、別のディレクトリに移動した。

移動後、以下のコマンドを実行
```sudo apt-get install -f
```
問題なく実行出来た


##ppaインストール問題
>Err http://ppa.launchpad.net trusty/main amd64 Packages 404  Not Found

```sudo vi /etc/apt/sources.list.d/ubuntu-audio-dev-ppa-trusty.list
```
リストから、１行目をコメントアウト
```# deb http://ppa.launchpad.net/ubuntu-audio-dev/ppa/ubuntu trusty main
```

##Chrome側インストール問題
>W: There is no public key available for the following key IDs:             1397BC5364

以下のコマンドを実行して解決
```wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -```
VSCodeでPythonをデバッグする

# 準備
## インストール
[Python公式ホームページ](https://www.python.org/)
上記のリンクからPythonをインストールする

## 拡張機能のインストール
[Python](https://marketplace.visualstudio.com/items?itemName=donjayamanne.python)
コマンドパレッド(Ctrl+P)を押して、下記のコマンドを実行する

```:コマンドパレッド
ext install python
```

# デバッグ

* launch.jsonを開く

A. コマンドパレッド(Ctrl+P)を押して、下記のコマンドを実行する  

```:デバッグパレッド
> debug: Open launch.json
```
B. デバッグサイドバーのlaunch.jsonボタンを押す  
![image](https://qiita-image-store.s3.amazonaws.com/0/66029/b82236d1-7574-7819-5269-dde705a07833.png)  

* 構成の選択に"Python"を入力する  
![image](https://qiita-image-store.s3.amazonaws.com/0/66029/949900a5-a7dc-17f3-7d36-edb1df53cfdb.png)


作成されたlaunch.jsonファイル

```json:.vscode/launch.json
{
	"version": "0.2.0",
	"configurations": [
		{
			"name": "Python",
			"type": "python",
			"request": "launch",
			"stopOnEntry": true,
			"program": "${file}",
			"debugOptions": [
				"WaitOnAbnormalExit",
				"WaitOnNormalExit",
				"RedirectOutput"
			]
		},
.... 省略
```


|オプション|引数|
|:--|:--|
|"program": "${file}"|現在アクティブになっているファイルを開始します|
|"program": "${workspaceRoot}/file.py"|ルートにあるfile.pyを開始します|

launch.json を編集後、F5でデバッグを開始します
![image](https://qiita-image-store.s3.amazonaws.com/0/66029/7958ea6b-5955-2cb9-ef67-b61b829a6018.png)


# launch.jsonのオプション

※いい加減な翻訳なので注意してください

|オプション|説明|
|:--|:--|
|program|デバッグ対象のPythonファイルのパス|
|pythonPath|Pythonインタプリタの絶対パス, 複数のバージョンのPythonを使い分けたい場合に使います|
|args|実行に渡される引数|
|stopOnEntry|有効な場合、デバッグ開始時に最初の行で止まります|
|externalConsole|有効な場合、コンソール/ターミナルウィンドウの表示にされます|
|debugOptions|デバッグ用のオプション|
|env|デバッグプロセス用のCustom環境変数を設定するために使います|
ブラウザのリクエストをcURL形式で取得

FirefoxやChromium（またはGoogle Chrome）には、ブラウザが送信したリクエストをcURLのコマンドライン形式でコピーできる機能があります。これを利用することで、シェルスクリプトとcURLを使って、リクエストの自動化も容易に実現できます。

![firefox_copy_as_curl.png](https://qiita-image-store.s3.amazonaws.com/0/102667/1f94f1eb-b398-bc0e-3b80-728fcf542127.png)

<i class="fa fa-download" aria-hidden="true"></i> cURL形式でコピー
------

ブラウザの開発者ツールには、送信したHTTPリクエストを一覧表示できるNetworkタブがあります。各リクエストを右クリックすると「Copy as cURL」というのがあります。これは文字通り、ブラウザが送信したリクエスストをcURLの形式でコピーできます。

例えば [i-beam.org](http://i-beam.org) にアクセスしたときのGETリクエストを、cURLでコピーすると以下のようになります。リクエストヘッダのパラメータは `-H` オプションで渡されます。このリクエストはアクセスするページだけでなく、ユーザエージェントなども設定されます。

```sh
curl 'http://i-beam.org/' -H 'Host: i-beam.org' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'Connection: keep-alive' -H 'If-Modified-Since: Sun, 28 Feb 2016 11:54:45 GMT' -H 'Cache-Control: max-age=0'
```

<i class="fa fa-magic" aria-hidden="true"></i> Basic認証の自動化
------

Basic認証が設定されているページは、認証情報をリクエストヘッダの `Authorization` に設定します。cURLでもリクエストヘッダを設定することで、Basic認証に成功できます。Basic認証が求められるページは、[こちら](https://htaccess.cman.jp/sample/basic.html)などからどうぞ。ブラウザ認証後のページを開き、そのリクエストをcURL形式して実行すると、ターミナルからもBasic認証できるのが確認できます。

<i class="fa fa-sign-in" aria-hidden="true"></i> ブラウザのセッションにログイン
------

HTTPはステートレスなプロトコルです。Webサイトのログイン状態を維持するには、セッションがサーバで記憶され、セッションIDがブラウザのクッキーで記憶されます。ブラウザはリクエストヘッダにセッションIDを付与することで、サーバはセッションの照会を行います（[参考](http://qiita.com/hththt/items/07136ad74127999df271)）。cURLを使ったリクエストも、ブラウザが取得したセッションが残っている限り、セッションIDでログイン情報を利用できます[^curl_cookie]。

ログイン時に確認できるページを、cURLでも取得してみます。まずはQiitaログイン後、ルートディレクトリ（`/`）にアクセスするときのリクエストをコピーします。そして次のようにパイプで繋いで必要な情報をgrepします。すると、Qiitaの未読通知数を取得できます。

```sh
curl 'http://qiita.com/' -H ...... | grep -o 'initial_unread_count&quot;:[[:digit:]]*'  | grep -o '[[:digit:]]*'
```

副作用のないページに対しては、容易にcURLで取得できました。しかしデータ更新など副作用のあるリクエストは、まともなサイトでは[CSRF対策](https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/301.html)されているので一筋縄にはcURLはできないです。こういったサイトに対してリクエストを自動化するときは、PhantomJSなどを使うのをおすすめします。


[^curl_cookie]: cURLにも[クッキー](https://curl.haxx.se/docs/http-cookies.html)はありますが、ここでは使用しません。
AngularJSで開発環境やプロダクション環境など複数の環境間で設定を切り替える方法

AngularJSでシングルページアプリケーションを開発しているとき、バックエンドのAPIサーバのURLが環境ごとに異なるため、各環境にデプロイ時にこのURLを切り替えるようにしたい。

例えば、LoopBack.jsはAngularJS用のSDKを自動生成してくれ、そのSDKはエンドポイントURLを`angular.module.config`で設定するようになっている。

```app.js
angular
  .module('app', ['loopbackServices'])
  .config(['LoopBackResourceProvider', function(LoopBackResourceProvider) {
    LoopBackResourceProvider.setUrlBase('http://localhost/api');  // ここでエンドポイントURLを指定する
  }]);
```

はじめこのファイルをデプロイするときは、プロダクション環境のURLに手動で書き換えてからデプロイしていたが、この書き換え処理を自動化する方法を見つけた。

## gulp-ng-constant
Gulpのプラグインである`gulp-ng-constant`を使うと、この設定切り替えを自動化することが出来る。

まず、`gulpfile.js`を以下のように作成する。

```gulpfile.js
var gulp = require('gulp');
var ngConstant = require('gulp-ng-constant');

gulp.task('config', function() {
    var config = require('./config.json');
    ngConstant({
      constants: config[process.env.NODE_ENV || 'development'],
      stream: true,
      name: 'app.config'
    })
      .pipe(gulp.dest('./'));
  }
);
```

次に、環境ごとのエンドポイントURLを`config.json`に記述する。

```config.json
{
  "production": {
    "apiUrl": "http://production.example.com/api"
  },
  "staging": {
    "apiUrl": "http://staging.example.com/api"
  },
  "development": {
    "apiUrl": "http://localhost/api"
  }
}
```

２つのファイルが用意出来たら、以下のコマンドを実行する。

```
$ gulp config
```

すると、カレントディレクトリに`ngConstants.js`というファイルが作成される。

```
angular
  .module("app.config", [])
  .constant("apiUrl", "http://localhost/api");
```

アプリケーション側ではこのモジュールを読み込み、`apiUrl`という変数からエンドポイントURLを取得する。

```app.js
angular
  .module('app', ['loopbackServices', 'app.config'])  // 依存モジュールにapp.configを追加
  .config(['LoopBackResourceProvider', 'apiUrl', function(LoopBackResourceProvider, apiUrl) {
    LoopBackResourceProvider.setUrlBase(apiUrl);  // apiUrlという変数からエンドポイントURLを取得する
  }]);
```

## 環境ごとに切り替える
以下のコマンドを実行すると、エンドポイントURLがステージング環境用に切り替わる。

```
$ NODE_ENV=staging gulp config
```

```ngConstants.js
angular
  .module("app.config", [])
  .constant("apiUrl", "http://staging.example.com/api");
```

プロダクション環境用のエンドポイントURLにしたければ、同様に以下のコマンドを実行する。

```
$ NODE_ENV=production gulp config
```

```ngConstants.js
angular
  .module("app.config", [])
  .constant("apiUrl", "http://production.example.com/api");
```
Macでemacsclientを使う

# 環境

OS: OS X EI Capitan
Emacs: [Emacs for Mac OS X](https://emacsformacosx.com) v24.5

# emacsclientのインストール手順

Emacsのバージョンとemacsclientのバージョンを合わせる必要があるのですが、デフォルトでインストールされているemacsclientのバージョンは古いとおもいます。

```
$ emacsclient -V
emacsclient 22.1
```

Emacsと同じバージョンのemacsclientを~/binにに移動します

```
$ cp /Applications/Emacs.app/Contents/MacOS/bin-x86_64-10_9/emacsclient ~/bin/
```

~/binにPATHを通します

```~/.bashrc
PATH=$HOME/bin:$PATH
```

emacsclientのバージョンを確認します

```
$ source ~/.bashrc
$ emacsclient -V
emacsclient 24.5
```

# 使い方

emacsclientを使う前に、Emacsを立ち上げておく必要があります(emacs-serverを起動するため）

```
# -nw: 現在の端末でファイルを開く(CUI)
$ emacsclient -nw test.txt
# ファイルを編集したら　C-x C-cで編集を終了します
```

# デフォルトのエディタをemacsclientにする

環境変数EDITORにデフォルトのエディタをセットすることができます。
デフォルトのエディタは、`git commit`するときなどに使われます。


```~/.bashrc
export EDITOR="emacsclient -nw" 
```

# 参考

- [emacsclientを使おう](http://syohex.hatenablog.com/entry/20101224/1293206906)
xrdp

xrdpはWindowsからLinuxやBSDにリモートデスクトップ接続できるようにするサーバアプリです。CygwinをX Clientにするより、日本語入力まわりの設定がいらなかったり、きれいなGUI画面で操作ができるのがうれしい感じです。


# インストール

## CentOS7

　CentOS7を「GNOME Desktop」指定でインストールすることが前提です。minimal-installから同じことをしてみましたが、xrdp経由でGnomeにアクセスできませんでした。何かが足りないらしい。
　CentOS7のxrdpはEPEL(エンタープライズ Linux 用の拡張パッケージ)に登録されているため、xrdpをyumコマンドでインストールするためにはEPELリポジトリをインストールする必要があります。

```
$ sudo yum install -y epel-release
$ sudo yum update
```

で、

```
$ sudo yum install -y xrdp
```

xrdpはバックエンドにVNCを使用しているのでVNCサーバをインストールする必要がありますが、CentOS7を「GNOME Desktop」指定でインストールするとtigervnc-serverというパッケージが入っているっぽいので、追加インストールは不要です。

### 自動起動設定

    $ sudo systemctl enable xrdp.service
    $ sudo systemctl start xrdp.service


## トラブルシューティング

### xrdpが起動しない

SELinuxの設定回りの影響らしいです。

    $ sudo chcon -t bin_t /usr/sbin/xrdp
    $ sudo chcon -t bin_t /usr/sbin/xrdp-sesman

を実行した後起動すると解消するはずです。


### ファイアウォールの設定

```
$ sudo firewall-cmd --permanent --zone=public --add-port=3389/tcp
$ sudo firewall-cmd --reload
```

CentOS7のデフォルト設定では、RDPで使用する3389番ポートをブロックしているので、ブロックを解除する必要があります。とりあえず、

    $ sudo iptables -F

でも用は足りると思います。。。
現在のファイアウォールの設定は、

    $ sudo firewall-cmd --list-all-zones

または、

    $ sudo iptables -L

で確認できます。


### ログインしてもエラーが表示されるだけでログイン画面に戻ってしまう。

画面の色深さ設定の問題らしいです。
/etc/xrdp/xrdp.iniでmax_bppを24に変更すると直るはず。

    max_bpp=32
    ↓
    max_bpp=24


## GUIを日本語表示にしたい

/etc/xrdp/startwm.shで「export LANG=$LANG」の下あたりに「export LANG=ja_JP.UTF-8」を追加すると、次のxrdp起動からGUIが日本語表示になります。デフォルトは英語みたいです。

    #. /etc/environment
    #export PATH=$PATH
    #export LANG=$LANG
    export LANG=ja_JP.UTF-8


## 画面解像度を変えたい

通常の画面解像度変更と同じように

    アプリケーション ⇒ システムツール ⇒ 設定 ⇒ ディスプレイ

から変更できます。


## 謎なところ

- xrdp起動後の初回ログイン時に、「カラーマネージメントされたデバイスを作成するには認証が必要です。」が表示されます。
「違い」がわからない私には、パスワードを入力しても、キャンセルしても、見同じ動きをしているように見えてしまう。。。

- minimal-installからtigervnc-serverの設定までやってみましたが、リモートデスクトップからはGnomeが見えませんでした。この辺は後々、DebianやBSDいじるときに調べてみようと思います。
関数の引数がT * const&とT const* const&では結果が変わるという話

#関数の引数がT * const&とT const* const&では結果が変わるという話

###コード
```cpp
#include <iostream>

template <typename T>
void f(T const&)
{
  std::cout << "f<T>()" << std::endl;
}
template <typename T>
void f(T const* const&)
{
  std::cout << "f<T*>()" << std::endl;
}

template <typename T>
void g(T const&)
{
  std::cout << "g<T>()" << std::endl;
}
template <typename T>
void g(T * const&)
{
  std::cout << "g<T*>()" << std::endl;
}

int main()
{
  int a{0};
  f(a);
  f(&a);
  g(a);
  g(&a);

  std::cout << std::endl;

  int const b{0};
  f(b);
  f(&b);
  g(b);
  g(&b);
}
```

###実行結果
```
f<T>()
f<T>()
g<T>()
g<T*>()

f<T>()
f<T*>()
g<T>()
g<T*>()
```


##まとめ
特に何も考えずにconstつけててハマった
どこにでもconstを付けてると望んだ実行結果にならないこともある
Ruby の Set#add? を思い出そうとあれこれ見てたら Set の中身が Hash だという事も思い出した

すっきり。

```ruby:github.com/ruby/ruby/blob/trunk/lib/set.rb#L320-L322
  def add?(o)
    add(o) unless include?(o)
  end
```

```ruby:github.com/ruby/ruby/blob/trunk/lib/set.rb#L214-L216
  def include?(o)
    @hash[o]
  end
```

```ruby:github.com/ruby/ruby/blob/trunk/lib/set.rb#L312-L315
  def add(o)
    @hash[o] = true
    self
  end
```

```ruby:github.com/ruby/ruby/blob/trunk/lib/set.rb#L82-L92
  def initialize(enum = nil, &block) # :yields: o
    @hash ||= Hash.new(false)

    enum.nil? and return

    if block
      do_with_enum(enum) { |o| add(block[o]) }
    else
      merge(enum)
    end
  end
```
xpathに関するメモ書き

xpathに関するメモ書きです。

#ローケーションパス
![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/123138/6d5492d4-6014-b687-1cd2-c2026dde13cc.png)

![名称未設定 2.png](https://qiita-image-store.s3.amazonaws.com/0/123138/d3339931-feae-c5af-2c4a-2a97cda5f933.png)


#関数
![名称未設定 4.png](https://qiita-image-store.s3.amazonaws.com/0/123138/3e2ad920-fce8-59cf-afe6-5bc5d0a9e6bb.png)


![名称未設定 3.png](https://qiita-image-store.s3.amazonaws.com/0/123138/0e301c6f-fa21-dba6-3a36-1adc2ea25a40.png)


#サンプル


```java
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

// 指定ノードの取得（名前空間無視）
Node targetNode = (Node)xpath.evaluate("//*[local-name()='ProductID']", doc, XPathConstants.NODE);
			
// 指定ノードの取得（名前空間有効）
Node targetNodeWithNS = (Node)xpath.evaluate("//*[local-name()='ProductID' and namespace-uri()='nms:xml.go.jp:schema']", doc, XPathConstants.NODE);
			
// 指定ノードの子ノードリスト
NodeList childNodeList = (NodeList)xpath.evaluate("child::node()", targetNode1, XPathConstants.NODESET);

// 指定ノードの子ノードリスト（簡易表記）
NodeList childNodeList_simple = (NodeList)xpath.evaluate("./node()", targetNode1, XPathConstants.NODESET);

// 指定ノードの親ノード
NodeList childNodeList = (NodeList)xpath.evaluate("parent::node()", targetNode1, XPathConstants.NODESET);

// 指定ノードの親ノード（簡易表記）
NodeList simpleChildNodeList = (NodeList)xpath.evaluate("..", targetNode1, XPathConstants.NODESET);
			
// 祖先ノードリストの取得
NodeList ancestorList = (NodeList)xpath.evaluate("ancestor::node()", targetNode1, XPathConstants.NODESET);
```
vagrantの仮想マシンからscpでファイルをローカルに転送する


#1.OpenSSHの設定を行う
VagrantfileがあるディレクトリでOpenSSHの設定を行います

```:Vagrantfileのあるディレクトリ
$vagrant ssh-config
```

このコマンドで取得できるファイルをssh.configに書き込みます

```:Vagrantfileのあるディレクトリ
$vagrant ssh-config > ssh.config
```

#2.scpコマンドでファイルをローカルに転送させる

```:Vagrantfileのあるディレクトリ
$scp -F ssh.config vagrant@default:/hoge.text ./
```

scp -F ssh.config [vagrant上のファイル] [移動先]

これでいま作業しているディレクトリに*hoge.text*があるはずなので
それをしかるべきフォルダへ移動させて下さい！

vagrantで***rsync-auto***などしている方でしたら使えると思います！

#3.参考

vagrantのrsyncについて
http://www.1x1.jp/blog/2014/03/vagrant-rsync-synced-folder.html

OpenSSHについて
http://www.unixuser.org/~euske/doc/openssh/book/chap1.html
Akka の NotUsed, Done について

akka stream で今まで Unit 型だったところに NotUsed が使われるようになっていることに気づきました。なぜ変わったのか調べたところ、 [akka stream の Migration Guide 2.0.x to 2.4.x](http://doc.akka.io/docs/akka/2.4.6/scala/stream/migration-guide-2.0-2.4-scala.html#akka_Done_and_akka_NotUsed_replacing_Unit_and_BoxedUnit) に書いてありました。

Java からも使える Unit のようなものとして `akka.NotUsed` と `akka.Done` が導入されたということです。 akka は Java からも使えるように設計されているので、Scala と Java で同じ型のほうが良いということなんでしょうね。生成される値に興味が無い場合に NotUsed を、完了を待つときに実際の値がないときに Done を使うとのことです。

`akka.NotUsed`, `akka.Done` は [この pull request](https://github.com/akka/akka/pull/19518) で追加されました。
Source, Flow, Sink で Unit/BoxedUnit が使われていた箇所は NotUsed に一括置換されたようです。 Done の方は Future の型パラメータとして Unit/BoxedUnit の代わりに使われています。
ブラウザ試験のお供　旧modern.IE

ブラウザ試験って大変ですよね、古いバージョンのブラウザとかみんなどうやって用意してるんでしょうか？
特に、ＩＥはバージョン毎にくせが強くてきちんと表示が出るか調べる環境を作るだけでも大変です。
そんな時、[Microsoft Edge Developer Resources](https://developer.microsoft.com/ja-jp/microsoft-edge/)が使えそうなのでメモメモ
以前は　modern.IE　ってなまえだったような気が...ころころＵＲＬ変えるのやめてほしいな
取り合えず、メモ程度


#[仮想マシン](https://developer.microsoft.com/ja-jp/microsoft-edge/tools/vms/windows/)
検証用の仮想マシンを無料でダウンロードできます。ローカル環境でのMicrosoft Edge、IE6 ～ IE11の検証にお役立てください。

#[RemoteIE](https://developer.microsoft.com/ja-jp/microsoft-edge/tools/remote/)
Windows、Mac、iOS、Android、Windows Phoneなどに検証用のリモートデスクトップを構築できるAzure Remote Appを無償で提供しています

#[スクリーンショットの生成](https://developer.microsoft.com/ja-jp/microsoft-edge/tools/screenshots/)
Webサイトが実際にどうレンダリングされるのかを9種類のブラウザとデバイスでご確認いただけます。

#[クイック サイト スキャン](https://developer.microsoft.com/ja-jp/microsoft-edge/tools/staticscan/)
URLを入力するだけで、相互運用性やアクセシビリティ、レイアウトの問題を自動的に検出し、修正点を提案するサービスです。
jQuery UI の draggable とdropppable でドラッグ吸着

#概要
jQuery UI の draggable とdropppable でドラッグ＆ドロップ式のクイズのようなものをつくろうとしたら、意外と手間がかかったのでメモ。
ひとまず、判定ロジックなどは入っていません。

##デモ
http://jsdo.it/tsunet111/kcZ2H

##コード


```html:HTML
<div class="container">
    <div id="drop1" class="drop"></div>
    <div id="drop2" class="drop"></div>
    <div id="drop3" class="drop"></div>
    <div id="drag1" class="drag">A</div>
    <div id="drag2" class="drag">B</div>
    <div id="drag3" class="drag">C</div>
</div>
```

```js:JavaScript
var defaultPosiArr,nowDragObj;
$(document).ready(function(){
    //初期位置記録
    defaultPosiArr = new Array();
    for(var cnt=1;cnt<=3;cnt++){
        defaultPosiArr[cnt] = $('#drag'+cnt).position();
    }
    
    //ドラッグオブジェクト設定
    $('.drag').draggable({
        //この下２行の記述で、ドラッグしているものが前面に表示される
        stack:'.drag',
        zIndex:10,
        start:function(){
            //今ドラッグしているオブジェクトを格納しておく
            nowDragObj = $(this);
        },
        revert: function(event, ui){
            var num = Number($(this).attr('id').split('drag').join(''));
            
            //ドロップターゲットに吸着しない場合は初期位置に戻す
            $(this).data('ui-draggable').originalPosition = {
                top: defaultPosiArr[num].top,
                left: defaultPosiArr[num].left
            };
            
            return !event;
        }
    });
    
    //ドロップオブジェクト設定
    $('.drop').droppable({
        drop: function( event, ui ) {
            //ドロップされたら吸着する
            var dropposi = $(this).position();
            nowDragObj.css('top',(dropposi.top)+'px');
            nowDragObj.css('left',(dropposi.left)+'px');
        }
    });
});
```

※ 他に、jQuery と jQuery UI を読み込んでいます。

```css:CSS
.drag{
    background:#CC0000;
    width:50px;
    height:50px;
    position:absolute;
    left:50px;
    cursor:pointer;
}

#drag1{
    top:50px;
}
#drag2{
    top:110px;
}
#drag3{
    top:170px;
}

.drop{
    background:#CCCCCC;
    width:50px;
    height:50px;
    position:absolute;
    left:120px;
}

#drop1{
    top:50px;
}
#drop2{
    top:110px;
}
#drop3{
    top:170px;
}
```
CentOS7のlocale変更

vagrant上のCentOS7が突然日本語でなくなってしまったので、修正メモ。

#　タイムゾーン

```
[root@localhost ~]# date
Mi 25. Mai 13:13:39 CEST 2016
```

どこのこれなんでこうなった・・・
修正!

```
[root@localhost ~]# cp /usr/share/zoneinfo/Japan /etc/localtime
cp: „/etc/localtime“ überschreiben? y
[root@localhost ~]# date
Mi 25. Mai 20:14:21 JST 2016
```

JSTになったよお！

# locale

```
[root@localhost ~]# locale
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
```

なんのこっちゃ。おどいつ語だそうですよ。

使えるlocale調べるよ。

```
[root@localhost sysconfig]# localectl list-locales
aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
aa_ER.utf8
aa_ER.utf8@saaho
aa_ER@saaho
aa_ET
aa_ET.utf8
以下略
```

日本語だけ調べてみる。

```
[root@localhost sysconfig]# localectl list-locales | grep -i ja
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
```

日本語に直す！

```
[root@localhost sysconfig]# localectl set-locale LANG=ja_JP.utf8
[root@localhost sysconfig]# cat /etc/locale.conf
LANG=ja_JP.utf8
```

その後再ロングイン。


現在のlocale等の確認

```
[vagrant@localhost ~]$ date
2016年  5月 25日 水曜日 20:18:39 JST
[vagrant@localhost ~]$ localectl status
   System Locale: LANG=ja_JP.utf8
       VC Keymap: de
      X11 Layout: de
```

？？？　Keymapってなんぞ。
とりあえず変えてみる。

```
[vagrant@localhost ~]$ localectl set-keymap jp106
==== AUTHENTICATING FOR org.freedesktop.locale1.set-keyboard ===
Authentication is required to set the system keyboard settings.
Authenticating as: root
Password: 
==== AUTHENTICATION COMPLETE ===
```

再度localeの確認。

```
[vagrant@localhost ~]$ localectl status
   System Locale: LANG=ja_JP.utf8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```

とりあえずここまで・・・・・・


***
参考
http://weblabo.oscasierra.net/vagrant-centos6-japanize/
http://zero-config.com/centos/changelocale-002.html
http://qiita.com/sue71/items/64c513ae181e9f7aa8f4
C > カンマ区切り文字列の項目分割 > extractCsvRow()の実装

```txt:動作環境
組込みC (MSP430)
```

strcpy()くらいある状況でカンマ区切り文字列から各項目を取出すextractCsvRow()を実装してみた。

## code v0.1

http://ideone.com/AmrfcF

```sample.c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

/*
v0.1 2016/05/25
  - add extractCsvRow()
*/

static const char *s_rcvd = "pval,3.141,2.718,6.022"; // dummy data

static bool extractCsvRow(char *srcPtr, int length, int itmidx, char *dstPtr)
{
	char szbuf[20];
	int pos = 0;
	int cntComma = 0;
	
	int idx;
	if (dstPtr == NULL) {
		return false;
	}
	
	for(idx=0; idx < length; idx++) {
		if (srcPtr[idx] == ',') {
			if (cntComma == itmidx) {
				szbuf[pos++] = 0x00;
				strcpy(dstPtr, szbuf);
				return true;
			}
			cntComma++;
		} else {
			if (cntComma == itmidx) {
				szbuf[pos++] = srcPtr[idx];
			}
		}
	}
	
	if (cntComma == itmidx) {
		szbuf[pos++] = 0x00;
		strcpy(dstPtr, szbuf);
		return true;
	}

	return false;
}	

int main(void) {
	bool res;
	static char szbuf[20];
	int idx;
	
	for(idx=0; idx < 4; idx++) {
		memset(szbuf, 0, sizeof(szbuf));
		res = extractCsvRow(s_rcvd, strlen(s_rcvd), idx, szbuf);
		if (res) {
			printf("%s\n", szbuf);
		}
	}

	return 0;
}
```

## 結果

```txt:結果
pval
3.141
2.718
6.022
```

一応動いているが、もう少し見直しが必要かもしれない。

Arduinoなどでやるともっと楽ができる http://qiita.com/7of9/items/ac7737c17c4dacf09bc3

Unityなら http://qiita.com/7of9/items/f6ff497333bf558a5951
ActiveRecordの#sumと#select(sum(..))の違い

```rb
Hoge.group(:foo).sum(:bar)
# { foo => (barの合計) } という形のhashが返る
Hoge.group(:foo).select("foo, sum(bar)")
# Hogeクラスが返る
```

上だとHashなのでlimitやorderが使えないが下だとlimitやorderが使える