OmniAICreator/Qiita-1.07M huggingface dataset:
PHPでWEBを作るときのメモリ使用量について

一般的なwebアプリケーションを作る際、どういったケースでメモリ使用量を気にすればいいかがあまり解っていなかったので、よくありそうなケースで測定してみた。

# 結論

- 扱うデータによる（なので画像処理は結構使用する）
- バッチ処理時はどのタイミングでリセットされるかを考慮しておいたほうがいい

# 使用量の取り方

測定箇所の前後でmemory_get_usageを呼び出し、差分をとる。
http://php.net/manual/ja/function.memory-get-usage.php

# 基本仕様

- 関数を抜ける際に、参照数が0のものはリセットされる。

# ケース

## DBから数件データを取得して、表示する

例)cakephpのブログっぽいサイトでのデータ取得時
10件: 100KB 
100件: 800KB

単純にデータの量が反映される？
普通に1ページ分の表示量なら考慮する必要がないレベル.

## アップロードされたファイルをサーバー上に保存する

tmpフォルダに保存されたファイルを指定ディレクトリに移動するだけなので、メモリ使用なし

## 画像のサムネイルを作成する

いくつか試してみた結果、元の画像サイズ * 10ほどメモリを使用している？
仮説: 元画像のビットマップ容量 + サムネイル画像のビットマップ容量

## バッチ処理
  
扱うデータによる。
一度に大量のデータを処理する場合はそのデータ分だけメモリを使うことになる。
メソッドを分割することで、ピーク使用量は抑えられそう。


# 参考

- PHP5系のarrayが実際に必要とするメモリについて https://nikic.github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html
  Integer(8byte)を格納する配列の場合、型付言語（Cのような）で想定される使用量の18倍かかる

- PHP7のハッシュテーブル実装について
  https://nikic.github.io/2014/12/22/PHPs-new-hashtable-implementation.html
  上記のPHP5系の実装では要素ごとに144byteのラッパーが必要だったが、PHP7では36-32byteまで減ってるらしい。


- PHPの変数の格納について
  http://php.net/manual/ja/internals2.variables.php
ES2015 の Class で Singleton


状態を持つインスタンスを、異なるファイルやクラスで使いまわすケースです。例としてキーと値を保持するコンテナ的なものをシングルトンで運用する場合は、次のように `new` でインスタンス化したものを `export` するだけです。

```javascript:container.es6
class Container {
  constructor() {
    this.map = new Map;
  }

  set(key, value) {
    this.map.set(key, value);
  }

  get(key) {
    return this.map.get(key);
  }
}

export default new Container();
```

あるファイルでコンテナに値をセットすれば、

```javascript:some.es6
import container from './container.es6';

// ...

// コンテナにキーと値をセット
container.set('key1', 'value1');

// ...
```

別のファイルでもコンテナから値を取り出せます。

```javascript:app.es6
import container from './container.es6';

// ...

console.log(container.get('key1')); // value1 が出力される

// ...
```

一度 `import` したものは再利用される為です。
MacでVirtualBox+CentOS6の開発環境を構築する

# 概要
MacでVirtualBox+CentOS6の開発環境を構築する。
## 環境
OSX 10.11.4
VirtualBox 5.0.10
CentOS 6.7 

# VirtualBoxをインストール
落としてきて入れるだけ。

# CentOSをインストール
こちらを参考にインストールする。
http://www.kakiro-web.com/memo/virtualbox-create-virtual-machine-centos6.html
http://www.kakiro-web.com/memo/centos6-install.html
ネットワークの設定についてはONBOOTの設定のみ行い、dhcpのままとした。
/etc/sysconfig/network-scripts/ifcfg-eth0

```
ONBOOT=yes
```

CentOSをrebootすればネットワークに接続される。

```
$ reboot
```

# ユーザ作成
rootユーザで

```
$ useradd [ユーザ名]
$ passwd [ユーザ名]
$ visudo
ユーザ名   ALL=(ALL)       ALL
```

ここまでやると、MacのユーザでVirtualBox上のCentOSにsshできる。

```
$ ssh [CentOSのIPアドレス]
```

# おまけ
MacのブラウザからCentOS上のWebサーバにアクセスしてみる。  

## とりあえず

```
$ sudo yum update
$ sudo yum install wget
```

## PHP+httpdでやってみる
こちらを参考にphpとhttpdを入れる。
http://weblabo.oscasierra.net/centos7-php56-install/
CentOS7について書かれているのでhttpdの起動方法は異なる。

httpdを起動する。

```
$ sudo service httpd start
```
iptablesを停止する。

```
$ sudo service iptables stop
```

サービスの自動起動設定を行う。

```
$ sudo chkconfig httpd on
$ sudo chkconfig iptables off
```

確認用のphpファイルを作成する。

```php:/var/www/html/info.php
<?php
phpinfo();
```

Macのブラウザでアクセスできるか確認する。
http://[CentOSのIPアドレス]/info.php

## PHPのビルトインウェブサーバーでやってみる
先ほどと同じphpファイルを任意のディレクトに置く。

```
~/info.php
```

ビルトインウェブサーバーを起動する。

```
$ php -S [CentOSのIPアドレス]:8080
```

Macのブラウザでアクセスできるか確認する。
http://[CentOSのIPアドレス]:8080/info.php
giboをAtomで実行できるパッケージを作りました

[giboなるものが流行っているらしいのでVimでやる](http://qiita.com/iwataka/items/016dfe7e86e3dee5b15a) に触発されてATOMでも使えるようにしてみました。

giboについては↑の記事をご参照ください。

## atom-gibo パッケージ

https://atom.io/packages/atom-gibo
![gibo.gif](https://qiita-image-store.s3.amazonaws.com/0/111100/4a860473-f893-b133-c734-801d362a1c2b.gif)

### できること
* パレット上で↓のように入力することで、gibo のコマンドをATOMで使用できます
   * `Java>> .gitignore` ⇒ .gitignore作成/追記 (`>> .gitignore` は省略可)
   * `C > .gitignore` ⇒ .gitignore上書き
   * `Python >> .hgignore` ⇒ .hgignoreを作成/追記

* optionも実行できます (`--help`, `--list`, `--upgrade`)
* 出力先はプロジェクトのルートフォルダ直下です

### できないこと
* 出力先の選択
* gibo自体のアップデート

### 注意点
* Windowsのみで動作確認
* 初回起動時はボイラープレートをクローンしてくるので若干遅い
* **そんなに必要なパッケージでもない**

IssueとかPRとかお待ちしてます。
Djangoでrobots.txt設置

# やりたいこと
http://example.com/robots.txt アクセスに対してrobos.txtを正しく返す。

# 手順

## *app_dir*/urls.py にrobots.txtのルーティング記述

```
from django.views.generic import TemplateView

urlpatterns = [
    ...
    url(r'^robots\.txt', TemplateView.as_view(template_name='static/robots.txt', content_type='text/plain')),  # <- append
```

## urls.pyの記述に対応するパスにrobots.txt を作成

### template/static/robots.txt
（例はすべてのクローラー拒否）

```
User-agent: * 
Disallow: /
```
コンソール画面をスクロールバックする

ずばり、「Shift + PgUp」でOK。

コンソール画面で出力結果が1画面に収まりきらない場合は有用。
物理サーバのコンソール画面をとることは少ないが、
仮想サーバだとちょくちょく触る。まーlessすればいいんだけども、ちょっとした場合には便利。
netdataを使ってリアルタイムで可視化してみる

[netdata](https://github.com/firehol/netdata)を試してみました。netdataを使うとサーバーのステータスをウェブブラウザ上にリアルタイムで表示することができます。インストールはとても簡単で、複数のサーバーの情報をまとめて表示することもできます。

ライブ・デモへのリンクはこちら: http://netdata.firehol.org

それでは参考に、リモートのサーバー(例:192.168.33.10)にインストールしてみて、netdataのデモ機(netdata.firehol.org)とこちらのサーバーのステータスを１つのページにまとめて表示するところまでの手順を紹介します。

## インストールする

```bash
# 必要なパッケージをインストールします
# Debian / Ubuntu
apt-get install zlib1g-dev gcc make git autoconf autogen automake pkg-config
# Centos / Redhat
yum install zlib-devel gcc make git autoconf autogen automake pkgconfig

# netdataをダウンロードしてインストールします
git clone https://github.com/firehol/netdata.git --depth=1
cd netdata
./netdata-installer.sh
```

インストールが済むと`http://192.168.33.10:19999`でサーバーのステータスが見れます。netdataを止める場合は`killall netdata`、スタートするには`/usr/sbin/netdata`です。それと、インストールを自動化したい方は`./netdata-installer.sh --dont-wait`でいけます。

## ２つのサーバーを１つのページに表示する

いろいろ調べてみたところ、netdataが紹介しているtv.htmlを使ってみるのが一番とっつきやすそうだな、というところに落ち着いたのでその手順を説明します。

まずは`tv.html`をダウンロードします。

```bash
curl https://raw.githubusercontent.com/firehol/netdata/master/web/tv.html -o tv.html
```

それをエディタで開いて、ヘッダーにある`dashboard.js`のscriptのくだりを下記のように変更します。

```
<script type="text/javascript" src="http://192.168.33.10:19999/dashboard.js"></script>
<!-- <script type="text/javascript" src="dashboard.js"></script> -->
```

それをブラウザで開くとデモ機(左)とこちらのサーバー(右)のステータスが表示されます。

ここまでやってみてnetdataが好きになったかたは`tv.html`のソースを読んでみて、下記のリンクを参考にしてください。

## 参考リンク

- [Custom Dashboards](https://github.com/firehol/netdata/wiki/Custom-Dashboards#netdata-server)
- [apiのチャート](http://netdata.firehol.org/api/v1/charts) <-- カスタムするにはこの情報が結構役に立つと思います。
Windows 10 で InfiniBand を使う

漢なら InfiniBand ですね! Windows 10 でも使いたいですね!

Connect-X 3(not Pro) を Windows 10 で動かしましょう.

![ConnectX3.jpg](https://qiita-image-store.s3.amazonaws.com/0/36275/24cfa760-b8ab-f12b-b59c-368e24012dd0.jpeg)


## Connect-X 3 について

最近だと eBay で 1.5 万円 + 海外送料で調達できます.
 
## ドライバについて

Mellanox の WinOF ドライバを使います.
Connect-X 2 は Windows 7 までのサポートなので, Windows 10 では動きません. 

また, OpenFabrics 版である WinOFED は久しくアップデートされていないので, これも最新の Windows では動きません. したがって Windows 10 ですと Connect-X 3 以降 + Mellanox WinOF ドライバ一択となります.

http://www.mellanox.com/page/software_overview_eth

Connect-X 3 の場合は WinOF を使います. 現時点では 5.10 が最新でした. Windows Client + OS 10 を選択します.

## 動かす.

IB QDR スイッチを経由して, Linux CentOS7 + Connect-X 2 と通信できるか試してみます.
opensm が linux 側で動いているとします.

CentOS7 での InfiniBand の設定は [CentOS7 + InfiniBand で MPI を動かす](http://qiita.com/syoyo/items/0cb171fa68f69412f6c9) などを参照ください.

`C:/Program Files/Mellanox/MLNX_VPI/IB` あたりにいろいろツールがあります.

`ibstat` を動かしてみます.

```
syoyo@gpu-ib-win MINGW64 /c/Program Files/Mellanox/MLNX_VPI/IB/Tools
$ ./ibstat.exe
CA 'ibv_device0'
        CA type:
        Number of ports: 2
        Firmware version: 2.35.5100
        Hardware version: 0x0
        Node GUID: 0x0002c90300436210
        System image GUID: 0x0002c90300436213
    Port 1:
        State: Active
        Physical state: LinkUp
        Rate: 40
        Real rate: 32.00 (QDR)
        Base lid: 4
        LMC: 0
        SM lid: 1
        Capability mask: 0x90580000
        Port GUID: 0x0002c90300436211
        Link layer: IB
        Transport: IB
    Port 2:
        State: Down
        Physical state: Polling
        Rate: 40
        Base lid: 0
        LMC: 0
        SM lid: 0
        Capability mask: 0x90580000
        Port GUID: 0x0002c90300436212
        Link layer: IB
        Transport: IB
```

LinkUp と繋がりを確認しました. Cool!
(スイッチが QDR なので QDR rate になります)

### IPoIB

Mellanox のドキュメントを参考にし, IPoIB の設定をしておきます(IPv4 静的ネットワークを作るのが手っ取り早いでしょう).

(最初の WinOF インストールのあと再起動し, その後 device manager でドライバの自動更新をする必要があるかもしれません)

Windows の ping などで相手先の IP アドレスが見えることを確認します.

iperf で性能測定してみましたが, 理論上 2.5 GB/s くらい出るはずが 1 GB/s(8 gbp/s) くらいしか出ませんでした. 精進が必要ですね.




## TODO

* FDR スイッチで試す.
* Linux <-> Windows での IB Verbs or rsocket 通信を試す.
  * ND(NetworkDirect) は RoCE(Eth) 専用っぽいので IB では動かない模様.
  * rsocket(librdmacm) は Mellanox の SDK に入っていないので, librdmacm のソースを引っ張ってきて自分で頑張ってハックする?
* Linux + Windows 混在での MPI + InfiniBand は動くかな?
* Dual port なので IPoIB teaming 試したい.
ディープラーニングの数式要素の写経（04/24更新済み=>更新継続中）

最近DIGITSでAlexNetやGoogLeNetで
画像認識タスクをやらせています。

![Learning.png](https://qiita-image-store.s3.amazonaws.com/0/104856/00d261d1-afa4-730f-d480-c6f56472e7f2.png)


Qiitaでの数式記述方法の練習を兼ねて
ニューラルネットワーク(NN)の構成要素を数式表現で復習していきます。
ディープラーニングと呼ばれるNNを簡潔に記述できれば
備忘録になりますので便利です。

#畳み込み層


##活性化関数
####1.シグモイド関数
多層パーセプトロンの説明はこれが多い

```math
f(u)=\frac{1}{1+e^{-u}}


```
多層パーセプトロンの重み付き結合

```math

u=\sum^n_{i=1}w_ix_i
```

####2.tanh関数
Relu関数の方が精度が高いとわかるまでこっちが主流だったそうです

```math
tanh(u)=\frac{exp(u)-exp(-u)}{exp(u)+exp(-u)}
```

####3.ReLU関数(Rectified Linear Unit)
サンプルでディープラーニングを実行すると畳み込みの計算は大抵これ

```math
f(x)=max(0,x)
```
グラフ描画した場合
![FRelu.png](https://qiita-image-store.s3.amazonaws.com/0/104856/97ebec29-7b6a-ca34-f836-b2e47b3e10dc.png)



##出力層

##誤差関数

####交差エントロピー(cross entropy)関数
このページトップのDIGITSで実行した様な
多クラス分類の場合にlossの計算に使用する
yは教師信号 rは出力信号
Cは分類クラスの個数
Nは出力層のニューロンの個数


```math
E=-\sum_{c=1}^C\sum_{n=1}^Nr_{cn}ln(y_{cn})
```

2クラス問題の場合

```math
E=-\sum_{n=1}^Nr_nlny_n+(1-r_n)ln(1-y_n)
```

####二乗誤差関数　

最小二乗法でお馴染みの誤差関数
回帰問題を解かせる時に使用

```math

E=\sum_{n=1}^N {||r_n-y_n||}^2
```

##尤度関数
####ソフトマックス関数　
出力層で畳み込み層もしくはプーリング層から
出力された情報から確率 Φを出力する

```math
\phi(v_i)=\frac{e^{v_i}}{\sum_i e^{v_i}}

```


##ネットワークの学習方法
###確率的勾配降下法

学習則にはいくつか種類がある
####バッチ学習
すべての学習サンプルに対して誤差を求めてから
ネットワークの結合重みを更新する方法
時間はかかるがノイズを抑える

ここでEは誤差関数であり上述の
交差エントロピー(cross entropy)関数または二乗誤差関数を用いる
繰り返し回数t回目の各学習サンプルに対する誤差をE^t_nとする
すべてのサンプルに対する誤差E^tを下記のように求める

wは結合重み(weight)
ηは学習係数という、
重み更新時の誤差を大きく修正するなら値を大きくし
小刻みに修正する場合は小さい値を入れるとよし
（DIGITSの場合はStepDownで自動修正されたりする）

```math
E^t=\sum^n_{n=1} E^t_n
```

```math
w^{t+1}=w^t-\frac{\partial E^t_n}{\partial w^t}
```



####逐次学習
学習サンプル一枚ずつに対して更新する方法
早いけどノイズを学習する
変動が大きい為、学習が収束しない可能性あり

####ミニバッチ学習
逐次学習のバッチ学習の中間
普通に考えれば性能試験に便利なのでこの方法がとられると思う
Ｄは学習サンプルを小切りにしたサブセット
サブセット毎に誤差を出してから更新する。

```math
E^t=\sum_{n∈D}E^t_n
```


勉強していきながら数式を確認する為に
内容は逐次追加しています。



参考
[イラストで学ぶディープラーニング](https://www.amazon.co.jp/gp/aw/d/406153825X)
CircleCIでのPHP環境

CircleCIでの標準イメージのPHP環境について調べてみました。Travis CI同様に[CHH/phpenv](https://github.com/CHH/phpenv)+[php-build/php-build](https://github.com/php-build/php-build)が採用されているようです。

# 現在準備されているPHPバージョン

2016/4/23現在インストールされているPHPバージョンの一覧を紹介します。

```
$ phpenv versions
* system (set by /home/ubuntu/.phpenv/version)
  5.3.10
  5.3.20
  5.3.25
  5.3.3
  5.4.10
  5.4.11
  5.4.12
  5.4.13
  5.4.14
  5.4.15
  5.4.18
  5.4.19
  5.4.21
  5.4.37
  5.4.4
  5.4.5
  5.4.6
  5.4.7
  5.4.8
  5.4.9
  5.5.0
  5.5.11
  5.5.15
  5.5.16
  5.5.2
  5.5.21
  5.5.3
  5.5.7
  5.5.8
  5.5.9
  5.6.14
  5.6.2
  5.6.5
  7.0.0RC7
  7.0.4
$
```

ちょっぴり更新サボってる感があるかな…

リクエストを送れば任意のバージョンをビルドしてくれるらしいので、必要なら頼めばいいと思います。

# PHPのビルド情報

circle.ymlでPHPのバージョンを指定しなければ、Ubuntu標準のPHPが使われます。Ubuntu 12.04 LTSの場合は下記バージョンになります。

```
$ php -v
PHP 5.3.10-1ubuntu3.21 with Suhosin-Patch (cli) (built: Oct 28 2015 01:43:56)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
```


それ以外のphpenvで指定できる各バージョンのPHPはphp-buildで作られたもので、Travis CIと違って非ZTSビルドです。PHP extension作者はTravis CIと両方でテストすれば網羅性の意味で完璧なのでは…？という気がしてきますね。

```
$ phpenv global 5.6.14
$ php -v
PHP 5.6.14 (cli) (built: Oct 14 2015 05:16:55)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
```

組み込まれているモジュールは下記の通りです。PHP7だとmysqlとeregが外れますが、それ以外は同じでした。

```
$ php -m
[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dom
ereg
exif
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
intl
json
ldap
libxml
mbstring
mcrypt
mysql
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_pgsql
pdo_sqlite
Phar
posix
readline
Reflection
session
shmop
SimpleXML
soap
sockets
SPL
sqlite3
standard
sysvsem
sysvshm
tidy
tokenizer
xml
xmlreader
xmlrpc
xmlwriter
xsl
Zend OPcache
zip
zlib

[Zend Modules]
Zend OPcache
$
```
swift(ver2.2)でリダイレクト先のURLを取得する


## リダイレクト先URL取得できなくなった

今までWKWebViewに対してObserverを使って"loading"時を監視していたが急に取得しなくなった(ver2.2から？)

## Delegateでリダイレクトタイミングを取得する

WKNavigationDelegateを使ってリダイレクトのアクション通知を受け取る準備をしてリダイレクト前のURLを読み込みます。

## サンプルコード
```swift
import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {
    var wkWebView: WKWebView!
    let url = NSURL(string: "http://goo.gl/fhjaj2")
    
    override func viewDidLoad() {
        super.viewDidLoad()
        wkWebView = WKWebView(frame: CGRectZero)
        let request = NSURLRequest(URL: url!)
        wkWebView.navigationDelegate = self
        wkWebView.loadRequest(request)
        self.view.addSubview(wkWebView)
    }
    
    func webView(webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
        print(wkWebView.URL?.absoluteString)
    }
}
```

## まとめ

http://goo.gl/fhjaj2
はtwitterにリダイレクトします。
モバイルなので2回リダイレクトしています。

```Output
Optional("https://twitter.com/")
Optional("https://mobile.twitter.com/")
```
int計算のオーバーフロー対策はMath#multiplyExactを使おう


## tl;dr
* Java8からはいった `Math#multiplyExact `メソッド便利
* 足し算は `toIntExact `メソッドがある

## 概要
エンジニアであれば一度ぐらい`int*int`の計算をしてオーバーフローを起こしたことありますよね？
**仕様上はintを超えることはないから絶対平気だよ！！** という謎のお告げを信じて書いちゃいますよね。

サンプルコード

```java
public static void main(String[] args) {
    int rate = rate();
    int point = point();
    int total = rate() * point();
    System.out.println(String.format("%d x %d = %s", rate, point, total));
}

```

でも、サービスは進化して仕様が増えて、仕様は忘却の彼方に消えてしまいます。
`point()`の値が何億とかになってくると、オーバーフローが発生して想定してない値になってうぁあぁぁあぁぁと頭抱えたくなるわけです。


こんなときに`Math#multiplyExact `をつかうわけです
JavaDocにあるように、
> ArithmeticException - if the result overflows an int

なので、オーバーフローしたら安全に例外を出してくれます。

```java
public static void main(String[] args) {
    int rate = rate();
    int point = point();
    int total = Math.multiplyExact(rate(), point());
    System.out.println(String.format("%d x %d = %s", rate, point, total));
}
// Exception in thread "main" java.lang.ArithmeticException: integer overflow
// at java.lang.Math.multiplyExact(Math.java:867)
```

ちなみに似たようなものに `Math#toIntExactなども`があるので、これも相当便利。
Java8素敵。そしてこれを教えてくれたIntelliJ IDEAも素敵。
ubuntu14.04コマンド使用メモ (sed,lsof,service) 




環境 Ubuntu14.04



#sedコマンド
半角スペース" "をカンマ","へ置換する
下記コマンド使用しました。
一番上のコマンド以外は読み込んだファイルのxxxをXXXに置き換えるもの。

各行それぞれ
パイプ使用
-eオプション使用
複数ファイルを書き換える場合

```
$ cat ./train.csv | sed -e 's/,/ /g' > ./train_new.csv
$ sed -e 's/xxx/XXX/g' ./train.csv > ./train-new.csv
$ sed -i -e 's/xxx/XXX/g' ./train.csv ./train2.csv ./train3.csv
```



ちなみに日付とかにくっついてるスラッシュを,に置換する場合バックスラッシュをその前におきます。

```
$ cat ./train.csv | sed "s/\//,/g"　>./train-new.csv
```
参考ページの作業でCSVファイルを作る必要があり
CSVファイルへ出力された数値データ間の半角スペースをsedで,へ書き換えました。

#lsofコマンド

lsof -i をルート権限で使用すると
そのポートをオープンしているプロセスが表示される。

```
$ lsof -i:22
COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME
sshd    2436 root    3u  IPv6   4674       TCP *:ssh (LISTEN)
sshd    3198 root    4u  IPv6   6078       TCP 192.168.0.7:ssh->192.168.0.30:1930 (ESTABLISHED)
sshd    3200 nori    4u  IPv6   6078       TCP 192.168.0.7:ssh->192.168.0.30:1930 (ESTABLISHED)
```

複数のポートを調べる場合

```
$ lsof -i:21,22
COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME
sshd    2436 root    3u  IPv6   4674       TCP *:ssh (LISTEN)
sshd    3198 root    4u  IPv6   6078       TCP 192.168.0.7:ssh->192.168.0.30:1930 (ESTABLISHED)
sshd    3200 nori    4u  IPv6   6078       TCP 192.168.0.7:ssh->192.168.0.30:1930 (ESTABLISHED)
vsftpd  3295 root    3u  IPv4   6793       TCP *:ftp (LISTEN)
```

プロセス名を指定する場合-c "process name" オプション
sshをポートを調べる場合

```
$ lsof -c ssh
COMMAND  PID USER   FD   TYPE    DEVICE    SIZE    NODE NAME
sshd    2436 root  cwd    DIR       3,2    4096       2 /
sshd    2436 root  rtd    DIR       3,2    4096       2 /
sshd    2436 root  txt    REG       3,2  274692 1343255 /usr/sbin/sshd
```


lsofはDIGITSがウェブサービスに使っているポートを調べた時のコマンド

*lsofはUSBポートやディスクドライブがビジーになっている場合
そのデバイスを専有しているプロセスをkillする時にも役立ちます

###MacOSXでUSBポート占有プロセスを調べる場合
```
$  lsof | grep "/dev/cu"
```
###Linuxで外付けメディアの占有プロセスPID確認
```
sudo lsof /media/data
lsof: WARNING: can't stat() fuse.gvfs-fuse-daemon file system /home/takuya/.gvfs
      Output information may be incomplete.
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
rsync   29631 root  cwd    DIR   8,36     4096       2 /media/data
rsync   29633 root  cwd    DIR   8,36     4096       2 /media/data
```

上記の場合
kill 29631
kill 29633
などでメディアドライブは開放されるでしょう。

#serviceコマンド　
例えばhttpdサービス（デーモン）の状態を知りたいときには以下のようなコマンドを実行します
/etc/init.d以下のスクリプトを直接実行で同じ処理

```
service httpd status
/etc/init.d/httpd status
```

haltやkillallといった特別なスクリプトを除いて，/etc/init.d以下にあるサービス・スクリプトの一覧に基づき全てのサービスのステータスを列挙する。

```
service --status-all
```

参考ページ
[ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20070605/273736/)
[kivantiumさんのページ ご注文は機械学習ですか？](http://kivantium.hateblo.jp/entry/2014/11/25/230658)
[sedコマンド](https://hydrocul.github.io/wiki/commands/sed.html)
[lsofコマンド](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/664useportps.html)

*自宅内のネットワークセキュリティに関る部分は公開してません
OpenSSH でログインに使用した公開鍵を記録する

タイトルの通りです。

# 記録されるのはログインユーザ

Linux ディストリビューションに最初から入っている OpenSSH は、初期設定で `/var/log/secure` や `/var/log/auth.log` に情報を書きます。実際に書いているのはなんらかの Syslog 実装です。

普通に `ssh` や `sftp` でログインすると、アクセス元 IP アドレスとユーザ名が記録されることはお馴染みです。

```
Apr 21 21:32:21 www4146ue sshd[21991]: Accepted publickey for ogata from 192.168.0.100 port 61024 ssh2
Apr 21 21:32:21 www4146ue sshd[21991]: pam_unix(sshd:session): session opened for user ogata by (uid=0)
Apr 21 21:32:22 www4146ue sshd[21996]: subsystem request for sftp by user ogata
```

多くの場合これで用が足りるのですが、事情があって共有アカウントとして運用されているユーザの場合、実際にどの人間がログインを行ったのかは分かりません。

個別にアカウントがある踏み台サーバを用意すれば、そこから共有アカウントでログインした記録を追うことも頑張れば出来そうですが、同時刻にログイン操作をする人が複数名いたりするだけで相当面倒そうです。

最近ではパスワードログインはできないようにして、各操作者から公開鍵をもらった公開鍵ログインが主流になってきました。どの公開鍵でログインが行われたか（認証と許可が行われたか）が分かれば、共有アカウントでもうまくいくかもしれません。

# どの公開鍵で認証したか記録する方法

どの公開鍵で認証したかの記録ですが、sshd(8) にはこれに応えるオプションがあります。LogLevel という項目です。

```
LogLevel
  Gives the verbosity level that is used when logging messages from sshd(8).
  The possible values are: QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1,
  DEBUG2, and DEBUG3. The default is INFO. DEBUG and DEBUG1 are equivalent.
  DEBUG2 and DEBUG3 each specify higher levels of debugging output.
  Logging with a DEBUG level violates the privacy of users and
  is not recommended.
```

（[man 5 sshd_config](http://man.openbsd.org/OpenBSD-current/man5/sshd_config.5) より）

デフォルトは INFO で、普通はこれを変更することはありませんが、一段情報量の多い VERBOSE にすると、以下のログが記録されます。

```
Mar 30 14:42:10 www4146ue sshd[8457]: Found matching RSA key: 91:98:00:92:dc:43:8e:ff:35:f4:9c:d7:5f:1f:c2:a4
```

これは、PID 8457 の sshd プロセスにて、このフィンガープリントを持った公開鍵が認証でマッチしたということです。

authorized_keys には1行1公開鍵という形式で記録されていますが、各公開鍵がどのようなフィンガープリントを持つかというのは、以下のようなコマンドで分かります。

```bash
{ cat .ssh/authorized_keys ; echo "" ; } | \
    while read line ; do \
        echo $line ; \
        echo $line > /tmp/pubkey ; \
        ssh-keygen -l -E md5 -f /tmp/pubkey ; \
        echo "" ; \
    done 
```

雑に書いたので、取得した一行が公開鍵であるかないかといった判定は省いてあります。

# 改ざんやシステムトラブルに備えるには

システムの堅牢性やユーザの善良さなどに対して疑うのであれば、ディスクなどのシステム全体が突然故障して復旧不可能になってしまうことや、悪意を持ったユーザによってログを改ざんされないかといったこと（やむを得ず特権ユーザを共有アカウントとして使う場合）へも配慮する必要があるかもしれません。

厳格な対応をするのであれば SELinux といった大仰な対策となるのでしょうが、簡単に対処するのであれば sshd がログ記録を依頼する Syslog の記録先をアクセス可能なユーザを限定したリモートサーバにしてしまうのがいいかもしれません。

多くの初期設定の元で sshd は ｓyslog ファシリティ AUTH でログを記録します。AUTH 全体をリモートサーバの syslog で受けたり、別のファシリティを `/etc/ssh/sshd_config` の `SyslogFacility` 設定オプションで設定して、それだけをリモートサーバで受けたりといった方法が考えられます。

# 共用アカウントについて

共用アカウントは一般的によくないものとされていて、本来であれば操作者に対応したユーザを各サーバに作成して、特権アクセスが必要な場合には都度 `sudo` などを使うのが理想的と言われています。私が最初に勤めていた会社ではこの方針が厳格に貫かれていましたが、10人程度の操作者と100台弱のサーバだけでも入社退職に関わるユーザ管理が大変でした。規模や操作者の出入りの頻度によってはもっとシステマティックなものを導入する必要があるでしょう。

共用アカウントと `sudo` でバッチリと言われることもあるのですが、`sudo` で許可するコマンドは限界まで減らさないと、悪意のある操作者の悪事を防止することはできません。`chmod` や `chown` さえできてしまえば、どんなコマンドも特権ユーザの権限がなくても実行できる抜け道となってしまいます。`mv` ができれば、特権実行可能なコマンドを悪意のある実行ファイルで置き換えることで何でもできてしまいます。

セキュリティまわりは考え始めるとキリがないので、IT業界で長く働いて感じることは、プロジェクトメンバー間の信頼関係が何より大事だということです。
Cloud Foundry ワークショップに参加してみた #cfws

@making@github さんが主催している04/18のCloudFoundryのワークショップに参加したので、そのレポートをば。参加したのは以下のイベントでした。

[Cloud Foundryワークショップ第2回目](http://connpass.com/event/29068/)

もともと2015年のJavaOneに参加した際に、IBM Bluemixのワークショップに参加し、その時に初めてCloudFoundryに触れました。色々なコマンドが実装されていることから当時「すげぇ」とは思ったのですが、より詳細に聞けそうだったので参加することに。
#感想
**早急に勉強しなきゃこれ。そのうち出てくる運用面の大きな課題の解決策になりそう。**

というのが参加した自分が実感したことです。

これからクラウドを使った大きなシステム構築が当たり前になってくる中で、如何に運用を効率的に行えるかは、開発者にとっては重要かな、と。そのためのサポートを受けられるCloudFoundry的なモノは、需要が増してくると思っています。

加えてDevOpsなんてよく言われてますけど、Blue/Greenデプロイ一つとっても如何に自分たちだけでやるのが大変か、手を動かしたことがある人なら実感していると思います。そこにもしインスタンスが複数あって、、、なんていろんな条件が加わったら、、、ぞっとしますね。
#スライドとか、資料とか
今回これに沿って進めました。これやるだけでも、十分CloudFoundryのすごさはわかる。

[Cloud Foundry Workshop](https://github.com/Pivotal-Japan/cf-workshop)

会の中で使われた資料は以下になります。

[Introduction to Cloud Foundry #JJUG](http://www.slideshare.net/makingx/introduction-to-cloud-foundry-jjug)

会の後にCloudFoundryについて勉強したくて参考にしたSlideShare

[Cloud Foundryで学ぶ、PaaSのしくみ講座](http://www.slideshare.net/jacopen/paas-for-beginners)
※QiitaってSlideShareがそのまま埋め込めないのが不便。。。
##内容
基本的なことは、他にも参加された方がブログなどに書いていますので、まとめ的なモノはそちらを見てもらうのがいいかと思っています。
※「#cfws」でTwitterを検索だ！

自分的に気になった、「おっ」と思ったことで。
##運用面でのメリットがかなり大きい
DevOpsが自分自身そこまで得意ではないから、というのもありますが、いちいち面倒なこと考えなくても、運用面でかなりのサポートをもらえるのが大きいと思っています。たとえば以下のようなこと。
###Blue Green デプロイがコマンド操作のみで可能
Blue Greenに限らず、運用を考えた時に「めんどくさいな」と思うものをいくつも、CloudFoundryではコマンド一発、あるいは数発で実施できるようになっています。cf様様ですほんと。Blue Green デプロイで言えば

```
$ cf map-route <App> <Domain> -n <Hostname>
$ cf unmap-route <App> <Domain> -n <Hostname>
```
を数発打てば、Blue Greenデプロイが実施できてしまいます。
###4レベルのHAを搭載
Application / Process / VM / AZをそれぞれ監視していて、ダウン時の復旧をしてくれるようです。このレベルのPaaSを自分で作ろうとしたら泣けてくるくらい大変ですね。それを最初からサポートしているのは大きな特徴かと思います。
###Scaleoverプラグインを用いた、複数インスタンスのBlueGreenデプロイが可能
結構衝撃を受けました。Scaleoverプラグインを使うことで、インスタンスが複数あるサービスに対して、Blue系から少しずつインスタンスをGreen系に移しながらデプロイをするコマンドが存在するんです。

```
$ cf scaleover try-scale-over-v1 try-scale-over-v2 10s
```
単純に考えたら、Blue系が10のインスタンスを持っていたらGreen系も10のインスタンスを用意して、「エイヤ」で変更をかけそうですが、そうすると一時的にも20インスタンスが必要になり、クラウドの契約など諸々絡んでくると面倒なことになります。ただこのScaleoverプラグインを使って実際にBlueGreenデプロイをmakingさんが実施したところ、全体で11のインスタンスを確保するだけでデプロイがされてしまいました。ダウンタイムも見た感じでは0（1秒以上のダウンタイムは確認できなかった）。これは便利すぎる。
###Dockerにも対応
Diegoバージョンにて、Dockerにも対応したようです。その際
Buildpack ⇔ Dockerfile
Droplet ⇔ Docker image
になるようです。
#まとめ
CloudFoundryは今から学んでおく必要がありますね。いずれかならず必要になる技術かと思いました。

※先輩からOpenShiftとの比較をしてほしい、と言われているのですが、どうしようかな。。。
ATOM を Windows + Proxy 環境で使うためのメモ

Windows + Proxy 環境で使うために苦労した点などのメモです。
## Download
http://atom.io/

Download をクリックする

## Install先
- ``C:\Users\(ユーザ名)\AppData\Local\atom\``

## Proxy 環境で使うためには?
`` C:\Users\(ユーザ名)\.atom\.apmrc  ``を作成し以下を記入

```
http-proxy = http://(ユーザ名):(Password)@(Proxyサーバアドレス):(Port番号)
https-proxy = http://(ユーザ名):(Password)@(Proxyサーバアドレス):(Port番号)
strict-ssl = true
```
strict-ssl は true に。理由は以下を参照。
http://qiita.com/falms/items/0eb4721c319bd8ce3a56#ssltls%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E7%84%A1%E8%A6%96

## Package をインストールするためには
Atom 1.10 以下の設定は不要になった
http://qiita.com/falms/items/0eb4721c319bd8ce3a56
https://github.com/atom/apm/issues/322#issuecomment-233641984

～～ ここから不要 ～～
Proxy環境では環境変数 ATOM_NODE_URLの定義を追加して atomを再起動する

```
ATOM_NODE_URL=http://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/dist
```
～～ ここまで ～～
## apm はどこにあるか?
- ~~``C:\Users\(ユーザ名)\AppData\Local\atom\(atom バージョン)\resource\app\apm\bin``~~
- ``C:\Users\(ユーザ名)\AppData\Local\atom\bin``

Atom 1.2.0 から apm へのコマンドがbinに追加された模様
実質resource へのリンクだけど。

## Install した Package
### [higilight-line](https://atom.io/packages/highlight-line)
行をハイライト

### [japanese-menu](https://atom.io/packages/japanese-menu)
メニューを日本語化

### [file-icons](https://atom.io/packages/file-icons)
拡張子に合わせてアイコンを表示

### [autocomplete-paths](https://atom.io/packages/autocomplete-paths)
パスの補完・候補の表示

### [atom-beautify](https://atom.io/packages/atom-beautify)
コード整形(C++, C# など一部言語は [Uncrustify](http://uncrustify.sourceforge.net/) を使う。まだ試していない。)

### [autocomplete-plus](https://atom.io/packages/autocomplete-plus)
autocomplete 機能の強化

### [language-log](https://atom.io/packages/language-log)
log ファイルにシンタックスハイライト。

### [tail](https://atom.io/packages/tail)
tail 機能を atom 上で実現。バッファサイズが大きくなりすぎるとAtomが応答なしになる

### [show-ideographic-space](https://atom.io/packages/show-ideographic-space)
全角スペース可視化

### [tablr](https://atom.io/packages/tablr)
CSV を Excel ライクに表示

### [Plantuml-viewer](https://atom.io/packages/plantuml-viewer)
UMLをAtom上でライブ表示(要[Graphiz](http://www.graphviz.org/)ライブラリ)
詳細は[こちら](http://qiita.com/nakahashi/items/3d88655f055ca6a2617c)を参照


### [language-plantuml](https://atom.io/packages/language-plantuml)
Plantumlのシンタックスハイライト

## Disable にした Package
### metrics
Google Analytics にデータを送信する

### omnisharp-atom
C#の補完などをしてくれるのだけど、重かったりエラーが頻発するので様子見

## 個人的に欲しいけどみつからない　Package
探しているけど、見つからないPackage(情報募集)

- emacs の auto-insert.el もどきの Package ってないっすかね？

## 画面設定フォント設定など
- 画面表示で気に食わない部分は``[表示]->[開発]->[デベロッパツール]``を開き該当の部分を探す
- 以下の部分の日本語が汚いので style.less に追記
 - markdown-preview <= Markdown Preview での表示
 - tree-view <= ツリービュー
 - title <= 上部タブのファイル名表示部分

```
.tree-view {
  font-family: "Meiryo UI"
}
.title {
  font-family: "Meiryo UI"
}
.markdown-preview {
    font-family: "Meiryo UI" h1, h2, h3, h4, h5, h6{font-family: "Meiryo UI";}
}
```

- 日本語表示のフォントはいくつか試し中
 - Ricty Diminished
 - Source Han Code JP
 - Inconsolata + Meiryo UI
npm v3 で Electron のパッケージサイズが大きくなる


## 問題点

npm v3を使っていると、electron-packager や electron-prebuiltが依存している module がビルドしたパッケージに含まれてしまい、ファイルサイズが大きくなってしまう


## 原因

npm v3 では、以下の画像のように node_modules にフラットに依存パッケージが展開されます。

![node_modules直下の状況](https://qiita-image-store.s3.amazonaws.com/0/39362/56bbfcb6-cee1-f89e-da44-3ff9d8102dd5.png)


あるパッケージ `modA` が `modB`, `modC` に依存している時、npmのバージョンによってフォルダ構成が以下のように変わります。

* npm v2 の場合

```
.
└── node_modules
    └── modA
        ├── modB
        └── modC
```

* npm v3 の場合

```
.
└── node_modules
    ├── modA
    ├── modB
    └── modC
```



electronのアプリをパッケージ化する際、electron-packager の `ignore` プロパティにて electron-packager や electron-prebuilt をパッケージ対象から除外します。

npm v2の場合は electron-packager や electron-prebuilt が依存しているモジュールはそれぞれのフォルダ配下にあるため、パッケージ対象から除外されます。


## 対応方法

### (その場しのぎ) npmのバージョンをv2に落とす

力技で `ignore` に依存パッケージを列挙しても良かったのですが、面倒くさかったので npm のバージョンをv2に落とします。

```sh
$ npm install -g npm@v2.15.3
$ npm -v
2.15.3
```

で、node_modulesフォルダを一旦削除し、`npm install` をやりなおします。

![npm v2](https://qiita-image-store.s3.amazonaws.com/0/39362/eddc4046-20fb-d1c5-7591-7430a423a2e2.png)

フォルダ数が目に見えて少なくなってますね。

~~根本的な対応ではないですが、とりあえずの回避策として共有してみました。~~

---
【2016/04/25 追記】

### 【適切な対応方法】`--global-style` オプションを指定する

npm v3でも、`npm install` の際に `--global-style` オプションを指定することで、以前のようにパッケージごとの依存関係を反映したフォルダツリーとなります。

```sh
$ npm -v
3.8.8

$ npm install --global-style
```

![001.png](https://qiita-image-store.s3.amazonaws.com/0/39362/63fb9c35-049b-2fb1-0542-ca382c53f8be.png)

見事に期待するフォルダ構成になっていますね。
簡単にLINE Botとそれとない会話を実現する方法

先人の知恵を使えば、本当に簡単にできてびっくり

# 作るもの
ユーザの投稿に対してそれとない返しをしてくれるbot

# 必要なもの

- LINE Bot API Trialのアカウント
- Herokuのアカウント
- Yahoo！のアカウント

とりあえず３種のアカウント

# 手順
## スターターキットを入れる
下記に従って、ありがたくスターターキットをHerokuに入れる
http://qiita.com/tmtysk/items/2f33c7e08caefbf55548
※LINE側に登録したHerokuの設定値の反映に半日〜１日かかったので注意

## Yahoo!の形態素解析APIを使う
http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html

API keyをHerokuのENVか何かに登録しておいて
呼び出す形式にしとく

```php:web/index.php
~~省略~~
    // ユーザからの投稿に対して処理をする
    if ($content['text']) {
      // YahooAPIに投げるクエリを作る
      $query = $content['text'];
      $apiKey = getenv('YAHOO_API_KEY');;

      $url = "http://jlp.yahooapis.jp/MAService/V1/parse?appid=" . $apiKey . "&sentence=" . $query ."&response=surface,reading,pos,baseform,feature";

　　　// 形態素解析を取得
      $rss = file_get_contents($url);
      $xml = simplexml_load_string($rss);

      // 形態素解析結果を単語ごとに詰める
      $pos_list = array();
      $word_list = array();
      $base_list = array();

      $i = 0;
      foreach($xml->ma_result->word_list->word as $item) {
        $pos_list[$i] = $item->pos;
        $word_list[$i] = $item->surface;
        $base_list[$i] = $item->baseform;
        $i++;
      }

     $return_text = 'うんうん';
     // 感動詞（ex.こんにちは、おはよう）はそのままを繰り返す
     if(in_array('感動詞', $pos_list)) {
       $key = array_search('感動詞', $pos_list);
       $return_text = $base_list[$key];
　　 // 名詞は「〜なんだね」と返す
     } elseif(in_array('名詞', $pos_list)) {
       $key = array_search('名詞', $pos_list);
       $return_text = $base_list[$key] . 'なんだね';
     // 辛い、眠いが含まれるワードは「頑張ってるんだね」って慰める
     } elseif(in_array('つらい', $base_list) || in_array('眠い', $base_list) || in_array('ねむい', $base_list) || in_array('辛い', $base_list)) {
       $return_text = '頑張ってるんだね';
     }
     // 返答を送る
     $bot->sendText($from, sprintf('%s', $return_text));
    }
  }
~~省略~~
```

# 動作

![スクリーンショット 2016-04-23 16.58.08.png](https://qiita-image-store.s3.amazonaws.com/0/108154/3630dcc2-cb87-3ae5-752a-1cc8441cb081.png)


「おやすみ」は感動詞のはずなんだけど
Yahooの形態素解析的には名詞らしく上手く返してくれなかった(´・ω・`)

これで暇な時に構ってくれる相手ができた！！！素晴らしい！ライフハックだ！
ASP.NET 5で、TempDataを利用する。

ASP.NET MVC 6では、デフォルトでTempDataがまだ利用できないようなのでメモ。

編集するファイルは2つ
1. project.json
2. Startup.cs

project.jsonのdependenciesに以下の項目を追加します。

```lang:project.json
"dependencies": {
    ~
    "Microsoft.AspNet.Session": "1.0.0-rc1-final",
    "Microsoft.Extensions.Caching.Memory": "1.0.0-rc1-final"
  },
```

補完が効く！、VisualStudio2015凄い！


```lang:Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    // 下の２行を追加
    services.AddCaching();
    services.AddSession();
    // Add framework services.
    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    // 下の１行を追加、app.UseMVCよりも上に書く必要あり
    app.UseSession();
    app.UseMvc(routes =>
    {
        routes.MapRoute(
        name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}
```

これで使えました。
OSX El capitanとJuypter Python,Ruby,R (メモ)

Jupyterが便利という話を聞いて、インストールしてみたメモ

## 環境

* OSX 10.11.4
* Ruby 2.2.3
* Python: 2.7.10
* R: 3.2.4

irubyを使うために、zeromqを、``brew install homebrew/versions/zeromq405``として、4.0.5を先に入れるのが良いようだ。
(試行錯誤してやったので順番的にどれが正しいのかはっきりしない)


## Jupyter本体(Python)の導入

* pyenvを使って導入
* この手順に従う [OS X ElCapitanにpyenv, pyenv-virtualenv, jupyterで環境構築](http://qiita.com/yuichiroTCY/items/74e90f8a54504cbdc06d)

次のようにする。これをしないと次のようなエラーが出る。``Symbol not found: _PyUnicodeUCS2_DecodeUTF8``

```
$ PYTHON_CONFIGURE_OPTS="--enable-unicode=ucs2" pyenv install 2.7.10
$ pyenv virtualenv 2.7.9 tech
```

### 拡張機能

[extensionを追加してもっと快適なJupyter環境を構築する](http://qiita.com/sasaki77/items/30a19d2be7d94116b237)

私の環境では、psutilがないと言われたので、それも追加で導入

```
pip install pyyaml
pip install psutil
git clone https://github.com/ipython-contrib/IPython-notebook-extensions
cd IPython-notebook-extensions
python setup.py install
```


## Ruby

ポイント

* zeromqは4.0.5を使う、最新の4.4だとエラーになる。
* 参考: [iruby hangup](https://gist.github.com/hiroyuki-sato/46837a7f1945d38c337784f6aa73a23e)

```
brew install homebrew/versions/zeromq405
```

## R

```
install.packages("rzmq")
install.packages(c('repr', 'IRkernel', 'IRdisplay'),
                 repos = c('http://irkernel.github.io/', getOption('repos')))
IRkernel::installspec()
```

参考: [Native R kernel for Jupyter](https://github.com/IRkernel/IRkernel)
マルチバイト文字を含むURLをエンコードしないでHTTP通信しようとすると落ちる

表題通り、エンコードしないでAlamofireでGETで呼び出すと落ちる。(Alamofireに限らない。)
エラーメッセージが不親切ですぐわかんなかった。
突然の死でした。

# 環境

* Swift 2.2
* Xcode 7.3
* Alamofire 3.3


# 現象 / ソースコード

## エラー
```error
fatal error: unexpectedly found nil while unwrapping an Optional value
```


## ソースコード

以下メソッドに渡すurlを日本語等のマルチバイト文字を含むものにすると落ちる。


````hoge.swift

    func send(url : String){

        Alamofire.request(.GET, url)
            .responseJSON { (response) -> Void in

                guard let object = response.result.value else {
                    return
                }

        }
    }
````


## サンプル呼び出し


```hoge.swift
let url = "https://www.google.co.jp/#safe=off&q=あいふぉんクレイドル"
self.send(url)
```


# 対策後コード


````hoge.swift

    func send(url : String){

        // これ追加👇
        let encodedUrl = url.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!

        Alamofire.request(.GET, encodedUrl)
            .responseJSON { (response) -> Void in
                guard let object = response.result.value else {
                    return
                }
        }
    }
````



## 原因/参考

[Alamofire crashes when url param contains special character (umlaut) #1195](https://github.com/Alamofire/Alamofire/issues/1195)
[iOSでパーセントエンコード(Swift)](http://qiita.com/edvakf@github/items/02c02713dab05427ce22)
Rubyでファイルに追記をする方法

Rubyでちょっとしたログをファイルの最後にどんどん追加したかったのですが、File.openのモードを指定するだけで簡単に書けました。

##File.openのモード指定

ファイルの最後の行に書き込みをするためにはFile.openモードの’a’を指定します。

まずテストファイルを用意して

```test.txt
foo
bar
```

モードにaを指定して開く。

```ruby:main.rb
file = File.open('path/to/test.txt','a')

3.times { |n|
  file.puts "text #{n}"
}

file.close
```

ファイルを確認すると

```test.txt
foo
bar
text 0
text 1
text 2
```

無事末尾に記入されてます。

##参照
  http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/m/open.html
ES2015 で Enum っぽいもの


`Symbols` を利用します。例えば「曜日」を表現する場合、

```javascript:week.es6
const week = {
  SUM: Symbol(),
  MON: Symbol(),
  TUE: Symbol(),
  WED: Symbol(),
  THU: Symbol(),
  FRI: Symbol(),
  SAT: Symbol()
};

export default week;
```

> この `week.◯◯◯` は一意であり、他の方法で同値のものを生成できません。

利用したい場所で `week.es6` を `import` して利用します。

```javascript:some.es6
import week from './week.es6';

const myWeek = week.FRI;

if (myWeek === week.FRI) {
  console.log('金曜日です');
}
```
Ubuntu Server のいろんなバージョンのインストールまとめ

本家の Ubuntu Server の インストールチュートリアルは以下
[https://tutorials.ubuntu.com/tutorial/tutorial-install-ubuntu-server#0](https://tutorials.ubuntu.com/tutorial/tutorial-install-ubuntu-server#0)

私がコツコツと記したインストールログの一覧は以下になります。
14.10/12.04/11.10/11.04/10.10 のバージョンは、私はインストールしていないので記事になっていません。

[Ubuntu Server 19.10 インストールログ : システム屋まそおブログ](https://www.masoo.jp/blog/2019/10/22/install-log-ubuntu-server-1910.html)
[Ubuntu Server 19.04 インストールログ : システム屋まそおブログ](https://www.masoo.jp/blog/2019/06/17/install-log-ubuntu-server-1904.html)
[Ubuntu Server 18.10 インストールログ : システム屋まそおブログ](https://www.masoo.jp/blog/2018/11/12/install-log-ubuntu-server-1810.html)
[Ubuntu Server 18.04 インストールログ : システム屋まそおブログ](https://www.masoo.jp/blog/2018/05/07/install-log-ubuntu-server-1804.html)
[Ubuntu Server 17.10 インストールログ : システム屋まそおブログ](https://www.masoo.jp/blog/2017/10/21/install-log-ubuntu-server-1710.html)
[Ubuntu Server 17.04 インストールログ : システム屋まそおブログ](https://www.masoo.jp/blog/2017/04/15/install-log-ubuntu-server-1704.html)
[Ubuntu Server 16.10 インストールログ : システム屋まそおブログ](https://www.masoo.jp/blog/2016/10/20/install-log-ubuntu-server-1610.html)
[Ubuntu Server 16.04 インストールログ : システム屋まそおブログ](https://www.masoo.jp/blog/2016/04/24/install-log-ubuntu-server-1604.html)
[Ubuntu Server 15.10 インストールログ : システム屋まそおブログ](https://www.masoo.jp/blog/2015/10/27/ubuntu-install-log.html)
[Ubuntu Server 15.04 インストールログ : まそおぶろぐ](https://masoojp.blogspot.jp/2015/06/ubuntu-server-1504.html)
[Ubuntu Server 14.04 インストールログ : まそおぶろぐ](https://masoojp.blogspot.jp/2014/06/ubuntu-server-1404.html)
[Ubuntu Server 13.10 インストールログ : まそおぶろぐ](https://masoojp.blogspot.jp/2014/03/ubuntu-server-1310.html)
[Ubuntu Server 13.04 インストールログ : まそおぶろぐ](https://masoojp.blogspot.jp/2013/05/ubuntu-server-1304.html)
[Ubuntu Server 12.10 インストールログ : まそおぶろぐ](https://masoojp.blogspot.jp/2013/01/ubuntu-server-1210.html)
[Ubuntu Server 10.04 インストールログ : まそおぶろぐ](https://masoojp.blogspot.jp/2012/01/ubuntu-1004.html)
Condaで作ってる仮想環境の切り替えをJupyter上で簡単に行う方法

最近、Pythonを触ってるんですが、環境構築だけでも新旧いろんなやり方、いろんな情報がネット上にありすぎてちょいちょい苦戦してました。

Pythonの仮想環境構築で一番良さそうだったCondaを使って作ってたんですが、最近流行りのJupyterと合わせて使おうとした時、仮想環境のカーネルの切り替えがうまくできなくてハマってしまったので、やり方について備忘録的に残しておきます。

うまくいくと、以下のようにJupiterの[Kernel] -> [Change kernel]から開発環境を一瞬で切り替えられるようになるので、かなり便利になります！！
![image](https://qiita-image-store.s3.amazonaws.com/0/7885/61f669f4-d7f4-eb63-029a-2dde06396267.png)

### 前提：
CondaとJupyterがインストール済み

### **numpyの動く環境をcondaで作成**
```
$ conda create -n numpyenv python=3.5 numpy jupyter
```
作る仮想環境の方にも必ずjupyterをインストールする必要があります。

### **作られた仮想環境を確認**
```
$ conda info -e
Using Anaconda Cloud api site https://api.anaconda.org
# conda environments:
#
numpyenv                 /Users/username/anaconda/envs/numpyenv
opencvenv                /Users/username/anaconda/envs/opencvenv
py35                     /Users/username/anaconda/envs/py35
root                  *  /Users/username/anaconda
```
numpyenvという環境が作られていることが確認できます。

### **jupyter_environment_kernelsのインストール**
Jupyter上でカーネルを切り替えるためのパッケージが提供されてるのでそれをインストール。

```
$ pip install environment_kernels
```

### **Jupyterの設定ファイル生成**
※すでに作成している場合は作らなくて大丈夫です。

```
$ jupyter notebook --generate-config
```

おそらく
~/.jupyter/jupyter_notebook_config.py
という設定ファイルが生成されているかと思います。

#### **自動でConda環境を読み込む設定追記**

~/.jupyter/jupyter_notebook_config.pyに下記を追記します。**（注意：古い可能性あり）**

```
c.NotebookApp.kernel_spec_manager_class = 'environment_kernels.EnvironmentKernelSpecManager'
c.EnvironmentKernelSpecManager.env_dirs=['/Users/username/anaconda/envs/']
```

**（※追記:2016/12/09）**
コメントでいただいているように[最新のバージョン](https://github.com/Cadair/jupyter_environment_kernels)では、下記の一行のみで大丈夫になっているようです。

```
c.EnvironmentKernelSpecManager.conda_env_dirs = [ '/Users/username/anaconda/envs/' ]
```


conda_env_dirsには`conda info -e`などで仮想環境が生成されているパスを確認して適宜設定してください。

### **動作確認**

```
$ jupyter notebook
```
Jupyterを起動すると無事にnumpyenvという新しいカーネルが選択できるようになっているのが確認できるかと思います。
![image](https://qiita-image-store.s3.amazonaws.com/0/7885/6b6dfa14-83cc-91ec-4fe3-b795c105dea0.png)



参考：
[[Python]Anacondaで仮想環境を作る](http://qiita.com/supersaiakujin/items/50def6f33b79f9a61b18)
[Cadair/jupyter_environment_kernels](https://github.com/Cadair/jupyter_environment_kernels)
[Jupyter Notebook and Conda](http://stuartmumford.uk/blog/jupyter-notebook-and-conda.html)
ruby zip

http://dfriedm.github.io/blog/2013/10/12/ruby-zip-method/

```rb
[1] pry(main)> ([1,2,3].zip [2,3,4]).to_h
=> {1=>2, 2=>3, 3=>4}
```

to_h 貌似1.9.3没有 到2.0才有 

1.9.3可以用这个

```rb
[1] pry(main)> a = [1,2,3].zip [2,3,4]
=> [[1, 2], [2, 3], [3, 4]]
[2] pry(main)> Hash[a]
=> {1=>2, 2=>3, 3=>4}
```

https://codequizzes.wordpress.com/2013/07/16/rubys-inject-method/

https://github.com/rubyworks/facets/blob/master/lib/core/facets/array/to_h.rb

```rb
class Array

  # Convert an associative array to a Hash.
  #
  # Examples
  #
  #   [[:a, 1], [:b, 2]].to_h
  #   #=> {:a=>1, :b=>2}
  #
  # Returns [Hash].
  #
  def to_h
    h = {}
    each{ |(k,v)| h[k] = v }
    h
  end unless method_defined?(:to_h)

end
```
Visual Studio Codeが1.0になって日本語対応したおかげで死ぬほど使いにくくなったから英語にした話

# 追記(2016/5/19)
5月リリースのv1.1.0にて「過剰なローカライズ」が改善されましたので、以下の動機で英語化したいという方は少なくなるかと思いますが、一応残しておきます。

# 祝！Visual Studio Code 1.0！
おめでとうございます。即座にアップデートしました。

<img width="723" alt="スクリーンショット 2016-04-23 14.41.27 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/64040/adc210f8-12ee-66c4-b844-5c23bf526680.png">


えぇ……嘘でしょ……
この日本語環境、cmd(ctrl)+Pで出すこのメニューにも日本語で入力しないと反応しなくなるので、使いにくいことこの上ないです。

流石にこれはナイので、使い慣れた英語環境に戻しましょう。
画面はMacの画面ですが、他のOSでも同じように設定が可能です。

# 即座に終わる設定
Visual Studio Codeを起動し、Macの場合は「Cmd+P」、Win・Linuxの場合は「Ctrl+P」を入力。
出てきたテキストボックスに以下のように入力してEnter！
> \> 言語を

locale.jsonというファイルがオープンされるはずなので、以下のように入力しましょう。

```json:locale.json
{ "locale": "en-US" }
```
これを保存してVSCodeを再起動すれば、使い慣れた英語表示に戻ります。やったぜ。
ちなみに先程のlocale.jsonは以下の場所に保存されます。
Win： C:¥Users¥（ユーザー名）¥AppData¥Roaming¥Code¥User¥
Mac： /Users/（ユーザー名）/Library/Application Support/Code/User

## 英語以外が使いたい人たち向け
[こちら](https://code.visualstudio.com/docs/customization/locales)に、現在使えるlocale設定の一覧が載っていますので、
「俺は簡体字でVSCode使ったる！！！！」
という奇特な方は

```json:locale.json
{ "locale": "zh-CN" }
```
とかやれば幸せになれるかもしれません。
自分はやりませんが。


以上、参考にどうぞ。
フット入力 > フットペダル制作 > v0.1

関連 http://qiita.com/7of9/items/c5e39a8c08ca7a6e5af6


http://qiita.com/7of9/items/faae2a627443ff137c84
にてフット入力部分のプログラムはできた。

実際にフット入力するためのフットペダルを制作した。


## 材料

- 30Φ スイッチ 325円 x 6個
- 金属スペーサ x 8個 : 400円?
- M3ビス x 8個 : 100円
- 木 (ファルカタ材: 150 x 6 x 450mm) 148円 
- 木工ショートドリル : 480円
- 30mm用バイメタルカッター : 2,280円

スイッチは音の静かなものにしたが、気にしないのであれば150円のものがあった。

木は近所のコーナンで購入。M3の穴と30mmの穴をコーナンの自作スペースで開けた。電動ドリルは貸出してもらえるが、刃は自分で用意とのことなので木工用ショートドリル(M3用)とバイメタルカッターを購入した。今後、使うだろうか。

以下のように穴を開けた。
上下４つずつのM3は金属スペーサ取り付け用。

![DSC_0161.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/75c27e13-8cd1-ed0a-4464-d7ac1b3e5a17.jpeg)


## 実装

裏面は以下のようにした。

木の上部にユニバーサル基板を木工用ボンドで固定。そこにリード線(AWG24)を実装。

金属スペーサは傾斜を作るために上のものを長いもの下は短いものにした。正確な長さは忘れたが、16mmと6mmのようなものだった気がする。

![DSC_0162.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/219303b4-e8f9-9db2-2451-4863dfc2c455.jpeg)


## 実際の使用

足元に置いて試用してみた。

横幅のサイズはフルサイズキーボード程度。

![DSC_0163.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/255c1fa1-016f-f5d1-9bff-6063ce7bd038.jpeg)


ブラインドタッチができるようにボタンを離したのだが、足がつりそう。

http://qiita.com/7of9/items/faae2a627443ff137c84
のプログラム(入力を6に変更)を試したが、問題なく使える。

あとはWindowsからRPiにキー入力を問い合わせるプログラムを作ることになる。
API Blueprintとapi-mockでモックサーバを作成する


前回：[API BlueprintでWeb APIのドキュメントを生成する - Qiita](http://qiita.com/yagays/items/8e16a27b058f0ddef653)

## 概要

ここでは、api-mockを使って記述したドキュメント通りに動くWeb APIを立ててみます。

api-mockで立ち上がるモックサーバは、実際にはデータの追加や削除等のデータに応じたレスポンスを作ることはできません。APIを1から実装する段階ではあまり恩恵がありませんが、既に他のアプリケーションとの連携ができる場合などには、疎通確認したいといったケースには便利なツールです。

また、きちんとドキュメント通りに想定するレスポンスが返ってくるので、MacOSならパイプを挟んで`pbcopy`することにより、手軽にコピペできる等の使い方も考えられます。

## api-mockでWeb APIドキュメントからモックサーバを立ち上げる

`api-mock`コマンドで先ほど作成した`recipe.apib`を指定するだけでサーバが立ち上がります。

```
$ api-mock recipe.apib
info:    Enabled Cross-Origin-Resource-Sharing (CORS)
info:    	Allow-Origin: *
info:    	Allow-Methods: GET, PUT, POST, PATCH, DELETE, TRACE, OPTIONS
info:    	Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization, Referer, Prefer
info:    Listening on port 3000
```

起動したところで、`curl`で実際に記述したとおりのレスポンスが返ってくるかを確かめてみましょう。

```
$ curl http://localhost:3000/recipes/
{
  "success": false,
  "path": [],
  "error": "show not implemented yet"
}%
$ curl http://localhost:3000/recipes/hoge
{
  "error": "show not implemented yet",
  "path": "/PTH/TO/XML/{name}.xml",
  "success": false
}%
$ curl -X DELETE http://localhost:3000/recipes/hoge
{
  "success": false,
  "error": "delete not implemented yet"
}%
$ curl -X PUT http://localhost:3000/recipes/hoge
{
  "success": false,
  "path": "/PTH/TO/XML/{name}.xml",
  "error": "save not implemented yet"
}%     
```

これを見ると、一通り記述したとおりのレスポンスが返ってきているようです。実際に、[前回の記事](http://qiita.com/yagays/items/8e16a27b058f0ddef653)で使用したPython+Bottleの`bottle/test2.py`を起動しておいてcurlで叩いても、同様の結果が返ってきます。

<img width="707" alt="ss 2016-04-23 14.46.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/4452/91c246ee-9f48-bf73-b861-d80c58b868bc.png">

ちなみに、ルーティングが設定されていないURLにアクセスすると、以下のようなエラーが表示されます。

```sh
$ curl http://localhost:3000/recipe
Cannot GET /recipe
```

### 参考：モックサーバを手軽に作れる他のサービス

api-mockはAPI Blueprint用のモックサーバですが、他にもnpmベースのものやAWS上で作成するものなのがあるようです。

- [easymock](https://www.npmjs.com/package/easymock)
  - [APIのモックを簡単に作成できる「node-easymock」 - 大学生からの Web 開発](http://karur4n.hatenablog.com/entry/2013/11/29/213428)
- [Amazon API Gateway （API を容易に作成・管理） | AWS](https://aws.amazon.com/jp/api-gateway/)の"Mock Integration"という機能
  - [[AWS] Amazon API GatewayでAPI Mockサーバー [作成とGETまで] ｜ Developers.IO](http://dev.classmethod.jp/cloud/create-mock-aws-amazon-api-gateway/)
TidalをWindowsでセットアップする

# Window環境でのTidal

- Tidalについて、OS Xへでのセットアップについてはこちらを参照: [Tidalでライブコーディング! - セットアップ編](http://qiita.com/yoppa/items/41805cc6af62b1047a34)

Tidalは基本的にはUnixベースの環境を前提としているため、Windowsで動かすには、いろいろ設定が必要です。

TidalをWindowsで動かすために、まず[Cygwin](https://www.cygwin.com/)という、Windowsオペレーティングシステム上で動作するUNIXライクな環境をインストールし、そこに必要なライブラリーをインストールした後、Tidalの環境を構築します。

# Cygwinのインストール

下記のリンクからダウンロードします。
 - https://cygwin.com/install.html

- 64bitOSの場合は、setup-x86_64.exe をダウンロードして実行
- 32bitOSの場合は、setup-x86.exe をダウンロードして実行

インストーラーでインストールを進めると、途中でパッケージを選択する画面になります。ここで、下記のパッケージをsearchから検索して、表示されたパッケージのバージョン番号をチェックをしてインストールする設定にします。

<img width="1273" alt="screenshot_594.png" src="https://qiita-image-store.s3.amazonaws.com/0/115058/52394c1a-99e0-4ca7-a59b-34060c44f418.png">

```
git
gcc-core
make
gcc-g++
libsndfile
libsndfile-devel
libsamplerate
libsamplerate-devel
```

# Portaudioのインストール

Portaudioは、パッケージ化されていないので、ダウンロードして手動でビルドする必要があります。まず[Portaudioのダウンロードページ](http://www.portaudio.com/download.html)に行き、安定板(2016年4月現在はpa_stable_v19_20140130.tgz)をダウンロードします。ダウンロードしたpa_stable_v19_20140130.tgzをCygwinのホームにコピーします。その上で、下記のコマンドでPortaudioをインストールします。

```
cd ~
tar xvzf pa_stable_v19_20140130.tgz
cd portaudio
./configure && make && make install
```

# Libioのインストール

OSCをやりとりするためのライブラリーlibioもapt-cygではインストールできません。[libioのサイト](http://liblo.sourceforge.net/)のDownloadにある最新の安定版(2016年4月現在はliblo 0.28)をダウンロードして、下記の手順でインストールします。

```
cd ~
tar xvzf liblo-0.28.tar.gz
cd liblo-0.28
./configure && make && make install
```

# Dirtのインストール

Tidalで使用するサンプラー、Dirtをインストールします。Dirtはgithubからクローンします。

```
cd ~
git clone --recursive http://github.com/tidalcycles/Dirt.git
```

ダウンロードしたら、ビルドします。

```
cd Dirt
make dirt-pa
```

# Haskellのインストール

Tidalのベースとなっているプログラミング言語Haskellをインストールします。まずHaskellのインストールページを開きます。

- https://www.haskell.org/platform/

自動的にWindowsでのインストールのページが表示されます。使用している環境にあわせて、32bit版か62bit版のHaskellのインストーラーをダウンロードします。ダウンロードが完了したら、インストーラーを起動してHaskellをインストールします。

**Haskellをインストールしたら、Cygwinを再起動してください。**

# Tidalのインストール

Cygwinを起動して、下記のコマンドでTidalをインストールします。

```
cabal update
cabal install cabal-install
cabal install tidal
```

これで、完了です! 

# Atomの設定

Windows版でも、Atomをエディターとして使用可能です。OS X版と同様に、まずAtomをインストールした後、Tidalパッケージを追加します。

- https://atom.io/packages/tidal

TidalパッケージのSettingを開きます。ここでghci.exeへのパスを正しいものに変更します。

- 例: C:\Program Files\Haskell Platform\7.10.3\bin\ghci.exe

<img width="887" alt="screenshot_596.png" src="https://qiita-image-store.s3.amazonaws.com/0/115058/423a4f1a-99e3-4851-2714-01258c0dfd06.png">

あとは、テストでコードを実行させてみて音が鳴れば、設定完了です!!

```
d1 $ sound "909 bass"
```
Pythonのメモリ使用量を減らすポイント

今回は、[iXce&#8217;s blog  &raquo; Blog Archive   &raquo; Optimizing memory usage in Python: a case study](https://guillaume.segu.in/blog/code/487/optimizing-memory-usage-in-python-a-case-study/) という記事を見つけて興味深かったので紹介したいと思います。何も説明書いてないところがあるので、詳しく知りたい人は元記事を読んでほしいです。

## 動機
- プレーンテキストをGコードに変換するプログラムを書いている
- 3.8MB (14万Gコード) のファイルを読み込むと、244MBもメモリを使ってしまう
- だからメモリ使用量を減らしたい

## やったこと
### プロファイル
どこがメモリをたくさん使ってるのか調べるために[Heapy](http://guppy-pe.sourceforge.net/#Heapy)を使う

`$ pip install guppy` で入れられる。

するとこんな感じの結果が出力される。

```
Partition of a set of 225737 objects. Total size = 115386656 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0 100000  44 104800000  91 104800000  91 dict of __main__.Hoge
     1 100000  44  6400000   6 111200000  96 __main__.Hoge
     2  11648   5  1013232   1 112213232  97 str
     3    177   0   844360   1 113057592  98 list
     4   5849   3   470816   0 113528408  98 tuple
```

参考: [Pythonでメモリ消費量のプロファイルを取る - 西尾泰和のはてなダイアリー](http://d.hatena.ne.jp/nishiohirokazu/20121013/1350093216)

### 一時データを`del`で消す

```py
del temporary_data
```
こんな感じ

### The \_\_slots__ magic

自作クラスの \_\_slots__ に使うattributeを書く

```py
__slots__ = ('x', 'y', 'z')
```
こんな感じ

### tupleのlistをarrayに置き換える

```py
num = ([1, 2], [1, 1], [2, 1])
```
みたいのをやめて、こうする

```py
x = array('I', [1, 1, 2])
y = array('I', [2, 1, 1])

def num(idx):
    return (x[idx], y[idx])
```

### 減らす余地のあるtupleを削除

### Cython使ってみる

### cyclic garbage collectorを捨てる

### CythonコードもHeapyで調べる

## 結果

メモリ使用量が 244MB から 19.4MBになった！