OmniAICreator/Qiita-1.07M huggingface dataset:
Macにelixirをインストールする

***

## 環境やバージョン
Mac：10.11.6
erlang：19.1
elixir：1.3.3

## インストールのパターン
1.elixirをhomebrewでインストール
2.erlangをhomebrewでelixirをexenvでインストール
3.erlangをerlenvでelixirをexenvでインストール
※追記
試してませんが、asdfによるインストールやanyenvでのインストールも便利そうです。
-asdf
http://qiita.com/ymtszw/items/28cc7a000236510b71c2
-anyenv
http://qiita.com/nownabe/items/67a27ddd23652676ffee

### 1.elixirをhomebrewでインストール
単一バージョンならbrewでいい

```bash
brew update
brew install elixir
```

必要なerlangも一緒に入る

### 2.erlangをhomebrewでelixirをexenvでインストール
erlangをbrewでインストール

```bash
brew update
brew install erlang
```

一緒に入るopensslがbrewではなく、Mac標準のを見てしまうのでパスを通す。

```.bash_profile
// 上の方に
export PATH=/usr/local/opt/openssl/bin:$PATH
source ~/.bash_profile
```

exenvをbrewでインストール

```bash
brew install elixir-build
brew install exenv
```

.bash_profileに追加

```.bash_profile
echo 'export PATH="$HOME/.exenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(exenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

elixirのインストールできるバージョンの確認とインストール

```bash
exenv install -l
exenv install 1.3.3
exenv global 1.3.3
elixir -v
```

### 3.erlangをerlenvでelixirをexenvでインストール

opensslをbrewでインストール

```bash
brew update
brew install openssl
```

opensslは上記でインストールしてもMac標準のを見てしまうのでパスを通す。

```.bash_profile
// 上の方に
export PATH=/usr/local/opt/openssl/bin:$PATH
source ~/.bash_profile
```


erlenvをgitで取得

```bash
$ cd
$ git clone https://github.com/talentdeficit/erlenv.git .erlenv
```

.bash_profileに追加

```.bash_profile
echo 'export PATH="$HOME/.erlenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(erlenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

erlangインストール

erlenvはinstallコマンドがないようで、自分でビルドして配置しないといけない（erlangはbrewでもいいかな・・）

```bash
// ダウンロードと解凍
curl -O http://erlang.org/download/otp_src_19.1.tar.gz
tar zxf otp_src_19.1.tar.gz
cd otp_src_19.1

// ビルド
./configure --prefix=$HOME/.erlenv/releases/19.1 --enable-smp-support --enable-threads --enable-darwin-64bit --enable-kernel-poll --enable-hipe --without-javac --disable-native-libs --disable-sctp --with-ssl=/usr/local/opt/openssl
touch lib/wx/SKIP lib/odbc/SKIP
make
sudo make install
erlenv global 19.1
erlenv rehash

// 確認
erl
```

exenvをbrewでインストール

```bash
brew install elixir-build
brew install exenv
```

.bash_profileに追加

```.bash_profile
echo 'export PATH="$HOME/.exenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(exenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

elixirのインストールできるバージョンの確認とインストール

```bash
exenv install -l
exenv install 1.3.3
exenv global 1.3.3
elixir -v
```
Waylandとは？


X11に替わるものとして、いよいよGnomeやKDEの対応も完了し実用段階に入ったと言えるWaylandですが、「Wayland」という語が表すものが複数あるため混乱を招きやすいようです。
ここでは簡単に「Wayland」が持つ３つの意味を解説したいと思います。
（なおこの３つというのは公式が謳っているわけではなく筆者が観測した範囲で「Wayland」という語がどのように使われているかを独自にカテゴライズしたものであることをご了承ください）

## ライブラリとしてのWayland

Waylandのリポジトリは[ここ](http://anongit.freedesktop.org/git/wayland/wayland.git)に有りますが、ビルドしてもいくつかのツールと、ライブラリが出来上がるのみで、これだけでX11サーバの代わりをしてくれるようなものではありません。

では、この「ライブラリとしてのWayland」は何者かというと、一言で表すと「**プロトコル作成フレームワーク**」です。

ビルドしてできる`wayland-scanner`コマンドはXMLファイルに書かれたプロトコルの定義を読み取り、サーバー/クライアント双方のソースを生成します。ユーザーは生成されたソースとWaylandのライブラリを用いれば、エンディアンやアライメントに悩まされること無く通信するサーバー/クライアントアプリが作成できるというわけです。

なおWaylandリポジトリには`protocol/wayland.xml`というプロトコルが定義されておりこれは「Waylandプロトコル」と呼ばれています。

## プロトコルとしてのWayland

「Waylandプロトコル」といったとき前述の`wayland.xml`で定義された狭義の「Waylandプロトコル」と、Waylandにより生成されたプロトコル全体を指す広義の「Waylandプロトコル」を表す場合の２通りの場合があります。

`wayland.xml`で定義されたWaylandプロトコルは、Waylandコンポジタに対してクライアントアプリから、ウィンドウの作成や描画の要求。逆にWaylandコンポジタからクライアントアプリに対してマウス、キーボード、タッチなどのイベントの通知などが定義されています。

WaylandリポジトリにはWaylandプロトコル１種類しか定義されていませんが、例えばWaylandコンポジタのリファレンス実装であるwestonでは１０種類を超えるプロトコル(xdg-shellプロトコル、desktop-shellプロトコル等)が定義されています。

## アーキテクチャとしてのWayland

記事の冒頭でも書きましたが、Waylandはよく「X11を置き換えるもの」という説明がなされることが有ります。
その場合はこのアーキテクチャとしてのWaylandを指しています。

![waylandアーキテクチャ](https://wayland.freedesktop.org/wayland-architecture.png)

上図はWaylandのサイトにあるアーキテクチャ図です。②、③でWaylandプロトコルが使用されます。
この図のWaylandコンポジタが各アプリケーションの描画をコンポジションして実際の画面に描画する役割を果たします。

Waylandコンポジタには様々な実装があり、Waylandプロジェクトによるリファレンス実装が[weston](http://anongit.freedesktop.org/git/wayland/weston.git)です。

また最近はGnomeやKDEもWayland対応しており、それぞれ[Mutter](https://ja.wikipedia.org/wiki/Mutter), [KWin](https://en.wikipedia.org/wiki/KWin)がWaylandコンポジタの役割を果たしています。

## より学ぶために

実際に手を動かしてWaylandを学ぶための入門記事を書きました。参考にしてください。

[作って学ぶWayland](https://qiita.com/maueki/items/34323b2762e3c3342c51)
CGAffineTransformIdentity 変換　swift3.0

CGAffineTransformIdentity 変換　swift3.0
について



http://developer.wonderpla.net/entry/blog/engineer/CGAffineTrans
アフィン変換とは何ぞやという話【CGAffineTrans】
c言語っぽい
http://qiita.com/kitsuyui/items/c8d76acfa0ecd6570fdb
やり直した場合の話
http://qiita.com/teradonburi/items/389fadf28215944f1054
治し方の良さそうなやつ

--------------------
(結論)
= CGAffineTransformIdentity

= CGAffineTransform.identity

に変わったみたい
正規表現で最短マッチング


## 例えば

文字列からHTMLタグを除去したいような場合、

```
"<b>太文字</b>で書かれたタイトルです。<a href="...">リンク</a>はこちら"
```

ってのを、
```
"太文字で書かれたタイトルです。リンクはこちら"
```

で取得したいとします。

## パッと思いついた正規表現

そのため、

```
</?.+>
```

こういう正規表現でマッチングさせて、空文字でリプレースすればいいかと思いましたが、この正規表現だとマッチング結果が、

```
<b>太文字</b>で書かれたタイトルです。<a href="...">リンク</a>
```

のように、最後に出てくる終了タグまでヒットしてしまいます。これは困ります。

## 最短でマッチングさせる

正規表現のマッチングは、基本的に最長一致という「いくつかのマッチングがあれば、マッチングの文字数が長い方でマッチングする」というルールがあります。

例の場合はその逆で、最短でマッチングさせたいのですが、その場合は、

```java
</?(.*?)>
```

と指定します（Javaの場合）

あるいは、

```java
</?[^>]*>
```

のように、```>```を含まない文字列でマッチングさせると、必ず一番初めに修験する閉じ括弧でマッチングしますので、こちらでもいいです。
PHP5.6からHTTPS通信を行う（Mac, XAMPP）

# 背景

PHPからプログラムでAPIを扱う際に、ところどころ重要な情報を通信する必要があり、どう考えても平文でやり取りするのは危険なのでHTTPSを使うことにする。Google先生で調べながら、XAMPPでPHPのSSL設定を行ったが、エラーが出て苦戦した。エラーの修復も含めて、PHP5.6、XAMPPでHTTPS通信を行う方法を書く。

# 環境
PHP：5.6
OS :Mac OS X
WEBサーバー： Apache(XAMPP)

# PHP,HTTPSでGoogle検索すると・・・大抵以下の設定についてでてきます。

php.iniで以下の文を記述する

``` 
(▼以下の文を新規追加、もしくは頭のセミコロンをはずす)
extension=php_openssl.dll　
...
...
...
(▼新規追加、もしくは頭のセミコロンをはずす)
allow_url_fopen = On
```

上記の２行をアクティブにしてください。そうするとHTTPSが許可されるはずです。
具体的な行の意味等は以下を参考にしてください。
→　http://hhelibex.hatenablog.jp/entry/20111225/1324794331

# しかし、上記設定ではエラーが起こります。

実行したHTTPS通信のプログラムは以下の通りです。

```
require_once('./util/phpQuery-onefile.php');

$html = file_get_contents('https://www.google.co.jp');
$doc = phpQuery::newDocument($html);
echo $doc["title"]->text();
```

コードはスクレイピングをするためのもので、
[こちら](http://qiita.com/zaburo/items/465ca691aebad2b5691e)を参考にしています。

このコードを実行すると、
ERROR：certificate verify failed　
というSSL証明書のエラーが発生しました。

# SSL証明書を別途用意する必要がある

SSL証明書は、Macの私の環境では、
/xamppfiles/etc/ssl.crt/server.crt　に置いてありました。
このファイルが有効期限切れかどうか確かめたかったのですが、確かめ方がよく分からなかったので、断念。
新たに別のところから用意することに。

## SSL証明書の用意

```
curl httpｓ://curl.haxx.se/ca/cacert.pem
```

上記を実行すると、証明書の中身がターミナルに表示されるので、
それを新たなテキストファイルにコピペして、ca-bundle-curl.crtというファイル名にしました。

元の証明書があった/xamppfiles/etc/ssl.crt/にca-bundle-curl.crtを格納し、
php.iniに以下を追記します。

```
curl.cainfo = /Applications/XAMPP/xamppfiles/etc/ssl.crt/ca-bundle-curl.crt
openssl.cafile = /Applications/XAMPP/xamppfiles/etc/ssl.crt/ca-bundle-curl.crt
```

これで有効なSSL証明書が更新されました。
上述のプログラムを実行するとしっかりとGoogleのタイトルが表示されます。


証明書の取得で参考にしたページは
[ComposerからLaravelを導入しようとしてOpenSSL周りのエラーで困った件](http://qiita.com/dora_kou/items/c9c2f7d8d53303ee1aab)です。


今回の症状はPHP5.5以下だと起こらないようですね。
5.6以上の話になるようです。細かい要因等は割愛。

以上。
增量备份工具 borgbackup

一直在寻找一个备份软件，本来需求就是只要有 `增量`，`压缩`，`支持管道` 的功能就可以了，然后在 [Github](https://github.com/borgbackup/borg/releases) 上就找到了这么一个软件，名字叫做 borg。
borg 支持 Linux，MAC ，BSD系统。在使用上也很简单。[官方Wiki](https://borgbackup.readthedocs.io/en/stable/usage.html)上有着详细的例子。
下面简单说一下基本使用方法。
* 首先下载对应版本，然后放在 PATH的目录下。执行 
```
borg -V
``` 

应该能看到版本号，这里推荐 1.0.7 稳定版。
* 初始化一个备份库
```
$ borg init /path/to/repo
```

* 创建一个 /root 下所有文件的备份到刚才建立的备份库，并命名为root-backup-1
```
$ borg create -v --list --stats -p /path/to/repo::root-backup-1 /root/
```

* 在备份完成后会显示一个统计信息，示例如下所示
```
.------------------------------------------------------------------------------
Archive name: 20161006_1245
Archive fingerprint: f224644c864519a6f8a23193a9d1981a64a18e50677ff7c0a54d2c5329d2be3e
Time (start): Thu, 2016-10-06 12:45:14
Time (end):   Thu, 2016-10-06 12:45:36
Duration: 22.50 seconds
Number of files: 18406
.------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:              402.35 MB            270.81 MB             18.57 MB
All archives:                3.17 GB              1.69 GB            393.10 MB

                       Unique chunks         Total chunks
Chunk index:                   12578               247244
.------------------------------------------------------------------------------
```
* 因为备份过很多次所以在后续备份中去重操作会和之前的备份一起来计算，所以看到的去重大小就只有18.57M，是不是很方便？

还原操作如下(例如还原到 /opt/root-restore
```
cd /opt/root-restore
borg extract /path/to/repo::root-backup-1
```

上面命令会把备份的所有文件还原到 borg 执行的当前目录，也就是 `/opt/root-resotre` 。

* 另外在建立备份的时候，肯定会有排除某些文件夹的需求。详细的可以用 `borg create --exclude` 这个参数来指定排除项，具体语法可以参考 [官方的这篇文件](https://borgbackup.readthedocs.io/en/stable/usage.html#borg-help-patterns)
* 下面发一个本人写的 备份数据库和 备份 服务器上指定某些目录的一个脚本。（备份目的地可以是另外一台服务器，通过SSH协议来指定目录即可。需要在目标服务器也安装对应的borg软件。

- 1.备份数据库(通过管道)
```
#!/bin/bash
export BORG_PASSPHRASE=mima123
#backup ALL database
name=database_`date '+%Y%m%d'`
mysqldump -h 127.0.0.1 -uroot -pmima123 --all-databases | /usr/sbin/borg create -v \
-p -C lzma remote-borg-backup-host:borg-data::$name -
unset BORG_PASSPHRASE
```

以上脚本就是备份所有数据库文件到 `remote-borg-backup-host`的对应用户的 `borg-data` 文件夹，备份文件名是日期。borg 库的密码为 `borg123`

- 2.备份多个文件夹，带排除参数
```
#!/bin/sh
export BORG_PASSPHRASE=mima123
#backup full_vps_data
name=data_`date '+%Y%m%d'`
/usr/sbin/borg create -v --stats \
--filter=AME -p \
--exclude 'sh:/root/.cache' \
--exclude 'sh:/opt/install' \
--exclude 'sh:/www/vhost/rss/cache' \
-C lzma remote-borg-backup-host:borg-data::$name \
`cat /jobs/backup.list`
unset BORG_PASSPHRASE
```

以上脚本排除了3个文件夹。需要备份的文件夹或文件 写在了 另一个文件 `/jobs/backup.list` 上，一行一个。
Xcode8とSwift3にしたらAmbiguous use of 'init'というエラーが出た

#1. 概要

iOSアプリでBLEを使ってKonashiを動かしています。Swiftはほぼ初心者です。
先日Xcode8にアップデートしたところ、既存のプログラムもSwift3に自動修正してくれましたが、Ambiguous use of initというエラーが出てコンパイルできなかったので、対応をメモしておきます。
あまりネットに情報がなかったので、詳しい人にとっては当たり前のことかもしれません。

#2. 参考サイト

Swiftが分かっていないのでエラーを検索するしかなかったのですが、以下の2つが役に立ちました。
1つ目のサイトは自分と同じエラーが出ている日本語のページだったのですが、書いてあった解決策が理解できず、そこに書いてあったStack OverflowのURL(2つ目)をたどっていきました。

* [【iOS】Swift3+XCode8に変換した際に発生したエラーの対応 - Brew the Mash](http://mashmorgan.hatenablog.com/entry/2016/10/03/115612)
* [ios - Swift 3 and Xcode8 - Ambiguous use of init - Stack Overflow](https://stackoverflow.com/questions/39579121/swift-3-and-xcode8-ambiguous-use-of-init)

#3. 作業環境

* MacBook Air (13-inch, Mid 2012) & macOS Sierra 10.12
* Xcode8
* iPhone6 plus + iOS 10.0.2

#4. エラー箇所と変更内容

エラー箇所は以下の行で、エラー内容は「Ambiguous use of 'init'」でした。

``` swift:
let data: Data = Data(bytes: UnsafePointer<UInt8>(&value), count: 1)
```

参考サイト2には

``` swift:
var intVal = 1000
let data = Data(buffer: UnsafeBufferPointer(start: &intVal, count: 1))
print(data as NSData) // <e8030000 00000000>
```

のような解決策が書いてあったので、これに沿ってエラー箇所を以下のように書き換えました。

``` swift:
//    let data: Data = Data(bytes: UnsafePointer<UInt8>(&value), count: 1)
    let data = Data(buffer: UnsafeBufferPointer(start: &value, count: 1))
```

これでエラーはなくなって無事コンパイルできました。
Amazon WorkSpaces で IPアドレスを固定する

Amazon WorkSpaces を仕事で使いたいのですが
業務で使うシステムって、なにかとIPアドレス制限かかってますよね？かかってますよね？はい。

WorkSpaces は構築するとデフォルトで "自動でパブリックIPアドレス振る" 設定になっているようですが、
それだとIPアドレスが予測できないので制限にひっかかってしまいます。

## WorkSpaces でも Elastic IP が使える

EIP を WorkSpace に結びつけてIPアドレスを固定することができます。
例えば [Simple AD ディレクトリの場合...](https://docs.aws.amazon.com/ja_jp/workspaces/latest/adminguide/cloud_eip.html)

しかし、これだと、その業務システムに WorkSpaces 使う人数分のIPアドレスを個々に登録しなければならないですね。。
自分一人ならいいけど。
業務システムってのはたいてい大勢が使うものですよね。。

[AWS が使うIPアドレスの範囲は公開されてる](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html)わけですが、それを全部許可する訳にもいかず。

## NAT を使おう

ということで、WorkSpaces が動く VPC の中に NAT 用意して、そいつだけ EIP で固定しましょう。
そうすれば、業務システムに追加登録するIPアドレスは1つで済みます。（業務システム側からIPアドレスをもとにクライアントを判別する必要がない場合はね。）
しかも最近はNATゲートウェイが使えるようになったのでNATインスタンス作らなくてよいですし。昔は「えーNAT用意するのめんどくさいなー」ってなってたけど。

例えば [Simple AD ディレクトリの場合このような手順です](https://docs.aws.amazon.com/ja_jp/workspaces/latest/adminguide/cloud_nat.html)。
WorkSpaces 構築時に自動で作成されるサブネットは、インターネットゲートウェイをデフォルトゲートウェイにしたルーティングテーブルになってると思うので、それをNATゲートウェイに変更します（そういうルーティングテーブルを新規作成し結びつけ替えます）。

>パブリックサブネットで NAT インスタンスを作成することもできます。ただし、NAT インスタンスが 1 つの場合、単一障害点が発生します。NAT ゲートウェイを使用することをお勧めします。

この辺が managed の良さですね :)
CloudFrontの設定を一括でアップデートするJavaScriptを書いてみた

##概要
+ AWS SDK使ったらCDNの設定も一発でまとめて更新できるよ。
+ JS使ったコード書いたよ
+ 使いたい人は自己責任でどうぞ


##コード

```index.js
var AWS = require('aws-sdk');
var conf = require('./config.js');

var cloudfront = new AWS.CloudFront({
	apiVersion: '2016-09-07',
	accessKeyId: AWS_ACCESS_KEY,
	secretAccessKey: AWS_SECRET_KEY,
});

function updateCloudFrontDistribution( distribution ) {
	var params = {
	  Id: distribution.Id
	};
	cloudfront.getDistributionConfig(params).promise()
	.then( function(data){
		// Write CloudFront Distribution Setting
		data.DistributionConfig.HttpVersion = 'http2';

		// Do update distribution setting
		doUpdateCloudFront( data,  distribution );
	}).catch( function(err) {
		console.log(err);
	});
}

function updateCloudFrontDistributions( Marker ) {
	if ( Marker === undefined ) {
		console.log('end');
		return;
	}
	console.log('start to ' + Marker);
	var params = {
	  Marker: Marker,
	  MaxItems: '3'
	};
	cloudfront.listDistributions(params).promise()
	.then( function(data) {
		i = 0;
		while(i < data.DistributionList.Items.length) {
			Marker = data.DistributionList.Items[i].Id;
			updateCloudFrontDistribution( data.DistributionList.Items[i] );
			i=(i+1)|0;
		}
		console.log(i);
		if ( i !== 0 ){
			return Marker;
		}
	}).then( function(Marker){
		setTimeout(function(){
			console.log('Next start is ' + Marker);
			updateCloudFrontDistributions( Marker );
		}, 10000);
	}).catch( function(err) {
		console.log(err);
	});
}


function doUpdateCloudFront( data,  distribution ) {
	var params = {
		Id: distribution.Id,
		IfMatch: data.ETag,
		DistributionConfig: data.DistributionConfig
	};

	cloudfront.updateDistribution(params).promise()
	.then( function(data){
		console.log(data);
	}).catch( function(err) {
		console.log(err);
	});
}

updateCloudFrontDistributions( '' );
```

##使い方
まず`AWS_ACCESS_KEY`と`AWS_SECRET_KEY`を自分のアカウントのものに差し替えてください。
その後、`updateCloudFrontDistribution`というfunctionの中にある、`Write CloudFront Distribution Setting`というコメントの部分でCloudFrontの設定を上書きします。（サンプルコードではHTTP2サポートに変更しています。）
そこまで準備が終われば`node index.js`などでJSを実行してもらえればOKです。
３件ずつせっせと設定を更新してくれますので、更新が終わるまで待ちましょう。

##なぜ作った
自社サービスの関係で100も200もCloudFrontの設定を更新しないといけないケースが出てきたので、まとめてやれるコード書かないとつらい。
ホームページ作って！と依頼するその前に考えた方が良いこと

最近、知り合いに<b>ホームページ作って!!</b>と、漠然と言われることが多い。

知り合いに依頼しようとする方の思ってることはたいてい同じで
<b>・製作会社に頼むと高いから個人で頼みたい
・中間搾取しているお金なくなると安くなるんでしょ？
・知り合いだから気楽に思ってることを素直に言える
</b>などなど。

確かに個人に頼むと安くなる場合は多いですが、
それでも<b>「制作とは別にお金がかかる」</b>という事を理解していない人が多い。

今日は、知り合いでも、製作会社でも、「ホームページ作って」と漠然と言う前に考えた方がいいこと・理解しておいて頂きたいことについて書きます。

### ランニングコストがかかるということ

そもそも、ホームページなどのWebサイトには
<b>
・サーバー費用
・ドメイン費用
</b>
など、最低限2つの維持費がかかります。

これは、製作者の財布に入るお金ではなく、「サーバー運用会社」・「ドメイン管理会社」に入るお金です。

どんな「ホームページ」を作るかにもよりますが、
しょぼい「ちゃんとした」ホームページを作るためには、<b>年間1万円前後のお金がかかることを覚えておいてください。</b>

もし、血迷って<b>サーバーも自分で管理すれば安くなるんじゃない？</b>って思った方がいたら、それはたいてい大間違いです。
なぜなら、「サーバー ≒ パソコン」で、パソコンを起動しっぱなしにする費用は意外と月々2-3000円くらい行くので、サーバーの専門業者と契約した方が格段に安いです。

### どれだけの頻度で更新する予定か・誰が更新するのか
「ホームページ作って」という人は、たいてい「ホームページ」が欲しいのではなく、
ブログを書いたり、情報更新したり、中にはECサイトを作りたいと思ってこの魔法の言葉を発している人が多いです。

<b>「ホームページ」で更新を必要としない場合</b>、<b>作り方は簡単</b>で情報も更新しないのであれば「データ」という概念もほぼなく、<b>ランニングコストも安い</b>です。

しかし、<b>データ更新を必要とする場合</b>は、そのデータをどう管理するか、データ間にどういう関連性をもたせるかなど、考えるべきことは多々あるので<b>作り方が難しくなり</b>、ちょっと高性能なサーバーが必要となり、<b>ランニングコストもちょっと高くなります</b>。

また、誰がどれくらい更新するかということも非常に大事です。
「更新が半年に一度、1分くらいで終わる」というなら、おそらく制作してくれたその知り合いに頼めば快く引き受けてくれるでしょう。
この場合は、製作者は使いやすい更新画面を作る必要もなく、自分のやりたいようにできて<b>楽</b>です。

しかし、<b>毎日ブログ書きたい</b>とかというと、とても手伝いなどできず、「自分でやれ！!」という話になります。
この場合は、シロートでも使いやすい（かどうかはわからない）管理画面を作る必要がでてきます。

### どれだけの人がアクセスする想定なのか
そして、次に考えなくては行けないのが、どれだけの人がそのサイトを見る想定なのかということです。
前提として、多くの人が見ればその分、表示するために処理する頻度が上がり、高性能なサーバーが必要となり、その分お金が必要です。
お金が有り余ってしょうがないというなら、とりあえずお金をかけて良いサーバーを使えばいいでしょうが、
大抵はあまりお金をかけたくないので、最低限で済ませられるようにアクセス数を想定しましょう。

自分の作ろうとしてる、ホームページと同じようなホームページを開発者の友人に渡してあげてください。
おそらく、ちゃんとした人なら推定アクセス数とそれに対するサーバー構成を考えられるはずです。

大事な事を言いますが、平常時において
<b>サーバー費用かかりすぎるのも、アクセス急増してないのにサーバー落ちるのもイケてない</b>です。

### 「ホームページ」作るのにどれだけお金がかかるのか
ここまで考えて、ようやくどんな「ホームページ」を作ろうかという話ができます。

ここでは、デザイン絡みの「お値段」についてざっくりと見積もりをしますが、単純に
<b>ごちゃごちゃ動くサイトは制作に時間がかかるし、なにも動かないページは制作が早い</b>です。

ごちゃごちゃ動く例：https://uzuz.jp/
なにも動かない例：https://yamadagenki.github.io/xushengbo/

単純に、制作時間に応じてお金が高くなります。
制作会社などに頼むと、純粋に1人日（製作者が一日かかる作業をやらせた場合）5万円くらいと言われています。（もっと高いところはいくらでもある）
個人でも、1人日3万円前後は見積もりましょう。

パーソナルトレーニングなど行く人はわかると思いますが、
<b>プロに仕事を頼むということは、1時間あたり5000円以上はかかります。</b>
8時間働かせたら、4万円かかります。
「ホームページ作りなんて簡単でしょ？個人に頼むんだから安くやってよ。」といった感覚で、1000円や2000円で作れると思わないでください。
それで引き受けてくれる人がいたとしても、<b>イケてない「ホームページ」を作られてあとで泣きを見る日が来る</b>か、「完全に友人価格」でやってもらってるので感謝しましょう。

### まとめ
今回は
「ホームページを作って！」と依頼する前に考えた方がいいことについてまとめました。
具体的には
<b>
・ランニングコストコストがかること把握する（無料でも出来るが、どこまでこだわるか次第）
・更新頻度を考える（更新頻度によって制作方法が変わる）
・アクセス数を見積もる（落ちるサイトはイケてない）
・ホームページを作るにはそこそこお金がかかる（プロを1人動かすために1日4万円くらいかかる）
</b>
ということです。

本音としては、いつも「ホームページ作って」と漠然と言われて、言いにくい、何度も説明していることを書き綴っただけなので、同じような思いをしている制作者の方に、この記事を使って間接的にやんわり依頼者の人に伝えるために使っていただけたらなと思っております。

よろしくお願いします！
日本語の入ったURLをそのままコピーしたいとき

![URL日本語エンコード.gif](https://qiita-image-store.s3.amazonaws.com/0/142397/eeaa677b-5617-4b22-da93-6b08e0bdb391.gif)

URLをコピーすることって結構ありますよね。
そのURLに日本語が入っていると、エンコードされてしまってペーストした時に変な文字列になり、不満を持った人も多いと思います。

そこでブラウザで表示されている、そのままのURLをペーストする方法を紹介します。

# URLの `http://~` の部分で `h` を外してコピーする
![日本語URLコピー.gif](https://qiita-image-store.s3.amazonaws.com/0/142397/b1814f05-238d-4dd1-503d-b79f5b6876b6.gif)

これだけです！
その後に `h` を追加すれば完成です。

合わせて、最速でコピー＆ペーストする方法も紹介します（今回はMacの場合）。

1. `⌘ ＋ L`（コマンド＋エル）で、URL欄にフォーカス
2. `⌘ ＋ Shift ＋ ↑`（コマンド＋Shift＋上矢印）で、選択の始まりを逆転させる
3. `Shift ＋ →`（Shift＋右矢印）で、`h` を外して選択
4. `⌘ ＋ C`（コマンド＋シー）で、コピー
5. `⌘ ＋ V`（コマンド＋ヴィ）で、ペースト
6. `h` を追加

できました！ :tada:
[iOS] ステッカー名を変更する（ローカライズ対応）

# **「言語によってステッカー名を切り替えたい」人向け**
☆「sample」というプロジェクト名を前提とします。

- 「InfoPlist.string」という名称のString Fileを追加する。Targetsの**StickerPackExtensionにチェックを入れる**こと。

<img width="1057" alt="スクリーンショット 2016-10-06 12.58.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/123907/88a89f21-db0f-a30c-1230-4a9a6f4d19e2.png">

- InfoPlist.stringを選択し、Utilities > File inspector > Localization　の**Localize...**を押下する。

<img width="269" alt="スクリーンショット 2016-10-06 13.05.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/123907/b937ff1f-334a-1164-bf3f-0ac7a3d3a7fa.png">
* * *
<img width="256" alt="スクリーンショット 2016-10-06 13.05.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/123907/b6e855ab-163f-067e-34f8-3033922e5462.png">

- sample > sample > Locallizationsにローカライズしたい言語を追加する。

<img width="1134" alt="スクリーンショット 2016-10-06 13.09.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/123907/f1a08c23-0235-474f-ed8f-dc93fc337528.png">
* * *
<img width="1066" alt="スクリーンショット 2016-10-06 13.10.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/123907/1fabcaf8-c5c4-06f1-45dd-12ffb58ebcc2.png">

- それぞれのInfoPlist.stringに以下を追加する。

`CFBundleDisplayName = "この言語で表示したいステッカー名"`

<img width="561" alt="スクリーンショット 2016-10-06 13.18.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/123907/12965ab8-c653-1a62-7c6d-73340692597e.png">
* * *
<img width="538" alt="スクリーンショット 2016-10-06 13.18.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/123907/4d048ae1-9967-7818-aebe-760ad5569c17.png">

- sample > StickerPackExtension > Info に**Application has loclized display name**を追加し、Valueを**YES**にする。

<img width="1058" alt="スクリーンショット 2016-10-06 13.27.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/123907/113d2789-17e8-c657-dd27-83a46f3bd9fb.png">

- 実行結果（English）
<img width="414" alt="Simulator Screen Shot 2016.10.06 13.30.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/123907/70cba50f-ed9b-a8af-fec1-76ba9faa7334.png">

- 実行結果（日本語）
<img width="414" alt="Simulator Screen Shot 2016.10.06 13.33.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/123907/b9d871cf-a3ca-0999-ab81-4c396c81c56f.png">
Digits Build on Ubuntu 14.04


GPUを使う為、CUDA、cuDNNなどが必要です。

## CUDA 

* [CUDA deb Package](https://developer.nvidia.com/cuda-downloads) ダウンロード
* CUDAインストール

```bash
sudo dpkg -i cuda-repo-ubuntu1404-8-0-local_8.0.44-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda
```
**CUDAにはNVIDIAグラフィックボードのドライバーが含まれている為、先にドライバーをインストール必要が無いのだ。**

## cuDNN

* [cuDNN Library](https://developer.nvidia.com/rdp/cudnn-download)ダウンロード（.tgzファイル）
* cuDNNインストール

```bash
tar zxvf cudnn-8.0-linux-x64-v5.1.tgz
cp cuda/include/cudnn.h /usr/local/cuda-8.0/include
cp cuda/lib64/libcudnn.so /usr/local/cuda-8.0/lib64
# path 追加
vim ~/.bashrc
# export LIBRARY_PATH=/usr/lo cal/cuda-8.0/lib64:$LIBRARY_PATH
source ~/.bashrc
```

## NVCaffe

基本的に[こちら](https://github.com/NVIDIA/DIGITS/blob/master/docs/BuildCaffe.md)通りやります。

```bash
sudo apt-get install --no-install-recommends build-essential cmake git gfortran libatlas-base-dev libboost-all-dev libgflags-dev libgoogle-glog-dev libhdf5-serial-dev libleveldb-dev liblmdb-dev libopencv-dev libprotobuf-dev libsnappy-dev protobuf-compiler python-all-dev python-dev python-h5py python-matplotlib python-numpy python-opencv python-pil python-pip python-protobuf python-scipy python-skimage python-sklearn
#path 追加
vim ~/.bashrc
# export CAFFE_ROOT=~/caffe
source ~/.bashrc
#build
git clone https://github.com/NVIDIA/caffe.git $CAFFE_ROOT
sudo pip install -r $CAFFE_ROOT/python/requirements.txt
cd $CAFFE_ROOT
mkdir build
cd build
cmake ..
make --jobs=4
```

## DIGITS
基本的に[こちら](https://github.com/NVIDIA/DIGITS/blob/master/docs/BuildDigits.md)通りやります。

```bash
sudo apt-get install --no-install-recommends git graphviz python-dev python-flask python-flaskext.wtf python-gevent python-h5py python-numpy python-pil python-pip python-protobuf python-scipy
#path 追加
vim ~/.bashrc
# export DIGITS_ROOT=~/digits
source ~/.bashrc
#build
git clone https://github.com/NVIDIA/DIGITS.git $DIGITS_ROOT
sudo pip install -r $DIGITS_ROOT/requirements.txt
# Starts a server at http://localhost:5000/.
cd $DIGITS_ROOT
./digits-devserver
```

## Tutorial
[こちら](https://github.com/NVIDIA/DIGITS/blob/master/docs/GettingStarted.md)を従って、うまく行けばセットアップ成功とのこと。
【Linux初級者向け】僕が本番作業で心がけていることを晒してみる

[前回](http://qiita.com/chooyan_eng/items/b154d57a8da8911db612)に引き続き、Linuxでの作業について書いてみます。
今回は```war```のデプロイなど、サービスに変化を与える本番作業の時に心がけていることです。

僕の職場は「本番環境にアクセスするには専用の端末で、申請が必要！」みたいなガチガチな環境ではなく、自分のPCからいつでも好きなときにログインできちゃうようなユルーい環境なのですが、それでもサービスに変化を与える本番作業はとても慎重に行います。むしろ、規制がない分自分の注意や工夫に依存してしまうため、余計にいろいろと気を遣います。何年たっても、毎回ドキドキしながら作業しています。

そんな状況で、僕が作業中に注意していることを書いてみます。

# 極力タイプしない

前回も「Linuxはなるべく自分でタイプしない方が良い」と書きましたが、本番作業ではさらにそれを厳しく守っています。

特に本番作業は定型的なものが多いため、毎回自分でタイプするのではなく、どこかに手順書を作っておいてそれを上からコピペするだけ、というようにしています。

可能であれば、コピペしなくても良いようにシェルにまとめたり、Jenkins等でコンソールを開かなくても作業完了できるような状態を作っておきます。

とにかく「人はミスをするので何もしない」を意識しています。

# 指差し確認する

Enterキーをタイプする前に、必ず指差し確認をしながら間違いがないことを確認します。一見大げさに見えるかもしれませんが、実際にこれをやっていたら予想外のミスをしていたことに気づいてヒヤリとすることが少なからずあったりします。

また、指差し確認しながら、独り言のようにコマンドをブツブツ呟きながら作業します。
※ 実際にブツブツ言うか頭の中で唱えるだけにするかどうかは職場環境と自分のキャラに相談してください

# 実行しようとしているコマンドが「参照」か「更新」かを意識する

コマンドにしろSQLにしろ、実行しようとしている内容が「参照」なのか「更新」なのかによって注意度は変わってきます。
例えば、 ```ls```コマンドを実行するくらいであれば多少ミスったとしても何も表示されないか、エラーが表示されて終わるだけで、ファイルの内容などには何の影響も与えませんので、多少確認も緩くなります。

逆に、```mv``` や ```rm``` は「更新」ですので、間違えると今動いているシステム自体に影響を与えてしまう可能性があります。そのため上記の指差し確認もしっかりと行い、確かに実行してしまって問題のないものなのかをEnterキーの直前にもう一度自問自答しています。

# 切り戻し手順を確認する

残念ながら、作業した結果本番環境でエラーが発生する、といった状況は常に起こり得ます。また、エラーが発生するとまず間違いなく作業者はテンパって正常な思考が困難になります。

そんなときに備え、「とりあえず作業前の状態に戻す」ためのコマンドを事前に確認しておきます。

定型的な作業であれば、切り戻し手順まで書いて初めて手順書と呼べる、と昔上司が口を酸っぱくして言っていましたが、まさにその通りだと思います。

# 作業中は社長が話しかけてきても無視する

これは僕が始めて本番作業をするときに、OJTの先輩に言われた言葉です。
ユーザーに関わる作業をしていて、手を止めること自体が障害を引き起こす可能性のある本番作業中は何があっても作業を優先しなさい、という意図です。

実際に本番作業中に社長に話しかけられたことはありませんが、上司や先輩に話しかけられた場合は「ちょっと今本番作業中なので後でお願いします」ときっぱり断るようにしています。

逆に誰かに話しかける際は、その人が本番作業中でないかどうかを意識してチェックするようにしています。

---

Linuxは工夫次第でとても強力なことができてしまう分、ミスったときの影響も強力です。
そのため、本番作業をする際はかなり慎重に、普段の操作とは違った考え方で操作する必要があります。

自分のコマンドがどんな結果を引き起こすのかを常に考えることで、本番作業だけでなく普段のLinuxの扱いも向上し、素早く正確な操作ができるようになると思います。
`git svn` で困ったら

## はじめに
リポジトリをSVN→Gitをする`git svn`の方法は巷に溢れているので、スムーズに移行できると思いきや案外詰まったので、回避策をメモしておきます。
同じような現象に出くわしたら、「もういい、SVNで続けるぞ!」と言われる前に参考にしてみてください。
あなたがその現場にGitを普及させるのです…!

## 何も起きなければ
http://qiita.com/hidekuro/items/4727715fbda8f10b6b11
の通りに進めれば大丈夫だと思います。

## 残念、`Unable to open repository` ちゃんでした
```bash:エラー例
Can't create session: Unable to connect to a repository at URL '<repository>': Unable to open repository: '<repository>'
```
`file://`でリポジトリパスを指定していると起こることがあるようです。
http://d.hatena.ne.jp/naga_sawa/20101114/1289709803
に従って、`svnserve`でサーバを立てて再度トライしてみましょう。

## 残念、`unable to map` ちゃんでした
```bash:エラー例
4 [main] perl 14600 child_info_fork::abort: unable ot map C:\Program Files\Git\usr\bin\msys-svn_subr-1.0.dll, Win32 error 1114
```

なんとGit for Windowsの64bit版を使っていると遭遇するようです。
http://stackoverflow.com/questions/36191822/git-svn-clone-failed
昔のバージョンの話みたいに見えますが、今(`2.9.2.windows.1`)でも起きました。
Windowsマシンを捨ててもいいですが、StackOverFlowの言う通り32bit版で `git svn init -s`から再チャレンジするのが平和な解決策かと思います。
とはいえ、このためだけに64bit版をアンインストールしたくはないと思うので、[Git for Windows](https://github.com/git-for-windows/git/releases/)から32bit版のtar(`Git-x.x.x-32-bit.tar.bz2`)をDLして解凍して使うのがよろしいかと。
解凍はGitBash(64bit)を開いて下記コマンドでどうぞ。
`tar xjf Git-x.x.x-32-bit.tar.bz2`
DashBoard Tool

DashBoard Tool
------

# Service

***SimpleKPI***
https://www.simplekpi.com/

***Power BI***
https://powerbi.microsoft.com

***New Relic Insights***
[newrelic.com](https://newrelic.com/?utm_campaign=awr+brand-new_relic+FY17&utm_medium=PS&utm_source=GAPAC&utm_content=NewRelicInsights&utm_source=GOOG&utm_medium=paid_search&utm_content=New+Relic+Brand&utm_campaign=APM&utm_term=%2Bnew%20%2Brelic%20%2Binsights&mpc=PS-GOOG-APM-EN-Signup-New+Relic+Brand-APAC&_bt=108226186037&_bm=b)

***Baremetrics***
https://baremetrics.com/

***ChartMogul***
https://chartmogul.com/

***visible***
http://www.visible.vc/

# Open Souce

***Re:Dash***
http://redash.io/

***Kibana4***
https://www.elastic.co/downloads/kibana

***Grafana***
http://grafana.org/
[iOS] ステッカー名を変更する

# **「ステッカー名を１種類だけ使いたい」、「とりあえずステッカー名を変更したい」人向け**
作業は設定を1か所変更するだけです。
☆「sample」というプロジェクト名を前提とします。

- sample > StickerPackExtension > Info > **Bundle display name**
のValueを変更する。

* * *
<img width="1020" alt="スクリーンショット 2016-10-06 12.33.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/123907/80861686-abc8-720d-fa92-8057648c47e9.png">
* * *
<img width="651" alt="スクリーンショット 2016-10-06 12.37.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/123907/7d11c044-4a44-5ec2-09f9-c3fb92bc43e6.png">
* * *
<img width="414" alt="Simulator Screen Shot 2016.10.06 12.41.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/123907/78b0900c-ccf4-4d20-2058-611c60f8043b.png">
* * *
これだけです。(^o^)
PremereでVR用ビデオ編集時にプレビューがカクカクするときの対策

Adobe PremiereでVR用ビデオ(Equi-rectangular形式のビデオ)使用時に、プレビューがやたらとカクカクして編集が困難になることがあります。
そんなときには、次の2点を確認してみて下さい。

## 1. プロキシ編集を行う
プロキシ編集とは、編集時のみ再生負荷の低いファイルに置き換えて編集する編集方法です。
プロキシ編集の方法はこちらが参考になります。
[Adobe Premiere Pro ヘルプ / プロキシワークフロー](https://helpx.adobe.com/jp/premiere-pro/using/proxy-workflow.html)
[[DigitalGang!]Shoot.19 Adobe製品を使った4Kワークフロー](http://www.pronews.jp/column/yosihiro-enatu/1402111100.html)

## 2. ビデオデバイス設定でGoPro VR Playerの使用をやめる
[GoPro VR Player](http://www.kolor.com/gopro-vr-player/download/)がインストールされていると、ビデオデバイスでGoPro VR Playerが選択されている場合があります。
私の環境(MacBook Pro (Retina, 13-inch, Early 2013))では、このGoPro VR Playerが選択されていると、プロキシを使用しているにもかかわらず、再生がカクカクしてしまう問題が発生してしました。
そこで次のスクリーンショットのように、「環境設定」→「再生...]の「ビデオデバイス」のリストから「GoPro VR Player」のチェックを外してみたところ、滑らかに再生されるようになりました。
<img width="804" alt="env.png" src="https://qiita-image-store.s3.amazonaws.com/0/39561/dc686ccb-e0be-e80d-4981-a62ae0029881.png">
Quantum Chemistry - Harmonic Oscillator Energy Levels

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

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Harmonic Oscillator Energy Levels
https://www.youtube.com/watch?v=GPM9NYCY0f0&index=46&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh

- H.O.
  - Harmonic Oscillator
- Quantum Harmonic Oscillator model systemでのEnergy Levelを見る
- 緑の式
    - Schrodinger Equation
    - 関連 http://qiita.com/7of9/items/e1d711685ac92f729fc9
    - ハミルトンオペレータH
    - [このビデオ](https://www.youtube.com/watch?v=XjIBIc-Ldok&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=28)の右上のT.I.S.Eの式
        - T.I.S.E: Time Independent Schrodinger Equation
- 紫の式
  - ハミルトンオペレータHの定義
  - [このビデオ](https://www.youtube.com/watch?v=CSCSGFbt_Y0&index=12&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh)の右側黄色の式の左辺
- ピンクの式
  - Potential energy function V(x)
  - kはspring constant
  - x : displacement away from equilibrium bond length
        - 平衡となるbond lengthからの変位
- 黄色の式
  - reduced mass
  - http://qiita.com/7of9/items/00e564fcbb13268b4fa7
- 水色の式
  - 緑の式に紫の式、ピンクの式を代入して整理した
  - mは黄色の式から$\mu$になっている
- 緑の式
  - Energyはn表記のように量子化された値
  - $\nu$: 周波数
      - [このビデオ](https://www.youtube.com/watch?v=1Pd9iyD26i8&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=41)の左側、オレンジの式の中段にて定義されている
      - H.O. (Harmonic Oscillator)モデルの式から$\nu$が得られる
- 紫の式
    - 緑の式の別の書き方
    - ヘイチバー = h / 2piより
- 右上の図の左側
  - energy levelについての検討
  - 左下紫の式において$\omega$に注目
     - $\omega$=sqrt(k/$\mu$)
     - spring constant kが大きくなるとEnも大きくなり
     - 各energy levelが離れた状態になる
     - また、kが増えることで、放物線が閉じた状態になる
     - .
     - 一方で、reduced mass $\mu$が増えると
     - $\omega$が小さくなりenegy levelが近くなる
     - 放物線は開いた状態になる
  - 他の注目点として
     - energy levelは等間隔
          - equally spaced
     - 図の中の右側の水色がenergy Enの値
- 右上の図の右側
  - 今回扱っているのはHarmonic Oscillatorモデル
  - それはr0近辺では2次のテイラー級数展開式で近似できる
  - その近似はEnが増えると近似精度が落ちる
  - そのあたりは今後のビデオで見ることになる
  - .
  - De: dissociation energy
      - r0の時のenergy
- 最後の注目点として
  - 左下緑の式にてn=0としてもEnは0にはならない
  - n=0の時というのはr0の状態ではない
  - 右上図の左側の一番下にある黄色の線と、図の右側r0近辺の黄色横線がE0
     - E0はr0とは一致していない 
  - Ground State Energy E0
     - n=0の時のenergyでそれは0でない
     - この時、Z.P.V.E. (Zero Point vibrational Energy)を生じている
Rails Console から、ヒュッと number_to_human_size で容量とかを確認する

# はじめに

- ちょっとサーバに返却されてる値を `GB` や `TB` とかみたいにお手軽に確認したい。
- `9.gigabytes` などの `9GB` を `900000` みたいな何かにするには楽です。

# NumberToHuman とかでググると

- 「number_to_human_size ruby」と検索すると、結構ActionView のHelper のAPI の記事がよく出てきます。
- ですが、consoleで以下のようにやると、

```rb
> ActionView::Helpers::NumberHelper.number_to_human_size 10
NoMethodError: undefined method `number_to_human_size' for ActionView::Helpers::NumberHelper:Module
from (pry):5:in `<main>'
```
   
- `number_to_human_size`はmoduleの`NumberHelper`に定義されてるので呼べません。
- しかしながら[ソース](https://github.com/rails/rails/blob/master/actionview/lib/action_view/helpers/number_helper.rb#L383-L390)を追ってみると、結局ActiveSupport のメソッドにdelegate してることが分かります。

# しかし

- `helper` という `ActionView::Base` のインスタンスを rails console から取得可能です。
- コメント欄にて、@suginoy さんご指摘いただきました、ありがとうございます！

```ruby:rails_console
> sample = 10.gigabytes
> helper.number_to_human_size sample
=> 10 ギガバイト
```
   
##結論

- rails console からでも AtionView のインスタンスの取得が可能です！積極的に使いましょう！

~~- ActiveSupport にそれっぽい関数があるので、それを呼べばOK です。~~

```rb
pry(main)> ActiveSupport::NumberHelper.number_to_human_size 1024 ** 3
=> "1 GB"
```
GitHubで特定のリビジョン間の差分を確認する方法

# 背景
GitHub上でプルリクのレビューをしていると、よくこういう流れになると思います。

1. [DeveloperA] コミットA and Push
2. [DeveloperA] プルリク作成&DeveloperBにレビュー依頼
2. [DeveloperB] プルリク上で修正依頼をフィードバック
3. [DeveloperA] 修正コミットB
4. [DeveloperA] 修正コミットC
5. [DeveloperA] 修正コミットD
6. [DeveloperA] DeveloperB再レビュー依頼
7. [DeveloperB] 差分を確認

この差分を確認する時に、プルリクのすべての差分ではなく、コミットAとコミットDの差分を確認したい時って無いですか？
軽量のプルリクなら問題ないですが、大規模なプルリクだと結構辛くなりますorz
そんな時にこの方法が役に立つかと思います。

# GitHubで特定のリビジョン間の差分を確認する
以下の形式でアクセスする。

```
https://github.com/:username/:repository_name/compare/:ベースのリビジョンのhash...:比較対象のリビジョンのhash
```

これで確認できます。
ブランチも指定できるので、以下も可能です。

```
https://github.com/:username/:repository_name/compare/:ベースのブランチ名...:比較対象のブランチ名
```

で、プルリク上で修正依頼後の差分だと以下の感じにできます。

```
https://github.com/:username/:repository_name/compare/:ベースのリビジョンのhash...:作業ブランチ名
```

以上！
快適なUXを実現するOptimistic Updates(楽観的更新)とは何か

先日、とあるJavaScript関連の記事を読んでいたところ、"Optimistic Updates" という技術が紹介されていました。
日本語に直すと "楽観的更新" といったところでしょうか。
はじめて聞いた言葉で、日本語の記事も見当たらなかったため記事にしてみます。

#Optimistic Updatesとは
Optimistic Updatesというのは、ネイティブアプリやSPA(Single Page Application)などで使われる技術で、非同期の通信処理が成功するという前提(楽観)のもとに、通信のレスポンスを待たずに次の処理を行うというものです。
最も多いOptimistic Updatesの使い方は、UIへの反映をリクエストの結果を待たずに行うというものでしょう。

#Optimistic Updatesの例
例えば、よくある「いいね」ボタンのようなものにOptimistic Updatesを適用するとしましょう。
この場合、「いいね」を押すと同時にサーバーへ「いいね」を追加するリクエストが送信されますが、その結果を待たずに即座に「いいね」をした場合のUIの更新がかかります。ユーザーはネットワークの状態が悪い場所にいたとしても、即座にUI上のレスポンスが発生し次の動作に移れるため、快適にアプリケーションを使うことができます。

Twitterで友人が教えてくれたのですが、Twitterのスマホアプリの「いいね」がまさにこういった動きをします。

#Optimistic Updatesの優れているところ
Optimistic Updatesはユーザーの行動をロックしません。操作をロックしないだけでなく、成功を示すインタラクションが即座に発生することで、心理的にも行動がロックされないところがOptimistic Updatesの優れているところではないでしょうか。
ユーザーはタップなどのアクションをすると、期待する反応がアプリケーションから返ってくるのを待ってしまいます。
即座に反応を返すことで、操作できる状態であったとしても反応を待ってしまうという心理的なロック状態を発生させないようにできます。

#通信制御の必要性

ネットワークが不安定なモバイルの環境では、通信が失敗したり、そもそも不可能なことはよくあることです。
Optimistic Updatesを適用すると、クライアント上の見え方と実際が異なるということが多発してしまいます。
これを解消するために、リクエストの送信タイミングや再送を制御する仕組みが必要になります。
正確な再送制御はなかなか厄介な問題ですが、実現できればよりアプリケーションを快適に保てます。
Twitterクライアントでもネットワークが不通の状態で「いいね」をすると、ネットワークが回復してから「いいね」が送信されるようです。

#非SPAのWebアプリケーションへの適用

Optimistic Updatesは基本的にネイティブアプリやSPAで使う技術と思われますが、通常のWebアプリケーションでも適用可能な技術です。
戦略としてはいくつか考えられます。

## OptimisticなOptimistic Updates
通信が成功するまでの僅かな時間にページ遷移しないだろうというOptimisticな考えの元にOptimistic Updatesを適用します。
実際ネットワークが不安定な場合を除けばほとんどこれで問題ないかもしれません。

## 通信制御用の情報を永続化する
通信制御用の情報をブラウザのローカルストレージかセッションストレージなどに永続化しておけば、ページ遷移が発生したとしても次のページで通信すればよいので、問題なく通信制御できます。

## Service Workerを使用する
もし主要なすべてのブラウザーがService Workerを実装していれば、これを使うのが一番スマートなやり方ではないかと思います。
Service Workerに通信制御の仕組みを用意しておけばウェブアプリケーションを閉じたとしても通信できるからです。
対象ユーザーがChromeとFirefoxしか使っていないというおよそありえない状況でのみ採用できる方法です。
Vapor + LINE Messaging API で Bot を開発する

LINE Messaging APIが公開されて、面白そうだったので Swift Server Side Framework 「Vapor」 を使って実装してみました。

## 環境

- Sakura VPS Ubuntu 14.04
- Swift 3.0 Release
- Vapor 1.0.3
- Apache 2.4

LINE@の管理画面の使い方やMessaging APIの設定等については説明しません。
この記事では、Vaporを使ったBotアプリケーションの開発方法を紹介します。

とりあえず、送られてきたメッセージをそのまま返すだけのBotを作ってみましょう。

Vaporの基本的な使い方は [https://vapor.codes/](https://vapor.codes/) を参照してください。

## 証明書の準備
Messaging API を 使用するサーバーはHTTPSに対応していないといけないっぽいので、Let's Encrypt等を使って証明書をサクッと準備します。Vaporはherokuへのデプロイも簡単にできるのでherokuでも良いでしょう。とりあえず私は、テキトーなVPSにテキトーなドメインとって証明書を発行してもらいました。

VaporのSSL周りの仕様がよくわからないのでとりあえずApacheのリバースプロキシでどうにかしました。


## Vapor アプリケーションの作成

開発する環境はmacOSでもUbuntuでも良いですが、Xcodeが使えると便利なのでmacOSがオススメです。また、Swift Package Managerのプロジェクト構成も自分でやると面倒臭いのでVaporのToolboxを使用することをオススメします。

[Vapor Toolbox の導入](https://vapor.github.io/documentation/getting-started/install-toolbox.html)

```bash
$ vapor new LineBot #SPMプロジェクト作成
$ cd LineBot
$ vapor xcode #Xcodeプロジェクト生成
```

## webhookのハンドリング

Botへのイベントを受け取る先の実装をします。URLは何でも良いですが私は以下のようにしました。

```Swift
drop.post("/callback"){ request in
// イベントを見て色々してレスポンス返す
}
```

送られてくるデータは「Webhook Event Object」というもので、[https://devdocs.line.me/ja/#webhook-event-object](https://devdocs.line.me/ja/#webhook-event-object) に詳細なデータ構造が書かれています。

あまり詳しく見ていないですが、とりあえずはmessageのtextとreplyTokenさえ分かれば返信できそうなので取り出します。細かくイベントを判断して処理したいという場合は、ここのロジックをもう少し変える必要があります。

```Swift
guard let object = req.data["events"]?.array?.first?.object else{
    return Response(status: .ok, body: "this message is not supported")
}
    
guard let message = object["message"]?.object?["text"]?.string, let replyToken = object["replyToken"]?.string else{
    return Response(status: .ok, body: "this message is not supported")
}
```

こんな感じ（もっと良い取り出し方ないですかね）

あとは、取り出したmessageとreplyTokenをAPIに投げるだけです。

## Reply Message API を使う

次に Reply Message API  を使って返信してみます。APIを使用するためには「Channel Access Token」が必要になるので取得しておきましょう。

Vapor Toolkitでプロジェクトを作成した場合、「Config/secrets」が.gitignoreに追加されているはずなのでsecretsディレクトリに「Channel Access Token」を記述したjsonファイルを配置してアプリケーションから取得すると良いでしょう。取得方法は、

```Swift
let accessToken = drop.config["line_config", "access_token"]?.string 
```

こんな感じです。

あとはAPIを呼ぶだけです。

```Swift
let endpoint = "https://api.line.me/v2/bot/message/reply"

var request = URLRequest(url: URL(string: endpoint)!)
        
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")

let payload: [String: Any] = [
    "replyToken": replyToken,
    "messages": [
            ["type": "text", "text": message]
     ]
]

request.httpBody = try? JSONSerialization.data(withJSONObject: payload, options: .prettyPrinted)
```

あとはこのリクエストをURLSessionに投げれば・・・と思ったのですが、UbuntuでURLSessionを使うと何故か正しく機能しないので（corelib-foundationのバグですかね？）、実際にはcurlをTask(Process）を使って叩くようにしています。Dropletのclientを使ってPOSTしてもダメだったのでよく分からない。

## Bot と遊ぶ

友達に追加して、話しかけてみましょう。同じ内容のメッセージが返信されるはずです。

## ソースコード

処理を色々整理したものをGithubにて公開しています。

[https://github.com/rb-de0/vapor-linebot](https://github.com/rb-de0/vapor-linebot)
rails enumで定義した値が取れない！！データはある

![image](https://qiita-image-store.s3.amazonaws.com/0/69647/7ca5d0a4-0e43-5d81-12ec-0d071b9e37b2.png)

上のほうにあるとおり、データはちゃんとDBに入っているのに
enumで定義したstatusを取得できない




##結論
データベースのstatusカラムがintegerで定義されていない
　＝＞Stringはenumで使うことができないからinteger型で定義してデフォルトの値も入れてあげましょう
WordPress 記事内でpcとスマホの表示内容を切り替えたい。

テンプレート内だったらwp_is_mobile()を使えばOK。
投稿内はどうすればいいのか調べた。
ショートコードを使う！



#1 function.phpに以下記述 ショートコード登録

```php:function.php
//PCでのみ表示するコンテンツ
function if_is_pc($atts, $content = null ){
$content = do_shortcode( $content);
    if(!wp_is_mobile()){
        return $content;
    }
}
add_shortcode('pc', 'if_is_pc');

//スマートフォンで表示するコンテンツ
/*タブレットも含まれる*/
function if_is_sp($atts, $content = null ){
$content = do_shortcode( $content);
    if(wp_is_mobile()){
        return $content;
    }
}
add_shortcode('sp', 'if_is_sp');
```


#2 使い方

## pcで表示させたいコンテンツ

[pc]
<p>pcだよー</p>
[/pc]

## spで表示させたいコンテンツ

[sp]
<p>スマホだよー</p>
[/sp]



終わり
DatastoreからGetした時に余計なPropertyがある場合エラーになるが無視してもいい


タイトルのまんまです。

話の前提として、以下のパッケージを使っているものとします。

`google.golang.org/appengine/datastore`

SDK組み込みの `appengine/datastore` や Cloud Datastore用の `cloud.google.com/go/datastore` については言及しませんが、多分似たような設計になってると思うので流用可能なテクではないでしょうか。

## モチベーション

GAE/J+Slim3とかだとKindのSchemaの変更は大変気軽にできました。
新規追加のプロパティはデフォルト値になりますし、削除したプロパティはインスタンスに変換される時に無視されるからです。

一方、Goは違います。
Entityに存在するプロパティに対応するフィールドがstructにないと、エラーになります。
このため、GAE/Goでは不要になったプロパティを削除できず、ずっと残す運用をしていました。
具体的に以下のような感じです。

```go
type Sample struct {
	ID     int64  `goon:"id" datastore:"-"`
	Name   string
}
```

これを以下のように変更して適当に検索かけて使ってるところ消す。

```go
type Sample struct {
	ID               int64   `goon:"id" datastore:"-"`
	DeprecatedName   string  `datastore:"Name"`
}
```

もしくは、 `datastore.PropertyLoadSavor` を使って読み出し時に該当のプロパティを抜いてから変換します。
Goの場合 `ps = ps.Filter(p => p.Name != "Name")` みたいなコードが書きづらいのでひたすらめんどくさいです。

**何も考えずにプロパティ削りたい。**

## 対応

structに対し、 `datastore.PropertyLoadSavor` を実装します。
まずは今まで書いていたであろう実装を示しておきます。

```
func (entity *Foo) Load(p []datastore.Property) error {
	if err := datastore.LoadStruct(entity, p); err != nil {
		return err
	}

	// 何かやったりする

	return nil
}

func (entity *Foo) Save() ([]datastore.Property, error) {
	// 何かやったりする

	p, err := datastore.SaveStruct(entity)
	if err != nil {
		return nil, err
	}
	return p, nil
}
```

これを以下のように変更します。

```
func (entity *Foo) Load(p []datastore.Property) error {
	err := datastore.LoadStruct(entity, p)
	if fmerr, ok := err.(*datastore.ErrFieldMismatch); ok && fmerr != nil && fmerr.Reason == "no such struct field" {
		// ignore
	} else if err != nil {
		return err
	}

	// 何かやったりする

	return nil
}

func (entity *Foo) Save() ([]datastore.Property, error) {
	// 何かやったりする

	p, err := datastore.SaveStruct(entity)
	if err != nil {
		return nil, err
	}
	return p, nil
}
```

これだけでOKです。

## これで大丈夫な理由

[このへん](https://github.com/golang/appengine/blob/926995697fa8241be2dc73eb318666e24f44ed51/datastore/load.go#L234-L236)

> We don't return early, as we try to load as many properties as possible.
It is valid to load an entity into a struct that cannot fully represent it.
That case returns an error, but the caller is free to ignore it.

要するに、 `datastore.LoadStruct` した時に `*datastore.ErrFieldMismatch` が返ってきても途中で処理打ち切ったりせずにお尻まで処理してからエラー返してるので無視してもデータが壊れてることはないゾ！という話。

Reasonの値をチェックしているのは若干神経質な気もするので、おおらかな性格の人はReasonはみなくても多分大丈夫なんじゃないでしょうか。

## 感想

無視するために独自の `datastore.LoadStruct` 実装しなきゃかなと思って結構手を動かしてたんだけどある時 `datastore.ErrFieldMismatch` の存在とソレに関わる処理を見つけて無駄な作業だった事を知ってしまいたいへん悲しい(有益な発見

とりあえず、これから本番環境に突っ込んでみる予定です。
require可能なライブラリの一覧を取得

[プログラム内からrequire可能なライブラリの一覧を表示する](http://qiita.com/cia_rana/items/e7122d0a0a47b684c52d) を読んだのですが、UNIXの`find`コマンドを使っているので、Windowsでも使えるようPure Rubyで書けないかと思ってやってみました。
ついでに一応.rbだけでなく.soも検索するようにしています。

```rb
puts $:.flat_map {|path|
  Dir.glob(File.expand_path("**/*.{rb,so}", path))
}
```

`find`を使うパターンと結果を比べてみます。`find`は-oオプションでOR検索できます。順番を揃えるため両方の結果をソートしています。

```
$ ruby -e 'puts $:.flat_map {|path| Dir.glob(File.expand_path("**/*.{rb,so}", path))}.sort' >ruby-search
$ find `ruby -e 'print $:*" "'` -type f -name "*.rb" -o -name "*.so" | sort >find-search
$ diff -s ruby-search find-search
ファイル ruby-search と find-search は同一です
```
WRF > link > NCEP FNL Dataの使用例

WRF(Weather Research and Forecasting Model)関連。

気象データとして他のデータセットを使おうとしていたが、ちょっとややこしいエラーが出た。

とりあえず全体の動作確認を優先するため、NCEP FNL Dataを使うことにした。

使用例は以下に見つけた。
http://www2.mmm.ucar.edu/wrf/OnLineTutorial/DATA/FNL/

2003年頃にHYSPLITを使った時もNCEPデータにはお世話になった。
\uみたいなUnicodeエスケープシーケンスをPythonで変換する

# 概要
`\u30d5`みたいな文字が入っている大きいファイルの変換をやりたかったので調べました。少ない文字だったらWEBツールがあるのでやる必要はないです。

# ソース
```:py
# coding: utf-8
import codecs
fin  = codecs.open('C:/tmp/a1.txt', 'r')
fout  = codecs.open('C:/tmp/a2.txt', 'w', 'sjis')
for line in fin:
    s  = line.decode("unicode-escape")
    fout.write(s)
fin.close()
fout.close()

```
Ag - The Silver Searcher と ack.vim で爆速 grep した話

# テキスト検索を速くしたい

IDE とか テキストエディタ付属の検索機能とか grep とか遅いしアレなので乗り換えを検討した。

[The Silver Searcher](https://github.com/ggreer/the_silver_searcher)

あった。

# 導入

```bash
apt-get install silversearcher-ag
```

とか。yum もある。以上。

# 使い方

```bash
ag [FILE-TYPE] [OPTIONS] PATTERN [PATH]
```

まぁ、気にせず使うなら

```bash
ag hoge
```

だけで使える。検索パスは自動的にカレント + カレント以下のディレクトリを再帰的にやってくれる。すばらしい。

そしてなによりめちゃめちゃ速い。

# ack.vim の導入

みなさん当然 vim を使っていると思うので、vim で ag が使いたい。あると思います。

vim に適当なパッケージマネージャが入っている前提。NeoBundle だったら

```
NeoBundle 'mileszs/ack.vim'
```

を .vimrc に追加する。

名前の通り、ack.vim 自体は ack 向けの vim 拡張なので、ag が使えるようにする。.vimrc に

```
let g:ackprg = 'ag --nogroup --nocolor --column'
```

を追加する。

# vim から使う

```
:Ack [options] {pattern} [{directories}]
```

検索結果一覧が下に、検索されたファイルが上に開かれる。便利。

![vim_ack_ag.PNG](https://qiita-image-store.s3.amazonaws.com/0/77727/eb8b5265-df49-3674-aab3-35181a2b06b2.png)
_いいですね～_

めっちゃ速いので grep するのに緊張感がなくなる。ので気軽に濫用できる。

おしまい。
疑似要素にFont Awesomeのアイコンを使う（リンクタイプ別にアイコンを表示）

疑似要素にFont Awesomeのアイコンを表示させたい場合、contentプロパティにUnicodeコードポイントを指定します。

## <i class="fa fa-arrow-circle-right" aria-hidden="true"></i> Font Awesomeの導入
[公式サイト](http://fontawesome.io/get-started/)を参照されたし。
導入が完了すると `font-family:'FontAwesome';` でアイコンが利用できるようになります。

## <i class="fa fa-arrow-circle-right" aria-hidden="true"></i> 使いたいアイコンのUnicodeを調べる
公式サイトに[アイコン一覧表](http://fontawesome.io/cheatsheet/)があります。
ここに16進数のUnicodeもセットで記述されています。

## <i class="fa fa-arrow-circle-right" aria-hidden="true"></i> CSSで指定する

一覧表の数値文字参照の記述をそのまま

```css:NGな書き方
.ng::after {
  font-family: "FontAwesome";
  content: "&#xf13d;";
}
```
としても表示されません。CSSでは`\`でエスケープした16進数値で記述します。

```css:OKな書き方
.ok::after {
  font-family: "FontAwesome";
  content: "\f13d";
}
```
<p data-height="230" data-theme-id="0" data-slug-hash="ORzwPJ" data-default-tab="css,result" data-user="anchoor" data-embed-version="2" data-pen-title="contentに数値文字参照" class="codepen">See the Pen <a href="https://codepen.io/anchoor/pen/ORzwPJ/">contentに数値文字参照</a> by anchoor (<a href="https://codepen.io/anchoor">@anchoor</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

## <i class="fa fa-arrow-circle-right" aria-hidden="true"></i> 実践：リンクタイプ別にアイコンを表示する
属性セレクタを利用しリンク末尾にアイコンを表示させます。

<p data-height="350" data-theme-id="0" data-slug-hash="PpooMG" data-default-tab="css,result" data-user="anchoor" data-embed-version="2" data-pen-title="リンクタイプ別にアイコンを表示" class="codepen">See the Pen <a href="https://codepen.io/anchoor/pen/PpooMG/">リンクタイプ別にアイコンを表示</a> by anchoor (<a href="https://codepen.io/anchoor">@anchoor</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

## 参考サイト
 * [Font Awesome](http://fontawesome.io/)
 * [content - CSS | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/content)
 * [&lt;string&gt; - CSS | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/string)
ITMS-90686 エラーの対処方法

# 概要
2016年10月6日の未明、アプリの申請作業を行うべく、iTunesConnectにアップロードをしようと試みた。しかし、ITMS-90686という初見のエラー（Warning）が発生したため、少し調べてみた。

# ITMS-90686とは？
`WARNING ITMS-90686: "The binary you uploaded was invalid."`
エラー文は、たったのこれだけ。これだけをみて、原因を突き止める必要がある。

![スクリーンショット 2016-10-06 3.14.50.png](https://qiita-image-store.s3.amazonaws.com/0/98951/0ae61a9b-2693-f510-f81c-f973f9960704.png)

# 動作環境
XCode 7.3.1

# 原因の究明
直近に行った処理がFirebaseライブラリのimportだったことから、そのあたりから調査を開始した。しかし特に問題が見当たらない。そこで、一度実機でRunしてみたり、Testflight配信などを行ってみた。結果、正常にアプリが動作した。また、archiveしたファイルに対して、validationだけを実施したところ、見事にsuccessした。

![スクリーンショット 2016-10-06 3.19.55.png](https://qiita-image-store.s3.amazonaws.com/0/98951/d77191ce-302f-ffa3-d2e5-ec2a7b850978.png)

そこで、チームメンバーに相談してみると、以下のようなフォーラムを紹介してもらえた。

![スクリーンショット 2016-10-06 10.57.53.png](https://qiita-image-store.s3.amazonaws.com/0/98951/8c7293da-5b24-4536-7a56-ee12462668b0.png)
（ https://forums.developer.apple.com/message/185968#185968 ）

日本における6日の未明に、世界中で同様の問題が発生していたようだ。
XCodeのバージョンもそれぞれバラバラであることから、フォーラムでは　iTunesConnect側の問題であるという仮設が有力となっている。いまだ原因の特定はできていないため、継続的にリサーチしていきたい。

# 対処方法
Appleのサーバーエラーだった模様。本日uploadをすると正常に完了した。


# ソース
- https://forums.developer.apple.com/message/185968#185968
- https://forums.developer.apple.com/thread/65023
画像のみをvertical-alignとline-heightで垂直中央配置できないとき

# よく使う手法

垂直方向に中央配置する方法はいくつかあるけど、
中のインライン要素が1行だと決まっている場合に、よく使うシンプルな書き方。

```html
<div class="frame">
  <img src="image.png">
</div>
```

```css
.frame {
  height: 100px;
  line-height: 100px;
}
.frame img {
  max-height: 50px;
  vertical-align: middle;
}
```

[サンプル](http://jsfiddle.net/4RPFa/61/)

## あるサイトでうまくいかず、上に寄ってしまった

いつも使うやり方であるにも関わらず、とあるサイト制作ではどうしても画像が中央に寄ってくれない。
しかし、**テキストが混じると中央に寄ってくれる**。

```html
<div class="frame">
  なんかテキスト<img src="image.png">
</div>
```
意味がわからない。
他のサイトでは画像単独で中央配置できているのになぜだろう。
何か微妙な環境の差異があるはずと思い、読み込ませているCSSを全部外して、問題のCSSのみを適用させてみるも改善せず。

## 原因は・・・

**HTMLバージョン**。
問題のhtmlは、レガシーなHTML 4.01 Transitionalだったことが原因だった模様。
DOCTYPE宣言を変更してHTML5にしたら、治った。
なんで今どき、HTML 4.01 Transitionalを使っているかは訊かないで。
nodeとnpmのアップデートのメモ

自分へのメモです。
こちらの[サイト](http://parashuto.com/rriver/tools/updating-node-js-and-npm)を見て、そのまんまやりました。

```
> npm install -g n
> n latest # nodeの最新版
> npm update -g npm # npm update 
```

これだけ。
PHPで、連想配列がUndefined indexになるが、文字化けしてキーが見えない場合の対処法

Apacheに以下のようなログがでた場合、連想配列の存在しないキーにアクセスしていることはわかるが、アクセスしようとしたキーはエンコードされてしまっていて良くわからない。

    PHP Notice:  Undefined index: \xe6\x9d\x90\xe6\x96\x99\xe5\x8c\xba\xe5\x88\x86CD in /var/www/html/xxx/yyy/zzz.php on line 4744,

以下のサイトに「\xe6\x9d\x90\xe6\x96\x99\xe5\x8c\xba\xe5\x88\x86CD」を入力してDecodeすると、日本語で読める状態に戻るので便利だ。

- http://ddecode.com/hexdecoder/