OmniAICreator/Qiita-1.07M huggingface dataset:
AWS EC2にTensorFlowを入れる（CPU only）

「Windowsしか持ってないけどTensorFlowを試したい」とか、そんな人向けです。

##前置き
ディープラーニングって膨大なマシンパワー使うんでしょ？と思われるかもしれませんが、最初のチュートリアルやるくらいなら全然マシンパワーは使いませんので、AWSの初回無料枠で使えるマシンで大丈夫です。
※[Deep MNIST for Experts](https://www.tensorflow.org/versions/r0.7/tutorials/mnist/pros/index.html)はキツイです。

##手順
###仮想マシン（EC2）の用意
Linuxマシンを作ります。
OSはとりあえずUbuntuで良いんじゃないでしょうか。私はUbuntu 14.04にしました。
インスタンスは無料枠対象のt2.microとかで良いと思います。
後々TensorBoard（学習状況を可視化するツール）を使う場合は、セキュリティの設定でポート6006を開けておいてください。（後からでも設定できます。）

###各種インストール
仮想マシンを起動してputty等でSSH接続します。
Pythonがプリインストールされていることを確認。

```
$ python -V
Python 2.7.6
```

追加のPython関係をインストール。

```
$ sudo apt-get update
$ sudo apt-get install python-pip python-dev
```

サイトによってはvirtualenvを使っているところもありますが、面倒だし環境を分けたければ新しいEC2マシンを作った方が手っ取り早いので（個人的な意見です）今回は入れません。
あとはTensorFlowを入れます。

```
(Ubuntu/Linux 64-bit, CPU onlyの場合)
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
```
**注意：上はバージョンr0.7用です。コピペする前に、[公式サイト](https://www.tensorflow.org/versions/master/get_started/os_setup.html)を参照して最新バージョンを確認してください。最新のものでないとチュートリアルが上手く動かない等の問題が発生する可能性があります。**（私は他のサイトをコピペして一回ハマりました :sweat: ）

チュートリアルやるためにgitをインストール。

```
$ sudo apt-get install git
```

チュートリアル用にソース等をダウンロード。

```
$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow
```

終わり。
あとはチュートリアル等やってみましょう。

##備考
- [公式チュートリアル](https://www.tensorflow.org/versions/master/tutorials/index.html)の[MNIST For ML Beginners](https://www.tensorflow.org/versions/master/tutorials/mnist/beginners/index.html)や[TensorFlow Mechanics 101](https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html)なら今回のCPU Onlyの環境でも余裕で動きます。（数秒で実行完了します）
- [Deep MNIST for Experts](https://www.tensorflow.org/versions/master/tutorials/mnist/pros/index.html)はソコソコのスペックが必要なようで、数時間放置しても終わらず、途中でメモリ不足関係のエラーで落ちました。（CNN関係の処理が重いのか？）
S3でホスティングしているHTMLページへリダイレクトさせる（HTTPS対応込み）

# 目的
サイト運営停止期間中、しばらく告知ページを実現したいといった要求に適う方法を書きます。

# 趣旨
https://test.xxx.jp のサブドメイン配下のページをすべて http://xxx.jp/ 直下のHTMLページにリダイレクトする。

# 手順
## 操作：S3

1. バケットを作成する
 * バケット名 xxx.jp
 * 表示するHTMLファイルをアップロードしておく(ファイル名は index.html)。
2. xxx.jpバケットの「プロパティ」から下記設定を保存する
 * アクセス許可
     * 被付与者を「全員」、「開く/ダウンロード」をチェック
     * ファイル参照可能にするため、バケットポリシーを編集　※①バケットポリシー参照
 * 静的ウェブサイトホスティング
     * 「ホスティングを有効にする」を選択
     * インデクスドキュメント "index.html"
     * ルーティングルールを編集 ※②リダイレクトルール参照
3. 運営サイトのサブドメインに応じたバケットを作成する
 * バケット名 test.xxx.jp
4. test.xxx.jpバケットの「プロパティ」から下記設定を保存する
 * 「別のホスト名にすべてのリクエストをリダイレクトする」を選択
 * すべてのリクエストをリダイレクト　"xxx.jp/index.html"

## 操作：Route53
1. test.xxx.jp のサブドメインに、下記のようにCNAMEレコードを追加

CNAME
> test.xxx.jp.s3-website-ap-northeast-1.amazonaws.com

ここまでの設定だけでも、http://test.xxx.jp （※https://ではなく） のサブドメイン配下のページをすべて http://xxx.jp/ 直下のHTMLページにリダイレクトされます。

【HTTPSサイトからのリダイレクトの場合は、下記対応も必要です】
---
## 操作：CloudFront

1. 該当ドメインのSSL証明書を IAM にCLI（※③コマンド参照）でアップロードする
2. CloudFront で distribution を作成する
 * Origin Domain Name: 選択肢として表示される S3 bucket test.xxx.jp を指定せずに、 S3 website endpointを指定すること。（エンドポイント例：test.xxx.jp.s3-website-{region}.amazonaws.com）
 * Origin Protocol Policy: HTTP Only
 * Alternate Domain Names (CNAMEs): test.xxx.jp
 * SSL Certificate: 項番 1. でアップロードした SSL 証明書を選択

CloudFrontの設定反映は15分ほどかかるので待ちます。


## 操作：Route53
1. test.xxx.jp の CNAME を、割り当てられた CloudFront のホスト名（例：xyz123.cloudfront.net）に変更
※test.xxx.jp のAレコードで、エイリアスとしてCloudFront のホスト名を登録してもOK


以上です。


## 補足

①バケットポリシー
<pre>
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "PublicReadGetObject",
			"Effect": "Allow",
			"Principal": "*",
			"Action": [
				"s3:GetObject"
			],
			"Resource": [
				"arn:aws:s3:::xxx.com/*"
			]
		}
	]
}
</pre>

②リダイレクトルール

```xml
<RoutingRules>
    <RoutingRule>
    <Condition>
        <KeyPrefixEquals>index.html/</KeyPrefixEquals>
    </Condition>
    <Redirect>
        <ReplaceKeyWith>index.html</ReplaceKeyWith>
    </Redirect>
    </RoutingRule>
</RoutingRules>
```

③コマンド
※コマンド実行前提として、awscliインストール済であること、awsクレデンシャルが設定済であること。

```bash
aws iam upload-server-certificate --server-certificate-name xxx-2016 ¥
--certificate-body file://server.crt ¥
--private-key file://server.key ¥
--certificate-chain file://ca.crt ¥
--path /cloudfront/xxx-jp/
```

## 参照URL：
公式サイト
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/HowDoIWebsiteConfiguration.html
Route53 + S3 を使った任意の URL へのリダイレクト
http://qiita.com/mzmttks/items/6ec434a9fde1ac37d84a
CloudFrontでHTTPS対応
https://blog.m4i.jp/2015/10/01/redirect-https-using-s3
AWS ELBの証明書を確認・削除する
http://qiita.com/key/items/e8005025d29c0dd893bd
RailsプロジェクトでSMTPサーバ持ってないけど、メール送信機能が正常に動作してるか確認したいとき！

SMTPの設定動作確認したいけど、、SMTPサーバ立てるのめんどい  
しかももしかしたら開発中の機能で、、誤送信したらどうしよう....

そんなあなたに

[mailcatcher](https://hub.docker.com/r/schickling/mailcatcher/) を紹介します。  
簡単に説明すると、docker上で稼働するSMTPサーバです。  
ですが実際にはメールを外部に送信しません。mailcatcherがメールクライアントも兼ねてるので、ブラウザ上ですべてのメールを見ることが出来ます。  
これ自体の使い方は、上記リンク先を見てください。

## mailcatcherの準備

`docker-compose.yml` に以下の設定を追加します。  
1080ポートはhttp用ポート  
1025ポートはSMTP用ポート

```
  smtp:
    image: schickling/mailcatcher
    ports:
      - "1080:1080"
      - "1025:1025"
```

完成形は[こちら](https://github.com/shinofara/sample-rail5/blob/3dc07e1fd1c9da1f0a07c873ace33f29ae66d678/docker-compose.yml)

あとは実行するだけ

```
$ docker-compose up
```

これで
http://<docker host ip>:1080
にアクセスしてみてください、WEB UIが表示されます。

<img width="716" alt="スクリーンショット 2016-03-19 23.10.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/8529/6fba1e18-0e66-924f-19d3-6299bc11fca6.png">

今はまだメール０件ですが、SMTP経由でメール送信するとここにたまります。

## Railsからメール送信してみよう

railsのActionMailerを使ってますので、そのあたりの説明は省きます。  
そしてSMTPの設定は下記の通りです。

```
# config/environments/development.rb
# Mail ocnfig
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = { :address => "<docker host ip>", :port => 1025 }
config.action_mailer.raise_delivery_errors = true
```

あとは、実行するだけです。

![mailcatcher.gif](https://qiita-image-store.s3.amazonaws.com/0/8529/d598f320-9c43-ed60-aeb2-bfba578a73be.gif)


こんな感じで確認できます。  
開発時は、SMTPサーバも必要無いし、存在するメールアドレスに誤送信してしまうリスクもなくなります。
phpunitのインストールで躓く

cakephpの単体試験用にphpunitを入れようとして

```
wget https://phar.phpunit.de/phpunit.phar 
mv phpunit.phar /usr/local/bin/phpunit
```
するも、ブラウザから`http://xxxxxxxxxxxxxx/test.php`にアクセスすると

```
Warning (2): include(PHPUnit/Autoload.php) [function.include]: failed to open stream: No such file or directory [CORE/Cake/TestSuite/CakeTestSuiteDispatcher.php, line 150]
```

とブラウザにエラーが表示される。　どうも環境のphpが古い(5.3)のが原因のようだ。
phpのバージョンは変えられない状況なので、phpunitの方を合わせることとする。

まずはcomposerを入れる
composerはphpのパッケージ管理ツールで、他にpearがある。

```
$ curl -sS https://getcomposer.org/installer | php 
$ sudo mv composer.phar /usr/local/bin/composer 
```

次にphpunitのインストール。

```
$ cd /var/www/cakephp/
$ sudo vi composer.json
$ cat composer.json
{
    "require-dev": {
        "phpunit/phpunit": "3.7.*"
    }
}
$ sudo composer update
```

これで/var/www/cakephp/vendor/にインストールされる。
あとは/var/www/cakephp/vendor/autoload.phpのパスをbootstrap.phpに書くだけ

```
$ sudo vi /var/www/cakephp/app/Config/bootstrap.php 
$ sudo head /var/www/cakephp/app/Config/bootstrap.php
<?php
require '/var/www/cakephp/vendor/autoload.php';
```

これでいけた
CoreGraphics 基礎の基礎

##概観
UIKitがCoreGraphicsのラッパーになっている（らしい）。UIKitから独立してあるのではなく、UIViewの`drawRect`メソッドをオーバーライドすることで、UIViewの描画データに直接アクセスする感じで利用する。

描画データ（コンテキスト）は、[CGCotextRef](http://qiita.com/IMNR01/items/c8f0112e6e3316d8d116)型(CGContext構造体へのポインタ）で、これに対して様々なC言語関数で命令を与える。

##描画方法の種類
- コンテキストに画像データを追加しこれに加工を加える。
- コンテキストにパスを追加する。

等の方法がある。パスでは、直線、曲線を繋いで図形を作成しその内部を塗りつぶしたりできる。

##描画の流れ
次の流れで描画を行う。
1.コンテキストを取得する（参照：[CGCotextRef](http://qiita.com/IMNR01/items/c8f0112e6e3316d8d116))
2.コンテキストにグラフィックステートを設定する
グラフィックステートは、線の太さ、線の端の形、線の接続部分の形、線の色、塗りつぶす色、背景との合成方法などの描画にあたっての共通のスタイルのこと。ステートの設定後に行う描画はそのステートに沿ったスタイルの描画内容となる。
3.コンテキストに対し描画を行う

##パス作成の流れ
直線、曲線を繋げたものがパス。
コンテキストに次々と点を追加していくことでパスを作成する。コンテキストは追加された点を保持していて、最後に追加された点が次の直線等の起点となり、終点のみを追加するという感じ。

##サンプルコード

```objective-c:
- (void)drawRect:(CGRect)rect {
    //コンテキストを取得
    CGContextRef context = UIGraphicsGetCurrentContext();

    //グラフィックステートを設定
    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
    CGContextSetLineWidth(context, 10.0);
    CGContextSetLineCap(context, kCGLineCapRound);

    //（保持していたパスのポイント等を破棄して）新たなパス描画を開始する
    CGContextBeginPath(context);
    
    //パスを作成
    CGContextMoveToPoint(context, 50, 50);
    CGContextAddLineToPoint(context, 100, 100);
    CGContextAddLineToPoint(context, 150, 50);
    
    //パスの描画を実行
    CGContextDrawPath(context, kCGPathStroke);
}
```
参考メモ/JavaScriptでbase64/url/gzエンコード・デコードするライブラリ

JavaScriptでbase64/url/gzエンコード・デコードするライブラリをググった時のURLのメモです。

だいぶ昔にググった時のメモなので、もしかしたら今では新しいライブラリがでてきてるかもしれませんので、参考までに。

Base64エンコード・デコード：

* Base64 encoding and decoding - Web API Interfaces | MDN
  * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding
* Base64 encoding and decoding in client-side Javascript - Stack Overflow
  * http://stackoverflow.com/questions/2820249/base64-encoding-and-decoding-in-client-side-javascript
* Javascript で Base64 encode/decode - elm200 の日記
  * http://d.hatena.ne.jp/elm200/20080211/1202730571
* dankogai/js-base64 · GitHub
  * https://github.com/dankogai/js-base64

URLエンコード・デコード：

* URL（URI）エンコード・デコードを行う方法 - JavaScript TIPSふぁくとりー
  * http://www.nishishi.com/javascript/2007/encodeuri.html
* jquery - JavaScript URL Decode function - Stack Overflow
  * http://stackoverflow.com/questions/4292914/javascript-url-decode-function
* JavaScript decodeURIComponent() Function
  * http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp
* JavaScriptでURIエンコード（URLエンコード）を行う｜プログラムメモ
  * http://logic.moo.jp/data/archives/438.html

zlib/gzなどの圧縮・解凍：

* zlibjs
  * https://www.npmjs.com/package/zlibjs
* ajax - JavaScript implementation of Gzip - Stack Overflow
  * http://stackoverflow.com/questions/294297/javascript-implementation-of-gzip
* nodeca/pako · GitHub
  * https://github.com/nodeca/pako
* beatgammit/gzip-js · GitHub
  * https://github.com/beatgammit/gzip-js
* lz-string: JavaScript compression, fast! - pieroxy.net
  * http://pieroxy.net/blog/pages/lz-string/index.html
ズンドコキヨシ with COBOL

# COBOLでズンドコ

http://qiita.com/shunsugai@github/items/971a15461de29563bf90

今、はやりのズンドコキヨシのCOBOL版が見当たらなかったので、書いてみました。
とはいえ、20年ぶりくらいにCOBOLを書くので、全然COBOLっぽくないかも。。。
そして、PCでCOBOL書くのは、想像以上に書きづらかった！

# 準備

今回は、GnuCOBOL (formerly OpenCOBOL)っていうのを使わせていただきました。
Macだったら、

```shell-session
$ brew install open-cobol
```
であっさり入ります。

# 中身

```cobol:zd.cob
000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID. ZUNDOKO-KIYOSHI.
000030 ENVIRONMENT DIVISION.
000040 DATA DIVISION.
000050 WORKING-STORAGE SECTION.
000060   77 END-FLAG                    PIC 9(01).
000070   77 WRK                         PIC 9(01).
000080   77 ZUN-COUNT                   PIC 9(01).
000090   77 SEED                        PIC 9(06).
000100   01 CURRENT-DATE-STRUCT.
000110     05 CURRENT-DATE.
000120       10 CURRENT-YEAR            PIC 9(04).
000130       10 CURRENT-MONTH           PIC 9(02).
000140       10 CURRENT-DAY             PIC 9(02).
000150     05 CURRENT-TIME.
000160       10 CURRENT-HOURS           PIC 9(02).
000170       10 CURRENT-MINUTE          PIC 9(02).
000180       10 CURRENT-SECOND          PIC 9(02).
000190       10 CURRENT-MILLISECONDS    COMP-2.
000200     05 DIFF-FROM-GMT             PIC S9(04).
000210 PROCEDURE DIVISION.
000220 MAIN SECTION.
000230* Initialize random seed
000240   MOVE FUNCTION CURRENT-DATE TO CURRENT-DATE-STRUCT.
000250   COMPUTE SEED = CURRENT-HOURS * 1000
000260     + CURRENT-MINUTE * 10 + CURRENT-SECOND.
000270   COMPUTE WRK = FUNCTION RANDOM(SEED).
000280* Zundoko
000290   PERFORM UNTIL END-FLAG = 1
000300     COMPUTE WRK = FUNCTION RANDOM * 10
000310     DIVIDE WRK BY 2 GIVING WRK REMAINDER WRK
000320     IF WRK = 1 THEN
000330       DISPLAY 'ズン'
000340       COMPUTE ZUN-COUNT = ZUN-COUNT + 1
000350     ELSE
000360       DISPLAY 'ドコ'
000370       IF ZUN-COUNT = 4 THEN
000380         MOVE 1 TO END-FLAG
000390       END-IF
000400       MOVE 0 TO ZUN-COUNT
000410     END-IF
000420   END-PERFORM.
000430   DISPLAY 'キ・ヨ・シ！'.
000440   STOP RUN.
```
こんな感じです。
COBOLなので、わかりやすさを意識して書いてみましたが、意外とわかりづらい？？？
そして、昔のことすぎて覚えてないので、COBOLっぽく書けてるのかは謎です。

# 実行
```shell-session
$ cobc -x ./zd.cob ; ./zd
ズン
ズン
ズン
ズン
ズン
ドコ
ドコ
ズン
ドコ
ズン
ズン
ドコ
ズン
ズン
ドコ
ズン
ズン
ズン
ズン
ドコ
キ・ヨ・シ！
$
```
っぽくなりました！

以上
参考メモ/HTTP Proxyを通す時のHTTPリクエストについて

Burp使ってると、Proxyのヒストリ一覧からrepeaterに移すと、たまにリクエストラインが `GET http://xxxx/foo/bar.html HTTP/1.1` みたいに、URLがそのまま載ってる時があります。
別のプロキシから上位にBurp置くとそうなるのかな？

よくわからないんですが、そもそも HTTP Proxyを通すとき、HTTPのリクエストラインはどうすべきなのかRFCを軽くググッた非常に簡単なメモです。

# Proxyを通した時のリクエストラインの変更について

https://tools.ietf.org/html/rfc2616 (昔のHTTP)

* 5.1.2 Request-URI
  * リクエストラインのURIの書き方で、Proxyでの扱いについて。
  * "The absoluteURI form is REQUIRED when the request is being made to a proxy."
  * どうやら絶対URIでリクエストライン書くのはこの辺かな。
  * "The authority form is only used by the CONNECT method (section 9.9)."
  * → section 9.9 見ても "This specification reserves the method name CONNECT for use with a proxy that can dynamically switch to being a tunnel (e.g. SSL tunneling [44])." としか書いてなく、"authority form"ってなんなのかこのRFC上だけでは不明。
* 8.1.3 Proxy Servers
  * Connection ヘッダーのProxyでの扱いについて。
* 14.33 Proxy-Authenticate
  * 認証が必要なプロキシで、407 (Proxy Authentication Required) を返す時に一緒に返すレスポンスヘッダー
  * `Proxy-Authenticate  = "Proxy-Authenticate" ":" 1#challenge`
* 14.34 Proxy-Authorization
  * 認証が必要なプロキシに認証情報を送るリクエストヘッダー
  * `Proxy-Authorization     = "Proxy-Authorization" ":" credentials`

https://tools.ietf.org/html/rfc7230 (整理された最近のHTTP)

* 5.3.2.  absolute-form
  * リクエストラインのURIの書き方で、Proxyでの扱いについて。
  * "When making a request to a proxy, other than a CONNECT or server-wide OPTIONS request (as detailed below), a client MUST send the target URI in absolute-form as the request-target."
  * やっぱりProxy通すときは絶対URI形式で。
* 5.3.3.  authority-form
  * やっとCONNECTメソッドでProxy使う時の"authority-form" が何なのか言及された。
  * 例 : `CONNECT www.example.com:80 HTTP/1.1`
* 5.3.4.  asterisk-form
  * OPTIONSメソッドのURIの書き方で、本来 `OPTIONS * HTTP/1.1` でリクエストしたいのを Proxy 通す場合は `OPTIONS http://xxxxxx:8080 HTTP/1.1` に変形するらしい。
  * なので、OPTIONSメソッドで↑の形式で来たら、Proxyは `OPTIONS * HTTP/1.1` に戻してサーバに送らないとダメみたい。
* 6.  Connection Management
  * 随所に、Proxyの場合はどうする、というのが記載されてる。

https://tools.ietf.org/html/rfc7235 (整理された最近のHTTPのうち、認証関連のヘッダーについて)

* 3.2.  407 Proxy Authentication Required
  * 認証が必要なProxyが返すステータスコード407についての説明。
* 4.3.  Proxy-Authenticate
  * 認証が必要なプロキシで、407 (Proxy Authentication Required) を返す時に一緒に返すレスポンスヘッダー
* 4.4.  Proxy-Authorization
  * 認証が必要なプロキシに認証情報を送るリクエストヘッダー

# Proxy-Connection HTTPヘッダーについてメモ

RFC見てたら Proxy-Connection HTTPヘッダーというのがでてきまして、これなんだろうと。

* https://tools.ietf.org/html/rfc7230
  * A.1.2.  Keep-Alive Connections
  * "As a result, clients are encouraged not to send the Proxy-Connection header field in any requests."
  * 現状としてはクライアントはこのHTTPリクエストヘッダーを送る必要は無い。むしろ送らないことを推奨。
* https://developer.mozilla.org/ja/docs/HTTP/Headers
  * "注記: Keep-Alive リクエストヘッダは、Gecko 5.0 では送信されません。前のバージョンでは送信していましたが正しい形式ではなかったため、当分の間削除することになりました。ただし、Connection: または Proxy-Connection: ヘッダは依然として値 "keep-alive" で送信されます。"
  * 過去の互換性で送ってる？
* https://wiki.suikawiki.org/n/Proxy-Connection
  * 歴史的な事情などソースURL付きで解説されてるが、やはり結論としては、最新のWebでは使われないということで一致。
* http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/web-proxy-connection-header.html
  * 歴史的な事情。最終的に Connection リクエストヘッダーで完結するので、Proxy-Connection は使われなくなった。
* http://stackoverflow.com/questions/15460819/what-is-the-difference-between-connection-and-proxy-connection-in-http-header
  * 同上。
MySQL5.7で"initialize specified but the data directory has files in it. Aborting."

原因はいろいろあるみたいですが、私の場合は`validate_password=OFF`を入れたmy.cnfを、mysqldの初回起動前に入れてたのがよくなかったみたいです。

```my.cnf
[myslqd]

validate_password=OFF
```

# :ng: NG

```
# yum -y install mysqld
# cp my.cnf /etc/my.cnf
# systemctl start mysqld.service
--> 起動失敗
```

どうも初回起動時に`validate_password=OFF`が入るのは許されざる感じです。以下なら通りました。

# :ok: OK 

```
# yum -y install mysqld
# systemctl start mysqld.service

# cp my.cnf /etc/my.cnf
# systemctl restart mysqld.service
```

普通にmysql_secure_installation使えば問題ないんでしょうが、自動化とかやってて題記のエラーが出たら、こちら確認してみてください。
ホワイトボードの掃除方法


# ホワイトボードの掃除方法

チームのホワイトボード、キレイですか？

アジャイルにプロダクトを進める上で、ホワイトボードに展開するカンバンはなくてはならないものになります。
また尊敬する仕事仲間からは「PCがなくてもどうにでもなるが、ホワイトボードがないと仕事が出来ない」と聞いたこともあります。

そんな大事なホワイトボード。
使っているうちに結構汚れてきますよね？

今回は、ホワイトボードの掃除方法について投稿します。

## 結論
消しゴム！

## 掃除方法の種類

* イレイザーで拭き取る
* ウェットティッシュで拭き取る
* ホワイトボードクリーナー／シール剥がし／除光液
* 消しゴム！

## イレイザーで拭き取る

![イレイザー.jpg](https://qiita-image-store.s3.amazonaws.com/0/74102/f4e86dd6-9f07-dfe0-05e8-f4296e0ab37f.jpeg "イレイザー.jpg")

これでキレイになるなら、わざわざ投稿しません。

## ウェットティッシュで拭き取る

![オフィスクリーナー.jpg](https://qiita-image-store.s3.amazonaws.com/0/74102/119d519e-9d9f-d507-09b6-6f23b72743fa.jpeg "オフィスクリーナー.jpg")

ある程度までの汚れならキレイになるけど、頑固なヨゴレは落ちません。

## ホワイトボードクリーナー／シール剥がし／除光液

![ホワイトボードクリーナー.jpg](https://qiita-image-store.s3.amazonaws.com/0/74102/74a74d1f-daa0-0c39-00f7-bb3178787cd0.jpeg "ホワイトボードクリーナー.jpg") ![シール剥がし.jpg](https://qiita-image-store.s3.amazonaws.com/0/74102/fdb11c09-58d9-a0c6-1e3c-ef3c42868331.jpeg "シール剥がし.jpg") ![除光液.jpg](https://qiita-image-store.s3.amazonaws.com/0/74102/427adee8-9466-d382-0673-5ebb1f5f9724.jpeg "除光液.jpg")

かなり効果的だという書き込みがありますが、ホワイトボードの皮膜へのダメージが相当あるようです。
繰り返し使うことで、ホワイトボードがどんどん消えにくくなるそうです。

## 消しゴム！

![消しゴム.jpg](https://qiita-image-store.s3.amazonaws.com/0/74102/01fd2002-453d-54f8-ca64-f7d107c11118.jpeg "消しゴム.jpg")

最強です。

他チームから譲り受けて使っている薄汚れたホワイトボードでしたが、消しゴムひとつで新品同様。
マッシロシロスケのペッカペカになりました。

若干疲れることと、消しカスがかなり出ることが難点ですが、効果はバツグン！
僕のチームではExcelで印刷したタスクをホワイトボードに糊付けしてますが、乾いた糊も根こそぎキレイにしてくれます。

皮膜へのダメージも、ホワイトボードクリーナーや除光液などと比較すればかなり少ない **気がします** 。
⇒　よりダメージを抑えたいなら、消しゴムをゆっくり動かして摩擦熱を減らすとよりよいかもしれません

### 清掃手順

1. ホワイトボードマーカーや糊が乾くまで待つ
1. ホワイトボードを、ウェットティッシュで拭き取る
1. ホワイトボードを、消しゴムでキレイにする  
   ⇒　消しゴムのカスがホワイトボードに残るが、気にしない
1. ホワイトボードを、ティッシュペーパーで拭き取る  
   ⇒　消しゴムのカスをホワイトボードから地面へ落下させる
1. ホワイトボードの下に消しカスが散乱するので掃除する  
   ⇒　粘着テープ or 掃除機  
   ⇒　立つ鳥跡を濁さず。　放置は絶対止めましょう！

一般的なサイズのホワイトボードなら、作業時間は次のようになります。
社外秘が満載のホワイトボードですので、清掃前後の状態をアップできないことはご容赦願います。
　・No.2 ... 10分
　・No.3 ... 20分
　・No.4 ... 10分
　・No.5 ... 10分
　⇒　１時間弱で、ホワイトボードがペッカペカ！
underscoreコードリーディング（noConflict）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##noConflictとは


###[underscorejs.orgのnoConflict](http://underscorejs.org/#noConflict)

こんな説明。
>####_.noConflict() 
>Give control of the _ variable back to its previous owner.　
>Returns a reference to the Underscore object.

```javascript
var underscore = _.noConflict();
```

------------- 
_の変数のコントロールを以前のオーナーに与える。?
underscoreのobjectの参照を返す。

###[underscore.noConflict](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1274)
コード的にはこのあたり。

```javascript

  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
  // previous owner. Returns a reference to the Underscore object.
  _.noConflict = function() {
    root._ = previousUnderscore;
    return this;
  };

```

root._にpreviousUnderscoreを代入する。
その後、thisを返す。
WordPressのインストール

#WordPressをCentOsにインストールする
事前準備として下記をインストールしておきます

- MariaDB
- nginx
- php-fpm

#DB・ユーザ作成
mariaDBにログイン
`mysql -u root -p`
WordPress用のDB・ユーザを作成
`create database hogehoge;`
`grant all privileges on hogehoge.* to "ユーザ名"@localhost identified by 'パスワード';`
`FLUSH PRIVILEGES;`
`EXIT`

#スクリプトインストール
`cd /usr/local/src/`
`wget https://ja.wordpress.org/wordpress-4.4.2-ja.tar.gz`
`tar xvfz wordpress-4.4.2-ja.tar.gz`
`mv wordpress/* /var/www/hogehoge/doc_root/`
`chown -R hogehoge:hogehoge /var/www/hogehoge`
`rmdir wordpress`

#wp-config.phpの編集
`cp /var/www/babygoods/doc_root/wp-config-sample.php /var/www/babygoods/doc_root/wp-config.php`
`vi /var/www/babygoods/doc_root/wp-config.php`

- DB_NAME:WordPress用のデータベース名
- DB_USER:WordPress用のユーザー名
- DB_PASSWORD:WordPressユーザー用のパスワード
- DB_HOST:ホスト名
- DB_CHARSET:データベースの文字コード

以上！簡単！

#参考・抜粋・出典
http://wpdocs.osdn.jp/WordPress_%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
dashDB MPP は200億件(1TB)のフルスキャンに何秒かかる？

###**dashDB MPPとは何か？**
***
dashDB MPPとはIBM Bluemix上で提供されるクラウドデータウェアハウスサービス(DBaaS)であり、フルマネージドで提供されるサービスです。IBM DWHアプライアンスであるPuradata System for Analytics(Netezza)由来の簡易性(チューニング不要、物理設計不要)、超並列アーキテクチャ、In-Database Analytics機能を備え、DB2 BLU由来のインメモリカラムナー技術を実装しています。クラウドデータウェアハウスサービスとして提供されますが、共用クラウド基盤ではなく、IBM SoftLayer上の専用ベアメタルサーバーが使用されており、3ノードから25ノード(2016年3月時点)、最大データ容量100TBまで拡張可能なMPP(Massive Parallel Processing)アーキテクチャ、スケーラビリティを持ったクラウドデータウェアハウスサービスです。

###**dashDB MPP概要**
***
![dashDB_1.png](https://qiita-image-store.s3.amazonaws.com/0/94920/3475247c-ba10-8265-a1b2-5bc37ab95cc4.png)

###**dashDB MPP 4ノードは200億件(1TB)のフルスキャンに何秒かかる？**
***
今回、**dashDB MPP 4ノード**を使える機会を頂いたので、是非大量データのスキャン性能、パフォーマンスを計測してみたいと思い、下記のようなケースをやってみました。今回用意した**FACT_SALES_1000DAY表は200億件のレコード(1レコード: 約59バイト x 200億件 = 1TB)**を使用してフルスキャンを掛けてみたいと思います。まずは本当に200億件入っているか、カウントアップで確認してみたいと思います。

![dashDB_24_3.png](https://qiita-image-store.s3.amazonaws.com/0/94920/88aad62e-8f95-b216-32e4-4c2f10f2d18c.png)

では次にこの200億件のデータに対して、フルスキャンを掛けてみたいと思います。ただし単純にフルスキャンをかけても面白くないので、**%xxxx%のあいまい検索をかけて前方・後方不一致を確認させる**ことで全データを検索した後、検索対象レコードの売上金額をSUM関数で合計を取得、Group By, Order by句を使用して、店舗ごとにグループ化、ソートを行った上で売上金額上位の店舗から10位を表示する形としました。




###**では検索やってみましょう！**###

                                                               
![dashDB_26.png](https://qiita-image-store.s3.amazonaws.com/0/94920/8143471a-65ff-4055-97bf-b55009bcc897.png)





おー、**200億件,1TBのあいまい検索に14秒**って速いですね～。初回から何回やっても誤差は1秒以内なのであまりスピード変わらないですね。200億14秒ということは、**100億件相当であれば、7秒程度で読めるってこと**だと思うので、dashDB MPP 4ノードとはいえ並のDWHシステムではないですね。

ただ実際のBIシステムにおいて200億件の売上全データを集計して見るということはあまりしないと思います。多くのケースでは全データ集計処理というよりは、**多くのBIクエリが店舗、製品(商品)、期間、顧客等の視点から、データの傾向やパターンを分析する**というのが多いかと思います。

なので、今度は**200億件を持った明細表から全表検索ではなく、少しだけ視点を変えて1ヶ月分のデータ(6億4000万件)**に対して同じようなクエリを実行したらどうなるか見てみたいと思います。

###**dashDB MPP 4ノードは200億レコードから１ヶ月分のデータを読むのに何秒かかる？**
***
今回は先程使用したクエリに日付範囲指定として2012年1月の指定を追加したクエリを実行していみたいと思います。ちなみに今回データロードしただけなので、通常のRDBMSでやっているような、**パラメータ変更、物理設計、インデックス作成、パーティショニング作成**といった作業は実施していません。この状態で日付範囲指定で検索をかけた場合、どうなるか試してみ見ました。




![dashDB_29.png](https://qiita-image-store.s3.amazonaws.com/0/94920/93176f96-b00b-002d-0637-2a3a241f2498.png)

**フルスキャンでかかっていた時間が何のチューニングもなしに1/10以下に短縮された。**

検索範囲が特定されると自動的に読み込み範囲が絞られているのか、検索処理時間が短くなっています。このあたりはNetezzaで使用されていた特許技術であるZone Mapと同じような技術が実装されているのではと思います。

今回はまず簡単に出来そうなところで、大量データの単体検索性能や日付範囲指定した際に処理時間がどうなるかを実際に動かして見てみました。次回以降はより現場で使われそうな分析軸を想定したクエリを使用した場合の処理スピード感やIn-Databaseアナリティクス機能についても実際に動かして試していきたいと思います。


###**参考資料**
***
[Make Big Data small with IBM dashDB Enterprise MPP](https://developer.ibm.com/bluemix/2015/07/27/make-big-data-small-ibm-dashdb-enterprise-mpp/)
[Now Available: dashDB Enterprise MPP](https://developer.ibm.com/bluemix/2015/07/16/now-available-dashdb-mpp/)
[Introducing dashDB MPP: The Power of Data Warehousing in the Cloud ](http://pt.slideshare.net/dashDB/introducing-dashdb-mpp-the-power-of-data-warehousing-in-the-cloud)
MySQL5.7のtemporary password文字列を拾うワンライナー

5.7からパッケージを入れた直後のrootのパスワードになるやつです。スクリプトから使いたい時にでもご利用ください。

```shell
$ sudo grep 'temporary password' /var/log/mysqld.log | sed -e "s/.*root@localhost: //"
5UGYEVdG)_g,

$ mysql -u root -p'5UGYEVdG)_g,'
mysql>
```

mysqlコマンドから流す場合は`--connect-expired-password`をつけないと失敗するっぽいので、以下の様な感じにするといいかも。

```bash:password_update.sh
TEMP_PASS=`sudo grep 'temporary password' /var/log/mysqld.log | sed -e "s/.*root@localhost: //"`
UPDATE_SQL="SET PASSWORD FOR root@localhost=PASSWORD('newpassword');"

mysql -u root -p"${TEMP_PASS}" -e "${UPDATE_SQL}" --connect-expired-password
```

しかし毎回毎回、見事に記号入れてくれるのが地味にイラッときます…（エスケープがだるい）
[jQuery]でcssプロパティを動的に追加、変更、削除する

jQueryでHTML要素にcssプロパティを動的に追加・変更・削除する記述方法のメモ。
cssのstyle属性を直書きする場合はcss()メソッドを、cssを追加する場合はaddClass( )削除する場合はremoveClass( )メソッドを使用します。

- 直書きcss( )

- 追加 addClass( )

- 削除 removeClass( )

# 前提
事前に、html内でjQueryを読み込んでおきます。

```html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>

```

# 記述方法
## jQueryでstyle属性を直書きしたい場合は[css( )]メソッド
ひとつのstyle属性の場合

```r
$('要素').css('プロパティ','値');
```

複数のstyle属性の場合

```r
$('要素').css({'プロパティ':'値','プロパティ':'値'});
```

## HTML内の要素にcssを追加、削除したい場合は[addClass( )] [removeClass( )]メソッド
要素にClassを追加する

```r
$('要素').addClass('css名');
```

要素についているClassを削除する

```r
$('要素').removeClass('css名');
```

# 「css( )」メソッドでstyle属性の追加、変更、削除
- ひとつのcssプロパティの場合
例えば、HTML要素にclass「test」がついた要素のcss「color」を「blue」に追加,変更したい場合

```r
$('.test').css('color','blue');
```
これでcssが追加され、既にcolor指定されていた場合でも、この記述が有効になります。

- 複数のcssプロパティの場合
例えば、ID「jedy」がついた要素のcss「color」を「blue]に、[font-size」を[20px]に追加、変更したい場合

```r
$('#jedy').css({'color':'blue','font-size':'20px'});
```

- cssプロパティの削除
例えば、class「test」がついた要素のcss「color」指定を削除したい場合

```r
$('.test').css('color','');
```

## 「addClass()」「removeClass()」メソッドでcssの追加,削除

- cssを追加
例えば、ID「jedy」がついた要素にcss「force」を追加したい場合

```rb
$('#jedy').addClass('force');
```

- cssを削除

```r
$('#jedy').removeClass('force');
```

複数cssプロパティを用意しておいて、動的に変更するときなどに便利です。
日毎にテーブルを分けている時のBigQueryの罠


BigQueryで多くのログデータなどを管理する時には以下の記事のように日毎に分けると、その後の集計・分析作業が容易になることが多いです。
http://tech.vasily.jp/entry/bigquery_data_platform

次のようなBigQuery独自拡張のTABLE_DATE_RANGE関数を使うことによって、2016年2月分のテーブル全てに対してスキャンを行うことができます。

```sql
SELECT * FROM
  (TABLE_DATE_RANGE(dataset.table_, TIMESTAMP('2016-02-01'),
                                    TIMESTAMP('2016-02-29')))
```

また、CURRENT_TIMESTAMP関数とDATE_ADD関数も組み合わせることによって、1週間前から今日までの範囲をスキャンすることもできます。

```sql
SELECT * FROM
  (TABLE_DATE_RANGE(dataset.table_, DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY'),
                                    CURRENT_TIMESTAMP()))
```

## 00:00〜09:00の期間には集計期間がズレる
しかし、これでは望んだ挙動にならないことがあります。

テーブルを日毎に分ける時には日本標準時(JST)の00:00を境界にして分けることが多いとおもいます。
ですが、CURRENT_TIIMESTAMP関数が返す日時は協定世界時(UTC)に基づいているので、9時間の時差が存在します。
そのため、00:00〜09:00(JST)の期間に上記のクエリを実行した場合には集計期間が一日ズレてしまいます。

## 解決策
このズレを修正するためには、TABLE_DATE_RANGE関数に渡す日付に9時間のオフセットを与えれば良いです。

```sql
SELECT * FROM
  (TABLE_DATE_RANGE(dataset.table_, DATE_ADD(DATE_ADD(CURRENT_TIMESTAMP(), 9, 'HOUR'), -7, 'DAY'),
                                    DATE_ADD(CURRENT_TIMESTAMP(), 9, 'HOUR')))
```

## BigQueryに対する愚痴
それにしても、BigQueryで時差の変換を行う専用関数がないのは不便ですね・・・
UTC_TO_JSTみたいな関数があればいいのに・・・
【Shader Forge】Panner(UVをいじる)について

Shaderの利点の一つはUVを自由にいじれることだと思います。
UVをいじって流れるようなアニメーションをshaderで表現してみました。

できたもの
![3月-19,-2016-21-45-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/67575/6911b987-f617-60e6-76ad-c49cdf753f83.gif)

Shader Forgeのnode図(Textureが少しずつずれるのがわかります)
![3月 19, 2016 21:47.gif](https://qiita-image-store.s3.amazonaws.com/0/67575/665e4f38-a162-3891-051b-25badaed03ee.gif)

ポイントは、
Pannerノードですね。

Geometry Data/UV CoordinatesからUV図を管理するUV Coordinates(UV Coord.)ノードを取得し、
PannerでUV図を加工し、それをTextureに渡しています。

ちなみにGeometryは「形状」という意味なので、Geometry Dataメニューにはまさに形状に関するノードが入ってます。
<img width="361" alt="スクリーンショット 2016-03-19 22.01.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/05f5c703-fa50-c1e6-9c2c-8b4c9259fe2f.png">


##Pannerノードについて
Panner = Pan(運ぶ) + er(人)
なので運び人という意味になります（たぶん）

Pannerノードは公式によると、

```
Outputs the input [UV] coordinates, panned/offset by [Dist] distance, in the direction/speed specified by the U and V parameters
```
といっています。
英語はよくわからないけど、たぶん、

```
入力されたUVを加工して(少しずらして)出力するよ。設定したUやVのパラメータによってUVをずらすスピードを変えることができるよ
```
的なことを言っているんだと思います。

PannerのDistにvalueノードとかを接続すると、UVにoffset分ずらすことができます。
ただし、時間経過によるUVのずらしはできなくなります。
Distを使いながらUV図を時間経過によってずらしたいときは、Panner(Distを設定)にPanner(UVをずらすだけ)を接続して使うといいと思います。
<img width="704" alt="スクリーンショット 2016-03-19 23.40.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/d2bd65ab-1f61-2e2b-081d-20af763f4985.png">


ともあれPannerノードを使うことでUVを加工することができるようになります。
いろいろできそうなのでこれからもやっていきたいね。
ズンドコキヨシをSwiftのAnyGeneratorとlazyで

小学生の息子がズンドコキヨシをPythonで作ったので、もうかなり出遅れたけど私はSwiftのAnyGeneratorとlazyを使ってやってみた。

```swift
enum Zundoko: String {
    case Zun = "ズン"
    case Doko = "ドコ"
}

var zundoko = Array<Zundoko>()
let gen = anyGenerator { return arc4random_uniform(2) == 0 ? Zundoko.Zun : Zundoko.Doko }
    .lazy
    .map { (zd) -> [Zundoko] in
        zundoko.append(zd)
        if zundoko.count > 5 {
            zundoko.removeFirst()
        }
        return Array(zundoko)
    }
    .filter { (zundoko: [Zundoko]) -> Bool in
        print(zundoko.last!.rawValue)
        let result = zundoko.map { $0.rawValue } .joinWithSeparator("") == "ズンズンズンズンドコ"
        if result { print("キ・ヨ・シ！") }
        return result
}

gen.prefix(1).generate().next()
```
SoftLayerでvSphere5.5とvCenter5.5をオーダーしたときのバージョン

※2019年11月現在、v5.5は選択できませんが、記事は参考に残しています。

自分用のメモに近いですが。

SoftLayerで、vSphere5.5とvCenter5.5をオーダーした時、プロビジョニングされるバージョンは以下の通りです（2016/3/19にオーダーしたサーバーで確認しました）

vSphere Clientのバージョン情報で確認
![vmware01.jpg](https://qiita-image-store.s3.amazonaws.com/0/59627/59e06967-f68e-fbee-26ef-5079a24d8316.jpeg)

■ESXi5.5
ビルド2068190との事なので、VMware ESXi 5.5 Update 2 です。
https://www.vmware.com/support/vsphere5/doc/vsphere-esxi-55u2-release-notes.html

■vSphere Client
ビルド1281650との事なので、VMware vSphere Client 5.5 です。
https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2090544

vSphere Web Clientのバージョン情報で確認
![vmware02.jpg](https://qiita-image-store.s3.amazonaws.com/0/59627/19d223f7-3189-192d-a452-982d4dde1049.jpeg)

■vSphere Web Client
ビルド2175560です。（少し探した限り、update xという呼び方はなさそうでした）

■vCenter5.5
https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2078462

上記を参考に、vCenterを導入したWindowsサーバーのコマンドプロンプトで下記を実行します。

`"C:\Program Files\VMware\Infrastructure\VirtualCenter Server\vpxd.exe" -v`

![vmware03.jpg](https://qiita-image-store.s3.amazonaws.com/0/59627/a2715e1f-962c-6973-bc48-80ffb61be2ae.jpeg)

VMware VirtualCenter 5.5.0 build-2183111　です。
これはvCenter Server 5.5 Update 2bです。
https://www.vmware.com/support/vsphere5/doc/vsphere-vcenter-server-55u2b-release-notes.html

今後、変わる可能性はありますが、2016/3/19にvSphere5.5とvCenter5.5をオーダーした時にプロビジョニングされるバージョンは上記でした。
（vSphere6, vCenter6についても試す機会があれば追記します）
Apache kafkaでトピックを削除する

GYAOの窓際エンジニア　玉利です。

久しぶりに試験用のkafkaプロセスを起動したら、データが吹っ飛んでたらしいです。
nifiのGetKafkaを仕掛けると、ガンガンとエラーが表示されてこまりました。

```
[2016-03-19 18:21:55,250] ERROR [Replica Manager on Broker 0]: Error when processing fetch request for partition [nifi,0] offset 605 from consumer with correlation id 522. Possible cause: Request for offset 605 but we only have log segments in the range 0 to 0. (kafka.server.ReplicaManager)
```

# トピックを削除する

どうやら、このオフセットポインタを削除する方法が見つかりません。本当は正しい復旧方法がありそうなものですが、テスト環境なのでざっくりと綺麗にしてみます。

kafkaのコンフィグファイルに、以下のようにdelete可能の設定を入れます。ついでに試行錯誤なのでauto.createもつけてあげました。無保証です。

```
vim /usr/local/etc/kafka/server.properties
delete.topic.enable=true
#auto.create.topics.enable=true
```

kafkaを再起動してconfigの設定を有効化
```
kafka-server-stop.sh /usr/local/etc/kafka/server.properties
kafka-server-start.sh /usr/local/etc/kafka/server.properties &
```

kafka-topic.shで削除コマンドを入れます。
```
kafka-topics.sh --delete --zookeeper localhost:2181 --topic <トピック名>
```

削除するときは、consumer側も止めておいてください。止まってないと削除が行えないみたいで、はまりました。

```
Topic <トピック名> is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.

[2016-03-19 18:28:11,240] INFO [ReplicaFetcherManager on broker 0] Removed fetcher for partitions [nifi,0] (kafka.server.ReplicaFetcherManager)
[2016-03-19 18:28:11,241] INFO Deleting index /usr/local/var/lib/kafka-logs/nifi-0/00000000000000000000.index (kafka.log.OffsetIndex)
[2016-03-19 18:28:11,241] INFO Deleted log for partition [nifi,0] in /usr/local/var/lib/kafka-logs/nifi-0. (kafka.log.LogManager)

```

トピックリストを取得してみます。
```
kafka-topics.sh --list --zookeeper localhost:2181
```

トピック名が消えてました。めでたしめでたし。

しかし、私の問題は解決していませんでした。別にNiFiのネタとして続きます。
SwiftでUITabBarControllerの選択色をタブごとに変える

例えばStoryboard上で

```
MyTabBarController
   -> UINavigationController -> MyNavigationControllerA
   -> UINavigationController -> MyNavigationControllerB
   -> UINavigationController -> MyNavigationControllerC
```
という構成になっている場合(MyTabBarControllerのdelegateはself)

```swift:MyTabBarController.swift
func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
    guard let tabContent = viewController as? UINavigationController else {
        return true
    }
    let navigationContent = tabContent.viewControllers[0]
    if nil != navigationContent as? MyNavigationControllerB {
        // Bの時だけ選択色を赤に
        tabBar.tintColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
    } else {
        // それ以外は緑に
        tabBar.tintColor = UIColor(red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0)
    }
    return true
}
```
とすれば動的に選択色が変わる。
selectedImageとimageで画像を分けるよりも画像リソースが減るので経済的。
Swiftが歌う、音声出力ズンドコキヨシ



## 概要
[ズンドコキヨシ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)、テキストで出力するお題ですが、やっぱり歌いたい、ということで、Mac OS XのAppKitにあるNSSpeechSynthesizerを使って歌うズンドコを書きました。

## 実行結果例

実行結果は音声出力です。
→　**[SoundCloud](https://soundcloud.com/shinya-chikura/zundoko)**

## 仕様
ズンが4回以上続いたら→4の倍数回続いたら、に仕様変更してます。メロディが合わないので。

## リズム
適当実装です。usleepで待ってリズムとってますが、本当は、ちゃんと時間の精度が出る方法で、UIの応答が止まらないようにしなきゃいけませんね

## 音程
音程はNSSpeechPitchBasePropertyで変えられるようですが、普通の声だと単語としてのアクセントが加味されて音程が変わってしまうので、Zarvoxという平坦な声を選びました。Zarvoxさんは英語を話すので、ズンドコも日本語っぽい発音になるように英語っぽい綴りで書きます。2chフラッシュ懐かしいね。



## ソース
zundoko()を実行するとズンドコします。

```swift:"Zundoko.swift"
class Zundoko {
    let speechSynth: NSSpeechSynthesizer = NSSpeechSynthesizer(voice: "com.apple.speech.synthesis.voice.Zarvox")!
    
    func zundoko() {
        var zundex = 0
        while true {
            let zunSel = arc4random() % 2 == 1
            if zunSel {
                if zundex == zun.count {
                    zundex=0
                }
                playElements(zun[zundex])
                zundex++
            } else {
                playElements(doko)
                if zundex == zun.count {
                    playElements(kiyoshi)
                    break
                } else {
                    zundex = 0
                }
            }
        }
    }
    
    let zun:[[Element]] =
    [
        [Element(length:4,pitch:51.0,text:"zoon")],
        [Element(length:2,pitch:56.0,text:"zoon")],
        [Element(length:1,pitch:57.0,text:"zoo"),
            Element(length:1,pitch:56.0,text:"oon")],
        [Element(length:2,pitch:51.0,text:"zoon")]
    ]
    let doko:[Element] =
    [Element(length:1,pitch:54.0,text:"do"),
        Element(length:1,pitch:51.0,text:"ko")]
    
    let kiyoshi:[Element] =
    [Element(length:1,pitch:63.0,text:"key"),
        Element(length:1,pitch:63.0,text:"yo"),
        Element(length:1,pitch:63.0,text:"shit")]
    
    func playElements(elements: [Element]) {
        for element in elements {
            playElement(element)
        }
    }
    
    func playElement(element: Element) {
        try! speechSynth.setObject(element.pitch, forProperty: NSSpeechPitchBaseProperty)
        speechSynth.startSpeakingString(element.text)
        usleep(UInt32(element.length)*263*1000)
    }
    
    class Element {
        var length: Int
        var pitch: Double
        var text: String
        init(length: Int, pitch: Double, text: String) {
            self.length = length
            self.pitch = pitch
            self.text = text
        }
    }
}
```

## 環境

OS X El Capitan バージョン 10.11.3
Xcode Version 7.2.1 (7C1002)
超初心者がmacでRictyインストールする方法

初心者マカーとしてRictyインストールに手間取ったのでメモ

## Rictyの紹介は以下
[プログラミングが捗りすぎる！コーディングに最適なフォント12選](http://paiza.hatenablog.com/entry/2015/02/10/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%8C%E6%8D%97%E3%82%8A%E3%81%99%E3%81%8E%E3%82%8B%EF%BC%81%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AB%E6%9C%80)

## Rictyのインストール
基本的に以下の最新Ver.ディレクトリにあるREADME.mdの通りに行えば問題ない
https://github.com/yascentur/RictyDiminished

## ハマったポイント

1. FontForge のインストール
READMEにはmacでのインストール方法はないが、homebrewで行える
初めてhomebrewを使った際にハマったポイントは以下に記載
[homebrewインストール時にリンクが貼られない問題](http://qiita.com/odacoh/items/16d5d454b18337bdb6b5)

2. Inconsolata/Migu 1M のインストールってどうやるの？
 - ダウンロード後に[.ttf]というファイルをクリック
 - 表示されたウィンドウした[フォントをインストール]からインストールできる
![migu1m_install.png](https://qiita-image-store.s3.amazonaws.com/0/117937/eb3e6880-1e7f-b680-054d-e53b9676520c.png)

3. Migu 1Mがどれか紛らわしい
1m以外にも１p,2pなど色々な種類があり、間違ってダウンロードするとはまる

以上
ズンドコキヨシ with Emacs Lisp

http://qiita.com/shunsugai@github/items/971a15461de29563bf90

Vim ScriptはあったのにEmacs Lispがないなんて...
ということで書きました。

```el:zundoko.el
(setq z "ズン")
(setq d "ドコ")
(setq k "キ・ヨ・シ！\n")
(setq ans (list z z z z d))
(defun get_zundoko ()
  (if (eq 1 (random 2)) z d))
(defun get_zundoko_seq (c n)
  (if c (reverse (cons n (reverse c))) (list n)))
(defun truncate_zundoko_seq (s)
  (reverse (butlast (reverse s) (- (length s) 5))))
(defun next_zundoko_seq (c n)
  (truncate_zundoko_seq (get_zundoko_seq c n)))
(defun do_zundoko(&optional c)
  (let (n)
    (if (equal c ans)
        (princ k)
      ((lambda ()
        (setq n (get_zundoko))
        (princ n)
        (do_zundoko (next_zundoko_seq c n)))))))
(do_zundoko)
```


```shell-session:実行結果
$ emacs --script zundoko.el
ズンドコドコズンズンドコドコズンドコドコズンズンズンズンドコキ・ヨ・シ！
```

```Emacsのバージョン
$ emacs --version
GNU Emacs 24.5.1
Copyright (C) 2015 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

```
ズンドコキヨシ with Fortran90

[ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90) に触発されて、[C 版](http://qiita.com/yohhoy/items/09c95cae51146d3fd788) を元に Fortran90 で書いてみました。

```fortran:killyoushit.f90
program killyoushit
  integer nlz, c
  nlz = 0
  c = 0
  do
    if (c .eq. 1) then
      nlz = nlz + 1
    else
      nlz = 0
    end if
    c = iand(irand(), 1)
    if (c .eq. 1) then
      print *, "ズン"
    else
      print *, "ドコ"
    end if
    if (.not. ((nlz .lt. 4) .or. (c .eq. 1))) then
      exit
    endif
  end do
  print *, "キ・ヨ・シ"
end program killyoushit
```
MacにJenkinsをinstallして、Rspecを実行


備忘録。

# 環境
MacBookAir
MacOSX Yosemite(10.10.5)
Homebrew 0.9.5
jenkins 1.647
ruby 2.2.4p230
Rails 4.2.5
Rspec 3.4.0
Turnip 2.1.0

# Jenkins install

homebrewでinstall

```
brew install jenkins
```

jenkinsを起動

```
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
launchctl stop homebrew.mxcl.jenkins
launchctl start homebrew.mxcl.jenkins
```

`http://localhost:8080` でブラウザからjenkinsにアクセスできる事を確認

# Railsプロジェクト&test準備

下記を参考に、Railsプロジェクトと、test(Rspec,Turnip)を準備。
[Jenkinsで小さなテストを実行してみよう（Mac OS X＆Linux）](http://www.buildinsider.net/enterprise/jenkins/02)

上記と較べて、Rails,Rspec,Turnipのversionが大幅に変わっている。特にRspecは書き方が変わっているので、今回用意したものを下記にします。
https://github.com/snumano/jenkins-demo

# Jenkins準備

ブラウザからJenkinsに`http://localhost:8080`でアクセスして、[Jenkinsの管理]-[プラグインの管理]から、下記プラグインをinstall

* Alternative build chooser
* Rake plugin
* rbenv plugin

# Jenkinsにてプロジェクトを作成

* [新規ジョブ作成]をクリックして、ジョブ名を入力。

![jenkins1.png](https://qiita-image-store.s3.amazonaws.com/0/4779/41d9b0d2-a08e-5c7b-b312-a72cc9020e28.png "jenkins1.png")


* [ソースコード]にgitを選択して、レポジトリを入力
* [ビルド環境]の[rbenv build wrapper]をチェックし、使用するruby versionを入力
* [Preinstall gem list]の下の[高度な設定]をクリックして、[RBENV_ROOT]に下記を入力。ここハマりポイントです。

```
$HOME/.rbenv-jenkins
```

* [ビルド]で[ビルド手順の追加]で[シェルの実行]を選択し下記を入力

```
export PATH="Users/snumano/.anyenv/envs:$PATH"
eval "$(rbenv init -)"
rbenv exec bundle install --path vendor/bundle
bundle exec rake db:migrate
bundle exec rake db:test:clone
bundle exec rspec
```

* 最後に[保存]をクリック

![jenkins2.png](https://qiita-image-store.s3.amazonaws.com/0/4779/6f4c534d-3fff-e650-3a34-53d556f79b47.png "jenkins2.png")
 
# Jenkinsでビルドを実行

* 作成したプロジェクト手動で実行します

![jenkins3.png](https://qiita-image-store.s3.amazonaws.com/0/4779/ec42f821-f4c4-1502-ea21-2e15551e42f0.png "jenkins3.png")

* 最初は各種gems installに10分程度時間がかかりますが、2回目以降は数分で完了します。下記のように、ビルドの結果は左のアイコンの色で示します。

![jenkins4.png](https://qiita-image-store.s3.amazonaws.com/0/4779/cf99630c-bf53-072a-fd9c-57c3266a88d2.png "jenkins4.png")

* ビルドおよびtestの結果詳細はコンソールから確認できます。

![jenkins5.png](https://qiita-image-store.s3.amazonaws.com/0/4779/5d32ca09-d316-5615-8b53-45f25249f85d.png "jenkins5.png")



# 参考

* [MacにJenkinsを入れてみる](http://qiita.com/yamakz/items/b254d7cd592b9415392b)
* [OS XにJenkinsをHomebrewでセットアップする](http://qiita.com/makoto_kw/items/cbe93d4ebbc35f3b43fd)
* [Jenkinsで小さなテストを実行してみよう（Mac OS X＆Linux）](http://www.buildinsider.net/enterprise/jenkins/02)
* [Jenkinsでrubyのビルドでハマった点
](http://qiita.com/kitaro_tn/items/22fd3830ba9a85ad5320)
メモ：Linux ネットワークインターフェース(netdev)情報を取得するREST API 作ってみた

タイトルの通りで、REST API実装してみたよというメモ。
Python/REST programming は24時間前に始めたばかりなので、まずはこんな感じで使えるようになったというログだけ記録。
もう少し手になじんだら Source Code や詳しい解説作成する予定。

興味ある人は Twitter: @ebiken 等にDMお願いします。

## 実装したこと：

* ネットワークインターフェース(netdev) 一覧表示
*インターフェースの詳細情報（アドレス＋統計情報）
* アドレスだけを表示
* IPv4 アドレスだけを表示（mac/ipv6も実装済み）
* 統計情報だけを表示

## ログ：

* ネットワークインターフェース(netdev) 一覧表示
* "interface" じゃなく "netdev" としてるのはVyOSとかに載せた時のインターフェース名との区別を付けるため

```
$ curl http://127.0.0.1:5000/netdev/
[
    "lo",
    "enp0s3",
    "virbr0",
    "virbr0-nic"
]
```

*インターフェースの詳細情報（アドレス＋統計情報）

```
$ curl http://127.0.0.1:5000/netdev/enp0s3/
{
    "address": {
        "ipv4": [
            {
                "addr": "10.0.2.15",
                "broadcast": "10.0.2.255",
                "netmask": "255.255.255.0"
            }
        ],
        "ipv6": [
            {
                "addr": "fe80::a00:27ff:feaf:dc60%enp0s3",
                "netmask": "ffff:ffff:ffff:ffff::"
            }
        ],
        "mac": [
            {
                "addr": "08:00:27:af:dc:60",
                "broadcast": "ff:ff:ff:ff:ff:ff"
            }
        ]
    },
    "stats": {
        "rx-bytes": 11324896,
        "rx-compressed": 0,
        "rx-drop": 0,
        "rx-errs": 0,
        "rx-fifo": 0,
        "rx-frame": 0,
        "rx-multicast": 0,
        "rx-packets": 53451,
        "tx-bytes": 8512050,
        "tx-carrier": 0,
        "tx-colls": 0,
        "tx-compressed": 0,
        "tx-drop": 0,
        "tx-errs": 0,
        "tx-fifo": 0,
        "tx-packets": 33368
    }
}
```

* アドレスだけを表示

```
$ curl http://127.0.0.1:5000/netdev/enp0s3/address/
{
    "ipv4": [
        {
            "addr": "10.0.2.15",
            "broadcast": "10.0.2.255",
            "netmask": "255.255.255.0"
        }
    ],
    "ipv6": [
        {
            "addr": "fe80::a00:27ff:feaf:dc60%enp0s3",
            "netmask": "ffff:ffff:ffff:ffff::"
        }
    ],
    "mac": [
        {
            "addr": "08:00:27:af:dc:60",
            "broadcast": "ff:ff:ff:ff:ff:ff"
        }
    ]
}
```

* IPv4 アドレスだけを表示

```
ebiken@u1510d:~/nnapi/test$ curl http://127.0.0.1:5000/netdev/enp0s3/address/ipv4/
[
    {
        "addr": "10.0.2.15",
        "broadcast": "10.0.2.255",
        "netmask": "255.255.255.0"
    }
]
```

* 統計情報だけを表示

```
$ curl http://127.0.0.1:5000/netdev/enp0s3/stats/
{
    "rx-bytes": 11340796,
    "rx-compressed": 0,
    "rx-drop": 0,
    "rx-errs": 0,
    "rx-fifo": 0,
    "rx-frame": 0,
    "rx-multicast": 0,
    "rx-packets": 53635,
    "tx-bytes": 8542150,
    "tx-carrier": 0,
    "tx-colls": 0,
    "tx-compressed": 0,
    "tx-drop": 0,
    "tx-errs": 0,
    "tx-fifo": 0,
    "tx-packets": 33501
}
```
jQueryで要素がdisabledかどうかを判定する


自分用メモ。

ある要素がdisabledかどうかを判定したい場合にはisメソッドで判定を行うことができる。
isメソッドはレシーバのjQueryオブジェクトの状態を判定してbooleanを返す。

```
$(要素).is(':disabled') 
```

また、要素が指定したidを持っているかを判定したい時は、下記の様に書くこともできる。

```
$(要素).is('id名')
```


> 参考サイト
jQuery isの利用方法 – 条件式を満たす場合に要素を操作 – Change the elements if the condition is satisfied http://zxcvbnmnbvcxz.com/jquery-is/
ブランチを切り替えた時に submodule の commit がずれるのを気にしてたけど alias で解決

ブランチを移動するたびに、`git submodule update`して同期するのが面倒くさくてsubmodule導入に尻込みしてたけど、aliasで解決したらとても便利だった。
`checkout`は元々alias `co` に設定していたが、それが拡張された感じ。

```
[alias]
 co="!f(){ git checkout $*;git submodule update --init;};f"
```

ブランチ移動時にsubmodule同期したくないときは `co`じゃなくて`checkout`使えば良いので、融通が効いてると思う。

- 別の解法  
[ブランチを切り替えた時に submodule の commit がずれて苛つくのを post-checkout hook で解消する](http://qiita.com/massat/items/29e98b5ba847d50c213d)  
**タイトルを真似た!!**
Windowsのbatファイルで"%~dp"と書いてはいけない

なんらかの理由があってbatファイル経由でexeに自分自身のディレクトリを渡す必要があるとする

```bat:hoge.bat
hoge.exe path="%~dp0" kage="sage" mage="gege"
```

このように書いてはいけない。

何故ならこれは展開されると
`hoge.exe path="c:\temp\" kage="sage" mage="gege"`
となる。

c#で引数を順番に表示すると

```csharp:text.cs
static void Main(string[] args) {
    foreach (var i in args) {
        Console.WriteLine($"i=[{i}]");
    }
}
```
こうなる

```csharp:コンソール
i=[path=c:\temp" kage=sage mage=gege]
```
大事故になる。

この場合はこうすればよい

```bat:hoge.bat
hoge.exe path="%~dp0." kage="sage" mage="gege"
```
これが
`hoge.exe path="c:\temp\." kage="sage" mage="gege"`
こうなって

```csharp:コンソール
i=[path=c:\temp\.]
i=[kage-sage]
i=[mage=gege]
```
全てよろし

パスとして扱いにくいフォーマットになっちゃってるので、c#なら`System.IO.Path.GetFullPath(i)`を通すとよい。
`System.IO.Path.GetFullPath(@"c:\windows\.")`→`c:\windows`となる。今度は最後にバックスラッシュが無い。
存在しないパスを指定すると例外が出てしまう

```
System.NotSupportedException はハンドルされませんでした。
  HResult=-2146233067
  Message=指定されたパスのフォーマットはサポートされていません。
  Source=mscorlib
  StackTrace:
       場所 System.Security.Permissions.FileIOPermission.QuickDemand(FileIOPermissionAccess access, String fullPath, Boolean checkForDuplicates, Boolean needFullPath)
       場所 System.IO.Path.GetFullPath(String path)
   InnerException: 
```
めんどくさい

最初から`c:\temp`と展開されるbatの記法があるといいんだけど無いっぽい？
RubyのDateTime型加減算

文字列の日付をDateTime型にして加減を行う場合のメモ。

##
```例
date = "2014/06/21"

# 月(プラス1ヶ月)
DateTime.parse(date) >> 1 # Mon, 21 Jul 2014 00:00:00 +0000
# 月(マイナス1ヶ月)
DateTime.parse(date) << 1 # Wed, 21 May 2014 00:00:00 +0000

# 日(プラス1日)
DateTime.parse(date) + 1 # Sun, 22 Jun 2014 00:00:00 +0000
# 日(マイナス1日)
DateTime.parse(date) - 1 # Fri, 20 Jun 2014 00:00:00 +0000

# 時(プラス1時間)
DateTime.parse(date) + Rational(1, 24) # Sat, 21 Jun 2014 01:00:00 +0000
# 時(マイナス1時間)
DateTime.parse(date) - Rational(1, 24) # Fri, 20 Jun 2014 23:00:00 +0000


```
因みにDatetime型に+1とした場合、単位は日となるがTime型の場合は秒になる。
Pandasメモ


# リサンプル時に補間する

時系列データを伸ばす方向にリサンプルすると補間が行われずにNaNが入る（デフォルト）。
`fill_method`オプションで埋めるようにする。

```python
df = pandas.read_csv(f, fill_method='pad')
```


# NaNの行を削除する

```python
df.dropna(how='all', inplace=True)  # inplace=Trueで自己破壊的な処理をする
```


# 重複を削除する

```python
# 自己破壊処理
df.drop_duplicates(inplace=True)

# 指定したカラムを処理
df.drop_duplicates('timestamp')

# 重複値で残す値を選択
df.drop_duplicates('timestamp', keep='last')
```
RailsでController作成時にhelperやassetsファイルが作成されない様にする


すぐ忘れるので、メモ。
Controller作成時にhelperやassets関連のファイルを作成しないようにするには以下のオプションをつけて、Controllerを作成する。

```
rails g controller コントローラー名 --no-helper --no-assets
```

またconfig/application.rbに以下の設定をしておくと、Controller作成時にいちいちオプションをつけなくても良い。

```config/application.rb
config.generators.stylesheets = false
config.generators.javascripts = false
config.generators.helper      = false
```
外部APIから取得した予想気温データをチャート表示

■追加したGem
chartkick
googlecharts


■Model

```ruby:temp_forecast.rb
require 'open-uri'
require 'json'

class TempForecast < ActiveRecord::Base
  def self.get_demo_data
    response = open('http://api.openweathermap.org/data/2.5/forecast?q=Tokyo&units=metric&appid=')
    #今回は東京の5日間の気温予測データを扱う
    #appidはログインして取得
    #openで取得してきたデータをresponseに突っ込む
    data = response.read
    #responseのデータを読みだし、dataに突っ込む
    json = JSON.parse(data)
    #JSONデータ・フォーマットにして、jsonに突っ込む
    temp_tbl = []
    #チャート表示用テーブルをつくる
    json["list"].each do |hash|
    #jsonからそのままデータを読もうとすると、冒頭のいらない位置情報がついてくるので、
    #肝心の温度データがあるlistを読む
    #.eachでjsonを頭からケツまで読む
      temp_tbl << [hash['dt_txt'], hash['main']['temp']]
    #さっき作ったtemp_tblに格納する
    #その際に、チャートに出したいdt_txt、tempを指定する
    #mainがtempについてるのは、tempがmainの下に入っているから
    end
    temp_tbl
    #チャート表示用テーブルに格納したデータを返す
  end
end
```

■Controller

```ruby:temp_controller
...
  def home
    @chart_data = TempForecast.get_demo_data
  end
...
```
■View

```html:home.html.erb
...
  <div class="col-xs-6">
  <%= line_chart @chart_data %>
  <!--棒グラフ(Line chart)を使う場合は、日時フォーマットのデータが入っていないと正しく表示されない-->
  </div>
...
```
Pryでよく使うコマンド

## Pryでよく使うコマンド
- ls
    - 現在のスコープで利用可能なメソッド、変数、定数を確認
- cd
    - オブジェクトやクラスへの移動
- whereami
    - pry内の現在のスコープレベルを確認
    - @でも代用可能
- help
    - helpのみ実行だと主要コマンド一覧が表示される。
    - メソッドやクラス指定で実行すると各メソッド、クラスの詳細ヘルプが表示される
        - 例)help
        - 例)help show-doc
- show-source
    - メソッドやクラスのソースコードを表示
    - $でも代用可能
    - 使用例
        - show-source String#length
        - $ String#length
- show-doc
    - メソッドやクラスのドキュメントを確認
    - ?でも代用可能
    - 使用例
        - show-doc String#length
- find-method
    - メソッドの定義場所を確認
    - 使用例
        - find-method chomp
- .コマンド
    - 先頭に「.」を付けるとpryを抜けずにshellコマンドを使用できる
    - 使用例
        - メモリ使用量を見たい場合
            - .free
- exit-program
    - pryを抜ける
    - !!!でも代用可能

## 参考 
- 今更聞けないpryの使い方と便利プラグイン集
    - http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f