OmniAICreator/Qiita-1.07M huggingface dataset:
スキャンされた文書を自動的に年月フォルダに分類するフォルダアクション

##きっかけ
ScanSnapで紙形式の文書をpdf化して、特定のフォルダに保存されるようにし、scanフォルダ内が肥大化してきたら月ごとにフォルダ分けして整理していた。(*scanned/201705 , scanned/201704*等)
Automatorで自動化できるのではないかと思いやってみた。

Automatorでスクリプトを書いたことは殆ど無いので、すべてシェルスクリプトとかメジャーなものに投げて、それを実行するプログラムにしようかと一瞬考えたが、あまりスマートなものでもないのでできるだけAutomator内でやってみることにした。

##方法
### Automatorで~~サービス~~フォルダアクションを作成する。
(2017/11/24 フォルダアクションの間違いでした、訂正）
<img width="665" alt="スクリーンショット 2017-11-24 9.58.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/162882/7bc91b48-87c4-b874-003f-374411f1c1df.png">

### プログラムを書く
流れとしては非常に単純で、現在の月日の名前のついたフォルダを新規作成し、入力ファイルを全て移動するのみである。
<img width="896" alt="スクリーンショット 2017-05-24 12.28.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/162882/fafd36f8-634a-b6eb-7b32-ec393bc786c7.png">
###書いたAppleScript
目的達成のため、ぽそっとAppleScriptを書く必要があったので。

####日時を整形するScript
Automatorの「変数」には現在の日付を取得する変数「現在の月」、「現在の年」があるが、そのまま連結すると、"20175月"となってしまい、やや不格好である。
そこで、AppleScriptを用いて、日付を整形することにした。
(参考：[AppleScriptで現在日時の文字列を取得する](http://qiita.com/takeohman/items/b9ce39b9b79bfb6341f9))

```
on run {input, parameters}
	set current_date to current date
	
	set val_year to year of current_date as number
	set val_month to month of current_date as number
	
	if val_month < 10 then
		set val_month to "0" & val_month as string
	end if
	set data_time_string to val_year & val_month
	return data_time_string as string
end run
```

####実際にファイルを移動するScript
引数の一つ目に受け取ったフォルダへ、二つ目以降に受け取ったファイルを移動するScriptを書いた。
Automatorでは、処理されなかった引数がだらだら追加されていくようである。
(参考：[AutomatorでAppleScriptに値を渡す](http://ameblo.jp/softwaredeveloper/entry-11988473204.html))

```
on run {input, parameters}
	set tgtFolder to item 1 of input
	repeat with counter from 2 to (count of input)
		set tgtFiles to item counter of input
		tell application "Finder"
			move tgtFiles to tgtFolder
		end tell
	end repeat
	return input
end run
```
ファイル移動にはFinderを用いた。
(参考:[Applescriptのごく基本的なサンプル(OS X用)](http://www.asahi-net.or.jp/~va5n-okmt/factory/applescript/sample_code/))


### テスト
テスト用には**指定されたFinder項目を取得**を用いる。
<img width="897" alt="スクリーンショット 2017-05-24 12.38.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/162882/6ac64c71-4f78-857c-9500-20110eeeb39b.png">
ちなみに**`種類`が`フォルダ` `ではない`** フィルタを適用しないと、どんなフォルダを作っても、現在の年月フォルダ内に勝手に移動させられてしまう。
年月フォルダができた瞬間に、自身を中に移動させようとしてエラーが起きそう。

##まとめ
これは僕がAutomatorに慣れていないからかもしれないが、Automatorだけでは少し力不足感があった。
AppleScriptまで組み合わせるともうちょっといろいろできそうかも。
ちょいネタにはいいかもしれないけど、本格的に勉強するには、シェルスクリプトとかと比べるとコスパが悪い。
ローカルでgitを使って構成管理をスタートする

:::note info
2021/7/31 わかりにくい部分を修正しました。
:::

gitを使用して構成管理をスタートする手順です。
プロジェクトの構成管理を行なえるようになるまでについてまとめます。


#前提
- gitがインストールされていること
- GUIのクライアントアプリは使用せず、CUIベースで説明をします
- 環境はMacです

#手順

###gitが使用できることを確認する

ご自身の使用しているコマンドラインツールを使用して、以下のコマンドを実行します。

```bash
$ git --version
git version 2.26.2
```

gitのバージョンが表示されればOKです。
gitが使用できる状態になっています。

###ソースコードを格納するフォルダを準備する
好きな場所に、ソースコードを格納するフォルダを準備します。
今回は　`sample-code` フォルダの中にソースコードを置いていく想定で進めます。

```bash
$ mkdir sample-code
```

###gitリポジトリを作成する
先程作成した`sample-code`でリポジトリを作成します。
フォルダに移動し、`git init`コマンドを実行します。

```bash
$ cd /sample-code
$ git init
Initialized empty Git repository in **********/sample-code/.git/
```

この状態で`sample-code`フォルダを見てみると、`.git`フォルダが作成されています。

```bash
$ ls -a
.	..	.git
```

この`.git`が含まれているフォルダとそれより下位にあるフォルダがgitで管理されるようになります(すなわち `sample-code` フォルダ)。
ここまでで、構成管理をすることができるようになりました =  `sample-code` プロジェクトでGitを使うことができるようになりました。
今日は最初のコミットをしてみるところまでやってみます。


###最初のコミットをする

`git init`をした直後の状態で`git status`コマンドを打ってみます。

```
$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)
```
`No commits yet` とあるように、コミットがまだないことがわかります。

コミットをしてみます。
新規に`test.txt`ファイルを作成します。

```bash
$ touch test.txt
$ echo 'hello git' > test.txt
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	test.txt

nothing added to commit but untracked files present (use "git add" to track)
```

`git add`し、`git commit`します。

```bash
$ git add test.txt
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   test.txt

$ git commit -m "first commit"
[master (root-commit) xxxx] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
$ git status
On branch master
nothing to commit, working tree clean
```

これで最初のコミットが完了です。



###その他
- git initコマンドは、すでにファイルなどが存在するフォルダでも実行できます。
    - もともとgitで構成管理をしていなかったフォルダ直下で実行することで、そのフォルダ以下をgitで管理できるようになります。
- ここで作成したコードをgithubなどにあげたい場合は、以下を参照してください
    - https://qiita.com/chihiro/items/49d350fdc964ddc94ec4
Rails の time_zone の設定は initializers/* には書かない

## 結論

`config.time_zone` の設定は `config/initializers/*` 下ではなく、`config/application.rb` に書く。

## 経緯

たぶん Rails 5 から、`config/application.rb` に下記のような記述があって、素直に `config/initializers/*.rb` 下に設定を書いていた。

```ruby
# Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded.
```

デフォルトのタイムゾーンの設定も `config/initializers/time_zone.rb` というファイルを作って `Rails.config.application.config.time_zone = "Tokyo"` のように書いてたんだけど、どうも効いていない (`Time.zone` が UTC のまま)。

コードを追ってみると、`activesupport/lib/active_suport/railtie.rb` の `initializer "active_support.initialize_time_zone"` で `Time.zone_default` を設定している。

このコードは `config/initializers/*` より早い段階で実行されるようなので、それより早い段階で `time_zone` を設定する必要がある。

結果 (Rails 4 までのコメント通り) `config/application.rb` で設定するのが正解ぽい。

## 環境

- Rails 5.0.2
virtualenv local_action module not found

## 悩み

タイトル通りに，virtualenvを用いて，ansibleのlocal action利用するときに，
module not foundのようなエラーに遭遇した．

具体的に，ansible2.3のvmware_guestを利用したくて，ansible2.3のvirtualenvを作りました．
それで，問題発見．

vmware_guest.py がpyvmomi.py に依存.
virtualenvに，pyvmomiをいれました．
なのに，pyvmomiがみつからないという理由で，vmware_guest.pyに怒られました．

### 答え(気が短い方へ)
チューニングして，解決した．

```
[local]
localhost ansible_python_interpreter=python
```



## チューニング経緯

### インベントリファイル無

```
(ansible2.3)$ ansible-playbook gathervm.yml  --extra-vars "vmname=t1-malts-230"
 [WARNING]: Host file not found: hosts

 [WARNING]: provided hosts list is empty, only localhost is available

PLAY [localhost] ********************************************

TASK [gather VM facts "t1-malts-230"] ************************
ok: [localhost]

TASK [debug] ***********************************************
ok: [localhost] => {
...
}

PLAY RECAP ******************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0
```

うまくいくけど，[WARNING]がでます．

## インベントリファイル有

[WARNING]をクリアするために，hosts追加

```
(ansible2.3)$ cat hosts
[local]
localhost

(ansible2.3) ~/p/vsphere ansible-playbook gathervm.yml  --extra-vars "vmname=t1-malts-230"

PLAY [localhost] *******************************************

TASK [gather VM facts "t1-malts-230"] *********************************
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "pyvmomi module required"}

PLAY RECAP ***********************************************
localhost                  : ok=0    changed=0    unreachable=0    failed=1
```

### これで，問題発見．

virtualenvにあるのに

```
(ansible2.3)$ pip list | grep pyvmomi
pyvmomi (6.5.0.2017.5)
(ansible2.3)$
(ansible2.3)$ deactivate
```

systemにないけど
```
$ pip list | grep pyvmomi
$
```

## 答え
---
インベントリファイルの書き方によって，利用するpythonインタプリタが違います．

↓ /path/to/system/python (mac の場合，/usr/bin/python)

```
[local]
localhost
```

↓ /virtualenv/python

```
[local]
localhost ansible_python_interpreter=python

```

↓ /virtualenv/python

```
(空)
```

/path/to/system/python と /virtualenv/pythonは，別物だ．
今回のエラーの原因は，それぞれのsys.path違うからだ．
SlideshareとSpeakerDeckにおけるスライド表示方法の違い

## なんで調べたか
SpeakerDeckのスライドにアクセスしたときに次のスライドへの読み込みが遅いと
よく感じていたため。
競合のSlideshareと比較して何が違うのか知りたかった。

## SlideShare
遅延ロードやってる
Thumbnailもスライドもすべて遅延読み込み
ユーザーのインタラクションがあってから読み込むようになっている

例えば、最初に送りボタン `▶` がクリックされると1番目から9番目くらいまで
画像のリクエストが送られるようになる

簡略したものですが
初回読み込み時こうだったものが

```html
<section data-index="9" class="slide" slidenumber="9">
  <i class="fa fa-spinner fa-spin"></i>
  <img 
  class="slide_image" 
  src="" 
  data-small="https://hoge.com/t-9-320.jpg?cb=xxxx" 
  data-normal="https://hoge.com/t-9-638.jpg?cb=xxxx"
  data-full="https://hoge.com/t-9-1024.jpg?cb=xxxx"
  title="" alt=""
  >
</section>
```

↓ ロード対象になると

```html
<section data-index="9" class="slide" slidenumber="9" style="min-height: 0px;">
  <img 
  class="slide_image"
  src="https://hoge.com/t-9-638.jpg?cb=xxxx"
  data-small="https://hoge.com/t-9-320.jpg?cb=xxxx" 
  data-normal="https://hoge.com/t-9-638.jpg?cb=xxxx"
  data-full="https://hoge.com/t-9-1024.jpg?cb=xxxx"
  title="" alt=""
  >
</section>
```

`src=“”`に読み込み先が転記されます。

画像の置き場はドメインとってるだけでS3?
SlideShareのほうが転送量もかからないし効率的な運用になっている

細かいところですが、スライドが読み込まれてないときはloadingGifがでるように
なっているのも親切

## SpeakerDeck

遅延ロードやってない(1リクエストですべて完結)
Thumbnailもスライドも一回のページリクエストですべて読み込むようになっている
Thumbnailやスライド画像はS3から
スライド領域はjsで動的に切り替えを行っている

何気にErlangを使っているのが気になりました。
[cowboy](https://github.com/ninenines/cowboy)(WAF)を使っている?

## まとめ

技術的にはSlideShareのほうが
サービスにかかる原価やユーザーへの待ち時間が考慮されてるので
Slideshareにモノは上げ続けようと思います。

ゴリゴリにjs書いて管理してるんでしょうが。。
【FileMaker】FileMaker 16のJSONで楽をする郵便番号検索実装（２）

さて、[前回](http://qiita.com/tyuma/items/9a130b2689e8337ff976)のcURL+JSONに引き続き、今回は複数件ヒットしたデータの処理です。

郵便番号って、一つの郵便番号に一つの地名かと思っていたら、そうでない地域がたくさんあるんですよね。びっくりです。
今回サンプルを作るのに、郵便番号データを元にどの郵便番号が一番多く地域を担当しているかリストしてみました。
<img width="585" alt="FM16JSON2_0.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/a7b0d5a1-b632-0183-630b-ff0c04f0f00e.png">
66件！

すごいですね。。。
春日、「かすが」ではなく「はるひ」と読むところも意外性があって、調べていて楽しかったです。

そして、こんな風に複数件の地域を担当している郵便番号がどのくらいあるかを調べたら、ここに表示しきれないほどたくさんあったので、割愛します。

# 複数件の郵便番号地域を取得する実装

## 動きの確認

まずは、複数件のデータが返ってくる動きをみてみます。

[https://youtu.be/P4S5kfJsptY](https://youtu.be/P4S5kfJsptY)

今回は、事前調査で20件の地域を担当している郵便番号：969-0401で実行します。
<img width="822" alt="FM16JSON2_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/42f28cb0-b99c-637c-30d5-4be0a6993110.png">

数秒、かかりました。
<img width="461" alt="FM16JSON2_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/1f6438cd-101c-9ed1-1040-fdbff6bf2755.png">
多くのデータを取得する際は、転送時間がかかりそうなので、場面によってはcURL+JSONを使わずに今までのように郵便番号データを別FMで管理してレスポンスを早める方がいいかもしれません。

レスポンス分解（必ずやらなくても目的のデータは取得できます）のあと、results分解。
20件、取得できています。
<img width="854" alt="FM16JSON2_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/9b0dd081-a5e3-f0d3-ab47-4fe51e9325a2.png">

今回は住所データをレコードに保存しました。
<img width="1040" alt="FM16JSON2_4.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/f54e2807-e345-eda9-5174-8d9e25539a56.png">
20件のレコードが出来上がりました。


## 実装してみる

では、実際に実装を見ていきましょう。

複数件のデータを保管するのに、テーブルを一つ追加しました。
<img width="581" alt="FM16JSON2_5.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/c2de2083-07ce-3375-a298-e02f2066567f.png">

改修したのは、results分解のスクリプトです。
<img width="684" alt="FM16JSON2_6.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/ee7befe9-4973-c67c-76ca-5474ee9ae826.png">
取得したresultsの件数を[JSONListKeys](https://www.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help%2Fjsonlistkeys.html%23wwconnect_header)とValueCountで計算し、そのresults件数分Loopを回して配列データをレコードにセットしています。

どうしても気に入らないのは、
`"results[$cnt]address1"`
と書きたいのに、
`"results[" & $cnt & "]address1"`
と「＆」で文字列を作らないとならないことです。
この辺が、FileMakerあるあるではないでしょうか。。。orz

多言語出身なので、どうもこういう書き方に未だに慣れません。
配列くらい、整形せずに書きたいものです。


新しく出てくるJSON関連関数は、[JSONListKeys](https://www.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help%2Fjsonlistkeys.html%23wwconnect_header)ですので、それさえ使い方を押さえれば、複数件データ取得はいつものデータ処理スクリプトと同様です。
<img width="745" alt="FM16JSON2_7.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/29e697bf-8df2-a7da-d18e-d43cb7b45b4c.png">

いかがでしたでしょうか？
少しのJSON関数を覚えておけば、かなりできることが広がると思いますので、ぜひやってみてください。
Firefox v53のMulti Processを無効化する

とあるアドオンのために、知らぬ間にデフォルトで有効になっていたFirefoxのMulti Process設定を無効化する必要が出たので、その時のメモ。
（特に理由がないかぎり、通常は有効にしたおいたほうが確実にパフォーマンスが良いです）

## 環境
Windows 10 x64
Firefox 53.0.3 (64 ビット)

## 現在のMulti Processの設定を確認
Firefoxで`about:support`を開くと現在のMultiProcessの設定を確認できる。
`トラブルシューティング情報`というページが開かれるので、`アプリケーション基本情報 > マルチプロセスウィンドウ`の情報を見る。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/2222705b-8d26-c5eb-c0f9-57137fa73990.png)
自分の環境では `2/2 (規定で有効)`となっていた。

### 念のためプロセス一覧から見ておく
複数のFirefoxプロセスが動作しており、マルチプロセスで動いているのがわかる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/8274251b-795c-b14c-8c1e-039448914111.png)

## Firefoxの設定を変更
Firefoxで`about:config`を開くと、以下のような警告が出ることがあるが、__`危険性を承知の上で使用する`__をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/bfb0f80a-e2b2-b583-48df-9b22bc38b7cd.png)

`browser.tabs.remote.autostart`で検索をすると1つないし2つの設定項目が出てくるので、`false`にする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/8581843c-7f6a-a1ea-bee9-f829d2b9757d.png)

また、環境によっては`browser.tabs.remote.autostart.2`という設定ないことがあるようなので、存在しなければ`右クリック > 新規作成 > 真偽値`から設定を新規作成し、設定名を
`browser.tabs.remote.autostart.2`とし、設定内容は`false`とする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/d45f73a0-5928-30ad-1808-1fe3ae6df5da.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/6b0f87ed-6787-8f24-f1ad-610893b59825.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/e5036522-8b8d-2439-8f99-07c1b17d0a65.png)


自分の環境では、`browser.tabs.remote.autostart.2`が存在する場合と元々存在しない場合、更に存在するが型が文字列になっている場合があった。

__設定後、Firefoxを一度閉じる。__

## 設定が適用されているかを確認する

再度Firefoxを立ち上げて、`about:support`のページを開くと、成功していれば`マルチプロセスウィンドウ 	0/1 (無効)`となっているはず。
有効のままの場合は、`about:config`より先程の設定内容を再確認すること。

また、タスクマネージャーからプロセス一覧を見ると、以下のようにFirefoxが1つのみとなっており、シングルプロセスで動作しているのがわかる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/bd83b5bb-6bc9-956e-aef6-385cc916c182.png)

## 参考ページ
[Multi\-Process Firefox: everything you need to know \- gHacks Tech News](https://www.ghacks.net/2016/07/22/multi-process-firefox/)
[Firefox 51 Multi\-Process – Ant\.com Support](https://support.ant.com/hc/en-us/articles/115000513446-Firefox-51-Multi-Process)

### その他
間違いなどありましたら、コメントを頂けると幸いです。
ajaxが絡んだ様々なエラーの確認、デバックの方法。

##ファイルの受け渡し先で取得できてるか確認する方法


```php:sample.php
$now = $this->input->post('now');
```

```js:sample.js
$.ajax({
type: "POST",
		url: "sample.php",
		data: {
			"now":now,
		},
		dataType: "json",
		}).then(function (json) {
//中略
}
```
上記で``$now``が取得できてるか調べたい場合、そのまま``dump``しても表示されない。
下記の様にjs側で``dataType:"html",``として、console.logで表示したら良い。

```php:sample.php
$now = $this->input->post('now');
echo $now
```


```js:sample.js
$.ajax({
type: "POST",
		url: "sample.php",
		data: {
			"now":now,
		},
		dataType: "html",
		}).then(function (json) {
  console.log(json)
//中略
}
```
pandas関係リンク集

- [Pandas でデータフレームから特定の行・列を取得する – Python でデータサイエンス](http://pythondatascience.plavox.info/pandas/%E8%A1%8C%E3%83%BB%E5%88%97%E3%81%AE%E6%8A%BD%E5%87%BA)
- [<Python, pandas> データフレームから欠損値(np.nan)を除く方法 - ねこゆきのメモ](http://nekoyukimmm.hatenablog.com/entry/2015/02/25/222414)
- [Pandas のデータフレームをソートする – Python でデータサイエンス](http://pythondatascience.plavox.info/pandas/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%82%92%E3%82%BD%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B)
- [Python pandas データのイテレーションと関数適用、pipe - StatsFragments](http://sinhrks.hatenablog.com/entry/2015/06/18/221747)
- [Python Pandasでのデータ操作の初歩まとめ − 後半：データ集計編 - Qiita](http://qiita.com/hik0107/items/0ae69131e5317b62c3b7)
ajaxで今月の月末と月初めを使用したい場合はphpで

jsで時間を取得するのはよろしくない。
なのでphpで取得するようにする。


jsが書いてある同じファイル内にphpで読み込んだdate()をhiddenで仕込んでおく。
それをjqueryで取得してajaxで渡す。


```html
<input type ="hidden" id = "now" value ="<?= date('Y/m/d H:i:s')?>">
```

```js
var now = $('#now').val();
$.ajax({
		type: "POST",
		url: "exsample.php",
		data: {
			"now":now,
			
		},
		dataType: "json",
	})～略～
```

phpで加工した物を返却。


```php:exsample.php
//月初め
$start = date('Y/m/1 00:00:00',strtotime($now));　
//月末
$end= date('Y/m/t 23:59:59',strtotime($now));

$json = array(
　　'end' => $end,
　　'now' => $now,
		);
echo json_encode($json);
```
macOS Xでクリップボードにコピーしたものを、iOSシミュレータにペーストする

状況としては、

1. max OSテキストエディタで「command + C」
2. simulatorのテキストエリアで「ペースト」
3. いまさっきコピーしたものとは違うものがペーストされる

クリップボードが共有されていないみたいで、コピーペーストするのがすごくめんどくさい。

解決策としては

1. max OSテキストエディタで「command + C」
2. simulatorをアクティブにして何も選択せず「command + V」
3. テキストエリアを選択して、「ペースト」

とやるといける。ポイントは２の何も選択しないでcommand + Vをする部分
PostgreSQL（psql）の使い方（超基本）


## シェルで

```
$ psql -l　　
$ psql　　
```

上記はそれぞれ
* DB一覧表示
* PSQL起動


##  psqlモードで
```
\l
\c qiita_db
\d
select * from customer;
```


上記はそれぞれ
* DB一覧表示
* DB切り替え
* テーブル一覧表示
* テーブル内容表示

ここで
* qiita_dbはデータベース名
* customerはテーブル名

### （参考）確認環境/メモ
* PostgreSQL 9.6 
* CentOS 6.5
Ubuntuのパッケージインストール時にデーモン起動を抑制する

特殊な用途かもしれないけど、Ubuntuのパッケージインストールをする時に自動でデーモンを起動したくない場合があります。

ipv6を完全無効化している場合に、nginxをでインストールするとデーモンが起動されるときに、

```:/etc/nginx/site-enabled/default
        listen [::]:80 default_server;
```

に引っかかってしまって、エラーになってしまいます。（ipv6のloopbackをbindできない。）

これを回避するには、パッケージインストール時にデーモンの起動が抑制できれば良いのですが、なかなか方法が見つからなかったので個人的備忘録。

結論から言えば方法は簡単。以下のファイルを作成して実行属性をつけておくだけです。

```bash:/usr/sbin/policy-rc.d
#!/bin/sh  
exit 101
```

こうすると、パッケージインストール時にデーモンが起動されません。

なんでこれで抑制できるか？　ですが、Debian/UbuntuのSysVinitの `invoke-rc.d` が `policy-rc.d` を呼び出したときのリターンコードで制御しているみたいです。

`101`という定数がポイントのようですが、詳しいところまではわかりませんでした。
とりあえず手元の環境では期待通り動いているので良しとします。

Ansibleでプロビジョニングするときのにパッケージインストール時にデーモンが自動起動してしまって、変な副作用が発生してコケることがあるのですが、これで解決できそうです。
再说 rabbitmq


对于 rabbitmq 来说, 我想其实很多已经了解它是做什么用的, 简单说它就是`消息代理`, 它能够接收消息然后分发消息, 打个比方它就好比邮局. 你把写好的信扔进邮筒, 然后邮局的工作人员就会必定会把它送往你想要邮寄的对方手里. 这个过程中的邮筒,工作人员已经邮寄的过程就是 rabbitmq 它做的事情. 唯有不同的就是纸质信和二进制的消息内容. 在这里会涉及到几个对象, 一个是生成消息的人我们叫做 producer, 而` producing` 这个动作就好比发信. 然后邮筒就是` queue`, 然后邮局工作人员就是` consumer`.

![Kobito.WbnWv0.png](https://qiita-image-store.s3.amazonaws.com/0/56713/5b725be0-9186-8c1b-f467-42097a46f769.png "Kobito.WbnWv0.png")

就是这样一个过程和关系了.

首先,我们假设已经安装好了 rabbitmq 在自己的 local 环境. [具体怎么安装其实很简单, ](https://www.rabbitmq.com/download.html), 但是涉及到具体的自定义安装已经端口,数据存放位置还有性能调优这是高阶的话题实际场景再去查阅讨论.

这里我们一切都安装默认的安装来例子. 这里也是使用 ruby 对应的客户端` bunny` 来完成.


#### publish

```ruby

#!/usr/bin/env ruby
# encoding: utf-8

require "bunny"
#then connect to RabbitMQ server

conn = Bunny.new
conn.start

ch = conn.create_channel
q = ch.queue("hello")
ch.default_exchange.publish("hello world", :routing_key=> q.name)
puts " [x] Sent 'Hello, world'"

conn.close()

```

ref: https://github.com/rabbitmq/rabbitmq-tutorials/blob/master/ruby/send.rb


#### send


```ruby

#!/usr/bin/env ruby
# encoding: utf-8

require "bunny"


conn = Bunny.new
conn.start


ch   = conn.create_channel
q    = ch.queue("hello")

# 这里以上都是和 publish 是一样. 也就是我们不管干什么都应该创建连接然后连到目的 queue

puts " [*] Waiting for messages in #{q.name}. To exit press CTRL+C"
q.subscribe(:block => true) do |delivery_info, properties, body|
  puts " [x] Received #{body}"

  # cancel the consumer to exit
  delivery_info.consumer.cancel
end


```

这个就基本完成了基本的 publish 和 receive的动作.
0からわかるPID制御

##PID制御とは
　自動車の制御の一つにPID制御というものがあります．P,I,Dとはそれぞれ
P:Proportional（比例）
I:Integral（積分）
D:Differential（微分）
を意味しており，これらの3つの要素を組み合わせて制御対象を制御するものとなっています．

ここでは簡単に以下のような自動車の制御を考えることにします．

「一定速度で進む車と基準線があり，この車のハンドル角のみを制御することにより，車を点線に近づけます．」


![pid.png](https://qiita-image-store.s3.amazonaws.com/0/163685/a546139a-6caa-fbd8-8abc-037562afc916.png)
Fig1.自動車と基準線


車と点線との距離をCTE(Cross Track Error)と呼び，これを小さくします．
式にすると以下のような式になります．

```math
steer = K_p \times cte + K_D \frac{d}{dt}cte + K_I \sum cte
```

ここで$K_P,K_I,K_D$をそれぞれ，Pゲイン（比例ゲイン），Iゲイン（積分ゲイン），Dゲイン（微分ゲイン）と呼ばれます．


### P制御
　P（比例）ゲインのみを用いて制御しようとすると下図のようになります．
基準線に近づき，線を通り過ぎ，再び基準線に近づき通り過ぎる，といったことを繰り返しています．この通り過ぎた部分のことをオーバーシュートと言います．

　Pゲインのみで制御しようとすると，オーバシュートが発生し軌跡は振動的になってしまいます．またPゲインの値を大きくすると，素早くCTEを0に近づけようとしますが，振動が発散してしまいます．
　
　このように，Pゲインのみを調整して制御することは困難であるということがわかります．
![download-4.png](https://qiita-image-store.s3.amazonaws.com/0/163685/81b97b6f-1e7c-277c-e072-93c66da67f46.png)
Fig.2　P制御



### PD制御
　そこで，次にD(微分)成分を入れてみます．Dゲインを入れることで図のように，振動が収束していることがわかります．Dゲインは入力（ハンドル角）の変化量を抑える役割があります．

![download-5.png](https://qiita-image-store.s3.amazonaws.com/0/163685/a53024e0-98f6-5703-96aa-713885eab03d.png)
Fig.3　PD制御


　PD制御でも十分に目標値へ追従できていることがわかります．I（積分）ゲインが必要ないようにも思われます．それではI（積分）ゲインにはどのような効果があるのでしょうか？

ここで，次のような問題を考えます．
先ほどの自動車の例と同じものを考えますが，タイヤを取り付ける際に何らかのミスが生じ，少し傾いていることとします（現実では考えにくいですが．．．）

![download-6.png](https://qiita-image-store.s3.amazonaws.com/0/163685/eab4900c-7293-41f5-0862-8f8e36195c61.png)
Fig.4  新しい問題設定


このとき，同じようにP制御とPD制御を適応すると以下の図のようになります．するとP制御は目標値から外れたところで振動し，PD制御は基準線に近づくものの，基準線との差が埋まらないまま，収束してしまっています．この差のことを定常偏差と言います．PD制御では定常偏差を解消することができません．
この定常偏差を減らすためにI(積分)ゲインが必要となります．
![download-7.png](https://qiita-image-store.s3.amazonaws.com/0/163685/a47c0338-52fa-c924-066d-530bbb13ebf7.png)

Fig.5 PID制御



### PID制御
そこでI(積分)ゲインを入れてみます．
すると以下の図のように，定常偏差を解消することができました．
本記事では$K_p,K_I,K_D$の値については議論していませんが，実際にPID制御を適応する場合には，$K_p,K_I,K_D$のパラメータチューニングが必要となります．
![download-3.png](https://qiita-image-store.s3.amazonaws.com/0/163685/f4a559bc-0a99-d09c-8fe5-f8703429a45d.png)

本記事では厳密性は犠牲にしており，感覚的な議論となっています．ご了承ください．
次回の記事ではPID制御を用いることにより，シミュレータ上の自動車を制御します．PID制御の実装はC++を用います．

####参考文献

<a target="_blank" href="https://www.amazon.co.jp/gp/product/4061557912/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4061557912&linkCode=as2&tag=ryo519-22&linkId=5f5c6f5f721335e759754ff5f887b62f">はじめての制御工学 (KS理工学専門書)</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=ryo519-22&l=am2&o=9&a=4061557912" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a target="_blank" href="https://www.amazon.co.jp/gp/product/4062573962/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4062573962&linkCode=as2&tag=ryo519-22&linkId=62e8196ab5729edcacc18b4db4473488">制御工学の考え方―産業革命は「制御」からはじまった (ブルーバックス)</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=ryo519-22&l=am2&o=9&a=4062573962" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

問題設定は以下を参照しました．
https://www.youtube.com/watch?v=-8w0prceask

PID制御のパラメータチューニングについてはこの動画がわかりやすいと思います．
https://www.youtube.com/watch?v=4Y7zG48uHRo&t=163s
GCDを使って複数のNCMBリクエストを実行し、メインスレッドに戻す方法

mBaaSで、複数オブジェクト操作APIの提供終了に伴い、for文等で複数オブジェクト操作を行った際に、処理が完了した後にメインスレッドに戻す必要性が出てきました。
http://info.biz.nifty.com/mb/2017/03/api-2.html

今回は、GCDを利用してその処理を行ってみようと思います。

# Objective-c

```objc
// 非同期処理のグループを作成
dispatch_group_t group = dispatch_group_create();

for (int i = 0; i < 5; i++) {
    // グループのカウントをひとつ増やす
    dispatch_group_enter(group);
    // testクラスのNCMBObjectを作成
    NCMBObject *object = [NCMBObject objectWithClassName:@"test"];
    // オブジェクトに値を設定
    [object setObject:@"value" forKey:@"key"];
    // データストアへの登録を実施
    [object saveInBackgroundWithBlock:^(NSError *error) {
        if (error){
            // 保存に失敗した場合の処理
        } else {
            // 保存に成功した場合の処理
        }
        // グループのカウントをひとつ減らす
        dispatch_group_leave(group);
    }];
}

// グループの処理が完了した時にメインスレッドでblocksを実行する
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    // メインスレッドに戻ってきた時に行う処理
});
```

# Swift

```swift
// 非同期処理のグループを作成
let group = DispatchGroup()

for _ in 0..<5 {
    // グループのカウントをひとつ増やす
    group.enter()
    // testクラスのNCMBObjectを作成
    let object = NCMBObject.init(className: "test")
    // オブジェクトに値を設定
    object?.setObject("value", forKey: "key")
    // データストアへの登録を実施
    object?.saveInBackground({ (error) in
        if error != nil{
            // 保存に失敗した場合の処理
        } else {
            // 保存に成功した場合の処理
        }
        // グループのカウントをひとつ減らす
        group.leave()
    })

}
// グループの処理が完了した時にメインスレッドでblocksを実行する
group.notify(queue: DispatchQueue.main) {
    // メインスレッドに戻ってきた時に行う処理
}
```
bitbucket api メモ

# reference
https://developer.atlassian.com/bitbucket/api/2/reference/resource/

# create pullrequest

```bash
 curl -X POST \
    --user $user:$password \
    --data '{"source": {"branch": { "name": "branch名" } }, "title": "プルリクタイトル"}' \
    --header 'Content-type: application/json' \
    https://api.bitbucket.org/2.0/repositories/{username}/{repo_slug}/pullrequests
```
[see here](https://bitbucket.org/site/master/issues/8195/rest-api-for-creating-pull-requests)
git で、remote branch を消す。たとえば origin だけまとめて消す。

```bash
$ git br -r | awk -F/ '/^[[:space:]]+origin/ {print $2}' \
| xargs git push --delete origin
```
awk の regex で `\s` とかが使えなかった。

**追記1**

長いけど、grepで絞った方がわかりやすいかとおもいました。

```bash
$ git br -r --merged | grep -e '\sorigin\/' | awk -F/ '{print $2}' \
| xargs git push --delete origin
```

**追記2**
`<pattern>` が使えました。この場合は `--list` の明示が必須です。

```bash
$ git branch -r --list 'origin/*' | awk -F/ '{print $2}' \
| xargs git push --delete origin
```

いまのところこれが一番すきです。


参考

- ftp://ftp.gnu.org/old-gnu/Manuals/gawk-3.0.3/html_chapter/gawk_5.html


# 補足

```
$ g push --delete origin test
error: unable to delete 'test': remote ref does not exist
error: failed to push some refs to 'git@github.com:mochizukikotaro/hoge.git'
```

こんなエラーになってしまったときは、以下。（リモートリポジトリで直接消すとこうなるらしい）

```
$  git remote prune origin
```
/etc/ssh/sshrc

ssh ログイン時に実行される。たとえば

```bash:/etc/ssh/sshrc
echo "\"$USER\" has logged in to host from \"$SSH_CLIENT\" at `date +"%F %H:%M:%S"`" | mail -s "sshd login notification" root
```
とか書いとけば全てのssh経由のログインで通知が来る。 
めったにログインされない大事なホスト等で一瞬でログインに気づきたけいときとかは役に立つ可能性がある。
Slack連携しとくとのも現実的かもしんない。

sshrcはログインするユーザのログインシェルで独立したシェル環境で実行される。
cshをログインシェルにしてリモートログインしてみたらcshで実行された。
``/bin/sh`` 原理主義者がログインしてきたときにも対応しろってことなのかこれ。

自分だけに有効にしたいものはここに書かず、 ~/.ssh/rc を検討したほうが良いように思われる。

``man 8 sshd`` の LOGIN PROCESS 等を読んでおく方が良い。
ログイン時の処理に何かを挟み込むのはしばしばややこしい。

 * 参考
   * man 8 sshd
MySQLが立ち上がらない！！！



#MySQLのサーバーを止めると立ち上がらなくなる問題について
MySQLを止めて再度立ち上げようとすると、下記エラーに遭遇して立ち上げれなくなることによく遭遇した。

`ERROR 2002 (HY000): Can't connect to local MySQL server through socket `

`. ERROR! The server quit without updating PID file(/usr/local/var/mysql/***.local.pid).`

以下のバージョン。

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.18, for osx10.12 (x86_64)
```

MySQLをストップした後に、立ち上げようとすると`PID file`に関連したエラーで立ち上がらなくなる。

```
$ sudo mysql.server stop
Password:
Shutting down MySQL
. SUCCESS!

$ sudo mysql -u root -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

$ sudo mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/***.local.pid).
```

PID FILEがどうやらなくなるようなので、それを作成してあげる。
（***には自分のパソコンに合わせて書き換えて下さい。）

```
$ touch /usr/local/var/mysql/***.local.pid
```

無事にMySQLが立ち上がる！解決！

```
$ mysql.server start
Starting MySQL
. SUCCESS!
```
Googleアカウントに接続されているアプリを削除する


[アカウント](https://myaccount.google.com/)
　↓
[ログインとセキュリティ](https://myaccount.google.com/security)
　↓
[接続済みのアプリとサイト](https://myaccount.google.com/security#connectedapps)
　↓
[アプリを管理](https://myaccount.google.com/permissions)
MySQLのbinlogがディスク容量を圧迫しているときに確認すべきこと

MySQLのバイナリログ(binlog)が大量に出力され、毎日夜間に40G近くのファイルが生成されていた。

##バイナリログとは
- 下記のようにMySQLの更新クエリを記録するログのこと
![binlog.jpg](https://qiita-image-store.s3.amazonaws.com/0/171634/9b34d5ff-4334-2bab-bf83-4ed41c496505.jpeg)
- 数日でローテイトされる（設定による）
- バイナリログはレプリケーションおよびデータ復旧に用いる
- バイナリログの出力方法には以下の3種類がある

|種類               |    設定値|    内容            |
|:------------------|--------:|:------------------:|
| ステートメントベース|STATEMENT|実行した SQL文をバイナリログに記載します   |
| 行ベース           |      ROW|行の変更内容が全てバイナリログに記載されます|
| ミックス           |    MIXED|基本的にステートメントベースと同じ動作をしますが、特定の場合に行ベースに切り替わります|

##今回の事象
- MySQL5.5の場合、デフォルトは「ミックス」
- この場合、**テンポラリーテーブルの中身が「行ベース」で出力**される
- 夜間処理で巨大なテンポラリーテーブルを作成していたため、40Gものバイナリログが出力されていた！
- 「ミックス」がこのような仕様になっている理由は、レプリケーションで用いるため
- 担当システムではレプリケーションしていないので不要と判断（実際にはデータ復旧時に時間がかかるようにはなる）

##バイナリログの出力方法を「ステートメントベース」に変更
- 設定方法

```mysql
mysql> SET binlog_format = STATEMENT;
```
再起動しても大丈夫なようにmy.confにも以下のように設定しておく

```mysql
binlog_format=STATEMENT
```

##結果
- 夜間のバイナリログが2G以下になり、ログ出力のディスクアクセスが激減したためか、夜間処理自体も速度アップ
Markdown記法でスライドを簡単に作ってしまおう！（Marp）

# Marpとは
[Marp](https://yhatt.github.io/marp/)とは、Markdown記法で書いてプレゼンテーションスライドができるフリーソフトです。
Powerpointやkeynoteのように手が込んだ作業はできないにしろ、簡単に、迅速にスライドを作りたいときに非常に便利です。

# Marpの特徴

どのようなときにMarpを使って、どんなことができるのか以下に書き出してみました。

- Markdown記法でさっとシンプルなスライドを作りたいとき。
- 日本製のものを使いたい時。
- pdfに出力したいとき。 
- 二つのテーマ（デフォルト、ガイア）と背景画像設定ができる。
- 数式を表示することができる。
- Zipファイルを解凍するだけで使える。
https://yhatt.github.io/marp/#

#実際のプレゼンテーション製作
次では実際にプレゼンテーションスライドを作っていきます。


##初期設定
###高さheightと幅width
全てのスライドの高さと幅をを変えられます。単位の指定は`in``mm``cm``pt`と`pc`が選べます。

```:例
<!-- $width: 12in -->
<!-- $height: 14px -->
```

###縦横の比率設定
スライドの縦横の比率を設定することができます。
指定できる種類として`16:9``4:3``A0-A8``-portrait ``B0-B8`が指定できます。

```:例
<!-- $size: 16:9 -->
```

###テーマ
テーマはファイルの最初に書き加えることで設定することができます。

|テーマ名|値|書き足すもの|
|:--:|:--:|:--:|
|デフォルト|default|<!-- $thema: default -->|
|ガイア|gaia|<!-- $thema: gaia -->|

templeteというものが指定できinvertにすると色が背景と逆転します。

```:例
<!--
$theme: gaia
template: invert
-->
```

###ページ数表示
右下にページ数を表示することができます。ここで`true`ではなく`false`とすると表示されなくなります。

```:例
<!-- page_number: true -->
```

###フッターfooterの設定
真ん中下にフッターを表示することができます。

```:例
<!-- footer: this is the footer -->
```

##スライド関係

###スライドの分割
スライドを分割するには`---`を代入すればいいです。

```:例
# slide 1

---

# slide 2
```

### 画像の挿入
画像は以下のように書けば入れることができます。

```:例
# 画像を挿入
![](画像ファイルパス)

# 画像の大きさをスライドサイズの比率で指定する
![比率%](画像ファイルパス)

# 背景画像を挿入
![bg](画像ファイルパス)

# 背景画像の大きさをスライドサイズの比率で指定する
![bg 比率%](画像ファイルパス)

# 背景画像を連続して書くと水平方向（横）に分割される 
![bg](画像ファイルパス)
![bg](画像ファイルパス)
```

## 参考リンク
[Marp(Marp Presentation)の文法まとめ](http://qiita.com/pocket8137/items/27ede821e59c12a1b222)

## サンプルコード
実際に使えるサンプルコードを載せておきます。

```:サンプルコード
<!-- $theme: gaia -->
<!-- footer: This is the footer -->
<!-- page_number: true -->
<!-- template: invert -->

## Marpって何
<書きたいこと>

---

## Agenda
<書きたいこと>

---

## 何をしているのか
<書きたいこと>
## スライド製作
<書きたいこと>
```
[Sails.js] AWS S3にファイルアップロード・ダウンロード

Sails.js ver 1.0で、AWS S3 にファイルをアップロード・ダウンロードしてみたので、メモします。

# ダウンロード（AWS-SDK）
AWSが提供しているaws-sdkを利用します。
AWSの認証情報は、config/awsCredentials.jsonというファイルに入れておく。

```json:config/awsCredentials.json
{
  "accessKeyId": "your access key",
  "secretAccessKey": "your secret key",
  "region": "ap-northeast-1"
}
```

``` javascript:api/controllers/FileController.js
const AWS = require('aws-sdk');

downloadFile: function (req, res) {
  File.findOne(req.params.id)
  .then((file) => {
    AWS.config.loadFromPath('./config/awsCredential.json');
    var s3 = new AWS.S3();
    var params = {
      Key: file.fd,
      Bucket: 'files-bucket'
    };
    s3.getObject(params, (err, data) => {
      if (err) {
        return res.serverError(err);
      }
      res.attachment(orderFile.filename);
      res.send(data.Body);
    });
  })
  .catch((err) => {
    res.serverError(err);
  });
},
```


# アップロード（skipper-s3）
Sailsはデフォルトでskipprerというbody parserを使っており、skipperのS3アップロード用のアダプターが提供されています。（[skipper-s3](https://github.com/balderdashy/skipper-s3)）
これを使うと、S3へのアップロードは簡単に実装できました。

`npm install skipper-s3 --save`
_※ Sailsではskipperはインストール済み_

``` javascript:api/controllers/FileController.js
uploadFile: function (req, res) {
  var file = req.file('file');
  file.upload({
    adapter: require('skipper-s3'),
    key: sails.config.custom.awsKey,
    secret: sails.config.custom.awsSecret,
    bucket: 'files-bucket'
  }, (err, uploadedFiles) => {
    if (err) {
      res.serverError(err);
    }
    sails.log("FILES:",uploadedFiles)
    res.ok();
  });
}
```

AWSの認証情報をsails.config.customに入れます。

```javascript:config/custom.js
const fs = require('fs');

const awsCredentialFile = 'config/awsCredential.json';
const awsCredential = JSON.parse(fs.readFileSync(awsCredentialFile, 'utf8'));

module.exports = awsCredential;
```



# 参考情報
- [Sails.js公式ドキュメント](http://next.sailsjs.com/documentation/concepts/file-uploads/uploading-to-s-3)
- [skipper-s3](https://github.com/balderdashy/skipper-s3)
Checkstyleの最新バージョンでMavenPluginを実行する

# はじめに
Maven-Checkstyle-Pluginのレポートを出力しようとしたところ、Errorになりました。

確認したらチェックに利用したgoogle_style.xmlの内容はCheckstyleのver7.7だったのですが、Maven-Checkstyle-Pluginは6.11.2のため実装されていないチェックがあったようです。

[HP](https://maven.apache.org/plugins/maven-checkstyle-plugin/examples/upgrading-checkstyle.html)の以下のページを参考にVersionを7.7にしたら、Maven-Checkstyle-Pluginでレポートが正常に出力できました。

***

※まだ詳細は調べていませんので分かり次第追記します。
Windowsでnodeのコマンドラインツールを作る時の注意点

Windowsでnodeのコマンドラインツールを作り、globalインストールして流してみると、引数が取得されず、首を傾げていた。
下記のように、nodeを指定して、jsファイルを直接いじれば正常に動作する。

```bat:a.bat
node cli.js hoge huga
```

上記では、hogeとhugaが引数として取得されるとする。
しかし、コマンドを直接うつと

```bat:b.bat
cli hoge huga
```

引数が認識されない。

## 調査

そこで、cliコマンドの中身(cli.cmd)を見てみると

```bat:cli.cmd
@%~dp0\.\node_modules\npm\bin\cli.js" %*
```

上記は、npmによって自動生成される。
Windowsのデフォルトでは、jsファイルを実行した場合、jscriptが使われる。
つまりnpmの自動生成によるcmdファイルが誤っていたことになる。

## 解決法

最初は、Windowsのjsファイルへのプログラムの紐付けを直せば解決すると踏んでいたが、そう簡単ではなかった。
node 〜.jsという形にする必要がありそうだった。
少し調べていると、下記のようにcli.jsの先頭に、`#!/bin/env node`をつければよかったようだ。

```js:cli.js
#!/bin/env node

// 以下ソース
```

これにより、npmの動作が変わるようになっているらしい。
IntelliJでAndroidの設定

# Androidの設定
Android Studioを使わずIntellijで開発を行いたい
## 公式
https://developer.android.com/studio/index.html
の`コマンドライン ツールのみ入手する`からmac版を落としてごにょごにょやったあとに
Configure->Project Defaults->Project Structure
からsdkを設定するとうまくいかない
`The selected directory is not a valid home for Android SDK`
![not a valid](https://qiita-image-store.s3.amazonaws.com/0/143914/27f76575-6bc0-900e-c6ba-e1d5f2bd3d34.png)

## 解決
```
$ brew cask install android-sdk
#export ANDROID_HOME=/usr/local/Caskroom/android-sdk/25.2.3を追加
$ vim ~/.bashrc
# launchctlってなんだろ？
$ launchctl setenv ANDROID_HOME /usr/local/Caskroom/android-sdk/25.2.3
$ sdkmanager "platforms;android-25"
```
## 参考
http://qiita.com/katsusuke/items/ec63ea7b83e0ed0a16e4
paiza POH hundred_thousand #_poh


- 基本的に、辞書を作って2分探索だと思う。
- ただ、この辞書を作る処理が割と重い。もう少し効率的にならないだろうか…。

```cpp:10.cpp
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
int main(){
	int M,N;
	scanf("%d%d",&N,&M);
	vector<long long>v(M),q(N),s;
	s.reserve(M*M/2);
	for(int i=0;i<N;i++)scanf("%lld",&q[i]);
	for(int i=0;i<M;i++)scanf("%lld",&v[i]);
	sort(v.begin(),v.end());
	long long z=*max_element(q.begin(),q.end())+999;
	for(int i=0;i<M;i++)for(int j=i;j<M;j++){if(v[i]*v[j]>z)break;s.push_back(v[i]*v[j]);}
	sort(s.begin(),s.end());
	for(auto &x:q)printf("%lld\n",*lower_bound(s.begin(),s.end(),x)-x);
}
```

```rb:10.rb
#!/usr/bin/ruby
N,M,*Q=`dd`.split.map &:to_i
V=Q.pop(M).sort
Z,*S=Q.max+999
M.times{|i|(i...M).all?{|j|V[i]*V[j]<Z&&S<<V[i]*V[j]}}
S.sort!
Q.map{|x|p S.bsearch{|e|e>=x}-x}
```

### 複数言語

他の言語は、systemなりexecなりでRubyを呼び出して解答しています…
CuteExecでKobito for WindowsがアクティベートできなかったのでAutoHotKeyスクリプト書いた


- Kobito for Windowsは二重起動すると2つ目が落ちる
- そんな時は[cuteExec](http://www.vector.co.jp/soft/win95/util/se382598.html)
- しかし、Kobitoに対して二重起動抑止はできてもアクティベートができない
    - プロセスが複数あるからかな？

## AutoHotKeyスクリプトで置き換えてみる

```ahk
; タスクバーをブリンクさせず強制的にアクティベート
#WinActivateForce
; 引数に実行ファイルのフルパスを与える（Bluewindからの使用を想定）
; http://usbcafe.blog111.fc2.com/blog-entry-103.html

ExePath = %1%
SplitPath, ExePath, ExeName

Process,Exist,%ExeName%
if ErrorLevel<>0
  WinActivate,ahk_pid %ErrorLevel%
else
  Run,%ExePath%
return
```

コンパイルしたexe→https://cl.ly/kEFq

## 使い方
コマンドラインランチャ等に「CuteExecALT.exeのパス kobito.exeのパス」のように登録

なお、`cuteExecALT.exe コマンドライン１ // コマンドライン２`には対応しておりません。

## 参考
- [「AutoHotkey」をホットキーランチャーとして使う方法｜USB Hacks \!｜USBメモリ徹底活用テクニック](http://usbcafe.blog111.fc2.com/blog-entry-103.html)
- [SplitPath \- AutoHotkeyJp](https://sites.google.com/site/autohotkeyjp/reference/commands/SplitPath)
Ubuntu 16.04でTeamviewerインストール

追記：2018年10月09日現在も同様に動作することを確認
追記：2017年11月14日 ちなみにUbuntu ServerではX Windowがないといったところでコケるので、そこらへん入れないと動作しません

# Ubuntu 16.04でTeamviewerインストール

## 環境確認
- バージョン確認

```bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
```

- アーキテクチャ

```bash
$ arch
x86_64
```

## Teamviewerダウンロード

```bash
$ wget https://download.teamviewer.com/download/teamviewer_i386.deb
```

## インストール
上記debファイルをdpkbでインストールしても、アーキテクチャが違う(Teamviewerはi386 32bit用)と怒られるので、以下のコマンドでi386アーキテクチャを追加

```bash
$sudo dpkg --add-architecture i386
```
アップデート

```bash
$sudo apt-get update
```

## インストール
```bash
$sudo dpkg -i teamviewer_i386.deb
dpkg: error processing archive teamviewer_i386.deb (--install):
 package architecture (i386) does not match system (amd64)
Errors were encountered while processing:
 teamviewer_i386.deb
```

このままでもいろいろと怒られるのでi386に関連するパッケージと一緒に再度インストールを実行

```bash
$sudo apt-get install -f
```

## 初回起動
このコマンドで初回起動するとGUIが立ち上がるので、あとはそれに従う

```bash
$ teamviewer
```
Proxy 経由で転送する StreamRelay.NET.exe

![図](http://rocketeer.dip.jp/sanaki/free/StreamRelay016.png)

「リモート」と呼称している側のストリームは、直接接続ではなくて、Proxy 経由で接続する事が可能

---
### SOCKS4(192.0.2.3:9050) 経由で接続する

自分自身は tcp/90 で待機。
192.0.2.2:90 に接続すれば、192.0.2.3:9050(socks4)経由で、192.0.2.4:80 へ転送される
`StreamRelay.NET.exe -LocalPort 90 -RemotePort 80 -RemoteHost 192.0.2.4 -RemoteProxy Socks4://192.0.2.3:9050`

---
### SOCKS4a(192.0.2.3:9050) 経由で接続する

自分自身は tcp/90 で待機。
192.0.2.2:90 に接続すれば、192.0.2.3:9050(socks4a)経由で、192.0.2.4:80 へ転送される
`StreamRelay.NET.exe -LocalPort 90 -RemotePort 80 -RemoteHost 192.0.2.4 -RemoteProxy Socks4a://192.0.2.3:9050`

---
### SOCKS5(192.0.2.3:9050) 経由で接続する

自分自身は tcp/90 で待機。
192.0.2.2:90 に接続すれば、192.0.2.3:9050(socks5)経由で、192.0.2.4:80 へ転送される
`StreamRelay.NET.exe -LocalPort 90 -RemotePort 80 -RemoteHost 192.0.2.4 -RemoteProxy Socks5://192.0.2.3:9050`

---
### WebProxy(CONNECT)(192.0.2.3:3128) 経由で接続する

自分自身は tcp/90 で待機。
192.0.2.2:90 に接続すれば、192.0.2.3:3128(CONNECT WebProxy)経由で、192.0.2.4:80 へ転送される
`StreamRelay.NET.exe -LocalPort 90 -RemotePort 80 -RemoteHost 192.0.2.4 -RemoteProxy CONNECT://192.0.2.3:3128`

---
### 多段Proxy

-RemoteProxy オプションも -LocalProxy も原則として多段にする事もできる

特に、-RemoteProxy オプションを多段に重ねる事で、通信路を多段Proxyにする事ができる

![図](http://rocketeer.dip.jp/sanaki/free/StreamRelay018.png)

自分自身は tcp/90 で待機。
192.0.2.2:90 に接続すれば、192.0.2.3:9050(socks5)→192.0.2.5:8080(CONNECT)経由で、192.0.2.4:80 へ転送される
`StreamRelay.NET.exe -LocalPort 90 -RemotePort 80 -RemoteHost 192.0.2.4 -RemoteProxy Socks5://192.0.2.3:9050 -RemoteProxy CONNECT://192.0.2.5:8080`

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
Proxy 経由で転送する StreamRelay.jar

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

![図](http://rocketeer.dip.jp/sanaki/free/StreamRelay016.png)

「リモート」と呼称している側のストリームは、直接接続ではなくて、Proxy 経由で接続する事が可能

---
### SOCKS4(192.0.2.3:9050) 経由で接続する

自分自身は tcp/90 で待機。
192.0.2.2:90 に接続すれば、192.0.2.3:9050(socks4)経由で、192.0.2.4:80 へ転送される
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 80 -RemoteHost 192.0.2.4 -Proxy Socks4://192.0.2.3:9050`

---
### SOCKS4a(192.0.2.3:9050) 経由で接続する

自分自身は tcp/90 で待機。
192.0.2.2:90 に接続すれば、192.0.2.3:9050(socks4a)経由で、192.0.2.4:80 へ転送される
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 80 -RemoteHost 192.0.2.4 -Proxy Socks4a://192.0.2.3:9050`

---
### SOCKS5(192.0.2.3:9050) 経由で接続する

自分自身は tcp/90 で待機。
192.0.2.2:90 に接続すれば、192.0.2.3:9050(socks5)経由で、192.0.2.4:80 へ転送される
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 80 -RemoteHost 192.0.2.4 -Proxy Socks5://192.0.2.3:9050`

---
### WebProxy(CONNECT)(192.0.2.3:3128) 経由で接続する

自分自身は tcp/90 で待機。
192.0.2.2:90 に接続すれば、192.0.2.3:3128(CONNECT WebProxy)経由で、192.0.2.4:80 へ転送される
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 80 -RemoteHost 192.0.2.4 -Proxy CONNECT://192.0.2.3:3128`

---
### SSH(PortForwarding)(192.0.2.3:22) 経由で接続する

自分自身は tcp/90 で待機。
192.0.2.2:90 に接続すれば、192.0.2.3:22(SSH-PortForwarding)経由で、192.0.2.4:80 へ転送される
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 80 -RemoteHost 192.0.2.4 -Proxy SSH://user:passwprd@192.0.2.3:22`

---
### 多段Proxy

-Proxy オプションは多段にする事もできる
![図](http://rocketeer.dip.jp/sanaki/free/StreamRelay018.png)

自分自身は tcp/90 で待機。
192.0.2.2:90 に接続すれば、192.0.2.3:9050(socks5)→192.0.2.5:8080(CONNECT)経由で、192.0.2.4:80 へ転送される
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 80 -RemoteHost 192.0.2.4 -Proxy Socks5://192.0.2.3:9050 -Proxy CONNECT://192.0.2.5:8080`

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
Jquery初心者がもぐら叩きゲームを作成する


Qiitaお初です。
プログラミングでの転職を目指しており、Jqueryから、まず勉強しております。


```javascript

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>もぐら</title>
</head>
<body>
<!--画面表示部分--------------------------------------------------->
<p>もぐら叩きだお</p>
<p>SCORE:</p>


<!--もぐら表示--->
<!-- <a href="javascript:;" id="mogu1"><img src="./pict/"></a>　-->
<!-- <a href="javascript:;" id="mogu1"><p>もぐら</p></a> -->

<!-- <a href="javascript:;" id="mogu1"><img src="./pict/mogura-illust8.png"></a> -->
<!--　<a href="javascript:;" id = "hit"><img class = "mogu1" src="./pict/mogura-illust8.png"></a>　-->
<!--テスト用コード-->
<a href="javascript:;" id = "hit1"><img class = "mogu1" src="./pict/mogura-illust7.png"></a>
<a href="javascript:;" id = "hit2"><img class = "mogu2" src="./pict/mogura-illust7.png"></a>
<a href="javascript:;" id = "hit3"><img class = "mogu3" src="./pict/mogura-illust7.png"></a>

<div id = "hit1">
  <button>
    <img class = "mogu1" src="./pict/mogura-illust7.png">
  </button>
</div>


<!--Jqueryの読み込み　--------------------------------------------->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
//TODO　まずはもぐらが表示されることを目標にする

//もぐらが出ている画像をセット
/*
var mogu_img = "./pict/mogura-illust7.png"

console.log(mogu_img);

$('.mogu1').attr({
  'src':mogu_img
});
*/

//もぐらランダム表示処理


//TODO　次にもぐらが叩かれて消えることを目標にする
//もぐらが叩かれている画像をセット
var　moguHit_img = "./pict/mogura-illust10.png"
//もぐらが隠れている画像をセット
var　hole_img = "./pict/mogura-illust8.png"
console.log(hole_img);

$('#hit1').click(function() {
  console.log(1);
  //もぐらが叩かれている画像を表示
  $('.mogu1').attr({
    'src':moguHit_img
  });
  //
  setTimeout(function(){
    $('.mogu1').attr({
      'src':hole_img
  })},500);
});

$('#hit2').click(function() {
  console.log(1);
  //もぐらが叩かれている画像を表示
  $('.mogu2').attr({
    'src':moguHit_img
  });
  //
  setTimeout(function(){
    $('.mogu2').attr({
      'src':hole_img
  })},500);
});

$('#hit3').click(function() {
  console.log(1);
  //もぐらが叩かれている画像を表示
  $('.mogu3').attr({
    'src':moguHit_img
  });
  //
  setTimeout(function(){
    $('.mogu3').attr({
      'src':hole_img
  })},500);
});


</script>
</body>
</html>
TypeScript でerror TS2304: Cannot find name 'ga'.

Google Analyticsにイベント送信するために ga('send') を使った時に、TypeScriptの型定義ファイルを設定していなかったので、当然エラーに。

```
error TS2304: Cannot find name 'ga'.
```

型定義ファイルはこれでした。
https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/google.analytics


yarnでインストール

```
yarn add @types/google.analytics
```

npmならこう

```
npm install @types/google.analytics
```

これで gaが問題なく使えるようになりました。


p.s.
型定義ファイルの場所を教えてくれた ひろましゃ( [@hiromasa](https://twitter.com/hiromasa) )さんに感謝。
PythonControlをインストールする

###目的
pythonの制御系設計ライブラリPython-Controlをインストールする。

###環境
Ubuntu14.04(x64) orUbuntu16.04(x64)


###Install

以下のコマンドでインストールする。

```
sudo apt-get install python-pip
sudo apt-get install gfortran
sudo apt-get install libblas-dev libatlas-dev liblapack-dev
pip install control
pip install slycot
```


###動作確認
ボード線図を書く
>emacs test.py
>chmod +x test.py
>./test.py

test.py

```
#!/usr/bin/env python
from control.matlab import *
from matplotlib import pyplot as plt
    
def main():
  num = [0, 0, 3] 
  den = [2, 1, 3]
  sys = tf(num, den) 
  bode(sys)    
  plt.show()

if __name__ == "__main__":
  main()

```

![Screenshot from 2017-05-24 01-08-37.png](https://qiita-image-store.s3.amazonaws.com/0/73020/055dbc4d-ee21-8fb3-46a8-52ccf8d08d3d.png)



###参考

python-control.ユーザーマニュアル
http://python-control.sourceforge.net/manual/
MBProgress HUDでアニメーションgifを使う


iOSのインジケータとしてお馴染みのMBProgressHUDですが、
customViewにアニメーションgifをどう使えば良いかわからなかったのでメモ。

1.ライブラリを追加

[MBProgressHUD](https://github.com/jdg/MBProgressHUD)
[FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage)

下記をPodfileに追記し、`pod install`します。

```Podfile
  pod 'MBProgressHUD', '~> 1.0.0'
  pod 'FLAnimatedImage', '~> 1.0'
```

2.MPBrogressHUDをカスタマイズして表示

```swift
// インジケータを作成
let hud = MBProgressHUD.showAdded(to: view, animated: true)

// imageViewにアニメーションgifの読み込み
let filePath = URL(fileURLWithPath: Bundle.main.path(forResource: "ファイル名", ofType: "gif")!)
let image = FLAnimatedImage(animatedGIFData: NSData(contentsOf: filePath)! as Data)
let imageView = FLAnimatedImageView()
imageView.animatedImage = image

// インジケータにアニメーションgifを読み込んだimageViewをセット
hud.mode = .customView
hud.customView = imageView

// インジケータの背景を透明化
hud.bezelView.color = UIColor.clear
hud.bezelView.style = .solidColor

// インジケータを表示
hud.show(animated: true)
```

これでOK。
VirtualBoxゲスト同士通信するための方法の一つ

###### OSX ホスト、10.1.1.0/24ネットワークをセットアップする、.254をゲートウェイとする。
```
% sudo ifconfig bridge1 create
% sudo ifconfig bridge1 10.1.1.254 netmask 255.255.255.0 up
% 
% ifconfig bridge1
bridge1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
	options=63<RXCSUM,TXCSUM,TSO4,TSO6>
	ether aa:20:66:90:b0:01 
	inet 10.1.1.254 netmask 0xffffff00 broadcast 10.1.1.255
	Configuration:
		id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
		maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
		root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
		ipfilter disabled flags 0x2
	media: <unknown type>
	status: inactive

# bridgeじゃなくてLoopbackの方ががよかったんですが、OSXでは簡単に作れなさそうのであるものを使用
# あと、Bridgeは上がっているIFとつなげないとポート上がらないので、そんなに意味はない、でもネットワーク分けられるのでそのまま使用
# もっと詳しく設定したい方はこちらを参考にしてください。https://apple.stackexchange.com/q/201183

# 本当はvboxnetなどの正式のアダプターが有効になるはずだが、自分のOSX(El Capitan)では動いてないので
（解決策はあるはずだが面倒なためできる方法で）
```

###### VirtualBox側でブリッジアダプターを追加
![aaaa.png](https://qiita-image-store.s3.amazonaws.com/0/109145/48ab5ec0-de48-b388-f762-3262d51c39cf.png)

###### debian ゲスト１(IP: 10.1.1.1)
```
# （一時的に有効）
% sudo ifconfig eth1 10.1.1.1 netmask 255.255.255.0 arp
# （再起動後も有効）
% sudo vi /etc/network/interfaces
auto eth1
iface eth1 inet static
address 10.1.1.1
netmask 255.255.255.0
gateway 10.1.1.254
% sudo service networking restart
```

###### debian ゲスト２(IP: 10.1.1.2)
````
# （一時的に有効）
% sudo ifconfig eth1 10.1.1.2 netmask 255.255.255.0 arp
# （再起動後も有効）
% sudo vi /etc/network/interfaces
auto eth1
iface eth1 inet static
address 10.1.1.2
netmask 255.255.255.0
gateway 10.1.1.254
% sudo service networking restart

# 疎通はping, ssh, tcpdumpなどで確認する
```
Railsで、中間テーブルのレコード数の多い順にレコードを並び替える方法（orderの中でcountを使用）

## 状況説明
「イベントを参加人数が多い順に表示したい」

言い換えると、中間テーブルにあるイベント毎のユーザーの数（参加人数）を数えて、それが多い順にEventを取得する。

これが以外と調べても出てこなかったので、記事にしておきます。

## DB構造
- eventテーブル
- userテーブル
- user_eventsテーブル

user_eventsテーブルでは、それぞれのidを外部キーとして持っています。
その他のカラムはご想像にお任せします。

ユーザーがイベントに参加するとuser_eventsテーブルに、

| id       |  user_id |    event_id    |
|-----------------|------------------|-----------------|
| 1             |   1   |        1        |
| 2             |   2   |        1        |
| 3             |   1   |        3        |
| 4             |   3   |        3        |

といった具合に登録されていきます。

## 結論
`Event.joins(:user_events).group(:event_id).order('count(user_id) desc')`

orderの中以外はActiveRecordを使用しています。あまり生のSQLがありすぎるのも嫌なので。

あとはインスタンス変数に入れるなりして、viewでいつも通りeachすればokです！
イベントの順番が参加人数の多い順になっているはず。

## ポイント
タイトルにもある通り、orderの中でcountを使用しています。
countと聞くと、Railsの

```
Event.all.count
=> 12345
```

の方を想像しがちです。
自分も最初はこれを使おうとしていました。

しかし、これだと **ただレコード件数を取得するクエリ** になってしまい、肝心のEventのデータなどが持ってこれなくなります。
そこで「orderの中でcountを使えばいいんじゃね？」と思った結果がこのコード。

こっちの書き方の方が良い！などのアドバイスお待ちしています！🙇

## 参考
[こちら](http://qiita.com/kumagi/items/017d66a96bd288f24dce)の記事などを拝読させていただきました。
ただ、こちらのようなSQLが実行された時の `AS hoge` を利用する方法は試行錯誤しましたが、うまくいきませんでした。
似たような手法の情報が多いのでもしかしたら、こちらの方向で実装したほうが良いのかもしれません。
Node.jsのインストールに失敗する時の解決策（No such file or directory）

nodebrewを使ってNode.jsのインストールに失敗した時の解決策です。

#Node.jsのインストールに失敗

HomebrewでNode.jsをインストールする場合、バージョン管理のできるnodebrewを使った方が便利です。

nodebrewからNode.jsをインストールするのはとても簡単。下のコマンドを実行するだけです。

```
$ nodebrew install-binary latest
```

と思ったら、下のようなエラーが出てしまいました。

```
Fetching: https://nodejs.org/dist/v7.10.0/node-v7.10.0-darwin-x64.tar.gz
Warning: Failed to create the file 
Warning: /Users/whoami/.nodebrew/src/v7.10.0/node-v7.10.0-darwin-x64.ta
Warning: r.gz: No such file or directory

curl: (23) Failed writing body (0 != 941)
download failed: https://nodejs.org/dist/v7.10.0/node-v7.10.0-darwin-x64.tar.gz
```

`No such file or directory`（そんなディレクトリはないよ！）と言ってますね。

#対処方法

そんなディレクトリを作ってあげましょう。

下記のコマンドを実行して、ディレクトリを作成します。

```
$ mkdir -p ~/.nodebrew/src
```

これでOK。

#もう一度トライ

それではもう一度。

下のコマンドで、Node.jsをインストール。

```
$ nodebrew install-binary latest
Fetching: https://nodejs.org/dist/v7.10.0/node-v7.10.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully
```

`Installed successfully`（インストール成功）となりました。

めでたしめでたし。