[{"content":"從 2019 參加 ATCC 商業競賽後，其實我花了一年以上在反思整個參賽體驗，後來忙著忙著就也畢業開始工作了，一直到最近想寫些東西留下紀錄，才終於開始動筆寫出這篇文章。\n我整理了一些參加兩屆 ATCC 後想和大家分享的經驗，希望能夠幫到想參賽的讀者。\n這篇文章主要包含這些內容：\n正式參賽前的建議 參賽過程的建議 當初為什麼想參加商業競賽 正式參賽前的建議 1. 找隊員 首先，隊員最好能有不同的專長，至少要讓隊伍具備寫企劃、製作簡報、上台提報、和評審應答的能力，因為這些都是每個參賽環節需要的必備能力，而這些能力要準備到什麼程度才算及格，可以參考歷屆決賽隊伍的提報影片，讓自己對「能走到決賽的都是怎樣的隊伍」有個清晰的印象。\n歷屆的決賽提報影片可以從 ATCC 的官方 YouTube 找到。\n再來，隊員之間最好先有個共識，是否能一起投入整個競賽幾乎整個學期，如果要修系上有名的硬課，或是擔任社團活動的重要職務，這些都會加重自己在參賽過程的負擔，所以在決定是否參賽或招募其他隊員時，這些都要先審慎評估後，確定可以負擔再做出參賽的決定。\n2. 找指導老師 ATCC 的隊伍會需要有一個指導老師，可以找大學的教授，也可以找曾經參賽過的學長姊。如果在企劃發想的過程有隊伍之間無法決議的事項，或是大家已經卡在某個環節很久，無法進行下去，這時就可以請教指導老師。\n建議指導老師至少要能擔任評審的角色，能對企劃指出邏輯不通順的地方，並在隊伍發想過程卡住時適時地給予一些靈感。\n另外還有一個建議：找不怕麻煩的對象會更好。比如之前我們企劃逼近 deadline，卻還卡在發想的階段，開會偏偏又在晚上，好險跟指導老師夠熟，才有機會請他來幫忙指點。\n當然不是每個隊伍都能找的到這麼熱心的指導老師，所以至少要找可以幫忙審視企劃的指導老師，並在白天約時間請教。\n3. 選企業 ATCC 每年都會請不同的企業出題，每個隊伍在報名階段就要決定好這些企業的志願排序，看自己是進到哪個企業的組別下進行初賽和複賽，並在最後成為該企業的代表隊參與全國決賽。\n依據每個企業的提出的題目，隊伍在參賽過程要提出的企劃類型也會有些不同，也許是行銷企劃、活動企劃，又或者是產品企劃。\n這邊建議隊伍可以先挑喜歡的企業進行調查，並分析各個企業的題目屬於哪種企劃類型，接著再依照自己的專長、興趣去做企業排序上的規劃。\n另外，因為後續賽程相當緊湊，也建議隊伍可以在這個階段多收集企業題目相關的資訊，有助於在初賽階段就擬出企業喜歡的企劃。\n參賽過程的建議 1. 找到問題的切入點 從初賽到決賽，隊伍要不斷地翻修自己的企劃內容，以更符合競賽的命題。\n最核心的是企劃的「Insight」，你們發現了什麼，想透過這個企劃說些什麼事，而這又能如何滿足企業提出的需求。\n如果企劃目的一開始就定的好，要修改的幾乎就只有後續的實作規劃，反之，如果還沒找到企劃目的，那就要持續挖掘下去。\n2. 透過問「為什麼」來順好企劃的邏輯 如果問我寫企劃最需要注意的點是什麼，我會回答是「邏輯」。\n在整份企劃的 Insight 確定好之後，就要用邏輯把各個部分串起來。\n千萬要避免各個行銷規劃、行動內容看起來很精美，最後卻和企劃目的兜不起來的情況。\n一切的發想都要緊扣著企劃目的，提出行銷規劃、行動內容時，都要記得先反問自己「為什麼」，要不斷的思考：為什麼這樣的行動符合企劃目的、為什麼這個方案可以解決企業的問題。\n透過問「為什麼」，除了能確保整份企劃的邏輯通順以外，也能事先準備好應對評審未來可能提出的問題。\n在隊伍提報完企劃後，就會進到隊伍和評審的問答環節。隊伍進到這個階段前，應該盡量去猜評審會問哪些問題，並事先準備好應答的方式，所以在寫企劃的階段就可以嘗試換位思考，如果今天自己是評審，會針對企劃內容問哪些問題，透過這樣的方式做好「擬答」的準備。\n3. 用證據來支撐企劃內容 記得在 2019 參加賽前說明會時聽到有位講者分享下面這句話，我覺得這句話真的非常的重要。\n“Without data, you\u0026rsquo;re just another person with an opinion.”\n前面提到，在發想企劃內容的過程中，應該要持續地問自己「為什麼」，例如：為什麼要選擇這樣的目標客群、為什麼針對這個目標客群選擇這樣的行銷方案、為什麼你認為這樣的行銷方案會有效…\n要針對這麼多的「為什麼」來回答，只靠主觀的意見是來應答是不夠的，要拿出客觀的證據來說服評審。\n所以，在發想企劃的過程中，可以多用 Google 搜尋市場調查資訊，盡量去找公開、可被引用的證據，作為後續企劃發想的立足點。不過如果實在是找不到可引用的數據，也可以考慮自己製作問卷來調查，但設計問卷、進行調查的時間要估好，避免趕不上企劃繳交的期限。\n若要自行設計問卷，要注意問卷的信效度，避免使用誘導性問題，否則最後收集到的資訊是不可信的。\n4. 繳交企劃前的準備 寫完企劃後，可以從頭到尾再多讀幾遍，反覆檢查是否有錯字，或是邏輯沒串好的地方。\n不過，自己對企劃 debug 這件事建議在寫完企劃後隔一小段時間再進行，畢竟寫完企劃的當下可能會覺得努力產出的企劃完美無缺，要花點時間讓腦袋冷靜下來（可以先喝個飲料放鬆一下），等能夠把這個企劃當成別人的作品看待的時候再開始做這件事。\n最後，也別忘了可以找指導老師或業師進行擬答的練習。其實請第三者來幫忙審視企劃內容會是最直接、快速的方式，但這就要看指導老師或業師是否方便約時間，且在正式約時間練習提報和擬答前，隊伍內部應該先有充足的準備，這樣和指導老師或業師的模擬提報、問答練習才能發揮最大的功效。\n以上就是我對參加 ATCC 的一些建議了，希望讀到這裡的你能夠有所收穫。\n當初為什麼想參加商業競賽 其實很單純，就是我在大一學了寫企劃、做簡報，大二想找個舞台表現自己。\n當年會開始學企劃也是因為緣分，第一次接觸企劃是在學生組織，因為籌辦活動都要寫企劃來向學校申請經費或場地，所以學長姊有安排相關的培訓課程來讓大家學習，第二次接觸則是在企管系的行銷管理課，在期末作業完成了一份行銷企劃的撰寫與提報。然後在學校陸續也有看到一些企劃、簡報相關的短期課程可以參與，自己就在這些機會中慢慢培養起來了企劃、簡報、提報能力。\n學了這些技能後就想找更多的機會讓自己繼續成長，後續得知系上有學長姊在組隊參加 ATCC，就默默地把商業競賽這件事放在心裡，希望未來有機會也可以自己組隊參賽。\n後來在大二和大三，我分別以不同的身分參加了第 17th、18th 的 ATCC。\n第一年是我主動找夥伴組隊參賽，覺得自己很幸運，因為有了 Take a BREAK！ 的隊友們，我才有機會能夠走上全國決賽舞台。\n第二年則是因緣際會下擔任了隊伍指導老師的角色，不過我其實只指導這支隊伍到複賽前的階段，後續他們主要都是和業師溝通，最後也走到了全國決賽。\n後記 在大二參賽時，被緊湊的賽程追著跑讓我看見了很多自己的不足。第一次嘗試擔任領導者、第一次嘗試帶領會議的進行、第一次面對評審的問題，這些都讓經驗不足的我意識到還有很多進步的空間。\n後來在賽程中試著調適心情時，看了《蜘蛛人：新宇宙》這部電影，我可能永遠都會記得自己被其中一段對話激勵到的瞬間：\n“When will I know I’m ready?”\n“You won’t. It’s a leap of faith.”\n完賽多年後回頭再看，商業競賽的經歷真的讓自己成長了許多，其中累積的經驗與能力，在目前的工作上也依然相當受用，所以很感謝當年勇敢踏出那一步的自己。\n最後，這邊想提供幾篇推薦的文章。\n對於想認識更多其他商業競賽的讀者，可以參考下面這篇，是我當年在參賽前閱讀到的文章，至今仍覺得乾貨滿滿：\n商業競賽指南（賽事篇） 對於想了解商業競賽參賽細節的讀者，則非常推薦閱讀我的隊友沛淇寫的文章，可以看到我們參加 17th ATCC 商業競賽的一些過程：\n17th ATCC 競賽心得分享—一場不斷看清自己的旅程（上）\n17th ATCC 競賽心得分享—一場不斷看清自己的旅程（下）\n（完賽多年還是讓我看的非常感動，這段旅程大概真的刻在我的生命裡了吧）\n文章作者: Michael\n上次更新: 2023-11-30\n授權條款: 保留所有權利\n","permalink":"https://ballway.github.io/zh/posts/business/adivce-about-atcc-case-competition/","summary":"從 2019 參加 ATCC 商業競賽後，其實我花了一年以上在反思整個參賽體驗，後來忙著忙著就也畢業開始工作了，一直到最近想寫些東西留下紀錄，才終於開始動筆寫出這篇文章。我整理了一些參加兩屆 ATCC 後想和大家分享的經驗，希望能夠幫到想參賽的讀者。","title":"參加 ATCC 前，你可以先知道的那些事"},{"content":"因為有新建資料表，前陣子寫了不同資料庫的更新語法，以方便讓客戶升級，結果意外踩到 SQLite 的一個坑。\n原本自己都有測過新寫的語法能正常執行不出錯，以為這樣就算大功告成了， 結果同事在複測的時候，發現 SQLite 跑完升級語法後，系統新寫的時間相關功能會有點問題。\n查看 log 後發現是新資料表的 DATETIME 欄位出了問題，但我想說不對呀，我明明有在升級語法裡附上這個欄位，系統怎麼會沒有正確接收到呢？\n後來研究了一番才發現，因為我的 SQL 語法裡給的值是 1753-01-01。\n這個寫法在 MSSQL, MySQL 是可以被接受的，資料庫在執行語法時，會自動幫我加上時、分、秒，變成 1753-01-01 00:00:00。\n但 SQLite 不吃這一套，你寫 1753-01-01 就是 1753-01-01 進去，而且 SQLite 也不會說你的格式錯誤， 於是最後我調整了一下要填入的資料，把時間的值從 1753-01-01 改成 1753-01-01 00:00:00 就正常了。\n文章作者: Michael\n上次更新: 2023-12-11\n授權條款: 保留所有權利\n","permalink":"https://ballway.github.io/zh/posts/tech/sqlite-datetime-format-issue/","summary":"因為有新建資料表，前陣子寫了不同資料庫的更新語法，以方便讓客戶升級，結果意外踩到 SQLite 的一個坑","title":"SQLite DATETIME 格式問題"},{"content":"如果 App 有提供上傳圖片、上傳檔案的功能，可以做一些檔案相關的安全機制。\n白名單機制 可上傳的檔案格式應該要有個白名單來控管，有列出來的格式才可以被上傳， 例如：.png, .docx 檔才能被上傳，除此以外的格式都不接受 (不可以使用黑名單來管控，否則擋也擋不完)\n檔案格式檢查 而要檢查檔案格式是否符合白名單內所定義的格式， 除了檢查檔案的格式除了檢查副檔名 / Content-Type 以外， 也可以檢查檔案的 File Signature，來做到比較精確的檔案格式判斷\n通常會在檔案內容開頭的幾個 byte 會有一個特徵值，這個不同格式的檔案都會有屬於自己的特徵值， 這個特徵值就是 File Signature，也有人用 Magic Number 來稱呼這個特徵值\n網路上有人整理出不同檔案格式的 File Signature 列表， 也有人直接寫出了檢查 File Signature 的元件來供人使用\nFile Signature 整理表可參考：\nGCK\u0026rsquo;S FILE SIGNATURES TABLE 參考資料 DAY17 - 檔案處理 - 不只是副檔名檢查！真正的檢查檔案格式 圖檔上傳格式驗證 @ 鴨爸的隨手寫寫 Msdn 論壇 - 如何有效率判斷檔案格式? 文章作者: Michael\n上次更新: 2023-11-30\n授權條款: 保留所有權利\n","permalink":"https://ballway.github.io/zh/posts/tech/file-upload-security-mechanism/","summary":"如果 App 有提供上傳圖片、上傳檔案的功能，可以做一些檔案相關的安全機制","title":"檔案上傳安全機制"},{"content":"我們在 C# 會使用 try-catch 來做例外狀況的處理， 不過 try-catch 有幾個要注意的點：\n1. try-catch 不要吃案 在使用者的操作後，如果程式流程內有出現例外狀況而導致未能完成原本任務， 應該還是前端讓使用者知道發生了什麼錯誤，並把錯誤訊息 Log 下來，以方便後續的維護。\n2. 不要用 try-catch 來做流程控制 雖然 try-catch 能幫我們避免程式運作的中斷，但當有例外狀況被拋出時， App 內報 Exception 的動作是會耗掉不少效能的， 所以需要流程控制時，應該使用不會引發例外狀況的作法，例如： 需要字串轉數字，應該用 TryParse() 來做檢查和轉換，而不是用 try-catch 來包住 Parse()\n文章作者: Michael\n上次更新: 2023-12-12\n授權條款: 保留所有權利\n","permalink":"https://ballway.github.io/zh/posts/tech/about-csharp-try-catch/","summary":"C# 在 try-catch 的使用上有幾個要注意的點","title":"關於 C# try-catch 的注意事項"},{"content":"其實分層架構不一定是分成三層，是否再切更多層要視團隊而定。\n以我自己的開發經驗來說，開發上主要會分成這三層：\nPresentation Layer Service Layer Data Acces Layer 展示層 (Presentation Layer) 最接近使用者的一層，在接收使用者的請求後，會請服務層做處理，再將得到的結果展示給使用者。\n服務層 (Service Layer) 因為是處理商業邏輯的一層，所以又稱為商業邏輯層。 會請資料存取層處理資料，再把得到的結果交給展示層。\n資料存取層 (Data Acces Layer) 資料存取層的物件 (Data Access Object，簡稱 Dao) 是 Service 層用於取得資料的窗口，通常包含與資料庫連線、對資料來源操作 CRUD、OR-Mapping 等內部細節實作，並將取得的資料以 Domain Object 的形式提供給 Service 層調用。 而因為會把資料存至資料庫或檔案，進行長期保存，資料存取層又稱為持久層 (Persistence Layer)。\n各層傳遞的資料物件： Domain Object 是用於表示 DB Table 內單筆資料的資料物件\nDTO (Data Transfer Object) 是服務層和展示層之間溝通用的資料物件。\n1 2 DTO 規劃小技巧： 如果 Input (傳入服務層) 和 Output (傳到展示層) 用到的 DTO 欄位不重複時，使用 DTO 時應該就不會每次都把欄位填滿，這時可以分成兩個 DTO 來操作，如果能規劃成拿了這個 DTO 就是要把所有的欄位都填滿的情境，這樣在使用 DTO 的時候，比較不用去記哪些欄位這次要用到，哪些欄位則不用。 通常一個 DTO 會對應至少一個 Domain Object，並在服務層操作 Domain Object 和 DTO 物件的資料交換。\n文章作者: Michael\n上次更新: 2023-12-01\n授權條款: 保留所有權利\n","permalink":"https://ballway.github.io/zh/posts/tech/three-tier-architecture/","summary":"關於分層架構的說明","title":"三層式架構簡介"},{"content":"幫自己整理了一下關於 UTF-8 BOM 編碼格式的觀念：\n如果會在 SQL Script 裡寫到非英數字的內容 (註解或 insert)，UTF-8 編碼就可以派上用場 UTF-8 BOM 是比 UTF-8 多了一個標頭這樣，BOM 就是檔案會多一個標誌，讓文字編輯器一看就知道是 UTF-8 或 UTF-16 或 UTF-32 如果沒有 BOM，文字編輯器打開檔案要先掃描內容，來猜說這個檔案是什麼編碼，但猜的結果不一定正確，所以直接選 UTF-8-BOM 就不用擔心編輯器猜錯 文章作者: Michael\n上次更新: 2023-12-12\n授權條款: 保留所有權利\n","permalink":"https://ballway.github.io/zh/posts/tech/the-use-case-of-utf-8-bom/","summary":"幫自己整理了一下關於 UTF-8 BOM 編碼格式的觀念","title":"關於 UTF-8 BOM 的使用時機"},{"content":"左邊遇到 False 後，右邊就不會評估了\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 bool SecondOperand() { Console.WriteLine(\u0026#34;Second operand is evaluated.\u0026#34;); return true; } bool a = false \u0026amp;\u0026amp; SecondOperand(); Console.WriteLine(a); // Output: // False bool b = true \u0026amp;\u0026amp; SecondOperand(); Console.WriteLine(b); // Output: // Second operand is evaluated. // True 參考自官方文件的說明：\n布林值邏輯運算子：AND, OR, NOT, XOR 文章作者: Michael\n上次更新: 2023-12-12\n授權條款: 保留所有權利\n","permalink":"https://ballway.github.io/zh/posts/tech/csharp-boolean-logical-operators-and/","summary":"關於 C# 運算子 AND 的判斷順序：左邊遇到 False 後，右邊就不會評估了","title":"關於 C# 運算子 \u0026\u0026 的判斷順序"},{"content":"最近和 Mentor 討論功能的開發時，討論到了我再來要用「從上往下」，還是「從下往上」的開發順序，覺得滿有意思的，所以記錄下來。\n從上往下的意思是：從 UI 和功能開始構想，發現缺什麼功能就往下去補 Service、Dao、Domain。\n過去開始工作前，在寫小組專題時，我都是用這樣的模式去開發，因為我們是先畫 UI，再開始補功能，覺得從上往下開發比較直覺一點。\n但從上往下開發有個缺點，就是容易讓程式之間的耦合度比較高，也很難切單元測試，這點在我剛開始學習單元測試時也有體會到。\n相對來說，由下往上開發就是從 Domain、Dao 開始構想功能，如果已經有開發過類似的功能，已經有定義好 Interface 的話，開發時就比較不會有高耦合度的問題，因為已經切割過功能的規劃了。\n個人覺得一般的開發可能都會先經歷「從上往下」的開發，能實作達到需求後，再重構程式碼，變成是「從下往上」的開發，確保程式碼是更乾淨，更好維護的。\n當然如果一開始就能做到「從下往上」的開發的話，這樣應該是最好的，但思考起來會抽象許多，比較難做到。\n文章作者: Michael\n上次更新: 2023-12-07\n授權條款: 保留所有權利\n","permalink":"https://ballway.github.io/zh/posts/tech/about-development-process/","summary":"最近和 Mentor 討論功能的開發時，討論了要用「從上往下」，還是「從下往上」的開發順序，覺得滿有意思的，所以記錄下來","title":"開發流程：從上往下 vs. 從下往上"},{"content":"幫自己整理關於加密、雜湊、簽章的基本觀念：\n加解密 (Encrypt / Decrypt) 可還原 分成兩種模式 非對稱：加密和解密有兩種 Key Pulic：加密時 Key Private：解密時 Key 對稱：加密用的 Key = 解密用的 Key 對稱式加密的演算法：AES 128 以上 雜湊 (Hash) 不可還原(單向性)，硬要找 Hash 前的字串只能查表 (網路上有些人會整理 hash 前後的表格) 每次 Hash 的結果都會一樣，除非加料 (Salt) 有多種演算法，但比較容易碰撞 (Collide) 的已經停用了 md5 SHA1 SHA256 SHA512 簽章 (Signature) 用來驗證內容是否被篡改的一種方式，且通常是使用非對稱式的結構 簽章時使用私鑰（Private Key）對內容進行簽章，產生簽章值。 驗證時使用公鑰（Public Key）對內容和簽章值進行驗證，確保內容未被篡改。 文章作者: Michael\n上次更新: 2023-12-12\n授權條款: 保留所有權利\n","permalink":"https://ballway.github.io/zh/posts/tech/encryption-hash-signature-note/","summary":"幫自己整理關於加密、雜湊、簽章的基本觀念","title":"學習筆記：加解密、雜湊、簽章"},{"content":"平常都用 Airpods 2 的 Stereo 輸出來聽 Spotify 的音樂， 但開啟線上會議相關軟體的時候，發現輸出都會強制從 Stereo 被轉成 Hands-Free AG Audio。\n因為覺得 Hands-Free AG Audio 的音質很糟糕，想知道能不能讓 Airpods 連電腦的時候，同時有好音質又可以有麥克風功能。\nGoogle 後發現有人也有類似的問題，看起來應該是無解。\n參考資料： [問題] 藍芽耳機連接電腦問題 - 看板 Headphone - 批踢踢實業坊 RE:【問題】蘋果耳機連桌電問題 @電腦應用綜合討論 哈啦板 - 巴哈姆特 文章作者: Michael\n上次更新: 2023-12-11\n授權條款: 保留所有權利\n","permalink":"https://ballway.github.io/zh/posts/tech/my-airpods2-issue/","summary":"想知道能不能讓 Airpods 連電腦的時候，同時有好音質又可以有麥克風功能","title":"藍芽耳機連接電腦問題"}]