MoreRSS

site iconThe Practical DeveloperModify

A constructive and inclusive social network for software developers.
Please copy the RSS to your reader, or quickly subscribe to:

Inoreader Feedly Follow Feedbin Local Reader

Rss preview of Blog of The Practical Developer

Building a Multi-Lingual Marketplace from North Macedonia to the Balkans

2025-12-13 03:17:15

Most successful marketplaces are built in large, unified markets with a single language and predictable user behavior.
The Balkans are the opposite.

Different languages, fragmented platforms, low trust in online listings, and heavy reliance on Facebook groups make building a scalable marketplace especially challenging.

This is the story of how we started building ReBALKAN, a next-generation classifieds platform, from North Macedonia — with the goal of expanding across the entire Balkan region.

Why the Balkan market is uniquely difficult

From the outside, the Balkans may look like a single region.
In practice, it’s a collection of very different micro-markets.

Some of the challenges we faced early on:

Multiple languages, often within the same country

Listings spread across agencies, Facebook groups, and outdated classified sites

Poor filtering and search experiences

Low user trust due to scams and duplicated listings

Strong local habits that resist change

There was no single place where users could easily browse real estate or vehicle listings in a structured and modern way.

Starting small: real estate and vehicles

We deliberately started with two core modules:

Real estate listings

Vehicle listings

These categories already had demand, but the user experience was fragmented.

From day one, our focus was not “feature quantity”, but:

Speed

Simplicity

Clean UX

Multi-language support

Instead of copying existing platforms, we rebuilt the experience from scratch with modern performance and usability standards in mind.

Product decisions that mattered early

Some of the decisions that shaped the platform:

Fast load times as a first-class feature, not an afterthought

Minimal UI to reduce friction for non-technical users

Strong filtering adapted to Balkan-specific listing habits

Multi-language architecture built into the core, not layered on later

The goal was simple:
make publishing and finding listings easy, even for users who are used to chaotic systems.

What we learned from early traction

Even with a limited feature set, early usage confirmed something important:

People don’t want “more platforms” — they want better organization.

Users responded positively to:

Clear categorization

Predictable search results

A platform that feels trustworthy and fast

This reinforced our belief that the problem wasn’t demand — it was structure.

What’s next for ReBALKAN

ReBALKAN started in North Macedonia, but it was never meant to stay local.

The roadmap includes expanding into additional verticals such as:

Services and job listings

Hospitality and short-term accommodation

Local commerce and business promotion

Events and tourism-related listings

At this stage, the priority is building a scalable foundation and forming strategic partnerships as the platform grows across the Balkans.

Closing thoughts

Building a marketplace in a fragmented region forces you to think differently about UX, trust, and scalability.

ReBALKAN is still evolving, but the goal is clear:
to become a unified digital marketplace for the Balkan region.

You can explore the platform here: ReBALKAN

Planning My Final Open Source Contribution

2025-12-13 03:10:16

For Release 0.4, I want to push myself further and work on a contribution that is meaningful to me and demonstrates everything I’ve learned this term about open-source development. After reviewing the options listed in the assignment, I decided to work on a feature-level contribution or bug fix for the hiero-sdk-python project. This is a repository I have already contributed to in earlier releases, so I am familiar with the structure, coding style, and contribution workflow. More importantly, this project aligns well with my long-term interests in Python development, and SDK design. During Release 0.3, I worked on adding an example script and became more familiar with how the SDK interacts with Hiero’s APIs. While working on the project, I noticed that certain parts of the SDK are still incomplete or could be improved with more examples, extra helper utilities, and better developer-side support. The codebase is active, well-maintained, and has reviewers who give detailed feedback—exactly the kind of environment where I can continue to grow as an open-source contributor. Over the next few days, I will communicate with maintainers to confirm which feature area would be most helpful and ensure my work aligns with their roadmap.
My plan is to take steady, visible steps each week:
Week 1 – Research and proposal
•Explore open issues, discuss with maintainers, and finalize the scope.
•Prepare a technical plan for the feature.

Week 2 – Development + iteration
•Implement the core part of the feature.
•Write tests, examples, or documentation as needed.
•Submit early PRs to get feedback from maintainers.

Week 3 – Finalization
•Address all code review comments.
•Polish tests and documentation.
•Publish the final PR and write my final reflection.

I wish I can deliver a feature that the maintainers are willing to merge and gain deeper experience reading large Python codebases and contributing at a higher level. This release is my opportunity to take one more step toward becoming a stronger open-source developer, and I’m excited to work on something I can be proud of.

Key Elements of an Effective Leadership and Motivation Plan

2025-12-13 03:02:12

An effective leadership and motivation plan includes a clear vision, well-defined goals, and processes for communication and feedback. The plan must also specify how leaders will recognize and reward performance, develop team skills, and address potential challenges. A strong connection between leadership behaviors and motivational strategies ensures that employees feel supported and encouraged. When leaders understand what inspires their team members, they can tailor their approach to maximize engagement. This alignment between leadership actions and motivation principles strengthens team cohesion and builds a culture of excellence.

Day 7: Trading Leetcode for ML

2025-12-13 02:57:11

Small Wins

Woke up at 11 AM instead of my usual 12. An hour earlier. Yeah I'm counting that as progress because when you're trying to fix your sleep schedule, you take what you can get.

The Leetcode Dilemma

Did a revision problem on leetcode today but I'm seriously considering dropping it for a bit. Here's the thing - I'm so behind on my ML schedule and I can't do everything perfectly. Something has to give.

Leetcode is important for interviews and problem-solving skills, sure. But right now ML is where I need to focus. Sometimes you gotta make strategic decisions about what to sacrifice temporarily. Maybe I'll come back to it, maybe the streak breaks. We'll see.

Logistic Regression and Documentation

Got into logistic regression today. Read through examples on the scikit learn documentation. I'm trying to actually understand what's happening under the hood instead of just copying code and hoping it works.

That's the trap with ML - it's easy to import a model, fit it to data, and call it done. But if you don't understand what logistic regression is actually doing, how it differs from linear regression, when to use it - you're just a code monkey, not someone who actually knows ML.

Thinking about checking out the California housing dataset question tomorrow. Or maybe not. Depends on how much I can catch up.

LinkedIn Posting Now?

Posted something on LinkedIn today: https://www.linkedin.com/posts/somay-kousis-630ab1313_smartindiahackathon-sih2025-teamwork-activity-7405310023767154689-p_iN?utm_source=social_share_send&utm_medium=member_desktop_web&rcm=ACoAAE-37UQBKy4jUXKIZLL50F1J2QdJ5Y6WyPU

Didn't think I'd become the type to post on LinkedIn but here we are. Building in public means actually being public about it, even on the corporate social network.

Arms and Dreading Leg Day

Trained arms today at the gym. Tomorrow is leg day and I'm already not looking forward to it. Leg days are always brutal but that's part of the deal. You can't just train the muscles you like and ignore the ones you don't.

Same principle applies to learning actually. Can't just do the fun parts and skip the fundamentals that feel boring.

Behind But Moving

Day 7 done. Behind schedule, making tough choices about priorities, still showing up.

Not every day is gonna be perfect. Sometimes you're just trying to minimize damage and keep momentum going.

Modernizing Azure Workbooks - Taking Billy York's Inventory from 50 to 200+ Services

2025-12-13 02:56:22

The Problem with Azure Inventory

Azure Portal: Shows resources one subscription at a time

Need: See ALL resources across 44 subscriptions

Billy York's solution: Azure Monitor Workbook with Resource Graph queries

Problem: Only covers ~50 Azure services. Azure has 200+.

What Billy York Built (And Why It's Great)

Original workbook:

  • Queries Azure Resource Graph
  • Shows VMs, storage, networking
  • Organized by resource type
  • Open source on GitHub

Why it's excellent:

  • Actually works (many don't)
  • Clean UI
  • Copy-paste KQL queries
  • Free

Why it needs enhancement:

  • Missing 150+ services
  • No security hygiene checks
  • No cost context
  • Manual updates for new Azure services

What We Added

150+ Additional Services

Original: VMs, Storage, VNets, NSGs, Load Balancers

Added:

  • Azure AI (OpenAI, Cognitive Services, ML)
  • Databases (SQL, Cosmos, PostgreSQL, MySQL)
  • Integration (Logic Apps, Service Bus, Event Grid)
  • Security (Key Vault, Defender, Sentinel)
  • Monitoring (Application Insights, Log Analytics)
  • Arc (Hybrid servers, Kubernetes)

Total: 200+ service types

Security Hygiene Checks

Query for public-facing resources:

Resources
| where type =~ 'microsoft.compute/virtualmachines'
| extend hasPublicIP = isnotnull(properties.networkProfile.networkInterfaces[0].properties.ipConfigurations[0].properties.publicIPAddress)
| where hasPublicIP == true
| project name, resourceGroup, location

Query for unencrypted storage:

Resources
| where type =~ 'microsoft.storage/storageaccounts'
| where properties.encryption.services.blob.enabled != true
| project name, resourceGroup, location

Query for expired certificates:

Resources
| where type =~ 'microsoft.keyvault/vaults/certificates'
| extend expiry = todatetime(properties.attributes.exp)
| where expiry < now() + 30d
| project name, expiry, resourceGroup

Cost Context

Added cost data to resource views:

Resources
| where type =~ 'microsoft.compute/virtualmachines'
| extend vmSize = tostring(properties.hardwareProfile.vmSize)
| join kind=leftouter (
    CostManagementExports
    | summarize MonthlyCost = sum(Cost) by ResourceId
) on $left.id == $right.ResourceId
| project name, vmSize, MonthlyCost, resourceGroup

Global Filters

Original: Filter per-section

Enhanced: Global subscription/resource group filter applies to ALL sections

Implementation:

{
  "type": "dropdown",
  "name": "Subscriptions",
  "query": "ResourceContainers | where type == 'microsoft.resources/subscriptions' | project name, subscriptionId",
  "isMultiSelect": true
}

Result: Select subscriptions once, affects entire workbook

The Enhancement Process

Step 1: Clone Billy York's Repo

git clone https://github.com/scautomation/Azure-Inventory-Workbook

Step 2: Identify Missing Services

Query all resource types:

Resources
| distinct type
| order by type asc

Compare to workbook: Find gaps

Step 3: Add Service Sections

Template for new section:

{
  "type": "section",
  "title": "Azure OpenAI",
  "query": "Resources | where type =~ 'microsoft.cognitiveservices/accounts' | where kind == 'OpenAI' | project name, sku.name, location, resourceGroup"
}

Step 4: Add Security Checks

For each service, add:

  • Public exposure check
  • Encryption status
  • Certificate expiration
  • Compliance flags

Step 5: Add Cost Columns

Join cost data to resource queries:

Resources
| where type =~ '[service-type]'
| join kind=leftouter (
    CostManagementExports
    | where TimeGenerated > ago(30d)
    | summarize MonthlyCost = sum(Cost) by ResourceId
) on $left.id == $right.ResourceId

Real Example: SQL Databases

Original section (basic):

Resources
| where type =~ 'microsoft.sql/servers/databases'
| project name, resourceGroup, location

Enhanced section (with security + cost):

Resources
| where type =~ 'microsoft.sql/servers/databases'
| extend 
    serverName = split(id, '/')[8],
    tier = properties.sku.tier,
    encrypted = properties.transparentDataEncryption.status,
    publicAccess = properties.publicNetworkAccess
| join kind=leftouter (
    CostManagementExports
    | where TimeGenerated > ago(30d)
    | summarize MonthlyCost = sum(Cost) by ResourceId
) on $left.id == $right.ResourceId
| project 
    Database = name, 
    Server = serverName,
    Tier = tier,
    Encrypted = encrypted,
    PublicAccess = publicAccess,
    MonthlyCost = round(MonthlyCost, 2),
    ResourceGroup = resourceGroup,
    Location = location
| order by MonthlyCost desc

Result:

  • Shows SQL databases
  • Security status (encryption, public access)
  • Monthly cost
  • Sorted by expense

Performance Optimization

Problem: Workbook Timeout

Original: Single massive query for all subscriptions

Enhanced: Paginated queries with limits

Resources
| where type =~ 'microsoft.compute/virtualmachines'
| take 1000  // Pagination

Problem: Slow Joins

Original: Join every resource to cost data

Enhanced: Pre-aggregate cost data

// Pre-aggregate costs
let costs = CostManagementExports
| where TimeGenerated > ago(30d)
| summarize MonthlyCost = sum(Cost) by ResourceId;

// Then join
Resources
| where type =~ 'microsoft.compute/virtualmachines'
| join kind=leftouter costs on $left.id == $right.ResourceId

UI/UX Improvements

Conditional Visibility

Only show sections with resources:

{
  "conditionalVisibility": {
    "parameterName": "HasOpenAI",
    "comparison": "isEqualTo",
    "value": "true"
  }
}

Color Coding

Red: Security issues (public access, unencrypted)
Yellow: Warnings (expiring certs, high cost)
Green: Compliant resources

Export Functionality

Added: Export to CSV for each section

{
  "type": "button",
  "action": "export",
  "format": "csv"
}

Deployment

Option 1: Import JSON

  1. Go to Azure Monitor → Workbooks
  2. Click "New"
  3. Click "Advanced Editor"
  4. Paste enhanced JSON
  5. Save

Option 2: ARM Template

{
  "type": "Microsoft.Insights/workbooks",
  "apiVersion": "2021-03-08",
  "name": "[guid('azure-inventory-enhanced')]",
  "location": "[resourceGroup().location]",
  "properties": {
    "displayName": "Azure Inventory Enhanced",
    "serializedData": "[parameters('workbookContent')]"
  }
}

Deploy with:

az deployment group create --resource-group Monitoring-RG --template-file workbook.json

Real Results

Before (Billy York original):

  • 50 service types
  • No security context
  • No cost data
  • Good for small environments

After (enhanced):

  • 200+ service types
  • Security hygiene checks
  • Cost context
  • Production-ready for enterprise

Time to generate inventory:

  • Before: Multiple tools, 2 hours
  • After: Single workbook, 30 seconds

Community Contribution

Billy York's original: https://github.com/scautomation/Azure-Inventory-Workbook

Our enhancements: Fork + pull request with:

  • 150+ additional services
  • Security checks
  • Cost integration
  • Performance fixes

Attribution: Billy York deserves credit for building the foundation. We just scaled it.

Full Enhanced Workbook

Complete workbook JSON, deployment templates, and contribution guide:

👉 Enhanced Azure Inventory Workbook

Also on GitHub: [github.com/dswann101164/azure-inventory-workbook-enhanced]

Using Azure Workbooks? Start with community workbooks like Billy York's, then enhance for your needs. Don't build from scratch—extend what works.