文章加密

;

2020年3月27日 星期五

node.js 實戰開發


  1. 自簽署(self-signed)的 SSL 憑證,為伺服器自行利用工具產生,而未經過第三方機構的核可。它一樣具有加密連線的效果,但訪客將需要忽略瀏覽器警示,才能夠開啟網站。在實際的應用案例上,向公眾服務的網站不應使用自簽署憑證,不過組織內部所使用的網站,則可能會見到使用自簽署憑證的情形。
  2. ad-hoc查詢: 即時查詢的意思
    https://www.itsfun.com.tw/%E5%8D%B3%E5%B8%AD%E6%9F%A5%E8%A9%A2/wiki-8619411-8195801
  3. mapreduce:
    # 這邊需要注意一下,當提到map和reduce是小寫的時候,指的會是functional programing(函數式程式設計)提供的方法。MapReduce則是開發模式。

    MapReduce其實是一種開發模式(Program Model),基本上可以把整個邏輯分成為Map階段和Reduce階段。
  • Map階段基本上會做filtering和sorting並且傳出一個key value pair做結果(以wordcount為例,每一個字會作為最後的key,而value則是1代表有一筆)
  • Reduce階段基本上會做整合(以wordcount為例,從Map傳過來的key如果一樣,表示同一個字,因此把一樣的key做加總最後的出總筆數)

    [image%5B7%5D]
4. functional programing:
要求專案的撰寫 function 追求 pure 不能有其他的副作用,變數必須是 Immutable ,用 map reduce 取代傳統的 for loop 和 while

用第三方 library 來補足原生的 method 的不足
雖然 ECMAScript 5 以後,Array.prototype 本身就支援 map reduce filter slice 等這些功能,但仍有其不足之處:

  • 如果調用處不是 Array,runtime 就會噴出錯誤。常常發生在 api 在空值或是錯誤的處理上會給出無法預期的欄位型別,這個部分常常必須前端額外處理。
  • Object 本身沒有支援類似的功能

因此我個人還蠻推薦用第三方 library 如 lodash 來取代原生的 method,好處是:

  • null undefined 的 input 處理
  • 有其他比 reduce 更強的表達力針對特定用途的 method,例如 flatten
  • 對 Object 也有提供 pickBy omitBy mapValues 等相對應的 method
  • 實作了許多底層上性能的最佳化
_.map(undefined, item => item + 1)               // []_.flatten([1, [2, 3], [4]])                      // [1, 2, 3, 4]_.pickBy({ a: 1, b: 2 }, value => value > 1 )    // { b: 2 }_.omitBy({ a: 1, b: 2 }, value => value === 2)   // { a: 1 }_.mapValues({ a: 1, b: 2 }, value => value * 2)  // { a: 2, b: 4 }
https://medium.com/@as790726/%E8%AB%87%E8%AB%87-javascript-%E9%82%A3%E4%BA%9B%E5%B8%B8%E8%A6%8B%E7%9A%84-functional-programming-%E7%9A%84%E6%A6%82%E5%BF%B5%E5%B8%B6%E4%BE%86%E4%BA%86%E6%80%8E%E6%A8%A3%E7%9A%84%E5%A5%BD%E8%99%95-82892ad20c39

5. Elasticsearch,  Neo4j,  PostgreSQL
  • Elasticsearch 基於Lucene庫的搜尋引擎。它提供了一個分布式、支持多租戶的全文搜索引擎 (NoSQL)
  • Neo4j 圖形數據庫管理系統,被描述為具有本機圖形存儲和處理的ACID兼容事務數據庫(NoSQL)
  • PostgreSQL是開源的物件-關聯式資料庫資料庫管理系統,在類似BSD授權與MIT授權的PostgreSQL授權下發行
6. CPU密集型和I/O密集型
某些進程花費了絕大多數時間在計算上,而其他則在等待I/O上花費了大多是時間,前者稱為計算密集型(CPU密集型)computer-bound或CPU-bound,後者稱為I/O密集型,I/O-bound。
CPU密集型的項目適合調用多進程,例如C
I/O密集則適合調用多線程,例如爬蟲
https://kknews.cc/zh-tw/digital/k6qm9r8.html
  • 中央處理器 (英語:Central Processing Unit,縮寫:CPU)是電腦的主要裝置之一,功能主要是解釋電腦指令以及處理電腦軟體中的資料
  • I/O(英語:Input/Output),即輸入/輸出,通常指資料在記憶體(內部和外部)或其他周邊裝置之間的輸入和輸出,是資訊處理系統(例如計算機)與外部世界(可能是人類或另一資訊處理系統)之間的通信
7. 進程 vs 線程
教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位

进程可以简单的理解为一个可以独立运行的程序单位,它是线程的集合,进程就是有一个或多个线程构成的。而线程是进程中的实际运行单位,是操作系统进行运算调度的最小单位。可理解为线程是进程中的一个最小运行单元。
  • 多线程:

    为什么要使用多线程?
    在一个程序中,有很多的操作是非常耗时的,如数据库读写操作,IO操作等,如果使用单线程,那么程序就必须等待这些操作执行完成之后才能执行其他操作。使用多线程,可以在将耗时任务放在后台继续执行的同时,同时执行其他操作。

    多线程的缺点:
    使用太多线程,是很耗系统资源,因为线程需要开辟内存。更多线程需要更多内存。
    影响系统性能,因为操作系统需要在线程之间来回切换。

    # 多线程是异步的,但这不代表多线程真的是几个线程是在同时进行,实际上是系统不断地在各个线程之间来回的切换(因为系统切换的速度非常的快,所以给我们在同时运行的错觉)。
  • 多进程:进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。凡是用于完成操作系统的各种功能的进程就是系统进程,而所有由你启动的进程都是用户进程。
    同理,多进程就是指计算机同时执行多个进程,一般是同时运行多个软件

多线程与多进程,选择谁?

下面是本人从知乎-pansz上转载的一个答案,非常通俗地回答了这个问题。
  • 单进程单线程:一个人在一个桌子上吃菜。
  • 单进程多线程:多个人在同一个桌子上一起吃菜。
  • 多进程单线程:多个人每个人在自己的桌子上吃菜。
多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了。。。此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会发生冲突争抢。
1。对于 Windows 系统来说,【开桌子】的开销很大,因此 Windows 鼓励大家在一个桌子上吃菜。因此 Windows 多线程学习重点是要大量面对资源争抢与同步方面的问题。
2。对于 Linux 系统来说,【开桌子】的开销很小,因此 Linux 鼓励大家尽量每个人都开自己的桌子吃菜。这带来新的问题是:坐在两张不同的桌子上,说话不方便。因此,Linux 下的学习重点大家要学习进程间通讯的方法。
开桌子的意思是指创建进程。开销这里主要指的是时间开销。
可以做个实验:创建一个进程,在进程中往内存写若干数据,然后读出该数据,然后退出。此过程重复 1000 次,相当于创建/销毁进程 1000 次。在我机器上的测试结果是:
UbuntuLinux:耗时 0.8 秒 Windows7:耗时 79.8 秒 两者开销大约相差一百倍。
这意味着,在 Windows 中,进程创建的开销不容忽视。换句话说就是,Windows 编程中不建议你创建进程,如果你的程序架构需要大量创建进程,那么最好是切换到 Linux 系统。
这"可能"也是放眼全世界范围,Linux 服务器远远多于 Windows 服务器的原因。

在 CPU 为多核的情况下,多线程在性能上不如多进程。
因而,当前面向多核的服务器端编程中,需要习惯多进程而非多线程


  • 并行:多个CPU实例或多台机器同时执行一段处理逻辑,是真正的同时。
  • 并发:通过CPU调度算法,让用户看上去同时执行,实际上CPU操作层面不是真正的同时。

多线程在高并发问题中的作用就是充分利用计算机资源,使计算机的资源在每一时刻都能达到最大的利用率,不至于浪费计算机资源使其闲置。



https://www.cnblogs.com/linuxAndMcu/p/11064916.html
https://blog.csdn.net/linraise/article/details/12979473

8. 關於 javascript 的 多(或應該是單)線程 多進程

9. crypto-js 加密解密
// 安裝套件npm i --save crypto-js @type/crypto-js// 使用方法var CryptoJS = require("crypto-js");​// Encryptvar ciphertext = CryptoJS.AES.encrypt('my message', 'secret key 123').toString();​// Decryptvar bytes  = CryptoJS.AES.decrypt(ciphertext, 'secret key 123');var originalText = bytes.toString(CryptoJS.enc.Utf8);​console.log(originalText); // 'my message'

9. 自治系統
或稱自治域(英文:Autonomous system, AS)是指在網際網路中,一個(有時是多個)實體管轄下的所有IP網路和路由器的全體,它們對網際網路執行共同的路由策略。





科技業常見的職務縮寫 SA SD RD PG PM DBA MIS QA Sales

https://mropengate.blogspot.com/2015/05/sa-sd-rd-pg-pm-dba-mis-qa-sales.html

2020年3月18日 星期三

前端php? 後端java? "前端 數據緩存" 和"前端 部署" 目前推薦的技術是?

是說JAVA負責大部分的後端工作(資料庫操作、核心業務邏輯、分布式)做成RESTful的API給PHP或js來訪問;

PHP主要負責更高層面的業務數據緩存、處理和操作,還有用戶終端的前端代碼在伺服器上的部署工作。

然後再是用戶瀏覽器的前端, html css js啥的。


結論:應該先看"前端 數據緩存" 和"前端 部署" 目前推薦的技術是?
https://juejin.im/post/5cd965356fb9a032435dc735

https://kknews.cc/zh-tw/tech/bx63ve6.html

tech stack:技術線,比如vue算一個技術線,angular算一個技術線...。 micro frontend, micro service:分別為前後端盡可能把程式依功能分module。In-browser versus build-time module: spa整個只做一次request算一個build-time module, 分header,nav, ...的request 算in-browser module,他們到了瀏覽器才做編譯

tech stack:技術線,比如vue算一個技術線,angular算一個技術線...。
micro frontend, micro service:分別為前後端盡可能把程式依功能分module。
In-browser versus build-time module: spa整個只做一次request算一個build-time module,他經由node-modules編譯好才傳進瀏覽器, 分header,nav, ...的request 算in-browser module,他們到了瀏覽器才做編譯

https://perskinn.com.tw/tag/line-developer-day-2019/
https://blog.techbridge.cc/2019/01/12/micro-frontends-concept/ 在這裡看到的詞

In-browser versus build-time modules

Tutorial video: Youtube / Bilibili
An in-browser javascript module is when imports and exports are not compiled away by your build tool, but instead are resolved within the browser. This is different from build-time modules, which are supplied by your node_modules and compiled away before they touch the browser.
https://single-spa.js.org/docs/recommended-setup/
https://vue.microfrontends.app/view-doggos
https://single-spa.js.org/docs/create-single-spa/
https://www.youtube.com/watch?v=Jxqiu6pdMSU&list=PLLUD8RtHvsAOhtHnyGx57EYXoaNsxGrTU&index=2
https://github.com/vue-microfrontends/root-config
https://single-spa.js.org/docs/examples/
https://github.com/single-spa/single-spa

https://stackshare.io/stacks

Webservice: an application, 提供web可調用API的服務

https://zh.wikipedia.org/wiki/Web%E6%9C%8D%E5%8A%A1
https://kknews.cc/zh-tw/news/n3v698g.html   Webservice的技術特點等等初步了解,寫得不錯

SOAP(原為Simple Object Access Protocol首字母縮寫,即簡單物件存取協定)是交換資料的一種協議規範:一個基於XML的可擴展消息信封格式,需同時綁定一個網絡傳輸協議。這個協議通常是HTTP或HTTPS,但也可能是SMTPXMPP


HTML5的直播技術有HLS、WebSocket與WebRTC,webRTC:web直接提供"視訊聊天"的技術

webRTC:
https://zh.wikipedia.org/wiki/WebRTC
https://webrtc.org/
https://blog.gtwang.org/web-development/webrtc-media-stream/

WebSocket與MSE:
https://kknews.cc/zh-tw/tech/anvlzgn.html
example:b站

TCP v.s. UDP
http://opencourse.ncyu.edu.tw/ncyu/file.php/15/week10/TCP%E8%88%87UDP.pdf

Polling、Long-Polling 與 Streaming:
輪詢(polling)的做法是讓瀏覽器每隔一段時間就自動送出一個 HTTP 請求給伺服器
這個我像就是我最初作的方式,setTimeout

長時間輪詢(long-polling)則是讓伺服器在接收到瀏覽器所送出 HTTP 請求後,伺服器會等待一段時間,若在這段時間裡面伺服器有新的資料,它就會把最新的資料傳回給瀏覽器,如果等待的時間到了之後也沒有新資料的話,就會送一個回應給瀏覽器,告知瀏覽器資料沒有更新。

雖然長時間輪詢可以減少產生原本輪詢(polling)造成網路頻寬浪費的狀況,但是如果在資料更新很頻繁的狀況下,長時間輪詢並不會比傳統的輪詢有效率,而且有時候資料量很大時,會造成連續的 polls 不斷產生,反而會更糟糕。
這個我想前端的做法還是一樣的,不一樣的是後端

串流(streaming)是讓伺服器在接收到瀏覽器所送出 HTTP 請求後,立即產生一個回應瀏覽器的連線,並且讓這個連線持續一段時間不要中斷,而伺服器在這段時間內如果有新的資料,就可以透過這個連線將資料馬上傳送給瀏覽器。

這個方式雖然不錯,但是由於他是建立在 HTTP 協定上的一種傳輸機制,所以有可能會因為代理伺服器(proxy)或防火牆(firewall)將其中的資料存放在緩衝區中,造成資料回應上的延遲,因此許多使用串流的 Comet 實作會在偵測到有代理伺服器的狀況時,改用長時間輪詢的方式處理。另外透過 TLS(SSL)的連線也可以避免緩衝區的問題,但是這個方式除了設定麻煩之外,也會造成伺服器額外的負擔。

這個狀況在你要擴充系統的規模時會更糟糕,使用 HTTP 來實作雙向的資料傳輸是一件很麻煩的事情,在維護很容易出問題,擴充也會有困難,縱使你的使用者感覺這樣即時性的網頁應用程式很好用,但是使用這樣的架構同時會讓你的伺服器與網路承受很大的工作負載量。
這個不知道實際是怎麼做的,但也比較退流行了,先不研究

雙工(duplex), 指二台通訊裝置之間,允許有雙向的資料傳輸

WebSocket 通訊協定
WebSocket 定義在 HTML5 標準中的一個新的網頁傳輸方式,可在一條連線上提供全雙工、雙向的資料傳輸,在這樣的標準下你可以很容易實作一個兼具可擴充性與即時性的網頁應用程式。另外因為 WebSocket 提供瀏覽器一個原生(native)的 socket,所以直接解決了 Comet 架構很容易出錯的問題,而在整個架構的複雜度上也會比傳統的做法簡單很多。

瀏覽器與伺服器之間若要建立一條 WebSocket 連線,在一開始的交握(handshake)階段中,要先從 HTTP 協定升級為 WebSocket 協定,瀏覽器送出:
https://blog.gtwang.org/web-development/websocket-protocol/
https://blog.csdn.net/xuchen16/article/details/81064196  (流的示例程式碼跟之前看到的原理接不起來..這部分沒看懂)
http://www.websocket.org/ 官網

多人連線,後端自動發送:
前端:
ws.onmessage = function(evt) { 
console.log(evt)

後端:
ws.on('message'data => {
        //取得所有連接中的 client
        let clients = wss.clients //多人連線

        //做迴圈,發送訊息至每個 client
        clients.forEach(client => {
            client.send(data)
        })
    })

const sendNowTime = setInterval(()=>{ //後端自動發送
        ws.send(String(new Date()))
    },1000)

ws.on('close', () => {
        clearInterval(sendNowTime)
        console.log('Close connected')
    })
https://medium.com/enjoy-life-enjoy-coding/javascript-websocket-%E8%AE%93%E5%89%8D%E5%BE%8C%E7%AB%AF%E6%B2%92%E6%9C%89%E8%B7%9D%E9%9B%A2-34536c333e1b


websocket(訊息傳遞)不能取代streaming(影片串流)

The "video" component has been registered but not used vue/no-unused-components

這句是說!!!
因為video這個標籤是程式html5的官方標籤,所以它已註冊,不可再用來當vue自定義的標籤

2020年3月4日 星期三

SaaS / PaaS / IaaS

https://progressbar.tw/posts/51

SaaS(Software as a Service),軟體即服務: facebook, gmail, ... 雲端即服務
PaaS(Platform as a Service), 平台即服務: 就像IaaS一樣提供包括基礎架構服務器,存儲和網路,而且還包括開發環境、開發工具,商業智能(BI)服務,數據庫管理系統等。以微軟Azure而言,PaaS旨在支援完整的Web應用程序生命週期:構建,測試,部署,管理和更新,並於Paas項目上提供更完善的維護及管理
IaaS(Infrastructure as a Service),基礎建設即服務: 外部租賃雲端機房、伺服器、網路環境

2020年3月2日 星期一

svn不好,還是挑用git的公司

svn 有branch的概念,但他是直接copy所有檔案,導致主機會負擔很重
git的branch概念,他只生成差異的部分,檔案很小