Skip to content

Instantly share code, notes, and snippets.

Avatar
👓
Code is fun

Vincent Nguyen vinhnglx

👓
Code is fun
View GitHub Profile
@vinhnglx
vinhnglx / migration.ex
Created Apr 23, 2018
Migration script when release a Phoenix/OTP app by Distillery
View migration.ex
# apps/myapp/lib/migration.ex
defmodule MyApp.ReleaseTasks do
@start_apps [
:postgrex,
:ecto
]
@app :myapp
def repos, do: Application.get_env(@app, :ecto_repos, [])
@vinhnglx
vinhnglx / server_types.md
Last active Aug 26, 2016
Type of servers in Rails application
View server_types.md

Webrick

Webrick is a single-thread, single-process web server.

Webrick will keep the router's connection open until it has downloaded the entirety of the request from the router. The router then will move on to the next request. Webrick server will then take the request, run the application code and send back the response to the router.

During the all of time, your host is busy, and will not accept connections from other routers. If the router attemps to connect to this host while the request is being processed, the router will wait until the host is ready.

The problem with Webrick are exaggerated with slow requests and uploads. If someone is trying to upload a big file, Webrick is going to sit there and wait while the request downloads, and will not download anything in the meantime, and it also will not accept any requests.

View littles_law.md

How many instances do you need?

There's a theoretical tool we can use, the number of instances must obey Little's Law. The definition from Wikipedia is so hard to understand. So, basically, we just need to know the formula

Number of application instances = Average number of requests per second (requests/second) * Average response time (second)

Application Instances, its job is process a single request dependently and send it back to client. When using Puma in threaded mode, application instance is the entire Puma process, when using MRI, JRuby,each thread counts as an application instance. When using Unicorn, Puma (clustered) or Passenger, your application instance is each worker process.

@vinhnglx
vinhnglx / benchmarking_profiling.md
Last active Nov 19, 2020
Difference between Benchmarking and Profiling
View benchmarking_profiling.md

Concepts

Benchmarking. We take two competing pieces of code - could be as simpler as a one liner or as complex as an entire web framework. Then, we put them up against each other (iterations per second). At the end of the task, we come up with a single metric, a score. We use the score to compare the two competing options.

In Ruby, the Benchmark module provides methods to measure and report the time used to execute Ruby code. http://ruby-doc.org/stdlib-2.0.0/libdoc/benchmark/rdoc/Benchmark.html

Profiling. Profiling your program is a way to determining which methods are called and how long each method take to complete.

@vinhnglx
vinhnglx / User.rb
Created Mar 11, 2016
Custom validation message in Rails - Override prefix
View User.rb
class User < ActiveRecord::Base
validates_uniqueness_of :email, message: 'has already taken'
end
# user = User.new(email: 'foo@bar.com')
# user.save! => User has already taken.
# If you wanna change the error message to "Your fucking account has already taken"
# just edit one file config/locales/en.yml
View before_action.md

============== #rails #tips ​​_[Mẹo hay]_​ Viết filter phức tạp cho rails controller thì nên cho vào Filter class​ Vd nếu bạn cần một filter phức tạp cho before_action, rails có một dạng là nhận vào một class

class ApplicationController < ActionController::Base
  before_action LoginFilter
end
 
class LoginFilter
@vinhnglx
vinhnglx / random.rb
Created Nov 5, 2015
Random record in Rails
View random.rb
# Inspired from Sebastien Saunier
# models/production.rb
class Production < ActiveRecord::Base
enum status: {active: 1, deactive: 0}
validates_presence_of :status
include Randomable
end
@vinhnglx
vinhnglx / omniauth_macros.rb
Created Oct 6, 2015 — forked from kinopyo/omniauth_macros.rb
Integration test with Omniauth. This example is using twitter, and assume you've installed rspec and capybara. Official document is here: https://github.com/intridea/omniauth/wiki/Integration-Testing
View omniauth_macros.rb
# in spec/support/omniauth_macros.rb
module OmniauthMacros
def mock_auth_hash
# The mock_auth configuration allows you to set per-provider (or default)
# authentication hashes to return during integration testing.
OmniAuth.config.mock_auth[:twitter] = {
'provider' => 'twitter',
'uid' => '123545',
'user_info' => {
'name' => 'mockuser',
View rspec_cheatsheet_controller_spec.rb
require 'rails_helper'
RSpec.describe TodosController, :type => :controller do
context "GET index" do
#context "POST create" do
#context "GET show" do
#context "PATCH update" do (or PUT update)
#context "DELETE destroy" do
#context "GET new" do
@vinhnglx
vinhnglx / example_nokogiri_scraping.rb
Created Sep 20, 2015
example_nokogiri_scraping.rb
View example_nokogiri_scraping.rb
require 'open-uri'
require 'nokogiri'
require 'csv'
# Store URL to be scraped
url = "https://deliveroo.co.uk/restaurants/london/maida-vale?postcode=W92DE&time=1800&day=today"
# Parse the page with Nokogiri
page = Nokogiri::HTML(open(url))
# Display output onto the screen