OmniAICreator/Qiita-1.07M huggingface dataset:
HoloLensでUnity/UWPのライブラリ両方使う際のスレッド問題について

#悩ましいスレッド問題
一般的なスレッド問題といえばデッドロック系の話、GUIを伴うアプリではメインスレッドとサブで使うスレッド間の問題。。。などなどあるかと思います。
ここ数か月HoloLensのサンプルアプリを開発していてこのスレッド周りが普段作っているアプリの中でもとびぬけて面倒というかわかりにくかったので備忘録として残しておきます。
HoloLensでUnity/UWP両方がっつり使うときには見ていただくと少しは幸せになるかもしれません。

## HoloLensの開発で直面したもの
いくつか投稿しているサンプルの中で私の場合よくUWP側の実装を使います。理由がUnityわからないからというよこしまな部分もあるのですが、Microsoftの各サービスとの連携を考えると必然的にUWP寄りに実装するほうがシームレスです。
例えば[Cognitive Service API](http://qiita.com/miyaura/items/3c5182459e08db8683c9)なんかはもはやクラスのインスタンス化と１メソッド呼ぶだけで連携できてしまうくらいの手軽さです。


## 何が問題になるのか
例えばUnityでがっつり作っていてUWPはただビルドで吐き出して未変更でデプロイするなら問題になりにくいとおもいます。問題になるのはUnityとUWPの両方で実装するパターンです。
UnityにしてもUWPにしても、基本的なスレッドの考え方は一般的なスレッドの構成と同じだと思います。
つまりプロセスを起動すると実行される「メインスレッド」と「その都度呼び出されるスレッド」の２系統です。
このメインスレッドは使うアプリケーションのタイプによっていろいろ呼び方があると思うのですが、UWP等.NETでは画面が伴うアプリケーションでは「UIスレッド」という表現が多いかと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/6b2b3716-79ed-e37c-7541-bb770616c6b0.png)

HoloLensでUnityとUWP両方を使う場合ちょっとした問題が起こります。UnityはUnityで「Appスレッド」というUnity側でのメインスレッド（？）がありその上で処理が動いています。ですが、先に少し話したUWPなどの.NETの一部の機能は「UIスレッド」上での動作を要求します。つまりUWPの機能を利用するときはUIスレッドを使用しUnity側のライブラリであればAppスレッドを使用する必要が出てきます。図にするとこういう関係があることがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/f4caee83-b555-b3a1-6e08-f44123dc7bf3.png)


## 対応方法
この問題の解決策はそれほど難しいわけではなくAppCallBacksクラスを利用して適切なスレッドでアプリを動かせは解決は可能です。どう切り替えるかについては比較的わかりやすいです。ある程度対処療法的にもできるのですが以下の要素についてはまず間違いなくそれぞれのスレッドでの動作が必要になります。

* 画面オブジェクトの操作（ex:表示テキストの変更、座標変更など）
* リソースアクセス操作（ファイルI/Oなど)
* デバイス関連（カメラなど）

上記の機能をUnityのライブラリでやればAppスレッド上で、UWPのライブラリでやればUIスレッドでとなります。

## 対処パターン
私がよく使っているパターンとしてUWP側でリソース系の処理を行った後にその結果をUnityの画面に出すというものです。この場合、UWP側なのでUIスレッドを使用します。UWP側の処理が終わってからAPPスレッドでUnityの画面の処理を呼ぶ実装を入れることが多いです。

```csharp
// Copyright(c) 2017 Takahiro Miyaura
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
AppCallbacks.Instance.InvokeOnUIThread(async () =>
{
    //UIスレッド（UWP）側での対処が必要な処理
    
    AppCallbacks.Instance.InvokeOnAppThread(() => {

        //Appスレッド（Unity）側での対処が必要な処理

    }, false);
}, true);
```

### 同期/非同期での問題
基本的にマルチスレッドを想定した処理を書くように気を付ければいいのですが、「[HoloLensでCognitive Service APIを使ってみたー困ったことー](http://qiita.com/miyaura/items/3c5182459e08db8683c9#%E5%9B%B0%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8)」に記載したような予想しえない問題も時々出てきます。カメラからスクリーンショットをとるためのメソッドなのですが非同期メソッドのためawaitで待機させてもエラーになります。キャプチャデータをストリームに書き込んでいるんだと思うのですが。。。対処方法としてはawaitではなく同期するように処理を変更することで対処できました。

## 最後に
マルチスレッドになる状況での実装ではいろいろ気を配っておかないと思わぬ動作になります。それぞれ見極めが必要ですが基本的には「リソースなどの次の処理までに確実に終わってほしい処理」のみ同期処理を行い、それ以外は非同期とすれば
おおむね解決すると思います。その時に「この処理はUnity？UWP？」と問いかけてみて正しいスレッドで処理するように気を付ければよいと思います。
NEMで開発する前に抑えておきたい基礎知識

今回はNEMを利用したアプリケーションを開発するために最低限知っておくべきことを説明します。マルチシグやモザイクなどNEMならではの特徴については、また日を改めて説明します。あと、P2P、暗号化、デジタル署名、コンセンサスアルゴリズムなどブロックチェーンの根幹を成す技術についても別の機会に。


###アカウント
- アドレス(Address)
- 公開鍵(Public Key)
- 秘密鍵(Private Key)

一つのアカウントには必ずこの3セットの情報があります。
送金するためには、送信先のアドレスと送信元の公開鍵・秘密鍵の情報が必要になります。

###アカウント情報
- 残高(balance)
- 重要度(importance)
- 既得残高(vested balance)
 
残高のことを英語でbalanceと言います。NEMではXEMという単位の通貨を用います。その他、NEMの面白いパラメータとしてimportanceというものがあります。いわゆるそのアカウントの戦闘力です。この値が高いほど、経済力があり、金離れがいい人です。このimportance値は残高から直接計算されるのではなく、既得残高という、XEMを一つのアカウント内でしばらく漬け込むことで蓄積される数値も参考にして計算されます。


###トランザクション情報
- 送信者(From)
- 受信者(To)
- 送金額(Amount)
- 手数料(Fee)
- メッセージ(Message)
- ハッシュ(Hash)

NEM上で送金を行うためには、トランザクションと呼ばれる処理単位でサーバ（ノード）に問い合わせる必要があります。処理に使用されるデータ項目は大まかに上記の通りです。それぞれの処理にはハッシュ値が付与され、これを記録しておけばいつでもこの処理を瞬時に参照することができます。送金だけではなく、様々なトランザクションが存在しますが、とりあえず今回はこれだけ。


###ネットワーク環境
- Maine
- Testnet
- Mijin

Mainnet がいわゆる本番環境であり実際にXEMという通貨がやり取りされています。Testnetがテスト環境です。これらはグローバルに公開された同一ノード上に展開されているのに対し、Mijinはプライベート上のネットワーク上に展開されています。現在、Mijinではトランザクションの処理時間をMainnetよりも短く設定するなどしてIoTなどでも問題なく使えるような実験が実施されているようです。

今回は以上です。
ブロックチェーン技術なのに、ブロックという概念を極力使わずに説明してみました。物足りないと思われた方はすでに暗号通貨についてそれなりの知識がある方かと思います。アプリケーションを開発していく中で思ったように動かない、といった場合にブロックの概念を正しく理解できていない場合が出てくるかもしれません。まあ、固いこと言わずに、まずは暗号通貨に触れてみましょう。

~~というわけで、次はいよいよアカウントの作成です。~~
~~とっても簡単ですよ！NEMならね！~~
アカウントの生成方法を説明する予定でしたが、セキュリティ上APIを利用したアカウント生成が出来なくなったようです。
現在nanowallet を利用したアカウント生成が最も簡単ですので、後日その方法をお伝えします。




以下のNEMアドレスは、全てNEM上でエンジニアが活動できるための資金に使用します。
これから私が書く記事に共感していただけましたら、ご寄附いただけると助かります。
NEM ADDRESS: NBZNQL-2JDWTG-UAW237-PXV4SS-XSPORY-43GUSW-GSB7
How to Energize People: Management 3.0ワークショップ体験

# 勉強会について

日時：2017-04-10（月）19:30 - 21:30
場所：エムオーテックス新大阪ビル
詳細：https://devlove-kansai.doorkeeper.jp/events/58499

Management 3.0について： https://management30.com/


# 最初のワークショップ

・仕事で何を幸せと感じるか
　⇒みんなで付箋に書いて貼った

# はじめに

### 背景

- 日本の従業員満足度は44%
- 幸福な従業員は生産性が12%増加することがわかった
- 前の日に幸せなことがあれば次の日はよりクリエイティブになる
- 2030年労働力不足

### 人の好む仕事とは

- 自分の仕事に対しての評価
- 同僚との友好な関係
- ワーク・ライフ・バランス
- 上司との良好な関係

# Management 1.0

トップダウン型組織

#### 人が機械のように使用される

- 監視するべき
- 直すべき
- 部品を交換するべき

#### Management 1.0のデメリット

- モチベーション低下、関係低下など
- 現代のグローバルな労働環境に合っていない

Doing the wrong thing!
間違った事をしている

# Management 2.0

「人が会社の宝である」と認めるが、上が決めたとおりに人をやる気にさせる
例）ノー残業デー⇒極端なアプローチ

⇒正しいことを間違った方法でやっている
Doing the right thing, but wrong!


# Management 3.0

- 企業は人間のネットワーク
- 組織は都市のようなもの
- マネジメントの責任が分散される
- 2.0までは全体を動かすパワーはトップのマネジメントが持っている
  ⇒マネジメントは要素なのでマネジャーだけの権限ではない

- 人ではなくシステムをマネージするべき
  例） [Bonusly](https://bonus.ly)
  いい仕事をした人にみんなでポイントをあげてポイントの多い人にボーナス（ランチのチケットなど）を贈る


# Moving Motivatorsのワークショップ

[Moving Motivators](https://management30.com/practice/moving-motivators)

- 10種類のカードを自分にとって重要な順番に並び替える
- グループで自分の並べたカードの順番とその理由をお互いに共有する

![Moving Motivators cards](https://1qjpt15fhlq3xjfpm2utibj1-wpengine.netdna-ssl.com/wp-content/uploads/2015/02/moving-motivators-playing-300x65.png)

- CURIOSITY（好奇心）
- HONOR（名誉）
- ACCEPTANCE（受容）
- MASTERY（熟達）
- POWER（権力）
- FREEDOM（自由）
- RELATEDNESS（関係性）
- ORDER（秩序）
- GOAL （ゴール）
- STATUS（地位）

[日本語のカード](https://1qjpt15fhlq3xjfpm2utibj1-wpengine.netdna-ssl.com/wp-content/uploads/2017/03/Management30-MovingMotivatorCards-2015-self-print-A4-Japan.pdf)

#### Moving Motivatorsの活用例

1.　チームのコミュニケーションがうまくいっていない
2.　ジョブインタビュー
3.　新チーム、新プロジェクト

# エンゲージメント

エンゲージメントは日本語にするのが難しい
「結びつき」が近いニュアンス

#### 残念ながら日本では従業員のエンゲージメントレベルは低い

会社に積極的にエンゲージメントしている人…7%

#### エンゲージメントは恐らく満足と幸福と相関する

どっちが先か？
⇒両方…幸福を育む AND エンゲージメントを育む

#### 成功は幸福につながるか、幸福は成功につながるか

- 幸福は単なる結果ではなく成功の前兆であることを知っています
- 従業員の満足度は高いパフォーマンスにつながる
- いいニュースは自発的調整で自分の状況にいくらでもたくさんある
- 変化することを決めたらあなたの幸福のレベルは持続的に上がる可能性が高い
- 幸福は目標ではなく道である
- 富とのつながりは独特
- 従業員の幸福は複雑


#　幸福のマネジメント

## [12ステップの幸福](https://management30.com/practice/happiness-steps/)

https://management30.com/wp-content/uploads/2015/06/12-Steps-to-Happiness-v1.00-Poster-color.pdf

- 感謝
  [Kudo Box](https://management30.com/product/kudo-cards/)
  誰かに感謝カードを送る

- あげる（Give）
  プレゼントを贈る
  日本のお土産は良い習慣
- 手伝う
- 食べる
  健康な食べ物
- 運動する
- 休む
 充分に休憩、睡眠
- 体験
- 散策
- 瞑想
  心を満たす習慣
- 社交
  関係を深める
  Personal Mapsを作る
- 目標
  仕事の成果物などを壁に貼る
- スマイル
  毎朝GoodとNewを共有

## ニコニコカレンダー

## 幸せドア

- 会議室のドアに幸福度に応じた4段階の顔を貼っておく
- 会議後の自分の心境に応じて幸福度に合致する段階にコメントを付けて付箋を貼って退出する
- 退出時にすぐフィードバックできる

# 補足

![DSC_4036.JPG](https://qiita-image-store.s3.amazonaws.com/0/3324/2da72d49-8962-7282-5a0d-a0cb6cdaa713.jpeg)

参考スライド：https://pt.slideshare.net/StefanNsperling/the-happiness-of-workers-management-30
latexdiffで日本語の差分を出す

# latexdiffとは
latexdiffでは、2つのtexの差分を表示してくれる.

```latexdiff before.tex after.tex > diff.tex
```

# 日本語の場合
日本語では、上記のコマンドを打つと改行がおかしくなってしまう.
そのため、日本語では、以下のオプションをつけて、色の変化のみで差分を表現する.

```
latexdiff -e utf8 -t CFONT before.tex after.tex > diff.tex
platex diff.tex
dvipdfmx diff.dvi
open diff.pdf
```

# dvipdfmxを使う場合
dvipdfmxを使う場合、diff.texの色が出ない場合がある.
その場合、documentclass内にdvipfmxを入れ、

```
\include{graphicx}
\include{color}
```
とする.

```
\include[dvipdfmx]{graphicx}
\include{color}
```

などのようにしないように
DXライブラリでマンデルブロ集合をかく

こんにちは．はっちーです．Cライクな僕にとってDXライブラリは非常に貴重なライブラリです．簡単なわりに有能ですからね！
Unityの勉強もそろそろしたいと思ってるんですけど(笑)
今日はそのDXライブラリを使ってマンデルブロ集合を書いてみました．
マンデルブロ集合，プログラマはやたら好きかもしれません(笑)

#マンデルブロ集合の定義

以下はマンデルブロ集合の定義です．．

漸化式

$$z_{n+1}=z_n^2+c $$
$$z_1=0$$

で定義される複素数列が$n \to \infty $で発散しないとき複素数$c$がマンデルブロ集合に属するといい，そのようなc全体のことをマンデルブロ集合という．

#実装
マンデルブロ集合の定義をプログラムしやすいように変形してみましょう．
$z_n=x_n+iy_n$として，実部と虚部に分ける操作を行います．
すると，漸化式は

```math
\begin{align}
x_n &= x_n^2-y_n^2+Re(c) \\
y_n &= 2x_ny_n +Im(c)\\
x_0 &= y_0 =0
\end{align}
```

のように，実数のみの演算で行うことができます．
次に，数列の収束条件です．マンデルブロ集合が収束する範囲は$|c|<2$の範囲であることが分かっています．
もし，$|z_n|>2$ならば，$|z_{n}|^2>4$となります．$c>-2$はですから定義より$|z_{n+1}|>2$を導けます．
これにより，この数列は一度$|z_n|>2$となればそれ以降も増大していく．すなわち発散するということです．
$|z_n| = |x_n+iy_n|=\sqrt{x_n^2+y_n^2}$となります．sqrtを計算する時間を省くために両辺二乗します．
まとめると得られた発散の条件は

```math
x_n^2+y_n^2 > 4
```

となります．この$n$について色分けするとマンデルブロ集合になります．

コンピュータにおいては$n$がある回数以上になれば収束と判定するという妥協をしまければいけません．
数列の一般項が見つかればなんとでもなるのですがこの漸化式において一般項は見つかっていません．（僕も見つけようとして一晩数式をこねくり回していたことがあります．）

以下にある$c$について，マンデルブロ集合に属しているか属していないか判定する関数を示します．

``` mandelbrot_function.cpp
#define Judge 200

int Mandelbrot(double x,　double y) {
	double x_0 = 0.0;
	double y_0 = 0.0;
	double x_n, y_n;
	int count = 1;
	while (count < JUDGE) {
		x_n = x_0*x_0 - y_0*y_0 + x;
		y_n = 2.0*x_0*y_0 + y;

		if (x_n*x_n + y_n * y_n > 4.0) return count;	//必ず発散する

		x_0 = x_n;　y_0 = y_n;
		count++;
	}
	return 0;
}
```

大文字で書いてるのはすべて定数です．
色の付け方は適当です．いい色の付け方があったら教えてください．

```mandelbrot.cpp
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), SetGraphMode(X_Gr, Y_Gr, 32);
	DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

	double x_min = -2.0;
	double x_max = 2.0;
	double y_min = -2.0;
	double y_max = 2.0;

		for (int i = 0; i < X_Gr; i++) {
			for (int j = 0; j < Y_Gr; j++) {
				long double x, y;
				int color;

				ij2xy(&x, &y, i, j, x_min, x_max, y_min, y_max, X_Gr, Y_Gr);

				color = Mandelbrot(x, y);
				if (color == 0) DrawPixel(i, j, GetColor(0, 0, 0));
				else           DrawPixel(i, j, GetColor(color % 256 + 1, (color % 16) * 16 + 1, (color % 32) * 8 + 1));
				if (!Myloop()) { DxLib_End(); return 1; }
			}

			//DrawString(0, 0 , temp_x, GetColor(0, 0, 0));
			//DrawString(0, 20, temp_y, GetColor(0, 0, 0));
			//if(i%20==0) ScreenFlip();
		}
		ScreenFlip();
	SaveDrawScreenToPNG(0, 0, X_Gr, Y_Gr, "mandelbrot.png", 20);
	DxLib_End();
	return 0;
}

```

とりあえず，このコードでできたマンデルブロ集合はこちら

![mandelbro.png](https://qiita-image-store.s3.amazonaws.com/0/172864/4b898d4d-f00c-0945-e424-02fbef6f2669.png)

綺麗ですね！少し解説するとすれば，黒のところが収束してしまうところ色つきは発散しないところです．

長くなるのでコードは書きませんが永遠とズームしていくプログラムも書きました．gif画像です．
$z= -0.75147732885+0.031315348 i$に近づいていくところです．数値は適当です
浮動小数点数の限界を達したので途中で打ち切ってます．


![mandel.gif](https://qiita-image-store.s3.amazonaws.com/0/172864/23e72bbb-4a32-a20d-eaff-2fe46f4636f5.gif)


何か質問やアドバイスなどあればよろしくお願いします．
重複する値を含むコレクションからユニークな値のコレクションを生成する

# 概要

下記のような重複する値を持つコレクションから、重複する値には連番を付けてユニークな値のコレクションを返すサンプルコードです。

```java
List<String> list = Arrays.asList("a", "b", "c", "a", "b", "b", "d", "a", "b");
```

なお、重複しない値（または最初の値）には連番は付けず、重複したときに2以降の連番を付加します。
たとえば

```text
a, a, b, c, c, c
```
は

```text
a, a_2, b, c, c_2, c_3
```

のようにします。


## サンプルコード

```java
public static class UniqueValue {
    private Map<String, Integer> cache = new HashMap<>();

    String get(String name, Integer idx) {
        String tmp;
        if (idx > 1) {
            tmp = name + "_" + idx.toString();
        } else {
            tmp = name;
        }
        if (!cache.containsKey(tmp)) {
            cache.put(tmp, idx);
            return tmp;
        }
        // 重複している場合は連番を加算して再帰する
        return get(name, idx + 1);
    }

    void dump() {
        cache.entrySet().forEach(e -> {
            System.out.println("dump: key=[" + e.getKey() + "] i=[" + e.getValue() + "]");
        });
    }
}
```

### 実行する

```java
List<String> list = Arrays.asList("a", "b", "c", "a", "b", "b", "d", "a", "b");

UniqueValue un = new UniqueValue();
Set<String> unique = list.stream()
    .sorted()
    .map(name -> un.get(name, 1))
    .collect(Collectors.toSet());

unique.forEach(System.out::println);
// → a
// → b
// → c
// → a_3
// → b_2
// → d
// → a_2
// → b_4
// → b_3

un.dump();
// → dump: key=[a] i=[1]
// → dump: key=[b] i=[1]
// → dump: key=[c] i=[1]
// → dump: key=[a_3] i=[3]
// → dump: key=[b_2] i=[2]
// → dump: key=[d] i=[1]
// → dump: key=[a_2] i=[2]
// → dump: key=[b_4] i=[4]
// → dump: key=[b_3] i=[3]
```
VR開発環境についての調査(超簡易)

研究でVRを使うことになるので、各エンジンの調査とか

#候補
- Unity5
- UnrealEngine4
- WebVR

#各エンジンの特徴
##Unity
- C#で記述(独自仕様のJavaScriptも使える)
- 総合的な自由度が高い(らしい)
- UnrealEngineより要求スペックが低い
- 日本語ドキュメントが充実しているらしい
- 充実のアセット

##UnrealEngine
- BluePrintと呼ばれるノードベースのスクリプティングシステムを使用して記述
- C++でも記述可能
- Unityよりグラフィックが美麗
- 最近アセットが充実してきたらしい

##WebVR
- Three.jsとか色々ライブラリを突っ込むらしい
- 当然Webページで公開できる


#UnityのVR
なんかライブラリ？をとりあえず3つくらい見つけた。

- Google VR SDK for Unity
- Vuforia
- UnityVR(標準搭載)

またここら辺ある程度調べたら追記しよう。


#まとめ的な何か
がっつりゲーム作りたいならUE4で、それもC++メインで書いていくといいみたい。でも今回の研究でグラフィックとかそんなに必要では無いからUnityでいいかな、情報多いみたいだし。WebVRは情報が少ないっぽくてよくわかんなかったし。C#かJSかだけど、これもC#が多いみたいだからそっちにしよう。JSの独自仕様も既にJSやってたら取っつき難いみたいだしどうせならC#もやってみたいし。
【初心者投稿-20】初心者の味方。要素検証

#初心者の味方
昨日大感動した便利機能を発見しました！

かっちょいいウェブページとか参考にしたいウェブページのソースコードを検証するショートカットキー。

**⌘+option+c**

自分が作ってみたページサンプルも要素検証上で要素順番を入れ替えたらどうなるのか、とか
フォントや大きさ変えたらどうなるのかも検証できる！

要素検証画面も複雑なので大変ですが、こういうお助けグッズや便利機能は知っておくべきですね！
他にも何かあったら教えてください！

#学習の記録
* サイト作り：4日目
* 今日の勉強時間：2時間
* 総学習時間：22時間45分
ファイル末尾の改行コードを削除する

## vim

```
: set binary noeol
```
これを実行してから保存する

## Ruby
```
$ echo -ne 'ABC\nDEF\n' | ruby -0777 -ne 'print $_.chomp("")'
```

※こちらのページを参考にさせていただきました。
http://d.hatena.ne.jp/zariganitosh/20131216/end_of_file_lf_control

## 本当は
sedなどのLinuxのコマンドでやりたかったが、上手くいかず。

うまい方法をご存じの方、ぜひ教えていただきたいです。
ウォーターフォール開発の課題

### ウォーターフォール開発の課題

　ウォーターフォール型の開発では、この仕様のとおり作ればうまくいくことを示す直接的な方法がないことが最大の弱点なのではないかと思いはじめている。
　

[「ウォーターフォールモデルは間違いだ！」 pdfファイルの11枚目](https://www.esd21.jp/news/c7c4003e57cd20cde48ff5e106752ce1884265fc.pdf)
とする資料もある。


- 仕様を書いている人が、まだその段階では作るべきシステムを理解していない。
    - 実現したいこと
    - 実現可能な方式はどれだけあるか
    - その中から実現するのによい方式は何か
    - どうやってテストするか
    - どうやってシステムをメンテナンスするか
　　こういった項目を考えないままに書かれた仕様書は役に立つことなく、開発者にあだをなすことになる。   

- 一方、bottom-upで開発をする側は、アジャイルな開発をする。
    - できないことをやれと言われても困るから、できるものをbottom-upでプロトタイピングして実装する。プロトタイピングでその方式が結果を出せることを確かめつつ進めている。
- その結果、現場を顧みずに作りっぱなしの仕様書は、役に立たず放置されている。
- ウォーターフォール型では、「開発はやらせるもの。そのとおりできない側が悪い。」というニュアンスがどこかに隠れているような気がする。
    - 発注側と受託側という力関係や、上司と部下という値から関係の中で、その仕様の妥当性を検討しないままに、ごりおししがちです。
    - 仕様を作成する側が、それが実現可能かどうか、作りやすいかどうか、その仕様にしたがって作れば絶対うまくいくことを担保するための努力を怠っている場合がある。
    - ネットのニュースに聞く某システムの場合の場合、ただでさえ複雑になりそうなシステムを、しがらみのために、複数の会社に分担させてしまっている。そのことで、複雑なシステムを少しでも単純化しやすくするための調整作業を困難にしているのではないかと推測される。


    - 該当技術の担当者が、それは無理だと明言しているのにも関わらず、それをできることを前提として開発を継続しようとする。
　
- 仕様を作成して外部に委託すれば問題が解決したかのように扱われて、納期になって解決していないことに気づく。
    - 例：納品されたのが使いものにならない実装だった。
    - 実現にはある難しさがあるからこそ、開発を委託したものが、その難しさをまったく解決していなかった。そのため実用にはならず放置された。その問題を解決して納品されてくると信じているから、その問題は結果的に放置されていたことになる。

- 例：納品されたソースコードは、仕様書に書いたAPIをことごとく無視したものだった。
    MS-Wordで書いた仕様書で、開発を委託したのにもかかわらず、それとは違ったAPIになっていた。
　

付記
仕様を作成する上で必要なこと

- 適度な抽象化
　実装の詳細は変化するものだから、適度なレベルで外部仕様を抽象化するのがよさそうだ。
　適度なレベルがどのあたりなのかは、どのようなデータ構造までは見えて、どのようなデータ構造を見えなくするのか。
　私自身が試行錯誤中です。

- 依存性を切り離す。
　ライブラリはなるべく依存性が少なくなるようにする。

- ロジックを単純化する。
　まとめて扱うべき変数に対して、メソッド名を見れば何をするものなのか分かることを目指して単純なロジックにする。
　単純なロジックはテストも考えやすくなる。

 
- 対応するテスト項目が思い描くことができないならば、仕様の明確化ができていない可能性が高い。
    - run time errorを生じる可能性があるならば、そのときの動作はどうなるのか？　例外の発生か？戻り値のチェックか？


ウォーターフォール開発でときとして欠け落ちていること

- 要求仕様の明確化
    - 要求仕様があいまいなまま、いつまでたって仕様がfixしない。そのソフトウェアに何を実現させたいのか不明確なまま。そのため、どんなに有能なソフトウェア技術者を投入したところで、解決できない。
- 実現可能性
    - その仕様がどうやって実現できるのかへの検討作業がないまま、仕様を確定してしまう。そのため、願望としての仕様にすぎず、だれも実現できなくなってしまう。
 
この２つの特徴は、開発に失敗した大規模ソフトウェア開発事例によく見られる。

ウォーターフォール開発で時として生じていること
- 適切な要件定義、適切な上位設計をできるようになるには、コーディング・リファクタリングなどの経験を積んで適切な設計のしかたを習得しなければならないのに、「コーディングは下請にやらせるものだ」という考え方を生じている組織があったりする。
　
----

（株）日立ソリューションズ [「上流工程（要件開発工程）から実践するQCD向上施策」](http://www.hitachi-solutions.co.jp/forum/tokyo/vol62/pdf/pb_seminar62_3.pdf)
15/48 のページから  
>⑤実現が可能であること：
要件がシステム稼働環境における既知の性能や制約の範囲内であること
⑥検証できること：要件を満たしているか確実に判断できる手段があること

---
アジャイルな開発手法については 以下の情報源がある。
IPA [エンタプライズ系事業/非ウォーターフォール型開発](http://www.ipa.go.jp/sec/softwareengineering/std/ent02-c.html)
Go言語でtime.Parse関数を使って時刻を取得する時のフォーマット備忘録

## はじめに
　Goのtimeパッケージ内にあるParseメソッドを使って、文字列→時刻に変換する時に、文字列の体裁の指定が求められる。
　Go言語では決められた数字を任意の記法で書くことで、体裁を定義することができる。

```go:例
format := "2006-01-02 15:04:05"
t, err := time.Parse(format, "2017-04-30 23:36:00")
```
　体裁に用いられる時刻は公式で定められており、一寸でも違うと正常に変換できない。なので、公式が定めているフォーマット用の時刻と、その記述例を自分なりにわかりやすく備忘録。

## 雛形と記述例
| 項目 | 雛形 | 記述例 |
|:-:|:-:|:-:|
| 年 | 2006年 | 2006 |
| 月 | 1月 | 01, Jan |
| 日 | 2日 | 02, 2|
| 曜日 | 月曜日 | Mon |
| 時 | 15時 | 15 |
| 分 | 4分 | 04 |
| 秒 | 5秒 | 05 |
| ミリ秒 |000| 000 |
|時差|-7:00|-0700, -07:00|

## 例
```go
format0 := "2006-01-02T15:04:05.000 -07:00"
format1 := "Jan 2 150405-0700"
```

この仕様のメリットは、ソースコードを確認した時に時刻のフォーマットが直感的に分かりやすいところ。最初の数字を覚えるのが面倒くさい。
貧者の GKE / FluentBit でログ収集


## TLDR

- 無料枠の f1-micro には fluentd は大きい
- 軽量なログ収集エージェント fluent-bit
	- Kubernetes 対応
	- Go でのプラグイン作成可能
- fluent-bit で Stackdriver Logging にログを出力することで大幅なリソース削減

## 今までのあらすじ

GCP の無料枠だけで GKE クラスタを作ることができたが、一部の Pod が Pending となっっていた。
http://qiita.com/apstndb/items/788f705e71e7660967a6#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9

調べてみると、最大の Pod は Stackdriver Logging への各コンテナのログ収集のために生成されている `fluentd-cloud-logging` であり、実測 80 MB を超えるリソースを使用していた。
http://qiita.com/apstndb/items/1c3f8ea026ed6b27e357#%E5%86%85%E8%A8%B3

## 貧者のログ収集

`fluentd-cloud-logging` はクラスタ生成時に `--no-enable-cloud-logging` を指定して無効化することができるが、 [12factor のログ](https://12factor.net/ja/logs) が扱えないのは非常に不便である。何か代替を考える必要がある。


### fluent-bit

そこで今回目をつけたのが C で書かれた軽量なログ収集エージェントの [fluent-bit](http://fluentbit.io/) だ。
[Kubernetes 対応](http://fluentbit.io/documentation/0.11/kubernetes/) もあり、Ruby で動く fluentd よりも省リソースであることが期待できる。
実際の Kubernetes 連携の例を探してみると、 DaemonSet として動作して Elasticsearch に出力する例も公式で [fluent/fluent-bit-kubernetes-daemonset](https://github.com/fluent/fluent-bit-kubernetes-daemonset) として見つかった。

Elasticsearch は JVM で動作して富豪的なリソースを要求するため貧者には手が届かないが、これができるのであればやりたいことは大体できそうだ。

プラグインの書き方を探したところ、 Go でプラグインが書けることがわかった。
https://github.com/fluent/fluent-bit/blob/master/GOLANG_OUTPUT_PLUGIN.md
https://github.com/fluent/fluent-bit-go

Go には Google 公式の [Stackdriver Logging のクライアントライブラリ](https://cloud.google.com/logging/docs/reference/libraries)があるため、 Stackdriver Logging に出力する fluent-bit を Kubernetes のログ収集に使うことができるのではないか。

## fluent-bit-stackdriver

というわけで検証してみたのが下記リポジトリだ。
[apstndb/fluent-bit-stackdriver](https://github.com/apstndb/fluent-bit-stackdriver)

まだ他の人が使えるようには整備しておらず、品質も低いが、実際に Kubernetes の各 Pod が出力するログが Stackdriver Logging へと渡ることが確認できている。

![スクリーンショット 2017-04-30 23.05.04.png](https://qiita-image-store.s3.amazonaws.com/0/1936/354e3d88-c897-b389-9307-54170064a21c.png "スクリーンショット 2017-04-30 23.05.04.png")

まだリソース使用量を見てみると、下記のように 10 MB のオーダーのメモリ使用量となった。

```
$ kubectl top pod --all-namespaces
NAMESPACE     NAME                                                        CPU(cores)   MEMORY(bytes)
default       hostnames-3799501552-99h7f                                  0m           0Mi
kube-system   heapster-v1.2.0.1-1382115970-gjg66                          0m           24Mi
kube-system   fluent-bit-kgjzl                                            0m           10Mi
kube-system   kubernetes-dashboard-3543765157-s86rn                       0m           16Mi
kube-system   kube-proxy-gke-sandbox-cluster-default-pool-8b3dece3-ngf9   0m           12Mi
kube-system   kube-dns-2185667875-75kdg                                   0m           16Mi
```

以前計測した fluentd よりも 70 MB 程度は削減できている。これなら 600 MB しか RAM のない f1-micro インスタンスでのログ収集が現実的なものになってきたのではないか。
開発中に使うGitコマンド

### このページを読んでわかること
- 開発のフェーズごとに使うGitコマンドすべて

## 実装前
- リモートリポジトリを追加する

```ruby:
$ git remote add [ローカルに作成したいリモート名] [URL]
```
## 実装中
- 自分がどこのブランチにいるかを確認する→ブランチの頭に"*"がついている

```ruby:
$ git branch
```
- リモートのブランチも合わせて確認する

```ruby:
$ git branch -a
```

- ブランチを作成する（自分の現在いるブランチと同じものを別名で作る）

```ruby:
$ git branch [ブランチ名]
```

- リモートブランチをローカルにチェックアウトする（ブランチも作成したブランチに移動した状態になる）

```ruby:
$ git fetch
$ git checkout -b [ローカルに作成したブランチのブランチ名] remotes/[リモート名]/[リモートのブランチ名]
```

- ブランチを移動する

```ruby:
$ git checkout [ブランチ名]
```

- リモートの最新コードを取り込む

```ruby:
$ git fetch [リモート名]
$ git pull
```

- リモートの最新コードをマージする

```ruby:
$ git fetch [リモート名]
$ git merge remotes/[リモート名]/[ブランチ名] 
```

- ブランチの状態を確認する（コミットしていない変更やコンフリクトファイルなどを確認できる）

```ruby:
$ git status
```

- ブランチを削除する

```ruby:
$ git branch -D [削除したいブランチ名]
```
- 変更の入った状態を一時退避させる（コミットせずに他のブランチに移れるようになる）

```ruby:
$ git stash
```

- stashしたものを確認する

```ruby:
$ git stash list
```

- stashを削除する

```ruby:
$ git stash drop [stash名]
```

- stash内容を戻す

```ruby:
$ git stash apply [stash名]
```

## 実装後
 - コミットする
 
```ruby:
$ git add .
$ git commit -m "コミットコメント"
```
- リモート名を確認する(ローカルにクローンしているリモートリポジトリ一覧を見ることができる)

```ruby:
$ git remote -v
``` 
- リモートリポジトリにプッシュする
 
```ruby:
$ git push [リモート名]
```
Goでのアルゴリズムクイックリファレンス第2版(4.1.1 挿入ソート)

Goに慣れるためとアルゴリズムの復習の為に週1ぐらいで更新していきます。[アルゴリズムクイックリファレンス 第2版](https://www.amazon.co.jp/gp/product/4873117852/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117852&linkCode=as2&tag=amesho-22&linkId=b7688201ae37a6234596fa96dfd3ccdd)を読んで各種アルゴリズムをGoで実装して行きます。

今回は挿入ソートです。整列アルゴリズムの一種。平均(O(n2))と遅い処理。[安定](https://ja.wikipedia.org/wiki/%E5%AE%89%E5%AE%9A%E3%82%BD%E3%83%BC%E3%83%88)しているソート。追加の記憶領域を殆ど使わない[in-placeアルゴリズム](https://ja.wikipedia.org/wiki/In-place%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)であり[オンラインアルゴリズム](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)でもあるようだ。(この2種類の仕分けは改めて確認していたらしれたので良かった)

https://play.golang.org/p/R8RFUjfwkm

```go

package main

import "fmt"

func sort(ary *[]int) {
	for pos := 1; pos < len(*ary); pos++ {
		insert(ary, pos, (*ary)[pos])
	}
}

func insert(ary *[]int, pos int, value int) {
	i := pos - 1
	for i >= 0 && (*ary)[i] > value {
		(*ary)[i+1] = (*ary)[i]
		i = i - 1
	}
	(*ary)[i+1] = value
}

func main() {
	ary := []int{3, 2, 1, 5, 10, 7, 9}
	fmt.Println(ary)
	sort(&ary)
	fmt.Println(ary)
}
```

次回は[選択ソート](https://ja.wikipedia.org/wiki/%E9%81%B8%E6%8A%9E%E3%82%BD%E3%83%BC%E3%83%88)の予定
Composerを初めて使う(npmとの対応で紹介)

npmをちょっとだけ使ったことがある人間が、composerを初めて触った経験を元に、npmの〇〇はcomposerの〇〇なんだな！という対応で使用頻度の高い基本的なコマンドを紹介します。


## 環境
```
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1212

$ brew -v
Homebrew 1.1.11
Homebrew/homebrew-core (git revision 0e1e; last commit 2017-03-11)

$ node -v && npm -v
v6.9.2
3.10.9
```


## プロジェクト初期化

### 対話形式

npm
>$ npm init

composer
>$ composer init

対話形式でcomposerプロジェクトの設定を行います。
npm initと同じイメージでEnter連打しましたが、
Description []: の項目で
> Invalid author string.  Must be in the format: John Smith <john@example.com>
と怒られました。

警告どおりのフォーマットで入力するか、nでスキップします。

### とりあえず作成

npm
>$ npm init --yes

composer
>$ composer init -q

このオプションでは、メッセージを表示せずデフォルト設定でプロジェクトを作成します。

## パッケージのインストール

npm
>$ npm install -s <パッケージ>

composer
>$ composer require <パッケージ>

composer.jsonのrequireにパッケージ情報を記述した後にcomposer installという例をよく見かけましたが、
個人的にはこっちの方が自然？？

## パッケージのアップデート

npm
>$ npm update

composer
>$ composer update


## 番外編

npmで言うところの [npmjs.com](https://www.npmjs.com/) 的にパッケージを検索できるサイトは無いのか？？
>https://packagist.org/

というのがありました。
ここで検索すれば、大概見つかりそうです。
Mastodon おれおれインスタンスの DB Container の IP アドレスの取得方法

# 困ったこと

せっかくおれおれインスタンス立てたんだから
DB のぞきたい。
mac の お気にの DB クライアントでのぞきたい。
でも Docker 素人すぎて DB Container の IP アドレスがわからない。

# 答え

```
$ cd [mastodon のルート]
$ docker inspect -f "{{ .NetworkSettings.Networks.mastodon_default.IPAddress }}" mastodon_db_1
```
ES6モジュールのインポートとエクスポート


# 名前付きエクスポート

#### 各メンバをエクスポート

変数、関数、クラスの宣言文の先頭に`export`を付けると、その名前のままモジュールのメンバとして外部にエクスポートされる。

```javascript:module.js
export var foo = "foo";
export function bar() {}
export class Baz {
  baz() {}
}
```

次にように、定義済みの変数や関数を後からエクスポートすることもできる。

```javascript:module.js
var foo = "foo";
function bar() {}
class Baz {
  baz() {}
}
export {foo, bar, Baz};
```

#### メンバごとにインポート

エクスポートされたモジュールをインポートする。`import`のあとにインポートしたいメンバの名前を指定し、続いて`from`のあとにモジュール識別子を指定する。

```javascript:import.js
import {foo, bar, Baz} from "./module";
console.log(foo); // "foo!"
bar();
new Baz();
```

#### インポートする変数名を指定

エクスポートされたメンバの名前とは別の変数名としてインポートしたい場合は、import文で`as`を使う

```javascript:import.js
import {foo as poo} from "./module";
console.log(poo); // "foo!"
```

#### モジュールをまとめてインポート

エクスポートされたメンバを個別ではなく、モジュール全体をまとめてインポートする。参照時はプロパティアクセスのように各メンバを呼び出す。

```javascript:import.js
imoprt * as module from "./module";
console.log(module.foo); // "foo!"
```

# デフォルトエクスポート
名前付きエクスポートで、インポートするためにはエクスポートされたメンバの名前を知っている必要がある。これに対して、モジュール１つに対して１つのメンバに限り名前指定不要でインポートできるのが、デフォルトエクスポート。  
名前付きエクスポートに比べて、`{}`や`as`がないので書き方がシンプル。

```javascript:default-export.js
// foo.js
export default "foo!";

// bar.js
export default function() {
  console.log("bar!")
}

// baz.js
export default class {
  constructor() {
    console.log("Baz!")
  }
}
```

```javascript:default-import.js
import a from "./foo";
import b from "./bar";
import c from "./baz";
console.log(a); // "foo!"
b(); // "bar!"
new c(); // "Baz!"
```

# モジュールの定義位置
import文やexport文は、モジュールのトップレベル以外に書くことはできない。if文や関数の中に書くとエラー。  
この制約により、ES6モジュールの依存関係はJavaScriptとして実行する前に決定できるため、静的解析が可能。

```javascript:import-export-error.js
if (someCondition) {
  export default "foo"; //エラー
  import bar from "./bar"; //エラー
}
```

# 巻き上げ（hoisting）
import文は関数宣言文などと同じように巻き上げ(hoisting)が発生する。どこに書いてもモジュールの冒頭で宣言したことになるため、インポートした変数をimport文より前に使うことができる。

```javascript:hoisting
console.log(a); // "foo!"
import a from "./foo";
```

# モジュール内はstrictモード
ES6モジュールは必ずstrictモードとして実行される。また、ES6モジュール内ではトップレベルの`this`が`undefined`になる。ブラウザでは通常のスクリプトのトップレベルの`this`はwindwoオブジェクトだが、ES6モジュールは異なる。

# モジュール識別子の解決
モジュール識別子（`from`の後のモジュール指定パス）は、ローカルファイルは相対パス(拡張子なし)で指定し、npmパッケージはパッケージ名を指定する方式になる。

### 参考
[WEB+DB PRESS vol.87](http://gihyo.jp/magazine/wdpress/archive/2015/vol87)
Windows の詳細なバージョンを PowerShell で取得する

# winver による確認
winver をコマンドプロンプト/PowerShell/「ファイル名を指定して実行」のいずれかから実行すると、以下のような画面が表示され、Windows の詳細なバージョンを確認することができます。（以下画面では、Version 1703 (OS Build 15063.250)）

![winver.png](https://qiita-image-store.s3.amazonaws.com/0/168283/47b7fded-2fac-87a7-2601-705916fe8261.png)

しかし、winver では GUI で表示されてしまうため、自動化する場合などには不便です。ということで、PowerShell で winver と同等のバージョンが確認できる関数を作成していきましょう。

# Version と OS Build をレジストリから取得
上記の 1703/15063/250 に当たる部分をそれぞれレジストリから取得します。winver と同じように、「Version xxxx (OS Build xxxxx.xxx)」の形式で出力されるように関数を作成します。

```ps1:Get-WindowsVersion.ps1
function Get-WindowsVersion {
    $ReleaseID = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ReleaseId).ReleaseID
    $CurrentBuild = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name CurrentBuild).CurrentBuild
    $UBR = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name UBR).UBR

    "Version " + $ReleaseID + " (OS Build " + $CurrentBuild + "." + $UBR + ")"
}
```

# おまけ
上記の関数で Windows のバージョンを確認することができますが、エディションを確認することはできません。エディションも確認したい場合は既定で用意されている「Get-WindowsEdition」を使いましょう。（要「管理者として実行」）

```ps1
(Get-WindowsEdition -Online).Edition
```

また、Windows 10 のサービスオプション（CB とか CBB とか）ごとの最新バージョンは [Windows 10 release information](https://technet.microsoft.com/en-us/windows/release-info.aspx) で確認することができます。
ggplot2で複数系列の折れ線グラフにラベルを付ける

系列が沢山ある折れ線グラフをそのままプロットすると凡例との対応が分かりにくくなる。

```r 
library(ggplot2)
ggplot(CO2, aes(x = conc, y = uptake, color = Plant)) +
  geom_line()
```

![Rplot01.png](https://qiita-image-store.s3.amazonaws.com/0/109348/57de33e5-28c6-c49a-5980-c6bf37ff501f.png)

# `geom_text()`を使う

```r 
ggplot(CO2, aes(x = conc, y = uptake, color = Plant)) +
  geom_line() +
  geom_text(
    data = subset(CO2, conc == max(conc)),
    aes(label = Plant),
    nudge_x = 50
  ) +
  theme(legend.position = "none")
```

![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/109348/7cbcfb85-7152-1ff7-c84b-1178c39aa208.png)

`subset`でx軸右端のデータを抽出し、`nudge_x`で少しプロット位置をずらすのと`theme(legend.position = "none")`で凡例を消しておくのがポイント。ただしこの方法だとテキスト同士は重なる可能性がある。

# `geom_text_repel()`を使う

```r 
library(ggrepel)

ggplot(CO2, aes(x = conc, y = uptake, color = Plant)) +
  geom_line() +
  geom_text_repel(
    data = subset(CO2, conc == max(conc)),
    aes(label = Plant),
    nudge_x = 100,
    segment.alpha = 0.5,
    size = 3
  ) +
  lims(x = c(min(CO2$conc), max(CO2$conc)*1.1)) +
  theme(legend.position = "none")
```

![Rplot02.png](https://qiita-image-store.s3.amazonaws.com/0/109348/94835b4e-1fc1-6537-5d8c-2d5e59c4d205.png)

`{ggrepel}`パッケージの`geom_text_repel()`はテキストが重ならないように自動的に調整してくれる。

`geom_text_repel()`はほぼ`geom_text()`と同じように使えるように作られているが、注意点がいくつかある。

- `nudge_x`でプロット位置を元のプロット範囲外までずらしても、プロット範囲が自動的に拡張されない。
    - 従って、`lims()`でx軸のプロット範囲を拡張しておく必要がある。
- segment(テキストから伸びる線)がデフォルトでは`geom_line()`の線と区別できないので、折れ線グラフの一部とみなされてしまう危険性がある。
    - 従って、`segment.alpha=`や`segment.size=`、`arrow=`等で外観を変えておいた方が良い。

# 余談

この内容はこの図が描きたくて調べた。

<img width="559" alt="スクリーンショット 2017-05-01 2.14.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/109348/75be3089-7ce5-7665-dd85-abb5e278287a.png">

が、割とどうでもいい部分で話が長くなるのでこの図の説明は[有機質資材からの窒素放出量を予測したい - もうカツ丼はいいよな](http://rion778.hatenablog.com/entry/2017/05/01/022353)に書いた。
[メモ] VPSのConoHaでMastodonのセットアップ

ConoHaの管理画面からサーバーを追加しようとしたら、
Mastodonのアプリケーションイメージが提供されてた。
これはお手軽そう。

[Mastodonアプリケーションイメージの使い方:Mastodonのセットアップ](https://www.conoha.jp/guide/mastodon.php)

![image](https://qiita-image-store.s3.amazonaws.com/0/150252/0dae3171-a986-4726-246f-09df9eec1b35.png)

[【リリース】「Mastodon」テンプレートイメージ提供開始](https://www.conoha.jp/news/?ap=2015051361&btn_id=top_news)


他のと特に比較してみてないけど、さくらとか他色々ありそう。
[ゼロからはじめるMastodon](http://knowledge.sakura.ad.jp/knowledge/8591/)
フォーム必須チェック用備忘録

# フォームの必須項目チェック

フォームで必須項目使う事はよくあると思いますが、それの入力がされているかチェック方法の備忘録です。

## チェックボックスにチェックが入っている個数
$('input[type="checkbox"]:checked').length

## 選ばれていないセレクトボックス
$('select option[value=""]:selected').length
※value部分は物によります


他随時追加予定
Cannot import name 'NUMPY_MKL'  解決方法。

## 何でこんなことを

最近KaggleでDataを読み込んで分析しています。
楽しいですね。
でも、Seabornのライブラリーをインストールしてimportすると！

![kaggle.PNG](https://qiita-image-store.s3.amazonaws.com/0/137182/ffd3998a-6918-a8bc-7e05-543b391bb417.png)


![giphy-downsized.gif](https://qiita-image-store.s3.amazonaws.com/0/137182/ebc3f055-7a43-1271-40b0-137f71425a3b.gif)

http://stackoverflow.com/questions/37267399/importerror-cannot-import-name-numpy-mkl

上のリンクで
``
from numpy._distributor_init import NUMPY_MKL
``

もやってみたんですが、解決できなかったです。

今から解決方法書きたいと思います。

## 方法

普通terminal や　CMDでpipインストールすると普通のnumpyがダウンロードされます。

![22.PNG](https://qiita-image-store.s3.amazonaws.com/0/137182/81f4d904-27f4-783a-fa3c-abf3debbfc1d.png)


私の場合はnumpyをUnisatllした後、再インストールしてみましたが、またErrorですた。

#### Numpy+MKL whl ダウンロード。

下のリンクに接続してください。

![the-new-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/137182/927b9a2a-425a-ae3d-b40a-c36b68348a78.jpeg)
ソース : http://static5.businessinsider.com/image/5841e484ba6eb67d058b74ee/the-new-legend-of-zelda-game-will-launch-with-the-nintendo-switch-on-march-3.jpg

- http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy

#### 自分のversionに合うファイルダウン。

![033.PNG](https://qiita-image-store.s3.amazonaws.com/0/137182/a00e9be2-b2e3-34fc-4845-9e965f0af057.png)

#### pipでインストール。

私の場合は今はwindowsなので、cmdを開けます。

![04.PNG](https://qiita-image-store.s3.amazonaws.com/0/137182/d231a03d-a092-15d2-4b28-9daa2a61374f.png)

ダウンロード完了したwhlをデスクトップ(Desktop)に移動しました。

```cmd:cd
$> cd Desktopのルート
```

```cmd:cd
$> pip3 install "numpy-1.12.1+mkl-cp35-cp35m-win_amd64.whl"
```
するとインストール始めます。

![1231.PNG](https://qiita-image-store.s3.amazonaws.com/0/137182/da57c528-3254-5dbb-f176-62667ae37a7c.png)

#### 確認。


![1234.PNG](https://qiita-image-store.s3.amazonaws.com/0/137182/27e0295b-abc6-5908-acdb-9fea75908791.png)

インストールした後、Seabornをimportすると、エラなしでした。

## 終わりに

**3段要約。**

*1. Numpy+MKL whl ダウンロード。*
*2. 自分のversionに合うファイルダウン。*
*3. pipでインストール。*

これ自分で解決まで、2時間くらいかかりました。:joy:
皆さんに、このPOSTが役に立ったら、嬉しいです。

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

**Dreamwalker。**
SemanticUI


```bash:bash

$ npm insstall -g gulp
$ cd myproject
$ npm install semantic-ui --save  

# デフォルトのAutomaticでEnter
# Yes

$ cd semantic
$ gulp build
```

```
$ tree semantic/src/themes/github/

semantic/src/themes/github/
|-- assets
|   `-- fonts
|       |-- octicons-local.ttf
|       |-- octicons.svg
|       |-- octicons.ttf
|       `-- octicons.woff
|-- collections
|   |-- breadcrumb.variables
|   |-- form.overrides
|   |-- form.variables
|   |-- grid.variables
|   |-- menu.overrides
|   |-- menu.variables
|   |-- message.overrides
|   |-- message.variables
|   `-- table.variables
|-- elements
|   |-- button.overrides
|   |-- button.variables
|   |-- header.variables
|   |-- icon.overrides
|   |-- icon.variables
|   |-- image.variables
|   |-- input.overrides
|   |-- input.variables
|   |-- label.overrides
|   |-- label.variables
|   |-- segment.overrides
|   |-- segment.variables
|   |-- step.overrides
|   `-- step.variables
|-- globals
|   `-- site.variables
`-- modules
    |-- dropdown.overrides
    |-- dropdown.variables
    `-- popup.variables
```
```
# githubだと上記が用意されているので、
# 以下の箇所を変更した
$ grep github src/theme.config 
@site       : 'github';
@button     : 'github';
@header     : 'github';
@icon       : 'github';
@image      : 'github';
@input      : 'github';
@label      : 'github';
@segment    : 'github';
@step       : 'github';
@breadcrumb : 'github';
@form       : 'github';
@grid       : 'github';
@menu       : 'github';
@message    : 'github';
@table      : 'github';
@dropdown   : 'github';
@popup      : 'github';

```
```
$ cd semantic
$ gulp build
```
Javaのlong型へ入れる数値にLをつける理由

# 初めに
後輩から、「新卒の方からこういう質問をされたのですが、
そういえばなんでですか」という質問をされたので、
自分で調べなといいつつ自分でも調べてみたのでまとめました。

# 答え
Javaでは数値を扱う際には、デフォルトでint型となっているため、
long型として扱うには明示的にlongであることを示す必要があるから
(数値リテラルの整数の値はint型として扱う)

# 追記
予想通りでした。
ただこれだけだとあれなので、ほかに気になったことを追記します。

## 他の整数型は?
byteやshortに関しては、数値のみでOK
ただし範囲を超えたら当然のごとくコンパイルエラー

byteはわかるが、shortにsがつかない理由は謎
(short自体あまり見ないが。。。)

## 小数型のデフォルトは?
小数型のデフォルトはdouble型となっている。

## 小数型の語尾は?
float型を扱う際には明示的にFをつける必要がある。

double型を扱う際にはDをつけることができる(つけなくてもいいし、見たことはない)

## 他の言語は
### Scala
javaと同じ

### Python
2.5まではJavaのようにlong型の場合にはlかLをつける必要があったが、
以降は、統合され必要はなくなった模様

### C
符号あり整数のlong型を扱う際にはlもしくはLをつける
符号なし整数のlong型を扱う際にはulもしくはULをつける

### C++
符号あり整数のlong型を扱う際にはllもしくはLLをつける
符号なし整数のlong型を扱う際にはullもしくはULLをつける

### C#
符号あり整数のlong型を扱う際にはlもしくはLをつける
符号なし整数のlong型を扱う際にはulもしくはULをつける
django-debug-toolbar の導入手順メモ

## 前置き
初心者のメモです。
自分の環境ではググった通りにやっても
うごかなかったのでどうにか動いた時のメモです。

django 1.11

ドキュメント
https://django-debug-toolbar.readthedocs.io/en/stable/



##pipでインストール

```
$ pip install django-debug-toolbar
```
## settings.pyに設定を書く
以下リンクよりコピペしました。。。
http://stackoverflow.com/questions/6390310/how-do-i-see-the-django-debug-toolbar

```python:settings.py
if DEBUG:
    INTERNAL_IPS = ('127.0.0.1',)
    MIDDLEWARE += (
        'debug_toolbar.middleware.DebugToolbarMiddleware',
    )

    INSTALLED_APPS += (
        'debug_toolbar',
    )
    # 表示する内容
    DEBUG_TOOLBAR_PANELS = [
        'debug_toolbar.panels.versions.VersionsPanel',
        'debug_toolbar.panels.timer.TimerPanel',
        'debug_toolbar.panels.settings.SettingsPanel',
        'debug_toolbar.panels.headers.HeadersPanel',
        'debug_toolbar.panels.request.RequestPanel',
        'debug_toolbar.panels.sql.SQLPanel',
        'debug_toolbar.panels.staticfiles.StaticFilesPanel',
        'debug_toolbar.panels.templates.TemplatesPanel',
        'debug_toolbar.panels.cache.CachePanel',
        'debug_toolbar.panels.signals.SignalsPanel',
        'debug_toolbar.panels.logging.LoggingPanel',
        'debug_toolbar.panels.redirects.RedirectsPanel',
    ]

    DEBUG_TOOLBAR_CONFIG = {
        'INTERCEPT_REDIRECTS': False,
    }
```

## urls.pyに追加する
your_appのところは適時書き換えてください。

```python:urls.py
from django.conf import settings
from django.conf.urls import url, include
from django.contrib import admin


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^your_app/', include('your_app.urls')),
]

if settings.DEBUG:
    import debug_toolbar
    urlpatterns += (
        url(r'^your_app/', include(debug_toolbar.urls)),
    )
```

## 注意点
デフォルトではbodyタグを検索して直前に挿入される。
なのでbodyタグがないと表示してくれません。

## 最後に
正直debug-toolbarを見ても？なが多い初心者ですが、動いたことがうれしかったです。
設定等、わからないことが多いので少しずつ勉強したいです。
aタグをブロック要素にして擬似的なクリッカブルマップを作成する

画像の一部の部分にaタグでリンクを張りたいといった場合に使える方法です。

このような実装をする場合、[クリッカブルマップ](http://www.tagindex.com/html_tag/img/img_map.html)を使用するのですが、座標を指定するなど計算が手間なのでより簡単に実装したい場合に。

##例
例えば、以下の画像の■の部分に対しクリック要素を貼ります。
![スクリーンショット 2017-04-30 21.18.33.png](https://qiita-image-store.s3.amazonaws.com/0/100132/a88b7a25-88a3-0094-b469-e34a57e9abfd.png)

コードは下記のとおりです。
aタグをブロック要素にし、幅と高さを指定することでクリック要素の領域を決めることが出来ます。
以下の例の場合は4辺が直線の場合のみ対応ですが、borde-radiusで円形のリンク領域を作成することも出来ます。ただし、より複雑な図形に対しクリック領域をきっちり決めたい場合はクリッカブルマップを使用したほうがよいです。


```ex.html

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
<style type="text/css" media="screen">
	body{
		position: relative;
		text-align: center;
	}
	.click{
		position: absolute;
		display: block;
		width: 2%;
        height: 7%;
        background: #000;
	}

	.left{
	  left: 382px;
      top: 164px;
	}

	.right{
	 right: 382px;
     top: 164px;
	}
</style>
<a href="#" class="click left"></a>
<a href="#" class="click right"></a>
<img src="http://placehold.jp/50/3d4070/ffffff/1000x350.png?text=%E2%96%A0%E2%86%90%E3%81%93%E3%81%93%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E8%A6%81%E7%B4%A0%E3%81%AB%E2%86%92%E2%96%A0" alt="">
</body>
</html>

```
eqの性質の証明


Coqにおいて「等しい」をあらわす述語`eq`の，反射律・対称律・推移律を証明します．
これらを2つのアプローチ「matchを使う」と「eq_indを使う」で証明してみます．

## 各種定義

Coqの`eq`は次のように定義されています．

```
Inductive eq (A : Type) (x : A) : A -> Prop :=  eq_refl : x = x
```

`eq x y`を`x = y`とするNotationを使っています．

この定義をすると次のeq_indも証明されます．

```
eq_ind : forall (A : Type) (x : A) (P : A -> Prop),
    P x -> forall y : A, x = y -> P y
```

### eq_indの証明

まずは`eq_ind`の証明を`match`を使って行います．

```
fun (A : Type) (x : A) (P : A -> Prop) (H : P x) (y : A) (H1 : x = y) =>
    match H1 in (_ = z) return (P z) with
    | eq_refl => H
    end
        : forall (A : Type) (x : A) (P : A -> Prop), P x -> 
            forall y : A, x = y -> P y
```

`eq`の証明を`match`するには，`in (_ = z)`というのをつければよいようです．
これを使って対称律・推移律の証明を調べてみましょう．

## 反射律

次のように証明できます．

```
fun (A : Type) (x : A) => eq_refl x
     : forall (A : Type) (x : A), x = x
```

## 対称律

対称律の主張を以下に示します．

```
forall (A : Type) (x y : A), x = y -> y = x
```

### matchを使った証明

次のように，`eq_refl x`を使います．

```
fun (A : Type) (x y : A) (H : x = y) =>
    match H in (_ = z) return (z = x) with
    | eq_refl => eq_refl x
    end
        : forall (A : Type) (x y : A), x = y -> y = x
```

### eq_indを使った証明

`eq_ind`の仮定をひとつずつ準備して，証明します．

```
fun (A : Type) (x y : A) (H : x = y) =>
    eq_ind x (fun z : A => z = x) (eq_refl x) y H
        : forall (A : Type) (x y : A), x = y -> y = x
```

## 推移律

推移律の主張を以下に示します．

```
forall (A : Type) (x y z : A), x = y -> y = z -> x = z
```

### matchを使った証明

次のように，`y=z`を分解して，`x=y`の`y`を`z`にします．

```
fun (A : Type) (x y z : A) (H1 : x = y) (H2 : y = z) =>
    match H2 in (_ = a) return (x = a) with
    | eq_refl => H1
    end
     : forall (A : Type) (x y z : A), x = y -> y = z -> x = z
```

2019-12-08追記 次の記事で考察されています
http://kyasmt.hatenablog.com/entry/20091214/1260801722

### eq_indを使った証明

上の`match`を使った証明を`eq_ind`を使って書き直した感じです．

```
fun (A : Type) (x y z : A) (H1 : x = y) (H2 : y = z) =>
    eq_ind y (fun a : A => x = a) H1 z H2
        : forall (A : Type) (x y z : A), x = y -> y = z -> x = z
```

# まとめ

等号の3つの性質をCoqで定式化し，証明を行いました．Coqでは等号が帰納的に定義されていて，3つの性質それぞれはCoqによって証明される定理だとわかりました．

次のようなことがわかりました．．

- 学生のときに，「同値関係」を「反射的かつ対称的かつ推移的」と習います．等号にこのような性質があるのは自明ですが，私には引っかかっていました．今回，より原理原則といえる部分を確認できました．
- 「等号を帰納的に定義する」「`match`の型付けが少し複雑」「`eq_ind`は証明できる」ということが明確になりました．
AWS EC2でyum installしたSupervisorで環境変数を使う方法



yum install をしてsupervisorをインストールするとsupervisor2.1がインストールされてしまうらしい。(supervisor2.1だとversionの確認が出来ないので、2.1かどうかは`yum info supervisor`で確認できる)

supervisor3からenvironment句が使用できるようになってはいるが、上記でインストールされてしまう場合はenvironment句が使用できないので、環境変数を指定したデーモン監視が出来ない。
また、環境変数を指定してコマンドを実行する下記のようなやり方も、supervisor側の問題で実行出来ない模様

```bash
HOGE=fuga command run
```

## 解決方法

使用可能なコマンドからcommand句が開始していればいいので、`bash -c "<command>"`形式で解決。

```supervisord.conf
# 例)
command=bash -c "HOGE=fuga command run"
```
Rを閉じるボタンで即座にsaveせず終了する

#結論

Rを閉じるボタンで即座にsaveせず終了するようにしたければ、.Rprofileに

`q <- function (save = "no", status = 0, runLast = TRUE) .Internal(quit(save, status, runLast))`

を追加しよう。

注意: 既存の関数の上書きはバグの温床になりかねないので自己責任でお願いします。

#Rを終了するには

-  閉じるボタン
-  `q()`

のどちらかを実行する。
この時セッションを保存するか聞かれるが、だいたい保存しない(と思う)。
聞かれたくない人は

`q(save = "no")`

を実行する必要がある。

または、「[R を終了させる最短コードがおもしろい](http://d.hatena.ne.jp/hoxo_m/20111026/p1)」でも紹介されているように、

`class(Q)=Q="no";print.no=q`

を.Rprofileに記入しておくと、`Q`一文字で終了できる。

#閉じるボタンでも即終了したいんじゃ！

という人は、

関数`q`の引数既定値を`save = "no"`にして上書きすればいい。

標準では
`q <- function (save = "default", status = 0, runLast = TRUE) .Internal(quit(save, status, runLast))`

となっているので、

`q <- function (save = "no", status = 0, runLast = TRUE) .Internal(quit(save, status, runLast))`

として、これを.Rprofileに書き込む。

既存の関数の上書きはバグの温床になりかねないので自己責任でお願いします。
最も、他の関数から`q`が呼び出されることなんて早々ないだろうから大丈夫だろうと思うのですが……。

ちなみに、`rm(q)`すればいつでも元の`q`(すなわち`base::q`)が使えるようになります。

これは上述の`class(Q)=Q="no";print.no=q`とも共存可能で、これでコンソールからでも閉じるボタンからでも即座にRを終了できるようになりました。

やったネ！
Deep learningで物体を数える。そして可視化する。


# 概要
Deep learningを使って、画像中にあるオブジェクトの数を数える試みをしてみました。
少し古いですが、論文はこちらを参照しています：
[Learning to count with deep object features](http://www.cv-foundation.org/openaccess/content_cvpr_workshops_2015/W03/papers/Segui_Learning_to_Count_2015_CVPR_paper.pdf)

- この中では、NNを使って、手書き画像中の偶数の数や、カメラ画像中の人間の出現数を推定させる課題を行っています。比較的浅いNNでも精度よく推定できるとのこと
- NNの学習能力から言って決して驚くほどのことでは無いはずですが、それでも、数字に対応するラベルなしに、単に「この画像の中に、偶数はXX個含まれているよ」と教えてもらうだけで、どの数字が偶数なのかを学んでいくNNを見るにつけ、NNの能力の高さを思い知らされます

上記論文の中では、数を数えるだけではなく、具体的にどの位置を見て、数をカウントしていたかということの可視化にも挑戦しています。ただ、使っているテクニックが比較的古典的なこともあり、その部分は最新の技術で置き換えたいと思いました。そこで今回は、下記のGrad-CAMというテクニックを使ってみています:
[Grad-CAM:
Visual Explanations from Deep Networks via Gradient-based Localization](https://arxiv.org/pdf/1610.02391.pdf)

convolution中の各feature layerが、最終的な分類結果にどう効くのかを微分係数より判定します。それを重みにしてfeature layerの出力を足し合わせると、最終分類結果に影響を与える「場所」を推定できる、というテクニックです



# コード
今回は、一つ目の論文と似たような課題にトライしています。
NMISTの手書き文字データを複数貼り合わせて作った人工的な画像データから、奇数の数を答えるという課題です。

詳細コードは、Gitへ上げていますのでそちらを御覧ください:
[GitHub:imageCounting](https://github.com/ysasaki6023/imageCounting/blob/v2.0/gradCam.py)


# 結果
学習データは、例えば以下のようになります：
![0_origi.png](https://qiita-image-store.s3.amazonaws.com/0/124438/02192b49-1355-83a2-c318-2874e52c0761.png "0_origi.png") ![100_origi.png](https://qiita-image-store.s3.amazonaws.com/0/124438/9bbeca8b-e0dd-7533-769e-3a23d0118f85.png "100_origi.png")
一つ目ならば奇数は3つ、二つ目ならば奇数は5つとなり、それをNNに予測させます。

learnRate=1e-5で80k回 x 64batch ほど学習させた結果、精度は80%に到達しました。きちんと学習できているようです。

その際の可視化の結果は以下の通り：
![80200_pool3.png](https://qiita-image-store.s3.amazonaws.com/0/124438/09711889-3725-0ef5-31cc-6ded4ee425ad.png "80200_pool3.png") ![80000_pool3.png](https://qiita-image-store.s3.amazonaws.com/0/124438/6995ea4f-9e57-5781-640a-10957607b6af.png "80000_pool3.png") ![79900_pool3.png](https://qiita-image-store.s3.amazonaws.com/0/124438/2d9305bd-fad8-909e-29b5-359c0cad4b84.png "79900_pool3.png")

![79800_pool3.png](https://qiita-image-store.s3.amazonaws.com/0/124438/91355260-4ede-43c3-cf19-e737bc47c53f.png "79800_pool3.png") ![79700_pool3.png](https://qiita-image-store.s3.amazonaws.com/0/124438/bf0bf6e4-e819-426c-4361-3cc5acd3576d.png "79700_pool3.png") ![79600_pool3.png](https://qiita-image-store.s3.amazonaws.com/0/124438/5aba7c3d-3776-adb4-eb29-9a50313a0f04.png "79600_pool3.png")


赤色に近い部分がより注目している部分になり、奇数と偶数が区別して色分けされていることがわかります。
ただ、画像ごとに奇数が着目されるか偶数が着目されるかは一定していません。この画像を作る際、文字数はかならず5個にするように設定しているのですが、その結果として奇数をカウントするのと、奇数=5-偶数 として計算する２つの方法があり得てしまうため、どちらか一方にのみ色がつくということはなくなっています。
大まかな規則性はあるようで、１つの画像の中に出現している数が多い方を積極的に注目している様子は見られます。
そのような具体的な「解釈」にまで踏み込めることこそが、可視化の最大の強みといえるでしょう。

最後に、いくつかGrad-CAMに関する技術的な要素をメモしておきます：

- **lossの定義**: Grad-CAMの勾配を計算する際に使用するlossの定義の仕方には複数があり得る。例えば、labelからone-hot vectorを作り、それをsoftmaxの入力/出力に掛け算することで、ある分類項目に対応するlossを構築する事もできるし、全labelとsoftmax入力/出力のRMSをとることで、全labelの影響を考慮に入れている実装もある。 **双方実験してみたが、結果はほぼ同じ。個人的には前者が美しいと感じる**
- **対象とするLayer**: Convolution直後のReLUの出力を用いるよりも、その後の **max-poolingが終わった後** の微分係数を使用してGrad-CAMをかけた方がきれいに作れる様子。また、できるだけオブジェクトとしての認識力が高まっている **後段の方が望ましい**
Quiverのプレビューを見やすくする

## はじめに

以前 [Quiverのショートカット一覧 - Qiita](http://qiita.com/yusabana/items/82a91e48b1e081b7917d) という記事を書きました。それに引き続いてQuiverに関するTips。

基本的にQuiverではMarkdownのメモエディタとしてのみ使っているのですが、画像などもQuiverに埋め込んだりできるのでとても重宝しています。
ただ、デフォルトのプレビューの表示だとあまり見やすくありません。
テーマを変えたりカスタムでCSSを定義することで好みの画面表示に設定することができます。

## テーマについて

黒い感じのテーマが好きなのでデフォルトではいっている `Spacegray` というテーマを利用しています。

### サードパーティテーマ
デフォルト以外だと以下のページからサードパーティのテーマを入れることもできるし、自分でテーマを作ることもできます。

https://github.com/HappenApps/Quiver/wiki/Themes

## カスタムCSS

- `Preference(⌘,)` => `Styles` を開くと各ビューのCSSを編集することができます。
    - 僕の場合はマークダウンでメモったものを見るときにプレビューを使うことが多いので、とりあえずプレビュー表示のみカスタマイズしています。
    - HTMLやPDFにエクスポートする際のCSSもカスタマイズ可能なようです。プリントアウトする場合などは見やすい形にするといいですね。


### プレビュー表示のカスタマイズ

- `Spacegray` のテーマの背景色に合うように自分の好きにCSSをカスタマイズしています。
- `Edit CSS` をすると以下のような画面が開き、デフォルトの設定がはいっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6038/3ba9c3e0-9f4a-1df8-caf2-f4fa8e395240.png)

- デフォルトの設定をいじってしまうとわけわからなくなる懸念があったので、設定の最後にカスタムしたいCSSを再定義するようにしています。


```css
/* カスタム */

h1 {
  border-top: solid 3px #2a6d9e;
  border-bottom: solid 2px #2a6d9e;
  padding: 6px 10px;
  color: #2a6d9e;
  background-color: #f4f5fb;
  line-height: 1.3em;
  font-size: 25px;
}
 
h2 {
  color: #f4f5fb;
  background-color: #2a6d9e;
  padding: 5px 10px;
  border-radius: 3px;
  font-size: 18px;
  line-height: 1.4em;
}
 
h3 {
  border-left: solid 7px #2a6d9e;
  color: #fff;
  padding: 5px 0 5px 8px;
  line-height: 1.4em;
  font-size: 18px;
}

h4 {
  color: #fff;
  font-size: 16px;
}
 
hr {
  background: none;
  border-top: 2px dotted #bbb;
}

a:link {
  text-decoration: none;
  color: #c1a23c;
}

a:hover {
  text-decoration: underline;
}

ol, ul, li {
  margin: 0 0 0 0.5rem;
  padding: 0;
}

strong {
  color: #fcfcb0;
}
```

上記のCSSを入れるとおおよそ次のようなプレビューになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6038/d2390b5e-54e2-5fe5-4567-ee306e7b1446.png)

色々とカスタマイズできるのでとても良いです。
GitHubからのディレクトリ単位でのダウンロードをワンライナーで便利にする

# なにがしたいか

GitHubから特定のディレクトリだけを直接ダウンロード - Qiita
http://qiita.com/raucha/items/1219327df8a9ded494df

最近、👆の記事にとても助けられました。
あるディレクトリ内のファイル群が欲しいのだけど、リポジトリ全体を `git clone` するとかナンセンスだし、かといって、ブラウザ上で1ファイルずつポチポチDLするのはありえない。
その解決策が上記記事です。

要は、
`https://github.com/HogeUser/HogeProject/blob/master/fuga/piyo/` 以下に存在するファイルを一括ダウンロードしたければ、

```
svn export https://github.com/HogeUser/HogeProject/trunk/fuga/piyo/
```

でOKですよというお話。
ここで注意点としては、GitHubのsvnサポート機能を利用してるらしくて、 `blob/master` が `trunk` になってるんですよね…
**そんな特殊ルール、覚えられる気がしません。**

てことで、スクリプト書きました。

# これがそのスクリプトだ！

.zshrcとかに入れておくと幸せになれそう。
（シェルスクリプト詳しくないので、もっとかっこいい書き方あったら教えてください）

```sh
function export_github() {
  svn export $(echo $1 | sed s:/blob/master/:/trunk/: | sed s:/tree/master/:/trunk/:)
}
```


usage

```
export_github https://github.com/copipettekita_url_from_your_browser
```
AWS EC2上にナレッジ共有OSS「knowledge」をインストールする

CentOS7で作ったknowledgeをAWS上に作ってみました

#インストール環境

- Amazon Linux
- java 1.8
- tomcat 8.0.43
- Knowledge 1.8.1


# インストール
## Javaのインストール
Javaがインストールされているか確認します。
Java1.8以降が入っていれば、Javaのインストールは不要です。
`sudo rpm -qa | grep java`

Java1.8を探します
`sudo yum search java | grep 1.8`

Java1.8のインストール
`sudo yum install -y java-1.8.0-openjdk-devel.x86_64`

Javaのインストール結果確認

```
# sudo rpm -qa | grep java-1.8
java-1.8.0-openjdk-devel-1.8.0.121-0.b13.29.amzn1.x86_64
java-1.8.0-openjdk-1.8.0.121-0.b13.29.amzn1.x86_64
java-1.8.0-openjdk-headless-1.8.0.121-0.b13.29.amzn1.x86_64
```
Javaのバージョン確認

```
sudo java -version
java version "1.7.0_131"
OpenJDK Runtime Environment (amzn-2.6.9.0.71.amzn1-x86_64 u131-b00)
OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode)
```

Javaバージョンの切り替え

```
sudo alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java

Enter to keep the current selection[+], or type selection number: 2
```

Javaのバージョン確認

```
sudo java -version
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (build 1.8.0_121-b13)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)
```

##Tomcatのインストール
参考にさせていただきました！
http://qiita.com/nyao/items/8ad51a56638e646b2ec1

ユーザを作成します
`sudo useradd -s /sbin/nologin tomcat`

Tomcat8以上が必要なので、確認をします。
`sudo yum search tomcat8`

インストールします。
`sudo yum install tomcat8`

自動起動の設定
`sudo chkconfig tomcat8 on`

設定ができたことを確認します。

```
sudo chkconfig --list tomcat8
tomcat8         0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

起動/停止してエラーが出ないことを確認します。
`sudo service tomcat8 stop`
`sudo service tomcat8 start`

## Knowledgeのインストール

Webページを配置するフォルダに移動
`cd /var/lib/tomcat8/webapps`

warファイルをゲットします
`sudo wget https://github.com/support-project/knowledge/releases/download/v1.8.1/knowledge.war`

サービスを再起動します
`sudo service tomcat8 restart`

さっそくアクセスしてみましょう。初回は表示されるまで結構時間がかかります。
`http://tomcat入れたサーバのアドレス:8080/knowledge`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/47012/3706ae55-3b93-1351-9806-c08627ee3bf6.png)

あとは公式URLに従って設定を行います。
https://information-knowledge.support-project.org/initial-setup-ja