From 25dc6e69c6e6b07580a831720ee6c7b8d5a3ba57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Kaan=20G=C3=BCm=C3=BC=C5=9F?= Date: Fri, 14 Feb 2025 04:54:08 +0300 Subject: [PATCH] feat: :sparkles: main page, projects, posts --- .gitignore | 12 ++ Cargo.toml | 27 ++++ Dioxus.toml | 43 +++++++ assets/favicon.ico | Bin 0 -> 15406 bytes assets/header.svg | 20 +++ assets/main.css | 198 ++++++++++++++++++++++++++++ src/home.rs | 45 +++++++ src/lib.rs | 53 ++++++++ src/main.rs | 19 +++ src/posts.rs | 34 +++++ src/projects.rs | 313 +++++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 764 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 Dioxus.toml create mode 100644 assets/favicon.ico create mode 100644 assets/header.svg create mode 100644 assets/main.css create mode 100644 src/home.rs create mode 100644 src/lib.rs create mode 100644 src/main.rs create mode 100644 src/posts.rs create mode 100644 src/projects.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..481c50a --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +/dist/ +/static/ +/.dioxus/ +.vscode/ + +# These are backup files generated by rustfmt +**/*.rs.bk + +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..dddda30 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "personality" +version = "0.1.0" +authors = ["Ahmet Kaan GÜMÜŞ <96421894+Tahinli@users.noreply.github.com>"] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] + +dioxus = { version = "0.6.1", features = ["web", "router"] } + +# Debug +tracing = "0.1.41" +dioxus-logger = "0.6.1" + +[profile] + +[profile.wasm-dev] +inherits = "dev" +opt-level = 1 + +[profile.server-dev] +inherits = "dev" + +[profile.android-dev] +inherits = "dev" diff --git a/Dioxus.toml b/Dioxus.toml new file mode 100644 index 0000000..0222811 --- /dev/null +++ b/Dioxus.toml @@ -0,0 +1,43 @@ +[application] + +# App (Project) Name +name = "Tahinli" + +# Dioxus App Default Platform +# desktop, web +default_platform = "web" + +# `build` & `serve` dist path +out_dir = "dist" + +# resource (assets) file folder +asset_dir = "assets" + +[web.app] + +# HTML title tag content +title = "Tahinli" + +[web.watcher] + +# when watcher trigger, regenerate the `index.html` +reload_html = true + +# which files or dirs will be watcher monitoring +watch_path = ["src", "assets"] + +# include `assets` in web platform +[web.resource] + +# CSS style file + +style = [] + +# Javascript code file +script = [] + +[web.resource.dev] + +# Javascript code file +# serve: [dev-server] only +script = [] diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0629438418ecd2ab3fa974be8884c45b2055d3dd GIT binary patch literal 15406 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�?;e?X1COIL zcH8Gv>N{8@=9b_)D_XTmXE@`bx9{$(jgl$e=$6a9FyRT8S>*5bI6~0O64#%19$2zX<0DAufapo*(@nR*;v|_8-zmT)k z4tjB2VC4Jbh3mG_n-gOw>C$~w_N+Vp_2DyhrXPJ)+;{7K%Z4+e=YVa4!2f4_Gp9eC zOYhD5m=;*>-uNBcZC%IsitfZ4Q>)vrZ16gGz_&PUz{69<$$LS3!EKrxw}Hl;tF-t` zqL+8o^xoLDzG(La?6(z-R=9V!=m5UbgqUcz_y!>+?`Mih$s}>-t;Cu2;4^U_f6y5o zciRUW=vAzNa>gH#|Cq*Q-c$FhXFZ#%-&tz%3y^&&>^9V0oX+|yacKb^SL^_`inUPi zD?YQ9-#BS?rRsm2&A&9C&7C1~vmH4`e8*;U#%EsY=WGt28E2YZ^?c|iV!Q6j8Q(xR zlr;eMdOe%F`AvWwSVs*w8w@Fs69xW$^{`*D9^rf2Ep;t>!4B@dn<8HqJLs#*^j~c* xPexo-mt`mB`&f#Ty#zf^?U8^-0v-u?B;b*NM* \ No newline at end of file diff --git a/assets/main.css b/assets/main.css new file mode 100644 index 0000000..220862a --- /dev/null +++ b/assets/main.css @@ -0,0 +1,198 @@ +* { + box-sizing: border-box; + margin: 0; + font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; +} + +.project{ + margin: 1%; + h1 { + color: azure; + } + h3 { + margin-top: 1%; + color: aliceblue; + } + h5 { + margin-bottom: 1%; + color: antiquewhite; + } + div { + margin-top: 1%; + display:block; + @media screen { + width: 50%; + } + + @media screen and (max-width:820px){ + width: 100%; + } + } +} + +#github_link_in_project_page { + text-decoration: none; + color: coral; +} + +.projects_list { + font-size: large; + color: white; + margin: 1%; +} + +.projects_list h1 { + margin-top: 1%; + margin-bottom: 1%; +} + +.project_link { + text-decoration: underline; + font-size: x-large; + color: azure; + margin: 1%; +} + +.project{ + margin: 1%; + h1 { + color: azure; + } + h3 { + margin-top: 1%; + color: aliceblue; + } + h5 { + margin-bottom: 1%; + color: antiquewhite; + } + div { + margin-top: 1%; + display:block; + @media screen { + width: 50%; + } + + @media screen and (max-width:820px){ + width: 100%; + } + } +} + +#github_link_in_post_page { + text-decoration: none; + color: coral; +} + +.posts_list { + font-size: large; + color: white; + margin: 1%; +} + +.posts_list h1 { + margin-top: 1%; + margin-bottom: 1%; +} + +.post_link { + text-decoration: underline; + font-size: x-large; + color: azure; + margin: 1%; +} + +body { + background-color: rgba(0, 0, 0, 0.85); + color: silver; +} + +.main_nav_btn { + text-decoration:overline silver; + color: burlywood; + text-shadow: 1px 1px orange; + padding: 5%; + @media screen { + font-size: xx-large; + } + + @media screen and (max-width:820px){ + font-size: x-large; + } +} + +.main_nav_btn:hover { + background-color: rgba(255, 240, 240, 0.2); +} + +.main_nav { + display:inline-flex; + padding-top: 1%; + padding-bottom: 1%; + background-blend-mode: multiply; +} + +.main { + margin: 1%; +} + + +#main_about { + display:block; + white-space: pre-line; + @media screen { + width: 50%; + } + + @media screen and (max-width:820px){ + width: 100%; + } +} + +header { + background-size: cover; + border-bottom: 1px solid rgba(0, 0, 0, 0.5); + margin-bottom: 1% black; + background-color: rgba(0, 0, 0, 0.6); +} + +#name { + color: white; +} + +#title { + color:aqua; + margin-top: 1%; + margin-bottom: 1%; +} + +#github { + margin: 5%; + color: brown; + font-size: large; + font-weight: bold; +} + +#linkedin { + margin: 5%; + color:cornflowerblue; + font-size: large; + font-weight: bold; +} + +#social_links { + display: inline-block; + margin: 1%; +} + +.footer_div { + margin-top: 5%; +} + +footer { + color: burlywood; + bottom: 0; + width: 100%; + position: fixed; + background-color: rgb(0, 0, 0, 0.9); +} \ No newline at end of file diff --git a/src/home.rs b/src/home.rs new file mode 100644 index 0000000..f5386b2 --- /dev/null +++ b/src/home.rs @@ -0,0 +1,45 @@ +use dioxus::prelude::*; + +use crate::{Footer, Header, Route}; + +#[component] +pub fn Home() -> Element { + rsx! { + Header {} + div { id: "content", + Outlet:: {} + } + div { + class: "main", + h1 { + id: "name", + "Ahmet Kaan Gümüş"} + h4 { + id: "title", + "System && Back End Developer"} + + div { + id: "social_links", + Link {id:"github",to: "https://github.com/tahinli", "GitHub"} + + Link {id:"linkedin",to: "https://linkedin.com/in/ahmetkaangumus", "LinkedIn"} + } + + div { + id: "main_about", + " + Hi, I'm Ahmet Kaan. I'm Turk. I was born in 2001. + I graduated from the computer science major at Erciyes University. + + I'm keen on understanding computers as deeply as possible. + I love open source philosophy and KISS principle. + + My passion is to create software that's able to live as long as possible. Developers should write versatile, bug free programs. Using software is impossible to ignore. World's leading with software and will be. We as developers must think as many possibility as possible to create robust and secure programs. + + I wish I will be able to create free and open source software that is widely used by people without even let them thinking about their privacy and robustness of my program. + " + } + } + Footer {} + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..7a4e0fc --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,53 @@ +use dioxus::prelude::*; +use home::Home; +use posts::{Post, Posts}; +use projects::{Project, Projects}; + +pub mod home; +pub mod posts; +pub mod projects; + +#[derive(Clone, Routable, Debug, PartialEq)] +pub enum Route { + #[route("/")] + Home {}, + #[route("/projects")] + Projects {}, + #[route("/projects/:id")] + Project { id: i32 }, + #[route("/posts")] + Posts {}, + #[route("/posts/:id")] + Post { id: i32 }, +} + +#[component] +pub fn Header() -> Element { + rsx! { + header { + nav { + class: "main_nav", + Link {to: Route::Home{}, class:"main_nav_btn", "Home"} + Link {to: Route::Projects{}, class:"main_nav_btn", "Projects"} + Link {to: Route::Posts {}, class:"main_nav_btn", "Posts"} + } + } + div { id: "content", + Outlet:: {} + } + } +} + +#[component] +pub fn Footer() -> Element { + rsx! { + div {class:"footer_div", + footer{ + h4 { + "Developed by Tahinli with Rust + WASM without Front End Skills" + } + } + } + + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..ce78430 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,19 @@ +use dioxus::prelude::*; +use personality::Route; +use tracing::Level; + +fn main() { + // Init logger + dioxus_logger::init(Level::INFO).expect("failed to init logger"); + launch(app); +} + +fn app() -> Element { + rsx! { + link { + rel: "stylesheet", + style { {include_str!("../assets/main.css")} }, + } + Router:: {} + } +} diff --git a/src/posts.rs b/src/posts.rs new file mode 100644 index 0000000..eb3a42d --- /dev/null +++ b/src/posts.rs @@ -0,0 +1,34 @@ +use dioxus::prelude::*; + +use crate::{Footer, Header}; + +#[component] +pub fn Posts() -> Element { + rsx! { + Header {} + div { + class: "posts_list", + h1 {"Posts"} + } + Footer {} + } +} + +#[component] +pub fn Post(id: i32) -> Element { + let x = match id { + 1 => { + rsx! {} + } + _ => { + rsx! { + h1 {"You're not supposed to be here"} + } + } + }; + rsx! { + Header {} + {x} + Footer {} + } +} diff --git a/src/projects.rs b/src/projects.rs new file mode 100644 index 0000000..b5c00f0 --- /dev/null +++ b/src/projects.rs @@ -0,0 +1,313 @@ +use dioxus::prelude::*; + +use crate::{Footer, Header, Route}; + +#[component] +pub fn Projects() -> Element { + rsx! { + Header {} + div { + class: "projects_list", + h1 {"Projects"} + div { class: "project_link", Link {to: Route::Project { id: 1 }, class: "project_link", "Radioxide"} } + div { class: "project_link", Link {to: Route::Project { id: 2 }, class: "project_link", "TCP File Transfer"} } + div { class: "project_link", Link {to: Route::Project { id: 3 }, class: "project_link", "Memory Filler Killer"} } + div { class: "project_link", Link {to: Route::Project { id: 4 }, class: "project_link", "Package Manager"} } + div { class: "project_link", Link {to: Route::Project { id: 5 }, class: "project_link", "Personality"} } + div { class: "project_link", Link {to: Route::Project { id: 6 }, class: "project_link", "UDP Hole Puncher"} } + div { class: "project_link", Link {to: Route::Project { id: 7 }, class: "project_link", "Blockchain"} } + div { class: "project_link", Link {to: Route::Project { id: 8 }, class: "project_link", "Optimization Algorithms"} } + div { class: "project_link", Link {to: Route::Project { id: 9 }, class: "project_link", "Forum"} } + } + Footer {} + } +} + +#[component] +pub fn Project(id: i32) -> Element { + let x = match id { + 1 => { + rsx! { + div { + class:"project", + h1 {"Radioxide"} + h5 {"Online radio written in Rust."} + Link {id: "github_link_in_project_page", to: "https://github.com/tahinli/radioxide", "GitHub"} + div { + " + In this project any streamer can do their radio stream. + Streamer is able to stream audio input and also sound files. + Multiple clients are able to listen streamer. + Relay server connects streamer to worldwide listeners. + Strategy is simple. Since normal users don't have a chance to share their IP publicly, + relay server collects data from streamer app. Front end part's able to connect with relay server and + this allows people listen everywhere where the internet reaches. + " + } + h3 {"Why I did this ?"} + div { + "I wanted to learn how to stream sound data." + } + + h3 {"What I learned ?"} + div { + "WebSocket, TLS, Stream Optimization, Sound Mix, How Sound Works, ELM Architecture" + } + } + } + } + + 2 => { + rsx! { + div { + class:"project", + h1 {"TCP File Transfer"} + h5 {"New file transfer protocol based on TCP, written in Rust"} + Link {id: "github_link_in_project_page", to: "https://github.com/Tahinli/rust-tcp-file-transfer", "GitHub"} + div { + " + In this project I wanted to create a program for transferring files with network. + I implemented this to use personally, especially in local networks. + Basic client server structure both client and server can receive or send data. + " + } + h3 {"Why I did this ?"} + div { + " + I wanted a portable easy way to transfer files between different operating systems. + I personally experienced many problem while I was working for Erciyes University + because of cross platform support and lack of portability of other programs. + That's why I wanted to solve it. + " + } + + h3 {"What I learned ?"} + div { + " + Interacting with network in Rust. + " + } + + h3 {"Note"} + div { + " + Additionally it's my first project in Rust. That's why after even learning much better ways to implement this program, + I don't change the code. I keep this program as a memento and a milestone for my improvement. + " + } + } + } + } + 3 => { + rsx! { + div { + class:"project", + h1 {"Memory Filler Killer"} + h5 {"Memory fullness and filler checker written in Rust "} + Link {id: "github_link_in_project_page", to: "https://github.com/Tahinli/rust-memory-filler-killer", "GitHub"} + div { + " + In this project a program checks for available memory. + If available memory gets lower then given value, program tries to find memory filler. + When memory filler found by the program, it will be killed to keep operating system alive. + " + } + h3 {"Why I did this ?"} + div { + " + Linux normally has this kind of feature. + If it lacks of memory to keep OS alive then program that uses most of the memory be killed by kernel. + Problem is it's not working well. I don't know why but + I got in a situation like a program consumes all of my memory by some kind of leak but kernel couldn't do anything and my system crashed. + I wanted to solve this problem, now I use my program as a service for my own system to prevent myself from being in same situation. + " + } + + h3 {"What I learned ?"} + div { + "Interacting with operating system and processes for reading data and sending signals." + } + } + } + } + 4 => { + rsx! { + div { + class:"project", + h1 {"Package Manager"} + h5 {"Package manager written in Rust"} + Link {id: "github_link_in_project_page", to: "https://github.com/Tahinli/rust-package-manager", "GitHub"} + div { + " + In this project user can upload own packages to server then able to update and delete. + Other users can download and install uploaded packages to their systems. + They are able to update and delete packages. + Also client side supports updating all packages that is already installed on the system. + " + } + h3 {"Why I did this ?"} + div { + " + I wanted to learn how can I build package manager since I use them everyday. + " + } + + h3 {"What I learned ?"} + div { + "Seems like I didn't learn new things but made stronger what I knew." + } + } + } + } + 5 => { + rsx! { + div { + class:"project", + h1 {"Personality"} + h5 {"Personal website written in Rust"} + Link {id: "github_link_in_project_page", to: "https://github.com/Tahinli/personality", "GitHub"} + div { + " + In this project I wanted to build portfolio website for myself and currently you're viewing what is built. + There are couple pages and sections. It's a static page based on WASM. + " + } + h3 {"Why I did this ?"} + div { + " + I wanted to learn HTML and CSS a bit also having website as a document of yourself sounds nice. + " + } + + h3 {"What I learned ?"} + div { + " + Little bit HTML and CSS. I wish I could create better views but doing this kind of things always hard for me. + " + } + } + } + } + 6 => { + rsx! { + div { + class:"project", + h1 {"UDP Hole Puncher"} + h5 {"UDP hole puncher written in Rust"} + Link {id: "github_link_in_project_page", to: "https://github.com/Tahinli/rust-udp-hole-puncher", "GitHub"} + div { + " + In this project I wanted to bypass NAT (Network Address Translation) limitations. Because of lack of IPv4 addresses and security reasons we have public and private addresses. + In this situation, we can't easily create peer to peer connection unfortunately. Thanks to UDP hole punching strategy, we may bypass NAT restrictions. + I can't say it works every time because NAT strategies are getting complex by different layers and even creating a hole for your router not enough for peer connection. + " + } + h3 {"Why I did this ?"} + div { + " + I wanted to create peer to peer connection without sending actual data to some relay server. UDP hole punching still rely on at least a connectible address (let's say a relay) but just for creating a hole not for sending all data. + " + } + + h3 {"What I learned ?"} + div { + " + I learnt more details and different type of NATs. Working with UDP is also another plus. + " + } + } + } + } + 7 => { + rsx! { + div { + class:"project", + h1 {"Blockchain"} + h5 {"Blockchain written in Rust"} + Link {id: "github_link_in_project_page", to: "https://github.com/Tahinli/rust-blockchain", "GitHub"} + div { + " + In this project I wanted to implement a blockchain structure from scratch. Basically project starts with defining block, blockchain, genesis block so on. After that I created network strategy to transfer these blocks to miners. When miners mine blocks, server tries to collect data from them and decides what next blocks will be by consensus mechanism. + " + } + h3 {"Why I did this ?"} + div { + " + Basically I wanted to learn how things work in blockchain side. + " + } + + h3 {"What I learned ?"} + div { + " + I realised pitfalls of the blockchain technology more clearly by the first hand. + " + } + } + } + } + 8 => { + rsx! { + div { + class:"project", + h1 {"Optimization Algorithms"} + h5 {"Optimization Algorithms written in Rust"} + Link {id: "github_link_in_project_page", to: "https://github.com/Tahinli/optimization_algorithms", "GitHub"} + div { + " + In this project I implemented couple of optimization algorithms in Rust. In general they are very useful in many places included: hyper parameter optimization, food search, reducing cost for production and more. I have to mention Artificial Bee Colony algorithm created by Prof. Dr. Derviş Karaboğa, performs great performance and robustness especially in artificial intelligence area. + " + } + h3 {"Why I did this ?"} + div { + " + Firstly it was optional assessment for university course but then it became a passion to learn. Especially when I had a chance to publish my work on official university page, I really put a lot of effort to create Rust version as correct as possible. You can find it here: + " + Link {to: "https://abc.erciyes.edu.tr", "Erciyes University"} + } + + h3 {"What I learned ?"} + div { + " + How things works on optimization area. Specifically why we need them instead of calculating perfect mathematical equation for every possible problem to achieve correct results. This optimization techniques lead an expanded view for my life also. + " + } + } + } + } + 9 => { + rsx! { + div { + class:"project", + h1 {"Forum"} + h5 {"Forum back end written in Rust."} + Link {id: "github_link_in_project_page", to: "https://github.com/Tahinli/rust_forum", "GitHub"} + div { + " + In this project I wanted to implement forum back end. It has authentication and authorization with JWT. It has fully asynchronous architecture with Postgres. + " + } + h3 {"Why I did this ?"} + div { + "It was going to be used for university club but we decided to go on with battle tested one." + } + + h3 {"What I learned ?"} + div { + "Writing middleware and implementing JWT" + } + } + } + } + _ => { + rsx! { + h1 {"You're not supposed to be here"} + } + } + }; + rsx! { + Header {} + {x} + Footer {} + } +}