手把手學習使用 Rails 5.2 ActiveStorage (DirectUpload + ProgressBar)

active-storage.gif

本文為使用 Rails ActiveStorage 的實作範例筆記。詳細介紹請參考Active Storage 概要,本文僅針對官方教學提供一個對照的實作記錄,如需部署至 Heroku 請參考在 Heroku 使用 Active Storage

繼續閱讀

分享到

Rails 5.2 with webpacker, bootstrap, stimulus starter

Create Project

1
2
3
4
# Last few parameters(--skip-* part) is only my habbit not actully required
$ rails new <project_name> --webpack=stimulus --database=postgresql --skip-coffee --skip-test
$ cd <project_name>
$ rails db:create

繼續閱讀

分享到

CSS Transitions, Animations 與 Vue

關於 transitions

要理解 Vue 轉場與動畫的運作,首先我們需要具備 CSS transitions 和 animations 的基本知識。
這邊我們不會完整交代所有的教學,而是重點式的節錄。

讓我們先從 transitions 開始,transitions 中文我們可以稱為轉場,其主要的意思定義 CSS 樣式產生變化時,兩者之間的轉換效果,所謂的轉換效果指的是變化的長度時間,延遲時間,時間控制函式(timing-function)。
舉例來說:

繼續閱讀

分享到

[譯] 解析 Javascript 模組機制與建置函式庫觀念

身為前端或 Javascript 的開發者我們或多或少都曾經受到 JavaScript Modules 這個巨大的概念所困擾了。
我們都想清楚的理解到底該怎麼使用這些工具以及它們到底在我們的日常開發中扮演什麼角色。

繼續閱讀

分享到

tmux 快速入門筆記

什麼是 tmux?

繼續閱讀

分享到

深入 ECMAScript 5 物件屬性

ECMAScript 5 延續了 ECMAScript 3 增加了新的功能。在規範中也介紹了一些新的 API 其中相對實用的功能
莫過於對於物件屬性的改進。這些新的功能讓我們能夠更進一步的控制使用者使用物件的方式,例如:替物件增加 getter, setter
,設定可列舉屬性,限制動態 刪除, 增加 屬性的用法,設定成唯讀物件等等。

而最棒的是上面說的這些功能大部分主流的瀏覽器都已經支援了,目前 ECMA-262 已經來到第八版。接下來就讓我們來學習這些新的功能。

繼續閱讀

分享到

使用 PG copy 升級 Heroku Postgres 資料庫

原文:Upgrading Heroku Postgres Databases

本文為 Heroku 官方文件的閱讀 + 翻譯筆記,最新的資料請參考官方網站。

這篇文章將會介紹如何升級 Heroku Postgres 資料庫。這裡所要說的是關於變更資料庫的 plan (付費方案的部分),以及升級資料庫版本。
關於資料庫的變更只能夠使用 Heroku CLI 指令介面來完成。

升級/變更一個正在運作的 Heroku Postgres 資料庫是一件特別需要注意的操作。

Heroku 共有三種變更方式。在所有的情況下,變更資料庫方案時,應用程式會需要停止服務一點時間,此時無法寫入任何資料。

升級方式 需求說明
PG copy 可用於所有升級的情況包含從 Hobby 方案變更到其他方案。也可用於升級 Postgres 的版本。
Follower Changeover 變更正式環境資料庫的使用方案,資料庫版本維持一致。僅可用於 Standard,Premium,Private 或 Enterprise 方案的資料庫。需花費幾小時準備 follower ,期間應用程式仍可運作,切換所需的停機時間小於 1 分鐘。
pg:upgrade 升級大型資料庫版本。僅可用於 Standard,Premium,Private 或 Enterprise 方案的資料庫。

繼續閱讀

分享到

Debian/Ubuntu 安裝 RabbitMQ

檔案下載

繼續閱讀

分享到

[譯]您閱讀的 Nodejs/Express.js 驗證機制教學(很可能)錯了

原文:Your Node.js authentication tutorial is (probably) wrong

最近花了些時間搜尋、研究 Node.js/Express.js 有關驗證機制的教學。大部分的文章要不是不夠完整,要嘛就是在安全性的部分有錯,並可能造成用戶潛在的風險。
這篇文章預計要探討這些常見驗證機制的問題、陷阱,以及點出該如何避免發生。同時也檢視一下自己閱讀或寫作的教學。在撰寫文章的同時我仍然在尋找更穩固的全方位驗證方案(會員功能)。
同時我也希望可以找到 Nodejs/Express.js 中可以和 Rails 的 Devise 匹敵的方案。

繼續閱讀

分享到

[譯]typeof 與 instanceof 技巧 - 簡易的動態型別檢查

這邊文字要講的是關於使 instanceof 可適用於更多的情形下。

1. 關於 typeof vs instanceof

在 javascript 中,當我們需要確認一個值的型別時,我們就必須要選擇對應的方法。大略來說:

  • typeof 檢查某值是否為某種原生型別
1
if (typeof value === 'string')
  • instanceof 用來檢查某個值是否為某 class 的實例物件或建構函式。
1
if (value instanceof Map)

除此之外,value.constructorvalue.constructor.name 偶爾也可以派上用場。

光是檢查原生型別和物件的方式不一樣這樣就已經非常不理想了,然後在加上 javascript 一些詭異的行為就讓事情變的更加複雜

  • typeof nullobject 並不是 null。(typeof undefined -> undefined)
  • typeof 區分 objectfunction ,而兩者都是一種物件

上面這兩個詭異的行為導致沒有簡單方式直接拿 typeof 來檢查是否為物件

  • 並非所有的物件都是 Object 的物件實例
1
2
3
4
5
6
> Object.create(null) instanceof Object
false
o = {};
// 等於
o = Object.create(Object.prototype);

2. 讓 instanceof 可以檢查原生型別

使用特定的 PrimitiveNumber 類別,下面的程式碼可以讓 expression 表達式 x instanceof PrimitiveNumber 為 true。
而能夠辦到這樣的原因是因為我們使用 Symbol.hasInstance 實作了 PrimitiveNumber 的 static method 靜態方法

關於 Symbol.hasInstance
簡單說就把 Symbol.hasInstance 當作 method 的 key 就是提供我們客製 instanceof 行為的方法。

1
2
3
4
5
6
7
class PrimitiveNumber {
static [Symbol.hasInstance](x) {
return typeof x === 'number'
}
}
console.log(123 instanceof PrimitiveNumber) // true
  1. 使用 TypeRight 函式庫檢查動態型別

TypeRight 是一個微型的函式庫用來檢查動態型別,另外它使用上面說明的方式實作。其 instanceof 運算子 如下

  • PrimitiveUndefined
  • PrimitiveNull
  • PrimitiveBoolean
  • PrimitiveString
  • PrimitiveSymbol

TypeRight 目前並不提供物件檢查的型別(PrimitiveObject) 不過您可以輕易的加入。

通過這些基本的功能,我們可以使用 TypeRight 檢查函式的參數是否正確

1
2
3
4
5
6
7
8
9
import * as tr from 'type-right'
function dist(x, y) {
tr.force(x, tr.PrimitiveNumber, y, tr.PrimitiveNumber)
return math.hypot(x, y)
}
dist(3, 4) // 5
dist(3, undefined) // TypeError

4. 其他檢查型別的方式

目前有兩個提案跟處理檢查型別有關的功能,正處於 stage 0 的狀態

4.1 模式匹配

這個提案稱為 ECMAScript Pattern Matching Syntax 是 Brian Terlson 和 Sebastian Markbage 提出的。
其中最主要的是 Symbol.matches 的概念,其大概的使用方式入下

1
2
3
4
5
class PrimitiveNumber {
static [Symbol.matches](x) { // (A)
return x instanceof this;
}
}

4.2 Builtin.is() 和 Builtin.typeOf()

這個提案是由 James M Snell 提出的。

Builtin.is(value1, value2) 可以檢查 value1value2 是否參考同一個 constructor。這個提案也考慮到了其他面向的問題

1
2
3
4
> Builtin.is(Date, vm.runInNewContext('Date'))
true
> Builtin.is(Date, Date)
true

Builtin.typeOf() 看起來就像是 typeof 的擴展,同時支援原生型別和內建的 class

1
2
3
4
5
6
7
8
9
10
11
Builtin.typeOf(undefined); // 'undefined'
Builtin.typeOf(null); // 'null'
Builtin.typeOf(123); // 'number'
Builtin.typeOf(new Number()); // 'Number'
Builtin.typeOf([]); // 'Array'
Builtin.typeOf(new Map()); // 'Map'
// The builtin counts, not the user-defined class
class MyArray extends Array {}
Builtin.typeOf(new MyArray()); // 'Array'

參考

分享到