OmniAICreator/Qiita-1.07M huggingface dataset:
Sip(VoIP)アダプタ Grandstream HT701 を定期的にリブートする

## HT701が着信せずに困った

IP電話に切り替えて、電話機はHT701というSIPアダプタに繋いで済ますことにした。
HT701はAmazonで数千円程度とお手頃だったこともあってこれにしたのだが………
着信しない…
いや、最初はきちんとつながるんだが、いつのまにか着信しなくなる。
外からかけると、話中の「ツーツーツー」と発信音がする。
WebI/Fを除くとちゃんと「Registered」になってるし、困った。

## 原因
不明である。

だが、NATがらみでトラブってる希ガス。
何故？故あってルータはUPnPなど知らんと言い切る業務用。なんか、コネクション切れてねっか?と思うわけですよ。

## 面倒なので、小手先の技で逃げる
で、そのままと言う訳にもいかない。
と言って、根本的な対策は~~面倒~~大変なので、定期的にリブートすることでお茶を濁すことにする。

流れは

  1. ログインページでパスワード入力
  2. セッションidの入ったクッキーをもらう
  3. クッキーを使ってリブートページをたたく

物はCURLです。
1つ目のコマンド「1、2」を2つ目のコマンドで「3」を行っています。

```
curl -c ht701.txt -d "P2=PA$$W0RD" -d "Login=Login" -d "gnkey=XXXX" "http://sipアドレス/cgi-bin/dologin"
curl -b ht701.txt -d "reboot=Reboot" -d "gnkey=XXXX" "http://sipアドレス/cgi-bin/rs"
```

<dl>
  <dt> -c ht701.txt</dt>
  <dd> cookieです </dd>
  <dt> -d "P2=PA$$W0RD"</dt>
  <dd> パスワードを渡します </dd>
  <dt> -d "Login=Login"</dt>
  <dd> ログインコマンド </dd>
  <dt> -d "gnkey=XXXX"</dt>
  <dd> gnkeyはハードの番号のようですが詳細は不明です </dd>
  <dd> ログインページのソースをみれば、hiddenで埋め込まれています </dd>
  <dt> http://sipアドレス/cgi-bin/dologin</dt>
  <dd> ログインページのURL</dd>
  <dt> -d "reboot=Reboot"</dt>
  <dd> リブートコマンド </dd>
  <dt> http://sipアドレス/cgi-bin/rs</dt>
  <dd> リブートのURL</dd>
</dl>

あとは、cronかなんかで定期的にこれを実行すればOKです。
日本語Alexaをラズパイに導入する

Raspberry Piでアレクサのサンプルアプリがありますが、12月19日頃のインストールスクリプトで日本語に対応していました。ただ、現在配布されているRaspbianのStretchはJava8のインストールスクリプトが対応していないので、それに対応させる必要があります。

# 事前準備
　事前準備としては以下のものを準備します。
- ラズパイ：（とそれを動作させるために必要なもの一式: OSはRaspbian Stretch-liteを使用します）
- ステレオジャックのスピーカー(USB給電等)
- USBマイク

## アマゾンの開発者アカウント
 [アマゾンのAlexa開発ページ](https://developer.amazon.com/ja/)にアクセスして、**日本の**アマゾンのアカウントでサインアップする(海外のamazonアカウントを持っている人は多くないと思いますが、日本語のスキルを使うためには日本のアマゾンに登録しているメールアドレスとパスワードを使います。developer.amazon.comですが、日本のアカウントでサインアップできます)。

 [手順](https://github.com/alexa/alexa-avs-sample-app/wiki/Create-Security-Profile)に従って登録し、ProductID, ClientID, ClientSecurityを記録します(日本語のページでできます)。

# OS: Stretch(lite)の設定
　ラズパイを起動したらロケールやネットワークの設定をします。

　Alexaでは、Javaクライアントで最初に端末の認証が必要となるので、GUIが必要となります。なので、Desktop GUIをliteに導入します。
- sudo apt-get update
- sudo apt-get upgrade
- sudo apt-get install raspberrypi-ui-mods fonts-vlgothic chromium-browser git (liteの場合)
- (お好みで)rc-gui lxterminal leafpad

# Alexa-avs-sample-appをダウンロード
　以下のコマンドでプログラムをダウンロードします。

- git clone https://github.com/alexa/alexa-avs-sample-app.git
- エディタで、automated_install.shを開き、以下の項目について、開発者ページで取得した内容を記述
> ProductID
> ClientID
> ClientSecret

- alexa-avs-sample-appに移動
- samples/javaClient/install-java8.shを編集する。 jessieと書いてある場所を見つけて、その上に以下の記述を追加し、ifの前にelをつけてelifとする。

```

if [ "$VERSION" == "jessie" ]; then
    UBUNTU_VERSION="trusty"  
...
```
を

```

if [ "$VERSION" == "stretch" ]; then
    UBUNTU_VERSION="xenial"
    sudo apt-get -y install dirmngr
elif [ "$VERSION" == "jessie" ]; then
    UBUNTU_VERSION="trusty"
...
```
に変える。アプリのトップで、以下のコマンドを入力

- bash automated_install.sh (で実行する)

> Setting Localeに6)ja-JPがあるので6を入力


　後はインストールが終わるのを待つ。環境に寄りますが1時間から2時間ほど。

# スピーカー等の調整

```
 amixer cset numid=3 1   # ステレオジャックの場合
 amixer cset numid=3 2   # HDMIの音声出力を使う場合
 amixer cset numid=1 100%  # スピーカーのボリュームを最大
 amixer sset Mic 16 -c 1   # マイクの感度を最大(カード番号1の場合)
```

# 起動する
 USBマイクはC-Mediaのものであれば、特に設定なく使える。

- samples/companionAppで npm start
- samples/javaClientでmvn exec:exec

> (初回起動時に認証ページにアクセスするよう出てくるのでブラウザからURLにアクセスして、アマゾンのアカウントで認証する)

- samples/wakeWordAgent/srcで./wakeWordAgent -e sensory もしくは、./wakeWordAgent -e kitt_aiで「アレクサ」で起動できるようにする。

# 動作確認
　Raspberry Pi 3 Model B (JP)で確認しています。Rapberry Pi Zero Wでは、javaClientまでは動作しますが、wakeWordAgentはエラーで動作しませんでした。
画像の仕分けスクリプトをPowerShellで書き直す

以前、[ShellScriptで作成したスクリプト](https://qiita.com/iwase10moya/items/3a55ac29d5e7bab1dc67)をPowerShellで書き直しました。

# 動機
Windowsのタスクスケジューラで定期的に実行したかったから。

# 構成
tools/movePictureLocation.ps1
tools/run_mpl.bat（実行用バッチファイル）

# コード
```movePictureLocation.ps1
############################################################
# READ ME
# 処理対象の画像があるフォルダに、tools以下のファイルを置く
# rul_mpl.batをダブルクリックして実行する
############################################################

# toolsから一つ上の階層へ
Set-Location ..
$PARENT=(Convert-Path .)
Write-Host 'Current Location is '$PARENT

# ファイルプロパティ取得の準備
$SHELL = New-Object -ComObject Shell.Application
$DIRECTORY = $SHELL.NameSpace($PARENT)

# 特定ディレクトリから、画像（jpg, png）のサイズを取得する
$FILELIST=(ls $PARENT)

foreach($TEMP_FILEFULLPATH in $FILELIST){
	$TEMP_FILEBASENAME=($TEMP_FILEFULLPATH).BaseName
	$TEMP_FILEEXTENSION=($TEMP_FILEFULLPATH).Extension
	$TEMP_FILENAME=$TEMP_FILEBASENAME+$TEMP_FILEEXTENSION

	# 拡張子がjpg-orig, jpg_origならjpgへリネームする
	if(($TEMP_FILEEXTENSION -eq '.jpg-orig') -Or ($TEMP_FILEEXTENSION -eq '.jpg_orig')){
		Write-Host 'Rename target'
		$OLD_FULLPATH=$TEMP_FILEFULLPATH
		$NEW_FULLPATH=$TEMP_FILEBASENAME+'.jpg'
		Write-Host $OLD_FULLPATH
		Write-Host $NEW_FULLPATH
		Move-item -LiteralPath $OLD_FULLPATH $NEW_FULLPATH

		$TEMP_FILEEXTENSION='.jpg'
		$TEMP_FILENAME=$NEW_FULLPATH

	}

	if($TEMP_FILEEXTENSION -eq ''){
		Write-Host 'This is not a binary file. -> '$TEMP_FILEBASENAME$TEMP_FILEEXTENSION

	}elseif(($TEMP_FILEEXTENSION -eq '.jpg') -Or ($TEMP_FILEEXTENSION -eq '.png')){
		$OBJECT = $DIRECTORY.ParseName($TEMP_FILENAME)
		$HIGHT = $DIRECTORY.GetDetailsOf($OBJECT,169)
		$WIDTH = $DIRECTORY.GetDetailsOf($OBJECT,167)

		Write-Host 
		Write-Host $TEMP_FILEBASENAME$TEMP_FILEEXTENSION
		Write-Host ' ->hight x width '$HIGHT' x'$WIDTH

		if($HIGHT -lt $WIDTH){
			Write-Host ' ->縦長'
			# ファイルを望む場所へ移動させる

		}else{
			Write-Host ' ->横長'
			# ファイルを望む場所へ移動させる

		}
		Write-Host 

	}else{
		Write-Host 'This is not a picture. -> '$TEMP_FILEBASENAME$TEMP_FILEEXTENSION

	}
}
```
PowerShellスクリプトは単体で実行し難いので、下記のようなPowerShellスクリプト実行用バッチファイルを用意

```run_mpl.bat
@echo off
echo -D executing ps1 file...
powershell -NoProfile -ExecutionPolicy Unrestricted .\movePictureLocation.ps1
echo -D completed
pause > nul
exit
```

# 感想
- ShellScriptで作る場合と比べて値の取得（拡張子、ファイルプロパティ）がとても簡単

# 参考
- [Powershell とりあえずファイルのプロパティを全部出してみるスクリプト](https://qiita.com/Q11Q/items/02f931425ce07e2193a0)
- [Powershellを楽に実行してもらうには](https://qiita.com/tomoko523/items/df8e384d32a377381ef9)
- [PowerShell での文字列出力について考える](http://tech.guitarrapc.com/entry/2014/01/17/073338#6-Write-Host-Cmdletでホスト画面へのみ出力する)
- [【PowerShell】指定フォルダからファイル名を取得しリネームする](http://higitune.blog106.fc2.com/blog-entry-127.html)
[WordPress] Redis Object Cache プラグインとか導入するとキャッシュがきつすぎてオプションが保存されない時あるよね

WordPress の MySQL へのクエリ発行数を減らすために [Redis Object Cache](https://ja.wordpress.org/plugins/redis-cache/) プラグインとか導入することがあるんですよ。
そんな時 `update_option()` しても変更が反映されないとかってことありませんか？

これ実は、codex にも書いてあるんだけど、すでにキャッシュされているオプションを更新する場合は `wp_cache_delete ( 'alloptions', 'options' );` しろよってことらしいです。

>Notes
Upon getting an option in code, this option value will be cached. If you modify any options outside of the Options API, then try to update an option that's already cached, this will fail updating and return false. You can use the following method to clear the options cache before trying to get or update the options on the same request:

```
<?php
wp_cache_delete ( 'alloptions', 'options' );
?>
```

[Function Reference/update option](https://codex.wordpress.org/Function_Reference/update_option)

でも、使用している全てのプラグインとか、テーマとかがそのお作法に則ってキャッシュを消してくれてるわけでもないし、だいたいコアのソースで制御してるはずのプラグインの有効化/無効化ですら Redis Object Cache を導入すると反映されなくなっちゃう...

そんなわけで、Redis Object Cache 入れた時は以下のようなプラグインを wp-content/mu-plugins/ に入れて `update_option()` とかした時にキャッシュをいい感じで消してあげてます。

```php:redis-cache-fix.php
<?php
/*
Plugin Name: Redis Object Cache fix
Plugin URI:
Description:
Version: 0.1
Author: DigitalCube
Author URI: https://www.digitalcube.jp/
License: GPLv2 or later
*/

class redis_cache_fix {
    public function __construct() {
        add_action( 'add_option',    array( $this, 'option_cache_flush' ) );
        add_action( 'update_option', array( $this, 'option_cache_flush' ) );
        add_action( 'delete_option', array( $this, 'option_cache_flush' ) );
    }

    // update_option, delete_option 時に cache をフラッシュ
    public function option_cache_flush($option, $old_value = '', $value = ''){
        if ( !empty( $option ) ) {
            wp_cache_delete( $option, 'options' );
            foreach (array('alloptions','notoptions') as $options_name) {
                $options = wp_cache_get( $options_name, 'options' );
                if ( ! is_array($options) ) {
                    $options = array();
                }
                if ( isset($options[$option]) ) {
                    unset($options[$option]);
                    wp_cache_set( $options_name, $options, 'options' );
                }
                unset($options);
            }
        }
        return;
    }
};
new redis_cache_fix();
```
Cesium with WebDNN

# はじめに
　ディープラーニングがバズ化してNHKの教育でも講座が開かれる昨今、皆様の周りもでも色々話題に上がることもあると思います。
　そしてFOSS4Gの周りでもディープラーニングを使った事例がちょくちょく出てきており、世はまさに大ディープラーニング時代！ということで今回は[MakeGirlsMoe](http://make.girls.moe/#/)で有名になった[WebDNN](https://speakerdeck.com/kiikurage/uebuburauzaxiang-keshen-ceng-xue-xi-moderugao-su-shi-xing-huremuwaku-webdnn)を使ったブラウザのみでのWebDNNタイル作成をご紹介します。

# 衝撃のアルベルト
　MakeGirlsMoeという名前で、かなりきれいな２次元アニメキャラっぽい画像を生成できるサービスがつい最近登場しました。twitterでもかなりバズったのでご存じの方も多いと思います。
　こちらの最大の特徴はGANによる生成で、人間が描いてると言われても違和感ないレベルの２次元キャラを生成することが出来ることです。通常GANは安定的に画像を生成することが難しく、それらを安定生成するためのテクニックが非常に多くの論文で発表されています。
　このため、ここまで破綻が少ない画像を生成できることがでできるということが、DNN界隈に大きな衝撃をもたらしました。
　しかしながら個人的に衝撃を受けたのが、MakeGirlsMoeの[tips](http://make.girls.moe/#/tips)で書かれていた、

>This will enable the WebGPU backend, which is 100x faster than WebAssembly!

　という言葉です。
　おいおい、１００倍はモリ過ぎじゃない？と思いつつ試してみたら、
　「この速さ・・・悪魔的っ・・・！圧倒的爆速っ・・・！」
　という感じでヤック・デカルチャーな体験を受け、ここまで早ければかなり応用ができそうだと感じ、タイルでも作ってみようかと思いつきました。
　ConvNetの成果をpix2pixで精度も速度も圧勝された[苦い経験](https://qiita.com/wayama_ryousuke/items/ca43cabffde90a66434b)を持つ私ですが、正直１年でここまで高速化するとは思っていませんでした。今のとこ[safari technology-preview](https://developer.apple.com/safari/technology-preview/)のみで試せますが、正直ローカル実行と同じくらい早いんでないかというくらいの爆速でビビります。

# とりあえず構想
　ではWebDNNでタイル作成というアイディアをどうやって実現するのか？
　ということで色々調査してみたところ、[WebDNNで猫の線画着色モデルを動作させる](https://qiita.com/knok/items/45f4bbe3f0058eba27e6)と言う@knokさんが書かれた記事がpix2pixをWebDNNで動かすという内容で、今回のケースに非常に似通っているため、参考にさせて頂きました。@knokさんありがとうございます！

　ということで、基本はChainerのpix2pixで学習させたモデルをwebdnnに変換させてから、Cesiumでcanvasタイルとして生成する感じで実装を進めました。
　・・・が、案の定と言うかなんというか、予想通り様々な壁にぶつかります。
　（以下諸事情により割愛。あとで追記します）

# 結果

　色々とキャンバスに悩まされた感じでは有りますが、ついに完成しました！

CPUで動作
[![CPU](http://img.youtube.com/vi/K_u9FVkvaUU/0.jpg)](https://youtu.be/K_u9FVkvaUU)

GPUで動作
[![GPU](http://img.youtube.com/vi/DuvaJA4jZqk/0.jpg)](https://youtu.be/DuvaJA4jZqk)

　うーん、GPUだとばくそくっ！
　結構実運用に耐えそうな速さですね。
　今回はモデルやウェブタイルは決め打ちでやってますが、この辺を動的にアップする事で有用なモデルをgithubとかで共有して様々なDNNによる分析を誰でもどこでも（スマホでも！）簡単に分析できるようになると思います。

[Code](https://github.com/makinux/WebTileNet)
入出力が2系統以上あるコマンドを名前付きパイプで繋ぐ

# 中間ファイルを作らないために
複数のコマンドをパイプで繋ぐのはよくやるけど、

```shell
$ command1 | command2
```
入出力が2つ以上あるコマンドを同じように繋げたい場合はどうしたらいいだろうか？

```shell
$ command1 -out1 output1 -out2 output2
$ command2 -in1 output1 -in2 output2
```

# 名前付きパイプを使う
`mkfifo`コマンドを使うと名前付きパイプという特殊ファイルを作成できる。
こちらの記事が分かりやすい：[mkfifoコマンドって使ってますか？](https://qiita.com/richmikan@github/items/bb660a58690ac01ec295)

いつものパイプでは2プロセス間でストリーム1つ分しかやりとりできないけど、名前付きパイプなら必要な数だけ用意すればいくつでも対応できる。

```shell
$ mkfifo fifo1 fifo2
$ command1 -out1 fifo1 -out2 fifo2 &
$ command2 -in1 fifo1 -in2 fifo2
$ rm fifo1 fifo2
```

# デッドロック対策
`command1`が2つの出力先に交互に出力して、`command2`も2つの入力を交互に読み込むような、コマンド間で入出力の順番がおおよそ一致している時はうまくいくが、場合によってはデッドロックが発生してしまう。
例えば、`command1`は交互に出力するけど`command2`がしばらく`fifo1`の方ばかり読み込むことがある状況では、

1. `command1`は`fifo1`と`fifo2`へ交互に書き込む
2. `fifo2`にだけデータが溜まっていく
3. `fifo2`のバッファがいっぱいになる
4. `fifo2`は`command1`からの書き込みをブロックする
5. 特に対策がなければ`command1`は`fifo2`のバッファが空くのを待つことになる
6. `command2`が`fifo1`を空にする
7. `command2`がいくら待っても`fifo1`からデータは流れてこない
8. ＿人人人人人人人人＿  
＞　デッドロック　＜  
￣Y^Y^Y^Y^Y^Y^Y￣

みたいなことがある。
パイプのバッファサイズは場合によるが、せいぜい64KiBのようだ[^1]。

対策としては、間に適当なサイズのバッファを挟むのが楽だと思われる。例えば[mbufferコマンド](http://www.maier-komor.de/mbuffer.html)などがいい感じ。

```bash
$ mkfifo fifo1 fifo2
$ command1 -out1 fifo1 -out2 fifo2 &
$ command2 -in1 <(mbuffer -q -i fifo1) -in2 <(mbuffer -q -i fifo2)
$ rm fifo1 fifo2
```

# 参考
[^1]: [How big is the pipe buffer?](https://unix.stackexchange.com/questions/11946/how-big-is-the-pipe-buffer) - パイプのバッファサイズを確認できるスクリプトの例もある
【React Native】Navigationの特徴

## React Navigation
 - https://reactnavigation.org/docs 
 - https://github.com/react-community/react-navigation

###特徴
- StackNavigatorではページ遷移の始まりと終わりでイベントハンドリングができる。
 - nTransitionStart - Function to be invoked when the card transition animation is about to start.
 - onTransitionEnd - Function to be invoked once the card transition animation completes.


- 下記の三つの基本的な遷移のみ取り扱っている。
 - StackNavigator - 一度に1画面をレンダリングし、画面間の遷移を提供します。新しいスクリーンが開かれると、それはスタックの上に置かれます。
 - TabNavigator - 複数の画面を切り替えるためのタブバーをレンダリングします。
 - DrawerNavigator - 画面の左からスライドするドロワーを提供します

- 導入が比較的簡単

## React Native Navigation
 - https://wix.github.io/react-native-navigation/#/
 - https://github.com/wix/react-native-navigation/

###特徴
- 遷移完了タイミングのハンドリングが用意されていない。
- 導入が比較的面倒(xcodeを触る。)
- 機能が充実している
  - Navigation
  - startTabBasedApp
  - startSingleScreenApp
  - showModal
  - showLightBox
  - handleDeepLink
  - registerScreen
  - getCurrentlyVisibleScreenId



純正Navigationはなくなった。
http://snippets.feb19.jp/?p=1891

## 参考
https://blog.mismithportfolio.com/web/20161224rnrouting
知ったかぶりをしていたソケット通信の基礎を改めて学んでみる

この記事は、 [BRIGHT VIE Advent Calendar 2017 - Qiita](https://qiita.com/advent-calendar/2017/brightvie)の 22日目の記事になります。

# はじめに

最近社内でもソケット通信でのやりとりを行う案件が多くなってきており、なんとなくの理解でこれまで来てしまっていたので、改めてソケット通信を理解するために調査がてら簡単にまとめてみようと思います。

# ソケット通信とは

> ソケット インターネットはTCP/IPと呼ぶ通信プロトコルを利用しますが、そのTCP/IPをプログラムから利用するには、プログラムの世界とTCP/IPの世界を結ぶ特別な出入り口が必要となります。 その出入り口となるのがソケット(Socket)であり、TCP/IPのプログラミング上の大きな特徴となっています。
> 引用元: http://research.nii.ac.jp/~ichiro/syspro98/socket.html

とのことで、普段利用しているHTTP通信もソケット通信を行っているのですね。

# OSI参照モデル

OSI（Open System Interconnection）参照モデルとは、ISOで定められている、異なるベンダー間で相互に通信を行うためのネットワークモデルと言われる統一規格のことです。
高校生の頃、初級シスアドを取得するために必死で学んだ方も中にはいらっしゃるのではないでしょうか。

ここでソケット通信は、TCP/IPを利用する通信全般のことであるため、トランスポート層を指します。そして、そのソケットを利用してアプリケーション層のHTTP通信などが行われているというイメージですね。

簡単にまとめると、
・TCPは、「データの内容はおいといて、通信デバイス間での通信内容を確実に送受信するためのルール」を定めているプロトコル
・HTTPは、「TCPにさらにルールを追加して、送受信されるデータの形式や送受信タイミングをWebサイト閲覧に最適化する形に定められたルール」
と考えると分かりやすいかもしれませんね

- [【TCP/IP】勉強がてらHTTPクライアントもどきをPythonで作ってみる](https://qiita.com/chooyan_eng/items/087d2fd20294ed35e550)
- [ソケット通信とHTTP通信](http://pospome.hatenablog.com/entry/20121222/1356157664)
- [OSI参照モデルまとめ](https://qiita.com/tatsuya4150/items/474b60beed0c04d5d999)


# ソケットを使うと何が出来るの？

上記OSI参照モデルからもわかるように、HTTPよりも下のレイヤを扱うことが出来きます。
また、ソケットを使うとTCP/UDP上で動く（トランスポート層レベル）アプリケーションを開発することが出来るため、HTTPよりもよりコンパクトな通信を使ってデータを送信したいといったことも可能となります。

- [PHPで学ぶソケットプログラミング入門](http://slides.com/ryoutsunomiya/php-socket-programming#/3)

# ソケット通信のライフサイクル

ソケット通信を行う上で知っておきたいライフサイクルについて箇条書きベースで記載してみます。
下記のような処理を実際のプログラムに組み込むような形となります。

## サーバ側のライフサイクル

- create ソケットの作成
- bind ソケットを特定のIPアドレスとポートに紐付け
- listen 接続の待受を開始
- accept 接続を受信
- close 接続を切断

## クライアント側のライフサイクル

- create ソケットの作成
- bind  ソケットを特定のIPアドレスとポートに紐付け
- connect リモートソケットに接続
- close 接続を切断

# まとめ

簡単にですが概要をまとめてみましたが、簡易的な通信をするくらいだったら調べればすぐに出来そうなレベルであるが、実際にサービスとして運用させるのであれば、ディスクリプタの枯渇やpingは通るのにconnect出来ないといったトラブル対応が曖昧な知識ではなかなか厳しそうだなという印象でした。
そのあたりも意識した実装が必要になるため、しっかり勉強した上で取り組んでいきたいところですね。


以下調査している時面白かった記事のリンクになります。


- [調べなきゃ寝れない！と調べたら余計に寝れなくなったソケットの話](https://qiita.com/kuni-nakaji/items/d11219e4ad7c74ece748)
- [何でもかんでもSocketを使うな](https://anopara.net/2014/02/24/%E4%BD%95%E3%81%A7%E3%82%82%E3%81%8B%E3%82%93%E3%81%A7%E3%82%82socket%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AA/)
- [まつもと直伝　プログラミングのオキテ 第16回　ネットワーク・プログラミング（ソケット編）](http://itpro.nikkeibp.co.jp/article/COLUMN/20071031/285990/?rt=nocnt)
CygwinのVIMで、コマンドモード復帰時にIMEをオフにする

#経緯
過去に、いろいろな環境でVIMのコマンドモード復帰時にIMEをオフにする話題がありましたが、自分が使っているCygwin+VIMだと情報が乏しかったり、リンク切れだったりしたので、まとめなおしてみました。
#必要なもの
以下のサイトを参考にしています。
[Cygwin版VimでIME自動切り替えへの道 - 野望編](http://atsuoishimoto.hatenablog.com/entry/20120219/1329663906)

1. minttyの置き換え
以下のパッチをminttyのソースに当ててビルドする。といいたいところですが、パッチが古いのでいろいろ中身を解釈してマージして下さい。
[GitHubGist/kanonji/mintty-manage-ime.patch](https://gist.github.com/kanonji/3522851)
面倒な方は自分がビルドしたものをここに上げておきます。
[mintty.exeのzip書庫 (cygwin 64bit用)](http://slap.jpn.org/storage/mintty64.zip)
[mintty.exeのzip書庫 (cygwin 32bit用)](http://slap.jpn.org/storage/mintty32.zip)

2. [im_control.vim](https://github.com/fuenor/im_control.vim/blob/master/plugin/im_control.vim) を ~/.vim/pluginにコピーする。
3. ~/.vimrcに以下の設定を記述する

```vim:.vimrc
function! IMCtrl(cmd)
  let cmd = a:cmd
  if cmd == 'On'
    silent !echo -n -e "\0033[1v"
    redraw!
  elseif cmd == 'Off'
    silent !echo -n -e "\0033[0v"
    redraw!
  elseif cmd == 'Toggle'
    silent !echo -n -e "\0033[2v"
    redraw!
  endif
  return ''
endfunction
```
以上です。
#終わりに
atsuoishimotoさん、kanonjiさん、ありがとうございます。
おかげでめちゃ快適です。
Python2 > UDP > コマンド応答処理 > udpResponder_171222 > v0.1

```txt:動作環境
CentOS 6.8 (64bit)
   Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Ubuntu 16.04 LTS
   Python 2.7.11+
```

C++ BuilderのUDP通信プログラムのデバッグとして、CentOS6.8で動作するPythonスクリプトを実装した。

### 処理

- UDPコマンドを受信する
- コマンドに対応する応答を返信する

### code v0.1

```udpResponder_171222.py
import socket as skt
import json

'''
v0.1 Dec. 22, 2017
  - add [myDict] dictionary
  - add udpResponder()
'''

# on Python 2.6.6

myDict = {
    "hello": "hi",
    "serious": "I'm serious",
}

RECV_TIMEOUT_MSEC = 300


def udpResponder(port_in):
    inst = skt.socket(skt.AF_INET, skt.SOCK_DGRAM)
    inst.bind(('', port_in))
    inst.setblocking(0)
    while True:
        try:
            data, adr = inst.recvfrom(RECV_TIMEOUT_MSEC)
        except skt.error:
            pass
        else:
            print("from:", adr)
            print("rcvd:", data)
            data = data.rstrip('\n')
            data = data.rstrip('\r')
            data = data.rstrip('\n')
            #
            rep = myDict.get(data)
            if rep is None:
                continue
            print("ret:", rep)
            inst.sendto(rep, adr)

udpResponder(7000)

```

- コマンド終端は`<CR><LF>`、`<CR>`、`<LF>`、`<LF><CR>`に対応
    - [改行コード > LF CRの例](https://qiita.com/7of9/items/38b2a680cef6b52dabba)
- コマンド応答のテーブルはmyDictに記載している
    - 別ファイルにしても良い
    - csvやJSONにするなど

## 実行例

UDPコマンド送信側はNonSoftさんの[UDP/IPテストツール](http://nonsoft.la.coocan.jp/Download/UdpTool/index.html)を使わせていただきました。

いつも役立っています。

```bash
$ python udpResponder_171222.py 
('from:', ('192.168.XXX.141', 9000))
('rcvd:', 'hello\r\n')
('ret:', 'hi')
('from:', ('192.168.XXX.141', 9000))
('rcvd:', 'serious\r\n')
('ret:', "I'm serious")
('from:', ('192.168.XXX.141', 9000))
('rcvd:', 'hi\r\n')
```

```txt:UDP/IPテストツール側
接続                (9000 )
送-> 192.168.XXX.140 (7000 )hello<CR><LF>
->受 192.168.XXX.140 (7000 )hi
送-> 192.168.XXX.140 (7000 )serious<CR><LF>
->受 192.168.XXX.140 (7000 )I'm serious
送-> 192.168.XXX.140 (7000 )hi<CR><LF>
切断                (9000 )
```

### 関連

- [python > udp > echo server](https://qiita.com/7of9/items/15caaa83c6224e7a4b0b)
- http://docs.python.jp/3/library/string.html

### Python 3

Visual Studio 2017 communityにPython 3環境を構築し、上記のコードを実行した。
`data = data.rstrip('\n')`の部分で以下のエラーになった。

> TypeError: a bytes-like object is required, not 'str'

Ubuntu 16.04 LTS + Python 3.5.2でも同じエラーになった。
以下のような処理が必要になる。

```py
data = data.decode("utf-8")
```
TouchDesigner ショートカット一覧

#General

* `Crtl+Z/⌘+Z` : 戻る
* `Crtl+Y/Shift+⌘+Z` : 進む
* `Crtl+X/⌘+X` : カット
* `Crtl+C/⌘+C` : コピー
* `Crtl+V/⌘+V` : ペースト
* `ミドルボタン+ドラッグ or スクロールホイール` : 拡大縮小
* `ミドルボタン` : オペレータの情報を表示
* `スペースバー` : タイムラインのPlay/Pause
* **`F1` : PerformModeに入る**

#Files

* `Ctrl+N/⌘+N` : 新規ファイル作成
* `Ctrl+O/⌘+O` : ファイルを開く
* `Ctrl+S/⌘+S` : 保存
* `Ctrl+Shift+S/Shift+⌘+S` : 名前をつけて保存
* `Ctrl+I/⌘+I` : ファイルをインポート
* `Ctrl+Shift+M/Shift+⌘+M` : ムービーをエクスポート
* `Ctrl+Q/⌘+Q` : 終了

#Dialogs

* `Alt+P/⌘+,` : Prefernces を開く
* `Alt+Shift+V` : TouchDesigner についてを開く
* `Alt+F` : エクスプローラ/Finder を開く
* `Alt+T` : Textport and DATs を開く
* `Alt+Y` : Performance Monitor を開く
* `Alt+W` : Window Placement を開く
* `Alt+L` : Palette を開く
* `Alt+D` : MIDI Device Mapper を開く
* `Alt+C` : Console を開く
* `Alt+K` : Key Manager を開く
* `Alt+S` : Search を開く

#Network Editor

* `Tab or ダブルクリック` : オペレータの追加
* **`Shift+X` : .toxファイルからコンポーネントをロード**
* `Ctrl+F/⌘+F` : オペレータ検索
* `Shift+V` : 親オペレータのViewを表示
* `P` : パラメータ表示/非表示
* `Shift+T` : List Viewer 表示/非表示
* `Ctrl+G/⌘+G` : Groups 表示/非表示
* `Shift+G` : グループを追加
* `A` : 選択しているオペレータ アクティブ/非アクティブ
* `Shift+A` : 全オペレータ アクティブ/非アクティブ
* `N` : オペレータの名前のサイズを固定/可変
* `S` : Wireの直線/曲線切り替え
* `X` : 参照の表示/非表示
* `O` : Network Overview 表示/非表示
* `C` : Color Palette 表示/非表示
* `Shift+L` : 選択しているオペレータのレイアウトを整える
* `H(+Shift)` : (選択している)オペレータが全て画面内に収まるように表示
* `U` : 一つ上の階層へ移動
* `I or Enter/Return` : 一つ下の階層へ移動
* `Ctrl+A/⌘+A` : 全選択
* `B` : Bypass切り替え

#Pane Options

* **`Alt+[` : パネルを左右に割る**
* **`Alt+]` : パネルを上下に割る**
* `Alt+Z` : パネルを閉じる
* `Alt+1` : Network Editor
* `Alt+2` : Panel
* `Alt+3` : Geometry Viewer
* `Alt+4` : TOP Viewer
* `Alt+5` : CHOP Viewer
* `Alt+6` : Animation Viewer
* `Alt+7` : Parameters
* `Alt+9` : Textport and DATs

#TOP Viewer

* `左ボタン+ドラッグ` : 移動
* `ミドルボタン+ドラッグ` : 拡大/縮小
* `H` : 画面内に収まるように表示
* `D` : ピクセルの情報を表示/非表示
* `F` : フィールドガイドを表示/非表示
* `C` : カラー表示
* `R` : 赤のみ表示
* `G` : 緑のみ表示
* `B` : 青のみ表示
* `A` : アルファ値のみ表示
* `M` : モノクロ表示

#CHOP Viewer

* `左ボタン+ドラッグ` : 移動
* `ミドルボタン+ドラッグ` : 拡大/縮小
* `H` : 画面内に収まるように表示
* `Shift+H` : 水平方向で合わせる
* `Shift+V` : 垂直方向で合わせる
* `U` : Samples/Frames/Seconds 切り替え
* `G` : グリッドの細かさ切り替え
* `C` : チャンネル名 表示/非表示
* `N` : パラメータが表示され変更可能
* `D` : サンプルごとにドットを打つ
* `X` : 値の範囲外も表示する
* `S` : スコープツールの表示

#SOP & Object Comp Viewer

<img src="https://qiita-image-store.s3.amazonaws.com/0/175399/4c8d648a-91a1-fbb4-d296-63206927d92b.png" width=50%>

* `左ボタン+ドラッグ` : 回転
* `右ボタン+ドラッグ` : 移動
* `ミドルボタン+ドラッグ` : 拡大/縮小
* `P` : Display Options の表示
* `H` : 画面内に収まるように表示
* `W` : Wireframe 表示切り替え
* `O` : Ortho/Perpective 切り替え
* `1/2/3/4/5` : 視点切り替え

#DATs

* `Ctrl+E/⌘+E` : コンテンツを編集(設定しているエディターを起動)
* `Ctrl+R/⌘+R` : スクリプトを実行

#Parameter

* `P` : パラメータ 表示/非表示
* `ミドルボタン or 左ボタン＋ホールド` : Value Ladder

#Textport

* `Ctrl+F` : 検索
* `Ctrl+L/⌘+L` : Python/Tscript 切替
react と preact の評価時間を検証

## 意味

PWAでアプリを作ろうとすると、offline cache である程度ロード時間を無視できるとしても、 JSのCPU上の評価時間が支配的になっていく。

preact-compat(30kb) と react(91kb) でどれだけの差がでるのか調べることにした。

## 対象

このリポジトリ。 https://github.com/mizchi-sandbox/pwa-base
ルーター、 redux を含んでいる。 react, preact 以外の depｓ はこう。

```
  "dependencies": {
    "axios": "^0.17.1",
    "babel-polyfill": "^6.26.0",
    "react-redux": "^5.0.6",
    "recompose": "^0.26.0",
    "redux": "^3.7.2",
    "redux-logger": "^3.0.6",
    "redux-promise": "^0.5.3",
    "redux-thunk": "^2.2.0"
  },
```

ここにデプロイしてある
https://elegant-swanson-8f6420.netlify.com/

## 圧縮方法

uglify + gzip

## 評価方法

preact + preact-router / react + react-router
DevTools で Performance タブで CPU 1x と CPU 6x slowdown で比較

## webpack.config.js

```
/* eslint-disable */
const path = require('path')
const webpack = require('webpack')
const UglifyJSPlugin = require('uglifyjs-webpack-plugin')
const CompressionPlugin = require('compression-webpack-plugin')
const htmlPlugin = require('html-webpack-plugin')

const pkg = require('./package')
const ENV = process.env.NODE_ENV || 'development'
const DEV_PORT = 4444

const hmrEntries = [
  'react-hot-loader/patch',
  `webpack-dev-server/client?http://localhost:${DEV_PORT}`,
  'webpack/hot/only-dev-server'
]

const deps = Object.keys(pkg.dependencies)

module.exports = {
  entry: {
    vendor: (ENV !== 'production' ? hmrEntries : []).concat(deps),
    app: ['./src/index.js']
  },
  output: {
    filename: '[name].bundle.js',
    chunkFilename: '[name].bundle.js',
    path: __dirname + '/public',
    publicPath: '/'
  },
  devServer: {
    contentBase: 'public/',
    historyApiFallback: true,
    port: DEV_PORT
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: 'babel-loader',
        exclude: /node_modules/
      }
    ]
  },
  resolve: {
    alias: {
      react: 'preact-compat',
      'react-dom': 'preact-compat',
      'preact-compat': 'preact-compat/dist/preact-compat'
    }
  },
  plugins: [
    new webpack.NamedModulesPlugin(),
    new webpack.optimize.CommonsChunkPlugin({
      name: 'vendor',
      filename: 'vendor.bundle.js'
    }),
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify(
        process.env.NODE_ENV || 'development'
      )
    }),
    new htmlPlugin({
      template: 'src/ssr/index.ejs',
      minify: false
    })
  ].concat(
    ENV === 'production'
      ? [new UglifyJSPlugin({}), new CompressionPlugin()]
      : []
  )
}
```

vendor.bundle.js と app.bundle.js ２つ生成している

## preact

size: 108kb
evaluate(CPU 1x): 151ms
evaluate(CPU 6x slowdown): 571ms

## react

size: 120kb
evaluate(CPU 1x): 244ms
evaluate(CPU 6x slowdown): 960ms

## 結果

圧縮後は思ったよりサイズの差は出ない。

評価時間は PC でも 100ms、 遅い環境だと顕著になっていく。

Chrome Dev Tools だと No throttling 4x 6x の三択なんだけど、これがどういう意図の数値なのかは知らないけど、なんとなくモバイル相当だと予想している。
社会人になってずっと試行錯誤している勉強方法

こんにちは、
PLAIDアドベントカレンダーの22日目を担当します。
株式会社プレイドのエンジニアの伊藤です。
**学習すること**について話します。

## はじめに

エンジニアという職業をはじめて2年近くが経ちますが、「勉強が大変な仕事だね。」といった内容のことを言われることが多い気がします。個人的には、すべての職業において勉強が必要だとは思っているのですが、最近のWEBの技術は移り変わりも速く、似たような技術がいくつも存在する状況を考えると、確かにエンジニアはことに勉強しなければならない仕事というのも頷けます。

実際に、筆者もわからないことだらけで勉強しなければ仕事にならないため、働きながら勉強を続けているわけですが、色々勉強のやり方を調べた結果どれもうまくいかず、そのなかで試行錯誤しながら実践していることをご紹介できればと思います。

## 実践していること

### 聞くこと

ひとりで無駄に悩んで時間をかけてしまい結局分からず誰かに相談しに行ったら瞬殺だったり、ミーティング中によく分からないにも関わらず羞恥心から分かっているふりをしてしまったりすることってありませんか？

私自身も入社当初は羞恥心や自尊心から素直に聞くことがうまくできず、なかなか前に進まないことがかなりありました。

このような経験は誰にでもあると思いますが、時間のない業務中や限られた勉強時間のなかでいかに速く学習するかは、社会人が学ぶことにおいて重要なテーマです。
そして、働きながら学ぶうえで、もっとも大事なことは働いている時間をいかに学びの場にするかだと思います。そのための重要な方法のひとつが、聞くことです。

聞かなければ何も得られませんが、素直にわからないことを表明して、聞くことで何かが得られる機会になります。

[プログラマが知るべき97のこと](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E5%AD%A6%E3%81%B3%E7%B6%9A%E3%81%91%E3%82%8B%E5%A7%BF%E5%8B%A2/) の「学び続ける姿勢」というエッセイでも、

>常に自分よりレベルの高い人と仕事をするようにする。自分よりレベルの高い入が周囲にいないと、学ぶことは難しくなる。誰からでも何かが学べるというのは確かだが、自分より賢明で経験も豊富な人から学べることは、やはり圧倒的に多い。...

と言っているように、レベルの高い人、生産性の高いエンジニアに聞くことは一定の効果があると思います。また、アンチパターンやベストプラクティスなど実際に経験してみないと何故それが良いのか分からないこともあり、実際の現場のなかで、経験者からその理由を聞くことも一人で勉強するよりも理解度が高かったです。

### アウトプットの場を用意する

ただ、聞いてばかりだと、頭には結局残らないことがおおいので、アウトプットの場を用意して自分の血肉にする必要があります。そのため、二つ目に実践していることは、勉強したことのアウトプットの場を用意することです。

学生時代の勉強は試験や対策問題集といったアウトプットの場が多く、問題集を解いたり、試験の復習をすることで知識の定着を図っていたと思います。しかし、業務中のシーンでは目の前にアウトプットの場がある状態で聞いていることも多いと思いますが、普段のシーンではアウトプットの場がすぐにないことのほうが多いはずです。そのため、社会人の場合、本を読むことや人の話を聞くことはあっても、アウトプットの場は意識的に自ら作っていく必要があると感じました。

たとえば、私が本を使って勉強するときに実践している方法としては、以下のとおりです。

1. 本をある程度読む (e.g. 一章 / 一節)
2. 本を閉じて、その章に何が書いてあったかを文章にしてまとめる。
3. 本を眺めて、答え合わせをする。
4. もう一度 1 に戻る。

色々試した結果、やるのはしんどいですが、この実践方法がもっとも身になったので続けています。

### 何を知りたいのかを明確にしてかいつまむ

上記では、アウトプットの工夫について書きましたが、ご察しの通り、この方法で技術書を一冊読もうとすると、1ヶ月とか平気で使ってしまいます。それでは、コスパがあまりにも良くないため、次nに本を一冊読まないで読みたいところだけ読むということを実践しました。

本を手に取ると、どうしても一冊全部読まないと気がすまないという完璧主義が働きがちなのですが、実は、一冊読んでも印象に残っている部分は10%程度くらいしかなかったり、その本から欲しかった情報は全体のたった2, 3 章でしかなかったりしたので、それならば最初から読む場所を絞ろうと思って、完璧主義をやめました。 (私はこの完璧主義の克服がかなり難しかった。)

やることはシンプルで、以下のようにやってます。

1. この本で何を知りたいかを箇条書きで 3, 4 項目書く。
2. 目次を見て、読む章を決める。
3. 上記のアウトプットの方法に則って本をよむ。

これのおかげで、本を読む冊数が圧倒的に増えていて、個人的には非常に満足しています。
いままで、この本のあの章が読みたいのに、そこまで行く前に挫折したという経験を何度もしていたのですが、これを実践してからその感覚がなくなりました。


### 最後に

ここでまとめた話はあくまで**私**が試行錯誤しながら、なんとなくしっくりきていることで、
当然すべての人にとってのシルバーバレットではありませんし、「俺が考えた最強の勉強法」とかいうものでもありません。

もしかしたら、ここで記載したやり方はどこかで読んだことがあるようなものかもしれません。
ただ、昔から勉強法とかを調べるのが好きで、いろいろ試して続かないことばかりだった結果、自分の性格に適したやりかたを模索して、試行錯誤した結果の形になります。

今後もより学習効果の高い自分にあった方法にアップデートするために改良していけたらなぁと考えています。

P.S. 来年は技術的な記事を書きたいですね。
Google Cloud Platform逆引きメモ

必要に迫られたGCP関連の逆引きメモになります。

# Cloud Shell

## プロジェクトの削除

リソース管理の画面からチェックボックスを選択して削除出来ますが、なんらかの問題が発生するとダイアログが表示されて削除出来ない事が有ります。筆者が遭遇したのは`このプロジェクトにはリーエンがあります。`と表示されるだけで削除出来ない事がありました。
しかし、Cloud Shellから削除コマンドを実行するとエラーの内容がある程度表示されるので削除されない原因を確認しやすいです。

```
$ gcloud projects delete example-foo-bar-1
```

# 参考

[gcloud projects delete | Cloud SDK | Google Cloud Platform](https://cloud.google.com/sdk/gcloud/reference/projects/delete)
とあるコミットから特定ファイルの変更のみを戻した時のメモ

コミットしましたー。

あ、このファイルはマージたくないから戻して〜

分かりましたー

どうするんだろう？

```
1. 戻したいコミット番号を調べる
git log [ファイルパス]
ex:) git log application/controllers/example.php

2. 戻す
git checkout [コミット番号] [ファイルパス]
ex:) git checkout 392280326ad37636de880dfd671b30d1bdd9c768 application/controllers/example.php
```
で出来ます。


ちなみに、新規ファイルを消したい場合は

```
git rm application/controllers/example.php
```
で出来ます。
Gitの初期設定をする際の覚書

新しいPCにcloneしようとするたびにいつも忘れて調べてる気がするので記事にする

## SSH設定
```
$ cd /c/users/自分のユーザー名/.ssh
```
へ移動し、秘密鍵を作成する。

```
$ ssh-keygen -t rsa -C "登録名"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/自分のユーザー名/.ssh/id_rsa): ファイル名を入力
Enter passphrase (empty for no passphrase): (そのままEnterでOK)
Enter same passphrase again: (そのままEnterでOK)
Your identification has been saved in ファイル名.
Your public key has been saved in ファイル名.pub.
```

秘密鍵を追加する

```
$ ssh-add ファイル名
```

Could not open a connection to your authentication agent
って出たら以下を追加してssh-addを再実行

```
$ eval `ssh-agent`
```

あとはファイル名.pubをcatで開いて中身コピーして、GitHubのSettingからSSH Keyを追加してあげるだけ

## User設定
#### グローバルで設定する場合
```
$ git config --global user.name "ユーザー名"
$ git config --global user.email "メールアドレス"
```

#### 特定のリポジトリを利用する際に別設定でコミットしたい時
```
$ cd 対象リポジトリ
$ git config user.name "ユーザー名"
$ git config user.email "メールアドレス"
```
Gazebo SITL Pluginをbuildする。

##元記事
https://github.com/intel/gazebo-sitl

|`環境`     |       |
|----------|--------------------------|
|**OS**     |**ubuntu 16.04**         |
|**kernel**|**4.10.0-28-generic**     |
|**Gazobo**  |**8.2.0**               |
|**Arducopter**|**3.4.6**               |

##Gazebo SITL Plugin
Build Status  Coverity Scan Build Status

A ROS-independent Gazebo plugin for Ardupilot's SITL.

Requirements
* Python 2.7+ (to generate mavlink headers)
~~* MavProxy (https://github.com/Dronecode/MAVProxy)~~
**こっちの方がわかりやすい**
* MavProxy (https://ardupilot.github.io/MAVProxy/html/getting_started/download_and_installation.html#linux)
`sudo apt-get install python-dev python-opencv python-wxgtk3.0 python-pip python-matplotlib python-pygame python-lxml`
**Note**
On some older Linux systems, python-wxgtk3.0 may be instead named as python-wxgtk2.8.

`pip install MAVProxy`

* Ardupilot (https://github.com/ArduPilot/ardupilot)

##Build and Install
Make sure you have initialized and updated the Mavlink submodule at least once with:
`git clone https://github.com/intel/gazebo-sitl.git`
`cd gazebo-sitl`
`git submodule update --init --recursive`

Create a build folder, make and install using CMAKE as follows:
`mkdir build
cd build
cmake ..
sudo make install
cd -`

Download Gazebo models if necessary:

Gazebo automatically searches and downloads models referenced in the .world file that are not already present into GAZEBO_MODEL_PATH. However, in some cases the download might take a long time for no apparent reason. Download the Quadrotor model manually with:
~~cd ~
curl http://models.gazebosim.org/quadrotor/model.tar.gz | tar xvz -C GAZEBO_MODEL_PATH~~
`mkdir ~/world 
cd ~/world
git clone https://github.com/intel/gazebo-sitl.git`

Run
Open a second terminal and run Ardupilot:

`{ARDUPILOTDIR}/build/sitl/bin/arducopter --model x --defaults {ARDUPILOTDIR}/Tools/autotest/default_params/copter.parm`
In a third terminal, run Mavprox
`mavproxy.py --master tcp:127.0.0.1:5760 --out udp:127.0.0.1:15556`
Open the Gazebo gzsitl_drone_target world file with the following command:

~~gazebo ./world/gzsitl_drone_target.world --verbose~~
`gazebo ./world/gazebo-sitl/world/gzsitl_drone_target.world --verbose`



![Screenshot from 2017-12-22 11-23-40.png](https://qiita-image-store.s3.amazonaws.com/0/148248/a6177211-aa65-00ce-e303-8144e36541ef.png)


Interaction
The Plugin first detects if the vehicle being simulated on SITL is Landed or already Airborne.

If Landed, store the initial position as home, set flight mode as guided and request take-off.
If Airborne, request home position, and keep the current flight mode.
When Airborne, the vehicle follows the transparent sphere (target).

Troubleshooting
Gazebo might fail to open if the needed models or plugins are not found. If that happens, make sure the needed plugins have been successfully built and installed into your shared libraries directory and that all the needed models are present into GAZEBO_MODEL_PATH. The Gazebo --verbose terminal output is useful for determining whether a plugin or a model has not not been found.
macOS 再起動で GitHub と SSH 接続できなくなる【Sourcetree】

# はじめに
結論としては Sourcetree 側の不具合だと思われます。単純な不具合回避方法としてご覧ください。
（Sourcetree を批判するものではありません）

# 環境と現象
環境：
- macOS Sierra 10.12.6
- Sourcetree 2.6.3
- `brew cask` でインストール
- GitHub、Bitbucket で確認
- Sourcetree 側に GitHub アカウントを登録
- **Sourcetree 側で SSH 鍵を作成** ＆ GitHub 登録

現象：
macOS を再起動すると SSH で GitHub 等にアクセスできなくなる
* `Permission denied (publickey).` と言われる
* Sourcetree 経由でも コマンド経由でも同様

# 原因と対策
原因は Sourcetree 側で `~/.ssh/config` に自動追加される設定です。

```shell:~/.ssh/config
# --- Sourcetree Generated ---
Host AkkeyLab-GitHub
	HostName github.com
	User AkkeyLab
	PreferredAuthentications publickey
	IdentityFile ~/.ssh/AkkeyLab-GitHub
	UseKeychain yes
	AddKeysToAgent yes
# ----------------------------
```

`User` の項目が GitHub アカウントのものになっていますが、 `git` にしてあげなければなりません。
したがって、以下のように変更することで再起動しても SSH 接続ができるようになります。

```shell:~/.ssh/config
# --- Sourcetree 修正版 -------
Host AkkeyLab-GitHub
	HostName github.com
	User git
	PreferredAuthentications publickey
	IdentityFile ~/.ssh/AkkeyLab-GitHub
	UseKeychain yes
	AddKeysToAgent yes
# ----------------------------
```
初対面で会う時のドキドキについて

![alt](https://qiita-image-store.s3.amazonaws.com/0/8292/ef5f6cbc-0702-1c98-580f-786429f835e5.gif)

この記事は[aratana Advent Calendar 2017](https://qiita.com/advent-calendar/2017/aratana) 22日目の記事です。

昨日は[@mokamoto12](https://qiita.com/mokamoto12)さんの[bashスクリプトやPHPを実行できるslack botを作る](https://qiita.com/mokamoto12/items/17d341328f3275fba66b)でした。
エンジニアの皆さんに作っていただいているbotに、いつもお世話になりっぱなしです。

# はじめに
クリスマスまで残り3日...　みなさまいかがお過ごしでしょうか？
はじめまして！岡園です。アラタナのマーケティングループでWeb広告の運用をしております。

私はエンジニアではありませんのでプログラミング技術についてお伝えすることはできませんが、エントリーのお許しをいただきましたので広告運用をしながら思うことを書いてみようと思います。


# 初対面の人と会うとき

初対面の人に合うとき、緊張しますかーー？
私は人見知り（嘘つけ！とよく言われますが）なので、とても緊張するタイプです。初めて取引をするクライアントと会う、友人を紹介されるなど様々なシーンがありますね。みなさんもちょっと想像してみてください。

今回は、大人女子「Aさん」が合コンに参加するシーンを例にあげて見たいと思います（笑）。

\--------------------------------
■会う前

- どんな人がくるんだろう（ドキドキ）
- ちゃんとコミュニケーションとれるかな（ソワソワ）

■ご対面

- うわ。。イケメンだ（ドキドキ）
- 楽しい場になるといいなー（ワクワク）

■会話後

- 自分のことばっかりであまり話きいてくれなかったな。。（ガッカリ）
- 話が飛び飛びでなんのこと話しているかわからなかった。。（うーん）
- せっかくかっこいいのにあんまり良さがわからなかったな。。（ムム）
- あれじゃ次は会わないかも（終了）

\--------------------------------
※筆者の実体験ではございませんので、あしからず（笑）。


# Webサイトでも同じ体験をしている

初対面の人と会うときのドキドキを合コンを例にあげましたが、実は私はWebサイトで商品を探している人も同じような体験をしていると考えています。

「あ！これ気になる」と感じ、Webサイトに訪問して考える。

もちろん特定の商品ブランド商品を探している人など当てはまらない場合もあると思いますが、初対面の人と出会うように、ある程度身構えながら探していると考えると、どうやって自分のWebサイトに来てもらって購入してもらえばよいか想像しやすくなります。

では、Aさんの合コンをWebサイトで商品をさがしているAさんとして当てはめてみましょう。

\--------------------------------

■探す前

- どんな商品にしようかな（ドキドキ）
- どれをポイントに商品を選ぼうかな（ソワソワ）

■ご対面

- うわ。。このデザインいいな（ドキドキ）
- どんな情報になるかな（ワクワク）

■訪問後

- すごそうだけど、知りたい情報そこじゃないんだよな（ガッカリ）
- どこに知りたい情報があるかわかりにくいうWebサイトだな（うーん）
- せっかくデザインはいいのに、あんまり良さがわからなかったな。。（ムム）
- 違う商品にしよーっと（終了）

\--------------------------------

初めて訪問してくれるユーザーにどうやって情報を伝えるか、どう良さをアピールするか考えるときは初めて巡り合うユーザーにどう思われたいかの考えるユーザー目線がとても重要だと思います。
私はWebサイトに来てほしいユーザーに訪問してもらえるきっかけの1つが広告なので、魅力が伝わるような訴求を考えながら広告文を考えます。しかし、せっかく見つけてもらってWebサイトを訪問してもらったとしても商品を手に取ってもらえるとは限りません。いかに広告文やバナーがステキでも会話する内容「＝Webサイト」が身勝手だと、せっかくのチャンスを手にしてもこぼれ落ちてしまうのです。
その場合、広告のご相談を受けても、Webサイトの改修をおすすめする場合もあります。

# 最後に

いかがでしょうか？どんなサイトにしていくか考えるとき、初対面の人にどう自分の良さを伝えればわかってくれるかなーと考えると、はっとする気づきも生まれてくると思います。是非、想像してみてくださいね！

さーて、明日のエントリーは？
[kawahara_hiroyuki](https://qiita.com/kawahara_hiroyuki)さんです！お楽しみに！
Bootstrapを初めて使ってみる

#Bootstrapとは
Twitter社が開発したCSSのフレームワーク
レスポンシブルデザインに対応していて簡単に記述できるとか。

#Bootstrapのダウンロード方法
まずは下記URLから資材をダウンロードします。
今回は、v4.0.0をダウンロードしてみます。

URL　http://getbootstrap.com/

![2017-12-15_100859.jpg](https://qiita-image-store.s3.amazonaws.com/0/201860/3771c683-b71d-1bcf-ae5a-1b79a58e4f5f.jpeg)

![DL2.jpg](https://qiita-image-store.s3.amazonaws.com/0/201860/44f64e0c-88d0-9f78-8a31-726aacee5baf.jpeg)


解凍したら準備完了！
![フォルダ.jpg](https://qiita-image-store.s3.amazonaws.com/0/201860/065607fd-bb18-795b-6ff6-d6c4123dafc8.jpeg)

#早速使ってみよう
公式ページのサンプルをもとに
少し改編してみました。

```html:index.html
<html lang="ja">
  <head>
    <title>Hello, world!</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="css/bootstrap.min.css">
  </head>
  <body>
    <h1>Hello, world!</h1>

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>
```

注意点としては、javascriptを読み込むところのコメントに記載されているように
Jquery、Popper.js、Bootstrap JSという順番で読み込む必要があります。

Popper.jsというのはBootstrap4から追加された依存ライブラリらしいです。
JqueryとPopper.jsは外部から読み込んでいます。


`<h1>Hello, world!</h1>`
の箇所をBootstrap で用意されている方法でボタンにしてみます。

`<button type="button" class="btn btn-primary">Hello, world!</button>`

以上！画面で見るとこんな感じです。

![ボタン.jpg](https://qiita-image-store.s3.amazonaws.com/0/201860/89a165f2-673b-5b75-dff4-c87ed5bd1216.jpeg)

次回はBootstrap を使ってレスポンシブルな一般的なTOPページみたいなのを作ってみたいと思います！
(メモ)Laravel / Ruby on Rails 対比表

|                       |  Laravel                                        | Ruby on Rails                                                     |
|-----------------------|-------------------------------------------------|------------------------------------------------------------------ |
| 公式ドキュメント      | https://laravel.com/docs/                       | http://guides.rubyonrails.org/                                    |
| API一覧               | https://laravel.com/api                         | http://api.rubyonrails.org/                                       |
| GitHub                | https://github.com/laravel/laravel              | https://github.com/rails/rails                                    |
| パッケージマネージャ  | [composer](https://getcomposer.org/)            | [bundler](http://bundler.io/)                                     |
| コマンドツール        | [artisan](https://laravel.com/docs/artisan)     | [rails command](http://railsdoc.com/rails)                        |
| ORM                   | [Eloquent](https://laravel.com/docs/eloquent)   | [Active Record](https://railsguides.jp/active_record_basics.html) |
| Dependency Injection  | [Container](https://laravel.com/docs/container) |                                                                   |
| テンプレートエンジン  | [Blade](https://laravel.com/docs/blade)         | [ERB](http://railsdoc.com/view)                                   |
| Application Lifecycle | https://laravel.com/docs/lifecycle              |                                                                   |
| 開発環境セットアップ  | [homestead](https://laravel.com/docs/homestead) | [rails-dev-box](https://github.com/rails/rails-dev-box)           |
Athenaに法人番号データを入れて遊んでみる


用意するもの
---

* 法人番号のデータ
	* http://www.houjin-bangou.nta.go.jp/download/zenken/


shift-jisは文字化けするらしいので、unicodeで落としました。


データの加工
---

一度、unicodeで落としたCSVをそのままいれると、内部でパースエラーがおきたのか、正しくデータが挿入されませんでした。

なので、`seq`コマンドを使ってエラーの原因と思われる`"`を取り除きS3にアップロードしました。


データ加工までの流れ

```
# zipファイルの回答
$ unzip \*.zip
# 適当なディレクトリにcsvファイルを移動
$ mv *.csv /hogehoge
# seqコマンドでcsvのデータからゴミを取り除く
$ sed -e "s/\"//g" ./*.csv > fugafuga/all.csv
# gz圧縮をする。
$ tar -zcvf data.tar.gz fugafuga/
```

これでS3にアップロードするデータが出来上がりました。

Athenaに読み込ませてみる
---

![スクリーンショット 2017-12-22 10.35.03.png](https://qiita-image-store.s3.amazonaws.com/0/18331/0e6af268-6a9e-5422-6461-fedbb0fe1f5e.png "スクリーンショット 2017-12-22 10.35.03.png")

さきほどできあがったgzファイルのアップロード先のs3の情報をかく。

![スクリーンショット 2017-12-22 10.36.33.png](https://qiita-image-store.s3.amazonaws.com/0/18331/c6e6b661-1e7c-d3a9-5790-d1d600f67564.png "スクリーンショット 2017-12-22 10.36.33.png")

もちろんCSVなので、CSVを選択。

![スクリーンショット 2017-12-22 10.37.01.png](https://qiita-image-store.s3.amazonaws.com/0/18331/fbc50ae6-5b10-0c3c-91c2-7b004ab85fa8.png "スクリーンショット 2017-12-22 10.37.01.png")

カラムの定義です。
ちょうど自分は以下のスキーマを`Bulk add columns`で追加しました。
適当すぎる部分があるので、調整してください。

```
sequencenumber int, 
corporatenumber string, 
process string, 
correct tinyint, 
updatedate date, 
changedate date, 
name string, 
nameimageid int, 
kind string, 
prefecturename string, 
cityname string, 
streetnumber string, 
addressimageid int, 
prefecturecode string, 
citycode string, 
postcode string, 
addressoutside string, 
addressoutsideimageid int, 
closedate date, 
closecause string, 
successorcorporatenumber string, 
changecause string, 
assignmentdate string, 
latest date, 
enname string, 
enprefecturename string, 
encityname string, 
enaddressoutside string
```

これでほぼほぼできあがりです。

動かしてみる
---

東京都内にある、株式会社〜の企業を10件とってみましょう。

```
SELECT
	*
FROM
	corporatenumbers
WHERE 
	prefecturename = '東京都'
	 AND name like '株式会社%'
LIMIT 10;
```

![スクリーンショット 2017-12-22 10.42.28.png](https://qiita-image-store.s3.amazonaws.com/0/18331/0f845d47-2fc1-7433-a33a-da585f11581e.png "スクリーンショット 2017-12-22 10.42.28.png")

簡単に取れましたね
MacのOSバージョンアップしたらbundle exec pod installできなくなったよ😿

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60892/84e8e11a-7e72-9636-56f5-94b37b5793fc.png)

# OSアップデートしたら何かある
重い腰を上げてHigh SierraにOSをアップデートしました。
弊社podのバージョンを指定してまして

```console
$ bundle exec pod install
```

で、いつも操作するんですが、
high sierraにしてからエラーになるように。。

```console
$ bundle exec pod install
-bash: /usr/local/bin/bundle: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file or directory
```

2020/12/29追記
Big Surにした時はこんなエラーが出る

```console
Could not find rake-12.3.3 in any of the sources
```

😩😩😩

# しょーがない
とりまgoogる
`System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file or directory`で、検索🔍

[macOS High Sierraでcocoapodsが使えなかった話（解決） - Qiita](https://qiita.com/Kenelaoy/items/2746a6ff382fab42696a)

がHIT🔫🔫

> GitHubに該当記事があった（公開からだいぶ経ってGitHubであるべき表示がStackOverFlowになってるのに気づいた）  
> 別記事によれば、前にrubyバージョンが上がったのはMavericks以来で実に4年ぶりだそうな  

ということで、

```sh
sudo gem update --system -n /usr/local/bin
```

でもろもろアップデート
gemで入れたpodsもとりあえず入れなおしておく

```sh
sudo gem install cocoapods -n /usr/local/bin
```

普通にpod使ってる人はこれで解消するはず

さらに自環境だと`bundler`の入れ直しが必要だったので

```sh
sudo gem install bundler -n /usr/local/bin
```

を実行して、プロジェクトファイル下のgemfileあるところで

```sh
bundle install
```
※ Catalina以降はpath指定は非推奨になったので削除しました。（2020/12/29更新）

を実行して、gemfileに記載されてる`cocoapods`他もろもろインストール

やっとこ`bundle exec pod install`ができるように🎉🎉
gitでなんか起きた時に見るやつ

常時更新するやつ。なんか思いついたら追記する。

## You have not concluded your mergeって言われた

マージ間違えたので、一旦リセットしてからまたマージしようとしたら言われた

### 対処方法

黒い画面で

```
git reset --merge
```

※SouceTree使いはそのプロジェクトのSouceTreeの画面を開いて、端末をクリックしてターミナルを開いたら上のコマンドをペースとしてEnterを押すこと。

## Updates were rejected because the tag already exists in the remote. って言われた

プッシュしようと思ったら、その前の作業でタグ名を重複してつけてしまったらしい
Soucetreeで解消したはずなのに・・・
一旦Soucetreeで該当タグを削除（コミットを右クリック＞タグ＞タグを削除（リモートすべてからタグを削除））し、
タグを新たにつけ直すと直った

## 間違えて一気に修正したコミット前のファイル・行の一部をスタッシュにする

1. 右上の端末・ターミナルからターミナルを起動
2. ```git stash save -p "スタッシュ名""```
3. スタッシュしたいものはy、したくない（そのまま続けてコミットする）物はnで選択していく　途中でスタッシュをやめたいときはq
4. すべて答えると「スタッシュ名」のスタッシュができて、nしたものは作業ツリーに残る

参考：https://tivel.jp/archives/10015
SublimeTextでGoを実行する

[テコテックAdventCalendar2017](https://qiita.com/advent-calendar/2017/tecotec)の22日目の記事です。

みなさんGoしてますか？
PokemonGOではないですよ。
今回はGo言語をSublimeTextで実行する環境を作成してみました。

#環境
- Windows10
- Sublime Text 3

#準備
###1. Go のインストール
[こちら](https://golang.org/dl/)からダウンロードしてインストールします。
インストーラを実行するだけなので簡単ですね。

###2. 環境変数の設定
PathにGoのコンパイラの場所を設定します。
デフォルトの設定だと下記の場所にインストールされているはず。
カスタムした場合は適宜変更してください。
 - C:\Go\bin

###3. SublimeTextのビルド設定ファイルの作成
Goソースをビルドする設定ファイルを作成します。
作成する場所は「%homepath%\AppData\Roaming\Sublime Text 3\Packages\User」になります。
(SublimeTextのメニューから[基本設定]→[Packagesフォルダ]で開くフォルダの「User」フォルダ)
開いているファイルを実行するように設定します。

```go.sublime-build
{
    "file_regex": "^(...*?):([0-9]*):?([0-9]*)",
    "selector": "source.go",
    "shell_cmd": "go run ${file_name}"
}
```

#サンプルプログラムの実行
サンプルプログラムを動かしてみましょう。
###1. サンプルプログラムの用意
適当なディレクトリに以下の内容のファイルを作成します。

```go:hello.go
package main

import "fmt"

func main() {
    fmt.Printf("hello go!\n")
}
```
###2. 実行
hello.goを表示して、[ツール]→[ビルド]を選択するか、Ctrl+Bで実行できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217389/15f8eed9-7c80-6dc1-9073-5711bf2aca70.png)

簡単ですね！
これでいつでもGoを実行できます！
OnsenUIを使用した際のページ全体の背景色の動的変更方法

Monacaを使いアプリを作成してるのですが、OnsenUIを使用し背景色をユーザー側からカラーコードを指定し変更できる仕様にしたいのですがjsからbackgroundなどにセットしてもうまく変更できないようなので、何か他の方法知っている方いますか？
超簡単Google Homeでライフログを取る

この記事は「スマートスピーカー Advent Calendar 2017」の22日目の記事になります。 
google homeでライフログを取るようにします。

作るものとしてはgoogle homeに「今からhogehoge」というとgoogleのSpread sheetにその発言したhogehogeと時間を記録するようにします。
全てIFTTTで完結するので、ノンプログラミングです。

AIスピーカーはアレクサとgoogle homeどちらもありますが、アレクサよりもgoogle homeの方がIFTTで自由度が高いのでgoogle homeを使います。

詳細は@monoqloさんの以下の記事が分かりやすいです。
https://qiita.com/monoqlo/items/6d1b628291a5e3c26c79


##IFTTTでgoogle assistantから登録する
IFFTTにgoogle homeの登録する方法はgoogle homeで使用しているアカウントでログインするだけです。

IFTTTのトリガーとして使えるのは
Say a simple phrase
フレーズのみ
Say a phrase with a number
数字＋フレーズ
Say a phrase with a text ingredient
言葉＋フレーズ
Say a phrase with both a number and a text ingredient
数字＋言葉＋フレーズ
数字は#文言は#で前後にスペースを入れて登録します。


![スクリーンショット 2017-12-21 22.05.09.png](https://qiita-image-store.s3.amazonaws.com/0/64331/880686e7-cf5c-5318-4d72-b8170ef84704.png "スクリーンショット 2017-12-21 22.05.09.png")


IFTTTのgoogle assistantに登録する際は
「ほげほげ ＄ をするよ」
だとうまくいかないことが多かったので
「ほげほげ ＄」
などの最後はキーワードのみにした方が認識がうまくいきました。


ちなみに自分の発言内容に関してはgoogle homeのマイアクティビティから確認ができます。
https://myactivity.google.com/item?restrict=assist&embedded=1&utm_source=opa&utm_medium=er&utm_campaign=&authuser=1


##IFTTTでgoogle sheetに発言した内容と時間を登録する

次に検索からgoogle sheetを検索してspread sheetの登録をします。
spreadsheet nameは作成するスプレッドシートの名前、Formatted rowは追加していく列の内容を決定します。

今回は時間を追加したいのでCreatedAtとTextFieldです。
TextFieldには先ほどgoogle homeに話した内容が入ります。
CreatedAtには日時が追加されるはずですが、現時点では日時がうまく入力されません。

なので spread sheetの「ツール」ー＞「スクリプトエディタ」から自分で日時を追加するスクリプトを追加します。

```
function insertLastUpdated() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); //シート名を記入
  var lastRow = sheet.getLastRow(); // 更新された最後の行番号
  var triggerCell = sheet.getRange('B' + lastRow).getValue; // トリガーはBなのでBを指定
  var updateDateRange = sheet.getRange('A' + lastRow) // 更新した日時を書くセルを指定

  // 更新日時が空でトリガーがあるなら今の日時を追加
  if(!updateDateRange.getValue() && triggerCell) {
      updateDateRange.setValue(new Date());
  }
}
```

スクリプトが追加できたら「実行」「関数を実行」で確認をし、「編集」「現在のプロジェクトのトリガー」から以下のように設定すれば自動で日時が追加されるようになります。

![スクリーンショット 2017-12-22 9.53.14.png](https://qiita-image-store.s3.amazonaws.com/0/64331/5d62a8de-2faf-f9eb-3e2d-bcd8134638e7.png "スクリーンショット 2017-12-22 9.53.14.png")



Drive folder pathはフォルダーパスですが、なくても大丈夫です。

![スクリーンショット 2017-12-22 9.32.02.png](https://qiita-image-store.s3.amazonaws.com/0/64331/79011c50-a9dd-f76a-3e5d-93044a26cf17.png "スクリーンショット 2017-12-22 9.32.02.png")

これであとはgoogle homeに「今から　hogehoge」と言えば自動で日時と時間が追加されます。
![スクリーンショット 2017-12-22 9.56.34.png](https://qiita-image-store.s3.amazonaws.com/0/64331/f93e812c-2690-874c-4acc-d3049ffce922.png "スクリーンショット 2017-12-22 9.56.34.png")



これから実際に運用して改良していきたいと思います :muscle:
RDS PostgreSQLへのcsvファイルを使ったコピーは\copyじゃできない？


# 結論

- `psql database_name`でログインしない
- `psql`コマンドの`-c`オプション使ってSQLコマンドを実行
- `stdin`と`<`を使ってcsvデータを標準出力する
- カラム名は書く
- `COPY`にする（`\`は付けない）

```console
$ psql table_name -h host_name -c "COPY shop_sales (shop_id,sales_date,shop_name) from stdin with csv DELIMITER ','" < /home/user/hoge.csv
```

# 当初の想定

- `psql database_name`でログインして`\copy`コマンドを実行
- ファイルはEC2に置いて、そのファイルパスを絶対パスで記述（/home/user_name/hoge.csv）

色々試してみたコマンド集（全部エラー）

```
=# \copy shop_sales (shop_id,sales_date,shop_name) from ‘/home/user/hoge.csv' with csv;

=# \copy shop_sales (shop_id,sales_date,shop_name) from ‘/home/user/hoge.csv' with DELIMITER ',';

=# \copy shop_sales from ‘/home/user/hoge.csv' with DELIMITER ',';

$ psql table_name -h host_name -c "\copy shop_sales from ‘/home/user/hoge.csv' with csv DELIMITER ','";

# csvの形式とテーブルの形式が合ってない　エラー
$ psql table_name -h host_name -c "COPY shop_sales from stdin with csv DELIMITER ','" < /home/user/hoge.csv
```

awsのドキュメントにも`\copy`コマンドを使う例が書いてあるのだけど、`\copy`使えば出来そうなんだけど...
http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/PostgreSQL.Procedural.Importing.html#PostgreSQL.Procedural.Importing.Copy

# まとめ
アプリが何か制御してたりするのかな...
デフォルトでどういう動きになるのかやってみたいなー



参考にさせて頂いたサイト
https://teratail.com/questions/49888