分類
YouTrack

[YouTrack] 在 Windows 上安裝啟動 YouTrack

Situation

需要一個 Bug Track System 來追蹤 Bug

Action

找了一下現有的 Bug Track System ,在安裝上都相當麻煩,跑不掉安裝資料庫或依賴一些框架。
剛好最近在玩 JetBrains 的 Dotultimate,他們家也推出一款 YouTrack,除了提供 Bug Track System 也有 knowledge base , Scrum Dashboard等等功能,但缺點是免費版只提供10個用戶。
1.下載 YouTrack.jar
JetBrains 下載 YouTrack.jar,注意這邊下載的是Standalone jar檔
2.啟動 YouTrack.jar
開啟終端機移動到Step 1.下載的檔案目錄並輸入以下指令

java -jar youtrack-xxx.jar 127.0.0.1:8081

Note: 8081是因為我的8080已經讓Jenkins佔用了,所以換8081(相關的指令請參考官網)
3.設定YouTrack
3-1. Setup or Upgrade 畫面,請選擇 Setup
3-2. Http or Https 畫面,下方還有一些Base URL,Port,Language,請依照需求選擇
3-3. Configure Hub Service 畫面,請選擇Use Built-In Hub,並填寫下方的Create Admin Login,Create Admin Password,Repeat Password
3-4. Confirm License 畫面(免費版只有10個帳號),請直接點擊 Finish
3-5.等待大概5分鐘,中間會有提示。
3-6. 完成安裝,進入登入畫面

Result

完成下載安裝設定之後,就有YouTrack 可以玩囉。不過缺點是免費版只能有10個使用者。

分類
Jenkins

[Jenkins] 在 Windows 上安裝 Jenkins

Situation

為了建置 CI/CD,需要在本機上安裝 Jenkins

Action

詳細步驟可參考官網連結,以下紀錄在Windows上安裝Jenkins步驟
1.首先確認硬體是否符合以下規格(盡量符合Recommended)

Minimum hardware requirements:
256 MB of RAM
1 GB of drive space (although 10 GB is a recommended minimum if running Jenkins as a Docker container)
Recommended hardware configuration for a small team:
4 GB+ of RAM
50 GB+ of drive space

2.若無安裝Java 請安裝 Java 8
(官網有說明Jenkins不支援太高的Java版本)

Java 8 runtime environments are supported in both 32-bit and 64-bit versions
Java 11 runtime environments are supported Java 11 Docker installation instructions are included in "Downloading and running Jenkins in Docker" See the Java 8 to Java 11 upgrade guidelines for additional upgrade instructions
Java 7 and prior are not supported
Java 9 and 10 are not supported
Java 12, 13, 14, 15, and 16 are not supported

2-1.下載並安裝JDK 8
Oracle官網下載 (需要Oracle帳號)或參考以下連結下載並安裝Java 8
Java 8 Windows x64
Java 8 Windows x86

安裝完成後開啟終端機輸入 java -version,出現以下內容就OK

java version "1.8.0_301"
Java(TM) SE Runtime Environment (build 1.8.0_301-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode)

3.下載並安裝 Jenkins
https://www.jenkins.io/download/ 下載想使用的安裝檔
我這邊是直接下載 .war 檔(Generic Java Package),這種方式不用另外安裝其他依賴套件,比較方便。但缺點是無法特別設定config
4.啟動 Jenkins
開啟終端機移動到放置 jenkins.war(Step 3.下載的檔案)的目錄,輸入以下指令啟動 Jenkins

java -jar jenkins.war

在終端機中最後應該可以看到 jenkins running message

...
2021-07-21 03:03:34.024+0000 [id=37] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization
2021-07-21 03:03:34.042+0000 [id=22] INFO hudson.WebAppMain$3#run: Jenkins is fully up and running

5.設定Jenkins
開啟瀏覽器輸入 http://localhost:8080
出現 Unlock Jenkins 畫面,該畫面是第一次啟動Jenkins出現的,畫面中間有個initialAdminPassword 路徑,開啟該檔案,複製檔案中的隨機文字內容並貼到 Unlock Jenkins的下方 Administrator password,點擊 Continue。
6.安裝Jenkins套件
進入安裝套件畫面,選擇”安裝推薦的套件”,就會開始安裝套件大概需要10分鐘。
也可以不必現在安裝,之後到Jenkins後臺管理畫面也可以安裝。
7.設定 Jenkins Administrator 帳密
按照畫面輸入user name , password , email等等相關資訊
8.設定 Jenkins server URL
主要是看8080 port 是否已經使用,有的話就換另一個吧。之後也可以在Jenkins後臺管理另外設定。
9.完成!

Result

完成Action之後就可以開始使用 Jenkins。

分類
ASP.NET

[ASP.NET] 使用 Visual Studio 2019 編輯網頁(沒有sln檔)

Situation

需要修改網頁(http://www.somewhere.com)且已知該網頁對應的網路空間(\\192.168.1.1\websitefolder),其網路空間看起來也有對應的Source Code,如.html , web.config等等,但沒有.sln 等等的解決方案檔。

Action

首先使用編輯器修改 index.html檔並觀察網頁是否出現對應的修改內容,結果網頁確實發生預期的改變。
開啟 VS2019 -> 不使用程式碼繼續 -> 在主畫面選擇”檔案” -> 開啟 -> 網站 -> 左方選擇檔案系統 -> 下方的資料夾填入對應的網路空間路徑(\\192.168.1.1\websitefolder)
VS2019 便可讀取該路徑內的所有檔案

Result

透過上方的Action便可使用 VS2019 編輯網頁 Source Code,可以一邊開啟網頁一邊確認編輯內容是否正確。
離開前VS2019會詢問是否儲存.sln檔。若選是,該.sln 便會儲存在本機端,之後只要點擊.sln檔便可直接編輯網頁內容。
關於版控的部分,可以直接使用檔案總管開啟對應的網路空間(\\192.168.1.1\websitefolder),接著右鍵點擊該目錄 -> git bash -> 可直接在該目錄使用 git 指令(有時候command line 反應會比較慢,不過基本上是沒問題的)
 

分類
Flutter

[Flutter][建置環境] Android Studio Dir or Android SDK not found

Situation

先安裝 Flutter 但還未安裝 Android Studio,輸入 flutter doctor 就會出現 android studio dir not found

Action

1.先下載安裝Android Studio
2.Android Studio安裝完成後,輸入 flutter doctor,若還是出現找不到Android Studio Dir,請輸入以下指令清空 config 內容

flutter config --android-studio-dir=""
flutter config --android-sdk=""

最後再輸入 flutter doctor 讓flutter自動偵測 android studio dir 及 android sdk 路徑

Result

問題解決,Issue不再出現。
記得不用手動設定 Android Studio Dir 及 Android SDK,只要清除掉再讓Flutter自動尋找即可。
 

分類
Flutter

[Flutter][建置環境] JVM not found…

Situation

執行 flutter doctor 後回應”找不到 JVM” (沒有截圖)

Action

1.到以下頁面(需oracle帳號)找 macOS x64 連結,下載並安裝 JDK 8
https://www.oracle.com/tw/java/technologies/javase/javase-jdk8-downloads.html
2.安裝完成 JDK8 後,再輸入 flutter doctor

Result

問題解決,已找到JVM
 

Note

基本上安裝完成即可,無需特別設定 JAVA_HOME

分類
Flutter

[Flutter][建置環境] Android licenses status unknow. NoClassDefFoundError …XmlSchema

Situation

先前已輸入過 flutter doctor –android-licenses 並一路按Y完成後。
再次執行 flutter doctor 發生以下錯誤

 
 
若再重新輸入 flutter doctor –android-licenses 會出現以下畫面

 
 
 

Action

1.開啟Android Studio的SDK Manager -> 左側選擇 Android SDK -> SDK Tools -> 勾選 Android Command-Line Tools(Latest)
 
2.重新輸入 flutter doctor

Result

問題解決,Situation 的 Issue 不再出現。
安裝 Flutter 和 Android Studio 的順序最好是先安裝 Android Studio 再裝 Flutter,否則 Flutter 在偵測相關環境參數時會發生找不到的情況又必須重新處理環境參數問題。

分類
Interview

[面試] S.A.R (Situation, Action, Result)

這是最近從”提升程式設計師的面試力 – 189道面試題目與解答, 6/e (修訂版)“看到的一種用於“回答問題”的方式。

S.A.R 提供一種簡單的結構來幫助回答問題,讓說的人有條理,聽的人有道理(後面這段是我加的)

S.A.R 是 Situation(情況),Action(行為),Result(結果) 的縮寫,從”遇到甚麼情況“開始描述,接著是”做了什麼行為“,最後是”獲得什麼結果
除了用來回答問題,我覺得用來描述事件也是簡單好用
比方說

Situation : 我昨天下班踩到狗屎
Action : 我趕緊去買了樂透
Result : 我還是沒中頭獎

當然啦,面試的時候你應該不會這樣回答面試官。
書裡提到你應該多多強調你的優勢或想說明的部分,聰明的面試官也會從中擷取或回問他想知道的內容。
比方說

Situation : 之前公司開發過地圖編輯器,效率低落,開啟關閉檔案就需要1~5分鐘
Action : 我在編輯器中處理效率熱點並加入多執行緒來處理IO
Result : 編輯器開啟關閉檔案時間從原本1~5分鐘縮短到5~10秒

如此一來,面試官就知道你對於多執行緒略懂略懂,也可以對地圖編輯器部分提出問題。
另外在描述的部分最好能夠提出具體數據或行為,除了可以強調內容,感覺起來也有憑有據。
不過千萬別唬人,有經驗的面試官很容易從一問一答中看破馬腳。小心為上呀!

分類
ASP.NET

[ASP.NET] 判斷使用者IP為內網或外網

Situation

需要判斷使用者的IP 為內網或外網。

Action

使用者 IP 可以透過 Request.UserHostAddress 取得
“判斷內外網邏輯” 首先從重用性考慮,該邏輯之後可以在其他專案或模組重複使用,看起來應該提取到新類別中,如下

public class NetworkManager
{
    public enum NetType
    {
        INTERNET, INTRANET
    }
    public static NetType CheckIntranetOrInternet(string targetIP)
    {
        string[] targetIPSections = targetIP.Split('.');
        /// IP地址中,有三段地址專門用於私網的規劃,不能被用於網際網路上的連線如下
        /// Class A:10.0.0.0-10.255.255.255
        if (targetIPSections[0] == "10") {
            return NetType.INTRANET;
        }
        /// Class B:172.16.0.0-172.31.255.255
        if (targetIPSections[0] == "172")
        {
            int targetIPSecondSection = Convert.ToInt16(targetIPSections[1]);
            if (targetIPSecondSection >= 16 && targetIPSecondSection <= 31)
            {
                return NetType.INTRANET;
            }
        }
        /// Class C:192.168.0.0-192.168.255.255
        if (targetIPSections[0] == "192" && targetIPSections[1] == "168")
        {
            return NetType.INTRANET;
        }
        return NetType.INTERNET;
    }
}

CheckIntranetOrInternet 方法的參數型態其實有兩個選項為 Request 或 string,因為我習慣寫單元測試來覆蓋邏輯,string 會是比較好的選擇。
另一個為列舉,因為CheckIntranetOrInternet 方法的回傳值為內網或外網。
很多人會使用常數但我通常使用列舉來取代常數,特別是列舉可以清楚的規範且說明本身的意義

Result

這邊使用單元測試來測試邏輯,注意這邊並沒有覆蓋到所有邏輯。

[TestMethod]
public void CheckIntranetOrInternet_CheckInternet()
{
    Assert.AreEqual(NetworkManager.NetType.INTERNET, NetworkManager.CheckIntranetOrInternet("9.0.0.0"));
    Assert.AreEqual(NetworkManager.NetType.INTERNET, NetworkManager.CheckIntranetOrInternet("11.0.0.0"));
    Assert.AreEqual(NetworkManager.NetType.INTERNET, NetworkManager.CheckIntranetOrInternet("172.15.0.0"));
    Assert.AreEqual(NetworkManager.NetType.INTERNET, NetworkManager.CheckIntranetOrInternet("172.32.255.255"));
    Assert.AreEqual(NetworkManager.NetType.INTERNET, NetworkManager.CheckIntranetOrInternet("192.167.0.0"));
    Assert.AreEqual(NetworkManager.NetType.INTERNET, NetworkManager.CheckIntranetOrInternet("192.169.255.255"));
}
[TestMethod]
public void CheckIntranetOrInternet_CheckIntranet()
{
    Assert.AreEqual(NetworkManager.NetType.INTRANET, NetworkManager.CheckIntranetOrInternet("10.0.0.0"));
    Assert.AreEqual(NetworkManager.NetType.INTRANET, NetworkManager.CheckIntranetOrInternet("10.255.255.255"));
    Assert.AreEqual(NetworkManager.NetType.INTRANET, NetworkManager.CheckIntranetOrInternet("172.16.0.0"));
    Assert.AreEqual(NetworkManager.NetType.INTRANET, NetworkManager.CheckIntranetOrInternet("172.31.255.255"));
    Assert.AreEqual(NetworkManager.NetType.INTRANET, NetworkManager.CheckIntranetOrInternet("192.168.0.0"));
    Assert.AreEqual(NetworkManager.NetType.INTRANET, NetworkManager.CheckIntranetOrInternet("192.168.255.255"));
}

 

分類
React Native

[React Native] unknown argument type '__attribute__' in method

Situation

透過 Terminal 執行 React Native IOS版本時出現死亡紅幕,
執行指令為

npx react-native run-ios --device "device phone name"

死亡紅幕內容如下

Unknown argument type '__attribute__' in method -[RCTUIManager setJSResponder:blockNativeResponder:]

or

Unknown argument type '__attribute__' in method -[RCTAppState getCurrentAppState:error:]
...

Action

遇到相同問題的人還不少,找到以下這篇(https://stackoverflow.com/questions/58051510/xcode-11-0-build-get-error-unknown-argument-type-attribute-in-method-r)
作法就是修改 /專案目錄/node_modules/react-native/React/Base/RCTModuleMethod.mm 的 RCTParseUnused 方法,改為以下內容

static BOOL RCTParseUnused(const char **input)
{
  return RCTReadString(input, "__attribute__((unused))") ||
           RCTReadString(input, "__attribute__((__unused__))") ||
           RCTReadString(input, "__unused");
}

重點要記得最好把原本的 app 刪除,重新使用 terminal 執行
npx react-native run-ios –device “device phone name” 來安裝並執行,App才會顯示正常。

Result

該錯誤訊息和死亡紅幕不再出現,App 正常運作。
 

分類
React Native

[React Native] gflag.h not found

1.開啟終端機移動到 專案目錄/node_modules/react-native/thrid-party/glog-0.3.4
2.接著在該目錄中執行 ../../scripts/ios-configure-glog.sh