### 什麼是 favicon.ico favicon 是網站的圖案,在使用 Chrome 的情況下,favicon.ico 會顯示在 chrome tab 上。  在網路上有很多不同的網站可以將 png 變成為 ico 檔案。我們只需要把喜歡的圖片使用這些工具變為 ico 檔案就可以直接使用。 ### 使用 HTMLWebpackPlugin 在使用 webpack 時,我們可能要使用到 HTMLWebpackPlugin 來建立 html 的進入點 (特別是 react js)。我們可以通過設定 HTMLWebpackPlugin 的參數來設定 favicon。 ```js new HtmlWebpackPlugin({ favicon: Path.join(__dirname, 'src', 'favicon.ico') }) ``` 有關更多的使用方法,可以去 plugin 的官方 github 去查看 : https://github.com/jantimon/html-webpack-plugin
### Nginx 的設定檔 很多時我們都需要更新 nginx 的設定檔來設置新的功能到 nginx 上,但是在 production 的環境下,如果設定檔出錯可能會出現很大的狀況 !! 想安安全全的確保重新啟動 nginx 時不會出問題,最好是先檢查一下設定檔有沒有打錯的地方。 ### 檢查 我們可以通過使用以下的 command 來檢查 nginx 設定檔 : ```sh $ nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful ``` 如果成功沒有錯的話就會告訴你 syntax is ok,出錯的話則會提示你在那裏出現問題 ! 絕對是變更設定檔後,重新啟動 nginx 是必要的動作之 1 啊 !
### Reverse proxy (反向代理服務器) Reverse proxy 是指由代理伺服器接收了來自 internet 的訪問,然後會把訪問轉發給內聯網上的伺服器,然後把伺服器回傳的結果返回給 internet 的使用者。而這個代理伺服器的工作就是 reverse proxy 了。 ### 為什麼要使用 reverse proxy 很多時我們的服務器是不會直接連上 internet 的,而是由一個 firewall 來分隔開 internet 和 intranet,以確保服務器的安全。所以我們需要一個 reverse proxy 來為各種不同服務的請求分流到不同的伺服器上。 ### Nginx Nginx 除是可以成為網站伺服器外,還可以作為一個 reverse proxy。只需要在 config 檔案內設定好就可以了。 設定檔位置 : `/etc/nginx/site-availables/default` 先來看一個最普通的設定: ```text # 設定 1 個 server 設置 server { # 監聽 port 80 listen 80 default_server; listen [::]:80 default_server; # 監聽 port 443 (使用 ssl 設定) listen 443 ssl default_server; listen [::]:443 ssl default_server; # 設定 ssl 使用的證書及密匙 ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; # 設定監聽的 domain (可以多於 1 個) server_name _; # 設定文件的根目錄 root /var/www/html/; # 設定預設要存取的文件 index index.htm index.html index.php index.nginx-debian.html; } ``` 我們把上面的設定檔修改一下,刪除下面這兩個設定 : ```text root /var/www/html/; index index.htm index.html index.php index.nginx-debian.html; ``` 然後在原有的位置加入下面的設定 : ```text # 指定收到 url 的工作 location / { # 加入額外的 http header proxy_set_header X-Forwarded-For $remote_addr; # 加入額外的 http header proxy_set_header Host $http_host; # 把訪問移交到目標伺服器 proxy_pass https://localhost:8080; } ``` 下面是完整的設定檔 : ```text # 設定 1 個 server 設置 server { # 監聽 port 80 listen 80 default_server; listen [::]:80 default_server; # 監聽 port 443 (使用 ssl 設定) listen 443 ssl default_server; listen [::]:443 ssl default_server; # 設定 ssl 使用的證書及密匙 ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; # 設定監聽的 domain (可以多於 1 個) server_name _; # 指定收到 url 的工作 location / { # 加入額外的 http header proxy_set_header X-Forwarded-For $remote_addr; # 加入額外的 http header proxy_set_header Host $http_host; # 把訪問移交到目標伺服器 proxy_pass https://localhost:8080; } } ``` 經過上面的設定,就可以把來自 port 80 的訪問轉發到同一主機的 port 8080 上去了。
### Nginx Nginx 除了可以用來作為 Web 伺服器外,它還可以用來設定為 proxy,如果配上 virtual host 的話就可以在一台主機上部署多個不同的 applications。 ### Virtual host 像 apache2 一樣,nginx 也可以以不同的 domain 來分別處理的動作,只需要在 config 檔案內設定好就可以了。 設定檔位置 : `/etc/nginx/site-availables/default` 先來看一個最普通的設定: ```text # 設定 1 個 server 設置 server { # 監聽 port 80 listen 80 default_server; listen [::]:80 default_server; # 監聽 port 443 (使用 ssl 設定) listen 443 ssl default_server; listen [::]:443 ssl default_server; # 設定 ssl 使用的證書及密匙 ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; # 設定監聽的 domain (可以多於 1 個) server_name _; # 設定文件的根目錄 root /var/www/html/; # 設定預設要存取的文件 index index.htm index.html index.php index.nginx-debian.html; } ``` 在 `server_name` 的設定內,`_` 是指預設的情況,即是沒有配合到合適的 domain name 情況。 如果我們在 `server_name` 後加入了 domain name,就會指定這個 server 的設定為監聽指定的 domain name 訪問。例如 : ```text # 監聽 domain name 為 19site.net 及 www.19site.net 的訪問 server_name 19site.net www.19site.net; ``` 通過以上的設定就可以依 domain name 來設定多個不同的服務在相同的 port 上。
Canvas 在 html 5 面世已經有一段時間,在使用上有很多大神門寫出了出色的 library 來把 canvas 的圖像 model 化。最近要要處理一個 project 是需要使用 canvas 來畫圖層。這次筆者就選擇了用 fabric.js 來開發這個功能。 ### fabric.js 先到官方網站看看 : http://fabricjs.com 由於沒有太多的時間來寫教學,所以都是主要記錄一下開發時遇到想要記低的事情。在寫這個文章時使用的是版本 4.1.0。 ### 安裝 可以使用 npm 來安裝,在 react js 內使用。 ```js import { fabric } from 'fabric'; ```
### Remove duplicated elements in array in JS (ES6) We have the following case: ```js // we have an array with some duplicated elements let data = [1, 2, 3, 1, 4, 2, 6, 5, 6, 2]; // we want to remove duplicated elements and get the result like below [1, 2, 3, 4, 6, 5]; ``` ### Set By using `Set`and spread syntax, we can easily achieve this: ```js // using set and spread syntax data = [ ...new Set(data) ]; console.log(data); > [1, 2, 3, 4, 6, 5]; ```
在網站開發工作上,Dialog 是一個很常會使用得到的元件。我們可以使用現成別人寫好的來達成,不需要自動重新寫一個。 ### SweetAlert2 SweetAlert2 是一個 Dialog 的 Library,用來在網站上顯示 Dialog。內建有很多使用情況及預設的 template 可以直接使用。  無論是純 Javascript 或是使用 ReactJS 都可以使用。 官方網站 : https://sweetalert2.github.io
### 自動提示 現今的瀏覽器很多時都會儲存起使用者輸入過的資料,以方便下次使用者需要再用時不需要重新載入。但是有時這樣的設定反而會引起麻煩,例如如果電腦是公用的,就可能會看到很多不同人輸入過的結果。 ### 關閉功能 我們可以通過對 text field 加入參數來獨立設定每一個欄位是否出現提示。 ```text autocomplete='off' ``` 實際使用 : ```html <input type='text' name='username' autocomplete='off' /> ``` 這樣在輸入文字時就不會出現提示字的選單了。
### 為何防止短時間內重覆執行功能? 現時得多的應用程式都是建立在 web service 上,在使用者介面及服務器之間的溝通,很多都會使用非同步來進行,以提升使用者的體驗。為免使用者可以重覆 submit 表單,在設計使用者介面時需要防止這個情況。例如把 submit disable 以防止使用者重覆按下。 ### Delay Call 要處理需要短時間內需要重覆執行的功能,但是又想限制在特定時間後才一次過累積執行 (例如即時提供 suggestion 的 combo box),就可以使用 Delay Call 的方法。 ### 實作方法 以下會使用 JS 來作個例子 : ```js // variable for saving delay call state let delayId = undefined; // function want to prevent multiple call in short moment const requestJson = () => { // do ajax call }; // find dom element and add click handler document.getElementById('myButton').addEventListener('click', evt => { // check delay call state if( typeof delayId === 'undefined') { // assign delay call id (timeout id) delayId = setTimeout(() => { // clear delay id delayId = undefined; // call function requestJson(); }, 1000); } }); ``` 以上的代碼可以防止 `requestJson` 在 1 秒在被重覆執行。
### Apache Apache (httpd) is a web server application that can turn you machine into a web server. ### Change apache settings Open file `/etc/apache2/site-available/000-default.conf. You may see the following content:  This is the default setting of Apache, you may copy these setting to create a new one.  Change port and document root. Then open file `/etc/apache2/ports.conf`.  Add `Listen 81` setting to config file. ### Check configuration file is valid Before restart Apache service, better check the config files syntax is valid. ```sh $ apachectl configtest ``` ### Restart service Restart Apache to apply new settings. ```sh $ sudo service apache2 restart ```