OmniAICreator/Qiita-1.07M huggingface dataset:
ラジオ伊集院光「深夜の馬鹿力」をIBM Watson Speech to Textでテキスト化してみた

## tl;dr

眠れぬ夜の友、ラジオ伊集院光「深夜の馬鹿力」を**IBM Watson Speech to Text**でテキスト化してみました。
この世に文字起こしの達人たちは存在するものの、僕の聴くラジオがすべてテキスト化されていないことを憂い、今回の試みに至りました。

<img width="726" alt="Capture d’écran 2017-07-18 à 23.57.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/75522/6a12ed10-f225-3d7d-6685-d86033298f0b.png">


## 内容

- YouTube動画のダウンロード
- 動画処理
- IBM Watson Speech to Text
- JSON整形
- 結果
- 参考

## YouTube動画のダウンロード

### 「youtube-dl」コマンドのインストール

```bash
brew install youtube-dl
```

### ダウンロード可能なファイル形式リスト取得

```bash
youtube-dl -F https://youtu.be/QxjL1ygSDNc
```

### ファイル形式を指定して動画をダウンロード

```bash
youtube-dl -f140 https://youtu.be/QxjL1ygSDNc
```

## 動画処理

### 「ffmpeg」コマンドのインストール

```
brew install ffmpeg
```

### フォーマット変換

```bash
ffmpeg -i "podcast-ep186.mp3" -vn -vn -ac 2 -ar 44100 -ab 256k -acodec wav -f wav "output.wav"
```

※Speech to Textで扱える音声フォーマット一覧
https://www.ibm.com/watson/developercloud/doc/speech-to-text/input.html#formats

### 動画分割

```
ffmpeg -i output.wav -f segment -segment_time 60 -c copy out%04d.wav
```

※音声ファイルのサイズが大きすぎるとPOST送信がタイムアウトとなり、500エラーが返ってきます。

## IBM Watson Speech to Text

```bash
curl -X POST -u $WATSON_USERNAME:$WATSON_PASSWORD\
   --header "Content-Type: audio/wav" \
   --data-binary "@${file}" \
   "https://stream.watsonplatform.net/speech-to-text/api/v1/recognize?timestamps=true&model=ja-JP_BroadbandModel"
```

## JSON整形

```bash
cat result.json | jq '.results[].alternatives[].transcript' | tr -d '"' > sorted_result.txt
```

## 結果


```tex
うん 音 を 
三 〇 ＹＡＨＯＯ 知恵袋 便利な サイト です けれども D_エー ます ので 
全て の 質問 を して いる 
せっかく の D_エート を サイト に 
D_エー 目 を 北 
そやから 耐えられる こと で エクソダス 百 十 五条 の 約 束 グローバル 送って 下さい と いう もの です 
D_エー 部長 最終 も クソ みたいな 質問 は こちら 
うーん うーん うーん なし 四年目 
そろそろ 中世 中山 さん 
お久しぶり です 
英文 費用 節約 の ため 印鑑 を 買って インド 覚え させた もの です 
飼い始めて 一カ月 ほど は いい あんばい でした 
しかし 
エサ代 が バカ に ならない 
(後略)
```
6, 7割の精度といったところでしょうか。

※詳細
https://docs.google.com/document/d/13whzacQEDK-bFeasQuaxg_J9E-D0VL7qf5YJ5vOB_qk/edit?usp=sharing

## 参考

- Watson Developper Cloud Documentation
https://www.ibm.com/watson/developercloud/doc/speech-to-text/index.html

- Watson Speech to Textをターミナルから実行してみた
http://qiita.com/waytoa/items/e63087ea9d1586bcd55f

- youtube-dl で 乃木坂 あしゅ の YouTube動画 を 好きなだけ DL する 方法
http://qiita.com/HirofumiYashima/items/2cf6292d8fbdee77d8e1

- [ffmpeg] 音声形式の変換方法まとめ
http://qiita.com/suzutsuki0220/items/43c87488b4684d3d15f6
【Eclipse】プロジェクトのオーバーラップエラー

# はじめに
Eclipseでプロジェクト作成時にデフォルトのロケーションが「C:\WorkSpace\Fuga」になっていた。
プロジェクト名を「Fuga」にするとロケーションが「C:\WorkSpace\Fuga\Fuga」になるので、デフォルト・ロケーションの使用のチェックを外して、「C:\WorkSpace\」にするが、下記エラーになってプロジェクトを作成できない。

'C:\WorkSpace\Fuga' が他プロジェクトの位置 'Fuga' にオーバーラップします。

# 調査
「Eclipse オーバーラップ」で検索すると、プロジェクトの名前を変更しろという回答です。確かに名前を変更すればインポートとか出来るようになるんですが、そのプロジェクト名でGitで管理している以上は変更したくない。

何とか解決する方法がないかと、「Eclipse overlap」と英語にして検索し stackoverflow の下記サイトがヒット。
[Eclipse import project error, overlaps workspace location - stackoverflow](https://stackoverflow.com/questions/6594084/eclipse-import-project-error-overlaps-workspace-location)

>Eclipse doesn't allow to open a project that the existing workspace is a subfolder or same folder of that project.

日本語訳：
Eclipseでは、既存のワークスペースがそのプロジェクトのサブフォルダまたは同じフォルダであるプロジェクトを開くことはできません。

# 原因
ワークスペースがいつの間にか「C:\WorkSpace\Fuga」になってしまっていた。
その為、プロジェクト名を「Fuga」にするとワークスペースとプロジェクト名が重なっていた(オーバーラップ)ってことですね。

正しいワークスペースは「C:\WorkSpace」である。

# 解決
eclipceの「ファイル」メニューの「ワークスペースの切り替え」を選択して、ワークスペースを「C:\WorkSpace」に戻すことでプロジェクトを作成することが出来た。

# 最後に
1時間以上はハマってしまった。根気よく調査、頭を切り替えて調査。
エラーの意味をちゃんと考えれば、もっと早く解決できたかも知れない。
PHPをWindows上でビルドするときの対応コンパイラバージョン

Windows上でPHPをビルドするときのVSのバージョンを探したけどなかなか見つからなかったのでメモ。

| PHP version | recommended Visual C++ version |
|---------|------------------------------------|
| PHP 5.4 | Visual C++ 9  (Visual Studio 2008) |
| PHP 5.5 | Visual C++ 11 (Visual Studio 2012) |
| PHP 5.6 | Visual C++ 11 (Visual Studio 2012) |
| PHP 7.0 | Visual C++ 14 (Visual Studio 2015) |
| PHP 7.1 | Visual C++ 14 (Visual Studio 2015) |
| PHP 7.2 | Visual C++ 15 (Visual Studio 2017) |

- https://wiki.php.net/internals/windows/compiler
- https://wiki.php.net/internals/windows/stepbystepbuild_sdk_2
AWS STSの勉強メモ

STSを利用すると、一時的なトークンを取得できる。
使用頻度が低い等でIAMアカウントを作成すること無く、IDフェデレーションで一時的にCredentialsを渡すようなことができる。
例えば、LDAP認証などのブローカーサーバーを用意し、そちらで認証に通ったユーザーに対して権限を割り当てる等。

ここでは下記の2つのSTSのAPIについて試してみた。

* AssumeRole
* GetFederationToken

# AssumeRoleについて

既存のIAMユーザーの認証情報を⽤いて、IAM Roleのtemporary security credentialsを取得するためのアクション。  
aws cliを使う例。下記の投稿がわかりやすかった。

[AWS CLIでAssumeRoleを使う小さなサンプル
](http://qiita.com/kure/items/633b1985309757faed44)

NOTE: IAMロールについて、信頼関係のJSONはPermissionのタブではなく、Trust relationshipsの方に登録する

assume-role APIを実行すると、新規にアクセスキー、シークレットアクセスキー、そしてセッショントークンが送られてくるので、これを環境変数にセットすることでその権限が使用できる。

```bash
$ export AWS_ACCESS_KEY_ID = XXXXXXXXXXXX
$ export AWS_SECRET_ACCESS_KEY= XXXXXXXXXXXX
$ export AWS_SESSION_TOKEN= XXXXXXXXXXXX
```

もし、マネジメントコンソールで利用する場合、コンソール上部の"Switch Role"メニューで設定すれば切り替えられる。

![EC2_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/45959/b4335d75-dd82-494c-b3a5-d8d2c00b22e7.png)

これをboto3でやるとこんな感じ。

```python
import boto3
from boto3.session import Session

profile = 'assume-test-user'
session = Session(profile_name=profile)

sts = session.client('sts')
result = sts.assume_role(RoleArn='arn:aws:iam::XXXXXXXXXXXX:role/assume-role-test',
                         RoleSessionName='test')
credentials = result['Credentials']
ec2_resource = boto3.resource('ec2',
                              aws_access_key_id=credentials['AccessKeyId'],
                              aws_secret_access_key=credentials['SecretAccessKey'],
                              aws_session_token=credentials['SessionToken'])

for instance in ec2_resource.instances.all():
    print(instance)

```

有効期間ついては下記。（ドキュメントより）


*一時的なセキュリティ認証情報の有効期間を指定する期間。最短は 15 分（900 秒）、最長（デフォルト）は 1 時間（3600 秒）です。一時的な認証情報を 1 時間が経過する前に無効にする場合にのみ、この値を渡す必要があります。*

# GetFederationTokenについて

認証を受けたFederatedユーザーのtemporary security credentialsを取得するためのアクション。  
下記の投稿が分かりやすかった。

[[JAWS-UG CLI] STS:#2 GetFederationToken
](http://qiita.com/shinmaruo/items/0443fe4234d89ee6d3c9)

有効期間ついては下記。（ドキュメントより）

*この API は、デフォルトの有効期限が大幅に長い（1 時間までではなく 36 時間まで）という点で AssumeRole とは異なります。より長い有効期限により、何度も新しい認証情報を取得する必要がなくなるので、AWS の呼び出しの回数を減らすことができます。*

# それぞれのAPIの違い

AssumeRoleやGetFederationTokenなどのAPIの使い分けはどうすればよいのだろうか。
下記を見ると、与える権限の範囲やクロスアカウント、MFAの利用で違いがある。

[僕はスピンサーブが打てない:Temporary-Security-Credentials-のまとめ](http://blog.i97506051502.com/entry/2016/11/23/AWSIAM%E3%81%AE%E9%9B%91%E3%81%AA%E3%81%BE%E3%81%A8%E3%82%81#Temporary-Security-Credentials-のまとめ)

また、[Identity and Access Management (IAM)](https://d0.awsstatic.com/webinars/jp/pdf/services/20160921_AWS-BlackBelt-IAM.pdf)のp.58に概要説明があるので、それを参考に。
rubyでpatch

### patch
どこかのコードで面白いpatchの当て方をしていたので備忘録がわりに残しとこうかと思います。

### 前提条件
* patchしたいクラス及びmoduleをrequireできていること

### コード
```test.rb
class Test
  def test i
    !i.nil?
  end
end
```

```test2.rb
require_relative './test'
class Test
  alias test2 test

  def test i=nil
    test2(i) || 'hello test2'
  end
end

```
```rb
require_relative './test2'
p Test.new.test
p Test.new.test 'test'
```

```:output
hello test2
true
```
testばっかりでなんやねんという感じですが、上手いことTest classを使っているところに、test2.rbを噛ませてやれば、test2.rbで定義したtest関数が実行されるわけですね。

### aliasについて蛇足の解説

```
alias 新メソッド名 旧メソッド名
```
と定義してpatchを当てたい関数を一旦別名で宣言することができる。
その後旧メソッドをオーバーライドしても新メソッドが以前の中身を保持しているため新メソッド内で旧メソッドを呼び出す事ができたりする。

alias_methodの方が色々制御できるっぽい。
後これ書いている内に色々と調査していたら結構普通の使い方らしい
http://ref.xaio.jp/ruby/classes/module/alias_method
あるディレクトリ以下の構造を、サブディレクトリを含めて複製する

dirAの中身を全て、dirBにコピーする（中にあるファイルはコピーしない）

```shell-session
$ find ./dirA/ -type d | sed 's/dirA/dirB/' | xargs mkdir
```

7/19：ご指摘いただき、内容を変更しました
Keras初級者メモ: Dropoutの効果をちょっと確認 (MNIST)

Kerasをインストールしたので、Dropoutの効果を確認してみました。
学習繰り返し数による、認識率の推移を、プロット。

![img01.png](https://qiita-image-store.s3.amazonaws.com/0/189863/d4b242d8-ba05-0762-f24a-1aaad70d22e0.png)

+ <font color="DarkRed"> Dropout無し</font>　→　学習用データ自身の認識率は100%に達しているが、テスト用データの認識率と開きがある = 過学習状態。
+ <font color="DarkBlue"> Dropout有り</font>　→　テスト用と学習用の差が小さい = 過学習が回避されている。

Dropoutなどは、Blak Magic(黒魔術)とも呼ばれているそうな。たしかに効果は確認できます。
Kerasでは、ハイパーパラメータの効果を気軽に確認しやすい気がしています。

---
####参考
+ Kerasインストール: 私の場合。Tensorflowインストール後。
> $pip3 install keras

+ Keras用MNISTサンプルコード: こちらから頂きました。
https://github.com/fchollet/keras/blob/master/examples/mnist_cnn.py

+ 過学習とDropoutについて
http://sonickun.hatenablog.com/entry/2016/07/18/191656

+ Dropout有りで、繰り返し初期に、テストの認識率がむしろ高くなる点:
学習時はドロップアウト状態で一部のノードしか使用していず、テスト時は全ノードを使用しているため、と考えられます。
GitLab-CIでAmazon ECRからpullしてbuildしてpushする

# 概要

GitLabには、DockerのRegistoryがついていますが、いろいろな大人の事情でAWS上にコンテナレジストリがあり、
そこに対してGitLab-CIでいろいろやりたい、というときの.gitlab-ci.ymlの内容です。

これで、毎回まっさらな環境でビルドが繰り返し行えるようになります。

# 前提

- ビルド環境には、gitlab-ciからDocker(Docker in Docker)を使う

試した環境

| 製品 | バージョン |
|------|-----------|
| GitLab-CE | 9.3.6 |


# 結論

こんな感じのymlになると思われる。

```yaml
build_image:
  image: gitlab/dind:latest
  services: 
    - docker:dind
  stage: release
  before_script:
    - curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
    - python get-pip.py
    - pip install awscli --ignore-installed six
    - export AWS_ACCESS_KEY_ID=$BUILD_ACCESS_KEY
    - export AWS_SECRET_ACCESS_KEY=$BUILD_SECRET_KEY
    - export AWS_DEFAULT_REGION=$AWS_ECR_REGION
    - export AWS_DEFAULT_OUTPUT=json
    - login_string=`/usr/local/bin/aws ecr get-login --no-include-email`
    - eval $login_string;
  script:
    - docker pull 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/hogehoge/barbar:2.1.0-SNAPSHOT
    - docker build -t 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/hogehoge/piyopiyo:2017.4Q ./resources
    - docker push 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/hogehoge/piyopiyo:2017.4Q
```

# 解説

## ECR用のdocker login

AzureやDockerHubでは、docker loginコマンドでユーザ名、パスワード等を渡すことでログインできますが、AWSのECRでは下記のようにしてdocker login文字列を取得する必要があります。

> aws ecr get-login --no-include-email

この内容は、Amazon ECRのレポジトリのpushコマンドのところを押してでてくるコマンドのところです。

![Amazon EC2 Container Service.png](https://qiita-image-store.s3.amazonaws.com/0/111676/4b813995-eeb9-4866-0f0c-99281236a9b3.png)

この結果を、login_stringとして格納し、evalでスクリプトとして実行することで、ログインを行います。

## そもそもawsコマンドをはどこから

そもそもawsコマンドは以下のようにインストールすることができます、とあります。
https://aws.amazon.com/jp/cli/

> pip install awscli

しかし、そもそもgitlab/dindにはpipが入ってない、というわけです。pipから入れた例が上記になります。

### docker:latestは？

imageに、gitlab/dind:latestを指定しています。

GitLab-CIのドキュメント等では、docker:latestのイメージを利用している例が多いです。

> image:docker:latest

このイメージにはcurlもpipも入っていないので、awscliを入れるのが遠くなります。なので、curlが入っていたgitlab/dind:latestを使いました。

## aws configure相当の内容

awscliでは、キー、シークレットキー、リージョン、出力形式などを`aws configure`を行うことで保存します。
これらの情報がない状態で、`aws ecr get-login`を実行しても、エラーになります。

ファイルに書いておくよりも環境変数の方がビルド時に切り替えられて便利だろうということで、環境変数で渡しています。
上記の例では、exportが続いているところです。
環境変数に設定する値は、GitLabのPipeline設定の中で変数設定をした内容です。

参考: [AWS CLI 環境変数チートシート](http://qiita.com/n-oshiro/items/4a7774ee6e1d11bb55d2)



## ログイン後について

`aws ecr get-login`のあと、docker loginが成功すれば、あとは通常のdocker pull、build、pushの要領です。
Dockerfileの場所、中に書いてる資材とのパスの関係に注意して終了です。



# 参考
- [GitLab-CI Build: how to login to ECR](https://blog.madisonhub.org/gitlab-ci-build-how-to-login-to-ecr/)
- [Building and pushing docker image from Gitlab-CI to Amazon AWS ECR](https://stackoverflow.com/questions/42931874/building-and-pushing-docker-image-from-gitlab-ci-to-amazon-aws-ecr)
JobSchedulerでJava APIを利用するジョブの実装方法

JobSchedulerはジョブの処理内容を様々な言語で実装できます。多くはshellで記載し、簡易に実装しますが、shellだと、JobSchedulerの内部APIの呼び出しが出来ない等少し凝ったことをするには不便だったりします。
そんなケースに対して、本記事では、Javaで実装する方法を紹介します。

# Javaのクラス実装

※動作確認はJobScheduler v1.11.3で実施。その他バージョンでは稼働しない可能性ありです。

以下のように
sos.spoolerパッケージ内のJob_implクラスを継承し、Javaのクラスを実装します。


```SimpleJobApiExample.java
package sample.test;
import sos.spooler.*;
 
public class SimpleJobApiExample extends Job_impl {
     
    @Override
    public boolean spooler_process() throws Exception {
        spooler_log.info("Hello world!");
        return false;
    }
}
```

利用できるパッケージ・クラスについてはドキュメント参照。
http://www.sos-berlin.com/doc/doxygen-docs/SOSJobSchedulerModel/html/index.html

# コンパイル&jarファイル作成

作成した上で、以下のようにコンパイル。

sample/test/SimpleJobApiExample.java
に対して

```
$ cd sample/test
$ javac -classpath .:/opt/sos-berlin.com/jobscheduler/scheduler/lib/sos/com.sos-berlin.jobscheduler.engine-1.11.3.jar SimpleJobApiExample.java
```

Manifest.txt作成

```
$ cd ../../
$ vim Manifest.txt
Manifest-Vwersion: 1.0
Main-Class: sample.test.SimpleJobApiExample
Class-Path: /opt/sos-berlin.com/jobscheduler/scheduler/lib/sos/*
```

jarファイル作成

```
$ jar cvfm SimpleJobApiExample.jar Manifest.txt sample/test/*.class
```

# クラスパスにjarファイル配置

上記で作成したjarファイルをJobSchedulerが認識可能なクラスパスに配置する。

JobScheduler Masterが読込先として認識しているクラスパスはfactory.iniに記載されている[java]カテゴリ内の
以下の設定。

```
[java]
class_path              = ${SCHEDULER_HOME}/lib/pgsql/*.jar:${SCHEDULER_HOME}/lib/patches/*.jar:${SCHEDULER_HOME}/lib/user_lib/*.jar:${SCHEDULER_HOME}/lib/sos/*.jar:${SCHEDULER_HOME}/lib/3rd-party/*.jar:${SCHEDULER_HOME}/lib/jdbc/*.jar:${SCHEDULER_DATA}/config:${SCHEDULER_HOME}/lib/log/log4j/*.jar
```

上記デフォルトと異なる箇所に配置したければ上記設定の変更が必要。
変更の必要なければ以下に配置するのが適切。

/opt/sos-berlin.com/jobscheduler/scheduler/lib/user_lib/配下

```
$ cp SimpleJobApiExample.jar /opt/sos-berlin.com/jobscheduler/scheduler/lib/user_lib
```

JobScheduler Masterを複数台クラスタ組んでいる場合には全Masterサーバ上のクラスパスフォルダに配置する。
※なお、Agent上で実行させるJavaクラスであればJobScheduler Agentが読み込めるクラスパス設定フォルダ上に配置する必要がある。


# ジョブ定義実装

上記の通りjarファイルを配置した状態で以下の通りジョブを実装する。

```
<job title="Simple Java API Job" order="no">
<script language="Java" java_class_path="/opt/sos-berlin.com/jobscheduler/scheduler/lib/user_lib" java_class="sample.test.SimpleJobApiExample"/>
<run_time/>
</job>
```

上記の設定により、sample.test.SimpleJobApiExampleクラスが呼び出され、
クラス内に実装されているspooler_process()等の処理が自動実行される。
JobScheduler Masterのデフォルトのクラスパスと異なるところに配置したい場合には、java_class_path設定を以下のように追記すれば良い。

```
<job title="Simple Java API Job" order="no">
<script language="Java" java_class_path="/hoge/lib/*.jar" java_class="sample.test.SimpleJobApiExample"/>
<run_time/>
</job>
```

ただし、上記のjava_class_pathは既存のJobScheduler Masterのclass_path設定に追加して探索するフォルダを指定する形となるので、
同一名称のものがJobScheduler Masterのclass_pathに配置されている場合はそちらが優先して読み込まれるので注意する必要がある。
Ruby on Railsの中でbxsliderを使う。

# スライドショーといえばbxslider
基本的なことはこの辺りのサイトを見ればわかります。
http://on-ze.com/archives/1658

GEMとか使うのかなーって思ったんですが、特別な方法は要らないようです。
普通にできました。
app/assets/javascriptにダウンロードしたjquery.bxslider.min.jsを配置。
app/assets/stylesheetにjquery.bxslider.cssを配置。
sassを使っているのなら`@import`で読み込ませる。

ただそれだけでした。

あとはbxslider.jsとでもいうファイルを作って以下の記述を入れるのみ。

```js
    $(function(){
      $('.bxslider').bxSlider({
        auto: true,
        slideWidth: 650,
        minSlides: 3
      });
    });
```
viewファイルの編集も忘れないようにしましょう。

以上です。
fish shell のプラグインの作り方

[fish shell](http://fishshell.com/) は、[oh-my-fish](https://github.com/oh-my-fish/oh-my-fish) や [fisher](https://github.com/jorgebucaran/fisher) で簡単にプラグインをインストールすることができます。

この記事では、fish shell のプラグインの作り方を説明します。

## プラグインの種類

プラグインには以下の2種類があります。

* テーマ
* プラグイン

要するに、テーマとそれ以外の機能拡張とは分けて考えるということです。

## テーマの作り方

### ファイル構成

もし oh-my-fish の環境があれば、以下のコマンドでテーマを新規作成できます（参考 : https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/en-US/Packages.md ）。

```fish
$ omf new theme my_theme
 create  fish_greeting.fish
 create  fish_prompt.fish
 create  fish_right_prompt.fish
 create  fish_title.fish
 create  LICENSE
 create  README.md
```

oh-my-fish の環境がなければ、これらのファイルを手作業で作っても問題ありません。また、これらのファイルが全て必要というわけでもありません。例えば `fish_prompt.fish` だけでも良いです。

`fish_prompt.fish` の中身は以下のようになります。

```fish
function fish_prompt
  # Customize fish prompt
end
```

### 作ったテーマの試行

fisher の場合は、作成したテーマのディレクトリ内で以下のようにすれば適用できます。

```fish
$ fisher add .
```

oh-my-fish の場合は、作成したテーマのディレクトリを `~/.local/share/omf/themes/` 内に置き、以下のコマンドで適用できます。

```fish
$ omf theme <テーマ名>
```

## テーマ以外のプラグインの作り方

もし oh-my-fish の環境があれば、以下のコマンドでプラグインを新規作成できます。

```fish
$ omf new pkg my_pkg
 create  completions/my_pkg.fish
 create  functions/my_pkg.fish
 create  init.fish
 create  LICENSE
 create  README.md
 create  uninstall.fish
```

oh-my-fish の環境がなければ、これらのファイルを手作業で作っても問題ありません。また、これらのファイルが全て必要というわけでもありません。例えば `functions/my_pkg.fish` だけでも良いです。

`functions/my_pkg.fish` の中身は以下のようになります。

```fish
function my_pkg -d "My package"
  # Package entry-point
end
```

### 作ったプラグインの試行

fisherman の場合は、作成したテーマのディレクトリ内で以下のようにすれば適用できます。

```fish
$ fisher add .
```

oh-my-fish の場合は、作成したテーマのディレクトリを `~/.local/share/omf/pkg/` 内に置き、fish を起動すれば適用できます。

## 作ったプラグインの配布

各プラグインごとに専用リポジトリをひとつ作って、GitHub などで公開しましょう。

例として、僕が作ったプラグインを挙げておきます。

* テーマ : https://github.com/usami-k/graystatus
* プラグイン : https://github.com/usami-k/gls

fisher で使えるようにするだけなら、単に公開するだけで終わりです。

oh-my-fish で使えるようにする場合は、[oh-my-fish/packages-main](https://github.com/oh-my-fish/packages-main) リポジトリの説明にしたがって packages のファイルを書き、プルリクエストを送ります。

例として、僕が送ったプルリクエストを挙げておきます。

* テーマ : https://github.com/oh-my-fish/packages-main/pull/11
* プラグイン : https://github.com/oh-my-fish/packages-main/pull/12

## 最後に

こんな感じで、特に難しくはないと思いますので、自作のプラグインを公開してみてください。
Kubernetes v1.7: Notable Features 抜粋

このエントリは Kubernetes v1.7 CHANGELOG の Notable Features のうち個人的に気になるものを抜粋しています。

- https://github.com/kubernetes/kubernetes/blob/3f0141edd52ab6fd7b6fe473ecceb480faf12079/CHANGELOG.md#notable-features

その他の項目は下記を参照してください。

- [Kubernetes v1.7: 主な変更点 (Major Themes)](http://qiita.com/tkusumi/items/817cf85917efd24c7a4f)
- [Kubernetes v1.7: Action Required Before Upgrading](https://qiita.com/superbrothers/items/e52a364a88783f85dd75)
- [Kubernetes v1.7: Deprecations](http://qiita.com/superbrothers/items/2c867c9d5087b9910a61)
- [Kubernetes v1.7: Notable Features 抜粋](http://qiita.com/tkusumi/items/0e5856ed58a1ec7bb644)

## Notable Features 抜粋

- Node の hostIP が downward API で取れるようになった
  - [Support status.hostIP in downward API #42717](https://github.com/kubernetes/kubernetes/pull/42717)
  - Pod からどうしても Node の IP アドレスが必要なときに便利です
- NodeLegacyHostIP が削除された
  - [Remove deprecated NodeLegacyHostIP #44830]
(https://github.com/kubernetes/kubernetes/pull/44830)
  - Node の `LegacyHostIP` から IPアドレスを取得している場合は使えなくなります
- Pod の /etc/hosts を設定できるようになった
  - [Adding entries to Pod /etc/hosts with HostAliases](https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/#adding-additional-entries-with-hostaliases)
- Docker の 1.13.1 以上を使っている場合は、Pod 内のコンテナは共有の PID namespace を使うようになった
  - 他のコンテナに対してシグナルが送れるようになった
  - [Enable shared PID namespace by default for docker pods #45236](https://github.com/kubernetes/kubernetes/pull/45236)
- HPA のスケールの反映時間が調整可能になった
  - [Feature/hpa upscale downscale delay configurable #42101](https://github.com/kubernetes/kubernetes/pull/42101)
- TLS Bootstrap がベータに
  - [promote tls-bootstrap to beta #46799](https://github.com/kubernetes/kubernetes/pull/46799)
- kubeadm が最新の機能に対応
  - [kubeadm: Enable the Node Authorizer/Admission plugin in v1.7 #46879](https://github.com/kubernetes/kubernetes/pull/46879)
  - [kubeadm: Make kubeadm use the right CSR approver for the right version #46864](https://github.com/kubernetes/kubernetes/pull/46864)
- Node のディスクがいっぱいになりそうなときに、不要なコンテナを削除するようになった
  - [Delete all dead containers and sandboxes when under disk pressure. #45896](https://github.com/kubernetes/kubernetes/pull/45896)
- [Node Problem Detector](https://github.com/kubernetes/node-problem-detector) の新機能
  - [Add ABRT adaptor config #105](https://github.com/kubernetes/node-problem-detector/pull/105)
  - [Add rule for docker image pull error #117](https://github.com/kubernetes/node-problem-detector/pull/117)
  - [Cleanup kmsg log watcher #112](https://github.com/kubernetes/node-problem-detector/pull/112)
- oidc クライアントのラウンドトリップが減った
  - [oidc client plugin: reduce round trips and fix scopes requested #45317](https://github.com/kubernetes/kubernetes/pull/45317)
- Deployment にハッシュ衝突を避ける仕組みが入った
  - [Hashing collision avoidance mechanism for Deployments #287](https://github.com/kubernetes/features/issues/287)
Google Cloud VisionをRubyから叩いてみる

[AWS Rekognition版](http://qiita.com/kaibadash@github/items/037a5cebc35f3925fec8)に引き続き、Cloud Vision版を。
僕のような迷えるGCP初心者のために。

# gem導入
```
bundle init
```

```ruby
# frozen_string_literal: true
source "https://rubygems.org"

gem "google-cloud-vision"
```

```
bundle install
```

# keyの準備
サービス アカウントからkeyを再作成し、ダウンロードします。既存のkeyはDLできなさそうです。
![スクリーンショット 2017-07-18 20.11.16.png](https://qiita-image-store.s3.amazonaws.com/0/21799/3d8def63-3360-6537-1198-7896c03f66f0.png)

今回は `key.json` というファイル名にして、rubyスクリプトと同じ場所に起きました。

```shell-session
export VISION_KEYFILE="./key.json"
```

環境変数でパスを指定してやります。
(注意:今回はAPIを実行することを目的にしているため、雑なことをしています。本番環境で使う場合は置き場所や読み込み方法をちゃんと考えるのがよいでしょう)

# リクエスト
`labels`をリクエストしてみます。

```ruby
# Imports the Google Cloud client library
require "google/cloud/vision"

# Your Google Cloud Platform project ID
project_id = "プロジェクトID"

# Instantiates a client
vision = Google::Cloud::Vision.new project: project_id

# The name of the image file to annotate
file_name = "./画像ファイル.jpg"

# Performs label detection on the image file
res = vision.image(file_name).labels
# res = vision.image(file_name).landmark # landmark APIはこんな感じ

puts res.inspect

res.each do |label|
  puts label.inspect
end
```

ほぼサンプルのまんまです。
簡単ですね。

# 結果
やったぜ！
1%のマニアックなお客様の需要に応えた看護師のフリー写真素材サイトの素材をお借りしました。
http://nurse-web.jp/photo/ 

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/21799/78343e9a-88a9-42e1-8ccc-0d6a7dff0472.jpeg)
↓

```
patient 0.9032019376754761
shoulder 0.8479053378105164
profession 0.8370321393013
nursing 0.8111205101013184
professional 0.8093409538269043
hospital 0.7906113266944885
health care 0.7641667127609253
service 0.7637583613395691
healthcare science 0.7570233345031738
joint 0.7511107325553894
nurse 0.6967776417732239
clinic 0.6100589036941528
product 0.5855953693389893
trunk 0.5836150050163269
health & beauty 0.5701348185539246
general practitioner 0.5610331892967224
physician 0.5485168099403381
nursing home 0.5445511341094971
health care provider 0.5364732146263123
registered nurse 0.5301538109779358
therapy 0.5099424123764038
medical 0.509649395942688
```

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/21799/f049dc03-e55d-0d50-4f44-4bb79bea8430.jpeg)
↓

```
shoulder 0.8151744604110718
service 0.7516267895698547
health care 0.7391470670700073
healthcare science 0.6632533669471741
professional 0.6384928226470947
clinic 0.6338927745819092
profession 0.6037552952766418
health & beauty 0.5690610408782959
hair coloring 0.5502387881278992
hospital 0.5419809818267822
beauty salon 0.5337088704109192
patient 0.5122528076171875
research 0.5070715546607971
```

![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/21799/bb90dbe3-9b9b-c913-cf3b-87971cc8ffb7.jpeg)
↓

```
furniture 0.8865644931793213
desk 0.8032957315444946
technology 0.7598952651023865
table 0.7279538512229919
electronics 0.7005680799484253
product design 0.6304239630699158
```
【Rails】Carrierwave で音声ファイルをアップロード&変換する

Railsの画像アップロードライブラリとして有名な [carrierwave](https://github.com/carrierwaveuploader/carrierwave) は，音声ファイルでもアップロードできる．

# 設定方法は画像と同じ

```ruby:Gemfile
gem 'carrierwave'
```

アップローダーを生成．

```
$ bundle exec rails g uploader AudioFile
```

`file` カラムにアップローダーを適用．

```ruby:app/models/audio.rb
class Audio < ApplicationRecord
  mount_uploader :file, AudioFileUploader

  validates :title, presence: true
  validates :file, presence: true
end
```

# ファイル形式を変換 (.mp3)

`.mp3` に変換したい場合は，[carrierwave-audio](https://github.com/TrevorHinesley/carrierwave-audio) が使える．

```ruby:app/uploader/audio_file_uploader.rb
class AudioFileUploader < CarrierWave::Uploader::Base
  # 追記
  include CarrierWave::Audio

  # 追記
  version :mp3 do
    process :convert => [{output_format: :mp3}]

    def full_filename(for_file)
      "#{super.chomp(File.extname(super))}.mp3"
    end
  end
end
```

```
audio = Audio.find(1)
audio.file.mp3.url # /uploads/audio/file/1/sample1.mp3
```

# ファイル形式を変換 (.wav)

上記ライブラリは `.mp3` のみ対応だったので，[forkで.wav変換を実装](https://github.com/tanakaworld/carrierwave-audio)した．

```ruby:Gemfile
gem 'carrierwave-audio', git: 'git@github.com:tanakaworld/carrierwave-audio.git'
```

```ruby:app/uploader/audio_file_uploader.rb
class AudioFileUploader < CarrierWave::Uploader::Base
  # 追記
  version :wav do
   process :convert => [{output_format: :wav}]

   def full_filename(for_file)
     "#{super.chomp(File.extname(super))}.wav"
   end
 end
end
```

```
audio = Audio.find(1)
audio.file.wav.url # /uploads/audio/file/1/sample1.wav
```
Javaによるインタプリタ実装

21の記事で順に、Javaを使ってインタプリタを実装していきます。
初めは単純な四則演算の実装し、徐々に機能を追加します。
最終的には、テキストファイルからスクリプトを読み込んで、フィボナッチ数を計算するところまで行います。

[1 単純な字句解析をJavaで実装する](http://qiita.com/quwahara/items/d7ea5d0e0dbc0409a01f)

[2 単純な構文解析をJavaで実装する](http://qiita.com/quwahara/items/9bf468ff4286b28d2a24)

[3 単純なインタプリタをJavaで実装する](http://qiita.com/quwahara/items/30e93dfd2690913d66c0)

[4 インタプリタにprintlnを追加する](http://qiita.com/quwahara/items/82067b00cbe1cb974e4a)

[5 優先順位付けの括弧に対応する](http://qiita.com/quwahara/items/b76c6e438aeb32450391)

[6 単項演算に対応する](http://qiita.com/quwahara/items/4069d47b511e4d11f44b)

[7 単純な関数定義と呼び出しを追加する](http://qiita.com/quwahara/items/be71bac4b4359f5e6727)

[8 複数の引数に対応する](http://qiita.com/quwahara/items/0bea3bad4eedd2d803cf)

[9 戻り値に対応する](http://qiita.com/quwahara/items/1db9a5b880fd36dcfd3c)

[10 if文に対応する](http://qiita.com/quwahara/items/96a68cdee4f2a0452836)

[11 比較演算子と論理演算子に対応する](http://qiita.com/quwahara/items/162d01c5af7c69cfa0ed)

[12 while文に対応する](http://qiita.com/quwahara/items/36f6704ae9c756240068)

[13 Scopeに対応する](http://qiita.com/quwahara/items/d9f932195da1b655b617)

[14 関数式に対応する](http://qiita.com/quwahara/items/ae33ed944afc34cc5fac)

[15 文字列に対応する](http://qiita.com/quwahara/items/ddcbc8c37b9d442fe0f2)

[16 メソッド呼び出しに対応する](http://qiita.com/quwahara/items/f1bddefe984c8d233e02)

[17 配列に対応する](http://qiita.com/quwahara/items/b4f821a797a146c8d873)

[18 JSON風のオブジェクト定義に対応する](http://qiita.com/quwahara/items/5e6cee17b7b03bd994ee)

[19 オブジェクト生成に対応する](http://qiita.com/quwahara/items/ced0e9e2bf487f4021f8)

[20 スタティックメソッド呼び出しに対応する](http://qiita.com/quwahara/items/a8ef47f78b1479a117de)

[21 スクリプトをファイルから読み込んで実行する](http://qiita.com/quwahara/items/bac43cd1df11b025e46a)
should.js で null や undefined をテストする

アサーションライブラリ [sholud.js](https://github.com/shouldjs/should.js) は、JavaScript の `Object` クラスを拡張して `should` プロパティを加える。これにより、次のように英語として読める表記を実現している。

```js
   var foo = {name:'abc'};
   foo.should.have.property('name', 'abc');
```


だがこれは foo が `null` や `undefined` の場合にうまく動作しない。

```js
   var foo = null;
   foo.should.null();
⇒
   TypeError: Cannot read property 'should' of null
```
同様に `undefined` の場合では `TypeError: Cannot read property 'should' of undefined` となる。

このようなケースを扱うには should を関数として使う。

```js
   var should = require('should');
   var foo = null;
   should(foo).null();
```

参考： [should API Reference覚書](http://qiita.com/_daisuke/items/a036acbc1a92a2726d95)
chai.should を使う方はこちら： [mocha + chai.should で null や undefined をテストする](http://qiita.com/minodisk/items/43a9caa2a15d6014e3da)
ElasticBeanstalkで、起動時にS3のプライベートなファイルを取ってくる


https://forums.aws.amazon.com/message.jspa?messageID=541634

を参考に

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#linux-files

を読むと良い。具体的には `.ebextensions`に新しいファイルを作って下記のような感じに設定する。また、 `aws-elasticbeanstalk-ec2-role` というロールに対して IAMで対象のファイルが読めるような権限を与えておく。

```
Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Auth:
          type: "s3"
          buckets: ["my-backet-name"]
          roleName: "aws-elasticbeanstalk-ec2-role"
files:
  "/path/to/test/test.txt" :
    mode: "000644"
    owner: root
    group: root
    authentication: "S3Auth"
    source: https://s3-ap-northeast-1.amazonaws.com/my-backet-name/test/test.txt
```
GradleとEclipseを使う場合のTips

#依存ライブラリをクラスパスに設定する
build.gradleを以下のように作成する。

```groovy
apply plugin: 'java'
apply plugin: 'eclipse'

repositories {
    mavenCentral()
}

dependencies {
    compile 'junit:junit:4.12'
}
```

追加したのは、「apply plugin: 'eclipse'」だけ
これでgradle eclipseと実行

```text
# gradle eclipse
:eclipseClasspath
:eclipseJdt
:eclipseProject
:eclipse

BUILD SUCCESSFUL

Total time: 10.332 secs
```
これで、Eclipseで参照してもコンパイエラーとなりません。
Scalaの変数について

# はじめに

下記のテキストを通して、基本的な書き方を学んでいきます。
https://dwango.github.io/scala_text/basic.html


CやPHPを使ってきた私には、`var` ・ `val` なにそれ！？って状態でしたので、どのような違いがあるか実際に試してみました。


そもそも、 `var` ・ `val` はなんの略称？ということで調べてみると
> 「val」はvalueの略で，valueとは「データや一つのオブジェクト」を指す言葉です。「var」のほうは，普通にvariable（変数）

とのことだそうで。
Source：http://itpro.nikkeibp.co.jp/article/COLUMN/20080708/310424/?rt=nocnt

## 変数について

* 試した結論
    * `var` は値の更新ができ、 `val` は値の更新ができない
    * 対象となる変数の型以外は挿入不可
    * 同名再定義は不可


### 値の更新ができるか
* var

```scala
scala> var test_var = 1 + 2
test_var: Int = 3

scala> test_var = 10
test_var: Int = 10
```
* val

```scala
scala> val test_val = 1 + 2
test_val: Int = 3

scala> test_val = 10
<console>:8: error: reassignment to val
       test_val = 10
                ^
```
### 宣言後に別の型を入れてみる
* var

```scala
scala> var test_var = 1 + 2
test_var: Int = 3

scala> test_var = "hoge"
<console>:8: error: type mismatch;
 found   : String("hoge")
 required: Int
       test_var = "hoge"
                  ^
```
* val

```scala
scala> val test_val = 1 + 2
test_val: Int = 3

scala> test_val = "hoge"
<console>:8: error: reassignment to val
       test_val = "hoge"
                ^
```
### 型宣言した上で、別の型を入れてみる
* 正常系

```scala
scala> val test_val: Int = 10
test_val: Int = 10

scala> var test_var: Int = 10
test_var: Int = 10
```
* val, varそれぞれ

```scala
scala> val test_val: Int = "hoge"
<console>:7: error: type mismatch;
 found   : String("hoge")
 required: Int
       val test_val: Int = "hoge"
                           ^

scala> var test_var: Int = "hoge"
<console>:7: error: type mismatch;
 found   : String("hoge")
 required: Int
       var test_var: Int = "hoge"
                           ^
```
### 再定義するとどうなる？
* 基本的な記述

```scala
scala> :paste
// Entering paste mode (ctrl-D to finish)

var test_var = 10
val test_val = 20

// Exiting paste mode, now interpreting.

test_var: Int = 10
test_val: Int = 20
```
* var + var

```scala
scala> :paste
// Entering paste mode (ctrl-D to finish)

var test_var = 1 + 2
var test_var = 10

// Exiting paste mode, now interpreting.

<console>:8: error: test_var  is already defined as variable test_var
       var test_var = 10
           ^
```
* val + val

```scala
scala> :paste
// Entering paste mode (ctrl-D to finish)

val test_val = 1 + 2
val test_val = 10

// Exiting paste mode, now interpreting.

<console>:8: error: test_val is already defined as value test_val
       val test_val = 10
           ^
```
* val + var

```scala
scala> :paste
// Entering paste mode (ctrl-D to finish)

val test = 1 + 2
var test = 10

// Exiting paste mode, now interpreting.

<console>:8: error: test  is already defined as value test
       var test = 10
           ^
```
* var + val

```scala
scala> :paste
// Entering paste mode (ctrl-D to finish)

var test = 1 + 2
val test = 10

// Exiting paste mode, now interpreting.

<console>:8: error: test  is already defined as variable test
       val test = 10
           ^
```
capistranoで自動デプロイ後、AWSにThe page you were looking for doesn't exist.と表示される。

デプロイでハマったのでメモです。

# The page you were looking for doesn't exist.
<img width="597" alt="スクリーンショット 2017-07-18 19.11.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/187119/87dc4f3b-ee10-abe7-aa55-5a4fe3524bb5.png">

結論からいいますと、capiを使った後はbundle exec rails s -e productionの実行は不要のようですね。自動的にサーバーが立ち上がるみたいです。

設定もきちんとしたし、何度もメンターに確認しました。
capistrano実行後のログをちゃんと読んでも、間違いはなかったです。
それでもうまくいかないで、あれこれ試していたら結論は以上でした。
不要なコマンドを実行していたと。

# ポートが使用中かどうか確認する。
ポートが使用中かどうかは、下記コマンドで確認できます。

    #terminal
    lsof -i:3000

PIDっていうのが表示されるので、以下のコマンドを実行すると殺戮できるようです。

<img width="493" alt="スクリーンショット 2017-07-18 19.29.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/187119/fd551a3c-50cb-310f-46e1-3e23a79e6df9.png">




    #terminal
    kill 1917
delayed_jobをfeature specでテストする

`ActiveJob::TestHelper`を使っている場合、`ActiveJob::Base.queue_adapter`が変わっているので、下記のように`:delayed_job`をテスト前に設定します。

そして、`Delayed::Worker.delay_jobs = false`にして、ジョブをリアルタイム実行するようにすればOKです。

さらに、`after do`で元の設定に戻してあげれば親切かもしれません。

```delayed_job_spec.rb
feature 'delayed_jobテスト' do
  background do
    ActiveJob::Base.queue_adapter = :delayed_job
    Delayed::Worker.delay_jobs = false
  end
  after do
    ActiveJob::Base.queue_adapter = queue_adapter_for_test
    Delayed::Worker.delay_jobs = true
  end

  context 'ジョブのテスト', js: true do
    feature do
      click_on 'ジョブ起動するボタン'
      # ジョブの実行結果を確認
      expect(job_result_table.success).to be_truthy
    end
  end
end
```


試したバージョン：Rails 5.0


参考：
 https://github.com/collectiveidea/delayed_job
http://api.rubyonrails.org/v5.0/classes/ActiveJob/TestHelper.html#method-i-queue_adapter
特異値分解と固有値分解が同じ結果を出していることの確認（Rのsvd、eigen関数）

ある行列A（サンプルN×変数 D）があったとして、
$A = U \Sigma V^T$ 
のように行列分解するのが、特異値分解（**SVD**）。

Aの共分散行列
$S =  \frac{1}{N-1}A^T A$
に対して、
$SV = V\Lambda$
となるような、固有ベクトル$V$を探す、すなわち、
$S = V\Lambda V^T$
のように行列分解するのが、固有値分解（**EVD**、Vは特異値分解のものと同じ）。

$S = \frac{1}{N-1}A^T A = \frac{1}{N-1}(U \Sigma V^T)^T U \Sigma V^T = \frac{1}{N-1}V \Sigma U^T U \Sigma V^T = \frac{1}{N-1}V \Sigma^2 V^T$
となることから、

SVDの特異値とEVDの固有値には以下のような関係があるはず。
$\frac{1}{N-1}\Sigma^2 = \Lambda$

というのは、数式上ではわかるが、実際にRの関数が同じ値を返すか不安だったので、確認してみた。

# 準備
まずデータを用意する。

```{R}
# 10サンプル × 15次元のデータとする
set.seed(123)
A <- matrix(runif(150), nrow=10)
A <- scale(A, scale=FALSE) # あらかじめmean-centeringはしておく
```

続いて、SVD、EVDを実行

```{R}
# SVD
res.svd <- svd(A)
# EVD
S <- t(A) %*% A / (10 - 1)
res.evd <- eigen(S)
```

# 固有値は同じか

まずは、SVDが返す特異値の自乗$\Sigma^2$と、EVDが返す固有値$\Lambda$が同じかを調べた

RではSVDはsvd関数、EVDはeigen関数があるので、これらを使った

```{R}
# SVDの特異値^2 = EVDの固有値
plot(1:10, res.svd$d^2/(10 - 1), col="black", type="l", ylim=c(0,4), xlim=c(1,10), main="Eigen Value")
par(new=TRUE)
plot(1:10, res.evd$values[1:10], col="blue", type="l", ylim=c(0,4), xlim=c(1,10), ann=FALSE)
legend("topright", legend=c("SVD", "EVD"), col=c("black", "blue"), pch=16)
```
![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/17038/460fee40-44d4-e77a-9b4a-a84dbc9a507e.png)

かなり一致しているのが見える

# 固有ベクトルは同じか

次に、固有ベクトル$V$がsvdとeigen関数で同じかを調べた

固有ベクトルは長さ1のベクトルなので、同じ方向を向いているほど、内積が1に近づく

180度反対の向きのものも正解なので、内積の絶対値を確認した

```{R}
evec.svd <- res.svd$v
evec.evd <- res.evd$vectors[,1:10]
image(abs(t(evec.svd) %*% evec.evd), xlab="SVD", ylab="EVD", main="Eigen Vector")
```

![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/17038/6dc38a39-d7e3-5646-b47b-e5976a405e67.png)

最後が怪しいが、それ以外は一致した

# ローディングは同じか

最後に、長さの違うもう一つの固有ベクトル$U$が同じになるかを調べた

SVDでは、
$A = U \Sigma V^T$ 
の$U$ですでに計算してある。

EVDでは、データ行列$A$と固有ベクトル$V$と、固有値$\Lambda$しかないが、$A$に$V$をかければ、$U$がもとまる

$A V = U \Sigma$

ただし、$\Sigma$分の重さがかかってるので、長さを1にして$\Sigma$を取り除く

```{R}
loading.evd <- A %*% evec.evd
loading.svd <- res.svd$u
apply(loading.evd, 2, function(x){norm(x, "2")}) # この固有ベクトルにはまだ、固有値分の重みがかかっている
apply(loading.svd, 2, function(x){norm(x, "2")}) # SVDのVはΣと分離されているからOk
for(i in 1:ncol(loading.evd)){
	loading.evd[, i] <- loading.evd[, i] / norm(loading.evd[, i], "2")
}
image(abs(t(loading.evd) %*% loading.svd), xlab="EVD", ylab="SVD", main="Loading")
```

![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/17038/1ef04aba-5335-e2a4-85d5-5631775d3094.png)

やはり、最後（10番目の固有ベクトル）が何かおかしい

固有ベクトルなら、互いに直行しているため、内積が0になる

そのため、SVDの$U$と、EVDの$U$で各々内積をみた

```{R}
image(crossprod(loading.svd), main="SVD")
image(crossprod(loading.evd), main="EVD")
```

![Rplot*-1.png](https://qiita-image-store.s3.amazonaws.com/0/17038/0782de51-82e7-89aa-0652-99fcf7b5d0ff.png)
![Rplot*-0.png](https://qiita-image-store.s3.amazonaws.com/0/17038/1dcbd901-8b82-2816-7a3d-536fe0da78f2.png)


これを見る限り、EVDの10番目の軸が他の軸と直行していない

このように、原因はよくわからないが、eigen関数の高次の部分が不安定になる事例が見受けられた
【Unity】Android SDKのバージョンを26にしたら権限が勝手に付く対処法

かなりハマったので。。。

元ネタ
https://forum.unity3d.com/threads/read_phone_state-permission-added-when-using-sdk-tools-26-0-2.481478/

# 概要

Android SDKのバージョンを最新（26）にしたところ、UnityでAndroidビルドした際に、
以下の権限が勝手に付与されるようになった。

・READ_PHONE_STATE
・READ_EXTERNAL_STORAGE
・WRITE_EXTERNAL_STORAGE

困る。


# 対処法

`targetSdkVersion`を26未満にする。

まず `Player Settings`で、Target API Levelを変更する。

<img width="372" alt="スクリーンショット 2017-07-18 19.05.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/19872/b30c296a-067a-c07a-5c07-1535833c9b13.png">

もし、使用しているライブラリで`AndroidManifest.xml`がある場合、
そのマニフェストファイルでも`targetSdkVersion`の指定が必要。


```xml:AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xxx.xxx.xxx">

    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="25" />

    <application>

    </application>

</manifest>
```


これで権限が付与されなくなりました。
おおよそざっくりステータスコード

webページを表示させるために、webブラウザはサーバへページを表示してほしいよ！とお願い（＝リクエストを送信）をします。
このお願い（リクエスト）に対して、サーバは対応する返信（レスポンスメッセージ）をすることでwebページを表示させます。

その返信の一番最初に書かれているのが**ステータスコード**です。
そのリクエストに対し、サーバが返してくれるステータスをステータスコードといいます。
このコードを見ればどんな状態なのかがざっくりとわかるようになっています。

| ステータスコード | 状態 |例|
|:--|:--|:--|
| 1xx  | Informational  |100 Continue（継続）<br>101 Switching Protocols（プロトコル切り替え）<br>102 Processing （処理中）|
| 2xx  | Success  |200 OK（OK、リクエスト成功）<br>204 No Content（内容無し）|
| 3xx  | Redirection  |300 Multiple Choices（複数の選択）<br>302 Found（発見した）|
| 4xx  | Client Error  |400 Bad Request（リクエスト不正）<br>404 Not Found（未検出）|
| 5xx  | Server Error  |500 Internal Server Error（サーバ内部エラー）<br>503 Service Unavailable（サービス利用不可）<br>504 Gateway Timeout（ゲートウェイタイムアウト）|
値型、参照型、値渡し、参照渡しの区別

# 参考
http://qiita.com/irxground/items/5b37a1643fb521cf057b
http://dobon.net/vb/dotnet/beginner/byvalbyref.html

上記２つ読めば完結すると思うので、以下は気になったところのメモ。

- 参照型の値渡し -> データの中身は変えられるが参照先は変えられない。
- 参照型の参照渡し -> データの中身も参照先も変えられる。
WordとPowerPointの両方で使えるOfficeアドイン開発

Visual Studioで、Officeアドインを作成する場合、

![20170713新しいプロジェクト.png](https://qiita-image-store.s3.amazonaws.com/0/192012/59374d1d-dec8-aacd-3c53-252533d91342.png)

新しいプロジェクトで、WordWebアドインを選ぶと、当たり前ですがWordアドイン専用のアドインとなります。
しかし、

![アドインの必要なアプリケーション.png](https://qiita-image-store.s3.amazonaws.com/0/192012/a1b390c8-6f7f-cea3-7660-b4e2bac960e1.png)

このようにPowerPointアドインとWordアドインの両方で使えるOfficeアドインは、以下の方法で可能です。

#デフォルトのマニフェスト
新しいプロジェクトで生成されるPowerPointアドインのマニフェストは、

```xml:PowerPointWebAddinManifest.xml
（以上、省略）
  <!--TaskPane モードの統合の開始。このセクションは、VersionOverrides がない場合か、Office クライアント バージョンがアドイン コマンドをサポートしない場合に使用します。 -->
  <Hosts>
    <Host Name="Presentation" />
  </Hosts>
（中間、省略）
    <Hosts>
      <!-- 各ホストは、異なったセットのコマンドを持つ可能性があります。 -->
      <!-- Excel ホストはブック、Word ホストは文書、PowerPoint ホストはプレゼンテーションです。 -->
      <!-- 上書きするホストが、マニフェストの最上位セクションで宣言されているホストと一致することを確認してください。 -->
      <Host xsi:type="Presentation">
      （省略）
      </Host>
    </Hosts>
（以下、省略）
```

となっています。
また、新しいプロジェクトで生成されるWordアドインのマニフェストは、

```xml:WordWebAddinManifest.xml
（以上、省略）
  <Hosts>
    <Host Name="Document" />
  </Hosts>
（中間、省略）
    <!-- ホスト ノードが必須です。 -->
    <Hosts>
      <!-- 各ホストは、異なったセットのコマンドを持つ可能性があります。 -->
      <!-- Excel ホストはブック、Word ホストは文書、PowerPoint ホストはプレゼンテーションです。 -->
      <!-- 上書きするホストが、マニフェストの最上位セクションで宣言されているホストと一致することを確認してください。 -->
      <Host xsi:type="Document">
      （省略）
      </Host>
    </Hosts>
（以下、省略）
```

となっています。
#マニフェストへの記述
結論から申し上げますと、Hostsの部分にPowerPointアドインとWordアドインの両方の記述を加えます。

```xml:MultiWebAddinManifest.xml
（以上、省略）
  <Hosts>
    <Host Name="Document" />
    <Host Name="Presentation" />
  </Hosts>
（中間、省略）
    <!-- ホスト ノードが必須です。 -->
    <Hosts>
      <!-- 各ホストは、異なったセットのコマンドを持つ可能性があります。 -->
      <!-- Excel ホストはブック、Word ホストは文書、PowerPoint ホストはプレゼンテーションです。 -->
      <!-- 上書きするホストが、マニフェストの最上位セクションで宣言されているホストと一致することを確認してください。 -->
      <Host xsi:type="Document">
      （省略＊）
      </Host>
      <Host xsi:type="Presentation">
      （省略＊）
      </Host>
    </Hosts>
（以下、省略）
```

同様にExcelも追加可能です。
（省略＊）の部分は、デフォルトなりの記述が必要ですので、お忘れなく。

上述のマニフェスト（MultiWebAddinManifest.xml）の場合、
Officeストア上では、
![20170718_Officeアドイン表示.png](https://qiita-image-store.s3.amazonaws.com/0/192012/a9d8961f-37bb-3b7a-dfa1-3ba0561c2819.png)
と表示されますので、
Word｜PowerPointとしたいなら、Hostの記述順序を逆にすれば可能です。

#Visual Studioによる動作確認
Visual Studioで「開始」では、先に読み込まれたHost（この場合Word）での動作確認になりますので、PowerPointで動作確認する場合は、一時的にWordのHost部分をコメント化します。
Presto DB で DUAL 表が欲しい

> ### DUAL Table
> The synthetic DUAL table is no longer supported. As an alternative, please write your queries without a FROM clause or use the VALUES syntax.

https://prestodb.io/docs/current/release/release-0.70.html

昔はあったんかい

# FROM DUAL の代わりに

```sql
SELECT date '2012-08-08' + interval '2' day
FROM (VALUES 1) AS DUAL("")
```

これでいける

FROM 句がそもそも要らない場合は

```sql
VALUES date '2012-08-08' + interval '2' day
```
bool型への演算結果とコンパイラの最適化

# はじめに

C++言語の`bool`型はインクリメントすることができ、結果必ず真になる。しかしデクリメントはできない・・・というのは知っていたのだけれど、ビットシフト`<<``>>`までできるとは知らなかった。それぞれ結果はこうなる。

* bool型に右ビットシフトすると、必ず偽になる
* bool型を左ビットシフトしても、真偽値は変わらない[^1]

ただし、bool型をビットシフトした値は、`false`を0、`true`を1だとした値をビットシフトした結果が入る。つまり、bool型をビットシフトすると整数にキャストされる。もっと言うなら、bool型に何か演算した場合、インクリメント以外は整数になる。

```cpp:show_type.cpp
#include <typeinfo>
#include <cxxabi.h>
#include <string>

template <class T>
void
show_type(T t){
  const std::type_info& id = typeid(t);
  int stat;
  char *type = abi::__cxa_demangle(id.name(),0,0,&stat);
  printf("%s\n",type);
  free(type);
}

int
main(void){
  bool b;
  show_type(b++); // bool
  show_type(false | true); // int
  show_type(false & true); // int
  show_type(true << 1); // int
  show_type(true >> 1); // int
}
```

`bool`型にビットシフトを許し、かつその結果を整数にするなら、なんとなく`bool`型をインクリメントした結果も整数型になって値が1か2になった方が自然だと思うし、過去にそういう処理系を見た記憶もある[^2]のだが、なぜかインクリメントだけ`bool`型で、残りは整数になる。

[^2]: かすかな記憶ではBorlandのC++処理系が昔こういう動作だった記憶があるのだが、今探してもソースが見当たらない・・・。

さて、ここまでは長い前フリである。`bool`型に何か演算して、整数にキャストした場合の結果は以下の通りとなる。

* `bool`をインクリメント => 常に1
* `bool`を1つ右シフト => 常に0
* `bool`を1つ左シフト => 1か2

これを知ってるか、コンパイラに出題してみましょう、というのが本稿の主題である。

# ソース

こんなコードを食わす。

```cpp:test.cpp
int
func1(bool a){
    return (++a) == 1 ? 1:2;
}

int
func2(bool a){
    return (a>>1) ==0 ? 1:2;
}

int
func3(bool a){
    return (a<<1) < 3 ? 1:2;
}
```

* `func1`は「`bool`をインクリメントしたら常に1になることを知っているか？」という問題
* `func2`は「`bool`を右に1つシフトしたら常に0になることを知っているか？」という問題
* `func3`は「`bool`を左に1つシフトしたら、1か2になるから、常に3より小さいことを知っているか？」という問題。

問一はまぁ、知っていて欲しい気がする。問ニもわかるはずだが、できるか微妙。問三ができたらわりとすごい気がする。

# 結果

上記を`g++ -O3 -S`に食わせた結果。


```nasm
func1(bool):
LFB4:
  movl  $1, %eax
  ret

func2(bool):
LFB1:
  movl  $1, %eax
  ret

func3(bool):
LFB2:
  movl  $1, %eax
  ret
```

おおー、全問正解。clang++も全問正解。インテルコンパイラは問一だけ正解したが、ビットシフトが絡むと即値を返せなかった。

# 感想

g++、clang++ともに「`bool`値をビットシフトした結果」を知っていた。特に最後を

```cpp
int
func3(bool a){
    return (a<<2) < 5 ? 1:2;
}
```

とかにしてもちゃんと即値で返し、

```cpp
int
func3(bool a){
    return (a<<2) < 4 ? 1:2;
}
```

とかにするとちゃんと比較命令吐いたので、「boolを整数にキャストすると0か1で、それを左にn個ビットシフトしてもたかだか1<<nである」ということを理解しているっぽい。たいしたもんだ。

# おまけ

`bool｀を整数にキャストすると0か1である、という条件をどこまで理解できるか、こんなのを食わせて見た。

```cpp:test2.cpp
int
func4(bool a){
  return ((a -2)*2) >-5 ? 1:2;
}

int
func5(bool a){
  return ((a -2)*2) < -1 ? 1:2;
}
```

`a`は0か1なので`((a -2)*2)`は-4以上、-2以下となる。従って、上記は常に成立し、1を返せば良い。g++とclang++は問4と問5も解けたが、インテルコンパイラはなぜか問4しか解けなかった。問4が解けるんなら問5も解けてほしいが・・・

[^1]: ただし`<<32`とかするともちろんオーバーフローして偽になる。
shellとpowershellでファイルをやり取りする

# 経緯 #

powershellで完璧で幸福でとても楽しい自動処理をゴキゲンに書いていました。
そこでgit log ${CommitHash}...HEADとしたときのことです。

なんということでしょう。
この不完全なgit logというプログラムはpowershell様の前で文字化けしやがったのです。
いろいろ試したのですがまぁ無理だったのでしょうがないのでpowershell様からshを起動することにしました。

git for windowsをインストールしていれば懐の深いpowershell様はshの起動を許してくれます。
ですが、そこでもいくつかの問題が出てきたので、それをshの為に解消してあげたのが今日のお話。

# powershell -> sh #

${CommitHash}の部分を受け渡す必要があったので、shファイルを自動生成します。-cオプションはなんかうまくいかなかったのでファイルで渡すことに。

しかしpowershell様の書き上げるテキストはBOM付きのUTF-8です。
これをshに読ませるとなぜかshはbinaryだから読めませーんとふざけたことを言い出します。

しょうがないので
echo "git log ${CommitHash}...HEAD > commit.log" | Out-File "コマンド.sh" -Encoding ascii
とかでわざわざBOMを取り除いてshに食わせます。

# sh -> powershell #

今度は無事git logが吐き出されたのでpowershell様に読み上げていただきます。
が、このgit log無作法にもBOMなしのUTF-8とかいうものを吐き出します。

当たり前ですがUTF-8はBOMが付いていないといけません。
しかし、まぁ、懐の深いpowershell様はちゃんと
 $log = Get-Content -Encoding UTF8 commit.log
でBOMなしUTF-8も読んであげることができるのです。

なんてすばらしいんでしょう。
【備忘録】Python、機械学習・深層学習を始めるにあたって【リンク集】

プログラミングもやったことのない私が、Pythonの使い方、機械学習や深層学習の基礎を学ぶまでに参考にした内容をまとめています。
基本的には初心者向けの記事のまとめとなっています。

---
**環境構築について**
・[TensorFlow環境構築](http://qiita.com/isboj/items/3d62d7dc3f7a616de24e)
　Anacondaのインストール、TensorFlowのインストールについて。

・[WindowsのAnaconda環境に深層学習フレームワークTensorflow 1.0をインストールする方法](http://qiita.com/tomochiii/items/fe4c791b313ddcef4cd7)
　同様にTensorFlowのインストールについて。

・[TensorBoardの使い方](https://hinaser.github.io/Machine-Learning/how-to-use-tensorboard.html)
　Tensorboardの使い方について詳しく記述されている。

---

**Pythonの使い方**
・[Scipy Lecture Notes（日本語訳）](http://www.turbare.net/transl/scipy-lecture-notes/)
　ここを読むだけで基本的な使い方（特にNumPy、Matplotlib、Scipy）はほとんどマスターできる。

・[Pythonのテキスト作りました](http://qiita.com/KatsunoriNakamura/items/b465b0cf05b1b7fd4975)
　同じくここを読むだけで基本的な使い方はほとんどマスターできる。


---
**Introduction of Machine Learning**
・[MNIST For ML Beginners](https://www.tensorflow.org/get_started/mnist/beginners)
　英語。機械学習（ML）の基礎の基礎およびMNISTを解説。

・[特にプログラマーでもデータサイエンティストでもないけど、Tensorflowを1ヶ月触ったので超分かりやすく解説](http://qiita.com/tawago/items/c977c79b76c5979874e8)
　↑の記事を日本語で丁寧に解説・補足している。


・[ニューラルネットワークと深層学習](http://nnadl-ja.github.io/nnadl_site_ja/index.html)
　英語の記事を翻訳。めちゃくちゃ内容が濃いが、本質を理解したい人向け。

---

**参考書**
・_科学技術計算のためのPython入門――開発基礎，必須ライブラリ，高速化_
　入門と書いてはいるが，ちょっとはPythonやらプログラミングをかじったことがある人には絶大にオススメ．
　NumpyやScipy，Pandasなどがどういった形でデータを扱っているのかもわかりやすく説明してあり，
　科学技術とは関係ない人にもありがたい良書だった．



---

**面白かった記事の紹介**
・[pythonでなんとなく材料研究者の気分を味わおう【pymatgen入門】](http://qiita.com/KentoObata/items/a909ecc42c8805594c89)
　Materials Informaticsに関する導入として。内容がとっつきやすい。

・[神嶌 敏弘（Toshihiro Kamishima）さんによる解説](http://www.kamishima.net/jp/kaisetsu/)
　専門家による解説記事多数。かなり濃い内容だが非常に参考になる。

・[2015年センター試験数学IAを全てプログラム(Python)で解く](http://qiita.com/Akai_Banana/items/b328fe0116d248127a36)
　Python（特にScipy）を使った計算手法を紹介。細かい数式はわからなくても、ただワクワクし、可能性を感じた。

---
①-2テキストエディタをダウンロードしよう！~カスタム編~

## SublimeText3をカスタマイズします
　この記事では、SublimeText3をカスタマイズしていきます。
　もちろんそのまま使っていただいてもとても使いやすいのですが、
初心者にとってつまりやすいところをサポートしてもらえるようにカスタマイズしていきたいと思います。

まだSublimeText3をダウンロードしていない人は下記の記事よりダウンロードを行いましょう！
[①テキストエディタをダウンロードしよう！](http://qiita.com/tech-caddiee/items/fb7a92f77cc3bf45df1f)

**まずはSublimeText3を開いて見ましょう！**
⌘を押しながらスペースキーを押すとspotlight検索ができます。
　マックの操作には早めに慣れていた方がいいです。意外と使います！
こちらに操作方法一覧を作成しましたので、一度試して見ましょう！！！
[マックの操作方法をとことん解説！！！](http://)

**それでは、実際にカスタマイズして行きましょう！**
左上のメニューバーから、Sublime Text -> Preferences -> Settings
の順で以下のように画面を開いてください。
[![https://gyazo.com/3f5fbb0da152daf3477e6dc130ef2467](https://i.gyazo.com/3f5fbb0da152daf3477e6dc130ef2467.gif)](https://gyazo.com/3f5fbb0da152daf3477e6dc130ef2467)
**開いた画面に以下のコードをコピペしてください。**

```ruby:Preferences.submit-settings--User
  {
    "draw_white_space": "all",
    "font_size": 12.0,
    "highlight_line": true,
    "ignored_packages":
    [
      "Vintage"
    ],
    "rulers":
    [
      80,
      120
    ],
    "tab_size": 2,
    "translate_tabs_to_spaces": true,
    "save_on_focus_lost": true,
    "ensure_newline_at_eof_on_save": true,
    "trim_trailing_white_space_on_save": true,
    "word_wrap": true
  }
```
コピペすると以下のようになると思います

![スクリーンショット_2017-07-13_23_52_00.png](https://qiita-image-store.s3.amazonaws.com/0/189268/34254a2a-24f4-326d-caed-9738f274c40e.png)
⌘　と　S　を押すことで保存され、この印が✖︎じるしに変わります。
✖︎印でないときは保存されていませんので保存する際は⌘Sで保存するようにしましょう！

**それではさらにカスタマイズしていきましょう**
以下の記事からさらにカスタマイズしてください！
[①-3テキストエディタをダウンロードしよう！~拡張機能編~](http://qiita.com/tech-caddiee/items/9f90c4152bf1e56608e5)
Macbook : macOS Sierraで外付けキーボードを指した時、Macbookのキーボードを無効化

#なぜ無効化するのか。

私は普段からMacのノートパソコンの上に外付けキーボードを乗せて使っています。
そんな時、上に乗せたキーボードによってノートパソコンのキーボードが押されてしまいます。
それの回避策です。

# 使うもの
- [Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements/blob/master/README.md)

たったこれだけ。

##Karabiner−Elementsの設定

<img width="900" alt="Karabiner-check.png" src="https://qiita-image-store.s3.amazonaws.com/0/73994/179c8b25-3f16-c6e5-2d7d-084f7da34fc5.png">


この場所にチェックを入れれば完了！！

なお、[公式](https://pqrs.org/osx/karabiner/index.html.ja)推奨のKarabinerではSierraへの対応がまだなので、しばらくはこれで回避かな。
SmartGit > Error: Executing a command has failed. | Walk failure. > クローンしなおして対処

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

SmartGitを試用中。

過去のCommitを見ようとしたら以下のエラーが出る。

> Executing a command has failed.
> Walk failure.

ローカルに取り込んだ分のCommitは1000までしかない。

なんらかの理由でrepositoryがおかしくなったのだろうか。
bitbucket.orgをwebブラウザで見た限り、もっと多くのログを見ることができる。


下記と関連しそう。
https://stackoverflow.com/questions/6713126/git-repository-failed-to-traverse-parent-error

他のリポジトリでも1000コミットまでしか表示されてなかったが、Logウィンドウにおいて下の方にスクロールするにつれ、順次コミット数が増えていった。3334コミットまで見ることができたので、上記のリポジトリ自体の問題なのかもしれない。

### 対処

問題のあるリポジトリに関してCloneしなおした。

Logウィンドウでコミットを見直したところ、エラーが出ることなく1363コミットまで見ることができた。

該当のリポジトリはSourceTree v2.1.2.4でコミットをしてきたが、SourceTreeのバグに巻き込まれたのだろうか。