# YueYing's Portfolio <style> code.blue { color: #337AB7 !important; } code.orange { color: #F7A004 !important; } code.green { color: #4b8e8d !important; } </style> --- ## Who am I? Favourite IDE - VSCode :heart: Experience - Frontend :computer: - Swift - React Native - Java - HTML/CSS - C - Backend :back: - PHP(Laravel/Lumen) - SQL - DeepTech :tada: - Python - Linux - Docker Working on :construction_worker: - Data mining school project on stock prediction :chart: - Deep learning RNN for human body action recognition Open to opportunities in: :speaker: - Data Analytics - BlockChain - Frontend/Backend --- # Project Showcase ## 1) Freelance -Backend :back: Worked on APIs to serve both web and flutter :bird: applications. Tech Stack:book: : PHP, Firebase, SQL <code class="green">Web</code> ![](https://i.imgur.com/0FVrRRy.png) <code class="green">Mobile</code> ![](https://i.imgur.com/xlmMMTq.jpg) <code class="blue">Code Snippets</code> ``` php public function secondAuthentication(Request $request, UserSessionsService $sessionsService, UserService $userService){ $serviceAccount = ServiceAccount::fromJsonFile(__DIR__.'/google-service-account.json'); $firebase = (new Factory) ->withServiceAccount($serviceAccount) ->create(); $idTokenString = $request->verification_id; try{ $verifiedIdToken = $firebase->getAuth()->verifyIdToken($idTokenString); //logout of firebase after the user has successfully login $uid = $verifiedIdToken->getClaim('sub'); $firebase->getAuth()->revokeRefreshTokens($uid); //check for valid userSession $session = UserSessions::where('users_userId',$request->user_id)->first(); $message = Array("message" => ""); if(!$session){ $message["message"] = "Requires login first"; return response()->json(['error' => $message],Response::HTTP_UNAUTHORIZED); } $user = UserService::getUserByUserID($request->user_id); //obtain JWT for userSession $jwt = $this->jwt($user, $sessionsService); $session->update(['JWT' => $jwt]); $data = Array("token"=>"","default_password"=>"","user"=>Array()); if($session->updatePassword == 0){ $data["default_password"] = false; } else{ $data["default_password"] = true; } $data["token"] = $jwt; $data["user"] = Array("user_id" => $user->userID, "full_name" => $user->fullName, "user_name" => $user->userName, "phone_number" => $user->phoneNumber, "numberOfConfirmedBookingCancellation"=> $user->numberOfCancellations); return response()->json([ 'data' =>$data, ], Response::HTTP_OK); } catch(InvalidToken $e){ $message["message"] = "User not authenticated"; return response()->json(['error' => $message], Response::HTTP_NOT_FOUND); } } ``` ## 2) Frontend developer Intern - Actxa Worked on iOS application which works hand in hand with company's smart weighing scale and fitness tracker ![](https://i.imgur.com/QLheec5.jpg) <code class="blue">Testimonial</code> > To Whom It May Concern: It is with great pleasure that I write this recommendation for Ooi Yue Ying. Yue Ying has demonstrated herself to be highly responsible, passionate and a fast-learner. She is able to work independently and is also a fantastic team player. I first met Yue Ying when she did her Summer internship with Actxa Pte Ltd in June 2019. She got the opportunity to contribute to the iOS development team and help with new feature implementation and production bug fixes for Actxa App that is currently deployed in the app store. Yue Ying clearly demonstrated herself to be highly driven and hard working. Her ability to handle stressful situation well is demonstrated during her time as an intern at Actxa, where she was tasked to pick up a new language, study new code base and start working on new tasks in a short period of time. She would talk with her seniors and co-workers to acquire and make clear of any doubts she had which sped up her learning process. She asked interesting and in-depth questions about the industry just to learn as much as possible. She took through notes from sharing and recorded her learning in her journey. Yue Ying clearly demonstrated her sense of responsibility as a Software Engineer where she approaches every task with great enthusiasm and effort. During the internship, she was given various tasks like refactoring code using new library and implementing new features for SDK. Yue Ying was also able to quickly understand the requirements and successfully accomplished her assigned tasks to specifications. With her support, I am able to go live the Actxa App with a tensed schedule. I am thus convinced that Yue Ying will prove herself to be a valuable player as a Software Engineer in any company. Thank You, Jack Le iOS Tech Lead (Actxa) anhvu.le291291@gmail.com ## 3) University Project - Child Care Finder Application Tech stack: Firebase, Python(Django) ![](https://i.imgur.com/gHdn05w.jpg) ![](https://i.imgur.com/YddMcNs.png) <code class="blue">Code Snippets</code> ```python def explore_grid(request): context = { 'list_names': list_of_centre_names, } # pprint(context) return render(request, 'explore_grid.html', context) def subsidy(request): return render(request, 'subsidy.html', {'list_names': list_of_centre_names}) def search(request): centre_name = request.GET.get('centre_name') address = centre_name.split('@')[-1] # Retrieve the particular of the centre using the centre address centres_ref = db.collection('centres') query = centres_ref.where('centre_address', '==', address).get() # Obtain centre code centre_code = None for doc in query: centre_code = doc.to_dict()['centre_code'] # Redirect to the details page if centre_code == None: return render(request, '404.html', None) return redirect('details', centre_code=centre_code) ``` ## 4) University Project - Algorithms for robot Worked in JAVA to create a path finding algorithms to navigate physical robot around the maze. JAVA code runs on PC and uses WIFI connection to a rasberry pi to communicate with the robot. <code class="blue">Code Snippets</code> ```java public Robot(int row, int col, boolean realBot) { posRow = row; posCol = col; robotDir = RobotConstants.START_DIR; speed = RobotConstants.SPEED; this.realBot = realBot; SRFrontLeft = new Sensor(RobotConstants.SENSOR_SHORT_RANGE_L, RobotConstants.SENSOR_SHORT_RANGE_H, this.posRow + 1, this.posCol - 1, this.robotDir, "SRFL"); SRFrontCenter = new Sensor(RobotConstants.SENSOR_SHORT_RANGE_L, RobotConstants.SENSOR_SHORT_RANGE_H, this.posRow + 1, this.posCol, this.robotDir, "SRFC"); SRFrontRight = new Sensor(RobotConstants.SENSOR_SHORT_RANGE_L, RobotConstants.SENSOR_SHORT_RANGE_H, this.posRow + 1, this.posCol + 1, this.robotDir, "SRFR"); SRLeft = new Sensor(RobotConstants.SENSOR_SHORT_RANGE_L, RobotConstants.SENSOR_SHORT_RANGE_H, this.posRow + 1, this.posCol - 1, findNewDirection(MOVEMENT.LEFT), "SRL"); SRRight = new Sensor(RobotConstants.SENSOR_SHORT_RANGE_L, RobotConstants.SENSOR_SHORT_RANGE_H, this.posRow + 1, this.posCol + 1, findNewDirection(MOVEMENT.RIGHT), "SRR"); LRLeft = new Sensor(RobotConstants.SENSOR_LONG_RANGE_L, RobotConstants.SENSOR_LONG_RANGE_H, this.posRow, this.posCol - 1, findNewDirection(MOVEMENT.LEFT), "LRL"); } ``` ```java private void explorationLoop(int r, int c) { do { nextMove(); //every move check area explored areaExplored = calculateAreaExplored(); System.out.println("Area explored: " + areaExplored); // if robot back to starting position of exploration loop //start to check for unexplored if (bot.getRobotPosRow() == r && bot.getRobotPosCol() == c) { //unexplored logic timesUp = false; //handle unexplored, those cell in the middle List<Cell> unexploredCells = getUnexploredCell(exploredMap); //loop through all unexplored cell //Checking unexplored cell System.out.println("The unexplored cells are : "); for(int i=0; i<unexploredCells.size();i++) { System.out.println("(" + unexploredCells.get(i).getRow() + "," + unexploredCells.get(i).getCol() + ")") ; } for(int i=0;i<unexploredCells.size();i++) { if(unexploredCells.get(i).getIsExplored()) { continue; } //get adj cell of the unexplored cell List<Cell> adjacentCells = getAdjacentCell(unexploredCells.get(i), exploredMap); System.out.println("The adjacent cells are : "); for(int j=0 ; j<adjacentCells.size(); j++){ System.out.println("(" + adjacentCells.get(j).getRow() + "," + adjacentCells.get(j).getCol() + ")") ; } if(!adjacentCells.isEmpty()) { //loop through all adjacent cells of the unexplored cells and try and find path for(int j=0 ;j<adjacentCells.size();j++) { //try and find from bot current position to unexplored cell FastestPathAlgo goToGoal = new FastestPathAlgo(exploredMap, bot, realMap); if(System.currentTimeMillis() <= endTime) { if(goToGoal.runFastestPath(adjacentCells.get(j).getRow(), adjacentCells.get(j).getCol()) != null) { areaExplored = calculateAreaExplored(); System.out.println("Area explored: " + areaExplored); break; } } else{ timesUp = true; break; } } } if( timesUp == true){ break; } } if (areaExplored >=100){ break; } } System.out.println("Current time now : " + System.currentTimeMillis()); } while (areaExplored <= coverageLimit && System.currentTimeMillis() <= endTime); System.out.println("CAMEEOUTT"); goHome(); System.out.println("Exploration complete!"); areaExplored = calculateAreaExplored(); System.out.printf("%.2f%% Coverage", (areaExplored / 300.0) * 100.0); System.out.println(", " + areaExplored + " Cells"); System.out.println((System.currentTimeMillis() - startTime) / 1000 + " Seconds"); } ``` ## 5) University Project - reactNative attendance taking application ![](https://i.imgur.com/SYgAO64.jpg) ![](https://i.imgur.com/mKtKoWV.jpg) <code class="blue">Code Snippets</code> ``` react export default GroupScreen = props => { const { navigation } = props const [attendanceList, setAttendance] = useState() const [courseCodeNumber, setCourseCodeNumber] = useState() const [groupNumber, setGroupNumber] = useState() useEffect(() => { let arr = upperCaseArray(navigation.state.params.name) let endPointURL = `/getGroupAttendance/${arr[0]}${arr[1]}` fetchData( 'http://ec2-3-15-165-103.us-east-2.compute.amazonaws.com/api', endPointURL ).then(result => { result.sort((a, b) => { return a.matricNo > b.matricNo }) setAttendance(result) let arr2 = arr[0] arr2 = arr2.split('/') let arr3 = arr[1].split('/') setCourseCodeNumber(arr2[0]) setGroupNumber(arr3[0]) }) }, []) return ( <ScrollView style={styles.container}> <Text style={styles.greetings}> Course Code: {courseCodeNumber} {'\n'} Group Number: {groupNumber} </Text> <Collapse> <CollapseHeader> <Separator bordered style={styles.cardContainer}> <Text style={styles.collectionName}> 4 September 2019</Text> </Separator> </CollapseHeader> <CollapseBody> {attendanceList && ( <FlatList style={styles.flatliststyle} data={attendanceList} renderItem={({ item }) => ( <ToggleButton value={item.status == 'Present'} data={item} courseCode={courseCodeNumber} /> )} keyExtractor={item => item.matricNo} /> )} </CollapseBody> </Collapse> <Collapse> <CollapseHeader> <Separator bordered style={styles.cardContainer}> <Text style={styles.collectionName}> 3 September 2019</Text> </Separator> </CollapseHeader> <CollapseBody> {attendanceList && ( <FlatList style={styles.flatliststyle} data={attendanceList} renderItem={({ item }) => ( <ToggleButton value={item.status != 'Present'} data={item} courseCode={courseCodeNumber} /> )} keyExtractor={item => item.matricNo} /> )} </CollapseBody> </Collapse> </ScrollView> ) } ```