發表文章

2023/10/10

圖片
 陰天,毛毛雨,雖然雖然斷斷續續睡到中午,感覺卻還是很疲憊,明天就要開始上班了,一方便覺得厭倦,一方面有覺得有點事情做總是好事。 為什麼大家喜歡一邊看卡通一邊看彈幕或發布彈幕呢?我也喜歡開著彈幕,然後看著看著就看到大家在這個完全匿名的地方吵了起來,這時又覺得何必呢? 不過說起來也就是需要被認同吧,不管是發布的人還是喜歡看的,對於作品的好惡想知道有人跟自己一樣,只是樣而已,生活周遭要找到意見相同的人實在太不容易,於是上網路上尋找,然後結果卻很難盡如人意,不論在怎樣的環境,人跟人的距離終究不會改變吧。 最後,雖然心智不見得會有多少成長,可是忍受孤單的能耐總是會越來越好,應該會是這樣的吧? 記錄一下今天的下午茶~秋天到了呢~

S3 託管的靜態網站資料實現自訂 domain name 與 ssl 連線,搭配使用 CloudFront

最近太忙沒時間寫得太詳細,網路上看了很多才試出來,避免忘記直接寫重點 s3 建立的 Bucket,名稱隨意,重點是要設定為 Static website hosting ,這樣就能取得一個web的endpoint,大概長得像這樣: (bucketName)-website-ap-northeast-1.amazonaws.com s3設定完畢後,設定CloudFront,新增一個web,然後最重要的事Origin Domain Name需指定為剛剛s3得到的endpoint,不要使用自動完成功能顯示的s3 bucket name 喔,會變成網頁只是透過CloudFront跳轉到s3,最終網址總是顯示為s3的網址,可是這麼一來ssl的憑證就會出錯了。 之後的一些事情網路上就很容易找了,將希望使用的domain於 dns 設定CNAME指派到CloudFront的DomainName就可以了。 有空再做些截圖啦。

Nodejs Base64 Url Safe

一、關於Base64編碼: 雖然常用卻沒注意過,一般Base64,包含英文字母A-Z、a-z、數字0-9,這樣62個字元,然後呢,這樣還少2個字元才64個,這另外兩個就是+、/兩個符號,最後呢,編碼完成依據狀況會補上=,詳細的說明可以參考wiki。 https://zh.wikipedia.org/wiki/Base64 之前使用的情境通常是在http的header中使用,比如oauth相關的應用,可是當打算於url中使用base64編碼時,就可以發生問題了,因為編碼中包含了"+"跟"/",於QueryString使用需在編碼過,在Restful的api使用時,"/"更是會造成url路徑錯誤。 針對這個問題,Base64有一個變種,通常會說是URL and Filename Safe Alphabet,符合 RFC4648, Section 5. 規範,這個規範將"+"、"/"至換成"-"、"_",並移除最後的"=" 二、Nodejs的Base64 encode與decode 在Nodejs常這樣用 var   code  =  new   Buffer ( "Base64是一種基於64個可列印字元來表示二進位資料的表示方法" ). toString ( 'base64' ); //code:QmFzZTY05piv5LiA56iu5Z+65pa8NjTlgIvlj6/liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U= console . log ( "code:" + code ); var   decode  =  new   Buffer ( code  ,  'base64' ). toString (); //decode:Base64是一種基於64個可列印字元來表示二進位資料的表示方法 console . log ( "decode:" + decode );

expressjs,如何監聽res.send事件

事情是這樣的,目前的專案使用了parse-server,然後我想要介入使用者登入的行為,比如登入成功後針對某些user的資料做處理等等,不過又不想直接改寫parse-server的原始碼,所以就搜尋了一下能否攔截res.send事件,在stackoverflow找到了下面這篇: http://stackoverflow.com/questions/33732509/express-js-how-to-intercept-response-send-response-json 那就開始實作吧! 1.先簡單講一下express專案使用parse-server的方式 /* *    * App.js   * express相關設定不另外說明,只列出 parse-server 部分  */ var   ParseServer  =  require ( 'parse-server' ). ParseServer ; //Parse server的參數設定 var   ParseServerOption  = {   //各種參數   .... } //產生回應api呼叫的物件 var   api  =  new   ParseServer ( ParseServerOption ); //設定parse的路由 app . use ( '/parse'  ,  api ); 2.現在我們嘗試加入middleware,先新增檔案 parseMiddleware.js /* *    * parseMiddleware.js  */ const   express  =  require ( 'express' ); const   router  =  express . Router (); /**   * 攔截 Parse 的login事件  */ router . post ( '/login' ,  function ( req  ,  res  ,  next ){     //當login時抽換掉res.send事件      var  

Node.js Async套件

關於Node.js的 Async ,針對會使用這個套件的原因大概描述一下: 一、狀況 寫作Node.js專案時,由於單執行序與事件驅動的特性,勢必須要面對依序執行函式,或要拜訪每個陣列元素又要避免佔用執行序太久的狀況,先說明一下案例 1.依序執行function:如果碰到需要執行多個function,且每個function之間有前後關係時,如果不使用Promise語法或Async套件,你就只能一層又一層的寫下去,類似下面這樣 function a(callBack){     return callBack(null , "a done"); } function b(callBack){     return callBack(null , "b done"); } function c(callBack){     return callBack(null , "c done"); } a(function(error , rtn){     console.log(rtn);     b(function(error , rtn){         console.log(rtn);         c(function(error , rtn){             console.log(rtn);         });     }); }); //output: a done b done c done 如同上面範例看到的,為了保證依序執行,必須這樣一層一層的寫下去,請想想一下四層或五層,中間再加上一些邏輯判斷,有些要執行有些又不需要執行等,原始碼會變得很複雜難以閱讀跟維護。 2.執行迴圈辦法陣列物件: 比如你有一個物件陣列,要一一比對每個值,挑選出需要的物件 var array1 = [{ type:1,name:"p1"} , { type:2,name:"p2"} , { type:1,name:"p3"}]; var array2 = []; array1.forEach(function(item){     if(item.type

VSCode+Nodejs+Winston無法顯示訊息於console panel

圖片
這是上週發現的問題,那時候查了一上午找不到原因,今天再google一下,終於看到有其他人討論這個問題了,記錄一下讓碰到相同問題的也能知道狀況 github上的討論串在此有興趣的就直接去看一下吧: 連結在此 大概說明一下開發環境: VSCode 1.9.1 Nodejs 6.9.4 Winston 2.3.1 VSCode針對Nodejs 6.3以上的版本,.vscode/launch.json的debug參數設定type需設為node2,用以對應 V8 Inspector Protocol的--inspect,相關細節請看 官網連結 。 然後上週忽然意外就發生了,所有透過winston打算顯示在console panel上的訊息都無法顯示,一直到今天才在網路上找到上面列的討論串,目前問題還未解決,winston專案上有開啟了一個Issue,希望能早點更新,暫時的解法: 先於終端機執行要除錯的程式 node --inspect=17007 --debug-brk --nolazy app.js 這時應該會看到一行v8提示的訊息類似下面的範例 To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/@60cd6e859b9f557d2312f5bf532f6aec5f284980/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:17007/c49a1bf5-9d3e-452b-9b7e-2f09b49e2e44 這時候複製這個url到chrome開啟分頁,會進入chrome devtools,於此執行,然後呢??請放心chrome的console panel依然不會顯示winston拋出的訊息,不過這時候你會發現,剛剛執行node命令的終端機視窗會出現那些消失的訊息了,像下面這樣: 雖然不方便,不過勉強堪用,在還未更新之前,就先這樣除錯吧 後續修改: 今天測試發現,只要把launch.json中的 "console" 值,設為"integratedTe

Linux下簡單的備份MongoDB

大概的想法是寫個簡單的sh,內容為自動備份mongodb並上傳到aws s3中,然後設定排程執行即可 1.建立sh檔 打算讓某個user來執行,所以在這個user的目錄下建立的scripts資料夾,並產生檔案,名稱就設定為:mongodb_backup.sh # 產生檔案名稱使用的時間字串,格式範例20170101120101 TIME=`date +%Y%m%d%H%M%S` # 備份檔案的目標目錄 DEST=/home/user/backups/DB-$TIME # mongodb擁有備份權限的username與密碼 DBUser="user" DBUserPassword="password" # 打包檔案的目錄 TarFile=/home/user/backups/DB-$TIME.tar # S3的bucket名稱 S3Bucket=bucketName #建立備份目標目錄 mkdir $DEST #執行整個db的備份 mongodump -u $DBUser -p $DBUserPassword -o $DEST #打包 tar -cvf $TarFile $DEST #上傳檔案至s3 aws s3 cp $TarFile s3://$S3Bucket/ #不想保留檔案可以在移除local的備份檔跟tar檔 2.建立好mongodb_backup.sh後,執行crontab -e建立排程 0 0,8,16, * * * /home/user/scripts/mongodb_backup.sh 執行的時間自己設定,我設定在目標user的crontab中,有需要也可以設定到系統排程裡面,不過相關目錄就需要調整了 3.後續 crontab執行排程時發生permission denied,沒有權限的錯誤,由於我是使用某個linux user的身分執行,檔案又放在user的目錄下,似乎因此導致job沒有執行權限,這部份我還不太熟悉,要找機會研究一下差異.... 總之先把執行的權限打開 chmod +x mongodb_backup.sh 之後運作就正常了