# 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>

<code class="green">Mobile</code>

<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

<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)


<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


<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>
)
}
```