揚聲器 | 成績單 |
| 塞爾凱·奧爾梅茲 | 大家好,我是 Seagate 的 Serkay 和 Fred,今天我們將討論如何構建 JSL 生態系統來管理 JSL 腳本。 |
| 因此,我們使用 Git 來管理源代碼控制、JSL 腳本的源代碼,以及分發它們。 這就是今天演講的重點。 |
| 但除此之外,我還將討論用於 PowerPoint 集成的 VBA、崩潰日誌收集以及單元測試。 我會快速跳到大綱。 |
| 所以我想首先談談我們JSL的歷史。 我使用 JSL 編寫腳本已有大約 10 年左右的時間。 |
| 我們對目前所處的位置非常滿意,但我們花了相當多的時間才到達這裡,我想談談我們經歷的里程碑,我們迄今為止所做的事情以及我們這樣做的原因。 |
| 然後我們將討論 Git 以及我們如何使 Git 能夠對我們的 JSL 腳本進行源代碼控制以及它如何使我們能夠構建更多功能。 例如,一旦啟用 Git, |
| 您可以添加更多功能,例如監視腳本。 所以您知道開發人員可以知道他們的腳本正在使用中,因此他們可以監視使用情況。 |
| 也許更重要的是,他們還可以收集日誌。 如果腳本崩潰,開發人員知道並且他或她可以返回並修復這些錯誤。 而且你可以... |
| 您可以進一步添加一項功能。 您甚至可以創建您已經知道腳本崩潰的自動錯誤通知單。 因此,您可以自動為此創建錯誤單。 您可以使用 JIRA 或 Atlassian 等跟踪軟件來跟踪這些票證。 |
| 最後我將介紹我們迄今為止的最佳實踐和經驗教訓。 |
| 所以, |
| 在附錄中,我還有我將要討論的腳本的手冊。 這是一個可以將圖像推送到 PowerPoint 的腳本。 |
| 我有一本非常詳細的手冊,我應該讓您知道我在這裡談論的所有內容、數據和腳本都將可用。 |
| 它們發佈在此處參考部分的公共存儲庫中,如果您選擇這樣做,您可以直接去那裡獲取這些文件。 那麼讓我從 |
| 這裡有簡短的歷史。 所以 10...我已經與 JSL 合作了大約 10 年左右,並且開始,我開始於 |
| 非常基礎的知識,我對 JSL 腳本編寫了解不多。 |
| 然後,一旦您開始這樣做,您就會意識到您必須有一些適當的源代碼控制,並且您需要正確的方法來分發腳本。 |
| 因此,JMP 腳本的特點是它的進入門檻為零。 因此,您實際上可以手動繪製情節,然後去獲取腳本。 這是為你寫的。 |
| 您還可以使用 JMP.com 中的 Community to JMP 提出問題並獲得答案。 |
| 而您...腳本編寫非常高效,您的工作非常高效,人們會注意到。 他們會問你是如何做事的,你會說我有一個腳本。 他們會 |
| 問:“你能和我分享一下嗎?” 突然之間,你成為了一名開發人員,儘管你無意這樣做。 |
| 然後你必須處理分發你的腳本。 我想到的第一個想法就是把它們附加起來,這是一個可怕的想法,我已經這樣做了很長一段時間了。 |
| 很明顯為什麼這不是一個好主意,因為你附上一個腳本,然後將其發送出去,然後第二天你就製作了一個 |
| 修訂版,然後你必須再次發送它,你甚至不知道用戶是否會接受下一個。 所以我只是在這裡說明這一點。 |
| 最近,我收到一位同事發來的電子郵件,他提到了我在 2017 年創建的一個腳本,我只是用這些對我的腳本進行編號 |
| 版本號,這不是一個好主意。 所以三四年後它又回來了,你意識到人們仍在使用三年前的腳本,因為他們沒有更新。 |
| 解決此問題的一種方法是使用共享驅動器,並基於我與其中的人員進行的交互 |
| Discovery Summits,就是很多人、很多公司都在用這個。 那麼開發人員要做的就是 |
| 將他們的腳本轉儲到共享驅動器中,用戶將直接從共享驅動器中拉取,這解決了分發問題的一半問題,但它對源代碼控制沒有任何作用。 您不...您無法跟踪您在代碼中所做的更改。 |
| 這就是我們實際上轉向 Git 的原因。 這對我們來說是一個突破,並啟用了許多功能。 那麼,您使用 Git 所做的就是開發人員將他們的腳本推送到存儲庫並 |
| 用戶將直接從 Git 提取腳本。 所以這對我們來說是一個很大的改進,它使我們能夠收集崩潰日誌並 |
| 腳本的使用等等。我只想談談我從峰會中學到的更多東西。 它們對提高我的腳本技能非常有用,我參加了 2018 年的一次峰會,學到了很多關於表達式等的知識。所以 |
| 人們可能想回去聽這些演示,因為它們確實有助於提高腳本編寫技能。 |
| 我們的另一個里程碑是關於測試。 因此,我受到了去年峰會上的這次演講的啟發,該演講是關於單元測試的,它使您能夠在發布腳本之前自動測試腳本。 |
| 今天我將主要討論集成測試,因為單元測試......單元測試是必需的,但還不夠。 |
| 因為您可以進行單元測試,所以您可以測試所有模塊,並且它們檢查得很好。 但當你把它們放在一起時,它們就不起作用了。 它們會崩潰,如此處所示。 每個抽屜可能都經過測試,但是當你把它們放在一起時,它們將無法操作。 |
| 一項對開發人員有很大幫助的好功能是日誌收集。 |
| 知道您的腳本崩潰以及它是如何崩潰的非常有幫助。 您可以通過收集用戶的日誌來做到這一點,然後您可以返回並修復腳本並推送更改,用戶將立即擁有固定的腳本。 |
| 我們最近推出的最後一個功能是關於自動錯誤報告。 既然您已經有了崩潰報告,為什麼不根據該信息採取行動呢? 所以我們創建了一個自動化的 |
| 監控 |
| 系統,它將跟踪這些崩潰日誌,並自動創建錯誤報告,以便開發人員可以處理這些問題。 最重要的是,您可以將用戶添加為觀察者,以便用戶知道有人正在解決該問題。 這樣,這樣就解決了 |
| 解決了用戶和開發者之間的信息鴻溝。 |
| 這顯示了時間表,我將花一些時間 |
| 我們將在各個項目上進行討論,但我們將從 Git 開始,我將快速構建它並讓 Fred 來討論它。 |
| 163084 | 好的。 |
| 所以, |
| Git 只是一個版本控制系統,我不使用版本控制這個詞。 實際上我想說,即使您只在自己的本地計算機上使用 Git,Git 也可以通過為您提供有效的、無限制的重做來幫助您。 它 |
| 使您能夠跟踪文件的修訂並返回到舊的文件,以防您認為過去幾週所做的某些工作不正確並且您想返回到幾週前的某些工作。 |
| 所以 Git 只是一個安裝在本地計算機上的軟件。 它創建一個存儲庫,然後可以將該存儲庫發佈到其他存儲庫。 |
| 例如 GitLab 或 GitHub。 TortoiseGit 是一個 GUI 界面,可讓您的本地計算機變得更加輕鬆。 Serkay,您能否打開下一張幻燈片。 |
| 因此,我試圖讓開發人員使用的模型是在他們的本地計算機上。 本地開發人員,讓他們安裝 Git 客戶端並啟動 |
| 控製本地 PC 上文件的版本。 一旦他們養成了這樣做的習慣,我們就可以將他們連接到遠程存儲庫 |
| Git 通常連接到遠程存儲庫或 SSH 或其他方法,並且它們可以推送 |
| 將 Git 數據庫的副本複製到遠程存儲庫。 一旦它出現在遠程存儲庫上,HTTP Web 服務器就可以將其共享出去並進行 JMP |
| 然後可以指向 URL 和 HTTP...HTTP Web 服務器並從中加載腳本。 因此,我們沒有使用共享驅動器,而是使用通過推送到 Git 存儲庫來填充的 HTTP Web 服務器。 |
| 下面的項目符號只是指出了它的好處以及它到底是如何工作的。 |
| 我們可以轉到下一張幻燈片。 |
| 塞爾凱·奧爾梅茲 | 所以我將接管這裡,Fred,我將向您展示...展示一個非常基本的插圖實現,並且腳本可以在參考資料中找到。 |
| 所以, |
| 這將是一個非常基本的代碼。 我在這裡展示的是開發人員正在開發的代碼。 這是最低限度的,對吧。 它只是一個對話框,上面寫著“你好,世界”。 |
| 並假設開發人員希望將此代碼傳遞給用戶。 所以開發者傳遞的不是這段代碼,而是這段代碼, |
| 這是存儲庫的鏈接。 這是 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 比我在存儲庫中的 PowerPoint 舊,那麼我會去下載它。 所以 |
| 它將使用 HTTP 請求下載 PowerPoint,並且 |
| 看起來像這樣。 所以你要做的就是去檢查本地計算機上的 PowerPoint。 如果它不存在,您可以使用 HTTP 請求從存儲庫中提取它。 如果它存在,你喜歡看看它的日期,如果它是舊的,你仍然去 |
| 拉新的。 因此,這裡的底線是您可以將 PowerPoint 無縫集成到 JMP 環境中,這樣您就可以將結果推送到 JMP 中,包括表格、圖像。 您可以在不破壞源代碼控制的情況下完成所有這些工作,我將在這裡展示一個演示。 |
| 例如,這將是您提供給用戶的代碼。 再次強調,這是靜態代碼。 它實際上除了一個 URL 之外什麼都沒有,該 URL 將腳本鏈接到遠程存儲庫。 所以它會去抓住 |
| 存儲庫中的 JMP 腳本和這些腳本再次可用,您只需從參考文獻中提取它們即可。 |
| 從,從,從開發者方面來看,這就是實際的腳本,對吧。 這是腳本,開發者已經開發並 |
| 他或她將其推送到遠程存儲庫。 這個腳本的好處是,我只想快速指出一些功能。 |
| 例如,如果看看這個。 這是一個獨立的文本腳本,您不必分發 PowerPoint 文件或其他腳本 |
| 分別地。您要做的就是在腳本中鏈接它們,並且它們在此處的存儲庫中鏈接, |
| 包括 PowerPoint。 所以這個腳本將管理所有的分發。 因此,它會去抓取 PowerPoint。 |
| 如果需要的話,它會去獲取其他附加文件。 因此,所有內容都捆綁在一起到腳本中,因此它會為您完成所有管理。 讓我快速展示一下。 我會把這個拉回來 |
| 並將其設置為全屏 |
| 這樣你就可以看得清楚。 所以這將是自動觸發PowerPoint的演示 |
| 對於它的特定情況。 這個腳本的作用是,它從表中獲取路徑,這是一個包含大量圖像路徑的 JMP 表,這些路徑指的是這個特定的路徑 |
| 服務器,它將採用這些路徑,並且只會採用此處突出顯示的路徑,並將它們推送到 PowerPoint 中。 |
| 我將運行此腳本,如果您想嘗試一下,您可以使用此腳本。 這是一個功能齊全、有用的腳本。 所以,我正在運行這個 |
| 腳本在這裡。 同樣,它指的是存儲庫。 所以它沒有行腳本,它只是從存儲庫中提取它。 你運行它,它檢索代碼,運行對話。 |
| 我將簡單地運行這個。 我不會詳細介紹,一旦你運行它,它就會自動觸發 PowerPoint。 |
| PowerPoint 將啟動,然後它將...它正在開始...它正在此處構建幻燈片。 它將提取 20 張圖像,這將需要 10 或 20 秒,然後您將獲得 PowerPoint |
| 完畢。這就是您獲得的 PowerPoint,一切都是自動完成的,並且所有內容都是從存儲庫中提取的。 |
| 那麼下一步是什麼? 您將如何修改此 PowerPoint? 所以,我假設您想對模板進行一些更改。 和 |
| 您可以在附錄中看到更多詳細信息,但我想展示的是如何更改 |
| PowerPoint 中的腳本。 我會轉到全屏, |
| 我就運行這個。 我們從上一張幻燈片中剩下的開始,右,所以你有這些圖像。 |
| 我想做的是以一種簡單的方式更改模板,只是為了說明這一點。 所以你去... |
| 你轉到宏,向下滾動並找到你想要更改的內容,我將在這裡進行簡單的更改。 我將更改標題顏色只是為了表明一點,對吧。 所以你改變這個 |
| 和 |
| 保存。 這就是實時進行的。 |
| 您保存它並可以刪除幻燈片,以便它更快地到達存儲庫,因為您將把它推送到存儲庫。 |
| 然後使用 Git GUI 將其推出。 它將進入存儲庫 |
| 它將使其可供您的用戶使用。 因此您的所有用戶都將立即收到修改。 因此,您不必要求他們去更新 PowerPoint 或其他任何內容。 |
| 這只是去存儲庫。 |
| 我將切換回 JMP 並處於用戶模式,然後再次運行腳本,這將檢索新的 PowerPoint。 |
| 如果你再次運行它,它將通過 |
| 幻燈片,它將創建幻燈片。 您會注意到,您確實進行了更改,即更改標題行的顏色。 |
| 所以, |
| 我們還有什麼? |
| 腳本監控。 我認為這是我們開發的最好的功能之一,因為這使開發人員能夠查看是否 |
| 他們的劇本……他的,他的劇本是否受到讚賞。 正確的。 那麼運行了嗎? 有人定期運行嗎? |
| 這是好處之一。 另一個好處是關於 |
| log...崩潰日誌收集。 因此,如果腳本失敗,您可以使用 JMP 的日誌捕獲功能來捕獲故障。 因此,您將子例程夾在日誌捕獲中。 |
| 如果失敗...失敗...失敗的日誌將返回到此日誌返回文本中。 然後你所做的就是你 |
| 將其包含在嘗試中,以便腳本仍然可以進行報告。 |
| 然後你檢查它是否為空。 如果它是空的,則意味著根本沒有發生崩潰,因此您的腳本得以倖存。 |
| 但如果不是,如果它不為空,則意味著發生了崩潰,並且您將其控制住了。 您可以抓取日誌,現在可以報告它。 而實現的方法就是使用HTTP |
| 用戶 ID、腳本名稱和日誌註釋,是否崩潰... |
| 無論是崩潰還是只是常規運行,也許還有一些性能指標。 因此,底線是您可以將有關腳本的一些數據元數據傳輸回開發人員。 |
| 服務器要做的就是記錄它們,您將在服務器中存儲一組文件,並且可以監視它們。 我只是展示一個示例 |
| 表出這些。 這是一個崩潰日誌,其中有......其中有日期戳,它有一個腳本名稱,因此該腳本在該日期失敗 |
| 與這次特殊的崩潰。 因此這對於開發人員來說非常有用,因為他或她可以返回並解決問題。 所以我將折疊這個和這個,我將在這裡做一個快速演示,向您展示如何 |
| 你怎麼 |
| 包含崩潰以及如何向用戶報告它。 所以我在這裡要做的就是讓子程序崩潰。 我將創建一個未定義的參數 |
| JMP 會抱怨。 它會說這個東西沒有定義,所以腳本正在崩潰。 但我要做的就是調用該子程序 |
| 在日誌捕獲功能中,所有內容都會夾在嘗試下。 因此,儘管腳本因子例程而崩潰,但它總體上會倖存下來,並且能夠報告 |
| 崩潰報告。 那麼,您是否向用戶提供格式良好的通知並說出來。 因此,腳本因這個特定錯誤而崩潰,我們為其創建了一個日誌,並且正在處理它。 這就是您向他們...向用戶發出的通知。 |
| 因此,我在峰會上學到的一件重要的事情是關於自動化測試。 所以我過去常常手動進行測試,這非常令人沮喪。 |
| 因為這需要時間,而且您無法捕獲腳本的每個角落。 當你做一個小改變時,不可能進行幾個小時的測試。 |
| 所以我開始進入自動化測試,進行單元測試非常重要。 所以,你知道,測試是指對單個子程序的測試。 所以你有一個函數並且你想測試它 |
| 在將其放入整個系統之前多次,這樣您就可以進行這些單元測試 |
| 對於單個模塊,但這還不夠。 我可以向您展示幾個例子。 |
| 例如,美國宇航局因一次非常奇怪的事件而失去了火星氣候軌道飛行器……因為一個非常奇怪的錯誤,因為有兩個軟件團隊,一個在歐洲, |
| 一個在美國。其中之一是使用英鎊單位,是的,這是美國的單位,也是歐洲的單位 |
| 正在使用牛頓。 所以他們當然做了單元測試。 但當他們把代碼放在一起時,它不起作用,因為一個期望的是牛頓,另一個期望的是磅。 所以他們實際上失去了 |
| 軌道飛行器,只是因為他們忘記了從磅轉換為牛頓。 最近,作為 Starliner,波音公司丟失了他們的 Starliner,然後他們承認,如果他們這樣做的話,他們可能會發現這個錯誤 |
| 嚴格的集成測試。 歸根結底,重要的是 |
| 集成測試,因為模塊不是單獨存在於腳本中,而是一起對話。 |
| 這是這裡問題的一個有趣的說明。 所以你可以有兩個經過徹底測試的對象。 這是一扇窗戶,對吧,窗戶能出什麼問題嗎? |
| 但是,如果你將其中兩個放在一起,它們甚至無法打開,因此你必須進行一些集成測試,看看它們是否組合在一起,是否可以正常工作。 |
| 我想在這裡快速說明一下我是如何開始進行自動化測試的。 這將涉及一個特定的情況,即 |
| 公平地說,這是一個困難的情況,因為這將是對模式窗口的測試,除非您單擊按鈕,否則模式窗口不會消失。 所以你必須 |
| 創建一個單擊按鈕的 JMP 腳本,這有點模仿人類的行為,我在這裡所做的是將測試程序注入到 |
| 模式窗口在這裡。 我認為這種方法的好處是你仍然可以分發 |
| 這個東西,這個腳本給你的用戶,用戶甚至不會意識到其中實際上有一些測試例程。 |
| 所以它有測試儀的鉤子,但是當你單獨運行它時,它所做的就是尋找這個測試模式參數,但它沒有設置。 |
| 因此,如果未設置,腳本會將其設置為零,這將禁用表中的所有掛鉤。 因此,您可以將其提供給您的用戶,他們可以這樣運行它。 |
| 但是,如果您想測試腳本,您要做的就是在其之上構建測試器代碼。 因此測試器代碼會將測試模式設置為一,並且還將創建測試器...... |
| 您想要注入到腳本中的測試器對象。 例如,在這個特殊情況下,它所做的是選擇一個特定的列 |
| 然後它通過單擊按鈕將其分配給一個角色,然後運行腳本,對吧。 所以這實際上是在模仿人類的行為。 |
| 那麼它將加載實際的腳本。 所以它基本上是將這些參數注入到您想要測試的腳本中。 現在您正在自動運行腳本,因此它將加載腳本並運行它,並且在單擊此按鈕和該按鈕後它將關閉 UI。 |
| 然後您要做的就是在日誌捕獲功能中再次運行它,這樣您就知道如果出現問題,您將捕獲故障。 |
| 並且您還將它放入了輸入嘗試中,以便總體而言,腳本能夠倖存並報告日誌。 然後,如果沒有任何問題,您將返回空日誌,這意味著您的腳本沒有失敗。 |
| 如果出現問題,您將在日誌捕獲中知道。 這就是我們的想法。 |
| 所以, |
| 我們有 |
| 監視腳本的能力。 我們有能力 |
| 捕獲崩潰日誌。 所以我們想為什麼我們不根據崩潰日誌採取行動呢? 如果您看到崩潰日誌,這意味著出現了問題,並且腳本...用戶已經知道,因為腳本顯然崩潰了,並且開發人員知道腳本崩潰了,因為日誌是 |
| 存儲在服務器中。 因此,它們就在那裡供您採取行動。 但問題是,這還不是一個閉環,因為用戶不知道開發人員知道。 您可以通過創建自動票證來關閉該循環。 既然你已經有了信息,你就可以 |
| 使用錯誤跟踪軟件(例如 JIRA Atlassian),然後您可以使用 REST 功能 |
| 從服務器收集信息,創建票證,將其分配給開發人員,也可以將用戶分配為觀察者。 觀察者意味著每當開發者做任何事情時 |
| 有關錯誤的信息,並將該信息輸入到 JIRA 中,該信息將循環回用戶,以便他或她收到通知並知道有人正在處理該錯誤。 |
| 有多種方法可以做到這一點,具體取決於您所擁有的 JIRA 風格,我只是為您提供 |
| 基本代碼在這裡。 這是一個您可以創建的curl代碼,您可以從崩潰日誌中收集元數據,並將其嵌入到JSL文件中,然後它將通過REST傳輸並進入 |
| JIRA,它將為您進行跟踪。 然後 JIRA 會,如果你設置正確,JIRA 會通知它...JIRA 會通知開發人員,並且可能 |
| 腳本崩潰的用戶... 因此,這一切都是聯繫在一起的,開發人員會知道有一個錯誤需要他或她處理,用戶也會知道有人會處理該錯誤。 |
| 好的。 我想這讓我進入我的結束語。 您可以從本次演示中得到的只是要點。 |
| Git 一直是我們系統的基石,它使我們能夠實現許多不錯的功能,我什至沒有提到基本的功能, |
| 這是顯而易見的,因為這也給了你協作的能力。 因此,如果多個人正在編寫同一個腳本。 您可以使用該軟件的所有功能 |