發表文章

目前顯示的是 2018的文章

mysql study

ALTER table 是鎖住整個 table # 1. 檢查支票帳戶餘額是否大於等於200 # 2. 從支票帳戶餘額扣200轉出 # 3. 從存款帳戶餘額加200轉入 簡單的transaction START TRANSACTION; select balance from checking where customer_id = 1 and balace >= 200; update checking set balance  = balance - 200 where where customer_id = 1; update savings set balance = balance + 200 where customer_id = 1; COMMIT; 隔離級別 READ_UNCOMMITTED (未提交讀) 一個transaction中修改的東西, 在其他 transaction中是可見的, 也就其他事務可以讀取另一個事務尚未提交 (commit) 的東西, 也被稱作 dirty read, 容易造成很多問題, 效能也不一定會好 READ_COMMITTED 一個transaction在committed之前所做的任何改變都不會被其他transaction看到 REPEATABLE READ 保證了一個transaction讀取同樣的record會是一樣的結果, 理論上無法解決Phantom Read (幻讀)的問題, 幻讀是某個transaction A在讀取某個範圍的資料時, 別的transaction剛好在這個範圍內新增一筆資料, 造成這個transaction A會產生Phantom Row, InnoDB透過多版本併發控制 (Multi Version Concurrency Control) 解決幻讀的問題 SERIALIZABLE 最高的隔離級別, 強迫所有transaction一個接一個執行, 就不會有Phantom Read的問題, 也就是在讀取的每一行都加上read lock(讀鎖), 會導致大量超時與搶鎖的問題,只有在非常強調資料一致性與可以接受非併發環境才可以考慮使用 MySQL預設開啟 autocommit show variables like '

[頭條] 頭條馬維英演講重點筆記

圖片
Ref:  https://www.bilibili.com/video/av32460828/ 用戶的點擊行為, 閱讀行為, 瀏覽行為都可以被記錄 可以做成用戶畫像, 用戶理解 AI連接人與訊息 頭條用搜尋引擎做推薦引擎 用戶跟文章都是高維向量 context也是, ex: 時間, 地理位置, 瀏覽訊息 做出最懂你的訊息平台 核心問題: 1. 設計打分函數 f(用戶, 文章) 之後形成排序 怎麼設計這個函數來最大化用戶體驗 2. 如何知道用戶體驗是好是壞? >> 文章停留時間, 是否點擊, 是否評論, 是否主動follow, 是否分享 CTR, 用戶畫像 典型推薦算法 協同過濾 logistic regression Fatorization machine DNN Decision tree (GBDT) 訊息找人: 每個人可以由多個關鍵字組成 然後訊息透過搜索推薦給用戶 中國短視頻非常火 手機的鏡頭可以拍出短視頻 可以分享在social media 必須對視頻做理解 視頻分析與理解: 分類 裡面的主要的物件是什麼 是真的還假的 偵測一些emotion, 是否覺得噁心反感血腥暴力多有趣 視頻特效 改變video的風格 端上視覺智能 手機會因為 Computational Photography Augmented Reality Visual Understanding 成為智能面的新輸入 智能機器人寫文章根據你的需求去寫 Dual Lesarning (對偶學習) 因為樣本數不夠, 所以想讓AI自己教自己 只要可以閉環, 就可以使用

[Docker] docker-compose 如何與已存在的 container 網路互通

情況提要: 主機內已經有個使用 docker run 起的 mysql container (network是用bridge) 這時候因需求要用 docker-compose 起一個 wordpress 但要讓 wordpress container 可以與 mysql 網路互通該怎麼做? 由於剛好 mysql container 是的 network mode 是 bridge 可以透過將 wordpress 的 network mode 也設成 bridge 並且多設定 external_links 來達成目的 我的wp_compose.yml: version: '3' services: wp: image: wordpress restart: on-failure # HOST:CONTAINER ports: - "11111:80" dns: 8.8.8.8 ulimits: nproc: 65535 nofile: soft: 60000 hard: 60000 environment: WORDPRESS_DB_HOST: 172.17.0.2 WORDPRESS_DB_USER: cms_wp WORDPRESS_DB_PASSWORD: "xxxxx" WORDPRESS_DB_NAME: cms_wp external_links: - mysql network_mode: bridge

Node.js 淺談筆記

Embarrassingly parallel 透過 manager process 分配工作給 replica process 經典代表: php 看起來很美好, 但有些問題 在做 CPU 密集的工作或是跟IO相關的工作時 該 replica process 就會整個 idle CPU如果一直在做 context switch 其實也會造成延遲 所以並不是說 worker process 開得越多越好 所以通常都會開核心數的 2 ~ 4 倍的 worker process 來達到充份利用CPU 例如: 4 核心可能會需要開 8 ~ 16 個 worker process 超過這個範圍, 效能不會增加, 反而會下降 因為都會浪費時間在 context switch 上 Node.js 也是類似的方式, 但跟PHP不同的是 Node.js 本身在執行Javascript的部分是單執行緒(single thread), 透過 event queue 來壓榨單顆核心的效能 如果每個 process 都是單執行緒, 那就開核心數個 process ex: 4 核心就開 4 個 process, 透過這種方法把所有核心榨乾 但是還是有缺點 1. 沒有共享記憶體 (shared memory) 2. 如果有用 connection pool 的機制, connection pool 數會是一般的核心數倍 ex: node.js 連接 redis 時假設 connection pool 數是設定 20條 connections 4 cores 就會有 20*4 條 connections 有可能會造成很多 idle connections 像是 postgresql 每條 connection 都是一個 process 彼此透過 shared memory 如果某個 process 掛掉了, 不會影響到其他 process Node.js 也是有類似的好處 一個 process 掛了不影響到其他 process (Node.js 每個 process有自己的 event queue & connection pool) Java, Golang 每個 process 會開很多個 thread

[工具] 前端 excel - Handsontable

Ref :  https://handsontable.com/ 最近有需要在網頁上用到類似 excel 的功能 於是使用 Handsontable 這個套件 這個套件有分 CE 跟 Pro 版本 CE也就是 Community Edition, 通常是免費的 Pro 則是有額外強大的功能, 要收費的 這邊就簡單筆記一下我用到的部分 (CE) <!-- 需要一個裝 handsontable 的容器 --> <div id="handsome-table"> <button class="btn btn-success pull-right" id="export-btn">匯出EXCEL</button> 底下是 js 的部分 // 定義好欄位名稱 const COL_HEADER = [ 'Permalink', '觸及', '點擊', '點擊率', '負評', '負評率' ]; let container = document.getElementById('handsome-table'); // 裝 handsontable 的 data array // handsontable 是直接操控 data, 也就是 data-binding // 這個到後面很好用 let data = []; // 定義匯出 handsontable 的按鈕 let $exportBtn = $('#export-btn'); // 初始化 handsontable let hot = new Handsontable(container, { data: data, // 定義資料的 schema, 讓資料不要只是用陣列呈現, 而是物件 dataSchema: { permalink: null, impression: null, click: null, clickRate:

[Linux] Linux 流量監測工具 - iftop

Ref: https://www.tecmint.com/iftop-linux-network-bandwidth-monitoring-tool/ https://www.adamfei.com/iftop-linux-traffic-monitoring-tool-most-comprehensive-iftop-tutorial/ https://blog.gtwang.org/linux/iftop-linux-network-traffic-monitor/ 不得不說 iftop 真的非常好用 安裝 # 在CentOS/RedHat中需要安裝epel-release yum install epel-release yum install iftop apt-get install iftop # 假設系統太老舊無法使用yum/apt安裝的話可以自己編譯 yum install flex byacc libpcap ncurses ncurses-devel libpcap-devel # Debian系列的使用以下 apt-get install flex byacc libpcap0.8 libncurses5 wget http://www.ex-parrot.com/pdw/iftop/download/iftop-0.17.tar.gz tar zxvf iftop-0.17.tar.gz cd iftop-0.17 ./configure make && make install 常用方法: # 把 ip, port 都顯示出來 iftop -P # 指定網卡, 如果一開始使用iftop會跑出 # pcap_open_live That device is not up 這種訊息 # 就可以使用指定網卡這招 iftop -i eth0 TX:發送流量 RX:接收流量 TOTAL:總流量 Cumm:執行 iftop 到目前時間的總流量 peak:流量峰值 rates:分別表示過去 2s 10s 40s 的平均流量 常用的參數 -i 設定監測的網卡,如:# iftop -i eth1 -B 以 bytes 為單位顯示流量(預設是 bits),如:# iftop -

[MySQL] 建資料庫小基礎 (2020.06.14)

產生一個 mysql user 給 test 資料庫 並且先綁定 user 只能從 localhost 再改為可以從任何地方 # 建立 test 資料庫 CREATE DATABSES test; # 給 user@localhost 有 test 資料庫所有的權限, 並設置密碼 GRANT ALL privileges on test.* to user@'%'identified by 'your_password'; # 刷新權限 flush privileges; # 將 user@localhost 改為 user@% RENAME USER 'user'@'localhost' TO 'user'@'%'; 如果要讓資料庫是可以允許從其他主機連線 可以去 /etc/mysql/conf.d/mysqld.conf 將 bind-address = 127.0.0.1 換成你想要的ip 同時建議設定防火牆 允許 ip 範圍 # ufw allow from 192.168.2.0/24 允許特定 ip # ufw allow from 192.168.2.235 預設規則都是拒絕 # ufw default deny

[PHP] 在CentOS 5 上手動安裝 php-redis

Ref:  http://www.weinidai.com/index.php/News/detail/id/114 Ref: 直接用 php -i 看 phpinfo() 的內容 Ref: php-redis使用方法 Ref: phpredis 安裝 由於工作所需, 需要在 CentOS 5, PHP 5.3.9 的版本安裝 Redis 套件 本來想找 phpize 自己弄, 後來發現還好從 5.3.9 就有 pecl 公司的這台PHP是由大陸工程師安裝 所以路徑是位於 /usr/local/php 在裡面找到有 phpize, pecl 但是無法直接使用 console 去使用 所以先讓指令可以直接從 console 上用 ln -s /usr/local/php/bin/phpize /usr/bin ln -s /usr/local/php/bin/pecl /usr/bin 這樣就可以直接使用 pecl install redis 來完成安裝 安裝完之後要設定php.ini 所以我一開始是直接找 /usr/local/php/php.ini編輯 但是後來發現, console 用的 php 並不是這個位置 使用 php --ini 去找出 console 用的 php 到底是用哪個 php.ini 檔 之後在最底下新增 [Redis] extension = "redis.so" 這樣就完成在沒辦法使用 os 本身的 package manager 下安裝套件的艱鉅任務了

[Linux] 在CentOS5上面建立redis

當需要自己手動make redis的時候 連到 https://redis.io/download wget http://download.redis.io/releases/redis-4.0.11.tar.gz tar zxfv redis-4.0.11.tar.gz cd redis-4.0.11 如果tcl版本沒有到8.5, 在 make test 的時候會出錯 這時候就直接用以下三個指令, 不要 make test make clearn make make install 這時候基本上就已經裝好redis server了 在 /usr/local/bin/redis-server 這時候要先在建立存放 redis.conf 的地方 mkdir -p /etc/redis cd /etc/redis && wget http://download.redis.io/redis-stable/redis.conf 接著把 redis 做成系統服務: # redis script 的內容如下 # nohup 是讓程式不因離開 ssh 而中斷, &是放入背景執行 vi /etc/init.d/redis touch /var/log/redis.log chkconfig --add redis chkconfig redis on # 啟動/停止 redis /etc/init.d/redis start /etc/init.d/redis stop Ref:  https://www.linode.com/docs/databases/redis/redis-on-centos-5/ !/bin/sh # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. ### BEGIN INIT INFO # Provides: redis_6379 # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description:

[Node.js] Sequelize 小常識 (不定時更新這篇)

圖片
一般使用 sequelize-cli 前, 必須先執行下列指令做初始化 sequelize init --force 要建立model: sequelize model:generate --name User --attributes name:string,nickname:string,age:integer # 會自動產生 createdAt 與 updateAt 的欄位 # 如果是想要產生 created_at, updated_at 的欄位的話 # 可以加入 --underscored 這個參數 sequelize model:generate --name User --attributes name:string,nickname:string,age:integer --underscored 如果需要預設語系是utf8mb4 需要自己修改套件 vim /usr/local/lib/node_modules/sequelize-cli/lib/commands/database.js # 莫約第38行 # `` 為es6 的 string template 的功能, 超實用 `CREATE DATABASE ${sequelize.getQueryInterface().quoteIdentifier(config.database)} DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci` 之後下  sequelize db:create 就會直接是 utf8mb4 的語系囉 要像 Laravel 這樣可以去addColumn怎使用? ref:  https://stackoverflow.com/questions/46357533/how-to-add-delete-new-columns-in-sequelize-cli https://sequelize.readthedocs.io/en/latest/docs/migrations/ // 使用此指令建立 migration sequelize migration:create --name name_of_your_migration // 產生範例如下 module

[Nginx] 在 abc.com/abc/def.htm 這個特定網址導向(rewrite) subdomain cba.def, 其餘參數不變

location ~ /abc/def.htm(.*)$ { rewrite ^/(.*) http://cba.def/$1 permanent; } location ~ // 使用正規表達式,有視大小寫 location ~* // 代表使用正規表達式,忽視大小寫 # 當路徑符合 /test/js/test.js 無視後面帶什麼參數時,進去裡面 location ~* /test/js/test.js(.*)$ { # 檢查如果你進來的網址是 /test/js/test.js # 後面帶的參數會被 /test/js/test.js(.*) 的 (.*) 捕捉到 $1 # 然後將流量導向 /test/js/test.php # 並將後面帶的所有東西也補在 /test/js/test.php 後 rewrite ^/test/js/test.js(.*) /test/js/test.php$1 last; } location 中的 rewirte: 不寫last和break - 那麼流程就是依次執行這些rewrite 1. rewrite break - url重寫後,直接使用當前資源,不再執行 location 裡面剩下的語句,完成本次請求,地址欄url不變 2. rewrite last - url重寫後,馬上發起一個新的請求,再次進入server塊,重試location匹配,超過10次匹配不到報500錯誤,地址欄url不變 3. rewrite redirect – 返回302臨時重定向,地址欄顯示重定向後的url,爬蟲不會更新url(因為是臨時) 4. rewrite permanent – 返回301永久重定向, 地址欄顯示重定向後的url,爬蟲更新url 使用last會對server標籤重新發起請求 如果location中rewrite後是對靜態資源的請求,不需要再進行其他匹配,一般要使用break或不寫,直接使用當前location中的數據源,完成本次請求 如果location中rewrite後,還需要進行其他處理,如動態fastcgi請求(.php,.jsp)等,要用last繼續發起新的請求 (根的location使用last比較好, 因為如果有.php等fastcgi請求還要繼續處理)

[Shell] 同時跑N個 PHP Process

#!/bin/bash ### 定義顏色 YELLOW='\033[1;33m' GREEN='\033[0;32m' NC='\033[0m' ### 要執行的PHP程式, 預設是/path/to/xxx.php PHP_PROGRAM=${1:-/path/to/xxx.php} ### 指定國家, 預設是tw COUNTRY=${2:-tw} ### 根據哪個檔案, 預設是test.txt TARGET_FILE=${3:-test.txt} ### 檔案名稱, 預設是test FILE_NAME=${4:-test} ### 同時跑PHP進程數, 預設是8 CONCURRENT_PROCESS=${5:-8} echo -e "${YELLOW}開始執行${NC}" for i in $(seq 1 $CONCURRENT_PROCESS) do echo -e "${GREEN}/usr/local/php/bin/php $PHP_PROGRAM $COUNTRY $TARGET_FILE $FILE_NAME $CONCURRENT_PROCESS $(($i-1)) 18${NC}" /usr/local/php/bin/php $PHP_PROGRAM $COUNTRY $TARGET_FILE $FILE_NAME $CONCURRENT_PROCESS $(($i-1)) 18 & done echo -e "${YELLOW}執行完畢, 可以執行 ${NC} ps aux | grep $PHP_PROGRAM ${YELLOW} 觀看執行process ${NC}" exit;

[Zabbix] 基礎主機監控設定 - 客製化腳本發信

圖片
使用 客製化腳本 發信  apt-get install ssmtp mailutils # 備份 cp /etc/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp.conf.default vi /etc/ssmtp/ssmtp.conf ######################################### # # Config file for sSMTP sendmail # # The person who gets all mail for userids < 1000 # Make this empty to disable rewriting. root=neilwang@intentarget.com # The place where the mail goes. The actual machine name is required no # MX records are consulted. Commonly mailhosts are named mail.domain.com mailhub=smtp.gmail.com:587 # Where will the mail seem to come from? #rewriteDomain= # The full hostname hostname=zabbix # Are users allowed to set their own From: address? # YES - Allow the user to specify their own From: address # NO - Use the system generated From: address #FromLineOverride=YES AuthUser=發郵件的帳號 AuthPass=發郵件的密碼 #Gmail可開啟兩階段驗證, 使用應用程式密碼 UseSTARTTLS=YES UseTLS=YES # 輸出除錯資訊 Debug=YES ######################################### vi /usr/lib/zabbix/alertscripts/sendgmail.sh ##################

[Zabbix] Zabbix 基礎安裝

圖片
首先先看官網:  https://www.zabbix.com/download 官網可以根據你的作業系統與zabbix版本, 給出對應的指令 我選擇的是 zabbix 3.4版 作業系統為 Ubuntu 16.04 使用MySQL, 換成MariaDB也可 安裝zabbix wget https://repo.zabbix.com/zabbix/3.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.4-1+xenial_all.deb dpkg -i zabbix-release_3.4-1+xenial_all.deb apt update apt install zabbix-server-mysql zabbix-frontend-php zabbix-agent # 登入MySQL/MariaDB mysql -uroot -p password # 建立預設的 zabbix 資料庫 mysql> create database zabbix character set utf8 collate utf8_bin; # 建立 zabbix 用戶, 密碼設成 password (可把password換成自己想要的) mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'password'; mysql> quit; # 使用zabbix用戶將預設的table匯入zabbix資料庫內 zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix 安裝MySQL 可以參考: digital ocean sudo apt-get update sudo apt-get install mysql-server mysql_secure_installation # 觀看 mysql 是否真的有在 running systemctl status mysql.service 安裝PHP 可以參考我這篇: 安裝PHP add-

laravel 5.4 所需環境指令

主機環境: apt-get update && apt-get install -y git echo "* soft nofile 64000" >> /etc/security/limits.conf echo "* hard nofile 64000" >> /etc/security/limits.conf echo "root hard nofile 64000" >> /etc/security/limits.conf echo "root hard nofile 64000" >> /etc/security/limits.conf echo "session required pam_limits.so" >> /etc/pam.d/common-session echo "session required pam_limits.so" >> /etc/pam.d/common-session-noninteractive echo "ulimit -HSn 64000" >> /etc/profile apt-get install -y imagemagick libmagickwand-dev libmagickcore-dev add-apt-repository ppa:ondrej/php && apt-get update apt-get install -y php5.6 \ php5.6-xml \ php5.6-dev \ php5.6-fpm \ php5.6-mysql \ php5.6-mbstring \ php5.6-curl \ php5.6-gd \ php-imagick \ php-redis \ php-memcache apt-get install nginx # 將php5.6-fpm內的設定修改 listen = 127.0.0.1:9000 vi /etc/php/5.6/fpm/pool.d/www.conf sud

背景執行python, 並且輸出log

# 取出 piypa3.py 的 pid, 並且結束這個pid ps aux | grep piypa3.py | awk '{print $2}' | xargs kill -9 nohup python -u piypa2.py > nohup.out 2>&1 &

[Linux] 使用 private key產生 public key

如何使用 private key產生 public key: ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

安裝 Imagick

1. 先到  http://www.imagemagick.org/download/  找到你要的版本 2. # wget http://www.imagemagick.org/download/ImageMagick-xx.xx.tar.gz 3. # tar zxvf ImageMagick-xx.xx.tar.gz 4. # cd ImageMagick-xx.xx 5. # ./configure && make 6. # make install

[js] 當字串中有問號時, new RegExp 不會正確產生出 regular expression

Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions 假設我有個字串是: "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ_g8igsGxA4wQ6arjGkrNM9_NElCV80l6lZneDKBq1ij2DM_L9YQ" 在產生regular expression時會變成 let reg = new RegExp("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ_g8igsGxA4wQ6arjGkrNM9_NElCV80l6lZneDKBq1ij2DM_L9YQ", 'g'); // https:\/\/encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ_g8igsGxA4wQ6arjGkrNM9_NElCV80l6lZneDKBq1ij2DM_L9YQ // 中間的問號其實是應該視為字元的 //solution: function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string } let str = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ_g8igsGxA4wQ6arjGkrNM9_NElCV80l6lZneDKBq1ij2DM_L9YQ"; reg = new RegExp(escapeRegExp(str), 'g'); 使用自定義的escapeRegExp function先將問號跳脫掉, 之後就會被視為正常的字串了

[翻譯] 介紹現代網路負載平衡與代理伺服器

圖片
原文(Source): https://blog.envoyproxy.io/introduction-to-modern-network-load-balancing-and-proxying-a57f6ff80236 什麼是網路負載平衡 (network load balancing) 與 代理伺服器的代理行為 (proxying)? 維基百科是這樣定義負載平衡的 > 負載平衡藉由工作量分配到多台運算資源, 例如: 主機, 主機叢集, 網路連結, CPU,  硬碟等. > 負載平衡盡量最佳化資源的使用, 最大化每個最大化每個資源的吞吐量(生產能力), 最小化反應時間, 避免單一資源工作量過重 > 使用多個資源來當負載平衡來提升可靠與高可用而不是單一個資源 > 負載平衡總是使用獨立的軟體或硬體, 例如獨立的 multilayer switch, 或是 DNS主機的程式 上面的定義用於各資訊領域的各方面, 不單單只有網路而已. 作業系統使用負載平衡在實體處理器去分配運算任務, 容器編排服務像是K8S使用負載平衡在不同的主機叢集中去分配任務, 而網路負載平衡器則是將網路上進來的任務分配給可用的後端主機們. 剩下的文章主要都是講解關於網路負載平衡. 圖1 圖1展示了從應用層來看網路負載平衡. 許多的用戶端(Client)透過只需要向 load balancer 請求, load balancer就會將這些request, 也就是上述提到的任務分配給可用的後端服務. Load balancer位於Client 與後端之間執行幾個重要的任務: 服務發現 (Service discovery) 後端的服務在系統的哪裡, 他們的IP(位置)是什麼? (也就是load balancer該如何與後端主機溝通) 服務的狀態檢查 (Health checking) 現在的服務是否是可接受請求的 負載平衡 (Load Balancing) 該用什麼樣的演算法去平均將request分配給可用的服務 在分散式系統使用負載平衡主要有幾個好處: 主機抽象 (Naming abstraction): 每個client 不需要知道每個後端服務在哪, 只需要利用預先定義好的機制向負載平衡器發出請求

ES6 一些特性

# 解構 const nums = [1,2,3]; const first = nums[0]; const second = nums[1]; 可以改用 const [first, second] = nums; # 要只取第二個 const [, second] = nums; # 預設值 # 原本 fourth 應該是 undefined, 但透過後面的 assign 給定預設值 const [, second, third, fourth = 0] = nums; # 值交換 let a = 1; let b = 2; [a, b] = [b, a]; # 剩餘部分 const nums = [1,2,3,4]; const [first, ...other] = nums; # nums => [2,3,4] # 物件解構 const points = {x:1,y:2}; # x = 1 const {x} = points; # rename x to px (只限定物件, 不可以用在Array) const {x:px} = points; Expression 表達式 Statement 陳述式 Expression => 可以用 ()包起來的 Statement => 無法用()包起來的 ex: if (1>2) 表達式 1+2; const a; a+2; 字串模板 字串模板內可以放入表達式 function greet(name, days) { console.log(`Hello, ${name}! It has been ${days * 24} hours not seen you!`); } # or function greet(name, days) { console.log(`Hello, ${name}! ${(days < 7) ? '' : 'Long time no see'}`); } 字串模板也支援多行字串 const str = ` 123456 12345 1234567 `; arrow function 內的 this 會

[Linux] 切割超過2TB的硬碟

Ref:  https://blog.gtwang.org/linux/parted-command-to-create-resize-rescue-linux-disk-partitions/ !! 注意 使用parted的指令是即刻生效, 請先確認該顆硬碟是要重新切割的 切割超過2TB硬碟需要用 parted #Ubuntu sudo apt-get install parted #CentOS sudo yum install parted # 進入parted parted # 選擇 /dev/sdc select /dev/sdc # 印出資訊 print # 建立磁碟分割表, 此處硬碟大小為4TB, 故只能使用gpt mklabel gpt # 印出資訊 double check print # 開始分割 mkpart # Partition name? []? my_part1 File system type? [ext2]? (按ENTER) Start? 1 (起始位置) End? 1000000 (結束位置 - 1TB(1000GB)) # mkpart # Partition name? []? my_part2 File system type? [ext2]? (按ENTER) Start? 1000001 (起始位置) End? 2000000 (結束位置 - 1TB(1000GB)) # ls /dev/sdc* # 應該會列出 /dev/sdc1, /dev/sdc2, /dev/sdc3 # 列出資訊 print # 會列出像是下列的資訊 Disk /dev/sdb: 10.7GB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags 1 1049kB 1000GB 1000GB my_part1 2 1000GB 2000GB 1000GB my_part2 3 2000GB 4000GB 2000GB

[Nginx] CentOS nginx 內如果沒有sites-available & sites-enabled

Ref: https://stackoverflow.com/questions/17413526/nginx-missing-sites-available-directory # 建立 sites-available mkdir sites-available # 建立 sites-enabled mkdir sites-enabled # vi /etc/nginx/nginx.conf # 修改 http block 中 include /etc/nginx/sites-enabled/*; service nginx restart

[CentOS] 更改主機時區

Ref:  nixCraft CentOS 6 # 備份原本的時區資訊 cp /etc/localtime /root/old.timezone rm /etc/localtime ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime # 驗證 date ls -l /etc/localtime <h2>CentOS 7 timedatectl list-timezones ##*** Grep possible Asian timezones ***## timedatectl list-timezones | grep Asia timedatectl set-timezone time_zone timedatectl set-timezone America/Chicago date ls -l /etc/localtime

[Linux] CentOS update kernel from 2.x to 4.x

圖片
Ref1:  https://blog.csdn.net/zy_281870667/article/details/78004010 Ref2:  http://elrepo.org/tiki/tiki-index.php rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # 詳細可看 http://elrepo.org/tiki/tiki-index.php rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm yum --enablerepo=elrepo-kernel install -y kernel-lt vi /etc/grub.conf # grub.conf generated by anaconda # default=0 #一般最新安装的内核在第一个位置,将其修改为 0 timeout=5 splashimage=(hd0,0)/boot/grub/splash.xpm.gz hiddenmenu (第一次更新remote kernel覺得緊張)

[Javascript] break nested loop

Ref:  https://stackoverflow.com/questions/1564818/how-to-break-nested-loops-in-javascript outer_loop: for(i=0;i<5;i++) { for(j=i+1;j<5;j++) { break outer_loop; } alert(1); }

aws cli 安裝

# 只在這個user底下裝awscli的工具 pip install awscli --upgrade --user # 因為會安裝在~/.local/bin, 所以將這個路徑放在$PATH中 export PATH=~/.local/bin:$PATH source ~/.bash_profile (or .bashrc) 快速設定 $ aws configure AWS Access Key ID [None]: xxx AWS Secret Access Key [None]: xxx Default region name [None]: us-west-2 Default output format [None]: json 或著是在 ~/.aws/credentials 放 Access key 與 Secret [default] aws_access_key_id = xxxxx aws_secret_access_key = xxxxx

Serverless

圖片
Serverless You build it, you run it. Serverless 不是真的沒有server, 而是不用在意server端的問題 Serverless -> less 即是 more how to monitor lambda how to debug lambda 必須讓服務全部都是stateless ex: no sticky session 優點 開發者只需要專注寫好 function HA (High Availability) 無法預判狀況時可以快速MVP 使用適當可以 cost down 缺點 執行時間有限 執行時間太長反而無法節省成本 需要做的事情其實變更多 如何debug 如何監控 常見的 serverless AWS lambda function GCP Cloud function Azure Function OpenFaaS (Function as a Service) 應用案例分享 可口可樂在飲料機上使用lambda串接金流 無人機使用lambda即時將監控的畫面回傳 Ref:  https://rickhw.github.io/2018/03/29/About/2018-Serverless-All-Star/ S3 + Event Source + Lambda發送SNS 

[MySQL] 匯入資料

LOAD DATA LOCAL INFILE  ' 檔案的絕對路徑 ' INTO TABLE 要塞入資料的資料表 CHARACTER SET UTF8 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS ;

[iptables, ufw] 修改 docker container (redis) 的防火牆規則

觀看docker container ip # docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id # 新版: # docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id 替 redis container 加上自定義的防火牆規則 iptables -N CUSTOM_REDIS # 只接受 localhost 可以連到 redis container (172.17.0.5:6379) # 若有需要其他白名單可以把 localhost 換成其他主機 ip iptables -A CUSTOM_REDIS -p tcp --dport 6379 --source localhost --destination 172.17.0.5 -j ACCEPT # 其餘往 port 6379 都丟掉 iptables -A CUSTOM_REDIS -p tcp --dport 6379 --source 0.0.0.0/0 --destination 172.17.0.5 -j DROP # 將規則替換掉 iptables -R DOCKER 1 -p tcp --source 0.0.0.0/0 --destination 172.17.0.5 --dport 6379 -j CUSTOM_REDIS 觀看規則運作情形 # iptables -L -v -n Ref:  http://blog.yunfei.me/blog/iptables_quota.html // 開放22和80 port的可以流入流出 $ iptables -A INPUT -p tcp --dport 22 -j ACCEPT $ iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT  $ iptables -A INPUT -p tcp --dport 80 -j ACCEPT  $ iptables -A OUTPUT -p tcp -

[Node.js] 進階 (20%完成)

圖片
Node.js 靠 process.binding('xx') 使用 C++ 函數 Node.js 內包含 .cc (C++ code) 像這次範例是 PBKDF2 (用來做crypto相關的) 在C++ function 內要給 process.binding()用的話就要透過 env->SetMethod(target, "PBKDF2", PBKDF2) V8引擎則是把javascript裡的一些東西轉成C++看得懂的東西 ex: V8:Array => 把js中的array轉成C++可以用的code Thread 當我們在電腦中執行程式的時候, 電腦會起一個 process 一個process是程式本身的實例 一個process內可以有多個threads 一個thread可以看成一個to-do list 要被CPU執行的指令集 os scheduler來排定哪個thread要優先執行 一個核心一次可以處理超過一個thread (multi-thread) Recap: Thread是指令集的單位, 等著被CPU執行 Event Loop 詳細版:  http://www.eebreakdown.com/2016/09/nodejs-eventemitter.html 用來處理非同步的事件 Node.js執行之後就直接進event loop 整個event loop從頭跑到尾是一次是一個tick shouldContinue 是 event loop 判斷是不是還有事件可以繼續跑 pendingOSTasks => networking related pendingOperations => file system related 如果要讓node.js的middleware在執行完原本的handler function後才執行 可以用這個方式 此處的用法是, 在新增完部落格的文章之後, 才清除文章快取 # CI/CD Travis .travis.yml language 使用的城市語言 node_js - 8 => 使用v8.x dist