YOSHINO日記

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

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(){ …

Ember.js入門6: 基本的なルーティング

emberでは名前が非常に重要である。 emberにおいても、Railsと同じく名前がとても大事な意味をもつ。 例えば、 create app/templates/helloworld.hbs create app/controllers/helloworld.js のファイルで定義されるデータはbindingされている。 indexは特殊 …

Ember.js入門5: 配列に使える様々なメソッド

forEach rubyのeach_with_index const students = ['Erik', 'Jim', 'Shelly', 'Kate']; students.forEach(function(item, index) { console.log(`Student #${index+1}: ${item}`); }) Student #1: Erik Student #2: Jim Student #3: Shelly Student #4: Kate…

Ember.js入門4: mixinでコードをDRYに記述する

Rubyでいうと、classにmoduleをincludeするのとすごく似ている。 app/app.js myObject.jsはincludeする必要がある。 import Application from '@ember/application'; import Resolver from './resolver'; import loadInitializers from 'ember-load-initiali…

Ember.js入門3: bindingsでオブジェクトのプロパティ同士を結びつける

bindings: setもgetもできる import EmberObject from '@ember/object'; export default function() { const Teacher = EmberObject.extend({ homeroom: '', age: '', gradeTeaching: '' }); const Student = EmberObject.extend({ homeroom: Ember.computed…

Ember.js入門2: computed propertiesとobserverで状態変化を監視する

とりあえずObjectをつくる app/app.js import Application from '@ember/application'; import Resolver from './resolver'; import loadInitializers from 'ember-load-initializers'; import config from './config/environment'; import myObject from '.…

ember.js入門1: Ember CLI  ターミナルでemberコマンドを実行する

セットアップ:Ember CLI 前提 Ember CLIをインストールする環境としてnpmとnodeをがインストールされている必要がある。 環境は以下。 OS: ubuntu 17 $ npm -v #=> 6.1.0 $ node -v #=> v9.2.1 ember-cli グローバルにインストールする $ sudo npm install …

cancancanの内部の動きを追う

はじめに cancancan https://github.com/CanCanCommunity/cancancan 権限を一元管理できるgem。 とっても便利。 内部動作が気になったので追ってみます。 1: viewのcan? まず、viewのcan?が読み込まれます。 - if can? :buy, @product %h2 Anyone can buy P…

Rails: delegateを使ってモデルのフォームをすっきりさせる

delegate delegateを使います。 最近知ったRailsの便利なメソッド 指定したクラスのメソッドを簡単に呼び出せるようにしてくれます。 モデルの定義 schema create_table "accounts", force: :cascade do |t| t.integer "user_id" t.string "email" t.binary …

Rails: Referenceとforeign_keyの違い

referencesで”外部制約キーはつかない”とは、どういうことなのか? 参照整合性 参照整合性によって、テーブル(表)の列と列との依存関係を定義する。この依存関係において、参照する列を参照列(外部キー)、参照される列を被参照列と呼ぶ。参照列(外部キ…

RubyでつくるRuby

インタプリタの実装は難しいものではない。そんなに 作者は、Rubyコミッターの、遠藤侑介さんです。 あとがきにも書いてありますが、 すでにRubyや他言語のプログラミングを知っている方に、「インタプリタの実装」というのはそんなに難しいものではない、と…

ActiveStorage : N+1問題を回避しよう

Active Storage の N+1 Recipeモデルがあります。 カラムはnameと、ActiveStorageと関連付けられたavatar。 ActiveStorageは、モデルの中にimageが保存されるわけではなく、 active_storage_attachmentsテーブルとactive_storage_blobsテーブルとの 関連付け…

Rubyで駅データのラッパーを書いた。

API 駅データ.jp ( http://www.ekidata.jp/ ) が提供するAPIのruby wrapperです。 以下の3つのAPIをyamlデータととして使います。 都道府県API: http://www.ekidata.jp/api/api_pref.php 路線API: http://www.ekidata.jp/api/api_line.php 隣接駅API: http:…

activerecord-causeをforkして、クエリ実行時間が長いものを保存できるようにしてみた

activerecord-cause RailsのActiveRecordのログを見やすくするgemです。 GitHub - joker1007/activerecord-cause: This gem logs where ActiveRecord actually loads record クエリの実行時間が遅いものをデータベースに保存 activerecord-causeのログがキレ…

activerecord-causeを詠む

activerecord-cause? github.com ActiveRecordの読み込みが実際にトリガーされた場所をログに記録するgem ActiveRecordは必要になるまでDB読み込みをしません。 なのでやたら複雑なビューの中でクエリを弄ったり、コントローラーが肥大化してる状態でひどいS…

gimeiを詠む

gimei? github.com gimei は、日本人の名前や、日本の住所をランダムに返すライブラリです。テストの時などに使います。似たようなライブラリにfakerがあります。fakerはとても優れたライブラリで、多言語対応もしていますが、ふりがな(フリガナ)は流石に対…

stateful_enumを詠む

stateful_enumの内側をみる github.com 使い方に関しては以下の記事が参考になるかもしません。 Rails の 有限オートマトン この記事ではstateful_enumを詠んでいく過程で、個人的に気になった部分に焦点を当てて掘り下げていきます。 メソッドがoverideされ…

action_args: prependでコントローラーのsend_actionをoverrideしたもの

action_args github.com 使い方は以下の記事などを参考にしてください。 ActionArgsが素晴らしい件 #Rails この記事ではaction_argsの内側を見ていきます。 1. Contorollerのアクションが呼ばれる Railsはどのようにテンプレートを見つけているか send_actio…

Active Recordのキャッシュについて

Active Recordはどのように動いているのだろう? AdequateRecord Pro™: Like ActiveRecord, but more adequateより参照 1: ActiveRecord::Relationのインスタンスを生成します。 2: ARel::NodeにActive Recordにより変換されます。 GitHub - rails/arel: A…

RailsとSQLとNULL:恐怖のUnkown

恐怖のunknownとは? SQLアンチパターンで紹介されている、SQLのnullの挙動に関する誤解から生じる問題が引き起こす nullに対するプログラマーの恐怖を意味します。 nullではないカラムを検索する Nullnullという名前のテーブルを作ります。 rails g model N…

セレクトボックスのアンチパターン

データベースへのアクセスがあるかどうか? データベースへのアクセスがない場合はこんな感じのviewファイルになるかと思います。 この場合、特にハマりどころは無いように思います。 <select name="example"> <option value="1">さんま</option> <option value="2">イカ</option> <option value="3">たこ</option> </select> 問題となるのはデータベースを利用して、セレクトボ…

RailsのDB設計:小数点をあつかう場合のアンチパターン

ラウンディングエラー(丸め誤差) SQLアンチパターンという本でも紹介されているメジャーなアンチパターンです。 RubyのFloatの実装はC言語のdoubleなので、やはり丸め誤差は生じます。 10.0 / 3.0 => 3.3333333333333335 本当は3.3333....と続いてほしいの…

Rake入門

taskの依存関係を理解する 最初のサンプルなので、順を追って説明していきます。 ①単純なtask task :default => :daily_report desc "1日のトレーニング内容を記録する" task :daily_report do puts "レポートを作成しました。" end ・task :default => :da…

Ruby Style Guideを読んでの気づきリスト

はじめに Ruby Style Guide読んだ。 普段、自分がrubyを使っている時には意識できていなかった点をピックアップしていきます。 case文にインデントはいらない case when song.name == "Misty" puts "Not again!" when song.duration > 120 puts "Too long!" …

rbenvをアップデートして最新のruby(2.4.2)を入れる

方法 rbenvは既にインストール済みであることが前提です。 ① rbenv-updateをインストール rbenv-updateを使ってRubyのバージョンを上げたついでにRailsをインストールした(CentOS) gem: rkh/rbenv-update $ git clone https://github.com/rkh/rbenv-update…

GitHubへssh接続する

はじめに 参照:Connecting to GitHub with SSH GitHubへのリモートリポジトリからcloneする時は、ssh keyが必要に成ります。 ①SSH keys があるかを確認します。 $ ls -al ~/.ssh この時、下のいずれかが存在すればSSH keysは存在しますが、自分の場合は無か…

Debian8にrbenvでRubyとRailsを導入する

環境 以下の環境で行いました。 ・vagrant ・virtualbox ・box-url: https://app.vagrantup.com/debian/boxes/jessie64 Ruby with rbenv ①apt-getをアップデートする $ sudo apt-get update ②rbenvに必要なものをインストール $ sudo apt-get install autoco…