OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu MAAS/Juju 2.0 で OpenStack Mitaka 構築 (その2)

[Ubuntu MAAS/Juju 2.0 で OpenStack Mitaka 構築 (その1)](http://qiita.com/tglovernuppy/items/f85f2ee8594493370109) の続きの覚え書き.

## 1. OpenStack CLI 操作コマンドの導入
MAAS を動かしている controller ノード上で OpenStack を操作できるよう，CLI 操作ツールを導入する.

```
$ sudo apt install python-novaclient python-keystoneclient python-glanceclient python-neutronclient
```

[前回の記事の3.2節でダウンロードした](http://qiita.com/tglovernuppy/items/f85f2ee8594493370109) openstack-base の Juju-charm に同封された環境設定ファイルを使う.

```
$ source novarc
$ keystone catalog
```

## 2. Glance への OS イメージの追加

Ubuntu trusty (14.04) および xenial (16.04) のイメージを OpenStack に取り込む.

```
$ mkdir ~/images
$ wget -O ~/images/trusty-server-cloudimg-amd64-disk1.img \
	http://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img
$ wget -O ~/images/xenial-server-cloudimg-amd64-disk1.img \
	http://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img
$ glance image-create --name="trusty" --visibility public --progress \
    --container-format=bare --disk-format=qcow2 \
    < ~/images/trusty-server-cloudimg-amd64-disk1.img
$ glance image-create --name="xenial" --visibility public --progress \
    --container-format=bare --disk-format=qcow2 \
    < ~/images/xenial-server-cloudimg-amd64-disk1.img
```

## 3. フレーバーの追加

デフォルトのフレーバーが作られなかったので手動で作成する.

```
$ nova flavor-create m1.tiny 1 512 1 1
$ nova flavor-create m1.small 2 2048 20 1
$ nova flavor-create m1.medium 3 4096 40 2
$ nova flavor-create m1.large 4 8192 80 4
$ nova flavor-create m1.xlarge 5 16384 160 8
```

## 4. インスタンスのコンソール有効化

Juju GUI より `nova-cloud-controller` アプリケーションの設定を開き，赤枠で囲った箇所を以下のように設定する.

|項目|設定値|
|---|---|
|console-access-protocol|novnc|
|console-proxy-ip|(controller ノードの Public IP)|

![enable-novnc.png](https://qiita-image-store.s3.amazonaws.com/0/38708/58af5a07-8377-7dba-2188-a3a731312105.png)


その後， "Save changes" をして "Commit changes" を行う.

最後に `iptables` で controller ノードから nova-cloud-controller (10.1.0.15) へのポートフォワーディングを行う.

```
$ sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 6080 -j DNAT --to-destination 10.1.0.15:6080
$ sudo iptables-save -c > iptables.rules && sudo mv iptables.rules /etc/iptables.rules
```

以後 OpenStack 上で作成された nova インスタンスは vnc アクセスが可能となる.

## 5. ネットワークの作成

[前回の記事の3.2節でダウンロードした](http://qiita.com/tglovernuppy/items/f85f2ee8594493370109) openstack-base の Juju-charm に同封されたスクリプトファイルを使う.

外部ネットワーク `ext_net` (133.68.xxx.0/24) と admin プロジェクトで用いる内部ネットワーク `admin_net` (10.5.5.0/24) を作成する.

```
$ ./neutron-ext-net -g 133.68.xxx.1 -c 133.68.xxx.0/24 -f 133.68.xxx.2:133.68.xxx.254 ext_net
$ ./neutron-tenant-net -t admin -r provider-router admin_net 10.5.5.0/24
```

これで一通りの構築作業は完了.


## 参考文献
・[openstack base | Juju](https://jujucharms.com/openstack-base/)
・[nova cloud controller | Juju](https://jujucharms.com/nova-cloud-controller/)
・[gnuoy: OpenStack Guest Console Access with Juju](http://blog.gnuoy.eu/2014/09/openstack-guest-console-access-with-juju.html)
AzureFunctions + AzureStorage + AzureDocumentDBでデータImport1

GYAOのtsです。
我々のチームは、オールパブリッククラウドで、[Microservice Architecture](http://microservices.io/patterns/microservices.html)を採用した次期バックエンドを設計中です。

# 経緯

突然なんですが、PJ内で色々ありまして、急遽設計を大幅に変更することになった。
我々のチームではよくあることだが、チーム全員がいい意味でまとまっているので今回もなんとかなりそうかなと思っています。その変更は以下のような感じ。
※なぜこうなったかは今回はなしで。

![export.png](https://qiita-image-store.s3.amazonaws.com/0/114329/2df9d977-8d98-8ea1-2be9-a5d58baa6d74.png)

要は

- Meta data

1. jsonファイルを1行ずつ分割
1. AzureFunctionでServicebusにtopicとしてpublish
1. AzureFunctionがsubscribeしてDocumentDBに保存。
1. DocumentDBに対してはrestで検索させる

- Log data

1. Sevicebusへtopicとしてデータをpublish。
1. AzureFunctionがsubscribeしてDocumentDBに保存。
1. MachineLearningのinput data resourceはDocumentDBを指定。定期的に取り込む。
1. 学習結果はrestで提供。

のような流れだ。

[こちら](http://qiita.com/tstakano-yj/items/21f78336a8a3aae50f82)で書いた設計とはだいぶ変わった。。。

だいぶAzure一色になってきた。Apigeeだけ浮いているのでおそらくAzureAPIManagementとかになるかな。そのままApigeeでも面白いと思うが。

# Blobコンテナ
Blobのコンテナにデータが作成されたらそれを1行ずつ読んで、servicebusにpublishする。
<img width="560" alt="スクリーンショット 2016-11-24 16.44.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/6cb6cd33-1ff1-5899-4e12-67d269856cd7.png">

```json：testLines.json
{ "original_id" : "1", "b":false , "c":0 , "d":1 , "e":2 , "f":0.345 , "g":"あ" , "h":"い" }
{ "original_id" : "2", "b":false , "c":0 , "d":1 , "e":2 , "f":0.345 , "g":"あ" , "h":"い" }
{ "original_id" : "3", "b":false , "c":0 , "d":1 , "e":2 , "f":0.345 , "g":"あ" , "h":"い" }
```
ここで、original_idがドキュメントの識別子になるのだが、DocumentDBに保存する際、idという名前があるとDocumentDBのkeyとして登録されてしまうので、それは避けたい（こちら側でkeyは発行したい）。なので、idというエレメントがないかどうかFunctionsでチェックする必要がある。

# 次回

AzureFunctionsを使用して上記のjsonを読んでServicebusにpublishする
sl に "Pepper" を組み込んでみたよー


## sl について

- [ジョークプログラムslを動かしてみた](http://qiita.com/gm_kou/items/2840a6670dc2e733d00a)
- [キミは伝説の「slコマンド」を見た事があるか!](http://qiita.com/makoto1899/items/528410af5aded3e0d92c)

## プロジェクト

- [sl by sunagay - github](https://sunagay.github.io/sl/)

### 実行方法

```bash:bash
$ make
gcc -O -o sl sl.c -lncurses

$ ./sl -p
```

### 実行例

![sl.gif](https://qiita-image-store.s3.amazonaws.com/0/20418/f31ceb02-fe11-55a4-0967-d27c4a1c7c4d.gif "sl.gif")

おわり
GlideのTransformation自作時はBitmap#recycleしてはいけない

自分用おぼえがきです。タイトルそのままです。

公式ドキュメントの **Bitmap re-use** の項に明記してありました。
https://github.com/bumptech/glide/wiki/Transformations#bitmap-re-use

一回使い切りの場合や取得結果をキャッシュしていない場合はあまり影響なさそうですが、再利用しようとすると当然エラーになります。それでも落ちたりしないし再取得を試みてくれてるっぽいので、うっかり間違っててもすぐには気づきにくいかも。

```
W/Bitmap: Called getConfig() on a recycle()'d bitmap! This is undefined behavior!
W/Bitmap: Called getRowBytes() on a recycle()'d bitmap! This is undefined behavior!
W/Bitmap: Called getHeight() on a recycle()'d bitmap! This is undefined behavior!
```

こんなのがわらわらでます。

よくある間違い、的なページもありました。
https://github.com/bumptech/glide/wiki/Resource-re-use-in-Glide#common-mistakes
【メモ】PowerShellでGuidを取得

#コマンドラインからワンライナーで  
```
C:\powershell -Command "[Guid]::NewGuid()"

Guid
----
2fb0baeb-e75e-456c-9808-90b08fc8a4fe
```
#PowerShellで  
```
C:\>powershell
Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS C:\> [Guid]::NewGuid()

Guid
----
a16d7193-a58c-428c-8f44-6ac06b849f80


PS C:\>
```
ceres solverをpythonから使いたい

# ceres solver
ceres solver (http://ceres-solver.org/) はgoogleの公開している非線形最小二乗ソルバーです．惑星のceresが最小二乗法によって発見されたことにちなんで名づけられたようです．

## 非線形最小二乗法
細かい説明は他に譲るとして最小二乗法とは，以下のように二乗和で表現される式を最小にする$x \in \Re^n$を求める問題です．

Minimize: $\sum_i ||f_i(x)||^2_2$

例えば $x = [a,b]; a,b \in \Re$，$f_i(a,b) = y_i - (a t_i + b)$ とすると

Minimize: $\sum_i ||y_i - (a t_i + b)||^2$

となります．これは $(t_i,y_i)$ に最もフィットする直線 $y=ax+b$ を求める問題です．
この例は線形最小二乗法ですが，ceresはこの $f_i(x)$ が非線形関数でも扱えるソルバーです．

## Ceres Solverで扱うことのできる問題
Ceresはあくまで最小二乗法を解くことに特化したソルバーです．各変数に対して上界と下界を与えることはできますが，それ以上の拘束条件（等式制約や不等式制約など）を与えることは出来ません．制約を与える必要がある場合は，二次計画問題等を解けるソルバーを使う必要があります（もしくはラグランジュ緩和）．
非凸な問題に対して，当然ながら大域的最適性は保証されませんが（局所）解を求めること自体は可能です．任意の初期値を与えることも可能です．

# pythonから使いたい
さて本題のpythonから使いたいって話なのですが，どちらかというと良い方法ないですか？って記事です．というのも**使えそうなラッパーライブラリを見つけることは出来ませんでした．**(Cythonで公開されているものがちらほらあるようですが，得体が知れないライブラリ&Cythonの経験もなかったので)
ということで以下はとりあえず私が使っている方法の紹介です．**もっといい方法があればぜひ教えてください．**

## とりあえずpythonから使う
**私の解決策はBoost.numpyを使う方法です．**
恥ずかしながら私はC++をほとんどやってこなかったので名前を聞いたことがある程度だったのですが，Boostは様々なライブラリの集合体のようです．
私の理解では，Boost.pythonというのがpythonからC++の関数やクラスを呼ぶためのラッパーライブラリで，Boost.numpyはC++の関数にnumpyのndarrayやmatrixを渡すことができるラッパーライブラリです．
正直このライブラリの存在を知っていればあとは簡単です．なんせC++の部分はネイティブ(?)のコードが書けるので学習コストはほぼゼロです．Cのコードとpythonのコード両方を書かなければならないのでpythonからceresを使えているというかは怪しいですが・・・

私自身は最低限最適化の部分をCの関数で定義して，残りはすべてpythonで実装しています．個人的には今の実装方法でとりあえず満足しています，ceresに限らず基本的にC++の任意の関数（ライブラリ的にはクラスなどもラッピングできるらしいですが）を呼び出すことができるので非常に幅が広まったと思います．

## 参考サイト
Boost.numpyについては以下を参考にしました．CMakeListsの例もあってとても参考になりました．

 * http://qiita.com/termoshtt/items/0103803c40331c77c727

Ceresについてはチュートリアルだけでも十分に分かりやすいです．

 * http://ceres-solver.org/tutorial.html
 * http://myenigma.hatenablog.com/entry/2016/09/22/091201
select2のセレクトボックスが閉じなくなって困った話

オチ： 同じ値のid属性を持ったやつがいた
追記：
　Select2: 4.0.3
　jQuery: 3.1.1
##どんなことが起こったか
以下のhtmlのselectタグにselect2を適用した時に以下の順序を踏むとselect2の外側をクリックした時にセレクトボックスが閉じなくなる

```index.html
<html>
  <head>
　　〜 色々省略 〜
  </head>
  <body>
    <select id="hoge1" class="selectA select2">
      <option>hoge1</option>
      <option>hoge2</option>
    </select>
    <select id="hoge1" class="selectB select2">
      <option>hoge3</option>
      <option>hoge4</option>
    </select>
    <select id="hoge2" class="selectC select2">
      <option>hoge5</option>
      <option>hoge6</option>
    </select>
  </body>
</html>
~
```
```index.js
$(() => {
  $(".select2").select2({"width": "100px"});
})
```

1. selectAをクリックしてセレクトボックスを出す
2. selectBをクリックしてセレクトボックスを出す

ちなみに手順のどちらかをselectCにすると普通に動く

##原因
selectAとselectBに同じ値のid属性が付いている。

select2の実装が
　・openイベント内で閉じるためのmousedownイベントをネームスペースできって、bodyにonする
　・closeイベント内で閉じるためのイベントをネームスペースでとってbodyからoffする
　・上記のネームスペースはselectタグについてるid属性で設定する
っていう事をしてるので、同じidの値を持ったselectタグがいると

1. selectBのopenイベント
2. selectAのcloseイベント

って順番で実行されるので、selectAのcloseイベントの時にhoge1でネームスペースきられたmousedownイベントが消えるので、select2の外側クリックしても消えなくなる。

というか、そもそも同じ値のid属性をつけることはhtml的に間違っている。
railsとかでselectタグ生成してるとふとした時に同じのが生まれてたりする。(した
3日位頭悩ませて色々試したオチが凄くくだらなかったど、くだらなすぎて情報がどこにもなかったのほんとうに困ったので、こういうこともあるよって事でね。
EC-CUBE3 新商品取得方法

最近はEC-CUBE3を触り始めており、かなり試行錯誤しながらやっていますので、苦労の足跡を残していこうと思います。

EC-CUBE3をデフォルトでインストールすると画面中央に新商品の表示がありますが、テンプレートファイル(あなたのルートディレクトリ/src/Eccube/Resource/template/default/Block/new_product.twig)をみるとこいつらは静的データです。

こちらのサイト（http://ohtacky.blogspot.jp/2015/07/eccube3.html）
を参考に"あなたのルートディレクトリ/app/template/default/Block/new_product.twig"と"あなたのルートディレクトリ/src/Eccube/Controller/Block/NewProductController.php"を作成します。

```php:NewProductController.php
public function index(Application $app) {
        // del_flg(削除フラグ)がたっていないものを取得
		$product_data = $app['eccube.repository.product']->findBy(array('del_flg' => 0));
        // unsetするため一時的な変数へ
		$temp = $product_data;
		foreach ($temp as $key => $p) {
			$delete_flg = true;
			// 非公開のものは除外
			if (! $p->isEnable()) { unset($product_data[$key]); continue; }
			// タグが新商品のものを抽出
			$tag = $p->getProductTag();
			foreach ($tag as $k => $val) { if ($val->getTag() == '新商品') $delete_flg = false;	}
			if ($delete_flg) unset($product_data[$key]);
		}
        // テンプレートへ値を渡して出力させる
		return $app['view']->render('Block/new_product.twig', array('NewProduct' => $product_data));
}
```

delete_flgなんて変なもの使わなくてもいけそうな気がしなくもない。

コントローラをこんな感じで書いたら次はテンプレート

```html:new_product.twig
    <div class="row new-product">
        {% for p in NewProduct | slice(0, 3) %}
        <div class="col-sm-3 col-xs-6">
            <div class="pickup_item">
                <a href="{{  url('product_detail', {id : p.getId()} ) }}">
                    <div class="item_photo"><img src="{{ app.config.image_save_urlpath }}/{{p.getMainListImage()}}"></div>
                    <p class="item_comment text-warning">{{p.note}}</p>
                    <dl>
                        <dt class="item_name">{{p.name}}</dt>
                        <dd class="item_price">¥{{p.getPrice02IncTaxMax()|number_format}}</dd>
                    </dl>
                </a>
            </div>
        </div>
        {% endfor %}
    </div>
```
twig慣れるのに時間かかりそーーー！

### 最後に忘れちゃいけないのがDBのdtb_blockテーブルのlogin_flgを1にしておくこと！
私はこれを忘れて半日悩んでしまいました...

これだけ書くのに結構時間をかけてしまいました...
EC-CUBE3の情報は結構少ないのでどんどん書きためていきたいと思います。

```
$tag = $p->getProductTag();
foreach ($tag as $k => $val) { if ($val->getTag() == '新商品') $delete_flg = false;	}
```

ここの'新商品'っていう文字列と比較してるのが気持ち悪くてやめたいけど、他にいい方法が思いつかない...
serverless framework


# Add AWS Event rules (not schedule)

```yaml:serverless.yml
resources:
 Resources:
   RuleTest:
     Type: AWS::Events::Rule
     Properties:
       EventPattern:
         {
           "source": [
           "aws.ec2"
           ],
           "detail-type": [
             "EC2 Instance State-change Notification"
           ],
           "detail": {
              "state": [
                 "running"
              ]
           }
         }
       Name: test-rule
       Targets:
         -
           Arn:
             Fn::GetAtt:
               - "HelloLambdaFunction"
               - "Arn"
           Id: "TargetFunctionV1"

   PermissionForEventsToInvokeLambda:
     Type: "AWS::Lambda::Permission"
     Properties:
       FunctionName:
         Ref: "LambdaFunction"
       Action: "lambda:InvokeFunction"
       Principal: "events.amazonaws.com"
       SourceArn:
         Fn::GetAtt:
           - "RuleTest"
           - "Arn"
```

Look! 

```yaml:
           Arn:
             Fn::GetAtt:
               - "HelloLambdaFunction"
               - "Arn"
```

`HelloLambdaFunction` named by `serverless.yml`'s this part.

```
functions:
  hello:
```
PyQt4入門その1

# 概要

ここではPyQt4の初歩的な説明をしていく．
基本的には[ここのサイト](http://myenigma.hatenablog.com/entry/2016/01/24/113413#Windowを作る)を参考に進めていく．
実行環境は以下のとおりである．

- OS:Ubuntu(BashOnUbuntuOnWindowで実行している)
- Python:2.7系
- GUI:Xming

BashOnUbuntuOnWindowでのGUIの表示方法がわからない人は[ここのサイト](http://qiita.com/makky0620/items/e31edc90f22340d791ff)を参考に環境構築する．

その1では**メインウィンドウの作り方**を説明する

# メインウィンドウの作り方

```python:makeWindow.py
#coding:utf-8
"""
最小のプログラムでウィンドウを表示させるためのプログラム
"""
import sys
from PyQt4 import QtGui

def main():
	app = QtGui.QApplication(sys.argv)	
	w = QtGui.QWidget()					#ウィンドウの作成
	w.resize(250,150)					#ウィンドウのサイズ変更	
	w.setWindowTitle('QtSample')
	w.show()
	sys.exit(app.exec_())				#app.exec_()が右上のバツボタンを指している

if __name__ == "__main__":
	main()
```

makeWindow.pyはウィンドウを作成するためのプログラムである．

```
w = QtGui.QWidget()
```
によってウィンドウを生成し

```
w.show()
```
によってウィンドウを表示する．

makeWindow.pyを実行すると以下のような画面が表示される．

![pyqt01.png](https://qiita-image-store.s3.amazonaws.com/0/49447/736d853e-91f4-33e1-5d65-e4c3832ae725.png)
## ウィンドウに関するおまけ
ウィンドウのサイズやタイトルバーの設定について説明する

### ウィンドウサイズ
ウィンドウサイズを変更するには

```
w.resize(width,height)
```
を使用することで変更が可能である．
第一引数にウィンドウの幅を第二引数にウィンドウを高さを指定する．
### タイトルバー
タイトルバーを変更するためには

```
w.setWindowTitle("タイトル")
```
を使用することで変更が可能である．
引数にタイトルバーに表示したい文字列を指定すると変更される．
# 参考サイト
> [PythonのPyQtによるクロスプラットフォームGUIアプリ作成入門](http://myenigma.hatenablog.com/entry/2016/01/24/113413#Windowを作る)
>[Bash on Ubuntu on Windows + XmingによるGUI](http://qiita.com/makky0620/items/e31edc90f22340d791ff)
PHP7の互換性チェック

[php7cc](https://github.com/sstalle/php7cc)を使うと既存のソースコードがPHP7に対応しているかどうか、チェックできます。

#php7ccのインストール
composerでインスール

```
composer global require sstalle/php7cc
```

パスを通す

```
export PATH="$PATH:$HOME/.composer/vendor/bin"
```


#実行してみる

```
$php7cc {ファイルorディレクトリ}
```

##オプション

###extensions
特定の拡張子だけチェックしたい場合

```
php7cc --extensions=php,inc,lib /path/to/my/directory/
```

###except
特定のディレクトリを除外したい場合

```
php7cc --except=vendor --except=/path/to/my/directory/test /path/to/my/directory/
```

###level

エラーのレベルを指定したい場合

```
php7cc --level=error /path/to/my/directory/
```

その他のオプションは`php7cc --help`で確認できます。

##試しに

```php

<?php

class Test
{

  function Test()
  {

  }

  function test1()
  {
    ereg('', '');

    $a = [1, 2, 3];
    list(,,) = $a;

    preg_replace('//e', '', '');
  }


}
```

というファイルをチェックした場合

```
$ php7cc test.php 

File: test.php
> Line 6: PHP 4 constructors are now deprecated
    function Test()
    {
    }
> Line 13: Removed function "ereg" called
    ereg('', '');
> Line 16: Empty list assignment
    list(, , );
> Line 18: Removed regular expression modifier "e" used
    preg_replace('//e', '', '');

Checked 1 file in 0.034 second
```

エラーの箇所と内容が表示される
[備忘録]dockerのコンテナでemacs入れた時の起動時エラー対応

コンテナに、exec /bin/bashして、apt-getでemacsを入れて
emacs起動時、こんなエラー

```
Please set the environment variable DISPLAY or TERM (see `tset').
```

(※apt-getでインストールされたemacsは24だった。)



[対応]
emacs起動前に、環境変数を設定

export TERM=xterm

※いいのか悪いのかよく分からないが（orz）、
rootの.bashrcに追加すれば、とりあえずは、
docker exec -it XXXX /bin/bashした時に、
すぐ使える。。。
政府統計（出入国管理）をjupyter で扱いやすくの単純版

法務省の出入国管理の統計データをとってきて、[処理するnotebok の単純版](https://github.com/zanjibar/data4nihon/blob/master/estat/immigration-simple.ipynb)をつくりました。

コメントをいっぱいかいていますが、クラス化などしていないので、改造するには便利だと思います。

jupyter のコードを下記にはりつけておきます。

```
# 最小限のライブラリ設定をします。
import pandas as pd # pandas というデータ処理ライブラリの読み込み
import re  # 正規表現用
from IPython.display import display, HTML # 表示用のライブラリ読み込み

# エクセルデータをとってきて、pandas に入れ込みます。これだけでオッケー
# もとのエクセルが、シート１枚の前提です。
moto= pd.read_excel('http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_xlsDownload_&fileId=000007747517&releaseCount=1')
# 年月日は、2016 8 になっているので、追加情報として、year,month を設定します。（スクロールして自動的にとってくるのがいいいですね。）
year = 2016
month = 8
# まず、総数の確認
count_all = int(moto.iloc[2,3])
#総数の確認 ( count_all は整数なので、文字列にして表示して、HTML として、表示 display します。）
display(HTML('<h1> 総数 = ' + str(count_all) + '<h1>'))

#moto.head() とすると、データの最初の５行がさくっとみることができます。
# セルの一番最後の実行行の結果は表示されます。print(moto.head()) とかしないでも大丈夫です。
# 集計するときに、余計な行や列があるのがわかります。
moto.head()

```

```
# columns 情報 最初の１行の５番目（釧路）からの港湾名をとってきます。
columns = moto.iloc[1,4:]
# とってきただけでは、改行がはいっていたり、いろいろ難ありです。
display(columns[12:18])
# index が、Unnamed: 16  になっていて、わかりにくいので、連番に変更します。見た目だけの問題なので、やらなくてもよいです。
columns.index = range(0,len(columns))
display(columns[12:18])
# 改行、空白,などを取り除きます。
columns = columns.apply(lambda x: x.replace("\n",'').replace(' ',''))
display(columns[12:18])

# index (国)を作成します。（つくらなくてもいいのですが、行データ削除で便利なのでつけます。）
idx = moto.iloc[3:,1]
# 改行、空白,などを取り除きます。
idx = idx.apply(lambda x: x.replace("\n",'').replace(' ',''))
display(idx[12:18])
```

```
# 国(country)、港湾（port),入国者数(num) の整形されたデータを作成します。
# まずは、空データの作成です。
xdf = pd.DataFrame(columns=['country','port','num'])
# 縦に並べる   country,port,num 
for i in range(0,len(columns)):
    x = pd.DataFrame(idx)
    x.columns = ['country']
    x['port'] = columns[i]
    x['num'] = moto.iloc[4:,4 + i]
    x.index = idx
    x.index.name = 'country'
    xdf = xdf.append(x)
display(xdf.head(210).tail(10))

# 地域別の小計を取り除きます 小計のところが、NaN （データがない状態）になっています。
area = ['アジア', 'ヨーロッパ','アフリカ', '北アメリカ', '南アメリカ', 'オセアニア']
# index をつかって、削除をしています。検索で指定するよりらくです。inplace=True の指定をしてxdf を直接書き換えしています。
xdf.drop(area,inplace=True)
display(xdf.head(210).tail(10))

# 年、月の項目を足します。
xdf['year'] = year
xdf['month'] = month
display(xdf.head(210).tail(10))

# 確認のために総数を計算
display(HTML('<h1>' + str(xdf['num'].sum()) + '</h1>'))

# 整形したのを、excel ファイルに保存します。
xdf.to_excel('immigration.xlsx')
```
deoplete-clangで快適C++エディット！！！

## deoplete-clangとは
deoplete-clangとは，deopleteの補完ソースです．
clangの静的構文解析による補完を簡単に利用することができるので，neovimでC++を書くのが格段に快適になります．
今回はneovimにdeoplete-clangを導入する方法を書きます．
dein.vimと，clangがインストールされていることが前提です．

clangについて，ubuntuを使っているなら以下のパッケージを入れておきましょう．

* clang
* libclang-dev

## インストール方法
tomlファイルに`zchee/deoplete-clang`を追加しましょう．
私の設定は以下の通りです．

```toml
[[plugins]]
repo = 'zchee/deoplete-clang'
hook_source = '''
let g:deoplete#sources#clang#libclang_path = '/usr/lib/llvm-3.8/lib/libclang-3.8.so.1'
let g:deoplete#sources#clang#clang_header = '/usr/include/clang'
'''

on_ft = ['c', 'cpp', 'cmake']
depends = ['deoplete.nvim']
```
clangの共有ライブラリ，ヘッダファイルへのパスを指定しています．
`g:deoplete#sources#clang#clang_header`は，ヘッダファイルが入っているディレクトリを直接指定するのではなく，
`x.x.x/include/`が後に続くように設定しましょう．
上の例だと，`/usr/include/clang/x.x.x/include/*.h`にヘッダファイルが入っています．
READMEに書いてあるので読んでいれば問題ないのですが，私は読んでいなくて2日ほどハマりました．
また，今回は共有ライブラリへのパスを記述しましたが，共有ライブラリが入っているディレクトリを指定しても大丈夫です．

設定は以上です．`deoplete#omni#input_patterns`の設定も必要ありません．
ここで，なにかC++ファイルを開いて編集してみましょう．
このように，`[clang]`マーカがついた補完メニューが出現し，deoplete-clangによる補完が有効であることが分かると思います．
![Screenshot from 2016-11-24 14-46-55.png](https://qiita-image-store.s3.amazonaws.com/0/28859/0fdc2f4f-5008-a96c-07cc-e26c568b6bb9.png)


## cmakeプロジェクトで使う
deoplete-clangは，`.clang`というファイルを用意し，

```text:.clang
flags=<flags>
```
のようにコンパイラに渡すオプションを指定することも可能ですが，[JSON Compilation Database](http://clang.llvm.org/docs/JSONCompilationDatabase.html)を利用することも可能です．
cmakeでもJSON Compilation Databaseがサポートされているため，cmakeプロジェクトでもclangを利用した補完が可能です．

例えば，以下のような簡単なプロジェクトを作成します．

```
├── .clang
├── CMakeLists.txt
├── build
├── main.cpp
└── third_party
    └── picojson
        └── picojson.h
```


```cmake:CMakeLists.txt
project(test-cpp CXX)
cmake_minimum_required(VERSION 2.6)
set(CMAKE_CXX_STANDARD 11)
include_directories("third_party/picojson")
add_executable(test-cpp main.cpp)
```
```txt:.clang
compilation_database = "./build"
```

以下のコマンドでbuildディレクトリに`compilation_database.json`という名前でJSON Compilation Databaseが生成されます．

```zsh
mkdir build
cd build
cmake ../ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
```

これで，deoplete-clangが適切にオプションをつけてclangを呼び出してくれるため，このように補完ができるようになります．
![Screenshot from 2016-11-24 15-20-45.png](https://qiita-image-store.s3.amazonaws.com/0/28859/fd4ddbb8-e317-4184-4a7d-c77272ee8500.png)

## 余談: CMakeLists.txtで補完
余談ですが，deoplete-clangはcmakeファイル内で，コマンド等の補完を行うことも可能です．

これは私のdeoplete-clangの設定の一部です．
on_ftに`cmake`が追加されているのがわかるかと思います．

```toml:dein_lazy.toml
on_ft = ['c', 'cpp', 'cmake']
```

こうすると，deoplete-clangに含まれるcmakeの補完ソースが仕事をするようになります．
こちらは特にREADMEに記載がなかったので，deoplete-clangの補完ソースのプログラムを確認している際に気づきました．

![Screenshot from 2016-11-24 14-50-56.png](https://qiita-image-store.s3.amazonaws.com/0/28859/ecf83809-b678-c3c1-22ff-382cbbcc04c6.png)
SNSシェアボタンを簡単に実装

twitter / Facebook / LINE / pocket(記事の保存)　の設置URLめも。

予め自作したボタンを作っておいて、aタグの`href=""`の中に以下のURLを入れれば完成です。簡単。
あと`target="_blank"`はつけておいたほうが良いです。


## twitter 
```
http://twitter.com/intent/tweet?text=[表示したい文字]&amp;url=[ページURL]&hashtags=[ハッシュタグ(#はつけない)]
```

## Facebook 
```
http://www.facebook.com/sharer.php?u=[ページURL]&amp;t=[表示したい文字]
```
※ただし、「いいねボタン」はオリジナルデザインのボタンに設置できない。

## LINE 
```
http://line.me/R/msg/text[表示したい文字]/?[ページURL]
```

## pocket（記事の保存）
```
http://getpocket.com/edit?url=[ページURL]
```


## 参考
http://general21.com/2016/02/28/sns-shared-button/
https://media.line.me/howto/ja/

参考にさせていただきました、ありがとうございます！
Ubuntu 16.04 LTSにlibvips 8.4.4をインストールする

# 概要
Ubuntu 16.04 LTSにおいてapt-getではlibvips 8.2.2しか入らない。(2016年11月24日現在)
なので、最新バージョンやそれに近しいバージョンを入れたい時にちょっと困る。
そんな時のためのメモ。

![image](https://qiita-image-store.s3.amazonaws.com/0/133666/c3f91d95-8158-1921-cf5c-d4430492c561.png)
[vips package : Ubuntu](https://launchpad.net/ubuntu/+source/vips)
[amd64 build : 8.4.4-1 : vips package : Ubuntu](https://launchpad.net/ubuntu/+source/vips/8.4.4-1/+build/11206293)

launchpadから17.04向けのdebを持ってきてそれを放り込む。
makeするよりは早い…はず？

しかしながら依存関係の折に、システムの多くが更新されてしまった。これじゃあ17.04使ってるのとおんなじじゃん…疑惑が。
**あんまりよろしくない気がするので、おとなしくmakeして入れるほうが良いのかも。**

# gdebiのセットアップ
入っていなければ、下記記事参照。
[debファイルからインストールする際に依存関係で悩んだら - Qiita](http://qiita.com/yanoshi/items/5faf97012bf7889feccf)

# libvipsのセットアップ
以下のような感じで入る。

```bash
sudo aptitude install libjasper1 -y
wget http://launchpadlibrarian.net/291733478/libcfitsio5_3.390-2_amd64.deb
sudo gdebi libcfitsio5_3.390-2_amd64.deb
wget https://launchpad.net/ubuntu/+source/libwebp/0.5.1-2ubuntu1/+build/10991026/+files/libwebp6_0.5.1-2ubuntu1_amd64.deb
sudo gdebi libwebp6_0.5.1-2ubuntu1_amd64.deb
wget http://launchpadlibrarian.net/291765311/libmatio4_1.5.9-1_amd64.deb
sudo gdebi libmatio4_1.5.9-1_amd64.deb
wget http://launchpadlibrarian.net/293589608/libvips42_8.4.4-1_amd64.deb
sudo gdebi libvips42_8.4.4-1_amd64.deb
```

# devとかtoolsとか
これらも入れたい場合は次みたいな感じで。

## libvips-tools

```bash
wget https://launchpad.net/ubuntu/+source/vips/8.4.4-1/+build/11206293/+files/libvips-tools_8.4.4-1_amd64.deb
sudo gdebi libvips-tools_8.4.4-1_amd64.deb
```

## libvips-dev

```bash
wget https://launchpad.net/ubuntu/+source/vips/8.4.4-1/+build/11206293/+files/libvips-dev_8.4.4-1_amd64.deb
sudo gdebi libvips-dev_8.4.4-1_amd64.deb
```

# 所感
コンパイルするほどではないけど、やっぱり時間がかかる。
XamarinでUnity向けのDLLを作成する覚書


UnityはMono3.5以下（？）で作成されたDLLしか対応していない。
そこで、Xamarin StudioでUnity向けにDLLをビルドするには以下の設定が必要になる。

プロジェクトを右クリック＞オプション＞ビルド＞全般を開く。
　　・ターゲットフレームワークに.NET 3.5以下のものを選択
　　・Build Engineの欄の「（このプロジェクトタイプに推奨されている）MSBuildビルドエンジンを使用します」のチェックをはずす。
　　
ちなみに、上記のチェックをはずしていないと、次のようなエラーが起きる。
```Error: ほにゃらら.csproj could not import "$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets"```

![スクリーンショット 2016-11-24 14.21.17.png](https://qiita-image-store.s3.amazonaws.com/0/20722/474432a2-5563-a583-1972-2277606fe7a2.png "スクリーンショット 2016-11-24 14.21.17.png")
svg扱うjsライブラリメモ


- Raphaël.js
	- https://dmitrybaranovskiy.github.io/raphael/
- Snap.svg
	- http://snapsvg.io/
	-  Adobeが出してる
- svg.js
	- http://svgjs.com/
- D3.js
	- https://d3js.org/
	- 汎用的
- Two.js
	- https://two.js.org/
Xcode Analyzeでの解析結果をhtmlファイルに出力する


## 実行コマンド

```
xcodebuild analyze \
    -project MyProject.xcodeproj \
    -scheme MyScheme \
    -sdk iphonesimulator \
    -destination "name=iPhone 6s Plus,OS=9.2" \    
    -configuration Debug \
    CLANG_ANALYZER_OUTPUT=plist-html \
    CLANG_ANALYZER_OUTPUT_DIR="$(pwd)/clang"
```

### サンプル
私がMacOSアプリケーションに対して実行したコマンドは以下の通り。

```
xcodebuild analyze \
    -project Hoge.xcodeproj \
    -scheme Hoge \
    -configuration Debug \
    CLANG_ANALYZER_OUTPUT=plist-html \
    CLANG_ANALYZER_OUTPUT_DIR="$(pwd)/clang"
```

clangフォルダ配下に結果が出力されます。

### 実行時のXcodeバージョンに注意する
複数のXcodeを導入している場合は、
実行するXcodeのバージョンに注意する。

Xcodeバージョンの切り替え
`xcode-select --switch  /Applications/[AppName].app`

【例】
`xcode-select --switch  /Applications/Xcode6.1.app`
`xcode-select --switch  /Applications/Xcode8.1.app`

## 所感
エラーごとにhtmlファイルが出力されるので、
警告数によっては大変なファイル数となります。
※ 1警告で1htmlファイル となっているようです。


## 参考
[Clang Static Analyzer](http://mgrebenets.github.io/mobile%20ci/2015/02/08/clang-static-analyzer)
.NET CoreでThread.Sleepしたり、時間測ったり、ログ書き込んだり。


.NET Coreでテストプログラム作成時に使う幾つかのクラスやメソッドが使えるか試してみました。

* ストップウォッチ（時間計測）
* Thread.Sleep（プログラムのスリープ）
* 書込み（ログ等の書込み）

結論から言えば動きました。但し、Thread.Sleepは.NET Core用のライブリを読み込む必要があるようです。


###準備

コンソールアプリの雛形を作ります。

```bash
mkdir test
cd test
dotnet new
```

###package.json

package.jsonにSystem.Threadingを追加。dotnet restoreを実行。

```diff
{
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true
  },
  "dependencies": {},
  "frameworks": {
    "netcoreapp1.1": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.1.0"
        },
+       "System.Threading.Thread": "*"
      },
      "imports": "dnxcore50"
    }
  }
}
```

###Program.cs

各機能を使ってみる。ログはNlogやlog4netとかも利用できますが、「とりあえず」というときには普通の書込みで対応したいものです。.NET FrameworkのStreamWriterは直接ファイルを指定できましたが、.NET CoreではいったんFileStreamをかましてやる必要があるようです。

なお、.NET Coreから新しいLoggingフレームワークが加わっています。[参考](https://msdn.microsoft.com/ja-jp/magazine/mt694089.aspx)まで。

```csharp
using System;
using System.Threading;
using System.Diagnostics;
using System.IO;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //stop watch
            Stopwatch sw = new Stopwatch();
            sw.Start();

            Console.WriteLine("Start.");

            //Sleep
            Thread.Sleep(2000);

            Console.WriteLine("End");

            sw.Stop();
            Console.WriteLine("Time is "+sw.Elapsed);

            //write log
            using(FileStream fs = new FileStream("./test.txt",FileMode.Append))
            using(StreamWriter writer = new StreamWriter(fs))
            {
                writer.WriteLine(DateTime.Now+"Time is "+sw.Elapsed);
            }
        }
    }
}
```
MacでUSBメモリをマウントする　how to mount USB disk on Mac

Sometimes FAT32 format disk cannot be readable on Mac.
In that case, please try following command to mount manually.
ときどきなぜかUSBメモリがMacに自動でマウントされない。そんなときの技。

1 List all device　すべての接続されているディスクを表示

>
>`$ diskutil list`

>```/dev/disk1
>#: TYPE NAME SIZE IDENTIFIER
>0: GUID_partition_scheme *16.0 GB disk1
>1: EFI 209.7 MB disk1s1
>2: Apple_HFS OSXDaily 15.7 GB disk1s2
>```

disk1s2 should be USB disk
disk1s2がUSBメモリにあたります


2 Mount　マウント

>`$ diskutil mount /dev/disk1s2`
RaspberryPi Sense HATのLEDに日本語をスクロール表示させる

SenseHATの公式APIでは日本語がスクロール出来なかったので、PythonのPILと美咲フォントを使ってそれとなく対応してみました。
テキストを1枚の画像にして、端から8*8の画像に切り抜き順々に表示させるイメージです。

```python:
# -*- encoding:utf8 -*-
import unicodedata
import time
import sys
from PIL import Image, ImageDraw, ImageFont
from sense_hat import SenseHat

# 文字列の総バイト数を取得
def count_byte(s):
    n = 0
    for c in s:
        wide_chars = u"WFA"
        eaw = unicodedata.east_asian_width(c)
        if wide_chars.find(eaw) > -1:
            n += 2
        else:
            n += 1
    return n

# SenseHATにスクロール表示
def show_scroll_string(
        disp_str, fore_color = "#ffffff", back_color = "#000000", interval = 0.1):
    '''
        disp_str   = 表示させる文字列
        fore_color = 文字色（省略可）
        back_color = 背景色（省略可）
        interval   = スクロール表示間隔（省略可）
    '''
    matrix_size = 8
    img_width = (count_byte(disp_str) * 4) + (matrix_size * 2)

    sense = SenseHat()
    font = ImageFont.truetype("/misaki_gothic.ttf", # フォントのパスを指定
                              8, encoding="unic")
    img_moto = Image.new("RGB", (img_width, matrix_size), back_color)
    draw = ImageDraw.Draw(img_moto)
    draw.text((matrix_size, 1), disp_str, font = font, fill = fore_color)
    img_moto.save("./img.png", "PNG")

    for num in range(0, img_width - matrix_size):
        img = img_moto.crop((num, 0, matrix_size + num, matrix_size))
        img.save("./img_.png", "PNG")
        sense.load_image("./img_.png")
        time.sleep(interval)
    sense.clear()

# main
show_scroll_string(u"文字列もじれつMojiretsu。", fore_color="#ffff00", interval = 0.07)
```

フォントのパスを指定して、show_scroll_stringの引数に出力する文字列を入れて呼べばスクロール表示されるはずです。
![写真 2016-11-24 20 49 54.gif](https://qiita-image-store.s3.amazonaws.com/0/97488/058c9a20-3827-906f-0345-01dcd9111fed.gif)

そのまま実行・利用する場合は自己責任でお願いします。
<br>
参考にしたサイトなど

* [API Reference - Sense HAT](https://pythonhosted.org/sense-hat/api/)
* [8×8 ドット日本語フォント「美咲フォント」](http://www.geocities.jp/littlimi/misaki.htm)
* [ライブラリ：PIL - Life with Python](http://www.lifewithpython.com/2013/09/pil.html)
* [PILで日本語を使ってみた - ケーズメモ](http://d.hatena.ne.jp/ksmemo/20080903/p1)
* [RubyとPythonで全角文字を半角文字2文字として数える - _dog(underdog)](http://d.hatena.ne.jp/hush_puppy/20090226/1235661269)
IntelliJ IDEAのGit logからIssue Trackerにリンクする

自分のチームではコミットログにIssue番号を書くルールにしていますが、IntelliJのVersion ControlのコミットログからIssueを開けると地味に便利なので設定してみました。

1.Settingsの Version Control -> Issue Navigationを開き、+アイコンをクリックする
JIRAとYoutrackは専用の+アイコンがあるので簡単に設定できるようです
![issue_navi.png](https://qiita-image-store.s3.amazonaws.com/0/387/df5c8977-7efd-abfe-4765-eab1c4c82fda.png)

2.コミットログからIssue番号を抜く正規表現とIssueのURLを設定する
![issue_navi_1.png](https://qiita-image-store.s3.amazonaws.com/0/387/c449c1a3-ac80-6edf-1a55-ed641eb19198.png)

- Issue ID　コミットメッセージからIssue番号を抜く正規表現を記述する。
- Issue link　Issue番号の部分を`$n`で可変にしたURLを指定する。`$0`はマッチした全体が、`$1`～はグループの抽出結果が入ってきます（普通に正規表現が使えるというだけです）

3.Log画面のコミットメッセージのIssue番号の部分がリンクになりました。

![issue_navi_3b.png](https://qiita-image-store.s3.amazonaws.com/0/387/68676856-31c3-24a1-f74f-722c441d7654.png)

ログを見てて、バグの概要などIssueを見たいケースは結構あるのでとても便利な機能だと思います。IntelliJ最高！
SublimeText3ユーザーがShift_JIS案件のためにVisual Studio Codeを使ってみた話

##  SublimeText3とShift_JIS問題
Sublime Text3は軽くて無駄がなくてスタイリッシュで大好き。
でも、Shift_JISだけには勝てない。
Convert to UTF8というプラグインもあるが、単体ではうまく動かず、Codec33というプラグインも必要になる。しかもCodec33を導入してもうまく扱えない時も多い。
私の環境下でもうまくShift_JISを扱ってくれなかった。

## なぜVisualStudioCodeか
最近人気者なので、機会があったらさわってみたかったから。
日本語対応に強い（環境設置も日本語で行えるほど適応している）と聞いていたから。

もともとはGUI・アプリっぽいリッチな画面デザインが嫌いだった。オシャレじゃない。

今回はUTF-8とShift_JISの両方の案件を同時進行で行うことになり、いちいち文字コード設定したり間違えたりが面倒くさかったので、Shift_JISを使うのはVisualStudioCode, UTF-8はSublimeText3とエディタを2つ使い分けたかった。
サブとしてなら許せるかな…と思ったVisualStudioCodeも、使ってみたらとっても便利でした。SublimeText3と比べて便利だと感じた点も書いています。

## 設定した項目
1.設定ファイルを上書き
・文字コードをデフォルトでShift_JISに設定
・タブを2スペースにする
・タブとスペースを同様に扱う
・空白行を表示する
・行を画面サイズで折り返す
2.カラーをmonokaiに設定
3.ターミナルから起動できるようにする


### 1.設定ファイルを上書き
設定系は左上の「Code」（VisualStudioCodeは略称がCodeなんですね）→「基本設定」→「ユーザー設定」からsetting.jsonファイルに書き込む形式。ここはSublimeText3と変わらない。
![スクリーンショット 2016-11-22 18.21.37.png](https://qiita-image-store.s3.amazonaws.com/0/133879/ea1f2bfd-b17d-b804-626a-056dd3a81eff.png)

ちなみにわたしはこのような設定にしています。


```
{　
    "files.encoding": "shiftjis",　
    "editor.tabSize": "2",
    "editor.insertSpaces": true,
    "editor.renderWhitespace": "boundary",
    "editor.wordWrap": true,
    "extensions.autoUpdate": true,
}
```
### 2.カラーをmonokaiに設定
「Code」→「基本設定」→「配色テーマ」から「Monokai」を選択する。


### 3.ターミナルから起動できるようにする
`/usr/local/bin`にシンボリックリンクを貼ってパスを通す。
下記コマンドを叩いてターミナルを再起動すれば、次回からターミナルで
`subl {ファイル名、ディレクトリ名}`
と叩くことでファイルやフォルダごと開くことができる。

```
sudo ln -s "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" /usr/local/bin/subl
```

こちらの記事を参考にしました。
http://qiita.com/hirokishirai/items/6b008623d1ea05b4d92e

## 便利だと思った点
### 日本語ドキュメント
ヘルプも日本語、プラグインも日本語のSublimeText3に比べるとはるかに導入時の心理的負担が少なかった。わからないことをググって解決するまでもなく、ほとんどのことは画面上の説明を見ればわかる。これは意外にとっても便利で時間短縮！

特に良かったのが設定のオプションのページ。
ユーザー設定用ファイルを開くと、オプションが書いてあるページが左側に開いて２画面になりますが（SublimeText3も同じ）、ここに一部日本語がある！基本は英語ですが、一部のオプションは日本語になっていて初見者にはとっても便利だと思いました！
また、デフォルトでプルダウンになっていて、見通しが良く意外と便利！
![スクリーンショット 2016-11-22 16.49.13.png](https://qiita-image-store.s3.amazonaws.com/0/133879/0e6e9ad9-ecd3-a857-0c6d-ecabbcfef5a2.png)


### プラグインの導入が簡単
視覚的に左カラムのリストから選んで追加・削除できるし、追加したプラグインは一覧になるので、SublimeText3のように間違ってインストールして削除が面倒、とかどんなプラグイン入れてたか忘れちゃったとか、更新メッセージが都度きてうるさい…ということがない。更新があるものは更新通知マークが付くので、自分の好きなときにまとめて更新することが出来る。WordPressのプラグインの管理みたい。
![スクリーンショット 2016-11-22 16.35.51.png](https://qiita-image-store.s3.amazonaws.com/0/133879/e7599449-e0c6-e4c2-1924-9d77c4ab5a8d.png)


### ファイルのアイコンが表示できる
「コード」→「基本設定」→「ファイルアイコンの設定」から選べる。
reactのアイコンとか、純粋にかわいい。

<img width="245" alt="スクリーンショット 2016-11-25 21.25.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/cc4521a6-61fd-1195-77e8-1f8f7a2f91ec.png">


### ctrl+shift+@でターミナルを開いて操作できる
`ctrl+shift+@`
画面下（右に開く人もいるかも）にターミナルが開いて、コマンドを叩ける。
npm installしたファイルなどがすぐに確認できて、これ地味にとっても便利！SublimeTsxt3でもできるのかもしれないけど、知りませんでした...
scp コマンドの謎オプション -3

リモートサーバとのファイル転送でよく使う `scp` コマンドでは、 `-3` オプションを使うことで「リモートサーバから別のリモートサーバへ」ファイルを転送することができる。

```
scp -3 foo@host1:/tmp/foo.txt bar@host2:/tmp
```

機能自体はとてもわかりやすいし便利なのだけど、なぜ `-3` ・・・？

## man を見てみる
> -1 Forces scp to use protocol 1.
> -2 Forces scp to use protocol 2.
> **-3 Copies between two remote hosts are transferred through the local host. Without this option the data is copied directly between the two remote hosts.  Note that this option disables the progress meter.**
> -4 Forces scp to use IPv4 addresses only.
> -6 Forces scp to use IPv6 addresses only.

`-1` と `-2` はプロトコルのバージョンを指定するオプション。わかる。
`-4` と `-6` は IPv4 か IPv6 かを指定するオプション。これもわかる。

**・・・もしかして `-3` が空いてたから埋めたかっただけなのでは？？？**

軽くググっては見たものの `-3` の由来はわからず。
クライアント + リモート × 2 の合計3ホストで通信するから `-3` という推測もできるけど、ちょっと強引すぎる気もする。

真実をご存じの方がいましたらコメントいただけると嬉しいです。
UnityのAndroidビルド時にエラー "CommandInvokationFailure: Unable to forward network traffic to device. Please make sure the Android SDK is installed and is properly configured in the Editor. "  が出たときの解決策

#はじめに
Androidプラットフォームで Build And Run したら以下のエラーが出たので、解決までの道のりを備忘録としてまとめてみます。

```
CommandInvokationFailure: Unable to forward network traffic to device. Please make sure the Android SDK is installed and is properly configured in the Editor. See the Console for more details. 
```

Unityのバージョンは**5.5.0b7**、 OSは**Windows 10**です

#解決
http://answers.unity3d.com/questions/1141918/cannot-build-an-android-game-after-updating-unity.html

上記URLのベストアンサーに
>Open the task manager and search for tfadb.exe. End the process and try building the project again.

とあったので、試しにタスクマネージャーで```adb.exe```プロセスを終了してみたら、無事に**ビルドが通るようになりました**。 (完)

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/f1d4c12f-e403-a4ad-a95f-c0243cc40972.png)

#補足
念のため、エラー発生時のBuildSettingsも載せておきます。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/ea629f7e-04d9-2f38-c1e6-d8df7913e9c8.png">
#14 【攻略】RubyWarrior Level5 ~中級編~

今回はRubyWarrior中級編のLevel5です。
クリアしようと思えばすぐクリアできる配置ですね笑

また、今回の攻略はこちらの記事を参考にさせていただきました。
http://tumiki.hatenablog.jp/entry/2015/06/30/222625

#概要
やることは前回と同じですが、敵や捕虜に近づこうとするとき階段が進行方向にあることがあります。
その場合、しっかりと階段を避けて進ませることが大事になってきます。

#スクリプト
```
class Player

  def enemy?(warrior)
    dir = []
    if warrior.feel(:left).enemy?
      dir << (:left) 
    end
      
    if warrior.feel(:right).enemy?
      dir << (:right) 
    end

    if warrior.feel(:forward).enemy?
      dir << (:forward) 
    end

    if warrior.feel(:backward).enemy?
      dir << (:backward) 
    end
      return dir
  end

  def captive?(warrior)
    dir = []
    if warrior.feel(:left).captive?
      dir << (:left) 
    end
      
    if warrior.feel(:right).captive?
      dir << (:right) 
    end

    if warrior.feel(:forward).captive?
      dir << (:forward) 
    end

    if warrior.feel(:backward).captive?
      dir << (:backward) 
    end
      return dir
  end




  def empty?(warrior)
    dir = []
    dir << (:left) if warrior.feel(:left).empty? and not warrior.feel(:left).stairs?
    dir << (:right) if warrior.feel(:right).empty? and not warrior.feel(:right).stairs?
    dir << (:forward) if warrior.feel(:forward).empty? and not warrior.feel(:forward).stairs?
    dir << (:backwarwd) if warrior.feel(:backward).empty? and not warrior.feel(:backward).stairs?
    return dir
  end

      
  def play_turn(warrior)
    dir = enemy?(warrior)
    if dir.length == 1
      warrior.attack!(dir[0])
      return []
    elsif dir.length > 1
      warrior.bind!(dir[0])
      return []
    end
        
      
    if warrior.health < 20
      warrior.rest!
      return []
    end
          

    dir = captive?(warrior)
    if dir.length > 0
      warrior.rescue!(dir[0])
      return []
    end
        
        
    spaces = warrior.listen
    if spaces.length > 0
      dir = warrior.direction_of(spaces[0])

      if warrior.feel(dir).stairs?
        dir = empty?(warrior)[0]
      end
      warrior.walk!(dir)
      return []
    end
    

    dir = warrior.direction_of_stairs
    warrior.walk!(dir)
    return []
  end
end
```

#解説
前回と同じことをするだけなのですが、「階段を避ける」という行動が入っただけでかなり難儀になります。
参考にした方は敵や捕虜の位置を配列に保存していました。とても参考になる使い方でした。
IntelliJ IDEAを2016.3にアップグレードしたらPHPの標準機能が補完できなくなった

追記: 25日に治ったみたいです。対応早いですね！
※PHP Pluginを更新しましょう

---

IntelliJ IDEAを2016.3にアップグレードしたら、PHPの標準の関数やクラス、定数の補完や定義ジャンプができなくなった話。

![image](https://qiita-image-store.s3.amazonaws.com/0/1102/83478fe7-37fd-dc72-5207-3689135d8a6b.png)

この問題は公式のバグトラッカーに既に登録されていて、

- [WI-34002 IDEA 2016.3 Problems with PHP Plugin, and strange menu bar option](https://youtrack.jetbrains.com/issue/WI-34002#u=1479861315758)

これによれば、`.idea/プロジェクト名.iml`のmodule.typeを`JAVA_MODULE`から`WEB_MODULE`に書き換えれば治るそう。

![image](https://qiita-image-store.s3.amazonaws.com/0/1102/1316398e-267b-b2ee-cb9a-b2e6f950ad08.png)

実際に書き換えた後PJを再起動したら無事に補完や定義ジャンプが動くようになった。尚、PhpStormでも同様の問題が起きているかは不明。
Bluemix Infrastructure(SoftLayer)の仮想サーバーにディスクを追加してみました

<font color="blue">SoftLayerは、2016年10月よりBluemixに統合されIBM Bluemix Infrastructureとなりましたので、Bluemix Infrastructureと表記します。</font>
# 1. はじめに
  クラウドだから仮想サーバーにディスクを追加できるのは当然ですが、何か注意点があるかと思い、実際に試した備忘録です。
  
# 2. 環境
OSはWindows2012R2。
仮想サーバーのディスクはSAN。OS領域のCドライブ用に100GB、データ領域のFドライブ用に50GBの容量でデプロイしました。
 
# 3. ディスクの追加
デプロイした環境に、Fドライブとして100GBを追加し、さらに75GB追加しています。
![01.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/01.png)

## 3-1. デプロイ直後の状態
「コンピュータの管理」⇒「ディスクの管理」で確認
![02.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/02.png)
・ディスク０--- OS領域(100GB)
・ディスク１--- スワップ領域(2GB)
・ディスク２--- データ領域Fドライブ(50GB)
が確認できました。
Fドライブにテストデータを保存し、以降のディスク追加操作でデータが消失しないかも合わせて確認します。
ここでは、空き領域100MBになるまでテストデータを保存しました。

![03.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/03.png)


## 3-2. 100GBの追加
上記 ”3-1” の構成に100GBを追加します。
「Bluemix Infrastructureポータル」⇒「デバイス」⇒「デバイスリスト」⇒”該当デバイスをクリック”⇒「構成タグ」⇒「デバイス構成の変更」
![04.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/04.png)
![06.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/06.png)
![07.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/07.png)
Third Diskとして100GBを追加オーダーしました。
OSブートせず、１０分ぐらいでディスク追加完了です。
>仮想サーバーのディスクについて
仮想サーバーのディスクタイプとして"local"と”SAN”があります。
![05.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/05.png)
>

追加したディスクを「ディスクの管理」操作で、OSから利用できるようにします。
ディスク３が追加されました。
![08.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/08.png)
ここでは、ディスクパーティションタイプを”GPT”にしました。
>ディスクパーティションタイプについて(MBRとGPTの違い)
詳細はウィキペディアのGPTが参考になります。
https://ja.wikipedia.org/wiki/GUID%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB
>

![09.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/09.png)
「ディスク２」のあたりで右クリック⇒「ボリューム拡張」

ボリューム拡張ウィザードが起動します。
![10.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/10.png)
「次へ」

![11.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/11.png)
「ディスク３」を選択⇒「追加(A)」

![12.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/12.png)
「次へ」

![13.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/13.png)
「完了」

HDDの扱いにはベーシックディスクとダイナミックディスクがあり、
(1)ベーシックディスク
1台のHDDをパーテーションで区切って複数台のHDDとして使用できる。
パーテーションの数はMBRで4、GPTで128。
(2)ダイナミックディスク
1台のHDDに1パーテーションのみで、複数台のHDDに渡ってボリュームを作成できる。
ドライブの分割はパーテーションではなく、ボリュームという形で論理的に区切る。

ここでは、OSはWindows2012R2のみで、Fドライブを拡張し使用しますので、ダイナミックディスクに変換します。
![14.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/14.png)
「はい」
※ベーシックディスクからダイナミックディスクへはそのままで変換できますが、ダイナミックディスクからベーシックディスクへの変換はHDDが空の必要があります。

Fドライブが拡張しました。
![15.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/15.png)

Fドライブにあったテストデータもそのままで拡張しました。
![16.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/16.png)

## 3-3. さらに75GBの追加
"3-2"と同じ操作で、ディスクを75GB追加します。
ここでは、将来容量不足により、ディスク拡張できるかを念のため確認しました。

Fourth Diskに75GBをオーダー。
![17.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/17.png)

特に問題なく、Fドライブが拡張されました。
![18.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/18.png)
![19.png](http://seahorse-inc.com/QIITA/VSI-DISKADD/19.png)

# ４. おわりに
当然と言えばそれまでですが、データを残した状態でかつ、OSの起動をしないでディスクの拡張ができる事が確認できました。
また、何が起こるかわかりませんので拡張作業前には必ず、バックアップを取りるようにします。
CLIP STUDIO PAINTで作成した漫画データのサムネール出力の為の調査

# 参考ページ
[CLIP STUDIO PAINTの.lipファイルをハックして作業動画を書き出すWindowsアプリを作った &#8211; NET BIZ DIV. TECH BLOG](https://tech.recruit-mp.co.jp/etc/building-lip-to-animated-gif-converter-named-lip2gif/)
[イラストを Git で管理したかったのでツールをつくった - blog.syfm](http://syfm.hatenablog.com/entry/2016/10/25/183044)

# 思いつき
上記ページを見ていて、もしかしたら漫画制作時のcmcファイルもsqlite3のデータなんじゃないかと思い、sqliteに通してみたら案の定sqlite3のデータベースファイルになっていた。

![97fd553a212f1691a1a87d99134e495e56b2b8db.png](https://qiita-image-store.s3.amazonaws.com/0/8822/8a9acdad-a2cd-a447-f68e-e22cd8c2eac5.png)

# ページ順の取得
テーブルが存在するということは各clip/lipファイルを指し示す部分があるはずという事で**CanvasNode**を見てみると、**LinkPath**に「*ディレクトリ相対パスっぽいの*:*ファイル名*」という形式で含まれているのが判ったため、CanvasNodeで順番さえとれれば、参考ページにあるようなサムネール抽出をページ順に名前付けして出せそうだという事が判った。

しかし、ナイーブツリーなパターンだったので一発で抽出するには再帰クエリが必要だった。

## 仕様っぽいの
1. LinkPathがNULLのデータがツリールート
2. ツリールートからは*FirstChildIndex*を参照して最初のページ情報を取得出来る。
3. *_PW_ID***ではなく***MainId*が各インデックス参照に利用されている。
4. 2ページ目以降は*NextIndex*が次のページ情報を指し示している。
5. *NextIndex*が0になったら最終ページ

ただし、単純な漫画用データを見た結果なのでこれで全て扱えるかというと多分違う。

## 実験
```sqlite3:example.sql
WITH RECURSIVE r2 AS (
    WITH RECURSIVE r1 AS (
        SELECT CanvasNode.* FROM CanvasNode WHERE NextIndex = 0 AND LinkPath is NULL
        UNION ALL
        SELECT CanvasNode.* FROM CanvasNode, r1 WHERE CanvasNode.MainId = r1.FirstChildIndex
    )
    SELECT * FROM r1
    UNION ALL
    SELECT CanvasNode.* FROM CanvasNode, r2 WHERE CanvasNode.MainId = r2.NextIndex
)
SELECT LinkPath FROM r2 WHERE LinkPath IS NOT NULL;
```

![a3228bf6da71fb1c01afbe9910bf9502eeaa74b9.png](https://qiita-image-store.s3.amazonaws.com/0/8822/317e7736-6471-bb0c-84d7-b3341d77b95b.png)
> 画像のクエリでは一部*_PW_ID*見てるけど、たまたま*_PW_ID*と*MainId*が同じレコードを指してたので大丈夫だった。

## 各clip/lipファイルから画像を抜く
とりあえず実験の為、参考ページにあった画像抽出コマンドを書いておく。

```bash
sqlite3 page0010.lip "SELECT quote(ImageData) FROM CanvasPreview" | cut -d\' -f2 | xxd -r -p > page10.png
```
> コマンドでやる場合は直接SELECTしても上手く通らないのでquoteで16進数文字列に変換してからシングルクオートを取り除いたものをバイナリに戻してファイルにリダイレクトしてるのか。なるほど。

![879ae88d18ba959f113fec4d3d8d04f6f6beda35.png](https://qiita-image-store.s3.amazonaws.com/0/8822/80cb07e2-bfe2-47d2-6670-6f8fc2ee1f27.png)

![a9cb9c090087547f6d13e65701981c9486f20fde.png](https://qiita-image-store.s3.amazonaws.com/0/8822/d9dc7805-9e74-ceab-aafe-98c1f6ac2a60.png)


## 雑感
なにか作りたい。golangで。
Slack | GoogleCalender と連携して 他の人の予定を公開チャンネルで通知する

# 1. GoogleCalender での操作

「他のカレンダー」で、連携したいカレンダーを登録しておく。
(ここで登録しないと、Slack側で選択肢として出てこない)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/bc5407d0-6be6-077d-21af-52fbdf020f51.png)

# 2. Slack での操作

https://aiming.slack.com/services/gcalendar から「連携元のカレンダー」と「Slackのチャンネル」を選ぶ。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/66f432d7-e9ef-a452-4efc-2b10d60dc839.png)

これだけ。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
リガチャ（合字）を使ってコードをかっこよくしよう -WebStorm・IntelliJ IDEA編-

プログラミングコードには多くの記号が必要です。例えばJavaScriptでは、２つの値が同じかどうかを比較する等価演算子として、`=`を２つ並べて次のように記述します。

```js
a == b
```

ある値がある値よりも大きいまたは等しいかどうかを調べるには、`>`と`=`を用いて下記のように記述します。

```js
a >= b
```

コードを読む場合、 `=`という文字が、`=`単体の意味なのか、`==`と繋がるのか、脳内で判断をするストレスがあります。

これに対し、1つの意味を1つの文字で表してコード全体の可読性向上を図るのが、**リガチャ（合字）**です。リガチャを用いると、前述の等価演算子と関係演算子は下記のように記述可能です。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/fe673ebf-18d9-d567-bbdd-05eac4e66092.png)


# IntelliJ IDEAやWebStormではリガチャを使用可能

JetBrains製のIDEである[IntelliJ IDEA](https://www.jetbrains.com/idea/)や[WebStorm](https://www.jetbrains.com/webstorm/)等の2016.3では、リガチャを用いることができます。記号と文字を一対一で対応させることができるので、すっきりとコードを記述可能です。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/08880a8f-6da4-f433-1f51-92aad3e4fdf3.png)

# リガチャの設定方法
リガチャは全てのフォントで使えるわけではなく、リガチャに対応したフォントを用いる必要があります。
今回は[Fira Code](https://github.com/tonsky/FiraCode)というリガチャ対応フォントを用います。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/75ee45de-7a3b-a3ff-fe2e-da805e768a23.png)

[GitHub](https://github.com/tonsky/FiraCode)にアクセスし、[Solution]→[Download v~]の箇所より、フォントをダウンロードします。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/e3d7432c-9ba2-4afb-a6ea-b8d8b241dcea.png)

macOSの場合は、**.ttf等のファイルをダブルクリックすればフォントをインストールできます。

WebStormを起動し、[Editor]→[Color & Fonts]→[Font]よりフォント設定ウインドウを開きます。[Primary font]を**[Fira Code]**に選択し、**[Enable font ligatures]**にチェックを入れます。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/c2c3f1ae-3363-0337-07cf-9e5a7f62df58.png)

以上で、WebStorm(IntelliJ IDEA)で記述するプログラミングコードにおいて、リガチャが使用可能となります。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/e68aecf9-18b9-d007-85e3-53dd9e895139.png)

# (2016/11/25追記)リガチャはフォントの見た目を変えるだけ
本エントリー公開後に質問をいただいたのですが、**リガチャはあくまで「フォントの見た目」を変えるだけであり、コードそのものを書き換えるわけではありません**。

```js
// 等価演算子
a == b

// 比較演算子
a >= b
```

のコードと、

![](https://qiita-image-store.s3.amazonaws.com/0/67884/fe673ebf-18d9-d567-bbdd-05eac4e66092.png)

のコードは、見た目が違うだけで全く同じものです。WebStorm(IntelliJ IDEA)から、リガチャに対応していないエディターにコピペしてみると、リガチャの見た目が解除されるのがわかります。

また、GitHubのフォントはリガチャに対応していないため、前述のコードをGitHubにアップした場合、リガチャの見た目は解除されます。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/41f93db2-8e41-ddfa-8ff0-27c9c87c1be2.png)

コードを特殊なものに書き換えるわけではないので、リガチャゆえにプログラムが動作しなくなることはありえませんのでご安心ください。
Swiftでurlからhost名抽出の際にはNSURLComponentsを使った方が良さ気

元々はNSURLのhostメソッドを使っていたのですが、NSURLのhostメソッドは `RFC 1808` に準拠しており、以下のようなURLではnilが返ってきてしまうようだ。

```
http://test.com?abc
```

なので、単純にhost名だけが欲しい場合は、NSURLComponentsのhostメソッドを使った方が安全だと思いました。

```
let url: String = "http://test.com?abc"
if let component: NSURLComponents = NSURLComponents(string: url) {
    print(component.host)  // Optional("test.com")
}
```
chanko でラッパーのdivを出力しない方法

インライン要素を出したい時とか、head内に出したい時とか、標準で出力される `<div class="unit unit~~">` が邪魔だったので出力しないで済む方法がないか探したところ、 `:type` に `:plain` を設定すれば良い模様。

- `:type => :plain` ラッパー出力しない
- `:type => :inline` ラッパーをspanタグで出力する

```ruby
# :type => :plain renders the view without any wrapper
# :type => :inline renders the view with a span element wrapper
# default is a div
invoke(:sample, :some_method, :type => :plain)
```