OmniAICreator/Qiita-1.07M huggingface dataset:
【2016年7月第4週】今週の気になるWebデザイン

#まず、はじめに
本来であれば、以下の様なことをしっかりと考えるべきです。

```
どうやったら使いやすいかな…。どうやったら私たちが提供したい「体験」をしてもらえるのか…。
利用するユーザーさんはどんなシーンで、どのように操作するだろう…。その時に求めているものは何なのか…。
このペルソナ（大きく言うとターゲット）に対しては、こういう設計がいいのか…ダメなのか…。
私たちのWebサイトのゴールである地点まで行ってくれるのか…。（コンバージョンしてくれるのか。）
```
しかし、私はこの記事では単純に「いいな！」と思ったデザインを取り上げていきます。
どういうところがいいと思ったのかを添えて、色んなWebサイトをストックしていきます。

# 1.トンボ鉛筆（[→サイトを見る](http://www.tombow.com/)）
##ファーストビューはこんな感じ
![22d13d627e24ba9861944b121614c88d.png](https://qiita-image-store.s3.amazonaws.com/0/75705/83424b93-2268-7542-e427-34da90ed41bc.png)

##ここが、いいね！
#####欲しいものを見つけやすい。画像をいっぱい使っている。
文具メーカーでは、他には見たことがないですね。
こんなに大きな画像でしっかりと新しい製品、定番の製品を掲載してくれているので、文房具が欲しくなります。


#####探しやすいグローバルナビゲーション
文字だけではなく画像も大きく表示されて、直感的に探しやすいグローバルナビゲーションだと感じました。


# 2.がんこクリニック（[→サイトを見る](http://gankocliniｌc.jp/)）
##ファーストビューはこんな感じ
![9a1e8e8db04752db0231f891dd7023d6.png](https://qiita-image-store.s3.amazonaws.com/0/75705/a82b1f16-728e-e58b-5de8-4558e84a1cd8.png)

##ここが、いいね！
#####え、本当に病院？と思わせるようなデザイン
まず、第一印象がとても親しみやすいと思われないでしょうか？
どんな病院だろうと思って、Webサイトを見てみると、**何かこの病院は他とは違う**という印象を持たれますよね。
そこがとてもいいと思いました。
何故ならば、病院というと、「出来れば行きたくない」「固い」というような印象を持っている方も少なくないと思います。
それを覆すことで、「行きたい病院」に繋がる、はじめの一歩になると考えました。

#####とにかく現場がよく見える
このWebサイトはとにかく写真が多用されています。
最初に行く病院って不安ですよね。そんな不安が少しは軽くならないでしょうか？
「すごく優しそう」「安心できる」などの気持ちが出てきます。
そんな表現をされているところがすごくいいなぁと思いました。


# 3.大正大学（[→サイトを見る](http://www.tais.ac.jp/)）
##ファーストビューはこんな感じ
![db19736c7de926d2542ca501d5760d32.png](https://qiita-image-store.s3.amazonaws.com/0/75705/eb896b9e-e755-e946-5b9a-a17d5e47c310.png)

##ここが、いいね！
#####見たい情報をすぐに見れるグローバルナビゲーション
よくあるグローバルナビゲーションだと自分が見たい情報を見つけるのに苦労した経験はないでしょうか？
でも、この大正大学さんのWebサイトでは、画像も含んだ大きな表示で見つけやすいです。
情報の整理についてもとても分かりやすいです。

#####重要なことを見逃さない。埋もれない設計。
情報がごちゃごちゃしていないですし、色もはっきりとしているので、重要な内容を見逃すことはありません。
全体的に一貫して、埋もれない設計をしていますよね。


# まとめ
今週は3つのサイトをピックアップして、どこがいいなぁーと思ったのか、自分なりの感想を書かせていただきました。
Webサイトを作成していて、困ったことがあった時、少しでも参考になるストックとなれば幸いです。
次週も是非ご覧ください！
metaタグを動的に作成する

# 動的ページのメタタグを作成したい
 HTMLの`<head>~</head>`のメタタグを商品ページ等動的に作られたページに
固有のタグを入れたい。
今回入れるのは keywordsとdescription

まず共通で作っていたヘッダの定義を見てみると、

```_head.haml
~~~前略~~~
!= meta_data_tags
~~~後略~~~
```
となっており、ここでmetaタグを作っている見たい

## 実装してみる

まずはhelperにデフォルトのmetaタグを作成する

```helper.rb
~~~前略~~~
  def meta_data
    if (defined? my_meta_data)
      my_meta_data
    else
      ({
          keywords: "default keyword",
          description: "default Description",
      })
    end
  end
```

続いて動的ページを作成するControllerで読み込んだページ毎のmetaを上書きする。

```xxx_controller.rb
  helper_method :my_meta_data

  private
    def search_items(item_id)
      @item = Items.find(item_id)
    end
    def my_meta_data
      if @item.present?
        ({
          keywords: @item.keywords,
          description: @item.description,
        })
      else
        ({
            keywords: "",
            description: "",
        })
      end
    end
```

テーブルには事前にkeywordsとdescriptionを作成し、
商品毎のkeywordとDescriptionを登録すれば、
新しい商品を追加するときもRecordを追加するだけで対応可能。

my_meta_dataが作られていなければ、defaultのkeywordとDescriptionが設定される。

生成されたHTMLはこんな感じ

・動的に取得しないページ

``` test.html
<head>
  <meta name="keywords" content="default keyword">
  <meta name="description" content="default Description">

</head>
```
・itemから取得したページ

``` test.html
<head>
  <meta name="keywords" content="アイテムのkeyword">
  <meta name="description" content="アイテムのDescription">

</head>
```
tensorflowのRNN関連でraise ImportError("This module is deprecated.  Use tf.nn.rnn_* instead.")とエラーが出たときの解決方法

いろいろなRNNのサンプルコードを動かす時に頻繁に遭遇した問題です。

結論

https://github.com/tensorflow/tensorflow/issues/2685
の下から２番目が解決方法になり得ると思います。

from tensorflow.models.rnn import rnn, rnn_cell
とか
from tensorflow.models.rnn import rnn
from tensorflow.models.rnn import rnn_cell
のfromで始まるRNN関連の記述をコメントアウトし、


raise ImportError("This module is deprecated.  Use tf.nn.rnn_* instead.")
といわれてるので、

以降のコードの部分で、
「rnnをtf.nn.rnnとしたり、rnn_cellをtf.nn.rnn_cellというように、tf.nn.をRNN関連の関数の前に付け足す」
ことで、コードが動くようになります。直接指定してあげる必要があるみたいですね。

参照したURLによると、
Possibly some repackaging needs to be done because currently importing using namespaces returns ImportError:
と書いてあるので、repackaging関連の問題みたいです。
Yo APIを使って一分に一度Yoを飛ばす

#Yo

2016年ですがYo使ってますか？　使ってますよね？
Yo APIを使って一分に一度Yoを飛ばすコードを書いて友人に死ぬほど怒られたのでシェアします。

#yo4r
RubyでYo APIを簡単に使えるGemを[こちら](http://qiita.com/pomu0325/items/9990dc1b0dbafd72f3e6)の方が作ってくださっているので、`gem install yo4r`でインストールする。

後はYo API tokenを[ここ](https://dev.justyo.co/)から取得するだけ。

以下のコードの`SOMEONE`の所をあなたの友人のユーザー名に設定して実行させれば、友人には1分に一度Yoが送られます。
YoのAPI制限上、1分に一度に設定していますが(二度以上送れるのか検証してないですが)、Yoが鳴って少し忘れたころにもう一度Yoが届く、というちょうどよい塩梅になっており、Yoによるコミュニケーションが加速します(スマホのバッテリ消費量もちょっぴり加速します)。

一応1000回繰り返すように設定しているので16時間半しか動きませんが、ループの回数は各自自由に設定して下さい。

```ruby:yo.rb
require 'yo4r'

for yo_num in 1..1000 do
  client = Yo::Client.new(api_token: 'YOUR TOKEN')
  # YO
  client.yo(username: 'SOMEONE')
  sleep(60)
end
```

10分くらいすると友人から電話が掛かってきて今すぐ止めろと怒られました。

以上。
連番生成するVimプラグインを作ってみた

# はじめに
タイトル通り連番生成するVimプラグインを作りました。
連番生成のやり方としては標準で提供されている`g<C-A>`/`g<C-X>`や[vim-rengbang](https://github.com/deris/vim-rengbang)プラグインがありますが、どれも微妙に普段の定形作業にマッチしなかったので、自分で作ることにしました。
(ちなみに非定形の複雑な連番生成は正規表現マッチとprintf書式指定が使える[vim-rengbang](https://github.com/deris/vim-rengbang)のインタラクティブモードが非常に便利です)

# 使用イメージ

[![asciicast](https://asciinema.org/a/3i5yptlh2udbl9bkvrteee1ek.png)](https://asciinema.org/a/3i5yptlh2udbl9bkvrteee1ek)

# 特徴
- 垂直方向の選択範囲だけ連番化
- 基数・昇順降順が指定可能
- スペース/ゼロ埋めによる自動桁揃え

# 使い方

## インストール
[vseq.vim](https://github.com/dalance/vseq.vim)にあります。
プラグインマネージャー等を使ってインストールしてください。

```vim
" vim-plug
Plug 'dalance/vseq.vim'

" dein
call dein#add('dalance/vseq.vim')

" NeoBundle
NeoBundle 'dalance/vseq.vim'
```

## コマンド
以下のコマンドを提供します。

```
VSeqIncrOct
VSeqIncrDec
VSeqIncrHex
VSeqDecrOct
VSeqDecrDec
VSeqDecrHex
```

Incrがインクリメント、Decrがデクリメント、末尾が基数です。

## マッピング

```
<Plug>(vseq-incr-oct)  
<Plug>(vseq-incr-dec)
<Plug>(vseq-incr-hex)
<Plug>(vseq-decr-oct)  
<Plug>(vseq-decr-dec)
<Plug>(vseq-decr-hex)
```

コマンドにそのまま対応しています。
また、[vim-operator-user](https://github.com/kana/vim-operator-user)プラグインがインストールされていると
以下のマッピングも使えます。
こちらでマッピングするとドットリピートが効いて便利です。

```
<Plug>(operator-vseq-incr-oct)  
<Plug>(operator-vseq-incr-dec)
<Plug>(operator-vseq-incr-hex)
<Plug>(operator-vseq-decr-oct)  
<Plug>(operator-vseq-decr-dec)
<Plug>(operator-vseq-decr-hex)
```
## オプション

### `g:vseq#upper_case`

1にすると16進数のa-fが大文字になります。
デフォルトは0です。

### `g:vseq#padding_right`

1にすると空白によるパディングが発生する場合に右側にパディング（すなわち左詰め）します。
ゼロパディングは（当然ですが）常に右詰なので関係ありません。
こちらもデフォルトは0です。

# その他
- 選択範囲は数値の一部でも大丈夫です。(`<C-A>`系と同じ挙動のはずです)
- もとの数値がゼロ開始で2文字以上ならゼロ埋めで桁揃えします。それ以外の場合スペースで桁揃えします。
- 選択範囲に(一部の行だけでも)数値がない場合、なにも起こりません。

# おわりに
これまで`<C-A>`系を使った自作関数で連番生成してきたのですが、16進数の扱いがどうしても気に入らず自作することにしました。
（Vimは`0x`開始の数値しか16進数と認識してくれませんが、`'h`開始の言語もあるのです…。`nrformats=force_hex`とかあればそれでもよかったんですが）

このプラグインを作るにあたり以下のプラグインを使用・参考にさせていただきました。ありがとうございます。
-[vim-rengbang](https://github.com/deris/vim-rengbang)
-[vim-operator-user](https://github.com/kana/vim-operator-user)
-[vimhelpgenerator](https://github.com/LeafCage/vimhelpgenerator)
「スマートフォンアプリマーケティング 現場の教科書」情報の密度がすごかった


スマートフォンアプリマーケティング 現場の教科書 (川畑 雄補 (著), 丸山 弘詩 (著), 荻野 博章 (著)) マイナビ出版 を購入してだいぶたったのですが、読む余裕がなく今に至ってしましました。
先ほどやっと読了したのですが、`これはすごい！` `もっと売れるべき！` と思ったので、ちょっとですが書評を書いてみました。

## 対象

マーケティングという名が付いていますので、当然プロデューサやディレクター、マネージャなどは対象なのですが、チームのことや、クロスプラットフォーム等々、以外とエンジニアも読むといいんじゃなかと感じました。
また、実際にアプリ開発しないけど、`外注に出す立場になった担当者` も必読でしょう。理由は次。

## 現場の教科書というタイトルは伊達じゃない

目次をみると分かりますが、`企画から開発、リリース、そして運用サポートまで網羅している` という点にとにかく驚きました。
この膨大な情報を245ページ程度で書き表しているのはすごいです。しかも薄い内容ではなく要点が簡潔に書かれているので、1ページ1ページが非常にためになります。
外注する際の内容が書かれているのが、現場の教科書というサブタイトル？が偽りではない証でしょう。
外注をする企業は多い割に、外注に関して触れている書籍は少ない（というより自分は初めて見た）のが現状なので、これだけでも貴重な情報と言えます。
外注に発注する担当者がアプリのことをよく分かっていないケースが多く、アプリの知識が乏しいため開発会社と話しがかみ合わず、そのせいで無駄に工数がかかってしまうというケースも多々あると実感しています。発注する側の人間が本書を読むだけで、`最低限のアプリ開発の流れや細かいポイントなど、知識を得ることができる` ので、実際に発注したり途中での意識会わせもスムーズになるはずです。
他には、リリース準備やプロモーションなどの情報も載っているので、`どうやってアプリを目立たせてダウンロードしてもらい、かつ継続して使ってもらえるか` などのヒントもあります。

## まとめ

アプリをどうやって企画し、リリース、運用まで持っていくのかを1冊でまとめてある本書は、すでにアプリを出している人も、これからの人も読むべき1冊と感じました。
社内でも薦めておきます（笑）

類似書というわけではないですが、アプリのマーケティングに特化した「事例に学ぶスマホアプリマーケティングの鉄則８７」という書籍を弊社の社員(現在は元社員ですが・・・)が執筆し、KADOKAWAから出版しています。アプリをリリースしてからどのようにアプリを使ってもらうか、収益を上げるにはどうすればよいかを実際の事例に基づいて書かれているため、今回紹介した「スマートフォンアプリマーケティング　現場の教科書」と一緒に読むと良さそうです。

* [スマートフォンアプリマーケティング　現場の教科書](http://www.amazon.co.jp/gp/product/4839947848/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4839947848&linkCode=as2&tag=banwankonet-22)[AA]

* [事例に学ぶスマホアプリマーケティングの鉄則８７](http://www.amazon.co.jp/gp/product/4048664514/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4048664514&linkCode=as2&tag=banwankonet-22)[AA]
__len__の戻り値に気を付ける

自作のクラスに`__len__`をオーバーライドし、呼び出したところ、次のようなエラーが発生。

```
OverflowError: cannot fit 'int' into an index-sized integer
```

原因は`__len__`の仕様にありました。どうやら`__len__`の戻り値は以下の条件を満たす必要があるようです。

- 整数型(int)
- 0以上
- 符号付32bit整数の上限(`0x7FFFFFFF`)以下
    - 「符号付32bit整数」の部分は環境によって違う可能性あり

```py3

class ReturnStr(object):
    def __len__(self): return "abc"

class ReturnFloat(object):
    def __len__(self): return 1.0

class ReturnNegativeNumber(object):
    def __len__(self): return -1

class ReturnBigNumber(object):
    def __len__(self): return 0x7FFFFFFF + 1

class ReturnSmallNumber(object):
    def __len__(self): return 0x7FFFFFFF

if __name__ == "__main__":
    len(ReturnStr())            #=> TypeError: 'str' object cannot be interpreted as an integer
    len(ReturnFloat())          #=> TypeError: 'float' object cannot be interpreted as an integer
    len(ReturnNegativeNumber()) #=> ValueError: __len__() should return >= 0
    len(ReturnBigNumber())      #=> OverflowError: cannot fit 'int' into an index-sized integer
    len(ReturnSmallNumber())    #=> OK

```

わたしの場合は`__len__`の戻り値が大きすぎたせいで、例外になっていたようですね(´・ω・`)
LaravelElixir使ったらTypescriptをBrowserifyするのが簡単過ぎてもう笑うしかなかった


## 2016/8/4追記
[LaravelElixir使ったらSassをコンパイルしてベンダープレフィックス対応するのが簡単過ぎてもう笑うしかなかった](http://qiita.com/shitake/items/c30007284b88dac817a5)を投稿しました。併せてどうぞ。


## まずはインストール
今回はnpmで管理。

 - `gulp`
 - `LaravelElixir`
 - `typescript`
 - `tsify`

```
$npm i gulp laravel-elixir typescript tsify  --save-dev
```

`gulpfile.js`に定義するのはたったこれだけ。えっ
ついでに`.version()`も使ってみる。


```
var elixir = require('laravel-elixir');
require('tsify');

// デフォルトが`resources/assets/js`なため`ts`に変更
elixir.config.js.folder = 'ts'
// pluginにtsifyを指定
elixir.config.js.browserify.plugins = [ { name: 'tsify' } ]
// 実行
elixir(function (mix) {
    mix.browserify('app.ts')
       .version(['js/app.js'])
})
```


## gulp実行

デフォルトタスクを定義してくれているのでgulpコマンド叩くだけ。えっ

```
$gulp
```

結果

```
project
 ├─app
 │　
 │〜省略
 │
 ├─public
 │	└─
 ├─resources
 │  └─build
 │     └─js
 │        └─app-71538b35c5.js ← できた！！！！
 ├─assets
 │  └─ts
 │  　 ├─app.ts ← エントリーポイント
 │　  　〜省略
　〜省略
```

## elixir()で呼び出すだけ

```
<script src="{{ elixir('js/app.js') }}"></script>
```



えっ、簡単過ぎる。
今までgulpのタスクごりごり書いてた自分を笑うしかなくなった。くそう。

`gulp~`系のタスクが全て詰め込まれた万能薬なんだから`node_modules`がすごい量になったことには目を瞑るしかない。
UnityでVRを触ってみた 〜歩行編〜

## はじめに
VR作りたくて、Unityで試行錯誤して何とか動いたのでそのまとめ３です。
今回はVRの中で歩行（カメラを前進させる）をしてみたいと思います。

今回はコントローラーはなくHMDだけの状況です。
ですので、歩行を始めるトリガーとなるものは目線（カメラ）を下に傾けたときにしました。

以前の記事
- [UnityでVRを触ってみた 〜導入編〜](http://qiita.com/yukatou/items/103e382484e5792988c2)
- [UnityでVRを触ってみた 〜視点の検知編〜](http://qiita.com/yukatou/items/d854ebfacef85a221f49)

## 環境
- Mac OSX v10.11
- Google VR SDK v0.8
- Unity v5.3.5

## いざ開発！


### 1. 空のオブジェクトにScriptを追加

メニューから[GameObject] -> [Create Empty]を選び、GameObjectがSceneに追加されたことを確認します。
追加されたGameObjectにNew ScriptをAdd Componentします。

![gameobject_script.png](https://qiita-image-store.s3.amazonaws.com/0/13703/14ecfe5d-cc5e-e86c-d5ef-d7721d3e3639.png)

### 2. Scriptを書いて実装する

次に、Scriptを書いてカメラを前進させてみたいと思います。
手順としては以下の通りです。
① 毎フレームカメラの角度を取得する
② ある角度であればカメラを前進させる

```csharp

using UnityEngine;
using System.Collections;

public class GameScript : MonoBehaviour {
	public Camera mainCamera;
	public float moveSpeed  = 2.0f;
	public float moveAngleX = 20.0f;

	float yOffset;

	// Use this for initialization
	void Start () {
		yOffset = mainCamera.transform.position.y;
	}

	// Update is called once per frame
	void Update () {

		// 1.カメラの傾きを取得
		float x = mainCamera.transform.eulerAngles.x;
		Debug.Log (x);

		// 2.ある角度以内であれば前進させる
		if (moveAngleX < x && x < 90.0f) {
			moveFoward ();
		}
	}

	private void moveFoward() {
		Vector3 direction = new Vector3 (mainCamera.transform.forward.x, 0, mainCamera.transform.forward.z).normalized * moveSpeed * Time.deltaTime;
		Quaternion rotation = Quaternion.Euler (new Vector3 (0, -mainCamera.transform.rotation.eulerAngles.y, 0));
		mainCamera.transform.Translate (rotation * direction);
		mainCamera.transform.position = new Vector3 (mainCamera.transform.position.x, yOffset, mainCamera.transform.position.z);
	}
}

```

上のScriptを書いた後にInspectorビュー戻ると、Main Cameraが空になっているのでMain Cameraオブジェクトをドラッグ&ドロップで紐付けを行います。

![MainCamera.png](https://qiita-image-store.s3.amazonaws.com/0/13703/b6110b65-eece-7f35-100d-8af209a0c5e2.png)




### 3. 動かしてみる

再生ボタンを押して動かしてみましょう。

![out.gif](http://i.giphy.com/l0HlEkIX8pJkhhQCQ.gif)


歩きました！
角度と歩行スピードを変更したい場合は moveAngleX と moveSpeed をいじって調節してみてください。
kexec を使用して所謂ソフトブートをする方法

## Kexec

`--help` に　"Directly reboot into a new kernel" とあるように、kexec を使うと現在動かしている linux にカーネルをロードしてそのままリブートすることができる。

ここで別のカーネルを読み込むこともできるが、現在動作しているカーネルと同じものを、また同じ起動オプションを指定することによって、所謂ソフトリブートができる。BIOS や boot loader を経ないので非常に速いリブートとなる。

## 方法

    % sudo kexec -l /boot/vmlinuz-$(uname -r) --initrd=/boot/initramfs-$(uname -r).img --command-line="$(cat /proc/cmdline)"

最初に`kexec -l` でカーネルをロードする。
起動時に使ったのと同じ image と initial ram disk を指定し、またコマンドラインオプションを `/proc/cmdline` から持ってくる。
なお、各環境によってパスは異なる可能性があるので、予め確認の上実行すること。

    % sudo systemctl kexec

kexec でのブートを行う。systemd 環境下では `systemctl kexec` を使用するのが妥当だと思う（自信なし）。`kexec -e` と直接 kexec を触ってもいいような気がするが長所短所はようわからない。

つなげると次の2つのコマンドを実行すれば良い。

    % sudo kexec -l /boot/vmlinuz-$(uname -r) --initrd=/boot/initramfs-$(uname -r).img --command-line="$(cat /proc/cmdline)"
    % sudo systemctl kexec

## 参考文献

 * [Kexecを使ってLinuxの起動を早める](http://www.ibm.com/developerworks/jp/linux/library/l-kexec/index.html), IBM DeveloperWorks, 2004年5月4日
 * [How to properly use kexec with systemd on CentOS 7?](http://serverfault.com/questions/620225/how-to-properly-use-kexec-with-systemd-on-centos-7), Server Fault
ASUS P8H77-V における BIOS アップデート (from 1103 to 1905)

windows 7 が動いているメインマシンを windows 10 にアップグレードしなきゃなー、と常々考えていたのですが、そのためには [マザボ ASUS P8H77-V の BIOS のバージョン v.1103 (26 Oct 2012)](https://it.driverscollection.com/?file_cid=466151491745c5743aa3308ca6d) を多分あげなきゃだよなー、と思い躊躇していました。

が、そろそろ [Windows 10無料アップグレード最終案内](http://www.itmedia.co.jp/pcuser/articles/1607/23/news023.html) が来たので、重い腰を上げて、BIOS のアップデートを行いました。

この記事はその時のメモです。

## 前段

そもそも BIOS アップデートってなぜ必要なんでしょうか？
BIOSをアップデートするモチベーションは２つあります。

1. CPU換装(CPU を新しいものにした！)
2. バグの解消、BIOS処理の最適化、メモリの互換性向上、OS用の最新ドライバを利用したい

今回は2がアップデートのモチベーションです。


## アップデート手順

### 現在の BIOS のバージョンを確認します

PC を起動して、 「F2」を押して BIOS 管理画面を立ち上げます。
そこから現在の BIOS のバージョンが確認できます。
僕のマシンの BIOS バージョンは v.1103 で、出荷時からずーっと更新していませんでした。

### 最新の BIOS ファイルをダウンロード

まず、BIOS アップデート用のファイルを ASUS のサイトからダウンロードします。

https://www.asus.com/jp/Motherboards/P8H77V/HelpDesk_Download/

windows 10 64 bit を選択し、それがサポートされている BIOS のバージョンの中で最新のもの(v.1905)を利用しました。 

ダウンロードしたら解凍して、USBメモリにコピーします。

* USBメモリのファイルフォーマット形式は、FAT16またはFAT32が推奨です。
* 安定した動作を得るために、USBメモリはマザーボードのバックパネル USB2.0ポート への接続を推奨します。


### ASUS EZ Flash 2 ユーティリティでアップデート

今回のアップデートは 「ASUS EZ Flash 2 ユーティリティ」経由で行いました。
先ほど落としてきた最新BIOSの入ったUSBメモリを BIOS アップデートしたいマシンに挿入し、BIOS 管理画面から Tool → EZ Flash 2 ユーティリティ を選択肢、最新BIOSを指定しアップデート実施します。アップデートは数分で完了します。

### 再起動し、設定を更新

再起動後、再度 BIOS 管理画面から設定を行います。
デフォルトでは SATAコントローラ動作モードが 「IDE」 になっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/9738/d1c43cc4-dfed-e0a7-f95e-7edc91daa209.png)

AHCI など別のものを使いたい場合は変更して下さい。


### windows が無事起動するか確認

設定完了後、windows が無事起動したら完了です :beers: 


## 参考

* http://freesoft.tvbok.com/win10/installation/upgrade_failed_checkpoint.html
* http://plaza.rakuten.co.jp/mscrtf/diary/201302050000/
* http://www.tekwind.co.jp/faq/ASU/entry_281.php
* http://www.tekwind.co.jp/faq/ASU/entry_25.php
* http://bbs.kakaku.com/bbs/K0000358620/#18907481
* http://dlcdnet.asus.com/pub/ASUS/mb/LGA1155/P8H77-V/J8636_P8H77-V.pdf?_ga=1.109683653.1967076891.1469259666
* http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11155080996
Objective-Cでクラス変数を宣言💪

この度のAPI変更により、Objective-Cでもクラス変数が宣言できるようになりました🎉
[OS X 10.12 and iOS 10 Release Notes Cocoa Foundation Framework](https://developer.apple.com/library/prerelease/content/releasenotes/Miscellaneous/RN-Foundation-OSX10.12/index.html)

> Use of class properties, in both Swift as well as Objective-C, latter using the new "@property (class)" declaration.

# 使い方

## 宣言
宣言する際はプロパティの属性にclassを指定します。

```objc:Pokedex.h
#import <UIKit/UIKit.h>

@interface Pokedex : NSObject

@property (class, nonnull) UIColor *defaultColor;

@end
```

## 実装
実装の際には注意が必要です。
**クラスプロパティにはアクセサメソッドが自動では生成されません。**
よって自前で定義するかもしくは@dynamicを使って、動的に生成する必要があります。

```objc:Pokedex.m
#import "Pokedex.h"

static UIColor *_defaultColor = nil;

@implementation Pokedex

+ (UIColor *)defaultColor {
    
    if (!_defaultColor) {
        _defaultColor = UIColor.redColor;
    }
    
    return _defaultColor;
}

+ (void)setDefaultColor:(UIColor *)defaultColor {
    _defaultColor = defaultColor;
}

@end
```

## 呼び出し

```objc:ViewController.m
#import "ViewController.h"
#import "Pokedex.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSLog(@"Pokedex Color: %@", Pokedex.defaultColor);
}

@end
```

**結果**

```
2016-07-23 22:56:04.415 ClassProperty[8600:324023] Pokedex Color: UIExtendedSRGBColorSpace 1 0 0 1
```

## Swiftからの呼び出し

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        print("Pokedex Color: \(Pokedex.defaultColor)")
    }
}
```

**結果**

```
Pokedex Color: UIExtendedSRGBColorSpace 1 0 0 1
```

## その他
readonlyにすることも可能です。

```objc:Pokedex.h
#import <UIKit/UIKit.h>

@interface Pokedex : NSObject

@property (class, nonnull, readonly) UIColor *defaultColor;

@end
```

```objc:Pokedex.m
#import "Pokedex.h"

@implementation Pokedex

+ (UIColor *)defaultColor {
    
    return UIColor.redColor;
}

@end
```

# おわりに
昨年のLightWeightGenericsといい、
Swiftの影響でObjective-Cも便利になってきてますね！

# 参考
[OS X 10.12 and iOS 10 Release Notes Cocoa Foundation Framework](https://developer.apple.com/library/prerelease/content/releasenotes/Miscellaneous/RN-Foundation-OSX10.12/index.html)
[Objective-C Class Properties](http://blog.andrewmadsen.com/post/145919242155/objective-c-class-properties?utm_campaign=iOS%2BDev%2BWeekly&utm_medium=email&utm_source=iOS_Dev_Weekly_Issue_256)
[CentOS7] ソースビルドしたApache2.4をsystemdに登録する

ソースビルドしたApache最新バージョンをsystemdに登録したい
何番煎じかわからない出がらし記事です。


## 環境
* apache24 のインストールディレクトリは``/opt/rh/httpd24/root``


## .service ファイルを書く
```text:httpd24.service
[Unit]
Description=The Apache2.4 HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/httpd24
ExecStart=/opt/rh/httpd24/root/bin/httpd -k start
ExecReload=/opt/rh/httpd24/root/bin/httpd -k restart
ExecStop=/opt/rh/httpd24/root/bin/httpd -k stop

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

``EnvironmentFile=/etc/sysconfig/httpd24``は無くても大丈夫

## systemd に登録する
```shell-session
$ sudo su -
$ cd /opt/rh/httpd24/root/conf
$ cat > httpd24.service <<EOF
  (上記のテキストをペースト)
EOF
$ chmod 644 httpd24.service
$ chown root httpd24.service
$ systemctl link $PWD/httpd24.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd24.service to /opt/rh/httpd24/root/conf/httpd24.service.
```

## 動作確認
```shell-session
（起動）
$ sudo systemctl start httpd24.service
$ sudo systemctl status httpd24.service
● httpd24.service - The Apache2.4 HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd24.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2016-07-23 22:16:54 JST; 5s ago
  Process: 31222 ExecStart=/opt/rh/httpd24/root/bin/httpd -k start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/httpd24.service
           ├─31247 /opt/rh/httpd24/root/bin/httpd -k start
           ├─31248 Passenger watchdog
           ├─31251 Passenger core
           ├─31258 Passenger ust-router
           ├─31269 /opt/rh/httpd24/root/bin/httpd -k start
           ├─31270 /opt/rh/httpd24/root/bin/httpd -k start
           └─31271 /opt/rh/httpd24/root/bin/httpd -k start

Jul 23 22:16:54 hogehoge.com systemd[1]: Starting The Apache2.4 HTTP Server...
Jul 23 22:16:54 hogehoge.com systemd[1]: Started The Apache2.4 HTTP Server.

（psでも確認してみるとき）
$ ps -ef | grep httpd | grep -v grep
root     31484     1  0 22:25 ?        00:00:00 /opt/rh/httpd24/root/bin/httpd -k start
apache   31506 31484  0 22:25 ?        00:00:00 /opt/rh/httpd24/root/bin/httpd -k start
apache   31507 31484  0 22:25 ?        00:00:00 /opt/rh/httpd24/root/bin/httpd -k start
apache   31508 31484  0 22:25 ?        00:00:00 /opt/rh/httpd24/root/bin/httpd -k start


（停止）
$ sudo systemctl stop httpd24.service
$ sudo systemctl status httpd24.service
● httpd24.service - The Apache2.4 HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd24.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Sat 2016-07-23 22:20:12 JST; 1s ago
  Process: 31443 ExecStop=/opt/rh/httpd24/root/bin/httpd -k stop (code=exited, status=0/SUCCESS)
  Process: 31222 ExecStart=/opt/rh/httpd24/root/bin/httpd -k start (code=exited, status=0/SUCCESS)

Jul 23 22:16:54 hogehoge.com systemd[1]: Starting The Apache2.4 HTTP Server...
Jul 23 22:16:54 hogehoge.com systemd[1]: Started The Apache2.4 HTTP Server.
Jul 23 22:20:12 hogehoge.com systemd[1]: Stopping The Apache2.4 HTTP Server...
Jul 23 22:20:12 hogehoge.com systemd[1]: Stopped The Apache2.4 HTTP Server.
```

こんな感じ
編集履歴を表示させない方法はあるのかな？

　過去の記事を見て、ちょっとまずいなということを見つけたので、削除して投稿し直しました。というのも、ざっくり見て編集履歴を表示させない方法が見当たらなかったから。他の人も書いているけど、そう言う機能無いのかな？
　ちなみにこの記事です。http://qiita.com/chess/items/6b7d272ad0f304da86b0
　跡地はここ　http://qiita.com/chess/items/891bb13033e1f5d2e0db
　記事を消しても、人気の投稿には表示されちゃうんだね。これも上手く引き継げると良いけど。

#関連記事
　http://qiita.com/bonyochan/items/dc47296f84a56bf75909
bitnami版　redmineのパスワード強制変更

#はじめに
　自宅運用していた、redmineでパスワードを忘れたので再設定した。
本当は他の方法も有るのかも知れない。
　あと、MACでの方法です。

#方法
##ターミナル
　普通のターミナルじゃなくて、`Applications/redmine-3.3.0-1/use_redmine`から操作した。
##リセット
　bitnamiの場合は、redmineのインストール先は`/Applications/redmine-3.3.0-1/apps/redmine/htdocs `ということらしいので、下で出来ました。（実際にやってことと合っているはず・・。） `bin/rails`の所を、`script/rails`にしたらなんか怒られました。

```bash
$ cd /Applications/redmine-3.3.0-1/apps/redmine/htdocs
$ ruby bin/rails console production
> admin_user = User.find_by_login('ユーザー名')
> admin_user.password = '新しいパスワード'
> admin_user.save!
```


#関連資料
・redmineでの説明
　http://redmine.jp/faq/administration/reset-admin-password/
・他の参考
　http://d.hatena.ne.jp/S_a_k_U/comment/20150216
機械学習の環境構築に関するメモ

#VirtualBoxにLinux Mintをインストール

Linux MintのHPからISOをダウンロードしてインストール。エディションはMateを選択した。インストール時に日本語を選択可能。
https://linuxmint.com/

注意すべきは、VirtualBoxでCD-ROMにISOを登録してmintを起動した直後は、Linux Mintはまだハードディスクにインストールされておらず、CD-ROMから起動している状態である。
この状態でも使用することができるが、pythonインストール最中にフリーズしたり固まったりしまくってしまった！この状態での使用はダメ。

日本語マニュアルを参考に、デスクトップの“Install Linux Mint”アイコンをダブルクリックして、super userとしてインストールを進めること。

http://linuxmint-jp.net/documentation/MATE/japanese_17.0.pdf

#Linux MintにPython, Chainerを入れる方法

構築した環境
- Linux Mint 17.3 'Rosa' MATE 64bit
- Python2.7.6

その後、Ubuntu14.04LTSの環境でも確認しました。

**2017/04/28修正**
*出回っているサンプルコードを実行しようとすると、Python2系と3系の両方が使えたほうがよいと感じたので、以下のページを参考に「pyenv+anaconda」を利用してインストールしました。OpenCVもChainerも楽々インストールで切り替えられるので分かりやすいです！！*

機械学習系の環境構築手順が一通りまとめられています。
http://blog.algolab.jp/post/2016/08/21/pyenv-anaconda-ubuntu/

PythonでOpenCVを導入する最も簡単で早い方法について言及されています。
自分でビルドしようとして通らず数日間ハマっていました。。。
http://qiita.com/zabeth129/items/8a1a75cdf713d4fa6bc8

anacondaでのPython環境切り替えもコマンド一発です。



#VirtualBoxを途中で容量追加する方法

VirtualBoxを使用していて、途中で容量を追加する方法がわからなくてしばらくハマってしまったのでメモします。

以下の解説ページに従ってVirtualBoxの設定を行います。
http://kabatin.hateblo.jp/entry/2016/02/25/190846

バージョン5.0.16 r105871での簡単な流れ

1. 設定画面の[ストレージ]タブで[コントローラ：SATA]を選択
2. [ハードディスクの追加]で[新規ディスクの作成]を選択
3. VDI、可変(または固定)、容量を決めてディスクを作成
4. vdiのある場所までコンソールで移動してコマンド実行
$ VBoxManage clonehd --existing "old.vdi" "new.vdi"

5. 古いvdiの割り当てを除去し、[コントローラ: IDE]にてディスクを追加して、gparted-live-0.25.0-3-i686.isoを読み込む。
6. VMを起動後、「Other modes of GParted Live」→「GParted Live (Default settings, KMS)」→「Japan」→何もせずEnterを選択して、gpartedでパーティション設定を行う。
7. /dev/sda1と未割り当て領域だけ残してあとは右クリックから[Delete]で削除。
8. 2.0GBほど残してdev/sda1領域を増やし、残り領域を選択して[New]→[拡張パーティション]→[Add]で未割当領域を作成。
9. 未割当領域の右クリックメニューの[New]→[linux-swap]→[Add]を選択、領域を選択して右クリックメニューから[スワップを有効化]を実施し、最後に[Apply]をクリックして作成。

ブートCDを除去して再起動すれば容量が増えています。


ちなみに、2GBの余分なスペースが必要になるため16GB確保したければ、18GBでストレージを作成します。
ストレージの内容はそのままコピーできるので、容量を増やしてもこれまで同様に使用可能です。


#VirtualBoxにスワップ領域を追加する方法

例：4GBのスワップ領域を追加する場合

```
dd if=/dev/zero of=/swap.extended bs=1M count=4096
mkswap /swap.extended
swapon /swap.extended
```

以下コマンドで確認

```
cat /etc/fstab
```

#物体検出の有名な手法(YOLOとSSD)を試す

Udemyの講義です。
SSDとYOLOをGoogleのcolaboratoryとAmazonのAWSで動かす方法、独自のデータセットを使ってSSDやYOLOを学習する方法を紹介しています。

https://www.udemy.com/yolossd-a/?instructorPreviewMode=guest




#gitからword2vecをインストール

googleの公式ページのガイドに沿ってsvnからダウンロードしようとすると、指定のURLが存在しないためエラーとなります。

```
svn checkout http://word2vec.googlecode.com/svn/trunk/
```

svnではなくgitからダウンロードすることで使えます。

```
git clone https://github.com/svn2github/word2vec.git
```

svnからgithubへ移行したのかもしれません。以下のようにmakeしてdemoが走るようになります。

```
cd word2vec
make
./demo-word.sh
```


#linuxコマンド集
Ubuntu apt-getのコマンドまとめ
http://qiita.com/white_aspara25/items/723ae4ebf0bfefe2115c
Rの使い方についてメモ チートシート的な物

　別の所から持ってきたけど、リンクが良くないので少しずつ直す
一度、上げてましたが直したい所があったので、上げ直し。

#Rについて
　https://ja.wikipedia.org/wiki/R%E8%A8%80%E8%AA%9E
　https://www.r-project.org/

#設定等

- ライブラリのインストール　`install.packages(”HOGE”)`
- ライブラリの管理について [Rのパッケージ管理 （アップデート 、読込済みパッケージ一覧の表示方法）](http://qiita.com/HirofumiYashima/items/7d431ac6bc1b2e7c79eb)  
ライブラリによっては、前提として入っていなければいけないライブラリがあったりするので注意すること。(dplyr, tidyrで少し困った。)  
`dependencies = TRUE`とすることで、関連するライブラリが自動で入るっぽい。
- グラフ化（可視化） ライブラリggplotを使用 http://ggplot2.org/
- ライブラリの呼び出し方 `library(ggplot2)`
- ライブブラリアップデート `update.packages()`
- 作業ディレクトリの設定　`getwd()`
- その他の便利なライブラリ一覧  
GGally,corrplot,psych,qgraph

##データ準備
　データ読み込み　`read.csv("hoge.csv",header = T,sep = ",")`　[41. EXCEL のデータを読み込む](http://cse.naro.affrc.go.jp/takezawa/r-tips/r/41.html)

##分析等
- (ピアソン)相関分析　`cor.test(iris $ Sepal.Length, iris $ Sepal.Width, method="pearson")`
 [R言語で統計解析入門： ピアソンの積率相関係数と(無相関)検定　梶山　喜一郎](http://monge.tec.fukuoka-u.ac.jp/r_analysis/descriptive_correlation00.html)
- 単回帰分析と予測区間について線形モデルによる回帰 lm() 　予測区間　信頼性区間について　predict()  
 - [Excelで回帰分析の予測区間を描く - Qiita　ggplotによる散布図作図](http://qiita.com/ksksk/items/75ba95337ccdb32e7cb1)
[単回帰 | 回帰分析 | Logics of Blue](http://logics-of-blue.com/%E5%8D%98%E5%9B%9E%E5%B8%B0/)  
 - 統計学入門−第5章　統計的な捉え方や考え方について  
 - [信頼区間の意味と、Rのpredict()関数の使い方の注意点 - StatsBeginner: 初学者の統計学習ノート](http://statsbeginner.hatenablog.com/entry/2014/10/18/130504)　　Rで順番に説明してあるのでわかりやすい。

##グラフ化
- ggplotによるグラフ化　`ggplot(piyo,aes(x = before,y = after)) + geom_point(aes(color = hogehoge))`

 - Amazon.co.jp： みんなのR -データ分析と統計解析の新しい教科書-: Jared P. Lander, Tokyo.R（協力）, 高柳慎一, 牧山幸史, 簑田高志: 本
 - ggplot2 の自分用メモ集を作ろう - Triad sou.
 - ggplot2 (公式)

- 散布図行列　GGallyライブラリパッケージ ggpairs関数がよさそう。　psychパッケージ
 - [美しいペアプロット図を簡単に作る - 驚異のアニヲタ社会復帰への道](http://d.hatena.ne.jp/MikuHatsune/20130412/1365774348)　ggpairsについて
 - [美しいペアプロット図を簡単に作る - My Life as a Mock Quant](http://d.hatena.ne.jp/teramonagi/20130412/1365767677)      psychパッケージについて
- 散布図に回帰直線を追加する。　geom_smooth(method=lm,se=FALSE)
 - [Scatterplots (ggplot2)](http://www.cookbook-r.com/Graphs/Scatterplots_(ggplot2)/)

##データ生成
　ランダムデータ生成　正規分布　`x <- rnorm( n=3000 )`

##データ処理
- dplyr, tidyrというライブラリが良いらしい。
 - [R dplyr, tidyr でのグルーピング/集約/変換処理まとめ - StatsFragments](http://sinhrks.hatenablog.com/entry/2014/10/13/003717)

##行列操作
- 行列の入替え　`data1 <- t(data)`  
[データフレームの行列入れ替え｜ぎょうむ日誌　/　R言語で統計解析入門： データフレームの行と列の入れ替え (転置行列)　梶山　喜一郎](http://monge.tec.fukuoka-u.ac.jp/r_analysis/basic_data_frame04.html)

##その他
　本当のチートシート　[RStudio - Cheatsheets](https://www.rstudio.com/resources/cheatsheets/)
　まとめ　http://stat.biopapyrus.net/

#おまじないメモ
　`install.packages("ggplot2", dependencies=TRUE)`


#Rでpythonを動かす。(windows向け)
- pythonをインストールする。
- `install.packages("PythonInR", dependencies=TRUE)`
gyb (Generate Your Boilerplate) によるテンプレート作成


`swift`の内部で使われている`gyb`を使うことで無駄なコピペコードを減らそうという話。

1. [`gyb`の取得](#`gyb`の取得)
2. [configファイルの作成](#configファイルの作成)
3. [コード生成](#コード生成)

## `gyb`の取得

```pull_gyb.sh
mkdir gyb
curl "https://raw.githubusercontent.com/apple/swift/master/utils/gyb.py" -o "gyb/gyb.py"
curl "https://raw.githubusercontent.com/apple/swift/master/utils/gyb" -o "gyb/gyb"
chmod +x gyb/gyb
```

取得し実行権限を与えます。

## configファイルの作成

今回は`Lens`のSwift実装[L](https://github.com/335g/L)を用いて、手持ちのモデルに`Lens`を`extension`するコードを生成することにします。

`Extension.swift.gyb`と`LensExtensions.gyb.py`の2つのファイルを準備します。`Extension.swift.gyb`の方はどういうテンプレートなのかを具体的に示すファイルで、`LensExtensions.gyb.py`の方は手持ちのコードで定義してる型情報からどれをテンプレートに使うのかを表したものです。`LensExtensions.gyb.py`から情報を引っ張ってきて`Extension.swift.gyb`でテンプレートを作るイメージ。

まず手持ちのモデルとして、以下のようなものがあるとします。

```model.swift
public struct Street {
	var name: String
}
```

この型に`Lens`を追加するとして、`LensExtensions.gyb.py`を以下のように作ります。

```LensExtensions.gyb.py
lenses_info = {
	"Street": {
		"name": {"type": "String"}
	}
}
```

型名`Street`とプロパティ名`name`とその型`String`です。対象のモデルが増えてきたら`lenses_info`に追加してやればOK。

次に`Extensions.swift.gyb`を準備します。

```Extensions.swift.gyb
%{
import os
import sys

try:
    config
except NameError:
    sys.exit("`-Dconfig` is not specified.")

config_path = os.path.abspath(config)
if not os.path.exists(config_path):
    sys.exit(config_path + " was not found.")
execfile(config_path)

try:
    lenses_info
except NameError:
    sys.exit("no info of lens.")

}%

import L

% for extending_type_name, properties in lenses_info.items():
extension ${extending_type_name} {

% for (key, attributes) in properties.items():
    public var ${key}_lens: Lens<${extending_type_name}, ${attributes["type"]}> {
        return Lens<${extending_type_name}, ${attributes["type"]}>(
            get: { $0.${key} },
            set: { new_${key}, obj in 
                var newObj = obj
                newObj.${key} = new_${key}
                return obj
            }
        )
    }
% end
}

% end

```

`%{`から`}%`で囲われた部分や`%`で始まる部分、`${PARAM}`の部分はコード部分でありテンプレートとして出力されません。テンプレートとして出力されるのはそれ以外の部分です。

`%{`から`}%`で囲われた部分でパラメータ`lenses_info`の準備をしています。引数から`LensExtensions.gyb.py`へのパスを与えるようにしているため、まずはファイル取得ができているかチェックしています。また、ファイル中に`lenses_info`があるかをチェックしています。

`%`で始まる部分や`${PARAM}`の部分はコード部分です。`lenses_info`パラメータを使ってforループ回しているだけですので、最後に記す出力ファイルと比較して見てもらえればイメージできるかと思います。

## コード生成

```
./gyb/gyb Extension.swift.gyb -o output.swift -Dconfig=path/to/LensExtensions.gyb.py
```

`output.swift`はテンプレートとして出力されるファイル。`-D[NAME=VALUE]`の`NAME`の部分にはカスタムパラメータを設定できます。ここでは`config`を与えているのですが、`Extension.swift.gyb`内の`config`に`VALUE`が代入されます。

実際に生成された`output.swift`はこんな感じ。

```output.swift
import L

extension Street {
    public var name_lens: Lens<Street, String> {
        return Lens<Street, String>(
            get: { $0.name },
            set: { new_name, obj in 
                var newObj = obj
                newObj.name = new_name
                return obj
            }
        )
    }
}
```

実際にはコメントも出力されるのですが、ここでは省略してます。
Ubuntu 上のあらゆるウィンドウを半透明する

## 2020-03-26 追記

※ Ubuntu が Unity を採用していた頃の記事です。

現在は Desktop 環境が Gnome ベースになっているので、利用できない場合があります。

追記ここまで

# Ubuntu 上のあらゆるウィンドウを半透明する。

![Screenshot from 2016-07-22 02-23-47.png](https://qiita-image-store.s3.amazonaws.com/0/77617/4ec6dccf-25fe-ba5f-6a90-033e3efe2eb2.png)

上記の画像はFirefoxを半透明にして、後ろのGimpをうっすらと表示させています。ブラウザを閲覧しながら、後ろで動画再生とか良くやります。結構便利ですよ。

## 方法
ウィンドウの半透明化にはCompiz 機能を利用します。

### Compiz Config 設定マネージャー のインストール
Compiz Config 設定マネージャーを使うのでインストールしましょう

``` terminal
$ sudo apt-get install compizconfig-settings-manager compiz-plugins-extra
```

compiz-plugins-extra は不要かもしれません……これをインストールしておくと、CompizConfig設定マネージャの設定項目が増えます。

### Compiz Config 設定マネージャを使った設定

Compiz Config 設定マネージャを開いてください。
「アクセスビリティ」にカテゴリされている「不透明度・明度・彩度」を開いてください。
![Screenshot from 2016-07-23 20-38-09.png](https://qiita-image-store.s3.amazonaws.com/0/77617/4a229003-0e87-9239-c6e4-d20e6b28a756.png)


「不透明度」タブの 「Increase Opacity Key」 と 「Decrease Opacity Key」にそれぞれ任意のキーを割り当ててください。私はCtrl + PageUp 、 Ctrl + PageDown をそれぞれ割り当てました。「不透明度・明度・彩度を有効にする」のチェックボックスを有効にして、ウィンドウを閉じてください。

![Screenshot from 2016-07-23 20-38-19.png](https://qiita-image-store.s3.amazonaws.com/0/77617/d7c3cb63-190b-d499-94da-6852381defbb.png)

おめでとうございます。これであらゆるウィンドウを半透明化することが出来ます。では、快適なLinux ライフをお楽しみください。

## 追記 (2016/07/27)
Compiz Config 設定マネージャで前述の設定をしていたならば、

```
Alt + マウスホーイール上下
```

でも透過率を変化させることが出来ます。普段マウス操作の人はこちらのほうが楽かもしれないですね。

## 参考URL
[ Linuxとは日記:Emacsの設定では半透明にしない ](http://kouritool.com/what-linux/emacs%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%AF%E5%8D%8A%E9%80%8F%E6%98%8E%E3%81%AB%E3%81%97%E3%81%AA%E3%81%84/)
[wordpress][レンタルサーバー]子テーマをgit管理する

※.git ファイルを置くディレクトリに関して、ご指摘を受けましたので修正しました。

レンタルサーバーと wordpress でブログを公開しています。

子テーマをカスタムする際、
ソースコードを直接触るので Git でバージョン管理しておきたい。

## エックスサーバー へ Git をインストール

エックスサーバーにはデフォルトで Git がインストールされていません。
バージョン管理無しで開発する気にはなれないので Git をインストールしました。

レンタルサーバなので root権限はありません。

```
#!/bin/sh
# alias
echo 'alias ll='ls -la' >> .bashrc
echo 'alias g='git' >> .bashrc
cd ~
mkdir opt
# gettext install
cd ~/opt
wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.7.tar.gz
tar zxvf gettext-0.19.7.tar.gz
cd gettext-0.19.7
./configure --prefix=$HOME/opt
make
make install
cd ~
echo 'export PATH=$PATH:$HOME/opt/bin' >> .bashrc
source ~/.bashrc
# curl install
cd ~/opt
wget http://curl.haxx.se/download/curl-7.46.0.tar.gz --nocheck-certificate
tar zxvf curl-7.46.0.tar.gz
cd curl-7.46.0
./configure --prefix=$home/opt
make
make install
# Git install
cd ~
wget https://github.com/git/git/archive/master.zip
unzip master.zip
cd git-master
autoconf
./configure --prefix=$HOME/opt --with-curl=$HOME/opt --with-expat=$HOME/opt
make -i all
make -i install
```

&nbsp;

## 無事に子テーマを Git 管理できました

テーマは、[STINGER PLUS+](http://wp-fun.com/post-842/) を使っています。  
SEO強いですし、カスタムしやすくてオススメです。
※git init するディレクトリに関して、ページ下の【追記】に注意書きを書いています。

<a href="http://ikenji.tech/wp-content/uploads/2016/07/xgit1.png"><img class="alignnone size-medium wp-image-120" src="http://ikenji.tech/wp-content/uploads/2016/07/xgit1-300x92.png" alt="xgit1" width="30%" /></a>

<br>

### Git でデプロイ

ローカルやクラウドIDEで編集してGitHub かどこかにホスティングすれば```git pull```でデプロイできます。  


### 【追記】
テーマのディレクトリはpublicなので、.gitファイルを置くべきではありません。
wp-config(wordpressのパスワードなどが書いてあるファイル)からgit管理することにしました。

管理したいのは、子テーマだけなので .gitignore ファイルを工夫します。
<a href="http://ikenji.tech/wp-content/uploads/2016/07/スクリーンショット-2016-07-23-20.33.16.png"><img src="http://ikenji.tech/wp-content/uploads/2016/07/スクリーンショット-2016-07-23-20.33.16-300x78.png" alt="スクリーンショット 2016-07-23 20.33.16" width="300" height="78" class="alignnone size-medium wp-image-226" /></a>


```
$ git ls-files
wp-content/themes/stingerplus-child
```

できました。
OSXでスクリプトを自動実行する方法


**実行環境**
OS：OS X EI Capitan(10.11.5)

##1.Launchdとは
>launchdはデーモン、アプリケーション、プロセス、スクリプトの起動・停止・管理を行う、オープンソースのサービス管理フレームワークである。

[wiki](https://ja.wikipedia.org/wiki/Launchd)より。Linuxでcronにあたるのかな。

##2.サンプルのスクリプトを用意

まず、実行するサンプルのスクリプトを用意します。
今の時間をテキストファイルに保存してスクリプトです。

```sample.script
#!/bin/bash

#日付をテキストファイルに保存
cd ~/Desktop
date >> sample.txt

```

##3.launchd.plistを用意
実行するファイル名、実行するタイミングなどを記載した設定ファイルを用意します。以下サンプルです。

```sample.time.record.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>Label</key>
   <string>sample.time.record</string>
  <!--フルパスで指定-->
 <key>ProgramArguments</key>
   <array>
     <string>/Users/username/Desktop/sample.sh</
string>
   </array>
 <key>StartInterval</key>
   <integer>60</integer>
 <key>RunAtLoad</key>
   <true/>
 <key>ExitTimeout</key>
   <integer>300</integer>
</dict>
</plist>

```


keyについては以下を参考にしました。
http://tweeeety.hateblo.jp/entry/2015/01/06/215425

>|key名|	説明|
|:--|:--|
|Label|	launchd のジョブの名前。慣例？でファイル名もLabel.plistという名前がいいぽい|
|ProgramArguments|実行するプログラムとオプションや引数をarrayノードで指定|
|RunAtLoad|trueの場合はlaunchd に launchd.plist がロードされたタイミングで起動|
|StandardOutPath|標準出力ログの場所。指定がないと/var/log/system.log|
|StandardErrorPath|標準エラーログの場所。|
|StartCalendarInterval|実行日時のカレンダー指定|
|StartInterval|カレンダー指定ではなくインターバル指定したいときはこちらを使用|

## 3.launchdへの定期実行の登録/取消と確認

設定ファイルができたら、以下の手順で設定ファイルを反映させます。

①作成しいたファイルを以下のディレクトリに保存
~/Library/LaunchAgents/

②Terminalで作成したファイルを読込
```$ launchctl load sample.time.record.plist```


③ちゃんと実行されているか確認
```$ lauchctl list | grep 'sample'```

テキストファイルに1分ごとに時間が記録されていたら成功です。
```$ cat ~/Desktop/sample.txt```

スケジュールを止めるときはunloadします
```$ launchctl unload sample.time.record.plist```

設定ファイルを更新した場合は、一度unloadして、再度loadしてください。

### 参考URL

- [Mac OS Xでlaunchdでcronのように定期実行するメモ - launchd.plistの作成とか](http://tweeeety.hateblo.jp/entry/2015/01/06/215425)
- [Mac OS Xでスクリプトを定期実行する](http://junkato.jp/ja/blog/2012/12/18/mac-os-x-launchd/)
- [launchd.plistの書き方](http://ka-zoo.net/2013/04/launchd-plist/)
【しずおかアプリ部】活動ログ　第23回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)


##■タイトル##
第２3回


##■開催日##
２０１６年７月23日（土）　１６：００～１８：００


##■参加者##
１０名


##■活動内容（概要）##
・菅原プレゼン「Unityはじめるよ　～パーティクル基礎編～」
・部員さんプレゼン「Gitでバージョン管理～すぐ使う編（後編）～」
・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム ～軌跡の点線を消す編④(後編)～」

##■活動内容（詳細）##

【実演・プレゼン】

**・菅原プレゼン「Unityはじめるよ　～パーティクル基礎編～」**
![スクリーンショット 2016-07-23 19.28.00.png](https://qiita-image-store.s3.amazonaws.com/0/88105/82a5264f-3db3-7418-3787-6a90f2b62ec0.png)
　パーティクルシステム「Shuriken」のサブエミッタの使い方を解説。
　「壁に向かって銃を撃ち、壁に銃弾痕を残しながら破片が飛び散る」様子をスクリプトを一切使わずに表現。
サブエミッタの項目「Birth」「Collision」「Death」のどこにセットするかで、新たなパーティクルを生成するタイミングが変わる。
　今回は「Collision」にセットすることで、壁に銃弾が当たった瞬間に、銃弾痕のパーティクルと、破片が飛び散るパーティクルを生成するようにした。
　　資料：[第23回_プレゼン資料_(Unityはじめるよ～パーティクル～).pdf](http://monolizm.com/sab/pdf/第22回_プレゼン資料_(Unityはじめるよ～パーティクル～).pdf)
　　プロジェクト一式：[Unityのプロジェクト一式](http://monolizm.com/sab/src/unity_23_ParticleTest.zip)
<hr>

**・部員さんプレゼン「Gitでバージョン管理～すぐ使う編（後編）～」**
![IMG_7109.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/293adf68-2ea7-fe19-d4d9-41fd2105f253.jpeg)

　前々回に引き続き、SourceTreeを使ってのgitの使い方を改めて解説。
　ローカルリポジトリで管理する方法を体験を交えて解説。
　・作業フォルダにリポジトリを作って、Git管理できるようにする
　・gitignoreの設定（ログや一時ファイルなど不要ファイルを管理対象外にする）
　　＞すべてのリポジトリに反映されるグローバル設定と、それぞれのリポジトリにだけ反映されるローカルな設定がある
　・Unity側でも設定が必要（ProjectSettings > Editor）
　・あとはコミットするだけ！　いつでも好きなバージョンに戻せるし、アーカイブも可能！
　・コミットするメッセージは自由だが、規則に則った方が、誰が見てもわかるからお勧め。
![IMG_7108.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/5e944a4f-c49f-2fcb-991c-ec613bee507a.jpeg)

・リーダブルコードという本がおすすめ
　関数名や、変数名などの付け方などのコーディングのルールをわかりやすく解説した本。

　　資料：[第23回_プレゼン資料_(Gitでバージョン管理～すぐ使う編～).pdf](http://monolizm.com/sab/pdf/第21回_プレゼン資料_(Gitでバージョン管理～すぐ使う編～).pdf)

<hr>

**・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム ～軌跡の点線を消す編④～」**
　　前回の続き。
![IMG_7112.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/ed9a4ca6-6339-ecb9-84b3-c14e0dcdec4b.jpeg)

　　前回のおさらい・・・・↓↓↓↓↓↓↓↓↓↓↓↓
　**AngryChickenの前回の問題点**

　・今までの軌跡の履歴がすべて残ってしまっているので、前回のゲームの軌跡のみ残すようにしたい

　**解決方法**
　　軌跡を残すためのNodeを二つ用意し、プレイ毎に切り替えることで、実行時用と履歴表示用を使い分けてる。

![スクリーンショット 2016-07-09 20.15.26.png](https://qiita-image-store.s3.amazonaws.com/0/88105/df072055-6e0f-cf04-b7ae-15c99b9b00d5.png)

　なんとかコーディングを終えて、シミュレーター上で動作確認を行うことができた。

![IMG_7113.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/1d952e64-efad-98ae-f4bf-5ee2fcb5034e.jpeg)


　　資料：[第22回_プレゼン資料_(Cocos2d-xで作る物理演算ゲーム　～軌跡の点線を入れてみる④～).pdf](http://monolizm.com/sab/pdf/第21回_プレゼン資料_(Cocos2d-xで作る物理演算ゲーム軌跡の点線を入れてみる④).pdf)

<hr>
**・部員さんプレゼン「Unity VR EXPO AKIBA出展」報告**
　7/17に秋葉原で開催された　[「Unity VR EXPO AKIBA」](http://events.unity3d.jp/vrexpoakiba/)の出展報告。　
　・10:30から18:00までのイベントの最中、最初と最後の30分以外、人が絶えなかったほどの大盛況！
　・ハードウェアから自作の出展者は他にはいなかった。
　・アンケートもたくさん集まった。
　・HTC Viveを利用している出展が半数ほど。
　・企業がガチで作ったものが増えてきているため、次回開催時には個人出展がいなくなるかもしれないとのこと。
　　※部員さんの場合はVR以外のイベントにも出展できるのでOK
　・次回に向けて、さらなる進化をしたい。
React.js参考文献メモ


## 練習系
- [一人 React.js Advent Calendar](http://qiita.com/advent-calendar/2014/reactjs)
- [本家のチュートリアル（和訳）](https://facebook.github.io/react/docs/tutorial-ja-JP.html)
- [30分間React入門「いいねボタン」作成チュートリアル](http://c16e.com/1510161700/)

## Reactの設計思想など
- [今話題のReact.jsはどのようなWebアプリケーションに適しているか？](https://html5experts.jp/hokaccha/13301/)
- [React.jsでクライアントサイドなWebアプリ入門 Side Share](http://www.slideshare.net/spring_raining/reactjsweb)

## Redux
- [Reduxで定期的なアクションを実行する簡単なサンプルを作ってみた](http://webdesign-dackel.com/2015/11/03/redux-periodic-action/)
- [ReduxとES6でReact.jsのチュートリアルの写経](http://blog.bokuweb.me/entry/redux-tutorial)
- [公式チュートリアルをReduxで書き直し](http://qiita.com/ma-tu/items/561cbf84ffeb14dad4a7)
- [ES6 + React.js + Redux で作るチャットシステム](http://engineer.blog.lancers.jp/2016/02/es6-react-js-redux-%E3%81%A7%E4%BD%9C%E3%82%8B%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0/)
VagrantでVPSホストを構築してみる

Vagrantを使ってローカルでサーバーを起動してごにょごにょしてる人は多いと思いますが、このVagrantを使ってサーバーを立てられるホスト環境を構築しています。もともとはOpenStackを構築して使おうと思ったのですが、redhatの出してるインストール「RDO」で構築するとCinderボリュームが20GBに制限されてしまうという問題を、ぐぐってもぐぐっても解決できなかったのでしょうがなくVagrantです（ぉぃ

# サーバー
とりあえずサーバーは社内に転がっていた、

0. Core 17(Quad Core)
0. メモリ32GB
0. 500GB SSD

のマシンを使用。

#OS
ホストOSは、枯れているUbuntu Server 14.04 LTS。
もうそろそろ16.04 LTSで行けるかもしれないんですが、LTSのアップデートでは結構な修正点があるので、ネットをぐぐって設定とかする時にコピペが通用しないので、コピペ作業がメインの人は14.04にしておきましょう。

# Vagrantfile
```bash
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
   config.vm.define "webserver" do |webserver|
       webserver.vm.box = "Official_Ubuntu_14.04_AMD64"
       webserver.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"
       webserver.vm.hostname = "webserver"
       webserver.vm.provision "shell", path: "provision.sh", privileged: true
       webserver.vm.network "private_network", ip: "192.168.100.101"
       webserver.vm.provider "virtualbox" do |node|
           node.customize ["modifyvm", :id, "--memory", "4096"]
           node.customize ["modifyvm", :id, "--cpus", "2"]
           node.customize ["modifyvm", :id, "--cpuexecutioncap", "50"]
       end
   end

end
```
# 解説
このVagrantfileで、
>$ vagrant up

設定が複数ある場合は、
>$ vagrant up webserver

とやると、Ubuntu Server 14.04 AMD64が起動します。メモリは4GBで、CPUコアは2（仮想）で起動します。ホストのCPU稼働率の50％を超えない設定も入っています。
これで起動するとホストオンリーアダプターにはおなじみの、
>10.0.2.15

が割り当てられます（おそらくeth0）。
そこに、192.168.100.101が割り当てられたNICも生成されます（おそらくeth1）。
以降は上記の、
>config.vm.define "webserver" do |webserver|

で始まるブロックを複製して**webserver**を新しいVPSの名前に置換すればそのままその名前で操作出来ます。

# ネットワーク
この状態だと、ホストとゲスト、ゲストとゲストの通信は出来るのですがゲストに繋ぐためには一旦ホストを踏み台にする必要があります。

**これがめんどくさいんですよね〜（ぉぃ**

なので直接ゲストに入れるようにしようとしたんですが、入ろうとしてるマシンと同じネットワークに接続するしか手段が見つけられなかったんですね。ぐーぐる力が低いもんで。
とりあえずホスト側に、
>192.168.100.1

のアダプターを生成したんですが（やりかたは「ubuntu network interfaces」とかでぐぐってください）、どうにも繋がらない。iptablesは-Fで大開放済み。とここで結構ハマってしまったんですが「行きと帰りで経路違うんじゃね？」と思い、ゲストに設定されているデフォルトゲートウェイ、
>10.0.2.1

を削除して新たに、
>192.168.100.1

をデフォルトゲートウェイに設定。これで普通に繋がるようになりました。

# あとがき
そもそも、
>public_network

で、接続しようとしてるマシンと同じネットワークに参加させるだけでも接続出来るようにはなるんですが、このVPSをルーターからDNATかまして外部に公開する予定だったので、ネットワークを分離してネットワーク毎にiptablesで制御したかったのでした。
目的が達成出来たので満足です（笑）
爆速でChrome拡張機能を作成する 

Chrome拡張機能は便利だが、いざ自分が作るとなると覚えることが多くて面倒くさい。
そこで **generator-chrome-extension** というひな壇生成ツールを使って効率的にChrome拡張機能を作ってみる。

# 作るもの

https://github.com の背景が真っ赤になる誰得拡張機能

Chrome拡張機能にもいくつか種類があり、今回のように特定のURL(全体でもできるが)で何かを実行したい場合は**Content Scripts**と呼ばれるタイプを使う。

# インストール

依存ライブラリのインストール

```
npm install -g yo bower gulp
```

Chrome拡張機能のコードテンプレートを生成するためのジェネレータをインストール

```
npm install -g generator-chrome-extension
```

# ひな壇生成

yoはひな壇を生成するコマンド。それ以上でもそれ以下でもない。

```
mkdir my_extension
cd my_extension
yo chrome-extension
```

いろいろ質問される。今回はContent Scriptsを作りたいので

```
? What would you like to call this extension? my_extension
? How would you like to describe this extension? My Chrome Extension <<そのままエンター>>
? Would you like to use UI Action? No <<そのままエンター>>
? Would you like more UI Features? <<Content Scriptsでスペースキー押してエンター>>
? Would you like to set permissions? <<そのままエンター>>
```

これでひな壇が生成される。いろいろディレクトリがあるが**肝心の拡張機能部分はappであることに注意**

# manifestの設定

デフォルトだとすべてのサイトで動作するが、今回はGithubのサイトのみで動いて欲しいのでmachesの部分も以下に変更

```javascript
  "content_scripts": [
    {
      "matches": [
        "https://github.com/*"
      ],
    }
  ]
```


面倒なので最初からJQueryをインストールしておくと吉

```
bower install jquery --save
```

```js
  "content_scripts": [
    {
      "js": [
        "bower_components/jquery/dist/jquery.min.js",//　← これをcontentscript.jsより前に追加
        "scripts/contentscript.js"
      ],
    }
  ]
```

# ファイルの編集

いよいよgithubの背景色を赤くする誰得処理を記述する時が来た。編集するファイルはapp/**scripts.babel**/contentscript.jsでapp/**scripts**/contentscript.jsではないので注意

```js:app/scripts.babel/contentscript.js
'use strict';

$(function () {
  $('body').css('background-color', '#ff0000');
});
```

# 実行

以下のコマンドを実行すると、app/**scripts.babel**/ 以下のコードをビルドし、
app/**scripts**/ 以下に実行ファイルを生成してくれる。

```
gulp watch
```

その後、Chromeの拡張機能管理画面より「パッケージ化されていない拡張機能を読み込む」でインストール。ディレクトリはさっき生成したappを選択する。

うまく読み込まれれば https://github.com/ を開くと赤く染まったGithubがオデムカエしてくれる。

# 開発するときのTips

開発するときは当たり前だが何度もコードを書き換える。その都度再インストールしてたらやってられない。 generator-chrome-extension ではそこもカバーしてくれており、以下のコマンドを実行すると

```
gulp watch
```

「何かコードを修正したら、それを検知してビルドを行い、さらにChromeに再読み込みさせる」をリアルタイムで実行してくれる。
【Swift】RxSwiftのPlaygroundを読む⑥

RxSwiftのPlaygroundを読んでみるシリーズ今回は
流れてくる値を集める操作についてです。
([Mathematical_and_Aggregate_Operators](https://github.com/ReactiveX/RxSwift/blob/master/Rx.playground/Pages/Mathematical_and_Aggregate_Operators.xcplaygroundpage/Contents.swift))

# Mathematical and Aggregate Operators
completeが流れてくるまで川をせき止め、
complete後に値を流すObservableにしてしまいます。

## toArray
completeが流れてくるまでに流れてきた値を配列にし、
配列を流すObservableに変えてしまう。

```swift
let disposeBag = DisposeBag()

let toArray = PublishSubject<String>()

toArray.toArray()
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

toArray.onNext("🍑")
toArray.onNext("🍎")
toArray.onNext("🍐")

toArray.onCompleted()
```

**結果**

```
Next(["🍑", "🍎", "🍐"])
Completed
```

## reduce
初期値を指定後、流れてきた値と初期値に対し処理を行い、その結果を保持。
次に流れてきた値と保持している値に同様の処理を行い、その結果で保持している値を更新。
completeが流れてきたタイミングで保持している値を流すObservableにする。
scanとの違いは、処理の中間結果を流すかどうか。

```swift
let disposeBag = DisposeBag()

["🍑", "🍎", "🍐"].toObservable()
    .reduce("", accumulator: +)
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)
```

**結果**

```
Next(🍑🍎🍐)
Completed
```

## concat
merge同様、2つ以上の川を一つの川にまとめるものの、
一つ目の川にcompleteが流れたタイミングで2つ目の川をsubscribeするObservableにする。

```swift
let disposeBag = DisposeBag()

let observable1 = ["🍑", "🍐", "🍊"].toObservable()
let observable2 = ["🍎", "🍇"].toObservable()

[observable1, observable2].toObservable()
    .concat()
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)
```

**結果**

```
Next(🍑)
Next(🍐)
Next(🍊)
Next(🍎)
Next(🍇)
Completed
```

([こちら](http://reactivex.io/documentation/operators/concat.html)のマーブルダイアグラムと挙動が違う気がするのですが、、、。)

# おわりに
リアクティブプログラミングの関数名は馴染みの薄いものが多く、
語感が掴めないので辛いところがあります。

次回は値が流れるタイミングを操作できるOperatorについてです。

# 参考
https://github.com/ReactiveX/RxSwift/tree/master/Rx.playground
SMSを利用するときに最低限知っておきたいこと


# はじめに
最近上場したTwilioをはじめ、SMS(ショートメッセージサービス)を送れるサービスはたくさんあり、送ること事態は簡単にできる。
しかし、普通に実装すると落とし穴が存在するので、その落とし穴に落ちないためのマニュアル。

今回は、個人認証をするために、SMSで認証番号を送る部分を作成したので、その時にどのような対応をしたかを書く。

# TL;DL

- Twilioだけでは、SMSが届かない人が ~~7%~~ 30%いる → SMSは、その国の配信事業者で、到達率が高いものを使おう


- それでも届かない人へ向けて → SMS通知以外の手段も用意しよう。たとえば音声通知など

# SMSの基礎知識
## なぜSMSを使うか
- メールに比べると、開封率が高い
	- 迷惑メールなどにまぎれない
- 到達確認が可能
- MNP制度(ナンバーポータビリティ)による宛先変更が少ない
- アカウントの複製が困難(回線を用意する必要がある)

## 送受信の方法

- パケット通信ではなく、回線交換ネットワーク上での通信
- ネットワーク事業者(SMSC)によって回線ネットワークが違う

![sms_architecture.png](https://qiita-image-store.s3.amazonaws.com/0/14275/44b7d592-f049-85c0-49a4-d017be965142.png "sms_architecture.png")

出典 : http://uncw.edu/itsd/documents/computer-sms_pdf.pdf


# SMS送信サービスの選び方と、その理由
## 選ぶときに重視すること
- (その国で)到達率が高いサービスを利用する
	- その国のネットワーク事業者に直接送信できるサービス

## なぜ到達率に差が出るのか

到達しない理由は、大きく分けると以下の3つの理由になる。

- ネットワーク事業者(SMSC)へつながらない
- ネットワーク事業者(SMSC)でフィルタリングされている
	- たとえば送信元の電話番号や、メッセージにURLが入っているetc
- SMSに対応していない(SMS無し契約)

## 届かない場合、具体的に起こっていること

- 別のネットワーク事業者に送信しようとしている
	- SMSサービスが持っているネットワーク事業者の情報が古い
		- 例)MNPされた情報が更新されておらず、以前のネットワーク事業者に送信処理を行う
- フィルターにひっかかっている
	- 利用している電話番号がブラックリストに乗っている
	- 国際SMSなどの理由により、不正なサービスと判断されている
	- メッセージ内に不適切なテキストが含まれている
		- URLが記載されている、入力されてはダメな文字列が含まれているetc

## 各サービス比較表
| サービス名 | 初期費用 | 月額 | 円/1送信 | 到達率(日本国内) | SDK | 備考 |
|--------|--------|--------|--------|--------|--------|--------|
| Twilio | 無料    | 無料 | 8~9.6円 | 70% | あり | 国際SMSでの送信 |
| EZSMS| 無料 | 無料 | 10~50円 | 不明 | なし | ポイント式(前払い) |
| 空電プッシュ| 105,000円~| 50,000円~ | ~8円 | 日本国内の全端末をカバー(※数値での説明なし) | なし | BtoB契約 |
| AOS SMS| 30万円 | 10万円 | 15円 | 99.9% | 不明 | BtoB契約、月15万円で3カ月までトライアル利用可能 |



# それでも届かないときのために
## SMS以外の手段を用意する
どれだけこちら側で万全を尽くしても、SMSが100%届くとは限らない。
SMSを送る目的にもよるが、必ず代替手段を用意しておく。

## 電話番号の本人確認を行いたい場合
指定の電話番号に掛けてもらって、自動音声応答装置(IVR)で対応できる。
もちろん、電話番号の確認の場合、番号通知をしてもらう必要がある。

電話料金は掛けた人が負担することになるが、
電話してもらえばネットワーク事業者のフィルタなどに引っかかることなく、
かかってきた電話番号をもとに認証コードをお届けできる。

## その他
あまり本人確認以外で、100%届けなければいけない、というパターンが思い浮かばないが、何らかの連絡の場合は、その人へのメールも送信するなどが考えられる。