Stan's Blog

[Rails] 在 where 裡使用 SQL function substring

最近碰到一個需求, A model after_create 後要用新建的 instance, 去跟 B model 的欄位比對字串

這時候可以使用 like, 不過因為我只想用 A model instance colmun 比對 B modle column 前 8 碼

這時可以使用 substring

B.where("substring(text, 1, #{tac.length}) = #{tac}")

substring 裡面第一個參數是你要比對的欄位, 第二個參數是起始位置, 第三個參數是長度
等於後面的變數是要比較的 key

SQL SUBSTRING 函數

----- Update -----

本來想用 substring + 打 index 實作, 後來發現 substring 吃不到 index QQ

後來用 like + 打 index (將要比對的 column 前 8 碼打 index Creating an index with specific key length) 解決了

B.where("text LIKE ?", "#{tac}%")

這邊要注意的是, 如果前後都包了百分比符號 (%), 則不會觸發 index

我這次的需求是比對前 8 碼, 所以只要後面加百分比符號 (%) 即可

[Coscup] RUBY 上 REDIS 的四種寫法

講者: 丁盛豪 (網路代號: 東仙隊長)
github

  1. redis-rb

redis.get、redis.set
最核心的 code 只有 5 行

redis get、set override 了 method missing

  1. action cable 也用了 redis

rails 是多線程的 model
在 ruby 裡面 redis 是非同步的 i/o blocking
response time 裡有百分之 90 都是 i/o blocking time

文件裡寫的 async 是 development mode
在 production mode 是非同步

  1. EM-HIREDIS

event machine
c 的 drive 在 ruby 綁定

用了很多 callback 做這件事
2019 JS 都不這麼寫了, 如果還這麼寫是不是很傻

講者重寫版本 midori-contrib
後期覺得自己維護太累了, 還要上班

沒多久出現了 falcon, 做的事跟講者幾乎一樣, 講者考慮將自己 gem 的一些部分核心 code 給 merge 進 falcon

  1. ohm

大家都把 redis 當作 cache & counter
redis 官方說明, in-memory data structure store, used as a database, cache and message broker.

why do you use redus for cache
  • single-threaded key-value database (easy to use)
  • time-based mwssage broker (TTL support)
  • rich data stucture support (LRU support)
  • 圖靈完備 (Lua support)

gem ohm
停止維護一段時間了, 不過講者自己的經驗, 用 ohm 上 production 到現在四、五年了沒遇到什麼問題

用在風控系統 login token

也有用在氣象監控資料 (很固定時間會產出很多資料)
用了 ohm 可以把 reids 當關聯式資料庫來用

當然, redis 也有一些小問題
舊的資料應該要放到 disk 裡, 留新的資料當 hot data

redis 替代品:

  1. ssdb
    背後加了 google 的 Level DB, 資料一但變多, 會移動一部分去 level db
    資料量大的時候效能會比較好

  2. codis
    不過好像沒在維護了 XD

Summary:

  • 正視 ruby 上 redis 存在的效能問題
  • 正確使用 ruby 上的 redis
  • 發揮 ruby 的優勢用好 redis
  • 將 ruby 的簡潔性和 reids 的簡潔性有效結合

補充:
簡單的分布式系統可以用 redis 當鎖

ohm 用在 production, 要 call 資料,正常是繼承 active record 改成繼承 ohm model

共筆連結

邊聽邊寫 如果有錯誤的地方, 請不吝指教, 謝謝

[Linux] 使用 bridge-utils 操作 bridge

這幾天在看 docker 是怎麼實現 container 網路隔離的

在 ubuntu 16.04 上想要對 bridge 進行操作

可以使用 brctl

brctl show 查看橋接介面狀態, 如果找不到指令

可以用 sudo apt-get install bridge-utils 安裝

[心理學] ABC 理論

ABC 理論是由美國心理學大師 Albert Ellis 所提出

概念是可以把生活中所碰到的任何挫折,分為 ABC 三部分:

  • A 是 Adversity(挫折)
  • B 是 Belief(信念、心態)
  • C 是 Consequence(後果)

A 是引發 C 的間接原因,引起 C 的直接原因是個體對 A 的認知產生的 B

假設有兩個人,他們都有同樣的 A
但他們的 B,一個是正向樂觀的一個是負面悲觀的
那他們的 C 就會是截然不同的兩種結果

Ref:
情緒ABC理論

[Docker] 使用 docker-compose dockerize rails 專案

  1. 建立基本檔案

create Dockerfile, docker-compose.yml, Gemfile, Gemfile.lock, entrypoint.sh

填入

### Dockerfile

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
### docker-compose

version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
### Gemfile

source 'https://rubygems.org'
gem 'rails', '~>5'
### entrypoint.sh

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
  1. 執行 rails new

docker-compose run web rails new . --force --no-deps --database=postgresql

  1. 建立 docker image

docker-compose build

  1. 執行 docker

docker-compose up

  1. 建立 db
docker ps
docker exec -it {container id} /bin/bash

docker-compose run web rake db:create

  1. 完成

localhost:3000 可以看到 rails 預設歡迎頁面

Ref:

Quickstart: Compose and Rails

[理財] 年化報酬率 & 風險報酬比

年化報酬率

年化報酬率(%) = 總報酬率/年數

如期滿有 12% 的報酬率, 指的是 '累積報酬率'

若 1年期滿, 年化報酬率(12% / 1y)= 12%
若 3年期滿, 年化報酬率(12% / 3y)= 4%
若 6年期滿, 年化報酬率(12% / 6y)= 2%

年化報酬率是拿 '時間' 衡量 '報酬'

風險報酬比

風險報酬比 = 報酬/風險
簡稱 風報比

冒著 1% 損失機會, 賺取 1%, 風報比為 1

風險報酬比是啥 '風險' 衡量 '報酬'

[心理學] SMART 原則

SMART分別代表著

  • S - Specific (具體的)

目標必須是具體的,例如 '想減重' 具體一點就是 '減重 5kg'

  • M - Measureable (可度量的)

盡可能有具體數字可以量化

  • A - Achievable (可達成的)

門檻不宜太高或太低

  • R - Relevant (有關連的)

目標與其他目標有相關性

  • T - Time based (有時效性的)

給目標設立一個期限

Ref:
SMART原則