發表文章

寫與思

 思考,寫作,與打字不同,透過手在紙上的揮霍是另一種程度的沉澱,是一種沉思人生,沉澱省思自我的方式,或許生活的型態會隨著科技與時間不斷的演進,但透過紙筆的思考永遠不會過時。

[c#]取得GA4 報表資訊

圖片
 近來由於「通用GA」要停止服務了,因此有將原來取「通用GA」報表改為取「GA4」報表的需求。不過現在官方好像還沒有一個[release]版本做使用,因此我採用[Beta]版本來實做此次功能的變更。 實做: 其實蠻簡單的,跟「通用GA」的寫法大致雷同,一樣是設定「Dimensions、Metrics、DateRanges」的方式來取得報表資料。 步驟一 Nuget 安裝「Google.Analytics.Data.V1Beta」 步驟二 建立與 服務帳戶 的連線 // Using a default constructor instructs the client to use the credentials // specified in GOOGLE_APPLICATION_CREDENTIALS environment variable. BetaAnalyticsDataClient client = new BetaAnalyticsDataClientBuilder { CredentialsPath = _GA4KeyPath//服務帳戶 金鑰 Json檔 }.Build(); 步驟三 建立 Request 資訊  // Initialize request argument(s) RunReportRequest request = new RunReportRequest() { Property = "properties/" + _propertyId,//GA4-PROPERTY-ID Dimensions = { new Dimension { Name = "date" }, }, Metrics = { new Metric { Name = "screenPageViews" } }, DateRanges = { new DateRange { StartDate = "2020-03-31", EndDate = "today" }, }, }; 步驟四 執行 查詢 報表 // Make the request var response = client.RunReport(req

通用GA 轉換為 GA4

圖片
「通用GA」據Google官方的消息是,只能用到2023/07/01的樣子,過了這個日期,「通用GA」將不再能夠蒐集資料,而原本的報表資訊,也只能再使用六個月。 因此不管願不願意,我們遲早要將「通用GA」改為新版的「GA4」來因應這次的變動。 實作: 其實要將「通用GA」轉為「GA4」蠻簡單的,就是建立「GA4」資源,並將原本script打的viewId改為「GA4」的ProertyId即可。 [步驟一  建立新的GA4資源]  先到 GoogleAnalytics ,原先的「通用GA」資源,點擊左下角的「齒輪按鈕」=>資源=>「Google Analytics(分析)4股定輔助程式」=>點擊「開始使用」。 [步驟二  將GA4的程式碼放入網站Layout] 其實這個步驟在「通用GA」已經做過了,我們只要在原本放gtag.js script的地方將「通用GA」的Id改成「GA4」的Id即可,或者保險一點將「GA4」產生的指令碼複製下來,取代原本放gtag.js script的地方。 在「GA4」資源,點擊左下角的「齒輪按鈕」=>資源=>「資料串流」=>點擊右方的大於符號=>點擊「查看代碼操作說明」=>「收動安裝」=>複製程式碼。 相關閱讀: 使用 Google Analytics「通用」 取得 report資訊

Excel SUM公式失效 顯示為0 (excel sum formula returns zero)

圖片
 情境: 這個issue的情況是,我們使用aspose取代範本內的一些參數,範本內有使用SUM()公式去計算某些欄位,不過神奇的事情發生了,用「office365」開啟產生的檔案,SUM()公式可以正常功能,顯示出家總的數字,可是如果用「excel 2013」開啟,SUM()公式欄位卻沒有任何變化,總是顯示為0。 這些欄位「數字存儲為文本」,且有開啟自動計算欄位,所以當下真的不知道到底發生了什麼,只知道不同版本的excel開啟檔案有不同結果。 猜測原因: 我覺得有可能是因為版本公式計算的載入時機不同導致了這個問題,有可能「excel 2013」公式計算是同步執行的,因為在SUM()的時候,需被程式取代為數字的欄位還未被執行,因此還是文本格式,導致公式失效。 而「office365」有可能是非同步執行,又或者「office365」在檔案載入後會自動再執行一次公式計算,因此可以正常運作。 解決方法: 再需被計算的欄位已被程式取代後,再做一次公式計算「 workbook.CalculateFormula() 」即可解決這個問題。

[C#]取得繼承介面的所有類別( get all the types that inherit from the given interface)

圖片
 問題: 近來在思考是否能取得繼承介面的所有類別,以方便往後做自動註冊使用。 情境: 我有一個interface[ITestInterfaceService],與繼承[ITestInterfaceService]的兩個類別[A]與[B]如下圖, 問題是該如何取得繼承介面的所有類別,也就是類別A與B。 實作: public static Type[] GetInheritedInterfaceTypes(Type interfaceType) { var types = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(s => s.GetTypes()) .Where(p => interfaceType.IsAssignableFrom(p) && !p.IsInterface).ToArray(); return types; }

[C#] @變數名稱 用意 (想以「保留字元」作為變數名)

圖片
問題: 最近在看專案的時候,發現很多變數名稱前面會加一個「@」,不知道是什麼用意。 解: 是因為如果想以(保留字元)作為變數名稱,變數名稱前面就必須加一個 「@」 才辦得到。 ex: 想以string 作為變數名稱會如(圖一)一樣無法成功定義變數名稱,但加一個 「@」 即可辦到如(圖二)。 圖一 圖二

[JavaScript]更版時客戶端瀏覽器有JS暫存檔導致錯誤

圖片
 問題: 在專案開發的時候,時常有可能會對某幾隻「js檔案」作修改,然而因為客戶端瀏覽器已有此支「js檔案」存在了,所以就算更版後也未能重新載入更新後的「js檔案」,需請使用者自行清除「瀏覽器暫存」或者案「ctrl+F5」重新載入資源。 然而讓使用者自行去作重新載入資源,感覺有些奇怪,我們應該要達到每次更版後,client端都可以重新載入資源才是正確的。 解決方法: 其實解決方法很簡單,就是在引用js參考的地方,加上版本號,即可讓瀏覽器判斷是否要重新載入新的「js檔案」。 *原本的寫法 < script src = "js\index.js" type = "text/javascript" > </ script > *修改後的寫法(?ver=修改日期) < script src = "js\index.js?ver=20220929" type = "text/javascript" > </ script >