OmniAICreator/Qiita-1.07M huggingface dataset:
PyQt5.QtWidgets のインポートエラーについて (Anaconda)

# 序文

pythonでいっちょGUIに挑戦してみるか、と初心者がPyQtに手を出したら
初っ端から引っかかってしまったので、忘備録として残します。

後に判明しますが, 今回のエラーはAnacondaによるものなので、
それ以外で環境構築してインポートエラーが起きてる場合の解決策にはならないかと思います。

# 環境
Windows 8.1
Anaconda 4.3.8
python 3.5.2 
PyQt5 5.8

Anacondaでpython3.5.2環境を作り, そこに PyQt5をインストールしました。

インストール手順については
[PyQt5とpython3によるGUIプログラミング［０］](http://qiita.com/kenasman/items/55505654823e9d040e6e)
を参考にしました。


# エラー
インストール手順最後の起動確認で
import PyQt5.QtWidgets
を打ち込んだところ
![s001.JPG](https://qiita-image-store.s3.amazonaws.com/0/140942/1a533de6-9b30-7ee3-1096-4819babad61b.jpeg)
「指定されたモジュールがみつからない」とのこと。

一方で単に
import PyQt5
とだけ打ち込むと
![s004.JPG](https://qiita-image-store.s3.amazonaws.com/0/140942/0f350b57-da87-54ea-fe0d-c8e5ae060eaa.jpeg)
となり、エラーは出ない。

# 原因

原因については下記サイト
[Anaconda3から導入したPython環境でPyQt5が使えない](https://teratail.com/questions/60859)
によると

QtWidgetsは、Anacondaで環境構築すると存在しない、"python3.dll"を参照しており、
これが見つからないためにエラーを吐き出しているそうです。



# 解決策
同じく
[Anaconda3から導入したPython環境でPyQt5が使えない](https://teratail.com/questions/60859)
に対処法が載っています。

コマンドプロンプトで
anaconda search -t conda pyqt5
と入力
![s002_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/140942/a28ab23b-f607-d27d-f4dc-cd2969d16d5b.jpeg)
(画面中の赤いのは単にユーザー名を隠しているだけです。　(py352)はAnacondaでの仮想環境をactivateしているだけなので気にしないでください。　)

自分の環境によって次に入力すべきコマンドが変わりますが、今回の私の環境はwin-64なので

![s002_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/140942/9a84f03e-6794-879f-14f0-9e8bf0a9b1a6.jpeg)

bpentz/pyqt5　
を用います。

anaconda show bpentz/pyqt5
とコマンドを入力すると

![s003_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/140942/ccf0773e-e294-6dbb-da13-9ba9e905f85d.jpeg)
次に入力すべきコマンドが（画像下部の赤枠で囲んだ場所に）表示されます。
長いのでコピペすると楽です。

指示されたコマンド
conda install --channel https://conda.anaconda.org/bpentz pyqt5
を入力すると

![s003_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/140942/7736a4cc-7ce6-dc6a-3516-59aff699fd4d.jpeg)


途中で
Proceed([y]/n)?と聞かれるので, y とだけ入力します。

これで完了です。

# 結果

![s006.JPG](https://qiita-image-store.s3.amazonaws.com/0/140942/679b9b30-bf0c-33c2-bfff-8973c188a3f4.jpeg)

無事にインポートできた。


# 所感
これだけやってやっとスタート地点にたどりつけた.
最近思うのは, Anacondaは入門者に優しいけど、初心者に厳しい。
SliderとDoTweenでHPバーを作る

![slider.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/24a27803-2349-424d-6cec-54927cf82df8.gif)

　Unityにおいて、上記GIFの赤いHPバーを実現するためのコード例を示します。

```csharp:

using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
using System.Collections;

namespace Murosta.Utility
{
    public class AnimatingRatioIndicator : MonoBehaviour
    {
        [SerializeField]
        Slider frontSlider;
        [SerializeField]
        Slider backgroundSlider;

        public void SetRatio(float value)
        {
            var clampedValue = Mathf.Clamp01(value);

            frontSlider.value = clampedValue;

            if (backgroundSlider)
            {
                backgroundSlider.value = clampedValue;
            }
        }

        public Coroutine AnimateRatio(
           float value,
           float frontDuration = 0.1F,
           float backgroundDuration = 0.3F,
           float backgroundDelay = 0.2F)
        {
            return StartCoroutine(AnimateRatioEnumerator(value, frontDuration, backgroundDuration, backgroundDelay));
        }

        IEnumerator AnimateRatioEnumerator(
           float value,
           float frontDuration,
           float backgroundDuration,
           float backgroundDelay)
        {
            var clampedValue = Mathf.Clamp01(value);

            var frontTweenner = frontSlider.DOValue(clampedValue, frontDuration).SetEase(Ease.InQuad);

            if (backgroundSlider)
            {
                yield return backgroundSlider
                     .DOValue(clampedValue, backgroundDuration)
                     .SetDelay(backgroundDelay + frontDuration)
                     .SetEase(Ease.InOutQuad)
                     .WaitForCompletion();
            }
            else
            {
                yield return frontTweenner.WaitForCompletion();
            }
        }
    }
}
```

* アニメーションは[DoTween](http://dotween.demigiant.com/documentation.php)を利用
* 値は、0.0Fから1.0Fの間を指定する（[Mathf.InverseLerp](https://docs.unity3d.com/ja/current/ScriptReference/Mathf.InverseLerp.html)が活躍すると、0.0Fから1.0Fの値に簡単に変換可能）
* `frontSlider`の参照設定は必須
* `backgroundSlider`の参照設定をすることでGIFのように、時差で減るインジケーターを表現できる
* アニメーションを行うメソッドは`Coroutine`を返し、`Coroutine in Coroutine`が可能で扱いやすい

GIF内の画像

 * [キャラクターグラフィック【臼井の会 RPGツクール素材支部】](http://usui.moo.jp/rpg_tukuru.html) 様
 * [エネミーグラフィック【Ｒド】](http://www.geocities.co.jp/Milano-Cat/3319/) 様
マイグレーション

```ruby:
class CreatePublications < ActiveRecord::Migration
def change
create_table :publications do |t|
t.string :title
t.text :description
t.references :publication_type
t.integer :publisher_id
t.string :publisher_type
t.boolean :single_issue

t.timestamps
end
add_index :publications, :publication_type_id
end
end
```
bin/rails db:migrate
bin/rails db:rollback

create_table(table_name,options)
drop_table(table_name)
add_column(table_name,column_name,type,options)
change_column(table_name,colum_name,type,options)
remove_column(table_name,*column_names)
add_index(table_name,*column_names)
remove_index(table_name,index_name)
既存のテーブル
追加　add_column
変更 change_column

```ruby:entriesテーブル
published_on
def changeadd_column :entries, :published_on :date
end
```
gitコマンドメモ

参画したプロジェクトでは`GitLab`を使用していたがあまり詳しくない人のために開発フローに沿ってコマンドを解説していくための説明用

## リポジトリのダウンロード（クローン）
すでにリポジトリが作成されており、開発者として参画した場合
`git clone [url]`でリモートのリポジトリをクローンする

```
$ mkdir git_work              # リポジトリをクローンするためのディレクトリ作成
$ cd git_work                 # 作成したディレクトリに移動
$ git clone git@xxxxx.git     # sshの場合
$ git clone https://xxxxx.git # httpsの場合
$ cd xxxxx                    # cloneしたディレクトリに移動
```

ssh接続かhttps接続かによって、URLの部分を適宜変更して実行

git-flowに則って`develop`が次期開発のブランチの場合
現在のブランチを確認すると`master`のみとなっているのでリポジトリから`develop`ブランチをチェックアウト

```
$ git branch
* master
$git checkout -b develop origin/develop
$ git branch
* develop
  master
$
```

## 開発時
他の人のコミット等が入っているかもしれないので、`develop`ブランチを最新にする

```
$ git checkout develop
* develop
  master
$git pull origin develop
From xxxxx
 * branch            develop     -> FETCH_HEAD
Already up-to-date.
$
```

開発する機能のブランチを作成する
`git checkout -b feature/[機能名]`

```
$ git checkout -b feature/login # ログイン機能を作成する場合
Switched to a new branch 'feature/login'
$ git branch
  develop
* feature/login
  master
$
```

適宜実装を行い、修正したファイルを確認

```
$ git status
  差分がある場合、ここにファイル名が表示される
$
```

修正した対象のファイルをインデックスに登録して、コミット

```
$ git add -p
  修正した内容を登録するかどうか対話形式で表示されるので、
  修正した箇所なら「y」、意図していない修正の場合「n」で選択
$ git commit -m "コミットメッセージ"
```

コミットメッセージは後で見返したときに何を修正したのかあたりをつけられるように入力しておくと良いかな。

コミットまで完了したらリモートにプッシュ

```
$ git push origin feature/login
```

## developへのmerge
GitLabの画面でmerge requestを作成
コンフリクトが出ていなければそのままmerge
コンフリクトが出ている場合

```
$ git fetch -p
$ git merge develop
$ git status
```

コンフリクトしているファイルが表示されるので、コンフリクト箇所を丁寧に手動merge

修正完了したら

```
$ git add -p
$ git push origin feature/login
```

これでGitLabの画面からmergeできるようになっているはず。。。

とりあえず説明用としてココまで
AWSでpdftotextを使えるようにする

## 前提
* AWSのアカウントを作成済み

## 事前準備
* AWSにログインし、EC2のインスタンスを作成する
* 開発したRailsアプリを作成したEC2に配置する

## 必要なパッケージをインストール
[Amazon LinuxにRuby on Rails環境構築(rbenv + ruby-build + Ruby 2.2.1 + Rails 4.2.1インストール)
](http://qiita.com/na0AaooQ/items/5bd62e630a2faf051a52)を参考にさせていただきました。

```
$ sudo su -
# yum -y install git
# yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel
```

* rbenvのインストール

```
git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
# cp -p /etc/profile /etc/profile.ORG
# diff /etc/profile /etc/profile.ORG
#

# echo 'export RBENV_ROOT="/usr/local/rbenv"' >> /etc/profile
# echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> /etc/profile
# echo 'eval "$(rbenv init -)"' >> /etc/profile

# source /etc/profile
```

* ruby-buildインストール

```
# git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
```

* ruby 2.4.0をインストール

```
# rbenv install -v 2.4.0
# rbenv rehash
# rbenv global 2.4.0
```

* bundlerをインストール

```
# rbenv exec gem install bundler
```

## Railsアプリを配置したディレクトリに移動

```
# cd /home/ec2-user/sample/
```

## bundle installを実行

```
# bundle install 
```
ｐｇでエラーが。。。

postgresqlをインストールして起動してから再度bundle install

```
# yum install -y postgresql postgresql-devel postgresql-server postgresql-libs
# service postgresql initdb
# /sbin/chkconfig postgresql on
# service postgresql start
# bundle install
```

今度はglib2でエラーが。。。。

追加でパッケージをインストールして再実行

```
# yum -y install glib2-devel
# bundle install
```

今度は成功

## pdftotextのインストール

```
# yum -y install poppler poppler-utils
```

`poppler-utils`をインストールすることで、pdftotextが使用できるようになる。

あとは、前回作成したタスクを実行

```
# bundle exec rails read_pdf:read
```

[前回はこちら](http://qiita.com/kijitora-neko/items/2f88cc646ce1872231b5)
【Laravelメモ⑤】facebookOAuth

ほぼ以下の記事の通りでうまくいったが、１点、 `login.blade.php` の部分だけ 
- `<a href="facebook">Sign in with Facebook</a>`
+ `<a href="login/facebook">Sign in with Facebook</a>`
にしないと迷子になるようだった

[[ Laravel ]facebook Loginを実装する](http://qiita.com/bohebohechan/items/421f30e0112f6b7a566b)
EC2インスタンス＆GitHubにSSH接続できない時に見直してほしいセキュリティーグループ

図解してあって本当にわかりやすい[世界一丁寧なAWS解説シリーズ](http://qiita.com/naoki_mochizuki/items/22cfbf4bf7ec95f6ac1c)を読んでいて
3つのことにハマったのでその解決策を議事録として残しておく。

* ローカル環境からEC2インスタンスにSSH接続できない
* EC2インスタンスからGitHubにSSH接続できない
* EC2インスタンスからgit clone https://〜できない

# ローカル環境からEC2インスタンスにSSH接続できない

EC2インスタンに割り当てたセキュリティーグループの `インバウンドルール`　のSSH設定の
`送信元` の所に、`マイIP` が入ってない。

![スクリーンショット 2017-02-28 0.22.11.png](https://qiita-image-store.s3.amazonaws.com/0/113181/5c5c0357-92d5-f963-0af3-32d35797fa26.png "スクリーンショット 2017-02-28 0.22.11.png")


# EC2インスタンスからGitHubにSSH接続できない

EC2インスタンスに割り当てたセキュリティグループの `アウトバウンドルール` のSSH設定のが入ってない。



![スクリーンショット 2017-02-28 0.23.17.png](https://qiita-image-store.s3.amazonaws.com/0/113181/f8af3a04-b720-baaa-059f-5a735aa8ccc1.png "スクリーンショット 2017-02-28 0.23.17.png")


# EC2インスタンスからgit clone https://〜できない

EC2インスタンスに割り当てたセキュリティグループの `アウトバウンドルール` のHTTPS設定がない。
　
![スクリーンショット 2017-03-01 20.09.18.png](https://qiita-image-store.s3.amazonaws.com/0/113181/93b0b40a-f966-ff99-e772-64ed9c77a55e.png)
Google Cloud Datastoreでキーをソート条件に使うときの注意点

GAEでDataStoreを使う場合の非常に細かい話を紹介します。

DataStoreのクエリで、第一ソート条件を日付、第二ソート条件をキーにしたいようなことがあったとしましょう。Goで書くと次のようなクエリです。


```go
	q := datastore.NewQuery("post").Order("-updated_at").Order("__key__")
```

このような場合、どのようなカスタムインデックスを作れば良いのでしょうか？答えは次の文書から読み取れます。

> Queries on keys use indexes just like queries on properties and require custom indexes in the same cases, with a couple of exceptions: inequality filters or an ascending sort order on the key do not require a custom index, but a descending sort order on the key does. As with all queries, the development web server creates appropriate entries in the index configuration file when a query that needs a custom index is tested.
> 
> https://cloud.google.com/appengine/docs/standard/go/datastore/queries

以下拙訳。

>　キーに対するクエリはプロパティに対するクエリのようにインデックスを使います。これはカスタムインデックスの場合も同様ですが、いくつかの例外があります。キーに対する不等号フィルタや昇順のソートはカスタムインデックスを必要としませんが、キーに対する降順ソートはカスタムクエリが必要です。カスタムインデックスが必要なクエリがテストされたときは、開発Webサーバは適切なインデックス設定ファイルを生成します。


つまり、キーに対する昇順ソートをする場合、追加のカスタムインデックスは不要だということになります。上の例であれば特に追加のカスタムインデックスは必要なく、updated_atのインデックスだけで対応できるということになります。

言い換えると、全てのプロパティインデックスやカスタムインデックスは、キー昇順でのソートが優先度最低のソート条件になっていると解釈できそうです。つまり、上の例で言えば「`.Order("__key__")`」は付けても付けなくても同じ結果になるのではないでしょうか（とはいえ、キーのソート順に依存したコードを書く場合は保守性の観点から明示的にソート順を指定した方がいいでしょう）。

また、キーを使ったフィルタやソートも他のクエリ同様に`index.yaml`の自動生成対象です。開発サーバでクエリを動かしてみて`index.yaml`が自動生成されなければ特に追加のカスタムインデックスは必要ないことがわかります。実際、上のクエリを流しても`index.yaml`は変更されませんでしたが、キーの降順ソートを試すと`index.yaml`に下記のようなインデックス定義が追加されました。

```yaml
- kind: post
  properties:
  - name: updated_at
    direction: desc
  - name: __key__
    direction: desc
```
DockerでDBを永続化すっぞ

# 困った

Macでの開発環境に、Docker Toolboxを利用してる。
DBとかも構築できるけど、そのままだとコンテナを削除してしまうとデータまで消えてしまう。

そんなときは、volumeオプションを利用すればいい。
volumeオプションは、「左にホストOSのパス：右にコンテナのパス」形式で指定できる。
とは言っても。
Mac(Windows)環境でのDockerは、VirtualBox上で稼働している。
終了後次回起動時には、コンテナの如くきれいさっぱりデータが消えてる。

:weary:

で。
この左のパス欄に任意につけたvolume名を指定すると、ホストOSの特定ディレクトリに生成される。
/var/lib/docker/volumes/ にvolume用ディレクトリが作成されて、VirtualBox上で起動しているホストOSを終了させていても次回起動時に残っている。

:smiley:

# 対応策

例えば、your/postgresイメージからコンテナ起動時に指定したい場合。

## 起動コマンドで指定
volume名を「pgsql-data」としてvolumeオプションを指定。

`$ docker run -itd --name postgres --volume pgsql-data:/var/lib/pgsql your/postgres`

# Docker Compose で指定
Docker Compose用にYAMLに記載するには。

```yaml:docker-compose.yml
postgres:
  image: your/postgres
  volume:
    - pgsql-data:/var/lib/pgsql
```

## Dockerコマンドでのvolume操作
### 生成されたvolumeを確認
`$ docker volume ls`

### 事前にvolumeを生成
`$ docker volume create pgsql-data`

### 生成したvolumeを削除
`$ docker volume rm pgsql-data`
【備忘録】SQLServerの名前付きインスタンスに外から接続したい

ローカルからは接続できるのに、外部から接続できない！っていう方の為のメモ。

Azure上にSQLServerの名前付きインスタンスを立てたらなかなか外から接続できなくって困った。
今回は、名前付きインスタンス特有のところで躓きました。


Azureの設定含め、だいたいここに載ってることで9割足ります。
SQL Server 仮想マシンへの接続 (リソース マネージャー) | Microsoft Docs 
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/sql/virtual-machines-windows-sql-connect


ざっと書いてあることを箇条書きにすると

- (Azure設定)セキュリティグループで1433ポートのTCPの許可
- (Azure設定)パブリック IP アドレスの DNS ラベルの構成
- (OS設定)FireWallの設定で1433ポートの許可
- (DB設定) SQL Server 構成マネージャーでTCP/IPの許可
- (DB設定)混合モード認証の許可

こんな感じです。疲れた。多い。
通常のデフォルトインスタンスならこれでOKなはず。


ただし、**デフォルトのDBインスタンスが1433ポートでリッスンしているのに対し、
名前付きインスタンスは動的ポートを使う設定になっており、
上記を1433で設定しても名前付きインスタンスにはつながらない**

先ほど有効化したTCP/IPを右クリック⇒プロパティ

![あ.png](https://qiita-image-store.s3.amazonaws.com/0/79236/6c3832a7-dc6f-1e33-9819-df22cf21b05b.png)


名前付きインスタンスのポートが動的(Dynamic)になってるので静的なポートを指定しましょう。
ここではデフォルトインスタンスは停止しているので、名前付きインスタンスを1433に設定しています。
![あい.png](https://qiita-image-store.s3.amazonaws.com/0/79236/d0feddbf-b75c-7899-a73d-5bbb4a8408fa.png)


最後にDBインスタンスの再起動をお忘れなく(設定が反映されない)
以上です。
CloudFront+S3+Route53のメンテナス画面でハマッたら

[S3+CloudFront+Route53で503なSorryページを安価に実現する](http://hiroohi.hatenablog.com/entry/2016/02/01/123959)を参考に、AWSでメンテナンス画面を作ろうと思ったら、思わぬところでハマりました。
知っていたら、そりゃそーだ、という内容ですが、折角なので記事にしてみます。

# 前提／目的

* AWS上でWebサイトを構築した（Route53による独自ドメイン＋ClassicELB＋EC2＋RDSな構成）
* EC2は冗長構成（AZも別）だが、サイトダウン時に404エラーにはしたくない
* EC2とは別にメンテナンス画面を表示する仕組みとしたい
* 独自ドメイン＋SSL証明書を取得しているので、独自ドメインとして表示したい（ドメインはRoute53でホスティング）
* AWS上で完結したい（プラットフォーム分散の運用コスト増は避けたい）
* 高価な仕組みは避けたい

# 方針

* 最初に挙げた参考サイトを基本とする（毎月約0.2ドルで運用出来る！！）
* CloudFrontにもSSL証明書を適用し、独自ドメインとして実現する
* 耐障害性に優れた構成とし、EC2などのサーバー運用に依存しない（EC2が死んでもメンテナンス画面は生き残る！！）
* SNIのSSLとする（IPアドレスベースのSSLだと証明書毎に600ドルもかかるので・・・）

# 参考サイトと異なる点

|変更点|理由|
|---|---|
|S3を静的ホスティング設定にする|メンテナンス画面以外の静的コンテンツ（CSSとか画像とか）を外部参照させたかったため|
|独自ドメイン＋SSL証明書|[CloudFrontでS3のウェブサイトをSSL化する](http://qiita.com/jasbulilit/items/73d70a01a5d3b520450f)を参照|

# 当記事で除外したもの

* 途中までは参考サイト通り、S3バケットをCloudFrontのOriginに設定済み（Error Pages等も設定）
* 独自SSL証明書のアップロード（[AWS の CloudFront で独自 SSL 証明書を利用する](https://yosida95.com/2014/07/01/021829.html)などを参照）
* Route53のDNS設定（独自ドメイン取得とか、Hosted Zonesとか）
* CloudFrontのログ設定等
* メンテナンス画面のデザインや記述等（適当にHTMLを作ってください）
* S3のポリシー（基本的には全許可）は大雑把に以下の通り  
```
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[バケット名]/*"
```

# システム構成イメージ

![Maintenance_Architecture.png](https://qiita-image-store.s3.amazonaws.com/0/64121/c39f2a82-6e36-49a0-e361-665826ef089e.png)

# 結論！！

* CloudFrontの「Origin Domain Name」に**「S3の静的ウェブサイトホスティングエンドポイントを設定する」**

以上！！

# ちょこっと解説

* 公式サイトに書いてありました・・・[Amazon S3 オリジンおよびカスタムオリジンを使用したウェブディストリビューション](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/DownloadDistS3AndCustomOrigins.html)
  * 以下、抜粋

> CloudFront がオブジェクトを取得する Amazon S3 バケットを指定するとき、バケット名を指定する方法は、バケットをウェブサイトエンドポイントとして構成しているかどうかによって変わります。
>> バケットはウェブサイトエンドポイントとして構成されている
>>> バケットの Amazon S3 静的ウェブサイトホスティングエンドポイントを入力します。この値は、Amazon S3 コンソールの [Static Website Hosting] の [Properties] ページに表示されます。
>>> 
>>> この形式でバケット名を指定すると、Amazon S3 リダイレクトと Amazon S3 カスタムエラードキュメントを使用できます。（CloudFront でもカスタムエラーページが提供されています。詳細については、「エラーレスポンスのカスタマイズ」を参照してください。）Amazon S3 の諸機能について詳しくは、「Amazon S3 ドキュメント」を参照してください。
>>> 
>>> 以下の形式を使用してバケットを指定しないでください。
>>> 
>>> Amazon S3 のパススタイル（s3.amazonaws.com/bucket-name）
>>> Amazon S3 の CNAME（ある場合）

# 実際の設定箇所

* CloudFrontのDistributionを選択
![2017-02-28_00h12_46.png](https://qiita-image-store.s3.amazonaws.com/0/64121/0c4437c9-235b-fae2-ec17-7e074d472693.png)
* Originsタブを選択し、Editで編集
* 編集画面で以下の通り、Origin Domain NameへS3の静的ウェブホスティングエンドポイントを指定
![2017-02-28_00h21_09.png](https://qiita-image-store.s3.amazonaws.com/0/64121/f146c9fb-3fb5-ac23-dc64-9a17129eb6a1.png)
* 「Yes,Edit」を押下

あとは数分でCloudFrontに反映されます。

# 所感

いつものパターンですが、**「公式ドキュメントを良く読め！！」**ってことですね。。。  
自分がまさにそうなのですが、とりあえずやりたい事に近いサイトを見る⇒その通りやってみる⇒ダメだったらググって、最終的に公式ドキュメントにたどり着く、というパターンが多いです。  
逆に言うと、情報が拾いやすいので、解決への時間も早いと感じますね。  
精進します！！
XamarinでHello World やってみました。(Mac編)

# XamarinでHello worldまで5分

##5分でHello worldを実施する条件
1.Xamarin Studioをインストールしていること
2.Xcodeをインストールしていること(※僕は、Version 8.2.1です。)


###1.Xamarin Studioを開いて新しいソリューションを作成します。
新しいプロジェクトのテンプレートを選びます。

###2.アプリのSingle View appをクリックします。

###3.App Nameに任意の名前を入れて、プロジェクトを作成します。![スクリーンショット 2017-02-28 00.20.02.png](https://qiita-image-store.s3.amazonaws.com/0/96324/23f4cc35-8590-5239-c9bc-87e96c3d67ad.png)
![スクリーンショット 2017-02-28 00.22.35.png](https://qiita-image-store.s3.amazonaws.com/0/96324/ab7aa67f-60ce-0f9c-b266-bdb44ea62171.png)

###4.左上のビルドボタン（▷のボタン）をクリックするとHello World完成です！
※ビルドボタンを押すとシュミレータが表示されます。
![スクリーンショット 2017-02-28 00.25.45.png](https://qiita-image-store.s3.amazonaws.com/0/96324/24d77414-7ffc-a6fc-8a07-4e5b217e586c.png)


これからもっといろんな開発をしていきたいと思います！
Vagrantで楽に接続できるようになろう


##vagrantで楽に接続するために

```php:Vagrantfileがあるディレクトリ
$ vagrant ssh-config --host NAME >> ~/.ssh/config
```

このように打つと...

```php:Vagrantfileがあるディレクトリ
$ ssh NAME
```

たったこれだけどssh接続できるようになります！！
unique_ptrのメンバ変数のGetter/Setter

C++11でunique_ptrなメンバ変数に対するGetter/Setterの書き方。

```cpp
class B {
public:
    B() {}
    ~B() {}
};

class A {
public:
    const B& GetData() const {
        if (!m_data) {
            throw std::domain_error("null pointer");
        }
        return *m_data;
    }

    void SetData(std::unique_ptr<B>&& new_data) {
        m_data = std::move(new_data);
    }

private:
    std::unique_ptr<B> m_data;
};

int main(void) {
    A obj;

    std::unique_ptr<B> data1(new B());
    obj.SetData(std::move(data1));

    const B& b1 = obj.GetData();

    return 0;
}

```

Getterはconst参照で返す。理由は、

* 所有権を渡すわけではない。

m_dataがnullptrの場合は例外投げておく。

Setterは右辺値参照を引数にとり、moveしてメンバ変数に設定する。理由は、

* 引数の型を`unique_ptr<B>`の値渡しにすると、仮引数に渡すときにunique_ptrのムーブコンストラクタが呼ばれるので無駄。
Viual Studio Code 1.9でMarkdownの編集・プレビューがさらにパワーアップした！

　2017年1月に公開された、Visual Studio Code 1.9で、Markdownの編集・プレビューがさらにパワーアップし、使いやすくなりました。

　編集タブとプレビュータブをタブ分割で同時に表示している時、プレビュー画面のスクロールに編集画面が追従するようになりました。

![scroll.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/f72310a8-a783-cbd0-eb53-e08f3044d851.gif)

　プレビュータブ上の編集したいところをタップすると、編集したいところにカーソルがある状態で編集タブが開くようになりました。

![tap_to_open.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/231ead7e-8901-b940-70fd-2b56a26a132e.gif)

　編集タブとプレビュータブをタブ分割で同時に表示した時、プレビュータブ上の編集したいところをタップすると、編集タブでも該当行にカーソルが当たるようになりました。

![tap_to_open2.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/6454d0b8-d153-be9d-ec9d-f8c927170dba.gif)

　[Markdownの編集タブ・プレビュータブの切り替えのショートカット](http://qiita.com/RyotaMurohoshi/items/88ad727808be3f306453)はすでに充実していましたが、Visual Studio Code 1.9でさらにMarkdownの編集がやりやすくなりましたね。

* [公式リリースノート January 2017 (version 1.9)](http://code.visualstudio.com/updates/v1_9)
* [【Visual Studio Code】最新バージョン1.9版のリリースノート意訳&GitHubへ公開しました](https://blogs.msdn.microsoft.com/ayatokura/2017/02/19/vsc1-9_releasenote/) by [ayatokura](https://social.msdn.microsoft.com/profile/ayatokura)さん
* [Visual Studio Code 1.9がリリース - タスクを拡張，MarkdownサポートとTerminalパフォーマンスを向上](https://www.infoq.com/jp/news/2017/02/visual-studio-code-19-released) by InfoQ
Could not retrieve mirrorlist http://mirrorlist.centos.org/?

DNSの記述をDNSと記載して出たエラー

Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"

:

Cannot find a valid baseurl for repo: base/7/x86_64

下記のように「DNS1」と記載すればよかったが、
「DNS」と記載して接続できなかった。
# IP Address
IPADDR="192.168.0.45"
# Subnet Mask
NETMASK="255.255.255.0"
# Default Gateway
GATEWAY="192.168.0.1"
# DNS Server
DNS1="192.168.0.1"
PerlからgmailでメールをSMTP over TLSで送信する

[distributed.netのstatsをメールで通知する](http://qiita.com/saoyagi2/items/b97e65ee1b489009cff7)では、PerlからNet::SMTPモジュールを使ってメール送信していたのですが、認証もされてないメールはspam判定されるようになってしまいました。仕方なく、今頃になってですがSMTP over TLSで送信するように修正したのでメモ。とりあえず以下のスクリプトでgmailから送信することが出来ています。

```
#!/usr/local/bin/perl

use strict;
use warnings;

use Net::SMTP;

my $smtp = 'smtp.gmail.com';
my $port = 587;
my $user = '(your acount)@gmail.com';
my $pass = '(your password)';
my $from = '(your acount)@gmail.com';
my $to = '(target mail address)';

my $mail = Net::SMTP->new( $smtp,
    Hello => $smtp,
    Port => $port
);
$mail->starttls();
$mail->auth( $user, $pass );
$mail->mail( $from );
$mail->to( $to );
$mail->data();
$mail->datasend( 'This is test mail.' );
$mail->dataend();
$mail->quit;
```

ほんとは全権限が付与されるパスワード認証ではなく、OAuthで送信権限のみを付与するのがいいのですが、それはまた今度調べます。

それにしても、昔はpopenしてsendmailコマンドに送り込むだけでメール送信できてたのにねぇ。時代は変わった（とじじいは思うのであった

(2017/2/28追記)

gmailの場合、パスワード認証を通すためには安全性の低いアプリがアカウントにアクセスするのを許可しないといけません。デフォルトでは不許可になっていますので設定を変更しておきましょう。自分のメインアカウントを許可するのは危険ですので、メール送信用に別アカウントを取得するのがいいと思います。
Babelを使っているプロジェクトをgitリポジトリからnpm installする方法

npmレジストリを使わず，gitにある自作のパッケージ（ES2015で書いていてBabelでビルドしている）を`npm install`したい状況があったので，gitリポジトリから直接行う方法を調べました．ローカルディレクトリからのインストールも可能です．

目的が混ざってしまっていますが，binを含むパッケージとしても作成しています．

## 環境

* Node.js 0.12
* npm 2.15
* OSX 10.11

## 作ったGitリポジトリ

こちらです．

[ottijp/npm-install-from-git-sample](https://github.com/ottijp/npm-install-from-git-sample)

`Cat`クラスの定義と，`Tama`という名前の`Cat`インスタンスの`say()`を呼ぶだけのbinスクリプトを含んでいます．

``` src/cat.js
export default class Cat {
  constructor(name) {
    this.name = name
  }
  say() {
    console.log(`${this.name}: meow!!`)
  }
}
```

``` sh:bin/npm-install-from-git-sample
#!/usr/bin/env node

var Cat = require('npm-install-from-git-sample').default;

var tama = new Cat('Tama');
tama.say();
```


## 使い方

このライブラリに入っているbinのコマンドを実行する場合．

``` sh:
$ npm install https://github.com/ottijp/npm-install-from-git-sample
$ ./node_modules/.bin/npm-install-from-git-sample
Tama: meow!!
```

ライブラリとして使う場合．

``` sh:
$ npm install https://github.com/ottijp/npm-install-from-git-sample
$ node
> var Cat = require('npm-install-from-git-sample').default;
undefined
> var mike = new Cat('Mike');
undefined
> mike.say();
Mike: meow!!
undefined
```

ローカルディレクトリからインストールする場合はgitリポジトリのURL部分をパスに変えるだけです．

``` sh:
$ npm install ~/dev/npm-install-from-git-sample
```


## 説明

`npm install`した時のフックスクリプト（`postinstall`キー）でbabelを使ってビルドしていますが，babelは`devDependencies`に入れておきたいので，[postinstall-build](https://www.npmjs.com/package/postinstall-build)というパッケージを利用しました．

このパッケージがdevDependenciesにあるパッケージをインストールしてビルドし，ビルドが終わったらクリーンアップしてくれます．

``` package.json
{
...
  "scripts": {
    "build": "babel --presets es2015 -d lib src",
    "postinstall": "postinstall-build lib \"npm run build\""
  },
...
  "dependencies": {
    "postinstall-build": "^2.1.3"
  },
  "devDependencies": {
    "babel-cli": "^6.23.0",
    "babel-preset-es2015": "^6.22.0"
  },
  "bin": {
    "npm-install-from-git-sample": "./bin/npm-install-from-git-sample"
  }
}
```

## 注意

私が引っかかった点です．

* ライブラリとしてのエントリポイント（`require`で読み込むもの）は`package.json`の`main`に記述します（[参照](https://docs.npmjs.com/files/package.json#main)）
* `postinstall-build`の第１引数（今回は`lib`）のディレクトリが既に存在する場合はビルドがスキップされるので，読み込まれる側のパッケージ開発時にローカルディレクトリから`npm install`する時に`lib`がビルドされているか注意が必要です
* `src`ディレクトリは`postinstall-build`時に必要になるので，`.npmignore`には書かないようにします
ActiveRecord の find と where の違い。

こんにちは。18歳女子高生ながらエンジニアとしていろいろな会社でアルバイトをしている7cocoです。

# ActiveRecord の where句のあと思うように値が取り出せない！
という事態に先日はまりました。
クエリが違うのかなと思いながらいじっていると、「`where` を `find` に変更すると値が取り出せるようになる」ことに気づきました。

## どうして？
### `find` と `where` の違い
find：オブジェクトを一つ返す
where：オブジェクトを配列で返す ※これは厳密には間違いです。[追記](http://qiita.com/7coco/items/b08c842aece4b7f28f55#%E8%BF%BD%E8%A8%98)参照。

`where` は配列を返すので、その中のオブジェクトの中の値を直接取り出すことはできません。


```ruby
# 以下は動きますが
User.find(1).email
# こちらは動きません。
User.where(id: 1).email
```

`where` に `find` と同じような動きをさせたい場合には `first` をつけたりして `where` 句で返された配列の中からどのオブジェクトにメソッドを繋げるのか明示しましょう。

```ruby
# これは動く！
User.where(id: 1).first.name
```

## 追記
と思っていたのですが厳密には違うようです。

### ActiveRecord_Relation
`where` が返すのは配列ではなく、 `ActiveRecord_Relation` というものです。

※ (`ActiveRecord_Relation` について勉強してみたものをこちらにまとめています。http://qiita.com/7coco/items/2e3a9e720d29791f1cfc)

```ruby
user = User.where(id: 1)
user.class
=> User::ActiveRecord_Relation
```

#### こんな挙動、使い方
- 配列にしかないメソッドをチェインすると、レシーバを自動的に配列に変えて実行します。
- 配列にはないメソッドがいろいろとあります ( 例えば `where` をさらに繋げられます)。
- 配列にも `ActiveRecord_Relation` にもあるメソッドで、配列のものを呼び出したい場合など、確実に配列のメソッドを呼び出したいときは `to_a` して配列にしてから呼び出すといいみたいです。
gulpでサクッとPhantomJSを実行する

# はじめに
仕事でPhantomJSを使ってWebアプリのスクリーンショットを自動取得する必要があったので、gulp(実際はさらにjenkinsと組み合わせる予定)からPhantomJSを実行するコードを書いてみました。

# サンプル

```gulpfile.js
var gulp = require("gulp");
var phantomjs = require('phantomjs-prebuilt');

gulp.task("phantomjs", function(done) {
  var program = phantomjs.exec('phantomjs-script.js');
  program.stdout.pipe(process.stdout);
  program.stderr.pipe(process.stderr);
  program.on('exit', code => {
    done();
  });
});
```

```phantomjs-script.js
var page = require('webpage').create();

//指定したURLを開く
page.open('https://google.com', function(status) {
  console.log("Status: " + status);
  if(status === "success") {
    //screen capture
    page.render('google.png');
  }
  phantom.exit();
});
```

# 実行結果
```
$ gulp phantomjs
[23:19:21] Using gulpfile ~\Documents\node\node-v6.10.0-win-x64\gulpfile.js
[23:19:21] Starting 'phantomjs'...
Status: success
[23:19:25] Finished 'phantomjs' after 4.12 s
```

カレントディレクトリにgoogle.pngができていました。
![google.png](https://qiita-image-store.s3.amazonaws.com/0/165224/a75ee7ad-016d-167e-7cc0-6517bf80c7a9.png)
php artisan config:cacheでCannot redeclareエラー

ある日、`php artisan config:cache`を叩くとこんなエラーが発生しました。

```shell-session
$ php artisan route:cache
Route cache cleared!
PHP Fatal error:  Cannot redeclare defaultRoutes() (previously declared in /app/hogehoge/app/Http/routes.php:35) in ...
```

エラーの内容を見ていると、`defaultRoutes()`が再定義されているよ！というものでした。
この`defaultRoutes()`というのは、routes.phpで定義してる基本的なルーティングの設定をまとめたメソッドになっています。

具体的には、下記のようにルーティングが記述されていました。
※一部省略しています

```php:/app/Http/routes.php
if (strpos(url(), config('app.test_domain'))) {
    Route::group(['middleware' => 'auth'], function () {
        defaultRoutes();
    });
} else {
    defaultRoutes();
}
/*
 * 通常のrouteを定義
 */
function defaultRoutes ()
{
    Route::get('/hogehoge', 'HogeController@index');
}
```

この処理では、テストドメインでアクセスした際はBASIC認証を掛け、それ以外のドメインのアクセスの際には、BASIC認証を掛けずにページにアクセスできるようにしています。

通常のルートを`defaultRoutes()`で定義して、それを呼び出すような処理にしていました。

もちろん、この書き方で正しくルーティングされており、実際にページにアクセスしてもエラーが出ることはありませんでした。

しかし、このままだと`php artisan config:cache`や`php artisan route:cache`を叩こうとすると、タイトルのようなエラーが出てしまうようです。

この問題は、クロージャーを使用するように修正することで解決できました :muscle: 
[php - Cannot redeclare Laravel routes method duplication on phpunit - Stack Overflow](http://stackoverflow.com/questions/37123047/cannot-redeclare-laravel-routes-method-duplication-on-phpunit)

```php:/app/Http/routes.php
/*
 * 通常のrouteを定義
 */
$defaultRoutes = function(){
    Route::get('/hogehoge', 'HogeController@index');
};

if (strpos(url(), config('app.test_domain'))) {
    Route::group(['middleware' => 'auth'], $defaultRoutes);
} else {
    $defaultRoutes();
}
```
C#のコンソール入出力でテストする

# 概要
PaizaやCodeIQ，その他オンラインジャッジでC#を実行するときに，入出力の確認を楽に，かつちゃんとしたい．
毎回コンソールに貼り付けるのはもう面倒くさくて嫌だ．
かといって入力を埋め込むのはうっかりそのまま提出して死亡とかしそう．

あと他にも，コンソール入出力でテストしたいときって結構あるんじゃないかな．本当はモジュール化された単位で単体テストすべきだろうけど，そうともいかない要件も往々にしてあるだろう．

そこで，コンソール入出力を使って単体テストを構成する．

# 先行研究
- [[paiza]C#のテストを楽に行う方法](http://qiita.com/kokeiro001/items/2c8af6974af6bc233b80)
    - 非常に参考になるが，提出コードと同じファイルのMainの下の方にテスト用コードが増えてるのがイケてない．あと，出力が全部正しいかは結局手動で確認しないといけない．

# 環境
Visual Studio 2015 Community
まあ特に変なことやってないんで他でもできると思うが，確認したのはこれ．

# プロジェクト構成
こんな感じのプロジェクトになってることを想定する．`*.txt`は全て「出力ディレクトリにコピー」を「常に」か「新しい場合はコピーする」にする．

```ConsoleApplication1.sln
- ConsoleApplication1.csproj
    - Program.cs
        - class Program
            - Main(string[]) : void
- ConsoleApplication1Tests.csproj
    - Input1.txt
    - Input2.txt
    - Output1.txt
    - Output2.txt
    - ProgramTests.cs
```

`Program`クラスの`Main`メソッドが提出コード，`ProgramTests`から`Program.Main`を呼び出してテストする．

# テストコード
`ProgramTests` はこんな感じ．
`Console`の`In`と`Out`をファイルからの`StreamReader`と`StringWriter`にセットして，吐き出されたコンソール出力と想定する出力を比較する．

```ProgramTests.cs
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.IO;
using ConsoleApplication1;

namespace ConsoleApplication1Tests
{
	[TestClass()]
	public class ProgramTests
	{
		[TestMethod()]
		public void MainTest()
		{
			TestInOut("Input1.txt", "Output1.txt");
		}

		[TestMethod()]
		public void MainTest2()
		{
			TestInOut("Input2.txt", "Output2.txt");
		}


		public void TestInOut(string inputFileName, string outputFileName)
		{
			using (var input = new StreamReader(inputFileName))
			using (var output = new StringWriter())
			{
				Console.SetOut(output);
				Console.SetIn(input);

				Program.Main(new string[0]);

				Assert.AreEqual(File.ReadAllText(outputFileName), output.ToString());
			}
		}
	}
}
```

例えば，[Paizaのサンプル入出力](https://paiza.jp/guide/samplecode)なら，`Program.cs`はそのまま提出用のコードを書いて，

```Input1.txt
2 
2,5 
3,4

```
```Output1.txt
hello = 2 , world = 5 
hello = 3 , world = 4

```

というふうにする．
`Console.ReadLine()` `Console.WriteLine()`を使う都合上，末尾に必ずひとつだけ改行を入れる．

~~しかしこのサンプルコード， `using System;` してるのに `Console` クラスを完全修飾で書いてたり `Int32` だったりどうにかならなかったのだろうか．~~
~~大きなお世話だろうが `using static System.Console;` すれば(動作要件にはC#5と書いてあるけどmono 4.2.1なので動く)横スクロールも削減できるだろうに．~~

あとはこのテストを必要な分実行するなり，CIするなりすれば手軽にコード書きながらテストできる(はず)．
別の問題に移るときも，入出力のテキストと`Main`だけ書き換えればいいので楽．

以上です．それでは，快適なC#ライフを．
Mecabのユーザ辞書に顔文字を登録する

# ユーザ辞書への登録方法
こちらを参照　→　[MeCab:単語の追加方法](https://taku910.github.io/mecab/dic.html)
1. 登録したい単語をcsvファイルにまとめる
2. 辞書をコンパイル
3. dicrcまたはmecabrcのuserdicにコンパイルした辞書を指定


# 顔文字を登録する際に注意すること
- 顔文字内にコンマ(,)がある場合は、顔文字をダブルクオテーションで囲う
- 例：× → ( ,,｀･ ω´･),,,0,名詞,固有名詞,一般,\*,\*,\*,( ,,｀･ ω´･),\*,\*
- 例：○ → <font color = red>"</font>( ,,｀･ ω´･)<font color = red>"</font>,,,0,名詞,固有名詞,一般,,\*,\*,<font color = red>"</font>( ,,｀･ ω´･)<font color = red>"</font>,\*,\*


# 上記を無視した場合のエラー内容
- ```reading emo1.csv ... dictionary.cpp(38) [fi]```
【Unity】Sceneビューに何も表示されなくなった時の解決法

#Sceneビューのカメラに何も表示されない

シーンビューのカメラぐるぐる回して設定していたら、突然何も表示されなくなりました。

![2017-02-27_22h15_56.png](https://qiita-image-store.s3.amazonaws.com/0/164392/7096e05b-df01-6986-edc9-7d533a4b0e66.png)

コンソール確認したら、やたらエラーも出てる

![2017-02-27_22h18_06.png](https://qiita-image-store.s3.amazonaws.com/0/164392/d46887b2-2937-e0c9-ea7f-f17ed6f1c15f.png)

- transform.position assign attempt for 'SceneCamera' is not valid. Input position is { NaN, NaN, NaN }.
UnityEditor.DockArea:OnGUI()
- Screen position out of view frustum (screen pos 366.117218, 265.997955, 1.#QNAN0) (Camera rect 0 0 882 508)
UnityEditor.DockArea:OnGUI()
- Assertion failed on expression: 'IsNormalized (normal, 0.001f)'
UnityEditor.DockArea:OnGUI()
- Assertion failed on expression: 'IsFinite(outDistanceForSort)'
UnityEditor.DockArea:OnGUI()

などなど…

調べてみたら「LayersのDefaultにチェックが入っていなかった」
という記事を発見。

[Sceneビューに何も表示されない！ \- テラシュールブログ](http://tsubakit1.hateblo.jp/entry/20120216/1329382439)

![2017-02-27_22h59_32.png](https://qiita-image-store.s3.amazonaws.com/0/164392/9d9b948b-ed94-7882-2049-12165bccd15a.png)

早速確認するも、チェック（目のマーク）が入っているのでこれではなかった。
うっかりこの状態でセーブしたみたいで、開き直しても復旧せず。
2Dや3Dを切り替えたり、Hierarchyビューのオブジェクトダブルクリックとか、色々やってみたけどダメ…

#解決法
Sceneビューのタブを右クリックして、
**[Add Tab] → [Scene]** を選択して、
新たにSceneビューを作成するという単純な方法です。

![2017-02-27_23h13_27.png](https://qiita-image-store.s3.amazonaws.com/0/164392/d5ef6d60-9ab8-55af-3fea-5672b7541fa7.png)

問題の起こったビューは同じく右クリックから **[Close Tab]** で閉じてしまいましょう。

今のところこれで問題起こってないので、大丈夫だと思います。
（もしかしたら邪道な直し方かもしれません）
Djangoの独自ミドルウェアを作成する

**2/28 リポジトリにファイルをあげ忘れていたのを修正。。。**

# 目的
Djangoで独自middlewareを作成、利用する。

# 環境
- Ubuntu 16.04
- python 3.5.2
- Django 1.10.5

# Djangoのmiddlewareとは

リクエストがビューで処理される前処理および、
ビューの後処理としてリクエスト、レスポンスの処理を行う。

# 実装

```
middlewares
|_ __init__.py
|_ sample_middleware.py
```

```python:sample_middleware.py
class SampleMiddleware(object):
    """
    サンプルのmiddleware、
    リクエストがviewで処理される前と、
    レスポンスがクライアントに返される前に画面に文字列表示を行うだけ
    """
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        self.process_request(request) #前処理
        response = self.get_response(request)　# ビューの処理
        self.process_response(request, response) #後処理

        return response

    def process_request(self, request):
        print("リクエストの処理")

    def process_response(self, request, response):
        print("レスポンスの処理")
```

ルーティングやビューの準備は適当に。
前処理、後処理のメソッドは任意のものを追加可能
(process_~~である必要はもちろんない)

# 設定方法

```python:settings.pyの抜粋
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'middleware_sample.middlewares.sample_middleware.SampleMiddleware',
]
```

# 動作
http://127.0.0.1:8000/test/　にブラウザでアクセスすると、
以下の内容が表示される。

```bash:ブラウザアクセス時のサーバ側ターミナルの表示
リクエストの処理
Sample用ビューの処理
レスポンスの処理
[27/Feb/2017 14:11:02] "GET /test/ HTTP/1.1" 200 22
```


# 参考
GitHubにサンプルコードを上げておいた
https://github.com/Fufuhu/DjangoMiddlewareSample
マイグレーションにおいて参照先テーブル名を自動で推定できないカラムを外部キーとして指定する方法


# 結論

方法は 2 通りあります。

## `references` 型カラム定義時に `:to_table` オプションを使う

`references` 型のカラム定義時にオプション `foreign_key: { to_table: <参照先テーブル名> }` を指定します。

## `add_foreign_key` の `:column` オプションを使う

テーブル／カラム定義後に外部キーとしたいカラムに対して `add_foreign_key <テーブル名>, <参照先テーブル名>, column: <カラム名>` を指定します。

# 問題

テーブル `users`, `memos` において、`memos` の外部キーのカラム名 `author` にテーブル `users` を参照させるようなマイグレーションを書いたとします。

```ruby
class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name, null: false
      t.string :email, null: false
      t.string :password_digest, null: false

      t.timestamps
    end
  end
end

class CreateMemos < ActiveRecord::Migration[5.0]
  def change
    create_table :memos do |t|
      t.string :title
      t.text :content, null: false
      t.references :author, foreign_key: true

      t.timestamps
    end
  end
end
```

このとき、外部キーのカラム名から参照先テーブルを推定できないため、たとえば PostgerSQL だと次のようなメッセージを出力して、DB のマイグレーションに失敗します。

```
PG::UndefinedTable: ERROR:  relation "authors" does not exist
: CREATE TABLE "memos" ("id" serial primary key, "title" character varying, "content" text NOT NULL, "author_id" integer, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL, CONSTRAINT "fk_rails_55c841b9ea"
FOREIGN KEY ("author_id")
  REFERENCES "authors" ("id")
)
```

## 解決方法

解決方法は 2 通りあります。

### `reference` 型カラム定義時に `:to_table` オプションを使う

この場合は、`references` 型カラムを定義している部分でオプション `:foreign_key` にサブオプション `:to_table` を参照先テーブル名とともに指定することで、正しく参照先テーブルを参照できるようになります。

テーブル定義と一緒にカラムを定義する場合、次のように書きます。

```ruby
class CreateMemos < ActiveRecord::Migration[5.0]
  def change
    create_table :memos do |t|
      # ...
      t.references :author, foreign_key: { to_table: :users }
      # ...
    end
  end
end
```

カラムだけ定義する場合、次のように書きます。

```ruby
class AddAuthorToMemos < ActiveReocrd::Migration[5.0]
  def change
    add_reference :memos, :author, foreign_key: { to_table: :users }
  end
end
```

### `add_foreign_key` の `:column` オプションを使う

この場合は、`references` 型のカラムだけを定義しておき、別途 `add_foreign_key` のオプション `:column` で外部キーのカラム名と参照先テーブル名を明示的に関連付けることで、正しく参照先テーブルを参照できるようになります。

テーブル定義と一緒にカラムを定義する場合、次のように書きます。

```ruby
class CreateMemos < ActiveRecord::Migration[5.0]
  def change
    create_table :memos do |t|
      # ...
      t.references :author
      # ...
    end
  end
  add_foreign_key :memos, :users, column: :author_id
end
```

カラム定義後の場合、次のように書きます。

```ruby
class AddAuthorToMemos < ActiveReocrd::Migration[5.0]
  def change
    add_reference :memos, :author
  end
  add_foreign_key :memos, :users, column: :author_id
end
```

# 参考文献

- [ActiveRecord::ConnectionAdapters::SchemaStatements](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html)
railsのバッチメモ  


## はじめに
他のqiita記事だったりサイトを参考に自分用メモとしています。

## application.rbに以下の設定を追加
```ruby:config/application.rb
 class Application < Rails::Application
   config.autoload_paths += Dir["#{config.root}/lib"]
 end
```

## バッチファイル作成
libの下にbatchフォルダを作成し、ファイルを作成していきます。

```ruby:lib/batch/sample.rb
class Sample
  def self.hello
    puts "hello world"
  end
end
```

##実行
```
$ rails runner Batch::Sample.hello
```

の手順で処理の実行が可能です。

`Whenever`というcrontab管理ライブラリの`gem`があります。

`Whenever`をいれることによりバッチをいつ実行させるかのタイミングを指定することができます。

下記のサイトを参考に導入させていただきました。
http://morizyun.github.io/blog/whenever-gem-rails-ruby-capistrano/
Jupyter Notebook上でデータサイエンスの「あれやりたい」ときのライブラリ

# この記事

python、いろいろなデータサイエンス向けのライブラリがあるんですが

- プロットしたいんだけど！
- 検定処理やりたいんだけど！
- データフレームの加工やりたいんだけど！

といった基本的なことにどんなライブラリがあるのか紹介します。

**お願い: 編集リクエストで項目増やしたり、オススメ教えてください。**

## データ加工

### pandas

(SQLで有名な)リレーショナルモデルのような形式の「データフレーム」によってデータを保持し
これに対するフィルタ、マッピング、グループ化などの機能を提供します。
ついでにデータの読み込み・書き出しのためのインタフェイスも豊富に備えています。

csvを読んで、そのうち `'売上'` の項目が `1000` 以上である物だけを残すサンプルは以下のようになります。

```python
import pandas as pd
data = pd.read_csv("data.csv")
over_1000 = data[ data['売上'] > 1000 ]
```

## 線型代数的な処理

### numpy

```python
import numpy as np
# リストから行列生成
mat = np.matrix([[1, 2], [3, 4]])
# リストからベクトル生成
vec = np.array([5, 6])
# 行列積をとる
mat.dot(vec)
```

## 乱数生成

### numpy

numpyは線型代数の処理も含む広範な基礎的処理を提供してくれてます。この中には分布に従った乱数生成も入っています。

たとえば正規分布に従う乱数列は以下のように生成できます

```python
import numpy as np

mu, sigma = 2, 0.5
v = np.random.normal(mu,sigma,10000)
```

## プロット

グラフを描画するのに使えるライブラリ

### matplotlib

様々なグラフを描画する機能を提供してくれます。比較的低レイヤーのライブラリなのでseabornなどと組み合わせて使うことになるでしょう。

```python
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-3, 3, 0.1)
y = np.sin(x)
plt.plot(x, y)
```

### seaborn

Searbornはmatplotlibをラップして、もっと簡単にきれいなグラフを描く方法を提供してくれるライブラリです。
たとえばヒートマップなどを描画する機能を提供します。

```python
import numpy as np
import matplotlib
# seabornをimportした時点でmatplotlibのグラフはseabornスタイルのきれいなグラフになる
import seaborn as sns

x = np.random.normal(size=100)
sns.distplot(x);
```


## 統計的検定

### scipy

scipyは科学技術計算に必要な処理を提供してくれるライブラリです。
このライブラリは実際にはかなり広範な機能を提供してくれているので、大抵のやりたいことはここをさがせば見つかったりするかもしれません。

t検定を以下のように実施できます。

```python
import numpy as np
from scipy import stats

a = np.random.normal(0, 1, size=100)
b = np.random.normal(1, 1, size=10)
stats.ttest_ind(a, b)
```

## 記号微分

### sympy

代数的計算を自動的にやってくれるライブラリです。つまり式変形の類を丸投げできるライブラリです。(ところで知ってる方が居れば: これって中身は項書き換え系ですか？)

用途としてここでは記号微分を挙げておきます。

```python
import sympy as sym

# 変数を準備
x = sym.symbols("x")
# 多項式を立てて……
f = x**3 + 2*x**2 - x + 5
# 微分する
df_dx = sym.diff(f, x)
```

## 統計モデルの作成

### statsmodels

統計モデルの作成に便利なライブラリです。

以下は一般化線形モデルを生成する例して、その基本的統計情報を見る例です(AICなどが出ます)

```
import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf

df = pd.read_csv("data.csv")

formula = 'Sales ~ AccessCount + MailSendedCount'
mod = smf.ols(formula=formula, data=df)
res = mod.fit()
res.summary()
```

### scikit-learn



# メモ

(順次内容増やす。)
Ionic1.x系のプロジェクトをWebpack2.2で今風に

# ご挨拶
初めての投稿です。お手柔らかに激しいご指導ご鞭撻お願いします。
Ionic1.1フレームワークで作られたアプリの保守を開始して、半年が過ぎました。
開発期間を含めると約1年お付き合いしているアプリです。

初めてのハイブリッドアプリでとても良い経験を積めたのですが・・・

なんかもう古い（笑）

# やりたかったこと
こんなふうな環境でゼロベースから作り直したいな～な私的理想環境を構築。

### 現環境
* jshintで静的解析
* grunt dgeniでドキュメント管理
* 型チェックなにそれ？
* www/src以下のソースコードを直接編集
* es6?????

# 結果
[yosshitaku067/ionic-webpack-es6-starter](https://github.com/yosshitaku067/ionic-webpack-es6-starter)

webpack.config.jsはこんな感じ

```
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var path = require('path');
const webpack = require("webpack");

module.exports = {
  entry: './src/app/app.js',
  output: {
    filename: 'app.bundle.js',
    path: path.resolve(__dirname, 'www/src')
  },
  module: {
    rules: [{
        test: /\.js$/,
        exclude: '/node_modules/',
        loader: 'babel-loader'
      },
      { // regular css files
        test: /\.css$/,
        loader: ExtractTextPlugin.extract({
          loader: 'css-loader?importLoaders=1',
        }),
      },
      { // sass / scss loader for webpack
        test: /\.(sass|scss)$/,
        loader: ExtractTextPlugin.extract(['css-loader', 'sass-loader'])
      }, {
        test: /\.(ttf|otf|eot|svg|woff(2)?)(\?[a-z0-9]+)?$/,
        loader: 'file-loader?name=fonts/[name].[ext]'
      }, {
        test: /\.html$/,
        loader: 'html-loader'
      }, {
        test: /\.(png|jpg)$/,
        use: [{
          loader: 'url-loader',
          options: {
            limit: 10000
          } // Convert images < 10k to base64 strings
        }]
      }
    ]
  },
  devtool: 'source-map',
  plugins: [
    new ExtractTextPlugin({
      filename: 'style.bundle.css',
      disable: false,
      allChunks: true
    }),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    })
  ]
};
```

### 使い方
```
npm install
npm run start
```

### ポイント
* FlowTypeを試験的につかってみたところ。
* ESLint


# 感想
Webpackについて調査すると、日本語の情報は1.xについてが多い。
結局は公式ページとにらめっこになりました。
振り返るとなにも大変なことはやっていないんですけどね。

まあ素直にIonic2に移行できればいいんですが、
そんなわけにもいかないので気分だけでも味わいました。

# できていないこと
コメントからのドキュメント管理。
今更gruntやgulpを使いたくはないな～。
なんか新しい方法ないかな～。
ぼんやりとした視力にならう何か書かれているものの眺め方

何か　並んでいる。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020a1.png?raw=true)

目を　凝らして見ると……。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020a2.png?raw=true)

何か　見覚えのある形が見えてきた。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020a3.png?raw=true)

あっ、これ知ってる。イコールだ。もう少し眺めていると……。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020a4.png?raw=true)

何か　見覚えのある形が見えてきた。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020a5.png?raw=true)

なんで　横長につなげるのか……。

なんだか　よく分からないが、これと　これは　イコールですよ、

あるいは　暗黙のうちに　「分かれ」　と言われているような　何か書かれているものだ。

なんで　そんなに　イコールであることを　説明したいのだろうか。よく出てくる。

また別の　何か書かれているものを見てみよう。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020b1.png?raw=true)

目を　凝らして見ると……。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020b2.png?raw=true)

微妙に　さっきと違う形のものが見えてきた。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020b3.png?raw=true)

定義する、だ。　イコールと何が違うのか分からないが、この記号は　突然出てきて　聞いてないよ、というようなことを　説明し始める。

：＝　記号の　左にも　右にも　何だこれ、というものが並んでいるかもしれないが、

なんかこれも　暗黙のうちに　「**分かれ**」　と言われている気がする……。

また別の部分を眺めてみよう。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020c1.png?raw=true)

目を　凝らして見ると……。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020c2.png?raw=true)

あれは……、**縦棒** だ！

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020c3.png?raw=true)

この縦棒、他の計算記号と何か違う。何がどう違うのか説明できないが、なんか縦棒の右側には　説明が書いてある気がする……。

縦棒の右側の方をよく見てみよう。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020d1.png?raw=true)

目を　凝らして見ると……。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020d2.png?raw=true)

あれは……、

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020d3.png?raw=true)

**コンマ** だ！ なんで　こんなところにコンマがあるのか……。

しかも、

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020d4.png?raw=true)

コンマを見ているだけでは　どこが切れ目か分からない。何かを区切っているのかと思ったら連続だったりもする。このリズムはつかめない。基本的には　切れ目のはずだが……。

また別の部分を眺めてみよう。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020e1.png?raw=true)

目を　凝らして見ると……。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020e2.png?raw=true)

あれは……、

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020e3.png?raw=true)

Ｅみたいな記号の　丸っこい方のやつだ！ そして　さらに眺めていると……。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020e4.png?raw=true)

両端の方も　餅のように千切れてきた。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702272020e5.png?raw=true)

そして　∈　の左側には　アルファベットの小文字が、　右側には　アルファベットの大文字が　置いてあるのをよく見かける。

この記号を見かけても　なにか計算しなければいけないわけではないので気楽だ。
まるで　間違って送られてきた郵便物を　中を開けずに　そのまま　返送する気分に似ている。自分宛てなのか　そうでないのか分かれば十分……。

例えば宛名に　厳正な抽選の結果、任意の人類に当たりました　とか書いてたら　確かにわたしが開けてもいいのかもしれないが、開けたい気がしない。それにしても　なぜか固有名詞が書かれていることが無い。


また　思い出したら　書き足す。
Ruby + RMagic or EXIF Reader で EXIF の撮影日時情報 DateTimeOriginal を取得する

## サンプルコード

```ruby
require 'time'

class ExifReader

  def initialize
    @loadable_rmagick = loadable_rmagick?
    @loadable_exifr = loadable_exifr?
  end

  def to_s
    "[#{self.class}]loadable rmagick: #{@loadable_rmagick}, loadable exifr: #{@loadable_exifr}"
  end

  # RMagick が使える場合は true を返す
  def loadable_rmagick?
    begin
      require 'rmagick'
      true
    rescue LoadError => e
      false
    end
  end

  # EXIF Reader が使える場合は true を返す
  def loadable_exifr?
    begin
      require 'exifr'
      true
    rescue LoadError => e
      false
    end
  end

  # 撮影日時を Time オブジェクトで返す (撮影日時情報が無い場合はnilを返す)
  def datetime_original(file)
    if @loadable_rmagick
      datetime_original_by_rmagick(file)
    elsif @loadable_exifr
      datetime_original_by_exifr(file)
    else
      nil
    end
  end

  def datetime_original_by_rmagick(file)
    image = Magick::Image.read(file).first
    dt = image.get_exif_by_entry('DateTimeOriginal')
    if dt[0][1] != nil
      Time.strptime(dt[0][1], '%Y:%m:%d %H:%M:%S')
    else
      nil
    end
  end

  def datetime_original_by_exifr(file)
    EXIFR::JPEG.new(file).date_time_original
  end
end

er = ExifReader.new()
puts er

file = ARGV[0]
puts 'RMagick: ' + er.datetime_original_by_rmagick(file).to_s if er.loadable_rmagick?
puts 'Exifr: ' + er.datetime_original_by_exifr(file).to_s if er.loadable_exifr?
puts er.datetime_original(file)
```

## サンプルコードの実行結果

```
$ ruby datetime_original.rb sample.jpg 
[ExifReader]loadable rmagick: true, loadable exifr: true
RMagick: 2017-02-04 11:06:44 +0900
Exifr: 2017-02-04 11:06:44 +0900
2017-02-04 11:06:44 +0900
```

## 参考資料

- GitHub - rmagick/rmagick: Ruby bindings for ImageMagick https://github.com/rmagick/rmagick
- GitHub - remvee/exifr: EXIF Reader https://github.com/remvee/exifr/
クロスサイトリクエストフォージェリ 保護

form_authenticity_tokenメソッド

```ruby:
<%= form_for @user do |f| %>
  <%= f.text_field :username %>
  <%= f.text_field :password %>
<% end %>
```


```ruby:
<form accept-charset="UTF-8" action="/users/1" method="post">
<input type="hidden"
       value="67250ab105eb5ad10851c00a5621854a23af5489"
       name="authenticity_token"/>
<!-- fields -->
</form>
```