YOSHINO日記

プログラミングに関すること

cattr_accessor(mattr_accessor)を使うべき時って?

DHH

3通りのアクセサについて Rails: クラスレベルの3つのアクセサを比較する(翻訳) attr_accessor: 値を継承したくない場合に使う cattr_accessor(mattr_accessorのエイリアス): 値をすべてのクラスで共有したい場合に使う class_attribute: 継承した値を親ク…

SICP: 1.10 反復的な手法を見つけるには法則を見つける必要がある

問題 Exercise 1.11 gives us a function defined by the rules that f(n) = n if n < 3 f(n) = f(n - 1) + 2f(n - 2) + 3f(n -3) if n ≥ 3 再帰的手法と反復手法の両方の解法を考える。 再帰 (define (f n) (if (< n 3) n (+ (+ (f (- n 1)) (* 2 (f (- n 2…

ruby: Fileをチャンク単位でopenする

方法 blockが渡されたら、チャンク単位(以下の例では100bytes)でopen。 そうでなければ、まとめてopen。 require 'active_support' require 'active_support/core_ext' def my_open(path) if block_given? File.open(path, 'rb') do |file| while data = fil…

継承したクラスに共通の設定クラスを作成する

共通の設定ファイルをどこに書くべきか? Configure services that reference other services · rails/activestorage@e550339 · GitHub 以下のようにserviceクラスを継承したクラスがある時を考えます。 gcs < service s3 < service mirror < service disk <…

Rails: # FIXMEとチーム開発に関して

DHH

お手本 ActiveStorageでのDHHの例をみてみる。 1つはAmazon S3サービスのアップロードの例。 def upload(key, io, checksum: nil) # FIXME: Ensure integrity by sending the checksum for service side with verificarion object_for(key).put(body: io) e…

Delegate: 特定のメソッドを別のインスタンスから利用する

使いたいシチュエーション 継承も利用しているので、少し複雑ですが。 Mirror: only hit all sites for upload and delete · rails/activestorage@a8e849b · GitHub The mirror service exists for the purpose of migration, where all blobs exist in the …

Rails: 小さいクラスから大きいクラスを作る方法

DHH

委譲か継承。それが問題だ。そうなんだ。 Railsの委譲と継承について考えます。 具体的にいえば、委譲として”delegate_missing_to”、”SimpleDelegator”。 継承としてSTIを見てみます。 委譲か継承。それが問題だ。 継承の本質は、重複を避けて DRY にする事…

Ruby: 配列に重複をしないで要素を追加する

DHH

+: 重複が起こる Avoid duplicate attachments · rails/activestorage@7d3955e · GitHub a = [1, 2, 3] b = [4, 5, 6] arr1 + arr1 + arr2 #=> [1, 2, 3, 1, 2, 3, 4, 5, 6] | : 和集合を使うことで重複を避ける a = [1, 2, 3] b = [4, 5, 6] arr1 | arr1 |…

Rails:モデルに動的にメソッドを追加する

DHH

ActiveStorageのhas_fileの実装を見てみる。 Add attachments · rails/activestorage@aaf8415 · GitHub ActiveStorageのhas_fileを例に考えてみます。 class User < ActiveRecord::Base has_file :avatar end 上記のようにUserモデルにhas_file :avatarを記…

Railsのstale?: キャッシュを利用してサーバー負荷を減らす

DHH

Etag? Browser Cache: How ETags works in Rails 3 and Rails 4 - mohanraj nagasamy Ruby on Rails のConditionalGet について サーバは応答するときにコンテンツの Last-Modified とETag を付与します。ブラウザはその値を覚えておきます。 同じコンテンツ…

Railsでデザインパターン「Lazy Factory」

DHH

Lazy Factory?? 遅延読み込み - Wikipedia デザインパターンの観点では遅延初期化はFactory Method パターンと共に用いられる。これは3つのアイデアを組み合わせである。 クラスインスタンスを得るためにファクトリメソッドを利用する(Factory Method パタ…

schemeをemacsで使う

scheme開発環境をつくる 僕と契約してLisperになってよ!-Gaucheの開発環境を整えよう- - (define -ayalog '()) 結論:Emacsとgaucheの組み合わせが一番良さそう。 環境:ubuntu 18 $ sudo apt-get installl gauche $ sudo apt-get install emacs25 $ mkdir …

ActiveStorageでみた不自然な条件分岐に関して

DHH

解せぬ。 ActiveStorageのコミットログを最初から見て勉強しております。 def self.decode(encoded_key) key, expires_at = verifier.verified(encoded_key) if key # ここ!! key if expires_at.nil? || Time.now.utc < expires_at end end keyがnilを来る…

何かをした後にインスタンスを生成したい時は、tap×tapする

DHH

ActiveStorageの例 以下の例は、ActiveStorageのコードの一部である。 class << self def build_after_upload(data:, filename:, content_type: nil, metadata: nil) new.tap do |blob| blob.filename = filename blob.content_type = content_type blob.upl…

Rails on Ubuntu: MySQLのアクセスエラーと戦う

MySQL5.7のrootパスワード再設定 rootのパスワードはランダムに設定されるようなので、こちらを参考に変更する。 Reset MySQL root password on Linux パスワード無しにしたいのだけれど。。。 うっかり、mysql_secure_installationを利用した設定で、 MySQL…

Herokuにpushする時にはまった: Rails needs superuser privileges to disable referential integrity.

エラーに関して WARNING: Rails was not able to disable referential integrity.:00, ETA: 00:00:00 This is most likely caused due to missing permissions. Rails needs superuser privileges to disable referential integrity. なぜエラーがでるのか?…

自作アプリにrubocopのデフォルト設定を適用した

はじめに github.com を参考にさせていただいてアプリを作成していたのでですが、やはりデフォルトから自分で設定を変えていく方向に変更する。 現時点。 120 files inspected, 585 offenses detected Metrics/BlockLength: spec無いのblockは説明するために…

ember-cli-mirageでFixtures+Relationを行おうとするとうまくいかない(たぶんBUG)

ISSE fixtureデータを使って、モデル間の関係を、belongsToとかhasManyを利用して定義するとエラーがでる。 assert.js:39 Mirage: Your GET handler for the url /instructors threw an error: model.hasInverseFor is not a function 関連 2018/5でまだ解決…

Ember.js入門18: モックサーバーを作成してCRUDを試してみる

モックサーバーのルーティング mirage/config.js export default function() { this.get('/books'); this.get('/books/:id'); this.post('/books'); this.delete('/books/:id'); } adapterはデフォルト。 app/adapters/application.js import DS from 'ember…

Ember.js入門17: yieldを使ってコンポーネント を入れ子構造にしてみる

2つのコンポーネントを用意する 入れ子構造で利用するコンポーネントを用意します。 $ ember g component big-list # create app/components/big-list.js # create app/templates/components/big-list.hbs $ ember g component small-list # create app/com…

Ember.js入門16: コンポーネント に外部から変数をわたす

コンポーネントは外部の世界から孤立している componentは、javasciptとhbsの2つのファイルから構成されている。 $ ember g component student-list # create app/components/student-list.js # create app/templates/components/student-list つまり、コン…

Ember.js入門15: Closure action と コンポーネント : 別日コントローラーで定義されているアクションをコンポーネントから呼び出す。

コンポーネントに渡すためにアクションを定義する(closure action)。 モデルとアクションを定義します。 最終的には、このモデルとアクションをコンポーネントを経由してあつかいます。 app/routes/application.js import Route from '@ember/routing/rout…

Ember.js入門14: Componentで再利用性を高める

基本的なこと componentファイルには"-"がつかなくてはいけない。 app/components/student-info.js import Component from '@ember/component'; export default Component.extend({ click(){ $('html').fadeToggle('slow', 'linear'); $('html').delay(250).…

Ember.js入門13: 別のcontrollerやrouteの値にアクセスする

準備:2つのcontrollerを定義する こんな感じのルーティングを想定します。 import EmberRouter from '@ember/routing/router'; import config from './config/environment'; const Router = EmberRouter.extend({ location: config.locationType, rootURL:…

Ember.js入門12: コントローラーの基礎

基本的なこと ember.jsには、controllerとrouteが存在します。 覚えて置かなければいけないことの1つは、読み込まれる順番です。 1: controller 2: route です。 コントローラーの基本 最初に基本的な使い方をみてみます。 controllerでactionを定義し…

Ember.js入門11: クエリパラメーターを使って動的にviewを変更する

クエリパラメーターを実際に使ってみる app/controllers/application.js import Controller from '@ember/controller'; export default Controller.extend({ queryParams: ['student'], student: "http://localhost:4200/?student=**** クエリパラメーターを…

Ember.js 入門10: 非同期的なルーティング: RSVPを使ってロード時とエラー時の処理を行う

RSVPオブジェクト Asynchronous Routing ローディング時間の間の処理 app/router.js Router.map(function() { this.route('students'); }); Promiseを定義します。 app/routes/students.js import Route from '@ember/routing/route'; export default Route.…

Ember.js入門9:モックサーバーを作成する:Fixtureデータを使う場合。

ember-cli-mirage? テストや開発のためのクライアントサーバーのモックを作成する。 https://github.com/samselikoff/ember-cli-mirage http://www.ember-cli-mirage.com/ ember install ember-cli-mirage #=> create /mirage/config.js #=> create /mirage…

Ember.js入門8: デバックの方法

ヘルパーメソッドであるlogを使用する 例えば以下のようなコンポーネントがある場合。 app/components/log-example.js import Component from '@ember/component'; export default Component.extend({ helloText: 'Hello World' }); app/templates/component…

Ember.js入門7: viewに結びついたアクションの基礎

ボタンを押すたびにtrue、falseが切り替わる togglePropertyは、propertyの値を反転させる。 app/components/action-component.js import Component from '@ember/component'; export default Component.extend({ showText: true, actions: { toggleText(){ …