OmniAICreator/Qiita-1.07M huggingface dataset:
特異メソッドとクラスメソッド

# rubyの特異メソッドとクラスメソッド


> クラスメソッドは、実際には特異メソッドである

Rubyの入門書を読んでいてこう書いてあった。
それぞれ調べてみた。

<b>特異メソッド</b>
特定のオブジェクトに対して、定義するメソッド。

<b>クラスメソッド</b>
オブジェクトではなく、クラスから呼び出されるメソッド。

## 違うものなのに一緒ってどういうことなんだろう?

> rubyでは、ほとんどがオブジェクトである。

メソッドやブロックなど一部を除き、様々な値やクラスも含めてほとんどはオブジェクトである。下記を、見ればわかりやすい。
Objectクラスのclassメソッドは、さまざまなオブジェクトのクラスを調べることができる。

``` pry
[1] pry(main)> 1.class
=> Fixnum
[2] pry(main)> "a".class
=> String
[3] pry(main)> [1,2].class
=> Array
[4] pry(main)> {:x => 1}.class
=> Hash
[5] pry(main)> true.class
=> TrueClass
[6] pry(main)> nil.class
=> NilClass


# それぞれのクラスもClassクラスのオブジェクト
[9] pry(main)> String.class
=> Class
[10] pry(main)> Fixnum.class
=> Class
[11] pry(main)> String.class
=> Class
[12] pry(main)> TrueClass.class
=> Class

```
上記を踏まえて、
クラスメソッドを定義してみる

``` ruby
class String
  def self.hoge
    # なんかしらの処理
  end
end
```

hogeメソッドを、Stringクラスのクラスメソッドとして定義した。
StringクラスもClassクラスのオブジェクトであれば、
<b>hogeメソッドが、Classクラスのオブジェクトの特異メソッド</b>
と言える。

よって

> クラスメソッドは、実際には特異メソッドである
ansibleで適用するファイルの文字列にバリデーションチェックをかける

# 1. 概要
ansibleでnginxのconfファイルをサーバに配置する際、
ファイルの中身にバリデーションチェックをかけて、
引っかかった場合に処理を止める方法をお伝えします。

## 問題
nginxでIPアドレスによってアクセス制御をかけたいことがありましたが、
必ず許容しなければならないIPアドレスもあり、間違って設定してしまう恐れがありました。

# 解決方法
ファイル適用前に、文字列でバリデーションチェックをかけました。
成功した場合、confファイルを配置し、
失敗した場合、処理を止めるようymlファイルを修正しました。

# 2. 詳細

## ソース
```
- hosts: server1,server2
  become: yes

    - name: Apply file
      copy: src=file.conf dest=/etc/nginx/conf.d/ owner=nginx group=nginx

    - systemd: name=nginx state=reloaded

```
このままだと、file.confに書いてある内容がそのまま反映され、リロードされてしまいます。

## 修正箇所
failed_whenを使用し、バリデーションタスクを追加しました。

```
- hosts: server1,server2
  become: yes

  vars:
    contents: "{{ lookup('file', 'file.conf') }}"

  tasks:
    - name: Validate file.conf
      debug: msg="value of {{ contents }}"
      failed_when: ('123\\.456\\.789\\.000' in contents) or
                   ('123\\.456\\.789\\.001' in contents) or
                   ('123\\.456\\.789\\.002' in contents)

    - name: Apply blacklist
      copy: src=file.conf dest=/etc/nginx/conf.d/ owner=nginx group=nginx

    - systemd: name=nginx state=reloaded

```

confファイルの中身がエスケープ文字なので、さらにエスケープを重ねなければなりません。

# 3. まとめ
ファイルの中身の文字列についてバリデーションをかけたいときは
ファイルを変数に格納し、in contents、failed_whenを使用すれば可能となります。
ルートラボでルートを引いてGoogle Earthで動画を作成する




# 前編


以下ページで動画を作成したいルートをルートラボで作成し、TCXファイルを作成する方法を説明します。

## [ルートラボ > ルートラボでルートを引く](https://qiita.com/sugasaki/items/25aa510f8a9d8d09db5c)

以下でルートをルートラボで作成し、TCXファイルを作成する方法

<a href='https://qiita.com/sugasaki/items/25aa510f8a9d8d09db5c'>

[ルートラボでルートを引く](https://qiita.com/sugasaki/items/25aa510f8a9d8d09db5c)

<img src='https://qiita-image-store.s3.amazonaws.com/0/49910/733a5bd2-bfa2-9c07-1046-38c31ae3300d.gif'>


</a>

# 後編


## [Googl Earthでルート動画を作成する。](https://qiita.com/sugasaki/items/f99d8b87113c8729e0d6)

作成したTCXファイルから動画を作成する方法を説明します。

[Googl Earthでルート動画を作成する。](https://qiita.com/sugasaki/items/f99d8b87113c8729e0d6)


<a href='https://qiita.com/sugasaki/items/f99d8b87113c8729e0d6'>
<img src='https://qiita-image-store.s3.amazonaws.com/0/49910/3cdef1df-3a80-2144-b14f-b02ad7af9144.png' width=500px>


<img src='https://qiita-image-store.s3.amazonaws.com/0/49910/d9e3b8c0-c1e6-1b06-947a-8fb419285970.png' width=500px>

</a>
Windows 環境 の Headless Chrome でスクリーンショットを撮るときのコツ

# 結論
- コマンドプロンプトは管理者権限で起動すること。
- screenshot.png はバージョン名が名前のフォルダに出力される。
- バッチ処理などで使いたい場合は Chromium 入れた方が楽かも。

# 経緯
手元の Chrome に起動オプション付ければ動くのか！と思ってやってみた。

```bat
> chrome --headless --disable-gpu --screenshot https://google.com/
```

が、出力されなかった。これを調べる過程で上の結論に至る。
権限については普通に入れた Chrome だと出力先が `C:\Program Files (x86)\` 配下になるため。
細かい出力先については、Windows で普通に導入する Chrome はバージョン名のフォルダ
（例えば`C:\Program Files (x86)\Google\Chrome\Application\63.0.3239.132`など）に
screenshot.pngが出力されるが、
Linux 環境では実行ファイルと同じ階層に出力され、
Windows 環境でも Chromium 入れると実行ファイルと同じ階層に出力される。
許されるなら Chromium 入れるとかした方が良いと思います。

# 参考
http://www.cyokodog.net/blog/headless-chrome/
https://beadored.com/chromium-download-update/
Pythonですべての変数を保存するにはPickleよりdillが便利

Pythonでデータ解析などをしていると、途中でいままで行った処理の結果を保存しておきたい場合が多々あります。そういったときに考えられる手段としては、numpyやpandasであればcsvに書き出す、その他の変数であればPickleで書き出すといったものがあります。

しかし、一部の変数であればそれでもよいかもしれませんが、とりあえず全部保存したい、となると面倒です。そんなときには[dill](https://github.com/uqfoundation/dill)というライブラリが便利です。dillは今どき珍しくドキュメントがなく、レポジトリのREADMEを読むと、詳しい使い方はテストコードを読んでね、という非常にユーザーに優しくないライブラリであるため、dillの便利な使い方を以下に示しておきます。

まず、何らかの変数を作って、適当な処理をするとします。

```python
orders = {'Akagai':1, 'Hirame':2, 'Hamburg steak':2}
prices = {'Akagai':200, 'Hirame':300, 'Hamburg steak':100}
bill = 0
for item, num in orders.items():
  bill += prices[item] * num
```

ここでこれまでに作った変数を全て保存したいときには、以下のようにします。

```python
import dill
dill.dump_session('session.pkl')
```

この続きからまた処理をしたいときには、次のように`session.pkl`をロードをすれば、先ほど作った変数がまたすべて使えます。

```python
import dill
dill.load_session('session.pkl')
n_person = 5
bill_per_person = bill / n_person
```
Django で作成したページを uwsgi を使って Nginx で表示

こちらで作成したものを Nginx で表示するようにする方法です。
[Django で作成したページを uwsgi で表示する](https://qiita.com/ekzemplaro/items/ce22b57d5ba00fdc90ab)
hello という app を追加しました。
[Django で Hello World](https://qiita.com/ekzemplaro/items/ef63edfa93caaab4071e)

uwsgi で使う mysite.ini を次のように変更します。

```text:mysite.ini
[uwsgi]
# http = 0:3031
socket = 0:3031
chdir = /home/uchida/tmp/jan13/ex01/mysite
wsgi-file = mysite/wsgi.py
processes = 4
threads = 2
master = 1
stats = 127.0.0.1:9191
```

uwsgi を起動します。

```bash
uwsgi --plugin http,python mysite.ini
```

Nginx の設定ファイルを修正します。
/etc/nginx/nginx.conf

```text
        location / {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:3031;
                }
```

Nginx のパラメーターが正しいか確認

```bash
sudo nginx -t
```

Nginx を再起動

```bash
sudo systemctl restart nginx
```

ブラウザーでアクセス
![django_jan1303.png](https://qiita-image-store.s3.amazonaws.com/0/179446/5540e1c7-6896-2b59-ce14-7d8642f1172a.png)

app のコード

```py:hello/views.py
#
from django.http import HttpResponse


def index(request):
    str_out = ""
    str_out += "<H2>Hello World!</H2>"
    str_out += "<blockquote>"
    str_out += "こんにちは<p />"
    str_out += "日がくれてきました。<p />"
    str_out += "テスト<p />"
    str_out += "Jan/13/2018 PM 16:37<p />"
    str_out += "</blockquote>"
#
    return HttpResponse(str_out)
```

uWSGI の起動を　systemd を使うには次のようにします。
>AWS の Ubuntu 18.04 での方法です。
>WorkingDirectory は mysite.ini のある場所です。

```text:/etc/systemd/system/mysite.service
[Unit]
Description=uWSGI instance to serve myproject
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/tmp/mysite
ExecStart=/usr/bin/uwsgi --plugin http,python3 --ini mysite.ini

[Install]
WantedBy=multi-user.target
```

サービスの起動

```bash
sudo systemctl start mysite
```
Swift+MetalでEmitter

# Swift+MetalでEmitter
Swift+Metalでエミッター（粒子放出器）のサンプルです。
某ガンダムのGNドライブ風です。
炎や煙も同じ仕組みで再現できます。
完成形↓
![IMG_5738.PNG](https://qiita-image-store.s3.amazonaws.com/0/214313/457835b2-ceee-3f1c-1331-b08e40a85628.png)


## 表現するコツ
1.アルファブレンディングを有効にする。
2.depth stencilへの書き込みを禁止する。
3. Metalのpointを使って描画する。

## コード
### 1. アルファブレンディング
半透明（透明）を有効にするにはアルファブレンディングを有効にします。
結果色 = sourceBlendFactor * 描画色 (BlendOperation) destinationAlphaBlendFactor * 元々の色
今回は単純な加算合成に設定します。

```swift:MetalEzRender.swift
        renderPipelineDescriptor.colorAttachments[0].isBlendingEnabled = true
        renderPipelineDescriptor.colorAttachments[0].rgbBlendOperation = .add
        renderPipelineDescriptor.colorAttachments[0].alphaBlendOperation = .add
        renderPipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .one
        renderPipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .one
        renderPipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .one
        renderPipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .one
```

### 2.depth stencilへの書き込みを禁止する。
通常、depth stencilへ書き込みをします。
しかし、エフェクトを表示するときは書き込みを禁止した方が都合がいいです。
書き込みをした場合と、禁止した場合の結果は以下の通りです。
書き込みした場合↓
![IMG_5738.PNG](https://qiita-image-store.s3.amazonaws.com/0/214313/72d7e748-1d7c-8e91-c3de-9490743d30e0.png)

書き込みを禁止した場合↓
![IMG_5737.PNG](https://qiita-image-store.s3.amazonaws.com/0/214313/1454766a-d073-275c-cad0-8e4456c5d83b.png)


書き込みをした場合は、後ろのオブジェクトが表示されないため、透明色でも後ろにオブジェクトが描画されません。
しかし、depth stencilは深度情報に書き込まないため、遠いモノから描画する必要があります。

```swift:MetalEz.swift
        //depth stencilに書き込むとき
        let depthDescriptor = MTLDepthStencilDescriptor()
        depthDescriptor.depthCompareFunction = .less
        depthDescriptor.isDepthWriteEnabled = true
        depthStencilState = device.makeDepthStencilState(descriptor: depthDescriptor)

        //depth stencilに書き込まないとき
        let depthDescriptorForBlending = MTLDepthStencilDescriptor()
        depthDescriptorForBlending.depthCompareFunction = .less
        depthDescriptorForBlending.isDepthWriteEnabled = false
        depthStencilStateForBlending = device.makeDepthStencilState(descriptor: depthDescriptorForBlending)
```

### 3. Metalのpointを使って描画する。
OpenGLの場合は正方形を描画するために三角形が2枚必要でしたが、Metalはpointを使うことで、正方形が描画できるみたいです。
データ削減になっていいですね。

```swift:MetalEzRender.swift
    func draw(vaertex: MTLBuffer, frameUniformBuffer: MTLBuffer, texure: MTLTexture, count: Int) {
        mtlEz.mtlRenderCommandEncoder.setVertexBuffer(vaertex, offset: 0, index: 0)
        mtlEz.mtlRenderCommandEncoder.setVertexBuffer(frameUniformBuffer, offset: 0, index: 1)
        mtlEz.mtlRenderCommandEncoder.setFragmentTexture(texure, index: 0)
        mtlEz.mtlRenderCommandEncoder.drawPrimitives(type: .point, vertexStart: 0, vertexCount: count, instanceCount: 1)
    }
```
Java REPLを使ってみた

Javaのコードを動かすにはざっくりと以下の工程が必要でした。

- JDKを入れる
- エディタでコード書く
- `Javac`コマンドでコンパイル
- エラーがなければ実行

という感じですね。eclipseのようなIDEでもいいですが、ダウンロードやインストールに結構時間がかかってしまいます。

「ちょっとこのコードを試したいだけなんだ!!!」という時にはかなり面倒くさいです。

そこで役に立つのがコレ！[Java REPL](http://www.javarepl.com/term.html)です！

リンクで飛ぶと下のようなページに行きます
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/185028/6a89faeb-0ad5-7440-3b40-29a729b0d243.jpeg)
はい！あとはJavaのコードを打ち込むだけです。因みに使用されているJavaのパージョンは `1.8.0_111` です。


![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/185028/4bd60115-20d0-4c19-f3c6-4b87495c59a3.jpeg)
試しに文字表示させてみました。因みに `Sys`と打った後にTabキーで予測変換しています。

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/185028/ad30dc37-441e-f307-ed18-f303026a753b.jpeg)
map使ってみたけど特に問題はなさそうでした。


自分は、Java SE8 Goldの勉強中によくJava REPLを使用しています。
みなさんも使ってみて下さい！
intra-mart実践入門の作成記録 #004 VSTSでCI

# 最終成果物を常に手元に
## 手を動かす前に
　見出しにあるように、執筆している最中でも どのような最終成果物になるのかは こまめに確認しておきたいものです。物理的実体をともなうモノであれば難しいことですが、電子書籍は物理的実体をともなわずに済むタイプの最終成果物です。その特徴を活かすために、ソフトウェア開発で身に着けた技術は大いに活用しましょう。ビルドパイプラインは次の流れで大丈夫なはずです。

1. バージョン管理システムに対する変更の反映がトリガーとなる
2. 最新バージョンの原稿を取得する
3. [Re:VIEW](http://reviewml.org)のビルドを行う
4. 成果物をアクセス可能な場所に配備する

　1.については「[VSTS](https://www.visualstudio.com/ja/team-services/)のGitブランチへのプッシュ」が該当します。さすがに説明不要でしょう。2.については「ビルドマシンからプル」が該当します。これも説明不要でしょう。3.については「[Re:VIEW](http://reviewml.org)コマンドの実行」が該当します。ここで注意すべきはビルド環境を[Re:VIEW](http://reviewml.org)の実行可能な状態に設定しておくことです。[VSTS](https://www.visualstudio.com/ja/team-services/)で[hosted agent](https://docs.microsoft.com/en-us/vsts/build-release/concepts/agents/hosted)を使用した場合、間違いなく[Re:VIEW](http://reviewml.org)のビルドはできないため後述の工夫を行う必要があります。4.については「成果物を特定のファイルストレージにコピー」が該当します。[VSTS](https://www.visualstudio.com/ja/team-services/)の場合は[artifacts](https://docs.microsoft.com/en-us/vsts/build-release/concepts/definitions/build/artifacts)が該当します。[VSTS](https://www.visualstudio.com/ja/team-services/)に管理させる、自前のファイルサーバーに配置する等の選択肢があります。

## ビルドマシンでRe:VIEWを実行するために
　アイディアとしては二つ考えられます。ローカル環境でビルドする方法と[VSTS](https://www.visualstudio.com/ja/team-services/)が用意している環境でビルドする方法です。

### ローカル環境でビルドする
　[Microsoft/vsts-agent](https://github.com/Microsoft/vsts-agent/blob/master/docs/start/envlinux.md)を使用して、ローカル環境から[VSTS](https://www.visualstudio.com/ja/team-services/)の原稿を取得し、ローカル環境で[Re:VIEW](http://reviewml.org)のビルドを行うというのが第一案です。この案の特徴は以下の通りです。

* [Re:VIEW](http://reviewml.org)セットアップ済の状態からビルドを行うため、実行時間が短縮される。
* ローカル環境を使ってビルドを行うので、[VSTS](https://www.visualstudio.com/ja/team-services/)の課金枠をあまり意識しなくてもよい。
* ビルド環境を統一しておかないと環境依存の問題が発生し、同じビルド結果が得られない場合がある。
* 執筆中は常にビルド環境を動かしておく必要がある。

### [VSTS](https://www.visualstudio.com/ja/team-services/)が用意している環境でビルドする
　[VSTS](https://www.visualstudio.com/ja/team-services/)で[hosted agent](https://docs.microsoft.com/en-us/vsts/build-release/concepts/agents/hosted)を使用した場合、その環境に[Re:VIEW](http://reviewml.org)のセットアップを行う必要があります。[前々回の記事](https://qiita.com/hiroaki-kushida/items/333ac73b279646bb95e5)でセットアップ時間が約30分とあったように、CIのたびに時間をかけて[Re:VIEW](http://reviewml.org)のセットアップを行うのは現実的ではありません。この場合、必然的に[Re:VIEW](http://reviewml.org)のセットアップ済のコンテナイメージを使ってビルドを行うことになります。この案の特徴は以下の通りです。

* [Re:VIEW](http://reviewml.org)を含むコンテナイメージの取得から行うため、ビルド時間が長くなる。
* [VSTS](https://www.visualstudio.com/ja/team-services/)の課金枠を意識する必要がある。
* コンテナイメージを使うため常に同じビルド結果が得られる。
* ビルド環境のON/OFFを意識する必要がない。
* 適切なコンテナイメージを構築 or 取得する必要がある。

### どちらを選ぶ？
　上記の特徴を考えると、執筆者一名かつ予算不足の現状ではローカル環境でビルドするのが良さそうです。ただし、ローカル環境のセットアップを標準化する意味ではローカル環境でコンテナイメージを使用するのはありだと思います。一方、共同執筆をするのであれば[hosted agent](https://docs.microsoft.com/en-us/vsts/build-release/concepts/agents/hosted)と[Azure Container Registry](https://azure.microsoft.com/ja-jp/services/container-registry/)を使用してビルドするのが良いでしょう。
Qiitaで記事を投稿するまでに必要な事

#はじめに
2018年1月時点での情報です。

#背景
「仮にもエンジニアならアウトプットをしろ」と言われてそりゃそうだという事で、日頃お世話になっているQiitaに投稿を始めようとなりました(初投稿)。
記事投稿した事ないけど興味あるって人の参考になれば嬉しいです。

#準備
記事を投稿するのに必要な準備
##アカウント作成
Qiitaのアカウントを作ります。
ヘッダーとかに「登録する」的なボタンあると思うのでそこから

最近は色々なサービスとアカウント連携出来て楽でよいです。

##MarkDown
Qiitaの記事作成に使用する言語
ちょっとでも書き方勉強しておいた方が何かと便利だと思います(自分は苦労した)。

##規約など
Qiitaの利用規約等には目を通しておいた方がよいと思います。
投稿内容が規約に沿っているかの判断にもなりますし、記事作成にあたってのアドバイスも書いてあったりします。
https://help.qiita.com/ja/articles/qiita-community-guideline
https://help.qiita.com/ja/articles/qiita-article-guideline

#記事作成
ヘッダーの「投稿する」とか押せば記事作成画面に移ると思うので、その画面のテキストボックスにMarkDown形式で書いていきます
上から
・タイトル
・タグ
・本文
を入力するテキストボックスになっていると思います

##タイトル
そのまんま記事のタイトルです
以下のリンクにも書いてありますが、わかりやすいタイトルを心がけると良いらしいです
https://help.qiita.com/ja/articles/qiita-article-guideline

##タグ
記事に紐づけるタグ
自分はあんまり使ったことないけど、記事を探す際に便利だと思うのでつけた方がいいと思います。

##本文
記事の本文
書いていくと右側にプレビュー表示されるので、確認しながら書けて便利だと思います。

記事の冒頭で前提条件(環境とか使用言語・バージョンとか)を書いておくとわかりやすくて良いらしいです。
あとは自分の見やすかった記事参考にしたりしてわかりやすい記事を心がけたいです。

#投稿
記事が完成したら右下あたりにある「投稿」を押して投稿しましょう。

#最後に
初めての記事作成なので、見苦しい点が多々あることをご容赦ください。
昔やってたヤフーブログとか思い出して懐かしさを感じながら書けて楽しかったですね。
The Japanese translation of "A Whirlwind Tour of Python" - Index

http://nbviewer.jupyter.org/github/jakevdp/WhirlwindTourOfPython/blob/master/Index.ipynb

Pythonの駆け足の旅 

Jake VanderPlas

これらは私のオライリーのレポート「A Whirlwind Tour of Python」の前のJupyter Notebookです。一覧されている完全なnotebookは GitHub 上で利用可能です。

"A Whirlwind Tour of Python"は 既にほかの言語でプログラミングに親しみのある研究者や開発者のためのPythonの重要なコンポーネントを早く紹介するものです。

資料は特にデータサイエンスや科学的なプログラミングのためにPythonを使いたいと願う人を狙ったものであり、その範囲の中で、私のきたる著書である、"The Python Data Science Handbook"の紹介として提供します。これらのnotebooksはワシントン大学と様々なカンファレンス、ミーティング、世界中のワークショップで私がこれらの話題で取り扱ったレクチャーやワークショップに適応したもです。

# Index
Introduction
How to Run Python Code
Basic Python Syntax
Python Semantics: Variables
Python Semantics: Operators
Built-In Scalar Types
Built-In Data Structures
Control Flow Statements
Defining Functions
Errors and Exceptions
Iterators
List Comprehensions
Generators and Generator Expressions
Modules and Packages
Strings and Regular Expressions
Preview of Data Science Tools
Resources for Further Learning
Appendix: Code To Reproduce Figures

# License
この記事は "No Rights Reserved" の CC0ライセンスの元リリースされます、そしてこのように再利用、修正、組み込み、いかなる目的でのこの記事の修正についてあなたは自由です。

そうはいっても、私は（求めませんが）もしあなたがこの記事を使ったり改作したりするなら、あなたが適正な帰属や引用を含むことを頼みます。例えば

A Whirlwind Tour of Python by Jake VanderPlas (O’Reilly). Copyright 2016 O’Reilly Media, Inc., 978-1-491-96465-1

CCについてはここでもっと読んでください。
データベースのINDEXについて、どうわかりやすく伝えるか　「大漢和辞典」を例として

#データベースのINDEX理解に向けて

私自身「しっかり理解してるぜ！」と胸が張れるようなものではないですが、
ちょっとこれはいいたとえではないかと思ったので書いてみます。

**イメージをつかむための例えなので、厳密な技術的内容としては突っ込みどころがあるものです。こういうものだと過信はしないでください＆突っ込みお待ちしてます。**


#大漢和辞典とは
世界最大の漢字辞典として有名な辞典で、「本体が12巻」「索引だけで2巻」という莫大なものです。学校の図書室にあったから「うわでけえ」「なんだこの漢字」と遊びに使った思い出のある方もいるのではないかと。
今回例えに出すのにちょうどよかったのは

- データ数が適度に多い
- 索引だけで本ができるほど索引に意義と種類がある

という点でした。

#データベースのINDEXとは
「索引だよ」
「・・・お、おう」
というやり取りは結構ある気がします。

基本概念としてはその通りなのですが、ここで普通の国語辞典のあいうえお索引を思い浮かべると少し腑に落ちない気がします。
「なんかINDEXっていろんな列についてない？　でも国語辞典で索引ってそんないろいろあるっけ？」
なんて思うのは普通だと思います。（これでそんなバカはお前だけだ　とかだと悲しい）

#大漢和辞典の「索引」実例
5万字以上の収録がある大漢和辞典。もちろん索引がありまして、索引を使うと「その漢字は何巻の何ページにあるよ」と教えてくれます。
その索引、何種類かあるのですが、わかりやすいのは

- 音読み
- 訓読み
- 画数

の索引あたりでしょう。これによって例えば「音」という字なら
「音読みが『オン』の漢字」「訓読みが『おと』の漢字」「画数が9画の漢字」といった探し方が可能です。「ある辞典に対し、複数の索引がある」実例ですね

#もし大漢和辞典がデータベースだったら？
「大漢和辞典」というデータベースがあって、「漢字」というテーブルがあって、
漢字テーブルには「字」「音読み」「訓読み」「画数」「部首」「用例」・・・といった属性があることでしょう。
その上で、前項の内容からすると「音読み」「訓読み」「画数」にそれぞれINDEXが張ってある　という状態ですね。

#INDEXの威力
「なんか遅いと思ったらこのテーブルINDEX張り忘れてるじゃねえか！」
なんてこと、データベースをある程度いじった方なら経験がおありではないでしょうか。

実感がわかない方は先ほどの大漢和辞典で「索引なしである漢字を探す」と考えてみてください。
収録数5万字以上で10冊以上に分かれている。索引なしでは何巻から探せばいいのかもわからない・・・何時間かかるやら。気の遠くなる作業です。
それが何らかの索引を使えば「何巻の何ページだよ」まで絞り込めるわけです。これなら数分で済みそうですね。数百倍の時間差でしょう。
実際にデータベースでも、INDEXの有無でSELECT文にて数百倍、数千倍の処理時間差があることは珍しくありません。

#意味のない索引、INDEX
少し進んで、INDEXについて調べたりしたらきっと「INDEXはやたらめったらどこにでも張ればいいものではない」と言われていることに気づくでしょう。これはどういうことでしょうか。
INDEX、ひいては索引は「探すために使うもの」です。なので「そんな探し方しねえよ！」ってものを作っても意味がありません。

例えば先ほどの大漢和辞典。「文字の最後がハネかトメかハライか」なんて索引があったとしたらどうでしょう。
まず「とにかく最後がハライで終わる漢字を探したいんだ！」という需要はあまりなさそうです。
そしてその需要があったとして、この索引を使ったとしても、全体から3分の1程度にしか絞り込めません。「絞り込んで探しやすくする」という効果にも乏しいわけです。無駄ですね。

#INSERTでINDEXは不利？
前項と関連してもう一つ「INDEXを張ると、INSERT速度が下がる」とは何でしょうか。
INSERTは要素の追加です。大漢和辞典に新しい漢字を一つ追加するとしましょう。
もし索引が一切なかったら、字を追加すれば終わりです。簡単ですね。
ですが実際には索引があるので、

- 収録する字を追加する
- 音読みの索引に新しい文字を追加する
- 訓読みの索引に新しい文字を追加する
- 画数の索引に新しい文字を追加する

と、索引ごとに直してあげる手間がかかります。ちゃんと索引も直してあげないと「索引が正しく仕事をしてくれない」ですからね。確かにINDEXがあればあるほどINSERT時にやらないといけないことが多いですね

なのでINDEXがたくさん張ってあるほど、INSERTが不利というのは事実です。
もちろんだからINDEXは悪なのではなく「INDEXが張ってあることによるSELECTのメリット」と「INDEXが張ってあることによるINSERTのデメリット」を比べて、メリットのほうが大きければ張ればいいのです。
上記からよく一般論として、

- 「検索対象によくなるけど、INSERTが少ないようなテーブルはINDEXを張るべき」
- 「INSERT頻度が高いテーブルでは慎重に」


といったことが言われるわけですね。

#まとめ　イメージをつかむために
今回は大漢和辞典を例に出しましたが、「索引が複数種類ある本」であれば他の本や辞書でもいいかもしれません（主な材料、所要時間等で索引のあるレシピ本とか？　そんなものがあるだろうか）。
その本を思い浮かべて。「こういう項目を探すときに、索引があったら、なかったらどうなるだろう」「この本に追記をする際に、索引があったら、なかったらどうなるだろう」と考えてみてください。少しイメージが楽になるかもしれません。

拙い内容ですが、どなたかのお役に立てば幸いです。
IEでダウンロードが出来なくなる現象の解決方法

Qiitaに書くべき技術的な内容ではないけれど小一時間ハマったので。。

IEで、以下の現象が発生。
状況）
・ダウンロードができない
・試行錯誤して保存すると、.(ドット)が_(アンダーバー)になっている
・インターネット一時ファイルのフォルダがEドライブ(BFRD-DRIVE)

原因）
・BuffaloのRAMディスクユーティリティがEドライブを作り、
　そこにインターネット一時ファイルのキャッシュを置くようにしている。
・IEはキャッシュの容量が足りないと、ダウンロードが出来なくなる。

解決方法）
以下のいずれかを行う。
・RAMディスクユーティリティのキャッシュを切る
・RAMディスクユーティリティをアンインストールする
英語が苦手な人の英語リファレンスの読み方

#はじめに
世の中にはたくさんの言語、ライブラリ、フレームワークがあります。それに対応する公式HPや先駆者であるプログラマの方が記事を書いてくださっていることと思います。
それらの中には、ちゃんと日本語になっているものもありますが、なっていないものも数多く存在します。特に、最新版のヴァージョンだと余計にそうだと思います。
という訳で、プログラマとしてやっていくには英語の記事を読むことがほぼ必須です。

ずっと英語が出来なくて、卒業まで卒論と英語の単位のみを残すところで卒論の着手条件を満たさないとかで留年したような筆者が、なんとか問題にならない程度にリファレンスや記事を読めるようになった方法を記します。
ここでは、日本語訳をするのが目的ではなく、**意味を何となくでも理解するのが目的**です。

**注意**）この記事は殆どリファレンスのような辞書形式のものに向いており、流れがあるような文章、例えばチュートリアルなんかはあまり適していません。でもきっと速読の基本の一部を含んではいるので、全く意味がないということはないと思いますが...

#主語と動詞を読む
これは日本語でも言えることですが、主語と動詞が最も大切です。日本語は、主語と動詞が位置的にかけ離れており、また主語を省略することが多々あるのでピンと来ないかもしれませんが、間違いないです。
基本的にリファレンスなんかでは、最初にそのものの「役割」が書いてくれています。それ以外にも、それが「どういう動作をするものなのか」も書かれています。SVCかSVOかを認識したあと、それが受け取ったものを変換するものなのか、受け取ったところに追加するのか、どこかに追加するのか、色々あるとは思いますが、大体の動作を感じ取るのが重要です。

#周りの要素との関係を見る
それぞれ独立しているとは思いますが、実際には関係を及ぼし合っています。その関係性を使って任意の動作を組み込んでいくのがプログラミングであると私は認識しています。
何が言いたいかというと、プログラミングには周囲の要素との関係性こそが重要という話です。関数には特に仮引数や戻り値に現れていると思います。

#前置詞を読む
前置詞を見ると何が良いかというと、「周りのとの関係」、「動作の方向」、「動作出来る範囲」などが読み取れます。単語を覚えるのが苦手な人でも、前置詞はそこまで単語数が多くないのでまだ何とかなりますね。大事なのは日本語訳じゃないので、図的に前置詞を覚えるといいと思います。

#さいごに
ここでは、日本の文字に起こすのではなく、ニュアンスを感じ取るための方法を書きました。
本当はもっと複雑だと思います。しかし、慣れてくれば専門用語の内容は頭に入りやすくなります。何故なら大抵同じようなことを言っているからです。演算の仕方や重要視する部分が違うだけで、やりたい範囲自体は大抵どの言語も変わりません。きっと、「この言語のこれはあの言語でのこれだな」をどんどん増やしていけば、徐々に読みやすくなると思います。但し、効率の良い可読性のある記述は、それぞれの言語で違うので、常に努力は必要であると思いますが...

生活の中ではそうだと思いますが、日本の文字にするのが大事なのではなくて、あくまで書かれている内容を理解することこそが重要なのです。そのためには、無理に全ての単語を読む必要なんてないので、気楽に読んでみましょう。日本の文章には出来ないかもしれませんが、意味は分かるかもしれません。（プログラムコードを見てもそこそこ周りの英文の内容が分かると思いますし）
Haskell の sort と sort コマンドの結果差異

以下のようなファイルがあったとします。

```prefectures.txt
大阪府
和歌山県
高知県
愛媛県
```

これを sort コマンドで並び替えると以下のようになります。

```shell-session
$ sort prefectures.txt
大阪府
愛媛県
高知県
和歌山県
```

Haskell で並び替えるなら以下のようなプログラムになります。

```Main.hs
import Data.List (sort)
import System.Environment (getArgs)

main :: IO ()
main = do
  args <- getArgs
  contents <- readFile $ args !! 0
  mapM_ putStrLn $ sort $ lines contents
```

実行すると以下のようになります。

```shell-session
$ stack exec -- sort prefectures.txt
和歌山県
大阪府
愛媛県
高知県
```

あれ、sort コマンドと結果が違いますね。

## 結果が異なる理由

わかりません (><;/~
ご存じの方はコメントでご教示ください。

## 調べてみた

簡単のため「和歌山県」と「愛媛県」で比較してみます。

テキストは UTF-8 で保存されていて、それぞれ以下のようなバイト列です。

* 和歌山県: `e5 92 8c e6 ad 8c e5 b1 b1 e7 9c 8c 0a`
* 愛知県: `e6 84 9b e5 aa 9b e7 9c 8c 0a`

「和歌山県」の方が若いですが、sort コマンドの結果は一番下です。

Haskell の Char は UCS-4 なので Haskell の String は以下のようなバイト列になるはずです。

* 和歌山県: `00 00 54 8c 00 00 6b 4c 00 00 5c 71 00 00 77 0c 00 00 00 0a`
* 愛知県: `00 00 61 1b 00 00 5a 9b 00 00 77 0c 00 00 00 0a`

こちらも「和歌山県」の方が若く、こちらは sort 関数の結果と一致します。

sort コマンドの内部コード？に起因するのでしょうか？ sort コマンドはバイナリを与えても正常に動作しないので、単にバイト列でソートしているのではなく、何らかの文字コード変換が行われているような気がします。
Rails 5でGoogle Adsenseを表示する


Rack CorをGemにかいて`bundle i`。

```Gemfile
gem 'rack-cor'
```

そして、下記のファイルを作る。

```config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'https://googleads.g.doubleclick.net'
    resource '*',
      headers: :any,
      methods: %i(get options head)
  end
end
```

下記はただ単純にAdsenseで生成されたコードをSlimにして必要箇所に`render`しただけ。

```_ad_landing.slim
script async="async" src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"

ins.adsbygoogle data-ad-client="YOUR-AD-CLIENT" data-ad-slot="YOUR-SLOT" style="display:inline-block;width:336px;height:280px"

javascript:
  (adsbygoogle = window.adsbygoogle || []).push({});
```

何かオススメの実装方法があれば、教えていただけますと嬉しいです。
画像のhover時に透けた黒を被せるCSSと、それをmixin化してみた

# 画像のhover処理について

リンク付きの画像のhover処理ってどうしてますか？

hover用の画像を毎回作成するのは絶対に嫌ですよね？
`opacity`で透過させるのは簡単でいいですが、薄くすることしかできません。
（僕が知らないだけかもしれませんが…）
サイト全体のhover処理が、元の色より薄くするものであれば、これでいいかもしれませんが、逆に濃くするという場合もあります。

# 作成したmixin

こんなとき、画像の親クラスに対して、mixinを読むだけで対応できたらいいと思い作ってみました。
そんなに大したものではないですが、こんな感じです。

```scss
@mixin hover_black {
  
  position: relative;
  display: inline-block; //blockの方が使い勝手良ければ変更可

  &:hover {
    &:before {
      position: absolute;
      content: '';
      display: block;
      z-index: 100;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      background: rgba(0, 0, 0, 0.1);
    }
  }
  
  @content;
}
```

## 解説

解説する程のものではないですが、簡単に解説します。
見たままですが、hover時にbeforeで擬似要素を置きます。
`top`, `right`, `bottom`, `left`をそれぞれ`0`を指定することで、その要素いっぱいに広がるようにします。
これに対して、`background: rgba(0, 0, 0, 0.1);`で、hover時の色と透け感を指定しています。
ここの値を変更すれば、お好みの状態にできます。

## 使用例

``` html
<a class="link" href="">
  <img class="imgLink" src="" alt="" width="" height="" />
</a>
```

``` scss
.link {
  @include hover_black;
}
```

もし「この画像のhover処理だけ色変えたい」みたいなことあれば、`mixin`の最後に`@content;`をつけておいたので下記のように指定してください。
これで上書きができます。

``` scss
.link {
  @include hover_black {
    &:hover {
      &:before {
        background: rgba(255, 0, 0, 0.1);
      }
    }
  }
}
```
AWSでのWindows Server ディスク拡張

# ディスクがやばい。でもAWSなら大丈夫。
SQLのデータベースが肥大化し、ディスクが枯渇していたので拡張を実施。
ダウンタイム無し。さすがAWS。

## 手順
1. AWSコンソールよりEBSボリュームの拡張  
「ボリュームが Optimizing 状態になり次第、  
ファイルシステムのサイズ変更を開始できます。」ということ。  
→変更して２、３分でOS上で認識。
2. OS上でディスク拡張
画面に従いそのまま完了。

参考
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ebs-modify-volume.html
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/recognize-expanded-volume-windows.html

# 拡張サイズについて
本当は2.5TBに拡張しようと思ったけど、
該当のボリュームはMBRなので2.0TBまでしか拡張できない。

- AWSサポート回答

>該当のvol-xxxxxxxxをご利用開始時にGPTでフォーマット済みであれば、2.5TBまで拡張可能です。
MBRの場合には2TBまで拡張し直近での容量不足を回避していただいた後に、新規のGPTフォーマット済みボリュームへのコピーおよびドライブレターの変更による置き換えをご検討ください。

参考
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/volume_constraints.html#window-volumes
http://www1.ark-info-sys.co.jp/support/etc/use/gptsystemdrive.html
AndroidでPythonの実行環境を整える

# はじめに
PCを持ち歩かなくてもAndroidでPython(主にjupyter-notebook)を使えたらいいなと思い、タブレットを購入。
jupyter, numpy, pandas, matplotlib, scikit-learnあたりをインストールしてみました。
色々調べながらやった結果、一応使えるようになったのでまとめておきます。

# キーボードの設定
Androidでそのままキーボードを使おうとすると、キーボードの配列の設定が違うために、記号などがまともに打てませんでした。
その対策として、Google日本語入力を使います。
Google日本語入力はキーボードの配列情報も一緒にパッケージされているので、これを使って入力の設定をしましょう。

## 設定方法
Google公式「[外部日本語キーボードのレイアウト設定方法][google_keyboard_setting]」より
> <ol>
>   <li>Google日本語入力 のアプリをタップします。</li>
>   <li><strong>[ハードウェアキーボードの設定]</strong> をタップして、<strong>[システム配列] </strong>を選択します。<br>
>     注：Android 4.0 (Ice Cream Sandwitch) をご利用の方は、設定を「日本語109A配列」にするとGoogle日本語入力をご利用時に限って日本語キーボードをご利用になれます。</li>
>   <li>ご利用の端末の<strong> [設定]</strong> から[言語と入力] をタップします。</li>
>   <li><strong>[物理キーボード]</strong> から、利用するキーボードの機種名をタップします。<br>
>     注：濃い灰色部分にはご利用中の機種名が表示されます。</li>
>   <li><strong>[キーボードレイアウトの設定] </strong>をタップします。</li>
>   <li><strong>[日本語109A配列(Google日本語入力)]</strong> をチェックします。</li>
> </ol>

[google_keyboard_setting]:https://support.google.com/ime/japanese/answer/6103261

# 本体
## Pythonのインストール
Python本体のインストールは[Termux][termux]というアプリを使って行います。
Playストアからインストールするだけで、"pkg", "apt"といったパッケージ管理システムが使えるようになります。
インストールしたら、`apt install python`で、python本体と同時にpipもインストールされます。

[termux]:https://play.google.com/store/apps/details?id=com.termux

## Pythonを使うためのライブラリのインストール
あらかじめaptでインストールしておかないといけないパッケージがあるので、インストール

```bash
apt install clang python python-dev fftw libzmq libzmq-dev freetype freetype-dev libpng libpng-dev pkg-config
```

## pipのライブラリのインストール
以下のコマンドでインストール

```bash
LDFLAGS=" -lm -lcompiler_rt" pip install numpy matplotlib pandas jupyter
```

numpyのインストールでエラーになってしまう場合、別の方法を試してみる。

## numpyをインストール
自分の環境では、pipからnumpyをインストールできなかったので、its-pointlessというaptの拡張っぽいやつからインストールするという方法を取りました。
まず、wgetをインストールする。

```bash
apt install wget
```
次に、its-pointlessをダウンロード＆インストール

```bash
wget https://its-pointless.github.io/setup-pointless-repo.sh
bash setup-pointless-repo.sh
```

ここまでできれば、`apt install numpy`と打つだけで簡単にnumpyがインストールできるようになっているかと思います。

# 実際に使う
pythonのREPLからmatplotlibのpyplotをインポートすることができず、詰んだかと思いましたが、jupyter-notebookからは普通にインポートできました。
jupyter-notebook上で実際に使ってみたところ、ライブラリを読み込むときにかなり時間がかかったりはするものの、普通に使うことができました。
ですが、動作がもっさりしすぎているので、普段使いはしないと思います(笑)

めでたしめでたし。

# 参考サイト
[外部日本語キーボードのレイアウト設定方法 - 日本語入力 ヘルプ](https://support.google.com/ime/japanese/answer/6103261)
[Running Jupyter and the Scipy stack on Android | Leonardo Uieda](http://www.leouieda.com/blog/scipy-on-android.html)
[Installing Scipy The Easy Way - Termux Wiki](https://wiki.termux.com/wiki/Installing_Scipy_The_Easy_Way)
[Package Management - Termux Wiki](https://wiki.termux.com/wiki/Package_Management#its-pointless_.28live_the_dream.29)
[【Termux】Android上にPython環境を作成する - Qiita](https://qiita.com/HirotakaK/items/a9e7faf048a3bd9d1e9d)
Rubyでプライベートなコンストラクタ

# 概要
Rubyにおいて、外部から無制限にオブジェクト生成させないために、特異メソッド`new`をプライベートにする方法が知られていますが、そうすると、インスタンスメソッドからのオブジェクト生成にも、外部からと同じ制約がかかってしまいます。
これは、外部からは制約あり、インスタンスメソッドからは制約なしでオブジェクト生成したい場合の障害となります。
そこで、この障害を回避する手段はないか? と考えました。

なお、テストはruby 2.3.1p112(Windows10 WSL/Ubuntu 16.04.2 LTS)で行っています。

# 問題
以下のサンプルクラスを考えます。

```sample.rb
class Sample
  private_class_method :new
  def initialize(x)
    @x=x
  end
  def self.paramcheck(x)
    # newに渡すパラメータとして適切かをチェック
    x.even?
  end
  def self.create(x)
    return nil unless paramcheck(x)
    # パラメータが不適切な場合は nil じゃなくて例外の方がイイ?
    # raise ArgumentError.new("#{x} is invalid") unless paramcheck(x)
    new(x)
  end
end
```
これが、`new`をプライベート化することで、オブジェクト生成時のパラメータに一定の制限を設けようとする例になっています。
次のirb実行例のように、生の`new`は使えず、用意した`create`でのみ ( パラメータチェックを通した ) オブジェクト生成ができるという寸法です。

```irb
$ irb -r./sample.rb
irb(main):001:0> Sample.new(10)
NoMethodError: private method `new' called for Sample:Class
        from (irb):1
        from /usr/bin/irb:11:in `<main>'
irb(main):002:0> Sample.create(10)
=> #<Sample:0x0000000246bc00 @x=10>
```

さて、ここでこのクラスのインスタントメソッドから自クラスのオブジェクトを生成したいとします。もちろん、`self.class.create`を使えば ( 外部からのオブジェクト生成と同様 ) 生成できますが、勝手知ったる自クラスなのでそこまでしたくない、と。

```irb:上の続き
irb(main):003:0> class Sample
irb(main):004:1>   def spawn
irb(main):005:2>     self.class.new(@x*2)
irb(main):006:2>   end
irb(main):007:1> end
=> :spawn
irb(main):008:0> Sample.create(10).spawn
NoMethodError: private method `new' called for Sample:Class
        from (irb):5:in `spawn'
        from (irb):8
        from /usr/bin/irb:11:in `<main>'
```

そこで、自オブジェクトの情報を元に、新たにオブジェクトを`new`で生成する`spawn`を定義してみますが…。たとえ自クラスであっても、インスタンスメソッドからは、プライベート指定の特異メソッド`new`を呼び出すことはできません。

# 対策
そこでどうするか、なのですが、特異メソッドのアクセス制御という意味では、外部からであっても、自クラスインスタンスメソッドからであっても違いはないのだろうと考え、別のアプローチを考えました。

先ほどの`Sample`クラスを継承し、対策版の`spawn`を定義したサンプルを次に示します。

```sample2.rb
require './sample.rb'
class Sample2 < Sample
  def spawn
    obj=dup
    obj.initialize(@x*2)
    obj
  end
  protected :initialize
end
```

つまり、`new`経由での生成をあきらめ、`dup`でコピーしたオブジェクトに`initialize`をかけることで、新しくオブジェクトを作り出そうということです。
次の実行例のように、`new`/`create`の特性は以前のサンプルそのままに、インスタンスメソッド`spawn`から`create`を経由しないオブジェクト生成ができました。

```irb:対策版実行
$ irb -r./sample2.rb
irb(main):001:0> Sample2.new(10)
NoMethodError: private method `new' called for Sample2:Class
        from (irb):1
        from /usr/bin/irb:11:in `<main>'
irb(main):002:0> Sample2.create(10)
=> #<Sample2:0x000000009441e8 @x=10>
irb(main):003:0> Sample2.create(10).spawn
=> #<Sample2:0x00000000941bf0 @x=20>
```

さて、この対策での注意点ですが、それは`initialize`をprotected指定しておくことです。デフォルトのprivateのままだと、`dup`したオブジェクトから`initialize`が呼べません。
なお、protectedであれば、外部から ( `spawn`でやってるのと同じように ) `dup`したオブジェクトから`initialize`を呼ぼうとしても、失敗に終わります。
これで内外の差別化ができている、という主張です。

```irb:外部からのinitialize
irb(main):004:0> Sample2.create(10).dup.initialize(20)
NoMethodError: protected method `initialize' called for #<Sample2:0x00000000b38a30 @x=10>
Did you mean?  initialize_dup
        from (irb):5
        from /usr/bin/irb:11:in `<main>'
```

# 終わりに
`new`をプライベート化する話は色々見つかるのですが、このような使い分けを考える例がとんと検索に引っかからなかったため記事にしてみました。
ただ、私はRubyに詳しくないので、これがベストなのかは良く分かっていません。もっとちゃんとした手段があるとか、そもそも設計的に…とか、ご指摘は是非よろしくお願いします。
Pythonでニューラルネット（AutoEncoderで「要約/次元圧縮」してみる）その２


[前回記事](https://qiita.com/santarou6/items/dc6ac41c51cc087c298e)
を、若干、修正する。

私が思うに、
AutoEncoderの醍醐味は、「隠れ層に無理させてみる」こと。

前回は、00000001,00000010,・・・,10000000という、
「８パターン」を学習させ、
隠れ層として、000,001,010,011,・・・,111という表現を学習できたが、
「８パターン」が「2の３乗個」で、
「表現」出来るのは「当たり前」である。

８パターンより多くの学習をさせたとき、どういう表現(representation)を獲得するかに、面白みが出て来る。

（ちなみに、もちろん、ニューラルネットの各層各ノードの重み付けは
　実際にはゼロイチの２値ではない。
　数値の大小によるパターン出し分けという表現を得るのも「普通」。）

●実験その１　（パターンに無関係な　ノイズを混ぜてみる）

５列目（全て１）と６列目（全て０）が、
パターンに無関係な要素（学習上は無視できるもの）

```
[input]   　　　　[hidden]       [output]
0000100001- 0.7 0.5 0.0  - 0000100001 + 
0000100010- 1.0 1.0 0.6  - 0000100010 + 
0000100100- 0.5 0.0 1.0  - 0000100100 + 
0000101000- 0.0 1.0 0.0  - 0000101000 + 
0001100000- 1.0 0.1 0.6  - 0001100000 + 
0010100000- 0.4 0.0 0.2  - 0010100000 + 
0100100000- 0.0 0.3 0.6  - 0100100000 + 
1000100000- 0.2 1.0 1.0  - 1000100000 + 
```

四捨五入すると、だいたい二進法（000,001,010,011,・・・,111）通りで、
８パターンを出し分け。順当。

●実験その２　（１０パターンを試す）

```
[input]   　　　　[hidden]       [output]
0000000001- 0.6 0.5 0.0  - 0000000001 + 
0000000010- 0.3 1.0 1.0  - 0000000010 + 
0000000100- 0.3 1.0 0.2  - 0000000100 + 
0000001000- 0.4 0.0 0.3  - 0000001000 + 
0000010000- 0.0 0.4 0.2  - 0000010000 + 
0000100000- 1.0 0.2 0.4  - 0000100000 + 
0001000000- 0.4 0.0 1.0  - 0001000000 + 
0010000000- 1.0 0.4 1.0  - 0010000000 + 
0100000000- 0.0 0.4 0.8  - 0100000000 + 
1000000000- 1.0 1.0 0.3  - 1000000000 + 
```
難なく、クリアー。


●実験その３（8パターンを、隠れ層２つで学習させてみる）

```
[input]  　[hidden]   [output]
00000001- 0.6 0.0  - 00000001 + 
00000010- 0.0 0.3  - 00000010 + 
00000100- 1.0 0.7  - 00000100 + 
00001000- 0.9 0.2  - 00001000 + 
00010000- 0.0 0.7  - 00010000 + 
00100000- 0.2 0.0  - 00100000 + 
01000000- 0.7 1.0  - 01000000 + 
10000000- 0.2 1.0  - 10000000 + 
```
問題なし。
twitteroauthのインストール方法

#Twitteroauthのはじめかた

1.phpの開発環境を整える
今回はローカル開発環境。
vagrantを使用し、仮想サーバーを立ち上げて環境設定。
（わからない人は、「仮想サーバー php」とか「ローカル開発環境 php」で検索）

ちなみに使用しているツールは、「putty」、「cyberduck」、「atom」

2.Composerをインストール
[公式Composerダウンロードサイト](https://getcomposer.org/download/)
以下のコードをコマンドに入力すればOK

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

ディレクトリを見ると、「composer.phar」ファイルが追加されているのが分かる。

3.Twitteroauthをインストール
[公式Twitteroauthサイト](https://twitteroauth.com/)
サイトでは以下のようにしろと書いてあるが、これではできない。

```
composer require abraham/twitteroauth
```

なので、こうする。

```
php composer.phar require abraham/twitteroauth
```

これでセットアップ完成。
ディレクトリを見ると色々入っている。
リスト内包表記とif文を組み合わせるとき

# はじめに
二番煎じかもしれないけど、よくリスト内包表記でわからなくなるのでメモ。

# リスト内包表記
Pythonではリストを作るとき、appendを呼び出さないためにfor文より実行速度が速い、リスト内包表記というものがあります。
その代わりコードの可読性を著しく損なうという副作用がありますが、ワンライナーで書きやすいので私はよく使います。

# if ... のみを使うとき
次のコードは9までの偶数のみを返すリスト内包表記です。

```py
even_list = [i for i in range(10) if i % 2 == 0]
```

普通にfor文で書くと以下のようになります。

```py
even_list = []
for i in range(10):
    if i % 2 == 0:
        even_list.append(i)
```
elseを使わないときはifをリスト内包表記の後に持ってくるのがポイント。
even_listの中身は、以下のようになります。

```py
[0, 2, 4, 6, 8]
```

このひとつの特徴としては、内包表記の最後に現れるif文によって、range(10)で10個あった数が選択され、要素数が減っています。


# if ... else ... を使うとき
次のコードは偶数のときは数字、奇数のときは "odd" を返すリスト内包表記です。

```py
even_list = [i if i % 2 == 0 else "odd" for i in range(10)]
```
for文を使った例

```py
even_list = []
for i in range(10):
    if i % 2 == 0:
        even_list.append(i)
    else:
        even_list.append("odd")
```
elseを使いたいときは、if文をリスト内包表記の一番前に書く必要があります。
even_listの中身は、以下のようになります。

```py
[0, 'odd', 2, 'odd', 4, 'odd', 6, 'odd', 8, 'odd']
```

こちらは、else文があることによって、if文の条件に合致しなかった場合でも値が返ってくるので、要素数は減っていません。

## 補足
これはPythonの三項演算子（Pythonでは正しくは条件式と呼ぶみたいです）とを使っていて、

```py
"even" if True else "odd"
```
のときに "even" が返ってくるのと同じ。
それをリスト内包表記のforの中で使っているだけです。

# まとめ
else の有無|位置|構文|要素数
---|---|---|---
if ... のみを使うとき|ifは***後ろ***|[ ... for ... in ... if ... ]|ifの条件に合致しないと要素が減る
if ... else ... を使うとき|ifは***前***|[ ... if ... else ... for ... in ... ]|要素数は減らない

---
... if ... else ... を三項演算子と呼ばないことや要素数関係の話は@shiracamus さんにご指摘頂きました。
それを基に加筆修正してあります。
いつもコメントありがとうございます。
Pythonのargparseの中身を自動で取得して可視化する

（19/9/6 追記）
vars()を利用すると、もっとスッキリ記述できるとアドバイスいただきました。詳細はコメントを見てください。

Pythonを実行するときにコマンドラインオプションを使っていろいろしたい時はargparseを使っている。しかし、argparseで生成されたオブジェクトに入っている値を確認する用のオレオレprint文を毎回作成するのは面倒である。
そこで、自動でargparseの中身を取得して表示する`argsPrint`を作成した。parse_args()で生成したオブジェクトをとりあえず`argsPrint`に突っ込むだけで勝手に表示してくれる。
（追記）使用例としては、`argsPrint`をfunc.pyなど適当なファイルに記述し、使用したいプログラム（main.pyなど）と同じ階層に置いたりして使用する。

# 動作環境

- Ubuntu 16.04
- Python 3.5.2

# 実装例

```python:func.py
def argsPrint(p, bar=30):
    """
    argparseの parse_args() で生成されたオブジェクトを入力すると、
    integersとaccumulateを自動で取得して表示する
    [in] p: parse_args()で生成されたオブジェクト
    [in] bar: 区切りのハイフンの数
    """

    print('-' * bar)
    args = [(i, getattr(p, i)) for i in dir(p) if not '_' in i[0]]
    for i, j in args:
        if isinstance(j, list):
            print('{0}[{1}]:'.format(i, len(j)))
            [print('\t{}'.format(k)) for k in j]
        else:
            print('{0}:\t{1}'.format(i, j))

    print('-' * bar)
```

例えばargparseを以下のように設定して`argsPrint`を使用してみる。

```python3:main.py
help = '画像を読み込んでデータセットを作成する'
import argparse
from func import argsPrint

def command():
    parser = argparse.ArgumentParser(description=help)
    parser.add_argument('jpeg', nargs='+',
                        help='使用する画像のパス')
    parser.add_argument('--img_size', '-s', type=int, default=32,
                        help='生成される画像サイズ（default: 32 pixel）')
    parser.add_argument('--train_per_all', '-t', type=float, default=0.85,
                        help='画像数に対する学習用画像の割合（default: 0.85）')
    return parser.parse_args()

if __name__ == '__main__':
    args = command()
    argsPrint(args)

```

# 使用例

```console
$ ./main.py FontData/font_0[0-2]*
------------------------------
img_size:	32
jpeg[3]:
	FontData/font_00.bmp
	FontData/font_01.bmp
	FontData/font_02.bmp
train_per_all:	0.85
------------------------------

```

以上。
gdrive でCLIからGoogle drive をいじって詰まったところ

# gdrive とは
Go製の、CLI用Google Driveユーティリティ。
githubで調べると色々なレポジトリがあるが、今回話すのは [prasmussen/gdrive](https://github.com/prasmussen/gdrive)のこれ。

# Install
Macユーザーなら、homebrewでインストールできる。 `$brew install gdrive`
MacPortsは書いてない。
他のOSではREADMEにあるリンクからダウンロードできるコンパイル済みの本体を落とすか、自分でコンパイルす必要がある。
認証とかの話はREADMEに書いてあるので省略

# 詰まったことlist

* `gdrive share revoke`時の、permissionID
2. 


# `gdrive share revoke`時の、permissionID

`gdrive share list <fileID>` をしたとき、

```shell-session:
$ gdrive share list <fileID>
Id                     Type   Role    Email                     Domain   Discoverable
472132980024432795117   user   owner   <email>           False
135298570184718520032   group  reader  <group_email>     False
```
と出てきたところの、IDの部分、つまりこれだと`472132980024432795117`もしくは`135298570184718520032`がpermisionIDとなる。（数字は完全ランダムに書きました）
権限をなくしたい方のIDを入力する。

`testfile.txt`というファイルをグループで共有しており、その共有をやめたい場合は

```shell-session
$ gdrive list  # 目的のファイルのIDを取得
Id                                  Name                      Type   Size      Created
139TypcCtLpwpiNFRJP_2-NwTWKRWNTOZ   test.txt                  bin    9.0 B     2018-01-09 09:51:00
1ldRITGgeotvG9jifwejGHFIOhfaFHAuM   testfile.txt                  bin    9.0 B     2018-01-09 19:05:16
1AT8uZOoHuOwaeifo0-aoAMUR8Gkfeiac   testdir                   dir              2018-01-09 19:05:15
$ gdrive share list 1ldRITGgeotvG9jifwejGHFIOhfaFHAuM #目的のファイルの共有リストを表示
Id                     Type   Role    Email                     Domain   Discoverable
124233209980831022507   user   owner   email@example.com            False
917240717275716204701   group  reader  group@example.com            False
$ gdrive share revoke 1ldRITGgeotvG9jifwejGHFIOhfaFHAuM 917240717275716204701 #ファイルIDとpermissionIDを指定する
Permission revoked
$ gdrive share list 1ldRITGgeotvG9jifwejGHFIOhfaFHAuM #確認すると、グループの欄が消えてるはず
Id                     Type   Role    Email                     Domain   Discoverable
124233209980831022507   user   owner   email@example.com            False
```
【マメ知識】ラズパイ+ロジクールC270+fswebcamで写真撮影をする場合のエラー対策

ラズパイ + ロジクールC270 はラズパイで安価に写真撮影をするのに最適な組み合わせなのですが、デバイスドライバに問題があるのか、二度目以降の撮影に失敗することがあります。
その場合の対応方法のメモ書き。

以下のようなシェルを ~/bin/fswebcam.shとして作って、fswebcamの代わりにこちらを呼び出して使うようにします。
あちこちにwaitが入っているので、単体のコマンド起動と比較して時間はかかりますが、手元の環境で撮影エラーは起きないようになりました。

動作確認は
* Raspberry Pi 3 MODEL B
* RASPBIAN STRETCH WITH DESKTOP 2017-11-29
* ロジクール HD Webcam C270
の組み合わせで行っています。


```
#!/bin/bash

# 本来のコマンド読み出し
fswebcam $*
sleep 3

# ダミーでもう一度呼びます。おそらく結果はエラーになるはず
fswebcam /dev/null

rc=1
while [ $rc -eq 1 ]
do
  sleep 3
  # このコマンドを呼び出すと、いろいろとステータスが変わりつつ正常な状態になってきます
  # 異常なときは rc=1
  # rc=255になると、正常に写真撮影が可能な状態のようです。
  v4l2-ctl --all >/dev/null 
  rc=$?
done
```

関連リンク [【マメ知識】ラズパイに接続したロジクールC270で録音をする](https://qiita.com/makaishi2/items/1cdc1e36e10caad56637)
ScottyでSPAをS3+Cloudfrontに簡単デプロイ

Netlify、 Surge、 Firebase HostingなどなどSPAをデプロイするためのホスティング・サービスはたくさんありますが、要件によってはAWSのスタックでS3+Cloudfrontを使ったシングル・ページ・アプリケーションの運用が必要になることもありますよね。

とはいえこのスタックだと、デプロイに必要なツールは揃っていないので、AWS SDKとGulpやGruntなどのタスクランナーを使ったフローを自前で容易しないといけない場合が多いです。面倒くさいですね。こんなときは[Scotty](https://github.com/stojanovic/scottyjs)をつかいましょう。

<img src="https://qiita-image-store.s3.amazonaws.com/0/18973/0ee0c2ed-b1ba-c5d1-ecdd-1cdb8b6445e1.png" width="70%" />

# Scottyとは
> Deploy static websites and single page apps to AWS S3 and CloudFront with a single command

ScottyはAWS S3とCloudfrontへ静的なウェブサイトやシングル・ページ・アプリケーションをデプロイするためのツールで、それ以外の機能（たとえばロールバックやメンテナンスモードなど）はありません。



# インストール
公式ではグローバル・インストールしています。

```bash
$ npm install -g scottyjs
```
特定のプロジェクトだけで必要なのであれば、`devDependency`にしてもいいでしょう

```bash
$ npm install -D scottyjs
```

# 使い方
グローバルインストールしたのであれば、そのまま起動するだけです。

```bash
$ scotty --spa --source ./build
```
`devDependency`として追加したのであれば、package.jsonにデプロイコマンドを追加しておきましょう。

```json
{
  ...
  "scripts": {
    ...
    "deploy": "npm run build && scotty --spa --source ./build"
  }
}
```
npmが5.2以上であれば、`npx`を使って実行することもできます。

```bash
$ npx scotty --spa --source ./build
```

## オプション
Scottyは最低限デプロイに必要なオプションがいくつか用意されているので紹介します。

### `--source`
- デプロイするディレクトリを指定するためのオプションです。
- たとえばcreate-react-appの場合だと、`npm run build`で生成されるプロダクション・ビルドが`/build`以下に吐かれるので、この場合`--source ./build`のように指定します。

### `--spa`
- シングル・ページ・アプリケーションとしてデプロイするためのオプションです。
- このオプションを指定すると、エラー・ドキュメントも`index.html`として指定されます。

### `--website`
- 静的なウェブサイトとしてデプロイするためのオプションです。
- 上の`--spa`オプションの逆で、エラー・ドキュメントが`error.html`に指定されます。

### `--bucket`
- 対象となるバケットを指定します。これが指定されていないと、インタラクティブモードで実行時にバケットを選択する必要があります。

### `--region`
- 対象となるリージョンを指定します。これが指定されていない場合、上と同じくインタラクティブモードでの選択が必要になります。

### `--nocdn`
- ScottyはデフォルトでCloudfrontのディストリビューションをデプロイ後に作成します。これを無効にするオプションです。
- このデフォルトで作成されるディストリビューションだとPrice Classが`Use All Edge Location`に指定されないのがちょっと微妙です。

### `--update`
- すでにバケットが存在している状態でこのオプションを指定しないと、毎回インタラクティブモードで「すでにバケットあるけど上書きする？」と利かれることになるので、毎度デプロイのたびに更新する場合にはこのオプションをつけましょう。

# 所感
とりあえずサクッとSPAをS3+Cloudfrontな環境にデプロイするのにはわりと使いやすいツールだなという気持ちです。最初は[bapistrano](https://github.com/QubitProducts/bapistrano)というロールバックなどcapistranoと近い機能を持つフロントエンド・デプロイツールを検討していたのですが、メンテされない感があったのと、実際に使ってみると挙動が芳しくなかったのでこちらのScottyにしました。

コードベースもわりとキレイに作られているのと、仮に問題があってもPRを送りやすそうなのがGoodです:ok_hand:
初歩的な話だけど、再代入やめましょうよ

こういうエントリは山のようにあるけど、インシデントにぶち当たると再認識させられるので勇気を出して投稿。

# よくある話ですが、、、

以下のようなコードってよく見るよね。ほんと。とてもよく:fearful:

```php
$json = json_decode($json, true);
var_dump($json); //json_decodeが失敗したとき、空になる。
```

# 何が問題なの？

ってみんな知ってると思うけど・・・
`json_decode`って失敗しちゃうとnullになるのね。
そりゃデコードできなかったわけだから **当たり前** なのよ。

問題は、元の値を特定できなくなるって点にあるわけで・・・
$jsonなのに中身配列とか言うのも変数名的に？？？となるわけで・・・

とにかく、変数の再利用をしないでください、おばーちゃんとの約束よ:relaxed:

```php
$array = json_decode($json, true);

var_dump($array);//空だけど
var_dump($json);//元の値は保持したままとなる
```
JavaScriptで要ログインサイトのデータ収集サービスを作ってみる(part2)

全くのJavaScript初心者から学習してきた流れとか、方法とか色々書きます。
# 作りたい物
ログインが必要なサイトからデータを集めるサービス。

要は、某アーケード音ゲーのスコアツールを作ってみたいということです。
（他スコアツールを参考にしながら作っています。）

# やること
- ログイン状態で、任意のJavaScriptを実行→<a href='https://qiita.com/Teara/items/33dd70984b641661f77b'>part1</a>でやりました
- JavaScriptで欲しいデータのあるHTMLの収集・スコアの抽出→今回やります
- 抽出したスコアを何かしらの形式で出力しDL→part3以降で

# 欲しいデータのあるHTMLの収集
jQueryの$.ajaxを使いました。非同期のなんちゃらということで、ブラウザで他の作業しながら、裏でデータ収集をしてくれる感じになります。なんかすごい（小並感）。

```javascript:ajaxTest.js
$.ajax{    //HTMLを取得
    type: 'GET',
    url:'TargetURL'
}.then(function(html){  
    // HTML取得時の処理
},function(){
    // エラー時の処理
});
```

ただ、非同期の処理は完了の順番が保証されていないらしいので、HTMLの収集→スコアの抽出の流れで処理を行うには一工夫必要です。

## 非同期処理の順番の保証
今回はDeferredってものを使いました。上の[then]もdeferredに関連するもので、.then(成功時の関数(resolve),失敗時の関数(reject))となるイメージです。詳細は省きますが、〇〇をやって成功なら△△をやる。失敗なら××をやる、みたいな処理に出来ます。これは非同期処理の完了も待ってくれるので、使ってみるととっても使いやすくて良かったです。

Deferredについては
爆速でわかるjQuery.Deferred超入門
https://techblog.yahoo.co.jp/programming/jquery-deferred/
がわかりやすくて助かりました。

```javascript:deferredTest.js
// スコア取得用の関数
var getScore = function(HTML){
   // スコア取得処理
}

// HTML取得+スコア取得処理
var getHTML = function(){
   // ajaxを使って取得する
　 $.ajax{    //HTMLを取得
     type: 'GET',
     url:'TargetURL'
   }.then( getScore(HTML) // HTML取得時の処理
   ,function(){
      // エラー時の処理
   });
}
```
まだ二つの処理の連結ならいいですが、複数個になるとこれがないとやってられません。
今回の処理では複数ページを取得するので、並列処理（同時に複数のHTMLの取得）も行いますが、これもdeferredで意外と簡単にできます。

```javascript:deferredTest2.js
var dfrList = [];
// 複数ページのデータ取得をする
var getAllScore = function(){
	for(var i = 0; i <= LastPage; i++){// LastPageは最終ページ
　　　　// deferredTest.jsの関数を改造したもの
　　　　// 1 deferredをdfrListに入れるよう変更
       // 2 ページ数に対応(引数で何ページ目のデータを取得するか変更可)
		getHTML(i);
	}
    // returnResolveはresolveを返却し、ErrOccerはrejectを返却する関数
	return $.when.apply($,dfrList).then(returnResolve,ErrOccer);
}

```
.whenで、複数の非同期処理の終了待ちが出来ます。今回は全ページのスコア取得を行ってから次の処理を行うため、こんな感じで作ってます。

# スコア抽出
意外と長くなってきたのでまた次回以降に書きます。そんなにここ難しくないです(Deferredのほうが難しかった)
Django で作成したページを uwsgi または gunicorn で表示する

Arch Linux では次のようにインストールします。

```bash
sudo pacman -S python-django
sudo pacman -S uwsgi
sudo pacman -S uwsgi-plugin-python
sudo pacman -S gunicorn
```

使ったバージョン

```text
$ python -m django --version
4.1.9

$ uwsgi --version
2.0.21

$ gunicorn --version
gunicorn (version 20.1.0)
```


## Django でページを作成
　この例では、/home/uchida/tmp/jan13/ex01　で次の操作をしました。

```bash
django-admin startproject mysite
```

## Django のサーバーで表示

```
cd mysite
python manage.py migrate
python manage.py runserver
```

ブラウザー　で http://127.0.0.1:8000/ にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/538e2bd0-da55-886b-4908-acd2fadfc1de.png)

外部から接続できるように起動

```bash
python manage.py runserver 0.0.0.0:8000
```

## uwsgi で表示

uwsgi の用意
> chdir  = /home/uchida/tmp/jan13/ex01/mysite
>は、プロジェクトのフォルダーにして下さい。

```text:mysite.ini
[uwsgi]
http = 0:3031
chdir = /home/uchida/tmp/jan13/ex01/mysite
wsgi-file = mysite/wsgi.py
processes = 4
threads = 2
stats = 127.0.0.1:9191
```

サーバーの起動

```bash
uwsgi --plugin http,python mysite.ini
```

ブラウザー　で http://127.0.0.1:3031/ にアクセス
![django_bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/b214931d-edca-da46-1611-73ffb49e49c6.png)

外部から接続できるように起動

```bash
uwsgi --plugin http,python mysite.ini --http=0.0.0.0:8000
```

注意
>pip で uWSGI をインストールするとうまくいきません。

Ubuntu の場合は、次でインストールして下さい。

```bash
sudo apt install uwsgi-core
sudo apt install uwsgi-plugin-python3
```

>pip でインストールされているかの確認は

```bash
pip3 list | grep uWSGI
```

インストールされていた場合の削除は

```bash
pip3 uninstall uWSGI
```


Ubuntu の場合の起動方法は

```bash
uwsgi --plugin http,python3 mysite.ini
```

## gunicorn で表示

サーバーの起動

```bash
gunicorn  mysite.wsgi
```

ブラウザー　で http://127.0.0.1:8000/ にアクセス
![django_cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c4b42f37-f993-a1e8-c5af-7ab05f9799d0.png)


外部から接続できるように起動

```bash
gunicorn  mysite.wsgi -b 0.0.0.0
```

Ubuntu での Gunicorn のインストール方法

```bash
sudo apt install gunicorn
```

## 参考

ファイアウォールの状態の確認

```bash
sudo ufw status
```

ポートをあける

```bash
sudo ufw allow 8000
```
Python | Numpy > list > xの値が閾値未満の(x,y)の値を取り除いたリストを返す | link: ValueError: not enough values to unpack | 教えていただいた事項: Numpy.numpy.greater_equal()を使ったコード | Boolean indexing

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

### 処理概要

```py
xs = [0, 1, 2, 3, 4]
ys = [3, 1, 4, 1, 5]
```

- 上記のような(x,y)の組合せが与えられている
- xは昇順にソートされている
- xに対して閾値未満の(x,y)を除去した組合せを得たい
    - 例: x < 2

### code 

```py
import numpy as np

xs = [0, 1, 2, 3, 4]
ys = [3, 1, 4, 1, 5]


def remove_lessThan(xs, ys, xmin):
	xns = np.array(xs)
	yns = np.array(ys)

	minidx = -1
	for idx, (ax, ay) in enumerate(zip(xns, yns)):
		if ax < xmin:
			minidx = idx
	return xns[minidx+1:], yns[minidx+1:]

wrkx, wrky = remove_lessThan(xs, ys, xmin=2)
print(xs, ys)
print(wrkx, wrky)

```

```txt:run
$ python3 test_remove_lessThan_180113.py 
[0, 1, 2, 3, 4] [3, 1, 4, 1, 5]
[2 3 4] [4 1 5]
```

builtin関数でこういう処理はあるかもしれない。

### Error対処

`for idx, ax, ay in enumerate(zip(xns, yns)):`において「ValueError: not enough values to unpack」が発生していました。
@Sylba2050 さんの下記の記事に対処方法が書かれていました。
[Python zipとenumerateの使い方](https://qiita.com/Sylba2050/items/bdf5cf66abb398017459)

> `for i,(ai,bi) in enumerate(zip(a,b)): #zipのところを()で囲った`

情報感謝です。

### other link

- [Python | Numpy > xs, ys: np.array() に対してxsをソートする | ysもそれに合わせて並び替える](https://qiita.com/7of9/items/79b65c188dcf62a45b1d)

### 教えていただいた事項1 > Numpy Logic functions
(追記 2018/01/14)

@carnage さんの[コメント](https://qiita.com/7of9/items/3a79f13d3af2237dd447/#comment-353786ed639b4035eff0)においてNumpyの[Logic functions](https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html)である[greater_equal()](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.greater_equal.html#numpy.greater_equal)
を使ったコード例を教えていただきました。

情報感謝です。
使わせていただきます。

### 教えたいただいた事項2 > Boolean indexing
(追記 2018/01/14)

@skotaro さんの[コメント](https://qiita.com/7of9/items/3a79f13d3af2237dd447/#comment-28314627dedaaefa6594)においてBoolean indexingの使用例を教えていただきました。

情報感謝です。
使わせていただきます。