OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】Unityを触ったことのない僕がUnityでプログラミンのプレイヤーを作ってみる【プログラミン】

#はじめに
Unity初心者がプログラミンのプレイヤーを作ろうと奮闘する現在進行形の記事になります。
最終的なゴールは、2020年までにブラウザからAdobe Flash Playerを使用せずにプログラミンのプレイヤーの機能を動作させることです。

#プログラミンとは？
文部科学省が運営する、Web上で視覚的なプログラミングができるサイトです。

しかしFLASHで作成されているため、昨今のFLASH排除の影響を受けることになります。
そしてついに文部科学省から公式に継続して提供しない旨のアナウンスがありました。

>プログラミンは、2010年8月に開発・公開されたものであり、Adobe Flash Player上で動作するものです。

>しかし、Adobe Flash Playerは、2020年12月31日をもって提供及びサポートの終了を予定しており、Adobe Flash Player以外の新しい動作環境でプログラミンを継続して提供することは、現段階では予定しておりません。

>なお、2020年度からの小学校プログラミング教育の全面実施に向けて、文部科学省では、「小学校プログラミング教育の手引（第二版）」を公表しており、また、未来の学びコンソーシアムにおいて、プログラミング教育実施事例やビジュアルプログラミング教材の掲載を進めておりますので、ご参照ください。

>引用：[プログラミン｜文部科学省](http://www.mext.go.jp/programin/)

これによるとFLASH廃止と共に消える道を選んだようです。
残念ですが、仕方がないですね・・・。

#仕方がないけど、でも・・・
実は2013年にあった文部科学省[プログラミンのコンテスト](http://www.mext.go.jp/programin/contest/)でグランプリをいただいたということもあり、プログラミンには個人的に思い入れがあるんですよね。勢いあまって[「プログラミン研究所」](http://prgrmn.wpblog.jp/)という名の投稿サイトまで作ってしまうほどに。

今度も勢いあまって「**Adobe Flash Player以外の新しい動作環境**」とやらで作ってみようかなと思い立ちました。

いろいろ調べていくと、「**Unity**」ならばWebGL「**Adobe Flash Player以外の新しい動作環境**」になりそうです。


#実現にはなにが必要か
とはいっても、エディター部分まで作るのは身の程知らずにもほどがあるので、プレイヤー部分だけを実現することを目標とします。
プレイヤー部分だけなら、ざっくりと以下のような機能が必要ですね。

- プログラミンの保存データの取得
- サーバからのダウンロード（画像ファイル、音声ファイル、保存データ）
- ZIPファイル（保存データ）の解凍
- XML（プログラミン作品のソース）の解析
- 画像の縁取り
- 各種プログラミンの機能

#おわりに
本記事では導入部分となり内容が薄く申し訳ありません。
これを実現していく過程を記事にしていきたいと思います。
d.tsがないときにビルドを通す

1. `npm install --save-dev @types/package-name` をする。
2. 1がない場合は `src/@types/package-name/index.d.ts` と言うファイルを作成し

```
declare module "package-name";
```
と記述する。

2の場合上記のパスであればtsconfigの修正は不要。
Aurora R5 が出たのでいつもの mysqlslap で性能テストをしてみた

タイトルの通りです。

恒例（？）の`mysqlslap`をやってみました。

※前回（R4）の結果はこちらです。

 * **[「AWS、またパッチ当てたってよ」と聞いたので3度目のAurora（MySQL互換）R4テスト（mysqlslap）](https://qiita.com/hmatsu47/items/48e4af366c680c69f2ac)**

# `mysqlslap`の内容（前回までと同じです）

```bash:mysqlslap
$ mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary --engine=innodb --number-int-cols=20 --number-char-cols=20 --concurrency=150 --auto-generate-sql-write-number=2000 --auto-generate-sql-execute-number=2000 --auto-generate-sql-load-type=mixed -u 【ユーザ名】 -h 【クラスタエンドポイント】 -p
```

# 結果

いずれも暗号化あり、です。

なお、今回のテストで、バイナリログの有無が性能に（ほぼ）影響を与えなくなっていることを確認しましたので、結果はバイナリログなしのものを掲示します。

また、MySQL 5.7 互換版については、テストを行った時点で最新のバージョン 2.03.4 では R5 インスタンスの選択ができませんでしたので、1 つ前のバージョン 2.03.3 で試しています。

| バージョン | R4 / R5 | large | xlarge | 2xlarge |
|:-:|:-:|--:|--:|--:|--:|
| 5.6(1.19.0) | R4 | 55.466 | 40.199 | 28.859 |
| 5.6(1.19.0) | R5 | 42.397 | 26.761 | 24.254 |
| 5.7(2.03.3) | R5 | 41.895 | 27.040 | 22.964 |

単位は秒です。

全体的に伸びています。特に xlarge の伸びが大きいようです。2xlarge ではそれほどでもありませんが、これは必ずしも「大きなインスタンスほど性能の伸び率が小さい」ということではなく、負荷の掛け方の問題（＝インスタンスのサイズに対して十分な負荷を掛けていない）の可能性があります（すみません、前回までと合わせているもので…）。

5.6 互換版と 5.7 互換版の差は誤差の範囲のようです。

※前回の結果と比較すると、R4 の性能が若干落ちています。前回の結果をベースにして R5 と比較すると、large・xlarge は伸び率がさほど変わらず、2xlarge は R4・R5 の結果がほぼ同じ、となります（必ずしも性能向上していないことを示すものではない、というのは前述の通りです）。

# おわりに

EC2 と違って R4 と同額ですが、性能は向上していますので、乗り換えメリットはありそうです。

なお、このタイミングで R5 インスタンスとともに T3 インスタンスにも対応したようです（ちなみに CPU クレジットについて無制限モードも利用できる模様）。

---

 * **[Qiitaに投稿したAmazon Aurora関連記事](http://hmatsu47.hatenablog.com/aurora)**
rails create、updateアクションでの小ネタ（エラーハンドリングについて）

#はじめに、、、
そもそもエラーハンドリングとは、、、
>エラーハンドリングとは、プログラムの処理中に処理が妨げられる事象が発生した際、その処理をエラーとして対処する処理のことである。例外処理とも呼ばれる。

とのことです。
今回はこれについて話していきます。

#railsでエラーハンドリングを行う
railsでエラーハンドリングを行わなければならなくもっとも使用頻度で高いものでいうとmodelのcreateアクションだと思います。

```ruby:article_controller.rb
def create
  @article = Article.create(article_params)
  redirect_to articles_path
end
```
上のような書き方をしていると、もし仮にarticleがバリデーションの設定等の原因で新しいレコードをcreate出来なかった場合、エラーがでてそこで処理が止まってしまいます。  
ローカル開発なら問題ないですが、実務環境で処理が止まってしまうと数分で何百万もの損失を出してしまう可能性があります。
そこで、エラーハンドリングを行います。

そしてエラーハンドリングをやった時のcreateアクションが↓です。

```ruby:article_controller.rb
def create
  #@articleと言う変数に値を入れる
  @article = Article.new(article_params)
  if @article.save #保存できるか？
    #保存に成功した時はarticleのindexアクションにリダイレクト
    redirect_to articles_path
  else
    #保存に失敗したときはarticleのnewアクションにリダイレクト
    render :new
  end
end
```

このように、値をseveする時にseveできているかの条件式（if文）を挟む事で、
値が作成されずエラーが出て処理が停止してしまう事は無くなります。


# 最後に
railsではscaffoldなどのrails g コマンドを使ってビューファイルを生成した時は、自動でエラーハンドリングは行われていますが、
自分でsave処理を行う時などは、気をつけてコーディングしましょう！
プランニングポーカーをやったのでその感想をつらつらと

#はじめに、、、
今お世話になっている会社さんで作っている自社サービスの新規機能追加をするにあたって、マーケティンング部門の方に工数を伝える時に
**プランニングポーカー** 
を使って工数の見積もりを行ったのでつらつらとまとめようと思います。

##What is プランニングポーカー？
アジャイルマニフェスト起草者の一人であるJemes Grenning氏が定義した見積もり手法であり

「１」「２」「3」「5」「8」「?」

といった数の書いてあるカードを使って、タスクの規模を相対的に見積もる手法です。

##やり方
一緒にタスクを行うメンバーと行います。　　
1. ユーザーストーリーを書き出す（機能一覧など）
2. それぞれのストーリーの具体的な要検討を洗い出す
3. 書き出されたストーリーの中で最も簡単だと思われるものを「１」として基準とする
4. 優先度の高いストーリーから順番に一つ選び、共通認識をすり合わせる。
5. 共通認識が済んだら一斉にカードをだす
6. それぞれのカードのポイントを確認し、それぞれがなぜそのポイントのカードを出したのかの根拠を聞く
7. 全員のカードの数値が揃うまで続ける
8. ４〜７を繰り返す
9. 最後に、出揃ったポイントを合計し最初に基準としたカードの工数を考えて決める


以上のような手順を踏むことで、チーム全体で、どの程度のタスクの難易度があると感じているのかを共通認識として持つことができ、なおかつ、皆がある程度納得した形で工数が算出できます

## メリット
 * タスクの全体像がチームメンバーそれぞれが把握することができる
 * 新米エンジニアは、ベテランエンジニアの方が、実装の際どんなことを考えながら実装を考えているのかがわかる
 * 逆にベテランエンジニアは新人エンジニアが、どれくらいの難しさを感じながらタスクに望もうとしているのかが、わかりやすくなる。
 * エンジニア間でのコミュニケーションが取りやすくなる

というのがメリットとしてあげられると思います。


##感想
僕自身プランニングポーカーを行ったのは初めてだったのですが、今まで闇雲にやっていたタスクの全体像が見えたのと同時に、先輩のエンジニアの方が、どんな風にタスクを捉えているのか？未知のものに対してどれくらいの難しさで考えているのか？その根拠はなんなのか？
といった思考の仕方というのがわずかながらですが、見えた気がしたので、個人的にとても良い経験になりました！

今、僕自身もチームを作って開発を行ったりしているのでそのチームでも一度やってみたいと思いました！

##参考
https://tracpath.com/works/development/agile_planning_poker_and_userstory/
http://appresso.hatenablog.com/entry/2016/08/03/181355
AndroidStudioがアップデート後に起動しない時

#Android Studioがアップデート後に起動しない時
##急いでる方へ：
###「最新の日本語化パッチは当てましたか？」

もし同じ状況でしたら、これで解決するかと思います。
この方法が当てはまらない場合は、これ以降の記事は見ずに、
ブラウザの戻るボタンを押して別な解決策を考えたほうが幸せになれます。

---

ここでは、自分用のメモとして残しておきます。
最初の状況から解決するまでの流れを載せています。

##問題が起きた時の状況

最初の状況として、
・Android Studioのショートカットを起動しても何も起こらない
・プロセスも立ち上がらない
・パスは通っている
・アップデート後、1回だけ起動しており、前のバージョンの作業フォルダの削除をした（2019/5/6 追記）
というような状況でした。

今思うと、つい最近3.3へバージョンアップをしていた気がします。

##解決まで
そこで、「Android Studio 起動しない」と検索をかけたところ、このページが見つかりました。
http://demikko-no-bibouroku.hatenablog.com/entry/2017/12/28/234346

ここの方はまずパスを通していますが、自分の場合既にパスは通っていたので、
次のstudio.batを見ることにしました。

この時、studio.batの最後の行に

```
PAUSE
```
と追記し、コマンドプロンプトが途中で止まるようにしました。

studio.batを上書き保存し、実行してみると、

```
Error opening zip file or JAR manifest missing : C:\Users\〇〇〇（ユーザー名）\.AndroidStudio3.1\config\jp.sourceforge.mergedoc.pleiades\pleiades.jar
Error occurred during initialization of VM
agent library failed to init: instrument
```

との表示がでました。

それでもよくわからなかったので、
`「Error opening zip file or JAR manifest missing Android Studio」`
と検索したところ、
https://teratail.com/questions/170021
このページやEclipseの日本語化が失敗したという記事が多くでてきました。

いくつかサイトを見ていたところであることに気付きました。
`「そういえば、Android Studioは日本語化パッチを当てないと日本語化できないんだっけ」`
`「あれ、パッチ当てるときってAndroid Studioの個々のバージョンに対してだった気が・・・」`

ということで、Android Studio3.3（当時の最新）に対応した最新のPleiades プラグインをDLしてきてインストーラーからアップデートしたところ、さらっとAndroid Studioが起動しました。めでたし。

#追記（2019/5/6)
Android3.4のアップデートの時もやはり最初の起動時に前のバージョンの作業フォルダ？を削除した後、2回目以降の起動ができなくったので日本語化パッチを当てたらすんなり動くようになりました。
今日のスクレイピングの復習

#Lv.0 大前提
##①class = ○○(HTML)→.○○ { }（CSS）　え？↓
```HTML:
<div class = "search">外国人の彼氏</div>
```
「外国人の彼氏」を装飾したい。
↓
classをつけて適当に"search"と名前をつける。

```css:
.search{
  文字の大きさ変えたり
　背景色変えたり
}
```
class部分は
.search{ }と書けば、
CSS（装飾）があたる。
（そういうものです。）

##②inner_textって何？
```HTML
<p>季節のコーヒー</p>
```

「季節のコーヒー」部分がinner_text
「p」の部分はinner_textではない。
#Lv.1 検証画面→コピペ←私は何をやっていたの？

```ruby:
contents = documents.css(".searchResult_itemTitle")
④ 　       ①　　　　　②　　③
```

画面を指差し確認しながらがいいかもです。

①ドキュメント（文章）の中の
②CSSで、(Lv.0)

③class名が 
　"searchResult_itemTitle"
　(検索結果の項目のタイトル)
　となっている文章を
④「contents」という箱（変数）に入れてあげる。
　※contentsという名前は作った人が勝手に命名した。
　 englishでもSeasonCoffeeでも何でもいい。

#Lv.2 each文の登場
eachからendまでが1つの塊です。

```ruby:
contents.each do |content|
①　　　　②　　 ③　 ④
  puts content.inner_text
       ⑤　　　　⑥
end
⑦
```
----------１行目----------------------------
①contentsという箱（変数）に入った文章を
②まず1個箱から…
③出して…
④「content」という箱に入れてください。
  ※このcontentも勝手に命名。
----------2行目-----------------------------
⑤「content」に入った文章の
⑥inner_textの部分をputsしてください。(Lv.0)
----------end------------------------------
⑦putsしたら、
　contetsの箱の中身が無くなるまで
　①から⑥を繰り返してください。

```ruby:
上と同じコードです。見づらかったらどうぞ。
contents.each do |content|
①　　　　②　　 ③　 ④
  puts content.inner_text
       ⑤　　　　⑥
end
⑦
```

#Lv.3 これ学ぶ意味あるの？　社会のどこで使うの？
すごい使えます。すごい使ってます。

例：Twitt○r
みんなのツイートを一覧で見る例の画面

```
みんなのtweet○.each do |twe○t|
  puts twe○t
end
```

他にもF○cebookやi○stagramでも
このように実装されています。

SNSの根幹をなしています。
ファイルの読み書きで使用する「open」関数のモードについて、存在しないものを選択肢の中から選びなさい。

#はじめに
この記事はPython3初学者が、[DIVE INTO EXAM](https://diver.diveintocode.jp/exam#exam-list)のPython3エンジニア認定基礎試験の問題を引用し、解答するものです。間違い等があればご教示くださると嬉しいいです。

#設問
> ファイルの読み書きで使用する「open」関数のモードについて、存在しないものを選択肢の中から選びなさい。

#解答群
>
- r-
- w
- a
- r+

#正解
r-

#解説
[リファレンス](https://docs.python.org/ja/3/library/functions.html#open)によるとopen関数の引数modeで指定できる値は以下の通り。


>|文字|意味|
|---|---|
|'r'|読み込み用に開く (デフォルト)|
|'w'|書き込み用に開き、まずファイルを切り詰める|
|'x'|排他的な生成に開き、ファイルが存在する場合は失敗する|
|'a'|書き込み用に開き、ファイルが存在する場合は末尾に追記する|
|'b'|バイナリモード|
|'t'|	テキストモード (デフォルト)|
|'+'|ディスクファイルを更新用に開く (読み込み／書き込み)|

## 選択肢 r-
-というオプションは存在しないため○

```python
f = open('test.txt','r-') # <= ValueError: invalid mode: 'r-'
f.close()
```

## 選択肢 w
wというオプションは書き込みであり、存在するため×

```Python
f = open('test.txt','w')
f.write('kemono friends\n')
f.close()
# No Error
```
  
```test.txt
kemono friends

```
## 選択肢 a
aというオプションは追記であり、存在するため×

```python
f = open('test.txt','a')
f.write('serval chan\n')
f.close
# No Error
```

```test.txt
kemono friends
serval chan

```

##選択肢 r+
rは読み込み、+は読み書き両方指定するオプションで存在するため×

```python
f = open('test.txt','r+')
f.write('kaban chan\n')
f.close
# No Error
```

```test.txt
kemono friends
serval chan
kaban chan

```

### 余談
withステートメントを使えばcloseは省略できる

```python
with open('test.txt','a') as f:
    f.write('lucky beast\n')
# No Error
```

```test.txt
kemono friends
serval chan
kaban chan
lucky beast

```
時間指定ツイートの備忘録~誕おめリプの自動化~

#動機
誕生日の人に0:00分に1番にリプを送りたい
#すること
時間指定してツイートするプログラム
#プログラム
##apiインスタンスの作成
```tauth.py
#coding:UTF-8
import tweepy
CONSUMER_KEY = "XXXXXXXXXXXXX"
CONSUMER_SECRET = "XXXXXXXXXXXXX"
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
ACCESS_TOKEN = "XXXXXXXXXXXXX"
ACCESS_TOKEN_SECRET = "XXXXXXXXXXXXX"
print("auth")
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
print("Done!")
```
XXXXXXXXXXXXXに各apiのキーが入ります
##時間指定で実行のプログラム
https://qiita.com/aonisai/items/29308611cece0897e949
のコードお借りしました

```birthday_tweet.py
from twython import Twython,TwythonError 
import tauth
from datetime import datetime, timedelta
import sched
import time
import sys

api = tauth.api  #apiインスタンスを作成
print('Auth Done!')

print('日付')
day = input()
day = int(day)
print(type(day))
print('時')
hour = input()
hour = int(hour)
print(type(hour))
print('分')
minute = input()
minute = int(minute)
print(type(hour))


def def1(tweet):
    api.update_status(status= tweet )


now = datetime.now()
now = datetime(now.year, now.month, now.day, now.hour, now.minute, 0)
comp = datetime(now.year, now.month, day, hour, minute)
print(comp)
diff = comp - now

if int(diff.days) >= 0:
    print('実行するから時間まで待ってねー')
    scheduler = sched.scheduler(time.time, time.sleep)
    scheduler.enter(diff.seconds, 1, def1, ('誕生日メッセージ', ))
    scheduler.run()
    print(now)
else:
    print ("もう時間すぎてるよー")

#api.update_status(status='!!!!!')

```
#使い方
プログラムを動かす
日付を入力
時間を入力
分を入力
以上で同年、同月の指定の日の時間にツイートしてくれます
#改善点
・day,hour,minuteの型がいちいちintに変換しててうっとおしい
・実際に入力された日付、時間、分が文字でない場合の例外処理をしてないため、strぶちこむとエラーを吐く
・Pythonでツイートすると処理に時間を取られて厳密にその時間にツイートはできない（実際は40s程遅れた）
#結果
ツイートの処理に時間がかかったせいで1番になれなかった
悲しい
#おわりに
テスト前だしまあ備忘録としてこんなもんかな〜
終わったらダサいコード直しますね
こんなことしてないで†英語†の勉強します
ブラックジャック（一行でA処理版）

[プログラミング入門者からの卒業試験は『ブラックジャック』を開発すべし](https://qiita.com/hirossyi73/items/cf8648c31898216312e5)

のルールでチャレンジしてみたブラックジャック。
スコアの計算、Aの処理の部分は少し考えてみるとシンプルに。

#スコアの計算

元ルールの処理:
>JとQとKは10として扱う
>Aはとりあえず「1」としてだけ扱う


```python
	sc = sum(min(10, c.rank) for c in self)
```


##拡張版：Aを１か１１、有利な方でカウント

```python
	if (sc <= 11 and 1 in [c.rank for c in self]): sc += 10
```

こちらの機能拡張も一行追加するのみ。

「Aは２枚以上１１とカウントされない（２２をオーバーしてしまう）」
⇒　「全体スコアが１１以下の時のみ、Aが１１とカウントされる場合がある」
　と考えるとシンプルに。

------

改行入れてもソース全体で６０行程度、Pythonは手軽に書きやすいなぁと思いました。
[ブラウザで動かす版はこちら(colab)](https://colab.research.google.com/github/zaq9/BlackJack/blob/master/BlackJack.ipynb)

#BlackJack：ソース全体（改行込みで６０行）
```python
class Card: #カード：ユニコードでSuit表示
	SUITS = '♤♡♢♧'
	RANKS = '0 A 2 3 4 5 6 7 8 9 10 J Q K'.split()
	def __init__(self, suit, rank): self.suit, self.rank = suit, rank
	def __repr__(self): return f'{Card.SUITS[self.suit]}{Card.RANKS[self.rank]}'

import random
class Deck(list): #トランプの山
	def __init__(self):
		super().__init__([Card(suit, rank) for suit in range(4) for rank in range(1, 14)])
		random.shuffle(self)

class Hand(list):  # 手札
	@property
	def score(self):  # ブラックジャックのスコア(Bustした場合は負の数を返す）
		sc = sum(min(10, c.rank) for c in self)
		if (sc <= 11 and 1 in [c.rank for c in self]): sc += 10
		return sc if sc <= 21 else -sc

class Player: 
	def __init__(self, deck):
		self.deck = deck
		self.hand = Hand()
		self.draw()

	def __repr__(self): return (f"{self.__class__.__name__} {self.hand} :Score={self.hand.score}")

	def draw(self):
		self.hand.append(self.deck.pop())
		return self.hand.score

	def confirm_hit(self):
		view(self)
		return confirm('もう一枚引きますか？')

	def deal(self):
		while (self.draw() > 0):
			if (not self.confirm_hit()): return self.hand.score
		view(f"{self.__class__.__name__} の負け！バーストしました。 {self.hand} ")

class Dealer(Player):
	def confirm_hit(self): return self.hand.score < 17

def game():
	deck = Deck()
	dealer, player = Dealer(deck), Player(deck)
	view(dealer)
	if (player.deal() and dealer.deal()):
		view(dealer)
		if (player.hand.score >= dealer.hand.score):
			view('Playerの勝ちです。おめでとうございます！')
		else:
			view('Dealerの勝ちです。残念！')

def view(msg): print(msg)
def confirm(msg): return input(f'{msg} [y/n]').lower() == 'y'

if __name__ == '__main__':
	game()
	while confirm('もう一度ゲームしますか?'): game()



```

---

```text:実行結果例

Dealer [♧4] :Score=4
Player [♧A, ♡K] :Score=21
もう一枚引きますか？ [y/n]n
Dealer [♧4, ♧8, ♡4, ♢2] :Score=18
Playerの勝ちです。おめでとうございます！
もう一度ゲームしますか? [y/n]y
Dealer [♧7] :Score=7
Player [♧Q, ♤7] :Score=17
もう一枚引きますか？ [y/n]n
Dealer [♧7, ♤4, ♢10] :Score=21
Dealerの勝ちです。残念！
もう一度ゲームしますか? [y/n]y
Dealer [♢A] :Score=11
Player [♢9, ♢J] :Score=19
もう一枚引きますか？ [y/n]n
Dealer [♢A, ♤3, ♤K, ♢6] :Score=20
Dealerの勝ちです。残念！
もう一度ゲームしますか? [y/n]n
```

#検討課題：
クラスや関数の名前、継承関係。GUI

#参考
- [【ブラックジャック】Aの1 or 11問題について](https://qiita.com/irosan/items/ee3e04cee5cdbbf85d65)
- [テスト初心者がブラックジャックを開発してみた](https://qiita.com/yokoc1322/items/cb4cefa41aeb5bd4bcc7)
- [プログラミング入門者からの卒業試験は『ブラックジャック』を開発すべし](https://qiita.com/hirossyi73/items/cf8648c31898216312e5)
初心者の初心者による初心者のためのAtom

#はじめに
初投稿です。プログラミングを始めてまるまる1年が経とうとしています。
1年前にプログラミングなるものを始めた際、勧められたテキストエディタ **Atom**
1年経った今でも「ほえ〜」となる機能が多いので、備忘録も兼ねて、初心者に向けて紹介していきたいと思います。


#そもそもAtomって？
![atom_logo.png](https://qiita-image-store.s3.amazonaws.com/0/371794/198fbba3-3679-0a34-98ad-391ce4feeeee.png)


Atomは、GitHub社が無料で提供する、オープンソースのテキストエディタ。

公式サイトには、”A hackable text editor for the 21th Century”「21世紀のためのハックが可能なエディター」という説明があります。

テキストエディタとは、テキストファイルを作成、編集、保存するためのソフトウェア。
Atomの他に **Vim** や **emacs** に加え、PCに標準装備されているメモ帳もテキストエディタです。


#Atomをインストールしよう！
この記事を見ている方はもうダウンロード済みかもしれませんが、初めての方へMacとWindowsへのインストール方法を紹介します。

##Mac
- [Atom公式サイト](https://atom.io/)にアクセス
- `DownLoad for Mac`をクリック
- zipファイルをダウンロードして、解凍
- そのアイコンをアプリケーションフォルダにドロップ

##Windows
Windows版がよくわからなかったので[こちら](https://rfs.jp/sb/atom-github/atom01_install.html)を参考にさせていただきました。

- [Atom公式サイト](https://atom.io/)にアクセス
- ダウンロードしたEXEファイルを実行する
- インストール終了のちソフトが起動


#Atomを初起動したと同時にやるべきこと
Atomはユーザーが **パッケージ** をインストールして、エディタの機能や見た目をカスタマイズすることができます。
パッケージを入れて自分が使いやすいようにカスタマイズしましょう！

パッケージのインストールの仕方は共通です。
以下の画像の通りにやってみましょう。
##パッケージのインストール方法
###1.Atomを起動するとこの画面
<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/371794/4e8aeddc-70d0-e1ed-12bd-8964354ef070.png"> 

###2.上から4つ目、`Install a Package` をクリック
![Install](https://qiita-image-store.s3.amazonaws.com/0/371794/360ecc12-1b9a-e6cf-4039-bd9a7bf17841.png  "install")

###3.`Open Installar`をクリックし、欲しいパッケージ名を入力
![Open Installer](https://qiita-image-store.s3.amazonaws.com/0/371794/647208b7-4303-c218-5b33-3bf748baf979.png "open installer")
**これでパッケージはインストールできます！**
ではこれを踏まえて、Atomの設定を追加していきましょう。

##初心者はこの設定をしよう！

###1.日本語環境
`japanese-menu`は、Atomを日本語環境で使用するためのパッケージです。
「メニューバー」「設定画面」「コンテキストメニュー」を日本語にしてくれます。

###2.全角空白
`show-ideographic-space`は、Atomテキストエディタで全角スペースの編集記号を表示するパッケージです。
プログラミングをする際、全角スペースがあることに気付かずエラーが出て、発狂する前に是非インストールしておいてください。

###3.インデントの可視化
これはパッケージのインストールではないのですが、Atomの環境設定からやっておくとコードが見やすくなります。
環境設定 ＞ Editor（上から2番目）＞ スクロールして`Show Indent Guide`と`Show Invisibles`にチェックを入れます。
![Atom Screen](https://qiita-image-store.s3.amazonaws.com/0/371794/f618af19-541f-1bf9-6494-dc06e6b74535.png "Indent")


#Atomの便利なショートカット
ここでAtomの便利なショートカットを紹介します！
ショートカットを覚えると作業効率は格段に上がります。
実際に使いながら、覚えていきましょう。

###1.選択、マルチカーソル
| 操作 |Mac  |Windows
|:--|:--|:--|
|マルチカーソルの追加|^+クリック|^+クリック|
|単語の選択|⌘D|^D|
|単語のスキップ|⌘K|^K|
|前の単語へ戻る|⌘U|^U|
|行の選択|⌘L|^L|
**行の選択**のときには、さらにLを押すことによって複数行選択することができます。

###2.移動
| 操作 | Mac | Windows |
|:--|:--|:--|
| 単語単位で前へ移動 | ⌥B | Alt B |
| 単語単位で次へ移動 | ⌥F | Alt F |
| 単語の先頭へ移動 | ⌥ ← | ^ ← |
| 単語の末尾へ移動 | ⌥ → |^→ |
| 行の先頭へ移動 | ⌘ ← | Home |
| 行の末尾へ移動 | ⌘ → | End |
| 行番号を指定して移動 | ^G | ^G |
| 対応するカッコへ移動 | ^M | ^M |

###3.編集
| 操作 | Mac | Windows |
|:--|:--|:--|
| コメントアウト/解除 | ⌘/ | ^ / |
| 行の削除 | ^⇧K | ^⇧K |
| 下に空行を挿入 | ⌘return | ^Enter |
| 上に空行を挿入 | ⌘⇧return | ^⇧Enter |
| 行の移動 |^ ⌘  ↑ or ↓ |^ ↑ or ↓ | 
| 行の複製 | ⌘⇧D | ^⇧D |

**使っていくうちに慣れていくと思うので積極的に使っていきましょう。**



#最後に
長々とお付き合いいただきありがとうございました。
ここまで読んだあなたは立派なAtom使いになっているでしょう！
パッケージやショートカットなどを自分の好きなように駆使して快適なAtomライフをお送りください。

上記であげた他にも便利なパッケージやショートカットは多くあります。
こちらの記事もぜひ読んでください。
[Atom初心者が感動して泣いた超オススメな機能](https://qiita.com/honnuq/items/bde50b291d0c7d0b23b1)
最初の設定の段階でいれておくと便利です。
【Rails5】DBからデータが削除されたことをテスト自動化するときの観点たち

# Introduction
Railsでデータを削除する機能をRSpecのSystem Testでテストしたときのメモ。
「削除対象のレコードが削除されていること」を確認するためにいくつかの観点から検証を実施してみました。

# 【観点１】対象を削除すると検索してもNotFound
```rb
[id=1のレコードを削除処理]
expect{Model.find(1)}.to raise_exception(ActiveRecord::RecordNotFound)
```
まずは素直に削除した対象を検索するとNotFoundになる検証。`find_by`を使っても同じように検証できます。
あんまり考えにくいですが、`id`が`update`された場合でも検証は通ってしまいます。

ちなみに今回の記事で一番メモしておきたかったのはこの`raise_exception`の書き方。
`expect{}`とブロックで記述しないといけないのがかなりつまずきポイントでした。

# 【観点２】対象を削除するとwhere検索しても0件
```rb
expect(Model.where(id: 1).count).to eq 1
[id=1のレコードを削除処理]
expect(Model.where(id: 1).count).to eq 0
```
次はwhereを使ってひっかかった数が0になることでレコードが削除されたことを検証する方法です。この場合でも、`id`が`update`されたケースは検証は通ってしまいます。
`where`なので1件に絞る必要はなく、例えばアソシエーションの全ての子要素を消す時の検証などでは使いやすい気がします。「User1に紐づく全Itemを削除」の場合は`expect(Item.where(user_id: 1).count).to eq 0`とすれば検証ができます。
一方で、`where`だとデータ量が多いとテスト実行の性能が悪くなったりするのかな。

# 【観点３】対象を削除するとレコード数が減る
```rb
count = Model.all.count
[いずれか１レコードを削除処理]
expect(Model.all.count).to eq (count - 1)
```
1レコード削除されれば総数が1減る、という検証です。これ単体では何が消えたのか定かではありませんが、観点１・２と合わせることで「`id`が`update`された」可能性をなきものとできる気がします。

# Conclusion
【観点１】or【観点２】でおおよそやりたいことはできました。【観点３】も合わせ技として複合すれば、間違ってほかのレコードも消していないことなども検証できるので安心安全です。
はじめてのC++【8日目】

#はじめに
みなさまコメントありがとうございます。
おかげで頭パンクするくらいの量の興味深い情報を得ることができました。
enum classやconstexprについては、明日じっくり理解を含めようと思います。

##ロベールのC++
###05-07 条件演算子
条件演算子は使ったことがあるので、軽く復習。

```条件式 ? trueの処理 : falseの処理```
この演算子は文の量が減るだけでなく、変数の確保や関数の重複使用などを避けることができるので、処理の軽減にもつながる。
ただし、読みにくくなるので読みやすさと天秤にかけろとのこと。
競プロにはいいけど、チーム開発時には不向きなのかな。

###05-08　デフォルト引数
デフォルト引数は関数のプロトタイプの方のみに書く。
関数の定義の両方に書くとビルドエラーになる。

```Default1(引数が静的な値かどうかを確認するプログラム).cpp
#include <iostream>

void Func(int a = 0)//デフォルト引数 a=0
{
  std::cout << (&a) << std::endl;
}
void Func2()
{
  Func();
}

int main()
{
  Func();
  Func2();
  Func();
}
```
実行結果
<img width="101" alt="スクリーンショット 2019-03-05 0.28.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/b41253bc-a798-69ee-eb94-b6cad41c7a11.png">
引数は関数を呼ぶたびに位置が変わる

**オーバーロードとデフォルト引数を併用したときの注意点**

```cpp
void Func(int a, int b);
void Func(int a, int b =0, int c = 0);
```
引数の個数が違うのでオーバーロードは成功する。
しかし、```Func(0, 1)```を呼び出すと、ビルドエラーになる。
一方、```Func(0)```や```Func(1,1,1)```を呼び出すことはできる。
これより、オーバーロードとデフォルト引数を併用するときは、呼び出しの区別ができるように注意する。

###静的と動的って？ 
静的と動的の意味がいまいち理解していないので、ちゃんと調べます。

とてもわかりやすいページがありました。
https://wa3.i-3-i.info/word11859.html

動的とは、大学の席
静的とは、小中高の席替えまで変わることがない自分の席

つまり、
動的変数：変数を使うときに陣地を確保して使い終わったら捨てる（使い捨て変数）
静的変数：最初に陣地を確保して最後まで同じ陣地を使う（使い回し変数）
ということみたい。

05-08のデフォルト引数が静的かどうかってうのは、実行結果の１行目と3行目が同じメモリ番地なので、静的ってことか。

#終わりに
あんまり進めなかったな
今日はおやすみなさい
明日また頑張る
はじめてのcreate-react-app

# 最終目標
フロントエンドとバックエンドのDB排他を調べてみたい。

# 今回の目標
Using React in Visual Studio Code の内容を実施する。
https://code.visualstudio.com/docs/nodejs/reactjs-tutorial

# OS環境
```shell
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:        18.04
Codename:       bionic
```

# 開発環境構築
```shell
$ sudo apt update
$ sudo apt upgrade -y
$ sudo reboot
$ sudo apt install nodejs
$ node -v
v8.10.0
$ sudo apt install npm
$ npm -v
3.5.2
```

# React環境構築
```shell
$ sudo npm install -g create-react-app
$ create-react-app --version
2.1.5
```

# Reactアプリ作成
```shell
$ create-react-app my-app
$ cd my-app/
$ npm start
```

# 外部アクセスのためポートを開放する場合(必要に応じて)
```shell
$ sudo ufw allow ssh
$ sudo ufw allow 3000
```

# Hello World!
```diff:src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';

-ReactDOM.render(<App />, document.getElementById('root'));
+var element = React.createElement('h1', { className: 'greeting' }, 'Hello, world!');
+ReactDOM.render(element, document.getElementById('root'));

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: http://bit.ly/CRA-PWA
serviceWorker.unregister();
```

# 感想
- モダンな開発スタイルのような気がする
- 次は、MERN Starterを調べてみたい
- AngularとVueも調べてみたい
- TypeScriptも調べてみたい

以上
パラメータが異なる関数のリストを作りたい

# 事象

Pythonで、ある関数のパラメータの値が一部異なる関数のリストを作りたい。
こんな感じ。

```python
f = lambda a, x: a * x
f_list = [
    lambda x: f(0, x),
    lambda x: f(1, x),
    lambda x: f(2, x)
]
```

で、そのまま次のように書いてみる。

```python
f = lambda a, x: a * x
f_list = [lambda x: f(a, x) for a in range(3)]
```

すると、 `f_list` の要素がすべて `lambda x: f(2, x)` になってしまった。
2行目の `a` の部分は0, 1, 2と代入されたものにしたい。

# 検証

なぜ同じ関数になってしまうのか確かめるために、 `f` を関数で書き直し、オブジェクトのidをprintしてみる。

```python
def f(a, x):
    print(id(a))
    return a * x

f_list = [lambda x: f(a, x) for a in range(3)]

f_list[0](1)
f_list[1](1)
f_list[2](1)
```

この結果は

```
id(a) = 140735854982000
id(a) = 140735854982000
id(a) = 140735854982000
```

`a` のidはすべて同じ、つまり、同じオブジェクトということ。
ラムダ式の中でのパラメータ `a` は、同じ参照になってしまうようである。

# 対策

同じ参照にならないように、 `functools` の `partial` を用いる。

```python
from functools import partial

def f(a, x):
    print('id(a) = ' + str(id(a)))
    return a * x

f_list = [partial(f, a) for a in range(3)]

f_list[0](1)
f_list[1](1)
f_list[2](1)
```

この結果は

```
id(a) = 140735854981936
id(a) = 140735854981968
id(a) = 140735854982000
```

異なるidになった。
これは、もちろん `f` をラムダ式に戻しても問題なし。

```python
f = lambda a, x: a * x
f_list = [partial(f, a) for a in range(3)]
```

# まとめ

関数を複製したい場合は、 `functools.partial` を用いればよい。
新しい現場に入ったときメモ

# これはなに？
エンジニア見習いの僕が新しい現場に入るときに行うことのメモ。

# サクラエディタ
### 設定
##### URL正規表現の追加
設定→タイプ別設定一覧→テキスト→設定変更
で以下の正規表現を入力し、色指定「URL」を選択。

正規表現：　/\\\\[^"\r\n]*/k

追加した正規表現を先頭に移動。

##### タブバーの表示
省略。

### マクロ
設定→共通設定→マクロ
でマクロ一覧に以下を追加し「設定」を押下。

##### 使い方：
置換したい部分を文字列選択。
ツール→登録済みマクロから実行。

```javascript:trimHalfSpaces.js
// CSV形式データのカンマ前後の半角スペースを削除する
function trimHalfSpaces(text){
  text=text.replace(/^ +/gm, "");
  text=text.replace(/, +/g, ",");
  text=text.replace(/ +,/g, ",");
  return text;
}

var text=Editor.GetSelectedString(0);
// マクロ呼び出し
text=trimHalfSpaces(text);
Editor.SetClipboard(0, text);
if(text!=="")Editor.InsText(text);
```

```javascript:formatSql.js
// SQLを簡易的に整形(あんまり動作確認してない)
function formatSql(text){
  // スペースの数を統一
  text=text.replace(/ +AND +/g, " AND ");
  text=text.replace(/ +FROM +/g, " FROM ");
  text=text.replace(/ +FULL +/g, " FULL ");
  text=text.replace(/ +RIGHT +/g, " RIGHT ");
  text=text.replace(/ +LEFT +/g, " LEFT ");
  text=text.replace(/ +INNER +/g, " INNER ");
  text=text.replace(/ +ON +/g, " ON ");
  text=text.replace(/ +WHERE +/g, " WHERE ");
  text=text.replace(/ +ORDER +/g, " ORDER ");
  text=text.replace(/ +GROUP +/g, " GROUP ");
  text=text.replace(/ +VALUES +/g, " VALUES ");
  text=text.replace(/ +SET +/g, " SET ");
  // 改行
  text=text.replace(/ AND /g, "\r\n  AND ");
  text=text.replace(/ FROM /g, "\r\nFROM ");
  text=text.replace(/ FULL /g, "\r\nFULL ");
  text=text.replace(/ RIGHT /g, "\r\nRIGHT ");
  text=text.replace(/ LEFT /g, "\r\nLEFT ");
  text=text.replace(/ INNER /g, "\r\nINNER ");
  text=text.replace(/ ON /g, "\r\n  ON ");
  text=text.replace(/ WHERE /g, "\r\nWHERE \r\n");
  text=text.replace(/ ORDER /g, "\r\nORDER ");
  text=text.replace(/ GROUP /g, "\r\nGROUP ");
  text=text.replace(/ VALUES /g, "\r\nVALUES ");
  text=text.replace(/ SET /g, "\r\nSET ");

  return text;
}

var text=Editor.GetSelectedString(0);
// マクロ呼び出し
text=formatSql(text);
Editor.SetClipboard(0, text);
if(text!=="")Editor.InsText(text);
```


# スタートアップマクロ
C:\Users\ぺけぺけ\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
とかに設定するbatファイル。

```bat:start.bat
@echo off
rem start.bat

start "" "C:\xxx\sakura.exe" "C:\xxx\text1.txt" "C:\xxx\text2.txt"
start "" "C:\xxx\Microsoft Outlook2010"
start "" "C:\xxx\Microsoft Excel2010"
start "" "C:\xxx\iexplore.exe"

pause
```

# トータスgit
- 差分比較にWinmergeを使用するよう設定。
- 以下を引数に指定。

```
-e -ub -dl 変更前:%bname -dr 変更後:%yname %base %mine 
```

# エクセル関数
随時追加。
### フルパスからファイル名のみ抽出
```
=mid(substitute(B6,left(B6,find(">",substitute(B6,"\",">",len(B6)-len(substitute(B6,"\",""))),1)-1),""),2,len(B6))
```
【備忘録】Railsを使って開発を始めたいと思った時の読み物

#これは何か
- Railsで開発を始めようとした時の環境構築あたりのtipsをまとめたもの

#参考情報
- [Rails開発環境の構築（複数バージョン共存可能）（Homebrew編）](https://qiita.com/yuitnnn/items/b45bba658d86eabdbb26)
  - Homebrewを使って、Railsをローカルインストールで抑えることで、複数バージョンを管理することができるようになる良記事

- [新規Railsプロジェクトの作成手順まとめ
](https://qiita.com/yuitnnn/items/b45bba658d86eabdbb26)
 - 若干、環境構築の話も出てきているが、どちらかというとRailsプロジェクトを始める時の進め方が書いてあってめちゃ助かる記事
【Rails】メールアドレスのバリデーション

ユーザー登録、編集ページの作成でメールアドレスに一意性を持たせるための処理をメモ。
コードは①→⑤の順で増やして書いている

#行ったこと
①存在性の検証
②フォーマットの検証
③一意性（メールアドレスが他のユーザーと被らないように）の検証
④データベースにemailの索引を持たせて、一意性を検証
⑤データベースに保存する前に小文字にする

###①存在性の検証

```ruby:user.rb
class User < ApplicationRecord
    
  validates :email, {presence: true}
    
end
```
###②フォーマットの検証

```ruby:user.rb
class User < ApplicationRecord
    
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, {presence: true, , format: { with: VALID_EMAIL_REGEX }}
    
end
```

###③一意性（メールアドレスが他のユーザーと被らないように）の検証

```ruby:user.rb
class User < ApplicationRecord
    
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, {presence: true, , format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }}
    
end
```
※`uniqueness: { case_sensitive: false }`で、一意性とメールアドレスの大文字・小文字の区別を無くしている

###④データベースにemailの索引を持たせて、一意性を検証
登録者が（クリックの連打などで）二重登録をしてしまった場合、容易に一意性が崩れてしまう場合がある。これを解消するには、データベースにインデックスを作る必要がある。

#####インデックスとは？
インデックスについては、この記事が個人的にはすんなり理解出来た！
https://qiita.com/viptakechan/items/03cb15684fdace0b5bbe

ここでいうインデックスは、インデックス＝索引。
調べたい用語が順番通りに整理されていることで、すぐに目的のページにいけるようにしている。
私の頭の中では、本屋さんで本のタイトルの頭文字を「a~z」に分類して、タグ付けで目的のタイトルを見つけやすいようにしているって感じです。

```ruby:
#マイグレーションでインデックスを追加する。
$ rails generate migration add_index_to_users_email
```

```ruby:マイグレーションファイル内
class AddIndexToUsersEmail < ActiveRecord::Migration[5.2]
  def change
    add_index :users, :email, unique: true
  end
end
```

```ruby:
#最後にmigrationする
$ rails db:migrate
```

###⑤データベースに保存する前に小文字にする
メールアドレスは大文字・小文字を区別しないので、データベースに登録前に小文字に戻す必要がある

```ruby:user.rb
class User < ApplicationRecord
  before_save { self.email = email.downcase }
    
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, {presence: true, , format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }}
    
end
```

#参考

・「RailsにおけるValidationの処理をまとめてみた」
http://somethingpg.hatenablog.com/entry/2013/12/23/085210
→こちらは情報は古いので、情報の選別は必要ですが流れは非常にわかりやすかったので参考にさせていただきました。

・「Railsチュートリアル ６章 ユーザーのモデルを作成する まとめ」
http://blog.livedoor.jp/i_nobuyuki/archives/34560997.html
→こちらは1年以内の比較的新しい記事。流れもわかりやすかったです。今度1回Railsチュートリアルじっくりと読んでみます。
めんどくさいことはWSLにやらせよう

# はじめに
本記事は、Windows端末を使用して、Excelでちょっとしたデータ抽出や集計を行っている場合、劇的に時短を行うためのTipsになります。
  
ITエンジニアとして仕事をしていると、システムから採取した何らかのログ等を使用して、集計を行ったりすることがあると思います。SIer業界で働くITエンジニアの場合、基本的に作業端末はWindowsを使用している方が多いのではないでしょうか。

実際の業務として、何らかの集計を行う場合、Excelを使用している方がほとんどだと思いますが、WSLを活用することで時短ができます。マクロは不要です。

## シチュエーション  
例えば、とあるシステムがあったとして、日時で何らかのログ（CSVのデータ）が出力されているとします。このログを1ヶ月分採取して、特定のエラーメッセージが日に何件出力されているか、また月の合計を求めることになった場合、どうしましょう。1個ずつCSVファイル開いて、中身をコピーして別ファイルに保存しますか？それとも、マクロ書きますか？

また、圧縮などが行われて、各フォルダ配下にファイルが生成されていたりすると、めんどくさいですね。。

**そんな時は、WSLを使いましょう！**

WSLって何？という人は、以前、書いた[WSL（Windows Subsystem for Linux）を使ってみた](https://qiita.com/Brutus/items/f26af71d3cc6f50d1640)を参考に、インストールしてください。

以下は、上記シチュエーションを解決するためのシェルです。
Windows端末上のWSLにログインし、集計データがあるディレクトリに移動して、当シェル実行すれば一発で終わります。

- totaling.sh

```bash
#!/bin/bash

## 検索対象とするファイルを設定し、配列に追加
target_file=^201902.*csv$
list=()

for i in `ls | grep ${target_file}`;do list+=(${i}); done
length=${#list[@]}

if [ ${length} -eq 0 ]; then
  echo ' *---------------------------------------------------------*'
  echo ' * 検索対象のファイルが存在しないため、処理を中止します    *'
  echo ' *---------------------------------------------------------*'
  echo ''
  exit 1
else
  echo ' *---------------------------------------------------------*'
  echo ' * 以下のファイルが検索対象になります　　　　　　          *'
  echo ' *---------------------------------------------------------*'
  echo ''
  for i in ${list[@]};do echo ${i}; done
fi

## 出力用ファイルを設定
output_file=test.csv

## 検索するキーワードを設定
keyword="err"

## 複数条件 orで検索したい場合
#keyword='キー\|キー'

log_search() {
for i in ${list[@]}
 do
  grep -r "${keyword}" ./${i} --exclude=${output_file} >> ${output_file}
 done
}

if [ ! -e ${output_file} ]; then
  log_search
else
  echo ' *---------------------------------------------------------*'
  echo ' * ファイルが存在するため、処理を中止します                *'
  echo ' *---------------------------------------------------------*'
  echo ''
  exit 2
fi

## 集計するためにcsvから取り出すフィールドをcountに設定
count=2

echo ' *---------------------------------------------------------*'
echo ' * 集計処理を行います　　　　　　　　　　　　　　          *'
echo ' *---------------------------------------------------------*'
echo ''

cat ${output_file} | cut -d "," -f ${count} | uniq -c
```

## 実践
例として、以下のようなCSVファイルがあるとします。
このCSVファイルは"番号","日","時間", "メッセージ"が出力されています。

![excel.png](https://qiita-image-store.s3.amazonaws.com/0/221759/d5346f0b-b2aa-d7b0-e8eb-b33f24cce216.png)

それぞれのCSVファイルに出力された、日毎に発生した特定のエラーメッセージを、時系列に1ファイルに出力して、集計処理の結果を出力します。

![wsl.png](https://qiita-image-store.s3.amazonaws.com/0/221759/b6bfff91-1c20-e58f-0513-2fa7f7221ee9.png)

2月27日は1件、2月28日は6件のエラーメッセージが確認できました。
また、出力されたtest.csvファイルには、日毎に発生した特定のエラーメッセージが、時系列に1ファイルに出力されたのがcatコマンドで確認できます。

# おわりに
今回は例として、2個のファイルで集計しました。これぐらいだったらExcelと大差ありませんが、対象ファイルの数が多い場合は効果を発揮します。また、集計処理は、cutコマンドを使用していますが、awkコマンドでも同じことできます。ただ、実際に業務で扱うデータというのは、データ抽出しにくい状況があるので、そういったときは、wcコマンドなどを上手く使うとよいでしょう。

重要なのは、Windows端末なのでExcelで作業するという固定観念を破壊して、新しいやり方を見出すことです。WSLが使用できるということは、Windows端末でLinuxのコマンドが実行できるということです。ファイルを検索する場合も、findコマンドで探したりすることができます。

本記事が、Windows端末で業務を行うITエンジニアの役にたてれば幸いです。
CodeBuild で Rails 5.2 * yarn

yarnまわりの設定でてこずったのでメモ。

ちなみに、bundlerバージョン回りがまだひっかかっている（Gemfile.lockに2.01 入るとアウト）　←　残TODO


```
version: 0.2

phases:
  install:
    commands:
      # Upgrade AWS CLI to the latest version
      - pip3 install --upgrade awscli

      # Setup for Yarn
      # https://qiita.com/t-koshi/items/a5de8f0ade08d00784bd
      - curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
      - sudo apt-get install -y nodejs
      - sudo apt-get update -y
      - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
      - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
      - sudo apt-get update && sudo apt-get install yarn
      - yarn

      # prepare env
      - cp .env.sample .env
      - sed -i -e 's/someone/build/' .env

      # Install Ruby dependencies from the Gemfile.
      # - bin/yarn
      - bundle install --path=vendor/bundle


  pre_build:
    commands:
      # Set the SECRET_KEY_BASE environment variable for running tests
      - export SECRET_KEY_BASE=$(rake secret)

      # Regenerate DB
      - bundle exec rails db:apply
      - bundle exec rails db:convert

      # Run the tests
      - bundle exec rubocop
      # - bundle exec rake test

  post_build:
    commands:
      - aws cloudformation package --template template.yml --s3-bucket $S3_BUCKET --output-template-file template-export.yml

      # Do not remove this statement. This command is required for AWS CodeStar projects.
      # Update the AWS Partition, AWS Region, account ID and project ID in the project ARN on template-configuration.json file so AWS CloudFormation can tag project resources.
      - sed -i.bak 's/\$PARTITION\$/'${PARTITION}'/g;s/\$AWS_REGION\$/'${AWS_REGION}'/g;s/\$ACCOUNT_ID\$/'${ACCOUNT_ID}'/g;s/\$PROJECT_ID\$/'${PROJECT_ID}'/g' template-configuration.json

artifacts:
  type: zip
  files:
    - template-export.yml
    - template-configuration.json
```


参考: https://qiita.com/t-koshi/items/a5de8f0ade08d00784bd
メソッド名の変更(Rename Method)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/fdaf5b9d-a029-52fa-35b6-44022684defa.png)


1つずつリファクタリング技法まとめ
個人的に簡単かつ取り入れ易いと思うものから

## 目的
すぐ引き出せるようにする

## 基本作業サイクル
- システムを動かして仕様を精査
- テストメソッドを作成
- テストの失敗を確認
- テストの成功を確認
- 小さい変更、随時テスト実行(パターン追加失敗確認->成功確認)
- 最後テスト実行
- 最後動作確認

## メソッド名の変更(Rename Method)とは
メソッド名からメソッドの目的が分からないときにメソッド名を変更すること
 
## ポイント
- メソッド名が略されすぎてよく分からない
- 微妙なニュアンスを追加したい(品詞を追加した方が分かりやすい)

## 例
- メソッド名が略されすぎてよく分からない

```
def creca_pt
  puts @point
end

```
　　　↓

```
def credit_card_point
  puts @point
end
```
- 微妙なニュアンスを追加したい(品詞を追加した方が分かりやすい)

```
def telephone_number
  puts @office_number
end
```
　　　↓

```
def office_telephone_number
  puts @office_number
end
```

## 書籍情報
Jay Fields (著), Shane Harvie (著), Martin Fowler (著), Kent Beck (著),
長尾 高弘(訳), リファクタリング:Rubyエディション
https://amzn.to/2VlyWML

## 雑感
Rubyは提供されているメソッドが略されすぎて、微妙に分かりにくいものが結構ある気もする
WSLでも通常のLinuxでもdockerにマウントできるカレントパスを取得する

# 概要

WSL上でdockerを使用する場合、docker for windowsに接続して使用する事が一般的かと思います。
ここで、一番厄介なのがボリュームのパスです。
docker for windowsはwindowsの世界で動いているので、マウントするボリュームパスとしてはwindowsのパスを指定する必要が有ります。
WSL上のshellから「カレントディレクトリの内容をdockerに食わせたい」と考えた場合、パスの形式が違うので一度変換する必要が有ります。
スクリプト等でこれをやろうとする、WSLと普通のlinuxで書き方が変わってしまってややこしいので変換関数を作りました。

# 変換補助関数

以下が今回作成した補助関数です。
これを使うと、WSLの場合は、現在のパスがwindowsのパスとして取得されます。

```shell

function getPWD(){
    local t_PWD=`pwd`
    if [ -f /proc/sys/fs/binfmt_misc/WSLInterop ]; then
        echo `wslpath -w $t_PWD`;
    else
        echo $t_PWD
    fi
}
```

# 使用イメージ

カレントディレクトリをlocalにマウントする

```shell
pwd=`getPWD`
docker run --rm -v ${pwd}:/local ${DOCKER_IMAGE}
```
僕が使ってるVSCodeの拡張機能

VSCodeの拡張機能で気に入って使っているものをまとめておく

# Markdown Preview Enhanced

Markdownのリアルタイムプレビュー用に入れたプラグイン。
コードブロックに`puml`を指定すると、直接PlantUMLの図を埋め込めたり、LaTeX・MathJaxで数式表記できたりと、ドキュメント作る時に定期的に活躍している。
https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced

# Paste Image

クリップボードの画像を直接貼り付けできるようになるプラグイン。Markdown Preview EnhancedでReadmeを書くときにスクショをドキュメントに張る時などに威力を発揮する。
https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image

# Python

Pythonスクリプトをデバッグする用に入れたプラグイン。
IDEチックにブレークポイント設定してデバッグができる他、Jupyterも使うことができ、
>
```
#%%
>
a = "hoge"
>
#%%
>
b = "fuga"
>```

こんな感じに`#%%`を入れると、そこをセルと認識してくれる。当然実行環境として、Python及びJupyterは必要だが、汎用的なのでJupyterはグローバル環境に入れておいていいと思う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/ee7780a0-c56e-650e-3d59-df61aada94da.png)

https://marketplace.visualstudio.com/items?itemName=ms-python.python

# Vim

Vimのキーバインドが使えるようになるプラグイン。Vimmerにあこがれて入れてみたら、慣れてきて手放し難くなった。
慣れればタイピングは早くなるので、Vimに抵抗がなければ入れていいと思う。
https://marketplace.visualstudio.com/items?itemName=vscodevim.vim

# RainbowCSV

csv/tsvなど表形式のファイルをカラムごとに色分けして表示してくれるプラグイン。SQLチックにフィルタかけたりソートしたりできるのが結構便利。
https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv


# おわりに

とりあえずいつも使っているのをピックアップしてみた。
お気に入りが増えたり変わったりしたら都度更新するつもり。
JavaScriptのmap(), filter(), reduce()をちゃんと理解する。

## モチベーション
最近、Next.jsを学び始めました。その際に、APIからfetchしたデータを表示する時など、`map()`や`filter()`を使うことがあり、自分自身ちゃんと理解していないと感じました。なので調べたことをまとめます。

## まずはアロー関数
`map()`, `filter()`, `reduce()`を使うにあたり、アロー関数を使います。`=>`を使ったアレですね。

[MDNの公式ドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions)によると、「アロー関数式は、より短く記述できる、通常の function 式の代替構文です。また、this, arguments, super, new.target を束縛しません。アロー関数式は、メソッドでない関数に最適で、コンストラクタとして使うことはできません。」とあります。

ようするに、functionを簡易に記載する方法ですね。

例えば2つの引数を受けて合計するというfunctionがあるとします。


```js

const addWithFunction  = function(x, y) {
	return x + y;
}

addWithFunction(1, 2) //3
```

`function`を使った、まずはじめに学ぶ基本的な関数の記法です。

アロー関数を使うことで、簡略化して書いてみます。


```js

const addWithAllow = (x, y) => {
	return x + y;
}

addWithAllow(1, 2) //3
```
`function`が省略され、 `=>`という部分が追加されました。`=>`は関数内での処理部分を示すようです。

さらに処理部分が上記のように`return`の1行だけ、のような場合、`{}`も省略できます。

```js

const addWithAllowAbbre = (x, y) => x + y;

addWithAllowAbbre(1, 2) //3
```
注意するのは、`return`があると`Uncaught SyntaxError: Unexpected token return`になることです。

引数がない場合でも`()`は必要なので

```js

const test = () => console.log('test');
```
のようになります。

アロー関数が理解できたところで、map()から見ていきましょう。

## map
[MDN公式ドキュメントのmapのページ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)では、「map() メソッドは、与えられた関数を配列のすべての要素に対して呼び出し、その結果からなる新しい配列を生成します。」とあります。写像ですね。

例えば、APIから配列としてデータを全件取得して、それらをレンダリングさせるといったことがWeb開発では多いと思います。そんなときは`map()`を使います。

簡易な例として、「1から10までの数字を全て2倍する」ということを考えてみます。

```js

const nums = [...Array(10)];
nums.map((v, i) => i+1).map((i) => i*2); // [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
```
まず1から10の数字が格納された配列を`map()`を使って生成し、再度`map()`で2倍しています。
## filter
次に`filter()`です。[MDNの公式ドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)では「引数として与えられたテスト関数を各配列要素に対して実行し、それに合格したすべての配列要素からなる新しい配列を生成します。」とあります。

僕がnext.jsを学んでいて生じた用途としては、ページネーションで、現在表示しているページは非表示にするというものでした。

再度、簡単な例を考えてみます。「1~ 10までの数字のうち、奇数のみを取り出す」としましょう。

```js

const nums = [...Array(10)];
nums.map((v, i) => i+1).filter((i) => i%2 != 0); // [1, 3, 5, 7, 9]
```
ちゃんと条件に合致した数字のみを取り出して配列を生成しています。

## reduce
最後に`reduce()`を見ましょう。
[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)では「reduce() は配列の各要素に対して（引数で与えられた）reducer 関数を実行して、単一の値にします。」とあります。

`map()`との違いは、`map()`は全要素に対してある処理をした結果を配列として返却するのに対し、`reduce()`はある配列の全要素を処理した結果を単一の値として返却することです。

例えば、「1 ~ 10までの数を合計した値を求める」ことを考えます。

```js

const nums = [...Array(10)];
nums.map((v, i) => i+1).reduce((a, b) => a+b); // 55
```
はじめにa, bには1, 2が入り 1+2で3となります。次にその3と、配列に格納されていた3が入り6になり・・・と処理をしていくようです。

## まとめ
はじめにアロー関数について学びました。
次に`map()`, `filter()`, `reduce()`について概要と例を見ました。

これらの関数は非常によく使うとのことなので、処理の仕方をちゃんと理解し、日々のコーディングに活かしていきたいですね。

ご指摘や間違いがあるようでしたら、コメントをいただけると非常に嬉しいです！
Vagrant使うと何が嬉しいの？

#はじめに

[実践 Vagrant](https://www.amazon.co.jp/gp/product/4873116651/)を読んで少し使い方が少しわかった記念に、Vagrantの紹介をします。

#Vagrant道

vagrantfileを取得して、コンソールに```vagrant up```と叩けば、完璧な開発環境が手に入るようになっています。
（前提条件としては、Virtualboxなどの仮想化ソフトとVagrantの設定などが必要です。）
Mac/Windows/Linuxなどどの環境でも、まったく同じ環境での開発ができます。

```
「僕のマシンでは動いていたのに」バグはなくなります。(1.2 Vagrant道より)
```

実際のところ、Vagrantは仮想化ソフトをコマンドラインでコントロールするアプリケーションなので、仮想化ソフトの強みをそのまま持っています。vagrantfileを行うユーザーにもコマンド一発で動くように要求してます。

#で、具体的に何が嬉しいの
- 開発環境の配布
- サーバ群の構築
- AWS EC2の構築

こんなところだと思います。

##開発環境の配布
設定ファイルであるvagrantfileとその他設定ファイルをgitで管理すれば、開発メンバーは```git clone```して、```vagrant up ```すれば確実に開発環境が構築できます。
```npm install```も一発で開発環境が作成できそうですが、実際、グローバルにインストールすべきモノやその中でも複数バージョンのインストールが難しいミドルウェアが競合したりといった問題はがあります。OS丸ごと構築するvagrantにはその問題がありません。

とはいえ、virtualboxのバージョンなどVagrant周りで問題がないわけではなさそうです。

また、共有フォルダの機能を使えば、コンパイル／テストはVagrantで構築した安定した環境で行い。開発は、慣れたOS、カスタマイズされたエディタで快適に行えます。

##サーバ群の構築
本番機の構成がweb/API/DBなどの複数台構成になっていたら、開発環境も合わせる方が無難です。Vagrantでは、そのような構成も可能です。

しかし、例えば３つもサーバを立ち上げるとリソースを取りすぎるため、Dockerを利用した方がよさそうです。(Dockerについては良く知りませんので見当違いだったら指摘ください。)

##AWSの構築
開発ばかりがvagrantの使いどころではありません。AWS EC2の構築もできます。「実践 Vagrant(F5)」には、手作業で行っているEC2の構築が自動化され、共有化されるので、継続的インテグレーションが行えるとしています。

先ほどのサーバ群もAWSならリソースの問題はなさそうです。(替わりにカネというリソースをとる)

#おわりに
実際どう描くのか書いてある記事は多かったのですが、どう使うかの説明はあまりなかったので書いてみましたが、端的に書くのは難しいですね。気が向いたらVue.jsの開発環境をVagrant上に作って公開しようと思います。(要望があればうれしいです。)

あと質問のコメントくださればできる範囲でお応えします。
ESXi on nested Nutanix

# 2020 04 20追記
~~最新版のNutanix CE 2019.11.22ではNest環境ができない可能性があり検証中です。~~
~~具体的には、VMのBIOSにおいて仮想化機能が有効化されていない可能性があります。~~

~~ESXi6.7ををインストールしようとした際に現状ではこのような紫画面が表示されてしまいます。~~

Esxi6.0/6.5ではインストールが可能です。
Esxi6.7ではできませんでした。440fxのドライバーが削除されている模様です。



![ERog2hHVUAIQji9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293379/88ddee95-9f20-9048-f3e9-400c2eecef36.png)




#タイトルの英語が間違っていたので直しました。
~~(恥ずかしい...)~~
#はじめに
CPU世代に対応していないEsxiはインストールできません。
ストレージのパフォーマンスがあまりよろしくありません(後述)ので、主に検証用途で使用したほうが良いと思います。

#インストール前作業
・UEFI(BIOS)上にてCPUの仮想化命令を有効化する

Intelの場合はIntel vt-x (Intel(R) VirtualizationTechnology)
AMDの場合はAMD-V(AMD SVM)

・インストーラーISOファイルをアップロードする。

#構築1(prismから)
・通常の仮想マシンを作る方法と同じに作成
・DISKは必ずIDEモード
・NICをつけない状態で作成

#構築2(cvmから)
・仮想マシンのホスト上にあるCVMのIPアドレスへSSH接続
(わからない場合は一度起動するとどのホストにあるかわかると思います。)

下記コマンドを実行

```
acli

先頭が<acropolis>になる

<acropolis>vm.nic_create <仮想マシン名> network="vlan 0" model=e1000
<仮想マシン名>: complete

<acropolis>vm.update <仮想マシン名> cpu_passthrough=true
<仮想マシン名>: complete

```
具体的にには、NICのドライバーをe1000に指定し、intel nicのドライバーを使ってあげ、CPUをきちんと見せてあげます
#構築3(Console上から)
・通常のEsxiのインストーラーが走ると思います。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/293379/238d1a3f-7d1f-8396-9bee-bbb9cff6f590.png)


#ストレージのパフォーマンス
・はっきり言ってNutanixのパフォーマンスを生かし切れてません。なぜなら、IDEモードのドライバーがPIIX3 for 430HX IDE Controllerであるからです。。。
1996年に登場したやつです。CPU世代で言うならば確かSocket7世代のPentiumぐらいです。。。めっちゃ古いです。
インストールするドライバーを組み込めば高速化するでしょうが...
とりあえず動かすだけならこれでも行けます。
設定の変更や、ドライバーの組み込みに詳しい方がいらっしゃればコメントをお願いします。


#余談

・NICは通常のGUIから操作するとEsxiのインストーラーからは見えません。

・何もせずにインストールすると
![パープルスクリーン.png](https://qiita-image-store.s3.amazonaws.com/0/293379/ab59cb84-59e0-0d31-bb0d-0772ed9ef8c0.png)

まぁ、こなります。
カーネルを見るとPentium4の中でも第三世代に当たるPrescottのようです...

以上
クリックした位置の node を取得する方法 [クロスブラウザ対応]

クリックした位置の node を取得する方法を勘違いしていたのでメモ。

```javascript
const sel = window.getSelection()
const range = sel.getRangeAt(0)
```

この `window.getSelection()` と `getRangeAt(0)` を使うことで選択しているテキストの node 範囲を取得することができる。非常に便利。これをクリックイベントで使うことでクリックした位置の node も取得できるのだけど iOS Safari ではなぜか取得できない現象に衝突。

普通に選択したり `textarea` など入力フォームでフォーカスされていれば正常に取得はできるが、なんでもない DOM の場合は取得が下記のようなエラーメッセージでできなかった。

```
IndexSizeError: The index is not in the allowed range.
```

iOS Safari でクリックした位置の node を取得するには `document.caretRangeFromPoint()` を使う。ただし `caretRangeFromPoint` は標準ではないので仕方なく使う感じ。


```javascript
document.querySelector('.example').addEventListener('click', e => {
  // これはだめ
  // const sel = window.getSelection()
  // const range = sel.getRangeAt(0)

  const range = document.caretRangeFromPoint(e.clientX, e.clientY)
})
```

これで iOS Safari でもクリックした位置の node が取得できる。

ただし、Firefox では `caretRangeFromPoint` はサポートしていないので（Chrome はサポートしている）、別の方法を使う。

```javascript
if (document.caretRangeFromPoint) {
  range = document.caretRangeFromPoint(e.clientX, e.clientY)
} else {
  range = document.createRange()
  range.setStart(e.rangeParent, e.rangeOffset)

  // もしくは
  // range = document.caretPositionFromPoint(e.clientX, e.clientY)

  // もしくは
  // const sel = window.getSelection()
  // range = sel.getRangeAt(0)
}
```

Firefox の場合はクリックしたイベントオブジェクトに `rangeParent` と `rangeOffset` が生えているので、これを元に Range オブジェクトを作成すれば同様の node が取得可能。

また `caretPositionFromPoint` を使って（字面が似てるけど Range と Position と違う）取得することも可能。ただし、これは Range オブジェクトじゃなくて CaretPosition オブジェクトが返ってくるので注意。

ただクリックした位置の node と考えると Range オブジェクトである必要はないので、基本は `caretPositionFromPoint` で CaretPosition を取得するのを軸にして、対応していないブラウザの場合は `caretRangeFromPoint` で逃げるというのが現時点での対応方法かな。
水上ドローン 作りたい  6、パーツ組み込み1 ラズパイ本体

# コンポーネントの搭載
各コンポーネントをボートに組み込んで行きます。組み込むコンポーネント、パーツは以下の通り。

- Rasberry PI ZERO WH本体
- Rasberry PI ZERO WH用電池(単3×4)
- 5V昇圧、USB変換モジュール
- モータードライバ(TA7291) × 2
- モーター用電源(単3×3) × 2
- カメラ
- ネット回線用USBアダプタ(LC-02)

## 配置
コンポーネント毎の配置先を紹介します。
### Rasberry PI ZERO WH本体、5V昇圧、USB変換モジュール、Rasberry PI用電池
甲板に置きました。ボートの後ろ寄りは横幅があるので、ラズパイを横に配置することが出来ます。電源は前方の電池ボックス->5V昇圧、USB変換モジュール->はマイクロUsB変換アダプタを経由してラズパイに入力されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359316/1d2e0910-604e-aeda-11f1-615888505b35.png)

#### 固定方法
あくまで借り止めのつもりだったのですが、結局最後まで耐震ジェルを使ってました。
[IB Dragon(アイビードラゴン)耐震マット 無色透明 2mm厚×5cm角 4枚入り TM-3007](https://www.amazon.co.jp/gp/product/B00L2ZPLE2)
そこそこひっついて何時でも剥がせる。粘着力が落ちれば洗って乾かせばOK。尚且つ電気も通さない(多分)ので、Rasberrry Piの背面に貼り付けてボートとひっつけてました。※本当はあんまりいい手じゃ無いと思う。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359316/b8fa477b-66be-028e-8c58-daf602b120ae.png)

耐震ジェルは本当に便利！いろんなところの仮止めに使ってました。
[Rails] 年齢で範囲検索する

# やりたいこと

誕生日を格納するための Date 型の birthday 列を持つ User モデルがある。ある年齢からある年齢までの User を検索したい。

# 方法

## 実装例

次の User モデルで User.by_age として実装している。

```rb
class User < ApplicationRecord
  # ある年齢 from からある年齢 to までの User を検索する。
  scope by_age, (lambda do |from: 0, to: 999, today: Date.today|
    # 今日のちょうど to 年前の日付の 1 日後から
    date_from = today.ago((to + 1).years).since(1.day)
    # 今日のちょうど from 年前までを検索する。
    date_to = today.ago(from.years)

    where(birthday: date_from..date_to)
  end)

  # 年齢を (簡易的に) 計算する。
  # TODO: うるう日やうるう秒を考慮する。
  def age(today = Date.today)
    ((today.to_time - birthday.to_time) / 1.year.seconds).floor
  end

  def formatted_birthday
    date = birthday.strftime('%Y/%m/%d')
    wday = %w[日 月 火 水 木 金 土][birthday.wday]

    "#{date} (#{wday})"
  end
end
```

## 実行例

![zu.png](https://qiita-image-store.s3.amazonaws.com/0/6697/bcf68b19-54ff-fab0-6e10-ccdf60a843d4.png)

```rb
# (あえて境界値がうるう日前後になるように)
# 今日の日付が 2020/02/29 (土) だと仮定する。
today = Date.parse('2020/02/29')

User.order(:birthday).each do |user|
  puts("#{user.formatted_birthday} #{user.age(today)} 歳 #{user.name}")
end
# 1989/02/28 (火) 31 歳 ピカチュウ
# 1989/03/01 (水) 30 歳 カイリュー
# 2000/02/29 (火) 20 歳 ヤドラン
# 2000/03/01 (水) 19 歳 ピジョン

# 20 〜 30 歳の User を検索する。
User.by_age(from: 20, to: 30, today: today).pluck(:name)
#=> ["カイリュー", "ヤドラン"]
```
CS193p class Note 2: MVC

##### MVC:
- Model: What your application is (but not how it is displayed). It's UI independent.
  1. The Model and View should never speak to each other.
  2. Models use notification or KVO (like a broadcast mechanism) and controllers (or other Model) tune in to interesting stuff.
  
- Controller: How tour model is presented to the user (UI logic)
  1. Controllers can always talk directly to their Models
  2. Controllers can also talk directly to their View.
  3. Controllers are almost always that data source.
  4. Controllers interpret/format Model information for the View.
  
- View: Your controller's minions
  1. View can talk to the controller in a communication sort of "blind" and structured. 
  2. The View sends the action when things happen in the UI.
  3. The Controller sets itself as the View's delegate. The delegate is set via a protocol (i.e. it's blind to class).
  4. Views do not own the data they display


##### Struct v.s. Class
1. Struct has no inheritance
2. Struct is value-type. It gets copied when the data is passed around. The basic types of Swift are all structs, such as Array, Dict, Int and so on. 
3. Class is reference type. When you pass around the data, you only pass the pointer.

#####Memo:
1. API (Application Programming Interface)
2. Class gets a free initializer with no arguments if all its properties are initialized. 
3. Struct gets a free initializer which initializes all its properties.
4. Array, String, Countable range are all sequences and can be used in for loop.
5. "static" function is tied to type. 
6. "lazy" keyword means the code doesn't actually initialize it until someone uses it. We can't use property observer (didSet) when using lazy
7. arc4random_uniform is a random generator for Swift