OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel5.4の環境構築

#環境の前提
下記の二つがインストール済みであること。

- Virtual Box
- Vagrant

#Laravel Homestead のインストール

`$ vagrant box add laravel/homestead`コマンドを打った後でproviderの選択をしないといけないので、2) virtualboxを選択する。

```
$ vagrant box add laravel/homestead

==> box: Loading metadata for box 'laravel/homestead'
    box: URL: https://vagrantcloud.com/laravel/homestead
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) parallels
2) virtualbox
3) vmware_desktop

Enter your choice: 2)
```

#Homesteadのインストール

```
$ cd ~
$ git clone https://github.com/laravel/homestead.git Homestead
```

cloneしたHomesteadディレクトリに移動する。masterブランチが安定バージョンでないので、checkoutして安定版のブランチにcheckoutする。

```
$ cd Homestead
$ git checkout v5.4.0
```

Homesteadリポジトリーにint.shを生成しておく。

```
$ bash init.sh
```

Homesteadに何が入っているか興味本意で確認する。色々入ってます。

```
$ ls
CHANGELOG.md		Vagrantfile		bin			init.bat		readme.md		src
Homestead.yaml		after.sh		composer.json		init.sh			resources		tests
LICENSE.txt		aliases			composer.lock		phpunit.xml.dist	scripts
```

#Homestead.yamlの設定を確認する

```
$ cat Homestead.yaml 
---
ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/Code
      to: /home/vagrant/Code

sites:
    - map: homestead.app
      to: /home/vagrant/Code/Laravel/public

databases:
    - homestead

# blackfire:
#     - id: foo
#       token: bar
#       client-id: foo
#       client-token: bar

# ports:
#     - send: 50000
#       to: 5000
#     - send: 7777
#       to: 777
#       protocol: udp
```

#hosts 情報の設定
macから仮想PC内のWebサーバーにアクセスしやすくするために、homestead.app というドメインを、仮想PCのWebサーバーとして設定される`192.168.10.10`を割り当てておく。

```
$ sudo vim /etc/hosts
```

下記を追加する。

```
192.168.10.10   homestead.app
```

#Laravelプロジェクトを作成
mac上でLaravelプロジェクトを作成する。

Homestead.yamlで記載があったpath先を設定しておかないとエラーが出るので、`~/Code`を作成しておく。

```
$ mkdir ~/Code
```

```
#vagrantを立ち上げる。
$ vagrant up

#vagrantにssh接続
$ vagrant ssh

#VM上のローカル共有ディレクトリに移動
vagrant@homestead:~$ cd Code/

#conposerが最新のバージョンか確認、最新じゃなかったらアップデートをかける
vagrant@homestead:~/Code$ sudo composer self-update

#プロジェクト作成 
#今回は最新バージョンで試してみる。
vagrant@homestead:~/Code$ composer create-project laravel/laravel laravel
```

`http://homestead.app/` or `http://192.168.10.10/`にアクセスしてみる。

下記のLaravel画面が出てくれば成功です。

![スクリーンショット 2017-08-17 11.16.37.png](https://qiita-image-store.s3.amazonaws.com/0/167850/59543434-6256-54ce-3068-53ed5fbfbd36.png)

一応動作確認として~/pubulic/直下に`phpinfo.php`ファイルを作成して試してみる。

![スクリーンショット 2017-08-17 11.22.47.png](https://qiita-image-store.s3.amazonaws.com/0/167850/6dd44f1b-f09a-b365-0b4e-9badafbce298.png)

#参考記事
[Laravel HomesteadでLaravel5.4の環境を作りながら、レンタルサーバにwebアプリケーションを公開する(追記あり)](http://qiita.com/Fendo181/items/a6b9017f6ef490995aba)
[Laravel 5.4 Laravel Homestead 日本語](https://readouble.com/laravel/5.4/ja/homestead.html)
[Laravel5.4の開発環境をHomesteadでmacにインストール](http://am1tanaka.hatenablog.com/entry/2017/02/19/014817#VirtualBox-のインストール)
「キュー(Queue)」、Laravel「処理の待ち行列」

- 「キュー(Queue)」とは「処理の待ち行列」である
- キューサービスには「データ投入」と「データ取出」の処理が求められる
- 「高い応答速度」「高い耐久性」
- 例：Beanstalk、Amazon SQS、Redis

#laravel queue 
##### データベースに記録ファイルを作成（必要）
```
php artisan queue:table
php artisan migrate
```

依存パッケージ

```
Amazon SQS: aws/aws-sdk-php ~3.0
Beanstalkd: pda/pheanstalk ~3.0
Redis: predis/predis ~1.0
```


Redisの設定

```#config/database.php
'redis' => [
    'driver' => 'redis',
    'connection' => 'default',
    'queue' => '{default}',
    'retry_after' => 90,
],
```

```
//jobを作成
php artisan make:job SendReminderEmail
```

```#app/jobs/ProcessPodcast.php  
<?php

namespace App\Jobs;

use App\Podcast;
use App\AudioProcessor;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class ProcessPodcast implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $podcast;

    /**
     * 新しいジョブインスタンスの生成
     *
     * @param  Podcast  $podcast
     * @return void
     */
    public function __construct(Podcast $podcast)
    {
        $this->podcast = $podcast;
    }

    /**
     * ジョブの実行
     *
     * @param  AudioProcessor  $processor
     * @return void
     */
    public function handle(AudioProcessor $processor)
    {
        // アップロード済みポッドキャストの処理…
    }
}
```
参考：
https://readouble.com/laravel/5.4/ja/queues.html
Railsでlogを出力しdebugする

#RailsのControllerでlogを出力する

開発をしていると、適切な場所に処理が通っているのか
変数の中身がなんなのか
など確認したいことが色々出てきます。

そうなった場合にRailsでは、**logger.debug**を使用して確認できます。

**logger.debug**を使用すると**log/development.log**にlogを出力できます。

##環境
RubyonRails: 5.0.3
Ruby: 2.3.3

##使い方
使い方は、logger.debugと記述し出力したいログを書くだけなので
とっても簡単です。

###Controllerで使ってみる
以下は、Controller内のif文の中にlogを仕込む例です。

```ruby:logger.debugの使い方の例：1
def index
  if true then
     logger.debug("if文の中に入りました")
  end
end
```

```ruby:log/development.logに出力されたlog
if文の中に入りました
```


###Viewで使ってみる
logger.debugはViewに仕込むことも可能です。
以下は、View内にlogを仕込む例です。

```ruby:logger.debugの使い方の例：2
<% logger.debug("このページは読み込まれています") %>
```

```ruby:log/development.logに出力されたlog
このページは読み込まれています
```

###インスタンス変数を出力してみる
logger.debugで出力できるものは、文字だけではありません。
@testのようなインスタンス変数も出力できます。
以下は、インスタンス変数の中身を出力する例です。


```ruby:logger.debugの使い方の例：3
@test = Test.all
logger.debug(@test)
```

```ruby:log/development.logに出力されたlog
<Test::ActiveRecord_Relation:0x007f16ec445390>
```
inspectをつけたら
わかりやすく中身を表示することが可能です。
個人的には、inspectを付けて使うことが多いです。


```ruby:logger.debugの使い方の例：4
@test = Test.all
logger.debug(@test.inspect)
```
```ruby:log/development.logに出力されたlog
#<ActiveRecord::Relation [#<Test id: 1, name: "hoge">, #<Test id: 2, name: "fuga">]>
```

以上です。
Digdagで日付でループ ※イマイチ

```
+repeat:
  loop>: ${ moment("2016-12-31").diff(moment("2015-01-01"), 'days') + 1 }
  _do:
    echo>: ${ moment("2015-01-01").add(i, 'days').format("YYYY-MM-DD") }
```

for_eachに日付の配列渡そうと思ったけど${}内にそういう配列を作成するJSを書けず挫折

月毎にループするなら以下

```
_export:
  start_day   : 2016-01-31
  end_day     : 2016-03-01

+repeat:
  _export:
    start_month: ${moment(start_day).format("YYYY-MM-01")}
    end_month  : ${moment(end_day)  .format("YYYY-MM-01")}
  loop>: ${moment(end_month).diff(moment(start_month), 'month') + 1}
  _do:
    _export:
      month: ${moment(start_month).add(i, 'months').format("YYYY-MM")}
    +first_month:
      if>: ${i == 0}
      _do:
        echo>: ${month} 初月
    +not_first_month:
      if>: ${i != 0}
      _do:
        echo>: ${month} 初月以外
```
Unity List<Vector3>をシリアライズして保存したい。。


### 試した環境
* Unity5.6
* Unity2017
* mac osx sierra

## シリアライズして保存するところ

```csharp:GameManager.cs

    void Save<T>(string key, T obj)
    {
        if (null == obj) return;
        var mem = new MemoryStream();
#if UNITY_IOS
            System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");
#endif
        var b = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();


        b.Serialize(mem, obj);
        PlayerPrefs.SetString(key, System.Convert.ToBase64String(mem.ToArray()));
    }
```

## 試した事。

```csharp:GameManager.cs
public List<Vector3> segmentPos;
```

```
SerializationException: Type UnityEngine.Vector3 is not marked as Serializable.
```

Vector3のシリアライズはアクセサがないからかな。。

```csharp:GameManager.cs
public List<Vector3> segmentPos {get;set;} = List<Vector3>();
```

```

public List<Vector3> gnormales {get;set;} = new List<Vector3>();
Assets/Scripts/Obj/Bonsai/LSystemsModel.cs(28,26): 
error CS1644: Feature `auto-implemented property initializer' 
cannot be used because it is not part of the C# 4.0 language specification
```

この書き方はC#4.0以降じゃないと、だめみたいなので、
Unity5.6から、Unity2017にアップデートし。

PlayerSettingのConfigrationを、「.Net4.6」にし、Unity再起動。

エラーが消えた！

が、

```

SerializationException: Type 'UnityEngine.Vector3' in Assembly 'UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

```

Vector3や、Vector2、Quaternion等のUnityEngineの構造体は、
シリアライズできないみたいなので。

結局、Vector3をカスタムで構造体化。

参考：https://github.com/KeenSoftwareHouse/SpaceEngineers/blob/master/Sources/VRage/Serialization/SerializableVector3.cs

Listから、配列にいれたかったので、
ToArray()メソッド等考慮。

で一応保存実行できた。。が、

読み込み時に、こんどはこういうエラーが。

```
SerializationException: End of Stream encountered before parsing was completed.
```

シリアライズするまえに処理がおわったってこと？

で、結局。
JsonUtilityというのを使うとすべて解決してしまったｗｗ。

参考にさせて頂いたサイト
http://qiita.com/keidroid/items/24e03f82d74560dc557a

http://ch.nicovideo.jp/ntmi/blomaga/ar927398
Adler-32: 関数scanlを使ってみる

Adler-32: 関数scanlを使ってみる
=============================

はじめに
-------

Haskellにはfoldrという関数がある。この関数は、たたみこみ関数と呼ばれるものだ。これに類する関数は、たくさんある。たとえば関数foldlあたりが有名だ。そのようなバリエーションのひとつとして、関数scanrやscanlというものがある。scan*系の関数の使い道として、いい例があったので、紹介する。

対象読者
-------

Haskellの基本的な文法はわかる。関数foldrやfoldlについては理解している。型ByteStringは使ったことがある。

関数scanlとは
------------

関数foldlはつぎのような計算をする。

    foldl (+) 1 [2, 3, 4] == ((1 + 2) + 3) + 4

左結合でリストの要素を、つぎつぎに演算子でつないでいく。ここで、計算途中の値がほしいとする。そんなときに関数scanlを使う。

    scanl (+) 1 [2, 3, 4] == [1, 1 + 2, (1 + 2) + 3, ((1 + 2) + 3) + 4

このように関数foldlにおける、「途中の値」をすべて集めたリストをかえすのが、関数scanlだ。

関数scanl'とは
-------------

ここではくわしくは説明しないが、関数foldlを使うと空間効率が悪くなる。途中の計算が遅延されるためだ。関数foldl'はその問題を解決したバージョンだ。おなじように関数scanl'も、関数scanlの空間効率を改善したものだ。

Adler-32とは
-----------

Adler-32は、zlib形式で圧縮されたファイルに負荷されるチェックサムをもとめるアルゴリズムだ。zlib形式での圧縮はPNG形式の画像ファイルに使われている。計算自体は簡単で、A, Bふたつの値を計算し、それを結合する。値Aはデータの全バイトの総和に1たしたものの、65521を法とした剰余である。値Bは値Aの計算途中の値の総和となっている。

くわしくは[Wikipedia: Adler-32](https://ja.wikipedia.org/wiki/Adler-32)を参照のこと。

コードの全体
-----------

```haskell:adler32.hs
{-# OPTIONS_GHC -fno-warn-tabs #-}

import Control.Arrow
import Data.List
import Data.Bits
import Data.Word

import qualified Data.ByteString as BS

add :: Integral a => Word32 -> a -> Word32
add w1 w2 = (w1 + fromIntegral w2) `mod` 65521

adler32 :: BS.ByteString -> BS.ByteString
adler32 bs = BS.pack $ map fromIntegral [
        b `shiftR` 8, b .&. 0xff, a `shiftR` 8, a .&. 0xff ]
        where
        (b, a) = foldl' (flip $ \k -> (`add` k) *** const k) (0, 0)
                . tail $ scanl' add 1 $ BS.unpack bs
```

コードの説明
-----------

### 関数add

関数addは、65521を法とする剰余の世界における足し算だ。

### 関数adler32

関数adler32の本体を、もういちど示す。

```haskell:adler32.hs
adler32 :: BS.ByteString -> BS.ByteString
adler32 bs = BS.pack $ map fromIntegral [
        b `shiftR` 8, b .&. 0xff, a `shiftR` 8, a .&. 0xff ]
```
この部分では求めた値Aと値Bとを結合したバイト列をつくっている。関数shiftRで上位8ビットを取り出し、演算子(.&.)で下位8ビットを取り出している。つまり、つぎのようになる。

    [Bの上位8ビット, Bの下位8ビット, Aの上位8ビット, Aの下位8ビット]

関数adler32のwhere節を、もういちど示す。

```haskell:adler32.hs
(b, a) = foldl' (flip $ \k -> (`add` k) *** const k) (0, 0)
        . tail $ scanl' add 1 $ BS.unpack bs
```

これは、よりわかりやすく書くと、つぎのようになる。

```haskell
ns = tail $ scanl' add 1 $ BS.unpack bs
a = last ns
b = foldl' add 0 ns
```

したのような形だと、リストnsの全体を2回、走査しているので、効率が悪くなる。なので、実際のコードでは、タプルにまとめて、1回の走査で評価している。

したのほうの形で説明する。まずリストnsは初期値1から、データのバイトをつぎつぎに加算していった計算の、途中結果を集めたリストである。初期値は使わないので、関数tailではじめの値を落としている。値aは、リストnの最後の要素であり、これがデータのバイトの総和を加算したものに、1加えたものだ。bは途中結果をすべて加算したものである。

効率の改善 - 剰余の計算の回数を減らす
---------------------------------

(あとで書く)
railsでflashを使ってサクセス・エラーメッセージを表示する

# 仕様書

* flashを用いて登録が成功したかを次の画面で表示する

# 流れ

* controller.rbに@post.saveができたら成功のメッセージ、失敗したら失敗のメッセージをflash[:notice]に入れるようにする
* viewにもしflash[:notice]があったらそれを表示するようにする
* 失敗したら投稿フォームに戻り、投稿フォームに前入力してた値を初期値として出す。

# controllerにsaveがされたかでflash[:notice]を振り分けて表示するようにする

```ruby:posts_controller.rb
  def create
    @post = Post.new(content: params[:content])
    if @post.save
      flash[:notice] = "投稿を作成しました"
      redirect_to("/posts/index")
    else
      render("posts/new")
    end
  end
```
# viewにメッセージの表示

```ruby:application.html.erb
    <% if flash[:notice] %>
      <div class="flash">
        <%= flash[:notice] %>
      </div>
    <% end %>
```

もしflash[:notice]があった場合のみ発動。

# もし失敗した場合、投稿ページに戻る。

```ruby:new.html.rb
<% @post.errors.full_messages.each do |message| %>
 <div class="form-error">
  <%= message %>
 </div>
<% end %>
<textarea name="content"><%= @post.content %></textarea>
<input type="submit" value="投稿">
```
作業ツリーの状態を元に戻したい時  「git checkout .」

## 対象
- gitでバージョン管理をしている
- 作業中にファイルの状態を元に戻したくなった


## 作業ツリーの状態を元に戻すコマンド

### 

```
git checkout .
```

これで元に戻る。


ちなみに、**新しく作ったファイルにはこのコマンドが適応されない**。  
それらは、**手動**で消す。
strptime使用時に”TypeError:must be string, not int…"が出た時の対処法

#背景と問題点
勤怠管理の日付を自動で入れるスクリプトあれば便利だな−と思い、
pythonのdatetimeモジュールのstrptimeを使って下記のように書いていた。

```Kinkyu.py
input_date = input('作成する年月度を入力して下さい(例:201608):')

try:
    month_first = datetime.datetime.strptime(input_date, '%Y%m')
except ValueError:
	    input('年月を201608のように入力して下さい。')
	    sys.exit()
```

すると、年月度を入力した時に下記エラー発生。

```bash
month_first = datetime.datetime.strptime(input_date, '%y%m')
TypeError: must be string, not int
```
#原因
あれ？と思って調べてみたら、
どうやらstrptimeの第１引数は文字列が入るとのこと。
数値じゃだめなのね・・・



#対処法
int型がNGならString型に変換してあげればよいのでは？と思い、
下記のようにに変更してみた。

```Kinkyu.py
input_date = input('作成する年月度を入力して下さい(例:201608):')
input_date = str(input_date) #変更点：数値を文字列に変換

try:
    month_first = datetime.datetime.strptime(input_date, '%Y%m')
except ValueError:
	    input('年月を201608のように入力して下さい。')
	    sys.exit()
```

これで解決。pythonだと型変換も楽で良い。


#参考リンク
* 8.1. datetime — 基本的な日付型および時間型(python標準ライブラリより)
https://docs.python.jp/3/library/datetime.html

* Pythonで文字列からdatetimeオブジェクトを生成する(Python3.3)
http://qiita.com/BarutanGNE/items/b14bef93c004f90c0ce4
nginxのマスタプロセスとワーカプロセス

- 備忘録です。マスタプロセスやワーカプロセスについて確認用  

## nginxはマスタプロセスとワーカプロセスのマルチプロセス構成で稼働する。
- つまり、**マスタプロセス**は１つ、**ワーカプロセス**は設定することで複数起動可能。  

### **マスタプロセス**について

- マスタプロセスにシグナルを送ることでnginx全体のプロセスを制御する。  
- 各ワーカプロセスはマスタプロセスが受信したシグナルの種類に応じて各ワーカプロセスにもシグナルを送る。  

### **ワーカプロセス**について
- 通常シングルスレッドで動作しますが、**I/O Multiplexing**や**ノンブロッキングI/O**を利用することで複数のクライアントとの入出力を並行して行うことを可能。  
- ワーカプロセス自体は複数起動可能なので容易にスケールさせることができる。  
  


> ◆スケーリング【scaling】スケールする  
> 情報システムの分野では、装置やソフトウェア、システムなどの性能や処理能力を、要求される処理量に合わせて増強したり縮減したりすることをスケーリングという。
> 「IT用語辞典」より

### マスタプロセスとワーカプロセスの流れ
①シグナルを送る（SIGTERM,SIGQUIT,SIGHUPなど)  
②マスタプロセスがシグナルを受け取る  
③マスタプロセスが受信したシグナルの種類に応じて各ワーカプロセスにもシグナルを送る  
④複数のワーカプロセスが受信
laravel associate

 
```
//関連づけ：associate：外部キーのデータを更新する時：
$project->department()->associate(Department::find($request['department_id']));

//belongsToリレーションを削除する場合はdissociateメソッドを使用します。このメソッドはリレーションの子モデルの外部キーをnullにします。
$user->account()->dissociate();
$user->save();


//contentのserversカラスに　attach:中間テープルを作成し、content_id , servers_idを入れる。多対多の時必須。
$content->servers()->attach($serverIds);

//detach:外部キーを消す、外部キーを消さないと、そのままデータを消すとエラーが出る。
$project->servers()->detach();
```

参考：https://readouble.com/laravel/5.4/ja/mail.html
view変数名を変える方法：with()

```
  public function build()
    {
        return $this->view('emails.orders.shipped')
                    ->with([
                        'orderName' => $this->order->name,
                        'orderPrice' => $this->order->price,
                    ]);
    }


//viewで使う時：
<div>
    Price: {{ $orderPrice }}
</div>
```
Laravel 構築

専用ページを読み込み

```php
@include('project.environments-field', [
    'title' => '渡すタイトル',
    'servers' => $servers['test'],
    'environment' => $environments['test'],
])
```

エラーの時、ボックスの色が変わる

```
<div class="form-group {{ $errors->has('department_id') ? 'has-error' : '' }}">
```
進んで、戻るボータンをしたら、元の値が消えないように

```php
<select class="form-control" name="department_id" id="department_id">
    <option value="">選択してください</option>
    @foreach($departments as $department)
        <option value="{{ $department->id }}" {{ old('department_id') == $department->id ? 'selected' : '' }}>{{ $department->name }}</option>
    @endforeach
</select>
```

配列をviewに返す時。compact

```php
$environments['production'] = Environment::where('name', 'production')->first();
$fileTypes = FileType::all();
        return view('admin/project/create', compact(
            'departments',
            'environments',
            'servers',
            'osUsers',
            'fileTypes'
        ));
```
Illustrator④デザインの注意点

#デザイン
注意されたことをまとめます。

##ラフ作成の注意
★考える順番・作る順番・コーディングを考えて作る。
基本は大きい箇所から→中→小
1、大まかに＆基本
　→PCとスマホのサイズ・各ページ共通のwidth・フッター・ヘッダー・フォント・色・余白を決めておく
※ここで確認をとる
2、その後細かく
　→実際のデザインの部分を作成していく

##デザインの注意
→視線の誘導・導線を意識する
→要素のメインとサブをはっきりさせる（写真とテキスト）
→黄金比や構図を意識する
→リンクはわかりやすく（例えば背景色と色を被らせない）
→セクションごとに要素を固める（写真とボタンをワンセットなのに、マージンを取り過ぎたりしないこと）
→絵を美しく見せる・テーマに沿ってお洒落に見せる
→バランス良く（有機とリズム）
→ヘッダー部分にツイッターやインスタのアイコンをつけると離脱になるから意図的に以外は極力避ける
→footerのアイコンはsvg（画像が荒れない・容量軽い）で保存する
「svg→管理がめんどくさい。ただアイコンの８割はsvg」
→ピクセルの数字は10区切りか４区切り（４区切りが基本）

##フォントの注意
→文字のジャンプ率・フォントのバランス
→写真の顔に文字を被らせない（背景画像・画像をしっかり分ける）
→フォントはカッコは全角・英語は半角スペースじゃなくてタブで開ける
→行間は1.5~2倍
→タブは他行の文字と合わせる時とかに使用するので、
　ただ文字と文字の間にスペースを入れたいときは使用しない（スペースキーを使う）
→流行りフォントをサーチして使う
→イラレのテキストはサイズごとに分けて書く
→ドロップシャドウは最終手段
→テキスト量が多いときは左揃え（真ん中は見えづらい）
→数字は半角
→可読性を高める
Google Calendar で、参加者を一括で招待する方法

これのこと。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103885/fa318172-5aae-31d0-bde6-79372b3b1010.png)

招待人数が多いと、全員分を入力するのは大変である。

そこで、一括入力できる方法を見つけた。

```
foo@example.com, bar@example.com, baz@example.com
```

という文字列をコピーしておいて、この枠に貼り付けるだけ。
サジェストでは一人しか表示されていないが、Enterを押すと全員分入っている。

![out.gif](https://qiita-image-store.s3.amazonaws.com/0/103885/484e8717-06b2-ba42-b18e-efad7f20c7fb.gif)
Python学習サイト

１８−２０日は、Code Schoolが週末無料キャンペーンとのメールがきました。
あらためて、自分が興味あるもののうち、Python, Djangoをまとめてみました。
が、Code Schoolの学習サイト、落ちてるっぽい。。。

progateのpythonIをやってみました。りんごを買った時に個数を入力すると、お釣りを計算するという計算機のサンプル作成でした。
文字出力(print)や変数入力・変換(str,int)やif文を使うところまででした。
１：４５分のところ、さくさく読み飛ばしてやっていったら、３０分で終了しました。
読み飛ばしている割には時間かかるなーという感じですが、WEBだかからローディングだけでなく、文字のコピペーでちょっともたもたする感じはありました。
pythonIIの途中から、有料になったので、会費を払いました。月額費だから、ついでに他のもやった方がいいのかな。。。
やったあと無料会員に戻れるかも確認してみたい。
PythonIIは、35分かかった。list,for,dictionary,while,break,continueの実践だった。内容は引き続きお買い物プログラムだった。
PythonIIIは、25分かかった。関数、スコープ、複数引数、関数のモジュール化、標準ライブラリ呼び出し。内容はじゃんけんゲーム。
なんとなく物足りない感じで終わった。
お金払ったのでついでにコマンドラインとgitもやってみたけど、10分くらいずつで終わりました。

## Code SchoolのDjango
土曜日10時くらいから、CodeSchoolの無料週末キャンペーンが始まったので、月曜夜までにかけて、Djangoの講座２つをやってみました。30分くらいずつ進めていって、トータルでは5時間くらいかな。
■良かったところ
urlsを作って、views, templateを作るという基本的なところを何度もまわす感じ。
modelsを作って、migrateをするところはそのあとにやる。
Videoでの講義は資料がしっかりしていて、英語があまりわからなくても、意外にわかる（気がする）
user認証まではいる。
■物足りないところ
BootstrapやAjaxも入ってきているが、あんまり関係ないような。
1対多のリレーションは触れるが、多対多は入らない。
一般的にこういうものにありがちだが、本番運用の仕方はわからない。
■どんな人向けの講座か。
Djangoに興味があって、本格的に導入する前にざっと他のフレームワークと検討してみたい人。
こういったコード講座的なものが好きな人。
転職先または異動先でDjangoを使う人。

終わった後に、半額割引のキャンペーンメールがきました。これを狙って週末無料キャンペーンやってるのかな。
入りたくなりますね。


## Python, Django
　　　　
CodeAcademy 

| サイト | 講座 | 言語 | 費用 | 学習時間 |
|:-:|:-:|:-:|:-:|:-:|
| [dotinstall](http://dotinstall.com/lessons/basic_python_v3)  |Python3入門   | 日本語  | 無料  | 1h  |
|[Progate](https://prog-8.com)|Python|日本語|無料?有料?|6h||
| [Code School](https://www.codeschool.com/learn/python) |Try Python   |  英語 |  無料 | 6video  |
|   |Flying Through Python   | 英語  | 29$/月 サイト  |  14video |
|   | Try Django  | 英語  | 29$/月 サイト  |  7video |
|   | Digging Into Django  | 英語  | 29$/月 サイト  | 14video  |
|  [CodeAcademy](https://www.codecademy.com/) |  Learn Python |  英語 | free  |  10h |
|   | Learn ReactJS: Part I  | 英語|簡易版無料  | 6h  |
|   | Learn ReactJS: Part II  | 英語|簡易版無料  | 5h  |
 [Udemy](https://www.udemy.com/courses/search/?ref=home&src=ukw&q=django&lang=en&price=price-free) (無料のみメモ) |A Beginners Guide to Django!   | 英語  | 無料  |  2h |
|   | Try Django 1.11 // Python Web Development  | 英語  | 無料  |  8h |
||Python and Django Full Stack Web Developer Bootcamp|英語|1200円（割引中）|32h|
Markdownで表を書いてみた

いろいろ調べた結果を書こうと思ったときに、
表にしたいと思い、Markdownの表の書き方を調べてみました。

## １）シンプルな表
```
|  TH  |  TH  |
| ---- | ---- |
|  TD  |  TD  |
|  TD  |  TD  |
```

|  TH  |  TH  |
| ---- | ---- |
|  TD  |  TD  |
|  TD  |  TD  |


## ２）一気に表を作成

#### x(エックス)で、列数、行数をつなげる。列x行。間違って*とかしちゃいがち。
```
3x2
```

| 1 | 2 | 3 |
|:-:|:-:|:-:|
|   |   |   |
|   |   |   |


## ３）文字寄せ

```
:---|:---:|---:
```


| 1 | 2 | 3 |
|--:|:--:|--:|
|   |   |   |
|   |   |   |

## おまけ　headとbodyの区切り線は、3文字以上いるみたい。

#### 表にならない例
| 1 | 2 | 3 |
|--:|:--:|-:|
|   |   |   |
|   |   |   |

#### Qiitaのヘルプを見る場合は、
#### 簡易版）「？マーク：マークダウンの書き方」→「テーブル」
#### 詳細版）「？マーク：マークダウンの書き方」→「もっと詳しく知りたい方は[こちら](http://qiita.com/Qiita/items/c686397e4a0f4f11683d#テーブル記法)」

以上！
jsdoでdeeplearn.js

#概要
jsdoでdeeplearn.jsやってみた。

#サンプルコード

```
var dl = deeplearn;
var graph = new dl.Graph();
var math = new dl.NDArrayMathCPU();

var inputA = [1];
var inputB = [1];
var inputTensorA = graph.placeholder('A', inputA);
var inputTensorB = graph.placeholder('B', inputB);
var sum = graph.add(inputTensorA, inputTensorB);
var feeds = [{
    tensor: inputTensorA,
    data: dl.Array1D.new([4.0])
}, {
    tensor: inputTensorB, 
    data: dl.Array1D.new([2.0])
}];
var sess = new dl.Session(graph, math);
math.scope(() => {
    var res = sess.eval(sum, feeds);
    alert(res.getValues());
});


```

#成果物

http://jsdo.it/ohisama1/coBe
xvfb on ubuntuで自動起動させる


Ubuntu16.04とかだと/etc/init.d/につくるのはダサイのでsystemdでやるような感じで。

``` /etc/systemd/system/xvfb.service
[Unit]
Description=X Virtual Frame Buffer Service
After=network.target

[Service] 
ExecStart=/usr/bin/Xvfb :99 -screen 0 1024x768x24

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

をつくって

``` 
sudo systemctl enable /etc/systemd/system/xvfb.service
sudo service xvfb start
````

これでOK。


参考:
[Configure xvfb for Vivid (15.04) as a service using systemd](https://askubuntu.com/questions/621246/configure-xvfb-for-vivid-15-04-as-a-service-using-systemd)
auto-minor-modeでファイル名によってマイナーモードを起動する

Emacsの機能を有効化する仕組みには、[メジャーモードとマイナーモード][modes]があります。この記事では、マイナーモードを簡単に有効化するための機能として、`auto-minor-mode`を紹介します。

[modes]: https://ayatakesi.github.io/emacs/24.5/Modes.html#Modes

## モードとは

C言語用モード`c-mode`や、Markdown用モード`markdown-mode`のような特定の言語モードは、典型的でもっともふつうに利用されるメジャーモードです[^1]。

メジャーモードは、ファイルを開いたときに`auto-mode-alist`の設定に従って自動的に起動することができます。詳しくは[拡張子の関連付け：ファイル名ごとにモードを設定する - Qiita](http://qiita.com/tadsan/items/a21c268021b46b8a6b33)を読んでください。

しかしながら、同じ仕組みでマイナーモードを起動することはできません。

## auto-minor-mode

Emacs Lispパッケージ[joewreschnig/auto-minor-mode](https://github.com/joewreschnig/auto-minor-mode)は、上記のメジャーモードのための`auto-mode-alist`と同じ感覚で利用できる`auto-minor-mode-alist`を提供します。

### インストール方法

Emacs25以降が必要です。Emacs 25.1がリリースされてそろそろ一年になるので、いつまでも24.x系を使ってるひとはそろそろ系に移行してもいい頃では。もう遠からずEmacs 26.1がリリースされますしね。

MELPAが追加された環境では`M-x package-install`で`minor-minor-mode`を探してください。それ以外は特に設定の必要はありません。

## どうやって設定するの？

記述方法は`auto-mode-alist`ほとんど同じです。若干異なるのは、メジャーモードは同時にひとつまでしか起動できないので`auto-mode-alist`は最初に条件にマッチしたものだけが起動されますが、マイナーモードは複数起動可能なので、`auto-minor-mode-alist`は**条件にマッチしたもの全てが起動されます**。 <q>Run through an auto ALIST and enable all matching minor modes.</q>

### 基本的な設定

`init.el`などで以下のように記述することもできます。

```el
(add-to-list 'auto-minor-mode-alist '("\.php\\'" . foo-minor-mode))
```

しかし、このような設定は可能ですが、一般的には**無意味です**。なぜならば、ふつうにはフックを使って以下のように書いた方が良いからです。

```el
(add-hook 'php-mode-hook 'foo-minor-mode)
```

では、どのようなときに`auto-minor-mode`が役に立つのでせうか。

ドキュメントには以下のような例が挙げられます。つまり、**単なる拡張子とは別の条件でマイナーモードを起動する**場合です。

```el
(add-to-list 'auto-minor-mode-alist '("-theme\\.el\\'" . rainbow-mode))
```

この場合は、 `hoge.el` では発火せず、 `hoge-theme.el` のようなファイルでのみ`rainbow-mode`が起動します。

### 特定のディレクトリ

次に、あるディレクトリ以下のすべてのファイルでマイナーモードを起動したいときです。 (こちらの用法はドキュメントには載ってません)

```el
;; /etc/ ディレクトリでのみ foo-minor-mode を起動する
(add-to-list 'auto-minor-mode-alist '("^/etc/" . foo-minor-mode))
;; ~/work/your-project/ でのみ foo-minor-mode を起動する
(add-to-list 'auto-minor-mode-alist `(,(format "^%s/work/your-project/" (getenv "HOME")) . foo-minor-mode))
;; ディレクトリ名が重複しない、あるいは重複して問題ない場合はフルパスを指定する必要はない
(add-to-list 'auto-minor-mode-alist '("/work/your-project/" . foo-minor-mode))
```

## よくないところ

エディタの初期化ファイル(`init.el`)に、特定のプロジェクト固有の設定を書くような構成はかっこわるいんじゃないかなって気もします。そのために`.emacs.d`ディレクトリをGitHubの公開リポジトリに置けなくなる、みたいになってもやだしね。

また別のアプローチのアイディアはあるので、なにか形になったらまた紹介しますね ヾ(〃＞＜)ﾉﾞ

## 脚注

[^1]: それに留まらず、画面内にJPEGなどの画像を表示する`image-mode`や表形式のリストUIを提供する`tabulated-list-mode`のようなメジャーモードもあります。
TerminalでGitにコードを挙げる

## Terminal コードをgitにあげるときのメモ

### 1. Repositoryを作成する
まずプロジェクトの中までいく、そして以下のコマンドを実行

```
$  git init  // git repositoryをローカルで新規作成
$  ls  -la // .git ファイルが追加されてるか確認する。
```
### 2. プロジェクトをGitにアップする

```
$ git add. //　全ての変更コードがStagingkされる。
$ git status // 現在のステータスを確認
```

### 3.プッシュする

```
$ git commit -m “First Commit”
$ git status  // “nothing to commit” って表示されてたら、コミットok.
$ git log  // コミットの履歴を確認
```

### 4.　コミット前の状態にもどす。

git log でコミット番号を取得して、チェックアウトする
```
$ git checkout (“f46****51c63ab2***e62b3****e44175eee67e6b5”)　//こんなコードをコピペする
```

### 5. 他ブランチにチェックアウトする。

$ git branch　//他ブランチを確認
$ git checkout master　//マスターブランチに戻る
$ git status //どのブランチにいるか確認できる
$ git log  // 現在のタイムラインを確認でkりう。

### 6. 存在しているRepositoryにローカルのコードをプッシュする

```
$ git remote add origin　https://github.com/(yourgithubname)/worksflow.git // repositoryの https address をコピーする
$ git push -u origin master // プッシュ
```
paiza.IO 上に書いたソースコードおよび実行結果をJSONで取得する

#TL;DR
>現在の [paiza.IO](https://paiza.io/) の仕様上、直接 RAW でソースコードは取得できませんが、 JSON 形式でソースコードと実行結果を API 経由で取得できるので、そこから必要な部分を取り出します。

#API のリクエスト URL のフォーマット
> `https://paiza.io/api/projects/＜YourPaizaGistID＞.json`

###例

    https://paiza.io/projects/XUafcAYRnL6l2YTYDTVbew

対象の paiza.IO コードの URL が上記の場合、API のリクエスト URL は以下のようになる。

    https://paiza.io/api/projects/XUafcAYRnL6l2YTYDTVbew.json


##返される JSON のサンプル（取得できる結果）

```sample.json
{
    "id": 535660,
    "parent_id": null,
    "uid": "xxxxxxxxxxxxxxxxxxxxxx",
    "share": "public",
    "runner_id": "xxxxxxxxxxxxxxxxxxxxxx",
    "status": "completed",
    "language": "php",
    "input": null,
    "build_time_limit": null,
    "time_limit": null,
    "memory_limit": null,
    "build_stdout": null,
    "build_stderr": null,
    "build_exit_code": 0,
    "build_time": null,
    "build_memory": 25012000,
    "build_result": null,
    "stdout": "＜ここに実行した際の出力結果＞",
    "stderr": "",
    "exit_code": 0,
    "time": "0.37",
    "memory": 25012000,
    "connections": 2,
    "result": "＜実行結果。成功はsuccess＞",
    "live": null,
    "output_type": null,
    "schedule": null,
    "title": "＜paiza.IO上のタイトル＞",
    "saved_at": "2017-08-16T15:38:02.000Z",
    "run_at": "2017-08-16T15:37:33.000Z",
    "created_at": "2017-08-16T15:14:24.000Z",
    "updated_at": "2017-08-16T15:38:02.000Z",
    "is_owner": false,
    "network": true,
    "source_files": [
        {
            "id": 671527,
            "project_id": 535660,
            "filename": "＜コードのファイル名＞",
            "body": "＜ここにエスケープされたソースコード＞",
            "created_at": "2017-08-16T15:14:43.000Z",
            "updated_at": "2017-08-16T15:26:58.000Z",
            "position": null,
            "annotations": null
        }
    ],
    "external_projects": [],
    "favorite": false,
    "featured": false,
    "user": {
        "id": xxxxxx,
        "email": "＜登録メールアドレス＞",
        "use_password": false,
        "provider": "github",
        "username": "＜ユーザ名＞",
        "gender": null,
        "timezone": null,
        "image_url": "https:\/\/avatars0.githubusercontent.com\/u\/11840938?v=3",
        "created_at": "2017-06-09T17:41:40.000Z",
        "updated_at": "2017-08-14T11:31:39.000Z",
        "policy_id": 1,
        "locale": "ja-jp"
    }
}
```

#所感と利用用途

ノマドな開発の一貫として、ノートやタブレットから [TeamViewer](https://www.teamviewer.com/ja/) を使って自宅の Windows や OSX にアクセスできるようにしており、それなりに便利なのですが、ブラウザさえあれば開発できるような環境を作りたいな、という願望の模索をしています。

理想で言えば、関数やクラスなどの小さい単位の開発は `gist`+`paiza.IO` で行い、テストをパスしたら自動的にメインに統合するような仕組みです。

paiza.IO は GitHub の `gist` と連携できるので、個人だけであれば、ほぼ実現できているのですが、最近オープンソースなものに関しては、もっとコラボレーションできたらいいなと感じてきました。

しかし、他の人が `fork` （コピー）したコードは paiza.IO 上ではマージすることができません。そのため、レビューされた結果やコードはコピペするか、お互いに `git` コマンドを駆使する必要があるのですが、もっと手軽にコラボしたいのです。

そこで、`gist` 上にテストコードとソースコードをアップして paiza.IO 上で実行結果を確認（動作確認）できたら、ソースコードを本番に適用するなりできる方法はないかなと、 paiza.IO の運営に問い合わせたところ、API を使ってはどうかとアドバイスをもらったので、ちょっと調べた結果を記事にしてみました。
[Express] Visual Studio Code で Express のユニットテストをデバッグする

## この記事を実施した環境
* Windows10 Home 64bit
* node v8.2.1
* npm v4.0.5
* express v4.15.0
* jasmine-node v1.14.5
* Visual Studio Code v1.15.0

## 前提
jasmine-node でユニットテストを書いていること｡
なお jasmine-node は次のコマンドでインストールする｡

```
npm install jasmine-node --save-dev
```

上記実行後の package.json には jasmine-node のエントリが追加されているので確認｡

```javascript:package.jsonから抜粋
  "devDependencies": {
    "jasmine-node": "^1.14.5"
  }
```

## launch.json に次の構成を追加する
jasmine-node をインストールしてユニットテストを記述する環境が整ったので､あとはユニットテストを書くだけ｡
で､ Visual Studio Code でユニットテストのデバッグを行いたい場合､次の構成を launch.json に追加する｡

```javascript:launch.json(ユニットテストをデバッグするための構成)
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Debug for Unit Test",
      // jasmne-node の cli を指定する
      "program": "${workspaceRoot}/node_modules/jasmine-node/lib/jasmine-node/cli.js",
      "args": [
        // テスト対象のフォルダを指定する
        "test/",
        "--color"
      ],
      "cwd": "${workspaceRoot}"
    }
  ]
}
```
## ユニットテストのデバッグ
ユニットテストの対象は[このエントリ](http://qiita.com/ksh-fthr/items/6351e95922adbff22937) で記載した api-factory.js の createApi｡

* テスト対象

```javascript:api-factory.jsから抜粋
/**
 * REST-API を作る
 *
 * @param {oject} router 'express.Router()' で生成されるオブジェクト｡コール元で生成されたもの｡
 * @param {string} service サービス名
 */
function createApi(router, service) {
  const target = serviceTable[service];
  target.createApi(router);
}
```

* テストコード  
とりあえずメソッド呼び出しを検証するだけの単純なもの｡

```javascript:api-factory-spec.js
const express = require('express');
const router = express.Router();
const factry = require('../app/api-factory');
const hogehoge = require('../app/hogehoge');

describe('Test for api-factory', function() {
  beforeEach(function() {
  });
  afterEach(function() {
  });

  it('test for createApi', function() {
    // precondition
    spyOn(hogehoge, "createApi");

    // test
    factry.createApi(router, 'hogehoge');
    expect(hogehoge.createApi).toHaveBeenCalledWith(router);
  });
});
```

* デバッグできるかの確認  
 1. クモマークをクリックしてデバッグペインを開き
 1. リストボックスからユニットテスト用に追加した構成を選択して
 1. リストボックス横の実行をクリックするか､F5実行でデバッグを開始する
  ![jasmine-node-test01.png](https://qiita-image-store.s3.amazonaws.com/0/193342/2ea389ba-1ed1-c8eb-adf4-678b6cb3932e.png)
 1. ブレイクポイントでとまり､ステップ実行が行える
  ![jasmine-node-test02.png](https://qiita-image-store.s3.amazonaws.com/0/193342/5265172f-903f-9552-5434-813a551d82ac.png)

## おまけ
デバッグではなく単純にテストを実行したい場合は package.json に下記を追加して npm test を実行する｡

```javascript:package.json(テスト実行のための設定)
  "scripts": {
    "test": "node ./node_modules/jasmine-node/bin/jasmine-node ./test/"
  },
```

```:テスト実行
npm test
```

```:結果
> my-app@0.0.0 test C:\Users\ksh.fthr\work\Express\my-app
> node ./node_modules/jasmine-node/bin/jasmine-node ./test/

.

Finished in 0.005 seconds
1 test, 1 assertion, 0 failures, 0 skipped
```
Homesteadを使って複数のLaravelプロジェクトを作成する簡単な方法

Homesteadを使ってLaraveのプロジェクトを作成する場合、一つのプロジェクトなら大丈夫だが二つ目、三つ目とプロジェクトを増やそうとすると、```vagrant up```した時に```Homestead-7 already exist```的なことを言われて怒られてしまうため複数のプロジェクトを作成する際に必要なことをメモ。

(参考)自分がteratailで質問した際に頂いた回答を元に実行して出来ました
https://teratail.com/questions/86362

###(1)Homestead.yamlの編集
一つ目のプロジェクトを立ち上げる際にHomestead.yamlファイルを編集したと思いますが、２つ目以降のプロジェクトを作るときはここに追加して行きます。

```yaml
#foldersはプロジェクトが入るフォルダ、私の場合は共通で使ってます
folders:
    - map: ~/LaravelApp
      to: /home/vagrant/Code

sites:
    #一つ目のプロジェクト
    - map: dev.peeech.com
      to: /home/vagrant/Code/Laravel/public
      schedule: true
    #二つ目のプロジェクト
    - map: forum.app
      to: /home/vagrant/Code/forum/public
    #三つ目のプロジェクト
    - map: spa.app
      to: /home/vagrant/Code/spa/public

databases:
    - homestead #一つ目のプロジェクト
    - forum #二つ目のプロジェクト
    - spa #三つ目のプロジェクト
```
ここでhostsに新しく設定したドメインを設定します。

```192.168.10.10``` -> ```spa.app```

###(2)Vagrantをプロビジョニング
以下コマンドを実行。

```
vagrant up --provision
```

###(3)フォルダ内にlaravelをインストール
まず仮装マシンに接続

```
vagrant ssh
```

以下フォルダに移動

```
vagrant@homestead:~$ cd Code
vagrant@homestead:~/Code$
```

Laravelをインストールしてプロジェクトフォルダに移動

```
vagrant@homestead:~/Code$ composer create-project --prefer-dist laravel/laravel spa
vagrant@homestead:~/Code$ cd spa
vagrant@homestead:~/Code/spa$
```

これで```spa```フォルダの中にlaravelのファイルやフォルダが無事インストールされました。

```sap.app``` に接続してLaravelと書かれたTOPページが表示されれば成功！
<img width="994" alt="スクリーンショット 2017-08-17 0.42.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/121811/13736d31-840f-a722-9748-012348b9cc3a.png">



以上。
【論文読み】Structured Training for Large-Vocabulary Chord Recognition

コード進行自動認識技術においては、認識するコードラベルの種類をメジャートライアド＋マイナートライアド＋No Chordの計25種類に限定するのが一つの基準とされてきました。[前の記事](http://qiita.com/xiao_ming/items/c25642d9d095964410fd)では、ビートルズ楽曲においてこの基準で正答率約82%を記録することができました。
この基準でもまだまだ伸びしろがありそうですが、コード認識のもう一つの課題はさらに複雑なコードです。トライアドはコード体系の基本中の基本ですが、その他に7th、dim、susやaugみたいなタイプがあり、分数コード(転置など)もあります。それらを全て別クラスとみなすとクラス数は数百に膨れ上がるので、トライアドと混同せずに正確に識別するのも耳コピの一大チャレンジです。
#何が問題なのか
24種のトライアドは、数も少ないしお互い全く独立したクラスとみなしても大丈夫でした。しかし種類が増えるとかならずしもそうとは限りません。例えばC7,Cmaj7,C6などは、Cの構成音を含んでおり、一定のヒエラルキーが存在すると言えます。これらのクラスを単純に数百クラスの多クラス分類問題として解かせる（NNの出力層ユニット数を数百にするなど）と問題が生じます。
1.全ての間違いに課せられるコストが同一。例えばCをDmに間違えるようなエラーと、Cmaj7に間違えるエラーが、同程度の損失として計上されるので学習がうまくいかない。
2.トライアドがそれ以外のタイプに比べ圧倒的に多く（トライアドが八割以上を占める）、訓練データの偏りが大きすぎる。
この問題は、DeepLearningが流行る以前から、Chroma+HMMの枠組みの中で検討されてきました。VAMPプラグインのChordinoもそうです。しかしDeepLearningの枠組みの中では課題は認識されていながら解決策を提示した研究はほぼありませんでした。
ところでこの前GitHubでふと検索をかけてみたところ、音楽情報処理ライブラリlibrosaの中の人B.McFeeとJ.Bello先生が今年のISMIRに提出したコード認識論文とそのソースコードを[公開してたことを発見](https://github.com/bmcfee/ismir2017_chords)。まさにDeepLearningの枠組みでこの課題に対処し、そこそこ成果を出せたようです。どんなものなのか見てみましょう。
#論文読み
タイトル：Structured Training for Large-Vocabulary Chord Recognition
畳み込みNNを作ってパラメーターを学習させるという大枠は従来と変わらないようですが、NNの出口を工夫するというのが主な考えの模様。
##Encoder-decoder model
このNNの構造は論文ではEncoder-decoder modelと呼んでいます。NNは2パートでできていて、Encoderはスペクトラムを特徴量空間に変換して、decoderが特徴量を出力ラベル空間に変換するという。論文では機械翻訳とかに出てくるあのEncoder-decoder modelがベースになっていると言ってますが、ちょっと違うような。
それはともかく、Encoderは2層の畳み込みと1層の双方向GRUを通して、スペクトラム系列を特徴量系列に変換。特徴量のベクトルサイズは変わりますが、系列の長さTは変わらず。
![IMG_0499.PNG](https://qiita-image-store.s3.amazonaws.com/0/128515/34422deb-b0e3-944d-5b65-7401e7f4cfc1.png)

Decoderは、論文では2パターン用意されてました。一つは全連結を通してからSoftmaxをかけて出力するいつものやつ。もう一つは双方向GRUを通して出力に変換するもの。Encoderで得た特徴ベクトルを各箇独立で変換するか、前後文の影響を導入するかの違い。
##ターゲットの表示
タイトルにある通りStructured Trainingと呼ばれる部分がここ。コード記号を(ルート、構成音、ベース)の要素に分けて、NNでそれぞれを予測させるというやり方です。特徴量から、コードの三要素を「デコード」させるという事ですね。このような「構造化した」形式を用いることで、エラーに課せられるコストをより合理的にすることができます。データの偏りによる影響もある程度解消されるでしょう。
![IMG_0498.PNG](https://qiita-image-store.s3.amazonaws.com/0/128515/7a834213-0e89-4bb5-2d46-119fed737e9d.png)

音高クラスを予測させる部分(pitchesの部分)は、ベクトルの複数の値が1になるので、softmaxの代わりにsigmoid関数を通します。
学習の際は、教師データのコードラベルを図のような三つのスパース表示に変換してNNの出力と照らし合わせます。ラベルからスパース表示への変換はmir_evalというライブラリで簡単に行うことができます。
##コードタイプの判別
実際にコードを認識してもらう段階では、学習が済んだモデルで三要素を予測してもらったあと、それをコード記号に変換します。変換できない場合は未知のコードということで「X」を出力します。ソースコードでは、[pumpp](https://github.com/bmcfee/pumpp)という、これまたbmcfee氏が作ったらしきライブラリにやってもらってるようです。

##訓練データ
従来の訓練データを使います。1217曲あるようです。訓練データ偏りの問題は克服したのですが、セブンスのデータ量はやはり少なめなので上下6半音ずつピッチシフトを行い、12倍水増し(data augmentation)します。

#結論
実験では「Encoderの出口は全連結層か、双方向GRUか」「Decoderは従来形式か、Structured形式か」の違いで4パターンのモデルを作って評価実験を行いました。全面的に従来モデルよりも性能が優れていましたが(論文Table1)、4パターン同士を比較すると、Structuredの仕組みで複雑なコードの認識が特によくなっている事はない気もします。

#予告
しゃをみん自身が考えたコード認識システムが、今秋の[MIREX2017](http://www.music-ir.org/mirex/wiki/2017:Audio_Chord_Estimation)にて披露される予定です。上述の手法にちょっと似てるかもしれません。論文を出し損ねたのでフライング発表みたいな感じになりますがお楽しみに。論文も早く採択に持っていかないとヤバい。
品質は作りこまないかぎり実現できない

品質は作りこまない限り実現できない。品質を作りこんでこそプロだ。難しいことを実現しようとしていれば、なおさらだ。「うまくいくときだけ、うまくいく」なんて代物は、いつまでたっても実用にならない。
その当たり前のことをやれていない組織が増えてきているのではないか？
特に今の50代は、上の世代が作った枠組みで少し仕事したときの成果を、自分の実力と勘違いしている可能性がある。

## 品質へのこだわりを持とう
- 半導体プロセスでは、その品質確保に対してどれだけ労力が払われているか理解できますか。
    - クリーンルームでのプロセスで、汚染（コンタミネーション）を減らすことがどれだけ重要か理解できますか。
    - いっけん、違いのないような操作でも、わずかの違いでコンタミネーションが残ってしまって、実験がうまくいかなくなります。

クリーンルーム内での一つ一つの手順がどれだけ面倒であっても、それらを守らないと実用になる水準には達成することができません。

- [「後工程はお客様」の考え方で　各自の仕事に責任を持ちアウトプットを保証する](http://www.sysadmingroup.jp/kh/rpt/cat239/1757.html)　ことの積み重ねが、技術・製品を作り上げているのです。

たくさんの工程やたくさんの部分があるものでは、それまでの工程で積み重なるわずかながらの不具合が重なることで、もはや手の打ちようがないと思わせるほどにまで、台無しにしてしまうことができるのです。

生産を海外に移転した事業では、その移転先のずさんな管理のために、全数回収という大損失をもたらしている事例も見聞きしたことがあります。

### **品質の作りこみは研究の現場でも重要な問題です。**
機械学習の性能を議論するときに、ソースコードの品質は確保できているのか。できていなければ、研究は無意味です。使用しているデータの品質も重要です。研究に関するすべての手順の品質が確保されてようやく意味を持ちます。

あなたの現場の品質は作りこまれていますか。品質の作りこみに鈍感な場合には、あなたの仕事が成功する割合は低くなります。


### **同僚を含めた全てのユーザーの負担を減らそう**

　ソフトウェアを開発するときに、その開発中のバージョンを使う同僚を含めた全てのユーザーの負担を減らそう。適切なビルド手順書、実行手順書を書こう。そうすれば無用なトラブルは防げる。

#### こんなのはいやだ。
- 謎のおまじないをしておかないと絶対に動かないソフトウェア。
- 「それ相手先のソフトウェアのバージョンが古いよ？」って言われてもどうやって気づけばいいんですか？
- 「これ読み込むファイルがなかったのに、無理やり継続しているときのバグだね。」
- 「接続先の1番と2番が入れ替わっているバグだったよ。データを保管するモードでコンパイルしたのを実行しないと、絶対知りようがないね。」



### 品質を作りこむためのチェックリスト
以下は、チェックリストのほんの1例です。

- [ ] エラーを生じたときに、対処方法を示すメッセージをユーザー画面（開発者用）に表示しているか。
- [ ] エラーメッセージは謎の暗号ではなく、その開発を共有している他のメンバーに分かりやすいものになっているか。
- [ ] 対話的に復旧が可能なものならば、復旧させるヒントとなる再入力を受け付ける構成になっているか。
- [ ] 指定したファイルが間違えたときの再入力
- [ ] 入力ファイルがなかったときのエラーメッセージは分かりやすいものになっているか
- [ ] 設定ファイルのバグはどのようにしてつぶしてあるか
    - [ ] 設定ファイルのバグが枯れていることはどうやって確認できるか
- [ ] 接続先のサーバーが立ち上がっていなかったときの処理はどうか、
    - 回復不可能なものであって、次のステップに進んでも何の意味もなさない場合には、適切な対象方法を示して次回の起動を容易にする。
    - 接続先のサーバーが立ち上がっていないことを、わかりやすいメッセージを表示して、接続先のサーバーの立ち上げをまって、自動もしくは手動で接続を開始できるようにする。
    - 軽微なエラーの場合には、それ知らせた上で、「打ち切りますか、継続しますか」を選べるようにする。 

　これらのうち、どのような対応がいいのかは、開発の段階やライブラリを使う範囲によって変わってくる。
　
品質を作りこむために、チームの力をそろえていこう。
Sinatra 2.0でハマった非互換

Sinatra 2.0はoptional parametersの仕様が変更されたようです。

下記の単純なサンプルで確認しました。

```ruby
require 'sinatra'

get '/:query?' do
  (params[:query] || '') + "\n"
end
```

これを、Sinatra 1.4.8とSinatra 2.0.0で確認します。

Sinatra 1.4.8の場合
-------------------

```console
$ curl -L http://localhost:4567/

$ curl -L http://localhost:4567/test
test
$ curl -L http://localhost:4567/?query=test
test
$
```

Sinatra 2.0.0の場合
-------------------

```console
$ curl -L http://localhost:4567/

$ curl -L http://localhost:4567/test
test
$ curl -L http://localhost:4567/?query=test

$
```

Sinatra 2.0.0でもSinatra 1.4.8と同じ結果が得られるようにしたのが下記の例です。もっと簡単に書く方法がありましたら教えてください。

```ruby
require 'sinatra'

pattern =
  if Gem::Version.create(Sinatra::VERSION) < Gem::Version.create('2.0.0')
    '/:query?'
  else
    '/(:path)?(\?query=)?'
  end

get pattern do
  (params[:path] || params[:query] || '') + "\n"
end
```

追記
----

@scivola さんにアドバイスいただき、以下のように修正しました。

```ruby
require 'sinatra'

get %r{/([a-z]+)?} do |query|
  (query || params[:query] || '') + "\n"
end
```

さらに追記
----------

そもそも、クエリー・パラメータとパス・パラメータのどちらでも受け付けるという仕様を見直し、クエリー・パラメータでの問合せはパス・パラメータにリダイレクトさせるよう変更ました。修正後のコードは以下のようになりました。

```ruby
require 'sinatra'

get '/' do
  query =  params[:query]
  if query.nil?
    "\n"
  else
    redirect "/#{query}", 303
  end
end

get '/:query' do
  (params[:query] || '') + "\n"
end
```
指定日時より古いファイルの削除コマンド

# ■目的
すぐにわすれてしまうため自分用にメモ

# ■背景
まだまだシェルでファイルを消すシステムにも出会うので，いつも忘れてしまう．

# ■コマンド
```
find ./ -mtime +30 -name "*.tar.gz" | xargs ls -ltrh
```
これは対象ファイルを検索
findでHITしなければ，引数なしのlsになる

で，

```
find ./ -mtime +30 -name "*.tar.gz" | xargs rm -f
```
であれば削除．
でfindでHitしなければ，rmに何も渡らないので空振り

# ■考察
ほんとうは，S3のLifeCycleに任せるべきだけど，30日以上になってしまう・・・．
それより短い場合はシェルで削除しかないのかな．
Express の pg.connect で死んだ話(memo)

node.js(Express)で Postgres に接続する時に  
nmp install pg して
var pg = require('pg') して
pg.connect() して
って接続する方法がちょっと前の書籍やブログなどをみると書いてある。

ソースそのままコピって実行すると、ことごとく
pg.connect is not a function
がブラウザ上に表示されて死んでしまったので調べた。

https://stackoverflow.com/questions/45174120/pg-connect-not-a-function

どうも pg のバージョン 7.0.0 から使用方法が変わったとのこと。
ここに記載されている方法にソースを書き換えるか、
6.x.x 系の過去の pg を使用するかだそう。

package.json 見るとたしかに 7.0.0 系を使ってた。
で、試しに npm uninstall pg → npm install pg@6 して過去バージョンしたら普通に動いた。悲しい。

意識が低いので、6.x.x でそのまま進める。
Cordovaで開発したAndroidアプリをネイティブアプリに移行アップデートする

# そもそも移行アップデートできるの？
Cordovaで開発したAndroidアプリからJava等で開発したバージョンにアップデートできるかどうか、断言している情報は見つからなかったのですが、普通に**可能**です。

# アップデート方法
[アプリケーションID](https://developer.android.com/studio/build/application-id.html)と[証明書](https://developer.android.com/studio/publish/app-signing.html)を同一にして、アップデート公開するだけ。

# データの引き継ぎ方法
[SharedPreferences](https://developer.android.com/reference/android/content/SharedPreferences.html)に情報を保存しておくと、ネイティブアプリからも読み出すことができます。
（[edelworksgithub/SharedPreferences](https://github.com/edelworksgithub/SharedPreferences)のようなCordovaプラグインで読み書き可能です）

もしネイティブアプリに移行する可能性があれば、LocalStorageだけではなくSharedPreferences等のネイティブから読み出せる領域にも情報を保存しておくことをオススメします。
一番簡単なfish shellの導入　rails+ubuntu16.04　2017/8/17

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)
参考サイト
https://hackercodex.com/guide/install-fish-shell-mac-ubuntu/
https://github.com/oh-my-fish/oh-my-fish
https://github.com/oh-my-fish/plugin-rbenv
以下は日本語のfishのwiki
http://fish.rubikitch.com/abbr/

###fishとは
bashの代わりに使えるshellで超強力な補完がデフォルトでついてきます。例えば cd　と打つと　cd github などと補完してくれます。コマンドラインから一行でエイリアスを設定出来ます。プラグインをほぼ入れる必要がないので管理が簡単です。

###fishのインストール
インストールは次の三行をターミナルで実行します。

```bash:qiita.sh
$ sudo apt-add-repository ppa:fish-shell/release-2
$ sudo apt-get update
$ sudo apt-get install fish
```

次の行でfishをデフォルトシェルに設定します。(この記事を最後まで進めたらパソコンを再起動しよう。)

```bash:qiita.sh
$ chsh -s /usr/bin/fish
```

設定に移ります
ディレクトリを作ります。

```bash:qiita.sh
$ mkdir -p ~/.config/fish
```
設定ファイルを作ります。設定はこのファイルに書かれます。

```bash:qiita.sh
$ vim ~/.config/fish/config.fish
```
次に

```bash:qiita.sh
$ fish
```
と打ちfish shellに切り替えてから($ bash で元に戻れる)

```fish:qiita.sh
$ set -g -x PATH /usr/local/bin $PATH
```
pathをロードします。

###fishの設定
ターミナルに

```fish:qiita.sh
$ fish_config
```
で設定ページをブラウザ(http://localhost:8000/) で開いて色々GUIで設定できます。これがfishの素晴らしさ。

```fish:qiita.sh
$ fish_update_completions
```
で設定を反映させます。

###プラグイン管理マネージャ
oh-my-fishでrbenvプラグインを入れないとrails commandが使えません。

oh-my-fishのインストール

```bash:qiita.sh
$ git clone https://github.com/oh-my-fish/oh-my-fish
$ cd oh-my-fish
$ bin/install --offline
```

rbenvプラグインのインストール

```bash:qiita.sh
$ omf install rbenv
```

これで環境は完成です。
うまく行かない人は、一番上のリンクを読んでください。

###まとめ
bashを知らない人でもfishはほとんどの人が触ったことがあります。
時代はfishです。
fedora26 でのVBoxGuestAdditionsのインストール手順

# 手順
1. root になる

    ```Bash
    sudo -i
    ```

2. カーネルのアップデート

    ```Bash
    dnf install kernel-devel-$(uname -r)
    dnf upgrade
    reboot
    ```

3. GuestAdditions をマウントする
    VirtualBoxのGUIから
    [デバイス]→[Guest Additions CD イメージの挿入…]

    ```Bash
    mkdir /media/VirtualBoxGuestAdditions
    mount -r /dev/cdrom /media/VirtualBoxGuestAdditions
    ```

4. いくつかのパッケージがインストールされていることを確認する

    ```Bash
    dnf install gcc kernel-devel kernel-headers dkms make bzip2 perl
    ```

5. KERN_DIR 環境変数を追加する

    ```Bash
    KERN_DIR=/usr/src/kernels/`uname -r`
    ```

6. GuestAdditions をインストールする

    ```Bash
    cd /media/VirtualBoxGuestAdditions
    ./VBoxLinuxAdditions.run
    ```

7. 再起動

    ```Bash
    reboot
    ```

# 参考
[VirtualBox Guest Additions on Fedora 26/25, CentOS/RHEL 7.3/6.9/5.11](https://www.if-not-true-then-false.com/2010/install-virtualbox-guest-additions-on-fedora-centos-red-hat-rhel/)
Tips: kernel32-sysのコンパイルが失敗する


## 現象
コンパイル時に以下のエラーが出て```kernel32-sys```のコンパイルが失敗する。

```
error: linking with `link.exe` failed: exit code: 1

（中略）

Caused by:
  Could not compile `kernel32-sys`.
```

## 対処方法
Rustの（windows-msvc版ではなく）windows-gnu版をインストールする。
https://www.rust-lang.org/en-US/other-installers.html#standalone

## おまけ
C++ build tools for Visual Studioもインストールしなくて良くなる。

## 環境
- OS: Windows7 32bit
- Rust: 0.19.0
- Cargo: 0.20.0

## 参考
https://github.com/rust-lang/cargo/issues/2242
OS Xのメニューから呼び出せるカレンダーを作ってみる


夏休みの工作というか

### 開発環境

+ XCode8.3.3
+ Swift3
+ OS X 10.12.6


![スクリーンショット 2017-08-16 01.12.11.png](https://qiita-image-store.s3.amazonaws.com/0/40693/b08236b2-22c6-4957-8793-1b6a433b46f4.png "スクリーンショット 2017-08-16 01.12.11.png")



元ネタはこちらです。
[OS X Tutorial: Menus and Popovers in Menu Bar Apps](https://www.raywenderlich.com/98178/os-x-tutorial-menus-popovers-menu-bar-apps)


githubはこちら
[MenuCalendar](https://github.com/rnsm504/MenuCalendar)


ちょっと今日が何周目かと確認したい時に、メニューで見れるカレンダーが欲しいと思っていたので、作ってみました。

Swiftで日付をいじるやり方をいつも忘れるので今回のやり方をメモがわりに

```
        let calendar = Calendar.current
        var comps = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: Date())
        
        day = comps.day
        month = comps.month
        year = comps.year
        
        //月初
        comps.day = 1
        comps.hour = 0
        comps.minute = 0
        comps.second = 0
        let firstdate = calendar.date(from: comps)
        comps = calendar.dateComponents([.year, .month, .weekday], from: firstdate!)
        firstWeekDay = comps.weekday! - 1
        
        let mon = comps.month! > 10 ? String(describing: comps.month!) : "0" + String(describing: comps.month!)
        thisMonth = String(describing: comps.year!) + mon
        
        let range = calendar.range(of: .day, in: .month, for: date)!
        月末
        endDay = range.upperBound - 1
```

```
//月単位の加算
var comp = DateComponents()
        comp.month = m
        let calendar = Calendar.current
        date = calendar.date(byAdding: comp, to: date)!
```
Windows(7)でファイルをバックアップするコマンドを作成

## 背景

Windowsでバージョン管理はしていないが、定期的にバックアップを取っておきたかったので、ちょっとしたツールを作成しました。
まぁ、`xxxx_20170816.xls`とかつけるのも嫌だったので。（バージョン管理しろよって話でもありますが...）

## 作ったスクリプト

Windows7でしか検証していません。

* リポジトリは→[windows-simple-file-copy](https://github.com/pyohei/windows-simple-file-copy)

## 使い方

上記のリポジトリをダウンロード or クローンして、以下のようにして実行。

```bat
cd windows-simple-file-copy

rem 第一引数にバックアップしたいファイル or フォルダを選択  
simple-copy.bat %USERPROFILE%¥hoge
```

バックアップデータは`%USERPROFILE%¥backup`配下にコピーされます。

## 活用例

僕は以下の2つのパターンで使っています。

### 1. コマンドに設定

コマンドプロンプトで以下のように設定し、

```bat
doskey backup=C:¥usr¥bin¥backup¥simple-copy.bat $*
```
バックアップしたいときに `backup test.txt`と実行してます。
コマンドプロンプトの立ち上げと同時に実行できるようにした場合は、[Windows ユーザは cmd.exe で生きるべき。](https://mattn.kaoriya.net/software/why-i-use-cmd-on-windows.html)を参考にしてください。

### 2. タスクスケジューラに設定

Windowsのタスクスケジューラに設定して、毎日一回バックアップをとるようにしていたりします。

## その他

さっと適当に作ったコマンドなので、問題等あれば言って(or PR）してください。
Tips: dotenvのコンパイルが失敗する

## 現象
`Diesel`のコンパイル時に以下のエラーが出て```dotenv```のコンパイルが失敗する。

```
error[E0046]: not all trait items implemented, missing: `extract_backtrace`

（中略）

error: Could not compile `dotenv`.
warning: build failed, waiting for other jobs to finish...
error: build failed
```

## 対処方法
以下を```Cargo.toml```に明記する。

```
[dependencies]
dotenv = "0.10.*"  # バージョンは適宜変更
```

## 環境
- OS: macOS Sierra 10.12.6
- Rust: 0.19.0 / 0.21.0 Nightly
- Cargo: 0.20.0
- Diesel: 0.15.2
- dotenv: 0.10.1

## 参考
https://github.com/purpliminal/rust-dotenv/issues/69
OpenAI Gym参考資料まとめ


OpenAI Gymで参考になった資料やライブラリをまとめていきます．

何かしらの役に立ちそうでしたら幸いです．

## 本家

### ◇ OpenAI Gym

- https://gym.openai.com/), Brockman et al., 2016.

あと，下記ページに各種アルゴリズムの問題ごとのスコア一覧が記載されていて参考になります．

- https://gym.openai.com/algorithms?groups=classic_control
 
## 講義資料

### ◇ Reinforcement Learning: An Introduction

- http://people.inf.elte.hu/lorincz/Files/RL_2006/SuttonBook.pdf
- 英語で450ページ以上ありますが，丁寧な説明となっています．

### ◇ UCL Course on RL, Silver, 2015.

- http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching.html
- University College Londonの講義資料

### ◇ Markov Decision Processes and Reinforcement Learning

- https://s3.amazonaws.com/ml-class/notes/MDPIntro.pdf
- Author: J.Sholz
- 行動価値観数$Q$からQ学習の導出あり．

### ◇ RL and MDP
    
- https://www.cs.cmu.edu/~avrim/ML14/lect0326.pdf
- Reinforcement learning and Markov Decision Processes (MDPs)

### ◇ Awsome-RL
    
- 動画での解説からコードまで非常に充実しているサイトです．
- http://aikorea.org/awesome-rl/

## まとめや流れサイト

### ◇ Tutorial: Deep Reinforcement Learning, Silver, 2016.

- http://icml.cc/2016/tutorials/deep_rl_tutorial.pdf
- DeepMindの人の深層教科学習の説明．
- 強化学習の基礎は知っている前提

### ◇ 強化学習で参考になったサイトまとめ
   
- http://qiita.com/eve_yk/items/2ace6d4c1dad7e912df1
- 一番参考になった気がします．

### ◇ 深層強化学習の動向 / survey of deep reinforcement learning

- https://speakerdeck.com/takuseno/survey-of-deep-reinforcement-learning
- Seno et al., 2017.
- 強化学習の初歩から最先端の研究資料まで網羅

## 論文関連

### ◇ Arixiv Sanity Preserver

- Arixivの人気の高い論文を検索しやすいので重宝しています．
- http://www.arxiv-sanity.com/toptwtr

## ライブラリ

### ◇ Keras

関数近似部分を書くのが楽です．

### ◇ Keras-RL

Kerasで書かれた強化学習ライブラリです．
多くの深層教科学習のアルゴリズムが揃っています．
色々と動かない気がするので，お試しで使うにはありかもしれません．

### ◇ Chainer

日本語で教科学習のブログを書いている人は，Chainerで書いている人が多い気がします．
Tips: cargo install diesel_cliが失敗する

## 現象
```cargo install diesel_cli```とすると以下のエラーが出て失敗する。

```
error: linking with `cc` failed: exit code: 1

(中略)

  = note: ld: library not found for -lmysqlclient
          clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

## 解決方法
例えばPostgreSQLを使用するときは
```cargo install diesel_cli --no-default-features --features "postgres"```
とする。

## 環境：
- OS: macOS X 10.12.6
- Rust: 1.19.0
- Cargo: 0.20.0
- Diesel_cli: 0.15.0

## 参考
https://github.com/diesel-rs/diesel/issues/403