20210508のRubyに関する記事は15件です。

フリマの受け取り評価用webページを作ったら彼女に10万円でも買うと言われた

こんな静的Webページを作りました 多数の商品を継続的に購入しているので、商品管理と受け取り評価をしやすくするために、購入済みの商品を一覧表示するだけです どこに価値があるか フリマサイトより商品画像を大きく表示でき、商品を探しやすく時短 「発送待ち」などのステータスでフィルターでき、受け取り評価待ちの商品を探しやすくなり時短 画像クリックで受け取り評価ページ、「URLコピー」ボタンで商品概要ページに目的のページにすぐに飛べて時短 商品IDで検索でき時短 これが無いともう無理と言ってくれて、一人に対してですがPMFできたと思いました。 ざっくりと方法 Web Scraperを使い、商品ID、発送状況、URL、商品名をスクレイピングし、CSVでダウンロード sitemap graphはこんな感じで、paginationを自動で進んでいくようにします RubyでCSVを読み込み、HTMLを生成します。こんな感じでCSVの行数イテレートし、値を埋めていく感じです。 wrapper = <<~DIV <div class="product_wrapper col-md-3 #{status_class}"> 発送状態によって表示を変えるためクラスを付与 <div class="product_inner_wrapper"> <div class="status #{status_class}">#{status}</div> <small class="product_id">#{id}</small> <button class="copy_url" data-url='https://www.freemarket.com/jp/items/#{id}/'>URLコピー</button> <a href="#{url}" target="_blank" rel="noopener noreferrer"> <div class="title">#{title}</div> <div class="image_wrapper"> <img src="#{image_url}" alt=""> 画像URLは商品IDから類推しやすい </div> </a> </div> </a> </div> DIV 彼女はプログラマーではないので、デスクトップにシェルスクリプトの実行ファイルを用意してあげて、それをクリックするだけで下記が実行されるようにします。 ダウンロードしたCSVをWebページのレポジトリに移動 HTMLをrubyで生成 git push!! Netlifyとレポジトリを連携し、pushされると自動でデプロイされるようにします 感想 こんな簡単なWebページでも、ニーズに合致すれば大きな価値を生む可能性があると思いました。 ニーズってこんなにも具体的なのかと感じました。これまではなんとなく想像で、「人はこんなのが欲しいかもしれない」と割と荒いままのイメージを持っていました。しかし、困っていることをしつこく質問したり、毎日の彼女の作業をじっくりと観察すると「●●するのが面倒だから、この位置にこれができる機能が欲しい」というところまで具体的に出てくるものでした。これほど具体的で解像度が高いものがニーズだと思いました。今後の開発においても、できるだけ解像度の高いニーズを掴めるような開発をしていきたいと思いました。 *真似しないでください。試される場合は自己責任でお願いします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】マイグレーションファイルで作ったテーブルヘッダーを確認する方法

ヘッダー確認方法 マイグレーションファイルでテーブルを作成した時に、seedでデータを作成する際にテーブルヘッダー名を確認する方法をご紹介します。 railsコンソールで確認 Railsコンソールを起動し、対象のインスタンスを作成することで、カラムが確認できます。 ターミナル #Railsコンソールを起動 rails c #対象のインスタンスを作ることで、カラムが確認できます User.new (50.1ms) SELECT sqlite_version(*) => #<User id: nil, name: nil, email: nil, password: nil, address: nil,created_at: nil, updated_at: nil> schemaファイルで確認 migrateファイルと同じディレクトリにあるschema.rbファイルでヘッダー名を確認できます。 schema.rb ActiveRecord::Schema.define(version: 2021_05_06_105214) do create_table "users", force: :cascade do |t| t.string "name", null: false t.string "email", null: false t.string "password", null: false t.text "address" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end end 参考 unknown attribute '○○○○' for ○○○. →カラムのリネーム https://qiita.com/Ayaka_ramens/items/f0c68b08fcf6145c2b17
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby と Java と Crystal と C++ で解く プログラマーにしか解けない! #実行時間クイズ の1問目

はじめに プログラマーにしか解けない! #実行時間クイズ をやってみました。 FoH6ESorz79IWhk さん、kuizy さん、ありがとうございます。 また、実行環境としてAtCoder のコードテストをお借りしました。 AtCoder さん、ありがとうございます。 C++ c.c #include <iostream> using namespace std; int ret[10009]; int main() { int N = 10000, sum = 0; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { ret[i] += i * j; ret[i] %= 10007; } } return 0; } 元の問題より、出力部分を省略しています。 316 ms Ruby ruby.rb n = 10000 sum = 0 ret = Array.new(10009, 0) n.times do |i| n.times do |j| ret[i] += i * j ret[i] %= 10007 end end 9294 ms Java java.java class Main { public static void main(String[] args) { int ret[] = new int[10009]; int N = 10000, sum = 0; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { ret[i] += i * j; ret[i] %= 10007; } } } } 392 ms Crystal Crystal.cr n = 10000 sum = 0 ret = Array.new(10009, 0) n.times do |i| n.times do |j| ret[i] += i * j ret[i] %= 10007 end end 671 ms まとめ 遅い遅いと言われていますが、本当に遅いのを実感しました 競技プログラミングでRubyを使用している方は、何かの修行なのかもしれませんね
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

smalruby 3.0に実装されたMeshのご紹介

1:スモウルビーとScratchについて まずスモウルビー について紹介するためにScratchについて紹介します。 知っている方は2:Meshについてまで飛んでも大丈夫です。 Scratchとは Scratchはスクラッチ財団が、メディアラボのライフロングキンダーガーテングループの協力の元、開発している児童教育向けのプログラミング言語です。 だれでも無料で使用できます。皆様感謝して利用しましょう。 私も感謝して使っています。ありがとうございます。 https://scratch.mit.edu スモウルビーとは さらにScratchはそれ自体のプログラム自体が無料で公開されているので これを改造、改良させることが誰でもできます。(OSSと言います。知らないなら調べてみましょう。) スモウルビーはScratchを改造して作られたものです。 島根県に住んでいる高尾さんが作ってくれました。 スモウルビーはScratchのプログラムをRubyでも作れるようになっています。 もちろんブロックを組み合わせるタイプのプログラムも作れます。 Scratchとスモウルビーとの大きな違いはそこになります。 この点以外ではこの2つは同じものになります。 なのでこのスモウルビーはScratchから作られたのでScratchと互換があります。 基本的にScratchのプログラムはスモウルビーで動かせますし、逆もできます。 Scratchで遊んだことのある方は何も勉強しなくても遊べると思います。 もともとのScratchユーザがRubyでの遊び方や文法を理解することを想定しています。 あくまで想定なので自由に使ってください。 もちろんスモウルビーも無料で使えます。皆さんガンガン使ってください。 使ってくれると私も高尾さんも大喜びします。 https://smalruby.app 2:Meshについて ここからが本題です。 高尾さんがScratch1.4で実装されていたMeshと同じような機能をスモウルビーに実装しました。 (実装形式が本家と少し異なるそうです。) このMeshは、ほかのパソコンで動いているスモウルビーと通信を行う機能です。 高尾さんがここで説明されています。 https://github.com/smalruby/smalruby3-gui/wiki/Mesh 先生向けに要点を抜粋すると これらの機能を使えば、スモウルビーを利用して中学校の技術科の 「D(2) ネットワークを利用した双方向性のあるコンテンツのプログラミング」の授業を行うことができます。 プログラムを目的にしている人向けに要約すると お友達のスモウルビーと通信するプログラムがつくれるよ ということです。 プログラムの機能としては、ほかのパソコンのスモウルビーにメッセージや変数を送れます。 プログラミング例を紹介します。 触って覚えることも多いので実際に作ってみるのをお勧めします。 なおこのサンプルはパソコンで実行することを想定しています。 (ウインドウズとかマックとかですね) メッシュはネットワーク越しにパソコン同士で通信して使用するものだと思われてることでしょうが、 パソコン一台でも行うことができます。 ネットワーク通信か?と言われれば感覚的に違うような気もしますがネットワーク通信です。 ブラウザのページを2つ使って動作を確認しましょう。 3:サンプルプログラム実行準備 Meshの実行方法ですが、まずURLを図のように設定します。 fkengoでなくてもあなたの住んでるところの郵便番号とかでも大丈夫です。10文字までしか使えないそうなので注意!。 赤矢印の先をクリックして メッシュを選びましょう。 ここで接続するをえらぶとメッシュのホストを作ったことになります。 別のページもしくはパソコンから同じURLにアクセスしてみると(さっきのURLをコピーして別のタブ、ウインドウもしくはパソコンでアクセスしましょう。) 先ほどとは少し異なり、こういう風に見えます。下の方の「メッシュに参加する」を選びましょう。 これでメッシュを使用した通信の準備ができました。 この状態でサンプルプログラムを作成しましょう。 ちなみにサンプルはどっちがホストでも参加している方でもいいです。 私は特に意識してないです。 ホストが切断すると、参加している全てのスモウルビーがMeshから切断されます。このため、先生が利用する場合は先生がホストになるとよいでしょう。 3-1 ねこラジコン 上のウインドウをクリックしてから(アクティブにしてから) 十字キーを操作すると下のウインドウのネコが動くプログラムになっています。 これは上のウインドウのメッセージを下のネコが受け取った形になります。 このように違うウインドウのスモウルビーどうしでメッセージを使った通信が行えます。 3-2 チャット 開隆堂さんのやってみようプログラミングのチャットを実装してみると こんな感じになります。 このプログラムではワンちゃんをクリックしてワンちゃんに「わんわん」と伝えると、ネコちゃんも「わんわん」と言っています。 変数こたえを互いに送受信できるプログラムになっています。 このように開隆堂さんのやってみようプログラミングで紹介されているようなことと同じようなことができます。試してみてください。 4:補足 2021年現在、すべてのホストは設定をURLに設定をしない限り無制限に通信を行ってしまいます。 今回fkengoと設定したところです。ここを設定しなかった場合、知らない人と通信をしてしまうかもしれない設定になっています。高尾さんが今日プログラムを変更して、同じローカルネットワーク(≃おなじWifi)の郵便番号内のみ通信可能になります。(異なる仕様になるかもしれません。) それまでは扱いに気を付けてください。 5:宣伝 このスモウルビーのですが、本が一冊存在しています。 小学生向けの学習指導案が乗っており、授業でも使えるような構成になっています。 もちろんスモウルビーの本なのでscratchでも同じように指導ができるようになっています。 残念ながらMeshに関する説明は一切ありませんが。 私が去年修士論文に苦しみながら高尾さんと一緒に書いたので本屋さんで見かけたら手に取るだけでいいので見てください。 アマゾンの他、楽天でも買えますし店頭でのお取り寄せも可能です。 https://www.nikkeibp.co.jp/atclpubmkt/book/20/P60510/ 参考文献 http://www.kairyudo.co.jp/contents/02_chu/gijutsu/h33iko/yattemiyo.pdf https://github.com/smalruby/smalruby3-gui/wiki/Mesh
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでRails環境を構築する

最近副業でRailsを始めたので勉強がてらRailsやろうとなったので、Dockerで環境構築してみました。 作ったものはこちら 構成 下記構成で作成します。 Ruby Nginx MySQL ディレクトリ構造はこんな感じです。 Railsの動作環境の作成 Rails用のDockerfileの作成 まずはDockerfileを作成します。 srcディレクトリを作成し、中にDockerfileを作成。 内容は下記の様にします。 src/Dockerfile # マルチステージビルドでNode入れる FROM node:14-alpine as node FROM ruby:2.7 # nodeとyarnコピー COPY --from=node /opt/yarn-* /opt/yarn # シンボリックリンクはる RUN ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn RUN apt-get update && \ apt-get install -y git vim less build-essential graphviz cron bash g++ nodejs && \ apt-get clean #Railsアプリのルートディレクトリ作成 ENV RAILS_ROOT /var/www/src RUN mkdir -p $RAILS_ROOT WORKDIR $RAILS_ROOT RUN mkdir -p $RAILS_ROOT/tmp/sockets && mkdir -p $RAILS_ROOT/tmp/pids RUN node -v && yarn -v # ホストのGemfileのコピー COPY Gemfile Gemfile COPY Gemfile.lock Gemfile.lock RUN bundle install --jobs 20 --retry 5 解説はコメントにある通りですが、ベースイメージにruby:2.7を使用します。 なにが使えるかや、どんなイメージが有るかはDockerHubを見ます。 Railsは使用するのにNode.jsが必要です。 そのため、マルチステージビルドというのを利用します。 簡単に言うと、フォルダ内部のファイル移動と似たようなイメージです。 FROM node:14-alpine as nodeでnodeの環境ビルドされるので、そこからnodeを使うためのものを全部移動しましょう的なことです。 あとは、Railsで使うもの入れてます。 /tmp/socketsはUnixソケットでnginxと通信したいので配置用のフォルダです。 RUN node -v && yarn -vは仮にnodeやyarnがなかったときにビルドの途中で落としたいのでいれてます。 Gemfileの作成 src内にGemfileとGemfile.lockを作成します。仮に既存のプロジェクトの場合はここに配置します。 Gemfileは下記の様にしておきます。Gemfile.lockは空で大丈夫です。 source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.7.3' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 6.1.0' docker-compseを作成しnginxとMySQLと連携する 作業ディレクトリ(srcの1つ上)内にdocker-compose.ymlを作成します。 内容はこんな感じです。 docker-compose.yml version: '3' networks: rails: volumes: db-volume: bundle-data: tmp-data: services: nginx: image: nginx:stable-alpine container_name: nginx ports: - ${APP_PORT:-80}:80 volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf - ./nginx/logs:/var/log/nginx - tmp-data:/var/www/src/tmp depends_on: - rails networks: - rails rails_db: image: mysql:8.0 container_name: rails_db command: --default-authentication-plugin=mysql_native_password ports: - ${DB_PORT:-3360}:3306 volumes: - db-volume:/var/lib/mysql environment: MYSQL_DATABASE: ${DB_DATABASE} MYSQL_USER: ${DB_USERNAME} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_RANDOM_ROOT_PASSWORD: 'yes' networks: - rails rails: container_name: rails build: context: ./src dockerfile: Dockerfile depends_on: - rails_db volumes: - .:/var/www - bundle-data:/usr/local/bundle #ソケット通信用ファイルをnginxコンテナと共有 - tmp-data:/var/www/src/tmp command: puma -b unix:/var/www/src/tmp/sockets/puma.sock environment: TZ: 'Asia/Tokyo' DB_HOST: rails_db DB_DATABASE: ${DB_DATABASE} DB_USERNAME: ${DB_USERNAME} DB_PASSWORD: ${DB_PASSWORD} networks: - rails まずはnginxから nginxのイメージをそのまま利用します。 設定ファイルをバインドマウントしてます。UnixソケットはRailsコンテナのが必要なので、名前付きボリュームで共有しています。 その他エラー時に対応したいのでlogもバインドしてます。 設定ファイルは後述します。 次にMySQLです。 MySQLのイメージをそのまま利用します。 commandで認証方式を変更しています。 あとは環境変数の設定しています。 次にRailsです。 buildに先程作成したDockerfileを指定します。 tmp-dataにはpumaのソケット場所をしています。 そして、commandでUnixソケットで接続するように指定します。 railsのpuma.rbを指定してもいいのですが、記載不要で対応したいのでcommandで行います。 環境変数 環境変数を設定していきます。 ${DB_PASSWORD}のようになってる箇所ですね。 作業ディレクトリ内に.envを作成します。 DBの接続情報を記載します。DB_HOSTはrailsにわたすようにMySQLのコンテナ名を記載します。 .env DB_PORT=3360 DB_DATABASE=rails DB_USERNAME=homestead DB_PASSWORD=secret DB_HOST=rails_db nginx設定 作業ディレクトリにnginxディレクトを作成します。 default.confを作成します。 default.confの内容は下記です。 default.conf upstream rails_app { # ソケット通信したいのでpuma.sockを指定 server unix:/var/www/src/tmp/sockets/puma.sock; } server { listen 80; # ドメインもしくはIPを指定 server_name localhost; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # ドキュメントルートの指定 root /var/www/src/public; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; try_files $uri/index.html $uri @rails; keepalive_timeout 5; location ~ /\. { deny all; } location ~* ^.+\.(rb|log)$ { deny all; } # リバースプロキシ関連の設定 location @rails { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://rails_app; } } ソケット通信の設定とログの出力先を設定しています。 RailsでMySQLの接続情報 src/config/database.ymlからDBの接続情報を変更します。 default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> database: <%= ENV.fetch('DB_DATABASE', 'rails') %> username: <%= ENV.fetch('DB_USERNAME', 'homestead') %> password: <%= ENV.fetch('DB_PASSWORD', 'secret') %> host: <%= ENV.fetch('DB_HOST', 'rails_db') %> 起動する あとは起動しましょう! Railsの新規プロジェクトの場合は下記の様にプロジェクトを作成しましょう。 オプションは自分がイラないもの省いているのと、データベースをMySQLで作成してます。 docker-compose run --rm rails rails new . --force --database=mysql --skip-test --skip-turbolinks プロジェクトができたら、docker-compose up -d --buildでコンテナを全部立ち上げます。 http:localhostでアクセスできたらOK! 502が出たらnginxのエラーログを見てみましょう
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

メソッドに関する超基礎理解

はじめに railsのフレームワークに沿ってコードの記述をしていると、CRUD処理の中はメソッドを定義して、それをビューに反映させて〜といった形で、深く考えなくてもプログラムが動きます。 また、Rubyを学習し始めていた際、メソッドは「複数の処理をまとめるもの」という説明で、何となく分かった気になっていました。 そこで今回は改めて、Rubyのメソッドに関して確認しました。 メソッドについて まず大前提として、メソッドはクラス内で「何らかの振る舞いをすること」であり、その振る舞い内容をdef~end内に記述していきます。 そしてその振る舞い内容はクラス内で、「〜する。」ということになります。 つまり、 def 勉強する end となると、勉強するという部分がメソッドになります。 そのためこのメソッドは勉強するという振る舞いをするメソッドとなります。 引数について 次に引数に関してですが、引数がある場合のメソッドの内容は、「(引数を)〜する。」などの形になります。 そのため引数はメソッドに補足的な情報を与える役割があります。ex)何を、いつ、どんな なので先ほどの「勉強するメソッド」内に数学という引数を入れると、 def 勉強する(数学) end となり、「勉強するメソッド」に「何を」という補足情報が入りました。 あとはメソッドの中身を記載して、コードに反映させていきます。 def study("subject")  puts "私は#{subject}を勉強する。" end study("数学") =>私は数学を勉強する。 おわりに メソッドは〜するという振る舞い自体を指しており、引数は振る舞いに補足情報を与えている。 大雑把な理解かもしれませんが、大枠を掴むことはできました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Bootsnap::CompileCache::PermissionError

詳細画面に遷移するときshowアクションが動くときだけエラーが出る 開発環境  ruby: 2.6.5 rails: 6.1.3.1 試した事リスト • tmp/cache/bootsnap/compile-cacheのパーミッションを変更 • boot.rbの設定を変更 • casheファイルの削除 <= 解決 パーミッションの変更 $ sudo chown 777 tmp/cache/bootsnap/compile-cache  ※ パーミッションを変更する時にむやみやたらに777を指定するのはよくない boot.rb $ #require 'bootsnap/setup' コメントアウトして、bootsnapを使用しないようにできるみたいです tmp/cache/bootsnap/ディレクトリ内にあるファイル二つを削除 $ sudo rm -r tmp/cache/bootsnap/compile-cache $ sudo rm -rf tmp/cache/bootsnap/load-path-cache casheファイル削除で解決  まずはエラー文通りにパーミッションをみていきました。 そのつぎにエラー文でググっていき解決といった感じです。 permissionErrorと出てきても焦らず、permission以外の部分でも原因がないか多方面に考えていきました。 bootsnap このエラーが出てきた時に初めてbootsnapというものが何なのか勉強しました。 railsの起動を早めるようなものみたいで、なくてもいいっぽいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【閏年問題】西暦の年数および月を入力し、その月の日数を求めよ

def get_days(year, month) month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] if month == 2 if year % 4 == 0 if year % 100 == 0 && year % 400 != 0 days = 28 else days = 29 end else days = 28 end else days = month_days[month - 1] end return days end puts "年を入力してください:" year = gets.to_i puts "月を入力してください:" month = gets.to_i days = get_days(year, month) puts "#{year}年#{month}月は#{days}日間あります" 閏年は以下の判断基準で決まる。 ①その西暦が4で割り切れたら閏年である ②ただし、例外として100で割り切れる西暦の場合は閏年ではない ③ただし、その例外として400で割り切れる場合は閏年である つまり、西暦2000年は閏年であり、西暦2100年は閏年ではありません。 これらに対応できるように、出力例と雛形をもとに実装しましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby 】【閏年問題】西暦の年数および月を入力し、その月の日数を求めよ

def get_days(year, month) month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] #[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]列目 if month == 2 if year % 4 == 0 if year % 100 == 0 && year % 400 != 0 days = 28 else days = 29 end else days = 28 end else days = month_days[month - 1] end return days end puts "年を入力してください:" year = gets.to_i puts "月を入力してください:" month = gets.to_i days = get_days(year, month) puts "#{year}年#{month}月は#{days}日間あります" 閏年は以下の判断基準で決まる。 ①その西暦が4で割り切れたら閏年である ②ただし、例外として100で割り切れる西暦の場合は閏年ではない ③ただし、その例外として400で割り切れる場合は閏年である つまり、西暦2000年は閏年であり、西暦2100年は閏年ではありません。 これらに対応できるように、出力例と雛形をもとに実装しましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

1〜100までの数字を出力せよ。「3の倍数」の時は数字の代わりに文字列でFizz「5の倍数」のときはBuzz、3と5の倍数である「15の倍数」のときはFizzBuzzと出力

def fizz_buzz num = 1 while num <= 100 do if num % 15 == 0 puts "FizzBuzz" elsif num % 3 == 0 puts "Fizz" elsif num % 5 == 0 puts "Buzz" else puts num end num = num + 1 end end fizz_buzz
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby 】1〜100までの数字を出力せよ。「3の倍数」の時は数字の代わりに文字列でFizz「5の倍数」のときはBuzz、3と5の倍数である「15の倍数」のときはFizzBuzzと出力。 上記以外は数値そのまま を表示。

def fizz_buzz (1..100).each do |num| if num % 15 == 0 puts "FizzBuzz" elsif num % 3 == 0 # 値が3の倍数のときだけ、"Fizz"という出力に置き換える puts "Fizz" elsif num % 5 == 0 puts "Buzz" else puts num end end end fizz_buzz ※3と5の倍数である「15の倍数」のときは "FizzBuzz"のみを表示して "Fizz"及び、"Buzz"及び、数値を表示してはならない
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

正の整数を入力し、その整数が、 10の倍数(10,20,30...)からの差が2以内であるときはTrue それ以外はFalse と出力せよ。

num = gets.to_i def near_ten(num) quotient = num % 10 if quotient <= 2 || quotient >= 8 puts "True" else puts "False" end end near_ten(num) 「10の倍数からの差」を考えるためには、一の位の値に着目する。 すなわち、一の位が「0,1,2,8,9」のどれかであれば「10の倍数からの差が2以内」と判断することができる。 したがって、変数quotientに一の位の値を代入し、 quotient <= 2 || quotient >= 8で「0,1,2,8,9」のどれかに当てはまるかどうかを確認している。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby 】正の整数を入力し、その整数が、 10の倍数(10,20,30...)からの差が2以内であるときはTrue それ以外はFalse と出力せよ。

num = gets.to_i def near_ten(num) quotient = num % 10 if quotient <= 2 || quotient >= 8 puts "True" else puts "False" end end near_ten(num) 「10の倍数からの差」を考えるためには、一の位の値に着目する。 すなわち、一の位が「0,1,2,8,9」のどれかであれば「10の倍数からの差が2以内」と判断することができる。 したがって、変数quotientに一の位の値を代入し、 quotient <= 2 || quotient >= 8で「0,1,2,8,9」のどれかに当てはまるかどうかを確認している。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】ログイン前ユーザーのアクセス制限機能

はじめに deviseを利用したログイン前のユーザーのアクセス制限機能の実装についての備忘録です。 初学者のため間違った知識を公開している可能性もあるため遠慮なく指摘して頂ければと思います。       手順 基本的には下記の記述を任意のコントローラーに追加することで実装できる。 application_controller.rb before_action :authenticate_user!       一部のページをアクセス制限の対象から除外する場合は以下のように記述する。 application_controller.rb before_action :authenticate_user!, except: [:top]       このようにオプションとしてexcept: [:アクション名]を使用することでトップページだけはログイン前でもアクセス可能になる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails6】deviseで独自カラムを追加して使用する方法 ②

これまで これまでに、deviseのインストールと、Userモデルの作成を行いました。 今回は、ビューのカスタマイズを行っていきたいと思います。 ▽前回の記事はこちら▽ 【Rails6】deviseで独自カラムを追加して使用する方法 ① ① View 作成 View を追加するrails g devise:views コマンドを実行 rails g devise:views Running via Spring preloader in process 1254 invoke Devise::Generators::SharedViewsGenerator create app/views/devise/shared #フォルダ create app/views/devise/shared/_error_messages.html.erb #エラーメッセージ用パーシャル create app/views/devise/shared/_links.html.erb #リンク用パーシャル invoke form_for create app/views/devise/confirmations #フォルダ create app/views/devise/confirmations/new.html.erb #認証メール再送信画面 create app/views/devise/passwords #フォルダ create app/views/devise/passwords/edit.html.erb #パスワード変更画面 create app/views/devise/passwords/new.html.erb #パスワード初期化メール送信画面 create app/views/devise/registrations #フォルダ create app/views/devise/registrations/edit.html.erb #ユーザ情報変更画面 create app/views/devise/registrations/new.html.erb #ユーザ新規登録画面 create app/views/devise/sessions #フォルダ create app/views/devise/sessions/new.html.erb #ログイン画面 create app/views/devise/unlocks create app/views/devise/unlocks/new.html.erb #ロック解除メール再送信画面 invoke erb create app/views/devise/mailer #フォルダ create app/views/devise/mailer/confirmation_instructions.html.erb #アカウント認証メール create app/views/devise/mailer/email_changed.html.erb #メールアドレス変更完了メール create app/views/devise/mailer/password_change.html.erb #パスワード変更完了メール create app/views/devise/mailer/reset_password_instructions.html.erb #パスワード初期化メール create app/views/devise/mailer/unlock_instructions.html.erb #ロック解除メール 上記コマンドで、ひと通り devise 用の View ( 各ファイルに # でファイルの用途を記載しました ) が生成されます。 今から、それぞれの View をカスタマイズしていきます。 ② View の構成 devise View 用のレイアウトテンプレートを用意し、画面を表示させようと思います。 ③ レイアウトテンプレート 作成 /app/views/layouts 内に devise.html.erb という名前のファイルを作成します。 devise.html.erb <!DOCTYPE html> <html lang="ja-JP" dir="ltr"> <head> <!-- Meta_Tags--> <%= csrf_meta_tags %> <%= csp_meta_tag %> <!-- Page_Title--> <title><%= @page_title%> | Sample</title> <!-- Stylesheets--> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> </head> <body> <!-- メッセージ表示用--> <% flash.each do |message_type, message| %> <p><%= message %></p> <% end %> <%= yield %> <!-- JavaScripts--> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> </body> </html> ※ 今回分かりやすくするように devise.html.erb というファイル名にしましたが、決まりはありません。 ④ app/views/devise/shared パーシャル カスタマイズ 今回は日本語表記への変更のみを行います。 _links.html.erb_編集前 <%- if controller_name != 'sessions' %> <%= link_to "Log in", new_session_path(resource_name) %><br /> <% end %> <%- if devise_mapping.registerable? && controller_name != 'registrations' %> <%= link_to "Sign up", new_registration_path(resource_name) %><br /> <% end %> <%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %> <%= link_to "Forgot your password?", new_password_path(resource_name) %><br /> <% end %> <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %> <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br /> <% end %> <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br /> <% end %> <%- if devise_mapping.omniauthable? %> <%- resource_class.omniauth_providers.each do |provider| %> <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider) %><br /> <% end %> <% end %> _links.html.erb_編集後 <%- if controller_name != 'sessions' %> <%= link_to "ログイン", new_session_path(resource_name) %><br /> <% end %> <%- if devise_mapping.registerable? && controller_name != 'registrations' %> <%= link_to "ユーザ登録", new_registration_path(resource_name) %><br /> <% end %> <%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %> <%= link_to "パスワードを忘れた場合", new_password_path(resource_name) %><br /> <% end %> <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %> <%= link_to "確認メールが届かない場合", new_confirmation_path(resource_name) %><br /> <% end %> <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> <%= link_to "ロック解除メールが届かない場合", new_unlock_path(resource_name) %><br /> <% end %> <%- if devise_mapping.omniauthable? %> <%- resource_class.omniauth_providers.each do |provider| %> <%= link_to "#{OmniAuth::Utils.camelize(provider)} でログイン", omniauth_authorize_path(resource_name, provider) %><br /> <% end %> <% end %> ※ここでは _error_messages.html.erb のカスタマイズは行いませんが、必要に応じて行なってください。 ⑤ app/views/devise/confirmations カスタマイズ 今回は日本語表記への変更のみを行います。 new.html.erb_編集前 <h2>Resend confirmation instructions</h2> <%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email", value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %> </div> <div class="actions"> <%= f.submit "Resend confirmation instructions" %> </div> <% end %> <%= render "devise/shared/links" %> new.html.erb_編集後 <h2>確認メールの再送</h2> <%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :メールアドレス %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email", value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %> </div> <div class="actions"> <%= f.submit "確認メール再送信" %> </div> <% end %> <%= render "devise/shared/links" %> ⑥ app/views/devise/passwords カスタマイズ 今回は日本語表記への変更のみを行います。 edit.html.erb edit.html.erb_編集前 <h2>Change your password</h2> <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <%= f.hidden_field :reset_password_token %> <div class="field"> <%= f.label :password, "New password" %><br /> <% if @minimum_password_length %> <em>(<%= @minimum_password_length %> characters minimum)</em><br /> <% end %> <%= f.password_field :password, autofocus: true, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :password_confirmation, "Confirm new password" %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="actions"> <%= f.submit "Change my password" %> </div> <% end %> <%= render "devise/shared/links" %> edit.html.erb_編集後 <h2>パスワードの変更</h2> <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <%= f.hidden_field :reset_password_token %> <div class="field"> <%= f.label :password, "新しいパスワード" %><br /> <% if @minimum_password_length %> <em>(<%= @minimum_password_length %> characters minimum)</em><br /> <% end %> <%= f.password_field :password, autofocus: true, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :password_confirmation, "新しいパスワード確認" %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="actions"> <%= f.submit "パスワードの変更" %> </div> <% end %> <%= render "devise/shared/links" %> new.html.erb new.html.erb_編集前 <h2>Forgot your password?</h2> <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="actions"> <%= f.submit "Send me reset password instructions" %> </div> <% end %> <%= render "devise/shared/links" %> new.html.erb_編集後 <h2>パスワードを忘れた場合</h2> <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :メールアドレス %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="actions"> <%= f.submit "パスワードの初期化手順を送信" %> </div> <% end %> <%= render "devise/shared/links" %> ⑦ app/views/devise/registrationss カスタマイズ 今回は 日本語表記への変更 ・ 独自カラム項目の追加 を行います。 edit.html.erb edit.html.erb_編集前 <h2>Edit <%= resource_name.to_s.humanize %></h2> <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %> <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div> <% end %> <div class="field"> <%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br /> <%= f.password_field :password, autocomplete: "new-password" %> <% if @minimum_password_length %> <br /> <em><%= @minimum_password_length %> characters minimum</em> <% end %> </div> <div class="field"> <%= f.label :password_confirmation %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br /> <%= f.password_field :current_password, autocomplete: "current-password" %> </div> <div class="actions"> <%= f.submit "Update" %> </div> <% end %> <h3>Cancel my account</h3> <p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete %></p> <%= link_to "Back", :back %> edit.html.erb_編後 <h2>ユーザ情報変更 <%= resource_name.to_s.humanize %></h2> <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :メールアドレス %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="field"> <%= f.label :ユーザ名 %><br /> <%= f.text_field :user_code %> </div> <div class="field"> <%= f.label :姓 %><br /> <%= f.text_field :user_last_name, autocomplete: "last_name" %> </div> <div class="field"> <%= f.label :名 %><br /> <%= f.text_field :user_first_name, autocomplete: "first_name" %> </div> <!-- メールの認証状況の表示_未確認の場合 --> <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %> <div>メール認証を完了してください : <%= resource.unconfirmed_email %></div> <% end %> <!-- メールの認証状況の表示_未確認の場合(END) --> <div class="field"> <%= f.label :新しいパスワード %> <i>(変更しない場合は空白)</i><br /> <%= f.password_field :password, autocomplete: "new-password" %> <% if @minimum_password_length %> <br /> <em><%= @minimum_password_length %> characters minimum</em> <% end %> </div> <div class="field"> <%= f.label :新しいパスワード確認 %><br /> <%= f.password_field :password_confirmation %> </div> <div class="field"> <%= f.label :現在のパスワード %><br /> <%= f.password_field :current_password, autocomplete: "current-password" %> </div> <div class="actions"> <%= f.submit "更新" %> </div> <% end %> <h3>退会</h3> <p>退会処理を行うと元に戻せません。 <%= button_to "退会する", registration_path(resource_name), data: { confirm: "退会処理を行います" }, method: :delete %></p> <%= link_to "戻る", :back %> new.html.erb new.html.erb_編集前 <h2>Sign up</h2> <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="field"> <%= f.label :password %> <% if @minimum_password_length %> <em>(<%= @minimum_password_length %> characters minimum)</em> <% end %><br /> <%= f.password_field :password, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :password_confirmation %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="actions"> <%= f.submit "Sign up" %> </div> <% end %> <%= render "devise/shared/links" %> new.html.erb_編集後 <h2>ユーザ登録</h2> <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :メールアドレス %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="field"> <%= f.label :ユーザ名 %><br /> <%= f.text_field :user_code %> </div> <div class="field"> <%= f.label :姓 %><br /> <%= f.text_field :user_last_name, autocomplete: "last_name" %> </div> <div class="field"> <%= f.label :名 %><br /> <%= f.text_field :user_first_name, autocomplete: "first_name" %> </div> <div class="field"> <%= f.label :パスワード %> <% if @minimum_password_length %> <em>(<%= @minimum_password_length %>文字以上)</em> <% end %><br /> <%= f.password_field :password, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :パスワード確認 %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="actions"> <%= f.submit "ユーザ登録" %> </div> <% end %> <%= render "devise/shared/links" %> ⑧ app/views/devise/sessions カスタマイズ 今回は 日本語表記への変更 ・ ログインをメールアドレスから独自カラムへ変更 を行います。 new.html.erb_編集前 <h2>Log in</h2> <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %> <div class="field"> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="field"> <%= f.label :password %><br /> <%= f.password_field :password, autocomplete: "current-password" %> </div> <% if devise_mapping.rememberable? %> <div class="field"> <%= f.check_box :remember_me %> <%= f.label :remember_me %> </div> <% end %> <div class="actions"> <%= f.submit "Log in" %> </div> <% end %> <%= render "devise/shared/links" %> new.html.erb_編集後 <h2>ログイン</h2> <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %> <div class="field"> <%= f.label :ユーザ名 %><br /> <%= f.text_field :user_code, autofocus: true, autocomplete: "user_code" %> </div> <div class="field"> <%= f.label :パスワード %><br /> <%= f.password_field :password, autocomplete: "current-password" %> </div> <% if devise_mapping.rememberable? %> <div class="field"> <%= f.check_box :ログイン情報を記憶しておく %> <%= f.label :ログイン情報を記憶しておく %> </div> <% end %> <div class="actions"> <%= f.submit "ログイン" %> </div> <% end %> <%= render "devise/shared/links" %> ⑨ app/views/devise/unlocks カスタマイズ 今回は日本語表記への変更のみを行います。 new.html.erb <h2>ロック解除メール再送</h2> <%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :メールアドレス %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="actions"> <%= f.submit "ロック解除メール再送信" %> </div> <% end %> <%= render "devise/shared/links" %> ⑩ app/views/devise/mailer メールテンプレート カスタマイズ 今回は日本語表記への変更のみを行います。 confirmation_instructions.html.erb confirmation_instructions.html.erb_変更前 <p>Welcome <%= @email %>!</p> <p>You can confirm your account email through the link below:</p> <p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p> confirmation_instructions.html.erb_変更後 <p>ようこそ <%= @ user_last_name %> 様</p> <p>下記のURLから登録を完了させてください。</p> <p><%= link_to '登録', confirmation_url(@resource, confirmation_token: @token) %></p> email_changed.html.erb email_changed.html.erb_編集前 <p>Hello <%= @email %>!</p> <% if @resource.try(:unconfirmed_email?) %> <p>We're contacting you to notify you that your email is being changed to <%= @resource.unconfirmed_email %>.</p> <% else %> <p>We're contacting you to notify you that your email has been changed to <%= @resource.email %>.</p> <% end %> email_changed.html.erb_編集後 <p><%= @user_last_name %> 様</p> <% if @resource.try(:unconfirmed_email?) %> <p><%= @resource.unconfirmed_email %>にメールアドレスが変更されました。</p> <% else %> <p><%= @resource.email %>にメールアドレスが変更されました。</p> <% end %> password_change.html.erb password_change.html.erb_編集前 <p>Hello <%= @resource.email %>!</p> <p>We're contacting you to notify you that your password has been changed.</p> password_change.html.erb_編集後 <p><%= @resource.user_last_name %> 様</p> <p>パスワードが変更されました。</p> reset_password_instructions.html.erb reset_password_instructions.html.erb_編集前 <p>Hello <%= @resource.email %>!</p> <p>Someone has requested a link to change your password. You can do this through the link below.</p> <p><%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token) %></p> <p>If you didn't request this, please ignore this email.</p> <p>Your password won't change until you access the link above and create a new one.</p> reset_password_instructions.html.erb_編集後 <p><%= @resource.user_last_name %> 様</p> <p>パスワードの初期化メールが送信されました。下記のURLからパスワードの再設定が行えます。</p> <p><%= link_to 'パスワードの再設定', edit_password_url(@resource, reset_password_token: @token) %></p> <p>お心当たりのないメールはお手数ですが削除をお願いいたします。 </p> <p>上記のURLからパスワードの再設定が行われるまで、パスワードは変更されません。</p> unlock_instructions.html.erb unlock_instructions.html.erb_編集前 <p>Hello <%= @resource.email %>!</p> <p>Your account has been locked due to an excessive number of unsuccessful sign in attempts.</p> <p>Click the link below to unlock your account:</p> <p><%= link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token) %></p> unlock_instructions.html.erb_編集後 <p><%= @resource.user_last_name %> 様</p> <p>ログインに失敗した回数が多いため、アカウントがロックされました。</p> <p>アカウントのロック解除するには、下記のURLをクリックしてください。</p> <p><%= link_to 'ロックの解除', unlock_url(@resource, unlock_token: @token) %></p> ここまで行うと、ビューのカスタマイズが反映されます。 長くなりましたので、記事を分けてご紹介しようと思います。 次回は、コントローラ・モデル・ルーティングの設定を行っていきたいと思います。 ▽次の記事はこちら▽ 【Rails6】deviseで独自カラムを追加して使用する方法 ③ ~ 申し訳ございません。公開までしばらくお待ちください。 ~
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む