| 揚聲器 |
抄本 |
| 塞爾凱·奧爾梅茲 |
大家好,我是 Seagate 的 Serkay 和 Fred,今天我們將討論如何建立 JSL 生態系統來管理我們的 JSL 腳本。 |
| |
我們使用 Git 來管理原始碼控制、JSL 腳本的原始程式碼以及分發它們。這就是今天演講的重點。 |
| |
除此之外,我還將討論如何用 VBA 整合 PowerPoint,以及崩潰日誌收集和單元測試。我會快速跳到大綱。 |
| |
首先我想談談 JSL 的歷史。我用 JSL 寫腳本大概 10 年左右了。 |
| |
我們對目前的狀況感到非常滿意,但我們花了相當多的時間才達到今天的水平,我想談談我們經歷的里程碑、我們迄今為止所做的事情以及我們這樣做的原因。 |
| |
然後我們會討論 Git,以及如何啟用 Git 來控制 JSL 腳本的原始程式碼,以及如何透過 Git 建立更多功能。例如,啟用 Git 後, |
| |
你可以添加更多功能,例如監控腳本。這樣開發人員就能知道他們的腳本正在被使用,從而監控其使用情況。 |
| |
更重要的是,它們還可以收集日誌。如果腳本崩潰,開發人員會知道,然後可以回去修復這些錯誤。而且你還可以… |
| |
您可以更進一步新增一項功能。您甚至可以建立自動錯誤工單,即使您已知腳本崩潰了。這樣您就可以自動建立錯誤工單。您可以使用 JIRA 或 Atlassian 等追蹤軟體來追蹤這些工單。 |
| |
最後我將總結我們迄今為止的最佳實踐和經驗教訓。 |
| |
所以, |
| |
附錄中還附有我將要討論的一個腳本的手冊。這個腳本可以將映像推送到 PowerPoint。 |
| |
我有一本非常詳細的手冊,我應該讓你知道,我在這裡談論的所有內容、數據和腳本都將可用。 |
| |
它們發佈在參考資料部分的公共儲存庫中,如果你願意的話,可以直接去那裡取得這些文件。首先,我先說一下 |
| |
簡單回顧一下。我和 JSL 合作了大概 10 年左右,一開始,我 |
| |
非常基礎,我對 JSL 腳本了解不多。 |
| |
然後,一旦你開始這樣做,你就會意識到你必須有一些適當的原始碼控制,並且你需要適當的方式來分發你的腳本。 |
| |
JMP 腳本的特性是零門檻。您可以直接手動繪製圖表,然後取得腳本。腳本已經為您編寫好了。 |
| |
您也可以使用 JMP.com 上的 JMP 社群來提問並獲得答案。 |
| |
而你……腳本寫得非常高效,以至於你的工作效率很高,人們會注意到的。他們會問你怎麼做事,你會說我有個腳本。然後他們就會 |
| |
Q:「你能和我分享一下嗎?」然後突然間你就成為了一名開發人員,儘管你並沒有打算這樣做。 |
| |
然後你得處理腳本的分發問題。我第一個想到的方法就是直接把它們附加到附件裡,這想法很糟糕,我已經這麼做了好一陣子了。 |
| |
很明顯這不是一個好主意,因為你附上了一個腳本,然後你把它發送出去,第二天你又製作了一個 |
| |
修改後,你還得重新發送,你甚至不知道用戶是否會接受下一個版本。我只是想在這裡說明一下。 |
| |
最近,我收到一位同事的郵件,他提到了我 2017 年創作的一個腳本,而我只是用這些程式碼來給腳本編號 |
| |
版本號,這不是個好主意。所以三、四年後你又發現人們還在用三年前的腳本,因為他們沒有更新。 |
| |
解決這個問題的一種方法是使用共享驅動器,並根據我與其中的人的互動 |
| |
Discovery Summits 的一大優勢在於,許多公司和個人都在使用這個平台。開發者需要做的就是 |
| |
把腳本轉儲到共享驅動器,用戶就可以直接從共享驅動器拉取,這解決了一半的分發問題,但它對原始碼控制沒有任何作用。你無法追蹤你在程式碼中所做的更改。 |
| |
這就是我們真正轉向 Git 的原因。這對我們來說是一個突破,並且啟用了許多功能。那麼,Git 的作用是什麼呢?開發人員會將他們的腳本推送到程式碼庫,然後 |
| |
用戶將直接從 Git 提取腳本。這對我們來說是一個很大的改進,它使我們能夠收集崩潰日誌, |
| |
腳本的使用等等。我還想談談我從高峰會學到的一些東西。這些高峰對我提升腳本編寫技能很有幫助,我參加了2018年的一次高峰會,學到了很多關於表達式等方面的知識。所以 |
| |
人們可能想回去聽聽這些演示,因為它們確實有助於提高腳本編寫技能。 |
| |
我們的另一個里程碑是測試。去年高峰會的一次演講給了我很大的啟發,那次演講講的是單元測試,它能讓你在發布腳本之前自動測試它們。 |
| |
今天我將主要談論整合測試,因為單元測試是…單元測試是必需的,但還不夠。 |
| |
因為你可以進行單元測試,所以你可以測試所有模組,而且它們檢查無誤。但是當你把它們放在一起時,它們就無法工作了。它們會崩潰,就像這裡展示的那樣。每個抽屜可能都經過了測試,但當你把它們放在一起時,它們就無法運作了。 |
| |
一個對開發人員有很大幫助的功能就是日誌收集。 |
| |
了解你的腳本崩潰了,以及它是如何崩潰的,這非常有幫助。你可以透過收集使用者的日誌來做到這一點,然後你可以返回並修復腳本並推送更改,這樣用戶就可以立即獲得修復後的腳本。 |
| |
我們最近推出的最後一個功能是自動錯誤報告。既然您已經擁有崩潰報告,為什麼不根據這些資訊採取行動呢?因此,我們創建了一個自動報告系統。 |
| |
監控 |
| |
系統會追蹤這些崩潰日誌,並自動建立錯誤報告,以便開發人員能夠處理這些問題。此外,您還可以將使用者新增為觀察者,以便使用者知道有人正在處理該問題。這樣就解決了 |
| |
解決了使用者和開發者之間的資訊差距。 |
| |
這是時間線,我會花一些時間 |
| |
在單一專案上,但我們將從 Git 開始,我將快速建立它並讓 Fred 討論它。 |
| 163084 |
好的。 |
| |
所以, |
| |
Git 只是一個版本控制系統,我並沒有使用「版本控制」這個詞。實際上,我想說的是,即使你只在自己的本地電腦上使用 Git,它也能有效地幫助你無限次地重做。它 |
| |
使您能夠追蹤文件的修訂並返回舊版本,以防您認為過去幾週所做的某些工作不正確,並且想要返回幾週前的某些工作。 |
| |
Git 只是一個安裝在本機上的軟體。它會建立一個倉庫,然後這個倉庫可以發佈到其他倉庫。 |
| |
例如 GitLab 或 GitHub。 TortoiseGit 是一個 GUI 介面,可以在本機上使用,讓操作更簡單。 Serkay,請開啟下一張投影片。 |
| |
所以我嘗試讓開發人員在本地電腦上使用的模型。本地的開發人員,安裝 Git 用戶端並啟動 |
| |
在本機上對檔案進行版本控制。一旦他們養成了這樣做的習慣,我們就可以將它們連接到遠端儲存庫 |
| |
Git 連接到遠端儲存庫或透過 SSH 或其他方法,他們可以推送 |
| |
將其 Git 資料庫的副本上傳到遠端儲存庫。一旦上傳到遠端儲存庫,HTTP Web 伺服器就可以將其共用給 JMP |
| |
然後可以指向 URL 和 HTTP…HTTP Web 伺服器並從中載入腳本。因此,我們沒有使用共用驅動器,而是使用透過推送到 Git 倉庫來填充內容的 HTTP Web 伺服器。 |
| |
以下的要點指出了它的好處以及它的具體工作原理。 |
| |
我們可以轉到下一張投影片。 |
| 塞爾凱·奧爾梅茲 |
因此我將接手這裡,弗雷德,我將向您展示...展示一個非常基本的插圖實現,並且腳本可以在參考文獻中找到。 |
| |
所以, |
| |
這將會是一段非常基礎的程式碼。我這裡展示的是開發人員正在開發的程式碼。這是最基本的,對吧?它只是一個對話框,上面寫著「Hello World」。 |
| |
假設開發者想把這段程式碼傳遞給使用者。那麼開發者傳遞的不是這段程式碼,而是這段程式碼。 |
| |
這是程式碼庫的連結。所以,這就是 hello JSL 腳本的源代碼庫… |
| |
在遠端存儲庫中。使用者所做的就是抓取…使用者抓取 |
| |
腳本來自 URL。所以這是靜態程式碼。它不需要任何更改,開發人員可以隨時更改腳本,但使用者無需執行任何操作。我在這裡只展示一個範例,我只想全螢幕顯示。 |
| |
只是示範如何透過特定的 GUI(也就是 GitHub Desktop)來操作。你需要安裝這個 |
| |
在你的電腦上建立一個本機儲存庫,這樣它們就會追蹤你所做的更改。例如,在本例中,我剛剛建立了這個 hello JSL 腳本 |
| |
軟體會辨識出有變化,並自動高亮顯示。你需要先將其提交到本地倉庫, |
| |
它會把這些東西推送到你的本地倉庫,然後你再把它們推送到來源倉庫(也就是遠端倉庫)。現在,我會把它們推送到遠端倉庫,這樣用戶就可以使用了。 |
| |
一旦你這樣做了,用戶現在就可以拉取這段新程式碼了。現在我切換回使用者角色,然後使用者執行這個腳本,當你…一旦你這樣做了,對話方塊就會出現。所以你正在運行從程式碼庫中拉取的腳本。 |
| |
因此我將使用更高級的程式碼來更好地說明這一點,這也與 PowerPoint 相關。 |
| |
人們在 JMP 中做了很多分析,但很多人最終還是想把結果推送到 PowerPoint 中。我知道 JMP 有一些功能可以 |
| |
圖像直接匯入到 PowerPoint 中,但我們想要更多…更複雜的東西。我們想 |
| |
管理 PowerPoint 的範本。我們想在 PowerPoint 中做更多的事情,例如決定每張投影片放多少張圖片等等。 |
| |
為了做到這一點,您首先需要將 JMP 與 PowerPoint 連接起來,實際上您可以非常輕鬆地做到這一點… |
| |
非常好用,你甚至不用離開 JMP。所以你可以找到 PowerPoint 執行檔的位置,它通常位於 Program Files 目錄下。 |
| |
然後建立一個批次檔來觸發這個 PowerPoint 執行文件,它會抓取你要執行的 PowerPoint 文件並直接執行。所有這些操作都可以在 JMP 中完成。它的作用基本上就是搜尋 PowerPoint 執行檔。 |
| |
一旦找到它,它就會將其打包到這個批次檔中。它還包含你要執行的 PowerPoint 的路徑 |
| |
以及巨集,所以 PowerPoint 中會有一個巨集來在 PowerPoint 中進行管理。所以你可以這樣做 |
| |
將 JMP 綁定到 PowerPoint 上,你甚至需要把 JMP 留在 PowerPoint 中才能完成這項工作。但問題是,你如何才能把這個 PowerPoint 檔案傳送給你的使用者?你可以 |
| |
讓他去下載,這並不理想,因為你想自動管理它,同時又想控制你的PowerPoint的原始碼。所以它需要是一個好的候選者;它需要成為整個生態系的重要組成部分。你不會想把它放在外面。 |
| |
還有一個要求是,你不想每次腳本運行時都下載 PowerPoint。所以,只有當圖像儲存庫中的內容改變或 PowerPoint 出現新內容時,你才需要下載 PowerPoint。 |
| |
一種方法是使用這個 JMP 腳本,一個包含建立日期的 JMP 指令。我在這裡做的是檢查 |
| |
本地文件的日期。所以如果本機 PowerPoint 比我儲存庫中的舊,我就會去下載它。所以 |
| |
它將使用 HTTP 請求下載 PowerPoint,並且 |
| |
看起來像這樣。所以你只需要在本地電腦上檢查你的 PowerPoint 檔案。如果它不存在,你就可以透過 HTTP 請求從儲存庫中拉取它。如果它存在,你就查看它的日期,如果它已經過期,你仍然可以 |
| |
拉取新的。所以,關鍵在於,您可以將 PowerPoint 無縫整合到 JMP 環境中,這樣您就可以將結果(包括表格和圖像)推送到 JMP 中。而且,所有這些操作都無需破壞原始程式碼控制,我將在這裡進行演示。 |
| |
例如,這就是你要提供給使用者的程式碼。同樣,這是靜態程式碼。它除了一個 URL(連結到遠端程式碼庫的腳本)之外什麼也沒有。所以它會去抓取 |
| |
儲存庫中的 JMP 腳本,這些腳本再次可用,您可以從參考文獻中提取它們。 |
| |
從開發者的角度來看,這是實際的腳本,對吧。這是開發人員開發的腳本, |
| |
他或她將其推送到遠端存儲庫。這個腳本的優點在於,我只想在這裡快速指出幾個功能。 |
| |
例如,看看這個。這是一個獨立的文字腳本,你不需要分發 PowerPoint 檔案或其他腳本 |
| |
分別進行。你需要在腳本中連結它們,它們也連結到這裡的儲存庫。 |
| |
包括 PowerPoint。這個腳本會管理所有分發。它會去抓取 PowerPoint。 |
| |
如果需要,它會去抓取其他附加文件。所以所有內容都捆綁到腳本中,它會幫你完成所有管理工作。我來快速示範一下。我會把它拉回來 |
| |
並將其置於全螢幕 |
| |
這樣你就能看得清楚了。這將是自動觸發 PowerPoint 的演示 |
| |
針對特定情況。這個腳本的作用是從表中獲取路徑,這是一個包含大量圖像路徑的 JMP 表,這些路徑指的是這個特定的 |
| |
伺服器,它將採用這些路徑,並將只採用這裡突出顯示的路徑,然後將它們推送到 PowerPoint。 |
| |
我直接運行這個腳本,如果你想試試的話,這個腳本可以供你使用。它是一個功能齊全、實用的腳本。所以,我正在運行這個 |
| |
腳本在這裡。再次強調,它指的是儲存庫。所以它沒有行腳本,它只是從儲存庫中拉取。運行它,它會檢索程式碼,並執行一個對話框。 |
| |
我只需運行它即可。我不會詳細介紹,一旦運行它,它就會自動觸發 PowerPoint。 |
| |
PowerPoint 會啟動,然後…它開始…它正在製作幻燈片。它會提取 20 張圖片,這需要 10 到 20 秒,然後你就會有 PowerPoint |
| |
完成了。這就是您得到的 PowerPoint,一切都是自動完成的,所有內容都已從儲存庫中提取。 |
| |
那麼下一步是什麼?你會如何修改這份 PowerPoint?所以,我建議你對模板做一些修改。 |
| |
你可以在附錄中看到更多細節,但我想展示的是如何改變 |
| |
PowerPoint 中的腳本。然後我會全螢幕顯示, |
| |
我先運行一下。我們現在開始的是上一張投影片剩下的內容,對,就是這些圖片。 |
| |
我想做的只是稍微修改一下模板,只是為了說明這一點。所以你去… |
| |
你打開宏,向下滾動,找到你想修改的內容,我會在這裡做一個簡單的修改。我會改變標題的顏色,只是為了強調這一點。所以你修改這個 |
| |
和 |
| |
保存它。這是實時的。 |
| |
您可以保存它並刪除幻燈片,以便它更快地進入儲存庫,因為您將把它推送到儲存庫。 |
| |
然後你使用 Git GUI 推送它。它會進入倉庫 |
| |
它會將修改內容提供給您的使用者。這樣,所有使用者都會立即獲得修改。這樣,您就不必讓他們去更新 PowerPoint 或其他任何東西了。 |
| |
這只是進入存儲庫。 |
| |
我將切換回 JMP 並進入使用者模式,然後再次執行腳本,這將檢索新的 PowerPoint。 |
| |
如果你再次運行它,它將通過 |
| |
幻燈片,它會建立幻燈片。你會注意到,你確實做了一些更改,也就是更改標題行的顏色。 |
| |
所以, |
| |
我們還有什麼? |
| |
腳本監控。我認為這是我們開發的最好的功能之一,因為它讓開發人員能夠查看 |
| |
他們的劇本……他的劇本,不管它被欣賞與否。對。那麼它運行了嗎?有人定期運行它嗎? |
| |
這是其中一個好處。另一個好處是 |
| |
日誌…崩潰日誌收集。如果腳本失敗,您可以使用 JMP 的日誌擷取功能來擷取故障。這樣,您就可以將子程式嵌入到日誌擷取中。 |
| |
如果失敗了…失敗的日誌會回到這個日誌回傳文字。然後你還需要做的是 |
| |
將其包含在嘗試中,以便腳本仍然可以進行報告。 |
| |
然後檢查它是否為空。如果為空,則表示根本沒有崩潰,所以你的腳本仍然有效。 |
| |
但如果不是,如果它不為空,則表示發生了崩潰,並且您已將其控制住。您可以抓取日誌,然後報告它。方法是使用 HTTP |
| |
使用者 ID、腳本名稱和日誌註釋,是否崩潰... |
| |
無論是崩潰還是正常的運行,都可能涉及一些效能指標。所以,最重要的是,你可以將一些關於腳本的資料元資料傳回給開發人員。 |
| |
伺服器會記錄這些操作,然後你會在伺服器中儲存一組文件,你可以監控它們。我只是舉個例子 |
| |
表格。這是崩潰日誌,有日期戳,有腳本名稱,所以這個腳本在日期失敗了 |
| |
這次崩潰的情況。這對開發者來說非常有用,因為他們可以返回並修復這個問題。我會把這個和這個折疊起來,然後在這裡做一個快速演示,展示如何 |
| |
你怎麼樣 |
| |
包含崩潰以及如何向用戶報告。所以我在這裡要做的是讓子程序崩潰。我將建立一個未定義的參數 |
| |
JMP 會報錯誤。它會說這個東西沒有定義,所以腳本崩潰了。但我要做的是呼叫那個子程序 |
| |
在日誌擷取功能中,所有內容都會被夾在try下。因此,儘管腳本與子例程一起崩潰,但它總體上仍然有效,並且能夠報告 |
| |
崩潰報告。那麼,你向用戶發送一個格式清晰的通知,並告知用戶。腳本因為這個錯誤崩潰了,我們建立了一個日誌,正在處理。這就是你給用戶的通知。 |
| |
我在高峰會學到的一個關鍵點就是自動化測試。我以前都是手動測試,很令人沮喪。 |
| |
因為這需要時間,而且你不可能捕捉到腳本的每一個細節。當你做一個小改動時,你不可能花幾個小時來測試。 |
| |
所以我開始接觸自動化測試,單元測試非常重要。測試指的是對單一子程序的測試。例如,你有一個函數,你想測試它。 |
| |
在將它放入整個系統之前,你可以進行多次單元測試 |
| |
對於單一模組來說,這還不夠。我可以給你們看幾個例子。 |
| |
例如,美國太空總署因一個非常奇怪的錯誤丟失了他們的火星氣候探測器……因為有兩個軟體團隊,一個在歐洲, |
| |
一個在美國。其中一個使用英鎊單位,一個在美國,一個在歐洲 |
| |
他們用的是牛頓法。所以他們當然做了單元測試。但是當他們把程式碼整合在一起時,卻無法工作,因為一個期望牛頓法,另一個卻得到了磅。所以他們真的失去了 |
| |
軌道飛行器,只因為他們忘記把磅換算成牛頓。最近,波音公司也失去了他們的星際客機,後來他們承認,如果他們當時做了這些,就能發現這個錯誤。 |
| |
嚴格的整合測試。最終,重要的是 |
| |
整合測試,因為模組在腳本中不是單獨存在的,而是一起對話的。 |
| |
這很有趣地說明了這個問題。所以你可以有兩個物件進行徹底的測試。這是一扇窗戶,對吧?窗戶會出什麼問題呢? |
| |
但是如果你將兩個放在一起,它們甚至無法打開,所以你必須做一些整合測試來查看它們是否組合在一起,是否可以正常工作。 |
| |
我想在這裡簡單說明一下我是如何開始做自動化測試的。這裡指的是一個具體的例子, |
| |
公平地說,這是一個困難的情況,因為這將是對模態視窗的測試,而模態視窗不會消失,除非你點擊按鈕。所以你必須 |
| |
創建一個 JMP 腳本,點擊一個按鈕,模仿人類的行為,我在這裡做的是將測試人員注入到 |
| |
模態視窗。我認為這種方法的好處在於,你仍然可以分發 |
| |
這個東西,這個腳本給你的用戶,用戶甚至不會意識到其中實際上有一些測試程式。 |
| |
因此,它具有測試人員的鉤子,但是當您單獨運行它時,它所做的就是查找此測試模式參數,但該參數尚未設定。 |
| |
因此,如果未設置,腳本會將其設為零,從而停用表中的所有鉤子。因此,您可以將其提供給用戶,讓他們以此方式運作。 |
| |
但是,如果你想測試你的腳本,你需要在它上面建立一個測試程式碼。測試程式碼會將測試模式設為 1,並且還會建立測試器… |
| |
你想注入到腳本中的測試對象。例如,在這個例子中,它的作用是選擇一個特定的列 |
| |
然後透過點擊按鈕將其分配到角色,然後運行腳本,對吧。所以這其實是在模仿人類的行為。 |
| |
然後它會載入實際的腳本。基本上就是把這些參數注入到你想要測試的腳本中。現在你正在自動執行腳本,它會載入並執行腳本,點擊這個按鈕和那個按鈕後,它會關閉使用者介面。 |
| |
然後,您要做的就是在日誌捕獲功能中再次運行它,這樣您就知道如果出現問題,您將捕獲故障。 |
| |
你也把它放在了 Enter Try 語句中,這樣總體來說,腳本可以繼續執行並報告日誌。如果沒有錯誤,你將看到空的日誌返回,這意味著你的腳本沒有失敗。 |
| |
如果出了什麼問題,你會在日誌擷取中知道。這就是我們的想法。 |
| |
所以, |
| |
我們有 |
| |
監控腳本的能力。我們有能力 |
| |
捕獲崩潰日誌。所以我們想,為什麼不根據崩潰日誌採取行動呢?如果你看到崩潰日誌,這意味著出了問題,並且腳本…用戶已經知道了,因為腳本顯然崩潰了,而開發人員也知道腳本崩潰了,因為日誌 |
| |
儲存在伺服器中。所以它們在那裡等著你處理。但問題是,這還不是一個閉環,因為使用者不知道開發者知道。你可以透過建立自動化工單來閉合這個閉環。既然你已經掌握了這些信息,你就可以 |
| |
使用錯誤追蹤軟體(例如 JIRA Atlassian),然後就可以使用 REST 功能 |
| |
從伺服器收集資訊,建立工單,分配給開發人員,也可以將使用者指定為觀察者。觀察者意味著,每當開發人員執行任何操作時 |
| |
關於該錯誤的資訊並將該資訊輸入到 JIRA 中,該資訊將循環返回給用戶,以便他或她收到通知並知道有人正在處理該錯誤。 |
| |
有多種方法可以做到這一點,具體取決於您擁有的 JIRA 的風格,我只是給您提供 |
| |
這裡有一些基本程式碼。這是一個你可以創建的 curl 程式碼,你可以從崩潰日誌中收集元數據,並將其嵌入到 JSL 檔案中,然後透過 REST 進行傳輸,並進入 |
| |
JIRA,它會幫你追蹤。然後,如果你設定正確,JIRA 會通知它…JIRA 會通知開發人員,甚至可能 |
| |
腳本崩潰的用戶…以及導致崩潰的用戶。所有這些都連結在一起,開發人員會知道有需要他/她處理的 bug,使用者也會知道有人正在處理這個 bug。 |
| |
好的。我想這就到了我的總結部分。總結一下大家可以從本次演講中獲得的收穫。 |
| |
Git 一直是我們系統的基石,它使我們能夠實現許多不錯的功能,我什至沒有提到基本功能, |
| |
這很明顯,因為它也賦予了你協作的能力。所以,如果多人同時處理同一個腳本,你可以使用 |