OmniAICreator/Qiita-1.07M huggingface dataset:
Web Audioでサンプラー作ってみた

この記事は [WebAudio Web MIDI API Advent Calendar 2016](http://qiita.com/advent-calendar/2016/webaudio) の14日目です。

今回の目的はズバリこれ。

**「x-tonegeneratorを使ってサンプラーを作る」**

`x-tonegenerator` をせっかく作ったので何か面白いものが作れないかと模索してみたところ、録音できたらサンプラーできそう、ということでサンプラー作ってみました。録音部分はお得意のPolymerのエレメントにしています。

#x-tonegenerator って？
PCM（Pulse-code Modurationの略、簡単に具体的に言うならば、例えばWaveデータ）シンセサイザの音源エンジン部分をブラックボックス化したPolymerのエレメントです。詳しくは、[3日目のWebAudio Web MIDI API Advent Calendar 2016](http://qiita.com/ryoyakawai/items/7bfd6e2b208bdd96588a) を御覧ください。

#サンプラーって？
「音楽的・非音楽的を問わずサンプリングにより標本化された「音」を任意に再生出力することの出来る装置。」(引用：[wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%A9%E3%83%BC) as of 2016/12/14)
楽器としてはやはり音階をつけないと使えないので、その音を音階として演奏できる機械です。

ちなみに、類似のエントリーで[8日目のWebAudio Web MIDI API Advent Calendar 2016「ヴォコーダーを作ってみる」](http://qiita.com/Thought_Nibbler/items/a1ae0622fd3248d5bd6d)もありました。

#デモアプリ
[デモアプリはこちら](https://ryoyakawai.github.io/x-tonegenerator/sampler/)です。
（モバイルではみ出ますね😱）
[<img width="300" alt="Screen Shot 2016-12-14 at 1.55.10 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/61221/ad64b38b-4152-fa0d-6d1e-8e784f077c71.png">](https://ryoyakawai.github.io/x-tonegenerator/sampler/)
表示直後に画面内の鍵盤をマウスでクリックするとピアノの音がなります。
では次に適当な音を録音してみましょう。
<img width="90" alt="Screen Shot 2016-12-14 at 2.00.05 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/61221/b0468201-fe1a-256e-a766-29ba971336e8.png">
アプリ内のこのボタン▲をクリックすると録音が開始して、もう一度クリックすると録音が停止します。すると、冗談の部分がこんな感じでグラフが出てきます。このグラフが録音をした音声になります。

<img width="452" alt="Screen Shot 2016-12-14 at 2.01.34 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/61221/fe24bdc5-3429-3b49-fbba-f9f7020043b3.png">

この時点で音は鍵盤に割り当てられていますので、画面内の鍵盤をクリックしてみましょう。

サンプラーってこんな感じです。

#今回のPolymerのエレメント
[x-recorder.html](https://github.com/ryoyakawai/x-tonegenerator/blob/master/x-recorder.html)と名前をつけました。
以下のことができるエレメントです。

 + 録音
 + 録音した音声の数値化
 + 録音時のレベル表示
 + 録音後のグラフ表示

それでは[ソースを見てみましょう](https://github.com/ryoyakawai/x-tonegenerator/blob/gh-pages/sampler/index.html)。
この部分が録音をするエレメントです。

````html:html
<x-recorder id="recorder"></x-recorder>
````

グラフも録音/停止ボタンもこのエレメントが持っていますので特に付け加える必要はありません。（今回はデザインの変更はできませんが、変更できるようにエレメントを作ることは可能です）

以下のコードで `x-tonegenerator` に対して、録音した音源をセットしています。

````javascript:JavaScript
const rd=document.querySelector("#recorder");
rd.addEventListener("record-stop", (event) => {
    num++;
    const buf=rd.getAudioBuffer();
    tg.setInstantVoicebByFloat32Array("test_"+num, 60, buf.Float32Array.data);
    tg.setVoice(0, "test_"+num);
});
````

4行目のこれ▼で `x-recorder` から数値化した音声データを取得し、

````javascript:JavaScript
const buf=rd.getAudioBuffer();
````

5行目のこれ▼で `x-tonegenerator` に音源としてセットします。
第一引数は音源の名前を指定、第2引数はセットした音源がMIDIの鍵盤番号でどれにあたるかを指定、そして第三引数で音声データをします。

````javascript:JavaScript
tg.setInstantVoicebByFloat32Array("test_"+num, 60, buf.Float32Array.data);
````

#まとめ
今回は `x-recorder` という録音ができるエレメントを追加することで、`x-tonegenerator` をサンプラーとして使ってみました。
`x-recorder` に波形操作の機能も追加したら高性能なサンプラーになりそうですね🙂
[Java][Spring] Spring Boot依存性注入の不可解なハマリネタ

わかっているひとにとっては当たり前なネタなのかもですが、大いに苦しめられたのでここにお披露目します。

# 環境

- Spring Boot 1.2.7
- Java 1.8.0 102

# 前提

こんなレポジトリインターフェースたちがありました。

- MenuRepository
- CategoryRepository
- UserRepository

ユニットテストのため、各レポジトリのモックを返すConfigurationクラスを作りました。

```java:MyConfig.java
@Configuration
public class MyConfig {
    @Bean 
    public MenuRepository menuRepository() {
        return Mockito.mock(MenuRepository.class);
    }

    @Bean 
    public CategoryRepository categoryRepository() {
        return Mockito.mock(CategoryRepository.class);
    }

    @Bean 
    public UserRepository userRepository() {
        return Mockito.mock(UserRepository.class);
    }
}
```

注入先のテストはこんなんです。

```java:MyTest.java
// 略
public class MyTest {
    @Autowired
    private MenuRepository menuRepository;

    @Autowired
    private CategoryRepository categoryRepository;

    @Autowired
    private UserRepository userRepository;
}
```

# 不可解な動き

`categoryRepository`@Beanメソッドは呼ばれるのに、他の@Beanメソッドは呼び出されません。

結果、注入先では`CategoryRepository`だけがモックになっているという。。。

コンテナの中身を見ると、`CategoryRepository`だけ2つ（モックと元）あり、他は1つしかありません。


# 解決策

メソッド名を変えることで、無事すべての@Beanメソッドが呼び出されるようになりました。

```java:MyConfig.java
@Configuration
public class MyConfig {
    @Bean 
    @Primary
    public MenuRepository menuRepositoryBean() {
        return Mockito.mock(MenuRepository.class);
    }

    @Bean 
    @Primary
    public CategoryRepository categoryRepositoryBean() {
        return Mockito.mock(CategoryRepository.class);
    }

    @Bean 
    @Primary
    public UserRepository userRepositoryBean() {
        return Mockito.mock(UserRepository.class);
    }
}
```

あと、型がかぶっているというエラーが出たので、`@Primary`を付けました。


どうしてこうなるのでしょう……？？
mac OSX El Capitan Sierra で phantomjs 入門(Hello, World)

#インストール
ターミナルでHomebrewからインストール

```
$ brew install phantomjs
```
問題なく完了

```
$ phantomjs -v
2.1.1
```

適当にphantomjs用の環境作ってチュートリアルを試す
[Quick Start|PhantomJS](http://phantomjs.org/quick-start.html)

#Hello, World

下記を作成して

```hello.js
console.log('Hello, World');
phantom.exit();
```
実行

```
$ phantomjs hello.js
Hello, world!
$
```

#screen capture
下記を作成して

```cap.js
var page = require('webpage').create();
page.open('http://github.com/', function() {
  page.render('github.png');
  phantom.exit();
});
```

実行

```
$ phantomjs cap.js
```

`page.open('http://github.com/', function() {`
ここで書かれたURLの画面全体キャプチャが同一ディレクトリに保存されてれば成功(なんでスマホ用画面で取れてんだろ？)

簡易的には以上
Do You Really Need DevOps?

Flawless end-user experience is the objective of any software organization in the world. Having said that, DevOps and Agile methodologies can make things faster, but the important thing is to know whether your all projects need DevOps adoption and how to determine which projects are best suited for DevOps. You need to be very smart and have proper metrics in place to know if a particular project needs DevOps practice or not.

If you are already using DevOps in your organization across every project, that’s well and good. Here, we are talking about an organization that wants to know if all projects really need to adopt DevOps practices. There are certain organizations that are still skeptical about approaching this method because of the fear of change.

Developers have traditionally seen themselves as the creators of software, products, and solutions, while the operations people have managed those creations once they exist. With DevOps, the two teams work together, allowing IT and development teams to collaboratively implement solutions and be integrally involved in the overall lifecycle.

DevOps adoption means that you are willing to change fast, develop fast, test fast, fail fast, recover fast, learn fast, and push the product fast to the market. It’s a true learning curve. Some projects might look cool at the time of planning on a sheet of paper or a whiteboard, but when it comes to a real, practical approach, people in the organization tend to avoid and procrastinate to adopt. The projects seem too difficult to go with DevOps adoption. Hence, you need to have set of variables that determine the skill set and willingness to change in your organization.

You need to choose the project you think is critical for your business and can produce the highest ROI if the required bottlenecks are removed. That can be a project that, if improved, will generate increased revenue. Or, it might be a project where reducing costs significantly improves the operating income for that project. You will be able to exploit many benefits with DevOps adoption.

If you have your own platform (PaaS) that's giving services to other software companies, improving your own platform by adopting DevOps is a good idea because it will help you know where the bottlenecks are so that you can mitigate them easily. Doing this will automatically help other organizations using your platform.

If your project is small and doesn’t have much impact directly on the ROI of your organization, then it is not recommended to have a DevOps approach. However, if you have a microservices architecture involved in your project, you have an even bigger reason to practice DevOps.
DOTWeen記事まとめ


## 初級

[簡単!スクリプトでアニメーション](http://qiita.com/Teach/items/dc4099a881689813dd14)

[[Unity ]簡単!スクリプトでアニメーション2 UIのScale](
http://qiita.com/Teach/items/fee8d7a325531e15904a)

## おすすめサイト

アニメーションをつなげたり，同時にやりたい場合はここのSequenceを参考に
https://anz-note.tumblr.com/post/145405933481/unitydotween%E3%82%81%E3%83%BC%E3%82%82)

いろんなアニメーションが学べる
http://www.shibuya24.info/entry/2015/08/26/090000


## UIの座標を移動する場合

UIの場合はtransformではなく，RectTransformなのでこちらのやり方がより良いです．

1. 上部メニューのTools -> DoTweenなんちゃら
2. Setupボタンを押す => 使えるアニメーションの種類が増える
3. 以下のような形で実装

```
private RectTransform rectTransform;

void Start(){
	// UIはtransformではなく，RectTransformを使う
	rectTransform = this.GetComponent<RectTransform>();
	
	// AnchorPosで位置を設定  PosXとPosYに対応
	rectTransform.DOAnchorPos(new Vector2(20f, 0), 0.3f);
}

```
要因分析表を使った単体テスト

#要因分析表での単体テスト 

前の会社で受けた単体テストの研修が非常によかったので、
忘れないように記録しておきます。

※ここでいう単体テストは、おもにシステム開発の画面単位での
　単体テストについて記載します。
　なので、単体～結合の間くらいのテストだと思ってください。


##とりあえず用語：「要因分析表」

・要因分析表
　単体テストの際に、「何の項目」が「どんな状態」にどうなるかの
　組み合わせを作成する表
　「何の項目」を『因子』、どんな状態を『状態』として考える。

##Googleの検索機能の要因分析表とテスト項目を作ってみた。
※今回は内容を簡単にするため、「検索」機能のみを洗い出しています。

###①まずは要因分析表の作成

|連番| 入力値 | 入力有無 | 検索機能実行イベント |
|:-----------:|:-----------|:------------|:------------|
|1| 半角スペース区切りの入力 | 入力なし | 「Google 検索」ボタン |
|2| 全角スペース区切りの入力 | 入力あり | 検索テキストボックスEnter押下 |
|3| ""で囲ったワードでの検索 | |
|4| -を先頭につけた検索 | |
|5| ～多いので省略～ | |

・「因子」として、「検索テキストボックス入力値」と「検索機能実行イベント」を洗い出しました。この要素によって検索機能が実行され、結果が変わります。
・次に各因子の「状態」を洗い出しました。ここで洗い出す状態は、結果が変わる状態を記載します。
###②テスト項目の作成(表の番号は要因分析表で使用する因子状態の連番です)

|連番| 入力値 | 入力有無 | 検索機能実行イベント | 確認事項 |
|:-----------:|:-----------|:------------|:------------|:------------|
|1| 1 | - | - |区切ったワードそれぞれで絞り込まれた検索がされること
|2| 2 | - | - |区切ったワードそれぞれで絞り込まれた検索がされること
|3| 3 | - | - |""で囲ったワードで検索がされること
|4| 4 | - | - |-を付けたワードが引かれて検索がされること
|5| 5 | - | - |～省略～
|6| - | 1 | 1 |検索機能が起動しないこと
|7| - | 1 | 2 |検索機能が起動しないこと
|8| - | 2 | 1 |検索結果が表示されること
|9| - | 2 | 2 |検索結果が表示されること
 
・要因分析表の因子と状態から組み合わせを作ります。組み合わせの際は関連性が高い項目を組み合わせ、関連性が低いものは組み合わせしません。
※どの程度組み合わせるかはテストをどのぐらいしっかりやりたいかで決定します。
理想は全ての組み合わせることですが実際には難しいです。
・組み合わせに対して確認事項を決めます。テスト時はこの項目を確認します。
Firebase Authentication これだけは覚えておけ！テストに出るぞ！

ユーザー登録やログインはどんなWebアプリケーションでもほぼ必須なのに、いざ実装するとなるといろいろ考えることが多くて(主にパスワードの保存方法とか漏洩対策とか)正直しんどい。
Firebaseには最初からメールアドレスとパスワードを使ったユーザー認証の仕組みが用意されていて、プロジェクトを作って管理コンソールで有効にするだけですぐに利用することができる。ここの仕組みだけでもFirebaseを使う価値は十分にあるかもしれない。

## サインイン

メールアドレスとパスワードを使ったサインインの実装。

```js
// なんらかの方法でユーザーの入力したユーザー名とパスワードを取得する。
// 例:
let email = document.getElementById('input-email').value;
let password = document.getElementById('input-password').value;

firebase.auth().signInWithEmailAndPassword(email, password)
  .then(user => {
    // ログイン成功
    // ページを移動する、ユーザーの情報を取得して処理を行う、等する
    // user.uid をユーザーIDとして使用する
  }, err => {
    // エラーを表示する等
  });
```

## サインアウト

サインインをするということは、サインアウトもしなければいけないだろう。

```js
firebase.auth().signOut()
  .then(_ => {
    // ログイン画面に戻る等
  }, err => {
    // エラーを表示する等
  });
```

## 現在サインインしているかどうかを判定する

マイページのような機能は、サインインしている状態でアクセスしなければならない。サインインをしていない状態だったらサインインする画面に遷移させたりしたい。

```js
firebase.auth().onAuthStateChanged((user) => {
  if (!user) {
    // サインインしていない状態
    // サインイン画面に遷移する等
    // 例:
    location.href = '/signin.html';
  } else {
    // サインイン済み
  }
});
```

作っているのが社内用アプリだったりテスト用だったりする場合は、ひとまずこれくらい押さえておけば大丈夫だ！

あとは公式のドキュメント見てください。
https://firebase.google.com/docs/auth/web/password-auth
Pythonの文字列の比較演算子について

最近、Pythonでデータ処理を行い、簡単なアラート機能のバッチ処理を行うコードをレビューしています。

その中で、次のようなコードがあってびっくりしました。（若干書き換えてます）

```Python
import pandas as pd

def select_this_month(df: pd.DataFrame) -> pd.DataFrame:
    """今月のデータのみを取り出す
        Args:
            df: フィルタリング対象のデータフレーム
        Returns:
            フィルターしたデータフレーム
    """
    now = df["Date"].max()
    y, m = now[0:4], now[5:7]
    res = df[df['Date'] >= (y + "-" + m + "-01")]
    return res
```

このコードを見た際、pandasの```max```で最大値を取り出しているし（数値型やdatetime型?）、スライスで部分文字列を取り出している（文字列型?）し、「なんだコレ？pandas組み込みの日付型？」と思ってしまいました。

よくよく調べると、これはただの文字列型で、それに比較演算子（不等号）が定義されているだけでした。

```python
a = '2016-12-31'
b = '2016-01-01'
a > b
# => True
a < b
# => False
```

Pythonの公式ドキュメントにも、[比較演算子の結果を明示している箇所](https://docs.python.org/3/reference/expressions.html)を見つけました
。

> Strings (instances of str) compare lexicographically using the numerical Unicode code points (the result of the built-in function ord()) of their characters. 
>
> Strings and binary sequences cannot be directly compared.

とりあえずGoogle翻訳しておきます。

> 文字列（strのインスタンス）は、文字のUnicodeコードポイント（組込み関数ord（）の結果）を使って辞書的に比較します。 [3]
> 
> ストリングとバイナリシーケンスを直接比較することはできません。

[ord関数のドキュメント](http://docs.python.jp/3/library/functions.html#ord)にもこう書いてあるのでUnicodeポイントで比較されるみたいですね。

> 1 文字の Unicode 文字を表す文字列に対し、その文字の Unicode コードポイントを表す整数を返します。例えば、 ord('a') は整数 97 を返し、 ord('€') (ユーロ記号) は 8364 を返します。これは chr() の逆です。

ということで、

* 日付の文字列が必ず0詰めされている
* YYYY-MM-DDの形式で計算されている

なら文字列型でも問題なく挙動しそうです。

やっぱり日付型を使ったほうがいいとは思いますが。
エイリアスにする? それとも関数にする?

Bourne 系対話シェルの初期化ファイル (`.bashrc` とか `.zshrc` とか) でコマンドの動作を変更しようとするとき、エイリアスにするか関数にするか迷ひませんか。私はさっき迷ひました[^1]。少し考へて、かういふ風に使ひ分ければいいのかなといふのをここにメモっておきます。

# 複雑なことをするなら関数一択

かういふのはエイリアスには無理。

```bash
mkdircd() {
  mkdir -p "$@" && cd "$1"
}
```

# コマンドの挙動を破壊的に変更するならエイリアス

例へば `alias grep='grep --color=tty'` は grep コマンドの出力を条件付きで少し変へるだけ。grep コマンドの出力を他のコマンドにパイプしたりするときは grep コマンドは普通の grep と同様に動く。よって、他の関数とかエイリアスとかで grep が使はれてゐたとしてもそれらがバグることはほぼない。こんな場合は、 `grep() { command grep --color=tty "$@"; }` といふ風に関数として定義しても OK。関数として定義しておくと、他の関数の中で grep を使っている場合にも `--color=tty` の恩恵を常に受けることができる。 (grep がエイリアスだったら、エイリアスを定義した後に定義した関数の中でしか `--color=tty` は効かない)

一方で例へば `alias rm='rm -i'` は rm コマンドの動作を大きく変更するので、関数にはしない方が良い。他の関数で rm コマンドを使ってゐる場合に、その関数の中でも「ファイルを消すたびに本当に消すか聞く」といふ動作になってしまふ。その関数で rm の標準入力が何かにリダイレクトされてゐたらおそらく意図しない動作を引き起こす。

また、エイリアスを定義した後に関数を定義するとその関数の中でもエイリアスが効くことに注意。定義の内容によってはエイリアスと関数の定義順序が重要だ。

# 別解

Csh 系や fish なら関数しかないので迷ひません。

# シェルスクリプトの場合

シェルスクリプトではエイリアスは普通は使ひません。また、 `grep() { command grep --color=tty "$@"; }` みたいに既存のコマンドの動作を変更する同名の関数を定義することも普通はありません (紛らはしくない様に、被らない関数名にします)。

[^1]: 何年エンジニアやってるんだよ 今更かよ
windowsのgit bashからhttpieを使う

## やりたいこと

タイトル通りですが、httpieが便利だったので、windowsのgit-bashから使えないかなーと思い試してみました。

curlを捨ててhttpieを使おう - Qiita
http://qiita.com/yuku_t/items/5df06d50c4c349cc0c1b

## 手順

まず普通にwindowsのpython（ここでは2.7を入れた）をインストール

Python Releases for Windows | Python.org
https://www.python.org/downloads/windows/
  Download Windows x86-64 MSI installer

そのあと、Pathを通す

pip と ipython インストール手引き (Windows編) - secretbase.log
http://cointoss.hatenablog.com/entry/20120531/1338474875

再起動

すると、git-bashから

```
[12-14 18:22:36 ~]$ python --version
Python 2.7.13rc1
[12-14 18:22:37 ~]$ pip --version
pip 9.0.1 from c:\python27\lib\site-packages (python 2.7)
[12-14 18:22:41 ~]$ easy_install --version
setuptools 31.0.0 from c:\python27\lib\site-packages (Python 2.7)
[12-14 18:22:46 ~]$
```

が使えるようになる。

次に、httpieをインストール

```
[12-14 18:17:08 ~]$ winpty pip install httpie
Collecting httpie
  Using cached httpie-0.9.9-py2.py3-none-any.whl
Requirement already satisfied: colorama>=0.2.4; sys_platform ==
"win32" in c:\python27\lib\site-packages (from httpie)
Requirement already satisfied: requests>=2.11.0 in
c:\python27\lib\site-packages (from httpie)
Requirement already satisfied: Pygments>=2.1.3 in
c:\python27\lib\site-packages (from httpie)
Installing collected packages: httpie
Successfully installed httpie-0.9.9
[12-14 18:19:24 ~]$
```

実行

```
[12-14 18:19:25 ~]$ winpty http https://www.google.co.jp/
HTTP/1.1 200 OK
Alt-Svc: quic=":443"; ma=2592000; v="35,34"
Cache-Control: private, max-age=0
Content-Encoding: gzip
Content-Type: text/html; charset=Shift_JIS
Date: Wed, 14 Dec 2016 09:19:30 GMT
...
```

便利！


## ...ところで、winptyってなによ！？


Git for WindowsでPythonがうまく動かない場合の対処法 - Qiita
http://qiita.com/icoxfog417/items/33e6b1f3dd9358923e21

ってことらしい。スクリプトをいじるか、
大人しくwinptyを頭につけて実行しよう。

## http: error: Only terminal output can be colorized on Windows.ってでる

git-bashからhttpieの実行結果をtextに書き込むと、

```
$ winpty http GET http://127.0.0.1/search/song word==ai count==5 --print hb --pretty format --output result.txt
```

みたいなことをしたい場合、

```
usage: http [--json] [--form] [--pretty {all,colors,format,none}]
            [--style STYLE] [--print WHAT] [--headers] [--body] [--verbose]
            [--all] [--history-print WHAT] [--stream] [--output FILE]
            [--download] [--continue]
            [--session SESSION_NAME_OR_PATH | --session-read-only SESSION_NAME_OR_PATH]
            [--auth USER[:PASS]] [--auth-type {basic,digest}]
            [--proxy PROTOCOL:PROXY_URL] [--follow]
            [--max-redirects MAX_REDIRECTS] [--timeout SECONDS]
            [--check-status] [--verify VERIFY]
            [--ssl {ssl2.3,ssl3,tls1,tls1.1,tls1.2}] [--cert CERT]
            [--cert-key CERT_KEY] [--ignore-stdin] [--help] [--version]
            [--traceback] [--default-scheme DEFAULT_SCHEME] [--debug]
            [METHOD] URL [REQUEST_ITEM [REQUEST_ITEM ...]]
http: error: Only terminal output can be colorized on Windows.
```

になってしまいます。この問題を解決するには、git-bashを使わず、cmd.exeで

```
C:\Users\XXXX> http GET http://127.0.0.1/search/song word==ai count==5 --print hb --pretty format --output result.txt
```

ってすればフォーマットされた状態のアウトプットを書き込めます。winpty要らない点に注意。
[Excel] 相対パスでのハイパーリンクの作成

セルをハイパーリンク化すると絶対パスになってしまうため、ファイルを移動するとリンク切れになってしまう。
それを回避するため、相対パスでリンクを作成する方法のメモ。

結論としては、`HYPERLINK`関数を使用すれば良い。
例としては以下のようにする。

```text:相対パスでのハイパーリンクの作成
=HYPERLINK(".\path\to\data.xls","File Name")
```

パス名をそのまま表示して良い場合は、表示名を省略できる。

```text:相対パスでのハイパーリンクの作成(表示名の省略)
=HYPERLINK(".\path\to\data.xls")
```

# 参考
[HYPERLINK 関数](https://msdn.microsoft.com/ja-jp/library/cc376037.aspx)
GitHubのissueを悪用して画像をホストする

知らなかったので投稿。  
[Dash](https://github.com/Circular-Studios/Dash)というDで書かれたゲームエンジンがあるのだが、そのreadmeの一番上にあるでっかいロゴの画像ファイルがどこにおいてあるのか気になった。  
![でかい](https://qiita-image-store.s3.amazonaws.com/0/57768/cabd3a50-395c-ee60-6068-875e6b6a96f7.png)

リポジトリ内には見当たらない……しかしURLが`githubusercontent.com`なのでGitHubのどこかに上げているんだろう。

```text
[![Dash Logo](https://cloud.githubusercontent.com/assets/512416/2726786/6618d624-c5c2-11e3-9049-23637e5a1739.png)](https://github.com/Circular-Studios/Dash/wiki)
```

調べたらこのような記事が出てきた。issueの画像アップロード機能を"abuse"するのがおすすめ、とある。

[Using issues to host GitHub Pages screenshots](http://blog.davidebbo.com/2014/11/using-issues-for-github-pages-screenshots.html#suggested-option-use-github-issues-to-store-your-images)

issueのコメントに画像を貼り付けるとその場でアップロードされコードが生成される。このとき実際にissueを投稿しなくても同じURLで画像は存在し続けているようだ。  
試しにやってみた。

```text
![fzil2ccg](https://cloud.githubusercontent.com/assets/8435623/21176246/3b5aa50a-c229-11e6-8d23-eed54044ede4.jpg)
```

![fzil2ccg](https://cloud.githubusercontent.com/assets/8435623/21176246/3b5aa50a-c229-11e6-8d23-eed54044ede4.jpg)

この画像が実際に投稿されたissueはどこにも存在しないが、ちゃんと画像はそのまま見える状態のはずである。とても便利。
AdornerLayer.GetAdornerLayerの戻り値がnullになる

#問題
ListBoxの中身をゴースト（これが正しいかは知らない）付きでドラッグ・ドロップで移動させようとしたときに
ぶつかった問題。
AdornerLayer.GetAdornerLayerの戻り値がnullになる。

#解決方法
サンプルで作ったときは動いてたのに、本番環境に持って行った瞬間動かなくなった。
何が違うのかサンプルと比較すると本番環境ではBaseWindowが存在する。

試しにコンストラクタの

```C#
DefaultStyleKeyProperty.OverrideMetadata(typeof(BaseWindow), new FrameworkPropertyMetadata(typeof(BaseWindow)));
```
をコメントアウトするとAdornerLayer.GetAdornerLayerの戻り値がnullではなくなった！
ってことは、BaseWindowGeneric.xamlの中身がおかしい。

結局、下記のようにして解決

```C#
<Style TargetType="{x:Type z:BaseWindow}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type z:BaseWindow}">
                <Grid Background="{TemplateBinding Background}">
                    <AdornerDecorator> ★これ追加
                        <ContentPresenter/>
                    </AdornerDecorator> ★これ追加
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
```
WP-CLIでwp core updateした時に「Error: Another update is currently in progress.」が出た場合の対応方法


ブラウザからアップデート失敗して、WP-CLIからリトライしたい時とかに遭遇します。

```
$ wp core update
Updating to version 4.7 (en_US)...
Error: Another update is currently in progress.
```

あちこちからアップデート処理実行されたら大変なので、１アップデートを同時に実行できないようロックする処理があるようです。

でそのロック方法ですが、wp_optionsテーブルに`core_updater.lock`というオプションが追加されています。
この値が入っている場合、コアのアップデートが実施できない状態になっていますので、どうしてもリトライしたいという時は以下のようにして削除してください。

```
$ wp option delete core_updater.lock
```

もちろん、ロックされているものを解除してリトライするわけなので、何かしらのトラブルに遭遇する覚悟はした上での実行をオススメします。
Vagrantでポートフォワードを設定しても、railsのアプリケーションが見れなかった話


個人の戒めとしてメモっておく

Vagrantfile
---

```
  config.vm.network :forwarded_port, guest: 4567, host: 4567, auto_correct: true, id: "http"
  config.vm.network :private_network, ip: "192.168.33.11"
```

問題なし。

仮想（Vagrant)側の確認
---

とりあえず、rails 5.0.0のアプリを起動

```
./bin/rails s -b 0.0.0.0 -p 4567
```

* ポートフォワーディングでやっている4567ポートで動かしている
* bindも0.0.0.0でやっている

問題ない。

netstatでちゃんとLISTENできているか確認

```
netstat -tanp | grep LISTEN
```

を実行すると

```
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1304/sshd
tcp        0      0 0.0.0.0:4567                0.0.0.0:*                   LISTEN      3827/puma 3.6.2 (tc
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1391/master
tcp        0      0 :::22                       :::*                        LISTEN      1304/sshd
tcp        0      0 ::1:25                      :::*                        LISTEN      1391/master
```

4567port開いてる。問題ない。


ホスト（Mac)側の確認
---

こちらでもportが開いてるか確認

```
lsof -i -P | grep "LISTEN"
```

```
VirtualBo 29393 hogehoge   33u  IPv4 0x4094c6847ecc57b      0t0  TCP *:4567 (LISTEN)
VirtualBo 29393 hogehoge   35u  IPv4 0x4094c684755cc83      0t0  TCP localhost:2222 (LISTEN)
```

開いている。問題ない。

telnetを使って接続確認

~~~
telnet localhost 4567

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
~~~

入れる。つながっている。

別のターミナル立ち上げて、tcpdumpを使って、反応が見れるか確認。

```
sudo tcpdump -i all port 4567
```

んで、telnet接続中に以下を記入。

~~~
GET / HTTP/1.0
~~~

#### tcpdump反応せず。

何が問題なんだ？
---

* ポートフォワーディングはできている
* 設定ファイルも問題ない
* ゲスト側にリクエストが到達していない？



解決
---

~~~
service iptables stop
~~~

１日詰まった挙句、Firewallでした。
【ゲリラアドカレ】UE4ゲーム実装　進捗報告 6日目(バトル画面ロジック実装　その１)

【非公式】某会社設立記念ゲリラ Advent Calendar 2016 12日目の記事です。

FlashゲームをUE4で再実装するゲリラアドカレです。

昨日は体調不良でお休みをいただいていたため、本日更新します。
今回はバトルのロジックを組みたいと思います。
実装項目がかなり多いので、複数回に分けます。

まず、スキルは一旦後回しにして、攻撃、逃走のコマンドを実装していきます。

・注意
許可を取ってないので通常業務の空いた時間を利用して作成するため、作成中のゲーム、及びアドカレは完成保証がなければ、ゲーム自体もリリースされる保証も皆無なので、あんまり期待しないでください。

#構造体作成

バトルは情報が多いため、アクター、もしくはウィジェットを継承したブループリントにバトルに必要な変数を作成すると依存が高くなる、柔軟に対応できなくなるなど色々と問題が出るため、必要な変数をまとめる構造体を作成します。

![構造体作成.png](https://qiita-image-store.s3.amazonaws.com/0/104377/b85c4992-c078-1cff-8af5-23c55c17e2e0.png)

とりあえず仮決めで以下の変数を持たせることにしました。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/3902a727-a517-4a1a-578d-51e9aee8e7e2.png)

一部に新規に作成した列挙型を使用しています。

#列挙型作成

固定値を使用するなら列挙型にして選択するようにします。
![列挙体作成.png](https://qiita-image-store.s3.amazonaws.com/0/104377/57f5870d-8395-b679-d70c-a43686491275.png)

ひとまず二つの列挙型を作成しました
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/191412cd-2ee2-278b-148b-1059d69c27ae.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/bd9e601f-185b-1789-b9ff-b0e82b773683.png)

#GameStateBase作成

バトルの行動順をGameStateBaseに格納します。
GameInstanceに格納しても同様のことはできますが、バトルの行動順はバトル画面以外は使わないため、こういう形にしました。

とりあえずGameStateBaseを継承したブループリントクラスを作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/89b61047-0c35-cd06-0c69-78cda657ea73.png)

配列とイベントディスバッチャーを作ります。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/e73f6c2a-7188-6faa-c396-784bd893b595.png)

#コマンド選択

UIのコマンドをクリックした時に実行する処理を書いていきます。
![コマンド.png](https://qiita-image-store.s3.amazonaws.com/0/104377/0434685a-29e1-aeca-f8a0-b815872c905d.png)

逃走は確立で出来るようにしたいのですが、一旦確実に逃げられるようにします。
逃げに成功した場合はOpenLevelでクエスト画面を呼ぶようにします。

攻撃ボタンを押した時は攻撃を示す構造体データを割く静止して、カスタムしたGameStateBaseに格納します。
このゲームでは３人のコマンドを選ぶ必要があるため、構造体を作成したら３人コマンドを選んだか判定します。
３人選び終わった場合、この時点では一旦クエスト画面に戻すようにしています。

#イベントディスバッチャー登録

とりあえずレベルブループリントで登録したイベントディスバッチャーをバインドさせます。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/46d4dc06-ee3a-83eb-f301-d230ca5e3d98.png)

イベントディスバッチャーで呼ばれたらこのイベントを呼び出すようにしています。
将来的にここから演出再生の呼び出しを行いたいと思っています。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/b1da6d77-4d77-076b-931e-02024eaeb7d4.png)

また、キャラを選択したら画像を変えるため、バインド関数、及び簡易的なアニメーションを実装、それをイベントディスバッチャー経由で呼び出すように変えました。
![スライドアニメーション.png](https://qiita-image-store.s3.amazonaws.com/0/104377/7c5e95ac-0b43-6295-b957-0206d47979e8.png)

画像のバインド関数を作成しました。
![コマンド１.png](https://qiita-image-store.s3.amazonaws.com/0/104377/4c7eb2b5-3d1c-c073-6b1f-433c9b86fa82.png)


#とりあえずコマンドを選択できるようになった

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/82d4ede6-8325-563d-aa9b-3f69bd457084.png)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">コマンド選択（攻撃）<br>なお、攻撃対象が選べるのはまだ未実装 <a href="https://t.co/lGEzlyOTQ9">pic.twitter.com/lGEzlyOTQ9</a></p>&mdash; 荻野雄季＠クルーズから出荷された豚 (@YuukiOgino) <a href="https://twitter.com/YuukiOgino/status/808963042062913537">2016年12月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

まだまだ先は長そうです。
BitbucketにSSH認証鍵を設定する


会社ではgitlabを使っているのですが、
個人の開発中のプログラムなどの管理は、Bitbucketで管理しています。
非公開のリポジトリ管理が無料できる利点があります。
今回は認証鍵の設定をまとめます。

## アカウントを作成

下記でアカウントを作成する。
※今回は、端折ります。

[https://bitbucket.org/](https://bitbucket.org/)



## SSH認証鍵の設定


### 公開鍵と秘密鍵を作成

```ruby:Terminal
$ ssh-keygen -t rsa -C *********@*****.*** //ご自身のメールアドレス
Generating public/private rsa key pair.
```

次に鍵の格納先を指定。
特に指定がなければ、そのまま、`Enter`
※今回は複数の鍵を管理しているので、格納先を指定する。
（`Enter file in which to save the key (/Users/*********/.ssh/id_rsa):`の後に、格納先を指定。）

```ruby:Terminal
Enter file in which to save the key (/Users/*********/.ssh/id_rsa): /Users/*********/.ssh/bitbucket/id_rsa
Enter passphrase (empty for no passphrase): #Enterを押下
Enter same passphrase again: #Enterを押下
Your identification has been saved in /Users/*********/.ssh/bitbucket/id_rsa.
Your public key has been saved in /Users/*********/.ssh/bitbucket/id_rsa.pub.
The key fingerprint is:
**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:** *********@*****.***
The key's randomart image is:
+--[ RSA 2048]----+
|          *=++o  |
|         .o=Eo . |
|         oo+..o .|
|         oo. . = |
|        S . . +  |
|           . o   |
|            .    |
|                 |
|                 |
+-----------------+
```


鍵のパーミッションを変更する。

```ruby:Terminal
$ cd *********/.ssh/bitbucket/
$ chmod 600 id_rsa
```

### .ssh/configの設定


```ruby:Terminal
Host bitbucket.org
    User git
    Port 22
    HostName bitbucket.org
    identityFile ~/.ssh/bitbucket/id_rsa
    TCPKeepAlive yes
    IdentitiesOnly yes
```

.ssh/configの設定方法はこちらで確認ください。
[.ssh/configファイルでSSH接続を管理する](http://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1)


## BitBucketへ公開鍵を設定




![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/b38170f0-11f6-fbe5-f747-8f5d20f36db3.jpeg "01.jpg")

ログイン後、アイコンをクリックし、[アカウントの管理]をクリック。



![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/de9f4431-d13d-f017-6a9c-397236bae199.jpeg "02.jpg")

左カラムのセキュリティ欄の[SSHキー]をクリックし、[鍵を追加]ボタンをクリック。

![03.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/7ce6a687-2a8a-f39e-86f3-8cdba70e9fe8.jpeg "03.jpg")


&#9312; 任意の名前
&#9313; 格納されている公開鍵をコピーする。(ターミナルで実行)

```ruby:Terminal
$ cat ~/.ssh/bitbucket/id_rsa.pub | pbcopy
```

&#9314;　コピーした公開鍵をペーストする。

## 接続できるか確認

```ruby:Terminal
$ ssh -T git@bitbucket.org
logged in as *********(アカウント名).

You can use git or hg to connect to Bitbucket. Shell access is disabled.
```

エラーが出なければ接続が成功。

## git clone

リモートのリポジトリをcloneする。

```ruby:Terminal
$ git clone git@bitbucket.org:*********/test.git
```

## 終わりに
5ユーザーまで無料なので、小規模のチームや、個人で開発しているなどには良いのかなと思います。
gitの検証やgitの練習などにもいかがでしょうか。


## 参照

* [Bitbucket](https://www.atlassian.com/ja/software/bitbucket/overview)
* [Bitbucket Document](https://confluence.atlassian.com/bitbucket/bitbucket-cloud-documentation-home-221448814.html)
vim の :! コマンドでも .bashrc のエイリアス設定を有効にする

Vim でシェルのコマンドを実行したいとき、 `:!`  の後にコマンドを打てばよいことはご存知かと思います。しかし、デフォルトのままでは .bashrc に書いてあるエイリアスの設定が有効にされていません。例えば、

```bash:.bashrc
alias ll='ls -l'
```

と設定していても、vim 上で `:!ll` は使えません（ `command not found` となる）。

これを使えるようにするためには、適当なファイル（~/.bash_aliases としておきます）に

```bash:.bash_aliases
shopt -s expand_aliases
alias ll='ls -l'
```

と記述し、 .vimrc 内に

```:.vimrc
let $BASH_ENV = "~/.bash_aliases"
```

と記述しておけば大丈夫です。この状態で vim を再起動し、 `:!ll` を試してみましょう。動くはずです。この .bash_aliases に自分の好きなエイリアスを書いて使ってください。

参考リンク：
http://stackoverflow.com/questions/4642822/commands-executed-from-vim-are-not-recognizing-bash-command-aliases （Zahnon 氏の回答）
http://stackoverflow.com/questions/8841116/vim-not-recognizing-aliases-when-in-interactive-mode （Jacob 氏の回答）

## メモ
以下、ちょっとした解説がてらのメモです。動けばそれで満足、という方は以下は読まなくても構いません。

### shopt って何だ？
.bash_aliases 内 1 行目の `shopt` は、その名の通りシェルのオプションです。エイリアスの設定を有効にするためにこの行が必要で、普通のインタラクティブモードのシェル（ターミナル）ではデフォルトで有効になっています。vim の `:!` はインタラクティブではないため、明示的に設定してやる必要があります。

### shellcmdflag じゃダメか？
いろいろな回答を見ていくと、「.vimrc 内に `set shellcmdflag=-ic` と書いておけばおｋ」みたいな回答がだいたい先頭に出てきます。しかし、これをしてしまうと、vim からターミナルが立ち上がってしまい、コマンド終了後に例の `Press ENTER or type command to continue` が出てこず、ターミナルがそのまま居座ってしまうのです。

僕はもとの `:!` コマンドの使用感（終了後何かキーを押せば終了）が好きでしたので、冒頭の解決策に落ち着きました。
Raspberry Pi > GNDピンの位置 > 実基板で確認する方法 > 十字の半田付け

```txt:確認
Raspberry Pi2 (以下Pi2)
```

Pi2の基板を知人に見せていたところ、その人は「GNDピンはこれ」と指摘した。そのピンは確かにGNDピンだった。

[Raspberry Pi2 GPIO Header](
https://www.element14.com/community/servlet/JiveServlet/previewBody/73950-102-4-309126/GPIO_Pi2.png)

どうして分かったか聞いたところ、「ピンの半田付けが十字になっている」とのことらしい。

https://ja.wikipedia.org/wiki/Raspberry_Pi#/media/File:Raspberry_Pi_2_Model_B_v1.1_underside_new_(bg_cut_out).jpg

上記の写真のように、確かに十字になっているピンはGNDピンのようだ。
ベタアースにしているのかもしれない。
pepper入門

#はじめてのPEPPER

今週からpepperで何ができるかなど調べています。
今のところchoregrapheで色々と簡単にできるのはわかったが深堀りしていくともっとできそうだとおもってqichatをつかってみた。率直な感想はプログラムを書く自分としてはqichatつかいやすいー、し柔軟性もあって色々できそうだとおもいました。
OAuth 認証の不要な Office365 API (v1) を使う

まったくよく分かってないんだけど、Office365 の API には v1 と v2 があって、v2 は OAuth による認証しか使えないらしい。v1 は手元の環境だと BASIC 認証が使えた。

下記のようなリクエストを行うと、最新 1 件のメール情報を JSON 形式で取得することができる。

```
$ curl -s --user username:password \
"https://outlook.office365.com/api/v1.0/me/messages?$top=1"
```

v1 と v2 でインタフェースが微妙に違い、公式ドキュメントの右上のラジオボタンで切り替えることでそれぞれの仕様を閲覧可能。

* [Outlook Mail REST API reference](https://msdn.microsoft.com/en-us/office/office365/api/mail-rest-operations)

![](https://i.gyazo.com/82ae00dc16f7d6f5b42eab34f1893861.png)

v1 がいつまで使えるのかはよく分からない。
ElasticBeanstalk Multi-container Docker な環境で、AmazonLinux + httpd + sendmail を動かす方法

ElasticBeanstalk Multi-container Docker な環境で、apache + sendmail を動かす場合、主に sendmail でハマる事があります。

## 自分が直面した状況

「アプリからメール送ろうとすると固まる！あと、なんかアプリが不安定だなー」

### 状況1 「アプリからメール送ろうとすると固まる」

- sendmail は `hostname` が FQDN じゃないと動かない（固まる）
- ElasticBeanstalk Multiple Docker 内の `hostname` は FQDN ではない文字列
- Dockerfile 内で `/etc/hosts` を書き換えると、普通の Docker なら上手く動くが、ElasticBeanstalk Multiple Docker では環境が立ち上がらなくなる

### 状況2 「なんかアプリが不安定」

下記の様に、デーモンを立ち上げて最後に bash をフォアグラウンド起動する方法だと、普通の Docker では問題なく動くが、ECS の Task になると定期的に落ちていた。

```Dockerfile
ENTRYPOINT service httpd start \
        && service sendmail start \
        && /bin/bash --login
```

## 解決方法

- Dockerfile で Supervisor をインストール。
- Supervisor で httpd  などフォアグラウンド起動できるデーモンを管理。
- `start.sh` を作成し、Dockerfile の `ENTRYPOINT` で叩く。
- `start.sh` 内で下記のことをやる
    1. `/etc/hosts` 書き換え
    2. sendmail などフォアグラウンドで動かせないデーモンを起動
    3. 最後にフォアグラウンドで supervisord 起動。


### Dockerfile

```Dockerfile
FROM amazonlinux:latest

MAINTAINER Your Name

# timezone:Tokyo
RUN cp /etc/localtime /etc/localtime.org\
 && ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime\
 && echo -e "ZONE=\"Asia/Tokyo\"\nUTC=false" > /etc/sysconfig/clock

RUN yum install -y httpd24 \
                   sendmail \
                   wget

# Install supervisor and modify it to use python2.6 (not AmazonLinux default python2.7)
RUN wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm \
 && rpm -ivh epel-release-6-8.noarch.rpm \
 && yum update -y epel-release \
 && yum --enablerepo=epel install -y supervisor \
 && sed -i -E 's/(^#!\/usr\/bin\/python$)/#!\/usr\/bin\/python26/g' /usr/bin/supervisor*

# conf files
COPY docker_build_files/httpd/conf/httpd.conf /etc/httpd/conf/
COPY docker_build_files/httpd/conf.d/ /etc/httpd/conf.d/
COPY docker_build_files/supervisord/supervisord.conf /etc/

# our application
RUN mkdir /var/app \
 && mkdir /var/app/current
COPY html_app /var/app/current/
RUN chown -R apache /var/app/current/

# update
RUN yum update -y

COPY docker_build_files/script/start.sh /home/
RUN chmod +x /home/start.sh

# start services
ENTRYPOINT /home/start.sh
```

### start.sh

初期状態の `/etc/hosts` で `1` から始まる行はプライベートIPしか無いので、その行の後ろにサービスのドメイン名を付ける。
`example.com`の部分は、適当に読み替えて下さい。

```sh
#!/bin/sh

cp /etc/hosts /etc/hosts.orig && cat /etc/hosts.orig | sed -E 's/^(1.+)$/\1 example.com/g' > /etc/hosts

service sendmail start

supervisord --nodaemon
```

### supervisord.conf

```
[supervisord]
nodaemon=true

[program:httpd]
command=/usr/sbin/httpd -DFOREGROUND
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
```
tmux 上で Vim を True Color (24 bit color) で使う

Vim には、`termguicolors` というオプションがあり、端末上でも True Color を使用することが出来ます。

```vim
set termguicolors
```

## tmux 上で Vim を使う場合

tmux で True Color を用いる場合、以下のような設定をします。
**コメントに @ttdoda さんによる terminal-overrides の解説がありますのでそちらも御覧ください**

```
set -g default-terminal "screen-256color"
set-option -ga terminal-overrides ",xterm-256color:Tc"
```

`TERM=screen-256color` を設定した場合、Vim でも追加の設定が必要です。
`:h xterm-true-color` を参照すると解説が書いてあります。

```vim
set termguicolors
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
```

`TERM=xterm-256color` の場合は、`t_8f` と `t_8b` はデフォルトの値が設定されるようです。

## 環境

- iTerm 2 3.0.12
- tmux 2.3
- MacVim 8.0.124

## 調べた動機

以下のツイートを見かけて調べてみました。

<blockquote class="twitter-tweet" data-conversation="none" data-cards="hidden" data-partner="tweetdeck"><p lang="ja" dir="ltr"><a href="https://twitter.com/Linda_pp">@Linda_pp</a> 問題になっているのはBCE対応の有無なので.vimrcにset t_ut= を追加してBCEを無効にすればとりあえずは解決しますが、サポート対象外の使い方なのでTERMにはscreen系を指定する事をお勧めします。</p>&mdash; いわもと こういち (@ttdoda) <a href="https://twitter.com/ttdoda/status/808885032265752577">December 14, 2016</a></blockquote>
ページスクロール中に埋込のGoogleMapsが拡大してスクロールが止まる件への対応方法

# 課題：ページスクロールしていたら突然のGoogleMaps！

これよくあるんですが、スクロールしてたらGoogleMapsがでてきてめちゃくちゃ拡大された挙句にMapより下のほうにスクロールするのがなかなかできなくて辛いやつ。この挙動が本当に嫌ですね。

## 原因：pointer-eventsが実行されるから

GoogleMapsの上に来たらmapのスクロール=拡大が実行されるから、スクロールがそこで止まるわけです。
つまりこれを無効にすればいいわけですが、かといって完全に無効にしてしまうと、GoogleMapsの操作ができなくなります。

## 解決方法：普段は無効にしておいて、Mapがクリックされたら有効にする

これです。
まぁググってたらCodePenで見つけたやつなんですが。

### HTML

htmlでは、普通にiframeでGoogle Mapsを埋め込みます。

```html
<div class="map-container">
  <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3283.1142668573057!2d133.83069551568448!3d34.626552580453534!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3553fefe938e1f57%3A0x4bfdc7530c98965f!2z77yI5qCq77yJ44Oq44K-44O844Og!5e0!3m2!1sja!2sjp!4v1481695299705" allowfullscreen></iframe>
</div>
```

### CSS(SCSS)

javascriptとcssの組み合わせが肝です。

```scss
.map-container {
  width: 100%;
  height: 450px;
  iframe {
    width: 100%;
    height: 100%;
    pointer-events: none; // これが肝。普段はnone
    &.clicked {
      pointer-events: auto; // iframe上でクリックされたらautoにするためのclass
    }
  }
}
```

### JavaScript

今回はjQueryを使っていますが、別に使わなくても書けるくらいの量です。

```js
$('.map-container').click(function(e) {
  // 地図上でクリックされたらpointer-eventsが使えるようにする
  $(this).find('iframe').addClass('clicked');
}).mouseleave(function(e) => {
  // 地図上からマウスカーソルが外れたらpointer-eventsをnoneにする
  $(this).find('iframe').removeClass('clicked');
});

```

es2015を使っている場合はこちら。

```js:es2015
$('.map-container').click((e) => {
  // 地図上でクリックされたらpointer-eventsが使えるようにする
  $(e.target).find('iframe').addClass('clicked');
}).mouseleave((e) => {
  // 地図上からマウスカーソルが外れたらpointer-eventsをnoneにする
  $(e.target).find('iframe').removeClass('clicked');
});
```

## まとめ

cssで`pointer-events`というプロパティを使って制御できるの知らなかったので勉強になった。

### 参考URL

- [Google Maps iframe embed disable scroll to zoom | CODEPEN](http://codepen.io/status201/pen/wKowKz)
【メモ】Pythonの関数内での累算代入文の謎

## 累算代入文とは

[累算代入文](http://docs.python.jp/3/reference/simple_stmts.html#augmented-assignment-statements)

> 累算代入文は、二項演算と代入文を組み合わせて一つの文にしたものです

## 謎

```Python
>>> a = 1
>>> a = a + 1   
>>> a
2
```

```Python
>>> a = 1
>>> def f():
...     b = a + 1
... 	return b
... 
>>> f()
2
```

```Python
>>> a = 1
>>> def f():
... 	a = a + 1
... 	return a
... 
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f
UnboundLocalError: local variable 'a' referenced before assignment
```

## 追記１

```Python
>>> a = 1
>>> def f():
... 	global a
... 	a = a + 1
... 	return a
...  
>>> f()
2
```

## 追記２ 謎の解決

[なぜ変数に値があるのに UnboundLocalError が出るのですか？](http://docs.python.jp/3/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value)

によるとこのように説明されるようです。

> これは、あるスコープの中で変数に代入を行うとき、その変数はそのスコープに対してローカルになり、外のスコープにある同じ名前の変数を隠すからです。

@gotta_dive_into_python さんありがとう

## 追記３ そして新たな謎へ

「あるスコープの中で変数に代入を行うとき、その変数はそのスコープに対してローカルになる」ことと、`locals()` に登録されていることは同じことかな、などと実験しているうちにまた別の謎が。

```Python
>>> def f():
... 	a = locals()
... 	return a
... 
>>> f()
{}
```

```Python
>>> def f():
... 	a = locals()
... 	b = 1
... 	return a
... 
>>> f()
{}
```

```
>>> def f():
... 	a = locals()
... 	b = locals()
... 	return a
... 
>>> f()
{'a': {...}}
```
Facebookアプリの記事ローディングに似たUIの実装

FacebookやSlackのアプリ等でみかける、ローディング中のアニメーションを実装してみました。
![20161214164554.gif](https://qiita-image-store.s3.amazonaws.com/0/27027/f8f627ae-a881-04d7-7a6d-a03abaeccf55.gif)
コードはこちら: https://github.com/Matsue/shimmer-sample

## よくある読込中のコンポーネント
1. Progress Bar (プログレスバー)
![Screen Shot 2016-12-13 at 15.56.46.png](https://qiita-image-store.s3.amazonaws.com/0/27027/4b973ad3-9ac1-500e-f319-a69caa5b27d6.png)

2. Spinner (スピナー)
![Screen Shot 2016-12-13 at 15.57.29.png](https://qiita-image-store.s3.amazonaws.com/0/27027/e417b4ec-c138-8b7a-5452-b43564b1b713.png)

3. **Skelton Screen (スケルトンスクリーン)**
![Screen Shot 2016-12-13 at 15.58.56.png](https://qiita-image-store.s3.amazonaws.com/0/27027/aaa7aa11-9641-bab5-1c95-71ea9d4f0d27.png)

上記の3つでいうと、作ったものは**スケルトンスクリーン**に**シマー効果**を使った実装です。
エフェクトにはFacebook製の[Shimmer](https://github.com/facebook/Shimmer)を使っています。

スケルトンスクリーンを使うと、`UIActivityIndicatorView`によるスピナーよりも、次に表示されるコンテンツに近い状態を見せることができるので体感が良くなりそうです。
シマーのエフェクトがあるとローディングの状態であることが分かりやすくなりますね。

## Shimmerの使い方

``` Swift
import Shimmer

...

// どこかでFBShimmeringViewを初期化

shimmeringView.isShimmering = true
shimmeringView.contentView = contentView // 好きなviewをcontentViewにセット
```
VirtualBox（CentOS6.8）でNATネットワーク + ポートフォワーディング設定

■概要
いちいちVirtualBoxのCentOS上のターミナルやブラウザから操作するのが面倒なので、
WindowsマシンからVirtualBox側のCentOSに立てたWebサーバーまたはSSH接続するための設定メモ。

設定したIPアドレスとポートでホストOS(WIndows)のブラウザやSSHソフトからアクセスすると
VirtualBox!?がゲストOS側で設定したIPアドレスへ転送してくれるらしい(要調査)

NATネットワーク＋ポートフォワーディングでできることは、
VirtualBox内に２つ以上のゲストOSがあった場合、ゲストOS間の通信のやり取り、
WindowsとゲストOS間の通信、ゲストOSから外部へのアクセスが可能

設定は３種類あり今回はNATネットワーク＋ポートフォワーディング編メモ

■ホストOS側の設定(Windows)

　▲Windowsの設定
　　⇒コントロールパネルを開く
　　⇒ネットワークと共有センター
　　⇒アクティブなネットワークの表示のイーサネットを選択
　　⇒プロパティを選択
　　⇒共有タブを選択
　　⇒「ネットワークのほかのユーザー、このコンピュータのインターネット接続をとおしての接続を許可する」のチェックを外す
　　⇒「ネットワークのほかのユーザーに、共有インターネット接続の制御や無効化を許可する」のチェックはどちらでもOK
　　　(デフォルトのままだとチェックが入っている)

　▲Virtual Box側の設定
　　⇒VM VirtualBox マネージャーの「ファイル」⇒「環境設定」⇒「ネットワーク」⇒「NATネットワーク」
　　⇒＋ボタンを押しネットワークを追加⇒「NatNetwork」をクリック
　　⇒ポートフォワーディングルールを追加する
　　　名前			⇒デフォルトのまま(Rule1)
　　　プロトコル		⇒TCP
　　　ホストIP(WIndows側のIP)
　　　　コマンドプロンプトを開き、ipconfigコマンドを実行し「イーサネット アダプター イーサネット」の項目にある
　　　　自分のWindowsマシンのIPアドレス(IPv4アドレス)を設定する(自分のマシンは192.168.0.86だった)
　　　ホストポート	⇒8080(ポート番号は任意に決められるらしいが8080にした)
　　　ゲストIP		⇒ゲストOSでifconfigで調べたIPアドレスを設定(今回だと10.0.2.15)
　　　ゲストポート	⇒8080(ゲストOSでsudo vi /etc/sysconfig/iptablesで設定したときのポートを指定)

　　　例：
　　　　ブラウザ用	⇒Rule1	TCP	192.168.0.86	8080	10.0.2.15	8080
　　　　SSH接続用	⇒Rule2	TCP	192.168.0.86	22		10.0.2.15	22

　　⇒環境設定を閉じる
　　⇒VM VirtualBox マネージャーの「設定」を選択
　　⇒画面が起動するので左側の「ネットワーク」を選択
　　⇒アダプター1のタブの割り当てを「NATネットワーク」に設定
　　⇒名前を先ほど環境設定で追加した「NatNetwork」を選択
　　⇒OKボタンを押し閉じる

■ゲストOS側の設定(CentOS)

　▲ifconfigでアドレス確認
　　コマンド実行結果からゲストOS側のIPは10.0.2.15となる

eth0　Link encap:Ethernet  HWaddr 08:00:27:7E:A0:6A  
　　　inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
　　　inet6 addr: fe80::a00:27ff:fe7e:a06a/64 Scope:Link
　　　UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
　　　RX packets:857 errors:0 dropped:0 overruns:0 frame:0
　　　TX packets:1581 errors:0 dropped:0 overruns:0 carrier:0
　　　collisions:0 txqueuelen:1000 
　　　RX bytes:81412 (79.5 KiB)  TX bytes:882169 (861.4 KiB)

lo　　Link encap:Local Loopback  
　　　inet addr:127.0.0.1  Mask:255.0.0.0
　　　inet6 addr: ::1/128 Scope:Host
　　　UP LOOPBACK RUNNING  MTU:65536  Metric:1
　　　RX packets:430 errors:0 dropped:0 overruns:0 frame:0
　　　TX packets:430 errors:0 dropped:0 overruns:0 carrier:0
　　　collisions:0 txqueuelen:0 
　　　RX bytes:130001 (126.9 KiB)  TX bytes:130001 (126.9 KiB)

　▲IPアドレス設定
　　sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
HWADDR=08:00:27:7E:A0:6A
TYPE=Ethernet
UUID=bb1cb85c-5e85-4966-bd3b-1ca109497c1a
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp

　▲ネットワーク再起動
　　sudo service network restart

　▲iptablesを使ってポートの制御をする
　　sudo vi /etc/sysconfig/iptables

下記を追加
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2222 -j ACCEPT

　　sudo /etc/init.d/iptables restart


■用途
　　ブラウザでアクセスする場合はアドレスバーにhttp://192.168.0.86:8080を入力すればOK
　　(ゲストOS側でWebサーバーが起動されていることが前提です)

　　SSHで接続する場合はサーバーIPを192.168.0.86、アカウント情報、ポート番号を指定
OpenSSLでプライベートCAを構築する方法


## CAの作成
### CAのディレクトリを作成
mkdir /etc/pki/myCA

### 設定ファイルを用意
/etc/pki/tls/openssl.cnfをmyCAにコピー
openssl.cnfの以下を編集

[ CA_default ]
dir = /etc/pki/myCA

[ req ]
default_md = sha256

[ usr_cert ]
basicConstraints=CA:TRUE
nsCertType = client, email

### 以下のディレクトリとファイルを作成
mkdir certs
mkdir crl
mkdir newcerts
mkdir private
touch index.txt
touch serial
echo "01" > serial

## 認証局の秘密鍵を作成
openssl req -new -config ./openssl.cnf -x509 -keyout cakey.pem -out cacert.pem -days 3650 -sha256

## サーバ証明書の作成
### 鍵の作成
openssl genrsa -out 出力ファイル

### CSRを作成
openssl req -new -sha256 -key 鍵ファイル -out 出力ファイル

## サーバ証明書をsha256で署名する
openssl ca -md sha256 -config /etc/pki/myCA/openssl.cnf -cert CAの証明書 -keyfile CAの秘密鍵 -out 出力ファイル -infiles CSRファイル
PMとエンジニアを両立することについて

この記事は Product Manager Advent Calendar 2016 の14日目の記事です。
私が新規サイト立ち上げをやったときの話をベースに書きたいと思います。

直近でメディアサイト立ち上げという案件をやったのですが、
その時にエンジニアとPMを兼務していたのでその時感じたメリット/デメリットについて書きたいと思います。

# 前提　

ここでいうPMとは?
→A. エンジニアとデザイン以外のことをだいたいすべてやる人

ステークホルダーなどは?
→A. こんな感じ
![スクリーンショット 2016-12-14 15.43.15.png](https://qiita-image-store.s3.amazonaws.com/0/35779/311e5994-bfce-b877-ac6a-61ad3cf5107f.png)


# メリット

**新技術を導入しやすい**
エンジニアとPMが別でいて、PMが事業責任を持っていて、エンジニアがアーキテクチャや採用技術の責任をもっている場合、
何かしらの調整が必要なことが多く、技術チャレンジはほどほどになってしまう事が多い気がします。
技術側も事業的責任を取りづらいから技術的挑戦はほどほどにしたりする気がしています。
二つの責任を同じ人が持っている場合は、<font color="red">結局のところ自分の責任なので、積極的にチャレンジする事ができます。</font>
あと、そうした方が得です。

新規の案件は特に、考慮しきれない問題は後から発生しうるものなので、
どうせ問題起こるなら触りたい技術触っとくべきだったという後悔はつきものです。

**やりたいこととやるべきことのバランスをとりやすい**
例えば下記のような感じ。ちょうど良いところを探す調整が楽でした。
<font color="red">「新しい技術を触ってもスピードを落とさないためにWordpressを管理ツールとして導入する」</font>のような選択がしやすかったです。

* やりたいこと
    * AWS(今までAzure)
    * node.js(今までC#)
    * Serverless(今まではサーバー)
* やるべきこと
    * スピード重視
    * コンテンツ管理のしやすさ
    * SEO対策


# デメリット

**エンジニアリングに割く時間が限られる歯痒さ**
本当はいろいろ検証したいし、調査したいけど、PM業に追われて半分くらいのリソースしかエンジニアリングに割けないってことがありました。
→専任のエンジニアと協力してノウハウの共有などである程度緩和するしかなかったです。
　また、<font color="red">午前はPM業、午後も少しPM業、午後の後半と残業はエンジニア。</font>みたいな形で効率を良くすることで少しは改善されました。

**バランスの取り方がやや技術よりになりがち**
これは経験とかにも依るだろうし、人それぞれかもしれないけれど、
どうしてもエンジニアとしての自分もある場合は、エンジニアリング的に面白そうな事に手を出したくなってしまいがちです。
→基本的には絶対的なやることの量を減らして、時間を確保するしかないと思っています。
　あとは、事業目線でのアドバイザーを確保して活用することで、今の最優先を見直す時間を取るとかでしょうか。

# まとめ
今回は経験をもとに書きましたが、
そもそもエンジニアとPMを両立するのが正解なのかはわかりません。
ただ、両立するとしても、いろいろな工夫をすれば意外と効率良く運ぶこともあるなと感じた次第です。

誰かの参考になれば幸いです。
AWS認定ソリューションアーキテクト プロフェッショナル合格してみて

# はじめに

秋にAWS認定ソリューションアーキテクト プロフェッショナルに合格しました。
気が付いたらアソシエイトがexpireしていて、どうせならという事で受験して何とか合格しました（1回落ちた）。

私が考える試験対策を紹介して、具体的な問題ではなく、勉強の方向性が伝われば良いかな、などと勝手に期待しています。

# 試験の結果

得点:	72%
結果:	合格

試験時間は長いし、問題の構造上、絶対に自信があると言い切れる問題ばかりではありません。
その為、結果を見た時は予想よりも採れていると感じました。（ニヤけた）

# 私とAWS

AWSを使い始めたのはTokyoリージョンができる1年前から仕事で利用していました。
最初はAWSの仕様も知らず、ELBをAレコードで登録して知らんサイトが表示されたり色々とやらかしました。
その後も仕事でがっつり使用しているので基礎知識は備わっているはずです。

また今の仕事はインフラ系エンジニアなので、Ops系サービスを使う頻度が高いです。
仕事で使うのは、

* Compute系(EC2とか)
* Storage系(S3とか)
* Database系(RDSとか)
* Network&Content Delivery(VPCとか)
* Management Tools(CloudWatchとか)
* Security,Identity&Compliance(IAMとか)
* Analystics(Elasticsearch Serviceとか)

の一部サービスで、その他サービスは検証で触ったりセミナーで話を聞いた程度です。

# 勉強

[AWS クラウドサービス活用資料集](https://aws.amazon.com/jp/aws-jp-introduction/)

BlackBeltは必ず読んだ方が良いですが、それだけでは厳しいと感じました。
サンプル問題とか模擬試験を実際に問いてみるとわかりますが、
「明快な回答を導き出す」のではなく「最適な回答を導き出す」のが大事になると思います。
サービス単体を理解するだけではなく、各サービスを比較出来てどのようなニーズの時にどのようなサービスをチョイスできるかが大事だと思います。

なので私が優先したのは、

* 技術情報は浅く広くインプットしていく
* 模擬試験で納得いく回答を出す（出来ればその後もう一回。。。予算があれば受ける）

を繰り返して実際の問題に慣れるようにしていました。

同じ問題は出ませんが（多分）、問題のパターンに慣れて本番の問題でも思考しやすく感じました。
※当然ですけど、模擬試験だけでは受かりませんよー


その他では、各社ベンダ試験と同様に、英文の日本語訳なので日本語がわかりづらい点が多々あります。
慣れていないと無駄な突っ込みをして時間をロスしてしまいます。


# 環境

仕事でAWS環境に触れている事は大きいメリットだと思いました。
さらにAWSの顧客提案やコンサル風な事もするので、顧客の要件とAWSで実装できる構成、なんていう議論は同僚と常に仕事でこなしている環境にいます。

完全独学となるとやはり地道に時間をかける必要があるかもしれません。

# これから

AWSの他の資格に向かうかは未定。（AWS以外の資格に進むかも）
今後は、AWSの資料で試験に役立つようなテーマを咀嚼して記録したいと思います。
Web広告の登場人物

このエントリーは、エキサイト Advent Calendar 2016 の12/22の記事です。
エキサイトとしては初のAdvent Calendar参戦です！

こんにちは！今年の９月に入社しました
にへい＠ADマネジメント部です！

以前はシステム開発会社に在籍してまして
システムの開発/保守やアドネットワークの運用に携わってました。

今回はWeb広告に付いて余り知識が無い人向けに
Web広告を配信するにあたって
どんな登場人物がどんな役割を持っているのか
図を交えて簡単な記事にしてみたいと思います。

#１．黎明期
登場人物
・広告主・・・メディアに費用を払い広告の掲載を依頼する
・広告代理店・・・広告主とメディアの広告掲載の仲介を行う
・メディア・・・広告主から費用を貰い広告を掲載する
・ユーザー・・・広告をクリックし商材に対して成果を上げる
　　　　　　　　（商品の購入、サイトへの会員登録、アプリのダウンロード等など）
　　　　　　　　※広告を見たからと言って、必ずしもクリックや成果を上げる必要は無い

１：広告主とメディアの直接やり取り
![1-2.JPG](https://qiita-image-store.s3.amazonaws.com/0/146909/a22f90bb-ccad-63b5-4770-2c56dfc12ad6.jpeg)
２：代理店を介してのやり取り
![1-3.JPG](https://qiita-image-store.s3.amazonaws.com/0/146909/0d15bfb5-a89a-7846-ac2b-e5ae1054493d.jpeg)

黎明期はメディアに対し広告主が直接広告の掲載を直接依頼したり
広告代理店を介して依頼するというのが主流だったかと思われます。

ここで広告代理店が目をつけたのが
・広告主は必ずしも多くのメディアと取引をしている訳ではないし
　広告を配信するためのシステムをもっている訳ではない
・メディアも必ずしも多くの広告主と取引をしている訳ではない
ということになります。

そこで広告代理店がアドネットワークという広告主とメディアを繋ぐシステムを作ります。

#２．アドネットワーク登場
登場人物
・広告主
・アドネットワーク（主に広告代理店が運用）・・・広告主とメディアを繋ぐ
・メディア
・ユーザー

![2-2.JPG](https://qiita-image-store.s3.amazonaws.com/0/146909/70abf12f-0776-1225-255b-0ce4180c79c2.jpeg)



アドネットワークは前述の通り、広告主とメディアを繋ぐ役割を持ってます。
広告主はアドネットワークに登録をすれば、広告を掲載してくれるメディアを見つけられ
メディアは掲載を行う広告主を見つけられます。
自社システムを持っていない広告主はシステムを作る必要が無いので一石二鳥ですね！
メディアについても、広告主によって広告の掲載方式（JSだったりHTMLだったり）
が異なったかと思われるので、アドネットワークの掲載方式さえクリアすれば良く
広告掲載までのフローが大幅に簡略化されました！

こうして、アドネットワークの需要が高まり色々なアドネットワークが誕生しました。

競合他社に負けないようにアドネットワークの運営元や開発元は大忙しとなった訳ですが
アドネットワークの開発も運営もしている会社さんなんかは
「新規の広告主やメディアに営業を掛けるリソースが無い！」
と言った状況になってしまったケースも少なからず存在すると思います。
~~実際に僕の居た会社も新規営業にリソースを中々割けませんでした。~~

そこに、別の代理店が営業代行を持ちかけました。
今回は
アドネットワーク to 広告主の代理店を『広告代理店』
アドネットワーク to メディアの代理店を『メディアレップ』
と、記載させていただきます。


#３．代理店の細分化
登場人物
・広告主
・広告代理店・・・広告主の情報をアドネットワークへ登録
・アドネットワーク
・メディアレップ・・・メディアの情報をアドネットワークへ登録
・メディア
・ユーザー

![3-2.JPG](https://qiita-image-store.s3.amazonaws.com/0/146909/96464813-90c8-64c6-c31b-accf08435839.jpeg)



いかがでしょうか。ユーザーの動き自体は変わらないのですが
初めと比べ、登場人物が随分と増えてきましたね。
今回はWeb広告の登場人物と役割をざっくりと書かせていただいたのですが
現在でも広告主は代理店を介さずにアドネットワークと取引をしていたり
するので上記の図以外にも様々なパターンがあります。

因みにですが、代理店は色々なアドネットワークと取引を行うので
広告代理店はどのアドネットワークに獲得した広告の
配信を行えば効率が良いのか判断するシステムを作ったり
メディアレップはどのアドネットワークが
一番広告単価を出してくれるのかを判断するシステムを作ったりと
広告配信の裏側はかなり複雑になってきています。

これらを一言で、アドテクノロジーと言うのですが
広告主に対しては、広告を効率よく配信し
メディアに対しては、収益を最大化する
といった目的があります。

日々、アドテクノロジーは進歩してるんですね！