# Interview flow ## Ask to rate 0-10 1. JavaScript ES6 2. React 3. Vue 4. Angular 5. Typescript 6. HTML5 7. Git ## React Native code challenge 請寫一個APP顯示API回傳的資料。 API Server: http://167.99.171.123:8080 API spec: https://gitlab.com/yenchieh/device-data-receiver (README) 此網站需要有以下功能: 1. Works on Android and iOS 2. Search by ID 3. Sorting 語言條件: 1. 使用 React Native 2. 可以使用任何React Native CSS lib/framework 3. 盡量不安裝多於的Library, 只使用React Native需要的 4. 怎麼使用你的程式寫入README 以下為加分: 1. Unit testing 2. 良好的檔案和程式架構 3. Error handling 寫完後請上傳到你的Github上傳,然後傳給我們Link 謝謝 ## Frontend on-sight interview Typescript: https://playcode.io/631647/ Javascript: https://coderpad.io/PZFQ4TD2 ```javascript= <html> <head> <style> body { background-color: #1d2126; color: white; } </style> </head> <body> <div id="app"></div> </body> <!-- * 1. 了解程式碼,使用sensor class顯示資料 * 2. 寫完 removeRecordById * 3. Debug cleanup function --> <script> class Sensor { data = []; app = null; constructor() { this.app = document.getElementById('app'); } addRecord(location, motion) { this.data.push({ id: Math.floor(Math.random() * 1000 + 1), location: { lat: location.lat, long: location.long, }, motion: { x: motion.x, y: motion.y, z: motion.z, }, }); } get record() { return this.data; } get element() { var el = document.createElement('div'); this.data.forEach(d => { var inner = document.createElement('div'); inner.innerHTML = ` <span class="record"> <span class="name">ID: </span><span class="data">${d.id}</span> <span class="name">Lat: </span><span class="data">${d.location.lat}</span> <span class="name">Long: </span><span class="data">${d.location.long}</span> <span class="name">X: </span><span class="data">${d.motion.x}</span> <span class="name">Y: </span><span class="data">${d.motion.y}</span> <span class="name">Z: </span><span class="data">${d.motion.z}</span> </span> `; el.append(inner); }); return el; } mockData() { // Generate record for (let i = 0; i < 10; i++) { this.addRecord( { lat: Math.floor(Math.random() * 1000 + 1), long: Math.floor(Math.random() * 1000 + 1), }, { x: Math.floor(Math.random() * 10 + 1), y: Math.floor(Math.random() * 10 + 1), z: Math.floor(Math.random() * 10 + 1), } ); } } render() { this.app.innerHTML = ''; this.app.append(this.element); } removeRecordById(id) { console.log(`Trying to remove record: ${id}`); // TODO: You code here } } var s = new Sensor; s.mockData(); // Deleting data function cleanup() { // Run cleanup functions sequentially for (var i = 0; i <= s.record.length; i++) { try { s.removeRecordById(s.record[i].id); } catch (e) { console.error(e); } } } </script> </html> ``` ```typescript= interface SensorData { id: number; locale: Locale; motion: Motion; } interface Locale { lat: number; long: number; } interface Motion { x: number; y: number; z: number; } class Sensor { data: SensorData[] = []; $appEl: HTMLElement = null; constructor() { this.$appEl = document.getElementById('app'); } addRecord(locale: Locale, motion: Motion): void { const sensor: SensorData = { id: new Date().getTime(), locale, motion, } this.data.push(sensor); } removeRecord(id: number): void { console.log(`Trying to remove record: ${id}`); var index = this.data.findIndex(d => d.id === id); if (index !== -1) { this.data.splice(index, 1); } } get record(): SensorData[] { return this.data; } get element(): HTMLElement { const el = document.createElement('div'); this.data.forEach(d => { const inner = document.createElement('div'); inner.innerHTML = ` <span class="record"> <span class="name">Lat: </span><span class="data">${d.locale.lat}</span> <span class="name">Long: </span><span class="data">${d.locale.long}</span> <span class="name">X: </span><span class="data">${d.motion.x}</span> <span class="name">Y: </span><span class="data">${d.motion.y}</span> <span class="name">Z: </span><span class="data">${d.motion.z}</span> </span> `; el.append(inner); }); return el; } mockData(): void { // Generate record for (let i = 0; i < 10; i++) { this.addRecord( { lat: Math.floor(Math.random() * 1000 + 1), long: Math.floor(Math.random() * 1000 + 1), }, { x: Math.floor(Math.random() * 10 + 1), y: Math.floor(Math.random() * 10 + 1), z: Math.floor(Math.random() * 10 + 1), } ); } } render(): void { this.$appEl.innerHTML = ''; this.$appEl.append(this.element); } } // Deleting data function cleanup(): void { // Run cleanup functions sequentially for (var i = 0; i <= sensor.record.length; i++) { setTimeout(() => { try { sensor.removeRecord(sensor.record[i].id); sensor.render(); } catch (e) { console.error(e); } }, 1000); } } ``` 問題: 1. 上一分工作的工作內容 2. 使用的語言,lib, framework 3. 是怎麼學習Typescript, React 1. How to print out the results 2. Fix var -> let 3. Fix deleting undefined problem 4. Use Promise or async # Backend interview flow ## Golang code Challenge 請寫出一個API server. 此server能存取以下data: ``` type Data struct { ID string Location struct{ Lat float32 Long float32 } DateAdded time.Time } ``` 以下條件 1. 使用Go開發,不使用Framework (但可使用library, 像是database lib: sqlx) 2. 使用MySQL Database 3. 有二個endpoint - GET /data → 回傳所有database裡面的data - POST /data → 把上傳的data存入database 4. 怎麼使用你的程式寫入README 以下為加分: 1. 使用 Docker and/or Docker Compose 2. Unit testing 3. 良好的檔案和程式架構 面試考題: https://coderpad.io/4FQZW4RG Another test: ```go // To execute Go code, please declare a func main() in a package "main" package main import "fmt" func main() { fmt.Println(isBalanced("{{[[(())]]}}")) fmt.Println(isBalanced("{()()}")) fmt.Println(isBalanced("{[(])}")) fmt.Println(isBalanced("{{}(")) } func isBalanced(s string) bool { m := make(map[byte]byte) m['{'] = '}' m['('] = ')' m['['] = ']' if len(s) % 2 != 0 { return false } var a []byte for i := 0; i < len(s); i++ { if v, ok := m[s[i]]; ok { a = append(a, v) } else if len(a) > 0 { pop := a[len(a)-1] if pop != s[i] { return false } a = a[:len(a)-1] } else { return false } } return len(a) == 0 } ``` Long test: ```go /** * 1. 了解程式碼,創一個Device的變數,然後PrettyPrint * 2. 寫完 RemoveSensorDataByID * 3. 寫完 RemoveSensorDataByRange * 4. 加上Children, 把以上的FUNCTION寫完 */ package main import ( "fmt" "math/rand" ) type Device struct { MacID string SensorData []*SensorData Children []*Device } type SensorData struct { ID uint32 X int Y int Z int } func (d *Device) PrettyPrint() { fmt.Printf("\n↓↓Mac: %s↓↓\n", d.MacID) for _, s := range d.SensorData { fmt.Printf("ID: %d \n\tMotion: [%d|%d|%d]\n", s.ID, s.X, s.Y, s.Z) } } func (d *Device) RemoveSensorDataByID(id uint32) { // Implement remove data by id } func (d *Device) RemoveSensorDataByRange(start, end int) { // Implement remove sensor data by range } func main() { // Your code here } // Create 10 records func generateMocks() []*SensorData { var s []*SensorData for i := 0; i < 10; i++ { s = append(s, &SensorData{ ID: uint32(i), X: rand.Intn(100), Y: rand.Intn(100), Z: rand.Intn(100), }) } return s } ```