OmniAICreator/Qiita-1.07M huggingface dataset:
ラズパイにsshで接続できるようになるまでの記録

ラズベリーパイをいじるにあたって、HDMIケーブルの繋がるモニタが必要なのですが、けっこう希少なので、ssh接続できるようになるといいなーと思いました。
というわけで、RaspberryPiにssh接続できるようになるまでの設定をメモしておきます。

## 目次
* モバイルルーターを用意する
* ラズパイ起動時にsshdサービスが起動するようにする
* IPアドレスを固定にする
* 起動時に接続するWifiを固定にする
* 接続確認

## モバイルルーターを用意する
接続するためにはどこかのネットワークに属していないといけないので、モバイルルーターがあると便利です。自分の使っているケータイショップに行って相談すれば多分もらえます。

## ラズパイ起動時にsshdサービスが起動するようにする
ラズベリーパイ本体を起動して、ターミナルから以下のコマンドを実行します。

```shell-session:ターミナル
sudo systemctl enable ssh
```

これで有効になったはずなので、再起動して確認します。

```shell-session:ターミナル
sudo reboot
```

ローカルから接続して確認。初期状態だとユーザーIDは`pi`でパスワードは`raspberry`になっているようです。

```shell-session:ターミナル
ssh pi@localhost
```

## IPアドレスを固定にする

`/etc/dhcpcd.conf`に以下を追加します。
`ip_address`は、モバイルルーターの管理画面から、DHCPが自動で割り振る範囲の外のアドレスを設定したほうがよいです。
`routes`と`domain_name_servers`はルーターのIPアドレスにします。

```:/etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.100.201/24
static routers=192.168.100.1
static domain_name_servers=192.168.100.1
```

## 起動時に接続するWifiを固定にする
`/etc/wpa_supplicant/wpa_supplicant.conf`というファイルに、これまでラズベリーパイで接続したWifiの一覧が載っているので、その中からモバイルルーターのものだけを残して、それ以外を削除します。

こんな感じ

```:/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
	ssid="モバイルルーターのSSID"
	psk="***************"
	key_mgmt=WPA-PSK
}
```

## 接続確認
自分のパソコンをモバイルルーターに接続して、sshで接続してみます。

```shell-session:ターミナル
ssh pi@192.168.100.201
```

<img width="889" alt="raspberrypi-ssh.png" src="https://qiita-image-store.s3.amazonaws.com/0/148749/ef47eba4-6421-24e6-102f-8cf7e4e3f6c1.png">

無事接続できました。やりましたね！
Windows10 で、スタートアップ にプログラムを登録する方法

「ファイル名を指定して実行」で、
<pre>
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
</pre>
と入力。
開かれたウィンドウに、ショートカットアイコンを入れる。

以上
Gauche（Scheme）で値の型を調べるにはclass-of

```classof.scm
(print (class-of 123))
(print (class-of "hoge"))
(print (class-of 'moge))
(print (class-of #t))
(print (class-of '()))
(print (class-of '(1 2)))
(print (class-of (cons 'a 'b)))
(print (class-of ''a))
(print (class-of (quote (quote a))))
(print (class-of (number->string 123)))

;; 結果
#<class <integer>>
#<class <string>>
#<class <symbol>>
#<class <boolean>>
#<class <null>>
#<class <pair>>
#<class <pair>>
#<class <pair>>
#<class <pair>>
#<class <string>>
```

Racketなどの他の処理系の場合はこちらに書いてある：
http://stackoverflow.com/questions/11566886/how-do-i-get-the-type-of-a-value-in-scheme
C++オブジェクトポインタ

## オブジェクトポインタとは
* クラスを作成し、Main関数などでオブジェクトを宣言するときに、[ポインタ](http://pg-kura.hatenablog.com/entry/20120611/1339376977)を用いること

## 実際に使って見る
### オブジェクトの生成
```
クラス名 *オブジェクト名;
オブジェクト名= new クラス名[数字];
```
数字はオブジェクトを何個作るのか入力する（配列を一緒）
ex.)

```
Car *ferrari;
ferrari=new Car[5];
```
この場合だとCarクラスにferrariというオブジェクトを5つ作る
　ー＞　フェラーリを5台作る

### クラスの関数を呼び出し
配列と同様に添字を指定して呼び出すことができる

```
(ferrari+1)->showName();
```
この場合、2番目のフェラーリの名前を表示する

### オブジェクト破棄
使用し終わったオブジェクトを破棄する

```
delete [] オブジェクト名;
delete [] ferrari;
```
phpenvのPHPインストール時のオプションメモ

# phpenvのPHPインストール時のオプションメモ

phpenv派です（anyenvで統一できるから）。

管理が面倒なので default_configure_options は利用しません。.zsh_historyで管理しています。

消えるといけないのでQiitaにメモ。

```sh
$ YACC="$(brew --prefix bison27)/bin/bison" CONFIGURE_OPTS="--with-vpx-dir=$(brew --prefix libvpx) --disable-dba --disable-fpm --enable-bcmath --enable-calendar --enable-cgi --enable-ctype --enable-dom --enable-exif --enable-fileinfo --enable-ftp --enable-gd-native-ttf --enable-hash --enable-intl --enable-json --enable-mbregex --enable-mbstring --enable-pcntl --enable-phar --enable-shmop --enable-simplexml --enable-soap --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-tokenizer --enable-wddx --enable-zip --with-bz2 --with-curl --with-enchant --with-gd --with-gettext --with-gmp --with-iconv=$(brew --prefix libiconv) --with-jpeg-dir --with-kerberos --with-layout=GNU --with-libxml-dir=$(brew --prefix libxml2) --with-mcrypt --with-mhash=yes --with-mysql --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-onig --with-openssl=$(brew --prefix openssl) --with-pcre-regex --with-pdo-mysql=mysqlnd --with-pear --with-pic --with-png-dir --with-xmlrpc --with-zlib --with-zlib-dir --without-mm --with-pgsql=$(brew --prefix postgresql) --with-pdo-pgsql=$(brew --prefix postgresql)" phpenv install 5.6.28
```
【Support】どのOSとブラウザをサポート対象にするか。

# 背景
サービスを運営する上で、対象環境を明確にするのは大切。
明確にすることで、OSやブラウザ依存の考慮が減る。
なにより、利用者にわかりやすい。

では、どこまでをサポートすればいいのか？
この問いに対する１つの見解を載せます。

# 先人の知恵（参考文献）
実績ある企業のドキュメントを参考にさせていただきました。
>
- [クックパットヘルプ - 推奨環境について - ](https://cookpad.com/helps/group/44)
- [ジェイアール四国コミュニケーションウェア - OS、ブラウザのサポート期間について - ](https://goo.gl/KmKQkK)

以上をベースに推奨環境を決めていきます。
# PC / OS
```
・ Windows7
・ Windows8
・ Windows10
・ MaxOS X 10.6以降
```
- サポート期間が終わっていること
- OSのシェア率

以上２点を踏まえて、OS X 10.6以降にしました。
> [Mac OSのサポート終了日と対応機種をまとめてみた！](https://goo.gl/wj1AqD
)

# PC / Browser
```
  IE11以降 
  Firefox 最新版
  Chrome 最新版
  Safari 最新版
  Microsoft Edge 最新版
```

# SP / OS
```
・ i0S 8.0以降
・ android 4.2以降
```
- iOS 8.0以降のシェアは約98%
- android 4.2以降のシェアは約97%

以上からこのバージョンに決めています。
> [スマタブinfo by KSK](http://smatabinfo.jp/os/ios/)


# SP / Browser
```
Google Chrome
Safari
```

**androidの標準ブラウザをサポート対象から外しました。**

# なぜ標準ブラウザをサポート外にするの？
android4.3以前に搭載されている標準ブラウザには、脆弱性があるためです。
>
大ざっぱに説明しますと、細工が施されたサイトに標準ブラウザでアクセスした場合、本来なら読み取れないはずのデータまで相手に渡してしまうということです。
[【Android】標準ブラウザに深刻な脆弱性。アカウントを不正に利用される恐れあり](https://goo.gl/LCQSu8)

Googleも以下の様に述べています。(引用記事ですが)
>
また、Android 4.3以前の端末ユーザーに対しては、Chrome（Android 4.0以降に対応）やFirefox（Android 2.3以降に対応）といった、アップデートが続けられているブラウザーを利用することを推奨している。
[Android 4.3以前の標準ブラウザーは修正パッチの提供打ち切り、セキュリティ担当者が見解を示す](https://goo.gl/ymLycx)

# 懸念点
1. Windows Vistaを対象に含めるか
2. android標準ブラウザのシェア率

１の理由は、**Windows Vistaのサポートが2017'4/11で切れる**ため。
> [Windows 10と8系と7とVistaのサポート終了までの期間一覧](http://bto-pc.jp/btopc-com/infomation/windows-7-vista-xp.html)

今回は必須ではなく推奨なので含めませんでしたが...。


２に関しては、脆弱性の点では標準ブラウザを含めたくない。
しかし、以下によると**2016年６月時点でシェアが約9%**
> [ディバイス毎のWebブラウザシェアは?　2016-6月](https://goo.gl/ieUCfh)

セキュリティを取るか、シェア9%を取るか...。


# まとめ
上記はあくまで１つの見解です。

- プロジェクト
- 利用者層
- 実施時期

などに依って判断基準は変わります。
もし参考にされる際は、その点を踏まえてご利用ください。
WordPressでパーマリンクが編集できなくなったけど「クイック編集」で直したらイケた

## 一度保存した投稿名を変えさせてくれない

WordPressのパーマリンクを「投稿名」に設定していて、一度保存した投稿名を［編集］して修正しようとしたのに、なぜか更新されない。

重複する投稿名があるわけでもなく、ゴミ箱も空にした。プラグインも全停止したけど状況変わらず。なんでやねんねん。

## 投稿一覧の「クイック編集」から編集するとなぜか直る

ググってもなかなか情報が出てこなかったけど、発見。

> WordPressのパーマリンクが編集できない | ドクターPHのブログ
> http://teinenblog.chemistry.under.jp/?eid=53

> Wordpressで「新規投稿を追加」や「投稿編集」でパーマリンクが変更できなくなったときの対処法 | ゆうじの日記 (Web Archive)
> https://web.archive.org/web/20150228154658/http://infra-engineer.com/wordpress-2/wordpress%E3%81%A7%E3%80%8C%E6%96%B0%E8%A6%8F%E6%8A%95%E7%A8%BF%E3%82%92%E8%BF%BD%E5%8A%A0%E3%80%8D%E3%82%84%E3%80%8C%E6%8A%95%E7%A8%BF%E7%B7%A8%E9%9B%86%E3%80%8D%E3%81%A7%E3%83%91%E3%83%BC%E3%83%9E

根本的な原因は分からなかったものの、たしかに「クイック編集」で直った。とりあえずこれで良しとする。

## 奥の手はデータベースの直接編集

他の記事によると データベースを直接編集して `wp_posts` の `post_name` をいじっても良い（試してみたけど、たしかに直った）らしいけど、その辺は自己責任で。

## あとがき

Qiitaに初投稿した数時間後に、新たな Tipsに出会い2つ目の投稿。書き始めたことで感度が高くなってるのかなんなのか。良い傾向な気がするので続けてみよう。
OSGi概要

##はじめに
以前OSGiについて調べた結果をまとめたものです。
(ちょっと古い情報もあるかもしれませんのであしからず)

---

##OSGiとは

- OSGi Alliance(標準化団体) が規定する、Javaをベースとしたソフトウェア部品化技術に関する仕様
- Javaのパッケージやクラスの管理を詳細に規定

---

##背景
- 当初は家庭や小規模オフィス向けのゲートウェイ装置で動作するサービスプログラムの実行基盤を対象としていた対象を車載機器やモバイル端末、エンタープライズシステムに拡大
- Eclipse 3.0がプラグイン管理システムとしてOSGi仕様を採用し、Javaの世界での知名度が向上
- Javaのコンポーネント志向のプラットフォームとして不足している部分を補うものとして注目されている

---

##特徴
- モジュール管理の仕組みを規定
    - 管理単位の一貫性
        - 開発時も実行時もバンドル(jar)単位で扱う
    - 依存関係
        - モジュール外部に公開するインターフェースや、依存先の明示
        - モジュール毎に独立したクラスローダー
        - 実行時ではなく、ロード時に依存関係のチェックを行う
        - バージョン管理
    - 動的モジュール交換
- 実績と多くの実装系の存在
    - Equinox
    - Apache Felix
    - Knopflerfish

---
##OSGiバンドル
- バンドル: OSGiにおけるモジュールの管理単位
    - OSGiではアプリケーション部品(jar)を「バンドル」と定義
- バンドル≒ jar
    - バンドルとしての定義 => jarのマニフェスト・ファイルに、OSGi特有の属性(メタ・データ)を追加
    - jarの仕組みをそのまま利用しているため、OSGiバンドルはOSGiコンテナのない通常の環境では単なるjarファイルとして扱える

---
##OSGiバンドルManifest

```
Manifest-Version: 1.0
Bundle-SymbolicName: com.ibm.jp.myapp
Bundle-Name: My Application Bundle
Bundle-Vendor: IBM Japan
Bundle-Version: 2.0.0
Import-Package:
  com.ibm.jp.mylib1.ui;version="[1.2.0,1.3.0)",
  com.ibm.jp.mylib1.util;version="[1.2.0,1.3.0)"
Export-Package:
  com.ibm.jp.myapp;version="2.0.0"
Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-Activator: com.ibm.jp.myapp.MyAppActivator
```

---
##OSGiによるモジュール管理 

- 依存関係の明確化
    - アクセス制御
        - 従来のJavaの仕組み(private, public, protectedのアクセス修飾子等)に加え、バンドル間でのアクセス制御が可能
        - 設計モデルと実行モデルの一貫性
    - バージョン管理
        - 依存関係のトレーサビリティー
        - 変更が入った場合の影響範囲の特定

---
##OSGiによるモジュール管理(イメージ)
![image01.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/3098863b-486e-f402-e5c8-ca09e1ca3766.jpeg)

---
##jarの依存関係についての補足(1/2)
OSGiバンドル間は、大きく分けてTightly-Coupled, Loosely-Coupled という連携形態があります。

**Tightly-Coupled**:
ベーシックな方法としてパッケージの単位でExport/Importによる依存関係を定義でき、これをTightly-Coupledと呼んでいます。OSGi バンドル間は直接的な依存関係を持つため、Exportしている側の入れ替えはImportしている側に影響します。
**Loosely-Coupled**:
Tightly-Coupledのような直接的な依存関係ではなく、インターフェース部分と実装部分を別OSGi バンドルに分けるような構成をとると、インターフェース部分が仲介となって、親(使う側)と子(使われる側)は直接的な依存関係が無くなり、柔軟な変更管理ができるようになります。このような構成をLoosely-Coupledと呼んでいます。

---

##jarの依存関係についての補足(2/2)
OSGiでは、Loosely-Coupledを実現するメカニズムをいくつか提供しています。例えばOSGi Service機能を介することで、サービスを動的に登録したり参照することができ、直接的に依存関係にないOSGiバンドル間での連携ができます。その他、Blueprintというプログラミング・モデルを使う方法がベストプラクティスとして上げられています。
sed の p コマンドを ruby で ( シリーズ: Ruby ワンライナ ちょっとずつ 1 )

sed や tr を捨てたいのでちょっとづつ Ruby ワンライナを学ぶ．

# 参考

- http://maeharin.hatenablog.com/entry/20130113/ruby_oneliner
- http://takuya-1st.hatenablog.jp/entry/2013/08/19/194819
- http://qiita.com/bash0C7/items/749e60ff770b2e465b5e
- http://d.hatena.ne.jp/zariganitosh/20131107/ruby_oneliner_omission

# これまで

```
cat foo.txt | sed -ne '/str/p'
```

で `str` を含む行だけを表示．

# これから

```
cat foo.txt | ruby -ne 'print $_ if /str/.match($_)'
```

# 所見・所感

sed はデフォルトでは全ての行を表示するので， `p` コマンドを使うときは `-n` オプションが必須になる．これをよく忘れるので， Ruby でやった方が楽そうだ．
JSON/REST APIの簡易テスト方法

#はじめに
ブラウザだけで、JSON SchemaからJSONデータを組み立てて、RESTのAPIを簡易的にテストする方法についてのメモです。
コーディングとか無しで、簡単なJSONデータでサクッとテストしたい場合に使えます。

#JSONデータの組み立て
JSON SchemaからJSONデータを組み立てられる、以下のようなサイトがあります。
[JSON Editor](http://jeremydorn.com/json-editor/)
こちらのサイトで、以下のようにJSON SchemaからJSONデータを簡易的に生成させることができます。(項目がたくさんあると死にますが...)
![image01.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/7bf88a74-52fc-fa94-c583-f9c2b44eb09d.jpeg)

#REST API実行
RESTなので、HTTPリクエストが投げられるツールがあればよいです。例えば、FireFoxのHttpRequesterというアドオンがあります。
FireFoxのツール-アドオンから入手できます。
![image02.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/edf042e3-2542-ec13-9632-6f4e7c5d0cd7.jpeg)

このアドオンをインストールすると、ツールからHttpRequesterというメニューが選択できます。
この機能で生成させたJSONを指定して、HTTPリクエスト投げればOK。
![image03.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/e566a3c8-2ebd-3430-3c41-8a6b4c71452a.jpeg)


返されたJSONデータと想定されるSchemaを上のサイトにコピペすると、戻り値のValidationも行えます。

#追記
JSON整形/構文チェックツール
https://lab.syncer.jp/Tool/JSON-Viewer/
JavaScriptベースで動作するので、ローカルに落として使えばサーバーにデータを上げなくてもよいので非常に使い勝手がよい。

Restlet Client - REST API Testing
https://chrome.google.com/webstore/detail/restlet-client-rest-api-t/aejoelaoggembcahagimdiliamlcdmfm
Chromeのプラグインとして提供されているREST APIテストツール。テストケースを保存しておいたり複数のリクエストを流すシナリオを作れたり、かなりリッチな機能を提供してくれている。

Swagger
https://swagger.io/
本来はこういう標準に従ってAPI記述やらテストやらするのが望ましいんでしょうけど。
matplotlibで多次元配列のヒートマップ

## 基本形

```
def draw_heatmap(data, min_value, max_value):
	"""
	:param data:二次元配列．入力するデータ
	:param min_value:カラーバーの最小値
	:param max_value:カラーバーの最大値
	"""
    # 描画する
    fig, ax = plt.subplots()
    heatmap = ax.pcolor(data, cmap=plt.cm.Blues, vmin=min_value, max_value=4)
	ax.set_xticks(np.arange(data.shape[0])+0.5, minor=False)
    ax.set_yticks(np.arange(data.shape[1])+0.5, minor=False)    
    ax.invert_yaxis()
    ax.xaxis.tick_top()
    plt.show()
```



### カラーバーの範囲設定
- `vmin`と`vmax`で設定
### 色相の設定
- `cmap`のところ．以前の[matplotlibで色をグラデーション的に選択](http://qiita.com/mommonta3/items/cea310b2c36a01b970a6)を参照

### 目盛りを真ん中に置く
- `ax.set_x(y)ticks`のところ
- 普通のままだと端っこに目盛りがついちゃう

### 左上を原点にしたい
- ヒートマップを使うとき，左上から右下に流した方がいいときもある
- `ax.invert_yaxis()`にてy軸を逆転
- `ax.xaxis.tick_top`にて，x軸の値を上に持ってこれる

### 出来上がり
こんな感じ(4*4の配列)


![Kobito.bLACCE.png](https://qiita-image-store.s3.amazonaws.com/0/146563/f903c927-d3b9-b1a5-2579-d5e30b11920e.png "Kobito.bLACCE.png")
Laravel5 の Migration で foreignKey を使う


久々にハマって、何が悪いのかわからんレベルだったのでメモ書き。

例えば `cds` テーブルを作って、ユーザに沢山のCDを入れてもらう時、`cds.user_id` を入れるのですが、そこに外部キーを設定するという話。

Laravel: 5.3
MySQL: 5.6.34

## 結果

`cds`テーブルを作るにはこんな感じのがいい。

```php
/**
 * Class AddCDTable
 *
 * CDを保存するテーブル
 */
class AddCDTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        \Schema::create( 'cds', function (Blueprint $table){
            $table->increments( 'id' );
            $table->unsignedInteger( 'user_id' )->comment = '所有ユーザデータID';
            $table->string( 'name' )->comment = 'CD名';
            $table->text('url')->comment = 'AmazonとかのURL';
            $table->timestamps();

            $table->index( 'user_id' );

            $table->foreign('user_id')
                ->references('id')->on('users')
                ->onDelete('cascade')
                ->onUpdate('cascade');
        } );
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        \Schema::dropIfExists( 'cds' );
    }
}

```

## 何も考えずにボクがやってしまった事


```php
/**
 * Class AddCDTable
 *
 * CDを保存するテーブル
 */
class AddCDTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        \Schema::create( 'cds', function (Blueprint $table){
            $table->increments( 'id' );
            $table->integer( 'user_id' )->comment = '所有ユーザデータID';
            $table->string( 'name' )->comment = 'CD名';
            $table->text('url')->comment = 'AmazonとかのURL';
            $table->timestamps();

            $table->foreign('user_id')
                ->references('id')->on('users')
                ->onDelete('cascade')
                ->onUpdate('cascade');
        } );
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        \Schema::dropIfExists( 'cds' );
    }
}

```

要は二つあって、

1. `cds.user_id` に Index が張られていないからコケる。
1. `cds.user_id` の型が、`increments`で作成される`unsigned int(10)`と、`integer`で生成される`int(11)`が別なのでコケる。

両方共、コケた時のエラーが `Cannot add foreign key constraint` だけなので話がなおややこしい。

細かいエラーを見るには `show warnings` を実行して結果の `Create table 'test/#sql-360e_7dc' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns.
`あたりから目星をつけるしか無いっぽい。
古めのWindows ＯＳでWinPythonでＩＤＥ環境構築した話。

#まず始まり。
Python3系統の入門書をかって読みつつ並行して、Pythonによるデータ分析入門を読んでいて。
統合開発環境で話が進むのでならばとＩＤＥを構築しようとしたところWindows Server 2008 R2 64bitでは思いのほか躓いたので割と古いWindowsユーザー向けに備忘録的に書いておきます。

#WinPythonを選ばない場合とPythonのVer.
今回はWinPythonで入れましたがanacondaで入るならそちらのほうが人によっては手軽かもしれません。
上記のオライリーの本では情報が古くEnthought CanopyとPython(x,y)について触れられていますが、今はあまりメジャーではないようです。
でたのが3年前ということもありPython2.7系列を勧めているようですが今はじめるということなら割と3系を勧められるそういう環境です。

#いるものいらないもの。起動するまで。
いらないものから、Python本体を先に入れて下手に環境変数とかをいじっちゃうとぐちゃぐちゃになる模様なのでやめときましょう。

Windows8以前だとvisual studioがいるので先に入れます。
[Microsoft Visual C++ Redistributable for Visual Studio 2015](https://www.visualstudio.com/downloads/#d-visual-c)
ここでvisual studioのアップデートがないかwindows updateから確認しておくと必要なファイルがないなどと言われなくなる。

あまり深く考えずに自分の環境にあった最新版のWinPythonの[インストーラー](https://sourceforge.net/projects/winpython/files/WinPython_3.4/3.4.4.5/)を落とします。
叩いて同意してC\直下に適当な名前のフォルダ（この例ではC:\WinPython）でインストールしたら環境変数をいじります。

コントロールパネルからシステム→システムの詳細設定でダイアログの下段付近の環境変数からpathのけつに
`;C:\WinPython-64bit-3.4.4.5;C:\WinPython-64bit-3.4.4.5\python-3.4.4.amd64\Scripts `
を追加。

PYHTONHOMEがおかしい場合は
`C:\WinPython\python-3.4.4`
と置き換えます。
以上です。あとは適当なフォルダ内にあるアプリから好きなものを起動してください。
Drupal

メモ書き

# Drupalインストール
[本家](https://www.drupal.org/blog/drupal-8-1-7-released)
[日本語インストール](http://drupal.jp/drupal6/guide/install-step1)

```:ダウンロード,解凍
% fetch http://ftp.drupal.org/files/projects/drupal-8.1.7.tar.gz
% tar -zxvf drupal-8.1.7.tar.gz
```

公開サイトのURLを叩いてみる
![aa.png](https://qiita-image-store.s3.amazonaws.com/0/39911/bbe9b027-bd4d-db1b-0c06-32630b7eb844.png)
日本語選択して「Save and continue」を押して見る
![bb.png](https://qiita-image-store.s3.amazonaws.com/0/39911/40d23c71-d1f4-516a-14df-46b0c690e784.png)
エラーで進めず

[Drupal 8 正式版のインストール時に発生した問題の解決方法](https://drupal.studio-umi.jp/node/289)を参考にする

```
% cd sites/default/
% ls
default.services.yml	default.settings.php
% mkdir files
% chmod a+w files
```
戻って「Save and continue」を押すと今度は通った。
![aa.png](https://qiita-image-store.s3.amazonaws.com/0/39911/c14c6296-e19f-83a9-8fed-e27efb071bbd.png)

「保存して次へ」を押すとまたエラー
上の３つはサーバ環境によるようです。適時設定が必要です。
サーバーの方はWarningはとりあえず放置、errだけ対応。
![screencapture-drupal-w-lang-co-jp-core-install-php-1473150732489.png](https://qiita-image-store.s3.amazonaws.com/0/39911/8cd749b0-ce8e-54c4-23a0-e7de71a070fe.png)

```:設定ファイルのエラー対処
% cd sites/default/
% ls
default.services.yml	default.settings.php	files
% cp default.settings.php settings.php
% chmod a+w settings.php 
```
「再度トライしてください。」を押します。「とりあえず進む」を選択して進む。

![スクリーンショット 2016-09-06 18.10.13.png](https://qiita-image-store.s3.amazonaws.com/0/39911/1c29487e-7e0f-242d-8e90-963f376c74a0.png)

とりあえずデータベースはSQLiteで進める。「保存して次へ」

![スクリーンショット 2016-09-06 18.24.48.png](https://qiita-image-store.s3.amazonaws.com/0/39911/97e51398-97ca-1cb3-04e0-f1998bdbc7d0.png)

この後、なぜかページがありません状態になったので、リロードをしてみた。
何事もなかったように、次のセッションに進んでくれた。

![スクリーンショット 2016-09-06 18.28.09.png](https://qiita-image-store.s3.amazonaws.com/0/39911/b3dee652-5ed5-9daf-ec17-3c75d30d9346.png)

100%になると次の画面に。。
必須項目を埋めて次に進む。
![screencapture-drupal-w-lang-co-jp-core-install-php-1473154308155.png](https://qiita-image-store.s3.amazonaws.com/0/39911/5db16f9b-60fb-980c-dd84-7d40445bb854.png)

![スクリーンショット 2016-09-06 18.41.14.png](https://qiita-image-store.s3.amazonaws.com/0/39911/4552f91a-d1e4-8240-02d2-d8af92c0dfa6.png)

つながった

![スクリーンショット 2016-09-06 18.42.05.png](https://qiita-image-store.s3.amazonaws.com/0/39911/99b06abc-d48c-bedf-77da-dd63ec644b61.png)

しかし、、、メニューのリンクを押すと「NotFound」になってしまいます。
これは、クリーンURLを無視して進めたせいです。

ためしに、`http://domein.co.jp/` がURLだったとしたら、
`http://domein.co.jp/admin/` でNotFoundになってるので、間に index.php を挟み込んでみます。
`http://domein.co.jp/index.php/admin/` そうするとつながります。。。

この解決策は htaccess をいじればいいようです。
[Drupal7でclean URL(クリーンURL)が使えないと思った時の対処法](https://drupal.studio-umi.jp/blog/How-to-get-clean-URLs-working-by-htaccess-on-Drupal7)
Prezto のインストールのアレが分からん

[アレ](https://github.com/sorin-ionescu/prezto#installation)
====

```
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

`${ZDOTDIR:-$HOME}`
-----
https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBB

`^README.md`
------------
http://zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Operators

`setopt EXTENDED_GLOB` で有効っぽい。

`(.N)`
-----
http://zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Qualifiers

`.` と `N` それぞれがフラグ。

同じ記号でも文脈で用途が違ったりでググラビリティが低い、そもそも記号のググラビリティが低い、等で辛みがあるので bash/zsh 記号まとめみたいなのが欲しい。[Ruby のやつ](https://docs.ruby-lang.org/ja/latest/doc/symref.html)便利だと思う。
Pug（旧Jade）では属性の値に #{var} は使えない

JadeからPugになって、移行しようと思って使ってはみたものの、
属性に指定した変数がちゃんと出力されなくて「まだバグが多いのかな」とか勝手に思ってたんですが、解決しました。

## もともとJadeではこう書けた

タグの属性の値に変数を使うとき、 `#{var}` みたいな書き方しかできないと思い込んでました。

```jade:jade
- var charset = "utf-8";

meta(charset="#{charset}")
```

以下のようにも書けるんですね。（知りませんでした…なんで見落としてたのか）

```jade:jade
meta(charset=charset)
```

出力されるHTMLはいずれも以下のとおり。

```html:html
<meta charset="utf-8">
```

## Pugで出力した結果

```jade:pug
- var charset = "utf-8";

meta(charset="#{charset}")
```

「拡張子jadeをpugにしてgulp-jadeをgulp-pugに変えれば動くでしょ」と思っていたら

```html:html
<meta charset="#{charset}">
```

なんでだぁ！？
原因がわからず「とりあえず、まだJadeでいいや」って思っていたんですが、ちゃんとリファレンスに古い記法だと書いてありました。

https://pugjs.org/api/migration-v2.html#attribute-interpolation

※属性の中で使えないだけで、外であれば今までどおり使うことが出来ます。

```jade:pug
p #{name}
```


## 解決策

とりあえずは以下のような書き方をしておけば、Jadeから問題なく移行できるのではないかと思います。

### サンプル1

Jadeでも通用する書き方の繰り返しになってしまうんですが

```jade:pug
meta(charset=charset)
```

```html:html
<meta charset="utf-8">
```

### サンプル2

```jade:pug
- var css = "./assets/css/";

link(rel="stylesheet", href=css+"style.css")
```

```html:html
<link rel="stylesheet" href="./assets/css/style.css">
```

### サンプル3： `"#{var}"` を `` `${var}` `` にする

`#` を `$`　に変更するのはわかりやすいですが、
シングルクォートやダブルクォートではなくバッククォート（`）を使って書くという点。（ES6記法なんですね）

```jade:pug
- var link = 'hoge';

a(href=`before${link}after`)
```

```html:html
<a href="beforehogeafter"></a>
```

***

`#{var}` を使っていなかった人なら問題なくPugに移行できるのかもしれませんが、なかなかうまくいかなくて困っている人がいたら、もしかするとこういうことかもしれません。
デリゲートやプロトコルを使わずに他クラスに定義されたメソッドを呼び出す方法

#classAに定義されたUIViewControllerをclassBから呼び出したい\:kissing_closed_eyes:


やりたいことは単純だ。ボタンを押したら画面が繊維する。でも、色々あって自クラスに`UIViewController`を定義できないのだ。

ストーリーボードやUIの動作はclassAにあるけど、処理はclassBにあって、clssAでボタンを押した結果、その後の処理はclassBに来るから、そこで、`pushViewController`を定義したいけれど、

でもclassBはUIViewControllerを定義できないから`pushViewController`を呼び出せない。どう上手に説明していいか分かりません。わからなければ、僕にはもう、どうすルコともできません。

どちらにせよ`presentViewController`にしても`pushViewController`にしても、それらは`UIViewController`のインスタンスメソッドですから

`uivewcontroller`が定義されてないclassではメソッドが呼べないのです。私には、`UIViewController`を定義してるclassが必要なのです

どうすればいいか`UIViewController`を定義してるclassから`UIViewController`へ`UIViewController`を渡せばいいじゃないか

デリゲートが処理を受け取るイメージで、プロトコルが自分を大きくするイメージなら、もらうイメージです。よくわかりませんか、困ったなあ。

#コード

受け取る方(uiviewcontrollerを継承してないclass)

```swift:classB

var viewControllerPush : UIViewController? = nil
//変数viewControllerを定義してnillを入れておく
//ここにUIViewControllerが入ってきます

```






渡す方(uiviewcontrollerを継承してるclass)

```swift:classA

var jumpB = ClassB()
    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.jumpB.viewControllerPush = self

//classBをインスタンス化したjumpBを呼び出して
//classBにはviewControllerPushがいますから
//そこに、self（つまり、classAにはUIViewControllerが定義されてま)を入れる

```


#参考



https://developer.apple.com/reference/uikit/uiviewcontroller/1621380-presentviewcontroller
rails5 環境構築 メモ

# rails5系とnode6系を入れる必要があったのでメモ程度に。

## rails

### rbenvとruby-buildのインストール

```bash
$ brew install rbenv ruby-build
```

ruby-buildでrubyのいろいろなバージョンのインストール、rbenvでrubyのバージョンの切り替えができる。

### rbenvのpathを通す

```bash
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

rbenvのpathを通します。使っているシェルに応じてよしなにしてください。

### 日本語使いたい人はreadline

```
$ brew install readline
$ brew link readline --force
```

### rubyのインストール

```bash
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"
$ rbenv install 2.3.1
```

v2.3.1を入れましたが他のバージョンが良い人は `rbenv install -l` の中からお好きなものを。


### rubyのバージョンの切り替え

```bash
$ rbenv global 2.3.1
$ ruby -v
```

rubyのバージョンをインストールしたものに変更。
変更したバージョンが返ってこれば成功ですね。

### railsのインストール

```bash
$ gem install rails
$ rails -v
```

railsのインストール。
こちらもバージョンが返ってこればおk。

## node
### nodebrewのインストール

```bash
curl -L git.io/nodebrew | perl - setup
```

nodebrewで入れようかと思います。

### nodebrewのpathを通す

```bash
$ echo 'export PATH=/usr/local:$PATH' >> ~/.bash_profile
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
```

### nodeのインストール

```
$ nodebrew install-binary v6.0.0
```

v6.0.0を入れましたが他のバージョンが良い人は `nodebrew ls-remote` の中からお好きなものを。


### nodeのバージョン切り替え

```bash
$ nodebrew use v6.0.0
$ node -v
```

インストールしたバージョンが返ってこれば成功です。

---

**Happy Hacking!!**
プログラミング初心者がインタラクティブにUnityの知識を学べるプロジェクトを作りました

![a.gif](http://i.giphy.com/3o6ZsYmRkjQzX1KcQU.gif)

すでにあるゲームのコードをいじることでプログラミングを楽しく効率良く学ぼうという試みです。

プログラミング初心者が**モチベを保ちつつ**Unityの知識を深めるためには、自分が書いたコードがゲームにダイレクトに反映される経験が大事だと思っています。

やはりプログラミングは反応がある方が楽しいです。

今回はそのためのサンプルプロジェクトを作りました。

[Sample Project をダウンロード](
https://drive.google.com/open?id=0Bx6Sj9nvABSxUmt5WXM3X3N5bTg)

(11月15日追記)
githubにもプロジェクトをアップロードしました.
https://github.com/iwaken71/PracticeProject

# Sample Projectで使われている知識

+ 変数
+ ベクトル
+ if文
+ Input.GetKey
+ 関数
+ OnCollision,OnTrigger
+ Instantiate
+ UI
+ GetComponent
+ for文
+ GameManager
+ Destroy
+ Resources.Load
+ transform.Find
+ SceneManager 
+ Random.Range

# 使い方

1. 学習者と指導者はこのプロジェクトをダウンロードしインポートする。

2. 指導者は学習者に学習単元が理解していればできるような、課題を出す。
課題とは、プロジェクトの機能追加や変更である。

# 課題の例

## 変数
+ ボスの初期体力を10に設定しよう。
+ 弾の威力を5に変更しよう。
+ 初期状態で生成するプレイヤーの数を変数で設定できるようにしよう。 (ヒント: GameManagerクラス)

## ベクトル
+ 弾を常に真上に発射するようにしよう。
+ 上キーを押したら、z軸方向に進むようにしよう。

## Input.GetKey

+ スペースキーを押したら、弾を出し続けられるようにしよう
+ スペースキーではなく、[xキー]を押したら弾がでるようにしよう

## 関数
+ つねに弾が発射されるように、Shot関数を書く場所を変えよう。

こんな感じで、指導者は学習者にとって丁度いい課題を考えます。
ポイントは、コードの変更がすぐにゲームに反映されるのがわかることだと思っています。

# 参考URL
https://hackforplay.xyz/
Rspecでテストを実行すると`ActiveModel::MissingAttributeError:`になる


出たエラーはこんなやつ

```
Failure/Error:
       hogehoge.create(user: user, state: hoge)

     ActiveModel::MissingAttributeError:
       can't write unknown attribute `state`
```

エラーを直訳すると、`不明な属性stateを書き込めません`
多分、`state`が無いよってことだ。

`bin/rails c`して、同様の操作を行うと問題なく登録できるし、`hogehoge.state`ってやっても値は取得できる。

原因は単純で、テストDBが壊れていたとのこと。
そんな時は、こちらを実行すれば良いと教えてもらった。

```
¥ bin/rake db:test:prepare
```

このrakeタスクはtest用のDBを再構築してくれるイメージでOKとのこと。
以前は`rake db:test:clone`というのも使われていたらしいが、非推奨かもしれないので、上記使うと良いとのことでした。
:empty擬似クラスの落とし穴

HTMLの:empty擬似クラスを使う上での落とし穴を教わったので、ハマった記念に書き残しておきます。

# empty属性とは
https://developer.mozilla.org/ja/docs/Web/CSS/:empty

「__中身が空の時だけ適用されるスタイルを定義してくれそう__」
そんな雑なイメージを持ちますよね。
イメージが先行した状態でCSSを書くと、痛い目を見るという話を書いていきます。

# 適用されるケース
```html
<div></div>
```

```html
<div><!-- comment --></div>
```

上の2ケースは問題無く適用される。
コメントを突っ込んでも、ちゃんと適用されます。

# 適用されないケース
```html
<div> </div>
```

```html
<div>
</div>
```


```html
<div>
<!-- comment -->
</div>
```

上の3パターンは、empty擬似クラスが適用されません。
要するに、__半角スペースや改行が入ってるとダメだよ__ってことです。

# サンプルデモ
https://jsfiddle.net/52td0qq9/

# まとめ
APIから取得したJSONをHTMLのテンプレートに流し込んで整形する、という実装を経験された方は多いのではないでしょうか？
「取得したJSONのvalueがnullの時はトルツメ(display:none)することも可能なので、興味のある方は使ってみるといいかもしれません。

これは自戒の意味も込めてますが・・ドキュメントはよく読みましょう(ヽ´ω`)。
※MDNのドキュメントに「※半角スペースなども文字に含まれる」とちゃんと記載されています（もうちょっと強調してよ！と思わなくもないですが）。
c++ builder XE4, 10.2 Tokyo > TPageControl > 特定のTabSheetを非表示にする

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

TPageControlにて実装途中の機能がある場合、特定のTabSheetを非表示にしておきたい場合がある。

### コードでの非表示

参考 [Delphi：TPageControl でタブ部分を非表示にする方法 @ ゆめとちぼーとげんじつと](http://blog.dreamhive.co.jp/yama/2698.html)

情報感謝です。


C++ Builderの場合、以下のコードで非表示にできました。

```Unit1.cpp
void __fastcall TForm1::FormShow(TObject *Sender)
{
	for (int idx=2; idx < PageControl1->PageCount; idx++) {
		PageControl1->Pages[idx]->TabVisible = false;
	}
}
```

FormShow時の処理が適切かどうかは要検討。


デザイン時

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/88dceb9d-e378-2def-ea28-be97cbbaa899.png)


実行時

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0bd10324-571e-d38d-571e-d42e8fad202a.png)


### デザインでの非表示

TabSheet3などを選択してプロパティ「TabVisible」をfalseにすることでそのTabSheetを非表示にできる。

こちらでの設定時の欠点は、フォームのデザインにfalseにしたTabSheetが表示されなくなること (下図)。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b3c751b7-5348-ab2f-0592-17514c4a6fea.png)


オブジェクトインスペクタでのリストには残っている(下図)。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c5b5c144-5d31-50ba-bed8-4b263fffbde0.png)

フォームのデザインを見て、非表示になっているTabSheetに気づくには、オブジェクトインスペクタのリストをくまなく読まないといけなくなる。
GitHubでSSH接続ができない時の対処法

# 対処法
　今回は、ターミナルで以下のコマンドを実行することで、pushすることができるようになりました。一つの解決方法として、試してみてください。

　まず、以下のコマンドで現在の状況を確認します。今回は、ユーザ名をNAME、レポジトリ名をrepo/sosとします。

```
git remote -v
```

私の場合では、以下の状況でした。

```
origin	https://github.com/NAME/repo/sos.git (fetch)
origin	https://github.com/NAME/repo/sos.git (push)
```

本来ならば、以下のような出力を得られなければなりません。

```
origin	git@github.com:NAME/repo/sos.git (fetch)
origin	git@github.com:NAME/repo/sos.git (push)
```

よって、これから設定していきます。
ターミナルで以下のコマンドを入力するだけで完了です。

```
git remote set-url origin git@github.com:NAME/repo/sos.git
```

それでは確認してみましょう。

```
origin	git@github.com:NAME/repo/sos.git (fetch)
origin	git@github.com:NAME/repo/sos.git (push)
```

が出力されたら大丈夫です。
異なる出力が得られた場合は、入力したコマンドを確認してみましょう。
redisをDockerコンテナで用意する


```
docker run --name redis -d -p 6379:6379 redis redis-server --appendonly yes
```

これでredisのコンテナが起動するので動作確認してみます。
ローカルから接続するためmacにもredisをインストールしました。

```
brew install redis
```

これで準備完了。接続してみます。

```
$ redis-cli
127.0.0.1:6379>
```

接続できました。
コマンドをいくつか試してみます。

```
127.0.0.1:6379> set test abc
OK
127.0.0.1:6379> set room01 1000
OK
127.0.0.1:6379> keys *
1) "test"
2) "room01"
127.0.0.1:6379> get room01
"1000"

```

一度プロセスを落として起動してもデータが残っているかみてみます。

```
$ docker stop redis
$ redis-cli                                                                                                                                     127.0.0.1:6379> keys *
Error: Server closed the connection
127.0.0.1:6379> exit
$ docker start redis
$ redis-cli                                                                                                                                     127.0.0.1:6379> keys *
1) "room01"
2) "test"
```

データの保存も大丈夫そうです。
開発環境としてはとてもお手軽でよいですね。
node.jsを使ってtwitter botを作ってみる


### twitterにアプリ登録する

接続に必要なconsumer key, consumer secret, access token, access token secretを取得するために登録を行います。

https://apps.twitter.com

こちらのサイトにアクセスします。
botでつぶやきたいアカウントでログインしてください。
プログラムを動かしたときに正しくできていればここでアプリ登録したアカウントでメッセージが投稿されてしまいますのでご注意を。

### node-twitterを利用する

https://github.com/jdub/node-twitter

今回はこれを利用しました。

```app.js
var twitter = require('twitter');

var bot = new twitter({
    consumer_key        : "xxxxxxxxxx" /* 各自記入 */,
    consumer_secret     : "xxxxxxxxxx" /* 各自記入 */,
    access_token_key    : "xxxxxxxxxx" /* 各自記入 */,
    access_token_secret : "xxxxxxxxxx" /* 各自記入 */
});
bot.updateStatus("this is test tweet by bot program.",function(data){
	console.log(data);
});
```

### 実行する

```
node app.js
```

これだけで実行したらつぶやくことはできました。

### 定期実行する

さっきのスクリプトをcronとかで時間設定して動かすこともできるけど、今回はnode.js上で実現してみます。

```app.js
require('date-utils');
var twitter = require('twitter');

var url = "http://xxxxxxxxxxxxxxxx"
var interval = 28800000; // ８時間


var bot = new twitter({
    consumer_key        : "xxxxxxxxxx" /* 各自記入 */,
    consumer_secret     : "xxxxxxxxxx" /* 各自記入 */,
    access_token_key    : "xxxxxxxxxx" /* 各自記入 */,
    access_token_secret : "xxxxxxxxxx" /* 各自記入 */
});

// tweet every {interval} ms
setInterval(
	function tweet() {
       // メッセージが重複しないように日付と時間を入れる
		var dateStr = new Date().toFormat("YYYY/MM/DD/ HH24:MI");
		bot.updateStatus("メッセージ" + url + " - " + dateStr,function(data){
			console.log(data);
		});
	}, interval
);

```

setIntervalで実現できました。
好きな間隔でintervalを設定しましょう。

プロセスの起動にはforeverを利用します。
foreverのインストールはnpmコマンドで。

```
sudo npm install forever -g
```

インストールできたら実行してみます。

```
forever start app.js
```

起動したプロセスの確認は以下の通り。

```
$ forever list
info:    Forever processes running
data:        uid  command         script forever pid  id logfile                          uptime
data:    [0] 34EC /usr/bin/nodejs app.js 6381    6383    /home/xxxxx/.forever/34EC.log 0:0:33:7.778
```
postgresqlで "terminating connection due to conflict with recovery" に遭遇した時に辿りつく、vacuum_defer_cleanup_age, max_standby_streaming_delay, hot_standby_feedback について (調査進行中)

Postgresqlのslaveサーバ上で、`terminating connection due to conflict with recovery` というエラーをくらった時に調べることになる、 `vacuum_defer_cleanup_age`, `max_standby_streaming_delay`, `hot_standby_feedback` というパラメータについて、色々と調べたので、まとめてみました。ただ、まだ最終的な解には辿り着けていません。。


# 説明動画
`AWS re:Invent 2015 | (DAT402) Amazon RDS PostgreSQL: Lessons Learned & New Features` というセッションの一部でこのパラメータについて説明されていました。
https://www.youtube.com/watch?v=tZXp19q8RFo#t=31m55s
いつも文字でパラメータの説明を読んでいて、頭がこんがらがっていましたが、うまくvisualizeしてくれていて、とても分りやすい説明でした。

<br>
以下、動画で説明されていたことの要約

# vacuum_defer_cleanup_age
- vacuumで消された行をどれくらいの間残しておくか。ただし、設定が時間単位ではなく、transaction数単位で、設定が難しいのであまり使われていない 

# max_standby_streaming_delay, max_standby_archive_delay
- slaveで実行中のqueryが必要とする行がvacuum対象となっている時、replication streaming or wal archiveの実行を中断し、queryの実行を優先させる際の最大のdelayの許容時間。
    - 大きく設定すれば、queryは流れやすくなるが、delayが大きくなる可能性がある。
- 全sessionの累積なので、全てのtransactionでその挙動が保証されるわけではない。(ここはちょっと意味が聞き取りきれず、ドキュメントでも記載を見つけれなかった。)
- primaryの挙動に影響を与えないという点で、安心感があって人気がある。

# hot_standby_feedback
- slaveからprimaryに実行中のqueryの情報を定期的に送信し、primaryはその情報を元に必要とされているrowをvacuumしないようにする。
- slave上のqueryはほぼ走りきるが、vacuumをブロックするので、disk容量が膨らむ可能性がある。
- プレゼンしてる人のおすすめ

<br/>

# But...
ここまでの説明を見た感じ、多少vacuumが実行されるのが遅くなろうと、`hot_standby_feedback` が最強かなと思って使ってみたのですが、`pg_dump`を流していたらこんなエラーに遭遇。。

```shell-session
pg_dump: Error message from server: ERROR:  canceling statement due to conflict with recovery
DETAIL:  User was holding a relation lock for too long.
```
色々と検索して、このQAを見つけたのですが、 
http://postgresql.nabble.com/Query-cancellation-on-hot-standby-because-of-buffer-pins-td5838689.html
> Yes, you are confusing block and relation level locks. The contention 
is at block level. 

`block level lock` というのと、`relation level locks`というのの違いがわからず、行き詰まる & 結局 `max_standby_streaming_delay`, `max_standby_archive_delay`を指定しなければいけないのであれば、`hot_standby_feedback`の存在意義が無いような気がしてきている <- 今ここ


引き続き調べてみて、何か分かったら更新したいと思います。。
Python環境を作る


作業メモ
作業した環境はUbuntu14.04

# インストール
以下のプロジェクトのインストーラを利用
https://github.com/yyuu/pyenv-installer

```
$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
```

最後に以下のメッセージが出たのでその通りにbash_profileに記載。

```
# Load pyenv automatically by adding
# the following to ~/.bash_profile:

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

読み込み

```
source .bashrc
```

pluginsには以下のものが入っていた。

```
pyenv-doctor
pyenv-installer
pyenv-pip-rehash
pyenv-update
pyenv-virtualenv
pyenv-which-ext
python-build
```


# Python3系をインストールしてみる

```
$ pyenv install 3.4.3
Downloading Python-3.4.3.tgz...
-> https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
Installing Python-3.4.3...
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
Installed Python-3.4.3 to /home/user/.pyenv/versions/3.4.3
```

となってしまったので足らなそうなlibをインストール

```
sudo apt-get install libsqlite3-dev
sudo apt-get install bzip2 libbz2-dev
sudo apt-get install libssl-dev openssl
sudo apt-get install libreadline6 libreadline6-dev
```

今度はちゃんとインストールされて以下のようにインストールされたことも確認できました。

```
$ pyenv versions
* system 
  3.4.3
```

# バージョンの使い分け

https://github.com/yyuu/pyenv-virtualenv

``` example
pyenv virtualenv 2.7.7 my-virtual-env-2.7.7
```
開発プロセスについて


開発をアジャイルで進めるか、ウォーターフォールで進めるかによらずどんな工程があるのかを書き出してみて、見積もり時にこの工程の工数の考慮が抜けてた！みたいなことを減らそうという取り組みをしていました。

記載している工程が必ず実行される訳ではなく案件に応じて取捨選択しても良いが、必ず今回は必要ないからやらないんだという判断をしてやらないことが大事かなと。

## 開発
* 開発環境構築
* コーディング

## テスト、QA
* 環境整備
* 単体テスト
* 結合テスト
* 負荷テスト
* セキュリティテスト(監視)

## ビルド・デプロイ
* 自動テスト
* ビルド
* デプロイ

## 監視
* 稼働監視
* 閾値エラー監視
* セキュリティ監視
* 利用状況、パフォーマンス監視

## 運用
* 定期運用作業 (モニタリング)
	エラー調査・改修
	利用状況、パフォーマンス調査・改修
* KPIの抽出、可視化
* ログ管理
* ハードウェア保守
	部品交換
	ファーム等のパッチ当て

* 障害対応


他にも色々あると思うし、それぞれの工程の言葉の定義というか作業範囲の認識を合わせることも大事。
今さらながらEclipseで書かれたAndroidプロジェクトをAndroidStudioに移行した。

先日下記の記事の通り、EclipseのAndroidDepeloperToolsの正式サポートが終了したばかりのこのときに、古いEclipseプロジェクトをAndroid Studioに移行することになりました。

[Eclipse Android デベロッパー ツールのサポート終了](https://googledevjp.blogspot.jp/2016/11/support-ended-for-eclipse-android.html)

基本的にはこちらの移行手順のまま進めていけば問題はないが、若干のハマりポイントがあったので、補足してみようと思います。
[Eclipse から Android Studio への移行](https://developer.android.com/studio/intro/migrate.html?hl=ja)

# Eclipse の .project ファイルと .classpath ファイルは消さないこと。
移行手順も書かれていますが、このファイルの有無でAndroid Studioは当該プロジェクトがEclipseプロジェクトかどうかを判断しているようです。
別の誰かから譲渡されたようなプロジェクトで本ファイルがない場合はインポートできないので、一度Eclipseでインポートしてからでも作成しておくとよいです。

# .ideaディレクトリ、gradleディレクトリ、build.gradleは削除しておくこと。
反対にこれらがEclipseプロジェクトにあると邪魔をします。
Android Studioが通常のAndroid Studioのプロジェクトだと勘違いしてしまいますので、削除しておいてください。

# ライブラリプロジェクトはメインプロジェクトの中には置かない。
たまに下記のようなディレクトリ構成で管理をしている場合もあると思いますが、メインプロジェクト内にライブラリプロジェクトがあると移行がうまくいかないです。

```
workspace
 |_Main Project
   |_assets
   |_res
   |_src
   |_Library Project
   | |_assets
   | |_res
   | |_src
   | |_AndroidManifest.xml
   |
   |_AndroidManifest.xml


```

Android Studioではworkspaceという概念は **Project** に変わり、EclipseのProject は **Module** に変わります。
EclipseからAndroid Studioに移行する場合、新しくMain Projectを作成し、Eclipseのメインプロジェクトを Main Moduleにするのですが、この構成のまま移行しようとすると メインプロジェクトがAndroid StudioのProject、ライブラリプロジェクトがMain Moduleになることがあります。
なので、ライブラリプロジェクトはメインプロジェクトの外に配置し、手順にある通り、インポートする project.properties ファイルまたは .classpath ファイルで、Eclipse ADT のワークスペースのライブラリ ファイルへの参照をすべてコメントアウトしてください。

# 【Enter a value for workspace path ....】エラーが出てもあわてない。

インポート処理を進めていると以下のような画面が出ることがある。

![eclipse_import.png](https://qiita-image-store.s3.amazonaws.com/0/115635/a15a8ed7-1830-ea57-af0a-53964ccfad5c.png)

この画面の右側に \<click to edit\>と出ているが、これはAndroid Studio が移行対象ファイルのフルパスがわからない場合に出る模様。
なので、対象ファイルのフルパスを入力すれば進めることができる。

フルパスを入れない場合は【Enter a value for workspace path ....】エラーが出るので、注意。
FirstOrDefaultやSingleOrDefaultでnull以外のデフォルト値を返したい場合の書き方

# やりたいこと
 `FirstOrDefault`や`SingleOrDefault`を使用した時、条件に一致しない場合`null`ではなく任意のデフォルト値を返したい。

# 結論

~~`DefaultIfEmpty` を使う。
たぶん周知の事実なのだろうけど、調べた時にやりたい事どんぴしゃが無かったので忘備録として残します。~~

@Ryooooooga さんにコメントにて `??`演算子を用いたもっと良い方法を教えて頂きました！ありがとうございます！

## 例
* `User.id` をチェックし一致しない場合は `id=-1` `userName="NG"` を返す。

### サンプルに使用するクラス

```csharp
public class User(){
    public int id {get;set;}
    public string userName {get; set;}
    public int age {get; set;}
    // ユーザーリストを返すメソッド
    public static List<User> GetUserList(){
		return new List<User> GetUserLists()
		{
			new User(){ id=1, userName="佐藤",age=20 },
			new User(){ id=2, userName="山田",age=30 },
			new User(){ id=3, userName="田中",age=28 },
    }
}
```

### ??演算子を使用する。
ID一致時は初期値インスタンスも生成されず、表記もスマートです。C#素晴らしい…

```csharp
private User TestMethod2(int id){
    return User.GetUserList()
            .FirstOrDefault(x => x.ID == id)
            ?? new User { ID = -1, Name = "NG" };
}
```

### DefaultIfEmptyを使用する場合
~~ラクチン！~~
IDが一致するデータが存在した場合も初期値のインスタンスが生成されてしまいます。

```csharp
private User TestMethod2(int id){
	return User.GetUserList()
		.Where(x=>x.id == id)
		.DefaultIfEmpty(new User(){ id=-1, userName="NG" })
		.First();
}
```

### if文を使用する場合
長い。

```csharp
private User TestMethod(int id){
	var selectUser = User.GetUserList()
					.FirstOrDefault(x=>x.id==id);
	if(selectUser != null){ 
		return selectUser;
	}else{
		return new User(){ id=-1, userName="NG" };
	}
}
```

# 参考URL
[?? 演算子 (C# リファレンス)](https://msdn.microsoft.com/ja-jp/library/ms173224.aspx)
[Enumerable.FirstOrDefault(TSource) メソッド (IEnumerable(TSource)) (System.Linq)](https://msdn.microsoft.com/ja-jp/library/bb340482(v=vs.110).aspx)
.p12ファイル証明書を簡単に抜き出す方法

## 概要
CircleCIやTravisCIでiOSアプリを自動ビルドしていると `.p12ファイル` が必要になることが良くあります。割りと簡単に`.p12ファイル`を抜き出すことが出来たのでご紹介します。

## 手順
Bitrise製のツールを使います。
以下コマンドを打って、プロジェクトファイルをドラッグ&ドロップで渡すだけです。

```
$ bash -l -c "$(curl -sfL https://raw.githubusercontent.com/bitrise-tools/codesigndoc/master/_scripts/install_wrap.sh)"   
```

本家サイトの説明はこちらです。
http://devcenter.bitrise.io/docs/provprofile-cert-export
> The easiest way to get the required code signing files is to use our codesigndoc > tool.

> Using it is as easy as opening your Terminal.app on your Mac and running: bash -> l -c "$(curl -sfL https://raw.githubusercontent.com/bitrise-tools/codesigndoc/master/_scripts/install_wrap.sh)". Then opening your Finder.app > and drag-and-drop the .xcodeproj or xcworkspace file into the command line in > your terminal.


## やってみた

```zsh
$ bash -l -c "$(curl -sfL https://raw.githubusercontent.com/bitrise-tools/codesigndoc/master/_scripts/install_wrap.sh)"

 => Creating a temporary directory for codesigndoc ...
 => Downloading version: 0.9.15
 => Downloading codesigndoc from (https://github.com/bitrise-tools/codesigndoc/releases/download/0.9.15/codesigndoc-Darwin-x86_64) to (/var/folders/_h/40x4tdm92zx5yk15pt8bnxn80000gp/T/codesigndoc.ULmOA12R/codesigndoc) ...
######################################################################## 100.0%
 => Making it executable ...
 => codesigndoc version: 0.9.15
 => Running codesigndoc scan ...


Please drag-and-drop your Xcode Project (.xcodeproj)
   or Workspace (.xcworkspace) file, the one you usually open in Xcode,
   then hit Enter.

  (Note: if you have a Workspace file you should most likely use that) :
```

最初にプロジェクトファイルをドラッグ＆ドロップするように言われるので、ドラッグ＆ドロップしてEnterを押します。その後、何回か質問されますが特に難しいことはないので省きます。

```zsh

INFO[16:51:51] Exporting the Identities (Certificates):

 * Identity: iPhone Distribution: HOGEHOGE (XXXXXXXXXX)

INFO[16:51:51] Exporting from Keychain, using empty Passphrase ...
INFO[16:51:51]  This means that if you want to import the file the passphrase at import should be left empty,
INFO[16:51:51]  you don't have to type in anything, just leave the passphrase input empty.

INFO[16:51:51] You'll most likely see popups (one for each Identity) from Keychain,
INFO[16:51:51]  you will have to accept (Allow) those to be able to export the Identities!


Exports finished you can find the exported files at: /Users/yukatou/codesigndoc_exports
Opened the directory in Finder.


That's all.
You just have to upload the found code signing files and you'll be good to go!
```

成功すると `codesigndoc_exports` というディレクトリが作成されます。
ディレクトリ配下に.p12ファイルがあることが確認できます。

```
$ ls codesigndoc_exports/*.p12
codesigndoc_exports/Identities.p12
```

.p12ファイルのパスフレーズは空で設定されていますのでご注意を。
RxJavaのflatMap, switchMap, concatMapを理解する

※[Reactive Frustrations](http://upday.github.io/blog/reactive_frustrations_1/)からの一部引用・翻訳です。

RxJavaのflatMap/switchMap/concatMapを理解する上でとてもわかりやすい喩え話を見つけたので共有します。

---

RxJavaには膨大な量のメソッド/オペレータがあります。いくつかのオペレータはパッと見同じ動きをしているように見え間違いやすいのですが、実際のところは異なるユースケースを想定して作られています。

`flatMap`, `switchMap`, そして`concatMap`。これらの違いを喩え話で説明してみます。

開発者向けのカンファレンスを想像してみてください。そこには一人の司会と、複数の講演者がいます。司会の役割は講演者を紹介してステージに迎えることです。紹介が終わると、講演者はステージに上がり、話し始めます。


## `flatMap`

`flatMap`の場合、司会は自分がこうと決めたタイミングで講演者をステージに迎えます。つまり、複数の講演者が同時にステージ上でしゃべることがあり得ます。とてもうるさいカンファレンスですね。

## `switchMap`

この場合、司会は少しせっかちです。司会は自分が新しい講演者をステージに迎えようと決めた時、現在ステージに上がっている講演者に話を中断し、ステージを降りるよう求めます。そして司会は次の講演者をステージに迎えます。つまり、一度にしゃべる講演者は一人です。

## `concatMap`

`concatMap`の場合、司会は公平です。司会は、現在の講演者がしゃべっている間に新しい講演者をステージに上げたくなっても、`switchMap`の時のようにはしません。たとえ話が長くなったとしても、終わるまで待ちます。そして話が終わった後に、次の講演者をステージに招待します。この場合でも、一度にしゃべる講演者は一人です。
Windowsキー + Lキーで画面ロック（Lubuntu16）

Linuxで[WIndows] + [L]キーで画面ロックする方法です。今回はLubuntu16です。

##画面ロックするには？
以前はxscreensaverをインストールして`xscreensaver-command -lock`を実行していたのですが、調べてみたところ`dm-tool`というコマンドが標準で使えることが分かりましたので、今回はこっちを使ってみようと思います。

以下のコマンドで画面のロックできる事を確認します。

```console
$ dm-tool lock
```

##LXDE設定ファイルの編集
`.config/openbox/lubuntu-rc.xml`ファイルを編集します。[Windows] + [L] のキーバインドは`W-l`となりますので、`<keyboard>`と`</keyboard>`の間に以下の行を追加します。

```text:.config/openbox/lubuntu-rc.xml
    <keybind key="W-l">
      <action name="Execute">
        <command>dm-tool lock</command>
      </action>
    </keybind>
```

##試してみる
`openbox --reconfigure`で設定ファイルを読み直すか再起動して、[Windows] + [L]を試してみます。

##スタートメニューが表示されちゃう場合は？
[Windows]キーを押すとスタートメニューが表示されるようにしていると[Windows]キーを押すとスタートメニューが表示されてしまいロック画面になってくれません。今のところ[Windows]キーを無効するくらいしか方法が浮かびませんでしたので、以下の行を削除して無効にしてしまいます。

```text:.config/openbox/lxde-rc.xml
    <keybind key="Super_L">
      <action name="Execute">
        <command>lxpanelctl menu</command>
      </action>
    </keybind>
```

`openbox --reconfigure`で設定ファイルを読み直します。

スタートメニューが使えなくなってしまいましたが、スタートメニューは[Ctrl]+[Esc]や[Alt]+[F1]キーでも表示できますので、それで良しとするしかないかなと思います、
ubuntu(on GCE) のdo-release-upgrade

GCE(GoogleCloudEngin)上で、Ubuntu14からUbuntu16のupgradeがうまくいかない。aptのバージョンが古いらしい。

いつもの `apt-get upgrade`だけでは足りいらしい。

```
sudo apt-get dist-upgrade -y
do-release-upgrade
```

これでうまくいった。
Swift 3でStringからURLの配列を抽出する(Extract an array of URLs from a String in Swift 3)

#はじめに(Introduction)
Swift 3でStringからURLの配列を抽出したい場合、どう書くか。
(How do we write if we want to extract an array of URLs from a String in Swift 3?)

#記述例(Implementation)
文字列を渡すと、URLの配列を返します。
(After passing the string, an array of URLs will be returned.)

```LinkHelper.swift
class LinkHelper: NSObject {
    
    class func extractURL(_ string:String)-> [URL]{
        let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
        let links = detector.matches(in: string, range: NSMakeRange(0, string.characters.count))
        return links.flatMap { $0.url }
    }
}
```
(2016/11/16追記: *@woxtuさんのご指摘で、flatMapを使った記述にコードを改善しました。ありがとうございます。*)

こうすれば、URLが2つ`array`に入ります。
(Two of the URL will be placed in `array`.)

```.swift
let string = "プロフィールページ http://qiita.com/hsylife PickerをPopoverで表示するライブラリの紹介 http://qiita.com/hsylife/items/e54ae8bde0838db53ae3"
let array = LinkHelper.extractURL(string)
```

#条件(Required)
[init(types checkingTypes: NSTextCheckingTypes) throws](https://developer.apple.com/reference/foundation/nsdatadetector/1409829-init)は、iOS8.0+, watchOS 2.0+が必須です。

#発展(Development)
typesの.linkを.phoneNumberに変更すると、同じような構造で、電話番号文字列の配列を抽出をさせることができますね。
(If you change the type's .link to .phoneNumber, you can have the same structure for extracting an array of phone number strings.)

その他の種類については[一覧表](https://developer.apple.com/reference/foundation/nstextcheckingresult.checkingtype)に説明があります。

(Other types are explained in the [table]((https://developer.apple.com/reference/foundation/nstextcheckingresult.checkingtype)).)

#関連リンク(Links)
[NSDataDetector](https://developer.apple.com/reference/foundation/nsdatadetector)

余談。英語を併記してみました。[Google Translation](https://translate.google.com/?hl=ja)の結果をほぼ90%くらいそのまま使っています。閲覧者側でページ単位の翻訳をしてもらえると併記不要なのですが、まだ検索結果はオリジナル言語に依存していると思うので、過渡的な措置として英語併記が必要で、省力化のためにGoogle 翻訳が便利だという実感を得ました。おすすめです。
allocとinitについて

<h2>allocとinit</h2>
お決まり文句で書いてて、
あまり意識してなかったのでメモ書き。
<h4>allocとは</h4>
・変数を生成するにあたってメモリを確保すること。

```
MyClass *myClass;
myClass = [MyClass alloc];
```

<h4>initとは</h4>
・生成した変数にデータを保存できるようにすること。

```
MyClass *myClass;
myClass = [MyClass alloc];
myClass = [myClass init];
```
⇩

```
MyClass *myClass = [[MyClass alloc] init];
```
基本的な書き方はこれ

<h4>newが便利？</h4>
・newならばスマートに書ける。

```
MyClass *myClass = [MyClass new];
```

これで
```[[MyClass alloc] init]```
と同じ
[Linux] コマンドラインでの標準出力をクリップボードにコピーする

MacというかUnix系だと `pbcopy` を使うようですが、Linuxでは `xsel` を使えば良いようです。

# xsel
```console:xselのインストール(Ubuntu)
$ sudo apt-get install xsel
```

```console:使用例
$ echo "aaa" | xsel --clipboard --input
or
$ echo "bbb" | xsel -bi
```

# 参考
[標準出力をクリップボードにコピーする pbcopy , macosx,ubuntu,cygwin でそれぞれ使う - my-notebook](http://www.my-notebook.net/030b7319-171e-4567-a815-01d34d569f79.html)
[linux - Pipe to/from the clipboard - Stack Overflow](http://stackoverflow.com/questions/749544/pipe-to-from-the-clipboard)
HTMLで<ruby><rt>タグを打つのが面倒なので正規表現でラクをした

## `<ruby><rt>`タグって面倒くさいよね

仕事の案件で必要に迫られた「HTMLで表示されるすべての漢字にルビを振る」という作業が地味にしんどい。そこで、正規表現を使った置換でラクをしたのでまとめ。


## 下準備

```html:置換前
青(あお) 噛(か)んで熟(い)って頂戴(ちょうだい)<br>
終電(しゅうでん)で帰(かえ)るってば 池袋(いけぶくろ)
```

まずはテキストを `漢字(かんじ)` の形式で成形。パターンは( )でも[ ]でも何でもいいのですが、ルビが振ってあるWord文書をコピー＆ペーストするとこの形式になるので、これをそのまま採用。

でもって、下記の置換を実行。

```html:検索文字列
([一-龠]+)\(([あ-ん]+)\)
```

```html:置換文字列
<ruby>$1<rt>$2</rt></ruby>
```

`[一-龠]`の範囲指定については下記を拝借。

> phpで漢字の正規表現を調べる(utf-8) - Qiita
> http://qiita.com/awm-kaeruko/items/45f7074ba26424c4fce5

厳密には「`[々]`が入っていない」など細々あるようですが、例外は目検でチェックすりゃええやん…というざっくりポリシーで。


## 実行結果

```html:置換後
<ruby>青<rt>あお</rt></ruby> <ruby>噛<rt>か</rt></ruby>んで<ruby>熟<rt>い</rt></ruby>って<ruby>頂戴<rt>ちょうだい</rt></ruby><br>
<ruby>終電<rt>しゅうでん</rt></ruby>で<ruby>帰<rt>かえ</rt></ruby>るってば <ruby>池袋<rt>いけぶくろ</rt></ruby>
```

> <ruby>青<rt>あお</rt></ruby> <ruby>噛<rt>か</rt></ruby>んで<ruby>熟<rt>い</rt></ruby>って<ruby>頂戴<rt>ちょうだい</rt></ruby><br>
> <ruby>終電<rt>しゅうでん</rt></ruby>で<ruby>帰<rt>かえ</rt></ruby>るってば <ruby>池袋<rt>いけぶくろ</rt></ruby>

やったぜ。


## あとがき

初 Qiita投稿。

ここ1～2年、技術系の調べものをしていると Qiitaにヒットすることが多くなってきたので、イケてるえんぢにあのすなる Qiitaといふものをヌルヌルえんぢにあもしてみむとてするなり。よろしくお願いします。
Chainerを用いた簡単なニューラルネットワーク実装

前回まで，Chainerを構成する基本オブジェクトについて書いてきました．
今回からは，それらのオブジェクトを使って実際にニューラルネットワークを実装していきたいと思います．

#ニューラルネット全体図
ニューラルネットワークを構成するプログラムを書く場合，その全体図は大まかに以下の5つから構成されます．

1.データの準備

モデルに学習させるためのデータを用意するプログラムです．文章だったり，画像だったり，音声だったり，データは色々とありますが，構築するニューラルネットワークに適したデータの形に加工します．

2.モデルの記述

Chainクラスを継承したクラスを記述します．
詳しいことは[こちら](http://qiita.com/moroku0519/items/b693e87e301411e41a08)を参照．

```
class MyChain(Chain):
    def __init__(self):
        super(MyChain, self).__init__(
            パラメータを含む関数の宣言
        )
    def __call__(self, x, y):
        損失（誤差）関数
```

3.最適化アルゴリズムの設定（SDGやAdamなど）

モデルの最適化（誤差を最小化）する処理を記述します．
詳しいことは[こちら](http://qiita.com/moroku0519/items/7598abce4aab15504514)を参照

```
model = MyChain()
optimizer = optimizer.Adam()
optimizer.setup(model)
```

4.学習

指定した回数だけ学習を行います．ものによっては早期終了など行う場合がありますが，今回は単純にepoch（学習回数）を指定してあげます．勾配初期化からパラメータ更新まではほぼお約束のコードみたいです．

```
for epoch in range(繰り返し回数):
    model.zerograds()           #勾配初期化
    loss = model(train, target) #誤差計算
    loss.backward()             #勾配計算
    optimizer.update()          #パラメータ更新
```

5. 結果の出力

学習結果のモデルを保存したり，テストを行ったりします．

#次回からの方向性
一つの記事にあれこれ情報を詰め込みたくないので，次回から

1.データの準備
2.モデルの記述
3.最適化アルゴリズムの設定
4.学習
5.結果の出力

について小分けにして書いていきます．
今回はここまで

#参考

山下隆義
イラストでわかるディープラーニング 講談社
新納浩幸
Chainerによる実践深層学習～複雑なNNの実装方法～　オーム社