Coder Social home page Coder Social logo

notes's Introduction

notes's People

Contributors

blackdiz avatar

Watchers

 avatar

notes's Issues

Docker筆記

  • 在 Archlinux 上安裝指令: sudo pacman -S docker
  • 安裝完後可執行 sudo docker run hello-world 測試是否安裝成功
  • 執行 sudo docker run hello-world時, 若出現docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.錯誤訊息, 可用 sudo systemctl restart docker重啟docker後再重新測試
  • docker使用Unix socket而非TCP port, 而Unix socket只有root可以使用, 所以預設下執行docker指令都需要加上sudo。解決方法是建立一個docker group, 給予root權限, 把user加入該group中, 指令如下:
sudo groupadd docker // 新增docker group
sudo usermod -aG docker $USER // 將目前登入的user加入docker group

之後重新登入一次即可

  • docker ps 列出所有執行中的docker container
  • docker ps -a列出執行過的docker container
  • docker run -it可執行docker container並進入該container的termial中
  • docker rm $(docker ps -a -q -f status=exited)可刪除status=exited的container, -q表示讓docker ps只回傳container id, -f則是可指定過濾條件, 如status=exited, 或者使用docker container prune可達成相同效果
  • docker run --rm會在結束執行container後自動刪除該container

JS筆記

  • ^: xor操作符,用在2進位上是把0和1倒轉,所以如果用在if判斷上,則表示若非全true或全false,則回傳0(true),否則回傳1(false),如:(a && !b) || (!a && b),可改為a ^ b。但JS的xor並非logic xor,所以如果^兩端是數字則會做位元操作,而非boolean判斷

  • Math.round()Number.toFixed(0)差別在

    • Math.round()回傳number,Number.toFixed(0)回傳string
    • 在做四捨五入時如果是負數,Math.round()結果是朝0趨近,Number.toFixed(0)是相反,如-1.5用Math.round()會是-1,Number.toFixed(0)是-2
    • Math.round()Number.toFixed(0)快很多
  • for...infor...of差別在

    • for...in是迭代物件的enumerable property,所以是for (const propertyName in object),須注意的是prototype的property也會被迭代到,所以使用上需要小心。此外for...in在迭代時是無序的
    • for...of是迭代有iterable屬性物件裡Symbol.iterator指定的value,所以是for (const value in object)for...of是ES6才加入的語法
  • !!: 可以轉出真正的true或false,如: let test = "";,test為falsy但不為boolean的true,因此可以用!!轉成真正的false,第一個!會把falsy轉成boolean的true,第二個!則將其轉回正確的false值

  • Javascript的Set在檢查相等性時是用===,所以用在StringNumber等premitive type時沒有問題,但用在Object時是比較兩者的reference是否相等,而非內容值比較

  • Promise中return一個Promise時,會先resolve return的Promise等到跑完它的結果,resolve的話再把結果傳到下一個then中.
    reference You dont know JS CH3:

The key to making a Promise sequence truly async capable at every step is to recall how Promise.resolve(..) operates when what you pass to it is a Promise or thenable instead of a final value. Promise.resolve(..) directly returns a received genuine Promise, or it unwraps the value of a received thenable -- and keeps going recursively while it keeps unwrapping thenables.
The same sort of unwrapping happens if you return a thenable or Promise from the fulfillment (or rejection) handler. Consider:

var p = Promise.resolve( 21 );

p.then( function(v){
	console.log( v );	// 21

	// create a promise and return it
	return new Promise( function(resolve,reject){
		// fulfill with value `42`
		resolve( v * 2 );
	} );
} )
.then( function(v){
	console.log( v );	// 42
} );

Even though we wrapped 42 up in a promise that we returned, it still got unwrapped and ended up as the resolution of the chained promise, such that the second then(..) still received 42.

CAP理論筆記

分散式系統一定會面臨CAP問題,下面簡述CAP各自代表的意義:
C - Consistency,一致性,指不同node間的資料在任一時間點都保持一致。完美的一致性是不存在的,因為不管複寫有多快,總是需要花費時間。
A - Availability,可得性,指不同node在收到request時總是能回覆有意義的response,所以如:500 Server Internal Error並不算在內。
P - Partition Tolerance,分區可容忍性,指不同node間可允許通訊中斷,通訊中斷有兩種意思,網路中斷或者node中有node無法正常response都算。

CAP問題是指,在CAP中,你永遠只能滿足其中兩個,也就是CA、CP、AP三者擇一。
設想有兩個node:A、B:
CA:如果A、B的資料須保持一致,且兩者都必須對request正常response,則A、B間的通訊就不可中斷,也就是犧牲P。
CP:如果A、B的資料須保持一致,但又允許兩者中斷通訊,那就表示一但中斷通訊,A、B都不能再繼續對外response,也就是犧牲A(Availability)。
AP:如果A、B可以中斷通訊且繼續對外response,那A、B間的資料就不可能保持一致,所以就是犧牲C。

因為在現實世界中,完全不發生通訊中斷是不可能的,所以其實我們只能選擇CP或AP,CA其實是理論中的選項。

參考資料
https://codahale.com/you-cant-sacrifice-partition-tolerance/

NodeJS筆記

  • npm script可以加上prepost hook,在指定的script前後執行,加上的方法是在名字前加上prepost,如:
    presetup: run pre hook;
    setup: run main script;
    postsetup: run post hook;

  • package.json中可以用$npm_package_$key來取定義好的變數值,$key可以多層,例如:
    {
    "version": "1.2.3",
    "config" {
    "test" : "123"
    }
    然後就可以用$npm_package_config_key來取config的test的值,或者$npm_package_version取version的值

  • Express

    • route的比對順序是由上往下,所以如:
      /api/:id
      /api/login
      的情況下,輸入/api/login時,/api/:id會被優先使用
      PS. Spring MVC則是會優先做精確比對,所以/api/login會先於/api/:id,因此順序不影響
  • VSCode設定

    • 可以在project的root下建立jsconfig.json以設定讓VSCode認得到的NODE_PATH,內容為:
      {
      "compilerOptions": {
      "target": "ES6",
      "baseUrl": "/path/to/root"
      },
      "exclude": [
      "node_modules",
      "**/node_modules/*"
      ]
      }
      baseUrl設定好後,project裡的require路徑會自動從baseUrl開始,因此就算不使用相對路徑也可讓VSCode自動偵測到正確的檔案

SysAdmin筆記

All versions of nginx as of 1.4.4 rely on OpenSSL for input parameters to Diffie-Hellman (DH). Unfortunately, this means that Ephemeral Diffie-Hellman (DHE) will use OpenSSL's defaults, which include a 1024-bit key for the key-exchange. Since we're using a 2048-bit certificate, DHE clients will use a weaker key-exchange than non-ephemeral DH clients.

所以可以先用openssl產生新的2048-bit或4096-bit加密key:
openssl dhparam -out /to/path/dhparam.epm 2048
然後在Nginx的config中加入:
ssl_dhparam /to/path/dhparam.pem;
讓Nginx使用新的key

工作筆記

  • csv檔是沒有格式的,所以0開頭的數字文字在Excel等軟體開啟時會被parse成純數字,開頭的0會被刪掉,必須加上="...",如:="0911111111",這樣在parse時就會保持原本的格式
  • cxf跑wsdl2java避免產生JAXBElement<String>的方法,在跑wsdl2java時加上-b /to/path/jaxb-bindings.xmljaxb-bindings.xml的內容可參照jaxb-bindings.xml,這樣產生出來的type就會變成String
  • apidoc在0.17.5之後的版本無法在註解中使用 <a href>...</a> 的語法

MongoDB筆記

  • Mongoose
    • findByIdfind...等method,若找無資料是回傳null
    • findByIdAndRemove...等function,若找無資料回傳null,若有資料且刪除後則回傳被刪的資料
    • validate預設只有在save()時會呼叫,如果要在update前使用則除非用支援{runValidators: true}的function如:findByIdAndUpdatefindOneAndUpdate等function
      mongoose在set value前會做type casting,所以傳入trueNumber type會變成1,傳入false會變成0 etc.
    • mongoose.Promise=global.Promise,這行是把mongoose內的Promise替換成Nodejs的Promise
    • 如果有在schema的field設定default,則查詢時即使MongoDB中document沒有該field,也會被填上default值回傳,但實際上document中依然不會有該field
    • mongoose.set('debug', true),可以在log中顯示實際跑的query
    • mongoose的populate是對每個ref document分開query,而非像RDB的join
    • schema中property如果是陣列,則在create時會預設給[]空陣列值
    • mongoose在各種SchemaType中有cast function將傳入的資料轉型。 date中的cast有這段:
  if (value instanceof Number || typeof value === 'number'
      || String(value) == Number(value)) {
    // support for timestamps
    date = new Date(Number(value));
  } else if (value.valueOf) {
    // support for moment.js
    date = new Date(value.valueOf());
  }

故直接傳入moment Object,mongoose會自動轉成JS的Date Object

  • 可以註冊Modelindex event,如果在建立index時有error,就可以做處理,eg.:
  Test.on('index', (err) => {
    console.log('start create index');
    if (err) {
      console.error(err);
    } else {
      console.log('success');
    }
  • 查詢回傳的model是無法reassign裡的欄位值, 解決方法:
    • 查詢時使用lean(),則回傳的不是model而是javascript object,因此可以修改
    • 使用document.toObject()將model轉換成javascript object
  • findAndModifyupdate最大差別在update後回傳的物件,findAndModify回傳的是該document,預設回傳修改前的值,如果加上{new: true}則回傳修改後的。update回傳的是修改結果{ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }
  • Many-to-Many的情形下,如果對應的多方數量不多,可以不用轉成2個One-To-Many加mapping table,而可設計成One方的schema內用Array field存Many方的key,RDBMS因為沒有Array field,故必須轉成2個One-To-Many加mapping table
  • 使用for...loop update和用 bulkWrite 一次update在10000筆資料下,時間約是2分鐘和40秒的差距(測試機器: MacBook Pro (Retina, 13-inch, Early 2015)、CPU: 2.7 GHz Intel Core i5、RAM: 16G、HD: SSD)
  • MongoDB
    • update預設行為是把原document整個取代掉,如果只是要更新特定欄位要加上{$set: {field: value}}
    • 查詢陣列是否含有元素的最好查詢方法是使用$exists:true, $ne: [],可得到正確結果且如果該欄位有建index也會使用index
    • 可以針對 Array 裡的特定位置建index,如 db.collection.ensureIndex({'array.0': 1}),如此在使用 array.0 做為查詢條件時可以用到index,但如果是建db.collection.ensureIndex({array: 1})則不會用index
    • 如果查詢中含有sort,最好的index是包含查詢條件和排序條件,如find({name: 'test'}).sort({age: 1})的話,則建db.collection.ensureIndex({name: 1, age: 1})則為最佳index,如果分開建立則可能是只用name index 查詢,query explain時會看到 SORT_KEY_GENERATOR表示會在memory中做排序,效率較差

PubNub筆記

  • 註冊後創建要使用的APP,PubNub會自動幫該APP建立Publish key、Subscription key、Secret key
  • publish需要Publish key,在publish時指定發送message的channel
  • subscribe需要Subscribe key,在subscribe時指定接收message的channel
  • addListender中加入各種事件如:連線成功、 接收到訊息等事件發生時要執行的function
  • publish的callback會傳入兩個參數statusresponsestatus的格式為{"error": true/false", "operation": $OperationType, "statusCode": $statusCode}response的格式為{"timetoken": $millisecond}
  • message可以是任何可被serialize的object,但官網建議使用JSON格式,每個message最大為32KB
  • message透過channel傳送,所有註冊該channel的subscriber都會接收到messagesubscriber可註冊多個channelchannel可以動態建立或刪除。
  • channel是透過同一對Publish key和Subscribe key做區別,所以即使同名的channel,如果key組合不同則為不同channel
  • channel的名字最多為92字
  • channel group需要開啟stream controller功能才可使用

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.