OmniAICreator/Qiita-1.07M huggingface dataset:
virtualenv のインストール

よく忘れるのでメモ

# インストール環境
自分が使う環境にインストールするので、その環境を記載。

|ミドルウェア|バージョン|
|:-----|:-------|
|OS|macOS Sierra|
|Python|3.6.1|
|pip|9.0.1|
|virtualenv|15.0.1|

基本を大事にということで、公式ドキュメントに記載のやり方を実施
[virtualenv -Installation](https://virtualenv.pypa.io/en/stable/installation/)

インストールの手順の前に、注意事項が３つほど記載されているので見てみると

- virtualenv-1.9 以上をインストールすることをお勧めします。1.9 より前のバージョンでは、virtualenv に含まれている pip が SSL 経由で PyPI からダウンロードされませんでした。
- pip を使用して virtualenv をインストールする場合は、pip 1.3 以上を使用することをお勧めします。バージョン 1.3 以前では、pip は SSL 経由で PyPI からダウンロードされませんでした。
- easy_install は SSL 経由で PyPI からダウンロードされず、いくつかの微妙な方法で壊れてしまったので、setuptools 0.9.7 を使用する場合は virtualenv のインストールに easy_install を使用しないことをお勧めします。

自動翻訳がおかしい感じもしますが、今回は気にしなくて良さそうなのでとばします。

# インストール方法
ここでは pip を使用してインストールします。

```
$ [sudo] pip install virtualenv
```

次のコマンドを実行

```
$ virtualenv --version
15.1.0
```

ちゃんとバージョンが表示されたので、正しくインストールされているようです。

# 参考情報
- [virtualenv - Installation](https://virtualenv.pypa.io/en/stable/installation/)
Unity の null 比較

## TL;DR

`UnityEngine.Object.operator ==`　は override されているので null との比較は気をつける。

[Unity - スクリプトリファレンス: Object.operator ==](https://docs.unity3d.com/jp/540/ScriptReference/Object-operator_eq.html)

## Test

Component の拡張メソッド `TryGetComponent<T>` の実装をテストする。
取得したい Component が存在しなければ、 false になる。

```
[Test]
public static void TryGetComponentWhenNotExistsReturnFalse()
{
    var gameObject = new GameObject();
    var rigidbody = gameObject.AddComponent<Rigidbody>();
    BoxCollider outBoxCollider;
    Assert.IsFalse(rigidbody.TryGetComponent(out outBoxCollider));
}
```

## 失敗する実装

```
public static bool TryGetComponent<T>(this Component component, out T t)
{
    t = component.GetComponent<T>();
    return t != null;
}
```

## 成功する実装

```
public static bool TryGetComponent<T>(this Component component, out T tComponent)
    where T : Component
{
    tComponent = component.GetComponent<T>();
    return tComponent != null;
}
```

generic 型制約 `where T : Component` をつける。

[where (ジェネリック型制約) (C# リファレンス) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/where-generic-type-constraint)

## 理由

失敗する実装では `T` が `System.Object`　なので、 `!= null` が `true` になる。
成功する実装では `T` を `Component` の継承に制約したため、 `UnityEngine.Object` となり、　null 比較が正しく行われる。
画面変遷備忘録

#画面遷移

##MainActivity
Intent=Activityが情報の受け渡しをする箱
Intentクラス→これは普通のオブジェクト作成と一緒

Intent intent = new Intent(getApplication(), DetailScreen.class);
startActivity(intent);

###SubActivty
onCreate=Activityが最初に生成される時

遷移された画面を受け取る
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.detail_screen);
}
Composerでどこでもテストしたかった問題

# Composerのイケてないところ

例えば、RubyのBundlerだと、カレントディレクトリにGemfileが無くても、プロジェクトルートを勝手に判断して（つまり、Gemfileのあるディレクトリをワーキングディレクトリとして）実行してくれる。

しかし、我らがPHPのComposerはこうである。（以下、`/path/to/project` にcomposer.jsonがあると仮定）

```bash
$ pwd
/path/to/project/src/hoge
$ composer dumpautoload
Composer could not find a composer.json file in /path/to/project/src/hoge
To initialize a project, please create a composer.json file as described in the https://getcomposer.org/ "Getting Started" section
```

これの何が困るかというと、例えば `composer test` にPHPUnitを設定していて、testsディレクトリ内で作業中にPHPUnitを実行したくなった時、一旦プロジェクトルートにカレントディレクトリを移してコマンドを叩かなければならないことが挙げられる。

# 一応回避策はある

> ## Global Options
>
> - --working-dir (-d): If specified, use the given directory as working directory.
>
> 引用：[Command-line interface / Commands - Composer](https://getcomposer.org/doc/03-cli.md)

要するに、

```bash
$ pwd
/path/to/project/src/hoge
$ composer dumpautoload --working-dir=/path/to/project
Generating autoload files
```

こうすればちゃんと動いてくれるということである。が、いちいち指定するのは面倒くさいしアホらしい。

# それでこうした

.bashrcに以下の関数を記述した。shファイルに切り出してPATHの通ってるところに置いてもいいかもしれない。

```bash
composer() {
  local dir="$PWD"
  while [ -n "$dir" ]; do
    [ -f "$dir/composer.json" ] && break
    [ "$dir" = "/" ] && dir="." && break # / の dirname を取ると / が返るので、見つからなかったらカレントディレクトリを使うようにする
    dir="$(dirname $dir)"
  done
  "$(which composer)" "$@" --working-dir="$dir"
}
```

簡単に言うと、カレントディレクトリから上位ディレクトリに向けてcomposer.jsonを探索し、最初に見つかった場所をワーキングディレクトリとしてcomposerに渡している。

例えば、これで `/path/to/project` にいないときでも `composer test` するとPHPUnitが実行できるようになる。

# もうちょっといい感じにしたかった

これが動かない。

```bash
$ pwd
/path/to/project/tests
$ composer test HogeTest.php
> phpunit 'HogeTest.php'
Cannot open file "HogeTest.php".

Script phpunit handling the test event returned with error code 1
```

`composer test tests/HogeTest.php` とプロジェクトルートからのパスを渡してやる必要がある。

もちろん引数をすべてチェックして、パスであれば絶対パスに変換する方法もある。しかし、例えばカレントディレクトリに `init` ファイルが存在するとき、`composer init` するとうまく動かない。

何かもうちょっといい方法は無いものか・・・

# 追記 (2017-06-11)

ちょっと手を加えた。

```bash
composer() {
  local command="$1" && shift
  local opt options="" dir="$PWD"
  while [ -n "$dir" ]; do
    [ -f "$dir/composer.json" ] && break
    [ "$dir" = "/" ] && dir="." && break
    dir="$(dirname $dir)"
  done
  for opt in "$@"; do
    [ -e "$PWD/$opt" ] && opt="$PWD/$opt"
    options+="$opt "
  done
  "$(which composer)" $command $options --working-dir="$dir"
}
```

composerの一つ目の引数をコマンドとみなして保管。後の引数をすべて回して、パスであれば絶対パスに変換するという対応をした。前のスクリプトも同様だが、ディレクトリ名にスペースがあるとうまく動かないので注意されたい。また、コマンド呼び出しの `$options` をダブルクォートすると、引数を複数渡したときに単一の引数とみなされてうまく動かないので注意。
Ubuntuでtmuxとクリップボードを共有する

## 環境
- Ubuntu16.04
- tmux2.3

## 必要なもの
`xsel` か `xclip` のどちらかを使う。

```
sudo apt install xsel
sudo apt install xclip
```

## vi mode時の設定

### xselの場合
```
bind-key -T copy-mode-vi y send -X copy-pipe-and-cancel "xsel -ip && xsel -op | xsel -ib"
bind-key -T copy-mode-vi Enter send -X copy-pipe-and-cancel "xsel -ip && xsel -op | xsel -ib"
```

### xclipの場合
```
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -i -sel clip > /dev/null"
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xclip -i -sel clip > /dev/null"
```

## emacs mode時の設定

### xselの場合
```
bind-key -T copy-mode y send -X copy-pipe-and-cancel "xsel -ip && xsel -op | xsel -ib"
```

### xclipの場合
```
bind-key -T copy-mode y send-keys -X copy-pipe-and-cancel "xclip -i -sel clip > /dev/null"
```
Prologで解くZebraPuzzle

Prologで研究を始めた初心者Prologerです．

# ZebraPuzzleを解こう
きっかけはこちらの記事
[Prolog実践入門 - AIに特化した老舗言語](http://qiita.com/ShunIchikawa/items/6449f492dc38a7201162)
Prolog界に足を踏み入れようとして，一番最初に拝見させていただいた記事でした
力も多少ついてきたということで，本格的なZebraPuzzleにチャレンジ！

# ZebraPuzzleとは
[参考：ZebraPuzzle](https://en.wikipedia.org/wiki/Zebra_Puzzle)
自力で解けるのは世界人口のうちわずか2%という問題らしいです，ぼくは残念ながら解けませんでした…
[rscの日記：Zebra PuzzleをPythonで解いてみた。](http://d.hatena.ne.jp/rsc96074/20151029/1446113438)
rscさんがPythonで特にあたってルールの日本語訳を載せております．参考にさせていただきました
これらのルールをPrologで落とし込んでいきます

```Prolog:表現方法
house(color, country, animal, drink, smoke)
```
colorで色，countryで国籍，animalでペット，drinkで飲み物，smokeでタバコの銘柄を表現しております
ここから既存の関数をもとに，いくつか関数を追加しました．以下関数説明で述べていきます

#関数説明
## neighbor
隣の家かどうかを判定する関数
左右どちらにいるかを確認できる

```Prolog:neighbor
neighbor(L,R,[L,R|_]).
neighbor(L,R,[_|Xs]) :- neighbor(L,R,Xs).
```

## neighborx
neighborのより抽象的なもの
左右どちらでも通る

```Prolog:neighborx
neighborx(L,R,Xs) :- neighbor(L,R,Xs).
neighborx(L,R,Xs) :- neighbor(R,L,Xs).
```

## drip
述語houseから要素を取り出す

```Prolog:drip
drip(color,  house(Color,_,_,_,_),  Color).
drip(country,house(_,Country,_,_,_),Country).
drip(animal, house(_,_,Animal,_,_), Animal).
drip(drink,  house(_,_,_,Drink,_),  Drink).
drip(smoke,  house(_,_,_,_,Smoke),  Smoke).
```

そうしてできたものがこちら

# ZebraPuzzle

```prolog:zebra.pro
neighbor(L,R,[L,R|_]).
neighbor(L,R,[_|Xs]) :- neighbor(L,R,Xs).

neighborx(L,R,Xs) :- neighbor(L,R,Xs).
neighborx(L,R,Xs) :- neighbor(R,L,Xs).

drip(color,  house(Color,_,_,_,_),  Color).
drip(country,house(_,Country,_,_,_),Country).
drip(animal, house(_,_,Animal,_,_), Animal).
drip(drink,  house(_,_,_,Drink,_),  Drink).
drip(smoke,  house(_,_,_,_,Smoke),  Smoke).

zebra(X,Y) :-
  Street = [H1,H2,H3,H4,H5],
    member(house(red, english, _, _, _), Street),
    member(house(_, spanish, dog, _, _), Street),
    member(house(green, _, _, coffee, _), Street),
    member(house(_, ukurina, _, tea, _), Street),
    member(house(_, _,snail, _, oldgold), Street),
    member(house(yellow, _, _, _, kools), Street),
    member(house(_, _, _, orange, luckystrike), Street),
    member(house(_, japanese, _, _, parliaments), Street),

    neighbor(house(white,_,_,_,_), house(green,_,_,_,_), Street),

    neighborx(house(_,_,_,_,chesterfields), house(_,_,fox,_,_), Street),
    neighborx(house(_,_,_,_,kools), house(_,_,horse,_,_), Street),
    neighborx(house(_,norwegian,_,_,_), house(blue,_,_,_,_), Street),

    drip(drink, H3, Milk), Milk = milk,
    drip(country, H1, Norw), Norw = norwegian,

    member(house(_,X,_,water,_),Street),
    member(house(_,Y,zebra,_,_),Street).

main :- zebra(X,Y).
```
※ (2017/06/12 修正 suharahiromichiさんありがとうございました)

# 結果
```Prolog:結果
?- zebra(X,Y).
X = norwegian,
Y = japanese
```
うまくでてきました！

# 考察
whereの直前まではうまく通っているのですが，writeしてみると`Milk == milk`に引っかかるものが一つもない状態です
neighborxが原因でしょうか
進捗がで次第，追記をしていきます
(2017/06/12 追記) suharahiromichiさんのアドバイスから，typoと==の使い方が間違っていることがわかりました．ありがとうございました
[Swift]アップキャストの2パターン

<h1>アップキャストとは</h1>
対象のインスタンスを、そのインスタンスのスーパークラスからインスタンス化されたものとして扱えるようにすること
<h1>アップキャストの例</h1>
〜書き方〜
<pre>
変数か定数=クラス as スーパークラス
</pre>
●maiyanが後から作ったクラスで、Humanがスーパークラス。
maiyan→Humanのインスタンスということになったので、定数loveはHumanのプロパティなどにアクセスできるが、maiyanクラスのプロパティなどにはアクセスできなくなるゾ

```swift:I_am_hentai.swift
let love=maiyan as Human
```

●このように、定数にあらかじめ型を指定して代入しても同じことができる

```swift:I_am_hentai.swift
let love:Human=maiyan
```

<h1>最後に</h1>
両方同じことができるんだったら、2つ目のやり方の方が分かりやすいし、こっちの方利用頻度多いみたい。
maiyanってなんだよって思った方、僕は乃木坂が好きなオタクなのでお察しください。
Visual Studio Codeいいかも

# はじめに

最近の私のエディタ事情の話。

私が業務上編集するテキストファイルは9割がPython。

宗教上の理由からVIMをずっと使い続けていたが、やはり今どきのエディタとして使用するならそこそこの数のプラグインを入れる必要があった。

んで、あまりプラグインの管理がよろしくないのか、プラグインを追加したい更新したりすると高確率で動かなくなる。
ガチャガチャと書いてるうちに安定したから設定ファイルがものすごいことになってる。動かなくなるのが怖くて整理できない。

ちょこっとneovim試したけど設定ファイルの書き方が変わってて早々に心が折れた。

もう疲れたので、そろそろ脱VIMしようとしてます。

# 最近の俺の環境

## 基本的なコンセプト

* インストールしただけで使える
 * 拡張などは少なければ少ない程良い
* 十字キーでカーソル移動する気はないのでVIキーバインドが使える

## Pythonは

「いいから[PyCharm](https://www.jetbrains.com/pycharm/)使っておけ」なので、JetBrain謹製の[VIMプラグイン](https://plugins.jetbrains.com/plugin/164-ideavim)を導入。
意外と平気。exコマンドつかえないのだけど、そういや俺ほとんど使ってなかったわ。
hkjlの移動さえあればいい。
PyCharm ネ申

## Python以外のファイルを閲覧編集するための軽量なエディタは

調べてたら、気づくと、[Visual Studio Code](https://code.visualstudio.com/download)がとても良くなってた。

ATOM、Bracketはcp932の自動認識が簡単にはできない。俺だってそんなファイル編集したくないけどバッチファイルはcp932じゃないとダメなんだよチクショウ
Visual Studio Codeもデフォルトではオフなんだけど、設定に1行追加することで自動認識してくれる。

```
    "files.autoGuessEncoding": true,  // 文字コードの自動認識
```


エクスプローラもあるし、シンタックスの色分けも良い。

![2017-06-10_17h37_37.png](https://qiita-image-store.s3.amazonaws.com/0/13183/9744d698-47df-30a6-7fa7-952828c43766.png)

今でも十分便利なんだけど、どんどんデフォルトの設定が更新されてて、みるみる便利になってきている。

Sublime Textみたいなやつが追加された！熱い！（minimapという機能で、今まではデフォルトで無効になってたのが有効になったらしい）
![2017-06-10_17h30_29.png](https://qiita-image-store.s3.amazonaws.com/0/13183/13ae3ec9-974a-e3a6-cfae-bd471f36c298.png)

てことで、非プログラマから「エディタって何使えばいいですか？」と聞かれたら今は普通にVisual Studio Codeと答えます。

さらに、拡張（エクステンション）が良い。多くはATOMやSublime Textの拡張の移植な気がする。先人に感謝。

# オススメのエクステンション

## VIM

[VIMエクステンション](https://marketplace.visualstudio.com/items?itemName=vscodevim.vim)。PyCharmと同様。結構平気。

設定もヤンクのこれくらい。

```
    "vim.useSystemClipboard": true,  // クリップボードにヤンク
```

どうやらneovimと連携してexコマンドが使えるようになるらしい。熱い。（でも怖いからしばらくは手を出さない）
![2017-06-10_17h19_16.png](https://qiita-image-store.s3.amazonaws.com/0/13183/165aaf10-b0e9-4b64-63c2-0672a1561ae6.png)

## Python

[Pythonエクステンション](https://marketplace.visualstudio.com/items?itemName=donjayamanne.python)を入れるとPython開発もすいすい。
Visual Studio Codeはデバッガインターフェイスも組み込まれているので、簡単なスクリプトならコーディングから実行までVisual Studio Code内で完結できる。
![2017-06-10_18h00_13.png](https://qiita-image-store.s3.amazonaws.com/0/13183/54c58358-91b9-9b32-16c1-02d7295f3b78.png)

リモートデバッグは出来ないのかな？そこまで調べてないです。宗教上の理由でPyCharmを選択できない場合は強力な選択肢になると思います。

## Maya関連

[MELエクステンション](https://marketplace.visualstudio.com/items?itemName=sator-imaging.mel)を入れればMELも色分けしてくれるよ



# まとめ

Visual Studio Codeは初心者にもお勧めできるエディタとなっていた。

進化のスピードが速く感じる。素晴らしいエコシステムがあるからでしょう。マイクロソフトは本当にいい会社になった。

今気持ち悪いと思ってるのは下記の通り。

* PyCharmとVSCodeのスニペットを共有する術はない？
 * スニペットだけはいまだにUniteを使いたいと思うくらい便利だったので、早く整備しないと心が揺れる。
* syntasticに代わる仕組みがどちらも無い？
 * どのみちコマンドラインでflake8やgjslint動かさないといけないのでそこまで困ってはいない。
仮想通貨XEMをやりとりするためのQRコードを作成する。

すでに枯れてる技術といわれるQRコード。
NFCやBLE、さまざまな技術が出てきては新しいサービスが提案されていますが、
今年に入ってから少し状況が異なってきたようです。

中国の都市部ではQRコードが街中のいたるところで散見されるようになり、
また、iOSなどではカメラにQRコードを読み取る機能が標準装備されるという情報もあり、
QRコードで決済をすませる需要が今後高まりつつありそうです。


[NFCより手軽？中国でQRコード式決済システムが大ブームに。その現状と対策(モバイル決済最前線 鈴木淳也)](http://japanese.engadget.com/2016/07/31/qr/)
[iOS11で最も注目すべきは、QRコード対応かもしれない](http://fladdict.net/blog/2017/06/qr.html)

こういった状況のなか、今回はNEMで送金するめのQRコードの作成方法をお伝えします。

まず、大前提ですが、QRコードに示すものは送金先のアドレスです。
ここに秘密鍵などを載せてしまうと、そのQRコードを知った人は、いとも簡単にそのアカウントからお金を引き出せてしまいます。
相手に見せるQRコードは自分のアカウントのアドレス、これは肝に銘じておきましょう。

現在NEMでは送金するためのアプリは非常に限られていて、
NEM公式のものが存在しますので、今回はそのアプリのフォーマットに準じたものを使用します。以下のURLからMobile Walletをダウンロードしてください。
https://www.nem.io/install.html

アプリを起動すると、QRコードをスキャンする機能があると思います。このスキャン用のQRコードを今回は作成します。

と、いっても簡単。今回も偉大なGoogle先生の力を借ります。
以下のURLの"chl="の後ろに読み込ませたい文字列を記述するだけでQRコードが完成するのです。

```
http://chart.apis.google.com/chart?chs=150x150&cht=qr&chl=thisisjustatest
```

150ピクセルの正方形で”thisisjustatest”という文字列をスキャンすることができます。
印刷するのでもう少し大きいQRコードを作成したいということであれば、"chs=150x150"の150の数字を大きくしてみましょう。ここに他のアドレスのURLを記述すれば、ブラウザで任意のページを表示させることができるQRコードなんていうのも作成できちゃいます。

では、本題にもどりまして、入金を促す（請求用）QRコードのフォーマットの説明です。
"chl="の後ろに以下のような文字列を指定して、URLを叩いてみてください。

```
{"v":2,"type":2,"data":{"addr":"NBZNQL2JDWTGUAW237PXV4SSXSPORY43GUSWGSB7","amount":1000000,"msg":"invoice","name":"Qiita XEM invoice"}}
```

"v":2,"type":2 はバージョンと区分の指定なのでこのままで大丈夫です。
addr が入金先アドレス、amount が入金してほしい額。以前の説明同様に 1,000,000倍した数値を指定してください。上記例だと1XEMの入金依頼QRコードとなります。
msg には入金と同時に送信したいメッセージ（顧客IDなど）も入れることができます。
これは将来複数の顧客から同時に注文を受け付ける時に、入金額を確認するために非常に重要なチェック項目となります。個人間の簡単な送金でしたら、手数料もかかってしまうので空欄でQRを作成するのがよいでしょう。
name にはこのQRコードの説明を入れておきましょう。今のところシステム上必要な情報ではありませんが、この値が無いと公式アプリでは読み込めない場合があります。

非常に簡単ですね。コードを作ってスキャンをしてもらうだけで銀行やクレジットカード会社を介さずに仮想通貨のやりとりができてしまうのです。
ショップでの利用目的であれば、個人情報を預かることによる情報漏えいの心配もありません。
**XEMなら手数料が1円～(20円/XEM時)で1分程度で送金が完了するので、ビットコインよりも現実的です。**
なお、手数料はNEMのネットワーク維持（報酬等）のために使用されるため、決して無駄な費用ではありません。

ショップの片隅にあまり売るつもりのない店長の趣味のアイテムなんかをQRコードと並べて置いておいて
「あー、これ売るつもりないんスけど、NEMだったらお譲りしますよ」
とか洒落てますね。

ちなみにQRコードを生成する実際のURLはこんな感じになります。

http://chart.apis.google.com/chart?chs=150x150&cht=qr&chl={%22v%22:2,%22type%22:2,%22data%22:{%22addr%22:%22NBZNQL2JDWTGUAW237PXV4SSXSPORY43GUSWGSB7%22,%22amount%22:1000000,%22msg%22:%22invoice%22,%22name%22:%22Qiita%20XEM%20invoice%22}}

これから税制面などが整備されてくれば仮想通貨決済という手段もたくさん増えてくると思います。
大企業じゃなきゃお金のやり取りなんか出来ないんだ、と思わずに、まずは友達どうしで割り勘感覚から仮想通貨の利用を楽しんでみましょう。

XEMBookではXEM割りという機能を実装しています。
現在のXEMと日本円の相場から割り勘の額をXEMで計算するというものです、
計算が終わると請求用のQRコードが自動出力されます。
ぜひ、飲み会の割り勘の計算にご利用ください。


http://xembook.net/?address=NBZNQL-2JDWTG-UAW237-PXV4SS-XSPORY-43GUSW-GSB7

address=の後ろを所有のアドレスに書き換えてください。

それでは！

----
以下のNEMアドレスは、全てNEM上でエンジニアが活動できるための資金に使用します。
これから私が書く記事に共感していただけましたら、ご寄附いただけると助かります。

NEM ADDRESS: NBZNQL-2JDWTG-UAW237-PXV4SS-XSPORY-43GUSW-GSB7
Python - 数値積分 台形法 & シンプソン法

台形法とシンプソン法を用いて以下の数値積分を行う。

```math
\int_0^2 {x^5}dx
```
#厳密解
```math
\begin{eqnarray}
\int_0^2 {x^5}dx &=& [\frac{1}{6} x^6]^2_0 \\
&=& 10.6666666666... 
\end{eqnarray}
```

#台形法

被積関数f(x)を積分区間でN個に分割し、i+1番目の区間[x_i, x_i+1]を台形で近似し足し合わせていく方法。

各台形の面積は(上底+下底)×高さ÷2より

```math
S_i=\frac{(f(x_{i+1})+f(x_{i}))×(x_{i+1}-x_{i})}{2}
```

区間x=[a,b]での和は

```math
\begin{eqnarray}
S &=& \int_a^b {f(x)}dx \\
&=& \sum_{i=0}^{N-1} \int_{x_{i}}^{x_{i+1}} {f(x)}dx \\
&≃& \sum_{i=0}^{N-1}S_i \\
&=& \frac{1}{2}\sum_{i=0}^{N-1}(f(x_{i+1})+f(x_{i}))(x_{i+1}-x_{i}) \\
&=& \frac{1}{2}\Biggl(f(x_0)(x_1-x_0)+\sum_{i=1}^{N-1}f(x_i)(x_{i+1}-x_{i-1}+f(x_{N})(x_{N}-x_{N-1})\Biggr)
\end{eqnarray}
```

となる。
N等分の場合は、h = (x_i+1 - x_i) = (b - a)/Nとすると

```math
S = \frac{h}{2}(f(x_0)+2\sum_{i=1}^{N-1}f(x_i)+f(x_N))...①
```
誤差はO(h^2)
###・計算コード
N=10000

```py3
def f(x):
	return x**5.0 # x^5

N = 10000

a = 0
b = 2
h = (b-a)/N

S = (h/2) * (f(a) + 2*sum(f(h*i) for i in range(1,N-1)) + f(b)) # ①の計算

print(S)
```
###・結果

```py
>>> print(S)
10.660270132693393
```

#シンプソン法
3点間を2次のラグランジュ補間を行い、各3点間に対して積分を行い和を計算する方法。

3点間x_i、x_i+1、x_i+2の2次のラグランジュ補間関数は以下

```math
\begin{eqnarray}
f^{(i)}(x)&=&\frac{(x-x_{i+1})(x-x_{i+2})}{(x_i-x_{i+1})(x_i-x_{i+2})}f(x_i) + \frac{(x-x_{i})(x-x_{i+2})}{(x_{i+1}-x_{i})(x_{i+1}-x_{i+2})}f(x_{i+1}) + \frac{(x-x_{i})(x-x_{i+1})}{(x_{i+2}-x_{i})(x_{i+2}-x_{i+1})}f(x_{i+2})
\end{eqnarray}
```

補間関数を区間[x_i,x_i+2]で積分すると

```math
\begin{eqnarray}
S_i &=& \int_{x_i}^{x_{i+2}}f^{(i)}(x)dx\\
&=&\frac{1}{6}[\frac{x_{i+2}-x_i}{x_i-x_{i+1}}(2x_i+x_{i+2}-3x_{i+1}f(x_i) + \frac{(x_i-x_{i+2}^3)}{(x_{i+1}-x_i)(x_{i+2}-x_{i+1})}f(x_{i+1}) + \frac{x_{i+2}-x_i}{x_{i+2}-x_{i+2}}(2x_{i+2}+x_i-3x_{i+1})f(x_{i+2})]
\end{eqnarray}
```

N等分の場合は、h = (x_i+1 - x_i) = (b - a)/Nとすると


```math
\begin{eqnarray}
S_i &=& \frac{h}{3}(f(x_i)+4f(x_{i+1})+f(x_{i+2}))
\end{eqnarray}
```

区間x=[a,b]での和は


```math
\begin{eqnarray}
S &≃& \sum_{i=0}^{\frac{N}{2}-1}S_{2i}
\end{eqnarray}
```

誤差はO(h^4)
###・計算コード
N=10000

```py3
def f(x):
    return x**5.0

N = 10000

a = 0
b = 2
h = (b-a)/N

S = (h/3) * sum((f(h*i) + 4*f(h*(i+1)) + f(h*(i+2))) for i in range(0,N-1, 2))

print(S)
```

###・結果
```py3
>>> print(S)
10.666666666666648
```
【メモ】Amazon LinuxでServerless Frameworkを利用できるようにする

# 背景

嵌まったり、バグ踏んだりしたのでメモ

# 動作要件

https://serverless.com/framework/docs/providers/aws/guide/quick-start/#pre-requisites

# 前提

* Amazon EC2を利用
* ec2-userでログインして作業


# 手順

## 1. Node.jsのインストール

この辺を参考にします。

https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora

https://serverless.com/framework/docs/providers/aws/guide/installation/#installing-nodejs



```bash:コマンド
curl --silent --location https://rpm.nodesource.com/setup_6.x | sudo bash -
```

```bash:コマンド
sudo yum -y install nodejs
sudo yum -y install gcc-c++ make
```

```bash:コマンド
node -v
```

```text:結果
v6.11.0
```

## 2. Serverless Framework

以下のコマンドを実行。

```bash:コマンド
sudo npm install -g serverless
```

2017/6/10に実行した際、以下のバグを踏んだ

https://github.com/serverless/serverless/issues/3757

以下の通り、オプションを付けることで回避できた。

https://stackoverflow.com/questions/25011703/write-file-in-home-directory-when-running-npm-install

```bash:コマンド
sudo npm install -g serverless --unsafe-perm
```

```bash:コマンド
serverless -v
```

```text:結果
1.15.1
```

以上
twythonで実装されてないAPIを使う

PythonでtwitterのAPIを使おうとtwythonを使ったらunretweetが実装されてなかった。ということで内部実装を使いましたという例。


```py3
from twython import Twython

twitter = Twython(APP_KEY, APP_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
# twitter.unretweet(id=ID) は無い
twitter.post('statuses/unretweet/%s' % ID)
```

あとはTwitterのAPIリファレンスを参考に。
VS Codeで言語サポートが日本語にならない場合の対処法


1. <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+</kbd><kbd>p</kbd>でコマンドパレットを起動。  

2. 「**Configure Language**」を選択
<img src="https://sfpgmr.github.io/images/2017/06/2017061101.png"  />

3. locale.jsonファイルが開くので、`locale`を`ja`に変更して保存。  
<img src="https://sfpgmr.github.io/images/2017/06/2017061102.png" />

4. VS Codeを再起動  
<img src="https://sfpgmr.github.io/images/2017/06/2017061103.png" width="100%" />
windows環境でElectronからflashを使えるようにした

Electronでflashが使われているページを開くとプラグインがないと言われてしまう。
pepper flash pluginというものを使えばいいようだが、windowsで行う場合がすぐ見つからなかったのでメモ

windows10でpepper flash pluginは以下にあったので、
使いやすいようにpepflashplayer64XXX.dllをコピーしておいた。
```C:\Windows\System32\Macromed\Flash\```

とりあえず艦隊これくしょんを開いてみた。

```main.ts
///<reference path="./typings/index.d.ts"/>

// In the main process.
const { app, BrowserWindow } = require('electron')
const path = require('path');

const ppapi_flash_path: string = path.join(__dirname, 'pepflashplayer64_25_0_0_171.dll');
app.commandLine.appendSwitch('ppapi-flash-path', ppapi_flash_path);

app.on('window-all-closed', () => {
    app.quit()
})

app.on('ready', () => {
    let win = new BrowserWindow({ width: 800, height: 600, 'webPreferences': { 'plugins': true } })
    // load a page
    win.loadURL('http://www.dmm.com/netgame/social/-/gadgets/=/app_id=854854/')
    console.log(app.getAppPath())
})
```

ちゃんと開けた
![WS000422.JPG](https://qiita-image-store.s3.amazonaws.com/0/153576/2f8e4c43-7479-8ccf-15c6-245744e53321.jpeg)


参考
tutorial/using-pepper-flash-plugin
https://github.com/electron/electron/blob/master/docs/tutorial/using-pepper-flash-plugin.md
vueの単一ページコンポーネントのテストをkarmaなしで行う

## 現状
vueの単一ページコンポーネントのテスト行う場合、
公式ドキュメントの[単体テスト](https://jp.vuejs.org/v2/guide/unit-testing.html#ad)の項に従って行った場合は、[karma](http://karma-runner.github.io/1.0/index.html)が必要になります。

## 問題
ただKarmaを利用した場合、そのための設定が必要になってちょっと面倒です。
その上、手間をかけて設定したとしてもViewのレンダリングを含めてのテストは後回しになるケースが多く(自分の場合)、レンダリングのテストは無駄になる場合も多いため、そこにコストをかけたくありません。またKarmaの起動するコストも気になります。

## 解決策
`.vue` ファイルをimportすることでモジュールのテストができれば良いのですが、そのままjavaファイルをimportした場合はparseできずにエラーになります。これをできるようにするのが今回のGoalです。

## 結論

package.jsonに以下を追加した上で

```package.json
{
  "devDependencies": {
    "babel-core": "^6.24.0",
    "vue-template-compiler": "2.2.6",
  },
}
```

vue用のloaderを自作して、

```test/loader.js
import fs from "fs";
import path from "path";

import { parseComponent } from "vue-template-compiler";
import { transform } from "babel-core";

require.extensions[".vue"] = (module, filename) => {
  const parsed = parseComponent(fs.readFileSync(filename, "UTF-8"));
  const content = transform(parsed.script.content, { extends: path.resolve(".babelrc") });
  module._compile(content.code, filename);
};
```

mocha.optsに埋め込みました。

```
--compilers js:babel-register,vue:babel-register
--require test/loader
```

こうすることで、importした場合に、vueの単一ファイルコンポーネントの`<script>` タグの部分のみを解釈したcomponentが生成されます。importされたファイルは`<template>`を持たないVueファイルになるので、[avoriaz](https://github.com/eddyerburgh/avoriaz)を用いて、通常通りmountすることも可能です。

## 簡単な説明

> require.extensions[".vue"] = (module, filename) => {

`.vue`の拡張子を持つファイルを読み込んだ場合の実行されるローダーを定義します。

>  const parsed = parseComponent(fs.readFileSync(filename, "UTF-8"));

[vue-template-compiler](https://www.npmjs.com/package/vue-template-compiler)の[parseComponent](https://www.npmjs.com/package/vue-template-compiler#compilerparsecomponentfile-options)を使って、対象のvueファイルをparseします。

>  const content = transform(parsed.script.content, { extends: path.resolve(".babelrc") });

[babel-core](https://www.npmjs.com/package/babel-core)の[transform](https://www.npmjs.com/package/babel-core#babeltransformcode-string-options--object)を使って、es6のコードをバベります。その際に、`.babelrc`を設定することで、適時変換を行います。依存関係の解決もここで行われます。

>  module._compile(content.code, filename);

変換されたファイルをコンパイルして実際のコンポーネントに変換します。

## 実際のテスト

そのまま、mochaでテストできます

```component.test.js
import Vue from "vue";
import ExampleView from "components/ExampleView.vue";
import { mount } from "avoriaz";

describe("components/ExampleView", () => {
  describe("computed", () => {
    describe("hello", () => {
      it("workが返される", () => {
        const wrapper = mount(ExampleView, {
          propsData: {
             // 必要があれば設定する
          },
        });
        const actual = "world";
        assert(actual === wrapper.vm.hello);
      });
    });
});
```

私は、今のところはこれで必要十分でした。
配列にfor...inはダメと言うけれど、

javascriptにおいて、配列にfor...inはダメとは言うけれど、
なぜダメなのか説明ができないと思ったので言語化してみようと思う。

##はじめに結論
- **for...in命令では処理の順序が保証されない(余分なものが処理される)**
- **for...inでは仮変数にはインデックス番号が格納されるので、値と誤解をまねく**
- **配列(他の列挙可能オブジェクト含む)にはfor...of命令を使う**

##for...in命令って？

```example01.js
for(仮変数　in 連想配列){
  ループ内で実行する命令
}
```
for...in命令は、
指定された連想配列(オブジェクト)の要素を取り出して、先頭から処理する方法のこと。
仮変数には格納されるのは要素値(value)そのものではないことに注意

```example02.js
var data = { apple: 150, orange: 100, banana: 120};
  for (var key in data){
   console.log(key + ':' +data[key]);
  }
// apple:150
// orange:100
// banana:120
```

##for...of命令って？

```example03.js
for(仮変数　of 列挙可能なオブジェクト){
  ループ内で実行する命令
}
```

for...of命令は、
列挙可能なオブジェクト(配列、NodeList、argumentsなど)の**値そのもの**を順に取り出して処理する方法のこと。


```example04.js
var data = [ 'apple', 'orange', 'banana'];
  for (var value of data){
   console.log(value);
  }
// apple
// orange
// banana
```

##配列にfor...inを使ってみる
for...in for...ofの紹介が終わったので、
for...inを配列に使ってみたコードを確認してみる。
一度、for...ofのコードと比べて見てください。

```example05.js
var data = [ 'apple', 'orange', 'banana'];
  for (var key in data){
   console.log(data[key]);
  }
// apple
// orange
// banana

```

上記のコードでは、正常に処理されているように見えますね。
しかし、下記の場合は結果が変わってきます。

```ng.js
var data = [ 'apple', 'orange', 'banana'];
//配列オブジェクトにhogeメソッドを追加
Array.prototype.hoge = function(){}
  for (var key in data){
   console.log(data[key]);
  }
// apple
// orange
// banana
// function(){}
```

結果を見てみると、
拡張された機能(function(){})までが列挙されてますね。
これが最初の結論で述べた　**余分なものが処理される**　にあたります。

ここで、for...ofの処理を見てみましょう。

```ok.js
var data = [ 'apple', 'orange', 'banana'];
//配列オブジェクトにhogeメソッドを追加
Array.prototype.hoge = function(){}
  for (var value of data){
   console.log(value);
  }
// apple
// orange
// banana
```

function(){}は列挙されていませんね。
for...ofを使えば余計な心配をしなくて済みそうです。

##おわりの結論
for...inは連想配列(オブジェクト)の操作に使う
for...ofは列挙可能なオブジェクト(配列、NodeList、argumentsなど)の操作に使う

以上になります。ありがとうございました。
ニューラルネットワークの行列表現

ニューラルネットワークを行列で表現する

なぜ行列表現を使うのかというと、
総和の記号Σや、煩雑な添字番号などを、
行列の計算ルールに押し込むことができ、
ニューラルネットワークの理解への見通しがよくなることが期待される。

まず入力信号X1(n×1の行列)を
X={x1,
   x2,
   x3,
   ……,
   xn}
とする。

まず1層目にパーセプロンが1つだけあるネットワークを考える。
このパーセプトロンの可変荷重W(1×nの行列)を設定する。

W={w1,w2,w3,……,wn}

するとこのパーセプトンの閾値信号Z(1×1の行列)は

W・X＝Z(＝Σxi・zi)

となる。

次に1層目にパーセプロンがm個あるネットワークを考える。
このときのW(m×nの行列)は単純に、それぞれの可変荷重を縦に並べるだけでよい
よって次のように表現できる
W＝{w1 ,w2 ,w3 ,……,wn   ←(1つめのパーセプトロンの可変荷重)
    w'1,w'2,w'3,……,w'n　←(2つめのパーセプトロンの可変荷重)
　　……
　　w''1,w''2,w''3,……,w''n}　←(mつめのパーセプトロンの可変荷重)

するとやはりこのパーセプトロンの閾値信号Z(m×1の行列)は、
パーセプトロンが1つだけだったときと同じように

W・X＝Z

とかけるこができる。

Xがn×1の行列、Wがm×nの行列、zがm×1の行列であることに注意すれば、
Σも添字番号も使わずに閾値信号の計算を表現することができた。
plist形式ファイルを書き換える方法

⚠️ この方法では、実機でアプリ実行中に `Info.plist` ファイルを書き換えることができません。 ⚠️

表題通り、アプリ実行中に ~~Info.plist~~ plist形式ファイル をSwiftが書き換える方法です。
Info.plist読み込みと被ってて、ググってもサクっと出てこなかったので書いておきます。



# 環境
* Swift3.1
* Xcode8.3.3

# SourceCode

```swift
    func update(using value: String) {
        let filename = "Info"
        guard let filePath = Bundle.main.path(forResource: filename, ofType: "plist") else {
            return
        }
        guard let dic = NSDictionary(contentsOfFile: filePath) else {
            return
        }
        guard var data = dic.copy() as? [String: Any] else {
            return
        }
        let key = "key"
        data[key] = value

        let plist: NSDictionary = data as NSDictionary
        plist.write(toFile: filePath, atomically: false)
    }
```

# MEMO
若干、これやっていいのか？って思ってる。
審査とか大丈夫だよね...?

👇
ダメでした...実機で動かないことを確認しました。
Web IDE cloud9でのスマホアプリ開発 using Angular(Ionic)

monacaは触ったことありましたが、対抗馬のIonicは触ったことなかったので触ってみました。

IonicではAngularでのスマホアプリ開発が可能となります。
公式ドキュメントを確認してみると・・・

```bash:command
npm install -g cordova ionic
```

なんかLinuxでも動きそうです。
というわけで今回もcloud9上にスマホアプリ開発環境を構築してみました。

次に進む前に、cloud9のアカウントを取得して、Workspaceを作成しておいてください。
※Workspaceの説明はcloud9環境でReactの検証① -導入-でも参考にしてみてください。

AngularじゃなくてReactがいいという人は[こちら](http://qiita.com/tomine3/items/775891203c545303b0d7)へ。

1. 前準備
---
まずnodeのバージョンを確認します。

```bash:command
node -v
> v4.6.1
```

古すぎる。。
標準インストールのnvmでも使って6系くらいにはあげておきましょう。
インストール可能なnodeのバージョンは```nvm ls-remote```で確認可能です。

```bash:command
nvm install v6.10.3
nvm alias default 6.10.3
node -v
> v6.10.3
```

コマンド実行後nodeのバージョンが変わらない場合はしばらく待ってみてください。

2. Ionicのインストール
---
cloud9のTerminalからコマンド一発！

```bash:command
npm install -g cordova ionic
```

3. プロジェクト作成
---
cloud9のTerminalからコマンド一発！

```bash:command
ionic start myApp tabs
```

4. ブラウザ確認
---
プロジェクトフォルダに移動して、previewコマンドを打ちます。
[cloud9で使用できるポート](https://docs.c9.io/docs/multiple-ports)は8080、8081、8082の3種類なので、
ここではpreviewコマンド実行時にオプションでポート指定をしてやります。

```bash:command
cd myApp
ionic serve --port 8080
```

「dev server running」と表示されれば、ビルドして起動が完了しています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/91976/0f4b32a6-33ba-d1dc-d3d2-54a583471a9f.png" width="80%">

ブラウザでの確認では、https://[cloud9のworkspace名]-[cloud9のユーザ名].c9users.io:8080/webpack-dev-server/ でアクセスしてください。

ユーザ名やWorkspace名が分からない方は、IDEのURLから判断してください。

<img src="https://qiita-image-store.s3.amazonaws.com/0/91976/3d4f5a92-ef36-fdea-7cf3-a252556944dc.png" width="80%">

下図のような画面が表示されていれば成功です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/91976/88dfbc5d-e448-081b-c18e-17b7966ed666.png" width="80%">

続きは気が向いたら書きます。

5. 参考
---
https://ionicframework.com/getting-started/

6. おまけ
---
cloud9のデフォルトメモリは256MBなのですが、ビルドが重い、重すぎます。
351sはひどすぎます。カップラーメンができます。
tsファイルを改修して保存しただけで5分て。。。

<img src="https://qiita-image-store.s3.amazonaws.com/0/91976/575353c2-1553-6451-2823-d609b3253e7c.png" width="50%">

ここはお金の力で解決しました。
Premium Planにアップグレードし、メモリを2.5Gに上げました！

<img src="https://qiita-image-store.s3.amazonaws.com/0/91976/8e135e86-4fad-6cb8-d992-e68bda142365.png" width="50%">

結果、許容範囲まで早くなりました！

<img src="https://qiita-image-store.s3.amazonaws.com/0/91976/a9e7f471-043b-3740-9d6e-b969cb4d83a2.png" width="50%">
プロセスの強制終了 メモ

ターミナルでコマンド実行したときに
`Control+c`でプロセスを終了できない時に使える強制終了の手順

###プロセス停止
とりあえず、`Control+z`でプロセスを停止させる。

###プロセスID取得
次に`ps`コマンドで強制終了させたいプロセスのプロセスIDを確認
`$ ps auxww | grep ファイル名`

###強制終了
プロセスIDを取得できたら、`kill`コマンドで強制終了する。
`$ kill -9 プロセスID`

終わり。
dashDB LocalでSQLを実行する

簡単なメモ。
手元のクライアントソフトから接続するのも良いですが、dashDB Localの中にはdbユーティリティがすでに入っており、これを上手く使えばCLIベースでSQLが打てたので、やり方をメモ。

そもそもdashDB Localとは？というのは、[こちら](http://qiita.com/azzeten/items/dabff42a9d0ac38ff042)

今回のSQL実行にあたり、参考にしたのは[こちら](https://www.ibm.com/support/knowledgecenter/en/SS6NHC/com.ibm.swg.im.dashdb.apdv.porting.doc/doc/dbsql_command.html)


## 接続

dbsqlのオプションとして
- -dでDB名
- -uでユーザ名
- -pqでパスワード
を設定します。

ログインできると、PostgreSQLみたいなコンソールが出てきます。これで接続完了。

```console
# docker exec -it dashDB dbsql -d bludb -u bluadmin -pw xxxxx
Welcome to dbsql, the IBM dashDB SQL interactive terminal.

Type:  \? for help with internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit
BLUDB.BLUADMIN(BLUADMIN)=> 
```

「¥dt」で、DB内にあるテーブル一覧を出します。

```sql:
BLUDB.BLUADMIN(BLUADMIN)=> \dt
No relations found.
```
まだ何も作ってないので、no relations foundです。

では、テーブルを作ります。

```postgres:
BLUDB.BLUADMIN(BLUADMIN)=> create table t1 (col int);
CREATE TABLE
BLUDB.BLUADMIN(BLUADMIN)=> insert into t1 values(2);
INSERT 0 1
BLUDB.BLUADMIN(BLUADMIN)=> create table t2 (col1 char(10));
CREATE TABLE
BLUDB.BLUADMIN(BLUADMIN)=> insert into t2 values ('aaabb');
INSERT 0 1
BLUDB.BLUADMIN(BLUADMIN)=> select * from t1;
 COL
-----
   2
(1 row)

BLUDB.BLUADMIN(BLUADMIN)=> select * from t2;
    COL1
------------
 aaabb
(1 row)
```
できました。

テーブル一覧を表示してみます。作成したt1とt2が確認できます。

```postgres:
METADB.BLUADMIN(BLUADMIN)=> \dt
         List of relations
  Schema  | Name | Type  |  Owner
----------+------+-------+----------
 BLUADMIN | T1   | TABLE | BLUADMIN
 BLUADMIN | T2   | TABLE | BLUADMIN
(2 rows)
```

コンソールから抜けるときは「¥q」です。

```postgres:
BLUDB.BLUADMIN(BLUADMIN)=> \q
```
1からnまでの整数全てで割り切れる最小の正の数を求めるアルゴリズム


[Project Euler の Problem 5 (日本語訳)](http://odz.sakura.ne.jp/projecteuler/index.php?Problem%205)がおもしろそうだったのでやっていました。

まずは正攻法

```ruby:problem5_0.rb
n=20
1.upto(Float::INFINITY).find{|i| (1..n).all?{|j| i % j ==0}}
```

なかなか答えが出ません...

少なくともnの倍数のはずですので、nの倍数だけをチェック、
大きい数字の倍数の方が少ないので、n-1から小さい方にチェックしていくように変更しました。

```ruby:problem5_1.rb
n=20
n.step(Float::INFINITY, n).find{|i| (n-1).downto(2).all?{|j| i % j ==0}}
```
これでやっと17秒です。

Haskellで

```haskell:problem5_1.hs
import Data.List

n=20 :: Int
lcm1= find (\i -> all (\j -> mod i j ==0) [n-1, n-2..2]) [n, n*2..]

main = print lcm1
```

これで0.5秒程度です。

クイズっぽくなって恐縮ですが、(書かれる方の主観で結構ですので)簡単なアルゴリズムで速度がでる方法のコメントをお願いします。

アルゴリズムですので言語は問いません。
nが10以上で、上限は計算が64ビット符合付き整数で処理できるところまでということでお願いします。

##追記(2017.6.12)
みなさんコメントありがとうございました。

コメントをまとめますと、「最小公倍数」を求めれば良いということです。
Ruby
`2.upto(n).inject(&:lcm)`
Haskell
`problem005 n = foldr1 lcm [2..n]`
デザインパターン入門（Flyweight）

この記事ではFlyweightについてまとめます。
wikipediaによると「等価なインスタンスを別々の箇所で使用する際に、一つのインスタンスを再利用することによってプログラムを省リソース化する」とあります。
参考：[Flyweightパターン](https://ja.wikipedia.org/wiki/Flyweight_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

**主な登場人物**

|NO|名前|役割|
|:--|:--|:--|
|1|Flyweightクラス|インスタンス化したいクラス|
|2|FlyweightFactoryクラス|インスタンス化したクラスの状態を保持する|

プログラムで森を表現する場合、木のインスタンスを大量に生成すると思います。大量に生成することでサーバ上のメモリを消費してしまいますが、実行時のインスタンス数を削減してメモリを節約するパターンとなります。Javaではメモリ節約のチューニング案として、String.internというメソッドがありましたが考え方（同じ内容のオブジェクトを使い回す）はほぼ同じかと存じます。

**パターンを実装する**
目的は単純でインスタンス化（ソースコード上でnewする）を減らすことです。wikipediaの例で実装いたします。ある文字列をchar型で一文字づつ定義していき、すでに定義されている文字列であれば使い回す、定義されていなければ生成するプログラムとします。

**Flyweightクラス**

```java:Stamp.java
class Stamp {
    char type;
    Stamp(char type){
        this.type = type;
    }
    void print(){
        System.out.print(this.type);
    }
}
```

**FlyweightFactoryクラス**

```java:StampFactory.java
import java.util.Map;
import java.util.HashMap;

class StampFactory {
    Map<Character, Stamp> pool;
    StampFactory(){
        this.pool = new HashMap<Character, Stamp>();
    }
    Stamp get(char type){
        Stamp stamp = this.pool.get(type);
        if(stamp == null) {
            stamp = new Stamp(type);
            this.pool.put(type, stamp);
        }
        return stamp;
    }
}
```

**実行クラス**

```java:FlyweightTest.java
import java.util.Map;
import java.util.List;
import java.util.ArrayList;

class FlyweightTest {
    public static void main(String[] args) {
        StampFactory factory = new StampFactory();
        List<Stamp> stamps = new ArrayList<Stamp>();
        stamps.add(factory.get('た'));
        stamps.add(factory.get('か'));
        stamps.add(factory.get('い'));
        stamps.add(factory.get('た'));
        stamps.add(factory.get('け'));
        stamps.add(factory.get('た'));
        stamps.add(factory.get('て'));
        stamps.add(factory.get('か'));
        stamps.add(factory.get('け'));
        stamps.add(factory.get('た'));
        for(Stamp s : stamps){
            s.print();
        }
    }
}
```

```:結果
たかいたけたてかけた
```

できるだけメモリ利用を削減するような使い回し処理を入れると、今度はオーバーヘッドや全体のパフォーマンス部分にしわ寄せが行く可能性があるため、それぞれの落とし所を見極める必要があります。ただ、Java言語の場合1つのオブジェクトを生成する為に、文字（char型）だと2バイト、整数（int型）だと4バイトメモリを消費します。それが並列にアクセスされる環境だと一時的とは言っても使用量が数倍になるため意識しておくべき事象（パターン）かと思います。
プログラミング入門コラム１つめ~ソースコード触ろうぜ

#概要

プログラミング入門のきっかけつくりのためにWebコンペを開催するので、補助教材として書いたコラムを、頑張って書いたのでこっちにも転載します(｡◉ᆺ◉)悪しからず(｡◉ᆺ◉)

[【第１弾】コンペでプログラミングに入門！【ソースコードに触れてみよう！】](https://eventdots.jp/column/103)

以下は完全に転載です。Chart.jsを利用したソースコードを教材に説明したりしてます。

# 今回のテーマ

今回のテーマは「ソースコードに触れてみよう！」です。HTMLって何？CSSって何？JavaScriptなにそれおいしいの？とかは後ほど！JavaScriptはおいしくないです！！

まずは動くプログラムに触れてみて、「プログラムコワイ」といった感覚から抜け出しましょう！

ソースコードを確認してみよう！

まずは下記のURLを確認してください。

[https://codepen.io/ksyunnnn/pen/qjBjzY :airplane:](https://codepen.io/ksyunnnn/pen/qjBjzY)
今回のコンペの制作テーマとしてもとりあげられる、ペペロンチーノ採点グラフです。

HTMLとJavaScriptのソースコードが記載されているのがわかります。ここでは、このソースコードが、表示欄に表示しているグラフを描画しているんだな、とくらいに思っていてください。

ソースコードを自分のPCから編集してみよう。

### 準備

ソースコードの編集には、エディター(テキスト編集ツール)が必要です。今回は、Chromeなどのブラウザ上で利用することができるエディター「[CodePen](codepen.io)」を利用します。

まずはCodePenの利用を開始しましょう。利用開始にはアカウントの作成が必要です。

[https://codepen.io :airplane:](https://codepen.io)
※アカウント作成方法はこちらをご確認ください。

フロント書くなら確実に知っておくべきCodePenについてのメモ 
次に、先ほど確認したソースコードのページからソースコードをコピーしましょう。

※CodePenの”Fork(フォーク)”機能を利用するのが便利です。利用方法はこちら 
下記の画像の状態になればOKです。編集しているアカウントが自分であることを「アカウント名」と「アイコン」から確認してください。


これで準備は完了です。

### 編集してみよう

まずJavaScriptのソースコードを確認してみましょう。JSと書いてある欄がJavaScriptのことです。

１行目を確認してください。

```js
var pprn = {
  '3/13': 27,
  '3/14': 5,
  '3/15': 32,
  '3/16': 45,

  // 中略

  '5/25': 138,
  '5/26': 150,
  '5/31': 160,
  '6/1': 187,
  '6/2': 214
};
```
なんとなく、数字を見てみると、この数字がグラフに表示されている「日付」とペペロンチーノの「点数」だということに気づきませんか？気づいた方は良い感じです！

では、この数字を編集してみましょう。

##### 元のソース

```js
var pprn = {
  // 中略
  '5/31': 160,
  '6/1': 187,
  '6/2': 214};
```

##### 編集後のソース

```
var pprn = {
  // 中略
  '5/31': 160,
  '6/1': 187,
  '6/2': 214
  '6/3': 100,
  '6/4': 120
};
```
６月３日分と、４日分を追加してみました。


エラーが表示されたのがわかります。クリックするとエラー文が表示されますが、何言ってるのかよくわかりません。気持ち悪いです。

```
unexpected String
```
日本語に訳すと「予想外のString(文字列のこと)」。要するに「書き方が間違ってるよー。」とおっしゃってます。

既に気づいた方いたら最高です。６月２日のデータと３日のデータの間にコンマ[ , ]がないですね。

これ追加してみましょう。

##### 正しい編集後のソース

```js
var pprn = {
  // 中略
  '5/31': 160,
  '6/1': 187,
  '6/2': 214, // ここ
  '6/3': 100,
  '6/4': 120
};
```
こんな風に一文字足りないだけでも怒られたり動かなかったりします。ただ、たいていはエラー文をみればわかるので、頑張りましょう

上記ソースコードでうまくいったはずです。グラフに２日分のデータが追加されたことがわかります。

# 何が起きているのか

先ほどの作業で、

```js
var pprn = {...
```
に値を追加するとグラフにデータが追加されることがわかりました。
これは、「pprn」 というデータの入れ物(変数という)にデータを追加して、そのあとのソースコードが処理をしてグラフを描画していることを示しています。

つまりここにいれるデータの入れ方を変化させれば、グラフの描画の仕方を変えられます！

# サンプルコード

今回のコラムで記載した内容を利用して以下のようなパターンのグラフが作成できます！

##### グラフ切り分けバージョン

[https://codepen.io/ksyunnnn/pen/EXPvWP :airplane: ](https://codepen.io/ksyunnnn/pen/EXPvWP)
3,4月分と5,6月分を切り分けてみました。

# 質問がありますか？

メンターへの質問用のチャットを、Slackというチャットツールを利用して公開しております。メンターに質問したい方は、下記リンクより、チャットグループへご参加ください。

[https://goo.gl/forms/xAYvAl5j82jyrgoG3 :airplane: ](https://goo.gl/forms/xAYvAl5j82jyrgoG3)

# 最後に

このコラムはHTML/CSS/JaveScriptで挑むWebコンペ！への参加者向けのコラムです。このコラムを読んで、コンペに興味を持っていただいた方は、是非気軽に参加してくださいね！
まだいきなり参加は不安だな、と思う方には、ハンズオン形式の勉強会も開催します。奮ってご参加ください！

[【初心者歓迎！】HTML/CSS/JaveScriptで挑むWebコンペ事前勉強会！【MoquMoquCOM】 ](https://eventdots.jp/event/623796)
kintoneのsetConfig()でUncaught Error: Usage:というエラーの解決方法

プラグイン設定画面にて、kintone.app.setConfig()関数を使う時に下記のようなエラーが出ることがあります。
<br>

![スクリーンショット 2017-06-10 13.47.51.png](https://qiita-image-store.s3.amazonaws.com/0/186340/0704929b-18d8-b30a-190c-a9ddff48a5e0.png)


エラーメッセージ：Uncaught Error: Usage:
kintone.plugin.app.setConfig(config, opt_callback)

<br>
上の写真の例のように配列などを含んでいる場合は、JSON.stringifyで配列オブジェクトを JSON テキストに変換すればOKです。
<br>
つまり、下記コードにすればうまくいきます。

config.key = JSON.stringify(["a","b","c"]);

<br>
そしてconfigのデータを使う時はJSON.parseで元に戻してから使ってください。

（例）
var config = kintone.plugin.app.getConfig("プラグインID");
var key = JSON.parse(config['key']); // ["a","b","c"]
ストック数用のbookmarklet

- http://qiita.com/hikarut/items/c71063af8cb79124de72 のextensionが動かなかったので、bookmarkletにした
- error logをalertにした
- chromeなのでes6で書いてみた
    - let, const, template literal
- 一部minifyしてある
- stockersへのリンク追加

```js:qiita_stock.js
javascript:(() => {
    let path = window.location.pathname
    , itemId=path.substr(-20, 20)
    , url = `https://qiita.com/api/v1/items/${itemId}`;
    if (path.match(/items/)) {
        $.ajax({
            url: url,
            success :(t) => {
                $(".StockButton__label").prepend(t.stock_count);
                const stockerLink = $(`<a href="https://qiita.com/items/${itemId}/stockers">stockers</a>`);
                $(".ArticleAsideHeader__stock").prepend(stockerLink);
            },
            error:() => {
                alert("qiitaStock request error");
            },
            dataType:"json",
            timeout:3e3}
        );
    }
})()
```
Raspberry Pi に python3 用の　tensorflow をインストール

以下の方法で、Rasbperry P2, P3 どちらにもインストール出来ました。

前提のソフト

```bash
sudo apt install python3-pip
sudo apt install python3-dev
sudo apt install python3-numpy
sudo apt install python3-scipy
sudo apt install python3-pandas
sudo apt install python3-h5py
```

ダウンロード

```bash
wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/downloa
d/v1.1.0/tensorflow-1.1.0-cp34-cp34m-linux_armv7l.whl
```

インストール

```bash
sudo pip3 install tensorflow-1.1.0-cp34-cp34m-linux_armv7l.whl
```

>Raspbian GNU/Linux 9 (stretch) の場合は

```bash
mv tensorflow-1.1.0-cp34-cp34m-linux_armv7l.whl tensorflow-1.1.0-cp35-cp35m-linux_armv7l.whl
sudo pip3 install tensorflow-1.1.0-cp35-cp35m-linux_armv7l.whl
```



インストールの確認

>[Arch Linux に tensorflow をインストールする](http://qiita.com/ekzemplaro/items/f1e866f84c4751158db0)
[tensorflow の簡単なサンプル](http://qiita.com/ekzemplaro/items/8b13e22c2984f3adf9fe)

画像認識のサンプル
>[TensorFlow Models の使い方](https://qiita.com/ekzemplaro/items/9260aa0df5bc98af26b8)
Paper > Multi-view Convolutional Neural Networks for 3D Shape Recognition > 多方向から撮影した画像をCNNに入力してクラス分類する

CNN (ConvNet)を用いた3D形状の認識の論文

Hang Su, Subhransu Maji, Evangelos Kalogerakis, Erik Learned-Miller, "Multi-view Convolutional Neural Networks for 3D Shape Recognition", Proceedings of ICCV 2015
http://vis-www.cs.umass.edu/mvcnn/
http://vis-www.cs.umass.edu/mvcnn/docs/su15mvcnn.pdf

- Figure 1
    - 椅子の画像を多方向から撮影している
    - 各方向に対して二次元画像をCNNに入力
    - それら多方向の結果をView poolingを通してCNNに入力
    
クラス分類であればこういう方法は使えるのかもしれない。
多変数の関数近似ではどうか。
仮引数での"状態"の引き回し

標準入出力を使って、大域変数をループで回しながら状態を更新して最後に計算結果を出すという手続き型でよくあるタイプの問題をHaskell でどう書くか？というの考えています。
例題としては[例題 3_5  「成績が80点以上は優，70点から79点までは良，60点から69点までは可，59点以下は不可，を判定せよ。」](http://ace.phys.h.kyoto-u.ac.jp/~tomita/education/fortran90/sec3.html#ex3_5)を取り上げてみました。
（ボスの母国語がFortran だったのと手続き型の言語も勉強するべということでのチョイスです。）

パターンとしては最近界隈でちょっと取り上げられていた状態モナドを使えるのかな？と勘繰ったのですがそこまでは息が続かず、結局大変ナイーブながら仮引数を引き回すコードに天下り的に初期状態を食わせるコードになりました。

とりあえず想定の動作をするコードは書けたのですが、不恰好です、皆さまお知恵をお貸しください。

# Fortran での実装
[模範解答](http://ace.phys.h.kyoto-u.ac.jp/~tomita/education/fortran90/examples/ex3_5.f90)とは少々異なりますがご愛嬌。

```ex3_5.f90

! ex3_5.f90
! grading
PROGRAM Grade
  Integer :: i, n1=0, n2=0, n3=0, n4=0

  Print *, "put a score (to quit, -1)"
! If the read is outside, goto 9
1 Read *, i; If(i<0 .OR. i>100) Goto 9

  Select Case(i)
    Case(80:)
      Print*, "A"; n1 = n1+1
    Case(70:79)
      Print*, "B"; n2 = n2+1
    Case(60:69)
      Print*, "C"; n3 = n3+1
    Case Default
      Print*, "F"; n4 = n4+1
  End Select

  Goto 1
  
9 Print *, "A= ", n1, ", B= ", n2, ", C= ", n3, ", F= ", n4
END PROGRAM Grade

! $ ./ex3_5.out 
! 40
!  F
! 50
!  F
! 60
!  C
! 70
!  B
! 80
!  A
! 90
!  A
! 100
!  A
! -1
!  A=            3 , B=            1 , C=            1 , F=            2

```

流れとしてはまず整数型の宣言とゼロで初期化。
標準入力から整数を受け取りもし負ならgoto 文で累計結果を表示。
もし正しい採点範囲の数ならケース文で分岐、それぞれの場合で人数n を更新します（1足す）。
ということになります。

# Haskell での実装

```ex3_5.lhs

> -- import Control.Monad.State
> -- State s t = s -> (t,s)
>
> data Grade = A | B | C | F | O
>   deriving (Show, Eq)
>
> isIn100 :: Int -> Grade
> isIn100 n 
>   |  0 <= n && n < 60    = F
>   | 60 <= n && n < 70    = C
>   | 70 <= n && n < 80    = B
>   | 80 <= n && n <= 100  = A
>   | otherwise            = O
>  
> data ABCF = ABCF { numA :: Int, numB :: Int, numC :: Int, numF :: Int }
>   deriving (Show)
>
> zero :: ABCF
> zero = ABCF 0 0 0 0
> 
> add :: Grade -> ABCF -> ABCF
> add A (ABCF a b c f) = ABCF (a+1) b     c     f
> add B (ABCF a b c f) = ABCF a     (b+1) c     f
> add C (ABCF a b c f) = ABCF a     b     (c+1) f
> add F (ABCF a b c f) = ABCF a     b     c     (f+1)
> add O k              = k
>
> grade :: ABCF -> IO ()
> grade abcf = do
>   putStrLn "Put a grade here:"
>   x <- getLine
>   let o = isIn100 (read x)
>   if o == O then
>     print abcf
>   else do
>     print o
>     grade (add o abcf)
>
> main :: IO ()
> main = grade zero

  $ runghc ex3_5.lhs
  Put a grade here:
  59
  F
  Put a grade here:
  69
  C
  Put a grade here:
  79
  B
  Put a grade here:
  89
  A
  Put a grade here:
  99
  A
  Put a grade here:
  101
  ABCF {numA = 2, numB = 1, numC = 1, numF = 1}

```

せっかくなので細かい代数データ型Grade を用意、それに伴って引数と将来的に引き回されるそれぞれの人数を集計するABCF も用意。
あとはそれぞれのGrade の人数に１を足す関数を書いておきます。
grade 関数の中身はFortran のフローとほとんど変わりありません、goto ではなくて自己再帰呼び出しなのが違いといえば違いですが。
grade 関数は現在の人数を持つABCF を引き回しながら標準入力から整数を受け取って状態の更新を行います。
最後にmain としてこのgrade 関数に初期値としてゼロを食わせて一応の完成、というわけです。

# 問題
以下がしばらく考えても分からなかった問題点たちです

## grade 関数が仕事しすぎ
IO と条件分岐と状態の更新をなんとか分離できないもんか？
素朴にFortran のやや不恰好なHaskell 翻訳に過ぎないので、エレガントとはいえないでももっとHaskell らしい書き方ができる気がする。

## 仮引数で引き回される、というパターンは、、、
このパターンはまさに状態系のモナドを使えるはずな気がするのだけど、、、
Haskell でどう書くのが"良い"のかお気づきの方、コメントお待ちしてます！
VPC内リソースへのデプロイ時にS3を利用する際のアクセスコントロール

いろんな記事がありますが、読んでいて混乱しまくったので自分が使ったケースとそれに対応する設定を残しておきます。

## 実現したかったこと

オンプレに構築したJenkinsやBambooなどのCIツール（VPCの外）から、VPC内のEC2などのリソースに対してS3経由でデプロイ資材を送り込むケースにおいて、S3上に適切なアクセスコントロールを設定すること。
CIツールのIPアドレスは管理せず、IAMの権限にてアクセスコントロールを行うこと。

## S3のアクセスコントロールの考え方

アクセスコントロールの許可/拒否は以下の考え方で適用されます。

* 明示的な拒否　← Deny
* 許可　← Allow
* デフォルト拒否 ← Allowされなかった残り

「VPC内からのアクセスのみ許可」をしたいケースでは、厳密には「VPC以外からのアクセスを明示的に拒否」とするのが正しいようです。

「明示的な拒否」は「許可」で上書きできないため、以下の記事ではNOTとANDをうまく使い、その他の条件と結合しています。
http://dev.classmethod.jp/cloud/aws/s3-access-from-specific-ip-and-vpc/

> S3のバゲットポリシーの条件部分抜粋
>
```
      "Condition": {
        "StringNotEquals": {
          "aws:sourceVpc": "<<VPC ID>>"
        },
        "NotIpAddress": {
           "aws:SourceIp": [
             "<<VPC外からアクセスする際のIPアドレス>>"
           ]
        }
      }
```

## 今回の対応方法

自分のやりたかったことは「明示的拒否」ではなく「デフォルト拒否」です。それを元に考えると以下のようになりました。

1. VPC内からのアクセスを「許可」すると、それ以外は自動的に「デフォルト拒否」となる
2. VPC外からのアクセスはIAMでの権限を付与しているので「許可」扱いとなり、「デフォルト拒否」に負けない
3. オブジェクトのURLでのアクセスは「デフォルト拒否」のため、接続できない


1のS3のバゲットポリシーの内容は以下の通りです。

```
{
    "Version": "2012-10-17",
    "Id": "PolicyXXXXX",
    "Statement": [
        {
            "Sid": "StmtXXXXXX",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::my-bucket-name",
                "arn:aws:s3:::my-bucket-name/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:SourceVpc": "vpc-XXXXXXX"
                }
            }
        }
    ]
}
```

（注意）VPC内からS3へアクセスするためにはVPC内にEndpointの設定も必要となります。このあたりを参考に設定してください。
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-endpoints.html#vpc-endpoints-access

あとはVPC外からS3へのアクセス時に使うIAMユーザの権限を適切に設定してあげればよいです。

### 所感

アクセスコントロールに関しては、IAMなどでの「許可」が上回るのでセキュリティの観点では弱いですが、保守性を考えるとこれがベストなのかなと考えています。
「デフォルト拒否」はうっかり「許可」されてしまう可能性が高いですし、そもそも考慮できていないこともあるかもしれないのでが注意点ですね。これで運用してみて何かあれば追記しますが、自己責任でお願いします。
AWS Route53でAWSアカウントをまたいだPrivate Host Zoneの共有方法

Route53を使うと，VPC内だけで名前解決ができるPrivate Host Zoneが利用できる．
このPrivate Host ZoneはVPCを追加した場合には，VPCの紐付けを一々やる必要がある．
同一AWSアカウント内であれば，マネジメントコンソールからできる．

## AWSアカウントをまたいだPrivate Host Zoneの共有

AWSアカウントをまたいだ場合，同一AWSアカウントのようにマネジメントコンソールから登録ができない．
公式ドキュメントのここにやり方が書いてある．

http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zone-private-associate-vpcs-different-accounts.html

以下のようなawsコマンドで設定する．

```
aws route53 create-vpc-association-authorization --vpc VPCRegion=ap-northeast-1,VPCId=vpc-xxxxxx --hosted-zone-id YOURHOSTEDZONE
aws route53 associate-vpc-with-hosted-zone --vpc VPCRegion=ap-northeast-1,VPCId=vpc-xxxxxx --hosted-zone-id YOURHOSTEDZONE
```
EC2でインスタンスストアを使う

i3などのストレージ最適化インスタンスには，NVMe SSDなどの一時ボリュームがついています．

> インスタンスストアは、インスタンス用のブロックレベルの一時ストレージを提供します。このストレージは、ホストコンピュータに物理的にアタッチされたディスク上にあります。インスタンスストアは、頻繁に変更される情報 (バッファ、キャッシュ、スクラッチデータ、その他の一時コンテンツなど) の一時ストレージに最適です。また、インスタンスのフリート全体でレプリケートされるデータ (負荷分散されたウェブサーバープールなど) にも適しています。
> 
 from http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/InstanceStorage.html


# i3.largeにインスタンスストアボリュームをマウントする

インスタンスストアボリュームは，起動時にはマウントされていない．
従って，以下のコマンドでフォーマットとマウントをする必要がある．

```shell-session
$ sudo mkfs.ext4 -E nodiscard /dev/nvme0n1
$ sudo mkdir /mnt/ssd
$ sudo mount -o discard /dev/nvme0n1 /mnt/ssd
```

- 参考
  - http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ssd-instance-store.html
  - http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/add-instance-store-volumes.html

# 簡易的な読み出し性能の測定

## m4.large / EBS gp2(300 IOPS, 450Mbps bandwidth)

- **71.26 MB/secc**

```shell-session
$ sudo hdparm -t /dev/xvda1

/dev/xvda1:
 Timing buffered disk reads: 214 MB in  3.00 seconds =  71.26 MB/sec
```

### i3.large / NVMe SSD

- **580.10 MB/sec**

```shell-session
$ sudo hdparm -t /dev/nvme0n1

/dev/nvme0n1:
 Timing buffered disk reads: 1906 MB in  3.29 seconds = 580.10 MB/sec
```

EBSとNVMe SSDでは，当然ながらこれだけの大差がつく．
DynamicDNSをサーバレスで構築する

独自ドメインでDynamic DNSを実現したい場合，多くのDDNSサービスでは有料なことが多い．あるいは，運営会社の知名度が低いor微妙であることもある．

AWSのRoute53は，非常にパワフルで柔軟性のあるDNSサービスである．ここでは，Route53をDNSサーバとして，DDNSの仕組みを構築する．

## シンプルな方法 - aws-cliを使う

AWSは基本的に全ての操作にAPIが用意されており，大抵の場合はAWS CLIで片付いてしまう．
以下の記事のような，スクリプトを作成してCronで更新をおこなえば済むので非常に簡単である．

http://qiita.com/tt2004d/items/21c2001bb758dfa6ddde

## DynDNS互換なAPIを用意する方法

DynDNS(今はDynなのか…)はDynamicDNSサービスの老舗で，多くの家庭用ルータで対応していることが多い．
今回はVyOS互換なEdgeOS(EdgeRouterのOS)で使うことを想定した．（EdgeOSだとaws-cliを入れるのがだるい）

これをサーバレスで実現するために，以下のAWSサービスを使う．
これらのサービスであれば，Route53を除けば，定額で掛かるコストが無いので，ほとんどコストを掛けずにDDNSサーバを運用できる．（Route53は1ホストゾーンあたり$0.5/monthかかる）

- Lambda
- API Gateway
- Route 53

ここまで構想があったけれど，既にまさにそれを実現しているものがいくつかあった．
以下を試したところ，EdgeRouterでもきちんと動作した．

https://github.com/sTywin/dyndns53
ローカル（Mac）で通るテストが CI では class not found で落ちてしまう

## 事象

あるコミットにおいて、

* ローカルで phpunit を実行すると通る
* CI での phpunit は class not found で落ちてしまう
* これ以前のコミットでは CI での phpunit も通っていた

## 結論
not found だと怒られているクラス名に大文字・小文字違いのタイポが含まれていると起こる。

## 補足

Mac のファイルシステムは デフォルトで case-insensitive なので、大文字・小文字違いのタイポをしても気づけない。

今回は PHP で起きたが、同様のことは他の言語でも起こり得る？

## 事象を確認した条件

### 言語等
* PHP 7.1
* Laravel 5.4
* PHPUnit
* composer（PSR-4 に基づく autoload）

### ローカル環境
* MacBook Pro
* macOS Sierra

### CI
* Circle CI
Paper > Multi-source Deep Learning for Human Pose Estimation > 異なるパラメータをinput layerに与える例

deep modelの学習例の論文

Multi-source Deep Learning for Human Pose Estimation
Wanli Ouyang Xiao Chu Xiaogang Wang
http://www.ee.cuhk.edu.hk/~xgwang/publications_topic.html
http://www.ee.cuhk.edu.hk/~xgwang/papers/ouyangCWcvpr14.pdf

in Proceedings of IEEE Computer Society Conference on Computer Vision and Patter Recognition (CVPR) 2014


- Figure 3
    - 異なるパラメータをinput layerに与える例
    - s: part score
    - d: deformation
    - t: mixture type
    - (a) s,d,tを同じ重みで与える例
    - (b) s,d,tを別経路で与える例

(b)の例をどのようにTensorFlowで実装するか不明であるが、自分が探している情報のように思える。


### 検索キーワード

「multi source deep learning」にて検索して見つけた。