OmniAICreator/Qiita-1.07M huggingface dataset:
Vue.jsチュートリアルメモ

[Vue.jsガイド](https://jp.vuejs.org/guide/index.html)を読んで理解したことのメモ。

# Vue.jsとは
 - 双方向データバインディングフレームワーク
 - Viewレイヤーだけを焦点に充てている
 - Angular.js や knockout.js をシンプルにしたもので、取っ掛かりやすい。
 - それぞの要素はコンポーネントとして扱うことができ、大規模システム向けに抽象化して記載可能。

#⃣# Vue インスタンス
 - Vueインスタンス内のdataプロパティの中身が、外とやりとりされる。

#⃣# Vue インスタンスのライフサイクル
 - created
 - beforeCompile
 - compliled
 - ready
 - beforeDestroy

## データバインディング構文

### テキスト
```
 {{ msg }}
 {{* msg }} //不変のメッセージ展開
 {{{ msg }}} // raw_htmlとしての展開(XSSなどの危険性あり)
```

### フィルタ
```
 {{ msg | filterA | filterB }}
```

### ディレクティブの引数
コロン(:)でディレクティブに引数を付与できる。
```
<a v-on:click="doSomething">
```

### クラス(スタイル)バインディング

条件に応じてclassにバインドする対象を切り替える。
```
<div v-bind:class="[classA, isB ? classB : '']">
```

同様にスタイルにもバインディング可能

```
<div v-bind:style="styleObject"></div>
data: {
  styleObject: {
    color: 'red',
    fontSize: '13px'
  }
}
```

### 条件付きレンダリング
`v-if`ディレクティブで可能

```
<h1 v-if="ok">Yes</h1>
<h1 v-else>No</h1>
```

複数タグに適応したい場合

```
<template v-if="ok">
  <h1>Title</h1>
  <p>Paragraph 1</p>
  <p>Paragraph 2</p>
</template>
```

`v-show`ディレクティブも同様に表示を制御できるが、
こちらは常にレンダリングされ、`display`CSSプロパティによって切り替えられる。
　=> とても頻繁に表示を切り替える必要があるものであれば、`v-show`のほうが向いている。

```
<h1 v-show="ok">Hello!</h1>

new Vue({
    data: { ok : true }
})
```

## リストレンダリング
`v-for` でリスト要素を複数回レンダリングできる。

```
<ul id="example-1">
  <li v-for="item in items">
    {{ item.message }}
  </li>
</ul>

  data: {
    items: [
      { message: 'Foo' },
      { message: 'Bar' }
    ]
  }
```

複数タグを繰り返したいときは同様に`template`タグを使う。

## フォーム入力バインディング
`v-model` を使用すると、双方向データバインディングが可能。

```
<span>Multiline message is:</span>
<p>{{ message }}</p>
<textarea v-model="message" placeholder="add multiple lines" ></textarea>
```

 - `lazy` をつけると、通常は`input`イベンドごとに動悸するが、`change`イベントで動悸するようになる。

## コンポーネント

カスタムコンポーネントの定義

```
<div id="example">
  <my-component></my-component>
</div>

Vue.component('my-component', {template: '<div>A custom component!!!</div>'})
var v = new Vue({
  el: '#example'
})
```

コンポーネントはpropsを使用して親から引数を受け取る。

```
<child msg="hello!"></child>

Vue.component('child', {
  props: ['msg'],
  template: '<span>{{ msg }}</span>'
})
```

親->子へのバインディングは通常one-wayバインディング

## 算出プロパティの挙動
算出プロパティは、結果の値をキャッシュし、内部で管理している依存関係の値が更新されない限り、キャッシュした値が使用される。

以下の場合だと、exampleの値はキャッシュされるので、Date.now()の値が毎回計算されるわけではない。

```
var vm = new Vue({
  data: {
    msg: 'hi'
  },
  computed: {
    example: function () {
      return Date.now() + this.msg
    }
  }
})
```

これをキャッシュしたくない場合は、`cache: false` をつければよい。

## カスタムディレクティブ
 自前でディレクティブを定義できる。`bind`, `update`, `unbind` などのフック関数を使用して振る舞いを定義する。
curl -Iなpythonワンライナー

人様のいにしえな環境でcurlなかったけど、pythonはあったので。

```bash
$ python -c "import urllib2;r=urllib2.urlopen('http://www.python.org');print r.info();"
Server: nginx
Content-Type: text/html; charset=utf-8
X-Frame-Options: SAMEORIGIN
X-Clacks-Overhead: GNU Terry Pratchett
Content-Length: 47424
Accept-Ranges: bytes
Date: Tue, 27 Sep 2016 11:07:15 GMT
Via: 1.1 varnish
Age: 2297
Connection: close
X-Served-By: cache-sin6921-SIN
X-Cache: HIT
X-Cache-Hits: 10
Vary: Cookie
Public-Key-Pins: hogehoge

$
```

参考:[20.6. urllib2 — URL を開くための拡張可能なライブラリ — Python 2.7.x ドキュメント](http://docs.python.jp/2/library/urllib2.html)

もう少しいにしえだとこっちのがいいかも?

```bash
$ python -c "import httplib;conn = httplib.HTTPSConnection('www.python.org');conn.request('GET','/');r1 = conn.getresponse();print r1.status, r1.reason"
200 OK

$
```

参考:[20.7. httplib — HTTP プロトコルクライアント — Python 2.7.x ドキュメント](http://docs.python.jp/2/library/httplib.html)

pythonでワンライナーでhttpなの探すと大体以下なwebサーバ建てる方なので、そういやhttp getなワンライナーってないなと。

```bash
$ python -m SimpleHTTPServer 800
```

参考:[20.19. SimpleHTTPServer — 簡潔な HTTP リクエストハンドラ — Python 2.7.x ドキュメント](http://docs.python.jp/2/library/simplehttpserver.html)

そもそもperlのが入ってるか?なら以下っぽい。ま、モジュールあればだけど。

```bash
$ perl -MLWP::Simple -le'print get shift' http://www.dan.co.jp/
```

参考:[一行野郎(one-liner)はperlにおまかせ](http://perl-users.jp/articles/advent-calendar/2008/22.html)


wget?知らない子ですね。

以上。
Swiftでボタンをタップする度に数字がインクリメントされてくプログラムを実装


```swift


import UIKit



class ViewController: UIViewController {
    
    var tapCount:Int = 0
    //変数tapCountにInt型の0を代入

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    
    
    
    
    @IBAction func count(sender: AnyObject) {
        //selfで自分を呼び出して自分の中の変数tapCountを += 1でインクリメント
        self.tapCount += 1
        //printでtapCountがインクリメントされてるかデバックで確認
        print(tapCount)
        
    }
}

```


# やったこと

- ボタンを作る
- ボタンをタップするごとに変数の中の数字をインクリメントさせる


# この後実装したいこと

- DBのRealmの練習
- 数字がインクリメントされるごとに数字をDBに送る
- インクリメントされた全ての数字が個別にDBに保持される
誰でもできないチケット管理術！

#こんなチケットとびかってませんか。

チケットを自分担当にされたけど、何をしたらいいか分からない。

![チケット悪い見本.png](https://qiita-image-store.s3.amazonaws.com/0/114260/4f836ec3-fce1-feaf-cef3-961eb9b443fc.png)

いつまでにやればいいのか期限がない。
対面で確認しようと思ったら、作成者が外出中。
あるいは、そもそも同じオフィスにいない。

#すごく困る。

工場、飲食店、工事現場、世の中のありとあらゆる現場において、**絶対の悪は『作業者を迷わせること』**です。（断言）

「作業達成のために悩む」はアリだけど「何をすればいいか迷う」はナシ。

#だから『察して』を極力削る。

**※作業内容すべてを文章化するのは現実的ではないけれど、迷う余地は極力なくす。**

![チケット良い見本.png](https://qiita-image-store.s3.amazonaws.com/0/114260/b3ba5598-3afd-a82a-dc94-7f69e07a1b16.png)


###・期限は必ず設定する。

作成者が作業ボリュームを想定できなくても「いったんここで進捗確認」という日時を設定する。
設定する以上、作成者は進捗確認を責任もって行ってください。
**「依頼しといてほったらかし」は作業者のモチベーションを下げます。**

作成者が行えない場合は、誰が行うのかをチケットで明確にする。
「期限日までに○○さんに報告して指示を仰ぐこと」など。

###・作業内容は明確にする。

「Aが依頼内容と異なっています」ではどう違うか分からない。
「AをBに運ぶ」「CをDに変更する」など、作業内容を明確にする。

###・ゴールを明示する。

「社内開発環境で修正する」
「テストする」
「stg環境にアップする」
「お客さんに連絡する」
「本番リリースする」
「チケットをクローズする」
どこがチケットのゴールなのか明確にする。

###・作業を達成するための権限を明確にする。

疑問点はお客さんに直接尋ねていいのか、
いったん社内の誰かに相談した方がいいのか。

手が足りない時は、誰かに頼んでいいのか、
それも誰かに相談した方がいいのか。

その場合、誰に相談すればいいのか。

お客さんとやり取りする場合に、すでに連絡ツールがあるならその手段を明記する。
（バックログやredmineのURL。ccメールの場合は日時と件名などなど）


#でも、すべて明記するのは現実的ではない。

「権限て、ファイルへのアクセス権限とかも書くの？」
「上司と先輩と同僚と相談窓口が複数あるけど、誰にどこまで聞けば？」
書くだけで日が暮れます。

すべてを書くのは無理です。

では、どうすれば？

#作業担当者にあわせて発行しよう。

作業担当者は、どのぐらいこの現場に慣れてるだろうか。
知識は？　経験は？　どういうのが得意？　どうされるとやる気をだす？

それを考えるのも『コミュニケーション』です。


#チケットにもコミュニケーションを。

明文化できるチケットは、伝えたつもりになりやすい口頭や電話より、使い方次第で、はるかに多くの情報量を伝えることができます。

:smile: :smile: :laughing: :laughing: :blush: :blush: :laughing: :laughing: :smile: :smile: 

うまく使いましょう！
[Ruby]__method__と__callee__

`__method__`も`__callee__`も現在のメソッド名をシンボルで返すのだが、

```rb
def method
  __method__
end
#=> method

def callee
  __callee__
end
#=> callee
```

alias_methodの時のみ、違いが出る。

```rb
class Foo
  def old_method
    __method__
  end

  def old_callee
    __callee__
  end

  alias_method :new_method, :old_method
  alias_method :new_callee, :old_callee
end

Foo.new.new_method
#=> :old_method
Foo.new.new_callee
#=> :new_callee
```

`__method__`はaliasの元のmethod名が返され、
`__callee__`はaliasのmethod名が返される。


alias_methodでなく、aliasの時も、

```rb
def old_method
  __method__
end
def old_callee
  __callee__
end
alias :new_method :old_method
alias :new_callee :old_callee

new_method
#=> :old_method
new_callee
#=> :new_callee
```
Mac OS Sierraにしたらgitコマンド、ターミナル上にエラーが出てしまった。

<h3>Mac OSをSierraにしてRuby On Railsの開発をしてたら、
下記の様にエラーが出てしまった。</h3>

$ git status
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

どうやらCommandLineToolsが抜けってしまってないようです。
とりあえず、下記をそのままsafariで検索かける。
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

<h2>ただターミナル上でxcode-selectをインストールすればいいと</h2>
$ xcode-select --install
xcode-select: note: install requested for command line developer tools

$ git status
On branch master
nothing to commit, working directory clean
動いた！！！



<h3>こちらに関して、ブログで取りまとめてます!</h3>
参考にして頂けたら幸いです。
http://www.papa-programing.jp/?page=1477825200
Qiitaにおけるリモートワーク主体の開発プロセス 

- 2016/9/27 スタートアップRails勉強会発表資料

---

# About

- @takashi 
- Increments アプリケーションエンジニア
- 主にQiita:Team担当
- 最近入社した

--- 

##　最近


![image](https://qiita-image-store.s3.amazonaws.com/0/5767/bccdb0df-629e-d196-97fb-91d3a9a2eb0c.png)


---


# Incrementsの開発チームが大事にしていること :bulb:

- HRTを大切にしたコミュニケーション
- 作業は意識的に自動化する
- 属人性を極限まで排除する
- 重要な価値に集中する

---

# Qiitaにおけるリモートワーク開発プロセス

---

## HRTを大切にしたコミュニケーション

Humility(謙遜), Respect(尊敬), Trust(信頼)

---

# リモートワークにおいてHRTとは？

---

# :thumbsup: :pray: :bow: :innocent: :tada: 

--- 

# オンラインコミュニケーションは誤解を招きやすい

- (本当に)意図せず冷たく接しているように伝わる :no_good:
- そこで :pray: 
- なにげないレビューに :thumbsup: を添えるだけで雰囲気が良くなる
- (けど普段喋れないこともあるので)月１回はオフラインで集まるようにしている :beers: 

---

# 作業は意識的に自動化する & 属人性を極限まで排除する :muscle: 

- リモートワークは同期的なコミュニケーションを取るコストが高い
- 入社したその日には誰にも聞かずに働ける(環境構築も終わった)みたいな環境がとても便利

---

## たとえば

- 入社した際のフローをまとめておく
- docker-composeを使った開発環境の配布
- イケてないUIの勤怠管理システムをラップして、slack上から勤怠管理を行えるように
- re:dashを使った各種KPIの計測、それをslackから参照できるように
- (そしてそれらを)Qiita:Teamに残しておく


---

# 重要な価値に集中する

- スタートアップに無駄なことをしている時間はない
- 「本当に必要な機能なのか」をしっかりと確認するためのフローが必要
- 口頭で話した、は無くしていきたい

---

# PRD, RFC

---

# PRD

Product Requirements Document

つまり 「製品への要求が書かれた文書」

- IncrementsだとQiita, Qiita:Teamぐらいの単位で存在する
- 製品の目指すゴール、ユースケース、UXや技術的な要求について詳しく書いていく
- 新しい機能の実装時などに、逐一確認、必要に応じて編集しながらゴールを明確にしていく
- 実装方法については書かない
- 迷ったらここを見る


---

なにを書くか

```
# 概要 / Summary

# 背景 / Background (Optional)

# 製品原則 / Product Principles

# スコープ
製品のゴールおよびゴールとしないものについて記述する。

# KPI

# 対象ユーザー / Target Users

# ユースケース / Use Cases

# 市場分析 / Market Analysis

# 競合分析 / Competitive Analysis (Optional)

# 機能要求 / Functional Requirements

# UX要求 / UX Requirements
## UIモックアップ / UI Mockups (Optional)

# その他の技術的要求
## システム要求
## セキュリティ要件
## プライバシー要件
## パフォーマンス要件

# リリーススケジュールおよびマイルストーン / Release Schedule & Milestones
## テスト計画
# マーケティング計画 / Go-to-Market plan (Optional)
```

---

# RFC

Request for Comments

「新機能や機能改善のための提案書」 として使っている

- 軽い気持ちでつくって共有する。いけそうだったら実装に入る
- 実装に入るまでの段階で議論を重ねられる
- 「本当に必要なものなのか」をPRDよりもミクロなスコープで見ることができる
- GoogleのDesign Docにも近い

---

# 何を書くのか

```
# 概要

# 動機

# 詳細

# 欠点

# 代替案

# 未解決の問い
```

---

![image](https://qiita-image-store.s3.amazonaws.com/0/5767/febb3972-84bd-abb4-0068-21e3367a184d.png)

---

# まとめ

- HRTを大切にしたコミュニケーション
- 作業は意識的に自動化する
- 属人性を極限まで排除する
- 重要な価値に集中する

---

QiitaやKobitoを作る開発チームの文化
http://blog.qiita.com/post/74997115585/increments-dev-team-culture

---

# :pray: We're hiring! :pray:

@takashi に気軽に話しかけてください :pray:
Mongoid + Railsの覚え書き


# リレーション
## has_many / belongs_to / has_one

自動的に、リレーション用のカラムを作ってくれる

```ruby
class BattleShip
	has_many :mobile_suites
end

class MobileSuite
	#battle_ship_idカラムが生成される
	belongs_to :battle_ship
end
```

## bson内部に子を内蔵する
embedすると、bson内に内蔵できる

```ruby
class BattleShip
	embeds_many :mobile_suites
end

class MobileSuite
	#battle_ship_idカラムが生成される
	embeded_in :battle_ship
	field :name, type:String
end
```

```bson
{
	_id:BSON("123455"),
	mobile_suites[
		{
			_id:BSON("123456"),
			name:"白いやつ"
		}
	]
}
```

## 内蔵した上でツリー状にする
embedして:cyclic => trueする

```ruby
class BattleShip
	embeds_many :battle_ships ,:cyclic => true
	embeded_in :battle_ship ,:cyclic => true
end


```bson
{
	_id:BSON("123455"),
	battle_ships[
		{
			_id:BSON("123456"),
			battle_ships[
				{
					_id:BSON("123457")
				}
			]
		}
	]
}
```
[macOS] 超速！10分間で、テキストエディタを作る。Swift3編

##**誰に読んで欲しいか？**
今回は、macOSアプリケーションの話です。**Document Based Application**。アプリケーションからファイルを作成、保存し、ファイルを開いて編集する。いかにもパーソナルコンピュータらしいアプリケーションですが、これをXcodeのDocument Based Applicationのテンプレートから作ろうとすると、なにがなにやらようわからんと、戸惑う経験をした人は、私だけではないでしょう。そこで、とりあえずテンプレートからじっさいに動くアプリケーションを作って、最初のハードルを越えられるようにしようという内容です。
##**なにを作るか？**
シンプルテキスト（プレーンテキスト）を編集し、保存するアプリケーションです。
##**Xcodeを起動しよう。**（ここから10分間です）
- 新規プロジェクトを作成します。
![create1.png](https://qiita-image-store.s3.amazonaws.com/0/140894/49d2800e-e107-cd3e-5db8-1bfd59805c3e.png)

macOSのCocoa Applicationを選びます。
![create2.png](https://qiita-image-store.s3.amazonaws.com/0/140894/0bf6e437-9099-2aa1-1570-49850ad3cd47.png)

**Use Storyboard**にチェック入れず（Storyboardは使わない）、**Create Document-Based Application**にチェックを入れます。シンプルテキストが目的なので、**Document Extension**をtxtにします。

- **Document.xib**を選択します。
![xibFile.png](https://qiita-image-store.s3.amazonaws.com/0/140894/65e41807-95b3-1b88-bd11-685a06758c64.png)

Text Viewをウインドウにドラッグして、貼り付けます。**File's Owner**（Documentクラス）に、Text Viewをコネクトして、textViewというインスタンス名をつけます。

- コード編集は、**Document.swift**に対してだけ行います。以下、`// ↓↓↓↓`から、`// ↑↑↑↑`の間のコードが、テンプレートに追加したコードです。

```swift:Document.swift
import Cocoa

class Document: NSDocument {

    // ↓↓↓↓
    @IBOutlet var textView: NSTextView!
    
    var documentText: String?
    // ↑↑↑↑

    override init() {
        super.init()
    }

    override class func autosavesInPlace() -> Bool {
        return true
    }

    override var windowNibName: String? {
        return "Document"
    }
    
    // ↓↓↓↓
    override func windowControllerDidLoadNib(_ windowController: NSWindowController) {
        super.windowControllerDidLoadNib(windowController)
        
        if let text = documentText {
            textView.string = text
        }
    }
    // ↑↑↑↑

    override func data(ofType typeName: String) throws -> Data {
        // ↓↓↓↓
        if let data = textView.string?.data(using: .utf8) {
            return data
        }
        // ↑↑↑↑
        throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
    }

    override func read(from data: Data, ofType typeName: String) throws {
        // ↓↓↓↓
        if let text = String(data: data, encoding: .utf8) {
            documentText = text
            return
        }
        // ↑↑↑↑
        throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
    }

}
```

以上です。ビルドしてください。
コードの解説は、あえてしないでおこうと思います。追加したコード1行1行が、なにを意図しているのか、みなさんで読み解いていくのが、いい学習になるのではないでしょうか。
* * *
次回は、同じ内容を、Storyboardを使ったプロジェクトで書いたらどうなるかを、検討してみたいと思います。
Windows版, Kubernetesの管理方法

こんにちは yoshi です。  
今回は Windows で Kubernetes に接続するまでを説明します。

######概要
Cloud shell を使う。

######前提条件
Google Chrome, Firefox, Microsoft Edge, Microsoft Internet Explorer 11+ and Safari 8+ の最新版のブラウザ  


######始めよう！

https://console.cloud.google.com にアクセスして Container Engine を見ます。
![Screen-Shot-2016-09-27-at-09.48.05.png](https://qiita-image-store.s3.amazonaws.com/0/63807/b606105b-690c-1e2b-a462-e416b5b441d5.png)


クラスターをクリックして詳細をみましょう。  
![Screen-Shot-2016-09-27-at-09.48.25.png](https://qiita-image-store.s3.amazonaws.com/0/63807/83d20ada-edb3-f88a-a104-efcad77ebaf9.png)


次に右上のヘッダータブに置かれている Activate Google Cloud Shell を押します。  
すると次のような shell が表れます。
![Screen-Shot-2016-09-27-at-09.48.51.png](https://qiita-image-store.s3.amazonaws.com/0/63807/4fced042-a707-0125-4e4c-d9f3740621f6.png)



######クラスターの情報をみる

まず正しいクラスターにつなぐために、gcloud で credentials を取得します。
![Screen-Shot-2016-09-27-at-09.49.02-10.31.19.png](https://qiita-image-store.s3.amazonaws.com/0/63807/5a6e0dad-cac9-b7ce-2c15-76e09c6cb72b.png)

```bash
$ gcloud container clusters get-credentials [cluster_name] --zone [zone_name] --project [project_name]
```
この画面は`Connect to the cluster`をクリックすると表示されます。


次に情報を見るためには以下のコマンドを入力し...[続きを読む](http://blog.lesson-time.com/kubernetes-for-windows/)
Google Computer Engineで動いているアプリのSSL証明書 Let's Encrypt を kubernetesで更新する

こんにちは、yoshiです。

今回はkubernetes で動かしている example.com の SSL 証明書(Let's encrypt)が切れるので更新してみます。

######条件
Macのターミナルで`kubectl`が使える
=> 使えない方は[こちら](http://blog.lesson-time.com/kuberneteswoshi-utamenoshe-ding-nado/)

######手順
まず大まかな手順を見てみましょう。

![SSL.png](https://qiita-image-store.s3.amazonaws.com/0/63807/7a9f7687-da3e-a44d-fc2a-a5fd748965ac.png)


1: 新しくComputer Instanceを立ち上げ、`example.com` の DNS を新しいものに変え、Let's Encrypt bot をインストールする。インストールした後証明書をダウンロードする。
2: DNSを元のものに戻して、ローカルに落とした証明書を正しいIPアドレスのComputer Instanceにアップする。
3: `example.com` がSSLで接続されていることを確認する。


１つずつ見ていきましょう。

######インスタンス立ち上げ
[https://console.cloud.google.com](https://console.cloud.google.com) にアクセスしてCompute Engineのページにいきます。  

![Screen-Shot-2016-09-26-at-14.12.52_2-1.png](https://qiita-image-store.s3.amazonaws.com/0/63807/51f5eb86-5090-77fb-f08f-e6083c218a48.png)

`CREATE INSTANCE`をクリックしてインスタンスを作成します。
<img width="797" alt="Screen-Shot-2016-09-26-at-14.19.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/63807/f00e3231-ae79-22cc-e812-7ed1aab85eff.png">


変更する点は以下の5つです。  
**Name**: 適当な名前をつけます。  
**Zone**: 日本であれば `asia-east1-a`で良いでしょう。  
**Machine type**: 一番小さい大きさのインスタで構いません。  
**Boot disk**: 今回は `Ubuntu 14.04` を使います。  
**Firewall**: HTTPとHTTPSを両方とも許可します。  

######External IP取得
作成したらそのインスタンスに入って、External IPを取得します。  
![Screen-Shot-2016-09-26-at-14.25.04-2.png](https://qiita-image-store.s3.amazonaws.com/0/63807/98c38c1f-9b55-0f5f-4b8e-5e7b54d7f059.png)

今回は`104.xxx.xxx.xxx`ですね。

######DNS設定
次に Networking > Cloud DNSから適切な独自ドメインの対応する**Data**を先ほどのExternal IPに変更します。　　
![Screen-Shot-2016-09-26-at-14.28.47-1.png](https://qiita-image-store.s3.amazonaws.com/0/63807/c04266cd-af9e-f1ef-dccf-2f8453e106d6.png)


######インスタンスへSSH接続

適切なインスタンスに入ってSSH接続を行い...[続きを読む](http://blog.lesson-time.com/update-ssl-certificate/)
[作業ログ]ESP8266の開発環境(Arduino)


前にAruduino互換のesp8266のプロトタイピングボードを
買って（1000円くらい）、Mac上に開発環境をつくったが、
500円でamazonで似たよーなのがあったので、購入。
すぐ繋がるのかなーと思いきや、困ったので、メモ。
（というか、MacのAruduinoIDEで、まだ、認識できていない。。。）

前に買ったボードはこれ。
![arduino_1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/92294931-5e43-6a03-2e91-2ed793716a6d.png "arduino_1.png")

https://www.amazon.co.jp/gp/product/B010URF1PQ/
1000円くらいだったけど、今見ると、500円以下だなorz 
買った時は、プライムで、1000円チョットだった。


で、今回はこれ。
https://www.amazon.co.jp/gp/product/B01EWWAEB6
![arduino_2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/e26fad26-0a4b-5789-cf22-bd48d4e79a6b.png "arduino_2.png")

半額くらいなので、安い。
目安通り、２週間くらいで届く。

前に買ったボードのIDE上の接続設定は、こんな感じ。
![aruduino_3.png](https://qiita-image-store.s3.amazonaws.com/0/38889/3ac5904c-da94-e5ac-7a6c-ab36f11fa968.png "aruduino_3.png")


で、そのまま繋がるのかなーという感じで、USBさしてみたが、

````
XXXX-no-MacBook-Pro:ttt pies$ ls -l /dev/cu*
crw-rw-rw-  1 root  wheel   18,   1  9 21 11:56 /dev/cu.Bluetooth-Incoming-Port
XXXX-no-MacBook-Pro:ttt pies$ 

````

全く認識しない。
つなげると、LEDが激しくチカチカする。。。

仕方ないので、Paralles上のWindowsで繋げる事にした。


1.
ファームを書き換える。
英語のページを彷徨ってて、ファームを書き換えろ的な事が
かいてあったので、やってみた。
[1]
以下からDL。
ファームウェアの書き込みソフト。
https://github.com/nodemcu/nodemcu-flasher
zipを落とし、解凍して64bit版のリリースを使用（ビルド不要）

ファームのイメージ。
https://github.com/nodemcu/nodemcu-firmware/releases
zipを落とし解凍するも、ソースのみなので、ビルド必要。
ラズパイにビルドする環境作るのが面倒だったので、
ファームのイメージは以下のサイトを利用することにした。
https://nodemcu-build.com/index.php
メールアドレスを入力すると、ビルド開始と、ビルド終了を通知してくれて、
ビルド終了メールにビルド結果のイメージのダウンロードURLがついてくる。

[2]
flasherを起動してファームを書き込んでみる
![flasher_1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/ad3ac76a-7fb4-b1be-bdd6-580c98c04c0e.png "flasher_1.png")



LEDが激しくチカチカした後、消えて、
com3として認識される。

configタブを選択し、DLしたファームを選択。
![flasher_2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/a0b70816-04f0-c41f-c72c-c5ff2c6ae6ba.png "flasher_2.png")


operationタブに戻り、flashボタンをおして、書き込み。
無事に書き込みが終わる。

が、一旦、USBから抜き、Windowsをサスペンドして、MACに挿し直すも
現象はかわらなかった。
（/dev/cu*に現れない。LEDが激しくチカチカ。）


ただ、Windows上では、COM3と認識されており、
Flasherの書き込みも正常終了したので、一旦、WindowsでAruduinoの環境を整えることにする。


2.
Windows上で、ESP8266のAruduinoの開発環境を作る。
[1]
Windows用のAruduinoをDLしてインストール
[2]
IDEを起動し、環境設定を開き、追加のボードマネージャのURLに
http://arduino.esp8266.com/stable/package_esp8266com_index.json
を設定。
![ar_cap_1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/b5feeecf-6cb6-f4a5-1691-b63ff9bd9799.png "ar_cap_1.png")

ダウンロードされインストールされる。

[3]
ツール->Generic ESP8266 Moduleを選択。
接続設定を以下のよーに設定
![ar_cap_2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/14249ee7-bd4b-17a6-6862-4dd5745c7f8f.png "ar_cap_2.png")


[4]
とりあえず、デバッグプリントしてみる。

```
#include <ESP8266WiFi.h>


void setup() {
  // put your setup code here, to run once:
Serial.begin(9800);

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("test");
  delay(2000);
}
```

つなげてビルド。
![ar_cap_3.png](https://qiita-image-store.s3.amazonaws.com/0/38889/b401000d-4740-547c-a5b2-fc91425073d5.png "ar_cap_3.png")

ビルド出来た！

で、実行
![ar_cap_4.png](https://qiita-image-store.s3.amazonaws.com/0/38889/295d418e-f104-9d60-af4c-5f9538c50320.png "ar_cap_4.png")

何事もなく、動く。
が、MACでは認識させる事ができず。。。。
うーむ。
開発者ブログをghostで kubernetes 上に設定するまで

こんにちは yoshi です。
僕は全くインフラの知識がないのですが、[Lesson Time](https://lesson-time.com) が Docker や Kubernetes で動いているため、今回は開発者ブログを新しく新設するためにいじってみました。

備忘録として新しくアプリをKubernetes上でDocker Imageから運用するまでを記載してこの開発者ブログを公開してみました。

######目次
・Kubernetes 上で新しい Podsを作成して、アプリを作る。  
・[Dockerの公式サイト](https://hub.docker.com)から ghostのDocker imageをインストールする。　　

######前提条件
・Google Cloud Platform(GCP)のclusterを作成している。  
・Kubernetesにアクセスが可能。(kubectl proxyで`http://localhost:8001/ui`にアクセスできる)  
・(Kitematicをインストールしている)
=>gcloud, kubectlを使えるようにする方法は[こちら](http://blog.lesson-time.com/kuberneteswoshi-utamenoshe-ding-nado/)

それでは早速やってみましょう！

######１.Kubernetes 上で新しい Podsを作成して、アプリを作る。
まず Kubernetesでアプリを作成するために"DEPLOY APP"をクリックします。  
[Docker Imageのタグ](https://hub.docker.com/r/library/ghost/tags/)を確認して必要なタグ（バージョン）を記録しておきます。今回は最新のものを使いたいので、`latest`を使います。
<img width="721" alt="Screen-Shot-2016-09-26-at-10.55.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/63807/2399e076-e5ac-b8f8-e9a9-b44694d1f27a.png">

画像のように App nameを決めた後、Container Image を `ghost:latest`, Serviceは `External`に設定します。


次にTarget Portを埋めるために Kitematicで...[続きを読む](http://blog.lesson-time.com/set-up-ghost/)
brew install nmapで/usr/local/share/man/de/man1 is not writableとなる問題

sierraしてbrewでnmap入れ直したらエラーでた

```
% brew install nmap
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
abcm2ps                    discount                   plowshare                

==> Downloading https://homebrew.bintray.com/bottles/nmap-7.12.sierra.bottle.tar
######################################################################## 100.0%
==> Pouring nmap-7.12.sierra.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink share/man/de/man1/nmap.1
/usr/local/share/man/de/man1 is not writable.

You can try again using:
  brew link nmap
==> Caveats
Python modules have been installed and Homebrew's site-packages is not
in your Python sys.path, so you will not be able to import the modules
this formula installed. If you plan to develop with these modules,
please run:
  mkdir -p /Users/shinya/Library/Python/2.7/lib/python/site-packages
  echo 'import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")' >> /Users/shinya/Library/Python/2.7/lib/python/site-packages/homebrew.pth
==> Summary
🍺  /usr/local/Cellar/nmap/7.12: 727 files, 23M
```
/usr/local/share/man/de/man1のユーザを変えれば大丈夫らしい．

```
% ls -la /usr/local/share/man/ | grep de
drwxrwxr-x    3 root    wheel    102  4  2 02:00 de/
```

```
% sudo chown -R $USER /usr/local/share/man/de
% brew link nmap
Linking /usr/local/Cellar/nmap/7.12... 26 symlinks created
```

# 参考
[brew install nmap で発生したインストール時のエラーをchownで解決](http://qiita.com/ren-10/items/1c1764100aa4b1c7b514)
[小ネタ] BigQueryのコンソール画面でテーブルが表示されないときの対応


BigQueryのコンソール画面ではテーブルの一覧を表示してくれます。しかし、大量のテーブルがあるときには明らかに存在するテーブルが表示されないこともあるようなのでその対処法を書いておきます。

## コンソール画面でのテーブルの表示

BigQueryのコンソール画面を開くと、テーブル一覧が表示されます。最近だとテーブルのパーティショニングによってテーブルを日ごとに分割する必要は無くなってきているとは思いますが、テーブルパーティショニング登場以前から運用されていたプロジェクトでは日ごとにテーブルを分けるという方法がよく用いられていました。

例えば

```
spam_egg_20160927
spam_egg_20160928
```

上記のように日付付きのテーブルを作るとBigQueryのコンソール画面では

```
spam_egg_(2)
```

というようにテーブルをまとめて表示してくれます。

![tables.png](https://qiita-image-store.s3.amazonaws.com/0/14918/fc87d954-7563-267d-8ec6-1986743b241c.png)

しかし、テーブルの数が増えてくると、クエリを投げると結果が返って来るにも関わらずコンソール画面には表示されていないテーブルがあることに気付きました。

## APIによるテーブルの表示

コンソール画面のテーブル表示数には上限があるのかもしれません。ただ、実際にテーブルが存在する以上はAPIから表示させられるはずです。

そこでCloud Consoleから`bq ls [dataset]`でデータセット内のテーブル一覧を表示してみます。その際`-n`オプションを使って表示数を指定することが可能です。

```
bq ls -n 10000 [dataset]
```

![cloud_console.png](https://qiita-image-store.s3.amazonaws.com/0/14918/4566c8d1-8206-629e-875d-eacc432add6a.png)

この場合、テーブル一覧は表示されましたがテーブルを日付ごとに作っている都合上同じ名前で日付だけが違うテーブルが大量に表示されてしまっています。

## 日付だけが違うテーブルをまとめて表示する

```
bq ls -n 100000 [dataset] | sed -e 's/[0-9]\{8\}//g' | uniq > tables.txt
```

```
less tables.txt
```

![result.png](https://qiita-image-store.s3.amazonaws.com/0/14918/b3f01889-78dd-0ee8-97df-acf5b92cde0d.png)

画像はぼかしが入っているのでわかりにくくなっていますが、これで表示されていなかったテーブルが表示できました。もしかしたら別の方法があるかもしれません。
MMDモデルを使用したデスクトップユーティリティの開発 その1 PMD読み込みクラスの作成

次: [その2](http://qiita.com/JI1LDG/items/9de611bce86c0b3d5b6f)

#はじめに
##やりたいこと
伺かみたいなのをMMDモデルで。何か起動させたり実行させたりしたい。
「MMDDM」は表示させるのみ、既に公開されている「MMD版伺か」は開発中途であり、DXライブラリを使用しているため、PMXモデルの表示に難がある。
→ PMDを扱えるライブラリは「MMDX」などがあるが、PMXに対応しているものはほとんどない。(MMFlexは凍結中?)
→ なら自分でつくればいいじゃない

##とりあえずやること
- モデルの読み込み ←イマココ
- モデルの表示
- スキニング・IK
- PMX対応

##開発環境など
C# + SlimDX(DirectX11) (+ WPF)
PMDモデルはえと式チルノを使用

#PMD読み込みクラスの作成
DirectXでモデルを表示するために、まずはモデルファイルの読み込みを行います。
MMDのモデルデータには、PMDとPMXの2つがありますが、しばらくはPMDを使って開発していきます。
PMXは、PMDモデルの表示がある程度でき次第、とりかかる予定です。

##読み込むにあたっての注意点・つまづいた点
PMDの中身は[こちら](http://blog.goo.ne.jp/torisu_tetosuki/e/209ad341d3ece2b1b4df24abf619d6e4)で公開されているので、これを参照しながら読み込んでいきます。
ソースは[GitHub](https://github.com/JI1LDG/MmdFileLoader/tree/master/MmdFileLoader)で公開しています。後日、VMDやPMXの読み込みも追加する予定です。

PMDファイルはバイナリデータ(not テキストデータ)なので、FileStreamでファイルを開き、BinaryReaderで読み込んでいきます。このとき、エンコーディングにはShift-JISを指定します。

###ヘッダ部分の読み込み
ヘッダはPMDファイルであることを表すマジック(3byte)、バージョン(4byte)、モデル名(20byte)、コメント(256byte)で構成されています。
マジック・モデル名・コメントは文字列、バージョンは実数なので、ReadBytes(int 文字数)とReadSingle()を使用します。
エンコーディングがShift-JISなため、ReadCharsを使用すると、ヘッダの次の頂点の領域まで余分に読んでしまうので注意が必要です。
また、PMDファイルの文字列は、文字の終わりに0x00, パディングとして0xFDで埋められているので、文字の終端までを返す関数を用意します。

```csharp:PmdLoader.cs
using System.IO;
using System.Text;

class PmdLoad {
	public PmdHeader Header;

	public PmdLoad(string modelfilename) {
		using(var fs = new FileStream(Path, FileMode.Open))
		using(var br = new BinaryReader(fs, Encoding.GetEncoding("shift-jis"))) {
			Header = new PmdHeader(br);
		}
	}

	public static string Sjis(this BinaryReader br, int count) {
		var tmp = Encoding.GetEncoding("shift-jis").GetString(br.ReadBytes(count));
		if(tmp.IndexOf('\0') > 0) return tmp.Substring(0, tmp.IndexOf('\0'));
		else return tmp;
	}
}

class PmdHeader {
	public string ModelName;
	public string Comment;

	public PmdHeader(BinaryReader br) {
		br.Sjis(3); //マジック(読み飛ばし)
		br.ReadSingle(); //バージョン(読み飛ばし)
		ModelName = br.Sjis(20);
		Comment = br.Sjis(256);
	}
}
```

(例外処理等はしてないです)
こんな調子でこの後の頂点リストやインデックスリストなどを読み込んでいきます。
PMDファイルにはテクスチャファイル名の指定の方法にバリエーションがあったり、物理演算に必要な剛体やジョイント関係のデータが格納されている/いないなどあるようですが、一番最新のものを基準に読み込みをしています。

最後にPMDEditorと読み込んだものを確かめて、問題がなければ終了です。

##おわりに
PMDの読み込みができたので、次回からはSlimDXを使用して、モデルの表示の準備をする予定です。
seed-fuのseedファイルで特定のディレクトリ以下のCSVを全部読み込む方法

## まずは、fixturesディレクトリを作ろう
[railsで初期データを入れる(seed-fuの使い方)](http://qiita.com/ko2ic/items/be96e450a33d631e0059)を参考にいざ導入！
書いてある通りにdb/fixturesを作成

## モデル
とある大学の講義データです。
毎年、学部、学科ごとにcsvが存在します。
階層でいうと、学科は学部の下に属し、学部は年度の下に属します。
よってディレクトリ構成は、
db/fixtures/2016/学部名/学科名.csv
↑がたくさんあります。

## csv読み込み用のseed.rbを作ろう
ということで、実際のコードはこちら

``` seed.rb
Dir.glob("#{Rails.root}/db/fixtures/2016/*/*.csv").each do |f|
  CSV.read(f).each do |row|
    Lesson.seed do |s|
      s.faculty_id = row[0]
      s.department_id = row[1]
      s.lesson_number = row[2]
      s.lesson_code = row[3]
      s.lesson_name = row[4]
    end    
  end
end
```
ポイントは「 * 」が使えるということと、「 Dir.glob 」と、「 #{Rails.root} 」くらいですかね。
以外と情報が出てこなかったので、備忘録も兼ねて。

## 2016/09/28追記・変更
上記のseedプログラムだと主キー(今回はそのままのid)がファイルが変わるたびに0からスタートになって、結果的に登録されるのは最後のCSVファイルだけでした。
そこで、以下のようにグローバル変数$iを宣言して、そこに積み重ねたidをぶちこむという方法で解決！

``` seed.rb
$i = 1
Dir.glob("#{Rails.root}/db/fixtures/2016/*/*.csv").each do |f|
  CSV.read(f).each.with_index($i) do |row, i|
    Lesson.seed do |s|
      s.id = i
      s.faculty_id = row[0]
      s.department_id = row[1]
      s.lesson_number = row[2]
      s.lesson_code = row[3]
      s.lesson_name = row[4]
      $i = i
    end
  end
end
```

ポイントは ```.each.with_index($i)```ですかね。  
.with_index(数値)で、スタートの数字を決められるとのこと。その（数値）に前のcsvファイルから引き継いだidを入れていく感じです！

## 後記
そして、メインのCSV読み込みに関してももっと上手な方法がありそうです。ご指摘ください。

ps.初めてのqiita投稿！
PHPUnitで Entity of type  is missing an assigned ID for field  'id' が表示されるとき

自分用のメモです。

phpunit ver  5.2.3

テストコードを書いて実行したときに

```
 Entity of type AppBundle\Entity\Hoge is missing an assigned ID for field  'id'
```

Hogeエンティティでエラーがでた。

これはエンティティに記載してあるプロパティのところの書き方がおかしいみたい。

元の書きかた

```php

class Hoge
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $id;

    /**
     * @var integer
     *
     * @ORM\Column(name="hoge_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $hogeId;
```

修正後

```php

class Hoge
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var integer
     *
     * @ORM\Column(name="hoge_id", type="integer", nullable=false)
     */
    private $hogeId;
```

こうすればエラーがでなくなった。
Symfonyで最後に発行したSQLを確認する

symfonyでquery builderを使ってコードを書いているときに発行したクエリが自分の想像しているものか確認するとき
良く忘れるので自分用にメモ

```
  $qb = $this->em->createQueryBuilder()
            ->select('hoge')
            ->from('Bundle\Entity\hoge', 'hoge')
            ->where('hoge.id = :id')
            ->setParameter('id', $id);
  $qb->getQuery()->getSQL();
```

これで結果をprintすれば発行したクエリがわかるので確認してクエリを修正する
Xcode 8 & swift 2.3 の環境で fastlane にて Fabric beta にアップロードする設定

Update legacy build API to fully work with Xcode 8
https://github.com/fastlane/fastlane/pull/6018

上記MRが取り込まれたバージョンを使う必要性がある。よって、githubのmasterを指定する。

```text:Gemfile
gem 'fastlane', :github => 'fastlane/fastlane'
```

CocoaPodsを使用している場合、podで導入したライブラリをswift 2.3対応のビルドをするように設定する必要性がある。

```text:Podfile
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |configuration|
      configuration.build_settings['SWIFT_VERSION'] = "2.3"
    end
  end
end
```

fastlaneにswift2.3のtoolchainを使用してビルドするように指示する。gymを下記のように変更する。

```text:Fastfile
gym(scheme: "xxx",
  use_legacy_build_api: false,
  toolchain: "com.apple.dt.toolchain.Swift_2_3",
  export_method: "ad-hoc")
```

以上の変更を適用することでFabric betaにCI環境から自動デプロイできるようになった。
はじめてのUnlimited Hand


#Unlimited Handとは
![ss.jpg](https://qiita-image-store.s3.amazonaws.com/0/106081/ec780112-58f1-8171-047f-5bace735105c.jpeg)
ゲームコントローラーとして[H2L](http://h2l.jp)社から販売されているデバイス。
腕や指先の動きをトラッキングできるだけでなく、実際に筋刺激として指や腕にフィードバックを与えることができる。
イメージとしてはプログラマブルな血圧測定器。

#セットアップ
今回はUnityとArduino IDEを使ってUnlimited Handを動かしてみます。
（OSX EI Captain 10.11.4）
###必要な物
-Unlimited Hand
-Unity(5.3.x以上が無難)
-Arduino IDE（1.6.9で動作確認済み）
###1.Unlimited Handにジェルを貼る。
[この記事のこの箇所](http://qiita.com/satoshi_noda/items/0623f60570752e992540#ジェルを張る)を参考にしてください。ジェルは裏表を間違えると腕にくっつき、本体から離れてしまいました。
###2.Unlimited Handにシリアル通信用プログラムを書き込む。
・[ここ](http://dev.unlimitedhand.com/download.html)からライブラリをダウンロードする。
・ダウンロードしたUHフォルダをそのまま、下のようにlibrariesフォルダの中に入れる。

<img width="593" alt="スクリーンショット 2016-09-27 17.09.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/106081/aec9c00a-24c5-d2b4-b47f-7392f1749e9f.png">

・Arduino IDEを起動。
メニューの ファイル > スケッチの例 > UH > Serial_4Unity_4Processingを選択。

<img width="1125" alt="スクリーンショット 2016-09-27 17.13.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/106081/39c74aad-f4e5-171d-aec3-c7d5de05f088.png">

・このプログラムUnlimitedHandに書き込む。[ここ](http://qiita.com/satoshi_noda/items/a8fc874809711b5e78c6#unlimitedhandに書き込む)を見れば大丈夫。
###3.Unityでサンプルプロジェクトを動かしてみる。
・[ここ](http://dev.unlimitedhand.com/UHDemo_Graph.zip)からプロジェクトをダウンロードする。
・Unityでプロジェクトを開く。

<img width="1321" alt="スクリーンショット 2016-09-27 17.19.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/106081/37b1c884-44d2-ad04-acd4-d2c6e02adb8a.png">

・Unlimited HandがUSBに接続されていることを確認し、再生ボタンを押す。
（この時にCOMがUHプレハブのインスペクタ上に自動的に割り当てられていなくてエラーが起きた場合は、[ここ](http://qiita.com/satoshi_noda/items/0623f60570752e992540#unityで動かす)を参照。）
・ボタンを押すと、いろいろフィードバックがあると思います。少々刺激強めのやつもあるけれど、実際に指が勝手に動いて楽しいです。

他にもサンプルがいくつかあります。
[http://dev.unlimitedhand.com](http://dev.unlimitedhand.com)

###4.Bluetooth接続をしてみる。
基本[ここ](http://dev.unlimitedhand.com/ja/introduction/bluetooth.html)を見ながらやれば、UnlimitedHand本体の設定はできるはず。ただ、すぐにペアリングが切れてしまう。実用上ちょっと心配。
Unity側は、ペアリングさえできていれば、再生ボタンを押すと自動的にポートを割り当ててくれるはず。

###5.自分でオリジナルのUnityプロジェクトを作る。
・本体側の設定は2と全く同じ。
#####Unity側の設定
1.[UH.cs](http://dev.unlimitedhand.com/UH_Unity0039.zip)をインポート。

2.Empty Objectを一つ作り、それにUH.csをアタッチする。

<img width="1280" alt="スクリーンショット 2016-09-27 17.40.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/106081/cb860e36-48ca-b7eb-71f8-608b61c66874.png">

3.基本はこれでUnlimited Handと通信できる。
（UH.csの中身は、ほぼArduinoとシリアル通信するコードと同じ。）

4.鍵になるメソッド
-`void stimulate(int padNum)`　... 筋刺激を起こすメソッド
-`float[] readUH3DAccel()`　... 加速度を取得
-`float[] readGyro ()`　... 回転（ジャイロ）を取得。
-`float[] readUHJointAngles(int READ_TYPE)`　... 腕や指の曲がり具合を取得。

#今後
普通に使いやすくてビックリした。
今まで触覚をキーにした入力デバイスがなかったのですごく可能性が広がる。
もっとディベロッパーコミュニティーが広がることを望む。

#参考になったリンク集
-公式ディベロッパーサイト（[http://dev.unlimitedhand.com](http://dev.unlimitedhand.com)）
-satoshi_nodaさんの記事([http://qiita.com/satoshi_noda/items/0623f60570752e992540](http://qiita.com/satoshi_noda/items/0623f60570752e992540))
Windows10 で Vagrant が起動しない場合の対処方法

##実行環境

- Windows 10
- Cygwin
- VirtualBox 5.1.6

## Vagrant のバージョン確認
```
$ vagrant -v
Vagrant 1.8.1
```

## VirtualBox のバージョン確認

- VirtualBox 起動
- ファイル→アップデートを確認(H)...

## vagrant を起動

```
$ vagrant up
==>  Provider 'virtualbox' not found. We'll automatically install it now...
     The installation process will start below. Human interaction may be
     required at some points. If you're uncomfortable with automatically
     installing this provider, you can safely Ctrl-C this process and install
     it manually.
==>  Downloading VirtualBox 5.0.10...
     This may not be the latest version of VirtualBox, but it is a version
     that is known to work well. Over time, we'll update the version that
     is installed.

==>  Installing VirtualBox. This will take a few minutes...
     A couple pop-ups will occur during this installation process to
     ask for admin privileges as well as to install Oracle drivers.
     Please say yes to both. If you're uncomfortable with this, please
     install VirtualBox manually.
==>  VirtualBox has successfully been installed!
No usable default provider could be found for your system.

Vagrant relies on interactions with 3rd party systems, known as
"providers", to provide Vagrant with resources to run development
environments. Examples are VirtualBox, VMware, Hyper-V.

The easiest solution to this message is to install VirtualBox, which
is available for free on all major platforms.

If you believe you already have a provider available, make sure it
is properly installed and configured. You can see more details about
why a particular provider isn't working by forcing usage with
`vagrant up --provider=PROVIDER`, which should give you a more specific
error message for that particular provider.
```


## 原因
- Vagrant が VirtualBox に対応していない可能性

> The VirtualBox provider is compatible with VirtualBox versions 4.0.x, 4.1.x, 4.2.x, 4.3.x, 5.0.x, and 5.1.x. Other versions are unsupported and the provider will display an error message. Please note that beta and pre-release versions of VirtualBox are not supported and may not be well-behaved.
-- https://www.vagrantup.com/docs/virtualbox/

現在もメンテナンスリリースが続いている 5.0.x 及び 5.1.x の一部未対応
■ Github の Issues にも報告あり
[Github (mitchellh/vagrant) - Windows 10, Vagrant 1.8.1, Virtualbox 5.0.12 fails on vagrant up on all boxes #6733] (https://github.com/mitchellh/vagrant/issues/6733)

## 対処方法1
- VirtualBox のバージョンを 5.0.10 にロールバックする。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/95032/1a4ef3e0-7fc1-f13c-73dc-25c5bdc42570.png)
[Windows 10, Vagrant 1.8.1, Virtualbox 5.0.12 fails on vagrant up on all boxes #6733](https://github.com/mitchellh/vagrant/issues/6733)

## 対処方法2
- プロパティを変更する。

1. コントロール パネル > ネットワークとインターネット > ネットワーク接続
2. VirtualBoxHost-Only Network > プロパティ
3. VirtualBox NDIS6 Bridged Networking driver をチェック > OK

![pro.png](https://qiita-image-store.s3.amazonaws.com/0/95032/0ce5179b-d56c-c284-f9bf-826762fa28c1.png)
go言語でのファイルダウンロードリンクの作り方（goji

内部で作ったCSV形式の文字列をファイルとしてダウンロードさせたかったのだが、いい感じの説明が見当たらなかったのでメモ

```go:sample.go
func (self *Sample) OutputCSV(c web.C, w http.ResponseWriter, r *http.Request) {
	// 保存させたい文字列をbyte配列にする
	out := []byte("test,test2,test3")

	// いろんな文字列情報
	// ファイル名
	w.Header().Set("Content-Disposition", "attachment; filename=test.csv")
	// コンテントタイプ
	w.Header().Set("Content-Type", "text/csv")
	// ファイルの長さ
	w.Header().Set("Content-Length", string(len(out)))
	// bodyに書き込み
	w.Write(out)
}
```

こちらを参考にしました
[golang - how to download file in browser from golang server?](http://stackoverflow.com/questions/24116147/golang-how-to-download-file-in-browser-from-golang-server, "stackoverflow")
Android DialogFragmentで引数を扱う


### ダイアログを呼び出す側で、引数を渡すところ

```java:HogeFragment.java
// 〜省略
dialogFragment = new AlertDialogFragment();
Bundle args = new Bundle();
args.putInt("hoge_arg1",position); //引数
dialogFragment.setArguments(args);
dialogFragment.show(getActivity().getFragmentManager(),"dialog");
// 〜省略
```


### ダイアログ表示に渡しした引数を取得するところ

```java:AlertDialogFragment.java
// 〜省略
// アラートダイアログ
public static class AlertDialogFragment extends DialogFragment {
        
    private AlertDialog.Builder alert;

    @Override
	public Dialog onCreateDialog(Bundle savedInstanceState) {
		alert = new AlertDialog.Builder(getActivity());
		int hogeInt = getArguments().getInt("hoge_arg1");
// 〜省略
```
iOS 10 で Cordova/Phonegap アプリが動かなくなった

具体的には deviceready イベントが発火しなくなったので、テンプレート通りに初期化処理を入れているとコールされない。

Content Security Policy に `gap://ready` と `file:`を追加することで動作するようになる。

http://stackoverflow.com/questions/38410159/ より参考実装を引用させて貰うとこんな感じ。

```html:index.html
<meta http-equiv="Content-Security-Policy" content="default-src * gap://ready file:; style-src 'self' 'unsafe-inline'; img-src 'self' data:; script-src * 'unsafe-inline' 'unsafe-eval'">
```

CSP いつも書き方が分からなくなり追加する場所をミスったりするので、実際に自分が追加した例もメモ程度に。

```html:index.html
<meta http-equiv="Content-Security-Policy" content="default-src * 'unsafe-eval' 'unsafe-inline' gap://ready file:; style-src 'self' 'unsafe-inline'; media-src *; img-src * 'self' filesystem: data: blob:;" />
```

追記
====
テンプレートから作ると CSP 記述の下にコメントで

```
  * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication
```

という記載があり、iOS 9 迄でこれ無しで動かしていた場合は `gap:` だけ追加することで動くこともある様子。
Xcode 8+Swift 2.3でFastlaneを使ってビルドしたい場合のTips


Toolchainをswift 2.3にして実行する。


```
[16:40:25]: If you're using Swift 2.3, but already updated to Xcode 8
[16:40:25]: try adding the following parameter to your gym call:
[16:40:25]: gym(use_legacy_build_api: true, toolchain: :swift_2_3)
[16:40:25]: or
[16:40:25]: gym --use_legacy_build_api --toolchain swift_2_3
```


もしくは、Fastfileを書き換えたくない場合は、環境変数を使って実行する

```
fastlane ios beta GYM_TOOLCHAIN=swift_2_3
```
FuelPHPでデプロイしたアプリケーションのURLからpublicを消す

`http://hoge.com/appname/`な感じでサブディレクトリにデプロイしようとしたとき、ApacheのエイリアスやLinuxのシンボリックリンクというワードにたどり着くまでちょっと時間かかったのでめも。

FuelPHPで作成したアプリをそのままサーバーに載せると`http://hoge.com/fuga/public`となります。
普通はアプリ単体でドメインを取ると思うので`var/www/html/fuga/public`をドキュメントルートにすればいいだけですが。
ディレクトリ構成には手を入れたくないのでpublicディレクトリをリネームしたり移動するのは無しで。

# シンボリックリンクを使う

```bash
ln -s /var/www/app/fuga/public /var/www/html/fuga
```

非公開の場所にアプリケーションを設置、公開ディレクトリからシンボリックリンクを張ります。
apacheにはシンボリックリンク先のファイルアクセスを許可するかの設定**FollowSymLinks**（デフォルトで有効）があるのでこれが有効であればこれでアクセスできます。

シンボリックリンクはユーザーのアクセス権が無いファイルにも作成できたりするので環境によってはリスクがあります。
http://blog.tokumaru.org/2013/09/symlink-attack.html
複数サービスを１サーバーで運営したりする場合は注意が必要です。

# Apacheのエイリアスを使う
```
Alias /fuga/ "/var/www/app/fuga/public/"
```
シンボリックリンクと似ていますが、apacheが提供している機能です。

`/etc/httpd/conf/httpd.conf`内に設定します。
http://www.adminweb.jp/apache/docroot/index3.html
特定URLを特定のパスへ変換してくれます。

またpublicディレクトリ内のhtaccessのRewriteBaseも変更しないと生成されるリンクのURLが正しくならないようです。
`http://hoge.com/fuga/test/1` とならず `http://hoge.com/test/1` になる
http://qiita.com/abeichi/items/65ca98a8e2400dfc75b3

```
RewriteBase /fuga
```
SQLServerのXMLデータ中から特定の要素の値を取得する

# SQLServerのXMLデータ中から特定の要素の値を取得する

SQLServerにはintやvarcharなどおなじみのデータ型以外に、xmlデータ型が存在する。
xml型はその名前の通りxmlを格納するデータ型なのだが、SQL文でこのXML中の値を取得することができる。

今回は、XML中の値の取得についてのみ記載する。他にも色々とできるらしいが、今回は言及しない。
また、個人的メモの意味も強いので、説明を色々と省略している。

## XQuery
XML中の特定の要素を取得する場合、XQueryを利用する。
XQueryについての説明は今回は省略する。（詳しくはググろう）

### 簡単な利用サンプル
記述のルールを説明してもよいが、ぱっと見でなんとなく分かると思うので例示だけしておく。

例えば、以下のようなXMLが存在したとする。この時、目的のノードを取得するXQueryは以下のものになる。

```
<group>
  <name>石鹸</name>
  <member>
    <person number="1">高坂</person>
    <person number="2">南</person>
    <person number="3">園田</person>
  </member>
</group>
```

```<name>石鹸</name>``` を取得したい場合のXQuery

```
/group/name
```

```<person number="2">南</person>``` を取得したい場合のXQuery

```
/group/member/person[@number="2"]
```


### 名前空間付きの利用サンプル
名前空間が指定されている場合、XQueryでもその名前空間を指定する必要がある。

```
<group xmlns:="sunshine">
  <name>水</name>
  <member>
    <person number="1">高見</person>
    <person number="2">渡辺</person>
    <person number="3">桜内</person>
  </member>
</group>
```

```<name>水</name>``` を取得したい場合のXQuery
declareで名前空間を宣言し、要素を指定する必要がある。

```
declare namespace sun="sunshine";
/sun:group/name
```

## SQLServer中のXMLから値を取得する
上記で記載したXQueryを利用して、データを取得する。  
SQL文ではXMLの項目に対してvalueメソッド（.value(XQuery文, SQL型)）を利用することで値を取得できる。

```
SELECT 
  xmlCol1.value('(/group/name)[1]', 'nvarchar(50)') AS  NAME1,
  xmlCol2.value('
    declare namespace sun="sunshine";
    (/sun:group/name)[1]', 'nvarchar(50)') AS NAME2
FROM L_L
```

結果

```
NAME1   NAME2
----------------------
石鹸     水
```


## 最後に
SQLServer中のxmlの特定の要素を取得したい、という場合を例示した。
XQueryはきちんと利用すれば便利かもしれませんが、自分の用途では特に必要がなかったので、この程度にとどめておく。

例示が露骨にアレなのはご愛嬌。


## 修正履歴
SQL Serverで使用するメソッドを間違えていたので修正。 
　valメソッド　→　valueメソッド
DynamodbLocalでScanを実行するとCannot do operations on a non-existent tableになってしまう問題を解消する

## 概要

DynamodbLocalで開発しているとき、ふとSacnが正しく動作しないことに気づきました。
で、その対応を調べたのでメモっておきます。

## やったこと

```js
dynamodb.listTables().eachPage(function(err, data) {
    if (err) {
        ppJson(err); // an error occurred
    } else if (data) {
        ppJson(data);
    }
});
```

でテーブル一覧をだして、テーブル名を間違えないようにメモ（コピーできないの辛い）、Scanで一覧出し。

```js
var params = {
    TableName: 'test_RECORD_A',
};
docClient.scan(params, function(err, data) {
    if (err) ppJson(err); // an error occurred
    else ppJson(data); // successful response
});
```

結果、

```
"message":"Cannot do operations on a non-existent table"
"code":"ResourceNotFoundException"
"time":"2016-09-27T06:55:28.448Z"
"statusCode":400
"retryable":false
```

ええ・・・


## やり方

 - [ステップ 4: データをクエリおよびスキャンする - Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/gettingstartedguide/GettingStarted.NodeJs.04.html)

を参考にして、少し付け加えてみました。

```js
AWS.config.update({
  region: "us-west-2",
  endpoint: "http://localhost:8000"
});

var docClient = new AWS.DynamoDB.DocumentClient();

var params = {
    TableName: 'test_RECORD_A',
};
docClient.scan(params, function(err, data) {
    if (err) ppJson(err); // an error occurred
    else ppJson(data); // successful response
});

```

すると、うまく動きました。
CSS3 Multi-column Layout で Masonry のような（レスポンシブ）タイル・レイアウトを実現する

👇こういうやつですね。

![min.png](https://qiita-image-store.s3.amazonaws.com/0/34660/c120ca80-d228-513e-27ea-f053da5e9e40.png)

使いどころがあまり思いつかないかも知れませんが、
いつの間にかマルチカラム・レイアウトが現実的に使えるようになっていました。
これでレスポンシブなタイル・レイアウトが実現できます。

[IE10以上OK（http://caniuse.com/#feat=multicolumn）](http://caniuse.com/#feat=multicolumn)
["> 1% in JP"（http://browserl.ist/?q=%3E+1%25+in+JP）](http://browserl.ist/?q=%3E+1%25+in+JP)

## プロパティ

指定できるプロパティには下記のようなものがあります。

### 親要素

- カラム数/幅 __columns__
- カラム間隔 __column-gap__

### 子要素

- 折り返し __break-inside__

※ 子要素は__inline-block__にする必要があります。


## Masonryぽいレイアウトサンプル

>[codepen](http://codepen.io/pokkur/pen/zKopVY)

上記URL下段のセクションでは、「flexレイアウトでも同じように実現できるかも」と試しましたが、
親の高さを決め打ちしたり、アダプティブにしたとしてIEでは無理でした……。
Sass(SCSS)でフォント読み込むときはmixinを使うべきと悟った話

**「Sass(SCSS)において外部ファイルからフォントを読み込む際、どう読み込むべきか」**の話です。

CSSからSassに本格的に乗り換えてまだ日の浅いこの頃、外部ファイルとして存在するフォントをどう_「SASSっぽくスマートに」_読み込むにはどうすべきか探っていて数時間模索してました。その結論を端的に書き残します。

## 1. mixin使え

まずフォントを読み込み際にいちばんナンセンスなのは変換後のCSSにべた書きすること。これはひどい。ではSASSのポテンシャルを引き出しつつスマートに書くにはどうすべきか。と考えてmixinに至りました。まずmixinディレクトリ内に`_fonts.scss`を用意、もしくは`_mixin.scss`自体に下記のコードを書き込みます。

```/mixin/_fonts.scss
@mixin font-face($name, $path, $weight: null, $style: null, $exts: otf ttf) {
  $src: null;

  $formats: (
    otf: "opentype",
    ttf: "truetype"
  );

  @each $ext in $exts {
    $format: map-get($formats, $ext);
    $src: append($src, url(quote($path)) format(quote($format)), comma);
  }

  @font-face {
    font-family: quote($name);
    font-style:  $style;
    font-weight: $weight;
    src: $src;
  }
}
```

この記述は「あとでインクルードするのがスーパー楽」かつ「複数のフォントタイプ指定可能」かつ 「スタイル等もインクルードの際に変数として指定できる」ことを目指して行き着いた形です。この例では読み込むフォントが`otf`と`ttf`の場合みを想定した記述になっていますが、需要に併せて追加していけます。

## 2. importしろ

次にこのmixinファイルを他のSCSSファイル達とともにインポートします。`style.scss`または他の任意のマニフェストファイルに読み込みましょう。

```style.scss
@import './mixin/fonts';
```

これで先ほどのフォントmixinをインクルードする準備が整いました。

## 3. includeしろ

インクルード場所に関しては諸意見ありますが、今回はマニフェストファイル内にそのままインクルードします。

```style.scss
@import './mixin/fonts';

@include font-face('<フォント名>', '＜フォントファイルまでのパス＞', <ウェイト>, <スタイル>, <タイプ>);
```

実際に使ってみると下記のように書くことができます。

```style.scss
@import './mixin/fonts';

@include font-face('TeX Gyre Adventor', '../../fonts/texgyreadventor-regular', null, null, ttf);
@include font-face('TeX Gyre Adventor', '../../fonts/texgyreadventor-bold', bold, null, ttf);
@include font-face('Freestyle Script Std', '../../fonts/FreestyleScriptStd', null, null, ttf otf);
```

`ウェイト`と`スタイル`は何も指定がない場合`null`を入れてあげましょう。フォントタイプは複数指定可能です。複数タイプ指定する場合には"`ttf otf`"のようにスペースを空けてつなげてあげてください。

## 4. CSSに変換してみろ

実際に正しい書き方になっているかどうか、CSSにコンバートして確かめてみます。ターミナル上からコマンドで、`style.css`というファイルに変換してみます。

```bash
$ sass style.scss:style.css
```

`style.css`を開いて中身を確認します。

```style.css
@font-face {
  font-family: "TeX Gyre Adventor";
  src: url("../../fonts/texgyreadventor-regular") format("truetype"); }

@font-face {
  font-family: "TeX Gyre Adventor";
  font-weight: bold;
  src: url("../../fonts/texgyreadventor-bold") format("truetype"); }

@font-face {
  font-family: "Freestyle Script Std";
  src: url("../../fonts/FreestyleScriptStd") format("opentype"),
       url("../../fonts/FreestyleScriptStd") format("truetype"); }
```

はい、問題なく読み込まれていますね。あとは普通にスタイルシート内で`font-family`プロパティから使ってあげることができます。使ってみて何か不具合があれば、何でもコメントください。

---

参考サイト：[SASS @font-face mixin](https://gist.github.com/jonathantneal/d0460e5c2d5d7f9bc5e6#file-_mixins-scss)
DRBD9をUbuntu16.04にさくっとインストール

## DRBD9とは？
DRBDはこれまで基本的にはサーバ1対1でデータのレプリケーション(複製)するためのソフトウェアでした。
しかしDRBD9では多ノード間でデータレプリケーションができるようになりました。

そんな多ノードでレプリケーション(複製)何に使うの？と思われるかもしれませんが、OpenStackなどに組み込んでSDS的な使用を想定しています。
Cephをイメージするとわかりやすいと思います。

いきなりOpenStackと連携するのはハードルが高いので今回はDRBD9の多ノードレプリケーション機能を試してみます。

## DRBD Manage
多ノード対応することにより設定値が複雑になるため自動的に設定をしてくれるDRBD Manageというツールがあります。
今回はDRBD Manageを使って環境を作っていきます。

## 構築環境
3台のサーバのデータをレプリケーション(複製)していきます。
ホスト名とIPアドレスは読み替えて実施してください。

![DRBD9.png](https://qiita-image-store.s3.amazonaws.com/0/101744/db821094-31e5-bb9d-79e7-f40d0390c676.png)

またインストールは全てのサーバで実施してください。

## インストール環境
||バージョン|
|:--|:--|
|OS|Ubuntu 16.04|
|DRBD|9.0.4|
|DRBD Manage|0.97.5|

## 事前準備
各サーバにDRBD用のディスク領域を作成してください。仮に/dev/sdbとしています。
作成した上で以下のコマンドでlvmを作成してください。

```shell-session
$ sudo fdisk /dev/sdb
$ pvcreate /dev/sdb1
$ vgcreate drbdpool /dev/sdb1
```

次に事前に各サーバ間で鍵交換を実施してください。

```shell-session
# sudo ssh-keygen -t rsa
# sudo ssh-copy-id -i .ssh/id_rsa.pub root@<各サーバIPアドレス>
```

## DRBD9インストール
DRBD9はUbuntuではインストールが非常に簡単にできます。DRBD9を試すには最適です。

まずリポジトリを追加します。

```shell-session
$ sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
$ sudo apt update
```

次にDRBD9とDRBD Manageをインストールします。

```shell-session
$ sudo apt-get install drbd-utils python-drbdmanage drbd-dkms
```

以上でインストールは完了です。

DRBD manageを使った設定手順は以下を参照しました。
http://tech-sketch.jp/2015/11/drbd9.html
http://ksawada.hatenablog.com/entry/2016/06/13/154411
WindowsでCapsキーをCtrlキーにする

#はじめに
- 日本語キーボードでも、Ctrlキーは左下よりもAの左のほうが使いやすい（と思う）ので、Caps を Ctrl にしてしまう


#設定
- レジストリに以下の内容を追加

```registry:caps2ctrl.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00
```

- 追加したら再起動

#注意点
- レジストリを操作するので、初心者お断り
- Ctrl は行方不明になる
- Windows Update の後とかで、設定が消えてしまうことがある（その場合はもう１回やる）


#物理的な解法
- [OKI MINI KEYBOARD Pro日本語89KEY](http://online.plathome.co.jp/item/detail/11650756/OKI/MINI-KEYBOARD-Pro%E6%97%A5%E6%9C%AC%E8%AA%9E89KEY-RoHS%E5%AF%BE%E5%BF%9C%E7%89%88/HMB632KJP-R)とかを使う
- あきらめて英語キーボードを使う