サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
猫
qiita.com/QUANON
この記事は? Ruby の静的コード解析の定番 Gem の RuboCop。そのひとつひとつのルールのことを Cop と呼びます。そして、RuboCop Rails は Rails 向けのルールを RuboCop に追加するための Gem です。 ふと、RuboCop Rails で追加された Cop (ルール) を確認することで、Rails の知らない機能を知るいい機会になるのではと思いました。そこで、試しに 2022/09/09 (金) にリリースされたバージョン 2.16.0 の内容を見てみました そうすると、案の定知らないことばかりで非常に勉強になりました!そこで、実際にどんな学びがあったかこの記事で共有したいと思います 🙌 例: RuboCop Rails 2.16.0 追加された Cop #714: Add new Rails/FreezeTime cop. travel_t
require 'active_support' require 'active_support/core_ext' require 'net/http' require 'uri' # LINE に通知するためのサービスクラス。 class NotifyLINE TOKEN = 'ここに LINE Notify のトークンを入力する。' URL = 'https://notify-api.line.me/api/notify' attr_reader :message def self.call(message) new(message).call end def initialize(message) @message = message end def call Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |ht
[1] pry(main)> Character.where('EXISTS (SELECT 1 FROM anime_characters WHERE anime_characters.anime_id = characters.id)').to_a Character Load (70.1ms) SELECT "characters".* FROM "characters" WHERE (EXISTS (SELECT 1 FROM anime_characters WHERE anime_characters.anime_id = characters.id)) [2] pry(main)> Character.where(<<~SQL) [2] pry(main)* EXISTS ( [2] pry(main)* SELECT [2] pry(main)* 1 [2] pry(mai
const json = process.argv[2]; console.log(json); const obj = JSON.parse(json); console.log(obj); なお Ruby で任意のコマンドを実行する方法は複数あるが、今回は Open3.capture2 を使用する。 方法 コマンドライン引数に JSON 文字列をそのまま渡すと、Node.js 側で正しくパースできない。 require 'json' require 'open3' json = { name: '鹿目まどか', age: 14 }.to_json #=> "{\"name\":\"鹿目まどか\",\"age\":14}" stdout, _status = Open3.capture2("node hoge.js #{json}") # SyntaxError: Unexpected
はじめに 現在携わっているとある Rails 5 プロジェクトでは、リクエストに応じて接続先の DB を切り替えるというマルチテナント構成を採用しています。具体的には URL のサブディレクトリに応じて切り替えています。DB の切り替えは Apartment という Gem を使っているのですが、Rails 6 からデフォルトで複数データベース接続機能が追加されるので試してみました。 例題 URL のサブディレクトリに応じて接続するデータベースを切り替えたい。 方法 実装 まず database.yml を次のように書きます。common が共通データベースで hidamari, madomagi がテナントのデータベースのイメージです。この状態で bin/rails db:migrate を実行すると、各データベースで同じマイグレーションが実行されます。 default: &defaul
例えば、User モデルの一覧を取得して、 User の name を key、オブジェクトを value とした hash を作りたいとします。 その場合、例えば以下のように実装しますよね。 User.all.inject({}) { |hash, user| hash[user.name] = user; hash } # => {"美樹さやか"=>#<User id: 1,...>, "佐倉杏子"=> #<User id: 2,...">, "巴マミ"=>#<User id: 3,...>} User.all.index_by { |user| user.name } # => {"美樹さやか"=>#<User id: 1,...>, "佐倉杏子"=> #<User id: 2,...">, "巴マミ"=>#<User id: 3,...>} User.all.index_by(&:
問題点 あるプロジェクトの Rails のバージョンを 5.1 から 5.2 に上げると次のコードで警告が発生するようになった。 DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): "COALESCE(order_no, 0)". Non-attribute arguments will be disallowed in Rails 6.0. This method should not be called with user-provided values, such as request parameters or model attributes. Known-safe values
はじめに 僕は Nginx を使用した Web アプリケーションで SSL/TLS を使用する場合は、設定ファイルで ssl_protocols を ssl_ciphers を明記しなくてはならないと思い込んでいました。そのため、いつも Mozilla SSL Configuration Generator からディレクティブをコピペしていました。しかし、これらのディレクティブを省略しても Qualys SSL LABS SSL Server Test で高スコアを出せることが分かりました。では省略した場合にはプロトコルや暗号スイートの指定はどうなるのか、調べてみました。 省略した場合の挙動 公式ドキュメント Nginx » Configuring HTTPS servers の冒頭に答えはありました。 The directives ssl_protocols and ssl_cipher
はじめに 僕は GitHub Pages でちょっとした自己紹介ページを運用してます。 このページは Nuxt.js で作成したのですが、今回はこのページを PWA (Progressive Web Apps) 化してみます。Nuxt.js を使うと PWA 化が非常に簡単にできるのです 方法 nuxt-community/pwa-module の README.md を参考にします。 まず @nuxtjs/pwa をインストールします。
この記事は まだ Webpacker を使ったことがなかったので、今回 Webpacker で Vue.js を使った Rails プロジェクトを作成し、さらに Bootstrap および Bootswatch の任意のテーマを導入するところまで試してみました。 手順 Rails プロジェクトのディレクトリを作成します。この例では hidamarisou にします。
はじめに この記事は Python Advent Calendar その 2 の 7 日目の記事です。 僕はふだんは Ruby や JavaScript のコードを書いています。一方 Python は趣味で使っていて、Python 歴は 1 年ほどです。この言語を勉強していて with 文が気に入ったので、今回はこの with 文とコンテキストマネージャについて語ります。 with 文について with 文が Python に導入された経緯については PEP 343 の Abstract で次のように書かれています。 This PEP adds a new statement "with" to the Python language to make it possible to factor out standard uses of try/finally statements. try
はじめに この記事では Rails 5.2 の目玉機能である Active Storage を試してみます。具体的にはベータ版の Rails 5.2 を使って、添付ファイルを AWS S3 にアップロードしてみます。 なお JavaScript を使って直接ファイルを Web クライアントから直接アップロードできる Direct uploads という機能については触れませんので悪しからず。 準備 Rails のバージョン 5.2.0.beta2 を使って rails new します。
はじめに 例えば Ruby では Bundler を使って Gemfile で、Node.js では npm や Yarn を使って package.json でパッケージを管理できます。 同様に Python では pip を使って requirements.txt でパッケージを管理できます。しかし Gemfile や package.json と違って機能が十分ではありません。 そこで、もっと便利なパッケージ管理方法を調べていたところ Pipfile というものを発見しました。まだ実験段階のようですが、requirements.txt より高機能で便利そうです。そして Pipenv というツールを使用することで Pipfileを取り扱うことができるようなので、試してみました。 Pipenv とは 公式ドキュメントの日本語訳 によると Pipenv — Python.org が正式に推
使用例 次の HTML を PDF に変換します。せっかくなので、PDF 文書っぽく二列表示に。 quanon/magica.html なお、文章は Wikipedia » 魔法少女まどか☆マギカ より引用しました。 そして pdf.css という PDF 専用の CSS も用意します。 @page { margin: 8.0rem 2.0rem; font-family: YuMincho, "Hiragino Mincho ProN", serif; @top-center { content: "魔法少女まどか☆マギカ"; vertical-align: bottom; font-size: 1.2rem; border-bottom: 0.1rem solid; margin-bottom: 1.2rem; } @bottom-right { content: counter(pa
はじめに HTML を PDF に変換してくれる wkhtmltopdf は便利ですがインストールがちょっと面倒です。そこで Docker で動かせたら便利そうだなと思い、試してみました。 方法 まず Dockerfile と docker-compose.yml を用意します。 FROM ubuntu:14.04 RUN apt-get update -qq \ && apt-get install -y \ build-essential \ xorg \ libssl-dev \ libxrender-dev \ wget \ unzip \ gdebi \ && apt-get autoremove \ && apt-get clean WORKDIR /opt # wkhtmltopdf をインストールする。 ENV WKHTMLTOPDF_VERSION 0.12.4 RUN
追記 この記事は 2017/08 に投稿したもので、内容が古くなっています。 現在 (2019/02/04 (月) 時点) は公式リポジトリで Docker で動かす方法が紹介されているため、それを参考にするのが最良だと思います。 GoogleChrome/puppeteer » Troubleshooting » Running Puppeteer in Docker はじめに 最近 Puppeteer を触るのにハマっています。これはヘッドレス Chrome を Node.js で操作することのできるライブラリです。この Puppeteer を Docker コンテナ上で動かせれば、様々な環境でブラウザを操作できて便利そうだなと思い、試してみました。 方法 公式リポジトリ GoogleChrome/puppeteer の README.md にあるサンプルプログラムを少しだけ編集したも
はじめに なるほどUnixプロセス ― Rubyで学ぶUnixの基礎 という本を読みました。プロセスという概念を Ruby のコードを用いて説明してくれます。非常に分かりやすい本で感動しました 復習を兼ねて書籍中の一部の Ruby コードを Python に置き換えたいです。せっかくなので、一番実用的だと思ったプロセスのデーモン化を実装しました。 コード from datetime import datetime import os import sys import time def daemonize(): """ プロセスをデーモン化する。 """ def fork(): if os.fork(): sys.exit() def throw_away_io(): stdin = open(os.devnull, 'rb') stdout = open(os.devnull, 'ab+
Unicode とは 文字集合のこと。ひとつひとつの文字に 符号位置 と呼ばれる整数値を付けて管理している。 UTF-8, UTF-16, UTF-32 とは 文字符号化方式 のこと。符号位置の整数値をコンピュータが使用できるようにバイト列に変換する。 エンディアンとは 複数のバイトからなるデータをメモリに記録する際やネットワークで送受信する際などに、バイトを並べる順番のこと。バイトオーダ と呼ぶこともある。ビッグエンディアンでは上位側から、リトルエンディアンでは下位側から並べる。 検証用コード この記事を書くにあたって Python で検証したときのコードです。 In [1]: import unicodedata In [2]: import binascii In [3]: unicodedata.name('鬱') # 名前を調べる Out[3]: 'CJK UNIFIED IDE
はじめに 数年前、はてなブログに 公開鍵暗号アルゴリズム RSA を使って実際に暗号化してみる という記事を書きました。これは Ruby を使って公開鍵暗号アルゴリズムを実際に実装してみるという内容です。数年を経て、久しぶりにこの記事の内容を復習しようと思い立ちました。今度は Python で実装してみます。 RSA について RSA は 公開鍵暗号 アルゴリズムのひとつです。現在、公開鍵暗号アルゴリズムの中では最も広く使われています。 公開鍵暗号アルゴリズムでは 2 つの鍵を使いますが、RSA では公開鍵と呼ばれる鍵で暗号化し、秘密鍵と呼ばれる鍵で復号します。その名の通り、公開鍵は誰にでも公開できる鍵で、それに対して秘密鍵は決して自分以外に見られないように隠しておく必要のある鍵です。そして、RSA のアルゴリズムはべき乗と余剰のみで表すことのできる、非常にシンプルなものです。 暗号化は次
どうも。最近 Coursera で機械学習のコースを受講している @QUANON です。 概要 教師あり学習のデータセットには、 トレーニングセット (training set) バリデーションセット (validation set) 使用しない場合もある。 テストセット (test set) があります。しかし、バリデーションセットとテストセットの違いが未だによく分からない、あるいは、なぜテストセットだけでなくバリデーションセットも必要なのかがピンと来ていないので、調べてみました。 バリデーションセットの役割 トレーニングセットを使って分類器を訓練した後で、その分類器のハイパーパラメータをチューニングするために使用します。様々なハイパーパラメータについて、同じトレーニングセットを使って訓練した後で、さらに同じバリデーションセットを使ってそのパフォーマンスを計測します。そして、最もパフォー
はじめに jQuery 3 から $.Deferred が Promises/A+ という Promise の標準規格に準拠するようになった。そこで、せっかくなので $.ajax のコールバック処理も then や catch で書いてみることにした。 done, fail, always を使う場合 $.ajax({ type: 'GET', url: '/soul_gems', dataType: 'json' }) .done((data, textStatus, jqXHR) => { console.log('done', jqXHR.status); }) .fail((jqXHR, textStatus, errorThrown) => { console.log('fail', jqXHR.status); }) .always(() => { console.log('a
require 'socket' require 'openssl' def get_certificate(host) certificate = nil TCPSocket.open(host, 443) do |tcp_client| ssl_client = OpenSSL::SSL::SSLSocket.new(tcp_client) ssl_client.hostname = host ssl_client.connect certificate = ssl_client.peer_cert ssl_client.close end certificate end 上記の get_certificate メソッドは、ホスト名を引数に取り、OpenSSL::X509::Certificate オブジェクトを返す。OpenSSL::X509::Certificate は X509
Array(3+1); //=> [undefined, undefined, undefined] Array(3+1).join('Yuno'); //=> "YunoYunoYuno"
動機 Railsにおけるサービスクラスのオリジナルルール という記事をたまたま見つけ、「自分ならこう書くかな」と感じたことがいくつかあったので、記事にしてみました。 なお の参考記事の中でさらに参考にされている 肥大化したActiveRecordモデルをリファクタリングする7つの方法(翻訳) という記事のコードを、この記事でも説明のために用いようと思います。そこで、以下は 2 つの記事をこのように呼称します。 参考記事 1: Railsにおけるサービスクラスのオリジナルルール 参考記事 2: 肥大化したActiveRecordモデルをリファクタリングする7つの方法(翻訳) さらに翻訳元の記事: 7 Patterns to Refactor Fat ActiveRecord Models ルール 1. クラス名は「動詞 (+ 目的語)」にする 参考記事 1 のものとほぼ同じルールです。末尾に
概要 こんにちは、QUANON です。 Rails 5 の Action Cable の登場により、Rails アプリケーションの可能性がぐっと広がりましたね。今回はその Action Cable のシンプルな利用例を 1 つご紹介したいと思います。 利用例 サーバ側で何か重い処理を実行しており、その進捗率を逐次ユーザに伝えることができれば便利ですよね。例えば「ユーザから大量データの CSV ファイルの生成リクエストを受け付けて、その生成状況を画面上のプログレスバーにリアルタイムで表示する」などです。クライアントから Ajax 通信でサーバに進捗率を定期的に問い合わせ、その結果を受けてプログレスバーを更新することも可能ですが、できればもっとスマートな方法を選びたいですね。 そこで Action Cable の出番です。WebSocket を使って、サーバからクライアントに直接進捗率を送って
はじめに Rails 5 で ActiveRecord に待望の or メソッドが追加されましたね。これで where メソッドで SQL をベタ書きすることなく OR 演算子が使えます!ただ、where と or を組み合わせた場合、実際にどのような SQL が発行されるのかが気になったので検証してみました。 検証 前準備 以下の Model と seed データを用意します。
create_table "weapons", force: :cascade do |t| t.integer "girl_id", limit: 4 t.string "name", limit: 255 t.datetime "created_at", null: false t.datetime "updated_at", null: false end のように自動的に limit: 4 が付与されています。 あれ、以前のバージョンでは limit なんて付かなかったのに…。 そして僕はこう思いました。 「あれ? 外部キーが 4 桁の整数だと 1 万件以上のレコードを保持できなくね?」 でも、むろんそんなことはなく、それは非常に初歩的な勘違いでした。 Rails のドキュメント を見ると、 :limit - Requests a maximum column length. Th
概要 継承や Mix-in を利用する際に、特定のメソッドの override を強制したいな。 そのような場合は NotImplementedError を利用すると便利です。 1. 継承の場合 class Mage attr_reader :name def initialize(name) @name = name end def spell "#{job} の #{name} は #{magic} を唱えた!" end private # サブクラスで必ず実装しておいて欲しい。 def job raise NotImplementedError.new("You must implement #{self.class}##{__method__}") end # サブクラスで必ず実装しておいて欲しい。 def magic raise NotImplementedError.new(
概要 Rails を使っていてちょくちょくお世話になる 単一テーブル継承 (Single Table Inheritance) (以下 STI) の機能。 この機能を使うと (デフォルトでは) type という名前の列に、その ActiveRecord オブジェクトのクラス名がキャメルケースで設定されます。 そして、Rails 4.1 にて満を持して登場した ActiveRecord::Enum。 この STI 用の type 列を enum に流用しようというのが今回の趣旨です。 具体例 例として User モデル (スーパークラス) とそれを継承した Admin, Teacher, Student モデル (サブクラス) を取り上げます。 サブクラスのモデルは Rails の STI を利用して同じ users テーブルにレコードを保存します。 class User < ActiveR
次のページ
このページを最初にブックマークしてみませんか?
『@QUANONのマイページ - Qiita』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く