OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift】Vagrant で Ubuntu を動かして Swift をインストールするまで

# 環境

macOS: 10.12.1
Vagrant: 1.8.7
VirtualBox: 5.0.24

# 1. Vagrantのインストール

こちらからダウンロードしてインストールを行います。
https://www.vagrantup.com/downloads.html

# 2. VirtualBoxのインストール

今回は、最新版ではなく、こちらからバージョン5.0.24をダウンロードし、インストールしました。
https://www.virtualbox.org/wiki/Download_Old_Builds_5_0

※VirtualBoxのバージョンが最新版であることによって、Vagrantが対応できていないことがあるようなので、このようにしました。
参考：http://qiita.com/mtake6212/items/de7b26da8b283213f12a

# 3. boxの追加

今回はSwiftを使える環境にしたいので、[`Ubuntu 14.04 or 15.10 (64-bit)`](https://swift.org/download/#linux)のディストリビューションのboxをダウンロードします。

ここから、該当するboxを探します。
http://www.vagrantbox.es/

今回は、次のboxを使うことにしました。

```
https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
```

`vagrant box add` コマンドを使って、boxを追加します。

```
$ vagrant box add Ubuntu-14.04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
```

`vagrant box list` コマンドで先ほど追加したboxが表示されればOKです。

```
$ vagrant box list
Ubuntu-14.04 (virtualbox, 0)
```

# 4. 仮想マシンの初期化

`vagrant init {box-name}` というコマンドで初期化ができるので、次のように先ほど追加したboxで初期化を行います。

```
$ vagrant init Ubuntu-14.04
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

初期化が終わると、同ディレクトリに`Vagrantfile`が作成されています。
必要であればこの`Vagrantfile`の内容を書き換えて設定を変えることができますが、一旦このままで行きます。

# 5. 仮想マシンの起動＆ログイン

ここまでで、仮想マシンを立ち上げる準備が完了しました。
作成した仮想マシンを立ち上げるためには、`vagrant up`コマンドを使います。

```
$ vagrant up
```

無事立ち上がったら、仮想マシンへssh接続してログインします。

```
$ vagrant ssh
```

# 6. Swiftのインストール

マニュアルでインストールする場合は、公式に従って行うのがいいかと思います。
https://swift.org/download/#installation-1


今回は、楽をしたいので、Server Side Swiftのフレームワークである[Vapor](https://vapor.codes/)のインストールスクリプトを使ってインストールを行います。

ドキュメントは[こちら](https://vapor.github.io/documentation/getting-started/install-swift-3-ubuntu.html)。

sshで入った仮想マシンの中で次のコマンドを実行します。

```
$ sudo curl -sL swift.vapor.sh/ubuntu | bash
```

ドキュメントでは`sudo`なしですが、私が実行した際には`sudo`付きでないとインストールできませんでした。

※ちなみに、実際に実行されているスクリプトは[こちら](https://github.com/vapor/swift/blob/master/ubuntu)になります。

無事インストールできたら、最後に`~/.bashrc`の内容を反映させます。

```
$ source ~/.bashrc
```

# 7. 動作確認

バージョンを確認してみます。

```
$ swift --version
Swift version 3.0 (swift-3.0-RELEASE)
Target: x86_64-unknown-linux-gnu
```

対話式に実行してみます。

```
$ swift
Welcome to Swift version 3.0 (swift-3.0-RELEASE). Type :help for assistance.
  1> let test = "hoge"
test: String = "hoge"
  2> print(test)
hoge
```

動いていますね。


# 最後に

今回はVaporのスクリプトを使ってサクッとSwiftのインストールを行いました。
便利な反面、バージョンアップ時の対応やスクリプト自体のバグなどがあった際にすぐに対応できなくなってしまったりすることはあるかと思います。
少なくとも、インストールスクリプト自体は読んで理解した上で使う必要はありますね。

とりあえず、Swiftが動くようになったので、次はVaporで作ったアプリケーションのデプロイなどに挑戦しようと思います。
Google BigQuery Standard SQLで配列の配列を作る方法


Google BigQueryのStandard SQLはSQLなのに配列や構造体といった、構造化されたデータ構造をサポートしています。

そのため、次のようにx座標とy座標からなる座標点を配列で表現することができます。

```sql
SELECT [1, 2] AS point
```

さて、それでは座標点の集合として表現される折れ線はどのように表現しましょうか。
素直に表現するのならば、以下のような配列の配列でしょうか。

```sql
SELECT ((1, 2), (3, 4), (5, 6)) as polygonal_line
```

しかし、この方法では以下のようなエラーが出てしまいます。

> Cannot construct array with element type ARRAY<INT64> because nested arrays are not supported at [1:9]

それでは、どのようにすれば配列の配列を表現できるのでしょうか。

# 答え
配列を要素に持つ構造体の配列を作る。

構造体を間に挟むことで、配列の要素が配列になることを防いでいます。
SQLでは以下のように表します。

```sql
SELECT [STRUCT([1, 2] AS point), STRUCT([3, 4]), STRUCT([5, 6])] AS polygonal_line
```

各要素にアクセスするためには以下のようにします。

```sql
WITH polygonal_lines AS (
  SELECT [STRUCT([1, 2] AS point), STRUCT([3, 4]), STRUCT([5, 6])] AS polygonal_line
)

SELECT polygonal_line[OFFSET(0)].point AS first_point FROM polygonal_lines
```

```sql
WITH polygonal_lines AS (
  SELECT [STRUCT([1, 2] AS point), STRUCT([3, 4]), STRUCT([5, 6])] AS polygonal_line
)

SELECT polygonal_line[OFFSET(0)].point[OFFSET(0)] AS first_point_x FROM polygonal_lines
```

構造体を用いているために、素直に配列の配列を使う場合と比較して、`.point`という記述が余計に必要になっています。
Vagrantの基本操作

# 環境/前提
- OS: OS X El Capitan
- provider: VirtualBox(ver5.1.8)
- 仮想OS: centos7.2
- rootで作業してる事を前提に記述


# OSのイメージをローカルにboxとして登録
## 登録
```
# vagrant box add centos/7
```

## 確認
```
# vagrant box list
centos/7 (virtualbox, 1609.01)
```

# Vagrantfileの作成
任意のディレクトリで

```
# vagrant init centos/7
```

# VMを起動
```
$ vagrant up
```

# VMの状態を確認する
```
$ vagrant status
```

# VMにSSH接続
```
# vagrant ssh
```

# VMからログアウト
```
# exit
```
または

```
control + D
```

# VMを停止
```
# vagrant halt
```

# VMをProviderから削除
ここではVirtualBox上から削除されます

```
$ vagrant destroy
```
カレントディレクトリ配下の
- Vagrantfile
- .vagrantディレクトリ
は削除されない。再び

```
# vagrant up
```
を実行すればVMは作成されるが、destroyする前にVM上で作成したファイルは復旧されない。

# VMのスナップショットを作成する
```
# vagrant package
```
カレントディレクトリに
package.box
ファイルが作成される(VirtualBox上にスナップショットが生成されるわけではない）


# スナップショットからVMを作成する
(Vagrantfileのない)適当なディレクトリに移動し、

```
# vagrant init [package.boxのあるPath]
```
Vagrantfileが生成される

```
# vagrant up
```

# Vagrant BoxからOSイメージを削除
```
# vagrant box remove centos/7
```

# VM起動時にmountエラーが出る場合
```
# /etc/init.d/vboxadd setup
# exit
$ vagrant reload
```

参考：[vagrantでmountエラーの解決方法](http://qiita.com/osamu1203/items/10e19c74c912d303ca0b)
新google翻訳で学ぶ正しいプログラマーの言い訳

google翻訳がディープラーニングを使ったシステムに刷新され、訳が自然になったようです。それではどれだけ自然になったか、日常的に散見するプログラマーの言い訳で見てみましょう。日本語の原文を英訳し、それをさらに和訳してみましたので日々の仕事にご利用ください。

原文：私のマシンではちゃんと動くよ
英訳：It works fine on my machine.
英訳和訳：私のマシンでうまく動作します。

原文：プログラムが壊れたとき、君はどこにいたんだ？
英訳：Where were you when the program broke?
英訳和訳：プログラムが壊れたとき、どこにいたのですか？

原文：君の使い方が悪い。何故君のそのやり方で使わなきゃならないんだ？
英訳：Your usage is bad. Why should I use it your way?
英訳和訳：あなたの使い方は悪いです。 なぜあなたはそれをあなたの方法で使うべきですか？

原文：君のOSで、そのバージョンを使ってはいけないんだよ
英訳：Do not use that version with your OS.
英訳和訳：あなたのOSでそのバージョンを使用しないでください。

原文：仮にそれがちゃんと動かなかったとしても、何かまずいことがあるかい？
英訳：Even if it did not work properly, is there something wrong?
英訳和訳：正しく動作しなくても何か問題はありますか？

原文：ウィルスのチェックをちゃんとしたかい？
英訳：Have you checked the virus properly?
英訳和訳：あなたはウイルスを正しくチェックしましたか？

原文：誰かが私のコードをいじったに違いない！
英訳：Someone has made a fool of my code!
英訳和訳：誰かが私のコードをばかにしました！

原文：それはちゃんと動くんだけど、いままでテストされてなかっただけなんだ
英訳：It works just fine, but it has not been tested so far.
英訳和訳：それはうまく動作しますが、これまでのところテストされていません。

原文：これがあれの原因であるわけがない
英訳：This can not be the cause of that
英訳和訳：これが原因ではない

原文：そんなに全部のことをテストできるわけないじゃないか
英訳：You can not test all that much.
英訳和訳：あなたはそれほど多くをテストすることはできません。

原文：単に不運な偶然が重なっただけだ
英訳：Just a misfortune coincident overlapped.
英訳和訳：ただの不幸な一致が重なった。

原文：君の使っているのは、変なバージョンのやつだろ？
英訳：What you are using is a funny version of a guy, right?
英訳和訳：あなたが使っているものは面白い男のバージョンですよね？

原文：そこのコードは、もう何週間も触ってないよ
英訳：I have not touched the code there for weeks.
英訳和訳：私は数週間そこにコードを触れていない。

原文：君のデータの方がおかしいんだよ
英訳：Your data is more strange
英訳和訳：あなたのデータはより奇妙です

原文：クラッシュしたときに、何かタイプミスしなかった？
英訳：Did you make some typo when crashing?
英訳和訳：あなたはクラッシュ時にいくつかのタイプミスをしましたか？

原文：ハードウェアの問題に違いない
英訳：It must be a hardware problem.
英訳和訳：ハードウェアの問題でなければなりません。

原文：そんなはずないよ
英訳：I can not do that.
英訳和訳：私はそれをすることはできません。

原文：昨日は動いたよ
英訳：Yesterday it worked.
英訳和訳：昨日それは働いた。

原文：その操作は、誰も試したことがなかったんだよ
英訳：No one tried that operation.
英訳和訳：誰もその操作を試みなかった。

原文：それは妙だ…
英訳：That's strange ...
英訳和訳：それは奇妙だ ...

どうやら、英訳を和訳すると原文よりも失礼になるようです。乱用をするさいはご計画的に。
Proxmoxオレオレ情報まとめ

# [概要]
## Proxmoxとは
Proxmox VEとはProxmox Virtual Environmentの略でDebianベースの仮想化プラットフォームの管理の仮想アプライアンスのことです。
簡単にいうとKVMをESXiのように使えるツールで、基本Webブラウザだけで完結することができます。
ESXiは、NICのドライバ周りの相性などが結構めんどくさかったりしますが、その点Proxmoxは簡単に構築できるので、個人で使う環境としてはかなりいいです。

## 特徴
* debianベース開発されている
* オープンソースで開発されている
	* GNU AGPL, v3
* カーネルベースの仮想マシンのKVMが使用可能
	* カーネルベースなので、Windowsイメージも実行することができます。
* コンテナベースのLXCが使用可能
	* 最近流行りのコンテナ技術です。オーバーヘットがないので高速らしいです。
* ライブマイグレーションも使用可能
	* ダウンタイム無しで実行中の仮想マシンを移動可能
* すべてWebで完結することができる

## 依存関係
* とりあえず、インストールすれば使えます。

## 公式リンク
* 公式ページ
	* https://www.proxmox.com/en/
* 公式Wiki
	* http://pve.proxmox.com/wiki/Main_Page

# [知っておくべきこと]
あれば随時更新

## 用語集
* KVM
	* Kernel-based Virtual Machine の略で仮想的なコンピュータの上で複数のOSを並列に稼働させる仕組みのこと。
* LXC
	* Linux Containersとは1つのホスト上で複数の隔離されたLinuxシステム(コンテナ)を稼働させる仕組みのこと。

# [目次]
* 初期構築
    * [Proxmox VEをNUCに入れてお遊び環境を構築する](http://qiita.com/ghfdjk/items/1840ca3934be85c194f9)
    * [Proxmox VEをお遊び環境のNUCに入れたので初期設定をする](http://qiita.com/ghfdjk/items/eac2eb85b89da52c20c3)
プロパティまとめ

勉強したことメモ

##Stored Property

```swift:StoredProperty
struct BaseballPlayer {
    let fullName: String
    let position: String
}

var player = BaseballPlayer(fullName: "Yamada Taro", position: "Catcher")
player.fullName // "Yamada Taro"
player.jobtitle // "Baseball Player"
```

##Computed Property
計算してプロパティに値を入れる。
homeRundsの値が変わるとsalaryも変わるのでvarで宣言しなければならない。

```swift:ComputedProperty
struct BaseballPlayer {
    let fullName: String
    let position: String
    var homeRuns: Int
    //給与 = ホームラン数 * 1,000,000
    var salary: Int {
        return homeRuns * 1_000_000
    }   
}

var player = BaseballPlayer(fullName: "Yamada Taro", position: "Catcher", homeRuns: 50)
player.salary // 50,000,000
player.homeRuns = 20
player.salary // 20,000,000


```

##Type Property
インスタンスからアクセスできない。
型そのものからはアクセス可能。
どこからでも同じ値が呼び出せる。

```swift:TypeProperty
struct ExampleStructure {
    static var typeProperty = 1
    var value = 2
    var anotherValue = 3
}

let exampleStructure = ExampleStructure()
exampleStructure.value // Static member 'typeProperty' cannot be used on instance of type 'ExampleStructure'
exampleStructure.anotherValue // 2
exampleStructure.typeProperty // 3

ExampleStructure.typeProperty // 1

```

##didSet/willSet
値がセットされた時/される前に処理が呼び出される。
初期化処理では呼び出されない。
didSetはnewValueを持たない。(didSet/willSet各処理からその値を呼び出せる)didSetはセットされた値がnewValue。
willSetはその逆でoldValueを持たない。
*値=currentNumber

getter/setter: computed property
didSet/willSet: stored property

```swift:didSet/willSet
struct Battery {
    
    var lowBattery: Bool {
        willSet {
            if newValue == true {
                print("Please charge !!")
            }
        }
    }
    
    var capableOfBattery = 100 {
        didSet {
            switch capableOfBattery {
            case 0...20:
                lowBattery = true
            case 30...100:
                lowBattery = false
            default:
                lowBattery = false
            }
        }
    }
}

var battery = Battery(lowBattery: false, capableOfBattery: 100)
battery.capableOfBattery = 10 // Please charge !!

```

##Lazy property
値（lazy property）がアクセスされた時だけ呼び出される。
初期化処理では呼ばれない。
処理時間がかかるものはlazyにしてアクセスする時だけ呼び出すようにするといいみたい。

```swift:LazyProperty
struct LazyAction {
    lazy var comment = {
        return "Too lazy"
    }()
}

var lazyAction = LazyAction() // まだcommentに値はセットされていない
print(lazyAction.comment) // Too lazy ここで初めて呼ばれる

```
Go言語で、外部エディタを起動する

# やったこと

Go言語でちょっとしたコマンドラインツールを作ろうと思っていて、外部エディタを実行中のターミナル内で立ち上げる方法が知りたかったのでメモ。

コマンドの入出力を標準入出力に指定するのがポイント。

```go:vim.go
package main

import (
    "os"
    "os/exec"
)

func main(){
	cmd := exec.Command("vim", "/tmp/hoge")

	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	cmd.Run()
}
```

下記で実行すると、実行中にVimが立ち上がり、編集できる。

```
go run vim.go
```

# 参考

http://stackoverflow.com/questions/12088138/trying-to-launch-an-external-editor-from-within-a-go-program
number_fieldの値をそのまま計算しようとしたら怒られた

金額を入力するfieldを作成

```***.haml
= form_tag update_path  do
  = label_tag :price
  = number_field_tag :price

  .actions
    = submit_tag 'Save'
    = link_to 'Back', :back

```

入力された金額を100倍して保存

```Controller.rb
  def update
    if params[:price] != nil
      item.price = params[:price] * 100
      item.save
    end
  end
```

金額を入力してSaveをすると`String can't be coerced into BigDecimal`と怒られた。

改めてparamsの中を確認して見ると`"price"=>"100"`となっていた
number_fieldでもparamsで取得したさいには、文字型なんですね。。。

というわけで、コントローラーを修正

```Controller.rb
  def update
    if params[:price] != nil
      item.price = params[:price].to_i * 100
      item.save
    end
  end
```

以上
初めてのAnsible（2章：Playbook:始めてみよう）


[「初めてのAnsible」](https://www.oreilly.co.jp/books/9784873117652/)を読み進めながらのメモ

[初めてのAnsible（1章：イントロダクション）](http://qiita.com/c0tt0n-candy/items/512049586f5a1f1279f3)の続き

# playbook

* Ansible での **設定管理スクリプト**
* YAML の構文で記述される
* play のリスト = playbook には1つ以上の play が含まれる

## play

* ホストとタスクを結びつけるもの
* play には以下が含まれていなければならない

	* 設定するホストの集合
	* それらのホスト上で実行するタスクのリスト

### play のオプション

[Intro to Playbooks](http://docs.ansible.com/ansible/playbooks_intro.html)
下記はよく使うやつ

* name
	* play の内容を示すコメント
	* 実行時に `--start-at-task <task_name>` を利用する場合には設定しておく必要あり

* become
	* True に設定すれば sudo でタスクを実行してくれる

* vars
	* 変数を定義
	* playbook 内で定義した変数は `{{ var_name }}` という形式でタスク中や設定テンプレート内で使用可能
		* 余談：Ansible はテンプレートエンジンとして Jinja2 を採用

### ハンドラ

* playbook内で定義できる条件付き処理の一つ
* タスクから通知された場合にのみ実行
	1. モジュールはアクションの実行前にホストの状態をチェックし、変更の必要の有無を調べる
	2. ホストの状態がモジュールの引数にマッチしていれば **ok** を、差異があった場合には変更を加え **changed** を返す
	3. **changed** の場合に、 `notify` が定義されていればハンドラへ通知する
	4. この時 `notify` ではハンドラの名前( `name` )を引数として渡して通知する
* ハンドラの実行はすべてのタスクが実行された後に **一度だけ**
* ハンドラの実行は通知順ではなく、 **play中で書かれた順序**


# コードでみる

上記でまとめたことを以下のコードで確認してみる

「初めてのAnsible」の [GitHubページ](https://github.com/lorin/ansiblebook) より[^1]

```:ch02/playbooks/web-tls.yml
---
- name: Configure webserver with nginx and tls
  hosts: webservers
  become: True
  vars:
    key_file: /etc/nginx/ssl/nginx.key
    cert_file: /etc/nginx/ssl/nginx.crt
    conf_file: /etc/nginx/sites-available/default
    server_name: localhost

  tasks:
    - name: Install nginx
      apt: name=nginx update_cache=yes cache_valid_time=3600

    - name: create directories for TLS certificates
      file: path=/etc/nginx/ssl state=directory

    - name: copy TLS key
      copy: src=files/nginx.key dest={{ key_file }} owner=root mode=0600
      notify: restart nginx

    - name: copy TLS certificate
      copy: src=files/nginx.crt dest={{ cert_file }}
      notify: restart nginx

    - name: copy nginx config file
      template: src=templates/nginx.conf.j2 dest={{ conf_file }}
      notify: restart nginx

    - name: enable configuration
      file: dest=/etc/nginx/sites-enabled/default src={{ conf_file }} state=link
      notify: restart nginx

    - name: copy index.html
      template: src=templates/index.html.j2 dest=/usr/share/nginx/html/index.html mode=0644

  handlers:
    - name: restart nginx
      service: name=nginx state=restarted
```

## playbook

* YAML で書かれている
	* 一目瞭然
* 今回の場合 play はひとつだけ含まれている
	* *Configure webserver with nginx and tls* という `name` の play

### play

* play はホストとタスクを結びつけている
	* `hosts` でどのホストに対してかを明示
	* `tasks` でそのホストに対してどういったタスクを実行するかを指定

#### play のオプション

* `name` で play や task の内容を示している
* `become: True` で sudo で実行するようにしている
	* 今回の場合 Ubuntu サーバーで実行しているため
* `vars` で変数を定義し、task 内で `{{ key_file }}` のように利用している

#### ハンドラ
 
* `handlers` でハンドラを定義
	* `name` は *restart nginx* 
* **changed** の場合に通知をしたい task で `notify: restart nginx` を指定
	* ハンドラの `name` を引数に渡している

[^1]: 引用したコードのうち以下を修正して掲載
 
 `sudo: True` -> `become: True`
 
 バージョン1.9以降は `sudo` は非推奨になり、`become` に取って代わられた
 [Become (Privilege Escalation)](http://docs.ansible.com/ansible/become.html)
初期化CSSライブラリ3選

# なぜ初期化する？<a id="orgheadline1"></a>

主な目的

-   ブラウザのバグ対応を吸収する
-   CSSのコード量減らす
-   自分の意図通りにCSSを書く

各ブラウザがCSSを自前で用意していることに起因。
ただ、ブラウザ標準のCSSはセマンティック(意味を付与する)なHTMLを読み込んだ時に、CSSを何も書かなくても読みやすくしてくれるので重要な役割。そのブラウザ標準CSSとうまく向き合っていこうというのが初期化CSS。

# 代表的な初期化CSSライブラリ<a id="orgheadline2"></a>

あくまでCSSを初期化するだけなので、BoostrapやFoundationなどのフレームワークのように数はない。 ここ抑えといたほうがいいよというものだけ抜粋。

| Name                                                                | License              | Purpose                                    | Comment                                                       | Github Star | Born      | Last Update |
|------------------------------------------------------------------- |-------------------- |------------------------------------------ |------------------------------------------------------------- |----------- |--------- |----------- |
| [resetcss by Eric Meyer](http://meyerweb.com/eric/tools/css/reset/) | none (Public domain) | 各ブラウザのスタイルの差異をなくす。       | 一昔前の王道。古いので今は使わないが、知識として必須。この人のCSSを起にいろんな人がResetCSSを書いている。 | -           | 2008.2.12 | 2011.1.26   |
| [normalize.css](https://github.com/necolas/normalize.css)           | MIT                  | 便利なものはリセットしない。それ以外はresetcssと同じ。 | 最近の主流。Bootstrap等、有名なUIFrameworkの中でも数多く使われている。 | 23599       | 2012.8.15 | 2016.10.3   |
| [sanitize.css](https://github.com/jonathantneal/sanitize.css)       | CC0 1.0              | ブラウザ対応保証。より開発者向けに特化。それ以外はnormalize.cssと同じ。 | Normalize.cssと同じ開発チームの人がつくった。モダンなCSSの書き方に対応していて、これから流行ると思われる。 | 2049        | 2015.3.18 | 2016.10.5   |

# 紹介ライブラリの解説参照サイト<a id="orgheadline3"></a>

-   [reset cssについて詳しく](http://tonost.com/2015/03/10/%E3%80%90css%E3%80%91%E6%B1%BA%E5%AE%9A%E7%89%88%EF%BC%81%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88css%E7%B7%8F%E3%81%BE%E3%81%A8%E3%82%81/)
-   [normalize.cssについて詳しく](http://coliss.com/articles/build-websites/operation/css/detailed-normalize-css-v4.html)
-   [sanitize.cssについて詳しく](http://coliss.com/articles/build-websites/operation/css/about-sanitize-css.html)
-   [他にもこんなのあるよの良記事](http://sixrevisions.com/css/css-reset-stylesheets/)

# @Mwrote の紹介<a id="orgheadline4"></a>

1. プロダクトデザイン(たまび)
2. GUIデザイン(前の会社) 
3. フロントエンドエンジニア <- いまここ

# 関連記事<a id="orgheadline5"></a>

-   [よさげなJSアニメーション&描画ライブラリまとめ](http://qiita.com/Mwrote/items/4dc2dd5ae8df21ea582b)
【PHP】スーパーグローバル変数　GETとPOST編

## はじめに
数回にわけてPHPスーパーグローバル変数の記事を書いていきます。
今回は`$_GET`と`$_POST`の勉強です。

## GETメソッド
データの取得を目的としたリクエストで使用します。
ブラウザのアドレス欄にURLを入力してアクセスする場合は、GETメソッドが使われています。
単なるアクセスではなく、何らかのデータを入力する際は、URLの末尾に付加して送信します。

#### 処理のイメージ
![php_get.png](https://qiita-image-store.s3.amazonaws.com/0/136533/a328c5c5-43a0-711f-f791-72f25d6d35b5.png "php_get.png")

### サンプルプログラム

form.php

```
<!DOCTYPE HTML>
<html>
  <body>
    <form method="get" action="show.php">
    名前を入力してください
    <input type="text" name="name" size="20" />
    <input type="submit" value="送信" />
  </form>
  </body>
</html>
```

![スクリーンショット 2016-11-12 12.43.04.png](https://qiita-image-store.s3.amazonaws.com/0/136533/8ea35b49-0288-3917-df36-5650a00370fd.png "スクリーンショット 2016-11-12 12.43.04.png")

show.php

```
<!DOCTYPE HTML>
<html>
  <body>
    こんにちわ<?php print $_GET['name']; ?>さん
  </form>
  </body>
</html>

```


![スクリーンショット 2016-11-12 12.43.11.png](https://qiita-image-store.s3.amazonaws.com/0/136533/8085d0c9-e8b6-1bef-9aba-f7cd37c52338.png "スクリーンショット 2016-11-12 12.43.11.png")


## POSTメソッド
Webサーバーに送信するデータ量が多い場合にはPOSTメソッドを使用します。
POSTでは、リクエストの本体にあたるメッセージボディと呼ばれる部分にデータを格納して送信します。

### サンプルプログラム


form.php

```
<!DOCTYPE HTML>
<html>
  <body>
    <form method="post" action="show.php">
    名前を入力してください
    <input type="text" name="name" size="20" />
    <input type="submit" value="送信" />
  </form>
  </body>
</html>
```

![スクリーンショット 2016-11-12 12.43.04.png](https://qiita-image-store.s3.amazonaws.com/0/136533/8ea35b49-0288-3917-df36-5650a00370fd.png "スクリーンショット 2016-11-12 12.43.04.png")

show.php

```
<!DOCTYPE HTML>
<html>
  <body>
    こんにちわ<?php print $_POST['name']; ?>さん
  </form>
  </body>
</html>

```


![スクリーンショット 2016-11-12 12.43.11.png](https://qiita-image-store.s3.amazonaws.com/0/136533/8085d0c9-e8b6-1bef-9aba-f7cd37c52338.png "スクリーンショット 2016-11-12 12.43.11.png")


## 最後に
サンプルを実行するとURLが異なっていると思います。
GETで送信した時のURLは末尾に`?name=テスト　太郎`
POSTで送信した時は`***/show.php`
となっていると思います。
次回は、`$_SERVER` と `$_COOKIE` の記事を書きます。
OSXでOS非依存の矢印（↑↓←→）を超簡単に出す方法

日本語入力モードで、次のように、順にキーを押します。

↑（上）<kbd>Z</kbd>+<kbd>K</kbd>
↓（下）<kbd>Z</kbd>+<kbd>J</kbd>
←（左）<kbd>Z</kbd>+<kbd>H</kbd>
→（右）<kbd>Z</kbd>+<kbd>L</kbd>
Slim 3 Framework で、DebugBar 使ってみたかったんだよね。その５

# まだやってます
slim 楽すわ。久々にコーディングしていて楽しい楽しい。
前々から DebugBar 使ってみたかったので今回、slimに入れて色々やってみました。

## Slim-DebugBar
slimにどうやって組み入れるのか？と思って試行錯誤してたのですが「[yookihiroo](http://qiita.com/yookihiroo/items/8222f4c44c7b0e4fe686#php-codesniffer%E3%81%AE%E5%B0%8E%E5%85%A5)さん」記事を見て同じように設定。

```bash:
$ composer require kitchenu/slim-debugbar
```

```php:src/settings.php
'debugbar' => [
  'storage' => [
    'enabled' => true,
    'path' => __DIR__. '/../logs/debug/',
  ],
],
```

logs/debug ディレクトリにdebug情報が吐き出されるので定期的に圧縮するとか対処する必要がある。

```php:src/middleware.php
// debugbar setting
$settings = $container->get('settings')['debugbar'];
$provider = new Kitchenu\Debugbar\ServiceProvider($settings);
$provider->register($app);
```

[laravel-debugbar](http://www.diycode.cc/projects/barryvdh/laravel-debugbar) のサンプルを見ながらちょっとコーディングしてみる。

```php:
$this->debugbar->info($this->debugbar);
$this->debugbar->warning('Error!');
$this->debugbar->error('Error!');
$this->debugbar->addMessage('Another message', 'mylabel');
```

![image](https://qiita-image-store.s3.amazonaws.com/0/44540/f88aed2d-7f4f-6e5f-2978-845aa14c2b28.png)

```php:
$this->debugbar->startMeasure('render', 'Time for rendering');
$this->debugbar->stopMeasure('render');
```
![image](https://qiita-image-store.s3.amazonaws.com/0/44540/2729f03c-3ce3-e6c0-9c13-2de351d26a18.png)

いい感じですね。これdebugが楽しくなりますね。

[yookihirooさん](http://qiita.com/yookihiroo)の記事で、whoops!も紹介されていたので同じように設定してみました。

![image](https://qiita-image-store.s3.amazonaws.com/0/44540/fec1f079-6fde-d5e9-7b33-1fd43bb33bf2.png)

syntaxエラー位だったら Visual Studio Codeでもと思いつつ、こういうツールも入れておくと便利だよね。

# 参考にさせて頂いたサイト
[Slim(PHP Framework)事始め(2)](http://qiita.com/yookihiroo/items/8222f4c44c7b0e4fe686#php-codesniffer%E3%81%AE%E5%B0%8E%E5%85%A5)
ASP.NET Coreアプリで起動時にControllerの型情報一覧を取得する

# やること

ASP.NET Core Web Applicationで、起動時にコントローラーの一覧を取得します。

# 環境

* Visual Strudio 2015
* .NET Core Tooling Preview 2 for Visual Studio 2015

# 手順

IApplicationBuilderから以下のような感じで一覧のTypeInfoを取得できます。

```c#
public static void EnumControllers(IApplicationBuilder app)
{
    var manager = app.ApplicationServices.GetRequiredService<ApplicationPartManager>();

    var feature = new ControllerFeature();
    manager.PopulateFeature(feature);

    foreach (var typeInfo in feature.Controllers)
    {
        System.Diagnostics.Debug.WriteLine(typeInfo.AsType());
    }
}
```

HomeController、ValuesControllerの2つのコントローラーがあったとして、出力結果としては以下のような感じになります。

```
WebApplication1.Controllers.HomeController
WebApplication1.Controllers.ValuesController
```

# うさコメ

起動時に、コントローラーのメタデータからなにかを構築したり、DIコンテナに明示的に情報を登録したり、みたいなことをしたい時用に(・ω・)
S3からGoogle Cloud Storageにファイルを移動する

以下のようなやり方で簡単にできるっぽい情報があるけどできない。
rcloneも設定がなんだかうまく行かず。

```
$ gsutil rsync -r s3:example.com gs:example.com
```

gsutilが内部的に使っているbotoがboto3になってるんだが
The AWS SDK for Pythonだそうで、問題も快適になされなさそう。

S3とCloud Storageが簡単にうまく橋渡ししてくれるものは、なかなか無さそう。
なので、次のようにしてみました。

S3からローカルのマシンにファイルをDLする
http://qiita.com/FSMS/items/481fa5107b2901a07ec6

ローカルのマシンからファイルをCloud StorageにUPLOADする
http://blog.vier.jp/2013/05/google-cloud-storagegoogle-io-2013.html
Ubuntu 16.10 で LXD の初期設定

(試行錯誤中で合ってるか知りません)

Ubuntu 16.10 (Yakkety Yak) のサーバ版を入れると以前のように LXD がインストールされた状態でインストールされる。

が、16.04 のときのように適当に色々な設定がなされた状態では起動してこない。

以前は自動で設定されていた lxd 用のブリッジもない。/etc/default/lxd-bridge みたいなファイルもない。LXD 2.3でネットワーク周りが一新された影響だと思います。

```
ubuntu@yakkety:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:7a:f5:fb brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.35/24 brd 192.168.1.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 2001:a432:6379:0:a00:27ff:fe7a:f5fb/64 scope global mngtmpaddr dynamic 
       valid_lft 14267sec preferred_lft 12467sec
    inet6 fe80::a00:27ff:fe7a:f5fb/64 scope link 
       valid_lft forever preferred_lft forever
```


まず設定。`lxd init` コマンドを使えばよいようだ。ここではリモートから LXD にアクセスできるようにしているけど不要なら no で。

```
$ sudo lxd init
Name of the storage backend to use (dir or zfs) [default=dir]: 
Would you like LXD to be available over the network (yes/no) [default=no]? yes
Address to bind LXD to (not including port) [default=all]: 
Port to bind LXD to [default=8443]: 
Trust password for new clients: 
Again: 
Would you like stale cached images to be updated automatically (yes/no) [default=yes]? 
Would you like to create a new network bridge (yes/no) [default=yes]? 
What should the new bridge be called [default=lxdbr0]? 
What IPv4 subnet should be used (CIDR notation, “auto” or “none”) [default=auto]? 
What IPv6 subnet should be used (CIDR notation, “auto” or “none”) [default=auto]? 
LXD has been successfully configured.
ubuntu@yakkety:~$ 
```

以前のように lxdbr0 が出現。

```
3: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 7a:97:62:a7:a0:3a brd ff:ff:ff:ff:ff:ff
    inet 10.192.193.1/24 scope global lxdbr0
       valid_lft forever preferred_lft forever
    inet6 fd42:66ce:d288:2c58::1/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::7897:62ff:fea7:a03a/64 scope link 
       valid_lft forever preferred_lft forever
```
[Raspberry Pi 3] mac の bluetooth によるインターネット共有を使ってルータがなくても SSH する

有線でつなぐ例は比較的見つかるんですが Thunderbolt の Ethernet アダプタを持ってないわけです。

そのくらい買いなよという意見はごもっともなのですが、正直ラズパイつなぐ以外に使いみちが浮かばないのでなんかもったいないなーというのと、 Bluetooth あるんだからそっちでできるはずと思い、やってみました。

## はじめに

記事の内容は、下記のすばらしい記事を「私の環境ではこうしたら動きました」でまとめたものになります。

- [MacとRaspberry piをインターネット共有でつないでみる](http://qiita.com/fumishitan/items/88bb832cb08fe8016f66)
- [Raspberry PiからBluetoothを使ってiPhoneでテザリング](http://count0.org/2014/02/06/tethering-raspi-bluetooth-iphone.html)
- [Raspberry Pi 3 Model Bの Bluetoothで ブルテザで通信する方法（Bluetooth編）](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_bluetooth_tethering_pan_panu/)

私の環境は下記です。

- macbook pro 2013 (sierra)
- Raspbian Jessie LITE 2016-09-23

## 必要なもの

Raspbian Jessie LITE 2016-09-23 を入れていると bluetoothctl とかははじめから入っています。追加で必要だったのは python-dbus くらいです（途中で出て来る bt-pan の実行に使います）。

```
sudo apt-get install python-dbus
```

## 手順

ラズパイ側で、 bluetoothctl を使って設定します。

```
$ bluetoothctl

[bluetooth]# scan on
[NEW] Device B8:E8:56:xx:xx:xx macoshita の MacBook Pro
[bluetooth]# pair B8:E8:56:xx:xx:xx
[bluetooth]# connect B8:E8:56:xx:xx:xx
```

さらに [bt-pan](https://github.com/mk-fg/fgtk#bt-pan) というスクリプトを使って PAN 接続を行います。 bt-pan は後で `/etc/rc.local` でも実行するので、適当にパスの通ったところに移動しておきます。

```
$ wget https://raw.githubusercontent.com/mk-fg/fgtk/master/bt-pan
$ chmod +x bt-pan
$ sudo chown root: bt-pan
$ sudo mv bt-pan /usr/bin/
$ sudo bt-pan client B8:E8:56:xx:xx:xx
```

最後のコマンドを叩くと mac 側にペアリングの許可をもとめるウィンドウが出るので許可してください。許可したら、下記のようにテザリングを通して IP アドレスが取得できているはずです。

```
$ ifconfig bnep0
bnep0     Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.x.x  Bcast:192.168.2.255  Mask:255.255.255.0
```

最後に、ラズパイ起動時にテザリングを開始できるように、 `/etc/rc.local` を書き換えます。

```
# この行を追加
bt-pan client B8:E8:56:xx:xx:xx

# ↓このあたりは最初から書いてあると思います。
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

exit 0
```

リブートしてみて、 `ssh pi@raspberrypi.local` で ssh が出来れば成功です（パスワードはデフォルトで raspberry）。
Swift 3 以降での遅延実行（Swift 2で言うdispatch_after）



Swift 3 からはこう書けるようになった。
**追記：Swift 4.x、Swift 5.x でも次の書式で動くよ！**

```swift
// to run something in 0.1 seconds

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    // your code here
}
```

詳細は http://stackoverflow.com/questions/37801436/how-do-i-write-dispatch-after-gcd-in-swift-3 を参照。

ちなみに、Swift 2 まではこんな感じだった。

```swift
var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) 
dispatch_after(dispatchTime, dispatch_get_main_queue(), { 
    // your function here 
})
```
ideone APIをrubyで叩いてみる

##ideoneとは
ideone(アイディーイーワン)
http://ideone.com/

ブラウザ上で多種のプログラムを実行してくれるサイト
エラー表示は親切ではない


##やったこと

###ideoneとSphere engineの会員登録
ideone 
http://ideone.com/

Sphere engine
http://sphere-engine.com/

###ideone-ruby-api　gemのインストール
https://rubygems.org/gems/ideone-ruby-api/versions/2.1.2
にあるideone-ruby-api　gemをインストール

```
$ rbenv rehash
$ gem install ideone-ruby-api
$ bundle install
```

###コーディング
ソースコードとその出力結果を出力するプログラムを作成した

```:ruby
require 'ideone'

i = Ideone.new('username', 'password')

source_code = <<EOD
a = 10
b = 100
p a*b
EOD

token = i.create_submission(source_code,17) #17はrubyの意味
p i.submission_details(token)["source"]
p i.submission_details(token)["output"]

```
上記の出力結果

```
"a = 10\nb = 100\np a*b\n"
"1000\n"
```

##その他
ideone api リファレンス
http://ideone.com/files/ideone-api.pdf

ideone-ruby-api github
https://github.com/kennym/ideone-ruby-api
ディレクトリを作成と同時に作成したディレクトリに移動する

```bash:普通に書くと
$　mkdir test_dir
$　cd test_dir
$　pwd
[パス]/test_dir
```
```bash:よく使われる手法
$　mkdir test_dir && cd $_ && pwd
[パス]/test_dir
```
`$_`：一つ前のコマンドの引数を持っている
`pwd`は省略可

参考
http://blog.tstylestudio.com/2013/06/26/mkdir%E3%81%A8cd%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%84%E6%99%82/
初めてのAnsible（1章：イントロダクション）


[「初めてのAnsible」](https://www.oreilly.co.jp/books/9784873117652/) を読み進めながらのメモ

# 環境

* macOS Sierra version10.12.1
* Ansible 2.2.0.0
* Vagrant 1.8.7
* VirtualBox 5.1.8


# Ansible インストール

Homebrew が入っていれば下記コマンドで

```
$ brew update
$ brew install ansible
```

# テストサーバーとして Vagrant を準備

Vagrant については下記などを参考に

* [仮想環境構築ツール「Vagrant」で開発環境を仮想マシン上に自動作成する](http://knowledge.sakura.ad.jp/tech/1552/)
* [開発環境の構築・共有を簡単にするVagrant入門](https://thinkit.co.jp/story/2015/03/19/5740)

Vagrant 1.8.7 では `vagrant up` 時にエラーが発生したため下記で対応

* [Vagrant 1.8.7でvagrant upできないときの応急対応](http://qiita.com/kotatsu360/items/554da271d6935622254b)

下記コマンドで Ubuntu 14.04.5 の 64bit 仮想マシンイメージのための Vagrantfile を作成し起動

```
$ vagrant init ubuntu/trusty64
$ vagrant up
```

# テストサーバーを Ansible に明示

仮想マシンを立ち上げたディレクトリに `hosts` と `ansible.cfg` を作成

```:hosts
testserver ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222
```

サーバーに testserver というエイリアスを付与し、Vagrant 利用時の host と port を設定

```:ansible.cfg
[default]
hostfile = hosts
remote_user = vagrant
private_key_file = .vagrant/machines/default/virtualbox/private_key
host_key_checking = False
```

hostfile : インベントリファイルの場所
remote_user : SSHのユーザー
private_key_file : SSHの秘密鍵
host_key_file : Vagrant 利用時、マシンの生成毎に ~/.ssh/known_hosts ファイルをいじらなくて済むようにするため設定

# ansible コマンド

Ansible を利用しサーバーに接続できることを確認するなど、アドホックな処理に利用

## オプション

* -m : モジュールを指定
* -s : sudo で実行
* -a : クォートで囲んでコマンドを直接指定

など。
[Introduction To Ad-Hoc Commands](http://docs.ansible.com/ansible/intro_adhoc.html) に書いてある
CSSでエレメントの高さを画面の高さに合わせました。

表示するエレメントを画面の高さに合わせたいと思いました。

# height: 100vhを使う
heightに100vhを指定すると画面高さになりました。

```css
 .item {
    min-height: 100vh;
 }
```
min-heightにしているのは、itemクラスの中身が増えたときに高さが広がってほしいからです。

# 高さを指定すると中央揃えしたくなる
高さを指定すると内容量のバランスをとるために垂直方向の中央揃えをしたくなります。
`align-items: center;`を指定して上下垂直方向を中央揃えにしました。

```css
 .item {
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
 }
```
最終的に上記のようになりました。縦方向の画面いっぱいに広がる垂直方向に中央揃えされたテキストが表示されるようになります(☝ ՞ਊ ՞)
2016年11月時点のBIND構築のヒント

#2016年11月時点のBIND構築のヒント
CentOS7でDNSサーバ構築
書き途中ですがいったん投稿します。
##基本情報
###バージョン
・BINDは9.9, 9.10, 9.11の3つがon service
・9.9は2017/12にサービス終了予定
###パッケージ
・bind：バインド本体
・bind-chroot：バインドのジェイル環境
・bind-util：いろいろ便利ツール(こう書くと不要に見えるけど、運用上ほぼ必須)
その他ライブラリがあるよ
###使い道での分類(view)
・external：公開して自分の提供サービスへのアクセスがTCP/IPでできるようにする
・internal：ローカルサービスへのアクセスの名前管理を楽にする
            (externalをローカルアクセスに限る使い方)
・cache：再帰問合せを一括して実行する
###名前に対する責任での分類
・authorized：ドメインは私の権限で管理してますよ、という人
・non-authorized：他人のドメイン名を調べて回答してますよ、という人
###名前空間(と呼んでいいのかな？)の管理による分類
####管理する人と貰う人
・master：ゾーンファイルを転送する人
・slave：ゾーンファイルを転送してもらう人。
cacheは「名前解決の結果をファイルに書き込んで一時保持しておく」
slaveは「ゾーン転送でファイルをもらう」
ので全然違う。
~~authorizedは~~
~~masterは~~
###メモ
・/etc/logrotate.d/namedでの記述で、named.runがどうローテーションされているか？
・キャッシュは再帰問合せの最上位、ルートの定義が必要です。
zone "." {
type hint;
file "named.ca";
allow-update { none; };
}; 
・cache、internal-authorized、externalを一緒にする場合はviewを分けましょう。
LinuxでJavaをダウンロードして動かしてみる

LinuxなどでJavaをインストールして動くまでの手順です。

### 確認環境
- Amazon Linux AMI 2016.09.0.20160923 x86_64 PV 

### 1.curlでダウンロード

curlコマンドでアーカイブをダウンロードします。
下記はlinux用のバージョン8u112のダウンロードになります。

> curl -LO -b "oraclelicense=accept-securebackup-cookie" "curl -LO -b "oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u112-b15/jdk-8u112-linux-x64.tar.gz""

ダウンロード用のURLは下記の方法で取得することができます。

1. 下記から必要なバージョンのJDKのダウンロードページに移動する。
JREではなくJDKを選択しましょう。
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2. 必要なバージョンで「Accept License Agreement」を選択。これをしないとリンクのURLが「void(0)」になってしまいます。
3. Download欄のリンクのURLをコピー

### 2.展開する。
ファイルを展開します。
> tar -xvf ./jdk-8u112-linux-x64.tar.gz

### ３. 実行してみる

直接javaコマンドを叩くとjavaを実行することができます。

>[ec2-user@ip-172-31-4-206 ~]$ls
>jdk-8u112-linux-x64.tar.gz  jdk1.8.0_112

>[ec2-user@ip-172-31-4-206 ~]$ jdk1.8.0_112/bin/java -version
>java version "1.8.0_112"
>Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
>Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)

### 4. javaと打つだけで実行できるようにする
パス指定をすることでjavaと入力するだけで実行ができるようになります。
>  export PATH=(path to jdk bin folder):$PATH

具体例
> [ec2-user@ip-172-31-4-206 ~]$ export PATH=/home/ec2-user/jdk1.8.0_112/bin:$PATH
> [ec2-user@ip-172-31-4-206 ~]$ java -version
> java version "1.8.0_112"
> Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
> Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)

※指定しなくてもjavaと打てば実行できる場合、すでにパス指定下にjdkが配置されています。
「which java」で見ると確認できるでしょう。
今回の手順では既存のjdkではなくインストールしたjdkを優先して見つけるようになります。

### 5. 毎回パス指定をしなくてもいいようにする。
ホームディレクトリの.bash_profileに上記のパス指定を書いておくと毎回パス指定をしなくてもコマンドが実行できるようになります。
bash_profileについては別途調べてみてください。
[Xcode]error typeと出て補完が効かなくなった場合の対応方法


みなさんは、補完機能があるIDEと補完機能がないIDE、どちらが好きですか？僕は補完機能があるIDEの方が好きです。でも悲しいことに最近、特定のプロジェクトでXcodeの補完機能が失われるという事象に遭遇してしまいました。

## 起きていた現象

![スクリーンショット 2016-11-12 8.44.53.png](https://qiita-image-store.s3.amazonaws.com/0/37365/b617bcd8-bf43-ffa3-d202-b92711d6433e.png "スクリーンショット 2016-11-12 8.44.53.png")

具体的には上記のように、変数の型に`<<error type>>`と表示されてしまい、この`<<error type>>`と表示された変数については補完やコードジャンプといったIDEの機能が使えなくなる、という現象です。

![スクリーンショット 2016-11-12 8.49.16.png](https://qiita-image-store.s3.amazonaws.com/0/37365/4597f2c8-7865-da39-3223-8af8070f1212.png "スクリーンショット 2016-11-12 8.49.16.png")


このように、 `tableView.` と打っても、補完してくれないどころか警告を出してくる。いや、警告を出したいのは俺だ。`member name`の候補をお前が早く提示しろ、という気持ちになりますね。型の情報が失われているので、テキストの色も黒ばかりです。

なおこの問題はXcode7.3の頃から発生していて、Xcode8でも同様に発生することを確認しています。

## 改善のために試したこと
下記のようなことは試してみましたが、効果がありませんでした。

* Cleanする
* Xcodeを再起動する
* Derived Dataを削除する
* 祈りながらSwift3.0対応してみる

正確にはDerived Dataの削除については、一瞬だけ効果があるように見えましたが数分作業すると結局 `<<error type>>` が出現します。

## 解決法
直接的な助けになったのは、Appleのフォーラムの下記の書き込みです。

https://forums.developer.apple.com/thread/46223

要約すると

* CococaPodsがビルドディレクトリにヘッダファイルをコピーするのが原因であるようだ
* これにより、SourceKitが正しくコードを解釈できなくなってしまう
* 解決するためには、ビルド後にビルドディレクトリの余計なヘッダファイルを削除すれば良い

具体的には、プロジェクト設定の ` Build Phases` に下記のような`Run Script` を追加する。

```sh:sh
function removeHeaders() {  
    find $BUILD_ROOT/Debug-iphonesimulator/  -name '*.h' -exec rm -f {} \;  
}  
removeHeaders  
```

ということが書かれています。最初は半信半疑だったのですが、実際にこのスクリプトを追加してビルドしてみると... 

![スクリーンショット 2016-11-12 9.22.51.png](https://qiita-image-store.s3.amazonaws.com/0/37365/723bb739-4934-6276-9156-a66fdb202502.png "スクリーンショット 2016-11-12 9.22.51.png")

なんと！ `<<error type>>` が消滅して型がある世界にもどって来ました！IDEではコードに色がつくということも忘れかけていましたが、しっかりと色が付いてます。

なお、上記のスクリプトではシミュレータだけしか対応できないので、 実機の場合にはスクリプトの `Debug-iphonesimulator` と記述されている部分を `Debug-iphoneos` と変更する必要があります。

自分の場合は、下記のようなスクリプトをビルド時に実行してディレクトリが存在すれば両方消すようにしておきました。

```ruby:remove_header_files.rb
#!/usr/bin/env ruby
def remove_header_files(dir)
  return unless File.exists?(dir)
  cmd = "find #{dir}"
  opt = '-name "*.h" -exec rm -f {} \;'
  system("#{cmd} #{opt}")
end

build_dir = ENV['BUILD_ROOT']
exit if build_dir.nil?

simulator_dir = build_dir + "/Debug-iphonesimulator/"
device_dir    = build_dir + "/Debug-iphoneos/"

remove_header_files(simulator_dir)
remove_header_files(device_dir)
```

自動補完もコードジャンプも動作せず、IDEの定義とは...と考えはじめていたのですが、無事直ってよかったです。いやぁ、IDEって最高ですね。
Docker入門2: Dockerをインストール

## 前置き
Dockerについてまだあまり知らないですが、せっかくなので他の人と共有できるようにアウトプットしてみます。
ツッコミ大歓迎です、どんどんおねがいします。

## インストール
手順はdockerの公式サイトにて解説されています:

- [Docker: Install Docker Engine](https://docs.docker.com/engine/installation/)
- [Docker-docs-ja: インストール](http://docs.docker.jp/engine/installation/toc.html)

検索すれば、他にもいろいろな方の記事がありますので、必要に応じて参照してみてください。

ちなみにMacOSの方はHomeBrewでもいれられるようです。

インストールの確認はいつもどおり:

```bash
$ docker --version
Docker version 1.12.0, build 8eab29e
```

`Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?` と表示される場合はユーザを `docker` グループに追加し忘れている可能性が高いです。
`docker` グループに追加して一度ログアウトしてください。それでもダメな場合は環境変数 `DOCKER_HOST` をあれこれしてください。

## 次回
次回はDockerを使う際の流れを説明します。
[Docker入門3: Docker コンテナを建てる流れ](http://qiita.com/y_k/items/c68417e44c3285887f31)
matplotlib > csvファイルを読み込んで折れ線グラフにする / 散布図にする

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

csvファイルを読み込んでmatplotlibで折れ線グラフにしてみた。

### csvファイル生成

```prep_data.py
import numpy as np
import random

numdata=100
x_data = np.random.rand(numdata)
y_data = np.sin(2*np.pi*x_data) + 0.3 * np.random.rand()

for xs, ys in zip(x_data, y_data):
	print '%.5f, %.5f' % (xs, ys)
```

### csvファイル

`$python prep_data.py > input.csv`

```input.csv
0.74597, -0.91122
0.33339, 0.95432
0.03281, 0.29314
0.49378, 0.12754
0.59515, -0.47443
0.19094, 1.02040
0.04446, 0.36420
0.02983, 0.27479
...
```

### matplotlib描画 on Jupyter

参考 http://qiita.com/supersaiakujin/items/2719f4a1a2a1bce72a18

```py
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt

data = np.loadtxt('input.csv', delimiter=',')
input1 = data[:,0]
output = data[:,1]

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

x = np.linspace(-6,6,1000)

ax.plot(input1, output, color='black', linestyle='solid')

ax.set_title('First line plot')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.grid(True)
fig.show()
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c6e66d0c-8ec7-71ea-683f-ed1ba09ceae4.png)

sine curveらしきものは見えた。

### 散布図

参考 http://qiita.com/supersaiakujin/items/ef85dd247cefdfbd2e2a

```
ax.plot(input1, output, color='black', linestyle='solid')
```

を以下にするだけ。

```
ax.scatter(input1, output)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/14f71a7a-49a3-1f19-425c-3885e240c8bf.png)
numpy > csvファイルを読み込んで、 1列目と２列目の値をinput1,outputとして取得 > input1 = data[:,0] / output = data[:,1]

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
```

以下のようなファイルがある。

```input.csv
0.74597, -0.91122
0.33339, 0.95432
0.03281, 0.29314
0.49378, 0.12754
0.59515, -0.47443
0.19094, 1.02040
0.04446, 0.36420
0.02983, 0.27479
0.72129, -0.89531
0.97207, -0.08616
0.54730, -0.20436
0.47366, 0.25323
0.58349, -0.41239
0.42188, 0.55983
...
```

上記のファイルを読むには以下のようにするようだ。
参考 http://www.mwsoft.jp/programming/numpy/csv.html
参考 http://stackoverflow.com/questions/11739796/turn-2d-numpy-array-into-1d-array-for-plotting-a-histogram

```py
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

data = np.loadtxt('input.csv', delimiter=',')
input1 = data[:,0]
output = data[:,1]
```

```
>> input1
array([ 0.74597,  0.33339,  0.03281,  0.49378,  0.59515,  0.19094,
        0.04446,  0.02983,  0.72129,  0.97207,  0.5473 ,  0.47366,
        0.58349,  0.42188,  0.4674 ,  0.78199,  0.36685,  0.3272 ,
        0.08699,  0.50938,  0.30515,  0.29046,  0.1528 ,  0.6754 ,
        0.493  ,  0.87203,  0.50209,  0.47111,  0.6476 ,  0.07248,
        0.68567,  0.45286,  0.31038,  0.65485,  0.22235,  0.99213,
        0.80919,  0.2719 ,  0.48896,  0.50926,  0.30707,  0.05993,
        0.10803,  0.13582,  0.34657,  0.69719,  0.34416,  0.017  ,
        0.69265,  0.49431,  0.17915,  0.85606,  0.84609,  0.14715,
        0.86554,  0.60495,  0.60713,  0.02405,  0.05717,  0.49937,
        0.24258,  0.68672,  0.11015,  0.50363,  0.88794,  0.11778,
        0.93471,  0.33972,  0.04038,  0.79928,  0.5235 ,  0.52673,
        0.31692,  0.78884,  0.25574,  0.69226,  0.57933,  0.96118,
        0.5842 ,  0.07607,  0.82006,  0.1139 ,  0.84374,  0.43982,
        0.63605,  0.58926,  0.15797,  0.38462,  0.69245,  0.14642,
        0.71501,  0.43495,  0.31003,  0.62805,  0.44885,  0.60561,
        0.07738,  0.62272,  0.31518,  0.5267 ])
In [22]:
```

```
>> output
array([-0.91122,  0.95432,  0.29314,  0.12754, -0.47443,  1.0204 ,
        0.3642 ,  0.27479, -0.89531, -0.08616, -0.20436,  0.25323,
       -0.41239,  0.55983,  0.29185, -0.89141,  0.83086,  0.97311,
        0.60824,  0.02958,  1.02903,  1.05633,  0.90771, -0.80368,
        0.13243, -0.63173,  0.07535,  0.26899, -0.71161,  0.52828,
       -0.83096,  0.38033,  1.01737, -0.73807,  1.07341,  0.03901,
       -0.84318,  1.07901,  0.15776,  0.0303 ,  1.02486,  0.45619,
        0.71632,  0.84196,  0.90996, -0.85699,  0.91849,  0.19506,
       -0.84732,  0.12419,  0.99101, -0.69759, -0.73475,  0.88684,
       -0.6594 , -0.52421, -0.53495,  0.23899,  0.44   ,  0.09242,
        1.08738, -0.83353,  0.72663,  0.06563, -0.55887,  0.76276,
       -0.31034,  0.93374,  0.33948, -0.86399, -0.05864, -0.07869,
        1.00135, -0.88191,  1.08781, -0.84645, -0.38959, -0.15306,
       -0.41627,  0.54842, -0.81622,  0.74458, -0.74305,  0.45762,
       -0.66599, -0.44341,  0.92587,  0.75158, -0.84686,  0.88407,
       -0.88747,  0.4859 ,  1.01817, -0.63208,  0.40437, -0.52746,
        0.55574, -0.60844,  1.00576, -0.07853])
```
Docker入門1: Dockerってなんぞや？

きっと、「Dockerという言葉は聞いたことがあっても…」という方も多いのではないでしょうか？

そんなDockerをどかどか紹介。

## 前置き
Dockerについてまだあまり知らないですが、せっかくなので他の人と共有できるようにアウトプットしてみます。
ツッコミ大歓迎です、どんどんおねがいします。

このページは前段階の話ですので、実際に触りたい方は[次の記事](#%E6%AC%A1%E5%9B%9E)へ。

## Dockerとは
Dockerはコンテナ型仮想化の一つです。
Dockerを使うことで一つのホストOSの上で仮想的に複数のOSを軽快、簡単に動作させることが可能になります。

## Dockerの利点・欠点など
様々な利点があるDockerですが、欠点や今一つな点もあります。
その辺はどのツールもあると思いますので、適切な選択が重要です。

では、実際にどのような利点や欠点があるのか、あげていきたいところですが、すでにたくさんの人がその手の記事を書いていますので、他の方に任せることにします。
検索すれば、様々な記事がヒットしますが、その中から一部を紹介します:

- [Qiita: pottava: プログラマのためのDocker超入門 04.Dockerのよさ（前編）](/pottava/items/50b90403b895742467dc)  
    こちらは前編・中編・後編と3部に分けて詳細に書かれています。
- [ThinkIT: 巷で話題のDockerとは？](https://thinkit.co.jp/story/2015/08/05/6284)  
    Docker向きなシステム・向かないシステム、課題についても書かれています。

## 次回
次回は実際にDockerをインストールしていきたいと思います。
[Docker入門2: Dockerをインストール](b2bb81b1c0b8152dc161)
TF-Slim > link > slim.stack() > slim.fully_connected()の簡略表記に使う

http://qiita.com/learn_tensorflow/items/3e46b2512a1bab73f5b2
のtrain.pyにて使われているSlimの学習中。

以下に注目した。

```train.py
## NN のグラフ生成
hiddens = slim.stack(inputs_batch, slim.fully_connected, [2, 2], activation_fn=tf.nn.sigmoid, scope="hidden")
prediction = slim.fully_connected(hiddens, 1, activation_fn=tf.nn.sigmoid, scope="output")
```

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/slim

> Furthermore, TF-Slim's slim.stack operator allows a caller to repeatedly apply the same operation with different arguments to create a stack or tower of layers. slim.stack also creates a new tf.variable_scope for each operation created. For example, a simple way to create a Multi-Layer Perceptron (MLP):

```py
# Verbose way:
x = slim.fully_connected(x, 32, scope='fc/fc_1')
x = slim.fully_connected(x, 64, scope='fc/fc_2')
x = slim.fully_connected(x, 128, scope='fc/fc_3')

# Equivalent, TF-Slim way using slim.stack:
slim.stack(x, slim.fully_connected, [32, 64, 128], scope='fc')
```

上の3行の書き方を1行で書くことができるとのことらしい。
Electronで絶対パスの基点をアプリケーションがあるディレクトリにする

Electronでアプリを作ると以下のような感じになります。

```js:main.js
const { app, BrowserWindow } = require('electron');
const path = require('path');
const url = require('url');

...

function createWindow() {
  win = new BrowserWindow({ width: 800, height: 600 });

  win.loadURL(url.format({
    pathname: path.join(__dirname, 'index.html'),
    protocol: 'file:',
    slashes: true,
  }));
  ...
}

app.on('ready', createWindow);

...
```


```html:index.html
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Hoge</title>
    <link rel="stylesheet" href="/style.css">
  </head>
  <body>
    <div id="root">
    </div>

    <script type="text/javascript" src="/app.js">
    </script>
  </body>
</html>
```

しかし、`index.html`の中で`/style.css`や`/app.js`を絶対パスで指定すると正しく読み込めません。絶対パスで書くとファイルシステムのルートを基点としてパスが探索されます(当たり前ですね)。相対パスで書けば、同じディレクトリを起点にして探してくれるので正しく動きますが、webサイトとコードを共通化していたりすると、`main.js`と同階層を`/`として扱い絶対パスで書きたかったりします。

そこで、`main.js`を以下のようにします。

```js:main.js
const { app, BrowserWindow, protocol } = require('electron');
const path = require('path');
const url = require('url');

...

app.on('ready', () => {
  protocol.interceptFileProtocol('file', (req, callback) => {
    const requestedUrl = req.url.substr(7);

    if (path.isAbsolute(requestedUrl)) {
      callback(path.normalize(path.join(__dirname, requestedUrl)));
    } else {
      callback(requestedUrl);
    }
  });
});

function createWindow() {
  win = new BrowserWindow({ width: 800, height: 600 });

  win.loadURL(url.format({
    pathname: '/index.html',
    protocol: 'file:',
    slashes: true,
  }));
  ...
}

app.on('ready', createWindow);

...
```

`electron.protocol.interceptFileProtocol()`で、URL解釈を特定のスキーマについて割り込めます。
ファイルを読み込む時は`file`というスキーマ(例:`file:///hoge/fuga`)なので、その処理に割り込んで絶対パスの場合は`__dirname`を足すようにします。
以上の処理を足したので、`win.loadURL()`に渡すURLは`__dirname`を足してフルパスにしておく必要はなく、現在のディレクトリを`/`として考えた絶対パスで書くように変えます。

参考: https://github.com/electron/electron/issues/4612
Go 言語で BrainFuck を実装してみた



# はじめに

* 難解プログラミング言語 [BrainFuck](https://ja.wikipedia.org/wiki/Brainfuck) についてちょっと怖かったのでずっと避けてきていたけどそろそろわかりたいと思ったので Go 言語で実装してみた

# ソースコード

```go:main.go
package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

const (
	INCR  byte = 62 // +
	DECR  byte = 60 // -
	NEXT  byte = 43 // >
	PREV  byte = 45 // <
	READ  byte = 44 // ,
	WRITE byte = 46 // .
	OPEN  byte = 91 // [
	CLOSE byte = 93 // ]
)

var MAX_BUFFER_SIZE = 3000

func main() {
	if len(os.Args) < 2 {
		fmt.Println("Usage: " + os.Args[0] + " FILE")
		return
	}
	src, err := ioutil.ReadFile(os.Args[1])
	if err != nil {
		panic(err)
	}
	b := make([]byte, MAX_BUFFER_SIZE, MAX_BUFFER_SIZE)
	i := 0
	si := 0
	buf := make([]byte, 1)
	for {
		switch src[si] {
		case INCR:
			i++
		case DECR:
			i--
		case NEXT:
			b[i]++
		case PREV:
			b[i]--
		case WRITE:
			buf[0] = b[i]
			os.Stdout.Write(buf)
		case READ:
			os.Stdin.Read(buf)
			b[i] = buf[0]
		case OPEN:
			if b[i] == 0 {
				n := 0
				for {
					si++
					if src[si] == OPEN {
						n++
					} else if src[si] == CLOSE {
						n--
						if n < 0 {
							break
						}
					}
				}
			}
		case CLOSE:
			if b[i] != 0 {
				n := 0
				for {
					si--
					if src[si] == CLOSE {
						n++
					} else if src[si] == OPEN {
						n--
						if n < 0 {
							break
						}
					}
				}
			}
		}
		si++
		if si >= len(src) {
			break
		}
	}
}
```

# 実行方法

* BrainFuck ファイルを渡して実行する

```
go build -o bf main.go
./bf hello.b
```

```brainfuck:hello.b
+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
------------.<++++++++.--------.+++.------.--------.>+.
```

```brainfuck:fizzbuzz.b
++++++[->++++> >+>+>-<<<<<]>[<++++> >+++>++++> >+++>+
++++>+++++> > > > > >++> >++<<<<<<<<<<<<<<-]<++++>+++
>-->+++>-> >--->++> > >+++++[->++>++<<]<<<<<<<<<<[->-
[> > > > > > >]>[<+++>.>.> > > >..> > >+<]<<<<<-[> > > >]>[<+
++++>.>.>..> > >+<]> > > >+<-[<<<]<[[-<<+> >]> > >+>+<<<<<
<[-> >+>+>-<<<<]<]>>[[-]<]>[> > >[>.<<.<<<]<[.<<<<]>]>.<<<<
<<<<<<<]
```

# おわりに

* BrainFuck は読み書きが難解なだけで言語仕様も実装もとても簡単だった
* 新しい言語を覚えたいときの手習いとかに実装してみるのもいいかも
* BrainFuck について読み書きはしたくないが大したことはやってないということがわかったので今後の人生で怖がったり気にしたりする必要がなくなったのはよかった
* あと Gist のコメントに BrainFuck のコードをそのまま貼るとボットだと思われて BAN されるという学びもあった
numpy > 乱数のリスト出力 > zip() / print %

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
```

TensorFlowで使う乱数データを格納したcsvファイルを作ろうとしていた。

参考 http://qiita.com/7of9/items/b56708f38fa14f944d76#comment-59b925b947211bb8abcf

```prep_data.py
import numpy as np
import random

numdata=10
x_data = np.random.rand(numdata)
y_data = np.sin(2*np.pi*x_data) + 0.3 * np.random.rand()

for xs, ys in zip(x_data, y_data):
	print '%.5f, %.5f' % (xs, ys)
```

```txt:結果
$ python prep_data.py 
0.55805, -0.09681
0.09217, 0.80718
0.03410, 0.47250
0.20549, 1.22104
0.98297, 0.15306
0.03321, 0.46702
0.83019, -0.61584
0.74709, -0.73994
0.92803, -0.17704
0.93578, -0.13275
```
技術英語 > If the data doesn't [fit the hypothesis], don't discard the data.

@ Code Complete (No. 17577 / 36077)

バグが出たときには仮説を立てる。その仮説どおりに振舞うかをチェックし、仮説どおりであればその対処を進める。

> If the data doesn't <font color=red>fit the hypothesis</font>, don't discard the data.

続けて

> ask why it doesn't fit, and create a new hypothesis.

<hr>
関連して思い出したのは

http://analog-engineer.cocolog-nifty.com/blog/2011/01/post-9bcc.html

> データーの写し間違いや異常があった時には、消しゴムで消さずに横線を引いて元のデータの脇に書き添える。間違いデータと思ったものが、真実でありかつ次の実験計画に影響を及ぼすことがある。