OmniAICreator/Qiita-1.07M huggingface dataset:
Goのvendoringを試してみる

# 環境
OS X 10.9.5

# ゴール
GoのVendoring機能を使ってGojiのサンプルを動かす

# 入れたもの
* Go1.6
* glide 0.8.3

# glideって？
パッケージ管理をしてくれるツールです。
プロジェクト単位でパッケージを管理できるようになります。
(なぜGoでパッケージ管理が重要(面倒)になっているかは割愛・・・！)

ただ注意点があります。
GO15VENDOREXPERIMENTが1になっている必要があります。
もしなっていない場合は↓で

```bash
$ export GO15VENDOREXPERIMENT=1
```

# 手順
* glideインストール
* サンプルプロジェクト作成
* glide create
* main処理作成
* パッケージダウンロード
* ビルド
* 起動!!

# glideインストール
```bash
# Homebrewでインストール
$ brew install glide

# 確認
$ glide -v
glide version 0.8.3
```
この時Homebrewが古いとglideも古いバージョンが入ります。
glideのバージョンが古いと用意されていないコマンドがあったりするので、
一度Homebrewをアップデートしてからがいいと思います。


# サンプルプロジェクト作成
```bash
# /tmp下にvendor-testというディレクトリで作業
$ cd /tmp && mkdir vendor-test
```

# glide create
```bash
# 移動
$ cd /tmp/vendor-test

# srcディレクトリ作成
$ mkdir -p src/v1 && cd src/v1

# initialize
$ glide create
```
createすると直下にglide.yamlというファイルができます。
中見るとパッケージ等なにも記述されていません。
(まだmain処理がないので当たり前っちゃ当たり前ですが)

# main処理作成
Gojiのサンプル拝借します！ありがとうGOji！！

```bash
# main.goにサンプル貼付けます
vim main.go
```

貼付けると↓こんな感じになります。

```go:main.go
package main

import (
        "fmt"
        "net/http"

        "github.com/zenazn/goji"
        "github.com/zenazn/goji/web"
)

func hello(c web.C, w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, %s!", c.URLParams["name"])
}

func main() {
        goji.Get("/hello/:name", hello)
        goji.Serve()
}
```

# パッケージダウンロード
GOPATHが設定されていないと怒られます。
export GOPATH=/tmp/vendor-test
を設定してください。

```bash
# パッケージインストール
$ glide get github.com/zenazn/goji
[INFO] Preparing to install 1 package.
[INFO] Importing github.com/zenazn/goji
[INFO] Walking the dependency tree to calculate versions
[INFO] Fetching updates for github.com/zenazn/goji.
[INFO] Scanning github.com/zenazn/goji for dependencies.
[INFO] ==> Unknown github.com/goji/param (github.com/goji/param)
[INFO] Fetching updates for github.com/goji/param.
[INFO] Scanning github.com/goji/param for dependencies.
[INFO] Project relies on 2 dependencies.
[INFO] Writing glide.lock file

# treeで見てみる
$ tree
.
├── glide.lock
├── glide.yaml
├── main.go 
└── vendor
    └── github.com
        ├── goji
　　　　　　・
　　　　　　・
　　　　　　・
```
vendorディレクトリができてる！
そしてその中にGojiのソースがIN！


# ビルド
```bash
# ビルド
$ go build

# tree
$ tree
├── glide.lock
├── glide.yaml
├── main.go
├── v1
└── vendor
    └── github.com
        ├── goji
```
v1ってものが作られた！


# 起動
```bash
# 上で作られたv1を実行します
$ ./v1
2016/02/11 14:03:39.657003 Starting Goji on [::]:8000
```
おぉー起動したー！

実際にアクセスしてみる。
ブラウザからlocalhost:8000にアクセスすると・・・

```text
404 page not found
```
って表示されるので動いている！

先ほど起動したターミナルを見てみると・・・

```text
2016/02/11 14:05:04.275370 [] Started GET "/" from [::1]:50897
2016/02/11 14:05:04.283113 [] Returning 404 in 27.408µs
2016/02/11 14:05:04.577383 [] Started GET "/favicon.ico" from [::1]:50897
2016/02/11 14:05:04.577419 [] Returning 404 in 10.605µs
```
って表示されている。
ゴ〜〜〜〜ル！


# まとめ
glideとvendoring機能を試してみましたが、
結構シンプルにパッケージ管理ができていいなぁと思いました。

ただ・・・
vendoring機能の仕様？でディレクトリ構成によって
vendor下を見に行ってくれなかったです。
(今回でいうとsrc/の下にv1というディレクトリを置く事によって
見にいくようになりました)

というわけで、
まだまだ詳しく調べる必要があるなぁという結果になりました。
(英語ばっかりで読むのに時間かかるんだもん ← 雑魚感)
CentOS / SublimeText2 > 矩形選択 > 1.行頭 / 2.Shift+Alt+下:複数行選択 / 3. Shift+右 / 消す

```txt:動作環境
CentOS 6.5 (64bit)
Sublime Text2
```

CentOS上のSublime Text2にて矩形選択をして複数行の行頭十数文字をまとめて消したい。

以下でできた。

### 複数行の行頭の数十文字を選択

1. カーソルを消したい領域の先頭行の行頭に合わせる
2. Shift + Alt を押しながら、カーソルの下を押して複数行を選択する
3. 複数行選択状態にて、Shiftを押しながらカーソルの右を押して消したい領域を選択する

以上で複数行の選択状態になるのでDeleteキーで一気に削除できる。

### 応用 > 複数行の行末に","を付ける

1. カーソルを変更したい領域の先頭行の行末に合わせる
2. Shift + Alt を押しながら、カーソルの下を押して複数行を選択する
3. `,`を入力する
Surface Pro4とMac Book Proの差を云々する

# 概要

この記事は、ちょっと端末が不足している会社にSurface Pro3を寄付して、新しくSurface Pro4を購入したら、次の会社ではMac Book Proを貸与されたという、ちょっと微妙な状況を明るく乗り越える為にがんばって書いた記事です。

冗談はさておき、両方使ってみると、単なる慣れの問題もあれば、微妙に差がつくポイントも所々に潜んでいたりするので、色々と列挙してみます。

# 比較

## Surface > Mac Book

* 物理的に軽い。
* 日本語変換が軽い。というか、Macのデフォルトの日本語入力の自動変換が重い。
* json -> sonとか意味不明なタイポ修正を、デフォルトではしない。Macは喧嘩売ってるのか。
* 画面を触ると反応する。ペンが使える。
* エクセルが使いやすい。というかMacのOffice365がゴミ。一々カーソル移動がもっさりする。パワポの数式エディタは自動変換とあいまってバカすぎて殺意を覚える。
* スクロールバーがデフォルトでちゃんと出る。スクロールしにくくて困ったりしない。
* HDMIケーブルをつないでも、画面が４回ぐらいパチパチフラッシュしたりしない。

## Mac Book > Surface

* RubyやPythonのインストールができる。Windowsがゴミと言いたくなる気持ちが、結構わかる。
* GWXが出てこない。
* 勝手に再起動しない。一応再起動するか聞いてくる。Surfaceは勝手に再起動することがある。
* 画面がきれい。Surfaceもきれいではあるが、設定をうまくしないと小さすぎたりして結構疲れる。
* デフォルトの画像トリミングツールが優秀。
* デフォルトのキャプチャーツールが優秀。
* タッチパネルがなんとなく使いやすい。Sufraceのタイプカバーの奴よりもいい感じに動く気がする。体感差異の理由は不明。

## その他

* 電源が入っている状態（スリープ）からの起動の速さは体感で変わらない。
* Macで田ﾐ＋E に対応するキーがわからない。
* MacでCtrl + Shift + ESC (タスクマネージャを開く)に対応するキーがわからない。
* Windows10のせいなのかavastのせいなのか、Surface Pro4はPro3よりも不安定になりやすい。iPadとかも含めて、最も起動や動作が安定していたのは、Surface Pro3 + Windows8.1だった。でも十分安定している気はする。
* Fnキーの機能切り替えは、どちらも使える。

# まとめ

基本的にはただの宗教ですが、Macの方が、調教しないと圧倒的に使えない印象です。
Windowsだと、拡張子とか隠しファイルの表示を直すぐらいでもそこそこ使えますが、Macだと予測変換もタイポ修正もスクロールバーも、いろいろ設定を直さないと、ちょっとした入力で相当イライラします。きちんと設定をすると、落ち着いて使う分には快適だと思います。ただ、重いので、持ち歩くとするとSurfaceの方が良いと思います。
Mac Book AirでもSurface Pro4より重く、iPadだと中途半端。。。

持ち歩き＋開発等でも使いたいと思うと、Windowsで良ければSurfaceが今のところ最強なのでは、という気がします。
PythonやRubyを使おうと思うと、DockerとかVMという手もありますが、まあMacの方が無難なのでは。Mac Book族が世に溢れているのは、そういう理由なんでしょうね。
Rに関しては、文字コード周り以外はそんなに困らない印象です。必要に応じてちゃんとiconvすれば、基本問題ないかと。

まあしかし、冷静に考えてみると、Pythonもサーバに繋いだりしてPyCharm(Professional)を使うなら、Windowsでも問題ないような。ううむ。
ASP.NETのセッション管理方法を整理する

# 0.前置き
ASP.NETのにおけるセッション状態の管理方法についてまとめます。
本記事の内容は、ASP.NET 4.6を対象としています。

# 1.セッションの説明
Webアプリケーションを実現するHTTPは状態を持たない（ステートレスな）プロトコルです。そのため、「ユーザーが認証済みであること」や「ページをまたがったデータの管理」をする場合には、どこかでその状態を管理する必要があります。ASP.NETではその管理手法として、クッキー（cookie）、セッション、一時データ（TempDataやViewState）などがあります。

セッションは、サーバーサイドでデータを管理し、クライアントサイドにはそのデータへアクセスするキー（セッションID）のみを提供する（管理はクッキー）手法をとります。そのため、クッキーと比較し改ざんされる危険性が少ないため比較的安全な手法と言えます。

ASP.NETは、このセッションをサーバー上で管理する方法を4つ用意しています。

|管理方法（mode名称）|説明|
|:------:|:--------|
|InProc|インプロセスモード（デフォルトの設定）。セッション情報をIISプロセス（IISアプリケーションプール）上で管理します。IISが再起動した場合は、セッション情報も消失します。簡易的なアプリケーション向け。|
|StateServer|「ASP.NET状態サービス」というWindowsサービスのプロセスで管理します。IISとは別のプロセスで管理するため、IISを再起動したとしても、セッション状態は維持されます。また特定のIISプロセスで管理されていないため、負荷分散の構成（クラスター構成）をとっているような複数台のサーバで共通したセッション管理を行うことができます。|
|SQLServer|SQL Serverのデータベースでセッション状態を管理します。StateServerと同様のメリットがあります。|
|Custom|開発者が定義した方法でセッション状態を管理します。上3つはマイクロソフトが事前に用意した定義です。それ以外の仕組みを利用したい場合には、自身で作成して利用することができます。例えばRedisのようなNoSQLでセッション管理を行いたい場合など。|
|Off|セッション管理を行わない設定。|

# 2.定義方法
どの管理方法を選択するかという定義は、Web.configで行います。設定のサンプルは下記の通りとなります。

```
<configuration>
  <system.web>
    <sessionState mode="StateServer"
      stateConnectionString="tcpip=SampleStateServer:42424"
      cookieless="false"
      timeout="20"/>
  </system.web>
</configuration>
```

MSDNに詳しく説明が載っているので、参考にすると良いです。
[MSDN:セッション状態モード](https://msdn.microsoft.com/ja-jp/library/ms178586(v=vs.100).aspx)

# 3.Custom用のプロバイダを設定する。
独自のプロバイダをいくつか探して設定してみます。
これは別のQiitaで書くつもりです。以下を頑張る予定。

・[ASP.NETのセッション管理にAzure Redis Cacheを使ってみる](http://qiita.com/84zume/items/dfd9180a835b742eb4a3) 
・[AWS DynamoDBを使ったセッション管理](http://qiita.com/84zume/items/7d98f68e2aa78507b1a0)
Cloud 9 IDEでRuby on Rails構築。Rails s でKilledになったときの対処法

# 状況

- Cloud9を使ってRuby on Railsを構築している
- Rails s -b \$IP -p $PORTでkillされる
- テストも失敗する

# 参考
http://stackoverflow.com/questions/27745124/cloud-9-ide-says-killed

## 要するに何を言ってるか
それって実行中の処理がたくさんあるっぽいから、
Cloud9ってそうゆうのダメなんだよね、勝手に止めちゃうんですよ。
（雑に訳したので正確さには欠けますが…）

# 対処法

## **ps -ef.** でプロセスを確認。
なんかたくさんある気がする…

## **kill -9 \`pgrep ruby`** で実行中のプロセスを終了（?）
このコマンドでそういうことができるようです。

## ふたたびrails s ～でプロセスを開始
解決しました！

# ほかの対処法

swap領域を増やす方法があるようなんだけど、試しても成功しませんでした。
https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-12-04

sudo swapon /swapfile のところでundefined（だったかな…）になってしまい行き詰まったところ、git revertで遡ってもダメで、今回ご紹介した方法にたどり着きました。

Ruby初心者なのでなんとも言えませんがメモ程度に記録しておきます。

補足事項や、「じゃあこれ知っとけばいいよ」「解釈違うよ」などあれば、コメントいただけますと幸いです。
【Marionette】CompositeViewをCollectionViewで描画するサンプル


1対Nの関連を持つモデルのコレクションをMarionette.jsで表示する際のサンプルです。ちょっとイメージが湧きにくいので例を挙げると、以下のような感じです。

* クラス
     * 生徒
     * 生徒
     * 生徒
     * ・・・
* クラス
     * 生徒
     * 生徒
     * 生徒
     * ・・・
* ・・・

これをCollectionView,CompositeView,ItemViewを使用して描画します。それぞれのビューが対応するモデル,コレクションは以下の通りです。

* CollectionView ： クラスのコレクション
* CompositeView ： クラスモデル、生徒のコレクション
* ItemView ： 生徒モデル

結果的にMariionette.jsなら簡単に描画できました。コード量がそこそこ多くなってますが、ほとんどがモデルの定義・生成部分であり、本質的なのはビューの定義の箇所だけです。

```javascript:app.js
var Student = Backbone.Model.extend({});

var Students = Backbone.Collection.extend({
  model: Student,
});

var Class = Backbone.Model.extend({});

var Classes = Backbone.Collection.extend({
  model: Class,
});


var StudentView = Marionette.ItemView.extend({
  tagName: 'li',
  template: '#template-student',
});

var ClassView = Marionette.CompositeView.extend({
  template: '#template-class',
  childView: StudentView,
  childViewContainer: 'ul',
});

var ClassListView = Marionette.CollectionView.extend({
  el: '#container',
  childView: ClassView,
  childViewOptions: function(model, index) {
    return {
      model: model,
      collection: model.get('collection'),
      childIndex: index,
    };
  },
});


$(function() {
  var students1 = new Students([
    new Student({ name: 'トム' }),
    new Student({ name: 'マイク' }),
    new Student({ name: 'レベッカ' }),
  ]);
  var students2 = new Students([
    new Student({ name: 'ケン' }),
    new Student({ name: 'ルーシー' }),
  ]);
  var classes = new Classes([
    new Class({ teacher: '山田', collection: students1 }),
    new Class({ teacher: '佐藤', collection: students2 }),
  ]);

  var classListView = new ClassListView({ collection: classes });
  classListView.render();
});
```

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/underscore.js"></script>
    <script type="text/javascript" src="js/backbone.js"></script>
    <script type="text/javascript" src="js/backbone.marionette.js"></script>
    <script type="text/javascript" src="js/app.js"></script>
  </head>
  <body>
    <div id="container"></div>

    <script id="template-class" type="text/html">
      <p>担任：<%= teacher %></p>
      <ul></ul>
    </script>

    <script id="template-student" type="text/html">
      <%= name %>
    </script>
  </body>
</html>
```

ポイントは`app.js`の`childViewOptions`です。単純にCompositeViewを使用する場合は特に難しいことはないのですが、CompositeViewがCollectionViewに描画される場合は、このように`childViewOptions`で子供ビューに渡す`model`,`collection`を指定してあげないと上手くいきませんでした。（これに気付くのに結構ハマった・・・）
ESP-WROOM-02 > PiZeroとの通信 > [調査] ESP8266をI2Cマスターに / UART1_TXD: デバッグ出力用

AdafruitのPiZero contestにおいては、RPiとESP8266(ESP-
WROOM-02)間で通信をしようと考えている。

### マスター ESP8266

方法は以下のものが候補

- SPI
- I2C
- GPIOによる独自プロトコル

![](http://yuml.me/diagram/class/[PiZero]SPI/I2C/独自 -->[ESP8266])


ESP8266を通信の親（マスター）とする場合、SPIは  IO15/IO13/IO12/IO14 を使うことでできそう。ピン数が多いのが欠点。
http://qiita.com/exabugs/items/9d1b66aa1d22805afbc8
[datesheet](http://akizukidenshi.com/download/ds/espressifsystems/0C-ESP8266__WROOM_WiFi_Module_Datasheet__EN_v0.4.pdf)のpage7.

ESP8266をI2Cでマスターにする例はまだ調査中だが、以下の議論を見つけた。
http://tech.scargill.net/esp8266-i2c/

ぱっと使える感じではなさそう。

### マスターPiZero

こちらなら可能だが、いいかは不明。
自分が考えているコンセプトではマスターESP8266が近い。
![](http://yuml.me/diagram/class/[PiZero]SPI/I2C/独自 <--[ESP8266])

### UART0を使う

ESP8266のUART0を使うというのでもいいかもしれない。
![](http://yuml.me/diagram/class/[PiZero]UART0 -->[ESP8266])

そのとき、デバッグ情報の出力はどうかとなるが、UART1が使えるのかもしれない。

- IO2 : GPIO; UART1_TXD 

データシートのp12に以下の記載がある。

> Debugging: UART1_TXD (GPIO2) can be used to print debugging information.
配列の差分をとりたい

`Array#-`があるけれど、

```ruby
[ 1, 1, 1, 2, 2, 3, 3 ] - [ 1 ]
# => [2, 2, 3, 3]
```

となり、左配列から、右配列に含まれる要素をすべて取り除いた配列が返る。
重複要素がありえるようなリストの差分を取る(つまり、集合演算ではない)ときにはちょっと使いにくい。
以下のように、引数要素の個数を考慮して差分をとりたい。

```ruby
[ 1, 1, 1, 2, 2, 3, 3 ].remove [ 1 ]
# => [1, 1, 2, 2, 3, 3]
```

というわけで書いた。メソッド名にあまり良い名前が思い浮かばなかった。。。

```ruby
class Array
  def remove r, reverse: false
    r = r.dup
    a = dup
    b = []

    a.reverse! if reverse
    a.each do |item|
      i = r.find_index item
      if i
        r.delete_at i
      else
        b << item
      end
    end
    b.reverse! if reverse
    b
  end
end
```

引数要素の個数を考慮して差分をとった配列を返す。

```ruby
[ 1, 1, 1, 2, 2, 3, 3, 1 ].remove [ 1 ]
# => [1, 1, 2, 2, 3, 3, 1]

[ 1, 1, 1, 2, 2, 3, 3, 1 ].remove [ 1 ], reverse: true
# => [1, 1, 1, 2, 2, 3, 3]
```

2つのリストを合わせるときにも便利に使える（ような気がする）。

```ruby
a = [1,2,3,3,4,4]
b = [2,4,4,7,9]

a + b           #=> [1, 2, 3, 3, 4, 4, 2, 4, 4, 7, 9]
a | b           #=> [1, 2, 3, 4, 7, 9]
a + b.remove(a) #=> [1, 2, 3, 3, 4, 4, 7, 9]

a & b                #=> [2, 4]
a.remove a.remove(b) #=> [2, 4, 4]
```
Goのバージョンを1.6rc2にアップデートしてみた

# 環境
* OS X 10.9.5

# 1.6を入れるにあたって
1.5からそうですがGo1.4が必要です
それを踏まえての流れは↓

# 手順
* Go1.4をダウンロード
* Go1.4をビルド
* Go1.6rc2をダウンロード
* GOROOT_BOOTSTRAPをセット
* Go1.6rc2をビルド
* PATHを通す

# 各作業について以下の決めのもと行う
* 作業ディレクトリは/tmp/下
* Goを置くディレクトリは/usr/local/下
* Go1.4を/usr/local/go1.4とする
* Go1.6rcを/usr/local/goとする

# Go1.4をダウンロード
```bash
# /tmp下で作業
$ cd /tmp

# ダウンロード
$ curl -O https://storage.googleapis.com/golang/go1.4.3.src.tar.gz

# 解凍
$ tar xzvf go1.4.3.src.tar.gz

# 移動
$ mv go /usr/local/go1.4

# 削除
$ rm go1.4.3.src.tar.gz
```

# Go1.4をビルド
```bash
# 移動
$ cd /usr/local/go1.4/src

# ビルド
$ ./all.bash
```

# Go1.6rc2をダウンロード
```bash
# 移動
$ cd /tmp

# ダウンロード
$ curl -O https://storage.googleapis.com/golang/go1.6rc2.src.tar.gz

# 解凍
$ tar xzvf go1.6rc2.src.tar.gz

# 移動
mv go /usr/local/go

# 削除
$ rm go1.6rc2.src.tar.gz
```

# GOROOT_BOOTSTRAPをセット
```bash
$ export GOROOT_BOOTSTRAP=/usr/local/go1.4
```

# Go1.6rc2をビルド
```bash
# 移動
$ cd /usr/local/go/src

# ビルド
$ ./all.bash
```

# PATHを通す
```bash
# GOROOT
$ export GOROOT=/usr/local/go

# PATH
$ export PATH=$PATH:$GOROOT/bin
```

# 確認
```bash
$ go version
go version go1.6rc2 darwin/amd64
```

これでアップデートできました。
Go1.4が入っている人はGOROOT_BOOTSTRAPを適宜変更すればOKです。

自分はDockerコンテナに↑と同じ手順で入れて使ってます。

Goを使うようになってまだ日が浅いので、
色んなパッケージ見て勉強しなければ・・・
AppVeyorでWindows向けバイナリを作ってGitHub Releasesに公開

[中学2年生のときに作ったスクリーンセーバー](http://folioscope.hatenablog.jp/entry/2016/02/10/210828)を公開しましたが、現在は手元にVisual Studioでビルドする環境がありません。CIでビルドしようと思い調べてみたら、[AppVeyor](https://www.appveyor.com/)という.NET向けのCIを見つけました。この記事はGitHubとAppVeyorを連携させて、GitHub Releasesにビルド済みファイルを添付する方法を紹介します。最終的なReleasesが[こちら](https://github.com/ueokande/matrix.scr/releases)、ビルド結果が[こちら](https://ci.appveyor.com/project/ueokande/matrix-scr)になります。

AppVeyorとは
------------

LinuxやOS X上の開発では[Circle CI](https://travis-ci.com/)や[Travis CI](https://circleci.com/)などLinuxが使われているCIが人気ですが、AppVeyorはWindows上で実行される.NET向けのCIです。もちろん今回のような.NETを使わないプロジェクトもビルドできます。AppVeyorにはビルドやテストだけでなく、デプロイする機能もあります。AppVeyorの用語をいくつか説明します。

<dl>
  <dt>Artifact</dt>
  <dd>各ビルドで生成されたファイルにアクセスできる仕組みです。ビルド済みファイルをArtifactに設定すると、各ビルド終了後のバイナリを取得できます。</dd>
  <dt>Deployment</dt>
  <dd>ビルド済みファイルを外部に公開します。AppVeyorでは、Webサーバへの公開だけでなく、GitHub ReleasesやWebhookもDeploymentに含むそうです。</dd>
  <dt>Environment</dt>
  <dd>デプロイ先の設定をAppVeyorではEnvironmentと呼びます。EnvironmentにはGitHub ReleaseやFTPやAmaxon S3やAzureなどが設定できます。プロジェクトのSettingsにあるEnvironmentは、ビルド環境の設定なので別物です。</dd>
</dl>

Artifactの設定
---------------

まずビルドで生成されるバイナリをArtifactに追加します。プロジェクトのSettingsからArtifactsを開きます。Path to artifactは、ビルド時に生成されるファイルへの相対パスを、Deployment nameは後で参照するので識別可能な名前を付けます。パス名はバッククオート(`\`)区切りなので注意を。

![artifacts.png](https://qiita-image-store.s3.amazonaws.com/0/102667/cd970404-3c2b-56bf-b40e-8b43b9b96d72.png)

再度ビルドを走らせると、各ビルド結果のArtifactsから、ビルド済みファイルへとアクセス可能となります。

![generated_artifacts.png](https://qiita-image-store.s3.amazonaws.com/0/102667/70eabecf-da41-9122-70ca-2ca970b7f3f6.png)

ここまでの手順でビルド済みファイルが入手できるので、GitHub上でポチポチリリースノートを作れますが、せっかくなのでAppVeyorと連携して自動でReleases noteを作ってみましょう。

Environmentの設定
-----------------

デプロイ先の情報をEnvironmentに追加します。まずはAppVeyorからGitHub Releasesを作成できるよう、GitHubのAccess Tokenを設定します。GitHubの[Personal Access Tokens](https://github.com/settings/tokens)を開いてGenerate new tokenをクリックします。Scopeには `public_repo` のみを設定します。設定が完了したらAccess Tokenが表示されるのでクリップボードにコピーします。

![token.png](https://qiita-image-store.s3.amazonaws.com/0/102667/21e6b1c8-7523-8207-1370-134b29c04bbc.png)

つぎにAppVeyorの画面上部メニューのEnvironmentsを開いてNew environmentを押します。GitHub authentication tokenにはAccess Token生成時に表示されたものを、Artifact(s) to deployには作成したArtifactの名前を入力します。

![environment.png](https://qiita-image-store.s3.amazonaws.com/0/102667/9f6d58ce-c319-0299-6457-7ea3fead4c8f.png)

デプロイ
--------

以上でデプロイの準備が整いました。各プロジェクト画面のDeployments内にNew deploymentがあるので、クリックします。
そして作成したEnvironmentを選択してデプロイするビルドの右側にあるDeployをクリックするとデプロイが開始します。

![deploy.png](https://qiita-image-store.s3.amazonaws.com/0/102667/8f7db607-607a-59e1-7834-82b32f6ecdc0.png)

またEnvironments内や各ビルド結果の上部にあるDeployボタンからもデプロイできます。

おわりに
--------

AppVeyorは初めて触ったので手探り状態で設定しましたが、Build/Test/Deploymentの設定を別々にできるのは便利ですね。この記事ではデプロイするタイミングが手動でしたが、プロジェクトのSettingsのDeploymentを設定すると、自動でGitHub Releasesを作成されます。また今回はWeb画面から設定しましたが、設定ファイルを書きたい人は `appveyor.yml` を作成すれば良いと思います。
Data API で カスタムフィールドを使った記事の検索


*注意: この記事は Data API v3 をベースにしています。*

[listEntries](http://www.movabletype.jp/developers/data-api/v3-reference.html#entries-listentries) のエンドポイントには、カスタムフィールドやカテゴリーを使って記事を検索する仕組みが今はまだありませんが、[search](http://www.movabletype.jp/developers/data-api/v3-reference.html#search-search)のエンドポイントを利用することで、カスタムフィールドやカテゴリーによる絞込。サイトを横断した検索ができます。

## カスタムフィールドを利用する
カスタムフィールをフィルターとして利用する場合は、

```
/search?search=hoge&field:address:akasaka
```

このように `field:` + `カスタムフィールドのベースネーム:` + `条件式` と指定します。

上記の例では、「address」というカスタムフィールドの値が「akasaka」かつ、タイトル・本文・続き・キーワードのいずれかに「hoge」を含む記事が検索されます。

複数のカスタムフィールをフィルターとして同時に指定することは出来ますが、すべての条件を満たしたもの。という`AND`検索になりますのでご注意を。


## カテゴリーを利用する
カテゴリーをフィルターとして利用する場合は、

```
/search?search=hoge&category:"moge OR 'foo bar’"
```

このように `category:` + `条件式` と指定します。

上記の例では、カテゴリが「moge」か「foo bar」かつ、タイトル・本文・続き・キーワードのいずれかに「hoge」を含む記事が検索されます。

## まとめ
Data API でカスタムフィールドやカテゴリによるフィルターを行いたい場合は、`search`のエンドポイントが使えるよ。

（listEntries で使いたいよね。そうだよね。うん、わかってる。）
スプライト画像でパラパラアニメ


まずはスプライト画像の用意
http://spritegen.website-performance.org/

今回は、縦に並べたスプライト画像で、シャボン玉がキラッと光る表現を想定。

```html
<div class="bubble_move"></div>
```

```scss
$s: 5; /* ステップ数 */
$koma: 94px; /* 1ステップで進む距離 */

.bubble_move{
	height: 0;
	padding-top: $koma;
 	width: $koma;
	overflow: hidden;
	background-image: url(../sprite-bubble.png);/* 横94px,縦470pxのスプライト画像 */
	background-position: 0 0;
	animation: shinyBubble 4s steps($s) infinite;
}

@keyframes shinyBubble{
	0%    { background-position: 0 0; }
	90%   { background-position: 0 0; }/* 0~90%までは待機時間 */
	100%  { background-position: 0 (- $koma * $s); }
}
```
mailコマンドでメール送信

# mailコマンドがあるか確認
```bash
$ which mail
/usr/bin/mail
```

# mail送信
```bash
$ echo "本文です" | mail -s "題名です" xxxx@gmail.com
```
-s は題名(SUBJECT)


# fileの内容を送信
```bash
$ cat /path/to/file | mail -s "cat file" xxxx@gmail.com
```

バッチ処理で
結果をファイルに出力⇒メール送信
をする時は使っています。
後光などをエンドレスに回転させる


```css
.spin_infinite{
    -moz-animation: rotateBg 20s infinite linear;
    -webkit-animation: rotateBg 20s infinite linear;
    -o-animation: rotateBg 20s infinite linear;
    -ms-animation: rotateBg 20s infinite linear;
    animation: rotateBg 20s infinite linear;
}

@-webkit-keyframes rotateBg{
    from{
        -moz-transform: rotate(0deg);
        -webkit-transform: rotate(0deg);
        -o-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
        transform: rotate(0deg);
    }
    to{
        -moz-transform: rotate(360deg);
        -webkit-transform: rotate(360deg);
        -o-transform: rotate(360deg);
        -ms-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}
@-moz-keyframes rotateBg{
    from{
        -moz-transform: rotate(0deg);
        -webkit-transform: rotate(0deg);
        -o-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
        transform: rotate(0deg);
    }
    to{
        -moz-transform: rotate(360deg);
        -webkit-transform: rotate(360deg);
        -o-transform: rotate(360deg);
        -ms-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}
@-o-keyframes rotateBg{
    from{
        -moz-transform: rotate(0deg);
        -webkit-transform: rotate(0deg);
        -o-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
        transform: rotate(0deg);
    }
    to{
        -moz-transform: rotate(360deg);
        -webkit-transform: rotate(360deg);
        -o-transform: rotate(360deg);
        -ms-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}
@-ms-keyframes rotateBg{
    from{
        -moz-transform: rotate(0deg);
        -webkit-transform: rotate(0deg);
        -o-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
        transform: rotate(0deg);
    }
    to{
        -moz-transform: rotate(360deg);
        -webkit-transform: rotate(360deg);
        -o-transform: rotate(360deg);
        -ms-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}
@keyframes rotateBg{
    from{
        -moz-transform: rotate(0deg);
        -webkit-transform: rotate(0deg);
        -o-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
        transform: rotate(0deg);
    }
    to{
        -moz-transform: rotate(360deg);
        -webkit-transform: rotate(360deg);
        -o-transform: rotate(360deg);
        -ms-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}
```

> 参考
http://labatmoon.blogspot.com/2012/03/css-no-flash-or-javascript.html
Hyper-Vを無効化してもDockerを起動できないときは

Windows 10に[Docker Toolbox](https://www.docker.com/products/docker-toolbox) 1.10.0をインストールしてDocker Quickstart Terminalを起動しようとしたら、なんかエラーが出て起動しない事象に遭遇。もちろんKitematicも同じ。Hyper-Vは無効化してるはずなのに・・・。

> Hyper-V is installed. VirtualBox won't boot a 64bits VM when Hyper-V is activated. If it's installed but deactivated, you can use --virtualbox-no-vtx-check to try anyways

とりあえず、管理権限で下記コマンドを叩いてHyper-Vを無効化してWindowsを再起動しても結果は変わらず。

```bat
bcdedit /set hypervisorlaunchtype off
```

"--virtualbox-no-vtx-check" オプションを付けるとチェックをスキップできるみたいですが、どこに付けるのかよくわからないです・・・。
[ソース](https://github.com/docker/machine/blob/b6be1b79bcb2bf7ef6f74031ed5da3e72b882b4b/drivers/virtualbox/virtualbox.go#L156)を見ると環境変数でも良いらしいので、VIRTUALBOX_NO_VTX_CHECK=1とか設定すると、チェック処理がスキップされて起動できました。キーだけで値が空でもいけるかもしれません。
コードを納品する流れ


## .DSファイルを消してzipに圧縮
WinArchiverを利用  

> 参考
https://ideacloud.co.jp/dev/macwinzipper.html

## 差分ファイルの用意
gitが管理しているディレクトリ内でgit diff ID番号（納品したcommitの次）
差分ファイルが出るので、これだけを納品する。

```Bash:bash
$ git diff ID番号 --name-only
public/css/menu.css
public/css/style.css
public/index.html
```

> 参考
http://qiita.com/imai/items/09b8a72e5f8c34b432e8  

<br>

- 追記（2016/02/15）

コメントでいただいた、git archiveコマンドを試してみたところ、便利だったので追記させていただきます。

```bash:bash
git diff ${COMMIT_ID} --name-only | xargs -I {} zip ${COMMIT_ID}.zip {} -x .DS_Store
```

> 参考
[git-archive Documentation](https://git-scm.com/docs/git-archive)
[git archive 使い方](http://transitive.info/article/git/command/archive/)
[gitで差分ファイルを抽出する](http://qiita.com/kaminaly/items/28f9cb4e680deb700833)
arduinoでマブチモータ

#概要
arduino unoにマブチモータをつないで見た。
ドライバーは、L9110N。
#写真
![MVC-015S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/c655c751-d8a4-773e-bb1f-7196ab7dca3c.jpeg)

#回路図
![robot.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/1b950f95-25de-a3ce-5e7f-1aba72aa761c.jpeg)

#サンプルコード
```
#define _A1					2
#define _B1					3
#define _A2					4
#define _B2					5

void setup()
{
	Serial.begin(9600);
	pinMode(_A1, OUTPUT);
	pinMode(_A2, OUTPUT);
}
void loop()
{
	Serial.println("front max");
	digitalWrite(_A1, LOW);
	analogWrite(_B1, 255);
	digitalWrite(_A2, LOW);
	analogWrite(_B2, 255);
	delay(3000);
	Serial.println("back mid");
	digitalWrite(_A1, HIGH);
	analogWrite(_B1, 127);
	digitalWrite(_A2, HIGH);
	analogWrite(_B2, 127);
	delay(3000);
	Serial.println("front mid");
	digitalWrite(_A1, LOW);
	analogWrite(_B1, 127);
	digitalWrite(_A2, LOW);
	analogWrite(_B2, 127);
	delay(3000);
	Serial.println("back max");
	digitalWrite(_A1, HIGH);
	analogWrite(_B1, 1);
	digitalWrite(_A2, HIGH);
	analogWrite(_B2, 1);
	delay(3000);
}
```
Movable Type で記事の編集画面に表示されるカスタムフィールドの値を Transformer で入れ替える方法


タイトル分かりにくいけど。

Movable Type には、管理画面をプラグインでカスタマイズする方法として Transfomer という仕組みが用意されています。

Transformer がなんなのかは[こちら](https://github.com/movabletype/Documentation/wiki/Japanese-plugin-dev-4-3)を読んでもらうといいと思いますが、簡単に言うと Movable Type の管理画面のテンプレートやその出力結果の HTML をゴニョゴニョして書き換えることが出来る仕組みなのです。

今回は、テンプレートにバインドされている変数を入れ替えて画面に表示される内容を書き換える方法の TIPS になります。

バインドされている変数を書き換える場合、`template_param.テンプレートファイル名` というコールバックを使います。
config.yaml 的にはこう

```
applications:
  cms:
    callbacks:
      template_param.edit_entry:$Test::Test::Callback::edit_entry_param
```

コールバックの実装側はこんな感じ

```
package Test::Callback;

use strict;
use warnings;

sub edit_entry_param {
    my ( $cb, $app, $param, $tmpl ) = @_;


    $param->{title} = Encode::decode_utf8("タイトルをいれてね");
}

1;
```

$param の `title` とか `text` の値がテンプレートの構築時に使われます。

`<mt:var name="title">` のようにテンプレートの中で利用される変数の場合、このように値を直接指定したり、書き換えたりすることができますが、カスタムフィールドの値はこのパターンではうまくいきません。

カスタムフィールドは、値とテンプレートがビルドされた状態で Transfomer を使って管理画面に埋め込まれています。なので、2つほど手間を掛けてあげる必要があります。

まず、カスタムフィールドの値の元ネタを $param で提供することが出来ます。先ほどのコードを次のようにする指定された値が利用されます。

```
package Test::Callback;

use strict;
use warnings;

sub edit_entry_param {
    my ( $cb, $app, $param, $tmpl ) = @_;


    $param->{'field.test'} = 'hogehoge';    # 値を指定 
    $param->{'__fields_pre_loaded__'} = 1;  # データのロードをさせない

    $param->{title} = Encode::decode_utf8("タイトルをいれてね");
}

1;
```

`field.カスタムフィールドのベースネーム` という変数に対して値を設定し、`__fields_pre_loaded__` に `1` を指定することで既存のデータを編集するときにデータベースから読み込まないようにすることができます。

言い換えると、すべてのカスタムフィールドの値の読み込みを代替わりしてあげる必要があるともいえますが。

つぎに、こちらのプラグインの Transform を先に行わせないと カスタムフィールドの Transformer が走ったあとでは意味が無いので、コールバックの優先度を上げて上げる必要があります。

```
applications:
  cms:
    callbacks:
      template_param.edit_entry:
	handler: $Test::Test::Callback::edit_entry_param
        priority: 3
```

このように、`handler` に実装を指定し、`priority` に 1 - 10 の値を指定してあげることでカスタムフィールドより先に処理させることが出来ます。priority は値が低いほど優先度が高くなり、priority の指定がない場合は `5` がデフォルトで利用されます。

カスタムフィールドの transformer には priority は指定されていないので、3とか4とかにしておけばいいと思います。

以上の手間をかけてあげるとカスタムフィールドの値も transformer で自由自在です。

（しかしめんどいね・・・なんとかしないとね・・・）
BINDによるDNSサーバ構築 - スレーブサーバ編


# 外部向けDNSスレーブーサーバの構築手順

DNSのマスターサーバ構築についてはこちらの記事に書いています。
http://qiita.com/kkojima0127/items/017918793d20490c6c2c

今回はDNSのスレーブサーバ構築について記載します。
BINDパッケージのインストール、サービスの起動、停止などはマスターサーバの構築手順に記載しているので割愛します。

## スレーブサーバの動作
スレーブサーバは設定に応じて、定期的にマスターサーバのゾーン情報のコピーを取得し、バックアップファイルを作成する。
スレーブサーバはこのバックアップファイルを使用してマスターサーバと同様に問い合わせに答えることができる。
あくまでゾーン情報はマスターから取得するので、スレーブサーバ側でレコードを記載することはなく、設定は初期設定ファイルのみ行えばスレーブサーバとして動作する。

## 初期設定ファイルの記述
記述する内容は以下のファイルにコメントで記述しています。


```bash:/etc/named.conf
options {
        listen-on port 53 { 127.0.0.1; 
                            <問い合わせを受け付けるインターフェースのIPv4アドレス>; };
        listen-on-v6 port 53 { ::1;
                            <問い合わせを受け付けるインターフェースのIPv6アドレス>; };
        ...
        # インターネットのすべてのアドレスからのリクエストを許可するので"any"に設定
        allow-query     { any; };
        ...
        # 再帰クエリを扱わないので"no"に設定
        recursion no;
        ...
        # zoneの名前としてドメイン名を指定
        zone "sample.jp" IN {
            # スレーブとして動作させるのでslave
            type slave;
            # ゾーン情報を取得するマスターのIPを指定
            masters { 192.168.7.2; };
            # slaves配下に取得したデータを保存するように設定
            file "slaves/sample.jp.db";
        };
        # IPv4の逆引き
        zone "7.168.192.in-addr.arpa" {
            type slave;
            masters { 192.168.7.2; };
            file "slaves/7.168.192.in-addr.arpa.db";
        };
        # IPv6の逆引き
        zone "0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa" {
            type slave;
            masters { 192.168.7.2 };
            file "slaves/0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.db";
        };
};
```

## コピーしたゾーン情報の表示
マスターのゾーン情報をコピーすると初期設定ファイルに記述したファイルが作成され、そこに内容が記述されます。
ただし、形式がバイナリ形式（rawフォーマットと呼ばれる）のため、そのまま内容を確認することができません。
確認するには内容を読める形に変換する必要があります。

### ゾーン形式の変換
以下のコマンドでrowフォーマットのゾーンファイルをテキスト形式に変換して出力することができる。
オプションの意味
-f: 変換元のファイルフォーマットを指定
-F: 変換先のファイルフォーマット
-o: 出力先ファイル（"-"を指定することで標準出力に内容表示）

```
named-compilezone -f raw -F text -o <テキスト形式のファイルの出力先パス> <ゾーンフィアルのオリジン> <バイナリ形式のゾーンファイル名（パス不要）>
```
GNU screenの起動時にウィンドウをリサイズさせなくする

やり方だけなら~/.screenrcにこれを書いておく。ただし`xterm*`の部分は自分の環境変数`TERM`で置き換えること。

```
termcapinfo xterm* 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'
```

で、この文字列が何を意味するのか調べてみた。

`is`はtermcapのケーパビリティ名で「Initialization string 2 at login」、端末を初期化するために送る文字列。

`=`の後の部分は

|シーケンス | 意味 |
|----|----|
|\E[r  | スクロール領域を設定。副作用なのか、カーソルを(0,0)へ移動する効果もある。Set Scrolling Region|
|\E[m | 文字色等をリセット。Character Attributes (Normal) |
|\E[2J | 画面クリア。Erase in Display |
|\E[H | カーソルを(0,0)へ移動。Homeキー |
|\E[?7h | 折り返しの設定？DEC Private Mode Set (Wraparound Mode) |
|\E[?1;4;6l | DEC Private Mode Reset |

参考：
http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
*Ps*は数値パラメータ。*Pm*はセミコロン区切りの複数の数値パラメータ。詳しくは冒頭のDefinitionsを参照。

- `ESC [`のことをCSI (Control Sequence Introducer)という。
- エスケープシーケンスは`echo -ne "\e[r"`のようにしてテストできる（bashの場合）
配列のキーがセットされているかを調べる／array_key_existsとissetの挙動の違い

<h1>配列のキーがセットされているかを調べる</h1>
■array_key_exists
 引数：検索したいキー、検索対象の配列

■isset
 引数：検索したい変数

```
$arraytest = array('hoge' => 1, 'fuga' => 2,);
array_key_exists('hoge', $arraytest);　 //⇒　true
isset($arraytest['hoge']);　　　　　　　 //⇒　true

```

<h1>issetとarray_key_existsの挙動の違い</h1>
■array_key_exists
 第一引数に渡したキーが見つかるまで検索

■isset
　指定したキーの要素がセットされているかどうかのみをチェック
　★array_key_existsより速くチェックできる

<strong>それぞれの返り値に注意！！</strong>
要素に対する値がnullのとき
　⇒isset()はfalseを返す
　⇒array_key_exist()はtrueを返す



《PHPマニュアル》
<a link rel="http://php.net/manual/ja/function.array-key-exists.php">array_key_exists</a>
<a link rel="http://php.net/manual/ja/function.isset.php">isset</a>
[.NET] DataGridViewのDataSourceにnullを持つObjectArrayを入れたらどう表示されるか

DataGridViewのDataSourceにnull値を持つObjectArrayを入れたらどのように表示されるのか試してみた。

# コード
まず、Personクラスを用意。
今回試すのはint型、string型、bool型、DateTime型にした。

```csharp
    class Person
    {
        public int id { get; set; }
        public string name { get; set; }
        public bool sex { get; set; }
        public DateTime birthday { get; set; }
    }
```

次に、値を設定し、DataGridViewを表示。

```csharp
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var persons = new List<Person>();
            persons.Add(new Person() { id = 1, name = "鹿目まどか", birthday = new DateTime(2010, 10, 3), sex = false });
            persons.Add(new Person() { id = 2, name = "暁美ほむら", sex = false });
            persons.Add(new Person() { id = 3, name = null, sex = false });
            persons.Add(new Person() { id = 4, name = "巴マミ" });
            persons.Add(new Person() { id = 5, name = "佐倉杏子", sex = false });
            persons.Add(new Person() { name = "キュゥべえ", sex = true });

            dataGridView1.DataSource = persons.ToArray();
        }
    }
```
# 結果

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/48960/bee56aed-4758-44a0-ccdb-697ffb0ef235.png)

# まとめ
だいたい予想通りで、

- int型 : 0
- string型 : 空白
- bool型 : false
- birthday : 空白

で表示される。
TeraPadの背景色を黒に設定

■
テキストエディタに、下記設定値をコピー＆ペーストして
ファイル名の拡張子を.tpcとして保存する
例：
black.tpc

■
TeraPadを起動する

[表示]-[オプション]
[色]タブ
[色設定読込]

ファイルを選択するダイアログで、
上記black.tpcファイルを選択する

■設定値
[Color]
Font=$00D6DCD4
Bk=$00000B00
SelStr=$00FF8080
SelBk=$000E1616
Ret=$00575859
Tab=$00575859
Link=$00E1A92C
Inyou=$00A3A19E
UnderLine=$0030292E
WrapLine=$0030292E
ColLine=$0030292E
LeftBarStr=$00575859
RulerStr=$00575859
Html_Comment=$008ED998
Html_Asp=clSilver
Html_Tag=$009552E9
Html_Option=$00AF5A4D
Perl_Comment=$008ED998
Perl_Str=$00AF5A4D
Perl_KeyWord=$009552E9
Perl_KeyWord_Bold=1
Perl_KeyWord_Case=1
Php_Comment=$008ED998
Php_Str=$00AF5A4D
Php_KeyWord=$009552E9
Php_KeyWord_Bold=1
Php_KeyWord_Case=0
Css_Comment=$008ED998
Css_Str=$00AF5A4D
Css_KeyWord=$009552E9
Css_KeyWord_Bold=1
Css_KeyWord_Case=0
Ruby_Comment=$008ED998
Ruby_Str=$00AF5A4D
Ruby_KeyWord=$009552E9
Ruby_KeyWord_Bold=1
Ruby_KeyWord_Case=1
Ini_Comment=$008ED998
Ini_Sec=$009552E9
Ini_Key=$00AF5A4D
Bat_Comment=$008ED998
Bat_Label=$00AF5A4D
Bat_KeyWord=$009552E9
Bat_KeyWord_Bold=1
Bat_KeyWord_Case=0
Cpp_Comment=$008ED998
Cpp_Str=$00AF5A4D
Cpp_KeyWord=$009552E9
Cpp_KeyWord_Bold=1
Cpp_KeyWord_Case=1
Java_Comment=$008ED998
Java_Str=$00AF5A4D
Java_KeyWord=$009552E9
Java_KeyWord_Bold=1
Java_KeyWord_Case=1
Js_Comment=$00437B00
Js_Str=$00AF5A4D
Js_KeyWord=$009552E9
Js_KeyWord_Bold=1
Js_KeyWord_Case=1
Vb_Comment=$008ED998
Vb_Str=$00AF5A4D
Vb_KeyWord=$009552E9
Vb_KeyWord_Bold=1
Vb_KeyWord_Case=0
Hsp_Comment=$008ED998
Hsp_Label=clNavy
Hsp_Str=$00AF5A4D
Hsp_KeyWord=$009552E9
Hsp_KeyWord_Bold=1
Hsp_KeyWord_Case=0
Pas_Comment=$008ED998
Pas_Str=$00AF5A4D
Pas_KeyWord=$009552E9
Pas_KeyWord_Bold=1
Pas_KeyWord_Case=0
naming > enum / define > ベースの定義 > _BASEADDR / BASEADDR / BASE_ADDR / GPS_STATUS_BASE / BASE_GPS_STATUS

色々なパラメータを自動で一括処理する場合、enum定義（もしくはdefine定義)するものの中に基準となる値を定義することがある。

そのときにどういう名前付けをするか。

### suffixに_BASEADDR

最近Zybo関連で見たのは以下。suffixとして_BASEADDRをつけている

> XPAR_LED4_AXI_LITE_BASEADDR

http://qiita.com/7of9/items/7357462e54980585fd0e

### BASEADDR

別途、見つけたのは以下。prefix, suffixなしで、BASEADDR という名前をつけている。

http://fermi.pd.infn.it/software/tid/glast_vme.h

### BASE_ADDR

prefix, suffixなしの BASE_ADDR としている例もある。

[intervalzero](https://www.intervalzero.com/library/RTX/WebHelp/Content/PROJECTS/Example%20Reference/CodeFileExam/Bus_IO_Programming_Example.htm)


### 実際に使いたいもの

今、実際に使いたいものとしてはアドレスのベースではない。

他のパラメータ(GPS_STATUSなど)の場合は、GPS_STATUS_BASE や BASE_GPS_STATUS などの使い方がありそうだ。

```
GPS_STATUS_BASE,
GPS_STATUS_INVALID
```

```
BASE_GPS_STATUS,
GPS_STATUS_INVALID
```
[Swift] Storyboardを使わずコードで、LaunchScreen後の遷移先を指定する方法

今回はLaunchScreen後にMainTableViewController.swiftに遷移して欲しい場合のメモです。

```swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        let rootViewController = MainTableViewController()

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window?.rootViewController = rootViewController
        self.window?.makeKeyAndVisible()
        
        return true
    }
```
[C#] GetMembers(), GetFields(), GetProperties(), GetMethods()の違い

# 前書き
Type.GetProperties() を試してみた時に、他のGetMembers(), GetFields(), GetMethods() で取得できる値の違いがわからなかったので、試してみた。

# コード
まず、Hogeクラスを用意。

```csharp
    class Hoge
    {
        public int field1;
        public int[] field2;
        private int field3;

        public int property1 { get; set; }
        public int property2 { get; private set; }

        public void func1() { return; }
        public int func2() { return 0; }
        private void func3() { }
    }
```

そして、Hogeクラス内のMember, Field, Property, MethodのNameプロパティを表示する。

```csharp
    class Program
    {
        static void Main(string[] args)
        {
            var type = new Hoge().GetType();

            var members = type.GetMembers();

            Console.WriteLine("[members]");
            foreach (var m in members)
            {
                Console.WriteLine(m.Name);
            }
            Console.WriteLine();

            var fields = type.GetFields();

            Console.WriteLine("[fields]");
            foreach (var f in fields)
            {
                Console.WriteLine(f.Name);
            }
            Console.WriteLine();

            var properties = type.GetProperties();

            Console.WriteLine("[properties]");
            foreach (var p in properties)
            {
                Console.WriteLine(p.Name);
            }
            Console.WriteLine();

            var methods = type.GetMethods();

            Console.WriteLine("[methods]");
            foreach (var m in methods)
            {
                Console.WriteLine(m.Name);
            }
            Console.WriteLine();

            Console.ReadLine();
        }
    }
```

# 結果
概ね予想通りに表示された。
publicは表示されるが、privateは表示されない。

```csh
[members]
get_property1
set_property1
get_property2
func1
func2
ToString
Equals
GetHashCode
GetType
.ctor
property1
property2
field1
field2

[fields]
field1
field2

[properties]
property1
property2

[methods]
get_property1
set_property1
get_property2
func1
func2
ToString
Equals
GetHashCode
GetType
```

# まとめ
結果から、

- GetMembers() : クラス内のメンバ
- GetFields() : クラス内のフィールド
- GetProperties() : クラス内のプロパティ
- GetMethods() : クラス内のメソッド

が取得できる事がわかった。
Java GZIP圧縮(単体のファイルを扱う場合には使いやすい)

## はじめに
事前に準備する外部ライブラリ等はありません。
JavaSEに含まれるjava.util.zip.GZIPOutputStreamクラスを使用します。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:GZIPTest.java
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

/**
 *
 * @author tool-taro.com
 */
public class GZIPTest {

	public static void main(String[] args) throws IOException {

		//圧縮対象のデータ(今回は文字列)
		String source = "これはテストです。\n以上。";
		//圧縮後のファイルの保存場所
		String outputFilePath = "output.txt.gz";
		//圧縮前にバイト配列に置き換える際のエンコーディング
		String encoding = "UTF-8";

		GZIPOutputStream gout = null;

		try {
			gout = new GZIPOutputStream(new FileOutputStream(outputFilePath));
			gout.write(source.getBytes(encoding));
		}
		finally {
			if (gout != null) {
				try {
					gout.close();
				}
				catch (IOException e) {
				}
			}
		}
	}
}
```
## 動作確認

```
$ javac GZIPTest.java
$ java GZIPTest
```
生成されたファイルの解凍結果と、
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/111947/f405d9e7-e4de-bbc0-f10f-ff0ef44bd3bf.png)
解凍後のテキスト内容です。
![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/111947/05770559-cee2-faa4-6e06-16eb46398185.png)
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
Elasticsearch pluginインストール時に指定した(と思っていた)pathに配置されなかった

####原因
1. confファイル(elasticsearch.yml)の場所(path.conf)をデフォルトから変更している
2. pluginファイルの配置場所(path.plugins)をデフォルトから変更している
 
上記2つが重なったことが原因だった模様。
```pluginコマンドがconfファイルを見つけられない → デフォルトのpath.pluginsを使う```

####対策
```
pluginのインストール先を指定する
./bin/plugin -Des.path.plugins=./sample install ...

confファイルの場所を指定する
./bin/plugin -Des.path.conf=./sample install ...
```

どちらがいいかは運用次第ですかね。
私のところではelasticsearch自体の起動時にもconfファイルの場所を指定しているので、pluginのインストール時にもconfファイルの場所を指定する方にしました。

####環境
下記のバージョンで確認しました。

```
elasticsearch 1.7.5
elasticsearch 1.6.0
```

####参考
https://www.elastic.co/guide/en/elasticsearch/plugins/master/_other_command_line_parameters.html
PostgreSQLアンチパターン：巨大テーブルのCOUNT


# COUNTアンチパターン

```
SELECT COUNT(*) INTO before_count FROM table1;
...
INSERT INTO table1 ...;
...
SELECT COUNT(*) - brefore_count INTO registered_count FROM table1;
```

なにかTABLEへの追加処理をしてますが、意図通りにできたかどうか、前後で COUNT(*)をとって、その差分を報告させようとしています。
複数のプロジェクトの複数のオーナーのコードで見かけたので、こんな初級アンチパターンも共有しときます。

# なにがまずいの?

COUNTは、シーケンシャル・スキャンしないと出てこない値なのです。アンチパターンでは、テーブル全体が対象ですから、主キーインデクスを総なめです。小さいテーブルのうちはいいのですが、運用の1000万行を越えるような巨大テーブルだと、主キーインデックスだけでもGB単位になります。[前回記事](/masudakz/items/9b4b9b94b9462165101e) で言及したトランザクション分離レベルの話がありますから、このトランザクションで勘定にいれるもの／いれないものの分別も必要です。それがbefore, after の2回も実行されているのです。

# 対策

INSERTするときにSELECT結果を使っているなら、全体COUNTの差分ではなく、そのSELECT文でINSERT前にCOUNTしてみましょうか。COUNTはシーケンシャル・スキャンなので処理時間は対象行数比例です。`INSERT行数 << 全体行数` で、SELECT自体のコストも小さいなら、これで。

主キーがauto increment IDなら MAX(id) で代用できないか検討してください。COUNT(id)と違って、MAX(id)は主キー・インデクスの末端を見るだけです。シーケンシャル・スキャンだった処理がピンポイントになります。ただし、auto increment IDは、ロールバックしたトランザクションが消費したところは欠番になるので、`COUNT_after-COUNT_before = MAX_after-MAX_before` は成立しません。想定よりもMAX(id)が多ければよしとしていいなら、これで。

そもそも、なぜCOUNT結果を確認する必要があるのか、そこまでさかのぼった方がいいかもしれません。
処理が途中で失敗していたら、そのトランザクションはROLLBACKするしかなくて、2回目の SELECT COUNT(*)は実行できません。
本来一つのトランザクションにするべき処理を、複数トランザクションに分割しているとしたら、COUNT結果で意図通りに処理が完遂できていないことがわかったとしても、どうやってリカバリするのでしょう？もっと大きなアンチパターンにはまっているのでは？

# なぜCOUNTアンチパターンが生まれる？

「事前のCOUNTと事後のCOUNTで成功判定する」のは自動IntegrationTestではよくやります。POST のAPI叩いて成功後に、DBのTableにもレコードが増えたかどうか確認するようなTestです。そこではDB初期化から始まるので、大きなtableはまず出てきません。
このパターンに慣れて、O(n)のデータ量比例になることを見過ごして、運用DBにもやってしまうんでしょうか？

SQLは「単純な字面のやつほど怖い」というのを精神注入棒片手に刷り込みに回った方がいいのかな？
```
SELECT COUNT(*) FROM table1; -- 全件COUNT
SELECT * FROM table1, table2; -- 全件x全件の直積JOIN
```

「RDBMSっていろいろやってくれるてるから、COUNT()くらいスパッと返せるようにどこかで管理してるんでしょ」という思い違いがあるのかな？　だとしたら、もう少し書いておこう。

# COUNT高速化のアンチパターン

RDBMS の COUNT() が遅いので、「INSERT/DELETE に Trigger仕込んで高速COUNTを実装」する。
専用TABLE作って、INSERTで++、DELETEで--して、COUNT()のかわりに、`SELECT rows FROM counters WHERE name='table1'`;

これ、実装に難しいところはないし、小規模テストでは完璧に動くんですが、運用にいれたら死ぬアンチパターンです。
[前回記事](/masudakz/items/9b4b9b94b9462165101e) のトランザクション分離レベルの話は counters にも適用されます。
運用DBで多人数・同時多発INSERTがくると、counters TABLE の1行目が全体のボトルネックになって、書込ロック競合が頻発してスループットががったり落ちるか、直列等価を保証できなくなってロールバックに陥るトランザクションが多発して、ユーザ体験を悪化させます。

# まとめ

RDBMS にとって生きているTABLEの COUNT() は本質的に重いのです。巨大テーブルでは極力回避してください。
使うときは結果/中間結果を小さくしてから適用です。
大きな死んだTABLEと小さな生きたTABLEに分割して、大きなTABLEにマテビューをつけて、集計結果を実体化するのも手です。前日や前週までの記録の入った確定値テーブルと、今日・今週分の速報値テーブルとか。確定値テーブルのCOUNTは1回実行した結果を使いまわします。
[JAWS-UG CLI] AWSアカウント(root)作業 #4通知関連の設定

AWSアカウントを作成したらやっておきたいことのうち、以下の通知関連の設定をマネジメントコンソールから実施します。

* Alternate Contactsの登録
* Trusted Advisorの通知設定

# 1. Alternate Contactsの登録

AWSアカウントのログインID以外のメールアドレスで、各種通知を受け取る設定をしておきます。

## 1.1. Account Settingへのアクセス

https://console.aws.amazon.com/billing/home?#/account にアクセスします。


## 1.2. Alternate Contactsの編集

1. "Alternate Contacts"の"Edit"リンクをクリックします。

2. 各項目を入力し、"Update"ボタンをクリックします。

3. "Alternate Contacts"の表示が更新されます。


# 2. Trusted Advisorの通知設定

1. 通知設定( https://console.aws.amazon.com/trustedadvisor/home?#/preferences )にアクセスします。

2. 下記のチェックボックスをOnにします。
  - 請求に関する連絡先
  - オペレーションに関する連絡先
  - セキュリティに関する連絡先

3. 通知の言語(プルダウンメニュー)から言語を選択します。

4. "更新"ボタンをクリックします。


# 完了

ここまで完了したら、AWSアカウントではサインアウトして、MFAデバイスについては封印してしまいましょう。

これ以降は、IAMグループ/ユーザで作業するようにします。
CentOS 6.xにLTS(4.3.0)のnode.jsをインストールする


いつの間にかNode.jsが4.xとかになっている。0.xから一気に、LTSが4.x、最新が5.x系になったようだ。。
これをCentOS6.xにインストールしたい。

nodeはどんどんバージョンが変わるので、今回はLTS版にする。

###今入っているやつがあれば削除する

私はepleからyumでインストールしていたので、

```bash
sudo yum remove nodejs
```

で消しました。

互換性の問題から、必要に応じてglobalのモジュールも削除した方がいいかもしれません。
モジュールの場所は、

```bash
npm root -g
```

で確認出来ます。私の場合は/usr/lib/node_modulesでした。

###最新をインストールする

今回もyumでインストールしたい。

####リポジトリ

まずはリポジトリのインストール。

```bash
sudo rpm -Uvh https://rpm.nodesource.com//pub_4.x/el/6/x86_64/nodesource-release-el6-1.noarch.rpm
```

>CentOS7の場合は
rpm -Uvh https://rpm.nodesource.com/pub_4.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm とする。

####本体

```bash
sudo yum install nodejs
```

これで行ける。

```bash
node -v
v4.3.0
```
zsh: no matches found: HEAD^と出たときの解決策

# コミットを取り消したい
Node.jsでプロジェクトを始めようと思ってたら間違えて、node_modules一式もコミットしてしまった。
ヤバイヤバイ、と思ってコミットを取り消そうと思う。

```
$ git reset --hard HEAD^
zsh: no matches found: HEAD^
```

マッチしませんと言われました。

# エラーの原因
調べてみると、zshの設定で、`set opt extended_glob`なるものがあるらしい。
これに`^`を使うようで、ざっくり言えば競合してしまったのであろう。

# 解決策

以下のように、エスケープしてしまえば良いようです。

```
$ git reset --hard HEAD\^
```

うまくコミットが取り消せました。
Redを触ってみた


#はじめに
この投稿は[プログラミング生放送勉強会第39回@DMM.comラボ](http://pronama.azurewebsites.net/2016/01/26/pronama-39-at-dmm-com/)でライトニングトークをする時のカンペとして駆け足で作ったのであまり校正をしていません。
日本語がおかしかったりするかもしれませんがご了承ください。
#Redの特徴
- プロトタイプベースなオブジェクト指向
- JITコンパイル
- 軽い
- 低水準なプログラミングもできる
- クロスプラットフォーム
- 真偽値trueとfalseに加えてnoneがある

#対応OS
- MSDOS: x86
- Windows: x86(GUIアプリケーション)
- Linux: GNU/Linux x86
- Linux-ARM: GNU/Linux ARMv5,armel
- RPi: ARMv5,armhf
- Darwin: OS X(IntelCPUのみ)(コンソールだけのアプリケーション)
- FreeBSD: FreeBSD,x86
- Android: Android,ARMv5
- Android-x86: Android,x86

#Hello World
RedならHelloWorldを500kBで作ることができるそうです
1. Redのバイナリーを作業フォルダにダウンロードします
2. お好みのエディターを起動して

```Red:hello.red
print "Hello World!"
```

3. 名前をhello.redとして保存します
4. コンソール（またはDOS）で
```
$ red hello.red
```
を実行します
5. これでHello World!と表示されます

#まとめ
結構簡単そう
対応OSが多くて :+1: 
[公式サイト](http://www.red-lang.org/)がダサいのが欠点
[RedのGitHubはコチラ](https://github.com/red/red)
ESP-WROOM-02でI2Cモータードライバ制御


## やりたいこと
ESP-WROOM-02で、I2CモータードライバのDRV8830でモーターの無段階変速制御。

## 機材
- Windows10Home 64bit  
- [秋月のESP-WROOM-02 DIP化キット](http://akizukidenshi.com/catalog/g/gK-09758/)
- [秋月のDRV8830モジュール](http://akizukidenshi.com/catalog/g/gK-06273/)  
- USBシリアル変換モジュール[AE-UM232R](http://akizukidenshi.com/catalog/g/gK-01977/)
- ArduinoIDE v1.6.7


## コード
```cpp
//esp8266でWire.hでI2C通信テスト。1コだけ。
#include <Wire.h>;
const int address = 0x60;

void writeRegister(int adr,byte reg,byte vset,byte data){
  int vdata = vset << 2 | data;
  Wire.beginTransmission(adr);
  Wire.write(reg);
  Wire.write(vdata);
  Wire.endTransmission(true);
  Serial.print(adr,HEX);
  Serial.print(reg,HEX);
  Serial.print(vdata,HEX);
  delay(12);
}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Wire.begin(4,14);
  Serial.println(address,HEX);
  Serial.println("Hello");
  delay(500);
}

void loop() {
  // put your main code here, to run repeatedly:
  writeRegister(address,0x00,0x25,0x01);//正転
  delay(1000);
  writeRegister(address,0x00,0x25,0x00);//静止
  delay(1000);
  writeRegister(address,0x00,0x25,0x02);//逆転
  delay(1000);
  writeRegister(address,0x00,0x25,0x00);//静止
  delay(1000);

  Serial.println("sendOK");
}
```
## 解説
- 2行目:Wireライブラリ読み込み。
- 3行目:DRV8830のアドレスを16進数で変数に代入。
- `void writeRegister(){}`内:I2C書き込み関数。引数はアドレス、レジスタ(モード?モーター回すなら0x00)、電圧設定、レジスタ(正逆転静止制御。詳しくはデータシート8ページの表)。
- `void setup(){}`内:セットアップ系とデバック用処理。
- `void loop(){}`内:writeRegister()関数を呼び出すことで、以下の処理  
正転1秒、静止1秒、逆転1秒、静止1秒。(ループ)  

DRV8830に渡すデータについて詳しくは、データーシート(下記)を見てください。

## 参考
参考にさせていただきました。ありがとうございました。

- [「息子と一緒に Makers」](http://makers-with-myson.blog.so-net.ne.jp/2014-05-15)さん
- [「Arduino日本語リファレンス」](http://www.musashinodenpa.com/arduino/ref/)さん
- [「DRV8830データシート」(秋月)](http://akizukidenshi.com/download/ds/ti/drv8830.pdf)
GPIO PCAL6408AをArduinoで制御する(I2C)

# PCAL6408

# Datasheet
[PCAL6408 Datasheet](http://www.nxp.com/documents/data_sheet/PCAL6408A.pdf)
# 計測可能な値

| 種類 | 概要 |
|:--|:--|
| GPIOエキスパンダ | I2C，SPI等のシリアルバスでIOポートを拡張する。PCAL6408では8bitのポートを拡張可能。 |

# Slave address

| Slave Address | 0x20 |
|:--|:--|

# Register map

| Address | Name | Type | Default |概要 |
|:--|:--|:--|:--|:--|
| 0x00 | INPUT | R | xxxxxxxx | PORTをINPUTに設定 |
| 0x01 | OUTPUT | R/W | 11111111 | PORTをOUTPUTに設定 |
| 0x02 | POLARITY INVERSION | R/W | 00000000 | 極性反転 |
| 0x03 | CONFIGURATION | R/W | 00000000 | Configuration |
| 0x40 | Output drive strength 0 | R/W | 11111111 | ? |
| 0x41 | Output drive strength 1 | R/W | 1111111 | ? |
| 0x42 | Input latch | R/W | 00000000 | TLOW MSB |
| 0x43 | Pull-up/pull-down enable | R/W | 00000000 | TLOW LSB |
| 0x44 | Pull-up/pull-down selection | R/W | 00000000 | TLOW LSB |
| 0x45 | Interrupt mask | R/W | 11111111 | TCRIT MSB |
| 0x46 | Interrupt status | R | 00000000 | TCRIT LSB |
| 0x4F | Output port configuration | R/W | 00000101 | THYST setpoint |

# Who_am_i

デバイス名を取得できるResgiterアドレスは存在しない。

# Configuration

| CONFIGURATION | 0x03 |
|:--|:--|

| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
|:--|:--|:--|:--|:--|:--|:--|:--|
| C7<BR>LED7 |C6<BR>LED6 | C5<BR>LED5 | C4<BR>LED4 | C3<BR>LED3 | C2<BR>LED2 | C1<BR>LED1 | C0<BR>LED0 |

| Bit | 意味 |
|:--|:--|
| 1 | Input |
| 0 | Output |

```cpp:arduino
#define PCAL6408_CONFIGURATION_REG 0x03

void configuration()
{
  writeI2c(PCAL6408_CONFIGURATION_REG, 0x00);
}
```
電子工作 > SC1602BS > 回路例 > Voを5V最大として可変抵抗に接続

I2C接続する SD1602X というキャラクタディスプレイ

トラ技2009年1月号を見ていたら、SC1602BS*Bの接続例があった。

[SC1602Bのデータシート](http://www.toshinkk.co.jp/product/pdf2/SC1602B.pdf)

VDD - Vo はやはり TYP.が4.5V(T=25度)となっている。

トラ技の接続例では以下の接続としている。

- VDD: 5V
- VSS: GND
- Vo: 上記の間に10kの可変抵抗で接続

~~これなら、負電圧を作る必要がなさそうだ。~~
(追記 2016/02/11) 3.3VのVDDのときにどうするかという話だった。上記の方法はVDDが5Vの時でないと有効でない。

Vo (Contrast Adj.) を可変抵抗にすることにより、調整ができるようにしている。
技術英語 > due to [my familiarity with] the ZedBoard

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]

> I expect this will progress rapidly expect due to <font color=red>my familiarity with</font> the ZedBoard.

<hr>
@ LOE > January 3, 2014

http://loe.org/shows/shows.html?programID=14-P13-00001
>That guy sounds familiar.

<hr>
Star Trek Voyagerのエピソードのどこかで、トレスがunfamiliarを使っていたと思うが、どのエピソードだったかは思い出せない。

>The xxx that I am unfamiliar with.

のような使い方だったと思う。

[unfamiliar @ weblio](http://ejje.weblio.jp/content/%E5%BE%97%E4%BD%93%E3%81%8C%E7%9F%A5%E3%82%8C%E3%81%AA%E3%81%84)