OmniAICreator/Qiita-1.07M huggingface dataset:
archlinuxからArduino M0 Proへ書き込みができない

## はじめに
arudinoを以前に購入しMacbookProで動かしていたのですが、archlinuxでも動かしてみようと思いやってみたところ、うまくarudinoへ書き込むことができなかったので、その回避方法を記載したいと思います。

## 環境など
- [Arduino M0 Pro](http://www.arduino.org/products/boards/arduino-m0-pro)
    - Arduino Unoよりスペックが高い
        - フラッシュメモリ32KB→256KB
        - SRAM 2KB→32KB
クロック 16MHz→48MHz）
- Archlinux
- ArduinoIDE 1.8.3

Arduino M0 Proは、[amazon](https://www.amazon.co.jp/Physical-Computing-Lab-Arduino-エントリーキット/dp/B00XYC6JBU/ref=sr_1_2?ie=UT)で購入しました。

## セットアップ
[archlinuxのマニュアル](https://wiki.archlinuxjp.org/index.php/Arduino)を見ながらセットアップします。

## エラー内容
ArduinoIDEから書き込みを行おうとすると、以下のようなエラーが発生し、書き込めませんでした。

```
cortex_m reset_config sysresetreq
Error: unable to find CMSIS-DAP device
Error: No Valid JTAG Interface Configured.
Error: No Valid JTAG Interface Configured.
```

## エラーの原因＆回避方法
**ARMデバッガ「openocd」の設定が行われていない**為、発生しているエラーです。
回避するためには、「/etc/udev/rules.d」ディレクトリにopenocd設定ファイルを追加します。

```text:98-openocd.rules
ACTION!="add|change", GOTO="openocd_rules_end"
SUBSYSTEM!="usb|tty|hidraw", GOTO="openocd_rules_end"

# CMSIS-DAP compatible adapters
ATTRS{product}=="*CMSIS-DAP*", MODE="660", GROUP="plugdev", TAG+="uaccess"

LABEL="openocd_rules_end"
```

上記ファイルを追加し再起動した後、ArduinoIDEから書き込みを行うと、正常に書き込みできました。
（何故か、`sudo udevadm control --reload`では反映されませんでした)

```
Open On-Chip Debugger 0.9.0-g932ec70 (2017-02-15-11:32)
Licensed under GNU GPL v2

For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
debug_level: 0
adapter speed: 500 kHz
adapter_nsrst_delay: 100
cortex_m reset_config sysresetreq
target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0x81000000 pc: 0x000028f4 msp: 0x20002c00
** Programming Started **
auto erase enabled
wrote 16384 bytes from file /tmp/arduino_build_34990/sketch_jul08a.ino.bin in 1.976586s (8.095 KiB/s)
** Programming Finished **
** Verify Started **
verified 10404 bytes in 0.866759s (11.722 KiB/s)
** Verified OK **
** Resetting Target **
shutdown command invoked
```

## 参考サイト
- http://bitofahack.com/post/1437909576
- https://arduino.stackexchange.com/questions/28566/arduino-zero-error-unable-to-find-cmsis-dap-device
Ubuntu16.04にnvidia-dockerをインストールする方法

## はじめに
dockerのversionも大分上がったので再度インストール設定をまとめました。
AWS EC2 P2インスタンスで確認

## nvidiaドライバインストール

アップデート

```
sudo apt update -y
sudo apt upgrade -y
```

unable to resolve hostと言われた場合実行(今回は言われた)

```
sudo sh -c 'echo 127.0.1.1 $(hostname) >> /etc/hosts'
```

Repositoryを追加して、ドライバインストール。
ドライバのVersionはそれぞれのGPUで異なるので要確認

```
sudo add-apt-repository ppa:xorg-edgers/ppa
sudo apt-get update
apt-cache search 'nvidia-[0-9]+$'
sudo apt-get install nvidia-375
sudo reboot
```

## dockerインストール

基本的に[公式サイト](https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/)に従う。

```
sudo apt-get install \
   apt-transport-https \
   ca-certificates \
   curl \
   software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo apt-key fingerprint 0EBFCD88

sudo add-apt-repository \
  "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
  stable"

sudo add-apt-repository \
  "deb [arch=armhf] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
  stable"

sudo apt-get -y update

sudo apt-get -y install docker-ce

sudo usermod -aG docker $USER
# ログインし直すとsudoしなくてもdockerコマンドが使える
```

## nvidia-dockerインストール

```
sudo apt-get install nvidia-modprobe
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
sudo dpkg -i /tmp/nvidia-docker_1.0.1-1_amd64.deb
docker volume create -d nvidia-docker --name nvidia_driver_375.66
docker volume ls
```

## 動作確認

```
nvidia-docker run -it nvidia/cuda nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.66                 Driver Version: 375.66                    |
|-------------------------------+----------------------+----------------------+
以下略
```
ElectronバックエンドとサーバとのWebSocket通信でつまずいた件

#ことの発端

小規模な社内向けWebサービスで、データが変更されたことを通知するためにWebSocketを通信している。
そのWebサービスはキオスク化したPCからも見れるようになっているのだが、以前はChromeで全画面表示にしていた。
しかしユーザの認識のため認証させていたサービスなので、いちいちログイン画面を出すのはカッコ悪い。キオスクにはキオスクの口を用意し、各端末を認識できるようなしくみも作るべくElectronクライアントを作成した。

キオスク化すると長時間同じページを表示し続けることになるので、システムアップデート時などロジック含めての更新をしたい場合、View側からリロードをかけるもうまくいかない症状（タッチパネルが効かなくなるなど）が出ており、バックエンド側でWebSocket通信することに。

**が**

どうにも上手くいかない・・・
コネクション時に**403エラー**が出る。
Viewは相変わらず、きちんと繋がるのに。。。

この時点でお察しの方はいらっしゃると思うが、単にクロスドメイン問題に引っかかっていただけである。
認証関係なのはわかっているのに闇雲に新規実装中のnode側ばかりを疑って時間を溶かしてしまった。

node側は `file://~~~` のようにローカルでうごいてて、
View側は `http://~~~` でアクセスしているから上手くいっていた。

この社内サービスのサーバー側は`go+gin`で書いているので、

```go
func (p *App) websocketConnect(c *gin.Context) {
	handler := websocket.Handler(p.SocketServer.WebsocketHandler())
	handler.ServeHTTP(c.Writer, c.Request)
}
```

これを

```go
func (p *App) websocketConnect(c *gin.Context) {
	s := websocket.Server{Handler: p.SocketServer.WebsocketHandler()}
	s.ServeHTTP(c.Writer, c.Request)
}
```

とするだけで、うまく接続できた。
Vimmerがプログラミングを書くときの疑問（括弧編）

#この記事について
vimを初めて1ヶ月にも満たない初心者がvimについての疑問を投げかけて，僕みたいな初心者や先輩方と情報を共有するために書きました．

#初めに
- vimにはノーマルモードとインサートモードがあります．
- ノーマルモードでは"hjkl"でカーソル移動できます．
- インサートモードでは文字の入力ができます．この時のカーソル移動はカーソルキーでできます．（できれば使わないほうが良い．）

#疑問
- {}, (), "", []　などの括弧を記述するときはどのような手順で行うのが一般的なのだろうか？

## 例
function(10, value);みたいな関数を記述したいとする．
カーソルが'@'にあるとします．
1. function(@
2. function();@
3. function(@);
4. fucntion(10, value@);
5. function(10, value);@

「返し括弧を後から書けばいいや無いか！」という方もいらっしゃるとは思いますが，個人的には括弧のつけ忘れを逃れたいので，このような書き方を望んでいます．（括弧のハイライトやジャンプできるじゃん．）

#提案
調べたり，自分で考えてみた結果，以下の方法を見つけた．
- ノーマルモードに戻って移動する
- インサートモードで矢印キーを使う
- Ctrl-oで一度だけのノーマルモードを許してもらう
- .vimrcに記述する（インサートモードでの移動コマンドの登録）

今は矢印キーでの移動をしている．

#最後に
自分勝手ですが，情報提供おねがいします．
Laravelでfactoryを使い初期データを作成する基本的な方法(リレーション有り)

##前提
・掲示板のようなサービスを想定

・users、threads、repliesテーブルが存在する
(テーブル構成は割愛)
・User：Thread => 1対多
・User：Reply => 1対多
・Thread：Reply => 1対多

・threadsテーブルにはuser_id
・repliesテーブルにはuser_id、thread_id
がある


##ソースコード
####①まずはfakerを使ってModelFactoryの定義

```php
//ModelFactory.php

//User
$factory->define(App\User::class, function (Faker\Generator $faker) {
    static $password;

    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => str_random(10),
    ];
});

//Thread
$factory->define(App\Thread::class,function($faker){
	return [
		'user_id' => function(){
			//Thereadインスタンスを作成する際に、リレーションするUserインスタンスも生成する
			return factory(App\User::class)->create()->id;
		},
		'title' => $faker->sentence,
		'body' => $faker->paragraph,

	];
});

//Reply
$factory->define(App\Reply::class,function($faker){
	return [
		'thread_id' => function(){
			//Thereadインスタンスを作成する際に、リレーションするUserインスタンスも生成する
			return factory(App\Thread::class)->create()->id;
		},	
		'user_id' => function(){
			//Thereadインスタンスを作成する際に、リレーションするUserインスタンスも生成する
			return factory(App\User::class)->create()->id;
		},
		'body' => $faker->paragraph,

	];
});
```

####②threadsテーブルの初期データ作成
先ほどの```ModelFactory.php```にて、Threadインスタンスを生成する際にUserインスタンスも生成するよう定義しているので、以下のコードだけで、threadsテーブルとusersテーブルに50件のデータが入る

```php
$threads = factory('App\Thread',50)->create();
```

####③repliesテーブルの初期データ作成
Thread１件に対して10件のReplyがあると想定
先ほど生成した50件のThread一つ一つに対応するReplyを10件ずつ作成する
factoryで複数件生成する場合はインスタンスのコレクションが返って来るため、```each()```を使うことで、一つ一つのインスタンスに対して処理を行える

```php
$threads->each(function($thread){//クロージャ内で$threadを使うため、引数に渡している
   factory('App\Reply',10)->create(['thread_id' => $thread->id]);
})
```
クロージャの中で```create(['thread_id' => $thread->id])```とすることで、
生成されるReplyインスタンスのthread_id属性をオーバーライド出来る。
(repliesテーブルのthread_idをthreadsテーブルのidと同一に出来る)

ちなみに、上記全て英語の[Laracasts.com](https://laracasts.com) + 日本語[readouble.com](https://readouble.com)を交互に見ながら理解しました。英語の学習素材は避けがちですが、動画であれば意外といけることが判明。

以上。
[小ネタ] なんでもMarkdownで書くようにすると捗る

プログラマーという仕事をしているとプログラミング言語だけでなく自然言語を書くことも多いです。最近自分はドキュメントにしろちょっとしたメモにしろMarkdownで書くのが好みです。

## Markdownで書くことのメリット

### 低コスト

自分がキャリアをスタートさせたときはA4で印刷されることを前提に作られたExcel方眼紙を利用してドキュメントを書いたり丁寧に手書きの履歴書を書いたりという環境でした。Pagesのようなちょっとおしゃれなビジネスマンが使うようなツールでもスタイルを気にする必要があります。

単に文章を書きたいだけなのに使うソフトウェアの操作やデザインに頭を使わなければいけないのはコストが高いと感じています。MarkdownならviやWindowsのメモ帳でも書くことができて、レイアウトは後回しにすることができます。

### 変換可能性

この文章はQiitaに投稿していますので当然Markdownで書かれていて、それをHTMLに変換されたものが表示されているはずです。Markdownは各種ライブラリを使えば簡単にHTMLやreStructuredTextにできます。必要であれば[remark](https://github.com/gnab/remark)などを使ってスライドにすることもできます。メールで資料を渡す際に Google Chrome でpdfに変換して渡すというのもよくやります。

### セマンティクス

フリーレイアウトで文章を書く時には適切に段落を組んだり意味のまとまりで余白を入れたりとデザイン的な要素でセマンティクスの表現をしますが、文章を書くことに集中するときにはデザインのことは後回しにしたいです。Markdownでは段落にタイトルをつけたりリストを作成したりと、HTMLタグほど細かい表現力はありませんがある程度セマンティクスを表現することができます。

## Markdownを書くためのツール

Markdownを書くために自分が使っているツールの一部を列挙します。Vimを使うことが多いのでVimのプラグインがほとんどです。ここに書かれているもの以外にも各種エディタやIDEにも便利なツールがたくさんあると思います。

### [memo](https://github.com/mattn/memo)

最近お気に入りのツールはGolang製の[memo](https://github.com/mattn/memo)です。`memo`コマンドを叩けばエディタが起動してMarkdownでメモを作成できます。軽くドキュメントの下書きをする時やちょっと思いついたことをメモするときなど、思い立ったときに`memo`コマンドを実行しています。外出先と仕事と家とでは別の端末を利用しているためファイルはDropboxの指定した場所に保存してどの端末でも共有できるようにしています。

### [previm](https://github.com/kannokanno/previm) (Vimプラグイン)

MarkdownをブラウザでプレビューするためのVimプラグイン。自分は Google Chrome で開くようにしています。

```vim
let g:previm_open_cmd = 'open -a "Google Chrome"'
```

### [vim-markdown](https://github.com/plasticboy/vim-markdown) (Vimプラグイン)

シンタックスなどをうまいことやってくれるVimプラグイン。[vim-polyglot](https://github.com/sheerun/vim-polyglot)にも同等のことが内包されています。このプラグインでは`[title](http://example.com)`のようなリンクが折りたたまれて表示されてしまうため、自分は以下のように設定してその機能を使わないほうが好みです。

```vim
let g:vim_markdown_conceal = 0
```

### [vim-table-mode](https://github.com/dhruvasagar/vim-table-mode) (Vimプラグイン)

Vimでテーブルをうまく作ってくれるプラグイン。Markdownのテーブル表現ができるようにカスタマイズできます。

```vim
let g:table_mode_corner = '|'
```
環境(使用する文字コード)によるHTMLエスケープの違い　〜「¥」と「\」〜

#事の発端
僕がHTML5とCSS3、そしてJavaScriptを使用して地図アプリを作成していた際、ある部分で手が止まります。
教本通りのコードになっているはずなのに、実際には結果が伴わなかったのです。

```common.js
var h = function(str) {
    if (str !== null) {
        str = str.toString();
        str = str.replace(/&/g, '&amp;');
        str = str.replace(/</g, '&lt;');
        str = str.replace(/>/g, '&gt;');
    } else {
        str = '';
    }
    return str;
};

var printf = function(format) {
    for (var i = 1; i < arguments.length; i++) {
        var pattern = new RegExp('¥¥{' + (i - 1) + '¥¥}', 'g');
        format = format.replace(pattern, h(arguments[i]));
    }
    return format;
}; 
```
JavaScriptを外部ファイルで上のように作り、それをhtmlファイルに紐付けして、ブラウザ(僕の場合Google Chrome)でデベロッパーツールからコンソールを立ち上げます。
コンソールでh関数を実行するため「h('\<Tom & Jerry>\<br />')」と入力・実行すると「"\&lt;Tom \&amp; Jerry\&gt;\&lt;br /\&gt;"」という結果が返ってきます。
これはいいのです。
教本通りになりました。
ですが、「printf('今、{0}は{1}歳です。こんにちは、{0}くん！','リオ',4)」。
これは、どうしても教本通りの結果が返ってきません。
「"今、{0}は{1}歳です。こんにちは、{0}くん！"」
・・・と、ここでは本来、
「"今、リオは４歳です。こんにちは、リオくん！"」
・・・と返ってくる予定でした。

では、何が悪かったのか。

#HTMLエスケープ
このサイト、QiitaでもMarkdownのエスケープに「\」が使われていますが、~~使用している文字コードによっては、jsファイルで使うべきエスケープの文字も変わります~~。
今回僕が使用していた教本では、上のようなコードで、使われているエスケープの文字は「¥」でした。

```common.js
        var pattern = new RegExp('¥¥{' + (i - 1) + '¥¥}', 'g');
```
上の行の、「¥¥」の２箇所ですね。


*※少し脇道に逸れますが・・・
なぜ２個ついているかというと、「¥」自体もエスケープする必要のある文字だからです。
なので、「{」や「}」の分で各１個、そして、それぞれの「¥」の分でまた各１個の合計２個になるのです。*

~~それで、上で述べていますが、使用している文字コードによってエスケープの文字も変わるわけで・・・
僕が使用していた文字コードは「UTF-8」。~~
**エスケープに用いるのは「\」であって、「¥」ではありませんでした**(^ ^;)

つまり、上のコードを正しくするならば以下のようにすべきなのです。

```common.js
        var pattern = new RegExp('\\{' + (i - 1) + '\\}', 'g');
```
なお、「\」の入力の仕方がわからない場合はこちらのリンク「[バックスラッシュ「\」の打ち方](http://qiita.com/Evazain2/items/2b9e0e92c3e87bce7388)」よりどうぞ。

#今回得た教訓
~~「UTF-8でのエスケープは『\』だった」~~
**「教本の内容とコードが合っていてもうまくいかないのは、教本そのものが間違っているからである可能性がある」**

・・・エスケープに限らず、文字コードの違いから思わぬ動作をする可能性は考えられる。
今後も注意していこう。
ElasticSearch 5.5.0 → 5.5.1に最短手順でリビジョン上げてみた。


####■概要
ElasticSearchのリビジョンアップの手順の確認

####■環境
CentOS 7

####■実行
```
yum -y update
```
Installコマンドを実行しなくてもelaticsearch kibana logstashは5.5.1にリビジョンアップ

####■X-Packのリビジョンアップ
X-Packはyumでは実行出来ないため、下からzipを取得する。
https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-5.5.1.zip

####■X-Pack再インストール
```
#まずはlistで表示してpluginを確認 Elasticsearch だけはX-Packをremoveが必要
/usr/share/elasticsearch/bin/elasticsearch-plugin list

#旧5.5.0が残っているのでX-Packを削除
/usr/share/elasticsearch/bin/elasticsearch-plugin remove x-pack
/usr/share/kibana/bin/kibana-plugin remove x-pack
/usr/share/logstash/bin/logstash-plugin remove x-pack
#elasticsearch以外はx-packを削除しなくても再インストール可能でしたが、listで確認しましょう。

#5.5.1をインストール
/usr/share/elasticsearch/bin/elasticsearch-plugin install file:///path/x-pack-5.5.1.zip
/usr/share/kibana/bin/kibana-plugin install file:///path/x-pack-5.5.1.zip
/usr/share/logstash/bin/elogstash-plugin install file:///path/x-pack-5.5.1.zip
```

####■kibana ymlが初期化されたので修正 server.hostの"#"を外す
```
vi /etc/kibana/kibana.yml
server.host:”0.0.0.0”
```
####■諸々Restart
```
systemctl daemon-reload
systemctl restart elasticsearch
systemctl restart kibana
systemctl restart logstash
```


####■firewallをrestartしないと繋がらなかった
```
systemctl restart firewalld
```

####■起動確認、終了
```
curl -u elastic:changeme localhost:9200
curl -u elastic:changeme localhost:5601
```

次の5.6も同じ方法でアップデート出来るかは確認します。
VimからUnityを操作する


## プラグイン紹介

UnityするVimmer向けにプラグイン作りました

- Vimからコマンド一発で実行する
- VimからUnityのメニューを実行する(エディタ拡張機能メニュー等)

[zebult/univim](https://github.com/zebult/univim)

## 使い方
* Play
`:UnivimPlay`

* Find
`:UnivimFind`

* Menu
`:UnivimMenu YOUR_ORIGINAL_MENU`
> UnityのHelp検索で一番上にヒットしたメニューが実行されます
Azure Machine Learning に外部データをフィードする方法（CData API Server からOData でフィード）

Azure Machine Learning に業務データをフィードする方法の一つにOData があります。
スキーマ情報などの設定なしでフィードできて便利です。

CData API Server はノンコーディングでRDB、SaaS、NoSQL、フラットファイルからAPI を生成できます。API はOData 準拠ですので、Azure Machine Learning にデータをそのままフィードすることが可能です。

この記事では、API Server で生成した「仙台弁API」をOData フィードとしてAzure Machine Learning にデータを入れます。データソースはCData API Server が対応する[80を超えるDB、SaaS、NoSQL](http://www.cdata.com/jp/apiserver) などを使用可能です。


##API Server の設定##
［MySQL のデータをCData API Server でポチポチだけでREST API として公開する］(http://qiita.com/jonathanh/items/fcd9aca3c1eb52206102) を参考にしてください。
データソースはなんでもOKです。
インターネット公開する必要がありますので、［デプロイ］から公開環境にデプロイしてください。

##Azure Machine Learning でデータを取得する##
[https://studio.azureml.net/](https://studio.azureml.net/) からAzure Machine Learning Studio にログインします。8時間の無償ゲスト利用が可能です。

［PROJECT］から＋をクリックして、新規プロジェクト「Sendaiben」を作成します。
![26.png](https://qiita-image-store.s3.amazonaws.com/0/116843/d0775522-7ef7-9445-87f5-5eb72418cc66.png)

次に［EXPERIMENTS］をクリックし、左下の［+NEW］をクリックします。そのあと［+ Blank Experiment］をクリック。
![27.png](https://qiita-image-store.s3.amazonaws.com/0/116843/ed27377c-caeb-8ae5-aecc-fe01dc3ea057.png)

左から［Data Input and Output］→［Import Data］をドラグして、ドロップ。
ドロップした［Import Data］を右クリックして、［Data Feed Provider］を選択します。
![30.png](https://qiita-image-store.s3.amazonaws.com/0/116843/d4683c3d-8adc-2a34-8eeb-20d39652b92d.png)

右のプロパティで、以下を入力
- Data Source: Data Feed Provvider
- Data content type: OData 
- Data Source URL: API Server のエンドポイントを設定。ただし、以下のようにルートとなるエンドポイントの後に@Auth トークンを挟む必要があります。
他に認証項目を入れる方法がないようです。
```
http://localhost:8387/api.rsc/@YOURAUTHTOKEN/sendaibenlist/
```
![31.png](https://qiita-image-store.s3.amazonaws.com/0/116843/6739d22c-b380-1085-3efe-0a7b2eadc290.png)

［Import Data］をもう一度右クリックして、［Run Selected］を押して、データフィードを実行します。
![32.png](https://qiita-image-store.s3.amazonaws.com/0/116843/f032bdcc-8401-86f4-e601-5e395d38fb61.png)

データフィードが完了したら、再度［Import Data］を右クリックして、［Results Dataset］→［Visualize］をクリックします。
![33.png](https://qiita-image-store.s3.amazonaws.com/0/116843/1fd810a6-bb02-0e36-d782-596642c4f995.png)

すると「仙台弁リスト」がインポートされていることを確認できます。
![34.png](https://qiita-image-store.s3.amazonaws.com/0/116843/108f9c4a-6d25-a534-7e5a-fa357dc016f6.png)

このように、OData 対応していないSaaS、DB、NoSQL データをAPI Server を使うことで、簡単にAzure Machine Learning にフィードできます。
Unity: デバッグ実行時のみコンポーネントをアタッチするやつ

例えば、FPSコントローラーかなんかアタッチしたオブジェクトがあったとする。
実行時に、まぁ色々と操作してオブジェクトを移動させるとした。
この時、プレイヤーの座標をコンソールに出力したいと思った。
でもコード中になるべくデバッグ用のコードを混在させたくない・・・！
そんな時の対処方法。

```C#
#if UNITY_EDITOR
#define MY_DEBUG
#endif

using UnityEngine;
using System.Diagnostics;

public static class DebugFunctions
{
	public static void AddComponent<T>(GameObject target) where T : Component
	{
		_AddComponent<T>(target);
	}

	[Conditional("MY_DEBUG")]
	private static void _AddComponent<T>(GameObject target) where T : Component
	{
		if (target == null) return;
		target.AddComponent<T>();
	}
}
```

```C#
using UnityEngine;

public class Player : MonoBehaviour
{
	public void Start()
	{
		DebugFunctions.AddComponent<PlayerDebugger>(this.gameObject);
	}

	public void Update()
	{
		~~~何かと移動したりジャンプしたりする処理
	}
} 
```

```C#
using UnityEngine;

public class PlayerDebugger : MonoBehaviour
{
	public void Update()
	{
		Debug.Log("player position : " + this.transform.position);
	}
} 
```

こんな感じ。

####**注目ポイント**
①独自のデバッグ用defineをする
例えば、__Conditional["UNITY_EDITOR"]__でメソッドを宣言していった場合、あとから「このデバッグ機能群、他のプラットフォームでも有効化したいなぁ」って時に全てのConditionalを修正する必要がある。
別に必須では無いけど、せっかくデバッグ機能を優秀にしていくならやったほうが良いんじゃない？って感じ。

②Conditional属性の挙動について
なぜ_AddComponentをAddComponentでラップするような実装になっているかを説明する。
例えば、_AddComponentをpublicにしてPlayerから呼び出してみると、指定のコンポーネントはアタッチされない。
何故かと言うと、まぁ独自のデバッグ用シンボルのせいです。
C#では#defineで宣言したシンボルの有効範囲はそのファイル内だけなので、DebugFunctions.csで宣言したMY_DEBUGはPlayerクラスからは見えません。
しかも、Conditionalの判定がメソッドの呼び出し側に依存するらしく、PlayerからDebugFunctions.AddComponentを呼び出した際、呼び出し側のPlayerがMY_DEBUGのスコープ外なのでメソッドは実行されません。
そこで、Conditional属性のメソッドの呼び出しをスコープ内で行い、属性の付いていない通常のメソッドを外部から呼び出すことで、独自のデバッグ用シンボルの宣言とConditionalでデバッグ用のメソッドを宣言可能という感じ。

####免責
・はっきり言って、Unityなら似たような要望を標準機能で叶えてくれそうな気がするけどよくわかりません。プログラミングとかしたことない。
・Conditionalの特性上、おそらくコンパイル時に指定のシンボルが宣言されているか否かで生成するコードを判断していると思われるけど、そうなるとAddComponentの実装に意味が無くなるので最適化でうまく消えてくれると嬉しいけどそれも知りません。
・特に下調べして実装したわけじゃないので、C#の機能解説とかコーディングのすゝめとかの意図で書いた記事じゃないです。メモです。でもなんかあったら指摘してもらえるとありがてえっす。
・文中でちょいちょい文字が斜めになっているのは、アンダーバーを使った変数とか定数の名前を書いた時にMarkdownちゃんが斜めしたらええんやろ？と勘違いしてsin(10)を加算してしまったせいです。かわいい。

終わり。
CData API Server で生成したODATA API をTableau にフィードする方法

日本ではあまり語られることがないのですが、OData は今でもWeb API でデータをやり取りする際の標準です。
OData 形式でデータをフィードできるサービスとしては以下が有名です：
- Salesforce
- Dynamics CRM
- Google Spreadsheet
- Tableau
- PowerBI
- Azure Machine Learning

他にも海外製のBI、ETL、クラウドサービスの多くはOData をフィードさせることが可能です。
この記事では、CData API Server で生成したAPI をTableau にODATA フィードとして取り込ませます。

##API Server の設定##
[MySQL のデータをCData API Server でポチポチだけでREST API として公開する](http://qiita.com/jonathanh/items/fcd9aca3c1eb52206102) を参照してください。
データソースはMySQL でなくても構いません。

##Tableau へのフィードのためのAPI Server 側の追加設定##
API Server の［設定］→［サーバー］タブから、クロスオリジンの設定を行います。
- ［クロスオリジンリソースシェアリング （CORS）を有効化する。］にチェックを入れます。
- ［すべてのドメインを '*' なしで許可。］にチェックを入れます。

次に、OData の設定で、［デフォルトフォーマット］をJSON からXML（Atom）に変更します。
変更を保存します。
![22.png](https://qiita-image-store.s3.amazonaws.com/0/116843/dd0eb157-23b5-b183-2b32-757cfae4f3c8.png)

これで、API Server 側の設定は終わりです。

##Tableau からOData フィードでAPI Server のデータを取得する##
［新しいデータソース］→［OData］をクリックします。
［サーバー］欄にAPI Server のエンドポイントを入力します。
［特定のユーザー名とパスワードを使用］をチェックします。
- ユーザー名：API Server のユーザー認証の［ユーザー］
- パスワード：API Server のユーザー認証の［Auth トークン］
入力が終わったら［サインイン］をクリックします。
![24.png](https://qiita-image-store.s3.amazonaws.com/0/116843/91961177-5767-648b-345d-0a1785642201.png)

これでAPI をTableau のデータソースとして使うことができます。
![23.png](https://qiita-image-store.s3.amazonaws.com/0/116843/72d27a86-3ebf-7448-64d9-b064918c8dee.png)
Laravel5.4でVue.jsを使う準備

### 依存パッケージを入れる
まずはnpm installで依存パッケージを入れる

`npm install`

### コンパイル

`npm run dev`

```
$ npm run dev

> npm run development


> cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js

 95% emitting

 ERROR  Failed to compile with 2 errors

 error  in ./resources/assets/sass/app.scss

Module build failed: Error: ENOENT: no such file or directory, scandir '/home/service/cocoa/node_modules/node-sass/vendor'
```

node-sassがないと言われたのでインストール
`npm install node-sass`

 再チャレンジ
`npm run dev`

```
 DONE  Compiled successfully in 4712ms

                                                                                                    Asset     Size  Chunks                    Chunk Names
  fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.eot?f4769f9bdb7466be65088239c12046d1  20.1 kB          [emitted]
fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff2?448c34a56d699c29117adc64c43affeb    18 kB          [emitted]
 fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff?fa2772327f55d8198301fdb8bcfc8158  23.4 kB          [emitted]
  fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.ttf?e18bbf611f2a2e43afc071aa2f4e1512  45.4 kB          [emitted]
  fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.svg?89889688147bd7575d6327160d64e760   109 kB          [emitted]
                                                                                               /js/app.js   1.2 MB       0  [emitted]  [big]  /js/app
                                                                                             /css/app.css   147 kB       0  [emitted]         /js/app
```

今度は成功。

### Vueコンポーネントの表示

デフォルトで用意されているコンポーネントを利用する
resources/assets/js/components/Example.vue

```Bash:resorces/assets/js/app.js

...

Vue.component('example', require('./components/Example.vue'));

const app = new Vue({
    el: '#app'　#
});
```
デフォルトでexampleコンポーネントがVueに設定されていて、IDがappの要素に登録されている。

とりあえず表示してみる。

```
<div id="app">
    <example></example>
</div>
```

ビューの適当なところに入れて表示してみる。

![スクリーンショット 2017-08-03 23.53.19.png](https://qiita-image-store.s3.amazonaws.com/0/194671/33c97ff2-b3d6-9d65-1e10-53316c3a13d5.png)

表示されーた。
Macの起動・終了時間を勤怠管理に利用したいpythonスクリプト

最近時間を切り売りする仕事の仕方にシフトしているため、数年ぶりに勤怠管理をすることになったので、それ用のスクリプトを書いてみたのでメモ程度に残します。

## 要件
* 勤怠管理があまり徹底されてないゆるふわな感じ
 * でも勤怠管理は付けてね、チェックもするから。みたいな矛盾した世界
* 普段、始業と共にMacを起動する
* そして終業と共にMacをシャットダウンする
* つまりMacの、**その日の最初の起動・最後の終了**取れれば勤怠管理できる
* 直近の月のログ取れればとりあえず良いよね
* 標準インストールのPythonで動かしたい
 * python 2.7

## コード
やってることは**last reboot**と**last shutdown**を叩いてソートしてるだけ


```
$ python attendance_output.py 7 <- 取りたい月を引数にする
```

```attendance_output.py
import sys                                                                                                                                     
import re
import subprocess
import dateutil.parser

def attendanceDate(month):
    output = {}
    checkMonth = [0]
    def assignDate(matchDate, func):
        parseDate = dateutil.parser.parse(matchDate)
        if checkMonth[0]:
            if checkMonth[0] is not parseDate.month: return

        if parseDate.month is month:
            dateStr = parseDate.day
            if dateStr in output:
                if job in output[dateStr]:
                    output[dateStr][job] = parseDate if func(output[dateStr][job], parseDate) else output[dateStr][job]
                else:
                    output[dateStr].update({job: parseDate})
            else:
                output[dateStr] = {job: parseDate}
            checkMonth[0] = parseDate.month

    for job, func in {'reboot': lambda x,z:x>z, 'shutdown': lambda x,z:x<z}.items():
        for checkDate in subprocess.check_output("last %s" % job, shell=True).splitlines():
            matchObj = re.findall(r'%s\s+\~\s+([a-zA-Z]{3}\s[a-zA-Z]{3}\s+\d{1,2}\s+\d{1,2}\:\d{1,2})\s' % job, checkDate.decode('utf-8'))
            if len(matchObj): assignDate(matchObj[0], func)

    return output

for key, value in sorted(attendanceDate(int(sys.argv[1])).items(), key=lambda x: x[0]):
    print('%s/%s %s, %s' % (int(sys.argv[1]), key,
                'start %s' % value['reboot'].strftime('%H:%M') if 'reboot' in value else '',
                'end %s' % value['shutdown'].strftime('%H:%M') if 'shutdown' in value else ''))
```

## 結果
以下の感じでデータ出力されればOK。あとで出力をCSVかスプレッドシートとかにすれば尚良い

```
6/1 start 14:14, end 14:42
6/2 start 11:44, 
6/5 start 11:56, end 22:30
6/6 start 12:00, end 19:07
6/7 start 11:51, end 19:03
6/8 start 12:15, end 12:22
6/9 start 10:17, 
6/13 start 12:04, end 19:19
6/14 start 12:10, 
6/16 start 12:26, end 18:59
6/18 start 17:50, end 18:18
6/19 start 12:29, end 19:04
6/23 start 12:03, 
6/27 start 12:26, 
6/28 start 15:48, end 18:16
6/29 start 12:40, end 19:11
6/30 start 18:30, end 21:57
```
AVCaptureVideoPreviewLayerをつかって横向きの動画を撮る方法

## 概要

AVCaptureVideoPreviewLayerをAutoLayoutと一緒に使いながら横向きの動画を撮る際に少しハマったので共有します。

## 問題点

基本的に、撮る動画の向きに関しては[こちら](http://qiita.com/shu223/items/057351d41229861251af)の記事にあるようにAVCaptureOutputのAVCaptureConnectionを変えてやれば問題はありません。

しかし横向きに固定したアプリで動画を撮ろうとするとLayerの中で勝手に動画が回転して、AVCaptureConnectionをLandscapeにしてもPortraitにしても動画が90度回転してしまった状態で表示されてしまいました。

## 解決方法

解決方法はいたってシンプルでした。先程とりあげた記事にはAVCaptureVideoPreviewLayerが自動で向きを変えてくれるとありますがこれは厳密には違うようで、実際はAVCaptureVideoPreviewLayer自身にsessionとは別のAVCaptureConnectionが設定されていました。

つまり以下のようにするとAVCaptureVideoPreviewLayer内の動画を意図した向きに表示することができます。

```swift
if let videoLayer = AVCaptureVideoPreviewLayer(session: captureSession) {

     videoLayer.frame = previewView.bounds
     videoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
     videoLayer.connection.videoOrientation = .landscapeRight
     previewView.layer.addSublayer(videoLayer)
}
```
シェルスクリプトで複数プログラムを並列で動かしてCtrl-Cでまとめて終了させる

誤解というか、様々な意味に取られそうなタイトルですが、
私がやりたかったことは以下のようなケースです。

・tcpdumpのような延々と続く動作を複数動作させたい
・でも終了させるときは Ctrl-C で一発で全部消したい

要は、並列で複数プロセスを動作させるのでバックグラウンドで起動して、
それらを一発で終了させたいという要望です。

```sh
#!/bin/bash
trap killall SIGINT

killall(){
  echo 'good bye'
  kill 0
}

hello () {
    echo 'hello'
    sleep 1
    hello
}

yeah () {
    echo 'yeah'
    sleep 1
    yeah
}

chao () {
    echo 'chao'
    sleep 1
    chao
}

hello &
yeah &
chao &

wait
```

結論としては、 Ctrl-C で送信される SIGINT をトラップして kill 0 に差し替える、ということでした。
Terraform v0.10.0 で tfstate を Amazon S3 に保存する

tfstate は git に登録すべきではないものなので、 Amazon S3 に保存するのが楽っぽい。
これには AWS のアクセスキーが必要だけど、これも当然 git で管理するわけにはいかない。
このあたりは先人がいろいろ試行錯誤してまとめられている。

なんだけども Terraform v0.9 以降と v0.8 以前ではやり方が結構違うらしく、日本語の記事は
v0.8 以前からの移行方法がほとんどであまり参考にならない。
しかも v0.10 は 8/3 にリリースされた直後なのでほぼ情報はない。
なんとか判明したのは、 backend という仕組みが導入されて S3 はその１種となったこと。

いろいろ試行錯誤した結果、なんとか安全に管理できるようになったのでまとめてみる。


# 前提
- Windows 10 x64
- AWSCLI v1.11.129
- Terraform v0.10.0


# 1. bucket 作成
Amazon S3 に tfstate を保存するので、あらかじめ bucket を作成しておく。
バージョニングを有効にするのが推奨らしい。

# 2. profile 作成
AWSCLI でアクセスキーなどを保存する profile を作成する。
アクセスキーはあらかじめ作成してテキストファイルなどに保存しておく。

```
aws configure --profile your_profile_name
> AWS Access Key ID [None]: your_access_key
> AWS Secret Access Key [None]: your_secret_key
> Default region name [None]: ap-northeast-1
> Default output format [None]:
```
この結果は `%HOME%\.aws` に保存される。

# 3. tf ファイル作成
Terraform で AWS を使う場合、 provider にアクセスキーを指定する記事が多いが、
tfstate を S3 に保存するには backend にもアクセスキーを指定する必要がある。
しかし、 provider と違い backend には tf ファイルでアクセスキーを指定できない。

ただし backend には profile を指定できるので、 provider にも profile を指定すると
アクセスキーを同じように管理できていい感じ。
具体的には tf ファイルを次のように記述すればよい。

```main.tf
terraform {
  required_version = ">= 0.10.0"

  backend "s3" {
    bucket  = "your_bucket_name"
    key     = "path_to_tfstate"
    profile = "your_profile_name"
    region  = "ap-northeast-1"
  }
}

provider "aws" {
  profile = "your_profile_name"
  region  = "ap-northeast-1"
}```
migrateで[PDOException]SQLSTATE[HY000] [2002] No such file or directoryと出た時のメモ

# 環境
* PC: mac
* Laravel: 5.1

# 内容
マイグレーションファイルを作成し、`$php artisan migrate` を実行すると

```
[PDOException]                                    
SQLSTATE[HY000] [2002] No such file or directory
```

とエラーが、、、MySQL接続エラーらしい。database.phpと.envは設定したため、ハマった

# 解決方法
database.phpで unix_socket を設定すればいい
unix_socketはMySQLから `$show variables like '%sock%';` を実行

```
+-----------------------------------------+-----------------------------------------+
| Variable_name                           | Value                                   |
+-----------------------------------------+-----------------------------------------+
| performance_schema_max_socket_classes   | 10                                      |
| performance_schema_max_socket_instances | 322                                     |
| socket                                  | /Applications/MAMP/tmp/mysql/mysql.sock |
+-----------------------------------------+-----------------------------------------+
```

```php:database.php
'mysql' => [
      'driver'    => 'mysql',
      #省略#
      'unix_socket' => 'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
],
```
これでマイグレーションできる

どうやらlocalhostの場合はunixSocketで通信を行い、
127.0.0.1の場合はポート経由で通信を行っているらしい。　へぇ〜

unixSocketで接続しようとするが、mysql.sockが見つからないため、`No such file or directory`に

ソケットについてのお話。分かりやすく説明してる人がいたのでお茶を濁す、、、
[調べなきゃ寝れない！と調べたら余計に寝れなくなったソケットの話](https://qiita.com/kuni-nakaji/items/d11219e4ad7c74ece748)

```php:.env
DB_HOST=127.0.0.1
```
とするとunix_socketの指定をしなくてもマイグレーションできる

# 参考
* [Laravel(5.1)のMacローカル環境での 'SQLSTATE[HY000] [2002] No such file or directory'エラー対処](http://qiita.com/tadashi0713/items/97ad17b3865efdfeab21)
* [MySQL徹底入門 第3版 ~5.5新機能対応~](https://books.google.co.jp/books?id=-mfYNVblDk4C&pg=PA507&lpg=PA507&dq=localhost+unixSocket&source=bl&ots=hpZt82Vi_6&sig=5_MilEr_9MuQoWmQSIblP17c6PU&hl=ja&sa=X&ved=0ahUKEwi75KOlmLvVAhVGoZQKHZ3VAoQQ6AEIcDAJ#v=onepage&q=localhost%20unixSocket&f=false)
ラジオボタンにハマってしまった話

HTMLのフォームでラジオボタンを設置した時に、ラジオボタンを選択できないという現象にハマってしまった

原因はname属性を設定していなかったこと
また、nameの値を一致させないと同現象が起こるので注意

ちなみにラジオボタンについての高度な別の話
http://bashalog.c-brains.jp/15/12/10-100000.php
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements


## mysqlのパスワードを設定したときのエラー
```mysql
mysql>create user xxx identified by 'aaa'
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
```

## 原因
MySQL 5.7.8以降のrpmパッケージではvalidate_passwordプラグインがデフォルトで有効になっているため．
ちなみに，デフォルトの条件が最低1つの数値文字を含み、1つの小文字および大文字を含み、1 つの特殊文字 (英数字以外) を含んでいることとのこと．


## 解決策
validate_passwordを削除する．

```mysql
mysql> uninstall plugin validate_password;
```
##その後

```mysql
mysql> SHOW VARIABLES LIKE 'validate_password%';
Empty set (0.00 sec)
```
これでどんなパスワードでも大丈夫(セキュリティ上あまりよろしくないが)

## 参考リンク
[初心者のきまぐれメモ](http://music431permemo.blogspot.jp/2016/01/mysql.html)
PythonでXMLから降水確率を取得する

親記事: [Raspberry Pi Zero Wで傘リマインダーを作る](http://qiita.com/mnishz/items/acc8a5e4a6f48de1d472)

タイトルの通りです。Python初心者、XMLのこともまだちゃんと理解していない。追々勉強していきます。
使っているPythonのバージョンは2.7.9です。


# お世話になったリンク
http://www.drk7.jp/weather/
気象庁が公開している天気予報情報をXML形式で配信しているようです。有難く利用させていただきます。

https://docs.python.jp/2.7/library/xml.etree.elementtree.html
XMLのパースのしかた。

# 出来上がったコード
横浜東部の降水確率を表示します。自分が知りたいのは主に夕方および夜の降水確率なので、

- 12時 - 18時
- 18時 - 24時

の二つに分けて取得します。もっと効率的なやり方がありそうな気配をひしひしと感じます。ご教示をば。

2017/08/13 追記: コメント欄に@shiracamusさんから教えていただいた、内包表記を使ったもっときれいなコードがあります。

```py:code
# coding: utf_8

import datetime
today = datetime.datetime.today().strftime("%Y/%m/%d")

import requests
url = 'http://www.drk7.jp/weather/xml/14.xml'
response = requests.get(url)

import xml.etree.ElementTree as ET
root = ET.fromstring(response.content)

# Get rainfallchance of North Yokohama
# Time: 12h - 18h and 18h - 24h

for area in root.iter('area'):
    if area.get('id').encode('utf_8') == '東部':
        for info in area.findall('info'):
            if info.get('date') == today:
                rainfallchance = info.find('rainfallchance')
                for period in rainfallchance.findall('period'):
                    hour = period.get('hour')
                    if hour == '12-18' or hour == '18-24':
                        print hour + 'h ' + period.text + '%'
```

```text:result
12-18h 10%
18-24h 20%
```
GASのPropertiesServiceに数字を保存したと思ったら文字列になってた

ハマってしまったのでメモです。

GoogleAppsScript で5分の壁回避のため、プロパティに数字を保存→次回実行時に取り出して+1して使いたい状況があったのだが、どうもうまくいかずにハマりました。

```miss.gs
PropertiesService.getScriptProperties.setProperty("count",1);

var count = PropertiesService.getScriptProperties.getProperty("count");
Logger.log(count+1); //→1.01
```

デバッグしてみると、**プロパティは全て文字列として保存されてしまう**ようです。
ということで、Number() で解決できました。

```success.gs
PropertiesService.getScriptProperties.setProperty("count",1);

var count = PropertiesService.getScriptProperties.getProperty("count");
count = Number(count);
Logger.log(count+1); //→2
```
Linux・CentOS初心者の為の、個人的によく使うコマンド

# はじめに
CentOS,ubuntuを使っている時に、
よく使うコマンドをまとめていきます。

## 登場するコマンド一覧

cd
ls
mkdir
rm
cp
mv
chmod
chown
wget
ifconfig
ssh
vi

---


### **cd**
>ディレクトリ移動をするコマンド。
これが使えないと始まらないですね。


---

### **ls**
>カレントディレクトリの中を表示するコマンド。
ファイル、ディレクトリの一覧出したり、
権限確認したり頻繁に使います。


---

### **mkdir**
>ディレクトリを作成するコマンド。
まぁ使いますよね。

---

### **rm**
>ファイルを削除するコマンド。
-rオプションをつけるとディレクトリを再帰的に削除します。

---

### **cp**
>ファイルをコピーするコマンド。
ファイルを編集する前にこれ使ってバックアップをよく作ります。

---

### **mv**
>ファイルの移動、名前を変更するコマンド。
新しいファイル名を指定するか、ディレクトリ指定するかで、
使い方が変わります。

---

### **chmod**
>ファイル、ディレクトリのアクセス権を変更するコマンド。
755とかによく設定しますね。

---

### **chown**
>ファイル、ディレクトリの所有者を変更するコマンド。
権限とかで所有者変えたいときによく使います。

---

### **wget**
>指定URLのファイルを取得するコマンド。
個人的に大好きなコマンドです。

---


### **ifconfig**
>ネットワーク環境の状態、設定確認のためのコマンド。
IPアドレスやサブネットマスク、
ブロードキャストアドレスなどの確認をする時によく使います。

---

### **ssh**
>リモートマシンにログインし、
リモートマシン上でコマンドを実行するコマンド。
ubuntuなどからCentOSサーバにアクセスする時に多様します。


---

### **vi**
>テキストエディタを起動するコマンド。
標準インストールされているはずのvi,vimエディタです。
「コマンドモード」、「入力モード」があり初心者は使いにくいかもしれません。
vi,vimに関するコマンドは別の記事で書こうと思います。

---


## 最後に
今回出したコマンドはよく使うコマンドほんの一部です。
またオプションなどいろいろな使い方があるので、
使う際に是非自分でリファレンスなどを確認して、コマンドを使ってもらいたいです。
そうすることで、毎回使い方を検索しなくても、覚えることができると思います。
LinuxのVNC上でAtom Editorを起動する方法

このスクリプトを使う

```bash
if [ "$(uname -s)" = "Linux" ]; then
  which_atom=$(which atom || true)
  if [ -n "$which_atom" ]; then
    atom() (
      to_lib_dir="$HOME/.local/atom-hack/lib"
      mkdir -p "$to_lib_dir"
      for from_lib_dir in /usr/lib /usr/lib64 /lib /lib64; do
        if [ ! -d "$from_lib_dir" ]; then
          continue
        fi
        find $from_lib_dir -name "libxcb.so*" | while read -r p; do
          f=$(basename "$p")
          sed -e 's/BIG-REQUESTS/_IG-REQUESTS/' "$p" > "$to_lib_dir/$f.tmp"
          if ! cmp "$to_lib_dir/$f.tmp" "$to_lib_dir/$f"; then
            cp -f "$to_lib_dir/$f.tmp" "$to_lib_dir/$f"
          fi
        done
      done
      export LD_LIBRARY_PATH=$(echo $to_lib_dir:$LD_LIBRARY_PATH | sed -e 's/:$//')
      exec "$which_atom" --disable-gpu "$@"
    )
  fi
fi
```

参考文献
- http://riku.wp.xdomain.jp/2017/03/01/ubuntu%E3%81%AB%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%81%A7%E6%8E%A5%E7%B6%9A%E4%B8%AD%E3%81%ABatom-editor%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84%E5%95%8F%E9%A1%8C/
- https://www.ainoniwa.net/pelican/2016/0828a.html
- https://github.com/Microsoft/vscode/issues/3451
dockerize を使って他のコンテナ内サービス起動を待つ

docker-compose では depends_on によってコンテナの起動順をある程度
制御することができます.
ただし depends_on が保証するのはコンテナの起動順だけでコンテナ内の
サービスの準備が完了するまでは待ってくれません.

参考: http://docs.docker.jp/compose/startup-order.html

現在, docker-compose にて APP + DB の構成に k6 を追加して手軽に
負荷試験もできるようにしようとしたのですが, k6 の実行が APP のサービス
準備完了後にならず試験の最初の方がアクセスエラーが発生してしまいました.

そこで上記サイトでも紹介されている dockerize を使用しました.
(ネット上で検索すると環境を docker 化するのを dockerize と呼んでいる
ところがあるので情報は転がってそうでなかったです)

dockerize は docker のコンテナ動作に関するユーティリティーモジュールです.
コンテナにて使用するにはイメージに dockerize を含める必要があります.

ということで今回作成した k6 イメージビルドする Dockerfile です.
dockerize: https://github.com/jwilder/dockerize
k6: https://github.com/loadimpact/k6

```
FROM loadimpact/k6:0.17.0

ENV DOCKERIZE_VERSION v0.5.0

RUN curl -sL https://deb.nodesource.com/setup_6.x | bash \
  && apt-get install -y \
    wget \
  && wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
  && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
  && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
  && apt-get purge -y --auto-remove wget \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

ENTRYPOINT []
```
k6 のベースイメージ指定以外が dockerize のインストールです.

次に docker-compose を使って APP のサービス起動を待ちつつ k6 でテストをやってみます.

```
docker-compose run -p 6565:6565 --rm k6 dockerize -wait http://hogehoge:80/healthcheck k6 run k6_test.js
```
```dockerize -wait <<待つ対象サービスのURL>> <<コマンド>>```
http の場合は 200 ok が返るまで対象 URL を叩き続けます. 
なのでそういった API も実装しておく必要があります.
ちなみに mysql の場合は tcp://mysql:3306 みたいな感じで起動待ちできます.

既存イメージにちょっと足すだけで厄介な起動順番の問題が解消できるので
試してみてはいかがでしょうか.
ターミナル コマンド

## Mac OS Xの不可視ファイル/フォルダを表示・非表示

### 不可視ファイル/フォルダを表示
```html:ターミナル
defaults write com.apple.finder AppleShowAllFiles -boolean true
```
### 不可視ファイル/フォルダを非表示
```html:ターミナル
defaults delete com.apple.finder AppleShowAllFiles
```
### 上記（表示/非表示どちらも）のコマンドを実行後にFinderを再起動
```html:ターミナル
killall Finder
```
iOS、Androidのストア権限付与手順

# アプリリリースあるある
・クライアント「アプリリリースってどうやるの？名義はうちで出したいから作業全部やって」
・受託請負企業「分かりました。つきましてはアカウントのID/PWを教えていただけますか？」

↑

やり方として、上記は絶対よくない。
iOSとAndroidアプリであればGoogleアカウントとAppleIDを教えることになるが、口座情報も見えるしスマホからログインすれば不正にアプリ買いまくったり、iTunesでお買い物し放題、自社が関わってるアプリ以外にもアクセスできるので公開中アプリを全部停止できる。
「そんなことしないし、クライアントからも信頼されているので大丈夫」とかもよくない。
仮に自分が個人でクライアント一人でも、そのアカウントに何かしらの不正行為やアプリを間違って削除した場合などにも自分が疑われる。それがクライアント本人が意図的にやったとしても、自分の身の潔白を晴らす術はない。

かといって、全部のリスクをなくすことはできない。
せめてもの予防策として、ユーザーによって権限を分けて口座周りいじったりできないようにしたいという時の為にこの記事をメモ

# 各プラットフォーム毎に権限付与

※記事が古くなっていくとストア側のUIや設定項目が変わっている可能性があります。
その際は各位で最新の情報を調べたり、どうしても分からないことがあればAppleやGoogleへ問い合わせるなどしてください。

## Android

[Google Play Developer Console](https://play.google.com/apps/publish/?hl=ja)に親アカウント(アプリをリリースする方)でログインして下記手順

1,

<img width="1381" alt="android1.png" src="https://qiita-image-store.s3.amazonaws.com/0/99683/01fe85a1-eb10-63eb-760c-d17fae990c56.png">

2,

<img width="1403" alt="android2.png" src="https://qiita-image-store.s3.amazonaws.com/0/99683/634bd4c9-bb53-3f2b-447e-7dcb3bc339b1.png">

3,

<img width="880" alt="android3.png" src="https://qiita-image-store.s3.amazonaws.com/0/99683/afd7a18d-00be-7e47-6a60-26d49bc9713b.png">

権限を付与する先のメールアドレスが必要。
だいたいリリースマネージャーをアプリ毎にもらうのがいいと思うけど、アプリ全てに対する権限や権限毎に個別で設定もできる。

## iOS

* [iTunesConnect](https://itunesconnect.apple.com/)

アプリのリリース作業を行います。個人のアカウントでも権限付与ができます

* [iOS Member Center](https://developer.apple.com/account/)

アプリの証明書作業を行います。法人アカウントでないと権限付与ができません。
法人アカウントでない場合はこの先のキャプチャにあるiOS Member Centerの権限付与のリンク(People)が表示されません

### iTunesConnect

1,

<img width="1412" alt="iOS1.png" src="https://qiita-image-store.s3.amazonaws.com/0/99683/d1f96911-f6d7-7875-0cab-14d910cf65d4.png">

2,

<img width="1412" alt="iOS2.png" src="https://qiita-image-store.s3.amazonaws.com/0/99683/70a423f9-9696-904f-1a8b-977ba074b841.png">

3,

<img width="1426" alt="iOS3.png" src="https://qiita-image-store.s3.amazonaws.com/0/99683/85f6b177-9707-8a95-6982-6938d69eb425.png">

4,

<img width="1430" alt="iOS4.png" src="https://qiita-image-store.s3.amazonaws.com/0/99683/7c1f9e9a-251a-acec-11f4-282c457a4f49.png">

### iOS Member Center

1, 

<img width="1417" alt="iOS2_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/99683/373abc2b-ecd9-e88c-5ab5-8ea227ca5e77.png">

2,

<img width="1428" alt="iOS2_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/99683/dfdd84cb-95ee-2cf4-9fd9-5ece191b6027.png">

3,

<img width="1430" alt="iOS2_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/99683/ee23e725-73aa-f93e-722f-8124f9150f77.png">


権限詳細参考
* iOS: [プログラムにおける役割と iTunes Connect における役割](https://developer.apple.com/support/roles/jp/)
* Android: [デベロッパー アカウント ユーザーの追加と権限の管理](https://support.google.com/googleplay/android-developer/answer/2528691?hl=ja)
Mac だけど Python で AWS Lambda したい！

:::note warn
この記事の内容は古くて、例えば ARM Mac (Apple Silicon) ではうまくいかなかったりします。とはいえ Docker コンテナをビルドしたり起動したりする際に `platform` オプションを指定すれば出来るとは思いますが、未確認です。
:::

AWS Lambda が Python 3.6 をサポートしたとのことなので、今まで Node.js で書いていた Lambda Function を Python で書いてみることにしたのだけれど、numpy などの C で書かれたモジュールを含んだ Lambda Function を Mac からデプロイすると **「それは Mac 用にビルドされたモジュールだから読み込めんよ」** などと言われて Lambda 上で実行できないくてつらい。

この問題を Docker で解決したのでその方法についてまとめる。

[2020.03.25 追記] Lambda Layer を作成する方法についても書いた。
[Docker で AWS Lambda の Python 用 Layer を作成する - Qiita](https://qiita.com/hoto17296/items/a374efc2d8159d75bc71)

## デプロイしたい Lambda Function の例
今回は、以下のような numpy を読み込む以外何もしない Lambda Function をデプロイすることを考える。

``` :ディレクトリ構成
.
├── main.py
└── requirements.txt
```

``` python:main.py
import numpy

def handler(event, context):
    pass
```

``` :requirements.txt
numpy
```

## Mac 上で普通にインストールした場合
以下のコマンドを実行すると同じディレクトリに numpy がインストールされるが、これでインストールされたものを zip に固めてデプロイしても numpy が Mac 用のビルドなので Lambda 上では動かない。

``` console
$ pip install -r requirements.txt -t .
```

たぶんこんなエラーが出るはず。

```
Unable to import module 'main':
Importing the multiarray numpy extension module failed. Most likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` (removes all files not under version control). Otherwise reinstall numpy.

Original error was: cannot import name 'multiarray'
```

解決策をググると「Amazon Linux インスタンスを立ち上げてそこでビルドする」みたいな謎の回答しか出てこない。**AWS Lambda でサーバーレスしたいのにデプロイにサーバが必要**とはこれ如何に？？？

要は Linux 環境でビルドできればいいんじゃ。
それ Docker でできるよ。

## Docker コンテナ上でビルドする
先程のコマンドを Docker コンテナ上で実行するには以下のようにすればよい。

``` console
$ docker run --rm -v $(pwd):/work -w /work python:3.6 pip install -r requirements.txt -t .
```

Python 3.6 のイメージ[^linux]からコンテナを起動して、作業ディレクトリ `/work` にカレントディレクトリをマウントして、そこでパッケージをインストールする。ビルドが完了したらもうこのコンテナは不要なので `--rm` オプションをつけて削除されるようにしている。

[^linux]: `python:3.6` イメージはベースが Debian なので Lambda の実行環境 (Amazon Linux) とは違うのだけど、インストールされたのが `numpy-1.13.1-cp36-cp36m-manylinux1_x86_64.whl` だったので Linux ならなんでもいいんだと思われる。numpy 以外のモジュールでダメなやつがあるかもしれないが、その場合は Amazon Linux の Docker イメージを落としてきてやればよい。

これで Linux 環境でビルドされた numpy が手に入ったので、あとはこれを固めてデプロイすれば動くはず。

## どうやって開発すればいいか
「Linux 用のモジュールをインストールしてしまったら今度は開発時に Mac 上で実行できないじゃないか」と思うかもしれない。

確かに Mac 上では動かすことはできないが、開発するときも全部 Docker コンテナに乗せて実行すればいいと思う。

``` console
$ docker run --rm -v $(pwd):/work -w /work python:3.6 python -c 'import main; main.handler({}, None)'
```

こんな感じで。
yumが壊れたときの対処法

# どんなことがあったのか
CentOS（今回は6.9）の環境で、yumなんて普通によく使うけど、いきなり使えなくなった。
根本はpythonのバージョンのせいかな？
→もはやよくわからない。

参考のサイトにいろいろ行ったり来たりして、最終的には動くようにはなった。

# File "/usr/bin/yum", line 29, in <module>～
最初のエラー
次のようなエラーが発生し、なんもできねー

```
# yum update

読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in <module>
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 370, in user_main
    errcode = main(args)
  ...
```

## 対処
yumのコンフィグファイルを修正

```text:/etc/yum/pluginconf.d/fastestmirror.conf
[main]
enabled=0
```

## 参考
http://blog.dksg.jp/2017/04/yum-update.html

# No module named yum
第2のエラー
バージョンが合わないとかいうー

↓は似たようなログ（実際に発生したときとは異なる）

```
# yum update
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

   No module named yum

Please install a package which provides this module, or
verify that the module is installed correctly.

It's possible that the above module doesn't match the
current version of Python, which is:
2.7.5 (r265:79063, Feb 28 2011, 21:55:45) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)]

If you cannot solve this problem yourself, please go to 
the yum faq at:
  http://wiki.linux.duke.edu/YumFaq
```

## 対処
yumを実行するpythonの指定

```text:/usr/bin/yum修正前
#!/usr/bin/python
import sys
try:
    import yum
    ...
```

```text:/usr/bin/yum修正後
#!/usr/bin/python2.6
import sys
try:
    import yum
    ...
```

## 参考
http://d.hatena.ne.jp/ike-dai/20110713/1310552674
set up docker and run httpd in 2 vagrant machines. 5


# set up a new vagrant and pull image

in Mac PC

```:bash
mkdir docker_2
```

```:bash
cd docker_2
```

Change IP address

```:Vagrantfile
config.vm.network "private_network", ip: "192.168.55.45"
```

```:bash
vagrant up
```

Login to virtual machine

```:bash
vagrant ssh
```

Then Setup docker again in this machine.
IP address is 192.168.55.45

```:bash
sudo docker login
```

```:bash
sudo docker pull jojiurano/bibo
```

check images

```:bash
sudo docker images
```

You can run httpd in this machine also.

```
sudo docker run -p 8080:80 -d jojiurano/bibo
```

You can access here.
http://192.168.55.45:8080/

![スクリーンショット 2017-08-03 19.21.30.png](https://qiita-image-store.s3.amazonaws.com/0/39073/6ffd2b96-4848-ba01-8759-bae81aed60bb.png "スクリーンショット 2017-08-03 19.21.30.png")
DS-5を使ってデバッグ

この記事はARMのボード上でDS-5を使ってデバッグの手順を載せます。

英語版:
中国語版:

The Arm Development Studio 5 (DS-5) Community Edition
DS-5はArm Development Studio 5の略称です。DS-5はコミュニティバージョン(無料)と商用バージョン(有料)があって、本記事はDS-5コミュニティ　バージョンのことを記載します。

DS-5って何？


詳細は下記のリンクで記載します。



DS-5コミュニティ バージョンを使って、rasberryボード上でデバッグを行います。

# 1.　DS-5をダウンロードとインストール

下記は公式のDS-5のダウンロードページです。
https://developer.arm.com/products/software-development-tools/ds-5-development-studio/editions/community-edition

"Download DS-5 Community Edition"をクリックし、簡単な情報を登録して、ダウンロードリンクをメールで送られます。


ダウンロードファイルのサイズは450MBぐらいです。

DS5バージョン　5.27.0

アーカイブを解凍して、install.shスクリプトを実行します。
インストールtermを同意し、"yes"を入力し、インストールを始まります。
インストール後、起動メニューでDS-5のアイコンを見つかって、クリックすればDS-5を起動します。
![Screenshot from 2017-08-03 19:37:37.png](https://qiita-image-store.s3.amazonaws.com/0/195305/761a8733-8d1d-cd17-18dd-d6cad405a7d0.png)

起動後の画面
![Screenshot from 2017-08-03 19:38:14.png](https://qiita-image-store.s3.amazonaws.com/0/195305/81c94605-9e72-dd0d-db44-bd5bbfcbde3d.png)

最初はワークスベースを指定します。
![Screenshot from 2017-08-03 19:41:42.png](https://qiita-image-store.s3.amazonaws.com/0/195305/40b50fec-8b57-00ec-9393-fc4e74baf79c.png)

起動後の画面
![Screenshot from 2017-08-03 19:47:13.png](https://qiita-image-store.s3.amazonaws.com/0/195305/040bfe89-d1ef-2a30-72da-c84d91417734.png)


# 2. Hello worldを試す

最初はHello Wolrdのプログラムを試してDS-5を使い始めます。

ファイル -> 新規　-> プロジェクト

![Screenshot from 2017-08-03 20:04:34.png](https://qiita-image-store.s3.amazonaws.com/0/195305/a42053ce-39a3-dcd7-459b-ff379a55d1bc.png)
プロジェクト名　"hello world"
プロジェクトの種類　空のプロジェクト
ツールチェイン　Linux GCC

DS-5のツールチェインがなければ、ここでツールチェインの選択はLinux GCCしか表示されてないです。
事前にDS-5のツールチェインのインストールが必要です。
( DS-5のツールチェインの追加方法は下記の記事で載せます。)

コンパイラーをダウンロードします。
https://developer.arm.com/products/software-development-tools/compilers/arm-compiler/downloads/version-6

追加方法
［Windows］ > ［環境設定］を選択します。次に、［DS-5］ > ［Toolchains］を選択します。

![Screenshot from 2017-08-17 13:43:43.png](https://qiita-image-store.s3.amazonaws.com/0/195305/3bdcf33e-685c-66e7-d1ee-23495c8a9217.png)


構成の選択
![Screenshot from 2017-08-03 20:13:53.png](https://qiita-image-store.s3.amazonaws.com/0/195305/3cf7216c-8e60-d585-8718-afe26c2cbb50.png)
最後は"終了"ボタンをクリックし、プロジェクトを作成します。

作業画面

この画面で、コーディングやデバッグなどを操作できます。

"Hello World, DS-5"の内容を出力します。


# 3. ARMをビルド

ARMのツールチェインを追加します。

![Screenshot from 2017-08-17 14:09:13.png](https://qiita-image-store.s3.amazonaws.com/0/195305/b1d0195b-8bf4-d25d-37b7-b516574b731a.png)



![Screenshot from 2017-08-17 14:21:56.png](https://qiita-image-store.s3.amazonaws.com/0/195305/616076ae-0c76-1fc4-5e59-a4c572953b95.png)


コンソールで"Hello World!!"を出力します。


# 4.　アプリケーションをデバッグしてみる


# 5.　ああああ


# 6.その他

# まとめ
Storyboardのみでスクロール可能なUIStackViewを作る

スクロール可能なUIStackView、毎回調べているのでメモ。

# 概要
[![https://gyazo.com/d44a621dc7447a403858c742b29ba11c](https://i.gyazo.com/d44a621dc7447a403858c742b29ba11c.gif)](https://gyazo.com/d44a621dc7447a403858c742b29ba11c)

UIStackViewに高さは自動計算して欲しい。
さらにUIScrollViewでスクロールして欲しい。

# UI部品配置
![スクリーンショット 2017-08-03 19.24.28.png](https://qiita-image-store.s3.amazonaws.com/0/21799/9be90c44-b63c-89d9-844d-35d6dcee0179.png)

UIScrollViewの中にUIStackViewを。UIStackViewの中身はお好みで。
今回は高さの異なるUILabelを配置しました。

# AutoLayout
## UIScrollView
![image.png](https://qiita-image-store.s3.amazonaws.com/0/21799/3bcc4030-33ad-1cfa-0c38-e17cfaec6c4b.png)
上下左右のマージンを0にする。
`Constraint to margins`のチェックを外さないと左右に隙間が空いちゃうのもいつもハマる(誰得なのこれ？)。


## UIStackView
同じく上下左右のマージンを0にする。

## UIScrollView & UIStackView
⌘を押しながらUIScrollView と UIStackView を選択して同じ幅にする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/21799/721c57ec-24a2-afa2-fecc-0051c70958d3.png)

# UIStackView設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/21799/a7eab689-fb39-3085-48c3-8c0b06e0a774.png)
`Equal Spaceing`で`Spaceing`は0。

# まとめ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/21799/a209ed84-d322-58d7-e8f6-2ef8aa6758a8.png)


# 参考
https://stackoverflow.com/questions/31668970/is-it-possible-for-uistackview-to-scroll