RickBlog

恩返し

カレンダー作成問題[Ruby]

こちらの記事の1問目をやってみた。 blog.jnito.com

require 'date'

#今日
d = Date.today
#今月と今年
m_y = d.strftime("%B %Y")
#月初の曜日
fd = Date.parse(Date.today.strftime('%Y-%m-01'))
fd = fd.strftime("%a")
#月末の日付
ld = Date.new(Time.now.year, Time.now.month, -1).day

puts "      " << m_y
puts " Su Mo Tu We Th Fr Sa"

array = [] 
for num in 1..ld do
    array << num.to_s.rjust(3)
end
case fd
    when "Sun" then
       print ""
       blank_day = 0
    when "Mon" then
       print "   "
       blank_day = 1
    when "Tus" then
       print "      "
       blank_day = 2
    when "Wed" then
       print "         "
       blank_day = 3
    when "Thu" then
       print "            "
       blank_day = 4
    when "Fri" then
       print "               "
       blank_day = 5
    when "Sat" then
       print "                  "
       blank_day = 6
end

array.each do |day|
    print day
    day = day.to_i + blank_day
    if day.to_i % 7 == 0 then
        puts ""
    end
end

puts ""

fdのところがかなりいまいちだとは思った。

解いた方の記事を見た。 qiita.com

リファクタリングした。

require 'date'

#今日
d = Date.today
#今月と今年
m_y= d.strftime("%B %Y")
#月初の曜日(0~6)
fd = Date.new(d.year,d.mon,1).wday
#月末の日付
ld = Date.new(d.year, d.month, -1).day

puts "      " << m_y
puts " Su Mo Tu We Th Fr Sa"

array = [] 
for num in 1..ld do
    array << num.to_s.rjust(3)
end

fd.times do
    print "   "
end

array.each do |day|
    print day
    day = day.to_i + fd
    if day.to_i % 7 == 0 then
        puts ""
    end
end

puts ""

曜日を0~6の値で表すことでだいぶすっきりした!

ぐるなびAPIを使って、営業時間がすぐにわかる飲食店検索サイトを作った。

ぐるなびAPIを使って、営業時間がすぐにわかる飲食店検索サイトを作った。

めしタイム

f:id:rickbox:20190319231621p:plain

めしタイムの作成中に考えたことや、やったことを書いていく。

なぜ作ったか

  • 役に立つwebアプリを作ってみたかった
  • ある特定の飲食店の営業時間を知りたいときに、スマホでググって大手グルメサイトのページに飛んで、下にスクロールという操作を簡略化したかった

なぜぐるなびAPIを使うのか

使用ケースの例

  • ある特定の飲食店の開店時間、または閉店時間を知りたいとき
    検索キーワードの例「新小岩 牛角
  • その地域または駅付近で朝早くからやっている、または夜遅くまでやっている店を知りたいとき
    検索キーワードの例「目黒駅 居酒屋」

使った技術

Herokuは無料プラン

Herokuのdynoスリープ回避方法

.envを使用したときの注意点

最初のリリースまでにかかった時間

  • 10時間程度
    最初に公開したのは3月4日

ユーザーからフィードバックを頂いた

  • チャットサイトを使ってユーザーを集め、フィードバックを頂いた

ユーザーフィードバックの抜粋

  • どんなキーワードを入力すればいいのか分からない
  • 検索画面が簡素すぎて食欲が湧かない
  • 地域指定を入れてほしい
  • 食事関係なのにTwitter色はどうなのか
  • シンプルすぎてなんか怪しい
  • 検索した後の表示が遅い
  • トップページを見て何のサイトか明確じゃない

ユーザーフィードバックをもとに修正

  • place holderの文字を変更した
    「キーワードを入力」→「キーワード(駅名、店名、料理名など)を入力」

今後修正したい箇所

  • ページネーションをページが切り替わるのではなく、「もっと見る」ボタンを押したら、下に表示されるようにしたい
  • 検索した後のレスポンスが遅いのでなんとかしたい

ユーザー数とPV

(リリースから2週間経過)

まとめ

  • 作るの面白い!!

Selectではなく、Withを使う。[VBA]

Sheets("Sheet1").Activate
Range("4:4").Select
Range(Selection, Selection.End(xlDown)).ClearContents

上のコードは、以下のようにWithを使うとSelectを使わず書ける。

With Sheets("Sheet1")
.Range(.Rows("4:4"), .Rows("4:4").End(xlDown)).ClearContents
End With

Selectを使わない方が処理が早い。

VBAと100時間向き合って気づいたこと

VBAは、「Visual Basic for Applications」の略で、MicrosoftMS Office拡張機能として提供しているプログラミング言語

VBAでのツール作成に費やした100時間で、学んだことや思ったことについて書く。

  • Option Explicitを使うと、変数を必ず宣言しないといけなくなる
  • 処理の前に
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    処理の後に
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    を書けば処理が早くなることが多い
  • 処理を早くしたければselectを使わない
    (例)
    Range("A1").Copy Range("B1")
    A1をB1にコピー
  • Withを使うことによってコードを簡略化できる

  • フィルターの絞り込みを複数条件でやりたい場合は配列を使う

  • 文字の結合は「&」ではなくjoinを使ったほうが圧倒的に処理が早い
  • 他人のコードが読めない場合はデバッグで1行ずつ見てみる
  • 1から作ることができない場合は、「マクロの記録」でやりたいことをやってみて、生成されたコードをリファクタリングする

結論 

調べれば、作れる。

調べればだいたいのものがそこそこのクオリティで作れるという自信がついた。
0.5秒かかっている処理を0.1秒に縮める(そこそこではなく、極限まで処理を早くする)、みたいなことは難しいと思った。

動画のツイート情報の取得(Twitter gem)[m3u8&ts]

Twitter 6.2.0を使って、m3u8とtsの情報を取得する方法の備忘録。

VideoInfoVariantクラスを使う。

#(例)
client.user_timeline(params[:name],{count: 3}).each do |timeline|
  client.status(timeline.id).media[0].video_info.variants
end

(取得される情報)

[#<Twitter::Variant:0x00007f9a9298b488 @attrs={:bitrate=>432000, :content_type=>"video/mp4", :url=>"https://video.twimg.com/ext_tw_video/1093540366576275456/pu/vid/320x320/6Njwsfm5UWqO0oU-.mp4?tag=6"}>, #<Twitter::Variant:0x00007f9a9298b438 @attrs={:bitrate=>1280000, :content_type=>"video/mp4", :url=>"https://video.twimg.com/ext_tw_video/1093540366576275456/pu/vid/720x720/8XtxUTxm1tUG4ac_.mp4?tag=6"}>, #<Twitter::Variant:0x00007f9a9298b398 @attrs={:content_type=>"application/x-mpegURL", :url=>"https://video.twimg.com/ext_tw_video/1093540366576275456/pu/pl/QiuW1-iWLaygvK25.m3u8?tag=6"}>, #<Twitter::Variant:0x00007f9a9298b1b8 @attrs={:bitrate=>832000, :content_type=>"video/mp4", :url=>"https://video.twimg.com/ext_tw_video/1093540366576275456/pu/vid/480x480/pcsPrvRLvMExgib5.mp4?tag=6"}>]   


ドキュメントには書かれていないが、#bitrateや#content_typeと同じように#urlでURLを取得できる。

#(例)
client.user_timeline(params[:name],{count: 3}).each do |timeline|
  client.status(timeline.id).media[0].video_info.variants[0].url
end

(取得される情報)

https://video.twimg.com/ext_tw_video/1093540366576275456/pu/vid/320x320/6Njwsfm5UWqO0oU-.mp4?tag=6

content_typeがapplication/x-mpegURLのURLを使えばm3u8をダウンロードできる。

(m3u8の中身)

#EXTM3U
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=432000,RESOLUTION=320x320,CODECS="mp4a.40.2,avc1.4d001e"
/ext_tw_video/1093540366576275456/pu/pl/320x320/tfV38oY4Vgf57IDU.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=832000,RESOLUTION=480x480,CODECS="mp4a.40.2,avc1.4d001f"
/ext_tw_video/1093540366576275456/pu/pl/480x480/cP4EMl50LdmPmbDe.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000,RESOLUTION=720x720,CODECS="mp4a.40.2,avc1.640020"
/ext_tw_video/1093540366576275456/pu/pl/720x720/X3HUpbxApZP_9kO9.m3u8

末尾のURLを使って再度m3u8をダウンロード。
(m3u8の中身)

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:3
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-ALLOW-CACHE:YES
#EXTINF:3.000,
/ext_tw_video/1093540366576275456/pu/vid/0/3000/720x720/fOF3nKjZy6cFCfG0.ts
#EXTINF:3.000,
/ext_tw_video/1093540366576275456/pu/vid/3000/6000/720x720/p_XXWwSLqZadr473.ts
#EXTINF:2.976,
/ext_tw_video/1093540366576275456/pu/vid/6000/8976/720x720/wFfB8JO78KQDVYTr.ts
#EXT-X-ENDLIST

tsファイルの情報を取得できる。