2019年1月11日 星期五

NHK World weather woman : Carley Gomez

最近安博的 ubtv 不知為何無法運作, 早上沒辦法看 CNN 新聞, 於是轉而看 MOD, 裡面英語新聞台有 NHK World, 半島電視台 (Al Jazeera), 德國之聲, CNBC, 法國電視台等等. 其中 NHK World newsline 播完接著是世界氣象, 主播是一個發音非常漂亮, 標準美式腔調的女生, 我覺得她應該不是日本人, 由於螢幕沒有打出姓名, 所以我就去 Google 查詢, 沒想到才打到 NHK world 就出現 weather woman 了, 可見早有很多人注意到這位美語發音這麼棒的人了.

結果在 NHK 網站就有全部主播的照片與姓名, 原來她叫 Carley Gomez, 是個氣象學家, 難怪播報氣象毫無停頓, 完全不吃螺絲. 她是美國人, 畢業於加州大學主修新聞傳播, 2018 年取得密西西比州立大學氣象學碩士學位. 曾任職於洛杉磯的福斯電視台與奧勒岡州的 KMTR 電視, 2017 年轉職 NHK, 參考其個人網站 :

https://carley-gomez.squarespace.com

不過查詢其姓氏 Gomez, 應該是西班牙裔的美國人.

https://www.youtube.com/watch?v=qfhL0TNi7vg




老實說, NHK 日籍主播的發音都有日本腔調, 我不喜歡. 但為了聽她優美的英文發音, 每天看完半島電視台的新聞後就會切到 NHK 聽她播氣象.

為機器學習量身訂做的 Julia 會讓 Python 白學?

今天看到下面這篇介紹 Julia 語言的文章, 標題似乎聳動了點 :

有人要為ML定製程式語言,你的Python白學了?

此文原文 (簡體) 出處 :

有人要为ML定制编程语言,你的Python白学了?

Python 不是為機器學習而生, 效能確實未臻理想. 但一個程式語言受到歡迎並不只是它很優秀, 簡單易學與生態系的建立才是主要因素, 特別是第三方函式庫所提供的豐富應用具有疊加效應, 使得社群聲量越來越大, 第三方函式庫與社群是程式語言成功的最主要力量. 我覺得 Julia 要能建立這樣的生態系才有可能取代 Python 如今在機器學習的地位.

其次, Python 是一個通用語言, 除了網頁前端 (被 Javascript 獨佔) 外, 幾乎可用在任何領域, Julia 能嗎? 在下面這篇文章中也列舉了 Python 與 Julia 相比之優勢 :

Julia vs. Python: Julia language rises for data science

其中談到 Julia 的陣列索引是 1 起始的, 可能是為了與 Matlab 與 Mathimatica 維持一樣的用法, 但這跟 Python 與 C 的使用者習慣的 0 起始不同, 要吸引廣大的 Python 社群有點障礙. 另外雖然 Julia 社群投入者非常積極, 但與 Python 社群數量比起來還是微乎其微. 所以, Julia 可以持續關注學習, 但 Python 還是機器學習的主力.

參考 :

Julia(1) - Why Julia?

2019年1月10日 星期四

Python 2017 超越 R 語言

今天看到下面這篇 KDnuggets 的調查報告, 顯示在資料科學與機器學習方面, Python 在 2017 年開始已經持續兩年超越 R, 成為最受歡迎的程式語言 :

Python eats away at R: Top Software for Analytics, Data Science, Machine Learning in 2018: Trends and Analysis




在 2018 年 Python 已大幅成長到 65.5 %, 而 R 卻退縮到 48.5 %.

在框架部分, Keras 與 PyTorch 是成長最快速的兩個開發工具 :




我覺得 PyTorch 前景不錯.

好站 : 製作風力發電機

今天在 Youtube 看到一個使用 PVC 管製作風力發電機影片 :

https://www.youtube.com/watch?v=AckRAYQ8N48




不過沒有使用集電環, 電線有可能因同方向旋轉多次而發生纏繞問題. 解決辦法是用滾牙的中空鐵管取代螺絲穿過滾珠軸承, 電線就可以經由中空鐵管穿下來了,

2019年1月8日 星期二

買書 : Julia資料科學應用

今天在露天看到下面這本對岸人民郵電出版的 Julia 簡體書 :

Julia資料科學應用 $329

此書是 Julia for Data Science (Zacharias Voulgaris) 的簡體翻譯版 :




這本原文書很貴, 還不如買翻譯書 :




這本書比五南出的 "Julia 程式設計" 要好, 大部分著墨在資料科學, 五南的主要是基本語法部分, 沒有包括資料科學應用.

2019年1月7日 星期一

測試網站搬家

這兩天測試 Javascript 3D 框架 Three.js, 想要將測試範例網頁放到我之前在 Hostinger 申請的免費 PHP 測試網站 tony1966.16mb.com, 但是卻出現免費服務終止告示 :




自從上回從 mybidrobot.allalla.com 搬過來 Hostinger 應該已經超過兩年沒再管理此站了, 因為有也好久沒再寫前端測試程式了.

沒辦法, 只好將備份檔搬到我 Hostinger 付費的主機 tony1966.xyz 上, 開了一個 test 目錄來存放. 但 Blogger 上所有用到 tony1966.16mb.com 網域的文章, 超連結全部都要改成  tony1966.xyz 還真累. 等過年長假再來改吧!

英國 Hostinger 主機是在2016/11/24 購買三年, 到 2019/11/23 到期, 費用 1027 元, 平均每年 342 元. 贈送網域名稱 tony1966.xyx 一年, 後續每年需自付. 參考 :

購買 Hostinger Premium 虛擬主機服務

2019年1月6日 星期日

Three.js 學習筆記 (一) : 執行環境配置

週五在市圖借了張亞飛寫的 "WebGL 專業級 3D 引擎降臨", 在書中第 18 章讀到基於 WebGL 的 3D 框架 Three.js, 它封裝了 WebGL API 的許多細節, 讓網頁 3D 的開發者能快速建立 3D 場景, 可說是 WebGL 的瑞士刀. 參考 :

https://threejs.org/
https://zh.wikipedia.org/wiki/Three.js

雖說從 WebGL API 以 Bottom-Up 方式著手才能徹底了解 WebFGL 3D 繪圖的精隨, 但那太費時間, 我覺得從較高階的 Three.js 以 Top-Down 方式來學才是快速上手之道.

Three.js 為 Ricardo Cabello 於 2012 年發布之 3D Javascript 函式庫開源專案, 它是基於 WebGL 的物件導向框架, 不需要像以前那樣依賴外部 Plug in 即可進行 3D 繪圖, 並可使用 GPU 加速. 其原始碼與教學文件寄存於 GitHub, 自發布以來經過多位貢獻者持續改進, 目前穩定版本為 r83 :

https://github.com/mrdoob/three.js/

關於 Three.js 的發展摘要如下 :
  1. 前身是 Ricardo Cabello 以 ActionScript 實作的場景演示. 
  2. Ricardo Cabello 於 2009 年移植到 Javascript.
  3. 2010 年首次發布於 GitHub.
  4. Paul Brunt 為 Three.js 添加渲染功能.
  5. Cabello 開發了 CanvasRenderer 與 SVGRenderer 等 API.
  6. Branislav Ulicny 貢獻了素材, 著色器, 後處理, 以及渲染能力之強化. 
  7. Three.js 在所有支持 WebGL 1.0 的瀏覽器皆可運行.
  8. Three.js 以最寬鬆的 MIT 授權開源. 
要在網頁主機佈署 Three.js 執行環境, 可從官網下載壓縮過的 three.min.js 檔 (約 540KB 左右), 按滑鼠右鍵選 "另存連結為", 將此 js 檔放到網頁專案的 js 目錄下 :

http://threejs.org/build/three.min.js

然後在網頁中連結此 js 檔即可 :

<script src="js/three.min.js"></script>

也可以使用 Google API 提供的各版本的 CDN (r84, r83, r82, r81, r80, r79, r78, r77, r76, r75, r74, r73, r72, r71, r70, r69, r68, r67) :

<script src="https://ajax.googleapis.com/ajax/libs/threejs/r84/three.min.js"></script>

另外, cdnjs 網站上也有提供各版本 Three.js CDN 的服務, 參考 :

https://cdnjs.com/libraries/three.js/




選擇所要版本後底下就會出現 three.min.js 的 CDN 超連結, 將其複製到網頁中 Script 標籤的 src 屬性即可.

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r83/three.min.js"></script>

基本網頁架構如下 :

使用本地 three.min.js

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="js/three.min.js"></script>
  </head>
  <body>
    <script> /* …your code here… */ </script>
  </body>
</html>

使用 Google API CDN 上的 three.min.js

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="https://ajax.googleapis.com/ajax/libs/threejs/r84/three.min.js"></script>
  </head>
  <body>
    <script> /* …your code here… */ </script>
  </body>
</html>

使用 CDN.JS 的 three.min.js

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r83/three.min.js"></script>
  </head>
  <body>
    <script> /* …your code here… */ </script>
  </body>
</html>

這樣就可以開始用 three.js 撰寫 WebGL 3D 網頁繪圖程式了. 但在那之前須對 Three.js 的 3D 繪圖架構, 術語, 以及概念有個基本了解才行, 摘要如下 :
  1. 場景 (Scene) :
    場景是一個容器, 用來放置曲面 (Mesh), 光源 (Light) 與相機 (Camera) 等 3D 繪製元素. 繪製器 (Renderer) 就根據這些元素進行繪製. 
  2. 相機 (Camera) :
    相機是觀察點, 也就是觀察者眼睛的視角投影, 要將 3D 物件呈現在 2D 平面上需要透過相機的投影. 投影有兩種模式 :
    (1). 透視投影 : 使用四稜錐建模將 3D 物件投影到 2D 平面, 有立體感.
    (2). 正交投影 : 模擬長焦鏡頭拍攝相片方式將 3D 投影至 2D, 無立體感.
    透視投影與人類視覺最類似, 有景深空間立體感, 但大小會被扭曲; 正交投影則建立 3D 物件的 2D 幾何圖形, 提供無扭曲的投影視圖, 以便精確縮放與放置. 一般 3D 繪圖流程是先以正交投影來建立場景, 得到精確之製圖與建模, 然後用透視投影來繪製輸出. Three.js 提供 PerspectiveCamera 類別與 OrthographicCamera 類別來實現透視與正交投影相機功能. 
  3. 繪製器 (Renderer) :
    繪製器是用來繪製 3D 圖形的畫布, 也就是 HTML5 中的 Canvas 元素. Three.js 提供兩種繪製器 :
    (1). WebGLRenderer :
           使用 WebGLRenderingContext 實現 GPU 加速之 2D/3D 繪圖
    (2). CanvasRenderer  (目前已被移除) :
           使用 CanvasRenderingContext2D 實現 2D 繪圖
    在特定情況下 CanvasRenderer 可用 2D 環境模擬出 3D 效果, 但與材質或光源有關的 3D 功能無法模擬, 故 3D 繪圖還是以 WebGLRenderer 為主. 若瀏覽器不支援 WebGLRenderer, 那也只好用 CanvasGLRenderer 來模擬. 
使用 Three.js 繪製 3D 圖形的流程如下 :
  1. 建立場景 :
    使用 new THREE.scene() 
  2. 建立曲面圖形物件 (mesh) :
    使用 new THREE.mesh(geometr, material)
    呼叫場景物件的 add() 方法將曲面物件加入場景中
    曲面就是 3D 空間中的物體, 由幾何形狀或模型 (geometry) 與材質 (material) 組成. 其中 geometry 由三個屬性定義 :
    (1). vertices : 頂點清單
    (2). faces : 面
    (3). faceVertexUv : 紋理座標
  3. 建立相機 :
    使用 new THREE.PerspectiveCamera()
    相機建立後會自動加入場景中, 不須呼叫 add()
  4. 建立繪製器 :
    使用 new THREE.WebGLRenderer() 建立繪製器物件 (canvas 元素)
    將繪製器物件加入網頁的 DOM 結構中
    呼叫繪製器物件的 render(scene, camera) 方法繪製指定場景與相機
若要讓 3D 圖形動起來, 通常會將這四個設定程序都寫在自訂函數 init() 中, 因為它們只在 Javascript 程式載入時執行一次. 而動作的部分寫在自訂函數 animate() 中. 以下範例改寫自 Three.js 的 Wiki, 參考 :

https://zh.wikipedia.org/wiki/Three.js

測試 1 : 移動中的 3D 立方體 [始碼]

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <style>
      body {
        background-color: #ffffff;
        margin: 0;
        overflow: hidden;
        }
    </style>
    <script src="js/three.min.js"></script>
  </head>
  <body>
    <script>
    //宣告全域變數
    var scene, camera, renderer;
    var geometry, material, mesh;
    init(); //呼叫起始設定函數
    animate(); //呼叫動畫函數
    //定義起始設定函數
    function init() {
      //1.建立場景
      scene=new THREE.Scene();
      //2.建立曲面圖形物件
      geometry=new THREE.BoxGeometry(500, 500, 500); //建立幾何形狀
      material=new THREE.MeshBasicMaterial({  //建立材質
        color: 0xff0000,
        wireframe: true});
      mesh=new THREE.Mesh(geometry, material); //以幾何形狀與材質建立曲面
      scene.add(mesh);  //曲面圖形物件加入場景中
      //3.建立相機
      camera=new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 1, 10000);
      camera.position.z=1000;
      //4.建立繪圖器
      renderer=new THREE.WebGLRenderer({antialias:true});  //建立 WebGL 繪圖器
      renderer.setClearColor("#ffffff");  //設定背景色為白色
      renderer.setSize(window.innerWidth, window.innerHeight); //設定畫布為瀏覽器大小
      document.body.appendChild(renderer.domElement); //將畫布加入瀏覽器 DOM 中
      }
    //定義動畫函數
    function animate() {
      requestAnimationFrame(animate);
      mesh.rotation.x += 0.01;
      mesh.rotation.y += 0.02;
      renderer.render(scene, camera);
      }
    </script>
  </body>
</html>

此例 Three.js 我改用 Google API 提供的 CDN 服務, 執行結果如下 :


此立方體實際上是不斷旋轉移動的.

下面範例改寫自 "Game Development with Three.js (Packt, 2013)" 第一章範例, 此程式使用了 CanvasRenderer, 新版 Three.js 已不支援, 需使用較舊的版本, 參考 :

https://mrdoob.com/projects/htmleditor/


測試 2 : 轉動的 3D 球體 [始碼]

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <style>
      body {
        background-color: #ffffff;
        margin: 0;
        overflow: hidden;
        }
    </style>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r59/three.min.js"></script>
  </head>
  <body>
    <script>
    var scene, camera, renderer;
    var geometry, material, mesh;
    init();
    animate();
    function init() {
      scene=new THREE.Scene();
      geometry=new THREE.IcosahedronGeometry(200, 1);
      material=new THREE.MeshBasicMaterial({
                     color: 0x000000,
                     wireframe: true,
                     wireframeLinewidth: 2});
      mesh=new THREE.Mesh(geometry, material);
      scene.add(mesh);

      camera=new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 1000);
      camera.position.z=500;

      renderer=new THREE.WebGLRenderer({antialias:true});
      renderer.setClearColor("#ffffff");
      renderer.setSize(window.innerWidth, window.innerHeight);
      document.body.appendChild(renderer.domElement);
      }

    function animate() {
      requestAnimationFrame(animate);
      mesh.rotation.x=Date.now() * 0.00005;
      mesh.rotation.y=Date.now() * 0.0001;
      renderer.render(scene, camera);
      }
    </script>
  </body>
</html>

執行結果如下 :

這是一個轉動的球體.

參考 :

[Da13] Three.js API 簡介
Three.js 101 : Hello World! (Part 1)

2019-01-07 補充 :

由於所有主流瀏覽器均已支援 WebGLRenderer, 因此 Three.js 已經將 CanvasRenderer 移除了, 如果要執行含有此繪圖器的程式, 可在 r59 或之前版本的 Three.min.js 上執行.

2020-09-15 補充 :

今天在接案網站上看到有人徵 three.js 案子, 想起我好像曾經玩過 (可惡的失憶), 於是就複習了一下, 順便找到下面不錯的教學 :

3D 網站開發入門筆記_Three.js 入門

這個好玩, 我有空會再回來玩的.

2019 年第 1 周記事

時序已進入 2019 年的第一周, Hello, 2019!  我來了. 時間到底是麼, 這攸關我們對生命的認知到底有多深. 對一般人來說, 時間是一條直線, 好似箭羽尾巴上綁一條線, 咻的一聲時間就這麼在眼皮下飛過去. 但對修行者來說, 時間是彎的, 有時可能是停滯的. 禪宗祖師說, 只向那漆黑桶底看去, 吭的一聲桶底脫落, 便是本來面目, 此義甚深, 甚深.

這周在愛奇藝看的 "Signal (信號)" 便是與時間有關的燒腦劇. 2015 年某個夜晚 11:23 分, 刑事心理側寫師朴海英聽到警署要報廢的雜物袋中傳來無線電呼叫聲, 對方是 2000 年失蹤的刑警李材韓, 他說他那裡是 1995 年. 拿回辦公室之後卻發現這支要報廢的無線電竟然沒有電池! 之後他每個晚上 11:23 分便等待著那個世界的李警官與他通話, 發現他所屬的長期未結案專案組手上的幾個多年未破懸案都與李材韓有關. 透過訊息的交換改變了過去, 也使得因果關係產生了變化 ... 這不是人的穿越, 而是時間的穿越. 剛開始看被這個交錯的時間序列弄得搞不清今夕是何夕. 今天看到第 11 集了, 總算有些頭緒了.

在第九集聽到了此劇的主題曲-金倫我唱的 "路" :

https://www.youtube.com/watch?v=J3VZ78hWhQw





我好喜歡金倫我唱的這首歌, 那唱腔真的, 有點慵懶, 又有點無奈.

中午隻身去小舅家吃羊肉, 爸說要睡午覺不去了. 下午與爸和左營阿姨去醫院探望大阿姨, 認得出我, 但腦子已經有點亂掉, 醒來時就反覆地亂, 真是苦了印尼看護 Cindy, 我在對面的生鮮超市買了一點水果與吐司給她.

姊姊過年的高鐵票已搶到了, 2/3 日回, 2/9 日返北, 因為寒假還要打工.

2019年1月5日 星期六

好書 : WebGL 專業級 3D 引擎降臨

昨天在市圖看到這本 "WebGL 專業級 3D 引擎降臨", 是介紹如何利用 HTML5 的 Canvas 元素以及 WebGL 函式庫在瀏覽器上繪製 3D 圖形的書, 一時好奇借回來看, 覺得還蠻有趣的, 但目前沒時間玩, 僅用我的 INHON 筆電測試一下在沒有獨顯 GPU 加持下跑 WebGL 會有多慢, 因為還在考慮要買有獨顯的 ASUS UX533 還是沒有獨顯的 ACER SF515, 其實也還好, 載入時比較慢而已.


Source : 博客來


此書於 2015 年底出了新版 : "瀏覽器語言專用3D引擎:WebGL完全剖析", 內容大致相同, 只是將各章區分為三篇而已 :


Source : 博客來


書中介紹了兩個 WebGL 應用的網站, 其一是繪製人體解剖圖的 zydotebody, 它可以選擇顯示骨骼, 肌肉, 或血管結構, 還可以旋轉從各個角度來觀察 :

https://www.zygotebody.com




其次是 chemdoodle, 此網站可線上編輯化學式, 然後用 WebGL 繪製其 3D 化學鍵結構, 非常有趣 :

https://web.chemdoodle.com/demos/2d-to-3d-coordinates/




可見 3D 繪圖在教學與學習上有很棒的加乘效果, 應該也可以拿來線上即時顯示聲譜圖, 只要對麥克風說話, 就能在網頁上顯示 3D 聲譜, 目前好像還沒看到這種網站出現.

除了原生的 WebGL API 外, 此書第 18 章還介紹了 Three.js 框架, 這是諸多 以 WebGL 為基礎的 3D 繪圖框架中最優秀的, 它封裝了建立 3D 場景的各種要素, 例如場景, 相機, 模型, 光源, 材質等等, 讓使用者只要專心在邏輯上快速建立 3D 場景, 參考 :

# https://threejs.org
Three.js API 簡介
https://zh.wikipedia.org/wiki/Three.js

檢測瀏覽器是否支援 WebGL 可拜訪下列網站 :

http://webglreport.com

書中建議的 http://doesmybrowsersupportwebgl.com 已經不存在了.

買書 : Python 技術者們-實踐!

今天去逛明儀時看到旗標出版的新書 :

# Python 技術者們-實踐!

Source :  博客來

但旗標只打 85 折, 查網路發現 UDN 新春優惠 74 折 383 元更便宜, 所以就向 UDN 買了 :




此書特點是包含許多 Python 實際應用範例.