OmniAICreator/Qiita-1.07M huggingface dataset:
タグだけでクリップボードへコピー・カットする（JavaScript、clipboard.js）

Flashを使わずにクリップボードへのカットやコピーができるJavaScriptのライブラリを利用します。

clipboard.js — Copy to clipboard without Flash
https://clipboardjs.com/

ボタンを押すとコピー（カット）されるシンプルなものです。ボタンごとにJavaScriptのコードを追加するのは大変です。JavaScriptの宣言１つだけで動作するようにしてみます。

```html:clipboard.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Clipboard</title>
</head>
<body>

<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.7.1/clipboard.min.js"></script>

<script>
window.onload = function () {
    new Clipboard('.btn');
};
</script>

<!-- tag -->
<button class="btn" data-clipboard-text="この値がコピーされます">
タグ内の値をクリップボードへコピー
</button>

<!-- input -->
<input id="foo" value="inputの値">
<button class="btn" data-clipboard-target="#foo">
対象：inputのvalue
</button>

<!-- textarea -->
<textarea id="bar">テキストエディタの文字</textarea>
<button class="btn" data-clipboard-target="#bar">
対象：テキストエリアの文字をコピー
</button>
<button class="btn" data-clipboard-action="cut" data-clipboard-target="#bar">
対象：テキストエリアの文字をカット
</button>

</body>
</html>
```

それぞれ中身の解説です。

clipboard.min.js のみで動きます。ファイルはCDNでも提供されています。
https://github.com/zenorocha/clipboard.js/wiki/CDN-Providers

```html:clipboard.html
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.7.1/clipboard.min.js"></script>
```

Classがbtnであるものに対して動作させます。この宣言だけで、下記３つのサンプルが動作します。ボタンを増やしたとしてもJavaScriptのコードを追加する必要がありません。

```html:clipboard.html
<script>
window.onload = function () {
    new Clipboard('.btn');
};
</script>
```

-----

サンプル１　値をコピーする

ボタンのclassをbtnとすることで動作させます。
data-clipboard-textで指定された値がコピーされます。

```html:clipboard.html
<!-- tag -->
<button class="btn" data-clipboard-text="この値がコピーされます">
タグ内の値をクリップボードへコピー
</button>
```

-----

サンプル２　テキスト欄の値をコピーする

ボタンのclassをbtnとすることで動作させます。
data-clipboard-targetで、ボタンをクリックした際にどこの値を利用するか指定します。
ここでは、#fooとしてidがfooであるものをターゲットとしています。

```html:clipboard.html
<!-- input -->
<input id="foo" value="inputの値">
<button class="btn" data-clipboard-target="#foo">
対象：inputのvalue
</button>
```

-----

サンプル３　テキストエリアの値をコピー・カット

ボタンのclassをbtnとすることで動作させます。
data-clipboard-targetで、ボタンをクリックした際にどこの値を利用するか指定します。
ここでは、#barとしてidがbarであるものをターゲットとしています。

data-clipboard-action="cut"を指定するとカットとなります。

```html:clipboard.html
<!-- textarea -->
<textarea id="bar">テキストエディタの文字</textarea>
<button class="btn" data-clipboard-target="#bar">
対象：テキストエリアの文字をコピー
</button>
<button class="btn" data-clipboard-action="cut" data-clipboard-target="#bar">
対象：テキストエリアの文字をカット
</button>
```
Twitch API をNode.jsで叩いて配信一覧を取得する

Twitch API を利用して、特定のゲーム、特定の言語（日本語）の配信情報を抜き出したかったので、Node.jsで利用したメモ。

[Get Live Streams](https://dev.twitch.tv/docs/v5/reference/streams/#get-live-streams) を利用。
[Search Streams](https://dev.twitch.tv/docs/v5/reference/search/#search-streams) も似ているが、こちらは配信言語でフィルタができない。

```twitch_get_live_streams.js
var request = require('request');

//変数系の設定
var twitch_client_id = '**********'; //twitch側で作成したアプリのclientID
var game = 'overwatch'; //検索したいゲームタイトル
var language = 'ja'; //検索したい配信言語

//検索用URL生成
var searchURL = 'https://api.twitch.tv/kraken/streams/?game=' + game + '&language=' + language;

//リクエストヘッダー設定
var headers = {
  'Accept': 'application/vnd.twitchtv.v5+json',
  'Client-ID': twitch_client_id
}

//リクエストオプション設定
var options = {
  url: searchURL,
  method: 'GET',
  headers: headers,
  json: true
}

//APIへリクエスト送信
request(options, function (error, response, body) {
  if (!error) {
    if (body._total > 0) {
      //取得成功
      var streams = body.streams
      console.log(streams);
    } else {
      //配信数ゼロ
    }
  } else {
    //リクエスト送信エラー
    console.log(error);
  }
});
```

以上で配信中の一覧のjsonデータが得られる。

使っているライブラリはrequestのみ。twitch-apiなどのライブラリもnpmに存在するが使い方がよくわからなかったので普通にAPIを叩いた。

TwitchのWebサイト上で検索した時と同じように視聴者数順で返してくるので、用途によってはデータの加工や検索クエリに工夫が必要。
TidalCycles 動作環境の構築 for Mac

# TidalCycles動作環境の構築手順
1. Homebrewのインストール
2. TidalCyclesのインストール
3. SuperDirtシンセをインストール
4. Atomインストール
5. TidalCycles Atomプラグインをインストール
6. TidalCyclesの動作確認

## 1. Homebrewのインストール
以下のコマンドをターミナルで実行
```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

Homebrewインストール済みの場合は、最新にアップデート。
```
$ brew update
```


## ２. TidalCyclesのインストール
1. [tidal-bootstrap](https://davidgranstrom.github.io/tidal-bootstrap/)をダウンロードします。
2. ダウンロードしたzipを展開し、tidal-bootstrap.command ファイルとダブルクリックしコマンドを実行します。
3. [プロセスが完了しました] 表示されればインストール完了。（インストールはかなり時間がかかります）


## 3. SuperDirtシンセをインストール
2でダウンロードしたzip内の、install-superdirt-quark.scd ファイルをダブルクリックすると、SuperColliderが起動します。
エディットウィンドウに include("SuperDirt")　と記述し、末尾にキャレットを置き command + enter　で実行するとインストール開始されます。  
Post Windowに　-> SuperDirt　と表示されればSuperDirtシンセのインストール完了。


## 4. Atomインストール
[Atom](https://atom.io/)、をダウンロードしインストールします。
※ Atomインストール済みの場合は、この項目は飛ばしてください。


## 5. TidalCycles Atomプラグインをインストール
Atomを起動し、 Atom > Preferences > install から　 tidalcycles を検索しインストール。


## 6. TidalCyclesの動作確認
TidalCyclesの実行するには、1.SuperCollider内でSuperDirtを起動、2.Atom内でTidalCyclesを起動、2つのステップが必要です。

### 6-1 SuperDirtを起動
SuperColliderを起動しエディットウィンドウに以下のコードを貼り付け、行末尾にキャレットを合わせて command + enterを押すとSuperDirtが起動します。
```
SuperDirt.start
```

### 6-2 Atom内でTidalCyclesを起動
- Atomを起動し、.tidalの拡張子で新規ファイルを保存します。
- 次に、メニューから Packages > TidalCycles > Boot TidalCyclesを選択します。
- 選択できたらウィンドウの一番下に小さなウィンドウが開き、GHCiインタプリタが動作していることを伝えるテキストが表示されます。
- 新規作成したtidalファイルに以下のコードを入力し、command + enterを押すと4つ打ちのキック音が出力されれば動作環境構築完了。

```
d1 $ sound "bd sn"
```
別ファイルの関数を使用する方法Perl版とPython版


注意：頭に`_`の付く関数やメソッドはプライベートなものなので外部からアクセスするのは本来よろしくない。（Pycharmは警告を出してくれる）


# Perl版

```pl:Foo.pm
package Foo;
use v5.10;
use strict;
use warnings;
use Exporter 'import';

our @EXPORT_OK = qw/pub_func/; # pub_func関数をエクスポートできるようにする

sub pub_func {
    say "pub_func";
}

sub _pri_func {
    say "_pri_func";
}
1;
```

```pl:main.pl
#!/usr/bin/perl
use v5.10;
use strict;
use warnings;

use FindBin qw($Bin);
use lib "$Bin";
use Foo qw/pub_func/; # pub_func関数を名前空間にインポートする

sub main {
    pub_func();       # pub_func
    Foo::pub_func();  # pub_func
    Foo::_pri_func(); # _pri_func
}

if ($0 eq __FILE__) {
    main();
}
```

# Python版

```py:foo.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, division, absolute_import


def pub_func():
    print("pub_func")


def _pri_func():
    print("_pri_func")

```

```py:main.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, division, absolute_import

import foo
from foo import pub_func  # pub_func関数を名前空間にインポートする


def main():
    pub_func()      # pub_func
    foo.pub_func()  # pub_func
    foo._pri_func() # _pri_func
                    # Pycharmだと頭に_が付く関数は"Access to a protected member _pri_func of a module"の警告を出してくれる


if __name__ == '__main__':
    main()
```


`from モジュール import 名前1, 名前2`の書き方については
以下の通り、複数の同じ関数名を名前空間にインポートしてしまう可能性があるので推奨していない。

[Python 良い慣用句、悪い慣用句](http://docs.python.jp/2/howto/doanddont.html#from-module-import-name1-name2)

>
今回のは、これまでの「ダメ」よりかなり弱い「ダメ」ですが、やはりそれなりの理由がなければ、やめておいたほうが良いことに変わりありません。これが大抵うまくないのは、いつの間にか二つ別々の名前空間に住む一つのオブジェクトを持つことになるからです

# 名前空間に直接インポートしない改良版

```pl:main2.pl
#!/usr/bin/perl
use v5.10;
use strict;
use warnings;

use FindBin qw($Bin);
use lib "$Bin";
#use Foo qw/pub_func/;
use Foo;

sub pub_func {
    return Foo::pub_func(@_);
}

sub main {
    pub_func();       # pub_func
    Foo::pub_func();  # pub_func
    Foo::_pri_func(); # _pri_func
}

if ($0 eq __FILE__) {
    main();
}
```

こうすれば引数と返り値は丸投げできるので、関数名は自由に変えられる。
Python版は引数全部を丸投げする方法がわからなかったので省略。（全部きちんと書かないといけないのかしら）
condaの仮想環境を起動するとbashのpromptが崩れる

condaの仮想環境を起動すると、bashのpromptが崩れてしまいました。
### 通常の挙動
```
[user@hostname pwd]$
[user@hostname pwd]$ source activate test
(test)[user@hostname pwd]$
```
### 起こった事象
```
[user@hostname pwd]$
[user@hostname pwd]$ source activate test
(test)
```

根本原因は不明ですが、`source activate`を行った時に、`CONDA_PS1_BACKUP="$PS1"`が読み込まれず、`CONDA_PS1_BACKUP=`となっていたことが原因でした。

取り敢えずは、.bashrcに以下を記載して対応。
`export CONDA_PS1_BACKUP="[\u@\h \W]$ "`

githubでも議論がありましたが、どうやって解決されたのかは不明でした。。。
https://github.com/conda/conda/issues/4916
UnityのMecanimで個別のAnimationを一時停止する

基本的に[ここ](https://forum.unity3d.com/threads/mecanim-change-animation-speed-of-specific-animation-or-layers.160395/page-2#post-2544999)で話されていることの翻訳なんですが、UnityのMecanimでアニメーションを行っている時に一時停止するには、`animator.speed = 0`とすればできますが、この場合Animator配下にあるアニメーション全てが一時停止してしまうため、たとえばLayerを分けてAnimationを複数実行している場合に、個別で停止することができません。個別停止を一発で実現するようなAPIは現時点ではなく、ややハッキーな方法を取る必要があります。

1. AnimatorのパラメータにAnimationスピードを表すFloat型のパラメータを追加します。名前は何でもよいですが、ここでは`MovingSpeed`とします。デフォルトの値は`1.0`にします。
<img width="672" alt="スクリーンショット_2017-07-22_午前1_07_28.png" src="https://qiita-image-store.s3.amazonaws.com/0/42169/50f39d0c-0392-e2d4-8781-eeae8f01d62d.png">

2. 一時停止したいAnimationを選択して、Inspectorに表示される`Multiplier`の欄で`Parameter`にチェックを入れ、`Multiplier`で先程作成したパラメータを選択します。
<img width="439" alt="スクリーンショット_2017-07-22_午前1_08_54.png" src="https://qiita-image-store.s3.amazonaws.com/0/42169/b19e5d9b-00ee-0678-8a88-2b35e5de7dbc.png">

3. Scriptで、一時停止したいタイミングで、以下のようにパラメータ値を変更します。
```
animator.SetFloat("MovingSpeed", 0.0f); // 一時停止
```
再開したいタイミングで、同様にパラメータ値を変更します。
```
animator.SetFloat("MovingSpeed", 1.0f); // 再開
```

このようにAnimationの幾つかの設定値はパラメータと連動させることができるので、一見プログラムからできなさそうなことでも実現可能です。
PythonでCSVファイルを転置する その2:性能測定

# 性能測定
[前回のネタ](http://qiita.com/tak/items/029b6c880ea56ddd0033)の続き
俺がえいやとやってみたnumpy.array.T使う場合と、コメントもらったzip使う場合とで性能を比べてみた。

入力は1000行1000列の1M.csvと、5000行5000列の25M.csv。

```py3:方法1
import sys
import numpy
def csvt_1(fnin, fnout):
    fin = open(fnin, "r")
    fout = open(fnout, "w")
    for line in numpy.array([s.strip('\n').split(',') for s in fin]).T:
        fout.write(",".join(line) + "\n")
    fin.close()
    fout.close()
```

```py3:方法2
import sys
def csvt_2(fnin, fnout):
    fin = open(fnin, "r")
    fout = open(fnout, "w")
    for line in zip(*[s.strip('\n').split(',') for s in fin]):
        fout.write(','.join(line) + '\n')
    fin.close()
    fout.close()
```

測定結果(IPythonでの%time %run)
　方法1 1M.csv:約500ms 25M.csv:約14s
　方法2 1M.csv:約250ms 25M.csv:約11s

何度か計ったけどだいたい同じ。zipの勝ち。
これは何だろう。zipは遅延評価がいい感じに効いているとかだろうか。
ともあれ有意義な結果が得られた。

# ただ残念ながら
このコードを試すきっかけとなった、同僚から話題が出たデータはサイズが約40GB。
それに対しては今回の方法は使えなさそうだったので、これとは別にC#でアプリ書いて解決した。
Get,GetGetGetWildAndTough! Perl版

# コード
```Perl
my $GET = 'Get';
my $WILD = 'Wild';
my $AND = 'and';
my $TOUGH = 'Tough';

my @GetWildAndTough = ($GET, $WILD, $AND, $TOUGH);
my @GetChanceAndLuck = (9, 9, 9);

while (1) {
	my $gwat = int(rand(3));
	print $GetWildAndTough[$gwat] . "\n";
	shift(@GetChanceAndLuck);
	push(@GetChanceAndLuck, $gwat);
	my $dream = 1;
	while(my ($T, $N) = each @GetChanceAndLuck){
		if ($T != $N) {
			$dream = 0;
		}
	}
	last if ($dream);
}
print $GetWildAndTough[3] . "\n";
exit;

```

# 出力
```
Wild
Get
and
Get
and
Get
and
Get
and
Get
Get
Wild
and
Tough
```
# なにこれ？
ひとりでは消せない痛み

# 仕様
「Get」 「Wild」 「and」 をランダムに出力します。
「Get Wild and」の順に出力されたら「Tough」と出力して終了します。

# 元ネタ
- [Get,GetGetGetWildAndTough\! \- Qiita](http://qiita.com/Momiji0223/items/eec45a13e60da1b22b49)
- [Get,GetGetGetWildAndTough! bash版 - Qiita](http://qiita.com/fk_2000/items/e05ea9de9a1ac11c58dd)
VR空間移動用いす型デバイスを作成する③展示会等で感じたこととか

思った事の続き

（見出し1）　展示会等に出す利点、出したほうが良いと思う理由
１．制作者自身は（作成し続けていると）慣れて酔わなくなる
２．制作者自身は使う人が何を不安に感じるかがわからない
３．作成していると感覚が鈍くなる
（見出し2）　VR展示会で気になったこと
１．安全に注意
２．急にVR内にいれないほうがよいかも
３．VRができない人もいる
４．人がこない・・・

#展示会等に出す利点、出したほうが良いと思う理由
　VRデバイスを作成した場合、できるだけ展示会等で（VRをやったことのない人に）見てもらったほうがよいといわれているが、その理由として個人的に思うこと。
　（特に今は個人で出展できる展示会等がたくさん開催されており、非常にありがたい。）

１．制作者自身は（作成し続けていると）慣れて酔わなくなる
　VRでは慣れれば慣れるほど酔わなくなる。とくに制作者は何度も使うので酔わなくなる。また、地元の知り合い等にも体験してもらうのだが、だんだん酔わなくなってくる。そのうえコントローラーの使い方も熟知してくる。慣れてない人間が周囲に少なくなってくるので、酔うポイントや問題点、不安を感じる箇所を確認するためには展示会等でVR慣れてない人にやってもらうのが必須。

２．制作者自身は使う人が何を不安に感じるかがわからない
　ゲームステージを自分で作成しているため、制作者自身はVR空間内に何が配置されているか把握している。実際にVRを体験してもらう人はいきなり見知らぬ空間に入るため不安だが、制作者はそれがない。
　最初に作成したとき（VR EXPO出展時）は体重を後に傾けると後退するようにしていたが、実際に使用してもらうと後退する人は誰もいなかった。後は見えない、何があるかわからないので後退する人などいるはずがないのだが、自身ではそれがわからなかった。自分の頭の中では後ろに何があるかを把握しているため、自身で後退を試しているときは特に不安がなかったのだ。

３．作成していると感覚が鈍くなる
　Unityを使用してコンテンツを作っているのだが、VR内で設計できないため、通常のディスプレイ上で調整を行っている。
　使い方を理解してもらうため、展示会等ではまず、コンテンツをディスプレイ上に表示して使用方法を練習し、慣れてもらった後にVR体験をしてもらっている。
　ディスプレイ上で調整していると、上の練習をしたのと同じ効果が発生する。制作者はいつも十分練習をしたうえで、VR体験をしている状態のため、VR内でプレイした時の感覚に初心者とずれが発生しているように思われる。

#VR展示会で気になったこと
１．安全に注意
　安全に注意。特にバランスが重要になるコンテンツの場合は転倒に注意。
　万全を期して展示会に行っているつもりだが、展示中には何らかの原因でOculusやPC、コントローラーの調子が悪くなる場合がある。この場合は仕様を中止し、すぐにPCを再起動する等の対策を行ったほうが良い。
　私自身これを怠ったため、展示中に扱けた方が一人いた。幸い何ともなかったがマジで焦った。

２．急にVR内にいれないほうがよいかも
　前の見出しの中でも書いたが、まず普通のディスプレイ上にゲームを表示させて使い方を説明している。VR慣れていない人はいきなりVR空間内に入ると脳の理解が追い付かず、多少混乱してしまう。この状態で使用方法の説明をしても、説明に集中してもらうことは難しいと感じた。

３．VRができない人もいる
　VRの展示会は問題ないが、NT京都等の電子工作系の展示会に出展すると、Oculusを使えない子供や化粧や髪形が崩れるためにHMDがかぶれない女性も遊びに来る。もったいないので、ディスプレイにゲーム画面を表示し遊んでもらっている。特に子供はガンガン遊ぶので見ていてハラハラするが反応が良い。大人は体験した後に理解するため考え込んでから感想を言うのだが、子供にはそれがない。とにかく思ったまま遊ぶだけなので面白い。VRコンテンツを子供が遊べない現状はひどく惜しい・・・。

４．人がこない・・・
　展示会は盛況でもこのコンテンツは結構空いている。
　このデバイスはぱっと見て何かわからないので、寄り付かないのだろう。今後は見せ方の工夫も課題と感じる。
　VR系の展示会で体験しにきた方に話を聞くと、「電子工作やってます」「Arduinoに興味あります」という方が多かった。やはりVR系の展示会ではソフトウェアの関係者が多いため、ハードよりソフトに興味がある人が多いというのも要因かもしれない。
　（まあ、僕も展示会でハードとソフトが展示されてたら、ハードの方見に行くしね。）

以上、思ったところを書いてみた。
次は技術的な説明をしたい。
[Pythonによる科学・技術計算] 連立一次方程式の解法, 数値計算, numpy

#はじめに

Aを行列としたN次元連立一次方程式 $A x = b$ を$x$について解く。

#内容

(1) Aの逆行列$A^-1$をnumpyのlinalg.invメソッドにより計算し， 
解ベクトル$x=A^{-1} b$を求める。

(2)  np.linalg.solveメソッドから直接$x$を計算する。**こちらの方が一般的に速い。**

***
# コード(1)

```
%%time

import numpy as np
"""
A x = bを満たすxベクトルを linalg.solveを使って求める
"""
# 行列Aの生成
a1_lis = [1, 0, 0]
a2_lis = [0, 2, 0]
a3_lis = [0, 0, 4] 
A_matrix=np.array([a1_lis, a2_lis, a3_lis])

# b vector
b = np.array([4,5,6]) # 行ベクトルとしてｂを生成し，それの転置行列として"列ベクトル”を生成する
b_vec = b.T
A_inv = np.linalg.inv(A_matrix)
x_vec= np.dot(A_inv,b_vec) # xベクトルを計算する。行列の積に@演算子を使っている(参考)

print(x_vec)

```

または"matrix"を使う下の書き方もある。
可読性は高くなる。しかし，なにかと不便なことが多いのであまり推奨しない。


```py3
import numpy as np
"""
A x = bを満たすxベクトルを x = A^-1 bの計算により求める
"""
# 行列Aの生成
a1_lis = [1, 0, 0]
a2_lis = [0, 2, 0]
a3_lis = [0, 0, 4] 
A_matrix=np.matrix([a1_lis, a2_lis, a3_lis])

# b vector
bb = np.matrix([4,5,6]) # 行ベクトルとしてｂを生成し，それの転置行列として"列ベクトル”を生成する
b_vec = bb.T

x_vec=A_matrix.I@b_vec # xベクトルを計算する。行列の積に@演算子を使っている(参考)

print(x_vec)
```

###結果(1)

```
[[ 4. ]
 [ 2.5]
 [ 1.5]]
```
***





#(2) numpy.linalg.solveを使う場合(推奨)


```py3

import numpy as np
"""
A x = bを満たすxベクトルを linalg.solveを使って求める
"""
# 行列Aの生成
a1_lis = [1, 0, 0]
a2_lis = [0, 2, 0]
a3_lis = [0, 0, 4] 
A_matrix=np.array([a1_lis, a2_lis, a3_lis])

# b vector
b = np.array([4,5,6]) # 行ベクトルとしてｂを生成し，それの転置行列として"列ベクトル”を生成する

x_vec= np.linalg.solve(A_matrix,b) # xベクトルを計算する。行列の積に@演算子を使っている(参考)

print(x_vec)
```
結果(2)
[ 4.   2.5  1.5]
***
#補遺
**numpy.linalg.solveメソッドは内部的にはLapackのLAPACKの[dgesv](https://www.nag.co.uk/numeric/FL/nagdoc_fl22/pdf/F07/F07AAF.pdf)(実連立一次方程式の解)と[zgesv](https://www.nag.co.uk/numeric/FL/nagdoc_fl22/pdf/F07/F07ANF.pdf)(複素連立一次方程式の解)のラッパーである[1]。**

● 計算物理学等では連立一次方程式を求めることが多い。行列$A$の性質によって逆行列を求めるためのさまざまなスキームが存在するが，**コードを書くときはさしあたりsolveメソッドを使うだけで良いと思われる...。**
連立一次方程式を解く初歩的な数値計算の手法としてガウスの消去法，ヤコビ法，ガウス-ザイデル法，共役勾配法などがある[2]。必要になったときに調べると良いだろう。

***

#参考文献

[1] numpy.linalg.solveについての説明: https://docs.scipy.org/doc/numpy-1.7.0/reference/generated/numpy.linalg.solve.html

[2] 川上一郎，[「数値計算」](https://www.amazon.co.jp/%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97-%E7%90%86%E5%B7%A5%E7%B3%BB%E3%81%AE%E6%95%B0%E5%AD%A6%E5%85%A5%E9%96%80%E3%82%B3%E3%83%BC%E3%82%B9-8-%E5%B7%9D%E4%B8%8A-%E4%B8%80%E9%83%8E/dp/4000077783)，岩波書店，1989.

@演算子について: [[Pythonによる科学・技術計算] @演算子による行列積の計算, python3.5以降, numpy](Pythonによる科学・技術計算] @演算子による行列積の計算, python3.5以降, numpy)
Ponyで安全(reference capability)なクロージャ

# Ponyとは

皆さん[Pony](https://www.ponylang.org)という言語はご存知でしょうか？　簡単に言うと「Actorモデルを採用した並行・並列処理を行うことができる静的型付けオブジェクト指向言語」です。さらに、**capabilities-secure**と呼ばれるコンパイル時に型だけでなく並行処理に関するエラーなどを検知する機能が豊富に備わっている言語です。その中でも初歩の概念である、**reference capability**についてクロージャを通して簡単に紹介してみたいと思います。

# クロージャを利用したカウンター

クロージャの例としてよく挙げられるカウンターの実装です。Ponyのreference capabilityの威力がわかりやすいようにいくつかの言語で実装をしてみました。

いずれの言語も以下のような結果が出力される想定です。

```
1
2
3
4
5
6
7
8
9
10
```

JavaScript

```js
const createCounter = () => {
    let count = 0;

    return () => {
        count += 1;
        return count;
    }
}

const counter = createCounter();

Array.from({length: 10}, () =>
    console.log(counter())
)
```

Java

```java
import java.util.function.*;
import java.util.stream.IntStream;

public class Counter {
    public static void main(String ...args) {
        final Supplier<IntSupplier> createCounter = () -> {
            // countはfinalのため配列を利用して値を書き換える。
            final Integer[] count = {0};

            return () -> {
                count[0]++;
                return count[0];
            };
        };

        IntSupplier counter = createCounter.get();
        IntStream.rangeClosed(1, 10).forEach(i -> {
            System.out.println(counter.getAsInt());
        });
    }
}
```

Scala

```scala
object Counter extends App {
  val createCounter = () => {
    var count = 0

    () => {
      count += 1
      count
    }
  }

  val counter = createCounter()

  (1 to 10).foreach { _ =>
    println(counter())
  }
}
```

JavaScriptとScalaによる実装は考え方が似ています。どのような点で似ているかというと、無名関数が自由変数を取り込み、クロージャとなり、自由変数の値を書き換えることができるという点です。

一方 Javaは、実質的に```final```で宣言された変数(※1)しか自由変数として取り込めないため、プリミティブな値ではなく、配列などのミュータブルなオブジェクトを取り込み参照先を書き換える事でしか値を変更することができません。これはクロージャとしては、安全で正しい振る舞いではありますが、利便性や可読性の点からすると厳しいものがあります。

# Ponyによるカウンター

それでは Ponyは、どのようなアプローチで上記に上げた言語の問題を解決しているのでしょうか？ コード中に現れる、```count```という変数に注目してみましょう。Ponyは標準ではラムダ式の外から取り込んだ自由変数の値を書き換える事が出来ません。この点では、Javaと同じ動きをします。もし、変数の値を書き換えたいときは、```ref```キーワードをラムダ式に付与します。そうすることで、ラムダ式自体が中で変数の書き換えを行うことを許可します。また、```count```を更新しているラムダ式の外では、```count```は、0のままになります。本当に更新したい場合にはJavaと同じように配列などに入れる等のアプローチが必要ですが、そのようなケースは少ないと思われるので非常に安全なコードを書けます。

```scala
use "collections"

actor Main
  new create(env:Env) =>
    let createCounter = {(): {ref(): U32} => 
      var count = U32(0)
      
      // refキーワードを利用することで、countの値を書き換えることが可能になる。 
      {ref()(count): U32 => 
          count = count + 1
          count
      }
    }
    
    let counter = createCounter()
    
    for i in Range[U32](0, 10) do
      env.out.print(counter().string())
    end
```

```ref``` キーワードをを取り除いてコンパイルした場合は、以下のようなエラーがでます。とてもわかり易いですね。

```
Error:
main.pony:9:17: cannot write to a field in a box function. If you are trying to change state in a function use fun ref
          count = count + 1
```

# まとめ

非常に簡単な例ではありますが、クロージャを通して**capabilities-secure**なコードの威力が伝わったでしょうか？ 言語仕様により、書き換えが可能・不可能かを一本化するのではなく、モードの切り替えで安全にコードが書けるのは魅力的だと思います。これは、Ponyの**capabilities-secure**の魅力のホンの一端でしかありません。是非、一緒にPonyの魅力に触れていきましょう！

# 補足
※1 Javaでは、自由変数の再代入が無ければ```final```キーワードを避けることはできます。しかし、今回の用途では必ず再代入が発生するため、実質的に```final```キーワードは必須です。
新人Ruby / Rails開発者 を試す N の質問

> 「子孫クラスからしか使わないので、privateにしましょう」
> 「えっ？」

Ruby/Rails は間口が広い言語/FWです。

今まで他言語で開発していて最近Railsプロジェクトに入ってきたエンジニア・・・そう、あなた。あなたも公式・非公式のドキュメントを読めば、数日である程度のコードを書けるようになったはずです。

でも、「よし、Railsのことは大体わかってきたぞ」と思っていませんか？
初心者がハマリがちな**落とし穴**も実は色々あるんですよ。

この記事では、そういった落とし穴を炙り出す質問を列挙してみましょう。

# なにはともあれ読んでおいて欲しいページ
とはいえ、落とし穴に炙り出す前に、基本的な資料は読んで置いた方が建設的です。

Rails チュートリアル
https://railstutorial.jp/

Rails ガイド
https://railsguides.jp/

Rails APIリファレンス
http://api.rubyonrails.org/

Ruby リファレンスマニュアル
https://docs.ruby-lang.org/ja/2.4.0/doc/index.html

Ruby 標準ライブラリ一覧
https://docs.ruby-lang.org/ja/2.4.0/library/index.html

# Ruby編

## Rubyのprivate / protected と、C++の private / protected の違いを説明してください。

## private なクラスメソッドを定義する方法を説明してください。

## Pythonでは bytes型とstr型がありますが、RubyにはString型しかありません。両者の違いを説明してください。

## Gemfileには各gemのバージョンを様々に指定することができますが、いつ、どんな内容を指定するべきか、説明してください。

## Gemfile.lock はVCSにコミットするべきかですか？ 理由を説明してください。

# Rails編

## ActiveModel::Model の #assign_attributes メソッドの動作を説明してください

## StrongParameterはなんのための機能か説明してください。

## routesファイルで使えるメソッド、resource, namespace, scoping の機能を説明してください。

## 本来の「MVC」という用語における "model" と、Railsにおける "model" にはズレがあることがよく指摘されますが、ズレの内容について説明してください

## Fat Controller 問題と Fat Model 問題について、問題の内容と解決方法について説明してください

# 以下、随時追加
[Pythonによる科学・技術計算] 逆行列の計算,  numpy

numpyを用いて行列の逆行列を計算する。**行列オブジェクトにI(Inverseの頭文字)を付けるだけで良い。**

例題: 行列Aの逆行列を求める。

```py3
import numpy as np
"""
Aの逆行列A^-1を求める
calculate the inverse matrix of A
"""

# 行列Ａの生成 make A 
a1_lis = [1, 0, 0]
a2_lis = [0, 2, 0]
a3_lis = [0, 0, 4] 
A_matrix=np.matrix([a1_lis, a2_lis, a3_lis])
##

A_inv_matrix=A_matrix.I  # 逆行列の計算
print(C_matrix)
```
###結果
[[ 3  0  0]
 [ 2  4  0]
 [ 4  0 16]]
***

###補遺
以下のようにもかける。

```py3
A_inv_matrix = np.linalg.inv(A_matrix)
```
Thunderbirdのprefs.jsが壊れていきなりアカウントが消えちゃったので直した話

ちょっとトラブったけど直せた、かつググってもあまりヒットしなかったのでメモ。

今朝、出社していつものようにスタートアップで立ち上がったThunderbirdでメールを見ようとしたら、なぜかアカウントの新規作成画面が表示されていた。

突然のことに戸惑いつつThunderbirdのプロファイルディレクトリー(通常 `C:\Users\<ユーザー名>\AppData\Roaming\Thunderbird\Porifles\` 以下にある)を見てみたが、ぱっと見おかしなところは見つからなかった。
容量からして、メールの中身もなくなってはいないらしい。

ひとまずProfilesディレクトリー全体のバックアップをとってから、
仕方なくインフラ担当に再設定方法を確認して再度ログインするも、保存していたメールはすべて見えなくなっていた...。
本体は残っているのにおかしいなぁ、と思いながら更にプロファイルディレクトリーをあさると、
Invalidprefs.jsなるファイル(`C:\Users\<ユーザー名>\AppData\Roaming\Thunderbird\Profiles\<適当な文字列>.default\Invalidprefs.js`)を発見。名前からしてなんだか怪しい。

**Thunderbirdを終了した状態で**エディター(BOMなしUTF-8のファイルが開けるエディターを使おう！）で開いてみると、文字化けしている文字がありつつも、内容からしてどうやら設定ファイルらしいことが読み取れた。
名前の通りやはりJavaScriptらしき文法で書かれていた（ただし、コメント行が`#`で始まる、ちょっと変わったものだったが）ので、文字化けした文字とともに文法を直して保存してみた。

同じディレクトリーにprefs.jsというファイルがあり、それには初期設定らしき内容がやはりInvalidprefs.jsと同じ文法で書かれていたので、文字化けを直した上でpref.jsにリネームして上書きした。
その上でエディタを終了し、Thunderbirdを起動させるとあっさり復活した。
古いメールもちゃんと読み取れる。
どうやらこのprefs.jsが何かの拍子で（恐らくThunderbirdのバグで）壊れてしまったらしく、それが原因でアカウントがないことになっていたらしい。
エディターだけで直せてよかった。テキストファイルは偉大ですね！
[Pythonによる科学・技術計算] @演算子による行列積の計算, python3.5以降, numpy


python3.5以降， 行列Aと行列Bとの積ABを @演算子を使って
**A@B**
と書けるようになった。この@演算子を用いることで，コーディングにおける可読性が向上する。
ただし以下のコードでみるように**行列AおよびBを配列オブジェクトではなく行列オブジェクトとして生成しておく**必要がある。


###内容 @演算子を使って行列積を計算する。



```py3
import numpy as np

"""
行列の積
C = A B
"""

# 行列Aを作る
a1_lis = [1, 0, 0]
a2_lis = [0, 2, 0]
a3_lis = [0, 0, 4] 
A_matrix=np.matrix([a1_lis, a2_lis, a3_lis])# "np.array"ではなく，"np.matrix"として行列オブジェクトを生成

# 行列Bを作る
b1_lis = [3, 0, 0]
b2_lis = [1, 2, 0]
b3_lis = [1, 0, 4] 
B_matrix=np.matrix([b1_lis, b2_lis, b3_lis]) #


C_matrix = A_matrix @ B_matrix  C = A Bの計算
print(C_matrix)

```

##結果

[[ 3  0  0]
 [ 2  4  0]
 [ 4  0 16]]

***

###補遺 @演算子を使わない場合

行列AとBを， 行列オブジェクトではなく配列オブジェクトとして生成した場合(np.array()とする)は，
上のコードの
C_matrix = A_matrix @ B_matrix  

の部分は以下のように書く必要がある。

**C_matrix = A_matrix.dot(B_matrix)**
【いまさらですが】package.jsonのdependenciesとdevDependencies

package.jsonのdependenciesとdevDependenciesの使い分けについて、いまさらですがまとめます。


#dependenciesとdevDependenciesの違い
例えば、`sample`という名前のパッケージを開発しているとします。
dependenciesには`request`、devDependenciesには`mocha`が書かれているとします。

```package.json
{ 
  "name": "sample",
  "dependencies": {
    "request": "^2.81.0"
  },
  "devDependencies": {
    "mocha": "^3.4.2"
  }
} 

//このほかの要素は省略します 
```

開発者がpackage.jsonがあるディレクトリで`npm install`を行うと、`dependencies`に書かれているパッケージも`devDependencies`に書かれているパッケージもすべて`node_modules`内にインストールされます。
つまり、requestもmochaもどちらもインストールされます。

ですが、こちらをパッケージとして公開し、開発者以外の人が`npm install sample`としたときには、`dependencies`に書かれているパッケージが`node_modules`内にインストールされ、`devDependencies`に書かれているパッケージはインストールされません。
つまり、requestのみがインストールされます。

`devDependencies`には、開発に必要なパッケージのみを書きます。
ですので、パッケージを使いたい人が`npm install パッケージ名`としたときには`dependencies`に書かれているパッケージのみがインストールされます。
一方で、開発者がこのpackage.jsonがあるディレクトリで`npm install`を行うと、`dependencies`に書かれているパッケージのみではなく、`devDependencies`に書かれているパッケージもインストールされます。

#package.jsonへの追加方法

###dependenciesに追加したいとき

```console
$npm install --save request
```

`--save`オプションを付けて、パッケージをインストールします。

###devDependenciesに追加したいとき

```console
$npm install --save-dev mocha
```

`--save-dev`オプションを付けて、パッケージをインストールします。

#package.jsonに書かれているパッケージをインストールする

###package.jsonに書かれているすべてのパッケージをインストールする

```console
$npm install
```

上で書いたように、package.jsonがあるディレクトリで`npm install`すると、`dependencies`に書かれているパッケージも`devDependencies`に書かれているパッケージもインストールされます。

###package.jsonのdependenciesに書かれているパッケージのみインストールする

```console
$npm install --production
```

開発者として、package.jsonがあるディレクトリで`npm install`するときも、`dependencies`に書かれているパッケージのみをインストールすることができます。
`--production`オプションをつけることで、`dependencies`に書かれているパッケージのみインストールされます。
Access violationに惑わされて4時間奪われた話

# あらすじ

C#で外部の端末との連携開発をしていて、OCXをWindows Formに貼りつけ[^1]、event発火処理部分のDebugしているときに、ブレークポイントに引っかからず「vshost32.exe は動作を停止しました」なんていうダイアログが出て、スタックトレースも見れない状況で困っていた。

[^1]: 正確にはOCXを貼りつけたUserControlをWindorsFormに貼りつけた。OCXを直接使う部分はUserControlにコードを書いて、WindowsFormはUserControlのインターフェースメソッドを呼び出す。

# 困ったらとりあえずGoogle
仕方なくVisual Studioの出力ウィンドウを見ていたら、<b>インジケータが出ているときにキャンセルボタンを押したとき</b>[^2]に、こんな1行があった。

[^2]: インジケータが消えてデバッグするかそのまま終了するか選べるようになって終了を押したら、「プログラム '[12488] TestApp.vshost.exe' はコード 255 (0xff) で終了しました。」が出てきた。

> プログラム '[3284] TestApp.vshost.exe' はコード -1073741819 (0xc0000005) 'Access violation' で終了しました。

「Access violation」？なんだコイツは……と思ってググる。
要約すると、

> 保護されたメモリの読み取りまたは書き込みが試行されたときにスローされる例外。

ということらしい。
ああOCXはC++みたいなもんだし(勝手な解釈)、メモリ周りの問題あるある……と思ったものの、そもそもOCXは端末作ってる会社から提供されたものだし、こっちのコードの問題の可能性が高いと思い、ググり直し。
「C# OCX Access Violation」「OCX event access violation」「windows form access violation」…のように、ひたすらググって、英文読んで(Goolge翻訳大先生を使ったけど)、コード書き換えて、試行錯誤して……

……直らん。

考え方を変えて、「AccessViolationExceptionの中身を見よう」という方向へ。
と言ってもこの考え方が後回しになったのは理由があって、ググってる途中に以下の記事を見つけて、この方向は無いなと自己完結してしまったから。

[AccessViolationExceptionを捕捉できるようにする](http://blog.xin9le.net/entry/2015/07/22/053738)

要約すると、

> * .NET Framework 3.5 以前は AccessViolationException を catch できていたが、.NET Framework 4 以降ではできなくした。
> * すでにメモリアクセス違反が発生してしまったものを復旧しつつ挙動させることは極めて困難だから、中途半端になって2次災害を引き起こすよりも突然の死を選ぶ方が安全である。

まあそらそうだ……と。

# 結局

でも**ブレークポイントで止めて内容を確認する**ぐらいならいいだろと、「debug AccessViolationException」みたいにググった一番上……
[c# - How to debug AccessViolationException coming from native code - Stack Overflow](https://stackoverflow.com/questions/3245185/how-to-debug-accessviolationexception-coming-from-native-code)

> Project + Properties, Debug tab, tick **"Enable unmanaged code debugging"**.

ん？こんな簡単に？まあやってみるか。
**「プロジェクトのプロパティ＞デバッグ＞ネイティブ コードのデバッグを有効にする(T)」にチェック**
ビルドして動かしてみるけど、まあ無理かな…

……

**直った。**

vshost32.exeが強制終了しなくなった。
4時間[^3]が1クリックで済むレベルだったなんて……

[^3]: この記事書くのに1時間使ったので正確には5時間です。

# ここでテスト

- [ ] ネイティブ コードのデバッグを有効にする(T)
- [x] Visual Studio ホスティング プロセスを有効にする(O)

→　NG

- [x] ネイティブ コードのデバッグを有効にする(T)
- [x] Visual Studio ホスティング プロセスを有効にする(O)

→　OK

- [ ] ネイティブ コードのデバッグを有効にする(T)
- [ ] Visual Studio ホスティング プロセスを有効にする(O)

→　OK

つまり、vshost32.exeっていう名前のVisual Studioホスティングプロセスが悪さをしていたということ……なのかな。ただ、どんな悪さをしていたのかまでは調べる気力が尽きました。

# ちなみに

UserControlをクラスライブラリ、Windows FormをWindowsアプリケーション、というように別プロジェクトで作ったんですが、変えたのはWindowsアプリケーションのほうのプロジェクトで、クラスライブラリのプロジェクトは変えてないです。

………いまどきOCX周りで困る人って少数なんじゃないかな(偏見)

#### 追記(2022/08/03)

View数的に、特殊な内容ではあるものの、結構困ってる人がいるみたい。
Ruby on Railsでransackを用いた検索機能の実装 

#前提
[Railsチュートリアル](https://railstutorial.jp/)第10章が完成していること

#用意
今回はgemの一種で検索機能を簡単に実装してみる！

```ruby:gemfile
   source 'https://rubygems.org'
   gem 'rails',           '5.0.3'
                   :
                   :
   gem 'ransack'  #新たに記述
```

```ruby:インストール
 $ bundle install
```

これでransackの準備ができた。

#実装
ransackをインストールすると
 ~~searchメソッドと~~
 resultメソッドが使用できるようになる。

コメントである通りsearchメソッドは他のgemや自身のプログラム内でコンフリクトが起こる可能性があるため非推奨のようだ。

そのためsearchメソッドの使用よりもransackメソッドを使用することが推奨されている。

```ruby:UserController
def index
  @users  = User.paginate(page: params[:page])
  @search = User.ransack(params[:q])  #追加
  @result = @search.result           #追加
end
```

```ruby:views/users/index.html.erb
<% provide(:title, 'All users') %>
<h1>All users</h1>

<%= search_form_for @search  do |f| %>
  <div class="form-group">
    <%= f.label :name_cont, "Name" %>
    <%= f.text_field :name_cont, class: "form-control" %>
  </div>
  <div class="actions"><%= f.submit "Search" %></div>
<% end %>
```

これだけので検索ユーザの名前で検索することができるフォームが完成。

しかし、検索結果を表示するコードも書かないといけなかった。

```ruby:views/users/index.html.erb
<% provide(:title, 'All users') %>
<h1>All users</h1>

<%= search_form_for @search  do |f| %>
  <div class="form-group">
    <%= f.label :name_cont, "Name" %>
    <%= f.text_field :name_cont, class: "form-control" %>
  </div>
  <div class="actions"><%= f.submit "Search" %></div>
<% end %>

<% if @result.any? %>
  <%= render @result %>
<% end %>

<% if @result.nil? %>
  <ul class="users">
    <%= render @users %>
  </ul>
<% end %>
```

result内に検索結果と合致するものがあれば出力し、なければ全ユーザを出力する。

これで完成！！
bundler で cocoapods そのもののバージョン管理をする

iOS開発で各種プラグインを管理するために、cocoapodsを利用していると思いますが
cocoapods自体のバージョンが変わってしまうとPodsファイルの挙動も変わってしまうので
できるだけプロジェクトと一緒に管理できたほうがメリットが多いです。

そこでcocoapodsをみんな同じ状態でつかえるように
cocoapodsのバージョン管理に関してまとめました。


## rbenvとbundlerをインストール

まずは `rbenv` と `bundler` をインストールします。

`cocoapods` は rubyのgemと呼ばれるものの1つのため
rubyのバージョン管理・切り替えが行える `rbenv` と
gemのローカル管理ができる `bundler` をインストールします。

こちらに関しては下記のページにまとまっていますので
そちらを見ながらbundlerのインストールまで
進めていただければと思います。

[MacにHomeBrew,rbenv,bundlerをインストールする \- Qiita](http://qiita.com/shinkuFencer/items/3679cfd966f6a61ccd1b)

> *NOTE:*
今回 `rbenv` を推奨しているのは、Rubyのバージョンを固定するためなので
`RVM` やほかのものでバージョン固定していただければ他の方法でも問題ありません。

## bundlerでcocoapodsのセットアップ

### bundlerのインストール確認
bundlerが入っているかを確かめます。
ターミナルで以下のコマンドを打ってください。
bundlerが入っていれば、バージョンとともに表示されます。

```bash:ターミナルでbundlerが入っているかの確認
$ gem list | grep 'bundler'
bundler (1.14.6)
```

何も表示されなかったらgemインストールが完了していないので
今一度bundlerインストールの手順を確認してみてください。


### Gemfileのセットアップ

bundlerの設定ファイルを作ります。
今作っているアプリのプロジェクトルートまで移動しコマンドを叩きます。

```bash:ターミナルで当該ディレクトリに移動して設定ファイル生成
# iOSアプリのプロジェクトのルートディレクトリが~/project/ios/ の場合
$ cd ~/project/ios/
$ bundler init
```

上記実行後、新しく `Gemfile` ができていればOKです。
中身を開くと以下のようになっています。

```rb:Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

# gem "rails"
```

このファイルを元にインストールするgemを決定します。
今回は例として`1.2.1` で固定したい場合の記述を
例示として記載します。

```rb:Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

gem 'cocoapods' , '1.2.1'
```

これでインストール準備は完了です。

### cocoapodsを使えるようにする

`bundler` では指定した場所にプラグインのファイルを配置できるので、明示的に配置します。
わかりやすいディレクトリならどこでも問題ありませんが
今回はメジャーな `vendor/bundle` を指定します。

```bash:ターミナルでcocoapodsのインストール
$ bundle install --path vendor/bundle
```

このコマンドを実行すると
実際に指定したバージョンの `cocoapods` を落としてきます。

インストールが完了したら、実際に使えるかやってみます。

```bash:ターミナルでcocoapodsのバージョン確認
$ bundle exec pod --version
1.2.1
```

## 実際にインストールする

以下のコマンドで実行します。

```bash:ターミナルでcocoapodsインストール実行
$ bundle exec pod install
```

なお、アップデートのときは以下

```bash:ターミナルでアップデート実行
$ bundle exec pod update
```

## その後のバージョン管理

このあとは `Gemfile` を一緒にバージョン管理しておけば
どの `cocoapods` のバージョンでインストールしたかが一目瞭然になるので
『`cocoapods` のバージョンが違ってうまくいかない！』ということが減ると思います。


## (おまけ).gitignoreの追加

bundlerで入れるファイルは
バージョン管理の対象にしなくてもいいので
`bundle install --path` で指定したパスを追記しておきます。
今回の例だと `vendor/bundle` なので以下のように記述を追記

```text:.gitignore
vendor/bundle
```


## 参考リンク

* [iOSライブラリ管理ツール「CocoaPods」の使用方法 \- Qiita](http://qiita.com/satoken0417/items/479bcdf91cff2634ffb1)
* [cocoapodsの仕組みとバージョン固定 \- Qiita](http://qiita.com/AcaiBowl/items/f48f9d0f53f1448720ec)
* [cocoapodsのバージョン管理のやり方 \- Qiita](http://qiita.com/abeyuya/items/cec3f0823c6e91f3220a)
gitでpushがうまく行われなかった対処法

#gitでpushができなかった
```ruby:エラー内容
fatal: 'master' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
```

masterがないのはどう考えてもおかしい！！！

調べてみると鍵の設定を行っていないため出るエラーらしい...


**masterがないのはどう考えてもおかしい！！！**

```ruby:ステータス見てみる
 $ git status
     
#       ../../.bash_history
#       ../../.bash_logout
#       ../../.bash_profile
#       ../../.bashrc
etc
```

管理してる範囲が違うんじゃないかな？
うっかりgit initする場所間違ってる！(・ω<)

##解決

```ruby:管理範囲の変更
 $ rm -rf .git
 $ cd [管理におきたいディレクトリ]
 $ git clone [git@...]
```

で無事にpushできるはず。
コードレビューしてくれる人がいるのは幸せだな。
[Ruby on Rails] SubModel in Model

```
Category
  Sub Category
  Sub Category
  Sub Category
```

```ruby:migrate.rb
class CreateCategories < ActiveRecord::Migration[5.0]
  def change
    create_table :categories do |t|
      t.string :name
      t.references :parent

      t.timestamps
    end
  end
end
```

```ruby:model.rb
class Category < ApplicationRecord
  has_many :categories, class_name: 'Category', foreign_key: 'parent_id',
    dependent: :destroy
  belongs_to :parent, class_name: 'Category', optional: true
end
```

`c.parent`
`c.categories`
JXAのコードをnode.jsへ移譲する例

使用OS: macOS 10.12

```js
function nodejs(fn,lp='/usr/local/bin/node') {
	let code = `console.log(JSON.stringify((${fn.toString()}).apply(null,JSON.parse(process.env.NODE_ARGS))))`
	let data = $(code).dataUsingEncoding($.NSUTF8StringEncoding)
	return function(...args) {
		return new Promise((res,rej) => {
			let i = $.NSPipe.new
			i.fileHandleForWriting.writeData(data)
			i.fileHandleForWriting.closeFile
			let o = $.NSPipe.new
			let e = $.NSPipe.new
			let t = $.NSTask.new
			t.standardInput = i
			t.standardOutput = o
			t.standardError = e
			t.launchPath = lp
			t.environment = $({'NODE_ARGS':JSON.stringify(args)})
			t.launch
			t.waitUntilExit
			let out = o.fileHandleForReading.readDataToEndOfFile
			if (out.length>0) {
				try {
					res(JSON.parse($.NSString.alloc.initWithDataEncoding(out,$.NSUTF8StringEncoding).js))
				} catch(e) {
					rej(e)
				}
			}
			let err = e.fileHandleForReading.readDataToEndOfFile
			if (err.length>0) {
				rej({
					message: $.NSString.alloc.initWithDataEncoding(err,$.NSUTF8StringEncoding).js,
					status: t.terminationStatus,
				})
			}
		})
	}
}

foo=(x,y)=>x+y

nodejs(foo)(1,1)
.then (console.log)
.catch(r=>console.log('failure',r.message))
```
UISliderをコードで作る | Swift3.0 

# 説明

コードからUIスライダーを作ってみます。コードの方が細かい微調整がしやすいので便利です。コピペ要員として溜め込んでおけますしね... 笑

![on.gif](https://qiita-image-store.s3.amazonaws.com/0/135794/09c4d9f0-0909-81f3-b126-3753a3cf1c74.gif)

# 実装

```swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        // 一つめのスライダー
        let startPointSlider = UISlider(frame: CGRect(x:0, y:0, width:350, height:30))
        startPointSlider.layer.position = CGPoint(x:self.view.frame.midX, y:500)
        startPointSlider.backgroundColor = UIColor.white
        startPointSlider.layer.cornerRadius = 10.0
        startPointSlider.layer.shadowOpacity = 0.5
        startPointSlider.layer.masksToBounds = false
        startPointSlider.addTarget(self, action: #selector(self.onStartPointlabel(_:)), for: .valueChanged)
        
        // 最小値と最大値を設定する.
        startPointSlider.minimumValue = 0
        startPointSlider.maximumValue = 100
        
        self.view.addSubview(startPointSlider)

        //一つめのラベル
        let startPointlabel = UILabel()
        startPointlabel.text = "start point"
        startPointlabel.sizeToFit()
        startPointlabel.layer.position = CGPoint(x:self.view.frame.midX, y:450)
        self.view.addSubview(startPointlabel)
 
        // 二つめのスライダー
        let endPointSlider = UISlider(frame: CGRect(x:0, y:0, width:350, height:30))
        endPointSlider.layer.position = CGPoint(x:self.view.frame.midX, y:600)
        endPointSlider.backgroundColor = UIColor.white
        endPointSlider.layer.cornerRadius = 10.0
        endPointSlider.layer.shadowOpacity = 0.5
        endPointSlider.layer.masksToBounds = false
        endPointSlider.addTarget(self, action: #selector(self.onEndPointlabel(_:)), for: .valueChanged)
        
        // 最小値と最大値を設定する.
        endPointSlider.minimumValue = 0
        endPointSlider.maximumValue = 100
 
        self.view.addSubview(endPointSlider)
        
        //二つめのラベル
        let endPointlabel = UILabel()
        endPointlabel.text = "end point"
        endPointlabel.sizeToFit()
        endPointlabel.layer.position = CGPoint(x:self.view.frame.midX, y:550)
        self.view.addSubview(endPointlabel)
        
    }
    
    /*
     Sliderの値が変わった時に呼ばれるメソッド
     */
    
    func onStartPointlabel(_ sender:UISlider!)
    {
        print(sender.value)
        
    }
    
    func onEndPointlabel(_ sender:UISlider!)
    {
        print(sender.value)

    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}

```

# ソース

[GitHub](https://github.com/Ryosuke-Hujisawa/UISlider-code-Swift-3.0)
[UISliderをコードで作る | Swift3.0 ](http://off.tokyo/blog/2017/07/21/uislider%E3%82%92%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E4%BD%9C%E3%82%8B-swift3-0/)
Raspberry PiにLAMP環境でWordpressを構築する際の注意点

#重要なのはJessieからの変更点
[公式ガイド](https://www.raspberrypi.org/learning/lamp-web-server-with-wordpress/worksheet/)に従えばまず間違いないのですが、日本語の参考・翻訳ページは古いものも多かったので、2017年7月時点での構築方法について。

LAMPとはLinux, Apache, MySQL, PHPの頭文字を取ったものです。
これらを用いてRaspberry Pi3にWordpressを構築しようというお話。

##Apache web serverのインストール
`sudo apt-get install apache2 -y`
オプションの-yは、確認事項に全て自動でイエスと答えることを意味します。

インストール完了後、アドレスに`http://localhost/`またはRaspberry PiのIPアドレス(192.168.X.Xなど)を打ち込んでください。
IPアドレスは`hostname -I`でも確認できます。

Apache2のデフォルトページが表示されれば、インストール完了です。

※なお、ドキュメントルート(フォルダ)は、**Rasbian Jessieの場合は
`/var/www/html/`となっているので注意。**
(Rasbian Wheezyだと`/var/www/`)

上記のApache2のデフォルトページは、Jessieの場合`/var/www/html/index.html`を指しています。
以下、Jessieを前提に説明を進めます。

##PHPのインストール
つづいてPHP。
`sudo apt-get install php5 libapache2-mod-php5 -y`
まとめていきます。
`sudo php -r "echo'Hello, world.';"`
でメッセージが表示されれば完了です。phpファイルを作成してテストしても構いません。

##MySQLのインストール
`sudo apt-get install mysql-server php5-mysql -y`
インストール時にパスワードの設定を求められます。後程使うのでメモっておきましょう。

##Wordpressのインストール
`cd /var/www/html/` ディレクトリを移動します。
`sudo rm *` htmlディレクトリのファイルをすべて削除します。
`sudo wget http://wordpress.org/latest.tar.gz`
wgetコマンドで最新のソースをWordpressファイルをダウンロードします。

`sudo tar xzf latest.tar.gz` ファイルを解凍し、
`sudo mv wordpress/* .` 作成されたwordpressディレクトリの全てのファイルを1つ上のディレクトリ(/var/www/html/)へ。

`sudo rm -rf wordpress latest.tar.gz`
wordpressディレクトリと圧縮ファイルを削除します。

最後に、権限を変更します。
`sudo chown -R www-data: .`
コロン(:)とピリオド(.)の間にスペースが1つあるのに注意です。

##MySQLの設定
`mysql -uroot -p`
MySQLにroot権限でログインします。

`mysql> create database wordpress;`
wordpress用のデータベースを作成します。
成功すれば下記のようなメッセージが表示されます。
`Query OK, 1 row affected (0.00 sec)`
MySQLを終了するにはCTRL+Dです。

##Wordpressの起動
先ほど調べたIPアドレスに再度アクセスします。
**同一LAN内の機器からもアクセス可能なので、Raspberry Piを再度ディスプレイ接続しなくても大丈夫です。**
Wordpressの初期設定画面が表示されれば完了です。
画面の指示に従って操作を進めてください。

途中、データベースとのリンクを設定しますが、先ほど作成したデータベースを選択し、ユーザーはroot、パスワードも設定したものを入力します。

インストールが完了します。

###これでもエラーが発生する場合
・Wordpressファイル群は正しいディレクトリに配置されているか(Jessieの場合、`/var/www/`ディレクトリに置いてしまうとファイルが認識されず404エラーとなります。`/var/www/html`です。)
・パーマリンクの設定
Apacheサーバーの設定によってはルート以下のファイルへのアクセスをはじいてしまう場合もあるようです。こちらの記事が参考になります。
[WordPressのパーマリンクが表示されないときの解決法](http://qiita.com/hyperkinoko/items/de018714c95e675fd5f9)

###英語が読めることに越したことはない
今回はほぼ公式のマニュアルを和訳しただけですが、製品が作られたのも外国、使う人が多いのも外国となると必然的に情報は英語頼りになります。マニュアルの文章は平易なものも多いので、この機会に読んでみるのはいかがでしょうか。
NativeScriptで作った自前クラスを特定のJavaパッケージにマッピングする

JavaクラスをExtendした自前クラスをTypeScriptで定義し、それを指定の名前空間（パッケージ）のJavaクラスとして宣言する方法。あまり需要はないかもしれませんが、TypeScriptでのサンプルが公式でも不足しており、実装時に意外にハマったので、備忘です。

```ts
@JavaProxy("xxx.MyFirebaseInstanceIDService")
export class MyFirebaseInstanceIDService extends com.google.firebase.iid.FirebaseInstanceIdService {

	constructor(){
		super();
		return global.__native(this);
	}
}
```

@JavaProxy が良い仕事をしてくれます。
constructorの実装はNativeScript＋TypeScriptでネイティブのクラスを継承したときのお約束。

なお、上のコードは自前でFirebaseのプッシュを実装しようとしたときの例です。このクラスをAndroidManifest.xmlのServiceに定義して呼び出すことはできましたが、もう一つの必須クラスである、FirebaseMessagingServiceを継承したクラスをインスタンス化するのが上手く行かず、断念しました。
railsで部分テンプレートについてまとめてみた

# 部分テンプレートとは
HTML構造の部分を共通化することによって、無駄なくビューファイルを作成することが出来ます。この共通化された部分を、 部分テンプレートといいます。


# render
部分テンプレートを用いる際に呼び出すメソッドです。
基本的な使い方は

```erb
<%= render partial: "部分テンプレート名" %>
```
pertialとはレンダリング処理を扱いやすい単位に分割するためのしくみです。パーシャルを使用すると、特定部分を別ファイルに保存しておくことが可能です。
部分テンプレートの名前は_から始まりますので例えば

```erb
<%= render partial: "sample" %>
```
これだと_sample.html.erbのファイルに書いていきます。

部分テンプレートにローカル変数を渡すことも可能です。

```erb
<%= render partial: "sample", locals: { sample: "hello" } %>
```
これだと、_sampel.html.erbファイルでhelloと代入された文字列がsampleとして使えます。

部分テンプレートは繰り返し表示に使う場合もあります。

```erb
<% @users.each do |user| %>
  <%= render partial: "user", locals: { user: user } %>
<% end %>
```
さらにここから短く書くことも出来ます。

```erb
<%= render partial: "user", collections:  "@users" %>
```
とすることもできます。データの繰り返し表示をする場合にはcollectionオプションを使います。こうすることでeachを使わないで書くことができます。
さらに短く書くことも可能です。

```erb
<%= render @users%>
```
いうような記述でも上の二つと同じように繰り返し表示として使えます。

# 補足(controllerで使う時のrenderについて)
```erb
def index
  @group = Group.find(params[:id])
  render :new
end

def new
  @group = Group.new 
end
```
indexアクションがよばれた場合、indexのviewが呼ばれるのではなく、
newのviewに飛びます。その時にindexアクションの@groupを保持してnewのviewに飛ぶことができるのですが、newアクションで書かれた、@groupをnewのviewで使うことはできないみたいです。
## 参考資料
Railsガイド https://railsguides.jp/layouts_and_rendering.html
NativeScript+TypeScriptで、未定義のJavaのクラスを呼び出す手順

NativeScriptでは、Androidの標準SDKは、 [tns-platform-declarations](https://www.npmjs.com/package/tns-platform-declarations)　をインストールすることで呼び出すことができますが、標準SDKでないものはエラーとなります。

例えば、

com.google.firebase.iid.FirebaseInstanceId.getInstance().getToken();

を使いたいとします。そのままIDEなどで以下のように記述すると...

![app_init_service_android_ts_-_xzshowcase_-____projects_NativeScript_xzshowcase_.jpg](https://qiita-image-store.s3.amazonaws.com/0/170712/c0db39ab-18d3-2493-f969-013dc7d10d0a.jpeg)

「Cannot find name 'com'」というエラーが出ていますね。

NativeScriptでは、実行時は全てのJava APIを呼び出すことができるのですが、TypeScriptでコンパイルエラーになっているのです。そんなときは以下の手順で使えるようにできます。

# パッケージをany宣言して使う (さくっと使いたいとき)

```
declare let com:any;
```

これだけです。comパッケージがany型として宣言されるので、コンパイルチェックに通るようになります。TypeScriptのチェックとか要らないからすぐに使いたいよ！というときにはオススメ。私もよく使います。ただし、後述するように多少の危険性もあるので、やっていることを理解してから使いましょう。

# TypeScriptの定義ファイルを作成(少し面倒ですが王道)

```ts:firebase.d.ts

declare module com {
	module google {
		module firebase {
			module iid {
				export class FirebaseInstanceId {
					static getInstance(): any;
				}
			}
		}
	}
}
```

名前空間を module 定義の入れ子で宣言し、使用するメソッド定義( getInstance )も追加しました。戻り値を any にしておくことで、この関数の戻り値に対しては**TypeScriptのチェックが効かなくなります**

# 定義ファイルを読み込みます

プロジェクトのルートにある references.d.ts に以下の定義を追加します。

```ts:references.d.ts
/// <reference path="./firebase.d.ts" />
```

# 呼び出す

準備ができました。
以下のように呼び出すことができるようになります。

```ts
let refreshedToken = com.google.firebase.iid.FirebaseInstanceId.getInstance().getToken();
```

# どちらが良いのか？

最初の any 宣言方式に比べると、TypeScriptの定義ファイル作成のほうは、面倒に感じられると思います。

別ファイルで入れ子でパッケージを宣言したりしてかなり手間暇がかかります。自分のアプリで使うだけなら、ここまでやる必要は無いかもしれません。ただ、外部の人が使うライブラリやプラグインを作るときには、こちらの方式のほうが良いでしょう。利用できるAPIを明確に定義できますし、型のチェックが効く＋IDE補完も効くので、利用者に安全に使ってもらうことができます。

逆に言うと、any 宣言してしまうと、メソッド名が間違えてようが引数の型が合ってなかろうがコンパイルが通ってしまい、実行時クラッシュの危険性がありますし、リファクタリングもしにくくなります。

例えば以下のように com.google.〜　の部分を com.googl と書いても、com を any宣言している場合にはなんのエラーも出ません。

```ts
let refreshedToken = com.googl.firebase.iid.FirebaseInstanceId.getInstance().getToken()
// 　　　　　　　　　　　　　↑通ってしまう
```

TypeScriptの定義ファイルを作成している場合には、 googl というモジュールは無いよ！というコンパイルエラーとなり、事前にエラーに気づくことができます。

メリット・デメリットを理解してから使いましょう。
Enjoy NativeScript!
【まずは】DockerでMySQLを起動してみる。(細かいことはあとにして)


## 動作環境
動作した環境は、以下の通りです。

```bash:Mac
$ uname -r
16.6.0

$ docker -v; docker-machine -v;  docker-compose -v;
Docker version 17.06.0-ce, build 02c1d87
docker-machine version 0.12.0, build 45c69ad
docker-compose version 1.14.0, build c7bdf9e
```



## 準備するファイル

準備するファイルは、以下の通りです。

```:フォルダ構成
docker/
　├ sql/
　│　└ ddl.sql
　└ docker-compose.yml
```

サービスの定義をします。今回は、MySQLを立ち上げます。

```yml:docker-compose.yml
version: '2'
services:
  mysql:
    image: mysql:latest
    container_name: <コンテナ名>
    ports:
     - "3306:3306"
    volumes:
     - ./sql:/docker-entrypoint-initdb.d
    environment:
        MYSQL_ROOT_PASSWORD: <rootのパスワード>
        MYSQL_DATABASE: <作成するDB名>
        MYSQL_USER: <ユーザ名>
        MYSQL_PASSWORD: <ユーザのパスワード>
```

SQLファイルの準備は任意です。不要であれば準備する必要はありません。
コンテナ作成時に実行するSQLが必要であれば準備します。テーブル定義のDDLを準備しておくのも良いでしょう。


```sql:ddl.sql
# 例えばこんな感じのヤツ

CREATE TABLE `MEMBER` (
  `MEMBER_ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `MEMBER_NAME` varchar(255) NOT NULL,
  `LAST_UPDATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`MEMBER_ID`)
);
```



## 起動

dockerフォルダに移動して、コマンドを実行します。

```bash:バックグラウンドで実行
$ docker-compose up -d
```

STATUS欄が[Up xx seconds]となっていれば起動しています。

```bash:起動確認
$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
52fa752aad15        mysql:latest          "docker-entrypoint..."   25 hours ago        Up 8 seconds        0.0.0.0:3306->3306/tcp   <コンテナ名>
```

## 接続

localhostの3306番ポートに、docker-compose.ymlで指定した<ユーザ名>と<ユーザのパスワード>で認証すれば接続することができます。

## まとめ

まずは、Dockerで得られるメリットを感じてもらえるようDockerの概念には触れませんでした。やりたいことが増えてから学ぶでも良いと思います。

イメージ作成、複数コンテナの連携、データの永続化...

このエントリーが、誰かの１歩めになれば幸いです。
angular-dashboard-frameworkの導入


VisualStudio編


ダッシュボードライブラリであるangular-dashboard-frameworkを試してみました。
https://github.com/angular-dashboard-framework/angular-dashboard-framework


まずは空っぽのプロジェクトを作成しました。
Coreではなく、.NetFramework プロジェクトで作成しました。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/b237038c-a983-b52f-57a7-58830fb83e7f.png)

Qick Install Packageで
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/0c4fc318-ba99-d6ad-0da9-eeac250f8345.png)

angularと打ってしばらく待ってリストを開くと、angular-dashboard-frameworkが現れるのでクリックします。
（出てこなかったら、angular-dashboard-frameworkと全部打ち込む）
その後、バージョンを選んでインストールボタンをポチッと押す。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/b6823abc-ee3e-4581-9ca3-f5c09d188f9f.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/862ff81e-6d49-7e0e-09b8-c1e0d1dc0197.png)

しばらく待つと依存関係も含めてbower_componentsの配下にライブラリが配置されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/2ff4e774-f9bf-beae-18ed-42e9f698be23.png)

ただし、angular-dashboard-framework（以下adf）のangularサポートバージョンは＜angular1.6ですが、
adf配下のbower.jsonには  "angular": ">=1.4",　としか書かれていないのでangularの最新版が入ってしまいます。
（2017/7/21執筆時でのadfの最新版は0.13.0であり、0.13.0では解決済み）

ということで、aspプロジェクト配下のbower.jsonに以下を追加
    "angular": "1.5",

これで、angularの1.5系が入ります。
うまくいかなかったらangularのフォルダごと削除してパッケージの復元とすると更新されるかと。


その後は、adfのウィジェットを入れていきます。
bower.jsonに以下を追加

    "adf-structures-base": "0.1.1",
    "adf-widget-linklist": "0.1.1",

サンプルを動かす為に以下も追加
    "angular-route": "1.5",
    "angular-local-storage": ">=0.2",



動作に必用なサンプルを以下から取得
https://github.com/angular-dashboard-framework/angular-dashboard-framework/tree/master/sample


index.htmlファイル、scripts、partialsフォルダをそれぞれプロジェクト配下へコピーします。

index.htmlファイルの中身は環境に合わせてリンクパスを変えます。


このままだとsrc/templatesが無いと怒られるので、以下のsrc/templatesフォルダをプロジェクトに配置します。
https://github.com/angular-dashboard-framework/angular-dashboard-framework

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/106a938a-300f-2776-4c39-b73fba4ffa90.png)

これでひとまずは動作しました。
あとはウィジェットを追加するか自作していけばよいかと。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/5dd6f31b-ebdd-b888-803b-f0be68d6434f.png)
Visual Studio でbower.json作成


Visual Studio にてどうやったら簡単にbower.jsonが作成されるか調べたのでメモです。

いくつか方法はあると思いますが、Quick Install Packageを使うのが簡単そうでした。

メニュー→プロジェクト→Quick Install Package と選択するか、
ソリューションメニューから右クリックでQuick Install Package と選択すると、

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/ba654101-d603-c3e9-9aa1-d470d49cc9a6.png)

Quick Install Packageダイアログが開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/67b05efd-5159-0d6d-12d6-7f39393eb5c4.png)
左側リストからBowerを選択して
導入したいライブラリを入力し（ここでインテリセンスが始動）Installボタンを押す事で、Bower installが始まります。

同時にbower.jsonも作成されます。



他にもCMDからbower initと入力すれば作成されるのですが、
果たしてどっちが簡単か・・・は好みでしょうか？
一発で分かる！Node.js npm bower の関係性

|言語|PHP|Node.js|Javascript|
|:--:|:--:|:--:|:--:|
|パッケージ管理ツール|Composer|npm|Bower|
|パッケージ管理ファイル|composer.json|package.json|bower.json|
|install先(default)|`vendor/composer/`|`node_modules/`|`bower_components/`|
FirebaseのログをBigQueryに貯めて分析するときにクエリの書き方で困ったのでメモ



## event_dimで検索したい場合の例
- _TABLE_SUFFIX使うと範囲指定できてお得
- UNNEST使うと検索可能になる
  - 詳しくは -> [BigQueryでのクエリの書き方](https://developers-jp.googleblog.com/2017/04/bigquery-tip-unnest-function.html)

```
SELECT COUNT(*)
FROM `some_app_IOS.app_events_*`, UNNEST(event_dim) AS event_dim
WHERE _TABLE_SUFFIX BETWEEN '20170601' AND '20170615'
AND event_dim.name = ‘user_engagement'
```

## その他参考リンク
- [公式document](https://firebase.google.com/docs/analytics/?hl=ja)
- [firebaseのbigqueryのexport時のスキーマ](https://support.google.com/firebase/answer/7029846?hl=ja)
- [firebase AnaliticsのデータをBigQueryにインポートする方法](https://cloud.google.com/solutions/mobile/mobile-firebase-analytics-big-query#header_1)
- [firebaseのリアルタイム送信についてのブログ](https://developers-jp.googleblog.com/2016/12/how-long-does-it-take-for-my-firebase-analytics-data-to-show-up.html)
- [firebaseのdataset名](https://cloud.google.com/solutions/mobile/mobile-firebase-analytics-big-query?hl=ja#datasets)
最近Laravelのプロジェクトを作ってgit管理しようとすると全部CRLFに変えようとしてくる問題

これは多分windowsだけの問題です。
Macとかだと問題ないんじゃないかな。。。

# 問題点

Laravelのプロジェクトを作成して、`git init`して`git add .`するとたくさんのファイルがCRLFに変換されてしまう。
gitの設定には問題は無いものとします。(自動変換OFFにしてある)

# 解決策

`.gitattribute`の１行目の`* text=auto`を消しましょう。
これで自動的にリプレイスされないようになります。

ここ最近この設定が追加されていて、windowsから利用しようとすると自動的に変換が走ってしまいます。windowsでの開発を前提としている場合は、この行を消してから利用するほうが良いでしょう。