OmniAICreator/Qiita-1.07M huggingface dataset:
Brocade 5400 vRouter（※vyatta） config-syncの設定方法

#*Brocade 5400 vRouter config-syncの設定方法*
Brocade 5400 vRouter（以下vyatta）でつまったので備忘録的に書きます。
基本この記事では、vyattaをVRRPでマスター・バックアップ2台構成されていること
念頭に記事を書いています、予めご了承ください。

##config-syncとは
vyattaの設定同期のための機能です、指定した設定のみ同期されます。
仮想的に1台に見せる機能ではなく、config-syncはあくまで設定同期を行うためだけの機能です。
冗長化の機能は別途VRRPが用意されています。

また、config-syncは設定によって
マスター・バックアップ関係なくどちらからでも設定反映させることもできます。

#*config-sync事前設定*

##https有効化
vyattaではconfig-syncはhttpsでやりとりされます。
そのためhttpsを有効化しなければconfig-syncは行なえません
※httpsを有効化＝GUI有効化
コンフィグモードへ移行させ以下のコマンドを入力してください。

```
#set service https
```

これだけでconfig-syncの設定として大丈夫ですが、
このままだと、どのIPアドレスでもGUIでアクセスできてしまい
セキュリティ的にあまりよろしくありません。

ですので、以下のコマンドを入力すると特定IPアドレスをGUI用のアクセス先に設定できます。

```
#set service https listen-address <<IPアドレス>>
```

ここまでコマンド入力したら一旦設定を適用してください

```
#commit
```
※vyattaでは多くの設定を適用させようとすると、うまく適用されない場合があります。
 念の為こまめに適用が安全です。

##config-sync用ユーザー作成
config-syncではユーザーアカウントが必要になります。
5400の仕様上パスワードが暗号化されないので
ログインユーザーとは別途用意した方がおすすめです。

以下のコマンドで設定を反映させたい機器にユーザーを作成してください。

```
#set system login user <<任意のユーザー>> authentication plaintext-password <<任意のパスワード>>
#commit
```

#*config-sync*
冒頭でも説明しましたが、config-syncでは任意にマスター・バックアップどちらからでも、
設定を反映させることができます。

ですので、要件に伴い
・マスター・バックアップ両方から設定反映
・マスター・バックアップ片方のみから設定反映

以上のことが実現できます。

##config-sync設定コマンド
設定の反映元としたい機器に以下のコマンドを入力してください。

```
#set system config-sync remote-router
#set system config-sync remote-router <<宛先IPアドレス>＞ username <<宛先機器ユーザー名>>
#set system config-sync remote-router <<宛先IPアドレス>＞ password <<宛先機器パスワード>>
#commit
```

※この際のIPアドレスは宛先機器にて[set service https listen-address ]コマンドを
 設定した場合、指定したIPアドレスでなければ、反映が失敗します。ご注意ください。

##sync-map設定
config-syncではsync-mapで反映させたい設定を定義できます。
sync-mapでは以下の仕様があることを認識してください
・ACLのように[rule]のシーケンス番号の順序で設定の反映が動きます
・[action include]で反映させたい設定定義でき、[action exclude]で設定の反映除外できます
・定義させたい設定項目は[location]で設定できます。設定項目が小項目の場合で['']囲まないと適用できません。
・[location system]の場合、config-syncの設定まで反映はできません。



まず以下のコマンドでsync-map名を設定してください


```
#set system config-sync sync-map <<任意の名前>>
```

次に設定の順序と動作、項目を設定します。

```
#set system config-sync sync-map <<任意の名前>> rule 1 action ［include/exclude]
#set system config-sync sync-map <<任意の名前>> rule 1 location <<任意の設定項目>>
#commit
```

ここで注意したいのが仕様上[location]で指定した項目はすべて反映されてしまいます。
例えば以下の設定例をご確認ください

```
#set system config-sync sync-map sample rule 1 action include
#set system config-sync sync-map sample rule 1 location service
#commit
```

この設定だと、大項目[service]の設定はすべて反映されてしまいます。
先程設定したhttpsの設定やsshの設定等まで全て反映されてしまうのです。

ですので設定を除外したい場合は[exclude]を使用して以下の例のようにします。

```
#set system config-sync sync-map sample rule 1 action exclude
#set system config-sync sync-map sample rule 1 location 'service https'
#set system config-sync sync-map sample rule 2 action exclude
#set system config-sync sync-map sample rule 2 location 'service ssh'
#set system config-sync sync-map sample rule 3 action include
#set system config-sync sync-map sample rule 3 location service
#commit
```

シーケンス番号順で設定の反映が動きますのでhttpsの設定やsshの設定を除外でき、
それ以外の設定を全て反映できます。

sync-mapを設定し終えたら最後に以下のコマンドでconfig-syncと紐付けてください。

```
#set system config-sync remote-router <<宛先IPアドレス>> sync-map <<sync-map名>>
#commit
#save
```
以上でconfig-syncの設定方法は終わりです。
Android OCRライブラリ tess-two

## OCRライブラリ tess-two


https://github.com/rmtheis/tess-two

AndroidでOCRライブラリを利用する必要があり、有名どころっぽいtess-twoを試してみることに。
今回は日本語の読み込み精度を見ることが目的なので、サンプルアプリを利用して動作確認をする。

## サンプルアプリを実行する

サンプルプロジェクトをクローン

```
git clone https://github.com/bieliaievays/Tess-two_example
```


サンプルではtess-twoのバージョンが古いので最新にしておく

```groovy:build.gradle
dependencies {
    compile 'com.rmtheis:tess-two:6.3.0'
}
```

今回は日本語を試したいので、下記から日本語データをダウンロードし
https://github.com/tesseract-ocr/tessdata

下記ディレクトリに追加しておく

```
/assets/tessdata/jpn.traineddata
```


MainActivityの定数を`eng`から`jpn`に変更

```java:MainActivity
private static final String lang = "jpn";
```

これで準備が整ったのでアプリを実行

## 結果

準備中
Dockerで Python + Anaconda(miniconda)の環境構築をする　コマンドリスト

#イメージをダウンロード

$ docker pull continumio/miniconda3

#コンテナを利用
$ docker run -i -t continuumio/miniconda3 /bin/bash

#一時停止
ctrl+p
ctrl+q

#終了
exit

#コンテナ情報表示
$ docker ps -a

#コンテナ保存
$ docker commit 0e66d08d0757 mlearn:init

#コンテナ再開
NumPy でデータセット (ndarray) を任意の割合に分割する

# 方法

[numpy.split()](https://docs.scipy.org/doc/numpy/reference/generated/numpy.split.html) を使います。

## (例 1) データセットを train : test = 7 : 3 に分割する

```py
import numpy as np

ds = np.arange(128)  # array([0, 1, 2, ..., 127])

train, test = np.split(ds, [int(ds.size * 0.7)])

train  # array([[0, 1, ..., 88])
test   # array([[89, 90, ..., 127])

train.size  # 89 ≈ 128 * 0.7 = 89.6
test.size   # 39 ≈ 128 * 0.3 = 38.4
```

## (例 2) データセットを train : test : validation = 6 : 2 : 2 に分割する

```py
import numpy as np

ds = np.arange(128)  # array([0, 1, 2, ..., 127])

indices = [int(ds.size * n) for n in [0.6, 0.6 + 0.2]]  # [76, 102]
train, test, validation = np.split(ds, indices)

train       # array([0, 1, ..., 75])
test        # array([76, 77, ..., 101])
validation  # array([102, 103, ..., 127])

train.size       # 76 ≈ 128 * 0.6 = 76.8
test.size        # 26 ≈ 128 * 0.2 = 25.6
validation.size  # 26 ≈ 128 * 0.2 = 25.6
```

# 参考

* [numpy.split](https://docs.scipy.org/doc/numpy/reference/generated/numpy.split.html)
* [numpy.ndarray](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html)
docker-compose "up" " run" "start" コマンド 違い

## docker-compose up
👉 docker-compose.ymlで定義した<b>サービスを開始または再起動する</b>

*  デフォルトは「アタッチド」モードであり、全てのコンテナのログが画面上に表示される。
*  「デタッチド」モード（ -d ）では、Compose はコンテナを実行すると終了するが、コンテナは後ろで動き続ける 。

## docker-compose run
👉 「ワンオフ」（one-off；１つだけ、偶発的） または「アドホック」（adhoc；臨時）な<b>タスクを実行 する</b>

* 実行するにはサービス名の指定が必要であり、特定のサービス用のコンテナを起動し、かつ依存関係のあるコンテナも起動する 。
* テストの実行であったり、データ・ボリューム・コンテナに対するデータの追加・削除といった管理タスク。
*  run コマンドは実際には docker run -ti。 コンテナに対してインタラクティブなターミナルを開き、コンテナのプロセスが終了すると、その時点の該当する終了コードを返す。

##  docker-compose start
👉 既に作成済みの<b>コンテナを再起動 する</b>

* 止まっているコンテナを起動するだけであり、新しいコンテナは作成しない。
UnityでNowLoading画面を作る(C#版)

# ゲームのよくあるローディング画面を作りたい
http://gametukurikata.com/program/nowloading
を参考にした。しかし記載されていたのがjavascript版であった為、C#版を作成してみた。

```C#:LoadingScene.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class LoadingScene : MonoBehaviour {

    private AsyncOperation async;
    public GameObject LoadingUi;
    public Slider Slider;

    public void LoadNextScene() {
        LoadingUi.SetActive(true);
        StartCoroutine(LoadScene());
    }

    IEnumerator LoadScene() {
        async = SceneManager.LoadSceneAsync("[シーン名]");

        while (!async.isDone) {
            Slider.value = async.progress;
            yield return null;
        }
    }
}
```

# 実行結果
PCだと読み込みが早すぎてよく分からないが、こんな感じでロード画面を挟める。
![load.gif](https://qiita-image-store.s3.amazonaws.com/0/177027/83f3904d-7572-b25f-b71f-8575756c00e1.gif)
※読み込み後のシーンは気にしないでください。
ActiveRecord::Enum で Integer から文字列に逆変換する API がないのかと

次のような ActiveRecord::Enum を使ったモデルがあるとする。

```rb
class FooModel < ApplicationRecord
  enum bar_type: [
    code_1: 1,
    code_2: 2,
    code_3: 3
  ]
end
```

外部からコード値が渡される機会があり、 `1` => `"code_1"` のように逆変換して文字列を取得し、 `#bar_type=` に設定しするため、以下のようなコードを仕方なく書いた。

```rb
bar_value = 1 # 外部から渡される値

foo = FooModel.new
foo.bar_type = FooModel.bar_types.invert.fetch(bar_value)
```

ActiveRecord::Enum のソースコード眺めていて、「あれ？もしかして？」と試したら、次のようなコードで十分だった。

```rb
foo.bar_type = bar_value
```

`Integer` を直接突っ込むという発想に至らなかった。
「値に0を持つ(連想)配列」にarray_search掛けると新世界が開くんだよな。

春ですね・・・・

---

求めてないんだよな〜〜〜っていう結果が返ってくるので病む。
![image](https://qiita-image-store.s3.amazonaws.com/0/941/1b31fb24-906c-de07-6f73-d134ed36de1c.png)

これだけ見ると、

```diff
-- ✕ array_searchは対象の$arrayの内に$needleが見つかった場合に対応する最初のキーを返す
++ ◯ array_searchは対象の$arrayの内に$needleが見つかった場合に対応する最初のキーを返すし見つからなくても違う値を返すぜ！！
```

って説明になる

![image](https://qiita-image-store.s3.amazonaws.com/0/941/684ff003-11ba-47df-4d15-678dc8ba666c.png)

厳密な型比較いれましょう
Polymerドキュメント(日本語) Shadow DOM & styling/DOM templating 〜DOMテンプレート〜

[目次へ移動](http://qiita.com/jtakgiuchi/items/e5160ba7d039ca5b05a4)

[翻訳ドキュメントの管理ページ](https://github.com/jtakiguchi/polymer-docs-japanese-translation)

多くの要素は、その機能の実装にDOM要素のサブツリーを利用しています。DOMテンプレートを利用することで、要素にDOMのサブツリーを簡単に作成することができます。

デフォルトでは、要素にDOMテンプレートを追加すると、Polymerは要素にShadow Rootを作成し、テンプレートをShadow Tree内部に複製(clone)します。

また、DOMテンプレートによってデータバインディングと宣言型イベントハンドラが利用できるようになります。

## DOMテンプレートの概要

要素のDOMテンプレートを記述するには：

1. 要素の名前と同名の`id`属性を持つ`<dom-module>`要素を作成します。
2. `<dom-module>`の内部に`<template>`要素を作成します。

Polymerは、このテンプレートの内容を要素のローカルDOM内部に複製(clone)します。

例：

~~~html
<dom-module id="x-foo">

  <template>I am x-foo!</template>

  <script>
    class XFoo extends Polymer.Element {
      static get is() { return  'x-foo' }
    }
    customElements.define(XFoo.is, XFoo);
  </script>

</dom-module>
~~~

この例では、DOMテンプレートとその要素を定義するJavaScriptが同じファイルにあります。これらを別々のファイルに分割して配置することもできますが、DOMテンプレートの解析は要素が定義される前に行われる必要があります。

> **注意**：テスト環境を除き、要素はメインドキュメントの外で定義すべきです。メインドキュメント内における要素の定義に関する注意事項は、[main document definitions](https://github.com/jtakiguchi/polymer-docs-japanese-translation
/blob/master/docs/polymer2/custom-elements/define-an-element.md#main-document-definitions)を参照してください。

## ノードの自動探索

Polymerは、要素がDOMテンプレートを初期化する際に、ノードIDの静的マップを作成し、頻繁に使用されるノードに手軽にアクセスできるようにします。手動でクエリを記述する必要はありません。要素のテンプレートに`id`付きで記述されたノードはそれぞれ、`id`によってハッシュ化され`this.$`として格納されます。

> 注意：データバインディングを使用して動的に作成されたノード(`dom-repeat`テンプレートや`dom-if`テンプレートによるものが含まれます)は、ハッシュ`this.$`には追加されません。ハッシュには、静的に作成されたローカルDOMノード(つまり要素の最も外側のテンプレートに定義されたノード)だけが含まれます。

例：

~~~html
<dom-module id="x-custom">

  <template>
    Hello World from <span id="name"></span>!
  </template>

  <script>
    class MyElement extends Polymer.Element {
      static get is() { return  'x-custom' }
      ready() {
        super.ready();
        this.$.name.textContent = this.tagName;
      }
    }
  </script>

</dom-module>
~~~

要素のShadow DOM内に動的に生成されたノードを配置する場合、標準DOMの`querySelector`メソッドを利用してください。

~~~javascript
this.shadowRoot.querySelector(selector)
~~~
Ectoでカスタムバリデーションを追加する

### 概要

カスタムバリデーションの追加時は、下記を満たす関数を定義して、changesetのバリデーションに使用する。

 - 引数としてchangesetそのものを取る
 - バリデーション条件に合致するデータはそのまま返す
 - バリデーション条件にハッチしないデータに対してはエラーを追加して返す。




### 例

例えば、英数のみを許容すると言ったバリデーションは下記のように定義する。

```exs:custom_validation
     def validate_alphanumeric(changeset,field_name) do
       field_value = get_field(changeset, field_name)
       validate_alphanumeric_p(changeset, field_value)
     end
 
     defp validate_alphanumeric_p(changeset, nil) do
         add_error(changeset, :alphanumeric, "invalid data")
     end
     defp validate_alphanumeric_p(changeset,field_value) do
       if Regex.match?(~r/^[0-9A-z]+$/, field_value) do
         changeset
       else
         add_error(changeset, :alphanumeric, "must be number or alphabet")
       end
     end
```

定義したバリデーションを、changesetに対して使用する

```exs:changeset
def changeset(user, params \\ %{}) do
    user
    |> cast(params, [:user_id])
    |> validate_alphanumeric(:user_id)
end
```



### 余談
「フィールドに対して英数のみを許容する」バリデーションであれば`validate_format`を使用して下記のように書けば良い

```exs:validate_alnum
def changeset(user, params \\ %{}) do
    user
    |> cast(params, [:user_id])
    |> validate_format(:user_id, ~r/^[[:alnum:]]+$/)
end
```
チームメンバー共有メール（Gmail）をSlackに通知しよう

# 概要

サポートや問い合わせ用のチーム共有メール（Gmail）をSlackに通知する方法です
有料プランだとメール転送という手段が使えるが、残念ながら無料プランのため自力で頑張るしかない

# 実装概要

仕組みはGoogle App ScriptでGmailをタイマー付きで監視し、メールが来たらSlackに通知する流れ

## 仕様

Google App ScriptでGmailをタイマー(分、時間、日、月、年)で監視し、
監視間隔内に来たメール（迷惑メール、削除済みメール、チャットを除く）をすべてSlackに通知する

例えば、タイマーで1分間隔に設定していた場合は、1分前から現在（実行時）に来たメールを通知する


## 手順

以下の手順では[こちらのソース](https://github.com/comefigo/gmail-to-slack)をもとに解説します

0. [Slack Web hooks url](http://qiita.com/vmmhypervisor/items/18c99624a84df8b31008)の取得
1. 通知させたいGoogleユーザでログイン
2. 新規[Google App Script](https://www.google.com/script/start/)を作成
3. プロジェクト名は任意の名前を入力
4. コードには、[Main.gs](https://github.com/comefigo/gmail-to-slack/blob/master/Main.gs)の内容を張り付け
5. 以下の箇所を修正してください

    ```
    var postUrl = "<slack incoming webhooks url>"; // 手順0で取得したIncoming Webhooks url
    var postChannel = "<#chanel name>"; // #チャンネル名
    var dateSpanMin = 1; // 監視期間（分単位） 後述のスクリプトタイマーで設定する値（分単位で）と同じにしてください
    var userName = 'Gmail'; // Slackに表示される投稿者名（Slackに実在しなくてもOK）
    ```

6. Slackで受信する際のアイコンを設定する場合は以下を修正してください（任意）

    ```
    "icon_emoji": ":email:"
    ```

7. [実行タイマーの設定](http://pineplanter.moo.jp/non-it-salaryman/2016/05/20/google-apps-script-minute-timer/)


## ちょっとしたハマりポイント

gmailをdatetimeでクエリする際に、unixtimeじゃないと絞れない
また、unixtimeは10桁でなければないことがハマりポイントでした

```
var nowDate = new Date();    // 開始時間
var unixNowTime = nowDate.getTime();  // unixtimeに変換
var pastTime = unixNowTime - (dateSpanMin * 60 * 1000); // n分前のunixtime

// 10桁のみ使用
var q = "before:" + String(unixNowTime).substring(0, 10) + " after:" + String(pastTime).substring(0, 10);

// Gmailをクエリ
var threads = GmailApp.search(q);
```


## リファレンス

- [Gmail検索用演算子](https://support.google.com/mail/answer/7190?hl=ja)
- [Gmail Api](https://developers.google.com/apps-script/reference/gmail/gmail-app)

# 参考
https://gist.github.com/matsuyoro/c53d82017b2763633e5b
Bundler gem を利用して Ruby の依存 gem の一覧をプログラムで扱えるようにする

やんごとなき理由により Gemfile.lock もしくは gemspec から gem 名の一覧を Ruby の処理中に取得し、
その結果をゴニョゴニョする必要がありました。

## <i class='fa fa-flask'></i> サンプル
以下の gemspec と Gemfile を元に検証します

### <i class='fa fa-wrench'></i> gemspec
```ruby:gemspec
Gem::Specification.new do |spec|
  spec.name          = "hoge"
#略
  spec.add_dependency 'dotenv', '~> 2.1'
  spec.add_dependency 'thor', '~> 0.19'

  spec.add_development_dependency 'simplecov', '~> 0.10'
  spec.add_development_dependency 'yard', '~> 0.8'
end
```

### <i class='fa fa-lock'></i> Gemfile
```ruby:Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

gem "bundler"
gem "pry"

group :development do
  gem "tapp"
end

group :test do
  gem "kosi"
end

gemspec
```

## <i class='fa fa-cube'></i> gemspec の読み込み
```
require "bundler"
require "pp"

gemspec = Bundler.load_gemspec_uncached("hoge.gemspec")
pp gemspec.dependencies.map(&:name)
```

* 出力

```
$ bundle exec ruby gemspec_sample.rb
["dotenv", "thor", "simplecov", "yard"]
```

## <i class='fa fa-cube'></i> Gemfile.lock の読み込み
```ruby
require "bundler"
require "pp"

locksrc = File.read(Bundler.default_lockfile.to_path)
lockfile = Bundler::LockfileParser.new(locksrc)
pp lockfile.dependencies.map(&:name)
```

* 出力

```
["bundler", "kosi", "pry", "simplecov", "hoge", "tapp", "yard"]
```
Rantly(property based testing tool)でテストデータ生成 - guard

Rantly#guard でランダムに生成されたデータに特定の条件をつけます

## <i class='fa fa-question-circle'></i> 関連記事
[tbpgr の rantly 関連記事](http://qiita.com/search?utf8=%E2%9C%93&q=user%3Atbpgr%20tag%3Arantly)

## <i class='fa fa-flask'></i> サンプル
```ruby
Rantly(5) { i = range(1, 10); guard i.even?; i }
# => [8, 4, 2, 2, 4]
Rantly(5) { i = range(1, 10); guard i.even?; i }
# => [6, 2, 8, 4, 10]
Rantly(5) { i = range(1, 10); guard i.odd?; i }
# => [9, 5, 3, 1, 7]
Rantly(5) { i = range(1, 10); guard i.odd?; i }
# => [3, 7, 3, 3, 9]
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [abargnesi/rantly](https://github.com/abargnesi/rantly)
XCode8.3.1+openframeworks v0.9.8で、Apple Mach-O Linker Errorが出た時の対処

#openframeworksをちょっと試してみたいと思ったけど...
openframeworks（正確にはopenframeworks+openCV)を試したいと思い、おもむろにXCodeの最新版である8.3.1(2017/04/26時点)とopenframeworksの最新版を入れてExampleの中のサンプルを順番に試していこうと思ったところ、1つめはなんとか大丈夫だったものの、それ以降はApple Mach-O Linker Errorが多発して全く試せない状況に・・。

#調べて見たものの...
Apple Mach-O Linker Errorについては結構情報が引っ掛かるのだけれど、現在のXCodeのバージョンとopenframeworksの組み合わせでの発生についてはあまり書いてるところが見当たらず、仕事が終わって帰ってきてから少しだけ作業時間が取れる状況で2，3日潰れてしまった・・・。

#対処方法
で、まあ対処方法なんですが、プロジェクトのBuild Settingsの所の上の方にあるArchitecturesの項目の中の「Build Active Architecture Only」の項目をNoからYesに変えるという方法です。一応これであっさり通るようになりました。

以下参考にしたopenframeworksのGitHubのIssueへのリンクです。
https://github.com/openframeworks/openFrameworks/issues/4424

上のリンクにはもう一つ$(CURRENT_ARCH)にライブラリを足せみたいな事が書いてあるけど良くわからなかった・・。

また今度やってみます。
Git GUIの便利な機能

# 環境
- Windows 10
- Git for Windows: 2.12.2

# `git add -p`をGUIで
同じファイル内での全ての変更を一度にコミットせず、分割したいときに使います。
コマンドラインでは下記の記事が詳しいです。

- 参考: [横着で神経質な私とあなたに贈るgit add -p - Qiita](http://qiita.com/crifff/items/1abf08bca4ce51db4775) [![hatena bookmark](http://b.hatena.ne.jp/entry/image/http://qiita.com/crifff/items/1abf08bca4ce51db4775)](http://b.hatena.ne.jp/entry/http://qiita.com/crifff/items/1abf08bca4ce51db4775)

上の記事と同じ例で進めます。
下のようなテキストファイルを作成しコミット。

```txt:members
1: 島村卯月
2: 渋谷凛
3: 本田未央
4: 前川みく
5: 高森藍子
```

その後、下記のように修正します。

```diff
-1: 島村卯月
+1: 福山舞
 2: 渋谷凛
 3: 本田未央
 4: 前川みく
-5: 高森藍子
+5: 日野茜
```

GitGUIではこのように表示されます。
この状態では2箇所の変更はひとつのハンク([Hunk: かたまり](http://ejje.weblio.jp/content/hunk))として扱われていますが、分割することができます。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/27816/dc293d6c-399d-7a31-2aef-799dda3ff3d2.png)

右クリックして「Show Less Context」を選ぶと、ハンクが分割されました。
ここで一方のハンクで右クリックして「Stage Hunk For Commit」を選べば、一方だけをコミットできます。
また、行が隣接していてハンクを分けられない場合は、「Stage Line For Commit」で1行だけを選べます。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/27816/41c806ea-9e3c-0176-882a-81ffd81bfb44.png)

なお、ハンクの増減にはショートカットキーが割り当てられています。

- Show Less Context: <kbd>Ctrl+-</kbd> (コントロールとマイナス)
- Show More Context: <kbd>Ctrl+=</kbd> (コントロールとイコール)

# `git stash`をGUIで
編集途中でaddもcommitもしていないが、急な用件で別のブランチに移動したいというときに使います。
コマンドラインでは下記の記事が詳しいです。

- `git stash`: [変更を一時的に退避！キメろgit stash - Qiita](http://qiita.com/fukajun/items/41288806e4733cb9c342) [![hatena bookmark](http://b.hatena.ne.jp/entry/image/http://qiita.com/fukajun/items/41288806e4733cb9c342)](http://b.hatena.ne.jp/entry/http://qiita.com/fukajun/items/41288806e4733cb9c342)

この機能はGUIにはデフォルトでは備わっていません。
ただ、ツールとして追加できます。
メニューから`Tools > Add`と選んでください。
![003.png](https://qiita-image-store.s3.amazonaws.com/0/27816/a4707133-edf1-03c3-1379-bdbf216c0ab5.png)

メニューで表示される名前を「Name」に、実行するコマンドを「Command」に入力します。
このとき、**「Add globally」にチェックを入れる**ことを忘れないでください。
追加したら「Tools」メニューから使用できます。
![004.png](https://qiita-image-store.s3.amazonaws.com/0/27816/ee096a6c-1dfd-72f4-0ffd-8cd32e4ca74e.png)

`git stash apply`のように引数をその都度変えたいコマンドは、「Ask the user for additional arguments」にチェックを入れます。
![005.png](https://qiita-image-store.s3.amazonaws.com/0/27816/4dd00632-10df-581d-b4d1-bce9149f23a6.png)

グローバルに追加した機能は`C:\Users\%USERNAME%\.gitconfig`に記録されます。
こちらを直接編集してもかまいません。

```txt:.gitconfig
[guitool "Stash save"]
    cmd = git stash save
[guitool "Stash list"]
    cmd = git stash list
[guitool "Stash apply"]
    cmd = git stash apply
    argprompt = yes
[guitool "Stash drop"]
    cmd = git stash drop
    argprompt = yes
```

# まとめ
GUIにはマイナーな命令はありませんし、複雑な処理をコピペで実行できるコマンドラインはやはり便利で、なくてはならないものです。
ただ、下記のようにGUIのメニューからGitBashを手軽に呼び出せるので、私は基本はGUIで、必要に応じてコマンドラインを使っています。
![006.png](https://qiita-image-store.s3.amazonaws.com/0/27816/522f0ac6-907d-8b45-2474-d722512bc370.png)
Atlassian JIRAのTomcatへのデプロイをDockerで行う

# 概要

Atlassian JIRA 7.2.2のWARファイルをTomcatへデプロイするまでの手順をDokerで行う。

# 動機

公式よりデプロイ手順は公開されているが、相変わらず調査と検証で手間がかかってしまった。狙いは手順のコード化と自動化、更にメンバーとの共有となる。

# 手順

## ファイル構成

以下の様な構成となる。

```
.
├── docker-compose.yml
├── Dockerfile
├── jira.war
└── server.xml
```

jira.warはJIRAのWARファイルであり、これは各自が準備すること。ソースコードのビルドについては「[Atlassian JIRAのビルドをDockerで行う](http://qiita.com/mmorita44/items/4ebac05249e6399433f1)」を参照すること。

その他のファイルは[Github](https://github.com/mmorita44/jira-deploy-on-tomcat)に上げてあるので、そこから参照なり取得なりして欲しい。

なお、このDockerfileではMySQLとSQL Server及びPostgreSQLの各種JDBCドライバーを自動でダウンロードします。OracleのJDBCドライバーはライセンス承認とOracle.comアカウントの登録が必要なため、自動的にダウンロードできません。代わりに手動でダウンロードした後にTomcatへ配置してください。

## リクエストパースエラーの回避

近年TomcatがRFC 7230とRFC 3986の規約に則ったため、規約に違反するリクエストはBad Requestとして扱われる。JIRAはログアウトや課題のトランジション等でリクエストパラメーターにパイプ文字を含んでいる。

この問題を回避するため、DockerfileではTomcatのバージョンを規約に則っていない8.5.6版を利用している。

## Dockerの実行

docker-composeコマンドで行うこと。詳細については言及しない。


# 参照
- [Installing JIRA on Tomcat 6.0 or 7.0 - Atlassian Documentation](https://confluence.atlassian.com/jira064/installing-jira-on-tomcat-6-0-or-7-0-720411825.html)
- [java - Tomcat 8 is not able to handle get request with '|' in query parameters? - Stack Overflow](http://stackoverflow.com/questions/41053653/tomcat-8-is-not-able-to-handle-get-request-with-in-query-parameters)
gitでJupyter Notebookのdiffを見る


githubはnotebookのプレビューができるので、Jupyter環境ない人に共有するのに便利と思ってレポジトリに入れたのはいいが、`.ipynb`の中身はJSONなので`git diff`を見てもコードの変化がわかりにくく、base64エンコードされた画像出力の差分も含んだりしていて厳しい。


nbdimeを使うと画像などの差分もテキストで見やすい形式で表示してくれて便利。

```bash
$ pip install nbdime
$ nbdime config-git --enable --system
$ git diff
``` 

git機能はおまけっぽい扱いなのか、ちょっとものたりない気もする。

* outputは表示しないでほしい
* execution countも表示しないでほしい
* cellの移動も追ってほしい

出力を共有する目的がなければ、単に出力を削ってしまえばいいので、jqを使って…

```bash
$ jq 'delpaths([paths | select([.[0, 2]] == ["cells", "outputs"])])' note.ipynb
```

### 参考

* [nbdime – diffing and merging of Jupyter Notebooks — nbdime 0.3.0.dev documentation]
(http://nbdime.readthedocs.io/en/latest/)
* [GitHub - jupyter/nbdime: Tools for diffing and merging of Jupyter notebooks.](https://github.com/jupyter/nbdime)
最新のdevelopの取り込みはgit pull --rebase派

やぬてつです。

git-flowを利用したチーム開発についてです。


皆さんはgitで最新のdevelopを自分のブランチに適用する時はどうしていますか？
ボクはもっぱら`git pull --rebase origin develop`なのです。

`git pull --rebase origin develop` を叩かないといてもたってもいられません。

1時間位前にremoteにpushしていても、Slackで何やら作業が進んでいそうだなーと思ったら、すぐに `git pull --rebase origin develop` を叩きます

席を立ってお茶やコーヒーを入れて戻って来たら、まず`git pull --rebase origin develop`を叩きます

朝会社についたら`git pull --rebase origin develop`を叩きます
お昼休憩の後に`git pull --rebase origin develop`を叩きます
帰宅前に`git pull --rebase origin develop`を叩きます
なんならポモドーロ的に25分感覚に通知を出して（ｒｙ
コマンド打つのもメンドクサくなってきたから.bashrcあたりに`alias p="git pull --rebase origin develop"`ぐらいの勢いで（ｒｙ


`git pull --rebase origin develop`しておくと`git log --graph`とか`tig`あたりのコマンドを叩いたとき、きれいに整列されていてとても良い気分になれます。コーヒーが美味しいですね。

あ！`git pull`と`git pull --rebase`の違いはこちらを読んでください。とても分かりやすかったです。
[git pull と git pull –rebase の違いって？図を交えて説明します！](http://kray.jp/blog/git-pull-rebase/)

読みました？読みましたよね？
それなら、あなたも、もう`git pull --rebase origin develop`派になったでしょう

ほら、ターミナル開いて　`git pull --rebase origin develop` を叩いてください
簡単ですよ。
コピペでもいいんですよ。

`git pull --rebase origin develop`

コピペしやすいようにそのまま書いておきましたよ。

まぁ、心の準備とかあると思いますから、今日のところはよしとしましょう。

じゃあ、明日から最新のdevelopの取り込みは`git pull --rebase origin develop`でよろしくお願いします。

# まとめ

~~旨いコーヒーが飲みたかったら`git pull --rebase origin develop`を叩け~~
最新のdevelopの取り込みには`git pull --rebase origin develop`を使ってください
[Tensorflow]Windowsで機械学習インストール方法。

# 始まる前に

こんにちは。お久しぶりです。
天気もよいし、どんどん暑くなっています。
忙しい日々を過ごしています。:innocent:

前からmacやRaspberry PiでTensorflow利用していましたが、windowsでもインストールできるらしいので、
今日はWindowsにGoogleのTensorflowをインストール方法とインストールしながら、感じたことを書いたいと思います。


# インストール環境

まず、私の場合はAnacondaを使わないです。
Anacondaは便利で、皆さんがよく使っているんですよね。

1. OS : windows 10 
2. python version : 3.5.2 [Download link](https://www.python.org/downloads/release/python-352/)
3. GPU : GTX1050TI (CUDA CORE 数　： 768)
3. Tensorflow API Version : 1.0


# 本論
正直、TENSORFLOW　インストール前にはPython 3.6を使っていました。
### **注意点**
Tensorflowはpythonのversionが**3.5**にならなきゃならないです。
私は知らなかったので、3.6をUninstallして**3.5.2**Versionを再インストールしました。
![giphy (1).gif](https://qiita-image-store.s3.amazonaws.com/0/137182/36672b36-1879-c88c-3b06-34dec868dce0.gif)
### Tensorflow Install 
方法は何を使っても良いんです。CMDで入力してください。

```install:Command
 $>pip3 install tensorflow
```

Tensorflowからのガイド。

```install:Command
 $>pip3 install --upgrade tensorflow
```

GPUを使い方はTENSORFLOWのGPU VERSIONをインストールおすすめします。TENSORFLOWはGPUのCUDAを使って並列処理しますので、学習時間を短くしてくれます。(**CUDAとGPU インストール方法は次回に書いてみます。**)

```install:Command
 $>pip3 install --upgrade tensorflow-gpu
```

### 必要なLIB。
Anacondaは基本的にインストールしたら、ともにインストールします。
でも、今はAnacondaじゃないので、下のライブラリーをインストールしないと

- NUMPY

```install:Command
 $>pip3 install numpy
```

- MATPLOTLIB

```install:Command
 $>pip3 install matplotlib
```

### INSTALL 確認。
この命令でerrorないとインストール完了です。お疲れ様でした。

```inl:Python
 import tensorflow as tf
```

# 結論

1. INSTALL PYTHON 3.5 VERSION をインストール。
2. PIP3 INSTALL TENSORFLOW　でTensorflowインストール。
3. IMPORT TENSORFLOW AS TF インストール確認。

# 個人的なお勧め
PYTHON 使うとしたらIDE迷いますよね。
私が愛用している方法はこのようになりまし。

- [JUPYTER NOTEBOOK](http://jupyter.org/)

TENSERFLOWのPROCESS確認はJUPYTERをお勧めします。インストールはとても簡単です。

```inl:Python
 PIP3 INSTALL JUPYTER
```

- [PYCHARM](https://www.jetbrains.com/pycharm/)

これは学習したのをEVALUATIONする時に使ってます。
# 終わりに。
いかがでしょうか？　しやすいです。
![giphy-downsized.gif](https://qiita-image-store.s3.amazonaws.com/0/137182/d7e2858b-b55d-67b9-1075-37953fcf577e.gif)

**次には時間があればGPU使い方法やWindowsでOpenAIをインストールする方法を書いてみようと思います。**

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

**Dreamwalker。**
カスタムでmodelを生成するジェネレータを作る

Rails5でmodelを生成するジェネレータを作る方法を調べました。まず、ジェネレータの雛形を生成します。

```bash
$ bin/rails g generator xxx
```
それで、生成されたファイルにして、あとは`template`ディレクトリに`mode.rb`と`unit_test.rb`を書けば、次のように`xxx_generator.rb`を書けば最低限`bin/rails g model xxx`と同等の処理が`bin/rails g xxx table_name`で生成されます(標準ではあとフィクスチャーのymlファイルが生成されるのですが)。

```ruby
  class XxxGenerator < Rails::Generators::NamedBase
    include Rails::Generators::Migration
    source_root File.expand_path('../templates', __FILE__)
    def copy_migration
      migration_template "migration.rb", "db/migrate/create_#{table_name}.rb", migration_version: migration_version 
    end
    def generate_model
      template "model.rb", "app/models/#{table_name.singularize}.rb"
      template "unit_test.rb", "test/models/#{table_name.singularize}_test.rb"
      run("bin/rails db:environment:set RAILS_ENV=test")
      run("bin/rails db:migrate RAILS_ENV=test")
    end
    def self.next_migration_number(dir)
      Time.now.utc.strftime("%Y%m%d%H%M%S")
    end
    def migration_version
      "[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
    end
    private
      def model_name
        table_name.singularize.camelize
      end
end
```
`next_migration_number`と`migration_version`は`migration_template`を呼ぶのに必要なメソッドです。
Mecabのユーザ辞書をJUMAN++で使えるようにする

# はじめに

　今まで、形態素解析エンジンにはMecabを使ってきたのですが、JUMAN++を使わないといけない機会がありました。そこで、Mecabを使っていた時に作ったユーザ辞書を、どうにかJUMAN++でも使えるようにできないか調べていたところ、以下のようなスクリプトを作っていらっしゃる方がいました。
[neologd辞書をjuman/juman++で使えるようにするスクリプト作った](http://qiita.com/Kensuke-Mitsuzawa/items/403256129e812b09c461)

　NEologdについて詳しくは下記のページをご覧ください。ようはMecabの辞書の一つです。
[MeCab 用の新語辞書 mecab-ipadic-neologd を公開しました](http://diary.overlasting.net/2015-03-13-1.html)

　このスクリプト(neologd2juman)自体は、NEologdに特化したつくりになっていますが、少しMakefileを書き換えると、NEologd関係なしに、自分で作ったMecab用ユーザ辞書をJUMAN++用辞書に変換することができました。この記事では、その方法を記していきたいと思います。

# 注意

- あらかじめMecabユーザ辞書を作ったときのcsvファイルをご用意ください。dicファイルに既に変換したものは使用できません。
- この方法は、neologd2jumanのスクリプトを、本来の使用用途と少し逸脱して使用します。

# 環境

当方は、macOS Sierra (10.12)で作業を行いました。なお、あらかじめ以下をインストールしておいてください。

- Python 3系
- JUMAN++
- mojimoji (Pythonのライブラリ。`pip`コマンド等でインストールしておく。）
- jaconv (Pythonのライブラリ。`pip`コマンド等でインストールしておく。）

また、JUMAN++をダウンロードしたときのディレクトリ内にあった`dict-build`ディレクトリは、消さずに残しておいてください。消してしまった場合は、もう一度ダウンロードしておいてください。

# 手順

## 1.neologd2jumanを用意

　[neologd2jumanがGitHubで公開されています](https://github.com/fumankaitori/neologd2juman)ので、ダウンロードし、あらかじめ解凍しておいてください。

## 2.Mecabユーザ辞書のcsvをコピー

　neologd2jumanのルートディレクトリ(Makefileなどがある位置)に、Mecabユーザ辞書作成時に使用したcsvファイルをコピーしておいてください。ここでは、csvのファイル名を`mecab-user-dic.csv`としますが、任意のファイル名で構いません。

## 3.Makefileの書き換え

　neologd2jumanのルートディレクトリにあるMakefileを以下のように書き換えます。

```Makefile
install:
	bash neologd2juman.sh mecab-user-dic.csv
	mv mecab-user-dic.csv.dic mecab-user-dic.dic

clean:
	rm -r mecab-user-dic.csv*
```

## 4.make

　ターミナル上で、あらかじめneologd2jumanのルートディレクトリに移動しておき、`make`コマンドを実行します。すると、`mecab-user-dic.dic`ファイルが出来上がります。

## 5.JUMAN++用にコンパイル

　JUMAN++をダウンロードした際に中にあった`dict-build`ディレクトリで、コンパイル・インストールを行います。まず、さきほど出来上がった`mecab-user-dic.dic`を`dict-build/userdic`に配置します。

　次にターミナル上で`dict-build`ディレクトリに移動しておき、`make`コマンドを実行します。辞書のコンパイルが行われます。この作業には時間がかかる場合があります。

　最後に、`sudo ./install.sh`コマンドを実行すれば、JUMAN++にインストールされます。
いわゆる Nautilus Script で「パスのコピー」をする

窓の杜の Windows のエクスプローラの「パスのコピー」の話題がバズっているようですが、これをいわゆる Nautilus Script でやる方法を大昔から使っているのだが、いい機会なので晒し上げておく。

> 知られざるワザ「Shift＋右クリック」でファイルのパスをコピーする方法 - いまさら聞けないWindows 10のTips - 窓の杜 http://forest.watch.impress.co.jp/docs/serial/win10tips/1056255.html

# TL;DR

 * https://gist.github.com/cat-in-136/fc035d093b02bac5a014e4b8ee52165c

# 「いわゆる」Nautilus Script

Gnome のファイルマネージャである [Nautilus] には、シェルスクリプトを登録して拡張ができる。これを使って、「パスのコピー」を実現できる。

なお「いわゆる」と書いたのは Nautilus 以外でも同様の機能があるからで、例えば Cinnamon Desktop Environment の [nemo] でも同様の機能がある（筆者は今 Cinnamon ユーザである）。

# 仕組み

 * Nautilus スクリプトに環境変数 `NAUTILUS_SCRIPT_SELECTED_FILE_PATHS` としてファイルパスが受け付けられる
 * [xclip][xclip] コマンドを使うことでシェルスクリプトを使って、ファイルパスをクリップボードにコピーできる。

Cinnamon の場合は環境変数名は `NEMO_SCRIPT_SELECTED_FILE_PATHS` であった。他のファイルマネージャを使っている場合は異なる環境変数名だと思われるので、各自調べること。

# インストール方法

予め xclip をインストールしておく（普通にパッケージ管理システム経由でインストール）。

 1. `~/.local/share/nautilus/scripts` に次のgistに上げたスクリプトをダウンロードして置く。ファイル名は`Copy Full Path Of Selection`（空白含んでいても記にしない）で良い。
    https://gist.github.com/cat-in-136/fc035d093b02bac5a014e4b8ee52165c
 2. ファイルパーミッションに実行権限を付ける（`chmod +x`）

nemo の場合は、スクリプトの置き場所は `~/.local/share/nemo/scripts` である。他のファイルマネージャを使っている場合は異なる場所だと思われるので、各自調べること。

# 使用方法

 1. ファイルマネージャでファイルを選択して右クリック
 2. "スクリプト"→"Copy Full Path Of Selection"


[xclip]: https://github.com/astrand/xclip
[Nautilus]: https://wiki.gnome.org/Apps/Nautilus
[nemo]: https://github.com/linuxmint/nemo
Xamarin Workbooks の NuGet で ~ has already dependancies ~ 関連で怒られた時の一つの解決策

2017年5月12日追記：
Alpha Preview ですが， Xamarin Workbooksのバージョンが1.3になり，
ローカルのNuGet.configを読むことになり，ローカルのリポジトリを読めるようになったほか，
ここで問題にあげているバージョンの競合に関する問題はNuGet 4 client libraryの導入により起こらなくなったと考えられます．

その為まだStableを使い続けている人向けにこの記事をおくります．
追記終了

---

わざわざ `dotnet new -t console` みたいな感じでアプリケーション作って試して，というのが面倒な時やちょっとしたことを試したい時，REPL の環境があると非常に開発速度が向上します（個人の感想）．

C# で REPL となると，Visual Studio の C# Interactive を使えばいいですが，そのために Visual Studio を開くのも面倒ですし，そうであれば`dotnet repl` とかは？となりますが，それは Windows でのお話...

Mac だと scriptcs とかが候補にあがってくれるのですが，Jupyter Notebook の kernels から入れた scriptcs ベースのものの印象があまり良くなく（前の話なので今は違うかもしれません），そうなると公式から出ている Xamarin Workbooks 一択と感じています．

### 発生事象

その Xamarin Workbooks ですが，最近自分の作ったライブラリを試してみようとしたところ以下のようなエラーが NuGet パッケージの追加の際に出てきました．

_Xamarin Workbooks has already dependancies Newtonsoft.Json_(以下略)


そうですか，はぁそうですか，と言いたいところなのですが，いや，知らんよそんなのというお気持ちが非常に高まります．

確かに私のライブラリは Newtonsoft.Json >= 10.0.2 に依存してますし，かぶってますね，とわかるのですが，いやいや...

### 調査，そして手がかりへ

もしかしたら _has already dependancies_ で調べたら NuGet 周りのいい感じの対処法見つかるんじゃないかと思ってググったら出てきました．

[NuGet: 'X' already has a dependency defined for 'Y'](http://stackoverflow.com/questions/25725545/nuget-x-already-has-a-dependency-defined-for-y/25844391#25844391)

まさにこれ．これですこれです．ということで読んでみると

__NuGet のバージョンを上げろ__

完

はーなるほど，そーゆーことね...ということで Xamarin Workbooks が使っている NuGet Package Manager を更新してしまえばいいのねということで更新してしまいます．

### 解決策

Mac での話ですが，その NuGet Package Manager の本体は
`/Applications/Xamarin\ Workbooks.app/Contents/MonoBundle/` の `NuGet.Core.dll` です．
こいつを NuGet のリポジトリからダウンロードしてきた新しい `NuGet.Core.dll` で置き換えてあげれば万事解決です．

そうすると無事自分のライブラリを追加することが出来ました．やったーーーーー


### 諸注意

とまぁ今回はうまくいきましたが，Xamarin Workbooks 側は[わけあって](https://developer.xamarin.com/guides/cross-platform/workbooks/troubleshooting/general/#Unable_to_use_Newtonsoft.Json) 9.0.１ に固定しているようです．

そのため，上記の手法を試す時は必ず __もとの__ `NuGet.Core.dll` のバックアップをとってお試しください．


#### お気持ち

もうちょい Xamarin Workbooks の NuGet 周りが強くなると嬉しいなと思います（ローカルの NuGet リポジトリを指定できるとか...）
Ubuntu上でSoftEther VPN Server構築

#概要・背景
Ubuntu上でSoftEtherの環境を構築している人は多くいるのだが、Systemdを使わずinitスクリプトを使っていたり、tapインターフェイスを変な方法でブリッジしている人が多かったので個人的に納得のいく方法で構築した流れをここに示すことにした。

#構築
##環境
OS:Ubuntu Server 16.04
RAM:2GB

##インストール
###bridge-utils,make,gccのインストール
bridge-utilsはインストール後、tapインターフェイスがブリッジできていることを確認するためにbrctlを用いる時に必要。

パッケージ情報更新
`sudo apt update`

インストール
`sudo apt install -y bridge-utils gcc make`

###SoftEther VPN Serverのダウンロード
最新版のURLを[ここ](http://www.softether-download.com/ja.aspx?product=softether)から探してくる
`cd /tmp`
`wget path-to-latest-version-of-SoftEther-Server`
`tar -xvf softether-vpnserver-(version).tar.gz`
`cd vpnserver/`
###SoftEther VPN Serverのインストール
`make`
使用権許諾契約書に同意する場合、1を入力

`cd ../`
`sudo mv vpnserver/ /usr/local/`
できたディレクトリを/usr/localに移動

`cd /usr/local/vpnserver/`
`sudo chmod 600 *`
`sudo chmod 700 vpncmd vpnserver`
パーミッション設定

###Systemd用serviceファイルを作成
`sudo vim /etc/systemd/system/vpnserver.service`

```vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network.target network-online.target

[Service]
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
Type=forking
RestartSec=3s

[Install]
WantedBy=multi-user.target
```

作成したサービスを読み込む
`sudo systemctl daemon-reload`

Softether VPN Serverを有効化、起動
`sudo systemctl enable vpnserver.service`
`sudo systemctl start vpnserver.service`

###SoftEther VPN Serverの設定
####SoftEther VPN Server Managerを使用して設定
1. 管理者パスワード設定
2. リモートアクセス VPN サーバーを選択
3. 適当に仮想HUB名を決める
4. 適当にDDNS名を決める
5. L2TP/IPSecを使うならチェックして次に進む
6. VPN Azureはどちらかを選択
7. ユーザーを作成
8. ローカルブリッジの設定は**ここでは行わずに**次に進む(ブリッジ接続する～のまま置いておく)

####tapインターフェイスを作成し、ブリッジする
1. ローカルブリッジを選択
2. 仮想HUBに先ほど決めた名前のものを選択する
3. 「新しいtapデバイスとのブリッジ接続」を選択
4. 新しいtapデバイス名に任意の名前を入力(例:softether)
5. 「ローカルブリッジを追加」を選択


####ブリッジインターフェイスを作成し、先ほど作成したtapインターフェイスとブリッジする
ここからは再びサーバー上で設定する

`sudo vim /etc/network/interfaces`

```/etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
#auto eth0
#iface eth0 inet dhcp


auto br0
iface br0 inet static
 #サーバーのIPアドレスを決め、入力
 address 192.168.x.y
 netmask 255.255.255.0
 gateway 192.168.x.a
 bridge_ports eth0 tap_(先ほど決めたインターフェース名)
 #例 bridge_ports eth0 tap_softether
 dns-nameservers 192.168.x.a
```
再起動
`sudo reboot`

再起動後、ブリッジできているかどうか確かめる
`brctl show`

```
bridge name     bridge id               STP enabled     interfaces
br0             8000.00155d01a504       no              eth0
                                                        tap_softether
```
上のようになっていれば正常
Plan to travel in Korea (29/4 - 6/5)


###Seoul: 30/4 - 3/5

**Nhà nghỉ**
LEO GUEST HOUSE
- Address: 380-18, Seogyo-dong, Mapo-Gu, Seoul
- Website: http://leo-guesthouse.com/en_hongdae_location.htm
- Book qua Agonda: https://goo.gl/9BwB6l (4 đêm 2 người giá 10350 yên, tương đương 2tr6 VND)

**Lịch trình các địa điểm sẽ tham quan:**

**30/4**

Ban ngày:
- Checkin phòng
- Làng cổ Bukchon Hanok Village 
- Phố cổ Insadong
- Hoàng cung Geongbokgung
- Cung điện Changdeokgung
- Chiều còn thời gian thì ghé suối Chenggyecheon

Buổi tối:
- Dạo xung quanh khu Hongdae gần nhà nghỉ: Ăn uống + xem biểu diễn đường phố

**1/5**

Ban ngày:
- Đảo Namiseom nơi quay bộ phim Winter Sonata, chơi ở đảo tầm chiều 4h về.

Buổi chiều tối:
- Namsan Tower (N Seoul Tower)

**2/5**

Ban ngày:
- Đại học nữ sinh Ehwa University
- Dongdaemun Design Plaza
- Seokchon Lake
- Lotte World Tower
- Khu Gangnam

Buổi tối:
- Han River, cầu Banpo (http://thongtinhanquoc.com/cau-banpo/)

**3/5**
Ban ngày:
- Checkout trả phòng
- Hanuel Park
- Dongdaemun Market
- Chiều tối ghé khu Myeongdong ăn uống, tham quan (1 số địa điểm như: nhà hàng dakgalbi yoogane, jjimdak, 2 shop Wonderplace và A-land, ...), xem Nanta Cooking Show lúc 5h chiều

Buổi tối:
- 9pm: Sau khi chơi ở khu Myeongdong, bắt tàu về lại Seoul Station
- 21:50pm: Lên tàu đi Busan

###Busan: 4/5 - 5/5

**Nhà nghỉ**
Dynamic Guest House
- Address: 3604, Tower102, Seomyeon Yulim Norwegian Woods, 865, Beomcheon (부산광역시 진구 범천1동 865 서면유림노르웨이숲 102동 3604)
- Website: https://www.facebook.com/dynamicguesthouse
- Book qua AirBnb: https://goo.gl/Du2Ilc (2 đêm phòng 2 giường giá ~4500 yên, tương đương gần 1tr VND)

**Lịch trình các địa điểm sẽ tham quan:**

**4/5**

Ban ngày:
- Checkin phòng
- Chùa Haedong Yonggungsa
- Haeundae Beach
- Sea Life Busan Aquarium

Buổi tối:
- 19:30pm - 22:00pm: Busan City Night Tour (https://www.kkday.com/en/product/3017?cid=3055)

**5/5**

Ban ngày:
- Checkout trả phòng
- Oryukdo Island – Oryukdo Skywalk
- Gamcheon Culture Village
- Yongdusan Park
- Jagalchi Market

Buổi tối:
- Bắt tàu về lại Busan Station
- 21:45pm: Lên tàu về Seoul
- 3:30am 6/5: Bắt tàu về lại Incheon Airport (đi tầm 1h)

###Thông tin thêm###

- Ăn gì ở Busan: https://vn.blog.kkday.com/2017/04/17/an-gi-o-busan-10-mon-dac-san-nhat-dinh-phai-thu/
- Ăn gì ở Seoul: TTeokbokki (bánh gạo cay), Samgyetang (gà tần sâm), samgyeopsal (thịt nướng), tongdak (gà quay), bibimpap, bulgogi (cơm trộn thịt bò), kimchi, seolleongtang (cháo loãng ăn kèm với kimchi)
『モバイルアプリ開発エキスパート養成読本』出版記念 Tech Talksの備忘録


# 概要

* 「[『モバイルアプリ開発エキスパート養成読本』出版記念 Tech Talks](https://connpass.com/event/50979/)」の興味持ったメモ
* [モバイルアプリ開発エキスパート養成読本](http://gihyo.jp/book/2017/978-4-7741-8863-8)
 * 4/11に技術評論社から発売されたムック


1. Battery life of Android O
2. Reactiveなんて怖くない
3. MVVM + Flux
4. 執筆陣によるライトニング座談会 (執筆の裏話など)

# スポンサー挨拶

* 株式会社Zucks 山戸茂樹
* Voyageグループは勉強会支援をしていて、会場提供とフードスポンサー（100名まで）しています。
* 興味がある方は [@tech_voyage](https://twitter.com/tech_voyage) に連絡してください。
 * 詳細知りたいw


# Battery life of Android O

* 株式会社ソウゾウ 日高正博　[@mhidaka](https://twitter.com/mhidaka)
* 7.0（Android O）からのお話：Background Execution Limits
* バックグラウンド実行をOSとして制御するよ。
* ServiceとBroadcastに制限
* バックグラウンドとフォアグラウンドサービス
 * バックグラウンドに回って数分で殺す
 * そのためFirebase Cloud MessagingとJob Schedulerで対応
  * 数秒で処理終われせてね。キューイングで実行。
  * バックグラウンドでは数回しかGPS使えない。使いすぎるとかえってこない。

# Reactiveなんて怖くない

* 株式会社Fablic 黒川洋 [@hydrakecat](https://twitter.com/hydrakecat)
* Reactiveとコールバックは同じやと思うねん！！！（注：個人的な感想です
* ライブラリに過ぎないから使いたいところで使おうよ
* 発火クイズ、スレッドクイズ

# MVVM + Flux

* 株式会社サイバーエージェント 鈴木大貴　[@marty_suzuki](https://twitter.com/marty_suzuki)
* MVVM + FluxにするとプレゼンテーションロジックをViewから分離できる。
* [サンプル](https://github.com/marty-suzuki/QiitaWithFluxSample)用意してきました
DbUnitでPostgreSQLのinet型を使う

PostgreSQLのinet型が定義されたテーブルにDbUnitを使用してデータをセットアップしようとした際に、対処した方法を載せます。

## 環境
| OSS | Version  |
|:----:|:-----------:|
|Java | 7 |
|postgresql |9.5 |
|mybatis |3.4.2|
|dbunit| 2.5.3|

## 対処前に発生するエラー
org.dbunit.dataset.NoSuchColumnException: users.ADDR -  (Non-uppercase input column: addr)
usersというテーブルのADDRカラムがinet型です。

## 対処方法
PostgresqlDataTypeFactoryクラスを使う
使い方は以下の通り。
DatabaseConnectionに対してPostgresql独自の型を提供するクラスを追加してあげます。
getDBConnection()の実装は「[Spring + Mybatis + DbUnit を使ってみた](http://qiita.com/crazyNasubi/items/35c4144ed0be7b115ac0)」を参照ください。

```sample.java
DatabaseConnection connection = getDBConnection();
connection
    .getConfig()
    .setProperty(
        DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
        new PostgresqlDataTypeFactory()
     );
     
```
xubuntuでvinoを自動起動

## 設定

```
/usr/bin/xfce4-session-settings
```

![vino.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f9c1b467-47f2-fef9-43a8-1d3fe0a19edf.png)

## 解像度変更したい場合

```bash:1360x800に設定したい場合
cvt 1360 800 60
```

```bash:
OUTPUT="HDMI-1"
/usr/bin/xrandr --newmode "1360x870_60.00"   97.00  1360 1440 1576 1792  870 873 883 903 -hsync +vsync

/usr/bin/xrandr --addmode $OUTPUT "1360x870_60.00"
# 
# 設定
/usr/bin/xrandr --output $OUTPUT --mode "1360x870_60.00"
```
sliceオブジェクトをインデックス番号のリストに変換する

Pythonのリストを範囲指定して操作するとき

```python
int_list[10:2]
```
みたいに表記すると実際に`__get__`メソッドに渡される__slice__オブジェクトですが、自前でリスト的クラスを実装しようとするときにslice引数に対応しようとするとはたと困ります。sliceをインデックス番号の列に変換するメソッドがないぞと。

自力でそういう変換処理を書こうとすると大変ですね、stepが負の数・Noneの場合、startやstopが負の数・Noneの場合、これは条件分岐の嵐で死ねます。

しかしそういう面倒な処理をやってくれるメソッドが目立たないながら存在します。`slice.indices()`です。リストの長さを与えるとそれに合わせて負の数・Noneをちゃんとしたインデックス番号に正規化してくれるというもの。これを利用すれば、インデックス番号の列を得るのは比較的簡単です。

```python
def iterate_by_slice(s: slice, length: int):
    i, stop, step = s.indices(length)
    if step > 0 :
        while i < stop:
            yield i
            i += step
    else:
        while i > stop:
            yield i
            i += step
```

みんなの役に立つリスト的クラス、どんどん作っちゃってください。
ESP32でナントカのLAN一覧

#はじめに

ESP32 1個でこーゆーことをします。

![IMG_0008.PNG](https://qiita-image-store.s3.amazonaws.com/0/104360/c5d8bcf0-5284-44ba-188e-f54ad92211e3.png)


#元ネタ

4月8日に、
[Send arbitrary IEEE 802.11 frames with Espressif's ESP32](https://github.com/Jeija/esp32free80211)
がGitHubにアップされ、
4月24日に HACKADAY の
[ESP32’S FREEDOM OUTPUT LETS YOU DO ANYTHING](http://hackaday.com/2017/04/24/esp32s-freedom-output-lets-you-do-anything/)
という記事で紹介されました。

「freedomなフレーム送信方法が見つかった → 例としてビーコンスパムを書いてみたよ」

ということみたいです。

#ビルドしよう

ESP-IDFの環境が必要です。

[ESP32(ESP-WROOM-32)でLチカ (WindowsでESP-IDF使用)](http://qiita.com/rukihena/items/d226972972a360fc2648) などを参照してみてください。

元ネタのREADMEによると、esp32-wifi-libのバージョンが当時のものでないとダメのようです。（最新版で試したところ、makeは通るものの、焼いて実行すると途中でハングするような動作でした。）

ということでesp32-wifi-libだけ差し替えてみたんですが、makeが通りません。

とりあえずesp-idfディレクトリごと削除してから、環境を作り直しました。

```
git clone https://github.com/espressif/esp-idf.git
cd esp-idf/
git checkout dc6c19f5604bce0b13c57df1b4998aac022688f6
```

git clone のときに --recursive オプションを付けると、サブモジュールが最新になってしまいます。
付けない場合は、makeするときに自動的に当時のバージョンのサブモジュールを拾ってくれます。

（サブモジュールが最新になっていても、当時のバージョンに合わせるコマンドがあると思うのですが、gitについては詳しくないのです。すいません。）

環境ができたら、https://github.com/Jeija/esp32free80211 を拾ってきて make menuconfig などなどします。

#SSID修正
例のソースでのSSID一覧（歌詞）の元ネタがイマイチ良くわからないので、日本のネットで[バズりそう](http://nlab.itmedia.co.jp/nl/articles/1206/02/news008.html) な一覧に変えてみましょう。

rics_ssids[] の中身を修正するだけです。

```txt:rick_ssids
	"0672_壬申のLAN",
	"0935_平将門のLAN",
	"0939_藤原純友のLAN",
	"1156_保元のLAN",
	"1159_平治のLAN",
	"1180_源平の内LAN",
	"1221_承久のLAN",
	"1467_応仁のLAN",
	"1637_島原のLAN",
	"1651_由井正雪のLAN",
	"1837_大塩平八郎のLAN",
	"1851_太平天国のLAN",
	"1874_佐賀のLAN",
	"1894_東学のLAN",
```

年号などは[中学歴史に出てくる「ナントカの乱」一覧まとめ](http://chugaku-rekishi.mobi/theme/nantokanoran.html)を参考にしました。

ソースは**UTF-8で保存**します。

ちなみにSSIDは、規格上は32オクテットのバイナリで、一般的にはASCIIコードとして解釈されています。UTF-8で書くと、端末によってはUTF-8として解釈してくれる場合もあります。最近の端末ではだいたいUTF-8として解釈するみたいです。

#終わりに

こんなことができてしまうと技適は大丈夫なのか不安になりますね。規制当局から怒られないように注意しましょう。

なお、私は念のため電波暗室でテストしました。(｀・ω・´)キリッ
LINE BOTを用いた学習ログ収集と情報提示

#**概要**
**・**学習ログを収集
**・**ライバル関係にある他ユーザの学習情報を提示
をすることで、学習者の学習モチベーションを維持するためのLINE BOTです。

ソースコードはこちら。
https://github.com/Hirosaji/study-marker-bot


#**実装イメージ**
##1. 学習ログ収集
1. ユーザが `学習開始ボタン` を入力
2. ユーザが `学習終了ボタン` を入力
3. 2.をトリガーに、1.と2.の時間差による「学習時間」を算出・表示


##2. ライバルユーザの学習情報提示
1. ライバル関係にある他ユーザの情報を毎晩0時に提示


#**システム構成図**
![LineBot.png](https://qiita-image-store.s3.amazonaws.com/0/162655/e2c3964f-fd53-afc5-a43c-005c59201fb4.png)


>**[考慮するべきポイント]**
>・トリガーイベントを管理する別サーバーのプログラム&ストレージが必要
>・AWS LambdaとAmazon S3を使うと比較的楽（お金掛かるけど）
>→ 今回はAmazon S3 + heroku Schedulerで実装。


#**実装したUI**
![UI.jpg](https://qiita-image-store.s3.amazonaws.com/0/162655/136e42de-80ff-43c4-991d-11dc844eeea7.jpeg)
定数式のバグ

PHP5.6で[定数式](http://php.net/manual/ja/language.oop5.constants.php)が使えるようになりました。

ところで問題です。
以下の出力はどうなるでしょう。

```php:プログラム1
	class A{
	    const X = self::A;
	    const A = 'A';
	}
	class B extends A{
	    const A = 'B';
	}
	print(A::X . B::X);
```

```php:プログラム2
	class A{
	    const X = self::A;
	    const A = 'A';
	}
	class B extends A{
	    const A = 'B';
	}
	print(B::X . A::X); // 違うのはここだけ
```

答えは……PHPのバージョンによって異なります。

というのはまあアレなので、7.0系最新の7.0.18で試してみると、

・プログラム1は**"AA"**
・プログラム2は**"BB"**

なんでだよ。

PHP5ではプログラム1、プログラム2共に**"BA"**となっていましたが(この時点で既におかしい)、PHP7では[プログラム1](https://3v4l.org/Dtr54)は**"AA"**に、[プログラム2](https://3v4l.org/QIcl3)は**"BB"**となりました。
PHP7.1.4で[後者が無事修正されて](https://bugs.php.net/bug.php?id=69676)、両方とも正しく**"AA"**と出力されるようになりました。

まあこのプログラムの何が駄目かっていうと未定義の値を先に使ってるところで、[順番に定義](https://3v4l.org/SqF5e)[すれば](https://3v4l.org/PorKi)何も問題なく正常に動作するから、こんな書き方するやつが悪いと言えますが。
CentOSにcakephpをインストールしてみた

#[PHP] CentOSにcakephpをインストールしてみた
まずはcakephpのインストール
GitHubからファイルをインストール
> git clone -b 2.x git://github.com/cakephp/cakephp.git

ダウンロードしたファイルを
> var/www/html

に移動。

ブラウザーで開くと下記のエラーが発生。


>Warning: _cake_core_ cache was unable to write 'cake_dev_ja' to File cache in /var/www/html/cakephp/lib/Cake/Cache/Cache.php on line 328

> Warning: /var/www/html/cakephp/app/tmp/cache/persistent/ is not writable in /var/www/html/cakephp/lib/Cake/Cache/Engine/FileEngine.php on line 385


>Fatal error: Uncaught exception 'CacheException' with message 'Cache engine "_cake_core_" is not properly configured. Ensure required extensions are installed, and credentials/permissions are correct' in /var/www/html/cakephp/lib/Cake/Cache/Cache.php:186 Stack trace: #0 /var/www/html/cakephp/lib/Cake/Cache/Cache.php(151): Cache::_buildEngine('_cake_core_') #1 /var/www/html/cakephp/app/Config/core.php(384): Cache::config('_cake_core_', Array) #2 /var/www/html/cakephp/lib/Cake/Core/Configure.php(72): include('/var/www/html/c...') #3 /var/www/html/cakephp/lib/Cake/bootstrap.php(432): Configure::bootstrap(true) #4 /var/www/html/cakephp/app/webroot/index.php(98): include('/var/www/html/c...') #5 /var/www/html/cakephp/index.php(41): require('/var/www/html/c...') #6 {main} thrown in /var/www/html/cakephp/lib/Cake/Cache/Cache.php on line 186

cakePHP は一時的にファイルを作成することがあるため、そのための書き込み権限を付与する必要がある。
>cd /var/www/html/cakephp/app
> chmod -R 777 tmp

これで準備OK
UE4でマテリアルパラメータコレクションをアクターに設定してUnityっぽくしちゃおう

#はじめに
今回は、UnityからUE4にスイッチした時にUE4だと出来なくて困る、UE4でゲームオブジェクトにパラメータ用のスライダーをつける方法について説明いたします。


#マテリアルパラメータコレクションがそれっぽい
マテリアル管理用の機能で構造体も扱えるらしいです。

参考: Epic Games Web Site
[マテリアル パラメータ コレクション](https://www.unrealengine.com/ja/blog/material-parameter-collections)
[Material Parameter Collections](https://docs.unrealengine.com/latest/JPN/Engine/Rendering/Materials/ParameterCollections/index.html)


#マテリアルパラメータコレクションを作成する
コンテンツブラウザの新規追加 -> マテリアル・テクスチャ -> マテリアルパラメータコレクションを選択します。
![materialparamcore.png](https://qiita-image-store.s3.amazonaws.com/0/25895/31536915-951b-3d6f-d729-023074128afe.png)

#マテリアルパラメータコレクション用の初期値とパラメータ名を設定する
![materialparamcore2.png](https://qiita-image-store.s3.amazonaws.com/0/25895/c1136b21-d60a-91ed-6798-4394274693b5.png)

#対象のアクターのイベントティックへ設定し、フレームが変わる度に呼び出されるようにする
実行時に
![materialparamcore3.png](https://qiita-image-store.s3.amazonaws.com/0/25895/0eca71ba-b612-de97-6469-8f69f70a0b24.png)

#Set Scalar Parameter Valueのノードを接続する
![materialparamcore4.png](https://qiita-image-store.s3.amazonaws.com/0/25895/e370a461-8c31-6045-5579-dd9b19df48b6.png)

#接続したノードのCollectionに作成したマテリアルパラメータコレクションを設定する
![materialparamcore5.png](https://qiita-image-store.s3.amazonaws.com/0/25895/aee90846-0488-8dea-fc37-f93f74526608.png)

#Set Scalar Parameter Valueにパラメータ名を設定する
プルダウンリストより設定したパラメータ名が表示されるので選択する
![materialparamcore6.png](https://qiita-image-store.s3.amazonaws.com/0/25895/6f660d66-7732-32d7-f569-858f77f3784a.png)

#内部変数にBitbiasと言う名前のfloat型の変数を作成しイベントグラフにドラッグする
![materialparamcore7.png](https://qiita-image-store.s3.amazonaws.com/0/25895/e774cc67-0caa-bc9d-880c-cafc017ed07b.png)

#Set Scalar Parameter Valueへ内部変数をパラメータバリューとして設定する
![materialparamcore8.png](https://qiita-image-store.s3.amazonaws.com/0/25895/6dc1cd74-7f76-8855-fe97-95a10e48b110.png)

#モザイク用のポストプロセスのマテリアルを作成する
マテリアルパラメータコレクションのノードはドラッグアンドドロップで配置できます
詳細のMaterial -> マテリアル属性は、Post Processにしてください
[参考](https://youtu.be/MqGEER0JP2A)

![materialparamcore10.png](https://qiita-image-store.s3.amazonaws.com/0/25895/ae13b29e-63ec-bda1-0b6c-a6bd9a1ce277.png)

#FirstPersonCharacterのFirstPersonCameraのRendering Features -> Post Process Materialsへモザイク用のポストプロセスを設定します
Arrayのプラスボタンを押して、選択はアセットリファレンスにすると作成したポストプロセスを選択できるようになります
![materialparamcore11.png](https://qiita-image-store.s3.amazonaws.com/0/25895/de286dc3-97ec-ab34-a399-184e946d8351.png)


#これでプレイしながら、デフォルトにあるBitbaias変数をUnityのようにスライダーで値を変更できるようになります
![materialparamcore9.png](https://qiita-image-store.s3.amazonaws.com/0/25895/2598daf2-f234-7af2-00a8-298933503599.png)


[動画イメージ](https://j.gifs.com/ElEwNY.gif)

#今後の予定
シーン（レベル）内での動的な実装の確認
Android App Developer’s 5 Tips to Optimize Apps

![Android App Developer’s 5 Tips to Optimize Apps.png](https://qiita-image-store.s3.amazonaws.com/0/178339/e110ca7b-8790-4358-5ceb-f4f0e544ca88.png)

The new android apps are registered daily on the Google play Store The organic traffic is generated by the mobile users searching for the apps in the app store for mobile apps to satisfy their immediate requirement.... <a href="http://www.matrixmarketers.com/android-app-developers-5-tips-optimize-apps/">Continue reading</a>