OmniAICreator/Qiita-1.07M huggingface dataset:
Redmineをちょっと触りたいなあ、そうだAWS Lightsail 使ってみよう


ちょっとRedmineのConfigとかいじったり、動作確認したかったので、
ぱっとRedmineを作れるサービスとして、

AWS Lightsailを使ってみました。

使い方は簡単です。

![aws_lightsail_001.JPG](https://qiita-image-store.s3.amazonaws.com/0/49158/5247eb9e-a548-988c-ed87-db61d39f6d0c.jpeg)

AWSコンソールのサービス＞コンピューティング＞Lightsail

ごめんなさい、AWSアカウント登録については、ここでは割愛してます。:disappointed_relieved:


クリックすると、
新しくブラウザのタブが開いてAmazon Lightsailのコンソールに飛びます。

![aws_lightsail_002.JPG](https://qiita-image-store.s3.amazonaws.com/0/49158/375005fa-3676-1837-89b0-23e856753702.jpeg)


Create Instanceをクリック


次にどんなインスタンスを作るか聞かれます。
Redmineを使いたいので、自分はRedmineを選択。
OSだけとか、WordPressとか、Nginxとかもあるようですね、
昔は作るのめんどくさかったのに、便利な時代になったものです。

![aws_lightsail_003.JPG](https://qiita-image-store.s3.amazonaws.com/0/49158/6a9d9eea-a55c-0244-9960-7c0b976ab6c4.jpeg)



画面の下部では、インスタンスのスペックを聞かれます。
動けばいいので、$5/monthのプランで作ります、格安VPSなみですね。
しかも1時間単位での課金なので、作ってすぐ消せば対してお金かかりません。

AZも選べるみたいです。
Asia圏のはさすがになく、全てusだったと思います。

インスタンスの名前も任意のが付けれそうです。
自分はデフォのままで作ります。

スペックを決めれたら、Createをクリック。

![aws_lightsail_005.JPG](https://qiita-image-store.s3.amazonaws.com/0/49158/28ba3b9d-a141-703c-78e2-7eacb088b90c.jpeg)


作成されるとComputingの下に以下のように表示されます。
![aws_lightsail_007 .JPG](https://qiita-image-store.s3.amazonaws.com/0/49158/f5d29690-4cdf-189c-d271-a2943dc0f5a8.jpeg)

完成です。
GIPも割り当てられるのでブラウザでアクセスできます。

でも作成できたあとなかなかアクセスできなかったので、
Runningと表示されても、もう数分程度待った方がいいのかもしれません。
たまに使うLinuxコマンド集

## 個人的に、たまに使うけど使いたいときには忘れてるコマンド集

```bash:全文検索
find 検索対象パス -type f | grep 検索対象ファイル | xargs grep 検索対象文字列

ex)
find / -type f | grep .jsp$ | xargs grep hidden
```

```bash:集計
awk '{sum += $1} END {print sum}'

ex)
top -b -n 1 | grep httpd | awk '{sum += $7} END {print sum}'
```
メッセージの「タップしてプレビューを読み込む」にさせない

メッセージの「タップしてプレビューを読み込む」になる条件ははっきりとは分からない。
ただ、今までさらっとURL書いてリンクを張っていたのに、
それが「タップしてプレビューを読み込む」に省略され、URLの文字列は見えなくなる

意図はなんなのかわからないが、なんとか回避したい。
URLを<>で囲めば、自動で上記の様に省略されることはなくなった。
今まで
http://www.yahoo.co.jp/
<>で囲む
<http://www.yahoo.co.jp/>
<>で囲んでも自動でリンクを貼ってくれる機能は問題なく動く

URL以降にも文章が続いている場合も省略されないのではないか、と思っている
【CSS4】:focus-withinでクリックタイプのドロップダウンメニュー？

`:hover`を使ったドロップダウンメニューは既にCSSのみで実装可能。
子要素の`:hover`は親要素まで伝播するので、メニューにカーソルが重なっている間は親要素の`:hover`状態が保持される。
でもこれって割と使いづらくね？　ちょっとでもカーソル外れるとメニュー消えるし。
そもそも今の時代、スマホ端末で意味をなさない`:hover`はちょっと……
クリックでオープンしてメニューの外をクリックしたら勝手に閉じるやつ、実装したいなあ……CSSのみで。


```html:dropdown.html
<div tabindex="-1" class="dropdown">めにう
  <ul>
    <li><a href="/hoge">hoge</a></li>
    <li><a href="/fuga">fuga</a></li>
    <li><a href="/piyo">piyo</a></li>
  </ul>
</div>
```

```css:focus.css
.dropdown > ul {
  display: none;
}
.dropdown:focus > ul {
  display: block;
}
```
`:focus`だとめにう内の項目をクリックした時点でフォーカスが外れてリンクが上手く機能しない……

というわけで、Selectors Level 4 ではこんな擬似クラスが

```css:focus-within.css
.dropdown > ul {
  display: none;
}
.dropdown:focus-within > ul {
  display: block;
}
```


`:focus-within`だと多分、いい感じにバブルアップしたフォーカスをキャッチしてくれるんじゃないかと！（希望）
これはjavascriptの focusin/focusout イベントに相当する擬似クラスという事かな。
https://drafts.csswg.org/selectors-4/#the-focus-within-pseudo

果たして現場で使えるようになる日はいつなのか。
第12回つぶやき勉強会 ~ 改行について。セミコロンつける派？つけない派？ ~

# 問題 Ruby 編

```zsh:zsh
$ ruby hoge.rb
# => これは何ですか？ 
# (以下に hoge.rb を記載）
```

```rb:hoge1.rb
a = 1 + 2
p a
```

```rb:hoge2.rb
a = 1 
  + 2
p a
```

```rb:hoge3.rb
a = 
  1 
  + 2
p a
```

```rb:hoge4.rb
a 
  = 
    1 
    + 2
p a
```

----

# 解答 Ruby 編

```zsh:zsh
$ for i in 1 2 3 4; do
for> echo "-- run hoge${i}.rb --"
for> ruby hoge${i}.rb
for> done
-- run hoge1.rb --
3
-- run hoge2.rb --
1
-- run hoge3.rb --
1
-- run hoge4.rb --
hoge4.rb:2: syntax error, unexpected '=', expecting end-of-input
```

----

# 問題 JavaScript 編

```zsh:zsh
$ node piyo.js
# => これは何ですか？ 
```

```js:piyo1.js
a = 1 + 2
console.log(a)
```

```js:piyo2.js
a = 1 
  + 2
console.log(a)
```

```js:piyo3.js
a = 
  1 
  + 2
console.log(a)
```

```js:piyo4.js
a 
  = 
    1 
    + 2
console.log(a)
```

----


# 解答 JavaScript 編

```
$ for i in 1 2 3 4; do
for> echo "-- run piyo${i}.js --"
for> node piyo${i}.js
for> done
-- run piyo1.js --
3
-- run piyo2.js --
3
-- run piyo3.js --
3
-- run piyo4.js --
3
```

----

# 解説

ASI ...Automatic Semicolon Insertion

ref. http://www.ecma-international.org/ecma-262/5.1/#sec-7.9
ref. http://asi.qfox.nl/


----

# おまけ問題

```js:omake.js
console.log(1)

[3,4,5].forEach((val, index) => {
  console.log(val)
})
```

```zsh:zsh
node omake.js
=> これは何？
```

----

# おまけの解答


```zsh:zsh
$ node omake.js
1
/Users/mochizuki/Desktop/tweet/omake.js:3
[3,4,5].forEach((val, index) => {
^

TypeError: Cannot read property '5' of undefined
    at Object.<anonymous> (/Users/mochizuki/Desktop/tweet/omake.js:3:1)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:146:18)
    at node.js:404:3
```

行末のセミコロンをつけないと、このようなエラーに遭遇できます。回避方法としては、

```js:回避策
;[3,4,5].forEach((val, index) => {
  console.log(val)
})
```

などのように、行頭にセミコロンなどをつけるとOKです。



----

# つけるか、つけないか、あなた次第です。ありがとうございました。
[swift] InterfaceBuilderで多角形のボタンを作る

#InterfaceBuilderで多角形のボタンを作る

![button.gif](https://qiita-image-store.s3.amazonaws.com/0/14489/abf8c20d-901c-522d-313c-3ca95193d3cb.gif)

```swift:PolygonButton.swift
import UIKit

@IBDesignable

class PolygonButton: UIButton {
    
    @IBInspectable public var numberOfCorner : Int = 4
    @IBInspectable public var buttonColor : UIColor = UIColor.black
    @IBInspectable public var rotation : Double = 0

    public let borderShape = CAShapeLayer()

    // Attributes Inspectorで設定した値を反映
    override func draw(_ rect: CGRect) {
        drawPolygon(numberOfCorner: numberOfCorner)
    }
    
    private func drawPolygon(numberOfCorner: Int) {
        let path = createPolygonPath(numberOfCorner: numberOfCorner)
        
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        
        self.layer.masksToBounds = true
        self.layer.mask = mask
        
        borderShape.path = path.cgPath
        borderShape.lineWidth = 1.0
        borderShape.strokeColor = buttonColor.cgColor
        borderShape.fillColor = buttonColor.cgColor
        self.layer.insertSublayer(borderShape, at: 0)
    }
    
    private func createPolygonPath(numberOfCorner:Int) -> UIBezierPath {
        let path = UIBezierPath()
        
        let center_x = self.center.x - self.frame.origin.x
        let center_y = self.center.y - self.frame.origin.y
        
        let rot = rotation * M_PI / 180
        
        for i in 0..<numberOfCorner {
            let rad = rot + M_PI * Double(i) * 2.0 / Double(numberOfCorner) - M_PI_2
            let drawPoint:CGPoint =
                CGPoint(x: center_x + self.frame.width/2 * CGFloat(cos(rad)) ,
                        y: center_y - self.frame.height/2 * CGFloat(sin(rad)) )
            if i==0 {
                path.move(to: drawPoint)
            } else {
                path.addLine(to: drawPoint)
            }
        }
        path.close()
        return path
    }
    
//余白部分のタッチは無効にする
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        if !createPolygonPath(numberOfCorner:numberOfCorner).contains(point) {
            // タッチ領域外
            return nil
        } else {
            print("タッチ")
            return super.hitTest(point, with: event)
        }
    }
    
}
```

UIButtonのクラスをPolygonButtonに変更。
余白部分のタッチの無効化については[こちら](http://qiita.com/m_orishi/items/050545027c21b9cd916b)を参考にさせて頂きました。
NULLと戯れる: 集約関数とNULL

集約関数の対象行が0件の場合や対象列がNULLを含む場合、結果として0ではなくNULLが返されることがあるので注意しましょう。

# SQL標準での規定

SQL:2011では、集約関数が返す結果について以下のように規定されています。

- COUNT(*)は、集約結果内の行数を返す
- 以下の行は集約関数の対象とならない
    - DISTINCT指定時の重複行
    - 評価結果がNULLとなる行
- 対象となる行が存在しない場合、COUNTの結果はゼロ、その他の集約関数の結果はNULLとなる

つまり、以下のような整理になります。

|関数|0行の場合|対象の列が全てNULLの場合|備考|
|:--|:--|:--|:--|
|COUNT(*)|0|行数|全ての列がNULLの行であっても1行としてカウントされる
|COUNT(column)|0|0||
|MAX(column)|NULL|NULL||
|MIN(column)|NULL|NULL||
|SUM(column)|NULL|NULL||
|AVG(column)|NULL|NULL|NULLの列は分母の件数としてカウントされない|

主要なRDBMSのほとんどはこの規定にきちんと従っているようです。

対象列がNULLで除外されたものがある場合、SQLSTATE 01003が返されます。これもSQL標準の仕様ですが、MySQL 5.7は対応していないようです。

# NULLを返さないでほしい場合
COALESCE、NVL、IFNULL等を用いてNULLを0に置換してください。

```sql
SELECT COALESCE(SUM(colname), 0) FROM tablename
```

# 参考資料
- Firebird Null Guide
    - [Aggregate functions](http://firebirdsql.org/manual/nullguide-aggrfunc.html)
macにpyenvを入れたらrailsが動かなくなった時の対応メモ

以下の記事を頼りに`rake rails:update:bin`を打ってみた。
http://qiita.com/QUANON/items/636be47e4261962062e9

すると、原因は
`Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib`
だと判明。

上記でググるとこちらの記事が出てきたので、説明通りにhomebrewでreadlineを7から6に切り替えたところ無事復活しました。
http://blog.skylarking.me/2016/10/07/psql-readline-error/

めでたしめでたし。
Trelloのフォントをきれいにする

Trelloのフォントが気に入らなかったのでちょっと修正しました。
![trello.gif](https://qiita-image-store.s3.amazonaws.com/0/115844/062065eb-9b26-e2e1-90f1-fc91c17b7d8e.gif)

#前提
mac
Chrome

#ScriptAutoRunner Install
まずは、[ScriptAutoRunner](https://chrome.google.com/webstore/detail/scriptautorunner/gpgjofmpmjjopcogjgdldidobhmjmdbm) という JavaScript を自動実行させる拡張機能をインストールします。

#JavaScript追加
ScriptAutoRunner のオプションページで ![スクリーンショット 2017-02-25 23.07.09.png](https://qiita-image-store.s3.amazonaws.com/0/115844/43d94be6-a76f-2023-c78d-8bff4f6223e4.png) をクリックし、Script の中に以下のスクリプトをコピペします。

```
function a(){
  $('.list-card-title').css({'font-family':'Meiryo, Arial','font-size':'12px','padding':'8px'});
};
setInterval("a()",1000);
```
#有効化

コンセント部分と壁部分をクリックします。
黄色になって通電するような感じになったら有効化できてます。

![a5420b8d-e440-86c6-2beb-dd8d0585baf1.gif](https://qiita-image-store.s3.amazonaws.com/0/115844/3f9c2a2a-c86c-8bb1-7449-dca0dc1f42a3.gif)

#補足
Target hostname に trello.com と入れておいたほうがいいかもしれません。たぶん他サイトのときは js 動かなくなる機能だと思うので余計なオーバーヘッドが発生しなくなります。

#動作確認
ブラウザで Trello を開くか更新します。jsが動いてフォント変更されたことを確認します。
![trello.gif](https://qiita-image-store.s3.amazonaws.com/0/115844/ee5739fd-d4a9-486d-bddc-a0ce2b4660a7.gif)
Amazon Linux (EC2) Apacheを自動起動する設定


# OS再起動時に、Apacheも起動するように設定する

chkconfig コマンドを使用して、システムがブートするたびに Apache ウェブサーバーが起動するように設定します。

```bash
[ec2-user ~]$ sudo chkconfig httpd on
```

**Tip**
chkconfig コマンドでは、それを使用してサービスを正常に有効にしたときに確認メッセージは一切表示されません。
httpd が有効になっていることは、次のコマンドを実行して確認できます:

```bash
[ec2-user ~]$ chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

ここで、httpd は実行レベル 2、3、4、5 で on になります (これが表示したい対象です)。
テキスト読み上げサービスのAmazon Pollyをつかってテキストの音声ファイルをコマンドラインで入手し正規化する


作っているアプリで多言語で、単語の音声読み上げが必要だったのでPollyを使うことにしました。
Pollyはテキストを指定すると多言語でテキストを読み上げたり、その音声ファイルを取得できたりします。

今回は以下の手順で最終的に音声ファイルを作成します。

1. MacOSでの環境構築
2. 1ファイルの変換
3. 多数のファイルを同時に変換

# MacOSでの環境構築

awscliなど各種導入します

```bash
brew install awscli
brew install sox  # 音声の正規化用
brew install vorbis-tools  # wavからoggに変換
```

# 1ファイルの変換

例えば`Hello`という単語を発音させたファイルをPollyから取得し、変換するには以下のようにします。

```bash
# PollyからHelloをPCMでローカルに出力
aws polly synthesize-speech \
  --output-format pcm --voice-id Salli --sample-rate 16000 \
  --text "Hello" \
  --region us-west-2 \
  Hello.raw

# Wavに変換。Pollyは音声が小さいので正規化もしています。
sox -r 16k -e signed -b 16 -c 1 Hello.raw Hello.wav norm

# Oggに変換
oggenc Hello.wav -o Hello.ogg
```

# 複数言語、複数テキストを効率的に変換

`text.csv`を作ってそれを、`convert.rb`で変換します。convert.rbの$awscli_profileは各自適切なものにします。

```text
filename,jajp,enus,engb
Dog,いぬ,Dog,Dog
Cat,ねこ,Cat,Cat
```

```ruby
require 'csv'
require 'fileutils'
require 'parallel'

$language_voice = {
    jajp: 'Mizuki',
    enus: 'Salli',
    engb: 'Emma',
}
$tmp_dir = 'tmp'
$out_dir = 'out'
$input_file = 'text.csv'
$awscli_profile = 'profile'

def convert(file, lang, text)
  tmp_dir_path = "#{$tmp_dir}/#{lang.to_s}"
  out_dir_path = "#{$out_dir}/#{lang.to_s}"
  [tmp_dir_path, out_dir_path].each do |dir|
    FileUtils::mkdir_p dir
  end

  voice = $language_voice[lang]
  command = "aws polly synthesize-speech \\
    --output-format pcm --voice-id #{voice}  --sample-rate 16000 \\
    --text '#{text}' \\
    --profile #{$awscli_profile} \\
    --region us-west-2 \\
    #{tmp_dir_path}/#{file}.raw"
  system(command)

  command = "sox -r 16k -e signed -b 16 -c 1 #{tmp_dir_path}/#{file}.raw #{tmp_dir_path}/#{file}.wav norm"
  system(command)

  command = "oggenc #{tmp_dir_path}/#{file}.wav -o #{out_dir_path}/#{file}.ogg"
  system(command)
end

csv = CSV.table($input_file)

[$tmp_dir, $out_dir].each do |dir|
  FileUtils.rm_rf dir
  FileUtils::mkdir_p dir
end

Parallel.each(csv.each_entry, in_processes: 20) do |row|
  filename = row[0]
  1.upto(row.size) do |i|
    next if row[i].nil?
    p "#{filename} #{row[i]} #{csv.headers[i]}"
    convert(filename, csv.headers[i], row[i])
  end
end
```

parallelは標準では、入っていないのでbundle installなどでいれておきます。
bundlerの場合は、`bundle exec ruby convert.rb`で実行するとout以下にファイルができます。
kali 2016.2 をvirtualboxにインストール

インフルエンザになって暇になったので、2年ぶりにkaliをインストールしてみた。

現行のバージョンon VirtualBoxだとGest Additions CDが入らないため、回避方法等、memo残しときます。


####①今回はisoからマウントし、日本語を選択してインストール
>Kali Linux Downloads
>https://www.kali.org/downloads/


####②起動したらアップデートを実行
```apt update＆apt -y dist-upgrade```

めっちゃ時間がかかる。
こんな感じになった。

![kali (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/162316/34d20acd-9f8e-6071-4027-35782a0ae1fa.jpeg)


やり直したくないのでスナップショットを取得しておく


####③Gest Additions CDの代わりに以下を実行
```apt -y install virtualbox-guest-x11```

これがGest Additions CDの代わりになる。
再起動したら共有フォルダ等使えるようになりました。

####④updateしたら時間がずれてたのでロケールを追加

```sudo locale-gen ja_JP.UTF-8```

####⑤日本語入力したい

mozcはkaliには使えないそう。

```apt install uim uim-anthy```
※必ず、すぐに再起動

ブラウザも日本語化
```apt install firefox-esr-l10n-ja```


家のルーターのパスワードを忘れてしまったので助けてもらいます。
ちなみにkaliってヒンズー教の破壊神だそうです。
javascript(ES2015) - 配列

# 配列
## 配列要素の操作
### 配列の最後の要素にアクセス

``` js
let array = ["a","b","c","d"]; 
array[array.length - 1]; 
```

### 最後に要素を追加(push)
``` js
array.push("e"); //["a","b","c","d","e"]
```

### 最後の要素を削除(pop)
``` js
array.pop(); //["a","b","c","d"]
```

### 先頭の要素を追加(unshift)
```
array.unshift("0"); //["0","a","b","c","d"]
```

### 先頭の要素を削除(shift)
``` js
array.shift(); //["a","b","c","d"]
```

## 配列の結合(concat)
``` js
let array1 = ["a","b","c"];
let array2 = array1.concat("4","5","6");
console.log(array2); //["a", "b", "c", "4", "5", "6"]
```

## 配列の一部分を取得(slice)
``` js
let array1 = ["a","b","c","d","e","f"];
let array2 = array1.slice(3); //3番目(4番目)から最後までの要素を取得。第2引数を省略すると最後まで取得
let array3 = array1.slice(2,4); //2番目から3番目の一つ前の要素を取得

console.log(array2);　//["d", "e", "f"]
console.log(array3); //["c", "d"]
```

## 配列の任意の場所を書き換える(splice)
- 第一引数：変更を開始する配列の位置
- 第二引数：削除する要素の数(0を指定で要素を削除しない)
- 第三引数：追加する要素を探す

```js
let array1 = ["a","b","c","d","e","f"];
let array2 = array1.splice(2,0,"1","2","3"); //2番目の位置から["1","2,"3"]を追加

console.log(array1);　　//["a", "b", "1", "2", "3", "c", "d", "e", "f"]

array2 = array1.splice(2,3); //2番目から3つの要素を削除
console.log(array1);　//["a", "b", "c", "d", "e", "f"]
console.log(array2); //["1", "2", "3"] 削除した要素を配列に格納してる
```

## 配列内の要素の削除や置換(copyWithin)
- 第一引数：配列のどこにコピーするかの場所
- 第二引数：コピーを開始する場所
- 第三引数：コピーを終了する場所

```js
let array1 = ["1","2","3","4","5"];
let array2 = array1.copyWithin(1,2); //1番目の位置から置き換える。2番目から最後の要素までコピーする

console.log(array1);　　//["1", "3", "4", "5", "5"]

let array3 = array1.copyWithin(2,0,2); //2番目から書き換える。0番目から2番目までコピーする
console.log(array3);　　//["1", "3", "1", "3", "5"]
```

## 配列を特定の値で埋める
```js

let array1 = new Array(5).fill("a"); //大きさ5の配列を作成して全部の要素をaに指定する。
console.log(array1);  //["a", "a", "a", "a", "a"]
```

## 配列の各要素に対して同じ処理を行う。配列の高速列挙 - forEach()
### 構文
```js
array.forEach(function (value, index, array) {
  // 配列の各要素に対する処理
});
//value：現在処理されている配列の中身の値
//index：何番目の値が処理されているのかを示す値
//処理している配列
```

```js
let array1 = ["1","2","3","4","5"];
array1.forEach(function (value, index, array) {
  console.log(array + "の"　+ index + "番目の値は："　+ value);
});
```

## 配列の要素すべてに対して、同じ処理を適用した新しい配列を生成する - map()
### 構文
```js 
var newArray = array.map(function (value, index, array) {
  // 配列の各要素に対する処理
  return newValue;
});
```

### 例：配列の中の要素を2倍にする
``` js
function twice(value) {
  return value * 2;
}

var array1 = [1,2,3,4];
var arrayTwice = array1.map(twice);
console.log(arrayTwice); //[2, 4, 6, 8]
console.log(array1); //[1, 2, 3, 4]
```

## 配列の中から条件に一致する要素をフィルタリングした新しい配列を生成する - filter()
### 例：偶数の値のみを残した配列を生成
```
function even(value) {
  return value % 2 == 0;
}
var array2 = [1, 2, 3, 4, 5];
var evens = array2.filter(even);
console.log(evens); //[2, 4]
```

## 配列の中から一つの値を求める - reduce()
### 構文
```
var result = array.reduce(function (previous, current, index, array) {
  return previousとcurrentに対する処理;
}, initial);

//previous：前回の処理結果の値
//current：現在入れられている値
//initail：初期値
```

### 例　：配列の合計値を求める
```
function add(a,b){
  return a + b ; 
}

var array3 = [1,3,5,7,9];
var adds = array3.reduce(add);
console.log(adds); //25
```
ErgoDox のレイヤーの一時的な切り替えがうまくいかないとき

# 概要

ErgoDox で、レイヤーの一時的な切り替え(LT, MO)がうまくいかないような感じがあった
具体的にはレイヤーは切り替わるが、切り替えキーを離しても
もとのレイヤーに戻ってこない

## 一時的な脱出

トグルスイッチを設定しているキーを教えて元のレイヤーに戻ってきたが、
どんなときにうまくいかないのか調べてみた

# 結論

切り替えに使うキーが、切り替えた先のレイヤーで何かのキーを割り当てているとどうもうまく行かないようだ
vagrant up 時のinaccessibleのerror対処


```vagrant up``` 時に下記エラーで起動できなかった。
対処方法は、参考サイトのまま。


```
Your VM has become "inaccessible." Unfortunately, this is a critical error
with VirtualBox that Vagrant can not cleanly recover from. Please open VirtualBox
and clear out your inaccessible virtual machines or find a way to fix
them.
```

```vagrant status``` で確認。

```
Current machine states:

default                   inaccessible (virtualbox)

The VM is inaccessible! This is a rare case which means that VirtualBox
can't find your VM configuration. This usually happens when upgrading
VirtualBox, moving to a new computer, etc. Please consult VirtualBox
for how to handle this issue.
```

VirtualBoxを立ち上げて、対象のVMを除去して再度 ```vagrant up``` を実行して解決。

***
参考サイト

* [vagrant upしたらまたエラーが出たので解消する](http://motomichi-works.hatenablog.com/entry/2015/01/21/113452)
docker for Mac対象でディスク削減

これ叩いたら、10GBぐらいディスク空いた。素晴らしい。
docker古いと、`docker system prune` ないと思うから消してね。

```bash:docker-disk-optimize.sh
#!/bin/bash
echo y | docker system prune
cd ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux || exit
mv Docker.qcow2 Docker.qcow2.org
qemu-img convert -O qcow2 Docker.qcow2.org Docker.qcow2
ls -lh Docker.qcow2 Docker.qcow2.org
rm Docker.qcow2.org
```


```bash:結果
./docker-disk-optimize.sh

WARNING! This will remove:
        - all stopped containers
        - all volumes not used by at least one container
        - all networks not used by at least one container
        - all dangling images
Are you sure you want to continue? [y/N] Total reclaimed space: 4.21 GB

-rw-r--r--  1 t00114  CATK\Domain Users   7.9G  2 27 13:45 Docker.qcow2
-rw-r--r--  1 t00114  CATK\Domain Users   16.2G  2 27 13:33 Docker.qcow2.org
```

## 参考
[Docker] docker.qcow2のサイズを小さくする回避策 – しゃまとんのたね http://shamaton.orz.hm/blog/archives/326
VisualStudio 2015 CSSAutoSync が効かない時

Web.Config に以下を追加する

```
<cofiguration>
  <system.webServer>
    <handlers>
      <add name="Browser Link for HTML" path="*.html" verb="*"
           type="System.Web.StaticFileHandler, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
           resourceType="File" preCondition="integratedMode" />
    </handlers>
  </system.webServer>
</configuration>
```
Browser Link Dash Board でLinkしているURLが表示されていれば有効になっている
![image](https://qiita-image-store.s3.amazonaws.com/0/118025/1ed1861e-1b6b-f472-4970-5760b955b929.png)


Static Html の場合上記をWeb.configに追加すると、CSSを編集すると即座に反映される。
上記の記載が無い場合はBrowserをRefreshする必要がある。
https://docs.microsoft.com/en-us/aspnet/visual-studio/overview/2013/using-browser-link
Vagrant&gitで開発時に、git cloneするごとにパーミッションが書き換わる問題。

最近、vccwを使って開発していると、git clone　するごとにパーミッションが書き換わるという問題にあたりました。
http://vccw.cc/

644（リモートレポジトリ） → 755（ローカルリポジトリ）

そこで、調べたところ以下の記事があったので、
http://stackoverflow.com/questions/1580596/how-do-i-make-git-ignore-file-mode-chmod-changes


`git config core.fileMode false`を実行しました。


再度、cloneしても問題が発生しなかったので解決したと思われます。
Rubyでお手軽パスワード生成

#これ
つ`[*'A'..'Z', *'a'..'z', *0..9].shuffle[0..7].join`

こんなのがこの世界に生まれてくる
`WyjbLm8N`

#どうしてこれを？
[「なぜパスワードを記憶するべきではないのか」を簡単に説明したムービー](https://gigazine.net/news/20170217-stop-memorizing-password/)

私はパスワード記憶+使い回し勢なのですが、上記の記事を読んで記憶勢も時間の問題じゃね。
という気持ちになって怖くなりました。

1passwordとか便利そうなものもあるみたいだけど、
mac版やけに高いしそんなん買うぐらいだったら映画何本も買えるじゃん・・・。
そこで私の抱えるこの全ての悩みをRubyに解決してもらうことにしました。ty Matz :)

Rubyを勉強し始めて間もないガチのプログラミング初心者（脚本家をやっております）でして、
おかしな点あったらご指摘ください。指摘してくださる人、私、好き**<3**
~~そもそもパスワードってこうやって作成していいもんなの？いいもんだよね？~~
#参考
[複数の Range を結合する](http://qiita.com/misopeso/items/ce86bda598da280c5c27)
[Combining two different 'ranges' to one in ruby](http://stackoverflow.com/questions/21404323/combining-two-different-ranges-to-one-in-ruby)
[Ruby :: メソッド引数のアスタリスクの意味](http://tm.root-n.com/programming:ruby:etc:parameter_asterisk)
CircleCIでLaravelのMySQLを使ったテストを実行する

CircleCI2.0対応版もあります https://qiita.com/kazuhei/items/29ee2c3cbd5960814959

# 概要

LaravelのMySQLを使ったテストをCircleCI上で実行します。
CircleCI上でマイグレートとシーディングを行い、
テストデータが入った状態でテストを実行できるようにします。

やることは

- Laravel側にCircleCI用のデータベース設定を追加
- circle.ymlにテスト用の設定を追加

の2つです。

# Laravel側にCircleCI用のデータベース設定を追加
CircleCIのMySQLの設定のデフォルト値は


| 設定項目 | 値 |
|:-----------|------------:|
| database | circle_test |
| username | ubuntu |
| password | 空文字 |

というふうにあらかじめ用意されているので、特に問題なければ以下のようにします。

```php:config/database.php
    'connections' => [
        'circle_test' => [
            'driver' => 'mysql',
            'host' => '127.0.0.1',
            'port' => '3306',
            'database' => 'circle_test',
            'username' => 'ubuntu',
            'password' => '',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
    ]
```

# circle.ymlにテスト用の設定を追加
circle.ymlに設定を追加して、マイグレーションとシーディングができるようにしていきます。

最終的には

`````yaml:circle.yml
machine:
  php:
    version: 7.1.0
  environment:
    DB_CONNECTION: circle_test
    APP_ENV: testing
  services:
    - mysql

database:
  override:
    - "php artisan migrate"
    - "php artisan db:seed"
```

こんな感じになります。

## 環境変数を追加

```yaml:circle.yml
machine:
  php:
    version: 7.1.0
  environment:
    DB_CONNECTION: circle_test
    APP_ENV: testing
  services:
    - mysql
```
DB_CONNECTIONに先ほどLaravelの方で設定したcircle_testを指定します
APP_ENVにtestingを指定しています。
これを指定しないとFeatureテストでPOSTをテストする時にCSRFトークンのチェックでテストがコケます。

## マイグレートとシーディングを実行

```yaml:circle.yml
database:
  override:
    - "php artisan migrate"
    - "php artisan db:seed"
```

見たままです。
Webpackを使う時は、resolve.modulesの設定に気を付けよう。(特にModule not found: Error: Can't resolve～が表示された時)

#resolve.modules
ひっそりと書いてありますが・・
https://webpack.js.org/configuration/resolve/#resolve-modules

>
```
resolve.modules defaults to:
modules: ["node_modules"]

これ、結構重要です。
デフォルトは、"node_modules"

>
```
If you want to add a directory to search in that takes precedences over node_modules/:
modules: [path.resolve(__dirname, "src"), "node_modules"]

変更する時は、設定例にあるように
"node_modules"を残します。

このページを見た方が、設定の全体像がつかみやすいかも。
[Configuration - Options](https://webpack.js.org/configuration/)

#resolve.modulesに書いてある"node_modules"を、うっかり消してしまうと・・
ビルド時や、webpack-dev-serverの実行時などに、
`Module not found: Error: Can't resolve ～～`
という感じに、おこられます。

原因は、`import`とか`require`しているものが、node_modulesの中にあるから。

でも、はっきり言って、気づきません。
Issueを上げてる人もたまにいますが、
再現しないよ？`npm install`してないんでしょ？と言われて終わりです。

ということで、Webpackのハマリぽいんとでした。

#蛇足1
`node_modules/.bin/`にある`.cmd`が付いているコマンドを直接実行する場合は、
そのファイルに書いてあるパスを変更しないと動かないようなので、めも。
(元のファイルは、カレントディレクトリが`node_modules/.bin/`になっている事をを想定している？)

(例)`node_modules/.bin/webpack-dev-server.cmd`の場合

カレントディレクトリが、作業フォルダと同じ(直下に`node_modules`がある)場合
(動く)`"%~dp0\node_modules\webpack-dev-server\bin\webpack-dev-server.js"`
(変更前)`"%~dp0\..\webpack-dev-server\bin\webpack-dev-server.js"`

フォルダの位置の参考資料：
[npm-folders](https://docs.npmjs.com/files/folders)

フォルダ構成の参考資料：
[Node: Command Line Options --preserve-symlinks](https://nodejs.org/api/cli.html#cli_preserve_symlinks)
preserve-symlinksの所にある図が、わかりやすいかと思います。
この図で、作業フォルダに相当するのは、`{appDir}/app/`

>
```
{appDir}
 ├── app
 │   ├── index.js
 │   └── node_modules
 │       ├── moduleA -> {appDir}/moduleA
 │       └── moduleB
 │           ├── index.js
 │           └── package.json
 └── moduleA
     ├── index.js
     └── package.json
```

#蛇足2
Webpack用のプロジェクトのテンプレートなどでは、作業フォルダの中に、さらに作業フォルダを作る構成になっているようです。
(こんな感じの構成になっています。どの設定ファイルが使われるか、間違いやすい・・)

```
/ 作業フォルダ(本来のフォルダ)
L node_modules
L package.json
L その他設定ファイル
L   /作業フォルダ(サイト1用)
    L node_modules
    L package.json
    L その他設定ファイル
```
PermissionsDispatcher、kotlin を添えて

2017/02 当時の情報で、現在は `generateStubs = true` は不要なはずです。
情報が古いので README https://github.com/permissions-dispatcher/PermissionsDispatcher を参照して下さい。



いつも調べ直す割に見付け辛いので。

```groovy:app/build.gradle
kapt {
    generateStubs = true
}

dependencies {
    compile 'com.github.hotchemi:permissionsdispatcher:2.3.1'
    kapt 'com.github.hotchemi:permissionsdispatcher-processor:2.3.1'
}
```



参考
====

https://github.com/hotchemi/PermissionsDispatcher/blob/master/.github/ISSUE_TEMPLATE.md
http://qiita.com/laprasDrum/items/417b48972ddefdc3b2cd
SourceTreeでCommitメッセージやハッシュ値が書いてあるエリアが非表示になったときに治す方法

・・・無くなったの仕様だと思ってました。
が、新しくセットアップしたMacのSourceTreeみたら表示されてて仕様じゃないと気がつきました。

# 現象
以下画像のように、フルコミットメッセージが出ていることが期待されるところで出ていない。

![Screen Shot 2015-04-27 at 9.18.48 AM.png](https://qiita-image-store.s3.amazonaws.com/0/93918/22132401-eac6-1eb9-89b5-f7b4338e59a9.png)
※ 転載元: https://answers.atlassian.com/questions/15282793/sourcetree-how-to-show-commit-information-panel

## 期待値
![Screen Shot 2015-04-27 at 9.17.15 AM.png](https://qiita-image-store.s3.amazonaws.com/0/93918/18ebd1b4-3ca4-4d27-62ac-cc6dfb4b0983.png)
※ 転載元: https://answers.atlassian.com/questions/15282793/sourcetree-how-to-show-commit-information-panel


# 対策
① .plist形式を編集出来るXcode等をインストールしておき、

```
$ open ~/Library/Preferences/com.torusknot.SourceTreeNotMAS.plist
```

を実行。

② `repowindow_LogViewDescSplitter` で検索(Cmd+F等)
![あ.png](https://qiita-image-store.s3.amazonaws.com/0/93918/895d3f37-2a16-ecf2-faff-1dfd1d9bb62c.png)


③ 検索でHitしたやつを削除(Del)&保存(Cmd+S等)

④ SourceTree再起動＆治ってる


# 参考
https://answers.atlassian.com/questions/15282793/sourcetree-how-to-show-commit-information-panel
別の画面が開いたウインドウを閉じる方法

## 親子関係がない画面を閉じる方法
ポイントは、開いた画面(sample.html)に[window.name]を指定する


```html:open.html
<html>
<head>
  <meta charset="utf-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  <script type="text/javascript">
  $(document).ready(function(){
      $('#open').on('click',function(){
       NewWin();
      });

    function NewWin() {
      var key = "hoge";
      win = window.open( "sample.html",key);
    }
  });
  </script>
</head>
<body>
  <form>
  <input type="button" id="open" value="子画面開く">
</form>
</body>
</html>
```


```html:sample.html
<html>
<head>
  <meta charset="utf-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  <script type="text/javascript">
  $(document).ready(function(){
      window.name = 'hoge'
  });
  </script>

</head>
<body>
  aaaaa
</body>
</html>
```


```html:close.html
<html>
<head>
  <meta charset="utf-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  <script type="text/javascript">
  $(document).ready(function(){
      $('#close').on('click',function(){
       NewWin();
      });
    function NewWin() {
      var key = "hoge";
      win = window.open("",key)
      win.close();
    }
  });

  </script>

</head>
<body>
  <form>
  <input type="button" id="close" value="子画面閉じる">
</form>
</body>
</html>
```


以下の画面を閉じたら、開いた画面(sample.html)も閉じます。

```html:close.html
<html>
<head>
  <meta charset="utf-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  <script type="text/javascript">
  $(document).ready(function(){
      $('#open').on('click',function(){
       NewWin();
      });

    function NewWin() {
      var key = "hoge";
      win = window.open( "sample.html",key);
    }
  });

  </script>

</head>
<body>
  <form>
  <input type="button" id="open" value="子画面開く">
</form>
</body>
</html>
```
「フォーム再送信の確認」が表示された時の対策方法

SESSIONを開始しているところで、以下のように書いく

```php
session_start();
header('Expires:-1');
header('Cache-Control:');
header('Pragma:');
```

header()でセミコロンの右に何も書かないと、PHPは何も送出しない。
session_start()のHTTPヘッダー送出を上書きし、結果的に何も送出しない。

[参照](https://web.archive.org/web/20170801141016/http://wp.asibar.com:80/archives/242)
iframe（子ページ内）でリンクをクリックしたときに、親ページを上部に移動する

子ページに下記を記述。

```
<script type="text/javascript">
$(function(){
	$('.hoge a').click(function(){
		$('html,body',parent.document).animate({scrollTop:-9999},0);
	});
});
</script>
```

当然、別途jQueryも読み込む。

子ページのhogeクラスにあるa要素をクリックすると、0秒で親ページが上部に移動します。

-9999という値は、親ページがこれだけ移動すれば上部になるだろうと雑な感じです。

親ページが10000px以上もある縦長のページなら値を変更する必要があります。

親ページの縦サイズを取得して、移動する値に入れる方が、もっとスマートな感じになると思います。

試してみたけど、移動を slow にすると途中で止まるから、諦めて雑な値を入れた所存です。
RancherでStack作成時に、「Timeout getting IP address」が出てコンテナが起動しない

### 現象
+ RancherからStack作ると以下のエラーが出るようになった

```
Timeout getting IP address
```

+ これは、コンテナ内で名前解決が一切できなくなって、
IP取得がうまくいってないせいだと思われる.
(コンテナ入って、確認したところ一切名前解決できていなかった)

### 対策

+ 以下のコマンドをAgent側で実行(centOSの場合  *他OSは適宜変更お願いします)

```
# Dockerを停止
/etc/init.d/docker stop

# brctl(ブリッジ接続に関するツール)をインストール
yum install bridge-utils

# natの設定を削除(違うかもです)
iptables -t nat -F

# インタフェースdocker0を停止
ifconfig docker0 down

# brctl を利用して docker0 を削除
brctl delbr docker0

# Dockerを起動
/etc/init.d/docker start
```

+ これを実行した後、もともと動いているコンテナが
Rancherで認識されなくなった。
+ おそらく、ネットワーク構成がいろいろ変わったので
再認識させる必要あり。
+ もっといい方法があるかもしれないが、以下で対策。
  - agentをRancherから削除
  - agent側のRancherに関するコンテナ削除
  - agentをRancherに再登録
  - これでも復活しないコンテナ・Stackは再作成

以上。
プレミアムフライデーを求める処理を作った

# はじめに
プレミアムな方々、こんにちは。
プロパー社員が帰宅する中、絶賛運用作業してまして…
そんな鬱々とした気持ちをPowerShellに吐き出しました。

# 環境
- PowerShell2.0

# ソースコード
```プレミアムフライデー.ps1
<#
プレミアムフライデーの日付を求める
引数で与えられた年月に対応するプライムフライデーの日付をyyyy/mm/dd形式で出力する
[引数]0:年
      1:月
#>

# 引数チェック
if ($args.Length -ne 2) {
    "引数は[年（YYYY形式）] [月（MM形式）]で指定してください。"
    exit 1
}
try {
    $datetime = New-Object DateTime $args[0], $args[1], 1
} catch {
    "引数は[年（YYYY形式）] [月（MM形式）]で指定してください。"
    exit 1
}

if (($args[0] -lt 2017) -or (($args[0] -eq 2017) -and ($args[1] -eq 1))) {
    "プレミアムフライデーの導入は2017年2月からです。"
    exit 1
}

$year = $args[0]
$month = $args[1]

# プレミアムフライデー判定
$monthEndDay = $datetime.AddMonths(1).AddDays(-1)
$monthEndDayOfWeekNumber = [Int32]$monthEndDay.DayOfWeek
$fridayNumber = [Int32][DayOfWeek] "Friday"
if ($monthEndDayOfWeekNumber -eq $fridayNumber) {
    $monthEndDay.ToShortDateString()
} elseif ($monthEndDayOfWeekNumber -gt $fridayNumber) {
    $monthEndDay.AddDays(-($monthEndDayOfWeekNumber - $fridayNumber)).ToShortDateString()
} else {
    $monthEndDay.AddDays(-($monthEndDayOfWeekNumber + 2)).ToShortDateString()
}
exit 0
```

# おわりに
日本のみんなにプレミアムな金曜日が来るといいですね。

# 参考
[プレミアムフライデーを求めるメソッドを作った](http://qiita.com/neko_the_shadow/items/4ebf94a8a6d9282e7207)
SSDのマウント

 centOS 7 で新しくSSDを取り付けて/tmpをマウントした時の流れ

#    パーティションの作成
新しく取り付けたSSDが/dev/nvme0n1に割り当てられていたので、まずはfdiskでパーティションを作成
設定はそのままデフォルト、初期値を使用

    # fdisk /dev/nvme0n1
    コマンド (m でヘルプ): n
    Select (default p): p
    パーティション番号 (1-4, default 1): 1
    最初 sector (2048-500118191, 初期値 2048): 
    初期値 2048 を使います
    Last sector, +sectors or +size{K,M,G} (2048-500118191, 初期値 500118191): 
    初期値 500118191 を使います
    
    コマンド (m でヘルプ): p
    
    コマンド (m でヘルプ): w

#    SSDをフォーマット
今回はext4にフォーマット

    # mkfs -t ext4 /dev/nvme0n1


#    マウント
OSが再起動してもmountsされるように/etc/fstabに設定を書き加える。

    # vim /etc/fstab
以下のように記述

    /dev/nvme0n1 /tmp    ext4    defaults    0 0

書き加えたら以下のコマンドでマウントを実行

    # mount -a
    
とりあえずマウントされているか確認

    # df -T /tmp
    ファイルシス   タイプ 1K-ブロック  使用    使用可 使用% マウント位置
    /dev/nvme0n1   ext4     246003316 61464 233422516    1% /tmp
RuntimeError: Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.

`Using TensorFlow backend.
Traceback (most recent call last):
  File "mnist-cnn.py", line 14, in <module>
    from keras.utils.visualize_util import plot
  File "/usr/local/lib/python2.7/dist-packages/keras/utils/visualize_util.py", line 13, in <module>
    raise RuntimeError('Failed to import pydot. You must install pydot'
###<b>RuntimeError: Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.</b>`

#上記のエラーが出た時

sudo apt-get install graphviz
pip install graphviz
pip install pydot==1.1.0
を行った。

on Ubuntu 16.04.
荒々しくwikipediaから本日の出来事をランダムに取得するslackbot


*(2017/02/27段階)*
Elixir-Slackをベースに改造を加えたbotを社内slackに常駐させています。
最近は新機能追加ネタに困っていたのですが、ふと毎朝botに挨拶をさせ、ついでにwikipediaの本日の出来事を投稿させようかと思い立ちました。
荒々しいので想定したwikipediaの記述ルールなどが崩れたら破綻します・・。

- Elixir-Slack : https://github.com/BlakeWilliams/Elixir-Slack


# wikipediaの本日の出来事ページ

wikipediaには月日で検索するとその日に起きた出来事一覧のページを表示することができます。
URLとしては「 https://ja.wikipedia.org/wiki/2月27日 」(2月27日の場合）となります。
このページには、この月日に起きた歴史的な出来事と有名人の誕生日などが載っています。
誕生日を取得しても面白そうだったのですが、今回は出来事に絞っています。
(botの出力で、「〜の日です」と楽に出したかったのですが、誕生日は人物名で文が終わっていて合わなかったため）

# HTMLを眺める
何らかの法則でパースできないかベガ立ちならぬベガ座りで腕組みしながらHTML全体を眺めます。
実サービスで利用するわけではないので、できるだけ低コストで楽に作り上げたいという気持ちがとても強い状態です。

# パースの仕方の決定
この辺が荒々しい部分。
雑に以下の法則に気がつきます。

- 出来事や誕生日は`<li>`タグで表現されている（他の項目も含む）
- 出来事や誕生日は行の始まりから`<li>`タグ
- 出来事や誕生日には「 - 」という3文字を含む
- 出来事は「。`</li>`」で終わる

こんな感じでしょうか。

```elixir
String.match?(x, ~r/^<li>.*/) && String.match?(x, ~r/。<\/li>/) && String.match?(x, ~r/ - /)
```

# HTMLの処理の仕方
ここも荒々しい・・。

- HTMLを改行ごとにsplitしてarrayを作成
- arrayに対して出来事行だけを取得するようにfilter
- filter結果から1つをrandomで取得
- 取得した行をbotが話す形に整形

```elixir
response.body
|> String.split("\n")
|> Enum.filter(fn(x) ->
  String.match?(x, ~r/^<li>.*/) && String.match?(x, ~r/。<\/li>/) && String.match?(x, ~r/ - /)
end)
|> Enum.random()
```

と、取れましたね・・（汗

# 出来事行の処理
botには以下の形で最終的に話させたいと思います。

```
「出来事(XXX年) の日」
```

しかし実際に取れるのはこんな形

```
<li><a href="/wiki/xxxxxxxxxx" title="YYYY年">YYYY年</a> - <a href="/wiki/xxxxxxxxxxxxxxxxxxxxxxxxx" title="hoge">hoge</a>: 出来事</li>
```

こんな感じで処理をします。

```elixir
# 年と本文を切り分けてそれぞれ整形する（タグを除去）
splitLi = String.split(randomLi, " - ")
year = Enum.at(splitLi, 0)
year = String.replace(year, ~r/<.*?>/, "")

dekigoto = Enum.at(splitLi, 1)
dekigoto = String.replace(dekigoto, ~r/<.*?>/, "")

# 連結して結果を作成（長すぎるときは頭だけ返すようにしたい） TODO
result = dekigoto <> "(" <> year <> ")"
```

# 結果
荒くやった割には動いていますね・・。
ただもうちょっと平和的な内容がいいな・・。
![スクリーンショット 2017-02-27 11.25.04.png](https://qiita-image-store.s3.amazonaws.com/0/57142/69ae3cb2-4973-62a5-d787-b6e40ee07805.png "スクリーンショット 2017-02-27 11.25.04.png")


# おまけ
いつも同じような投稿を繰り返すbotは語尾とか一部を変えると、少しだけですが面白くなると思っています。
例えばこの機能の場合は「おはようございます部」「今日も頑張りましょう部」が変化するようになっています。

```elixir
 @ohayo ["おはようござます。", "おはようござます！", "おはようござます(^o^)", "おはようござます(-_-)", "おはようござます(^_^)"]
  @gobi ["今日も一日頑張りましょう！p(^_^)q", "さて仕事仕事..", "今日も一日頑張りましょう！♪( ´▽｀)", "今日も一日頑張りましょう！(￣▽￣)"]
  
def hogehoge() 
  Enum.random(@ohayo) <> "\n"
  ...
  <> Enum.random(@gobi)
end
```
angular-cli@v1.0.0-rc.0になってVS Codeがエラーだらけになった

#angular-cli@v1.0.0-rc.0になってVS Codeがエラーだらけになった
2017/02/25に@angular/cliのrcがリリースされた。
今まで何もエラー表示がなかったソースがエラー表示だらけになってしまった。
いろいろ設定を変え元に戻るまでの備忘録。

## エラー表示になった箇所
```ts:~~~.service.ts
handleKeyboardEvent(event: KeyboardEvent): number { }　// ←[ts] Cannot find name 'KeyboardEvent'.
handleMouseMoveEvent(event: MouseEvent): number { }　// ←[ts] Cannot find name 'MouseEvent'.
constructor( @Inject('Window') private window: Window) { } // ←[ts] Cannot find name 'Window'.
```

上記のエラーはエディター上はエラーになっているが、```ng build, ng serve, ng test```では
エラーにならずにちゃんと通る。
原因は@angular/cli@v1.0.0-rc.0からtsconfig.jsonが分割されたことによって
VSCodeが読み込む設定のlibに```dom```が含まれていないのが原因だった。

```json:tsconfig.json
{
  "compileOnSave": false,
  "compilerOptions": {
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "target": "es2016",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": [
      "es2016", "dom"←！！！ここにdomを追記する！！！
    ]
  }
}
```
SSH しか使えない Git リポジトリに置いた Golang パッケージを dep で管理する

SSH しか使えない Git リポジトリにコミットされた Golang パッケージを、dep で管理したい、という場面が出てきたので、とりあえず github のプライベートリポジトリで試してみました。

今回は、メインアプリ `github.com/tily/goprivatea` から、パッケージ `github.com/tily/goprivateb` をインポートしてみます。


## `goprivateb` (インポートされる側) の内容

goprivateb リポジトリにはこんな感じの `main.go` しかコミットされていません。

```go
package goprivateb

import (
        "fmt"
)

func HelloFromGoPrivateB() {
        fmt.Println("Hello from Go Private B")
}
```

## `goprivatea` (メインアプリ側) での開発しはじめる

`$GOPATH/src/github.com/tily/goprivatea` で作業します。
まず、goprivateb を呼び出すアプリを作ります。

```
$ vi main.go
```
```go
package main

import (
        "github.com/tily/goprivateb"
)

func main() {
        goprivateb.HelloFromGoPrivateB()
}
```

## 強制的に git が SSH を使うように設定する

ここで `~/.gitconfig` に下記内容を追加します。
こうすることで、`git clone https://github.com/～` しようとしたときも強制的に `git clone git@github.com:～` が実行される挙動となるようです。

```
$ vi ~/.gitconfig
```
```
[url "git@github.com:"]
insteadOf = https://github.com/
```

この状態で、一度 `dep init` してみます。
まだ SSH に関する設定を行っていないので、エラーになります。
(あらかじめ github に対する SSH の設定をしている場合は、エラーにならないかもです。)

```
$ dep init
solve error: Unable to update repositoryUnable to cache github.com/tily/goprivateb
Unable to update repository
```

## git 用の SSH 設定を行う

SSH の設定をします。
まず github に登録している公開鍵に対応した秘密鍵を設置します。

```
$ vi ~/.ssh/github_private.pem
```
```
-----BEGIN RSA PRIVATE KEY-----
(秘密鍵の中身)
-----END RSA PRIVATE KEY-----
```

次に、SSH の config ファイルに「ホストが github.com だった場合に、上記の秘密鍵を利用する」という設定を書きます。

```
$ vi ~/.ssh/config
```
```
Host github.com
  IdentityFile ~/.ssh/github_private.pem
```

## ちゃんと設定した上で dep init

ここまでやったら、`dep init` がうまく通るようになっています。

```
$ dep init
Cached github.com/tily/goprivateb
```

`lock.json` が書き込まれています。

```
$ cat lock.json 
{
    "memo": "e7e4f306375b10d5b683a5597e7f69f3839efc5c1a5491c260b270c18429d2bb",
    "projects": [
        {
            "name": "github.com/tily/goprivateb",
            "branch": "master",
            "revision": "aa1c962f1847840c78326452288b5f0c05dcded4",
            "packages": [
                "."
            ]
        }
    ]
}
```

`vendor/` ディレクトリに必要なファイルもダウンロードされています。

```
$ ls vendor/github.com/tily/goprivateb/main.go 
vendor/github.com/tily/goprivateb/main.go
```

メインアプリも実行することができました。

```
$ go run main.go 
Hello from Go Private B
```

## まとめ

SSH しか使えない Git リポジトリに置いた Golang パッケージを、dep で管理できることが確認できました。
社内環境等で、SSH しか使えない Git リポジトリに Golang パッケージを置いている場合に、便利ではないでしょうか。
(試行錯誤中なので、もっといいやり方があれば教えていただけると助かります。)

## 参考資料

* [How to \`go get\` private repos using SSH key auth instead of password auth\.](https://gist.github.com/shurcooL/6927554)
* [go get で取得したreposのデフォルトremoteパスをhttpsではなくsshにする \- Qiita](http://qiita.com/jpshadowapps/items/6111addbe65762665977)
docker入れたときにエラー出たので対処のメモ

Ubuntuにdocker入れた時、以下のようなエラーが出てて困ったので、その時に使用したコマンドのメモ
### インストールに使用したコマンド

```
$ sudo apt install docker.io
```
### 困ったエラー

```
$ docker ps
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
```

serviceコマンドで確認しても動いているし、結構困った。

```
$ service docker status
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2017-02-27 10:45:47 JST; 25min ago
     Docs: https://docs.docker.com
 Main PID: 2900 (dockerd)
    Tasks: 18
   Memory: 19.9M
      CPU: 1.351s
   CGroup: /system.slice/docker.service
           ├─2900 /usr/bin/dockerd -H fd://
           └─2908 containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim containerd-shim --metrics-interval=0 --start-timeout 2m
```

### 参考にしたもの
[ここ]を参考にしました(http://stackoverflow.com/questions/33562109/docker-command-cant-connect-to-docker-daemon)

### 使えるようにするために使用したコマンド

* 以下のコマンドを発行
```
$ sudo usermod -aG docker $(whoami)
```


* ログアウト・ログインする。

* 以下の様になればOK
```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

よく探したら、よくあるインストール手順だったのね。
Git LFS管理下にあるテキストファイルをgit diffする

# Git LFSとは

この辺を参照
https://www.slideshare.net/hibiki443/git-git-lfs-60951449

# Git LFS 管理下のファイルのdiff

UnityのSceneファイル(.unity)やPrefabファイル(.prefab)はYAML形式で記述されていますが、
大きなプロジェクトでは、.unityと.prefabだけで1GBを超えるほど巨大になることがあります。
そのため、GitHubの1リビジョンあたりの容量制限(1GB)に引っかかり、泣く泣くこれらをLFS管理としています。

LFS管理下のファイルのdiffを取ろうとすると以下のように表示されます。

<img width="851" alt="スクリーンショット 2017-02-27 10.21.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/54305/12a91d90-d06f-d944-6cbf-7476ff1c82ca.png">

何かが変更されてサイズが変わったことしかわかりません。

また、GitHub上ではこのような表示になります。サイズ情報以外なにもわかりません。

![スクリーンショット 2017-02-27 10.23.04.png](https://qiita-image-store.s3.amazonaws.com/0/54305/5531c04b-d2a0-3dba-3561-3646d65b5a46.png)


LFS管理下ファイルのdiffの表示機能は、2014年ごろ、2015年ごろに2回議論されているようですが、
現在でもまだ実装されていないようです。
https://github.com/git-lfs/git-lfs/issues/440
https://github.com/git-lfs/git-lfs/issues/604

# Git LFS管理下ファイルをdiffする
git lfsには `smudge`という、LFS参照ファイルを実体ファイルに戻すコマンドがあるので、
これを利用して、リビジョン間のファイル比較をするShell Scriptを書いてみました。

```lfs_diff.sh
#!/bin/bash
DIFFCOMMAND=diff

if [ $# -lt 1 ] ; then
  echo "usage: $0 [rev1] [rev2] filename"
  exit 1
elif [ $# -eq 1 ] ; then
  $DIFFCOMMAND <(git show HEAD:"${@:1}" | git lfs smudge) "${@:1}"
elif [ $# -eq 2 ] ; then
  $DIFFCOMMAND <(git show $1:"${@:2}" | git lfs smudge) "${@:2}"
else
  $DIFFCOMMAND <(git show $1:"${@:3}" | git lfs smudge) <(git show $2:"${@:3}" | git lfs smudge) 
fi
```
https://gist.github.com/gecko655/a76f9185e635b80410dd9b4c2c55a1a0

<img width="851" alt="スクリーンショット 2017-02-27 10.46.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/54305/c0134c26-9136-78d0-5053-5f811542c1d0.png">

`git lfs smudge`でLFS管理下ファイルの過去の状態を見に行って、
普通のdiffコマンドで比較しています。

ついでの機能として、ファイル名にスペースが含まれる場合、
スペースをエスケープしてもしなくても動くようにしています。

```bash
./lfs_diff.sh Assets/Aaa\ Bbb.prefab # これでも
./lfs_diff.sh Assets/Aaa Bbb.prefab # これでもよい
```


もともと.unityや.prefabのdiffを見てもあまり有益な情報は得られませんが、
「テキストを追加しただけなのにGameObjectの座標が変わっている。」とか、
「テキストが明らかにtypo」だとか、
「AttachしたはずのComponentが全部外れている」など、
diffからある程度のコードレビューはできるはずです。
公開されている気になるAPI

##公開されている気になるAPIについて
Webサービスを一覧でこれから調べて動かしてみようと思います。

オススメのAPIを見つけたらつど追加していきますね。

###Developer Center
---
Google Developers [https://developers.google.com/]

Android、iOS、Web環境での開発キットを提供。Google Play、Google+、Maps、YouTube、Books、Gmail、Cloud などのAPIも多数公開
提供：[ Google ]

Amazon Webサービス　[http://www.amazon.co.jp/gp/feature.html/?docId=451209]
クラウドやDB、ストレージ、データ処理、商品情報の提供などインターネットアプリケーションを開発する機能が提供されている
提供：[ Amazon ]

###API
---
Twitter Developers　[https://dev.twitter.com/]

ツイッター上で公開されているツイートやユーザー、フォロー、お気に入り、リスト、位置などの情報が利用できるAPIを公開
提供：[ Twitter ]

facebook Graph API[http://developers.facebook.com/docs/reference/api/]

Facebookに公開されている Users、Pages、Events、Groups、Applications、Photos、Videos、Notes、Checkins、などのデータを操作・参照する機能を提供
提供：[ Facebook ]

Graph Facebook API 指定するURLのシェア数を取得する方法 :[http://qiita.com/sunstripe/items/871ff4c9521460a1c6e1]

郵便番号検索API[http://zip.cgis.biz/]

郵便番号を指定すると都道府県、市町村、住所、事業所名（いずれも該当がある場合）のデータを返してくれる
提供：[zip.cgis.biz]

###終わり

徐々に記事も追加していきます。
面白そうなAPIがありましたら是非教えてください。

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
elixir関連

## deploy関連

remote build
https://github.com/bitwalker/distillery

deploy 
https://github.com/boldpoker/edeliver

## Phoenix関連
[Installing Font Awesome from NPM in Phoenix](http://cloudless.studio/articles/4-installing-font-awesome-from-npm-in-phoenix)

## その他
[Awesome Elixir](https://elixir.libhunt.com/)
DOMを生成するヘルパーライブラリーdomgenを作ったので紹介します。

軽量なライブラリで簡単にDOM生成したいという時に便利なdomgenというライブラリを作りました。
DOMを生成する時に document.createElement() や appendChild() で頑張るのは辛いものです。
domgenを使えば簡単に短くDOM生成をするコードを記述できます。

https://github.com/dotneet/domgen

## インストール

```bash
npm install --save domgen
```

## 使い方

```js
import h from 'domgen'

// p要素のDOMを作成
let p = h('p')

// 属性や子要素を指定して作成
let s = h('span', {style: {color: 'orange'}}, 'Text')

// 子要素をもった要素を作成
let ps = h('p', {style: {padding: '20px'}}, [
  ['span', {style: {color: 'red'}}, 'Text1'],
  ['br'],
  ['span', {style: {color: 'blue'}}, 'Text2']
])

// イベントリスナーの指定
let b = h('button', {onclick: () => alert('Click!')}, 'Button')
```

属性や子要素は型を見てあるていどインテリジェントに対応してくれます。class/style属性は文字列でも指定できますが、配列やオブジェクトでも指定できます。イベントリスナーの設定もサンプルの通り、関数または文字列を受け取ることができます。
上記のサンプルでは h という名前でインポートしていますが、ブラウザでロードする場合はdomgenという名前でglobalスコープに追加されます。

以下はREADME.mdにも記述してあるサンプルをそのまま転載しました。

```js
// simple example
document.body.appendChild(
    domgen('p', {style:'color:orange;'}, 'Text')
)

// Natural notation for class and style attributes.
// Ofcourse you can also write like this: class: 'classA classB'
document.body.appendChild(
    domgen('p', {class:['classA', 'classB']}, 'Text have class')
)
document.body.appendChild(
    domgen('p', {style:{'color': 'green'}}, 'Text have style')
)

// You can set children recursively.
document.body.appendChild(
    domgen('p', null, [domgen('span', null, 'Child Element Text Node')])
)
// Array notation
document.body.appendChild(
    domgen('p', null, [['span', null, 'Generated by array notation.']])
)

// Event
function onClickButton () {
  alert('click!')
}
document.body.appendChild(
    domgen('button', {onclick: onClickButton}, 'Click Me')
)
```
テーブルを分割するメリット

あるユーザーがいて、それに1対1で対応するテーブルがある時、 `A has_one B` という関係が成立する

で、このとき `has_one` を使う理由が分からなくて、テーブルA にカラムを追加しちゃえば単純でいいじゃんと思っていたのだが
これのせいでマイグレーションに今異常に時間がかかって ~~暇なので~~ 書いた。

has_manyの例しか出てこないのだが根本は同じはず

user:  ユーザー
users_shifts: シフト (月~金)

```rb
class User
  has_many :shifts
end

class Shift
  belongs_to :user
end
```

シフトは 月~金 までしかないので、Userのカラムに追加することもできるが
それだと users テーブルにレコードが1000万行の時にAlter文がとてつもなく重くなる。
しかも土日のシフトが生まれたりするとまたAlter文を発行しなければならない。

なのでテーブルを別にすると、そういった処理が必要無い。

愚者は経験に学び、賢者は歴史に学ぶ って意味がわかった気がする。
メモ：android.text.format.DateFormatの挙動

## 概要
android.text.format.DateFormat が具体的にどれが何を出力するのかわからないのでそのメモです。

### 動作確認用のコード
以下のコードをNexus 5X(7.1.1)で実行した。

```java
Date calendar = new Date();
Log.d("DateFormat", "getLongDateFormat\t" + DateFormat.getLongDateFormat(this).format(calendar));
Log.d("DateFormat", "getMediumDateFormat\t" + DateFormat.getMediumDateFormat(this).format(calendar));
Log.d("DateFormat", "getDateFormat\t" + DateFormat.getDateFormat(this).format(calendar));
Log.d("DateFormat", "getTimeFormat\t" + DateFormat.getTimeFormat(this).format(calendar));
```

### 日本語(日本)
| Method              | Result        |
|---------------------|---------------|
| getLongDateFormat   | 2017年2月27日 |
| getMediumDateFormat | 2017/02/27    |
| getDateFormat       | 2017/02/27    |
| getTimeFormat       | 10:27         |

### English(United States)

| Method              | Result            |
|---------------------|-------------------|
| getLongDateFormat   | February 27, 2017 |
| getMediumDateFormat | Feb 27, 2017      |
| getDateFormat       | 2/27/17           |
| getTimeFormat       | 10:27 AM          |