--- tags: 程式研習社 --- # 程式社 108 下社課 地點:EC 9013 [TOC] ## 三月 ### 專案開發 3/10 > 到場參與人:B063040050、B063040059、B073040047、B073012044、B084030022、B084020042、B083011026、B072040051、B072040042、B063040013、B063040046 <font size="6" style="font-weight: bold;">中山校務通</font> > [name=房志剛]中山校務通 * 用爬蟲在顯示在手機上 * 爬蟲程式 * 協助瀏覽學校網頁 * HTTP Client端 * 版本 * 網頁 * 原生 (Native) * 跨平台重寫 * 原生架構 * 原生的語言 ex: JAVA, Obj.c * 原生程式碼 與元件溝通 * 元件(繪圖、事件)和硬體都由系統提供 * 不同的 Andriod 版本的系統提供的元件可能不同 * 跨平台 * 內嵌瀏覽器的架構(WebView) * ex: Cordova * JS (JavaScript) 寫繪圖和事件的部分 * 硬體由 JS 擔任橋接的程式碼,還是從原生程式碼去控制 * JS 映射 * ex: React-Native, Native Script * JS 擔任橋接的程式碼,元件、繪圖、事件都是系統的 * 硬體部份同 WebView,也是擔任橋接,主要是原生的 * 簡單來說,寫 JS,但底下都是原生的 * (台下補充:因為要 compile,檔案通常比原生的肥很多) * 自帶渲染引擎 * e.g. Flutter * Flutter 使用的程式語言是 Dart * 元件用引擎去渲染(EX: Flutter) * 硬體一樣是自身擔任橋接,主要都是用原生的 * Flutter * Mobile, Web, Desktop, Embedded * 主要還是以 Mobile 為主,其他的還不穩定 * 校務通架構 * 使用 Firebase Server * APP 主體是 Flutter * HTTP Server 用 Python 寫 API (Flask 框架) * 直接去爬校務網頁 * 校務通功能 * 中山只有課表、成績、基本資料 * 程式碼(介面)可以共用,不管是哪間學校的,基本上只差在爬蟲 * 功能加強(課表) * 已知問題 * 課堂會重疊 * 時間範圍有誤 * 課堂只顯示兩個字 * 可延伸功能 * 自訂課表 * RWD(響應式界面) * 上課提醒 * Firebase * 只想寫前端,不想寫後端可以用 * 資料分析 (Analysis) * 分析一些資料,EX 大家大多停留在哪一頁、使用者使用時間 * 雲端推播 (Clound Message) * 就...推播? * 崩潰分析 (Crashlytics) * APP 閃退問題 * 遠端設定檔 (Remote Config) * 部署 (Hosting) * 可以部署在不同平台 * 例如 Flutter 可以用在 Mobile 和 Web,就可以部署在這些地方(高科校務通有網頁版) * 中山不能寫網頁版,原因是 CORS 跨站請求(校務通直接對中山網頁發 request,官方目前無解,要解決只能自己寫一個爬蟲 server,變成請求自己的 server) * CORS (Cross-Origin Resource Sharing) * 怎麼加入 * 爬蟲 * 介面實作(Flutter + Dart) * [開源專案](https://github.com/abc873693/NSYSU-AP) * 介面設計(AI, PS, Ziplin) * 資料分析或行為分析(By Firebase) * 分析多少人使用,使用的人是什麼系...等 * 文件製作 * 功能測試 (內部測試) * 宣傳 * 如果要寫介面/爬蟲 * [安裝 Flutter SDK](https://flutter.dev/docs/get-started/install) * 學 Dart 基本語法 * [教學筆記](https://hackmd.io/@macs1207/rkLScjudE?type=view) * 爬蟲 * HTTP, Dio, XML * 找想爬的網站 * 介面 * [Widget catalog](https://flutter.dev/docs/development/ui/widgets), [Widget Livebook](https://flutter-widget.live/basics/introduction) * [Dartpad](https://dartpad.dev/) 類似線上的 IDE <font size="6" style="font-weight: bold;">實習經驗分享(找公司/履歷/面試)</font> > [name=Rice]實習經驗分享(找公司/履歷/面試) * Why實習? * $$ * 未來找工作方便 * 學新技術 * 了解業界在做什麼 * 吃好吃的 * 公司分類 * 新創 * 小型:人數少、容易倒、程式能力強 * 中型:為了擴大產品招收新血,可能有點亂? * 有一定能力,會教實習生怎麼做 * e.g. Dcard * 大型 * 傳統產業 * 小型倒光ㄌ QAQ * 中型 * 大型:做固定的事情 * e.g. 台GG * 外商 * 偏重 資料結構與演算法 * 中型 * 大型 * e.g. Google * 新創 vs. 傳產 * 新創偏重新技術,10年內的技術居多 * 傳產求穩定 * 找工作管道 * 104, Yourator, CakeResume, PTT, FB(最雜), Linkedin (外國人居多) * 徵才博覽會、就業博覽會 * 問朋友是否可以內推 * 找工作技巧 * 公司名稱沒有很加分一律選擇支薪 * 心態:是否能和公司一起合作、對公司是否有幫助 * 流程 * 寫履歷優先,再去尋找有興趣的職缺 * 面試先選擇不重要的公司,比較想要的公司放後面面試 * 上了也不會去的放在前面,最想去的放後面一點 * 以利於提升面試的表現 * ==~~拉麵店很缺工程師喔XD~~== * 寫履歷 * 外商要求全英文,也有中英都要 * 最好都投英文 * LaTeX template * 一頁簡歷,一頁自傳 * 履歷內容 * 基本資料、部落格、GitHub * 推薦要放 (放相關上去) * 工作經驗(選擇相關的放上去)、學歷、競賽、技能樹、專案、研討會 * 工作經驗的敘述,大概做了什麼、專案等等 * 履歷如果太空 * 投遞目標、個人期望 * 面試 * 電話/實體面試 * 履歷上的東西都要準備好,可能會被問或要求DEMO (建議帶筆電) * 白板題 (打聽該公司會怎麼面試,避免尷尬) * 自我介紹(必備),1 min,通常還沒講完就被打斷ㄌ QQ * 要問面試官什麼 * e.g. 經驗如何、可以學到什麼、問自己有關的問題 * 電話面試 * 詢問面試官是否可以晚點回撥 * 準備耳機、水 * 盡量找沒人的地方 * 實體面試 * 白板手寫 code (電話面試也有可能用 google doc) * 提早到要準備聊天內容 (監介) * 增進競爭力 * 多做 project,累積經驗 * 根據公司選擇放什麼 project > [name=楊志璿]一些發現、想法跟討論 >> [東京都 新型コロナウイルス感染症対策サイト](https://github.com/tokyo-metropolitan-gov/covid19) >> [口罩 2.0](https://github.com/PDIS/emask-static) >> [jserv 作業](https://hackmd.io/0SMjfYhATgKtSek67F6q_Q)、[quiz 延伸練習](https://hackmd.io/@sysprog/linux2020-quiz3) ### 程式競賽 3/24 ## 競賽常用 STL > 簽到 M084112012、B083040012、B063040059、B063040049、B063040050 * Template 什麼資料型態都可以裝 * 容器本身是一種資料結構,因此可以宣告成資料型態 * 相較於array,vector無須固定大小,因此非常好用 * vector 擴展性高 | 功能 | 含意 | | --------- | ------------------------------- | | v.begin() | 回傳第一個 iterator | | v.end() | 回傳最後一個之下一個的 iterator | ```C++= #include <iostream> using namespace std; int main(){ vector<int> v = {1,2,3}; vector<int>::iterator it = v.begin(); while(it != v.end()){ cout << *it << endl; it++; } return 0; } ``` * 萬能標頭檔 `#include <bits/stdc++>` includde C及C++常用的標頭檔 ==pair== * `#include <utility>` ```C++= #include <iostream> #include <utility> using namespace std; int main(){ pair <string, int> p; cin >> p.first >> p.second; p = {"Sophie", 18}; cout << p.first <<" "<< p.second; return 0; } ``` e.g. ```C++ vector< pair<int, string> > v(10); for(int i=0; i<10; i++){ cin >> v[i].second >> v[i].first; } v[0] < v[1]; // 先比較 first 元素,再比較 second 元素 ``` ==stack== 比喻堆書 ==queue== * `include <queue>` q.push() q.front() q.pop() q.empty() q.size() 迷宮問題:想像成淹水 ==priority_queue== `#include <queue>` 當作max-heap使用 由大到小印出 ```C++= #include <iostream> #include <queue> using namespace std; int main() priority_queue<int> pq; for(int i=0, x; i<5; i++){ cin >> x; pq.push(x); } while(!pq){ cout << pq.top() << endl; pq.pop(); } return 0; } ``` 由小到大輸出 ```C++= #include <iostream> #include <queue> using namespace std; int main() priority_queue<int> pq; for(int i=0, x; i<5; i++){ cin >> x; pq.push(-x); } while(!pq){ cout << -pq.top() << endl; pq.pop(); } return 0; } ``` 由小到大印出 ```C++= #include <iostream> #include <queue> using namespace std; int main() priority_queue<int, vector<int>, greater<int> > pq; for(int i=0, x; i<5; i++){ cin >> x; pq.push(x); } while(!pq){ cout << pq.top() << endl; pq.pop(); } return 0; } ``` ==set== | 常見函數名稱 | 解釋用途 | |:------------------------:|:---------------:| | s.insert(val) | | | s.find() | 元素是否有在set | | s.erase(iterator or val) | 移除元素 | | s.size() | 大小 | 使用時機 * 尋找比該數字還要大的第一個數字 ==map== ```C++ #include <iostream> #include <map> using namespace std; int main() map<string, int> m; for(int i=0, x; i<5; i++){ cin >> x; pq.push(x); } for(auto i=m.begin(); i != m.end(); i++){ cout << i->first <<" "<< i->second << endl; } // 或 for(auto i:m){...} 也行 return 0; } ``` #### Algorithm * `include <algorithm>` ![](https://i.imgur.com/1eu16gx.png) ![](https://i.imgur.com/tPFGJUr.png) ![](https://i.imgur.com/JBQ08M5.png) ![](https://i.imgur.com/aGiGdPV.png) ## 四月 ### 專案開發 4/14 > 因肺炎暫停 ### 程式競賽 4/28 > 因肺炎暫停 ## 五月 ### 專案開發 5/19 ***因本次課程延期後依然無人參與,故暫停乙次*** > 資料庫規劃簡介[name=Rice] > 網頁遊戲製作簡介[name=Rice] ### 程式競賽 6/02 ***因 CPE 遇上肺炎延期至 5/26 舉辦,故五月的程式競賽課程暫停乙次*** > 題目檢討[name=Rice]