Cloud Album
A private cloud photo album for overseas users, focused on backup, organization, and subscription-ready experiences.
A real product journey covering the iOS client, MinIO storage, overseas payments, and growth experiments.
Products
Small, useful products backed by the engineering notes on this site.
A private cloud photo album for overseas users, focused on backup, organization, and subscription-ready experiences.
A real product journey covering the iOS client, MinIO storage, overseas payments, and growth experiments.
Blog
Add the Spring Boot mail starter and configure the provider's SMTP host, port, authentication, and TLS mode. Store credentials in environment variables or a secret manager.
Install MongoDB from the official repository for your distribution whenever possible. Repository packages provide service files, upgrades, and dependency management.
MySQL rejects a parent-row delete or key update when dependent child rows would violate a foreign-key constraint.
A plain Maven JAR normally contains only your project's compiled classes and resources. To run it with java -jar, the archive needs a Main-Class manifest entry, and every runtime dependency must either be available on the classpath or packaged into an executable "fat" JAR.
Spring Data Redis issues commonly come from mismatched serializers, connection settings, client versions, and assumptions about transactions or caching semantics.
CentOS 7 is end-of-life, so use a supported operating system for new deployments. For a legacy host, install Apache and the TLS module, then configure a certificate issued for the site's hostname.
MySQL 5.7 is an older release and should be used only when application compatibility requires it. Prefer a supported current release for new systems.
Spring Boot can expose JSON APIs with @RestController and request-mapping annotations.
Maven resolves dependencies from repositories. A mirror in settings.xml can redirect requests to a faster or internally controlled repository manager.
Modern functions expose a name property:
function calculateTotal(price, quantity) {}
console.log(calculateTotal.name); // calculateTotal