OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 14.04 LTSでDVDビデオを再生する方法

Ubuntu 14.04 LTSでDVDビデオを再生できるようにするための方法について書きたいと思います。

#手順
1. `sudo apt-get install ubuntu-restricted-extras libdvdread4 vlc`コマンドを実行し、必要なパッケージをインストールします。
2. `sudo /usr/share/doc/libdvdread4/install-css.sh`コマンドを実行し、`libdvdcss2`をインストールします。
3. システム設定(Dashホームで`setting`と検索すると出てきます)の`詳細`をクリックします。<br>![システム設定_056.png](https://qiita-image-store.s3.amazonaws.com/0/52291/8276c530-d2ae-aa3f-be76-1070069fff77.png)
4. `リムーバブルメディア`をクリックします。<br>![詳細_057.png](https://qiita-image-store.s3.amazonaws.com/0/52291/f721c23e-7168-fe22-c735-f108d5b00e15.png)
5. DVDビデオの処理方法を`VLCメディアプレイヤー`にします。<br>![詳細_059.png](https://qiita-image-store.s3.amazonaws.com/0/52291/dc841911-c381-8f13-c5b1-4b8b09855e16.png)

#参考文献
* [dvdを再生したい - Ubuntuをちょい古パソコンで使う情報集。普通のwindowsユーザーの方に。](http://www18.atpages.jp/~mansionlaw/index.php?dvd%E3%82%92%E5%86%8D%E7%94%9F%E3%81%97%E3%81%9F%E3%81%84)
* [Ubuntu/VLC media playerのインストール - Linuxと過ごす](http://linux.just4fun.biz/Ubuntu/VLC%20media%20player%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB.html)
* [Ubuntu日本語フォーラム / 既定のプログラムの設定方法は？](https://forums.ubuntulinux.jp/viewtopic.php?id=12541)
Eclipse+MinGWでSDL2を静的リンクさせる覚書

# 概要
WindowsでEclipseを使いながらSDL2を使ったアプリケーションを作っていたところ、SDL2を静的にリンクさせることができたので、手順を書き残しておきます。


# 動作環境と前提条件
* Windows10 64bit
* Eclipse Mars.2 (4.5.2)
  * CDTが必要です。
* SDL2(v2.0.4)
* 今回は32bitの実行ファイルを作成します。


# 前準備
## Eclipseのインストール
インストール自体の手順は省略します。
CDTは入れておいてください。

## MinGWのインストール
[ここ](https://sourceforge.net/projects/mingw/files/)から**mingw-get-setup.exe**を入手します。
インストーラにしたがってMinGWをインストールします。
今回は以下の場所にインストールしました。
`C:\MinGW`

## SDL2のインストール
[ここ](https://www.libsdl.org/download-2.0.php)から入手します。
Development Librariesの**SDL2-devel-2.0.4-mingw.tar.gz**です。
ファイルを展開して任意のディレクトリに保存してください。
今回は以下の場所に格納しました。
`C:\dev\SDL2\i686-w64-mingw32`

# プロジェクトの作成と設定
## プロジェクトの作成
Eclipseのメニューから`File`/`New`/`Project`を選択して、New Projectウィンドウを出します。
`C/C++ Project`を選択してNextをクリックします。
Project Nameを入力し、Project typeからは`Empty Project`を、Toolchainsからは`MinGW GCC`を選択してFinishをクリックします。

## プロジェクトの設定
Project Explorerで作成したプロジェクトを選択し、メニューから`Project`/`Properties`を選択し、設定ウィンドウを出します。

* 環境変数
`C/C++ Build`/`Environment`を選択します。
MINGW_HOMEの値を、MinGWインストールしたパスに設定します。

* ビルド設定
`C/C++ Build`/`Settings`を選択します。
GCC C++ CompilerのIncludesを選択し、Include pathsにSDL2のincludeディレクトリのパスを追加します。
今回の場合だと以下のようになります。
`C:\dev\SDL2\i686-w64-mingw32\include`
MinGW C++ LinkerのLibrariesを選択し、Library search pathにSDL2のlibディレクトリのパスを追加します。
今回の場合だと以下のようになります。
`C:\dev\SDL2\i686-w64-mingw32\lib`
同じく、Librariesに以下の依存ライブラリを追加します。
結構多いので参考に[画像も撮りました。](https://qiita-image-store.s3.amazonaws.com/0/38022/65611f3b-2841-f22d-21be-ef4b4377c8dd.jpeg)あと順番もこの通りにしてください。
`mingw32`
`SDL2main`
`SDL2`
`SDL2_mixer`(SDL2_mixerを使う場合のみ。今回は追加しなくて良い)
`m`
`dinput8`
`dxguid`
`dxerr8`
`user32`
`gdi32`
`winmm`
`imm32`
`ole32`
`oleaut32`
`shell32`
`version`
`uuid`
MinGW C++ LinkerのMiscellaneousを選択し、Linker flagsに以下を入力します。
`-static -mwindows`
以上です。

# ソースコードを作成してビルドしてみよう
SDL2を使ったアプリケーションのサンプルコードとして、[こちら](http://nyaocat.hatenablog.jp/entry/2014/01/27/153145)を参考にします。
ほとんど流用ですが、SDL2のヘッダの指定が若干異なります。

```cpp:main.cpp
#include <SDL2/SDL.h>

int main(int, char ** const) {
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Window* window = SDL_CreateWindow("Hey", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0);
    SDL_Renderer* render = SDL_CreateRenderer(window, -1, 0);

    SDL_Event ev;
    while(true){
        SDL_SetRenderDrawColor(render, 0, 0, 0, 255);
        SDL_RenderClear(render);
        while(SDL_PollEvent(&ev))
        {
            if (ev.type == SDL_QUIT)
                return 0;
        }
            SDL_SetRenderDrawColor(render, 255, 0, 0, 255);
        SDL_RenderDrawLine(render,10, 10, 400, 400);
        SDL_RenderPresent(render);
    }

    return 0;
}

```

ビルドが成功して実行すると、ウィンドウが立ち上がり、中に赤い線が表示されていると思います。

# おわりに
ビルド後の実行バイナリのサイズですが、動的リンク時は150KB弱だったのが、静的リンク時は5000KBを超えました。これはデバッグ用のオプション設定での結果です。
今回はWindowsでSDL2のアプリケーションをビルドする際に、SDL2を静的リンクする手順を書きました。
ご指摘等ありましたら、コメントにてお願いします。
おしまい！
Ruby の AASM でズンドコキヨシ

[AASM](https://github.com/aasm/aasm) は，オブジェクトに状態遷移の仕組みを簡単に持ち込むことができるライブラリーだ。

AASM の勉強を兼ねてズンドコキヨシを書いてみた。

参考：[ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90#_reference-3abd6c2ae48bcc4265a4)

# コード 1

最初に書いたのがこれ。

```rb
require 'aasm'

class Zundoko
  include AASM

  aasm do
    # ズンがまだ無い状態（初期状態）
    state :z0, initial: true
    # ズンが一つ溜まった状態（以下同様）
    state :z1
    state :z2
    state :z3
    # ズンが四つ以上溜まった状態
    state :z4
    # 完了状態
    state :completed

    # zun をもらったときの遷移規則
    event :zun do
      # z0 からは z1 へ（以下同様）
      transitions from: :z0, to: :z1
      transitions from: :z1, to: :z2
      transitions from: :z2, to: :z3
      # z3 と z4 からは z4 へ
      transitions from: [:z3, :z4], to: :z4
    end

    # doko をもらったときの遷移規則
    event :doko do
      # z0～z3 からは z0 へ
      transitions from: %i(z0 z1 z2 z3), to: :z0
      # z4 からは完了状態へ
      transitions from: :z4, to: :completed
    end
  end
end

zundoko = Zundoko.new

zundoko_strings = {zun: "ズン", doko: "ドコ"}

loop do
  m = zundoko_strings.keys.sample
  print zundoko_strings[m], " "
  zundoko.send m
  if zundoko.completed?
    puts "キヨシ"
    break
  end
  sleep 0.1
end
```

簡単のため，完了状態になったあとのことは考えてない。さらに続けられるようにするならもう少し複雑になる。

# コード 2

コード 1 は，ズンが 0 回溜まった状態から 4 回以上溜まった状態までを別々の AASM 状態として管理しているのがイマイチ。仕様変更に弱そうだし，見通しが悪い。

いっそ状態は未完了・完了の二つだけにして，ズンの溜まった数をインスタンス変数で管理するのはどうか？

その場合，数によって遷移の仕方が変わるのをどう書くのか分からなくて，調べながら書いた。

できたのがこれ。

```rb
require 'aasm'

class Zundoko
  include AASM

  NECESSARY_ZUN_COUNT = 4

  def initialize
    @zun_count = 0
  end

  aasm do
    # 未完了状態（初期状態）
    state :running, initial: true

    # 完了状態
    state :completed

    # zun をもらったときの遷移規則
    event :zun do
      # 未完了状態のまま
      transitions from: :running, to: :running do
        # 遷移後にカウントアップ
        after{@zun_count += 1}
      end
    end

    # doko をもらったときの遷移規則
    event :doko do
      # ズンが十分溜まっていれば未完了状態から完了状態に遷移する
      transitions from: :running, to: :completed,
        guard: :adequate_zun?

      # 上記の規則に当てはまってなかったら未完了状態のまま
      transitions from: :running, to: :running do
        # 遷移後にカウンターをリセットする
        after{@zun_count = 0}
      end
    end
  end

  # 十分な数のズンが溜まっているか
  def adequate_zun?
    @zun_count >= NECESSARY_ZUN_COUNT
  end
end

zundoko = Zundoko.new

zundoko_strings = {zun: "ズン", doko: "ドコ"}

loop do
  m = zundoko_strings.keys.sample
  print zundoko_strings[m], " "
  zundoko.send m
  if zundoko.completed?
    puts "キヨシ"
    break
  end
  sleep 0.1
end
```

`transition` にはブロックを与えることができて，遷移の前や後に何かをやらせることができる。

また，現在の状態と遷移メソッドだけで遷移先を決めるのではなく，`guard` を使って条件を付けることができる。判定メソッドの名前をシンボルで与えればいい。

# 全部をクラスに詰め込むことも

コード 1 も 2 も，Zundoko クラスの役割は状態遷移に特化していて，ズン／ドコを与えることや画面表示などは外部で行っていた。

しかし，全部を Zundoko に詰め込んでもいい。
「Write failed: Broken pipe」によりsshが切断される場合の対処法

#問題

クライアントからサーバにsshで接続しているとある時間が経過した後に切断されてしまう。

#解決方法
###クライアント側で対処
まず、クライアント側で対処するには/etc/ssh/ssh_configまたは~/.ssh/configに以下の内容を記述します。

```
$ vim ~/.ssh/config

ServerAliveInterval 15
ServerAliveCountMax 10
```

###サーバ側で対処
次にサーバ側で対応する方法ですが、/etc/ssh/sshd_configに

```
$ vi /etc/ssh/sshd_config

ClientAliveInterval 30
ClientAliveCountMax 5
```


と記述すると、30秒ごとにクライアントに5回応答確認をクライアントに送り、それでも応答がなければタイムアウトになります。

サーバ側のsshd_configを編集した場合は反映をさせるためにsshd再起動をする。(必要かどうかは要確認)


```
# service sshd restart
```

# 参考
- [「Write failed: Broken pipe」によりsshが切断された時の対処法](http://qiita.com/xxthermidorxx/items/2f4ced5edf306fdd9dfb)
Screenの基本的な使い方

# Screen

## セッション起動していない時

名前をつけずにセッションを作成

	$ screen

名前をつけてセッションを作成

	$ screen -S セッション名
	
最後にデタッチしたセッションにアタッチする

	$ screen -r	

セッション名を指定してアタッチする
	
	$ screen -r セッション名

セッションの一覧

	$ screen -ls
	There are screens on:
        8714.hoge     (Attached)
        9216.fuga (Attached)
        9230.hage      (Attached)
	3 Sockets in /var/folders/hk/pm6ff9yn6cdbx3j9fzvn42740000gn/T/.screen.


## セッション起動中	

shellの一覧を表示する

	w

次のshellに移動する

	n
	
前のshellに移動する

	p

shellを番号を指定して移動する
	
	移動したいshellの番号

Screen起動中にセッション名を変える

	:
	
	コマンドモードになったら
	
	:session name hogehoge
	
	と入れる。これでセッション名がhogehogeになる。


新規shellの作成

	c

Screenのデタッチ

	d

Shell毎に名前をつける

	A
	
システム情報を表示する

	t

Windowを上下に分割する
	
	S
	
Windowを左右に分割する

	V

分割したWindowを移動する

	tab
	
分割をやめる

	Q
Apacheでhttpd: Could not reliably determine the server's fully qualified domain nameと言われる解決方法

httpd 起動時にエラーが出ました。

# httpd を起動でエラー
httpd を起動します。

```bash:httpdを起動
service httpd start

httpd を起動中: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
```
起動はできるのですが、毎回メッセージがでるのがちょっといやです。


# ServerName を指定する
httpd.conf に ServerName を書けばいいみたいです。

```
vi /etc/httpd/conf/httpd.conf

ServerName hogepiyo:80
```
ServerName に hogepiyo のように何か適当な文字列を書きます。

# httpdを再度起動
もう一度起動を試します。

```bash:httpdを起動
service httpd restart
```

今度はエラーが消えました(☝ ՞ਊ ՞)☝
subtree 向けにディレクトリ分割したモジュールフォルダをcomposerで読み込む

 
git subtree 便利です

本当に便利なのですが、subtreeからcomposerへの移行が面倒です。

subtree向けにディレクトリ分割したタイミングからcomposer対応しておきたいものです。

要は無駄にautoload追加しまくるのは何か嫌だって事です。

composer にはローカルディレクトリをリポジトリパスとして登録する機能があるのでその辺を使えばうまいこと行けそうです。


## composer.json をいじる

composer.jsonに以下の記述を追加します。

````
    "repositories":[ 
        {
            "type":"path", "url" : "./subtree/mylib"
        },
    ],
````

ここで、`subtree/mylib/composer.json`を配置して適切な`name`,`autoload`を設定すると、`subtree/mylib`がComposer ライブラリのリポジトリとして認識される様になります。 

````
$ composer require acme/mylib:dev-master
````

バージョンに関してはgitのサブディレクトリでパスもブランチも無いので、常にdev-masterが有効です。

require するとvendorディレクトリ以下にシンボリックリンクが貼られます。

phpstorm などではシンボリックリンクが自動で更新サれないので、find usage とかのインデックスは若干ラグります。

定期的に読み込みを手動で入れてあげるといい感じです。

親プロジェクトにautoload入れまくって対応するより、移行面ではいささかマシだと思います。
Vagrant コマンドラインインターフェース PLUGIN

#PLUGIN

##command: vagrant plugin

プラグインを管理するコマンド。
サブコマンドによりその主な機能が発揮できる。

- install
- license
- list
- uninstall
- update

#PLUGIN INSTALL

##command: vagrant plugin install <name>...

指定された名称又はファイルパスのプラグインをインストールする。名称がファイルパスでない場合、リモートのリポジトリ（大抵RubyGem）からプラグインがインストールされる。既にインストールされている場合は、プラグインをアップデートするが、「vagrant plugin update」コマンドで代替することができる。

複数の名称が指定された場合、複数のプラグインがインストールされる。オプションがある場合は、コマンドで指定された全てのプラグインに適用される。

インストール済みの場合、このコマンドにより最新のバージョンのもので再インストールされる。

下記オプションが利用可能である：

- --entry-point ENTRYPOINT
デフォルトで、プラグインは同名の初期化ファイルをロードすることによりプラグインとして内部的にロードされる。ほとんどのケースにおいてこれがデフォルトであるが、インストール対象のプラグインが別のエントリーポイントを持つ場合、このオプションでそのエントリーポイントを指定可能である。

- --plugin-clean-sources
今まで定義された全てのソースをクリアする上級の機能。主にRubyGem.orgへのアクセスを防ぐ企業のファイアウォールで使用される。

- --plugin-source SOURCE
プラグインをフェッチするソースを追加。インストールする単一のプラグインのみでなく、以降にインストールするプラグインにも影響する。Vagrantが利用するプラグインのインストーラを制限する。

- --plugin-version VERSION
インストールするプラグインのバージョンを指定。デフォルトでは最新のバージョンをインストールする。このオプションでバージョンを限定できる。「1.2.3」や「>1.0.2」のような指定ができる。「">1.0.2, <1.1.0"」のように、カンマ区切りで複雑なバージョン指定も可能。（コマンドラインではクオテーションで括ること）

#PLUGIN LICENSE

##command: vagrant plugin license <name> <license-file>

「[VMware Fusion provider](https://www.vagrantup.com/docs/vmware)」のような商標のあるVagrantのプラグインのライセンスをインストールする。

#PLUGIN LIST

##command: vagrant plugin list

インストールされた全てのプラグインとそのバージョンを一覧表示する。バージョンの制限があるものに関しては、その制限事項も表示される。その他プラグイン特有の情報も表示される。

#PLUGIN UNINSTALL

##command: vagrant plugin uninstall <name> [<name2> <name3> ...]

指定したプラグインをアンインストールする。依存するプラグインも利用されないものとして同時にアンインストールされる。
複数名が指定された場合、その全てがアンインストールされる。


#PLUGIN UPDATE

##command: vagrant plugin update [<name>]

Vagrantにインストールされたプラグインを更新する。インストール時に指定したバージョンが考慮される。バージョン制限を変更する場合、「vagrant plugin install」により再インストールする。

名称の指定があった場合、その特定のプラグインのみ更新される。インストールされていないプラグインが指定された場合はそのプラグインはインストールされない。
ビルド後のPlayの設定を自由に切り替えられるようにする

あまり考えずに適当に設定を管理していると、コンテナ化して試験環境で確認したサーバーをそのまま本番にアタッチさせたりとかしたいってなったときに死ぬことになる。色々考えてみる。2.1.5で確認。

## 内容の要約

* distでビルドするときは引数に何も加えない
* アプリとloggerの設定はstartの実行引数に加える
* propertiesは使うとややこしくなるのでtypesafe configに一本化する
* 設定はサーバーアプリとは別に管理する

## 設定の種類

Playのサーバーにおける設定は色々ある。DBに格納、などは考えるとキリはないので静的ファイルとしてアタッチするものだけ。

* アプリ系設定
    * .conf
    * .properties
* ルーティング
    * .routes
* ログ設定
    * application-logger.xml(～2.3)
    * logger.xml(～2.3)
    * logback.xml(2.4～2.5)
* evolution用sql

一応propertiesも書いてるけど、play側でそれよりも便利なtypesafe configを導入してるのでそれに一本化した方がいいと思う。

## 設定を当てるタイミングについて

### play dist時にくっつける場合

```play dist```を使って実際に動くアプリケーションを作ると思うけれども、ここで```play -Dconfig.file=conf/prod.conf dist```とか設定するとその設定で動かすための準備をplay側でやってくれる。

具体的に書くと、以下のことをやってくれる。

* zipの直下に設定ファイルを置いてくれる
* startスクリプトのjava実行オプションに｢-Dconfig.file=\`dirname $0 \`/application.conf｣をくっつけてくれる

便利。
でもこれを使うと、このアプリケーションを別の環境に移し替えたときにstartを置き換えたりzip直下の設定ファイルを置き換えないといけないので色々困る。**なので使わない。**

### 実行時にくっつける場合

play/activator distで生成される実行スクリプトのstartはとても便利で、以下のように$*で引数を受け付ける作りになっている。

```bash
#!/usr/bin/env sh
scriptdir=`dirname $0`
classpath="$scriptdir/lib/hoge.jar:..."
exec java $* -cp $classpath play.core.server.NettyServer `dirname $0`
```

たとえば、```./start -Dconfig.file=~/path/to/test.conf -Dlogger.file=/path/to/logger.xml```とかやればその設定で動く。

なので、**daemontoolsやsupervisorなどでプロセス管理をしている場合はそこの実行内容に記載すればいい。**


## 設定の配置

conf/以下にファイルを置くと全部```activator dist```で出来たzipの内のlib/hoge-SNAPSHOT.jarの中に展開される。

上記では```-Dconfig.file```と```-Dlogger.file```を使ってファイル指定をしているけれど、```-Dconfig.resource```と```-Dlogger.resource```を使うとクラスパスの中身から検索を行う。

conf以下に設定ファイルを置くとこれが利用可能。startでどれを使うか設定できるのは変わらないのでこの辺はお好みで。

個人的には、設定とアプリケーションを完全に切り分けて管理するといいと思う。

設定だけ変更する場合、playのdistから始めなくても設定だけ別にfetchしてplayの再起動かければわざわざアプリのビルドは必要ないし。

## ちなみに

今触ってるplayのサーバーアプリはこんな感じ。

* conf/の下に設定系全部ぶち込んでる
* propertiesも使ってる
    * hoge.properties.forbetaみたいなファイルをビルドスクリプト中でデプロイ先に合わせてhoge.propertiesに変えて配置し直してる
* -Dconfig.file=hoge.conf distでビルドしてる
* ヒープなどのjvm系の設定はビルドスクリプト中でstartファイルをsedで置換して埋め込んでる
* ログの設定はどの環境も指定してない(application-logger.xml使ってる)
    * どの環境でもトレースまで出してる

はい。
[Environment]Virtualboxを使ってWindowsマシンにDeep Learning環境を構築してみた

Virtualboxを使ってWindowsマシン上にubuntuの環境を作り、**chainer**と**tensorflow**をインストールする手順をざっくり書いてみました。

# virtualbox
https://www.virtualbox.org/wiki/Downloads
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/100523/ffd273dc-d242-f0b3-3e41-225d96c87fc9.jpeg)

# ubuntu14.04LTS
## ダウンロード
https://www.ubuntulinux.jp/News/ubuntu1404-ja-remix
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/100523/63c16226-70b1-e438-2107-907ef80eb683.jpeg)


## ubuntu14.04 LTSインストール
1. virtualbox起動
2. 新規から仮想マシン作成

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/100523/59df22be-80aa-ce5b-0806-d12349bee4dc.jpeg)

3. ISOをドライブに設定する
設定、ストレージのＣＤのマークの空を選択し、右側出てきたＣＤのマークを押して、ダウンロードしたＩＳＯファイルを指定する

指定前
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/100523/1f03d053-955b-cbbc-6c53-28f6f6a99de2.jpeg)
指定後
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/100523/2a1eda4a-bd21-6376-87e3-82a57858015e.jpeg)

4. 起動を押して、仮想マシンを起動する

5. ubuntuをインストール
インストール画面になるので、「ubuntuをインストール」を押してインストールする

# Anaconda
anacondaを下記からダウンロードしてインストールする

https://www.continuum.io/downloads

```lang:bash
user@mypc:~/work/Environment$ bash Anaconda2-2.5.0-Linux-x86_64.sh 

Welcome to Anaconda2 2.5.0 (by Continuum Analytics, Inc.)

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>> 
```

```lang:bash
cryptography
A Python library which exposes cryptographic recipes and primitives.

Do you approve the license terms? [yes|no]
>>> yes

```

```lang:bash
  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/user/anaconda2] >>> 
```

```lang:bash
installation finished.
Do you wish the installer to prepend the Anaconda2 install location
to PATH in your /home/user/.bashrc ? [yes|no]
[no] >>> yes
```

# condaをアップデートする

```lang:bash
conda update conda
conda update anaconda
```

# chainer
chainerをインストールする

'/home/user/anaconda2/bin'にpathが通っていない場合は下記のようにしてあげるといいです。

```lang:bash
user@mypc:~/work/Environment$ source ~/.bashrc
```

あとは仮想環境を作ってinstallするだけです。
詳しくは[ここ](http://chainer.org)を参照してください。

```lang:bash
user@mypc:~/work/Environment$ conda create -n chainer python=2.7 anaconda
user@mypc:~/work/Environment$ source activate chainer
(chainer)user@mypc:~/work/Environment$ pip install chainer
```

# tensorflow


仮想環境を作ってinstallするだけです。
詳しくは[ここ](https://www.tensorflow.org/versions/r0.7/get_started/os_setup.html#pip-installation)を参照してください。

```lang:bash
user@mypc:~/work/Environment$ conda create -n tensorflow python=2.7 anaconda
user@mypc:~/work/Environment$ source activate tensorflow
(tensorflow)user@mypc:~$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
```
ズンドコキヨシ with Excel


Excelでズンドコキヨシをやってみた。

```
=IF(ROW()>5, IF(OR(A5="", A5="キ・ヨ・シ！"), "", IF(AND(A1="ズン", A2="ズン", A3="ズン", A4="ズン", A5="ドコ"), "キ・ヨ・シ！", IF(INT(RAND()*2)=0, "ズン", "ドコ"))), IF(INT(RAND()*2)=0, "ズン", "ドコ"))
```
これをA6のセルにコピペして、上下にコピーすると…

![zundoko.png](https://qiita-image-store.s3.amazonaws.com/0/39565/28900b1e-ac24-c411-c752-372ec0b8aa73.png "zundoko.png")
できたっ！

勝手に再帰してくれるのがイイなー。
思いつくがままに書いてみたけどもうちょっとキレイに書ける気がする。。
Mediatorパターン


オブジェクトの振る舞いに関するデザインパターン。

Mediator...「仲介者、まとめ役」の意味

## Mediatorパターンの概要
オブジェクト同士がお互いに参照し合わないようにし、
オブジェクトの結合度を弱めるようにする手法をとるパターン

## メリット

* オブジェクト同士の結合度を弱める

## UML
 ![Qiita](http://www.ie.u-ryukyu.ac.jp/~e085739/_images/designpattern-mediator012.gif "Mediator")

## 登場する構成クラス

* Mediator
	* 仲介者クラスの抽象クラス 
* ConcreteMediator
	* 仲介者クラスの具象クラス<br>
	このクラスがColleagueクラスのオブジェクトを管理する 
* Colleague
	* Mediatorクラスに通知を送るためのメソッドを定義している。だけ。 Colleagueは「同僚」という意味。同僚という言葉は特に意識しなくてよい。同僚というより同列の機能とかの方がしっくりくるかも。
* ConcreateColeageA, ConcreateColeageB, ConcreateColeageC... 
	* Colleagueクラスの具象クラス
	* インスタンス生成するときに、ConcreteMediatorを生成する
	* 自分の状態が変わったときにConcreteMediatorに状態を通知する
	* ConcreteMediatorに他のオブジェクトの状態を聞く

## これってどういう時に使われる？の例
例1
入力フォームを作成するときに、チェックボックスとテキストボックスが存在するとします。
テキストボックスは、チェックボックスにチェックがついている状態じゃないと表示させたくない場合。

登場する構成クラスに当てはめると
テキストボックス (ConcreteColleagueA）、
チェックボックス (ConcreteColleagueB)。
お互いのオブジェクトを参照し合うのではなく、
共通のクラス(Mediator)を介して、お互いのオブジェクトの情報を知る。


例2
[RPGの表示例](http://marupeke296.com/DP_Mediator.html)

## コード例
[rubyによるMediatorパターンの実装] (http://capm-network.com/?tag=%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Mediator)

``` rubyによるMediatorパターンの実装
#!/usr/bin/env ruby

# 仲介者インタフェース
# メソッドを定義するだけ
class Mediator
  def create_colleagues
  end
  def consultation
  end
end

# 具体的な仲介者
class ConcreteMediator < Mediator
  def initialize
  　# Hashでオブジェクト情報を管理する
    @colleague = Hash.new
  end

  # 同僚を登録する
  def create_colleagues(colleague)
    @colleague.store(colleague.get_name,colleague)
  end

  # 仲介する
  # @param colleague colleagueオブジェクト
  # @param to  他のcolleagueオブジェクト名
  # @param msg　メッセージ
  def consultation(colleague, to, msg)
    puts("[mediator] from #{colleague.get_name} to #{to}")
    @colleague[to].read_msg(msg)
  end
end

# 同僚インタフェース
class Colleague
  def initialize(name)
    @name = name
  end

  def get_name
    return(@name)
  end

  def set_mediator(mediator)
    @mediator = mediator
  end
end

# 具体的な同僚1
class ConcreteColleague1 < Colleague
  def initialize(name)
    super(name)
  end

  def twitter(to, msg)
    @mediator.consultation(self, to, msg)
  end

  def read_msg(msg)
    puts("#{@name} received: #{msg}")
  end
end

# 具体的な同僚2
class ConcreteColleague2 < Colleague
  def initialize(name)
    super(name)
  end

  def twitter(to, msg)
    @mediator.consultation(self, to, msg)
  end

  def read_msg(msg)
    puts("#{@name} received: #{msg}")
  end
end

# Client
mediator = ConcreteMediator.new
user1 = ConcreteColleague1.new("user1")
user2 = ConcreteColleague1.new("user2")

# mediatorに登録する
user1.set_mediator(mediator)
user2.set_mediator(mediator)
mediator.create_colleagues(user1)
mediator.create_colleagues(user2)

# 同僚に連絡する
user1.twitter("user2", "I am user1.")
user2.twitter("user1", "I am user2.")
```

実行結果

```
[mediator] from user1 to user2
user2 received: I am user1.
[mediator] from user2 to user1
user1 received: I am user2.
```
Swiftはじめたい...その２４ ズンドコキヨシ


# はやりに乗っかりました。

+ [おなじ処理をperlで書きました](http://qiita.com/qoAop/items/7d44a1d3407ad00801d7)のでそれをswiftに合わせてみました。

```swift:zd.swift
import Foundation

let z =  ["ズン","ドコ"]
var s = ""
for ( s = "" ; s.characters.count < 9 || s.substringFromIndex(s.endIndex.advancedBy(-10)) != "ズンズンズンズンドコ" ; s += z[ Int(arc4random_uniform(2)) ] ) {}
print("\(s) キ・ヨ・シ！")
```

+ 最後から10文字とってるんですが、10文字より少ないとエラーになるのでそこだけperl版と違います。
既存の ELB に SSL 証明書を追加しようとすると Server Certificate not found for the key というエラーになる件の解決方法


![スクリーンショット_2016-03-14_16_42_03.png](https://qiita-image-store.s3.amazonaws.com/0/2609/945a168b-741f-b2f4-5256-3cc521982086.png "スクリーンショット_2016-03-14_16_42_03.png")

# 概要
AWS の管理画面から既存の ELB に対して, 新規の SSL 証明書を適用しようとすると画像のようなエラーになりました.
ELB は HTTP 通信のみ許可した状態です.
どこにハマったかというと, AWS の管理画面から新規の SSL 証明書を追加して, それを既存の ELB　に適用できるようになっているのに, そこでエラーになってしまうというところです.

# 解決方法
今回参考にしたのはこちらです.
[AWSのロードバランサー(ELB)にサーバー証明書(SSL)を適用する](http://cyborg-ninja.com/ittips/3336)

結局 AWS の管理画面から新規の SSL 証明書を追加してそれを ELB に適用できるようになってはいるものの, コマンドラインからでないとできないというオチでした.

以下にざっくりやったことを書いておきます.

1. AWS の管理画面から IAM を作成し, 自分専用のアカウントを作る（ルート権限のアカウントで操作できるならそのアカウントでも良いはず）
2. awscli をインストールする
3. 作成した IAM のアカウントの Access Key Id と Secret Access Key を使って $ aws configure を叩いて ~/.aws/config を作る（設定が間違ってなければこれでコマンドラインから AWS への操作ができるようになる）
4. ここで IAM を作成した AWS の管理画面に戻り, 作成したアカウントに対して IAMFullAccess のポリシーを追加（アタッチ）する
5. アップロードコマンドを実行する

```
$ aws iam upload-server-certificate --server-certificate-name my-server-cert --certificate-body file://~/Desktop/my-certificate.pem --private-key file://~/Desktop/my-private-key.pem --certificate-chain file://~/Desktop/my-certificate-chain.pem

# 成功すると以下のような json が返ってくる
{
    "ServerCertificateMetadata": {
        "ServerCertificateId": "xxxxxxxxxxxxxxxxxxx",
        "ServerCertificateName": "xxxxxxxxxxxxxxxxxxx",
        "Expiration": "2017-0x-xxT14:59:00Z",
        "Path": "/",
        "Arn": "arn:aws:iam::xxxxxxxxxxxxxxxxxxx:server-certificate/xxxxxxxxxxxxxxxxxxx",
        "UploadDate": "2016-0x-xxT10:52:40.968Z"
    }
}
```
### アップロードコマンドでの注意点
- my-server-cert の部分は何を入れたら良いのか悩んだけど, アップロードする SSL 証明書の名前になるので適当に入れる
- file:// をプレフィックスに付けること（付けないと MalformedCertificate みたいなエラーになる）

### 環境変数に注意
ここまで来てまだ AccessDenied が出る場合は, zsh とか bash に設定してる AWS のキーが IAM とは違うものになっていたりするかもです（自分はそれでした）

# 関連
公式ドキュメントを見てると, SSL 証明書のアップロードはコマンドラインからしかできないような感じですね
[署名証明書をアップロードする](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/ssl-server-cert.html#upload-cert)

同じようにハマっている人のブログ
[AWS ELBに証明書をインストールする際にハマったこと](http://tk2-207-13211.vs.sakura.ne.jp/2016/02/755/)

この辺見てると AWS の管理画面からでもできそうなんだけどなー
[【初心者向け】ELBにSSL証明書をインストールする](http://dev.classmethod.jp/cloud/aws/aws-beginner-elb-ssl/)
UI Bootstrapのモーダルの表示位置を変更

UI Bootstrapで表示されるモーダルはデフォルトだと画面のだいぶ上の方に表示される。
それを任意の位置に表示させる方法。

#クラス定義
まずはモーダルの位置を調整するためにCSSのクラスを定義する。

```css
.center-modal {
    top: 20%;
}
```

とりあえず、位置をもう少し下にするために`top:20%`を指定。

あとは、モーダルのopenで指定するオプションに`windowClass: 'center-modal'`を指定してやればOK。

```js
$uibModal.open({
				templateUrl: "modal.html",
				windowClass: 'center-modal'
			});
```

これだけで、center-modalで指定したcssでモーダルの位置が調整される。
もう少し右に移動したいときは`left:20%`のように設定すれば右に移動する。

20160321追記
`windowClass`に設定したクラスの`top`や`left`で位置を指定した場合、元の表示位置からずれた分だけモーダルの表示領域がずれるため、`backdrop:true`の場合にずれた分の位置でクリックをしてもモーダルが閉じないという現象が発生します。
その場合は

```css
.center-modal .modal-dialog{
    margin-top: 20%;
}
```

のように、一つ下のクラスである`modal-dialog`に`margin-top`として指定してやることで、
クリック領域はずれずにモーダルの内容だけ表示位置をずらすことができます。
ReactでサブツリーからDOMをレンダリングする

GreasemonkeyやChrome Extensionsなんかで既存ページを書き換えるアプリを作っているとき、
ページの複数箇所にDOMを挿入したいことがある。
これをReactでやりたい。

```html
<body>
  <nav>
    <div>
       <div>
          <!-- ここに挿入したい -->
       </div>
    </div>
  </nav>
  <article>
    <div>
       <div>
          <!-- ここにも挿入したい -->
       </div>
    </div>
  </article>
</body>
```

``ReactDOM.render``を二回やってもできるが、Reactツリー間での連携が面倒。

```js
// 現仕様ではコンテナ内の既存要素は削除されるため、要コンテナ生成
const subRoot1 = document.createElement('div');
const subRoot2 = document.createElement('div');

document.querySelector('.container.of.subtree1').appendChild(subRoot1);
document.querySelector('.container.of.subtree2').appendChild(subRoot2);

ReactDOM.render(<SubTree1 {...dataForSubTree1} />, subRoot1);
ReactDOM.render(<SubTree2 {...dataForSubTree2} />, subRoot2);
```

やっぱり全体のルートが欲しい。
ルートはレンダリングせず、サブツリーを好きなとこにレンダリングするReactコンポーネントを作れないか？

...

で、やってみたら簡単にできた。Reactすごい！
以下ES6版の例。他でも似たようにできるはず。

```js
class MainTree extends React.Component {
  constructor(props, state) {
    super(props, state);

    this.subRoot1 = document.createElement('div');
    this.subRoot2 = document.createElement('div');

    document.querySelector('.container.of.subtree1').appendChild(this.subRoot1);
    document.querySelector('.container.of.subtree2').appendChild(this.subRoot2);

    this.state = { /* ... */ };
  }

  render() {
    return null; // renderしない
  }

  componentDidMount() {
    // マウント時にサブツリーをrenderする
    ReactDOM.render(<SubTree1 {...this.state} />, this.subRoot1);
    ReactDOM.render(<SubTree2 {...this.state} />, this.subRoot2);
  }

  componentDidUpdate() {
    // 更新時にはサブツリーも更新
    ReactDOM.render(<SubTree1 {...this.state} />, this.subRoot1);
    ReactDOM.render(<SubTree2 {...this.state} />, this.subRoot2);
  }

  componentWillUnmount() {
    // アンマウント時はサブツリー除去
    ReactDOM.unmountComponentAtNode(this.subRoot1);
    ReactDOM.unmountComponentAtNode(this.subRoot2);
  }

  componentWillReceiveProps(nextProps) {
    this.setState({ /* ... */ })
  }
}

const mainRoot = document.createElement('div');
ReactDOM.render(<MainTree {...dataForMainTree} />, mainRoot);
```

これが、

* マウント時にサブツリーをrenderしてOK
    * ちなみに``render()``内で``ReactDOM.render``したら、``componentDidUpdate``でやれと警告される
* ``ReactDOM.render``は[複数回実行してもいい感じに更新してくれる](https://facebook.github.io/react/docs/top-level-api.html#reactdom.render)
* ルートのコンテナdivは文書内に挿入しなくても動いてくれる （警告出ないし別にいいよね？）

というわけでうまく動く。

これで実際のツリー構造に依存せず自由自在にReact使える。便利！
HDR(映像規格)_とはなんなのか？　現状について調べてみたver1.0




#**概要~HDRとは何か~**

- 「High Dynamic Range（ハイダイナミックレンジ）」の頭文字
- 映像に記録できる**明るさ情報（輝度）のレンジ**を拡大する技術


#**明るさ情報のレンジを拡大するとは？**
- 私たちの暮らす現実世界では、太陽光や屋外の直射日光、ネオンを見るとまぶしさを感じる
- そのまぶしいほどの光を記録するために必要なのが輝度レンジ
- 現在は100nit(光を記録する範囲の事、nitは明るさの度合いを示す単位）の範囲までしか計測できない
- HDR技術では、最大で10000nitまでと、一気に約100倍も拡大できる
- 更にテレビもHDRに対応することで、現実さながらの光の世界をテレビで届けられる

###**つまり今までの１００倍の明るさの情報をHDR技術を使えば届けることができる**
>テレビから放たれる光が太陽のようなまぶしさをもたらし始めたら、単に情報量を増やす技術だった4Kを超えるインパクトにつながるだろう。





#**撮影技術「HDR」との違い**
 - 映像に実際に記録する輝度の幅も、薄型テレビに表示する最大輝度も両方拡大するのが異なるポイント



#**特徴、今までとの違い**
- 特徴・・HDRの導入でモニターの光情報すらも眩しく感じるほどの輝度をもたらす
- 今までとの違い・・今の技術の最大100倍の光情報(輝度)を届けることができる。

#**これから何に使われていく？**
####**次世代ブルーレイ**
日本の一般のユーザーが最初に入手できるHDRの映像は、2016年の初頭には登場しそうなメディアが現在のブルーレイディスクの次世代規格「UltraHD Blu-ray」になる見込み
>Ultra HD Blu-rayとHDRがもたらす次世代映像とは? - AV Watch http://av.watch.impress.co.jp/docs/news/20151009_724762.html

世界初のUltra HD Blu-rayタイトルは、パナソニック担当、ワーナーの「るろうに剣心 京都大火編」らしい
>Ultra HD ブルーレイ 映画「るろうに剣心」２作品のHDR化を担当 |　パナソニック映像株式会社 | Panasonic http://panasonic.co.jp/avc/pvi/hdr/rurouni.html


####**4KテレビのHDR対応**
(パナソニック、東芝、ソニー、LG、シャープは対応テレビリリース済み)
>本命は55V型〜の大画面。HDR対応機が出そろった今こそ4Kテレビの買い時！ – DIGIMONO！（デジモノ！） http://www.digimonostation.jp/0000050340/

#**導入する、していく企業**
・NETFLIX
>そしてHDR――CEOが語る「NETFLIX」のこれから (1/3) - ITmedia LifeStyle http://www.itmedia.co.jp/lifestyle/articles/1509/02/news161.html

・AMAZON
>Amazon Video To Start Streaming Dolby Vision HDR - Forbes http://www.forbes.com/sites/johnarcher/2016/03/10/amazon-video-to-start-streaming-dolby-vision-hdr/#31a204c25eed


・ひかりTV
>4K新サービスで先行する「ひかりTV」。HDRやIP放送の実力を鴻池賢三がチェック！ (1/3) - Phile-web http://www.phileweb.com/review/article/201602/25/1967.html

・名古屋テレビ放送
>ニュース - メ～テレが4K HDRコンテンツの「4K どうぶつ劇場」を制作、HDR対応4K編集室を活用：ITpro http://itpro.nikkeibp.co.jp/atcl/news/16/030900722/

・パナソニック、サムスン
>ASCII.jp：4K対応の次世代Ultra HD Blu-ray、来春3月を目指して着々と開発進む｜IFA 2015レポート http://ascii.jp/elem/000/001/047/1047013/


#**対応機種、機材**
・DisplayPort
>新バージョンのDisplayPort。8KディスプレイをHDRビデオで再生可 : ギズモード・ジャパン http://www.gizmodo.jp/2016/03/8khdr.html

・エーディテクノ
>エーディテクノ、4K60p/HDR対応で8出力の薄型HDMI分配器 - AV Watch http://av.watch.impress.co.jp/docs/news/20160311_747690.html

・HDMI
>HDMI 2.0a発表。HDR映像伝送に対応 - AV Watch http://av.watch.impress.co.jp/docs/news/20150409_696918.html



#**キーパーソン的な人**
・ドルビーの真野ディレクター
>いま注目の高画質化技術「HDR」とは何か？ に聞く - Phile-web http://www.phileweb.com/review/article/201503/17/1558.html


・ワーナー エンターテイメント ジャパン 福田太一
>「ハリウッドスタジオは、4K/UHDの解像度よりも、ピーク輝度や色をより良くしてきたいという意向が強い。それにより、監督の意図をそのまま伝えやすくなり、より感動を深めることを期待している」http://av.watch.impress.co.jp/docs/news/20151009_724762.html

#**今後どうなる?**

###**ハリウッドなどの映画撮影では標準になる**
 >HDRの導入を決めたのは、ハリウッドスタジオからの強い要望があったためという。2012年頃から4K対応の検討をスタートしたが、「半年後ぐらいに、ハリウッドスタジオからHDRを絶対入れる。そうじゃないと(4Kは)やらないという声が出た。当初は必要性に疑問というか、違和感があった。しかし、制作側の意見を聞くと、テレビを単に明るくして、という話ではなく、カメラのセンサーがすごく良くなってダイナミックレンジが拡大している。その映像をそのまま出したいという話。これは映像の大きな進歩。やろうとなった」という。

---

>「ハリウッドスタジオは、4K/UHDの解像度よりも、ピーク輝度や色をより良くしてきたいという意向が強い。それにより、監督の意図をそのまま伝えやすくなり、より感動を深めることを期待している」


ポスプロ機材について調べてもらえるかな。HDR対応の。
FileListをArrayのように扱う

最近FileAPIを使うことがあり、
「`FileList`って`Array`と似たようなもんやろ！！！！！」_（`forEach`ｯターン！！！)_
ってやったら見事に動かなかったので拡張した話を書きます。

# そもそもFileListってなにができんの
MDNを見ると。
https://developer.mozilla.org/ja/docs/Web/API/FileList
>この型のオブジェクトは、 `<input>` 要素の `files` プロパティによって返されます；これによって、 `<input type="file">` 要素で選択されたファイルのリストにアクセスできます。

ここだけ読むと完全に「`Array`継承してんじゃねこれ？」って感じがある。
読み進めると。

><img width="476" alt="スクリーンショット 2016-03-15 22.08.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/16065/e6537f98-66da-b812-3d65-2c57aa7a60d8.png">

**メソッドが一つしかない。**
なんでや。
ブラウザのコンソールで確認。
<img width="276" alt="スクリーンショット 2016-03-15 22.09.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/16065/416263bf-70bf-e846-7631-cb4ecc6160f5.png">
<img width="158" alt="スクリーンショット 2016-03-15 22.09.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/16065/3c8b5ace-cc77-2140-c7ed-b20b59d98b95.png">

**なんでや！**
**forで回すのなんて嫌や！！**
**いろいろ拡張してやる！！**

# 拡張する

単純に`prototype`に追加していけばいい感じになるはず。

```js
FileList.prototype.reduce = function(fun, initialValue){
  var result = initialValue;
  for(i = 0; i < this.length; i++){
    result = fun(result, this[i]);
  }
  return result;
}
```


たぶんこんな感じ。
ですが、`Array`で`reduce`が実装されてんだし、自分でわざわざ実装しなくてもいい気がするんだよなー。と僕は思いました。
なので、

```js
FileList.prototype.reduce = function(){
  return Array.prototype.reduce.call(this, ...arguments)
}
```

**こうした。**
ブラウザによっては動かないかもしれないが、Chromeでは動いた。

ほかの`map`等も同じようにやってけば
`FileList`で`Array`のメソッドを使えるようになると思う。
`push`とかは無理だと思う。

現場からは以上です。

# 追記
@think49 さんにコメントを頂きました！
http://qiita.com/merotan/items/1b94ba43c26a6c370661#comment-11fe5cf1b1d81087e017
>未検証ですが、Array.prototype.reduce の仕様を読む限りでは「故意に汎用的に」定義されているように見えますので下記コードでいい気がします。
[22.1.3.18 Array.prototype.reduce ( callbackfn [ , initialValue ] ) – ECMA-262 6th Edition](http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.reduce)

>```js
FileList.prototype.reduce = Array.prototype.reduce;
```
ただし、上記方法及び本記事で紹介されている方法はいわゆる**prototype汚染を誘発する**ので Object.defineProperty で {enumerable: false} を指定するとベターです。

`Object.defineProperty`でやってみた。


```js
Object.defineProperty(FileList.prototype, 'reduce', {
  value: Array.prototype.reduce,
  enumerable: false
});
```

こうすると良さそう。
ズンドコキヨシ with perl


# perlで作ってみます。

+ こんなんでいいんでしょうか？
+ forの中だけで作ってみました〜

```perl:zd.pl
use strict;
use warnings;
use utf8;
use Encode;

my @z = qw(ズン ドコ);
my $s;
for ( $s = ''; substr($s,-10) ne 'ズンズンズンズンドコ'; $s .= $z[int rand(@z)] ) {}
print encode('utf8',"$s キ・ヨ・シ！\n");
```

# ちなみに...

+ Macにはsayコマンドというのがあるので、

```shell
% perl zd.pl | say
```

+ と、打つと面白いですよｗ
curl参考サイトまとめ

[curlチートシート](http://qiita.com/miminashi/items/f48cd4c25b06fcab5ea3)

[curl を使って JSONデータをPOSTする](http://takuya71.hatenablog.com/entry/2012/11/10/143415)

[curl で JSON等のファイルを POST](http://hrysd.hatenablog.com/entry/2013/09/30/155219)

[WebAPIリクエスト仕様書としてcurlコマンドのご提案](http://qiita.com/Hiraku/items/dfda2f8a5353b0742271)

[cURL - Manual （マニュアル日本語訳）](http://www.hcn.zaq.ne.jp/___/unix/curl_manual.html)

[cURL - How To Use （マニュアルページ日本語訳）](http://www.hcn.zaq.ne.jp/___/unix/curl_manpage.html#O-upload-file)

[オブジェクトストレージ操作例：cURL](http://cloud.gmo.jp/docs/objectstorage/curl/)
PostgreSQL で id 配列の登場順に従って連番を割り当てる UPDATE 文を書きたい

データ準備
----

以下の様なテーブルを用意。

```
=# CREATE TABLE items (id SERIAL, value TEXT, sequence INTEGER);
CREATE TABLE
Time: 194.164 ms
```

初期データは以下の通り。

```
=# INSERT INTO items (value, sequence) VALUES ('A', 1), ('B', 2), ('C', 3), ('D', 4);
INSERT 0 4
Time: 8.454 ms
=# SELECT * FROM items;
 id | value | sequence
----+-------+----------
  1 | A     |        1
  2 | B     |        2
  3 | C     |        3
  4 | D     |        4
(4 rows)

Time: 12.149 ms
```


問：こういう感じ
----

id の配列 `[2, 3, 1, 4]` が与えられた時に、1 つの `UPDATE` 文で以下の結果を実現したい。

````
 id | value | sequence
----+-------+----------
  2 | B     |        1
  3 | C     |        2
  1 | A     |        3
  4 | D     |        4
````


案１：VALUES を使った場合
----

例えば、以下の様に `VALUES` を使って id と順番のペアからなるテーブルを組み立てる事ができる。

```
=# SELECT * FROM (VALUES (2, 1), (3, 2), (1, 3), (4, 4)) AS t (id, new_sequence);
 id | new_sequence
----+--------------
  2 |            1
  3 |            2
  1 |            3
  4 |            4
(4 rows)

Time: 0.361 ms
```

これを利用して `UPDATE` を書いてみる。

```
=# UPDATE items SET sequence = t.new_sequence
-#  FROM (VALUES (2, 1), (3, 2), (1, 3), (4, 4)) AS t (id, new_sequence)
-# WHERE items.id = t.id;
UPDATE 4
Time: 15.526 ms
=# SELECT * FROM items ORDER BY sequence;
 id | value | sequence
----+-------+----------
  2 | B     |        1
  3 | C     |        2
  1 | A     |        3
  4 | D     |        4
(4 rows)

Time: 11.036 ms
```


案２：JSON を使う
----

JSON で対応表を作って使ってみる。

```
=# UPDATE items SET sequence = ('{"2":"1","3":"2","1":"3","4":"4"}'::json->>id::TEXT)::INTEGER;
UPDATE 4
Time: 8.656 ms
=# SELECT * FROM items ORDER BY sequence;
 id | value | sequence
----+-------+----------
  2 | B     |        1
  3 | C     |        2
  1 | A     |        3
  4 | D     |        4
(4 rows)

Time: 0.411 ms
```

- [JSON関数と演算子](https://www.postgresql.jp/document/9.4/html/functions-json.html)


案３：array_position を使う(9.5+)
----

9.5 から `array_position` という関数が使えるので使ってみる。

```
=# UPDATE items SET sequence = array_position(ARRAY[2, 3, 1, 4], id);
UPDATE 4
Time: 8.854 ms
=# SELECT * FROM items ORDER BY sequence;
 id | value | sequence
----+-------+----------
  2 | B     |        1
  3 | C     |        2
  1 | A     |        3
  4 | D     |        4
(4 rows)

Time: 0.498 ms
```

- [9.18. 配列関数と演算子](https://www.postgresql.jp/document/9.5/html/functions-array.html)


没１：ROW_NUMBER と ORDER BY FIELD
----

MySQL の `ORDER BY FIELD` 相当の機能が使えれば `ROW_NUMBER() OVER (ORDER BY FIELD(id, [2, 3, 1, 4]))` な感じでいけるのではないかと妄想した。

```
=# SELECT ROW_NUMBER() OVER (ORDER BY id DESC), * FROM items;
 row_number | id | value | sequence
------------+----+-------+----------
          1 |  4 | D     |        4
          2 |  3 | C     |        3
          3 |  2 | B     |        2
          4 |  1 | A     |        1
(4 rows)

Time: 0.379 ms
```
AWS 学習コンテンツ

##AWS Answer
公式のベストプラクティスまとめ
これを日本語訳するだけで、AWSの常識的な使い方が分かる
あまり話題にあがらないが、かなり強力なコンテンツだと思う

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

##BLACK BELTシリーズ
毎週水曜日に開催のオンラインセミナー資料
セミナーごとに異なるプロダクトを紹介

https://aws.amazon.com/jp/about-aws/events/#webinar

##各機能のQ＆Aページ
ある程度サービスの機能を理解したら、Q&Aを読んでみる。
他の類似サービスの比較や勘違いしやすい点が一通り書いてある。
（個人的には、SQSのページにKenesisとの違いが書いてあるが、
その２サービスが似ている機能だということに気づいていなかったため、勉強になった）
https://aws.amazon.com/jp/faqs/

##AWS公式github
https://github.com/awslabs
Prism 6.1のダイアログにMahAppsのMetroWindowを使う

WPFのプログラムをMVVMパターンで記述する際に、ダイアログを用いたユーザーとの対話をどう記述するかについて[さまざまなアプローチがある](https://www.google.co.jp/search?q=wpf+mvvm+dialog)。そのうちの一つに、[PrismのInteraction Requestを用いる方法](https://msdn.microsoft.com/en-us/library/ff921081%28v=pandp.40%29.aspx)がある。

この方法でダイアログを表示するときの問題は、MahAppsのようなサードパーティのウィンドウを使っているときに、普通のウィンドウが使われてしまうため外観を統一できなくなることだ。

これを避けるには、まずPrismの`PopupWindowAction`を継承してサブクラスを作り、`CreateWindow()`をオーバーライドしてMahAppsの`MetroWindow`を生成する。ただし、`CreateWindow()`はPrism 6.0以降にしかないので注意してほしい。

```csharp
using System.Windows;
using MahApps.Metro.Controls;
using Prism.Interactivity;

namespace Sample
{
    internal class MetroPopupWindowAction : PopupWindowAction
    {
        protected override Window CreateWindow()
        {
            return new MetroWindow
            {
                Style = new Style(),
                SizeToContent = SizeToContent.WidthAndHeight
            };
        }
    }
}
```

どのダイアログにも共通するプロパティはここで指定しておく。`Style`には空のスタイルを設定しておかないと、なぜかダイアログを表示するタイミングで`ArgumentNullException`が出てしまう。

この`MetroPopupWindowAction`を、`InteractionRequestTrigger`のアクションとして指定する。表示するダイアログのスタイルは`WindowStyle`で指定する。ただし、`TargetType`で`Window`以外のクラスを指定できるのは、Prism 6.1からである。

```xml
<prism:InteractionRequestTrigger SourceObject="{Binding ConfirmationRequest, Mode=OneWay}">
    <local:MetroPopupWindowAction IsModal="True" CenterOverAssociatedObject="True">
        <local:MetroPopupWindowAction.WindowContent>
            <local:ConfirmDialog/>
        </local:MetroPopupWindowAction.WindowContent>
        <local:MetroPopupWindowAction.WindowStyle>
            <Style TargetType="controls:MetroWindow">
                <Setter Property="ResizeMode" Value="NoResize"/>
                <Setter Property="ShowInTaskbar" Value="False"/>
            </Style>
        </local:MetroPopupWindowAction.WindowStyle>
    </local:MetroPopupWindowAction>
</prism:InteractionRequestTrigger>
```

Prism 6.0より前でも、`PopupWindowAction`のソースコードを参考に`GetWindow()`をオーバーライドする形でサブクラスを定義すれば、同じことができるはずだ。
いまさらリーダブルコードまとめ（第４章）

# はじめに
チーム内リーダブルコード輪読会の第4章。
第3章は[こちら](http://qiita.com/sora083/items/b8b1da578713f006eb14)

# 第4章 美しさ
##どんな内容？
- 美しいコードとは、見やすいコード。誰が見てもわかりやすいコード記述を心がけよう
- たとえ「間違った」スタイルでも、一貫性をもつ方が重要である
- 美しく、優れた設計を目指そう～

##読んだ感想
自分でコードを記述する際には、「美しさ」をあまり意識して書いていなかったことに気付かされた。
ある程度は結構意識しないでもやってるよねーって感じだったが、一貫性をもってプロジェクト全体で統一感をもつと言うことが「正しい」スタイルを固持することより重要だということはあまり意識してなかった。
自分の「正しい」と思っていたスタイルが、もしかしたら全体として、統一感のない見にくいコードを助長していた可能性もあるんじゃないかって考えたりもした。

とにもかくにも、皆が意識して同じような目線でコーディングしていくことが大事で、その延長線上に正しく、美しい、そして設計的にも優れた（改修しやすく、理解しやすい）コードがあるのかなって思った。

リファクタリングの指針にもなりそう。。

##意識すべきルール
1.適切な改行位置
　→統一感が出るように、見やすく区切る
2.コメントの共通化
　→同じ意味なら、一つに纏める

例）シルエットを意識

```java:example1
public class PerformanceTester {
    public static final TcpConnectionSimulator wifi = new TcpConnectionSimulator(
           500, /* Kbps */
           80, /* millisecs latency */
           200, /* jiter */
           1 /* packet loss % */);

    public static final TcpConnectionSimulator t3_fiber = 
       new TcpConnectionSimulator(
           45000, /* Kbps */
           10, /* millisecs latency */
           0, /* jiter */
           0 /* packet loss % */);

    public static final TcpConnectionSimulator cell = new TcpConnectionSimulator(
           100, /* Kbps */
           400, /* millisecs latency */
           250, /* jiter */
           5 /* packet loss % */);
}
```
※本文より抜粋


3.共通部分のメソッド化
　→同じような処理があったら、共通メソッド化する
4.縦の線をまっすぐにする
　→変数の宣言、関数の引数部分等、連続する場合に縦の列をそろえる
5.変数の意味のある並び
　→関連する変数は近くに置く
6.ブロックで管理する
　→意味のある単位で空行を挟み纏めることで見やすくなる
7.一貫性を重視する
　→最後は全体の一貫性が通るようにする。ちぐはぐな書き方は一番駄目！？
ズンドコキヨシ with Transact-SQL

# Overview
SAP Sybase Adaptive Server Enterprise にて検証

# SQL
```sql
SET NOCOUNT ON -- 変数格納時に "(1 row affected)" がいちいち出力されるので、出さないようにしとく
DECLARE @zd varchar(20), @rand FLOAT
WHILE @zd != 'ズンズンズンズンドコ'
BEGIN
    print @zd
    SET @rand = RAND()
    SET @zd = RIGHT(@zd + CASE
                               WHEN @rand < 0.5 THEN 'ズン'
                               ELSE 'ドコ'
                          END
                       , 10)
END
SELECT @zd + 'キ・ヨ・シ！'
```

# 解説
* ズンドコの文字列, ランダム関数を格納する変数を定義
* WHILEで変数値が「ズンズンズンズンドコ」になるまでループ処理させる
* RAND関数は0.0〜1.0のFLOAT型のランダム値が返ってくるので、0.5未満だったら「ズン」、それ以外は「ドコ」を変数値に結合
* 結合した結果から後方10文字を取得して変数に格納して
* ループを抜けられたら、「キ・ヨ・シ！」を結合して、出力
ズンドコキヨシ with D

## alternative D

D言語のズンドコキヨシは[既にあります](http://qiita.com/kotet/items/9d170a372434caf0c876)が、ここでは再帰を用いた実装をしてみましょう。
DMDだと最適化オプションを付ける事で末尾再帰の最適化が行われます。

```d:kiyoshi
import std.stdio, std.random, std.algorithm;

enum zzzzd = "ズンズンズンズンドコ";

string zundoko(string zunzun)
{
    return zunzun.endsWith(zzzzd) ?
        zunzun ~ "キ・ヨ・シ！"
    :
        zundoko(zunzun ~ (dice(1,1) == 0 ? "ズン" : "ドコ"));
}

string zundoko()
{
    return zundoko("");
}

void main()
{
    zundoko().writeln;
}

```

[どこか](http://qiita.com/cedretaber/items/ceaa934fa17c65890e09)で書いたようなコードですね。これだと面白くありません。
なので、もっとD言語らしいコードにしてみましょうか。

D言語らしいコード……そう、CTFEですね！


```d:kiyoctfe
import std.stdio, std.random, std.algorithm;

template kiyoctfe()
{
    enum zzzzd = "ズンズンズンズンドコ";
    string zundoko()
    {
        auto rnd = Xorshift(0U.reduce!"a*9+b"(__DATE__ ~ __TIME__));

        string impl(string zunzun)
        {
            return zunzun.endsWith(zzzzd) ?
                zunzun ~ "キ・ヨ・シ！"
            :
                impl(zunzun ~ (uniform(0, 2, rnd) ? "ズン" : "ドコ"));
        }
        return impl("");
    }
    enum kiyoctfe = zundoko();
}

void main()
{
    writeln(kiyoctfe!());
}
```
[参考](http://dusers.dip.jp/modules/wiki/?Articles%2F%E7%A2%BA%E7%8E%87%E7%9A%84%E3%81%AB%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%92%E5%A4%B1%E6%95%97%E3%81%95%E3%81%9B%E3%82%8B)

コンパイル時に全ての計算を終わらせているので極めて高速です。

ただし、コンパイル時に結果が決まってしまうので、同じ実行ファイルを何度実行しても同じズンドコしか表示されないという欠点はありますが、しかし実行するまでは答えが分からないので問題ありません。むしろ実行して観測した時点で答えが収束すると考えれば毎回違う答えが出てくるよりも「正しい」実装だとは言えないでしょうか？　言えませんか……。

## おまけ

```d:noMain
...（略）...

/++
void main()
{
    writeln(kiyoctfe!());
}
++/

pragma(msg, kiyoctfe!());
```

これで`% dmd -O kiyoctfe.d -main`とかやれば問題解決ですね。

## まとめ
[ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)
777円の USB 3.0 オンオフスイッチ付きハブ


以前買った [USBをオンオフできるだけのスイッチ](http://qiita.com/hotchpotch/items/e7bb93abe526b25cff30)を多用してたんだけど、複数のUSBシリアル変換を扱って2個以上のUSBもスイッチさせたくなったので ebay で探したら安価な商品があったので買ってみた。

- http://www.ebay.com/itm/141857956082?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

![20160315-DSC04894.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/b33be82a-a198-3a1a-9aad-1df3cf0b50cb.jpeg "20160315-DSC04894.jpg")

- 6.64$。買った当時のレートで送料込み777円。
- 筐体は安っぽいプラスチック。軽い。
- スイッチは普通に使える
- USB 3.0 Micro-B ケーブル付きだけど USB 3.0 器機を持ってないため正常に動いてるのか試せず。USB 2.0 を MicroB で刺してそちらは正常に動くことを確認。
- INPUT が 110V-240V 50/60Hz で 5V1A 表記の AC/DC アダプタがついてる。日本の100Vでも一応動いた。AC アダプタが奥まで差し込めず5mmぐらいうく。おまけ程度に。

今改めて[On/Off Switches USB](http://www.ebay.com/sch/i.html?_odkw=On%2FOff+Switches&_osacat=0&_from=R40&_trksid=p2045573.m570.l1313.TR0.TRC0.H0.XOn%2FOff+Switches+USB.TRS0&_nkw=On%2FOff+Switches+USB&_sacat=0)で検索してみると、[USBの差し込み口が横の商品](http://www.ebay.com/itm/4-Port-USB-3-0-Hub-Splitter-Adapter-with-On-Off-Switch-For-Desktop-Laptop-GBNG-/161897427408?hash=item25b1d6b1d0:g:PXYAAOSwHQ9WVQpz)があって、机上で使うならこちらの方がかさばらなくて便利そう…。

またUSBシリアル変換ならUSB 2.0で十分なので、そちらなら300円前後で売ってるのでそれで十分だとも思った。
Twitterで「名前を付けて画像を保存」ができないときのブックマークレット　twitter getRawImage bookmarklet

画像が保存できるときと出来ないときがある？
ので、ぶっこぬきスクリプトを作ったよ！よかったね！

```js:getRawImage.js
javascript:var elm = document.querySelector('.media-image');var src = elm.getAttribute('src');window.open(src);
```
実行したら新規タブで画像が出る、でなかったらゴメンね。
いまさらリーダブルコードまとめ (第3章)

#はじめに
チーム内リーダブルコード輪読会の第3章。
前回は[こちら](http://qiita.com/IsaoTakahashi/items/a90edd72faf03b8b801c)
次回、「第4章 美しさ」は[こちら](http://qiita.com/tokutoku/items/c31d5de982fd9e7bae44)

#第3章 誤解されない名前
###どんな内容？
* 変数やメソッドには誤解されない名前をつけよう　→　最善の名前とは誤解されない名前
* 範囲や境界を表したい場合には適切な単語を利用しよう
* 複数の名前を検討しよう　→　名前を決める前に誤解されない名前かどうか想像してみよう

###読んだ感想
実際に自分でコード書いたものでもレビューなどで指摘されることが出てきてしまう「誤解されやすい名前」
`getXX`なのに値を取得して→処理して→セットまでしていたり、
`StringXX`という名前で日付型や数値まで処理してしまっていたり、
1個の小さな誤解が大きな間違いやトラブルのもとになってしまうこともあり得るので、
処理や利用場面ごとに「どんな名前にするべきか？」を気をつけないといけないなとあらためて認識。。

#例を挙げて議論してみよう
###「XXをしない」、「XXではない」を表現したい時

* 「メール送信しない」というフラグをどう表すべきか？

```java:1-1
boolean noSendMail;

booolean isNoSendMail() {
    return noSendMail;
}

if(isNoSendMail()) {
   メール送信させない場合の処理
   return;
}

```

`noXX`という変数が`true`なので「メール送信しない」というのを表現できている？
　→　trueの時にメールを「送るのかor送ってはいけないのか」パッと見でわかりづらい・・？

```java:1-2
boolean sendMail;

booolean isSendMail() {
    return sendMail;
}

if(!isSendMail()) {
    メール送信させない場合の処理
    return;
}

```
`sendMail`が`！(否定)`されているのでこの方が「メール送信しない」ということが分かりやすい？

###DAOにありがちな`getテーブル名`や`selectテーブル名`ってどうなんだろ？

ちょっとテーマとずれるかもですが、メソッドの命名で気になったところを1点
例えばこんなテーブルで・・

```text:HOTEL_MASTER_DATA
HOTEL_ID　　　　 NUMBER
HOTEL_NAME　　　 VARCHAR2
HOTEL_AREA　　　 VARCHAR2
HOTEL_ADDRESS　  VARCHAR2
HOTEL_MESSAGE　  VARCHAR2
HOTEL_OPEN_FLG　 NUMBER
DEL_FLG　　　　　NUMBER
INSERT_DATE　　  DATE
UPDATE_DATE　　　DATE
DELETE_DATE　　　DATE
```
全カラムを取得する場合は`getHotelDataMaster`や`selectHotelMasterData`などでOK？
`HOTEL_AREA`と`HOTEL_ADDRESS`だけや`HOTEL_ID`と`HOTEL_NAME`だけなどの一部のみを取得する場合に
`getHotelDataMaster`や`selectHotelMasterData`は適切だろうか？

小さい組織で閉じている場合や組織横断で汎用的に利用されているようなテーブルであれば、
テーブル名から内容をつかみやすい？？
例えば`HOTEL_AREA`と`HOTEL_ADDRESS`だけの場合は`getHotelSpotInfo`などより具体的な名前にすべき？？

#Appendix:議論で出てきたコメントなど
* 「XXをしない」、「XXではない」を表現したい時
例のようにメールを送信しない、させない場合には`escapeXX`、`skipXX`などはどうか？
デフォルトの状態を変数とするのが良さそう　→　例の場合は1-2、そうしない場合は同じような変数がたくさん出てきた時に混乱しそう・・
フラグをまとめて設定するクラスなどがあっても良いかも。。

* DAOにありがちな`getテーブル名`や`selectテーブル名`ってどうなんだろ？
ディレクトリを「テーブル名」で切りその下により具体性を持たせた名前のsqlファイルを作ると良いのでは？
DTOの名前が適切であればそこでカバーできそう
特定のパラメータをWHERE句に持ってくる場合は`XXByHotelId`といった感じや複数レコード返す場合は`getXXList`などでより理解しやすい名前を付けるのも検討するべきだと思う
AD2 > 10kHz方形波 > 10:1プローブ測定での振動 > 周期:18.017msec > 55Hz | プローブだけの計測 > 周期:60.37Hz

http://qiita.com/7of9/items/61d6c17611db21a11db2
の続き

```txt:動作確認
Analog Discovery 2 (以下 AD2)
Windows 8.1 pro (64bit)
```

プローブをｘ１０設定で使用時に電圧が8mVほど振動する件の調査。

## 振動の測定

時間軸を4.3ms/div程度にすると下のように波が見える。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/71ae08d5-339c-747d-4c3f-ee2fcdd41a52.png)

http://qiita.com/7of9/items/88205e498759006b6a17
で行ったようにだいたいの周期を測定してみた。
X２⊿1を赤線２本のように計測すると 18.017 msecとなった。

1000msec / 18.017msec = 55Hz 
測定が正確ではないのだが60Hzなのかもしれない。

AC電圧の放射を拾ってしまっているのだろうか。


## プローブだけの測定

Wavegenを使わずにプローブだけの測定をした。

参考 http://oshiete.goo.ne.jp/qa/95448.html

以下のようにプローブの先端をGNDと接続した。

![DSC_0154.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/740cd70c-6055-7901-3f9d-798ec2b4ca0f.jpeg)

以下の波形がScope1で得られた。

X2⊿1は16.563msec.
1000msec / 16.563msec = 60.37Hz

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4da892bd-536c-037e-1eb6-c8a4a15d9e0f.png)


AD2の機能でSpectrumを測ってみた。
60Hzにピークが出ている。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/12863154-62a5-4518-3ff9-0840f65055cd.png)
さくらサーバーからXserverにscpでサーバー間でファイル転送

# 最初に
いつもQiitaは見る専でしたがいつも助けていただいているので、誰かの役に立てばと初投稿します。使い間違い、ミス等あればお知らせください。

# 何がしたいのか
サーバーのデータをまるごと引っ越しする時、引越し元データ容量が1GBとかあってそれをFTPでダウンロードして引越し先にアップロード・・・とかもうあり得ないなあと。デザイナーだけど黒い画面使ってサーバー間でデータ転送できたらいいなあと思って調べました。
特にWordPressサイトでたくさんメディアアップしていると結構なサイズになるので、いちいちダウンロード/アップロードしていらんないなあと。
SCPでローカル/リモートのファイル転送はできることは知っていたのですが、サーバー間転送をググってやっていたところ躓いたので色々と調べたところ実現できたのでその時の内容を残しておきます。
殴り書きごめんなさい。あくまでデザイナー向けという目線での備忘録です。

# 前提条件
・引越し元サーバー
さくらインターネット

・引越し先サーバー
エックスサーバー

・SSH接続はできる

# いってみよう
## さくらサーバーにSSH接続してデータをまるごとバックアップ
さくらサーバーにSSH接続し（割愛）、まるごとディレクトリをtar圧縮します。さくらのwwwディレクトリを「www_bkup.tar.gz」という名称でまるごと圧縮する場合は以下のコマンド。
 
`$ tar cvzf www_bkup.tar.gz www`

このデータをエックスサーバーにもっていきます。

## エックスサーバーにSSH接続、公開鍵認証データのアップ
エックスサーバーにSSH接続します。ちなみにエックスサーバーは公開鍵認証での接続のため事前に設定しておく必要があります。これはウェブ上にやり方がたくさん落ちているので割愛します。

引越し先のディレクトリまでのパスを`pwd`等で確認しておきましょう。
下記のようなパスになると思います。

`/home/XSERVERのID名/ドメイン名/public_html/引越し先のディレクトリ`

## Xserverの公開鍵認証データをさくらサーバーにアップロード
すぐにでもSCPコマンドを使ってサーバー間でのファイル転送を行いたいところですが、前述のとおりエックスサーバーは公開鍵認証でのアクセスでないとSSH接続できません。
そのため、さくらサーバー側に公開鍵認証で必要な「id_rsa」データをアップロードします。

id_rsa
id_rsa.pub

ローカルに保存しているエックスサーバー用の上記ファイルをさくらの下記の場所へアップします。

`.ssh`

`www`と同じ場所にあるはずです。

## パーミッションの変更
id_rsaファイルをアップしたら、このままではパーミッションエラーでSCPが実行できないため、パーミッションを変更します。

`chmod 600 /home/サーバー名/.ssh//id_rsa`

id_rsaファイルを600にパーミッション変更します。
実行後特になにもおきません。

# SCPでサーバー間転送
これで準備が整いました。さくらサーバーからエックスサーバーにデータ転送します。
sshでさくらにログインし圧縮したtarデータの場所へ移動します。で、下記のSCPコマンドを打ちます。

`scp -i ~/.ssh/id_rsa -P 10022 ./www_bkup.tar.gz XserverのID@XserverのID.xsrv.jp:/home/XserverのID/ドメイン名/public_html/引越し先のディレクトリ`

うまく実行できれば公開鍵認証のパスワードを入力を求められ、パスワードを入力すると転送がスタート！

## 以下、簡単に補足を。

・`-i ~/.ssh/id_rsa`
公開鍵認証を利用して接続します。ファイルは.ssh配下の「id_rsa」。

・`-P 10022`
エックスサーバーはポートが10022でないと許可していないので、ポートを10022に指定。

・`./www_bkup.tar.gz`
先ほど圧縮したtarデータです。

・`XserverのID@XserverのID.xsrv.jp:/home/XserverのID/ドメイン名/public_html/引越し先のディレクトリ`
SCPの基本的な記述です。引越し先であるエックスサーバーの転送先を指定します。

# tarを解凍
最後に、引越し先に持って行ったtarデータを解答しましょう。

`tar vxzf www_bkup.tar.gz`

以上です。

# 終わりに
アップしたid_rsa, id_rsa.pubは削除しておきましょう。
もしかしたらid_rsa.pubはそもそもいらないかも。

不足あればお知らせください！

## 参考にしたサイト
・scpコマンドでサーバー間のファイル転送 | Weblogy http://blog.dacelo.info/linux/entry-651.html
・管理者必見！ ネットワーク・コマンド集 - scpコマンド：ITpro http://itpro.nikkeibp.co.jp/article/COLUMN/20070723/277943/?rt=nocnt
・SCPとSFTPの違い | サバカン屋テックブログ http://www.skyarch.net/blog/?p=379

## 追記：他のサーバーでもいけるはず！
パスなどは違えど、他のサーバーでも仕組みは同じなのでいけるはずです。例えばコアサーバー→XserverでもSCP接続を確認できました。