OmniAICreator/Qiita-1.07M huggingface dataset:
Storjのストレージノードを運用する時のノウハウ

Storjのストレージノードを運用するにあたって、知っておくといい知識をメモっていきます

# 初期構築時は1グローバルIPあたり、ストレージノードは1個

サテライトノードは、なるべくデータを地理分散させたがるので、セグメントの近いところには配置されにくくなります。
なので、ノードを増やしたい場合は既存のストレージノードのHDDがいっぱいになってからのほうがいいみたいです

https://forum.storj.io/t/multiple-storeagenodes/1768

# 同一メールアドレスでノードキーは複数発行可能

今までは別のメールアドレスが必要でしたが、最近のアップデートにより同一メールアドレスでwaitlistに再登録が可能になったようです。
登録後、再度nodekeyが払い出されるまで待ちましょう。

https://twitter.com/storjproject/status/1190312545309089792?s=19

# サテライトノードから正式に認められるまで一ヶ月かかる

サテライトノードは今4台ありますが、それぞれが独立してストレージノードを評価します。
評価ポイントが100を超えると、めでたく正式に認められるようです。
だいたい1ヶ月くらいかかるとか

https://forum.storj.io/t/vetting-audit-process-duration/1458/21

# Raspberry pi3で運用する人は、1GのUSB-LANを刺したほうがいい

ラズパイ3のNICは100M上限なので、通信帯域が狭すぎる。
HDDを埋めるためのダウンロードは早いもの勝ちなので、通信は早いほうが絶対にいい

# 保存先をNASにするのはよくない

Storjはネットワークの出力も報酬がもらえるので、帯域はなるべくStorj用にしたい
NASのようなネットワークストレージを使うと、10Mbpsでデータを受け取ると、10Mbps分そのままNASに転送されるので、貴重な帯域がNASに保存するためだけに使われてしまう...
まぁNIC増やして帯域分ければそれでもいいんですけどね。

# データのダウンロード/アップロードは早いもの勝ち

ユーザーからファイルがアップロード/ダウンロードされると、サテライトノードは断片化したデータの配布/収集をします
このときいち早く成功を返した上位N台のストレージノードだけが承認されます。
遅すぎるノードは競争に負けると途中で切り捨てられます。
なので帯域とストレージ速度は早いほうがいいのです。

https://support.storj.io/hc/en-us/articles/360028695691-INFO-piecestore-upload-failed-followed-by-ERROR-context-canceled-

# 成功率をログから計算してくれるツール

便利です。とても便利です。
https://github.com/ReneSmeekes/storj_success_rate

# Prometheus用のモジュール

これも便利。超便利。
Storj標準のダッシュボードより情報量多いです。

https://github.com/anclrii/Storj-Exporter

# windowsでstoragenodeのポート番号を変える方法

windows用のインストーラを使ってインストールすると、ポート番号は変えられません。
なので、ルータ等でポートフォワードの設定をするときにポート変換してあげましょう

```
example.com:27520 ==> |      Router     |  ==> example.com:28967  
                      |  27520 -> 28967 |
                      |    ポート変換    |
```

# アイディアポータル

Storjにほしい機能を募集しているポータルサイトです。
ここに欲しいアイディアを書いたら採用してくれるかも？
https://ideas.storj.io/ideas
社内勉強会「レンダリング合宿１」 ソフトウェアラスタライザー基本実装編 03.クリッピング

#ソフトウェアラスタライザー基本実装編 03.クリッピング
前回はワイヤフレームで描画をおこないました。
その際に画面外にはみ出るポリゴンは破棄するという簡単な方法を取っていましたが、
そのままというわけにもいかないので画面外にはみ出る場合の対応を行います。

###リポジトリ
https://github.com/NoriyukiHiromoto/Rendering01_SoftwareRasterizer/tree/01_03_clipping

今回のビルド結果は以下のような感じです。
画面外にはみ出た部分がちゃんとクリップされているのが見て取れます。
![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358928/48561aaa-aca7-215e-8c88-fff97a03a8fd.png)
###Sutherland–Hodgmanアルゴリズム
極端に言えば点を打つごとに画面外かどうかを判定していけばいいんですが、
それだとif文が多量に呼ばれるのと、XY方向はともかくZ方向の処理に対応できません。

そんなわけで有名なクリッピングのアルゴリズムであるSutherland–Hodgmanを利用します。

ざっくりいうと線分ABのAが内側ならそのまま追加し、外側ならBとの線分が面との交点を求めて交差すれば交点を新しい頂点に、交差しなければ破棄、Aが内側でBが内側ならそのまま追加し、外側なら面との交点を求めて新しい頂点に、といった感じの処理を繰り返して行きます。

```cpp:Renderer.h
template <typename FUNC>
int32 ClipPoints(Vector4 Dst[], const Vector4 Src[], const int32 PointCount, FUNC Compare)
{
	static const uint8 index_table[8][8] = {
		{ 0, 0, 0, 0, 0, 0, 0 },	// 0: -
		{ 0, 0, 0, 0, 0, 0, 0 },	// 1: 0
		{ 1, 0, 0, 0, 0, 0, 0 },	// 2: 0 1 0
		{ 1, 2, 0, 0, 0, 0, 0 },	// 3: 0 1 2 0
		{ 1, 2, 3, 0, 0, 0, 0 },	// 4: 0 1 2 3 0
		{ 1, 2, 3, 4, 0, 0, 0 },	// 5: 0 1 2 3 4 0
		{ 1, 2, 3, 4, 5, 0, 0 },	// 6: 0 1 2 3 4 5 0
		{ 1, 2, 3, 4, 5, 6, 0 },	// 7: 0 1 2 3 4 5 6 0
	};
	auto table = index_table[PointCount];

	int32 NewPointCount = 0;

	for (int32 i = 0; i < PointCount; ++i)
	{
		const auto& v1 = Src[i];
		const auto& v2 = Src[table[i]];	// [(i + 1) % PointCount]

		const auto d1 = Compare(v1);
		const auto d2 = Compare(v2);

		const auto Intersect = [&](Vector4& v)
		{
			const fp32 rate = d1 / (d1 - d2);
			Vector_Lerp(v, v1, v2, rate);
		};

		if (d1 > 0.0f)
		{
			if (d2 > 0.0f)
			{
				Dst[NewPointCount++] = v2;
			}
			else
			{
				Intersect(Dst[NewPointCount++]);
			}
		}
		else
		{
			if (d2 > 0.0f)
			{
				Intersect(Dst[NewPointCount++]);
				Dst[NewPointCount++] = v2;
			}
		}
	}

	return NewPointCount;
}
```

この際にプロジェクション変換後の同時座標系の頂点はwで割って-1～+1になりますので、
wで割る前の状態で考えると-w～+wとなります。
ですので比較はシンプルに±wと行うことができます。

各軸でそれぞれ比較し新しい頂点を取得します。
これをXYZそれぞれ６面に対して行うことで正しくクリッピングすることができます。

```cpp:Renderer.cpp
PointCount = ClipPoints(TempB, TempA, PointCount, [](const Vector4& v) { return v.w - v.y; });
PointCount = ClipPoints(TempA, TempB, PointCount, [](const Vector4& v) { return v.w + v.y; });
PointCount = ClipPoints(TempB, TempA, PointCount, [](const Vector4& v) { return v.w - v.x; });
PointCount = ClipPoints(TempA, TempB, PointCount, [](const Vector4& v) { return v.w + v.x; });
PointCount = ClipPoints(TempB, TempA, PointCount, [](const Vector4& v) { return v.w - v.z; });
PointCount = ClipPoints(TempA, TempB, PointCount, [](const Vector4& v) { return v.w + v.z; });
```

#最後に
今回はポリゴンのクリッピング処理を行いました。
この辺りまではラスタライザー制作的にはまだまだ事前準備という感じかと思います。
次回はいよいよポリゴンの描画を行います。
ReactのsetStateについて整理してみた

#はじめに
ReactのsetStateには引数に**オブジェクトを渡す方法**と**関数を渡す方法**の２通り存在しますが、この2つはどう違うのか整理してみました。
#setStateについて
>setState() はコンポーネントの state オブジェクト更新をスケジュールします。state が更新されると、コンポーネントはそれに再レンダーで応じます。

>setState 呼び出しは非同期です。呼び出し直後から this.state が新しい値を反映することを期待しないでください。もし現在の state に基づいた値を計算する必要がある場合は、オブジェクトの代わりに更新関数を渡してください。

#まとめると

- setStateの呼び出しは非同期
- setState()は、引数にオブジェクトが渡された場合に、stateを即時にアップデートすることを保証しない
- 現在のstateに依存する値を更新する場合は、引数にオブジェクトではなく関数を渡す
- 引数に関数を渡すと、その関数内で現在の state の値へアクセスできるようになる

#サンプルコード
```react:App.js
import React from 'react';

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      counter1: 0,
      counter2: 0,
    };
    this.doAction1 = this.doAction1.bind(this);
    this.doAction2 = this.doAction2.bind(this);
  }

  // 引数にオブジェクトを渡した場合
  // これは +1 ずつ増えて正しくない挙動が起きる。
  doAction1() {
    this.setState({
      counter1: this.state.counter1 + 1,
    });
    this.setState({
      counter1: this.state.counter1 + 1,
    });
  }

  // 引数に関数を渡した場合
  // これは +2 ずつ増えて正しい処理をする。
  // 1つの関数内で state の更新を連続的に行うときは、引数に関数を渡す。
  doAction2() {
    this.setState(state => ({
      counter2: state.counter2 + 1,
    }));
    this.setState(state => ({
      counter2: state.counter2 + 1,
    }));
  }

  render() {
    const {counter1, counter2} = this.state;
    return (
        <div>
          <p>引数にオブジェクトを渡した場合:{counter1}</p>
          <button onClick={this.doAction1}>Click</button>

        <hr />

          <p>引数に関数を渡した場合:{counter2}</p>
          <button onClick={this.doAction2}>Click</button>
        </div>
    );
  }
}

export default App;
```
`出力結果↓`
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330545/af0e0dda-52c4-d55a-0b90-2a5d36acc5e8.gif)


#公式ページに全てが書いてあります
- [stateとライフサイクル](https://ja.reactjs.org/docs/state-and-lifecycle.html#using-state-correctly)
- [React.Component](https://ja.reactjs.org/docs/react-component.html#setstate)
- [コンポーネントの state](https://ja.reactjs.org/docs/faq-state.html)
EC2インスタンス停止したまま放置したら料金が発生した話

##EC2インスタンスを停止中にしたら料金が発生していた
停止中のEC2インスタンスに関連づけられている**ElasticIP**は、
課金対象だと知りませんでした。

失敗談として
自身のメールを通知を確認した時にこんなものが送られてきました。

**Amazon Web Services Billing Statement Available**
**(利用可能なアマゾンウェブサービスの請求書)**

ん？？無料で使用しているはずなのに請求書？？？？（笑）

AWSの「請求」を確認すると
<img width="1216" alt="スクリーンショット 2019-11-03 19.44.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285114/2bc1b795-a9c4-529d-bbd7-9537305a3368.png">

どうやら、ガッツリElasticIPで料金が発生している様子です。。。（笑）
こちらについて公式サイトで調べてみます。
[Elastic IP の料金を理解する - Amazon Web Services](https://aws.amazon.com/jp/premiumsupport/knowledge-center/elastic-ip-charges/)

>次の条件が満たされている限り、Elastic IP アドレスに料金は発生しません。

> - Elastic IP アドレスが EC2 インスタンスに関連付けられている。
> - **Elastic IP アドレスに関連付けられているインスタンスが実行中である。**
> - インスタンスに 1 つの Elastic IP アドレスしか添付されていない。

>これらの条件を満たしていない Elastic IP アドレスについては、1 時間単位で請求されます。




私は、2019年10月にAWSの構築しアプリをデプロイする作業をしていました。
その際に、間違えて途中まで作成したEC2インスタンスを停止中にし、そのままの状態で放置していました。
今回の料金発生は、2つ目の「ElasticIPアドレスに関連付けられているインスタンスが実行中である。」という条件を満たしていないことが原因でした。

これを回避するには、EC2インスタンスを実行中にする、
もしくは**ElasticIPを解放**する必要があるらしいです。
今回は私の場合停止しているES2が不要だったので
インスタンスをアクションによって終了を実行しました。

##終わりに
今回の失敗で、利用するサービスの仕組みはよく調べて理解しておくべきだと実感できました。
内容に不備がございましたら、ご指摘いただけますと幸いです。

##参考
EC2インスタンス停止による料金の発生について
https://qiita.com/t-uhiyama/items/e0bc0770ecc6c3a418af
Android/iOSアプリのアーキテクチャ検討

# はじめに
アプリのアーキテクチャというと、僕が一番はじめに思い浮かぶのはMVCとかMVP、Fluxみたいな
今回のアプリでどのパターンを採用するかという点です。
ただ、現場でそのパターンだけ考えれば良いかというとそれ以外の部分に対しても
もっと検討することが多くて、何を検討するかがまとまっていないことが多いので、
自分の備忘録としてまとめてみることにしました。

# お題
・アプリが起動したらQiitaの記事の一覧を表示できる
・記事をタップしたら、Webのページで記事の内容を閲覧できる
・どの記事を見たのか、履歴を確認できる
・どんな記事を見たのか集計して、アプリの改善に使いたい
・（簡単にするため、認証はなし）

というQiita閲覧アプリで考えてみます

# 要素を分解してみる
> アプリが起動したらQiitaの記事の一覧を表示できるアプリ

QiitaのAPIを使った通信が必要。
https://qiita.com/api/v2/docs#投稿

APIはJSONなので、JSONを解析できるライブラリがあると楽そう。
リスト表示であれば、標準コンポーネントで十分。

> ・記事をタップしたら、Webのページで記事の内容を閲覧できる

Webのページを簡単に閲覧できるコンポーネントを使いたい。
ページそのままの表示で良いので、ChromeCustomTabsやSFSafariViewControllerでも良さそう。
他のページに飛ぶ場合の制御が必要な場合は何か制御が必要かもしれない。
その場合、WebViewやUKWebViewを採用する必要がありそう。

> ・どの記事を見たのか、履歴を確認できる

記事をタップしたタイミングで記事のidを保存する必要がある。
履歴もリスト表示なので、複数の行を保存できる方が良い。
履歴の最大保存件数は顧客やPOに確認する。
複数の行保存の場合、UserDefaultやSharedPreferenceよりも
RoomやRealmの方が良いかな。Realmにするなら、Androidも合わせた方がいいかも。

> ・どんな記事を見たのか集計して、アプリの改善に使いたい

Analytics系のサービスを使う必要がある。
定番はFirebaseだが、それ以外に使いやすいサービスはあるか？

上記以外だと、どこまでテスタブルか、テストが標準でサンプルがあるか、
アプリ配信は何を使うか？などがありそうです。

# 検討できる項目にしてみる
| 検討項目|検討点|
|:-----------------|:------------------|
| 通信ライブラリ|一般的か、簡単に使えるか、テストを分離できるか、細かいカスタマイズが可能か|
| WebView|簡単に使えるか、テストを分離できるか、自分でページ表示の制御が可能か|
| データ保存|一般的か、簡単に使えるか、テストを分離できるか、保存が高速か、コードは短くなるか|
| Analytics|一般的か、簡単に使えるか、テストを分離できるか、細かいカスタマイズが可能か|

- Androidの通信ライブラリの場合

調査して、候補を並べ、各項目の採点のウェイトを設定する。
（今回のアプリの要件を満たすために重要なものは高い点数をつける）
各項目の点数を設定して、合計を算出する。

| 候補| 公式ページ| 一般的 3 | 簡単さ(学習コスト) 3 | テスト 2 | 細かいカスタマイズ 1 | 合計 |
|:----|:----|:----:|:----:|:----:|:----:|:----:|
| Retrofit2 | https://square.github.io/retrofit/ | 3 | 3 | 2 | 1 | 23 |
| OkHttp3 | https://square.github.io/okhttp/ | 3 | 2 | 2 | 1 | 20 |
| HttpURLConnection | https://developer.android.com/reference/java/net/HttpURLConnection | 3 | 1 | 1 | 3 | 17 |

※情報収集の元の記事があるとなおわかりやすい
※通信プロトコルがJSONを使ったREST以外にGraphQLやgRPCもあると、そこへの対応有無も検討対象になる

# そして決める
各項目の情報がまとまれば、あとは以下のように整理するとわかりやすくなると思います。

- Android

| 検討項目|採用技術|採用理由|
|:-----------------|:------------------|:------------------|
| 通信ライブラリ|Retrofit|一般的なライブラリで学習コストが小さい|
| WebView|ChromeCustomTabs|表示を全てChromeに任せられる、アプリでの表示制御も不要である|
| データ保存|Room|Androidの標準ライブラリ、今後の変化にもっとも強いと思われるため|
| Analytics|Firebase|一番の定番で情報が多くあるため|

- iOS

| 検討項目|採用技術|採用理由|
|:-----------------|:------------------|:------------------|
| 通信ライブラリ|Moya|一般的なライブラリで学習コストが小さい|
| WebView|SFSafariViewController|表示を全てSafariに任せられる、アプリでの表示制御も不要である|
| データ保存|Realm|iOSのDBではスタンダードなライブラリのため|
| Analytics|Firebase|Androidに同じ|

# まとめ
SIer系の仕事が多かったので、まとめ方としては固い進め方かなと思います。
また、これがベストの進め方ではなく、もっと良い進め方があればコメントをもらえると嬉しいです。

# その他
冒頭でMVCやMVPのことを書いて、それが抜けてしまいましたが、
各機能を満たす為の技術やライブラリを検討する前段階でリアクティブプログラミングか
使わなくても良いかの検討も必要そうです。
アーキテクチャ検討というよりもライブラリ検討になってしまったかもしれません。
ネットワーク系コマンドチートシート（Linux）

- Debian10 で動くはずです
- macOS版は[こちら](https://qiita.com/miminashi/items/574f09b2f3fd5d9b89f3)

# インターフェースのup/down

```sh
sudo ip link set eth0 up
```

# LISTENしているポートの一覧を表示する

## netstatを使う場合

```
netstat -ant
```

- -n 名前解決をしない
- -t TCPポートを表示


## ssを使う場合

```sh
ss -lt4
```

- -l LISTEN中のソケットを表示
- -t TCPソケットを表示
- -4 IPv4を表示

## ssでポートをLISTENしているプロセスも表示する

- root権限が必要

```sh
sudo ss -ltp4
```


# 現在のネットワークの帯域を見たい

-  iptraf
- `/proc/net/dev`を見る
  - https://blog.apar.jp/linux/8010/

## kbpsをざっくりと表示する

```sh
prev_b=0; while :; do b="$(cat /proc/net/dev | grep ppp0 | sed 's/^ *//' | tr -s ' ' | cut -d ' ' -f 10)"; echo "$(((b - prev_b) * 8 / 1000))"; prev_b=$b; sleep 1; done
```
DjangoでクライアントのIPアドレスを取得する

# 直接アクセスのみ
クライアントが Django に直接アクセスすると決まっている場合は、HTTP ヘッダの`'REMOTE_ADDR'`を参照するだけで IP アドレスを取得することができます。

```Python:views.py
from django.http import HttpResponse
from django.views import View

class MyView(View):
    def get(self, request):
        # request オブジェクトから'REMOTE_ADDR'ヘッダを取得する。
        client_addr = request.META.get('REMOTE_ADDR')

        # 動作確認のため、取得したアドレスをそのまま返す。
        return HttpResponse(client_addr)
```

# リバースプロキシ対応
しかし上記の方法では、クライアントと Django の間に Nginx などのリバースプロキシがある場合は、`'REMOTE_ADDR'`で取得できる IP アドレスがリバースプロキシのアドレスになってしまいます（例: Nginx が同じホストにあると`127.0.0.1`になる）。

途中で1回以上転送された場合は、同じく HTTP ヘッダの`'HTTP_X_FORWARDED_FOR'`を参照すれば転送経路の IP アドレスがカンマ区切り文字列で取得できるので、この先頭要素からクライアントの IP アドレスを取得することができます。

また`'HTTP_X_FORWARDED_FOR'`ヘッダがない場合は直接アクセスなので、上記と同様に`'REMOTE_ADDR'`で取得します。

```Python:views.py
from django.http import HttpResponse
from django.views import View

class MyView(View):
    def get(self, request):
        # 'HTTP_X_FORWARDED_FOR'ヘッダを参照して転送経路のIPアドレスを取得する。
        forwarded_addresses = request.META.get('HTTP_X_FORWARDED_FOR')
        if forwarded_addresses:
            # 'HTTP_X_FORWARDED_FOR'ヘッダがある場合: 転送経路の先頭要素を取得する。
            client_addr = forwarded_addresses.split(',')[0]
        else:
            # 'HTTP_X_FORWARDED_FOR'ヘッダがない場合: 直接接続なので'REMOTE_ADDR'ヘッダを参照する。
            client_addr = request.META.get('REMOTE_ADDR')

        # 動作確認のため、取得したアドレスをそのまま返す。
        return HttpResponse(client_addr)
```

# ipwareを使う
django-ipware を pip でインストールします。

```Shell:
pip3 install django-ipware
```

インポートして`get_client_ip`関数を使えば、たった 1行でクライアントのアドレスを取得でき、もちろんリバースプロキシに対応しています。

```Python:views.py
from django.http import HttpResponse
from django.views import View
from ipware import get_client_ip

class MyView(View):
    def get(self, request):
        client_addr, _ = get_client_ip(request)

        return HttpResponse(client_addr)
```
参照する HTTP ヘッダは`'HTTP_X_FORWARDED_FOR'`と`'REMOTE_ADDR'`だけでなく、デフォルトで以下の優先順位でクライアントのアドレスを取得します。

```Python:
 # The default meta precedence order
 IPWARE_META_PRECEDENCE_ORDER = (
     'HTTP_X_FORWARDED_FOR', 'X_FORWARDED_FOR',  # <client>, <proxy1>, <proxy2>
     'HTTP_CLIENT_IP',
     'HTTP_X_REAL_IP',
     'HTTP_X_FORWARDED',
     'HTTP_X_CLUSTER_CLIENT_IP',
     'HTTP_FORWARDED_FOR',
     'HTTP_FORWARDED',
     'HTTP_VIA',
     'REMOTE_ADDR',
 )
```

さらに`get_client_ip`関数を呼び出す時に、指定した優先順位でデフォルトの優先順位をオーバーライドすることもできます。

```Python:
client_addr, is_routable = get_client_ip(request, request_header_order=['X_FORWARDED_FOR', 'REMOTE_ADDR'])
```

# 参考リンク

Stack Overflow "How do I get user IP address in django?"
https://stackoverflow.com/questions/4581789/how-do-i-get-user-ip-address-in-django

GitHub - un33k/django-ipware "A Django application to retrieve client's IP address"
https://github.com/un33k/django-ipware
GAS（GoogleAppsScript）の関数を共通化して他のGASプロジェクトで使えるようにする方法

## はじめに
gasの実装をしていると、関数を共通化して別のgasプロジェクトでも使えるようにしたいと思うことがありませんか？他のgasプロジェクトからライブラリとして関数を使えるようにする手順を紹介します。

## 手順
### 1. 共通化したいgasプロジェクトを作成
事前準備として、共通化したいgasプロジェクトを作成しておきます。
Googleドライブの任意の場所で、右クリック → その他 → Google Apps Script で作れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181001/01bab941-6761-d6ca-11b5-46fc1564132a.png)

### 2. 共通化したい関数を作成
１で作ったgasプロジェクトに、共通化したい関数を作成します。
今回はログ出力するだけのtestFuncという関数を作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181001/fb0e0d57-3df1-3d4a-81c7-4bb44f88bda7.png)


### 3. プロジェクトの版を保存する
`ファイル` → `版を管理` でプロジェクトのバージョン名を入力し、保存します。
バージョン名を保存すると以下のように保存したバージョンが一覧に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181001/8c630081-d21e-13d4-65ee-31306f3ed65d.png)

### 4. スクリプトIDをコピーしておく
別のgasプロジェクトで使えるようにするために、保存したプロジェクトの**スクリプトID**が必要になります。
`ファイル` → `プロジェクトのプロパティ` で表示された画面から、スクリプトIDをコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181001/5bf89e37-eb89-4a1a-e0aa-f3d4960efb2b.png)


### 5. 共通関数を使うgasプロジェクトへ移動
:runner:

### 6. プロジェクトをライブラリへ追加
移動先のプロジェクトで、メニューの `リソース` → `ライブラリ` で表示された画面に、さきほどコピーしたスクリプトIDを入力し、追加ボタンで追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181001/d134ebe8-12db-0b2e-eadf-266c4c4a7c1e.png)

ライブラリを追加できたら、版を保存したバージョンをプルダウンで選択し、保存します。
**Identifier** はこのプロジェクトをプログラムから呼び出す時の識別子ですので、日本語ではなくアルファベットで指定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181001/5dc2fb8d-2913-07a1-1ea5-e89c0d464d3f.png)

### 7. 共通化した関数を使う
`ライブラリに保存したIdentifier` + `.` を入力すると、共通関数が入力補完で表示され、使えるようになっていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181001/7ac53f69-3937-920d-44c9-6753515578da.png)

myFunction 内で `ShareScript.testFunc()` と書いて保存します。myFunctionを実行し、ログを確認すると、共通関数が正常に呼ばれたことを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181001/b79d51dc-9ff3-607d-585d-4b483b45e58a.png)

プロジェクトを共通化して使う方法は以上です。

## 版（バージョン）について
- 共通化したプロジェクトを改修しても、新しく版を保存しなければ、新バージョンとして別プロジェクトで使用できません。
- 改修が終わったら、新しく版を保存し、ライブラリ側で新しい版を選択し直しせばその時点で新バージョンが適用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181001/bf6c19f9-c5ec-701b-200b-49eb98f5cefa.png)

以上でおわります :cat:
aws ec2でのproxyの建て方


https://qiita.com/pcnikki/items/404329f9ad9cb6e235d4

http://milk0824.hatenadiary.jp/entry/2014/12/13/230847

Awsにプロキシーサーバー立てる
yum -y install squid
vi /etc/squid/squid.conf
forwarded_for off
header_access X-Forwarded-For deny all
header_access Via deny all
header_access Cache-Control deny all
PHPの正規表現の書き方の基本。記号や数字などの置換や抽出方法をまとめた

#近況報告

エンジニア転職成功しました。YouTubeでエンジニア転職したい方向けに情報発信しています。

https://www.youtube.com/channel/UCcXQG8lu_EdyP2Cbhtz1bcA


#正規表現とは

- 曖昧な文字列パターンを表現する記法のこと

##例

```php
//0-9の数値3桁と4桁で、間に-が入る文字列パターンの場合

[0-9]{3}-[0-9]{4}
```

##正規表現でできること

- 正規表現パターンと文字列を指定することで、両者が合致するかどうかを正規表現エンジンが判定できる
- 掲示板への投稿記事から有害なHTMLタグだけを取り除く
- 任意の文章からURL文字列だけを取り出す
- HTMLから<meta>タグの情報だけを取り除く
- 人間の為のデータと、システムの為のデータをつなぐ橋渡し

###正規表現の基本

- 正規表現によって表された文字列パターン→正規表現パターン　と呼ぶ
- 与えられた正規表現パターンが、ある文字列の中に含まれる→文字列が正規表現パターンにマッチする
- 一つの正規表現パターンにもマッチする文字列は複数あることが多い

```php
//正規表現の記法

/正規表現/修飾子
```

###正規表現の記法の例

####特定の文字列にマッチ

- デフォルトでは、大文字/小文字を区別する

```php
/XYZ/
```

| パターン | 比較する文字列 | マッチするか |
|:--------|:------------|:-----------|
|/poo/|pool|◯|
|/poo/|post|×|
|/ame/|My name is Rio.|◯|
|/Wings/|WINGS Project|×|


####いずれかの文字にマッチ

- 特定の文字の１文字にマッチするか
- 先頭に「^」を指定することで、「いずれの文字にもマッチしない」ことも指定する

```php
/[XYZ]/
```

| パターン | 比較する文字列 | マッチするか |
|:--------|:------------|:-----------|
|/[opq]/|panda|◯|
|/[opq]/|Panda|×|
|/h[ijk]l/|hil|◯|
|/h[^ijk]l/|hill|×|
|/h[^ijk]l/|hello|◯|

####特定範囲の文字にマッチ

- 特定の範囲の1文字にマッチするか
- アルファベットや数値など、同種の文字をパターンとして表したい場合に利用する

```php
/[0-9]/
```

| パターン | 比較する文字列 | マッチするか |
|:--------|:------------|:-----------|
|/[o-s]/|one|◯|
|/[o-s]/|One|×|
|/[o-s]/|hil|◯|
|/[o-sO-S]/|one、One|◯|
|/[1-3]/|No.３、best1|◯|
|/[1-3]/|500yen|×|

####任意の1文字

- 任意の1文字を.で表現する

```php
/X.Z/
```

| パターン | 比較する文字列 | マッチするか |
|:--------|:------------|:-----------|
|/p.n/|pen、panda|◯|
|/p.n/|plan|×|
|/p..n/|plan|◯|

####先頭/末尾を検出

- 文字列の先頭では^、末尾では$を、特定のパターンがマッチするか確認する際に使用する

```php
/^XYZ/
/XYZ$/
```

| パターン | 比較する文字列 | マッチするか |
|:--------|:------------|:-----------|
|/^pla/|plan、place|◯|
|/^pla/|replay、splash|×|
|/pla$/|apple、people|◯|

####文字列の繰り返しパターンを表現

- 直前の文字の繰り返しを表現するのに使用する

```php
/X*/ //0文字以上のX
```

| パターン | マッチする文字列 | マッチしない文字列 |
|:--------|:------------|:-----------|
|/po*l/|pl、pol、pool、poool|col|
|/po+1/|pol、pool、poool|pl|
|/po?l/|pl、pol|pool、col|
|/po{2}l/|pool|pol、poool|
|/po{2,}l/|pool、poool|pl、pol|
|/po{2,3}l/|pool、poool|pol、pooool|

####特定の文字セットを表現

- 「\文字」で、特殊な文字範囲を表現できる

|パターン|概要|
|:------|:----|
|\t|タブ文字|
|\n|改行|
|\r|復帰|
|\d|数値にマッチ([0-9]と同じ)|
|\D|数値以外にマッチ|
|\s|空白文字にマッチ([ \t\n\f\r]と同じ)|
|\S|空白以外の文字にマッチ([^\s]と同じ)|
|\w|大文字/小文字のアルファベット、数字、アンダースコアにマッチ([a-zA-Z_0-9]と同じ)|
|\W|文字以外にマッチ([^\w]と同じ)|
Git for Windows をインストールしてみた。

## 18:05 git 入れる。

- [GitHub入門](https://gitpress.io/u/780/Git｜0.GitHub入門){発行元: amenoyoya, 発行日時: 不明}
    - 引用
        - `Windows環境なら、Git for Windowsが便利`
    - コメント
        - "Git for Windows" は https://gitforwindows.org からいける。
        - と思ったらこれ以上の 説明はないな。ちょっと公式でもみるか。
        - とみてみたらよくわからなかったのでとりあえず入れてみる。
- 作業
    1. よくわからんのでデフォルトの設定で入れる!!! 笑
        -[imgs20191103_git_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520812/55ed931a-d7de-9a12-aafd-d1cb1e404784.png)
    2. エディタの設定かしらね。
        - ![imgs20191103_git_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520812/81a44227-817c-3020-4e03-d2ff33ce7bb5.png)
            - vsc は普段からよく使ってるし望むところかな。
    3. PATH の設定かしらね。
        - ![imgs20191103_git_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520812/98e19478-64bf-8e8f-cc45-634bd6663c71.png)
            - 最後のやつを使うイメージがよくわかないけど、基本は windows 上で使うしいったんはこれでいいかな。。
    4. 証明書の選択かしらね。
        - ![imgs20191103_git_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520812/88cda520-087d-1d4e-0f7e-bf66f8d78b02.png)
            - まあ特に厳しい要件はないしいったん open ssl でよいかね・・・
    5. checkout 時の改行のチェックとかやめてくれ・・・
        - ![imgs20191103_git_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520812/56bf4562-0681-cc61-7b13-e29298df1073.png)
            - 変なことしないでほしいのでこれで。
    6. ターミナルエミュレータの選択?? そんなのわからんよ。。。
        - ![imgs20191103_git_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520812/1d6a94a9-50fe-5578-fe45-f995fae166a9.png)
    7. んー。extra options って・・・難しい。。
        - ![imgs20191103_git_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520812/40e7dc73-d8bc-ff2c-3dc8-927b2ac94f23.png)
            - とりあえずデフォルトで。
    8. `git add -i`と`git add -p` をbuilt in　で使うかだってー・・・堅牢かわからないって書いてあるからにはセキュリティ従事者としてはちゃんと調べないと・・・
        - ![imgs20191103_git_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520812/a058359d-88bf-19a2-9ee0-824b5cf8f28e.png)
            - [.2 Git のさまざまなツール - 対話的なステージング](https://git-scm.com/book/ja/v1/Git-のさまざまなツール-対話的なステージング){発行元: git, 発行日時: 不明}
                - 引用
                    - `git add に -i あるいは --interactive というオプションをつけて実行すると、Git は対話シェルモードに移行し、このように表示されます。`
                - コメント
                    - 対話モードかーい
                    - git add -i はいらなそう・・・？とおもったけどもう少しページを読んでみる。。。。でもやっぱり必要な時にコマンドつけてやるほうがよさそう。
            - [git add -p 使ってますか？](https://qiita.com/cotton_desu/items/bf08ac57d59b37dd5188){発行元: @cotton_desu, 発行日時: 2017年03月27日}
                - 引用
                    - `上記のコマンドを実行するとgitが更新した内容について任意のブロックに分割して、その任意のブロック毎に対してどうするのかを以下の選択肢から選択することができます。`
                - コメント
                    - ブロック分割してコミットさせてくれるのかー使ってみてもいいかもしれないね
                    - git 本家から git add -p はみつからなかったｗ
        9. とりあえずこれでインストールは完了したっぽい

## 18:54 入れ終わり。

これ入れるだけで 50分もかかったのかー。まだまだ先は長い。
製薬企業研究者がPythonの基本的な記述ルールについてまとめてみた

# はじめに

ここでは、プログラミング言語Pythonを勉強し始めた人が、まず最初に覚えるべき文法、構文を紹介します。
Python3系の使用を前提とします。

# コメントのつけ方

```python:comment.py
# 1行目のコメント # 行の途中からコメントを書くことも可能。
2行目のコメント # エラーになる。

'''
複数行のコメント
複数行のコメント
'''
```
'#'で始まるコメントを改行すると、2行目以降はプログラムの実行範囲と認識され、エラーが発生したり、想定外の動作になることもあるので注意が必要です。
プログラム実行範囲のスクリプトも含め、1行は79文字以下になるようにすると良いです。
コメントはスクリプトのメモとして記載できるほか、実行したくないスクリプトを実行されないようにする（コメントアウト）という使い方もできます。
「複数行のコメント」については、関数の中で書くと、その関数の説明などを示すオブジェクトになり、ここで触れたコメントとは少し違う形になります。


# 文字の出力

プログラムを実行した結果得られる文字などは、print関数を使うことで出力できます。

```python:print.py
print('Hello, World!') # 「Hello, World!」と出力される。
```


# データ型

他のプログラミング言語と同様に、Pythonにもデータ型というものがあります。
このデータ型を意識しながらスクリプトを書かないと、プログラムが動作せずエラーが発生したり、想定外の動作をしたりすることにつながります。

## 文字列

文字通り、一般的な「文字」を指します。

```python:string.py
print('Hello, World!')
print("Hello, World!")
# シングルクォーテーションで囲んでもダブルクォーテーションで囲んでもどちらでも良いが、シングルクォーテーションで囲むのが一般的。

# シングルクォーテーションから始めて、ダブルクォーテーションで閉じる（もしくはその逆）のはNG。
print('Hello, World!") # エラーになる。
print("Hello, World!') # エラーになる。
print('Say "Hello, World!"') #これはOK。文字列の中でさらにクォーテーションを使いたい場合は、まだ使っていないクォーテーションで囲む。
print("Say 'Hello, World!'") # これもOK。ただ上述のように文字列はシングルクォーテーションで囲むのが一般的なので、一行上の書き方の方が普通。
```

## 数値

算術計算ができる「数値」を指します。
文字列の「数字」だと算術計算ができません。

```python:number.py
print(123) # クォーテーションで囲まず、数字をそのまま書く。これは整数型。
print(123.4567) # 小数点付き（浮動小数点数型と言う）でも書ける。
print('123') # こう書くと、数値ではなく「数字の文字列」になってしまう（算術演算が正確にできない）。
print(str(123)) # 数値から文字列への変換。1行上と同じ出力結果になる。
print(int('123')) # 文字列から数値（整数）へ変換。intはintegerの略。
print(float('123.4567')) # 文字列から浮動小数点型へ変換。floatは浮動小数点という意味。
print(int(123.4567)) # 浮動小数点型は整数型に変換できないので、エラーになる。
```

データ型の変換は、上記の例だと分かりにくいですが、変数を扱うようになるとよく出てきます。
例えば、どうしても文字列として定義されてしまう変数に数字が値として格納されていて、それを数値として扱いたい場合、などです。

## 真偽値（ブール型）

'True'または'False'のどちらかの値になります。

```python:boolean.py
print(True) # 「真」
print(False) # 「偽」
```
クォーテーションは不要。
頭文字だけ大文字で2文字目以降は小文字で書く。
if文と密接に関係するところになります。


# インデント

インデントはスクリプト（処理）の固まりを見やすくする効果があります。
Pythonはインデントを重視するプログラミング言語で、インデントの過不足があるだけでエラーが出てしまうので注意が必要です。
if文やfor文などで特に重要で、インデントの有無で動作が変わってしまうこともあります。

```python:indent.py
print('Hello, World!') # OK
    print('Hello, World!') # 半角4文字分インデントをつけて記述した例。単にこれだけ書くとエラーになる。
```


# まとめ

ここでは、プログラムの実行結果の出力方法と、データ型について解説しました。
プログラミング初心者の方はしっかり理解するようにすると良いと思います。

# 参考資料・リンク

[意外と少ない！？製薬会社でのプログラミングに必要な「最低限」の知識](https://pharma-engineer.com/basic-programming/minimum-information/)
Visual Studio Codeで作るLT資料 〜 脱パワーポイント

# はじめに
<p><a href="https://gihyo.jp/magazine/SD/archive/2019/201911">SoftwareDesign 11月号</a>のVisual Studio Code快適生活という記事の中で、VS Codeでプレゼンテーションを考えてみるという話があり、面白そうだったので試してみました。</p>

<p>LT資料をサクッと作ってしまいたい、発表時にはソースコードを交えながら話したいという思いを実現します。</p>

※個人ブログを開設したことを契機に、記事を移植しました。
こちらから御覧ください。

https://gonkunblog.com/vscode-presentation/1/
Processingで外付けWebカメラを認識する(macOS)

#概要
Processingで外付けのWebカメラから映像を取得するのに手こずった時のメモです。
macbookの内臓カメラではなく、どうしても外付けを使わなくてはならなかったのですが、macと外付けのWebカメラはどうやら相性がよろしくないようです。案の定カメラをUSBポートにそのまま差し込んでも認識しませんでした。今のところ最善と思われる解決方法として、CamTwistを使う方法を解説します。

#開発環境
macOS
Processing3
logicool C270n
CamTwist 3.4.3

#Cam Twistをダウンロードする
CamTwistのサイトからソフトをダウンロードします。インストーラーの指示通りインストールしてください。
http://camtwiststudio.com/

インストールできたら、Video SourcesでWebcamを選択します。するとSettingsでCameraが選択できます。ここに接続したWebカメラが表示されるはずです。接続しているカメラを選択してください。
#<img width="870" alt="スクリーンショット 2019-11-03 17.15.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329805/0d055f82-53e5-32fc-8780-0e4c7f38f559.png">

これでCam Twistでの設定は終わりです。（これでmacは接続したWebカメラを認識したので、FaceTimeやQuickTime Playerでも外付けWebカメラを使用できるようになっています。）

この時Cam Twistを終了しないでください。Processingを実行している間中ずっと立ち上げたままにしておきます。

#Processingで外付けWebカメラの映像を読み込んでみる
Processingのサンプルを使ってみます。[ファイル]->[サンプル] ライブラリ/Video/Capture/GettingStartedCaptureでサンプルコードを開きます。
一度これを実行してください。
しばらくするとコンソールに

```
[0] "name=FaceTime HD Camera,size=1280x720,fps=30"
（略）
[24] "name=USB Camera,size=1280x960,fps=30"
[25] "name=USB Camera,size=1280x960,fps=15"
[26] "name=USB Camera,size=1280x960,fps=1"
（略）
[47] "name=CamTwist,size=80x60,fps=1"
```

というような感じで、ずら〜っと認識したカメラのリストが出力されます。
これはString[] cameras = Capture.list();の部分で取得しています。

今回の場合でいうとUSBカメラの[24]とか[25]、[26]を使えば良いので、
```
cam = new Capture(this, cameras[0]);
```
を
```
cam = new Capture(this, cameras[24]);
```
に書き換えます。この数字はコンソールを読んで、接続しているカメラに適宜合わせてください。

```java
/**
 * Getting Started with Capture.
 * 
 * Reading and displaying an image from an attached Capture device. 
 */

import processing.video.*;

Capture cam;

void setup() {
  size(640, 480);

  String[] cameras = Capture.list();

  if (cameras == null) {
    println("Failed to retrieve the list of available cameras, will try the default...");
    cam = new Capture(this, 640, 480);
  } if (cameras.length == 0) {
    println("There are no cameras available for capture.");
    exit();
  } else {
    println("Available cameras:");
    printArray(cameras);

    // The camera can be initialized directly using an element
    // from the array returned by list():
    cam = new Capture(this, cameras[24]); //書き換え部分
    // Or, the settings can be defined based on the text in the list
    //cam = new Capture(this, 640, 480, "Built-in iSight", 30);
    
    // Start capturing the images from the camera
    cam.start();
  }
}

void draw() {
  if (cam.available() == true) {
    cam.read();
  }
  image(cam, 0, 0, width, height); 
  // The following does the same as the above image() line, but 
  // is faster when just drawing the image without any additional 
  // resizing, transformations, or tint.
  //set(0, 0, cam);
}
```

これを実行すると、外付けしたWebカメラを認識して映像が表示されるのではないでしょうか。

何かありましたらコメントいただけると幸いです。

#参考
https://dandashokai.com/7588
http://kovayashi.blog120.fc2.com/blog-entry-320.html
Xcodeで開発したアプリを審査通す前に身内へ試しに使ってもらうメモ

#概要

普段はReact NativeでiOSアプリを開発してます

今回は、iOSアプリは審査に出して通るまで公開できずに　それまで試しに友人に使ってもらうことはできないと落ち込んでる人へ　そんなことはないぞと反論するメモを共有します

#解決策
###インストール側
身内に使ってもらうのであればまず[TestFlight](https://apps.apple.com/jp/app/testflight/id899247664)をインストールしてもらい
AppStoreConnectに[サインアップ](https://appleid.apple.com/account?appId=632&returnUrl=https%3A%2F%2Fdeveloper.apple.com%2Faccount%2F#!&page=create)させましょう

<img width="375" alt="File.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99502/37f4384d-cc64-68a2-0966-234222253a69.jpeg">


###アプリ開発者側
普段通りXcodeにてビルドしたアプリをアップロードし、[AppStoreConnect](https://appstoreconnect.apple.com)へログインして下記画像のようにTestFlightタブに

<img width="1119" alt="スクリーンショット 2019-11-03 18.12.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99502/6a334ba5-1907-2179-f863-cdffc831c7b1.png">


先ほどアップロードしたビルドが一覧にあるので、ビルドを選択してテストを行うことを承認すれば

<img width="918" alt="スクリーンショット 2019-11-03 18.17.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99502/88dfba51-439b-58e3-ed1e-6032c6187fe4.png">

あらかじめテスターに登録したAppStoreConnectユーザーがTestFlightを通してビルドをインストールすることができ、試し利用を行わせることが可能になります
Laravel Ajax リアルタイムデバッグ

# はじめに

私は時間を取り戻したいです。(**本当に!!**)

最近、案件でLarvelとjQueryを使用し開発を行った際、非同期処理のデバックにとても時間を費やしました。
すぐに忘れてしまう自分自身の為に備忘録としてここに記します。
デバッグにこんなに時間が掛かるとは...(汗)

この記事を読むことにより、私と同じようにデバックで苦しんでいる人が少しでも時間を奪われないことを願っています。(時間...(涙))

# デバッグ方法

###1、csrf-tokenをhead内に追記。
　・追記しないと500errorになります。(laravelあるあるですね(笑))

```blade.php
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">


    <!--下記を追加(csrf-token) -->
    <meta name="csrf-token" content="{{ csrf_token() }}">


    <script src="{{ asset('/js/app.js') }}"></script>
    <title>hogehoge</title>
  </head>
  <body>
  </body>
</html>
```

###2、非同期処理(ajax)
　・headersにcsrf-tokenを追記します。
　・success/errorになった際のデータ・ステータス等を表示します。

```hoge.js

$(function () {
  var url = location.href;
  $.ajax({
    url: `${url}/store`,
    type: 'GET',
    dataType: "json",
    headers: {
      "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
    },
    data: {
      "hoge": "hogehoge",
    },
    success: function (data) {
      console.log('success');
      console.log('data');
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      console.log('error');
      console.log(XMLHttpRequest.status);
      console.log(textStatus);
      console.log(errorThrown);
    }
  });
});

```

###3、送られてきたデータの操作(controller)
　・**use Log**を追記する事によりlaravel.logにデバッグすることができるようになります。
　・**use Response**を追記することにより返り値の形式を変更することができます。
　・**Log::debug**を使用しlaravel.log内にデバッグメッセージを追記します。

```HogeController.php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Log;
use Response;

class HogeController extends Controller
{
    public function store(Request $request)
    {
        Log::debug($request);
        return Response::json($request);
    }
}
```

###4、リアルタイムでデバッグメッセージを表示
　・cdでlogsディレクトに移動します。
　・tail -fにてログをリアルタイムで表示します。

```
cd laravelアプリケーション名/storage/logs/
tail -f laravel.log
```

#結果

・**成功**

```
<!-- ブラウザ(Console) -->
success
{hoge: "hogehoge"}

<!-- ターミナル -->
[2019-11-03 08:55:09] local.DEBUG: array (
  'hoge' => 'hogehoge',
)
```


・**失敗**

```
<!-- ブラウザ(Console) -->
GET http://homestead.test/post/store?hoge=hogehoge 500 (Internal Server Error)
error
500
error
Internal Server Error

<!-- ターミナル -->
[2019-11-03 09:04:50] local.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: Class 'App\Http\Controllers\Response' not found in /home/vagrant/code/csv/app/Http/Controllers/PostController.php:40
Stack trace:
```

#最後に

今回学んだことは非同期処理では~~dd()メソッドを使用することができないということです。~~

dd()メソッドのデバッグ内容はデベロッパーツール => network => previewで見れました。(**インフラのスペシャリストありがとう**)

また、Logclassを使用することによりデバッグメッセージでデバッグできることを知りました。(dd()使わなくてもLog
でデバッグできるのね(笑))

もし不備があった場合はコメントをいただけると幸いです。
よろしくおねがいします。

#参考
[Laravel でAjax をデバッグする方法](https://qiita.com/hubtakaya/items/8a2028e3c4da97253e48)
[WIP] 準備 Go 基本的環境

Install everything/tools use Homebrew

``` sh
brew install go
brew install dep
```

`dep` is a the dependency management tool for Go

> https://github.com/golang/dep

### Setup $GOPATH

Add the following content to `.zshrc`

``` bash
# Go development
export GOPATH="${HOME}/path/to/root/go"
export GOROOT="$(brew --prefix golang)/libexec"
export PATH="$PATH:${GOPATH}/bin:${GOROOT}/bin"
test -d "${GOPATH}" || mkdir "${GOPATH}"
test -d "${GOPATH}/src/github.com" || mkdir -p "${GOPATH}/src/github.com"
```

- rf. https://ahmadawais.com/install-go-lang-on-macos-with-homebrew/

### Tools

- Go for Visual Studio Code - https://marketplace.visualstudio.com/items?itemName=ms-vscode.Go
- Go Outline - https://github.com/lukehoban/go-outline
- https://github.com/sqs/goreturns
「IntelliJ IDEAハンズオン」を読んで詰まったところと解決方法

# はじめに
[IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター](https://www.amazon.co.jp/dp/4774193836)を読み進めていたところ、記載内容の通り実施してエラーが出てしまったところがあったので、その解決方法についてまとめました。

# 環境
- **Java** : 11.0.2
- **Intellij IDEA** : 2019.2.4 (Ultimate Edition)

# エラー箇所と解決方法
## 4.2 FizzBuzzコードの実行
### 詰まったところ

コードを実行した際に以下のエラーが表示される

    Error:java: エラー: リリース・バージョン5はサポートされていません

### 解決方法

pom.xmlに以下の記述します。
`maven.compiler.source`と`maven.compiler.target`には自分の使用しているJavaのバージョンを記述します。

~~~
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
~~~

## 4.4 実行結果の巻き戻し
### 詰まったところ

Chrononを実行した際に以下のエラーが表示される

    Chronon recording not found in [chronon-recodingのパス]

上記のパスを確認したところ、ファイルは作成されていました。

ネットで調べたのですが、解決できそうな情報は見当たらず・・・

[プラグインのレビュー](https://plugins.jetbrains.com/plugin/7403-chronon/)に「Mavenプロジェクトではrecodingを読み込んでくれないよ」という内容のレビューがありましたが、解決方法はわかりませんでした。
![2019-11-03_15h54_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520008/b8ca06c8-9bf3-31f3-76c6-ac61fe20eb92.png)

詳しいかたがいらっしゃいましたら、ぜひ教えて下さい。

# まとめ
以上が自分が実施して詰まった箇所です。
これから上記書籍を購入する方は参考にしていただければ幸いです。

[IntelliJ IDEAハンズオン](https://www.amazon.co.jp/dp/4774193836)についてですが、2017年出版のため一部UI等が今のものと異なっていますが、JetBrains社の製品に興味のある方やたくさん搭載されている機能を使いこなせている実感の無い方にオススメです。

## おまけ
[IntelliJ IDEAハンズオン](https://www.amazon.co.jp/dp/4774193836)の著者である山本裕介さんがIntellijのショートカットを紹介している動画もおすすめです！
https://youtu.be/qoWmJ8tPY_I
ニキシー管風時計をメニューバーに表示してみた．

深夜にラーメン食べていたらふとニキシー管時計をメニューバーに表示させたくなったので，さっと作ってみました．

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/d121d555-d65e-9dc3-d3b8-30ba9a5b2597.gif)

Githubに公開してあります．
[https://github.com/Kyome22/NixieStats](https://github.com/Kyome22/NixieStats)

現在はフォント画像を1秒ごとに連結合成して表示していますが，もう少し軽い実装方法がないものでしょうか．
【第3話】Flutterでwebゲーム作ろっかなって思った 【やっと作り始めた】

#なんてこった、公式のチュートリアルはわかりにくいものだったのか・・・
まずは下のURLのコースを完了する。
https://www.youtube.com/watch?v=1ukSR1GRtMU&list=PL4cUxeGkcC9jLYyp2Aoh6hcWuxFDX6PBJ

statfulとstatelessの使い分け、忍者先生の16話のほうが公式チュートリアルよりわかりやすかったです。





#前置き長すぎでした
やっと作り始めます。ゴタゴタしながら頭の中で雰囲気ﾓﾔｰって感じでゲームの流れを考えてみた。
簡単なやつがいい、最初だし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173892/5d17c216-36db-7826-9c9e-e946b41ddbd4.png)

パット見ナンノコッチャわからないと思う。まぁとりあえず作るのでそれを見ていただこう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173892/165868be-de59-b5ba-20e2-76b6e0e3369f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173892/5ed64355-b7a3-58d1-0a96-d91a3e69d6b8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173892/5badf94f-0858-81f2-c102-c2756a5d76e5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173892/845eb3b7-ca54-0d21-edaa-9638f1490df3.png)

このドワーフおじさんは下記のURLからいただきました。
https://blog.goo.ne.jp/akarise/e/87e30d48b5b93deb83e3ff824766d539
二次配布がダメなので、git上で公開するときどうしようかなと。
画像の結合圧縮暗号化して、見えなくするとかしないとダメになるのか、とするとgit上で公開するの面倒だぞと思った。

立ち絵で二次配布OKなcreative comons 2 ~ 3 くらいのやつがあればいいんですけど、なさすぎて難しい。
正直作ってる時間　＜　素材探す時間になってしまった。
スクショ取ってupするのは二次配布ではないだろうけど、流石にassetに立ち絵突っ込んでgitに置いたら二次配布になってしまいます。どうにかせねばgitで公開できない・・・

海外の素材サイトは二次配布改変なんでもござれなものが多いのですが、見たらわかると思いますけど私が作ろうとしているのは世○樹の迷宮っぽいやつなので、日本人がよく使う立ち絵みたいなのがほしいのです。
あとこのドワーフが気に入ったのもあります。

画像結合圧縮暗号化のライブラリが恐らくあると思うので、git公開はその辺の勉強が終わってからになるか、立ち絵と音楽がない状態で一度上げるかになると思います。どちらにしても明日か明後日になりそうです。

実際にwebで動いたゲームっぽいもののソースコードが欲しかった方々、おまたせしておりますが、もうしばらくお待ち下さい。

アクションゲームの方（シューティングとか）を期待していた人たちはごめんなさい・・・
要件定義においてのCRUDについて

##免責事項
この記事は初心者視点でザックリとした説明をしています。正確性に欠ける可能性がございますが、ご了承ください。「明らかに違うよ」ということがありましたら、ご指摘くださると幸いです。

##環境
OS：最新版ではないMacOS
VirtualBox：5.2.26
Vagrant：2.2.6
Ubuntu：ubuntu/bionic64 v20181129.0.0


##目次
1. CRUDとは
2. オブジェクトライフサイクルとは

なにかアプリを作るとき、要件をそのアプリの機能の定義をしますよね。
そのときに機能をモジュールとして分けることで、開発効率と保守効率が上がります。
しかしながら、モジュールといっても何が必要で何が不必要なのか、いまいち分かりづらいです。
そんなときにCRUDという概念（考え方）が有効になります。

#1. CRUDとは
CRUDとは、データを操作する際に必要な最低限の機能である
①登録機能（Create）
②参照機能（Read）
③変更機能（Update）
④削除機能（Delete）
の頭文字を取った者です。

例えば、メモ帳アプリを例に考えてみます。

新しいメモを書く → メモの登録 →　Create
書かれたメモを読む →　メモの参照 →　Read
書かれたメモを書き換える → メモの変更 → Update
書かれたメモを削除する →　メモの削除 → Delete

といった具合になると思います。
会員情報のモジュールをつくるときも同様に、 

会員登録をする → 会員情報の登録 →　Create
登録された会員情報を読む →　会員情報の参照 →　Read
登録された会員情報を書き換える → 会員情報の変更 → Update
登録された会員情報を削除する →　会員情報の削除 → Delete

となると思います。
要件定義の際に必要なモジュールを考えるのに利用できる概念です。

しかしながら、CRUDにも要件漏れがあることもあります。
そこでCRUDのチェックに使うのがオブジェクトライフサイクルです。

#2. オブジェクトライフサイクルとは
オブジェクトライフサイクルとは、対象の一生のことです。
分かりやすく言うと、データ（＝オブジェクト）がどのように生成されて、どのように状態変更されて、どのように削除されるのかの様子を表したものです。

例えば、人と会員情報をオブジェクトとして比較してみると、
人が生まれる = 会員情報が登録される
人の苗字が変わる = 会員情報が変更される
人が死ぬ = 会員情報が削除される
となります。

ステートチャート図で表すとわかりやすいかもしれません。
![スクリーンショット 2019-11-03 17.52.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374924/650967ce-f6d1-6a6d-23a3-c08050dc97d1.png)

データも人の一生のように、変化したりなくなったりするということを表しています。
Readを加えるとこのようになります。

![スクリーンショット 2019-11-03 17.56.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374924/1e1964e9-5cf4-67e8-e5fa-20b60dd1f87f.png)

ぜひ、要件定義において、モジュールを考えるときに役立ててみてください。

##参考
「N予備校 プログラミングコース」
https://www.nnn.ed.nico/
「「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典」
https://wa3.i-3-i.info/word123.html
docker-compose run <servce-name>で実行したのと同じコンテナに exec でアクセスする ( #docker )

# run

```
docker-compose run <service-name>
```

- docker-compose up せずにサービス単位で run & exec しいたいい
- 単独で サービス名を指定して run すると docker-compose up とは別コンテナが起動する
- docker-compose run を2回実行すると2個のコンテナが起動するが、同じコンテナにアクセスできるわけではない

# ps

docker-compose ps ではなく docker ps でそれらしきコンテナを見つける

```
docker ps
```

よく見れば分かるはず

# exec

- docker-compose exec ではなく docker exec でコンテナにアクセスする
- docker-compose exec で色々とサービス名などを指定してみたがうまくいかなかった、偉い人教えてください

```
docker exec -it <Container-ID> bash
```

以上。

# run baby run

生産終了したmicroスクーターのペダルフローを引っさげてスターバックスに通ってる。

![image](https://user-images.githubusercontent.com/13635059/68080810-3dd44c80-fe46-11e9-8d3d-eaf8ca58cbe8.png)

![image](https://user-images.githubusercontent.com/13635059/68080811-4167d380-fe46-11e9-883a-ff9709d4d232.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2662








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
なぜ大学でテスト駆動開発ができなかったのか新卒で企業のコードに触れたので考えてみた

## 「テスト駆動開発」を読みました.
https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4274217884/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=

会社であるプロジェクトに配属され, テストはカバレッジ100%のルール下で, テスト駆動開発を極力心がけるようにして1ヶ月半, その状態で読んだこの本は非常に面白いと感じました.
実のところ, 大学の頃一度この本を読もうと思ったことがあるのですが, そのときは開始30ページくらいでやめました. 当然テストなんてかけません. そこで, 大学の頃, なぜこの本を読み, テスト駆動開発を行うことができなかったかを当時コードを見ながら考えてみました.

## 当時のコード
https://github.com/tomoya-paseri/kakei_gakuen

人生の中で初めて, チームでサービスを1つ作り上げるという経験をしたプロジェクトです. 大学の授業でかならず1つ実験を取らなくてはいけないなかで, 一つだけ開発で単位をもらえるということでとったのが始まりです. サービス内容はREADMEにて
なお, 私のaws無料期間が切れたため, もうサービスは動いていません.


## 本を読んで心に残ったこと
- 小さなステップで確実に実装を進めていく
- まずは失敗をすることから
- グリーンな状態(常にテストが成功している状態を維持する)
- XUnitの精神はそのシンプルさ

… おそらく普段からテストを書いている人はそんなの当たり前だろと思うでしょう. 私自身もだんだんとこれが当たり前になりつつあります. しかし, 大学当時のコードを見ているとこれが以下に大切だということがわかりました.


## できない理由1. 学生は 動くこと >>>>>>>>>>>>> 保守性

結論大学の授業は動くものがちゃんと出せれば評価されます. 出せればいいんです. 
保守性? 小さなステップ? そんなこと知りません. その結果がこれです.

https://github.com/tomoya-paseri/kakei_gakuen/blob/master/app/controllers/api_controller.rb


これはコントローラーです. **コントローラーです**
railsを使っているので, 当然MVCですが, これはCとVさえあれば動くようになっています.
本の第1章のように小さく, 小さく自分たちが実装することをリスト化し, 実装とリファクタリングのサイクルを踏む, なんてことをしなかった結果がこれです. 当然なにか問題が起こっても, すぐに原因はわからないですし, なにより他の人はだれもコードを読むことができません.
おそらく, このコードを見てもらえれば, 小さなサイクルで実装とリファクタリングをすすめることの大切さがわかると思います.

ちなみに, このコードは私が1人で書きました.  なぜなら他の人が誰も手を付けられなくなってしまったからです.


## できない理由その2. 悪魔の囁き「scaffold」

railsにはMVCの全てと, テストがすべて自動で作られる魔法のコマンド `rails g scaffold` というものがあります. さて, 成功するテストを学生がはじめから渡されるとどうなるでしょうか? 当然そのテストが落ちることと, エラーが起こることを嫌がります.
その結果がこちら

https://github.com/tomoya-paseri/kakei_gakuen/blob/master/app/controllers/books_controller.rb

https://github.com/tomoya-paseri/kakei_gakuen/blob/master/test/controllers/books_controller_test.rb


まあ, 書かなくなりますよね. もちろん自動生成されたテストは少し手を加えるとすぐに失敗するようになるので, 消します.

先程のコードと比べ, まだマシなように見えますが, 開発当時, マイナスの値を入れると予算がバグったり, アプリ内コインが無限に手に入るといったバグがあとからどんどん見つかると言ったことがありました.

## 失敗する理由3. テストはない上に, グリーンな状態は維持しない
https://github.com/tomoya-paseri/kakei_gakuen/commit/173647db4668f5aadfeedffba51bd87a6ff0d23f


これとかそうなんですが, 複数のDB操作が成功しないといけないのに, トランザクションを貼っていなかったため, しばらくデータの整合性が取れない状態や, jsのバグをほっといたのをまとめて直したコミットです. 仮にテストが合ったとしたらずっとレッドだったと思います. その結果, ブランチ名が add_something_something. 毎週の発表の際はここは来週直します, ここは来週直しますをずっと繰り返していたと思います.


## 失敗する理由4 シンプルさを大切にしない

このプロジェクトを踏まえて, 次はテストをちゃんと書こうと決めて作ろうとしたことがあったのですが, そこでRSpecを使ったのです. 理由は機能が良いとネットで見たから. 一人だけRSpecを使っていたことがあったやつがいたので, そいつは書けたのですが, ほかはまあ書けない. RSpec機能はいいのですが, 書き方に癖があるんです. minitestもまともに書けないくせに, minitestは機能が足りないとか言っていたので当時は馬鹿だったんでしょう. シンプルなことは大切です.


## 終わりに

結局の所, テストを書かない一番の理由は必要だと感じることがないことだと思っています. もし, 本当にテストが必要なのであれば, 上4つみたいなことは起こさないでしょうし. 読んだことない方は一度「テスト駆動開発」を読むことをおすすめします. 自分のしでかしたことがよく分かるので.

## 少しだけ昔の自分を褒めたいこと
https://github.com/tomoya-paseri/kakei_gakuen/blob/master/circle.yml


テストは書いていませんでしたが, Circle CI + EC2 + Code Deployでデプロイの自動化ができていたことはよくやったなと思っています.(EC2触るの, これが初めてでした)
なお, これは2017年のCircle Ci 1.0を用いたデプロイなので現行の使用とは全く違うので参考にしないようお願いいたします...
Kotlin resの話

# KotlinでのAndroidアプリ開発
参考文献
[App resource overview | Android Developers](https://developer.android.com/guide/topics/resources/providing-resources)

## 環境
Android Studio 3.5

## res(リソース)ディレクトリの話

プロジェクト作成時に生成されるresディレクトリとその中身

- res
    - drawable
    - layout
    - mipmap
    - values

他にもmenu, fontなどのリソースディレクトリがresディレクトリ内でサポートされている．しかし，menuなどのリソースディレクトリを活用したい場合は自分で作成する必要がある．

### drawableについて
一般的に，画面上に描画するグラフィックを保持．
.png, .jpg, .gifなど．

### layoutについて
ユーザーインターフェース(UI)のレイアウトを定義するXMLファイルを保持．

### mipmapについて
さまざまなランチャーアイコン密度のdrawableファイルを保持．

### valuesについて
文字列，整数，色など，単純な値を含むXMLファイルを保持．


### 代替リソースについて
\<resources_name>-\<config_qualifier>の形式で名前を付けた新しいディレクトリを作成する．
例) 

- res
    - drawable
        - icon.png
        - background.png
    - drawable-hdpi
        - icon.png
        - background.png
    - values
        - strings.xml
    - values-en
        - strings.xml

hdpi修飾子は，ディレクトリ内のリソースが高密度画面を持つ端末用であることを表す．

## 端末の言語設定によって文字を変更

(1) resディレクトリの上で右クリック．New->Directoryを選択．
![selectDirectory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369267/6b9f4702-f716-04ab-14eb-aff9ef3ab751.png)

(2) ディレクトリ名を"values-en"にする．
![values-en.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369267/bac64249-659e-b3ba-a74f-0f4105e76087.png)

(3) resの下の階層(valuesと同じ階層)にvalues-enがあることを確認する．無い場合は，Android Studio右上の虫眼鏡から"values-en"を検索して選択する．
![search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369267/7e334c2c-59d7-9f33-ab01-57de455d8f42.png)

(4) values-enがあることを確認する．
![afterSearch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369267/52f270d5-addc-91e8-8eb3-98b14e10043f.png)

(5) values-enディレクトリの上で右クリック．New->Values resource fileを選択．
![selectValuesResourceFile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369267/9d261b46-f222-8228-0024-e8ef5149baf8.png)

(6) Values resource fileの名前をstrings.xmlにする(valuesの下の階層にあるstrings.xmlと同じ名前)．
![newStringsFile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369267/17e68570-96d2-0c94-c9b4-a6da341bea65.png)

(7) values/strings.xmlと作成したvalues-en/strings.xmlの２つのファイルを編集する．今回アプリの名前は"AndroidSeminar1"としている．
![default-strings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369267/ec8ae6c2-5ceb-c35b-16cc-b470482d73fb.png)
![en-strings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369267/10ee2656-4f90-e0bb-9405-642784100a8c.png)

(8) 作成した文字列をlayoutに追加する．
例)
activity_main.xmlのTextView(無ければ追加)のtextの部分を
`android:text="@string/main_text"`
に変更する．main_textの部分は，strings.xmlのnameの部分に対応している．
これで，端末の言語設定によって表示される文字が変更される．
DELL XPSデスクトップにdual bootでubuntuをインストールする時の引っかかった点

# USB installerのフォマットはFAT32にする
USBにubuntu isoファイルを書き込む時、USBをFAT32にフォマットしないといけないです。
NTFSだと、USBにburnできないと分かっています。

# Boot ModeはUEFIだけで良い、legacy一切しない
FAT32フォマットのUSBだと、UEFI OptionsリストにUSBが現れるはずです。
「Add Boot Option」もしなくて良いです。
legacyにしない理由は、Windowsが既にUEFI boot listにあるので、Ubuntuも同じくUEFI boot listにしたいだろう。

# 「Install Ubuntu」に入ってから、画面壊れて、couldn't get sizeエラー
これは結構引っかかりました。
この文章([NVIDIA GeForce 入り PC で Ubuntu インストーラ(GUI版)の表示が壊れてた場合](https://qiita.com/yoya/items/026317fe2ddb30ab411d))が同じ事象を対応しています！

> 具体的には、Install Ubuntu のメニューが出るところで、**eボタン**を押すとカーネルパラメータ設定がいじれて、**linux 行**の末尾におもむろに **nomodeset** を追記するだけです。

「Install Ubuntu」に移動してeボタンを押します。
linux行を見つけて、長いパラメタリストの最後にnomodesetを追記して、F10を押します。
そうすればUbuntu installer画面に入りました！

# nvidia gpu driverをインストール
nvidia gpu driverをinstallしないと、２ディスプレイ認識してくれなかった（HDMIに接続しているディスプレイを認識してくれなかった。DisplayPortに接続しているディスプレイは認識してくれた）。
Ubuntu 20.04にupgradeしたら、「Additional Drivers」に一番上のdriverは「Using NVIDIA driver metapackage from nvidia-driver-470 (proprietary, tested)」になった。それをチェックして、apply changesした。
「Apply Changes」が終わって、再起動したら、２ディスプレイで表示するようになった。

# Japanese Input SourcesにJapanese(Mozc)が存在しない
ネットでの日本語入力設定方法にほとんどInput SourcesにJapanese(Mozc)を選択するって書いてるんですが、そもそもJapanese(Mozc)が存在していません。
その代わり、anthyを使えました。
```sudo apt-get install ibus-anthy```
再起動したらJapanese Input SourcesにJapanese(Anthy)が出ました。それを追加して、win+spaceで切り替えられます。
[この文章](https://askubuntu.com/questions/1169369/how-do-i-install-japanese-anthy-ubuntu-18-04)を参考しました。
Firebase Analytics データが送信されないのはSQLiteが古いせいだった

# 背景

Firebase Analytics データが反映されず、コンソールにデータが表示されなかった。
また、プロジェクトのアプリ登録がうまくいかなかった。

なお、ビルドも通るしクラッシュもせずアプリは動作する。
既存アプリでFirebaseとSQLiteを使っている人は非常に気付きにくい問題だと思う。(試してないけど、SDKを更新した時に発生する気がする)

# 発生事象

実際にはFirebaseの初期化(`configure`)は出来ていて、`Auth`や`Database`などは問題なく動いていた。
`Analytics`のみ正常に動いていない状態だった。

こんなログが出て詳しい原因は全く出力されない模様。

```
[Firebase/Analytics][I-ACS023049] Analytics is disabled. Event not logged
```

# 原因と解決

利用しているSQLiteのバージョンが古いためだった。
現在最新のバージョン（3.30.1）にしたら正常に動作した。

解決した後はこのようなログが出た。

```
[Firebase/Analytics][I-ACS023012] Analytics enabled
```

参考URL： https://github.com/firebase/firebase-ios-sdk/issues/3321
SQLite3ダウンロード： https://www.sqlite.org/download.html

# 余談

ログが汎用的に使われていそうなメッセージなので、ログが同じでもこれとは違う問題の可能性もありそう。
Atomでpythonを扱うまで

#Atomでpythonを扱えるようにしてみた 
今回pythonの勉強をすることになったため、自分のノートPCでpythonを
扱えるようにしてのでまとめていきます！:yum:

##1.python3をインストール
まずはpython3をインストールしましょう！

:point_down_tone2:こちらのサイトからダウンロードできます。
https://www.python.org/downloads/
黄色くDownload Pythonとあるボタンを押せばOK!

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526974/b50f3753-4e06-729f-696b-fcb90a545161.png)

ダウンロード出来たら手順に従ってインストールします！

私はこれが必要だと知らずに、この工程をすっ飛ばして
Atom内で試行錯誤してました:persevere:
そんなのでpythonが動くわけがないんです（笑）

##2.Pythonの環境変数Pathを通す
正直ここら辺が難しかったです（笑）:relaxed:

windous10の方は、"cortana"に"環境変数"と入力すると
"システム環境変数の編集"がでるのでそこに行きます。

"詳細設定"の"環境変数"をクリックすると、
"ユーザー名のユーザー環境変数"と"システム環境変数"が
出てくるので"システム環境変数"の中の"Path"をクリックして
"編集"をクリックします。"新規"で、再程インストールした
pythonのパスを入力します。

デフォルトだと恐らく
C:\Users\"ユーザー名"\AppData\Local\Programs\Python\Python38-32
（ユーザ名は自分のユーザー名）にあると思います。

これで環境変数Pathを通ったはずです。
試しに、コマンドプロンプトで"python"と入力していろいろ出てきたら
環境変数Pathは通ってます！

##3.Atomをインストール
ようやくAtomをインストールです。:grin:

:point_down_tone2:こちらのサイトからダウンロードできます。
https://atom.io
「Download」とあるボタンをクリックでダウンロードできます。

ダウンロード出来たら、手順に従ってインストールします！

インストールしても、そのままではコードを実行できません。:disappointed_relieved:
これ知らないで長い時間試行錯誤してました（笑）

メニューバーの"File"の"Setting"をクリックし、"Install"
を選択します。すると、"Install Packages"の中に
"Search paccages"と書かれている所があるので、そこに
「atom-runner」と入力します。

"atom-runner"がでてくるので、それをインストールします。
これでAtomでpythonを実行できるようになりました！:joy:
atom-runningで実行する時は"alt"+"r"キーで実行できます。

##エラーが出た（泣）
せっかくAtomでpythonを実行できるようにしたのに、プログラム内で
"input"を使ったらエラーを吐かれて実行できませんでした:sob:

試しにコマンドプロンプトで実行すると問題なく実行できたので、
これからは実行する時はコマンドプロンプトで行うことにします（笑）
（コマンドプロンプトもcortanaで検索すればすぐ出ます）

ちなみにコマンドプロンプトで実行するには、実行したいファイルがある
ディレクトリに移動して（"cd フォルダのパス"）、"python ファイル名"
で実行できます。
実行するファイルの拡張子は".py"で作成してくださいね:kissing_smiling_eyes:

#終わり

私があまり知識がない人なので、誰でも見ればできるような記事に
なったのではないでしょうか（笑）

今回はAtomでエラーが吐かれてしまうコードがあってコマンドプロンプト
で実行しましたが、改善する方法が分かったらまた記事にしたいと思います:relaxed: