OmniAICreator/Qiita-1.07M huggingface dataset:
iOSのMetal Performance Shadersでニューラルネットを実行する際のモデルの渡し方

# Metal Performance Shadersについて
iOS10からiOSで畳み込みニューラルネットを作れるようになりました。畳み込み層、プーリング層、正規化層、活性化関数など基本的なツールは揃っています。ただし最適化アルゴリズムなどは揃っておらず、学習はできません。Pythonなどで学習したモデルをプロジェクト内に持ってきてその重みやバイアスを使用することになります。Appleの[サンプルコード](https://developer.apple.com/library/content/samplecode/MPSCNNHelloWorld/Introduction/Intro.html)でもMNISTを学習したモデルをプロジェクト内に置いていますが、肝心のファイルの拡張子は.dataとなっており、どんな種類のファイルなのかわからなかったので調べてみました。

## Pythonライブラリにおけるモデルの保存形式
Chainerのドキュメントを見てみると`save_npz`と`save_hdf5`という二つのモデル保存用メソッドがあります。npzはNumPy配列を保存するファイル形式のようです。後者のHDF5はHierarchical Data Format 5という科学技術計算などで用いられるファイル形式のようです。
参考：http://yukisakamoto.hatenablog.com/entry/20130413/1365825028

## SwiftでのHDF5の扱い方
SwiftでHDF5を読み取るには[HDF5Kit](https://github.com/aleph7/HDF5Kit)というオープンソースがあり、これを使えばChainerやKelasで学習したモデルを簡単にSwiftから読むことができました。
ただしHDF5Kitはdataset名などを指定する必要があるため、事前にHDF5ファイルの中身を知っておく必要があります。そこで使ったのが[HDF5View](https://support.hdfgroup.org/products/java/hdfview/)というソフトです。これを使うと以下のようにHDF5ファイルの中身を読むことができます。
<img width="281" alt="スクリーンショット 2017-01-31 0.54.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/62625/0443a5dc-a3a9-8e14-1555-188db568ad1e.png">


## おわりに
一通り触った限りMPSではまだInference(推論)しかできないようですが、（fast-neural-styleなどをやってみたかったが難しかった。）ChainerやKerasのモデルを簡単に活用できるとなればiOSデバイス単体で実行するディープラーニングの可能性も大きく広がりますね。今後が楽しみです。

## 参照
今回の実装にあたり、情報と呼べる情報が非常に限られている中、@shu223様の以下の記事を大変参考にさせて頂きました。ありがとうございます。

[iOSのMPSCNNによる手書き数字認識のサンプルを読む - 前編
](http://qiita.com/shu223/items/28122f5668cf1547e8fe)
[iOSのMetalで畳み込みニューラルネットワーク - MPSCNNを用いた手書き数字認識の実装
](http://qiita.com/shu223/items/bdd537f38872a5af4e4c)
ストアドファンクションを利用してcheck制約でサブクエリを発行する


データの挿入や更新を行う際蓄積されたデータとの比較をしたい、あるいはデータの整合性を確保するためにほかのデータとの関係性を見たいということがあると思います。__こういうときはcheck制約においてサブクエリを利用したくなるのですが――結論から述べると、少なくともPostgreSQLではできませんでした。__標準SQLでは「check制約でサブクエリを発行する」ことが認められているので、近い将来サポートされるとは思いますが……。それはさておき、上記のような要件を達成するためいろいろと試行錯誤した結果、__ストアドファンクションを利用してサブクエリを発行した風に見せかける__のが手っ取り早そうという結論に至りました。

たとえばホテルの部屋の予約状況を示すテーブルbookingがあり、要素として部屋番号、予約開始日、予約終了日を持っているとします。「ある部屋がいつからいつまで予約されているのか」を記録しているというイメージです。__さてホテルですからダブルブッキングは避けねばなりません。ただしある予約の開始日と別の予約の終了日が同一になることは許したい。__これをcheck制約で実現しようとすると、サブクエリを発行する必要がありますが、上述したようにそれは難しいので、ストアドファンクションを利用したいと思います。

```sql
-- bookingテーブルを定義する。
create table booking (
    booking_id integer primary key,
    room_id    integer not null,
    start_day  date    not null,
    end_day    date    not null,

    -- 開始日は終了日より先で、開始日と終了日は同一であってはならない。
    constraint invalid_period check (start_day < end_day)
);

-- ダブルブッキングを数える関数。更新したい予約の部屋番号、開始日、終了日を指定する。
-- ただしある予約の開始日と別の予約の終了日が重なってもダブルブッキングとして数えない。
create function count_double_booking(integer, date, date) returns bigint as $$
    select count(*)
    from booking
    where booking.room_id = $1
    and daterange($2, $3) && daterange(start_day, end_day)
$$ language SQL; 

-- check制約を設けて、ダブルブッキングを禁じる。
alter table booking 
add constraint double_booking 
check (count_double_booking(room_id, start_day, end_day) = 0);

-- 正常に挿入できるデータ。
insert into booking values (1, 1, '2016-01-01', '2016-01-04');
insert into booking values (2, 1, '2016-01-04', '2016-01-05');
insert into booking values (3, 2, '2016-01-01', '2016-01-05');
insert into booking values (4, 3, '2016-01-01', '2016-01-06');

-- ダブルブッキングが生じるため挿入と更新に失敗する。
insert into booking values (5, 1, '2016-01-02', '2016-01-03');
update booking set end_day = '2016-01-05' where booking_id = 1;

/*
ERROR:  リレーション"booking"の新しい行は検査制約"double_booking"に違反しています
DETAIL:  失敗した行は(5, 1, 2016-01-02, 2016-01-03)を含みます

ERROR:  リレーション"booking"の新しい行は検査制約"double_booking"に違反しています
DETAIL:  失敗した行は(1, 1, 2016-01-01, 2016-01-05)を含みます
*/
```
余談: PostgreSQLの範囲型を初めて利用したのですが、便利ですね。「期間」「区間」を扱うのが楽になりそうです。
スマートフォンなどでフォーム関連の要素に勝手にスタイルがついてしまうのを防ぐ方法

スマートフォンなどでフォーム関連の要素に勝手にスタイルがついてしまうのを防ぐ方法

```css
-webkit-appearance:none;
```

【参考】
http://webdev.jp.net/webkit-appearance-defaurt-reset/
RESAS-APIをつかってみました

#RESAS-API概要
RESAS(地域経済分析システム) についてはこちら
> RESASポータル
> https://resas-portal.go.jp/

#RESAS-APIをつかうには
RESASで使用されているデータを取得するAPIが2016年11月1日に公開されました。
さっそくこのAPIを使用して、データの内容をWebページに表示させてみたいと思いますが、RESAS-APIを使用するにはAPIキーが必要です。
以下のRESAS-APIポータルサイトにて利用登録し、APIキーを発行してもらいます。
> RESAS-APIポータル
> https://opendata.resas-portal.go.jp/

#RESAS-APIを使用して都道府県一覧を表示
RESAS-APIを使用して都道府県一覧をWebページ上に表示してみます。
都道府県一覧を表示するにあたり、使用するAPIのURLはhttps://opendata.resas-portal.go.jp/api/v1/prefecturesになります。

以下、都道府県一覧表示のサンプルコードです。
javascriptで実装してみました。

```
<!DOCTYPE html>
<html>
<head>
<title>RESASお試し</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>
<script>
    $.ajax({
        url: "https://opendata.resas-portal.go.jp/api/v1/prefectures",
        type: "GET",
        headers: {
            'X-API-KEY': // ここにAPIキー文字列を記述
        },
        async: "false",
        success: function(result_data) {
            for ( i = 0; i < result_data.result.length; i++ ) {
                document.getElementById("resas_data").innerHTML += result_data.result[i].prefName + "<br />";
            }
        }
    });
</script>
<div id="resas_data"></div>
</body>
</html>
```

サンプルコードの表示結果は以下のようになりました。
![resas-api_sample.png](https://qiita-image-store.s3.amazonaws.com/0/88747/fcbd758a-b230-c916-e807-256301fcc2dc.png)
Python GdalでGeoTiff画像を結合 or 分割する

自分用メモ。
Gdalについては、自分はWindows環境なので、おなじみの[Unofficial Windows Binaries](http://www.lfd.uci.edu/~gohlke/pythonlibs/)から拾ってきてインストールしました。
#結合
コマンドプロンプトで例えば以下を実行。

```
gdal_merge -o output.tif input1.tif input2.tif input3.tif input4.tif
```
-oオプションは出力ファイル。その後は結合に用いる画像を渡すのだが、ワイルドカードが使用不可だそう。
そんな時のために、--optfileオプションを用いて画像のリストファイルを渡すことができる。

例えば、`dir /b /s *.tif > list.txt`などしてリストファイルを作成し、

```
gdal_merge -o output.tif --optfile list.txt
```

とすればよい。
重なっている部分は、先に指定した画像が下になる。

#分割
例えば以下を実行。

```
gdal_retile -ps 5000 4000 -targetDir target source.tif
```
-psは分割単位（横ピクセル、縦ピクセル）。-targetDirは出力先フォルダで、指定が必須とのこと。source.tifが分割元画像となる。

##その他
他のオプション等については、オフィシャルページを参照。
http://www.gdal.org/gdal_merge.html
http://www.gdal.org/gdal_retile.html

以下のホームページを参考にさせていただきました。
http://mf-atelier.sakura.ne.jp/mf-atelier/modules/tips/tec/gdal-ogr_tips.html
http://d.hatena.ne.jp/Yusuke_S/20090427/p1
http://d.hatena.ne.jp/miv/20131029/1383005805
JsHintのメモ




# 警告メッセージ集

## This character may get silently deleted by one or more browsers

ファイルの先頭にこの警告メッセージが表示されます。
直訳すると「この文字は1以上のブラウザによって、静かに削除されるかもしれません」。
原因はUTF-8の「BOM付き」です。
`.jshintrc`ファイルに`"-W100": true`を設定すれば、警告は消えます。

しかし、以下の理由から、BOMなしUTF-8に変換した方がよいと思います。
https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF
>UTF-8は文字コードとしてASCIIを前提としたプログラムでもおよそ支障なく動作するように設計されているが、BOMによって正常に処理できなくなる場合がある。Unicodeの規格において、UTF-8においてBOMは容認されるが、必須でも勧められるものでもないとされている。

http://stackoverflow.com/questions/24605401/jshint-error-this-character-may-get-silently-deleted-by-one-or-more-browsers
http://stackoverflow.com/questions/16735299/jshint-how-do-disable-the-check-for-unsafe-characters-for-comments
HAL_Driver + STM(Nucleo)系マイコンでI2C通信をする

## 概要

* HAL_Driverを使用してセンサーとI2C通信を行います。

## 環境

* Nucleo
* CubeMX
* System Workbench for STM AC6

## 実装

* ピンの設定等はCubeMXでマイコンボードに合わせたものとします。
* 基本的にはCubeMXでI2Cの設定を適切にしていれば自動生成されるコードのハンドルを使用すれば通信ができるはずです。
* 自動生成されたコードのmain.cにグローバル変数としてi2cのハンドルが宣言されているのでHAL_Initなどの初期化コードのあとに通信部分の実装を記述すればI2Cの通信が行えます。
* 実際にI2C通信を行う場合は下記APIを使用します。

```c

#define I2C_ADDRESS 0x82
#define I2C_BUF_SIZE  8
#define I2C_TIMEOUT 100

uint8_T tx_buf[I2C_BUF_SIZE] = { 0x00 }, rx_buf[I2C_BUF_SIZE] = { 0x00 };

/**
 * I2C 送信
 */
HAL_I2C_Master_Transmit(&hi2c1, I2C_ADDRESS, tx_buf, I2C_BUF_SIZE, 100);  

/**
 * I2C 受信
 */
HAL_I2C_Master_Receive(&hi2c1, I2C_ADDRESS|0x01 , rx_buf, I2C_BUF_SIZE, 100);  
```

* 上記2つのAPIからはHAL_StatusTypeDef型の実行結果が返ってくるので戻り値の値でハンドリングを行います。
* うまくいかない場合でもHAL_Driverを使用している場合はソースコードが内包されているのでステップ実行などで原因を探ります。

デフォルトでは最適化オプションがO2に設定されているのでデバッグ実行がし辛くなっています。
最適化されてもうまく動くコードを記述することが理想ではありますが、
開発段階では、プロジェクトエクスプローラでプロジェクトを右クリックしてPropertyから
C/C++ Build > SettingsからOptimizationをNoneに設定しておけば、
デバッグビルド時にデバッガがいい感じに動いてくれます。
Flashに余裕がない場合は気合でカバーします！
macOS Sierraでのcx_Oracleのインストール方法

# 概要
PythonからOracleに接続するためのライブラリであるcx_Oracleのインストール方法です。

## 環境
```bash
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.3
BuildVersion:   16D32
$ python --version
Python 3.5.2 :: Anaconda 4.2.0 (x86_64)
$ pip --version
pip 9.0.1 from /Users/nobukatsu/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages (python 3.5)
```

# 手順
## Instant Clientのダウンロードと配置

[http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html](http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html)

上記のページから

- instantclient-basic-macos.x64-[バージョン番号].zip
- instantclient-sdk-macos.x64-[バージョン番号].zip

の2つをダウンロードして解凍し、適当な場所に配置する。

例：

```
/Users/nobukatsu/devel/library/oracle/instantclient_12_1
```

## シンボリックリンクを作成

```bash
$ pwd
/Users/nobukatsu/devel/library/oracle/instantclient_12_1
$ ln -s libclntsh.dylib.12.1 libclntsh.dylib
$ ln -s libocci.dylib.12.1 libocci.dylib
```

## 環境変数を設定する
.bash_profile等で環境変数を設定する。

```bash
export ORACLE_HOME=~/devel/library/oracle/instantclient_12_1
export PATH=$ORACLE_HOME:$PATH
export DYLD_LIBRARY_PATH=$ORACLE_HOME
export LD_LIBRARY_PATH=$ORACLE_HOME
export FORCE_RPATH=1
```

## cx_Oracleのインストール

```bash
pip install --no-cache-dir cx_oracle
```

## 確認
以下を実行してエラーが出なければインストール成功。

```bash
python -c "import cx_Oracle"
```
VBAで文字列結合を便利にすることで効率的にプログラミング


# 背景
- Excelで文字列結合をする方法には「&」と「CONCATENATE()」がある
- しかし、どちらの方法もセル一つ一つ指定する必要がある
    - `=A1&A2&A3`
    -  `=CONCATENATE(A1,A2,A3)`
-  せっかく関数があるのに範囲選択ができない（本当になんのための関数？）
-  これを範囲選択可能にしたVBAを記載した[サイト](http://www.relief.jp/itnote/archives/001342.php)がある
-  単純な文字列結合以外にも私の場合、以下のようなケースで文字列結合ができるとより便利になると思い上記サイトを参考に関数を作成した
-  関数を利用してかれこれ5年以上ですが、とても便利でかなり頻繁に利用します

| No | 言語 | 目的 | 文字列結合方法 |
|:-----:|:-----|:-----|:-----|
| 1 | SQL | カラムの大量選択 | 区切り文字「カンマ」 |
| 2 | SQL | CASE文の大量生成 | 区切り文字「スペース」 |
| 3 | Markdown | テーブル作成 | 区切り文字「パイプ」 |
| 4 | R, Python | headerを定義する | 区切り文字「カンマ」クォート「シングルクォーテーション」|

# 関数のコード
- https://github.com/9en/useful-tool/blob/master/VBA_function/ConcatenateRangeText.bas

# 関数の作り方（Excelへ登録の仕方）
- ネットにたくさん記事があるので各自で調べてください

# 使用例
## 区切り文字「カンマ」
### Excel
|  | A | B | C |
|:-----|:-----|:-----|:-----|
|1|  |dt|  |
|2|  |product|  |
|3|  |price|  |

### 関数

```vba
=ConcatenateRangeText_comma(B1:B3)
```

### 結果
```
dt,product,price
```

## 区切り文字「スペース」
### Excel
|  | A | B | C | D | E | F |
|:-----|:-----|:-----|:-----|:-----|:-----|:-----|
|1|  |,SUM(CASE WHEN product =|'car'|THEN 1 ELSE 0 END) AS|product_car|  |
|2|  |,SUM(CASE WHEN product =|'bike'|THEN 1 ELSE 0 END) AS|product_bike|  |

### 関数
```vba
=ConcatenateRangeText_space(B1:E1)
=ConcatenateRangeText_space(B2:E2)
```

### 結果
```
,SUM(CASE WHEN product = 'car' THEN 1 ELSE 0 END) AS product_car
,SUM(CASE WHEN product = 'bike' THEN 1 ELSE 0 END) AS product_bike
```

## 区切り文字「パイプ」
### Excel
|  | A | B | C | D |
|:-----|:-----|:-----|:-----|:-----|
|1|  | 2 | SQL |  |
|2|  |3| Markdown |  |
|3|  |4| R,Python |  |

### 関数
```vba
=ConcatenateRangeText_separator(A1:D1,"|")
=ConcatenateRangeText_separator(A2:D2,"|")
=ConcatenateRangeText_separator(A3:D3,"|")
```

### 結果
```
|2|SQL|
|3|Markdown|
|4|R,Python|
```

## 区切り文字「カンマ」クォート「シングルクォーテーション」
### Excel
|  | A | B | C |
|:-----|:-----|:-----|:-----|
|1|  |dt|  |
|2|  |product|  |
|3|  |price|  |

### 関数
```vba
=ConcatenateRangeText_singlequote_comma(B1:B3)
```

### 結果
```
'dt','product','price'
```

## その他
- これに似たコードをいくつか用意しております


# 参考
- http://www.relief.jp/itnote/archives/001342.php
Mac上でMPIを使用する

Mac上でMacPortsを利用してMPIを使用する時のメモ．
未検証．

# 環境

```
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1217

$ xcodebuild -version
Xcode 8.2.1
Build version 8C1002

$ port version
Version: 2.4.0
```

# インストール

OpenMPIとMPICHの二つがある．
port名はそれぞれ`openmpi`, `mpich`で，どちらもさらにsub-portsがある．

末尾に`default`が付いている名前のsub-portsがデフォルトでインストールされる．
これはXcodeのclangをラップする．

## openmpi/mpich-defaultが動かない

ところが，この`*-default`はプログラムのコンパイルは通っても，MPIの呼び出しで止まってしまう．

## openmpi/mpich-gcc6を使用する

末尾に`gcc6`が付くsub-portsに切り替えたところ，こちらは動く．
と言っても，検証ができたレベルではない．
ひとまずMPIの初期化には成功しているようだ．

このsub-portsはMacPortsのgcc6をラップする．
他にも，色々なコンパイラをラップするsub-portsがあるので，丁度良いものを選べばよい，ということなのだろうか？

# コーディング時のtips

## MPI_VERSION

https://twitter.com/Flast_RO/status/837904400156766208 より，MPI 3.0から`mpi.h`を読むと`MPI_VERSION`というマクロが定義されるようなので，コンパイル時に分岐させたい場合はこのマクロで分岐すればよさそう．

しかし，ヘッダファイルを読めば，ではなくて，mpiccとかmpicxxとか，ラッパーが何か定義してくれることが理想なのだが…
この辺りはMakeを工夫して使用することでカバーするしかなさそう．

# 結び

テストコードがきちんと書けたら続きを書きます．
一定時間後に消す


タイトル画面とか、一定時間したら消えるオブジェクトに使う

```c:DestroyTimeout.cs
using UnityEngine;
using System.Collections;

// 自動で消える
public class DestroyTimeout : MonoBehaviour {
	public float timer = 15.0f;
	void Start () {
		Destroy (gameObject, timer);
	}
}
```

> 参考
https://github.com/oreilly-japan/unity-virtual-reality-projects-ja
APIKit のアダプタの作り方

APIKit を使った通信処理で URLSessionTaskDelegate を扱いたい場合には URLSessionAdapter を自前で用意すれば良い。

- `URLSessionAdapter` のサブクラスを用意する
- `URLSessionDelegate`, `URLSessionTaskDelegate`, `URLSessionDataDelegate` を実装する（任意）
- `Session` のインスタンスを初期化する際にアダプタを指定する

```swift
class MySessionAdapter: URLSessionAdapter {
	
	override func createTask(with URLRequest: URLRequest, handler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> SessionTask {
		let task = super.createTask(with: URLRequest, handler: handler)
		return task
	}
	
	override func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
		super.urlSession(session, dataTask: dataTask, didReceive: data)
	}
	
	override func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
		super.urlSession(session, task: task, didCompleteWithError: error)
	}
	
}
```

```swift:使い方
let sessionAdapter = MySessionAdapter.init(configuration: URLSessionConfiguration.default)
let session = Session(adapter: sessionAdapter)
let sessionTask = session.send(request) {…}
```
HAL_Driverでstm系のファームウェア開発

## 概要

* stm系(Nucleo)のマイコンでファームウェアを開発する
* HAL_DriverとCubeMXでハードウェアの知識が少なくてもなんとなく開発できる
* CubeMXでHAL_Driverの雛形プロジェクトを生成して開発を開始するところまで

## 環境

* System Workbench for STM32 AC6
* CubeMX
* Ubuntu (Mac OSX Sierra)

実際、仕事で開発しているときはUbuntuでやってますが、
これを書いてるのはMacなのでスクリーンショットはMacです。
ちなみにMacでCubeMXをインストールする際、
普通にダウンロードしたインストーラは動かなかったので下記手順でインストーラを起動しました。

```bash
$ cd [ダウンロードパス]
$ cd SetupSTM32CubeMX-4.19.0.app/Contents/MacOs
$ chmod 777 SetupSTM32CubeMX-4_19_0_macos
$ ./SetupSTM32CubeMX-4_19_0_macos
```

### HAL_Driverについて

* wikipedia
    * https://ja.wikipedia.org/wiki/Hardware_Abstraction_Layer

これを読むとなんのことかよく分からないけどファームウェア開発のフレームワークみたいなもので、CubeMXを使って生成したプロジェクトをimportして使うことで
ペリフェラルの設定や初期化のコードを記述したソースコードが生成されるのですぐに開発を進めることができます。

### プロジェクトの生成

* CubeMXをつかって* System Workbench for STM32 AC6のプロジェクトを生成します

1. NewProjectをクリック
2. 使用するボードを選択、または作成するマイコンに合わせた設定を選択
3. ペリフェラルの設定画面が表示されます
    4. この画面でピンの設定などマイコンの設定をします
    5. ピンの設定や割り込みの設定などもここからできます
4. メニューのProject -> Settingsからプロジェクトの設定を行います
    5. ProjectタブのToolChain / IDEでSW4STM32を選択します
6. マイコンの設定が終わったらProject > Generate Codeでプロジェクトを生成します

### 生成したプロジェクトから開発を始める

* 基本的にはmain.cを修正して開発をすすめます。
* 生成したプロジェクトはそのままSystem Workbenchでimportすることができます。
* ビルドパスなどは既に各ディレクトリに通っていて、DriversのディレクトリにはHAL_Driverが含まれています。
* ペリフェラルの設定を変更したい場合はrootにあるiocファイルをCubeMXでロードして修正し、再度Generateすることで更新することができます。
* main.cなども上書きされるので何かしらの方法でバックアップは取っておいた方がいいです。
* CubeMXを使用して雛形を生成することで各ボードに合わせたHAL_Driverやペリフェラルの初期化コードを含んだプロジェクトを生成してくれます。
* あとはmain.cを修正してファームウェアを開発します
Rails5にckeditorを導入してみる

記事投稿を効率良く行いたいと考え、ckeditorの導入を試みました！

>・Rails 5.0.0
Railsは**5.0.0**で行きます

## iamgemagickのインストール
先に<Font color="red">**imagemagick**</font>を入れておく必要があるらしい

```
brew install imagemagick
```
### imagemagickとは
>ImageMagick（イメージマジック）は画像を操作したり表示したりするためのソフトウェアスイートである。
GIF、JPEG、JPEG 2000、PNG、PDF、Photo CD、TIFF、DPXなど100種類以上の画像ファイルフォーマットに対応している。 

画像を良しなにやってくれるそうですね..

## ckeditorのインストール
次にgemをインストールします

```
gem 'carrierwave'
gem 'mini_magick'
gem 'ckeditor'
```

Gemfileを修正したら

```
$ bundle install
$ rails generate ckeditor:install --orm=active_record --backend=carrierwave
$ bundle exec rake db:migrate
```

## jsへの追加
application.jsに追加

```:application.js
//= require ckeditor/init

```

## viewに記述

```ruby:hofe.html.erb
<%= form_for @store, url: store_index_path do |f| %>
  //text_area　⇨　cktext_area
  <div><%= f.cktext_area :store_name, class: "hogehoge" %></div>
  <%= f.submit %>
<% end %>
```

これで上手くいきました！！
Kingfisher の通信を Basic 認証に対応させる

ImageDownloadRequestModifier (AnyModifier) を利用して URLRequest に変更を加えると良い。

```swift
var options: KingfisherOptionsInfo = [
		.scaleFactor(UIScreen.main.scale),
		.transition(ImageTransition.fade(0.35)),
		]

let encodedAuth = …

let modifier: AnyModifier = AnyModifier.init(modify: { (req: URLRequest) -> URLRequest? in
	var r = req
	r.setValue("Basic \(encodedAuth)", forHTTPHeaderField: "Authorization")
	return r
})
options.append(.requestModifier(modifier))

imageView.kf.setImage(with: URL,
		      placeholder: placeholder,
		      options: options,
		      progressBlock: nil,
		      completionHandler: nil)
```
【CentOS】yumでローカルリポジトリの作成・使用方法

###環境
 - CentOS 6.8

###ローカルリポジトリの作成

####必要なパッケージをインストール
` yum install createrepo `

####rpmファイルを用意
リポジトリに配置するrpmファイルを任意のディレクトリに配置します。
※yumリポジトリからrpmファイルを取得する場合、[こちら](http://qiita.com/jz4o/items/ea3eecf8ffcd2b5c15a2 "【CentOS】yumでrpmファイルのダウンロードだけ行う")の記事が参考になるかもしれません

####コマンド
下記コマンドを、rpmファイルを配置したディレクトリで実行します
` createrepo --database . `


###ローカルリポジトリの使用

####リポジトリの設定ファイルを作成
`vi /etc/yum.repo.d/local.repo`

```local.repo
[local]                      #リポジトリID
name=local repository        #リポジトリの説明
baseurl=file:///tmp/repo/    #リポジトリのパス
gpgcheck=0                   #GPG署名確認を無効
enabled=0                    #デフォルトではリポジトリを無効
```

####コマンド

yum update
`yum --enablerepo=local update`

yum install
`yum --enablerepo=local install xxxxx`

ローカルリポジトリ以外のリポジトリを一時的に無効化
`yum --disablerepo=\* --enablerepo=local`
Pythonでひとまずloggerを使う


# 目的
Pythonでとにかくなんでもいいからロガーを使ってログを出力する

# 内容
## 登場要素

最小限ログを出力させるのに必要な要素は以下の3つ

1. ロガー(Logger)
    - ログを出力するためのコンポーネント
2. ハンドラ(Handler)
    - ログの出力先などを設定するためのコンポーネント
    - logging.Handlersにデフォルトでいろいろなハンドラが用意されている

## サンプル

ひとまず出力させるなら呪文的にこれ。

```python:ひとまず出力
from logging import getLogger, StreamHandler, DEBUG

def main():
    logger = getLogger(__name__) # ロガーを取得
    handler = StreamHandler() #ハンドラ(StreamHandler)を取得
    handler.setLevel(DEBUG) # ハンドラの出力レベルを設定
    logger.setLevel(DEBUG) # ロガーの出力レベルを設定
    logger.addHandler(handler) # ロガーにハンドラを追加
    logger.debug("ログだよ〜") # ロガーを使ってdebugレベルでログを出力する

if __name__ == '__main__':
    main()
```
jQuery slideの記述　〜基本〜

```js
$(function() {

    要素.click(function() {
        if (要素.css('display') == 'none') {
            要素.slideDown('slow');
        } else {
           要素.slideUp('slow');
        }
    });
});
```

要素のcssでdisplayの状態を見て、もし”それ”なら
slideDownでそうじゃなければslideUp。

メソッドの引数は速度になります。

よかったら参考にしてください。
carrierwaveを使って画像をAWS S3にアップロードする。それをherokuにあげる一連のアレ

画像って便利ですよね。
もうしゃべるより画像の方がわかりやすかったりするじゃないですか。
だからなんか作る時も
写真あげれるようにしたいですよね。

そんなわけで今回は
写真をあげられるようにして、
そんでもってherokuでも使えるように
アップロードする先をAWSのS3にしたいなと。

S3はお金がかかるんですけど
無料枠を超えなければ1年間は無料で使えます。
(アカウントを過去に作ってないことが前提になると思うので、無料で使うために他のメアドで登録するのもありですね。お金大事だからね。)

carrierwaveを使って
アプリ内に保存できるところまで進んでいる程で話を進めますから
まだそこまで進んでないかたは以下を参照してください。
<a href="http://qiita.com/nekononeko_53/private/c28e06ab0344926f2766">CarrierWaveを使って画像をアップロードできるようにしてみる</a>



さて、

https://aws.amazon.com/jp/

先ずはこちらからAWSアカウントの作成をします。

右上のサインアップからアカウントを作成します(クレジットカードの登録が必須になります。)

セキュリティめっちゃ大事で
ググってもらえばわかりますが、自分の不注意で高額の請求が来ることもありますし、酢生ログインされるとまずいので2段階認証を設定しといた方がいいです。

<a href="http://qiita.com/yoshidashingo/items/cd206daca0596659b440">AWSアカウント作ったらこれだけはやっとけ！IAMユーザーとAuthyを使ったMFAで2段階認証</a>

めっちゃ簡単にできるので是非やってみてください。
生成されたアクセスキーやシークレットアクセスキーはCSVファイルをDLできるので保存しておきましょう。


・S3のバケットを作成
1.ログインしたら左上のサービスのボタンを押すと「ストレージ」の項目の中に「S3」ってのがあるのでクリック

2.次に青色の「バケットを作成」を選択

3.バスケット名はご自分の好きな名前に。リージョンはUSで、作成ボタンを押すとバケットの完成です。
ここからは実際にコードをいじっていくことになります。

コードを書いていく
1.gem fogを追加

```ruby:gemfile
gem 'fog'
```
追記したら

```ruby:ターミナル
bundle install
```

2.XXXXX_uploader.rbの編集

```ruby:app/uploaders/XXX_uploader.rb
storage :fog
```
8行目前後にコメントアウトされているのでそいつのコメントアウトを外して、その上にstorage :fileかなんかがあるのでそれは削除。

3.carrierwave.rbの作成

config/initializers/carrierwave.rbとなるようにcarrierwave.rbを作成

```ruby:config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: ENV['ACCESS_KEY_ID'],
    aws_secret_access_key: ENV['SECRET_ACCESS_KEY'],
    region: 'us-east-1'#リージョンをUS以外にしたかたはそのリージョンに変更
  }

    case Rails.env
    when 'development'
        config.fog_directory  = 'バケット名'
        config.asset_host = 'https://s3.amazonaws.com/バケット名'
    when 'production'
        config.fog_directory  = 'バケット名'
        config.asset_host = 'https://s3.amazonaws.com/バケット名'
    end
end
```
ACCESS_KEY_IDとSECRET_ACCESS_KEYは他の人にバレると超高額請求がきて人生が終了するのでターミナルに

```ruby:ターミナル
echo export ACCESS_KEY_ID="" >> ~/.bash_profile

echo export SECRET_ACCESS_KEY="" >> ~/.bash_profile

source ~/.bash_profile
```
「""」の間にKEYをコピペしてください

これでローカルで試してみれば作成したバケットの中に画像がアップロードされるはずです。

最後。herokuにあげる

1.herokuにACCESS_KEY_IDとSECRET_ACCESS_KEYを設定

コードの中にKEYを書いていないので、herokuを使うときは先ほどやったのと同じようにherokuにも登録する必要がありあます

```ruby:ターミナル
heroku config:set ACCESS_KEY_ID=""
heroku config:set SECRET_ACCESS_KEY=""
```

heroku loginでログインした状態でやるようにしてください。
「""」の間に各KEYを書きます。

あとは

```ruby:ターミナル
git push heroku master
```

これでherokuでも画像をあげるとS３に保存されるはずなので試してみてください。

追記 2017/04/11

3のところでUSのリージョン(バージニア)の時の設定ですが例えば東京のリージョンを選んだ場合は
リージョンの設定を帰るのと同時にエンドポイントの変更も必要になります。
(*エンドポイントってのはconfig.asset_hostのとこのバケット名までのところのURL)
で、リージョンごとのエンドポイントは以下から見えます
http://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#s3_region
エンドポイントとリージョンを書き換えてセーブして
よっしゃこれで表示されるはずや！
再読込みをポチ。。。。。

でない。

ってなると思うのですが、
一旦、コントロール+cで閉じてもらって
もう一回rails sすれば見れるようになるはずなんで、泣かないでください。
[OF] 再生できないビデオコーテック

今回はoFで映像を再生する方法を書いていきたいと思います。
デフォルトであるのはofVideoPlayerというクラスですね。ただこのofVideoPlayerだと再生できない映像があったりします。ピクセル比が原因だったり、一部のコーデックが再生できなかったりします。
そこで僕が行った対処法がこちらです。

#映像を再生するには
```ruby:ofApp.h
ofVideoPlayer vid;
```
```ruby:ofApp.cpp
void ofApp::setup(){

     vid.load("sample.mp4");//dataフォルダ内の映像データの読み込み

}

void ofApp::update(){

     vid.update();//毎フレーム更新

}

void ofApp::draw(){

     if(vid.isFrameNew(){//映像フレームが更新されたか確認
    
     vid.draw(0,0,ofGetWidth(),ofGetHeight());//描画
    
     }
}
```
はい。ofVideoPlayerでやるならこんな感じですね。大概のデータはこれで再生できますが、もしデータ読み込みの段階で怒られたり何らかの原因で再生ができない場合は下記の方法を試してみてください。

#ofxDirectShowPlayer
https://github.com/motoishmz/ofxDirectShowPlayer
こちらofxDirectShowPlayerというaddonでございます。ofVideoPlayerで再生できなかった場合はこちらをお試しあれ。
使い方はofVideoPlayerと同じです。

#ofxDirectShowPlayerでテクスチャを取得する
以前僕が詰まったところで、特殊なピクセル比の映像をテクスチャで渡さないといけない状況になったのですが、ofDirectShowPlayerはofVideoPlayerで標準であるgetTexture()関数というが無いのです。
代わりにgetTexturePtr()というポインタを返してくれる関数があったのですが、こちら、nullポインタしか返してくないという謎使用...なんでだろう。
そこで一度ofTextureでテクスチャを別で用意してそこに映像を読み込んで渡してあげたら上手いこといきました。

```ruby:ofApp.h
ofDirectShowPlayer dShow;
ofTexture tex, *ptrTex;
```

```ruby:ofApp.cpp
void ofApp::setup(){

     dShow.load("sample.mp4");//動画読み込み

}

void ofApp::update(){

     dShow.update();

     if(dShow.isFrameNew()){

     tex.loadData(dShow.getPixels());//texに読み込む
     ptrTex->loadData(dShow.getPixels());//ポインタであるptrTexに読み込む

     }

}

void ofApp::draw(){

     tex.draw(0, 0,ofGetWidth() / 2, ofGetHeight());
     ptrTex->draw(ofGetWidth() / 2, 0,ofGetWidth() / 2, ofGetHeight());

}
```

みたいな感じでテクスチャとして扱うことができます。このテクスチャにポインタをつけてあげれば、結果的にdShowのアドレスを握ったも同然です。
これで別クラスに渡して量産しても実態は一つなので負荷を抑えることができます。
ちょっと回りくどい感じがするし分かりづらいですが、とりあえずは動くようになります。
...なんかこれじゃない感がありますが。
もっと他にいい方法ご存知の方、ご教授願います（笑）
getTexturePtr()とは一体...



hapコーデックの場合はこちらをお試しください↓
https://github.com/secondstory/ofxDSHapVideoPlayer
vimでgtagsを自動生成する


## gtagsとは
ソースコードのタグジャンプ機能
使える言語は限られるが、ctags, etagsよりも強力な機能を持っている[^1]
個人的に関数の呼び出し元一覧を表示するcaller機能が魅力的

## plugin紹介
自動生成してくれるプラグイン作りました
[zebult/auto-gtags.vim](https://github.com/zebult/auto-gtags.vim)
このプラグインはsoramugiさんの[auto-ctags.vim](https://github.com/soramugi/auto-ctags.vim)をかなり参考にしてます

## 使い方
* GTAGSファイル新規作成(既に存在する場合、破棄して作り直す)
`:GtagsCreate`

* GTAGSファイル更新(GTAGS関連ファイルが存在しない場合、何もしない)
`:GtagsUpdate`

* ファイル保存時Gtagsがあれば更新する
`let g:auto_gtags = 1`

[^1]: [GNU GLOBAL（gtags）ソースコードタグシステムの使い方](http://uguisu.skr.jp/Windows/gtags.html)
【CentOS】yumでrpmファイルのダウンロードだけ行う

###環境
 - CentOS 6.8


###必要なパッケージのインストール
``` yum install yum-plugin-downloadonly ```


###コマンド
\<package>のインストールに必要なrpmファイルをダウンロード
``` yum install <package> --downlaodonly --downloaddir=. ```

updateに必要なrpmファイルをダウンロード
``` yum update --downloadonly --downloaddir=. ```


###downloaddirについて
``` --downloaddir ```を指定しない場合、下記ディレクトリに保存される
　/var/cache/yum/\<os_bit_type>/\<version>/base/packages
reactで木構造のSortableなやつのメモ

### 目的
ReactでSotable木構造を作成し、それぞれの要素に上から順に順序をつける。

### 方法
reactには数多くのSortable List Componentがある。Sortable木構造を実装するのに使えるComponentを自分の知っている範囲を挙げると、
1. [react-dnd](https://github.com/react-dnd/react-dnd)
2. [react-sortable-hoc](https://github.com/clauderic/react-sortable-hoc)
3. [RubaXa/Sortable](https://github.com/RubaXa/Sortable)
4. [Dragula](https://github.com/bevacqua/react-dragula)

この中で、react-dndは一番、柔軟にDNDを扱うことができるライブラリであるが、うまく使えるようになるまでに必要な学習時間が尋常ではない。(気がする。自分は直ぐやめた。)

そこで、2を利用してみて、アニメーション的に2が非常に優秀であることがわかった。しかし、自分の目的は木構造のSortableを作成/利用することであったので、2は使用できないと考えた。

さらに、あらゆるSotrable Treeのライブラリの存在をグーグル先生に聞いた結果、最も自分の気持ちにFittingしているのは、

__[react-ui-tree](https://react.rocks/example/react-ui-tree)__

であることが判明した。

このReact-Ui-Treeでそれぞれの要素に対するIndexを手に入れるのに考えられる手段が次の２つ。

1. このライブラリの中身を少し手入れする
2. 木構造リストからIndexを算出

1は面倒だし、2でやるか（パフォーマンスはいいか。。。）ということで、結果的に、要素のIndexを手に入れるのに２の手段を選択した。

### 結果

1. 木構造リストから再帰的に総要素数を算出。
2. なんかやった

```js
function calcAllNodeNumber(node) {
  if (node.children == null) return 1;
  let index = 1;
  for (var i in node.children) {
    index = index + calcAllNodeNumber(node.children[i]);
  }
  return index;
}
// ...
renderNode(node) {
  if (this.index == null) {
    this.maxNumber = calcAllNodeNumber(node);
  }
  let index = (this.index == null) ? 0 : this.index + 1;
  this.index = index;
  if (this.index == this.maxNumber - 1) this.index = null;
    
  return (...);  
}

```

### 最後に

できた。

```
Object.keys(rensouhairetu).length
```
で要素の数を取れるっぽい。。。。
sudoを/etc/sudoers.d/fileで許可する

sudo権限をファイル形式で管理しすることで、
もとの/etc/sudoersをいじらないでもsudo実行できるようにするやりかたを書きます。
sudoersの細かい設定については[こちら](http://www.linux-cmd.com/sudoers.html)などをご確認ください。


##①rootユーザーで、sudo権限を与えるユーザーグループを作成
※グループごとに与える権限を変えることで、運用ユーザーの管理なども行える。
`# groupadd usersgroup`
`# cat /etc/group|grep usersgroup`
`usersgroup:x:505:`


##②/etc/sudoers.d/配下に権限許可テキストを作成
`# echo "%usersgroup ALL=(ALL) NOPASSWD: ALL"> /etc/sudoers.d/usersgroup`
`# cat /etc/sudoers.d/usersgroup`
`%usersgroup ALL=(ALL) NOPASSWD: ALL`

##③権限を与えたいユーザーに、ユーザーグループを割り当てる
`usermod -aG usersgroup user`
`id user`
`uid=503(user) gid=503(user) 所属グループ=503(user),505(usersgroup)`

##④sudo権限が割り当てられたか確認
アカウントuser(一般ユーザー)で先ほど作った/etc/sudoers.d/usersgroupをcatしてみます。
`[user@host]$ cat /etc/sudoers.d/usersgroup`
<font color="Red">cat: /etc/sudoers.d/usersgroup: 許可がありません</font>

権限がないので当然見られません。
次にsudoしてcatしてみます。
`[user@host]$ sudo cat /etc/sudoers.d/usersgroup`
<font color="Blue">%usersgroup ALL=(ALL) NOPASSWD: ALL</font>
sudo実行できているためファイルを見ることができました。

以上、簡単ですが/etc/sudoers.d/の使い方でした。

---
#参考

http://qiita.com/ngyuki/items/88d0f71601e05f239750
http://fujikkoooooo.hateblo.jp/entry/2015/05/01/154611
http://www.itmedia.co.jp/help/tips/linux/l0659.html
pandasの時刻情報の変換

pandas.DataFrameにはいっている文字列形式時刻情報をdatetime形式に変換します。

まず、時刻情報が入ったDataFrameがあるとして、

```python
print (df["時刻"])
```

```text
0          2016年1月1日1時
1          2016年1月1日2時
2          2016年1月1日3時
3          2016年1月1日4時
4          2016年1月1日5時
5          2016年1月1日6時
6          2016年1月1日7時
7          2016年1月1日8時
8          2016年1月1日9時
9         2016年1月1日10時
10        2016年1月1日11時
11        2016年1月1日12時
12        2016年1月1日13時
13        2016年1月1日14時
14        2016年1月1日15時
15        2016年1月1日16時
16        2016年1月1日17時
17        2016年1月1日18時
18        2016年1月1日19時
19        2016年1月1日20時
20        2016年1月1日21時
21        2016年1月1日22時
22        2016年1月1日23時
23        2016年1月1日24時
```

のようになっているとします。因みに上の時刻情報は0時の代わりに24時になっています。これを、以下ような関数convを定義して、DataFrame.apply()に投げます。1-24時の範囲は変換時にエラーになるので、conv()内で0-23時に変換しています。

```python
def conv(line):
    import re
    lst = re.split("[年月日時]",line)[:-1]
    lst[-1] = str(int(lst[-1]) - 1)
    return datetime.datetime.strptime("-".join(lst), "%Y-%m-%d-%H")
df["時刻"] = df["時刻"].apply(conv)
print(df["時刻"])
```

```text
0      2016-01-01 00:00:00
1      2016-01-01 01:00:00
2      2016-01-01 02:00:00
3      2016-01-01 03:00:00
4      2016-01-01 04:00:00
5      2016-01-01 05:00:00
6      2016-01-01 06:00:00
7      2016-01-01 07:00:00
8      2016-01-01 08:00:00
9      2016-01-01 09:00:00
10     2016-01-01 10:00:00
11     2016-01-01 11:00:00
12     2016-01-01 12:00:00
13     2016-01-01 13:00:00
14     2016-01-01 14:00:00
15     2016-01-01 15:00:00
16     2016-01-01 16:00:00
17     2016-01-01 17:00:00
18     2016-01-01 18:00:00
19     2016-01-01 19:00:00
20     2016-01-01 20:00:00
21     2016-01-01 21:00:00
22     2016-01-01 22:00:00
23     2016-01-01 23:00:00
```

datetimeの形式になりました。
Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week3)

# Coursera Week3
## はじめに
CourseraのWeek3を実施しましたので、私のメモを公開します。
Courseraってなんだ？という方は[Week1](http://qiita.com/KirariGlock/items/d41bdcc6f5ec5ad255fb)から御覧ください。
Week3では分類問題に使用するロジステック回帰について学習します。

## ロジスティック回帰 (Logistic Regression)
### 分類(Classification)
機械学習の分野では最もポピュラーなアルゴリズム。
Classificationの例として、スパムメールかそうでないか、不正利用しているかしていないか、腫瘍ががんかそうでないか。
　→　必ず0か1に分類できるもの。
0:Negative Class
1:Positive Class

分類問題には線形回帰は利用できない。（おかしな値になることがある。）
さらに分類は$ y $0か1であることがわかっているのに、線形回帰$ h_\theta(x)$は1より大きいか0より小さい値を出してしまう。

そこで分類問題にはロジスティック回帰を使用する。
$$
0 \leqq h_\theta(x) \geqq 1
$$

### 仮説表現(Hypothesis Representation)
ロジスティック関数またはシグモイド関数は同じ意味で、
$ h_\theta(x) = g(\theta^Tx) $　と　$g(z) = \frac{1}{1 + e^{-1}}$を変換して以下のようになる。 
$$
h_\theta(x) = \frac{1}{1 + e^{-\theta^Tx}}
$$
シグモイド関数は$z$がマイナス無限に近づくと0に近づき、無限に近づくと1に近づく。
$h_\theta(x) = P(y = 1 | x; \theta)$と表すこともできる。

### 決定境界 (Decision Boundary)
$ h_\theta(x) \geqq 0.5$の場合は$y=1$
これは$\theta^t x \geqq 0$で求めることができる。

$ h_\theta(x) < 0.5$の場合は$y=0$
これは$\theta^t x < 0$で求めることができる。
このケースの場合、0.5が決定境界である。

## ロジスティック回帰(Logistic Regression)
### 目的関数(Cost Function)
ロジスティック関数は出力が波をうち、多くの局所最適化を引き起こすため、線形回帰と同じ目的関数は使用できない。
$y = 1$の場合
$Cost(h_\theta(x), y) = -log(h_\theta(x))$

$y = 0$の場合
$Cost(h_\theta(x), y) = -log(1 - h_\theta(x))$

### シンプルな目的関数と最急降下法(Simplified cost function and gradient descent)
上記で示した$y=1$の場合と$y=0$の場合の目的関数をシンプルに変換する。
$$
Cost(h_\theta(x), y) = -y * log(h_\theta(x)) - (1 - y) * log(1 - h_\theta(x))
$$

最急降下法は表向きには変わらないが、仮説の定義が変わっていることに注意。
最急降下法
$\theta_j := \theta_j - \alpha\sum_{i=0}^m (h_\theta(x^i) - y^i)x^i_j$
$h_\theta(x) = \frac{1}{1 + e^{-\theta^Tx}}$

### 高度な最適化(Advanced optimization)
最適化アルゴリズムは主に下記の4種類である。
・最急降下法
・共役勾配法(Conjugate gradient)
・BFGS
・L-BFGS

Octaveではfminunc関数を使用することで最急降下法の拡張版のようなものを使用できる。
これは学習率$\alpha$を求めなくていいので楽、さらに早い。
fminunc(@costFunction, initialTheta, options)

### マルチクラス分類問題(Multi-class classification : One vs all)
マルチクラス分類とは、例えばメールのフォルダ分けがある。
仕事、友達、家族、趣味などのフォルダに分類するケースをマルチクラス分類という。
病気の診断や天気も同じ。

これらの分類問題では一番確率の高いものを正解とする。
$prediction = max(h_\theta^i(x))$

## 正規化(Regularization)
### オーバーフィッティング問題(The problem of overfitting)
プロットされたデータに対して直線で線を引いて、あまりマッチしていない状態をアンダーフィッティングという。
同じくプロットされたデータに対して線を結ぶが、うねうねして結果の予測ができない状態になっていることをオーバーフィッティングという。
アンダーフィッティングとオーバーフィッティングはロジスティック回帰の場合にもあり得る。

オーバーフィッティング対策
・機能の数を減らす
・正規化する

### 目的関数(Cost function)
オーバーフィッティングを避けるためには適切に正規化をする必要がある。
不要なデータを0に近づけてほぼ取り除くことで、正常に結果が予測できる線にする。
$\lambda$はオーバーフィッティングを避ける役割を果たす。
$$
J(\theta) = \frac{1}{2m}\Biggl[\sum_{i=1}^m(h_\theta(x^i) - y^i)^2 + \lambda\sum_{i=1}^n\theta_j^2\Biggr]
$$
$\lambda$が大きすぎるとペナルティを与えすぎてアンダーフィッティングになる。
小さすぎるとオーバーフィッティングになる。

### 線形回帰の正規化(Regularized linear regression)
最急降下法
$$
\theta_j := \theta_j - \alpha\Biggl[\frac{1}{m}\sum_{i=1}^m(h_\theta(x^i) - y^i) x_j^i + \frac{\alpha}{m}\theta_j\Biggr]
$$ 
$$
\theta_j := \theta_j(1 - \alpha\frac{\lambda}{m}) - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^i) - y^i) x_j^i
$$
このとき$1 - \alpha\frac{\lambda}{m} < 1$となる。

### ロジスティック回帰の正規化(Regularized logistic regression)
考え方は線形回帰の正規化の最急降下法と同じ。
ただし、ロジスティクス回帰は$h_\theta(x) = \frac{1}{1 + e^{-\theta^Tx}}$であることに注意する。
Python - マルコフ連鎖状態遷移シミュレーション

3つの状態を行列PROB_MATRIXの確率にしたがって遷移する場合のシミュレーション
(例：状態0→2に移る確率はPROB_MATRIX[0][2]=0.2)

```py:MarkovChainSimulation1.py
import numpy as np

INIT_STATE = 0

PROB_MATRIX = [[0.7, 0.1, 0.2],
               [0.2, 0.1, 0.7],
               [0.7, 0.2, 0.1]]

def get_next_state(prob_array):
    normalization_factor = sum(prob_array)
    rand_num = np.random.rand(1)
    s = 0
    for i in range(len(prob_array)):
        s += prob_array[i]/normalization_factor
        if rand_num < s:
            return i
    return -1
    
if __name__ == "__main__":
    print("Initial State: " + str(INIT_STATE))
    cur_state = INIT_STATE
    for i in range(30):
        cur_state = get_next_state(PROB_MATRIX[cur_state])
        print("State" + str(i+1) + " : " + str(cur_state))
```

```結果
> python MarkovChainSimulation1.py
Initial State: 0
State1 : 1
State2 : 2
State3 : 0
State4 : 0
State5 : 0
State6 : 0
State7 : 2
State8 : 0
State9 : 0
State10 : 0
State11 : 1
State12 : 2
State13 : 0
State14 : 0
State15 : 2
State16 : 0
State17 : 0
State18 : 0
State19 : 0
State20 : 0
State21 : 0
State22 : 2
State23 : 2
State24 : 0
State25 : 0
State26 : 2
State27 : 0
State28 : 0
State29 : 0
State30 : 2
```
Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week1)

# はじめに
Webアプリケーションエンジニア6年目の私がディープラーニングに挑戦することになりましたので、やったことを記事にまとめていこうと思います。
ちなみに理系大学出身なので、線形代数や確率統計、微分積分はできるポーズを取っています。

# ゼロから作る Deep Learning　(期間：4週間くらい)
まず最初にO'Reilly Japan社の「ゼロから作る Deep Learning」を読了しました。
https://www.oreilly.co.jp/books/9784873117584/

一通り読んだ後、気になるところをPythonで写経した感じですが、この分野の未経験者だと一筋縄で理解できるものではないかなという印象です。

# TensorFlowのチュートリアルの実施(期間：2週間くらい)
https://www.tensorflow.org
ずっと本を読んでいても進まないので、実際に使用できそうな機械学習のライブラリであるTensorFlowのチュートリアルを実施しました。
意味を調べながらビギナーとエキスパートのチュートリアルを実施しましたが理解度はまだ微妙な感じですね。
ただ、「ゼロから作る Deep Learning」が辞書代わりになったお陰で少し理解ができたかなっという印象です。

チュートリアル　ビギナー
https://www.tensorflow.org/versions/master/tutorials/mnist/beginners/

チュートリアル　エキスパート
https://www.tensorflow.org/tutorials/mnist/pros/#deep-mnist-for-experts

# スタンフォード大学の機械学習講座
https://www.coursera.org/learn/machine-learning
無料で受けられる機械学習講座です。
Enroll Now から簡単に登録して始めることができます。
全て英語ですが動画に日本語訳の字幕を出せるので、なんとかなります！

## Coursera Week1を実施（期間：1週間くらい）
### メモ
- 教師あり学習と教師なし学習に大別される。
教師あり学習は例として正解がラベル付けされたデータが与えられている。
    - (教師あり学習の例)
腫瘍が悪性か陽性かを見分けるために教師データを用意する。
    - (教師なし学習の例)
雑音と声が混ざった音声のアルゴリズムを解析し、音声のみを取り出す。

- 実装はJavaやC#、Pythonでも可能だが、Octaveが一番ラク。(Pythonでやろうとしてましたが…。)
- 目的関数(cost function)は予測値と実測値がどれくらいずれているのか、平均値を出して示す。
０であれば一致していることとなる。
- 最急降下法は目的関数の最小値を探す方法。何度も繰り返すことで少しずつ値を減らしていく。
最小値が近づくにつれて1ステップが小さくなる。
- 目的関数と最急降下法の問題がむずい。(何度も復習してやっとクリア…)
- 最後の線形代数がご褒美レベルに優しい。
- ３〜４時間程度で終わると聞いていましたが、私は８時間程かかってしまった。
容量良くやりたいけど難しい…！

Week2以降は以下にリンク。
[Coursera Week2](http://qiita.com/KirariGlock/items/81aa37e4e090733bc5df)
[Coursera Week3](http://qiita.com/KirariGlock/items/f491c866a27ca1965b74)
[Coursera Week4](http://qiita.com/KirariGlock/items/e58913284efea9ffaabd)
[Coursera Week5](http://qiita.com/KirariGlock/items/dc5018a6b15fcc785650)
[Coursera Week6](http://qiita.com/KirariGlock/items/96a23360750cf39bb291)
[Coursera Week7](http://qiita.com/KirariGlock/items/58b05c2d2ae278b86a51)
[Coursera Week8](http://qiita.com/KirariGlock/items/2e055100f9e8dbe2d1ac)
[Coursera Week9](http://qiita.com/KirariGlock/items/f0a2a8078d46dcec77eb)
[Coursera Week10](http://qiita.com/KirariGlock/items/ed0128ff7c6adb88104f)
[Coursera Week11](http://qiita.com/KirariGlock/items/8834f2df2e2d2c7b2653)
【webdavにおすすめ】ブラウザでディレクトリへアクセスしたときのインデックス表示をかっこよくする

index.htmlやindex.phpなどのファイル名を省略した際に表示されるこのページです。

![362037f4-e936-4713-fff5-eb85604e179a.png](https://qiita-image-store.s3.amazonaws.com/0/151137/376a7b34-4ed5-2cac-b523-e2bbeee59786.png)
（といっても、最近のWebサイトはこの画面を出さない設定にしていることがほとんですが…）

今回使うのは「h5ai」というPHPプログラムで、導入するとこんな感じ↓になります。

![b2b9d205-44af-7818-cadb-54d62867e663.png](https://qiita-image-store.s3.amazonaws.com/0/151137/76777986-28d3-6d98-b2f4-0d27c5860624.png)
公式のデモはこちら: https://larsjung.de/h5ai/demo/

表示形式の切り替えやサムネイル表示など、一通りの機能がついており非常に便利です。

Webサイトのディレクトリ内を公開したい状況はあまりないと思いますが、WebDAVなどを導入していて、ファイルマネージャーからだけでなくブラウザからも閲覧したい場合に便利だと思います。

# 導入手順

本稿ではLAMP構築済みのサーバーに導入しています。

## 「h5ai」をダウンロード・配置

配布サイトへ行き、最新版をサーバーへダウンロードして解凍します。
https://larsjung.de/h5ai/

```bash
$ wget https://release.larsjung.de/h5ai/h5ai-0.29.0.zip
$ unzip h5ai-0.29.0.zip
```

解凍した「_h5a1」の配置場所は、公開したいディレクトリの直下です。

```
var
  └ www
     └ html
        └ webdav
           ├ _h5ai
           ├ dir1
           │   └ …
           └ dir2
               └ …
```

## Apacheまたは.htaccessに設定を書く
```apache
DirectoryIndex index.html index.php /_h5ai/public/index.php
```

もし公開ディレクトリがWebルートより深い場所にある場合、`/_h5ai/public/index.php`の部分を`/hoge/_h5ai/public/index.php`のようにルートから見て適切なパスにする。

## 確認
ブラウザからアクセスし、確認してみましょう。
たいていのサーバーはこれだけで一通りの機能が動くと思われます。

## 一部機能に問題がある場合

例：動画のサムネが表示されない　など

以下のURLから、必要なソフトがサーバーにインストールされているかを確認できます。
`http://あなたのサイト/_h5ai/public/index.php`

（上記画面のログインパスワードは初期だと空になっています。変更したい場合は`./_h5ai/private/conf/options.json`のハッシュ値を変更します。）

各項目に対し、何をインストールすればよいかが書かれているので、「no」になっている項目を確認して必要なソフトをインストールしましょう。


## WebDAVと組み合わせる場合

WebDAVに対してh5aiを導入すると、WindowsのファイルエクスプローラーやMacのFinderなどといったファイルビュアーでWebDAV内を正しく表示できなくなってしまいます。

そのため、h5aiがブラウザからアクセスした時だけ有効になるよう、最初のDirectoryIndexの設定を変更しましょう。

```apache
# ※Apache2.4の書き方です
# UAがchromeのときだけ有効に
<If "%{HTTP_USER_AGENT} =~ /chrome/i">
    DirectoryIndex index.html index.php /_h5ai/public/index.php
</If>
```
Python - 数値データファイルからデータを読み込み分散共分散行列、固有値、固有ベクトルを求める

以下のようなタブ区切りの数値データ系列ファイルからデータを読み込み分散共分散行列、固有値、固有ベクトルを求めるプログラム。

```text:MultipleRegressionAnalysis_Data2.txt
23.3	19.8	14.7	19.7	16.9	14.4
5.24	-5.23	-7.95	11.70	-2.44	-2.14
```

```py:MultipleRegressionAnalysis_3.py
import numpy as np
import math

def load_data(filename):
    with open(filename) as lines:
        return [[float(data) for data in line.strip().split('\t')]
                for line in lines]
    
def calc_sum_of_square(data_list1, data_list2):
    return (len(data_list1) * sum([data1 * data2 for data1, data2 in zip(data_list1, data_list2)]) - sum(data_list1) * sum(data_list2))/(len(data_list1)*(len(data_list1)-1))

def calc_variance_covariance_matrix(data_list):
    return [[calc_sum_of_square(data_list1, data_list2)/(len(data_list1)-1) for data_list1 in data_list]
            for data_list2 in data_list]
            
def calc_engenvalue_2d(mat):
    lambda1 = ((mat[0][0] + mat[1][1]) + math.sqrt((mat[0][0] - mat[1][1])**2 + 4*(mat[0][1]**2))) / 2
    lambda2 = ((mat[0][0] + mat[1][1]) - math.sqrt((mat[0][0] - mat[1][1])**2 + 4*(mat[0][1]**2))) / 2
    return [lambda1,lambda2]
    
def calc_engenvector_2d(mat, engenvalue):
    a11 = math.fabs(mat[0][1]) / math.sqrt((engenvalue[0] - mat[0][0])**2 + mat[0][1]**2)
    a12 = (engenvalue[0] - mat[0][0])*a11 / mat[0][1]
    a21 = math.fabs(mat[1][0]) / math.sqrt((engenvalue[1] - mat[0][0])**2 + mat[0][1]**2)
    a22 = (engenvalue[1] - mat[0][0])*a21 / mat[0][1]
    return [[a11, a12],[a21, a22]]
            
if __name__ == "__main__":
    data = load_data('MultipleRegressionAnalysis_Data2.txt')
    variance_coveriance_matrix = calc_variance_covariance_matrix(data)
    print("- 分散共分散行列 -")
    print(np.array(variance_coveriance_matrix))
    eigenvalue = calc_engenvalue_2d(variance_coveriance_matrix)
    print("- 固有値 -")
    print(eigenvalue)
    engen_vector = calc_engenvector_2d(variance_coveriance_matrix, eigenvalue)
    print("- 固有ベクトル -")
    print("z1 = " + str(engen_vector[0][0]) + " x1 " + ("+" if engen_vector[0][1] > 0 else "") + str(engen_vector[0][1]) + " x2")
    print("z2 = " + str(engen_vector[1][0]) + " x1 " + ("+" if engen_vector[1][1] > 0 else "") + str(engen_vector[1][1]) + " x2")
```

```text:結果
> python MultipleRegressionAnalysis_3.py
- 分散共分散行列 -
[[  2.36693333   2.99921333]
 [  2.99921333  10.61296533]]
- 固有値 -
[11.58843357427205, 1.3914650923945988]
- 固有ベクトル -
z1 = 0.30929366776230544 x1 +0.9509665751655736 x2
z2 = 0.9509665751655736 x1 -0.3092936677623057 x2
```
ゼロから始める Brainf*ck 互換言語制作 第3回

[第0回 はじまり](http://qiita.com/liburari/items/103011f2b18e0d907b78#%E7%AC%AC0%E5%9B%9E-%E3%81%AF%E3%81%98%E3%81%BE%E3%82%8A)
[第1回 メモリの使い方の決定・実行部分の作成](http://qiita.com/liburari/items/103011f2b18e0d907b78#%E7%AC%AC1%E5%9B%9E-%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%AE%E6%B1%BA%E5%AE%9A%E5%AE%9F%E8%A1%8C%E9%83%A8%E5%88%86%E3%81%AE%E4%BD%9C%E6%88%90)
[第2回 関数を呼ぶために](http://qiita.com/liburari/items/103011f2b18e0d907b78#%E7%AC%AC2%E5%9B%9E-%E9%96%A2%E6%95%B0%E3%82%92%E5%91%BC%E3%81%B6%E3%81%9F%E3%82%81%E3%81%AB)

# 第3回 実行部分の続き（前編）

第2回で決めた命令セットを実行するような BF のコードをひたすら書いていきます。命令を読み取って switch する部分は第1回で書いたので、今回はその続きです。また、型については深く考えずに、unsigned char（0～255）のみとします。

## スタック操作系

### push

スタックに値をプッシュします。唯一後ろに即値が続く命令です。

```bf
+<<<<             inc pc
>[->+>+<<]<       move i_v1 to i_v2 and i_v3
>>>[-<<+>>]<<<    move i_v3 to i_v1
>>[<<             while i_v2 {
  >>>>[>>>>]        @ sp
  >+<               inc s_v1
  <<<<[<<<<]        @ pc
  >>-<<             dec i_v2
>>]<<             }
>>>>[>>>>]        @ sp
+                 inc sp
[<<<<]            @ pc
+<<<<             inc pc
```

計算量：プッシュする値を $N$、PC と SP の距離を $D$ として、$O(ND)$

### pop

スタックから値をポップします。

```bf
>>>>[>>>>]<<<<    @ st
>[-]<             clear s_v1
-                 dec st
<<<<[<<<<]        @ pc
+<<<<             inc pc
```

計算量：ポップする値を $N$、PC と SP の距離を $D$ として、$O(N+D)$

## 演算系

### add

足し算です。

```:イメージ
r = pop()
l = pop()
push(l + r)
```

```bf
>>>>[>>>>]<<<<    @ st
>[<               while s1v1 {
  >-<               dec s1v1
  <<<<              @ s2
  >+<               inc s2v1
  >>>>              @ s1
>]<               }
-                 dec sp
<<<<[<<<<]        @ pc
+<<<<             inc pc
```

計算量：右辺の値を $N$、PC と SP の距離を $D$ として、$O(N+D)$

### sub

引き算です。

```:イメージ
r = pop()
l = pop()
push(l - r)
```

足し算の5行目の `+` を `-` に変えればできます。計算量も同じです。

### mul

```:イメージ
r = pop()
l = pop()
push(l * r)
```

```bf
>>>>[>>>>]<<<<      @ st
>[<                 while s1v1 {
  >-<                 dec s1v1
  <<<<                @ s2
  >[->+>+<<]<         move s2v1 to s2v2 and s2v3
  >>>[-<<+>>]<<<      move s2v3 to s2v1
  >>>>                @ s1
>]<                 }
-<<<<               dec sp
>[-]<               clear s2v1
>>[-<+>]<<          move s2v2 to s2v1
[<<<<]              @ pc
+<<<<               inc pc
```

計算量：左辺の値を $M$、右辺の値を $N$、PC と SP の距離を $D$ として、$O(MN+D)$

### not

スタックトップが 0 なら 1、そうでなければ 0 にします。

```:イメージ
v = pop()
push(!v)
```

```bf
>>>>[>>>>]<<<<  @ st
>>+<<           set v2 1
>[[-]>-<]<      if v1 { set v2 0 }
>>[-<<+>>]<<    move v2 to v1
[<<<<]          @ pc
+<<<<           inc pc
```

計算量：反転する値を $N$、PC と SP の距離を $D$ として、$O(N+D)$

### eq, ne

同値比較は sub と not を組み合わせればできるので不要です。

## 入出力

### read

```bf
>>>>[>>>>]    @ sp
>,<           read s_v1
+             inc sp
[<<<<]        @ pc
+<<<<         inc pc
```

計算量：PC と SP の距離を $D$ として、$O(D)$

### write

```bf
>>>>[>>>>]<<<<    @ st
>.<               write s_v1
>[-]<             clear s_v1
-                 dec sp
<<<<[<<<<]        @ pc
+<<<<             inc pc
```

計算量：出力する値を $N$、PC と SP の距離を $D$ として、$O(N+D)$

## その他

オフセット指定操作やフロー操作は面倒なので次に回します。割り算や大小比較はもっと面倒なのでしばらくはやりません。
yum update できなかったCentOS6


はい，タイトルのままです．


##問題
CentOS6.8のVagrant box落としてきます．
↓
Vagrant up して,VMに入ります．
↓
　yum update します
↓
エラー出ます(泣けるwwwww)

```bash
警告: rpmts_HdrFromFdno: ヘッダ V4 RSA/SHA512 Signature, key ID ef8d349f: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs-PC1


The GPG keys listed for the "Puppet Labs PC1 Repository el 6 - x86_64" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.
```



はい，yum updateもできない情弱です．

翻訳すると，
Puppet Labs PC1 Repository el 6 - x86_64のリポジトリはインストールされているけど，正しくないパッケージです．


つまり，
pappetさんと仲良くなれてないのでフレンズになりましょう
ということらしいです．

##解決策
仕方ないので，フレンズになりましょう．
https://docs.puppet.com/puppet/latest/puppet_collections.html
![スクリーンショット 2017-02-19 21.14.12.png](https://qiita-image-store.s3.amazonaws.com/0/104622/ede40bec-e53e-72a0-4c23-1936f789c099.png)


はい，このコマンドを打ちましょう！

```bash
rpm -Uvh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-6.noarch.rpm
```


そして yum update します

```bash
[vagrant@localhost ~]$ sudo yum update

[省略]
トランザクションの要約
====================================================================================
インストール         2 パッケージ
アップグレード      37 パッケージ

合計容量: 127 M
これでいいですか? [y/N]

パッケージをダウンロードしています:
warning: rpmts_HdrFromFdno: Header V4 RSA/SHA1 Signature, key ID ef8d349f: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs-PC1
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puppet-PC1
Importing GPG key 0xEF8D349F:
 Userid : Puppet, Inc. Release Key (Puppet, Inc. Release Key) <release@puppet.com>
 Package: puppetlabs-release-pc1-1.1.0-5.el6.noarch (installed)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-puppet-PC1
これでいいですか? [y/N]y

[省略]

完了しました!
[vagrant@localhost ~]$
```

キーがないと怒られますが，無事インストールできました！



###これで君もフレンズだね！
Macの自動起動・終了周りをまとめました


# はじめに
Macで展示を行う際、アプリケーションを毎日立ち上げるのは面倒ですし、遅刻すると大惨事なので、自動起動するようにします。Mac自体の起動から、アプリケーションの起動、Macの終了までをまとめました。

# Macを自動的に起動・終了する時間を指定する

システム環境設定 > 省エネルギーを選択します。

<img width="665" alt="Menubar_と_システム環境設定_と_新規投稿_-_Qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/10803/62ce2373-2d29-2438-654e-439f78eb4004.png">

スケジュールを押すとポップアップが出てくるのでここに起動と終了の時間をいれます。
<img width="670" alt="省エネルギー.png" src="https://qiita-image-store.s3.amazonaws.com/0/10803/4fffa9ab-82c3-23be-27bf-6eb6df04822e.png">


システム終了に選択した時間になるとこのようなポップアップが出ます。何も押さなければ指定時間の10分後にシステムが終了します。
<img width="422" alt="新規投稿_-_Qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/10803/2f1d016f-8afc-c7fd-71cb-53cbdeb0a232.png">

# Mac起動時にログインパスワードを不要にする。

せっかく自動起動ができてもパスワードを要求されてはアプリケーションの自動起動は至りません。そこで自動でログインできるようにします。
※ガバガバになってしまうのでセキュリティにはくれぐれも注意し、データの扱いや外部の人がネットワークやデバイスを用いて操作出来ないように注意を払いましょう。
再びシステム環境設定から今度はユーザとグループを選択します。

<img width="671" alt="Menubar_と_システム環境設定_と_新規投稿_-_Qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/10803/70f4b54f-19c1-5405-5a24-594bd956732c.png">

ログインオプションをクリックし、自動ログインで対象となるユーザ名を選択します
<img width="666" alt="ユーザとグループ_と_「Macの自動起動周り」を編集_-_Qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/10803/5df459ae-f6bf-b901-94f0-e2bf9ba39ec6.png">

この時自動ログインを選択出来ない場合があります。
これは公式サイトにもある通りFileVaultが有効になっている場合などがあげられます。
https://support.apple.com/ja-jp/HT201476

FileVaultは下記のページを参考に解除ができるので、必要に応じて解除します。
https://support.apple.com/ja-jp/HT204837

# Macが起動したらアプリケーションを自動で起動できるようにする。
上の手順でMac自体は自動的に起動、終了が出来るようになりました。次にMacが起動したらアプリケーションを自動的に起動できるようにします。

システム環境設定のユーザとグループからユーザをクリックし、ログイン項目を選択します。

<img width="658" alt="Menubar_と_ユーザとグループ_と_「Macの自動起動周り」を編集_-_Qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/10803/93da1d34-437e-32e6-5f77-f348cf4616e1.png">

＋ボタンをクリックし、自動起動したいアプリケーションを選択すれば完成です。
<img width="666" alt="ユーザとグループ_と_「Macの自動起動周り」を編集_-_Qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/10803/f8b2375a-bad4-5782-436f-fc408bee8aee.png">


どこかで躓くとそこで止まってしまうので、あらかじめ念入りに動作確認をするようにしましょう！