OmniAICreator/Qiita-1.07M huggingface dataset:
Check! Azure Container Instances (ACI) 登場！単一のコンテナを必要な時にさくっと使いたいときに！

こんにちは！ @dz_ こと、大平かづみです。

Prologue - はじめに
====
最近コンテナに興味があって勉強中なところに、「すばやく簡単にコンテナを！」なんていう Azure の新サービス、 [Azure Container Instances (ACI)](https://azure.microsoft.com/ja-jp/services/container-instances/ "Microsoft Azure Container Instances | Microsoft Azure") が発表されました！

- [Fast and Easy Containers: Azure Container Instances | ブログ | Microsoft Azure](https://azure.microsoft.com/ja-jp/blog/announcing-azure-container-instances/)

アナウンス記事をチェック！
====
さくっと、アナウンスの記事を要約してみます。

（※ 誤訳、誤解釈ございましたらご指摘くださいますと幸いですm(_ _)m）

Summary
----
### 前置き

- コンテナ技術は、アプリケーションの開発やデプロイ、運用・保守のやり方を劇的に変え、今やオープンスタンダードとなりつつあります。
- そんなコンテナをすばやく簡単に利用できる新サービスをローンチします！**Azure Container Instances (ACI)** です。

### Azure Container Instances (ACI) とは

- すばやく簡単に、単一のコンテナを起動できる
 - オーケストレーションを考慮しなくてよいという逆転の発想！？
- ベースになる仮想マシンは Azure が管理してくれる
    - スケール可能らしい
- 用途に合わせて、メモリや vCPU を指定できる
- ロールベースのアクセスコントロール (Role-Based Access Control (RBAC))
- 個々のコンテナ間は、ほかのユーザーからセキュアに隔離されている
- パブリックプレビュー

#### 課金まわり
- 秒単位の従量課金！
- ビリング用にタグを、コンテナごとに指定できる

#### デプロイまわり
- Azure CLI または ARMテンプレートでデプロイ
    - Azure Cloud Shell からも利用できる
- Linux コンテナが利用可能、Windows コンテナは数週間で対応予定
- レジストリ
    - Docker Hub
    - プライベートレジストリ
    - Azure Container Registry
- クイックスタートはこちら！
    - [Quick Start](https://docs.microsoft.com/en-us/azure/container-instances/container-instances-quickstart)
    - [元記事]((https://azure.microsoft.com/ja-jp/blog/announcing-azure-container-instances/)
)でも動画による紹介あり

#### その他
- Kubernetes との連携
    - オープンソースの [ACI Connector for Kubernetes](https://github.com/azure/aci-connector-k8s) をリリース
        - Kubernetes から ACI にデプロイできる
        - Kubernetes から ACI のコンテナを操作できる
    - Helm や [Draft](https://github.com/Azure/draft) との連携も提供していく予定
- Cloud Native Computing Foundation (CNCF) に参加したそうです
    - 詳細はこちら:  [Microsoft joins Cloud Native Computing Foundation | Blog | Microsoft Azure](https://azure.microsoft.com/en-us/blog/announcing-cncf)
 
Epilogue - おわりに
====

実は、 Getting Started 的な記事を書こうとしましたが、元記事で紹介されてる動画見れば十分なくらいなので、元記事をぜひご参照ください！ ヾ(oゝω・o)ﾉ))
Stateless Functional Component in React 0.14 での注目機能と変更箇所！

完全備忘録
読みにくいと思います。ごめんなさい。

##　class based componentの書き方基本

```example.js

class Text extends React.Component {
  render() {
    return <p> {this.props.children}</p>;
  }
}

React.render(<Text>Hello World</Text>, document.body);

```

ただ、コンポーネントの中に状態を保持する必要がない場合は'extends React.Component'は飛ばしても大丈夫。

## stateless componentの書き方基本

```sample.js
const Text = (props) => (
  <p>{props.children}</p>
)

ReactDOM.render(
  <Text>Hello World</Text>,
  document.querySelector('#root')
);

```
## 使用方法

上で示したように適切なpropsのコードを返すstateless functional componentsを書くこともできる。propsのタイプをコントロールできなくなるわけではない。でファルトのpropsとタイプを記入できる。

Sample1 : propsのタイプを記入するのと一緒にデフォルトを定義するパターン
Sample2 : argumentsを記入するのと一緒にデフォルトを定義するパターン

```sample1.js

import React, { Component, PropTypes } from 'react'

const Test = ({ children }) =>
  <p>{children}</p>

Text.propTypes = { children: React.PropTypes.string };
Test.defaultProps = { children: 'Hello World' };

```
```sample2.js

import React, { Component, PropTypes } from 'react'

const Test = ({ children = 'Hello World' }) =>
  <p>{children}</p>

Text.propTypes = { children: React.PropTypes.string };

```

１よりも２のほうがおすすめ。
defaultPropsは文脈によって変化してしまうためpureではなくなってしまう。
argumentsに初期値を記入するパターンは文脈によって変化することがなく安定している。そのため２のほうがおすすめ！

## Contextの使い方

contextのタイプをstateless functional component で定義したい場合

- 1. argumentの２つ目をつくる
- 2. childContextTypes
必ずstaticにする。それにより子孫のコンポーネントにタイプが受け継がれることになる。 似ているのは'propTypes'。
static childContextTypes = { *** } をつかうとchildComponentのタイプを定義できる

- 3. getChildContext
proptypeのメソッド。コンテクストのオブジェクト。一度定義すると子孫に引き継がれる。状態が変化したり、コンポーネントが新しいpropsを受け取るたびに呼ばれる。
getChildContext() { *** }を使うとchildComponentのcontextを定義できる。

```sample.js
// Functional stateless component 
const Text = (props, context) => (
  <p style={context}>props.children</p>;
);
Text.contextTypes = {
  fontFamily: React.PropsTypes.string
};

class App extends React.Component {
  static childContextTypes = {
    fontFamily: React.PropTypes.string
  }
  
  getChildContext() {
    return {
      fontFamily: 'Helvetica Neue;
      // そのコンポーネントの既定値を使いたいなら fontFamily: this.props.fontFamily
    }
  }
  render() {
    return <Text>Hello World</Text>;
  }
}

```

child componentのタイプを親のコンポーネントで定義すると、そのあと派生して作られたchild componentに自然と情報が伝わる。そのためタイプを定義するのはparent componentのほう。childからparentに定義した情報は伝わらない。
遺伝子と同じだ。
親の遺伝子は子供に伝わるけど、子供の遺伝子は親に伝わらない。
rubyにおけるメソッドについて

# メソッドとは

メソッドというのは複数の処理をまとめたもの。

# メソッドの書き方

```ruby:test

def say
  puts "Hi"
end
say
```

上記のようにdefの後にメソッド名を書いて後はそのメソッド名のみを書いたら処理が実行されます。

# オブジェクトに対して処理する時

```ruby:test

オブジェクト.メソッド名(引数1, 引数2, ...)

```

## 引数について

```ruby:test

def say(name)
  puts "Hi #{name}"
end
say("tarou")
```

上記のようにメソッド名の後ろに引数を設定することができます。

```ruby:test

def say(name = tom)
  puts "Hi #{name}"
end
say("tarou")
```

引数に=でデフォルト値を設定することもできます。これで引数が設定されていないときはデフォルト値が設定されます。

# 注意点

* （）は省略可能
* メソッド内の変数は外に出せない
Bluemix の Cloudant に Node.js の cradle で画像ファイルをアップロード

次のページで行うことと同じことを、Node.js の cradle を使って行いました。

[Bluemix の Cloudant に python3 で画像ファイルをアップロード](http://qiita.com/ekzemplaro/items/89e831e30c56e0773d2d)

cradle についての情報は、

[flatiron/cradle](https://github.com/flatiron/cradle)

ダウンロードのサンプルは、こちら。

[Bluemix の Cloudant から、 Node.js で画像ファイルをダウンロード](http://qiita.com/ekzemplaro/items/9eb1ef05a758f192cc90)

```js:to_cloudant.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	to_cloudant.js
//
//					Jul/27/2017
//
// ---------------------------------------------------------------
var cradle = require ('cradle')
var fs = require('fs')
// ---------------------------------------------------------------
console.log ("*** 開始 ***")
//
const keys = ["DSCF0001","DSCF0002"]
//
const service_username = '44b508dd-f332-4f91-81f2-78369c7d29d9-bluemix'
const service_password = 'de44b508dde666c2a5c16596fc3713762e08a61e7132d3b21ecaaf1f63a835fae64'
const service_host = 'efc189dc-f332-4f91-81f2-785129c7d29d9-bluemix.cloudant.com'
const service_port = '443'

const options = {
	cache : true,
	raw : false,
	secure : true,
	auth : {
		username : service_username,
		password : service_password
		}
}

var cc = new (cradle.Connection)(service_host, service_port, options)

const db_name = 'jpg'
var db = cc.database (db_name)

db.exists (function (err, res_exists)
	{
	if (err)
		{
		console.log('error', err)
		}
	else
		{
	 	if (res_exists)
			{
			db.destroy (function (err,res)
				{
				console.log ("*** db is destroyed ***")
				db_create_proc (db,keys)
				})
			}
		else
			{
			db_create_proc (db,keys)
			}
		}
	})

	console.log ("*** 終了 ***")
// ---------------------------------------------------------------
// [4]:
function db_create_proc (db,keys)
{
	db.create(function (err,doc)
		{
		for (var it in keys)
			{
			const key = keys[it]
			data_input_proc (db,key)
			}
		})
}

// ---------------------------------------------------------------
// [4-4]:
function data_input_proc (db,key)
{
	const file_jpg = key + '.jpg'

	console.log (key)

	const image = fs.readFileSync (file_jpg)

	const attachmentData = {
		name: file_jpg,
		'Content-Type': 'image/jpeg',
		body: image
		}

	db.saveAttachment (key,attachmentData,function (err,res)
		{
		console.log (err)
		console.log (res)
		})
}

// ---------------------------------------------------------------
```
rubyにおける条件分岐（case,if）

# 条件分岐について

〜な時に〜の処理をするというもの。rubyではcaseとifどちらも使える

# ifによる条件分岐

```ruby:test
score = 80
if score > 90
  puts "great!"
elsif score > 70
  puts "so so"
else
  puts "bad"
end
```

elsifで条件を追記することができ、上から順に条件にあったものの処理を行う。

```ruby:test

if score > 90 then

```

上記のように後ろにthenを入れてもいいが省略してもいいので基本は省略。

# caseによる条件分岐

```ruby:test

case signal
when "red"
  puts "stop"
when "green","blue"
  puts "go"
else
  puts "go"
end

```

caseで対象オブジェクトを指定し、そのオブジェクトがなにかによって条件分岐を行う。


# 比較演算子について

長くなりそうだから他にまとめる

# caseとifの使い分け

caseとifの違いは比較対象の個数の違いが大きく、caseはcaseの後に指定したもののみで条件分岐をできるがifは複数の対象を使い、条件分岐ができる。
R勉強会のコンテンツ

#R勉強会のコンテンツ
前半：数値解析・グラフ描画 - Rのコマンドに触れてもらう
【数値解析・講義】25分
・データ分析とは
・Rのインストール方法
・RStudioの利用方法
・基本的な操作
・基本的な演算(ベクトルの概念)
・データの入出力(読み込みは多くのライブラリー)がある
・関数の利用
・基本統計量
・パッケージの利用
・Hondaローカルでパッケージをインストールするためには
ダウンロードサイトからダウンロード
Rのパッケージフォルダに追加

【数値解析・演習】15分
Exercise 1,2,3

【グラフ描画・講義＆演習】15分
 Exercise 5,6,7,8

５分休憩

後半：言語解析
【言語処理・講義】
・MeCab/RMeCabの導入
・関数の説明

【言語解析・演習】

【講義＆演習】
・データを取り出して頻出単語を出力
データを取り出す（read_excl）
Message行をoutputに代入
テキストとして出力
それをRMecabFreqに入力
頻度を解析する。

宿題
・実習問題Ex1-8をトライ
Extra 
・Try R 1-8 までをクリア
・データから頻出単語を抽出

機械学習編は要望があれば開催。
VBS Wordファイルのパスワードを解除し、パスワードがなければパスワードをかける

#スクリプト

```vbnet
Option Explicit
'Word 2013 Later Available
'REF: http://stabucky.com/wp/archives/4346
'REF: https://oshiete.goo.ne.jp/qa/9023979.html
'''///---定数の設定Set Enumuragion---///'''
 Const wdStory=6
 Const wdLine=5
 Const PWD="PASS"
'''///---変数の宣言---///'''
 Dim objArgs, I , strFile
 Dim objFile, objFolder,objPath,strScr
 Dim str,sTg,sVB,biP,wdApp,wDoc
 Dim objWShell : Set objWShell = Createobject("WScript.Shell")
 Dim FSO : Set FSO = Createobject("Scripting.FileSystemObject")
'''///---ファイル処理開始 Start Document File Conversion---///'''
 Set objArgs = Wscript.Arguments
For I = 0 to objArgs.Count-1
  set objFile = FSO.GetFile(cstr(objArgs(I)))
   If Lcase(Left(FSO.GetExtensionName(objFile.Path) ,3) )="doc" Then
     set wdApp = CreateObject("Word.Application")
     wdApp.Visible = True
'式.Open(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format, Encoding, Visible, OpenConflictDocument, OpenAndRepair, DocumentDirection, NoEncodingDialog)
'WScript.Echo "objFile.Path is" ,objFile.Path
     Set wDoc =wdApp.Documents.Open(objFile.Path,,False,False,PWD)
     Wscript.Sleep 1000
       if wdoc.Haspassword = True Then
'文末に改行を挿入し削除(何らかの変更がないと上書き保存できない) Add VbCrlf at Document End And Delete for Save
          With wdoc
            .Activate
            wdApp.Selection.HomeKey wdStory
            wdApp.Selection.MoveDown wdLine, 1
            wdApp.Selection.EndKey wdStory
            wdApp.Selection.TypeParagraph
            wdApp.Selection.TypeBackspace
          End With
'式.SaveAs2(FileName, FileFormat, LockComments, Password, AddToRecentFiles, WritePassword, ReadOnlyRecommended, EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData, SaveAsAOCELetter, Encoding, InsertLineBreaks, AllowSubstitutions, LineEnding, AddBiDiMarks, CompatibilityMode)
          wDoc.Saveas2 objFile.Path,,,"",False,"",False
          Wdoc.Close
       Else 'In Case of Without Password File, Add PassWord
''''///If you do not like this feature ,delete start Line///''''
          With wdoc
            .Activate
            wdApp.Selection.HomeKey wdStory
            wdApp.Selection.MoveDown wdLine, 1
            wdApp.Selection.EndKey wdStory
            wdApp.Selection.TypeParagraph
            wdApp.Selection.TypeBackspace
          End With
           wDoc.Saveas2 objFile.Path,,,PWD,False,"",False
''''///If you do not like this feature ,delete End Line///''''
          Wdoc.Close
     End If
     Set wdoc = Nothing
     wdApp.Quit
     Set wdApp = Nothing
   End If
   Set objFile = Nothing
Next
Set FSO = Nothing
```

#ポイント


1.　Wordの場合、なにか変更しないと更新できないため、最後の文章で改行等を消しているのです。 
2.　またパスワードがないファイルはパスワードがあっても無視して開きます。
3.　このためhaspasswordでチェックしパスワードをがない場合にはパスワードつきに変更して保存します。
4.　3の機能が不要なときは''''///If you do not like this feature ,delete start Line///''''からの行を削除してください。
5.　動作はWord2013以降、docx,docm形式で確認しています。



[指定したフォルダー配下全てのOfficeファイルのパスワードを解除する](http://qiita.com/ichiroc@github/items/7de26eacb1fd02fdaeea)
QIITAにはこんなすごいのもあるけど使い切れない
Spring bootのControllerクラスで定義したパスを一覧として取得する

SpringBootで構築したサイトのsitemap.xmlを作る際、Controllerクラスのメソッドに付いている@RequestMappingアノテーションの値を取得する方法を調べたのでメモ。

#結論
例外やpath変数は無視して、とにかくアノテーションに定義されているパスの文字列を一覧として取得します。

```Test.java
import java.util.Arrays;
import java.util.Set;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

public class Test {
    public static void main(String[] args) throws ClassNotFoundException {
        
        ClassPathScanningCandidateComponentProvider scanner =
                new ClassPathScanningCandidateComponentProvider(false);
        
        scanner.addIncludeFilter(new AnnotationTypeFilter(Controller.class));
        
        Set<BeanDefinition> beanSet = scanner.findCandidateComponents("/* controller package string */");
        
        for (BeanDefinition def : beanSet) {
            Class<?> clazz = Class.forName(def.getBeanClassName());
            Arrays.stream(clazz.getDeclaredMethods()).map(m -> m.getAnnotation(RequestMapping.class)).filter(
                    a -> a != null && a.value().length > 0).forEach(a -> Arrays.stream(a.value()).forEach(p ->{
                        System.out.println(p);
                    }));
        }
    }
}
```

#要点
[ClassPathScanningCandidateComponentProvider](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.html)を使ってspringのメタデータを取得している部分が肝ですね。
それ以外は普通にリフレクションでメソッド取得して地道にアノテーションの値見ています。
現実的にsitemapにするには、変数を想定される値で置き換えたり、非公開のurl除外したり、諸々気をつけることあります。

#参考
[Java実行時にアノテーションが定義されたクラスを取得する方法](https://teratail.com/questions/5642)
Python3でCSVファイルを読み込んでグラフに表示させる

CSVファイル読み込んで、グラフとして表示させてみます。

ファイルを読み込むには pandasモジュールを使ってみます。

`import pandas as pd`

read_csvでCSVファイルを読み込みます。（カンマ（,）で区切られてるCSVファイルの場合）

`df = pd.read_csv('test1.csv')`　

ちなみにtest1.csvの中身は下記の通りです。

```test1.csv
1,333
2,572
3,126
4,783
5,890
6,333
7,572
8,126
9,783
10,890
```

グラフに変換するモジュールは matplotlib　を使います。

`import matplotlib.pyplot as plt`

<h1>全体のコード</h1>

```main.py
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('test.csv', names=['num1', 'num2'])
plt.plot(range(0,10),df['num2'],marker="o")
plt.show()
```

![download.png](https://qiita-image-store.s3.amazonaws.com/0/192270/76dbed1c-4c3b-9ebb-30b2-c2674d83c906.png)

参考：
PythonでCSVファイルをもとに折れ線グラフを描く例
https://snap.textfile.org/20161101235123/
機械学習論文読みメモ_82


[Aggregated Residual Transformations for Deep Neural Networks](https://arxiv.org/abs/1611.05431), CVPR2017
新たな画像分類ネットワークを提案する。
このネットワークは同じトポロジーを持つtransformationのセットを集めたブロックを繰り返していく構造を持つ。
これは例えば通常のresnetブロックに対して、内部処理を並列に並べてそれぞれに入力、出力を行い最後に出力を凝集させる。
このようなmulti branch構造は少ないパラメータ数で実現できる。
ここで新たに並列に並べるブロック数を濃度として定義する。
濃度はネットワークの深さや幅を増やしていくよりも改善効率が良い。

[R-FCN: Object Detection via Region-based Fully Convolutional Networks](https://arxiv.org/abs/1605.06409)
物体認識のための高精度かつ効率的なregion based fully convolutional networkを提案する。
従来のFast/Faster R-CNNはregion毎に分類タスクを何度も適用するため非効率であった。
今回提案する手法は画像に対して全ての領域毎計算が共有されるようにする。
これを実現するためには、画像分類タスクで要求されるtranslation invarianceと領域分割タスクで要求されるtranslation varianceのジレンマを解決する必要がある。
提案手法では、position sensitive mapと呼ばれる、物体に対する相対的な位置関係を含めてエンコードする層をfully convolutional netの後ろへ導入する。
この層に対してROIベースのネットワークをさらに適用する事で最終的な分類までを実現できる。

[Spectral Convolution Networks](https://arxiv.org/abs/1611.05378)
周波数領域において畳み込み計算を行う事で効率的な計算を行う事が可能な事が知られている。
しかしながら、activation、pooling、dropout等を適用するためには、transformとそのinverse計算を繰り返し行う必要がある。
本論ではこれらconvolutionｍ，poolingをフーリエ、ラプラス領域において数学的に実装可能である事を示す。
具体的には、フーリエ領域におけるspectral activationの計算、またラプラス領域における畳み込み計算とactivation計算の方法を示す。
これにより、計算コストとそのcomplexityの双方を低減する事が可能になる。
機械学習論文読みメモ_81


[Matching Networks for One Shot Learning](https://arxiv.org/abs/1606.04080)
少ないデータからの学習はいまだ大きな研究課題である。
本論では、deep metric learning及びexternal memoryの利用によりこの問題へ取り組む。
ここで提案するフレームワークは少量のlabelled support setとunlabelled exampleを入力として、それらのラベルを出力する。
これにより新たなクラスが現れた際にfinetuneを行う必要をなくす事ができる。

[Hyperband: A Novel Bandit-Based Approach to Hyperparameter Optimization](https://arxiv.org/abs/1603.06560)
学習アルゴリズムの性能は良いハイパーパラメータの設定に掛かっている。
従来手法では、適応的に新たなハイパーパラメータを選んでいくもの、あるいはハイパーパラメータに応じて計算リソースを動的に割り当てる手法などがある。
本論ではnon-stochastic infinitly many armed bandit問題としてハイパーパラメータ探索を行う手法を提案する。
ここでは事前に設定する必要のあるパラメータ、例えば反復回数、データサンプル数、特徴数などの設定はランダムにいくつかサンプルされる。
提案するフレームワークはHYPERBANDと呼ばれ、その理論的な特性を明らかにした。
この手法の利用により学習効率を大幅に改善する事が可能である。

[One Class Splitting Criteria for Random Forests](https://arxiv.org/abs/1611.01971)
Random forest(RF)は分類と回帰問題において大きな効果を発揮してきた。
しかしながら適用可能なのは教師あり学習問題のみである。
本論ではRFのsplitting criteriaを拡張し、one class設定における利用を可能にする。
従来手法は、splitting criteriaに直接頼らない手法（isolation forest)、outlierを生成して擬似的に２クラスにする手法などがある。
本論では、クラス所属確率等に基づいたcriteriaでなく、親ノードからみた子ノードが持つスプリット区間の容量比の期待値に基いてcriteriaを設定する。
このcriteriaの元、スプリット区間を最適化し、外れ値かそうでないかのスプリットを学習する。
そうする事で自然と、子ノードはminimum volume setを学習する事となり、外れ値分布（元々は一様分布を仮定？）は正常値分布の周りに固まることとなる。
Javascript でキャメル・ケース文字列をスペースで分割する[SQL は分割させない]

#大文字の前にスペースを挿入する
例えば文字列「`CentOSRaspberryPiSQL`」を「`CentOS` `Raspberry` `Pi` `SQL`」のように分割できます。

大文字・小文字混じりの文字列、つまり**キャメルケースの文字列を大文字の前でスペース区切りにしたい**場合で、`SQL` などの連続大文字には適用したくない場合の Javascript です。

```js:camel2spsep.js

var camel2spsep = function (str) {
    separator = ' ';
    return str
            .replace(/[A-Z][a-z]/g, function (match) {
                return separator + match;
            })
            .replace(/[A-Z]+$/g, function (match) {
                return separator + match;
            })
            .trim();
};

console.log( camel2spsep('CentOSRaspberryPiSQL'));

//結果は「CentOS Raspberry Pi SQL」
```
デモ：[Paiza.ioで実行結果を確認できます](https://paiza.io/projects/FQCHi66sBg1wuHuGg9f6QA)。

#何に使うの？
WikipediaAPI などで、["RaspberryPi" で検索するとヒットしない](http://wikipedia.simpleapi.net/api?keyword=RaspberryPi&output=json)のですが、["Raspberry Pi" だとヒットする](http://wikipedia.simpleapi.net/api?keyword=Raspberry%20Pi&output=json)ため、ちょっとした検索率向上に。
逆に "JavaScript" は "Java Script" になってしまうので完璧ではないです。

#参考文献
- Insert space before capital letters @ Stack Overflow<br>https://stackoverflow.com/questions/5582228/insert-space-before-capital-letters
- JavaScriptで正規表現（文字列置換え編）@ Qiita<br>[http://qiita.com/hrdaya/items/291276a5a20971592216](/hrdaya/items/291276a5a20971592216)</a>
[Python]イカリング2のJsonを取得してみた

イカリング2のデータをPCのブラウザで見る方法が上がっていたため，それを参考にした．
[【スプラトゥーン2】イカリング2の戦績データをPCブラウザで無理矢理閲覧する](http://s2terminal.hatenablog.com/entry/2017/07/23/203831)


# 環境
Python 3.6.1

# Cookieの取得
今記事を書いていたら，分かりやすいものを発見した．
[イカリング2をPCブラウザで見れる方法があるらしいのでやってみた](http://qiita.com/valmet/items/1b3960085a8764778bf0)

このリンクの記載の方法で，Cookieの値をメモする．

# コード
```python:ikaring.py
import urllib
from urllib.request import build_opener, HTTPCookieProcessor
from urllib.parse import urlencode
import http
from http.cookiejar import CookieJar
import codecs

def printJson(url): # Jsonを取得してprint
    cookie = "iksm_session=メモしたCookie値"
    opener = build_opener(HTTPCookieProcessor(CookieJar()))
    opener.addheaders.append(("Cookie", cookie))
    res = opener.open(url)
    print (codecs.decode(res.read(), 'unicode-escape'))

printJson("https://app.splatoon2.nintendo.net/api/data/stages") # 今のステージの取得
#printJson("https://app.splatoon2.nintendo.net/api/festivals/active") # フェスの情報の取得？
#printJson("https://app.splatoon2.nintendo.net/api/schedules") # スケジュールの取得
#printJson("https://app.splatoon2.nintendo.net/api/records") # 今の装備や塗った面積等の取得
#printJson("https://app.splatoon2.nintendo.net/api/timeline") # フレンドの状況？
#printJson("https://app.splatoon2.nintendo.net/api/onlineshop/merchandises") # ギアショップの情報
#printJson("https://app.splatoon2.nintendo.net/api/results/110") # 各バトルのデータ
```


<img src="https://qiita-image-store.s3.amazonaws.com/0/136855/6bb3a8af-4b7c-0f8d-2625-24094fb67219.png" width=50%>
こんな感じでJsonで返ってくるので，いろいろ加工しやすい．


他にも取得できるデータがあるかもしれない．

`https://app.splatoon2.nintendo.net/api/results/110`の110が各バトルに該当する．
109番目のバトルのデータにアクセスしたい場合は，`https://app.splatoon2.nintendo.net/api/results/109`とすれば良い．
人によってバトル回数・直近50バトルが異なることに注意．


最新の50バトルまでしか履歴を見ることができないため，各バトルのデータを記録するのに活用できそうだ．
自分だけでなく，仲間・相手のギアも見れるため，たくさんデータを集めれば得意/苦手なシチュエーション等のデータマイニングもできそう．
Mac OSX で JDK9 EA のソースビルドを試みた(失敗)

Mac で JDK 9 EA のビルドを試みたが、bug？によりビルドエラーで中断中。

```bash

$ brew install mercurial

$ hg clone http://hg.openjdk.java.net/jdk9/jdk9 jdk9

$ cd jdk9

# jdkのソースを取得する(15分ほどかかる)
$ bash ./get_source.sh

# freetypeが必要だと怒られる
$ bash ./configure
...
configure: error: Could not find freetype! You might be able to fix this by running 'brew install freetype'.
~/java/jdk9/common/autoconf/generated-configure.sh: line 82: 5: Bad file descriptor
configure exiting with result code 1

# freetype をインストール
$ brew install freetype

# 再度 freetype へのパスを指定して configure
$ bash ./configure --with-freetype-include=/usr//local/homebrew/include/freetype2 --with-freetype-lib=/usr/local/homebrew/lib
...
====================================================
A new configuration has been successfully created in
~/java/jdk9/build/macosx-x86_64-normal-server-release
using configure arguments '--with-freetype-include=/usr//local/homebrew/include/freetype2 --with-freetype-lib=/usr/local/homebrew/lib'.

Configuration summary:
* Debug level:    release
* HS debug level: product
* JDK variant:    normal
* JVM variants:   server
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64
* Version string: 9-internal+0-adhoc.mkakimi.jdk9 (9-internal)

Tools summary:
* Boot JDK:       java version "9" Java(TM) SE Runtime Environment (build 9+176) Java HotSpot(TM) 64-Bit Server VM (build 9+176, mixed mode)  (at /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home)
* Toolchain:      clang (clang/LLVM from Xcode 8.2.1)
* C Compiler:     Version 8.0.0 (at /usr/bin/clang)
* C++ Compiler:   Version 8.0.0 (at /usr/bin/clang++)

Build performance summary:
* Cores to use:   8
* Memory limit:   16384 MB

$ make (ビルドエラー)
https://bugs.openjdk.java.net/browse/JDK-8173336
```

### 参考URL
* http://d.hatena.ne.jp/torazuka/20150102/buildjdk9
AWS EC2のスポットインスタンスでGPU版tensorflowを動かす


最近tensorflow使い始めました:smile: 手元のMacBook Proだと学習にとっても時間がかかるので、AWS EC2のGPUインスタンスを使ってみることに.
EC2を安価に使うにはスポットインスタンス♪と思ったのですが、なんと、スポットインスタンスだとCUDAとかがセットアップされたNVIDIAのAMIが選択できないじゃないですか:scream: どうやら素のOSの上に自力で環境構築しないといけないっぽい. でも1回環境作ってしまえば再利用は可能.

というわけで、GPU版tensorflowを動かすまでの手順をまとめます. 構築する環境は
**Ubuntu 16.04 LTS** + **CUDA** + **cuDNN** + **python3.6** + **tensorflow-gpu**
です.

### EC2インスタンスの作成

EC2コンソールから「スポットインスタンスのリクエスト」でインスタンスを作成します.

* AMI: **Ubuntu 16.04 LTS**
* インスタンスタイプ: **p2.large** 
* EBS ボリューム: デフォルト8GBなので適当に増やす. 32GBとか.

インスタンスタイプはp2.8xlargeやp2.16xlargeでもいいですが、セットアップはp2.largeで行っておいて、学習時に8xlargeや16xlargeに切り替えてもいいかも.


EC2インスタンスが起動したら各モジュールを最新版にアップグレードし、最低限の開発環境をインストール.

```bash
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install libffi-dev libssl-dev gcc make
```

### pyenvを使ってpython環境を整える
まずpyenvをgit cloneする.

```bash
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

.bashrc に以下追加.

```bash
PYENV_ROOT=$HOME/.pyenv
PATH=$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH
eval "$(pyenv init -)"
```

編集した.bashrcを読み込んでおく.

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

続いてpythonのインストール. 今回はpython 3.6を入れる.

```bash
$ pyenv install --list|grep 3.6
  3.3.6
  3.6.0
  3.6-dev
  3.6.1
  3.6.2rc1
$ pyenv install 3.6.1
$ pyenv global 3.6.1
$ which pip3
/home/ubuntu/.pyenv/shims/pip3  # pyenvが使われているのを確認
$ pip3 install aws  # ついでに入れておく
```


### CUDAのインストール

[CUDAのダウンロードサイト](https://developer.nvidia.com/cuda-downloads)でdebファイルのダウンロード先を調べる. 

* OS:Linux, 
* Architecture: x86_64, 
* Distribution:Ubuntu, 
* Version: 16.04, 
* Installer Type: dev(local)

を選べば良い. URLが分かったら, wgetで取得してインストール.


```bash
$ wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb
$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb
$ sudo apt-get update
$ sudo apt-get install cuda
```

### cuDNNのインストール

[cuDNNのダウンロードサイト](https://developer.nvidia.com/rdp/cudnn-download)から *cuDNN v6.0 Library for Linux* を取得してインストールすれば良いのだが、ユーザ登録してログイン後のページからしかダウンロード出来ず、wgetでURL指定で簡単にダウンロード出来ない.
一度macに保存してscpでEC2に送り込むことにした.


```bash
# scpでローカルのMacからEC2にdevファイルをコピー. pemファイルのパスとIPは適宜変更.
$ scp -i aws.pem ~/Downloads/cudnn-8.0-linux-x64-v6.0.tgz ubuntu@12.34.56.789:~/
```

```bash
$ tar xzf cudnn-8.0-linux-x64-v6.0.tgz
$ sudo cp -a cuda/lib64/* /usr/local/lib/
$ sudo cp -a cuda/include/* /usr/local/include/
$ sudo ldconfig
```

### tensorflowのインストール
CPU版のtensorflowが入っている場合はuninstallしてからGPU版を入れる. ついでによく使うライブラリも入れておく.

```bash
$ sudo apt-get install libcupti-dev
$ pip3 uninstall tensorflow
$ pip3 install tensorflow-gpu
$ pip3 install keras sklearn matplotlib scipy librosa
```

### サンプルを動かして動作確認

今回はkerasのmnist-mlpで動作確認. git cloneでサンプルを取得して実行.

```bash
$ git clone https://github.com/fchollet/keras.git
$ cd keras/examples
$ $ python mnist_mlp.py 
Using TensorFlow backend.
...
Test loss: 0.118156189926
Test accuracy: 0.9811
$
```

動いた:sunglasses:
Lerna(monorepo)とCHANGELOG(リリースノート)


[Lerna](https://github.com/lerna/lerna "Lerna")などのmonorepoツールを使っていて困るのが、[Conventional Changelog](https://github.com/conventional-changelog/ "Conventional Changelog")など既存のリリースフローがそのまま適応できない点です。
さらに、Lernaの中でも管理モードが2つありそれぞれでCHANGELOGの管理に使えるものが異なります。
[Lerna](https://github.com/lerna/lerna "Lerna")でパッケージを管理する際大きく分けてFixedモードとIndependentモードがあります。

## Fixedモード

管理下にあるパッケージがすべて同じバージョンとなるモード

- 採用例): [Babel](https://github.com/babel/babel "Babel")、[Jest](https://github.com/facebook/jest "Jest")

このモードに対して使えるツールとして[lerna-changelog](https://github.com/lerna/lerna-changelog "lerna-changelog")があります。
BabelやJestなどが利用しています。
GitHub PRにつけたラベルを元にジャンルを分けてCHANGELOGを吐き出すツールです。


## Independentモード

管理下にあるパッケージがそれぞれ異なるバージョンとなるモード

- 採用例) [Almin](https://github.com/almin/almin "Almin")、[Pug](https://github.com/pugjs/pug "Pug")


もっとも簡単な方法としては`lerna`の[--conventional-commits](https://github.com/lerna/lerna#--conventional-commits "--conventional-commits")が利用できます。
[Conventional Commits](https://conventionalcommits.org/ "Conventional Commits")に沿ったコミットメッセージを書くことで、各パッケージに自動でCHANGELOG.mdを生成してくれます。

欠点としては`lerna publish --conventional-commits`はバージョンなども自動的に決定されるためあまり柔軟性がありません。たとえばsemverで1.0.0未満などの特別扱いなどはできません。

## その他

lernaは`package@version`というタグで`git tag`を付けてるようになっています。これにより既存のCHANGELOGツールの想定外の範囲となって取れてないのが殆どです。
lernaの内部的にも使ってる[conventional-changelog](https://github.com/conventional-changelog/conventional-changelog "conventional-changelog")は[lernaPackage](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-core#lernapackage "lernaPackage")というオプションで`package@version`形式に対応することができます。

たとえばつぎのようにして特定のパッケージに関するCHANGELOGを取ることができます。

```
$ conventional-changelog --lerna-package almin-logger
<a name="5.0.0"></a>
# 5.0.0 (2017-07-26)

* Convert almin-logger to typescript (#265) ([f4deeb7](https://github.com/almin/almin/commit/f4deeb7))
* Create CODE_OF_CONDUCT.md (#259) ([85f3636](https://github.com/almin/almin/commit/85f3636))
* Update README ([50e3359](https://github.com/almin/almin/commit/50e3359))
* Update README.md ([6d80544](https://github.com/almin/almin/commit/6d80544))
* feat(TypeScript): Add TodoMVC TypeScript (#263) ([b05f7aa](https://github.com/almin/almin/commit/b05f7aa))
* docs(almin): Add almin principle + CQRS (#262) ([47c67a3](https://github.com/almin/almin/commit/47c67a3))
* refactor(example): Update Counter example (#260) ([8c09db5](https://github.com/almin/almin/commit/8c09db5))
```

## おわり

まだ決定版がないので、こうやってるよ的な例がもっと欲しい

追記(2019-01-26): 具体的なリリースフローがある程度まとまったので書きました

- [lernaでのmonorepoにおけるリリースフロー(Fixed/Independent) | Web Scratch](https://efcl.info/2019/01/26/monorepo-release-flow/)
Rでsvm

ここを参考に
http://qiita.com/kokumura/items/64eefc8594995b1d0713

```:R
install.packages("e1071")
library(e1071)
install.packages("kernlab")
library(kernlab)
```

```:R
wet_train <- read.delim("train.txt", sep="\t", stringsAsFactors=T, header=F, fileEncoding="utf-8")
wet_model <- ksvm(V10 ~ ., data=wet_train, type = "C-bsvc", kernel = "rbfdot")
wet_test <- read.delim("test.txt", sep="\t", stringsAsFactors=T, header=F, fileEncoding="utf-8")
result <- predict(wet_model, wet_test)
table(result, wet_test$V10)
```
```
result   Ame Hare Kumori Yuki
  Ame      0    1      1    2
  Hare    33  196    157    9
  Kumori 122  213    341   19
  Yuki     0    0      1    1
```

`関数 "ksvm" を見つけることができませんでした` などのエラーが出た場合は、
`Error: could not find function "ksvm"` などでググれば良い
[クイズ]javascriptと仲良くなるための一歩　第１０話「if文の条件式２」

#問題

##第1問

```js
var b = new Boolean(false)
if(b){
  "T"
}else{
  "F"
}
//=> ?
```

##第2問

```js
var b = Boolean(false)
if(b){
  "T"
}else{
  "F"
}
//=> ?
```


:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

##第1問

```js
var b = new Boolean(false)
if(b){
  "T"
}else{
  "F"
}
//=> "T"
```

このコードの場合、
ifの条件文で評価するのは、
booleanの値ではなく
objectとしてのbです。
オブジェクト型をブーリアン型に変換すると必ずtrueになる。

##第2問

```js
var b = Boolean(false)
if(b){
  "T"
}else{
  "F"
}
//=> "F"
```

関数呼び出しの場合は、
ifの条件文で評価するのは、
それぞれの型になります。
なので、
第1問と比較して直感的に理解できる処理になる。
go言語1.9で追加予定の新機能 型エイリアス

###型エイリアス
go言語に1.9から型エイリアス(type alias)が追加されるようです。
ちょうど去年の今頃に提案された機能です。
この機能はどちらかと言うと実験的というか、反対票が賛成を４倍で上回るような
今回で確定するには難しい話なので、今後の議論のために実際に扱っていくという目論見もあるようです。

```go
//type構文
type Gopher oldpkg.TheGopher
//alias構文
type AliasGopher = oldpkg.TheGopher
```
上記のような構文でtypeと違い=演算子が間に入ります。
あくまでtypeキーワードは別の型の宣言であり、aliasは他の言語のaliasと同様、そのtypeそのものを参照します。
なのでそのtypeのメソッドを使用でき、aliasに対してメソッドを追加したりすることは不可能です。

###主な用途、動機
珍しいことにリファクタリングを主な動機とした構文であり、現状の大規模開発での型の変更の難しさから提案されました。
パッケージの整理のための分割、単により良い名前への変更、依存関係の軽減など、型を変更する理由は少なくありません。
しかし型は関数のようにラップすることも定数、変数のように代入することもできないので一度での修正が必要になります。
特にGoogleはモノリシックレポジトリでの運用です。
これは大まかにいうとすべてのプロジェクトを一つのレポジトリに突っ込んでそこにコミットしまくります。
なのですべてのコードが最新に保たれますが言い換えれば変更の影響範囲すべてにその時のコミットで対処しなければいけません。
ライブラリが変更されればそのときにそのライブラリの全ての呼び出し元を修正する必要があります。
これを緩和するために、古いtypeと新しいtypeを共存可能にすることで移行をスケールして行うことが可能になります。

###なぜtypeのみか
typeのみなのは変数、定数、関数はすべて現状の仕様で行えるためです。
go言語にとってどうしても解決したい問題はtypeの移行でした。
一応、aliasをvar,const,func にも行えるより一般的なaliasとして扱う案もありましたが
=の構文ではvar Something = pkg.Somethingとなります。
これは既存の、通常の代入であり、別の意味合いになるため不可能でした。
aliasはあくまで本体の参照であり、コピーである代入ではいくつか意味合いが異なってしまいます。
演算子を=>などに変える案もありましたがやはり直感的な構文は=であり最大の目的はtypeだったので現在の仕様で行われるようです。

###ついでの便利効果
- 嫌われ者のドットインポートを削除できます。
- ローカルエイリアスでグラフィック処理でのMath.SinなどをSinにすることで可読性を上げることが可能になります。

###過去に問題となった事例
io.ByteReader->bytes.Readerの時は初期だったので数十ファイルで済んだようでしたが
os.Error->errorへのエピソードは強烈でした。
現在errorは組み込み型ですがかつて、os.Errorでした。
errorになれた我々からすると違和感もあると思いますがとにかくそうでした。
当然errorを扱うためにos.Fileだとかに依存する必要性は全く無く、errorsパッケージができるのは必然でした。
しかし段階的に移行する手段はありませんでした。
ログを見るとわかりますがGoTeamが取った手段はなんと
#####"コンパイラにハックを追加して一時的にコードをos.Errorとして解釈するようにさせる"
でした。オシャンティの欠片もありませんがそこがまたハードボイルドでいいですね。濡れました。
こんな話を聞かされれば二度とこんな悲劇を繰り返させないようにエイリアスに賛成したくなると思いましたが
世の中には血も涙も無い反対派もいます。

###現状の反対意見
提案で出ていた反対意見
1. してはいけないことが出来てしまう,乱用するとローカルでもないのにローカルみたいに見えたり同じものを複数作れる
2. そもそもモノレポ運用のGoogleしか問題にならないのでは
3. 初心者に教えるのにリファクタリング云々とかいう魔法機能はややこしい

反対意見に対する反論
1. その手のことは今でも出来てしまう。それにappendとかのキーワードに値を入れることもできるけどそんなことする人がいないように
　　出来るだけではそれほどの問題にはならない。仮に出来てもツールで検出するようにも出来る。
2. 大規模開発ならどうしても起こる。
3. 初心者向けの機能ではない。
などなど色々ありました。

まとまっていてシンプルでオシャンティなgoの機能ばかりに目を取られていて
言語仕様としてリファクタリング目的というのは当初違和感はありましたが
go言語のフォーマットツールやgodocなど、言語仕様だけでなくプログラマの開発環境を重点を置き、
実情としてどうするべきか、エコシステムを視野に入れ考えていくgoならではの機能追加な気がしました。
エイリアスのエイリアスを作れるようにするべきかなど、色々どちらが正解ともいえない細部も多く
今回の実装によってどんな意見が出てくるのか楽しみです。
手首のスナップを鍛えていこうと思います。

エイリアスが要るようなリファクタリングしっかりした大規模開発と出くわすことがある人にはいい機能かもしれません。


###参考
エイリアスの提案
https://github.com/golang/proposal/blob/master/design/18130-type-alias.md
エイリアスの議論
https://github.com/golang/go/issues/16339
リファクタリングについて語る
https://talks.golang.org/2016/refactor.article
laravel の動作環境を Docker でつくってみた

# やってみたいこと
laravel の動作環境を Docker を使って開発環境や本番想定した感じで動くのかを確認したかった。

# 動機
最近、本番環境を想定しているサーバ（ベアメタル）は OS やミドルウェア（apache/PHP/mysql）などのバージョンが古くなっているのと１台のサーバに色々なサイトが混在しているのでサーバのミドルウェアの依存があってアップデートができないことに困ったので、今後はマイクロサービスなども想定した環境はどのような感じで動くのかを勉強して仕事にフィードバックできるように勉強してみたい。

# いつも通り Vagrant で仮想環境を構築
```rb:Vagrantfile
  config.vm.define "server" do |node|
      node.vm.box = "centos7"
      node.vm.network "forwarded_port", guest: 80, host: 8081
      node.vm.network :private_network, ip: "192.168.33.10", virtualbox__intnet: "intnet"
  end
```
# 今回の確認のために作成したファイル群は [GitHub](https://github.com/nodokaodayaka/php) に格納しています。

# docker 環境のインストール
```
# systemctl start docker
# systemctl enable docker
```
# 今回の作業ディレクトリ構成
```
├── README.md
├── application
│   ├── composer.phar
│   └── laravel
│       ├── app
│       ├── artisan
│       ├── bootstrap
│       ├── composer.json
│       ├── composer.lock
│       ├── config
│       ├── database
│       ├── package.json
│       ├── phpunit.xml
│       ├── public
│       ├── readme.md
│       ├── resources
│       ├── routes
│       ├── server.php
│       ├── storage
│       ├── tests
│       ├── vendor
│       └── webpack.mix.js
├── laravel
│   ├── Dockerfile
│   └── conf
│       └── httpd.conf
└── mysql
    ├── Dockerfile
    └── conf
        └── custom.cnf
```
# mysql コンテナー作成
## 日本語対応用ファイル
```conf/custom.cnf
[mysqld]
character-set-server=utf8
```
## Docker ファイル
```yaml:Dockerfile
FROM mysql
COPY conf/custom.cnf /etc/mysql/conf.d
```
## コンテナーイメージ作成
```
# docker build -t mysql mysql/
```

# php + laravel + apache コンテナー作成
## Dockerfile
```yaml:Dockerfile
FROM centos
RUN yum -y install epel-release
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum install -y --enablerepo=remi,remi-php70 php php-devel php-mbstring php-mysql php-xml php-mcrypt
RUN systemctl enable httpd

RUN rm -rf /var/www/html
RUN ln -s /tmp/app/laravel/public /var/www/html

ADD conf/httpd.conf /etc/httpd/conf/httpd.conf

ENTRYPOINT ["/sbin/init"]
```
## コンテナーイメージ作成
```
# docker build -t laravel laravel/
```

# コンテナーの起動
```
# docker run --name mysql -d -e MYSQL_DATABASE=laraveldb -e MYSQL_USER=laravel -e MYSQL_PASSWORD=laravel  -e MYSQL_ROOT_PASSWORD=root mysql
# docker run --name laravel --link mysql:mysql -d -p 8081:80 -v `pwd`/application:/tmp/app laravel
```
## 動作確認URL
- [localhost:8080](localhost:8080)

# 最後に
今回は、WEB -> DB の接続の確認をしたいのとサーバ自体になるべく依存しない形で動くコンテナーを作ってみました。
DB自体についてはデータボリュームコンテナーとかを使ったほうが良かったり、docker-compose を使って起動する方法が簡単なんだろうなーと思いながら今後に向けて学習していこうと思います。

色々なやり方あると思いますので、アドバイスしていただければ今後違う角度で試してみたいなと思います。
awkを使ってcsvファイルをjson化

ひさびさにawkを書いたのでqiitaに書き留めておきます。（最近はawsコマンドの方がよく使ってたりして）

csvデータをWeb系のアプリでハンドリングしやすくするためにJSON化して渡す必要があったので、awkでなんとかしてみました。

```awk:csv_to_json.awk
BEGIN{
  FS=","
  json="["
}
{
  if(NR==1){
    for(i=1;i<=NF;i++){
      keys[i]=$i
    }
  }else{
    json=json sprintf(NR>2?",{":"{")
    for(i=1;i<=NF;i++){
      json=json sprintf("\"%s\":\"%s\"",keys[i],$i)
      json=json sprintf(i<NF?",":"")
    }
    json=json "}"
  }
}
END{
  json=json "]"
  print json
}
```

ケツカンマの対処のための分岐がなんともしがたいですが、これを使えばサクッとJSON化できますよ。

```bash
$ cat test.csv
hoge,fuga
123,abc
456,def
$ awk -f csv_to_json.awk test.csv | jq '.'
[
  {
    "hoge": "123",
    "fuga": "abc"
  },
  {
    "hoge": "456",
    "fuga": "def"
  }
]
```

JSONの整形についてはjqに任せちゃいましょう
Ruby on Rails のルーティングについて WebAPIについて

#始めに
・Ruby on Rails のルーティングについて
http://qiita.com/triple4649/items/7e16212be201d5c87e78
の続き
今回はWebAPI編

#序章
前にも書いたけれど
**Ruby On RailsのWeb上の記事、ものすごくわかりにくい**
もしかして、Railsの規約に沿ったことしかやっていなくて、少しでもレールからそれたことをやっている人は少ないのか？

#やりたいこと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136860/d243e4ab-70fb-2bef-0336-abd1273cc4b0.png)
値を入力してボタンを押すと
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136860/7d1a38e9-187a-3f89-4d69-657e27434f53.png)
のようにAjaxで非同期通信を行い、ブラウザ上に入力文字列を表示するという、ごく簡単なもの
JavaのServletだったら、response#writer#printlnで実現できるやつ

#実装
##HTML側
```非同期.html
<!DOCTYPE html>
<html>
<script>
function doPost(){
    var req = new XMLHttpRequest();
    req.open('POST', 'http://localhost:3000/nikkyuusanpostasyn/', true);
    req.setRequestHeader('content-type',
    'application/x-www-form-urlencoded;charset=UTF-8');
    req.send('name='+f('nikkyu').value);
    req.onload =  r(req,
        function(){f('result').innerText=req.responseText ;});
}

function r(req,caller){
  return function (event){
    if (req.readyState === 4 && req.status === 200) 
      caller();
  };
}
function f(str){
    return document.getElementById(str);
}
</script>
<body>
<% @msgToNikkyusan%><input type='text'id='nikkyu'><input type='button' onclick='doPost();'>
<div id='result'></div>
</html>
```
まぁ、**JQuery**って何ですかってコーディングですね
ただ、この程度の非同期処理をJQueryやら他のJSフレームワークのAjaxメソッドを使わないと実装できないものどうかと

##Controller側の実装

```sample_controller.rb
class SampleController< ApplicationController
protect_from_forgery :expect  => ["create"]
def sayhello
     @msgToNikkyusan = '２９３、hello!';
     @msgToPerorisan = 'ペロリさん、hello!';
  end
  #初期表示で呼ばれるメソッド
  def sayhelloToNyukkyusan
     @msgToNikkyusan = '２９３、hello!';
  end
    
  #Ajaxから呼ばれるメソッド
  def sayhelloasynpost 
    render text:"こんにちは！#{params[:name]}さん"
  end
end
```
JSONとか正直どうでもいい、私はただのテキストをWebで表示したいだけ

#ルーティング
なんか、ここをちゃんと説明しているページがない
前回の記事の表でルーティングを整理してみる

要求|URI|コントローラーのクラス名|コントローラーのメソッド名|viewのフォルダ|viewのファイル名
|:-------:|:-----|:------------------|:-------------|:------------|:-------------|
get|nikkyuusan|sample_controller|sayhelloToNyukkyusan|sample|sayhelloToNyukkyusan.html.rb
post|nikkyuusanpostasyn|sample_controller|sayhelloasynpost|-|-

POST側の記述がAjax側のルーティングを示している
ポイントはViewのフォルダとViewファイルを使わずに、Controller側でrenderメソッドを使ってレスポンスにデータを渡している点ですね
つまり、おおざっぱにいうと、RailsのrenderはJavaServletのresponse#writer#printlnと同じものだと覚えておけばいいのか
AOL Reader向けの.vimperatorrc設定

feedSomeKeys_3.jsの設定として.vimperatorrcに以下を追加。色々試した結果2行に分けたらなんとかなった。

```
lazy fmaps -u='https?://reader\.aol\.co\.jp/.*' gh gs gd ga go gx ? r = - f u j k <Space> <S-Space> t v <Return> m 1 2 3 4 5 /
lazy fmaps -u='https?://reader\.aol\.co\.jp/.*' -events=vkeydown J K N P X O A
```

正直未だに設定方法理解できてない。
対象の数字が分からない時に少ないwhileの回数で目標の数字に辿り着くrubyプログラム

#qiitaとruby初心者で情報処理科未修です!!アルゴリズム？新しい音楽ジャンルか?

元々何がしたかったかというと、例えばurlでpage=724とか入っていてpage=1から開いて、最後のページ(page=725)になったらfalse返してそれまでのurlをarrayにpushするプログラムを書きたいとする。というか書いて動かした。
そうすると、サーバー側からアタックと判断されて、リクエストを弾かれるようになる。
つまり、スクレイピングできなくなる。
今回の場合qiitaのrubyタグのページの中から「いいね」を多く貰った順にソートして記事のURLを拾うため、とりあえず汎用性考えてページ数を数えるプログラムから作ろうとしてた。
が、2回目動かしたらqiitaのサーバーから拒否されてしまった(当然だ。一瞬で700回以上サーバーにリクエストしたことになる。そもそもスクレイピングやめろとか言われると困ってしまうけど)
当然、qiita以外でも発生する問題になる。サーバー側にも負荷がかかるし、自分も拾いたい情報を拾えないから面白くない。

前置き長くなりすぎた。

それでこのプログラムは変数iが不明の場合、そのiに対してなるべく少ないアクセス回数でページがあるか判断するプログラム、を作るためのプロトタイプです。
変数iが不明の場合、なるべく少ない変数iへのアクセス回数で、変数iを求めるプログラム。

冒頭の問題のプログラムがこれ。(1..3).timesの部分は元々(1..100).timesだった。これはだいぶ良くない。
これは[rubyでURL先が本当に存在するか確認する方法](http://piko.hateblo.jp/entry/2013/05/24/194739)を参考にして書いた。

```ruby:page_counter.rb
#page_counter.rb

require 'net/http'
require 'pp'

urls = []
(1..3).each do |page|
	urls << "http://qiita.com/tags/Ruby/likes?page=#{page}"
end

page_num = 0
urls.each_with_index do |url, page_num|
	response = Net::HTTP.get_response(URI.parse(url))
	if response == Net::HTTPSuccess
		puts "#{page_num+1}ページある"
	elsif response == Net::HTTPRedirection
		puts "ページない"
		break
	else
		puts "なんかエラー"
		break
	end
end
```

で、表題の、プログラムがこれ。
これは作りかけだけどなんとか対処ができそうな気がする。
できなかったらまた別の方法考える。

```ruby:smaller_number_of_loop.rb
#smaller_number_of_loop.rb

i = 30
n = 1
counter = 1

p n if i == n

while i >= n
  counter += 1
  p "a"
  n *= 2
  if i == n
    counter += 1
    p "b"
    p counter
    exit
  end 
  if i <= n
    while i <= n
       counter += 1
       p "c"
       n -= 1
      if i == n
        counter += 1
        p "d"
        p counter
        p n
        exit
      end
    end
  end
end
```

もっと綺麗に書けると思うけど、これ動いたところで力尽きた...
nを2倍していってiを超えたら1ずつ減らす。
問題は、iが1024を超えた場合とか。
例えば、1200ページあると、2の10乗の1024、の次、2の11乗の2048から848回デクリメントしないと辿り着かないことになる。
もちろんデクリメントの数も2乗していけばいいんだけど、
(デクリメントしすぎたら今度は1ずつインクリメントする。なんかアホらしい気もするけど...)
プログラミングスキル不足、というか書いてて頭使いすぎた。
4時間くらいこの実装に時間かかった。理論としては良いけど、実装する能力が低すぎる。
こういうのを書くコツ教えてください。

これの手本になったのは、rubyのメモリ確保が=はその都度メモリ確保だけど、<<なら足りなかった場合倍のメモリ確保するっていう仕組みから。あれはちょっと感動した。

多分、こういう処理するためのもっと適したアルゴリズムとか実装って既にあると思うんだけど、知らなかったので頭使って書いた。

あと、みなさんコメント本当に嬉しいです。ありがとうございます。
あるメソッドからrequestAnimationFrameで別のメソッドを繰り返す方法

`requestAnimationFrame`のサンプルコードは大体こんな感じで、グローバルに定義した関数の中で自分自身を引数にして`requestAnimationFrame`を呼ぶことで繰り返しをおこなっている。

```js
function update() {
  requestAnimationFrame(update);
  console.log('update!');
}

update();
```

今回、あるクラスのメソッドから別のメソッドを`requestAnimationFrame`で繰り返したくていろいろ試したところ、以下のようにすれば上手くいくことわかった。

```js
class Sample {
  start() {
    const that = this;
    (function _update() {
      requestAnimationFrame(_update);
      that.update();
    }());
  }

  update() {
    console.log('update!');
  }
}

const sample = new Sample();
sample.start();
```

こうすれば、`Sample`クラスを継承したクラスは`requestAnimationFrame`を気にせずに、`update`メソッドをオーバーライドして繰り返し処理を行うことができる。
npm install pcap が エラーになるとき

久しぶりにdash buttonを押してみたら、反応しないので、確認してみると、
どうも、pcapがうまく動いていないようだ、、、ということで対処してみた。

( [Raspberry Pi3 on Ubuntu Mate 16.04 で Amazon Dash を ただのIoTボタンとして使う](http://qiita.com/hidenorly/items/75634f00cda10a068d40) などで使い方は紹介しています )

```
$ npm install pcap
..snip..
../node_modules/nan/nan_implementation_12_inl.h:181:76: error: no matching function for call to ‘v8::Signature::New(v8::Isolate*, NanIntern::Factory<v8::Signature>::FTH&, int&, NanIntern::Factory<v8::Signature>::FTH*&)’
   return v8::Signature::New(v8::Isolate::GetCurrent(), receiver, argc, argv);
..snip..
make: *** [Release/obj.target/socketwatcher/socket_watcher.o] Error 1
make: Leaving directory '/home/hidenorly/node_modules/socketwatcher/build'
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:258:23)
gyp ERR! stack     at emitTwo (events.js:106:13)
gyp ERR! stack     at ChildProcess.emit (events.js:191:7)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:215:12)
gyp ERR! System Linux 4.4.38-v7+
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /home/hidenorly/node_modules/socketwatcher
gyp ERR! node -v v7.2.1
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok 

```


```
$ sudo apt-get install libpcap-dev
```

はもちろんやっておいた上で、

```
$ sudo chown -R $USER:$(id -gn $USER) /home/hidenorly/.config
```

をした上で、

```
$ npm install https://github.com/mranney/node_pcap.git
```

すると、

```
> pcap@2.0.0 install /home/hidenorly/node_modules/pcap
> node-gyp rebuild
..snip..
make: Leaving directory '/home/hidenorly/node_modules/pcap/build'
npm WARN saveError ENOENT: no such file or directory, open '/home/hidenorly/package.json'
npm WARN enoent ENOENT: no such file or directory, open '/home/hidenorly/package.json'
npm WARN hidenorly No description
npm WARN hidenorly No repository field.
npm WARN hidenorly No README data
npm WARN hidenorly No license field.

+ pcap@2.0.0
updated 1 package in 14.912s
```

みたいにして成功するようになります。
サーバ負荷を監視してリリースしよう。Linux - topコマンド

ファイルデプロイ・バッチ実施などのリリースはサービス維持において避けられないもの。
最低限行っている負荷監視をメモとして記載。

**「top」コマンド実行**

```bash:こんな感じの結果が出ます。
[hoge@fuga]$ top
top - 20:49:53 up 7 min,  1 user,  load average: 0.03, 0.36, 0.23
Tasks:  79 total,   2 running,  77 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0% us,  0.3% sy,  0.0% ni, 99.7% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   1035556k total,   453728k used,   581828k free,    13820k buffers
Swap:  2096472k total,        0k used,  2096472k free,   329060k cached
```

大事なのは `load average: 0.03, 0.36, 0.23` の一番左の値「0.03」。
どういう意味かと言うと、
> 直近1分間の単位時間あたりの待ちタスク数

簡潔に言うと、**この値がCPU数を超えてくるとヤバい**、です。
では、CPU数はどうすれば見れるのか？

**さらに「1」を押下**

```bash:こんな感じの結果が出ます。
[hoge@fuga]$ top
top - 20:49:53 up 7 min,  1 user,  load average: 0.03, 0.36, 0.23
Tasks:  79 total,   2 running,  77 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
Cpu(s):  0.0% us,  0.3% sy,  0.0% ni, 99.7% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   1035556k total,   453728k used,   581828k free,    13820k buffers
Swap:  2096472k total,        0k used,  2096472k free,   329060k cached
```

`%Cpu0 ～ %Cpu3` の表示が追加されました。
意味は、
> 4つのCPUが動作している

となります。
つまり、リリース後 `load average: 4.01, 2.36, 1.23` のような状態となると
遅延が発生し始めサービスにも影響を与え始める、と言う事になります。
　

######参考：http://makaaso.hatenablog.com/entry/2015/09/10/071238
ElmでFizzBuzzを書いてみる

Elixirの勉強しているとちょくちょく名前を聞く Elm というフレームワーク。
気になっていたので触ってみました。

デモ： https://ellie-app.com/3R2XX5r5nsYa1/2

## コード
```haskell

module Main exposing (..)

import Html exposing (Html, button, div, text, program)
import Html.Events exposing (onClick)


-- モデル


type alias Model =
    {count: Int, text: String}


init : ( Model, Cmd Msg )
init =
    ( {count = 1, text = "1"}, Cmd.none )



-- メッセージ


type Msg
    = Increment



-- VIEW


view : Model -> Html Msg
view model =
    div []
            [ 
            div [] [text model.text]
            , div [] [ button [ onClick Increment ] [ text "count up" ] ]
            ]



-- 更新


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        Increment ->
            ( {model | count = model.count + 1, text = fizzbuzz model.count}, Cmd.none )


-- サブスクリプション(購読)


subscriptions : Model -> Sub Msg
subscriptions model =
    Sub.none


-- FIzzBuzz

fizzbuzz : Int -> String
fizzbuzz count =
    case ( count % 3, count % 5) of
        (0, 0) -> "FizzBuzz"
        (0, _) -> "Fizz"
        (_, 0) -> "Buzz"
        _ -> toString count

-- MAIN


main =
    program
        { init = init
        , view = view
        , update = update
        , subscriptions = subscriptions
        }

```

[Elm Tutorial](https://www.elm-tutorial.org/jp/)のコードを元に書いてみました

## 感想

Haskell は触ったことがないので、ちょっとだけ戸惑いましたが、
慣れると楽しくかけそうですね。

ただHtmlにデザインをあてるのが大変そうですが、そのへんはどうなんでしょうか・・・・

あと Qiita のシンタックスハイライトはどうすればいいのか。。。
SwiftでiOS脱獄チェック


## はじめに

チェック項目は以下記事を参考にしました。
[iOS脱獄チェックメモ](http://qiita.com/PGMY/items/3ceae5cbbf93e013deb4)

自分も確認した感じこれだけ確認しておけば十分対処できるのではないかと思ったのでそのままSwiftに移植しました。


## ソースコード

```swift:JailbreakCheck.swift
import Darwin.C

class JailbreakCheck {

    static var isJailbreak: Bool {
        #if !(TARGET_IPHONE_SIMULATOR)
            if FileManager.default.fileExists(atPath: "/Application/Cydia.app") {
                return true
            } else if FileManager.default.fileExists(atPath: "/Library/MobileSubstrate/MobileSubstrate.dylib") {
                return true
            } else if FileManager.default.fileExists(atPath: "/bin/bash") {
                return true
            } else if FileManager.default.fileExists(atPath: "/usr/sbin/sshd") {
                return true
            } else if FileManager.default.fileExists(atPath: "/etc/apt") {
                return true
            } else if FileManager.default.fileExists(atPath: "/private/var/lib/apt") {
                return true
            }

            let stringToBeWritten = "This is jailbreak test."
            var isWrote = false

            do {
                try stringToBeWritten.write(toFile: "/private/jailbreak.txt", atomically: true, encoding: String.Encoding.utf8)

                defer {
                    try! FileManager.default.removeItem(atPath: "/private/jailbreak.txt")
                    isWrote = true
                }
            } catch {}

            if isWrote {
                return true
            }

            if UIApplication.shared.canOpenURL(URL(string: "cydia://package/com.example.package")!) {
                return true
            }

            var isJailbreak = false
            var f: UnsafeMutablePointer<FILE>?

            let checkUrls: [String] = [
                "/bin/bash",
                "/bin/ssh",
                "/Application/Cydia.app",
                "/Library/MobileSubstrate/MobileSubstrate.dylib",
                "/usr/sbin/sshd",
                "/etc/apt"
            ]

            for url in checkUrls {
                do {
                    defer {
                        fclose(f)
                    }

                    f = try JailbreakCheck.fopen(path: url)

                    defer {
                        if f != nil {
                            isJailbreak = true
                        }
                    }
                } catch {}
            }

            return isJailbreak
        #else
            return false
        #endif
    }

    fileprivate class func fopen(path: String) throws -> UnsafeMutablePointer<FILE>? {
        let f = Darwin.fopen(path, "r")
        return f
    }
}
```

## 使い方

```swift
if JailbreakCheck.isJailbreak {
    something()
}
```

## 最後に

`/private/jailbreak.txt` を削除するところの処理がちょっと不安ですが、まぁいいことにしておきましょうｗ
Cの `fopen` を使ったところこれ間違えてるゾイ！っていうところあれば編集リクやコメントでご指摘いただければ幸いです。