發表文章

Linux 事件驅動筆記

圖片
 I/O Model Synchronous I/O Blocking Non-Blocking I/O multiplexing Asynchronous I/O Blocking 跟 Non-Blocking 差異只差在 選擇 ! Blocking 以 read (read from a file descriptor) 來舉例, 從 user space 發出 read (kernel提供的 system call) 之後, 這時候就會切換到 kernel mode,kernel 會依據給定的 file descriptor 去判斷, 這個 fd 來自哪裡,接下來等待資料,因為 kernel space 跟 user space 本身就是 isolated, 這樣在 user space 的 process crash,也不會影響到 kernel space, 所以 kernel space 拿到資料之後,因為 isolated 的關係,要將資料複製到 user space 去。 在這個過程中,user space 的 read 基本上就是一直在等結果。 read 如果失敗會有 err number 可以注意 EAGAIN EWOULDBLOCK Non-blocking 就是類似一直來問 read 目前的狀態, kernel 回到 user space 可能裝置還沒準備好,或是要等之後的操作才會生效, 這時候就會發出 EAGAIN 的錯誤,EAGAIN 不代表是真的錯誤,再試一次可能就可以, I/O Multiplexing (這個邏輯跟數位邏輯的 mux 很像,故取做 IO multiplexing) multiplexing => 有多個輸入(input), 可以透過一個 select 去決定輸出 假設 Linux 要等待很多種資料, 就可以用這個概念,去監控哪個 fd 有資料, 有資料的話就挑選出來! 所以 I/O Multiplexing 本質還是 blocking,只是可以一次監聽多個 所以像網頁伺服器要監聽很多個 incoming request,就可以用這種方式處理 select 單個 process 可以被監聽的 fd 數量有限制 (跟這個 /proc/sys/fs/file-max 有關) 因為是一個一個詢問(輪詢),所以監聽...

[Laravel] Custom guard and auth provider

圖片
前言 如果要客製自己的 auth gard 用來處理驗證與登入 首先可以從官網的 Authentication 中找到! 但是寫的有一點點不全面,在這邊重新整理一下。 如果是要用 jwt 登入這種,則可以直接參考官網即可! 大致需要 自己定義的 Auth Guard 自己定義的 User Provider (後面解釋) 用來驗證的 model 建立用來驗證的 model <?php namespace App\Models\Member; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Foundation\Auth\User as Authenticatable; class Member extends Authenticatable { use SoftDeletes; protected $table = 'members'; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', 'cell_phone', 'verified', 'status', 'facebook_id', 'line_id', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', ]; protected $dates = [ 'deleted_at', ]; } 在這邊我主要是先建立一個 Member.php 的 model 這裡有些...

[Nodejs] npm install 時跑出錯誤

在 Ubuntu 20.04, Node version: 16.13.0 在安裝 opecc 出噴出一堆錯誤,原本以為是 npm WARN deprecated node-pre-gyp@0.14.0: Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future 這個警告造成無法安裝,但更新之後一樣無法安裝 最好詳細追查錯誤 log 看到底下: 1555 error /bin/sh: 1: python: not found 大致猜測是 20.04 預設沒有 python, 而是 python3 所以用 ln -s /usr/bin/python3 /usr/bin/python 之後 重新執行 npm i 就可以安裝囉!

非同步模型筆記

Concurrency: 兩件以上的事情,同時被一個處理單位處理,以分時的方式。 ex: 處理A事情處理到一半,把 call stack 丟出去,載入 B stack 到暫存器中,以分時的方式處理。 Parallelism: 多個事件,被多個處理單位同時處理。 這兩種程式在開發的時候都非常困難,因為有 shared memory 的問題! Shares memory 會造成 1. Race condition 2. Dead lock 解決方式 1. functional programing - 每件事都是 immutable 2. Actor model - 把 mutable 的狀態封裝在物件內,只透過非同步的通訊方式交換訊息 Actor 1. 輕量化的物件,有自己內部可改變的 state,別人不可改,也不共享 2. 跑在自己的執行緒上面 3. 沒有 shared memory state 4. 別的 actor 來的訊息,會按照順序存在 mailbox 中,依序處理 5. 只能透過訊息改變其他 actor 6. 程式變得更可擴展,因為更輕量且每個 call stack 都很小 CSP Model Actor vs CSP 相同: 1. 不同的執行單元是透過傳 message 的方式溝通 2. 他們自己內部都有 private state,所以不需要 lock 3. 他們不是用共享記憶體的方式通訊,而是通訊來達到共享記憶體 不同: 1. CSP 不關注 Process 本身,所以 CPS 的 processes are anonymous,然而每個 Actor 都會有自己的身份 2. Actor 都是用非同步的方式傳送訊息,但是 CSP 則是同步,也就是 CSP 會 blocking Asynchronous model callbacks: 當相依的事件做完之後,會呼叫下一件要做的事情 會有 callback hell 的問題 promise => async/await: promise 底層其實也是透過 callback, 只是將 callback 封裝在內部, 搭配內部 state (fulfilled, pending, reject) 的管理,將 callback hell 的問題解決。 更詳細的解說請參考:  https://zhu...

[ReactNative] react-native run ios 出錯

由於最近想學 React Native,所以便從官方文件去建置環境,但發現會出現一堆問題類似下面的 ** BUILD FAILED ** The following build commands failed: Ld /Users/xxx/Library/Developer/Xcode/DerivedData/AwesomeProject-ardlldkqvtvwnthjzmutsniznwjh/Build/Products/Debug-iphonesimulator/AwesomeProject.app/AwesomeProject normal x86_64 (1 failure) 目前對我有效的使用方式是 Podfile 也要先修正一個地方 use_flipper! 改為 use_flipper!({ 'Flipper-Folly' => '2.3.0' }) 再來是底下步驟: 1. Node.js 環境升到最新版 (目前是v15.10.0) 2. 開啟 Xcode 清除專案 # Xcode 的 Product 選項 # Clean Build Folder # 註:有人有提供需要在 File > Workspace Settings > Build System ## 從 New Build System 改為 Legacy Build System ## 但對我無效,所以我最後改回 New Build System 3. 移除一些檔案並重裝 rm -rf ~/Library/Caches/CocoaPods cd 專案路徑/ios rm -rf Pods rm -rf ~/Library/Developer/Xcode/DerivedData/* pod deintegrate pod setup pod install cd 專案路徑 rm -rf node_modules npm install # 有 Podfile.lock 也記得一起移除 4. 重新啟動 Metro server (佔用一個 terminal) npm start "--reset-cache" 5. 重新執行 npx react-native run-ios 資料來源: https...

[Jenkins] 安裝 Jenkins 與Laravel在jenkins上執行測試

圖片
安裝 我這邊使用 docker 作為快速建置的方式 可以使用  https://hub.docker.com/repository/docker/neilwangtw/jenkins-php72 此為環境 PHP7.2 且 最新的 jenkins 詳細的 Dockerfile 與 docker-compose.yml 在這 https://github.com/qazwsxedccsqzse/jenkins-php72 使用方式就是先建立個目錄 /data/jenkins 接著進去裡面將 docker-compose.yml 啟起來 docker-compose up -d jenkins 預設是使用 8080 port 接下來就是去 web 介面設定 一開始在 /data/jenkins/secrets/initialAdminPassword 會有一組 hash 是拿來解鎖 Jenkins 的 輸入完之後 一開始可以先安裝 jenkins 推薦的 plugin 有額外需要的之後可以再裝! 到這邊就設定完了 從 bitbucket 上取得 repo 1. 先透過 docker 產生一組 ssh 的金鑰 # docker exec -it {jenkins docker id} bash # su jenkins $ cd ~ $ ssh-keygen 這時候就金鑰就會在實體主機的 /data/jenkins/.ssh 公鑰: /data/jenkins/.ssh/id_rsa.pub 私鑰: /data/jenkins/.ssh/id_rsa 註: 如果遇到權限問題,可以先把 /data/jenkins 的權限設定到 777 或是先在 docker 內部產生一個檔案,看一下對應實體主機, 所產生的 user 與 group 為何,我自己這邊產生的是 tss:kvm 2. 先設定用來可以存取 bitbucket 的密鑰  在 Repository Settings 內有 Access keys 或是直接到 https://bitbucket.org/組織/專案名稱/admin/access-keys/ 去新增 jenkins 的 ssh 公鑰 這個設定完就代表 jenkins 這個用戶可...

[演算法] KMP

KMP演算法是在一段文字中,找出指定的子字串出現位置(substring search)的演算法 比較詳細的說明我就不闡述,把資料留在文末。 名詞定義一下: 在一段文字中的文字,假設叫做 text 要搜尋的子字串,假設叫做 pattern 在 text 中比對到的位置使用 i, 在 pattern 中比對的位置使用 j Prerequisites 製作出 prefix table 什麼是 Prefix table Prefix table 是這個 pattern 字串所有的子字串的最長前後綴的表 舉例: pattern = ABCDABD 各個子字串的最長前後綴 子字串 前綴 (prefix) 後綴 (prefix) 最大公前後綴字串長度 A 空 空 0 AB A B 0 ABC A,AB C,BC 0 ABCD A,AB,ABC D,CD,BCD 0 ABCDA A ,AB,ABC,ABCD A ,DA,CDA,BCDA 1 ABCDAB A, AB ,ABC,ABCD,ABCDA B, AB ,DAB,CDAB,BCDAB 2 這時候就可以把最大公前後綴字串長度變成程式在用的模式 pattern A B C D A B D 0 0 0 0 1 2 0 -1 0 0 ...