2019年5月19日 星期日

NodeJs的HttpServer如何開出去給外網連?

先聲明一下0.0,網管非本人擅長領域,只是因為我用NodeJs寫Server,弊公司沒有這方面的老手,只好自己去摸索,以下開始紀錄探索過程~

目標:不透過第三方套件或者是雲端平臺,單純用電腦開一個WAN可以連的NodeJS based server。

首先結論是:

關鍵在中華電信的閘道器的後台(就是像鐵路便當大小的那台),運用NAT技術把LAN IP開給WAN連。

以下是探索過程的紀錄。

最初是用expose node.js server  on windows之類的關鍵字去找,發現到node的http.server.listen(port)後面還有一個argument可以填,這個參數的設置似乎會影響到這個ip的開通,以下是相關文章:

https://stackoverflow.com/questions/8325480/set-up-node-so-it-is-externally-visible
https://stackoverflow.com/questions/14043926/node-js-connect-only-works-on-localhost

有些地方提到ngrok,這之前我也查到過,不過跟目標相悖,就先不管。

結果呢,上面的東西不管我怎麼設置,我用我手機鍵入14x.xxx.xxx.xxx:8081(我設定的port,然後我是浮動ip,所以每隔一段時間都要重新找自己的ip)都連不上來,都是連線被拒絕的錯誤畫面,後來我就一時興起用電腦browser看一下只打14x.xxx.xxx.xxx會怎樣,結果會出現某個後台登入的網站,這個後台其實是中華電信閘道器的後台:
https://www.mobile01.com/topicdetail.php?f=110&t=5606425

進去玩一玩可以看到一些LAN、WAN,還有防火牆的配置,於是我利用這個後台作關鍵字查zyxel port expose:
https://businessforum.zyxel.com/discussion/1809/is-it-possible-to-expose-a-web-server-to-internet

在新的文章又有看到NSG NAT server之類的關鍵字,那回去後台翻一翻就翻到了NAT這個項目,這個NAT就是正解了,用這個就可以把自己查到的IPv4內網IP開出去,在這邊要開的port的範圍也可以自行設定,至於防火牆怎麼設就自己研究吧,反正為求減低測試變因,我把windows的防火牆跟這個後台的防火牆能關的先關了,是在這個狀況下成功的。

順便PO一下NAT的參考資料:
https://blog.pmail.idv.tw/?p=5165
我不是整個看,就是稍微了解NAT的用途而已(轉載自MIS的背影):

NAT伺服器可以讓內部私有IP網路透過一個public IP 及單一個網路介面,連結至網際網路

Windows Server 2012 NAT特點
1.支援多個內部網路私人IP網段,透過NAT主機連線至網際網路且只需要一個實體IP位址
2.支援DNS代轉查詢,替內部用戶查詢外部網域名稱及IP位址
3.支援DHCP功能發送IP至內部網路
4.支援TCP/UDP Port 對應,讓外部使用者可以存取內部伺服器,如web ,mail等伺服器

大概就是這樣~

2019年2月11日 星期一

Cordova開發小筆記

這幾天開始研究Cordova後,便想稍微紀錄一下我自己嘗試成功的一些資訊,一方面供參考,一方面稍加整理過的資訊,自己未來如果有機會要回頭看也比較方便。(另外其實也是想把某些網站從書籤中清掉xd)

正文開始:

*為何選擇Cordova?

之前我用Html5 + Firebase的技術參與過朋友的專案,算是個資淺的網頁工程師,但有在考慮用網頁技術寫app,所以最初是看了一篇:
The Step-by-Step Guide to Publishing a HTML5 Mobile Application on App Stores

這篇文章主要是在簡介網頁app、混合app以及原生app的差異,並推薦ionic作為開發環。就我粗略的理解,ionic=Angular JS + Cordova。

經過一些調查,加上我之前是跟朋友用Typescript+Scss為基底自行開發的框架作專案,就架構上沒有用其他JS的框架,我打算作的開發也不難,所以現階段我也不想再多去了解Angular JS,就針對Cordova開始進行調查了,而後發現其實我要的打包網站成行動app及一些用JS操控手機的API,其實正好就是Cordova本身作的事情,所以我就開始準備Cordova的開發環境。

*Cordova開發環境建立

網路上文章滿多的,看了看,我覺得最好讀的是這篇:
使用Cordova将您的前端JavaScript应用打包成手机原生应用

基本上照著這篇作到底就可以了,不過這篇沒有提到的是需要安裝JDK等開發環境,因此在依樣畫葫蘆的過程中會遇到不如預期的反應,這時我翻到了
Android Studio Project detected in Cordova project

用該文的提到的

your code...
int x = foo();  /* This is a comment  This is not code
  Continuation of comment */
int y = bar();
dsasdsa

$ cordova requirements

便可找出哪些東西是沒安裝的,就照上面提示的順序去抓,不過Android SDK的部分,其實是要去抓Google的Android Studio,安裝好之後用它的SDK Manager去抓,細節是怎樣我忘了,但是重點就是說缺的一些安裝環境要從這一線開始著手比較順利,這邊搞一搞,印象中requiments中的Gradle也會順便抓到的樣子,剩下的就是看缺啥就補而已。

這個過程似乎會有環境變量的問題(網路上很多文章都會提到),那本人有的有設,那有沒有每個安裝的東西都設,好像也沒有(記憶模糊...),總之如果有遇到問題的話,可以參考
windows 下环境变量 path 详解

然後google一下自己的作業系統要怎麼改環境變量應該就可以解決了~

這些問題都解決之後,就繼續照著那篇談打包的文章繼續作下去,最終應該就會產生出一個apk檔了,這個檔案因為用Android Studio的 AVD實在太lag,我就傳到我手機安裝了,那也就順利成功。

PS:建置完畢後,後來還有看到很值得參考的資料,所以也一併附上。
[Cordova Week-1] Hello Cordova!

*Cordova是否支援行動app的廣告?

答案是可以。這個問題本來希望在初探要用什麼技術來打包網頁比較好的階段就想搞清楚,奈何沒有找到很清晰的資訊,有的資料也滿舊的了。關於這個問題,我找到我覺得最棒的資料是
Integrate Google Ads in Apache Cordova Mobile Apps

它推薦一款提供JS的API的plugin來作這件事情,而這個plugin似乎是非常有口碑的,筆者自己上Cordova的官網用關鍵字搜尋相關plugin,還有看到有些plugin其作者聲稱不會蒐集資料之類的或者分潤,結果有人反映實際上不然的情形,於是就決定選用這款Github上星數很多的plugin。

*Cordova的API

在確定了打包與廣告這兩點之後,接著就是開始進入實作的部分了,這部分的重點之一應該是Cordova開給JS以操作手機功能的API有哪些?以及該怎麼用等等。

這部分的文章就是待續囉~因為還在研究中0.0

2014年12月26日 星期五

外力與保守力

高中教過,外力作功,等於系統總能變化量。雖然是高中的課程內容,但外力跟保守力的關係,還滿值得思考的。

保守力很特別,我們說,被保守力作用的系統,其實只是作了能量形式的轉換罷了,總能量一點都沒變。這也就是說,在位能與動能都算作是那個系統的能量時,保守力,並不是外力。

說到外力.應該要問的是,到底什麼叫作外?

只把眼光放在具體的物質上,而把那種跟它所處位置而有所差異的能量,即位能,算作這個物質之外,有什麼不行?其實也是可以,照這樣想,保守力,也就可以當作外力了。如重力對某質點作功,動能從無而漸漸變大,因為我們的系統只考慮了質點的能量,而不考慮其所在的位能,這樣,也就確實是「外力作功,等於系統總能變化量」。

所以可見,力,到底保不保守,跟眼光有關。最一般的描述是功能定理,說物質受外力移動,會有動能變化,這個定理的眼光,就是只看物體,而不管它的空間。一旦引入了空間具有能量的觀念,把物質跟空間算作同個系統,那麼就有保守力的觀念出現了,它說明物體的能量,加上其所處空間的能量,在保守力的作用下,總能量不變。

2014年7月17日 星期四

運動邊界條件(Kinematic Boundary Condition)

【動機】
無論要建立物理模型或處理微分方程問題,無非得先對控制方程式及邊界條件的來由認識清楚,其中運動邊界條件(Kinematic Boundary Condition,以下簡稱KBC)的推導涉及拉格朗日法(Lagrangian description)與尤拉法(Eulerian description)之間的轉換,對筆者而言深富啟發性,故誌之以饗同好。

【說明】
有別於動力邊界條件(Dynamic Boundary Condition,以下簡稱DBC)涉及力的要素,KBC著重於描述邊界的「空間」分佈,例如,河水沿著光滑不透水的底床流過,這個底床就是我們的邊界,給定一個座標系,我們通常以$B$表示底床高程:
$$B=(x,y,t)$$
問題來了,雖知底床的形狀以及其隨時間的變化,但這個式子要怎麼與「水體」的控制方程式聯繫起來呢?

答案是要從「粒子」的運動著手。

在說明粒子運動之前,得先知道,$B=(x,y,t)$這個式子本身,就是尤拉法的體現,它說明著空間中某種性質的時空分佈,我們可以藉由代入特定的座標與時間,得知該處的底床高程為何。

而針對粒子運動的描述,就是拉格朗日法,無論是描述其粒子的位置、或是該粒隨時間變化的性質。

通常粒子的位置以$\vec r =(x(t),y(t),z(t))$描述,給定時間,我們就知道粒子的位置,若將這個時間及得到的位置代入$B=B(x,y,t)$,我們就會知道在那個時間點,該粒子對應的底床高度。已知一個粒子運動的軌跡,代入到已知的場中,得到的,就是該粒子所具有的,「隨時間改變的某種狀態」,這樣的代入過程,用數學式描述即是
$$B=B(x(t),y(t),t)$$在此處,這個粒子在每個時刻都有其位置所對應的底床高程,這無非也是一種「狀態」,為了幫助理解,若以溫度場$T=T(x(t),y(t),z(t),t)$為例來構思或許更為直觀。

已知該粒子任一時刻的高度$z(t)$及其對應的底床高度$B(x(t),y(t),t)$,剩下的就是描述「水沿著底床流動」,這句話等價於粒子與底床總是同高,即
$$z(t)-B(x(t),y(t),t)=0$$
這個關係式必須時時刻刻正確,且由於左手邊完全是時間的函數,可以對時間微分,得到
$$\frac {d(z(t)-B(t))}{dt}=\frac {dz}{dt}-\frac{\partial B}{\partial x}\frac {dx}{dt}-\frac{\partial B}{\partial y}\frac {dy}{dt}-\frac{\partial B}{\partial t}=0$$

其中$\frac {dz}{dt}、\frac {dx}{dt}、\frac {dy}{dt}$表示邊界上粒子的速度,然而在這一套解水體運動的方法中,我們只能解出向量場或純量場,完全無法得知水中各粒子的運動情形,所以,我們只是藉由粒子運動的思維,來刻劃出水體在邊界應該符合的物理限制,而用水體解出的速度場在邊界各方向的分量取代$\frac {dz}{dt}、\frac {dx}{dt}、\frac {dy}{dt}$,建立起與「水體」控制方程式有關係的條件式。

以上初步說明KBC的推導思維,KBC的運用甚廣,波浪力學中的自由水面KBC方程式即為經典例子之一,而今以地下水學門中的非拘限含水層其自由水面KBC為例,作一初步推導。

假設非拘限含水層有呈水平的下邊界,並以下邊界當作零位面,則,含水層各位置的水頭表示為:
$$h(x,y,z,t)=\frac {P}{\gamma}+z$$
其中$\gamma$為水的密度及重力加速度,在一般情況可視為定值。
現假設有一粒子循某種路徑在自由水面流動,其路徑以$\vec r =(x(t),y(t),z(t))$描述,代入上式得
$$h(x(t),y(t),z(t),t)=\frac {P(x(t),y(t),z(t),t)}{\gamma}+z(t)$$
同時對兩邊的式子時間微分,且因自由水面壓力為大氣壓,為定值,可得
$$\frac{\partial h}{\partial x}\frac {dx}{dt}+\frac{\partial h}{\partial y}\frac {dy}{dt}+\frac{\partial h}{\partial z}\frac {dz}{dt}+\frac{\partial h}{\partial t}=\frac {dz}{dt}$$
粒子的速度以達西法則的速度除以有效孔隙率表示,且假設所選的座標系統貼合於水利傳導係數張量的主對角軸,則上式可寫為
$$\frac {-1}{n_e}(\frac{\partial h}{\partial x}K_x\frac{\partial h}{\partial x}+\frac{\partial h}{\partial y}K_y\frac{\partial h}{\partial y}+\frac{\partial h}{\partial z}K_z \frac{\partial h}{\partial z})+\frac{\partial h}{\partial t}=\frac {-1}{n_e}K_z\frac{\partial h}{\partial z}$$

$$\frac {-1}{n_e}(K_x(\frac{\partial h}{\partial x})^2+K_y(\frac{\partial h}{\partial y})^2+K_z(\frac{\partial h}{\partial z} )^2+\frac{\partial h}{\partial t}=\frac {-1}{n_e}K_z\frac{\partial h}{\partial z}$$
此即非拘限含水層在自由水面處應該滿足的邊界條件。

二維座標系旋轉

【動機】
向量在不同座標系中各有其表示型態,而最常見的情形乃二維旋轉,其轉換關係簡明易記,實用性高,是故撰文誌之。

【結論】
向量在正向旋轉後的新座標系表示為:旋轉矩陣乘以原向量。
逆轉換僅須挪動於$\sin\theta$前之負號。

【證明】
考慮$V=\begin{pmatrix} x \\ y \end{pmatrix}$在逆時針旋轉$\theta$角後的新座標系,

表為$V'=\begin{pmatrix} x' \\ y' \end{pmatrix}$



由幾何關係得知


$x'=x\cos\theta+y\sin\theta$
$y'=-x\sin\theta+y\cos\theta$

因此

$$V'=\begin{pmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{pmatrix}V;(1)$$
上式即「旋轉矩陣」與「原向量」作用之結果。
若反矩陣存在,則二維反矩陣公式如下: $$A=\begin{pmatrix}a & b \\c & d\end{pmatrix}$$
$A^{-1}=\frac1{\det A}\begin{pmatrix}d & -b \\-c & a\end{pmatrix}$


$V'$在順時針旋轉$\theta$角後之原座標系表為$V$
$$V=\begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix}V';(2)$$
比較式(1)跟(2)可知其轉換關係。