OmniAICreator/Qiita-1.07M huggingface dataset:
[Python]ニンテンドースイッチの在庫情報をつぶやくスクリプト

情報が古くなっており、メンテナンスが難しいため、こちらのページはアーカイブさせていただきました。

古い情報でも閲覧を希望される場合は、編集履歴からご覧くださいませ。
アンチウィルスソフトってどうやって動いてるの？

(レポート課題)
この記事では、タイトル通りアンチウィルスソフトの仕組みについて調べたことをまとめて行きます。

最初のコンピュータが開発されてから半世紀が経ちましたが、コンピュータウイルスの脅威は一向に衰える気配はありません。それどころか、情報技術の発展に合わせてますます高度化、複雑化しています。例えば、最近のニュースでは中学生がランサムウェアを独学で作り出したというニュースが有りました。このランサムウェアというものは、パソコンに保存されたデータを暗号化してしまい複合するために代金を要求するというものなのですが、最近のものには支払はビットコインが要求されることがほとんどです。詳しい説明は割愛しますが、ビットコインは近年新しく現れた仮想通貨で、国境を超えた経済システムを確立しています。ランサムウェアが増加したのはこのビットコインによってハッカーが相手の居る経済圏を問わず現金（と言えるのかわかりませんが）を受け取れるようになったからなのです。このように、情報システムが発達するほどそれを利用したウイルスの種類は増えていきます。
#指名手配リスト方式、パターンマッチング法
さて、このように時が経つほどその数が膨れ上がるウィルスをセキュリティソフトはどのように感知するのでしょうか。
まず古典的な手法として、パターンマッチング法があります。これは対応すべきウィルスの特徴的な部分を抽出し、それと一致するファイルをウィルスと判定する手法です。この特徴的な部分というのは、コードであったり特定の挙動であったりしますが、ハッシュ値を利用するものもあります。昔から用いられてきた手法ですが、この手法の限界としてウィルス検出の軸になる特徴的な部分さえ少しでも書き換えてしまえばすり抜けられてしまうのです。このため、ウィルスは一つ有名なものが出るとその派生版が無数に作られてきました。これらの派生版が発見して検出リストに加えればまた新しい派生版が……と言うふうに、未知のウィルスに弱くどうしても後手に回らざるを得ないのです。そして、そのイタチごっこを繰り返した結果現代のウィルスリストはもはや膨大なものになっており、ネットを通してダウンロードするにも実際に照合するにしても大きな負荷が掛かるようになってしまっています。

#ウィルスの振る舞いを感知する、ヒューリスティック法
このパターンマッチング法の欠点に対応するために開発されているのが、ヒューリスティック法です。これはウィルスのコードではなくその働きをチェックすることで、その危険性を判別し、未知のウィルスでも被害を予防できるようにするための手法です。これは静的と動的の2つの解析法があり、静的なものは自己を複製したりファイルを消去するようなコードがないかチェックし、危険度を判別する方法です。対照的に、動的な解析は検査するプログラムを実際には影響しない仮想マシン上で動かすことでメモリ上のプログラムの挙動をチェックして高い精度で危険度を判別します。ヒューリスティック法はパターンマッチング法よりも誤検出の可能性は高いですが、未知のウィルスを予防するためにこの判別法も重要なものとなってゆくでしょう。
deviseのviewファイルとhamlの関係


# 備忘録
deviseのビューファイルを生成してerb2haml使って、ビューファイルをhamlに変換した後、「あ、gem 'haml'入れてないや’（haml-railsだけ入れてた）」と思って、入れた。
で,devise関連のビューファイル(devise/sessions/new.haml.haml)を編集して、ローカルで確認してみると、更新されていない。

ローカルサーバーさんのログを見てみると、
devise/sessions/new.html.erbを見に行っている。
さっきerb2hamlでerbはすべてhamlに変換されているので、ぜひそちらを見に行って欲しい。
調べてみてもよくわからなかったので、結局ブランチを削除し、やり直した。

なんとなく、erbをhamlに変換したあとに、gem 'haml'を入れたのが、よくなかったのではないかとおもい、今度は、

```rails:Gemfile
gem 'haml'
gem 'haml-rails'
gem 'erb2haml'
```

でbundle installしてから、deviseを入れ、ビューファイルを生成し、それらをhamlに変換した。
そしたら、devise/sessions/new.html.hamlを見にいくようになった。

しかし、これってdevise入れてからhaml導入しようってなったら困る気がする。。。
テーブル結合についての備忘録

こんにちは。
この度初めて投稿させていただきます。

SQLのテーブル結合について、私が調べた内容のまとめです。
**環境: SQL Server 2012**

こちらも合わせてどうぞ
**次回記事**
[テーブル結合についての備忘録 その2](https://qiita.com/mounntainn/items/2c5a568c98b7e9c38c6f)

まだまだ駆け出しの新人PGですが、
SQLでのテーブル結合を業務で使う機会がありました。

**「テーブル結合は3種類ある。」**
**「JOINするときはONに条件を書いとけばいい」**

くらいのな～んとなくしかテーブル結合について解っておらず、
思い通りのデータを抽出することが出来ずに大変と四苦八苦いたしました。

今日は一日中SQLについて調べ倒したのですが
ネットには誤った情報も多く何が正しいのかがわからずに右往左往と惑わされました。

しかし時間を費やした甲斐もあり、ようやく自分の中で結論が出せて、
テーブル結合の仕組みがある程度見えてきた気がします。

今、四苦八苦とした思い出が頭の中に記憶として残っているうちに
後から、四度八度と読める記録として残しておくことにします。

**********************************************************************

#結合処理のロジックについて

まずは2つのテーブルが結合される際に
どういった流れで結合がされるのかを理解する必要があります。

重要な流れは以下になります。

**①ON句の条件でテーブル結合が行われる。**
**②WHERE句の条件で抽出が行われる。**

この知識を前提としたときに、次のような会話がありました。

先輩SE1「*WHERE句でテーブル結合なんかしたら駄目だよ！
　　　10万件のデータと10万件のデータのテーブル同士をくっ付けるとすごく無駄になるよ！*」
私「*なるほど！　先に結合のときに件数を減らしとくわけですね！*」


という訳でまだ何も解っていなかった私は以下のようなSQLを組みました。

```SQL
SELECT
    a.name
    , b.name
FROM a
    LEFT OUTER JOIN b
        ON  a.b_cd = b.cd
        AND b.cd   = '1'

--b.cdはbのPK
```

我々、新米PG達には以上のSQLで、b.cd = '1'の一意なデータが得られるように見えるでしょう。
しかし、経験あるSE, PGの方々には一目瞭然でこのSQLの危険性が読み取れるかと思います。


#LEFT OUTER JOINについて
結論から言うと、先程のSQLでは一意なデータを得ることができません。


よく他のサイトではINNER JOINからの説明に入ることが多いのですが、
私の主観で、LEFT OUTER JOINの説明から入ります。
**LEFT OUTER JOINでは(LEFT OUTER JOINの)左側のテーブルの行を*必ず全て*、「呼出」します。**
**この時、右側のテーブルに存在しない行についてはNULLが埋められていきます。**

先ほどのコードでいうと、

```SQL
FROM a -- ←　左側
    LEFT OUTER JOIN b -- ←　右側
        ON  a.b_cd = b.cd
        AND b.cd   = '1'
```

という位置付けになります。

その結果、こんなデータが取れてしまいます。

|cd|name|
|:-:|:-:|
|1|ほげほげ|
|2|NULL|
|3|NULL|

実際に技術的な単語としては正しいとは言えないと思いますが
ここで、**「抽出」**ではなく、**「呼出」**という言葉を用いたのには理由があり、
これから説明しますがイメージをつけやすくする為です。

ここでまた、少し話が先ほどのTOPICに戻るのですが次の点も重要になります。

**ON句：結合条件**
**WHERE句：抽出条件**

であるという事です。


つまり、これらの点をまとめると、
先ほどのコードを書いたときには次のような処理が行われていきます。

**①ON句の結合条件で、テーブル結合が行われる。(この時はデータは一意。)**
**②LEFT OUTER JOINで左のテーブルの行を全て呼び出す。**

結果、取得する必要の無い行もNULLが埋められて呼び出しされる。
という訳です。

LEFT OUTER JOINを理解していない者のイメージとしては、
結合条件へ「行を抽出する条件」を書くことで、
その行だけが結合されるようなイメージを持ってしまいます。

実際の処理としてはその行だけが結合されて、残りはNULL埋めされているのですが、
ここでは**「呼出」**という言葉を用いることで
結合条件を指定していようが、どうしようが
左のテーブルの全行が**呼び出される**という事を示唆しました。

ちなみにON句に書かれる条件は、
左側のテーブルに関する条件であろうが、
右側のテーブルに関する条件であろうが、
両側のテーブルに関する条件であろうが、
問答無用で左側のテーブルの全行が**「呼出」**される事になります。

ネット上でもこの「結合条件」という言葉に惑わされている方々の記事が
あちこち多くに散見されました。
では本当にデータを「抽出」する為には、
どういったSQLをかけばいいのでしょうか？

抽出という言葉を用いたことで、
皆さんもある程度予想がついている事とは思います。

```SQL
SELECT
    a.name
    , b.name
FROM a
    LEFT OUTER JOIN b
        ON  a.b_cd = b.cd
WHERE
    b.cd = '1'
```

その名の如く、
抽出条件はWHEREへ書くことで一意なデータを得ることが出来ます。

とりあえず今回重要だった事は、

**LEFT OUTER JOINでは、ONでデータの抽出は出来ない。**

これだけは皆さん頭に必ず残しておいてください。
あまり使う機会はないと思いますがRIGHT OUTER JOINも同様のはずです。

しかし、これでまだ終わりではありません
続きは**次の記事**で書きます。
[テーブル結合についての備忘録 その2](https://qiita.com/mounntainn/items/2c5a568c98b7e9c38c6f)

これから業務等でテーブル結合をすることになる皆様の
お力になれれば幸いです。

---
参考：[外部結合を侮ると痛い目見るの巻 ](http://hhelibex.hatenablog.jp/entry/20110413/1302717714)
[coffee]ブラウザの「戻る・閉じる・再読み込み」が押された時にアラート

EFO対策として、重要なフォームでは、
ブラウザの「戻る・閉じる・再読み込み」が押された時にアラートを出し、
離脱率を減らすという施策が行われる。
[参考]　[フォームの2大誤操作「閉じる・戻る」での離脱を減らす確認ダイアログを実装しよう／15か条の10](http://web-tan.forum.impressrd.jp/e/2015/06/05/17005)

###[コード要点]
・ブラウザでの「閉じる、戻る、再読み込み」があったときにアラート発生
・指定の要素に入力がない場合、アラートを発生させない。
・指定の要素へは、アラートを発生させない。

```coffeescript
$(window).ready ->
  # [どの要素で入力されていたらアラート発生させるか指定]
  # (input要素、textarea要素、select要素が変更された場合)の値が変更された場合
  # ブラウザの戻るや更新ボタン、タブを閉じるときに
  # 警告をだすようにする
  $('input, textarea, select').on 'keyup change', ->
    $(window).on 'beforeunload', ->
      true
  # [アラート発生させない要素を指定]
  # 送信ボタンなどの通常の方法で画面遷移した場合は、
  # 通常通りアラートは表示されずに遷移する
  $('a, input[type=submit]').on 'click', ->
    $(window).off 'beforeunload'
```
[参考]　[【jQuery】戻るや閉じるなどの画面が遷移する時にアラートを表示させる方法](http://blog.shuffleee.com/1196/)
Javaの正規表現でマッチ箇所に応じた値で置換する

たとえば、以下のようなSQL文字列のバインドパラメータを実際の値で置き換えることを考える。

```sql
insert into table1(c1, c2, c3) values (?, ?, ?)
```

```sql
insert into table1(c1, c2, c3) values (1, 2, 3)
```

```java
String[] v = {"1", "2", "3"};
		
Pattern p = Pattern.compile("\\?");
Matcher m = p.matcher("insert into table1(c1, c2, c3) values (?, ?, ?)");
		
StringBuffer sb = new StringBuffer();
for (int i=0; m.find(); i++) {
	m.appendReplacement(sb, v[i]);
}
m.appendTail(sb);
System.out.println(sb.toString());
```
TwitVim のプロキシ設定を環境変数から設定

[twitvim/twitvim: Twitter client for Vim](https://github.com/twitvim/twitvim) でプロキシを設定するときは `.vimrc` に以下のように書いたりします。

```vim:.vimrc
let s:twitvim_proxy = "proxyserver:proxyport"
let s:twitvim_proxy_login = "proxyuser:proxypassword"
```

-   詳しくは以下を参照

    ```vim
    :help twitvim_proxy
    :help twitvim_proxy_login
    ```

それを環境変数 `HTTP_PROXY` の値から自動設定するようにしてみました。

```vim:.vimrc
if exists('$HTTP_PROXY')
    let s:proxy_url_pattern =
                \ '^\%(\([^:]*\):\/\/\)\='
                \ . '\%(\([^:@]*\)\(:[^@]*\)\=@\)\='
                \ . '\([^:]*\)\%(:\(\d*\)\)\=/\=$'
    let g:twitvim_proxy = substitute($HTTP_PROXY,
                \ s:proxy_url_pattern, '\4:\5', '')
    let s:proxy_login = substitute($HTTP_PROXY,
                \ s:proxy_url_pattern, '\2', '')
    let s:proxy_pass = substitute($HTTP_PROXY,
                \ s:proxy_url_pattern, '\3', '')
    let g:twitvim_proxy_login = substitute(s:proxy_login . s:proxy_pass,
                \ '%40', '@', 'g')
endif
```
[ruby]二次元配列の２次元目の要素番号を指定してピックアップしたいとき。

以下のような二次元配列の、
"1"にあたるところを抜き出したい。

```ruby
array = [
  [1,2,3],
  [1,2,3],
  [1,2,3]
]
```

`transpose`を使って、行列で言う転置を行う。

```ruby
array.transpose
=>
[
  [1,1,1],
  [2,2,2],
  [3,3,3]
]
```

そうすれば、
元々の二次元配列の２次元目の要素番号を指定してピックアップできる。

```ruby
array = [
  [1,2,3],
  [1,2,3],
  [1,2,3]
]
array.transpose[0] # [1,1,1]
array.transpose[1] # [2,2,2]
array.transpose[2] # [3,3,3]
```

# おまけ：使いどころはHashのsort
Hashのsortで並び替えを行うと返り値がArray型になります。
ちなみにsortの処理内容ははvalueの降順。（[http://ref.xaio.jp/ruby/classes/hash/sort](http://ref.xaio.jp/ruby/classes/hash/sort)）

```ruby
hash = {1=>2, 2=>5, 3=>1}
hash.sort{|(k1, v1), (k2, v2)| v2 <=> v1 }
```

並び替えした後、hashの時keyだった値だけ引っ張りたい時、
以下のように、`transpose`を使う。

```ruby
hash = {1=>2, 2=>5, 3=>1}
hash.sort{|(k1, v1), (k2, v2)| v2 <=> v1 }.transpose[0]
# => [2,1,3]
```

# おまけ２：100万倍楽な方法
@scivolaさんのコメントより引用

```ruby
array.map{|row| row[0]} # => [1,1,1]
array.map{|row| row[1]} # => [2,2,2]
array.map{|row| row[2]} # => [3,3,3]
```
ユーザ権限を分けたバッチのテスト

ユーザ権限で処理を切り分けるバッチを書きました
http://qiita.com/miz21358/items/0d2349c369e889e2cd00

この時に、PCのログインログアウトを繰り返すのが面倒だったので、ちょっと工夫してみました。

## 複数のユーザが実行するタスクを登録する

1. タスクスケジューラを開く
2. タスクを登録する
 1. 右クリックして「新しいタスク」
 2. セキュリティオプション＞「タスクの実行時に使うユーザアカウント」にテスト用アカウントを設定
 3. Users権限ユーザを登録する場合、バッチジョブの許可を出す（後述）
 4. 「ユーザがログオンしているかどうかにかかわらず実行する」にチェック
 5. 操作タブでバッチを登録
3. タスクを右クリックして「実行する」で対象ユーザでバッチが実行される

バッチが終わってるのにタスクが完了しないとか、なんかよくわかんない動作しますが、とりあえずユーザを切り替えてテストはできました。

## Users権限ユーザにバッチジョブの許可を出す手順

1. 「コントロールパネル」を開く
2. 「管理ツール」を開く
3. 「ローカル セキュリティ ポリシー」を開く
4. 「ローカル ポリシー」＞「ユーザー権利の割り当て」を選択
5. 「バッチ ジョブとしてログオン」項目をダブルクリック
6. タスクを実行したいユーザを追加する

テストが終わったら、バッチジョブの許可は取り消しといた方がいいような気がします。
深層学習メモ

深層学習メモ

「思考順路」
ネットワークとその構成（レイヤ）
→ネットワークに目的の機能を持たせる（学習、育成、訓練）
（損失関数、勾配計算の方法、勾配更新方法）

ネットワーク≒（多層）パーセプトロン


「機械学習を用いたアプリケーション」
非常に生物的に感じる
最初はデータを与えてネットワークを育成
その後、サービスとして公開後（自立後）は勝手にデータを学習して成長していく


「層レイヤ（少しマクロ視点）」
全結合層：Affineレイヤ →ReLUレイヤ（活性化関数）(→Dropoutレイヤ)
畳み込み層：Convolutionレイヤ →ReLUレイヤ（活性化関数）→Poolingレイヤ
出力層：全結合層→ Softmaxレイヤ（分類問題) or 恒等レイヤ


「ネットワーク」
大きな構造
入力層→隠れ層（何層も重なる）→出力層


「ネットワークのパラメータ」:
{ ・マクロ視点
各層の構成：全結合層、畳み込み層など
・・学習時に必要なパラメータ
勾配の求め方：誤差逆伝播法、（順伝播）
勾配更新手法：SGD、Momentum、AdaGrad、Adam
損失関数：2乗和誤差、交差エントロピー誤差

・ミクロ視点
活性化関数：ReLU関数、（シグモイド関数）
出力関数：Softmax関数、線形出力関数

など
 }



良い相性（Backprop（誤差逆伝播法）での計算が綺麗になる）
分類問題（2クラス、多クラス）：softmax関数と交差エントロピー誤差
回帰問題：線形出力関数と2乗和誤差

Softmax-and-Lossレイヤ：Softmax（出力関数）→Cross Entropy Error（損失関数）


「Affineレイヤ」
Affineレイヤ：乗算レイヤ→加算レイヤ
Y = X・W + B
W：重み
B：バイアス
X：入力
Y：出力


「ネットワークに目的の機能を持たせるため」
deep learning（学習）流れ
以下の繰り返し
「学習」
１：ミニバッチ
２：損失関数の重み、バイアス(weight、bias)に関する勾配算出（順伝播、逆誤差伝播）
３：パワメータ更新

１エポックごと（全てのtest dateを学習）に認識精度を計算

学習（１エポック）→認識精度計算 →学習→認識精度→…→認識精度→学習完了


勾配算出
Optimizerに使用する最適化手法を代入
Optimizer.updateで繰り返し使用
Windows10にTensorFlowを入れるまで

久しぶりに入れたのですが、ちょっと手順忘れてましたので一応メモ。
基本的には下記の手順通り
[Installing TensorFlow on Windows](https://www.tensorflow.org/install/install_windows)

# 実行環境
windows10 pro 1703
GTX970 driver 382.53
CUDA 8.0
cuDNN 5.1
TensorFlow 1.2
python 3.5

## Microsoft Visual C++ 2015 再頒布可能パッケージのインストール
[Microsoft Visual C++ 2015 再頒布可能パッケージ](https://www.microsoft.com/ja-jp/download/details.aspx?id=52685)
上記は、Microsoft Visual C++ Redistributable 2017など新しいバージョンが入っていると入れられなかったので
一旦、上位バージョンのアンインストールを実施しました。

## CUDA8.0のインストール
[cuda-toolkit](https://developer.nvidia.com/cuda-toolkit)

# 環境変数を確認
`CUDA_PATH`
`CUDA_PATH_V8.0`
上記パスの確認

## cuDNN5.1導入(要アカウント)
[cuDNN](https://developer.nvidia.com/cudnn)
ダウンロードしたライブラリの中にlib,include,binフォルダがあるのでそれぞれの中身をCUDA_PATH配下に
ある同じ名前（lib,include,bin）のフォルダにいれる

## 仮想環境の作成
### virtualenv
環境の作成
`virtualenv tensorFlow`
環境の切り替え
`tensorFlow\Scripts\activate.bat`
CPUバージョン
`(tensorFlow) pip3 install --upgrade tensorflow`
GPUバージョン
`(tensorFlow) pip3 install --upgrade tensorflow-gpu`

### conda
環境の作成(Anacondaのバージョンにもよるので一応python3.5を指定)
`conda create -n tensorFlow python=3.5 anaconda`
環境の切り替え
`activate tensorFlow`
CPUバージョン
`(tensorflow)C:>pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.2.0-cp35-cp35m-win_amd64.whl 
`
GPUバージョン
`(tensorflow)C:>pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.2.0-cp35-cp35m-win_amd64.whl
`

# チュートリアルの場所
インストール状態によって変わるかもですが、基本的には下記だと思います。
virtualenv（作成した仮想環境のディレクトリ内）
`tensorflow\Lib\site-packages\tensorflow\examples`

conda（Anacondaの仮想環境ディレクトリ内）
`C:\Users\'ユーザ名'\Anaconda3\envs\tensorflow\Lib\site-packages\tensorflow\examples`

# 一応opencvの導入について
[opencv3](http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv)
OpenCV, a real time computer vision library.
`opencv_python‑3.2.0+contrib‑cp35‑cp35m‑win_amd64.whl`
`opencv_python‑3.2.0‑cp35‑cp35m‑win_amd64.whl`
上記のいずれか（今回は3.5なので35）をダウンロードし、仮想環境でpipインストール実施

10シリーズのグラボが欲しい、、、
launchdを使ってhomebrewを自動更新(update/upgrade)

# launchdを使ってhomebrewを自動更新(update/upgrade)

パッケージ管理システムの[homebrew](https://brew.sh/index_ja.html)を使用していますが、updateやupgradeを自身でやるのが面倒なので、launchdを使って自動化します。

# 環境
macOS Sierra(10.12.5)

# 事前準備

定期実行には`launchd`を使用しますが、更新が完了したことを通知したいので、`terminal-notifier`も使用します。これもhomebrewでインストールします。

```
$ brew install terminal-notifier
```

# plistファイル作成

以下内容のファイルを`~/Library/LaunchAgents/`に`localhost.homebrew-upgrade.plist`という名前で作成します。

※ 起動時、または6時間毎に実行するようにしてます。

```
<?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>localhost.homebrew-upgrade</string>
    <key>ProcessType</key>
    <string>Background</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>-c</string>
        <string>/usr/local/bin/brew update &amp;&amp; /usr/local/bin/brew upgrade &amp;&amp; /usr/local/bin/terminal-notifier -title 'homebrew' -message 'homebrew upgraded'</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/tmp/localhost.homebrew-upgrade.stderr</string>
    <key>StandardOutPath</key>
    <string>/tmp/localhost.homebrew-upgrade.stdout</string>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>6</integer>
    </dict>
</dict>
</plist>
```

# launchdに登録

以下を実行

```
launchctl load ~/Library/LaunchAgents/localhost.homebrew-upgrade.plist
```

# launchdから削除

以下を実行

```
launchctl unload ~/Library/LaunchAgents/localhost.homebrew-upgrade.plist
```
Terraformを利用して、AWS EC2を作成してみた

# 概要
Terraformを利用してAWSのEC2を作成してみました。
terraformを実行するのはIAM Roleで権限を付与したインスタンスからになります。

ドキュメントを見るといろいろと出来そうですね。
https://www.terraform.io/docs/

コードは下記になります。
同じ階層のディレクトリに変数の設定を入れてあげてください。

## ec2_dev.tf

```
provider "aws" {
  region = "${var.region}"
}

resource "aws_instance" "dev" {
    ami = "${var.ami_id}"
    instance_type = "${var.instance_type}"
    key_name = "${var.key_name}"
    iam_instance_profile = "${var.iam_role}"
    vpc_security_group_ids = [
        "${var.sg_id}"
    ]
    subnet_id = "${var.subnet_id}"
    associate_public_ip_address = "true"
    root_block_device {
        volume_type = "gp2"
        volume_size = "8"
        delete_on_termination = "true"
    }
    tags {
        Name = "${var.tag_name}"
        env = "${var.tag_env}"
    }
}
```

https://github.com/handa3/study/blob/master/terraform/ec2/ec2_dev.tf
この動画サイト、どこのASから流れてる？～2018春～

# 概要
ISPのネットワーク運用をしていると、動画コンテンツがトラフィック全体の大半が占めている事が予想されます。
今回は、そんな動画コンテンツがどこから流れているかを調べてみました。

# この記事の主な対象者
AS運用者（Peering従事者）

# 調査方法

- インストールしたてのWindows7を用意します。
    - Windows Updateをして最新版にします。
    - Flashをインストールします。
    - Silverlightをインストールします。
- トラフィックが流れていないブロードバンドルータを用意します。
- 片っ端から動画サービスを契約します。
- 数分再生してsFlowでdstIPからsrcASを確認します。

#動画サイトどこから流れてる？
##おことわり
あくまでも、個人的な調査です。
1IPでの結果なので違いがあるかもしれません。
調査ミスもあるかもしれないので教えてください。
CDNの変更、複数CDNとの併用なども可能性あります。
日本国内での調査結果です。
つくりによってはASを跨ぐキャッシュサービス、ロードバランスサービスなどで負荷分散させているCDNがあります、その場合はできるだけ調べて元のCDNのASを掲載しています。

##更新履歴
17/06/16 Periscope(Twitterライブ配信)を追加
17/06/19 TBSオンデマンドの修正・TBS freeを追加
17/08/09 ABCバーチャル高校野球を追加
18/01/17 Yahooニュース動画の配信元が変わっているので変更
18/01/17 SHOWROOMを追加
18/06/15 大幅に更新

##定額動画配信サイト
| Services | AS | 備考 |
|:-:|:-:|:-:|
|NETFLIX | 2906 |
|Hulu | 20940 |
|dTV | 20940 |
|Amazonプライムビデオ | 3356 , 16509 | 2914流れなくなった
|DAZN | 3356,20940 |
|UNEXT | 20940 |
|NHKオンデマンド | 4713 |
|スカパーオンデマンド | 7671 |

##（主に）無料動画配信サイト
| Services | AS | 備考 |
|:-:|:-:|:-:|
|Youtube | 15169 |
|ニコニコ動画 | 38634 |
|ニコニコ生放送 | 38634 |
|AbemaTV | 20940 |
|Twitch | 46489 |
|twitcasting | 4694 |
|Ustream | 29834 |
|[春:MBS]センバツ高校野球(2017-) | 2497 | 以前は7671だった |
|[夏:ABC]バーチャル高校野球(2017-) | 2497 | 以前は7671だった |
|Gyao | 23816 , 24572 |
|Yahoo!ニュース動画 | 23816 , 24572 | 2017年調査時は24253 |
|Periscope(Twitterライブ配信) | 54113 |
|SHOWROOM |4694|
|FRESH! |16509|
|mix channel |16509|
|LINE LIVE|16625|
|17Live|36408|
|Twitch|46489|
|Live me|135391|
|Tik Tok|20940|

##TV局関連動画サイト
| Services | AS | 備考 |
|:-:|:-:|:-:|
|日テレオンデマンド | 2497 |
|ytv mydo | 2497 |
|フジテレビオンデマンド | 24253 |
|TBS FREE by TBSオンデマンド | 2497 |
|TBSオンデマンド | 16509 |2018/06/30終了予定|
|テレ朝動画 | 24253 |
|ネットもテレ東 | 17686 |
|エムキャス | ２４２５３ |
|Paravi|20940|
##ラジオ局系
| Services | AS | 備考 |
|:-:|:-:|:-:|
|radiko.jp | 7671 |
|らじる★らじる | 2497 |
|超A&G+ | 17961 , 22822 |

##R18コンテンツ
| Services | AS | 備考 |
|:-:|:-:|:-:|
|FC2動画 | 40263 |
|FC2ライブ | 63210 |
|DMM.co.jp | 23620 |
|カリビアンコム | 30212 |
|ThisAV | 174 |
|xHamster | 40824 |
|XVIDEO | 15133 |
|PornHub | 15133 |
|erovideo | 33597 |
|AVgle|174|

#最後に
今後もメンテナンスを続けていきたいと思います。
情報がありましたら教えてください！
『おもしろい』とは何か（１） @ゲームプログラマの小話[創作:エンタメ論] 

# 『おもしろい』とは何か（１）

遊んだ人がおもしろいと感じてくれるかどうか。これはビデオゲームにおいて大事なことの１つだと筆者は考えます。

でもそもそもおもしろいってどういうことなんでしょうか。今回はそのことについて書いていきます。

## おもしろい＝感情が動くこと

ビデオゲームに限らず人が「おもしろい！」と感じているとき、それは何らかの感情が動いているときです。

感情とは、喜怒哀楽と言われる「嬉しい」「腹が立つ」「哀しい」「楽しい」といったものから、「びっくり」「愛しい」「気持ちいい」「憎い」「嫌い」などなど、たくさんのものがあります。

参考：Wikipedia > 感情の一覧
https://ja.wikipedia.org/wiki/%E6%84%9F%E6%83%85%E3%81%AE%E4%B8%80%E8%A6%A7

おもしろいの定義説明がたった1文で説明できるのかと思われる方もいらっしゃるかもしれませんね。あれこれ考えを巡らせた結果、筆者は今のところこの定義がしっくりきています。

## おもしろさの度合い＝感情の動く量

さて、おもしろいと感じる際、体験によって「ちょっとおもしろい」だったり「超おもしろい！」だったり、おもしろさの度合いが違うことがあります。

このおもしろさの度合いは動く感情の量に比例します。

例えば「少し嬉しい」よりも「とても嬉しい」、「少し哀しい」より「とても哀しい」のほうがよりおもしろいと言えるでしょう。

## 感情はベクトル（矢印）で表現できる

よりおもしろくするにはより感情を動かせばよい。この理屈はとてもシンプルです。

しかし、感情を大きく動かすのはとても大変です。簡単に感情を大きく動かせたらみんなプロのエンターテイナーになれます。ビデオゲームを作る人もそうですが、お笑い芸人さんも、脚本家さんも、いかに感情を大きく動かすかについてそれぞれの知識や工夫、テクニックでがんばっています。

そんな「感情をより大きく動かす」ことを考える際に、知っておくと便利な感情の性質についてお話します。

例えば、「嬉しい」と「哀しい」という感情。「好き」と「嫌い」という感情。これらはお互い反対の感情である、というのはなんとなく想像がつくでしょうか。

このように２つの感情を「反対」と表現できるということは（エンジニアさん向けの表現になりますが）感情には正の方向と負の方向がある、と言い換えることができます。そして、前の項では感情には動く量という尺度があるという話をしました。

感情には向きと度合いがある。このことから、感情はベクトル（矢印）で表せると筆者は考えます。

例えば、「ちょっと哀しい」は -1 のベクトル、ちょっと嬉しいは +1 のベクトル。対して「めっちゃ哀しい」は -3 のベクトル、「めっちゃ嬉しい」は +3 のベクトル、といった感じです。

このベクトルのことを今回は感情ベクトルと呼ぶことにしましょう。

## 感情ベクトルを使って「よりおもしろい」を実現する

感情ベクトルの考え方を使うと感情をより大きく動かす手段を考えやすくなります。

例えば「ちょっと嬉しい」(+1)場面の前に「ちょっと哀しい」(-1)場面を体験するように仕込んでおくとします。そうすると、嬉しさ感情は -1 から +1 に変わり、動いた量でみると +2 動いたことになります。

これは、ノーマルな感情の状態(+0)から「ちょっと嬉しい」ことを体験させたときに発生する感情の動く量 +1 と比べ、より感情が動くことになります。もしこれが「めっちゃ哀しい」(-3)から「めっちゃ嬉しい」(+3)への変化だとすると +6 という結果になります。

このように、複数の感情の動きと状態を組み合わせることでより感情を動かし、よりおもしろいと感じてもらえる体験を考えやすくなります。

## おもしろくない＝感情が動いていない

ここまで「おもしろい」について話をしてきました。

では逆に「おもしろくない」と感じているときはどういう状態なのでしょうか。

これは、おもしろいの反対で感情が動いていないときです。何も感じることがないとおもしろくありません。

余談ですが、ネガティブな感情ベクトルがずっと続くと「苦痛」と感じておもしろくないと感じることがあるよーと思う方もいらっしゃるかと思います。しかしこれは場合によっては「おもしろい」と感じることがあるケースでして、詳しくは第2回以降で取り上げます。

さて話は戻して。

このおもしろくない状態である「感情が動かないとき」とはいったいどういう時におこるのでしょうか。

１つは、同じ感情ベクトルを繰り返し体験させた結果おこる「飽き」です。本来なら +3 の効果を発揮する感情ベクトルでも繰り返し同じ使われ方をすることでだんだんと 0 に近づいていき感情が動かなくなります。この場合の対応策としては、シンプルに飽きにくくする手を考えるのがよいでしょう。

もう１つは、そもそも感情が動くようにうまくプランニングできていない場合です。例えば、皆さんがビデオゲームをプレイしている中でこんな体験をしたことってないでしょうか。

- 「今、何をしたらいいのか分からない･･･。」
- 「今起きたことは自分にとって嬉しいことなの？それともイヤなことなの？まぁ気にせず続きを遊ぼう。」

どちらの例も、本当であればビデオゲーム制作者が企画した感情の動きを体験する場面であるはずです。しかし、どちらも企画者の想定した感情の動きが発生しておらず、感情が動かない結果に終わりました。新企画の開発序盤でよくおこりがちな例ですね。筆者はこの感情の状態を混乱状態と呼んでいます。

この場合の対応策として、どうして企画者の想定した状態になっていないかをまず把握すること。そして、それに対してフォローしてあげるように体験を調整していきましょう。

## まとめ

今回は「おもしろいっていうのは感情が動くってことなんだよ！」ということさえ覚えて帰っていただければ筆者としては大変満足です。

第2回へ続きます。

## おわり

リンク：[ゲームプログラマの小話-目次](http://www.10106.net/~hoboaki/wiki/index.php?%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E5%B0%8F%E8%A9%B1)
オブジェクト指向の概要について書いてみた。


## オブジェクト指向とは
wikiより
>オブジェクト指向（オブジェクトしこう）とは、オブジェクト同士の相互作用として、システムの振る舞いをとらえる考え方である。 英語の object-oriented (直訳は、「対象物志向の」「目的重視の」という意味の形容詞) の日本語訳である。 オブジェクト指向の枠組みが持つ道具立ては、一般的で強力な記述能力を持つ。

正直この説明だけでは私は分かりません。継承とか、ポリモーフィズムとか説明してもいいのですが、そういったことよりももっとシンプルに考えたほうがいいのかなと学習しながら思いました。

ですので私は以下のように考えています。
>プログラムを手順ではなくて、モノの作成と操作として見る考え方

なのかなと思います。
例えばテレビについて、中の回路の仕組みとかを知る必要はなくて、テレビという存在と操作方法が分かれば良い。みたいな感じだと思います。


ただ、この説明も私の中でこう思っているだけで、若干ずれているのかもしれません。そもそも本やサイトを探しても、明確な回答が得られない気がします。
なら、ざっくりとした考え方で捉えてもいいのかなと思います。
~~だから難しく感じる部分なのかなと思います。~~

## なぜオブジェクト指向で作るのか？目的は？

私は
>良いソフトウェアを楽に開発したいから

と考えています。

###なぜ楽に開発できるようになるのか

- 現実を手本にして、それをまねて作ればいいから。
- 現実に変化があれば、対応する部品（クラス）を修正または交換すれば簡単に修正ができる。
- 大変な作業をがなくなる。

　
>大変な作業がなくなる

これは車で例えるとわかりやすいかもしれません。
例えばA車は〇で進む、×で戻る。
B車は〇で進む、×で戻る。
C車は〇で進む、×で戻る。
と３台程度なら気になりませんがもし10000台、10000台となったときに非常に面倒です。
また、仕様変更で×で止まるになったとしましょう。もしその時10000台あったら・・・と考えるととても大変な作業になります。

ですので考え方を変えて、「車」というモノを1つ作ってやればいいんです。
「車」は〇で進む、×で戻る。
A車は「車」をコピーして、色は赤色。
B車は「車」をコピーして、色は青色。
C車は「車」をコピーして、色は黒色。
とすれば何か修正があったときに「車」を変更してあげればすべて変わります。
この仕組みが、オブジェクト指向の3大機能の1つの「継承」というやつです。



##まとめ
- オブジェクト指向とはモノの作成と操作として見る考え方
- オブジェクト指向で開発すると良いものが楽に作れる
- オブジェクト指向の3大機能、「カプセル化」「継承」「ポリモーフィズム」
配列を無理やり（破壊的/非破壊的）に操作する

配列操作を行う際には、破壊的操作と非破壊的操作がありますが、時には入れ替えたくなる時もあります。

## 破壊的操作と非破壊的操作

改めての説明は不要かもしれませんが、配列などのオブジェクトを操作する方法として、2つが考えられます。

* 破壊的操作…もとのオブジェクトを直接書き換える
* 非破壊的操作…新しいオブジェクトを作って返す

Rubyの標準ライブラリでは`map`と`map!`、`sort`と`sort!`のように、両方用意してあることも多いのですが、JavaScriptでは`map`は非破壊的なものだけ、`sort`は破壊的なものだけとなっています。

もちろん、破壊的/非破壊的に合わせた処理ができればそれが手っ取り早いのでしょうが、ときには破壊的操作をするメソッドを、非破壊的に使わないといけない、あるいはその逆、という場面も発生してしまいます。

## 破壊的メソッドを非破壊的に使う

こちらは簡単で、「配列をコピーしてからコピーに破壊的操作を加える」という手順でできます。

Rubyであれば、それ専用の`Array#dup`がありますし、JavaScriptの場合は配列の一部を取り出す`Array.prototype.slice`を引数無しで呼び出せば、全部を取り出せます。

## 非破壊的メソッドを破壊的に使う

オブジェクトの参照を入れ替えられないなどの事情で、もとの配列を変えるしかないのに、得られた値は別の配列になってしまっている、という状況のときにも、なんとかする方法はあります。

Rubyでは、ちょうど`Array#replace`というメソッドがあって、配列の中身を別な配列のものにごっそり入れ替えることができます。

JavaScriptの場合、

1. `arr.length = 0;`として配列をリセットする
2. `arr.push.apply(arr, other_arr);`、ES6なら`arr.push(...other_arr);`として、別な配列を流し込む

ことで、配列の中身を入れ替えられます（なお、疎な配列やプロトタイプが入れ替わっているものなど、特殊な配列はうまく動かないかもしれないので、ご注意ください）。
「 ⌘ + Tab 」まわりの意外と知られていないTips


## 動作保証環境

||バージョン|
|:---|:---|
|MacOS|10.12.4 / Sierra|
|HyperSwitch|0.2.575-dev (Beta)|
|意外さ|筆者の主観|

## 最前面に出すアプリケーションを切り替える☝️
**`⌘ + tab`**
これはみなさまご存知、起動中のアプリケーションを切り替えるショートカットですね。

## 同アプリケーションの別ウィンドウに切り替える✌️
`⌘ + tab`では対応できず歯がゆいのがコレでした。

次の方法で最適化しましょう！

1. システム環境設定 > ショートカット > キーボード
2. [ 次のウィンドウを操作対象にする ] にチェックを入れる

デフォルトで`⌘ + F1`になっているショートカットキー割り当てを、
**`option + ⌘ + tab`** に変更すると、あら便利！親指を少しずらすだけで対応できます！

![CFD5441799BF2352766310867659827A.jpg](https://qiita-image-store.s3.amazonaws.com/0/82699/b1d0b778-c2b1-c7e3-2733-66a259bf96f7.jpeg "CFD5441799BF2352766310867659827A.jpg")



## フルスクリーンにした上でアプリを切り替える
アプリケーションをフルスクリーンにし、メニューやツールバーを非表示にして、作業領域を広げたいことがありますよね！こうした場合、アプリ間を `Ctrl + →/←` で左右に移動させることができ、また、`Ctrl + 1/2/3…` や **`⌘ + tab`** でも切り替えることができます。

しかし、いざ制作環境としてこれを使うと、切り替え時の **超ダイナミックなスライドアニメーションに酔う** んですよ。それを理由にこれまで一切使ってきませんでした。もったいねえ。

そこで、次の方法でアニメーションをフェードに切り替えましょう！

1. システム環境設定 > アクセシビリティ > ディスプレイ
2. 右上の [ 視差効果を減らす ] にチェックを入れる

![BE39740C3AE02735E0A5EFC3D6FA9C1A.jpg](https://qiita-image-store.s3.amazonaws.com/0/82699/a4f76cea-0606-4404-6ea8-d15afbb0ac13.jpeg "BE39740C3AE02735E0A5EFC3D6FA9C1A.jpg")


はい、たったこれだけです！

### 適用前（酔うよね）
![slide-480.gif](https://qiita-image-store.s3.amazonaws.com/0/82699/01e9b164-c262-1a65-20f3-26968d77f16d.gif "slide-480.gif")


### 適用後（酔わないね）
![fade-480.gif](https://qiita-image-store.s3.amazonaws.com/0/82699/6f257b32-07ae-bdd7-3dcd-a5bb5875f9a3.gif "fade-480.gif")

画質の荒さはさておき、移動のアニメーションがとても目に優しくなりました。さらに画面が少し縦方向に広がり、制作の能率もあがるってもんです！（一切のアニメーションを消す方法があれば教えてください！）

しかし、ここでひとつデメリットが生まれました。

## HyperSwitchを導入する👉
フルスクリーンモードで各アプリケーションを起動していると、先ほど設定した「同アプリケーションの別ウィンドウに移動する」の`option + ⌘ + tab`が機能しなくなるんです...なんでだよ...💢

そこで、`⌘ + tab` の拡張というスタンスで配布されている**HyperSwitch**を導入しましょう。

https://bahoom.com/hyperswitch/

このように、同アプリケーションの別ウィンドウが一覧して見ることができ、`⌘ + tab` 実行中に `↓` で別ウィンドウを選択できるようになります！

![hyperswitch_2_777.png](https://qiita-image-store.s3.amazonaws.com/0/82699/5a0da6b2-7725-f9a1-b041-a74ea7ad1ae0.png "hyperswitch_2_777.png")
(画像：公式サイトより引用)

開いているウィンドウを一覧することができるので、
それだけでも、フルスクリーンモードで制作しない方でも入れる価値があると思います。


## おわりに💪

ちなみに、MacOSに ［全てのウィンドウを結合］ というウィンドウをタブ化する機能が実装されています。

が、それはさておき今回、 **`⌘ + tab`** で、

- アプリケーションの切り替え（元々の機能）
- フルスクリーンのアプリケーションを快適に切り替え
- 同アプリケーションの別ウィンドウに切り替え

ができるようになったはずです！

それではみなさま、良き `⌘ + tab` ライフを👋
環境変数を書き換えるホワイトボックステストなんてもうやめて

#テストコードでこんなコメントを見かけた
これだと1テストケースごとに環境変数を変更しないといけないので、
一度にテストケースを流せないですよね。

```:JUnitテストコード
    /*
     *　 注)環境変数のHOSTNAMEを「host_test1」に設定の上実施すること！
     *
    　　*/
    public void test001() {
        // assertion
    }

    /*
     *　 注)環境変数のHOSTNAMEを「host_test2」に設定の上実施すること！
     *
    　　*/
    public void test002() {
        // assertion
    }
```

#スマートなやり方
PowerMockitoなら、以下のようにモック化できます。

```
PowerMockito.mockStatic(System.class);
PowerMockito.when(System.getenv("HOSTNAME").thenReturn("host_test1");
```

複数の環境変数をモック化したいのであれば、以下のように書くこともできます。

```
Map<String, String> envMap = new HashMap<>();
envMap.put("HOSTNAME", "host_test1");
envMap.put("USER", "ops_user");

PowerMockito.mockStatic(System.class);
PowerMockito.when(System.getenv().thenReturn(envMap);
```
お前ら今すぐそのCSSフレームワーク使うのやめろ!

タイトルは釣りです。すみません。

CSSフレームワークって文章構造とスタイル情報の分離ができてなかったり、色々問題だよねって話です。
それではどうぞ。

## CSSフレームワークの問題点

以下は[Bootstrap](http://getbootstrap.com/)の公式から持ってきたサンプルコードです。
こちらのサンプルコードを見ながらCSSフレームワークの問題点を探っていきましょう。

```html
<div class="row">
  <div class="col-lg-6">
    <div class="input-group">
      <span class="input-group-btn">
        <button class="btn btn-default" type="button">Go!</button>
      </span>
      <input type="text" class="form-control" placeholder="Search for...">
    </div><!-- /input-group -->
  </div><!-- /.col-lg-6 -->
  <div class="col-lg-6">
    <div class="input-group">
      <input type="text" class="form-control" placeholder="Search for...">
      <span class="input-group-btn">
        <button class="btn btn-default" type="button">Go!</button>
      </span>
    </div><!-- /input-group -->
  </div><!-- /.col-lg-6 -->
</div><!-- /.row -->
```

### 何を構成するコードなのかわからない

CSSのサンプルなので当たり前なのですが、上記のコードからサイトのどの部分を構成しているのかを読み取ることは困難です。
かろうじて検索フォームなのがわかるくらいでしょうか。

### 文書構造定義とスタイル定義が分離できていない

```html
<div class="col-lg-6">
  <!-- ... -->
</div><!-- /.col-lg-6 -->
```

`col-lg-6`はLarge deviceで幅が6/12という意味です。
「Large deviceで幅が6/12」というのは文書構造でしょうか?
いいえ、スタイルですね。
**これがCSSフレームワークを使う最大の弊害**です。
スタイル定義がHTMLに侵食してしまうのです。

本来、文書構造に変更が生じたときはHTMLのみ、スタイルの変更が生じたときはCSSのみを変更するのが理想です。
ですが、上記の場合例えば「幅を7/12にしたい」というスタイルの変更が生じたときにHTMLを編集しなくてはなりません。
文書構造とスタイルを分離するためにスタイルシートが生まれたのにこれでは本末転倒ですね。

文書構造定義とスタイル定義が混ざることにより、凝集度は下がり、保守性は下がり、いつしかコードはカオスになっていくでしょう。
そして、戦争は繰り返され、幾つもの国が生まれては滅び、幾人もの英雄が現れては死んでき、長い年月が経った頃にはあなたのプロジェクトは終わっているでしょう。
悲しいことです。

## そんなこと言ったってどうすりゃいいのさ

### Mixinライブラリの使用を検討しましょう

[bourbon](http://bourbon.io/)などのMixinライブラリの使用を検討しましょう。
Mixinライブラリを使うことで文書構造とスタイルを分離しながら便利なCSSを使うことができます。

上のBootstrapの例を書き直すと以下のようになるでしょうか。(イメージです。実際に動くコードではありません。)

```html
<div class="search_bar">
  <div class="search_bar__search_form">
    <button class="search_bar__search_form__btn" type="button">Go!</button>
    <input type="text" class="search_bar__search_form__submit" placeholder="Search for...">
  </div><!-- /.search_bar__search_form -->
  <div class="search_bar__option_form">
    <!-- 省略 -->
  </div><!-- /.search_bar__option_form -->
</div><!-- /.search_bar -->
```

```scss
.search_bar {
  @include grid-container;
  &__search_form {
    @include grid-column(6);
    @include display(flex);
    &__input { @include flex(1); }
  }
  &__option_form {
    @include grid-column(6);
  }
}
```

### `@extend`して使いましょう

折衷案としてCSSフレームワークのクラスをextendして使う方法があります。

```scss
.search_bar {
  @extend .row;
}
```

といった感じで一個一個必要なクラスをextendして使います。
大変ですが、できないことはないでしょう。

この方法でも文書構造とスタイルを分離しながら便利なCSSを使うことができます。

## まとめ

- CSSフレームワークはお手軽にきれいなサイトができて素敵
- でも文書構造とスタイルを分離できない
  - それゆえ: コードがカオスになる
- Mixinライブラリを使うなど工夫しましょう

以上、お読み頂きありがとうございました。
今後とも宜しくお願い致します。

## 補足

CSSフレームワークについてだけ書きましたが、以下のようなCSSを書いている場合も同じ話です。

```
.m05 { margin:   5px; }
.m10 { margin:  10px; }
.m15 { margin:  15px; } 
.p05 { padding:  5px; }
.p10 { padding: 10px; }
.p15 { padding: 15px; } 
```

身に覚えがないですか？
UnityのTextで特定の1文字の座標を取得する方法

以下は、UnityEngine.UI.Textの各文字それぞれの座標を取得するコードです。

```C#
Text message;

// 中略

IList<UIVertex> verts = message.cachedTextGenerator.verts;
float unitsPerPixel = 1 / message.pixelsPerUnit;
for (int i = 0; i < message.text.Length; i ++) {
	int vertIndex = i * 4;
	UIVertex topLeftVert = verts[vertIndex];
	topLeftVert.position *= unitsPerPixel;
	UIVertex bottomRightVert = verts[vertIndex + 2];
	bottomRightVert.position *= unitsPerPixel;
	Vector3 centerPosition = (topLeftVert.position + bottomRightVert.position) / 2f;
	print (string.Format("「{0}」の中心座標は{1}です", message.text[i], centerPosition));
}
```

```i``` を指定してあげれば、特定の文字の座標が取得できます。
Qiita の Markdown では class が使える —— 修正されました

class 属性が使用できる脆弱性（？）は修正されたようです。
[修正前のこの記事のキャプチャ画像](https://qiita-image-store.s3.amazonaws.com/0/181958/f01793a3-b851-36e9-3b79-7e2a05010d39.png)
以下、古い情報。

---

Qiita に投稿するには Markdown を使います。
Markdown には HTML を混ぜられますが、こういった投稿サイトでは使えるタグや属性に厳しい制限があるのが普通です。

ところが、どうやら class 属性は自由に付けられるようなのです。
参考: [Qiitadon の投稿](https://qiitadon.com/users/htomine/updates/6247)
Font Awesome のクラスなど、色々使えそうですね。
（たぶん期間限定ですよね。こういったものは投稿するだけ野暮かも知れませんが、「知識を共有しよう」という事で）

---
<div class="ArticleMainHeader">緑のヘッダ</div>
---
<div class="fa fa-spin">回転する</div>
---
<div class="fa-5x">大きい</div>
---
<div class="fa-flip-vertical">逆さま</div>
---
<div class="fa fa-rotate-90">縦になる</div>
---
ServiceNowでプロジェクトを管理する - ガントチャートを利用する -

[前回](http://qiita.com/Kisaragi13/items/d89e1b9a7a66bfc2a97e)はプロジェクト管理プラグインを導入したので、今回はその使い方、特にガントチャートの利用について記載します。
インスタンスのビルドタイプはIstanbul。

この記事をご覧の方の殆どがご存知の通り、ガントチャートはプロジェクト管理などで用いられる作業計画を図示したもので、WBSにリソース（担当者）や作業期間を追加したものです。各作業計画（タスク）の連動関係やマイルストーンを視覚的に確認することが出来るので多くのプロジェクトマネージャーが利用しているのではないでしょうか？

![image.png](http://wiki.servicenow.com/images/9/9e/Gantt_chart_example.png)

　ガントチャートの有用性は言わずもがななのですが、個々人による作業進捗の登録や追加、割り込み作業、また作業内容の報告などを纏めて行えるような製品は（Redmineなどもありますが）多くはないと認識しているので、1プラットフォーム上で多くの機能を実現できるServiceNowの強みが活かせると思います。と言うより、私はRedmineのチケットベースのプロジェクト管理を参考にServiceNowのプロジェクト管理プラグインが作られたのではと見ています。

では、ServiceNow上でのガントチャート利用手順について説明します。

# ガントチャートを表示する

インスタンスにログイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/3f5b1f4f-f158-35e5-8456-1ef466299c53.png)

アプリケーションナビゲータの中から、プロジェクト管理 → プロジェクト → 計画立案コンソールを選択（<font color="red">赤枠</font>）。
<font color="red">**[注意] プロジェクト管理には「自分のガント」というのがありますがこれとは別です！**</font>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/8f74de8d-847f-f5d7-8d90-45a97098060c.png)

画面右上にあるプロジェクト一覧から目的のものを選択（必要な場合）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/f8c951d8-a49a-8e82-a136-d0542dabfe49.png)

選択したプロジェクトのガントチャートが表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/935bf278-c3a4-1b6b-f049-3a6c7f69abae.png)

# ショートカットキー一覧
画面右上のハテナ（？）マークから確認できる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/17b71ab0-3470-aaeb-cf40-5805dad655f7.png)

| 分類 | 機能 | ショートカットキー |
|:-:|:-:|:-:|
| タスク操作 | 選択しているタスクの上に新規追加 | **Alt + Shift + ↑** |
|  | 選択しているタスクの下に新規追加 | **Alt + Shift + ↓** |
|   | 選択中のタスクを上に移動 | **Shift + ↑** |
|   | 選択中のタスクを下に移動 | **Shift + ↓** |
|   | 選択中のタスクを削除 | **Delete** |
|   | タスクをグループタスクに変更 | <font color="red">**グループタスクとなるタスクの下タスク行で**</font> **Shift + →**（下のタスク行が子タスクになる） |
|   | グループタスクを解除 | <font color="red">**現グループタスクの各子タスク行で**</font> **Shift + ←** |
| カーソル操作 | 一つ上のタスク行を選択する | **↑** |
|   | 一つ上のタスク行を選択する | **↓** |
| 折りたたみ、展開 | グループタスクの子タスクを非表示（折りたたみ） | **←** |
|   | グループタスクの子タスクを非表示（展開） | **→** |

# 一部機能紹介
全部やるときりが無いので、一部を紹介します。

## タスク期間の変更
一般的なガントツールと同じく、マウス操作でざっくりとしたタスク期間の変更が可能です。
![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/175688/fc8caae3-397c-0d59-cb52-d4af3198d627.gif)

## リンク（依存関係）の設定
こちらも一般的なガントツールと同様です。
![sample2.gif](https://qiita-image-store.s3.amazonaws.com/0/175688/38c2da83-2d36-cd87-7b01-2db7bd321d51.gif)

## クリティカルパスの表示
メニューの一番右にある、三角に！マーク &#9888; のアイコンをクリックするとクリティカルパスを表示することが出来ます。
（赤くなっているところがクリティカルパス）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/2bbdf4ff-40dc-ff9d-c562-b3946aca8bac.png)

# さいごに
纏めると、ServiceNowのガントチャートは必要なものを抑えていて使い勝手は充分に思えました。
ディベロッパーインスタンスは無料で作れるので、興味がある人は試してみてください。

# 関連記事

> - [ServiceNowでプロジェクトを管理する - ServiceNow ITプロジェクト・ポートフォリオ管理 -](http://qiita.com/Kisaragi13/items/d89e1b9a7a66bfc2a97e)
> <br/>→ 今回使ったプロジェクト管理プラグインの導入手順に関する記事
> - プロジェクトを作る（作成中）
> - タスクを登録する（作成中）

# 参考サイト
> 
> 『ServiceNow Wiki (Product Documentation) - Project Manager 』
> http://wiki.servicenow.com/index.php?title=Project_Management
ServiceNowでプロジェクトを管理する - ServiceNow ITプロジェクト・ポートフォリオ管理 -

本記事では、ServiceNowインスタンスに「**プロジェクト・ポートフォリオ管理**」機能の導入手順を説明する。
インスタンスのビルドタイプはIstanbul。

# ServiceNow Project Portfolio Management
引用：[公式サイト](https://www.servicenow.com/jp/products/project-portfolio-management.html)より紹介文
> ServiceNow Project Portfolio Management（PPM）は、企業全体のプロジェクトやプロジェクト・ポートフォリオを管理するための、汎用性とスケーラビリティに優れた手法を提供します。リスト、フォーム、ゲージ、ガントチャート、ダッシュボード、タイムラインの視覚情報を見ながら、コスト管理やリソース計画の策定を行い、品質標準を達成することができます。

公式にある通り、この機能を用いることでServiceNow上でプロジェクトを管理することが容易になります。社内でServiceNowを活用している場合、ServiceNow上に保管されたリソースを管理ツールと直接紐付けることが出来るため管理コストが少なく済み、また問題点を分析することも容易になります。

ディベロッパー向けのインスタンスでも無償で使えるので、まずは試してみましょう。

# プラグインを導入する

インスタンスにログイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/3f5b1f4f-f158-35e5-8456-1ef466299c53.png)

アプリケーションナビゲータの中から、システム定義 → プラグインを選択（<font color="red">赤枠</font>）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/b4a5e213-06bc-7961-50e7-d2248efff163.png)

アプリ内検索欄に「**Project Portfolio Suite with Financials**」と入力し、Enterキー。
検索結果から「**Project Portfolio Suite with Financials**」を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/4e86b0aa-9f3c-ab7d-92bc-163a5e6bbb93.png)

続いて赤枠の位置にある「**有効化/アップグレード**」リンクをクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/7df4ad35-91aa-2b05-b8d2-ec2c74516c17.png)

確認画面が出るので「**有効化**」ボタンをクリック。
（デモデータのロードを行うか任意）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/9f6325cb-af9a-631b-9317-67cf06e46c21.png)

終わるまで待つ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/e90636bd-5343-8816-97ce-4ea1faaf52ab.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/d1c2717e-e71b-8589-6af3-c3490da183cb.png)

以上でプラグインの導入作業は終了です。

# 関連記事
プロジェクト管理関連
> - プロジェクトを作る（作成中）
> - タスクを登録する（作成中）
> - [ServiceNowでプロジェクトを管理する - ガントチャートを利用する -](http://qiita.com/Kisaragi13/items/9ddf07d1ebf16251cf1f)

# 参考サイト
> 
> 『ServiceNow Wiki (Product Documentation) - Project Manager 』
> http://wiki.servicenow.com/index.php?title=Project_Management
railsconfigのsettings.ymlの読み先を、Rails.envではなく環境変数で切り替わるように


### バージョン
config (1.4.0)
spring (2.0.2)


```rb:Gemfile
group :development, :test do
  gem 'spring'
end

gem 'config'
```

### 環境変数 SETTINGS_YML_NAME を優先して見るように
```rb:config/initializers/config_environment.rb
if name = ENV['SETTINGS_YML_NAME']
  Settings.add_source!("config/settings/#{name}.yml")
  Settings.reload!
end
```

settings.yml -> development.yml -> SETTINGS_YML_NAME.yml の順に優先度が高い([上書きしている](https://github.com/railsconfig/config/blob/1.4.0/lib/config/options.rb#L68))

array型をymlで設定していたら↑の読み込み順に追加されてしまうので、以下のように `config.overwrite_arrays = true` しておく。

```rb:config/initializers/config.rb
Config.setup do |config|
  config.const_name = "Settings"
  config.overwrite_arrays = true
end
```


### springを再起動しなくても読み直すように
```rb:config/application.rb
class Application < Rails::Application
  Config::Integrations::Rails::Railtie.preload
end
```

```rb:config/spring.rb
if defined? Spring
  Spring::application_root_path ||= Rails.root
  Dir.glob('config/settings*').each{ |settings| Spring.watch settings }
  Dir.glob('config/settings/*').each{ |settings| Spring.watch settings }
end
```
【メモ】boto3でs3のcsvをpandasに読み込む

```py
import pandas as pd
from io import StringIO
import boto3
ACCESS_KEY = 'your access key'
SECRET_KEY = 'your secret key'
client = boto3.client('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
paginator = client.get_paginator('list_objects')
pageresponse = paginator.paginate(Bucket="your bucket")
for pageobject in pageresponse:
    for file in pageobject["Contents"]:
        obj = client.get_object(Bucket="your bucket", Key=file["Key"])
        content = obj['Body'].read().decode('utf-8')
        reader = pd.read_csv(StringIO(content))
        print(reader)
```
新人エンジニアに身に付けてもらいたい、7つの力

ここ何年か新人研修に携わった際に、新人エンジニアに身に付けてほしいと感じた内容をまとめました。

専門的な話ではなく基礎的なスタンスですが、これらを身に付けたエンジニアは特に成長できると思います。
無限の可能性を秘めた新人エンジニア諸氏へ、今後の参考になればと投稿します。

# 7つの力
## :pencil:学ぶ力
 - 様々なことに興味を持てる
    - 万物は何らかの形で繋がっているため、安易に物事を切り捨てない
 - 知識を得ることに喜びを感じられる
   - 未知・無知は怖いことではない
   - 小さな子どものように「新たな事を知る・理解する」ことを楽しもう

## :thinking:考える力
 - なぜそうなるのか、なぜそうしているのかを疑問に思い考えられる
 - どうあるべきかを推測することができる
   - 今ある情報から「きっとこうなる」「こうすればできる」が考えられる
 - どうするべきか、どうあるべきかを突き詰められる
   - 最適解について向かっていく力と根気がある

## :mag:調べる力
 - 疑問に思ったこと調べる癖をつける
 - 調べる内容にある程度アタリがつけられる
 - 何を用いて調べれば良いかを判断できる
 - 検索エンジンを上手く使いこなせる
   - キーワードの指定内容
   - 検索オプションの設定
   - Web上の情報を盲信しない

## :ear_tone1:聞く力
 - 何を誰に聞くべきかの判断がつけられる
 - 質問が適切に行える
   - 疑問に思っている内容と背景を簡潔に伝えられる
 - 回答を自身で消化できる
   - 聞いたままの状態で放置しない
 - 良い質問の仕方については「[質問力の上げ方](http://qiita.com/y-tsuna/items/fd16e185cc0191abe964)」を参考にどうぞ

## :speaking_head:伝える力
 - 伝えるべき内容を判断できる
   - なぜ、誰に、何を伝えるべきかが理解できる
 - 伝えるべき（相手の欲する）情報が判断できる
 - 事実と考察を分けて伝えることができる
 - 自身の行動、考えを他者へ簡潔に伝えられる
   - 口頭、文字どちらも大事
   - 言葉はその場で訂正しやすいが文書はリアルタイムで訂正しづらい
   - 文章（日本語）の書き方は凄く大事！
   - 図や表、グラフなどの表現を適宜使えると更に良い

## :pray_tone1:頼る力
 - 仲間、先輩を頼ることができる
   - 特に新人はアラートを上げないことが多い（アラートの上げ方、タイミングが分からない）
   - 「〇〇分かけて解決しなかったら誰かに聞く」みたいなルールを決めると良い
 - 勉強と違い仕事はチームプレイであることを認識できる
   - 個人タスクの背景には組織としてのゴールがある
   - 企業に属する以上、組織のゴールを目指さねばならない
   - 一人は皆の為に、皆は一人の為に、の精神でいこう

## :straight_ruler:見積もる力
 - タスクの作業時間（量）を見積もることができる
   - タスクに対して常に見積もる癖がついている
   - タスクに対して作業工数と対応日数を考えられる
     - この工数とは会社が支払うコスト（人件費）である
   - 見積もる際の精度が徐々に上がっていく
       - ※新人にはいきなりは難しいので、徐々に身に付けていってほしい
Google短縮URLのクリック数などのデータを見る - Google URL Shortener


![Kobito.SVYVBT.png](https://qiita-image-store.s3.amazonaws.com/0/58800/01bf0afa-eb81-78dc-6a25-bbb37b85f5d5.png "Kobito.SVYVBT.png")

こ、こんなデータが見れるなんて知りませんでした(´・ω・｀)

## アクセスの仕方

短縮URLを発行します。下にサンプルで私のQiitaのプロフィールの短縮URLを入れました。
https://goo.gl/TIsmHR


データ分析ページにアクセスするにはURLの末尾に + を付けるだけです。

https://goo.gl/TIsmHR+

ね？かんたんでしょう。
っていうかGoogleさんすごいですね。
python3 で、Google datastore のデータを読む

Google datastore の次のデータを python3 で読みます。
![datastore_jun13.png](https://qiita-image-store.s3.amazonaws.com/0/179446/f22576ef-3309-2c3a-40cb-ad8ed0483745.png)

```py3:datastore_read.py
#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
#	datastore_read.py
#
#						Jun/13/2017
# ------------------------------------------------------------------
import sys
import json
import datetime
from gcloud import datastore
#
sys.stderr.write("*** 開始 ***\n")
client = datastore.Client("my-project-aug-29-2016")
query = client.query(namespace='test',kind='test')
#
results = query.fetch()
#
for unit in results:
#	print(unit)
#	print()
#
	str_out = unit['name'] + '\t'
	str_out += str(unit['population']) + '\t'
	str_out += unit['date_mod'].strftime("%Y/%m/%d %H:%M:%S")
	print(str_out)
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行スクリプト

```bash
export GOOGLE_APPLICATION_CREDENTIALS=my-project-aug-29-2016.json
./datastore_read.py
```

実行結果

```text
*** 開始 ***
宇都宮	41295	2017/06/13 00:01:12
小山	38756	2017/06/13 00:02:18
佐野	71294	2017/06/13 00:03:48
足利	27138	2017/06/13 00:04:49
日光	74682	2017/06/13 00:05:47
下野	82951	2017/06/13 07:39:28
*** 終了 ***
```

次の環境で動作の確認をしました。

```text
$ uname -a
Linux ekzemplaro.org 4.16.13-2-ARCH #1 SMP PREEMPT Fri Jun 1 18:46:11 UTC 2018 x86_64 GNU/Linux
$ gcloud --version
Google Cloud SDK 192.0.0
```
command > ファイルの特定行を変更し、処理後に元に戻す > sedは断念 | diffとpatchの使用

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.9.2 (とgfortran) : sclで設定
NCAR Command Language Version 6.3.0
WRF v3.9を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

### やりたいこと

- ファイルの特定行だけ変更する
- ファイルの特定行を元に戻す
- 異なるパラメータ値を持つ、多くのファイルに対して同じ処理を行う

### ファイル例

```data1a.txt
314
A,B,C,D,E ! This is comment 
```

```data1b.txt
314
F,G,H,I,J ! This is comment 
```

```data2.txt
271
A,B,C,D,E ! This is comment 
```

```data3.txt
6022
A,B,C,D,E ! This is comment 
```

data2.txtとdata3.txtに対して以下のようにしたい

- 2行目を`F,G,H,I,J ! This is comment `にする
- 2行目を`A,B,C,D,E ! This is comment `に戻す

sedで書くと大変になりそうなので、diffとpatchを使うことにした。

参考: http://qiita.com/bunzaemon/items/e97bbd660f7319c372bd
情報感謝です。

### 実施例

準備

```
$diff data1a.txt data1b.txt > diff_1a1b 
$diff data1b.txt data1a.txt > diff_1b1a
```

実施

```
$patch data2.txt diff_1a1b 
とある処理
$patch data2.txt diff_1b1a 
とある処理
$patch data3.txt diff_1a1b 
とある処理
$patch data3.txt diff_1b1a 
とある処理
```

書式が決まった設定ファイルのパラメータ値を変更するため、設定ファイルを出力するbash scriptやPython scriptを用意する場合、書式ずれに注意が必要になる。

安易な方法としてこちらの方法を検討した。
カスタム URL スキームのチェックを CLI から行う

Android, iOS でチェックしたい。

## Android

```
adb shell am start -W -a android.intent.action.VIEW -d "example://foo/bar"
adb shell am start -W -a android.intent.action.VIEW -d "http://www.example.com/foo/bar"
```

## iOS

```
xcrun simctl openurl booted example://foo/bar
```
Docker覚え書き

(2017/06/13時点)


# 導入
macへの導入は、[docker for mac](https://docs.docker.com/docker-for-mac/install/)。入れると`docker`コマンドが使えるようになる。

# 使い方
**dockerイメージ**をpullしてきて、イメージから **コンテナ**を作る。
コンテナを`commit`して新しいイメージにできる。

## コンテナ起動

```bash
$ docker run hello-world
```

`run`はローカルになければイメージを`pull`してきてくれる。

```bash
$ docker pull hello-world
```

## イメージ
### 一覧

```bash
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              ebcd9d4fca80        4 weeks ago         118MB
hello-world         latest              48b5124b2768        5 months ago        1.84kB
```

### 削除

```bash
$ docker rmi <ImageID>
```

## コンテナ一覧
`-a`で停止中もすべて表示。
`-q`でidのみを表示。

```bash
$ docker ps -aq
```
## コンテナ削除

`docker ps`で表示されるIDを指定。

```bash
$ docker rm <ID>
```

### すべてのコンテナを削除

```bash
$ docker rm `docker ps -aq`
```

### ホストのディレクトリをマウント
`-v`で`[ホスト]:[コンテナ]`のパスを指定するとマウントされる。
`-w`はコンテナでのカレントディレクトリを指定できる。

```bash
$ docker  run  -v `pwd`:`pwd` -w `pwd` -it  ubuntu bash
```
利用ケースからWeakMapを理解する

## WeakMap概要
Mapと違って、キーとして使われるオブジェクトが生きているうちに、WeakMapがキーの参照を持ちますが、WeakMap以外誰にも使われていなければ、ガベージコレクションによってキーオブジェクトのメモリを解放してしまいます。つまり、キーの参照が弱い参照であり、自動的に削除される可能性があります。
次は、利用ケースでなぜWeakMapが必要なのかを理解しましょう。

## 利用ケース

下記execute関数が複数回に呼ばれることがあり、同じ引数objで実行される回数が10の倍数になったら、そのobj情報をシステム上に通知を行います。

```js
// マップキーが文字列ではなく、オブジェクトです
let map = new Map();

function execute(obj){
  doSomethingWith(obj);

  // 既存の回数を取得
  const called = (map.get(obj) || 0) + 1;
  map.set(obj, called);

  // 10回目で
  if(called % 10 === 0) {
    report(obj);
  }
}
```

- 上記実装の問題点

　例え、上記objがシングルページアプリケーションのDOMエレメントの場合、DOMが大量に生成されたり、破棄されたりとします。破棄されたDOMエレメントが上記回数を統計するmapのキーになっているため、GC処理対象外になり、メモリリークが発生してしまいます。
　本来は、生きているDOMエレメントを絞って統計したいにもかかわらず、死んでしまったDOMエレメントの情報も残されてしまいます。

- 考えられるアプローチ：DOMエレメントのdeleteイベントでmapから削除する

　DOMエレメントのdeleteイベントを監視し、発生したらmapから該当objを削除するように実装すれば、メモリリーク問題が解決になります。
　ただ、そうしますと、監視マップとDOMエレメントが相互的に相手の存在を意識しなければならないし、処理も複雑になり、バグが入りやすいですね。
　いよいよWeakMapの登場です。

- WeakMap案

GCによりキーオブジェクトの廃棄と共に、WeakMapから該当データが自動的に削除されるので、実装がシンプルになります。

```js
// マップキーが文字列ではなく、オブジェクトです
let map = new WeakMap();

function execute(obj){
  doSomethingWith(obj);

  // 既存の回数を取得
  const called = (map.get(obj) || 0) + 1;
  map.set(obj, called); // 設定したが、GCにより自動的に削除される

  // 10回目で
  if(called % 10 === 0) {
    report(obj);
  }
}
```


## 参考記事
[WeakMap(MDN)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)
[What are the actual uses of ES6 WeakMap?](https://stackoverflow.com/questions/29413222/what-are-the-actual-uses-of-es6-weakmap)
曲が消えずにiTunesに保存している音楽をiPhoneに移す

＃iTunesに保存している音楽をiPhoneに追加する

高速でiTunesからiPhoneに音楽を追加する方法はご存じですか？CDから曲をコピーするように、iTunesから購入されていない音楽をiPhoneに入れたいですか？

そのようなことをしたいなら、次の記事を参考してください。

いつでも最高品質のミュージック、好きなアイドルの曲を楽しめるには、CDを購入して、音楽をiTunesに保存しますね。その場合、iTunesの保存している音楽をiPhoneに同期して、iPhoneにも聞けます。

でも、iTunesなら、iPhoneに既存しているデータが消えて、やっぱりいやです。

なので、ここで、他の方法を試してみましょう！

続きて読む＞
https://www.imobie.jp/support/how-to-import-music-to-iphone.htm
python3環境にmatplotlibを追加

$ easy_install pip

$ pip install --upgrade setuptools

$ pip install --upgrade pip

$ pip install matplotlib

$ mkdir .matplotlib

$ cd .matplotlib/

$ touch matplotlibrc

$ echo "backend : TkAgg" >> matplotlibrc 

なんだこのバックエンドってのは・・。

.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')

なんか怒られているし・・。
謎が多い。
一応動くなー。
beegoのbeeツールでmigrateするときの設定ファイル

GoでフルスタックなWAFだとbeegoかrevelだと思いますが、日本では圧倒的にrevelが多いっぽく、beegoの情報少なくて、見つからなかったのでメモがてらに書いておこうと思います。

## 普通に　bee migrateする場合

まず、特に設定ファイルをおかずにbee migrateする場合は、こんな感じ。

**あ、beegoはデフォルトがmysqlなので、mysqlだとdriverとか書かなくていいので、全部postgresqlで書きます**

```bash
$ bee migrate -driver="postgres" -conn="postgres://user:password@host:5432/dbname?sslmode=disable"
```

これ毎回書くの辛いです。
しば〜らく書いてて辛かったです、暗記したころに設定ファイル化できることを知りました、、、

## 設定ファイル版

beeツールのconfigはjsonとyamlに対応しているようで

```
・bee.json
・Beefile（yaml形式）
```

beeコマンドを実行したディレクトリにどちらかが置かれていればそれを読み込みます。

ということで、先程のbeeコマンドを設定ファイルに落とし込むとこんな感じです。

```json:bee.json
{
    "database": {
        "driver": "postgres",
        "conn": "postgres://user:password@5432/dbname?sslmode=disable"
    }
}
```

これで、

```bash
$ bee migrate
```

だけで実行できるようになりました！
もちろん、bee.jsonとかBeefileはbeeツール全般の設定ファイルなので、baleとかの設定も書くことが可能です。（詳しくはbee/config/conf.goのstruct参照）

---

ただ、同じbeegoなんだから、conf/に特定のkeyで置いとけば勝手にそっち見てくれるようにしてほしいっていうのが実際のところ、、、

ちなみに関係ないですが、postgresqlでbee migrateすると、mysqlのドライバを何故か求められます(´・ω・｀)
Docker for MacでコンテナをTime Machineのバックアップ対象から外す

いつの間にかバックアップされるようになっていた(？？？）ので。 `(Version 17.03.1-ce-mac12 (17661))`

「Preference」 -> 「General」 -> 「Include VM in Time Machine backups」 のチェックを外します。

![スクリーンショット 2017-06-13 17.40.40.png](https://qiita-image-store.s3.amazonaws.com/0/50184/b0963ab3-4668-4238-4148-74c0c7975580.png)

確認。

```
$ sudo mdfind "com_apple_backup_excludeItem = 'com.apple.backupd'" | grep docker
/Users/terukizm/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
/Users/terukizm/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux

$ du -sh /Users/terukizm/Library/Containers/com.docker.docker/Data/
 10G	/Users/terukizm/Library/Containers/com.docker.docker/Data/
```

そもそも10Gとか、普通に溜め込み過ぎなだけでは？という気もしますが…


参考: 
* https://forums.docker.com/t/excluding-docker-images-from-time-machine/15985/6
* https://apple.stackexchange.com/questions/25779/on-os-x-what-files-are-excluded-by-rule-from-a-time-machine-backup/25833#25833
max osx に python xgboost を入れる(llvm版)

pyenv で構築した python3 環境に `pip install xgboost` すると `clang-omp++` が無いと言われる。 `brew install clang-omp` をすると `llvm` と一緒になったからそっちを入れろと言われる。だが `brew install llvm` しても無いと言われる。色々ググって、シンボリックリンクを貼ればなんとかなると知った

```
brew install llvm
ln -s /usr/local/opt/llvm/bin/clang /usr/local/bin/clang-omp
ln -s /usr/local/opt/llvm/bin/clang++ /usr/local/bin/clang-omp++
ln -s /usr/local/opt/llvm/lib/libomp.dylib /usr/local/lib/libomp.dylib
pip install xgboost
```

本当にこれでいいのか疑問だが…
fontawesomeすごい

<i class="fa fa-spin fa-3x fa-fw" aria-hidden="true"> 
<i class="fa fa-refresh fa-spin fa-3x fa-fw" aria-hidden="true"></i>
<i class="fa fa-refresh fa-spin fa-3x fa-fw" aria-hidden="true"></i>
<i class="fa fa-refresh fa-spin fa-3x fa-fw" aria-hidden="true"></i>
<i class="fa fa-refresh fa-spin fa-3x fa-fw" aria-hidden="true"></i>
<i class="fa fa-refresh fa-spin fa-3x fa-fw" aria-hidden="true"></i>
</i>
ArduinoのBlinkスケッチを書く

ArduinoにおけるHelloWorld的な存在である、LEDが点滅するプログラム（スケッチ）を設計した上で書いてみる。

リポジトリ：demo-blink　https://github.com/pixtc/demo-blink

# 回路
```
電源（5V)→ 抵抗（270Ω）→ ダイオード（赤色・1.8V:12mA）→ 13番ピン
```
の順に接続する。

# プログラム

## 定数を定義（define.h）

プログラムの可読性を高めるため、定数を定義する。

```C
#define LED 13  // LEDピン番号

#define LED_ON  HIGH  // LED点灯
#define LED_OFF LOW   // LED消灯
```

## LEDについて用意する関数とグローバル変数

LEDについて、下の表に示される関数を定義する。

| 関数名 | 戻り値型 | 引数 | 説明 |
|:-----------|:------------|:------------|:----|
| InitLed | void | void |LEDを初期化する
| TickLed | void | void |LEDを駆動させる

また、下の表に示されるグローバル変数を定義する。

| 変数名 | 変数型 | キーワード | 説明 |
|:-----------|:------------|:------------|:----|
| NowLed | boolean | static |LEDの点灯・消灯の状態を格納する

### LEDを初期化する（InitLed）

```C
#include "define.h"

static boolean NowLed;  // LEDの点灯・消灯

/*
 * LEDを初期化する
 */
void InitLed(void){
  NowLed = LED_OFF;
  pinMode(LED, OUTPUT);        // デジタルピンを出力に設定する
  digitalWrite(LED, NowLed);  // LEDを消灯する
}
```

### LEDを駆動させる（TickLed）

```C
#include "define.h"

static boolean NowLed;  // LEDの点灯・消灯


/*
 * LEDを駆動させる
 */
void TickLed(void){

  // LEDが点灯中
  if(NowLed) {
    NowLed = LED_OFF;
  }
  
  // LEDが消灯中
  else {
    NowLed = LED_ON;
  }

  digitalWrite(LED, NowLed);  // LEDを点灯もしくは消灯する
}

```

## メインのスケッチ

```
#include "define.h"

void setup(){
  InitLed();   // LEDを初期化する
}

void loop(){
  TickLed();   // LEDを駆動する
  delay(500);  // 500ms待機する
}
```

# 動作を確認

コンパイルして動作を確認すると、LEDが500msごとに点滅と消灯を繰り返す。