OmniAICreator/Qiita-1.07M huggingface dataset:
Migration後の[NameError: uninitialized constant Xxxx]、[block in load_missing_constant]について

# 問題

`User`および `Cup`というモデルを作成し、`rails db:migrate`実行後、
`rails c`で実際にモデルができたか確かめたところ、

```ruby:User
[1] pry(main)> User
=> User (call 'User.connection' to establish a connection)
```

`User`はできた。しかし

```ruby:
[2] pry(main)> Cup
NameError: uninitialized constant Cup
from Users/owner/dev/cofapp/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.4.1/lib/bootsnap/
load_path_cache/core_ext/active_support.rb:76:in `block in load_missing_constant'
```

`Cup`ができない…！


# 原因

試しに`Article`というモデルのマイグレーションファイルを作成した。

```ruby:
# rails g model Article title:string
Running via Spring preloader in process 11065
      invoke  active_record
      create    db/migrate/20190328010859_create_articles.rb
      create    app/models/article.rb
      invoke    rspec
      create      spec/models/article_spec.rb
      invoke      factory_bot
      create        spec/factories/articles.rb
```

ここで気づく。

<b>もしかして`models/cup.rb`がない？</b>

<br>

一応この状態で`rails c`して`Article`を呼ぶと

```ruby:
[1] pry(main)> Article
=> Article (call 'Article.connection' to establish a connection)
```

となり、うまく呼べた。

そして`models/cup.rb`を確認しにいくと、<b>案の定なかった</b>。


# 実は

`migration`ファイル作成用のブランチ`migration01`を切って
`User`と`Cup`以外にも`migration`ファイル作成→コミット・プッシュを繰り返してたんですが、
コミットが乱雑になってしまったので、<b>新しいブランチ`migration02`を切って、
そこに`migration01`の`migration`ファイル「だけ」を全コピしていたのでした。</b>

`migration`ファイルだけコピーしたので、
`migration`時に作成されたはずの`models/cup.rb`が存在せず、
読み込めなかったため、エラーが出てしまったと。

<br>
深く反省いたします。。（＾ー；）
[Ruby]ハッシュについて

# ハッシュとは

ハッシュとは複数にデータを一つの変数にまとめす事ができるオブジェクトです。
配列も複数のデータをまとめる事ができましたね。
配列についてわからない方は[こちら](https://qiita.com/yuichir43705457/items/7f2b6767376750a87209)をご覧ください。

それでは、配列とは何が違うのか、ハッシュはデータに対して順番を持っているのに対し、
ハッシュの一番大きな特徴は、ハッシュは**キーとそれに対応する値（バリュー）を持っている**という事です。
例えば私の名前はゆーいちですがこの場合名前というキーに対応してゆーいちというバリューがあると言い換える事ができます。

## ハッシュの定義
それではハッシュを定義していきます。

```ハッシュ.rb
yuichi = {}
```

これでハッシュを定義する事ができました。定義の際は**{}**の中に情報を入れていきます。ただし今はまだ情報が何も入っていない状態です。
ここに私の情報を入れていきたいと思います。

```ハッシュ.rb
#パターン１
yuichi = {name: "ゆーいち", age: 23, job: "エンジニア"}

#パターン２
yuichi = {"name" => "ゆーいち", "age" => 23, "job" => "エンジニア"}
```

これで情報を入れる事ができました。先ほども言ったようにハッシュは**キー**と**バリュー**を持っています。
どちらのパターンもnameというキーに"ゆーいち"という文字列がバリューとして対応しています。

今回パターンを二つ紹介しましたが、パターン２のようにキーを文字列にしハッシュロケットを使って値を書くこともできますが、私はパターン１で書くことをお勧めします。パターン１のように「:」を用いるものをシンボル型といいます。
メリットは**コードの記述量が少なくなる**他、ハッシュロケットを使うよりも**処理が早くなる**のでシンボル型を使う事が推奨されています。

## 値の取得
次に値の取得方法について説明していきます。

```ハッシュ.rb

yuichi = {name: "ゆーいち", age: 23, job: "エンジニア"}
yuichi[:name]
#=>"ゆーいち"

```
これでハッシュの中から一つの値を取り出す事ができました。
値を取り出すときは**ハッシュ名[:キー]**と指定する事で取り出す事ができます。

## キーの取得
キーだけを取得したい場合は**keysメソッド**を使います。
keysメソッドはハッシュの中のキーだけを配列で返します。

```ハッシュ.rb

yuichi = {name: "ゆーいち", age: 23, job: "エンジニア"}
yuichi.keys
#=>["name", "age", "job"]

```
配列で返すのでその中から欲しい値だけを取り出す場合は番号を指定してあげる必要がありますね。

## 値の追加

値を追加、上書きをしていきます。

```ハッシュ.rb

yuichi = {name: "ゆーいち", age: 23, job: "エンジニア"}
#値の追加
yuichi[:place] = "東京"

#値の上書き
yuichi[:age] = 25

```

これで追加する事ができました。
値を追加するときも上書きするときも定義の仕方は一緒ですね。
すでにキーを持っている場合は上書きされ、キーがない場合は新しいキーとバリューが追加されます。

## 最後に
今回はハッシュに関する基本的なことを説明していきました。
今回は私の情報だけをハッシュに入れていきましたが、ほかの人の情報も別のハッシュに入れていくとハッシュがいっぱいになってしましますよね、そう言ったときにその個人の情報をもつ複数のハッシュを配列に入れる事により、管理することもできます。

最後まで読んでいただきありがとうございました。
xargsのコマンドライン文字列って何？

# 特定ファイルに対してコマンドの効果を付与したい
権限付与するとか、グループ追加とか、1個1個ファイルやディレクトリにコマンド打ってらんないですよね。農家じゃないんだから。『1個1個丁寧にファイルに権限を付与しました』とか言って、『我々が作りました』的な写真を載せて納品したって別に顧客信頼度上昇とか特にないですから。むしろ、絶対抜けてる可能性あって怖いよってなります。

# xargsコマンド
>  標準入力やファイルからリストを読み込み、コマンドライン文字列を作成して実行する

というコマンドです。

**コマンドライン文字列ってなんだよ。**

簡単にいうと、コマンドラインで使える文字列、つまり、引数として使える文字列ということ。
**受け取った結果の文字列をxargsの引数になっているコマンドの引き数に渡し実行する**ということ。

便利ですね。

## 使用例
こちらは、findでカレントディレクトリ以降のファイルだけに対してオーナー、グループ、アナザーの実行権限を剥奪させるコマンドです。パイプ | を使ってこんな感じにやれるとすごい楽ですね。他にも、findコマンドと組み合わせて、ヒットする文字列に対してgrepかけるという方法で調べたいファイルの中身やファイルを調べることができます。

```
$ find ./ -type f | sudo xargs chmod a-x

$ find ./ -type f | xargs grep 検索したい文字列
```
GitHubメモ

掛け値なしに自分のためだけのメモです。
OSはWindows10を想定。

#ローカル
1. Gitのインストール ⇒ 「git --version」でチェック
2. プロジェクトフォルダのルートで「git init」⇒ローカルレポジトリを作成（.gitディレクトリが作成される。隠しフォルダ）
3. 「git status」で各ファイルの状態を確認できる
※ Untracked / Unstaged / Staged / Commit
4. プロジェクトフォルダのルートに「.gitignore」ファイルを作成する⇒ignoreするファイルを書き込む(最低でもnode_modulesはignore)
5. 「git add filename」or「git add .」で Staged状態にする
6. 「git commit -m “好きなメッセージ”」でCommitする
7.  Staged状態のファイルを更新したらUnstaged状態になるので、「git add」⇒「git commit」でCommitする
8. 「git log」でコミットの履歴が確認できる

※ Unstagedでmodified状態なファイルだけをコミットしたい場合はgit add を実行せずに、「git commit -am “メッセージ”」でコミットできる。

#Github
1.	GitHubのアカウントを作成
2.	GitBashで「ls -a ~/.ssh」を実行 ⇒ SSHキーの確認 (「~/」 ⇒ usersファイル)
※参考： https://help.github.com/en/articles/connecting-to-github-with-ssh 
3.	SSHキーが（フォルダすら）ない場合は以下のコマンドを実行

3-2.  「ssh-keygen -t rsa -b 4096 -C “自分のメールアドレス”」でSSHキーペアを作成 
⇒ プロンプトは全部デフォルトにする
※ -t：キーのタイプ、-b：キーのサイズ（大きい方がクラックされにくい）

4 「eval “$(ssh-agent -s)”」でSSHエージェントが稼働しているか確認
5. 「ssh-add ~/.ssh/id_rsa」で鍵を登録
6. 「clip < ~/.ssh/id_rsa.pub」でSSHキーをクリップボードにコピーする
※ OSによってコマンドが異なるので、以下のURLを参照する
　 https://help.github.com/en/articles/adding-a-new-ssh-key-to-your-github-account
7.	GitHubのSettingページから「SSH and GPG keys」ページに飛び、「New SSH key」ボタンを押して、TitleとKeyにそれぞれ、OSの名前（Windows10）とコピーしたSSHkeyを入力する。
⇒ 「Add SSH key」ボタンを押してSSHキーを登録
8.	「ssh -T git@github.com」でSSH接続を試す
⇒ Hi xxx! You've successfully... みたいなレスポンスが返ってくる
9.	レポジトリページからSSH用のコマンドをコピーして、プロジェクトフォルダのルートで「git remote add origin ・・・」を実行
10.	「git remote」でリモートレポジトリを確認できる（デフォルトでは origin レポジトリ）
11.	「git push -u origin master」でローカルレポをリモートレポジトリにプッシュする
※ -u：最初のpushでのみ使用する、 origin：リモートレポジトリ、master：リモートレポジトリのブランチ
※ origin と masterはデフォルトなので、次回からは「git push」だけでよい
※ git add ⇒ git commit ⇒ git pushの順番
スマホでＲ

R Programming Compiler という iOS 用のＲのアプリがある。これを使えばスマホでＲが使える。現状、他の選択肢は事実上ない（タブレットなら RStudio Cloud という手もあるが）。
# 使い方
起動すると、全体的に黒い画面になる（歯車マークから、白基調とどちらにするか選べる）。下に Source、Input、Output などのタブを選ぶボタンがある。コードを入力するには、**画面最下部の Source** をタップして Source 画面にする。
![IMG_2013.PNG](https://qiita-image-store.s3.amazonaws.com/0/377279/3451e6e0-35fd-c4c7-d79d-cb5d6ebe547e.png)
ファイル名を指定した入出力はできない。利用できる入出力は標準入力、標準出力、標準エラー出力のみである。だが、Input タブにデータを書くことで任意のデータの入力ができる。また出力はすべて Output タブに出てくる。右上の ▶ マークをタップすると、その時に Source タブに書いてあるコードが、一番上から全部実行される。

ユニバーサルクリップボード機能を使えば、mac 上でコードを書いて ⌘-C、スマホで ⌘-V できる。

スマホ上で書いたコードはスマホローカルに保存されるが、上部中央のファイル名をタップして、**保存先に iCloud** を選ぶことができる。Input タブで同様にして iCloud を選べば、大きなデータファイルも Input タブに読み込むことができる。これをコードからたとえば

```R
dat <- (read.csv("stdin", header = F)
```
などとして読み込む。

Input タブに直接入力していく時は、**最下行の行末に改行**を入れた方がいいことがある。

# プロット
base パッケージの plot も ggplot2 も使える。ただ、プロットはアプリ内課金の対象である。600円。プロットは Output タブの左上の、なにやら棒グラフっぽいアイコンをタップすると表示される。

```R
library(ggplot2);
dat <- read.csv("stdin");
ggplot(dat, aes(x = Root, y = Fruit, colour = Grazing)) + geom_point();
```
![IMG_2006.PNG](https://qiita-image-store.s3.amazonaws.com/0/377279/0e4d5b3f-8fdf-1189-1a4b-9878fb2fc44d.png)
![IMG_2011.PNG](https://qiita-image-store.s3.amazonaws.com/0/377279/c4cee34d-163c-4511-df51-0b2a647705b3.png)
Ｒ内で画像の形式を調べたり指定したりもコード上はできるが、実際にはすべてJPEGになる。プロットの右上のアイコンをタップすれば、他のデバイスなどにも容易に送れる。
<img width="320" alt="IMG_2012.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/377279/18e866a8-8f28-3142-7edd-9422f9974c77.png">
# 感想など
メモリが小さいので1000x1000の行列の積みたいな大きなデータの解析はできないが、計算の速さ自体は十分実用的である。iCloud 経由のスクリプトやデータのやり取りもストレスなく行える。一方で、スマホ単体では文字入力は絶望的である。スクリプトは mac から取り込むか、Bluetooth キーボードが必須だと思われる。

これと RStudio Cloud の使い始め方を冊子にまとめた（[技術書典６](https://techbookfest.org/event/tbf06)および[お台場計算尺サイト](https://sliderule.booth.pm)で頒布）。
ハッシュ(Ruby)

#### はじめに
初学者のアウトプット備忘録用記事です。

#ハッシュ
ハッシュオブジェクト(略称:ハッシュ)は１つの変数で複数のデータを持つことのできるオブジェクト。
ハッシュオブジェクトは、自身の中にデータとそれに対応するキーのセットを所持することができる。

####キーバリューストア
ハッシュのように、保存したいデータ(バリュー)とそれに対応する標識(キー)を対応させてペアで保存する方式のことをキーバリューストアといい。標識であるキーを指定すればそれに対応するデータを取り出すことが可能。

####ハッシュオブジェクトの生成
```ruby


  hash = {}
```
ハッシュは{} (中括弧)を使って記述。また左辺のhashは変数名で、任意の名前を定義できる。上の書き方では何もデータを持っていない空のハッシュが生成。

```ruby

  hash1 = {"title" => "遊戯王"} #書き方に種類がある
  hash2 = {:title => "ポケモン"}
  hash3 = {title: "ビーダマン"}
  puts hash1
  puts hash2
  puts hash3
```
キーと値を持った状態のハッシュオブジェクトを生成。
ハッシュで使う場合に実行の速度がシンボルの方が早いため、ハッシュのキーにはシンボルの使用が推奨されてる。

####ハッシュオブジェクトから値を取得
取得の際に使うのがその値のキーで以下の書き方で取得ができる。

```ruby
  ハッシュオブジェクト [欲しい値のキー]

```
```ruby

  hash = {title:  "遊戯王"}
  puts hash[:title]　　　#文字列"遊戯王"が出力される。

```

####ハッシュオブジェクトに値を追加
ハッシュオブジェクトの生成後に値を追加できる。

```ruby

ハッシュオブジェクト[キー] = 値
```
```ruby
hash = {title:  "遊戯王"}
  puts hash[:title]　　　#遊戯王が出力される
  hash[:title] = "ポケモン"  #ポケモンが上書きされ
  puts hash[:title]　　#ポケモンが出力される
```


自分の復習用にここまで。
#python で標準入力を #json で受け取る例

# Script



```python
import json, sys

for line in sys.stdin:
  # Print as python syntax
  input_data = json.loads(line)
  print(input_data)

  # Print as json ( re-dump string )
  print(json.dumps(input_data))

```

# EXample

```
$ echo '{"title": "こんにちは屋台", "body":"よろしく世界"}' | python3 stdin.py                                                  [/private/tmp]
{'title': 'こんにちは屋台', 'body': 'よろしく世界'}
"{\"title\": \"\u3053\u3093\u306b\u3061\u306f\u5c4b\u53f0\", \"body\":\"\u3088\u308d\u3057\u304f\u4e16\u754c\"}\n"
$
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[個人日記]Vue.js × docker × AWSへ挑戦し(失敗し)学んだこと

# 概要
　チャレンジメモです。
　どれも触ったことがほぼなかった（特に環境構築が苦手）ので良い機会と思い挑戦しました。
　
# Before
　・docker使い方、仕組みなどわからない
　・Vue.js全然わからない
　・AWS難しそう

# After
　・docker基本操作のみならわかりやすい。
　・Vue.js、Nuxt.js（SSR）面白そう！
　・AWSサービス選定から難しかった

# 挑戦の流れ
　1.Vue/dockerの概念や特徴を理解しないまま「Vue docker aws」で検索し数件ヒットした記事から主な流れを把握
　2.書いている方法の通り「一気にdockerからAWS(S3使いたい)へやろう！」と意気込み実行。
　3.AWSの途中でエラーが発生も、設定した項目のどれが影響しているか、またはVueに問題があるのか原因不明
　　（レコード/DNS周りなど実践経験なしの項目が出てきて焦り）
　4.後日、とにかくVue、Nuxtがどんなものか概要/ファイル構成を把握しようと模索
　5.dockerでVue.js環境を構築
　6.VueチュートリアルでTodoアプリ作成を試みるもライブラリの読み込み部分でエラー多発
　7.もう少しファイル構成を追求中/公式ドキュメントを見ながら自分で実装したい（今）

# 改善点
　1.それぞれの概要や特徴を把握し、ある程度個別に下調べ/チュートリアルをしておいた方がよかった
　2.時間配分、見積もりを考えていなかった
　3.AWS Amplifyなど簡単なサービスもあったがS3など使ってみたかったサービスに無駄にこだわってしまった

# タスク
　・docker本を読む。仕組みなど把握しておく。
　・Vue.jsチュートリアルをいくつか触ってみる、本読む
　・バージョン違い？のようなエラーが多発したチュートリアルは何が原因だったのか考える
　https://cr-vue.mio3io.com/tutorials/todo.html#%E5%AE%8C%E6%88%90%E5%BD%A2
　・今度こそAWS
特定のフォルダ配下にあるThumbs.dbを全て消す方法 

#いらないファイルThumbs.db

隠しファイルで普段は見えないファイル。一つ一つのフォルダにあって、表示具合を保存しているキャッシュファイル。
共有ファイルサーバーなどにも保存されるので、移管する際にいろいろ厄介。
削除しようとするといちいちエラーが発生する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/284238/6d6fde67-0dcf-fc54-3ec7-e9eb3a2447c0.png)


#削除コマンド
以下のコマンドを実行する。

```powershell
#対象のフォルダに移動する。
cd {対象フォルダ}

#一致するファイルを全て削除する。配下のフォルダも含む、
del /ah /s thumbs.db
```
#python や #ruby コマンドの標準入力がコード評価で直接実行されることに気付いて驚いた件

# python

へえ python ってこんなこと出来るんだ。すげー、rubyとは違うな。

```
$ echo "print(1,2,3)\nif True:\n\tprint('its True');" | python3
1 2 3
its True
```

# ruby

る、ruby も出来るじゃないかーーー、知らなかったぜ！

```rb
$ echo "p [:a,:b,:c];  if true; puts 'its true'; end" | ruby
[:a, :b, :c]
its true
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【2019年最新版】JIS配列MacBookをUS配列化する方法

macはJIS配列のものを買ったけど、コーディングしやすいって言うし**US配列**で使ってみたいなぁ・・・

という人は以下の手順で簡単にUS配列化出来ます。


## US配列化手順
### 1.Karabiner-Elementsをインストール
以下公式サイトからインストーラをダウンロードし、インストールしてください。

<https://pqrs.org/osx/karabiner/>

### 2.Karabiner-Elements起動

Karabiner-Elementsを起動すると、以下のようなウィンドウが出てきますが、無視して「続ける」を押して問題ありません。
<img width="616" alt="image-20190328074444376.png" src="https://qiita-image-store.s3.amazonaws.com/0/233586/2e815640-d126-0834-8798-7936d9b014a3.png">



Karabiner-Elementsを起動すると、**既にあなたのmacはUS配列になっています。**
ただこのままの状態だと**「~」と「`(チルダ)」を入力するキーが使用出来ません。**

USキーボードだとこの位置にある「~」と「`(チルダ)」を入力するキーですが、
<img width="598" alt="image-20190328080433360.png" src="https://qiita-image-store.s3.amazonaws.com/0/233586/1f444e51-f5b5-9720-110e-f2e4127dd6af.png">

JIS配列キーボードにはそのキーが存在せず、巨大な「１」キーがあるだけです。
現状の状態ではBackspaceキーの左隣のキーが使用されていないので、このキーを「~」と「`(チルダ)」のキーに設定します。
<img width="629" alt="image-20190328080351689.png" src="https://qiita-image-store.s3.amazonaws.com/0/233586/2b7d1450-fbc9-7619-29f1-f34bcfdd57e3.png">

### 3.Karabiner-Elements設定

以下の画面にて「Target Device」を「Apple Internal Keyboard/Trackpad」にし、キーの置き換えを行います。

最初は「For all devices」が選択されていますが、「For all devices」のままだと外付けキーボード等にも全て設定が反映されてしまうので、個別に設定できるように「Apple Internal Keyboard/Trackpad」を選択してください。
<img width="994" alt="image-20190328074951333.png" src="https://qiita-image-store.s3.amazonaws.com/0/233586/2808f3b3-ed73-89e1-aca4-ea211ed2ad44.png">


Backspace左隣のキーは「international3」という名前なので、以下のように設定します。
<img width="999" alt="image-20190328075427132.png" src="https://qiita-image-store.s3.amazonaws.com/0/233586/8de47e09-2cf7-e94f-7e6a-4058a659e855.png">



以上で、JIS配列キーボードをUS配列で使用出来ます。英数/かなの切り替えも今まで通り可能です。



## JIS配列のままになっているキーボードの印字を隠す

ただこのままだと、キーボードに印字されているJIS配列の記号達が邪魔です。ブラインドタッチすれば良いとは言え、微妙に視界に入ってきて我々を惑わせます。

そんな邪魔な印字は隠してしまいましょう！ということで、以下の商品を貼れば全部真っ黒になります。

##### ブラックアウトステッカー

www.amazon.co.jp/dp/B016QFX1F8

MacBook Airに貼るとこんな感じです。

![IMG_5422.JPG](https://qiita-image-store.s3.amazonaws.com/0/233586/2ac92055-4d51-e299-400c-8ba558073bfa.jpeg)



ブラックアウトステッカーを貼るとFキーとJキーにあるポッチが分かりにくくなるので、更に上からつぶつぶシールを貼っています。

##### キーボードタッチセンサー

www.amazon.co.jp/dp/B06XQ576ZX



## US配列をステッカーに書く

ブラインドタッチができれば不要なのですが、慣れない内はUS配列をステッカーに書いた方が迷いにくいです。

自分が試した中では赤色のボールペンが書きやすさ・見やすさともにベストでした。(それでもかなり見にくいのですが。。)
![IMG_7121.JPG](https://qiita-image-store.s3.amazonaws.com/0/233586/fce5073f-00f1-20c0-3346-d7b60a2b6f97.jpeg)



------

上記の方法でUS配列化して一年ほど経ちますが、今のところ不具合はありません。

個人的にはJIS配列より使いやすい、、ような気がします。たぶん。

ブラックアウトステッカーを貼っていたら色々な人にそれカッコいいね！と話しかけてもらえたので、もしかしたらそちらの方が恩恵があるかも知れません。笑



そんな人がどのくらいいるかわかりませんが、Parallelsでwindows仮想環境を構築していて、そちらでもUS配列を使いたい！という場合のため、Parallels環境でのUS配列化方法もいつか書こうと思います。
[個人メモ]docker × Vueで開発環境を作る記事を読んで実際に手を動かしてみた

# 概要

 Vue.js、dockerに初めて挑戦する記録です。

# 1.Docker環境を作る

　参考「ローカルを汚さずdockerを使ってvue.jsの開発環境を作る」
　https://qiita.com/rh_taro/items/ca08b930f704275286a4

　１.Dockerfileを作成する
　２.コンテナイメージをビルドする
　３.イメージからコンテナを起動する
　４.起動確認
　５.コンテナに入りnpm/webpackをインストール
　　・npm→Nodeのパッケージ管理ツール
　　・Webpack→JS,CSSを1つにまとめる
　６.サーバ設定をlocalhostから書き換える
　　・コンテナ内のため書き換えないとアクセスできない
　
# 2.Vueファイルを概要で把握

　参考「VueCLIからVue.js入門①【VueCLIで出てくるファイルを概要図で理解】」
　https://qiita.com/po3rin/items/3968f825f3c86f9c4e21

　「vue-cliで始めるVue.jsチュートリアル (1)」
　https://qiita.com/sin_tanaka/items/29769266b3b078ea0f7c

　**index.html**
　　webpackでビルドされたデータが注入される。main.js読み込み。
　**main.js**
　　Vueインスタンスが生成される（Vueアプリの起動）。
　　dataが持つ値を変更するとビューが再構築される。
　**App.vue**
　　<template>にHTML
　　<script>にJavaScript
　　<style>にCSS
　　を単一ファイルに記載する。
　**router/index.js**
　　ルート一覧
　**components/HelloWorld.vue**
　　App.vueと同じ構成
　　<script>にdataを定義すると{{ 変数名 }}で使用できる
　　<style scoped>と書くとこのファイル内のみ有効化できる
　　　（webpackでCSS等も1ファイルに統合されるため必要？）

# 3.
Googleドキュメントで「番号付きリスト」や「箇条書き」に見出しを適用する【GAS】

# モチベーション
Googleドキュメントで「番号付きリスト」や「箇条書き」の段落ごとに一括でフォントの大きさを変えたい！

# 解決
Google Apps Scriptで段落に見出しを適用するスクリプトを書いてみました。
 → 見出しなら一括でフォントの大きさやスタイルを変更できる！

# 適用例
例として以下のものを行います。
**`段落レベルが「０」のものに、見出し「１」を適用する。`**

|実行前|実行後|
|---|---|
|![FireShot Capture 024 - first - Google ドキュメント - docs.google.com.png](https://qiita-image-store.s3.amazonaws.com/0/384142/41489442-08fa-a931-d28f-bad77bea1a12.png)|![FireShot Capture 025 - first - Google ドキュメント - docs.google.com.png](https://qiita-image-store.s3.amazonaws.com/0/384142/383f7068-a5bc-bbcc-93ad-f1e6f92214b3.png)

# 方法
1. スクリプトエディタを起動します。
`ツール -> スクリプトエディタ`

2. スクリプトエディタ上で以下を実行します。

```javascript:段落レベルが「０」のものに、見出し「１」を適用する。
function main() {
  var selection = DocumentApp.getActiveDocument().getBody()
  if (selection) {
    var listItems = selection.getListItems()
    for (var i = 0; i < listItems.length; i++) {
      var listItem = listItems[i];
      var level = listItem.getNestingLevel();

      // 段落レベルが「０」のものに、見出し「１」を適用する。
      if(level == 0){
        listItem.setHeading(DocumentApp.ParagraphHeading.HEADING1)
      }
    }
  }
}
```

見出しが適用されます。:smile:

# 自動実行
Googleドキュメントには、定期実行するシステムが揃っています！
`ツール -> スクリプトエディタ -> 時計のマーク`
`トリガーを追加 -> イベントのソースを選択 -> 時間主導型 -> `
あとはお好みで時間を設定します。
私は分ベースのタイマーにして、1分おきに起動しています。　
ただ、ドキュメントごとにいちいち設定しなくてはならないのが面倒くさいです:cold_sweat:
AWS SAM 入門

### サンプルアプリ作成
```
sam init -n test_project -r python3.7
```

### パッケージアップロード
```
sam package --template-file template.yaml --output-template-file packaged-template.yaml --s3-bucket sample-bucket --profile myprofile
```

### デプロイ
```
sam deploy --template-file packaged-template.yaml --stack-name TestStack --capabilities CAPABILITY_IAM --profile myprofile
```
スマート家電コントローラ「家電リモコン」で出来ること出来ないこと

# スマート家電コントローラでできることをさらにまとめてみた

#### 使ったもの

* 買った家電コントローラ
  [ラトックシステム RS-WFIREX4](https://iot.ratocsystems.com/products/rs-wfirex4/)
* スマホ
  iPhone 7, iOS 12.1.4
* **スマホアプリ
  家電リモコン**  
  スマート家電コントローラの機能と使い勝手の9割はスマホアプリで決まります。
* Google Home  
  miniではない方です
* テレビ
  [Panasonic REGZA49G20X](https://www.toshiba.co.jp/regza/lineup/spec/49g20x.html)
* 照明（シーリングライト） NEC製  
  照明器具のプリセット設定はSmart Lifeに用意されていません。DIYで設定します。
* エアコン
  [三菱電機霧ヶ峰MSZ-GV283,2014年製](https://www.mitsubishielectric.co.jp/ldg/wink/ssl/displayProduct.do?pid=211311)

#### できることできないこと

**この表にある操作はぜんぶ出来る！**

| 操作 | Smart Life<br>アプリ | Siri | Google Home<br>アプリ | Google Home<br>音声入力 |
| --- | --------- | ------------ | --- | --- |
| テレビを点けて<br>（テレビのオン・オフ） | できる | できる | できる | できる |
| テレビのボリュームを下げて | できる | できる | できる | できる |
| テレビのチャンネルを変えて | できる | できる | できる | できる |
| 明かりを点けて<br>（照明のオン・オフ） | できる | できる | できる | できる |
| エアコンを点けて<br>（エアコンのオン・オフ） | できる | できる | できる | できる |
| エアコンの温度を20度にして | できる | できる | できる | できる |

#### 総論

私にとってはGoogle Homeの音声入力でテレビのチャンネルを変えたかったのですが家電リモコンはそれができました。さらにテレビの色ボタン（青・赤・緑・黄）をGoogle Home音声入力で操作できるともっといいなあ。テレビの占いで押したいです。なお、Siriでは色ボタンを押せました。

#### 設定でハマッタ点

* Google Homeでルーティンを設定するときに「**家電リモコンで**テレビを消して」は反応しませんでした。「**家電リモコンを使って**テレビを消して」で操作できました。[マニュアル](https://www.ratocsystems.com/pdffile/smartphone/wfirex4.pdf)首っ引きで設定する必要があります。直感的に設定できるといいですね。
* Google Homeで「NHKにして」でテレビをNHKにすることはできませんでした。「NHKにして」と発話するとradikoがNHKラジオを流しますorz。「1チャンネル」にしてでテレビをNHKにすることにしました。

関連
[スマート家電コントローラSmart Lifeで出来ること出来ないこと](https://qiita.com/kenbunji/items/64ef7788363aad339ac0)
SPSS Modeler 18.2で時系列モデルの結果が出ない問題

SPSS Modeler 18.2で時系列モデルの結果が出ない問題が起きていましたが、解決されています。以下のAPAR番号をサポートにお伝えいただければFixが提供されます。

PH08522: TIME SERIES GENERATED MODEL NODE OUTPUT WINDOW DOESN'T SHOW THE MODEL RESULTS, SUCH AS ESTIMATED PARAMETERS AND ACF/PACF GRAPH.
https://www-01.ibm.com/support/entdocview.wss?mhq=PH08522&mhsrc=ibmsearch_a&uid=swg1PH08522

■問題の現象
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/d4929db3-194d-2670-0995-aabd83247489.png)


■問題解消後
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/44b5083b-4505-b63c-65ba-c8f4075259fa.png)
Pythonのモジュールとimportとfrom入門

<h1>モジュールとimportとfrom入門</h1>
モジュールや、importとfromが、入門のコードでよく出てきますが、何なのか？と思いながらも、おまじないとしている人も多いかと思います。
また、importとfromの違いがピンとこないって人もいると思います。
今日で、それは終わりにしましょう。

<h2>モジュールって？</h2>
答えは、
<strong>モジュールというのは、.pyで書かれたファイルのことです。</strong>
みなさんは、.pyファイルのコードを書いたことがあると思います。それらは全部モジュールです。

モジュール=ファイル名.py
と思っちゃえ。

とにかく、<strong>.pyで書かれていればモジュールなのです。</strong>

例えば、以下の.pyもモジュールです。

```hello.py
hello = "hello"  
```

世界一簡単なモジュールの完成です。（笑）

そして、このファイルも当然importやfromで呼び出せるのです。(importとfromの違いは次の章で)

さっそくimportしてみましょう。

p.pyからhello.pyを呼び出してみます。

```p.py
import hello

print(hello.hello)
```
どちらも同じフォルダに入れてください。
その後、
コマンドから実行

![image.png](https://qiita-image-store.s3.amazonaws.com/0/373549/19c5940f-07c1-5bda-386c-94e885b1c75b.png)


結果は、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/373549/822dd01d-a51a-590c-8e5e-e9c510972cd2.png)

hello.pyの変数helloの中身が出力されました!!
なんてことはないですねwww

モジュールって、.pyで書かれたファイルのことです。
モジュールってのが慣れないなら、.pyと思えばいいです。。

<h2>importとfromの違い</h2>
<strong>答えは、モジュールの全体を利用するのがimportで、
モジュールの一部(変数や関数だと思ってください。)を利用するのがfromっていう違いです。</strong>
ほんとそれだけです。なんてことはありませんね。
具体例を示していきます。

説明に入る前に、hello.pyの中身を書き換えます。

```hello.py
hello="hello"
world="world"
```


まずは、importの例から

p.pyの中身を以下のようにします。

```p.py
import hello

print(hello.hello)

print(hello.world)
```

ターミナル上から、python p.pyと打ち込むと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/373549/3fe54369-cf1a-808c-7022-c3bdaa72ec29.png)

でました!!import hello
と打ち込むと、モジュールのすべての属性を利用できます。

次に、fromの例を示します。
先ほどのp.pyを以下のようにします。

```p.py
from hello import world

print(hello.hello)
print(hello.world)
```
実行してみましょう!!
結果は、エラーになるはずです。
なぜならば、モジュールのhello.pyの変数worldそのものをimportしたからです。
つまり、
hello.pyの変数helloはimportされません!!
じゃあ、print(hello.hello)を消したらどうなるでしょうか

```p.py
from hello import world

print(hello.world)
```
これを実行したらどうなるかというと、
これもエラーになります。(笑)

from モジュール import モジュールの属性
という形式を用いた場合、モジュールの属性そのものが使えるわけです。要するに、モジュール.モジュールの属性みたいにしなくていいわけです。というか、したらダメです。エラーになるはずです。

以下に、そのことを考慮したp.pyを載せます。

```p.py
from hello import world

print(world)

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/373549/5f88307d-8ce2-25d3-9ce5-e24ecfe39738.png)
出ました!!

from hello import worldとしたことで、
worldという変数そのものが使えるようになったわけです。


<h2>まとめ</h2>

モジュールとは.pyです。
import モジュールのみだと、
モジュール全体を利用
from モジュール import モジュールの属性だと
モジュールの属性そのものを扱えるようになるです!!

まあ、本当は色々細かい話はあるのですが、そんなことは必要になったときに調べればいいだけです。
てことで、上のルールを知ってさえいればあとは、なんとかなると思われ。




あと、宣伝ですが、ツイッターを始めてみたので
登録お願いします!!

@niwaka_dev
新生Linuxディストリビューション　SereneLinux爆誕！早速仮想環境で動かすぞ

#SereneLinux

※2019年4月7日追記
この方法で動かないと言う報告がありました。
GPU設定などは特に弄っておらずそれほど特異な設定をしてないはずですが今後の検証をお待ちください
また該当環境は既に削除してしまった為こちらので完全再現はできかねます


国内でUbuntu 18.04.01ベースに開発中の軽量Linuxディストリビューションです。
現在βで開発が続行されておりベーターテスターとして参加しました
https://twitter.com/Serene__Team

#当方の環境
ホストマシン

OS Ubuntu16.04.6
CPU intel Xeon  E5-2603 v4　6Core
GPU 1080Ti/VegaFE
RAM 32GB


#仮想環境で動かす

今回はオラクル謹製のvirtual boxを使用

```
wget https://download.virtualbox.org/virtualbox/6.0.4/virtualbox-6.0_6.0.4-128413~Ubuntu~xenial_amd64.deb
sudo apt install ./virtualbox-6.0_6.0.4-128413~Ubuntu~xenial_amd64.deb 
```

CUI作業はこれぐらいしかないはず・・・多分

isoはβなのでコミュニティから直接お借りしてきました


![Screenshot from 2019-03-28 05-33-04.png](https://qiita-image-store.s3.amazonaws.com/0/232732/b4f0b669-8a4d-23cf-c4b3-a2c294264165.png)

設定はこんなもんですね、ubuntuベースなのでDebian64bitでいいでしょう

![Screenshot from 2019-03-28 05-33-35.png](https://qiita-image-store.s3.amazonaws.com/0/232732/4adab50c-d97f-f2e3-b152-e0ae7d7df3a9.png)
RAMは4GBもあれば十分みたいですがホストマシンに余裕があるので多めです
仮想HDDも8GBぐらいに収めておきました

![Screenshot from 2019-03-28 05-34-37.png](https://qiita-image-store.s3.amazonaws.com/0/232732/f42aacd2-3059-f222-40bb-e2051481da3f.png)
設定は超適当です

あとは仮想DVDドライブからisoを読み込んで起動順位を最上位にします

![Screenshot from 2019-03-28 05-37-28.png](https://qiita-image-store.s3.amazonaws.com/0/232732/ff982514-742e-2017-939e-56ed110c4bc1.png)



超適当ですがなんかスムーズに一応起動しました

ちなみにこれはDVDから起動してることになっています、ただM.2 SSD内の仮想DVDなのでそんな遅くないです

![Screenshot from 2019-03-28 05-42-11.png](https://qiita-image-store.s3.amazonaws.com/0/232732/64c117dc-b27b-0264-ba3b-11a9a5af5201.png)

流石に仮想環境なので激重ですが一応4K再生ができました。
プリインストールソフトウェアはUbuntuデスクトップをちょっと削ったぐらいでしょうか・・・？
コマンド体系とカーネルは基本的にUbuntuなのでおそらく大体同じだと思います

#総評

##UI
基本的にシンプルで使いやすいです、ただしリソースの無駄を抑えるためだと思いますがUIパーツはちょっと昔の超軽量ディストリビューションであるPuppy Linuxを思い出すようなベタ塗りタッチになっています
gnomeとMacOSのハーフみたいなデスクトップUIです

##コマンド体系
まだ試してないけど使った感じUbuntuと大体いっしょ、開発環境として有用性が気になるところ

##動作の軽さ
仮想環境なんで正直なんとも言えないのとマシンの性能がもともと潤沢なので評価は難しいので保留


##日本語対応
日本人が開発してるのでさすが・・・です



#まとめ
なんかいい感じですね、使っててワクワクします、isoをダウンロードして速攻で環境を立ち上げて1時間未満で書いた記事なので中身はスカスカですがベータ版ではなく公開版がでた時のお楽しみと言うことで・・・

![Screenshot from 2019-03-28 05-57-37.png](https://qiita-image-store.s3.amazonaws.com/0/232732/ede06e13-336c-9ebb-acac-4e0967409209.png)
ちなみにこれはSereneLinux上でfortran90環境を構築してfortranでハローワールドをしてる図です
多分開発環境としてもそこそこ使えるんじゃないでしょうか・・・？


#Todo

ROCm&NVIDIA環境を構築してディスクリートGPUでの動作を確認する
ネイティブでインストールする
開発環境としての実用性がどれぐらいあるか気になる
KiCadチートシート😇

# インポートしたDXFと2.54mmピッチのグリッドを中央揃えする

これは秋月のAE-C3と同じ穴位置と外形寸法のDXF（の元になるスケッチ）をFusion360で作ってみた例だが、中心から 2.54*N の位置に補助線を引いておいて、2.54mmのグリッドを選択したうえでこのDXFをインポートすれば、補助線の端がグリッドにスナップするので、縦横の中心線も2.54mmのグリッドにぴったり重なる。

<img width="951" alt="スクリーンショット 2019-03-28 3.09.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/26038/b19fe7a9-c646-38c0-39ad-09eef826128e.png">

困ったことに、インポートしたDXFの原点（グリッドへのスナップの基準になる点）をどこに置くかを設定できない。インポートするごとに変わるので、期待する場所が原点に選ばれるまで何度かインポートを繰り返す😇

<img width="1039" alt="スクリーンショット 2019-03-28 3.35.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/26038/459eb7bd-ca6b-090e-07b2-f615f561e6e5.png">


# CSVでBOMをエクスポートする

参照しているパスがおかしいので、なおそうとしたんだけど、✎ボタンが押せないので、変則的な手順になった。

- `+`ボタンを押す
- bom2csvを選ぶ
- すでに存在しているプラグインとかぶらないように適当な名前をつける
- `コマンドライン`にAppTransactionのパスが指定されているので、以下のコマンドに書き換える
  - `xsltproc -o "%O.csv" "/Applications/KiCad/kicad.app/Contents/SharedSupport/plugins/bom2csv.xsl" "%I"`
- `コマンドライン`テキストボックスの末尾にカーソルをあわせた状態でEnterを押す
Swift 5、リリースされた！！

<h3>Swift 5</h3>
<ul>
	<li>Xcode 10.2</li>
	<li>swift.org Blog「<a href="https://swift.org/blog/swift-5-released/">Swift 5 Released!</a>」</li>
	<li>swift.org「<a href="https://swift.org/migration-guide-swift5/">Migrating to Swift 5</a>」</li>
	<li>Paul Hudson「<a href="https://github.com/twostraws/whats-new-in-swift-5-0">What’s new in Swift 5.0?</a>」</li>
</ul>
<h3>Xcode 10.2</h3>
<h4>Migration</h4>
<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/xcode10_2_swift5_migration.png"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/xcode10_2_swift5_migration.png" alt="" width="1008" height="630" class="alignnone size-full wp-image-1246" /></a>
[Rails5] Ruby on Rails5で使用するgemのインストール先をローカルにする方法

# 以前私が書いた環境構築
以前私は [こちらの記事](https://qiita.com/takmt/items/0858dbd3c53cabaa4395)では、
Railsアプリケーションの環境構築方法を記載しましたが、
今回はRailsで使用するgemからインストールするパッケージを各Railsディレクトリのローカルにインストールする方法を記載しておきます。

目的は私自身がやり方を忘れない為です。

# 以前の構築方法とのメリット

* gemからインストールするパッケージを各プロジェクト毎のディレクトリに保存する為、環境を汚さない。
* コマンドの打ち込みが楽になる。

例えば複数のRailsVerを下記のようにインストールすることが出来ます。

```
gem install rails -v 5.1.6.2
gem install rails -v 5.2.2.1
```

この場合、`rails new myapp`などを行うと自動で最新verが使用されるようなので、前のrailsverでアプリを作りたい場合は、

```
rails _5.1.6.2_ new myapp
```

という書き方が必要になってきます。
一般的にgemでインストールしたrailsの複数Verがある場合、
環境上には複数verインストールされているため、過去のrailsを使用する為にはversion指定が必要になってきます。

このちょっとした面倒さを減らすのと各Railsプロジェクト毎のディレクトリにgemのパッケージをインストールする事で環境にRailsだけで使用するような大量のパッケージをインストールしない事が可能です。

# 環境構築前提

以前記載した [ここの記事](https://qiita.com/takmt/items/0858dbd3c53cabaa4395) と基本的に同じですが、
本記事は[rbenvを使用してrubyをインストールする。(CentOS7側)](https://qiita.com/takmt/items/0858dbd3c53cabaa4395#rbenv%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6ruby%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8Bcentos7%E5%81%B4)まで進めた状態からスタートします。

結論だけお話しすると、
**直接CentOS7にgemでパッケージをインストールせず、gemのインストール先をvendor/bundleにするだけ** だけのやり方です。
**

また今回はrails5.1.6を使用していきます。

# 以下環境構築方法です。

まずbundlerだけは必ずRubyGemsでインストールしてください。

```
gem install bundler
rbenv rehash
```

これだけはどうしてもプロジェクト外にインストールが必要です。

その後 railsのアプリケーション名用のフォルダを作成します。
今回は **myapp** とします。


```
mkdir -p ~/rails_share/myapp
cd ~/rails_share/myapp
```

この後、bundleを vendor/bundleにインストールしていきます。

```
bundle init
```

ローカルファイルにGemfileが出来たと思うので、ファイル内を修正します。

```
vim Gemfile
```

`# gem "rails"` を `gem "rails",'~> 5.1.6'` に修正し保存して終了します。

次に下記コマンドを打ち込みます。
これはrailsで必要なgemファイルをrubyのglobalな環境ではなくvendor/bundleにインストールするコマンドです。

```
bundle install --path vendor/bundle
```

時間がかかりますが気長に待ちましょう。

続いて下記です。
現在ディレクトリにRailsのアプリケーションを作成します。

```
bundle exec rails new . -B
```

途中 `Overwrite /home/user/rails_share/myapp/Gemfile (enter "h" for help)` と質問されますが、`y` を入力してEnterを押しましょう。

後は引き続き [この箇所] (https://qiita.com/takmt/items/0858dbd3c53cabaa4395#rails%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90%E3%82%92%E8%A1%8C%E3%81%86centos7%E5%81%B4)の`vim Gemfile`の
`gem 'sqlite3', '~> 1.3.6'` に修正するから再開すれば問題ないですが、1点注意が必要です。


# 本環境構築の注意点

gemからインストールしたパッケージを実行する際、

* 必ず railsアプリケーションのルートディレクトリ(例では `/home/user/rails_share/myapp` )に移動してからコマンドを実行する。 
* 頭に`bundle exec`を必ず追加する。

ようにしてください。
例えば、
`rails s -b 0.0.0.0` は 

```
cd /home/user/rails_share/myapp
bundle exec rails s -b 0.0.0.0
```

というように実行してください。

`solargraph socket --host 0.0.0.0` も 
`bundle exec solargraph socket --host 0.0.0.0` となります。

# お疲れさまでした
以上がgemからインストールするパッケージをローカルにする方法です。

色々と調査した内容を記載していっておりますが、
もし間違いやご指摘などありましたら、ご連絡の程お願いします。


# 参考サイト

* https://qiita.com/yuitnnn/items/b45bba658d86eabdbb26
* https://www.sejuku.net/blog/19426
SourceTreeでリポジトリ毎にユーザーを切り替える

## 概要
仕事用と個人開発用でアカウントを使い分けたい時があります。
リポジトリ毎にユーザーを設定できるように変更します。

HTTPSでクローンする前提

## 環境
Mac
SourceTree 3.1.1
※メインアカウント(グローバルユーザー)とは別のアカウントを使う場合を想定しています。

## クローン
はじめにHTTPSでクローンします。
<img width="560" alt="img_1_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/317701/e959c672-1c00-ba63-649f-0b8bbdca55b3.png">

URLにアカウントとパスワードを記載します。
`https://github.com/ryu0922/ysg_snowshoe.git`
↓
`https://[ユーザー名]:[パスワード]@github.com/ryu0922/ysg_snowshoe.git`
![img_1_2.png](https://qiita-image-store.s3.amazonaws.com/0/317701/7c243649-169a-4505-40ea-b2b926630719.png)

今のままだとSourceTreeに設定しているグローバルユーザーでpushします。
※添付だとわかりづらいですが、ryu*****0922が私のグローバルユーザーになります。
![img_2_1.png](https://qiita-image-store.s3.amazonaws.com/0/317701/ac5911fb-236b-0586-80c5-4db8b4bc8093.png)

## SourceTree設定
1.画面右上の**設定**を選択。
2.**グローバルユーザー設定を使う**のチェックを外す。
3.使用するアカウントの**名前**と**パスワード**を設定。
![img_2_2.png](https://qiita-image-store.s3.amazonaws.com/0/317701/44e32312-98ec-658d-3ac2-20c6f63ed497.png)

4.**リモート**を選択。
5.**Configファイルを編集**を選択。
![img_2_3.png](https://qiita-image-store.s3.amazonaws.com/0/317701/2c65212c-843a-07b0-e35d-e4bf5afd9f34.png)


6.`pushurl = https://[ユーザー名]:[パスワード]@github.com/ryu0922/ysg_manx_sp.git`を追記。
7.**name**と**email**を使用するアカウントの設定に書き換え。
8.保存し、**OK**を選択。

完成形
※リポジトリの設定によってconfigの内容が違います。

```
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = https://ryu0922@github.com/ryu0922/ysg_snowshoe.git
	fetch = +refs/heads/*:refs/remotes/origin/*
	pushurl = https://ryu0922:***@github.com/ryu0922/ysg_snowshoe.git
[branch "master"]
	remote = origin
	merge = refs/heads/master
[user]
	name = ***
	email = ***@***.com
```

pushするとユーザーの切り替えができています
![img_2_4.png](https://qiita-image-store.s3.amazonaws.com/0/317701/a0a3a058-d48e-c0f3-320b-3e2767caae96.png)


間違えていたり、気になる点がありましたら教えていただけると嬉しいです。
Chart.js設定項目メモ

vue-chart.jsのLine(折れ線グラフ)を使用した際の設定をメモ書き
chart.jsでもデータの設定部分は、ほぼ変わらないはず。

```Javascript:Javascript
//グラフに描画される線の設定
chartData = {
  labels: [1960,1965,1970,....], //x軸の値
  datasets: [ //グラフに描画される情報
      { //線一本分
        label: 'カナダ', //凡例に表示される各折れ線を示す名称
        data: [10,20,30,10,....], //実際の値
        fill: false, //線の下部塗りつぶすかどうか
        backgroundColor: '#FFFFFF', //線の下部の色と凡例の枠内の色
        borderColor: '#FFFFFF', //線の色
        pointBackgroundColor: '#FFFFFF', //点の色
        lineTension: 0,
        pointHitRadius: 15 //マウスホバーの認識範囲
      },
      {
        //他の線
        .
        .
        .
      },
  ],
}
```

```Javascript:Javascript
//グラフの設定
options = {
    title: { 
      //見出し
      display: true,
      text: "折れ線グラフ",
      padding: 1,
      fontSize: 18
    },
    scales: {
      yAxes: [
        //y軸
        {
          ticks: {
            //軸のメモリ
            beginAtZero: true //0から始まる
          },
          gridLines: {
            //y軸の網線
            display: false //表示するか否か
          },
          scaleLabel: {
            //表示されるy軸の名称について
            display: true, //表示するか否か
            labelString: "万人",
            fontSize: 15
          }
        }
      ],
      xAxes: [
        //x軸
        {
          ticks: {
            autoSkip: false, //横幅が狭くなったときに表示を間引くか否か
            maxRotation: 90, //下のと合わせて表示される角度を決める
            minRoation: 90 //横幅を最小にしたときに縦に表示される
          },
          gridLines: {
            //x軸の網線
            display: false
          },
          scaleLabel: {
            //表示されるx軸の名称について
            display: true,
            labelString: "Year",
            fontSize: 15
          }
        }
      ]
    },
    legend: {
      //凡例
      display: true,
      position: "right", //どこに表示するか
      labels: { fontSize: 15 }
    },
    responsive: true,
    maintainAspectRatio: false, //元のcanvasのサイズを保つか否か
    spanGaps: false, //値が抜け落ちていた時、埋めるか否か
    elements: {
      line: {
        //折れ線グラフの全ての線に適用される設定。
        //個別に設定する場合はdatasets内でlineTension:'任意の数字'で設定
        tension: 0, 
        fill: false
      }
    },
    tooltips: {
      mode: "point",
      intersect: false //modeがpointのときは違いは、なし？
    },
    animation: {
      // 線の出方
      duration: 0, //0にするとパフォーマンス良し
      easing: "" // アニメーションの緩急 https://easings.net/が詳しい
    },
    hover: {
      // ホバーした際のツールチップなどの出方に関わる
      animationDuration: 0 //0にするとパフォーマンス良し
    },
    //レスポンシブ中のアニメーション、0にするとパフォーマンス良し
    responsiveAnimationDuration: 0
  }
```

設定項目の数が多いので、
細かくいじろうとするとちょっと体力がいる。

[公式ドキュメント](https://www.chartjs.org/docs/latest/)を根気よく読み
[公式サンプル](https://www.chartjs.org/samples/latest/)と[ソースコード](https://github.com/chartjs/Chart.js/tree/master/samples)を駆使して慣れていった。
(まだ慣れていない🤔)
Kubernetesコマンド忘備録 / ReplicaSet

# ReplicaSet

[ReplicaSet - Kubernetes](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/)

###replicaset-definition.yml

<details><div>

```yaml:replicaset-definition.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-rs
  labels:
    app: myapp
    type: front-end

spec:
  replicas: 3
  selector:
    matchLabels:
      type: front-end
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: front-end
    spec:
      containers:
      - name: nginx-container
        image: nginx
```
</div></details>

###基本コマンド

```bash:
# 作成する
kubectl apply -f replicaset-definition.yml

# 情報を表示する
kubectl get rs
kubectl get replicatset

# 削除する
kubectl delete rs myapp-rs
kubectl delete replicaset myapp-rs

# 更新する
kubectl replace -f replicase-definition.yml
kubectl scale -replicas=6 replicaset-definition.yml
```

###テスト

####pods.yml

<details><div>

```yaml:pods.yml
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
    type: front-end
spec:
  containers:
    - name: nginx-container
      image: nginx
```
</div></details>

```bash:
# ReplicaSetを作成する
$ kubectl apply -f replicaset-definition.yml

# Podの情報を取得する
$ kubectl get pods
NAME             READY     STATUS    RESTARTS   AGE
myapp-rs-fnqsl   1/1       Running   0          3m
myapp-rs-sg5k5   1/1       Running   0          3m
myapp-rs-zzcr9   1/1       Running   0          3m

# Podを削除する
$ kubectl delete pod myapp-rs-fnqsl
pod "myapp-rs-fnqsl" deleted

# Podの情報を取得する（続けて新しいPodが起動する）
$ kubectl get pods
NAME             READY     STATUS    RESTARTS   AGE
myapp-rs-jrt29   1/1       Running   0          5s
myapp-rs-sg5k5   1/1       Running   0          3m
myapp-rs-zzcr9   1/1       Running   0          3m

# 新しいPodを作成する
kubectl apply -f pod.yml 
pod/myapp-pod created

# Podの情報を取得する
$ kubectl get pods
NAME             READY     STATUS        RESTARTS   AGE
myapp-pod        0/1       Terminating   0          5s
myapp-rs-jrt29   1/1       Running       0          2m
myapp-rs-sg5k5   1/1       Running       0          6m
myapp-rs-zzcr9   1/1       Running       0          6m

# Podの情報を取得する（新しいPodは起動しない）
$ kubectl get pods
NAME             READY     STATUS    RESTARTS   AGE
myapp-rs-jrt29   1/1       Running   0          2m
myapp-rs-sg5k5   1/1       Running   0          6m
myapp-rs-zzcr9   1/1       Running   0          6m
```
WebStorm 2019.1からAngularコンポーネントのts、スタイルシート、テンプレート、テストを行き来しやすくなった

Angularプロジェクトを開発している時、あるコンポーネントの

* TypeScript
* CSSやSCSSなどのスタイルシート
* テンプレート
* テスト

を行ったり来たりすることはよくあると思います。

2019年3月にリリースされたWebStorm 2019.1に「AngularコンポーネントのRelated Symbolポップアップ機能」が追加され、該当コンポーネントのファイル群を行ったり来たりしやすくなりました。

Angularのコンポーネントを開いている時に次のコマンドを押すと、

* Ctrl-Cmd-Up : macOS
* Ctrl+Alt+Home : Windows and Linux

次の画像のように、該当コンポーネントのTypeScript、スタイルシート、テスト、テンプレートを開くようなポップアップが表示されます。

![スクリーンショット 2019-03-28 1.29.09.png](https://qiita-image-store.s3.amazonaws.com/0/4125/68bd3546-a4cf-dc2f-2a4d-a22f9a486c8d.png)


これで該当コンポーネントのファイルを行ったり来たりしやすくなりましたね！


# 関連

* [Web Storm Blog : WebStorm 2019.1: smart intentions for JavaScript, improvements in Angular support, updated CSS and HTML docs, and new debug console](https://blog.jetbrains.com/webstorm/2019/03/webstorm-2019-1//#development_with_angular)
* [WHAT’S NEW IN WEBSTORM](https://www.jetbrains.com/webstorm/whatsnew/#v2019-1-angular)
JavaScript テキストファイルからリストを読み込んでPOSTする

# テキストファイルから、キーのリストを読み込んでPOSTする。


イメージ
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52335/0ecc9786-dd5d-eabc-0290-32689484c421.gif)

# 方法
テキストファイルから読み込んだ情報をformの要素として挿入する。
以下では、formのidを使ってsearchFormをの要素として挿入している。
その後、挿入したidを使用してデータをpost。(以下はjson形式でpostする例)

```html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <script type="text/javascript" src="http://code.jquery.com/jquery-2.2.3.min.js"></script>
  <title>File 読み込みテスト</title>
</head>

<body>
<pre id="preview"></pre>
<input type="file" id="getfile" accept="text/*">

<form method="post" id="searchForm" name="searchForm">
  <input type="button" name="btn" value="テキストファイルの内容をpostする" onclick="funcSearch();">
</form>

<script>
  var file = document.querySelector('#getfile');
  file.onchange = function () {
    console.log("file reading...");
    var fileList = file.files;
    //読み込み
    var reader = new FileReader();
    reader.readAsText(fileList[0]);

    //読み込み後
    reader.onload = function () {
      console.log(reader.result.split('\n'));

      var ele = document.createElement('input');
      ele.setAttribute('type', 'hidden');
      ele.setAttribute('name', 'MidList');
      ele.setAttribute('id', 'target');
      ele.setAttribute('value', reader.result.split('\n'));
      document.searchForm.appendChild(ele);
      // 画面に出力
      document.querySelector('#preview').textContent = reader.result;
    };
  }

  function funcSearch() {
    // ファイル読み込みからセットした値をidを指定して取り出す
    const target = document.getElementById("target");
    var midList = target.getAttribute("value").split(",");

    // hashでセット。配列で送信したいのでjsonにする
    var data = {"MidList":midList};
    console.log(JSON.stringify(data));
    $.ajax({
      type: "post",
      url: "http://localhost:8080/sample",
      data: JSON.stringify(data),
      contentType: 'application/json',
      dataType: "json",
      success: console.log("ok")
    });
  };
</script>
</body>
</html>

```
【解説】任意コード実行とは何か？バッファオーバーフローはどう危険なのか？

任意コード実行の脆弱性がどうとか言われてもピンとこない。
バッファオーバーフローもただアプリ落ちるだけじゃんと思っている。

そんな人向けに何故騒がれるのか説明してみようという記事です。

## 任意コード実行ってなに？

簡単に言うと「PCやスマホであなたが出来ること大体全部を他人がやれてしまう穴」が見つかったという意味です。

SNSにあなたのふりして投稿したり、アカウント自体消したり、保存してある画像を全部消したり、あなた名義で好き放題課金したり、あなたの名義でウイルスをばらまいたりできます。

こういう何でもできる所が"任意"なわけですね。

何でもできるということは、ウイルス.exeを複製してそこら中に仕込むこともできます。
任意コード実行で攻撃されたら再インストールか捨てるしかないのも恐ろしいところです。
業務中に穴を突かれて会社のサーバーにも広がって大変な目に合う人もいます。

## なにすると任意コード実行になるの？

色々ありますが代表的な原因にバッファオーバーフローがあります。

セキュリティの世界では、バッファオーバーフローが見つかる＝任意コード実行を警戒して使用を控える、って空気感です。
バッファオーバーフローが危険と言われるのはそのせいだったんですね。

## バッファオーバーフローがどうなって任意コード実行に？

「メモリに次に実行するアドレスがメモしてありますが、バッファオーバーフローで好きに上書きできてしまうから」です。

って言われてもピンとこないと思うので順に説明します。

まずは説明用C言語のコードをドン！

```C
#include <stdio.h>
#include <limits.h>
#include <string.h>

void hoge() {
   printf("Hoge!");
}

int main() {
   char b = 'A';
   char a[4];
   fgets(a, INT_MAX, stdin);
   printf("%c\n", b);
   return 0;
}
```

※本来ならfgetsした内容を使ってなんか処理するんですが省略。
※hoge()が呼ばれていないのも同上。

このままだと単に入力受け付けてから「A」と出力して終わるだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/365311/1394315a-c1ce-10f1-e722-b295f19b71f2.png)

しかしfgetsがaのサイズではなくINT_MAX(※巨大な数)で受けているためバッファオーバーフローが発生しています。

なので適当にガチャガチャ入力してやると。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/365311/68ce4308-1400-55bd-f917-69a53acecb22.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/365311/52ba7073-fea3-8156-eb22-1dafe5c7810f.png)

こうなります。

さて、ではここから任意コード実行を試みます。

### レッツ任意コード実行！

まずメモリーをexcelに例えます！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/365311/45c8dfe0-7d2e-17f5-2430-40df4f0b6a87.png)

「そうはならんやろ」って言われそうですがExcelに例えるんです！

とりあえず今回のアプリを当てはめるとこんな感じ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/365311/2f796c88-a6cf-4b45-59a1-5882e50e5fb2.png)

fgets呼び出しは「この図の上から順に入力で埋めていく処理」と言えるでしょう。

並び順は、変数aが居て、よくわからないものが3byteいて、変数bがいて、また何かが～って感じですね。

1文字1byteで、途中のprintfは変数bを表示しているのだから。
fgetsに8文字入力したら表示変わりそうじゃないですか？やってみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/365311/dd615e67-a046-a18f-39f0-463be529c29d.png)

無事出力が8文字目に変化しました！
※よく見ると以前の例外している画像でも8文字目が出力されてたりします。

メモリー図に反映させるとこんな感じ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/365311/be9efc43-68f8-99c8-eb53-dbfc8ad1d75b.png)

こうしてみると"mainの次に実行するアドレス"を上書きしてみたくなりませんか？なりますよね？
ところでhoge()関数のアドレスは0x2044D420で、これは文字であらわすと「 ﾔD 」なんですよ。

えいっ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/365311/8f843d90-a686-1862-cde8-07a3df614f7d.png)

おぉ、hoge()関数が実行されたではないですか！

この時のメモリー。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/365311/9130571b-876e-637c-683c-a301c00eaf11.png)

## 解説

あんな感じで"○○したら実行するアドレス"は実はメモリー上にたくさんあります。

- 関数呼び出しが終わったら戻る先のアドレス
  - 今回のはこれ
- 例外したら実行するアドレス
- そのインスタンスのメソッドのアドレス
- 関数ポインターの中身

などなど。

それらを1つでも上書きされると好きな関数を呼ばれてしまい、ファイル作られたり外部と通信されて好き放題されます。

つまりメモリーを好きに書き換えられると、それだけで攻撃には十分ということなんです。

もちろんこれらへの対策もいくつもあって、対策を回避するための攻撃もいっぱいあるのですが、そういう話はまた今度ということで。
[C#,Unity]usingステートメントを使っても必ずDisposeされるとは限らない

基本的に**usingステートメント**を使用するとブロックの終了時に**Dispose**が呼ばれます。

```csharp:サンプル
class Disposable : IDisposable
{
    public void Dispose()
    {
        Debug.Log("Dispose");
    }
}

private void Hoge()
{
    using (new Disposable())
    {
        Debug.Log(1);
        Debug.Log(2);
    }
}
```

上記を実行すると、`1`、`2`、`Dispose`と表示されます。
ただし、**yield**や**async/await**を使用する状況では`Disopse`が呼ばれない可能性があります。
例えば以下のようなケースです。

```csharp
void Start()
{
    // コルーチンの実行
    StartCoroutine(Fuga());
}

private IEnumerator Fuga()
{
    using (new Disposable())
    {
        Debug.Log(1);
        yield return null;
        Debug.Log(2);
        // コルーチンが終了する前にゲームオブジェクトを削除
        Destroy(gameObject);
        yield return null;
        Debug.Log(3);
    }
}
```

この場合、`1`、`2`までしか表示されません。
Unityが**IEnumeratorの列挙を途中でやめてしまう**からです。

```csharp
var enumerator = Fuga();
enumerator.MoveNext();
enumerator.MoveNext();
// ここで列挙が終了する。
// 3回目のMoveNextを呼べばDisposeされるがGameObjectが削除されているので呼ばれない。
// enumerator.MoveNext()
// もしくはenumeratorがDisposeされるならばDisposeが呼ばれる。
// if (enumerator is IDisposable d) d.Dispose();
```

**usingステートメント**だけではなく**try/finally**も同様です。

コルーチンをやめて**UniRx.Async**を使用すればこんなことは起こりません。

```csharp
void Start()
{
    Fuga(this.GetCancellationTokenOnDestroy()).Forget();
}

private async UniTask Fuga(CancellationToken token)
{
    using (new Disposable())
    {
        Debug.Log(1);
        await UniTask.Yield(PlayerLoopTiming.Update, token);
        Debug.Log(2);
        Destroy(gameObject);
        await UniTask.Yield(PlayerLoopTiming.Update, token);
        Debug.Log(3);
    }
}
```

上記を実行すると、`1`、`2`、`Dispose`と表示されます。
これは**UniRx.Async**が**オブジェクトの寿命とは別にタスクを実行している**こと、
キャンセルがリクエストされたことで**OperationCanceledException**が発生しているからです。
(逆に言うとトークンを正しく渡さない限りオブジェクトが削除された後でも先に進んでしまいます。)
Node.js でどの parse を例外処理すべきか？

## Overview
「`JSON.parse()` は不正な値を渡してしまった時に、例外投げられるのでちゃんと handling した方がいいですよー」と助言をいただいた。
勉強になるなあと思いつつ、Node.js で使える parse() は何種類かあった気がして、他はどうなんだろうと思い勢いで調べてまとめました。

※ @forl_head_officerさんからアドバイスいただき、Error handling した方がいいかどうかは各サービスの仕様に依存しそうだなーと思い直し、parse の挙動まとめの記事にしてみました。

## JSON.parse()
渡した String を json として解析してくれるやつ。
不正な値を渡すと `SyntaxError` が投げられます。

```javascript
const parsedJSON = JSON.parse({}); // SyntaxError: Unexpected token o in JSON at position 1
console.log('ここまで来ません');
```

Error handling するとしたらこんな感じですね。

```javascript
try {
  const parsedJSON = JSON.parse({});
} catch(e) {
  // Error handling
  console.log(e); // SyntaxError: Unexpected token o in JSON at position 1
  console.log('ここには来ます');
}
```

## url.parse()
渡した String を url として解析してくれるやつ。
不正な形式の値を渡すと `TypeError` が投げられます。

```javascript
const url = require('url');
const parsedUrl = url.parse(0, true); // TypeError: Parameter "url" must be a string, ...
console.log('ここまで来ません');
```

## Date.parse()
1970年1月1日00:00:00UTC から、渡した String までの経過したミリ秒数を返してくれるやつ。
不正な値を渡すと、**Error は投げずに、NaN が返されます。**

```javascript
const parsedDate = Date.parse(null);
console.log(parsedDate); // NaN
```

## parseInt()
最後に paseInt()、String から整数を返してくれるやつ。
こちらも不正な値を渡すと、**Error は投げずに、NaN が返されます。**

```javascript
const parsedInt = parseInt('', 10);
console.log(parsedInt); // NaN
```

## まとめ
`parse()` に不正なデータを渡した時...

- `JSON` と `url` は Error を返す。
- `Date` と `Int` は NaN を返す。
TypeScriptでReact 2

TypeScriptでReactアプリを作成します。

# 環境

```shell
$ yarn --version
1.12.3
$ create-react-app --version
2.1.8
```

# プロジェクト作成

`create-react-app`を使用して作成。

```shell
$ create-react-app calc-tsx-app --typescript
$ cd calc-tsx-app
$ rm .\src\*
```

# tsx作成

```tsx:src/index.tsx
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(<App bar="Hello!" />, document.getElementById('root'));
```

```tsx:src/App.tsx
import React from "react";

type Foo = {
    bar: string;
}

class App extends React.Component<Foo, {}> {
    render() {
        return <span>{this.props.bar}</span>
    }
}

export default App;
```

# 静的なinput作成

```tsx:src/App.tsx
import React from "react";

type Foo = {
    bar: string;
}

interface expression {
    n: number;
    x: number;
    y: number;
}

class App extends React.Component<Foo, {}> {
    expressions: expression[] = [
        { n: 1, x: 0, y: 1 },
        { n: 2, x: 2, y: 3 },
        { n: 3, x: 4, y: 5 },
    ];

    constructor(props: any) {
        super(props);
        this.state = {
            list: this.expressions
        };
    }

    render() {
        return this.expressions.map((d, i) =>
            <div key={d.n}>
                <input type="number" value={d.x} />
                <span>+</span>
                <input type="number" value={d.y} />
                <span>=</span>
                <input type="number" value={d.x + d.y} />
            </div>
        )
    }
}

export default App;
```

# yarn start
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215001/ca4cbed3-98b4-b0ea-0cc6-6d5fd1f2b815.png)

動的なinputは次回。

# 感想

- `interface`と`type alias`はどちらを使う？
- `map()`内で`key`を設定する場合、親の`div`に設定すべきか、あるいは、子の`input`に設定すべきか？
- コンポーネントを抽出すべき？

以上
メタプログラミングRuby::頭文字M の備忘録

# はじめに
Rubyの黒魔術を取得するために[メタプログラミングRuby](https://amzn.to/2WqHtyo)を読んだので、自分が理解できたことをまとめていく。本投稿はあくまで自分はこう理解したというものであるため、間違っているところがあれば優しく教えていただけると幸いである。それでは内容を見ていこう。

# メタプログラミング
そもそもメタプログラミングとはなにか？であるが、本にはこう書いてある。
「**メタプログラミングとはコードを記述するコードを記述することである**」
「**メタプログラミングとは、言語要素を実行時に操作するコードを記述することである。**」

ちなみに[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)には次のように書いてある。
「**プログラミング技法の一種で、ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義する方法のこと。**」

自分は「ある処理（価格を計算する/名前を取得するなど）を行うコードを記述するのではなく、そのコードを生成する処理を行うコードを記述すること」と理解した。
Javaでいうリフレクションを用いて記述したコードがメタプログラミングに近いと思われる。

# イントロスペクション
イントロスペクションとは以下のように、実行時にオブジェクトの情報を参照したり、さらにその情報に変更を加えたりする方法のことである。

```ruby
#!/usr/bin/env ruby
class Clazz
  def initialize(a)
    @a = a
  end
  def my_method
    @a
  end
end
clazz = Clazz.new('class')
p clazz.class  # Clazz
p clazz.class.instance_methods(false)  # [:my_method]
p clazz.instance_variables  # [:@a]
```

# 代表的なメタプログラミング
メタプログラミングを行っているRubyの代表的なgemに[ActiveRecord](https://rubygems.org/gems/activerecord)がある。
ActiveRecordはO/Rマッパーで以下のようにActiveRecord::Baseのサブクラスを作成するだけで、テーブルスキーマからClass名に対応するテーブルやカラムのアクセサメソッドを動的に定義する。

```ruby
class Table < ActiveRecord::Base
end
```

#おわりに
今回は「１章 頭文字M」に記載されている主なトピックについてまとめて見た。
まだまだ黒魔術の深淵に足の小指を踏み入れた程度だが、メタプログラミングとはどういったものであるかの雰囲気は感じられたと思う。
次回は「２章 オブジェクトモデル」についてまとめていく。

# コード
https://github.com/miya10kei/metaprograming-ruby/tree/master/01_initial_m