Tagged

JUCE

All about JUCE, the cross-platform C++ toolkit.

[175] 印度軟體外包經驗
JUCE

[175] 印度軟體外包經驗

幾個月前因應專案需求,將部分工作外包給印度的工程師。花點時間反思,並紀錄下來。 上半年由於承接的軟體專案時程較趕,在台灣短時間內找不到熟悉 JUCE 的開發人員,幾經思量後,決定到 JUCE 官方論壇 尋找外包人力。 題外話。論知名度,JUCE 與 Qt 相差甚遠,與 wxWidgets 也有不小差距,這種情況在台灣尤其明顯。現在(2017)詢問一百個資深的 C++ 工程師,大概不到一個聽過 JUCE。希望過兩年情況有所改善... 「徵工訊息」發出約兩天後,有一位印度人主動來信詢問細節,並提供使用 JUCE 開發的軟體應用及個人簡歷。我回信進一步詢問: 計費模式(以小時計) 付款方式 幣別 是否願意先簽 NDA 再談細節 能否接受先以一或兩天內即能完成的小型任務(我們會支付費用)來評估其技術能力 任務完成的條件需包含原始碼 對方表示通通沒問題。

[153] JUCE Diary #14:Catch Test Framework
C++

[153] JUCE Diary #14:Catch Test Framework

Catch 在 C++ 單元測試、自動化測試領域算是新兵。由於設計優良,使用簡便,近來頗受好評。JUCE 內建了單元測試機制,雖然大部分情況下比夠用還多,不過,為了避免落入「固步自封」的工程師死亡陷阱,偶爾還是要看看窗外的世界,弄髒手,動動腦。 JUCE 論壇經常出現高手分享自己的作品,昨天就看到 varx 這個把 Reactive-Extension, RxCpp 導入到 JUCE 的專案,太有才,改天一定要試試。不過,今天的重點不在該專案,原因是我挖了專案原始碼來看,發現作者用了 Catch 做單元測試,而不是用 JUCE 內建的機制。然後,使用 Catch 來做測試真的很簡單。底下說明使用方式(程式碼參考 varx 專案)。 首先,使用 Projucer

[142] JUCE 5 以及新授權模式
JUCE

[142] JUCE 5 以及新授權模式

昨天收到 JUCE 5(目前的版本是 4.3.1) 即將於下月推出的通知信,同時公佈新的授權模式。下表是第二個版本,JUCE team 在第一個版本發出後收到不少使用者回饋,並「順應民意」在 24 小時內做出了修改: JUCE Indie 變便宜但加上營收上限 原本的 JUCE 4 授權分兩個層級:JUCE Indie , JUCE Pro。兩者的授權費用一模一樣(月繳 $49 鎂),但 JUCE Pro 可用來開發 Mobile app(Android/iOS)。新的授權把 JUCE Indie 的費用降至月繳 $35 鎂,或是一次付清 $700 鎂。

[139] JUCE Diary #13:C++ namespace 的必要
JUCE

[139] JUCE Diary #13:C++ namespace 的必要

前言 C++ namespace 的用意是減少名稱衝突,Objective-C 則是以「加上前贅詞」(「贅」者,多餘、沒有用處。)的方式處理,老實說有點不牢靠。 JUCE 的公開類別置放於 juce:: 命名空間裡。不過,預設情況下由於 JuceHeader.h 引入了 using namespace juce;,因此使用 JUCE 類別不需要加上 juce::。這麼做純粹是為了節省打字時間,並試圖讓「版面」更乾淨,但不應視為「最佳實務」。這個預設行為可以透過定義 DONT_SET_USING_JUCE_NAMESPACE=1 來改變。不過,經驗顯示加上後反而是自找麻煩... 那些年,我們一起經歷的不美好... C++ namespace 的美意如前述,

[127] 開始玩 Livecoding.tv:JUCE #1
Programming

[127] 開始玩 Livecoding.tv:JUCE #1

今年的新任務是在 Livecoding.tv 上直播「寫程式」。Handmade Hero 是我的偶像,他的撰碼技巧以及「邊講話邊寫程式」的技能讓我佩服萬分。 初期的規劃是以 JUCE/C++ 為主要內容,最好是能帶到一些 Design Pattern 實務應用。不會特別區分難度,應該是以入門為主。時間長度控制在半小時,試著用三十分鐘講一個主題。Live Coding 的挑戰是沒有辦法後製,遇到問題立即解決,處理不來當機立斷,下回再解。 藉由 Live Coding 來練習口條,同時尋找未來課程的靈感。這對我是全新的體驗,前途不明,期許至少撐個十集。

[102] JUCE Diary #12 : 答客問:InterprocessConnectionServer
JUCE

[102] JUCE Diary #12 : 答客問:InterprocessConnectionServer

網友在這篇文章問到 InterprocessConnectionServer 與 InterprocessConnection 的使用方式。本文以一簡易程式來說明如何使用這兩個類別。範例程式做的事情如下: 啟動一個 Server 程式監聽網路 Port 52713 啟動一個 Client 程式連接到本機(localhost) Port 52713 連線成功後,Client 會傳送資料到 Server Server 收到資料進行處理 Client 與 Server 皆為 JUCE Console Project,文章內的程式碼皆為片段,完整的程式碼請見文末的 Gist。由於只是示範,故省略許多錯誤判斷,請多留意。 Server-side: InterprocessConnectionServer 先來看 InterprocessConnectionServer 的介面: class InterprocessConnectionServer : private Thread { // ① public: bool beginWaitingForSocket (int

[066] JUCE Diary #11: Inter-process Communication
JUCE

[066] JUCE Diary #11: Inter-process Communication

IPC (Inter-process Communication) 指的是兩支程式透過某種方式進行單向或雙向資料傳輸。不同平台有不同的資料傳輸技術,Windows 上使用的是 Named Pipe ,Mac & Linux 則使用 socket。 土法鍊鋼打造 IPC 需要寫不少程式碼,因此,許多有規模的專案都會將其包裝成函式庫,把大量苦工碼藏起來,開放出簡單易用的介面給客人用。有心觀察其內部設計,除 JUCE 外,Chromium 也是不錯的選項。 JUCE 除了有 InterprocessConnection class 把各平台的資料傳輸技術包裝成通用的介面,更進一步把常用的功能包裝成兩個簡單易用的 class: ChildProcessMaster ChildProcessSlave 其流程為: 透過 ChildProcessMaster::launchSlaveProcess() 執行指定的執行檔 Child (Slave) process 一執行必須先(最好是在 initialise 內)initialiseFromCommandLine()與

[062] JUCE Diary #10: JUCE and Xamarin
JUCE

[062] JUCE Diary #10: JUCE and Xamarin

即時處理音訊需要較高的效能,若是要運作在手持裝置上,最好能充份運用其有限的運算資源。撰寫高效能的應用程式,C++ 最適合。正式專案用過 JUCE 後就愛上了她。 最近在評估 Xamarin,想到如果能在 Xamarin 上使用 JUCE 處理效能導向的功能,就太美妙了。 輕輕一搜,果然找到了。底下影片展示了 Xamarin 開發的 Android, iOS app 如何整合 JUCE 寫的 Library,值得一看:

[059] JUCE Has New Forum (Finally!)
JUCE

[059] JUCE Has New Forum (Finally!)

自從接觸 JUCE 以來,其 Forum 的使用體驗真的很差。所幸,一切在昨天結束了。 JUCE 新的論壇使用 Discourse 開源碼專案。Discourse 是 Stack Overflow 那個 Jeff Atwood 與其他人的傑作,目標是讓傳統論壇站台消失進化,讓世界更文明。 JUCE 新論壇的反應時間更快,瀏覽體驗更好,光這一點就加了一千分不只。不過,「無法取稅每一個人」確實是不變的定理,還是有人對新論壇系統表示強烈不滿(屑)。 速度快,又是 Responsive 設計,可以收集狗牌(Badge)...,不知道是在挑剔什麼。

[058] JUCE Summit 2015 影片集
JUCE

[058] JUCE Summit 2015 影片集

去年的 JUCE Summit 2015 錄影放出來,雖不及原本的期待,卻也學到了不少。底下整理幾個我覺得值得一看的影片,附上相關資源。 Developing Graphical User Interfaces with JUCE 由 Julian Storer 本人講解 JUCE GUI 的基本架構,包含了重要 GUI Class 說明,以及如何處理鍵盤與滑鼠事件等。 Obsessive Coding Disorder 也是 Julian Storer(JUCE Founder),提出幾個 JUCE C++ 程式碼的「標準」。他看重視 C++ 程式碼品質,並自豪於 JUCE C++ 程式碼的高品質。 看這則影片要有耐心,一不小心會睡著。倒不是因為無聊,

[054] JUCE Diary #9: Android app Development
JUCE

[054] JUCE Diary #9: Android app Development

近年來許多專案宣稱使用 Web 技術(JS + CSS + HTML)開發跨平台,特別是 Mobile app (Android and iOS),省時又省力。大概是對 Web 技術不熟悉,因此這樣的工具對我的吸引力極低。 這一年來接觸 JUCE 甚深,由於它宣稱自己跨很大,不只跨桌面(Windows, Mac, Linux),還跨到行動裝置(Android , iOS)去,剛好有需求於是花點時間玩了一下。 官方在 JUCE 論壇維護了一篇文章,教你如何使用 JUCE 開發 Android app,其中最重要的一點是: 不要嘗試在 Windows 上使用 JUCE 開發 Android app 由於 NDK 依賴的

[049] JUCE Diary #8: Memory Might Leak
JUCE

[049] JUCE Diary #8: Memory Might Leak

先前提到 JUCE 應用程式的初始化區塊之一為 initialise method。程式執行時,在初始化階段有一常見的情境: 一旦某一條件成立或某些條件不成立時需停止執行。 若在 initialise 發現程式必須終止,最直覺的作法是呼叫 systemRequestedQuit。不過,這麼做在 Windows 上會出現 Memory Leak,如下圖: 解決方法是離開 initialise 後再想辦法停止執行,但 initialise 無回傳值(void),故無法以回傳值停止。MessageManager::callAsync 可以在 Main Thread 執行特定程式區塊,適合用法解決我們遇到的問題。寫法如下: MessageManager::callAsync([this]() { systemRequestedQuit(); }); 上面程式碼寫在 initialise 裡,翻成白話文:把 systemRequestedQuit() 塞到 Message Thread(通常就是

[048] JUCE Diary #7: 基本架構
JUCE

[048] JUCE Diary #7: 基本架構

Projucer 創建的專案範本包含的基本元素,其相關檔案如下: Main.cpp MainComponent.cpp MainComponent.h 以時下流行的 MVC pattern 來類比,Main.cpp 大概就是 Controller,而 MainComponent.cpp/MainComponent.h 則是 View。Model 還沒有,視情況自己補。 上回 Projucer 建立的 GUIApp 專案的主要檔案 Main.cpp 裡頭有一個 GUIAppApplication class(類別,以後不中譯了),繼承自 JUCEApplication。這個 JUCEApplication 很重要,化成灰都要記住它,以後再慢慢解釋。 使用 JUCE 這類工具的好處是,雜事交給它們,

[047] JUCE Diary #6: 地雷
JUCE

[047] JUCE Diary #6: 地雷

JUCE v4 版之後要求建立 ROLI 帳號才能下載,過了那關之後會取得一個壓縮檔,裡頭放了 JUCE 的原始碼跟一支名為 Projucer 的工具。 建立 JUCE 專案的工作由 Projucer(v3 以前叫做 Introjucer) 全權負責,也是從 JUCE v4 之後,Projucer 會要求輸入 ROLI 帳密: 底下示範如何建立一個 GUI 應用程式(Visual Studio 2015): 上圖同時也示範了如何移除不需要的 JUCE Module。雖然 Audio Processing 是 JUCE 強項,但我的專案用不到,於是將其刪除。 地雷在這裡 置放 JUCE 原始碼的位置很重要! 上述步驟完成後,用