OmniAICreator/Qiita-1.07M huggingface dataset:
ついにESP-WROOM-02のArduino互換ボードが発売！ 欲しくなるポイントまとめ

# スイッチサイエンスよりESP-WROOM-02のArduino互換ボードが発売されました！
何かと電子工作界で話題のWi-FiモジュールESP-WROOM-02(ESP8266)。激安なのはもちろん、**Arduino IDEでスケッチ(プログラム)が書き込めちゃう**とうところに魅力を感じる方も多いと思います。Arduinoのように使っちゃうということですね。でも電子工作初心者にはそのハードルは高いものでした(モジュールにはんだ付けしたり、USB接続がちょっと面倒だったり)。

**そしてついにスイッチサイエンスよりArduino互換ボードが発売されました！**見た目は[Arduino Uno](https://www.arduino.cc/en/Main/ArduinoBoardUno)とそっくり。だって互換ボードだもの :raised_hands: 

[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)
![2620_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/90257665-8f42-bf8f-8607-f5e8dfa28d5f.jpeg)
![image-1456218104185.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/d2d1df83-d2cd-ec6c-751c-f306080d783f.jpeg)

個人的にはもう買うしか無いのですが、発売したばかりで品切れ、、、(2016/03/02時点)なので、持っている方にお借りしました。ありがたや。
**争奪戦を激化するのを覚悟で欲しくなるポイントをまとめました。**

# ポイントその1：やっぱり激安！
スイッチサイエンス調べ。
[Arduino Uno](https://www.switch-science.com/catalog/789/)は3,240円。それに対し[ESP-WROOM-0 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)はなんと**2,980円**！ なんと3,000円割り込んできました。恐ろしい価格 :scream: 
試しに買っちゃってもいいレベル。

# ポイントその2：スペック高し！
Arduino UnoはSRAMが貧弱でスケッチが全然書き込めねぇ！ SRAM外付するしかねぇ！ とスペックが低い。それに比べて驚きのスペック！[SPIFFS](https://github.com/pellepl/spiffs)を使えば、スケッチとは別にHTMLなどのデータを書き込めるらしいです(参考記事「[WebSocketライブラリ、ベータのベータバージョンを作ってみました](https://www.mgo-tec.com/blog-entry-ws_lib01.html)」)。
 
データシート参照
[Release Date 20160225 Document list 0A-0D ESP8266 Hardware Guide](http://bbs.espressif.com/viewtopic.php?f=51&t=818)

|  | Arduino Uno | **互換ボード** |
|:-----------|:------------:|:------------:|
| クロック周波数 | 16MHz | **80MHz** |
| SRAM | 2KB | **50KB** |
| フラッシュメモリ | 32kB | **4MB** |

# ポイントその3：買ったらすぐ使える！
いままでのようにモジュールにピンをはんだ付けしたり、ブレッドボードで配線したりせずにすぐ使える！
お決まりのLチカ :bulb: の様子。青いLEDがArduino Unoでいうデジタル13番のLED。
![led.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/b7ca3c90-799c-8b2c-18ac-acba676671ed.jpeg)

# 注意ポイント
## 1. 動作電源が3.3V
Arduino Unoは動作電源が5Vでしたが、ESP-WROOM-02自体が動作電源3.3Vということもあり、互換ボードも3.3Vになっています。

## 2. ピン配置がArduino Unoとは違う
ソケットの数は配置はArduino Unoとそっくりですが、ESP-WROOM-02が扱うピンと異なるため、配置・機能が異なります(先ほどのLチカはデジタル14番ピンだったりします)。

## 3. シールドが使えない場合がある
シールドはArduino Unoで使うことを想定されているものがほとんどのため、ピン配置が異なる互換ボードでは使えないものもあるようです。

## 4. ~~アナログ入力は0〜1Vの間で~~
~~Arduino Unoでは0〜動作電源の5Vをアナログ入力値としてInputしていましたが、互換ボードでは0〜1Vの間の電圧をInputします。このあたりは少々電子工作力が必要になりそうですね。~~
こちらは説明書きを見落としていました。ESP-WROOM-02側では0〜1Vで入力しないといけないのですが、**互換ボード側で分圧してくれているので、0〜3.3Vで入力しても問題ないとのことです。**ありがたし！

## 5. 搭載されているLEDが眩しい
これは完全に個人的な感覚なのですが、電源の赤いLEDが眩しくてあまり視界に入れながら開発できないかなと感じました:sunny:。 

# 買うっきゃ無い！
ESP-WROOM-02の互換ボード発売はかなりの衝撃でした。次回入荷されるタイミングで即買します。現在手元にあるものがお借りしているものなので、自分のボードが届いたらいろいろといじり倒してみます。都度Qiitaに投稿しますねー :smile: 

# GPIOの使い方についてまとめました
デジタル・アナログともに入出力どれ使えばいいのか人力で確認してまとめました。
[ESP-WROOM-02 Arduino互換ボードのGPIOはこうやって使う](http://qiita.com/umi_kappa/items/ac3d37db44a2dcfe71fd)

# ESP-WROOM-02 Arduino互換ボード記事一覧
- ついにESP-WROOM-02のArduino互換ボードが発売！ 欲しくなるポイントまとめ
- [GPIOはこうやって使う](http://qiita.com/umi_kappa/items/ac3d37db44a2dcfe71fd)
- [サクッとHTTP通信できたよ](http://qiita.com/umi_kappa/items/c3c929c6f42c5bdf3143)
自分の町のトイレコンシェルを作る方法

jig.jpの[福野泰介](http://fukuno.jig.jp/)さんが作成された[トイレコンシェル ５つ星オープンデータバージョン](http://fukuno.jig.jp/939)というWebアプリがあります。
これは、あらかじめ指定した場所(たとえば最寄り駅)や現在地から距離の近いトイレを見つけ出し、ルート検索をしてくれるアプリです。

<img src="http://fukuno.jig.jp/app/wcconcierge/ss.png" width="300" />

[トイレコンシェル ５つ星オープンデータバージョン](http://fukuno.jig.jp/939)は、福井県鯖江市のデータを使っていますが、トイレ情報を提供するSPARQLエンドポイントがあれば、鯖江市以外の地域のアプリを作ることが可能です。

自分の町のトイレコンシェルを作る手順を以下で説明します。

# トイレコンシェル ソースコード 取得

トイレコンシェルのソースコードは、GitHub に公開されています。

<https://github.com/taisukef/wcconcierge>

こちらをFork、もしくはダウンロードしてください。
このリポジトリの中にある `index.html` を一部書き換えることで、鯖江市以外のデータを表示させることができます。

# 初期位置指定

GitHub のコードでは、初期位置が「鯖江駅」となっています。
まず、初期位置を変更します。位置は、緯度経度で指定します。

緯度経度は、たとえば以下のようなツールで調べることができます。

<http://uedayou.net/getlocation/>

テキストエディタで`index.html`を開いてください。78行目あたりに

```
  DEFAULT_ORG = new google.maps.LatLng(35.943187,136.188701); // 鯖江駅
```

という行があります。
ここの`35.943187,136.188701`を、最初に表示したい位置の緯度経度に変更してください。
たとえば大阪駅を指定したい場合はこのようになります。

```
  DEFAULT_ORG = new google.maps.LatLng(34.702485, 135.495951); // 大阪駅
```

また、330行目あたりと、368行目あたりに、`鯖江駅`と記述されているところがあります。
これらは指定した場所の地名に変えておくとよいでしょう。

```
	  		alert("鯖江駅から20km以上離れているため、起点を鯖江駅にします");
```

```
	  s.push(demomode ? "鯖江駅から" : "ここから");
```

# SPARQLエンドポイント 変更

トイレ情報を取得するWeb APIである SPARQLエンドポイントのURLは、187行目あたりに記述されています。

```
var baseurl = "http://sparql.odp.jig.jp/data/sparql";
```

ここを自分の町のトイレ情報が格納されているSPARQLエンドポイントのURLに変更しましょう。

# SPARQLクエリ 書き換え

SPARQLクエリは161行目から181行目あたりに記述されています。

```
	var q = f2s(function() {/*
		PREFIX jrrk: <http://purl.org/jrrk#>
		PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
		PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
		PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
		PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
		select ?s ?name ?lat ?lng ?img ?common ?man ?woman ?babybed ?handicapped {
			?s rdf:type <http://purl.org/jrrk#PublicToilet>;
			rdfs:label ?name;
			geo:lat ?lat;
			geo:long ?lng.
			optional { ?s <http://schema.org/image> ?img. }
			optional { ?s <http://purl.org/jrrk#manToiletCapacity> ?man. }
			optional { ?s <http://purl.org/jrrk#womanToiletCapacity> ?woman. }
			optional { ?s <http://purl.org/jrrk#commonuseCapacity> ?common. }
			optional { ?s <http://purl.org/jrrk#barrier-freeToiletCapacity> ?handicapped. }
			optional { ?s <http://purl.org/jrrk#hasBabybed> ?babybed. }
			filter(?lat < LAT_MAX && ?lat > LAT_MIN && ?lng < LNG_MAX && ?lng > LNG_MIN)
			filter(lang(?name)='ja')
		}
	*/});
```

SPARQLクエリは、トイレの名前が `?name`、トイレの位置情報が `?lat`:緯度、`?lng`:経度 に格納されるように作成しましょう。

また、以下のfilter文は必ずSPARQLクエリ内に入れてください。

```
filter(?lat < LAT_MAX && ?lat > LAT_MIN && ?lng < LNG_MAX && ?lng > LNG_MIN)
```
※ SPARQLエンドポイントによっては、以下のfilter文を入れるとトイレ情報が取得できなくなる場合があります。何も表示されない場合は、filter文を削除してみてください。

`?img` `?common` `?man` `?woman` `?babybed` `?handicapped` は、なくてもアプリの動作には支障ありませんが、あると該当トイレの個数などが表示できますので、もしSPARQLエンドポイントにこれらの情報があるのであれば、あわせて出すようにしてみるといいかもしれません。

# 動作確認

編集した `index.html` をブラウザで開いてみましょう。
正しくSPARQLエンドポイント、クエリが指定されていれば、自分の町のトイレコンシェルが動いているはずです。
PHPで文字列の指定した位置に文字列を挿入する方法

# PHPで文字列を挿入する
PHPの場合、文字列の挿入は簡単に行うことができます。
今回はその方法を4つのパターンに分けて解説します。


## 1バイト文字のみの場合
1バイト文字のみの場合はsubstr_replaceを使うことで文字の挿入ができます。
[PHPマニュアル：substr_replace](http://php.net/manual/ja/function.substr-replace.php)

```php:1バイト文字のみの場合
function insertStr1($text, $insert, $num){
    return substr_replace($text, $insert, $num, 0);
}
//ab|Text|cdef
echo insertStr1('abcdef', '|Text|', 2);
```

## 2バイト文字を含む場合
2バイト文字を含んでいる場合は、substr_replaceを使うことができません。
そのため、preg_replaceを使います。
また、パターン修飾子とメタ文字を使うことによって位置を決定し、そこを置換することで挿入として機能させています。
[PHPマニュアル：preg_replace](http://php.net/manual/ja/function.preg-replace.php)
[PHPマニュアル：パターン修飾子](http://php.net/manual/ja/regexp.reference.meta.php)
[PHPマニュアル：メタ文字](http://php.net/manual/ja/regexp.reference.meta.php)

```php:2バイト文字を含む場合
function insertStr2($text, $insert, $num){
    return preg_replace("/^.{0,$num}+\K/us", $insert, $text);
}
//あいう|文字|えお 
echo insertStr2('あいうえお', '|文字|', 3);
```

## 指定した文字数毎に挿入（1バイト文字のみ）
指定した文字数毎に文字列を挿入したい場合は、wordwrapを使います。
[PHPマニュアル：wordwrap](http://php.net/manual/ja/function.wordwrap.php)

```php:指定した文字数毎に挿入（1バイト文字のみ）
function insertStr3($text, $insert, $num) {
	return wordwrap($text, $num, $insert, true);
}
//ABC|text|DEF|text|GHI|text|JKL|text|MN 
echo insertStr3('ABCDEFGHIJKLMN', '|text|', 3);
```

## 指定した文字数毎に挿入（2バイト文字を含む）
preg_replaceを工夫して用いることで、2バイト文字を含む文字列に対して指定した文字数毎に文字列を挿入することができます。

```php:指定した文字数毎に挿入（2バイト文字を含む）
function insertStr4($text, $insert, $num){
	$returnText = $text;
	$text_len = mb_strlen($text, "utf-8");
	$insert_len = mb_strlen($insert, "utf-8");
	for($i=0; ($i+1)*$num<$text_len; $i++) {
		$current_num = $num+$i*($insert_len+$num);
		$returnText = preg_replace("/^.{0,$current_num}+\K/us", $insert, $returnText);
	}
    return $returnText;
}
//あいう|文字|えおか|文字|きくけ|文字|こ
echo insertStr4('あいうえおかきくけこ', '|文字|', 3);
```
MacでCentOS7のBootableUSBを作成

# 準備するもの
- USBメモリ
- OSイメージ
- MacBook

# 手順
## 1. 事前準備
- デバイス名の確認

```text
$ diskutil list
/dev/disk4
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk4
   1:                 DOS_FAT_32 UNTITLED                15.9 GB    disk4s1
```

- デバイスの初期化

```text
$ diskutil eraseDisk MS-DOS UNTITLED /dev/disk4
Started erase on disk4
Unmounting disk
Creating the partition map
Waiting for the disks to reappear
Formatting disk4s2 as MS-DOS (FAT) with name UNTITLED
512 bytes per physical sector
/dev/rdisk4s2: 30522224 sectors in 1907639 FAT32 clusters (8192 bytes/cluster)
bps=512 spc=16 res=32 nft=2 mid=0xf8 spt=32 hds=255 hid=411648 drv=0x80 bsec=30552064 bspf=14904 rdcl=2 infs=1 bkbs=6
Mounting disk
Finished erase on disk4
```


## 2. ISOファイル書き込み
- アンマウント

```text
$ diskutil unmountDisk /dev/disk4
Unmount of all volumes on disk4 was successful
```

- 書き込み

```text
$ sudo dd if=./CentOS-7-x86_64-DVD-1511.iso of=/dev/disk4 bs=4028
```

## 3. 事後確認
- 取り外し

```text
$ diskutil eject /dev/disk4
Disk /dev/disk4 ejected
```

- エントリー確認

```text
$ diskutil list
# /dev/disk4が表示されていないことを確認
```
DynamoDBのitemを部分更新するメモ

DynamoDBの部分更新の方法がややこしかったことと、出来ることと出来ないことが分かったのでメモに残します。

※RubySDKの話です。

## 要件
* 既にitemが存在していなかったらitemを作成した上でデータを更新してほしい
* document要素内の配列の中の、指定したfood要素と同じ位にいるvalue要素を更新したい
* インクリメントにvalue要素を更新

~~~json:itemの中身サンプル
{
  "user": "doraemon",
  "date": "2016-03-02",
  "document": [
    {
      "food": "dorayaki",
      "value": 10
    },
    {
      "food": "apple",
      "value": 4
    }
  ]
}
~~~


## update_item関数
### パラメータ
* expression_attribute_names : 式に、予約語を利用したいときに定義するためのパラメータ
* update_expression : jsonデータを細かく編集するために定義する
* return_values : アップデートされた要素を返してくれるパラメータ
* return_consumed_capacity : スループットの定義を返してくれる？
* return_item_collection_metrics : itemのサイズを返してくれる？
* condition_expression : アップデートする上での条件を指定することができる
* expression_attribute_names : 要素名を変更するための代用トークン？
* expression_attribute_values : 要素の値を変更できる
* attribute_updates : 下位互換用のパラメータ。これを使うならupdate_expressionを使用することが推奨されている
* expected : 下位互換用のパラメータ。これを使うならcondition_expressionを使用することが推奨されている
* conditional_operator : 下位互換用のパラメータ。これを使うならcondition_expressionを使用することが推奨されている

必要なパラメータは以下？

* expression_attribute_names
* update_expression

## update_expressionの使い方を見てみる
### ADD
属性が存在しないなら、指定された値を追加する。値が存在するならば、ADDの行動は属性のデータ型に依存する。
もし既存の属性が数であり、値が数でもあるならば、値は既存の属性に数学的に追加される。もし値がネガティブな数であるならば、それは既存の属性から取り去られる。もしアップデートの前で存在しないアイテムのための数値をインクリメントするか、またはデクリメントするために、あなたがADDを使用するならば、DynamoDBは初期の値として0を使う。

より詳しい説明は[こちら](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.Modifying.html)に載っている。

## 色々試してみてわかった知見
* update_expressionで'SET'で定義した値は、使わないとエラーになる
* [予約語](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ReservedWords.html)は要確認！（item内で利用しているvalueは予約語となっているのでvalue要素内を使う場合はexpression_attribute_namesパラメータが必要）
* update_expressionは複数指定できそう
* SETでも数値属性を増減することができる
* ネストして要素を追加することはできなかった・・（２階層一気に追加する方法がわからない）
* update_expressionを二つ記述すると、最後に書いたパラメータのみが適用される（他は無視される）
RDFに関する雑な説明


オープンデータ界隈では、オープンデータの形式としてRDFがおすすめらしい。スキーマが定義されているとなおよいらしい。
いまいちRDFで調べても知りたいことがわからなかったので、自分が伝えたい順序で雑に整理しました。

# 基本

RDFは何かといわれると、有向グラフです。
S P Oの３つの値で有向グラフをつくります。

S: Subject
P: Predicate
O: Object

このSPOをステートメントと呼ぶらしいです。

![Kobito.SAKsrX.png](https://qiita-image-store.s3.amazonaws.com/0/5840/6f3bf5be-c803-eed7-4306-bd8c0acdf21a.png "Kobito.SAKsrX.png")

このSPOをたくさん集めてデータを構築します。SubjectはURIである必要があるらしいですが、正確なことは[RDF Primer](http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/rdf-primer.html)とかみればいいはずです。

# 具体例

RDFをつかって具体的にデータを構築してみます。
![Kobito.84kz8O.png](https://qiita-image-store.s3.amazonaws.com/0/5840/88290a5e-2860-68b3-bdbd-1cf3cafeb20f.png "Kobito.84kz8O.png")
上記のグラフはQiitaというウェブサービスの説明とその会員の情報を表現したRDFになります。
SPOのステートメントで表現すると以下のようになります。

```
http://qiita.com/ name Qiita
http://qiita.com/ description プログラミングを共有しよう
http://qiita.com/ user http://qiita.com/eielh
http://qiita.com/ user http://qiita.com/だれか
http://qiita.com/eielh name Himura Tomohiko
```

表現することができました。
仮にテーブル形式で表現するとこうなりますね。

ウェブサービスの情報テーブル
<table>
<tr>
  <td>name</td><td>description</td><td>user</td>
</tr>
<tr>
  <td>Qiita</td><td>プログラミング知識を共有しよう</td><td>[eielh](http://qiita.com/eielh)<br>誰か</td>
</tr>
</table>

ObjectにURIを使用することでデータをリンクさせることができています。RDFを使うとオープンリンクデータが作成できるわけです。
同じ属性をいれることで繰り返しも表現できています。
非常に柔軟なデータ構造であることがわかりました。

柔軟ですが、http://qiita.com/ どんな種類の情報で、属性をもっていて、どんな値を取り得るのか明確化されているとコンピュータで扱いやすくなります。user属性ならURIがはいっているなどです。
それが記述されているのがスキーマになります。


# 出力形式

RDFは有向グラフという概念なので物理的には、いろんな形式で出力できます。
ルールさえ決めればXMLやJSONにできそうですね。
すでにRDFXMLやJSON-LDがあります。

RDFはHTMLにも埋め込みができます。RDFaとかMicrodataがあります。
SEO系の話ででてくるものですね。

RSSも一部のバージョンはRDF形式になっているようです。

# RDFの解析

RDFはJSONに比べてプログラムで扱うには優しくないように思うはずです。JSONであればそのまま連想配列になります。RDFはそうもいかないのです。そこがあんまり耳にしない理由な気がしています。

リレーショナル・データベースからのデータ取得はSQLというクエリ言語をつかいます。XMLにはXQueryというクエリ言語をつかいますね。(HTMLではjQueryというライブラリがありましたね)
RDF用のクエリ言語はSPARQLというのがあります。

SPARQLを私はまだあまり触ってまた機会があれば。

# まとめ

というわけで、RDFはなにものかというと以下の感じの理解をしています。

* RDFは有向グラフ
* RDFXML JSON-LDなど様々な形式で表現できる
* スキーマを定義することでよりコンピュータで有効利用しやすくなる
* データ同士をURIでリンクできる
* クエリ言語でデータを抽出できる

間違って理解しているところがあれば、ぜひぜひ指摘おねがいします。
【VBA】SparkLineの自動生成


# 0.はじめに
Excel2010から導入された `SparkLine` は、1セル上でデータの傾向を可視化して確認することが出来る機能。
非常に簡単かつ便利な機能であるが、設定をコピーして複製することができないので、複数行にわたって `SparkLine` を作成したい場合は非常に面倒。

そこで、`SparkLine` を複数行分作成する処理を自動化してみた。

なお、今回は汎用的なコード内容にはなっていません。

-

# 1.事前確認
今回は下記のようなデータを使用する。

![kobito.1456828501.801975.png](https://qiita-image-store.s3.amazonaws.com/0/33479/0cfaddd8-d8ec-68f0-4de9-27aca1b29908.png "kobito.1456828501.801975.png")

K列の2行目から26行目セルにそれぞれの行データの `SparkLine` が表示されるようにする。

# 2.ソースコード
＃コーディングのセンスがないのでご了承ください。。。

````コード
Sub sparkline()
    
    '変数
    Dim cnt, a1, a2
    
    'Main
    For cnt = 3 To 26
        a1 = "K" & cnt
        a2 = "B" & cnt & ":" & "J" & cnt
        
        Range(a1).SparklineGroups.Add Type:=xlSparkLine, SourceData:=a2
    Next cnt
    
End Sub
````

# 3.実行結果
＜実行前＞
![kobito.1456828757.354439.png](https://qiita-image-store.s3.amazonaws.com/0/33479/e218ca27-8087-0195-85c2-6e8e009424bf.png "kobito.1456828757.354439.png")

↓

＜実行後＞
![kobito.1456828792.389664.png](https://qiita-image-store.s3.amazonaws.com/0/33479/c73d54e3-562a-6683-466c-fa7751a20fed.png "kobito.1456828792.389664.png")


★実際実行した様子
![2016-03-01 20_12_48.gif](https://qiita-image-store.s3.amazonaws.com/0/33479/58819f9b-6f00-53dc-0568-101cb375b68b.gif "2016-03-01 20_12_48.gif")
WindowsでのWebアプリ開発に使用しているツール群

PCお引越しのために自分用の備忘録としてメモ。

## IDE/エディタ
- Eclipse
- Intellij IDEA
- Atom
- GVim
- Visual Studio Code 

## コンソール
- Cmder

## データベース接続
- PostgreSQL Studio
- Workbench

## ssh接続
- PuTTY
- SuperPuTTY
- Cmder

## 開発プラットフォーム
- Ruby
- Java
- Node.js

## パッケージ管理
- nodist
- npm

## ソース管理
- Git

## キーバインド変更
- KeySwap
- YAMY

## ランチャー
- Wox

## その他
- MacType
VMwareでの時刻同期方法

#VMwareToolsをlinuxにインストールする
VMwareではntpで時刻あわせしても時間のずれが大きいのでうまくいかない事があった。
その際にVMwareToolで時刻あわせすると解決するとわかったのでVMwareToolを入れる。

#VMwareToolのインストール
仮想マシンを「vSphereClient」や「VMwareServer」などで選択し右クリック→ゲスト→を押すと
下記のような画面が出てくるのでインストールを選択する。
※インストールされるわけではないので注意が必要

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/2135dd87-07a8-1471-74d6-2163de330dd8.png)

ゲストOSに入り
`# mount /dev/cdrom /mnt/cdrom`
`# cp /mnt/cdrom/VMwareTools-9.10.5-2981885.tar.gz /usr/local/src/`
`# cd /usr/local/src/`
`# tar xvfz VMwareTools-9.10.5-2981885.tar.gz`
`# cd vmware-tools-distrib/`
`# ./vmware-install.pl`

すると色々聞かれるので回答していく。（基本デフォルトで回答した）

インストール後再起動

#時刻同期の有効化
デフォルトでは時刻同期が有効になっていないので有効にする

####時刻同期を確認する
`# vmware-toolbox-cmd timesync status`
Disable または Enabledが表示される

####時刻同期を有効にする
`# vmware-toolbox-cmd timesync enable `
`# vmware-toolbox-cmd timesync status `
Enabled 

####時刻同期を無効にする
`# vmware-toolbox-cmd timesync disable `
`# vmware-toolbox-cmd timesync status `
Disable
ペイントブラシ > 画像を貼ってそのサイズにする > Ctrl+v / Ctrl+Shift+x [トリミング]

```txt:動作確認
ペイントブラシ on windows 7 pro
```

http://qiita.com/7of9/items/27eb1ea4b4cf8ff2069f#comment-4a5f08df11d58d65fb37
にていただいたコメントを今後の検索のためにこちらに再掲。

@yubaさん
> キャンバスの方を小さくしておくのではなく、ctrl+Vしてから［トリミング］をクリックするって手もあります。


1. Ctrl+v
2. Ctrl+Shift+x [トリミング]
unknown

#alt titleについて
##alt
alt属性は代替テキストと呼ばれ、画像を閲覧することができない環境でも、情報をテキストや音声で得ることが、出来るようにするための属性です。
 → alt属性はimgだけでなく、area、applet、inputに対しても付くようです。
##title
「title属性」はつけたものに対する説明（助言的情報）を書くのが正しい使い方のです。
#position: absolute;
https://hyper-text.org/archives/2014/08/position_absolute_center_layout.shtml
.ui-select-match but got '0'でハマった件

昔に入れたangular-ui-selectを触っていると

.ui-select-match but got '0'

なるエラーが発生しました

なんだこれ？json形式は正しいぞ・・・？

gitのissuesで情報を探してみるとバージョンアップしたら直るんじゃね？的な記事を発見！

最新の0.14.9に上げるとエラーがでなくなりました

どうやら0.14.3で修正されたみたいです

でもなんで急にこんなエラー出だしたのかな？angularjsでもバージョンアップしたかな？迫り来る時間に追われ微妙な疑問を残しこの件はこれにて終了。
rails 4.2.4 + mysql2 0.4.3を使う時のトラブル 


## 現象

* dbを生成しようとすると下記のようなエラーが発生する。
* database adapterとしてmysql2が指定されているが、gemがロードされてない。

```sh
% bin/rake db:setup

Specified 'mysql2' for database adapter, but the gem is not loaded. Add `gem 'mysql2'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord).

... snip ...
```

## 原因

* mysql2 adapter 0.4.3を使うためにはrails 4.2.5以上を使う必要がある。
* 最初はpostgresqlとrails 4.2.4を使っていてmariadbを試すためにmysql2でadapterを切り替えたがGemfileにてバージョン指定をしていなかったので、最新の0.4.3が設置されるようになりトラブルが発生した。

## 対応

* 対応方法には二つがあって一つ目はrails 4.2.4をそのまま維持しながら、mysql2 adapterのバージョンを 0.3.xバージョンに指定する。
* 二つ目はrailsのバージョンを4.2.5以上に上げる。
* 私は前者より後者を選んだ。

```sh
% vi Gemfile

gem 'rails', '4.2.5'

% bundle update
% bin/rake db:setup

-- enable_extension("plpgsql")
   -> 0.0010s
-- create_table("customers", {:force=>:cascade})
   -> 0.0560s
-- create_table("rewards", {:force=>:cascade})
   -> 0.0268s
-- initialize_schema_migrations_table()
   -> 0.0294s
-- enable_extension("plpgsql")
   -> 0.0008s
-- create_table("customers", {:force=>:cascade})
   -> 0.0074s
-- create_table("rewards", {:force=>:cascade})
   -> 0.0078s
-- initialize_schema_migrations_table()
   -> 0.0152s
```

## 参考

* rubygems.orgには何も書かれていなかった。runtime dependenciesのほうに書くべきだと思う。
* githubのissuesで検索して見つけました。
* https://github.com/brianmario/mysql2/issues/727
BootCampでRealTekインストールで止まったら

#一晩待ってみたけれど
Macbook AirにやっとWindows10を入れ終わって、BootCampのインストールが始まって、しかしこれが待てど暮らせど終わらない。

BootCampアシスタントからパーテーションを復元してWindows10を再インストールして……結局同じところで止まる。

オーディオなんかどうでもいいのだが、BootCampのコントロールパネルが使えないと不便でしょうがない。スライドパットの設定ができんやんけ！

#RealTeksetupをタスクキルしちゃう
RealTekオーディオインストールで固まった状況のあなた！
朗報です。
それ、タスクキルで続行できました。

具体的にはタスクマネージャーを立ち上げて、タスクを表示して「RealTeksetup」タスクをぶっ殺してあげます。

するとどうでしょう。それはまるで泥土に妨げられていた濁流が（以下略）
取り合えずこれでBootCampは入れられるのでした。

固まったので強制終了しちゃったあなた！
安心してください。Windowsサポートソフトウェアを取ってくれば、BootCampのインストールから再開できます。

#RealTekはあとから入れられる
Windowsサポートソフトウェアの、Bootcamp/driver/RealTekのsetupを実行しちゃっえばスルっと入っちゃいましたとサ。

#Windowsサポートソフトウェアはどうやって入手するの？
MacOSに戻って、BootCampアシスタントを起動して、以下からダウンロードできます。全部だとデカイんで、RealTekフォルダだけ持っていけば大丈夫。

![スクリーンショット 2016-03-02 15.24.45.png](https://qiita-image-store.s3.amazonaws.com/0/104780/bdab9a97-d436-e4e7-2654-660e694f0759.png)

もしBootCampコントロールパネルそのものをもう一度インストールしたい場合は、全部持っていってbootcampフォルダ内のsetupを実行すれば、RealTekの所でばっちり固まりますよ！

全部で2GB強くらいでしたかね。最近のUSBメモリならへーきへーきってサイズです。

そっからは上の手順でタスクキルして、と。

#実は私がハマったのは
上のスクリーンショットの「Windowsサポートソフトウェア」の入手方法でございました。アクションからかー。気付かなかったなー、と。

一人でも多くの方が、私のように二度も三度もWindows10を入れ直すという事がなくなりますように。あと戦争とかもなくなりますように。
ペイントブラシ > 起動 > [win]+r / pbrush[Enter]

```txt:動作確認
ペイントブラシ on Windows 7 pro
```

起動

1. [Win] + r
2. pbrush[Enter]

関連 http://qiita.com/7of9/items/27eb1ea4b4cf8ff2069f
MacでMP4の音量を正規化

## 目的
mp4動画の音量を正規化したい

## 環境と方法
Mac OS X - El Capitan
Homebrew

home-brewでaacgainをインストールしてコマンド発行するだけ
aacgainが古い1.8しか無いみたい、1.9が欲しい場合はビルドするか [ここ](http://projects.sappharad.com/mp3gain/) でダウンロード可能なようです。
個人的には1.8でいいかなーと....何も考えてません

## 実行
使っているオプション
* r : トラックゲイン
* c : データへの書き込み時確認なし
* p : 日付変更しない

使ってないオプション
* a : アルバムゲイン

89dBで統一されますー

```zsh
aacgain -r -c -p *.mp4
```

## 戻し方

```zsh
aacgain -u -c -p *.mp4
```
JokerScriptの会話フレームの変更の仕方

会話のフレームをデフォルトの状態から変更する．
<img width="1878" alt="会話フレーム.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/113504/85464e94-9673-061a-8c34-f54c12388183.jpeg">


1. JokerScriptのシーンに移動
2. ProjectビューのJOKER_GAME->Resources->novel->data->images->systemの中に新しい会話フレームの画像をインポートする
3. HierarchyビューのMessageFrameを選択
4. ImageコンポーネントのSourceImageがデフォルトではframeになっているため，ここを新しい画像に置き換える．
5. フレームのサイズを調整する．


さくっとできます．
ペイントブラシ > キャンパスサイズを小さくする > Ctrl+w / Tab / 10[Enter]

```txt:動作確認
ペイントブラシ on Windows 7 pro
```

ペイントブラシで画像を貼るとき、キャンバスサイズを貼る画像より小さくしておくことで貼った時に画像サイズに自動調整される。

キャンバスサイズを小さくする最短処理としては以下の手順

1. Ctrl+w
2. Tab
3. 10[Enter]

あとは
`4. Ctrl+v
で画像を貼ればいい。

上記手順1-3を繰り返すとキャンバスサイズは10%にどんどん縮小されていくので、新規作成時(Ctrl+N)時にすでに小さい場合はサイズ変更しなくていい。

--
以下を試そうとしていた。
http://qiita.com/uchiyu/items/e7578d270b757a484d41
[Chrome]かっこいいテーマを導入したのに履歴サムネイルが邪魔だ！とならないための方法

# 必要なもの
Google ウェブストアから以下のアプリをchromeに追加します。
[Stylish](https://chrome.google.com/webstore/detail/stylish/fjnbnpbmkenffdnngjfgmeleoegfcffe?hl=ja)
![スクリーンショット 2016-03-02 14.45.14.png](https://qiita-image-store.s3.amazonaws.com/0/111912/c20e97be-4cb6-90f8-43d7-a85a348b0d63.png)

# 方法
追加すると，chromeの右上にアプリのアイコンが表示されると思います。
新しいタブを開いた状態で，そのアイコンをクリック→一番下のWrite style for this URL:のところにあるリンクをクリック。
すると，こちらのようなページが表示されます。
![スクリーンショット 2016-03-02 15.09.52.png](https://qiita-image-store.s3.amazonaws.com/0/111912/38f2d75b-e128-ff23-36f2-af1212e47fa8.png)


「スタイルを編集」の下に適当な名前を入力し，コードの部分に以下のコードを記入して保存します。


```text
#most-visited {
	display: none;
}
```


以上です。
新しいタブを開いて，履歴サムネイルが消えていれば成功です。
Apacheでログローテート

# 例 ) 過去3日のログを残しあとは自然にローテート(削除)する。

```apache:/etc/logrotate.d/httpd
/var/log/httpd/*log {
    daily  [追記]
    rotate 3  [追記]
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /etc/init.d/httpd reload > /dev/null 2>/dev/null || true
    endscript
}
```

# この設定により
ログの肥大化を防ぎ、いちいちログを削除する手間が省ける。
travis-ciを使って、kinesisの擬似版kinesaliteのDockerイメージを作って公開してみよう！

## 目的

だんだんテンプレ化してきましたが本日も投稿です。

takezoeさんの記事、「[AWS上で動作するアプリケーションをいかにローカルで開発するか？](http://takezoe.hatenablog.com/entry/2016/02/12/090152)」に触発されて、
今度は、擬似的なkinesisのDocker Imageを作成できるか試してみることにしました！

## 成果物

* https://github.com/tripleW/docker-kinesalite
* https://hub.docker.com/r/triplew/kinesalite/

## 参考資料

* https://docs.travis-ci.com/user/docker/
* https://github.com/mhart/kinesalite
* http://dev.classmethod.jp/cloud/aws/kinesis-put-records-cli/
* http://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html

## 手順

### 1. GitHubでリポジトリを作成して、Dockerfileを用意する

https://github.com/tripleW/docker-kinesalite

```Dockerfile
FROM node

RUN npm install kinesalite

RUN mkdir -p /data

ADD kinesalite.js /

EXPOSE 4567

CMD ["node", "kinesalite"]
```

### 2. .travis.ymlを用意する

https://docs.travis-ci.com/user/docker/

上記を参考にして、.travis.ymlを実装しました。

```.travis.yml
sudo: required

language: node_js
node_js:
  - "4.1"

services:
  - docker

before_install:
  - docker build -t triplew/kinesalite ./

script:
  - docker login -e="$DOCKER_EMAIL" -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" 
  - docker push triplew/kinesalite
```

`docker push`については[前回](../../letusfly85/items/178db48e0710f8553bbc)と同様の手順でpushしました。

### 3. git pushをして、travis ciを走らせる

https://hub.docker.com/r/triplew/kinesalite/

今回もさくっと行けました＾＾


## 利用方法

### 実行環境

* Client ローカルのMacOS
* Server どこかのAWSとかどこかのGCPとか
* curl利用

### 1. docker runでコンテナを起動

```bash
docker run -d -p 4567:4567 triplew/kinesalite
```

### 2. nodeスクリプトでstreamを作成

```js
var AWS = require('aws-sdk')
AWS.config.loadFromPath('config.json');

var kinesis = new AWS.Kinesis({endpoint: 'http://localhost:4567'})

var params = {
    StreamName : "data",
    ShardCount : 2
}

kinesis.createStream(params, function(err, data) {
    if (err) {
        console.log(err, err.stack);
    } else {
        console.log(data);
    }
});
```

### 3. streamが作成できたかを確認

```js
var AWS = require('aws-sdk')
AWS.config.loadFromPath('config.json');

var kinesis = new AWS.Kinesis({endpoint: 'http://localhost:4567'})

var params = {
    StreamName : "data"
}

kinesis.describeStream(params, function(err, data) {
    if (err) {
        console.log(err, err.stack);
    } else {
        console.log(data);
    }
});
```

結果出力

```js
{ StreamDescription:
   { StreamName: 'data',
     StreamARN: 'arn:aws:kinesis:us-east-1:000000000000:stream/data',
     StreamStatus: 'ACTIVE',
     Shards: [ [Object], [Object] ],
     HasMoreShards: false,
     RetentionPeriodHours: 24 } }
```

### 4. nodeスクリプトでデータを登録

```js
var AWS = require('aws-sdk')
AWS.config.loadFromPath('config.json');

var kinesis = new AWS.Kinesis({endpoint: 'http://localhost:4567'})

var params = {
    StreamName : "data",
    PartitionKey: "partkey_1",
    Data: "hoge"
    }

kinesis.putRecord(params, function(err, data) {
    if (err) {
        console.log(err, err.stack);
    } else {
        console.log(data);
    }
});
```

結果出力

```js
{ ShardId: 'shardId-000000000000',
  SequenceNumber: '49559695658384854135094487428892798596209045909750677506' }
```


使えないこともなさそうな印象ですね！
Elixirとかscalaとかからもコールできるか試してみたいところですね＾＾

---

本日はここまでとなります。
勇者《エンジニア》が持つべきホスピタリティ

タイトルですが、勇者と書いてエンジニアと読みます。

## エンジニアとは勇者である

結城友奈は勇者である(通称ゆゆゆ)では、主人公たちが所属する部活動である勇者部において、勇者とは「人々のためになることを勇んで実施する」者を指し、日々部活でボランティア活動に勤しんでいます。そう、勇者とは、ソフトウェアエンジニアそのものです。OSSを開発している人は自発的に勇んで開発・ソースを公開している者ですし、そうじゃない開発者諸氏も、ユーザーのためになることを勇んで実施している者です。エンジニアは勇者なのです。

## 勇者部五箇条

ゆゆゆ作中には、勇者部五箇条という勇者部における心得が登場します。それがとても良いので紹介します。

### 1. なるべく諦めない

ポイントは「なるべく」です。絶対諦めないだとブラック一直線なので、なるべく、です。綺麗な設計をなるべく諦めない。綺麗なコーディングをなるべく諦めない。

### 2. 挨拶はきちんと

エンジニアにとってコミュニケーションは大事です。そしてコミュニケーションの基本は挨拶です。

### 3. よく寝て、よく食べる

精神を病んでしまうエンジニアは多いですが睡眠不足や睡眠のリズムの乱れなどは精神にとても影響を与えてしまいます。壊れない為にも、よく寝ましょう。同様に食事も精神・肉体ともにとても影響を及ぼします。よく食べましょう。(食べ過ぎに注意)

### 4. 悩んだら相談！

悩む位なら相談しましょう。チーム開発において大小様々な相談はとても重要です。

### 5. なせば、大抵なんとかなる

実際に作業を初めてしまえば意外になんとかなるものです。手を動かしてみましょう。もちろんこれもポイントは「大抵」です。うまくいかない時もありますが、悩んだら相談したり、よく寝て、よく食べたりしましょう。

### ホスピタリティ

勇者《エンジニア》にとってホスピタリティは重要です。

#### 例1: ウェブフォームにおけるホスピタリティ

* パスワードは、半角英数字・記号で無限数文字を入力できるようにする
* 秘密の質問はただの脆弱な抜け道なので絶対に採用しない
* 大抵のサービスの場合、姓・名を分割する必要はないので分割しない
* 名前の読みはひらがなでもカタカナでも両方受け付けるようにする(表示上は変換しなくてすむひらがなを推奨する)
* 郵便番号は、ハイフンを付けてもつけなくても受け付ける (ハイフンを無視するだけで良い)
* 住所入力は欄を一つにする
* 電話番号は、ハイフンありなし国番号をつける・つけないなどをJSで吸収する
* クレジット会社選択は馬鹿っぽいので番号から算出する
* クレジット番号入力フォームは、4桁ごとに区切って見やすくする (ユーザーには一つのフォームであること)

ユーザーに不便を強いることを当たり前と思わないでください。バリデーション・正規化はJSでできます。なるべく諦めずにユーザー第一のインターフェースを作成しましょう。

#### 例2: 設計やコーディングにおけるホスピタリティ

* ユーザー・顧客に応じたドメイン言語を作成する
* 一にも二にもわかりやすく一意的なネーミングを心がける
* コミットは小さい単位にする。メンバーレビューの負荷を下げる
* 人間が努力しなくてもいい開発環境を整えておく
  - 例: コードフォーマット、CI、開発用Dockerfileなど
* 運用者が努力しなくてもいい設計にする

## 最後に

* 勇者《エンジニア》はホスピタリティが重要です
* [結城友奈は勇者である [第1話無料] - ニコニコチャンネル:アニメ](http://ch.nicovideo.jp/yuyuyu_tv)
* [Amazon.co.jp: 結城友奈は勇者である](http://www.amazon.co.jp/s/ref=sr_nr_p_n_srvg_2374648051_1?fst=as%3Aoff&rh=n%3A561958%2Cn%3A562020%2Ck%3A%E7%B5%90%E5%9F%8E%E5%8F%8B%E5%A5%88%E3%81%AF%E5%8B%87%E8%80%85%E3%81%A7%E3%81%82%E3%82%8B%2Cp_n_srvg_2374648051%3A622812011%2Cp_76%3A2227292051&keywords=%E7%B5%90%E5%9F%8E%E5%8F%8B%E5%A5%88%E3%81%AF%E5%8B%87%E8%80%85%E3%81%A7%E3%81%82%E3%82%8B&ie=UTF8&qid=1456893462)
* 心が前向きになれるとても良いアニメです (一挙見をオススメ)

### 勇者《エンジニア》を悪用しようとする人達へ

彼らが自発的に勇んで開発をするからと言って、それを悪用する、たとえばブラック労働を強いる、精神に極端な負担を与えつづけると、勇者は
壁の外にある
労基署に駆け込んだりする事もあるので絶対やめましょう。
postgreSQLが開発環境にあるとき知っておきたい最低限のコマンドメモ

####psqlのデータベース一覧
```bash
psql -l #ログイン後に "\l" とだけうってもいい
```

####接続
```bash
psql -d db_name
# または
psql -h hostname -U username -U db_name
```

###以後ログイン済みである前提
####テーブル一覧を見る
```bash
\dt
```

####テーブルの定義を見る
```bash
\d table_name;
```

####selectしてみる

```bash
select * from logs;
```

####updateしてみる
```bash
update logs set data1 = 'change' where id = 1;
```

####deleteしてみる

```bash
delete from logs where id = 1;
```

####DB変えてみる
```bash
\c new_db
```

###権限確認

####ユーザー一覧
```
\du
```
####ユーザーの追加
```
CREATE ROLE postgres WITH SUPERUSER;
```

####ユーザーの変更
```
ALTER ROLE postgres WITH LOGIN;
```

####データベースのオーナー変更
```
ALTER DATABASE dbname OWNER TO new_owner;
```

####テーブルのオーナー変更
```
ALTER TABLE table_name OWNER TO new_owner;
```
Raspberry Pi 初期設定(Raspbian Stretch)

# **Raspberry Pi 起動用のMicroSDカード作成方法**

2018/11/21: 最新版(2018-11-13-raspbian-stretch-lite.img)修正
2018/10/16: (2018-10-09-raspbian-stretch-lite.img)修正
2018/10/01: Raspberry Pi 3 B+ にて動作確認と最新版の修正

## 準備する機器
- Raspberry Pi本体と電源
- MicroSDカード（速度Class10、容量4GB以上を推奨）
- MicroSDカードの読み書き出来るデバイス(PC内蔵もしくはUSB変換機器など)
- USBキーボード
- HDMI接続モニター
- インターネットへ接続出来るWindowsのパソコン

## イメージファイルを公式サイトからダウンロードします。
https://www.raspberrypi.org/downloads/
**NOOBS** Raspbianが含まれていてオフラインでもインストール出来る。
　またネットワークインストールにも対応していて他のOSも選択できる。
**NOOBS LITE** ネットワークインストールのみ
**RASPBIAN STRETCH** Debian Stretch ベースのデスクトップ環境が全部入り。
**RASPBIAN STRETCH LITE** センサーやサーバー用途はライト版で事足ります。

ここでは、作業時間が短いイメージの直接書き込みを選択します。
ダウンロードしたzipファイルを解凍します。
## イメージファイルのMicroSDカードへの書き込み
1. [Win32 Disk Imager](http://osdn.jp/projects/sfnet_win32diskimager/)をセットアップします。
2. 書き込みできるように、MicroSDカードをパソコンに接続します。
3. セットアップしたWin32 Disk Imagerを起動します。
4. ソフトの起動前にMicroSDカードを接続した場合、認識出来ない事があります。
5. Image fileの欄に解凍したRaspbianのイメージファイル( 2018-11-13-raspbian-stretch-lite.img )を指定します。
6. Deviceの欄にMicroSDカードのドライブ番号を指定します。
7. Writeボタンを押すとイメージファイルの書き込みが実行されます。
8. 処理が完了したら、Win32 Disk ImagerをExitボタンで終了させて、MicroSDカードを安全に取り外します。

## 初期設定
1.Raspberry Pi にMicroSDカードをセットします。
2.Raspberry Pi にUSBキーボードとHDMIモニターを接続します。
3.Raspberry Pi のLANポートへケーブルをHUBから接続してインターネット接続出来る様にします。
4.パソコンのLANポートへケーブルをHUBから接続してインターネット接続出来る様にします。
5.Raspberry Pi のUSB電源へ接続して起動します。
6.HDMIモニターにログインプロンプトが表示されたら、ユーザー名がpi、パスワードがraspberryでログインします。
7.ログインメッセージに、初期設定のコマンドが表示されていますので実行します。
　`sudo raspi-config`
8.様々な設定が出来ますが、以下の設定を推奨します。

> 1 Change User Password (パスワード変更)
> 2 Network options (ネットワーク設定)
>   N1 Hostname (ホスト名設定)
>   N2 Wi-Fi (WiFi設定)
>     JP Japan
> 4 Localisation Options (地域設定)
>   I1 Change Locale (文字コード)
>     [*] ja_JP.UTF-8 UTF-8
>   I2 Change Timezone (タイムゾーン)
>     Asia-Tokyo
> 5 Interfacing Options (各サービスの有効化)
>   P2 SSH (SSHサービスの有効化)

　　設定変更を実行すると再起動します。
9．OSを最新版に更新します。
　`sudo apt-get update		（リポジトリの更新）`
　`sudo apt-get upgrade	（パッケージの更新）`
10.ファームウェアの更新
　`sudo rpi-update`
11．更新を反映するため、再起動します。
　`sudo reboot`
　ファームウェア更新前
　`uname -a`
　`Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux`
　ファームウェア更新後
　`uname -a`
　`Linux raspberrypi 4.14.81-v7+ #1163 SMP Thu Nov 15 17:16:30 GMT 2018 armv7l GNU/Linux`
12．IPアドレスを固定したい場合
　以前は以下のファイルを編集しましたが、
　`/etc/network/interfaces`
　Jessieからはdhcpクライアント設定ファイルに設定します。

```lang:/etc/dhcpcd.conf
interface eth0
static ip_address=192.168.0.2/24
static routers=192.168.0.1
static domain_name_servers=8.8.8.8
```

　書式も違うので注意します。
サクッとUbuntuサーバーの初期設定をする

VPSとか借りて、最低限の初期設定をサクッと済ますためのエントリー。

# 作業ユーザーを作成する

```
adduser username
```

# 作業ユーザーにsudo権限を付与する

```
sudo gpasswd -a username sudo
```

# SSHポートの変更とrootログインの禁止

```
vi /etc/ssh/sshd_config

Port 22 # イイ感じの数字に変える
PermitRootLogin yes # yesをnoにする

sudo service ssh restart
```

# ポートをイイ感じに設定する

```
sudo ufw enable # ufwを立ち上げる
sudo ufw default DENY # 全ポート遮断する
sudo ufw allow 00 # ポート開ける(最低でもsshだけは開ける)
sudo ufw reload # リロードする
sudo ufw status # 開いてるポートを確認する
```

# LAMP周りをイイ感じにする

```
sudo apt-get update
sudo apt-get install apache2
sudo apt-get install php
sudo apt-get install mysql-server
```

Apacheの設定ファイルは `/etc/apache2` に格納されているので、イイ感じにイジる。

# 鍵認証
ちゃんと使うときは鍵認証を導入すると良いと思う。
Web Storageの使用

HTML5ではlocalStorageという配列（オブジェクト）にデータを保存できる。保存はブラウザ単位に行われる。
sessionStorageという配列も同様だが、こちらは、ブラウザを閉じたときにデータは消える。 

##HTMLの例
```html
<input type="text" id="input">
<input type="button" value="保存" id="save">
<input type="button" value="読み込み" id="load">`
```
##スクリプトの例
```js
$(function(){
	$("#save").click(function(){
		var str = $("#input").val();
		localStorage["test"] = str;
	});

	$("#load").click(function(){
	 	var str = localStorage["test"];
		$("#input").val(str);
	});
});
```

##メソッド

|機能|メソッド|
|:--|:--|
|保存|	setItem(key,value)|
|取得|	getItem(key)|
|削除|	removeItem(key)|
|クリア|	clear()|


##補足：保存に便利な JSON.stringify　と JSON.parse
WebStorageでは、一つのキーに一つしかデータを保存できず、配列の表現も難しい。このため、オブジェクトを文字列化し、保存すると便利である。

JSONデータを文字列化するJSON.stringify
例：

```js
	var obj = {sname:"りんご",tanka:100};
	alert( JSON.stringify(obj) );
```

文字列化したJSONデータをオブジェトにするJSON.parse
例：

```js
	var str = '{"sname":"りんご","tanka":100}';
	var obj = JSON.parse(str);
	alert( obj.sname ); 
```
HTML5の新機能メモ

#HTML5
## １．HTML5の新しいタグ

```html
<!DOCTYPE html>  文書型宣言
<meta charset="UTF-8"> 文字コード指定
```

###セクショニング
```html
<header> ヘッダ
<footer>  フッタ
<nav>   ナビゲーション
<article> 記事
<section>   章
<aside>   補足
```

###フォーム

```html
<input type="email" > メールアドレス入力
<input type="url" > URL入力
<input type="number" > 数字入力
<input type="search" > 検索入力
<input type="date" > 日付入力
<input type="range" > 範囲入力
<input type="color" > 色入力
```

###属性：
required    必須
max,mix   最大値、最小値（数字や範囲で）
placeholder 初期文字列
autofocus 最初にカーソル

##２．CSS3

###ウェブフォント
Google Web Fonts
http://www.google.com/webfonts

###角が丸いボックス
```css
border-radius: 10px;
```
###テキストに影を作る
```css
text-shadow: 水平 垂直 ぼかし 色;
例：text-shadow: 1px 1px 2px gray;
```
###ボックスに影を作る
```css
box-shadow: 1px 1px 2px black;
```
###透過色
```css
opacity:透明度（0～1.0）
例：opacity: 0.7;
```
または色を指定するとき：rgba(R,G,B,透明度)
例：background-color: rgba(255,255,255,0.7);
 
###グラデーション
background-imageまたはbackgroundを指定するとき：
linear-gradient(開始位置,開始色,終了色);

注：現在はベンダープリフィックスを付ける必要がある。
chrome/safariの場合　-webkit-linear-gradient
FireFoxの場合    -moz-linear-gradient

例：
```css
background:-webkit-linear-gradient(top,yellow,white);
```
###移動・変形
例：移動　横30px、縦20px
```css
-webkit-transform: translate(30px,20px);
```
例：拡大・縮小　1.2
```css
-webkit-transform: scale(1.2);
```
例：回転　45度
```css
-webkit-transform: rotate(45deg);
```
例：傾き　45度
```css
-webkit-transform: skewX(-45deg);
```
###時間経過
例：背景色変更時　1秒で
```css
-webkit-transition: background-color 1s linear;
```
注：変更される前に指定しておく。

例：画像の上にマウスを載せると45度回転

```css
img {
　　-webkit-transition: -webkit-transform 1s linear;
}
img:hover {
　　-webkit-transform: rotate(45deg);
}
```
vagrant、ansibleでgoの開発環境を構築してみた（所要時間：15分）

# 概要
当ページの目的は、ローカルPCを汚さずに仮想環境上でgo言語の開発環境を構築する手順となります。

# 前提
- Mac OS X Yosemite/El Capitan‎
- vagrant 1.8系がインストールされていること（[こちらからインストール](https://www.virtualbox.org/wiki/Downloads)
） 筆者の場合、Vagrant 1.8.5
- ansible 2系がインストールされていること（[こちらからインストール](http://docs.ansible.com/ansible/intro_installation.html)
） 筆者の場合、ansible 2.1.0.0

# 手順
１. terminalを起動する。
２. githubから以下をクローンする。

```
$ git clone git@github.com:luckyriver0/vagrant.git
```

３. Vagrantfileのあるディレクトリに移動する。

```
$ cd vagrant/golang/vagrant
```  
４. vagrantを起動する。

```
$ vagrant up
```

５. 起動がおわったら、vagrantへsshする。

```
$ vagrant ssh
```

６. goの環境は入っていることを確認する。 

```
[vagrant@develop ~]$ go version
go version go1.6 linux/amd64
```


 試しに簡単なプログラムを作成し、実行する

```
[vagrant@develop ~]$ cd ~/go/src
[vagrant@develop src]$ vim main.go
```

```lang:main.go
package main

import  "fmt"

func main() {
        fmt.Println("Hello Go!")
}
```

実行してみる。

```
[vagrant@develop src]$ go run main.go
Hello Go!
```
Hello Go!とでれば成功です！
alpineベースでpythonをdocker build

# はじめに
python3.5を想定しています。

# alpineでpythonを使いたい
[公式にあります](https://hub.docker.com/r/library/python/tags/)。
下記のようにすればOK。(90MB)

    docker run -it python:3.5-alpine

# alpineでpythonのnumpyを使いたい
- 2.7なら[testingにあります](https://pkgs.alpinelinux.org/packages?name=py-numpy&repo=testing&arch=all&maintainer=all)。
- 3.5でも、[こちら](https://github.com/catholabs/docker-alpine)をベースに頑張るの手もあります。
- もっといい方法があります。alpineでglibcを使えるようにした[frolvlad/alpine-glibc](https://hub.docker.com/r/frolvlad/alpine-glibc/)を使うと、minicondaが使えます。

下記のDockerfileでイメージを作ると、136MBですが、"conda install numpy scipy"でnumpyもscipyも簡単にインストールできます。

```:Dockerfile
FROM frolvlad/alpine-glibc

ENV PATH=/opt/conda/bin:$PATH \
    LANG=C.UTF-8 \
    MINICONDA=Miniconda3-latest-Linux-x86_64.sh
RUN apk add --no-cache bash wget && \
    wget -q --no-check-certificate https://repo.continuum.io/miniconda/$MINICONDA && \
    bash /Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda && \
    ln -s /opt/conda/bin/* /usr/local/bin/ && \
    rm -rf /root/.[acpw]* /$MINICONDA /opt/conda/pkgs/*
CMD ["bash"]
```

科学技術計算用に[tsutomu7/alpine-python](https://hub.docker.com/r/tsutomu7/alpine-python/)をつくりました。(782MB)

Kitematicでしたら、"tsutomu7/alpine-python:jupyter" ならクリックで使えて便利です。

以上
swfファイルを更新してもIE上で反映されない場合の対処法

Flex3アプリケーションの更新作業を行ったところ、
なぜか配置しても画面が更新されない

IISの再起動とかPCの再起動とかキャッシュの削除とかいろいろやったんだけどダメ

IEでしか使わない状況だったけど、念のためChromeで確認してみたところ、
ちゃんと更新されたデザインが適用されている

ってことでファイルの更新場所を間違えているわけでもなさそう

最終的には以下の方法で解決

```
①IEのインターネットオプションを開く
②閲覧の履歴 - 削除ボタンクリック
③インターネット一時ファイルにチェックを付けて削除実行
```

![option.png](https://qiita-image-store.s3.amazonaws.com/0/70195/d4b9ecbc-5ecb-7eb4-156b-5a41c791db6f.png)

説明にある「メディアのコピー」に該当するのかな。
該当ファイルの日付が更新されていてもダメみたい。

お客様が自力で解決してくれて助かりましたー
CircleCIで、Pull Requestのビルドを「masterにためしにマージして」やる

Circle CIでは、「Pull Requestをマージ前に動作確認をする」といったことは自分でconfigにかいてあげないとできません。
（参考→[TravisCIとCircleCIでちょっとずつ違うビルド環境の考え方の違い](http://packsaddle.org/articles/differences-between-travis-ci-and-circle-ci/)）

そこで、`Pre-dependency commands`に

```bash:マージ
git checkout origin/master
git merge origin/$CIRCLECI_BRANCH
git submodule init && git submodule update
```

って書けばいいや、とおもったら、そうはいかなかったのでメモ。

なぜかコンフリクトが起きます。
SSHで入って、手でGitリポジトリから取得して↑を打つとコンフリクトは起きません。
CircleCIがcloneしたリポジトリは、単純なcloneではないようです。

いろいろ試したんですが、とりあえず結論だけ。

```bash:むりやり回避
git clone git@github.com/crowdworks/hoge_project -b $CIRCLECI_BRANCH
rm -rf .git
mv hoge_project/.git .git

git checkout origin/master
git merge origin/$CIRCLECI_BRANCH
git submodule init && git submodule update
```

のように、gitファイルをむりやり書き換えてやれば、マージができるようになりました。
jquery tree pluginの調査

# 調査要求
* 2段階のtreeを表示できること
* 第一段階のサブ内容を表示/非表示できること
* スマホでも利用できること: iOS safari, Android: chrome
* bootstrap風が一番よい、windows風がよい

   
# ざっくり調査
* jquery pluginでtreeで検索して、表示される[ランク](https://plugins.jquery.com/page/1/?s=tree)
* [20+ jQuery Treeview Plugin & jQuery Tree with Example](http://www.jqueryrain.com/demo/jquery-treeview/)

### jquery library, google, stackoverflowで検索結果
![tree-search.png](https://qiita-image-store.s3.amazonaws.com/0/13451/f89d7699-7ae5-3fc7-5416-c5c1fc588d11.png)


# 評価

|jquery plugin|jquery plugin のランク(treeで検索結果)|ライセンス|API|デザイン|PC操作|スマホ操作|評価|補足|
|:------------|:------------|:------------|:------------|:------------|:------------|:------------|:------------|:------------|
|[jstree](https://www.jstree.com/)|+7|+2(MIT license)|+2|+2(windows風)|+2|+2|1位:17|--|
|[fancytree](https://github.com/mar10/fancytree)|+6|+2(MIT license)|+2|+3|+2|+1|2位:16)|--|
|[jqtree](http://mbraak.github.io/jqTree)|+4|+2(Apache2.0)|+4|+1|+2|+1|A(3位:14)|--|
|[bootstrap tree view](https://github.com/jonmiles/bootstrap-treeview)|+1|+1(Apache2.0)|+2|+3|+2|+2|4位:11|--|
|[jquery treetable](https://github.com/ludo/jquery-treetable)|+3|+1(GPLv2,MIT)|+1|+2|+2|+1|5位:10|--|
|[treegrid jquery](http://maxazan.github.io/jquery-treegrid/)|+2|0(不明)|+1|+2|+2|+1|6位:8|--|
|[treeview jquery](https://github.com/jzaefferer/jquery-treeview)|-|-(MIT)|-|-|-|-|7位|Note that this project is not actively maintained anymore|

### その他
* Mobiscroll Treelist Scroller - 有料
* zTree.v3
* aciTree

### 評価基準の説明
* ざっくり調査のランク結果
    * +7, +6, +5, +4, +3, +2, +1, 0, 0......
* ライセンス
    * 厳しくない: +2
    * 厳しい：0
* API
    * 豊富：+4
    * 理解やすい(current node)：+2
    * 理解やすい：+1
    * なし：0
* デザイン
    * bootstrap: +3
    * よいwindows風： +2
    * よい： +1
    * よくない： 0
* PC操作
    * とても良い： +2
    * 操作しやすい：+1
    * 操作しにくい：0
* スマホ操作
    * とても良い： +3
    * 操作しやすい：+1
    * 操作しにくい：0
* 評価
    * (n位:得分)


# 結果
* UIと実装よい： fancytree(bootstrap対応可)
* 実装よい： jstree
* UIよい：bootstrap view
ES6(esnext/es2015)をbabelでコンパイルした時にSymbol is not definedになった場合の対処法

ES2015のfor ... ofループをbabelでコンパイルすると Symbol.Iteratorになるのですが
古いnode.jsのバージョンやIEでは対応してないのでエラーになります。

その場合はbabel-polyfillを使うことで対処できます。

```
$ npm install babel-polyfill
```

```:index.js
require("babel-polyfill"); // or import "babel-polyfill";
```
企業がライブラリ公開しよう ( ﾟдﾟ)ﾊｯ! と思い立った時にすること

#アカウント作成

##ソースコード管理
###[GitHub](https://github.com/)
ソース管理についてはおそらくこれ１択だと思います。
[Bitbuket](https://bitbucket.org/)とかでもできますが
Bitbucketは公開指定にするとお金がかかるし、
他のリポジトリだと特定の言語を除き、そんなの知らんがなって言われかねないからです。

##CI - 継続的インテグレーション
###[travis CI](https://travis-ci.org/)
オープンソースは無料でいろいろな開発言語に対応しているので、
とりあえず汎用的なCIサービスをお安く使いたいなら
ここでいいかと思います。
複数環境ビルドとかもできるので、
バージョン別にテストしたい時なんかにもいいです。

###[Circle CI](https://circleci.com/)
こちらもオープンソースは無料のはず。
GitHub Enterpriseとかと連携できるので使う人も多いはず...
まぁ、GitHubでオープンソースで公開する場合は関係ないか。
使い勝手はTravis CIよりもよさ気ではありますが、
複数環境ビルドはできないのでそこだけは注意です。
（最近使ってないからできるようになってたらごめんなさい）

###[Bitrise](https://www.bitrise.io/)
iOS、Android、Xamarinのライブラリだけでいいならここがよさそうです。
特化型だけあってかなり細かくいろいろなことができそうです。
あと、Macならterminalからゴニョゴニョできるのも良さげです。
（ここ、記事とサイト見ただけで使ってないです...）

##テストカバレッジ
###[Coveralls](https://coveralls.io/)
GitHubのソースコードのテストカバレッジはとりあえずここでいいとおもいます。
実は他の所使ったことないだけです。

##バージョン管理
###[npm](https://www.npmjs.com/)
javascript(node.js)のバージョン管理

###[Packagist](https://packagist.org/)
PHPのバージョン管理

###[Rubygem](https://rubygems.org)
rubyのバージョン管理

###[gopkg.in](http://gopkg.in/)
Goパッケージのプロキシ。
正確にはバージョン管理ではないんだけど一応紹介。
githubにあげると自動的に認識してくれる。
例： http://gopkg.in/usk81/holster.v2

#ライセンス

##ライセンスを決める
MITとかApacheとかBSDとかGNUとかいろいろあるので、
会社のポリシーにあったものを使いましょう。
... Apacheライセンスって本当は勝手に使えないんじゃないっけ？
... まぁいいか

##ライセンス文を書く
ライセンスを決めたら、公開するときはこれ使ってね用に
ライセンス文を作って社内で共有しましょう。
GitHubにはリポジトリ作成時に一般的なライセンスなら文作ってくれる機能がありますが、
オリジナルとかだったら作る必要があります。
ただユーザがいい顔しないので一般的なライセンスをおすすめします。
電子工作 > Link > オシロスコープ > 10:1プローブ > 動画概要 > 回路説明 | プローブ補償 | 1kHz方形波の使用理由 | 高周波数用プローブの低周波用測定での誤使用 | 入力コンデンサ


http://www.marutsu.co.jp/contents/shop/marutsu/mame/138.html

> 一般的にはオシロスコープ自身の「入力インピーダンス」は1MΩです。			
しかし、インピーダンスの高い回路の観測にはオシロスコープの入力インピーダンスが高いことが望まれます。（図8）	

> そこで、このような場合に「オシロスコープの入力インピーダンスを高くする」目的で減衰機能のあるプローブを用います。


[#206: Importance of 10X Probe Compensation with your Oscilloscope](https://www.youtube.com/watch?v=oxJQr4dKnys)
最近のマイブーム w2aewさんの動画
まだところどころ分からない.

- 回路の説明
  - 周波数が高くなるにつれてコンデンサ成分が効いてくる
- プローブ補償の方法
  - 1kHz 方形波がよく使われる
- 方形波を使う理由
  - 異なる周波数成分の補償になる
  - (推測) フリーエ変換した時にsineとcosineの高調波成分までを含めるからのようだ
- 高い周波数用のプローブは低い周波数測定に向いていない
  - 入力コンデンサ成分が影響するようだ
- 入力コンデンサが合っていないプローブの使用例 (10:40頃)
  - 補償しきれない
  - 取説の compensation range を確認すること
Mac Python import MySQLdbを読み込ませる

import MySQLdb
をするとエラーが出て読み込めない方への解決策。

手順は３つ+αです。

（１）MySQL-python を以下のURLからインストールする。
http://sourceforge.net/projects/mysql-python/
からダウンロードし適当なところに置きダブルクリック等で展開してください。

（２）次にsite.cfgを編集します。
以下の1行を「site.cfg」に追加してください。

追加する内容は、
```$ which mysql_config```
/usr/local/bin/mysql_config
↑これです。
mysql_config = /usr/local/bin/mysql_config

（３）コンソールより次のコマンドをタイプし「ビルド＆インストール」

```
$ python setup.py build
$ sudo python setup.py install
```

別のウィンドウから再度、「import MySQLdb」を読み込む。

```
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.macosx-10.5-x86_64/egg/MySQLdb/__init__.py", line 19, in <module>
  File "build/bdist.macosx-10.5-x86_64/egg/_mysql.py", line 7, in <module>
  File "build/bdist.macosx-10.5-x86_64/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/me/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so, 2): Library not loaded: libssl.1.0.0.dylib
  Referenced from: /Users/me/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so
  Reason: image not found
```
上記エラーが出た場合次のコマンドを実行します。

（+α）```
brew unlink openssl && brew link openssl --force
```

ターミナルからMySQLdbを読み込む。

![スクリーンショット 2016-03-02 12.34.22.png](https://qiita-image-store.s3.amazonaws.com/0/105887/679c32c5-b115-2c1f-9929-9468bd8efa24.png)

以上です。
python3: difference between "is" and "==", unexpected behavior with integers

今日は`==`と`is`の違いについてざっくりと。言葉で説明するよりまずは具体例を見せたほうが早いと思ったので以下を参照に。

```
>>> lst1 = [1,2,3]
>>> lst2 = [1,2,3]
>>> lst1 == lst2
True
>>> lst1 is lst2
False
>>> lst1 = lst2
>>> lst1 is lst2
True
```

#isと==の違い

簡単に言うと`==`は"value equality"（簡単にいえばぱっと見中身が同じかどうか）を確かめる。`is`は各オブジェクトのポインターの方向を示している。一言で言えば"reference equality"実際に<a href="http://www.pythontutor.com/visualize.html#code=lst1+%3D+%5B1,2,3%5D%0Alst2+%3D+%5B1,2,3%5D%0Alst1+%3D%3D+lst2%0Alst1+is+lst2%0Alst1+%3D+lst2%0Alst1+is+lst2%0A&mode=display&origin=opt-frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=3&rawInputLstJSON=%5B%5D&curInstr=0" target="_blank">pythontutor.com</a>で各オブジェクトの動きを見ると分かりやすいかもしれない。他の言語については分からないが（たしかCは同じだったと聞いた）少なくともpythonの世界では`lst1`と`lst2`は中身は同じでも違うオブジェクトとして認識される。そのため`is`判定を行うと`False`と出る。極端な説明をすれば`lst1`と`lst2`は各リストの出身地と考えてみてもいいかもしれない。

簡潔に言うと:

>_use `==` if you mean the objects should represent the same thing (most common usage) and `is` if you mean the objects should be in identical pieces of memory (you'd know if you needed the latter)._

```
>>> a = [1, 2, 3]
>>> b = a
>>> b is a 
True
>>> b == a
True
>>> b = a[:] # b(=a[:])とa([1,2,3])はis判定ではfalse
>>> b is a
False
>>> b == a
True
```

SOFを参考にこの考え方を少しだけ広げてみる。`int`でもこれは通じる:

```
>>> 1000 is 10**3
False
>>> 1000 == 10**3
True
```

そして`str`でも同じことが言える:

```
>>> "a" is "a"
True
>>> "aa" is "a" * 2
True
>>> x = "a"
>>> "aa" is x * 2
False
>>> "aa" is intern(x*2)
True
```

中でも特に興味深かったのがクラスを用いて比較した例:

```
>>> class foo(object):
       def __eq__(self, other):
           return True

>>> f = foo()
>>> f == None
True
>>> f is None
False
>>> f = None
>>> f is None
True
```

読んでみて「たしかに！」と気付かされました。一度感覚をつかめばちょっとした応用にも使えそう。

#isを使ってintを比較する際の注意点

どうやら`int`に対しては`is`は少し奇妙な振る舞いをするらしい。

```
>>> a = 500
>>> b = 500
>>> a == b
True
>>> a is b
False
```

と

```
>>> c = 200
>>> d = 200
>>> c == d
True
>>> c is d
True
```

を比較すると分かるかもしれないが、数に応じてpythonとやらが変わった振る舞いを行う用にできているらしい。これはpythonが`int`の-5から256までしかreference implementation(=`is`)に対応していないからだという。これがpythonのパフォーマンス向上の理由の一つなんだとか。

```
>>> for i in range(250, 260): a = i; print "%i: %s" % (i, a is int(str(i)));
... 
250: True
251: True
252: True
253: True
254: True
255: True
256: True
257: False
258: False
259: False
```

よって`is`を用いて`int`を扱うときは注意したほうが良さそうだ。ちなみにこれは`id(int)`でも調べることが可能。

#参考にしたリンク

- [What is the difference between “is” and “==” in python? [duplicate]](http://stackoverflow.com/questions/1634352/what-is-the-difference-between-is-and-in-python)
- [Python: what difference between 'is' and '=='? [duplicate]](http://stackoverflow.com/questions/21478442/python-what-difference-between-is-and)
- [Is there any difference between “foo is None” and “foo == None”?](http://stackoverflow.com/questions/26595/is-there-any-difference-between-foo-is-none-and-foo-none#comment4891454_26611)
- [Is there a difference between `==` and `is` in Python?](http://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python)
- [“is” operator behaves unexpectedly with integers](http://stackoverflow.com/questions/306313/is-operator-behaves-unexpectedly-with-integers)
alpineベースでrubyをdocker buildしてみた

# TL;DR
- aplineをベースにしてrubyをdocker buildをしてみた
- rubyはpackageからではなく独自compileしてbuild

# Dockerfile

```Dockerfile
FROM alpine

ENV HOME     /root

WORKDIR /tmp

# SETUP: package install
RUN apk add --no-cache --virtual .ruby-builddeps \
    autoconf \
    bison \
    bzip2 \
    bzip2-dev \
    ca-certificates \
    coreutils \
    curl \
    gcc \
    g++ \
    make \
    gdbm-dev \
    glib-dev \
    libc-dev \
    libedit-dev \
    libffi-dev \
    libxml2-dev \
    libxslt-dev \
    linux-headers \
    cyrus-sasl-dev \
    ncurses-dev \
    openssl-dev \
    procps \
    tcl-dev \
    yaml-dev \
    zlib-dev \
    tar \
    perl \
    python \
    py-pip \
    libmemcached-libs \
    mariadb mariadb-client mariadb-libs mariadb-dev

# SETUP: ruby & bundler
ENV RUBY_MAJOUR_VER  2.3
ENV RUBY_VERSION     2.3.0

RUN wget -q "http://cache.ruby-lang.org/pub/ruby/${RUBY_MAJOUR_VER}/ruby-${RUBY_VERSION}.tar.gz" -O ruby-${RUBY_VERSION}.tar.gz && \
    tar zxf ruby-${RUBY_VERSION}.tar.gz && \
    cd ruby-${RUBY_VERSION} && \
    ./configure --disable-install-doc --disable-install-rdoc && make && make install && \
    cd .. && \
    rm -rf /tmp/* && \
    echo "install: --no-document" > $HOME/.gemrc && \
    echo "update: --no-document" >> $HOME/.gemrc && \
    gem install bundler
```

- VIRTUAL SIZE : 773.3 MB


# package
- https://pkgs.alpinelinux.org/packages で検索できる
    - 部分一致で検索するには % のwildcard文字が必要
- CentOS,Ubuntuとは微妙にpackage名が異なるので注意
    - xxx-dev などになっている
- それなりに新しめversionのpackageになっている

# 独自compileしない場合

```Dockerfile
FROM alpine
RUN apk add --no-cache ruby ruby-bundler
```

- rubyのみをbuild
- rubyはversion2.2.4がbuildされます
    - https://pkgs.alpinelinux.org/package/main/x86_64/ruby
    
- VIRTUAL SIZE : 20.58 MB

# 感想
- 軽量なalpinelinuxをベースにしても、諸々組み込んでいくと、それなりのサイズのimageになってしまう
- もちろん不要なpackageを取り除いていけば小さくなる
Spark-shell起動時のエラー


macでspark-shell起動時にエラーSparkContextのinitializing errorが出る場合

エラーメッセージ

```bash
Can't assign requested address: Service 'sparkDriver' failed after 16 retries!
```

自分が見つけられてないので下記流す。

```bash
export  SPARK_MASTER_IP=127.0.0.1
export  SPARK_LOCAL_IP=127.0.0.1
spark-shell
```
ターミナル起動時に毎回流すのが面倒な場合は
.bash_profileとかに書いとくか、$SPARK_HOME/conf/spark-env.shに追記するとよい。

brewで入れた場合は

```bash
/usr/local/Cellar/apache-spark/1.6.0/libexec/conf
```
この辺にspark周りのファイルまとまってる。


とか書きつつ、brewでapache-sparkの1.6.0を入れた場合、SPARK_HOMEを設定するとpermission deniedとか怒られる模様。

issueは上がってる
https://github.com/Homebrew/homebrew/issues/48898#issuecomment-180633967

けどとりあえずどうにかしたい場合

```bash
unset SPARK_HOME && spark-shell
```