OmniAICreator/Qiita-1.07M huggingface dataset:
input()など標準入出力が使われた処理のテストにcontextlibの関数が便利かもしれない

## はじめに

`input()` などユーザーの入力を受け取る系の処理が直書きされてしまっているコードはテストがしづらい。テストがしづらいということは毎回人の手でチェックしなければいけない。これではいけない。

## 入出力を伴う処理のテストについて

テストが出来るようにする方法は幾つかある。

1. 真面目に設計し直す
2. unittest.mockを使う
3. contextlibで提供されている標準入出力を奪う関数を使う

雑に対応できる汎用的な方法はunittest.mockを利用すること。ただしmockが必要になるのは設計の誤りなどと言われることもある。そうは言っても面倒な場合にはmockを使うこともあるかもしれない。

真面目に設計をし直す話は色んな所で見つけられると思う。今回は省略。

今回の話は3つ目についての話。mockでpathを細かく考えてpatchするよりもcontextlibの関数群を使う方が楽な場合もある。


## 標準出力を奪う

標準出力を奪う関数はデフォルトで用意されている [contextlib.redirect_stdout](https://docs.python.org/3.4/library/contextlib.html#contextlib.redirect_stdout)。(同様に標準エラー出力を奪う関数 `recirect_stderr` も用意されている)

例えば `print()` が陽に使われた処理の出力部分のテストなどもStringIOを使って手軽に書くことが出来る。

```py
import unittest
import contextlib


def foo():
    print("foo")


class InputTests(unittest.TestCase):
    def _calFUT(self):
        return foo()

    def test_it(self):
        from io import StringIO
        buf = StringIO()

        with contextlib.redirect_stdout(buf):
            self._calFUT()
        actual = buf.getvalue()
        self.assertEqual(actual, "foo\n")
```

## 標準入力を奪う

標準入力を奪う関数自体は提供されていない(つまるところイレギュラーな方法なのだけれど)。ただ、`contextlib.redirect_stdout` などの実装を見ることで意外と手軽に実装できる。

実際のところ `contextlib.redirect_stdout` などの実装は以下の様になっている。

```py
class redirect_stdout(_RedirectStream):
    _stream = "stdout"
```

`contextlib._RedirectStream` はwithの前後で(`__enter__`と`__exit__`で)指定されたstreamの属性を入れ替えている。上の例では `sys.stdout` が入れ替えられる。これを使うことで標準入力を奪う `redirect_stdin` は手軽に実装できる。ただし `_` から始まる名前の通りプライベートなオブジェクトなので将来に渡ってこの実装が動くかどうかは保証できない。

例えばパッケージ名を取得する関数の `get_package_name()` があるとする。

```py
def get_package_name():
    package = input("input package name:")
    return {"package": package}
```

もちろん上で挙げた関数はテストのことが考えられていない良くない関数の定義の例ではあるけれど。これに対するテストは以下の様に書ける。おそらくそのままのかたちを残したままテストを書くのであればmockするよりも手軽。

```py
import unittest
import contextlib


class redirect_stdin(contextlib._RedirectStream):
    _stream = "stdin"


class InputTests(unittest.TestCase):
    def _calFUT(self):
        return get_package_name()

    def test_it(self):
        from io import StringIO
        buf = StringIO()
        buf.write("hello\n")
        buf.seek(0)

        with redirect_stdin(buf):
            actual = self._calFUT()

        expected = {"package": "hello"}
        self.assertEqual(actual, expected)
```

## おまけ

`contextlib.redirect_stdout` を使った処理のサンプルとしてこういうような処理も書けるる。通常の出力結果にインデントを付加した環境を用意したい場合などに便利かもしれない。

```py
print("a")
with indent(2):
    print("b")
    with indent(2):
        print("c")
    print("d")
print("e")
```

これは以下のような出力になる。

```
a
  b
    c
  d
e
```

実装は以下のようなもの。

```py
import sys
import contextlib
from io import StringIO


@contextlib.contextmanager
def indent(n):
    buf = StringIO()
    with contextlib.redirect_stdout(buf):
        yield buf
    buf.seek(0)

    prefix = " " * n
    write = sys.stdout.write
    for line in buf:
        write(prefix)
        write(line)
    sys.stdout.flush()
```
Windowsにpythonをインストールする

Windowsにpythonをインストールしてみます。
普通は前の記事と順番が逆じゃないかっていう指摘があるかもしれませんが、私はあまり気にしないことにします。

1.pythonのサイトに行ってインストーラを落としてきます。
いっぱいありますが多分web-basedって書かれてるヤツでいいと思います。
![python1.jpg](https://qiita-image-store.s3.amazonaws.com/0/173151/8732a735-67dc-76f4-361d-01ea4235f30b.jpeg)

2.インストーラを起動します。
環境変数に加えるので赤枠で囲んだチェックボックスにチェックを入れておきます。
![python2.jpg](https://qiita-image-store.s3.amazonaws.com/0/173151/baca6808-2919-86fb-148c-89e2830eb822.jpeg)

3.踊りながらインストールが完了するのを待ちます。
![python3.jpg](https://qiita-image-store.s3.amazonaws.com/0/173151/aae7820a-d328-18b5-1ff5-515169d390ed.jpeg)

4.日頃の行いが良ければ多分インストールが完了します。スクショを取り損ねました。

5.コマンドプロンプトを起動します。
それからpython --versionと入力して、下記のような画面になれば成功です。
![python4.jpg](https://qiita-image-store.s3.amazonaws.com/0/173151/e787927d-4d4f-3649-46c5-61a54d0d6a0d.jpeg)

6.めでたいのでお赤飯を炊きます。

以上。
AngularのRouterの使い方！【超初心者】

SPAで画面をつくっていると、headerやサイドバーを使いまわして一箇所だけ変化させたい場合があります。
その場合に使うのがRouterです（そう思ってるけど違ってたらスミマセン）
その簡単な動作サンプルを作っていきます。

まず、切り替えようにcomponentを２つ作ります。

```:ターミナル
kuniatsu$ ng g component one
kuniatsu$ ng g component two

```


これで、２つのコンポーネントが作成されます。

```:フォルダツリー
.
├── README.md
├── e2e
├── node_modules
├── src
│   ├── app
│   │   ├── one//ここが追加
│   │   │   ├── one.component.css
│   │   │   ├── one.component.html
│   │   │   ├── one.component.ts
│   │   │   └── one.component.spec.ts
│   │   ├── two//ここが追加
│   │   │   ├── two.component.css
│   │   │   ├── two.component.html
│   │   │   ├── two.component.ts
│   │   │   └── two.component.spec.ts
│   │   ├── app.component.css
│   │   ├── app.component.html
│   │   ├── app.component.ts
│   │   ├── app.component.spec.ts
│   │   └── app.module.ts
│   ├── assets
│   └── environments
├── .angular-cli.json
└── package.json

```



あとは、mainのapp.componentが二つを引っ張ってくるだけ。


まず、moduleでRouterを設定します。

```js:app.module.ts
  imports: [
    RouterModule.forRoot([
      {
        path:'',
        component:oneComponent
      },{
        path:'two',
        component:twoComponent
      }
    ])
  ],

```
ルーティングになります。
pathが指定されていない場合はoneを表示、URLに「/two」がついた場合は、twoを表示します。
つまり、非同期で画面の一部だけを更新しているのですが、それぞれにURLが振られるので「戻る」ボタンを使うことが可能になります。




```html:app.component.html
<div>
  <a routerLink="">pone</a>
  <a routerLink="/ptwo">ptwo</a>
</div>
<router-outlet></router-outlet>

```

Routerの切り替えはアンカータグで行うようにしました。
上記のapp.module.tsでルーティングされているのでリンクでURLに飛ばすだけで切り替わります。
切り替えたものは<router-outlet></router-outlet>の中に表示されます。


以上がAngularのRouterの使い方になります。
簡単でしたが意外と便利です。戻るボタンに対応してくれるのが最も嬉しいですね。
gpxの値を置換する

gpxの値を全体的に動かしたいときのワンライナー
bash on windowsのperlを利用する

緯度から1.194引く
cat Current.gpx |perl -pe "s/lat=\"(\d+\.\d+)/'lat=\"'.(\$1-1.194)/ge" > Current1.gpx
経度に0.64加える
cat Current1.gpx |perl -pe "s/lon=\"(\d+\.\d+)/'lon=\"'.(\$1+0.64)/ge" > Current2.gpx
Cucumber Capybara Rspec

###Cucumber
####テスト実行の事前準備
$ bundle exec rake db:migrate RAILS_ENV=test

- phantomjsが必要なため、以下を実行
**ref:http://altarf.net/computer/server_tips/3538

- language: ja

####テストの実行
- 実行コマンドの形
`$ bundle exec cucumber features/~`

- タグでフックしている部分だけ実行したい時
`$ bundle exec cucumber --tags @hoge features/~`

###Capybara
####Capybaraでwaitを実現する
```capybara:saomefiles.
$ find('#dom-id').should have_content 'something'
```
参考
https://aranair.github.io/posts/2016/07/27/capybara-and-waiting/

###Rspec
####時間を指定して試験を行いたい場合
日付を指定した検索機能などを試験したい場合、Timecopというgemをインストールすると実現できる。
インストール元はこちら
https://github.com/travisjeffery/timecop
未完成ゲームのソースを公開しました

# 概要
趣味で作っていたゲームが完成しなかったのでポートフォリオとして公開することにしました。
この公開をもって、私のこのプロジェクトは終了とします。
今となってはかなり古いスタックで作られていますが、コードを参考にしていただければ幸いです。

また未完成ですが一応遊べるので、遊んで頂けたらとても嬉しく思います。

# URL

**※Chrome限定**
動作画面: https://nabepon.github.io/xenosteel-public/app/html/index.html
ソース: https://github.com/nabepon/xenosteel-public/tree/master/src
concat: https://github.com/nabepon/xenosteel-public/blob/master/app/src/App.js

# 構成
ES5、Grunt、RequireJS、BackboneJS、Sassで作っています。
本来はcordovaアプリとして作っていましたが、
本バージョンではcordova関連を除外してあります。

# 制作期間
first commit: 2013-05-27
last commit: 2016-01-15

# 素材

## サウンド
SEは01SoundEarthさんの物を使用しています
https://01earth.net/sound/

BGMはこおろぎさんの出発
http://dova-s.jp/bgm/play295.html

## グラフィック
マイページのキャラはポケ〇ンの絵を仮で入れていたのでグレーにしました。
それ以外、キャラもUIも背景も、すべて自分で描いています。

# ポエム
柄にもなく感傷に浸りながらこのREADME.mdを書いています。
かなり時間を割いて作っていたので、大変惜しく思っています。

もともとはプログラムの勉強のために作り始めたのがスタートで、
気づいたら大きいサイドプロジェクトになっていました。
Twitterとの認証・連携や、iOS・Androidの課金周りも実装していて、
アニメーション速度もかなり気を使って限界までチューニングしていました。
マスターデータはExcelで管理していて、jsonに変換する処理を書いています。

リリースまでこぎ付けたかったので、開発を最高速度で行うようにしていました。
モンスターなんかは100体作る予定で、結局40体しか描けませんでしたが、
1体描くための時間は構想から素材化をするまで平均3時間しか掛けていません。
ネーミングは識別ができればいいや、ぐらいの感じなのでかなり恥ずかしい安直さ。

開発をやめたのは、ライフイベント的にタイムリミットがきたからです。
またプログラムが古くなってしまい、このまま開発するのは限界がきていました。
古臭いのはプログラムだけでなくグラフィックもそうで、
フラットデザインという言葉が生まれて間もない頃に作り始めました。
当時はデザインに困ったらグラデーション、そんな時期でした。

いやぁ、残りの開発時間を見積もるとフルタイムでざっと半年以上かかります。
私の人生に今はそんな時間ありません。

というわけで、これにておしまい。

2017年4月2日 渡辺貴明
プログラミング言語Go読書会#3(1.7-2.3.1)[2017/03/29]

[Go読書会 #3 ](https://lancers-engineer.connpass.com/event/53965/) が[ランサーズ株式会社](https://www.lancers.co.jp/)で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容は[プログラミング言語Go](https://www.amazon.co.jp/dp/4621300253/?&_encoding=UTF8&tag=amesho-22&linkCode=ur2&linkId=7e29043d833086d36f8b64c2ed3721b2&camp=247&creative=1211)を冒頭から皆で読み進めていくというものです。

## 進捗した内容

+ 1章　チュートリアル
    + 1.7 ウェブサーバ
    + 1.8 残りの項目
+ 2章 プログラム構造
    + 2.1 名前
    + 2.2 宣言
    + 2.3 変数
        + 2.3.1 省略変数宣言

## 話題に上がった話

### 1.7 ウェブサーバ

最近並列処理をGoで書こうとして色々困ったりしたのでどうやって処理をしているのか気になりまして、echoサーバーの実装のところでHandleFuncの[コード](https://golang.org/src/net/http/server.go?s=68041:68128#L2275)を調査したりしてみました。HandleFuncは中でHandleを呼んでいて、そして[sync.RWMutex](https://golang.org/pkg/sync/#RWMutex)を使っていました。これで呼ばれたときにコントロールしてるんですね。

```
  2116 type ServeMux struct {
  2117		mu    sync.RWMutex
  2118		m     map[string]muxEntry
  2119		hosts bool // whether any patterns contain hostnames
  2120 }
```

その後、一般的なGoのWeb開発について皆さんどうしているのですかという話題になりまして、素の標準ライブラリだけで開発している人も割といるらしいというのを良く聞いてますという話をしつつ、Web Frameworkを使って開発するケースが多いのではという話をしました。

後で調べたんですが、検索結果を見る限りは[Echo](https://echo.labstack.com/)が割と良く出てきます。ちょっと前までは[Revel](https://revel.github.io/)をよく見かけたのですがEchoの方が検索順位が良いですね。


### 2.1 名前

ここで気になったのは、Unicodeで文字とされている物がすべて名前として有効ということになっているという点です。つまり日本語で変数名が付けられると言うことです(エディタの設定等は必要ですが)。試しに以下の様に書いてみても正常に動作します。

```
package main

import "fmt"

func main() {
	変数だよ := "hello"
	fmt.Println(変数だよ)
}
```

あとは、名前を[キャメルケース](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%A1%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9)で書くパターンが多いという所と、関数の場合は名前の最初が大文字になるかならないかで公開(exported)が決まるというところが話題になりました。


### 2.3 変数

ここでは、var宣言がtypかexpressionのどちらかが有れば宣言出来ること、あとはよくみる省略変数宣言で、これはあくまで宣言で、=の代入とは違うことが書かれていてこの違いが話題になりました。

ここまで呼んだところで、時間になりました。次回は 2.3.2 ポインタからです。
vagrantを用いたRailsの環境設定【rails-dev-box使用】

#最初に
当記事は、下記の記事の補足です。
記事通りにやってもうまく行かないところ、不明なところがあったので、自分用にまとめています。
http://qiita.com/yamagh/items/b37d21debd2487c50d82

#元記事との相違点
Mysqlを使用して動作確認を行う

#手順
元記事と同じ部分はコマンドだけ記述
1.rails-dev-box を取得

```test
$ git clone https://github.com/rails/rails-dev-box.git
```

2.仮想マシンの起動

```
$ cd rails-dev-box
$ vagrant up
```

3.仮想マシンにログイン

```
$ vagrant ssh
```

4.Railsインストール

```
$ sudo gem install rails
```

##ここでエラー発生
pkg-configtkのgemがないとのエラー
エラーメッセージ通りpkg-configtkをいれる

```
$ sudo gem install pkg-config -v "~> 1.1.7"
```

再度railsインストールを実行

```
$ sudo gem install rails
```

今度はnokogiriのgemがないとのエラー
エラーメッセージ通りnokogiriをいれる

```
$ sudo gem install nokogiri -- --use-system-libraries
```

3度目のrailsインストールを実行
今度は完了するはず

```
$ sudo gem install rails
```

##Mysqlの接続手順
5.サンプルアプリ作って動作確認
ここは元記事と違います。
まず/vagrantに移動します。
ホストのVagrantfileが存在するディレクトリと
ubuntuの/vagrantは同期されています。

```
$ cd /vagrant
```

続いてrailsのプロジェクトを作成する。
元記事ではSQLite3を使用しているが、ここではMysqlを使用する。

```
$ rails new foo --database=mysql
$ cd foo
$ vi Gemfile  # therubyracer をコメント解除
$ bundle
```

therubyracerのコメントアウト理由は下記参照
http://kz-engineer-scrap.hatenablog.com/entry/2016/05/10/005411

ここでrailsのプロジェクトのconfig/database.ymlを編集します。

```
$ vi config/database.yml
```

passwordをrootにする。
ちなみにパスワードの記述はbootstrap.shをみればわかる

```config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: root
  socket: /var/run/mysqld/mysqld.sock
```

```bootstrap.sh
debconf-set-selections <<< 'mysql-server mysql-server/root_password password root'
debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password root'
```

```
$ rails s -b 0.0.0.0
```

ホストOSのブラウザで http://localhost:3000 を開いて確認。

環境構築は相変わらず難しい
Superset on Docker

# 背景と目的
実は、BIツール詳しくありません。
なので、勉強するためにまず環境を作ることから始めています。
先日は、Redashの環境をDockerで作りました。
今回は、Supersetの環境をDockerで作ります。
今後は、AWSのQuickSight、GoogleのData StudioとTableauを確認して比較評価出来ればと思います。

Dockerfileを作成するのも面倒な人用に、Docker Cloudにイメージをアップしました。
バージョンは、0.22.1です。

```
$ docker run -d -p 8088:8088 maedamikio/superset
```

あとは、ブラウザで localhost を開いて、
Username: admin
Password: admin
でOKです!!!

# 概要
Supersetとは？
対応データベース
インストール手順の確認
Dockerfileの作成
イメージの作成とコンテナの起動

## Supersetとは？
Airbnbを利用している方いると思います。
Supersetは、Airbnbから公開されているBIツールです。
GitHubを確認すると興味深い画像が多数あります。

参考
https://github.com/airbnb/superset

## 対応データベース
有名なデータベースは対応してます。さらに、SqlAlchemy経由でデータベースにアクセス出来るのでさらに幅が広がりますね。

- MySQL
- Postgres
- Presto
- Oracle
- SQLite
- Redshift
- Microsoft SQL Server
- Impala
- SparkSQL
- Greenplum

SqlAlchemy経由

- MySQL
- Postgres
- Oracle
- SQLite
- Microsoft SQL Server
- Firebird
- Sybase
- IBM DB2、Informix
- Redshift
- EXAsolution
- MonetDB
- Snowflake
- BigQuery

## インストール手順の確認
[公式インストール手順](http://airbnb.io/superset/installation.html)

パッと見た感じ、簡単そうでした。
そして、GitHubにDockerへのリンクがあり、こちらを使えば良いのですが、Dockerfileを見た所、最低限のデータベースのみ追加されている様です。
RedshiftとBigQueryを今後の検証で利用したいので、自分用にDockerfileを作成することにしました。

参考
https://hub.docker.com/r/amancevice/superset/

## Dockerfileの作成
追加したデータベースのライブラリは以下です。

- MySQL
- Postgres
- Presto
- SQLite
- Redshift
- Microsoft SQL Server
- Impala
- SparkSQL
- Greenplum
- BigQuery

Dockerfile

```
FROM ubuntu:latest

ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8

RUN apt-get update && apt-get install -y \
    build-essential \
    curl \
    libffi-dev \
    libldap2-dev \
    libmysqlclient-dev \
    libsasl2-dev \
    libssl-dev \
    python3-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

RUN curl -sL https://bootstrap.pypa.io/get-pip.py | python3
RUN pip install \
    impyla \
    mysqlclient \
    psycopg2 \
    pyhive \
    pymssql \
    sqlalchemy-bigquery \
    sqlalchemy-redshift \
    superset

RUN fabmanager create-admin \
    --app superset \
    --username admin \
    --firstname admin \
    --lastname user \
    --email admin@fab.org \
    --password admin
RUN superset db upgrade
RUN superset load_examples
RUN superset init

EXPOSE 8088

CMD ["superset", "runserver"]
```

## イメージの作成とコンテナの起動
イメージの作成は、まあまあ時間がかかります。

```
$ docker build -t superset .
```

コンテナの起動も、まあまあ時間がかかります。
起動後も動作がもたつきます。本格的に利用するにはスペックが必要ですね。

```
$ docker run -d -p 8088:8088 superset
```

# まとめ

- Dockerでイメージを作成しておけば、必要になったらコンテナを起動して、終わったら削除でスッキリできますね。環境を汚さなくて済むのが精神衛生的に嬉しいです。
- ユーザ管理もしっかりしていて、 以下などが利用できるそうです。本格的に高スペックサーバを用意して、ユーザで共有して利用するときは重要ですね。
    - OpenID
    - LDAP
    - OAuth
    - REMOTE_USER through Flask AppBuiler
IntelliJがRuby on Railsのプロジェクトを認識してくれなかったのを解決した

# 課題
ここら辺を参考にIntelliJでRuby on Railsのプロジェクトを開こうとした。

- https://confluence.jetbrains.com/display/RUBYDEV/Opening+Rails+projects+in+IntelliJ+IDEA

"Select directories to be used as project roots, you'll see as well that it's already defined as Ruby type:" のところで、railsのプロジェクトではなくvendor/bundle以下のディレクトリがjavaのプロジェクトとして認識されて5個くらい表示された。

そこからにっちもさっちも行かなかかった。

# 解決策
vendor/bundle を削除したらちゃんと認識された。
よくわからんけど先にbundle install --path vendor/bundleしたらダメだったらしい。

# 環境
* Mac 10.11.6
* IntelliJ IDEA 2017.1
* Rails 5.0.2
* ruby 2.4.1(rbenv)
Windowsでcoreos-kubernetesを動かしたかった

## 環境
- Windows 10
- Bash on Windows

## やりたいこと
kubernetesを試したいから環境ほしいからCoreOSが楽そうだしこれを入れよう
https://coreos.com/kubernetes/docs/latest/kubernetes-on-vagrant-single.html

## まとめ
Bash on Windowsでvagrant upしてWindowsでvagrant up

## 手順
まずBash on windowsで全部やろうとしました。

```bash;
sudo aptitude install virtualbox-dkms openssl

wget https://releases.hashicorp.com/vagrant/1.9.3/vagrant_1.9.3_x86_64.deb
dpkg -i vagrant_1.9.3_x86_64.deb

git clone https://github.com/coreos/coreos-kubernetes.git
cd coreos-kubernetes/single-node

vagrant up

# vagrant up後にSSL関係でエラーが出た場合はこれをやります(僕は必要だった)
sudo ln -sf /usr/local/bin/openssl /opt/vagrant/embedded/bin/openssl
```

はい。これで起動しません。
BashOnWindows上でのVirtualBoxの起動はサポートされていません。


というわけでWindowsでやりましょう。

```cmd;
git clone https://github.com/coreos/coreos-kubernetes.git
cd coreos-kubernetes/single-node
vagrant up
```

はい、SSL関係のsystemコマンドが動きませんでした。

Vagrantfileを見たところ以下のような感じでまず証明証を作っているようでこれがWindowsでは結構きつそうです。

```
system("mkdir -p ssl && ./../lib/init-ssl-ca ssl") or abort ("failed generating SSL CA artifacts")
system("./../lib/init-ssl ssl apiserver controller IP.1=#{NODE_IP},IP.2=#{CLUSTER_IP}") or abort ("failed generating SSL certificate artifacts")
system("./../lib/init-ssl ssl admin kube-admin") or abort("failed generating admin SSL artifacts")
```

はい。
というわけでまとめに戻りますが、BashOnWindowsで実行した時にできたsslフォルダをWindowsに持ってきて上のSystemコマンドをVagrantfileからコメントアウトして起動しました。
そもそもBashOnWindowsもcmdも同じディレクトリでやっとけば別にコピーの必要も無いですね。

以上です
Keras 2.0の概要

## Keras 2.0
1. KerasではAPIの変更がある場合、そのリリースを1つのリリースにまとめているため、ユーザーはコードの更新をまとめることができる。
2. Keras 1とKeras 2の間のAPIの変更は可能な限り下位互換性がある。
   複雑な場合を除いて、Keras 2でKeras 1のコードを実行可能。
3. Keras 2はKerasの最初の「長期サポート」API。Keras 2で書かれたコードは、これからも数年間、最新のソフトウェアで動作するはず。

## TensorFlow統合
1. Keras 2 APIはTensorFlowリポジトリの一部となり、TensorFlowの高水準APIとして機能する。
2. Theanoのサポートは無限に続く
3. 将来的に多くのバックエンドをサポートする予定（MicrosoftはKerasのCNTKバックエンドを構築しています）

## 参考資料
https://github.com/fchollet/keras/issues/5299
https://blog.keras.io/introducing-keras-2.html
Scalaのannotationがくっつくところがよくわかんねー

#Scalaで使えるAnnotationって、２種類ある訳で
JavaのAnnotationとScalaネイティブのAnnotationが。

#Javaは無視してScala全力ならネイティブで問題ないけど、Javaの資産なら仕方ない。
ってんで、

```java
@Retention(RetentionPolicy.RUNTIME)
public @interface SomeAnnotation {
	int value() default 0;
}
```
こんなのがあったとして、

```Scala
class SomeClass(
 @BeanProperty @SomeAnnotation(1) var someValue:Int
){
}
```
こんな風にすると……。
@SomeAnnotationはどこにくっつくんだ？
コンテナのパラメータ? varのgetter/setter? @BeanPropertyのgetter/setter?

#コンストラクタのパラメータにアノテーションがくっつく模様
気持ちとしては、varで追加される

```scala
def someValue():Int = { .... }
```
のところについてて欲しい。
というときは、

```Scala
import scala.annotation.meta._

class SomeClass(
  @(SomeAnnotation @getter)(1) var someValue:Int
){
}
```
と、Annotationに@getterというAnnotationをつける。
scala.annotation.meta以下にはgetter,setterの他に、beanGetterとか、見れば想像がつくのが転がっている。
AnnotationにAnnotationをつけてるから、

```
@(SomeAnnotation @getter)
```
ここがAnnotationの本体で、引数はこれの後につける……と。

# 毎度、@getterとかつけなきゃいかんのか？
```
package object xxxx {
  import scala.annotation.meta._
  type SomeAnn = SomeAnnotation @getter @setter
}
```
こんなことして、

```Scala
class SomeClass(
  @SomeAnn(1) var someValue:Int
){
}
```
でオケ。

つまんないことで悩んじまったぜ。
re:dashでMULTI_ORG機能を使う

# 概要
re:dashには1つのアプリケーションの中で複数の組織を扱うMULTI_ORG機能があります。2017/04現在、この機能についてのドキュメントがほとんど見当たらなかったので備忘録。

# 環境
* Re:dash 0.12.0(Self hosted)

# どういう時に使うの？
* 例えばB2Bアプリケーションを提供していて、そのアプリケーションの利用統計などを顧客ごとに提供したい場合有用です
* organizationを分けることで、顧客ごとに見られるダッシュボード/クエリを制御できます

# 使い方
* 基本的には、環境変数$REDASH_MULTI_ORGを`true`にするだけです(デフォルトは`false`)
* MULTI_ORGが有効になると、すべてのパスにorganizationsのslugが差し込まれます
    * 例えばslugが`example`であるorganizationを作った場合、exampleのログインURLは`{domain}/example/login`、トップページは`{domain}/example`となります

# 注意点
* queryやdashboardがorganizationごとに必要なのは良いとして、groupやdata_sourceもorganizationごとに必要になるので、organizationは分けたいけどデータソースは1つ、というような場合は管理が煩雑になります
    * わたしはorganizationを生成するスクリプトを用意し、その中でdatasourceやgroupをテンプレートから複製する処理を入れてますが、この使い方であってるのかは不明
GoogleAppEngine[PHP]覚書

# 1. 目的

GoogleAppEngineで簡単なWEBサイトをビルドしようと思ったら，デプロイ方法がCUIになっていました。
デプロイまでの手順を忘れないようにメモしておきます。

# 2. デプロイに必要なもの

- [Cloud SDK](https://cloud.google.com/sdk/)
インストール方法は公式に[ドキュメント](https://cloud.google.com/sdk/downloads)があるので，それを参考にローカルマシンに導入します。
`gcloud`コマンドは，展開したファイルにリンクが貼られるので，適当な箇所（ホームディレクトリ直下とか）で展開し，削除しないように注意します。
2017年4月2日時点では，[クイックスタート](https://cloud.google.com/appengine/docs/php/quickstart)のページから[リンク](https://cloud.google.com/sdk/docs/%E3%80%80)を踏んでも404エラーが出ていますが，そのうち修正されるでしょう。

- プロジェクトID
デプロイ用のプロジェクトIDを用意しておきます。
プロジェクトIDがない場合は，[コンソール画面](https://console.cloud.google.com/)からプロジェクトを作成します。

# 3. gcloud でログイン

`gcloud init`で，どのプロジェクトを使うのか，初期設定をしておきます。

+ [Cloud SDK の初期化](https://cloud.google.com/sdk/docs/initializing)
+ [Cloud SDK gcloud init](https://cloud.google.com/sdk/gcloud/reference/init)

# 4. git からサンプルをダウンロード

サンプルファイルをローカルにクローンします。

```
git clone -b phase0-helloworld https://github.com/GoogleCloudPlatform/appengine-php-guestbook.git helloworld
```

クローンされるファイルは次の通りです。

```
.
├── README.md
├── app.yaml
└── helloworld.php
```

展開したディレクトリに移動して次のコマンドを実行します。

```
dev_appserver.py .
```

WEBサーバーが立ち上がり，空いているポートで自動的にサービスが始まります。

```
INFO     2017-04-02 09:47:57,971 dispatcher.py:205] Starting module "default" running at: http://localhost:8080
INFO     2017-04-02 09:47:57,973 admin_server.py:116] Starting admin server at: http://localhost:8000
```

この場合 8080番で展開されるWEBページ。8000番で管理ページにアクセスできます。

![スクリーンショット 2017-04-02 19.18.55.png](https://qiita-image-store.s3.amazonaws.com/0/37765/ea409d03-7534-3ade-b56b-eac440ee7105.png)

デフォルトでは，このようなページにアクセスできるはずです。

```php:helloworld.php
<?php

echo 'test';
```

helloworld.phpを書き換えると，結果が即時に反映されます。
![スクリーンショット 2017-04-02 19.22.31.png](https://qiita-image-store.s3.amazonaws.com/0/37765/ee9f15da-baf3-3a28-679d-0504303483f7.png)

# 5. リモートへデプロイ

事前に`gcloud app browse`でデプロイ先のURLを確認しておくと，誤ったプロジェクトに上書きすることを避けられると思います。

`gcloud app deploy`でデプロイします。

以上です。
macでReactNativeを試そうとしたらいきなりハマった(react-native initでフリーズ)


出だしの` react-native init <project名>` からハマった。


```
─ resolve@1.3.2
├─ rimraf@2.6.1
├─ semver@5.3.0
├─ shellwords@0.1.0
├─ source-map@0.5.6
├─ sprintf-js@1.0.3
├─ string-length@1.0.1
├─ strip-bom@3.0.0
├─ symbol-tree@3.2.2
├─ test-exclude@4.0.3
├─ tough-cookie@2.3.2
├─ tr46@0.0.3
├─ type-check@0.3.2
├─ uglify-js@2.8.21
├─ webidl-conversions@4.0.1
├─ whatwg-encoding@1.0.1
├─ whatwg-url@4.6.0
├─ which@1.2.14
├─ wordwrap@1.0.0
├─ xml-name-validator@2.0.1
└─ yargs@6.6.0
✨  Done in 6.40s.
```

上記のようにDoneとでてからフリーズ状態になりました。


結論から言うとwatchmanがフリーズしていた模様

対応策

以下のコマンドを実行

```
launchctl unload ~/Library/LaunchAgents/com.github.facebook.watchman.plist
```

```watchman version```で versionが出ればok.

```
watchman version                                                                                                               /Users/m0a/Library/LaunchAgents/com.github.facebook.watchman.plist: Could not find specified service
{
    "version": "4.7.0"
}

```

参考:https://github.com/facebook/watchman/issues/371
輻輳によるパケット損失に勝つための方法

酷い輻輳によるパケット損失に勝つための方法を記しておきます。

# ECNを有効にする
エンドポイントがECN対応のTCPパケットは輻輳制御で優遇される傾向にあるようです。例えば、Ciscoの (PIEより一世代古い) WREDアルゴリズムでは、ECN対応パケットが露骨に優遇されています。
http://www.cisco.com/cisco/web/support/JP/docs/CIAN/IOS/IOS15_1M_T/CG/012/wred_ecn.html?bid=0900e4b1825ae572

デスクトップ版Windowsは標準でECNが無効となっているため、ECNを有効にするためには手動で設定する必要があります。Linuxでも全てでECNを有効にするためには```sysctl  net.ipv4.tcp_ecn=1```とする必要があります (恒常的に設定するためには/etc/sysctl.confに書く必要があります)。なお、一部のECN未対応の環境では問題が起こることもあるので注意。

ちゃんとECNが有効になっているかは、```sudo tcpdump -i eth1 "tcp[tcpflags] & (tcp-syn) != 0"```で、外向きSYNパケットにW (ECN CWR)やE (ECN-Echo)のフラグが付いているかを確認してください。

# TCPを使う
UDPにはECNフラグがありませんし、パケット損失への強さも上位プロトコルによります。そのため、ネットワークに存在するルータの輻輳制御によっては、TCPの方が有利になる場合があります (もちろんTCPが不利になる場合もあります)。

例えばGoogle ChromeでQUICを切ったり、DNSでTCPのみにするとパケット損失が減る可能性があります。こちらの環境ではDNSをTCPにすると、3way handshakeのせいで全体的に遅くなるものの、タイムアウトはしにくくなっているようです (たまに遅くなるものの、1秒未満なので再送ではないはず?)。遅くならないようにTCP Fast Openを使いたいところですが、それを使うためにはglibcのDNS問い合わせ部分の改変が必要になるはずなので断念。

## DNSの速度測定 (Ubuntu)
DNSの速度測定には、dnsdiagのdnspingが便利でしょう。以下により、導入できます。

```
sudo apt-get install python3-dnspython
git clone https://github.com/farrokhi/dnsdiag.git
cd dnsdiag/
git submodule update --init
```

UDPでのテストは以下のように行います (8.8.8.8の部分は試したいDNSキャッシュサーバーに変更してください)。

```
./dnsping.py -s 8.8.8.8 qiita.com
```

TCPでのテストは以下のように行います。

```
./dnsping.py -s 8.8.8.8 -T qiita.com
```


## DNS問い合わせを標準でTCPにする (Ubuntu)
DNSサーバーを外部のものに変更し (DNSサーバーが192.168.1.1とかだとTCPにしても意味ないですから)、resolv.confに```options use-vc```を追加させてDNSをTCPにします。具体的には、```/etc/resolvconf/resolv.conf.d/head```に以下の内容を書き込み、```sudo resolvconf -u```を実行します (なお、以下は便宜上Google Public DNSのIPアドレスを使用していますが、ISP網内にあるISPのDNSキャッシュサーバーの方が良い場合はそれに書き換えてください)。

```
options use-vc
nameserver 8.8.8.8
nameserver 8.8.4.4
```

ちゃんとTCPになっているかは、```sudo tcpdump -i eth1 udp port 53```で何も無いことを確認すれば分かります。

# 終わりに
これらの手法がCiscoの新たなアルゴリズムであるPIE AQMや、他社メーカーのルーターに通用するかは分かりませんが、パケット損失が酷い環境では一般的に有用でしょう。この記事がパケット損失に困っている人の助けになれば幸いです。
Windows10でRuby on Railsのコントローラを作ってhtmlを表示した

## 説明
初めてのRuby on Railsです。
前回の続きでコントローラを作ってhtmlを表示します。
（Markdownの書き方も勉強中です。）

## 環境
| モノ     | バージョン                        |
|:-----|:-----------------------|
| OS   |Windows10 Home（64bit） | 
| Ruby |2.2.6                   |
| Rails|5.0.2                   |
| エディタ|Visual Studio Code  |

## コントローラを作る
helloというコントローラをコマンドから作成する

```
rails generate controller hello
```
>
```
      create  app/controllers/hello_controller.rb
      invoke  erb
      create    app/views/hello
      invoke  test_unit
      create    test/controllers/hello_controller_test.rb
      invoke  helper
      create    app/helpers/hello_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/hello.coffee
      invoke    scss
      create      app/assets/stylesheets/hello.scss
```

いろいろできた。invokeは翻訳すると「呼び出す」らしい。
よくわからないが次へ。

## 作ったコントローラに手を加える
indexという名前のメソッド（def）を追加して、その中ではhtmlを返すのだ。

```ruby:\hogehoge\app\controllers\hello_controller.rb
class HelloController < ApplicationController
    def index
        myhtml = '
        <html>
        <body>
        <h1>I think that I am on Rails!</h1>
        </body>
        </html>'
        render html: myhtml.html_safe
    end
end

```

## ルーティング定義(routes.rb)を追加する
helloにアクセスしたら、helloControlのindexを呼び出してくださいという追加。

```ruby:\hogehoge\config\routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  get 'hello', to: 'hello#index'
end
```

## ブラウザで確認してみる
でた！
![20170402_001.png](https://qiita-image-store.s3.amazonaws.com/0/172106/64366493-5df3-49ce-ed39-301b27d1a307.png)

ログからもHelloControllerのindexが処理されていることが読み取れる。

```\hogehoge\log\development.log
Started GET "/hello" for ::1 at 2017-04-02 18:35:15 +0900
Processing by HelloController#index as HTML
  Rendering html template
  Rendered html template (0.0ms)
Completed 200 OK in 4ms (Views: 1.4ms | ActiveRecord: 0.0ms)
```

ここまで。続きはまた次回。

---
Install Java8 with Yum on Amazon Linux

```
yum search java | grep openjdk
yum install java-1.8.<revision number from yum search>-openjdk-headless.x86_64
yum install java-1.8.<revision number from yum search>-openjdk-devel.x86_64
update-alternatives --config java #pick java 1.8
update-alternatives --config javac #pick java 1.8
```
気が付いたらJSスクラッチ界隈が便利になってた件1

1.気が付いたらJSスクラッチ界隈が便利になってた件1
2.[気が付いたらJSスクラッチ界隈が便利になってた件2](http://qiita.com/Bong/items/b49c6e9f8e9be9d7fe7c)
3.[気が付いたらJSスクラッチ界隈が便利になってた件3]
(http://qiita.com/Bong/items/bd434fd7209b9a457139)
4.[気が付いたらJSスクラッチ界隈が便利になってた件4](http://qiita.com/Bong/items/00bb6d097ecbc3830b6c)

#クラスの操作が便利になっていた
今までCSSのクラスを操作する場合は、
追加や削除が何かと面倒でした。

##クラスの追加
例えば「ある要素にクラスを追加する」必要があった場合、
クラス名を文字列として連結していました。

```javascript
var elm = document.getElementById("animal01");
elm.className = "red";
elm.className += " bold";
elm.className += " italic";
```

これが、HTML5からはaddするだけ。

```javascript
var elm = document.getElementById("animal01");
elm.classList.add("red");
elm.classList.add("bold");
elm.classList.add("italic");
```

シンプル！

##クラスの削除
削除も同様に、面倒くさい処理だったのが

```javascript
var elm = document.getElementById("animal01");
elm.className = elm.className
  .split(" ")
  .filter(function(c){return c != "bold";})
  .join(" ");
```

これでOK。

```javascript
var elm = document.getElementById("animal01");
elm.classList.remove("bold");
```

##まとめ
今回、HTML5の変更点を改めて調べてみたのですが、細かい部分で**いろいろと便利**になっていることが判明しました。

デザイン界隈ですと、Photoshopで新バージョンが出る毎に「ベテランほど知らない新機能！」的な記事を見かけます。

もちろんそれは、**エンジニアにも**当てはまりそうですね。
Laravelのeloquentのeventでcreated_byとかupdated_byとか更新するobserverとtrait


Eloquentには、creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored といった、新規作成する時、、、、みたいなイベントをフックすることができるような仕組みがあるのだが、
https://laravel.com/docs/5.3/eloquent#events

ログインしてるユーザーの操作を保存したいのだけど、ググってもイマイチいいのがなかったので考えました。

## ググって微妙だったやつ

* イベントをフックするのは、各モデルのbootに、こんな感じでhookを書けば、、、とか、
https://laracasts.com/discuss/channels/general-discussion/where-should-i-set-a-created-by-to-the-users-id

> 全部のモデルにbootのfunctionを新しく足して、イベント全部書き連ねるのとかだるい

* オブザーバークラス作って、各モデルのbootに書けば、、、、とか、
https://laracasts.com/discuss/channels/laravel/how-to-automaticly-update-updated-by-created-by-fields-using-eloquent

> ちょっと良くなってるけど、bootのfunction書きたくない

* 公式では、Observerクラスを書いてサービスプロバイダのbootでモデルごとにobserveを書いとけば、、、、とか
https://laravel.com/docs/5.3/eloquent#events

> このモデル何設定されてんだっけ、ってのmodelの中で見たいけどservice providerのbootにあるとかなんか変。

ってのがあったんだけど、上記の理由により、bootに書きたくない、observerは使いたい、でもservice providerには書きたくない、ならば、modelにtraitが良いかなと思って書きました。

## Observerクラス

作成前、などのイベントで、ログイン済みのuserのidを設定するobserverを書く。
ログイン済みのユーザーIDを各フィールドにマッピングする。
xxxingのイベントは、sql文発行する前。

```app/Observers/AuthorObserver.php
<?php
namespace App\Observers;

use Illuminate\Database\Eloquent\Model;

class AuthorObserver
{
    public function creating(Model $model){
        $model->created_by = \Auth::user()->id;
    }
    public function updating(Model $model){
        $model->updated_by = \Auth::user()->id;
    }
    public function saving(Model $model){
        $model->updated_by = \Auth::user()->id;
    }
    public function deleting(Model $model){
        $model->deleted_by = \Auth::user()->id;
    }
    public function restoring(Model $model){
        $model->restored_by = \Auth::user()->id;
    }
}
```

restoringはsoftdeleteの時だけしか使われません。

## Observerをロードするtrait

``boot{トレイトの名前}``って``public static function``を作っておくと

``\Illuminate\Database\Eloquent\Model::bootTraits``
さんが、うまいことbootのあとにtraitのbootを呼んでくれるようです。
他と競合しないようにするってやっぱ重要ですね素敵。

```app/Traits/AuthorObservable.php
<?php
namespace App\Traits;

use App\Observers\AuthorObserver;
use Illuminate\Database\Eloquent\Model;

trait AuthorObservable
{
    public static function bootAuthorObservable()
    {
        self::observe(AuthorObserver::class);
    }
}
```



## Modelでのロード

モデルで、このtraitを``use AuthorObservable;``って``use``すればいいだけ。
bootとか書かなくていいの。モデルが綺麗なまま。

```app/Models/CheckIn.php
<?php

namespace App\Models;

use App\Traits\AuthorObservable;
use Illuminate\Database\Eloquent\Model;

/**
 * Foursquareみたいに、お店にチェックインしたってのを持つテーブル
 */
class CheckIn extends Model
{

    use AuthorObservable;

    public function shop()
    {
        return $this->belongsTo('App\Models\Shop');
    }

    public function created_by()
    {
        return $this->belongsTo('App\Models\User', 'created_by');
    }

    public function updated_by()
    {
        return $this->belongsTo('App\Models\User', 'updated_by');
    }
}
```

これで、お店へのブックマークとか、レビューとか、そういうものが、同じtraitでまかなえますね。
クラスの名前がダサいので誰かそれっぽい名前をアドバイスいただけると助かります。
あと、traitでself::って書くの正しいんだろうか？なんか不安。
幻想再帰のアリュージョニストでword2vec

さて[環境](http://qiita.com/ueno-t/items/6f96184926b791870208)ができたのでいろいろ遊んでみる。
ここは膨大なボキャブラリを誇る[幻想再帰のアリュージョニスト](http://ncode.syosetu.com/n9073ca/)で単語ベクトルしてみましょう。

## mecab のインストール
mecab, mecab-ipadic, mecab-ipadic-NEologd を導入する。

```shell-session
% yaourt -S mecab mecab-ipadic
```

途中PKGBUILDを編集するか聞かれるので Y で編集に入り、UTF8用にカスタマイズする。

```text:PKGBUILD(mecab)
./configure --with-charset=utf8 --enable-utf8-only
```

```text:PKGBUILD(mecab-ipadic)
./configure --with-charset=utf8
```

最新の新語辞典である mecab-ipadic-NEologd を導入する。導入時に `/usr/libexec` がないよと怒られるので事前にリンクを張る。

```shell-session
% sudo ln -s /usr/lib /usr/libexec
```

github から最新の辞書を取得して導入する。ちなみにメモリ 2G 無いとエラーになるらしい。

```shell-session
% git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
% cd mecab-ipadic-neologd
% ./bin/install-mecab-ipadic-neologd -n
```

使うときには辞書を指定する。

```shell-session
% mecab
惑星のさみだれ
惑星    名詞,一般,*,*,*,*,惑星,ワクセイ,ワクセイ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
さみだれ        名詞,一般,*,*,*,*,さみだれ,サミダレ,サミダレ
EOS

% mecab -d /usr/lib/mecab/dic/mecab-ipadic-neologd
惑星のさみだれ
惑星のさみだれ  名詞,固有名詞,一般,*,*,*,惑星のさみだれ,ホシノサミダレ,ホシノサミダレ
EOS
```

すごいですね。

## word2vec インストール
pip で gensim, cython, word2vec を導入する。

```shell-session
% pip install gensim
% pip install cython
% pip install word2vec
```

## コーパスモデル作成して近似を求める。
まずは mecab で分かち書きファイルを作成する。

```shell-session
mecab -d /usr/lib/mecab/dic/mecab-ipadic-neologd -Owakati original.txt -o data.txt 
```

続いて python でコーパスモデル作成。

```py3
from gensim.models import word2vec

sentences = word2vec.Text8Corpus("data.txt")
model = word2vec.Word2Vec(sentences, size=100)
model.save("data.model")
```

このモデルを使って近似を求めてみる。

```py3
from gensim.models import word2vec

model = word2vec.Word2Vec.load("data.model")
out   = model.most_similar(positive=[u'アキラ'], topn=3)
print(out)
[('セスカ', 0.7233824133872986), ('みんな', 0.6344067454338074), ('私たち', 0.6305500864982605)]
```

ほう？　トリシューラ負けてるぞ。

```py3
>>> out   = model.most_similar(positive=[u'アキラ'], topn=10)
>>> print(out)
[
 ('セスカ', 0.7233824133872986),
 ('みんな', 0.6344067454338074),
 ('私たち', 0.6305500864982605),
 ('くん', 0.6283941268920898),
 ('アズーリア', 0.6272101998329163),
 ('お姉様', 0.626919150352478),
 ('私', 0.5991101264953613),
 ('お願い', 0.5972921252250671),
 ('貴方', 0.5968158841133118),
 ('てろ', 0.5852774381637573)
]
```

```py3
>>> out   = model.most_similar(positive=[u'セリアック'], topn=10)
>>> print(out)
[
 ('ニア', 0.9699307680130005),
 ('イヴロス', 0.9016405344009399),
 ('＝', 0.8912437558174133),
 ('ヴィヴィ', 0.8854511380195618),
 ('ベフォニス', 0.8579694032669067),
 ('ラウス', 0.8542773127555847),
 ('ライニンサル', 0.7912667989730835),
 ('アーニスタ', 0.7889609336853027),
 ('マラコーダ', 0.7593907713890076),
 ('イヴァ', 0.738694429397583)
]
```


```py3
>>> out   = model.most_similar(positive=[u'再帰'], topn=10)
>>> print(out)
[
 ('根源', 0.9172159433364868),
 ('遡及', 0.9000077843666077),
 ('枠組み', 0.895927369594574),
 ('人工', 0.8953160643577576),
 ('飛躍', 0.8908029198646545),
 ('受動', 0.8826395273208618),
 ('典型', 0.8811641931533813),
 ('疑似', 0.8803087472915649),
 ('向上', 0.8802028298377991),
 ('合理', 0.8798677921295166)
]
[Ruby入門] 00. その他のトピック（とりあえず未分類なもの）

&gt;&gt; 連載の目次は [こちら！](http://qiita.com/prgseek/items/237d02be844534063f1d)

+ とりあえず未分類な小さめのトピックをこちらに書いていく
+ 随時更新する
+ 個別に話が大きくなったら章立てする

### ■複数行のコメント
```ruby
=begin
ほにゃらら〜
仕事し給え！
=end
```

### ■オブジェクトの型判定
```ruby
str = "mojiretsu"
puts str.class               # クラス名を取得
p str.is_a?(String)          # あるクラスかまたはそのサブクラスのインスタンスか
p str.kind_of?(Object)       # is_a? と同じ
p 3.14.instance_of?(Numeric) # あるクラスそのもののインスタンスか（サブクラスのインスタンスならfalse）
```

### ■モジュールがミックスインされているか
```ruby
# is_a? は、サブクラスだけでなく、あるモジュールがincludeされている場合もtrue を返す
[1, 2].is_a?(Enumerable) 
```

### ■オブジェクトの比較
equal? メソッドは、オブジェクトが同一かを判定する。
== 演算子は、Object クラスにおいては equal? メソッドの別名だが、たいていのクラスでは値そのものを比較するようにオーバーライドされている。Stringなども同様。
なので、例えば str1 == str2 は文字列の値を比較している。


### ■型キャスト

「to_ほにゃらら」メソッドがオブジェクトごとに定義されている

```ruby
num = "1".to_i
str = 1.to_s
p num, str
```

### ■シンボル

単純にラベルやキーとして扱いたい特別なオブジェクトで、Stringに近い

```ruby
sym = :mykey1                # :mykey1
str = sym.to_s                 # "mykey1"
sym = "mykey2".to_sym   # :mykey2
```
Install Maven with Yum on Amazon Linux


```
sudo wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
sudo sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo
sudo yum install -y apache-maven
mvn --version
```
symfony 1.4 メモ（ユーティリティ）

1. [symfony 1.4 メモ（アクション）](https://qiita.com/shotets/items/dd56c98d397a42fa4f50)
2. [symfony 1.4 メモ（context）](https://qiita.com/shotets/items/ffa0baa3f930d8992dcb)
3. [symfony 1.4 メモ（モデル）](https://qiita.com/shotets/items/535204c3e7ad1decdab4)
4. [symfony 1.4 メモ（schemaの書き方）](https://qiita.com/shotets/items/f55d9e625c78bb8f05e6)
5. [symfony 1.4 メモ（Doctrine）](https://qiita.com/shotets/items/e7638a72fa90c687ab81)
6. [symfony 1.4 メモ（フォーム）](https://qiita.com/shotets/items/8343167452d42d67b93e)
7. [symfony 1.4 メモ（コマンド）](https://qiita.com/shotets/items/82d1f9f8d00f25e65197)
8. **symfony 1.4 メモ（ユーティリティ）**

### キャメルケース⇔アンダースコア
```php
// キャメルケースに変換する
$CamelizedString = sfInflector::camelize( "camelized_string" );

// アンダースコアに変換する
$underscored_string = sfInflector::underscore( "UnderscoredString" );
```

### YAML形式の読み書き
```php
// YAML形式のファイルを読み込む
sfYaml::load('/path/to/config.yml');

// 連想配列をYAML形式で書き出す
$yamlString = sfYaml::dump($data);                      // YAML形式の文字列に変換
file_put_contents('/path/to/config.yml', $yamlString);  // ファイルに保存
```

### sfConfigへの設定の読み書き
```php
// 設定を保存
sfConfig::set('test_config', 'テストの値');

// 設定を読み込む
$value = sfConfig::get('test_config');

// sfConfigの設定値を設定名で埋め込む
$message = 'libディレクトリの絶対パスはsf_lib_dirで参照でき、%sf_lib_dir%です。';
$message = sfToolkit::replaceConstants($message);
echo $message;       // libディレクトリの絶対パスはsf_lib_dirで参照でき、/var/www/sf14/libです。
```


## 配列関連

### 空の配列かどうか判定
```php
$test1 = array
(
	'a' => 1,
	'b' => null
);
$test2 = array
(
	'a' => '',
	'b' => null
);
$ret = sfToolkit::isArrayValuesEmpty($test1);
var_dump($ret);      // FALSE
$ret = sfToolkit::isArrayValuesEmpty($test2);
var_dump($ret);      // TRUE
```


### 多層階層の配列をマージ

sfToolkit::arrayDeepMerge() を使えば多層階層の配列をマージできます。

```php
$array1 = array
(
	'foo' => array
	(
		'bar1'=>'bar1data',
		'bar2'=>'bar2data',
	),
	'baz' => 'bazdata'
);
$array2 = array
(
	'foo' => array
	(
		'bar1'=>'bar1data',
		'bar3'=>'bar3data',
	),
	'baz2' => 'baz2data'
);

$merge = array_merge($array1, $array2);
var_dump($merge);
$deepMerge = sfToolkit::arrayDeepMerge($array1, $array2);
var_dump($deepMerge);

// array_merge()の結果
array(3) {
	["foo"]=>
	array(2) {
		["bar1"]=>
		string(8) "bar1data"
		["bar3"]=>
		string(8) "bar3data"
	}
	["baz"]=>
	string(7) "bazdata"
	["baz2"]=>
	string(8) "baz2data"
}
// sfToolkit::arrayDeepMerge()の結果
array(3) {
	["foo"]=>
	array(3) {
		["bar1"]=>
		string(8) "bar1data"
		["bar2"]=>
		string(8) "bar2data"
		["bar3"]=>
		string(8) "bar3data"
	}
	["baz"]=>
	string(7) "bazdata"
	["baz2"]=>
	string(8) "baz2data"
}
```


## ファイル操作関連

### ファイル検索
```php
$finder = new sfFinder();
$files  = $finder->name('*.html')
	->in('/path/to/lib');
foreach ($files as $file)
{
	// 各ファイルの処理
}
```


### ディレクトリ内を削除

```php
// cache/my_cacheディレクトリ内を空にする
sfToolkit::clearDirectory(sfConfig::get('sf_cache_dir') . '/my_cache');
```

### 特定ファイルを削除

```php
// cache/my_cacheディレクトリ内のcsvファイルを削除する
sfToolkit::clearGlob(sfConfig::get('sf_cache_dir') . '/my_cache/*.csv');
```
さくらのVPSを使ってみてつまづいたこととか（Ubuntu16.04）

# ログインできない

とりあえず、標準OSのインストールでUbuntu16.04を選んでパスワードを打ったのはよかったのだが、いきなり「コンソールからログインできない」という問題にぶち当たった。ログインのユーザ名がわからないのである。
ぐぐってもいまいち解決らしいものが見つからなかったのだが、Twitter検索で解決した。デフォルトのユーザ名は「ubuntu」とのことだった。
https://twitter.com/nyaocat/status/838377195592626176
https://twitter.com/nyaocat/status/838377845726523394

# Apacheがありそうでない

標準OSのインストールがされた段階で`/etc/apache2`ディレクトリは存在しているのに、`sudo service apache2 start`が失敗する。
実は、ディレクトリがあるだけでApache自体がインストールされていたわけではなかった、というオチだった。`sudo apt-get install apache2`で解決。

# Apacheをインストールしたはいいけど接続できない

標準OSのインストールで設定されるiptablesが、デフォルトではHTTPアクセスを認めていなかったのが原因だった。
https://help.sakura.ad.jp/hc/ja/articles/115000045522-OS%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E6%83%85%E5%A0%B1-Ubuntu16-04-LTS-%7D

私がインストールした時点では、/etc/iptables/iptables.rulesが

```
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
```

となっていたので、このうち`-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT`を二つコピーし、「22」を「80」にしたものと「443」にしたものを作成。これでSSH（22）のほかにHTTP（80）とHTTPS（443）も受け付けるようになった。
UbuntuでZFSを構築し，/homeをミラーリングする.

UbuntuでSSDにOSをインストールし， /homeのみRAID1のHDDに保存するメモ．

#SSDにOSのインストール
インストールで，「その他インストール」で各自パーティションを設定する．
今回は，SSDの設定として，

* ルートファイルシステム・・・50GB
* スワップ領域・・・20GB

以上のパーティションでUbuntuをインストールする．HDDはなにもしない．

###Point
OpenSSHを入れておくと，色々便利かも．．．

```bash
sudo apt install openssh-server
```

#HDD2つをOSに認識させる

##gpartedでパーティションテーブルを作成
パーティション管理ツールをインストールする．

```bash
sudo apt install gparted
```
パーティション管理ツールでパーティションを作成．
各HDDを選択し，[デバイス] -> [パーティションテーブルの作成]ですべての領域を[ext4]で初期化する．


#[disk]で，HDDのマウントオプションを設定する

各HDDの識別名を/dev/disk/by-label/[hddのラベル名] に変更する．

#ZFSを構築・設定

##zfsをインストール

```bash
sudo apt install zfsutils-linux
```

##ストレージプールの作成
RAID1で構築する．

```bash
sudo zpool create -f [プール名] mirror [HDD1の場所] [HDD2の場所]
[HDD1の場所]・・・/dev/disk/by-label/hdd1
[HDD2の場所]・・・/dev/disk/by-label/hdd2
```

##ファイルシステムの作成
プールができたので，ファイルシステムを作る．今回は，pool1にhomeというディレクトリを作成．

```bash
sudo zfs create -o atime=on pool1/home
```

##pool内のhomeと実際のhomeを同期し，移し替える．

```bash
sudo rsync -av /home/ /pool1/home
sudo rm -rf /home/*
sudo zfs set mountpoint=/home pool1/home
```

これで， /homeがzfsのプール内に収まる．

##Problem
今回，Xenの仮想環境で構築した場合，再起動すると，作成したpool1が消える問題があった．
Flutterの画面遷移

Flutterのドキュメントには、画面の一部(Widget)を更新する例示はたくさんありますが、AndroidでいうところのActivityやFragmentにあたる画面遷移方法がわからなかったので調べてみました。

Flutterサンプルアプリの[Gallery](https://github.com/flutter/flutter/tree/master/examples/flutter_gallery)で実装されていますが、[Navigator](https://docs.flutter.io/flutter/widgets/Navigator-class.html)クラスを使用し、画面にあたるTopレベルのWidgetをPushすることにより、シーンを切り替えることが可能です。

MaterialAppでは、手順も簡単で、

1) MaterialAppインスタンス生成時にroutesを指定して、

```dart
void main() {
  runApp(new MaterialApp(
    home: new MyAppHome(), // becomes the route named '/'
    routes: <String, WidgetBuilder> {
      '/a': (BuildContext context) => new MyPage(title: 'page A'),
      '/b': (BuildContext context) => new MyPage(title: 'page B'),
      '/c': (BuildContext context) => new MyPage(title: 'page C'),
    },
  ));
}
```

2) トリガー処理で、遷移先の一意名を指定しPushするだけです。

```dart
Navigator.of(context).pushNamed('/b');
```

ただし、いまのところ遷移時にパラメータを渡す仕組みはなさそうです。
https://github.com/flutter/flutter/issues/6225
'/b/$someId'のようなパラメータ付きの名前で渡して、onGenerateRouteコールバックで解析するような工夫をしているようですが、渡せるパラメータには限りがあるので、この手順はいまのところ静的に定義可能な画面遷移向きです。

上記とは別に、事前にルートを定義することなく、トリガー処理の中でrouteを定義して遷移することも可能で、この場合は好きなようにパラメータを渡すことができます。

```dart
onTap: () {
  Navigator.push(context, new MaterialPageRoute<Null>(
    settings: const RouteSettings(name: "/detail"),
    builder: (BuildContext context) => new Detail(library)
  ));
}
```

なお、遷移先の画面(Widget)は、戻るキー操作でpopされ、遷移元に戻ります。（そのほかにPop&Pushなども用意されているようです。）

実際に、カーリルの図書館APIを使用して図書館一覧を表示し、タップして選択した図書館の詳細画面を表示するサンプルアプリを作って試してみました。

![Screenshot_20170402-164547.png](https://qiita-image-store.s3.amazonaws.com/0/49088/c169e81a-5829-d814-c510-e23ba5a7ba57.png)

![Screenshot_20170402-164556.png](https://qiita-image-store.s3.amazonaws.com/0/49088/ecbcd666-760a-a908-bfe1-7942ba7cc05f.png)

ソースはここにあります。
https://github.com/tatsu/libraries_in_japan

実際に動かしてみる場合は、カーリルの[APIダッシュボード](https://calil.jp/api/dashboard/)からご自身の図書館APIのアプリケーションキーを取得し、config.dartに設定してお試し下さい。

```dart:lib/config.dart
class Config {
  static const String appKey = '<YOUR-APPKEY-HERE>';
}
```
symfony 1.4 メモ（コマンド）

1. [symfony 1.4 メモ（アクション）](https://qiita.com/shotets/items/dd56c98d397a42fa4f50)
2. [symfony 1.4 メモ（context）](https://qiita.com/shotets/items/ffa0baa3f930d8992dcb)
3. [symfony 1.4 メモ（モデル）](https://qiita.com/shotets/items/535204c3e7ad1decdab4)
4. [symfony 1.4 メモ（schemaの書き方）](https://qiita.com/shotets/items/f55d9e625c78bb8f05e6)
5. [symfony 1.4 メモ（Doctrine）](https://qiita.com/shotets/items/e7638a72fa90c687ab81)
6. [symfony 1.4 メモ（フォーム）](https://qiita.com/shotets/items/8343167452d42d67b93e)
7. **symfony 1.4 メモ（コマンド）**
8. [symfony 1.4 メモ（ユーティリティ）](https://qiita.com/shotets/items/ca32b99e43badfe53f98)

### キャッシュクリア
```bash
php symfony cache:clear
```

または

```bash
php symfony cc
```

### スキーマからモデル作成、フォーム生成
```bash
php symfony cache:clear
php symfony doctrine:build-model
php symfony doctrine:build-forms
php symfony doctrine:build-filters
```

オリジナルのジェネレーターを使う場合

```bash
php symfony cache:clear
php symfony doctrine:build-model
php symfony doctrine:build-forms --generator-class=originalDoctrineFormGenerator
php symfony doctrine:build-filters --generator-class=originalDoctrineFormFilterGenerator
```

### モデル削除
```bash
php symfony doctrine:clean-model-files
```

### スキーマからSQL生成
```bash
php symfony doctrine:build-sql
```

### 生成したSQLの実行（テーブル作成等）
```bash
php symfony doctrine:insert-sql
```

### 全て実行
```bash
php symfony doctrine:build --all
```

うまくいかない時はトレースする

```bash
php symfony doctrine:build --all --trace
```

データのロードまで一気に

```bash
php symfony doctrine:build --all --trace --no-confirmation --and-load
```

### データベースからスキーマを生成
```bash
php symfony doctrine:build-schema
```

### data/fixtures からデータをロードする
```bash
php symfony doctrine:data-load
```

トレースしながら

```bash
php symfony doctrine:data-load --trace
```

データフォルダを指定してロード

```bash
php symfony doctrine:data-load data/fixtures/master/aaaa
```

複数フォルダを指定してロード

```bash
php symfony doctrine:data-load data/fixtures/master/aaaa data/fixtures/master/bbbb
```

既存のデータを削除せずに上書き更新

```bash
php symfony doctrine:data-load data/fixtures/master/aaaa --trace --append
```

ファイルを指定してロード

```bash
php symfony doctrine:data-load data/fixtures/master/aaaa/ccc.yml --trace
```

### 現在のデータをyml形式で吐き出す
```bash
php symfony doctrine:data-dump
```

### admin ジェネレーター
```bash
php symfony doctrine:generate-admin backend ModelName
```

モジュール名を指定

```bash
php symfony doctrine:generate-digi_admin backend ModelName--module=module_name
```

オリジナルのテンプレートで生成

```bash
php symfony doctrine:generate-digi_admin backend ModelName--module=module_name --theme=original_theme
```
vue.jsのaxios内でthisを使う

### axios内

+ thisをbindすれば使える

```app.js

var hoge = new Vue({

	el:'#hoge',
	data:{
		hoge:''
	},
	created:function(){
     	axios.post('hogeapi', null)
       		.then(function(res) {
              this.hoge = res.data;
           }.bind(this)).catch(function(err) {
              console.log(err);
           }.bind(this));
	}
	
});

```

### forEach内

+ forEach内でも使える

```app.js

var hoge = new Vue({

	el:'#hoge',
	data:{
		hoge:[],
		foo:''
	},
	methods:{
		hoge:function(){
			this.hoge.forEach(function(value,index,array){
				value = this.foo;
			}.bind(this))
		}
	}

})
```
gitコマンドの覚書

たまにしか使わないのですぐ忘れてしまうgitコマンドのメモ。

#githubのブランチを消す
githubのブランチは、ローカルで消した後でリモートリポジトリにpushすると消すことができる。

消したいブランチが bbb の場合、

まず、消すbranchをチェックアウト(これをやらないと、git branch -D が使えない)して、戻す。
>git checkout bbb
>git checkout master

ブランチを消す(この段階ではまだローカルのブランチが消えるだけ）
>git branch -D bbb

ブランチ消去をリモートリポジトリにpush
>git push orign :bbb


#別ブランチのワーキングコミットをまとめてきれいにする
ワーキングブランチがworkの場合

masterに、作業ブランチの内容を反映
>git rebase -i work

masterにコミットがそのまま取り込まれるので、まとめたいパッチの先頭のひとつ前のコミットのhashを指定して git rebase
>git rebase -i xxxxxxxxxxxxxxx

以下のようにまとめる対象が出てくるので、

>pick 4e09ab8 Fource setting
>pick 152de0f Adjust display
>pick 3e162a6 Create README.md

最初のコミットに統合する場合は、pickをs (squash)に書き換える

>pick 4e09ab8 Fource setting
>s 152de0f Adjust display
>s 3e162a6 Create README.md

一度コミットしても、再度 git commit --amend でコミットログを書き換えることができる。
MacにOpenCV3をインストールする

# version
macOS sierra 10.12.3
Python 3.6.0
opencv3.2.0

# 参考
opencv3はpython3対応で、"import cv2"でインポートできる.  
インストール参考
[homebrewでopencv3を入れてpython3からOpenCVを使えるようにした。](http://blanktar.jp/blog/2016/01/homebrew-python3-opencv3.html "homebrewでopencv3を入れてpython3からOpenCVを使えるようにした。")
[Homebrew で OpenCV3 の Python バインディングを試す](http://blog.amedama.jp/entry/2015/10/01/223056 "Homebrew で OpenCV3 の Python バインディングを試す")
[Homebrewを使ってOpenCV3、Python2,3をMacにインストールする](https://hackerslog.net/post/softwares/opencv/opencv-install-with-python-on-mac/ "Homebrewを使ってOpenCV3、Python2,3をMacにインストールする")


# OpenCV3のインストール  
$ brew tap homebrew/science
$ brew install opencv3 --with-python3
#パスを通す  
$ echo /usr/local/Cellar/opencv3/3.2.0/lib/python3.6/site-packages >> /usr/local/lib/python3.6/site-packages/opencv3.pth

このようにインストールできた.  
[tama@ /usr/local/lib/python3.6]$ python3
Python 3.6.0 (default, Dec 24 2016, 08:01:42)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.  
\>\>\> import cv2
\>\>\>
Apex Mapクラスの初期化

1,2は別にあえて書くまでもないけど、3,4あたりはたまに忘れてるので、まとめてみた。

# 1.Map\<T1, T2\>()
普通の使い方

# 2.Map<T1,T2>(mapToCopy)
他のマップをコピー
(動き的には`Map<T1,T2> hoge = mapToCopy.clone()`と同じっぽい)

# 3.Map<ID,sObject>(recordList)
sObjectのリストだけで使える特殊パターン
そのsObjectのIDをキーにしたMAPを作ってくれる
使い方は以下のような感じ

``` java
Map<ID, Account> = new Map<Id, Account>([SELECT ID, Name FROM Account]);

```

# 4.Map<T1,T2>{T1 => T2(, T1 => T2 ...)}
値を入れて初期化したい場合

使い方は以下のような感じ

``` java
Map<ID, String> zionMS= new Map<Id, String>{
    'EMS-04' => 'ヅダ'
    , 'MS-04' => 'プロトタイプ・ザク'
    , 'MS-05' => 'ザクI'
    , 'MS-06' => 'ザクII'
    , 'MS-07' => 'グフ'
    , 'MS-08' => 'イフリート'
    , 'MS-09' => 'ドム'
    , 'EMS-10' => 'ヅダ'
    , 'MS-10' => 'ドワッジ'
    , 'MS-11' => 'アクト・ザク'
    , 'MS-12' => 'ギガン'
    , 'MS-13' => 'ガッシャ'
    , 'MS-14' => 'ゲルググ'
    , 'MS-15' => 'ギャン'
}
```