「Ruby のヒアドキュメントすごい」の感想

目次

 

はじめに

ぼんやりと、「複数行を出力する命令ってないんかなあ」と思っていたところ、ありました!

参考にした記事

感想:すごい

この前だしたミニアプリの記事

1行ごとにputsで出力していました。

位置が揃うので、これはこれで使い所がありそうです。

ヒアドキュメント活用例

puts <<EOS

から

EOS

の間にある行をインデントもそのまま出力します!

色付けが追いついていませんが、putsを連発する書き方と同じ動作になりました! すごい!

# 入力
puts <<EOS
ActiveHash の model の名前を英字(小文字)で入力して下さい!
↓↓↓↓↓↓
EOS
title = gets.chomp.to_s
puts <<EOS
ありがとうございます!
ActiveHash の model にするリストを半角スペース区切りで入力して下さい!
↓↓↓↓↓↓
EOS
ary = gets.chomp.split.map(&:to_s)
puts <<"EOS"
ありがとうございます!
app/models/#{title}.rb の内容はこちらです!

class #{title.capitalize} < ActiveHash::Base
self.data = [
{ id: 1, name: --- },
EOS
# 2個め〜最後より1個前までのハッシュ
(ary.count - 1).times do |i|
puts " { id: #{i + 2}, name: #{ary[i]} },"
end
# 最後のハッシュ
puts <<"EOS"
{ id: #{ary.count + 1}, name: #{ary.last} }
]
end
EOS

ActiveHashのハッシュを楽して書きたい!

目次

 はじめに

アクティブハッシュのモデルを書くときに「選択肢が多くてコードを書くのが大変!」と感じた事はありませんか?

そんなあなたのために選択肢の配列を入力するとアクティブハッシュのモデルを生成してくれるミニアプリをお届けします!

入力と出力の例

入力例

出力例

app/models/chugoku.rb の内容はこちらです!

class Chugoku < ActiveHash::Base
self.data = [
{ id: 1, name: '---' },
{ id: 2, name: '鳥取県' },
{ id: 3, name: '島根県' },
{ id: 4, name: '岡山県' },
{ id: 5, name: '広島県' },
{ id: 6, name: '山口県' }
]
end

コード

# 入力
puts 'ActiveHash の model の名前を英字(小文字)で入力して下さい!'
puts '↓↓↓↓↓↓'
title = gets.chomp.to_s
puts 'ありがとうございます!'
puts 'ActiveHash の model にするリストを半角スペース区切りで入力して下さい!'
puts '↓↓↓↓↓↓'
ary = gets.chomp.split.map(&:to_s)
puts 'ありがとうございます!'
# 出力
puts "app/models/#{title}.rb の内容はこちらです!"
puts ''
# 以下、ファイルの記述
puts "class #{title.capitalize} < ActiveHash::Base"
puts ' self.data = ['
# 1個めのハッシュ
puts ' { id: 1, name: '---' },'
# 2個め〜のハッシュ
(ary.count - 1).times do |i|
puts " { id: #{i + 2}, name: '#{ary[i]}' },"
end
# 最後のハッシュ
puts " { id: #{ary.count + 1}, name: '#{ary.last}' }"
puts ' ]'
puts 'end'
puts ''

 使い方

  • コマンドで実行する(ruby 「ファイルパス」)
  • あるいは、実行権限を付与する(chmod +x 「ファイルパス」)
  • あるいは、ShellScriptを書く(1行目に #! /bin/sh

詳しくはこちら

ja.stackoverflow.com

終わりに

何度も似たような作業をするなら、サクッとアプリケーションを作ったほうが結果的に楽ができます。

生産性研究会の先生がおっしゃっていた言葉がこちら

「積み重ねになる仕事をしなさい」

「学習に役立つ!」MacのTips8選(初心者向け)

 はじめに

これまでMacに触ったことがなかったけど、テックキャンプをきっかけに初めてMacに触ったという方も多いのではないでしょうか?

今日はそんな方のためにテックキャンプで学習するときに必ず役立つ8つのお役立ち情報を紹介します!

 

テックキャンプが始まって1ヶ月以上たちました。

これまで練ってきたネタをついに大公開!

 

Tips

1.右クリックから検索

コピー、新しいタブ、貼り付け、Enterキーしてませんか?

 

どのアプリケーションでも文字を選択して2本指でクリック(右クリック)すると検索することができます

f:id:mt4proconkai:20200803212207j:plain

 

f:id:mt4proconkai:20200803212224j:plain

 

ちなみにコンテキストメニュー(右クリックのメニュー)の一番上は小窓で検索です。

バンドルアプリケーションの「辞書」が働いています。

Wikipediaや辞書、英和辞典などからヒットします。

f:id:mt4proconkai:20200803223525j:plain

 

f:id:mt4proconkai:20200803223538j:plain



2.英数キー2回で変換

英語を打とうとしてひらがなになった時、消してませんか?

 

weekly.ascii.jp

 

3.⌘+↓でファイルを開く

FinderやVSCodeのファイルブラウザなどで、ファイルを選択してcommandキー↓キーを同時に押すとファイルを開くことができます!

 

4.カラムビュー

リストビューで消耗していませんか?

 

Finderでcommand数字の3を同時に押すとカラムビューになります。

左右の矢印でフォルダを上の階層に移動したりできるのでとても便利です。

 

ファイルの移動もドラッグ&ドロップで直感的にできます!

 

f:id:mt4proconkai:20200803213058j:plain

 

5.Enterキーでリネーム

ちょっと待ってクリックしなおしてませんか?

右クリックからリネームしていませんか?

 

FinderやVSCodeのファイルブラウザなどで、ファイルを選択してEnterキーを押すとリネームできる状態になります。

 

6.⌘ + option + V で、切り取って貼り付け

Finderでは切り取って貼り付けができないとあきらめていませんか?

 

www.danshihack.com

⌘ + C からの、⌘ + option + V

 

7.2本指ダブルタップ

ピンチインで頑張って調整していませんか?

 

f:id:mt4proconkai:20200803221518g:plain

  1. 「システム環境設定」というアプリケーション
  2. トラックパッド」をクリックしてトラックパッドの設定画面を開く
  3. スクロールとズームのタブを開く(ここからGIFアニメの画面)
  4. スマートズームにチェックを入れる
  5. カリキュラムの本文の上で2本指ダブルタップをする

 

8.Terminalの文字を拡大する

ターミナルの文字は小さいものだと諦めていませんか?

 

f:id:mt4proconkai:20200803222401j:plain

⌘ + shift + ;(つまり⌘ + +)で文字とウィンドウが大きくなります。

 

おわりに

「この小技は中級編にぜひ入れてほしい!」

というネタ提供お待ちしております。

 

あるいは中級編のアンサーブログ、こっちが本当の初級編だという記事なども、お待ちしております。

「くやしい!」AtCoder Beginner Contest 174

 

はじめに

腱鞘炎の予防のため、文章を(ほぼ)打たずに記事を作ります。

 

ABC174に参加してきました!

atcoder.jp

 

解答速報はこちらを参考にさせていただきました!

qiita.com

www.youtube.com

 

以下、答案です。

※不正解は不正解のままです

 

問題A(100点)

入力が30以上かを出力

# 整数の入力
X = gets.to_i
# 出力
puts X >= 30 ? 'Yes' : 'No'

特になし

 

問題B(200点)

n, d = gets.chomp.split.map(&:to_i)
ans = 0

n.times do
# スペース区切りの整数の入力
x, y = gets.chomp.split.map(&:to_i)
if ( x * x + y * y) ** (1/2.0) <= d
ans += 1
end
end

# 出力
puts ans

ACもらえました。

ただ、小数で判定はよろしくないです。

 

問題C(0点)

# 整数の入力
X = gets.to_i

if X % 2 == 0
puts -1
else
1.step do |i|
sevens += 7 * 10**i
if sevens % X == 0
puts i
break
end
end
end

AC : TLE : WA =16 : 10 : 1

理解できるけど通せないの、くやしい。

 

問題D(0点)

さっぱり

 

問題E(0点)

触る時間の余裕はあったが、存在を忘れていた。

 

問題F(0点)

# スペース区切りの整数の入力
n, q =gets.chomp.split(" ").map(&:to_i);
# スペース区切りの整数の入力
stones = gets.chomp.split(" ").map(&:to_s);

l = r = []

q.times do |i|
l[i], r[i] = gets.chomp.split(" ").map(&:to_i);
end

q.times do |i|
puts stones[l[i]..-1].reverse[r[i]..-1].uniq.size
end

「え、これだめ?」

 

感想

とんでもなく簡単なA問題でした。

それでも2年ぶりに1発ACが取れたときは「ほっ」としました。

 

「くやしい!」のは、解けそうで通らないことです。

 

本番に出ると集中して学習がすすみます。

開催ありがとうございました!

 

解説放送、何時に終わるんですか…… おやすみなさい。

「そのRubyプログラム、アプリケーションにしませんか?」

 

はじめに

今週、雑にタイピングをしたせいで、手が死にそうです。

生活が少々乱れてゴールデンタイムに寝ていなかったため、成長ホルモンなどの分泌が不十分かもしれません。

そのせいで炎症の回復力が弱いのも大きな要因ですきっと。

しばらくタイピングは自粛モード、といいつつブログを投稿します。

 

先日、文字列を整形してくれるコマンドラインアプリケーションを公開しました。

(そんなに大した処理はしていない)

yh-tech.hateblo.jp

 

その後、Finderからダブルクリックでプログラムを実行できるように細工をしました。

という近況報告です。

f:id:mt4proconkai:20200801235211g:plain

手順

こちらの知恵袋を参考にしました

detail.chiebukuro.yahoo.co.jp

 

  1. Terminalで"chmod +x ~/projects/twitter_q_a/process.rb"を実行することで、このプログラムに実行権限を与える。
  2. "run_process.sh"というファイルを作成する。

"run_process.sh"の内容


cd /Users/hii_web/projects/twitter_q_a/
ruby process.rb

 

おわりに

上記の方法では、プログラムとは別に、

"run_process.sh"というシェルスクリプトのファイルを作りました。

 

一方で、プログラムの1行目に

#!/usr/bin/env ruby

を記述してから、実行権限を与える方法もあるようです(こちら)

ja.stackoverflow.com

 

このリンク先の方法で、プログラム自体をFinderでダブルクリックして実行できるようにしたほうが便利な場合がほとんどですね。

現状、デスクトップにある"run_process.sh"をダブルクリックするだけでTerminalが立ち上がりプログラムが実行されます。

とくに不満はありません。

 

しかし、

#!/usr/bin/env ruby

を記述する方法のほうがよく目にするので、来週試してみます。

そのときGitHubも更新します。

「ACもらえた。運がよかった!」ABC049C

目次

 

問題

atcoder.jp

erase、eraserとDaydreamのつながりがわかりません。

ググってもこれくらいしかヒットしません。

www.amazon.com

多分eraserとdreamerがちょっと似ていて、都合がいいからでしょうか。

 

 回答 

# 判定する文字列を受け取る
s = gets.chomp
# 判定する文字列から、4つの単語をすべてとりのぞく
rest = s.gsub(/eraser/, '').gsub(/erase/, '').gsub(/dreamer/, '').gsub(/dream/, '')
# とりのぞいた後に文字列が残っていなければYESを出力する
puts rest.length == 0 ? "YES" : "NO"

学んだ処理

puts rest.length == 0 ? "YES" : "NO"

条件演算子三項演算子):boorean演算の結果による出力を簡潔に書けるんですね。

↓この書き方しかわかりませんでした

if rest.length == 0
puts "YES"
else
puts "NO"
end

 

お手本の別解

mayu_mic様の回答がコード長、処理時間、共に最短でした。

puts gets.chomp.match(/^*1*$/) ? 'YES' : 'NO'

puts gets.chomp.match(/^*2*$/) ? 'YES' : 'NO'

gsubを使う人が多い中、matchと条件式の組み合わせで簡潔に処理しています。

処理は

「行頭^から行末$までの間、

((eraserを0個か1個?)(dreamを0個か1個?)(dreamerを0個か1個?

の繰り返し*

と一致するか」判定しています。

eraseは入れなくても運よくACもらえるみたいです。

 

感想

rest = s.gsub(/dreamer/, '').gsub(/dream/, '').gsub(/eraser/, '').gsub(/erase/, '')

このようにdreamer, dream, eraser, eraseの順にとりのぞくとWAでハマりました。

(eraser, erase, dreamer, dreamの順にとりのぞいてACもらえたのは、運が良かったとしか。

ジャッジの入力に"deraseream"が入っていたら

NOを出力すべきところをYESと出力してWAです。)

 

*1:eraser?)|(dream(er)?

*2:eraser?)|(dream(er)?

〜「虫食い問題と答え」作成ツール〜 ver0.0 (完全に自分用)

目次

 

はじめに

Twitterで毎日のように一問一答形式で作った問題を投稿しています。

 

 これを投稿するとき、それっぽい問題文を考えて、虫食いにして、答えをリプライにつけて、という作業をしていました。

このプログラムを組むまでは。

動作の様子

f:id:mt4proconkai:20200729211758g:plain

何をやっているのか?

  1. Terminalに"ruby "と入力
  2. "process.rb"というファイルをTerminalにドラッグ&ドロップ
  3. Enterキー
  4. 用意した文章を貼りつけ
  5. Enterキー

 

どこが便利なのか?

  • 学習中にTwitterを開かないでいい(超大事)
  • テキストファイルに用意した素材から投稿文を整形してくれる(ちょい大事)
  • Q.とかA.とかを投稿に必ずつけてくれる(ほぼ自己満足)

 

 

ソースコード

github.com

GitHubには、下記Rubyファイルが1つ。

いつか投稿画面にコピペしなくても自動で準備させたい、など。

夢はあるが時間がたりない。

 

puts "┌──────────────────────────────────────┐"
puts "│ 〜「虫食い問題と答え」作成ツール〜 │"
puts "└──────────────────────────────────────┘"
puts "\n ① 題名 ② 文章 ③ 単語 の入力例 "
puts "┌────────────────────────────────────────────────┐"
puts "│空についてまなぼう!              │"
puts "│青空は、レイリー散乱の周波数特性によるものです。│"
puts "レイリー散乱                  │"
puts "└────────────────────────────────────────────────┘"
puts "\n───── ① 題名 ② 文章 ③ 単語 を入力してください ─────"
puts ""
title = gets.chomp
question = gets.chomp
word = gets.chomp
puts "\n────────── ↓ [Q.問題] と [A.答え] です ↓ ──────────"
puts "\nテックキャンプで「~#{title}~」の学習を修了しました!"
puts "Q."
puts "#{question.gsub(/#{word}/,'【  】')}"
puts "A."
puts question
puts "\n─────────────────────────────────────────────────────"

 

今後、追加する機能

  • 素材をTerminalにコピペする代わりに、プログラムで外部ファイルを参照する
  • 投稿画面にコピペしなくても自動で準備する
  • そのほか、いただいたコメントに応じて柔軟に......