OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub リポジトリに git push したら Permission が denied

よく知られていることかもしれませんが，自分への備忘録として書いておきます．

GitHub (アカウント hoge) でリポジトリ ("abc") 作成: hoge/abc

GitHub で以下のように提示されるとおり

> echo "# abc" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/hobe/abc.git
git push -u origin master

git push すると

```
$ git push origin master
remote: Permission to hoge/abc.git denied to fuga.
fatal: unable to access 'https://github.com/hoge/abc.git/': The requested URL returned error: 403
```
ローカル側に何らかの理由で fuga という別アカウントが紐付いている？

取り急ぎ解決策として

```
$ git remote set-url origin https://hoge@github.com/hoge/abc.git
$ git push origin master
Password for 'https://hoge@github.com': 
```
パスワード入れると無事に push されました(^^)
たまに活用するGitコマンド一覧

#たまに活用するGitコマンド一覧

## remote branchの一覧を表示する
```
$ git ls-remote
```

## 追跡branchの変更をする
```
$ git branch origin/○○
```

## 新しくGitLabで作成したbranchをpullする。
```
$ git pull origin ○○
```

##既存のプロジェクトをGit管理にする
```
$ git init
$ git remote add origin ○○○○○○○○○○○○○○○○○○○○.git
```

##リモートブランチが表示されない際に
```
$ git fetch -all
```

##Gitの作業ログを確認する。
```
$ git reflog
```
##最新のコミットを取り消す
```
$ git reset --hard HEAD^
```
awscliでS3のパーミッションを確認する

余計なパーミッション付いてるのないよねというのを確認したい。全部なめるしかないのか。つらい。

## 期待しているACLの状態
`Grantee`がひとつだけだよねというのを確認したい。

```json
{
    "Owner": {
        "DisplayName": "john",
        "ID": "222222222222"
    },
    "Grants": [
        {
            "Grantee": {
                "Type": "CanonicalUser",
                "DisplayName": "john",
                "ID": "111111111111"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}
```

## ひとつずつやるなら
Grantsが複数ある場合、キーを出力する。

```zsh
for key in $(aws s3 ls s3://$BUCKET --recursive | awk '{print $4}'); do if $(aws s3api get-object-acl --bucket $BUCKET --key $key | jq '.Grants | length != 1'); then echo $key >> result.txt; fi; done
```

## xargsで並列でやるなら
xargsに渡されたインプットを条件次第でechoしたかったので関数のかたちにした。

```zsh:zshfunc_acl
function acl() {
  if $(aws s3api get-object-acl --bucket $1 --key "$2" | jq '.Grants | length != 1');
    then echo $2 | tee result.txt;
  fi
}
```

xargsで立ち上がるのは別プロセスだから関数定義を読み込まないといけないよね。
[xargsでzshの自作シェル関数を使う - Qiita](http://qiita.com/stanaka2/items/113b5aef29e982c39800)

```zsh
aws s3 ls s3://$BUCKET --recursive | awk '{print $4}' | xargs -P4 -I{} zsh -c ". ./zshfunc_acl; acl $BUCKET {}"
```

雑だけどとりあえずこれで確認した。
PHPリファレンス


①文字の改行
` echo '<br>'` で改行が可能

②文字同士の連結(.で実現可能)
` echo "My name is".$name; `

③文字と数字の連結

```php:calc1.php
$taxIncludedPrice = $price + $price * $taxRate;
echo '税込価格は'.$taxIncludedPrice.'円です';
```

④foreachの使い方

```php:calc2.php
$total = 0;
foreach ($prices as $price){
  $total+=$price;
}
echo '合計金額は'.$total.'円です'
```

⑤var_exportの使い方

```php:examine.php
<?php
$menu = array('name' => 'CURRY', 'price' => 900);
echo '$menuの値: ';
// var_exportは変数の中身を見るための関数です
var_export($menu);
echo '<br>';
echo '-----';
echo '<br>';

// この下にコードを書いてください
echo $menu['name'].'は'.$menu['price'].'円です';
?>
```

result
$menuの値: array ( 'name' => 'CURRY', 'price' => 900, )
CURRYは900です

⑥クラス作成・インスタンス作成

```php:instance.php
//プロパティにpublicを書くのを忘れないようにする
class Menu{
	public $name;
}

$curry = new Menu();
echo $curry->name;
```

⑦クラス内のプロパティを使用して作成するもの

```php:this_method.php
class Menu {
  public $name;
  
  public function hello() {
    // '私は○○です'とechoしてください
    echo '私は'.$this->name.'です';
  }
}

```

⑧コンストラクタの書き方

```php:construct.php
 public function __construct(){
    echo '１つのメニューが作られました';
  }
```

⑨html内にforeachを記述する方法

```html:foreach.html
 <?php foreach($menus as $menu): ?>
        <p><?php echo $menu->name;?></p>
 <?php endforeach ?>
```

*<p>タグ・・・文章の段落を指す。

⑩requie_onceでの他ファイルの読み込み方

```
require_once('menu.php');
```

⑪formの書き方(+html)

```
//actionに送信する先のファイルを指定する。
//
<form action='confirm.php'
```

###htmlでinputした項目を受け取る方法

```
<input name="<?php echo $curry->getName() ?>">個
//$curry->getName() は <input name = 'CURRY'>　とか
<?php require_once('data.php') ?>

<p><?php echo $curry->getName()?></p>
<p><?php echo $_POST[$curry->getName()]?></p>
//$_POST['CURRY']フォームに入力した内容を受け取る。


```

###クラスプロパティの呼び出し

Menu::$count

//クラス名、::、変数

###親クラスのコンストラクタの呼び出し

parent::__construct($name,$price,$image);

//parent、::、メソッド

##親クラスのコンストラクタのオーバーライド

// 親クラスの__constructをオーバーライド

```php:override.php
  public function __construct($name, $price, $image, $spiciness) {
    parent::__construct($name, $price, $image);
    $this->spiciness = $spiciness;
  }
```

###配列に要素を追加

```arrayMenus[] = $menu;```

これで配列限度を考慮しないで追加することが出来る。


###シングルクオーテーション・ダブルクオーテーション

echo '$name'
→$name

echo "$name"
→まどの

echo "{$name}"
→まどの（安全性◎)

echo '<input type="text" >';

ダブルクオーテーションで外側が囲まれているためにしっかり展開される！
where[] = " userid='{$name}'";
write.csv と write.csv2 の違い

自分用のメモがてら、初めてQiitaで記事を書いてみようと思いました。


<b>違いは区切り文字がカンマ(,)かセミコロン(;)の違い。</b>

|  | 区切り文字 |
|:-----------|------------:|
| write.csv() |カンマ(,)|
| write.csv2()| セミコロン(;) | 





例えば、

```{R}
> a
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
```

この行列を

```{R}
> write.csv(a,"a.csv")
> write.csv2(a,"a2.csv")
```
とすると、こう出力される。

 + write.csv()
![a.png](https://qiita-image-store.s3.amazonaws.com/0/134528/2e4b5291-c143-a824-1095-451a7f31ebe4.png)


 + write.csv2()
![a2.png](https://qiita-image-store.s3.amazonaws.com/0/134528/831dabaf-71e7-b0dd-6a39-0466547e1f26.png)



参考になれば幸いです。
Arduino Leonardo > Lチカ入門したら文鎮化した

```txt:動作環境
Arduino IDE 1.6.6
Arduino Leonardo (30分前に使い始めたもの)
```

Arduino Leonardo を入手した。
5VのGPIO出力でSPIセンサの試用を検討。

5HzでHigh, Low信号を出すプログラムを書込みした。
オシロスコープで5Vの矩形波が出ることを確認した。

500kHzでHigh, Low信号を出す(であろう)プログラムを書込みした。
オシロスコープで5Vの矩形波は見られず、0Vのまま。

プログラムを間違ったようだ。

気を取り直してArduino IDEからLeonardoに書込みしようとしたが、シリアルポートの認識がない。

「USBデバイスが認識できません」というメッセージが表示される。

Leonardo復旧方法を探すことになった。

### link

Arduinoトラブルシューティング アップロード編 by まりすさん
http://100year.cocolog-nifty.com/blog/2014/06/arduino-9471.html

Arduinoトラブルシューティング
http://garretlab.web.fc2.com/arduino_guide/trouble_shooting.html

Installing an Arduino Bootloader
https://learn.sparkfun.com/tutorials/installing-an-arduino-bootloader


https://github.com/irkit/device/issues/1
> こうなってしまった場合には、
https://raw.github.com/irkit/device/master/hardware/schematic.png のICSPヘッダを使って書き込むことができます。
http://arduino.cc/en/Tutorial/ArduinoISP や AVRISPmk2を使って、
ArduinoIDEからbootloaderを書き込む、とするとよいでしょう。

Arduino を AVR  プログラマ(ISP: In-System Programmer)として使う
http://n.mtng.org/ele/arduino/ArduinoISP.html

IRKitのブートローダーを破壊したので直した by 橋本商会さん
http://shokai.org/blog/archives/8785

Arduinoの種類ごとのピン配置。
http://icircuit.net/arduino-boards-pin-mapping/141
Leonardoを用いてLeonardoのブートローダを書換えはできなさそう。
> Note: SPI pins are mapped to ICSP port only


https://learn.adafruit.com/program-an-avr-or-arduino-using-raspberry-pi-gpio-pins/overview
**こちらの方法では通常のUSB/serial programming interface経由でArduino IDEから書込みできないという注意書きが[PDFファイル](https://cdn-learn.adafruit.com/downloads/pdf/program-an-avr-or-arduino-using-raspberry-pi-gpio-pins.pdf)の13ページにある。**
Arduino IDEから書込みできるようにするには、以下の記載通りにすればいいのだろうか。

> Program this hex file to the Arduino using avrdude on the Raspberry Pi to restore the Arduino to its normal state and make programming work with the Arduino IDE again.

### 復旧作業 

(追記 2017/02/15)

https://learn.adafruit.com/program-an-avr-or-arduino-using-raspberry-pi-gpio-pins/overview
を元に復旧を試みた。
ICSPピンとRaspberry Pi2のピンを接続して、Leonardoのbootloader hexファイルを書き込もうとしたが、`programmer is not responding`となった。
ファイル指定で、単純にグラフをかく

[こっち](http://qiita.com/bunzaemon/items/527f3823b2d27886990e)の続き。

>sin とか cos とか、どーでもいいから、取り敢えず単純に外部データをプロットさせたいんだよ!

ついでに。

埋め込みなんて、トロい。引数で指定出来る様にしろよ!

ってメモ。色んなグラフツールで。

使うのは、あっちでも使った、`rand.txt` を再度。

```
$ perl -le 'print rand (10) for 0 .. 99' > rand.txt
```

## Python


```python:GRAPH.py
import sys
import matplotlib
matplotlib.use('Agg')
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv(sys.argv[1], header=None)
data.plot()
plt.savefig(sys.argv[2])
```

```shell-session:
$ python GRAPH.py rand.txt graph.png
```

`import sys` で `sys.argv` 使うだけ。

## R

https://www.r-project.org/


```R:GRAPH.r
png(commandArgs(trailingOnly=TRUE)[2])
data = read.table(commandArgs(trailingOnly=TRUE)[1])
plot(data$V1, type="l")
```

```shell-session:
$ Rscript ./GRAPH.r rand.txt graph2.png
```

`y`が`V1`(第一列)の時に限り、暗黙的に行番号を`x`として扱うっぽい。


## gnuplot

http://www.gnuplot.info/


**2019/01/19 更新**

こっちの方が直感的。
ワンライナーで使うから、-e のメモも残すけど[^1]。

[^1]: -e, -cが併用出来るのが一番理想なんだけど、、、


```gnuplot:GRAPH.plt
#!/usr/bin/env gnuplot
set term png
set output ARG2
plot ARG1  u ($0):($1) notitle w l
```

```shell-session:
$ gnuplot -c GRAPH.plt rand.txt graph3.png 
```

`$0` が"インデクス"を示す。

### 旧メモ

```gnuplot:GRAPH.plt
#!/usr/bin/env gnuplot
set term png
set output o
plot f  u ($0):($1) notitle w l
```

```shell-session:
$ gnuplot -e 'f="rand.txt";o="graph3.png"'  GRAPH.plt
```


## psxy (GMT)

http://gmt.soest.hawaii.edu/projects/gmt

`psxy` だけは、 `x` 省略する方法が考え付かない、、、


```shell-session:
$ perl -lne 'print join " ", $., $_' rand.txt | gmt psxy -R0/100/0/10 -Jx0.1/1 > graph4.eps
$ gmt psconvert -P graph4.eps
```


- `-R` で、 x を 0~100, y を 0~10 まで描画
- `-Jx` で、 x を 0.1 倍、y を等倍

でグラフを書く。

## spark

https://github.com/holman/spark

ついでに spark

```shell-session:
$ cat rand.txt| spark
```

![spark.png](https://qiita-image-store.s3.amazonaws.com/0/64084/19871b43-9435-fe9d-e367-610cedc12436.png "spark.png")
わーい、すごーい


```hs
import Html exposing (Html, text)


main =
  Html.beginnerProgram { model = model, view = view, update = update }


type alias Model = String


model : Model
model =
  ""
    |> update Wai
    |> update Sugoi
    |> update Tanoshii
    |> update (Friends "クソリプ")


type Msg
    = Wai
    | Sugoi
    | Tanoshii
    | Friends String


update : Msg -> Model -> Model
update msg model =
  case msg of
    Wai ->
        model ++ "わーい"

    Sugoi ->
        model ++ "すごーい"

    Tanoshii ->
        model ++ "たのしー"

    Friends skill ->
        model ++ "君は" ++ skill ++ "がとくいな、フレンズなんだね!!"


view : Model -> Html Msg
view model = text model
```

[Try Elm](http://elm-lang.org/try)

元ネタ
http://qiita.com/t_ishida/items/bae7e62950d81f427f13
Rubyでseleniumを動かした手順記録

#環境
・Mac OS Sierra
・ruby 2.3.3

#gemパッケージのインストール

```
gem install selenium-webdriver
gem install capybara
gem install rspec
gem install pry-byebug
```

#chromederiver
pythonで使うためにchromedriverをどこかにおいたけど、それ使えるのでは？
↓
chromedriverの場所を探さないと
↓
プログラムファイルのローカルに置いてあった orz...
今後のために、グローバルなところに置きたい
↓

```
homebrew install chromedriver
```
↓
/usr/local/Cellar/chromedriver/2.27/bin/chromedriver
が最新版としてインストールされる。
↓
rubyのディレクトリにchromedriverを移動させれば
require 'selenium-webdriver'　でrubyを呼び出せるようになる。
詳細は[こちら](http://qiita.com/nwtgck/items/cfb5052135b8e64af01c)


#ブラウザの各操作

以下のURLが参考になった
[RubyでSeleniumを使ってスクレイピング](http://qiita.com/tomerun/items/9cb81d7a98150ff22f53)

[Documentation](http://www.rubydoc.info/gems/selenium-webdriver/0.0.28/Selenium)

##driver.find_element(s)関連
[http://www.rubydoc.info/gems/selenium-webdriver/0.0.28/Selenium/WebDriver/Find](http://www.rubydoc.info/gems/selenium-webdriver/0.0.28/Selenium/WebDriver/Find)

##属性名に空白が含まれている場合
[How to avoid Compound Class name error in Page Object?](http://stackoverflow.com/questions/17808521/how-to-avoid-compound-class-name-error-in-page-object)
Bitcoin Coreのupgrade方法(Ubuntu)

# 背景
bitcoindを長いこと起動していなかったのですが、久々に起動したところ、getinfoをした時に「URGENT: Alert key compromised, upgrade required」というエラーが発生していました。原因はbitcoin coreが最新版になっていなかったことです。0.12.0がインストールされていましたが、0.13.0よりAlert機能がなくなったため、Alert機能に関してエラーが発生していました。

upgradeをすれば良いわけですが、upgradeについて書かれたページが簡単に見つからなかったので、手順をここに記す。

# 環境
OS : Ubuntu15.04 Desktop
Bitcoin Core: 0.12.0から0.13.0以上にアップグレード

# 手順
基本的に通常のインストールで上書きをすればよい。

1)データのバックアップ
~/.bitcoin/のバックアップを取る

２）PPAの追加

```
sudo apt-add-repository ppa:bitcoin/bitcoin
sudo apt-get update
```

3)ビットコインコアのインストール

```
sudo apt-get install bitcoin-qt
```

4)うまくアップグレードできなかったので、cliとデーモンを直接インストール

```
sudo apt-get install bitcoind
sudo apt-get install bitcoin-cli
```

これでOK！
MacOSXのAtomでOCaml環境設定

## brewでOCamlインストール

```
% brew install ocaml
```

-  OCaml起動確認

```
% ocaml
        OCaml version 4.04.0
# 
```

- OCaml起動確認終了

```
# exit 0;;
```

## 文字化け回避

- 文字化けする

```
# "アイウエオ";;
- : string = "\227\130\162\227\130\164\227\130\166\227\130\168\227\130\170"
```

- .ocamlinit編集

```~/.ocamlinit
let printer ppf = Format.fprintf ppf "\"%s\"";;
#install_printer printer

```

- OCaml再起動

```
# "アイウエオ";;
- : string = "アイウエオ"
```

## Opam

- opam本体をインストール

``` shell
% brew install opam
% opam --version
1.2.2
% opam init
```

## Atom

- opamでmerlin, ocp-indentインストール

```
opam install merlin
opam install ocp-indent
```

- OCaml関連のpackageインストール

```
apm install language-ocaml linter ocaml-indent

```

- 補完良いよ。
- エラーもはいてくれる。

<img width="569" alt="スクリーンショット 2017-02-10 19.14.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/9907/d8a97ec9-f80e-ca06-ec4e-931b6c7a6181.png">

## OCamlインタプリンタでコマンドの履歴を残す

- OCamlインタプリンタで.mlファイルを実行する時にhistoryを残るようにするためにrlwrapをインストール。

```
% brew install rlwrap
```

- rlwrapから起動すると↓↑で過去に叩いたコマンドに移動できる。

```
% rlwrap ocaml
        OCaml version 4.04.0

# 

```

- 毎回の事なので.zshrcでラップ。

```
alias ocaml='rlwrap ocaml'
```
unionを使って一時テーブルっぽい動作をさせる

Railsでenumを定義して使用しているけど、急遽SQL使ってデータをいい感じに書き出したいときに有用。

### まずはこれを見て欲しい

```
mysql> select 1 as id, 'hoge' as name union select 2, 'foo' union select 3, 'bar';
+----+------+
| id | name |
+----+------+
|  1 | hoge |
|  2 | foo  |
|  3 | bar  |
+----+------+

# クエリ部分を整形してみた
select 
  1 as id, 'hoge' as name
union select
  2, 'foo' 
union select
  3, 'bar';
```

あたかもテーブルがあるかのような出力になった！

### で、使いみちはあるの？

JOINができる。

例として、

```
users
  id
  name
  state_id
```

があるとする。しかし、何らかの事情で`state_id`に対するテーブルがない。そんなとき。

```
mysql> select users.id, users.name, states.name as state_name from users left join (select 1 as id, 'hoge' as name union select 2, 'foo' union select 3, 'bar') as states on (users.state_id = states.id);
+------+--------+------------+
| id   | name   | state_name |
+------+--------+------------+
|    1 | taro   | hoge       |
|    2 | hanako | foo        |
+------+--------+------------+

# 整形
select users.id, users.name, states.name as state_name 
from users 
  left join (
    select 1 as id, 'hoge' as name
    union select 2, 'foo'
    union select 3, 'bar'
  ) as states on (users.state_id = states.id);
```

いい感じに出力できた！

### 総評

使う機会はあまりない。ただ、知っていおいて損はないかも。
わーい、すごーい

なんか気付いたら手元にソースがあったので、ここに供養します。

```groovy
#!/bin/env groovy

def message = ""

def wai = {message += "わーい\n"}
def sugoi = {message += "すごーい\n"}
def tanoshii = {message += "たのしー\n"}
def friends = {message += "君は${it}がとくいな、フレンズなんだね！\n"}

wai()
sugoi()
tanoshii()
friends "Groovy"
println message
```

元ネタ：http://qiita.com/t_ishida/items/bae7e62950d81f427f13
JavaScriptでクリップボードに文字をコピーする(ブラウザ)

- **2020/12/18** Clipboard API でコピーする方法を追記
- **2019/1/18** CSSによって選択できない場合があったので対応
- **2017/11/1** 改行がコピーできてなかったのでpreをつかうように変更
- **2017/10/31** 編集

## Clipboard API でやる方法

clipboard API を使うと簡単に実装できます。

ただし、https じゃないと動かないようです。
参照: https://developer.mozilla.org/ja/docs/Web/API/Clipboard

### サンプル

```html

<textarea id="textarea">Hello, World!</textarea>
<button type="button" id="button">コピー</button>
```

```js

document.getElementById('button').onclick = () => {
  var text = document.getElementById('textarea').value;
  navigator.clipboard.writeText(text).then(e => {
    alert('コピーできました');
  });
};
```


## `document.execCommand('copy')` でやる方法

`document.execCommand('copy')` で現在選択している部分をコピーできます。

それを少し応用して、任意の文字列をコピーできるように関数化したものです。

```js
function execCopy(string){

  // 空div 生成
  var tmp = document.createElement("div");
  // 選択用のタグ生成
  var pre = document.createElement('pre');
  
  // 親要素のCSSで user-select: none だとコピーできないので書き換える
  pre.style.webkitUserSelect = 'auto';
  pre.style.userSelect = 'auto';

  tmp.appendChild(pre).textContent = string;

  // 要素を画面外へ
  var s = tmp.style;
  s.position = 'fixed';
  s.right = '200%';

  // body に追加
  document.body.appendChild(tmp);
  // 要素を選択
  document.getSelection().selectAllChildren(tmp);

  // クリップボードにコピー
  var result = document.execCommand("copy");

  // 要素削除
  document.body.removeChild(tmp);
  
  return result;
}


```

## サンプル

[JavaScriptでクリップボードにコピーする - http://runstant.com/simiraaaa/projects/execCopy3](http://runstant.com/simiraaaa/projects/execCopy4)

```js

var textarea = document.getElementById('textarea');
var button = document.getElementById('button');

button.onclick = function(){
  if(execCopy(textarea.value)){
    alert('コピーできました');
  }
  else {
    alert('このブラウザでは対応していません');
  }
};

```


## 注意点

基本的にはユーザアクション(クリック等)からのイベント内の処理でしか使えません。
(なぜかChromeだとユーザアクション関係なくできてしまいますが...)

~~iOS Safariで使用すると、一瞬ソフトウェアキーボードが見えて少しダサいです。
`blur()` で即閉じしてはいますが、どうしても見えてしまいます。~~

iOS Safariでもソフトウェアキーボードを出さないようにコピーするように変更しました。

また、要素を選択してコピーしているので、貼り付ける環境によってはCSSが入ってしまうことがあります。
そういうのを防ぎたい場合は、PCだけ分岐してtexareaを使うようにすると良いと思います

```js

// テキストエリアバージョン
function execCopy(string){
  var temp = document.createElement('textarea');
  
  temp.value = string;
  temp.selectionStart = 0;
  temp.selectionEnd = temp.value.length;
  
  var s = temp.style;
  s.position = 'fixed';
  s.left = '-100%';
  
  document.body.appendChild(temp);
  temp.focus();
  var result = document.execCommand('copy');
  temp.blur();
  document.body.removeChild(temp);
  // true なら実行できている falseなら失敗か対応していないか
  return result;
}

```

## 確認したブラウザ

- Chrome 55
- Firefox 47
- iOS11 Safari

## 参考
[話題の document.execCommand('copy') を使ってコピーボタンを置く - http://qiita.com/pastak/items/416fa5f1030c1fff6afd](http://qiita.com/pastak/items/416fa5f1030c1fff6afd)

[JavaScript Web APIで「クリップボードにコピー」する -  https://qiita.com/elferia/items/cfc3f8e0971d3df00bea](https://qiita.com/elferia/items/cfc3f8e0971d3df00bea)
Firebaseの本番/開発の環境 (plist) を分けたい

`FIRApp`をみていたら、設定できそうなオプションがあったので、こんな感じで。

```objc
#if DEBUG
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-dev" ofType:@"plist"];
    FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
    [FIRApp configureWithOptions:options];
#else
    [FIRApp configure];
#endif
```
Railsのbinding.pryはviewにも仕掛けられるよ！！！

#binding.pryはviewにもしかけられる
前提条件としてpryのgemをインストールしている必要があります。
##pryのインストール
デフォルトのコンソールはirbがでるけどPryがめちゃめちゃ便利だからどっかでqiitaとかにもgemのインストール紹介していると思うのでやってみてください

インストール
→http://ruby-rails.hatenadiary.com/entry/20141024/1414081224
インストールしたあと
bundle install をしてあげてください

使い方はコチラの方が参考になります→http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f

では、さっそく止め方の紹介です！

```Application.html.haml
 - binding.pry
```
これだけです。これだけです...　これだけです.....
知ってたらすいません,,,


これでTerminalでサーバー開いているところにpryがでてれば成功です。
[TouchDesigner] UnityのMonoBehaviour的なノードを見つけたという話

![td_final.png](https://qiita-image-store.s3.amazonaws.com/0/127402/2ab207e5-b841-b33f-1ea2-0f0432931d21.png)

私は普段Unity使いなもので、No MonoBehaviour, No Life な感じです。

つまるところ、TouchDesigner上で**毎フレーム実行される関数**が無いかな～と日々探しておりました。
これを実現してくれるのが、**Execute DAT**です。

# 1. Execute DATとは
引用: https://www.derivative.ca/wiki088/index.php?title=Execute_DAT

Execute DATでは、スクリプトを編集し、条件に応じて実行することができます。フレーム毎の開始時や終了時、TouchDesignerプロセスの開始時、終了時などに実行することが可能です。スクリプトはノード上または外部テキストエディタで作成できます。また、スクリプトテキストはText DATへ出力することができますが、このText DATは編集不可能となります。
## パラメータ
#### **Active** : 
```Execute DATの実行状態を制御。```

#### **Execute Conditions** :
- **Start** : `TouchDesignerプロセスが起動されたタイミングで実行されます。`
- **Create** : `ノードが作成された際に実行されます。これは起動時、コンポーネントロード時、ノードのコピーペースト時にも実行されます。`
- **Exit** : `TouchDesignerプロセスが終了する際に実行されます。`
- **FrameStart** : `毎フレーム開始時に実行されます。`
- **FrameEnd** : `毎フレームの終了時に実行されます`
- **PlayState** : `タイムラインの再生状況が変化したときに実行されます(Pause->playなど)`

実行条件は以上で監視されます。

#### **NOTE** :
`各メソッドはそのノードの名前順に実行されます。`

# 2. 使い方
Execute DATを追加し、そのパラメーターにある利用したい実行条件をOnにします。
今回はフレーム開始時に実行される関数「**Frame Start**」を有効にしています。
このパラメーターと同じ関数名「**frameStart()**」の下にPythonスクリプトを記述すると、毎フレーム実行されます。
今回printした文字列の結果は画像右端に表示されています。
もちろん、printだけではなく他のオペレーターに対する処理や複雑な処理も記述できます。
![2017-02-10_025957.png](https://qiita-image-store.s3.amazonaws.com/0/127402/9d9089d4-6f18-7aa2-acce-b57eb3a6f2b3.png)

また、複数のExecute DATを追加し、同じ関数を実行させた場合、処理はDATの名前の順に実行されます。
以下画像のような状況の場合、「execute1」の方が「execute2」よりも文字コード的に順番が早いので、execute1のframeStart()関数が先に呼ばれ、execute2のframeStart()関数が後で呼ばれます。
![2017-02-10_031029.png](https://qiita-image-store.s3.amazonaws.com/0/127402/c5fe24fe-b5e5-3161-e20d-eeb7efb31156.png)


# 問題点
ヴィジュアルプログラミングツールであるはずなのに、コードでロジックを組むようになります。
LINEbot きくえさん

![スクリーンショット 2017-02-10 18.17.57.png](https://qiita-image-store.s3.amazonaws.com/0/164865/d95612a4-63f5-7ddd-7f1f-9bfc313c7453.png)
***
###"チャット"　×　"育成"　×　"ショッピング"　

・チャットで商品が購入できたら、便利！！
・自分専属の店員さんと、仲良くなれたらいいな！！

そんな思いから、LINE bot きくえさん を作ってみました。

![スクリーンショット 2017-02-10 18.08.55.png](https://qiita-image-store.s3.amazonaws.com/0/164865/9ff6746b-b5c5-0ddd-091b-baba8e04eff1.png)

##お友達募集
<img src="http://qr-official.line.me/L/bVd21o2U_I.png" width=200>　　　<a href="https://line.me/R/ti/p/%40njm5988a"><img height="36" border="0" alt="友だち追加" src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png"></a>

##できること

こんなことができます。

###<font color="DarkOrange">**価値１．**</font>「チャットで商品を検索できます！」
![概要1.png](https://qiita-image-store.s3.amazonaws.com/0/164865/e7da72fe-81ce-8a8f-6549-b14c435d6d24.png)

###<font color="DarkOrange">**価値２．**</font>「商品ページで購入できます！」
![概要2.png](https://qiita-image-store.s3.amazonaws.com/0/164865/841c836e-a646-3441-a034-7f8dc1539532.png)

###<font color="DarkOrange">**価値3．**</font>「商品ランキングを聞けます！」
![概要3.png](https://qiita-image-store.s3.amazonaws.com/0/164865/0614d46b-1c0d-a1cc-a9ac-27bd3d42c9cb.png)

###<font color="DarkOrange">**価値4．**</font>「ショップガールと仲良くなれます！」
![概要4.png](https://qiita-image-store.s3.amazonaws.com/0/164865/f369510b-889c-e828-4500-eeb00668b31a.png)

###<font color="DarkOrange">**価値5．**</font>「仲良くなるとお勧めを教えてくれます！」
![概要5.png](https://qiita-image-store.s3.amazonaws.com/0/164865/5eeade09-0f9c-0694-e513-7aa358c21bf0.png)


##システム構成
![スクリーンショット 2017-02-10 18.13.36.png](https://qiita-image-store.s3.amazonaws.com/0/164865/23c298a0-bf07-e594-b03c-935207a0be2f.png)

使用しているAPI ： WatsonのConversation, YahooShopping

Watsonでチャット開発するのめちゃくちゃ便利です。


##本当にチャットで購入する？
![スクリーンショット 2017-02-10 18.22.19.png](https://qiita-image-store.s3.amazonaws.com/0/164865/80646d0e-afa2-90df-ed97-6ceb9cdd55bc.png)

チャットって日用品を買うには便利なんですよね。早いし。

服とかって画面にかじりついて、いろいろ詳細を調べたり、他と比較するじゃないですかー？

そういうのは、ブラウザ検索でいいですよね。

##将来的には。。。
![スクリーンショット 2017-02-10 18.27.58.png](https://qiita-image-store.s3.amazonaws.com/0/164865/1424542a-030c-a310-120f-0359e684027e.png)

将来的には、チャットで決済できるようになれば嬉しいですね。

##きくえさんって誰？
あ、きくえさんは私の祖母の名です。


<h2>コメント</h2>
（2017/2/10）
スタンプ送っても無視されるってフィードバックを受けます。
そっか。やっぱスタンプにも反応した方がいいですよね......
わーい、すごーい

```pony
class Friends
    let env: Env
    var message: String
    new create(env': Env) =>
        env = env'
        message = ""

    fun ref wai(): Friends =>
        message = message.add("わーい\n")
        this

    fun ref sugoi(): Friends =>
        message = message.add("すごーい\n")
        this

    fun ref tanoshii(): Friends =>
        message = message.add("たのしー\n")
        this

    fun ref friends(skill: String): Friends =>
        message = message.add("君は" + consume skill + "がとくいなフレンズなんだね!!")
        this

    fun string(): String =>
        message

actor Main
    new create(env: Env) =>
        env.out.print(Friends(env).wai().sugoi().tanoshii().friends("クソリプ").string())
```

元ネタ: http://qiita.com/t_ishida/items/bae7e62950d81f427f13
【小ネタ】Pythonでマルチスレッディングせずに同期をとる（用途限定）

非常に用途限定の小ネタではあるが、なんだかよくわからないマルチスレッディングを使わずに同期を取ってみる。
たぶん、ほとんどの人には役に立たない。
また、もっといい方法はあるはず。
でもこれで十分。（今のところ）
なお、私、Python初心者ですｗ

#やりたいこと

実は、以下のようなことをやりたかった。

1.外部コマンドAを実行
2.外部コマンドBを実行
3.AとBが終わったら外部コマンドCを実行
※AとBは同時実行可能

#外部プロセス実行

これはsubprocessが使えた。
終了まで待たれても困るのでpopen()を利用した。

```python
import subprocess

p1 = subprocess.popen("command_A")
p2 = subprocess.popen("command_B")
```

#待つ

両方が終わるのを待つには．．．wait()てのがあった。
※これが今回の唯一のポイントです

```python
r1 = p1.wait()
r2 = p2.wait()
```

ちゃんと戻り値もチェックできる。

#外部プロセス実行

問題なければ、最後の外部プロセスを実行。
今回は同期しなくてもいいので、check_call()等でOK。

```python
p3 = subprocess.check_call("command_C")
```

#まとめ

もっとお勉強して、もっといいコードを書こう！（爆）
RubyでNoMethodError: undefined method 'all?' for "":String　って言われたときの対処法

#変数名の後に何かくっつけてみたらエラーでた！
っていう人向けの記事です。初心者向けです

自分のところで出てるエラーは
NoMethodError: undefined method `all?' for "":String
だったり
NoMethodError: private method `select' called for "":String
これのデバッグの仕方の一つの例です


なぜか失敗する

```sample2.rb
if str.all?
 puts "空白がありませんでした"
end
=>NoMethodError: undefined method 'all?' for "":String
```
Ruby初心者だった自分が陥ったときは NoMethodErrorとか言ってるけどall?ってメソッドはあるじゃないか！リファレンスに書いてあるぞ！ってなってだいぶ迷いました

#デバッグ方法

```sample3.rb
#まず、putsでstrの中身を確認してください。変数は期待しているものになっていますか?
puts str
=> ""      
#変数の中身何も入ってない！もっと前の行で間違えてるのが分かる
```

``` sample4.rb
#変数の型はメソッドと同じですか？
puts str.class  #strのクラスを確認
=> String
#strはString型になっている。　all?はArray型に使えるメソッドだからエラーが起きていることがわかる
```

後者の方で間違えやすく、デバッグに時間がかかったりします。このようなエラーがでてきたら使ってるメソッドと変数の型が一致しているのかを見てあげてください
リファレンス→https://docs.ruby-lang.org/ja/search/
あ、これ配列に使えるメソッドだからStringに使えないのかって分かると思います

インターンでコード書いてるなかでよくあったのが

``` sample5.rb
Article.first
=>NoMethodError: undefined method 'first' for Article:Module
#とか書いてあってclassみてみたら
Article.class
=>Module #ってでてきて、お前さんモジュールだったのか...
```
みたいなこともありました

ここまで見てきて、勘のいい人だったらclass使わなくても
エラー文見たら最後にModuleとかStringとかでてきてるじゃん！ってわかると思います。
わーい、すごーい

たーのしー

```lua:friends.lua
Friends = {}
Friends.new = function(skill)
    local this = {}
    this.skill = skill
    this.message = ''

    this.wai = function(self)
        self.message = self.message .. "わーい\n"
        return self
    end
    this.sugoi = function(self)
        self.message = self.message .. "すごい\n"
        return self
    end
    this.tanoshii = function(self)
        self.message = self.message .. "たのしー\n"
        return self
    end
    this.friends = function(self)
        self.message = self.message .."君は" .. self.skill .. "がとくいな、フレンズなんだね!!\n"
        return self
    end
    
    return this
end

Friends = Friends.new('クソリプ')
print(Friends:wai():sugoi():tanoshii():friends().message)
```

#### 元ネタ
PHP: http://qiita.com/t_ishida/items/bae7e62950d81f427f13
Scala: http://qiita.com/YukiAsu/items/d75b5e16f641c9d4bbf2
Golang: http://qiita.com/sakajunquality/items/5c4a2dc6967e584193ad
Ruby: http://qiita.com/844196/items/debc0cd1d39a6c3e32c7
Python: http://qiita.com/Nao-Y/items/f544a96cbd09b135c7e7
Bash: http://qiita.com/fk_2000/items/afd5f4ca8f5bb25011c7
Java: http://qiita.com/hanakayui0628/items/97242465693bda8cacd2
Swift: http://qiita.com/fromkk/items/0797bdf3923622073a4f
Flycheckでカーソルの傍に出てくるポップアップを消す

Spacemacsに標準で付いてくる、Flycheckの`pos-tip` が、入力中にちらちら出てくるので（両作者には申し訳無いが）非常に邪魔だった。
ので消した。

![Screenshot_2017-02-10_17-46-32.png](https://qiita-image-store.s3.amazonaws.com/0/103885/e5bb5581-043c-9e32-621d-170088f1256d.png)


```lisp:.spacemacs
(defun dotspacemacs/user-config ()
  (flycheck-pos-tip-mode nil)
  )
```

`flycheck-pos-tip-mode`というのか。

参考: http://emacs.stackexchange.com/questions/18922/is-it-possible-to-not-close-error-tooltip
React Native で自分で用意したアイコンフォントを使う方法

WEBアプリでカスタムアイコンを使用したい場合は[Fontello](http://fontello.com/)/[Icomoon](https://icomoon.io/)等を使ってアイコンフォントを作成するかと思います。
今回はアイコンフォントをReact Nativeのアプリでも使用する方法について説明します。

# 1. React Nativeで使用したいアイコンフォントをプロジェクトにインポートする
アイコンフォントの作り方は省略します。`Icomoon`で作成するのと以下のようなファイルが生成されます。

```
.
├── Read\ Me.txt
├── demo-files
│   ├── demo.css
│   └── demo.js
├── demo.html
├── fonts
│   ├── NCR-icon.eot
│   ├── NCR-icon.svg
│   ├── NCR-icon.ttf
│   └── NCR-icon.woff
├── selection.json
└── style.css
```

アイコンフォントを用意したら、プロジェクトにファイルをコピーします。

```
src/assets
└── fonts
    ├── NCR-icon.ttf
    └── selection.json
```

今回は`src/assets/fonts`ディレクトリを作成して、配下に`*.ttf`と`selection.json`(`Icomoon`)、`Fontello`の場合は`config.json`をコピーします。

次に追加したアイコンフォントのリンク付けをします。

`package.json`に以下を追加します。([rnpm](https://github.com/rnpm/rnpm)をインストールしていない場合はしておいてください。)

```package.json
  "rnpm": {
    "assets": [
      "./src/assets/fonts"
    ]
  }
```

`package.json`に追記したら以下を実行してリンクさせます。

```
$ rnpm link
```

# 2. react-native-vector-icons をインストール

アイコンフォントの表示には[react-native-vector-icons](https://github.com/oblador/react-native-vector-icons)を使用します。

```
$ npm i -S react-native-vector-icons
$ rnpm link
```

`Info.plist`の`Fonts provided by application`にfontが追加されているか確認する。（ない場合は手動で追加してください）
![image](https://qiita-image-store.s3.amazonaws.com/0/13263/6fa7971b-c454-d8d2-70d4-20e55f7998d4.png)

# 3. 使い方

## import
```js
import { createIconSetFromIcoMoon } from 'react-native-vector-icons';
// import { createIconSetFromFontello } from 'react-native-vector-icons'; // Fontello の場合はこっち
import customFontIcon from '../../../assets/fonts/selection.json'; // 適宜変更してください
const Icon = createIconSetFromIcoMoon(customFontIcon);
```

## JSX
JSXで以下の様に書くとフォントアイコンが表示されます。

```js
<Icon name="info" />
```

## 全体
コンポーネント全体はこんな感じ

```js
import React, { Component, PropTypes } from 'react';
import { compose, setPropTypes } from 'recompose';
import { TouchableOpacity } from 'react-native';

import { createIconSetFromIcoMoon } from 'react-native-vector-icons';
import customFontIcon from '../../../assets/fonts/selection.json';
const Icon = createIconSetFromIcoMoon(customFontIcon);

export default compose(
  setPropTypes({
    name: PropTypes.string.isRequired,
    color: PropTypes.string,
    size: PropTypes.number,
    onPress: PropTypes.func,
  }),
)(class FontIcon extends Component {

  renderFontIcon() {
    const { name, color, size} = this.props;
    return (
      <Icon name={name} color={color} size={size} />
    );
  }

  render() {
    const { onPress } = this.props;

    return onPress != undefined ? (
      <TouchableOpacity onPress={onPress}>
        {this.renderFontIcon()}
      </TouchableOpacity>
    ) : this.renderFontIcon();
  }
});
```
DBからCSV形式でデータをエクスポートするとき、Embulkが便利

## はじめに
会社でエンジニアをやっていると、データベースからこんなデータをちょうだい！と他の部署から依頼されるケースがあります。データを欲しがるのはだいたい営業やマーケティングの部署なので、エクセルで開くため出力形式はCSVです。
postgresからクエリの結果をCSVへ出力するとき、psqlのCOPY TOを使ったりRailsのActiveRecordなどのORマッパを経由したりするケースが多いと思います。ぼくもずっとそうやってきましたが、あるときふとEmbulkが使えるのでは？と思いつきました。

Embulkは、プラグインでの拡張のしやすさが特徴のバルクローダです。https://github.com/embulk/embulk
自分は、Postgres <=> Mysql間でデータをバッチで同期させたりするのに使っていました。Fluentdの兄弟みたいなもので、Fluentdがストリーミングデータを扱いEmbulkがバルクデータを扱う、というような棲み分けになっています。

下記のようなymlファイルを作って、`embulk run config.yml`するだけ。これだけでも毎回psqlコマンドを使うよりはマシな感じになります。

```yaml
#config.yml

in:
  type: postgresql
  host: your-host
  user: your-user
  password: your-password
  database: your-database
  query: |
    SELECT id AS user_id
    FROM users
    WHERE age > 20
out:
  type: file
  path_prefix: ~/tmp/csv_out
  file_ext: csv
  formatter:
    type: csv
    charset: UTF-16
```

メリットとしては、

- yamlファイルとしてクエリがリポジトリに蓄積できる。psqlでやっていると、いちいち前に投げたクエリを覚えておく気にならない。
- DBの情報とクエリをセットにしておける。
- 並列実行など、Embulkの便利機能が使える。
- DBがMySQLに変わったり、他の形式で出力しなければいけないときも怖くない。

あたりでしょうか。

## ひとこと
今はクエリを設定ファイルの中に直接書いてしまっているけれど、クエリの定義ファイルを別に作り、実行するときにクエリを柔軟に組み合わせたりなどしてみたいと思っています。

DBからCSVへの出力って、部門間のデータの受け渡しでけっこうやる機会があるけれど、なんとなくpsqlを使っているケースは多いのでは？Embulkを使うのは意外と盲点なんじゃないでしょうか。どこまで実用に耐えるか、しばらく使ってみたいと思います。
asset_syncでassetsファイルをアップロードするとEveryone can readになる

コードにそのまま書いてました。

```ruby
    def upload_file(f)
      # TODO output files in debug logs as asset filename only.
      one_year = 31557600
      ext = File.extname(f)[1..-1]
      mime = MultiMime.lookup(ext)
      file = {
        :key => f,
        :body => File.open("#{path}/#{f}"),
        :public => true,
        :content_type => mime
      }
```
[asset_sync/storage.rb at master · AssetSync/asset_sync · GitHub](https://github.com/AssetSync/asset_sync/blob/master/lib/asset_sync/storage.rb#L123)

## 調べた経緯
asset_syncを使ってprecompileしたassetsをS3に上げているのだけど、`web/assets`の下のファイルをみてたらパーミッションがEveryone can readになっててアレレとなった。CloudFront経由でしか公開しないつもりだったし、許可した覚えのない権限があって気持ち悪いので調べてみた。
まあ、別に読めるのはいいんだけど。

## ちなみにasset_sync v2.0.0からは依存gemが減っている
依存するgemが`fog`から`fog-core`になったから。
なので、使用するプロバイダーを明示する必要がある。:+1:

```
# Gemfile
gem "asset_sync"
gem "fog-aws"
```
[asset_sync/UPGRADING.md at master · AssetSync/asset_sync · GitHub](https://github.com/AssetSync/asset_sync/blob/master/UPGRADING.md)
わーい、すごーい

最近は気付いたら投稿しているらしい

```swift
import Foundation

enum Friends {
    case wai
    case sugoi
    case tanoshii
    case skill(String)
    func message() -> String {
        switch self {
        case .wai:
            return "わーい"
        case .sugoi:
            return "すごーい"
        case .tanoshii:
            return "たのしー"
        case .skill(let skill):
            return "君は\(skill)がとくいな、フレンズなんだね!!"
        }
    }
}

print([Friends.wai, Friends.sugoi, Friends.tanoshii, Friends.skill("クソリプ")].map({ $0.message() }).joined(separator: "\n"))

/*
わーい
すごーい
たのしー
君はクソリプがとくいな、フレンズなんだね!!
 */
```

## 元ネタ

PHP: http://qiita.com/t_ishida/items/bae7e62950d81f427f13
Scala: http://qiita.com/YukiAsu/items/d75b5e16f641c9d4bbf2
Golang: http://qiita.com/sakajunquality/items/5c4a2dc6967e584193ad
Ruby: http://qiita.com/844196/items/debc0cd1d39a6c3e32c7
Python: http://qiita.com/Nao-Y/items/f544a96cbd09b135c7e7
Bash: http://qiita.com/fk_2000/items/afd5f4ca8f5bb25011c7
Java: http://qiita.com/hanakayui0628/items/97242465693bda8cacd2
Vagrant+VirtualBoxで構築した仮想マシンをBox化して復元する

[Vagrant+VirtualBoxで作成した仮想マシンにPHPライブラリテスト用環境を構築する【1】](http://qiita.com/ss_watanabe/items/4bb3b86951ca82d71815)
[Vagrant+VirtualBoxで作成した仮想マシンにPHPライブラリテスト用環境を構築する【2】](http://qiita.com/ss_watanabe/items/6b79dfc0362eb5c5c44b)
[Vagrant+VirtualBoxで作成した仮想マシンにPHPライブラリテスト用環境を構築する【3】](http://qiita.com/ss_watanabe/items/22c406b84783e2ac2d14)
Vagrant+VirtualBoxで構築した仮想マシンをBox化して復元する ←イマココ

# Boxの生成

```
$ vagrant package
$ ls
Vagrantfile		package.box
```
え、簡単にできるやん！

# 仮想マシンの復元
早速復元してみようと思う。

## Boxを追加
先ほど生成したBoxをVagrantに追加する。

```
$ vagrant box add labelTest package.box
$ vagrant box list
CentOS6     (virtualbox, 0)
labelTest   (virtualbox, 0)
```

## 仮想マシンの初期化

```
$ mkdir test
$ cd test
$ vagrant init labelTest
```


# 仮想マシンの起動

### うまくいかない

```
$ vagrant up
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

# Down the interface before munging the config file. This might
# fail if the interface is not actually set up yet so ignore
# errors.
/sbin/ifdown 'eth1'
# Move new config into place
mv -f '/tmp/vagrant-network-entry-eth1-1486695738-0' '/etc/sysconfig/network-scripts/ifcfg-eth1'
# attempt to force network manager to reload configurations
nmcli c reload || true

# Restart network (through NetworkManager if running)
if service NetworkManager status 2>&1 | grep -q running; then
  service NetworkManager restart
else
  service network restart
fi


Stdout from the command:

Schnittstelle eth0 beenden:  [  OK  ]
Loopback-Schnittstelle beenden:  [  OK  ]
Loopback-Schnittstelle hochfahren:  [  OK  ]
Schnittstelle eth0 hochfahren:  
IP-Informationen für eth0 werden bestimmt ... erledigt.
[  OK  ]
Schnittstelle eth1 hochfahren:  Determining if ip address 192.168.33.10 is already in use for device eth1...
[  OK  ]
Schnittstelle eth2 hochfahren:  Gerät eth2 scheint zu fehlen, Initialisierung verzögert.
[FEHLGESCHLAGEN]


Stderr from the command:

bash: Zeile 10: nmcli: Kommando nicht gefunden.
```

え、え、エラーだー

何やってもエラー...俺には分からんんーんー

### 対策

[Vagrant1.8.7でネットワークの起動に失敗する](http://qiita.com/msykd/items/065918a6ca67c9b40c76)

やってみよう...
！？本当にVagrant1.8.6にダウングレードしたら直った。
他にも正しい解決方法はあると思うけど、今回はこれで妥協！

# 無事復元できた
なんやかんやあったけど復元できました。
でもまだまだVagrantの便利なところ引き出しきれてない気がする！
provisionとか使ってもっと便利にしたいと思うのでした...
機械学習の regularization の訳は正則化 (正規化ではない)

[Coursera の Machine Learning コース](https://www.coursera.org/learn/machine-learning) の日本語字幕で regularization の訳が**正規化**となっているためか、regularization を**正規化**と言っている人が散見されます。
(身近な人にもいましたし、"Coursera 正規化" 等でウェブ検索すると結構ヒットします)

しかし、regularization の訳は **正則化** が普通のはずです。

以前、大学の先生からの伝聞でその由来を聞きました。

[Coursera の Machine Learning コース](https://www.coursera.org/learn/machine-learning) の Week 2 でも解説されているように、最小二乗誤差の線形回帰は解析解を求めることができ、その解は
![image](https://qiita-image-store.s3.amazonaws.com/0/101826/008f3a36-a821-6e51-181c-dff255d2b833.png)
になります。

しかし、特徴量に対して学習データが少なすぎたりすると、![image](https://qiita-image-store.s3.amazonaws.com/0/101826/91903b52-ac71-6e3e-40d5-4450d4e2df86.png) の部分が非正則になって、逆行列を求められなくなります。

そこで、パラメータのL2ノルムの項 (正則化項) を入れることで、解析解は 
![image](https://qiita-image-store.s3.amazonaws.com/0/101826/515da13e-805e-3f57-ba35-d14bc36b2e37.png)
になります。

このように、正則化項を入れることによって解析解の ![image](https://qiita-image-store.s3.amazonaws.com/0/101826/91903b52-ac71-6e3e-40d5-4450d4e2df86.png) の部分が ![image](https://qiita-image-store.s3.amazonaws.com/0/101826/c393095c-e158-bf3d-fb15-68e97830ad99.png)
 という正則行列 (regular matrix) になるので逆行列を求められるようになり、不良設定問題 (解が一意に定まらない) が解消されます。

このような背景から、regular matrix が正則行列と訳されていることと合わせて *regularization* は **正則化** というらしいです。

**正規化**は *normalization* の訳として使われています。
これはデータのスケーリングのことです。間違えないようにしましょう。
[Perl] [連載]PSGI入門第一章 環境変数の一覧を出す

[PSGI入門でググって](https://www.google.co.jp/search?oe=UTF-8&ie=UTF-8&hl=ja&q=psgi 入門&gws_rd=ssl)も本当の導入だけで実用的な実装が なかなか見当たらなくて辛かったので、本記事でそのあたりをフォローしようと思います。

## 本記事の対象
1. CGIの読み書きができる
2. けど、[Mojolicious](http://www.mojolicious.org/)使うにはためらいがある（私のような[^1]）
3. perl使い

## 必要な環境（というか本記事では記載しない準備運動）
1. perlまたはperlbrewなどのインストール[^2]
2. cpanmのインストール[^3]
3. Plack及びその他本文に出てくるモジュールのインストール

## PSGIを直接書くメリット
- 本番環境を用意するまではサーバー設定が不要[^4]
- [RoR](http://rubyonrails.org/)だとかMVCだとかを理解してなくても自分のperlの知識だけで書ける
- HTTPレスポンスの構造を理解してなくてもかけてしまう[^5]
- バイバイ(x)html4 & `use CGI`! ハロー！[HTML5](https://www.w3.org/TR/html5/) & `use Text::Xslate`!
- バイバイ`use CGI::Carp`!エラーは自動で表示してくれる！

## PSGIを直接書くデメリット
- ドキュメント少ねぇ！お前ら`”Hallo World!”`だけで終わらせすぎ！
- デフォルトのセッション機能が弱い（個人の主観です）[^6]

# 本日のお題：環境変数の一覧を出す。
ここまで執筆してスタミナ切れたので連載にします。今日のお題は環境変数の取得とその一覧の出力です。

``` perl:Myapp.pl
use strict;
use warnings;
use Carp;

use Plack::App::Path::Router::PSGI;
use Path::Router;
use Plack::Request;

my $router = Path::Router->new;
$router->add_route( '/' => target => \&env );

# now create the Plack app
my $app = Plack::App::Path::Router::PSGI->new( router => $router );
$app->to_app();

# 以下routerで呼ばれる要素
sub env {
    my $env = shift;
    my @str;
    while ( my ( $key, $value ) = each %$env ) {
        push @str, "$key = $value" unless ref $value;
    }
    return response( $env,
        join( "<br>\n", '<html><body><h1>環境変数一覧</h1>', sort(@str), '</body></html>')
    );
}

# 以下サブルーチン
sub response {
    my $env = shift;
    my $body = shift || croak 'empty body!';
    my %ARG = @_ if @_;
    my $status = $ARG{'-status'} || 200;
    croak "unvalid status: $status" if $status !~ /^\d{3}$/s;
    my $mime = $ARG{'-MIME'} || 'text/html; charset=utf-8';
    my $headers = $ARG{'-headers'} || {};
    my $req = Plack::Request->new($env);
    my $res = $req->new_response($status);
    $res->content_type($mime);
    $res->header( $headers );
    $res->body($body);
    $res->finalize;
}

__END__
```
として、`$ plackup Myapp.pl -r`でおk[^7]
**どうだ！簡単だろ！？**　`use Jcode;`も`use utf8;`も`use Encode;`も要らんですたい！

## 次章
[PSGI入門第二章 CGI::SessionをPSGIで無理やり使う](http://qiita.com/worthmine/items/987ac1e422348b9f0ea5)

# 宣伝
本記事は自前で有料WebサービスをPerlで書いてリリースするに辺り、つまづいた点や気づいたことを共有する目的で書き始めました。

![worthmine-qiita.png](https://qiita-image-store.s3.amazonaws.com/0/10766/370df067-1108-c7b8-2ea3-59ab11155660.png)こちらのQRコードをスマホで読み取り、
興味を持った方は<https://qrown.me>までぜひお立ち寄りください！

---
[^1]: web APIを実装するわけでもなく、ただ単にWebアプリケーションを構築したいだけだったり、RoRを触ったことなかったりしたらMojoliciousって敷居高くないですか？
[^2]: <http://qiita.com/chansuke/items/43543590dc6d14639a83>
[^3]: <http://qiita.com/hagino3000/items/1cce5c607828637c6976>
[^4]: 本番環境ではポート80を使うためにApache/nginxを止めて`sudo`を使うか素直にApache/nginxをリバースプロクシとして使う必要があるが`plackup Myapp.pl`などとする場合にはデフォルトでポート5000を使うので<http://localhost:5000>などとブラウザに打てば良い。
[^5]: `use Plack::Request;`または`use Plack::Response;`しろ
[^6]: CGI::Sessionに依存してると`$session->expire(‘+1y’)`とか描きたくなるが、自前で実装しなくてはいけない
[^7]: `-r` オプションはスクリプト本体と`./lib`以下の変更を検知して自動的に再起動するオプション
MacOSXにUbuntu16.04の仮想環境を構築する

今年はなるべくアウトプットしなければ（汗）と危機感を感じ、
Evernoteに溜めていたナレッジをずらずらと書いていこうと思います。

っで、今回は今更ながら感いっぱいですが、Vagrantを利用して環境構築を行っていきます。

Vagrantは仮想環境（VM）を一元管理し操作するためのコマンドラインツールで、
MacOSX、Windows、Linuxに対応したパッケージをインストールし利用します。
また、VirtualBoxと連携（VMWareや他のクラウドとも連携可）するため、
そちらも別途インストールしておく必要があります。

## __バージョン__

- MacOSX El Capitan（10.11.6）
- VirtualBox（5.1.8）
- Vagrant（1.8.7）
- Ubuntu（16.04 Xenial Xerus）

## __大まかな流れ__
1. VirtualBoxのインストール
2. Vagrantのインストール
3. Vagrantfileの作成と編集
4. vagrant upコマンドでVM起動
5. vagrant sshでVMにログイン

## __1. VirtualBoxのインストール__

まずは[ここ](https://www.virtualbox.org/wiki/Downloads "VirtualBox")の__OS X hosts__からディスクイメージをダウンロードして、
Macにインストールしてください。

## __2. Vagrantのインストール__

次にVagrantのディスクイメージを[ここ](https://www.vagrantup.com/downloads.html "Vagrant")からダウンロードしてインストールしてください。

## __3. Vagrantfileの編集__

適当な作業ディレクトリを作成し、その中に空のVagrantfileファイルを配置します。
vagrant initコマンドでVagrantfileを作成することもできますが、
動的に作成されたファイルの中身にはずらずらとコメントが書かれていて編集しづらいので、
今回はまっさらなファイルを作成します。

```
$ mkdir -p ~/Documents/sandbox/vagrant
$ cd ~/Documents/sandbox/vagrant
$ touch ./Vagrantfile
```

次にVagrantfileを開き下記を記述します。

```
$ vim ./Vagrantfile
```

``` :Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "eighty8/ubuntu16.04-min"

  config.vm.define "machine1" do |node|
    node.vm.hostname = "machine1"
    node.vm.network "private_network", ip: "192.168.xx.xx"
    node.vm.provider "virtualbox" do |vb|
      vb.gui = false
      vb.memory = "1024"
      vb.cpus = "2"
    end
  end
end
```

__コードの解説__

2行目の config.vm.box で
使用したい仮想マシンイメージ（box）を指定します。

boxファイルはオフィシャルなものから個人で作成されたものまで数多くあります。
[ここちら](https://atlas.hashicorp.com/boxes/search "Box File")からいろいろ探してみてください。
なお、eighty8/ubuntu16.04-min は、私が作成したイメージで、
Ubuntuの最新版minimal構成のイメージとなっています。

4行目の config.vm.define "machine1" do |vm| から
12行目の end までが1つの仮想マシーンの設定となります。

5行目の node.vm.hostname では仮想マシンの任意のホスト名を指定します。

6行目の node.vm.network で仮想マシンのネットワーク設定を行います。
ネットワークはデフォルトの private_network を指定し、
ipには 192.168.xx.xx を指定しています。(xxには任意の値を入れてください)

- private_network
  - アダプター1 / 割り当て : NAT
  - アダプター2 / 割り当て : ホストオンリー
- public_network
  - アダプター1 / 割り当て : NAT
  - アダプター2 / 割り当て : ブリッジ

ネットワークに関しては[こちらのサイト](https://www.virment.com/vagrantfile-settings/)がとても参考になりますので、
興味のある方は覗いてみてください。

7行目の node.vm.provider "virtualbox" do |vb| から
11行目の end までは、仮想マシンの処理装置に関する設定です。

8行目の vb.gui はグラフィックを使わないので false を指定します。

9行目の vb.memory には任意のメモリ容量を指定します。

10行目の vb.cpus はCPUのコア数を指定します。


## __4. VMの起動__

Vagrantfileが作成できたら、さっそく下記のコマンドで起動してみましょう。
なお、vagrant upはVagrantfileを作成したディレクトリで実行してください。
初めて起動する場合はBoxがダウンロードされるのでけっこう時間が掛かります。

```
$ vagrant up
```

起動したらログインします。

```
$ vagrant ssh
```

パッケージ類を更新しておきます。

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

あとは開発環境に必要なミドルウェアを、別途インストールしてみてください。
わーい、すごーい

```java
public class Friends {
	public static void main(String[] args) {
		wai();
		sugoi();
		tanoshii();
		friends( "クソリプ" );
	}

	public static void wai() {
		System.out.println( "わーい" );
	}

	public static void sugoi() {
		System.out.println( "すごーい" );
	}

	public static void tanoshii() {
		System.out.println( "たのしー" );
	}

	public static void friends( String skill ) {
		System.out.println( String.format("君は%sがとくいな、フレンズなんだね!!", skill) );
	}
}
```

便乗。
[http://qiita.com/t_ishida/items/bae7e62950d81f427f13](http://qiita.com/t_ishida/items/bae7e62950d81f427f13)
sessionにいろいろぶち込みすぎてエラーになる場合の対応

sessionに大きなデータを突っ込もうとしたらエラーが出たので下記のように対応した。


(1)sessionの格納場所はcokie→DBに変更
activerecord-session_storeのgemを利用。
https://github.com/rails/activerecord-session_store

```rb
<Gemfile>
gem 'activerecord-session_store'
```

(1)-2 active_record:sessionのmigrate

```rb
rails generate active_record:session_migration
rake db:migrate
```

(1)-3 session用のテーブルを作成(→これはmigrateで自動作成される？かな）

```rb
<symptom-interview/db/migrate/20170201080607_add_sessions_table.rb>
class AddSessionsTable < ActiveRecord::Migration
  def change
    create_table :sessions do |t|
      t.string :session_id, :null => false
      t.text :data
      t.timestamps
    end

    add_index :sessions, :session_id, :unique => true
    add_index :sessions, :updated_at
  end
```

(2)controller 側は普通にセッションとして格納

```rb
<controller>
diagnosis_lists = DispDisease.all #とにかくなにか大きなデータ
session[:sheet]["diagnosis_lists"] = diagnosis_lists
```


(3)session_storeの場所の変更

```rb 
<config/initializers/session_store.rb>

#従来こうなっている？はず
#Rails.application.config.session_store :cookie_store, key: '_symptom-interview_session'

#このように変更する。
Rails.application.config.session_store :active_record_store, key: '_symptom-interview_session'
```

多分これで出来るはず。
Ruby で連番を作る

# 方法


```rb
sequence = Enumerator.new(1..Float::INFINITY) # (1..Float::INFINITY).each でも可
sequence.next #=> 1
sequence.next #=> 2
sequence.next #=> 3
```

連番をインクリメントせずに `sequence` から現在の値を取得したい場合は [Enumerator#next](https://docs.ruby-lang.org/ja/latest/method/Enumerator/i/next.html) の代わりに [Enumerator#peek](https://docs.ruby-lang.org/ja/latest/method/Enumerator/i/peek.html) を使えばよいです。

# :new: さらにシンプルで素晴らしい方法

@yancya さんにコメントで教えて頂きました！感謝 :pray::sparkles:

```rb
sequence = 1.step
sequence.next #=> 1
sequence.next #=> 2
sequence.next #=> 3
```

[Numeric#step](https://docs.ruby-lang.org/ja/latest/method/Numeric/i/step.html) をブロック無しで呼んだ場合は Enumerator オブジェクトを返します。その結果、上で紹介した方法と同じ挙動になります。

# ついでに

[Enumerator](https://docs.ruby-lang.org/ja/latest/class/Enumerator.html) については過去に

[Enumerable を include する代わりに Enumerator オブジェクトを活用する](http://qiita.com/QUANON/items/d84fcf417c285721837d)

という記事も書きましたので、ご興味があればこちらも合わせてどうぞ。
grunt-license-reportをREADME通りにインストールして使えない人向けの記事

Node.jsを使ってサービスを作っている時に、npmでインストールしたライブラリのライセンスを調べる必要性が出てきたので、ライセンスの一覧表的な物を生成できないか調べてみた。

## 結論
生成できた

## レベルで言うとどの位の人向けの記事？
npmとgrunt-cliが分かるレベルの人向け

## どのぐらい適当な記事？
動けば良いや程度の記事(Gruntfile.js以外は理解した上で書いています)

## やり方
*メモ:* grunt-license-reportのリポジトリなのだが、少し修正しないと動かない部分があるので記事にした
[https://github.com/Fkscorpion/grunt-license-report](https://github.com/Fkscorpion/grunt-license-report)

```json:package.json
{
  "name": "必須",
  "version": "必須",
  "dependencies": {
  },
  "devDependencies": {
    "grunt": "^1.0.1",
    "grunt-license-report": "0.0.8"
  }
}
```

↑dependenciesの部分に使いたいライブラリ名等を入れておくこと

```js:Gruntfile.js
module.exports = function (grunt) {
  grunt.loadNpmTasks('grunt-license-report');
  
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    "grunt-license-report": {
      output: {
        path: './report/licenses',
        format: 'html'
      }
    }
  });
};
```

```console:console
$ npm install
$ grunt grunt-license-report

↓Done.が出ればOK (入れてるライブラリで表示変わると思う)

Running "grunt-license-report" task
scanning ./
>> UNKNOWN LICENSE for arraybuffer.slice@0.0.6
>> UNKNOWN LICENSE for better-assert@1.0.2
>> UNKNOWN LICENSE for blob@0.0.4
>> UNKNOWN LICENSE for callsite@1.0.0
>> UNKNOWN LICENSE for component-bind@1.0.0
>> UNKNOWN LICENSE for component-emitter@1.1.2
>> UNKNOWN LICENSE for component-inherit@0.0.3
>> UNKNOWN LICENSE for express-resource@1.0.0
>> UNKNOWN LICENSE for indexof@0.0.1
>> UNKNOWN LICENSE for options@0.0.6
File ./report/licenses.html created.

Done.

```

`./report/licenses.html` を見てこのような表が生成されていれば成功です。
![スクリーンショット 2017-02-10 16.27.16.png](https://qiita-image-store.s3.amazonaws.com/0/71322/da1d7dd7-9c74-03c8-ffa4-c548bddac783.png)

## 参考にした記事
[http://qiita.com/ymstmsys/items/c77b52fda7dc69d8f22f](http://qiita.com/ymstmsys/items/c77b52fda7dc69d8f22f)
わーい、すごーい

気が付いたときには投稿していた

```bash:
#!/bin/sh

if [ $# -eq 0 ]; then
  echo "引数を指定してください。" 1>&2
  exit 1
fi

skill=$1

function wai() {
  echo 'わーい'
}

function sugoi() {
  echo 'すごーい'
}

function tanoshii() {
  echo 'たのしー'
}

function friends() {
  echo '君は'$skill'がとくいな、フレンズなんだね!!'
}

wai && sugoi && tanoshii && friends
```

## 実行例
`$ ./friends.sh くそりぷ`



## 元ネタ
PHP: http://qiita.com/t_ishida/items/bae7e62950d81f427f13
Scala: http://qiita.com/YukiAsu/items/d75b5e16f641c9d4bbf2
Golang: http://qiita.com/sakajunquality/items/5c4a2dc6967e584193ad
Ruby: http://qiita.com/844196/items/debc0cd1d39a6c3e32c7
Python: http://qiita.com/Nao-Y/items/f544a96cbd09b135c7e7
Java: http://qiita.com/hanakayui0628/items/97242465693bda8cacd2
ジャパリパーク: http://qiita.com/enzirion/items/cd97ee3667756b18f006
Swift: http://qiita.com/fromkk/items/0797bdf3923622073a4f
C++: http://qiita.com/ur_kinsk/items/533d3780eb4f87fa6770
Lua: http://qiita.com/ken_ton/items/f8aeed7779476ece6198
C#: http://qiita.com/Temarin/items/7bcdb9f42b0d209a53cc
Pony: http://qiita.com/kubo39/items/318090ea206288fc1f08
アップデートでUbuntuが起動しなくなったときの対処

#はじめに
Ubuntuをアップデートして再起動したら起動しなくなった！ので備忘録。

#とりあえずリカバリーモード
Shiftキーを押しながら起動するとブートローダーが上がるので「Advanced options for Ubuntu」から最新Verのrecovery modeを選択してみると・・・Kernel panicが発生。

orz

#カーネルの削除
ひとつ前のVerを選択すると普通に起動したので
apt remove linux-[ほげほげ]
で起動しなかったカーネルを削除して再起動したら普通に立ち上がったよ。