發表文章

目前顯示的是 2017的文章

[mongodb] MongoDB restore bson

mongorestore --host 127.0.0.1 --port 28756 --username AUTH_USERNAME --password AUTH_PASSWORD -d cheese -c COLLECTION_NAME data.bson

[ Node.js ] node-gyp rebuild 問題

最近因為一直使用 v7.10.1 在使用某個 module 的時候, npm install 會失敗 並且跳出要執行 node-gyp rebuild 的訊息 但是輸入之後一樣會失敗 以下是我自己的解決方法 先確定本機端是否有 /usr/bin/python, 且 python是要2.7版本的 如果沒有 python2.7的話, 可以 apt-get install python2.7 ln -s /usr/bin/python2.7 /usr/bin/python 以上的用好之後, 直接重新執行 npm install 然後再執行 node-gyp rebuild就可以囉

[ Javascript ] Javascript的奇怪部分 (40%)

圖片
js 是在 execute context (執行環境) 中實際被轉成電腦看得懂的東西 在 execute context 中分成兩個階段 創造階段 Creation Phase 建立全域物件 (Global Object) 跟 this, 如果有連結到外部, 也會產生外部環境的連結 將宣告的變數 (variables) 跟 functions 先在記憶體中佔一個位子, 但變數尚未給值, 而 functions使用 function b () {} 這種方式的會有值 因為有用等號給值的只會等到真正執行的時候, 才會知道當下執行的值會是什麼 所以當只有在記憶體內先佔一個位子時, 所有的變數值都會先被給定 undefined 上面這點就是一般說的 Hoisting 執行階段 Execution Phase 逐行編譯與執行你的程式碼 Single Thread -> 一次執行一個指令 Synchronous -> "照順序"一次執行一行程式碼 * Javascript在執行的時候誰會最先被創造出來? -----> Global Object & this 函數呼叫 當一個函數被呼叫的時候, 函數內部會在自己產生一個 Execution context (執行環境) 放入 Execution Stack Execution Stack 在Stack最上方的就是先執行的 以上圖來看, 第一步驟是先透過 compiler/ interpreter 去翻譯 js code, 在 global execution context中, 先產生 global object 與 this 接下來將 function b & function c 放入記憶體中並給定完值 執行到 a() 時, 先將 function a 的 execution context 產生出來並放入 execution stack的最上方 在 a() 的 execution context (執行環境) 中, 執行到 b() 然後暫停目前執行的工作 產生 b() 的 execution context (執行環境), 並放入 execution stack 的最上方 b() 沒

[ AWS ] 建立 load balancer

選擇 Application Loab Balancer Basic Configuration Name - 負載平衡器的名字 scema  internet-facing 可以簡單想像是放在外網的負載平衡器, 用一般的 public ip 去分流 internal 可以簡單想成是在內網內的負載平衡器, 走 private ip去 分流  ip address type - ipv4 Step 1: Configure Load Balancer Listeners 監聽哪些 port HTTP 80 HTTPS 443 Availability Zones AZ是為了 HA (High Availibility), 當一個AZ毀掉之後還有另一個 選擇至少兩個 AZ Step 2: Configure Security Settings 針對此 load balancer 去做安全性設定 Select Certificate Choose an existing certificate from AWS Certificate Manager (ACM) 選擇使用 AWS Cert Manager 自己的憑證  Step 3: Configure Security Groups 設定 Security Group 允許 HTTP 80, HTTPS 443 port的所有流量 Step 4: Configure Routing Target group 建立一個新的 target group 給這個 load balancer 這個 load balancer 會將流量平均導入這個 group 的所有 EC2 Step 5: Register Targets 因為已經建立了 target group, 接下來就是將 ec2 註冊進去這個 group, 並且是要將流量導到這些EC2的哪個 port

[ collider ] webrtc websocket related

自己架設 collider 有幾點要注意 1. 一定要先開一個 nginx 並且保證使用 http get 此台網址的 response 要是成功的 2. nginx 設定如下 server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; location /.well-known { root /var/www/ws.DOMAIN.com; } location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } } 3. /home/ubuntu/apprtc/src/collider/collider/collidermain/main.go內記得將 var roomSrv = flag.String("room-server", "https://api_server_domain", "The origin of the room server") api_server_domain換成自己的 server domain 4. 如果要上到production的話必須要讓 --tls設定為true sudo $GOPATH/bin/collidermain -port=8089 -tls=true 5. 並且將/home/ubuntu/apprtc/src/collider/collider/collider.go內底下這行的憑證給抽換成自己的 e = server

[ aws ] 動態修改ebs的容量/IOPS .. 等等

Ref: http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/ebs-expand-volume.html 簡單整理重點 就是從aws console修改完ebs的容量後, 其實並不會馬上生效 有幾個步驟 (此處為linux/ubuntu指令) # 看自己檔案系統是用什麼的 # ext2, ext3 和 ext4 是用 resize2fs # XFS 是用 xfs_growfs sudo file -s /dev/xvd* # 列出此台ec2的block devices lsblk  NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT  xvda 202:0 0    16G 0 disk └─xvda1 202:1 0 8G 0 part / # 就像你看到 /dev/xvda1 在 16G 的 device 上仍然是 8G  # 所以要使用 growpart 將 8G 移到 16G 上 # 如果系統上沒有安裝 "cloud-guest-utils"的話請裝 # ec2 ubuntu 16.04上已經有了 apt-get install cloud-guest-utils  # resize partition  growpart /dev/xvda 1 # resize filesystem  resize2fs /dev/xvda1 接下來使用 df -h 就可以看到完成囉! 原文 請參考, 並搜尋 There's no need to stop instance and detach EBS volume to resize it anymore! ** 注意 假如說容量要加大的那台ec2 instance是有高流量的話要小心.. 我 api server 一開始用這個方法成功, 然後沒多久突然機器就葛屁 整個 instance 無法ssh, 透過 console reboot也無法, 也無法 terminate 最後直接用ami起一台新的, 強制把ip轉到新的那台.. 過了4小時才terminated... Orz

[ Docker ] 一日入門篇

Docker   - OS層級的虛擬化     - OpenVZ (X     - LXC     ( Linux Container )     - Docker (O Docker暫時無法取代VM Docker解決的問題     - 各種技術SDK版本與開發環境與production環境錯綜複雜的問題.. Docker VS VM   - 差異在Docker少了 GuestOS 一個container只裝一個process (db/ redis/ nodejs application .. etc) docker commit 盡量少用, reuse不方便   - 改用dockerfile docker run -dti    - t: terminal   - i: interactive   - d: daemon mode (跑到背景, 此容器會一直活著   - p: port mapping (host port 對應到 container port) docker run -p 80:80 nginx   - P: port 直接binding   --name docker run -d -p 80:80 --name web nginx --rm container結束後馬上刪除 docker run -ti --rm -p 80:80 --name web nginx  (啟nginx原本自己的指令) docker run -ti --rm -p 80:80 --name web nginx bash (不啟動nginx,只啟動bash) Old method (少用) 從容器內跳出來但不終止容器 Control p + Control q (Control 一直按著 跳回去都用 docker attach CONTAINER_ID New method docker run -dti busybox sh             # 把容器放到背景去執行 docker exec -it CONTAINER_ID sh  # 透過exec登入容器 Create Docker Image Example: 類似將image d

[ AWS ] S3 bucket policy 筆記

圖片
今天才知道原來s3 bucket沒設定好, 可以直接取得類似目錄底下的所有檔案路徑(跪 感謝同事大大幫忙提出了這個問題, 讓我對S3 bucket policy有稍稍研究 基本上 bucket policy 可以透過  http://awspolicygen.s3.amazonaws.com/policygen.html  產生 不過還是要稍微筆記一下一些東西 Principle為被影響的人 NotPrincipal為不受此 policy影響的人 Ex: 我要讓我某個bucket不能被看到底下所有路徑 (listBucket), 但是自己的帳號不要被影響 { "Sid": "Stmt1497943561488", "Effect": "Deny", "NotPrincipal": { "AWS": "arn:aws:iam::AWS_ACCOUNT_ID:root" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::BUCKET_NAME" } 參考資料 http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/s3-bucket-user-policy-specifying-principal-intro.html http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/example-bucket-policies.html

一天搞懂聊天機器人

1990 電話就已經有對話系統, 採用關鍵字比對 例如: 假如你的對話內有個fly -> 猜測你要訂航班 2000 開始有了intent的概念, fly/book ticket/ .. 詞不同, 但意圖是相同的 2017 Intelligent Assistant 主要是從Apple推出Siri開始 Apple Siri (2011) Google Now (2012) Microsoft Cortana (2014) Amazon Alex/Echo (2014) -> 2016 可以直接語音購買東西 Facebook M & Bot (2015) Google Home (2016) Google Assistant (2016) react assistant 有回應式的 ex: User: 叫計程車 react assistant: 請問您在哪 Proactive assistant 根據你時間地點, 去推測你需要的東西 ex: User: 請幫我推薦餐廳 Proactive: 使用者現在附近與時段有哪些不錯的餐廳 Chit Chat Bot 純粹聊天或提供資訊, 有趣而已 ** Task Oriented Bot 來協助你完成工作 需要用learning的方式學習 ** Task Oriented Dialogue System 語音訊號 -> 辨識成文字 -> 語言理解 Language Understanding (LU) -> Semantic Frame 語意的概念 -> Dialogue Management (DM) ->-> Backend Action / Knowledge Providers -> 自然語言產生給使用者 Natural Language Generation (NLG) Machine Learning -> Looking for a function 只要給你足夠多的資料, 機器可以給你要找的function為何 ML Supervise learning Unsupervise learning Reinforcement learning

[ jenkins ] Install Jenkins On Ubuntu [incomplete]

圖片
Ref: https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu http://alex-dai.logdown.com/posts/2016/04/17/jenkins-bitbucket-ssh-key wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add - sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' sudo apt-get update sudo apt-get install jenkins

安裝ssl & letsencrypt certbot

圖片
https://www.namecheap.com/support/knowledgebase/article.aspx/9419/0/nginx cat certificate.crt ca_bundle.crt >> ca.chain.crt 將certificate.crt & ca_bundle.crt 輸出到 ca.cahin.crt 然後根據nginx的設定 ssl_certificate /home/ubuntu/project_dir/ssl/license/ca.chained.crt; ssl_certificate_key /home/ubuntu/project_dir/ssl/license/private.key;記得將private.key也替換上去! ################################################################## 題外話: 再裝nginx的時候 (on ubuntu16.04), nginx竟然會無法stop/restart 最後只能先跑一次 ps -ef | grep nginx kill <pid> 之後才可以正常stop/restart ..Orz 移除nginx sudo apt-get purge nginx nginx-common Ref:   https://certbot.eff.org/#ubuntuxenial-nginx https://certbot.eff.org/docs/using.html#certbot-commands 首先先安裝letsencrypt sudo apt-get install letencrypt 接下來使用webroot的方式驗證這個domain真的是屬於你的 letsencrypt certonly --webroot -w /var/www/你的domain -d 你的domain 註: webroot是letsencrypt利用在本機產生檔案, 然後透過domain驗證 來確認這個domain真的是你的 ex: letsencrypt certonly --webr

[ mongodb ] aggregation example

MySQL中可以做 JOIN, GROUP BY, .. 但在Mongodb就必須靠 aggregation 像Left outer join在Mongodb要用特別的operator : $lookup 官網有提供一些簡單的MySQL to Mongodb aggregate的語法範例 https://docs.mongodb.com/v3.2/reference/sql-aggregation-comparison/ 小舉例 db.collection('collName').aggregate([     {          $match: matchQuery         // 搜尋條件式, 符合的documents傳給下個階段     },     {         $project: {                         // 將上個階段的documents取出指定欄位傳給下個階段             user: 1, place: 1, createdAt: 1          }       },     {         $group: {                       // 將上個階段的documents給group成指定的物件             _id: "$user",               // _id 是必須要有的             place: {                     // 要輸出的place欄位是陣列 [ { _id: xxx }, { _id: xxx}, .. ]                 $push: {                     _id: "$place"                 }         }     } }, { $sort: { createdAt: -1 } }, { $limit: limit } ], function(err, aggregations) { }); 目前Aggregate在Mongodb原生的套件中沒有提

[ Node.js ] winstonjs rangeError Maximum call stack size exceeded

Reference:  https://github.com/winstonjs/winston/issues/862 在 winston/common.js 第217行 加入 options.meta = meta; https://github.com/winstonjs/winston/blob/master/lib/winston/common.js#L217 // Remark: this should really be a call to `util.format`. // if ( typeof options . formatter == ' function ' ) { options . meta = meta; return String ( options . formatter ( exports . clone (options))); }

Mongodb 調校過程記錄

圖片
Mongodb