OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 18.04 LTSにJUMAN++をインストールする方法

Ubuntu 18.04 LTSにJUMAN++をインストールする方法についてまとめてみます。

#必要なパッケージのインストール
2. [checkinstall, ccacheを用いてUbuntuにソフトウェアをインストールする方法 - Qiitaの必要なパッケージのインストール](http://qiita.com/SUZUKI_Masaya/items/bd03f39e20a1a8f7f4f6#%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)に従って、必要なパッケージのインストールを行います。
1. `sudo apt install google-perftools libgoogle-perftools-dev libboost-dev`を実行し、必要なパッケージをインストールします。

#JUMAN++のインストール
1. [JUMAN++](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN++)(xz圧縮)をダウンロードします。
1. 適当なディレクトリに解凍します。
2. [checkinstall, ccacheを用いてUbuntuにソフトウェアをインストールする方法 - Qiitaのソフトウェアのインストール](http://qiita.com/SUZUKI_Masaya/items/bd03f39e20a1a8f7f4f6#%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)に従ってインストールを行います。<br>※途中でかなりの待ち時間が発生しますが、焦らずゆっくりと待ちましょう。

#動作確認
`echo "麻生太郎はコーヒーを買って飲んだ。" | jumanpp`を実行し、次のように出力されれば、インストール成功です。

```
麻生 あさお 麻生 名詞 6 地名 4 * 0 * 0 "代表表記:麻生/あさお 地名:日本:神奈川県:区"
@ 麻生 あそう 麻生 名詞 6 地名 4 * 0 * 0 "自動獲得:Wikipedia Wikipedia複合地名 Wikipedia多義"
太郎 たろう 太郎 名詞 6 人名 5 * 0 * 0 "人名:日本:名:45:0.00106"
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
コーヒー こーひー コーヒー 名詞 6 普通名詞 1 * 0 * 0 "代表表記:珈琲/こーひー カテゴリ:人工物-食べ物 ドメイン:料理・食事"
を を を 助詞 9 格助詞 1 * 0 * 0 NIL
買って かって 買う 動詞 2 * 0 子音動詞ワ行 12 タ系連用テ形 14 "代表表記:買う/かう ドメイン:家庭・暮らし;ビジネス 反義:動詞:売る/うる"
飲んだ のんだ 飲む 動詞 2 * 0 子音動詞マ行 9 タ形 10 "代表表記:飲む/のむ ドメイン:料理・食事"
。 。 。 特殊 1 句点 1 * 0 * 0 NIL
EOS
```

#関連記事
* [Ubuntu 18.04 LTSにKNP, JUMAN, CRF++をインストールする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/248a9260301435d42d5a)
* [Ubuntu 18.04 LTSにKyteaをインストールする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/f5c4118bff616d94c230)
* [JUMAN++をPythonから使う - Qiita](http://qiita.com/riverwell/items/7a85ebf95647eaf18a6c)

#参考文献
* [新形態素解析器JUMAN++を触ってみたけど思ったより高精度でMeCabから乗り換えようかと思った話 - Qiita](http://qiita.com/riverwell/items/438e88427363511e9f28)
* [google-perftoolsでC++プログラムのプロファイリング - ぬうぱんの備忘録](http://nu-pan.hatenablog.com/entry/20140410/1397099300)
#1 railsのよく使うコマンド

rails初学者の備忘録です。


#rails server
railsのサーバーと接続。短縮形は、"rails s"

#rails new [dir]
新しいrailsのプロジェクトを作成。短縮形は"rails new"

"rails \_4.2.2\_ new [dir]"のようにすることでrailsのバージョン指定もできる。

#rails console
rails上でirbを起動する。作ったアプリの登録者などをrails console上で確認できたりするのでいろいろ便利。
さくらのクラウドでルータ機能を利用してみる(2)

ルータ機能の追加スイッチを追加したのでスイッチの一覧から確認してみます。
今回はベーススイッチという名前で追加してみました。
(IPアドレスはサンドボックス上のダミーです)

![スイッチ一覧.png](https://qiita-image-store.s3.amazonaws.com/0/140995/d69cbba5-76dd-7a65-30cd-4c8bedf75c67.png)

「接続数」にはサーバとアプライアンスの接続数が別々に表示されます。
例えばサーバが3台でロードバランサとVPCルータが接続されていたら「3+2」といった感じです。
「ブリッジ接続」はブリッジを作成すると表示されます。
「ゲートウェイ」は割り当てられたネットワークで通信する際に指定するデフォルトゲートウェイになります。
「ネットワーク」は割り当てられたIPネットワークを示しています。
「スタティックルート」は付与されたネットワークに加えてネットワークを拡大した場合に表示されます。
(具体的には追加したネットワークからネクストホップへのルートが設定されていると表示される)
「帯域」は現在利用中の帯域設定を示しています。

次にスイッチの中身をみてみます。

##情報
コントロールパネル上の管理用といった感じです。
編集可能な箇所もほとんどありません。
![ルータ+スイッチ情報.png](https://qiita-image-store.s3.amazonaws.com/0/140995/3397935c-68ae-67d8-9bfc-680858b1ff55.png)

##サーバ
サーバをスイッチに接続したらここに表示されます。
このスイッチにはサーバが接続されていません。
![ルータ+スイッチサーバ.png](https://qiita-image-store.s3.amazonaws.com/0/140995/0b7a4870-326b-4d08-823c-51f69b19b95f.png)

##アプライアンスタブ
VPCルータやロードバランサを接続するとここに表示されます。
![ルータ+スイッチアプライアンス.png](https://qiita-image-store.s3.amazonaws.com/0/140995/ceec15c9-7c5d-e776-d899-1b2d221025bb.png)

##トポロジ
マップと似ていますが、選択中のスイッチを中心とした接続状況が表示されます。
機能とは関係ないですがドラッグするとコミカルな動きをします。
また、表示されているアイコンをダブルクリックするとそのアイコンが示すアプライアンスなどのページにリンクします。
![ルータ+スイッチトポロジ.png](https://qiita-image-store.s3.amazonaws.com/0/140995/084117f2-d1cc-1610-56b8-9c9144c1ce69.png)

##ルータ
ここでは利用中の帯域と割り当て済のネットワークが表示されます。
この例では標準の16IP分となっていますが、追加のIPアドレスを利用している場合はその分も表示されます。
また、帯域変更もこの画面から行えます。
![ルータ+スイッチルータ.png](https://qiita-image-store.s3.amazonaws.com/0/140995/86353379-a5b2-2c79-818e-14b3d7c30836.png)

##ルータの帯域変更
ルータタブで帯域変更ボタンを押すとこのような画面になります。
選択肢に変更可能な帯域がリストされるので選択して帯域変更ボタンを押すと変更完了です。
(すぐに切換が完了しますが、通信断がないかは保証されないはずなのでタイミングは見計らいましょう)
![ルータ+スイッチルータ帯域変更.png](https://qiita-image-store.s3.amazonaws.com/0/140995/8c50c5e0-5fde-d3c7-160c-e7d83dc71e5b.png)

##アクティビティ
利用状況が表示されます。
ルータ機能を利用していると通信量の把握が困難なのでこまめに確認したいところです。
![ルータ+スイッチアクティビティ.png](https://qiita-image-store.s3.amazonaws.com/0/140995/1db8004d-22b5-bddc-8553-1b0029801ae7.png)

##IPアドレス
ここでは各IPの逆引き設定とIPアドレスを追加出来ます。
IPの逆引き設定は正引きが同じく設定されていることが前提となります。
スタティックルート追加ボタンでIPアドレスを追加取得出来ます。
(その過程でスタティックルートが追加されます)
追加出来る単位はルータ作成時と同じで、追加した単位分のコストが発生します。
![ルータ+スイッチIPアドレス.png](https://qiita-image-store.s3.amazonaws.com/0/140995/9f28e566-cf66-7ec9-a4e8-e9d30f356f66.png)

次はサーバとアプライアンスを接続してみます。
指定した複数の拡張子のファイルを再帰的にすべて検索

jpgとかpngとか一発で検索したいっていうやつです。
なんかネットで検索してもビシっと１行でやるのがなかったので。
でも再帰だとやっぱりビシッと１行でできなかった...
python2.7です。


#再帰じゃない
```py
import glob
from compiler.ast import flatten

search_dir = "path/to/"
ext_list = ["jpg", "png"]

file_list = flatten([f for f in [glob.glob(search_dir + "*." + ext) for ext in ext_list]])

```
もうひとつ。
若干こっちの方が速かった。

```py
import os
import glob
from itertools import chain

search_dir = "path/to/"
ext_list = ["jpg", "png"]

file_list = list(chain.from_iterable([glob.glob(os.path.join(search_dir, "*." + ext)) for ext in ext_list]))
```

#再帰

・数が少ないならこれで

```py
import os

search_dir = "path/to/"
ext_list = ["jpg", "png"]

file_list = []
for root, dirs, files in os.walk(search_dir):
    for ext in ext_list:
        file_list.extend([os.path.join(root, file) for file in files if ext in file])
```

・ファイル数が多いとリストだと大変なので

```py
import os

#yieldで再帰的にファイルを取得する関数を用意
def get_file_recursive(search_dir, ext_list):
    for root, dirs, files in os.walk(search_dir):
        for ext in ext_list:
            for file in [file for file in files if ext in file]:
                yield os.path.join(root, file)

search_dir = "path/to/"
ext_list = ["jpg", "png"]

file_list = get_file_recursive(search_dir, ext_list)
```
パネルのヘッダー部クリックによる開閉(Table表示対応済み)


```javascript
$(function(){
  $(".panel-body").parent().find(".panel-body, .table").hide(); //最初は非表示

  $(".panel-heading").on("click", function() {
    $(this).parent().find(".panel-body, .table").slideToggle();
  });
});
```

一旦パネル系はbody部を非表示。
heading部をクリックした場合は、panel内(parent())にあるbody部を(find())全て非表示。

```html
<div class="panel panel-default">
  <div class="panel-heading"><strong class="panel-title">タイトル</strong></div>
  <div class="panel-body">
    <p>従来panel-body部</p>
  </div>
  <table class="table table-bordered table-hover table-condensed ">
    <tr class=""><td>項目１</td><td>内容</td></tr>
    <tr class=""><td>項目２</td><td>内容</td></tr>
    <tr class=""><td>項目３</td><td>内容</td></tr>
  </table>
</div>
```
![パッケージシステムのドキュメント.png](https://qiita-image-store.s3.amazonaws.com/0/51918/7ee3440c-e78e-14ca-7ed7-ffdd4afadc92.png "パッケージシステムのドキュメント.png")
<hr>

![パッケージシステムのドキュメント_2.png](https://qiita-image-store.s3.amazonaws.com/0/51918/b7cabf57-c3e7-8439-a60b-e8f87b95117a.png "パッケージシステムのドキュメント_2.png")
[Linux][locate] locateでバイナリ名が完全一致するものを検索

locateコマンド単体でデフォルトのフルパスでの部分一致ではなく、バイナリ名が完全一致するものを出したい場合の方法メモ

```console:例：makeのバイナリの存在パスを検索
$ sudo updatedb
$ locate -b -r "^make$"
```

`-b` : basenameの結果を検索対象にする
`-r` : 正規表現で検索

# 参考
[locate(1): find files by name - Linux man page](https://linux.die.net/man/1/locate)
floatとclearbothとclearfixのあぶない関係：bootstrapのときもさわりだけ説明

#CSSの基本
基本的にCSSは簡単です。
右に寄せて左によせて、おいてほいほい！


#基本的によく使うCSS


- text-align:　文字を中央にします
    - center
    - left
    - right
- color:
    - #000000
    - rgb(0,0,0)
- font-size:
    - px em rm
- width:　幅を決めます
    - px em rm
    - 0%～100%
- height:　高さを決めます
    - px em rm
    - 0%～100%
- position:　要素の関係性を決めます
    - relative　
    - absolute　
    - fixed　
- background-color
    - #000000
    - rgb(0,0,0)
- background-image
    - url('http://aiuoe/ofaifa.png')
- margin:　要素の外側の空白範囲を決めます
    - 10px 10px 10px 10px;
- padding:　要素の内側の空白範囲を決めます
    - 10px 10px 10px 10px;
- display:　ブロック要素かインライン要素か、はたまた消える要素か決めます
    - block
    - inline-block
    - inline
    - none
- z-index: レイヤーを決めます
    - 1~
- float:　ブロック要素の右寄せ左寄せを決めます
    - left
    - right
- clear:　要素の右寄せ左寄せの終わりに記載します
    - both

#floatとclear:bothの関係

Ａ
Ｂ
のコンテンツを横に並べたい！そんなときに、float:leftすると横に並びます。
が、基本的にfloatすると、Ｃの要素でclear:bothを行い、floatの終了をお知らせしなければなりません。

Ａ　Ｂ　Ｃ

`<img src="gutetama.png" style="float:left;"><p style="float:left;">こんにちは</p><div style="clear:both;"></div>`


--
<div class="clearfix"><img src="http://karakuri.link/wp-content/uploads/2015/11/04.jpg" class="pull-left" width="50"><p class="pull-left">こんにちは</p></div>

--

上の場合、画像の横に文章が入ります。

しかし、この場合、
Ｃの要素の内部には、なにも書かれておらず、余計な`<div>`です。
これを解消するために開発されたのが、親要素でラッピングして、そいつにclear:bothをやってもらおうという考え方の
clearfixです。


#floatとclearfixの関係

Ａ
Ｂ
Ｃの要素でclear:bothを行うのではなく、親要素に:afterで擬似要素を生成し、そこでclear:bothを適用させ、clear:bothしか書かれていない空白のdivをなくすのが主流です。

Ｃ　
　Ａ　Ｂ　

`<div class="clearfix">< src="dfafaoi.png" style="float:left"><p style="float:left">こんにちは</p></div>`

上の場合、画像の横に文章が入ります。

clearfixのCSSは下記です。

`.clearfix:after{
　　content:" ";
　　display:block;
　　clear:both;
}`

同じように表示されます。

--
<div class="clearfix"><img src="http://karakuri.link/wp-content/uploads/2015/11/04.jpg" class="pull-left" width="50"><p class="pull-left">こんにちは</p></div>

--


#bootstrapの場合

bootstrapのCSSでは、
float:leftは、.pull-left
float:rightは、.pull-right
clear:bothは、.clearfixで設定されています。


`<article class="clearfix">
　　<div class="pull-left">問題タイトル</div>
　　<div class="pull-right">2016-10-19</div>
</article>`

これで下記のような形になります。


><article class="clearfix">
><div class="pull-left">問題タイトル</div><div class="pull-right">2016-10-19</div>
></article>
>

ちなみに、.row にはclearfixが自動的に適応されます。
.rowで囲っていない要素に、.col-~~を設定して、結果高さがうまく認識されていないことがあります。
そんなときは、親要素に.clearfixをかけてあげましょう。


#boostrapで参考になるサイト
http://bootstrap3.cyberlab.info/
http://techacademy.jp/magazine/6270

#positionの違いについて

    - relative　親要素からの距離を測ります
    - absolute　全体の要素からの距離を測ります
    - fixed　その位置で固定になります
http://web8bungi.sakura.ne.jp/first/css/positon.html

###ちょいと小技
ずっと、下にボタンをおいておきたい！
そんなときは何でしょう？

`<section style="position:fixed;bottom:0;width:100%;background-color:white;"><button>ボタンだよ</button></section>`
locateコマンドが使えないとき

# コマンドを実施

`locate`コマンドを使うと、下記のようなエラーがでた。

```
locate: stat () `'/var/lib/mlocate/mlocate.db' できません: そのようなファイルやディレクトリはありません
```

実際`mlocate.db`が存在しない。
なので、下記コマンドを打つ。(rootユーザーで)

```
updatedb
```

→できるようになる。

※CentOS7で発生。
JQuery備忘録:ありがちなtableとチェックボックスのやつ


table関係のJQueryライブラリだとかプラグインとかあるけれども、
どうもデザインが引っ張られてアレになってしまうので、ちょっと書いてみた。

```HTML:index.html
<html>
<body>
	<table>
		<thead id="hoge-head">
			<tr>
				<th><input type="checkbox"></th>
				<th>No</th>
				<th>商品</th>
				<th>単価</th>
				<th>在庫</th>
			</tr>
		</thead>
		<tbody id="hoge-body">
			<tr>
				<td><input type="checkbox"></td>
				<td>1</td>
				<td>りんご</td>
				<td>80</td>
				<td>120</td>
			</tr>
			<tr>
				<td><input type="checkbox"></td>
				<td>2</td>
				<td>みかん</td>
				<td>45</td>
				<td>88</td>
			</tr>
			<tr>
				<td><input type="checkbox"></td>
				<td>3</td>
				<td>いちじく</td>
				<td>105</td>
				<td>311</td>
			</tr>
			<tr>
				<td><input type="checkbox"></td>
				<td>4</td>
				<td>ぶどう</td>
				<td>72</td>
				<td>112</td>
			</tr>
		</tbody>
	</table>
</body>
</html>
```

書いたことないので間違っている可能性大なメモ

## theadにあるチェックボックスで全選択＆解除がしたい

```javascript:script.js
(function($) {
	$.fn.checkboxSelectAll = function() {
		$(document).on('click', this.selector + ' th input[type="checkbox"]', function(event) {
			var table = $(event.target).parents('table');
			$('td input[type="checkbox"]', table).attr('checked', event.target.checked);
		});
	};
})( jQuery );
```

$('#hoge-head').checkboxSelectAll();

と書いておけばイケる。

## tbodyにあるチェックしてる行が知りたい

```javascript:script.js
(function($) {
	$.fn.checkboxSelection = function() {
		result = new Array();
		$(this.selector + ' tr').each(function (index, row) {
	        if ($(row).find('input:checkbox').is(':checked')){
	        	result.push(index);
			}
	    });
		return result;
	};
})( jQuery );
```

$('#hoge-body').checkboxSelection()

で選択行番号(0〜)が配列で帰ってくる
Format and Mount Disk for VPS

第一步，确认硬件挂上去了

    fdisk -l

应该要出来一个类似 `/dev/vdb` 这样的空硬件

第二步，对数据盘进行分区

    fdisk /dev/vdb

根据提示，依次输入 `n`，`p`，`1`，两次回车，`wq`，分区就开始了。

第三步，确认分区出现

    fdisk -l 

应该要出来一个类似 `/dev/vdb1` 这样的分区

第四步，格式化分区

    mkfs.ext4 /dev/vdb1

格式化所需时间取决于数据盘大小。
<del>您也可自主决定选用其他文件格式，如 ext4 等。</del>
在某些ECS系统中，会存在ext2、ext3等古老的文件系统格式不受支持无法mount的情况，经和阿里云技术支持人员沟通，系阿里云文档太古老，直接使用ext4格式比较好。

第五步，写入新分区信息

    echo /dev/vdb1 /mntA ext4 defaults 0 0 >> /etc/fstab

> Ubuntu 12.04 不支持 barrier，所以对该系统正确的命令是这样

第六步，查看分区表

    cat /etc/fstab

第七步，挂载分区

    mkdir -p /mntA

    mount /dev/vdb1 /mntA

第八步，查看分区

    df -h
遅延初期化にbegin式を利用して複数行の評価値を代入する

```rb
def hoge
  @hoge ||= "一つの式"
end
```

インスタンス変数の遅延初期化に良く利用される書き方だが、代入したいものが一つの式で書けない場合もある。
複数の式（複数行）の場合は次のようになると思う。

```rb
def hoge
  return @hoge if @hoge

  foo = hogehoge
  @hoge = foo * fugafuga
end
```

begin式を利用すれば次のように書ける。

```rb
def hoge
  @hoge ||= begin
    foo = hogehoge
    foo * fugafuga
  end
end
```
LINE NotifyでLINEにポストするだけの簡単なRubyスクリプト


[LINE Notify](https://notify-bot.line.me/)のページでアクセストークンを発行しておく。

```ruby
require 'net/http'

uri = URI.parse("https://notify-api.line.me/api/notify")
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true

req = Net::HTTP::Post.new(uri.request_uri)
req["Authorization"] = "Bearer #{あなたのアクセストークン}"
req["Content-Type"] = 'application/x-www-form-urlencoded;charset=UTF-8'
req.set_form_data({message: 'テスト'})

res = https.request(req)
```
DBマイグレーションツールまとめメモ

## rails(ActiveRecord)
- http://rubyonrails.org/
- http://railsdoc.com/migration
- Ruby製
- DSL
- フレームワーク型

```ruby:20161019235959_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
    end
  end
end
```

## flyway
- https://flywaydb.org/
- https://github.com/flyway/flyway
- Java製
- SQL

## Phinx
- https://phinx.org
- https://github.com/robmorgan/phinx
- PHP製
- DSL

```php:20161019235959_create_users.php
<?php
use Phinx\Migration\AbstractMigration;

class CreateUsersTable extends AbstractMigration
{
    // Migrate Up
    public function up()
    {
        $table = $this->table('users');
        $table->addColumn('id', 'integer')
              ->addColumn('name', 'string')
              ->create();
    }

    // Migrate Down
    public function down()
    {
        $this->execute('DELETE FROM users');
    }
}
```

## migr8
- https://github.com/kwatch/migr8
- Ruby製
- SQL

## Phpmig
- https://github.com/davedevelopment/phpmig
- PHP製
- SQL

## Yii
- http://www.yiiframework.com/doc/guide/1.1/ja/database.migration
- PHP製
- DSL
- フレームワーク型


## simple-db-migrate
- http://guilhermechapiewski.github.io/simple-db-migrate/
- https://github.com/guilhermechapiewski/simple-db-migrate
- Python製
- SQL

## ridgepole
- https://github.com/winebarrel/ridgepole
- Ruby製
- DSL
- cookpad

## goose
- https://bitbucket.org/liamstask/goose
- Go製
- SQL

## migo
- https://github.com/meta-closure/migo
- Go製
- JSON Schema

## Liquibase
- http://www.liquibase.org/
- Java製
- XML・YAML・JSON・SQL

## MyBatis Migrations
- http://www.mybatis.org/migrations/
- Java製
- SQL
ホスト名を調べるのに hostname は使わないほうがいいよ

## uname をつかう

hostname コマンドは、自ホスト名の変更する時にも使えるから、FQDN を表示しようとして ` hostname f `とかするとまいっちんぐなので、おっちょこちょいのひとは

```
uname -n
```

をつかうといいよ。


## おまけ

ネットワークインタフェイスに割り当てられているIPアドレスを調べたい時の hostname コマンドは割と便利だ。

```hostname -I```


```
-I, --all-ip-addresses
  Display all network addresses of the host. This option enumerates all configured addresses on all network interfaces.
  The loopback interface and IPv6 link-local addresses are omitted. Contrary to option -i, this option does not depend on name resolution. Do not make any assumptions about the order of the output.
```

捗れ〜。
LINE NotifyをGoで送る #golang #linedevday

コマンドラインで色々試しやすいようにシェルスクリプトっぽくしてます

```go:notify.go
//usr/bin/env go run $0 $@ ; exit

package main

import (
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/url"
	"strings"
)

func main() {
	token := flag.String("token", "", "LINE notify token")
	flag.Parse()

	text := flag.Arg(0)

	if *token == "" {
		log.Fatal("not token")
	}

	if text == "" {
		log.Fatal("not text")
	}

	data := url.Values{"message": {text}}
	r, _ := http.NewRequest("POST", "https://notify-api.line.me/api/notify", strings.NewReader(data.Encode()))
	r.Header.Set("Content-Type", "application/x-www-form-urlencoded")
	r.Header.Set("Authorization", "Bearer "+*token)
	resp, err := http.DefaultClient.Do(r)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", body)
}
```


使い方は`notify.go`とか言う名前で保存します。
`$TOKEN`にはLINE Notifyのトークンをセットしておきます。

```bash
chmod +x notify.go
./notify.go -token $TOKEN hogehoge
```

もちろんbuildすることもできます。

```
go build -o notify notify.go
./notify -token $TOKEN hogehoge
```

GoでやるメリットとしてGOOSオプションでwindowsやlinux向けにもビルドできるので便利です。
Swift3でステータスバーエリアの色を変える

Swift3でステータスバーエリアの20pxの背景色を変えたい場合のTipsです。

Xcode7.3、Swift2環境からそのままSwift3にConvertして以下のようなコードにすると実行時にクラッシュします。

```
'NSUnknownKeyException', reason: '[<_SwiftValue 0x60800049a9a0> valueForUndefinedKey:]: 
```
となります。

```swift
    func setStatusBarBackgroundColor(color: UIColor) {
        guard let statusBar = (UIApplication.shared.value(forKey: "statusBarWindow") as AnyObject).value(forKey: "statusBar") as? UIView else {
            return
        }
        statusBar.backgroundColor = color
    }
```

なので以下のように変えてあげると綺麗にXcode7.3などでビルドしたのと同じような状態になります。

```swift
    func setStatusBarBackgroundColor(color: UIColor) {
        guard let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIView else {
            return
        }
        let statusBar = statusBarWindow.subviews[0] as UIView
        statusBar.backgroundColor = color
    }
```
インスタンスにセキュリティグループを追加する

# 目的
インスタンスが属するVPC毎に任意のSGを追加でアタッチする

## 例
~用に作成したSGをサーバに追加したい

# 設定
* インスタンスにアタッチされているSGを調べ、追加したいSGをそれらと一緒に定義する
* インスタンスが属するVPCを調べ、任意のSGを追加する

```bash
#!/bin/bash
#set -x
export NO_PROXY=169.254.169.254
instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
sg_id=$(aws ec2 --region ap-northeast-1 describe-instances --instance-ids $instance_id | jq -r '.Reservations[].Instances[].SecurityGroups[].GroupId')
vpc_id=$(aws ec2 --region ap-northeast-1 describe-instances --instance-ids $instance_id | jq -r '.Reservations[].Instances[].NetworkInterfaces[].VpcId')

case "$vpc_id" in
"vpc-xxxx" ) aws ec2 --region ap-northeast-1 modify-instance-attribute --instance-id $instance_id --groups $sg_id "sg-xxxx" ;;
"vpc-xxxx" ) aws ec2 --region ap-northeast-1 modify-instance-attribute --instance-id $instance_id --groups $sg_id "sg-xxxx" ;;
"vpc-xxxx" ) aws ec2 --region ap-northeast-1 modify-instance-attribute --instance-id $instance_id --groups $sg_id "sg-xxxx" ;;
"vpc-xxxx" ) aws ec2 --region ap-northeast-1 modify-instance-attribute --instance-id $instance_id --groups $sg_id "sg-xxxx" ;;
esac
```

* vpc-idは下記でも取得可能

```bash
# curl -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/xx:xx:xx:xx:xx:xx/vpc-id
```

* EC2インスタンスにプロキシサーバを使用している環境でInstance Meta Data Service (IMDS)を使用するにはNO_PROXY変数を使用しないと、プロキシサーバの情報を取得してしまう。

```bash
# export NO_PROXY=169.254.169.254
```
便利アプリ

## 開発環境の疑似化
https://www.charlesproxy.com/latest-release/download.do

## 画面遷移図の作成
http://qiita.com/hirokidaichi/items/ff54a968bdd7bcc50d42

## markdownでスライドショーを作成する
https://yhatt.github.io/marp/
プログラミング言語Pythonや人工知能技術（機械学習・深層学習）が学べるスクール・サービス (無料・有料）

人工知能プログラミング(Python / 機械学習・DeepLearning)が学べるスクール・サービス (無料・有料）
がどれくらいあるのかを調べてみました。

人工知能に関する書籍のまとめはすでにあったので、
スクールやWebサービスにフォーカスしています。

※今回はプログラミング言語Pythonも学べるサービスも一緒くたにしていますので
その点ご了承ください。

# Pythonキャリアカレッジ [有料] （オフライン/スクール）
http://www.vantan-game.com/python/

- Python基本講座
- Python機械学習講座
- Python Webアプリケーション講座

この3つが用意されているようです。
1日6時間が3回分あり、有名な方が講師として教えてくれるといったところが良さそうですね。

# Coursera （オンライン/動画）
https://www.coursera.org/courses?query=deep learning
以下の
https://www.coursera.org/learn/machine-learning
は有名です。

# Udemy Python データサイエンス [有料]　（オンライン/動画）
https://www.udemy.com/python-jp/

# Udemy 機械学習 （オンライン）
https://www.udemy.com/python-scikit-learn/

# Lynda Python [有料] （オンライン/動画）
https://www.lynda.jp/python

# AI Academy [有料] （オンライン/マンツーマン）
http://aiacademy.jp

- Python
- AI Programming

この2つのコースが用意されているようです。
現在はPythonが学べるコースが公開されているようです。
AI Programmingは今年（2017年）の2月公開予定のようです。
オンラインマンツーマンでPythonやAIプログラミングを学べるサービスとして注目です。

# ドットインストール ~~[無料]~~ => [有料] （オンライン/動画）
http://dotinstall.com/lessons/basic_python_v2

※ Python ２系
※ Python以外で有料でしか見れないものもあります。
追記: 2系・3系も有料（プレミアム会員限定）に変更されていました。
有料ですが、Pythonの2系・3系が動画で学べます。

# CTC教育サービス [有料] (オフライン/セミナー）
http://www.school.ctc-g.co.jp/python/index.html

- Python 入門 1 （オンライン/動画）
http://www.school.ctc-g.co.jp/course/AD051.html

- Python 入門 2 （オンライン/動画）
http://www.school.ctc-g.co.jp/course/AD052.html

# プロゲート Python （オンライン)
https://prog-8.com/languages/python
ほぼほぼ無料で環境構築いらずで、ブラウザで学べるプログラミングサービス。
ほぼ無料でPythonの基本が学べるようです。

# DEEPstation 深層学習ハンズオンセミナー [有料] （オフライン/セミナー）
http://deepstation.jp/seminar/

# 秋葉原プログラミング教室 ＜AIプログラミングコース＞ 
https://www.akiba-programming-school.com
こどもから社会人まで手軽に学べるAIプログラミング教室です。
社会人が学べるサービスがある中、こどもがAIプログラミングを学べる唯一のサービスです。
JsonFramingでオブジェクトの配列なJSONのオブジェクトを一つ一つに区切る


AkkaStreamにはJsonオブジェクトの配列をパースするときにオブジェクトごとに区切ってくれる機能がある。これがJsonFramingである。

たとえば、以下のようなJSON文字列があったとする

```
[
  {"hoge": 1},
  {"mogu": 2},
  {"goro": 3}
]
```

３要素のある配列なので、３つの要素に分解して、ストリームが流れてくる。

* `{"hoge": 1}`
* `{"mogu": 2}`
* `{"goro": 3}`


配列を全部呼んでからパースするのではなく、配列内のオブジェクトを一つ一つパースできるので効率的に使える。

# 使ってみる

```
implicit val system = ActorSystem()
implicit val materializer = ActorMaterializer()
import scala.concurrent.ExecutionContext.Implicits.global

val jsonFraming: Flow[ByteString, ByteString, NotUsed] = JsonFraming.objectScanner(1000)  // 今回試す JsonFraming 引数の1000はオブジェクトの最大長
Source.single(ByteString("[{\"hoge\": 1}, {\"goro\": 2}, {\"mogu\": 3}"))
  .via(jsonFraming)
  .runForeach(n => println(n.decodeString("UTF-8")))
  .foreach(_ => system.terminate())
```

`JsonFraming.objectScanner(1000)`でオブジェクトの最大長が1000のFlowが作成できる。オブジェクトの長さが1000超えるものがあると停止してしまう。

出力

```
{"hoge": 1}
{"mogu": 2}
{"goro": 3}
```

# 参考

* https://github.com/akka/akka/blob/master/akka-stream/src/main/scala/akka/stream/scaladsl/JsonFraming.scala
windowTranslucentStatusとadjustResizeを同居させるとKitKat以降でトラブる話

## 直面した問題
Themeにandroid:windowTranslucentStatus=trueを指定してActivityをフルスクリーンにした。
ソフトウェアキーボードが表示されたときはActivityの下側がキーボードに隠れてしまわないようにandroid:windowSoftInputMode="adjustResize"を指定し、Activityがリサイズされるようにしたかった。
でもadjustResizeの指定では思ったようにリサイズされなかった。

## 行き着いた情報
- [Issue 63777:	Keyboard don't resize the screen when android:windowTranslucentStatus=true](https://code.google.com/p/android/issues/detail?id=63777)
- [windowSoftInputMode=“adjustResize” not working with translucent action/navbar](http://stackoverflow.com/a/28434211/4052730)

## わかったこと
KITKAT以降で導入されたandroid:windowTranslucentStatus=trueを使う場合はActivityはステータスバーやソフトウェアキーボードに関係なく画面いっぱいに広がる。
ステータスバーやソフトウェアキーボードの高さはWindowInsetsを経由して取得できるので、必要ならそれを使ってViewの表示領域を自分で調整すると巧く行く。

```java
ViewCompat.setOnApplyWindowInsetsListener(rootView, new OnApplyWindowInsetsListener() {
    Rect originalPadding;
    @Override
    public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
        if (originalPadding == null) {
            originalPadding = new Rect(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), v.getPaddingBottom());
        }
        int t = insets.getSystemWindowInsetTop();
        int b = insets.getSystemWindowInsetBottom();
        v.setPadding(originalPadding.left, originalPadding.top + t, originalPadding.right, originalPadding.bottom + b);
        return insets;
    }
});
```

## 悲しかったこと
この問題はwindowTranslucentStatusにまつわる設計変更か、パラダイムの変更があったんだろうと思った。
それは別に良いんだけど [Issue 63777:	Keyboard don't resize the screen when android:windowTranslucentStatus=true](https://code.google.com/p/android/issues/detail?id=63777) でコメント無くObsoleteになったから皆どうしたら良いかわからず迷走してるとコメント見て感じた。
daemon

http://www.microhowto.info/howto/cause_a_process_to_become_a_daemon.html

https://github.com/rack/rack/blob/rack-1.4/lib/rack/server.rb#L307-L316

https://github.com/thuehlinger/daemons/blob/master/lib/daemons/daemonize.rb#L92-L118

http://world.std.com/~swmcd/steven/tech/daemon.html

http://stackoverflow.com/questions/18498864/daemon-can-still-print-to-stdout

https://andrejserafim.wordpress.com/2007/12/16/multiple-threads-and-processes-in-ruby/

http://www.jstorimer.com/blogs/workingwithcode/7766093-daemon-processes-in-ruby

http://codingfreak.blogspot.com/2012/03/daemon-izing-process-in-linux.html

http://blog.honeybadger.io/unix-daemons-in-ruby/
R:統計的な差を表す線を描く

統計とかでよくあるアレを書く関数

> 棒グラフの棒の番号で指定する
> http://qiita.com/mm_sys/items/67c3f6bc5de09fa938ab

```R
line.p <- function(arg_x1,arg_y1,arg_x2,arg_y2,arg_text=""){
  max_y <- max(arg_y1,arg_y2) #線の高さ
  y_space <- arg_y1 * 0.08    #データと線の隙間
  y_length <- arg_y1 * 0.07   #線の高さ
  segments(x0=arg_x1,y0=arg_y1+y_space,x1=arg_x1,y1=max_y+y_space+y_length)
  segments(x0=arg_x1,y0=max_y+y_space+y_length,x1=arg_x2,y1=max_y+y_space+y_length)
  segments(x0=arg_x2,y0=max_y+y_space+y_length,x1=arg_x2,y1=arg_y2 + y_space)
  #線の上に文字列を書き込む
  text(arg_x1 + (arg_x2 - arg_x1)/2,max_y + y_length + (y_space*2),arg_text)
}

#
#Example
#
a <- 4
b <- 6
jpeg(file="test.jpeg", quality=75,width = 300, height = 300) 
barplot(c(a,b)
        ,las=1
        ,main="Example",
        beside = TRUE
        ,ylim = c(0,9)
)
line.p(0.7,a,1.9,b,"**")
dev.off()

```

![test.jpeg](https://qiita-image-store.s3.amazonaws.com/0/76058/d93ea47e-472d-33a6-b2b1-e589a8b85a28.jpeg)
c > link > Damerau–Levenshtein distance (Edit Distance with Transposition) c implementation

http://qiita.com/mpyw/items/a4495d476ea9ffe54e16
にてpython実装されている Damerau–Levenshtein アルゴリズム。

```
from weighted_levenshtein import dam_lev
```
にて読込んでいるdam_lev()。

それに対応するC実装は以下のものが使えそうだろうか。
http://stackoverflow.com/questions/10727174/damerau-levenshtein-distance-edit-distance-with-transposition-c-implementation

> answered May 24 '12 at 16:35
Dmitri Chubarov

の
`int dldist2(char *s, char* t, int n, int m) {`

元記事のpython実装のdam_lev()のコール文と比べて引数の数が異なる。

上記のコードを試した。
http://ideone.com/HFEmDT

- M=16, N=16なら動く
- M=32, N=32以上はRuntime error
   - ideoneのメモリ制約か、実行時間制約か?
- insert_costs, delete_costs, substitute_costs, transpose_costsの適用方法は不明

とりあえずここで保留とする。

## Runtime errorの理由

```
cost = ((s[i-1]==t[j-1])?0:1);
```
にてエラーが出る。

s,tというのは以下での文字列"BANANA", "HANANA"のポインタである。iやjが(32-1)になるとs[i-1]などは文字列として定義していない部分を参照している。

```
dist = dldist2("BANANA", "HANANA", 32, 32); 
```

こういう場合、msize, nsizeにどういう値を入れるべきか、ということを理解していない。

substitute_costs などのサイズ128x128とは別のサイズを使うのかもしれない。

https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance
のDistance with adjacent transpositionsのPseudo codeを見ると、以下のようだ。

- nsize: 上記の例で"BANANA"のサイズ
- msize: 上記の例で"HANANA"のサイズ

## 各種costの処理追加方針

https://github.com/infoscout/weighted-levenshtein/blob/master/weighted_levenshtein/clev.pyx
に記載のc_damerau_levenshtein()をまねる。

- DTYPE_t[::1] insert_costs,
- DTYPE_t[::1] delete_costs,
- DTYPE_t[:,::1] substitute_costs,
- DTYPE_t[:,::1] transpose_costs) nogil:
zipやtar.gzの中身に対してgrepする

ログやらバックアップファイルって、どんどん貯まるので圧縮して保管したいですよね。
でも、中身を調べるときにいちいち解凍するのは面倒です。
そんなときは、解凍コマンドとgrepをパイプで繋ぐと便利です。
※zip形式の場合、zgrepを使ったほうが簡単で便利です。（余計な出力もありません）


zipの場合

    zgrep keyword log.zip #おすすめ
    unzip -c log.zip | grep keyword #汎用的な方法

tar.gzの場合

    tar -O -xvf log.tar.gz | grep keyword
SSH Config で * を使用するときは順番に気をつけたほうがいい

SSH Config を記述するときに `*` を使うと冗長な記述をまとめることが出来て便利だが、記述する順番を間違えると意図したとおりに動作しないことがあるので注意が必要。

``` ~/.ssh/config
Host *
  User foo

Host example
  User bar
  HostName example.com
```

この設定は一見「デフォルトのユーザー名が `foo` で、ホストが example のときは `bar` というユーザーでログインする」という設定に見えるが、この設定で `ssh example` すると `ssh foo@example.com` と同じになる。

SSH Config では **先にマッチしたほうが優先される** ので、意図したとおりに動作させるには以下のように設定する。

``` ~/.ssh/config
Host example
  User bar
  HostName example.com

Host *
  User foo
```
WordPressの固定ページを管理画面のエディタで作るかテンプレートファイルで作るか問題について「サイト内検索」の観点から考える

WordPressでコーポレートサイトなどを作成していると、固定ページをどうやってつくるか？と悩むことが結構あります。WordPressでの固定ページの作り方は大きくわけて２つ。
テンプレートファイルで作成する方法と、管理画面の固定ページのエディタで作成する方法です。

##テンプレートファイルで作成する方法
テーマディレクトリ内にpage-●●.phpというファイル（●●は、スラッグとかID）を作って、そこにHTMLやPHPを直接書いて固定ページとする方法です。
###メリット
複雑なレイアウトでも作りやすい。エディタなどでテンプレートファイルを編集してアップロードしたり、開発環境によってはウェブサーバのテンプレートファイルを直接編集できたりするので、普段からコーディング作業に慣れている人にはとても作業しやすい。
###デメリット
メンテナンスが面倒。
例えば、固定ページを一つ作るのに、まずは管理画面から固定ページを新規作成し空のまま保存して、次にテンプレートファイルをpage-●●.php（●●はIDやスラッグ）という名前で作成して、そこにHTMLとかPHPを書いていく。
というように、一つのページを作るのに管理画面とテンプレートファイルと両方の作業が必要となり、あまりスマートな方法では無い気がします。
あとからページのスラッグを変えたい場合などは、管理画面とテンプレートファイルと２箇所修正しなければならないこともあり、ちょっと面倒です。
他には、下で書きますが、テンプレートファイルに書いた本文はWordPressのサイト内検索の対象にならない。という事もあげられます。

##固定ページのエディタで作成する方法
こちらは、管理画面から固定ページを新規作成し、そのままエディタにHTMLを書いていく方法です。

###メリット
こちらの方法の一番のメリットは、「サイト内検索の対象となる」ということだと思います。
WordPressにはデフォルトで検索機能が実装されており、WordPress構築されているサイトであれば、意識して止めていない限り、「サイトのURL/?s=キーワード」という形式のURLにアクセスすれば、サイト内の検索結果が表示されます。
例）：　　https://ja.wordpress.org/?s=ワードプレス
これは、サイト内に検索ボックスがあるなしに関わらず動作してしまいます。
この検索の対処となるのが、ページのタイトルとエディタで入力した内容になります。テンプレートファイルに書いた内容は検索対象になりません。

###デメリット
固定ページというよりは、WordPressのエディタでHTMLを書くときのデメリットなのですが、複雑なHTMLを書いたりするのには適しません。（本来そういうためのものじゃない）
管理画面でコーディングしますから、通常のテキストエディタや開発環境とちがって、HTMLタグの補完機能や、当然Emmetとかも使えません。また、WordPressにはHTMLを勝手に整形してくれる、（この局面に限って言えば）おせっかいな機能がありますから、それらを意識しないでいると、せっかく書いたHTMLがビジュアルエディタに切り替えた途端に全部崩れる。なんてこともよく起こります。
また、PHPが書けないってのも、この局面に限って言えばデメリットでしょうか。

##結局どちらがいいのか？
まあ、局面によって選択していくのでしょうが、私は以下のように考えます。

**サイト内検索にかかってほしいページはエディタで、それ以外はテンプレートファイルで作成**

例えばこんな感じのページを作るとする。
<img width="800" alt="sitemap@2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/73833/1bdacf09-e6ea-987f-7bcf-54b98c9e6da5.png">


こういうときに、子ページの目次となる「会社概要TOP」は、テンプレートファイルで作成（WP_Queryやwp_list_pagesなどを使って子ページのリストを生成するなど）し、子ページの「会社概要」は固定ページのエディタから作成する。（テーブルタグやdlタグなどを使う？）

例えば、目次ページに掲載される内容は基本的に下層ページのタイトルや抜粋だけなので、検索結果には不要。下層ページの内容だけが検索に表示される方が、訪問者にとって有益だと考える。

例えば、上記の場合、訪問者が「資本金」について知りたい。というときに、「サイトURL/?s=資本金」にアクセスしたとする。
そうすると、検索結果に表示されるのは、会社概要のページのみとなる。

（そんなマニアックなアクセスの仕方しないと思うけど・・・、あとから「やっぱりサイト内検索を追加してっ！」　とかはよくあるのでは？）

というわけで、サイト内検索という観点から考えたWordPressの固定ページ作成方法の選択メモでした。

##エディタでつくるときに気をつけること。
最後に。
WordPressの固定ページ編集画面のエディタでHTMLをコーディングするときに気をつけること。
- 属性を指定しないspanタグは消される。（`<span class="aaa">`とかなら消されない）
- 一昔前のいわゆる「インライン要素」のタグを書いているときに改行すると`<br>`を入れられてしまう。
- 一昔前のいわゆる「ブロック要素」に囲まれていない文章はpタグで囲われる

WordPressエディタのテキストモードで

```html
<span>てきすと</span>
<img src="image/img.jp">
こんにちは
```
みたいにHTML書いて、ビジュアルモードに切り替えて、そのままテキストモードに戻すだけでも、

```html
てきすと
<img src="image/img.jp" />
こんにちは
```
と、変わってしまう上に、実際に表示画面側では

```html
<p>てきすと<br />
<img src="image/img.jp" /><br />
こんにちは</p>
```
と出力されてしまい、思ってたのと全然違う表示になったりする。

もちろん、こういうのを抑制してくれるプラグインとかtipsもあるけど、ホントは固定ページのエディタでは、なるべくレイアウトに凝らないで、エディタには本文とそれをマークアップする内容だけできるようなテンプレートの作り方がホントはベストだと思う。


あぁ、、、、思ってること半分も書けねぇ。自分の文章力の無さが恨めしい今日このごろ。
【VMware@SoftLayer】Site Recovery Manager 導入時の注意点

#内容
VMwareの災害対策ソリューションであるSite Recovery Manager 導入する際の注意点について書いておきます。（2016/10/19付の調査である）

#全体像
![SRM_version_compatibility_11.png](https://qiita-image-store.s3.amazonaws.com/0/101361/986578d8-fe56-5198-9786-b839e5cf00bb.png)
オンプレミスとSoftLayerのクラウドの間でのDRを想定します。
両サイトにvCenterが存在しており、そこに無料の仮想アプライアンス(vApp)であるvSphere Replicationがそれぞれのサイトで導入済みです。
さらにRTO短縮のため、災対自動化ソリューションであるSRMを導入することを想定します。

構築や操作についてはこちらを参照ください。

- <a href="http://qiita.com/khayama/items/8dc85f96c661d1c1f718" >【VMware@SoftLayer】vSphere Replication編</a>
- <a href="http://qiita.com/ytada/items/dc31b4594694ba01d1f5" >【VMware@SoftLayer】Site Recovery Managerで災害対策編</a>

#バージョンに関する注意点
実際にこのような案件の検討を始める場合、
以下に基づいて、**両サイトのバージョンを揃える必要があります。**

>[保護サイトおよびリカバリサイトでの異種構成](https://pubs.vmware.com/srm-60/index.jsp?topic=%2Fcom.vmware.srm.install_config.doc%2FGUID-EC7C7600-E91D-4532-A794-7E5489EBDC4C.html)

>| コンポーネント | 異種または同一種のインストール |
|:-:|:-:|
| Site Recovery Manager | **両方のサイトで同じバージョンにする必要があります。** |
| vCenter Server と Platform Services Controller | **両方のサイトで同じバージョンにする必要があります。**Site Recovery Manager のバージョンは、vCenter Server および Platform Services Controller のバージョンと互換性がある必要があります。 |
| vSphere Replication | **両方のサイトで同じバージョンにする必要があります。**vSphere Replication のバージョンは、Site Recovery Manager と vCenter Server のバージョンと互換性がある必要があります。 |

その詳細について、こちらのサイトを使って、5.5系と6.0系について、みていきましょう。
<a href="http://www.vmware.com/resources/compatibility/sim/interop_matrix.php" >VMware Product Interoperability Matrixes</a>

#Site Recovery Manager と vSphere Replication の互換性
みてわかる通り、**基本的には同じバージョンで揃えなければサポートされません**。
（※バージョン違いでも動作する可能性はもちろんありますが、VMwareによる検証・サポートはされていません。）
導入・構築時に揃える必要がある一方で、アップデートをする場合も注意が必要です。
<img width="847" alt="SRM_version_compatibility_05.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/d74b20e8-c02f-e89a-1aa8-d580dc2bfebf.png">


#Site Recovery Manager と vCenter の互換性
こちらは互換性のあるものを選ぶとよいでしょう。

- vCenter 6.0.0 U2 であれば 6.0, 6.1, 6.1.1のいずれか。
- vCenter 5.5 U3 であれば 5.5.1, 5.8.1のいずれか。

といった感じですね。
<img width="845" alt="SRM_version_compatibility_06.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/43a83e7a-0ce9-6ecc-e4a9-45f3fcf8555a.png">

#vCenter と vSphere Replication の互換性
こちらも上記と同様に選ぶとよいでしょう。
<img width="855" alt="SRM_version_compatibility_07.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/41570bf9-cef5-7d87-1710-f942355d37bd.png">

#vCenter と ESXi の互換性
大まかに言えることは、当然ですが、vCenterのバージョンはESXiと同じか上位である必要があります。
だいたい皆さん同じバージョンに揃えていらっしゃるかと思います。
5.5系の場合は、vCenterのバージョンを据え置きでも、ESXiのUpdateに対応していますが
6.0系の場合は、そのようなサポートポリシーはなくなってしまったようです。
<img width="864" alt="SRM_version_compatibility_08.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/2b129051-6180-debf-2673-dfb74845e596.png">


#まとめ
vCenterとESXIについて5.5系、6.0系の最新版を使う、と仮定した場合、このような選択肢になります。

<img width="400" alt="SRM_version_compatibility_10.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/05de93bc-86a6-45d0-2df8-dd522ab809c2.png">

時によっては、バージョンに関する制約がネックになることがあります。
クラウド側に合わせてバージョンアップを実施する、あるいはオンプレミス側に合わせてBYOLでバージョンを揃えるといった対応が必要になるでしょう。
今回はVMwareのソリューションのみで考えていますが、サードパーティのソリューションを使えば、このようなバージョンの制約にも対応できるものがあるので、ぜひご活用ください。
Ansibleで複数のCisco機器に同じコマンドを打つ

多くのCisco機器で同じコマンド(主にshow 系)を実行したくなったので
Ansibleで実行させてみる。

shell でやるときとの大きな違いは
Inventoryをうまく書くと、実行先を柔軟に選択できるというところ。
hostsファイルをたくさん抱えるよりはinventoryファイルのほうが修正するときのことを考えると良いかと。
Inventoryファイルのアクセス権には注意するか、credentialな情報を含めるのをやめましょう。


## 作ったファイル
### playbook
one.yml

```
 - hosts: "{{ host }}"
   gather_facts: no
   connection: local

   tasks:
     - name: one-shot
       register: result
       ios_command:
          provider: "{{ cli }}"
          commands: "{{ command }}"
 
     - debug: var=result.stdout_lines
       when: result|success
 
   vars:
     cli:
       host: "{{ inventory_hostname }}"
       username: "{{ ansible_user }}"
       password: "{{ ansible_password }}"
       authorize: true
       auth_pass: "{{ ansible_net_auth }}"
```

### inventory file
hosts

```
[group1]
host1
host2

[group2]
host3
host4

[all:children]
group1
group2

[all:vars]
ansible_user=login-username
ansible_password=login-password
ansible_net_auth=enable-password
```
### shell
one.sh

```
#!/bin/bash
if [ $# -lt 2 ]; then
    echo "usage $0 hostgroup command [command]..."
    exit 1
fi

host="$1"
shift

cmd="["
for c in "$@"; do
    cmd="${cmd}'${c}',"
done
cmd="${cmd%,}]"

ansible-playbook -i $(cd $(dirname $0) && pwd)/hosts $(cd $(dirname $0) && pwd)/one.yml -e "{\"command\":\"${cmd}\",\"host\":\"${host}\"}"
```

## 使い方
```
./one.sh "host group name" "some command1" "some command2" "some command3" ...
```
もしくは

```
ansible-playbook -i hosts one.yml -e '{"host":"host group name","command":"some command"}'

ansible-playbook -i hosts one.yml -e '{"host":"host group name","command":"['some command','some command2','some command3'...]"}'

```
Hyper-VでCentOSの初期設定

# ネットワークの有効化
```shell-session:/etc/sysconfig/network-scripts/ifchg-eth0
ONBOOT=yes #yesにする
```
```bash
# service network restart
```
# rootでssh接続を許可
```shell-session:/etc/ssh/sshd_conf
PermitRootLogin yes #コメントイン
```
```bash
# service sshd restart
```
さくらのクラウドでルータ機能を利用してみる(1)

さくらのクラウドでは共有セグメントに接続するとグローバルIPアドレスが1つ付与されます。
しかしこのIPアドレスは他のサーバに移すことは出来ません。
サーバを削除したりするとIPが開放されてしまいます。

そこでスイッチに追加出来るルータ機能を使えば、IPv4アドレスが最低16個から付与されるので
必要なサーバやアプライアンスにIPアドレスを付けたり外したり出来る様になります。
(APメンテナンス時などにかなり有効です)

それに共有セグメントは100Mbps共有ですがルータ機能を使うことで増速が可能になります。
また、ロードバランサを利用する際にも必要となります。

まとめると

- メリット
1. 使い回しできるIPv4アドレスが付与される
2. 最低16IP(/28)のネットワークが使える
3. 帯域の増速が可能
4. ロードバランサ利用可能

- デメリット
1. スイッチ、ルータ、IPアドレス分のコストが必要(最低7,776円から)
2. 増速にはそれなりにコストがかかる(デフォルトでは100Mbps共有)

多少コストをかけても大丈夫であれば導入するメリットの方が多いと思われます。

というわけでルータ機能付のスイッチを作成してみます。

##スイッチ+ルーター作成
メニューからスイッチを選択して「＋追加」ボタンをクリックするとこの画面になります。

![スイッチ追加.png](https://qiita-image-store.s3.amazonaws.com/0/140995/994505db-b9eb-6fc7-a238-1af555cbf8a7.png)

ここで名前など(名前だけが必須です)を入力した後、「ルータ」を「はい」に変更すると
プリフィックスや帯域を選択できるようになります。
![ルータ追加.png](https://qiita-image-store.s3.amazonaws.com/0/140995/917a503c-f0d5-19dd-e62a-0218c0b56512.png)

「プリフィックス」は付与されるIPv4アドレスのサブネットマスクを選択します。
最低16IPからですが、実際に利用出来るIPアドレスは
ネットワークアドレス、ブロードキャストアドレス、ゲートウェイ、ルータ自体のIPアドレス、など引かれて11個しか利用出来ません。
VPCルータをルータ経由で利用するとIPを3個消費します。
WEBサーバ、開発サーバ、メールサーバ、DNSサーバなど個別にIPを付与するとすぐに枯渇するので慎重に選択しましょう。
後からスイッチの編集でプリフィックスを拡大することは出来ず、スイッチの再作成になってしまいます。
※追記：ただし、最初に割り当てられたIPをネクストホップにしたネットワークを追加することはできます。
この場合、必然的にIPも変わります。

「帯域幅」はこのルータに割り当てられたグローバルIP経由での通信全体の帯域になります。
このFAQ([転送量に応じたトラフィック制限はありますか?](http://cloud-news.sakura.ad.jp/faq_top/faq/#Q007))を見た感じでいうと
帯域幅の10%前後の転送を常時行う場合は上位の回線に変更を求められることがあるかもしれません。
(総転送量の目安も示されているので扱っているコンテンツが重い場合は要注意です)
ただ、帯域幅はあとから上位や下位に都度変更が可能なのでサービスの拡張に合わせて変更していくのもありだと思います。

「IPv6アドレス」はデフォルトで無効になっています。
あまり普及しているとは言いがたいので無効のままでよいかと思います。
また、これは後から変更出来ます。

次に続きます。
Pythonファイル入出力についてのtips

#ファイル名の取得

##全てのファイル名をpath付きで取得
カレントディレクトリ以下の全てのファイルを取得し、表示。

```py
import os
import glob
rootpath='.'
for root, dirs, files in os.walk(rootpath):
    for file_ in files:
        file_path=os.path.join(root,file_)
        print file_path 
```

##全てのファイル名をpathなし（ファイル名のみ）で取得
カレントディレクトリ以下の全てのファイルを取得し、表示。

```py
import os
import glob
rootpath='.'
for root, dirs, files in os.walk(rootpath):
    for file_ in files:
        file_path=os.path.join(root,file_).split('/')[-1]
        print file_path
```

##拡張子の選択
再帰的にカレントディレクトリ以下の全ての.tabファイルを取得し、表示。

```py
import os
import glob
path='.'
for root, dirs, files in os.walk(path):
    for dir_ in dirs:
        dir_path=os.path.join(root,dir_)
        for table in glob.glob(dir_path+'/*.tab'):
            print table
```

##ファイル名をつける
###0で埋めてけたを揃える

```py
>>> num=1
>>> "{0,04d}".format(num)
'0001'
```

```py
>>> num=1
>>> "{0,4d}".format(num)
'   1'
```

```py
>>> char='1'
>>> char.zfill(4)
'0001'
```

###ファイル名から数字だけを抜き出す

```py
>>> import re
>>> hoge='1257cfnewoaij2203'
>>> suuji=re.findall("(\d+)",hoge)
>>> print suuji
'1257' '2203'
```

#ファイルの読み込み
列ごとに物理量が入っていると仮定。空白によって列が区切られている場合。

##一般的IO
数字列と文字列が混在する場合

```py
for line in open('test.tab', 'r'):
    itemList = line[:-1].split()
    print itemList
```

,で区切られている場合には`split(',')`で、タブで区切られている場合には`split('/t')`。

##Numpyによる読み込み
```py
>>> import numpy as np
>>> data=np.loadtxt('input.txt').T
```

#ファイルの書き込み
##一般的IO
数字列と文字列が混在する場合

```py
f=open('output.txt','w')
f.write(moji+'\n')
f.close()
```

##Numpyによる書き込み
```py
>>> np.savetxt('output.txt',data.T)
```
Unityでスクリプトのクラス名を変更する手順

実装中にクラス名を変えたくなる事がありますが、シーンに配置済みのスクリプトの場合、一歩間違えるとリンク切れが発生して大変な事になります。

1. UnityのProjectウィンドウでソースファイル名を変更します。<bR>
(例)hoge → HogeHoge<br>
 配置しているスクリプトがロード出来ないというエラーが発生します。
2. エディタでソース内の該当クラス名の置換を行い保存します。
3. Unityに復帰します。自動でコンパイルが行われ、1.のエラーが解消されます。

これだけです。
Unity5.3で確認しました。
線を引くのに2時間😩

大変だったので備忘メモ😩

```Swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {

        let shapeLayer = CAShapeLayer()

        let uiPath = UIBezierPath()
        uiPath.moveToPoint(CGPointMake(5, 5))       // ここから
        uiPath.addLineToPoint(CGPointMake(15, 15))  // ここまで線を引く

        shapeLayer.strokeColor = UIColor.blueColor().CGColor  // 微妙に分かりにくい。色は要指定。
        shapeLayer.path = uiPath.CGPath  // なんだこれは

        // 作成したCALayerを画面に追加
        view.layer.addSublayer(shapeLayer)
    }
}
```

ちなみに線をクラスに切り出すとこんな感じ：

```Swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    var myShapeLayer: MyShapeLayer

    override func viewDidLoad() {

        myShapeLayer = MyShapeLayer()
        view.layer.addSublayer(myShapeLayer)
    }

    ...

    shapeLayer.position.x += 10.0  // Core Animationでヌルッと動く。これがやりたかった。

    ...
}
```

```swift:MyShapeLayer.swift
import UIKit

class MyShapeLayer: CAShapeLayer {
    override init() {
        super.init()
        
        let uiPath = UIBezierPath()
        uiPath.moveToPoint(CGPointMake(5, 5))
        uiPath.addLineToPoint(CGPointMake(15, 15))

        strokeColor = UIColor.blueColor().CGColor
        path = uiPath.CGPath
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
```

方法はあと2つあるそうです：

[【iOS】drawRect、CALayer、UIImageViewで描画速度を検証してみた \- Qiita](http://qiita.com/marty-suzuki/items/a28269ee39b6e0ec0830)

# 参考

[【iOS Swift入門 #207】CAShapeLayerで円を描く。くるくるする | Swift,Objective-Cプログラミング ~ iOS ~](http://swift-studying.com/blog/swift/?p=1326)

---
ブログやってます：http://weed.nagoya
小数を文字列で表示する (Java)


## 概要

金額をカンマ区切りで表示するケースはよくあると思います。

しかし、私の担当している案件で原価が小数となる場合で、その金額をカンマ区切りで表示してほしいという要望があったので、やり方をメモっておきます。

## 実装

基本は、[DecimalFormat](https://docs.oracle.com/javase/jp/8/docs/api/java/text/DecimalFormat.html)を使います。

```java
/**
 * 小数を金額表示のためのカンマ区切り文字列に変換する
 * 小数部は第一位までを含める（第二位以下は切捨）
 * @param val 変換したい小数
 */
public static String convertCommaSeparatedString(double val) {
    return new DecimalFormat("#,##0.0").format(val);
}
```

コンストラクタで指定したフォーマット文字列ですが、基本は、

- ```#```: 数字。ゼロだと表示しない
- ```0```: 数字。ゼロでも表示する

となり、```#,##0.0```
は、

- 小数第一位まで表示（第一位が0でも0を表示する）
- 整数の一桁目が0であっても、0を表示する
- 三桁ごとに```,```で区切るようにする

を意味します。

## 応用

先のサンプルでは「第二位以下は切捨」としていましたが、「第二位で四捨五入」して欲しいという要望があったとしましょう。

その場合、DecimalFormatだけで対応するのは無理なので、予め丸め処理をして先の関数を使う必要があります。

```java
/**
 * 小数を第二位で四捨五入した値を返す
 * @param val 変換したい小数
 */
public static double round(double val) {
    BigDecimal bd = new BigDecimal(val);
    return bd.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
}
```

こういう丸め関数を準備し、

```java
double cost = 123.45;
String label = convertCommaSeparatedString(round(cost));
```

こういう使い方をすればいいでしょう。
concrete5のBlock Designerでブロック配置しようとしたらSQLのシンタックスエラーになるとき

# 問題
concrete5にはBlock Designerという簡単にちょっと凝ったブロックが作れるアドオンがあるけど、ブロックを配置しようとしたらエラーが出ることがある。

```
An exception occurred while executing... 
SQLSTATE[42000]: Syntax error or access violation...
```

みたいなやつだ。

# 解決
このエラーはブロックで使ってるパーツのハンドルがSQLのステートメントとかぶってると出る。「description」とかだと内部的には自動で「description_1」として扱われるっぽいけど、時々アドオンの作者が忘れててそのままになってるステートメントがある。（自分の場合はusageだった）

ということで、ハンドルをかぶらないものに差し替えてブロック作り直すと動きました。
ARM > link > 関数コールが遅い

http://www.fujlog.net/2009/01/arm.html

>つまり、
>・関数コールが遅い
>・関数ポインタのコールも遅い
>ということだった。

実装中の組込み環境はARMを使っているわけだが、計算処理の遅さを改善しないといけない。

実装している計算処理では、Extract Methodなどの考えのもと、関数を抽出してそれを階層的にコールしている。上記の「関数コールが遅い」を考慮することになるだろうか。

関数コールの深さを浅くすることでどれくらい処理が速くなるかは要確認である。一方で、ソースの読みにくさが増えてしまうのは技術的負債を増やす方向なので悩みどころである。

50msecの処理を20msecに落とす上で関数コールのオーバヘッドがそれほど影響あるのかは未消化。
[失敗]mrubyでAitendo 99円液晶

AitendoによってバーゲンのTNセグメント液晶を買ってきました。

もちろんFreeBSD/mrubyで使う事にします。

最初に買ったモジュールはいろいろいじっているうちに壊れてしまったので、もう一度バックライト付きのものを買ってきました。

とりあえず3.3VのArduinoで試してみたのですが、4ビット単位で送ったデータの1ビットが表示できない状態でした。

![写真（2016-10-18 23.27）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/01c116c5-e53a-0bf8-9690-017d99d1aa78.jpeg)


これはBIASコマンドを送っていないためでした。たしかにBIASコマンドにはcommonsの設定が入っているので、これが3 commonsになってしまっていたのだと考えられるのですが、世の中のサンプルにはBIASコマンドを設定していないケースもあり、どうも電源投入のタイミングや電圧や回路によって初期値が変わってしまう様な気がします。

とりあえずArduinoでは動いたので、FreeBSD上のmrubyでmruby-bsdgpioを使ってプログラムを書いてみたのですが、うまくいきませんでした。表示はできるものの、一部消えなかったり複数箇所が書き変わったり、連続書き込みを受け付けなかったり大変不安定です。考えられる可能性はWRのクロックが遅いとか奇麗じゃないとかがあるのかと思います。

このモジュールはHOLTEK社のHT1621というコントローラーチップを使っている様なのですがかなり癖のあるデバイスという印象です。

[スマートメーター](http://qiita.com/yamori813/items/f0dfedf31b2b51e658f9)の表示デバイスとしては最適なので表示はArudinoでi2cでFreeBSDからデータを渡すなどの方法も考えてみたいと思います。

余談ですが、このタイプの液晶はバックライト有無と桁数違いで何種類かあるようですが、表示内容はほぼ同じようです。~~おそらく人の目よりも高いところに設置して使う事を考えていて、視野が正面より下側は良いのですが、上から見るとほとんど見えなかったりしています。~~適当な抵抗がつけられているためにコントラストがいい加減になっているだけのようです。半固定抵抗で調整可能にすればちゃんと表示できます。


参考にしたサイト

http://plaza.rakuten.co.jp/aisuke37/diary/201606250001/
http://morecatlab.akiba.coocan.jp/lab/index.php/2015/10/segment-lcd/
http://plaza.rakuten.co.jp/v62000/diary/201606300000/
Laravelでトークンミスマッチが起きた時にリダイレクトさせる

Laravelはじめたての頃、誰もが遭遇する嫌なメッセージの代表格
「TokenMismatchException in VerifyCsrfToken」

これが発生した時に、TOPページに飛ばすとかそういうことをします。

### 必要になった経緯

WEB画面上でのメール送信プログラムをつくっていたとして、
送信完了ページで画面をリロードすると、メールが二重で送信される。
だからメール送信後、 $request -> session() -> flush(); みたいなことをすると
二重送信は防げるが、トークン情報が消失するため、TokenMismatchException が出てくる。
なので、トークン情報がない時（送信完了画面でリロード、または送信完了画面に直接アクセス）はTOPページにリダイレクトさせる

### 実装

```php:app/Exceptions/Handler.php
<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

use Illuminate\Session\TokenMismatchException; // 追加

class Handler extends ExceptionHandler
{
...
    public function render($request, Exception $e)
    {
        if ($e instanceof TokenMismatchException) {
             return redirect('/');
        }

        return parent::render($request, $e);
    }
...
}
```

### ポイント

* ```use Illuminate\Session\TokenMismatchException;``` これがないと動きません
* ```return parent::render($request, $e);``` これよりも上に書くこと
Pythonでpsycopg2をインストールしようとしたときにエラー

<img width="1150" alt="Screen Shot 2016-10-19 at 14.23.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/112938/b9634f8c-dcd6-27bd-a359-8459cae43f98.png">

こんなのが出て、psycopg2をimportしようとしても、importできなかった。
Stack overflowで見かけた、$DYLD_LIBRARY_PATHを変えるという方法も全く役に立たず。。。

仕方がなく、
`pip uninstall psycopg2`
して、ダメ元で、
`conda install psycopg2`

したら何と動いた....何でだろう(@_@)
FiddlerでEclipseのSSL通信をキャプチャする

#javaのSSLソケットを使った通信の内容をキャプチャしたい
javaで特定のキーストアを用いたSSLクライアントを実装していますが、ローカル（Eclipse）で動作確認をする際にFiddlerでさくっと通信内容をキャプチャしたり加工したかたったので、その方法をメモします。
なお、今回、利用したFiddlerのバージョンは「v4.6.2」です。

#JVMにプロキシを設定する
Eclipseの内部サーバ（Tomcat）のHTTP通信がFiddlerを経由するように、JVMオプションにプロキシサーバの情報を設定します。

##Fiddlerのポート番号を確認する
デフォルトのポート番号は「8888」ですが、いちおう、Fiddlerのリッスンポートを「Tools」＞「Telerik Fiddler Options」＞「Connections」で確認します。
![WS000030.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/4fabad96-daeb-f014-613f-e696e2c6c4f2.jpeg)

##JVMパラメータにプロキシの設定を追加する
Eclipseの「Window」＞「Preferences」＞「Tomcat」＞「JVM設定」より、JVMパラメータに以下を追加します。

```java:jvm設定内容
-DproxyPort=8888
-DproxyHost=127.0.0.1
-DproxySet=true
```

以上で、Eclipse内のHTTP(S)の通信がFiddlerでキャプチャできるはずですが、今回は特定のキーストアを使う必要があったため、FiddlerのSSLルート証明書をそのキーストアに追加します。

#キーストアにFiddlerのSSLルート証明書を追加する

##Fiddlerのルート証明書をエクスポートする
Fiddlerの「Tools」＞「Telerik Fiddler Options」＞「HTTPS」よりActionボタンを押下し、「Export Root Certificate to Desktop」を選択し、証明書をデスクトップにエクスポートします。

![WS000031.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/f1e9f62c-de23-845b-a38d-7e5c612a404b.jpeg)

##キーストアに証明書を追加する
keytoolコマンドで、上記でエクスポートした証明書をキーストアに追加します。
keytoolは「JAVA_HOME\jre\bin」にあります。

```cmd:keyttolコマンド
keytool.exe -import -file <エクスポートしたFiddlerのルート証明書のパス> -keystore <キーストアのパス> -alias Fiddler
```

#完了
以上で、特定のキーストアを用いたjavaのSSL通信の内容を、Eclipseで動作させた際にFiddlerでキャプチャできるようになりました。