2018年11月19日 星期一

[JavaScript] random

let random = (start, end, base = 1) => {
    if (Array.isArray(start)) {
        return start[random(0, start.length - 1)];
    } else {
        return Math.floor(Math.random() * ((end - start) / base  + 1)) * base + start;
    }
};

2018年10月20日 星期六

[JavaScript] MutationObserver(監聽DOM物件的改變)

MutationObserver可以用來監聽一個DOM物件的內容是否被修改。然而,監視對象並不是在初始化階段設置的,而是在之後用方法observe時提供的。
初始化階段只聲明這個observer被觸發時的callback函式,參數有兩個:mutations,那些被監聽到的變化;target,監聽對象。
===
var observer = new MutationObserver(function (mutations, target) {
    // callback
});
var options = {
    childList: true,
    attributes: true,
    characterData: true,
    subtree: true,
    attributeFilter: undefined
};
observer.observe(target, options);
observer.disconnect();
===.
呼叫observe方法時監聽才開始。options中childList代表是否監聽子節點變化;attributes代表屬性的變化;characterData代表資料;subtree代表是否往下遞迴。

2018年8月7日 星期二

[SQL Server+Node.js] 建立連線

在Node.js伺服器上要跟Microsoft的SQL Server連線需要套件mssql。
只談連線的話基本上是這樣做的。
===
const mssql = require("mssql");
var dbConfig = {
  user: "<username>",
  password: "<password>",
  server: "localhost\\SQLEXPRESS",
  database: "<database-name>"
};
mssql.connect(dbConfig, (error) => {
  // 連線以後的東西在這邊不講
});
===.
問題在於有些必須做的東西很多人沒講。
這篇可以看到,在Windows的「電腦管理/服務與應用程式」裡可以找到SQL Server的傳輸協定的設定,TCP/IP必須開啟,然後SQL Server Browser也必須開啟。為了重新啟動服務最好直接重新開機。
然而還有一種問題是SQL Server Browser無法開啟(右鍵選單啥都沒有),這種狀況下參考這篇,到「服務」裡找到SQL Server Browser右鍵內容,把他從停用改為自動或啟用。
另外有時候腦袋蠢蠢的,在<database-name>填入資料表的名稱,當然她媽不會動,這種狀況下回傳的錯誤是登入失敗(因為他找不到那個資料庫)。

[JavaScript] select元件手動觸發onchange事件

select元件就是下拉式選單。它的結構長得像這樣。
===
<select>
  <option value="option0">Apple</option>
  <option value="option1">Banana</option>
</select>
===.
要透過JavaScript來改變select元件的值使用的是下面的方法
===
element.value = "<value>";
===.
element指的是select元件。此處的<value>要參考option元件的value值。
到這邊都是好理解的,問題在於這個做法好像有點bug,就是onchange事件不會正確地觸發。因此修改完value以後還要特地去觸發onchange事件。
===
element.value = "<value>";
var ev = document.createElement("HTMLEvents");
ev.initEvent("change", false, true);
element.dispatchEvent(ev);
===.

2018年6月28日 星期四

[Git] VS Code

首先要安裝Git。然後安裝VS Code(Visual Studio Code)。
先登入並在GitHub網頁上建立倉庫(repository),複製倉庫網址,在本機系統上找到要放置倉庫的目錄,右鍵開啟Git Bash,輸入指令
===
git clone <倉庫網址>
===.
要注意,不要先行建立倉庫名稱的目錄,會產生衝突。
複製(clone)完以後應該會有一個倉庫名稱的目錄,這就是本機倉庫,裡面會有一個隱藏目錄.git。
如果Git安裝的時候並沒有設置全域使用者,在這邊就要特別設置。
一樣,在Git Bash中移動到倉庫目錄下,執行指令
===
git config user.email <GitHub帳戶>
===.
這樣之後就會以這個帳戶的身分做推提與同步。
這種設置方法是針對倉庫的,也就是說以上的指令用來設定目前工作目錄的倉庫的帳戶身分,與其他倉庫則與此無關。
如果想要設置全域的帳戶就要加上--global。
===
git config --global user.email <GitHub帳戶>
===.
總之,設置好倉庫與帳戶身分之後,就可以在VS Code以開啟目錄的方式打開這個倉庫。在VS Code的左側欄位有一個原始檔控制(Ctrl+Shift+G),這邊可以看到原始檔控制使用的是GIT,下面則標記了被變更(modified)的檔案(會標記M)、被暫存(staged)的變更。
在變更列表中,點擊被變更檔案右側的加號可以暫存該檔案的變更;或是在「變更」的右側點擊加號可以暫存所有檔案的變更。同樣的,在暫存的變更列表中,點擊減號可以取消暫存。
當暫存的變更已經可以認可(commit)的時候,在上面輸入「訊息」並點擊Ctrl+Enter以認可目前的暫存。
在VS Code的左下角,可以看到目前工作的分支(branch),這個分支預設會是master,可以理解為主線。在分支名稱的後面,星號「*」代表在本機倉庫中有尚未暫存的變更、加號「+」代表在本機倉庫中有尚未認可的暫存。
無論如何,這些版本都是存儲在本機倉庫中的,必須要推送(push)到中央(?)倉庫──也就是GitHub上的倉庫──才能做合併(merge)。同樣的,要更新本機的倉庫資訊也需要提取(pull),或者使用同步(sync)。三者都可以在原始檔控制欄的右上角找到。
比較奇妙的是,提取的時候似乎不是整個倉庫做提取,而是和目前聚焦的檔案有關,因此在提取的時候可能要先把想提取的檔案打開。

2018年5月31日 星期四

[Node.js] 建立伺服器

典型的伺服器建立方式。下面是伺服器的程式碼。這個程式碼通常取名為server.js,置放在伺服器根目錄,之後在console用「node server.js」來運行他。
===
var http = require("http");
http.createServer(function (request, response) {
    response.writeHead(code, {"ContentType": mime});
    response.write(content);
    response.end();
}).listen(port, ip);
===.
裡面的function應該挺容易懂的,是對於客戶端得請求如何作答覆。code是200正常、404找不著那個;mime是指內容的類型,最基本的是text/plain,常見的還有text/html、text/css、text/javascript,這部分在處理一些讓客戶端自動請求的CSS、JS時需要特別處理一下,否則會發現伺服器把這些檔案當成text/plain或text/html傳出去。response.end()之後這個回應就被送出了。
http.createServer().listen()則是實質地在本機的「ip:port」上啟動一個伺服器。
伺服器開啟後,console會被占用,輸入Ctrl+C強制跳出後伺服器就算關閉了。

2018年5月25日 星期五

[JavaScript] 取得視窗卷軸位置

討論垂直方向,視窗的卷軸位置在window.scrollY。
如果要知道卷軸是否碰底,可以拿視窗卷軸位置與視窗高度相加,看是否與body的高度吻合。
===
return window.scrollY + window.innerHeight === document.body.clientHeight;
===.

[HTML] ribody

怕自己忘記,稍微紀錄一下。 各種各種理由(其中一個就是Vue,不能綁定在body上),導致時常需要一個包在body中的div,當作body來用,像這樣: === <body>     <div id="divBody">   ...