1.21 jigowatts

Great Scott!

Ruby CSVの書き込みと読み込み

Tips

CSVの読み書き

require 'csv'

# 文字列への書き込み
csv_string = CSV.generate do |csv|
  csv << [1,'Alice',18]
  csv << [2,'BoB',21]
  csv << [3,nil,nil]
  csv << [4,"",""]
end

# 文字列からの読み込み
CSV.parse(csv_string) do |row|
  p row
end

puts "*" * 30
# ファイルへの書き込み
arr_of_arrs = [[1,'Alice',18],[2,'BoB',21],[3,nil,nil],[4,"",""],[5,'Catherine',34],[6,'Diana',46]]

CSV.open('output.csv','w') do |csv|
  arr_of_arrs.each do |arr|
    csv << arr
  end
end

# ファイルからの読み込み
CSV.foreach('output.csv') do |row|
  p row
end

NASAのデータを取り込んでみる

f:id:sh_yoshida:20161123031652p:plain

リファレンスマニュアルを読んで試してなんとなく動かせたので、先日知ったNASAのオープンデータをCSVで落として無駄に読み込んでみたくなりました。

open.nasa.gov

いろんなデータがあって、どれが何だかよくわからなかったので最も人気がありそうな隕石落下データを使ってみることに。

https://data.nasa.gov/Space-Science/Meteorite-Landings/gh4g-9sfh

Excelで開いてみるとこんな感じ。名前、質量、落ちた年、緯度、経度。あとはなんだろ、よくわかりませんが隕石のデータですね。4万5千件ほどあります。

f:id:sh_yoshida:20161123025458p:plain

Meteorite Landingsとかクソかっこいいデータだけど、CSVでExportしてきて読み込むだけで申し訳ない。

やっぱり生のデータを使うとうまく行かないことが出てきますね。エンコーディングでハマり、nilのデータでハマり、ヘッダーの扱い方、関係ないけど文字列のフォーマット指定での日時変換などだいぶ寄り道しちゃいました。

require 'csv'
require 'time'

# 一度に読み込み
csv_data = CSV.read('Meteorite_Landings.csv',headers: true,encoding: 'UTF-8')

target = Time.parse("1925/01/01")

puts csv_data.select{|row|
    unless row["year"].nil?
      Time.strptime(row["year"],"%m/%d/%Y") == target
    end
    }

実行してみると1925年の隕石情報が出ました!

f:id:sh_yoshida:20161123032308p:plain

NASAすごいです。

Visual Studio 2017 RC をインストールする

概要

先日発表があった「Visual Studio 2017 Release Candidate」を早速インストールします!

ダウンロードは以下から。
https://www.microsoft.com/ja-jp/dev/products/visual-studio-2017.aspx

f:id:sh_yoshida:20161118205859p:plain

創造は想像のはるか先へ

なんかカッコイイですね。お先失礼します。

つーことで、vs_Enterprise.exeをダウンロードします。これがインストーラーですね。

インストール

インストーラーを起動しましょう。

続行を押下。

f:id:sh_yoshida:20161118205951p:plain

数分待ちます。体感で5分くらい待ちました(適当)。

f:id:sh_yoshida:20161118205955p:plain

ワークロードから必要なものだけを選んでいくわけですね。

f:id:sh_yoshida:20161118210004p:plain

なんかいろいろあるな...。

f:id:sh_yoshida:20161118210018p:plain

とりあえずWeb開発だけチェックをいれてインストール。

f:id:sh_yoshida:20161118210017p:plain

1 時間 50 分で、何をしよう?

インストールの所要時間を、
これまでの 2 時間からわずか 10 分まで短縮しています。

なにそれ、すごい!

f:id:sh_yoshida:20161118210442p:plain

インストールに二時間かかりました。きっとうちのパソコンのせい。

f:id:sh_yoshida:20161118210357p:plain

リリースノートはこちら(まだ読んでない)。
https://www.visualstudio.com/ja-jp/news/releasenotes/vs2017-relnotes

起動

アカウントのサインイン画面で情報入力したら動かなくなったけど、二段階認証のせい?
わかんないので再起動して、サインインはスルーしました。

f:id:sh_yoshida:20161118210458p:plain

配色テーマは青を選んだはずだけど、VS Community 2015の設定が効いたのかも?濃色になりました。

f:id:sh_yoshida:20161118210516p:plain

早速新規プロジェクトを作成してみます。あれ、.NET Coreがないぞ。

f:id:sh_yoshida:20161118210529p:plain

.NET Coreはワークロードの「.NET Core および Docker(プレビュー)」を選択しておかないと入らないぽい。
https://www.microsoft.com/net/core#windowsvs2017

ということで、再度インストーラーを立ち上げ(また体感で5分くらい待つことに)「.NET Core および Docker(プレビュー)」にチェックを入れて変更。

f:id:sh_yoshida:20161118210547p:plain

これだけならすぐ終わりました。10分くらい。

f:id:sh_yoshida:20161118210610p:plain

でました!.NET Core。クロスプラットフォーム。Write once, run anywhere!*1

f:id:sh_yoshida:20161118210623p:plain

せっかくなのでASP.NET Core Webアプリケーションを作成してみます。

f:id:sh_yoshida:20161118210640p:plain

動きました!

f:id:sh_yoshida:20161118210648p:plain

*1:Javaのプログラムがオペレーティングシステム (OS) などのプラットフォームに依存しないという意味の、サン・マイクロシステムズJavaのスローガンである。 Write once, run anywhere - Wikipedia

Ruby 日付のフォーマット

Tips

24時間制

個人的にこの表記が一番使います。むしろ、これだけ覚えておけばいい!でも忘れる。。

# 24時間制
Time.now.strftime("%Y-%m-%d %H:%M:%S")
#=> "2016-11-16 07:09:22"

その他

いろいろありますね。たまーに使うくらい?お、今日は今年321日目なんですね!

# AM/PM + 12時間制
Time.now.strftime("%Y-%m-%d %p %I:%M:%S")
#=> "2016-11-16 AM 07:09:35"

# 日付
Time.now.strftime("%x")
#=> "11/16/16"

# 日時
Time.now.strftime("%c")
#=> "Wed Nov 16 07:17:28 2016"

# タイムゾーン
Time.now.strftime("%Z")
#=> "JST"

# 年中の通算日数
Time.now.strftime("%j")
#=> "321"

# 曜日の名称
Time.now.strftime("%A")
#=> "Wednesday"
 
# 曜日の名称(省略)
Time.now.strftime("%a")
#=> "Wed"

# 月の名称
Time.now.strftime("%B")
#=> "November"

# 月の名称(省略)
Time.now.strftime("%b")
#=> "Nov"

日本語の曜日

これはひと手間かける必要があるみたい。Rubyらしくないコードかも。

def wday_jp(n)
  %w(日 月 火 水 木 金 土)[n]
end

Time.now.strftime("%Y-%m-%d %p %I:%M:%S #{wday_jp(Time.now.wday)}")
#=> "2016-11-16 AM 07:33:46 水"

参考

Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)

Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)