3 Commits

Author SHA1 Message Date
Tuan-Dat Tran
8f1989ebc9 chore(version): Update for 2026
Signed-off-by: Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>
2026-01-18 13:47:55 +01:00
Tuan-Dat Tran
a387293f94 feat(ftl): Updated description for dd
Signed-off-by: Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>
2025-03-12 22:15:35 +01:00
Tuan-Dat Tran
64aa115ef4 feat(cargo): update
Signed-off-by: Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>
2025-02-11 19:48:58 +01:00
6 changed files with 521 additions and 553 deletions

737
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -723,10 +723,18 @@ video {
max-width: 36rem;
}
.flex-auto {
flex: 1 1 auto;
}
.flex-grow {
flex-grow: 1;
}
.grow {
flex-grow: 1;
}
.cursor-pointer {
cursor: pointer;
}
@@ -739,6 +747,14 @@ video {
flex-wrap: wrap;
}
.content-center {
align-content: center;
}
.items-start {
align-items: flex-start;
}
.items-center {
align-items: center;
}
@@ -755,6 +771,10 @@ video {
justify-content: space-between;
}
.justify-stretch {
justify-content: stretch;
}
.gap-2 {
gap: 0.5rem;
}
@@ -781,6 +801,10 @@ video {
margin-bottom: calc(2rem * var(--tw-space-y-reverse));
}
.self-stretch {
align-self: stretch;
}
.rounded {
border-radius: 0.25rem;
}
@@ -797,6 +821,11 @@ video {
border-radius: 0.375rem;
}
.rounded-e-lg {
border-start-end-radius: 0.5rem;
border-end-end-radius: 0.5rem;
}
.rounded-s-lg {
border-start-start-radius: 0.5rem;
border-end-start-radius: 0.5rem;
@@ -818,11 +847,6 @@ video {
border-inline-start-width: 1px;
}
.border-gray-200 {
--tw-border-opacity: 1;
border-color: rgb(229 231 235 / var(--tw-border-opacity));
}
.border-gray-600 {
--tw-border-opacity: 1;
border-color: rgb(75 85 99 / var(--tw-border-opacity));
@@ -833,29 +857,14 @@ video {
border-color: rgb(55 65 81 / var(--tw-border-opacity));
}
.border-white {
--tw-border-opacity: 1;
border-color: rgb(255 255 255 / var(--tw-border-opacity));
}
.border-gray-900 {
--tw-border-opacity: 1;
border-color: rgb(17 24 39 / var(--tw-border-opacity));
}
.bg-blue-100 {
.bg-blue-900 {
--tw-bg-opacity: 1;
background-color: rgb(219 234 254 / var(--tw-bg-opacity));
}
.bg-gray-100 {
--tw-bg-opacity: 1;
background-color: rgb(243 244 246 / var(--tw-bg-opacity));
}
.bg-gray-200 {
--tw-bg-opacity: 1;
background-color: rgb(229 231 235 / var(--tw-bg-opacity));
background-color: rgb(30 58 138 / var(--tw-bg-opacity));
}
.bg-gray-700 {
@@ -868,51 +877,11 @@ video {
background-color: rgb(31 41 55 / var(--tw-bg-opacity));
}
.bg-green-100 {
--tw-bg-opacity: 1;
background-color: rgb(220 252 231 / var(--tw-bg-opacity));
}
.bg-indigo-100 {
--tw-bg-opacity: 1;
background-color: rgb(224 231 255 / var(--tw-bg-opacity));
}
.bg-pink-100 {
--tw-bg-opacity: 1;
background-color: rgb(252 231 243 / var(--tw-bg-opacity));
}
.bg-purple-100 {
--tw-bg-opacity: 1;
background-color: rgb(243 232 255 / var(--tw-bg-opacity));
}
.bg-red-100 {
--tw-bg-opacity: 1;
background-color: rgb(254 226 226 / var(--tw-bg-opacity));
}
.bg-white {
--tw-bg-opacity: 1;
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
}
.bg-yellow-100 {
--tw-bg-opacity: 1;
background-color: rgb(254 249 195 / var(--tw-bg-opacity));
}
.bg-gray-900 {
--tw-bg-opacity: 1;
background-color: rgb(17 24 39 / var(--tw-bg-opacity));
}
.bg-blue-900 {
--tw-bg-opacity: 1;
background-color: rgb(30 58 138 / var(--tw-bg-opacity));
}
.bg-green-900 {
--tw-bg-opacity: 1;
background-color: rgb(20 83 45 / var(--tw-bg-opacity));
@@ -1118,9 +1087,14 @@ video {
letter-spacing: 0.1em;
}
.text-blue-800 {
.text-blue-300 {
--tw-text-opacity: 1;
color: rgb(30 64 175 / var(--tw-text-opacity));
color: rgb(147 197 253 / var(--tw-text-opacity));
}
.text-blue-500 {
--tw-text-opacity: 1;
color: rgb(59 130 246 / var(--tw-text-opacity));
}
.text-cyan-400 {
@@ -1128,6 +1102,11 @@ video {
color: rgb(34 211 238 / var(--tw-text-opacity));
}
.text-gray-300 {
--tw-text-opacity: 1;
color: rgb(209 213 219 / var(--tw-text-opacity));
}
.text-gray-400 {
--tw-text-opacity: 1;
color: rgb(156 163 175 / var(--tw-text-opacity));
@@ -1138,70 +1117,11 @@ video {
color: rgb(107 114 128 / var(--tw-text-opacity));
}
.text-gray-700 {
--tw-text-opacity: 1;
color: rgb(55 65 81 / var(--tw-text-opacity));
}
.text-gray-800 {
--tw-text-opacity: 1;
color: rgb(31 41 55 / var(--tw-text-opacity));
}
.text-gray-900 {
--tw-text-opacity: 1;
color: rgb(17 24 39 / var(--tw-text-opacity));
}
.text-green-800 {
--tw-text-opacity: 1;
color: rgb(22 101 52 / var(--tw-text-opacity));
}
.text-indigo-800 {
--tw-text-opacity: 1;
color: rgb(55 48 163 / var(--tw-text-opacity));
}
.text-pink-800 {
--tw-text-opacity: 1;
color: rgb(157 23 77 / var(--tw-text-opacity));
}
.text-purple-800 {
--tw-text-opacity: 1;
color: rgb(107 33 168 / var(--tw-text-opacity));
}
.text-red-800 {
--tw-text-opacity: 1;
color: rgb(153 27 27 / var(--tw-text-opacity));
}
.text-transparent {
color: transparent;
}
.text-white {
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
}
.text-yellow-800 {
--tw-text-opacity: 1;
color: rgb(133 77 14 / var(--tw-text-opacity));
}
.text-blue-300 {
--tw-text-opacity: 1;
color: rgb(147 197 253 / var(--tw-text-opacity));
}
.text-gray-300 {
--tw-text-opacity: 1;
color: rgb(209 213 219 / var(--tw-text-opacity));
}
.text-green-300 {
--tw-text-opacity: 1;
color: rgb(134 239 172 / var(--tw-text-opacity));
@@ -1227,6 +1147,15 @@ video {
color: rgb(252 165 165 / var(--tw-text-opacity));
}
.text-transparent {
color: transparent;
}
.text-white {
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
}
.text-yellow-300 {
--tw-text-opacity: 1;
color: rgb(253 224 71 / var(--tw-text-opacity));
@@ -1379,11 +1308,6 @@ video {
font-size: 3rem;
line-height: 1;
}
.md\:text-blue-500 {
--tw-text-opacity: 1;
color: rgb(59 130 246 / var(--tw-text-opacity));
}
}
@media (min-width: 1024px) {
@@ -1393,115 +1317,3 @@ video {
}
}
@media (prefers-color-scheme: dark) {
.dark\:border-gray-700 {
--tw-border-opacity: 1;
border-color: rgb(55 65 81 / var(--tw-border-opacity));
}
.dark\:border-gray-900 {
--tw-border-opacity: 1;
border-color: rgb(17 24 39 / var(--tw-border-opacity));
}
.dark\:bg-blue-900 {
--tw-bg-opacity: 1;
background-color: rgb(30 58 138 / var(--tw-bg-opacity));
}
.dark\:bg-gray-700 {
--tw-bg-opacity: 1;
background-color: rgb(55 65 81 / var(--tw-bg-opacity));
}
.dark\:bg-gray-900 {
--tw-bg-opacity: 1;
background-color: rgb(17 24 39 / var(--tw-bg-opacity));
}
.dark\:bg-green-900 {
--tw-bg-opacity: 1;
background-color: rgb(20 83 45 / var(--tw-bg-opacity));
}
.dark\:bg-indigo-900 {
--tw-bg-opacity: 1;
background-color: rgb(49 46 129 / var(--tw-bg-opacity));
}
.dark\:bg-pink-900 {
--tw-bg-opacity: 1;
background-color: rgb(131 24 67 / var(--tw-bg-opacity));
}
.dark\:bg-purple-900 {
--tw-bg-opacity: 1;
background-color: rgb(88 28 135 / var(--tw-bg-opacity));
}
.dark\:bg-red-900 {
--tw-bg-opacity: 1;
background-color: rgb(127 29 29 / var(--tw-bg-opacity));
}
.dark\:bg-yellow-900 {
--tw-bg-opacity: 1;
background-color: rgb(113 63 18 / var(--tw-bg-opacity));
}
.dark\:text-blue-300 {
--tw-text-opacity: 1;
color: rgb(147 197 253 / var(--tw-text-opacity));
}
.dark\:text-gray-300 {
--tw-text-opacity: 1;
color: rgb(209 213 219 / var(--tw-text-opacity));
}
.dark\:text-gray-400 {
--tw-text-opacity: 1;
color: rgb(156 163 175 / var(--tw-text-opacity));
}
.dark\:text-gray-500 {
--tw-text-opacity: 1;
color: rgb(107 114 128 / var(--tw-text-opacity));
}
.dark\:text-green-300 {
--tw-text-opacity: 1;
color: rgb(134 239 172 / var(--tw-text-opacity));
}
.dark\:text-indigo-300 {
--tw-text-opacity: 1;
color: rgb(165 180 252 / var(--tw-text-opacity));
}
.dark\:text-pink-300 {
--tw-text-opacity: 1;
color: rgb(249 168 212 / var(--tw-text-opacity));
}
.dark\:text-purple-300 {
--tw-text-opacity: 1;
color: rgb(216 180 254 / var(--tw-text-opacity));
}
.dark\:text-red-300 {
--tw-text-opacity: 1;
color: rgb(252 165 165 / var(--tw-text-opacity));
}
.dark\:text-white {
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
}
.dark\:text-yellow-300 {
--tw-text-opacity: 1;
color: rgb(253 224 71 / var(--tw-text-opacity));
}
}

3
rust-toolchain.toml Normal file
View File

@@ -0,0 +1,3 @@
[toolchain]
channel = "1.85.0"
components = ["rustfmt", "clippy", "rust-analyzer"]

View File

@@ -60,14 +60,16 @@ cv_workexperience_ra_ude_description = Während meiner Tätigkeit bei der
aufgebaut und verwaltet.
cv_workexperience_dd_devops_title = DevOps Engineer @ DextraData
cv_workexperience_dd_devops_time = 2025 - Jetzt
cv_workexperience_dd_devops_description = Bei DextraData, einem führenden
SaaS-Anbieter im Bereich Governance, Risk und Compliance (GRC), stelle ich
die Verfügbarkeit und Stabilität von Software-Deployments für unsere Kunden
sowie für interne Entwicklungsteams über mehrere Produkte hinweg sicher. In
Zusammenarbeit mit Customer-Success-Teams und Softwareentwicklern
gewährleisten wir einen reibungslosen Betrieb unserer Multi-Tenant- und Single
-Tenant-Instanzen von der Vorentwicklung bis hin zu den
Produktionsumgebungen.
cv_workexperience_dd_devops_description = Als DevOps Engineer bei DextraData
bin ich Teil eines horizontal strukturierten DevOps-Teams und verantwortlich
für die Verwaltung und Optimierung sowohl cloudbasierter als auch On-Premise-
Infrastrukturen, die unsere Single-Tenant-SaaS-Lösungen hosten. Meine Aufgabe
besteht nicht nur darin, diese Umgebungen zu warten und zu verbessern, sondern
auch Automatisierung und Effizienz durch moderne DevOps-Praktiken
voranzutreiben. Ich war maßgeblich an der Umstellung unserer Kubernetes-
basierten Deployments von manuellen Prozessen auf einen stärker
automatisierten und skalierbaren Ansatz beteiligt, indem ich Infrastructure as
Code mit Azure Resource Manager und Ansible eingesetzt habe.
cv_socials_title = Profile
cv_education_title = Bildungsweg
cv_education_bachelor_title = BSc Angewandte Informatik - Systems Engineering
@@ -151,7 +153,7 @@ publications_projects_projects_athome_description = Diese Website ist eine mit
impressum_off = Impressum anzeigen
impressum_on = Impressum
component_under_construction = Diese Seite befindet sich gerade im Aufbau
footer_year = © 2025
footer_year = "© 2026 "
footer_name = Tuan-Dat Tran
footer_rights = . All Rights Reserved.
footer_contact = Kontakt

View File

@@ -56,13 +56,15 @@ cv_workexperience_ra_ude_description = While working at the Network
infractructure, inventory system and online presence.
cv_workexperience_dd_devops_title = DevOps Engineer @ DextraData
cv_workexperience_dd_devops_time = 2025 - now
cv_workexperience_dd_devops_description = At DextraData, a leading SaaS
provider in the Governance, Risk, and Compliance (GRC) sector, I ensure the
availability and health of software deployments for our customers and
internal development teams across multiple products. Collaborating with
Customer Success and Software Engineers alike we ensure smooth operations on
our multi-tenant as well as single tenant instances from pre-dev to
production environments.
cv_workexperience_dd_devops_description = As a DevOps Engineer at DextraData,
I am part of a horizontally structured DevOps team, responsible for managing
and optimizing both cloud and on-premise infrastructure that hosts our
single-tenant SaaS solutions. My role involves not only maintaining and
improving these environments but also driving automation and efficiency
through modern DevOps practices. I have been actively involved in
transitioning our Kubernetes-based deployments from manual processes to a
more automated and scalable approach by leveraging Infrastructure as Code
with Azure Resource Manager and Ansible.
cv_socials_title = Socials
cv_education_title = Education
cv_education_bachelor_title = BSc Systems Engineering
@@ -143,7 +145,7 @@ publications_projects_projects_athome_description = This website is a
impressum_off = Show Impressum
impressum_on = Impressum
component_under_construction = This page is currently under construction
footer_year = © 2025
footer_year = "© 2026 "
footer_name = Tuan-Dat Tran
footer_rights = . All Rights Reserved.
footer_contact = Contact

View File

@@ -44,7 +44,7 @@ fn LanguageButtonGroup() -> Element {
onclick: change_to_english,
label { { t!("headers_language_buttons_english") } } },
button {
class: "px-4 py-2 text-sm font-medium border rounded-s-lg focus:z-10 focus:ring-2 bg-gray-800 border-gray-700 text-white hover:text-white hover:bg-gray-700 focus:ring-blue-500 focus:text-white",
class: "px-4 py-2 text-sm font-medium border rounded-e-lg focus:z-10 focus:ring-2 bg-gray-800 border-gray-700 text-white hover:text-white hover:bg-gray-700 focus:ring-blue-500 focus:text-white",
onclick: change_to_german,
label { { t!("headers_language_buttons_german") } } }
}
@@ -54,6 +54,6 @@ fn LanguageButtonGroup() -> Element {
#[component]
fn HeaderLink(url: Route, text: String) -> Element {
rsx! {
Link { to: url, class:"md:bg-transparent md:p-0 text-white md:text-blue-500", {text} }
Link { to: url, class:"md:bg-transparent md:p-0 text-blue-500", {text} }
}
}