OmniAICreator/Qiita-1.07M huggingface dataset:
TensorFlow > tf.pack()でしていること > Packs a list of rank-R tensors into one rank-(R+1) tensor.

関連 http://qiita.com/7of9/items/b364d897b95476a30754

sine curveを学習するネットの作り方を勉強している。

[v0.1](http://qiita.com/7of9/items/b364d897b95476a30754
)では以下のコードを参考にさせていただいた。
http://qiita.com/learn_tensorflow/items/3e46b2512a1bab73f5b2

### 不明点

上記のコードで不明だった点は以下。

```train.py
import tensorflow as tf
import tensorflow.contrib.slim as slim

# ファイル名の Queue を作成
filename_queue = tf.train.string_input_producer(["input.csv"])

# CSV を parse
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
input1, input2, output = tf.decode_csv(value, record_defaults=[[0.], [0.], [0.]])
inputs = tf.pack([input1, input2])
output = tf.pack([output])

...
```

tf.decode_csv()で読み込んだinput1, input2をinputsに、outputをoutputにtf.pack()している。

inputsの方は2つの項目を足すためだと思っていた。一方でoutputをわざわざtf.pack()する意味が不明だった。

### 公式ドキュメント

https://www.tensorflow.org/versions/r0.11/api_docs/python/array_ops.html#pack

> Packs a list of rank-R tensors into one rank-(R+1) tensor.

tensorのランクを+1する効果があるらしい。

### tf.pack()なしだとどうか?

```
inputs = tf.pack([input1])
output = tf.pack([output])
```

を以下としてみた (outputのtf.pack()をやめた)。

```
inputs = tf.pack([input1])
#output = tf.pack([output])
```

実行時に以下のエラーが出た。

> ValueError: Shapes (4, 1) and (4,) are incompatible

tensorのランクがRのままだとうまく動かなくなる。
このあたりは使用するtensorのshapeについて勉強することになる。
バイナリサーチの計算量がO(log_2 n)となる理由

データ個数が$n$の時のバイナリサーチの計算量が$O(log_2n)$となる理由について書いてみました。

>$log_an$ とは「$a$を○乗すると$n$になる」の「○」にあたる値です。
>（例：$log_28$ は「$2$を○乗すると$8$になるような○」なので「$log_28 = 3$」）

バイナリサーチのアルゴリズムを簡単に書くと

1. 検索範囲（ソート済み）の中央に位置する値を検索値と比較する。
2. 検索値が中央の値より大きければ中央より右側、小さければ中央より左側を検索範囲に設定する。
3. 中央の値 `==` 検索値が真となるような中央の値が見つかる（または検索範囲が$1$になる）まで、1～2を繰り返す

…となります。

検索範囲が$1$になった状態とは、（検索範囲のデータ個数を$n$として）「$n$に対して$\frac{1}{2}$を繰り返し掛けていき、検索範囲のデータ個数が$1$になった状態」と言えますが、これを数式で表現すると以下のような式となります。

```math
\begin{align}
1 &= n \times \frac{1}{2} \times \frac{1}{2} \times\quad...\quad\times　\frac{1}{2}\\
\end{align}
```

上の式において、「$n$に対して$\frac{1}{2}$を掛ける回数」が、データ個数が$n$の時の計算量となります。この「$\frac{1}{2}$を掛ける回数」を$x$とし、式変形して$x$を求めていきます。

```math
\begin{align}
1 &= n \times \frac{1}{2} \times \frac{1}{2} \times\quad...\quad\times　\frac{1}{2}\\
&= n \times \Bigl(\frac{1}{2}\Bigr)^x\\
&= n \times \frac{1}{2^x}\\
&= \frac{n}{2^x}\\
両辺に2^xを掛けると\\
2^x &= n\\
\therefore x &= log_2n
\end{align}
```

以上、データ個数が$n$の時のバイナリサーチの計算量が$O(log_2n)$となる理由でした。
技術英語 > Find [misplaced] comments and quotation marks.

@ Code Complete (No. 17743 / 36077)

> Find <font color=red>misplaced</font> comments and quotation marks.

http://ejje.weblio.jp/content/misplace

「間違った場所に置く」として自分が思いつく英語は

Find comments and quotation marks <font color=red>placed by mistake</font>.

この場合、「間違って置いた」と訳せそうだが、「置く場所を間違えた」と読み取れるかどうか?

Find comments and quotation marks <font color=red>put at the incorrect place by mistake</font>.

長い

http://stackoverflow.com/questions/37280407/ggplot2-how-to-create-vertical-line-corresponding-to-quantile-in-geom-bar-plot
>  instead of creating the vertical line at the incorrect place?

上記のmisplaceを使うと１つの単語で済む。
NethServer 6.8

## 特徴

* CentOS 6.8 ベース
* インストールが楽
* [download](http://www.nethserver.org/getting-started-with-nethserver/)

## インストーラー

* Diskを2つ搭載していれば RAID1 組むか聞いてくる :smile: 

![disk.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a70a2055-c486-11dc-c747-363122ca1335.png)

![r1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/cfc748d9-09a3-d531-7f80-1f2e0fb06358.png)

![r2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/942f48d8-836c-9938-0610-3f1be0a30ae0.png)


## VirtualBoxのポート転送設定

![port.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b521c7e2-7236-ed8c-064a-a9da10e17efa.png)

## 初回設定

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/831c06a6-0b20-d487-91f4-95ebb9caf290.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/59821b95-825f-031c-f6d8-66de98ae49fb.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c5b9bc2c-80c4-f618-13a7-f35520a5a417.png)
![4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a45f4aac-da56-762f-9fc3-72b2935adebd.png)
![5.png](https://qiita-image-store.s3.amazonaws.com/0/25728/44f871c3-9621-16de-e96d-871399712f98.png)
![6.png](https://qiita-image-store.s3.amazonaws.com/0/25728/120aeac9-91f7-02cf-afe8-9d3b188bbac2.png)
![7.png](https://qiita-image-store.s3.amazonaws.com/0/25728/91483dd7-a54a-a96b-e51b-b7bb2ed3da3b.png)
![8.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d305ea67-2e0d-28f5-287c-61e5ab991abe.png)
![9.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8ddba445-ec3c-5202-0c1f-ce46626bedb1.png)

## インストール後

![11.png](https://qiita-image-store.s3.amazonaws.com/0/25728/25981dbc-f9ac-78bc-3d1d-a5ad9be5695d.png)

![12.png](https://qiita-image-store.s3.amazonaws.com/0/25728/94a82090-9dcb-3e6c-ad20-ca7c1db40676.png)

## Dashboard

![14.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b4e48779-e146-04f6-39b0-6903e9dc3bf5.png)
AWS Lambdaを使ったサムネール作成でNode.jsとPythonを比較してみた


AWS Lambdaを使ったサムネール作成処理においてNode.jsとPythonのどちらのフレームワークがよいかを調べてみた。

## TL;DR

- サムネール作成するならNode.jsよりもPythonのほうが数段性能良さそう
- サンプルコードは[こちら](https://github.com/tanakatsu/aws_labmda_create_thumbnail)
 

## 実験シナリオ

1. S3から写真をダウンロード
1. ExifのOrientationの値を見て回転補正する
1. 回転補正後のwidth, heightの値を取得する
1. 50%にリサイズしS3にアップロードする

#### 入力画像

- 3264 x 2448	
- ファイルサイズ: 約5.5M
- Orientation: Rotate 90 CW

#### 出力画像

- 1224 x 1632
	- 50%にリサイズ
	- ExifのOrientationを見て回転補正 
- ファイルサイズ： 約730-750KB（圧縮quality=95）


### Lambdaファンクションスペック
- メモリ256M
	

## 実験結果

AWSのコンソール上で5回ずつ実行した結果

|                  | Node.js      | Python       |
|:-----------------|-------------:|:------------:|
| 処理時間(ms)  　　 | 10500 - 12375|  3214 - 3727 |

Pythonのほうが圧倒的に処理時間が短いという結果に。
最大使用メモリサイズもPythonのほうが小さかったです。

ということで、AWS Lambdaでサムネール生成をするならNode.js使うよりPython使うほうが良さそうです。

## Pythonでのサムネール作成

Node.jsはImageMagick（GraphicMagicks）が最初から使えるようになっていてサンプルプログラムや記事もたくさんありますがPythonはあまり情報がありません。以下を参考にPythonでの画像処理ライブラリPillowをEC2上でビルドしたら意外とすんなりサムネール作成がLambdaを使って動きました。

- [画像処理ライブラリ「Pillow」をAWS Lambdaで使ってみる](http://developer.wonderpla.net/entry/blog/engineer/Lambda_Python_Pillow/)


今回実験で使用したコードは[ここ](https://github.com/tanakatsu/aws_labmda_create_thumbnail)に置いてあります。ビルド済みのPillowもレポジトリに含まれているのでAWS Lambda x Pythonですぐにサムネール作成してみたいときに役立つと思います。
XAMPPのphpMyAdminでMySQLの一般ユーザー(root以外のユーザー)を作成する方法

#はじめに
##対象読者
- ローカル(自分のPC)ではじめてMySQLを使う方
- WordPressなどをレンタルサーバで利用していて、phpMyAdmin(MySQL)なるものがあることを知っているが操作したことがないといったレベル感の方


##MySQLの一般ユーザー(root以外のユーザー)を作ろう

- Web制作を全部自分ひとりでやっている、という方は、MySQLの操作をすべてrootで行っても問題ないかもしれないが、複数人で開発をする場合は、root以外のユーザーを作る方が良い。
- 一般ユーザーを作って、権限を絞るのがベター。
- ひとつのデータベースにつき、ひとつの一般ユーザーを作ることをおすすめ
- phpMyAdminはXAMPPでもレンタルサーバーでも使い方はほぼ同じなので、ローカルで操作方法に慣れておくと、レンタルサーバーで操作するときにも怖くない！

##環境
OS：Windows10 64bit
CPU：Corei3
メモリ：8GB
XAMPP7.0.9ポータブル

[※XAMPP7.0.9の構築方法・MySQLの初期設定はこちら](http://qiita.com/RikaKawasaki/items/ab54feaa5123de3612d8)

#XAMPPのダッシュボードからphpMyAdminにアクセス

http://localhost/dashboard/
![image](https://qiita-image-store.s3.amazonaws.com/0/115516/c45686dc-3af1-e7a0-536c-14d7a6360211.png)

##１．phpMyAdminにrootでログインし、 データベースを作成する

画面上部メニューの「データベース」をクリック

![image](https://qiita-image-store.s3.amazonaws.com/0/115516/5ccf5bf1-bb15-17f4-42ee-115d383d4655.png)

- 任意のデータべース名（例：ここでは「cakephpTest」とします。私は普段phpのプロジェクト名と合わせています）を入力
- 照合順序は「utf8_general_ci（MySQLのデフォルト）」を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/115516/0b1a623b-a287-f914-4c3e-2119005592df.png)

データベースの作成が完了すると、ツリーに作成したデータベースが表示される

![image](https://qiita-image-store.s3.amazonaws.com/0/115516/1b90c34f-ea04-15b1-38ce-fa37c04cdf0e.png)

##２．一般ユーザーを作成

作成完了後、下記のページが表示されるが、テーブルはまだ作成しなくてもOK（赤枠で囲った部分でデータベース名確認）。テーブルはいつでも作成・編集等可能。

「cakephpTest」データベースにアクセスできる一般ユーザーを作成するために「特権」タブをクリックする。

![image](https://qiita-image-store.s3.amazonaws.com/0/115516/3eaf6222-c9ce-11a7-2cc9-27b2e346f902.png)

「Add user account」をクリックする。

![image](https://qiita-image-store.s3.amazonaws.com/0/115516/c61b7bfc-ac22-f0e8-0e9f-fb67eb26b440.png)

ログイン情報として下記を入力
・User name（任意の文字列）
・Host name（「ローカル」を選択すると自動的に「localhost」が入力される。(localhostはデフォルト）
・パスワード（任意の文字列）

Database for user account
「データベース "cakephpTest" への全ての特権を与える。」にチェック。

※開発環境なので全ての権限を付与してもOKとしている。
権限を制限したいときはこのチェックを外して「グローバル特権」セクションで権限を細かく設定する。
本番環境では「グローバル特権」 セクションにて「データ」にのみチェックが良い。

![image](https://qiita-image-store.s3.amazonaws.com/0/115516/d936ff06-fc4e-5565-39b0-77d35b391207.png)

ユーザーの作成が完了すると下記が表示される

![image](https://qiita-image-store.s3.amazonaws.com/0/115516/afd8d1fe-73b3-03d9-6089-3ffd8fdf4864.png)
AVFoundationで背面カメラと前面カメラの切り替えをする

## 環境

- Xcode 8.1
- えるたそ (OS X El Capitan 10.11.6)
- Swift 3.0.1
- iOS 10.1 (iPhoneSE)

## 画面構成

正方形の **previewView** (UIView)が配置されていて、
**changeUseCamera:** アクションボタンと **pushShutter:** アクションボタンが設置されています。

## サンプルソースコード

```swift:ViewController.swift
import UIKit
import AVFoundation

class ViewController: UIViewController {

	@IBOutlet weak var previewView: UIView!
	
	var isBackCamera: Bool = true
	var captureSession: AVCaptureSession!
	var cameraDevices: AVCaptureDevice!
	var imageOutput: AVCaptureStillImageOutput!
	
	// MARK: - Life Cycle
	override func viewWillAppear(_ animated: Bool) {
		super.viewWillAppear(animated)
		self.setupCamera(isBack: self.isBackCamera)
	}

	// MARK: - Private Method
	fileprivate func setupCamera(isBack: Bool) {
		guard let devices = AVCaptureDevice.devices() else {
			return
		}
		for device in devices {
			// isBack == True  -> Back Camera
			// iSBack == False -> Front Camera
			let devicePosition: AVCaptureDevicePosition = isBack ? .back : .front
			if (device as AnyObject).position == devicePosition {
				self.cameraDevices = device as! AVCaptureDevice
			}
		}

		let videoInput: AVCaptureInput!
		do {
			videoInput = try AVCaptureDeviceInput.init(device: self.cameraDevices)
		} catch {
			videoInput = nil
		}

		self.captureSession = AVCaptureSession()
		self.captureSession.addInput(videoInput)

		self.imageOutput = AVCaptureStillImageOutput()
		self.captureSession.addOutput(self.imageOutput)

		let captureVideoLayer = AVCaptureVideoPreviewLayer.init(session: self.captureSession)
		let layerRect = CGRect(x: self.previewView.frame.origin.x,
						       y: 0,
						       width: UIScreen.main.bounds.size.width,
						       height: UIScreen.main.bounds.size.width)

		captureVideoLayer?.frame = layerRect
		captureVideoLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill

		guard let videoLayer = captureVideoLayer else {
			return
		}
		self.previewView.layer.addSublayer(videoLayer)

		// 開始
		self.captureSession.startRunning()
	}
	
	// MARK: - IBAction
	
	// Change Camera
	@IBAction func changeUseCamera(_ sender: Any) {
		self.isBackCamera = !self.isBackCamera
		setupCamera(isBack: self.isBackCamera)
	}

	// Save taken photo
	@IBAction func pushShutter(_ sender: Any) {
		let captureVideoConnection = imageOutput.connection(withMediaType: AVMediaTypeVideo)

		self.imageOutput.captureStillImageAsynchronously(from: captureVideoConnection) { [weak self] (imageDataBuffer, error) -> Void in

			let capturedImageData: Data = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataBuffer) as Data

			guard let image = UIImage(data: capturedImageData),
					let wself = self else {
				return
			}

			UIImageWriteToSavedPhotosAlbum(image, wself, nil, nil)
		}
	}
}
```

## 補足

このままだと、一度アプリから離脱をしてしまうとカメラのセッションが切れてしまうので `AppDelegate.swift` の **applicationDidBecomeActive:** 等のメソッドを使って通知してセッションを再始動しないとダメなようです。
【Unity】Projectビューの左側に表示されているフォルダ一覧を取得する

#はじめに
Projectビューの左側に表示されている情報を取得する方法を調べてみました。
UnityのバージョンはUnity5.5.0b7です。

<img height = "480" src = "https://qiita-image-store.s3.amazonaws.com/0/44288/940d86ff-5deb-c1d9-687f-0956a278cbbe.png">

#実装
UnityのAPIにはProjectビューの情報を取得する機能が用意されていません。
そこで、C#のリフレクションを使って強引にデータを取得してみます。　

```Test.cs
/// <summary>
/// ProjectBrowserの左に表示されているフォルダ名を取得
/// </summary>
private static IEnumerable<string> GetFolderTreeNames()
{
    // Projectウィンドウ取得
    var asm = Assembly.Load("UnityEditor.dll");
    var typeProjectBrowser = asm.GetType("UnityEditor.ProjectBrowser");
    var projectBrowserWindow = EditorWindow.GetWindow(typeProjectBrowser, false, "Project", false);

    // フォルダの一覧取得
    var flag = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
    var m_FolderTree = typeProjectBrowser.GetField("m_FolderTree", flag).GetValue(projectBrowserWindow);
    var data = m_FolderTree.GetType().GetProperty("data", flag).GetValue(m_FolderTree, null);
    var m_Rows = data.GetType().GetField("m_Rows", flag).GetValue(data);
    var rowList = (IList)m_Rows;

    // フォルダの一覧取得
    for (int i = 0; i < rowList.Count; i++)
    {
        if (rowList[i].GetType().ToString() != "UnityEditor.IMGUI.Controls.TreeViewItem")
        {
            continue;
        }

        yield return (string)rowList[i].GetType().GetProperty("displayName", flag).GetValue(rowList[i], null);
    }
}
```

なお、この方法はUnityの**バージョンが上がると使えなくなる**可能性があるのでご了承ください。

#実行
Linqを使ってConsoleに出力してみます。

```Test.cs
GetFolderTreeNames().ToList().ForEach(s => Debug.Log(s));
```

実行結果
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/fc3d3562-36fd-7815-9f8c-621f717bd255.png)

フォルダ一覧の名前を正しく取得できていることが確認できました(完
オフショア開発とコミュニケーション

　わたしのこれまでの経験から、オフショア開発──特にその立ち上がりの時期に、現場の日本人エンジニアが気をつけるべき最も重要なことのひとつとして **コミュニケーション** が挙げられると思います。

　われわれとは異なる文化に属し、異なる言語を話し、異なる教育を受けてきた、いわば「つうと言えばかあと来ない」人たちと一緒に開発するときに、どのようなコミュニケーションスキルをもってすれば、円滑に仕事を進めることができるでしょうか。
　以下、わたしの考える必要なコミュニケーションスキルとして　**「1. 英語力」「2. 対話力」「3. 継続力」** の３点を挙げていきます。

### 1. 英語力 ###

　業務に耐えうるレベルの日本語を扱えるエンジニアは、おそらく世界のどこであっても希少かつ高価です。日本の企業がオフショア開発をおこなう場合、マネージャーなど現地の要職には日本語のできる人材を置くことが一般的だと思いますが、「日本語ができる」ということは希少性を極端に高めます。別の言い方をすれば、日本語ができなくても構わない（英語さえできればよい）のであればほぼ同等の能力の人材をもっと安価に雇用できる、ということになります。
　また、プログラマーやテスターなどの実働部隊にも日本語話者を揃えられるケースは極めて稀でしょう。そんなことをすればオフショア開発の最大の目的のひとつであるコストメリットが出しにくくなるからです。しかし、彼らが日本語を話せないからといって、彼らと日本人エンジニアの間のすべてのやりとりにコミュニケーターを介していては、作業の効率が悪くなりますし、コミュニケーターがボトルネックになる可能性も考えられます。
　このような背景により、日本人エンジニアも最低限の英語力を身につけることが望ましいでしょう。わたしが経験したフィリピンとベトナムでは、現地のエンジニアはみな一定の英語教育を受けていましたので、おおむねすべてのプログラマーやテスターとも直接会話することができました。とは言っても、彼らの多くの英語力はTOEICのスコアでいえば400〜500点程度なのですが、重要なことはそれにもかかわらず彼らが **臆せずに英語で話そうとする** 点だと思います。日本人エンジニアは「わたしは英語ができない」などと言いがちですが、実際にまったくできないはずはありません。しかし、英語を使おうとしなければ、それは結果的に「まったくできない」のと同じことになってしまうのです。

### 2. 対話力 ###

　では、英語が話せればそれだけで「コミュニケーションスキルがある」ということになるのでしょうか。わたしはそうは思いません。
　陥りがちなのは、「英語でメールなりコメントなりをひたすら書き上げて、それを相手（現地のエンジニア）に渡せば、コミュニケーションは成立する」という錯覚です。実際は、これは「コミュニケーション」ではなく、単なる一方的な「アナウンスメント」にすぎません。
　「コミュニケーション」（communication = やりとり、連絡、通信、共感）において重要なことは、それが **相互作用** であるという点です。相互作用であるからには、自分の発信したことを、相手がどのように受け止め、どのように考え、どのようなリアクションを取るか、というところまで配慮する必要があります。
　特に、オフショア開発の場合、われわれの対話の相手である現地のエンジニアは、日本で育った日本人ではありません。たとえ十分な日本語教育を受けていて、業務に耐えうる日本語力を持っているエンジニアであったとしても、決して母語話者ほどの語彙があるわけではなく、また日本の風習や文化、地名、著名人などに詳しいとも限りません。
　つまり、日本語にせよ英語にせよ、現地のエンジニアと対話しようとするわれわれ日本人エンジニアは、相手が「異文化の外国語を話すことを強いられている」状態であることに配慮してあげることが重要です。
　以下は、わたしが経験から実践している配慮の一例です。このような配慮は、日本語で対話しようとするときに特に怠りがちです。（1.で述べたわれわれが英語を学ぶことのメリットには、外国語を話すことの難しさを改めて意識することでこうした配慮の必要性を実感できる、ということも含まれると思います）

- 二重否定（〜でないわけではない）などの分かりづらい表現を避ける
- なるべく平易な語彙に置き換える
- 業界用語的な省略語、カタカナ語を避ける（最悪な例：プロマネ、カンスト）
- 日本の祝祭日のことを当たり前のように話さない
- 日本のシステム（e.g. ICカードで電車やバスに乗れる、コンビニで公共料金が払える、街じゅうに自動販売機がある）を当然のこととしない
- 労働・雇用環境の違いを意識する

### 3. 継続力 ###

　コミュニケーションとは、人と人とのつながりです。たとえ一過的な開発体制であったとしても、人と人がつながるためには信頼関係が不可欠であり、信頼関係の醸成にはある程度の期間の継続的なコミットメントが必要です。
　業務に必要な対話を、必要なときに、必要な分だけおこなうのでは、十分な信頼関係は構築できません。（あなた自身が逆の立場だったら、と想像してみてください）
　たとえば相手の近況や趣味、また相手国の祝祭など、些細な話題だとしても業務外の対話を日常的に交わし、 **こちらが相手に興味を持っている** という姿勢を見せることで、相手の心理的な障壁は下がって行くことでしょう。そして、顔を合わせる機会があれば一緒に食事をして、また他愛のない話をする──そうしたことを繰り返すことで、友情とまではいかなくても一種の信頼関係は作れるはずです。

### 参考文献 ###

- [標準テキスト オフショアプロジェクトマネジメント 【SE編】](https://www.amazon.co.jp/dp/4774138363)（技術評論社, 2009）
- [標準テキスト オフショアプロジェクトマネジメント 【PM編】](https://www.amazon.co.jp/dp/4774140031/)（技術評論社, 2009）
- [Yuta 何しにベトナムへ？～エンジニア海外奮闘記（3）：ベトナム人は社員旅行が好き～対話やホワイトボードやピザを駆使してベトナム人社員をマネジメントする (1/4) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1509/15/news014.html)
- [ベトナムIT業界に起こる「オフショア疲れ」--対応を迫られる日本企業 - CNET Japan](http://japan.cnet.com/sp/startup_asia/35082101/)
[メモ] (らずぱい) sudoers: /etc/sudoers.d/010_pi-nopasswd

## 環境
- Raspberry Pi 2 
- Raspbian Jessie with PIXEL : `2016-09-23-raspbian-jessie.img`
- Raspbian Jessie Lite : `2016-09-23-raspbian-jessie-lite.img`

## 概要
- 2016年11月、`sudo apt-get update ; sudo apt-get dist-upgrade`をやったときでてきたメッセージ
- ユーザ`pi`で、`sudo`使ったとき、パスワード聞かれない、って設定が、`/etc/sudoers`から、`/etc/sudoers.d/010_pi-nopasswd`に移ったよ、
- で、前の(バージョンとかの)設定で、そのあたり変更して引き継いで使ってる人は注意、って話。(条件で、ごにょごにょしてくれるらしいけど)

```txt:原文(一部改行削除)
raspberrypi-sys-mods (20161018+3) jessie; urgency=medium

  * The 20161018 release has introduced a /etc/sudoers.d/010_pi-nopasswd file.
    - The file is installed even if the "pi ALL=(ALL) NOPASSWD: ALL" entry has been previously removed from /etc/sudoers by the user.
    - If you do not want the entry to exist, please comment out or remove 010_pi-nopasswd.
    - If upgrading to 20161018+3 from a version earlier than 20161018, the line in 010_pi-nopasswd is automatically commented out if the entry doesn't exist in sudoers.
    - See https://github.com/RPi-Distro/raspberrypi-sys-mods/issues/6

 -- Serge Schneider <serge@raspberrypi.org>  Wed, 19 Oct 2016 10:52:07 +0100

(q to quit)
````

```shell-session:/etc/sudoers.d/010_pi-nopasswd
pi@raspberrypi:~ $ sudo cat /etc/sudoers.d/010_pi-nopasswd 
pi ALL=(ALL) NOPASSWD: ALL
pi@raspberrypi:~
```

## ぐ～ぐる先生による翻訳

```txt:訳
raspberrypi-sys-mods（20161018 + 3）jessie; 緊急度=中程度

   * 20161018リリースでは、/etc/sudoers.d/010_pi-nopasswdファイルが導入されました。
     - "pi ALL =（ALL）NOPASSWD：ALL"エントリが以前にユーザによって/ etc / sudoersから削除されていても、ファイルはインストールされます。
     - エントリが存在しないようにするには、010_pi-nopasswdをコメントアウトまたは削除してください。
     - 20161018より前のバージョンから20161018 + 3にアップグレードする場合、エントリがsudoersに存在しない場合、010_pi-nopasswdの行は自動的にコメントアウトされます。
     - https://github.com/RPi-Distro/raspberrypi-sys-mods/issues/6を参照してください。

  - Serge Schneider <serge@raspberrypi.org>水曜日、2016年10月19日10:52:07 +0100
```

## その他
- ぐーぐる先生の翻訳、よくなってる？
すごいHaskell本のヒースロー問題の別解

問題はこちらにある通り、A、Bの2本の道路を通ってヒースローからロンドンへ到達する最短経路を求めるという問題。
http://learnyouahaskell.com/functionally-solving-problems#heathrow-to-london

本はいきなり複雑で完璧な解を書きすぎじゃないかな。
本にも書いてある通り、「まずはコンピュータから離れて手で問題を解く方法を考え、次にそれをHaskellで表現する方法を考えましょう」という方針でやったらこうなった。これくらいベタな方が「関数型問題解決法」の本質を理解しやすいと思うけど。

```Heathrow.hs
a :: Int -> Int
a 0 = 0
a 1 = min ((a 0) + 50) ((b 0) + 10 + 30)
a 2 = min ((a 1) + 5)  ((b 1) + 90 + 20)
a 3 = min ((a 2) + 40) ((b 2) + 2  + 25)
a 4 = min ((a 3) + 10) ((b 3) + 8 + 0)

b :: Int -> Int
b 0 = 0
b 1 = min ((b 0) + 10) ((a 0) + 50 + 30)
b 2 = min ((b 1) + 90) ((a 1) + 5 + 20)
b 3 = min ((b 2) + 2) ((a 2) + 40 + 25)
b 4 = min ((b 3) + 8) ((a 3) + 10 + 0)

main = do
    print $ a 4
```

本とは違って所要時間しか出していないけど、経路も出すようにしたり、入力を任意長のリストに拡張することは簡単にできる。
レコードを削除する


### TRUNCATE 文 
TRUNCATE は、必ずテーブルを全行削除します。WHERE 句で条件を指定して、一部の行だけ削除するということは出来ません。従って、細かい制御は出来ないのですが、その代わり、DELETE よりも削除の処理が高速であるというメリットがあり、COMMIT は不要。パフォーマンスがいい。
gsubでマッチした部分を置き換え文字の生成に利用したい


`gsub(pattern, replace)`は`pattern`にマッチする部分をすべて`replace`に置き換えてくれる便利メソッドです。`pattern`として正規表現、`replace`として文字列をそれぞれ指定することが多いと思いますが、実はブロックを持つこともでき__「`pattern`でひっかけた部分をこねくりまわして`replace`にしたい」__というときにはとても便利です。

たとえば英数字からなる文字列のうち、aとcだけをすべて大文字にする場合は次のように書くことができます。

```rb
p "1a2b3c".gsub(/[ac]/){|ch| ch.upcase} #=> "1A2b3C"
```

余談ですが、Rubyでは「暗黙のProc化」とでもいうべき裏機能(?)があります。これは`&obj`のようにアンパサンドを先頭に付与した場合、それに続く`obj`を`Proc`として扱おうとするというもので、なかでも`&:symbol`のよう「アンパサンド +  `Symbol`」という組合せはよく使われます。

たとえば文字列配列の中身をすべて整数に変換したい場合、この「暗黙のProc化」を利用して次のように書くことができます。

```rb
words = ["1", "2", "3"]
p words.map{|ch| ch.to_i} #=> [1, 2, 3]
p words.map(&:to_i) #=> [1, 2, 3]
```
この例では`map`メソッドのブロックを`&:to_i`で代用しています。ブロックありの`gsub`もこれと同じにようにブロックを省略し、「暗黙のProc」で代用することができます。つまり最初の例は次のようにもかけてしまうということになります。

```rb
p "1a2b3c".gsub(/[ac]/, &:upcase)  #=> "1A2b3C"
```

ブロックをわざわざ書く必要がない分、とてもらくちんですね(｀・ω・´)ｼｬｷｰﾝ
Rails 5 Action Cable メッセージとルームを紐付ける。

#　概要
Rails5 Action Cableを使ってリアルタイムなチャットアプリを作るという記事が多いが、常にと言っていいほどメッセージモデルとルームモデルを紐付ける方法が質問されているので、その方法を書く。


# Modelの構成
User, Message, Roomモデルがあり、MessageModelはUserModelとRoomModelに紐づいている。

```ruby:app/models/user.rb
class User < ActiveRecord::Base
  has_many :messages
end
```
```ruby:app/models/room.rb
class Room < ActiveRecord::Base
  has_many :messages
end
```
```ruby:app/models/message.rb
class Message < ActiveRecord::Base
  # メッセージの保存に成功したらBroadCastJobに投げる
  after_create_commit { BroadCastMessageJob.perform_later self }
  # こうしとくと誰が送ったか識別しやすい
  belongs_to :sent_user, class_name: "User", foreign_key: 'user_id'
  belongs_to :room
end
```

# Controller
```ruby:app/controllers/rooms_controller.rb
class RoomsController < ApplicationController

  def show
    @room = Room.find(params[:id])
    @messages = @room.messages
  end

end
```

# view
```ruby:app/views/rooms/show.html.erb
<div id="messages", data-room_id="<%= @room.id %>">
  <%= render @messages %>
</div>
<div class="input">
  <form>
    <label>post</label>
    <input type="text" data-behavior="room_speaker">
  </form>
</div>
```
```ruby:app/views/messages/_message.html.erb
<div class="message">
  <p><%= "#{message.sent_user.name}: #{message.content}" %></p>
</div>
```

# Room_idを受け取る
要するにあらかじめrooms_controllerからshow.html.erbにroomの情報(room_id)を渡しておいて、それをjs(room.coffee)で受け取り、その情報に基づいてチャンネル(room_channel.rb)の中でメッセージを作る。

```ruby:app/assets/javascripts/channels/room.coffee
jQuery(document).on 'turbolinks:load', ->
  # viewの<div id="messages">から受け取る
  messages = $('#messages')
  if $('#messages').length > 0
  
  # ここやで
  App.room = App.cable.subscriptions.create { channel: "RoomChannel", room_id: messages.data('room_id') },
    received: (data) -> 
      $('#messages').append data['message']

    speak: (message) ->
      @perform 'speak', message:
message

  $(document).on 'keypress', '[data-behavior~=room_speaker]', (event) ->
    if event.keyCode is 13
      App.room.speak event.target.value
      event.target.value = ''
      event.preventDefault()
```

```ruby:app/channels/room_channel.rb
class RoomChannel < ApplicationCable::Channel
  def subscribed
    # このparams["room_id"]は上のroom.coffeeでsubscriptionを作る際に渡しているのがポイント。
    stream_from "room_channel_#{params['room_id']}"
  end

  def speak(data)
    # ここでRoomとMessageが紐付けられる。
    Message.create(content: data['message'], sent_user: current_user, room: Room.find(params['room_id']))
  end
end
```

# ジョブに投げる
MessageModelの中のafter_create_commitで、メッセージの保存に成功したらjobに飛ばすように指定してる。

```ruby:app/jobs/broadcast_message_job.rb
class BroadCastMessageJob < ApplicationJob
  def perform(message)
    ActionCable.server.broadcast "room_channel_#{message.room_id}", message: render_message(message)
  end

  private

  def render_message(message)
    ApplicationController.renderer.render(partial: messages/message, locals: { message: message })
  end
end
```
これで完成。
投稿した内容が保存され、かつリアルタイムで画面に表示されれば完成。

# 結論
本当にビューの中にroom_id渡してJSで受け取ってゴニョゴニョするしかないんですかね、、
とりあえず私が調べた限りはこれくらいしかなさそうでしたが、、
[備忘録]RustでiOSアプリ[後で読む]


[[rust-dev] iOS cross compilation](https://mail.mozilla.org/pipermail/rust-dev/2014-June/010323.html)
[Taking Rust everywhere with rustup](https://blog.rust-lang.org/2016/05/13/rustup.html)
[プログラミング言語RustがiOSでのクロスコンパイルに対応したので試してみた](http://safx-dev.blogspot.jp/2014/06/rustios.html)
[Rust 1.0がリリースされたので、iOS用ライブラリを書く](http://qiita.com/moriturus/items/1190614dcbbe31ecfc2f)

[Building an iOS App in Rust, Part 1: Getting Started with Rust](https://www.bignerdranch.com/blog/building-an-ios-app-in-rust-part-1/)
[Building an iOS App in Rust, Part 2: Passing Primitive Data Between Rust and iOS](https://www.bignerdranch.com/blog/building-an-ios-app-in-rust-part-2/)
[Building an iOS App in Rust, Part 3: Passing Owned Objects between Rust and iOS](https://www.bignerdranch.com/blog/building-an-ios-app-in-rust-part-3/)
[Building an iOS App in Rust, Part 4: A Basic View Model in Rust](https://www.bignerdranch.com/blog/building-an-ios-app-in-rust-part-4/)

[kennytm/rust-ios-android](https://github.com/kennytm/rust-ios-android)
メタプロ　序章

メタプログラミングについての本を読んでいるので、読んだ部分を忘れないように自分でまとめます。
参照文献：「メタプログラミング　Ruby 第二版」　オライリー・ジャパン　/ Paolo perrotta 著
##メタプログラミング
メタプログラミングとは,コードを記述するコードを記述することである。

##インストロペクション
変数、クラス、メソッドなどを **言語要素(language constructs)** と呼ぶ。
Ruby言語では、言語要素に質問できることができる。これをインストロペクションと呼ぶ。
どういうことかというと、例えば以下のようなクラスがあったとする。
同時にクラスのインスタンスも生成した場合、それについてのクラスを聞くと教えてくれます。

```ruby:helloworld.rb
class Helloworld
  def initialize(text)
    @text = text
  end

  def first
    @text
  end
end

object = Helloworld.new("helloworld")

object.class        # => Helloworld
```

また、クラスにインスタンスメソッドの一覧を聞くこともできる。

```ruby:helloworld.rb
class Helloworld
  def initialize(text)
    @text = text
  end

  def first
    @text
  end
end

object = Helloworld.new("helloworld")

object.class        # => Helloworld

object.class.instance_methods(false)   # => [:first]
```
＊ここで引数のfalseは、自分のクラスに定義されたインスタンスメソッドの一覧を表示させるだけで、継承したものはださないという意味です。

更に、インスタンス変数についても教えてくれる。

```ruby:helloworld.rb
class Helloworld
  def initialize(text)
    @text = text
  end

  def first
    @text
  end
end

object = Helloworld.new("helloworld")

object.class        # => Helloworld

object.class.instance_methods(false)   # => [:first]

object.instance_variables  # => [:@text]
```

##オープンクラス
オープンクラスについての簡単なまとめ。

```ruby:openclass.rb
class Open 
  def x
    puts "x"
  end
end

class Open
  def y
    puts "y"
  end
end

obj = Open.new
obj.x  #=> "x"
obj.y  #=> "y"
```
なにが起きているのかまとめると、
先ずはじめのclass Openが読み込まれた段階では、class Openは存在していない。すると当然、クラス　Openは作成されます。そしてその後、xメソッドが定義されています。

しかし、二回目のclass Openの段階ではすでにOpenクラスが存在しているので改めて定義されません。その代わり、既存のクラスを**再オープン**して、　yメソッド追加します。

つまり、いつでも既存のクラスを再オープンし、メソッドを追加できます。
この技法のことは**オープンクラス**と呼びます。

##オープンクラスの問題点
オープンクラスの問題点として有名なのが、既存のクラスを再オープンし、メソッドを追加するときに、そのメソッド名が既に存在しているときである。

この場合、既存のメソッドを上書きしてしまい、どこかでそのメソッドが使われているところでバグが起きてしまいます。

これようなことを**モンキーパッチ**と呼びます。

```ruby:openclass.rb
class Open 
  def x
    puts "x"
  end
end

class Open
  def x
    puts "y"
  end
end

obj = Open.new
obj.x  #=> "y"　←上書きされている
```

これは、Openクラスを再オープンし、メソッドxを上書きしています。
EclipseでGAE/JとApache Ivyを組み合わせる備忘録

# Eclipseのプラグインをインストールする
- Apache IvyDE
- Apache Ivy Ant Tasks

# Ivyを使う
1. 新規作成からIvyファイル作成を選択し、ivy.xmlを作成する
2. ivy.xmlの\<dependencies>タグの中に、依存するライブラリの情報を記載する。

# warに含めるため、war/WEB-INF/libへライブラリを保存させる
1. Ant用にbuild.xmlを作成する。
2. Antタスクとして実行する。

``` build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project default="retrieve" basedir="."
         xmlns:ivy="antlib:org.apache.ivy.ant">

  <target name="retrieve">
      <ivy:retrieve pattern="war/WEB-INF/lib/[artifact]-[revision].[ext]" type="jar" />
  </target>
</project>
```
retrieveタグの記載方法は、公式ドキュメントが参考になった。
http://ant.apache.org/ivy/history/latest-milestone/use/retrieve.html
Picassoがどのくらい画像をキャッシュしているか知る方法

Picassoは画像表示に非常に便利ですがそのパフォーマンスも気になります。
パフォーマンスについてはリストなのか単体表示なのかなど実装にもよりそうですが、
一つの指標としてどのくらい適切なタイミングでキャッシュができているかもあります。

```
Picasso.with(context).load(imageUrl).into(imageView);
Picasso.with(getApplicationContext()).setIndicatorsEnabled(true);
```
そこで、↑このように実装すると画像がどのようにキャッシュされているかがUI上で確認できます。

<img width="325" alt="スクリーンショット 2016-11-19 0.15.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/113832/ea613554-6703-419a-75dd-18f84b271eed.png">

左上のの角に色が付いているのがわかると思います。
<img width="57" alt="スクリーンショット 2016-11-19 0.16.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/113832/aa8a4fa3-dd8a-b579-46c8-68f246a587d6.png">

意味は色によって下記のようになります。

|色|赤|青|緑|
|:---:|:---:|:---:|:---:|
|表示方法|NetWork|Disk|Memory|

自分のアプリで見てみると結構面白いかもしれません。
[Laravel]一対多の関係のJsonを出力する

私用で Laravelを触っていた時にふと気になって調査してました．
Laravelのバージョンは[5.2](https://readouble.com/laravel/5.2/ja/)になります．

## Laravel で Jsonを返す方法

jsonの出力の仕方は色々な記事や公式ドキュメントを参照すると確認できるのですが，
リレーションを行なった時の記事はなかなか出てこないので，忘れた時のことを考えてメモ...

## Jsonの出力方法

基本的には，ルーティングをした後に

```php
public function getJson(){
    return Model::all()->toJson();
}
```

で，jsonが返されるかと思います．

## リレーションを用いている時のJson出力

```php
class Test extends Model{
    public function tests(){
        return $this->hasMany('App\Test1');
    }
}

class Test1 extends Model{
    public function test(){
        return $this->belongsTo('App\Test');
    }
}
```

となっている場合， Test1 に紐づく Test のデータは,

```php
public function getJson(){
    return Test1::with(['test'])->get()->toJson();
}
```

みたいに書くと取得できます．

(2016/11/19 : よりシンプルな書き方を教えていただきましたので追記します．)
逆の場合には，

```php
public function getJson(){
    return Test::with(['tests'])->get()->toJson();
}
```
でいけます．

少し手間がかかりますが，自分でkeyを指定することもできます．

```php
public function getJson(){
    $test_all = Test::all();
    foreach($test_all as $test){
        $test['testA'] = $test->tests()->get();
    }
    return $test_all->toJson();
}
```

またもっと深いネストで実現したい場合には,

```php
public function getJson(){
    $test_all = Test::all();
    foreach($test_all as $test){
        $test['testA'] = $test->tests()->get();

        $test['testA']['testB'] = $test->tests()->get();

        $test['testA']['testB']['testC'] = $test->tests()->get();
    }
    return $test_all->toJson();
}
```

みたいにやるといけると思います．

***
追記

```php
class SampleA extends Model{
    public function c_samples(){
        return $this->hasMany('App\SampleB');
    }
}

class SampleB extends Model{
    public function c_samples(){
        return $this->hasMany('App\SampleC');
    }
}

class SampleC extends Model{
    public function b_sample(){
        return $this->belongsTo('App\SampleB');
    }

    public function a_sample(){
        return $this->belongsTo('App\SampleA');
    }
}
```

こんな感じのモデルの関係で，SampleBのJson出力を行う際,「SampleCに紐づくSampleAのデータも欲しい!」なんて時には，

```php
public function getJson(){
    return SampleB::with(['c_samples.a_sample'])->get()->toJson();
}
```

って感じで， ドットで追加すればいけます．
調査を行っていく度にLaravelの優秀さに驚く・・
%timeや%%time等の結果をオブジェクト(変数)に格納したい

IPython(Jupyter)のline magicやcell magicの出力、その他諸々の出力を標準出力ではなく、オブジェクト(変数)に格納して後から加工したいということがたまにあるかもしれません。(例: 実行した関数の戻り値じゃなくて出力が欲しい)  

あまり褒められたやり方ではないかもしれませんが、`sys.stdout`の出力先を一時的に`StringIO`へ飛ばしてしまう方法で実装してみます。  

* 準備  

```py
try:
    from io import StringIO  # Python3
except:
    from cStringIO import StringIO  # Python2
import sys

old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()
```

* `%%time`の出力をハンドリング  

```py
%%time
for i in range(1000000):
    i ** 2
```

* 後始末(**必ずやるように！**)  

```py
sys.stdout = old_stdout
```

* 結果を取得  

```py
clock_times = mystdout.getvalue()
print(clock_times)
```

```
CPU times: user 467 ms, sys: 0 ns, total: 467 ms
Wall time: 469 ms
```
JSUG Spring Day 2016資料まとめ

*＊一部しか見つかっていません*
#ROOM1
##Spring Framework 5.0
**Stéphane Nicoll**
https://speakerdeck.com/snicoll/spring-framework-5-dot-0-themes-and-trends

##災害対策(DR)対応の超ミッション・クリティカル Cloud Foundry は Azure !!
###〜米 Ford 社の Ford PASS 事例から学ぶ超高可用 Cloud Foundry〜
**寺田 佳央**
https://docs.com/terada-yoshio/1053/spring-day-2016

##Cloud Foundry x Wagby
**贄 良則**

##Spring Bootを使って大きな生産性を得る10の方法
**Stéphane Nicoll**
https://github.com/snicoll-demos/cfp-example

##LINE における Spring Framework の活用
**松野 徳大**
http://www.slideshare.net/tokuhirom/linespring-framework

##Springからブロックチェーン、触ってみた！
**漆原 茂**

##Springのための、IntelliJ IDEAの40の秘訣
**Yann Cebron/Stéphane Nicoll**
https://github.com/YannCebron/springtricks

##Spring で実現する SmartNews のニュース配信基盤
**井口 貝**
https://speakerdeck.com/kainoque/spring-deshi-xian-suru-smartnews-falseniyusupei-xin-ji-pan

#ROOM2
##Application Re-Architecture Technology
###～ StrutsからSpring MVCへ ～
**倉元 貴一/池谷 智行**

##Java EEユーザーから見たSpring
**浦上太一**

##Let's Visualize Your Spring Cloud Applications!
###～ElasticsearchとSleuthを使った可視化の実際〜
**谷本 心**
https://speakerdeck.com/shintanimoto/lets-visualize-your-spring-cloud-applications-number-jsug-number-springday

##Microservices Architectureを超大規模プロジェクトでやってみた。
###～一筋縄ではいかない苦闘の一年間～
**三宅 泰裕**
https://speakerdeck.com/kingofreverb/microservices-architecturewochao-da-gui-mo-puroziekutodeyatutemita

##Grailsでドメイン駆動設計を実践する時の勘所
**綿引 琢磨**
http://www.slideshare.net/bikisuke/grails-69293672

##Data Microservices with Spring Cloud Stream, Task, and Data Flow
**槙 俊明**
http://www.slideshare.net/makingx/data-microservices-with-spring-cloud-stream-task-and-data-flow-jsug-springday

#ROOM3
##事例で知る！大規模エンタープライズ開発現場のリアル
###～NRIのアーキテクトが語る、Spring Frameworkと開発標準化～
**大知 弘典**

##Spring Security で作る Web API アクセス制御の最適解
###〜 Basic認証？ APIキー？ OAuth 2.0？ OpenID Connect？ 〜
**都元ダイスケ**
http://www.slideshare.net/daisuke_m/spring-day-2016-web-api

##Spring5に備えるリアクティブプログラミング入門
**岩塚 卓弥/堅田 淳也**
http://www.slideshare.net/TakuyaIwatsuka/spring-5

##楽天トラベルとSpring
**藤井貴浩/Thomas Ludwig**
http://www.slideshare.net/rakutentech/springspring-day-2016

##アメブロの大規模システム刷新とそれを支える Spring
**向井 政貴/服部 拓也**
http://www.slideshare.net/nin2hanzo/spring-69237035

##amazon産クラウドのAWS Springのソースを纏わせ実用的アプリケーション仕立てに
**山崎 大 / 内立 良介**

#ROOM4
##これからはじめるSpring MVC
###〜Spring MVC「基本のき」〜
**大野 渉**

##Spring Bootで学ぶ初めてのWEBアプリ開発
**てらひで**
http://www.slideshare.net/terahide/spring-bootweb-69236132

##Springの現在,過去,未来〜迷い道くねくね
**長谷川 裕一**
http://www.slideshare.net/HasegawaDanna1/spring-day-2016-spring

##Springを使ったWebアプリにリファクタリングしよう
**土岐 孝平**
https://github.com/KouheiToki/jsug-handson-20161118
[MySQL/RaspberryPi] MySQLのPasswordを忘れた時

こんにちは！ **Dreamwalker**です。
RaspberryPiを使っていると、データベース必ず使う事になります。普通にPiにはMySQLをインストールしますね。

#MySQLをはじめたら。

あれ？あれ？パスワードなんだけ？
これは私の結果です。 久しぶりに使ったら覚えなくてこまりました。

![pass.JPG](https://qiita-image-store.s3.amazonaws.com/0/137182/bb3a345a-721c-96a0-0859-7f1adae1482d.jpeg)

#MySQLパスワードリセット方法。

- **/etc/mysql/my.conf** に移動します。

1. `$ cd /etc/mysql/my.conf`

- 後はmy.conf fileの中の内容変化します。

**(Vimを使っても良いです。)**

1. `$ sudo nano my.cnf`

- my.cnfにこれを追加します。

1. `skip-grant-tables` 

これは最初にパスワード入力をPASSします。

- Overwriteした後、mysqlをスタートします。

1. `$ sudo service mysql start`

2. `$ sudo -uroot mysql`

#Password Setting 

Password Settingは下のようにやります。

`mysql > update user set password=password('設定パスワード') where user='root';`

設定が終わったら **my.conf**に追加した`skip-grant-tables`をComment outします。後はリスタートだけです。

`$ sudo service mysql restart`
`$ sudo -uroot mysql`

#終わりに

今回は自分からmysqlのパスワード忘れてPassword Settingをやってみました。RaspberryPiでmysqlを使っている皆さんに役に立ったらいいと思います。

**読みいただきありがとうございました。**
次のPostで会いましょう！

**Dreamwalker。**
HapiでLINE Botをサクッと試す


Node.jsのフレームワークであるHapi.jsでLINE Botを作ります。
**ローカル環境だけで試せる**のでSSLとかサーバー用意いらないです。

[GoとlocaltunnelでLine Messaging APIを使ってオウム返しLINE Botを試す #golangjp](http://qiita.com/n0bisuke/items/f0bfa0ead9f59ea81f37)で書いたlocaltunnelを使ってます。

## LINE Messaging APIの利用準備

ドキュメントはこちらです。

> https://devdocs.line.me/ja/

### 必要な値を取得

LINE Developersのページを開きます。

![](https://i.gyazo.com/2d5785a51fd27441448fa31afac78e9b.png)

* Channel Secret
* Channel Access Token

の二つの値を取得します。

### BotのWebhook利用を許可

LINE@ MANAGERのページを開きます。

![](https://i.gyazo.com/0f74d370052fcccdc875ff3dee365acb.png)

BotのWebhook利用を許可します。
他の自動応答メッセージなどはオフにした方が開発時のウザさはなくなります。
(スクショで)

## コード書いていきます。

* バージョン確認

```
$ node -v
v7.0.0
```

## 依存パッケージ インストール

```
$ npm i --save hapi superagent
```

## 実際のコード

```app.js

'use strict';

const Hapi = require('hapi');
const request = require('superagent');
const crypto = require('crypto');

const REPLY_URL = 'https://api.line.me/v2/bot/message/reply'; //リプライ用
const CH_SECRET = 'xxxxxxxx'; //Channel Secretを指定
const CH_ACCESS_TOKEN = 'xxxxxx'; //Channel Access Tokenを指定
const SIGNATURE = crypto.createHmac('sha256', CH_SECRET);

//
let client = (replyToken, SendMessageObject) => {
    request
        .post(REPLY_URL)
        .send({ replyToken: replyToken, messages: SendMessageObject })
        .set('X-Line-Signature', SIGNATURE)
        .set('Content-Type', 'application/json')
        .set('Authorization', `Bearer ${CH_ACCESS_TOKEN}`)
        .end(function(err, res){
            console.log(res.body);
        });
};

const server = new Hapi.Server();
server.connection({
    host: 'localhost',
    port: 3000
});

server.route({
    method: 'POST',
    path:'/callback',
    handler: (request, reply) => {
        console.log(request.payload.events);
        console.log('-------\n');

        let WebhookEventObject = request.payload.events[0];

        if(WebhookEventObject.type === 'message'){
            let SendMessageObject;
            if(WebhookEventObject.message.type === 'text'){
                SendMessageObject = [{
                    type: 'text',
                    text: WebhookEventObject.message.text
                }];
            }

            client(WebhookEventObject.replyToken, SendMessageObject);
        }
        return reply('success').code(200);
    }
});

// Start the server
server.start((err) => {
    if (err) throw err;
    console.log('Server running at:', server.info.uri);
});

```

##試す

* アプリをローカル環境で起動

```
$ node app.js
```

* localtunnelを起動させてグローバルアクセスできるようにする

```
$ lt --port 3000
your url is: https://jyyhbdxhwp.localtunnel.me
```

* 設定画面からWebhook URLにlocaltunnelが生成したURLを設定する

* 実際に`へいへい`言ってみる

![](https://i.gyazo.com/abaf8f06efea5d9b3840c4aa1c8b1932.png)

ちゃんとオウム返ししてくれますね :)


hapiもサクッとかけるし、やはりlocaltunnelが便利すぎる。
初めてLaravelを使った案件を実際にこなしてみていろんなことのメモ

# はじめに
初めてのLaravel案件をこなしてみました。
チュートリアル＋αぐらいは何度かやってたのですが、なかなか実際の案件で使う機会が無かったために定着していませんでした。
ちょうど良いサイズの案件のお話しが来たのでLaravelで実装してみました。

本格的に案件をやらないと分からない事は多いですね。

| 項目 | 値 |
|:--|:-:|
| 掛かった人日（開発）  | 4人日 |
| 掛かった人日（見積もり、相談、試験実装その他）  | 3人日 |
| 発行したartisanの数  |  131 |
| 作ったテーブルの数 | 2 |
| テーブルの行数  | テーブルA: 約50  テーブルB: 約14万  |
| gitのコミット数  | 70 |
| CIサービスでの失敗数 | 42 |
| CIサービスでの成功数  | 29  |
| DB migrationの数  | 10  |
| ローカルで実行したphpunitの数 | 38 |
| 作成したviewの数  | 2 |
| 作成したページの数 | 1 |
| 作成したcssファイルの数  | 1  |
| 作成したjsファイルの数 | 0 |
| 作成したコントローラの数 | 2 |
| 作成したアクションの数 | 6 |
| 作成したartisanコマンドの数 | 1 |
| 作成したルートの数 | 7 |
| 作成したテストファイル数 | 2 |
| 作成したテストメソッド数 | 5 |
| ソースコードの割合  |   PHP 86.4% HTML 5.9% Shell 5.6%	 Other 2.1% |
| composerのrequireの数 | 5  |
| composerのrequire-devの数 | 5 |

# スクリーンショット
## マイグレーション数
![Screen Shot 2016-11-18 at 22.27.27.png](https://qiita-image-store.s3.amazonaws.com/0/47327/6f1a662e-69b5-07b9-012e-8ff1ac63b61c.png)


## artisanコマンド
![Screen Shot 2016-11-18 at 22.28.01.png](https://qiita-image-store.s3.amazonaws.com/0/47327/4bae67dd-2d5e-a6a9-e555-cd9610d2e176.png)

## ソースコードの割合
![Screen Shot 2016-11-18 at 22.30.41.png](https://qiita-image-store.s3.amazonaws.com/0/47327/0903ac5d-c74a-8476-70ae-5a249fdacb50.png)
![Screen Shot 2016-11-18 at 22.35.25.png](https://qiita-image-store.s3.amazonaws.com/0/47327/2895f92a-7738-54d6-adb4-1633f8d7f01b.png)

## CIの失敗
![Screen Shot 2016-11-18 at 22.35.59.png](https://qiita-image-store.s3.amazonaws.com/0/47327/f7f62a0b-b682-c1b5-1268-21a7d4e248a0.png)

# 感想
Laravel楽しいですね。
新しい言語や新しいフレームワークを使ってるときの「こんなこと出来るんだ！」とか「こんな書き方あるんだ！」というのは楽しいです。

今後もDB関連の案件があれば是非使っていきたいです。

# チュートリアルなど
今回の実装ではドットインストールの「Laravel5入門 」がとても役に立ちました。
http://dotinstall.com/lessons/basic_laravel
現行バージョンだと動かない箇所はあったのですが、全体的に一貫性のある内容で参考になりました。

Laravel関連の書籍を二冊持っていますが、残念ながら僕には難しかったです。ただ読んでいて楽しいですし買って良かったと思っています。

> Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク！] 
> https://www.amazon.co.jp/dp/4774173134

> Laravel リファレンス[Ver.5.1 LTS 対応] Web職人好みの新世代PHPフレームワーク
> https://www.amazon.co.jp/dp/4844339451

本家のチュートリアルは挫折しました。マニュアルはそこそこ便利でした。
mysql/Railsでユーザーの年代ごとに集計する

Userモデルのbirthdayカラムに'2010-01-08'というふうに年代が入っている場合

```
User.select("count(user.id) as count, truncate( timestampdiff(year,birthday,curdate())/10,0) as age").group(:age)
```

とすると、10代、20代...のように年代ごとに集計できます。



timestampdiffについてはこちら
https://dev.mysql.com/doc/refman/5.6/ja/date-calculations.html
レーダーチャート


デモ：http://codepen.io/mo4_9/pen/dOXoPx

![スクリーンショット 2016-11-18 21.47.51.png](https://qiita-image-store.s3.amazonaws.com/0/136286/0018ca86-404f-64fe-3b98-bfedad7bdbc1.png "スクリーンショット 2016-11-18 21.47.51.png")

```javascript
const canvas = document.getElementById("radarChart");
const ctx = canvas.getContext("2d");

const SIZE = 320;
const MAX_LEVEL = 3;
const CENTER = SIZE / 2;
const STRIDE = CENTER / MAX_LEVEL;

const LEVELS = [3, 2, 1, 3];

const LINE_COLOR = "rgba(0,255,0,.8)";
const CHART_COLOR = "rgba(0,255,0,.6)";

canvas.width = canvas.height = SIZE;

// base
ctx.strokeStyle = LINE_COLOR;

for(let i = 1; i < MAX_LEVEL + 1; i++) {
  ctx.beginPath();
  ctx.moveTo(CENTER, (MAX_LEVEL-i) * STRIDE);
  ctx.lineTo(CENTER + STRIDE * i, CENTER);
  ctx.lineTo(CENTER, CENTER + STRIDE * i);
  ctx.lineTo((MAX_LEVEL-i) * STRIDE, CENTER);
  ctx.closePath();
  ctx.stroke();
}

ctx.beginPath();
ctx.moveTo(CENTER, 0);
ctx.lineTo(CENTER, SIZE);
ctx.closePath();
ctx.stroke();

ctx.beginPath();
ctx.moveTo(0, CENTER);
ctx.lineTo(SIZE, CENTER);
ctx.closePath();
ctx.stroke();

// chart
ctx.fillStyle = CHART_COLOR;
ctx.beginPath();
ctx.moveTo(CENTER, (MAX_LEVEL-LEVELS[0]) * STRIDE);
ctx.lineTo(CENTER + STRIDE * LEVELS[1], CENTER);
ctx.lineTo(CENTER, CENTER + STRIDE * LEVELS[2]);
ctx.lineTo((MAX_LEVEL-LEVELS[3]) * STRIDE, CENTER);
ctx.closePath();
ctx.fill();
```

細かいデザインの指定がない場合は[Chart.js](http://www.chartjs.org/)を使う

> 参考
[チャート、グラフを書くのに良さそうなJavascriptライブラリ6選](http://qiita.com/awakia/items/d064c772b759333c209a)
↓円周上頂点の取得の勉強になりそう
http://codepen.io/thebabydino/pen/MbjZjw
色コードの明暗を判定する

##課題

例えば、「#4631b9」のような色のコード。
この色は、比較的「暗い色」なのか？「明るい色」なのか？

##使う場面

背景色を「#4631b9」にした場合、文字は「白」が良いか？「黒」が良いか？

背景色を動的に変える場合、自動で判定したい。

##公式

```math
( $r*0.299 + $g*0.587 + $b*0.114 ) / 2.55
```

明るい場合には100に近い値、暗い場合には0に近い値となる。

## PHPコード

```php:getLuminance.php
<?php

function getLuminance( $rgb ) {

	$r = hexdec( mb_substr( $rgb, 0, 2 ) );	
	$g = hexdec( mb_substr( $rgb, 2, 2 ) );		
	$b = hexdec( mb_substr( $rgb, 4, 2 ) );	
	
	return ( $r*299 + $g*587 + $b*114 ) / 2550;
	
}

echo getLuminance( "4631b9" );


```

真っ白<code>#ffffff</code>なら100、真っ黒<code>#000000</code>なら0が返る。

入力値が「4631b9」場合、約28の値が返る。つまり、#4631b9は比較的暗い色だから「文字には明るい白」が良い。

##参考URL

https://fromkato.com/color/4631b9 ← #4631b9 は、この色
vimで長い行を持つファイルを開いた時にもっさりする現象を解消する

## :map: 背景
AWSのkinesisから受け取るイベントをファイルに保存し、lambdaをローカルでテストする際の入力値として使おうとしました。

このファイルは1行で構成されるJSONファイルでサイズは約3.5Mあります。中身はほぼBufferをJSON.stringifyしたものです。

このファイルをvimで開こうとした時に、ものすごく重くなる現象になりました。

```vim
"fixture/event.json" [noeol] 1L, 3697817C
```

環境は以下になります。

```
$ vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Sep 13 2016 12:01:08)
MacOS X (unix) version
```

## :round_pushpin: 対応
参考になったのは、以下の記事です。
> 巨大なファイルを開いてGすると重い
https://teratail.com/questions/24046

この例では、ファイルの行数が多いケースですがきっと原理は一緒のはず。
syntaxの評価が重いと予想。

なので一旦こんな感じで設定しました。

```vim
augroup vimrc-highlight
  au!
  au Syntax json if 1000 < col('$') | syntax off | endif
augroup END
```

随分良くなりましたが、それでもまだまだ遅いままでした。

これは、`synmaxcol`（構文アイテムを検索する桁数の最大値）を設定していなかった為、デフォルト値の3000まで評価しつづけるからだと判断。

よくよく考えると、"1行に1000文字も入っているような構文解析の必要性があるファイル" を読むことは稀なので、Syntaxに関係なく`synmaxcol`でまるっと設定することにしました。

`synmaxcol`のヘルプには以下のように記述があります。

>        これは長い行を持つXMLファイルの描画が非常に遅くなるのを避けるために役
>        に立つ。

で、最終的に以下を設定することで解消しました。

```
set synmaxcol=320
```

設定値を３２０にしたのは、colorcolumnを80に設定しているので、大体4倍くらい横に長いと萎えるいうフィーリングで決めました。

もろもろ反省(※)はありますが、一旦これで良しとしました。
もっと良いやり方や設定がありましたら教えてください。

誰かのトラブルシューティングになれば幸いです。

---

※ 反省

* ファイル出力の際にprettyしておけばよかった →prettyしたらしたでファイルサイズが肥大化
* ファイルの中身を確認したかっただけなのでvimで開く必要すら無かった
PerlでAkamai Traffic Management APIを使用してAkamai GTMから値を取得してみた

# 概要
AkamaiのGlobal Traffic Management（以下、GTM）からAkamaiのTraffic Management APIを使用して、設定値などを取得できるようにしてみました。PerlのCPANに"[Akamai::Edgegrid](http://search.cpan.org/dist/edgegrid-perl/lib/Akamai/Edgegrid.pm)"という便利なモジュールがあったので、そのモジュールを使用して、Akamai GTMにエントリーされているドメイン名に紐づく全てのIPアドレスを取得・表示させてみることにしました。

以下、実際にAkamai Traffic Management APIでIPアドレスを表示させるために作成したサンプルコード（Perl）です。

# サンプルコード

## atm_api.pl

```perl:atm_api.pl
#!/usr/bin/perl
# ------------------------------------------------------------------------------
# Script Name  : atm_api.pl
# Tool Version : 1.0.0
# Argument     : -
# Options      : -
# Usage        : $0
# Return       : -
# -------------+-------------------------------------------+--------------------
# Date         | Changes                                   | Author
# -------------+-------------------------------------------+--------------------
# 2017/09/07   | New Creation                              | @bloodia
# ------------------------------------------------------------------------------
# --+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8

use strict;
use warnings;
use Akamai::Edgegrid;
use JSON;

my $client_token  = 'クライアントトークン';
my $client_secret = '秘密鍵';
my $access_token  = 'アクセストークン';
my $baseuri       = 'ベースURI';
my $config_file   = "$ENV{HOME}/.edgerc"; # 変更不要
my $section       = 'default';            # 変更不要
my $domain        = 'ドメイン名';
my $property      = 'プロパティ名';

my $ua = new Akamai::Edgegrid(
  'client_token'  => $client_token,
  'client_secret' => $client_secret,
  'access_token'  => $access_token,
  'config_file'   => $config_file,
  'section'       => $section
);

my $response = $ua->get("${baseuri}/config-gtm/v1/domains/${domain}.akadns.net/properties/${property}");

my $data = decode_json($response->content);

foreach (@{$data->{'trafficTargets'}}) {
   my $i = 1;
   foreach (@{$_->{'servers'}}) {
     print "${i}つ目にエントリーされているIPアドレスは、${_}";
     print "\n";
     $i++;
   }
}
```

HTTPヘッダを自動生成してくれるのでとても便利です。
CygwinにRubyのpryをインストールする。

irbよりも強力だとされるpryだがインストールが面倒くさかったので、備忘録としてここに記述します。

# 前準備

setup-x86_64.exe
 にて libreadline-devel: GNU readline and history libraries(development)
をインストールしておく。
pryの実行にはReadlineが必須であるため。

# Ruby 2.3.3 のコンパイルとインストール
Cygwinには元から
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-cygwin]
がインストールされているが、
https://www.ruby-lang.org/ja/
から最新(2016-12-18時点)のソースコードruby-2.3.3.tar.gz
を持ってきてインストールする。

```
./configure --with-readline
make
make install
```
# pryのインストール

```
$ gem install pry pry-doc
ERROR:  Loading command: install (Fiddle::DLError)
       can't load kernel32
ERROR:  While executing gem ... (NoMethodError)
   undefined method `invoke_with_build_args' for nil:NilClass
```
エラーが出るので以下のファイル
/usr/local/lib/ruby/2.3.0/win32/resolv.rb
の
dlload "kernel32"
の部分をを以下のように書き換える**(ここが一番のはまりポイント)**
dlload "kernel32.dll"
もう一度 (Ruby 2.4.0ではこの部分が修正されているので必要なし)
```
$ gem install pry pry-doc
```

# gemの実行でopensslのエラーが発生する場合

```
ERROR:  While executing gem ... (Gem::Exception)
    Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources
```
httpsからhttpに変更してしまうのが楽:sweat_smile:

```
$ gem source -r https://rubygems.org/
$ gem source -a http://rubygems.org/
https://rubygems.org is recommended for security over http://rubygems.org/

Do you want to add this insecure source? [yn]  yと入力
http://rubygems.org/ added to sources
```

以上
KituraをDockerで動かしてみた。

## Dockerコンテナ上でkituraのサーバーを動かす
今回はこちらのIBMさん謹製のDockerfileを使用します。
https://github.com/IBM-Swift/kitura-ubuntu-docker
このレポジトリをクローン。
(実際に必要なのはDockerfileと.shファイル)

```
git clone https://github.com/IBM-Swift/kitura-ubuntu-docker.git
```

レポジトリに移動し、Dockerイメージを作成します。

```
docker build .
```

次にDockerを起動。/bin/bashでコンテナ上のbashを開きます。
ついでにホストとコンテナの8090ポートを繋いでおきます。

```
docker run -p 8090:8090 -it ibmcom/kitura-ubuntu /bin/bash
```

あとは次のエントリに従いコンテナ上でファイルを作成。
[KituraでHello Worldを表示させる](http://qiita.com/nnsnodnb/items/3b028a7e72b155fe1b56)

起動(コンテナ上)。

```
.build/debug/myFirstProject
```

これでDockerコンテナのサーバーにlocalhost:8090でアクセスできます。

## ファイルの共有
作成するアプリケーションのファイルはgit等で管理したいので、
次にファイルをホストマシンと共有してみます。
先ほど使用したコンテナを一度破棄し、

```
docker rm コンテナのID
```

ホストにディレクトリを作成しておきます。

```
mkdir myFirstProject
```

そして次は以下のコマンドでコンテナを作成&起動。

```
docker run -p 8090:8090 -v $(pwd)/myFirstProject:/myFirstProject -it ibmcom/swift-ubuntu /bin/bash
```

-vオプションによりホストのmyFirstProjectディレクトリとコンテナ上のmyFirstProjectディレクトリを共有します。

コンテナ上でmyFirstProjectディレクトリに移動し、あとは先ほどと同様、

```
swift package init --executable
```

とすると、ホストマシンのmyFirstProjectディレクトリが以下のようになっていると思います。

```
myFirstProject
├── Package.swift
├── Sources
│ └── main.swift
└── Tests
```

あとは好きなエディタ(Xcode)でコードを書いて...
コンテナ上でビルド&Run

```
swift build
```

```
.build/debug/myFirstProject
```

![スクリーンショット 2016-11-18 11.19.14.png](https://qiita-image-store.s3.amazonaws.com/0/84014/636f2a4f-5137-3983-d226-cc88c23bb13a.png)

めでたしめでたし。

## おわりに
macでも快適にDockerが使えるようになり、またKituraも1.0を迎えたことで、
いよいよもってサーバーサイドSwiftへの期待が高まりますね。

## 参考
[IBM-Swift/kitura-ubuntu-docker](https://github.com/IBM-Swift/kitura-ubuntu-docker)
[KituraでHello Worldを表示させる](http://qiita.com/nnsnodnb/items/3b028a7e72b155fe1b56)
[Getting Started](http://www.kitura.io/en/starter/gettingstarted.html)
GCE startup/shutdown script 手順	

2016/11/18 現在
`GCE` はすぐ変わるので注意
# ざっくりとした手順
## 1. instance に、script を仕込む。
### 実行中の instance の場合
対象の instance をぽちー

`編集` ぽちー

`カスタムメタデータ`　の `キー`　と `値` を入力
`キー`　startup-script-url or shutdown-script-url
`値` gcs のスクリプトのパスを記入 (下記URL)
[例]
公開リンク ✓
右クリック　→　リンクのアドレスをコピー
<img width="1280" alt="スクリーンショット_2016-11-18_20_14_27.png" src="https://qiita-image-store.s3.amazonaws.com/0/131489/4124ba3b-5f49-1c46-a811-fa7a96e2cbcc.png">


一番下の `保存` クリック

### これから作成する instance の場合

一番下の `管理` クリック

先ほどと同じように、 `キー` と `値` を記入する。
<img width="450" alt="スクリーンショット_2016-11-18_20_20_30.png" src="https://qiita-image-store.s3.amazonaws.com/0/131489/c250218a-3851-1821-88ae-ba834eb339da.png">


以上

## 2. script の動作確認
下記コマンドにて script の動作確認ができる。

`sudo google_metadata_script_runner --script-type <startup/shutdown>`


## まとめ
### startup-script の場合
`起動条件`
- instance が起動した際に、起動します。
下記に、ログが吐かれる。
`/var/log/startscript.log`

### shutdown-script の場合
`起動条件`
- stop/start した場合
- terminate した場合
下記にログが吐かれる。
`/var/log/shutdownscript.log`

# 忘れないようにmemo