OmniAICreator/Qiita-1.07M huggingface dataset:
今更casperJSで遊んでみた〜phpから実行して引数を受け渡す〜

# はじめに

今更ですが、casperJSを使って色々試していたのですが
案外一連の流れでまとまっている記事がなかったのでメモとして残しておきます。
今回はPHPから引数を指定してjsを実行させて、その際渡した引数をjs側で受け取る方法。

#　書き方

```sample.php
$isSuccess = false;

$targetDate = '2017-03-27';
exec('casperjs sample.js ' . $targetDate, $resultData, $result);

// execの返値は正常の場合のみ0が返る
if ($result === 0) $isSuccess = true;
```

```sample.js
var casper = require("casper").create();
var param = casper.cli.args[0];
console.log(param); // 2017-03-27 
```

# ポイント

* execを使ってjsの実行結果を受け取るようにするとエラー判定も可能
* casper.cli.argsは配列の為、引数が複数ある場合はcasper.cli.args[1]等指定してあげるとよい。

# 関連記事

[今更casperJSで遊んでみた〜cookieログイン編〜](http://qiita.com/axm-aoki/items/8bb2132ba771f4b3c6d4)
今更casperJSで遊んでみた〜cookieログイン編〜

# はじめに

今更ですが、casperJSを使って色々試していたのですが
案外一連の流れでまとまっている記事がなかったのでメモとして残しておきます。
今回はよく使いそうなcookieを使ってログインする方法。
そしてログイン後ちゃんと表示されるまで待機させてからキャプチャーを取るようにしています。

#　書き方

```
var casper = require("casper").create();
var fs = require('fs');

var loginUrl = "https://example.com/login.php";
var cookieFile = '/tmp/cookie.txt';

var userName = 'hoge';
var password = 'huga';

if (fs.isFile(cookieFile)) {
    var data = fs.read(cookieFile);
    phantom.cookies = JSON.parse(data);
}

casper.start(loginUrl, function(){
    casper.waitFor(isLoginDisplayed, function() {
        var cookies = JSON.stringify(phantom.cookies);
        fs.write(cookieFile, cookies, 644);
        this.fill('form',
            {user_name: userName, password: passWord},
            true
        );
    });
});

casper.waitFor(isTopDisplayed, function(){
    this.capture('capture.png');
});

function isLoginDisplayed() {
    return this.evaluate(function () {
        return document.getElementById('login') != null;
    });
}

function isTopDisplayed() {
    return this.evaluate(function () {
        return document.getElementById('top') != null;
    });
}
```

# ポイント

当たり前っちゃ当たり前で大したポイントでもないけれど・・・

* cookieの保存場所(tmp等)を決めておき、毎ログイン時に読み書きを行うようにする。
* waitForを使って想定している画面が表示されたのを確認してから次の処理を実行させるようにする。

⇒例えば、表示されるはずの画面内だけに存在する要素を指定し、その要素が確認できたら次の処理をさせる

# 続編

[今更casperJSで遊んでみた〜phpから実行して引数を受け渡す〜](http://qiita.com/axm-aoki/items/b63291a34de0879ba3bf)
フォルダ内のpng画像の背景を透明にした時のメモ[Mac]


## ImageMagickのインストール

```
$ brew install imagemagick
```

## RMagickのインストール

```
$ gem install rmagick
```

## スクリプト

```convert.rb
require 'RMagick'

files = Dir.glob('*.png')
files.each do |filename|
    original = Magick::Image.read(filename).first
    image = original.matte_replace(0, 0) # 背景を透明にする。
    image.write(filename)
end
```

## スクリプトの実行

```
$ ruby convert.rb
```
MySQLで気軽に重いクエリを確認する


よく知らないプロジェクトに、ちょっとした変更を加えるとする。
一応、負荷的に問題がなさそうかを見るため、発行されるクエリすべてと、indexがついていないクエリを抽出したい。

[my.cnfなどをいじってlogを出力](http://qiita.com/tomoyamachi/items/3bd2242cb755fcecbf28)してもいいが、ちょっと面倒である。

そういうとき、一時的にmysql.slow_logテーブルを利用すると便利。
毎回コマンドを忘れてしまうためメモ。


## indexがついていないクエリを確認する
### 設定

```mysql
set global long_query_time = 1; -- 秒数は任意で設定
set global log_queries_not_using_indexes = on; 
set global log_output = 'TABLE';
set global slow_query_log = ON;
```

### 確認


```mysql
SELECT * FROM `mysql`.`slow_log` WHERE db <> "mysql"; -- 自身が実行したクエリは除外
```

## [おまけ]すべてのクエリを確認する

### 設定

```mysql
set global long_query_time = 0;
set global log_output = 'TABLE';
set global slow_query_log = ON;
```
Gitの基本


#新しくリモートを追加するとき

リモートとして登録したいリポジトリのURLをコピーして、以下のコマンドのURL部分に当てはめればOK。

```
git remote add [名前] URL
```

#リモートの確認

push先の名前とURLを確認するときに使う

```
git remote -v
```

基本的にcloneしてきたリポジトリがリモートに `origin` として登録されてるはず。

#リモートの削除

`upstream` をリモートから削除したいときは以下のコマンド

```
git remote rm upstream
```

#pushする

`origin` にpushするときは

```
git push origin master
```

#pullする

`upstream` からpullするには

```
git pull upstream master
```
SublimeText3でUTF-8のLaTeX環境を構築する（Mac）

# 確認済みのバージョン
- macOS Mojave
- Sublime Text 3
- MacTex2019

# 手順
- MacTex2019のインストール（時間かかります）

``` shell
brew cask install mactex
```

- PDF ViewerのSkimをインストールする

``` shell
brew cask install skim
```

- Sublime Text 3をインストールする
- SublimeにPackage ControlをインストールしてLaTeXToolsをインストールする

- Sublimeのメニュー[Preferences]->[Package Settings]->[LaTeXTools]->[Settings-User]を選択してLaTeXTools.sublime-settingsのbuidlder_settingsの部分を下記のように編集する

```py:LaTeXTools.sublime-settings
	"builder_settings" : {

		// General settings:
		// See README or third-party documentation
		
		"command" : ["latexmk", "-cd",
				"-e", "$latex = 'platex %O -no-guess-input-enc -kanji=utf8 -interaction=nonstopmode -synctex=1 %S'",
				"-e", "$biber = 'biber %O --bblencoding=utf8 -u -U --output_safechars %B'",
				"-e", "$bibtex = 'pbibtex %O %B -kanji=utf8'",
				"-e", "$makeindex = 'upmendex %O -o %D %S'",
				"-e", "$dvipdf = 'dvipdfmx %O -o %D %S'",
				"-f", "-%E", "-norc", "-gg", "-pdfdvi"],

		// (built-ins): true shows the log of each command in the output panel
		"display_log" : false,

		// Platform-specific settings:
		"osx" : {
			// See README or third-party documentation
		},

		"windows" : {
			// See README or third-party documentation
		},

		"linux" : {
			// See README or third-party documentation
		}
	},
```

# 確認
下記のソースをコピペして`Ctrl+b`を押し、Skimが起動すればOKです。
初回はビルド方法を聞いてくるので`Build With LaTeX - Traditional`を選ぶ。[Tool]->[Build With...]からもビルド方法の選択は可能です。

```tex:sample.tex
\documentclass[a4j,12pt]{jarticle}

\title{ {\LaTeX} サンプルファイル}
\author{長谷川大}
\date{\today}
\begin{document}
\maketitle

\section{はじめに}
ハローワールド！

\section{おわりに}
ハローワールド！

\end{document}
```
[iOS] README の手順を削除して install.sh を作成して環境構築をしやすくする

# 今までの README

```
# 環境構築

下記手順を実行してください。

1. bundle install --path vendor/bundle
2. brew update
3. brew install carthage
4. brew install imagemagick
5. brew install graphicsmagick
4. bundle exec fastlane match

上記手順が完了したら hoge.xcworkspace を開いてください。
```

これが普通だけど、 [クックパッドのiOSアプリ開発を加速させるスクリプト群](http://techlife.cookpad.com/entry/2017/03/01/192756) を読んで開発環境を構築するスクリプトがあるといいなあと思ってやったらいい感じになった。

# 新しい README

```
# 環境構築

下記コマンドを実行すると環境構築が完了し xcode が起動します。

$ ./scripts/install.sh
```

これだけで済む、今までつらつら書いていた手順も install.sh を読んでくれればすぐ理解できるし、 README は綺麗になり環境構築は簡単になり大変良い。

5分あればできるので、空いた時間でやってみてはいかがでしょう :muscle: 

# 実際の install.sh

こんな感じで書きました。

```bash
#!/bin/sh

echo "bundle install --path vendor/bundle"
bundle install --path vendor/bundle

echo "brew update"
brew update
echo "brew install carthage"
brew install carthage
echo "brew install imagemagick"
brew install imagemagick
echo "brew install graphicsmagick"
brew install graphicsmagick

echo "open hoge.xcworkspace"
open hoge.xcworkspace

echo "bundle exec fastlane match"
echo "パスワードを聞かれたら例のアレを入力してください"
bundle exec fastlane match
```
pythonでchromeを起動させる


※他サイトのコンテンツをクローリングしてきて、ちょっとだけ変えて、あたかもオリジナルのように振舞う、そんな悪質なクローリングはやってはだめ、ぜったい

pythonでクローリングのプログラムを書く場合は、下記のような感じ。
※今回は試しでGoogleで適当な検索ワードを使って検索する方法

今回はchromeを使うので事前に

https://sites.google.com/a/chromium.org/chromedriver/downloads

から環境に合わせたドライバーをＤＬし、格納しておく必要がある。
※下記ではオプションでＤＬ先の指定をしているが、必要ない場合ははずしてもＯＫ
※エラーとかでうまくdriverを閉じれないとどんどんバックグラウンドで走るchrome.exeが増えていってメモリを圧迫するので、簡単なエラー処理入れといたほうが良い。



```python
from selenium import webdriver
import time
import traceback

try:
    dl_folder_path = "ファイルをＤＬするときのパス"
    chromedriver = "ドライバーの格納パス"
    search_text = "検索ワード"
    prefs = {
        "download.default_directory": dl_folder_path}
    chromeOptions = webdriver.ChromeOptions()
    chromeOptions.add_experimental_option("prefs", prefs)
    # chromeを起動しサイトへ移動
    driver = webdriver.Chrome(chromedriver, chrome_options=chromeOptions)
    driver.get(
        "https://www.google.co.jp/")
    time.sleep(2)
    # 検索窓の取得
    serachBox = driver.find_element_by_name("q")
    #　検索ワードの入力
    serachBox.send_keys(search_text)
except Exception as e:
    print(traceback.format_exc())
    driver.close()
    driver.quit()
```
Route53 上の DNS レコードを、GitHub 上の JSON ファイルで管理できるようにした


僕は、[Wacker](http://wacker.io/) というコミュニティで活動していて、最近そのコミュニティでいくつかのプロジェクトをはじめて、それに対するサブドメインを GitHub Pages などで発行するシチュエーションがありました。

そこで、コミュニティドリブンな感じでうまいことDNS サーバー上のサブドメインの管理を自動化できないかなーと思い、GitHub 上にある JSON をもとに DNS レコードをアップデートするようにしてみました。

https://github.com/wakayama-hacker/r53

上のリポジトリをフォークして以下の要領で適当にカスタマイズしてください。

## 仕組み

GitHub 上に以下のような JSON をコミットします。

```
{
  "records": [
    {
      "Name": "wacker.io",
      "Type": "A",
      "TTL": "300",
      "ResourceRecords": [
        {
          "Value": "192.30.252.153"
        },
        {
          "Value": "192.30.252.154"
        }
      ]
    },
    {
      "Name": "wmap.wacker.io",
      "Type": "CNAME",
      "TTL": "300",
      "ResourceRecords": [
        {
          "Value": "wakayama-hacker.github.io"
        }
      ]
    },
    {
      "Name": "latlng.wacker.io",
      "Type": "CNAME",
      "TTL": "300",
      "ResourceRecords": [
        {
          "Value": "wakayama-hacker.github.io"
        }
      ]
    },
    {
      "Name": "kushimap.wacker.io",
      "Type": "CNAME",
      "TTL": "300",
      "ResourceRecords": [
        {
          "Value": "miya0001.github.io"
        }
      ]
    }
  ]
}
```

`records` に配列で DNS レコードを保存してることがわかると思います。

あとは、これを node で作ったスクリプトで読み込んで、Route53 の API を蹴っ飛ばす感じ。

```
$ npm install
$ npm run deploy
```

スクリプトのソースは以下の URL にあります。

https://github.com/wakayama-hacker/r53/blob/master/r53.js

## Travis CI で自動発火

あとは Travis CI で `master` にマージされるたびに発火するようにします。

### IAM でユーザーをつくる

Travis CI から Route53 の API を蹴っ飛ばすようにポリシーを作ります。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1490535720000",
            "Effect": "Allow",
            "Action": [
                "route53:ChangeResourceRecordSets",
                "route53:ListResourceRecordSets"
            ],
            "Resource": [
                "arn:aws:route53:::hostedzone/<Your Hosted Zone ID>"
            ]
        }
    ]
}
```

万が一の時のために、対象のゾーンを限定しています。

### Travis CI でリポジトリを有効化

Travis CI で対象となる GitHub リポジトリを有効化し、さらに以下のように IAM 用のアクセスキー等を環境変数として登録します。

![](https://www.evernote.com/l/ABXLCVDevkdEA515FC0QNX-QPu00Rb0kZIwB/image.png)

登録すべき環境変数は以下の通りです。

* `AWS_ACCESS_KEY_ID`
* `AWS_SECRET_ACCESS_KEY`
* `HOSTED_ZONE_ID`

`HOSTED_ZONE_ID` は、Route53 の DNS のゾーンに割り当てられてる ID です。

AWS CLI をセットアップ済みであれば以下のコマンドで取得できます。

```
$ aws route53 list-hosted-zones
```

### .travis.yaml

`.travis.yml` には以下のように記述します。

```
language: node_js
node_js:
- '7.6'

branches:
  only:
    - master

before_script:
- npm install

script:
- npm run deploy
```

## ローカルで試す

ローカル環境でためすには `direnv` が便利です。

```
$ brew install direnv
```

あとは、プロジェクトのディレクトリに以下のような内容のファイルを `.envrc` というファイル名で設置してください。

`.envrc` は絶対に GitHub にあげたらダメです。

```
export HOSTED_ZONE_ID=xxxx
export AWS_ACCESS_KEY_ID=xxxx
export AWS_SECRET_ACCESS_KEY=xxxx
```
gifアニメの合成速度比較メモ

# 環境
* PHP 5.6

# 条件
* 22枚のpngまたはgif画像をgifアニメ化
* GraphicsMagickとgifsicleはPHPのexecから実行

# 結果
| 方式           | pngからの合成時間(秒) | gifからの合成時間(秒) |
|:---------------|----------------------:|:---------------------:|
| Imagick        | 10.429203987122       | 0.30590009689331      |
| GraphicsMagick | 2.0810239315033       | 0.22868084907532      |
| gifsicle       | 未対応                | 0.28129196166992      |

# まとめ
* Imagickはpngからgifアニメを作ると遅い。
* gifからの合成はそんなに体感速度の差はない。
* pngからでもそこそく速度のでるGraphicsMagickが最強？
Rails 環境構築に関するあれこれ

Rails 環境構築に関するあれこれのMEMOです。

# homebrew
Homebrewは、Mac OS上でのソフトウェア管理を行うソフトウェアのこと。
ターミナルからコマンドを打つことで、インターネット上からアプリケーションをインストールしたり、そのバージョン管理をすることができる。

参考：[homebrewとは何者か。仕組みについて調べてみた](http://qiita.com/omega999/items/6f65217b81ad3fffe7e6)
参考：[Homebrewを使ってプログラミング環境を構築しよう！（コマンドライン初心者向け）](http://qiita.com/KeitaNakamura/items/a85af86688c04e49d208)

# rbenvとruby-build
rbenvとruby-buildは、Rubyのバージョンを管理する際に合わせて使用する。
通常、Macには1つのバージョンのRubyしかインストールできないが、rbenvとruby-buildを組み合わせて用いることで、
複数のバージョンのRubyをインストールでき、またプロジェクトごとに切り替えて使用できるようになる。

ruby-build → 様々なバージョンをインストール。
rbenv → バージョンの切り替え。

参考：[Ruby を使うなら「rbenv」で複数バージョンを切り替えられるようにしておこう](https://h2ham.net/ruby-rbenv)
参考：[rbenvでRubyを管理し、Rails開発環境を構築する](http://mae.chab.in/archives/2612)

# bundler
gemのバージョン管理をするgem。
環境ごとに使用するgemを決めたり、gemのバージョンを指定したりする。

参考：[Bundlerの使い方](http://qiita.com/oshou/items/6283c2315dc7dd244aef)

# ビルド

ざっくりと。わかりやすい。
> １．人間語でプログラムの元ネタ（ソースコード）を書く
> ２．ソースコードを人間語から機械語に翻訳する（コンパイル）
> ３．コンピュータさんが翻訳された指示に従ってお仕事する（実行）

引用：[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](http://wa3.i-3-i.info/word12775.html)

# rakeコマンド

> rakeコマンドはRakeと呼ばれるビルドツールを実行するためのコマンドです。ビルドツールと紹介しましたが、実際のところその他の定型表現を実行するためのコマンドとして利用されることもよくあります。

定型作業をまとめてコマンドで簡単に実行できるようにする感じですかね。

引用：すがわらまさのり 他 著 (2014) 「パーフェクト Ruby on Rails」 技術評論社
参考：[るびくる＆RBのRubyプログラミング大作戦！
ファイルを扱う作業をRakeで便利にしよう！（パート1：概要編）](http://rubicle.net/rubicle_talk_1-1.html)
WEBrickでCORS

- サーバーインスタンス生成時のオプションに、レスポンスヘッダーにCORSのヘッダーを出力するように指定
    - `*` ですべてのドメインを許可
    - 下記ではポート3000を指定

```sh
ruby -rwebrick -e "WEBrick::HTTPServer.new( DocumentRoot: '.', Port: 3000, RequestCallback: Proc.new{|req,res| res['Access-Control-Allow-Origin'] = '*' } ).start"
```

- ユースケース
    - revealjsを使っていて、xxxx.mdのデータをajaxで雑に取得したかった。ローカルでnginxを起動する、nodejsで`serve -C`するなど考えたが、普段Rubyをよく使うのでこれが導入しやすかった。
Pythonでディレクトリを確認し移動する

#Pythonの操作とディレクトリ
Pythonを操作するに当たり、データファイルを読み込むときは、
当該ファイルが格納されたディレクトリをカレントディレクトリとする必要がある。
このメモでは、既にデータが格納されたディレクトリを、
カレントディレクトリとして設定する方法を記す。

#OSモジュールのインポート
ディレクトリを操作するには、```os```モジュールを```import```する必要がある。
以下の文を入力。

```py3
import os
```

以下で、まずカレントディレクトリがいまどこに設定されているかを確認し、次に読み込みたいデータが格納されているディレクトリをカレントディレクトリに設定する。

#カレントディレクトリの確認

```py3
os.getcwd() 
```

結果は以下。

```pycon
>>> os.getcwd()
'C:\\Users\\ozspade\\AppData\\Local\\Continuum\\Anaconda3\\Scripts'
```

こんなところに分析用データは置いていない。
私がデータを置いたのは以下だ。

```
C:\\Users\\ozspade\\Documents\\PythonScripts
```

ここをカレントディレクトリに設定する。

#ディレクトリの移動
以下のように入力する。

```py3
os.chdir("C:\\Users\\ozspade\\Documents\\PythonScripts")
```

これで設定は完了、再びカレントディレクトリを確認してみる。

```pycon
>>> os.getcwd()
'C:\\Users\\ozspade\\Documents\\PythonScripts'
```

無事分析データが置いてあるディレクトリを指定出来た。
めでたしめでたし。

#リファレンス
[KURA IT LAB](https://sites.google.com/site/kuraitlab/programing-language/python/file-operations)
RDSにおけるレプリカの昇格について

RDSにはPromote Read Replicaという機能があり、リードレプリカで動いてるサーバをマスターに昇格させることができる機能がある。
しかしその際に起こる挙動はしっかり把握しておかなければトラブルの元になるので機能としてではなく、アーキテクチャとしてしっかり把握しておく必要がある。
今回はRDSのMySQLのサポートが切れるということだったので、その際に検証したことを記録として残します。
https://aws.amazon.com/jp/blogs/news/amazon-rds-mysql-56x-minor-version-announce/

サポート切れとかの対応方法は運用前に計画しておくことが望ましいので、Promote Read Replicaの挙動を知っていただけたらと思います。

## 想定シナリオ
MySQL 5.6.19aでマスターサーバ1台で動いているサービスがある(MultiAZの有無は問わない)
MySQL 5.6.19aをMySQL 5.7.16 にアップグレードしたい

## 作業内容
1. 現在動いている MySQL 5.6.19a のレプリカを作成する
2. レプリカを 5.7.16 にアップデートする
3. レプリカを昇格させる
4. アプリケーションのソースコードを修正し、昇格した方にDBを向ける

## 挙動
### スレーブを昇格させる時の挙動について
まずスレーブを昇格させるにあたって5分ぐらいスレーブにダウンタイムが発生する
これはサーバの再起動になる

## マスタースレーブの関係性
マスタースレーブの関係性だが、マスターとスレーブが入れ替わるのではなく、スレーブが独立する形になる。
そのため昇格コマンドを実行したタイミングからスレーブへのデータ反映は一切されず、その時点のデータを持った状態で新しいインスタンスが立ち上がるということになる。
データのズレが発生するとすればその5分間の書き込み + アプリケーションのDBの向き先を変更するまでの時間になる

## 発生する問題点
- データが破損する？
  - しない(但し、MySQLの外側、例えばS3とかとデータが連動している場合は発生するかも)

- Endpointの修正が必要か
  - 必要、新しいインスタンスが立ち上がってくるわけなので、新しいインスタンスに向ける必要がある

- 昇格時にエラーが発生しないか
  - しない
  - しないがデータは新しいDBに反映されない

## まとめ
INSERTが任意のタイミングでしか発生しないサービスであればダウンタイム0でMySQLのバージョンアップは可能であると思われる。
PHP7 + Laravel5.4 で作るLaravelフレームワーク on さくらVPS

PHP7でLaravel5.4環境を構築した時の備忘録です。

# 1. Composer
Laravelインストールに必要なComposerをダウンロード

```
$ curl -sS https://getcomposer.org/installer | php
```

どこからでも起動できるように、パスの通ったディレクトリに移動

```
$ mv composer.phar /usr/local/bin/composer
```

Composerコマンドの確認（バージョン確認）

```
$ composer -version

   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.4.1 2017-03-10 09:29:45
```

# 2. インストーラ―

インストーラ―のダウンロード

```
$ composer global require "laravel/installer"
```

パスを通す

```
$ echo 'export PATH=~/.config/composer/vendor/laravel/installer:$PATH' >> ~/.bash_profile
```

反映

```
$ source .bash_profile
```

laravelコマンドの確認

```
$ laravel

Laravel Installer 1.3.3
```

# 3. Laravelのプロジェクト作成

プロジェクト作成するディレクトリに移動（/var/www）

```
$ cd /var/www
```

プロジェクト作成（laravel）

```
$ laravel new laravel
```

※/var/www/laravel が、今回作成したプロジェクトになります

## エラーになった場合
phpのzip拡張機能のインストールを促されるエラーが出ることがあります

```
  [RuntimeException]
  The Zip PHP extension is not installed. Please install it and try again.
```

pearコマンドを入れて、同時にpeclコマンドを使えるようにして、zipインストール

```
$ yum install php-pear --disablerepo=* --enablerepo=remi-php70
$ yum -y install zlib-devel
$ yum -y install cc gcc
$ pecl install zip
```

php.iniにextension=zip.soを追記

```
$ vi /etc/php.ini

[zip]
extension=zip.so
```

改めてプロジェクト作成

```
$ laravel new laravel
```

# 4. Laravelバージョン確認

※プロジェクト作成したディレクトリに移動しないとartisanは使えない

```
$ cd /var/www/laravel
$ php artisan --version

Laravel Framework 5.4.15
```

# 5. httpd.confの変更

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

// ドキュメントルートを/var/www/laravel/publicへ変更
DocumentRoot "/var/www/laravel/public"

// Directoryも同様に変更
// AllowOverride All でhtaccessを有効化。
<Directory "/var/www/laravel/public">
    AllowOverride All
    Require all granted
</Directory>
```

# 6. オーナー・権限の変更

apacheユーザーへの変更と、ログ書き込み先の権限変更

```
$ chown -R apache:apache /var/www/laravel
$ chmod -R 775 /var/www/laravel/storage
$ chmod -R 775 /var/www/laravel/bootstrap/cache
```

# 7. 動作確認
サイトトップURLにアクセスしてLaravelが表示されれば、OKです。

![laravel.png](https://qiita-image-store.s3.amazonaws.com/0/142172/f52f2677-9668-08f5-5c22-9810e85326ef.png)
math > down arrow notation > matrix to vectors > w = vec(W) = \downarrow{W}

[Learning in Multidimensional Spaces — Neural Networks.
Matrix Formulation](http://users.monash.edu/~app/Lrn/LearningMDS.pdf)

式 (2.5)

```math
w = vec(W) = \downarrow{W}
```

W: matrix
w: vectors

matrixからvectorに変換する時の表記として使われている。

こういう表記は初めて見た。

http://mathworld.wolfram.com/DownArrowNotation.html
とも違うようだ。
Hubotを使ってslackにメモ機能を実装する

## あらまし

slackで個人的なメモとして自分にDMを送っている人は多いと思います。
ただ、とあるチャンネルから直接メモを残したい！ってときに、
わざわざ自分のDMを開くのは手間ですよね。
/dmコマンドを使えば、そのチャンネルから送ることができますが、
コマンド実行後にDMの画面が開くので使いづらい・・・。
ってことで、メモ用のBotを作りましょう。

## 実現方法

あるキーワードを先頭に持ってくると、それに反応して、
自分にDMを送ってくれるBotを作れば実現できそうです。

今回はHubotを使って、「memo」というキーワードに反応するbotを作りました。

## ソース

```coffeescript
module.exports = (robot) ->
  robot.hear /.*\s?memo\s(.+)/i, (res) ->
    room = robot.adapter.client.rtm.dataStore.getDMByName res.message.user.name
    robot.messageRoom room.id, res.match[1]
```

## 動作確認

実装したBOTを起動して早速動作確認・・・

![image](https://qiita-image-store.s3.amazonaws.com/0/22648/88456437-b5d7-11af-d1d6-ce3d2e828600.png)

実際にBOTとのやり取りを見てみると・・・

![image](https://qiita-image-store.s3.amazonaws.com/0/22648/eeff1c16-ad1e-658e-1070-79c13b31cd6a.png)

## おわりに

簡単なメモBOTが出来ました。
slackのメモコマンドが出来たら一番良いんですけどね・・・。
SQL Severで中間テーブルを作成する方法


サービス規模が大きいと、分析案件などで複雑なクエリを実行する場合、中間テーブルが必要になる場合が多々ある。SQL Severで初めてやったので忘れないと思うけど、一応備忘録を残す。
into テーブル名

#テーブル名　・・・ローカル
##テーブル名　・・・グローバル

```sql
select A.column1 , column2 column3
into #テーブル名
from
tableA join tableB]
on A.column1 and B.column1
Pacemakerのフェイルオーバ時にLINEに通知してみた

Pacemakerのフェイルオーバの際に、よく`MailTo`リソースエージェントを使ってメール通知を行いますが、メールだけではなくLINEグループにも通知をしたいと思います。

#バージョン
Pacemaker：1.1.12
Resource-Agents：3.9.6

# 準備
## Line Notifyの準備
Line Notifyの設定については、以前書いたものがあるので、それを参考にしてください。
参考： [fail2banのban通知をLine Notifyを使ってLINEグループに通知する](http://qiita.com/htakeda/items/7552cae4363ec365a794)

今回は、トークン名は**TEST**、グループ名は**Pacemaker**でトークンを作成しました。

![pacemaker-line.png](https://qiita-image-store.s3.amazonaws.com/0/151669/09c8c06a-d52b-6db9-85ad-1cf97ad15a74.png)


## リソースエージェントの準備
今回は、`MailTo`リソースエージェントをコピーしたものを編集します。 

MailTo2ファイルをコピーして作ります。

```
# cp /usr/lib/ocf/resource.d/heartbeat/MailTo /usr/lib/ocf/resource.d/heartbeat/MailTo2
```

MailTo2リソースエージェントを編集します。
`curl -X POST`の行を、`MailToStart()`と`MailToStop ()`それぞれ1行ずつ追加します。
`XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'はLine Notifyで取得したトークンに差し替えます。

```/usr/lib/ocf/resource.d/heartbeat/MailTo2
MailToStart() {

        Subject="`SubjectLine $subject` Takeover in progress at `date` on $us"

        MailProgram "$Subject" $1
        curl -X POST -H 'Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' -F "message=Hi! Takeover in progress at `date` on $us" https://notify-api.line.me/api/notify
        ha_pseudo_resource MailTo_${OCF_RESOURCE_INSTANCE} start
}

MailToStop () {
        Subject="`SubjectLine $subject` Migrating resource away at `date` from $us"

        MailProgram "$Subject" $1
        curl -X POST -H 'Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' -F "message=Hi! Migrating resource away at `date` on $us" https://notify-api.line.me/api/notify
        ha_pseudo_resource MailTo_${OCF_RESOURCE_INSTANCE} stop
}
```

##確認
MailToから、先ほど作ったMailTo2に変更もしくは追加して、確認してみます。

うまく設定できていれば、フェイルオーバ(もしくはマイグレート)する度に、メールだけではなく、LINEグループにも通知が届きます。


<img width="768" alt="pacemaker-line2.png" src="https://qiita-image-store.s3.amazonaws.com/0/151669/981a8b89-a307-f9e8-aabc-201895bc9b99.png">
bash / awk > ファイルに空行を入れる実装

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
```

### 対象ファイル例

```txt:dat.txt
1
2
3
4
5
6
7
8
9
10
```

### 処理内容

上記のファイルにて、3行ずつ空行を入れる。
空行の入れる位置は`1と2`の間から始める。

### 実装1 > while read使用

参考: [@magicant さんのコメント](http://qiita.com/7of9/items/6a19c036ada7af01078a#comment-d17bd6d4afb50c5023ed)
参考: [シェルをステップ実行したい @ 検索ではあんまり出ないbashの便利技](http://qiita.com/rsooo/items/ef1d036bcc7282a66d7d#%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%92%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%84)

```bash:add_emptylines_everyNlines_170327a_exec
#!/usr/bin/env bash

infile=dat.txt
idx=0
while read -r line;do
	if [ $(( $idx % 3 )) -eq 1 ]; then
		echo 
	fi
	echo $line
	idx=$((idx+1))
done < $infile
```

```txt:結果
]$ bash add_emptylines_everyNlines_170327a_exec 
1

2
3
4

5
6
7

8
9
10
```

### 実装2 > IFS使用

参考: [@kazu56 さんのコメント](http://qiita.com/7of9/items/6a19c036ada7af01078a#comment-359f3240b40edad13aa9)
参考: [コメント](http://qiita.com/7of9/items/6a19c036ada7af01078a#comment-93e219e5c7a1aa091806)

```bash:add_emptylines_everyNlines_170327b_exec
#!/usr/bin/env bash

IFS=$'\n'
lines=($(cat dat.txt))
numline=${#lines[@]}
for idx in $(seq 1 $numline);do
	if [ $(( $[idx-1] % 3 )) -eq 1 ]; then
		echo ""
	fi
	echo ${lines[idx-1]}
done
```

```txt:結果
$ bash add_emptylines_everyNlines_170327b_exec 
1

2
3
4

5
6
7

8
9
10
```

### 実装3 > awk

参考 http://stackoverflow.com/questions/977408/how-do-i-insert-a-blank-line-every-n-lines-using-awk

```
$ awk '{if((NR % 3) == 2){printf("\n")} ; print; }' dat.txt 
1

2
3
4

5
6
7

8
9
10
```

awkの方法はstackoverflowでいくつかあるが、記憶しておく事項が少ない上記の方法が自分には良い。
sbt 起動時に error while loading XXX, class file '...XXX.class' is broken

sbt 起動したらエラー出るようになっていた。

```bash
$ sbt  
error: error while loading AnnotatedElement, class file '/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/rt.jar(java/lang/reflect/AnnotatedElement.class)' is broken
(bad constant pool tag 18 at byte 76)
error: error while loading CharSequence, class file '/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/rt.jar(java/lang/CharSequence.class)' is broken
(bad constant pool tag 18 at byte 10)
[error] Type error in expression
```

見て分かる通り、jdk 1.8です。

jdk のバージョンを上げてもダメ(例： brew cask reinstall java)。ただ、jdk のバージョン1.7を下げると大丈夫だった(例: brew cask install java7）。

結局 scala のバージョンを 2.11.4 まで下げたらコンパイル通って動くようになったがなんなんだ。

UPDATE:

build.propertiesのsbtのバージョンが古すぎたからだった。

```diff
--- a/project/build.properties
+++ b/project/build.properties
@@ -1,2 +1,2 @@
-sbt.version = 0.12.4
+sbt.version = 0.13.13
```
【ECCUE3】$form->handleRequest($request);時の Entity の自動 persist から解除

# 方法1
## $app['orm.em']から除外

```php:方法1.php

// Form もしくは FormBuilder にセットした Entity を EntityManager から解除する
$app['orm.em']->detach($Entity);
```
# 方法2
## $form->submit()を利用して除外
```php:方法2.php

//$request->get($form->getName()) は除外したいフォーム名
$form->submit($request->get($form->getName()), false);
```
fishでnode.jsで言うところのnpmみたいなところのFisheryはもうない

2017/03/27現在。

https://github.com/fishery
は空。

https://github.com/fisherman
が代替のプラグインリストになるようにも見えるが、詳細は不明。
とりあえず
https://github.com/fisherman
にあるspinは
`fisher install spin`
で入ったようだ。


fishermanの公式には

>フィッシュシェルのプラグインはどこにありますか？
>
>fisherman の organization や ウェブサイト 等で、プラグインを検索できます。

とあるので、移行済みなのかも。
kerasが2.0でになって次元の扱いが上手くいかない時の対処法


前はkerasの設定ファイルをこんな感じで書いていたと思います。

```~/.keras/keras.json
{
    "image_dim_ordering": "th", # th or tf
    "epsilon": 1e-07,
    "floatx": "float32",
    "backend": "theano"
}

```

2.0になって、 `image_dim_ordering` が `image_data_format` に変わっていました。

```~/.keras/keras.json
{
    "image_data_format": "channels_first", # channels_first or channels_last
    "epsilon": 1e-07,
    "floatx": "float32",
    "backend": "theano"
}

```

まだDocumentationに書いてなかったので気付けなかったのですが、このようにすれば上手くうごきました。
突然動かなくなってしまったのには困りましたが、命名とかもどんどんわかりやすくなっています。keras使いやすいです。
【Unix】zip解凍時で「error:  cannot create <ファイル名> (error code: 50)」が出た場合の原因と対処方法

#概要
zip解凍すると
```
error:  cannot create <ファイル名>
Protocol error
(error code: 50)
```
というエラーが出る事がある。

エラーコードはファイル容量が足りないときに出るエラーなのだが、容量が足りてる場合も出るので当てにならない。

#原因１ - パーミッションエラー
よくある。ちゃんと設定しよう。

#原因２ - 文字コード
Windowsからアップされたファイル名はShift-Jisなのだがサーバー側のファイルシステムとかがUTF8だと展開できないケースがある（一応文字化けして展開できるケースもある）。
んで困ったことにデフォルトのunzipはShift-Jis未対応な為どんなに頑張っても文字化けは直せない。

「unzip 6.10b BATA」ってやつだと対応してるらしい。試してないけど。

https://sourceforge.net/projects/infozip/files/unreleased%20Betas/UnZip%20betas/

の「unzip610b.zip」ってやつを落としてmakefileが入ってるからmakeすればunzipが出来るので、それを適当な場所に配置する。
デフォルトのunzipと差し替えるのは既存のシステムが動かなくなるケースを考慮してやめたほうが良いと思う。

#原因３ - マウントされてるファイルシステムの問題
Vagrantとかその他外部のファイルシステムをマウントしている場合、そのマウントしているファイルシステム上でunzipすると(error code: 50)で解凍できないケースがある。
この場合マウントしてるファイルシステム上で解凍せずローカルで解凍すれば良い。
macOSのbashでpetコマンドのfunctionを使用する方法

**何度も同じコマンド調べ直すのやめませんか？**
http://qiita.com/knqyf263/items/01ff865bbab2f5e48d1e

上記記事で存在を知ったpetコマンドMacに導入してみました。とても便利ですね！
ただ、元の記事とGitHubのリポジトリのREADMEには、functionがzsh向けのものしかなかったので、bashでも同様の機能を実現できるように書き換えてみました。

【3/27 18:30追記】 petのGitHubリポジトリのREADMEに反映していただきました！

## 動作確認環境
* macOS Sierra 10.12.3
* iTerm 2 Build 3.0.15
* Bash 4.4.12 (homebrew経由でインストール)
  * macOSデフォルトのBash(3.2.57)でも動くはず

## Bash functions for pet

```bash:~/.bashrc
# Bash Functions
## for pet
function prev() {
  PREV=$(fc -lrn | head -n 1)
  sh -c "pet new `printf %q "$PREV"`"
}

function pet-select() {
  BUFFER=$(pet search --query "$READLINE_LINE")
  READLINE_LINE=$BUFFER
  READLINE_POINT=${#BUFFER}
}

# pet-select function のキーバインド設定
bind -x '"\C-x\C-r": pet-select'
```

ちなみに pet-select function を呼び出す際、元記事にあるキーバインド `C-s` を設定してみましたが、MacのBashだとうまく動かなかったため(※以下参照)、キーバインドは `C-x C-r` にしております。
キーバインドは各自お好みで変更してください。

### ※ キーバインド `C-s` で pet-select を呼び出す方法

Macのターミナルでは、キーバインドに `C-s` を設定してもそのままでは動きません。
どうやら stty の `C-s` (画面停止) のキーバインドとバッティングしているようです。
キーバインドに `C-s` を設定する場合は .bashrc の中で stty を stop & start することで pet-select のキーバインドが使われるようになります。

```bash:~/.bashrc
# ...
bind -x '"\C-s": pet-select'
stty stop undef
stty start undef
```

お試しあれ。

参考: http://hogem.hatenablog.com/entry/20090411/1239451878
参考: http://www.itmedia.co.jp/help/tips/linux/l0612.html
変数の命名規則が混在していたので、質問した話

## 結論
変数はスネークケースで統一する、ということになった。


## 経緯
新しく着任したチームでは、複数名でconcrete5のカスタマイズを行っている。
既存ソースを見ると、変数の命名規則が以下のように混在していた。

```php:キャメルケース（単語の区切りを大文字にする）
$articleType
```

```php:スネークケース（小文字＋アンダースコア）
$article_type
```

会議で質問したところ、柔軟性の高い人たちが多く、
「自分ルールはあるけれど、ひっぱってきたソースがあったらファイル内で統一する」
という意見が多かった。
そして、特にそういった事情がなければ、キャメルケースでいいのではないかという話になった。

が、[公式のガイドライン](https://concrete5-japan.org/help/5-6/developer/system/coding_guideline/)を見ると、
> 全てのパラメーターは、半角英小文字のみ（大文字は不可）。下線の使用が許可されています。

とある。

ここでいうパラメータとは、おそらく、メソッドの引数のことだろう。
引数かどうかによって命名を変えるのは面倒なので、
今後定義する変数は、スネークケースで統一するということになった。
（引数だけルールを変えることで、視認性があがるという考え方もあるけれど・・・）

しかし、なんだかしっくりこないな、と思っていたら、
「Javaからきたから、変数名はキャメルケースという頭だった」と言っている人がいた。
なるほど、それか。


## 参考
こちらが参考になった。
[PHPにおける変数・関数のコーディング規約、及び扱い方を考える](http://qiita.com/sasaron397/items/334fd6a404538465f22c)
Excel / VBA > [3から5]行目に空行を挿入する > Rows("3:5").EntireRow.Insert

```txt:動作環境
Windows 8.1 Pro (64bit)
Excel 2013
```

24行ずつある意味を持つ数値、からなるデータシートからグラフを作ろうとしている。

24行ずつ分けるには空行を入れて分離するのがいいだろうか。

EXCEL/VBA(VBは19年ぶりくらい)で実装できるか。

参考 http://analysistabs.com/excel-vba/insert-rows-worksheet/

に記載の「Instructions:」に従いエディタを開いて、以下を入力すればよさそう。
(Alt+F11)
([挿入]-[標準モジュール])

```
Sub sbInsertingRows()
Rows("3:5").EntireRow.Insert
End Sub
```

F5で実行した。

空行を3行挿入できた。

ただし、Undo処理はできない。
(やり方は未調査)。

bashで前処理した方が楽かもしれない。
【メモ】Visual StudioでC++開発した際にライブラリ依存関係のリンクをTrueにしてるのにリンクされない問題について

#概要
![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/59944/0e63f584-c817-7a70-303e-a3d98d9254a9.png)

上記の「ライブラリ依存関係のリンク」はTrueにすると、そのプロジェクトのビルド成果物のライブラリを自動的にリンクしてくれる便利機能なわけだが、これが何かTrueになってるのにリンクしてくれず永遠にビルドが通らない事がある。

#原因
プロジェクトの参照追加するとデフォルトだとライブラリ依存関係のリンクがTrueになってるようにみえるんだけど、実はこれ表面上だけで中身は存在しない。

どういうことかと言うと、プロジェクトの参照情報はVisual StudioのプロジェクトにXMLで記載されているんだけど、メモ帳かなんかで開くと「ライブラリ依存関係のリンク」のデータがそもそも存在しないケースというのがある。どうも参照を追加した際に「ライブラリ依存関係のリンク」の情報がXMLに追加されない場合というのがあって、基本的には追加される・・・と思う。

じゃあこのようにデータが存在しない場合、上記画像のプロパティページの「ライブラリ依存関係のリンク」に表示されている情報ってどうなるのというと、仕様なのかわからないけど「True」と表示することになっているみたい。

だから表面上だけで見てTrueになってるしリンクされるんだろうなーと思ってビルドすると、実際にはリンクされないのでリンカエラーでビルドが通らなくなる。

#解決方法
ようはプロジェクトのXMLに「ライブラリ依存関係のリンク」がTrueであると書き込ませれば良いので、上記画像の赤丸部分を一旦Falseにして「適用」を押した後、再度Trueにして「適用」を押せば良い。そうすれば書き込まれるのでビルドが通るようになる。
代数幾何と学習理論(定義34の例)

#0.代数幾何と学習理論
最近「代数幾何と学習理論」を読んでいるが定義34の例がないので考えてみた。
紙のメモで置いておくとなくなるので、ここに残しておく。

#1.例


```math
X=\mathbb{R} \\
W=\{(\mu,\sigma)| (\mu,\sigma) \in \mathbb{R}^2\} \\
%\Phi(x) = \frac{1}{\sqrt{2\pi\sigma^2}}\exp \left( -\frac{(x-\mu)^2}{2\sigma^2} \right) \\

q(x) = \frac{1}{\sqrt{2\pi}}\exp \left( -\frac{x^2}{2} \right) \\

f: X \times W \to \mathbb{R} \\
\hspace{30pt} (x,(\mu,\sigma)) \mapsto \mu+x\sigma \\
```

上記の仮定をすると

```math
\mu,\sigmaを固定すると写像 f(,((\mu,\sigma))によって写像先\mathbb{R}では平均\mu,分散\sigma^2分布が入る。
```

結果

```math
\\
\\
\\
\psi_1: X \to C(K) \\
\hspace{50pt}  x \mapsto \{(\mu,\sigma) \mapsto x\sigma \}  \\ 
\\
\\
\\
\psi_2: X^2 \to C(K) \\
\hspace{70pt} (x_1,x_2) \mapsto  \{(\mu,\sigma) \mapsto \frac{1}{\sqrt{2}} (x_1+x_2) \sigma \} 
\\
\\
\\
\psi_n: X^n \to C(K) \\
\hspace{80pt} (x_1,x_2,...x_n) \mapsto  \{(\mu,\sigma) \mapsto \frac{1}{\sqrt{n}} (x_1+x_2+...+x_n) \sigma \} 
```

すべてのnに対して

```math
X_n:X^n \to \mathbb{R} \\
(x_1,x_2,...,x_n) \mapsto \frac{1}{\sqrt{n}} (x_1+x_2+...+x_n)
```

すべてのnで写像先では平均0,分散1の分布になるので

```math
\mu_1 = \mu_2 = \mu_3 = ... = \mu \\

```

となってしまい

```math
\{(\mu,\sigma) \mapsto \alpha\sigma | \alpha \in \mathbb{R} \} \subset C(k)
```

のみに0でない測度が入っていて

```math
A = \{(\mu,\sigma) \mapsto \alpha\sigma | \alpha \in (a,b) \} \subset C(k)
```
とすると

```math
\mu(A) = \int_{a}^{b} \frac{1}{\sqrt{2\pi}}\exp \left( -\frac{x^2}{2} \right)dx
```

あまり面白い例ではなかった。
デフォルトshellをフルパスでなくwhichで名前だけで設定するchshはxargsで

```sh
# fish install(公式からCentOS7版コピペ)
cd /etc/yum.repos.d/
wget http://download.opensuse.org/repositories/shells:fish:release:2/CentOS_7/shells:fish:release:2.repo
yum install fish -y

# デフォルトshellへ
which fish | xargs chsh -s
```

パイプだけで引数化できると思ってしまう。
場所は`/usr/bin/fish`で固定だろうけどなんとなく決め打ちが嫌だっただけで、深い意味もない。
python【自分用】


###バージョン変更
http://qiita.com/hanaclover/items/59711e1ee38bec6280ef

###SQLite3
https://www.craneto.co.jp/archives/1248/


*********************************************************
エンジニアがPullrequestにレビューをして副収入を得られるサービスを始めました。
<a href="https://www.reviewers.center/" target="_blank" rel="noopener noreferrer">Reviewers</a>
*********************************************************
Linux 鏈接指令

## Linux 鏈接指令

### ln 鏈接命令

ln  [option]  [source file] [target file]

選項

 - `-s` 建立軟鏈接

鏈接指令分為硬鏈接和軟連接，沒有加上任何選項，軟鏈接要加上`-s`

#### 硬鏈接

硬鏈接的特征

- 硬鏈接和原本文件有相同的inode number和儲存區塊，可以看做是同一個文件
- 可以通過inode number找尋檔案
- 不能跨分區
- 不能針對目錄使用


#### 軟鏈接

軟連接特征：

- 類似Windows快捷方式
- 軟連接有自己的inode number和儲存區塊，但是自己的數據區塊裡面只有儲存原檔的inode number以及儲存區塊
- 軟鏈接的權限都為lrwxrwxrwx
- 修改任意文件，另一個文件會更動
- 原始檔刪了，軟鏈接失效


![圖3-3.1 軟、硬鏈接檔案查找方式](https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/image002.jpg)

```bash
[root@localhost~/Desktop]# touch Gumdam00 # 建立一個空文件
[root@localhost~/Desktop]# ll
total 0
-rw-r--r--  1 Gumdam  staff     0B  3 11 23:07 Gumdam00
[root@localhost/]# ln /Gumdam00 /WinGumdam.hard ## 建立硬鏈接 .hard
[root@localhost/]# ll
total 0
-rw-r--r--  2 Gumdam  staff     0B  3 11 23:07 Gumdam00
-rw-r--r--  2 Gumdam  staff     0B  3 11 23:07 WinGumdam.hard
## 硬鍵接會增加引用計數
[root@localhost/]# ln -s /Gumdam00 /GumdamDeathscythe.bak ## 建立軟連接 .bak
[root@localhost/]# ll
total 16
-rw-r--r--  2 Gumdam  staff     0B  3 11 23:07 Gumdam00
lrwxr-xr-x  1 Gumdam  staff     8B  3 11 23:10 GumdamDeathscythe.bak -> Gumdam00
-rw-r--r--  2 Gumdam  staff     0B  3 11 23:07 WinGumdam.hard
## 軟鏈接不會增加引用計數
[root@localhost~/]# ln /WinGumdam.hard /GumdamHeavyarms.hard # 建立硬鏈接
[root@localhost~/]# rm /WinGumdam.hard # 刪除原始檔
[root@localhost~/]# open /GumdamHeavyarms.hard
## 硬鏈接沒有原文件還可以開
[root@localhost/]# ln -s /GumdamHeavyarms.hard /GumdamSandrock.bak # 建立軟鏈接
[root@localhost/]# rm /GumdamHeavyarms.hard
[root@localhost/]# open  /GumdamSandrock.bak 
The file /Users/Gumdam/Desktop/Gumdam/GumdamSandrock does not exist.
## 軟鏈接沒有原文件失效
```

軟鏈接有一個很重要的重點，路徑一定要**寫絕對路徑**，不然兩個檔案在不同目錄之下你的軟鏈接接是會找不到檔案的，寫絕對路徑是最好的，由於硬鏈接都有相同的inode number所以在不同目錄還是可以打開。

```bash
[root@localhost~/Desktop]# pwd
/Users/Gumdam/Desktop
[root@localhost~/Desktop]# ln -s /Users/Gumdam/Desktop/lyris lyris1
[root@localhost~/Desktop]# ln -s lyris lyris2
[root@localhost~/Desktop]# cat lyris2 #使用絕對路徑軟鏈接 同目錄打開
オルフェンズ　涙　愛は悲しみを背負い　強くなれるから
[root@localhost~/Desktop]# ln lyris lyris3
[root@localhost~/Desktop]# mv lyris* ~ #將lyris1、2、3 移動到~目錄
[root@localhost~/Desktop]# cd ~
[root@localhost~/Desktop]# cat lyris1 #使用絕對路徑軟鏈接 搬移後打開
オルフェンズ　涙　愛は悲しみを背負い　強くなれるから
[root@localhost~/Desktop]# cat lyris2 #使用相對路徑軟鏈接 搬移後打開
cat: lyris2: No such file or directory

[root@localhost~/Desktop]# cat lyris3 #使用相對路徑硬鏈接 搬移後打開
オルフェンズ　涙　愛は悲しみを背負い　強くなれるから
```

如果在練習指令的時候視窗的東西太亂，可以使用`clear`指令清空目前視窗上打過的指令，或是使用快捷鍵 <kbd>Ctrl</kbd>+<kbd>L</kbd>

如果是使用GUI界面的Linux，一般也會有很多很多圖形界面的軟體，鏈接的指令可以使用在安裝`.AppImage`文件的時候，如果要製作鍵結在桌面可以向下面安裝，`.AppImage`的檔案一般是不會有鏈接的，每次要使用都要去找檔案目錄的位置非常麻煩，。

```bash
[root@localhost~/Desktop]# cd ~/Downloads
[root@localhost~/Desktop]# chmod u+x MuseScore*.AppImage
[root@localhost~/Desktop]# ln -s MuseScore*.AppImage ~/Desktop
```

講到軟體安裝，就順便說一下debian的系統常常使用`.deb`的軟體包（Debian軟體包）的格式，細部的內容可以參考[dpkg使用筆記](http://foreachsam.github.io/book-util-dpkg/book/)：

```bash
[root@localhost~/Desktop]# dpkg -i teamviewer*.deb ##安裝軟體包
[root@localhost~/Desktop]# dpkg -r teamviewer*.deb ##移除軟體包
```
今日から始めるSubversion

そんなにころころ変わるものでもないけど2017年版。

## Subversion (SVN) とは
Gitが流行る前に主流だったバージョン管理ツール。
もちろん現在もあらゆる現場で使われている。

Gitとの大きな違いはそのファイル管理方式だが、使い始める上では特に理解する必要はない。

名称 | ファイル管理方式
---------|----------
 Subversion | 集中型
 Git | 分散型

## 利用フロー
一般的なワークフローは本流のTrunkと作業用のBranch、リリース用のTagを分離して利用するケースが多い。

![20170327-SVN.png](https://qiita-image-store.s3.amazonaws.com/0/167943/56caf0bd-4569-f0f3-c6ef-522551060597.png)

1. TrunkからBranchを作成
2. Branchでファイルを変更
3. 変更をCommit
4. (2-3を繰り返し)
5. 開発が完了したら、BranchをTrunkにMerge
6. TrunkからTagを作成
7. Tagからリリース

## 用語
太字の用語さえ理解していればなんとかなる。
それぞれの用語の和訳を理解していれば大抵想像がつくようになっている。

### 名称

名称 | 読み | 直訳 | 説明
---------|---------|----------|----------
 Repository | リポジトリ | [貯蔵所、倉庫] | TrunkやBranchなどすべてを包括するもの。
 **Trunk** | トランク | [(木の)幹，樹幹] | そのプロジェクトの最新のソースが管理されるベース。**基本的にTrunkを直接変更してはならない。**
 **Branch** | ブランチ | [(木の)枝] | 開発を行う際に作成される作業ワーク。
 Tag | タグ | [付け札] | リリースバージョン。後で差し戻しなどを行えるよう、リリース時点のTrunkの状態を保存しておくためのもの。
 Revision | リビジョン | [改訂、修正] | Commitを行った時点（セーブポイント）のこと。*r1234* などと表記され、数値が増えていく。後からこの地点に戻したり、リビジョン同士で差分を出したりすることができる。
### 操作

操作名 | 読み | 直訳 | 説明
---------|---------|----------|---------
 **Commit** | コミット | - | 保存する・セーブポイントを作る。この操作を行うとRevision番号が上がる。
 **Merge** | マージ | [併合する] | SVNでは大抵BranchをTrunkに取り込むことを指す。分岐した枝(ブランチ)をひとつに戻すということ。
 Revert | リバート | [戻す] | 指定したRevisionの状態に戻す。
 Checkout | チェックアウト | - | Branchなどをローカルに持ってくる、最初に行う操作。
 Export | エクスポート | - | ソースをローカルなどにダウンロードする。Checkoutと違う点は、コミット情報を持たない生のファイルのみを保存するというところ。

## SVNで開発を行う上でやってはならないこと
### 開発中Branchがある状態で、Trunkに直接変更を行いCommitする。
BranchをTrunkにマージできなくなったりする。
解決法はあるが大抵面倒なことが発生するのでやらない方が良い。

## ツール
[TortoiseSVN](https://tortoisesvn.net/)
基本これを使ってチェックアウトやコミットなどを行う。 `Tortoise` はトータスと読む。

## Tips
### マージ操作
Branch開発中にTrunkが更新された場合に、開発BranchにTrunkを取り込む場合はマージを使う。
（ここではTortoiseSVNを使う前提で説明する）

まずはマージしたいBranchを選択してSVNメニューの `マージ(M)...` を選び、次のように進めていく。

項目 | 値
---------|----------
 マージタイプ | リビジョンの範囲をマージ
 マージ元のURL | TrunkのURL
 マージするリビジョンの範囲 | すべてのリビジョン
 マージオプション | お好みで

ここでマージに問題が無ければすんなり通るが、コンフリクト(競合)が発生した場合は警告が出力される。コンフリクトが発生した場合には人間が手動でファイルの差分を確認しながら1行ごとにマージ作業をしなければならない。

この時TortoiseSVNは、「Trunkのファイル」「Branchのファイル」「作業コピー」の三種類のファイルを自動生成する。最終的な目標はTrunkとBranchのファイルを正しくあるべき状態で保存し、それを作業コピーとしてコミットすることだ。

マージ作業にはWinMergeなどのツールがよく利用されるが、ともかく作業コピーにあるファイルの状態を正しいものに修正し終えたら、TortoiseSVNのメニューから対象ファイルを `競合の解決(O)...` から解決マークを付ければ競合の問題は解消されたことになる。

参考リンク: [TortoiseSVN/競合してコミット出来ない時には - tracpath.com](http://wiki.tracpath.com/TortoiseSVN/%E7%AB%B6%E5%90%88%E3%81%97%E3%81%A6%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%87%BA%E6%9D%A5%E3%81%AA%E3%81%84%E6%99%82%E3%81%AB%E3%81%AF)

## その他の参考文献
* [バージョン管理システム入門(初心者向け)by tracpath](http://tracpath.com/bootcamp/learning_subversion_tutorial1.html)
* [Qiita: 今更聞けないSubversionの使い方](http://qiita.com/mountcedar/items/e756bb9136e3b1722bb2)
* [Qiita: 【svn】基本コマンド](http://qiita.com/konweb/items/6effd36aab551b2d6b8f)
pyenv自身のバージョンを上げる

#Pyenvとは
Pyenv自体はLL言語に良くある言語のバージョン管理を手軽にすることのできるツールです．

導入も簡単で，
1.git clone

```
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
```

2.パスを通す

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

3.使用可能

```
$ pyenv
pyenv 1.0.3-119-gfe1bd31
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   install     Install a Python version using python-build
   uninstall   Uninstall a specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme
```

#pyenv-update
pyenv自体がgitで管理されているので新しいバージョンをgit pullしてくるという手もありますが，すでに一発でアップデート出来るようにしてくれるプラグイン「pyenv-update」があります．

https://github.com/pyenv/pyenv-update

これまた簡単に導入でき，
1.git clone

```
$ git clone git@github.com:pyenv/pyenv-update.git ~/.pyenv/plugins/pyenv-update
```

2.アップデート

```
$ pyenv update
```
Atomの自動アップデートをOFFにする方法

# 手順
Settings > Core > Core Settings > Automatically Update のチェックを外す

![image](https://qiita-image-store.s3.amazonaws.com/0/7902/54af59ff-01b0-9672-1e9b-53f83f5686c3.png)

## 参考リンク
Atomエディタの自動バージョンアップを回避する方法
http://creating-homepage.com/archives/2382
Atomの別名保存でファイル名が「名称未設定」になってしまうバグについて

# 事象
v1.15.0にアップデートしてから別名保存(Save As...)時のダイアログでファイル名が「名称未設定」になってしまい、ファイルパスも正しく認識されない。

同様の事象がatomのissueにバグとしてあがってた。
[Save as' opens a save dialog in a semi-random dir with 'Untitled' as the file name · Issue #13978 · atom/atom](https://github.com/atom/atom/issues/13978)

# 解決方法
v1.14.4にダウングレードしたら直った。
(issueでも解決方法はダウングレードしろだった。)

#　解決手順
## 1. Atom自動アップデートをOFF
自動アップデートをOFFにしておかないと、v1.14.4をインストールした後に、Atomを再起動すると勝手にバージョンが上がってしまう。

[Atomの自動アップデートをOFFにする方法 - Qiita](http://qiita.com/kanpou_/items/5f56e090559133493c30)

## 2. Atomのダウングレード
以下リンクの「atom-mac.zip」をダウンロードして解凍すると「Atom.app」になるので、こいつをmacのアプリケーションフォルダに突っ込む。
※ 元々アプリケーションフォルダにあった最新の「Atom.app」をゴミ箱に送ってから突っ込んだが、上書きでも問題ないはず。

* [Release 1.14.4 · atom/atom](https://github.com/atom/atom/releases/tag/v1.14.4)



## 参考リンク
* Release Notes：  https://atom.io/releases
>
v1.14.4 (2017-02-28)
>

* Atomテキストエディタのバージョンをダウングレードする方法：　 http://creating-homepage.com/archives/2335
WordPressの the_timeで表記を英語にする方法

WordPressで投稿日時を表示するテンプレートタグは「the_time」ですが、たとえば次のような書式を出力する場合…

```
March 27th, 2017
```

次のようなプログラムにしてしまうと、

```
the_time('F jS, Y');
```

次のように出力されてしまいます。

```
3月 27th, 2017
```

これは、WordPressの言語設定が日本語になっているため、翻訳されてしまうため。とはいえ、言語設定は日本語のままで日付だけ英語表記にしたい場合もあります。そんな時は、次のようなプログラムを使いましょう。

```
echo get_post_time('F jS, Y');
```

こちらは、言語設定にかかわらず英語で出力されます。
CentOS 7 で簡単に HTTP/2 を試す（h2c非暗号）

全般的にコンパイルして忙しそうな解説しかないので、パッケージで対応できる範囲を明確にするために VirtualBox + CentOS 7 でパッケージだけで動作検証。
~~現時点では [OpenSSL](https://www.openssl.org/) の RPM パッケージは 1.0.1 までしか見つからないが、RHEL 7.4 で OpenSSL 1.0.2 が利用できるようになるようである。 [^openssl-rhel74]~~
CentOS 7.4 から OpenSSL が 1.0.2 にバージョンアップされたため、完全にパッケージのみで Apache を HTTP/2 に対応させることが可能になりました。
[パッケージのみで CentOS の Apache を HTTP/2 対応にする - Qiita](https://qiita.com/bezeklik/items/5286da14451e0c7a7d19)

[^openssl-rhel74]: https://bugzilla.redhat.com/show_bug.cgi?id=1276310

## インストール
### nghttp2
```bash
yum -y install epel-release && yum -y install nghttp2
```
[nghttp2](https://nghttp2.org/) は 1.7.1 と多少バージョンが古いが EPEL リポジトリにパッケージが用意されている。
依存関係で libev と libnghttp2 もインストールされる。

### Apache HTTP Server
[mod_http2 モジュール](https://httpd.apache.org/docs/2.4/mod/mod_http2.html)は Apache 2.4.17 以降で利用できるが、CentOS の標準リポジトリでは 2.4.6 がインストールされるため利用できない。
Apache 2.4.17 以降をパッケージでインストールできるのは以下の2つ。

* RHSCL リポジトリ httpd24 パッケージ Apache 2.4.18
* IUS リポジトリ httpd24u パッケージ Apache 2.4.25

#### RHSCL (Red Hat Software Collection 2.3)
```bash
yum -y install centos-release-scl
yum -y install httpd24 && source scl_source enable $_
echo -e '#!/bin/bash\nsource scl_source enable httpd24' > /etc/profile.d/httpd24.sh
ln -s {/opt/rh/httpd24/root,}/etc/httpd
ln -s {/opt/rh/httpd24/root,}/var/www
ln -s /{usr/lib/systemd/system/httpd24-,etc/systemd/system/}httpd.service
systemctl daemon-reload
```

#### IUS
```bash
curl -s https://setup.ius.io/ | sh
yum -y install httpd24u
```
#### firewalld
```bash
firewall-cmd --add-service=http{,s} --permanent && firewall-cmd --reload
```
#### h2c
```bash
cat << "_EOF_" > /etc/httpd/conf.d/http2.conf
<IfModule http2_module>
    Protocols h2 h2c http/1.1
    H2Direct on
</IfModule>
_EOF_
```
```
systemctl start httpd && systemctl enable $_
```

## 確認
[HTTP/2の動作確認 - Apache 2.4系でHTTP/2対応サーバを構築してみるテスト。](https://http2.try-and-test.net/debug.html#h2c)を参考に以下の通り確認する。
### アップグレード
```bash
nghttp -uv http://localhost | grep Upgrade
```
```
[  0.000] HTTP Upgrade request
connection: Upgrade, HTTP2-Settings
[  0.001] HTTP Upgrade response
Upgrade: h2c
Connection: Upgrade
[  0.001] HTTP Upgrade success
```
### ダイレクトモード
```bash
nghttp -v http://localhost | grep "SETTINGS\|HEADERS"
```
```bash
[  0.000] send SETTINGS frame <length=12, flags=0x00, stream_id=0>
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
          [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[  0.000] send HEADERS frame <length=34, flags=0x25, stream_id=13>
          ; END_STREAM | END_HEADERS | PRIORITY
[  0.001] recv SETTINGS frame <length=6, flags=0x00, stream_id=0>
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
[  0.001] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
[  0.001] recv HEADERS frame <length=114, flags=0x04, stream_id=13>
          ; END_HEADERS
[  0.001] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
```

### ブラウザ
```
Upgrade:h2,h2c
```
デベロッパーツールで HTTP レスポンスヘッダーを確認すると上記の出力がある。
Go言語の基本 — array と slice の違い

# まとめ

- slice は array より柔軟。
  - slice の方が、軽量プログラミング言語（Ruby）でいう array に近い。
  - だが、さすがに軽量プログラミング言語よりは柔軟じゃない。
- slice は array を参照しているラッパーのようなもの。
  - slice をいじると、内部では基底となる array の状態が変わったり、新しいarrayがnewされたり、色々なことがおこなわれる。

# 宣言方法

## array の場合

要素数と型を書く。

```go
var a [3]int
```


## slice の場合

要素数を書かない。これだけでsliceになる。

```go
var s []int
```


# 宣言と同時に代入する

## arrayの場合


後ろにに要素を並べる。

```go
a := [3] int{1,2,3}
```

この書き方では、要素数は省略できる。
ただこれは後ろに書いた要素の数を自動でカウントしてくれているだけで、要素数を明記した場合と、何か実体が変わるわけではない。

```go
a := [...] int{1,2,3}
```

## slice の場合

arrayと記法は同じで、ブレースに要素を書く。

```go
s := []int{1,2,3}
```
# 空配列/空スライス

## arrayの場合

空配列を作ると、足りない値がすべて自動的に埋められる。

```go
a := [3] int{}

fmt.Println(a) // [0 0 0]
```

## sliceの場合 

中身がそのとおり空になる。

```go
s := []int{}

fmt.Println(s) [] // []
```

# 要素の追加

## array の場合

そもそも要素の個数が決まっているので、要素の追加という概念がない。

## slice の場合

append すれば良い。

```go
s := []int{}

s = append(s, 1)
s = append(s, 2)
s = append(s, 3)

fmt.Println(s) // [1 2 3]
```

ただし、arrayより柔軟なsliceとはいえ、存在しない要素にいきなり代入することは出来ないようだ。

```go
s := []int{}

s[0] = 1  // panic: runtime error: index out of range
```

# 型の表し方

# arrayの場合

配列すべてを表す型というのは存在しない。

```
[要素数]型名
```

以下は全て別々の型として扱われる。

```
[3]int
```

```
[3]string
```

```
[4]int
```


# slice の場合

```
[]型名
```

と表現する。

例:

```
[]string
```

```
[]int
```
 
# 環境

- go version go1.8 darwin/amd64

# 参考

- https://blog.golang.org/go-slices-usage-and-internals
- https://blog.golang.org/slices
- https://medium.com/@hackintoshrao/the-curious-case-of-golang-array-and-slices-2565491d4335#.7dwz3ujgt
- http://stackoverflow.com/questions/36706843/how-to-get-the-underlying-array-of-a-slice-in-go
- http://openmymind.net/Controlling-Array-Growth-In-Golang/








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Vivado WebPack を Gentoo/systemd な環境に導入するときにハマったこと

Zynq を使った開発にあたり，Linux 上で Vivado を動かす必要が生じたため，
せっかくなので Gentoo に入れようと思ったところ，運よく一発で動かすことができなかったので
忘れないようにハマったポイントごとにメモしておく。
# インストールが終わらない！
ncurses-5 がないから。
標準で入っているのは 6 なので，5 もインストールする必要がある。
``` # emerge -av sys-libs/ncurses:5 ```
# 動きが怪しい…
settings64.sh を呼んで，環境設定を行ってから起動させる必要がある。
[ここ](http://coldnew.github.io/zybo-board/xilinx_sdk_note/)にあるスクリプトが使える。

## launch-vivado.sh
こんな感じのスクリプトを作っておくと楽。

```
#!/bin/sh

export LC_ALL=C
export SWT_GTK3=0 # Fix annoying error on Xilinx SDK

_SILENT_JAVA_OPTIONS="-Dawt.useSystemAAFontSettings=on -Dsun.java2d.xrender=true -Dswing.aatext=true"
unset _JAVA_OPTIONS
alias java='java $_SILENT_JAVA_OPTIONS'
export TARGET_DIR=/opt/Xilinx/Vivado/2016.4
source $TARGET_DIR/settings64.sh

# Launch Vivado
cd /tmp
exec $TARGET_DIR/bin/vivado
```

# SDK のエラー対策
## No Elf file associated with target
何もしないと，No Elf file associated with target と怒られてデバッガが動かない。
(https://japan.xilinx.com/support/answers/68503.html) から ``xmdterm.tcl`` を拾ってきて置き換える。
## シリアル通信すると落ちる
rxtx を emerge して，Vivado の中のシェアードオブジェクトを置き換えると動く。

```
# emerge rxtx
# cp /usr/lib/rxtx-2/librxtxSerial.so /opt/Xilinx/SDK/2016.4/eclipse/lnx64.o/plugins/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/os/linux/x86_64/
```


# ボードと通信できない！
ユーザを uucp グループに追加する。
``` # gpasswd -a uucp $USER ```
次に，```/run/lock``` のパーミッションを設定する必要がある。
これは，``/usr/lib/tmpfiles.d/gentoo-run.conf`` の編集によって行う。

```
# New OpenRC versions replace /var/lock with a symlink to /run/lock.
# We just create that directory for now, just in case.
# Of course, it's not guaranteed that'll satisfy all relevant packages.

# d /run/lock 0755 root root -
d /run/lock 0775 root uucp -
```

# 問題点

## rxtx のバージョンの違いについて

使うたびに怒られるが，とりあえず問題なさそうである。
レスポンシブ 覚書き

# 横幅でグルーピング

## グループ１
(320px=100%)
320px : iPhone5S

## グループ２
360px : Nexus5
(360px=100% 以降は両サイドに空白)
375px : iPhone6
412px : Nexus6
414px : iPhone6S
540px : Xperia acro HD

## グループ３
600px : Nexus7
(600px=100% 以降は両サイドに空白)
720px : GALAXY S III
768px : iPad, iPad mini, Nexus9
800px : Nexus10, GALAXY Note

## グループ４
(960px=100% 以降は両サイドに空白)
960px～ : PC他

## CSS メディアクエリサンプル
> @media screen and (max-width: 359px) {
}
@media screen and (min-width: 360px) and (max-width: 599px) {
}
@media screen and (min-width: 600px) and (max-width: 959px) {
}
@media screen and (min-width: 960px) {
}
Postgresqlをインストール後、リストアするまで

#前提条件

・サーバーに構築されているDBをローカルのDBにリストアする場合の手順です。
・OracleDBしか触ったことがない人用のメモ（ニッチ）

#サーバーのDBのバックアップ

Postgresqlが用意してくれている、pg_dumpというコマンドを使用する。

サーバーに接続後、下記コマンドを実行する。
※ファイルを出力するパスまで移動してから実行すること！

```
pg_dump [DB名] > ファイル名
```

これでファイル名に指定した名称のファイル(拡張子なし)が出力されます。

#dumpファイルをローカルへダウンロード

WinSCP等を利用してローカルへdumpファイルをコピーする。
詳細な手順については割愛。

#ローカルDBへの展開

まず、取得したdumpファイルを展開するためのDBを作成する。
psqlコマンドでログインして、DBを作成する。

例) postgresユーザでログインし、hogedbを作成する場合

```
C:\User\Hoge> psql -U postgres
ユーザ postgres のパスワード:
psql(9.4.0)
"help"でヘルプを表示します。

postgres#=create database hogedb;
```

DBを作成したらpsqlを終了し、下記コマンドでdumpファイルを展開する。

例) postgresユーザでhogedbへdumpファイルを展開する場合

```
C:\User\Hoge> psql -U postgres -d hogedb -f [dumpファイルのパス]
``` 

これで完了！