20200810のRubyに関する記事は16件です。

最初の n 個の素数の総積プラス 1 が素数かどうか

1

素数が無限に存在することは古代ギリシャで既に知られていた。
紀元前に編纂された『原論ストイケイア』には以下のような感じの証明が書かれているとか。

素数が 3 個しか無いとしよう。これを $p$, $q$, $r$ とする。
$pqr+1$ は $p$, $q$, $r$ のどれで割っても $1$ が余る。
これは素数が $p$, $q$, $r$ だけという仮定に反する。
(この論法は素数が 4 個でも 5 個でも同様。つまり,素数が有限個と仮定すれば必ず矛盾が導かれる)

背理法(仮定 A から矛盾を導いて A の否定を証明する論法)を使っている。
中学でこの証明に出会ったときちょっとした感動を覚えた。
背理法がカッコよかったし,「全素数の総積プラス 1」という単純な式から実に簡単に矛盾を引き出したところが見事だと思った。

2

同じ頃「大きな素数探し」というテーマがあることを知った。
電子計算機の進歩とともに,手計算では到底見出せないような巨大な素数が次々見つかり,何年にどこの誰がどんな素数を見つけた,というような一覧表が作られているのも何かで見た。

3

私のような素人は,『原論』の件の証明を思い出して,ついこんな間違ったことを考えついてしまう。

見つかった素数を全部掛け合わせて 1 を足せば簡単に巨大素数が得られるじゃん!

もちろんそんなはずはない。
有限個との仮定から,その総積プラス 1 がどれでも割り切れない,という事態が導かれただけのことだ。実際には素数は無限にあり,そこから有限個の素数をとり出して掛け合わせて 1 を足したからといって,それが素数になるとは限らない。

4

しかしだよ?
$n$ 個の素数の総積に 1 を足した数は,少なくともそれらの素数では割り切れない。だから,ある意味「割り切りにくい数」であるとはいえるのではないか。
もっと言えば,そいつらの中にけっこう素数があるんじゃないか?

エラトステネスのふるいを考えると,合成数を排除するには小さい素数の倍数を排除すると効率が良さそうな気がする。

それゆえ,素数を小さい順に並べて,最初の $n$ 個を取り,それらの総積に 1 を足して試すのがよさそう。

5

まず,最初の素数 $2$ を取り上げる。
これに $1$ を足した $3$ は素数だ。

次。
$2\cdot3+1=7$ は素数。いいね。

$2\cdot3\cdot5+1=31$ も素数。うーん,いい調子。

$2\cdot3\cdot5\cdot7+1=211$ はどうだ?
$11$ でも $13$ でも割り切れないのはすぐに分かる。$17^2$ は $211$ を越えてしまうから試す必要もない。
素数と分かった。んー,なんか話がうま過ぎない?
ここまで,手計算でがんばった。

$2\cdot3\cdot5\cdot7\cdot11+1=2311$ はどうだ?
手計算は諦めた。そう難しくはないが,計算間違いをしないという自信が無い。

ここでターミナルに

irb -r prime

と打つ。
これで,Ruby の対話環境が起動し,素数ライブラリーである prime が読み込まれた状態になる。

そして,

irb(main):001:0> 2311.prime?
=> true

おおー,これも素数か!
(ある整数が素数であることは Integer#prime? で確認できる)

まさかこんなにうまく素数ばかり出てくるとは思わなかった。

6

ではプログラムで組織的に調べてみよう。
Ruby で以下のように書く。

require "prime"

1.step do |n|
  m = Prime.take(n).inject(:*) + 1
  puts "%3d %s %d" % [n, (m.prime? ? "o" : "x"), m]
end

このプログラムは止まるように書いていない。形式上は無限に調べ続けるようになっている。

Prime.take(n) で最初の n 個の素数の配列が得られる。

inject(:*) でその総積が得られる。

そして,

  • n の値
  • 素数かどうか(素数なら o,そうでないなら x
  • 「総積プラス 1」の値

とを並べて表示するだけ。

7

結果は以下のようであった。

  1 o 3
  2 o 7
  3 o 31
  4 o 211
  5 o 2311
  6 x 30031
  7 x 510511
  8 x 9699691
  9 x 223092871
 10 x 6469693231
 11 o 200560490131
 12 x 7420738134811
 13 x 304250263527211
 14 x 13082761331670031
 15 x 614889782588491411
 16 x 32589158477190044731
 17 x 1922760350154212639071
 18 x 117288381359406970983271

$n = 18$ までは一気に進むが,そこから先はいつまで経っても進まない。

$n = 5$ までは素数だったのに,そのあとは合成数が続く。うーむ残念。

$n = 11$ でようやくまた素数が現れたと思ったら,またまた合成数が続いていく。

「けっこうな割合で素数が含まれているのでは」と思ったのはやはり幻想だったか。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

@(インスタンス変数)とは

@変数とは

アットマークで始まる変数は「インスタンス変数」と呼ばれ、自クラスやサブクラスから参照できる。

インスタンスとは

インスタンスは何らかの具体的なモノ、動いている、動かせる、出現する、消滅するモノである。クラスを雛形として作られる。
「たこ焼き機がクラスでたこ焼きがインスタンス」

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails tutorial 第1章

はじめに

独学でrails tutorialを進めていく過程を投稿していきます。

進めていく上でわからなかった単語、詰まったエラーなどに触れています。

個人の学習のアウトプットなので間違いなどあればご指摘ください。

初めての投稿なので読みにくいところも多々あるかと思いますがご容赦ください。

第一章 ゼロからデプロイまで

1.2.2 Railsをインストールする

Q..
yarmなるもののインストール指示されたがいったい何だろう
A..
JavaScriptソフトウェアの依存関係を管理するプログラムらしい(javascriptのパッケージマネージャ―)


1.3.1 Bundler

エラー発生!!

bundle install時に早速エラーに遭遇した

遭遇したエラー

[!] There was an error parsing `Gemfile`: Illformed requirement ["-> 3.2.1"]. Bundler cannot continue.

 #  from C:/environment/hello_app/Gemfile:36
 #  -------------------------------------------
 #  # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
 >  gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
 #  source 'https://rubygems.org'
 #  -------------------------------------------

解決

 #  from 
C:/environment/hello_app/Gemfile:36
↑にインストールに失敗した箇所が表示されているのでそこを修正


1.4 Gitによるバージョン管理

余談
ブランチの名前を間違えてしまったが簡単に変更できた
git branch -m 変更したい名前


終わりに

そこまで躓くポイントはありませんでした。

参考文献
Ruby on Rails Tutorial

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[ruby]ドリルアウトプット

内容

if → unlessへの書き換え
image.png

実装

ヒントを見ていただけたらわかると思いますが、if文は真のときに処理が実行されるのに対し、unlessは条件式が偽のときに処理が実行されます。
なので、
image.png
とすることにより同じように書くことができます。

今の所どんなときに使うのかわかりませんが、覚えておきます!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Twitterマーケティング?プログラムにまかせちゃえば?

この頃、サービスをリリースした阿部です。
リリースしたものの、マーケティングがわからなく四苦八苦です。
とりあえず、RubyでTwitter運用を始めたので、そのナレッジを記載します。
(始めたばかりで成果のほどは不明。)

Twitter運用めんどくさい。。
僕、Rubyエンジニアでツイッタラーじゃないんだけど(怒)
簡単に運用する方法ないの?
って人向けの記事です。

サンプルはRubyで記載しています。

アジェンダ

  • どうやって自動化した?
  • Twitter Rest APIとは?
  • RubyのTwitter REST APIの導入方法
  • 実際にどんな運用をしているか
  • まとめ

どうやって自動化した?

僕は、Twitter Rest APIを使って自動化しました。

Twitter Rest APIとは?

名前の通り、Twitterが提供しているAPIです。
このAPIを呼び出すことによって、
ツイートやリツイートなどのTwitter上の処理を、プログラムから実行することができます。

RubyにはこのTwitter Rest APIを簡単に呼び出せるgemがあるので、
恩恵に預かりましょう。
https://github.com/sferik/twitter

各APIの概要、パラメーターなどを知りたい場合は下のリファレンスを参照してください。
わかりやすくまとめられています。
https://rdoc.info/gems/twitter/Twitter/REST

Twitter REST APIの導入方法

アカウント作成

まずはTwitter開発者アカウントを作成します。
僕はこちらの記事を参考にしました。
https://qiita.com/kngsym2018/items/2524d21455aac111cdee

英語で連絡しなければいけないので少々手間ですが、
気合で乗り越えてください。

実装

Clientを作成するクラスを実装しましょう。
ClientがTwitterAPIを呼び出す各メソッドを持っています。
Clientを作成してメソッドを呼び出せば、
ツイートやリツイートなどの処理をプログラムから呼び出すことが可能です。

twitter-wrapper.rb
require 'twitter'
class TwitterWrapper
  attr_accessor :client

  def initialize
    @client = Twitter::REST::Client.new do |config|
      config.consumer_key = ENV["TWITTER_API_KEY"]
      config.consumer_secret = ENV["TWITTER_API_SECRET"]
      config.access_token = ENV["TWITTER_ACCESS_TOKEN"]
      config.access_token_secret = ENV["TWITTER_ACCESS_TOKEN_SECRET"]
    end
  end

  def tweet(content:, option: {})
    @client.update(content, option)
  end

  def tweet_with_media(content:, images: , option: {})
    @client.update_with_media(content, images, option)
  end

  def retweets(tweet_id: nil)
    @client.retweet(tweet_id)
  end

end

今回、設定はconfig/twitter.ymlに配置しましたが、好きなところに配置してください。
Twitter::REST::ClientをNewする際に、それぞれの値を正しく入力できれば問題ないです。
twitter-wrapper.rbには今回説明するメソッドしか記載していませんが、
他にもたくさんメソッドがあるのでドキュメントで確認してみると面白いと思います。

実際にどんな運用をしているのか

僕は以下の運用を行っています。

  • コンテンツが投稿されたタイミングでツイートする
  • 一定時間ごとに自分のツイートをリツイートする

コンテンツが投稿されたタイミングツイートする

コンテンツが投稿された時、tweetを呼び出しています。
ツイートAPIを呼び出すupdate_with_mediaのラップメソッド(tweet_with_media)を実行しているだけです。
今回は画像も一緒にツイートしたかったので、update_with_mediaを使っています。
画像が不要な場合は、updateメソッドを使えば大丈夫です。

tweet.rb
  class Tweet < Twitters::Application
    def tweet(content)
      tweet_wrapper = TwitterWrapper.new
      content = content #ツイート内容
      images  = 【画像】 # Array<File>
      tweet_wrapper.tweet_wrapper.tweet_with_media(content: content, images: images)
    end
  end

一定時間ごとに自分のリツイートする

cronで下記処理を呼び出しています。
ただ、すでにリツイートしているツイートを再度リツイートしようとするとエラーを吐きます。
処理を追加してあげたほうが優しいと思います。

retweet.rb
tweet_wrapper = TwitterWrapper.new

tweet_wrapper.search('アカウント名').each do |tweet|
  user_name = tweet.user.screen_name

  return false if !user_name.include?('アカウント名')

  tweet_wrapper.retweets(tweet_id: tweet_id)
end

まとめ

上記は僕がパパッと考えたやり方なので、もっと洗練できると思います。
こんなやり方、書き方あるよって方はコメントいただければ幸いです!

良き、Twitterライフを!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Twitterマーケティング?自動化しちゃば?

この頃、サービスをリリースした阿部です。
過剰なタイトルをつけたものの、マーケティングがわからなく四苦八苦です。
とりあえず、RubyでTwitter運用を始めたので、そのナレッジを記載します。
(始めたばかりで成果のほどは不明。)

Twitter運用めんどくさい。。
僕、Rubyエンジニアでツイッタラーじゃないんだけど(怒)
簡単に運用する方法ないの?
って人向けの記事です。

サンプルはRubyで記載しています。

アジェンダ

  • どうやって自動化した?
  • Twitter Rest APIとは?
  • RubyのTwitter REST APIの導入方法
  • 実際にどんな運用をしているか
  • まとめ

どうやって自動化した?

僕は、Twitter Rest APIを使って自動化しました。

Twitter Rest APIとは?

名前の通り、Twitterが提供しているAPIです。
このAPIを呼び出すことによって、
ツイートやリツイートなどのTwitter上の処理を、プログラムから実行することができます。

RubyにはこのTwitter Rest APIを簡単に呼び出せるgemがあるので、
恩恵に預かりましょう。
https://github.com/sferik/twitter

各APIの概要、パラメーターなどを知りたい場合は下のリファレンスを参照してください。
わかりやすくまとめられています。
https://rdoc.info/gems/twitter/Twitter/REST

Twitter REST APIの導入方法

アカウント作成

まずはTwitter開発者アカウントを作成します。
僕はこちらの記事を参考にしました。
https://qiita.com/kngsym2018/items/2524d21455aac111cdee

英語で連絡しなければいけないので少々手間ですが、
気合で乗り越えてください。

実装

Clientを作成するクラスを実装しましょう。
ClientがTwitterAPIを呼び出す各メソッドを持っています。
Clientを作成してメソッドを呼び出せば、
ツイートやリツイートなどの処理をプログラムから呼び出すことが可能です。

twitter-wrapper.rb
require 'twitter'
class TwitterWrapper
  attr_accessor :client

  def initialize
    @client = Twitter::REST::Client.new do |config|
      config.consumer_key = ENV["TWITTER_API_KEY"]
      config.consumer_secret = ENV["TWITTER_API_SECRET"]
      config.access_token = ENV["TWITTER_ACCESS_TOKEN"]
      config.access_token_secret = ENV["TWITTER_ACCESS_TOKEN_SECRET"]
    end
  end

  def tweet(content:, option: {})
    @client.update(content, option)
  end

  def tweet_with_media(content:, images: , option: {})
    @client.update_with_media(content, images, option)
  end

  def retweets(tweet_id: nil)
    @client.retweet(tweet_id)
  end

end

今回、設定はconfig/twitter.ymlに配置しましたが、好きなところに配置してください。
Twitter::REST::ClientをNewする際に、それぞれの値を正しく入力できれば問題ないです。
twitter-wrapper.rbには今回説明するメソッドしか記載していませんが、
他にもたくさんメソッドがあるのでドキュメントで確認してみると面白いと思います。

実際にどんな運用をしているのか

僕は以下の運用を行っています。

  • コンテンツが投稿されたタイミングでツイートする
  • 一定時間ごとに自分のツイートをリツイートする

コンテンツが投稿されたタイミングツイートする

コンテンツが投稿された時、tweetを呼び出しています。
ツイートAPIを呼び出すupdate_with_mediaのラップメソッド(tweet_with_media)を実行しているだけです。
今回は画像も一緒にツイートしたかったので、update_with_mediaを使っています。
画像が不要な場合は、updateメソッドを使えば大丈夫です。

tweet.rb
  class Tweet < Twitters::Application
    def tweet(content)
      tweet_wrapper = TwitterWrapper.new
      content = content #ツイート内容
      images  = 【画像】 # Array<File>
      tweet_wrapper.tweet_wrapper.tweet_with_media(content: content, images: images)
    end
  end

一定時間ごとに自分のリツイートする

cronで下記処理を呼び出しています。
ただ、すでにリツイートしているツイートを再度リツイートしようとするとエラーを吐きます。
処理を追加してあげたほうが優しいと思います。

retweet.rb
tweet_wrapper = TwitterWrapper.new

tweet_wrapper.search('アカウント名').each do |tweet|
  user_name = tweet.user.screen_name

  return false if !user_name.include?('アカウント名')

  tweet_wrapper.retweets(tweet_id: tweet_id)
end

まとめ

上記は僕がパパッと考えたやり方なので、もっと洗練できると思います。
こんなやり方、書き方あるよって方はコメントいただければ幸いです!

良き、Twitterライフを!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails ポートフォリオ実装 - 設計 -

ポートフォリオ実装にあたり各工程ごとに、学習のアウトプットとして手順や詳細について記し共有させていただきますので、一つの例として参考にしていただければ幸いです。
今回は、前回工程である要件定義の次で設計についてとなります。

<アウトプットする理由について>
・"わかった気になっている"を無くすため
・フィードバックを受ける機会を得るため
・得た情報を自分の中にしっかり定着させるため
・数多くの情報から本当に必要な情報を判断できるようになるため

<各工程>
1. 要件定義(仕様決め、ガントチャート作成)
2. 設計(画面設計、DB設計、URL設計、タスクばらし)
3. 実装(たくさん...)

<Webアプリケーション開発時の設計ですべきこと>
1. 画面設計
2. DB設計
3. URL設計
4. タスクばらし

調べる限り、上記4つが設計ですべきこととして挙げられましたが、私は今回「画面設計」と「DB設計」のみの実施といたしました。URL設計は、画面設計のプロトタイプでルーティングを判断し、タスクばらしについては前回(要件定義)でガントチャートの作成をしたためです。(ポートフォリオなので自由に独自判断..あとで困るかもしれません)

実際にやってみる

画面設計

ワイヤーフレームで画面遷移図を作成していく過程となります。
こちら、初めてしましたがなかなか時間かかりました...

利用ツールについて

図を描くツールは世の中にいっぱいありますが、私はAdobe XDを使いました。
理由としては、、、「比較的直感的に図が作成できること」と「それっぽいテンプレートが使える」ことです。
それぞれ簡単に解説しておきます。

「比較的直感的に図が作成できること」

実際にツールを本格的に使うのであればある程度学習してからの方が良いかとは思いますが、Adobe XDについてはUIみたまま直感的に操作できます。
しかし基本的なショートカットなどは知っていた方が効率的に作業できますので以下の動画をみて実践しました。

Title : XDことはじめStep1:まずはここから!「ワイヤーフレームを作ってみよう」
URL : https://helpx.adobe.com/jp/xd/how-to/beginners-tutorial-1.html

Title : 超初心者向けAdobe XD使い方!最低限を7分で解説
URL : https://www.youtube.com/watch?v=cIB5LMUILN0

「それっぽいテンプレートが使える」

流石に私みたいなど素人がボタンのデザインから何まで考えていたらいつまで経っても実装に進めなさそうと判断し、ある程度それっぽいテンプレートが使えるような機能があればいいなと思っておりました。Adobe XDでは、様々なバリエーションのテンプレートをアドインして使うことができ作業効率をアップすることができます。
具体的なテンプレートの使い方については以下の動画で学習してすぐできるようになりました。

Title : Adobe XDで3分でwebサイトデザインしてみた!初心者ができるチート技紹介
URL : https://www.youtube.com/watch?v=ap4Yiq9oWs8

<補足>
他にも画面設計で便利なツールはいっぱいありました!
Sketch(有料)
Cacoo
Prott
Figma
InVisionStudio

こんな感じで図を作ってみました

スクリーンショット 2020-08-10 15.27.08.png

色とかすごいセンスない...と自分でも思っておりますが、実際に実装して気に入ったものに変更しようかなと思います(笑)

スクリーンショット 2020-08-10 15.27.23.png

プロトタイプという各ボタンからどのページに画面遷移するかを線で繋ぐことができます。
こちらをしていると、プレビューしたときに実際にルーティングを確認できるので分かりやすく可視化できます。
https://xd.adobe.com/view/35bf60b9-b425-4986-6401-de2baaef4733-438e/?fullscreen

スクリーンショット 2020-08-10 15.38.02.png

全体像は以下となります。
全部で20枚となりました、なかなか時間はかかりましたが楽しかったですよ:v_tone1:

スクリーンショット 2020-08-10 15.32.57.png

DB設計

DB設計とは各テーブル名とカラム名を決めて図に起こす過程となります。
こちらの作業期間は3日くらいでしたが、これって正解なのか?と思いMentaの講師にレビューしていただいた期間を含みます。

ER(Entity Relationship)は「実体関連モデル」と呼ばれています。主にデータベースや情報システムでデータを編成するときの設計図として使われています。
ER図では、データベースを構成するデータのまとまりを「エンティティ」と呼ばれる四角形で表します。そして、データ同士を「リレーション」と呼ばれる線で結び「カーディナリティ」と呼ばれる記法で相互の関係性を示します。引用:cocooブログ

利用ツール

私はcacooを使ってみました。
こちらもある程度のテンプレートが用意されており、文字を当てはめて完成させるイメージで良いかと思います。
概念含め、考え方は以下の Qiita記事で学びました。

Title : 【図解あり】初心者向け!ER図とEER図の基本とツールの選び方
URL : https://cacoo.com/ja/blog/entity-relationship-diagram-for-beginner/

Title : 【初心者向け】丁寧すぎるRails『アソシエーション』チュートリアル【幾ら何でも】【完璧にわかる】?
URL : https://qiita.com/kazukimatsumoto/items/14bdff681ec5ddac26d1

<補足>
他にもDB設計で便利なツールはいっぱいありました!
MySQL WorkBench
WWW SQL Designer
ERDPlus
LucidChart
draw.io

こんな感じで図を作ってみました

なんか横長くなってしまいましたが、GithubのReadmeに掲載する際は、もうちょっと全体像の修正を行おうかと思います。
スクリーンショット 2020-08-10 15.47.02.png

以上、設計についてのアウトプットといたします。
※設計は一週間ほどで終わるかと思います!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rubyで3桁区切り表示を実現する

3桁区切の表示にしたい場合

  1. to_s(:delimited)メソッドを使用する
  2. 上記メソッドを使用するために、ファイル先頭にrequireを追加する
    active_supportはRuby on Railsのコンポーネントで色んなメソッドを使えるようにするもの
num.rb
require "active_support/core_ext/numeric/conversions"

10000.to_s(:delimited)
# => "10,000"

詳細はRailsガイドのActive Supportページに記載有(6.3 書式設定)
https://railsguides.jp/active_support_core_extensions.html#%E6%9B%B8%E5%BC%8F%E8%A8%AD%E5%AE%9A

あとがき

私は3桁表示方法を探していた時
「.to_s(:delimited)メソッドで数値を3桁区切にできるらしい!」と喜んで使用したところ
requireが必要だとは知らず、以下エラーに遭遇。

in `to_s': no implicit conversion of Symbol into Integer (TypeError)

to_sは正常に使用できるのに、(:delimited)を追加するとエラーが発生して困りました。
そのため、 to_s(:delimited)メソッドをrubyで使用する場合はactive_support を有効にするrequireが必須です。

この機会にactive_supportの他の便利なメソッドも学習し、活用していきたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows 10のVSCodeでrubyのdebug環境を構築する

はじめに

一年以上ぶりに、rubyの環境を作ろうとしたら、なかなかうまくいかず、やっと環境ができたので、メモを残します。これで、rubyでstep実行や変数の確認ができるようになります。

Visual Studio Code のインストール

Ruby のインストール

VSCodeの拡張機能をインストール

  • VSCodeを起動して、拡張機能の「ruby」を検索して、インストールします。(下図はインストール後の画面) image.png

Gemをbundleでインストール

  • VSCodeのターミナルを開いてbundle initします。
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

PS C:\Users\momoandbanana\Documents\my_ruby_programs\debugenv> bundle init
Writing new Gemfile to C:/Users/momoandbanana/Documents/my_ruby_programs/debugenv/Gemfile
PS C:\Users\momoandbanana\Documents\my_ruby_programs\debugenv> 
  • するとGemfileが作成されるので、debaseruby-debug-ideのGemを追加します。
Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"
gem "debase" # 追加しました
gem "ruby-debug-ide" # 追加しました
  • VSCodeのターミナルでbundle installでGemをインストールします。
PS C:\Users\momoandbanana\Documents\my_ruby_programs\debugenv> bundle init
Writing new Gemfile to C:/Users/momoandbanana/Documents/my_ruby_programs/debugenv/Gemfile
PS C:\Users\momoandbanana\Documents\my_ruby_programs\debugenv> bundle install
Fetching gem metadata from https://rubygems.org/.....
Resolving dependencies...
Using rake 13.0.1
Using bundler 2.1.4
Using debase-ruby_core_source 0.10.9
Using debase 0.2.4.1
Using ruby-debug-ide 0.7.2
Bundle complete! 2 Gemfile dependencies, 5 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
PS C:\Users\momoandbanana\Documents\my_ruby_programs\debugenv> 

lunch.jsonに設定を記載します。

  • rubyのプログラムを用意します。
main.rb
puts("hello ruby-debugger !")
  • lunch.json自動作成させるために、VSCodeのメニューから実行 構成を開く を選びます。
    image.png

  • すると、どのような構成をしたいのか選択肢で質問されるのでrubyを選びます。
    image.png

  • さらにdebug local fileを選びます。
    image.png

  • するとlaunch.jsonファイルが出来上がるので、programの行を下記のように修正します。

launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug Local File",
            "type": "Ruby",
            "request": "launch",
            // "program": "${workspaceRoot}/main.rb", コメントにしました。
            "program": "${file}", // 変更しました。
        }
    ]
}

デバッグを開始します

  • ソースファイルを開いてから、VSCodeの実行 デバッグの開始でデバッグします。下図はmain.rbの1行目にブレークポイントを設定して、ブレークされたところです。 image.png

以上です。
実際の作業は、githubで記録しました。出来上がった各設定ファイルはこのコミットにあるものです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】Vagrant環境でPostgreSQLを使用する方法

開発環境

・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・PostgreSQL: 9.2.24
・OS: macOS Catalina

実装

1.vagrant sshへログイン

ターミナル
$ vagrant ssh

2.yumを最新版にアップデート

ターミナル
$ sudo yum -y update

3.PostgreSQLをインストール

ターミナル
$ sudo yum -y install postgresql
ターミナル
$ sudo yum -y install postgresql-devel
ターミナル
$ sudo yum -y install postgresql-server

psql --versionを実行して、バージョンが表示されればインストール完了です。

ターミナル
$ psql --version
psql (PostgreSQL) 9.2.24

4.PostgreSQLを初期化

ターミナル
$ sudo postgresql-setup initdb

5.PostgreSQLを起動

ターミナル
$ sudo service postgresql start

6.PostgreSQLのアカウントを作成し、ログインする

ターミナル
$ sudo -u postgres psql
ターミナル
postgres=# create role [任意のユーザー名] with createdb login password '[任意のパスワード]';

\duを実行してRoleが追加されていればアカウント作成完了です。

ターミナル
postgres=# \du
                                    List of roles
  Role name      |                   Attributes                   | Member of 
-------------+------------------------------------------------+-----------
 [任意のユーザー名] | Create DB                                      | {}
 postgres        | Superuser, Create role, Create DB, Replication | {}

7.データベースを確認

手順4のsudo postgresql-setup initdbで作成されたデータベースを確認する。

ターミナル
postgres=# \l
                             List of databases
   Name    |  Owner   | Encoding  | Collate | Ctype |   Access privileges   
-----------+----------+-----------+---------+-------+-----------------------
 postgres  | postgres | SQL_ASCII | C       | C     | 
 template0 | postgres | SQL_ASCII | C       | C     | =c/postgres          +
           |          |           |         |       | postgres=CTc/postgres
 template1 | postgres | SQL_ASCII | C       | C     | =c/postgres          +
           |          |           |         |       | postgres=CTc/postgres
(3 rows)

※ template0とtemplate1の違いについては下記記事を参考にしてください。

PostgreSQLのtemplate0とtemplate1の違い

8.Railsアプリを作成

デフォルトのデータベースがSQLiteなので、-dオプションでPostgreSQLを指定する。

ターミナル
$ rails new sample -d postgresql

9.database.ymlを編集

templateは、まっさらなデータベースを作成することが出来るtemplate0を指定する。

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  template: template0
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: 手順6で設定したユーザー名
  password: 手順6で設定したパスワード

10.データベースを作成

ターミナル
$ rails db:create

FATAL: Ident authentication failed for userというエラーが出る場合

① PostgreSQLの設定ファイルを開く。

ターミナル
$ sudo vi /var/lib/pgsql/data/pg_hba.conf

② 最下部にある認証方式を編集する。

METHODをmd5に変更してください。

pg_hba.conf
.
.
.
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

【よく使う認証方式】

ident : DBの所有者が、シェルを実行しているOSのユーザ名と一致するかで認証する、
md5 : パスワードで認証する。
trust : 認証なし。

よく使うコマンド

【ログイン前】

sudo service postgresql start : 起動
sudo service postgresql stop : 停止
sudo service postgresql restart : 再起動
sudo -u postgres psql : ログイン

【ログイン後】

\q : ログアウト
\? : ヘルプ表示
\l : データベース一覧表示
\du : ユーザー一覧表示
\c データベース名 : データベースへ接続
\z : テーブル一覧表示

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

最近のrbenvの問題点

最近のrbenvの問題点

$ rbenv -v
rbenv 1.1.2-34-g0843745
8月2日〜10日間に更新がなければ、全てこのバージョンと思われる

古いMacOSXでいろいろと試行錯誤中におきたこと。
1.openssl や curl の問題かは不明だが、rbenvが行うruby 2.5.8のダウンロードに失敗する。
2.ダウンロード失敗にエラー表示が不足している。この為、1の時に原因がopensslかcurlかcert.pemがユーザーには全く不明。

ダウンロード出来れば何でもいいという話になる。しかし

3.iterm2上からコマンドで、curl -KO または-LOで
https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.8.tar.gz
のダウンロードには成功する。訳が分からないよ。

以下はMacOSX El Capitan 10.11でおきたこと。
4.openssl 1.1.1gがインストール済みでパスが通っていても.rbenv下に別途インストールする。
5.rbenv install 2.5.8でダウンロード成功する。
この時、
ruby 2.0.0と
$ ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
"/System/Library/OpenSSL/cert.pem"
のままで
/usr/local/bin/opensslの1.1.1g(使われないが。)
/usr/local/bin/curlの7.71.1
の組み合わせで成功するのはどういうことなのか?
curlで通信していると思われるがwget?
古いcurlが使われている?

curl7.30.0
$ /usr/bin/curl --version
curl 7.30.0 (x86_64-apple-darwin13.0) libcurl/7.30.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IPv6 Largefile NTLM NTLM_WB SSL libz

6,これはユーザー側の問題だが、
export PATH="$HOME/.rbenv/bin:$PATH"
が公式だと不要?ネットの解説だと必要と書かれている事例が多く、不要なガイドもある。
最新版(rbenv 1.1.2)はbash_profine(zshenv)に追加しないと動かない。

以下のコマンドを行う。
$ echo "$(rbenv init -)"
export PATH="/Users/xxxxxxx/.rbenv/shims:${PATH}"
pbenvもパス追加をしている。これもrbenvのプログラム側で行われるべきでは?

参考1.重要かもしれない(2015年の記事)
rbenv + ruby-build はどうやって動いているのか - takatoshiono's blog

homebrew と rbenvで大きくディレクトリが異なる。
本来はprefix指定やインストール後のリンクを張ることで複数ディレクトリでも問題がないはずだがhomebrew と rbenv共に色々とオカシイのでは?

結論
上記問題が解決しない限りrbenvを使わずに、当分はrubyソースビルドしてパス切り替えがベストと考える

参考2
rbenvは何をしているのか? - ザリガニが見ていた...。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】条件分岐内で標準出力を使う方法

アルゴリズム問題を解くときのようにgetsを使って標準入力を入れようとしたところ以下のようなエラーになった

$ ruby enc_main.rb new
Traceback (most recent call last):
        2: from enc_main.rb:12:in `<main>'
        1: from enc_main.rb:12:in `gets'
enc_main.rb:12:in `gets': No such file or directory @ rb_sysopen - new (Errno::ENOENT)

対処方法

以下のコードに$stdinを使ったgetsメソッドを使うと解消した。

if ARGV[0] == "new"
  puts "What's Name?"
  name = $stdin.gets

参考にしたドキュメント

$stdin (Ruby 2.7.0 リファレンスマニュアル)
Rubyでstdinを使う方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsでワクワク個人開発  第一回:仕様書とDB設計をしてみる

個人開発をやっていくぞ

 以前の記事でRubyをつかってひととおりのロジックを組むことはできるようになった。そういうわけで、こんどはRailsでなにかをつくってみることにした。何かしらのウェブサービスをつくろう。

ざっくりとした仕様書を書く

 なにはともあれ、仕様書チックなものが必要だった。自分のやりたいことを明確にしておきたい。わたしが作りたいのは 「わいわい観察日記」 である。観葉植物の成長記録をみんなでシェアできるようにしたい。そのうち、IoTプロダクトとデータを連携していろいろやりとりできるようにしたい。

https://github.com/kyokucho1989/waiwai-kantatsu-nikki

# ワイワイ観察日記

## これはなにか
 植物を観察する日記をシェアするウェブサービス
 (室内の植物限定)

## ベネフィットはなにか
 栽培記録をシェアすることで、栽培するモチベーションを保つことができる

## ユーザーの想定
- さいきん植物を家で育て始めた人
- 観葉植物がすきなひと

## マネタイズ
- 広告配置(植物のタネとか?)
- 部品販売

## どうやってコンテンツを増やしておくか
- 初期ユーザーはコンテンツ0のサービスに粛々と投稿してくれるのか?→否
- 開発者自らちょっとずつ投稿しておく

## つける予定の機能
### ベータ版(最低限)
- ログイン機能
- 植物の登録
- 温度・湿度の記録

### ver 1.1
- 写真投稿(スマホ/PCから)
- バッジ機能 
 毎日投稿などでバッジがもらえる

- 自分の記録へコメント投稿

### ver 1.2
- 他のユーザーの記録へコメント投稿

### ver 2.0
- IoTデバイスからのデータ送信
 soracom GPSマルチユニット

 https://soracom.jp/products/kit/gps_multiunit/

 まずは小さく始めるのが大事だ。最低限の機能ができたらリリースしてしまって、あとから大きくやっていこう。

DB設計をする

 今度はDBというものを設計する必要が出てきた。データの種類や関連性をまとめないといけない。詳しくはよくわからないけど、はじめのうちにやっておくといいらしい。

https://github.com/kyokucho1989/waiwai-kantatsu-nikki/blob/master/db-design.md

 まだ実装する予定のないデータも一応書くことにした。そうするとしっくりくる。重要なのはUserとPlantの関係だ。一人のユーザーが複数のPlantを持てる。ユーザー同士でPlantを共有することはできない。(それしたら面倒臭そう)

 こんなときは一対多の関連付けを行うらしい。モデルを作ったら、app/modelsuser.rb plant.rbへ追記する。

plant.rb

class Plant < ApplicationRecord
  belongs_to :user
end

user.rb

class User < ApplicationRecord
  has_many :plants
end

ちょっとずつ機能を実装するぞ

 個人開発をはじめてみると、モチベーション管理が非常に難しそうだなと気づいた。これをやりぬくには、目標を細切れにしてステップアップしていくしかない。githubのissue機能を使うことにした。「ここを変更したい!」「これだけやりたい!」という感情をissueに記録し、issueを1個ずつつぶしていく。

 私は忘れっぽい生き物なので、なるべくQiitaへもこまめに投稿して、個人開発の思い出を残していきたい。

 つぎはユーザーのログイン機能の実装、ネストされたリソースの作成でつまったことを書くぞ。

githubはこちらです

https://github.com/kyokucho1989/waiwai-kantatsu-nikki

 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby]Macでpumaがインストールできない[Railsとか]

pumaが原因でRailsがインストールできないんだなこれが。
sqliteがなくてインストールできないのはbrewからsqliteを入れれば解決するんだけど

macOS Catalina 10.15.6
ruby 2.6.5
gem 3.0.3
puma 4.3.5

似たような質問にxCodeがインストールされていないのでは?なんて回答もあったけど
手元ではそれで解決せず。

エラーメッセージ(クリックで展開)
gem install puma -v '4.3.5' --source 'https://rubygems.org/'
Building native extensions. This could take a while...
ERROR:  Error installing puma:
    ERROR: Failed to build gem native extension.

    current directory: /Users/rin.nakashima/.anyenv/envs/rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/puma-4.3.5/ext/puma_http11
/Users/rin.nakashima/.anyenv/envs/rbenv/versions/2.6.5/bin/ruby -I /Users/rin.nakashima/.anyenv/envs/rbenv/versions/2.6.5/lib/ruby/2.6.0 -r ./siteconf20200810-80454-doo97b.rb extconf.rb
checking for BIO_read() in -lcrypto... yes
checking for SSL_CTX_new() in -lssl... yes
checking for openssl/bio.h... yes
checking for DTLS_method() in openssl/ssl.h... yes
checking for TLS_server_method() in openssl/ssl.h... yes
checking for SSL_CTX_set_min_proto_version in openssl/ssl.h... yes
creating Makefile

current directory: /Users/rin.nakashima/.anyenv/envs/rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/puma-4.3.5/ext/puma_http11
make "DESTDIR=" clean

current directory: /Users/rin.nakashima/.anyenv/envs/rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/puma-4.3.5/ext/puma_http11
make "DESTDIR="
compiling http11_parser.c
ext/puma_http11/http11_parser.c:44:18: warning: unused variable 'puma_parser_en_main' [-Wunused-const-variable]
static const int puma_parser_en_main = 1;
                 ^
1 warning generated.
compiling io_buffer.c
compiling mini_ssl.c
mini_ssl.c:145:7: warning: unused variable 'min' [-Wunused-variable]
  int min, ssl_options;
      ^
mini_ssl.c:299:40: warning: function 'raise_error' could be declared with attribute 'noreturn' [-Wmissing-noreturn]
void raise_error(SSL* ssl, int result) {
                                       ^
2 warnings generated.
compiling puma_http11.c
puma_http11.c:203:22: error: implicitly declaring library function 'isspace' with type 'int (int)' [-Werror,-Wimplicit-function-declaration]
  while (vlen > 0 && isspace(value[vlen - 1])) vlen--;
                     ^
puma_http11.c:203:22: note: include the header <ctype.h> or explicitly provide a declaration for 'isspace'
1 error generated.
make: *** [puma_http11.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/rin.nakashima/.anyenv/envs/rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/puma-4.3.5 for inspection.
Results logged to /Users/rin.nakashima/.anyenv/envs/rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0/puma-4.3.5/gem_make.out

ググってたらissueを見つけまして、Mac側のデフォルトパラメータが変わってgccでのコンパイルがうまくできなくなったらしい。
https://github.com/puma/puma/issues/2304
ワークアラウンドとして以下のように対処せよとのこと

gem install puma:4.3.5 -- --with-cflags="-Wno-error=implicit-function-declaration
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】ArgumentError: Malformed version number string 0.32+gitでwebpacker:installが実行できない場合の対処方法

はじめに

webpacker:installを実行すると表題のエラーメッセージが表示されてしまい、Railsが実行できない状況が起きました。
今回はこの現象の回避方法についてまとめます。

この記事の対象者

  • 表題のエラーメッセージが表示され、webpacker:installを実行できない人

実際にどのようなエラーになるのか

エラーに遭遇した環境

Docker公式のRuby:2.7.1を利用したコンテナで遭遇しました。
他の環境では試していないため、同じ方法で対処できると断定はできませんが、参考になればと思います。
使用したDockerfileとRailsのバージョンは以下の通りです。

Dockerfile
FROM ruby:2.7.1
LABEL maintainer="TomoProg"
RUN apt-get update -qq && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs \
    default-mysql-client \
    vim-tiny

RUN apt-get install -y yarn

RUN mkdir /myapp
WORKDIR /myapp
$ rails --version
Rails 6.0.3.2

実際のエラーメッセージ

webpacker:installを実行すると以下のようなエラーメッセージが表示されました。

root@3cd2b69c861a:/myapp# bin/rails webpacker:install
rails aborted!
ArgumentError: Malformed version number string 0.32+git
/usr/local/bundle/gems/webpacker-4.2.2/lib/tasks/webpacker/check_yarn.rake:12:in `block (2 levels) in <main>'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/commands/rake/rake_command.rb:23:in `block in perform'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/commands/rake/rake_command.rb:20:in `perform'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/command.rb:48:in `invoke'
/usr/local/bundle/gems/railties-6.0.3.2/lib/rails/commands.rb:18:in `<main>'
/usr/local/bundle/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
/usr/local/bundle/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
/usr/local/bundle/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
/usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:324:in `block in require'
/usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:291:in `load_dependency'
/usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:324:in `require'
/myapp/bin/rails:9:in `<top (required)>'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/client/rails.rb:28:in `load'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/client/rails.rb:28:in `call'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/client/command.rb:7:in `call'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/client.rb:30:in `run'
/usr/local/bundle/gems/spring-2.1.0/bin/spring:49:in `<top (required)>'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `load'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `<top (required)>'
/myapp/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => webpacker:install => webpacker:check_yarn
(See full trace by running task with --trace)

原因

webpacker:installする際にyarnが必要なのですが、
そのままapt-getでインストールすると0.32+gitというバージョンでインストールされてしまい、
webpack:installした際に行われるyarnのバージョンチェック時にエラーが出てしまうようです。
ちなみにyarnのバージョンは以下のコマンドで確認できます。

$ yarn --version
0.32+git

対処方法

yarnの公式サイトに掲載されているこちらのインストール方法を参考に、安定版で最新のyarnをインストールするようにDockerfileを下記のように変更しました。
(このインストール方法はUbuntu/Debianでのインストール方法です。別のOSの場合はリンク先のOperating Systemのプルダウンメニューから環境に合わせて確認してください。)

Dockerfile
FROM ruby:2.7.1

# -- 省略 --

# そのままapt-getでインストールする方法ではなく
#RUN apt-get install -y yarn

# 公式のインストール方法を参考に安定版で最新のyarnをインストールする
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install yarn

# -- 省略 --

その結果、yarnのバージョンが変わり、webpacker:installが正常に完了するようになりました。
実際のyarnのバージョンとwebpacker:installの実行結果は下記の通りです。

yarnのバージョン確認

$ yarn --version
1.22.4

webpacker:installの実行結果

root@cb295863c75e:/myapp# bin/rails webpacker:install
      create  config/webpacker.yml
Copying webpack core config
      create  config/webpack
      create  config/webpack/development.js
      create  config/webpack/environment.js
      create  config/webpack/production.js
      create  config/webpack/test.js
Copying postcss.config.js to app root directory
      create  postcss.config.js

-- 省略 --

├─ thunky@1.1.0
├─ type-is@1.6.18
├─ unpipe@1.0.0
├─ utils-merge@1.0.1
├─ wbuf@1.7.3
├─ webpack-dev-middleware@3.7.2
├─ webpack-dev-server@3.11.0
└─ ws@6.2.1
Done in 280.04s.
Webpacker successfully installed ? ?

まとめ

ArgumentError: Malformed version number string 0.32+gitが起きた際の対処方法をまとめてみました。
同じようなエラーで困っている方に参考になればと思います。

それでは良いRailsライフを!

TomoProg

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

parallelの並列数の決め方

parallel の並列数の決め方を調べたのでメモしておきます。下記の1から順に評価されて並列数が決定されます。

1.システムのプロセッサコア数

Etc.nprocessors の返すプロセッサコア数です。1CPU のシステムでは parallel を使っても後述の指定のいずれも行わなかった場合は並列数1になってしまいます。逆にサーバ機で多コアの Xoen などを使っている場合には並列数が多くなりすぎて CPU やメモリを圧迫してしまうこともあり得ます。

2. 環境変数 PARALLEL_PROCESSOR_COUNT

環境変数 PARALLEL_PROCESSOR_COUNT が設定されていると、その値が採用されます。parallel を呼び出す都度に指定する必要がないので、常に同じ並列数でよい場合には便利でしょうか。

3. in_processes/in_threads で指定する並列数

map メソッドの in_processes/in_threads オプションで都度並列数を指定できます。ここで指定するケースが一番多いですかね。

4. map/each メソッドの source 数

Parallel.map([1, 2, 3], in_process: 10)... としても並列数は3にしかならないわけですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む