OmniAICreator/Qiita-1.07M huggingface dataset:
D3.jsでShift JISのCSVファイルを読み込む


いくつかやり方がありますが、要はmimeTypeを`text/csv; charset=shift_jis`にできればOK。

D3.jsでCSVを読み込むには一般的には以下のようなコードを書くと思います。

```javascript
d3.csv('data.csv', function (data) {
  // dataを処理する
});
```

これを以下のように修正することでShift JISのファイルを文字化けなく読み込むことができます。
2パターン紹介するので好きな方をどうぞ。

パターン1

```javascript
d3.csv('data.csv')
  .mimeType('text/csv; charset=shift_jis')
  .on('load', function (data) {
    // dataを処理する
  })
  .get();
```

パターン2

```javascript
var getCSV = d3.dsv(',', 'text/csv; charset=shift_jis');

getCSV('data.csv', function (data) {
  // dataを処理する
});
```
NiftyCloud（MBaaS）のiOSクイックスタート Swift 2  ver.

#はじめに
Parseが1年後に使えなくなるということでざわざわしてましたが・・MBaaSのNiftyCloud使ってみようと思いNiftyCloudの[イントロダクション](http://mb.cloud.nifty.com/doc/current/introduction/quickstart_ios.html)に手を出してみました。
iOSのクイックスタートはObj-Cなので、こちらの[NiftyCloud（MBaaS）のiOSクイックスタートをObjective-CからSwiftに書き換えてみた](http://qiita.com/VirgomanBros/items/294c456de28ccd311644)を参考に進めていました。Swiftのバージョンアップにより若干の変更点があったのでここに忘備録として。


#swift 2 ver
これをAppDelegate.swiftのdidFinishLaunchingWithOptionsに入れてあげます。

```swift:AppDelegate.swift
 
        NCMB.setApplicationKey("<YOUR_APPLICATION_KEY>", clientKey: "<YOUR_CLIENT_KEY>")
        
        let query: NCMBQuery = NCMBQuery(className: "TestClass")
        query.whereKey("message", equalTo: "test")
        query.findObjectsInBackgroundWithBlock({(object, error) in
            if (error == nil) {
                if (object.count > 0) {
                    let message = object[0].objectForKey("message") as! NSString!
                    print("[FIND]\(message)")
                } else {
                    var saveError: NSError?
                    let obj = NCMBObject(className: "TestClass")
                    obj.setObject("test", forKey: "message")
                    obj.save(&saveError)
                    if (saveError == nil){
                        print("[SAVE]done")
                    } else {
                        print("[SAVE ERROR]\(saveError)")
                    }
                }
            
            } else {
                print(error.localizedDescription)
            }
        })

```

これで多分動くと思います。
【めも】ファイルが存在するときのシンボリックリンク作成

#ln -s .bashrc ~/.bashrc
>$ ln -s .bashrc ~/.bashrc
ln: シンボリックリンク `~/.bashrc' の作成に失敗しました: ファイルが存在します

dotfilesをgithubで管理したいなと思い、
install.shを作成しようとしたところ、
ファイルが存在する時
（Ubuntuなどのインストール直後から.bashrc
がある時）
にどんな挙動になるのかと思い試してみたところ、
案の定エラーが出るんですね。

現状色んな環境で作業することがあるので、
条件分岐つけないとまずそうですね。
ちょっとずつ書いていこうと思います。
iTermの設定

#iTermの設定

## 右クリックで　ペースト
iTerm -> Preferences -> Pointer

Right button single clickをダブルクリック

Actionに Pasete from clipboardを設定

## lsした時にファイルタイプごとに色を付ける

デフォルトだとlsした時にディレクトリとファイルの違いが分からないため、
ファイルタイプごとに色を付ける。

.bash_profileに以下を追記


```
export PATH="/usr/local/bin:$PATH:/usr/local/sbin"
export TERM=xterm-color
alias ls='ls -G'
alias ll='ls -hl'
```
S3のポリシーに戸惑ったので、再度ポリシーとACLについて調べてみた

S3バケットへのアクセスを事細かに制御したくてポリシーを設定しようと思った。
が、なんかうまくいかないので、S3バケットへのアクセス制御について再度確認。


# S3とは
## 概要
* ストレージサービス
* 99.999999999%の堅牢性とか
* あとは以下参照
    * [AWS Blackbelt 2015シリーズ Amazon Storage Service (S3)](http://www.slideshare.net/AmazonWebServicesJapan/20150422-aws-blackbelts3)

## 勘違いしやすいこと
* Windows/Linuxとかと同じようなディレクトリ概念ではない
    * 「フォルダ」とか書いてあるから勘違いしやすい
    * 実体はただの「KVS（Key-Value Store）」
        * Key：オブジェクトまでのパス　ex.) XXXX/KKK/sample.txt
        * Value：ファイルの中身　ex.) samplesample


# S3へのアクセス制御
1. バケットポリシー
2. ACL
3. IAMポリシー

この3種類を駆使してバケットへのアクセス制御をおこなう

## バケットポリシー
* ポリシードキュメント(JSON)を使用して記述
* どの操作/誰に許可を与え、どの操作/誰を拒否するかを記述する

例）sandbox-bucketからXXXXユーザのみオブジェクトの取得が可能

```
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "PublicReadForGetBucketObjects",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::account-number-without-hyphens:user/XXXX"
			},
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::sandbox-bucket/*"
		}
	]
}
```

### 参考リンク
* [バケットポリシーの例](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies.html)
* [アクセスポリシー言語の概要](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/access-policy-language-overview.html)

### 諸注意
* バケットポリシーはバケット所有アカウントとオブジェクト所有アカウントが一致する場合のみ適用される仕様
    * つまり、**バケットに他のアカウントからオブジェクトをアップロードするとバケットポリシーが適用されない**
    * 運用時に特に注意が必要となる

## ACL（Access Control List）
* バケットやオブジェクトごとにアクセス権の設定が可能
* 個々のオブジェクトに対して設定できる
* 種類は5種類
    1. READ
        * バケット内オブジェクトのリスト、オブジェクトの読み込みが可能
    2. WRITE
        * オブジェクトの作成、上書き、削除が可能
    3. READ_ACP
        * バケット/オブジェクトACLの読み込みが可能
    4. WRITE_ACP
        * バケット/オブジェクトACLへの書き込みが可能
    5. FULL_CONTROL
        * 全許可
* ACLよりバケットポリシーの方が優先される

### 参考リンク
* [ACLの概要](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/acl-overview.html)

## IAMポリシー
* 基本的な考え方はバケットポリシーと同じ
* こちらはユーザごとにアクセス制御したいときに有効

### 参考リンク
* [IAMポリシーの概要](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies.html)

## ポリシーとACLの考え方
* 基本的にはDeny(拒否)される
* 明示的にAllow(許可)することで、アクセスが可能
* 明示的にDenyを書くと必ず拒否される
    * 何も書かない＝拒否
    * 明示的にAllow＝許可
    * 明示的にDeny＝拒否
    * 明示的にAllow + 明示的にDeny＝拒否
* ポリシーをうまく書くことが上達の秘訣！？

# その他
* AWS CLIコマンドにはなぜか2種類
    * s3コマンドとs3apiコマンド
    * s3コマンドは鋭意作成中
        * 完全に機能が揃っていない
    * s3apiのput-objectとs3のcp
        * 使い分け
            * cpは自動で分散アップロードしてくれる
                * サイズの大きいファイルのアップロードに適している
                * Linuxコマンドに使い方が似ているので簡単に使える
            * put-objectはcpにない機能を使えた
                * SSEとかできた
                * けど今はcpでもできるしput-objectのコマンド指定面倒
                * 存在意義が不明・・・
巨大 gem がゴミになってた件

# 発端

MacBook Air のディスクがぱつんぱつん。数 GB しか空いとらん。

# 推測

gem をインストールしすぎているんではあるまいか。

不要な gem，不要なバージョンの gem はこまめに消しているつもりなんだが。

# 調査

gem の入っているディレクトリーのサイズを調べたら 3 GB 超！　そんなに？

gem の数は 200 ちょいしか無いのに。なんかバカでっかい gem があるんじゃ？

大きそうな gem のディレクトリーのサイズを一つ一つ調べていった。

# libv8 でかっ！

あった。libv8 がでかい。

バージョン 3.16.14.13 が 950 MB。4.5.95.1 が 776 MB。4.5.95.5 が 1.1 GB。

gem 一つでギガかいっ！

# ゴミでした

ん？　しっかし，なんでバージョンが三つも入ってるんだろう？

全プロジェクトの Gemfile.lock を調べても，3.16.14.13 しか使ってないみたいなんだけど？

とりあえず

```
gem search -l libv8
```

してみると，

```
libv8 (3.16.14.13)
```

となった。インストールされてるのは一つだけ。どういうこと？

そういえば，むかし

```
gem update libv8
```

したとき，コンパイルに失敗したような気が。その残骸が残ってたのかあ。

# 消えろ

ゴミを削除しました。

1.86 GB 空きましたデス。

# 感想

それにしても libv8 でかいなあ。

こんな gem，無しですませたい。
Rubyでのビット操作に便利なメソッド

Rubyでバリバリビット操作をしているのですが、ふと調べてみると、標準メソッドのほうがすっきり高速に書けることがちょくちょくありました。

# Rubyの整数とビット単位の処理
Rubyの整数にはシフトやビット単位のAND/OR/NOT/XORというような演算も整っていて、ビット列として使うことももちろんできます。そして、大きな数は自動で`Bignum`に突入してくれるので、桁あふれでマイナスになってしまう心配もありません。

（なお、これ以降、「○ビット目」という場合、最下位ビットを「0ビット目」として数えます）

# ビット位置のチェック
「整数`num`の`pos`ビット目が立っているかどうか」をチェックしようとした時に、ある程度心得があれば、`(num & (1 << pos)) != 0`なんて書いてしまうかと思いますが、実は`Integer`の側で、ビット位置をチェックするための[`[]`メソッド](http://docs.ruby-lang.org/ja/2.1.0/class/Fixnum.html#I_--5B--5D)が用意してあって（ビットが立っていれば1、なければ0を返します）、`num[pos] != 0`と書けます。そして、この2つの速度を比較してみたところ、`1 << pos`やANDした結果を生成しなくていいということもあって、`num[pos] != 0`のほうが数倍高速でした。

なお、`Integer`はimmutableなので、`[]=`メソッドはありません。

# 何ビット目かの取得
たとえば「200ビット目だけが1になった数」なら`1 << 200`で簡単に作れますが、その逆変換、つまり「4096で立っているのは何ビット目か」数えることが必要となりました。

いちばんシンプルな方法としては、事前に`Hash`でテーブルを用意しておくという方法を思いつきました。単純とはいえ、テーブルを無限に用意するわけにもいかないので、使える値に限度が出ます。

次に、この「最上位だけ1が立った数」から1を引いてみると、「もともと立っていたビット以下がすべて1」の数となります。あとは[少し前に作ったpopcountルーチン](http://qiita.com/jkr_2255/items/ec141731682a79f605d0)で数えれば、ビット位置を計算できます。

…なんてやっていたのですが、Ruby 2.1以降では、`Integer`標準で、「全体を表すビット数」を返す`bit_length`メソッドが登場していました。1ビットだけ立ったものの場合、`bit_length`から1を引くだけで、欲しい値となります。

これまたベンチマークを取ってみると、`bit_length`版が最速でした。桁数が増えれば速度の差は100倍以上となっていました。

#ベンチマークのコード

```rb
require 'benchmark'
require 'bit_counter'

# ビット位置判定のベンチマーク

val = (1 << 2000) -1
pos = 1000
times = 1_000_000
Benchmark.bm 10 do |r|
  r.report 'shift' do
    times.times do
      (val & (1 << pos)) != 0
    end
  end
  r.report '[]' do
    times.times do
      val[pos] != 0
    end
  end
end


# table
table = {}
65536.times { |i| table [1 << i] = i }

# ビット位置への変換のベンチマーク
(4..15).each do |b|
  bits = 1 << b
  puts
  puts "#{bits} bits:"
  key = 1 << bits
  Benchmark.bm 10 do |r|
    r.report 'popcnt' do
      times.times { BitCounter.count(key-1) }
    end
    r.report 'index' do
      times.times { table[key] }
    end
    break unless 1.respond_to?(:bit_length)
    r.report 'bit_length' do
      times.times { key.bit_length-1 }
    end
  end
end
```
スプレッドシート駆動アーキテクチャで問い合わせフォームを作成する

# スプレッドシート駆動アーキテクチャって？
SIerではExcelで画面項目を定義したドキュメントを起こすことが当たり前ですが、Web系の企業ではExcelを使う機会はあんまりありません。しかし、レイアウトを気にしなくて良い簡単なフォームであればスプレッドシート(Excel)で項目を定義するとなかなか素晴らしい開発効率を実現できます。ここは毛嫌いせずにスプレッドシートを活用してアプリケーションを作ってみましょう。スプレッドシートにアプリケーションの情報を記載するのでスプレッドシート駆動アーキテクチャと勝手に呼びます。

ここではExcelから一歩進んでGoogle SpreadSheetを利用し、なおかつApps ScriptのWebアプリとして定義したアプリを動かします。Apps ScriptからGoogle SpreadSheetのデータにアクセスできるので、動的にアプリケーションの情報を書き換えることができて、かなり効率良く開発できます。

もちろん、これで難しいアプリケーションを作りましょうという話ではないので悪しからず。簡単なお問い合わせとか、そういうのを想定しています。

# デモ
<img width="1152" alt="スクリーンショット 2016-04-24 15.50.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/122922/2a79dc5b-63c3-4317-b58d-76dfb0a705d7.png">

[デモ](https://script.google.com/macros/s/AKfycbz_ENcjOmr5t3w6LDU1iRalkiV7q194x1n1IDM07Lu1Ysc862A/exec?ssId=1PyVzzwhHqp4XDWLq5fXce61DiUDT78Go_f3W_q18Q84)で実際に動く画面を確認できます。また、この画面を定義している[スプレッドシートはこちら](https://docs.google.com/spreadsheets/d/1PyVzzwhHqp4XDWLq5fXce61DiUDT78Go_f3W_q18Q84/edit?usp=sharing)です。

このスプレッドシートの内容を書き換えることで、デモのフォームを書き換えることができます。また、このデモではスプレッドシートのIDをGETのパラメータで受け取るようにしているので、他のフォームを作成したいときはスプレッドシートを作成し、そのIDをデモのページのURLに設定するだけでフォームが動作するようになります。

フォームがサブミットされると以下の二つに機能が実行されます。

 * スプレッドシートの「データ」シートにフォームで入力したデータが追加される
 * 指定したメールアドレスにメールを送付する。

# 仕組み
使用している技術は下記の通りです。

 * Apps Script
 * Google SpreadSheet
 * JavaScript

Apps Scriptは作成したアプリをウェブアプリとして公開することができます。またApps ScriptからGoogle SpreadSheetのデータを取得することもできます。これらの仕組みを利用して、Apps ScriptにHTMLとサーバサイドコードをホスティングし、そこからSpreadSheetの情報を取得、取得した情報をもとにJavaScriptでフォームを動的に生成しています。

なお、ソースコードは[https://github.com/jirokun/ss_driven_development](https://github.com/jirokun/ss_driven_development)に保存してあります。

# Apps Scriptのウェブアプリケーションとして導入するときの注意点
Apps Scriptではウェブアプリケーションとして公開するときに下記のURLが表示されます。しかし、ここに表示されている最新のコードのリンクをクリックするとどうも公開用のURLとは異なるようです。
<img width="458" alt="スクリーンショット 2016-04-24 16.10.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/122922/1f559fd0-5df7-9a92-de8f-5556a2226f4a.png">
テキストボックスに表示されているURLをコピーするようにしましょう。
Xcodeで、「No non–expired provisioning profiles were found.」というエラーが出て、実機デバッグできない。ってのを解決した。

## 実機デバッグができない!

iphoneアプリ開発を始めて、できないとモチベーションが下がりまくるやつ。

${実 機 デ バ ッ グ}$

ここを参考にしてやってたけど([参考](http://qiita.com/FumihikoSHIROYAMA/items/a754f77c41b585c90329 "参考"))
ググっても全くわからなくて
しばらく放置してたけど
~~頑張って~~たまたま解決できた。


調べた感じではネット上に正解が転がってなかったし、
勉強会とか行って質問しても、
ありがちな悩みの割に解決策知ってる人が少ないっぽいので
誰かの役に立てれば。
知ってる方法だったり
役に立たなかったらごめんなさい。

# 事象
Xcodeのプロジェクトの'General'ってとこにこんな
エラー（警告？）が出てます。

![p2lRa.png](https://qiita-image-store.s3.amazonaws.com/0/42587/46cd2c76-3ca7-ee84-1ab9-3d88a9e96d3e.png)

英語に詳しい人が言うにはこういうことらしいです。

<img width="1261" alt="スクリーンショット 2016-04-24 23.29.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/42587/299117ba-3276-692c-b31f-8c6bd6250c7b.png">

「いいえ非期限切れのプロビジョニング・プロファイルが見つかりませんでした。」
~~ごめん何言ってるかわからない~~


どうやら、実機デバッグには「プロファイル」なるものが必要らしいです。

「そうか、プロファイルファイルってのをAppleが配布してるのか！」って思って
Apple Developer Programとか見てみたけど
プロファイルがもらえそうなところなし。

しばらく放置してました。

# 解決方法
で、今日iphoneいじってたら
アイコンが設定されてないイケてない名前のアプリがあった。

あれ？これ開発してたやつじゃん
って思って開くと「開発元が信用されていません」的なエラーが出る。

そのメッセージをまんまGoogleで検索したら
以下のページが出てきました。
http://qiita.com/ktysne/items/8e3afc029754dd50f758

見てみると
<img width="880" alt="スクリーンショット 2016-04-24 23.44.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/42587/e6213cfd-9cc4-7532-036a-34be88702740.png">

<img width="490" alt="スクリーンショット 2016-04-24 23.44.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/42587/7ed6d98c-9d99-71e9-4a26-0e7d4d441a4c.png">

<img width="139" alt="スクリーンショット 2016-04-24 23.45.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/42587/7f509400-ff01-f7f8-e4b1-5393fd924883.png">

プロファイルってこれか！！！！

でもこのページを編集した人とはiphoneのバージョンが異なるようで
僕には一般の中にプロファイルがありませんでした。

僕のやつでは
${設定＞一般＞デバイス管理＞デベロッパApp＞認証}$
で解決できました。


僕の場合はこの後
「Could not find Developer Disk Image」ってのが出てもうちょっと苦労したけど
常にxcodeを最新にしとけばそんなことはないと思います。
出てきた人はこちら
[「Could not find Developer Disk Image」の解決](http://kappa-game.hatenadiary.jp/entry/2015/12/20/%E3%80%8CCould_not_find_Developer_Disk_Image%E3%80%8D%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%A8%E5%85%B1%E3%81%AB%E5%AE%9F%E6%A9%9F%E3%83%93%E3%83%AB "「Could not find Developer Disk Image」エラーの解決")
selectableItemBackground（RippleEffect）を動的に設定する

# はじめに
マテリアルデザインの特徴の一つにRippleEffectがありますが、xmlファイルに以下のように記述すれば簡単に実装することができます。

```xml
<TextView
    ...
    android:background="?attr/selectableItemBackground"
    ... />
```

条件の有無でこれを変えたい場合は、java側からセットする必要があります。

# attrの呼び出し
attrをjavaから参照するには以下のようなコードを書きます。

```
TypedArray typedArray = context.obtainStyledAttributes(new int[]{R.attr.selectableItemBackground});
view.setBackgroundResource(typedArray.getResourceId(0, 0));
typedArray.recycle();
```

以下でもOKです。

```
TypedArray typedArray = context.obtainStyledAttributes(new int[]{R.attr.selectableItemBackground});
view.setBackground(typedArray.getDrawable(0));
typedArray.recycle();
```

引数の0はindexで、obtainStyledAttributesに渡しているint配列のindexを指定します。

# paddingが消える
Android 6.1で検証したら正しく表示されましたが、Android 4.1.1では表示が崩れてしまいました。
原因は、selectableItemBackgroundが9-patchを含んでいて、9-patchを含んだものをbackgroundに指定するとpaddingが消えることがあるみたいです。
参考：http://stackoverflow.com/questions/10095196/whered-padding-go-when-setting-background-drawable
以下のようなコードを書くことで回避できます。

```
int l = view.getPaddingLeft();
int t = view.getPaddingTop();
int r = view.getPaddingRight();
int b = view.getPaddingBottom();
 
// 上述の処理
 
view.setPadding(l, t, r, b);
```
Android Studioのレイアウトプレビューがエラーで埋め尽くされた

MacでAndroid Studioを使っていたらある日xmlレイアウトのプレビューが見たことないエラーで埋め尽くされるようになりました。
今までは再起動やキャッシュの消去で治りましたが、今回は治らなかったので原因を調べて解決しました。

# 原因
[retrolambda](https://github.com/evant/gradle-retrolambda)を使ってラムダ式を使った独自ビューを表示しようとしていたことでした。
Android StudioはJDK1.8を使っていましたが、プレビューのところだけそれが効いてないらしかったので以下の方法で解決しました。

# 解決策
以下はYosemite以降のMacの場合です。
結論から言うとlaunchctlでsetenvでSTUDIO_JDKの値を設定すればOKなんですが、これをMacに設定する方法にむしろ自分はつまずきました。
~/Library/LaunchAgents/に以下のファイルを作成します。

```xml:STUDIO_JDK.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>setenv.STUDIO_JDK</string>

        <key>ProgramArguments</key>
        <array>
            <string>/bin/launchctl</string>
            <string>setenv</string>
            <string>STUDIO_JDK</string>
            <string>JDKの置き場所</string>
        </array>

        <key>RunAtLoad</key>
        <true/>

        <key>ServiceIPC</key>
        <false/>
    </dict>
</plist>
```

これでMacを再起動すればOKです。すぐ反映させる場合は、

```bash
launchctl load STUDIO_JDK.plist
```
VirtualBoxのインストール(MacOS X El Capitan)


## 概要
* MacOS X El CapitanにVirutalBoxをインストールする。
* インストール手順はできるだけコマンドライン使ってやってみる。（コピペでやりやすいのと、GUIでの手順なら他にいくらでもあるから。と言ってもコマンドラインでの手順も公式ページに書いてあるけども。）

## ターゲット

インストール後に出来上がるのは以下の環境。

| 対象 | バージョン |
|--------|--------|
|MacOS X El Capitan|10.11.4|
|VirtualBox|5.0.18|

## インストール
### Oracleのダウンロードサイトからインストールイメージをダウンロード

```bash
$ curl -O http://download.virtualbox.org/virtualbox/5.0.18/VirtualBox-5.0.18-106667-OSX.dmg
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 85.5M  100 85.5M    0     0  7785k      0  0:00:11  0:00:11 --:--:-- 7111k
$ 
```

### ダウンロードしたインストールイメージをマウント 

```bash
$ hdiutil mount VirtualBox-5.0.18-106667-OSX.dmg
```

### パッケージをインストール

例ではインストール先のディスクを"/Volume/Macintosh HD"を指定しているけど、自分のように別なディスクにインストールしている場合は

  installer: このソフトウェアをインストールできるのは、OS X が動作しているディスクのみです。

と表示されて怒られるので、環境に合わせて適宜変更する必要あり。

VBoxManageコマンドでバージョン確認できたら、ひとまずインストール完了。

```bash
$ sudo installer -pkg /Volumes/VirtualBox/VirtualBox.pkg -target /Volumes/Macintosh\ HD
Password:
installer: Package name is Oracle VM VirtualBox
installer: Installing at base path /
installer: The install was successful.
$ VBoxManage --version
5.0.18r106667
```

後片付け。インストールイメージをアンマウントしておく。

```bash
$ hdiutil unmount /Volumes/VirtualBox 
"/Volumes/VirtualBox" unmounted successfully.
```

## 参考文献・URL
* [Oracle VM VirtualBox user manual](https://www.virtualbox.org/manual/)
* [VirtualBox Mania](http://vboxmania.net/content/vboxmanage%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)
パRailsを読んでみた 1章 概要編


# はじめに
RailsはおろかRubyもそんなに分かってない系エンジニアがパRailsを読んでみる。

読んでて分からなかったところを調べながら書いていきます。備忘録。


# Ruby周辺ツールが分からない問題

__Rails以前のところが分からなすぎる__

gemはギリギリ分かる（気がする）（正直怪しい）けど、
Rake, Bundlerが謎。Bundlerはパッケージ管理的なものだと思ったけどRakeが謎。

なので本の内容を追いつつ、Gem,RakeとBundlerについて調べてみる。


# gemとは

> Rubyでライブラリを扱う際のパッケージ管理システムであるRubyGemsを扱うためのコマンドです。

> パーフェクトRuby on Rails P20より

なるほど。
RubyGemsって何？という感じなので調べてみると、

> 多くのプログラミング言語と同様に、Ruby にも幅広いサードパーティのライブラリが提供されています。

>それらのほとんどは “gem” という形式で公開されています。RubyGems は (Ruby に特化した apt-get と同じようなパッケージングシステムで) ライブラリの作成や公開、インストールを助けるシステムです。

> [Ruby公式 ライブラリ](https://www.ruby-lang.org/ja/libraries/)より

なるほど…なるほど？Ruby専用のyumとかapt-get的なものという解釈か。


# Rakeとは
> Rake とは

>Rake は Make によく似た機能を持つ Ruby で書かれたシンプルなビルドツールです。

>Rake は以下のような特徴を持っています。

>Rakefile (Rake における Makefile) は標準的な Ruby の文法で書くことができます。 XML ファイルを編集する必要はありませんし、Makefile の風変わりな文法 (タブだっけ？スペースだっけ？) に頭を悩ませる必要もありません。
ユーザは必須条件をタスクに指定できます。
Rake は暗黙のタスクを合成することをサポートしています。
配列のように振る舞うフレキシブルな FileList メソッドがあります。 FileList はファイル名やパス名を扱うのに便利です。
Rakefile をより簡単に作成するためにこのライブラリにはいくつかのタスクが同梱されています。

…うーん？
そもそもMakeがよく分かってないから理解できないのかな？
ビルドツール、という言葉はなんとなくでしか知らないので、
実際何をするものなのかがよく分かってない。
（コンパイルとか、ソースからソフトインストールするときなんかに出てくる印象）

と思って、ビルドツールで調べたらなかなか ~~闇が~~ 深かったのでこれはちょっと置いておくことに。

とりあえず「Ruby製ビルドツール」ということは把握。
ビルドツールと言いつつ、定形コマンド実行ツール的な感じか。

※ 2016/04/26追記
Rakeはビルドツールとしてだけでなく、もっと広い用途に使えるものである、とのコメントを頂きました。
ありがとうございます！


# Bundlerとは

> What is Bundler?

> Bundler provides a consistent environment for Ruby projects by tracking and installing the exact gems and versions that are needed. 

> Bundler is an exit from dependency hell, and ensures that the gems you need are present in development, staging, and production. Starting work on a project is as simple as bundle install.

> [Bundler公式サイト](http://bundler.io/)より

dependency hell…依存地獄みたいなニュアンスだろうか。すごい言葉だ…

プロジェクトごとに使用するgemを管理、バージョンとかも指定できるもの？かな？
genの依存関係まで解決してくれる！すごい！（あってる？）


# 実際にRailsしてみる
ある程度それぞれのツールの用途が分かったので、実際にRailsを動かしてみる。
Rubyは導入済みという前提。(with rbenv)

まずはRailsをインストールする。gemを使って、

```console
$ gem install rails
```

これだけ。とても簡単。
ちなみにパRailsではバージョン4.1.1を使用しているので、バージョンを合わせたければ、

```console
$ gem install rails -v 4.1.1
```

とすると指定バージョンがインストールされる。

railsのインストールができたら、

```console
$ rails -v
```

でバージョン確認しつつインストールできてることを確認。
なお、ここでエラーを吐かれた場合はパスがちゃんと通ってない（反映されていない）場合が多いので、

```console
$ exec shell
```
でシェルを再起動すると吉らしい。
（-lを付けてたり付けてなかったり、execの動作理解がやや怪しいので今度調べる）


railsのインストールができていたら、railsアプリケーションを作りたいディレクトリに移動し、

```console
$ rails new アプリ名
```

と打ち込む。これだけでアプリケーションのテンプレート？が生成される。簡単。
なお、アプリ名で新しいディレクトリが作られ、その中に各種ファイルができるので、
わざわざ自分でアプリごとのディレクトリを作る必要はない。

なかなか多くのファイル、ディレクトリが作られるが、今はとりあえず詳しく見ないで進める。

rails newで生成されたアプリケーションは既に動作する状態なので、
試しにrails内蔵（組み込み？）のサーバを稼働させて確認する。
アプリケーションのルートディレクトリに移動し、

```console
$ ./bin/rails server
```

とすると、内臓サーバ（WEBrick）が立ち上がる。
`./bin/`以下に

ちなみに、前までは

```console
$ bundle exec rails server
```

でrailsのコマンドを実行していたらしい。今でも使えるけど。
確かにGemfiles内にrailsがある。

サーバが立ち上がったらブラウザで"localhost:3000"などと打ち込むと
無事Railsアプリケーションのスタートページにアクセスできる。


Railsアプリがとりあえず出来たので、今回はここまで。
SORACOMリレーブログ2016年4月26日分「Raspberry PiでSORACOM 接続 + MQTTをしてみよう」

# 概要
## これは[ソラコム](https://soracom.jp/)の[Software Design 誌 巻頭特集記念リレーブログ](https://blog.soracom.jp/relay-blog/2016-04/) 4/26分です。

次回4/27（水）のSORACOMリレーブログ「[RaspberryPiでセンサーデータをfluentdを使ってDynamoDBに送って可視化してみよう](http://qiita.com/Ichiro_Tsuji/items/aefd6811606553a3c534#_reference-3fef9215d400c1df8f92)」との連続企画となっており、当記事で構築した環境と作成されるセンサーデータ（のJSONテキスト）を利用してデータの蓄積および可視化までの**一連のIoTの処理の流れが理解できる**ようになります。

なお、本記事は3/23（月・祝）にSORACOM-UG Kansaiが開催した「[[1-1]春のIoTリレーハンズオン@関西＜SORACOM接続 + MQTT編＞](https://soracom-ug-kansai.doorkeeper.jp/events/39574)」のハンズオン用コンテンツが元になっています。

* [春のIoTリレーハンズオン@関西とは？](http://qiita.com/dietposter/items/831e78393bb9b0c4ff8e#%E6%98%A5%E3%81%AEiot%E3%83%AA%E3%83%AC%E3%83%BC%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3%E9%96%A2%E8%A5%BF%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

以下の図はリレーハンズオンで用いるRaspberry Piの実体配線図です。センサーでよく用いられるアナログ入力をADC（Analog/Digitalコンバータ）を用いて利用できるようにした構成です。一見複雑そうですが、はじめて電子工作を行う人が半数を超える中でどなたも問題なく実施することができました。
![image](https://qiita-image-store.s3.amazonaws.com/0/4092/800ea87a-2c8f-1ba8-7ff4-38ec8bd5e8a3.png)


# 記事へのリンク
SORACOM Air/Beam接続に関する実習です。
前後編合わせて4~5時間程度のハンズオンとなります。
### [Raspberry Pi でSORACOM 接続＋MQTTをしてみよう 前編 [Step 1 ～ Step 5]](http://qiita.com/dietposter/items/901de889b1a83f11fa60)

* WebブラウザによるSORACOMコンソール操作
* SORACOM SDK / CLI操作
* Raspberry Piと純正USBモデムを用いたSORACOM Air自動接続

### [Raspberry Pi でSORACOM 接続＋MQTTをしてみよう 後編 [Step 6 ～ Step 8]](http://qiita.com/dietposter/items/42cfc8f76997999f3332)

* Raspberry PiとADコンバータおよび照度センサーの接続
* Raspberry PiだけでMQTTのPub/Subメッセージング
* SORACOM Beamを用いたMQTT接続（時雨堂のSango MQTTブローカーを使用）

# ハンズオンの様子

先日4/23（土）[中之島Spinning](http://www.spinning.jp/)にて「[[2-1]春のIoTリレーハンズオン@関西＜SORACOM接続 + MQTT編＞](https://soracom-ug-kansai.doorkeeper.jp/events/42294)」を開催しました。3/26（月・祝）の「[[1-1]春のIoTリレーハンズオン@関西＜SORACOM接続 + MQTT編＞](https://soracom-ug-kansai.doorkeeper.jp/events/39574)」の再演です。2度目ということでスタッフも参加者のつまづくポイントを把握しており、うまく指導することができ順調に進みました。
![image](https://qiita-image-store.s3.amazonaws.com/0/4092/b9969587-bfda-d54c-f3ec-1c5c86d385aa.png)

# 春のIoTリレーハンズオン@関西プロジェクトについて
2016年初めに行われたSORACOM-UG Kansai月例ミーティングで、コミュニティごとに得意な技術を分担してハンズオンしたら！？という話で盛り上がり、関西のIoT関連の下記4コミュニティが連携して、リレーハンズオンを開催することになりました。

* [関西おうちハック](https://kansaiouchihack.doorkeeper.jp/)
* [SORACOM-UG関西](https://soracom-ug-kansai.doorkeeper.jp/)
* [JAWS-UG 関西IoT専門支部](https://jawsugosaka.doorkeeper.jp/)
* [kintone Café大阪](https://kintonecafe-osaka.doorkeeper.jp/)

## IoTリレーハンズオンのマニフェスト:blush:
>本プロジェクトの目標は、「IoT開発のプロトタイピングに必要な知識を低い学習コストで習得いただくこと」にあります。 
本プロジェクトの立ち上げの経緯は[こちら](http://www.slideshare.net/ichiroohkini/jawsugiot-iot)。
IoTの開発には、デバイスからクラウドまで幅広い知識が必要となります。それら基礎的な知識を身に付けたい方は、ぜひIoTリレーハンズオンに参加して下さい！

各コミュニティがIoTのハンズオンを分担して行うアイデアは、手前ミソながらとても良いと思っています。関西に限らず、様々な地域でコミュニティ間の連携を取ってリレーハンズオン勉強会をおこなってみてはどうでしょう？おススメです。分野の違うエンジニアとの交流も多々あり、盛り上がると思います！
関西でも今後、色んなコミュニティとのリレーハンズオンを考えています。皆さんも是非参加してくださいっ！ :satisfied:
XAMPP HTMLファイルでPHPや絶対パスを使う

使用環境
win7
XAMMP　ｖ3.2.1

# HTMLファイル内でPHPを使う

XAMPPのデフォルト状態では、HTMLファイル内でPHPを実行することはできません。

\xampp\apache\conf\httpd.conf
ファイルをテキストエディタで開きます。

`<IfModule mime_module>`~`</IfModule>`
のタグ内に
`AddType application/x-httpd-php .php .html`
と記述します。

ファイルを保存してXAMPPを再起動します。
Startをクリック→Stop→stopをクリック→start でOKです。


#絶対パスの指定

headerやfooterなど、ページで共通して使うパーツはcssや画像を絶対パスで書いています。

htdoctsの下階層にtestディレクトリを作ったとします。
http://localhost/test/ にアクセスできるわけですが、testよりも下の階層に絶対パスを書いたファイルを置いた場合、アドレスがおかしなことになったりします。

XAMPPのDocumentRootは http://localhost/ となっているため、絶対パスでは上手く読み込めず、 http://localhost/css/style.css というようなURLになります。
（本当ならhttp://localhost/test/css/style.css になって欲しい ）



\xampp\apache\conf\httpd.confを開き、以下を記入します。

```
NameVirtualHost *:80

<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs"
ServerName localhost
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/test"
ServerName local-test
</VirtualHost>
```

今回はhtdoctsの下階層に作ったtestディレクトリに対し、local-testというサーバーネームをつけました。

Cドライブ直下にXAMPPをインストールをしているため、DocumentRootが`C:/xampp/htdocs`になっていますが、使用している環境に合わせて適宜修正をします。


C:/WINDOWS/system32/drivers/etc/hostを編集します。
書き込み権限がない場合があるので、書き込み権限を許可した上で行います。

ファイルを開き、

```
127.0.0.1 localhost
127.0.0.1 local-test
```

と記述します。
Apacheを再起動させると、 http://local-test/ にアクセスできるようになります。
http://local-test/ は C:/xampp/htdocs/test/ を参照しています。

パスが正しく記述されているか確認しましょう。  


#参考
[HTMLでPHPを実行する](http://web77.info/php/extension.html)
[XAMPPでVirtualhostとhostファイル利用して複数サイト管理](http://www.materializing.net/archives/2009/04/05045717.php)
Railsのi18nのYAMLファイル(ja.yml)をリファクタリングする

# config/locales/*.ymlが長すぎて編集しづらい

Railsのja.ymlは長くなってインデントを間違ったり、重複が混ざっちゃったりと管理しづらいYAMLファイルになりがちですよね。

以下例のように各エントリーが参照のみで構成されていれば分かりやすいのに。

```yaml
ja:
  devise: *devise
  errors: *errors
  helpers: *helpers
  number: *number
  support: *support
  time: *time
  date: *date
  datetime: *datetime
  will_paginate: *will_paginate
  activerecord:
    <<: *activerecord
    errors:
      models:
        user: *devise_errors
  app:
    routes: *routes
    categories: *categories
    messages: *messages
```

と言う所で、上記例のようにYAMLファイルをリファクタリングして行く方法を説明します。

# YAMLのアンカーとエイリアスを理解する

まず最初にYAMLのアンカーとエイリアスを理解する必要があります。それとスペシャルキーを使ったマージの仕様を理解します。

## アンカーの利用

YAMLでアンカーってあまり聞かないですよね。

以下例の&dateとあるのがアンカーです。エイリアス(*)を使ってアンカー以下全てを参照できるようになります。

```yaml
date: &date # アンカー
  abbr_day_names:
  - 日
  - 月
  - 火
  - 水
  - 木
  - 金
  - 土
my_date: *date # エイリアス。my_date.abbr_day_namesと利用できる。
```

## マージの利用

YAMLのマージもあまり聞かないですよね。<<を使って現在の階層に他要素を組み込めます。

例えば以下yamlファイルをrubyのオブジェクトに変換してみます。

```yaml:変換前のyamlファイル
a: &a
 aa: aa
b:
 <<: *a
 bb: bb
```

```rb:変換後のrubyオブジェクト
{
  "a" => {
    "aa" => "aa"
  },
  "b" => {
    "aa" => "aa",
    "bb" => "bb"
  }
}
```

"b"エントリーに"a"エントリーの内容がマージされているのが分かりますね。

# リファクタリングする

さあアンカーとエイリアスとマップのマージ。この3つが理解できれば問題なくYAMLファイルのリファクタリングを進められますね。

先頭にアンカーを記述して、末尾でエイリアスを使って参照する仕組みにします。長くなるので部分抜粋＋中間を略しています。

```yaml:ja.yml
#
# https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml
#
date: &date
  abbr_day_names:
  - 日
  - 月
  - 火
  ...略...

datetime: &datetime
  distance_in_words:
    about_x_hours:
      one: 約1時間
      other: 約%{count}時間
    about_x_months:
      one: 約1ヶ月
      other: 約%{count}ヶ月
    ...略...
#
# https://github.com/kano4/troch/blob/master/config/locales/devise.ja.yml
#
devise: &devise
  confirmations:
    confirmed: 'アカウントを登録しました。'
    send_instructions: 'アカウントの有効化について数分以内にメールでご連絡します。'
    send_paranoid_instructions: "あなたのメールアドレスが登録済みの場合、本人確認用のメールが数分以内に送信されます。"
    ...略...

devise_errors: &devise_errors 
  attributes:
    email:
      blank: "入力必須項目です。"
      invalid: "無効なメールアドレスです。"
      taken: "このメールアドレスは既に登録されています。"
      ...略...
#
# My application models.
#
activerecord: &activerecord
  models:
    site: サイト
    user: ユーザー
  attributes:
    site:
      id: サイトID
      name: サイト名
      ...略...

ja:
  date: *date
  datetime: *datetime
  devise: *devise
  activerecord:
    <<: *activerecord
    errors:
      models:
        user: *devise_errors
```

リファクタリングのポイントとしては以下2点です。

1. dateやdatetimeやdevise等が混ざらないように第一階層にアンカーとしてそれをエイリアスで参照する。
2. 複数エントリーを組み合わせるactiverecord.errors.modelsのような箇所はマージを使う。

ここまでスッキリしていればYAMLファイルのメンテナンスが苦になりませんね！

# さいごに

StackOverFlowとか見てみても、これといったシンプルな解決方法がなかったのでQiitaにまとめました。

もし重複行を教えてくれるYAMLエディターがあれば（探してもありませんでしたが）リファクタリングをする必要も無さそうです。

質問などあればコメント欄または[Twitter](https://twitter.com/tkosuga)宛にお願いします。

# リファレンス情報

- YAMLをRubyへ変換する時に困らなくなる記事
 - http://qiita.com/tkosuga@github/items/8ed6e45788648f5a089d
- Yaml Cookbook (For Ruby)
 - http://yaml.org/YAML_for_ruby.html
HTML,CSS勉強メモ #21 ～dropdownがうまく動かない～

レッスンみて書いてるだけなのにハマってます・・・

##**進度**##
09:`dropdown`メニューを使おう

##**メモ**##
メモすることもないんですけど・・・とにかくハマってます。
ボタン作ってリストも作りましたが、クリックしてもリストが出てきません。
bootstrapのサイトのコードをコピペしてもうまくいかない・・・どうなってるの？
ってところでハマってます。

一応ソースを載せておきます。
[dropdown](https://github.com/marin-takagi/responsiv_lesson/commit/4e4bbcd015090a7ec020c7e41913fde932b2283c)

上の方がレッスンのやつで、下の方がコピペしたやつです。

あと、
Uncaught TypeError:Failed to execute 'item' on 'HTML Collection':1 argument required, but only 0 present.
ってエラーが最近よく出ます。
しばらくハマりそうなので抜け出せたらまた書こうと思います。

##**補足**##
どうやらやはりbootstrapの最初の`link`だか、`script`だかの読み込みが間違っていそうです。
Bootstrap 4.0.0-alpha.2のテンプレートをコピペしてそこにレッスンのソース貼り付けたらちゃんと動きました。
どこが間違っているのかじっくり調べてみようと思います。
もしかしたらダウンロードしたバージョンが違ったのかも・・・
【Xcode】【iOSアプリ】アプリ開発初心者にRSSリーダー作成を勧める5つの理由

## はじめに
独学でプログラミング学び始めて約1年、業務でプログラムを書き始めて2ヶ月、Swift始めて１ヶ月のSwifterです。
[前回の記事](http://qiita.com/elle68kew/items/a353988b207df912e3c5)で軽く触れましたが、RSSリーダーはアプリ初心者にとって開発のイロハを学ぶのにちょうど良いと思っています。
今回はそのお勧めの理由をいくつかピックアップしました。
作成したサンプルアプリはgithubに公開しましたので参考にしてください。
[SampleRSSReader](https://github.com/elle68kew/SampleRSSReader)
こんな感じで動作します
- plistにあらかじめ登録しておいた各RSSタイトルが一覧で表示される
- タイトルをタップするとそのRSSの見出しが一覧で表示される
- 見出しをタップするとWebViewで内容が表示される

## 想定する読者
- アプリ本を見ながら作ってみるものの、自分でやってみようとすると何したら良いか分からない
- buttonとかlabel、textfieldを触ってみて、ある程度理解している

## 初心者の悩み
私自身もまだまだエンジニア初心者ですが、以下のようなことで悩む事があると思います

- buttonやlabelだけの簡単なものじゃなくて、もっと**アプリっぽいもの**を作りたい
- スタンドアロンなアプリじゃなくて**外部と通信して**アレコレするアプリが作りたい
- **TableView**とかサンプル通りに作ってみるけど、いざ**自分でやろうとする**とよく分からない
- そろそろ**フレームワークとかライブラリ**とか使ってもうちょっと高度な処理を簡単にやりたい

どうでしょう？　私は結構ここら辺で悩みました。
この悩み全てをまるっと綺麗に解決してくれるわけではないですが、ある程度RSSリーダーが作れるとなんとなく初心者から脱出できた気になれます(僕がそうでした笑)

## お勧めする理由① TableViewの理解が進む
タイトル →　見出し → 各ページの詳細のページ
という作りが基本なのでTableViewの仕組みやデータの表示、画面の遷移などをまるっと実装することになります。作り終わる頃にはかなりTableViewを使えるようになっているのではないかと思います

## お勧めする理由② 配列・辞書の操作に慣れる
TableViewと配列・ディクショナリは切っても切れない関係だと思っています(TableViewに限ったことではないですが・・・)
RSSリーダーを作成するためには否が応でも使わなければならないので、作り終わった頃にはもう配列は怖くない！
 
## お勧めする理由③ ライブラリを使う
RSSのデータを表示するためには色々と処理が必要なのですが、これを自分でやろうとするとクソめんどくさいです。処理をまとめた外部ライブラリを使う事で簡単にすることができるので使わない手はないです　ライブラリは慣れが必要ですが、一旦これで慣れてしまえば他のライブラリを使うときの参考にできるはず

## お勧めする理由④ 比較的簡単でそれっぽいアプリになる
入門書片手にアプリを作ってると「buttonをタップしたらlabelが変わるアプリを作ってどうなんの？」みたいなところで心折れてしまったりします　RSSリーダーは開発してからも色々と拡張できるので「アプリ作った感」は凄くあると思います

## お勧めする理由⑤ 色々拡張できる
ある程度作ってみると、色々機能を追加したくなってきます

- お気に入りのRSSをフォルダで管理したい！
- 気に入った記事をお気に入りに登録したい！
- 登録したお気に入りを削除したり編集したりしたい！
- データの登録をCoreDataでやりたい！
- textfieldの入力から新しくRSSを登録したい！　などなど

初めから色々とやろうとすると難しくてハマってしまいますが、基本的な動きを理解してからだと比較的スムーズに理解できるのではないかとおもいます
また、上記の機能は基礎的かつ重要な技術なので初心者脱出にはうってつけです！多分！

## 終わりに
いかがだったでしょうか？　アプリ作ろうと始めてみても「こんなことやってて何になるんだろう・・・？」みたいに悩んでしまうこともありますが、「この技術をどう使おうか」って考えてみたり動くものを作ってみるとモチベーションもあがります！ぜひお試しくださいませ！
digコマンドでドメイン名からIPの割り出し/IPからドメイン名の割り出し

#TL;DR

DNSサーバーが正常動作しているか確認したい。
`dig` コマンドでドメイン名からIPの割り出しと逆アドレス変換を行う。

```bash
# domain name => IP
dig <domain name>

# IP => domain name
dig <IP address>
```

# 実行例
## ドメインからIPを調べる
```bash:ドメインからIPを調べる例
$ dig www.google.co.jp

; <<>> DiG 9.9.5-3ubuntu0.2-Ubuntu <<>> www.google.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10697
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.co.jp.              IN      A

;; ANSWER SECTION:
www.google.co.jp.       201     IN      A       216.58.197.195

;; AUTHORITY SECTION:
google.co.jp.           43171   IN      NS      ns2.google.com.
google.co.jp.           43171   IN      NS      ns3.google.com.
google.co.jp.           43171   IN      NS      ns4.google.com.
google.co.jp.           43171   IN      NS      ns1.google.com.

;; ADDITIONAL SECTION:
ns1.google.com.         129488  IN      A       216.239.32.10
ns2.google.com.         129488  IN      A       216.239.34.10
ns3.google.com.         129488  IN      A       216.239.36.10
ns4.google.com.         129488  IN      A       216.239.38.10

;; Query time: 76 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Sun Apr 24 22:13:36 JST 2016
;; MSG SIZE  rcvd: 207

```

## IPからドメインを調べる
```bash:IPからドメインを調べる例
$ dig -x 216.58.197.195

; <<>> DiG 9.9.5-3ubuntu0.2-Ubuntu <<>> -x 216.58.197.195
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33430
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;195.197.58.216.in-addr.arpa.   IN      PTR

;; ANSWER SECTION:
195.197.58.216.in-addr.arpa. 84600 IN   PTR     nrt13s48-in-f3.1e100.net.

;; AUTHORITY SECTION:
197.58.216.in-addr.arpa. 45233  IN      NS      ns3.google.com.
197.58.216.in-addr.arpa. 45233  IN      NS      ns1.google.com.
197.58.216.in-addr.arpa. 45233  IN      NS      ns4.google.com.
197.58.216.in-addr.arpa. 45233  IN      NS      ns2.google.com.

;; ADDITIONAL SECTION:
ns1.google.com.         133902  IN      A       216.239.32.10
ns2.google.com.         130335  IN      A       216.239.34.10
ns3.google.com.         131156  IN      A       216.239.36.10
ns4.google.com.         133902  IN      A       216.239.38.10

;; Query time: 76 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Sun Apr 24 22:13:50 JST 2016
;; MSG SIZE  rcvd: 240

```

# 参考
[Linuxコマンド集 - 【 dig 】 ドメイン情報をDNSサーバーから取得する：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230743/)
[digコマンド 使い方 オプション DNS BIND](http://www.geocities.jp/yasasikukaitou/dig.html)
ansible2系で起こったバグの一部紹介

ansible2系にアップデートしてみたところ、以前作成したplaybookが一部うまく行っていない現象に陥ったので、その一部の`yum groupinstall`について記載します。

## yum groupinstallが上手くいかない

### やろうとしていたこと

- Development Toolsのインストール

```terminal
# yum groupinstall "Development Tools"
```

### 作成済みのplaybookの内容

```yaml:roles/groupinstall/tasks/main.yml
- name: install the 'Development tools' package group
  yum: name="@Development tools" state=latest
```

普段はVagrant上でテストしているので`vagrant up`でansibleのprovisioning実行して見たところ、特にエラーらしいものもなかったので、`serverspec`でテストを通してみたところ、本来インストールされているはずのパッケージが入ってない...(gccとか)

### 対処法

```yaml:roles/groupinstall-after/tasks/main.yml
- name: install the 'Development tools' package group
  become: true
  yum: name="@development tools" state=present
```

[こちら](https://github.com/ansible/ansible-modules-core/issues/1409)を参考に修正
VivaldiブラウザでHTML5の動画を見たい

#HTML5のプレーヤーが作動しない（ことがある）
先日、新しいWebブラウザであるVivaldiの正式版がリリースされました。Chromiumを用いたブラウザで、過去Operaを開発していた人が独立して作っているようです。
（Vivaldi（日本語版）: [https://vivaldi.com?lang=ja_JP](https://vivaldi.com?lang=ja_JP)）

そんなVivaldiですが使い始めてから、なぜかHTML5プレーヤーが動作しないことがありました。一応、対処法をメモ程度に書いておこうと思います。

#対処法
1. URLボックスに`vivaldi://plugins`を入力
2. プラグイン一覧が表示されたら、"Widevine Content Decryption Module"が表示されていることを確認
3. 表示されていれば、"常に実行を許可する"を選択して、ブラウザを再起動
4. ここまでで、HTML5プレーヤーが起動しない場合は、プラグインのバージョンが古いもしくは存在しない可能性があります。
5. プラグインのアップデートを確認します。URLボックスに`vivaldi://components`を入力
6. コンポーネント一覧が表示されたら、"Widevine Content Decryption Module"の"アップデートを確認"をクリック
7. アップデートが完了したら、もう一度手順1から順に実行してみる

ここまでで、自分の環境ではHTML5が見れるようになりました。まだまだ新しいブラウザなので参考までに自分の環境での手順を書きましたが、他に良い手段があれば教えてください。

#補足
このVivaldiですが、中身がChromiumなだけあって、GoogleChromeのコマンドが大体使えます。（ついでに、拡張機能を導入する際にVivaldiから開かれるのは"Chromeウェブストア"です）
さらに、今回対処法で示した手順で`Vivaldi://〜`と示したコマンドは、**`Chrome://〜`と入力しても問題なく動作します。**今までGoogle Chromeを使っていた人は是非試してみてください。
Herokuにデータベースを用意しないDeployでDetected sqlite3 gem which is not supported on Heroku と言われました。

Herokuで `Deploy a GitHub branch`からRailsのプロジェクトをDeployしようとしたところ失敗しました。

# Deployで失敗
Deployで失敗しました。

```
略

       Make sure that `gem install sqlite3 -v '1.3.11'` succeeds before bundling.
 !
 !     Failed to install gems via Bundler.
 !     
 !     Detected sqlite3 gem which is not supported on Heroku.
 !     https://devcenter.heroku.com/articles/sqlite3
 !
 !     Push rejected, failed to compile Ruby app
```
sqlite3はやめて、pgを入れろというやつだと思います。
そういえばそもそもDatabaseを作っていませんでした。。

# アプリにPostgresを追加

アプリに`Heroku Postgres`を追加します。
Herokuのアプリ管理画面にアクセスします。
`https://dashboard.heroku.com/apps/アプリ名/resources` にある、　`Add-ons` から `Postgres` と検索して、 `Heroku Postgres` を追加します。

追加された **Heroku Postgres** をタップすると、　`https://postgres.heroku.com/databases` にリダイレクトされるのでデーターベースを作成します。
 **Create Database** をタップします。次に、 **Dev Plan (Free)** を選択し、 **Adding Database** をタップします。

作成された、Databaseをタップして中の情報を見て、Railsのdatabase.ymlを更新します。

```yml:
production:
  <<: *default
  database: データベース
  username: ユーザー名
  password: パスワード名
```

# Gemfileにpgを追加
Gemfileにpgを追加します。あとローカルではMySQLを使用していますし、`sqlite3`を削除します。

```diff
- gem 'sqlite3'

+ group :production do
+   gem 'pg'
+ end
```
bundle installしておきました。

```
bundle install
```

# Githubにpush
git commit してからGithubへpushします。

# HerokuでDeploy
こんどは成功しました(☝ ՞ਊ ՞)☝
Starlingで読み込むBitmapFontファイルを手作業で作る

Starlingで扱うBitmapFontデータを作成する際は何を使っているでしょうか。

![title-logo.png](https://qiita-image-store.s3.amazonaws.com/0/8302/e5ec0dbf-fb12-2fde-46d2-3c36f3b9e234.png)

WindowsならBMFont (http://www.angelcode.com/products/bmfont/) 一択でしょうか。Macでは、、Starlingの作者も使ってるGlyph Designer (https://71squared.com/glyphdesigner) が有名ですね。しかしこれは有料、しかもサブスクリプションの定期払いなんですよね。たまにしか使わないのに個人で定期払いするのもちょっと気が引けます。。リリース当初は無料だった気がするんですが。他にも代替ツールはいろいろあるんですが、( Hieroというツールのページにたくさんの代替ツール一覧があります。このツール自体も良さそうですが、ちょっと触ってみたものの起動にまだ成功していません。 https://github.com/libgdx/libgdx/wiki/Hiero ）、細かい使い勝手や日本語対応などを考えると決定版はないのかもしれません。あるなら教えて欲しい。
 
#フォントファイルを自作しよう
ただ、ビットマップフォントのXMLを見てみると、フォーマット自体はそこまで難しくないので、画像はPhotoShopとかで作って、XMLデータはテキストエディタで手書きする事も可能です。等幅でないフォントから文字を大量に選んで効率良くパックする、、などの場合は難しいですが、等幅で固定サイズの文字であればすぐに作れると思います。また、いろんな設定値があるものの、Staelingで参照している値は一部なので、必要な部分のみ記述してやれば楽チンです。

#具体例
Staling2.0(1.0も同じと思われる)ではstarling.text.BitmapFontというクラスで読み込んだfntファイル(XML)を解析して、フォントを初期化しています。

![nums1.png](https://qiita-image-store.s3.amazonaws.com/0/8302/426d44cb-0b14-5639-025a-6ee3681e5ebc.png)
_参考に用意したフォント画像_

fntファイルの方ですが、Starlingが利用している部分のみハイライトしてみます。（10文字分の設定なのでcharsの下にcharエレメントが10個ありますが、それぞれ内容は全く同じです。）

<img width="792" alt="fnt2.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/5ec9da2d-379c-20d7-7bee-e069027fb46b.png">

* **赤字**：必須のもの、詳細は後述。
* **青字**：フォントのアンチエイリアス設定、０だとスムーズ処理なし。
* **ピンク**：Bitmapフォントクラスでは使用していないが、AssetManagerを介してビットマップフォントを自動で初期化する場合、この名前(file)でテクスチャ名の突き合わせが行われる。

なんとその他の属性値は全く参照されていません。名前から推測してそれっぽい値を入れておきましょう。。続いて、下記に必須の属性値の詳細を箇条書きします。

* **face**：フォント名です。Textformatの指定時に使うやつです。
* **size**：フォントサイズです。（このフォントサイズでしか表示できないという事ではありません。）
* **lineHeight**：文字１行の縦幅です。意味が分からなければサイズと同じにしておけば良い。
* **base**：ベースライン指定です。意味が分からなければサイズと同じにしておけば良い。
* **id**：文字コード番号です。数字の'０'は48番ですね。
* **x**：画像ファイルファイル中で該当文字があるX座標です。
* **y**：同y座標。
* **width**： 同横幅。
* **height**：同縦幅。
* **xoffset**：ベースの配置位置からx座標にずらす幅。文字の大きさより大きさより画像データがトリムされてる場合の設定。トリムしてなければ０にする。
* **yoffset**：ベースの配置位置からy座標にずらす幅。意味はxoffsetと同様。
* **xadvance**：後ろにくる文字をこの幅だけあけて配置する。widthより小さいと後続の文字がくっついてきます。widthより大きいと後続の文字が離れます。わからならければwidthと同じにしておく。
 
以上です。簡単ですね。レトロゲームなどに使うビットマップフォントの場合、全ての文字が同じサイズなので機械的に設定値が埋められてさらに簡単です。

※ なお、kerning(ある文字とある文字の文字間隔)の設定も可能なのですが、手作業で設定するのは辛いものなので割愛します。


#おわりに
一部で有名なShoeBox( http://renderhjs.net/shoebox/ )というツールはいい感じなのですが、日本語がうまく扱えないとかなんとかで非常に惜しい。(AIR製らしい。）すごく簡単なビットマップフォント書き出しツールであればFlashで作った事があるのですが、ここでは公開できないものなので残念です。PhotoShopエクステンションとかで書き出し機能を作ったら喜ばれますかねえ。(BMFont形式はStarlingだけで使うものでもないし需要はありそうだが、すでに探したらありそうだ。）

ではでは。
Muninで監視対象を監視する

#はじめに

以下の構成で監視環境を構築する。

|監視サーバ|監視対象サーバ|
|-------------|------------|
|192.168.56.20|192.168.56.10|
|munin-node, munin-server|munin-node|

尚、監視サーバでCronとApacheはインストール済みかつ起動済みとする。

#EPELリポジトリの追加
CentOS 7でyumをインストールするには、EPEL(Extra Packages for Enterprise Linux)リポジトリが必要になるため、
yumコマンドでEPELリポジトリを追加する。

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


#Muninのインストール/設定
##監視対象サーバ


###インストール
```
# yum --enablerepo epel install munin-node
```

###設定

監視サーバのIPを指定する

```/etc/munin/munin-node.conf
allow ^192\.168\.　56¥.30$
allow ^::1$
```

##監視サーバ

###インストール
```
# yum -y install munin
```

###設定

```/etc/munin/munin.conf
[VisualizeFoundation]
    address 192.168.56.10
    use_node_name yes
```

[ ]内は、"[グループ名(任意);監視名]"という表記をする。
監視対象が多い場合は、グループ名を指定することで、
Muninの画面でグループ化されて見やすくなる。
今回は、監視名のみとしている。

#動作確認

http://192.168.56.30/munin へアクセスする。
表示期間を指定して確認することも可能。

![munin00.png](https://qiita-image-store.s3.amazonaws.com/0/65994/77562fc0-2b1e-4735-0429-2052d3d13c73.png)
DB保存前のhas_many内で値がユニークか判定をする

# テーブルに格納されていない値にバリデーションが行われない

ActiveRecord::Base#validatesのuniquenessオプションはテーブルに格納されている値でユニーク判定を行います。

そのためDBに保存前のモデルにはユニーク判定が行われません。

以下サンプルコードです。uriが同じ「a」ですがバリデーションエラーは起こりません。

```rb
class Page < ActiveRecord::Base
  belongs_to :site
  validates :uri, uniqueness: true, scope: {[:site_id, :uri]}
end

class Site < ActiveRecord::Base
  has_many :pages
end

site = Site.new
site.pages << [Page.new(uri: :a), Page.new(uri: :a)]
site.save! # ここでエラーにならない

```

テーブルに格納されていない値にもバリデーションが行われて欲しいですよね。

# before_validation に値がユニークかの検証を追加する

これを解決するには親に当たるモデル、この文中の例ではSiteクラスで子に当たるpagesの値を確認します。

まずSite#pages内で値の重複を確認して、問題なければPageモデルのvalidatesでテーブルの値を確認する流れになります。

```rb
class Page < ActiveRecord::Base
  belongs_to :site
  validates :uri, uniqueness: true, scope: {[:site_id, :uri]}
end

class Site < ActiveRecord::Base
  has_many :pages
  before_validation :children_be_uniq

  def children_be_uniq
    resource_be_uniq(pages, :uri)
  end

  def resource_be_uniq(collection, attribute_name)
    success = true
    uniq = []
    collection.each{|m|
      if uniq.include?(m[attribute_name])
        error_message = I18n.t("errors.messages.taken", attribute: I18n.t("activerecord.attributes.#{m.class.to_s.underscore}.#{attribute_name}"))
        errors.add(:base, error_message)
        m.errors.add(attribute_name, error_message)
        success = false
      else
        uniq << m[attribute_name]
      end
    }
    success
  end
end

site = Site.new
site.pages << [Page.new(uri: :a), Page.new(uri: :a)]
site.save! # ここでエラーになる
```

きっちりとバリデーションエラーが発生して良い感じですね。

```
ActiveRecord::RecordInvalid: バリデーションに失敗しました。 URLはすでに存在します。
```

accepts_nested_attributes_forを使って複数のhas_manyを一括で更新する場合などでも利用できます。

```rb
class Site < ActiveRecord::Base
  has_many :pages
  accepts_nested_attributes_for :keywords, allow_destroy: true
  before_validation :children_be_uniq
  ...以下略
end

permit_attrs = [
 {pages_attributes: [:id, :uri, :_destroy]}
]
permit_params = params.require(Site).permit(permit_attrs)
site.update_attributes!(permit_params) # before_validationで値の確認が行われる
```



質問などあればコメント欄か[Twitter宛](https://twitter.com/tkosuga)にお願いします。

# リファレンス情報

- uniquenessオプションの詳細
 - http://guides.rubyonrails.org/active_record_validations.html#uniqueness
- before_validation等のコールバックされる順番
 - http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
SQLの細かい技

# SELECT句で複数の条件でのCOUNT結果を同時に取得する

以下のようなテーブルがあって、

```sql:create_table.sql
create table A (
 id bigint,
 primary key(id)
 );
```

IDが100未満の件数と100以上の件数が同時に欲しいとき、
COUNT文の中に式を書けば取得できます。

```sql
SELECT COUNT(id<100 or NULL), COUNT(id>=100 OR NULL)
FROM A
```

### 参考サイト
https://www.softel.co.jp/blogs/tech/archives/3267
enchant.jsのキャンバスを最大化して中央に配置する

[enchant.js](http://enchantjs.com/ja/)で作ったアプリをスマホでもいい感じに表示したかったので、画面に対してできるだけ大きく表示し、かつ余白はセンタリングするようにしました。

```
var scl = Math.min(window.innerWidth / game.width, window.innerHeight / game.height);
game.scale = scl;
var left = ( window.innerWidth - ( game.width * game.scale ) ) / 2;
var top = ( window.innerHeight - ( game.height * game.scale ) ) / 2;
$('#enchant-stage').css({
    "position":"absolute","left":left+"px","top":top+"px",
});
```
ついでに、余白をゲーム背景の色(#xxxxxx)と同じにするには
```
document.body.style.background = "#xxxxxx";
```
です。
python文字列比較 / '=='と'or'じゃなくて'リスト'と'in'を使うんだ

# python文字列比較
	引数の中身が'range'か'r'だったときにこの出力
	引数の中身が'ladder'か'l'だったときにあの出力
っていうのをやりたくて
文字列比較で条件分岐しようとしたんだけど


```python
def function1(mode):
	if mode == ('range' or 'r'):
		x=1
	elif mode == ('ladder' or 'l'):
		x=2
	return x
print(function1('r'))


'''実行結果
Traceback (most recent call last):
    print(function1('r'))
    return x
UnboundLocalError: local variable 'x' referenced before assignment
'''
```


`or`じゃ反応してくれないのかな？
`==`の前後逆にしてみたけど

```python
def function2(mode):
	if ('range' or 'r') == mode :
		x=1
	elif ('ladder' or 'l') == mode :
		x=2
	return x
print(function2('r'))


'''実行結果
Traceback (most recent call last):
    print(function2('r'))
    return x
UnboundLocalError: local variable 'x' referenced before assignment
'''
```


どうすりゃいいんだ(・ω・\`)
・・・と、思い立ってリストとin演算子を使ってみた。

```python
def function3(mode):
	if mode in ['range' ,'r']:
		x=1
	elif mode in ['ladder' ,'l']:
		x=2
	return x
print(function3('r'))

'''実行結果
1
'''
```

うまくいきました
ぱっと調べて出てこなかったから誰か困るかもと思ってぱっと書いておく

python的にはメモするのも恥ずかしいくらいすごく基本的なことかもしれないね(・ω・\`)



ちなみに比較演算子で`is`っていうのもあるけど、これは「オブジェクトがそれ自体を指しているのか？」みたいな意味らしくてもっと狭い使い方だそうな。
MMDモデルをOculusで見る

MikuMikuVRを使ってMMDモデルをOculusで見る方法を紹介します。
Unityで見るよりも手っ取り早いです。

#必要なもの
・MikuMikuDance(MMD)
http://www.geocities.jp/higuchuu4/
・MikuMikuEffect(MME)
http://www6.atwiki.jp/vpvpwiki/pages/219.html
・MikuMikuVR for Oculus Rift
http://www.nicovideo.jp/watch/sm27785929

これらは64bit版，32bit版のどちらかで統一する。

#準備
###MME
MMEの入っているフォルダを開き，
d3d9.dll, MMHack.dll, MMEffect.dllを，MikuMikuDance.exeと同じフォルダにコピー。
MMDを起動し，右上にMMEffectが表示されれば成功。
起動しない場合は，
http://www.geocities.jp/higuchuu4/
の「エラーが出て実行できない場合は」のところから
「Microsoft Visual C++」「DirectX」をインストール。

###MikuMikuVR
MikuMikuVR.dll,MikuMikuVR.exe をMMD本体と同じディレクトリに格納する。

#MMDモデルをOculusで見る
MikuMikuVREXE.exeを起動。

まだこの段階ではOculus側に表示されない。
MikuMikuVRのフォルダ内のMMDOVREffectのフォルダにMMDOVRCamera.xというものがあるので
これを読み込む必要がある。

読み込むとOculusの方にMMDの画面が表示される。
あとは好きなモデルを読み込んで眺めるだけ。
普段MMDを使う時と同様に，視点を移動したり回転したりすることで，
Oculus側に表示されるものも同じように回転・移動できる。
JavaScriptで「エクスクラメーションマーク2つ」の意味（`!! extensions.get( 'OES_texture_float' )`）

# 背景
three.jsのソースを調べていたら、ビックリマーク2つの処理がありました。

```js:three.js
this.floatFragmentTextures = !! extensions.get( 'OES_texture_float' );
```
https://github.com/mrdoob/three.js/blob/c680e4c7159b94514a2121bd64dd17d21ba89c02/src/renderers/webgl/WebGLCapabilities.js#L84

やっていることはBooleanに変換しているだけです。
じゃあなんで以下のようにBooleanコンストラクタを使わないんですかね？

```js
this.floatFragmentTextures = Boolean( extensions.get( 'OES_texture_float' ) );
```

# 「エクスクラメーションマーク2つ」の意味

下記のサイトに答えが書いてあるのだと思うんですが、英語のためよく分かりませんでした...
http://www.bennadel.com/blog/1784-using-double-not-operator-for-boolean-type-casting.htm

>Pretty slick. So, why would you want to do this? Well, in jQuery, there are methods that work off of Boolean values (such as jQuery.grep() and jQuery.fn.filter()) and it's nice to have a concise way to perform such conversions. That said, James Padolsey points out in his jQuery Cookbook chapter (page 47):

# 参考サイト
http://www.penpale.jp/blog/double_exclamation_mark.html
http://stackoverflow.com/questions/784929/what-is-the-not-not-operator-in-javascript
Docker と Alpine Linux で Factorio server を動かす

最近 [Factorio](https://www.factorio.com/) が流行っていますね。
私の研究室でもインフラエンジニアの募集があったので、ついつい購入してしまいました。
Factorioの研究は進むのに、大学の研究は全く進みません。困りました。

Factorio の headless server はバイナリファイル一枚で動いているので、そこまでインストールに時間はかかりません。
しかし CoreOS の中にバイナリを置きたくないのと、バージョン追従のことを考えて Docker image を作成しました。

Dockerhub: https://hub.docker.com/r/munisystem/factorio/
Github: https://github.com/munisystem/docker-factorio-server

## 使い方

```bash
$ docker run -d \
   -v /srv/docker/factorio/save:/factorio/saves \
   -p 34197:34197/udp \
   munisystem/factorio:stable
```

このコマンドで

- マップデータの作成
- サーバーの起動

をいっぺんに行うことができます。

また docker-compose がインストールされている場合は、

```bash
$ wget https://raw.githubusercontent.com/munisystem/docker-factorio-server/stable/docker-compose.yml
$ docker-compose up -d
```

で動かすこともできます。

引数が与えられている場合はバイナリを直接叩くようになっています。
すでにサーバーを運用していてマップデータが手元にある場合は、

```bash
$ docker run -d \
   -v /srv/docker/factorio/save:/factorio/saves \
   -p 34197:34197/udp \
   munisystem/factorio:stable --start-server <savedata>
```

のような形で起動してください。

## イメージの作成
イメージのサイズを小さくしたかったので、[Alpine Linux](http://www.alpinelinux.org/) を使うことにしました。
Alpine Linux については以下の記事が参考になります。
http://qiita.com/asakaguchi/items/484ba262965ef3823f61

Factorio の headless server は glibc があれば動くようなのですが、Alpine Linux には glibc が入っていません。
Dockerhub を覗いていたら[glibc インストール済みイメージ](https://hub.docker.com/r/frolvlad/alpine-glibc/) を見つけたので、今回はこれをベースイメージにしています。

今回作成した Dockerfile は以下になります。

```Dockerfile
FROM frolvlad/alpine-glibc:alpine-3.3_glibc-2.23

MAINTAINER munisystem

ENV APP_VER 0.12.30

RUN apk --update add wget && \
    wget --no-check-certificate -O /tmp/factorio.tar.gz https://www.factorio.com/get-download/`echo $APP_VER`/headless/linux64 && \
    tar zxvf /tmp/factorio.tar.gz && \
    apk del wget && \
    rm -rf /var/cache/apk/* /tmp/*

WORKDIR factorio
COPY ./start.sh /factorio/start.sh

EXPOSE 34197/udp

ENTRYPOINT ["./start.sh"]
```

イメージサイズは 24MB(Dockerhub調べ) になります。
とても軽量ですね。

## まとめ
docker で簡単にマルチプレイ用の環境を作ることができます。
みなさんも汗水たらして工場運営しましょう。
~~時間泥棒とか言わない。~~
Ubuntu 16.04 LTS serverをインストールした時の自分用メモ

#実はインストール前から事件
##サーバーが起動しない・・・
###給料日前なのに出費してしまうのか！？！？！
###いいえ、叩いたら直りました。
###うちのサーバーは昭和のテレビのようです。

まあどうでもいいですね。

#HDDからSSDに換装しました
##Minecraftサーバーのために
どうしてもディスクアクセスが増えるのでSSDにしちゃいました。
RAMDISK運用も検討したんですが、
知識不足なので何もしないでもパフォーマンスが上がる方向で
今回は妥協しました。（上がるかわかんないけど）

#インストール直後
##とりあえず必要そうなものを・・・
> $ sudo apt-get install ssh tmux openjdk apache php samba

いや、違うんですよ、ファイル転送がそのーSFTPとかを上手く使えないのでSambaでいつもファイル移動させてたんです。
慣れちゃったから突貫工事だったのでついつい・・・
今度もっと別のセキュリティ上安全性の高いファイル転送勉強します。

openjdkもjavaで何か開発するわけでもないのでインストールが簡単だった方を使いました。

##apacheでphpが動作しない・・・
例のごとくapacheでつまづくというね
Moduleが足りなかったようです
前提知識無しに突っ込むとろくなことがないですね
>$ sudo apt install libapache2-mod-php
$ sudo service apache2 restart

##PHPのXML解析がうまく動かない
simplexmlだったっけな、それが動かなかったので
>$ sudo apt install php7.0-xml
$ sudo service apache2 restart

これでとりあえず動きました。

##minecraft serverは問題なし
バックアップをかけたファイルをSambaで転送して
いつもどおり起動スクリプトで動かした。

#おわり