發表文章

[REST] callback function in node.js

圖片
不太確定放在此類別是否正確, 不過, 之前 node.js 的程式碼都歸於此類別, 也就先暫時這樣分類吧... 主要參考的內容如下: http://larry850806.github.io/2016/06/16/nodejs-async/ https://www.tutorialspoint.com/nodejs/nodejs_callbacks_concept.htm node.js 為平行化 (非同步) 架構, 因此, 當我們執行一個 function 時, 會先放入 event loop 中, 並在背景繼續執行其他程式流程, 如下圖所示: https://blog.outsource.com/2018/09/26/understanding-the-event-loop-in-node-js-outsource/ 此平行化架構, 不同於 c / java 按程式一行一行執行的架構, node.js 可允許同時執行多項程式, 有利於利用多執行緒處理, 然而, 當一個程式需要另一個程式的結果時, 就需要 callback 來完成. 舉例來說: var fs = require('fs'); // fs.readFile(filename, callback(err, content)) fs.readFile('test.txt', function(err, content) {     var str = content.toString();     console.log(str.length);     console.log('finish'); }); console.log('not finish'); 此程式目的為讀一個檔案 (test.txt) 並顯示長度, 紅字部分為 callback 部分, 在這部分的程式將等到 readFile 執行完之後才會執行, 執行結果如下: $ node callback.js not finish 245 finish 我們可以看到先出現: not finish, 來自於最後一行的程式: console.log('not finish')...

[RTLS] Bluetooth 5.1 對室內定位的標準化

圖片
對於室內定位的應用而言, Bluetooth 由於其低功耗, 普及, 以及覆蓋範圍小等特性, 一直以來, 都是室內定位的熱門選擇, 在過去, Apple 就曾經以信號強度 (RSSI) 為依據, 推出室內定位用的 iBeacon 作為定位的解決方案, 其定位精度約為 1-5 公尺. 在新的 Bluetooth 協定中, 加入了 AoA/AoD 的支援, AoA (Angle of Arrive) 只需要接收端有多天線系統 (傳送端可為單天線), 可以分辨來自不同天線訊號的時間/相位差, 就可以計算出傳送端相對接收端的角度資訊, 類似的, AoD (Angle of Departure) 則要求傳送端有多天線系統, 就可以藉由 ACK 等資訊, 計算出接收端相對於傳送端的角度資訊, 來自:  http://dev.ti.com/tirex/content/simplelink_academy_cc2640r2sdk_2_30_02_00/ modules/blestack/ble_aoa/ble_aoa.html 在 Bluetooth 5.1 中, 距離資訊仍是來自於 RSSI 訊號強度, 而不是用 ToA (Time of Arrival) 來取得距離資訊, 這應該是因為希望和過往的 Bluetooth 裝置相容, (ToA 需要裝置間同步與硬體的支援, 無法相容於之前的裝置) 因此, 只希望修改 Bluetooth Gateway 的硬體與演算法, 來提供定位的結果. 在目前的架構下, AoA 資訊的取得, 的確能夠改善定位誤差, 特別是在直視路徑 (LoS, Light of Sight) 的環境中, 然而, 針對 Bluetooth 定位所遇到的其他問題, 例如: 過多的布建數量, 仍無法提出解答, 同時, 考慮 AoA/AoD 對於天線排列的要求, 如何提供一種均一, 容易開發, 且準確的 AoA/AoD 資訊, 將會是此標準能否廣泛應用的關鍵.

[Note] 在 ubuntu 上用 python 連接 mySQL

參考:  https://www.opencli.com/perl/python-install-mysqldb 和 Java, C 引入 library 的方法不同, 對 python 而言, 所使用的套件需要先安裝 (如這篇文章), 或是, 將 make 好後的檔案放入指定路徑 (如 libsvm 的方法), 在這篇文章中, 使用 pip 的方式, 安裝連接 mySQL 的套件, 因此, 第一個步驟, 就是安裝或是升級 pip: $ apt-get install python-pip $ pip install -U pip 如果在升級 pip 後, 出現以下錯誤: Traceback (most recent call last):   File "/usr/bin/pip", line 9, in <module>     from pip import main ImportError: cannot import name main 需要修改 /usr/bin/pip 中的變數為: from pip import __main__ if __name__ == '__main__':     sys.exit(__main__._main()) 接著, 安裝必要套件與 python 插件: $ apt-get install python-dev libmysqlclient-dev $ pip install MySQL-python 我們一樣寫一隻簡單的程式來操作 mySQL database, 參考自:  http://www.runoob.com/python/python-mysql.html import MySQLdb db = MySQLdb.connect("localhost", "USERNAME", "PASSWORD", "DB_NAME", charset='utf8' ) cursor = db.cursor() cursor.execute("SELECT VERSION()...

[Note] 在 ubuntu 上以 python 執行 libsvm

參考:  https://blog.csdn.net/letsseehow/article/details/10483729 首先, 利用 wget 下載 libsvm, 並解壓縮, 下載網址請參照 libsvm 的官網:  https://www.csie.ntu.edu.tw/~cjlin/libsvm/ 或是直接用此連結: libsvm連結 假設解壓縮完的資料夾路徑為: ~/libsvm-3.23 需要 make 兩次, 一次在 ~/libsvm-3.23, 另一次在 ~/libsvm-3.23/python/, 完成後, 應該可以找到: ~/libsvm-3.23/libsvm.so.2 把檔案移到 python2.7 的資料夾下, 指令如下: sudo cp ~/libsvm-3.23/python/*.py /usr/lib/python2.7/dist-packages/ sudo cp ~/libsvm-3.23/libsvm.so.2 /usr/lib/python2.7/ 接著, 我們來寫一個簡單的 SVM 測試程式: from svmutil import * from svm import * y, x = [1,-1], [{1:1, 2:-1}, {1:1,2:1}] prob  = svm_problem(y, x) param = svm_parameter('-t 0') model = svm_train(prob, param) yt = [1] xt = [{1:1, 2:-1}] p_label, p_acc, p_val = svm_predict(yt, xt, model) print(p_label) 其中, y 是 label, x 是分類輸入, 舉例來說: {1:1, 2:-1} 代表有兩個 feature, 第一個數值為 1, 第二個數值為 -1, svm_parameter 為 SVM 所用到的參數, 請參照 libsvm 的說明, yt, xt, 則是用來 testing 的資料, 執行結果如下: $ python svmtest.py * optimization finished,...

LTE筆記: 5G NR frame structure

圖片
工研院 陳仁賢 博士 @ 交通大學 3GPP標準會議現況與趨勢研討會 5G NR 的目標: 使用兩個不同的頻帶 (sub-6GHz, mmWave-28GHz) 在此兩個不同通道特性的頻帶上, 提供一致的通道接取 來自:  https://news.samsung.com/global/everything-about-5g-samsung-publishes-5g-nr-standards-whitepap 4G LTE 的通訊協定 (TDD 部分) TDD 有 7 種不同的配置 (靜態, 固定) 使用 CP 保護 data (CP 長度和 coverage 相關) sub-carrier spacing: 15 KHz  對於 5G NR mmWave 的新問題: 通訊距離過短, 需要 beam-training 的技術 => 需要大量的資訊回報, 較適合 TDD 的架構 Small cell => 覆蓋範圍變小 => 減少 CP 的需求 => 縮短 CP, 或是拉寬 sub-carrier spacing Small cell => 動態的 UL/ DL 的需求 => 使用者少, UL/ DL 的使用需求隨著時間改變 => 動態的 TDD 分配架構 => slot configuration 更寬的頻帶使用, 20MHz => 200 MHz => 寬頻帶來大量的 sub-carrier, 以及 FFT 的需求 => 推升電路複雜度, 並使裝置更耗電 => Bandwidth Part (BWP) => 只接收部分的頻寬 5G NR 的新框架: 動態的 sub-carrier spacing 以 15 KHz 作為一個單位 (numerologies = 0) 15 KHz * 2^n (n = 0, 1, 2, 4) 不同的設定對應到不同的 CP 長度 來自:  https://www.slideshare.net/3G4GLtd/5g-nr-key-features-and-enhancements 5G NR 的新框架: dynamic TDD 模式 3 types ...

[REST] REST API 的 client 程式開發 (node-rest-client)

圖片
在之前的 文章 中, 我們介紹了如何建立一個 json-server, 通常, 這樣的架構是為了作為 RESTful API 的介面, 在文章的安裝步驟中, 事實上, 有暗示此 JSON server 是以 NodeJs 的架構撰寫, 考慮到 NodeJS 對網頁端的支援, 也的確是一個合適的選擇. 傳送到 json-server 的資訊將被放到一個 .json 文件中暫存, 然而, 考慮到 json-server 並非設計作為資料庫使用, 當暫存資料過大時, 就會讓讀取/寫入失去效率, 因此, 我們需要寫一隻程式, 從 json-server 中取值, 處理, 再刪除數值, 架構如下圖所示: 資料處理的架構 當然, 更好一點的架構是直接用 NodeJs 來架設 REST API Server, 但考慮到平台的熟悉程度, 還是先用寫好的套裝程式來改, 應該比較穩定一些, 雖然犧牲不少效率... 在實作範例中, 我們使用 node-rest-client 作為開發套件, node-rest-client 建立在 NodeJs 之上, 可以參考: https://www.npmjs.com/package/node-rest-client 在其官網上, 有許多範例, 因此就不再多述如何安裝 node-rest-client, 以及每一個 REST 函數的呼叫, 在進入程式之前, 只提醒兩件事情: NodeJs 有原生的平行化架構, 因此, 當使用多個 client 時, 要注意每個 client 的執行並不會依照程式的順序. 相同的, 由於平行化架構, global variable 的存取順序可能和預期不同, 要自己想好順序, 並包在同一個 client 中. 因此, 本程式的目標流程有以下三個: 讀取 json 總數 => 取出最後一個 json 物件 => 刪除最後一個 json 物件 以下是所實作的程式: var Client = require('node-rest-client').Client; var client = new Client(); // get the number of json object // refer to the ...

[REST] 網頁開發環境: LAMP + WordPress

圖片
為了建立一個簡單的網頁介面, 我們在 Linux (ubuntu 16.04) 上建立一個標準的網頁開發環境, 也就是所謂的 LAMP: Linux, Apache, MySQL, PHP 這部分滿簡單的, 可以參考:  https://jerrynest.io/ubuntu16-04-wordpress/ 只需要輸入以下指令: sudo apt-get update sudo apt-get upgrade sudo apt-get install lamp-server^ sudo apt-get install phpmyadmin 其中, phpmyadmin 為一個可以透過 php 讀取 mySQL 的介面, 完成安裝之後, 記得把 php 網頁專案放到 /var/www/html/ 底下, 確保外部的存取, 指令如下: cd /var/www ln -s /usr/share/phpmyadmin 完成後, 可以透過 http://yourip:port/phpmyadmin 來查看 mySQL 的設定, 進入網頁後, 帳號為 root, 密碼為安裝 mySQL 時輸入的密碼, 就可以利用圖形化介面操作 mySQL, 接下來, 要建立一個動態網頁的環境, 在動態網頁的架構下, 通常我們將網頁分成三部分: 框架 (html), 排版 (css), 計算 (php), WordPress 是一個基於 PHP 技術的網頁模板, 並提供大量的模板參考, 在參考的文章中, 使用 apt-get 的方式來安裝 WordPress, 但在實測環境中, 因為不是純粹的 localhost 環境, 並透過 NAT 進行 port-to-port 的對應, 因此無法直接套用生成的 config 檔. 因此, 我們參考 WordPress 的教學, 直接對環境進行設定. 教學來自:  https://codex.wordpress.org/Installing_WordPress 此教學分成 5 個部分, 下載 WordPress: wget https://wordpress.org/latest.tar.gz 設置資料庫 (帳...