Bozho's tech blog
Tips and thoughts on developing software, by Bozhidar Bozhanov
- Posts
- 384 from 8 Jul 2008 to 16 Aug 2026
- Posting
- now and then (1 in the last year)
- Kind
- personal blog
- Feed
- https://techblog.bozho.net/feed/
2026 1
2025 3
2024 5
2023 7
- MERDA – A Framework For Countering Disinformation
- Anticorruption Principles For Public Sector Information Systems
- Methodology for Return on Security Investment
- Why I’m Not So Alarmed About AI And Jobs
- Nothing Is Secure [slides]
- Internally And Externally Facing Honeypots
- A Security Issue in Android That Remains Unfixed – Pull-down Menu On Lock Screen
2022 4
2021 15
- I Have Been Appointed As E-Governance Minister of Bulgaria
- Simple Things That Are Actually Hard: User Authentication
- Integrity Guarantees of Blockchains In Case of Single Owner Or Colluding Owners
- Hypotheses About What Happened to Facebook
- Digital Transformation and Technological Utopianism
- Obtaining TLS Client Certificates In Spring Integration
- Every Serialization Framework Should Have Its Own Transient Annotation
- A Developer Running For Parliament
- The Syslog Hell
- Developers Are Obsessed With Their Text Editors
- List of Open Source Security Tools
- Always Name Your Thread Pools
- Connecting to Kibana Within an AWS VPC
- Elasticsearch – Scalability and Multitenancy [slides]
- Content-Security-Policy Nonce with Spring Security
2020 26
- Releasing Often Helps With Analyzing Performance Issues
- Syntactic Sugar Is Not Always Good
- Creating a CentOS Startup Screen
- Let’s Kill Security Questions
- My Advice To Developers About Working With Databases: Make It Secure
- Discovering an OSSEC/Wazuh Encryption Issue
- OpenSSL Key and IV Padding
- ElasticSearch Multitenancy With Routing
- Is It Really Two-Factor Authentication?
- Bulk vs Individual Compression
- Making Sense of the Information Security Landscape
- Encryption Overview [Webinar]
- Blockchainizing Existing Databases
- Seven Legacy Integration Patterns
- Using Multiple Dynamic Caches With Spring
- Low-Code, Rapid Application Development and Digital Transformation
- Six Things I Learned from Mr. Robot
- AWS Alarms for Application Errors
- Am I a Real Expert?
- Automating the Change of WordPress Permalinks
- An AWS Elasticsearch Post-Mortem
- Running a Safe Database Cluster in AWS With Auto-Scaling Groups
- Where Is This Coming From?
- One-Month of Microsoft DKIM Failure and Thoughts on Technical Excellence
- One-Time Passwords Do Not Provide Non-Repudiation
- Solving Problems Properly Is Often Not Viable
2019 25
- Getting Email Sending Settings Right
- A Disk-Backed ArrayList
- Near Real-Time Indexing With ElasticSearch
- A Technical Guide to CCPA
- Restoring Cassandra Priam Backup With sstableloader
- Blockchain Overview – Types, Use-Cases, Security and Usability [slides]
- The Personal Data Store Pattern
- Remote Log Collection on Windows
- Cybersecurity Is Very Important
- Protecting JavaScript Files From Formjacking
- Let’s Annotate Our Methods With The Features They Implement
- Idea: A Generic P2P Network Client
- First Thoughts About Facebook’s Libra Cryptocurrency
- Reflection is The Most Important Java API
- JKS: Extending a Self-Signed Certificate
- Multiple Cache Configurations with Caffeine and Spring Boot
- The Positive Side-Effects of Blockchain
- Command-line SQL Client for IBM i 7.x (AS/400)
- Audit Trail in IT Context
- 7 Questions To Ask Yourself About Your Code
- Implicit _target=”blank”
- How to create secure software? Don’t blink! [talk]
- Avoid Lists in Cassandra
- Certificate Transparency Verification in Java
- Integrating Applications As Heroku Add-Ons
2018 29
- Types of Data Breaches and How To Prevent Them
- Blockchain – What Is It Good For? [slides]
- Technical Innovation vs. Process Innovation
- Resources on Distributed Hash Tables
- Algorithmic and Technological Transparency
- Automate Access Control for User-Specific Entities
- Random App Ideas
- Scaling Horizontally on AWS [talk]
- Models for Electronic Identification
- Typical Workarounds For Compliant Logs
- A Caveat With AWS Shared Resources
- Writing Big JSON Files With Jackson
- Proving Digital Events (Without Blockchain)
- Implementing White-Labelling
- 5 Features Eclipse Should Copy From IntelliJ IDEA
- Electronic Signatures Using The Browser
- Storing Encrypted Credentials In Git
- The Benefits of Side Projects
- Bad Software Is Our Fault
- Audit Trail Overview
- User Authentication Best Practices Checklist
- Tracking Cookies and GDPR
- Setting Up Cassandra With Priam
- Using JWT For Sessions
- Adding Visible Electronic Signatures To PDFs
- Integration With Zapier
- GDPR for Developers [presentation]
- When You Have A Blockchain, Everything Looks Like a Nail
- Fix Your Crawler
2017 31
- OWASP Dependency Check Maven Plugin – a Must-Have
- Using Trusted Timestamping With Java
- GDPR – A Practical Guide For Developers
- The Problem Solver
- I Still Prefer Eclipse Over IntelliJ IDEA
- Blockchain? It’s All Greek To Me…
- Enabling Two-Factor Authentication For Your Web Application
- Setting Up Cassandra Cluster in AWS
- SecureLogin For Java Web Applications
- Self-Driving Cars Should Be Open Source
- Five Must-Watch Software Engineering Talks
- Stubbing Key-Value Stores
- We Are Not Having a Productive Debate About Women in Tech
- How To Send Ethereum Transactions With Java
- Concerns About The Blockchain Technology
- Basic API Rate-Limiting
- Simple Spring Boot Admin Setup
- Developers and Ethics
- Electronic Signature Using The WebCrypto API
- “Architect” Should Be a Role, Not a Position
- Overview of Message Queues [slides]
- Event Logs
- Spring Boot, @EnableWebMvc And Common Use-Cases
- Distributed Cache – Overview
- Distributing Election Volunteers In Polling Stations
- “Infinity” is a Bad Default Timeout
- Protecting Sensitive Data
- A Case For Native Smart Card Support in Browsers
- Computer Science Concepts That Non-Technical People Should Know
- Why I Chose to Be a Government Advisor
- Forget ISO-8859-1
2016 30
- Anemic Objects Are OK
- Amend Your Contract To Allow For Side Projects
- Progress in Electronic Governance [talk]
- Domain Fallback Mechanism In Apps
- Using Named Database Locks
- Short DNS Record TTL And Centralization Are Serious Risks For The Internet
- The Broken Scientific Publishing Model and My Attempt to Improve It
- I Stopped Contributing To Stackoverflow, But It’s Not Declining
- Traditional Web Apps And RESTful APIs
- The Right To Be Forgotten In Your Application
- Why I Introduced Scala In Our Project
- Biometric Identification [presentation]
- Writing Laws Is Quite Like Programming
- Custom Audit Log With Spring And Hibernate
- Spring-Managed Hibernate Event Listeners
- Installing Java Application As a Windows Service
- Why I Prefer Merge Over Rebase
- E-Government Architecture [presentation]
- Identity in the Digital World
- Cleanup Temp Files
- Dirty Hacks Are OK
- A Beginner’s Guide to Addressing Concurrency Issues
- How To Read Your Passport With Android
- Software Can’t Live On Its Own
- Take a Step Back
- Pretty Print JSON Per Request With Spring MVC
- Setting Up Distributed Infinispan Cache with Hibernate and Spring
- Issues With Electronic Machine Readable Travel Documents
- Microservices Use Cases
- Testing: Appetite Comes With Eating
2015 36
- General Performance Tips
- TLS Client Authentication
- Electronic Identification
- A Problem With Convention-Over-Configuration
- E-voting [presentation]
- Setting Up CloudFront With S3
- In Defence of Monoliths
- Retryable operations
- Why All The Fear of Electronic Voting?
- Common Sense Driven Development [talk]
- “Forget me” and Tests
- The “Software Engineer” Mindset
- Comments on The Twelve-Factor App
- A Software Engineer As a High-Level Government Adviser
- Events Don’t Eliminate Dependencies
- Government Abandonware
- Tomcat’s Default Connector(s)
- Blue-Green Deployment With a Single Database
- Optional Dependencies
- AWS “Noisiness”
- Log Collection With Graylog on AWS
- Should We Look For a PRISM Alternative?
- The Precious Feature Design Meetings
- KISS With Essential Complexity
- Getting Notified About RabbitMQ Cluster Partitioning
- A Non-Blocking Benchmark
- How to Land a Software Engineering Job?
- Why Non-Blocking?
- My Development Setup
- Do It Either Way, We’ll Refactor It Later
- Time Zone Use Cases
- I Am Not Allowed to Post My Content on Reddit
- The Internet Is Pseudo-Decentralized
- My Most Frequent Code Review Comment
- The Hash Challenge
- Proposal for an E-Government Architecture
2014 42
- Handling Edge Cases
- In Favour of Self-Signed Certificates?
- Algorithmic Music Composition [paper]
- Open Source for the Government [presentation]
- Static Typing Is Not for Type Checking
- Getting Started with Machine Learning
- Making Side Projects With New Technologies
- Interrupting Executor Tasks
- Development Overhead
- On Java Generics and Erasure
- The DSL Jungle
- Validate Configuration on Startup
- Scala – the Good, the Bad and the Very Ugly [presentation]
- Load-Testing Guidelines
- EasyCamera Now in Maven Central
- Musical Scale Generator
- Caveats of HttpURLConnection
- Open-Sourcing My Music Composition Algorithm
- Get Rid of the URL Pollution
- Generating equals(..), hashCode() and toString()
- Suggestion for Spam Filters
- RabbitMQ in Multiple AWS Availability Zones
- The Cloud Beyond the Buzzword [presentation]
- You Probably Don’t Need a Message Queue
- How to Handle Incompetence?
- Make Tests Fail
- An Architecture for E-Voting
- Integration Tests for External Services
- Algorithmic Music Influenced by Tweets
- The Low Quality of Scientific Code
- Development “Methodologies”
- Scheduling Repeated Tasks in Android
- Common Misconceptions About Java
- Fixing The Android Camera API
- The Optional Type API
- IDE vs. Editor
- Verifying Secure Password Storage Externally
- Coping with Methods with Many Parameters
- Ideas Aren’t Worthless
- Digital Signatures With Javascript
- I Don’t Like Scala
- Why The Web Isn’t Semantic Yet
2013 21
- WebSocket and Java
- I Use the main() Method
- Save-and-Refresh With Java Web Projects
- Embedding Maven
- UTF-8 By Default
- The Lazy Expert
- A Scraping Library
- A Serious Flaw of PaaS
- KISS My YAGNI
- A Simple Plugin System for Web Applications
- Two Types of Deployment for Subsystems
- We Don’t Need That Documentation
- Not an Expert in All Levels of Abstraction
- The Point of Knowledge
- Templating For Java Web Applications
- Login Tokens In Email Links
- Augmenting 3rd-Party Libraries
- How To Accept Bitcoin Payments
- Database Migrations And Java
- Caveats With MySQL Pagination
- Be Careful With Cache Managers
2012 36
- Why Not Emacs?
- What Is Challenging For Developers?
- A Guide To Authenticating Users With Mozilla Persona
- Not All Optimization Is Premature
- Generating Music
- Tip Of The Day: Make Your Email Column Unique
- How To Provide Default Serialization Format With Spring MVC RESTful Services
- Don’t Use JSON And XML As Internal Transfer Formats
- A Tip For Properly Utilizing Hibernate 2nd Level Cache
- Do Web 2.0 Companies Really Have The Best Technical Talent?
- Do Programmers Get Bored?
- Bcrypt. It’s The Bare Minimum.
- HTML5/Javascript Desktop Software
- All That Cloud: Amazon, Google App Engine, Windows Azure, Heroku, Jelastic
- How To Generate A Schema Creation Script With Hibernate 4, JPA And Maven
- Proof of Concept: Play! Framework
- Links To Your Static Resources Are Forever
- Managing CSS And Javascript In Production Is Hard
- ORM Haters Don’t Get It
- Javascript-off Unfriendly, And Proud About It
- Runtime Classpath vs Compile-Time Classpath
- Keep As Much Stuff As Possible In The Application Itself
- Replacing a JSON Message Converter With MessagePack
- Programming Puns
- Code Reviews Do Not Guarantee A Good Product
- My Problem With Your Interviews
- Is Moving All Jars To a Shared lib Folder Beneficial?
- Is Reddit Handling Trailing Slashes Incorrectly?
- State Does Not Belong In The Code
- Spring MVC Basics – Presentation
- Customizing Parameter Names When Binding Spring MVC Command Objects
- Send A Relevant Dilbert Strip To Your Boss
- A Hibernate Session May Get Flushed When Executing Queries
- The “Clean Software” Approach To Life
- Mind The “actions” Param For Facebook Graph API Posts
- Why I Like The Verbosity of Java
2011 38
- Fix That Code Immediately!
- The Default Use Case
- Change Without Redeploying With Eclipse And Tomcat
- A Bit Of Linux Hate
- Two Years On Stack Overflow
- Avoid Lazy JPA Collections
- To Employers That Don’t Respond In Time
- Getters and Setters Are Not Evil
- Java Client for the Google+ API
- Spring-managed Hibernate Listeners with JPA
- Error pages and chunked encoding – it’s harder than you think
- First Experience with the Google+ API
- The Logging Mess
- How to Map Dates with Hibernate – Use joda-time
- Google App Engine and Maven
- How to Handle Project Configuration
- What to Do With IDE Project Files
- Describe Concepts in Comments
- Making Spring and Quartz Work Together Smoothly
- What Questions an Interviewer Should Ask
- On DTOs
- The Most Common Mistake When Using Dependency Injection Frameworks
- Spring and PersistenceContextType.EXTENDED
- The Declining Quality of Low and Middle Class Laptops
- Slippers
- Pretty URLs and the Trailing Slash
- Why is the Facebook API So Crappy?
- An Idea for JPA Regarding Domain-Driven Design
- Careful with Storing Base64 in MySQL
- Those Evil Frameworks and Their Complexity
- Some Technical Details About My Startup
- Securely Storing Facebook / OAuth Access Tokens
- Where Is That Class / Resource Located?
- Facebook Graph API – What Does Each Field Mean in Different Contexts
- ThreadLocal Variables and Thread Pools – It Can Go Wrong
- Checked and Unchecked Exceptions in Java
- How Programming Becomes a Hobby Rather Than a Mere Profession
- RSS Is Not Dead. You Are Using It in a Wrong Way.
2010 17
- Why Startups Should Not Choose NoSQL
- Contexts and Dependency Injection Presentation
- We Don’t Need No Password Strength Checker
- How Does Merge Work in JPA (and Hibernate)
- Views on CDI and What’s New in JavaEE6
- Why I Decided Not to Use Cassandra
- Abstracting the DAO Layer with Hibernate/JPA
- Is JaveEE Really Portable? And Is It Really Useful?
- JMS, MessageDriven EJB (MDB), Timers, Maven, JPA (Hibernate) JBoss Example
- Time Zones and Java Web Applications
- On Domain-Driven Design, Anemic Domain Model, Code Generation, Dependency Injection and More…
- UI for Managing PKI, Instead of keytool or openssl
- The Psychology of Voting and Choice (on Stackoverflow and in General)
- Appeal to API Designers
- Using Multiple ELResolvers with CompositeELResolver in JSF
- Tips for Identifying and Debugging Problems
- Spring Annotation-Based vs XML-Based Transaction Definition Precedence
2009 12
- Are Tests of Service Methods That Rely on Database Access Unit Tests?
- JAXB: javax.xml.bind.UnmarshalException: unexpected element
- Hibernate: could not locate named parameter
- Custom Exceptions Thrown From Service Layer with Spring Transaction Support
- A Month on Stackoverflow
- Database Integration Testing / Unit-Testing with Spring, JPA, JUnit and Maven
- Deep @Embedded Hibernate Entity Hierarchy with Oracle
- How to Obtain Signer’s Details From JavaScript Signed Data
- A Really Useful Eclipse Shortcut to Configure
- NoScript and AdBlock plus – Two Sides to Every Story
- How to Create a Digital Signing Solution with Only JavaScript
- How to Iterate Over java.util.Set in JSF