WAMP SERVER MySQL 無法連線,因為目標電腦拒絕連線。
最近在幫伺服器由 php 7.0 升級到 php 7.4.4,然而在升級 wordpress 的時候出現了無法連接到資料庫的問題,於是簡單的從網上找到了一個測試資料庫的 php script,發現原來不是 wordpress 的問題,是 MySQL 的問題。 $DBServer = 'localhost'; $DBUser = 'username'; $DBPass = 'password'; $DBName = 'wordpress'; $link= new mysqli($DBServer, $DBUser, $DBPass); if(!$link) echo "失敗!"; else echo "成功!"; 錯誤 解決方法:在 localhost 後面加上 :3307 結果在網上找了一整天也找不到能處理的解決方法,於是在想會不會是 port 設定的問題呢?於是在 localhost 後加上了 :3307 $DBServer = 'localhost:3307'; 然後居然就 fix 好了!? 不過話說,在 Fix 這個 bug 的時候整個網頁伺服器上的服務都不能用,除了其中一個完全不依賴 Database 的服務,我想我不用說你也已經猜到了: ArOZ Online 系統!這套系統在 PHP Extension 一個都沒開 + MySQL 完全 offline 的情況下也能繼續正常運作還真的是滿壯觀的。 升級途中居然對 ArOZ 系統一點影響都沒有,還能夠一邊聽音樂一邊升級 就是這樣,伺服器就有驚無險地升級上 PHP7.4.4 囉! P.S. 有人問邊到睇到 MySQL 個 port你可以係 WAMP 個 menu 下面找 MySQL → Port used by MySQL: 3307
ArOZ Online 的使用者定位?
說到 ArOZ Online 系統,很多人看完 README 會覺得它又是一套普通的 NAS 作業系統。如果我要自己組 NAS 的話那我用 OwnCloud 或是 OpenMediaVault 就好,幹麼要用一套這麼新,沒幾個使用者的系統來放我重要的資料呢? ArOZ Online 的網頁桌面環境 對,如果你要 NAS 作業系統你不應該選擇 ArOZ Online 系統 ArOZ Online 系統從來也沒向過檔案儲存的方向發展。這是一個顯然易見的答案。ArOZ Online 系統缺少了幾個 NAS 作業系統必須的東西:RAID 管理器跟磁碟管理工具。這兩項日後可能會被太有空的工程師給加進去,但是在目前階段我們是沒有打算向這方向發展的。 再者,市面上除了開源的 OwnCloud, OneCloud, OpenMediaVault 之類的方案外,也有需要購買特定硬件的 QNAP 跟 Synology DSM,而且更不用說大家熟悉的雲儲存方案了,Google Drive,Dropbox ,MediaFire 甚麼的要多少有多少。相比之下 ArOZ Online 系統只是一個非常普通,只是到達「能用」地步的儲存系統。 用 ArOZ Online 系統代替真正的作業系統? 那如果不向 NAS OS 的方向發展,難道 ArOZ Online 系統要代替真正的作業系統?這也是不可能的。作業系統三大家庭:Windows Mac Linux,ArOZ Online 系統也只是建基於 Debian Linux 之上,不可能說取代他們其中一員。 Google 的 Chrome OS 也曾嘗試過做類似的東西,使用 Chrome 本身作為作業系統,提供各類型的 WebApp 服務;話雖如此,Chrome OS 到現在在一般使用者(consumer level)的市佔率還是比不上 Windows 跟 Mac,這很大程度上是跟系統兼容性有關了。然而,Chrome book 之類的作為 輔助設備 ( secondary device)的用者卻大有人在,證明 Chrome OS 雖然不及 Windows 或 Mac 那樣高兼容性和高市佔率,但仍然有它的優點和使用者群。而 ArOZ Online 系統要向的方向也是類似的:特定的使用者群,而外面並沒有類近能取代它的系統。 所以,ArOZ Online 的優點是甚麼? ArOZ Online 說到最極端它只是一個由PHP,Js,HTML5 跟 Golang 組合出來的系統,就如你所想的,就是一套網頁系統。然而,你不覺得為甚麼明明都有 PHP 了,卻多了一個 Golang 出來?他們的功能不是重複了嗎? 對,就是這個多出來的 Golang 讓這套系統變得超級神奇。無論是功能上還是效率上。 沒錯,這個 Golang 並不是用來作為網頁伺服器,而是用來處理後台大型運算用的。 我們先從功能說起。自從 2019 年的版本中,Golang 開發的部分開始取代 php 的部分工作,系統的功能開始變多了。由 Gcode 發送器,備份組建系統等等,都是因為 Golang 的加入讓這些原本不太可能用 php 來開發的部分變得有可能。再者,Golang 可以比 PHP 接觸更底層的系統資源,做出更多你想不到的功能。之後的分散式文件系統,集群通訊協議也將會使用 Golang 進行大重寫,讓用家可以在一個界面裡就控制到好幾台使用 ArOZ Online 的裝置。 在效率上,Golang 的加入也讓系統效率更快。原本 PHP 要 Copy & Paste 一個檔案能會把整個伺服器卡上好幾分鐘,現在使用 Golang 重寫後的 fsexec (檔案系統)架構,讓 Copy & Paste 功能變成非同步功能,並可以在背景同步運行多個檔案移動指令,讓系統效率更高。另外,在 ArOZ Cluster 裡面,Golang 寫的掃描器也讓 HDS 運作率更佳,掃描速度更快。 所以說了這麼多廢話,總結來說就是 ArOZ Online 的特點是: 物聯網 / 集群連接網頁桌面環境高後台處理能力完整的檔案管理系統支援中文在地化 所以?創作者用的雲系統! 最後,我們選擇向創作者的方向發展! 到底是哪類型創作者?我們的目標打算放在以下三大類: 移動 / 遠端創作者數碼生產類(Digital Manufacturing)創作者ArOZ Online 模組開發者 首先是移動或遠端創作者,這一個例子就是經常個人旅行的 Youtube 創作者之,讓他們可以不用隨身攜帶這麼多儲存裝置,只要在旅途跟旅途之間的一小段時間把檔案放到伺服器 / 電腦上,之後即使是再出發了也能夠在途中對之前的影片或音源檔案進行編輯、匯出。另一個例子就是產品設計,可以使用 ArOZ Online 上的建模軟件或…
Drag & Drop 的重要性
https://www.youtube.com/watch?v=eCKVFfYGJfs&feature=youtu.be 之前的 ArOZ Online 系統一直都不支援 Drag & Drop,在使用起來雖然說沒甚麼大不了,就是有一點點的不方便,好像說選擇 File 要在 File Selector 裡面做,要移動 File 不是需要使用 Menu 就是需要使用 Hotkey 如 Ctrl C + Ctrl V 之類的。 AOB 大更新,支援 Drag Drop File Object 的 File Explorer 最新版本(v 20-3-2020)之後的 AOB 將會全面支援 File Drag Drop 。這到底是甚麼意思呢?簡單來說,這就是容許 File Explorer 對其他模組或另一個 File Explorer 視窗進行基於 Drag drop 的檔案移動。例如說你要把檔案由 A File Explorer 移動到 B File Explorer,這個時候你只需要把檔案由 A 拉到 B 即可,就像 Windows 一樣完全不用煩惱設定的問題,使用起來非常的直觀。 詳細的例子你可以看上面的 Youtube 影片了解更多。
網頁上的硬碟 SMART 檢測
ArOZ Online 雖然表面看上去是一個 NAS 作業系統,然而它並不是。說它是 NAS 作業系統倒不如說它是一個真正能用的 Web 桌面系統還比較好? 說實話 ArOZ Online 上面有很多不知為甚麼會出現的功能,由踩地雷到小畫家,跟 XP 的距離就只欠一個 3D彈珠台而已。而這次終於到了硬碟 SMART 檢測器了。這個是由 @alanyeung 開發的一個 ArOZ Online 系統組件,這是使用 smartctl 的多平台版本寫出來的,查詢結果在 json 化之後再經過 kernel 傳到 PHP 作顯示,雖然說上去滿簡單的東西,卻讓系統馬上變得更像 NAS 作業系統了。 SMART 檢測界面及硬碟的詳細數據 每一塊硬碟都能夠看到由 smartctl 回報的仔細的數據 這功能可以在 系統設定 > 檔案與儲存器 > 硬碟 SMART 裡面找到 就是這樣,ArOZ Online 又多了幾十 MB 的源碼了,整個系統現在包含著各種各樣的 binary 檔案現在差不多要到 780MB 了。之後在加入 Clustering 相關的代碼之後應該會更大吧?
使用 PHP 啟動 Golang Binary 的 DIRECTORY SEPARATOR 問題
在開發 AOB 的時候不知道為啥 Windows 開發的 Websocket JWT 登入系統在 Linux 上跑不動,然後 Golang 寫的 WS Server 還不斷噴 Error,一開始還以為是 Golang 的問題,最後原來是啟動 Golang binary 的 PHP 的問題 。 Golang WebSocket Server 在 parse PHP 輸出的 JSON 時出現了 "<" 無法解釋所以 panic 了 在 Windows 上取得由 Web Root 到 Authentication Service Script 位置的代碼,Linux 上會回傳 "" (Empty String),必須移除有關 / 跟 \ 的處理部分才能使用。 //Parse the launch paramters if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { //Windows. Parse the launching path for validation services from wamp service webroot $fullPath = str_replace($_SERVER['DOCUMENT_ROOT'],"",realpath(str_replace("\\","/",__DIR__) . "../../jwt/validate.php")); $fullPath = str_replace("\\","/",$fullPath); $launchpath = str_replace($_SERVER['DOCUMENT_ROOT'] . "/","",$fullPath); }else{ //Life is always simplier on Linux $launchpath = str_replace($_SERVER['DOCUMENT_ROOT'] . "/","",realpath("../jwt/validate.php")); } 這問題主要出在 PHP 可以把 / 跟 \ 同時當作 "/" ,所以在程式裡作為 Directory Separator 用 "/" 就好,不需要特別處理,但是在 Golang 裡 "/" 跟 "\" 是不同的符號,必須要先做好預處理再 feed in 到裡面。 (你問我為啥不用 DIRECTORY_SEPARATOR ?因為測試過這東西也不能用啊?特別是要經過 realpath() 的時候特別容易出錯)
二次元人物成生器?
對於想當 Vtuber 的人來說,不一定每個人都會設計自己的人物。 Open Vtuber Studio 裡面使用的是 VRM 模型,而 VRM 本身就是一種開源的 3D人物模型格式,所以創作工具也有不少。而在這篇文章裡我會界紹兩個比較簡單的人物生成器。 VRoid Studio https://vroid.com/en/studio/ VRoid Studio 是由著名網站 Pixiv 推出的 3D人物產生器,也是 OVS 系統內使用的測試模型的產生器。使用方法簡單,直接,即使像編者這樣不會繪畫的軟件工程師來說也能用它輕易的設計屬於自己的人物。 VRoid Studio 界面 而設計完成之後可以把模型匯出成 VRM 模型,並透過一些開源軟件如 VRM Viewer 來檢查模型的完整度。 模型在 VRM Viewer 下的預覽 CHARAT https://charat.me/ 而如果你是在用基於 Live2D 的系統,你需要的或許是一個 2D 的模型(應該說是 向量圖型,Vector Graphic 吧?)這個時候 CHART 就能幫上忙了。然而,它只能匯出 png,要匯出 svg 就需要一點技術。 人物設計界面 首先,你要先設計好你的人物,然後不要點選匯出(Finish),而是按 F12進入 Developer Mode,找到 id=" chaSvgSave " 的一個 div 可以使用瀏覽器的 Search 功能找到該 div 之後右鍵 --> 選擇編輯 HTML 全選裡面的 svg 內容,複制並貼上到一個空白的文件,並把它另存為 {filename}.svg 由於這部分缺少 svg 所需的檔頭,所以你要先把檔案拉進 Adobe Illustrator,讓它修複好檔案再進行另存新檔。 如果有需要的話也可進行續層匯出 就是這樣,你的 2D 人物設計就完成了。 2D 的角色跟 3D 的角色,如果你要成為 Vtuber 你又會選擇哪一個呢?
開發使用 Webcam 的網頁應用時找不到navigator.mediaDevices
如果你在開發使用 Webcam 的網頁的時候遇上這個錯誤: TypeError: navigator.mediaDevices is undefined Open Vtuber Studio 裡面顯示的錯誤 那是因為你在用 Firefox 而的網頁並非使用https 加密。然而你又太懶不打算幫你的實驗用網頁伺服器裝上 SSL 憑證,那你可以跟著以下步驟解決: 轉用 Google Chrome在網址列輸入 chrome://flags/#unsafely-treat-insecure-origin-as-secure 把你的網站加入到例外清單把此功能開啟(Enable) 在我工作室的測試伺服器設定例子 設定之後重啟一下 Chrome 即可解決。至於 Firefox 上這問題依然是無解,除非你自己重新組建一個 Firefox 出來。
Open Vtuber Studio 之開發(2)
要讓身體動起來一點都不簡單 身體姿態捕捉 說實話,身體姿態捕捉算是其中一個最麻煩的部分。外面的系統有不少的方法可用於捕捉身體姿勢,好像說 Vive 的 Sense SDK ,KinectToVR 之類的,然而大部分都需要特定的硬件如 HTC Vive,Kinect 或後繼型號如 RealSense 等等的。對於開源系統來說是能用,但是不夠完美,畢竟有一部分的東西還是有專利保護或屬於一家商業機構的(如 Kinect 的 API)。 所以在這系統中,我偏向使用 Webcam 來進行捕捉,在這篇文章裡,我主要會跟你分享使用單個 Webcam 對動作進行捕捉的想法。 為甚麼只用一個鏡頭? 當然如果可以的話 3 個鏡頭一定會比較好(畢竟你要捕捉到完整的 3D 影像,兩個鏡頭是必須的,第三個是用於正面和表情捕捉),然而,如果一個都能做到 3D 捕捉的效果不會更便宜更方便嗎? PoseNet https://github.com/tensorflow/tfjs-models/tree/master/posenet poseNet 是一個在 browser 上捕捉身體姿態的神經網絡,它能捕捉身體骨幹位置於攝影平面上的位置,並即時回傳到另一個 function 裡面。這東西的好處就是使用起來超級方便,而缺點就是會讓 GPU 著火(對 GPU 運算能力需求超級的高)。 使用 2D 影像預測手部 3D 動作的想法 如果以 Vtuber 這個例子來說,手部一般都只會出現在鏡頭正面,而甚少出現在後面。因此在理論上,只要我們取得上手臂跟下手臂的長度,我們就能透過計算球型路徑來取得手部的 3D 位置,並自動移除其負值的答案。 計算原理圖,先假設肩膀的位置是 0,0,0 點(origin) 手部對應的骨架位置(pt1, pt2 及 pt3) 這不行欸。為甚麼?不知道。 對,最後把上面的運算式掉進去測試了,就不知道為甚麼不能用。不是手在亂轉就是根本捕捉不到手的 3D位置。所以最後在打算放棄,換回去 3 鏡頭系統的時候想到了一個新的運算方式: 其實不用這麼複雜,我們只看手跟肩膀的距離就好 這裡的數學模型相信大家都學過,就是球體中心到球體表面任何一點的距離都是一樣的,但是如果你在正面看上去距離比較短,那就是代表有部分「長度」被轉換成「距離」,因此有錯覺看上去比較短而已。使用這原理,我們可以大約估算到手跟身體的距離差距。 結果?她動了。 最後手臂就能動了 最後手臂的部分就能動了。然而,這也有一個問題,那就是手臂的旋轉狀態我們仍然是不知道的。如果真的要量度到那個準確度的話,看來我們只能轉用加速度傳感器 + Arduino 來做了。但是在那個之前,我打算先處理好基本的動作再想辦法處理像旋轉角度,手指之類的微動作。
OAO – 開源版本的 ArOZ Online 個人雲端平台
宣傳海報 自從 2016 年開發 ArOZ Online 系統之後就不斷有人跟我說這系統的價值和用途,當然這也是各有各的說法,從商業管理系統,多媒體創作平台,個人醫療管理到網絡硬碟等都有人提出過。當然,這對我來說是很榮幸的事情,畢竟這麼多人提出這麼多個用途,即是說這系統已經具有多周途的特點,可以隨個人需要而更改上面安裝的模塊以配合自己的需求。 現有的 ArOZ Online 版本 自這篇文章開始寫的今天開始計算,之前發佈的版本主要有以下幾個: 版本號代號發佈類型< dev-1.1.4Aloplex內部測試版< dev-1.2.8 Sempervivum Tectorum 內部測試版 1.0aCloud穩定版1.1aCloud - Oryza Sativa 內部測試版 1.2aCloud - Bombax Ceiba內部測試版 所以,如果要開源的話有兩個方向是可行的 使用獨立發行版本開源 使用獨立版本發行,即是說之後的 ArOZ Online 會分為兩個版本:1. ArOZ Online LTS (Long Term Support)2. Open ArOZ Online 這裡的好處就是我們可以透過 Long Term Support 的版本確保資金來源,再者確保開發進度和方向,然而不好的部分當然就是要分開兩個版本發行,由於系統組建不一樣,就結論來說組建的時候也會有很多問題,而且由 Open Source Community 提出的更改也很難直接進到主要的源碼庫,最後導致難以創造一個新的開源社群。 使用模組化方式開源 使用模組化開源的方式就比較特別,而且也應該比較少 Open Source Project 會使用這做法,畢竟這很容易導致版本不兼容的問題,但是我還是在這裡說一下這種開源方式的原理 模組開源方案 這種設計比較像 RedHat 之類的商業用 Linux 方案,然而要維護一點都不容易,再者,要實現這種開源的模組化設計還需要以下幾個系統功能: 模組安裝器(使用 Git 倉庫的 URL 來安裝)自動更新模組,用作更新 Open ArOZ Online 的基層架構開源模組的安裝需求及版本控制器(有點像 npm 的東西?) 所以,就現在的開發進度來說這種開源方式還是未能實現的。 結論 就開原模式來說的確使用模組化開源方案是比較合適的。然而,這會需要加入新的系統架構來作支援。看來在整個開源生態圈成熟之前還是只能用第一種方案:分成兩個組建的方式來開源會比較方便和符合成本效益了。
PHP7 下檔案名稱太長導致 glob 回傳 false 的問題
很多時候在開發 PHP 的時候我們都會使用這個超級方便的 glob(*) 功能。簡單來說就是把一個資料夾或路徑內的檔案以 array 方式回傳的方法。然而,在最近的 ArOZ Online 測試伺服器更新之後發現了 File Explorer 在開啟某些資料夾時出現 PHP ERROR 的問題。後來經過一堆檢測之後發現原來是檔案名稱太長了,結果 glob 就直接回傳 false 。 原本的 listdir.php //Some code here for auth and var parsing if (file_exists($path) && is_dir($path)){ $filelist = glob($path . "/*"); //Other code } 要解決這個問題,我們需要把它改成使用 scandir ,然而由於 scandir 會多了很多代碼,為了節省處理能力,我們只在需要的時候使用 scandir 就好。結果新的 glob 部分就變成了這樣: //Some code here for auth and var parsing if (file_exists($path) && is_dir($path)){ $filelist = glob($path . "/*"); if ($filelist === false){ //Something went wrong while trying to list the directory using glob. Try scandir $scanResults = scandir($path); $filelist = []; $useAbnormalFilter = true; foreach ($scanResults as $fileObj){ if ($fileObj != "." && $fileObj != ".."){ array_push($filelist, $path . "/" . $fileObj); } } } //Other code } 就是這樣,File Explorer 的顯示就回復正常了。對,這都是 Windows 的錯。
目前第 2 頁,共有 5 頁