11< h1 class ="code-line " data-line-start ="0 " data-line-end ="1 "> < a id ="cloud_based_pokemon_storage_system "> </ a > Cloud-Based Pokémon Storage System</ h1 >
2+ < br >
23< div class ="row ">
34 < div class ="col-md-3 col-sm-6 col-12 ">
45 < a href ="https://youtu.be/xZXUb8GOvZw " target ="_blank ">
@@ -87,12 +88,6 @@ <h3 class="code-line" data-line-start="49" data-line-end="50"><a id="clientside_
8788</ ul >
8889< br >
8990
90- < div style ="display: flex; flex-wrap: wrap; justify-content: space-between; ">
91- < img class ="article-inner-image " src ="static/img/personal_projects/pokemon_home/thumbnail_hd.jpg " alt ="Image 1 " style ="width: 48%; margin: 1%; ">
92- < img class ="article-inner-image " src ="static/img/personal_projects/pokemon_home/thumbnail2_hd.jpg " alt ="Image 2 " style ="width: 48%; margin: 1%; ">
93- </ div >
94- < br >
95-
9691< h2 class ="code-line " data-line-start ="94 " data-line-end ="95 "> < a id ="frontend_backend_development "> </ a > Frontend & Backend Development</ h2 >
9792< p class ="has-line-data " data-line-start ="96 " data-line-end ="97 ">
9893 For the frontend, I used a custom-built library, < strong > GBAMEM</ strong > , which tracks the running emulator, retrieves base pointers, and maps them to the game’s memory address. The library interacts with a cut-down version of my < strong > pokecrystal</ strong > wrapper to extract game data in a more user-friendly format, allowing me to convert memory data into JSON objects for seamless Pokémon uploads and downloads.
@@ -106,6 +101,91 @@ <h2 class="code-line" data-line-start="94" data-line-end="95"><a id="frontend_ba
106101< p class ="has-line-data " data-line-start ="102 " data-line-end ="103 "> I also experimented with shadow traffic techniques to monitor mirrored traffic behavior across different versions of the backend services.</ p >
107102< br >
108103
104+ < h3 class ="code-line " data-line-start ="64 " data-line-end ="65 "> < a id ="api_pokemon_data_exchange "> </ a > API Pokémon Data Exchange:</ h3 >
105+ < pre class ="col-md-12 "> < code class ="language-java "> curl --location 'https://odroid.pc:443/pokehome/pokemon/add' \
106+ --header 'Content-Type: application/json' \
107+ --header 'Authorization: Bearer < bearer _placeholder > ' \
108+ --data '{
109+ "id": 0,
110+ "nickname": "PORYGON2",
111+ "specieId": 233,
112+ "specie": "Porygon2",
113+ "gender": 0,
114+ "shiny": 0,
115+ "game": 1,
116+ "user": 1,
117+ "rawdata": "AC,69,B0,A1,79,C6,E4,02,89,E7,00,00,00,00,00,00,00,00,00,00,69,50,14,1E,0A,0A,46,00,C2,82,37,00,00,00,A5,00,A5,00,63,00,71,00,4C,00,78,00,6D,C7",
118+ "attack1Id": 105,
119+ "attack2Id": 176,
120+ "attack3Id": 161,
121+ "attack4Id": 121,
122+ "attack1": "Recover",
123+ "attack2": "Conversion2",
124+ "attack3": "Tri Attack",
125+ "attack4": "Egg Bomb",
126+ "hpIv": 0,
127+ "hpEv": 0,
128+ "attackIv": 6,
129+ "attackEv": 0,
130+ "defenseIv": 9,
131+ "defenseEv": 0,
132+ "specialAttackIv": 0,
133+ "specialAttackEv": 0,
134+ "specialDefenseIv": 0,
135+ "specialDefenseEv": 0,
136+ "speedIv": 5,
137+ "speedEv": 0,
138+ "ppUpAttack1": 0,
139+ "ppUpAttack2": 0,
140+ "ppUpAttack3": 0,
141+ "ppUpAttack4": 0,
142+ "itemId": 172,
143+ "item": "Up-Grade",
144+ "pokerus": 0,
145+ "hp": 165,
146+ "attack": 99,
147+ "defense": 113,
148+ "specialAttack": 120,
149+ "specialDefense": 109,
150+ "speed": 76,
151+ "trainerId": 50916,
152+ "trainerSid": 0,
153+ "trainerName": "PKHOME",
154+ "friendship": 70,
155+ "level": 55,
156+ "experience": 166375
157+ }'</ code > </ pre >
158+ < br >
159+
160+ < h3 class ="code-line " data-line-start ="64 " data-line-end ="65 "> < a id ="pokemon_db_insert "> </ a > RAW SQL Pokémon Insert:</ h3 >
161+ < pre class ="col-md-12 "> < code class ="language-sql "> INSERT INTO pokehome.pokemon (
162+ id, nickname, specie_id, gender, shiny,
163+ game, `user`, rawdata, attack1_id,
164+ attack2_id, attack3_id, attack4_id,
165+ hp_iv, hp_ev, attack_iv, attack_ev,
166+ defense_iv, defense_ev, special_attack_iv,
167+ special_attack_ev, special_defense_iv,
168+ special_defense_ev, speed_iv, speed_ev,
169+ pp_up_attack1, pp_up_attack2, pp_up_attack3,
170+ pp_up_attack4, item_id, pokerus,
171+ hp, attack, defense, special_attack,
172+ special_defense, speed, trainer_id,
173+ trainer_sid, trainer_name, friendship,
174+ `level`, experience, specie, item,
175+ attack1, attack2, attack3, attack4
176+ )
177+ VALUES
178+ (
179+ 719, 'HOUNDOOM', 229, 0, 0, 1, 1, 'E5,00,69,F2,5E,35,C6,E4,06,8A,CE,00,00,00,00,00,00,00,00,00,00,29,D9,14,0F,0A,0F,4B,00,C2,82,46,00,00,00,C2,00,C2,00,85,00,57,00,9C,00,AB,00,81',
180+ 105, 242, 94, 53, 0, 0, 2, 0, 9, 0, 9, 0,
181+ 9, 0, 13, 0, 0, 0, 0, 0, 0, 0, 194, 133, 87,
182+ 171, 129, 156, 50916, 0, 'PKHOME', 75,
183+ 70, 428750, 'Houndoom', '0', 'Recover',
184+ 'Crunch', 'Psychic', 'Flamethrower'
185+ );
186+ </ code > </ pre >
187+ < br >
188+
109189< h2 class ="code-line " data-line-start ="24 " data-line-end ="25 "> < a id ="project_backstory "> </ a > Backstory of the project</ h2 >
110190< p class ="has-line-data " data-line-start ="3 " data-line-end ="4 ">
111191 After a long workday, I often find that time is scarce. Between the gym, household tasks, and social activities, my spare time is limited. However, on occasion, I manage to carve out time for my hobbies. If I’m not too exhausted, I spend these moments researching, developing, or documenting personal projects.
@@ -134,7 +214,7 @@ <h3 class="code-line" data-line-start="64" data-line-end="65"><a id="hardware_in
134214 < li class ="has-line-data " data-line-start ="68 " data-line-end ="69 "> ARM Cortex A15 (Exynos 5422)</ li >
135215 < li class ="has-line-data " data-line-start ="69 " data-line-end ="70 "> 2GB RAM</ li >
136216 < li class ="has-line-data " data-line-start ="70 " data-line-end ="71 "> Public Network 1</ li >
137- < li class ="has-line-data " data-line-start ="71 " data-line-end ="73 "> Purpose: Skipper (load balancing)</ li >
217+ < li class ="has-line-data " data-line-start ="71 " data-line-end ="73 "> Purpose: Skipper (load balancing, routing, rate limiting... )</ li >
138218 </ ul >
139219 </ li >
140220 < br >
@@ -190,6 +270,17 @@ <h2 class="code-line" data-line-start="56" data-line-end="57"><a id="side_projec
190270</ ul >
191271< br >
192272
273+ < h2 class ="code-line " data-line-start ="56 " data-line-end ="57 "> < a id ="project_media "> </ a > Project Media</ h2 >
274+ < div style ="display: flex; flex-wrap: wrap; justify-content: space-between; ">
275+ < img class ="article-inner-image " src ="static/img/personal_projects/pokemon_home/home.jpg " alt ="Image 1 " style ="width: 48%; margin: 1%; ">
276+ < img class ="article-inner-image " src ="static/img/personal_projects/pokemon_home/box.jpg " alt ="Image 2 " style ="width: 48%; margin: 1%; ">
277+ < img class ="article-inner-image " src ="static/img/personal_projects/pokemon_home/team.jpg " alt ="Image 3 " style ="width: 48%; margin: 1%; ">
278+ < img class ="article-inner-image " src ="static/img/personal_projects/pokemon_home/gbamem_pokecrystal.png " alt ="Image 4 " style ="width: 48%; margin: 1%; ">
279+ < img class ="article-inner-image " src ="static/img/personal_projects/pokemon_home/thumbnail_hd.jpg " alt ="Image 1 " style ="width: 48%; margin: 1%; ">
280+ < img class ="article-inner-image " src ="static/img/personal_projects/pokemon_home/thumbnail2_hd.jpg " alt ="Image 2 " style ="width: 48%; margin: 1%; ">
281+ </ div >
282+ < br >
283+
193284< h2 class ="code-line " data-line-start ="104 " data-line-end ="105 "> < a id ="challentes_future_enhancements "> </ a > Challenges and Future Enhancements</ h2 >
194285< p class ="has-line-data " data-line-start ="106 " data-line-end ="107 ">
195286 I initially considered integrating < strong > Jenkins</ strong > for CI/CD, but my current self-managed in-micro cron jobs and scheduled routines proved more than enough for this project’s scope. In the future, I would like to explore integrating < strong > Jenkins</ strong > , < strong > Ansible</ strong > , or < strong > Puppet</ strong > to streamline deployment on some other larger scale hobby projects.
@@ -200,12 +291,4 @@ <h2 class="code-line" data-line-start="104" data-line-end="105"><a id="challente
200291< p class ="has-line-data " data-line-start ="110 " data-line-end ="111 ">
201292 This project, while rooted in nostalgia and personal interest, turned into an excellent opportunity to explore new technologies and practice each and every deployment step.
202293</ p >
203- < br > < br >
204-
205- < h2 class ="code-line " data-line-start ="56 " data-line-end ="57 "> < a id ="project_media "> </ a > Project Media</ h2 >
206- < div style ="display: flex; flex-wrap: wrap; justify-content: space-between; ">
207- < img class ="article-inner-image " src ="static/img/personal_projects/pokemon_home/home.jpg " alt ="Image 1 " style ="width: 48%; margin: 1%; ">
208- < img class ="article-inner-image " src ="static/img/personal_projects/pokemon_home/box.jpg " alt ="Image 2 " style ="width: 48%; margin: 1%; ">
209- < img class ="article-inner-image " src ="static/img/personal_projects/pokemon_home/team.jpg " alt ="Image 3 " style ="width: 48%; margin: 1%; ">
210- < img class ="article-inner-image " src ="static/img/personal_projects/pokemon_home/gbamem_pokecrystal.png " alt ="Image 4 " style ="width: 48%; margin: 1%; ">
211- </ div >
294+ < br > < br >
0 commit comments