About me
Education
2023 -
University of California, San Diego - B.S. Computer Science
2023 - 2023
Cornell University
online certificate in Machine Learning Foundations
2021 - 2023
University of California, Riverside - B.S. Computer Science
Chancellor's Honor List(2022-2023), Dean's Honor List(2021-2023)
Experience
June 2024 - September 2024
Software Development Engineer Intern - Amazon
January 2024 - April 2024
Machine Learning Engineer Competitor (Spring Studio) - Google
September 2023 - December 2023
Machine Learning Engineer Competitor (AI Studio) - Amazon
June 2023 - September 2023
Cloud Software Developer Intern - HP
November 2022 - April 2023
Software Developer Intern - Engineering for Good, UC Riverside
August 2022 - October 2022
Above and Beyond Computer Science Fellow - Meta
July 2022 - September 2022
Web Developer - Association for Computing Machinery @ UC Riverside
My Skills
-
C++
-
Java
-
HTML
-
CSS
-
Javascript
-
React
-
Python
-
Git
-
Django
My PortfolioMy Work
My Education
Courses
June 2023 - August 2023
Machine Learning Foundations - Cornell University
May 2023
Data Structures and Performance - UC San Diego, Coursera
April 2023
Object Oriented Programming in Java - UC San Diego, Coursera
January 2023 - March 2023
CS141 Intermediate Data Structures and Algorithms - UC Riverside
2023
December 2022 - January 2023
Elements of AI: Building AI - University of Helsinki
September 2022 - April 2023
Intro to Quantum Computing - Qubit by Qubit; The Coding School
September 2022 - December 2022
CS111 Discrete Structures - UC Riverside
September 2022 - December 2022
CS120A Logic Design - UC Riverside
September 2022 - October 2022
Elements of AI: Intro to AI - University of Helsinki
July 2022 - September 2022
CS50's Introduction to Computer Science - Harvard University
May 2022 - July 2022
Intermediate Software Engineering - Codepath
March 2022 - June 2022
CS100 Software Construction - UC Riverside
March 2022 - June 2022
CS61 Machine Organization and Assembly Language Programming - UC Riverside
March 2022 - June 2022
CS11 Intro to Discrete Structures - UC Riverside
January 2022 - March 2022
CS10C Intro to Data Structures and Algorithms - UC Riverside
2022
September 2021 - December 2021
CS10B Introduction to Computer Science for Science, Mathematics, and Engineering II - UC Riverside
June 2021 - August 2021
CS1C Intro to Computer Science in C++ III - Saddleback College
January 2021 - April 2021
Java Programming I - University of Helsinki
2021
June 2020 - August 2020
CIMN200 Intro to Networking - Saddleback College
2020
June 2019 - August 2019
CS1B Intro to Computer Science in C++ II - Saddleback College
2019
June 2018 - August 2018
CS1A Intro to Computer Science in C++ I - Saddleback College
2018
Certifications
Contact MeContact
Lake Forest, California
samuelyjlin@outlook.com
Serendipity DatabaseC++
About
This was a project I wrote in the summer of 2019, after taking a community college on C++(CS1B at Saddleback College). At the time, I was new to pointers and arrays, so struggled with the concept of building a polished program with them. In 2021, after finishing high school, and in preparation for college, I rewrote the program from scratch, this time finishing it, more effectively and efficiently, after finally grasping the concept of pointers.
Project Overview
This terminal-based program provides the functionalities of a cash register. Additionally, it maintains a database of books, with the ability to modify items. Users are presented with a menu and can input an option to navigate to other menus. Book entries are loaded into the database from a txt file upon execution. When the program exits, an updated database will be stored into the same txt file. The database of book entries are stored in a double pointer, which stores an array of pointers. From the main menu, users have 4 options:
- Cashier Module: Simulates purchasing a book, quantity of purchased books are reflected in the database
- Inventory Database Module: Modify the database
- Report Module: Lists all books in the current database, has different listing filters
- Exit: Quit the program, program will continue to run and display menus until this option is chosen
Cashier Module
Upon entering the cashier module, users are prompted to enter the following fields:
- Date: Today's date
- Quantity of Book: quantity to be purchased(this value will be subtracted from current quantity)
- ISBN: ISBN of book to be purchased
- Title: Title of book to be purchased, doesn't have to be full title
- Price: Retail price of book to be purchased
However, if the book isn't found in the database, an error message will result, and user will be shown the main menu again. If the user enters 'n' to adding another book, the receipt will be displayed. Otherwise, entering 'y' will result in the program prompting for book info again. The receipt gives an overview of the books purchased and the final price(including a calculated tax). The "Confirm purchase?" prompt will display a thank-you message alongside updating the quantity values in the database if 'y' is entered. Entering 'n' will proceed to print the next "Enter another transaction" prompt without a thank-you message nor updating quantity values. The "Enter another transactions" prompt will either lead back to the prompting of book info, or display the main menu again.
Inventory Module
Upon choosing the inventory module, users are presented with 5 options:
- Look up a book: search for a book in the database, if book is found its info will be displayed
- Add a book: Add a book entry to the database
- Edit a book's record: search for and edit existing entry
- Delete a book: search for and delete existing entry
- Return to main menu: goes back to the main menu
Searching for a book
When the user chooses the search option, the program prompts for an input: either the ISBN, book title, publisher or author. All matching results will be printed one at a time until the user picks a desired match, or no more matchs are found(in which case a message will be printed and the naviation will return to the inventory module menu). Assuming we choose the second match when searching "Hobbit", then its info will be displayed, and the program won't proceed until the user presses enter.Adding a book
To add a book to the database, the current database size has to be less than value of the constant DB_SIZE, which is currently set to 125. If the current size is at 125, then an error message will appear, indicating that the database is full. However, in the case that our database has space, a menu will appear with values of the new item that the user can change. The pending values on the right will update as values are changed. An important note to remember is that the new book won't be added until the user chooses option 9 and saves it to the database. If the user types in information, but chooses option 0 before option 9, then no new book is added.Editing an existing book
Choosing the edit option calls the search function from earlier, along with displaying the maximum database size and the current size. Matched entries will continue displaying until all matches are printed out or the user enters 'y'. Once an entry is chosen, the info of the entry will be displayed, like in the search function from before. A prompt asks the user to confirm their choice. After confirming the entry is the book to be edited, the menu from add book function is shown, and users can change the value of the entry as they wish.Deleting a book
The delete function is extremely similar to the edit function, in that the search function is first called, and upon choosing an entry, its info will be displayed, along with a final confirmation. Once the book is deleted, the user will be prompted whether they want to delete another entry.Report Module
The reports module allows users to list out all book entries in the current database, and can be filtered with a few options. There are six different report variations and seven total options:
- Inventory listing: lists all info for each entry
- Inventory wholesale Value: Displays title, isbn, quantity and wholesale cost of entries; shows total wholesale cost of all entries at the end
- Inventory Retail Value: Displays title, isbn, quantity and retail cost of entries; shows total retail cost of all entries at the end
- Listing by Quantity: Displays title, isbn and quantity; filters entries by quantity from highest to lowest
- Listing by Cost: Displays title, isbn and wholesale cost; filters entries by wholesame cost from highest to lowest
- Listing by Age: Displays title, isbn, quantity and date added; filters entries by date added from oldest to newest
- Return to Main Menu: Returns navigation back to the main menu
Chinese ChessC++
About
This was a program I wrote, alongside three other classmates, for the final project of CS100("Software Construction", at UCR). In this project, we built a terminal-based Chinese Chess game, using the strategy design pattern, in which the correct move() function is called, depending on which piece resides at the chosen coordinates.
Project Overview
Starting Menu
This terminal-based program allows users to play Chinese Chess directly from the command line,
with the board graphics represented through ASCII characters. Upon starting the program,
users are presented with three options.
The three options are as follows:
- Start new game: allows users to start playing a new game, in which all pieces are present and loaded into the default starting positions.
- Load saved game: allows users to continue playing a previously saved game, where pieces and coordinates are loaded in from a local .txt file.
- Quit: quits the program
Game Menu
Once the user chooses to either start a new game or continue a saved game, the chessboard will be displayed, along with an index and a user prompt. The initial prompt asks for the coordinates of the piece they wish to move. An appropriate error message will be displayed for the following cases:
- Invalid coordinates: the x-value must be in range [1, 9]; the y-value must be in range [1, 10]
- Empty spot: an empty spot is chosen; there's no piece to move
- Wrong color: a piece of the wrong color is chosen; i.e. player red chooses a black piece to move
- Invalid coordinates: the x-value must be in range [1, 9]; the y-value must be in range [1, 10]
- Invalid move: the target coordinate doesn't follow the rules of Chinese Chess; similar to regular Chess, each piece has a specific set of allowed moves
- Wrong color: a target piece of the wrong color is chosen; i.e. player red chooses a red piece to move to(attempting to capture their own piece)
- General: can move one spot vertical or horizontally; however, they must stay within the palace on their respective side of the board(x-values in range [4, 6] and y-values in range [1, 3](for black general)/[8, 10] (for red general))
- Advisor: Similar to the general, they must stay inside the palace; they can move one spot diagonally
- Elephant: Can move 2 spots diagonally, but they cannot cross the river (strip of blank spaces between y-values 5 and 6)
- Horse: Move one spot horizontally/vertically, and then one spot diagonally outwards; they cannot jump over occupied spaces
- Chariot: Similar to the rook in Chess, chariots can move any number of spaces horizontally or vertically
- Pow/Cannon: They move like the chariot; however, when capturing, there has to be a piece(either opponent or own piece works) in between
- Soldier: Can only move one spot forward, until they cross the river; once they cross the river, they can move either horizontally or forwards, but they cannot move backwards
Assume the user attempts to move the soldier piece at (9, 7) backwards, to (9, 8). Recall that this is an illegal move, as soldier cannot move backwards. An error message will be displayed. Choosing valid coordinates for both prompts results the piece being moved to the new location. If the new location contains an opponents piece, that piece will be captured and removed from the chessboard. Here, the user moves the soldier piece from (9, 7) to (9, 6). After each player's turn, the "current turn" display at the top of the screen will be updated. The game ends when one of the player's general piece is captured. Assume the current game looks like so: Then, the player black can move their chariot at (6, 2) to capture the red general at (6, 9). A message with the winning team will then be displayed. If either user chooses to quit in the middle of the game, by entering "0", they'll be prompted to save the game. Choosing "y" will save the coordinates of all pieces on the board to a local .txt file. The user can then continue this saved game by choosing the "Load saved game" option in the opening menu.
Shape ParserC++
About
I wrote this program alongside 5 other classmates, for the final project of CS1C at Saddleback Community College, over the summer of 2021. Using the Qt graphics framework, we created a shape parser, which allows users to draw, move and remove shapes on the canvas.
Project Overview
Starting Menu
Using Qt frameworks to create a GUI, this shape parser program reads in shape attributes from a local .txt file.
This info is stored into a vector of pointers, and outputted to the canvas. Each shape is labelled
with a unique shape ID. Upon opening the program, all the buttons for drawing, moving and removing shapes are greyed out.
By default, the user isn't logged in, so doesn't have admin permissions to edit the shapes.
Logging In
Clicking the "Login" button in the bottom right corner brings up a prompt for the username and password. The correct account info that's stored in the program is "admin" for the username and "password" for the password(very original, I know :D). For security reasons, the user input for the password box is dotted out. Once these credentials are entered, the buttons to edit shapes will become available for the user to select.
Drawing New Shapes
When you add a shape, a prompt for the shape ID will pop up. To draw a new shape, a unique ID between 1 and 50 is entered. If a shape ID that already exists is entered, an error message will indicate this, and close the editing popup. Each shape has a different set of dimensions, so have varying prompts, depending on the shape chosen:
- Line: consists of two (x, y) points
- x-coordinate and y-coordinate for first point
- x-coordinate and y-coordinate for second point
- Polyline: similar to line, but consists of N number of (x, y) points
- Number N points to draw
- x-coordinate and y-coordinate for the Nth point
- Polygon: similar to polyline; however, the shape is closed and filled in
- Number N points to draw
- x-coordinate and y-coordinate for the Nth point
- Rectangle:
- x-coordinate of the top left corner
- y-coordinate of the top left corner
- width
- height
- Square: same as rectangle, but the last 2 dimensions(width, height) are the same
- x-coordinate of the top left corner
- y-coordinate of the top left corner
- edge length(height = width)
- Ellipse:
- x-coordinate of the center
- y-coordinate of the center
- semi-major axis
- semi-minor axis
- Circle: same as ellipse, but both axis are the same length
- x-coordinate of the center
- y-coordinate of the center
- radius
- Text: invisible rectangle containing text
- x-coordinate of the top-left corner of container rectangle
- y-coordinate of the top-left corner of container rectangle
- width of container rectangle
- height of container rectangle
For example, after entering the dimensions for a new rectangle with shape ID 9, it's drawn onto the canvas, with the other shapes drawn using shape info read from the .txt file.
Editing Shapes
When moving existing shapes, their respective prompts will pop up, similar to the process of adding new shapes.
The only difference is that the shape ID prompt will check that the ID inputted exists, in case the user attempts
to move a shape that hasn't been drawn.
The process for removing shapes is much simpler. The only prompt will be for the shape ID. Once a valid ID is inputted,
the corresponding shape will be deleted from the canvas.
As an example, we'll remove the polygon with shape ID 3:
Testimonials
The user also has the ability to leave a testimonial for the shape parser program, through the "Make a testimonial!" button. Upon choosing this, a window for text input for a name and testimonial pops up. Once submitted, the testimonial is stored in a local .txt file.
Contact Info
Lastly, there's a button for the (fictitious) contact info of the program developer.
Earthquake MapJava
About
This is my capstone project for UCSD's Coursera course "Object Oriented Programming in Java". It's been a while since I last programmed in Java(as courses are mainly taught in C++ at UCR). In preparation for my upcoming internship for summer 2023, which has Java listed in its position description, I took this course to brush up on my Java skills. If I recall correctly, the last time I used Java extensively was when I took University of Helsinki's course "Java Programming I" back in 2021, about two years ago! Suffice to say, I was a bit rusty in Java!
Project Overview
Map Overview
This project uses the Processing and UnfoldingMaps libraries to display a window with an interactive map and map legend. The map can be zoomed in/out(using mouse scroll wheel or -/+ keys) and panned(using click+drag or arrow keys), and displays markers for earthquakes(both land and ocean quakes), cities and airports. The earthquake data is extracted from USGS's website. Meanwhile, the city and airport data are parsed in through a local .json file. The color of an earthquake marker depends on its magnitude, and its shape is determined on whether it occured on land or water. It's a bit hard to see the various different type of markers(due to the overwhelming number of airport markers). However, if we zoom in, we can get a better look: Here, we can see how there's a city marker for Tokyo. There's a few shallow land quake markers scattered around(indicated by the yellow circles). Note how the land quake near Chiba is marked with a cross, indicating that it occured within the past hour.
Hovering over Markers
Hovering the mouse over a marker displays its relevant info.
For a city, its name, country and population are displayed:
For an earthquake, its magnitude, direction city and country are displayed:
Finally, for an airport, its name, airport code, city and country are displayed.
Clicking on Markers
Clicking on markers allows us to further interact with the map.
Each earthquake has a radius called the threat circle, in which any location in this circle will be impacted by this quake. When we click on a quake marker, all other quakes are hidden, and only cities and airports that are affected
by this quake will remain displayed. For example, let's play around with this quake marker in Mexico:
If we click on this marker, notice how airports and cities farther from this quake are hidden, as they're outside the threat circle. Additionally, all other quakes are hidden.
Clicking on airports and cities yield similar results to each other. Clicking on an airport will hide all other airports and only display quakes that affects it. Meanwhile, clicking on a city hides all other cities and shows only quakes
that impact it. Let's click on this city in Venezuela:
Note how upon clicking it, all other cities, as well as quakes that don't affect this city, disappear:
Text EditorJava
About
This is my capstone project for UCSD's Coursera course "Data Structures and Performance". In this project, I integrated data structures into a text editor app, which includes spelling suggestions and autocompletion. I feel like this project gave a really nice refresher on applications of fundamental data structures. I look forward to taking UCSD's next course on intermediate data structures!
Project Overview
Text Editor Overview
Upon opening the app, a blank input box is presented, alongside several
buttons on the right, which allows interacting with the text.
Checkbox options near the bottom allow for spelling suggestions and autocompletion.
Here's a brief list of main data structures used to implement the features:
- Markov Generation: uses list of nodes; each node stores list of "next words"
- Spelling: uses BST and dictionary to check valid spelling/if a word exists
- Autocomplete: uses trie to compute closely related words
- Edit Distance: uses tree to compute number of edits
Button Actions
The "Load Text" button prompts for a local file to import, and whether to append or replace
the text in the input box.
The "Flesch Index" will calculate the value known as the Flesch Index, which
provides an estimation on the reading level of the text. Higher scores correspond to
an easier reading level, while lower scores are higher levels. Read more
at its Wikipedia article.
Here, we have some sample text already in the input box; clicking the "Flesch Index" button
will display a value at the bottom lefthand corner.
In the case that there's no text in the input box, an appropriate error is displayed.
The "Edit Distance" button allows us to find how many "single chararcter edits"
(insert, delete, replace) it takes to edit word 1 to word 2.
For example, if we try "hello" as word 1 and "goodbye" as word 2, we'll get the following:
The "Generate Markov Text" button allows us to generate text using
a Markov Chain, which
predicts text based on the patterns of existing text.
A window pops up, and prompts for the number of words to generate.
The text will then be generated and displayed in the window, using text from the input box.
Spelling Suggestions
Checking the "Spelling Suggestions" option enables the text editor to highlight any word that is spelled incorrectly.
Autocompletion
Checking the "AutoComplete" option enables the text editor to suggest words, while the user types.