OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi2でEddystoneを使う

#概要
Googleのビーコン規格EddystoneをRaspberry Pi2で使えるようにする方法

#環境
Raspberry Pi2 Raspbian
LBT-UAN04C1(Bluetooth4.0 USB アダプタ)
Android Nexus9

#bluezをインストール
必要なライブラリをインストール

```
$sudo aptitude install libglib2.0-dev libdbus-1-dev libudev-dev libicaldev libreadline6-dev
$sudo apt-get install libreadline-dev
$sudo apt-get install libical-dev
```

bluezをインストール

```
$wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.15.tar.gz
$tar xvf bluez-5.11.tar.gz`
$cd bluez-5.15
$./configure --disable-systemd --enable-library
$make
$sudo make install
$sudo reboot
```


#Bluetoothドングル

```
$hciconfig
```
で認識されているBluetoothアダプタを確認

<img width="495" alt="Screenshot 2016-07-29 23.37.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/42913/5214b11d-e7eb-681b-dde1-281983198577.png">

UP RUNNINGと書かれていればok。
DOWNと成っている場合は

```
$sudo hciconfig hci0 up
```

とすることでUP RUNNINGの状態にすることができる。

#node.jsをインストール
http://qiita.com/shishamo_dev/items/04d425e5d4e6accb63b8 にまとめてあるのでこちらを参考に。


#必要なnodeのライブラリをnpmでインストール

```
$npm install bleacon
$npm install eddystone-beacon
$npm install bleno
```

#「Running without root/sudo」で実行するためのコマンドを実行
これ実行しとかないとエラーが出るっぽいので実行

```
$sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)
```

#Eddystoneのサンプルプログラムを実行
githubでnodejsで実行できるeddystoneのコードが公開されているので

````
$git clone https://github.com/don/node-eddystone-beacon
```

でダウンロードする。

今回urlフレームを載せたビーコンを配信するとする。
以下のコマンドを実行

```
$cd node-eddystone-beacon/examples
$node simple.js
```

コード内の
```
eddystoneBeacon.advertiseUrl('http://www.google.com');
```
のURLを変えれば好きなURLを送信できる

#Eddystoneの受信確認
Androidアプリの「iBeacon & Eddystone Scanner」で受信してみた
https://play.google.com/store/apps/details?id=de.flurp.beaconscanner.app&hl=ja
<img width="768" alt="Screenshot_20160730-000318.png" src="https://qiita-image-store.s3.amazonaws.com/0/42913/679188a5-104c-8de1-da49-e12faaf148ff.png">
joinRight・joinLeftを入れ子ifの替わりに使う

`Either#joinRight`を使う。

入れ子になったEitherをフラットにするために使う。joinRightは`Either[A,Either[A,C]]`を`Either[A,C]`にする。
joinLeftは逆に`Either[Either[A,C],C]`を`Either[A,C]`にする。ifを使った複数条件のエラーチェックをするときに使える。

```scala
package example

object EitherDemo {
  def main(args: Array[String]) {
    println(oddAndPositive(-1))
    println(oddAndPositive(0))
    println(oddAndPositive(1))
    println(oddAndPositive2(-1))
    println(oddAndPositive2(0))
    println(oddAndPositive2(1))

    println(oddOrPositive(-2))
    println(oddOrPositive(-1))
    println(oddOrPositive(0))
    println(oddOrPositive2(-2))
    println(oddOrPositive2(-1))
    println(oddOrPositive2(0))

  }

  def mod(i: Int, j: Int) = (i % j + j) % j

  def oddOrPositive(i: Int): Either[String, Int] = {
    Either.cond(i >= 0, i, Either.cond(mod(i, 2) == 1, i, "even and negative number")).joinLeft
  }

  def oddOrPositive2(i: Int): Either[String, Int] = {
    if (i >= 0) {
      Right(i)
    } else if (mod(i, 2) == 1) {
      Right(i)a
    } else {
      Left("even and negative number")
    }
  }

  def oddAndPositive(i: Int): Either[String, Int] = {
    Either.cond(i >= 0, Either.cond(mod(i, 2) == 1, i, "even number"), "negative number").joinRight
  }

  def oddAndPositive2(i: Int): Either[String, Int] = {
    if (i >= 0) {
      if (mod(i, 2) == 1) {
        Right(i)
      } else {
        Left("even number")
      }
    } else {
      Left("negative number")
    }
  }
}
```
このようにifをネストさせるのではなくてEither.condをネストさせてからjoinRigth・joinLeftでネストを潰す。joinLeftがor条件・joinRightがand条件で正常系を出すと思えばよい。
electronでリファラコントロール

リファラとは、リンクをクリックして別ページに移動した際のリンク元のページのことです。

例えば、pixivのイラストはリファラ制御されていて、直接見ようとすると403が表示されます。
しかし、リファラは偽装可能です。
例えば、chromeでは、Referer Controlなどの拡張機能を使うことでリファラ偽装ができます。

chromeでできることはelectronでもほぼ可能なので、以下のコードを挟めば対処できます。

```js
	win.webContents.session.webRequest.onBeforeSendHeaders((detail, cb) => {
		let {requestHeaders} = detail;
		requestHeaders = Object.assign(requestHeaders, {Referer: 'http://www.pixiv.net'});
		cb({requestHeaders});
	}, {
		urls: ['<all_urls>'],
		types: ['xmlhttprequest']
	});
```

が、いささかボイラーテンプレートなコードなので、ライブラリを使うことをオススメします。

[akameco/electron-referer: Referer control for Electron app.](https://github.com/akameco/electron-referer)

### インストール

```
$ npm install --save electron-referer
```

### 使い方

```js
const {app, BrowserWindow} = require('electron');

require('electron-referer')('http://www.pixiv.net/');

let win;

app.on('ready', () => {
  win = new BrowserWindow();
});
```

制御したいurlを引数に入れればリファラの偽装は完了です。

[akameco/electron-referer: Referer control for Electron app.](https://github.com/akameco/electron-referer)
VCCWとWP-CLIをもっと仲良しにする設定


WP-CLIの0.24からリモートサーバー上でコマンドを実行できるようになりました。

詳しくはこちらのブログを見てね。

https://firegoby.jp/archives/6689

で、ブログの方に書き忘れたのでこっちに書きますが、VCCWとこの機能は結構仲良しで、あらかじめ設定しておくとホストマシンからWP-CLIコマンドを実行するだけで、VCCW上のWordPressを好き放題にすることができます。

```
$ wp @vccw core update
```

上の例では、VCCW上のWordPress本体をアップデートしてます。

## 設定方法

まず、VCCWのディレクトリに移動して、以下のコマンドを実行してください。

```
$ vagrant ssh-config
```

すると、SSH用の設定情報が出力されるので、それを`~/.ssh/config`にコピペしてください。

めんどくさい人は以下のコマンドで一発ですが、意味がわかってない人はやめましょう。

```
$ vagrant ssh-config >> ~/.ssh/config
```

次に `~/.wp-cli/config.yml` に以下のように記述してください。

```
@vccw:
  ssh: vccw.dev/var/www/wordpress
```

設定は以上です。

では、いろいろ試してみましょう。

プラグインを新規に作りたいときは。。。

```
$ wp @vccw scaffold plugin oreore
```

あら不思議、`www/wordpress/wp-content/plugins` 以下にプラグインができてますね。

```
$ wp @vccw db export /vagrant/oreore.sql
```

ってすると、`Vagrantfile` があるディレクトリに `wordpress.sql` っていうファイルがあるはず。

VCCW のゲストマシン上の `/vagrant` はローカルと共有されてますので、ここにエクスポートすればすぐにホストマシンのエディター等で編集することができます。

便利でしょ。
Mac に numba をインストール

# 概要
[![English](https://img.shields.io/badge/English-here-lightgrey.svg?style=flat)](https://www.jkawamoto.info/blogs/install-numba-to-mac/)
お手軽に python コードを高速化するために，[numba](http://numba.pydata.org/) を導入してみた．
しかし，pip だけではインストールできなかったので，備忘録としてインストール手順を記録しておく．

# インストール
[`llvm`](http://llvm.org/) と `enum34` が別途必要らしい．
特に，llvm は最新の 3.8.x ではなく 3.7.x が要るようなので，
`homebrew/versions` を tap してインストールする．
また，環境変数 `LLVM_CONFIG` の設定を忘れないようにする．

```sh
brew tap homebrew/versions
brew install homebrew/versions/llvm37
export LLVM_CONFIG=/usr/local/Cellar/llvm37/3.7.1/bin/llvm-config-3.7

pip install enum34
pip install numba
```

# インポート
numba がインストールされていない環境でも動くように，
インポートできなかった場合は何もしないデコレータに差し替えておく．

```py
try:
    from numba import jit
except ImportError:
    def jit(*args, **_kwargs):
        if len(args) > 0 and hasattr(args[0], "__call__"):
            return args[0]
        else:
            def _(func):
                return func
            return _
```

`@jit` 以外も使う場合は同様のものをそれぞれ定義する．
また，この場合型指定はオブジェクトではなく文字列で渡す必要がある．

# その他
文献はこの辺り？

* http://www.slideshare.net/teoliphant/numba-siam-2013
* http://dl.acm.org/citation.cfm?id=2833162
Subversion管理のソースもbugspotsで分析したい

## 概要

Google謹製のバグ予測アルゴリズムを実装したツールに「[bugspots](https://github.com/igrigorik/bugspots)」というものがありますが、
分析対象はGitリポジトリで管理されているソースのみとなっています。

一方でGitを使用したいけど技術的・政治的な理由でSubversionを利用せざるを得ないというケースも多いのではないのでしょうか。
本記事では、ソースコードはSubversion管理だけどbugspotsを利用して分析したい！という方向けに、
そのやり方を紹介する記事となります。

## どうやるか？

簡単に調べた感じ、3つの実現方法がありそうです。

1. [bugspots-svn](https://github.com/takanorig/bugspots-svn)を利用する
2. [bugspots-net](https://osdn.jp/projects/bugspots-net/)を利用する
3. git-svnを利用し、SVN上のソースをGitリポジトリに移管した上で本家のbugspotsを利用する

### bugspots-svn利用（パターン1）

個人が開発したbugspotsのSVN対応版となります。
http://szk-takanori.hatenablog.com/entry/20120109/p1

#### 所感

 * 完全に開発止まってる（最終コミット：Jan 18, 2012）  
 解析ロジック自体は本家のものを流用新規で利用しているため、本家に置いてかれている可能性あり
 * Ubuntu以外のOSでの動作が怪しい（というかsubversionのrubyバインディングのインストールで躓く）

### bugspots-net利用（パターン2）

個人が開発したbugspotsのWindows版となりますが、こちらもリポジトリはSVNを想定したものとなっています。
http://mantarou.hatenablog.com/entry/2014/01/15/004904

#### 所感

* こちらも開発止まってる（最新リリース：Jan 15, 2014）
* GUIで見やすくなっているが、CUIが欲しい（Jenkinsとかで定期実行してレポーティングとかしたい。）

### git-svn + bugspots（本家）利用（パターン3）

SVN管理のソースをgit-svnを利用してgitリポジトリに移管した上で本家のbugspotsを利用するパターンです。

#### 所感

* bugspots用とはいえ、gitリポジトリの利用ができることが前提
* 本家のbugspotsが利用できるのが安心

## 今回紹介する方法

やはり本家のものを利用するのが分析結果の信頼性もあるということで、
git-svn + bugspots利用（パターン3）のやり方を紹介したいと思います。
（そもそもGitリポジトリの利用ができないという方はごめんなさい。）

### 環境情報

* OS: Amazon Linux
* Ruby: 2.0.0

### 1. bugspotsインストール

gemで簡単にインストールできます。（rubyがインストールされている前提とします。）

```
gem install bugspots
```

### 2. git-svnインストール

SVN管理のソースをGit移管するためにgit-svnをインストールします。

```
sudo yum install git-svn
```

### 3. SVNリポジトリからGitリポジトリ作成

```
git svn init -s --prefix=svn/ https://your.svn/repos/project
git svn fetch
```

`git svn clone` コマンドで `init` と `fetch` をまとめて実行してもOKですが、
エラー時に途中から再開できるよう `init` と `fetch` を別々に実行するやり方をお勧めします。

※はじめはWindows上で試したのですがRuby製ということもあり `git svn clone` が「ハンパなく」遅いです。
（リビジョンの大きさ次第ですが、私が試したのはリビジョン40000ぐらいで丸一日かけても終わらないレベル）
Linux上での実行を推奨します。

### 4. bugsopts実行

```bash
bugspots -r "/^*bug/" .
```

bugspotsは解析ロジックの中で「バグフィックスのコミット回数」を使用しており、
`-r` オプションで「バグフィックスのコミット」を特定するコミットログメッセージのパターンを指定します。
日本語のコミットメッセージが許容されている場合は「修正」等、適宜利用環境に応じて指定してください。

### 5. 結果確認

```
Scanning . repo
        Found 1234 bugfix commits, with 1234 hotspots:

        Fixes:
                - fix a comment
                - Fixed index hogehoge
        Hotspots:
                0.8875 - Gemfile.lock
                0.8478 - Gemfile
                0.7712 - app/controllers/hoges_controller.rb
                0.3702 - app/views/hoges/index.text.slim
```

Hotspotsのスコアが高ければ高いほど、バグが潜んでいる可能性が高いコードという見方になります。

### 6. 定期的に実行する場合は

定期的に実行する場合は `git svn fetch` でSVNの更新分を取得し、 `bugspots` コマンドを実行します。

```bash
git svn fetch
bugspots -r "/^*bug/" .
```

実行結果をテキストにしてレポーティングするなど良しなにやってみてください。

## 参考

* http://shanon-tech.blogspot.jp/2015/02/google-bugspots.html
* https://gist.github.com/uasi/2468927
* http://qiita.com/hidekuro/items/4727715fbda8f10b6b11
xcode5, WEBページの表示

~~~~

#import "CmViewController.h"
#import <Foundation/Foundation.h>


@interface CmViewController ()

@end

@implementation CmViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.onlyonehappy.com/Mickey_move.htm"]];
    [webView loadRequest:req];
    
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (void)viewDidUnload
{

        webView.delegate=nil;
}


@end

~~~~

参考リンク
http://webmage.pro/blog_img/webview.pdf
コーネルボックスを作るUnityEditor拡張

毎回コーネルボックスを作るのが面倒だったので
コーネルボックスを作成してくれるEditor拡張をつくってみました :)

```
using UnityEngine;
using UnityEditor;

public class ConelBoxGenerator
{
	[MenuItem ("Tools/Else/ConelboxGenerate")]
	static void Ceate ()
	{
		var conelbox = new GameObject ().transform;
		conelbox.name = "conelbox";
		SetPosition (conelbox, 0, 0, 0);
		//Left
		var plane0 = GameObject.CreatePrimitive (PrimitiveType.Plane).transform;
		SetPosition (plane0, -5, 0, 0);
		SetRotation (plane0, 0, 0, -90);
		//right
		var plane1 = GameObject.CreatePrimitive (PrimitiveType.Plane).transform;
		SetPosition (plane1, 5, 0, 0);
		SetRotation (plane1, 0, 0, 90);
		//up
		var plane2 = GameObject.CreatePrimitive (PrimitiveType.Plane).transform;
		SetPosition (plane2, 0, 5, 0);
		SetRotation (plane2, 0, 0, 180);
		//down
		var plane3 = GameObject.CreatePrimitive (PrimitiveType.Plane).transform;
		SetPosition (plane3, 0, -5, 0);
		SetRotation (plane3, 0, 0, 0);
		//back
		var plane4 = GameObject.CreatePrimitive (PrimitiveType.Plane).transform;
		SetPosition (plane4, 0, 0, -5);
		SetRotation (plane4, 90, 0, 0);
		//front
		var plane5 = GameObject.CreatePrimitive (PrimitiveType.Plane).transform;
		SetPosition (plane5, 0, 0, 5);
		SetRotation (plane5, -90, 0, 0);

		plane0.SetParent (conelbox, false);
		plane1.SetParent (conelbox, false);
		plane2.SetParent (conelbox, false);
		plane3.SetParent (conelbox, false);
		plane4.SetParent (conelbox, false);
		plane5.SetParent (conelbox, false);
		plane0.gameObject.isStatic = true;
		plane1.gameObject.isStatic = true;
		plane2.gameObject.isStatic = true;
		plane3.gameObject.isStatic = true;
		plane4.gameObject.isStatic = true;
		plane5.gameObject.isStatic = true;
		conelbox.gameObject.isStatic = true;

	}

	static void SetRotation (Transform transform, int x, int y, int z)
	{
		transform.rotation = Quaternion.Euler (x, y, z);
	}

	static void SetPosition (Transform transform, int x, int y, int z)
	{
		transform.position = new Vector3 (x, y, z);
	}
}
```
計算問題の分類(計算の理論)

# 問題の分類
院試対策として情報学の勉強をしていて体系的なまとめが欲しかったので自作しました。

## 解決可能か、解決不能か
計算機にとって解決可能な問題とは、アルゴリズム的な解法が与えられるかどうかによります。アルゴリズム的な解法があるとは、*停止するプロセスが明確である、つまり決定性を有する実行可能なステップの順序集合*により、その問題の解法が与えられることを言います。そのようなアルゴリズムによる解法が存在するような問題のことを「解決可能問題」といい、そうでないものを「解決不能問題」といいます。

## 計算量が多項式により有界か？
解決可能問題をさらに分類します。
f(n)が多項式である、または多項式により有界であり、ある問題の解法を与えるアルゴリズムの計算量がO(f(n))であるような問題のことを、「多項式問題」といいます。そうでない問題(例えば計算量が冪乗式)のことを「非多項式問題」といいます。
ある問題が多項式問題の集合Pに属するか否かは、大変大きな関心ごとです。なぜなら、もしPに属さない問題をアルゴリズムにより解こうと思ったら、現実的ではない計算量の時間を必要とすることになり、実際的ではないからです。

## 非決定性をゆるすかどうか...
意思決定をプログラムを実行する主体に委ねているような命令を含むアルゴリズムは、「非決定的である」といいます。現実の問題の中では、決定的なアルゴリズムでは非多項式問題に分類されるのに、非決定性アルゴリズムを用いれば多項式問題に分類されるような問題があります。そのような問題を「非決定的な
多項式問題(NP問題)」といいます。このような問題の集合をNPと呼ぶことにすると、すべてのPはNPであることが言えます。なぜならば決定的アルゴリズムを非決定的なアルゴリズムにすることは本質的に容易だからです。一方で、すべてのNPがPであるかどうかは未だわかっていないようですが、おそらく異なるクラスに分類されると言われているようです(P≠NP予想)。

## 感想
文字ばかりだし、内容が高度だし、筆者は正式な情報学の講義を受けている人間じゃないしでもはや誰が参考にするのかという問題。おそらくこの問題自体はNP問題だとぼくは予想しています。
has_many関係にあるcheckbox実装のメモ書き


```discount_coupon.rb
class DiscountCoupon < Coupon


  has_many :restrict_lesson_plans, foreign_key: :coupon_id
  has_many :lesson_plans, through: :restrict_lesson_plans, foreign_key: :coupon_id
```

```coupon_controller.rb
def new
  @coupon = DiscountCoupon.new
  @coupon.lesson_plans.build
  @checked_lesson_plans = []
  @lesson_plans = LessonPlan.unlimited.all
end
```

```
def edit
  @coupon = Coupon.find params[:id]
  @checked_lesson_plans = @coupon.lesson_plans.map(&:id)
end
```

```_form.rb
<%= simple_form_for(@coupon) do |f| %>
<% @lesson_plans.each_with_index do |lesson_plan, i| %>
  <%= label_tag("discount_coupon_lesson_plan_#{lesson_plan.id}", lesson_plan.title) %>
  <%= f.check_box :lesson_plans, { :checked => @checked_lesson_plans.include?(lesson_plan.id), id: "discount_coupon_lesson_plan_#{lesson_plan.id}", name: 'discount_coupon[lesson_plan_ids][]', class: 'discount_coupon_lesson_plan' }, lesson_plan.id %>
  <% end %>
```
Electron で sqlite を使う（Node.js の ABI バージョン確認）

（１） Electron の ABI バージョンの取得方法：

Electron を `ELECTRON_RUN_AS_NODE=1` で Node.js モードで起動したとき、
最新の Node.js と [ABI (application binary interface)](https://nodejs.org/en/download/releases/) バージョン番号が違うことがある。
以下のコマンドで、`49` とかの番号を確認できる。

```sh
ELECTRON_RUN_AS_NODE=1 electron -e 'process.stdout.write(process.versions.modules)'
```

-----

（２） Electron から sqlite3 を使う準備：

[electron-rebuild](https://www.npmjs.com/package/electron-rebuild) でモジュールをリビルドする必要がある。

```sh
npm install --save sqlite3
electron-rebuild -w sqlite3
```

-----

（３） Electron から他の JS ファイルを実行する手順：

```js
var child_process = require("child_process");
var cmd = process.argv[0];
var args = ["app.js"];
var env = {ELECTRON_RUN_AS_NODE: "1"};
var options = {env: env}
child_process.execFile(process.execPath, args, options);
```

-----

（４） Electron から起動した他の JS ファイルで、sqlite3 を使うとき：

Electron を `ELECTRON_RUN_AS_NODE=1` で Node.js モードで起動したとき、
`require("sqlite3")` すると ABI の違いでエラーになり、SQLite を使えない。

```sh
Error: Cannot find module './node_modules/sqlite3/lib/binding/node-v49-darwin-x64/node_sqlite3.node'
```

`node-v49-darwin-x64` の `49` の部分が、Electron の Node.js の ABI バージョン。
Electron では `electron-v1.3-darwin-x64` が使えるので、リンクすると使えるようになる。

```sh
cd node_modules/sqlite3/lib/binding
ln -s electron-v1.3-darwin-x64 node-v49-darwin-x64
ELECTRON_RUN_AS_NODE=1 electron node_modules/sqlite3
```
systemd 経由で puma(Rails) 起動時に execjs が見つからないと言われた場合の対処法


systemd でコマンド実行時にはユーザの .bashrc 等で設定される PAHT は読み込まれないため、明示的に設定してあげる必要あり。

たとえば、puma起動用の設定ファイルが`/etc/systemd/system/puma.service`とした場合以下のようにフォルダを作成。

```
$ mkdir /etc/systemd/system/puma.service.d
```

そのフォルダに xxx.conf を作成。

```
$ vi /etc/systemd/system/puma.service.d/env.conf
```

その中で環境変数を設定
以下のように`node`コマンドが格納されているディレクトリに対して PATH が通るように設定する。（環境に応じて適宜設定すること）

```
[Service]
Environment="PATH=/home/ec2-user/.nvm/versions/node/v4.4.7/bin:/usr/bin"
```


上記の変更の後

```
$ sudo systemctl daemon-reload
$ sudo systemctl start puma
```

で puma を起動する

以上
VagrantのboxをUbuntu16.04に上げた時にIPを固定出来なかったのを無理やりなんとかした話

### 内容

[VagrantでUbuntu16.04を上げようとしたらipアドレスを固定できなかった](http://qiita.com/kaz29@github/items/f16c61d615080132c8c3)

この方と同様の例に悩まされた+αを回避した時の記録です

### 処置

+ IPを固定する

上記の方はifconfigで当ててますが、これはvagrantを再起動すると消えます。
なので、実際のvagrantboxの中の`/etc/rc.local`にこの`ifconfig`を書き込みます。
こうすれば立ち上がる毎に当てられるようになり、心置きなく`vagrant halt` を使えます。

```text:cmd
sed -i 's/exit\ 0/ifconfig\ enp0s8\ 192\.168\.33\.11\ \&\&\ exit\ 0/g' /etc/rc.local
```

+ authorized_keysのパーミッション変更

これもboxの不具合系の様です。
クライアントPC(例えばMac)から、vagrant sshする時には裏で鍵で入っていると思いますが、
vagrant側の`/home/vagrant/.ssh/authorized_keys` のパーミションがvagrantを再起動すると、何故か0600になっていて`vagrant ssh`が出来なくなります。
なので、これも一行でやっつけます。

```text:cmd
chmod 644 /home/vagrant/.ssh/authorized_keys
```

### Vagrantfileを晒す

以上の処理をかましたVagrantfileを上げておきます。
何かしらの参考になれば幸いです

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  # config.vbguest.auto_update = false

  if Vagrant.has_plugin?("vagrant-cachier")
    config.cache.scope = :box
  end

  config.vm.define :svr01 do |server|
    ### determined specific IP.
    server.vm.network "private_network", ip: "192.168.33.11", auto_config: false
    ### vbox name
    server.vm.hostname = 'svr01'
    ### box setting
    server.vm.box = "bento/ubuntu-16.04"
    ### bug fix
    server.vm.provision 'shell', inline: "ifconfig enp0s8 192.168.33.11"
    server.vm.provision 'shell', inline: "sed -i 's/exit\ 0/ifconfig\ enp0s8\ 192\.168\.33\.11/g' /etc/rc.local"
    server.vm.provision 'shell', inline: "echo 'exit 0' >> /etc/rc.local"
    server.vm.provision 'shell', inline: "chmod 644 /home/vagrant/.ssh/authorized_keys"
 end

  config.vm.provider "virtualbox" do |vb|
    ### vagrant hostname
    vb.name = "iganari-web"
    vb.customize ['modifyvm', :id,"--memory", 512]
    vb.customize ['modifyvm', :id,"--natdnshostresolver1", "on"]
    vb.customize ['modifyvm', :id,"--natdnsproxy1", "on"]
  end

  ### settitng of synced_folder
  config.vm.synced_folder "../", "/var/www/html/iganari-web", \
    :create => true, \
    :owner  => 'root', \
    :group  => 'root', \
    :mount_options => ['dmode=755,fmode=755']

  config.vm.provision :shell, :path => "ssh/init.sh"


end
```

### 結び

最近はdockerで構築する機会も多くなりましたが、vagrantも十分便利ですよね。
なので、用途に応じて使い分けていきたいものです。
ブレイクポイント


レスポンシブのサイトコーディングをしていて **ブレイクポイントの普通ってどんぐらい？** と少し思ったので。

[このサイト](http://scene-live.com/page.php?page=97 "このサイト")によると
 
>・599pxまではモバイル専用
>・600px～959pxまではタブレット（とブラウザを狭くしたデスクトップ）
>・960px～1280pxまではデスクトップ（と横置きしたタブレット）
>（・1281px以上はデスクトップ専用）

**600pxと960px（と1281px）がベスト** らしい。

で、いくつかサイトを調べてみた。

##レスポンシブのサイト

[優れたレスポンシブがたくさんあるサイト](http://responsive-jp.com/ "優れたレスポンシブがたくさんあるサイト")。
（次から続くサイトはこのサイトから見つけました）

で、このサイト自体のブレイクポイントは **639px / 999px**。

##カフェのサイト

[おしゃれなカフェのサイト](http://cobukecoffee.com/ "おしゃれなカフェのサイト")。こういうカフェめっちゃ好き。

で、このサイトのブレイクポイントは **768px**。
私が今作ってるサイトも **800px** のみで、ブレイクポイントが一つだけのサイトを他に見つけて少しホッとしている。

##時計メーカーのサイト

[いい時計がいっぱいあるメーカー](http://casio.jp/ "いい時計がいっぱいあるメーカー")のサイト。コーポレートサイトって感じのデザインです。

で、このサイトのブレイクポイントは **48em**。
フォントサイズで指定することもあるんですね。
ベースのフォントサイズは **16px** ぐらいだったので実際はコーヒーのサイトと同じ **768px** ぐらい。

##ベビーカーのサイト

[ここです](http://www.maxicosi.jp/ "ここです")。

ここのブレイクポイントも **768px** 。

##まとめ

細かいのを覚えるのは苦手なので、平均で

- スマホ対応との境目には **800px**
- pcとの境目には **1000px**

ぐらいだと頭に入れておこうかな、と思います。
php7 + pthreadsインストールメモ

今まではremiのphp7を使っていたのだけど、データ解析用のphpが遅いのでpthreadsで並列化することに。

wget http://jp2.php.net/get/php-7.0.9.tar.bz2/from/this/mirror
php-7.0.9.tar.bz2にリネームして解凍
wget http://pecl.php.net/get/pthreads-3.1.6.tgz 
解凍してphp-7.0.9/ext/pthreadsに移動

php-7.0.9ディレクトリで
./buildconf --force
./configure --enable-debug --enable-maintainer-zts --enable-pthreads --enable-mbstring --prefix=/usr --with-config-file-path=/etc

configure: error: xml2-config not found. Please check your libxml2 installation.
sudo yum install libxml2
sudo yum install libxml2-devel

make
sudo make install

sudo cp php-development.ini /etc/php.ini
Include_path = " /usr/lib/php/"
を追加記載

これで、通常のWeb等で使うPHPは
/opt/remi/php70/root/usr/bin/php
マルチスレッドで使いたい時は
/usr/bin/php
で使い分けれるようになる。


実際の並列効果は・・・
VCPUが８コアなのでPool(8)でやっているがCPU使用率が70%くらいで留まっている。
６時間位かかっている処理が１時間くらいで済むようになると嬉しいのだが・・・
今から始めるWindows10認証環境構築

# 概要

ハワイ時間の7/29 23:59:59まであとわずかだけど、まだ遅くはないクリーンインストール前提の最速Windows10環境構築方法をさらっとまとめておくよ！

# 準備するもの

* Windows10をライセンス認証させておきたいPC
* 中身を丸ごと削除してもいいHDD(HDD全部は無理でもWindows10がインストール可能で中身を削除してもいいパーティションがあればよい)
* Windows7 SP1またはWindows8.1のインストーラ(認証できること)
* Windows10のインストーラ([ISOイメージをダウンロード](https://www.microsoft.com/ja-jp/software-download/windows10)して作成する)
* 適当なUSBメモリ(もしくはDropboxなどファイルを保存できるサービスがあればよい)

# Windows7 SP1またはWindows8.1のインストール

ウィザードに従って普通にインストールするだけ。
サービスパックの適用状況が異なる場合はあきらめてサービスパックをインストールすること。もちろんライセンス認証も行っておく。

# Windows10インストール前の下準備

Windows10のインストーラからgatherosstate.exeをコピーしてきて、どんな方法でもいいのでWindows7 SP1またはWindows8.1のデスクトップ上にもってくる。
もってきたgatherosstate.exeを実行すると、デスクトップ上にGenuineTicket.xmlファイルが作成されるので、USBメモリなどに待避しておく。

# Windows10のクリーンインストール

インターネットにつながらないようにLANケーブルを抜いたりWi-fi親機の電源を抜いたりしてWindows10をクリーンインストールする。
アップグレードではなくクリーンインストールなので、Windows10のインストーラでブートしてそのままWindows7 SP1またはWindows8.1のインストール先パーティションをフォーマットして普通にWindows10をインストールする。

# Windows10のライセンス認証

ここではまだインターネットにつながらないようにしたままにしておくこと。
待避しておいたGenuineTicket.xmlをWindows10の%SystemDrive%\ProgramData\Microsoft\Windows\ClipSVC\GenuineTicketにコピーする。
その後Windows10を再起動する。
再起動後、インターネットに接続するとライセンス認証される。
コントロールパネルのシステムや、コマンドプロンプトで

```
slmgr /dlv
```

とすればライセンス認証の状況を確認できる。
React.js開発環境をサーバー上に作る

# React.js簡易開発環境

## 概要
React.jsを自分のサーバー環境を使用して使いたい場合の環境構築です。
ついでにLivereload機能とか、BowerでクライアントサイドJSライブラリを管理する環境を試しに作ってみました。

### ゴール
* クライアントサイドJSライブラリの管理 [bower](https://bower.io/)
* クライアントサイドJSライブラリの配置を自動化 [gulp-bower](https://www.npmjs.com/package/gulp-bower)
* Webサーバーでコンテンツを配信 [Gulp.js](http://gulpjs.com/)
* ライブリロード [Browersync](https://www.browsersync.io/)
* React.jsのクイックスタートコードが動く [React.js](https://facebook.github.io/react/index.html)


## 環境
* Linux （今回はCentOS7.0 on Vagrant on Windows7）
* Node.js 4.0

## 流れ
1. プロジェクト用フォルダを作成
2. 各種npmモジュール、必要なコマンドのインストール
3. 各種設定ファイル作成
4. 実行

## スーパークイックスタート

```sh:フォルダと主要ファイル構成
./gulp-bower-browersync-react-sample
|-- gulpfile.js
|-- app
|   |-- index.html
|   |-- css/main.css
|   `-- js/main.js
|       `-- lib
|-- bower_components
|   `-- react
`-- node_modules

```

### プロジェクトフォルダを作成
```sh:bash
mkdir gulp-bower-browersync-react-sample
cd gulp-bower-browersync-react-sample/
```

### 初期化とインストール
```sh:bash
npm init
npm install --save-dev gulp gulp-bower browser-sync
npm install -g bower
bower install --save react
```

### 基本フォルダとファイルの作成
```sh:bash
mkdir -p app/css
mkdir -p app/js
touch app/css/main.css
touch app/js/main.js
```

### Gulpの設定ファイルを作成

* bowerでインストールしたモジュールを公開フォルダにコピー
* Browsersyncでサーバーを実行、watchタスクで指定したファイルに変更があればブラウザをリロード

```sh:gulpfile.js
var gulp = require('gulp');
var browserSync = require('browser-sync');
var bower = require('gulp-bower');
var reload = browserSync.reload;

gulp.task('default', ['bower','serve']);

gulp.task('bower', function() {
  return bower().pipe(gulp.dest('app/js/lib/'))
});

// watch files for changes and reload
gulp.task('serve', function() {
    browserSync({
        server: {
            baseDir: 'app'
        },
        port: 3001,
        ui: {
            port: 3002,
            weinre: {
                port: 3003
            }
        }
    });

    gulp.watch(['*.html', 'css/**/*.css', 'js/**/*.js'], {
        cwd: 'app'
    }, reload);
});
```


### index.htmlを作成
[React:Getting Started](https://facebook.github.io/react/docs/getting-started.html)
のhelloworld.htmlを使いますが、今回の構成にあわせてソース読み込みのパスを変更しています。
`/bower_components` -> `/js/lib`

```sh:app/index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Hello React!</title>
    <script src="/js/lib/react/react.js"></script>
    <script src="/js/lib/react/react-dom.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.34/browser.min.js"></script>
    <script src='/js/main.js'></script>
    <link rel="stylesheet" href="/css/main.css" type="text/css" >
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
      ReactDOM.render(
        <h1>Hello, world!</h1>,
        document.getElementById('example')
      );
    </script>
  </body>
</html>
```

### サーバーの実行
```sh:run!
gulp
```

ブラウザからサーバーにアクセスして、"Hello,World!"が画面上に表示されれば成功です。

### エラーの対処
rootユーザーで作業する場合、bowerコマンドではエラーが出る場合がある。

* Error: ENOTDIR: not a directory, open '/root/.config/configstore/bower-github.yml'
`/root/.config`が存在する場合、問題なければ一旦削除して以下の様に`--allow-root`オプションを加えて実行する

`bower install --save react --allow-root`

---
Raspberry Piのホスト名を変更する

#概要
複数のラズパイを使うことになったので、識別するためにそれぞれのホスト名を変更してみた。

#環境
Raspberry Pi 2 Raspbian

#方法
`/etc/hostname`
`/etc/hosts`
の両方のファイルの「raspberrypi」を任意のホスト名に置き換える。
変更後、rebootすると反映される。

※`/etc/hostname`のみの変更だとrebootした後に元に戻ってしまうため、必ず2つとも変更する
[小ネタ]Kibana で別ホストのElasticsearch と接続する

小ネタです。

# バージョン

+ kibana 4.5.3
+ Elasticsearch 2.3

# やってみた

こちらに書いてあります。

[Setting Kibana Server Properties](https://www.elastic.co/guide/en/kibana/current/kibana-server-properties.html#kibana-server-properties)

ダウンロードした kibana の config/kibana.yml を変更

```kibana.yml
# The Elasticsearch instance to use for all your queries.
 elasticsearch.url: "http://hogefuga:9200"
```

あとは kibana を起動すればOK

```bash
bin/kibana
```
【MySQL】アプリ改修前後のテーブルデータ比較手順（コピペ用）

# 概要
アプリのデータベース更新系処理を改修したときに、
改修前後で、更新結果のテーブルデータがきちんと完全一致しているか調べる機会があったので、
手順とコピペ用SQLを纏めた。

# 前提
MySQLであること。

# 手順とSQL
## 1. 更新対象のテーブルを、コピーして別名で保存しておく。

```sql:
CREATE TABLE initial_table LIKE target_table;
INSERT INTO initial_table SELECT * FROM target_table;
```

※likeをすると、インデックスもコピーされる（今回は特に意味ないかも）

## 2. アプリで改修前の更新処理を実行
masterブランチで実行することになるかと。

## 3. 2で更新されたテーブルをリネーム

```sql:
ALTER TABLE target_table RENAME TO before_table;
```

## 4. 1で保存しておいたテーブルを、本来の名前でコピー

```sql:
CREATE TABLE target_table LIKE initial_table;
INSERT INTO target_table SELECT * FROM initial_table;
```

## 5. アプリで改修後の更新処理を実行

改修ブランチで実行することになるかと。

## 6. 5で更新されたテーブルをコピー

```sql:
CREATE TABLE after_table LIKE target_table;
INSERT INTO after_table SELECT * FROM target_table;
```

ここまでで、アプリ改修前後の更新結果テーブルがそれぞれ存在することになる。

+ before_table （改修前の更新結果）
+ after_table  （改修後の更新結果）

## 7. アプリ改修前後の更新結果テーブルを比較

比較1,2を両方行い、どちらも結果が0件ならOK.

#### 比較1 (RIGHT JOIN)
```sql:
SELECT
    *
FROM 
    after_table AS a
RIGHT JOIN
    before_table AS b
    ON
        a.プライマリーキー = b.プライマリーキー
    AND
        a.更新したカラム1 = b.更新したカラム1
    AND
        a.更新したカラム2 = b.更新したカラム2
    AND
        〜〜〜以下、更新したカラムを全てANDで記述する
WHERE
    a.プライマリーキー IS NULL
```

#### 比較2 (LEFT JOIN)
```sql:
SELECT
    *
FROM 
    after_table AS a
LEFT JOIN
    before_table AS b
    ON
        a.プライマリーキー = b.プライマリーキー
    AND
        a.更新したカラム1 = b.更新したカラム1
    AND
        a.更新したカラム2 = b.更新したカラム2
    AND
        〜〜〜以下、更新したカラムを全てANDで記述する
WHERE
    b.プライマリーキー IS NULL
```

※片方だけの実行だと、「before_tableにあるがafter_tableに無いレコード、およびその逆が検出できない。

※JOIN句で指定するカラムは、アプリの更新処理で対象となっている全カラム。
（つまり、更新ではなくテーブル作成の場合は、テーブルの全カラムとなる。。）
（場合によってはプライマリーキーは指定しない方が良い）

※JOIN句で指定するカラムがNULLを許容しており、かつaもbもNULLの場合は一致させたい場合、
下記のようにNULLの場合空文字に変換すればOK.
`IFNULL(a.更新したカラム1,'') = IFNULL(b.更新したカラム1,'')`
→参考：[SQLでNULLとNULLは「＝」ではありません。](http://www.triton.biz/sb1/2010/04/14/sql%E3%81%A7null%E3%81%A8null%E3%81%AF%E3%80%8C%EF%BC%9D%E3%80%8D%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82/)

※WHERE句で指定するカラムは「NULLになることがありえないカラム」推奨。

※JOINではなくUNIONで比較する方法もあるが、レコード数が多い場合はUNIONだと極端に遅くなる。
よく入力する単語を1つのキーで入力する

## なぜ

社名がアルファベットなので日本語の文中に入力が面倒で、社名を入力するショートカットがあればいいのにと思った。

## 方法

### 1.ErgoDox EZを買います。

送料、税金込みで37,000円ぐらいで買える
https://ergodox-ez.com/

### 2. マクロを定義します。

```
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
  // MACRODOWN only works in this function
      switch(id) {
	case 0:
	if (record->event.pressed) {
	  return MACRO( T(LGUI), D(LSFT), T(M), U(LSFT), T(I), T(S), T(O), T(C), T(A), END  );
	}
	break;
      }
    return MACRO_NONE;
};
```

これで`M(0)`でアクセスできるようになるので、好きなキーに`M(0)`を設定する。私の場合はレイヤー1のMに設定した。
`T(LGUI)`で英数入力モードにして、`D(LSFT), T(M), U(LSFT)`でシフトを押してMを押して、シフトを離し、あとはキーを押していくだけ。

詳細：[jackhumbert/qmk_firmware: keyboard controller firmware for Atmel AVR USB family](https://github.com/jackhumbert/qmk_firmware#macro-shortcuts-send-a-whole-string-when-pressing-just-one-key)

## 結果

![モダン1.gif](https://qiita-image-store.s3.amazonaws.com/0/4140/f58037c9-6911-3251-9157-bc319799158f.gif)
Auto start docker container w/ docker-compose in CoreOS

# Prepare init script

To keep cloud-config.yml simple call init.sh only.

```bash
$ cd /path/to/docker-compose/project
$ vim init.sh
```

```bash
#!/bin/bash -ex

cd $(dirname $0)
/opt/bin/docker-compose $1
```

```bash
$ chmod +x init.sh
```

# Register init script to cloud-config

```bash
$ sudo vim /usr/share/oem/cloud-config.yml
```

```yaml
#cloud-config

coreos:
  units:
    - name: docker-xxx.service
      command: start
      content: |
        [Unit]
        Description=Xxx container
        After=docker.service

        [Service]
        Restart=always
        ExecStart=/path/to/docker-compose/project/init.sh start
        ExecStop=/path/to/docker-compose/project/init.sh stop
```
WRF / WPS > namelistの設定 > e_we=n*parent_grid_ratio+1 for some integer n 

WRF(Weather Research and Forecasting Model)とその前処理であるWPSの設定ファイル(namelist.*)について。

グリッドの指定をする設定項目 e_we, e_snについて以下のリンク先に制約が記載されている。

http://www2.mmm.ucar.edu/wrf/users/namelist_best_prac_wps.html#e_we

> For nested domains, e_we and e_sn must be one greater than an interger multiple of the nest's parent_grid_ratio. This is to ensure that a nest always starts and ends on a parent grid point. <font color=red>(i.e., e_we=n*parent_grid_ratio+1 for some integer n)</font>.

ネストされたドメインについては以下の設定について関係式`e_we=n*parent_grid_ratio+1`となるようにしておく必要があるとのこと。

- parent_grid_ratio
- e_we


以下の設定があるとする。

```
&geogrid
 parent_id         =   1, 1,
 parent_grid_ratio =   1, 3,
 i_parent_start    =   1, 24,
 j_parent_start    =   1, 20,
 e_we              =  74, 72
 e_sn              =  61, 61
 geog_data_res     = '10m', '5m',
```

上記の2つ目のドメインに関しては
```
e_we(=72) = n * parent_grid_ratio(=3) + 1
```
という関係式が成り立たない。72 - 1の値は3で割り切れない。

ここでは、e_weは70か73にしないといけなく、ドメインを確認する以下のコマンド

```
$ncl util/plotgrids_new.ncl 
```
をnamelist.wpsファイルがある場所で実行すると

```
(0)	Nest does not end on mother grid domain point. Try 70 or 73.
```
というエラーが出る。

ネストするドメインがネスト親のドメインとポイントが一致するようにするように、とのことのようだ。
SSHサーバに公開鍵をワンライナーで転送する

# はじめに
SSHのセキュリティ・利便性を飛躍的に高める公開鍵認証ですが、鍵を転送(特に2台目以降)するのに、ナイーブな方法では、サーバ側のシェルやSFTPのシェルにコマンドを手打ちしないといけないため、少し面倒です。ここでは、その転送を1行で済ませてしまいます。まず、下準備をします。

# 公開鍵の作成
```bash
cd ~/.ssh
ssh-keygen -f KEY_NAME
# (公開鍵にパスワード掛けたくない場合はエンター2回)
```

`KEY_NAME`は秘密鍵のファイル名ですが、通常は省略して`id_rsa`とします。(省略した場合はエンター3回)公開鍵のファイル名は`KEY_NAME.pub`となります。

# プロファイル追加

```text:~/.ssh/config
Host SERVER_ALIAS
HostName SERVER_ADDRESS
User LOGIN_USER
Port PORT_NUMBER
Identityfile ~/.ssh/KEY_NAME
```

`SERVER_ALIAS`はサーバの短縮名、`SERVER_ADDRESS`はサーバのアドレスまたはドメイン名、`LOGIN_USER`はサーバにログインするユーザ名、`PORT_NUMBER`はサーバのポート番号(22番の場合は省略可)です。


# 鍵転送コマンド
ここが本題です。まず、`ssh-copy-id`というツールがあるかを確かめます。(基本的にあります)

## ssh-copy-idがある場合
次のコマンドを入力し、サーバのパスワードを入れれば終了です。サーバのシェルがtcshなどC Shell系の場合は使えないかもしれません。

```bash
ssh-copy-id SERVER_ALIAS
```

## ssh-copy-idが(使え)ない場合(おそらくレアケース)

次のコマンドを入力すると、サーバ側の公開鍵(転送する自ユーザーの公開鍵ではありません)を保存するか聞かれるので保存し、サーバのパスワードを入力します。**これで転送は終了です。**

```bash
cat ~/.ssh/id_rsa.pub | ssh SERVER_ALIAS 'umask 77 && mkdir -p .ssh && cat >> .ssh/authorized_keys'
# ↓2台目以降専用簡易コマンド↓
cat ~/.ssh/id_rsa.pub | ssh SERVER_ALIAS 'cat >> .ssh/authorized_keys'
```

SSHサーバのシェルがC Shell・tcshで万が一上のコマンドがダメな場合は次のようにします。

```bash
cat ~/.ssh/id_rsa.pub | ssh SERVER_ALIAS 'umask 77 && mkdir -p .ssh && cat >>! .ssh/authorized_keys'
# ↓2台目以降専用簡易コマンド↓
cat ~/.ssh/id_rsa.pub | ssh SERVER_ALIAS 'cat >>! .ssh/authorized_keys'
```

# 確認
サーバに再びSSHでログインします。

```bash
ssh SERVER_ALIAS
```

パスワードを聞かれずにログインできれば成功です。

# SFTPではダメなのか
1台目なら`mkdir`・`chmod`・`cd`・`put`の合わせ技でいけますが、2台目以降だと 鍵を手元にダウンロード→端末を別で開いて手元で追記→サーバに戻す という作業が必要で面倒です。しかし、今回のコマンドだと、1台目でも2台目以降でもワンライナーでいけます。
地味に便利なcssプロパティ


##文字の幅をちょっと開けたりする

```
letter-spacing: 0.2rem;
```    

##幅が可変し過ぎないようにする方法

`max-width` `min-width` を使う。

##cssで縦書きにする

[ここのサイト](http://sterfield.co.jp/designer/css%E3%81%A0%E3%81%91%E3%81%A7%E7%B8%A6%E6%9B%B8%E3%81%8D%E3%82%92%E8%A1%A8%E7%8F%BE%E3%81%99%E3%82%8B/ "ここのサイト")を参考に。

```
p{
	writing-mode: vertical-rl;
	-ms-writing-mode: tb-rl;
	-webkit-writing-mode:vertical-rl;
}
```

`text-align` は効果ないので `padding-left` `padding-right` とかで調整する。

##フォームとかの青い「ほわ〜っ」としたやつを消す

```
input, textarea {
  outline: none;
  /*outline: 0;でもOK*/
}
```
`appearance` で他のデフォルトも消せるっぽいんですが、ひとまず「ほわ〜っ」を消すだけならコレだけ。

##ボタンのデフォルトを消す

```
button {
  margin: 0;
  padding: 0;
  background: none;
  border: none;
  border-radius: 0;
  outline: none;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  &:hover {
    cursor: pointer;
  }
}
```

フォームと違いボタンにはborderやらなんやらたくさんのプロパティが付いてます。
ただ、これらを消すとhoverしたときにカーソルにならないのでボタンっぽさが完全になくなってしまう。
そこで擬似要素を追加。
これはscssでの書き方なのでcssの場合は `$:hover` を `button:hover` にしてください。
CentOS 7 でGUIとCUIを切り替える

必要な時には忘れてそうなので、メモしておきます。

# CUIに変更する

```
一時的な変更
# systemctl isolate multi-user.target
永続的な変更
# systemctl set-default multi-user.target
```

# GUIに変更する

```
一時的な変更
# systemctl isolate graphical.target
永続的な変更
# systemctl set-default graphical.target
```

# もしもエラーになったら
CentOS 7.2を使用しているとバグによって、以下のようなエラーが出るかもしれません。
既にバグは修正済みですので、yum updateしちゃえば解決します。

```
# systemctl isolate graphical.target
PolicyKit daemon disconnected from the bus.
We are no longer a registered authentication agent.
```

---
2017/1修正
以下、友人に教えてもらったので追記。

# 現在のsystemdのターゲットの確認
RHEL 7からはランレベルの概念はsystemd targetに置き換わりました。
現在のターゲットは以下のコマンドで確認できます。

```
# systemctl get-default
```

# ターゲットの種類
redhatのマニュアルに記載があるとおり以下のような分類があります。

|ターゲット名|概要|
|:---|:--|
|graphical.target|グラフィカル、マルチユーザシステムを設定|
|multi-user.target|非グラフィカル、マルチユーザシステムを設定|
|rescure.target|レスキューシェル（シングルユーザ）を設定|
|emergency.target|エマージェンシーシェルを設定|
WRF / WPS > namelistの設定 > time_step > 6*DXにする / CFLエラー時には 4*DXや3*DXも検討する

WRF(Weather Research and Forecasting Model)とその前処理であるWPSの設定ファイル(namelist.*)について。

[PDF資料](https://coawstmodel.sourcerepo.com/coawstmodel/data/training_23jul2012/presentations/monday/5_COAWST_Tutorial_WRF.pdf)のpage 10においてtime_stepの記載がある。

> ARW: 6*DX (DX is grid distance in km): for DX=10km, time_step = 60

実際にはnamelist.*ファイルのDXには10000のようにm単位で設定するので、`6 * DX / 1000`ということらしい。

[Best Practice](
http://www2.mmm.ucar.edu/wrf/users/namelist_best_prac_wrf.html#time_step)にも記載がある。

> It is recommended to use a value of 5-6xDX (in km) for a typical case.
...

CFL errorsがあれば4*DXや3*DXでの計算にした方がいい、という記載もある。

こういうモデルでは空間分解能を上げる場合は、時間分解能もあげた方が安定して計算できるということかもしれない。
Storyboard Reference で画面遷移

#Storyboard Reference とは
Storyboard Reference はXcode7,iOS9から使用できる画面遷移をいい具合にやってくれる機能です。

ViewControllerを一つのStoryboardにまとめずに、複数のStoryboardに分ける時なんかに使います。

#使い方
まずはXcodeの右下のユーティリティエリアからStoryboard Referenceを選択し、Storyboardに配置します。
そしてボタンなどから紐付けてやります

![StoryboardReference1.png](https://qiita-image-store.s3.amazonaws.com/0/133776/5a208c2a-849e-61ac-0569-222c919658ed.png)

次にStoryboard Referenceを選択した状態でXcodeの右上のユーティリティエリアから
遷移先のStoryboardを指定します。

![StoryboardReference2.png](https://qiita-image-store.s3.amazonaws.com/0/133776/52e267ef-8f2f-ff90-90eb-6ea9a2798425.png)


#いいところ
・とにかく簡単
・視覚的にどことどこが繋がっているかわかりやすい

#わるいところ？
・パラメータの受け渡しがやりにくい
Storyboard ReferenceというよりはSegueの問題なのですが、遷移先に何か受け渡すとなるとshouldPerformSegueWithIdentifierとかprepareForSegueを書かないといけないので結局めんどくさくなってしまう、多分。

#さいごに
パラメーターの受け渡しがやりにくいとか書いてしまいましたが、多分自分がまともな使い方を知らないからだと思います、何かもっといい感じに使う方法などありましたら教えて下さい。
sparksqlでhive tableにinsertする歳にparquetのfieldはnullはだめだよーんと怒られる場合

- 生ログをparseしてmap型を持つデータをhiven入れる
- そのmap型はsize 0の可能性がある

size 0のmap型を含むをrowをhive tableにdf経由でいれるときに
エラーが発生する。

ぱかちょん回避策は

- size 0の場合は、size 0だよんと教えるように、
Map("null" -> "")みたいなのをいれて、size 1にする。

であればエラーは発生しない。

parquetのバグっぽいので、hiveのissueに上がっている。

https://issues.apache.org/jira/browse/HIVE-8359
vagrant上でのubuntu14.0のインストール

まず、Vagantの公式ページ上では、
Ubuntu 12.04 LTS 64-bitのインストールは載っていますが、
14.0については、インストール方法が明確ではないため、メモとして残しておきます。
＜公式ページ＞
https://www.vagrantup.com/docs/getting-started/

＜14.0のインストール＞
https://atlas.hashicorp.com/ubuntu/boxes/trusty64

＜実行コマンド＞
vagrant init ubuntu/trusty64; vagrant up --provider virtualbox

すると、自動的にtrusty64を検索しに行って、インストールが開始されます。
ネットワーク環境にもよりますが、ubuntuのインストールはしばらく時間がかかります。

※virtualfilesが残っているとエラーになってしまうので、rmで削除しておくことが必要だと思います。

前提：検証したわけではないのですが、virtual boxがインストールされていることは必要だと思います
Raspberry PiのCUIモード時のフォントサイズを大きくする

#概要
ラズパイを家のテレビにHDMI出力した際に文字が小さくなりすぎてしまったので、フォントサイズを変えてみた

#環境
Raspberry Pi 2 Raspbian

#方法
`/boot/config.txt` を編集し、以下2つの行のコメントアウトを外す

```
#hdmi_group=1
#hdmi_mode=4
```

その後rebootすると、フォントサイズがいい感じに大きくなる
WRF | WPS > namelistの設定 > truelat1 | truelat2 | stand_lon

WRF(Weather Research and Forecasting Model)とその前処理であるWPS。

設定ファイルであるnamelist.wps, namelist.inputにおいて、truelat1, truelat2という項目があるが、その説明が分かりにくかったので調べた。

### truelat1

[PDF資料](http://www2.mmm.ucar.edu/wrf/users/tutorial/200907/Basic/WPS-general.pdf)のpage 9とpage 10にtruelat1の説明がある。

Mercator図法とPolar Stereographic図法の2つにてtruelat1を使うようだ。

truelat1の値を変更した時の結果は[PDF資料](
https://coawstmodel.sourcerepo.com/coawstmodel/data/training_25aug2014/presentations/monday/2_COAWST_2014_Turorial_WPS.pdf)のpage 12に記載されている。

(追記 2018/02/28)
同じ資料にstand_lonの記載もある。

### truelat2

truelat2はLambert Conformal図法にてtruelat1と一緒に使われるとのこと。

[PDF資料](http://www2.mmm.ucar.edu/wrf/users/tutorial/200907/Basic/WPS-general.pdf)のpage 8に説明がある。

三角形と円の交点2つの座標をtruelat1, truelat2として使うようだ。
Laravel firstOrCreate と firstOrNewの違いと、create、newしたか判定する方法

Laravelの、firstOrCreateとfirstOrNewの違いを調べました。
でも、まさしく、名前のままでした。

念のため、詳細は、
https://laravel.com/docs/5.1/eloquent

# firstOrCreateは、実行時にレコードを作成

その名の通り、firstか、create。
実行時に、指定したパラメータを持ったレコードが無ければ、createします。
（外部キー制約がある場合、外部キーも渡さないとcreate時にexceptionになります）

```php:firstOrCreate
// Eloquentを継承したAreaクラスがあったとする
$area = Area::firstOrCreate(['name' => '北海道']);

// wasRecentlyCreated を用いることで、今回のリクエストで作成されたことを判定できる
if ($area->wasRecentlyCreated) {

    // 既にcreateされているので、idなどのattributeにもアクセスできる

}
```

# firstOrNewは、インスタンスを作成するだけ

newするだけなので、まだレコードとして記録されていません。
いい感じに処理したあとは、`save()`しましょう。DBにレコードが記録されます。
（レコードに外部キー制約がある場合、saveするより前に外部キーをつけてあげればOK。便利です。）

```php:firstOrNew
// Eloquentを継承したAreaクラスがあったとする
$area = Area::firstOrNew(['name' => '北海道']);

if (!$area->exists) {
    // レコードが存在しないときは、existsがfalseになる
    // まだcreateされていないため、idなどのattributeにはアクセス出来ない
    ...
    ...
    // saveすることでcreateできる
    $area->save();
}

if ($area->wasRecentlyCreated) {
    // saveによって、新しくレコードが作られたことを判定できる
    ...
}
```

# createされたかどうかの判定の仕方

`wasRecentlyCreated`で判定することができます！

# newされたものかどうかの判定の仕方

`exists` というプロパティが使えそうです（[Laravel5.1のModel実装](https://github.com/laravel/framework/blob/5.1/src/Illuminate/Database/Eloquent/Model.php#L187)）。
これは、レコードが存在するかどうかを示すbool値です。このことから、`firstOrNew`の直後に、そのインスタンスがfirstで取れたものか、newされたものかをチェックする必要があるときには、使いやすいプロパティかなと感じます。

# Laravel 5.1 未満の create, new判定

Lravel 5.1未満では、wasRecentlyCreatedは使用できませんでした。
そのため、私は以下のような方法で実装していました。

```php:firstOrNew（Laravel5.1未満）
// Eloquentを継承したAreaクラスがあったとする
$area = Area::firstOrNew(['name' => '北海道']);

if (!$area->id) {

    // saveすることでcreateできる
    $area->save();
}
```

firstOrNewを使用して、取得したインスタンスにidが付与されているかどうかを確認することで、新規追加のデータかどうかを調べられます。しかし、Laravel 4.2でも`exists`のプロパティがありました。こちらのほうが意図が伝わりやすい書き方になりそうです。
firstOrCreateの方では、おそらくレコードの新規追加をチェックできなさそうです。Createしてしまうと、idも付与されてしまいますので。idでできないとするならば、空のカラムあるなどのチェックとかなら、できそうですね。
16進数文字列をバイナリデータにパックしてHMAC を算出するワンライナー

# 背景
諸事情により、HMAC-MD5 を大量に作成するアドホックなタスクが発生した。
アドホックな大量タスクをこなすにはワンライナーを使うのが一番なので HMACの算出をするワンライナーをさがしたが、ワンライナーが苦手な一時ファイル作成をせずに任意のバイナリを入力可能な方法が意外と一般的ではないようだったので、後学のためにここに記録しておく。


# やり方
    key='ほげ' value='ふが'; echo -n "$value" | xxd -r -p | openssl dgst -md5 -mac HMAC -macopt "hexkey:$key"
`ほげ`、`ふが`にはバイナリを16進数にした文字列を指定する。
キモとなるのが openssl の hexkey という引数で、これが使えるようになったのは比較的最近のようだ。（0.9.8 ではだめで、1.0.2 なら大丈夫だった）
### 参照
OpenSSL HMACコマンドの使い方（dgst -hmacの引数がひどい件） | Engineer's Notebook http://myenotes.blog.fc2.com/blog-entry-107.html
opensslのHMACコマンドではまった話 http://homepage1.nifty.com/herumi/diary/1207.html


## 検証
RFC 2104 の Sample Code に書かれている内容と一致するかを確認する。
https://tools.ietf.org/html/rfc2104
openssl を絶対パス指定しているのは、実行環境にインストールされている古いopenssl を使わないため。

### A
    key =         0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b
    key_len =     16 bytes
    data =        "Hi There"
    data_len =    8  bytes
    digest =      0x9294727a3638bb1c13f48ef8158bfc9d

一致

    % key='0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b' value=`echo -n 'Hi There' | hexdump -e '1/1 "%02x"'`;  echo -n "$value" | xxd -r -p | /usr/local/Cellar/openssl/1.0.2h_1/bin/openssl dgst -md5 -mac HMAC -macopt hexkey:$key
    (stdin)= 9294727a3638bb1c13f48ef8158bfc9d


### B
    key =         "Jefe"
    data =        "what do ya want for nothing?"
    data_len =    28 bytes
    digest =      0x750c783e6ab0b503eaa86e310a5db738

一致

    % key=`echo -n 'Jefe' | hexdump -e '1/1 "%02x"'` value=`echo -n 'what do ya want for nothing?' | hexdump -e '1/1 "%02x"'`; echo -n "$value" | xxd -r -p | /usr/local/Cellar/openssl/1.0.2h_1/bin/openssl dgst -md5 -mac HMAC -macopt hexkey:$key
    (stdin)= 750c783e6ab0b503eaa86e310a5db738

## ちなみに
HMAC-SHA256 が欲しい場合は `dgst -md5` を `dgst -sha256` にすればOK

# 関連ページ

## 情報ソース
http://stackoverflow.com/a/22369607
Werckerで "Bundler failing with index file .idx too small error" といったエラーが出た場合の対処

# 状況
普段Rails4系のアプリでWerckerをCIとして使っています。
WerckerはDocker版を使用しています。

そのBuild Stepで

```rb
Bundler failing with index file .idx too small error
```

といったエラーがたくさんでて、結果的に 

```rb
Retry exceeds max retries
```

といったエラーでBuildが止まりました。

# 対応
[このエラーは報告されていますが、まだ解決されていないようです。](https://github.com/wercker/support/issues/125)
ただ、対応としては、cacheを消せばいいとのこと。

実際消してやってみるとすんなりとおりました。

でも毎回消す必要が出てしまうので、werckerのstepに入れ込みたいです。

```yaml
    - script:
        name: Clear bundle cache
        code: rm -rf /pipeline/cache/bundle-install/ruby/2.3.0/cache/bundler/git/*
```

↑のパスは各自のパスに直してください。

ただ、これをすることで CI での Load は上がるかもしれないとも言われています。（現在これといって問題は感じていませんが）
ファーム内の全ワークフローインスタンスの状態をタブ区切りで出力する


実行すると全Web applicationのワークフローインスタンスの状態をタブ区切りテキストで出力します。
毎日バッチ実行とかして監視対象にするとエラーのキャッチアップや、障害分析にわりと便利。

```

if((Get-PSSnapin Microsoft.SharePoint.Powershell) -eq $null)
{
    Add-PSSnapin Microsoft.SharePoint.Powershell
}

#####################  設定 ########################################

$ReportPath = "C:\" #結果を保存したいパスをいれとく

###################################################################




$Reportname = "Report_" + (get-date -Format "yyyyMMdd_HHmmss") + '.log'
$ReportFullPath = Join-Path $ReportPath $Reportname

$arrHeader = @('WebURL','List URL','ListTitle','Item Title','Item ID','Item Last Modified','Item Last Editor','Workflow.ParentAssociation.Name','Workflow.StatusText','Workflow.StatusValue','Workflow.StatusUrl','Workflow.IsLocked','Workflow.IsCompleted','Workflow.InternalState','Workflow.Created','Workflow.Modified','Workflow.AuthorUser')

$arrHeader -join "`t" | Out-File -FilePath $ReportFullPath -Append 

foreach ($wa in get-spwebapplication)
{
    #WebApp
    foreach($oSites in $wa.Sites)
    {
        #sites
        foreach($oWeb in $oSites.AllWebs)
        {
            #Web
            foreach($oList in $oWeb.Lists)
            {
                #List
                if($oList.WorkflowAssociations.Count -gt 0)
                {
                    foreach($oItem in $oList.Items)
                    {
                        #Item
                        foreach($Workflow in $oItem.Workflows)
                        {
                            $Log = @($oWeb.Url ,$oList.DefaultViewUrl,$oList.Title , $oItem.Title, $oItem.ID,$oItem['Modified'],$oItem['Editor'],$Workflow.ParentAssociation.Name,$workflow.StatusText,$Workflow.StatusValue,(($oWeb.URL).Trim()+'/'+($Workflow.StatusUrl).Trim()),$Workflow.IsLocked,$Workflow.IsCompleted,$Workflow.InternalState,$Workflow.Created,$Workflow.Modified,$Workflow.AuthorUser)
                            write-host ( $Log -join "`t" )
                            $Log -join "`t" | Out-File -FilePath $ReportFullPath -Append 
                        }
                    }
                }
            }
        }
    }
}
```

おまけ
ログローテーションしたいときはこんな感じの関数を定義しとく

```
function RotateLog($LogFilePath , $RotateDays)
{
        $Logs = ls $LogFilePath -file -filter *.log | ? { ( (Get-Date) - ($_.LastWriteTime) ).Days -gt $RotateDays }
        if($Logs.Count -gt 0){
            try{
                $Logs.Delete()
                }catch [exception]{
                    throw ($error[0])
                }
        }
}
RotateLog -LogFilePath $ReportPath -RotateDays 20 # ログファイルのパスとローテーション間隔(日)を渡す
```
Markdown記法入門

マークダウン記法はシンプルなマークアップ言語です。元々はプレーンテキストで書いた物からHTMLを出力する為に開発されましたが開発者によって多様な拡張が施されるため、各種の方言とサービス独自の拡張が存在します。この記事ではQiitaで使用可能なMarkdown記法について紹介します。

#見出しの書き方
記事は見出しから始まります。なのでまずは見出しの書き方についてです。

```
# 任意の見出し
## 任意の見出し
#### 任意の見出し
```

行頭にシャープを付けると見出しになります。#の個数によって見出しの大きさが変わります。
具体的には#が多いほど小さくなり、最大で６つまでつけられます。これは、#の個数がHタグのレベルと対応しているためです。例では上からh1,h2,h4です。

#テキストを装飾する

```
ノーマルのhoge
強勢された_hoge_
強調された__hoge__
打ち消された~~hoeg~~
```

上のサンプルが下のようになります。
ノーマルのhoge
強勢された_hoge_
強調された__hoge__
打ち消された~~hoeg~~
`_hoge_` と `__hoge__` はそれぞれ`<em>hoge</em>`と`<strong>hoge</strong>`に、  `~~hoge~~`は`
hoge
`に対応します。


#リストの書き方
#### Disc型
+, -, * のいずれかを行頭に付けるとDisc型のリストになります。Disc型のリストは、順番の無いリストです。

```
+ あいうえお
+ かきくけこ
+ さしすせそ
```


+ あいうえお
+ かきくけこ
+ さしすせそ

#### Decimal型
`数字.`を行頭に入れると順番のあるDecimal型のリストになります。

```
1. あいうえお
2. かきくけこ
3. さしすせそ

```

1. あいうえお
2. かきくけこ
3. さしすせそ

#### Definition型

Definition型のリストはHTMLの<dl>タグを使って作ります。Defenition型のリストとは、

> このリストは、「定義する用語（dt要素）」と「その用語に対する説明（dd要素）」によって構成されています。
> 一般的なブラウザでは、用語部分と説明部分の間に改行が入り、説明部分の左側はインデントされて表示されます。

との事。

```

<dl>
  <dt>Windows</dt>
  <dd>MicrosoftのOS</dd>
  <dt>Elcapitan</dt>
  <dd>AppleのOS</dd>
</dl>

```

<dl>
  <dt>Windows</dt>
  <dd>MicrosoftのOS</dd>
  <dt>Elcapitan</dt>
  <dd>AppleのOS</dd>
</dl>

dlタグの中ではMarkdown記法によるテキストの修飾は使用できないので、対応するHTMLタグを使用する必要があります。

#### Checkbox型

チェックボックスのリストです。Disc型のリストの後ろにスペースを入れて[ ]を入れます。チェックするには[ ]の中にxを記入します。

```

- [ ] hoge
- [x] huga
- [ ] bar

```

- [ ] hoge
- [x] huga
- [ ] bar

#引用の書き方

```

>行頭に>を付けると引用文になります。
>複数行の場合、それぞれの行に>を付けます。
>> 引用文の中で引用されている場合は、>を２つ付けます。

```

>行頭に>を付けると引用文になります。
>複数行の場合、それぞれの行に>を付けます。
>> 引用文の中で引用されている場合は、>を２つ付けます。[^1]

#リンクの貼り方
タイトル付きのリンクを貼る場合は

```

[リンクテキスト](URL タイトル)

```
付けない場合は

```

[リンクテキスト](URL)

```
になります。タイトルを付けるとリンクにマウスオーバーした時に、キャプションが表示されます。

[タイトル有り](http://qiita.com "Qiita")
[タイトル無し](http://qiita.com)

#線の書き方
```

* * *
***********
------------------
- - - -

```

上の行がそれぞれ下の行になります。

* * *
***********
------------------
- - - -

#画像の埋め込み方

タイトル有りの場合は

```

![代替テキスト](画像のURL "画像タイトル")

```

タイトル無しの場合は

```

![代替テキスト](画像のURL)

```
になります。
代替テキストとは、画像が表示されなかった場合に表示されるテキストの事です。

![代替テキスト](https://www.pakutaso.com/shared/img/thumb/HIRAkotatuneko_TP_V.jpg "タイトル有り")

![代替テキスト](https://www.pakutaso.com/shared/img/thumb/HIRAkotatuneko_TP_V.jpg "タイトル有り")

#テーブル記法
テーブルを書きたい場合は下のように書きます。

```

|left hoge|center hoge|right hoge|
|:--------|:---------:|---------:|
| hoge1   | hoge1     | hoge1    |  
| hoge2   | hoge2     | hoge2    |
| hoge3   | hoge3     | hoge3    |
| hoge4   | hoge4     | hoge4    |

```

|left hoge|center hoge|right hoge|
|:--------|:---------:|---------:|
| hoge1   | hoge1     | hoge1    |  
| hoge2   | hoge2     | hoge2    |
| hoge3   | hoge3     | hoge3    |
| hoge4   | hoge4     | hoge4    |

一段目にタイトル、二段目に寄せ方を記述します。
例では縦の線が揃うように書いていますが、そろっていなくても構いません。

#注釈の入れ方
本文中に`[^1]`や`[^任意の文字列]`と入れることで、脚注へのリンクを貼ることが出来ます。

#Markdownを無効化する
バックスラッシュを(\)をMarkdownの前につけることで無効化出来ます。

> \ # 無効化された見出し

[^1]: http://www.tagindex.com/html_tag/list/dl.html
gem の紹介：key_change 音楽のコードを楽に転調する

最近はgemを作ってみたので紹介させていただきます。

ドキュメントはこちら: <a href="https://www.github.com/gazayas/key_change" target="_blank">key_change</a>

本業としてはプログラミングをしていないし、
プログラミング歴も浅いので申し訳ないのですが、
もしミュージシャンのプログラマーに役に立てればと思います。

`$ gem install key_change`

```ruby:test.rb
require 'key_change'

chords = ["G", "Em", "C"]
original_key = "G"
new_key = "A"

# メソッドが返す配列で新しい変数を定義します
new_chords = change(chords, original_key, new_key, :default)
```
返されるのは：

```ruby
["A", "F♯m", "D"]
```

具体的な説明はgithubの方に書いてあるので
そちらの方をご参照ください。

つたない記事やコードをすみませんでした。
よろしくお願いします。