OmniAICreator/Qiita-1.07M huggingface dataset:
【Android】 Kotlin演算子オーバロードまとめ

Kotlinでは、数値型の計算 _1 + 1_ のような記法を任意のクラスでも使うことができる演算子オーバロードという機能が提供されています。
演算子オーバロードを使うことで、コードのシンプルさが高まります。

# 基本
Kotlinの[ソースコード](https://github.com/JetBrains/kotlin)を見ると、Int型やArray型でも演算子オーバロードが使われています。


```Kotlin.kt
public final class Int : kotlin.Number, kotlin.Comparable<kotlin.Int> {
	...
	public final operator fun plus(/*0*/ other: kotlin.Int): kotlin.Int {
		...
	}
}
```
Int型ではoperatorをオーバロードしている _plus_  メソッドにより以下のように書くことができます。

```
val num = 1 + 1
```

```Array.kt
public class Array<T> : Cloneable {
	...
	public operator fun get(index: Int): T {
		...
	}
}
```
Array型ではoperatorをオーバロードしている _get_  メソッドにより以下のように書くことができます。

```
val array = arrayOf(0, 1, 2)
val i = array[0]
```

# 演算子オーバーロード
ここでは、任意のクラスで利用できる演算子オーバロードの一覧を記載します。

## 単項演算
| 演算子 | 関数 |
|:---|:----------|
| +a | a.unaryPlus() |
| -a | a.unaryMinus() |
| ！ | a.not() |

## インクリメント・デクリメント
| 演算子 | 関数 |
|:---|:----------|
| a++ | a.inc() |
| a-- | a.dec() |

## 二項演算
| 演算子 | 関数 |
|:---|:----------|
| a + b | a.plus(b) |
| a - b | a.minus(b) |
| a * b | a.times(b) |
| a / b | a.div(b) |
| a % b | a.mod(b) |
| a..b | a.rangeTo(b) |
| a in b | b.contains(a) |
| a !in b | !b.contains(a) |
| a += b | a.plusAssign(b) |
| a -= b	| a.minusAssign(b) |
| a *= b	| a.timesAssign(b) |
| a /= b	| a.divAssign(b) |
| a %= b	| a.modAssign(b) |

## 配列のような操作
| 演算子 | 関数 |
|:---|:----------|
| a[i] | a.get(i) |
| a[i, j] | a.get(i, j) |
| a[i_1, ..., i_n] | a.get(i_1, ..., i_n) |
| a[i] = b | a.set(i, b) |
| a[i, j] = b | a.set(i, j, b) |
| a[i_1, ..., i_n] = b | a.set(i_1, ..., i_n, b) |

## 比較
| 演算子 | 関数 |
|:---|:----------|
| a == b	| a?.equals(b) ?: b === null |
| a != b	| !(a?.equals(b) ?: b === null) |
| a > b	| a.compareTo(b) > 0 |
| a < b	| a.compareTo(b) < 0 |
| a >= b	| a.compareTo(b) >= 0 |
| a <= b	| a.compareTo(b) <= 0 |

## 関数呼び出し
| 演算子 | 関数 |
|:---|:----------|
| a() | a.invoke() |
| a(i) | a.invoke(i) |
| a(i, j) | a.invoke(i, j) |
| a(i_1, ..., i_n) | a.invoke(i_1, ..., i_n) |

# 実装例
ListViewの行にカスタムレイアウトを使う場合、BaseAdapterを継承したカスタムAdapterを作成するかと思います。
Adpterクラスからアイテムを取得する場合、既存のコードだと以下のようになります。

```kotlin
val adapter = ...
val item = adapter.getItem(0)
```
　
このコードをシンプルするために演算子オーバロードを使ってBaseAdapterクラスを拡張します。

```kotlin
operator fun BaseAdapter.get(position: Int): Any = getItem(position)
```

アイテム取得のコードが以下のようにシンプルになります。

```kotlin
val adapter = ...
val item = adapter[0]
```

# おわりに
演算子オーバロードを使うことで、既存のコードをシンプルかつ読みやすくすることができるかと思います。
他に面白い使い方がありましたらご教授お願い致します！
Ubuntuにログインしても背景しか表示されなくなってしまった際の解決方法

# 2017/10 追記

先日、右クリックすらできなかった際、VirtualBoxだからダメと思い込んで
いたが、

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">VirtualboxのUbuntuにログインしても背景が表示されるだけで、なにもできない状態になり、singleユーザーモードで起動しても、直し方わからずでいたがctrl+alt+f1-7で仮想コンソールが使えることを発見してapt upgradeしてなんとか復旧した。</p>&mdash; kjunichi (@kjunichi) <a href="https://twitter.com/kjunichi/status/913396174500937735?ref_src=twsrc%5Etfw">2017年9月28日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 背景

VirtualBoxで動かしているUbuntu 16.04.1 LTSで、
ソフトウェアアップデートして再起動したら、なぜか、
ログインしても、メニューバーやアイコンが待てど暮らせど表示されない。

右クリックしたら、ターミナルが開けたので、あれこれ試して、

```shell-session
compiz --replace
```

とすると、デスクトップが復活。が、次回ログイン時は
また、何も表示されない状態。

以下の方法で、セッション情報をクリアできた模様。

```shell-session
rm -rf .config/compiz-1
```

# 関連記事

- [VirtualBox上のUbuntuでFaceTime HD カメラが使えた](//abrakatabura.hatenablog.com/entry/2013/11/08/104448)
- [Ubuntuで/usrを消してsudoができなくなったが、レスキューモードでリカバれたが、mozcが動かなくて再インストールした件](//abrakatabura.hatenablog.com/entry/2017/06/24/180256)
- [Xサーバーを入れずに、WSLでXクライアントを動かす](//abrakatabura.hatenablog.com/entry/2017/12/26/214414)
- [Ubuntu16.04LTSでapt install imagemagick-devしてもImageMagickがリンクされない件](//abrakatabura.hatenablog.com/entry/2018/03/02/071533)
mrubyでCPUの論理コア数を取得する俺以外が思いつかない方法

# 背景

俺以外が思いつかない方法なので、メモに残しますw

# mruby-juliaを使う

mruby-juliaを使い、PyCallを経由して、Pythonのmultiprocessingパッケージのcpu_countを使う。

```
Julia.eval("using PyCall;@pyimport multiprocessing as mp;string(mp.cpu_count())")
```

# 関連記事

- [mruby-juliaでPythonもmrubyから呼び出せるようになった](http://abrakatabura.hatenablog.com/entry/2016/07/02/183532)
【Swift】"??"を有効活用しよう - Nil Coalescing Operator -

[Bond](https://github.com/SwiftBond/Bond)のソースコードを眺めていたら??（ダブルクエッションマーク）が目に入り、頭も??になりました。BondオリジナルのSugar Sytaxかと思いきや、実はこれ**Swiftオリジナルのオペレーター**で、[Nil Coalescing Operator](
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html#//apple_ref/doc/uid/TP40014097-CH6-ID72)と呼ぶことがわかりました。

## 簡単な例
使い方はいたってシンプル。
Optionalに対して、```a != nil ? b! : c ```を評価し、aがnilでなければbを強制アンラップし、aがnilであればcを返します。


```swift
var maybeInts: [Int]? // nil
maybeInts != nil ? maybeInts! : [] // []
maybeInts ?? [] // []
```

もしintが入ったらこうなる。

```swift
maybeInts = [10,20,30]
maybeInts ?? [] // [10,20,30]
maybeInts != nil ? maybeInts! : [] // [10,20,30]
```

注意すべき点は型を揃える必要があるところです。

```swift
maybeInts = [10,20,30]
let wrong = maybeInts ?? [10.0] // error
let correct = maybeInts ?? [1,2,3] // ok
```

## 実際の使いどころ
一つの例としてオプショナル型配列と使うと、かなりすっきりします。

```swift:Before
if let maybeInts = maybeInts {
    for x in maybeInts  {
        let doubled = x * 2
        print(doubled)
    }
}
```

```swift:After
for x in maybeInts ?? [] {
    let doubled = x * 2
    print(doubled)
}
```

これなら早速、明日からでも使えますね。

## 参考
[The Swift Programming Language (Swift 2.2)](https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html#//apple_ref/doc/uid/TP40014097-CH6-ID60)
AmazonLinuxインスタンスにPython3をインストール

### 1.事前準備
```
sudo yum groupinstall "Development Tools"
yum install mlocate
yum install openssl-devel
yum install bzip2-devel
yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite3 sqlite-devel openssl-devel
yum install gcc gcc-c++

```

### 2. Amazon Linux Python3 インストール
[こちら](http://kazsoga.com/pyenv-aws/)を参考にpyenvをインストール


```
pyenv install 3.5.2
pyenv global 3.5.2
pyenv rehash

[ec2-user@ip-172-31-5-227 ~]$ python3 --version
Python 3.5.2
[ec2-user@ip-172-31-5-227 ~]$ pip3 --version
pip 8.1.1 from /home/ec2-user/.pyenv/versions/3.5.2/lib/python3.5/site-packages (python 3.5)
```

### 3. Mecab インストール
```
wget https://mecab.googlecode.com/files/mecab-0.996.tar.gz
tar xvzf mecab-0.996.tar.gz
cd mecab-0.996
./configure
make
make check
sudo make install
cd ../

wget https://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure -with-charset=utf-8 –enable-utf8-only
make
sudo make install
cd ../
```

### 4. mecab-ipadic-NEologd インストール
```
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
xz -dkv mecab-ipadic-neologd/seed/mecab-user-dict-seed.*.csv.xz
fname=`find mecab-ipadic-neologd/seed/ -name *.csv`
fullname=`pwd`/$fname
/usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u mecab-user-dict-seed.dic -f utf-8 -t utf-8 $fullname

vi /usr/local/etc/mecabrc
userdic = /home/ec2-user/mecab-user-dict-seed.dic
```

### 5. Python用のモジュールインストール
```
pip3 install --upgrade pip

pip3 install boto
pip3 install pysqlite
pip3 install bz2file
pip3 install Cython
pip3 install gensim
pip3 install inflect
pip3 install mecab-python3
pip3 install nltk
pip3 install numpy
pip3 install oauthlib
pip3 install pip
pip3 install prettyprint
pip3 install print
pip3 install requests
pip3 install requests-oauthlib
pip3 install scipy
pip3 install setuptools
pip3 install six
pip3 install smart-open
pip3 install tweepy
pip3 install wheel
pip3 install word2vec
```

### 6.おまじない+起動

```
export LD_LIBRARY_PATH=/usr/local/lib

[ec2-user@ip-172-31-10-197 ~]$ python3
Python 3.5.2 (default, Jul 25 2016, 05:54:24)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
```

### 7. メモ
ついでに[こちら](http://qiita.com/monry/items/fa3bebd69e04a08ae12f#2-1
)にしたがってS3バケットをマウントします。
※その際に、S3側では認証済みユーザーのアクセス許可設定をするのを忘れずに。

![スクリーンショット 2016-07-25 16.04.21.png](https://qiita-image-store.s3.amazonaws.com/0/89997/f0429794-283d-0be9-ef51-31691c3beb5c.png)
CentOS > Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0 Fatal error: Unknown: Failed opening required '/home/user/public_html/index.php' (include_path='.:/usr/share/php:/usr/share/pear') in Unknown on line 0  > SELinux

```txt:動作確認
CentOS 6.5 (64bit)
```

httpdをインストールして、php環境をセットアップ、ブラウザからlocalhost/index.phpを表示しようとしたら以下のエラーがブラウザに表示された。

> Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0 Fatal error: Unknown: Failed opening required '/home/user/public_html/index.php' (include_path='.:/usr/share/php:/usr/share/pear') in Unknown on line 0 

ファイルのパーミッション関連をいじったが変化なかった。

SELinux関連のようだ。

http://park1.wakwak.com/~ima/centos4_selinux0001.html
を参考に試しに以下を実行したらindex.phpが見えるようになった。

```
setenforce 0
```
Go言語以外のリポジトリを.goimportsignoreに追加する

# はじめに
[ghqを使ったローカルリポジトリの統一的・効率的な管理について](http://blog.kentarok.org/entry/2014/06/03/135300)や
[ghq: リモートリポジトリのローカルクローンをシンプルに管理する](http://motemen.hatenablog.com/entry/2014/06/01/introducing-ghq)で紹介されているように，
`$GOPATH/src`以下に言語に関わらずすべてのソースコードを集めると，
リポジトリ管理が楽になる反面`$GOPATH/src`がどんどん大きくなっていく．

[goimportsのスキャン対象から特定ディレクトリを除外する](http://qiita.com/ono_matope/items/4b4954cde1c2529f9806)によると，
`.goimportsignore` に記載されたパスは `goimports` の対象から外れるそうなので，
Go言語以外のリポジトリを追加することにした．

# gii
[gii](https://jkawamoto.github.io/gii/) は `$GOPATH/src` 以下にある git リポジトリのうち，
`.go` ファイルを含まないものを `$GOPATH/src/.goimportsignore` に追加するツール．

インストールは，

```shell-session
go get github.com/jkawamoto/gii
```

か，[Homebrew](http://brew.sh/) を使っている場合は，

```shell-session
brew tap jkawamoto/gii
brew install gii
```

または，[ここ](https://github.com/jkawamoto/gii/releases)からバイナリを取得する．

実行は，単に `gii` を呼ぶだけ．`--gopath` オプションで `$GOPATH` 以外をルートにできる．
ヘルプテキストは次の通り．

~~~
gii [global options]

GLOBAL OPTIONS:
   --gopath GOPATH  GOPATH [$GOPATH]
   --help, -h       show help
   --version, -v    print the version
~~~

すでに，`.goimportsignore` が存在している場合は，重複しないエントリのみ追記する．
削除には対応していないので，手動で行う必要がある．

# おわりに
`$GOPATH/src` にあって，Go言語以外のリポジトリはそこそこあるが，
大多数は `go get` で適当に取ってきたライブラリなので，あまり goimports 速度は改善はしないかも知れない．
また，似たツールはすでにたくさんありそう・・・．

(2016年7月24日追記)
[pwaller/goimports-update-ignore](https://github.com/pwaller/goimports-update-ignore)というツールがありました :P
Dokku に Re:dash をインストールする

Re:dash は Heroku へのインストールにも対応しているので、Dokku へのインストールも比較的簡単です。
とはいえ微妙に面倒なポイントもあるのでメモ。

基本的には Re:dash ドキュメントの Heroku へのインストール手順にならいます。

* [Setting up Re:dash instance](http://docs.redash.io/en/latest/setup.html#heroku)

## Dokku 側の準備

Dokku 自体のインストールについては割愛します。

Re:dash では PostgreSQL と Redis が必要なので、それぞれの dokku plugin を用意する必要があります。

* [dokku-postgres](https://github.com/dokku/dokku-postgres)
* [dokku-redis](https://github.com/dokku/dokku-redis)

プラグインのインストールには root 権限が必要なので、Dokku のホストマシン上で以下を実行。

```
$ sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git postgres
$ sudo dokku plugin:install https://github.com/dokku/dokku-redis.git redis
```

## Re:dash 側の準備

まずは Re:dash をチェックアウトします。

```
$ git clone https://github.com/getredash/redash
$ cd redash
```

Re:dash には `Dockerfile` が用意されているため、そのまま dokku に push すると Docker でのデプロイが行われるのですが、うまく動かなかったのでとりあえず Buildpack でデプロイします。
Dokku は Heroku の Buildpack に対応しています。

* [Buildpack Deployment](http://dokku.viewdocs.io/dokku~v0.6.5/deployment/methods/buildpacks/)

Heroku 同様、環境変数 `BUILDPACK_URL` での指定もできますが、Re:dash では Python と Node.js の Buildpack が必要なので、Re:dash リポジトリのルートに `.buildpacks` というファイルを用意し、以下のように記述してコミットします。

```
https://github.com/heroku/heroku-buildpack-python#v81
https://github.com/heroku/heroku-buildpack-nodejs#v91
```

一応この記事の執筆時点での最新のリリースを指定しています。

## デプロイ

次にアプリのコンテナを用意していきます。
以降はユーザ権限で問題ないので、Dokku ホスト外から [dokku_client.sh](http://dokku.viewdocs.io/dokku/community/clients/#bash-zsh-etc-dokku_clientsh) 等を使って行うこともできると思います。

まずは空のコンテナを作ります。
これを Re:dash のリポジトリ内で実行すると `dokku` という git remote として登録されます。

```
$ dokku apps:create redash
```

次にストレージの用意。
それぞれアプリにリンクすることで接続に必要な環境変数が自動的にアプリにセットされます。

```
$ dokku postgres:create redash
$ dokku postgres:link redash redash
$ dokku redash:create redash
$ dokku redash:link redash redash
```

次にクッキーの暗号化に使用するキーをセット。
Re:dash のドキュメントに従って `pwgen` を使います。
(Mac なら `brew install pwgen` でインストール可能)

```
$ dokku config:set REDASH_COOKIE_SECRET=`pwgen 32 -1`
```

そして push します。

```
$ git push dokku master
```

これはしばらく時間がかかります。
完了したら `dokku run` から必要なコマンドを実行し、データベースと管理者を作成していきます。

```
$ dokku run ./manage.py database create_tables
$ heroku run ./manage.py users create --admin "Admin" admin
```

アカウント作成時にはパスワードを聞かれるのでそれも入力します。

そしてワーカーを起動。

```
$ dokku ps:scale worker=1
```

これで Re:dash の起動は完了です。
あとは URL にアクセス・管理者としてログイン・Datasource の登録を行えば使えます。
おすすめ新着Appで自社アプリを紹介してもらう方法（裏ワザ？？）

# 概要
『スマートフォンアプリマーケティング　現場の教科書』を読んでいて
非常に熱い情報がありましたので、共有します。

App Storeの「おすすめ新着App」にて、自社 or自作アプリを紹介してもらえる方法があるらしい。
（AppStoreの公式アカウントの「#FreeAppoftheWeek」と関連があるか不明です。）

# どうする？
Appleに対してメールでアピールする。

宛先は、下記のとおりです。
すべてのアプリ : appsotrepromotion@apple.com
無料アプリ : appoftheweek@apple.com

## 補足
・やりとりは英語で！
・おすすめのポイントを熱く語る
・iOSの新機能を使っていることをアピールする
コンソールを用いたワンライナー TIPS(IE11)

#コンソールとは
ブラウザの機能のうち、デバッグ回りでよく使われる機能で、F12キーで起動できる機能のことですね。
Chromeも大分前から（機能名横には Ctrl+Shift+I って書いてあるけれど）使える機能です。
##今回やりたいこと
コーディング中に動作を確認したり、クライアントサイドでのデータを表示したりしたい場合に「ワンライナー」でどうするかといった様な話。
最近（Edge以降）の機能は使わないので、多分、最近のIE11環境なら動くとは思います。
##ワンライナーに使える函数一覧
###$$(selector)
何故こっちの函数を上げるかというと、Firefoxだと $(selector)がdocument.querySelector(selector)の短縮なのに対して、IEだとdocument.getElementById(id)の短縮なのでブラウザの互換が無い為です。
###Array.prototype.forEach(function)
配列の場合に使える内部イテレータ函数です。一応IE9の標準モードがES5対応してるので使える便利函数です。NodeListの時は以下の様に、callを用いて使います。

```js:forEachTest.js
[].forEach.call($$(selector),function(element){ console.dir(element);});
```
###Array.prototype.map(function)
配列を詰め直しするときに使います。使い方はreturnに詰め直したい値を入れるだけです。

```js:mapTest.js
["id1","id2","id3"].map(function(id){ return document.getElementById(id); });
```
###Array.prototype.filter(function)
配列を絞り込みするときに使います。

```js:filterTest.js
[].filter.call($$(selector),function(element){ return element.textContent.indexOf("hoge") != -1; });
```
###Array.prototype.reduce(function,initValue)
配列を纏めるときに使います。
reduceTest.js の様にelement を指定の属性リストを元にオブジェクト化するときによく使います。

```js:reduceTest.js
[].map.call($$(selector),function(element){ return ["attrName1","attrName2"].reduce(function(obj,name){ return obj[name] = element.getAttribute(name),obj; },{}); });
```

思いついたらまた書き足す。
Spineランタイム：アニメーションの連続再生


Spineでランタイムのアニメーション再生命令は高機能ですが複雑です。ピンポイントの機能ごとにこまめにメモ投稿してみようと思います。(デモはなし。)
なお、ランタイムはSpine3.4およびStarling2対応のSpine-Staringを使っています。他の言語のランタイムでも基本は同じかと思います。

#アニメーションの連続再生

`setAnimation`という命令と別に、`addAnimation`という命令があります。(`addAnimationByName`に対する`setAnimationByName`もあります。)

これは現在のアニメーションのが再生が終わったらすぐさま次のアニメーションを再生する場合に使うものです。

```sample.as
var trackIndex:int = 0; // トラック番号
var delay:Number = 0; // 連続再生の間の秒数
var loop1:Boolean = false; // ループ指定
var loop2:Boolean = false; // ループ指定
animState.setAnimationByName(trackIndex, "アニメ1", loop1);
animState.addAnimationByName(trackIndex, "アニメ2", loop2, delay);
```

こんな感じで２つのアニメーションを連続再生できます。

２つのアニメーションの再生の合間に、待ち時間が指定できます。上記ソースのdelay指定がそれです。

#連続再生のキャンセル
clearTrack命令を使います。

```sample.as
animState.clearTrack(trackIndex);
```

連続再生の２番目だけキャンセルする、というような事も頑張ってゴニョゴニョすればできそうですが、animStateに対して１命令で実行する方法はありません。


#ループアニメーションの取り扱い
後続のアニメーションの前のアニメーションがループ指定だった場合、どうなるでしょう？やってみたところ、ループの１回分再生が終わったところで、次のアニメーションが再生されました。一見、意味がなさそうですが、ループ再生をしている最中に動的に次のアニメーションを追加した場合などにスムーズにアニメーションをつなげる事ができそうです。

#アニメーション終了のコールバックについて
こちら別途まとめますが、アニメーション終了のコールバックで次のアニメーションを再生する事もできます。ですが、コールバック内で次のアニメーション再生を行うと挙動がおかしくなるようで、こちらの方法を使う場合は、1フレーム待ってから次の再生指示を出す対応で不具合を回避できました。アニメーションに微妙な間も空いてしまいそうなので、通常は`addAnimation`を使って連続再生を行った方が良さそうです。

以上です。
[Swift版]クリーンアーキテクチャ実践編①（Domain層）

# はじめに
最近巷で、熱い『クリーンアーキテクチャ』を社内案件でも導入しています。
まだまだ不完全な部分も多いので、今一度整理してみました。

今回はDomain層を中心に纏めてみました。

## やること

* UI層
 - View
 - ViewController
 - Presenter
 
* Domain層
 - Usecase *← ここ説明します*
 - Repository *← ここ説明します*
 - Entity *← ここ説明します*
 
* Data層
 - Repository *← ここ説明します*
 - Entity
 - DataStore

## やらないこと
・クリーンアーキテクチャーの概念について
・UI層について
・Data層について(Repositoryを除く)


# ご説明する例
Usecaseからユーザ情報にアクセスする際の事例


|レイヤ | カテゴリ | クラス名 | 説明 |
|---|---|---|---|
| Domain層 | Entity | User | ユーザ情報を管理するクラス（メールアドレス、誕生日） |
|  | Repository | UserRepository | ユーザ情報とのインターフェース |
|  | Usecase | UserUsecase | 業務ロジッククラス |
| Data層 | Repository | UserRepositoryImpl | ユーザ情報へアクセスする実体のクラス |

## 1. Domain層のEntityについて
ユーザ情報として、メールアドレスと誕生日を保持するクラス

```:User.swift
import Foundation

class User: NSObject {
    var mailAddress = ""
    var birthDay  = ""
}
```

## 2. Domain層のRepositoryについて
ユーザ情報へアクセスする手段を纏めたインターフェース(プロトコル）
DAOに近いイメージ？？？
利用する側は、どこに保存されているかは意識しない。

```:UserRepository.swift
import Foundation

protocol UserRepository: class {
    func store(user: User)
    func user(userID: NSInteger) -> User
    func users() -> [User]
    func delete(userID: NSInteger)
}
```

## 3. Data層のRepositoryについて
UserRepositoryプロトコルを実装したクラス

ユーザ情報の保存先は、仕様に合わせて、アプリ内でも、サーバーサイドでも良い。

```:UserRepositoryImpl.swift
class UserRepositoryImpl: UserRepository {
    
    func store(user: User) {
        //TODO: ユーザ情報をどこかに保存する
    }
    
    func user(userID: NSInteger) -> User {

        //TODO: ユーザ情報をどこかから取得する
        return User()
    }
 
    func users() -> [User] {
        
        //TODO: ユーザ情報をどこかから取得する
         return []
    }
    
    func delete(userID: NSInteger) {
        //TODO: どこかに保存しているユーザ情報を削除する
    }
}
```

## 4. Domain層のUsecaseについて

```:UserUsecase.swift
import Foundation

class UserUsecase: NSObject {
    
    let repository: UserRepository

    init(repository: UserRepository) {
        self.repository = repository
        super.init()
    }
    
    //メールアドレスを保存する
    func storeMailAddressByID(userID: NSInteger, mailAddress: String) {
        
        let user = repository.user(userID)
        user.mailAddress = mailAddress
        repository.store(user)
    }
    
    //メールアドレスを取得する
    func findMailAddressByID(userID: NSInteger) -> String {
        return repository.user(userID).mailAddress
    }
    
    //誕生日を保存する
    func storeBirthDayByID(userID: NSInteger, birthDaty: String) {
        
        let user = repository.user(userID)
        user.birthDay = birthDaty
        repository.store(user)
    }
    
    //誕生日を取得する
    func findBirthDayByID(userID: NSInteger) -> String {
        return repository.user(userID).birthDay
    }
}
```

# まとめ
ポイントは、Domain層のRepositoryだと思います。

1. データにアクセスするためには、Domain層のRepositoryを通してアクセスする。

2. データにアクセスするクライアントは、保存先がサーバー(API経由）なのかアプリ内(CoreData、UserDefaultsなど）か意識しない。

*誤りやもっとこうしたほうが良いとというアドバイスがございましたら、ご指摘頂けますと幸いです。*

こちらも合わせて読んで頂ければ幸いです。
[[Swift版]クリーンアーキテクチャ実践編②（Data層）](http://qiita.com/eKushida/items/06290478514f66f6866e)

# 謝辞
@KentaKudoさん、ご指摘ありがとうございます。
依存性の注入(Dependency Injection)の観点で、
柔軟性がない、テストしにくいため、
UserUsecaseを修正しました。
Spineランタイム：アニメーションの単独再生

Spineでランタイムのアニメーション再生命令は高機能ですが複雑です。ピンポイントの機能ごとにこまめにメモ投稿してみようと思います。(デモはなし。)
なお、ランタイムはSpine3.4およびStarling2対応のSpine-Staringを使っています。他の言語のランタイムでも基本は同じかと思います。

#アニメーションの設定
AnimationStateにsetAnimationまたはsetAnimationByNameを行います。

```sample.as
var animState:AnimationState = skeletonAnimation.state;
var trackIndex:int = 0; // トラック番号
var animName:String = "animaton"; // ツールで設定したアニメーション名
var loop:Boolean = false; // ループ再生するか
animState.setAnimationByName(trackIndex, animName, loop);
```

アニメーションがループか否かはツール上で設定されてこないので、プログラム側で明示的に指定します。実際の現場ではアニメーション名にレギュレーションをつけて"anim1_loop"のように名前にloopが含まれる場合ループ再生をするなどとすると、デザイナと協業しやすそうです。

trackIndex番号については、別途投稿します。

#アニメーションの再生

これだけだとアニメーションの時間が進まないので、SkeletonAnimationをジャグラー登録するか、自分でadvancedTimeを呼んでやる必要があります。SkeletonAnimation＝画面上のキャラクターの事です。

```sample.as
// skeletonAnimationはDisplayObjectです。
addChild(skeletonAnimation);

// Starlingのjugglerを使う(一番簡単)
Starling.juggler.add(skeletonAnimation);

// もしくはStarlingのEnterFrameEventを使っても良い
function onEnterFrame1(ev:EnterFrameEvent):void{
    skeletonAnimation.advanceTime(ev.passedTime);
}
Starling.current.stage.addEventListener(
    EnterFrameEvent.ENTER_FRAME, onEnterFrame1
);

// もしくはflashに元からあるEnterFrameEventを使っても良い
function onEnterFrame2(ev:Event):void{
    // 経過時間の計算が面倒かも
    skeletonAnimation.advanceTime(
        1 / Starling.current.nativeStage.frameRate
    );
}
Starling.current.nativeStage.addEventListener(
    Event.ENTER_FRAME, onEnterFrame2
);
```

お気軽に使うにはjugglerを、自分でskeletonAnimation毎の再生時間を管理したい場合はその他を使えばいいと思います。

なお、アニメーションの再生スピードはSkeletonAnimation個別で調整できます。

```sample.as
// ２倍速再生
skeletonAnimation.timeScale = 2.0;
```

#アニメーションの停止
pause命令はないので、jugglerからskeletonAnimationをremoveするか、EnterFrameEventによるadvanceTime呼び出しをやめます。

```sample.as
Starling.juggler.remove(skeletonAnimation);
// もしくは
Starling.current.stage.removeEventListener(
    EnterFrameEvent.ENTER_FRAME, onEnterFrame1
);
// もしくは
Starling.current.stage.removeEventListener(
    EnterFrameEvent.ENTER_FRAME, onEnterFrame2
);
// もしくは
Starling.current.nativeStage.addEventListener(
    Event.ENTER_FRAME, onEnterFrame2
);
```

完全に停止するには、clearTrack命令を使います。

```sample.as
skeletonAnimation.clearTrack(trackIndex);
```

以上です。
さくらサーバー同士で ドメイン移管、引っ越しを行う為のガイド

# さくらサーバー同士で、ドメイン移管、引っ越しを行う為のガイド

さくらサーバーのレンタルサーバーや、マネジメントサーバー同士でドメイン移動などを行う為の方法です。

## INDEX
- 1 ドメイン移行前の確認
- 1-1 ファイルの移動
- 1-2 wordpressの設定とデータベース移動

- 2 ドメインの移動
- 3 その他の、細かな設定項目
- 4 結果、所感

-------------------

## 1 ドメイン移行前の確認作業について

移行先のサーバーにソースファイルやDBを移して、さくらサーバー契約時に設定されているドメインからアクセスし、正常に動作するか確認する必要があります。 

- php.cgiの設置
- データベース移行
- wp-configの修正

 ※ 注意 .htaccessが反映されてる場合、本番では問題なくても表示されなくなる場合がある。
 同じwordpressでもhtaccessがあるとアウト。

1-1 , 1-2 の作業後に正常にページが機能するか確認しましょう。


## 1-1 ファイルの移動

### 前提条件

- win teratermで接続する。
基本はftpの設定で接続が可能

### 移動

[参照](http://matomater.com/2799/)

scpというコマンドで移動する。 注意点として
移動先にteratermで




## 1-2 wordpressの設定とデータベース移動

### データベースの移動

#### sqlのエクスポート

あらかじめsqlをエクスポートしておく。phpmyadminとかでsqlでデフォルトのまま出力

teratermのscpで転送


#### sqlのインポート

インポート方法２つ、今回は私はpettern2でインポートしました。

##### pettern 1
[参照](http://yksris.hatenablog.com/entry/2012/10/12/024504)

```
コマンド
mysql --host=mysql[自分のデータベースサーバーの番号].db.sakura.ne.jp --user=[ユーザー名] --password=[パスワード]

実際には
mysql --host=***sakuraid**.sakura.ne.jp --user= ***** --password= *****

```


##### pettern 2
[参照](http://ysklog.net/server/2426.html)

```
コマンド
mysql -u ○○○ -p□□□ -h mysql△△△.db.sakura.ne.jp ○○○_○○○ < ○○○.sql

実際には
mysql -u **DBusername** -p**パスワード** -h **sakuraid**.sakura.ne.jp **DBuser** < **sqlname**.sql

※ パスワードは-pにくっつける事。例えば aaaa134というパスワードなら
-p aaaaa134ではなく
-paaaa134

````




### wordpressの設定

wp-configを設定する。

```
今回は

DB_NAME:
DB:USER:
PASS:
DB_HOST:**sakuraid**.sakura.ne.jp

【注意！】　接頭辞も確認する事！
```



## 2ドメイン移管について

### ドメイン移管の手順

	今回はドメイン

- 1 移管元のドメインを削除して２時間待つ
- 2 移管先のドメインを設定する。

	サピートからのお話しでは、待ち時間の目安として7時間～48時間程度
	２日間切れるのはつらい・・・・

	実際に４つほど移管したのですが、反映時間はまちまちでした。
	最短で２分、最長で３時間程度でした。（環境、状況により異なると思います）


## 3 その他の、細かな設定項目

- html拡張子でphpを実行する方法
http://labo.niwatako.net/32.html


- Mailの設定
	
	メールアドレスを複数割り振ってる場合とかつらいですよね。


## 4 結果、所感について

無事にドメイン移管が終わり、思ったよりもあっけなく終了しました。ドメイン移管前に正常にサイトが作動さえしてれば
移行作業自体は時間がかかるだけで、手数はそんなに多くはありません。

時間もコアタイムをさけて、夜中に作業してたのでさほど焦る事もありませんでした。

また、今回はwindowsからの移管ですが、macなどもssh接続など出来れば基本は同じだと思います。

	せっかく稼いだseo効果や、現状でのサービスの停止をせずに移管させるためにも慎重に作業は行っていければ良いと思います。
CentOS / httpd > Starting httpd: httpd: apr_sockaddr_info_get() failed for [hostname].localdomain

```txt:動作環境
CentOS 6.8 (64bit)
```

httpdを起動した時に以下のメッセージが表示された。

```
# /etc/rc.d/init.d/httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd: apr_sockaddr_info_get() failed for [hostname].localdomain
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
```

対応としては以下に記載されている。
http://d.hatena.ne.jp/uriyuri/20100511/1273575287

1. /etc/sysconfig/networkの中身を確認する

```
$ cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=myVM.localdomain
```

`2. /etc/hostsに追記

```
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 myVM.localdomain
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
```

`3. /etc/httpd/conf/httpd.confにも追記

```
#ServerName www.example.com:80
ServerName vmVM.localdomain:80
```

以上をしてからhttpdを再起動するとメッセージはでなくなった。
CentOS 6.8 > httpd.conf > /webpathの例はない

```txt:動作環境
CentOS 6.8 (64bit)
httpd.x86_64 0:2.2.15-54.el6.centos
```

yumでインストールしたhttpdに関連してhttpd.confを編集していた。

```
# Alias /webpath /full/filesystem/path
```
という部分を変更する必要があったが、上記の文章は使用しているhttpd.confには見当たらなかった。

以下にはwebpathの設定例がある。
http://www.adminweb.jp/apache/docroot/index3.html

apacheのバージョン違いなどでhttpd.confが違うのかもしれない。

とりあえずhttpd.confのScriptAlias関連の設定の前に該当文書を「追加」するとhttpのページが見えるようにはなった。
Crazyflie2.0をUbuntuから操作する [Crazyflie開発その１]

## Crazyflieとは
SWEのbitcraze.io社が発売する小型の__ドローン__。機能は必要最低限だが、ソフトウェアがオープンソースで提供されており完成度が高い。操作用のスマホアプリ有り。ROS用のドライバーなども提供されている。

※動画は改造してカメラをつけたもの
[![ビデオが開けなかった場合に表示されるテキスト](http://img.youtube.com/vi/0wzpcRnsgD8/0.jpg)](https://www.youtube.com/watch?v=0wzpcRnsgD8)

## 目的
UbuntuからCrazyflieに接続して、センサデータの取得及び操作を行う。Githubの方を見ていくとわかるけど、Wikiの方には記載が見つからなかった。

## 筆者の環境及びデバイス
* Ubuntu 14.04 64bit
* [Crazyflie 2.0](https://www.bitcraze.io/crazyflie-2/) ($180)
* [Crazyradio PA](https://www.bitcraze.io/crazyradio-pa/) ($30。Crazyradio自体は生産終了らしい)

## 使い方
### Crazyradioの接続
* CrazyradioをPCのUSBポートに接続
* 接続確認

```
$ lsusb | grep Nordic
```


* udevルールの設定
/etc/udev/rules.d/99-crazyradio.rulesを以下のように作成

```
SUBSYSTEM=="usb", ATTRS{idVendor}=="1915", ATTRS{idProduct}=="7777", MODE="0664", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idvendor}=="1915", ATTRS{idProduct}=="0101", MODE="0664", GROUP="plugdev"
```
    
* USB設定

```
sudo groupadd plugdev
sudo usermod -a -G plugdev <username>
```
### Python Clientの導入  
Githubの説明通り以下の作業を行う

* crazyflie-lib-pythonのインストール
    
```
$ sudo apt-get install python3 python3-pip python3-pyqt4 python3-zmq  
$ sudo pip3 install pyusb==1.0.0b2    (Ubuntu14.04の場合) 
$ sudo pip3 install pyqtgraph appdirs
$ git clone https://github.com/bitcraze/crazyflie-lib-python.git
$ cd crazyflie-lib-python
$ sudo pip3 install -e .
```

* crazyflie-clients-pythonのインストール


```
$ git clone https://github.com/bitcraze/crazyflie-clients-python.git
$ sudo pip3 install -e .
```

* 実行

```
$ cfclient
```
Crazyflieの電源を入れて、クライアントGUIの[Connect]ボタンを押せば完了！
![crazy_client.png](https://qiita-image-store.s3.amazonaws.com/0/126628/3591c2e5-17a2-8d76-b7b7-51e9c2f61ccf.png)
Vagrant boxの日本語化（CentOS7）

## 概要

[Vagrant boxの日本語化](http://qiita.com/sabakan7/items/acf935c24073046de4d6 "Vagrant boxの日本語化") にCentOS 6でのvagrant box日本語化手順があるが、CentOS 7ではロケールやタイムゾーンの設定方法が異なるため、以下に記載する。

## 前提

- 実行環境
    - OS X El Capitan
    - Vagrant-1.8.1
    - VirtualBox-5.0.20
- ベースとなるboxはAtlasのCentOS/7を使用

## 手順

### vagrant box 追加・起動・ログイン

```bash
$ mkdir centos7_jp && cd centos7_jp
$ vagrant init centos/7
$ vagrant up
$ vagrant ssh
```

### 日本語化

```bash
$ sudo localectl set-locale LANG=ja_JP.UTF-8
$ sudo timedatectl set-timezone Asia/Tokyo
$ sudo yum install man-pages-ja -y
```

### 不要なファイルを削除して最適化

```bash
$ sudo rm -fr /var/log/*
$ sudo rm -fr /tmp/*
$ sudo yum clean all
$ sudo dd if=/dev/zero of=zero bs=4k
$ sudo rm zero
$ history -c
$ sudo shutdown -h now
```

### 再パッケージ

```bash
$ vagrant package
$ vagrant box add centos7_jp package.box
```
予算の少ないMySQLのバックアップ案件をWordPressのプラグインを使ったらすごく良かった！

# はじめに
「データベースの自動バックアップって出来ませんか？」
とのお話しがありました。
コードを見てみると独自フレームワークのようです。
工数を減らすためにWordPressのプラグインでバックアップを取るように設定してみました。

実際にやってみたところ、ウェブで「バックアップする時間」「範囲」「メール送信先」などを簡単に設定できて良い感じでした。

構築に掛かる時間は慣れたら一時間ぐらいかなと思っています。

# バックアップスクリプト
データベースのバックアップといえば
「スクリプトを書いて(拾ってきて)Cronで回して…」
と考えていました。
バックアップファイルはサーバに書き出してFTPで落としてもらって、といったものです。
毎日のダウンロードが大変だからメール送信で、とも考えましたが、動作確認とか大変ですし、エラー時にログを飛ばしてもらえるかといった問題もあります。
またバックアップは放っておくと容量が大きくなりすぎるため、世代管理も重要です。
またしばらく経った後にルールを変更したい、といった際に担当者さんでできるかといった事もありました。

# BackWPUp
WordPressのバックアップツールにある「BackWPUp」が非常に便利です。
データベースやファイルのバックアップを完全に取ることができます。

* テーブルごとのバックアップ
* 世代管理
* ログのメール送信
* スケジュール管理
* バックアップ先(メール、フォルダ、DropBoxなど)を選べる

これらをウェブから設定する事ができます。便利ですね。

# メリットデメリット

WordPress + BackWPUpをバックアップツールとして使う際のメリットとデメリットについてです。

メリット

* バックアップタスクの管理が容易(ウェブでできる)
* バックアップに必要なこと(メール送信やバックアップ手段の選択)が一通り揃っている

デメリットとしては

* WordPress自体がアタックを受けて改ざんなどをされる可能性がある
* WordPress用のテーブルが増えて管理が煩雑化する
* バックアップ用のログイン情報などの管理が増える
* Cronでウェブアクセスをしなければならない

といったことが挙げられます。
特にWordPressを使うことで、ボットからのランダムアタックを受ける可能性は高く、セキュリティリスクは確実に増えます。
最も基本的なセキュリティ対策はWordPress本体のアップデートですが、低コストで運用したいという場面であればWordPressのアップデートが行われない可能性も高いです。
本体、プラグインの自動バックアップをオンにしておき、自動でのアップデートはされるようにしておきます。

Cronについて、WordPressは外部からのウェブアクセスによってスケジュールを発動させています。バックアップ用途のサイトですとアクセスが来ませんので、内部的にアクセスする必要があります。

# 実際の設定
## WordPressとプラグインのインストール
WordPressとBackWPUpをインストールします。
このときにバックアップを取りたいデータベースにWordPressをインストールします。
この際に初期ウィザード、または設定で「Googleなどにインデックスされないようにする」をオンにしておきます。

## Basic認証の導入
Basic認証を入れました。

> .htaccess による認証用　パスワード暗号化ツール
>http://www.luft.co.jp/cgi/htpasswd.php

```conf:.htaccess
AuthUserFile /path/to/.htpasswd
AuthName "Enter your ID and password."
AuthType Basic
require valid-user
```

経験則なお話しですが、Basic認証を入れるだけアタックなどの耐性がかなり上がると思っています。
どんな公開サーバでもBotによる無差別攻撃が多く、既知の脆弱性攻撃、ブルートフォースアタックなどを仕掛けてきます。
Basic認証を入れることでそれらをほぼ防ぐことができると考えています。
場合によっては、Basic認証と併せてIPアドレスベースで制限を掛けることで十二分なセキュリティを確保できると考えています。

## 「BackWPUp」の設定
お好みの設定を施します。
最も重要な「バックアップするテーブル」の設定を漏らさないようにします。

<img width="720" alt="Screen_Shot_2016-07-24_at_1_28_35_PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/9f198fd0-6f79-e330-aab4-45fbb83aebb2.png">


## Cronを設定
WordPressのCronは、外部からのアクセスを元に発動しています。(たぶん)
外部からのアクセスは保障されないので、WordPressのCron、バックアップのスケジュールイベントが発動しません。
今回は稼働しているサーバにて自分自身にアクセスするようにして発動させました。
`crontab -e`でトップページにアクセスが行くように設定します。
(レンタルサーバによっては設定が変わると思います)

今回はさくらインターネットの「さくらのレンタル」でした。
「さくらのレンタル」のOSはFreeBSDです。OSによってwgetのパスやcurlを使うべきか、標準エラー出力あたりが変わったりします。

```
*/5 * * * * /usr/local/bin/wget --user=basicuser --password=basicpasswd http://example.com/backup_wp/wp-cron.php > /dev/null 2>&1
```

`--user`と`--password`でBasic認証のオプションを付けています。

# 確認
最後にちゃんとバックアップされているかの確認を行って終わりです。
ちゃんとSQLが出来ているか、手元でリストアできるか確認しました。

# まとめ
古くからバックアップのスクリプトがありますが、メンテナンス性の高さからいくとこういったやりかたも有りかなと思いました。
お手軽ですし、あとから色々と変える事が出来ます。
WordPressの知名度も高いので担当者さんに経験があればスムーズかなと思いました。

# 参考サイト
MySQLのバックアップ関連で最低限やるべき項目
http://qiita.com/yu_0105/items/528d627c35412c92c2ef

mysql の定期的なバックアップ
http://qiita.com/crimson_21/items/6171a95f8ddb2861e2e6

MySQLのバックアップを自動化
http://qiita.com/abgata20000/items/d5f8c13a4af1bcb1e394

BackWPup - WordPressを丸ごとバックアップできるプラグイン
http://netaone.com/wp/backwpup/
シェルで空ファイル作成時にパーミッションを指定する方法


シェルで空のファイルを新規作成するときにパーミッションを指定する方法。
作成した後で chmod してもよいが、ここでは初期パーミッションを設定する方法を記述する。

## サンプル

```Bash:permission_sample.sh
#!/bin/sh

PERMISSION=644
# ↑ファイルの初期パーミッションを指定
# 以下はそのまま流用する。

MAX=666    
# ファイル作成時の初期パーミッション最大値
# 4:read + 2:write = 6 まで
# 1:execute 実行権限が必要な場合は作成後に chmod で指定する

MASK_VALUE=$(printf %03d $(expr $MAX - $PERMISSION))
umask $MASK_VALUE 
touch newfile
```

## 確認

空のファイルが 644 のパーミッションで作成されていることが確認できる。

```UNIX
ls -l newfile

-rw-r--r--  1 user  group  0  7 24 13:15 newfile

```
jdbc.propertiesを絶対パスで配置設定

Spring+DB接続方法の調査時、DB接続設定をjdbc.propertiesに別で定義する方法は書いてあるがどこもsrc/main/resources配下にjdbc.propertiesを置く設定になっている。
だけど、今回のプロジェクトでは最終的に/opt/xxx/jdbc.propertiesとどこかに置いてそのファイルをユーザさんなどに設定してもらう必要がある。

warファイルの中にjdbc.propertiesがあってもダメなのでどうやるのか調査したら、すんなり判明。

``` servlet-context.xml
<!-- <context:property-placeholder location="classpath:jdbc.properties"/> -->
<context:property-placeholder location="file:/opt/xxx/jdbc.properties" />
```

location設定で"classpath:xxx"ではなく"file:xxx"と設定すればいいらしい。

これで解決と思ったけど、これだとちょっとした動作確認で毎回サーバ上のTomcatにデプロイしなくてはいけなそう。。
開発はWindows上で行うし、ちょっとした動作確認もEclipseと連携したTomcatでやるのでWindowsとLinuxとで設定を切り替えたいな～とか思って試してたら別に上記のままでOKでした。

WindowsのC:\にopt\xxx ディレクトリを作ってそこにjdbc.propertiesを置けば普通に動いた。
jdbc.propertiesをCドライブ以外に置きたいとかあったらわからないけど、現状そんなことはないのでこの方法で進める予定
JTF2016セミナー備忘録１「基調講演」「wantedlyインフラ」

## 基調講演
さくらインターネット小笠原氏

## Wantedly の文化を支えるインフラとビジネスの変化に強いインフラ

2014/8/9 Heroku→AWS
Docker in Production

### 方針
Code Wins Argumentsを可能
**変化に強いインフラ = 変化を前提としたインフラ**
→自動化+ツール
developerがtool/APIを通してデプロイができる環境となる

### 何をしたか
・capistrano
Rails製アプリケーション自動デプロイ
→Herokuと同等な振る舞いへカスタマイズ（cupコマンド）
http://qiita.com/Salinger/items/4ee4f3c5ebd5227196c0

・Docker / Chef / Packer
Packer
マシン・イメージの自動生成・管理
https://thinkit.co.jp/story/2015/04/13/5875
Chef
インフラ構築
→アプリケーションの構築が自動化
but chef/packerのメンテはインフラチームになる
　→Dockerでの利用になった。

・二段階ビルド/blue-green deployment
二段階ビルド
→ビルドサーバで再ビルド・Dockerレジストリへ・本番Dockerへ・ヘルスチェック・デプロイ終了

・terraform
Pull Request→merge request accepted → deploy
の流れを自動化

・CoreOS
これまではubuntuを使用していた。
→Docker自体のversion upが大変

CoreOSはコンテナベース、すでにamiが用意されている
http://qiita.com/mopemope/items/fa9424b094aae3eac580

・sap / Deploy Server
デプロイ方法の見直し

・cell
AWS TAG
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Using_Tags.html

AutoScalingGroup(ASG)
https://docs.aws.amazon.com/ja_jp/AutoScaling/latest/DeveloperGuide/GettingStartedTutorial.html
自動拡張・縮小

・Monolithic Architecture
コードの肥大化・ミドルウェア／ライブラリの依存関係
問題：作業量の増大
→クラスタリング
Applicationを動かせるインフラをすぐに作ってくれと言われた時に作れる
◯kubernotes
Google製のオープンソース：Dockerコンテナ管理
http://www.publickey1.jp/blog/14/dockerkubernetes_kubernetes20_paas_1.html

・Kong Architecture
https://getkong.org/
Windows10でvagrant使ってwebアプリ基盤を構築しようとしてWordPressのセットアップでつまづいています。

#あらすじ
※Qiitaのコンセプト的にはこの見出し部分は飛ばしていいと思います。

なんとなくやった性格診断。
https://www.16personalities.com/ja/istp%E5%9E%8B%E3%81%AE%E6%80%A7%E6%A0%BC
巨匠らしい。
>しかし、こうした劇的な方向転換をする際、ある程度の見通しを追求するよりも、単に新たに興味を持った物事の可用性のみを探求します。

なんとなくWebサービスが役に立つ気がしている気がしている。
だからコンテキスト的には整合が保たれていると思って進めた。

昨日今日少し読んだ下記の本を読んでもマッシュアップ（ざっくり言うと組み合わせて新しいものを作ること）方針でいい感じはする。
ソーシャルラーニング入門
https://www.amazon.co.jp/%E3%80%8C%E3%82%BD%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%80%8D%E5%85%A5%E9%96%80-%E3%83%88%E3%83%8B%E3%83%BC%E3%83%BB%E3%83%93%E3%83%B3%E3%82%AC%E3%83%A0/dp/4822248755

#やったこと
下記のサイトをなぞって基盤作成。＆vagrantで便利化。
※途中でつまづいているところです。
CentOS7 + WordPress + Nginx + MySQL を動かしてみよう
http://www.sssg.org/blogs/hiro345/archives/16747.html

##ちょっと説明（曖昧な知識含む）
 - CentOS：言うまでもなくOS。LinuxはGUI以外はとても便利だなあと最近思う。
GUIめんどうだし嫌い(笑)
 - Nginx：Webサーバ（やらロードバランサやら？）。Apacheみたいなもの。ミドルウェアに含まれるよう。
 - MySQL：RDMS(Relational Data Base System)。これもミドルウェアでインデックス効かせたりキャッシュ最適化したりして、ボトルネックになるFileI/O減らしたりしてくれてるっぽい。SQLを通じてストアされているデータにアクセスできる。
 - WordPress：

>WordPress（ワードプレス）は、オープンソースのブログソフトウェアである。PHPで開発されており、データベース管理システムとしてMySQLを利用している（後述のプラグインよりSQLiteでの使用も可能）。単なるブログではなくCMSとしてもしばしば利用されている。
https://ja.wikipedia.org/wiki/WordPress

#PF環境
http://qiita.com/SenoEisuke/items/1d487541c2479fb94ed4#pf%E7%92%B0%E5%A2%83
vagrant:1.8.4

#トラブルシューティング
 - ssh接続

cmdからだとvagrant sshでsshクライアントがないよーとなるのでgit-bashからやったら問題なくいけました。（git-bashのPathは手動で追加してます）何でかpasswordを求められない(笑)。注）何かしくっているのかもしれません。

 - MySQLのrootアクセス

MySQLのデフォルトのpasswordが分からなくて「$ mysql -u root mysql -p < wp.sql」でつまづき。デフォルトはpasswordなし。わお！password設定は、http://webkaru.net/mysql/mysql-root-password/ のサイトを参考にmysqladminの方で設定しました。

警告出たけど。
>こちらは~/.bash_historyに平文でパスワードが記載されてしまうので、おすすめしません。

だそうです。そんな感じの警告だった気がします。まねしないでください。

 - WordPressのセットアップ

ブラウザからHTTPホストにアクセスしてに行って、適当に入力したら、"php-config.php"と違うわ！と突っ込まれたのでhttps://wpdocs.osdn.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86 を参考に
/var/www/html/php-config-sample.php　を
/var/www/html/wp-admin/php-config.php　に
リネームコピーしてviで適当にいじったけどうまく行ってません。Web屋ではないので（言い訳）よく分からないのだけど、Vagrantfileの"private network"で設定しているIPアドレスとphp-config.phpでlocalhostと設定しているのがうまく行くのか怪しい気はする。ホスティングサービスなんたらとやたらと出てくるので自前のMySQLサービスではアカンのでしょうか。

認証キーは下記のリンクのオンラインジェネレータで生成しました。ご利用は自己責任で。。（がくがくぶｒ
https://wpdocs.osdn.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86#.E8.AA.8D.E8.A8.BC.E7.94.A8.E3.83.A6.E3.83.8B.E3.83.BC.E3.82.AF.E3.82.AD.E3.83.BC

##現状
https://github.com/senoEisuke/mvp/tree/vagrant_centos7_nginx_mysql_wordpress/web_dev_pf
※意図せずpasswordや認証キーを公開するという激しい愚行を行っている気がしてきましたが、
**絶対にまねをしないでください。**何とかする予定です。
自分の環境のものは変更します。vagrantのprivate networkのIPはどうなんだろう。。

###余談
ようやくvi絶対使いたくないが薄れてきました(笑)
最近本当にうっとうしいのでコマンドのハンドブック買おうと決意しながらも
下記のサイト見ながらやってたら拒否反応が薄れてきました。
http://hp.vector.co.jp/authors/VA016670/unix/vi_reference.html
ScalaのBreezeを使って行列計算


自分用メモ

# sbtプロジェクトの準備

[scalanlp/breeze](https://github.com/scalanlp/breeze "scalanlp/breeze")

```
mkdir breeze_test
cd breeze_test
touch build.sbt
```

```build.sbt:build.sbt
libraryDependencies  ++= Seq(
  // Last stable release
  "org.scalanlp" %% "breeze" % "0.12",

  // Native libraries are not included by default. add this if you want them (as of 0.7)
  // Native libraries greatly improve performance, but increase jar sizes. 
  // It also packages various blas implementations, which have licenses that may or may not
  // be compatible with the Apache License. No GPL code, as best I know.
  "org.scalanlp" %% "breeze-natives" % "0.12",

  // The visualization library is distributed separately as well.
  // It depends on LGPL code
  "org.scalanlp" %% "breeze-viz" % "0.12"
)


resolvers += "Sonatype Releases" at "https://oss.sonatype.org/content/repositories/releases/"
```

```
sbt update
> console
scala>
```



# 行列計算してみる

```
scala> import breeze.linalg._

scala> val m1 = DenseMatrix((1,2), (3,4))
m1: breeze.linalg.DenseMatrix[Int] =
1  2
3  4

scala> val m2 = DenseMatrix((5,1), (4,8))
m2: breeze.linalg.DenseMatrix[Int] =
5  1
4  8

scala> m1 + m2
res0: breeze.linalg.DenseMatrix[Int] =
6  3
7  12

scala> m1 * m2
res1: breeze.linalg.DenseMatrix[Int] =
13  17
31  35

scala> val v1 = DenseMatrix.zeros[Int](2,3)
v1: breeze.linalg.DenseMatrix[Int] =
0  0  0
0  0  0

scala> m1(::, 0) := DenseVector(4,7)
res23: breeze.linalg.DenseVector[Int] = DenseVector(4, 7)

scala> m1
res24: breeze.linalg.DenseMatrix[Int] =
4  2
7  4

scala> m2(0, ::) := DenseVector(3,5).t
res25: breeze.linalg.Transpose[breeze.linalg.DenseVector[Int]] = Transpose(DenseVector(3, 5))

scala> m2
res26: breeze.linalg.DenseMatrix[Int] =
3  5
4  8
```


とりあえず行列計算試せたからここまで

[チートシート](https://github.com/scalanlp/breeze/wiki/Linear-Algebra-Cheat-Sheet "チートシート")
Unityでアプリを作る時に参考にしているサイトまとめ

unityでアプリを作る時に参考にしているサイトを載せました
unityは結構早いスピードで進化しているので
古くなっているものもありますが
現状でも十分使えることは確認しています

## test flight
http://qiita.com/Raugh/items/9e803fbb03391cf1b388

## twitter
http://smartgames.hatenablog.com/entry/2016/03/13/165456

## ソーシャルコネクター
https://github.com/anchan828/social-connector

## gamecenter
http://qiita.com/yimajo/items/503cb2451e303e9f3841

## admob
http://games.genieus.co.jp/unity/admob_unity/

## カメラフィット
http://qiita.com/kwst/items/371542a6d3892b577b41

## マウスでカメラを動かす
http://esprog.hatenablog.com/entry/2016/03/20/033322

## 動画
http://www.slideshare.net/koogawa/app-previewsex

## iOSリリース時途中でアップロード止まった時は

http://frnk.hatenablog.jp/entry/2015/09/30/145853
https://akira-watson.com/iphone/app-upload.html
PCリカバリ > ドライブレターが初期化される

PCリカバリ時のメモ

### 環境

- Windows 7 pro
- Cドライブ: システム
- Xドライブ: データ

上記環境にて某ツールにてリカバリ用USBメモリを作成した。

### リカバリ

ある時点でXドライブが故障したため、別のディスクに交換した。

またある時点でリカバリ用USBメモリからリカバリした。

そうすると、XドライブとしていたディスクがDドライブのドライブレターになった。

リカバリ用USBメモリ作成時と別のディスクになったため、ドライバ関連の入れ直しになり、ドライブレターが初期化されたようだ。

ドライブレターをDからXに変更後、動作は継続している。
Pythonモジュールの関係図を作る

# はじめに
リファクタリングのために，モジュール間の関係図を作る．
[Pythonでモジュールの依存関係図を描きたい](https://teratail.com/questions/34133)とか[Python dependencies inside a package](http://stackoverflow.com/questions/20829697/python-dependencies-inside-a-package) によると，
[snakefood](http://furius.ca/snakefood/) が良さそうだったので使ってみた．

# snakefood
pip でインストール可能．

```shell-session
$ pip install snakefood 
```

いくつかのコマンドが提供されているが，
`sfood` で解析し，`stood-graph` で [Graphviz](http://www.graphviz.org/) 用の dot ファイルを書き出せる．

解析したいパッケージのルートが `ROOT` だとすると，

```shell-session
$ sfood ROOT | sfood-graph > graph.dot
```

で `graph.dot` ができるので，後は適当にプロットする．

```shell-session
$ dot -Tjpg graph.dot -o graph.jpg -Gdpi=800
```

モジュールが多い場合解像度(`-Gdpi`オプションの値)は大きめに設定しないと潰れて読めなくなる．
jpg 以外で出力する場合は，`-Tpng` などとすれば良い．

なお，`sfood` に `-i` オプションをつけると，外部パッケージは省くことができる．

# サンプル
参考までに，[selenium](http://www.seleniumhq.org/) で試した結果を掲載しておく．

![selenium.jpg](https://qiita-image-store.s3.amazonaws.com/0/62253/7d829310-c6fe-f689-c2da-6c2b67dc20a6.jpeg)


# その他
[pyreverseの結果の見方とオプションの使い方](http://p--q.blogspot.ca/2015/07/linuxbean140450pyreverse.html) によると[pyreverse](https://pypi.python.org/pypi/pyreverse/0.5.1) というツールでもいけるみたい．
Raspberry piにRubyの最新版をインストールする


## はじめに

* Debianにインストールする方法とほぼ同じ
* ラズパイはスペックが低いのでインストールにすごい数時間かかる場合もあるので気長にやること

## 前提条件
* 本体: Raspberry Pi 1　Model B+
* メモリーカード: 8GB
* OS: Raspbian最新版インストール済み


## rbenvのインストール

rbenvのインストールして設定をbashの設定ファイルに書き込む, zshなど使う場合はそれぞれに合わせること

```
> sudo apt-get install rbenv
> echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> .bashrc
> echo 'eval "$(rbenv init -)"' >> .bashrc
```

インストールの確認

```
> rbenv
> rbenv x.x.x #バージョンが表示されること

```

### gitのインストール

gitがインストールされていなければ、gitをインストールすること

```
> sudo apt-get install git
```


## ruby-buildのインストール

ruby-buildをgitからクローンしてくる

```
> git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

> rbenv install --list
を見ると2.3.1とCrubyの2.3系の最新版がある

rbenv install 2.3.1
```

## トラブルシューティング

### Rubyのインストールでライブラリが足りないようなら、下記コマンドでライブラリを追加してみること

```
> sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev
```

参考: https://github.com/rbenv/ruby-build/wiki#suggested-build-environment


### apt-getでruby-buildをインストールしてしまった場合

以下のようにapt-getでruby-buildをインストールしてもインストール可能なリストにRubyの最新版がない。
実行時には、ruby-2.2.0-previewが最新版で、この時の最新版の2.3系がない


```
> sudo apt-get install ruby-build
> rbenv install --list
```

ruby-buildをアンインストールするにはこちら

```
> sudo apt-get remove ruby-build

```
ソフトウエアmain

# 1. Colorのリンク
## 〇.1 System.Windows.Media.Colors
[Colors クラス (System.Windows.Media)]( https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.media.colors  )
[VisualStudioカラーコード表 : ao-system ]( https://ao-system.net/vscolor/ )
## 〇.2 
[UIデザイン初心者が知っておきたい配色の理論]( https://uxmilk.jp/49907 )


# OpenCV
[opencv.org](http://opencv.org/)
[opencv.jp](http://opencv.jp/)

OpenCV 3.1
[www.buildinsider.net OpenCV入門【3.0対応】（2）](http://www.buildinsider.net/small/opencv/002)

`>dxdiag`

```
#include <copncv2/core/ocl.hpp>
cv::ocl::setUseOpenCL()
cv::ocl::haveOpenCL()
```

#Raspberry Pi
[www.raspberrypi.org](https://www.raspberrypi.org/) ブロク ダウンロード コミュニティ ヘルプ フォーラム 教育
[www.raspberrypi.org/downloads](https://www.raspberrypi.org/downloads/)
[http://elinux.org/RPi_Hub](http://elinux.org/RPi_Hub)
[github.com/raspberrypi](https://github.com/raspberrypi)

[Jun's Homepage Raspbery Pi(ラズベリーパイ)メモ ](http://www.mztn.org/rpi/rpi00.html)

TeraTerm
SDFormatter
CrystalDiskMark5
Noah
Win32DiskImager

[Raspberry Pi にRTCを追加](http://blog.zaq.ne.jp/mypy/article/30/)


#GNU/Linux

[Linuxコマンド逆引き大全 itpro.nikkeibp](http://itpro.nikkeibp.co.jp/article/COLUMN/20060224/230579/)

[Linuxのディレクトリ構造（一覧）を理解する www.linuxmaster.jp] (http://www.linuxmaster.jp/linux_skill/2010/02/06linux.html)

[https://linuxjm.osdn.jp/](https://linuxjm.osdn.jp/) JM プロジェクトは、主に Linux 関連のマニュアルページの日本語ページを翻訳・公開しています。

[https://osdn.jp/projects/linux-kernel-docs/wiki/Linuxカーネル2.6解読室 目次](
https://osdn.jp/projects/linux-kernel-docs/wiki/%E7%9B%AE%E6%AC%A1)

#GUN
[http://www.gnu.org/](http://www.gnu.org/)

#Debian
[http://www.debian.org/](http://www.debian.org/)

#HTML
[★HTML5タグリファレンス www.htmq.com/](http://www.htmq.com/html5/article.shtml)

#D3.js
[http://ja.d3js.node.ws/](http://ja.d3js.node.ws/)

#Lua
スクリプト言語Lua


#C# #
##MVVM
#PHP
1.Cake
2.ララベル

#Other
GIMP
TinyVPN
wireshark
技術英語 > Don't create an opposite [gratuitously]

@ Code Complete (No. 5041 / 36077)

> Don't create an opposite <font color=red>gratuitously</font>, but to check to see whether you need one.

http://ejje.weblio.jp/content/gratuitous
> いわれ[根拠]のない.

意訳「反対のものを根拠なく作らず、必要かどうかをチェックしなさい」

<hr>
関連して思い出したのは

http://qiita.com/7of9/items/e695b43f567e5864ece8
> It's my job to make sure that the magic is grounded.
今週仕事などで調べたjavascriptがらみの知識とかサイトとか２

JavaScriptをメインにしたお仕事2週目。
まだまだいろいろ勉強しないとダメですね・・・。

# 今週仕事などで調べたjavascriptがらみの知識とかサイト

## javascriptで簡単に経過ミリ秒を取得する方法
http://www.deftrash.com/blog/archives/2009/02/javascript_date_milli.html

## JavaScriptで変数が変更されたのを監視して、なんかする方法
http://qiita.com/zaru/items/adb0b07dd83bb97cac13

## 【JavaScript】連想配列のkeyとvalueの取得
http://qiita.com/glaytomohiko/items/852ea64bcfc1e4fc1b51

## 連想配列の使用方法
http://www.24w.jp/study_contents.php?bid=javascript&iid=javascript&sid=array&cid=005

## JavaScript で空のオブジェクトの判定方法
http://monopocket.jp/blog/javascript/2740/

## javascriptのデバッグでobjectの中身を文字列として展開する方法
http://www.infoscoop.org/blogjp/2012/05/17/javascript%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%A7object%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%82%92%E6%96%87%E5%AD%97%E5%88%97%E3%81%A8%E3%81%97%E3%81%A6%E5%B1%95%E9%96%8B%E3%81%99%E3%82%8B/

## Javascriptにおけるオブジェクトの順序
http://qiita.com/suguru03/items/bf48610225fefcb0f45e

## Javascriptのbind関数と部分適用 JSおくのほそ道 #015
http://qiita.com/hosomichi/items/e11ad0c4ea79db2dee84

## JavaScript bind,call,apply入門！
http://qiita.com/39_isao/items/c00a200b158ba057363f

## jQuery日本語リファレンス
http://semooh.jp/jquery/

## jasmineで例外をテストする
http://qiita.com/nanocloudx/items/8188ea6c1e11da5e595c


## javascriptらしい書き方
今週は、要素の判定方法について調べたり、デバッグの方法を調べたりが多かったですね。
要件を満たす書きっぷりはできても、もっとよいjavascriptらしい書き方があるんじゃないかなと感じることについて検索していました。
あと、みんなハマるところみたいなんですけど、シングルクリックとダブルクリックの判定的な部分でハマりました（笑）
Facebookと係争中の他社はReact.jsが使えない

# React v16リリースと共にMITライセンスへ

https://facebook.github.io/react/blog/2017/09/26/react-v16.0.html#mit-licensed
16系だけでなく、すぐに移行できない人向けに、15系の主要バージョンもMITライセンスに変更されました。

https://github.com/facebook/react/commit/8c3cececb765a0a0ad8b0faca764ef30be494a74

# 2017/09/24追記

近日リリース予定のReact v16にて、ライセンスをBSD + Patentsから**MIT**に変更予定との[POST](https://code.facebook.com/posts/300798627056246/relicensing-react-jest-flow-and-immutable-js/)がありました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">We&#39;re relicensing React, Jest, Flow, and Immutable.js under the MIT license. <a href="https://t.co/3XD0z49UsS">https://t.co/3XD0z49UsS</a></p>&mdash; React (@reactjs) <a href="https://twitter.com/reactjs/status/911347634069168128">2017年9月22日</a></blockquote>

但しまだGitHubでLICENSE*ファイルの変更やPATENTSファイルを削除してるbranchやtagはなさそうです。
また更新がありましたら追記します。

---

# 概要

2016/7/16（土）に、「[Your license to use React.js can be revoked if you compete with Facebook](http://react-etc.net/entry/your-license-to-use-react-js-can-be-revoked-if-you-compete-with-facebook)」という題名のブログ記事が投稿されました。

(=> 記事のcompete withを競合と訳してましたが、PATENTSファイルにcompeteとはないので、編集リクエストに従ってタイトルを「係争中」と変更しました）

また、React discussion forumにも「[うちの法務がReactの使用を認めてくれない](https://discuss.reactjs.org/t/legal-department-did-not-allow-use-of-react/3309
)」というスレがあり、情報を整理してみました。

---

## ブログ内容要旨

- ReactはBSDライセンスのOSSだけど、[2015/4に追加された特許条項](https://github.com/facebook/react/blob/master/PATENTS#L14-L26
)に気をつけるべきだ
- Facebookに対し法的措置等をとるようなことがあれば、Reactライセンスはただちに剥奪される
- GoogleやMicrosoftは上記の制約から、社内でのReactの利用を禁止している
  - 注. reference付きでそう書かれていますが、@icoxfog417さんのコメントの通り、 正しくない可能性があります
- Facebookは強い会社だから今すぐ問題にはならなさそうだけど、Yahoo!Inc.のようにいつか凋落した暁には......
- この手の裁判は難しいから、GoogleとOracleのJava裁判のように何年もかかる、つまり、勝訴したとしてもお金がかかる
- ということでまずは法務に相談だ

---

## Reactの特許条項

2015/4のPATENTSファイルのコミットが問題の部分です。

https://github.com/facebook/react/blob/master/PATENTS#L14-L26

---

## 所感

なぜ一年以上前に追加された条項が、今になって記事にされたのか。

~~まだ判例はありませんが、こう指摘されてしまうと、法務としてはReactの活用を積極的に支持できないのではないかと。
Facebookやその子会社（InstagramとかOculusとか）の事業範囲となると、SNSや広告はもちろん、機械学習やIoTでも特許等でぶつかりえるかも知れません。~~

解釈やリスクコントロールは、やはり自社法務に頼っていただければと思います。
（ただ個人的な意見としては、静観してしまうのが得策かも知れません......）

~~-> コメント欄の@icoxfog417さんの指摘の通り、結論としては過剰に反応する必要なし、で大丈夫そうです。~~

-> 「過剰に反応する必要なし」と書きましたが、すみません、使いたい側のポジショントークになっていたので撤回します。