OmniAICreator/Qiita-1.07M huggingface dataset:
「NAVERまとめに転載しないで」というテキストを出すだけのWPプラグインを作ってみた。


==追記==
WP.orgのプラグインディレクトリに掲載しました。
https://wordpress.org/plugins/ban-naver/
==追記終わり==

こんな記事が話題ですね。

【驚愕】9割パクられた記事をNAVERまとめに削除依頼したら送られてきたマニュアルはこれよ。。。：http://kitamocchi.com/2016/12/06/20878/

「いちいち記事にテキスト足すの大変だよなぁ・・・」と思いながら読んでたらこんなのできました。

Never Naver:https://github.com/hideokamoto/never-naver/releases/tag/v0.0.2

非常にシンプルな作りで、すべての記事に`※このページ内の画像をNAVERまとめに転載することを禁止します。`というテキストを足してくれます。

```php
add_filter( 'the_content', 'ban_naver');
function ban_naver( $content ) {
	$ban_word = __( '※このページ内の画像をNAVERまとめに転載することを禁止します。', 'ban-naver');
	$ban_word = esc_html( apply_filters( 'ban_word_text', $ban_word ) );
	$ban_word = "<small><b>{$ban_word}</b></small>";
	$ban_position = apply_filters( 'ban_word_position', 'top' );
	if ( 'bottom' === $ban_position ) {
		$content = $content. $ban_word;
	} else {
		$content = $ban_word. $content;
	}
	return $content;
}
```

WordPressで表示されている記事であれば全てに出力されるので、公開済みの記事がいっぱいあって対応が大変という方も安心です。

##カスタマイズ

###ページ下部に表示したい

```php
add_filter( 'ban_word_position', function($position) {
	return 'bottom';
} );
```


###メッセージをカスタマイズしたい

```php
add_filter( 'ban_word_text', function($position) {
	return '新しいテキスト';
} );
```



## 今後
とりあえずWP.orgのプラグインディレクトリへの掲載申請中です。
フィルターはありますが、管理画面から編集できるとより良さそうですね。
Amazon CognitoとUser PoolsとIAMの位置付けと混乱

##Amazon Cognitoとはそもそも何か
[認証と認可](http://dev.classmethod.jp/security/authentication-and-authorization/)のうちの認証をするやつです。
**認証の部分だけです。**
認可はIAMのroleでやります。

##認証を束ねられるのがCognito
FacebookやTwitterやGoogleやAmazonなどいろんな認証(Authentication Providersと呼ばれている)でログインしても、同一人物であれば一つのId(IdentityIdと呼ばれている）で管理できます。
FacebookやTwitterなどと並列に、自社で会員サイトをもっていれば、それも利用できます。
また、後述するUserPoolsも並列に利用できます。

ただ認証を束ねるのに使うのが目的ではないです。

##AWSリソースを自社サイト会員だけつかえるようにしたいというのが今回の目的
これは[カスタム認証](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/developer-authenticated-identities.html)を利用して実現します。

*注意：カスタム認証の際は[認証フローがちょっと違います](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/authentication-flow.html)*

qiitaだと実装に[この記事](http://qiita.com/imaifactory/items/b66cdf91118e3be6fe17)が参考になりました

##認可のグループ
・上記の認証がされたユーザーグループ
・上記の認証がされていないユーザーグループ
これら２つのグループに対してそれぞれ認可(role)を指定できます

例えば、
認証されていないユーザーにはS3のgeneralフォルダのリソースにのみアクセスできるroleを
認証されたユーザーにはそれに加えてpremiumフォルダのリソースにアクセスできるroleを
といった具合。

##混乱：User Poolsとは
Cognitoを勉強しようと思って何故かはじめにUserPoolsから勉強してしまったのが混乱の原因だった。
User PoolsはCognitoのAuthentication Providersの一つとして機能する(ただの)ユーザー管理機能。
アカウント登録やサインアップなどといったユーザー管理機能をマネージドに提供してくれるやつ。
[参照](http://dev.classmethod.jp/cloud/aws/cognito-user-pool/)

##UserPoolsに認可の機能はないのでAwsのリソースのアクセス権はわたせません
UserPoolsはもちろんAuthentication Providersの一つとしてではなく、単体で機能します。
が、認証の機能なのでAwsのリソースにアクセスさせようとするような認可の部分についてはこれのみではできません。
認証部分の実装は[こちら](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/tutorial-integrating-user-pools-javascript.html)が参考になります。
また[こちら](https://aws.amazon.com/jp/blogs/news/new-user-pools-for-amazon-cognito/)でコンソールでの設定について記載があります。

##混乱：UserPoolsの実装に認証は必要？
実装は他にも[このあたり](http://qiita.com/jobbin/items/d2fc0f714eb1f1cfc965)やこの[あたり](http://qiita.com/horike37/items/1d522f66452d3abe1203)を参考にしていた。

両方ともAWS.config.credentialsとAWSCognito.config.credentialsをセットしているが、理解ができない。
認証機能（ユーザーの登録・emailバリデーション・ログイン）だけであればAWSCognitoだけで完結するはずで、認証機能を利用するために認証が必要な仕組みの意味が理解できない。
実際AWSも使わずAWSCognito.config.credentialsも指定せずに実行してみて、問題なく動いた。
何かこちらの見落としがあるのか・・・？

##混乱：IAM単体でもFacebook認証で認可(role)を渡せる
これまた混乱するのですがIAMのRole自体にもFacebook/Google/Amazonに認証を依存できる
「IDプロバイダアクセス用のロール」というロールタイプがあります。
これよりもCognitoの方が高機能でTwitterなどもサポートしているので、こちらの機能は廃れる方向に進むのかな?

##参考になりそうな資料
http://dev.classmethod.jp/cloud/aws/cognito-identity-and-sts-web-identity-federation/
PowerShellでTCPポートに標準入力からの文字列を投入

あるTCPポートでデータが受信されるのを待っているサーバプログラムをデバッグするのに、WindowsのPowerShellからデータを投入するための簡単なスクリプトです。

参考にした記事
http://qiita.com/_norin_/items/8f534bd0531a960af5e9
http://qiita.com/alchemist/items/e6706cd425f8f5e5032e
http://tech.guitarrapc.com/entry/2013/07/21/230726
http://d.hatena.ne.jp/chabom/20100715/1279171891
https://www.ipentec.com/document/document.aspx?page=powershell-text-in

#手順
##スクリプト保存
以下のコードをテキストエディターで任意の場所に保存

```socket_client.ps1
Clear-Host
Write-Output "「>>> : 」に続いてコマンドを投入してください。"
Write-Host "Press [q] to quit" -ForegroundColor Red -BackgroundColor White
while ($TRUE)
{
  $data = Read-Host(">>> ")
  if ($data -eq "q") {break}
  $sendData = [System.Text.Encoding]::UTF8.GetBytes($data)

  $soc = New-Object System.Net.Sockets.tcpClient
  $soc.connect("localhost", 30000) # ポート番号はサーバプログラムにあわせる
  $soc.GetStream().Write($sendData, 0, $sendData.Length)
  $soc.close()
}
```

##PowerShell起動
Windowsキー ＋ R 押下
```powershell -ExecutionPolicy RemoteSigned```

##スクリプト実行
```PS C:\> C:\[任意の場所]\socket_client.ps1```

```
「>>> : 」に続いてコマンドを投入してください。
Press [q] to quit
>>> : _
```

[q]を押すまで標準入力からサーバプログラムにデータを投げられます。

※ソケットのOpen/Closeのタイミング等はサーバプログラム次第でループの外に記述してください。
【JavaScript入門】for文を使って繰り返し処理をする方法

※こちらの記事は、プロスタ編集部が学習者の多いJavaScriptの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。
参考サイト：[【JavaScript入門】for文を使って繰り返し処理をする方法](http://programming-study.com/technology/javascript-for/)

#【JavaScript入門】for文を使って繰り返し処理をする方法

プログラムの中で繰り返しを行う場合は、While文やfor文やforeach文など様々な構文を使用できます。それぞれが特徴を持った繰り返し構文であり、用途に合わせて使っていきます。

目次
1 [for文とは](##for文とは)
2 [for文の構文](##for文の構文)
3 [実際にfor文を書いてみよう](##実際にfor文を書いてみよう)
4 [breakとcontinue](##breakとcontinue)
　　　4.1 [break（ループを止める）](###break（ループを止める）)
　　　4.2 [continue（ループをスキップする）](###continue（ループをスキップする）)

##for文とは

for文は繰り返しを行う構文です。たくさんある繰り返し構文の中でも、繰り返し回数がわかる場合はfor文を使用します。逆に繰り返し回数がわからない場合は、While文などを使用することになります。

for文の構文

それでは、for文の基本構文を見てみましょう。

```
for(初期値;条件式;増減式){
    繰り返し行う処理
}
```

for文の構文は、初期値、条件式、値の増減式が指定されます。それぞれの構成は、「;(セミコロン)」で区切られます。
それぞれの単語についてご説明します。
・初期値：初めに変数に設定する値です。
・条件式：繰り返し処理を行うかどうか判断を行う式です。条件式が真ならば繰り返します。
・増減式：変数の増減を設定します。

実際にfor文を書いてみよう

それでは、実際にサンプルのプログラムを使って解説していきます。
以下は、for文を用いたサンプルコードです。まず、サンプルコードをテキストエディタに入力したら、ファイル名をindex.html、文字コードをUTF-8にして保存してください。

```
<!DOCTYPE html>
<html lang = "ja">
<head>
<meta charset = "UTF-8">
<title>JavaScrip forの使い方</title>
</head>
<body>
<script type="text/javascript">
for (var i = 0; i < 10; i++) {
	document.write (i);
}
</script>
</body>
</html>
```

保存したファイルをブラウザで開くと、次のように出力されます。

>0123456789

このサンプルでは、変数 i を宣言し、i の値によって繰り返し処理を行うか否かを判断しています。
まず、初期値は「var i = 0」と書いてあります。ここでは変数 i を宣言し、それと同時に i の初期値として0を代入しています。
次に、条件式は「i < 10」と書いてあります。これは、i < 10を満たしている限りは繰り返し処理を行う、ということを意味します。逆に、i < 10を満たさなくなった瞬間に、繰り返し処理はもう行われなくなるということです。
そして、増減式には「 i++」と書いてあります。この式は「 i = i + 1」と同じ意味です。繰り返し処理を行った後に、毎回「 i++」を実行する、つまり１回繰り返し処理をすると i が1増える、ということになります。
以上より、このプログラムの詳しい処理の流れは以下のようになります。

繰り返し1回目：i=0、i<10を満たすので繰り返し処理を実行
繰り返し2回目：i=1、i<10を満たすので繰り返し処理を実行

繰り返し10回目：i=9、i<10を満たすので繰り返し処理を実行
繰り返し11回目：i=10、i<10を満たさないので繰り返しはしない。for文から脱出し、繰り返し処理を終了する

##breakとcontinue

繰り返し処理には、途中で繰り返し処理を抜けるbreakと、実行中の処理を飛ばし、次の繰り返し処理に移るcontinueがあります。

それでは、具体例を見てみましょう。

##break（ループを止める）

break文を使って、先ほどのサンプルコードの繰り返し処理を途中で抜けるようにします。ある条件に当てはまった場合、breakが適用され、for文から抜けます。

```
<!DOCTYPE html>
<html lang = "ja">
  <head>
    <meta charset = "utf-8">
    <title>JavaScriptでfor文</title>
  </head>
  <body>
    <script>
      for (var i = 0; i < 10; i++) {
        if (i == 5) {
         break;
        }
        document.write (i);
      }
    </script>
  </body>
</html>
```

「i==5」となった時に、for文を抜けるため以下のように出力されます。

>01234

###continue（ループをスキップする）

continue文を使って、特定の処理を飛ばして、繰り返し処理の先頭に戻ります。

```
<!DOCTYPE html>
<html lang = "ja">
  <head>
    <meta charset = "utf-8">
    <title>JavaScriptでfor文</title>
  </head>
  <body>
    <script>
      for (var i = 0; i < 10; i++) {
        if (i == 5) {
         continue;
        }
        document.write (i);
      }
    </script>
  </body>
</html>
```

「i==5」となった時に、for文を飛ばし次の処理に移るため、以下のように出力されます。

>012346789

いかがでしたか。サンプルを使って、for文による繰り返し処理を実際に確かめてみましょう。
Bootstrap v4 alpha5 でレスポンシブなマージン・パディングをつける

bootstrap v4 alpha5 で `.mt-3` とか `.pb-1` とかでマージン・パディングが設定出来ますが、どうせなら `pb-lg-1` みたいな感じで幅が `lg` 以上の時だけマージンが設定される、みたいな風にしたいと思ったので、ざっと作りました。

`mixins/_grid.scss` の中身と `utilities/_spacing.scss` の中身を参考にしました。

```scss
// bootstrap をimportした後...
@each $breakpoint in map-keys($grid-breakpoints) {
  @each $prop, $abbrev in (margin: m, padding: p) {
    @each $size, $lengths in $spacers {
      $length-x:   map-get($lengths, x);
      $length-y:   map-get($lengths, y);

      @include media-breakpoint-up($breakpoint) {
        .#{$abbrev}-#{$breakpoint}-#{$size} { #{$prop}:        $length-y $length-x !important; } // a = All sides
        .#{$abbrev}t-#{$breakpoint}-#{$size} { #{$prop}-top:    $length-y !important; }
        .#{$abbrev}r-#{$breakpoint}-#{$size} { #{$prop}-right:  $length-x !important; }
        .#{$abbrev}b-#{$breakpoint}-#{$size} { #{$prop}-bottom: $length-y !important; }
        .#{$abbrev}l-#{$breakpoint}-#{$size} { #{$prop}-left:   $length-x !important; }

        // Axes
        .#{$abbrev}x-#{$breakpoint}-#{$size} {
          #{$prop}-right:  $length-x !important;
          #{$prop}-left:   $length-x !important;
        }
        .#{$abbrev}y-#{$breakpoint}-#{$size} {
          #{$prop}-top:    $length-y !important;
          #{$prop}-bottom: $length-y !important;
        }
      }
    }
  }
}
```
Mayaからクリップボードを取得設定

Maya上からクリップボードの取得設定を簡単に行う方法です。
PySide 依存ですが、Windows、OSX ともに使用できるはず・・・

#作業環境#
- Windows10 Pro
- Maya2016, 2017

#コード#
```python:maya2016.py
from PySide import QtGui
cb = QtGui.QClipboard()

# 取得
data = cb.text()

# 設定
cb.setText(u'ふがふが')
```

```python:maya2017.py
from PySide2 import QtGui
cb = QtGui.QClipboard()

# 取得
data = cb.text()

# 設定
cb.setText(u'ふがふが')
TrustZoneについて調べてみた

かれこれ2年以上動画配信サービスのアプリ開発を担当していますが、TrustZoneについて深く理解できていなかったので調べてみました。

## はじめに
多くの動画配信サービスでは、配信しているコンテンツの漏洩を防ぐためにDRM技術が利用されています。
自社制作のコンテンツだけであれば簡単なDRMをかけるだけで十分なケースも多いですが、映画会社や配給会社に放映権料を支払って調達したコンテンツを配信する場合は、高いセキュリティレベルが求められます。

そんな映画会社や配給会社からの高いセキュリティ要件を担保するためにTrustZoneの仕組みが必要になってきます。

## TrustZoneの仕様
さて本題です。

TrustZoneは、ARMのCortex-Aシリーズに標準搭載されているセキュリティ技術で主な仕様は以下の通りです。
・ARMの実行環境を「Normal World（下記図の青）」と「Secure World（下記図の緑）」に分離する
・Normal Worldには、Android等のRich OSがインストールされ、その上で様々なアプリケーションが動作する
・Secure Worldには、一般的にTEE(Trusted Execution Environment)仕様で標準化された実行環境およびアプリケーションが搭載される
・Secure World側からは、Normal Worldの全ての情報にアクセスできる
・Normal World側から、Secure Worldへの通信は制限がかけられており、一般的にTEE仕様のAPIを経由してアクセスができる

![0002745-002.jpg](https://qiita-image-store.s3.amazonaws.com/0/150011/b8dd00e1-be43-68de-9f47-d8c6a6d73925.jpeg "0002745-002.jpg")
Cortex-A向けのTrustZoneのアーキテクチャ（出典：ARM）

## TrustZone+TEEがセキュリティを高める理由
もし、TrustZone+TEEの仕組みがない場合はメインOS上で全ての機能が動作することになります。
DRMを解除するための鍵情報や、DRMを解除した後の生のコンテンツをメインOS上で扱うことになるため、もしメインOSがハッキングを受けた場合には漏洩のリスクがあります。

一方、TrustZone+TEEの仕組みを使えばDRMの解除、鍵の管理、DRMを解除した後の生のコンテンツの管理からプレイヤーへの出力までをセキュア領域内のアプリケーションで実行され、かつそれらの情報にはメインOS側からはアクセス出来ないため、もしメインOSのハッキングを受けたとしてもセキュア領域のデータは守ることが出来ます。

## AndroidにおけるTEE
https://source.android.com/security/trusty/index.html

Android KeyStoreでもTEEの技術が使われています
http://dev.fjuts.com:83/android/reference/android/security/keystore/KeyInfo.html#isUserAuthenticationRequirementEnforcedBySecureHardware()

## 参考にさせて頂いたサイト
IoT時代のセキュリティを守るARMの「TrustZone」とは何か
https://the01.jp/p0002745/

セキュアハードウェアの登場とその分析
http://www.ffri.jp/assets/files/monthly_research/MR201303_TrustZone.pdf
JavaScriptでDateオブジェクトを利用する方法とは？

※こちらの記事は、プロスタ編集部が学習者の多いJavaScriptの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。
参考サイト：[JavaScriptでDateオブジェクトを利用する方法とは？](http://programming-study.com/technology/javascript-date/)

今回は、JavaScriptの組み込み関数の１つ、Dateオブジェクトを使って日付を表示する方法について解説します。

簡単に言えば、「Dateオブジェクト」を利用すると日付を取得して表示させることができるようになります。詳しい使い方は下記の様になります。まずは特徴をチェックしてみましょう。

目次 
1 [日付を取得する](##日付を取得する)
2 [年・月・日を一気に取得する場合の方法](##年・月・日を一気に取得する場合の方法)
3 [パラメータを細か分けて表示する方法とは？](##パラメータを細か分けて表示する方法とは？)
4 [おわりに](##おわりに)

##日付を取得する

今日の日付を取得したい場合の方法

```
var time = new Date();
```

指定の日付を表示させたい場合の方法
```
var time = new Date('2016-10-01');
```
と行うと日付を取得することができます。最初に変数に入れて、それを使うことがポイントです。

##年・月・日を一気に取得する場合の方法

上記のやり方では、日付を取得してくるだけで応用がありませんでした。今回は「年や月」「曜日」「分や秒」などを取得できる方法を解説していきます。

```
var time = new Date('2016-10-01');
var year = time.getFullYear();
var month     = time.getMonth()+1;
var date = time.getDate();
$('span').text(year + '年' + month +'月 ' + date  + '日'
```

と入力することで、HTML側では下記のような表示に切り替わります。

実行結果
>2016年10月01日

##パラメータを細か分けて表示する方法とは？

ここからはさらにパラメータを細かく分けて解説していきます。

|パラメータ|	範囲|
|---|---|
|分・秒	|0~59|
|時間	|0~23|
|曜日	|0~6|
|日	|1~31|
|月	|0~11|
|年	|西暦の下2桁|

###年を表示させる方法

```
var time = new Date();var year= time.getFullYear();
```

※.getYear()というのもあるのですが、これは1900年から数えた数値を出力するので注意。たとえば、2016年の場合、2016-1900=116なので、116という値が出力されます。

###月を表示させる方法

```
var time = new Date();
var month     = time.getMonth()+1;
```
※初期の設定で必ず「0」から始まるので、数字表記を行う場合は「＋1」を加える必要がある

###日を表示させる方法

```
var time = new Date();
var date= time.getDate();
```

###曜日を表示させる方法

```
var time = new Date();
var day= time.getDay();
```

###時を表示させる方法

```
var time = new Date();
var hour= time.getHours();
```

分を表示させる方法

```
var time = new Date();
var min= time.getMinutes();
```

秒を表示させる方法

```
var time = new Date();
var sec= time.getSeconds();
```

※今回はわかりやすいように全て変数名を「var time」としていますが、変数名は自由に設定して行って頂いて大丈夫です。


##おわりに

いかがだったでしょうか。Dateオブジェクトには似た表記のメソッドが多く、変数の中に「new Date();」等を代入することが必要です。そのため違和感を感じるなど最初のうちは「使いづらい」かもしれません。しかし、使いこなすことで年・月・日・曜日など簡単に出力することができます。ぜひ参考にしてみてください
【非エンジニアデータ分析初心者向け（カブトムシ好きも可）】データ分析に困ったときは「データの視覚化」をしてみよう

この記事はフロムスクラッチ [Advent Calendar 2016](http://qiita.com/advent-calendar/2016/fromscratch)の7日目の記事です。
#想定読者
このエントリーは、以下のような人を対象にしています。少しでも、お役に立てたら幸いです。

- 最近ビックデータ活用やデータ分析という言葉を聞いて、分析してみたい！と一念発起した方
- とはいえ、エクセルは少々使ったことがある程度、統計もわからないし、何から初めていいのやら…と悩んでいる方
- たまたま行き着いたカブトムシ好きのマニアックな方

#自己紹介
フロムスクラッチというベンチャーにて、コンサルタントとして自社プロダクト（B→Dash）の導入支援、活用のサポートをしている新卒1年目です。これまでアパレルEC中心に複数のクライアント様の事業のお手伝いをする中で、文系出身ながら日々データと格闘させていただいております。

#データ分析を始めるにあたって
最近「ビックデータ活用」や「データサイエンティスト」など、
「データ」に関連するキーワードが周りに溢れています。

読者の皆さんの中にも、
「社内にあるデータをとりあえず分析してみてよ！」と
上司から無茶振りされた経験をお持ちの方がいらっしゃるのではないでしょうか。

しかし、いざやろうとしたものの、
「難しい統計用語の意味がわからない」
「エクセルや分析ツールを使いこなすITスキルがない」
「そもそもデータって何！？」と
何からすべきかわからない方もいらっしゃいますよね。
（むしろそのような方が大半かと思います。）

本日はそのような方々向けにデータ分析の足がかりの一つとして
「データの視覚化」について書かせていただきます。

#データの視覚化
まずは以下のデータを見てください。
![image](https://qiita-image-store.s3.amazonaws.com/0/152008/9ec152ec-33f6-fdb9-e44e-7332820343b1.png)

これは自分が大学時代に収集したカブトムシのデータです。
例えば、このデータを分析して何か示唆だしをしてくれ、と頼まれたとします。

データの内容は以下となっています。
```bodywidth：前胸幅（カブトムシ界隈では体長ではなく前胸の幅を指標にします）
hornlength：頭角長（角の長さ）
```
まずは真っ先に思い浮かぶ、平均と最大値/最小値を出してみましょう。
```前胸幅
平均：22.72mm
最大値：27.75mm
最小値：16.12mm
```
```頭角長
平均：27.98mm
最大値：35.08mm
最小値：12.11mm
```
どうですか？
正直「うーん、ここからどうしよう？」となりますよね。
ここで次の一歩として今回のてーまである「データの視覚化」をしてみましょう。

一般的な視覚化の手法である以下の2つを今回は行います。
- ヒストグラム
- 散布図


まずはヒストグラムから。
###前胸幅
![image](https://qiita-image-store.s3.amazonaws.com/0/152008/b243622d-70ef-bd37-3309-91515b2b9cf0.png)
###頭角長
![image](https://qiita-image-store.s3.amazonaws.com/0/152008/a6be9d87-35e3-efa7-254a-14505c6119c6.png)

いかがですか？
前胸幅は平均を中心に1つの山になっていますが、
一方で頭角長には山が2つありますよね。不思議です。

続いて頭角長と前胸幅の関係性をみるために
散布図（縦軸：頭角長、横軸：前胸幅）を書きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/152008/77199723-0ae6-f110-9516-d1cc81e846fa.png)
この散布図をよく見ると
以下のように2つのグループに分かれそうですよね。
![image](https://qiita-image-store.s3.amazonaws.com/0/152008/ff9ba769-6515-35cf-a4f8-2ae3c63a9564.png)

このようにデータを視覚化することによって
何らかのきっかけ（傾向、違いなど）を見つけることができれば、
- そもそも違いって本当にあるんだっけ？（検定）
- 2つの違いって何なんだろう？（比較）
といった一歩先の分析に進めます。

自分は所属していた大学で捕まえたカブトムシにおいて
2つのグループが存在することを上記の方法で確認したうえで、
自然界では常に自然淘汰による最適化が行われているという仮説のもと、
資源（幼虫時の栄養摂取量）制約付きの効用最大化問題と戦闘戦略の分析を行いました。
（我ながら今振り返ると変なことやっていますね…笑）

実際の分析では
- データ分析の目的が明確か？
- 目的に沿った分析を行うのに必要なデータ、ツール、体制が整っているか？
がデータ分析の成否に大きく影響します。

それでも、
まずは視覚化してみるだけでも新たな発見があるので、
ぜひ試してみてください！

#実務でのデータ分析
最後に自社にて行っている
データ分析を少しだけ紹介させていただきます。

実務での分析といえば、
「おむつとビールがしばしば一緒に買われている」で有名なバスケット分析や
広告効果を分析するアトリビューション分析といった分析が一般的です。

弊社でも上記のような分析をすることもありますが、
広告データ、Web/Appデータ、ビジネスデータ（顧客情報や売上情報）を
統合することが出来るという自社プロダクトB→Dashの強みを活かして、
ランク付けした顧客に対してWebやアプリ、広告、売上などの情報を紐付けることで
ストーリー性のある分析を行い、クライアント様の事業成長をサポートしています。
#まとめ
- データ分析に困ったらまずは視覚化してみよう
- カブトムシって不思議で面白い（興味ある方はコメント下さい）

※データ分析よりカブトムシに興味を持った方には以下の本がおすすめです
[カブトムシとクワガタの最新科学 (メディアファクトリー新書)](http://amzn.asia/gWtUrjk)
mysqlでblocked because of many connection errors発生

mysqlで接続エラーが発生していたので、忘れないようにメモ。


### エラー

mysqlで下記のようなエラーが発生。

```sql
Host 'x.x.x.x' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
```

### 原因    

しきい値を超えて、**連続**で接続に失敗すると発生する模様。

しきい値はmax_connect_errorsの値で、デフォルト値は100(MySQL 5.6.6より前は10)。
↓で値を確認。

```sql
SELECT @@global.max_connect_errors;
```

[公式のリファレンス](https://dev.mysql.com/doc/refman/5.6/ja/blocked-host.html)を見ると、下記のように書いてある。

```text
max_connect_errors システム変数の値は、連続して接続要求が中断された場合にそれを許可する回数を決定します。
(セクション5.1.4「サーバーシステム変数」を参照してください。)接続が成功せずに max_connect_errors 回要求が失敗すると、
mysqld は何らかの問題があると見なし (たとえば、何者かが侵入しようとしている)、
FLUSH HOSTS ステートメントを発行するか、mysqladmin flush-hosts コマンドを実行するまで、そのホストが接続できないようにします。
```

攻撃を受けていると判断される模様。

### 対応

コネクション数をflushする。

```sql
FLUSH HOSTS;
```

max_connect_errorsの値を変更

```sql
SET GLOBAL max_connect_errors=300;
```
CHIRIMENを起動しよう！

こんにちは！

最近[CHIRIMEN Open Hardowareコミュニティ](https://chirimen.org/)でも遊んでいる@tadfmacです。

CHIRIMEN Open Hardwareコミュニティは、先日の[Ogaki Mini Maker Faire 2016](http://ommf.iamas.ac.jp/)にも参加させていただきました！本当に楽しかった！

![ommf](http://img2.dfm.lrv.jp/chirimen-1/cover.png)

※写真でプレゼンしているオジサンは私ではありませんw

というわけで、Advent Calendar空いているようなので、CHIRIMENについて少し書いてみたいと思います。

# CHIRIMENとは?

CHIRIMENはGPIOやI2C経由で繋がるハードを含めたWebアプリが作れるSBC（シングルボードコンピュータ）です。
SBCとして有名なRaspberry Pi等と異なる特徴は「Webアプリ」でハードを含めた制御を行う点です。
Raspberry Piなどでは、node.jsやpythonなどからGPIOを制御しますが、CHIRIMENではボード上のブラウザから直接GPIO/I2Cが制御できます。

現在CHIRIMENの最初のバージョンである「[Echigo Rev.1](https://www.switch-science.com/catalog/2833/)」が、スイッチサイエンスさんで販売されています。

今回はCHIRIMENの起動方法とファームウエアアップデートについて紹介します。

# 起動のための準備

「[Echigo Rev.1](https://www.switch-science.com/catalog/2833/)」を購入すると、下記が同梱されています。

- CHIRIMENボード本体
- HDMIケーブル（HDMI標準オス→microHDMIオス）
- USB電源ケーブル
- USBケーブル（Aオス→microBオス）

![Echigo Rev.1の箱に入っているもの](http://img2.dfm.lrv.jp/chirimen-1/include.jpg)

CHIRIMENを起動させるには、上記とは別に下記が必要です。

- HDMIモニター（1080p推奨）
- USBマウス
- USB2.0ハブ（2ポート以上）
- USB WIFIドングル（ReUdo RE-UW100、PLANEX GW-USNANO2Aなど）
- USB充電器（最低1A以上の電流供給可能なもの。USBやGPIOに接続する機器・デバイスによっては電流が足りなくなるので2A程度のものを推奨）

![追加で必要なもの](http://img2.dfm.lrv.jp/chirimen-1/extensions.jpg)

# 起動方法

CHIRIMENの起動については、下記にドキュメントがあります。

- [CHIRIMENの起動方法](https://chirimen.org/docs/ja/basic_startup.html)

上記手順通りにモニターや電源、マウス、WIFIドングルなどをつないで電源を入れてみましょう！

# 最初に最新版のファームウエアにUpdateしよう

現在スイッチサイエンスさんから購入可能な「[Echigo Rev.1](https://www.switch-science.com/catalog/2833/)」は最初の起動時時はAndroidが立ち上がる場合があるようです。（2016/12月現在）
Androidが立ち上がった状態ではCHIRIMENがサポートするGPIOやI2Cを利用したWebアプリで遊ぶことができませんのでファームのUpdateが必要です。

↓のような画面が表示されたらアップデートが必要ですが、1度アップデートすれば普通に使えるようになりますので安心してください！

![CHIRIMENの画面(Android)](http://img2.dfm.lrv.jp/chirimen-1/android.jpg)

# WindowsかLinuxを用意してアップデート

CHIRIMENのファームウエアアップデート方法は、下記に手順があります。

- [Windowsを使ってCHIRIMENのファームウエアをUpdateする手順](hhttps://chirimen.org/docs/ja/firmware_update_guide_for_windows.html)
- [Linux(ubuntu)を使ってCHIRIMENのファームウエアをUpdateする手順](https://chirimen.org/docs/ja/firmware_update_guide_for_linux.html)

> 残念ながら、Macでのアップデート方法は現在コミュニティで検討中の状況です。

アップデート後にCHIRIMENを起動して、下記のような画面が表示されたら成功！
(B2Gというブラウザで動くOSが立ち上がっています)

![CHIRIMENの画面(B2G)](http://img2.dfm.lrv.jp/chirimen-1/success.jpg)

# 今回はここまで！

~~次回は、いよいよWebアプリについて書いてみたいと思います！~~
次回はCHIRIMENのGPIOピンの話を書きます。
tableタグの内部のword-wrap:break-wordが機能しない

こんなにストレスがたまるプログラミング言語はそうもないですよね。CSSの修正では毎度頭を悩まさられます。

今回はtableタグのテキストが改行しないで、Tableを突き破る現象を回避します。

##基本
一般的に改行処理は、

```css
word-wrap: break-word;
overflow-wrap : break-word;
```

を使われることが多いと思います。

##問題
しかし、tableタグないでは上記スタイルが効きません！！
CSSを作った人はだれなんでしょうか。こんな不完全な....


##回避策

table-layout: fixedをつけましょう。

```css
table {
table-layout: fixed;
}
```


これで回避できます。
CSSがまともなプログラミング言語になるか、この世から消えることを切に願います。
【Ruby入門】日付と時刻を取得する方法（Dateクラス）

※こちらの記事は、プロスタ編集部が学習者の多いRubyの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。
参考サイト：[【Ruby入門】日付と時刻を取得する方法](http://programming-study.com/technology/ruby-date/)


#【Ruby入門】日付と時刻を取得する方法（Dateクラス）

Rubyで時刻や日付を取得したい場合、DateクラスやDateTimeクラスを使用します。

##日付を取得する

日付を取得する場合は、Dateクラスを使用します。
例えば、今日の日付を取得して表示させるプログラムは以下のようになります。

```
require "date"   #Dateクラスを使えるようにする
now = Date.today  #Date.today(今日の日付)を変数todayに代入する
puts now  #変数nowを表示させる。(=変数nowの中に格納されている今日の日付を表示する)
```

出力すると、以下のように表示されました。(2016年9月12日時点)


このように、プログラムが実行された時点での日付を簡単に表示させることができます。

ちなみに、3行目の変数のうしろにメソッドを付けることによって、表示させたい情報のみを抜き出して取り出すこともできます。

year　：　年のみを取り出す
month ：　月のみを取り出す
day ： 日のみを取り出す
例えば、現在は何月なのかを表示するプログラムは以下のようになります。

```
require "date"
thisMonth = Date.today
puts "現在は#{thisMonth.month}月です。"
```

このプログラムを実行すると、以下のように表示されます。

>現在は9月です。

もちろん同じようにして、日付のみ表示させたり年のみ表示させたりすることもできます。

##時刻を取得する

Dateクラスは日付のみを取得できましたが、時刻も扱いたい場合にはDateTimeクラスを使用します。DateTimeクラスでは日付と時刻を両方扱えます。

現在の時刻を表示させるプログラムは以下のようになります。日付を表示するのとほとんど同じです。

```
require "date"   #DateTimeクラスを使えるようにする
nowTime = DateTime.now  #.DateTime.now(現在の時刻)を変数nowTimeに代入する
puts nowTime  #変数nowTimeを表示させる。(=変数nowTimeの中に格納されている今の時刻を表示する) 
```

このプログラムを実行すると以下のように表示されます。(2016年9月15日 20時41分時点)

>2016-09-15T20:41:22+9:00

馴染みのない表記ですが、これは世界スタンダードの時刻表記です。よく見ると、その日の日付と今の時刻がTで区切って表示されています。

さらにこれも、Dateクラスと同じように任意の情報だけを抜き出すことができます。
DateTimeクラスでも、Dateクラスで使用できるメソッドの時に使用できる3つに加えて、以下の時間に関わるメソッドが使用できます。

hour : 時を表示する
minute : 分を表示する
second : 秒を表示する
これを使用して、現在の時・分・秒を表示するプログラムを書いてみます。

```
require "date"
nowTime = DateTime.now
puts "現在の時刻は#{nowTime.hour}時#{nowTime.minute}分#{nowTime.second}秒です。"
```

このプログラムを実行すると、以下のように表示されます。

>現在の時刻は20時50分25秒です。puro


このように、プログラムを実行した時点の現在時刻が表示されます。日付だけ使いたいとき、時刻も一緒に扱いたいときなど、場面に応じて二つのクラスを使い分けるとよいでしょう。
初めてのGo言語

※ 玄人の方々には目に毒ですので、ぜひ見ないであげてください。

何やろうかな、

特に何のネタもないな。

暇つぶしにGo言語ってのをやってみようっと。
(検索するときは「go」で検索してもポケモンGoばかり出てきます。「言語」や「プログラム」というワードと一緒に検索してください。)

# 先ずは、説明を読む。

http://golang.jp/go_spec
3割読む...、まあやってみます！

# インストール

https://golang.org/dl/
ここから落としてきて、インストールすれば良い。

試すだけなら、
http://ideone.com/
などのサイトでできますね。

# とりあえず、「hello world」

``` hello.go
package main

import "fmt"

func main() {
    fmt.Printf("hello, world!\n")
}
```

```
go run hello.go
```

を実行、

```
Hello, world!
```
ちゃんと表示されたので、インストールもちゃんとできている事が確認できました。


### 少し気になったこと
* セミコロンはほとんど不要(自動でつくそうです。)
* 括弧「(」、「)」もほとんど不要
* 「:=」←何これ？、初期値を宣言するときに使うみたいです。 var x = 0　→ x := 0

# 基本の書き方

## if

```
if x > 0 {
}
```


## for

```
for i := 0; i < 10; i++ {
}
```

```
m := map[int]string{1:"逃げ恥", 2:"校閲", 3:"ダヴィンチ"}
for key,value := range m { // keyが不要な場合は「_」
    fmt.Printf("%d位 : %s\n", key, value)
}
```

```
1位 : 逃げ恥
2位 : 校閲
3位 : ダヴィンチ
```

## switch

```
x := 73
switch {
case 80 <= x && x <= 100:
    fmt.Printf("優\n")
case 70 <= x && x < 80:
    fmt.Printf("良\n")
case 60 <= x && x < 70:
    fmt.Printf("可\n")
default:
    fmt.Printf("不可\n")
}
```

```
良
```

## 並列処理がしたい！

基本的な、使い方はなんとなくわかってきました、

Go言語は並列処理が得意らしいので、下手くそなりにやってみました。

```futsu.go
package main

import (
    "fmt"
    "time"
)

func main() {
    for i := 1; i <= 3; i++ {
        time.Sleep(time.Duration(i) * time.Second)
        fmt.Printf("私待つわ%d号\n", i)
    }
}
```
これだと、1+2+3 = 6秒かかります。

これを並列処理で実行できるように書き換えます。
goroutineとchannelというのを利用して書くみたいです。
・goroutineは go [関数] と使う。(goto文みたいな感じですかね？)
・channelとはgoroutine間でメッセージパッシングするもの。
また、チャネルはFIFO(キュー)です。入れたものから順番に取り出します。

```pararel.go
package main

import (
    "fmt"
    "time"
)

func main() {
    c := make(chan int)
    for i := 1; i <= 3; i++ {
        go waitTime(c, i)
    }
    <-c
    <-c
    <-c
}

func waitTime (c chan int, i int) {
    time.Sleep(time.Duration(i) * time.Second)
    fmt.Printf("私待つわ%d号\n", i)
    c <- i
}
```

```
c <- t
```
でchannelに送信して、

```
<-c
```
でchannelから受信してます。これを書かないと受信を待たないので、何も表示されません。

これだと、並列で動くので３秒で完了します。

# まとめ
普段PHPがメインなので、並列処理が羨ましいと思います。
もっと勉強して使ってみたいです。


#　参考サイト

参考サイト:http://golang.jp/
【Ruby入門】文字列を比較する方法

※こちらの記事は、プロスタ編集部が学習者の多いRubyの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。
参考サイト：[【Ruby入門】文字列を比較する方法](http://programming-study.com/technology/ruby-mojiretsu-hikaku/)

#【Ruby入門】文字列を比較する方法

今回はRubyで、文字列を比較する方法について解説します。

##文字列を比較する

Rubyでは、２つの文字列の比較をする時に、「==演算子」と「！=演算子」を用います。

==演算子の場合は、比較しあった文字列が同じであるならば「True」を返り値として返し、そうではなかった場合は「False」を返り値として返します。
例えば、「string == string」ならば「True」であり、「string == other-string」ならば「False」という結果となります。

また、！=演算子を用いると==演算子とは反対の結果が返り値として返ってきます。
例えば、「string== string」ならば「False」であり、「string == other-string」ならば「True」という反対の結果となります。

##文字列の大小を比較する

文字列の大小を比較する場合は、「<」、「<=」、「>」、「>=」演算子を用います。大小の比較とは、辞書的な順序を調べるということです。

また、「<」と「<=」、「>」と「>=」の違いですが、<=ならば、0 < 1という意味と0 = 0という意味の２つが組み合わさった演算子記号となります。 つまり、大小を比較する事と等しいかどうかを比較する事を同時に行えるということです。 例えば、

```
word1 = "あいうえお"
word2 = "かきくけこ"
```
とした時、「word1 > word2」ならば「True」であり、「word1 < word2」ならば「False」という結果になります。
【Ruby入門】while文（繰り返し処理）の使い方

※こちらの記事は、プロスタ編集部が学習者の多いRubyの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。
参考サイト：[【Ruby入門】while文（繰り返し処理）の使い方](http://programming-study.com/technology/ruby-while/)

#【Ruby入門】while文（繰り返し処理）の使い方
今回はRubyのwhile文（繰り返し処理）について解説します。
繰り返し処理についてさらに理解を深めたい方は、for文（繰り返し処理）の使い方をご覧ください。

目次 
1 [while文の書き方](##while文の書き方)
2 [while文を使ってみる](##while文を使ってみる)
3 [breakを使ってみる](##breakを使ってみる)

##while文の書き方

while文とは「指定した条件にあてはまる間、処理を繰り返し続ける」というループ処理です。
Rubyにおけるwhile文は以下のように書きます。

```
while 条件 do
   内容
end
```

1行目は、while文のはじまりです。ここからwhile文を書き始めますという宣言をして、ループする条件を指定します。doは省略可能です。
2行目からループさせる内容を書きます。もちろん何行書いてもかまいません。
最後の行のendは、「while文はここまでですよ」という意味です。

##while文を使ってみる

では、実際にwhile文を使ったプログラムを書いてみましょう。
今回は「○回目です」という文字列を5回表示し、○の部分には現在何周目なのか、数を表示するというプログラムを書いてみます。


```
i = 1
        #変数iの初期値を設定
while i <= 5 do
        #変数iが5以下の場合繰り返し
  puts "#{i}回目です。"
        #ループする処理の内容
  i += 1
        #変数iへ1を足す
end
        #while文ここまで
```

このプログラムを実行すると、以下のように表示されます。

・実行例
>1回目です。
2回目です。
3回目です。
4回目です。
5回目です。

<h2>breakを使ってみる</h2>

while文の中でbreakという処理を使うと、指定した回数に達したときループを抜けることができます。そのとき、breakはif文と合わせて使用されます。

例えば、これはループする回数をユーザーに決めさせたとき、膨大な数値を入力してしまいプログラムがなかなか止まらなくなってしまうという事態を防ぐためなどに利用できます。言わば、while文におけるループの上限を決められる処理と言えるでしょう。

breakを使った文は例えば以下のように書きます。

```
i = 1
while i<10000 do
   if i===5
     puts "5回目です。ループを抜けます。"
     break
   end
 puts "#{i}回目です。"
 i +=1
end
```
while文の中にif文を組み込み、もし変数iが条件である10000に満たなくても5回目になったらループを抜けられるようになっています。

このプログラムを実行すると、以下のように表示されます。

実行例
>1回目です。
2回目です。
3回目です。
4回目です。
5回目です。ループを抜けます。

このように「10000回に満たなければループする」と条件を指定していても、5回目でループを抜けるように指定しているため「4回目です」という文字列を表示したあと、5回目でifの条件に当てはまり、「5回目です。ループを抜けます。」という文字列が表示されてbreakが実行されてループが止まります。
【Ruby入門】case文を使った条件分岐の方法

※こちらの記事は、プロスタ編集部が学習者の多いRubyの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。
参考サイト：[【Ruby入門】case文を使った条件分岐の方法](http://programming-study.com/technology/ruby-case/)

#【Ruby入門】case文を使った条件分岐の方法

##case文の書き方

case文とは、条件分岐の記述方法の1つで、変数の状態を確かめる際に使用します。
Rubyでのcase文の書き方は以下のようになります。

```
case 比較対象
 
when 条件1 then
	条件1に一致した際の処理
when 条件2 then
	条件2に一致した際の処理
when 条件3 then
	条件3に一致した際の処理
else
	どれにも一致しない際の処理
end
```

おそらく初心者の方がこれだけ見ても、何のことかさっぱりかと思います。また、同じ条件式として使用するif文との違いもわかりにくいかもしれません。下部に理解を深めるために、例を通しながら、情報を掘り下げていくので、もう少しお付き合いください。

##if文とcase文との違い

if文とcase文とでは条件分岐するという意味では同じものの、それぞれ使用する際に比較対象の個数が大きな違いです。

[case文の場合]
1つの比較対象に対して複数の条件分岐を可読性の高いシンプルな書き方を実現可能。

[if文の場合]
複数の比較対象を組み合わせて条件分岐でき、複雑なロジックを実現可能。

下記はif文を使用した簡単な例です。


puts "性別を教えて下さい。(man:1 woman:2)"
sex = gets.to_i
 
puts "年齢を教えて下さい。"
age = gets.to_i
 
``` 
if age > 20 && sex == 1 then
	puts "あなたは成人男性です。"
elsif age < 20 && sex == 1 then
	puts "あなたは成人していない、男性です。"
elsif age > 20 && sex == 2 then
	puts "あなたは成人女性です。"
elsif age < 20 && sex == 2 then
	puts "あなたは成人していない、女性です。"
else
	puts "入力情報が不正です。"
end
```

このように、複数の比較対象（ageとsex）を比べることが可能です。ただし、複雑なロジックが可能というメリットを実現する代わりに、可読性も落ちやすくなります。(ageとsexを比べ、条件式が混在しているので)

また、実際の開発現場では、もっと複雑な条件が重なることも多いです。そのような場合は、不具合が出た際には原因特定に至るのに時間を要する可能性もあるので、あまり条件が多くなりすぎても保守性が低くなるのです。

##case文を実際に使ってみる

では、保守性の高いシンプルなコードを実現できるcase文です。下記はcase文を使用した簡単な例です

```
puts "Please enter any of 1 to 12"
month = gets.to_i

case month

when 3,4,5 then
	puts "Spring"
when 6,7,8 then
	puts "Summer"
when 9,10,11 then
	puts "Autumn"
when 12,1,2 then
	puts "Winter"
else
	puts "Error"
end
```

どうでしょうか？このように、一つの比較対象（month）の状態を比べるのに使用できます。1つに絞ることにより、シンプルさを追求することができ、比較対象の状態を確認することができるので、数千行等のソースコードになったとしても、バグがでにくい、または出ても原因特定しやすいというメリットも得られます。

##まとめ

if文でも同じロジックを実現することは可能なものの、case文を書くことによって保守性の高いソースファイルを書くことができ、非常に開発現場で重宝する書き方でもあります。少しロジックを考えることに慣れてきて、問題なく書けるようになってきたなら、是非ともcase文の書き方をマスターされてはいかがでしょうか

参考サイト：[【Ruby入門】case文を使った条件分岐の方法](http://programming-study.com/technology/ruby-case/)
Mac OSXの画面をちょっと見やすくする。

MacOSXの画面が、時々見づらいと思うときがあります。

以下設定で見やすくなりました。

通常以下のようになっています。
ここで、コントラストを上げるを選択します。
<img width="780" alt="スクリーンショット 2016-12-07 16.05.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/47947/31c80c54-af66-7d55-85db-3da06bc947e7.png">

ボーダーラインがハッキリするなど見やすいです。
<img width="780" alt="スクリーンショット 2016-12-07 16.05.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/47947/8827e6ae-60b5-7ec4-d11f-5a3301a007f6.png">
Jenkins2 オフライン環境で Plugin を 手動インストール メモ

# Jenkins2 オフライン環境で Plugin を 手動インストール メモ
オフライン環境で Plugin を 手動インストールするメモ。

1. オンラインのJenkins２を別途用意して、対象のプラグインをインストールする。
2. オンラインのJenkins２で`/var/lib/jenkins/plugin/`配下の1.）でインストールした対象プラグイン関連ファイル(foobarというplugin名の場合：foobar.jpi,foobar/)をまるっとコピーする。※`/var/lib/jenkins/`はCentOSの場合なので、自環境に応じて適宜`JENKINS_HOME`へ読み替えてください

3. オフラインのJenkins２の `/var/lib/jenkins/plugins/`配下へ2.）のファイル群をまるっとコピーする。
4. オフラインのJenkins２で `http://YOUR_JENKINS_URL/restart`　と入力しJenkins2のリスタートを行う。
※：YOUR_JENKINS_URLは自環境に応じて適宜置き換えてください

参考 https://wiki.jenkins-ci.org/display/JENKINS/Plugins#Plugins-Howtoinstallplugins
【Ruby入門】for文（繰り返し処理）の使い方

※こちらの記事は、プロスタ編集部が学習者の多いRubyの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。
参考サイト：[【Ruby入門】for文（繰り返し処理）の使い方](http://programming-study.com/technology/ruby-for/)

#【Ruby入門】for文（繰り返し処理）の使い方

##for文の書き方

for文を使うと、指定した範囲だけ処理を繰り返せます。
for文は以下のように書きます。

```
for 変数 in 範囲 do
    処理内容
end
```

doはwhile文のときと同様、省略可能です。

[１行目]
まずfor文がここから始まりますよ、という宣言をします。続いて、ループの範囲を入れるための変数を用意し、繰り返しの始点と終点の範囲を指定します。この範囲は、数値で指定することができます。数値で指定する場合は「0..5」のように書きます。これは0から5という意味です。実は、数値以外に配列やハッシュを範囲に指定することもできますが、これはもっと慣れてきてから学んでもいいでしょう。

[２行目]
ループさせたい内容を書きます。もちろん、何行書いてもかまいません。

[3行目]
最後の行で、for文はここまでですよという宣言をします。

for文は同じループ処理をする方法として、しばしばwhile文と比較されます。for文はwhile文と比べると、おおまかに次のような違いがあります。
まず、while文は条件に当てはまる限り処理を続けるという命令であるのに対し、for文は指定した範囲の始点から終点にかけて、処理内容を繰り返す処理となります。
さらにfor文は始まりと終わりが1行目の時点で設定できるので、始まる前の変数の初期値設定も、ループごとに変数内の数値を加算する処理も必要ありません。

##for文を使ってみる

それでは、実際にfor文を使ったプログラムを書いてみます。0から5までの範囲で、現在変数iの中に入っている数は何なのか表示するプログラムを書くとしましょう。すると、コードは以下のようになります。

```
for i in 0..5 do
                #0から始めて、変数iの中身が5になるまで処理をします。
   puts "現在の変数iの中身は#{i}です。"
                #変数iの中身を表示します。
end            
		#for文ここまで
```

範囲に数字を指定する場合、始点と終点を「..」（ピリオド2つ）で繋ぎます。
このコードを実行すると、以下のように表示されます。

実行結果
>現在の変数iの中身は0です。
現在の変数iの中身は1です。
現在の変数iの中身は2です。
現在の変数iの中身は3です。
現在の変数iの中身は4です。
現在の変数iの中身は5です。

0から5までを表示し、6回処理をした形となりました。0から数えた5は実質6個目ですから、このように処理されたというわけです。
while文は「何回処理を繰り返すか」にこだわった条件設定が得意ですが、for文は「どこからどこまで処理をするか」にこだわった条件設定が得意だと言えるでしょう。
海外ユーザのためのVAddyの時刻表示

これは[VAddy Adventカレンダー](http://qiita.com/advent-calendar/2016/vaddy)7日目の記事です。
VAddyは、継続的なWeb脆弱性検査を簡単に実現できるSaaSです。
https://vaddy.net/ja/

私の好きなクラフトビールで第1位は[デモーレン Vuur&Vlam](http://blog.ichikaway.com/entry/2016/12/06/102026)と紹介しました。第2位は、BrewDogのJack Hammer IPAです。これです！！美味しいです！！
六本木に[BrewDog直営のバー](http://brewdogbar.jp/)があるので是非そこで飲んでみてください。毎日あるわけではないので、もし無かったら次の日にも行ってみてください！ 一人で行くのに気が引ける人は私を誘ってください！


## 海外ユーザへの対応
VAddyは海外展開も行っているため現在は海外ユーザの割合が半分ほどになっています。したがって海外ユーザのタイムゾーンも考慮した設計にする必要がありました。
現在考慮しているのは下記の3つです。

- 画面上の現地時刻変換
- APIサーバが返すデータの時刻
- バッチ処理の実行時間

今回は「画面上の現地時刻変換」と「APIサーバが返すデータの時刻」の2つを説明したいと思います。

## 画面上の現地時刻変換
VAddyで扱うデータの中で時間に関するものは、検査実行時間や何かデータ登録・編集した時間です。ですので、オークションや定時実行を前提とするようなシビアな時間処理は必要ありません。

現在はDBのレコードは全てUTC(GMT)で保存しています。
画面上では、DBから取得した時刻データを[moment.js](http://momentjs.com/)というjsライブラリを使って処理しています。これを使うことで、ユーザのローカル時間に合わせて時差を変換してくれるので大変便利です。

DBからデータを取得すると `2016-12-07 15:29:30` という形式のため、その文字列をそのまま`moment.js`に渡して時差変換しています。

`moment.js`のライブラリを読み込んだ状態で下記のようにします。

````javascript
$time = '2016-12-07 15:29:30';
moment.utc( $time ).local().format("YYYY/MM/DD HH:mm:ss");
````

`utc()`というメソッドを使うと、渡したデータがUTC基準であると認識してくれます。これを元に`local()`メソッドを使って現地時間に変換し、最後に時刻出力フォーマットに整形しています。

## APIサーバが返すデータの時刻
APIサーバから返すデータはUTCで、フォーマットは[ISO 8601](http://qiita.com/kidatti/items/272eb962b5e6025fc51e)という形式です。
`2014-06-12T11:11:11+0000` 
このようなフォーマットになっていて、時刻の最後に+0900のようにUTCからの時差を付与するものです。
APIサーバから返すデータはプログラムが処理する可能性が高いため、あえて時差変換して返すよりも決まったフォーマットで時差が分かるようにしたほうが扱いやすいためです。

ちなみに、VAddyの脆弱性検査で脆弱性を発見するとAPIからは下記のJSONが返ってきます。
脆弱性があった場合は、`alert_count`が1以上になります。
`scan_result_url`にセットされているURLにアクセスすると、脆弱性があったURLと該当パラメータなどの情報確認できます。

````json
{ "status":"finish",
  "fqdn" : "www.example.com",
  "scan_id" : "1-837b5f9f-e088-4af5-9491-67f7ce8035a4",
  "scan_count" : 22,
  "alert_count" : 1,
  "timezone" : "UTC",
  "start_time" :  "2014-06-12T11:11:11+0000",
  "end_time" :  "2014-06-12T11:11:11+0000",
  "scan_result_url" : "https://console.vaddy.net/scan_status/1/1-837b5f9f-e088-4af5-9491-67f7ce8035a4",
  "complete" : 100,
  "crawl_id" : 30,
  "scan_list" : ["XSS","SQL Injection"]
}
````

APIの利用方法は[APIマニュアル](https://github.com/vaddy/WebAPI-document/blob/master/VAddy-WebApi-ja.md)を参照ください。
このAPIをコマンドラインから簡単に操作するgolangで作ったツール[go-vaddy](https://github.com/vaddy/go-vaddy)も公開しています。こちらはバイナリもgithubに置いているのでダウンロードすればすぐに利用できます。
iOS 检测字符串是否包含emoji字符


```Objective-C
- (BOOL)stringContainsEmoji:(NSString *)string {
    __block BOOL returnValue = NO;
    [string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
        const unichar hs = [substring characterAtIndex:0];
        // surrogate pair
        if (0xd800 <= hs && hs <= 0xdbff)
        {
            if (substring.length > 1)
            {
                const unichar ls = [substring characterAtIndex:1];
                const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
                if (0x1d000 <= uc && uc <= 0x1f918)
                {
                    returnValue = YES;
                }
            }
        }
        else if (substring.length > 1)
        {
            const unichar ls = [substring characterAtIndex:1];
            if (ls == 0x20e3 || ls == 0xFE0F || ls == 0xd83c)
            {
                returnValue = YES;
            }
        }
        else
        {
            // non surrogate
            if (0x2100 <= hs && hs <= 0x27ff)
            {
                returnValue = YES;
            }
            else if (0x2B05 <= hs && hs <= 0x2b07)
            {
                returnValue = YES;
            }
            else if (0x2934 <= hs && hs <= 0x2935)
            {
                returnValue = YES;
            }
            else if (0x3297 <= hs && hs <= 0x3299)
            {
                returnValue = YES;
            }
            else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50)
            {
                returnValue = YES;
            }
        }
    }];
    return returnValue;
}

```
【FileMaker】小計行に色をつけてExcelの集計っぽくする

はい、今日は、[AdventCalendar 2016 FileMaker Tips](https://qiita.com/advent-calendar/2016/filemaker-tips/) 12/07の記事です。

子どもがいるとアルアルですが、昨夜から子供が嘔吐しまくりで、諸々スケジュールを調整して臨戦体制の我が家です。
おかげで、落ち着いて寝ているすきに今日の小ネタを披露する時間ができました。

よく、Excelとかでは、セルに色をつけて、集計行や小計タイトルを見栄え良く作ったりしますね。
![スクリーンショット 2016-12-07 15.29.38.png](https://qiita-image-store.s3.amazonaws.com/0/60538/ee203a33-eb1e-fe79-4690-d8fca4ef1c19.png)
↑こんな感じですかね。

FileMakerでももちろん集計はできますが、色つけが小技ですかね。
通常パート単位の色つけは、インスペクタで１色しかできませんよね。（グラデーションは別として）
ちょっとした小技で、↓こんな感じで色分けできます。
![スクリーンショット 2016-12-07 15.33.34.png](https://qiita-image-store.s3.amazonaws.com/0/60538/bc7222cb-da86-08cc-642e-34a3c4c53a7a.png)

レイアウトモードにしてみると、↓のような感じで設定されているのがわかります。
![スクリーンショット 2016-12-07 15.33.56.png](https://qiita-image-store.s3.amazonaws.com/0/60538/557a3de6-0352-343b-d4e8-7a6cb7053e81.png)

実は、下行のパートに、同じ色の図形をはめ込んでいるだけなのです。。。
![スクリーンショット 2016-12-07 15.34.18.png](https://qiita-image-store.s3.amazonaws.com/0/60538/bfa89823-d17e-1225-9046-9eeb251e6bf4.png)
この時のポイントは、「線」の設定を「なし」にしておくことです。
何もいじらなければ、線がうすーく引かれていると思いますが、線があるとそれっぽく見えませんので、「なし」に設定します。

二つ目の集計も同様に、下行（今回はボディ）に同じ色の図形をはめ込んでいます。
![スクリーンショット 2016-12-07 15.34.25.png](https://qiita-image-store.s3.amazonaws.com/0/60538/398c32c2-aa1e-036b-6fab-77ba752008ef.png)

図形のサイズが行の高さからずれていると、表示されないケースがありますので、そこだけ気をつけてくださいねー。

では、看病に戻ります！
OCamlの環境構築[WINDOWS]

opam init

・エラーになった場合

$ opam init
Checking for available remotes: rsync and local, git.
  - you won't be able to use mercurial repositories unless you install the hg
    command on your system.
  - you won't be able to use darcs repositories unless you install the darcs
    command on your system.

[WARNING] Recommended external solver aspcud not found.
[WARNING] Recommended dependencies -- most packages rely on these:
            - cc


ccが入ってないよと言っているので、
cygwinのインストールで、パッケージを追加する。
[java] OO進数<=>int OO進数<=>バイト列　変換方法まとめ

スマートカードアプリを作る時にAPDUを扱う場面などに、しばしば16進数の文字列をバイト列にしたり、バイト列を2進数の文字列にしたりすることがあったので、まとめておこうと思いました。

変数名はsrc(変換前) => val(変換後)

## int => OO進数(String) ①
```java
String val = String.format("%04d", Integer.valueOf(src));
```

- 10進数は``"%d"``、8進数なら``"%o"``、16進数なら``"%x"``
- ``Integer.valueOf()``でInteger型にキャストしている。
- ``"%04d"``は0埋め４桁で表示するという意味。

## int => OO進数(String) ②
```java
String val = Integer.toBinaryString(src); // 2進
String val = Integer.toOctalString(src); // 8進
String val = Integer.toHexString(src); // 16進
```
- Stringのフォーマットをしたいときは①がおすすめ

## OO進数(String) => int　①
```java
int val = Integer.decode(src);
int val = Integer.decode("0" + src); // 8進
int val = Integer.decode("0x" + src); // 16進
```
- srcが"0x0fa2"のように前方に"0x"の表記を持ってる場合、何進数かを自動判別してint型に直してくれるので便利。

## OO進数(String) => int　②
```java
int val = Integer.parseInt(src, 2);
int val = Integer.parseInt(src, 8);
int val = Integer.parseInt(src, 16);
```
- 何進数かもともとわかってるときはこっちが便利。

## OO進数(String) => XX進数(String)
上の２つを組み合わせれば良いので割愛

## 16進数(String) => バイト列(byte[]) ①
```java
byte[] val = Hex.decodeHex(src.toCharArray()); // 16進数
```
- [Apache Commons Codec](http://commons.apache.org/proper/commons-codec/)のHexクラスが必要
- srcの英字は小文字
- srcの長さが奇数だとエラー。

## 16進数(String) => バイト列(byte[]) ②
```java
byte[] val = DatatypeConverter.parseHexBinary(src);
```
- srcの英字は小文字でも大文字でも可
- srcの長さが奇数だとエラー。

## バイト列(byte[]) => 16進数(String) ①
```java
String val = new String(Hex.encodeHex(src));
```
- [Apache Commons Codec](http://commons.apache.org/proper/commons-codec/)のHexクラスが必要

## バイト列(byte[]) => 16進数(String) ②
```java
String val = "";
for(byte b : src){
	val += String.format("%02x", (b & 0xff));
}
```

## バイト列(byte[]) => 2進数(String)
```java
String val = "";
for(byte b : src){
	for(int i=0; i<8; i++){
		val += String.format("%d", (b & 0x80)/0x80);
		b <<= 1;
	}
}
```
- 内部のfor文は、「bの最左ビット(0か1)をvalに付け加え、bを左シフトする。」という動作を8回(1byte=8bit分)繰り返してる。

## 2進数(String) => バイト列(byte[])
```java
int num = Integer.parseInt(src, 2);
String hex = String.format("%x", Integer.valueOf(num));
while(hex.length() < src.length()/4) hex = "0" + hex;
byte[] val = DatatypeConverter.parseHexBinary(hex);
```

- 「 **2進数(String)=>int** 」 -> 「 **int=>16進数(String)** 」 -> 「 **16進数(String)=>バイト列(byte[])** 」という流れ。
- ３行目のwhile文は、たとえばsrcが **"00000110"** の時に、hexが **"c"**ではなく、 **"0c"** となるようにするため。

## 参考
- http://qiita.com/shuhei/items/d9992b0224860140aa31
- http://weblabo.oscasierra.net/java-hex-convert-1/
Cloud9でTabキーを押した時のインデント幅を変更したい

#インデント幅が揃わない


何も考えずにコードを書いていたら、ある時GitHub上でソースを共有することになり、「インデント幅を揃えた方が見やすいかも」というアドバイスをいただきました。

確認するとファイルごとにインデント設定が違うようで、マチマチな設定が混在していて困ってしまいました。おそらくクローンしたファイルが入っているため、設定が違っているものが混ざってしまったようです。

初歩的すぎる話のせいかググっても情報が少なくて困りましたが、いろいろ調べてわかったことを、自分メモ兼ねて書いておきます。


+ インデント幅を変更する方法

+ 編集中のファイルでインデント幅を一斉に変える

+ デフォルト設定を直すには


#こんな症状

<img width="281" alt="スクリーンショット 2016-12-07 13.42.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/151343/56b03613-726f-04b9-ff25-7141780b3a5f.png">

（Tabキーを打つごとに、スペースが２つ分開いている）

<img width="293" alt="スクリーンショット 2016-12-07 13.40.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/151343/377dc372-3cc4-5d9d-64dd-168e22846f87.png">

（Tabキーを打つごとに、スペースが４つ分開いている）

#インデント幅を変更する方法

Cloud9のエディタでファイルを開くと、右下に文字があります。

![スクリーンショット 2016-12-07 13.56.49.jpg](https://qiita-image-store.s3.amazonaws.com/0/151343/888d1fd3-377d-218a-4e44-0cb498c07505.jpeg)

ここで、**Spaces:**という文字がインデント設定になっています。

クリックすると小窓が立ち上がり・・


<img width="226" alt="スクリーンショット 2016-12-07 13.57.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/151343/1beeb316-02d9-6e94-d5de-7b3c33716716.png">



**Tab Size**という部分で、インデント幅をスペース何個分にしたいかを設定することができる。

#編集中のファイルでインデント幅を一斉に変える

この設定を変更しても、すでに入力された部分については、スペース幅が変更されません。

例えば・・

+ **Tab Size**の指し示すスペース数を４→２に減らした場合、すでに入力されたインデント１段（スペース４つ分）は、インデント２段（スペース２つ×２段）と解釈されます。

+ **Tab Size**の指し示すスペース数を２→４に増やした場合、すでに入力されたインデント１段（スペース２つ分）は、そのまま残ります。設定後に入力したインデント（スペース４つ分）の階層から、半段ずれたインデントが残る形になります。

いずれにせよ設定を変えた後に階層がずれて、かえってトラブルのもとになりそうです。

古いインデント設定になっている部分を含めて一斉に幅を変えるためには、

<Ol>
<li>いったん元のインデント幅に戻す。<br>
仮にインデントをスペース４つ分→２つ分に変更したいとしたら、ここで<b>Tab Size</b>を４にする
<li>インデント設定画面の下の方にある<b>Convert to Tabs</b>をクリック<br>
これで、スペース２つがタブ記号１つに変わる<br>

<img width="192" alt="スクリーンショット 2016-12-07 14.18.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/151343/599f5851-c024-651f-a6be-fd0191d2150f.png">

<li>インデント幅を変更する<br>
ここで初めて<b>Tab Size</b>を２にする
<li>先ほどの画面（小窓の下方）で<b>Convert to Spaces</b><br>を押す。<br>
</Ol>


これで一斉に変更できる。

#デフォルト設定を直すには

ファイルごとにやっていると大変なので、新規ファイルに関してはデフォルト幅の設定を変更しておきたい。

1) 右上の歯車アイコンをクリック
2) **Code Editor(Ace)**をクリック
3) **Soft Tabs**の設定を変える

これでデフォルト設定が変わります。

<img width="461" alt="スクリーンショット 2016-12-07 12.53.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/151343/472bde38-8cc9-464c-5f46-66f91faca10c.png">


というわけで、みなさまにも幸せなCloud9ライフを！
マイクロベンチマークツール、JMHについて

# これは何？
これは[Java Advent Calendar 2016 \- Qiita](http://qiita.com/advent-calendar/2016/java)の9日目の記事です。
8日目の記事は[cero_t](https://twitter.com/cero_t)さんの[Optimizing JavaというJavaパフォーマンス系の書籍が面白そう](http://d.hatena.ne.jp/cero-t/20161208/1481169299) でした。
10日目は @sh-ogawa さんです。


# 最初に

Javaでプログラムを書くとき、そのロジックのパフォーマンスについて思いをはせたことはありますか？
コーディングルールや、先輩の教えをそのまま鵜呑みにして書いていませんか？

例えば、文字列の結合はStringBuilderを使えと教わり、何の疑いもなくそのまま書いていませんか？
先輩の教えは尊いものです。無下にしてはいけません。
しかしながら、その教えは実は古いバージョンでは有効だったが、最新バージョンでは古い知識だったということもあるかもしれません。

または、重たい処理ロジックを書いてしまったけど、金の弾丸で解決すればいいや、と思っていませんか？

普段のコーディングではあまりパフォーマンスを意識しないかもしれませんが、この記事を読んでいる間だけでも、ちょっとだけ意識してみませんか？

# パフォーマンス測定について
処理したい範囲をSystem.currentTimeMillis();で囲んで、差を引き算するというやり方をよく見かけます。
果たして、それは正しい測定方法なのでしょうか。
プログラム全体の処理速度を測るのであれば、そのやり方でも問題ないと思います。
しかし、プログラムの中の、何回も、何百回も、何万回も呼ばれる特定のメソッドの処理速度を測定する時はちょっとだけ再考していただきたいのです。

パフォーマンス測定の話が出ると、必ずウォームアップという言葉が出てきます。
これについては、[Javaの理論と実践: 動的コンパイルとパフォーマンス測定](https://www.ibm.com/developerworks/jp/java/library/j-jtp12214/) 等を参照してください。

では、どうすればいいのでしょうか。
手助けの一つとして、[OpenJDK: jmh](http://openjdk.java.net/projects/code-tools/jmh/)というOpenJDKが開発しているツールがあります。

# 簡単な紹介
JJUG CCC 2016 fail で20分お話しました。
そのときのスライドを参照してください。
[JMH超入門 \- Docs\.com](https://docs.com/deaf_tadashi/1630/jmh)

# IDEでの動かし方について
Mavenが使えればいいので、eclipse、NetBeans、 IntelliJ IDEA のどれでも動きます。
※OpenJDKのページの、Related projectsのところに[IntelliJ IDEA JMH Plugin](https://github.com/artyushov/idea-jmh-plugin)があるのですが、使い方がよくわかりませんでした。使いこなせた方、教えてください。

# サンプルソース等
[JMH Samples](http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/)
この中にあるコードを一通り触ると、大体の感触はつかめると思います。

# 私の過去のJMHに関する投稿

## 導入及び、動かし方メモ
- [Javaのベンチマークツール、JMHの導入 \- Qiita](http://qiita.com/deaf_tadashi/items/8bb4a76f3116ef195296)
- [Javaのベンチマークツール、JMHにテストコードを書いて計測してみる \- Qiita](http://qiita.com/deaf_tadashi/items/19ed0529b5c8e1937f4f#_reference-58c1e5b4a09128226991)
- [Javaのベンチマークツール、JMHをコマンドラインから実行するときのメモ \- Qiita](http://qiita.com/deaf_tadashi/items/1d4556c7c4f376d1ba77#_reference-d73fc868a3f5428e5594)

## 実際に測定してみた例
- [Java9で文字列の結合の速度を確認する \- Qiita](http://qiita.com/deaf_tadashi/items/73b9d4ecbfe6f8b14e8f)
- [Stringのequalsメソッドの速度を調べてみた \- Qiita](http://qiita.com/deaf_tadashi/items/3f0fbda83bf1156091da)
 
# JMHをどこで使うか
## 趣味としての使い道
今後、Qiitaや、自分のブログでパフォーマンス測定結果を載せる時は System.currentTimeMillis(); で囲んだ結果ではなく、JMHを使ってみませんか？

## 業務での使い道
メインとなるプログラムの中で、JMHを使うことはほぼないと思います。
別のサンプルプログラムを書き、その中にテストしたいメソッドをコピーして実行するという使い方が主になるのではないでしょうか。
私が現在関わっている業務では、JMHを組み込めていないので自分の業務ではこのような使い方をしている、というのがあれば教えてください。
ライブラリーのテストの場合は、テスト対象のメソッドを作り、この中からライブラリーの目的となるクラス、メソッドを呼び出す形での測定が最もやりやすいと思います。

# 心がけたいこと
先輩の教えは尊いものです。過去の経験則からのアドバイスもあると思います。
ですが、1から10まで鵜呑みにするのではなく、気になったことは自分で検証しましょう。
そして、検証した結果、先輩の教えと違う結果が出た場合はその旨、先輩に報告してどうすべきか真剣に考えましょう。
パフォーマンスは向上していても、可読性がとても下がった、メンテナンスが難しいコードになってしまっては意味がありません。
可読性を優先すべきこともあるかと思います。
JMHでのテスト結果のみを以て、自分の考えを貫き通すことだけは止めましょう。
さよなら Nitrous.io

<img width="1280" alt="スクリーンショット 2016-12-07 15.01.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/7046/7b4b4eca-4108-d53b-9b7a-f33ace0f7585.png">

- 2016-12-14 でクローズする
- Nitrous.io のサービスは `Nitrous solo` として近日中にオープンソース化する
Middleman で meta_tags gemを使う

まぁ、 https://github.com/ngs/middleman-ogp とか使っても良いんですが、Railsのコードを流用したい時に柔軟に扱えるのは結構メリットあるかなーということで紹介。

```rb
# Gemfile
gem 'meta-tags'
```

```config.rb
require 'meta_tags/view_helper'
helpers do
  include MetaTags::ViewHelper
end
```

これだけで、Railsで使うときと同じように使meta_tagsを使えるようになりました。
Apache Kafkaをローカルで簡単に試す方法

# Dockerでkafkaを立てる
公式イメージがなかったので人気があるものを選択しましたー

```
$ git clone https://github.com/wurstmeister/kafka-docker
$ cd kafka-docker
$ git checkout 0.9.0.1
$ vi docker-compose-single-broker.yml
zookeeper:
  image: wurstmeister/zookeeper
  ports:
    - "2181:2181"
kafka:
  build: .
  ports:
    - "9092:9092"
  links:
    - zookeeper:zk
  environment:
    KAFKA_ADVERTISED_HOST_NAME: 192.168.99.100
    KAFKA_CREATE_TOPICS: "test:1:1" 
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
$ docker-compose -f docker-compose-single-broker.yml up -d
```

# クライアント
## クライアントインストール
```
$ brew install kafka 
```

## コマンド
お好きなようにいじいじしますー

```
# 確認
$ kafka-topics --describe --zookeeper 192.168.99.100:2181
  
# トピック一覧
$ kafka-topics --list --zookeeper 192.168.99.100:2181
  
# 生成
$ kafka-topics --create --zookeeper 192.168.99.100:2181 --replication-factor 1 --partitions 1 --topic test_topic

# 削除
$ kafka-topics --delete --zookeeper 192.168.99.100:2181 --replication-factor 1 --partitions 1 --topic test_topic

# プロデュース
kafka-console-producer --broker-list 192.168.99.100:9092 --topic test_topic
  
# コンシューム
kafka-console-consumer --zookeeper 192.168.99.100:2181 --topic test_topic --from-beginning

```
pipを7.1.0から9.0.1に更新した

## 概要

久しぶりに使おうと思ったらだいぶ古いみたいだったので更新してみた。

Macでvirtualenv使っているよ。

更新内容はここ
https://pip.pypa.io/en/stable/news/

## 環境

* OS X 10.11.6
* pip 7.1.0 → 9.0.1


## バージョン確認

```bash
$ pip -V
pip 7.1.0 from $VIRTUAL_ENV/lib/python2.7/site-packages (python 2.7)

$ pip list -o
You are using pip version 7.1.0, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```

## 更新する

``` bash
$ pip install --upgrade pip
You are using pip version 7.1.0, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 371kB/s
Installing collected packages: pip
  Found existing installation: pip 7.1.0
    Uninstalling pip-7.1.0:
      Successfully uninstalled pip-7.1.0
Successfully installed pip-9.0.1
$ pip -V
pip 9.0.1 from $VIRTUAL_ENV/lib/python2.7/site-packages (python 2.7)
```

### なんか警告的なのが出た

``` bash
$ pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
pip (9.0.1)
setuptools (18.0.1)
wheel (0.24.0)
```

listのデフォルトフォーマットをcolumnsに変えるよ、この警告非表示にするには `pip.conf` 設定してねって感じなので言われたとおりにする。

## pip.confをいじる

``` $VIRTUAL_ENV/pip.conf
[list]
format=columns
```

``` bash
$ pip list
Package    Version
---------- -------
pip        9.0.1
setuptools 18.0.1
wheel      0.24.0
```

警告出なくなった。