OmniAICreator/Qiita-1.07M huggingface dataset:
Mac OSX El Capitanでvirtualenv経由でboto3を動かす

AWSを操作するのにboto3+python3で作ってるが、いつも踏み台のLinuxServerから
操作していた。よく考えたら手元のMacbookでやればいいのに今頃気づいたのでメモ。
後で絶対忘れるから。
2系は2系で使いたいので、virtualenvを利用する。
'python3 ./hoge.py'とかやればPython3だけ入れれば良いのですが、
それもなぁ、という感じなので。

## 前提環境
Mac OSX El Capitan

## 手順

Homeblewインストール
https://brew.sh/index_ja.html

Python3インストール

```
$ brew install python3
```

virtualenvインストール
pipは標準で入ってるのでそのまま利用。

```
$ pip install virtualenv　
$ pip list
```

virtualenv環境作成
参考　(https://virtualenv.pypa.io/en/stable/userguide/)

```
$ mkdir work_python3 
$ virtualenv -p python work_python3
$ cd work_python3
$ source ./bin/activate
```

今回の作業ではpython3.6がインストールされた

必要なツールをインストール　　

標準でpip,pip3,pip3.6が付属してるけど中身は全部一緒なのでどれでもよし。

```
$ pip install awscli
$ pip install boto3
```

動作確認
ひとまず最新のAmazonLinuxのAMIIDを引っ張ってくるテストコード

```get_ami.py
#!/usr/bin/env python

import boto3
import re
from operator import itemgetter

pattern = re.compile('amzn-ami-hvm-*')

ec2_client = boto3.client('ec2')

response = ec2_client.describe_images(
    Owners = ['amazon']
)
pattern = re.compile('amzn-ami-hvm-.*-ebs')

image_id = sorted(
    [ item for item in response['Images']
      if item.get('Name', None) and pattern.search(item['Name']) ]
#, key=itemgetter(u'CreationDate'))
, key=itemgetter(u'CreationDate'))[-1]['ImageId']

print('AMI: ', image_id)
```

```
$ ./get_ami.py
$ AMI ami-b3d2abd4

```

あとはgitやらと連携してごりごり作業してきますか。
[Ruby]mecabを使ってみた（形態素解析）

# Macにmecabをインストール
Ruby: 2.3.3
os: OSX 10.12.3 (Sierra)

SentOSの場合は[この記事](http://qiita.com/xkumiyu/items/50e449235985ca1b0271)を参考にしてください。

### mecabと辞書ファイルをmacにインストール
```Tarminal
$ brew update
$ brew install mecab mecab-ipadic
```

### gemをインストール
```Tarminal
$ gem install mecab
```

### 使ってみる
```irb
>> require 'mecab'
=> true
>> tagger = MeCab::Tagger.new
=> #<MeCab::Tagger:0x007fb5ff0a2b40 @__swigtype__="_p_MeCab__Tagger">
>> puts tagger.parse('太郎はこの本を二郎を見た女性に渡した。')
太郎	名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
この	連体詞,*,*,*,*,*,この,コノ,コノ
本	名詞,一般,*,*,*,*,本,ホン,ホン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二	名詞,数,*,*,*,*,二,ニ,ニ
郎	名詞,一般,*,*,*,*,郎,ロウ,ロー
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見	動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性	名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し	動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
=> nil
```

# natto(Gem)を使うと簡単に書ける
nattoはmecabを扱いやすくしてくれるGemです。
### nattoをインストール
```Tarminal
$ gem install natto
```
### 使ってみる
```irb
>> require 'natto'
=> true
>> nm = Natto::MeCab.new
=> #<Natto::MeCab:0x007fa61891a9e0 @model.........
>> puts nm.parse('太郎はこの本を二郎を見た女性に渡した。')
太郎	名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
この	連体詞,*,*,*,*,*,この,コノ,コノ
本	名詞,一般,*,*,*,*,本,ホン,ホン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二	名詞,数,*,*,*,*,二,ニ,ニ
郎	名詞,一般,*,*,*,*,郎,ロウ,ロー
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見	動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性	名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し	動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
=> nil
```
`surface`: 形態素の対象要素
`posid`: 辞書のid
`is_eos?`: EOS（End Of String）かどうかの判定

```irb
>> nm.parse('太郎はこの本を二郎を見た女性に渡した。') do |n|
?> puts "#{n.surface}\tpart-of-speech id: #{n.posid}" if !n.is_eos?
>> end
太郎	part-of-speech id: 44
は	part-of-speech id: 16
この	part-of-speech id: 68
本	part-of-speech id: 38
を	part-of-speech id: 13
二	part-of-speech id: 48
郎	part-of-speech id: 38
を	part-of-speech id: 13
見	part-of-speech id: 31
た	part-of-speech id: 25
女性	part-of-speech id: 38
に	part-of-speech id: 13
渡し	part-of-speech id: 31
た	part-of-speech id: 25
。	part-of-speech id: 7
=> nil
```
要素をループで回して処理する場合は、enum_parseメソッドを使うことで効率的に処理ができます。
下記のノードフォーマットオプションでループの際に使う属性をカスタマイズできます。
`%m`: 形態素の対象要素
`%f[0]`: 要素名
`%f[7]`: カナ

```irb
>> nm = Natto::MeCab.new('-F%m\t%f[0]\t%f[7]\n')
=> #<Natto::MeCab:0x007ff11a1bc318 @model=...........
>> enum = nm.enum_parse('太郎はこの本を二郎を見た女性に渡した。')
=> #<Enumerator: #<Enumerator::Generator:0x007ff11986f4e0>:each>
>> enum.next
=> #<Natto::MeCabNode:0x007ff11986d438 @pointer=#<FFI::Pointer address=0x007ff11a1e2c30>, stat=0, @surface="太郎", @feature="太郎	名詞	タロウ">
>> enum.peek
=> #<Natto::MeCabNode:0x007ff11909b610 @pointer=#<FFI::Pointer address=0x007ff11a1e2d80>, stat=0, @surface="は", @feature="は	助詞	ハ">
>> enum.rewind
=> #<Enumerator: #<Enumerator::Generator:0x007ff11986f4e0>:each>
>> enum.each {|n| puts n.feature unless n.is_eos? }
太郎	名詞	タロウ
は	助詞	ハ
この	連体詞	コノ
本	名詞	ホン
を	助詞	ヲ
二	名詞	ニ
郎	名詞	ロウ
を	助詞	ヲ
見	動詞	ミ
た	助動詞	タ
女性	名詞	ジョセイ
に	助詞	ニ
渡し	動詞	ワタシ
た	助動詞	タ
。	記号	。
=> nil
>>
```

## 参考リンク
https://github.com/markburns/mecab
https://github.com/buruzaemon/natto
http://watarisein.hatenablog.com/entry/2016/01/31/163327
MySQLのTIME型をGoの*time.Time型で扱おうとたらscan error on column


### 前提
DBはMySQL。
ORMはgorpを使用している。
DNSには`?parseTime=true`が入ってる。

### 問題
テーブルにDATE型（日付）とTIME型（時刻）のカラムがそれぞれあって。

```sql
CREATE TABLE `post` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `date` date DEFAULT NULL,
  `time` time DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

Goのstructでは`Date`,`Time`の両方とも`*time.Time`型にしている。

```go
type Post struct {
	Id   int64
	Date *time.Time
	Time *time.Time
}
```

gorpを使って、DBから取得したデータをPost(Goのstruct)に格納するわけだ。

```go
query := "SELECT * FROM post"
var list []Post
_, err := DbMap.Select(&list, query)
```

したら`Scan error on column`と怒られる。

```
sql: Scan error on column index 1: unsupported Scan, storing driver.Value type []uint8 into type *time.Time
```

### 対処法
SQLの方を修正。 `ADDTIME`で日付と時刻を足しあわせ、DATETIME型に`CAST`する。

```sql
SELECT id, date, CAST(ADDTIME(date, time) AS DATETIME) datetime FROM post
```

他にもっと良い方法があれば教えてください。

### 参考
[Go言語のMySQLドライバでTIME型のカラムのデータを受け取りたいとき](http://hacknote.jp/archives/19620/)
[Golangで`Scan error`が出た時の対応](http://qiita.com/kotamat/items/e6dd5806e52939d28043)
Pythonでロギングをきちんと

はじめに
--------------------

自分用のめもです。

コード
--------------------
```py:main.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import othermodule

LOG_LEVEL = 'DEBUG'

if __name__ == '__main__':

    logging.basicConfig(
        level=getattr(logging, LOG_LEVEL),
        format='%(asctime)s [%(levelname)s] %(module)s | %(message)s',
        datefmt='%Y/%m/%d %H:%M:%S',
    )

    # test
    logger = logging.getLogger(__name__)
    logger.critical('critical message')
    logger.error('error message')
    logger.warning('warning message')
    logger.info('info message')
    logger.debug('debug message')
    othermodule.test()
```

```py:othermodule.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging

def test():
    _logger = logging.getLogger(__name__)
    _logger.critical('critical message')
    _logger.error('error message')
    _logger.warning('warning message')
    _logger.info('info message')
    _logger.debug('debug message')
```

```shell-session
$ python main.py
2017/01/01 00:00:00 [CRITICAL] main | critical message
2017/01/01 00:00:00 [ERROR] main | error message
2017/01/01 00:00:00 [WARNING] main | warning message
2017/01/01 00:00:00 [DEBUG] main | info message
2017/01/01 00:00:00 [INFO] main | debug message
2017/01/01 00:00:00 [CRITICAL] othermodule | critical message
2017/01/01 00:00:00 [ERROR] othermodule | error message
2017/01/01 00:00:00 [WARNING] othermodule | warning message
2017/01/01 00:00:00 [DEBUG] othermodule | info message
2017/01/01 00:00:00 [INFO] othermodule | debug message
```

説明その他
--------------------

- `level=getattr(logging, LOG_LEVEL)` configなどから取得した文字列からログレベルをセットすることを想定
- `logging#debug` とか使っちゃうとモジュールで分けられずルートロガーにぶっこまれるので、ちゃんと `logging#getLogger` で適切なロガーを取ってくる
- `logging#basicConfig` でルートロガーを設定すると、importで使っているモジュールのロガーも一括で設定できる
- `logging#basicConfig` しないと `StreamHandler` (標準出力にログを出力するハンドラ)が生成されず、コンソール出力されない

| 属性 | 説明 |
|:--|:--|
| `%(asctime)s` | `datefmt` に従うログ生成時間 |
| `%(levelname)s` | ログレベルの名前 |
| `%(module)s` | モジュール名 |
| `%(message)s` | ログメッセージ |
CloudWatchでセットしたアラームの通知テストをする。

# はじめに
CloudWatchでアラームを設定した際、ちゃんとアクションが実行されるのかテストしたくなりますよね？
それが定時通知ならまだしも、エラー通知とかだと設定したあとで結局エラー発生しないと(またはさせないと)確認できないのはちょっと。。。
そんな時にaws-cliを利用すれば簡単に通知テストを行うことができますー。


# あらかじめ
今回は事前にアラームの設定はできている状態です。
![cloudwatch-alarm_test01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/e38e7646-ddbd-a860-a541-484730a5f14a.png)
「*Error-CheckSnapshotLog*」という名前のアラームです。
直接は関係ありませんが、内容としては毎日Lambdaで取得しているスナップショットが失敗した時に通知されます。
普段は**不足(INSUFFICIENT_DATA)**となっていますが、なんらかの理由で*Lambda*の実行が失敗すると**Error**を吐くのでそれを検知したら指定したメールアドレスへ通知される仕組みです。

# 実践
ということで、このアラームが通知されるかどうかテストします。

```bash:コマンド
$ aws cloudwatch set-alarm-state --alarm-name "Error-CheckSnapshotLog" --state-value ALARM --state-reason "alarm-test"
```
このたった１行で完了ですw

| オプション        | 説明     |
|:---------------|:--------|
| --alarm-name   | アラーム名 |
| --state-value  | ステータス |
| --state-reason | 説明     |

これだと簡単に終わっちゃうので一応説明。
今回は"*Error-CheckSnapshotLog*"のステータスをaws-cliで強制的に**INSUFFICIENT_DATA**から**ALARM**というステータスに変更しています。
今回はテスト実行なので*--state-reason*を"*alarm-test*"としています。


# 結果
それではちゃんとCloudWatchのアラーム通知はされているのでしょうか？
![cloudwatch-alarm_test02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/18e1f6fa-07eb-8197-8972-c81f7521617d.png)



どうやらちゃんと通知ができたみたいです。
これで通知されないことが幸せなアラームに対しての通知テストができました。


# おわりに
CloudWatchアラームを設定したけど「これってちゃんと通知されるのかな？」と不安になってしまった時に便利なコマンドですね！
ただ、、、このコマンドってあくまで**ステータス変更**を行うだけなので、実際の条件が正しいかまでは。。。というオチがあったりもw
RDSにphpMyAdminで接続するが#2005エラーが出てしまう

何度やっても接続できなかった。
後回しにしてましたが、原因がわかったので記載。

![1702162310.png](https://qiita-image-store.s3.amazonaws.com/0/164442/e6079865-ec68-7b48-672e-84e1bce6758e.png)

間違った設定をしてました。

```
$cfg['Servers'][$i]['host'] = '***.ap-northeast-1.rds.amazonaws.com:3306';
```

ここはこうではなくて


```
$cfg['Servers'][$i]['host'] = '***.ap-northeast-1.rds.amazonaws.com';
$cfg['Servers'][$i]['port'] = '3306';
```

こうです。
イージーなミスです。
Windowsで ssl_connect returned=1 errno=0 state=error certificate verify failed　エラーの対処方法

google Custom Searchで検索結果を得たいをおもったら、SSLエラーが発生。
なんとか対処方法を見つけたので備忘録として残します。


*----追記----*　
PCで同じエラーに遭遇しました。以下手順を試すもエラー改善せず、2時間ほどはまりました。。
色々試したあげく、以下手順のあとにPC再起動が必要だったようです。


##エラー発生時の環境
- Windows 8
- Ruby2.3
- rails 4.1.16

##対処方法
エラー理由としてはどうもSSL証明書が見つからない？検証できない？といった内容らしい。
なので、証明書ファイルをDLして、パスを通して上げれば使えるようになりました。

###手順

####**① 証明書をダウンロード**
以下URLの証明書(cacert.pem)を任意の場所に保存。
私の場合は C:\rails_book/ に保存。

[http://curl.haxx.se/ca/cacert.pem](http://curl.haxx.se/ca/cacert.pem)

<br>

####**⓶ 環境変数に設定**
環境変数に以下を設定。私はコマンドでしました。

```
setx SSL_CERT_FILE "C:\rails_book\cacert.pem"
```
<br>

####**③ コマンドプロンプト全部終了して、再起動しrails sを実行**
開いているコマンドプロンプトは全部閉じましょう。
私はAtomで開いていたコマンドプロンプトを閉じ忘れて一度失敗しました ）笑

全部閉じたら再度、コマンドプロンプト起動し

```
rails s
```

でうまく検索結果を得れました！
FPGAでフィボナッチを計算してみる

フィボナッチをFPGAで書いてみた
http://qiita.com/kazunori279/items/70030eaa08fe632b6b49
こちら方の記事をみて、高位合成ではなく、ガチのRTLでフィボナッチ数を計算したらどれぐらいの速さでできるのかやってみた。

#ソースコード
とりあえずこんな感じ？
n_inに0～127をセットしてstartを'1'にすると計算を開始して、
計算が終わるとend_flgが’1’になってresultに計算結果が出力される。


```VHDL:fib.vhd
LIBRARY ieee;
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity fib is

	port(
		clk : in std_logic;					
		rst   : in std_logic;

		n_in  : in std_logic_vector(6 downto 0);
		start : in std_logic;
		
		end_flg : out std_logic;
		result : out std_logic_vector(88 downto 0)
		);	

end fib;

architecture RTL of fib is

	signal n_m1	: std_logic_vector(88 downto 0);
	signal n_m2	: std_logic_vector(88 downto 0);
	signal counter : std_logic_vector(6 downto 0);
	signal end_flg_buff : std_logic;
	
begin

	process(clk,rst)begin
		if(rst = '0')then
			n_m1 <= CONV_STD_LOGIC_VECTOR(1,89);
			n_m2 <= CONV_STD_LOGIC_VECTOR(1,89);
			counter <= "0000010";
		elsif(clk'event and clk = '1')then
			if(start = '0')then
				n_m1 <= CONV_STD_LOGIC_VECTOR(1,89);
				n_m2 <= CONV_STD_LOGIC_VECTOR(1,89);
				counter <= "0000010";
				end_flg_buff <= '0';	
			else
				if(counter < n_in)then
					n_m1 <= n_m1 + n_m2;
					n_m2 <= n_m1;
					counter <= counter +1;
				else
					end_flg_buff <= '1';
				end if;
			end if;
		end if;
	end process;
	
	result <= n_m1;
	end_flg <= end_flg_buff;

end RTL;
```

#論理合成

iCE40-HX8K Breakout Board
http://www.latticesemi.com/Products/DevelopmentBoardsAndKits/iCE40HX8KBreakoutBoard.aspx
![sntPl5us.jpg](https://qiita-image-store.s3.amazonaws.com/0/162570/4ca94e5a-edd6-a06b-cd44-b63ef05517f0.jpeg)

手持ちで持ってるこれをターゲットに論理合成してみる。
とりあえず、ピンアサインとか制約とかは全くせずに。
ソフトはこんな感じで。
![puro.png](https://qiita-image-store.s3.amazonaws.com/0/162570/4ac996ae-f187-062f-95ad-495ea0180d86.png)

##結果
###リソース
    Total Logic Cells: 399/7680
        Combinational Logic Cells: 213      out of   7680      2.77344%
        Sequential Logic Cells:    186      out of   7680      2.42188%
        Logic Tiles:               65       out of   960       6.77083%

ほぼsignal宣言したDFFって感じ。

###動作周波数
Clock Summary 
Number of clocks: 1
Clock: fib|clk | Frequency: 77.61 MHz | Target: 100.00 MHz

77MHzまで動くっぽい。意外とはやいぞ。

#シミュレーション
適当にテストベンチ作って付属のActive-HDLでRTLシミュレーションしてみる。
クロック周波数は50MHｚ
![sim.png](https://qiita-image-store.s3.amazonaws.com/0/162570/278f8696-f171-d0ff-d542-f2e2455b713f.png)
n=65で27777890035288
１ずれているから修正かなこれ。
計算は63クロックの1.26usで完了している。

#このあと
とりあえず、ソースの修正とか、実際にFPGAにダウンロードして試してみたいところ。
あとは、回路の最適化もやろうかと。
今日はここまで
Javaプログラマが初めてKotlinのソースを読んだときに目が滑る箇所まとめ

ここ2ヶ月くらいずっとKotlinを触ってたせいですっかり忘れてたけど、Javaの瞳を持つ戦士(プログラマ)が初めてKotlinを読むと結構**目が滑る**のでした。いくらKotlinが素晴らしいJava連携力を持っているとしても、いざ読むときにいつもの読み方ができないと「なんだか難しそう！やっぱり慣れたJavaがいい！」と思ってしまいがちです。

ここでは、Kotlinを読む上で**Javaの読み方をすると目が滑る**要素をまとめておきます。これからKotlinのコードを読む人にはもしかしたら役に立つかもしれません。

# 変数宣言は 変数名: 型名

```java:Java
Int x = 0;
SomeClass method1(int i, String s, Date date){ ... }
```
```kotlin:Kotlin
val x: Int = 0
fun method1(i: Int, s: String, date: Date) : SomeClass { ... }
```
いわゆるScalaスタイルというやつです。Swiftもこの書き方をしていますね。
CやJavaに慣れている人は初見だと読みづらく感じると思います。

対処法：**慣れる**

# 変数宣言のvalとvarが区別しづらい

```kotlin:Kotlin
val x = 0 // 再代入不可
var y = 2 // 再代入可

x = 1 // コンパイル時エラー
y = 3 // OK
```
val(value)は再代入不可、var(variable)は再代入可。Scalaと同じ宣言方法ですが、何を考えたのか**一字違い**です。上のコードを見ても分かる通り、コードにするとすごく判別しづらいです。Viとか使ってると地獄です。

とはいえ、実はAndroid Studio (IntelliJ) のデフォルトでは**var宣言された変数名には常にアンダーラインが引かれる**ため、このルールを知っているなら判別は容易でしょう。注意を要する方(=var)に下線がついていると覚えると良いと思います。他のIDEでどうなっているかはわかりません。

対処法：**アンダーラインの有無で判別**

# 変数に型が書いてなくてキモい
型なし変数にアレルギーを持っている人は多いと思います。ご安心ください。型が書いてない変数にもちゃんと型はついてます。
Kotlinコンパイラは型推論機能を持つため、変数宣言時に型宣言を省略した場合でも自動で型宣言を補ってくれます。ここで重要なのは**型宣言を補うのはコンパイラ**だということです。実行時の状態によってどの型がつくか変化したりはしませんし、そういうコードは書けません。
なお、普通型推論器というものは候補となる型のうち最小のものを返すため、上記のコードでyにInt?やらAnyやらがついたりはしません。「初期値は実値だけど、処理が進むとnullが代入され得るよ」という場合は、きちんとyがInt?であることを宣言しましょう。

対処法：変数定義の右辺を見る。右辺の式の型がそのまま左辺の変数の型になる。

# インスタンス宣言でnewを書かない

```java:Java
SomeClass obj = new SomeClass(10, "aaa", new Date());
```
```kotlin:Kotlin
val obj = SomeClass(10, "aaa", Date())
```
Kotlinではインスタンスを作るときにnewを書きません。Javaに慣れていると「クラス名の前のnewの有無」でコンストラクタ利用なのかgetInstance()的なもの利用なのかを判別したりするので、そういう人は混乱しそうです。
識別子が減る分コードは簡潔になるので、読みやすさ自体はプラマイゼロな気もします。あと(new ナントカ(...))ってわざわざカッコで括らなくて良いし。

# クラス宣言がコンストラクタ宣言を兼ねる

```java:Java
class User {
    String name;
    String email;

    public User(String name, String email){
        this.name = name;
        this.email = email;
    }

    ...
}
```
```kotlin:Kotlin
class User(val name: String, val email: String){
    ...
}
```

Kotlinのコンストラクタ(正確にはプライマリコンストラクタ)は以下の点でjavaと異なっています。

* 引数の宣言はクラス宣言のクラス名直後に書かれる。
* 引数名にval/varを付けることで、**同名のプロパティをそのまま宣言できる**。

これらの特徴はコード量削減に寄与しているのですが、Javaに慣れている人、特に「メンバ変数はクラスの先頭に列挙する」文化に慣れている人は混乱しそうです。

対処法：読み手と言うより書き手のメソッドなのですが、Javaのときと同じ気持ちで読んでもらうために改行とインデントを工夫すると良いです。

```kotlin:Kotlin
class User (
    val name: String,
    val email: Stirng
) {
    ...
}
```

# やたらびっくりしてて目がチカチカする

```java:Java
Int result = obj.method1().method2().method3();
```
```kotlin:Kotlin
val result : Int = obj!!.method1()!!.method2()!!.method3()!!
```

コードがやたらびっくりするのは**nullable処理のアンチパターンど真ん中**なのでむしろコードの方に問題があります。
あなたのjavaコードをkotlinに自動変換したときにこうなったなら、むしろ「こんなにnull-unsafeなコードだったのか、見つかってよかった」と喜びましょう。

---

他にも思いついたら逐次更新しようと思います。
時系列データをプロットしてmatplotlib OverflowErrorがでたとき

ちょっとはまったのでメモ

#したいこと
Unixtimeで時刻付されたセンサデータを横軸時刻，縦軸センサデータでプロットしたい．

いつも通り

```python
import pandas as pd
import pandas.tseries.offsets as offsets

Data = pd.read_csv('data.csv')
Data['timestamp'] = pd.to_datetime(Data['timestamp'], unit="ms")
Data['timestamp'] += offsets.Hour(9)
```
でデータを読み込み，

```python
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1) 
x = Data['timestamp']
y = Data['sensor']
ax.plot(x, y)
```
としたところ．．．

#エラーの出現
```python
matplotlib OverflowError: signed integer is greater than maximum
```

`timestamp`が，UNIXTIMEにミリ秒まで含んだ形式だったので，OverflowErrorとなったようです．

#解決策

http://stackoverflow.com/questions/11376080/plot-numpy-datetime64-with-matplotlib
に書いてあるとおりです．

```python
x = Data['timestamp'].astype(datetime)
```
のように，`.astype(datetime)`で型を変換すると描画されました．めでたしめでたし．
GitHubのClone数をAPIで取得する

GitHubは、Clone数を「Graphs」>「Traffic」から確認できます。

![Traffic_·_naitwo2_mysettings.jpg](https://qiita-image-store.s3.amazonaws.com/0/34809/4d881746-1bdf-a6a8-8866-23b680af32de.jpeg)

APIでも取得できるようになった（前からできた？）ので、取得方法をメモします。

## トークンの取得

まず、APIで使用するトークンを取得します。 
手順は以下の記事がとてもわかり易いです。

<a class="embedly-card" href="http://qiita.com/kz800/items/497ec70bff3e555dacd0">GitHub「Personal access tokens」の設定方法 - Qiita</a><script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script>


## Clone数を取得する

以下はcurlコマンドでAPIを叩くときの記述方法です。 

``` sh:コマンド
curl -H "Authorization: token 【取得したToken】 " https://api.github.com/repos/【owner】/【repository】/traffic/clones
```

```sh:実行結果
{
  "count": 10,
  "uniques": 7,
  "clones": [
    {
      "timestamp": "2017-02-06T00:00:00Z",
      "count": 2,
      "uniques": 2
    },
    {
      "timestamp": "2017-02-07T00:00:00Z",
      "count": 3,
      "uniques": 2
    },
    {
      "timestamp": "2017-02-08T00:00:00Z",
      "count": 1,
      "uniques": 1
    },
    {
      "timestamp": "2017-02-09T00:00:00Z",
      "count": 2,
      "uniques": 1
    },
    {
      "timestamp": "2017-02-13T00:00:00Z",
      "count": 1,
      "uniques": 1
    },
    {
      "timestamp": "2017-02-15T00:00:00Z",
      "count": 1,
      "uniques": 1
    }
  ]
}
```

<br>
デフォルトは日単位の情報が取得できます。 
URL末尾に以下の「per=week」を付加することによって、週単位に変更できます。

`**traffic/clones?per=week`

```sh:実行結果(Week)
{
  "count": 10,
  "uniques": 7,
  "clones": [
    {
      "timestamp": "2017-02-06T00:00:00Z",
      "count": 8,
      "uniques": 5
    },
    {
      "timestamp": "2017-02-13T00:00:00Z",
      "count": 2,
      "uniques": 2
    }
  ]
}
```


WebUI、APIともに14日間の情報しか保存されないので、今度グラフ化して履歴を追えるようにしたいと思います。


## Releaseのダウンロード数を取得する（おまけ）

Releaseのダウンロード数等を取得するには以下の記述になります。 
※ダウンロード数以外の情報も表示されます


``` sh:コマンド
curl https://api.github.com/repos/【owner】/【repository】/releases
```
cronがうまく動かないときの調査

cronを使って定期実行させようとしてうまくいかない場合に、"/var/log/cron.log" には実行ログしかのりません。
そのためコマンドの実行結果をファイルに出力させる方法として参考までに以下があります。

##①標準出力
標準出力だけを出す場合
/path/script.sh 1> /path/exec.log

##②エラー出力
エラー出力だけ出す場合
/path/script.sh 2> /path/error.log

##③標準出力とエラー出力その1
両出力を一つのファイルに出す場合
/path/script.sh > /path/both.log 2>&1

##④標準出力とエラー出力その2
それぞれの出力を別々のファイルに出す場合
/path/script.sh 1> /path/exec.log 2> /path/error.log

cron結果が上手くいったかどうかを確認するためにはエラーログを含めて出したほうが確実です。
今回はログ調査ということで、特に使い分ける必要もないため③で実行することにしました。


```bash
$ crontab -l
* * * * * sh -x /path/script.sh > /path/error.log 2>&1

```

結果として、以下のログが確認できました。

```bash
$ cat /path/error.log
:
sudo: sorry, you must have a tty to run sudo
:
```

上記については以下を参考に回避手段をとることでうまく動くようになりました。
http://tweeeety.hateblo.jp/entry/2015/03/03/111116
iOSミュージックアプリ備忘録

iOSのミュージックアプリを作っているので、その備忘録

環境:xcode8.2

参考サイト
[[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(MPMusicPlayerController使用) – nackpan Blog](http://nackpan.net/blog/2015/09/14/ios-swift-musicplayercontroller/)
[【swift】音楽ピッカー、MPMediaPickerController を使う時にハマったこと - 父ロボの開発覚書](http://titirobo-develop.hatenablog.jp/entry/2016/09/28/000000)

① Storyboadで画面レイアウト作成
![スクリーンショット 2017-02-16 22.45.06.png](https://qiita-image-store.s3.amazonaws.com/0/50991/f44d40e4-a448-434f-24a9-ed675623dad9.png)

<br />
② ピッカー周り
![スクリーンショット 2017-02-16 22.47.51.png](https://qiita-image-store.s3.amazonaws.com/0/50991/88053a77-5c02-e6eb-ac85-c1925bb25da5.png)

swiftのバージョンの関係で、参考サイト通りではコンパイルエラーが発生
presentViewController ⇛ present
dismissViewControllerAnimated ⇛ dismiss

③ info.plistの修正
メディアピッカーを使用するためには「info.plost」を修正する必要がある。
これのせいでハマってました。。。
![スクリーンショット 2017-02-16 22.56.04.png](https://qiita-image-store.s3.amazonaws.com/0/50991/f642c32d-527b-e0b0-74ff-86b2672e2b64.png)

とりあえず、今日はこのへんまで。
Android(Java)でのOpenCVを用いたソーベルフィルタ

#はじめに
AndroidでOpenCV3.2を利用してソーベルフィルタを実装した。
JavaのOpenCVでは思うようにできない部分がいくつかあったのでメモ

#実行環境など
##ソフトウェア
Windows 10 Home 64bit
Android Studio 2.2.3
OpenCV 3.2
##デバッグ端末
Nexus 5x (Android 7.1.1)

#OpenCVの準備
以下参照
[OpenCV for AndroidをAndroid Studioに導入するメモ](http://qiita.com/kodai100/items/6c9e8a34d0714913c017)

#ポイント
ただの一方向のソーベルフィルタだとつまらないので、グレースケールに変換してからフィルタ処理を行わずあえてRGB成分に分割してそれぞれの色でX方向とy方向のフィルタ処理を行い二乗平均平方根をとった後で、三つの成分の値なかでの最大値を最終的な画素値とした。

#メモ
C++のOpenCVだと
```
matC = matA +matB;
```
みたいな書き方ができるけどJavaのOpenCVではできない

#コード
```
    private Bitmap sobel(Bitmap bitmap) {
        bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
        Mat mat = new Mat();
        Mat matR = new Mat();
        Mat matG = new Mat();
        Mat matB = new Mat();
        Utils.bitmapToMat(bitmap, mat);

        Core.extractChannel(mat, matR, 0);
        myFiltering(matR);

        Core.extractChannel(mat, matG, 1);
        myFiltering(matG);

        Core.extractChannel(mat, matB, 2);
        myFiltering(matB);

        matMax3(matB, matG, matR, matB);

        Utils.matToBitmap(matB, bitmap);
        return bitmap;
    }

    private void myFiltering(Mat src){
        Mat matX = new Mat();
        Mat matY = new Mat();

        Imgproc.GaussianBlur(src, src, new Size(3, 3), 0, 0);
        Imgproc.Sobel(src, matX, src.depth(), 0, 1);
        Imgproc.Sobel(src, matY, src.depth(), 1, 0);
        matRMS(matX, matY, src);
    }

    private void matRMS(Mat src1, Mat src2, Mat dst) {

        int size = (int) (src1.total() * src1.channels());
        byte[] temp1 = new byte[size];
        byte[] temp2 = new byte[size];
        byte[] temp3 = new byte[size];
        src1.get(0, 0, temp1);
        src2.get(0, 0, temp2);

        for (int i = 0; i < size; i++) {
            temp3[i] = (byte)Math.sqrt((temp1[i] * temp1[i] + temp2[i] * temp2[i]) / 2);
        }

        dst.put(0, 0, temp3);
    }

    private void matMax3(Mat src1, Mat src2, Mat src3, Mat dst) {

        int size = (int) (src1.total() * src1.channels());
        byte[] temp1 = new byte[size];
        byte[] temp2 = new byte[size];
        byte[] temp3 = new byte[size];
        byte[] temp4 = new byte[size];
        src1.get(0, 0, temp1);
        src2.get(0, 0, temp2);
        src3.get(0, 0, temp3);

        for (int i = 0; i < size; i++) {
            temp4[i] = chooseBig(chooseBig(temp1[i], temp2[i]), temp3[i]);
        }

        dst.put(0, 0, temp4);
    }

    private byte chooseBig(byte a, byte b) {
        if(b > a) {
            return b;
        }else {
            return a;
        }
    }
```

#実機での実行結果
![Screenshot_20170216-223854-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/165966/f78113be-4dd4-e3bb-15bd-73540ce52d16.jpeg)

#GitHubのリンク
GUIの都合上AsyncTaskを用いて実装した。
[こちら](https://github.com/johejo/SobelFilter)

#apk
ビルドしたapkのリンク
[こちら](https://drive.google.com/file/d/0B1W9yZQcxJ-ER3EzSDdoWkl2M2M/view?usp=sharing)
※Android端末にOpenCV Managerのインストールが必要です。インストールされていない場合はGoogle Play Storeへ飛ばされます
※インストールは自己責任で

#参考
[OpenCVとVisual C++による画像処理と認識（７）----- いろいろなエッジ検出フィルタを使用する ----- ](http://ishidate.my.coocan.jp/opencv_7/opencv_7.htm)
Windows用のExcelのキーボードショートカットとファンクションキー

1.**F1**
 
**独立したF1**：Excelのヘルプ]作業ウィンドウを表示します。


**Ctrlキー+ F1**：表示またはリボンを非表示にします。


**Altキー+ F1**：現在の範囲内に埋め込まれたデータのグラフを作成します。


**Altキー+ Shiftキー+ F1**：新しいワークシートを挿入します。

2.**F2**
 
**独立したF2**：アクティブセルを編集し、その内容の末尾に挿入ポイントを置きます。補正がボックスのためにオフになっている場合、または数式バーに挿入ポイントを移動します。正しい式場合は、参照を作成するには、矢印キーを使用することができるように、有効/無効にするか、場所を有効にします。


**Shiftキー+ F2**：注釈ボックスを追加または編集します。


**Ctrlキー+ F2**：Backstageビューの形式でタブに印刷プレビュー領域を表示します。

3.**F3**
 
**独立したF3**：ショー貼り付け名]ダイアログボックス。名前は、ブック内で定義されている場合にのみ使用可能。


**Shiftキー+ F3**：関数の挿入]ダイアログボックスを表示します。

4.**F4**
 
**独立したF4**：可能な場合は、最後のコマンドまたはアクションを繰り返します。

式で参照されるセルまたは範囲は、すべての組み合わせ絶対参照と相対的に異なるを通じてサイクルに、F4キーを押し選択された場合。


**Ctrlキー+ F4**：選択したブックを閉じます。


**Altキー+ F4**：Excelが終了します。

5.**F5**
 
**独立F5**：ディスプレイアクセス]ダイアログ。


**CTRL+ F5**:選択したブックのウィンドウサイズを復元します。


6.**F6**
 
**独立したF6**：ワークシート、リボン、作業ウィンドウとズームコントロールの間のスイッチ。ストップやリボン領域との間の切り替え時にシートで分離された、F6は、スプリットペインが含まれています。


**Shiftキーを押し+ F6**：ワークシート、ズームコントロール、作業ウィンドウとリボンを切り替えます。


**Ctrlキー+ F6**：複数のブックウィンドウが開いているときに、作業ウィンドウ次のウィンドウに切り替えます。

7.**F7**
 
**独立したF7**：アクティブなワークシートまたは選択した範囲内でスペルチェックを開きます]ダイアログボックスをスペル。


**Ctrlキー+ F7**：それは拡大ワークブックていないときに、コマンド実行画面に移動します。ウィンドウを移動するには、矢印キーを使用し、終了したらEnterキーを押しますか、Escキーをキャンセルします。

8.**F8**
**F8独立した**:拡張モードまたはオフ。拡張モードでは、選択範囲を拡張すると、ステータス行に表示され、矢印キーは、選択範囲を拡張します。

**Shiftキー+ F8**：あなたは、矢印キーを使用して、細胞の選択に非隣接セルまたは範囲を追加することができます。


**Ctrlキー+ F8**：実行サイズのブックが最大化されていません。


**Altキー+ F8**：作成、実行、編集、またはマクロを削除するには、[マクロの設定]ダイアログボックスを表示します。

9.**F9**
 
**独立したF9**：すべての開いているブック内のすべてのワークシートを計算します。


**Shiftキー+ F9**：アクティブなシートを計算します。


**Ctrlキー + Alt+ F9**：かかわらず、彼らは最後の計算以降変更されたかどうか、開いているブック内のすべてのワークシートを計算します。


**Ctrlキー+ Shiftキー + Altキー+ F9**：式が依存関係を確認し、必要な計算としてマークされていない細胞を含む、ワークブックのすべてのすべてのセルを計算します。


**Ctrlキー+F9**：アイコンにブックウィンドウを縮小します。

10.**F10**
 
**独立したF10**：オンまたはオフヒントキースイッチ。（同様のAltキー）。


**Shiftキー + F10**：選択した項目のショートカットメニューを表示します。


**Altキー+Shift + F10キー**：表示メニューやエラーチェックボタンを通知します。


**Ctrlキー+ F10キー**：選択したワークブックを拡大したり復元します。

11.**F11**
 
**独立したF11**：別のグラフシートに電流範囲でグラフデータを作成します。


**Shiftキー+ F11**：新しいワークシートを挿入します。


**Altキー+ F11**：あなたはVisual Basic for Applications（VBA）を使用してマクロを作成することができるアプリケーションエディター、のMicrosoft Visual Basicを開きます。

12.**F12**
 
**独立したF12**名前を付けて保存]ダイアログボックスを表示します。
サーバにPython環境の構築とデータの転送

#開発環境
 - Linux
 - bash

#サーバにPython環境の構築
　まず、サーバにPython環境を構築したいユーザアカウントでログインします。その後、ホームディレクトリで下記のコマンドを実行します。

```
$ git clone https://github.com/yyuu/pyenv.git .pyenv
$ mkdir .pyenv/shims .pyenv/versions
$ cd .pyenv/plugins
$ git clone https://github.com/yyuu/pyenv-virtualenv.git
```

　上記のコマンドが完了したら、**.bashrc**に下記のプログラムを追記します。

```
export PYENV_ROOT=~/.pyenv
export PATH=~/.pyenv/shims:~/.pyenv/bin:/usr/local/bin:$PATH
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

　その後、下記のコマンドを実行すると、環境変数を反映させることができます。

```
$ source .bashrc
```


#データの転送
　ローカル環境にあるファイルをサーバ上に転送するためには、**scp**コマンドを実行します。scpの使い方は下記のようになっています。

```
scp ローカル環境上にある転送したいファイルのパス ユーザ名@リモートホスト名:保存先のパス
```

　理解しやすいように、例を挙げて説明します。
　それぞれの要素が下記の具体例で与えられたとします。その場合は、下記のコマンドのようになります。

| 要素 | 具体例 |
|:-:|:-:|
| ローカル環境上にある転送したい<br>ファイルのパス  | /usr/home/box/data.txt |
| ユーザ名  | chocolate  |
| リモートホスト名  | apple  |
| 保存先のパス  | /home/chocolate  |

```
# ファイルを転送する場合
scp /usr/home/box/data.txt chocolate@apple:/home/chocolate

# フォルダごと転送する場合
scp -r /usr/home/box chocolate@apple:/home/chocolate
```
zshdb で Zsh のデバッグをする

Zsh のデバッグって皆どうやっているのだろう？というのがわからなかったが、
[zplug のリポジトリ](https://github.com/zplug/zplug) 経由で [awesome-zsh-plugins](https://github.com/unixorn/awesome-zsh-plugins) をみていたら
 :x: :bug: **zshdb** というツールがあったので試してみることにした。

このツールの方が使いやすいよ！とかあればコメント歓迎です。

<!-- more -->

## <i class='fa fa-question'></i> zshdb とは？
zshdb とは zsh スクリプトのためのデバッガー。

[https://github.com/rocky/zshdb](https://github.com/rocky/zshdb)

## <i class='fa fa-download'></i> インストール
```sh
$ git-clone git://github.com/rocky/zshdb.git
$ cd zshdb
$ ./autogen.sh  # Add configure options. See ./configure --help
$ make && make test
$ ./zshdb /etc/zsh/zshrc
$ make install
$ zshdb -V
zshdb, release 0.92
```

## <i class='fa fa-flask'></i> 動作確認
### <i class='fa fa-code'></i> 対象コード
```sh
VAR1="hoge"
VAR2="hige"
VAR3="hage"
VAR1="hoge updated"
eval: echo $VAR1$VAR2$VAR3
```

### <i class='fa fa-terminal'></i> 実行

```sh
$ zshdb sample.zsh
zsh debugger, zshdb, release 0.92

Copyright 2008-2011, 2014, 2016 Rocky Bernstein
This is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.

(/path/to/sample.zsh:1):
VAR1="hoge"
zshdb<0> next
(/path/to/sample.zsh:2):
VAR2="hige"
zshdb<1> help
Available commands:
  action     break      continue  display  enable   export  info  next   print  return  shell  source  step-   unalias    up
  alias      complete   delete    down     eval     frame   kill  next+  pwd    run     show   step    tbreak  undisplay
  backtrace  condition  disable   edit     examine  help    list  next-  quit   set     skip   step+   trace   untrace

Readline command line editing (emacs/vi mode) is available.
Type "help" followed by command name for full documentation.
zshdb<1> break 5
Breakpoint 1 set in file /path/to/sample.zsh, line 5.
zshdb<1> continue
Breakpoint 1 hit.
(/path/to/sample.zsh:5):
eval: echo $VAR1$VAR2$VAR3
zshdb<4> list
  1:    VAR1="hoge"
  2:    VAR2="hige"
  3:    VAR3="hage"
  4:    VAR1="hoge updated"
  5: => eval: echo $VAR1$VAR2$VAR3
zshdb<4> print VAR1
VAR1
zshdb<4> print $VAR1
hoge updated
```

![try.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c6fafe42-9131-2584-8a72-6794717e89c3.png)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [rocky/zshdb - GitHub](https://github.com/rocky/zshdb)
* [rocky/zshdb - Wiki](https://github.com/rocky/zshdb/wiki)
* [zplug/zplug - GitHub](https://github.com/zplug/zplug)
* [awesome-zsh-plugins](https://github.com/unixorn/awesome-zsh-plugins)
Slack絵文字にポケモン導入

# 概要
Slack絵文字としてポケモンを導入します。

# 参考
[Slackにポケモン絵文字をまとめて入れてみた](http://kno75.hatenablog.com/entry/2016/08/04/143612)

# 手順

## 1.画像集め
すばらCお方が :point_down: 

https://github.com/Templarian/slack-emoji-pokemon

## 2.一括で導入するツールをDL
デフォルトやと、1個ずつしかでけへんさかいに、、

Chromeプラグイン:point_down: 
https://chrome.google.com/webstore/detail/slack-emoji-tools/anchoacphlfbdomdlomnbbfhcmcdmjej


## 番外.名前を整形
画像集めのときの名前が、すべてそのままポケモンの名前(アルファベット)だったので、[pokemon-{name}]とした。
多分やりかたはあまりイケてない。

※環境はWindows

```
cd \slack-emoji-pokemon-master\slack-emoji-pokemon-master\emojis
dir /b > list.txt
```
サクラエディタで `rename {name} pokemon-{name}`となるように整形
コマンドプロンプトに貼り付けて実行

## 3.Slackのカスタマイズ画面で導入

`https://{team_name}.slack.com/customize/emoji` にアクセスする
さっきのChromeプラグインのおかげで画像をドロップするだけでファイル名の拡張子より前が絵文字の名前になる。

![image](https://qiita-image-store.s3.amazonaws.com/0/117615/047f29c6-744a-52e9-119a-dbcf0765ac84.png)

## いえーーーーーーい

![image](https://qiita-image-store.s3.amazonaws.com/0/117615/3da7ca56-b9c5-a80b-b365-0411086511a2.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/117615/3bc62e41-a5ca-6555-06b3-06442a6aeaf0.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/117615/7f86662b-5dba-82af-08e6-7f9ab12c9fb1.png)



※特に自分がポケモン好きというわけではありません
Sequel ProでSQLをフォーマットする - Mac

Sequel Proをよく使っているのですが、整形できなくて不便だったので、整形するようにBundleを設定しました。

以下の例のように整形できます。

#### 整形前

![_MySQL_5_6_27-log__local-dev_mistersuite_work_task_worktask.png](https://qiita-image-store.s3.amazonaws.com/0/30079/7f0ab4bf-0952-4f63-fabb-6181d7e402cd.png)

#### 整形後

![_MySQL_5_6_27-log__local-dev_mistersuite_work_task_worktask.png](https://qiita-image-store.s3.amazonaws.com/0/30079/eceb7882-4661-b18c-fe56-fc066341f666.png)

# 手順

## PHPスクリプトのSqlFormatterのインストール

インストール先は任意ですが、今回は以下のようにインストールします。

```bash
cd /usr/local/lib/
git clone git@github.com:jdorn/sql-formatter.git

# 以下にスクリプトが配置されている
/usr/local/lib/sql-formatter/lib/SqlFormatter.php 
```

メニューの[バンドル]->[バンドルエディタ]を選びエディタを開き以下のように設定します。(ショートカットは任意です)

![バンドルエディタ_と__MySQL_5_6_27-log__local-dev_mistersuite_work_task_worktask.png](https://qiita-image-store.s3.amazonaws.com/0/30079/c8ab5317-d03a-fe3d-8b37-2d3e7720c870.png)

```php
#!/usr/local/bin/php
<?php
require_once '/usr/local/lib/sql-formatter/lib/SqlFormatter.php';

$sql = '';
while (($line = fgets(STDIN))) {
	$line = str_replace(array("\r\n","\r","\n"), ' ', $line);
	$sql .= $line;
}

echo SqlFormatter::format($sql, false);
```

試してみると実際に[クエリ]で整形できました。

# まとめ
Sequel Proのバンドルという機能をつかって外部スクリプトを実行し、その整形された結果を受け取ることができました。
バンドルは他にも機能があるので確認してみると便利なものが発見できるかもしれません。

# 参考
* http://ameblo.jp/fumin65/entry-11775638808.html
* [Sequel Pro Core Bundles](https://sequelpro.com/docs/bundles/core)
vi(vim)でよく使うコマンド@ITプロパートナーズ

インターン生がvi(vim)使い始めたので、私がよく使うコマンドを共有します。

# (前提条件)本記事内のviとvimの区別について

コメントをいただきましたので追記します。
本記事では、vi と vimのコマンドの差異に関して、 **意図的に扱っていません。**
というのも、ぬるいWebエンジニアである筆者の観測範囲(CentOS6系、Amazon Linuxの最新)では `vi`　コマンドでエディタを起動しても本記事に掲載したコマンドは使えるため(はっきりと検証していませんが、`vi`コマンドでもvimが起動している模様)、 あえて `vi` と `vim` を意識的に使い分けることは、(社内レベルでは)必要ないという認識です。
もちろん、環境によっては `vi`コマンドで純粋な `vi` が起動することも当然考えられるので、

- vi と vim は違うエディタ

という事を心のどこかに止めておくのは、有効な心がけだと思います。

# モード変更

| コマンド名 | 内容 |
|:-:|:-:|
| ctl+ [  | ノーマルモードに戻る
| i  |  挿入モードに変更 |
| I  |  (行頭に移動して)挿入モードに変更 |
| A  |  (行末に移動して)挿入モードに変更 |
| shift + v  | 行レベルのヴィジュアルモードに変更(行を丸ごとコピーする時とか) |

- ほぼすべてのコマンドは[ノーマルモード]でしか有効になりません。迷子になった時はとにかく`ctl + [`を押すのがいいです。

# 保存・終了
| コマンド名 | 内容 |
|:-:|:-:|
| :w + enter  | 保存 |
| :wq + enter  |  保存して終了 |
| :q! + enter   |  保存せずに終了 |

# 移動系

- アルファベットは、大文字、小文字の区別があるので注意！

## 行間移動
| コマンド名 | 内容 |
|:-:|:-:|
| `h`, `j`, `k`, `l`  |  カーソルキーの上下左右に相当 |
| ctl+f, ctl+b  | 一画面進む ｜戻る |
| gg  | ファイルの最初に移動 |
| G  | ファイルの最後に移動 |
| [数字] gg  | [数字]で指定した行数に移動 |
 
## 行内移動

| コマンド名 | 内容 |
|:-:|:-:|
| 0  |  行頭に移動 |
| ^  |  行頭に移動(行頭スペースを無視) |
| f[文字]  |  行内にある[文字]の位置まで移動 |
| t[文字]  |  行内にある[文字]の位置の一文字前まで移動 |

## 検索移動
| コマンド名 | 内容 |
|:-:|:-:|
| /[文字列] + enter  |  下方向に検索 |
| ?[文字列] + enter |  上方向に検索 |

# 編集系

## 編集
| コマンド名 | 内容 |
|:-:|:-:|
| cw  |  カーソル位置以降から1単語分を削除して挿入モード |
| ciw  |  カーソル位置にある1単語分を削除して挿入モード |
| ci[, ci{, ci(  |  カーソル位置を基準に、[], {}, ()で囲まれた範囲を削除して編集モード |
| C  |  カーソル位置以降から行末までを削除して挿入モード |
| o  |  (小文字の`o`オー)カーソル位置の次の行に空行を追加して挿入モード |
| O  |  (大文字の`o`オー)カーソル位置の前の行に空行を追加して挿入モード |

## 削除
| コマンド名 | 内容 |
|:-:|:-:|
| dw  |  カーソル位置以降から1単語分を削除 |
| diw  |  カーソル位置にある1単語分を削除 |
| di[, di{, di(  |  カーソル位置を基準に、[], {}, ()で囲まれた範囲を削除 |
| dd  |  カーソル位置にある行をまるごと削除 |
| x  |  カーソル位置にある1文字だけを削除 |


## 便利コマンド

| コマンド名 | 内容 |
|:-:|:-:|
| :set number + enter  |  行番号を表示 |

随時増やしていきます :turtle:
引数がクロージャーになる

#ブレイクスルーjavascriptを読んでいて分からなかったところをメモ
##分からなかったコード

```javascript
Modal.$parents.on("click", "a" , function(e) {
    Modal.show(e);
    return false;
});
Modal.prototype.show = function(e) {
  var $target = $(e.currentTarget),
      src = $target.attr("href");
  this.$contents.html("<img src=\"" + src + "\" />");
  this.$container.fadeIn();
  this.$overlay.fadeIn();

//ここが分からなかった
  var index = $target.data("index");
  this.countChange = this.createCounter(index, this.$el.length);
  return false;
};
Modal.prototype.createCounter = function(index, len){
  return function(num) {
//indexは何故値が保持されるのか？
//Modal.prototype.showの中のindexを更新しているのか？
    return index = (index + num + len) % len;
  };
};
Modal.prototype.next = function() {
  this.slide(this.countChange( 1 ));
};
```

コメントに書いてある感じでかなり悩んだ。。。
分かればかなり簡単！！
引数もクロージャになる!それが答え!
return function(num){}の中のindexはModal.prototype.showのindexとは別物!!
値渡しされているだけ!!
下記がその例!

```javascript
function multiplyer( numA ) {
//ここでnumAが定義されていると考えればいい
    return function( numB ) {
        return numA = numA * numB;
    }
}
var $double = multiplyer( 2 );  // ２倍にする
console.log($double(5));	//10
console.log($double(5));	//50(10*5)
console.log($double(5));	//250(50*5)
```
PHPでログを出力したい時に。。。

### 配列やオブジェクトを指定した場合はキーと要素を表す形式で値が表示される。
```
print_r($変数名)
```

###配列の場合は要素数とインデックス番号が表示され、オブジェクトの場合は、オブジェクト内部の変数の数や変数に関する情報が表示される。
```
var_dump($変数名)
```

###Codeigniterの書き方？？かもしれませんが。。。
```
log_message('debug', 'Hello world');
```
LogLevel(debug)はの部分には下記のものが使える。
'Hello world'部分に変数を入れることもできる。

```
error = エラー
debug = デバッグ
info = 情報
```
システム開発(請負)における管理工数の必要性

#1 はじめに
　システム開発のフェーズ（または工程）としては、概ね以下のようになります。
　（ここでは、ウォーターフォール型の開発を例とします）
　
　(1)要件定義
　(2)基本設計
　(3)詳細設計
　(4)製造
　(5)単体テスト
　(6)結合テスト
　(7)総合テスト
　(8)運用テスト
　(9)現地調整

#2 請負開発の範囲と開発工数
　システム開発の各段階において、請負開発の範囲となるのは（一般的には）、上記1の
　(2)～(7)の範囲になります。
　
　また、開発にかかる工数としては、基本的にはそのフェーズに対して稼動する人数の
　合計になります。
　
　たとえば、基本設計：2.5人月、詳細設計：5人月、製造：4人月、単体テスト：3人月
　結合テスト：3人月、総合テスト：1.5人月の場合、単純計算としては、
　2.5＋5＋4＋3＋3＋1.5＝19人月が上記1の(2)～(7)の作業に掛かる工数になります。

#3 管理工数とは
　上記2の工数に対しリスクとして2割等の上乗せをする場合もありますが、管理工数の
　計上も必要になります。
　
　管理工数とは、具体的にはどのような作業に対する工数なのでしょうか。
　
　具体的は以下の作業に対する工数になります。
　　(1)進捗管理
　　　・開発スケジュールの作成・修正
　　　・進捗報告書の作成
　　　・進捗定例会議への参加
　　(2)品質管理
　　　・設計書レビューの実施
　　　・ソースコードレビューの実施
　　(3)変更管理
　　　・仕様変更に対する会議への参加
　　　・変更箇所に対する設計・影響調査
　　　・スケジュール調整
　　(4)障害管理
　　　・テストに対する障害の集計と改修計画
　　　・改修結果に対する確認
　　　
　これらの作業はシステム開発を行ううえでは、当たり前のように必要となる作業なのです
　が、かといって片手間でできる作業ではありません。
　
　しかし、請負開発時の必要工数（見積もり金額）に計上しておかないと、結果的に片手間
　作業と化してしまう可能性も高いため、（たとえ、ユーザーから嫌がれたとしても）管理
　工数の必要性を説明し、正規の工数として認知してもらうべき作業です。
　
#4 管理工数の目安
　では、管理工数の目安としては、どのような数字とすべきなのでしょうか。
　
　請負開発に対する管理工数の割合を正確に割り出すことはケースバイケースの部分もあり
　極めて困難です。
　
　あまり多すぎても、また少なすぎても良くありません。
　
　決めの問題となる部分もありますが、全体工数の1割程度とするのが色々な意味で妥当なの
　ではないかと思います。
　　
　今回の例では、上記1の(2)～(7)までの工数19人月＋1.9人月＝20.9人月が管理工数込みの
　全体工数になります。
Chrome Extensionの開発時にホットリロードさせる

おそらくChrome本体としては、開発中のChrome Extensionをホットリロードする機能はなく、コードを変更するたびに手動リロードするか、webpack等をかませる必要があると思いますが、もう少し簡単な方法がありました。

# TL;DR

[hot-reload.js](https://raw.githubusercontent.com/xpl/crx-hotreload/master/hot-reload.js)を使う

# 手順

1. ホットリロードしてくれるモジュール[hot-reload.js](https://raw.githubusercontent.com/xpl/crx-hotreload/master/hot-reload.js)をローカルに保存する。
2. manifest.jsonに以下を追加する

```
"background": { "scripts": ["hot-reload.js"] }
```
（既に他のbackground.scriptsがあれば配列に追加する）

これでリロードすれば後はファイルの追加・変更・削除を検知してホットリロードしてくれます。

# 特徴など

これだけだとちょっと寂しいので特徴などをいくつか

* 軽い！（hot-reload.jsは1.2KB、50行程度のスクリプト）
* 1秒毎にディレクトリ内のファイルのタイムスタンプを見て、変更を検知
* ディベロッパーモードのときだけ動作
PHP - 翌月の同じ日の日付を返す

PHP では次のようなコードで翌月の同じ日の日付を取得することができます。

```php
$date = new DateTime('2017-01-1');
echo $date->modify('next month')->format('Y-m-d'); // 2017-02-01
```

これを日付を変えて次のようにすると、意図した日付を取得することができません。

```php
$date = new DateTime('2017-01-31');
echo $date->modify('next month')->format('Y-m-d'); // 2017-03-03
```

ここでいう「意図した日付」＝「翌月の同じ日の日付」とは次のとおりです。

* 翌月に同じ日の日付が存在する場合、その日付
    - たとえば 1 月 1 日の場合、2 月 1 日は存在するので、2 月 1 日を翌月の同じ日の日付とする
* 翌月に同じ日の日付が存在しない場合、翌月末日の日付
    - たとえば 1 月 31 日の場合、2 月 31 日は存在しないので、2 月 28 日を翌月の同じ日の日付とする（うるう年の場合は 2 月 29 日）

この仕様を実装したのが以下のコードです。

```php
$date = new DateTime();
$date->setDate(2017, 1, 31);
$next = getNextMonth($date);
echo $next->format('Y-m-d');

function getNextMonth($baseDate)
{
    $date = clone $baseDate;
    $day = (int)$date->format('d');
    if ($day <= 28) {
        $date->modify('next month');
        return $date;
    }

    $date->modify('first day of next month');
    $year  = (int)$date->format('Y');
    $month = (int)$date->format('m');
    if (!checkdate($month, $day, $year)) {
        $day = (int)$date->format('t');
    }
    
    $date->setDate($year, $month, $day);
    return $date;
}
```

28 日までは単純に 

```php
$date->modify('next month')
```

で OK ですが、29 日以降は翌月に同じ日がない場合があるので、

```php
checkdate($month, $day, $year)
```

で日付が存在するか確認して、存在しなければ末日を返すようにしています。

このコードは翌月固定ですが、n ヶ月後としたい場合は引数に月数を追加して少し修正すれば OK です。

なお、<a href="http://php.net/manual/ja/datetime.modify.php#107592" target="_blank">PHP: DateTime::modify - Manual</a> にはこれとは違った実装方法が載っています。
Windows で消せないフォルダ "folder; " みたいなのを作ってしまったら

# Windows で消せないフォルダ "folder; " みたいなのを作ってしまったら

## 免責事項
以下の情報は、正しいこと、同じ結果が得られることを保証しません。如何なる責任も負いません。使用者の責任において使用してください。

## 問題と解決した方法
エクスプローラシェルではフォルダ "folder; " は作成できないが、Win32 API を使えばできるようだ、というか、できてしまった。
このフォルダを削除するのにコマンドプロンプトの `rd /s` や各フリーウェアは効果がなかった。

私の場合は、問題のフォルダの一つ上に普通の名前のフォルダがあったので、MinGW のコマンドプロンプトから強制的にフォルダ階層を削除するコマンドを実行した。
強力なだけ危険なので -rf オプションがどういう意味なのかは自分で理解した上で使用するべきである。

```shell-session
> rm -rf 普通のフォルダ名
```

## 確認した環境

- OS: 日本語 Windows 10 Home
- MinGW: たしか、git for Windows と一緒にインストールされたはず。
Windows環境にVagrant+Ubuntuデスクトップ環境をインストール

Vagrant上で動くUbuntuのデスクトップ（GUI）環境が欲しくなったので、手順をまとめました。

![VirtualBox_ubuntu16_default_1487232644411_4420_16_02_2017_18_18_06.png](https://qiita-image-store.s3.amazonaws.com/0/156795/e152695e-f0fc-cdc6-0c80-621cbb35b006.png)

# 環境
ホストOS: Windows 10 Home 64bit
ゲストOS: Ubuntu-16.04
VirtualBox: 5.1.14
Vagrant: 1.9.1
※BIOSレベルで仮想化支援機能(VT-x/AMD-V)の有効化が必要です。

# VirtualBoxをインストール
以下よりダウンロードしてインストールします。
~~https://www.virtualbox.org/wiki/Downloads~~
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp

# Vagrantをインストール
以下よりダウンロードしてインストールします。
https://www.vagrantup.com/downloads.html

# Ubuntu環境の初期化
DOSプロンプトを起動し、ubuntu16というディレクトリを作ります。

```
>cd c:/
>mkdir vagrant
>cd vagrant
>mkdir ubuntu16
>cd ubuntu16
```

ubuntu環境の初期化をします。

```
>vagrant init bento/ubuntu-16.04
```

# Vagrantfileの設定
テキストエディタなどでVagrantfileを編集します。
私は以下のようにしました。

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-16.04"

  # ローカルへのポート3000アクセスをvmのポート3000に転送（Web開発で必要な場合）
  config.vm.network "forwarded_port", guest: 3000, host: 3000

  # Windowsローカル環境から、192.168.33.10で接続
  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
    vb.memory = "2048" # メモリは2GB

    vb.customize [
      "modifyvm", :id,
      "--vram", "256", # ビデオメモリ確保（フルスクリーンモードにするため）
      "--clipboard", "bidirectional", # クリップボードの共有
      "--draganddrop", "bidirectional", # ドラッグアンドドロップ可能に
      "--cpus", "2", # CPUは2つ
      "--ioapic", "on" # I/O APICを有効化
    ]
  end
end
```

# vmの起動
以下でUbuntuのBoxを取得し、vmの起動を行います。

```
> vagrant up
```

# Ubuntuの設定
vmが起動したら、id vagrant / pw vagrantでログインします。
シェルが表示されたら以下でパッケージを更新します。

```
$ sudo apt-get update
$ sudo apt-get upgrade
```

途中で「Configuring grub-pc」の画面が出たら、なにもチェックせずにOKし、進んでいきます。
（TabでOKをフォーカスしてEnter）

![VirtualBox_ubuntu16_default_1487232644411_4420_16_02_2017_17_56_43.png](https://qiita-image-store.s3.amazonaws.com/0/156795/175280a3-53fb-2923-8c71-b754c9ed5241.png)


次にubuntu-desktopをインストールします。

```
$ sudo apt-get install ubuntu-desktop
```

かなり時間がかかります。
終わったら再起動します。

```
$ sudo reboot
```

# ログイン
ログイン画面が表示されたら、vagrantユーザーでログインしましょう。
これで、Vagrant上でUbuntuのGUI環境を利用できるようになりました。

![VirtualBox_ubuntu16_default_1487232644411_4420_16_02_2017_18_18_06.png](https://qiita-image-store.s3.amazonaws.com/0/156795/e152695e-f0fc-cdc6-0c80-621cbb35b006.png)

# その他の設定
日本語入力の設定は以下の記事がとてもわかりやすかったです。
http://qiita.com/shishamo_dev/items/238f6e5060fb838827f6

また、タイムゾーンの設定もしておきましょう。
GUI上から、「System Settings -> Time & Date」から設定できます。
しっかり行う場合は、
http://qiita.com/azusanakano/items/b39bd22504313884a7c3
こちらの記事などをご覧ください。
pyme備忘録

# pyme

GPGmeの情報が少ないため備忘録代わりに。

* <https://www.gnupg.org/documentation/manuals/gpgme/Concept-Index.html>

## インストール

まず、Ubuntu 16.04では最新のpymeを入れようとすると1.7以上でないと怒られます。

最新のリポジトリ（zesty 1.7）は対応しているっぽいですが、16.*では1.6止まりのようです。
<http://packages.ubuntu.com/search?keywords=libgpgme11>

GPGme1.8をインストールの四苦八苦は[GPGme with Qt5](http://qiita.com/mugwort_rc/items/187e1b791e11e0551ac1)を参照下さい。

## Context

何をするにもまずContextを作ります。

```py3
import gpg
ctx = gpg.Context()
```

Contextは以下のメンバを持ちます。

* armor
* card_edit
* decrypt
* decrypt_verify
* delete
* edit
* encrypt
* encrypt_sign
* export
* genkey
* get_key
* import_
* include_certs
* keylist
* keylist_mode
* passphrase_cb
* progress_cb
* protocol
* set_engine_info
* set_locale
* sign
* signers
* textmode
* verify

## homedir

gpgコマンドの`--homedir`オプションに相当するものはengine_infoで扱います。

```py3
# protocol, filename, home_dir
ctx.set_engine_info(gpg.constants.PROTOCOL_OpenPGP, None, ".")
```

tupleでしか引数を受け取ってくれないのが少し不便です。

* protocol
* filename
* home_dir

<https://www.gnupg.org/documentation/manuals/gpgme/Engine-Information.html>
Macへsshpassコマンドをインストールする方法


## brewでインストール (失敗)

* 通常通りbrewでインストールしてみようとしたら失敗した。

	```bash:terminal
	brew install sshpass
	
	Error: No available formula with the name "sshpass"
	We won't add sshpass because it makes it too easy for novice SSH users to
	ruin SSH's security.
	```
	
	* だめ。sshセキュリティがだめになっちゃうからやめとけ、だと。。。

	

## 誰かが使ったやつを使う (成功)

* githubから取得

	```bash:terminal
	brew install http://git.io/sshpass.rb
		
	######################################################################## 100.0%
	==> Downloading http://sourceforge.net/projects/sshpass/files/sshpass/1.05/sshpass-1.05.tar.gz
	==> Downloading from https://jaist.dl.sourceforge.net/project/sshpass/sshpass/1.05/sshpass-1.05.tar.gz
	######################################################################## 100.0%
	==> ./configure --prefix=/usr/local/Cellar/sshpass/1.05
	==> make install
	🍺  /usr/local/Cellar/sshpass/1.05: 9 files, 40.7K, built in 16 seconds
	```

* 確認
	
	```bash:terminal
	brew info sshpass
	
	sshpass: stable 1.05
	http://sourceforge.net/projects/sshpass
	/usr/local/Cellar/sshpass/1.05 (9 files, 40.7K) *
	  Built from source on 2017-02-16 at 21:10:51
	From: /usr/local/opt/sshpass/.brew/sshpass.rb
	```
JavaScript チャートライブラリお薦め2選




JavaScriptのチャートライブラリは山ほどあるが、その中でもユーザの要求に柔軟に答えながら、長く運用できるようなライブラリとしては、以下の2つがとても優れていたので紹介する。

- jqPlot
- HighCharts

##jqPlot
公式：http://www.jqplot.com/
デモ：http://www.jqplot.com/examples/barLineAnimated.php

老舗のチャートライブラリ。特に日本での人気が高い。canvasでの描画なので若干古さを感じる。しかし、多機能でドキュメントも豊富。2軸のグラフや、様々なグラフの組み合わせも可能。ボックスプロットが描けないのが難点か。ライセンスはGPL,MITなのでフリーで利用可能。

日本語ドキュメントはアルファシスが有名。
http://alphasis.info/jquery-plugins/jqplot/

##HighCharts
公式：http://www.highcharts.com/
デモ：http://www.highcharts.com/demo

有償（商用の場合）のチャートライブラリ。機能の多さ、使いやすさ、公式ドキュメント（英語）の分かりやすさが良い。様々なグラフの組み合わせや、判例表示の自由度、ボックスプロットの描画も可能。他の追随を許さない、圧倒的な完成度のチャートライブラリ。

##その他
その他のライブラリを探すときは、以下が便利。

[JavaScript Graphing Library Comparison](http://www.jsgraphs.com/ "Qiita")
Dockerの色々削除コマンド(Docker for Mac)

たまに使う時に忘れるので。。。

## コンテナをすべて削除

aすべてのコンテナを出力
qコンテナIDのみ出力

```
docker rm -f `docker ps -aq`
```

## イメージを削除

aすべてのイメージを出力
qイメージIDのみ出力

```
docker rmi -f `docker images -aq`
```

## ボリュームを削除

qオプションでボリューム名だけ出力
fでフィルタ 使われてないボリュームが出力

```
docker volume rm `docker volume ls -qf dangling=true`
```

## 参考
docker ps
https://docs.docker.com/engine/reference/commandline/ps/

docker images
https://docs.docker.com/engine/reference/commandline/images/

docker volume ls
https://docs.docker.com/engine/reference/commandline/volume_ls/
for文にてホゥとなった件

備忘録としてメモ。

```as:test.as
var aaa:Array = [1, 2, 3];
var bbb:Array = [11, 22, 33];

trace("-------------------------- [1]")

for(var i:int=0; i<aaa.length; i++){
	trace(aaa[i]);
	for(var j:int=0; j<bbb.length; j++){ // 明示的に jに0を入れる
		trace(bbb[j]);
	}
}

trace("-------------------------- [2]")

for(var ii:int; ii<aaa.length; ii++){
	trace(aaa[ii]);
	for(var jj:int; jj<bbb.length; jj++){ // for文に入る度に jjが初期化されて0になると思いきや、そんなことはなかった・・
		trace(bbb[jj]);
	}
}
```

<br>

```as:出力結果
-------------------------- [1]
1
11
22
33
2
11
22
33
3
11
22
33
-------------------------- [2]
1
11
22
33
2
3
```

どうしてこんなことに・・・

ひとまず、明示的に書くに越したことはないと改めて感じました。