OmniAICreator/Qiita-1.07M huggingface dataset:
ある日突然名前解決ができなくなった時に見ると、助かるかもしれない

#はじめに
こんにちは、黒糖と申します。

ブログ（https://kokutoh.com/?p=187）
に書いた内容と同じですが、同じ轍を踏まないようにQiitaにも書いて、供養したいと思います。

日々、システムエンジニアとして、とあるECサイトの保守・運用業務を担っております。
※環境としては、一般的な構成（FW、SSLアクセラレータ、LB、Web(AP)サーバ複数台、DBサーバ）で
　アプリケーションのミドルウェアはWebshere Application Server 8系
　Web(API)サーバのOSはRedhat7、Java1.7です。

先日、他社様とのWEB API 部分で、通信に失敗し、
試行錯誤した末に、復帰することができましたので、備忘の意味も込めて、残しておきます。

#原因？
結論から申しましょう。
原因としては、APIを受ける他社様サーバはAWS上に構築されており、IPアドレスが可変であったことです。

#でも、ちょっと待って・・・
ただ、そのAPIにリクエストを送信するWEB サーバから参照しているDNSサーバは、
他社様指定のもので、名前解決の結果、もちろん可変後（変更後）のIPアドレスをしっかりと返してくれておりました。
つまり、WEBサーバから、当該APIのFQDNで、nslookupコマンドを使用すると、何の問題もなく、現在のIPアドレスが返却されていたのです。

では、なぜJavaアプリケーションからだと急に通信に失敗するようになったか。
（ちなみにFWのポリシー設定では、FQDNで許可設定を入れているので、該当のNWには出れていました。）

#本当の原因！！
実はJava7では、デフォルトのDNSキャッシュ設定が、TTL=-1　つまり永続的にキャッシュするという設定が入っております。

これにより、APIを受けるサーバのIPが変わっても、以前に通信成功した時のIPアドレスに向けてリクエストを送信、
結果として該当のサーバは存在していない（もしかしたら存在するかもしれないが、該当のAPIはそのサーバには存在しない）ので、
通信に失敗したということです。

#改善するには
対策としては、上記のJVM側のDNSキャッシュをTTL=0(無効）に設定することで、
都度都度、DNSサーバで名前解決をするようになり改善されました。

#今後は・・・
教訓として、通信が不通になってしまった場合、FWの設定に目を向けがちですが、JVMの設定に目を向けるのも大切だということです。
（ひょっとするとTomcatやWebShereにもそのような設定が可能かもしれないので、そこも今後は調査対象とすべきです。）

#おわりに
AWS上で構築されているサーバとの通信が不通になった場合は、上記お試しいただけるとよろしいかと。
（JVMのDNSキャッシュ設定は、java.securityというファイルを書き換えることで可能です。
詳細な場所とかはググれば死ぬほど出てくるので割愛します。）

以上です。
Unity for文を1つにまとめたい！

## 0. 前提 
この記事はリストや配列などを用いる時に何度も使う`for`を1つにまとめよう！という記事です。
指摘などありましたら、ぜひコメントお願いします。

__※あくまで、こういう方法があるというだけで、絶対に推奨するというものではありません。__
## 1. 変更前
``` C#:Character.cs
public class Character
{
    private bool isAlive = true;

    public void Attack() {//攻撃処理}

    public void Guard() {//防御処理}

    public bool IsAlive()
    {
        return isAlive; 
    }
}
```

```C#:Main.cs
    private List<Character> characters = new List<Character>();

    void CharacterAttack()
    {
        for (int i = 0; i < characters.Count; i++)
        {
            characters[i].Attack();
        }
    }

    void CharacterGuard()
    {
        for(int i = 0; i < characters.Count; i++)
        {
            if(characters[i].IsAlive())
            {
                characters[i].Guard();
            }
        }
    }
```
こんな感じのがあったとします。
## 2. for文をまとめる
for文を1つにするために以下を作成します。

```C#
void Each<T>(List<T> list, Action<T> action, Func<T,bool> func = null)
{
    for (int i = 0; i < list.Count; i++)
    {
        if (func())
        {
            action(list[i]);
        }
    }
}
```

※引数について
第一引数(list)　　 ・・・　処理を行う要素のリスト
第二引数(action)　・・・　各要素が行う処理
第三引数(func)　　・・・　処理を行う条件（省略可能）
となっています。

```C#:Main
    private List<Character> characters = new List<Character>();

    void CharacterAttack()
    {
        Each(characters, CallAttack);
    }

    void CallAttack(Character character)
    {
        character.Attack();
    }

    void CharacterGuard()
    {
        Each(characters, (character) => character.Guard(), (character) => character.IsAlive());
    }
```
Attackはそのままの使い方
Guardはラムダ式を利用した使い方になっています。

__このように毎回for文を書く必要がなくなります！__
これが2次元の配列などになってくるとよりメリットを感じれると思います。
## 3.  最後に
いかがでしたでしょうか？
慣れないと読みにくいと感じると思いますが、コードがかなりスッキリします。
それぞれの状況に合わせて、利用するか考えてみて頂けたらと思います。
コロナ太りの俺必見！自分にあったペースで数を読み上げてくれるパーソナルトレーナーアプリを作ったよ。

Siriに頼んでみたんですけど運動アプリが起動するだけで数を数えてくれませんでした( ﾉД`)　なのでこんな感じのを作ります。
![0523-pushups-illust.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1289676/c17ebb69-3d2e-4401-8fbb-03d11d69d838.png)



#腕立て伏せメトロノーム（実際に使えるので是非お試しください）

***[Push-ups Metronome v1.0](https://friendly-feynman-497760.netlify.app/)***
![0523-Pushups-01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1289676/255f24a5-fd8f-814d-60ae-1e282ca8bcb2.png)

#つくった理由はパーソナルトレーナーっぽいサポートが効果ありそうだったから。
在宅ワークや外出自粛でぶにぶにしてきたので腕立て伏せでもしようかな、と思ったんですがあれって後半に辛くなってくると動きが遅くなっていくんですよね。でも**きっと一定のスピードでやったほうがいいんだろうなぁ**。パーソナルトレーナーとかついてたらそんな感じのイメージだもん。

キツイ状態の自分の秒数読み上げなぞアテになりませんので、機械に数えてもらいます。でもピッピッという電子音だと「あとどのくらい続くの…」と思って挫けやすそうなのでちゃんと数をしゃべってもらいます。画面を見るのは運動によっては難しいので音声でやります。

#ライバルはフィットネス動画と運動アプリだけど、それらより運動を継続できそう。
●フィットネス動画
そんな「イチッ！　ニッ！」って早すぎ！　もっとゆっくり「いーちっ！　にーぃ！」くらいからお願いしますよ…。**自分にちょうどよい負荷の回数から始めないと続かない**ですよ。でも**今の負荷に慣れたら早くしたり回数を増やしたい**んですよね。

●運動アプリ
[「Maelz Sports」](https://fytte.jp/fitness/81557/)というスマホアプリが良さそうだったのでインストールしてみたんですが、自分用の専用メニューを構築する操作が細かくて使いこなせませんでした。あと電子音のときはテンポを変えられるのですが、音声読み上げだと1秒固定でした。残念。


#つくりかたは公開されてるスクリプトをニコイチしてWeb Speech APIで発話させる。
CodePenで公開されている「[SimpleMetronome](https://codepen.io/ganderzz/pen/Ezlfu)」をベースにして、メトロノームアイコンとして「[Pure CSS Metronome (no svg)](https://codepen.io/oaviv/pen/EydZOq)」を移植しました。その際、[Pugで書かれていたので無印HTMLに変換](https://qiita.com/ShinsukeSutou/items/eedb31c82bf342168658)しました。

読み上げ部分はSpeak.jsを使ってみようと思っていましたが音声が鳴らず、断念。代わりにブラウザのネイティブAPIである[Web Speech API](https://qiita.com/hmmrjn/items/be29c62ba4e4a02d305c)を試したところ成功しました。カウントの仕方は元ネタ既存の変数だとあくまで経過時間しかなく、読み上げたい回数ではなかったため、独自のカウンタを追加して対応しました。

そもそもの元ネタが音楽用のメトロノームでBPM(beat per minutes)という単位がわかりにくかったので、腕立て伏せの「何秒に1回やる」といった利用者が理解しやすいように修正しました。そしてデフォルト値として自分がもっとも利用する回数、秒数を設定しました。

#改良するならこんなふうに
●BPMの変換のところが手計算して手入力なので、最低限の入力だけで自動計算するようにしたいです。

●1秒以内に腕立て伏せをやろうとすると「さんじゅうきゅう」のように読み上げ時間が1秒以上になってしまい、段々ずれてきます。「よんじゅう」と読んだあとは「いち」「に」と一の位だけを読んで、次に十の位が変わったときに「ごじゅう」と読むようにしたらいいかな。

●読み上げカウンタの初期化を忘れていたので、続けて開始ボタンを押すと前回の続きの数字を読み上げてしまうので直したいです('A`) 

●ストレッチ系のフィットネスにもデフォルト値を変えるだけで流用できると思うので作りたいです。

#環境

|Type|Library|
|----|------|
|JS|[jQuery](https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js)|
|JS|[FitText](https://cdnjs.cloudflare.com/ajax/libs/FitText.js/1.1/jquery.fittext.min.js)|
|CSS|SCSS|
|API|Web Speech API|

#コード

CodePenにて公開してます。
[https://codepen.io/stsin0527/pen/abJJjqR](https://codepen.io/stsin0527/pen/abJJjqR)

#つくった感想。知らないコードを読み解くのが楽しい。
公開されているコードをニコイチ、というと簡単そうなんですが、まあそんなわけはなく。元ネタで音を出しているコードはどこだ？　AudioContextかな。これってなんだ？　どこで音を指定してるんだ？　と調べていく作業は楽しかったです。基礎教育なく放り込まれている感じなのですが、必要性に迫られたものを調べていくのはモチベーションが高いので、必要性のわからない授業をぼーっと聞くよりは性に合ってるかな、と思います。

━－━－━－━－━－━－━－━－━－━－━－━－━━－━－━－━－━－━－━－━－━
2021年4月からプロトアウト（プロトタイプ＋アウトプット）スタジオに参加して、技術を学んだり自身を深掘りして卒業制作＝クラウドファンディングのテーマを決めたりしています。

金融系SEという安定稼働を最優先にガチガチに設計書を作ってバグは許さぬ、という世界で十数年やってきました。自分の性格としても独創的なアイディア出しは苦手で、決まったことを正確に効率的にこなすことが得意です。

そんな私が無事クラウドファンディングに辿り着いて成功できるのか、見守っていただけましたら幸いです。

〇情報発信
・自身とテーマ深掘り的な記事 → [note](https://note.com/shinsukesutou)
・開発中のつぶやき → [Twitter](https://twitter.com/ShinsukeSutou)
【Flutter】RaisedButtonからElevatedButtonへの変更点

Flutterのバージョンが2にアップデートしたときにRaisedButtonが非推奨になり、エディター上で線をひかれるようになりました。

![スクリーンショット 0003-05-23 17.14.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163786/c3422b3e-dd6c-2e6c-c31c-618baaee2f98.png)

非推奨なのでそのまま使うことができるのですが、バージョンが1のコードを移したいときとかによく引っかかるので新しい書き方をまとめておきました。

## 新しいボタン
RaisedButtonはバージョン2からElevatedButtonに変わりました。

| 旧ボタン | 新ボタン |
|:----------:|:-----------:|
| RaisedButton | ElevatedButton |

```dart
RaisedButton(
  child: Text('RaisedButton'),
  onPressed: () {}
)
```

```dart
ElevatedButton(
  child: Text('ElevatedButton'),
  onPressed: () {}
)
```

![スクリーンショット 0003-05-23 17.23.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163786/25586aba-5e9d-2f36-4b46-3f1347bb5dc8.png)


書き方はこの時点では同じです。
デフォルトでの見た目はRaisedButton時はグレー背景に黒文字、
ElevatedButton時は青背景に白文字になっています。

## 装飾の仕方
ではこちらのボタンを同じ背景色、文字色に装飾するときの違いを見ていきましょう。

![スクリーンショット 0003-05-23 22.42.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163786/b8facf44-3cad-c7b0-e1ac-3cf902d0b2ff.png)


### RaisedButton

```dart
RaisedButton(
  onPressed: () {},
  splashColor: Colors.purple,
  child: Text('RaisedButton'),
  color: Colors.blue,
  textColor: Colors.white,
  shape: RoundedRectangleBorder(
    borderRadius: BorderRadius.circular(6),
  ),
  elevation: 16,
  padding: EdgeInsets.symmetric(
    vertical: 15.0,
    horizontal: 100,
  )),
)
```

RaisedButtonはそれぞれの装飾のプロパティをRaisedButtonの直下で記入できました。
テキストのカラーは`textColor`で設定できます。
背景は`color`、ボタンを押したときは`splashColor`

### ElevatedButton

```dart
ElevatedButton(
  onPressed: () {},
  style: ElevatedButton.styleFrom(
    primary: Colors.blue,
    onPrimary: Colors.purple,
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(6),
    ),
    elevation: 16,
    padding: EdgeInsets.symmetric(
      vertical: 15.0,
      horizontal: 100,
    ),
  ),
  child: Text(
    'ElevatedButton',
    style: TextStyle(
      color: Colors.white,
    ),
  ),
)
```

ElevatedButtonは`style: ElevatedButton.styleFrom`と書いてからその直下にプロパティを書くことになります。
テキストは`style: TextStyle`を設定してから色などを変更できます。
背景はprimaryで設定、ボタンを押したときはonPrimaryで設定します。

以上が新ボタンのまとめです。
`FlatButton`から`TextButton`や`OutlineButton`から`OutlinedButton `も似たような感じです。
交差検証で学習データにオーバーフィットする事例について

#はじめに
機械学習において汎化性能を評価する方法として、交差検証(クロスバリデーション)がよく用いられる。

このクロスバリデーションであるが、**学習データにオーバーフィットすることもある**ので、実施する前にテストデータを残しておき、クロスバリデーション後にテストデータを使って**未知のデータに対する精度**を検証することが一般的に推奨されている。

とはいえ、**5分割とかに分割して検証しているのに、学習データにオーバーフィットすることなんてあるの？** と半信半疑だった。今回、見事にオーバーフィットするケースを見つけたので共有したい。

#前提
今回は、http://moleculenet.ai/datasets-1 で公開されているFreeSolv(回帰)のデータを用いる。MoleculeNetによるとこのデータの最高精度は**R^2**で**0.92**程度となっている。

#やってみよう

データを学習**449件**、テスト**193件**に分割し、**420個の多めの特徴量**を用いて、学習データに対し scikit-learn の SequentialFeatureSelector を使って特徴量を5～50まで5個ずつ刻みながら特徴選択をしてみた。

```python
from sklearn.feature_selection import SequentialFeatureSelector
from sklearn.cross_decomposition import PLSRegression

#select_features = [] 
for feature_num in [5,10,15,20,25,30,35,40,45,50]:
    pls = PLSRegression(n_components=5)
    sfs = SequentialFeatureSelector(pls, n_features_to_select=feature_num)
    sfs.fit(train_X_scaled, train_t)
    select_features.append(sfs.get_support())
```

続いて、選択された5～50の特徴量セット毎にクロスバリデーションスコア、外部検証スコアを求めてグラフ化してみた。

```python
from sklearn.model_selection import cross_validate
scores = []
stds = []
test_scores = []

# 選択された特徴セット(5～50)毎にクロスバリデーションスコア、外部検証スコアをグラフ化する
for featuers in select_features:
    # クロスバリデーションスコア
    train_X_scaled_tmp = train_X_scaled[:, featuers]
    pls = PLSRegression(n_components=5)    
    cv_results = cross_validate(pls, train_X_scaled_tmp, train_t)
    scores.append(cv_results["test_score"].mean())
    stds.append(cv_results["test_score"].std())
    
    # 外部データに対するスコア
    test_X_scaled_tmp = test_X_scaled[:, featuers]
    pls = PLSRegression(n_components=5)    
    pls.fit(train_X_scaled_tmp, train_t)
    test_scores.append(pls.score(test_X_scaled_tmp, test_t))

# 可視化
figure = plt.figure(figsize=(8,4))
ax = figure.add_subplot(111)
ax.set_title("PLS score plot")
ax.set_xlabel("n_components")
ax.set_ylabel("r2 score")
ax.plot(range(len(scores)), scores)
ax.fill_between(range(len(scores)), np.array(scores)-np.array(stds), np.array(scores)+np.array(stds), scores, alpha=0.5, color="lightgray")
ax.plot(range(len(scores)), test_scores)
```

すると以下図において、クロスバリデーションスコアが青で、外部データに対するスコアがオレンジで得られる。
クロスバリデーションスコアはなんと、**MoleculeNetの最高精度を超えている**。しかし外部検証スコアは10をピークに下がり続けている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/ac76814b-322d-1de3-c0d5-ce142e16d927.png)

グラフを見ると分かるが、20以上の特徴量セットは、学習データにオーバーフィットしてしまっている。

#なんでこうなったのか？
一言でいうと、**クロスバリデーションスコアが良くなるような特徴が選ばれた**ということであろう。
オーバフィットといういうとハイパーパラメータに目が行きがちであるが、このように**特徴選択**でも起こりうるということを身をもって知った次第である。理論的根拠を説明できないが、線形手法において起こりやすそう。
特徴選択は奥が深い。
異常系テストケースは参考例があったほうが助かる

# 異常系テストケースは参考例があったほうが助かる

異常系テストケースを作るときや、実装時の準異常系ケースを対応するときに、参考ケース例みたいなものがあれば考慮漏れとか少なくなっていいじゃないかと思ったので、思いつく限りを一覧化してみた。

## 読む前にご注意事項

- この記事を書いている人はソフトウェアテストに精通しているわけではないです。
- この一覧自体が思いつきのものをまとめただけなので、不足があります
- 実装しながら単体テストとかエラーハンドリングを考える際に、参考になったりしたらいいな程度のものです。

※基本的に自身がこういったものがあったらいいなを書いてるだけですので、参考程度でお願いします。

## テストパターンの作り過ぎに注意

過度なテストパターンの記載は、無駄な工数を作るだけですので、必要な物だけをピックアップするようにお願いします。

## 異常系の参考一覧

| No | Note |
| :---: | :--- |
| 1 | 境界値の確認（最大値・最小値,最大値より大きい値・最小値より小さい値） |
| 2 | 入力値の確認1（空文字,スペース,ゼロ,NULL,undefined） |
| 3 | 入力値の確認2（小数） |
| 4 | 入力値の確認3（カタカナ,半角カタカナ） |
| 5 | 入力値の確認4（記号:","半角カンマ、"'"クオート、'"'ダブルクオート、" "スペース、"."ピリオド、"/"スラッシュ、"\"バックスラッシュ、"="イコール、"?"クエスチョン、"!"エクスクラメーション、":"コロン、";"セミコロン） |
| 6 | 入力値の確認5（環境依存文字） | 
| 7 | 入力値の確認6（サロゲートペア） |
| 8 | 入力値の確認7（絵文字） |
| 9 | 入力値の確認8（javascript : ```<script>alert('Script!');</script>```） |
| 10 | 入力値の確認9（HTML : ```<input type="text" value="<font color="red">```） |
| 11 | 入力値の確認10（SQLインジェクション） |
| 12 | 状態の確認（通信経路が遮断） |
| 13 | 状態の確認（Webサーバ異常で応答不可） |
| 14 | 状態の確認（連携先応答不可,APIが応答しない） |
| 15 | 状態の確認（アクセス過多） |
| 16 | 状態の確認（DBサーバー応答不可） |
| 17 | ブラウザの種類（Chrome,Edge,Firefox,Safari） |
| 18 | ファイルサイズが大きいもののアップロード・ダウンロード |
| 19 | ボタン連打（更新ボタン、登録ボタン） |
| 20 | オフライン時 |
| 21 | オンライン → オフライン |
| 22 | DBの設置値が想定外の値 |
| 23 | APIへのパラメータ不足 |
| 24 | 同時更新（複数ユーザ同時更新、同一ユーザ別端末同時更新） |
| 25 | 同時更新（同じデータ・レコードに対して更新） |
| 26 | ネットワーク高負荷時の動作 |
| 27 | メール通知（送信先存在しない場合、メール届かない場合、キャリアメール、迷惑メール振り分け） |
| 28 | ファイルが読み込めない場合（ファイル存在しない、ファイル読み込み権限なし、ファイルロック） |
| 29 | UTC、ローカルタイム |
| 30 | 大量のファイルがある |
| 31 | ディスクサイズ不足 |


## 終わりに

まだまだ状況によっては、不足しているのな異常系ケースはたくさんあると思います。
今後、思いついたりしたら追記していくようにします。
もしこう言ったのもあるよとかありましたら、コメントで教えてください！よろしくお願いします。
AthenaにIDEから接続してみる

AWSのマネージメントコンソールから、Athenaの検索クエリを実行することができますが、IDE から検索できる方がより作業が捗りそうなので接続設定をしてみました。今回はJetBrains社のPyCharmで試します。
AWSからJDBCドライバが提供されており、こちらを使用した接続を試している記事がありましたが、Pycharmの接続先DatabaseのBasic SupportにあるAthenaを利用するほうが簡単だったので今回はそちらを実施します。
[JDBC ドライバーを介した Athena の使用](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/connect-with-jdbc.html)

## 接続までの手順
### Driverの設定

- Database→Drivers→Basic Support →Athena→Driver FilesのAthenaを選択
- Driver Fileがダウンロードされていなければダウンロードする。
![Driver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510203/c43d43e5-7908-9623-2dce-03f05b44f368.png)

### Date Sources設定
- Date Sourceを新規追加
    - アクセスキーによる認証の場合
        - Authentication 「User&Password」
        - User 「ACCESSKEY」
        - Password「SECRETKEY」
    - AWS Profileによる認証の場合
        - Authentication 「AWS Profile」
        - Profile 「pycharm-test」
    - Region 「ap-northeast-1」
    - URL 「jdbc:awsathena://AwsRegion=ap-northeast-1;S3OutputLocation=s3://xxxxxxxxxxxxx-ap-northeast-1/Unsaved/test/;Workgroup=primary;」

        - S3OutputLocationにて検索結果の保存場所を必ず指定する必要があります。
        - 一旦/Unsaved/test/ディレクトリに設定していますが、どこでも大丈夫です。
        - Workgroupは特に指定がなければPrimaryで問題ないです。
    - Test Conectionを押下　問題なければ設定完了

       ![Date Source.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510203/95df4b48-bf0c-84d8-2d17-608d81508d1f.png)

ここまでで設定完了です。
検索成功すれば無事IDEからクエリ実行できるようになりました。

## おまけ
- aws-vaultを使った認証の場合credential_processを追記
- ~/.aws/credentials

```
[default]
region = ap-northeast-1
credential_process = aws-vault exec --json default

[pycharm-test]
source_profile = default
role_arn = arn:aws:iam::xxxxxxxxxxxxxxxxxxxxxxxx
region = ap-northeast-1
```

#### 参考
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/workgroups-create-update-delete.html#specify-wkgroup-to-athena-in-which-to-run-queries
Ruby on Jets で詰まったこと

# はじめに

エンジニアとして就職して約1年、 久しぶりにRuby を書いてみたいなぁ、とふと思う。

最近流行りで弊社でもガンガン採用しているサーバーレスで実装しようということに。

「サーバーレス Ruby」 で検索すると一番最初にヒットした Ruby on Jets 

https://rubyonjets.com/

https://dev.classmethod.jp/articles/ruby-jets-serverless/

https://qiita.com/kskinaba/items/9c570093ed912f8f1681

すごい使いやすそう。。ほぼrails と使い方も同じだし。。

と思ったがいろいろとハマって腹がたったので記事にしましたww


# 腹立ちポイント

## （その1） ruby 2.6 だけサポートされてない。

Ruby on Jets がサポートしている ruby のバージョンは 2.5 と 2.7 らしいです。

2.6 でもアプリの作成はできますが、デプロイでこけます。


## （その2） jets deploy でハマった



```:terminal
$ jets deploy
（省略）

Command Failed cd /tmp/jets/jetsdemo/stage/opt && unzip -qo /tmp/jets/jetsdemo/serverlessgems/downloads/gems/nokogiri-1.11.5.zip > /dev/null 2>&1
```

これはおそらく Ruby on Rails でも起こるやつだと思いますが書きました。

```:terminal
$ jets clean:build
```

で解決

バージョン2.6 から 2.7 に変更したことによるものだと思ってます。


## （その3） Serverlessgems のは無料枠にはRate Limitがある

jets deploy するときに、デフォでServerlessgems を使用することになっているのだが、その使用回数には制限があるらしいです。

```:terminal
$ jets deploy
（省略）

ERROR: Limit Reached. This project cannot be deployed.

You have used 31 out of 30

Your current plan: Free
Please upgrade your plan or wait until your download limit resets.
Your download limit resets every day.


https://rubyonjets.com/docs/extras/ruby-versions/

https://zenn.dev/shibata/articles/94257ebd2d33c4
```

#解決策

## （その1）　
Serverlessgems 有料プラン登録

月50ドル〜　プランがいくつかあります。
これでRatelimit 問題は解決できますね。

https://www.serverlessgems.com/pricing


## （その2） jets deploy 時に Serverlessgems を使用しない

```ruby:

Jets.application.configure do
  config.gems.disable = true
end

```

https://rubyonjets.com/docs/serverlessgems/


カスタムレイヤーの作成を自身で作成すれば serverlessgems を利用しなくともデプロイ可能です。

https://rubyonjets.com/docs/extras/custom-lambda-layers/


## （その3） Serverless Framework でデプロイ

Serverless Framework の serverless-ruby-layerというプラグインを使えば結構簡単にデプロイできます。

https://www.serverless.com/plugins/serverless-ruby-layer

こうなると、もはやRuby on Jetsである必要はないですね。 Ruby on Rails でも Sinatra でもフレームワーク使わなくても大丈夫です。




# おわりに

やっぱり Serverless Framework のruntime rubyに方が使い勝手いいかもしれないです。

あとは、新しいフレームワーク使う時はちゃんとドキュメント一通り読んでから始めた方がいいですね。笑

あまりにも見切り発車すぎるとしょーもないとこで詰まっちゃうんで。
（めっちゃ地味）VSCodeでプロジェクト全体検索した結果をエディタで見れる機能が便利

プロジェクト全体検索（Cmd + Shift + F）すると結果がサイドバーに出てきますが、「Open in editor」という機能がありこれが地味に便利。
![スクリーンショット 2021-05-23 22.10.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110469/831a5a53-c781-4d4a-9d26-69db45037216.png)

こんな感じで開かれる

![スクリーンショット 2021-05-23 22.12.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110469/2f82cf93-fdc3-d638-aeff-c0a94ccc9309.png)


# 周辺の行の表示を設定
スクショで赤で囲っているところで、検索結果の周辺の行をどう表示するか設定できる。

「1」となっているが、これは前後１行ずつの合計３行が表示されるということ。

0にすれば該当行だけ表示されて見やすくなる。

# 検索結果をファイルとして保存
もちろんファイルとして保存もできる。

影響範囲、grepして調べましたー、といってこれを提出することもできる。
超初心者が、英語学習を始めたわが子に「英単語カード」をプロトタイプしてみた結果（改善点まとめ）

##今回の目的　~Webアプリでプロトタイプ！~
Webアプリケーションの学習を、数日前に始めたばかりの**超初心者**です。
[前回の投稿記事](https://qiita.com/kokano23/items/e4bc61090ad2164398cc)のとおり、基本用語そのものが理解しきれずにスタートしているため、大苦戦中💦
わが子（幼児）が英語教室に通い始めたばかりなので、せっかくなら**一緒に楽しく学べるツール**のような何かを作ろうと思いました。

結果、まだまだ技術が足りず、まったく思い通りのプロトタイプにはなりませんでした。
ですが、日々アウトプットしていくことを大事にしているため、今回記事として発信します。


##英単語カード（完成品）
以下、**Netlifyで公開**しているURLとなります。

https://vigilant-borg-962fa7.netlify.app

###使い方
####①単語練習
英単語が読めるように練習しよう！ということで、**日本語名**・**英語スペル**を単語カード風に登録しました。
（わが子の性格上、これだけだと読めずにやる気を失ってしまいます。そこで、補助的に**読み方（カナ）も登録したのがポイント**です。）
子どもと一緒に、１つずつ読みながら練習することを想定しています。
単語は、実際の英語教室の宿題から抜粋しました。
カテゴリー別に、タブで切り替えられるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280625/2a239790-a530-438e-0696-1373522c77ab.png)




####②練習した単語の見える化
練習した単語は、**カードリストに登録**します。（ここは、親子で一緒に進めながら、私が登録していくことを想定しています）
リストに登録された単語は、見える化されるため、「10個できたね～」等と**子どもを褒めるネタ**として使います。
（モチベーションアップが狙い）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280625/e9625a84-c54e-30fe-bf13-3d403d8e3702.png)

####③ちょっとしたご褒美？
全部読めたら、このボタンを押すと、子どもが喜ぶ何かが起こるかも？！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280625/f0f934c3-0e6d-4253-b2a3-66b2511687ac.png)


##作り方　～CodePen～
まず、「CodePen」を片っ端から調べて、よさそうなPenをフォークしてみます。
※「CodePen」の使い方は、[こちらの記事](https://qiita.com/fumu238/items/f73274aa1a188eb15794)が参考になります。
今回は、単語カードとタブ・リストを使いたかったので、イメージに合いそうなPenをフォークしたうえで中身を確認し、HTML・CSS・JSを組み合わせて修正していきます。
また、今回使用したJavascriptライブラリ・CSSフレームワークは、以下のとおりです。

|分類|名称|
|:---|:---|
|JS|Vue.js|
|JS|Bootstrap|
|JS|anime.js|
|CSS|Bootstrap|
※「anime.js」は、初心者にも手軽にアニメーションが設定できるライブラリです。とにかく練習のために使ってみよう！と思い、軽く動きを入れてみました。


##やりたいけど、できなかったこと
実際に使ってみると、子どもは喜んでいましたが、使い勝手としてはイマイチでした。
以下のようなアイデアは浮かんでいましたが、なかなか実装ができず・・・。
次回に向けて技術面をレベルアップさせて、改良してみたいと思います。

 * 単語の見える化は、リストへの入力ではなく、**チェックボックス**にしたい
 * フラッシュカードのように次々とランダムで問題が出題されるような**ゲーム要素を入れたい**
 * アニメーションで単語カードを反転させ、**クイズ**ができるようにしたい

（以下、クイズ形式の試作品を作ってみました。）
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="kokano23" data-slug-hash="poeeOPO" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="テスト">
  <span>See the Pen <a href="https://codepen.io/kokano23/pen/poeeOPO">
  テスト</a> by kokano23 (<a href="https://codepen.io/kokano23">@kokano23</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


##まとめ
 * 「CodePen」はたくさんのPenが公開されていて、大変便利。
 * これをうまく使って自由自在に編集できれば、短時間でいろいろなWebアプリが作れそうです。
 ただ、私のような超初心者には、コードを解読するのに時間を取られてしまって精一杯・・・。自分で思い通りに修正するには、基本知識と読解力が必要だと感じました。
 * CSS等のデザイン面も、余白調整や挿入位置などがスムーズに修正できずに苦戦したため、勉強あるのみです。頑張っていきたいと思います。


##参考にした記事
▶[CodePenの使い方(知らない人向け)](https://qiita.com/fumu238/items/f73274aa1a188eb15794)
▶[【基本用語まとめ】「Webアプリケーション」超初心者向け（メモ）](https://qiita.com/kokano23/items/e4bc61090ad2164398cc)
【AWS】AMIとは

#プログラミング勉強日記
2021年5月23日

#AMIとは
　　AMIはOSのセッティングのことで、ソフトウェアの構成を記録したテンプレートみたいなもの。WindowsやLinuxなどの様々なOSがすでに設定されている状態でAMIとして提供されている。主に、AWS側で用意されたAMI、3rd partyが売っているAMI、自作できるカスタムIAMの3種類ある。カスタムAMIはバックアップのように再利用することができる。

#AMIとEC2インスタンス
　EC2インスタンスはAMIから起動している。OS設定を選択するためにまずはAMIを選択してEC2インスタンスを起動する。逆にAMIは既存のEC2インスタンスから作り出すことができる。EC2インスタンスの内容をAMIとしてバックアップのように取得することができる。AMIの中には既存のOSの設定情報や新しくインストールしたソフトウェア、サーバーなどの構成情報、ルートボリュームに構成されたEBSやインスタンスストアのデータが再現できる。EBSはスナップショットを使ってバックアップをとるもので、このスナップショットのデータもAMIに含まれる。
　AMIを使うことで、同じ設定のEC2インスタンスを複製することができる。同じEC2インスタンスを複数作りたい場合は、AMIを作ってこのAMIから新しい別のEC2インスタンスを起動することで簡単に複製できる。

#AMIの特徴
　AMIは基本的にリージョン内で使われる。リージョンにおいて一意のもので、他のリージョンではそのまま利用することはできない。しかし、AMIはコピー可能で、コピー先に別のリージョンを指定することができる。コピーされたAMIはそのリージョン独自の別のAMIという扱いになるが、別のAMIを使ってインスタンスを起動できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/2ec0e66e-b492-fe0c-d132-170dd1f70f87.png)
phpで円をドルに換算


【円をドル】=【換算したい円】÷【1ドル当たりの円価格】

```PHP

<?php
function convert_yen_to_dollar($yen){
  $dollar_rate = 110;
  # 戻り値を指定
  return round($yen / $dollar_rate, 2);
}
 
# 戻り値をそのまま出力
echo '10000円は' . convert_yen_to_dollar(10000) . 'ドルです<br>';

```

出力結果


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/e1e44587-8491-0eaf-8925-c0e889d2dd29.png)
raspiにスマートリモコン&メディアプレイヤーをのせてみた⑧

# はじめに
<a href="../../readme.md">こちら</a>のブラウザ側の解説です。

# 概要
### 以下の機能を提供
- ウェブサーバとwebSocketで接続してリアルタイム通信
- vueLoaderでコンパイルなしでvueコンポーネントを提供


# ファイル構成
***vue.jsなどの外部js,cssについてオフラインでも使えるようにcdnではなくlocalから取得するようにしています***

| No | ファイル名         | 概要 |
| -- | ------------------ | ---- |
| 1  | index.html         | トップページ | 
| 2  | js/index.js        | メインjs | 
| 3  | home.vue           | ルートコンポーネント。4のXXX.vueを切り替え | 
| 4  | vue/room/XXX.vue   | 部屋コンポーネント。5のYYY.vueを切り替え| 
| 5  | vue/device/YYY.vue | 家電コンポーネント。 | 
| 6  | vue/icon/ZZZ.vue   | アイコンコンポーネント。3,4,5で使われる | 


# 赤外線情報
vue/device/YYY.vue内に定義してあるdata-valueがデバイスサーバの赤外線のマップ※のキーとなっている。
※backend/device/internal/1_infrastructure/deviceapp/ir_data.go

# 部屋情報
ブラウザ側でlocal storageに各部屋の選択した機器を保存し、部屋の切り替えの際に元の機器を選択した状態にする、


# リンク
## ソースコード
<a href="https://github.com/YujiYabe/goMediaServerDemo">こちら参照</a>

## セットアップ
<a href="docs/setup.md">こちら参照</a>

## 共通設計
<a href="docs/common_structure.md">こちら参照</a>

## サーバ
以下参照   
<a href="backend/ws/docs/readme.md">ウェブサーバ</a>   
<a href="backend/file/docs/readme.md">ファイルサーバ</a>   
<a href="backend/media/docs/readme.md">メディアサーバ</a>   
<a href="backend/device/docs/readme.md">デバイスサーバ</a>
raspiにスマートリモコン&メディアプレイヤーをのせてみた⑦

# はじめに
<a href="https://qiita.com/yujiyabe/items/567a33bd30ecb10ec154">こちら</a>のデバイスサーバの解説です。

# 概要
### デバイスサーバで以下の機能を提供
- 受信した家電操作情報(エアコンの気温など)をIR送信サーバに転送
- 共有設定されている家電情報をウェブサーバに送信


# サーバ内の各層の機能概要
### infrastructure
- grpc
  - 他の機能との共通コンテンツの受信や送信
- device
  - 家電操作情報と赤外線データの関連付け
  - 赤外線データを追加・修正する場合はここのマップ変数に対して行う

### adapter
<a href="https://qiita.com/yujiyabe/items/1eb8038031129e270243">共通設計</a>参照

### useCase
<a href="https://qiita.com/yujiyabe/items/1eb8038031129e270243">共通設計</a>参照


### domain
- json.Marshal、json.Unmarshalなど標準パッケージ
- インメモリのデバイス管理情報の変更


# IR送信サーバ
http:GETリクエストで下記URLで送信する。
http://IR送信サーバ:4001/赤外線データ情報
backend/device/internal/1_infrastructure/deviceapp/deviceapp.go
パスパラメータをそのまま赤外線に変換できればIR送信サーバ側の言語はどの言語でも問題ない。  


# リンク
## ソースコード
<a href="https://github.com/YujiYabe/goMediaServerDemo">こちら参照</a>

## セットアップ
<a href="https://qiita.com/yujiyabe/items/20c567ea4362a44bf942">こちら参照</a>

## 共通設計
<a href="https://qiita.com/yujiyabe/items/1eb8038031129e270243">こちら参照</a>

## サーバ
以下参照
<a href="https://qiita.com/yujiyabe/items/34e64b9f46e06e325c8f">ウェブサーバ</a>
<a href="https://qiita.com/yujiyabe/items/94cfd174a84fdad1d9fc">ファイルサーバ</a>
<a href="https://qiita.com/yujiyabe/items/6955b61d4cf47cb653a0">メディアサーバ</a>

## ブラウザ
<a href="https://qiita.com/yujiyabe/items/743d286ee4b4657b069c">こちら参照</a>
raspiにスマートリモコン&メディアプレイヤーをのせてみた⑥

# はじめに
<a href="https://qiita.com/yujiyabe/items/567a33bd30ecb10ec154">こちら</a>のメディアサーバの解説です。

# 概要
### メディアサーバで以下の機能を提供
- ウェブサーバからのメディア操作をvlcに反映
- vlcからの再生位置をウェブサーバに転送
- ファイルサーバからのファイル管理情報をvlcに反映


# サーバ内の各層の機能概要
### infrastructure
- grpc
  - 他の機能との共通コンテンツの受信や送信
- media
  - vlcとgoのvlcラッパーで構成
  - grpcから受信したメディア操作の送信はチャンネルを使う

### adapter
<a href="https://qiita.com/yujiyabe/items/1eb8038031129e270243">共通設計</a>参照

### useCase
<a href="https://qiita.com/yujiyabe/items/1eb8038031129e270243">共通設計</a>参照

### domain
- プリミティブな型の変換
- 共通コンテンツの解析


# リンク
## ソースコード
<a href="https://github.com/YujiYabe/goMediaServerDemo">こちら参照</a>

## セットアップ
<a href="https://qiita.com/yujiyabe/items/20c567ea4362a44bf942">こちら参照</a>

## 共通設計
<a href="https://qiita.com/yujiyabe/items/1eb8038031129e270243">こちら参照</a>

## サーバ
以下参照
<a href="https://qiita.com/yujiyabe/items/34e64b9f46e06e325c8f">ウェブサーバ</a>
<a href="https://qiita.com/yujiyabe/items/94cfd174a84fdad1d9fc">ファイルサーバ</a>
<a href="https://qiita.com/yujiyabe/items/2ebf563c9ca8cd7599fd">デバイスサーバ</a>

## ブラウザ
<a href="https://qiita.com/yujiyabe/items/743d286ee4b4657b069c">こちら参照</a>
raspiにスマートリモコン&メディアプレイヤーをのせてみた⑤

# はじめに
<a href="https://qiita.com/yujiyabe/items/567a33bd30ecb10ec154">こちら</a>のファイルサーバの解説です。

# 概要
### ファイルサーバで以下の機能を提供
- ウェブサーバからのバイナリ（ビデオファイル）を受信しファイル保存
- ビデオファイル一覧をウェブサーバ・メディアサーバに送信

# サーバ内の各層の機能概要
### infrastructure
- grpc
  - 他の機能との共通コンテンツの受信や送信
  - バイナリ(wsでpostされたファイル)をstreamで受信
- file
  - 起動時にjsonファイルからファイル一覧を読み込みインメモリ化
  - インメモリで管理しているファイル一覧をjsonに保存
  - バイナリをmp4形式保存
  - mp4からanimeGIFを作成

### adapter
<a href="https://qiita.com/yujiyabe/items/1eb8038031129e270243">共通設計</a>参照

### useCase
<a href="https://qiita.com/yujiyabe/items/1eb8038031129e270243">共通設計</a>参照

### domain
- json.Marshal、json.Unmarshalなど標準パッケージ
- インメモリのファイル管理情報の変更
- 共通コンテンツの解析

# リンク
## ソースコード
<a href="https://github.com/YujiYabe/goMediaServerDemo">こちら参照</a>

## セットアップ
<a href="https://qiita.com/yujiyabe/items/20c567ea4362a44bf942">こちら参照</a>

## 共通設計
<a href="https://qiita.com/yujiyabe/items/1eb8038031129e270243">こちら参照</a>

## サーバ
以下参照
<a href="https://qiita.com/yujiyabe/items/34e64b9f46e06e325c8f">ウェブサーバ</a>
<a href="https://qiita.com/yujiyabe/items/6955b61d4cf47cb653a0">メディアサーバ</a>
<a href="https://qiita.com/yujiyabe/items/2ebf563c9ca8cd7599fd">デバイスサーバ</a>

## ブラウザ
<a href="https://qiita.com/yujiyabe/items/743d286ee4b4657b069c">こちら参照</a>
raspiにスマートリモコン&メディアプレイヤーをのせてみた④

# はじめに
<a href="https://qiita.com/yujiyabe/items/567a33bd30ecb10ec154">こちら</a>のウェブサーバの解説です。

# 概要
### ウェブサーバで以下の機能を提供
- スマホからのビデオファイルをファイルサーバに転送
- ファイルサーバからのビデオファイル一覧をスマホに転送
- スマホからのメディア操作をメディアサーバに転送
- メディアサーバからの再生位置をスマホに転送
- 家電操作情報(エアコンの気温など)をデバイスサーバに転送
- デバイスサーバからの家電操作情報(エアコンの気温など)をスマホに転送

# サーバ内の各層の機能概要
### infrastructure
- grpc
  - 他の機能との共通コンテンツの受信や送信
  - バイナリ(wsでpostされたファイル)をstreamでファイルサーバに送信
- ws
  - echoとwebSocketで構成
  - webSocketでブラウザへの送信はチャンネルを使う
  - GET:indexとPOST:fileはrestで受信、それ以外はwebSocket上で受信
  - POST:fileはinfrastructure内でバイナリ変換後controllerに渡す
- network
  - WiFiのlocalアドレスを取得

### adapter
<a href="https://qiita.com/yujiyabe/items/1eb8038031129e270243">共通設計</a>参照

### useCase
<a href="https://qiita.com/yujiyabe/items/1eb8038031129e270243">共通設計</a>参照

### domain
- webSocketで受け取ったデータを元に宛先サーバの判別
    - ファイルサーバ
    - メディアサーバ
    - デバイスサーバ

# リンク
## ソースコード
<a href="https://github.com/YujiYabe/goMediaServerDemo">こちら参照</a>

## セットアップ
<a href="https://qiita.com/yujiyabe/items/20c567ea4362a44bf942">こちら参照</a>

## 共通設計
<a href="https://qiita.com/yujiyabe/items/1eb8038031129e270243">こちら参照</a>

## サーバ
以下参照
<a href="https://qiita.com/yujiyabe/items/94cfd174a84fdad1d9fc">ファイルサーバ</a>
<a href="https://qiita.com/yujiyabe/items/6955b61d4cf47cb653a0">メディアサーバ</a>
<a href="https://qiita.com/yujiyabe/items/2ebf563c9ca8cd7599fd">デバイスサーバ</a>

## ブラウザ
<a href="https://qiita.com/yujiyabe/items/743d286ee4b4657b069c">こちら参照</a>
raspiにスマートリモコン&メディアプレイヤーをのせてみた③

# はじめに
<a href="https://qiita.com/yujiyabe/items/567a33bd30ecb10ec154">こちら</a>の共通設計の解説です。


# 概要
ウェブサーバ上で以下4つの機能を独立してgrpcで通信しているが、一定のルールを設けて内部設計を同じにしている。   
また、共通の型、共通の処理は別パッケージに抜き出してそれぞれが参照できるようにシンボリックリンクで共通利用できるように設計
- ウェブサーバ
- ファイルサーバ
- メディアサーバ
- デバイスサーバ

# ディレクトリ設計
大枠の設計に<a href="https://github.com/golang-standards/project-layout/blob/master/README_ja.md">Standard Go Project Layout</a>を適用
internal内のディレクトリ設計に<a href="https://blog.tai2.net/the_clean_architecture.html">clean Architecture</a>を適用

# internal設計
- プログラムの煩雑化を抑えるために以下ルールを適用
  - エラーの発生する処理はinfrastructureとdomainにしか書かない。


|infrastructure|adapter|useCase|domain|
|--------------|-------|-------|------|
| ①※1        |       |       |      |
|              | ②    |       |      |
| ⑦※2        |       | ③    | ④※1|
|              | ⑤    |       |      |
| ⑥※1        |       |       |      |

※1 エラーの起点箇所(ここ以外は呼び出ししかしないのでエラーの起点とはならない)
※2 ⑥から①へのチャネルを介したデータ送信

### infrastructure
- infrastructure依存の型を使用できる
- WAFのコンテキストやパラメータ、アップロードファイル、データベースの構造体に合わせた型などはここでしか使用できない。


### ① 外部からの受付処理やデーモンなど(grpc,webSocket,vlc)
- エラーの発生起点
- 一つ以上のcontrollerを扱う
- infrastructure依存の型や処理をフィルタ※してcontrollerに渡す   
※httpリクエスト構造体からdomain構造体への変換など
- バリデーションなどもここで。


### ② infrastructureから受け取った処理をuseCaseに渡す
- useCaseを組み合わせてresponseを返却する
- 実際の処理は書かずにuseCaseの呼び出ししかしない
- infrastructureで受け取った引数で処理分岐が必要になる場合はここで実施する


### ③ controllerから受け取った処理をdomainかserviceに渡す
- serviceとdomainを組み合わせてresponseを返却する
- 実際の処理は書かずにserviceとdomainの呼び出ししかしない
- 複数のservice(grpcとvlc等)の処理をまぜることが可能
- serviceから取得したデータの加工の必要であればdomainで実施する
- 処理単位はなるべく細かくする   
- 引数による内部で処理分岐はできない   


### ④ useCaseから呼び出させるdomainデータ型とデータの処理
- エラーの発生起点
- domainで扱うべきデータ型とその振る舞いについて実施
- JSONMarshalやJSONUnmarshalなどエラーが発生する標準関数もここで実施


### ⑤ useCaseから呼び出されinfrastructureに渡す処理
- 複数の同一のinfrastructureを含めることが可能(grpcとwebSocketなど他のinfrastructureの処理をまぜることはできない)
- infrastructureの結果によって同じinfrastructureの問い合わせは可能(副問合せなどでできない処理など)※   
  ※外部引数による処理分岐はできるが推奨されない。infrastructureno
  結果によって処理分岐は可能
- 取得したデータの加工はせずにそのまま返す


### ⑥ infrastructureの処理
- 基本的に1処理しかしない
- エラーの発生起点
- infrastructure依存の処理(sqlテーブル構造体からdomain構造体への相互変換など)
- 取得したデータの加工を行うことはできる(idのみ取り出しなど)
- デーモン(webSocket本体やvlc本体)に対しての処理はここからチャンネルを使って送信する


### ⑦ 内部通信
- 以下の処理でチャネルを使って情報をメインプロセスに送信している
  - ウェブサーバ・・grpcで受信した情報をブラウザに送信するため、コントローラ→ユースケース→サービスを介してインフラストラクチャのチャネルにデータを送信。
  - メディアサーバ・・grpcで受信した情報をvlcに送信するため、コントローラ→ユースケース→サービスを介してインフラストラクチャのチャネルにデータを送信。
  
  
# リンク

## ソースコード
<a href="https://github.com/YujiYabe/goMediaServerDemo">こちら参照</a>

## セットアップ
<a href="https://qiita.com/yujiyabe/items/20c567ea4362a44bf942">こちら参照</a>

## サーバ
以下参照
<a href="https://qiita.com/yujiyabe/items/34e64b9f46e06e325c8f">ウェブサーバ</a>
<a href="https://qiita.com/yujiyabe/items/94cfd174a84fdad1d9fc">ファイルサーバ</a>
<a href="https://qiita.com/yujiyabe/items/6955b61d4cf47cb653a0">メディアサーバ</a>
<a href="https://qiita.com/yujiyabe/items/2ebf563c9ca8cd7599fd">デバイスサーバ</a>


## ブラウザ
<a href="https://qiita.com/yujiyabe/items/743d286ee4b4657b069c">こちら参照</a>
【firebse-admin】Google Cloud Storageをpythonで扱う


pythonでcloudStorageを扱う方法について解説していきます。

## firebase-adminの認証からバケット作成まで
#### パッケージ読み込み
``` python
import firebase_admin
from firebase_admin import credentials
from firebase_admin import storage
```
#### firebase-appの作成
``` python
# サービスアカウント用の秘密鍵ファイル
# 環境変数で指定している場合は環境変数を指定↓
credFilePath = "./secrets/credfile.json"
cred = credentials.Certificate(credFilePath)
default_app = firebase_admin.initialize_app(cred)
```
サービスアカウント用の秘密鍵ファイルの取得はこちら
https://firebase.google.com/docs/admin/setup?hl=ja#initialize-sdk

#### bucketの取得・Cloud Storageのパスの指定
``` python
# "example.appspot.com":bucketのurl
# default_app:firebase_admin.initialize_appで作成したapp
bucket = storage.bucket("example.appspot.com", default_app)
blob = bucket.blob("data/data.json")
```
bucketはファイルを格納するコンテナ・blobは格納されるファイルのことです。

bucketのurlの確認方法は、
- Firebase管理画面で、Storageページに移動
- ファイル一覧が表示されているヘッダー部分に記載されています。(gs://と書いてある箇所)

## blobの操作
公式リファレンスはこちら
https://googleapis.dev/python/storage/latest/blobs.html
良く使うものだけまとめます。

#### 削除
Cloud Strageからファイルを削除

```python
blob.delete()
```

#### ダウンロード
Cloud Strageからファイルをダウンロード

```python
# バイト
bytes_data = blob.download_as_bytes()

# テキスト
text_data = blob.download_as_text()

# ファイル(返り値無し・引数にファイルオブジェクトを指定するとダウンロードされます。)
blob.download_to_file(file_obj)

# ファイルパス(引数にファイルパスを指定)
blob.download_to_filename(filename)
```

#### アップロード
Cloud Strageにファイルをアップロード

```python
# 引数に文字列を指定
blob.upload_from_string(data)

# 引数にファイルオブジェクトを指定
blob.upload_from_file(file_obj)

# 引数にファイルパスを指定
blob.upload_from_filename(filename)
```

## 参考
[公式リファレンス](https://googleapis.dev/python/storage/latest/index.html)
アソシエーションの順番あり

Aテーブル
Bテーブル
C中間テーブルを作りました

````rb:Aテーブル
class A < ApplicationRecord
  has_many :Cテーブル
  has_many :Bテーブル, through: :Cテーブル
  
  validates :name, uniqueness: true
end
```

````rb:Bテーブル
class B < ApplicationRecord
  has_many :Aテーブル, through: :Cテーブル
  has_many :Cテーブル
end
```

Bのテーブルで問題発生しています
![20210523-212324.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/815fb5a4-04b9-b810-06de-0581f35fbc56.png)


雰囲気の訳）先にCテーブルとのアソシエーションを書いて、次に中間テーブルを設定しないと順番が変なのでCテーブルを通してAテーブルとなんていう記述はできませんといっています。

````rb:（修正）Bテーブル
class B < ApplicationRecord
  has_many :Cテーブル
  has_many :Aテーブル, through: :Cテーブル

end
```
axiosでGET,POST


# axiosでGET，POST

## For Node.js

```javascript
const axios = require('axios');
```

## GET

```javascript
const config = { 'Accept': 'application/json' };
axios.get('https://httpbin.org/get', config)
  .then((response) => {
    console.log(response);
    // Do something with response
  })
  .catch((error) => {
    console.log(error);
    // Do something with error
  })
```

## POST

```javascript
const data = { user: 'john', pass: 'shiba' };
// if you want to set headers 
const headers = { 'Content-Type': 'application/json' };
axios.post('https://httpbin.org/post', data, { headers: headers })
  .then((response) => {
    console.log(response);
    // Do something with response
  })
  .catch((error) => {
    console.log(error);
    // Do something with error
  })
```

## appendix


https://httpbin.org って便利〜

https://qiita.com/sameyasu/items/adacceb8a1bee893599b
【Rails】ER図の作成

# 目的
Railsで作成したアプリ内にER図を作成する。

# 開発環境
macOS: *Big Sur*
Rubyバージョン: *2.6.5*
Railsバージョン: *6.0.0*

# 前提
- アプリが作成されている。
- アプリ名は`test-app`とする。

# 手順

1. [前置き](#前置き)
1. [ツールのインストール](#ツールのインストール)
1. [ER図の作成](#er図の作成)

# 前置き

ER図の作成ですが、ツールを用いるとスムーズに作成することができます。
今回はVSCodeの拡張機能` Draw.io Integration `を使用していきます！

# ツールのインストール

VSCodeの拡張機能で` Draw.io Integration` と検索し、インストールしてください！

# ER図の作成

`test-app`を開き、拡張子を`「.dio」`にして新規ファイルを作成します。

あとは使用するテーブル図をドラック＆ドロップで設置するのみなので簡単です！

# 最後に

以上でER図作成ができました。
ちなみに作成した図は[File]→[Export as]→（任意の拡張子）の順で選択することで簡単にエクスポートすることが可能です。
では。
JavaでFizzBuzzを作ってみた

こんにちは。Javaを学習し始めたので早速FizzBuzzを作ってみました。
ちなみに私はRubyを学習していました。

```java
public class FizzBuzz {
	public static void main(String[] args) {
		for(int i = 1; i < 50;i++) {
			if((i % 3 == 0)&&(i % 5 == 0)) {
				System.out.println("FizzBuzz");
			}else if(i % 3 == 0) {
				System.out.println("Buzz");
			}else if(i % 5 == 0) {
				System.out.println("Fizz");
			}else {
				System.out.println(i);
			}
		}
	}
}
```

結果
![515d8694a15a377205a3c2455cdc4fd9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1432849/f764c59d-b2b8-67e7-aff0-47cfc868862f.png)

ちなみに標準入力を使った例

```java
import java.util.Scanner;
public class FizzBuzz2 {
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		double sum;
		Scanner stdIn = new Scanner(System.in);
		System.out.println("好きな数字を入力してください");
		sum = stdIn.nextDouble();
			if((sum % 3 == 0)&&(sum % 5 == 0)) {
				System.out.println("FizzBuzz");
			}else if(sum % 3 == 0) {
				System.out.println("Buzz");
			}else if(sum % 5 == 0) {
				System.out.println("Fizz");
			}else {
				System.out.println(sum);
		}
	}
}
```

１行目のimport java.util.Scanner;をインポートする
６行目にクラスのインスタンスに生成する
で、引数はSystem.inという標準入力示している
９行目に入力した数値を変数sumに代入する

以上です。
JavaってRubyと比べて難しいね
【routing】collectionとmember

collectionとmember
-
collectionとmemberは、ルーティングを設定する際に使用できます。
これを使用すると、生成されるルーティングのURLと実行されるコントローラーを任意にカスタマイズできます。

|collection|ルーティングに:idがつかない|１つのidに特定|
|--|--|--|
|member|ルーティングにidがつく|不特定|


```rb:【例】collectionで定義した場合
Rails.application.routes.draw do
  resources :tweets do
    collection do
      get 'search'
    end
  end
end
```

```rb:【例】collectionのルーティング
Prefix           Verb    URI                                 Pattern
search_tweets    GET    /tweets/search(.:format)              tweets#search
```

ルーティングに:idが付いていないことがわかります。

```rb:【例】memberで定義した場合
Rails.application.routes.draw do
  resources :tweets do
    member do
      get 'search'
    end
  end
end
```

```rb:【例】memberのルーティング
Prefix           Verb    URI                                 Pattern
search_tweet      GET    /tweets/:id/search(.:format)       tweets#search
```

URLの指定先が、collectionは:idなし、memberが:idありとなっていることが確認できます。
JavaScript 文字列から数値に変換するときのあれこれ

# はじめに
仕事中に発狂したので記事を書きます。

#文字列から数値に変換
JavaScriptを使用したことがある方なら、一度は文字列から数値に変換したことがあると思います。変換する際に、 `Number()` 、 `parseInt()` 、 `parseFloat()` のどれかを使用すると思いますが、その際に安易に `Number()` を選んでいませんか。私は迷わず `Number()` を選んでいました。そのせいで意図しない挙動が起きました。
以下のコードを見れば皆さんも発狂すると思います。

```js
console.log(Number('')) // 0
console.log(parseInt('')) // NaN
console.log(parseFloat('')) // NaN
```

「なぜ `NaN` を返してくれないんだ」、「そもそも、なぜ統一していないんだ」と思ったのではないでしょうか。
しかし、心優しきエンジニアの皆さんは、このくらいでは発狂しないと思いますので、他の場合も見てみましょう。

```js
console.log(Number(null)) // 0
console.log(parseInt(null)) // NaN
console.log(parseFloat(null)) // NaN

console.log(Number(undefined)) // NaN
console.log(parseInt(undefined)) // NaN
console.log(parseFloat(undefined)) // NaN

console.log(Number('Infinity')) // Infinity
console.log(parseInt('Infinity')) // NaN
console.log(parseFloat('Infinity')) // Infinity
// ちなみに 'Infinity' ではなく Infinity の場合でも結果は同じです。
```

**「くぁwせdrftgyふじこlp」**

# おわりに
しっかり使い分けましょう。
[Ruby]クラスについて

#はじめに
Rubyのクラスについて改めて理解を深めるために、こちらの記事でまとめます。

#クラスとインスタンス

Rubyではデータの元となる設計図を作り、その設計図を元に実体となるデータを作ります。
その設計図のことをクラスといい、データをインスタンスといいます。

このクラスは親子関係を作ることができ、既存のクラスの情報を元に新しいクラスを作れます。
いわゆる「クラスの継承」です

#クラスの継承

クラスの継承とは既存のクラスを元に新しいクラスを作ることです。
このとき、新しいクラスを子クラスまたはサブクラス、元になったクラスを親クラスまたはスーパークラスと呼びます。

このクラスの継承という概念があることで、共通部分がまとめられるため非常に便利になります。
例えば、新幹線、地下鉄、汽車のクラスを作成するならば、3つに共通する情報をまとめた電車クラスを作成し、その電車クラスを継承したクラスを作成したほうが効率的なわけです。

各クラスは、電車クラスをもとに各々の機能を付け加えていけばいいわけです。
例えば、電車に共通する走る、止まるといった機能に加えて、新幹線では車内販売、地下鉄では吊り革、汽車では汽笛といったように機能を付け加えます。

#クラスの継承の実装

今回は車とパトカーの関係を例に実装を行います。
まずは以下をみます。

```sample.rb
class Car　#共通部分
 def initialize(car_type, capacity)
   @name = car_type
   @capacity = capacity
 end

 def info
   puts "車種：#{@name}　乗車定員：#{@capacity}人"
 end

end

class PoliceCar < Car　#Carクラスの共通部分を継承した上でのパトカークラス

 def siren
   puts "ウゥ〜ウゥ〜"
 end

end

police_car = PoliceCar.new("パトカー", 5)

police_car.siren
```

あるクラスを継承して新しいクラスを作る場合には以下のように「新しいクラス < 元となるクラス」と書きます。上の例では、PoliceCarクラスがCarクラスを継承しています。

クラスを継承すると、親クラスから子クラスへは
①親のインスタンス変数
②親のインスタンスメソッド
が継承されます。

また、子クラスでは、継承と付け加え意外に、オーバーライドすることができます。
オーバーライドとは、親クラスのメソッドを子クラスに同名のメソッドを定義することによって上書きすることを指します。

下記の例では、CarクラスとPoliceCarクラスそれぞれでinfoメソッドを持っています。本来、PoliceCarクラスでは親クラスのCarクラスが持つinfoメソッドを継承しますが、オーバーライドした場合は、PoliceCarクラスのinfoメソッドとして機能します。

```sample2.rb
class Car
 def initialize(car_type, capacity)
   @name = car_type
   @capacity = capacity
 end

 def info
   puts "車種：#{@name}　乗車定員：#{@capacity}人"
 end

end

class PoliceCar < Car

 def info
   puts "車種：#{@name}　乗車定員：#{@capacity}人　パトロール時間：24時間"
 end

 def siren
   puts "ウゥ〜ウゥ〜"
 end

end

police_car = PoliceCar.new("パトカー", 5)

police_car.info　#これは、あくまでPoliceCarクラスのinfoメソッドとして振る舞う
```

#おわりに
以上、Rubyのクラスについてです。
こうした基礎的な部分についてもしっかり振り返っていきたいと思います。
【Rails】iQueryの導入

# 目的
Railsで作成したアプリに`jQuery`を導入する。

# 開発環境
macOS: *Big Sur*
Rubyバージョン: *2.6.5*
Railsバージョン: *6.0.0*

# 前提
- アプリが作成されている。
- アプリ名は`test-app`とする。

# 手順

1. [前置き](#前置き)
1. [jQueryのインストール](#jqueryのインストール)
1. [Webpackの設定](#webpackの設定)
1. [application.jsの設定](#applicationjsの設定)
1. [テスト用ファイルの作成](#テスト用ファイルの作成)
1. [ファイルの読み込み](#ファイルの読み込み)
1. [最終確認](#最終確認)

# 前置き

Rails６から標準装備されている`Webpacker`を利用することでGem無しでインストール可能です。

# jQueryのインストール

それでは早速始めていきます！
まず`jQuery`をインストールしましょう！

```:ターミナル
% yarn add jquery
```

# Webpackの設定

次に`Webpack`の設定を変更します。
下記のコードを追記しましょう！

```javascript:config/webpack/environment.js
const { environment } = require('@rails/webpacker')
// 以下追記
const webpack = require('webpack')
environment.plugins.prepend('Provide',
    new webpack.ProvidePlugin({
        $: 'jquery/src/jquery',
        jQuery: 'jquery/src/jquery'
    })
)
// ここまで
module.exports = environment
```

# application.jsの設定

続いて`application.js`の設定です！

```javascript:javascript/packs/application.js
//省略

require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")

require('jquery')

//省略
```

これで`jQuery`が導入できました！
確実に導入できているか、確認も行っていきましょう！

# テスト用ファイルの作成

それでは、実際にテストを行ってみます！
`test.js`ファイルを作成し、以下のように記述してください！

```javascript:app/javascript/test.js
$(function() {
  console.log("test");
});
```

# ファイルの読み込み

先程作成したファイルを読み込むための記述をします！

```javascript:app/javascript/packs/application.js
//省略
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")

require("jquery")
require("test.js")
//省略
```

# 最終確認

アプリを立ち上げて、コンソールに`test`の文字が表示されていれば成功です！

# 最後に

以上で`jQuery`の導入が完了しました。
手軽に導入できるので、ぜひ試してみてください。
では。
php】phpでコイントス問題を解け

１・変数 $count で指定した回数だけコイントスを行い、「コイン投げの回数: [$countの値] 回」を出力
２・表が出たら「H」（表を表す Head の略です。）、裏が出たら「T」（裏を表す Tail の略です。）を出力する
３・Hの文字は赤色、Tの文字は青色で出力する
４・コイントス終了後に表が出た回数を裏が出た回数を出力する
５・乱数を取得する関数mt_randを利用する。
６．表が出たらH、裏が出たらTを配列に追加し、またそれぞれのカウントを追加。
７・出力時には「<span class="coin_[H or T]">[H or T]</span>」の形式で出力せよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/52929a4a-a07a-acdf-be43-bd03e9c93eb3.png)


```PHP

<!DOCTYPE html>
<html lang="ja">
<head>
    <title>コイントス</title>
    <!-- レイアウト画像の通り、表に枠線を追加する -->
    <style>
      .coin_h {
        color: #FF0000;
      }
      .coin_t {
        color: #0000FF
      }
    </style>
</head>
<body>
  <h1>コイントス</h1>
<?php
$i = 0;
$h = 0;
$t = 0;
$count = 100;
echo "コイン投げの回数：".$count ."回". '<br>';


while ($i < $count){

  $rand = mt_rand(1, 2);

  if($rand % 2 === 0){
   ?> 
  <span class="coin_h">H</span>   <?php 
    $h++;

  }else{ ?>
    <span class="coin_t">T</span>   <?php 
      $t++;

  }
  
  $i++;
}
echo "<br>";
echo "表が出た回数：".$h ."回". '<br>';
echo "裏が出た回数：".$t ."回". '<br>';

?>

</body>
</html>

```
Rspecテストでredirect_backの挙動をテストする

Rspecテストでredirect_back(fallback_location: root_path)のコードのRspecでのテスト方法で躓いてしまったので、解決法をシェアしたいと思います。


前提条件としてUserとWalkcourseが１対多の関係を持っている状態となっており、Walkcourse Controllerのdestoryアクションで、walkcourseを削除した場合、リファラー(直前のページ）にリダイレクトするという挙動になるよう規定しています。

```
def destroy
   @walkcourse = Walkcourse.find(params[:id])
   @walkcourse.destroy
   flash[:success] = 'メッセージを削除しました。'
   redirect_back(fallback_location: root_path)
end
```

以下にはRspecテストの該当部分に関して記述しています。
loginuserがwalkcourseを削除した場合の挙動に関するテストで、before以下にリファラーについての情報を書き、redirect_to以下に指定していたリファラーについての情報を書けばそのままテストは成功しました。


```
describe '#destroy' do
    context 'loginuserの場合' do
      before :each do
        sign_in user
        request.env["HTTP_REFERER"] = "where_i_came_from"
      end
      it '正常に削除できること' do
        expect{walkcourse.destroy}.to change(Walkcourse, :count).by(-1)
      end
      it '削除した後、リファラーページもしくはルートページにリダイレクトすること' do
        delete :destroy, params: {id: walkcourse.id}
        expect(response).to redirect_to "where_i_came_from"
      end
    end
end
```

参考ページ：https://stackoverflow.com/questions/6040479/rspec-testing-redirect-to-back/6729817#6729817
https://myzk.dev/rspec-referee/
【php】phpでfizzbuzzを解け

```php
<h1>fizzbuzz</h1>

<?php
$i =0;
while ($i <= 100){
  $i++;
  if ($i % 3 === 0 && $i % 5 === 0){
     echo "FizzBuzz". '<br>';
  }elseif($i % 3 === 0){
    echo "Fizz". '<br>';
  }elseif($i % 5 === 0){
    echo "Buzz". '<br>';
  }
}

?>
```

上級者用

```php

<?php
function get_fizzbuzz($number){
  if($number % 15 === 0){
    return 'FizzBuzz!';
  }
  if($number % 3 === 0) {
    return 'Fizz!';
  }
  if($number % 5 === 0) {
    return 'Buzz!';
  }
  return $number;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <title>FizzBuzz</title>
</head>
<body>
    <h1>FizzBuzz</h1>
    <table>
        <?php for($i = 1; $i <= 100; $i++){ ?>
            <?php echo get_fizzbuzz($i); ?><br>
        <?php } ?>
    </table>
</body>
</html>
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/4c078431-29f5-5f33-536c-cb6732636187.png)
AWS Lambdaの環境変数の4KB制限について

## 公式の表記
[AWS Lambda 環境変数の使用](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html)
`すべての環境変数の合計サイズは 4 KB を超えない。`

## 1つの環境変数の場合
- キーは最低2文字なので2文字にした
    - 値4087文字OK、4088文字NG
- 値4087文字のまま、キーを2文字 → 3文字にする → NG
    - どうやらキーと値の文字数の合計による制限のようだ(合計で半角4089文字まで)
- ちなみにキーは2文字以上ですが、何文字まで使えるか知ってますか？
    - キー4088文字、値1文字はOK！
    - キー4089文字、値1文字はやはりNG
- 値って全角文字使えるの？
    - 使えます
- 値って空欄にできるの？
    - できます（YES）
- 値が空欄ならキーは4089文字まで行ける？
    - 行けます（YES）
- キーに使えるのは「文字で始まり、文字、数字、アンダースコアが続く」文字列のみ
    - キーは全角文字はNGです
- 日本語は何文字分？
    - 「あ」で試したところ、**半角文字3文字分**のようだ

## 環境変数が2つの場合
- 上記「環境変数1つの場合」に、キー2文字と値1文字の環境変数を追加し、1つ目の環境変数のキーを3文字削ったが4KB制限に引っかかった
- さらに6文字削ったらOKになった
- 3つ目を追加したときも、合計9文字削ったらキー2文字と値1文字の環境変数の追加が出来た

## 結論
- AWS Lambdaの環境変数の4KB制限は、4KiB制限(4000バイト)ではなく4KB制限(4096バイト)のようだ
- 環境変数1つにつき6バイトを消費するようだ(最初の1つは7バイト？）
【Laravel】【備忘録】php artisan make:migration でよく考えずにオプションつけたら詰まった話

Laravelでテーブル作ろうとしたら詰まった話をメモ書き程度で書いています。

#使用環境

Laravel 6.×系
Mysql

#テーブルを作ろうとしたら・・・
Laravel上でテーブルを作るのが久しぶりで、某Qiitaの記事を則りそのままでベタ打ちしました。


```php:ターミナル
php artisan make:migration create_テーブル名_table --table=テーブル名
```

生成されたmigrationファイルを編集してmigrateをしました

```php:ターミナル
php artisan migrate

 Illuminate\Database\QueryException  : SQLSTATE[42S02]: Base table or view not found: 1146 Table 'テーブル名' doesn't exist (SQL: alter table `テーブル名` add `id` bigint unsigned not null auto_increment primary key, add `title` varchar(50) not null, add `body` text not null, add `tag` varchar(50) not null, add `image` varchar(255) not null, add `created_at` timestamp null, add `updated_at` timestamp null)

  at /work/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673| 

  Exception trace:

  1   PDOException::("SQLSTATE[42S02]: Base table or view not found: 1146 Table 'テーブル名' doesn't exist")
      /work/vendor/laravel/framework/src/Illuminate/Database/Connection.php:463

  2   PDOStatement::execute()
      /work/vendor/laravel/framework/src/Illuminate/Database/Connection.php:463

  Please use the argument -v to see more details.
```

####????

何か間違えたのかと思い、class名なども変えてもう一度実行してみてもこのエラーのまま。

原因がわからないまま、デフォルトで入っているものを比較してみたところ...

```php:2014_10_12_000000_create_users_table.php
Schema::create('users', function (Blueprint $table){
...
}
```
```php:生成したmigrationファイル
Schema::table('テーブル名', function (Blueprint $table) {
...
}
```
####なるほど。。。
php atrtisan make:migration で何も考えずに　オプション（--table)をつけたことにより
既存のテーブルの編集用のファイルとなっていたようです。

まだまだ勉強が足りないようです。