<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Divine Ikhuoria</title>
    <description>The latest articles on Forem by Divine Ikhuoria (@divuzki).</description>
    <link>https://forem.com/divuzki</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F909107%2Fc76c3461-5105-461d-a520-d4b25f562485.jpg</url>
      <title>Forem: Divine Ikhuoria</title>
      <link>https://forem.com/divuzki</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/divuzki"/>
    <language>en</language>
    <item>
      <title>What a Software Engineer Should Learn Next Year to Become a Powerhouse</title>
      <dc:creator>Divine Ikhuoria</dc:creator>
      <pubDate>Wed, 31 Dec 2025 20:33:40 +0000</pubDate>
      <link>https://forem.com/divuzki/what-a-software-engineer-should-learn-next-year-to-become-a-powerhouse-2iol</link>
      <guid>https://forem.com/divuzki/what-a-software-engineer-should-learn-next-year-to-become-a-powerhouse-2iol</guid>
      <description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; A practical, beginner-friendly roadmap for software engineers (early to mid-career) who want to become high-impact, reliable, and technically versatile engineers within a year.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;If you want to become a powerhouse engineer next year, focus on three pillars: &lt;strong&gt;foundations&lt;/strong&gt;, &lt;strong&gt;systems &amp;amp; production skills&lt;/strong&gt;, and &lt;strong&gt;project-driven learning&lt;/strong&gt;. Build a compact 12-month roadmap that mixes deep study (algorithms, systems design), practical infra and cloud skills (CI/CD, observability), and portfolio projects that demonstrate end-to-end ownership. Complement technical work with communication, product thinking, and a weekly review habit.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to use this guide
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Read the high-level roadmap below and pick the tracks that match your role (backend, frontend, full-stack, infra, ML).&lt;/li&gt;
&lt;li&gt;Pick one major project you will complete in 12 weeks and three small focused mini-projects (2–4 weeks each).&lt;/li&gt;
&lt;li&gt;Block recurring time: 3–5 focused hours/week for deliberate practice + 1 longer weekend block (4–8 hours) for deep work.&lt;/li&gt;
&lt;li&gt;Measure progress with concrete deliverables: PR reviews, production deployments, interview-style problems solved, and a public portfolio.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Pillar 1 — Fundamentals (first 2–3 months)
&lt;/h2&gt;

&lt;p&gt;Why: Strong fundamentals let you learn new frameworks faster and reason about trade-offs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core topics&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data structures &amp;amp; algorithms&lt;/strong&gt;: arrays, hash maps, trees, graphs, sorting, basic dynamic programming. Aim to be comfortable with common patterns used in interviews and real-world problems (sliding window, two pointers, BFS/DFS, hash-based grouping).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Computer systems basics&lt;/strong&gt;: networking (HTTP, TCP), processes &amp;amp; threads, memory basics, I/O, how the OS schedules work. This helps when you debug latency or concurrency problems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Databases&lt;/strong&gt;: relational fundamentals (ACID, indexes, joins), basic query optimization, and a high-level view of NoSQL trade-offs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language mastery&lt;/strong&gt;: pick one main language to master (Python, JavaScript/TypeScript, Go, or Java). Understand idiomatic patterns and the standard library.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Practical outputs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solve 4–6 representative algorithmic problems per week (use time-boxed sessions).&lt;/li&gt;
&lt;li&gt;Build a small CLI or utility in your main language that parses files, does simple transformations, and uses tests.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Pillar 2 — Systems &amp;amp; Production Skills (months 3–7)
&lt;/h2&gt;

&lt;p&gt;Why: Being able to ship reliable systems and debug them in production is what separates junior engineers from powerhouses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Topics to learn&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Version control &amp;amp; Git workflows&lt;/strong&gt;: feature branches, PR best practices, rebasing vs merge commits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker &amp;amp; containers&lt;/strong&gt;: build images, run containers locally, debug them, and understand layering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD pipelines&lt;/strong&gt;: create a pipeline that runs tests, builds artifacts, and deploys to a staging environment (GitHub Actions, GitLab CI, or similar).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud basics&lt;/strong&gt;: learn one cloud provider (AWS, GCP, or Azure). Understand compute (EC2/GKE/Cloud Run), object storage (S3), managed DBs, and IAM basics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt;: logs, metrics, traces. Integrate basic monitoring and an error tracking system (Sentry, Prometheus + Grafana). Learn how to instrument an app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scaling basics&lt;/strong&gt;: caching (Redis), connection pooling, database indexes, and a basic queue system (Celery, Sidekiq, or cloud-native queues).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security hygiene&lt;/strong&gt;: secrets management, HTTPS, input validation, and authentication basics (OAuth/JWT patterns).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Practical outputs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dockerize your main project and run it locally with Compose.&lt;/li&gt;
&lt;li&gt;Create a CI pipeline that runs tests and lints on PRs.&lt;/li&gt;
&lt;li&gt;Deploy your app to a cloud service (use a small free tier) with at least one automated deploy target.&lt;/li&gt;
&lt;li&gt;Add basic observability (structured logs and one metric), and create an alert rule for a production-like error.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Pillar 3 — Product &amp;amp; Design Thinking (continuous)
&lt;/h2&gt;

&lt;p&gt;Why: Powerhouse engineers understand product trade-offs and ship work that moves business goals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read product requirements and distill them into actionable engineering tasks.&lt;/li&gt;
&lt;li&gt;Prioritize work using effort vs value.&lt;/li&gt;
&lt;li&gt;Learn to scope MVPs and iterate quickly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Practical outputs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take ownership of a feature end-to-end: design, implement, test, deploy, and monitor for 1–2 sprints.&lt;/li&gt;
&lt;li&gt;Write a short postmortem for at least one intentional experiment or a failed attempt (what you learned; what you’d change).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tracks &amp;amp; Specializations (choose 1–2)
&lt;/h2&gt;

&lt;p&gt;Each track lists essential tools and a 12-week mini-project idea.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend / Systems
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Learn:&lt;/strong&gt; HTTP internals, REST &amp;amp; GraphQL design, Postgres tuning, Redis, message queues, background processing, observability, Go or Rust basics (optional).&lt;br&gt;
&lt;strong&gt;Project:&lt;/strong&gt; Build a small marketplace backend with user auth, product listings, background order processing, and metrics dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend / UX
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Learn:&lt;/strong&gt; JavaScript/TypeScript, modern frameworks (React / Solid / Svelte), component design, performance optimization, accessibility (a11y).&lt;br&gt;
&lt;strong&gt;Project:&lt;/strong&gt; Build a responsive, accessible storefront with client-side caching and an offline-capable PWA.&lt;/p&gt;

&lt;h3&gt;
  
  
  DevOps / Platform
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Learn:&lt;/strong&gt; Terraform/CloudFormation, Kubernetes basics, CI/CD as code, monitoring/alerting, service meshes (intro).&lt;br&gt;
&lt;strong&gt;Project:&lt;/strong&gt; Provision infra for a 3-service application with IaC, deploy it to a managed Kubernetes cluster, and set up automated rollbacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data / ML Engineer (intro)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Learn:&lt;/strong&gt; SQL at scale, data pipelines (Airflow), basic ML model lifecycle, feature stores, and model serving.&lt;br&gt;
&lt;strong&gt;Project:&lt;/strong&gt; Build a simple ETL pipeline that ingests CSV data, transforms it, stores it in a warehouse, and produces a simple predictive model served via an API.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tooling &amp;amp; Workflow (must-haves)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Git + code reviews&lt;/strong&gt;: set a personal standard for PR size, tests, and descriptive messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated tests&lt;/strong&gt;: unit tests, integration tests, and one end-to-end test per critical flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static analysis&lt;/strong&gt;: linters and type checkers (mypy / TypeScript).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: keep README, runbooks, and architecture notes short and up to date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time management&lt;/strong&gt;: adopt a weekly review and planning ritual (retro + next-week goals).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Soft skills &amp;amp; leadership (continuous)
&lt;/h2&gt;

&lt;p&gt;Powerhouse engineers are not only technical: they influence, mentor, and communicate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills to practice&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear, succinct code reviews and design write-ups.&lt;/li&gt;
&lt;li&gt;Mentorship: teach a junior or write a technical explainer.&lt;/li&gt;
&lt;li&gt;Stakeholder communication: status updates and trade-off explanations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Practical outputs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lead a brown-bag session or a 30-min lunch-and-learn.&lt;/li&gt;
&lt;li&gt;Pair-program on a feature and write a short follow-up note documenting lessons.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Learning schedule (12 months — suggested cadence)
&lt;/h2&gt;

&lt;p&gt;Quarter 1 (months 1–3): Fundamentals, personal language mastery, and algorithms.&lt;br&gt;
Quarter 2 (months 4–6): Systems &amp;amp; production — Docker, CI/CD, cloud basics, deploy a first project.&lt;br&gt;
Quarter 3 (months 7–9): Deep specialization track project, observability, security basics.&lt;br&gt;
Quarter 4 (months 10–12): Polishing, portfolio, interview prep, leadership, and a capstone project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weekly time budget example&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3–5 hours of focused study during weekdays (3x 1–1.5 hour sessions).&lt;/li&gt;
&lt;li&gt;4–8 hours of weekend deep work (project coding, design, deploy).&lt;/li&gt;
&lt;li&gt;30–60 minutes weekly retrospective and planning.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Project examples (portfolio-ready)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Full-stack marketplace&lt;/strong&gt;: user auth, product listings, payment mock, order queue, admin panel, one observability dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PWA storefront&lt;/strong&gt;: offline support, client-side caching, native-like install flow, and accessibility audit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data pipeline + model&lt;/strong&gt;: ingest -&amp;gt; transform -&amp;gt; store -&amp;gt; train -&amp;gt; serve.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each project should be live (deployed) and have a minimal README that explains the architecture, trade-offs, and how to run locally.&lt;/p&gt;




&lt;h2&gt;
  
  
  Interview &amp;amp; hiring readiness
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Practice 2–3 algorithm problems per week (time-boxed).&lt;/li&gt;
&lt;li&gt;Do 2–3 mock system-design sessions (45–60 minutes) per month for large features.&lt;/li&gt;
&lt;li&gt;Keep a short folder of your best PRs and design docs to show interviewers.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to measure progress (KPIs)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Number of production deployments and features completed.&lt;/li&gt;
&lt;li&gt;Mean time to detect (MTTD) and mean time to recover (MTTR) for incidents in your project.&lt;/li&gt;
&lt;li&gt;Number of code reviews performed and mentorship sessions given.&lt;/li&gt;
&lt;li&gt;Completed projects (&amp;gt;= 2) deployed and documented in your portfolio.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Focus on &lt;strong&gt;depth + breadth&lt;/strong&gt;: be deep enough in one stack to ship confidently and broad enough to understand cross-cutting concerns.&lt;/li&gt;
&lt;li&gt;Learn by building: every topic should feed into a production-capable project.&lt;/li&gt;
&lt;li&gt;Keep a weekly habit and a quarterly capstone — that combination produces the consistent, compounding growth that turns a good engineer into a powerhouse.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>career</category>
      <category>softwareengineering</category>
      <category>learning</category>
      <category>ai</category>
    </item>
    <item>
      <title>Scaling Django on Railway + S3 + Cloudflare for 1k+ concurrent users</title>
      <dc:creator>Divine Ikhuoria</dc:creator>
      <pubDate>Wed, 31 Dec 2025 16:47:07 +0000</pubDate>
      <link>https://forem.com/divuzki/scaling-django-on-railway-s3-cloudflare-for-1k-concurrent-users-2kjf</link>
      <guid>https://forem.com/divuzki/scaling-django-on-railway-s3-cloudflare-for-1k-concurrent-users-2kjf</guid>
      <description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Provide a practical, beginner-friendly, step-by-step guide to prepare a Django app (deployed on Railway) with S3 for static/media and Cloudflare as the CDN/edge, so it can reliably handle sustained peaks of ~1000 concurrent users.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;TL;DR — One-page checklist&lt;/li&gt;
&lt;li&gt;Clarifications &amp;amp; assumptions&lt;/li&gt;
&lt;li&gt;Measure before you optimize&lt;/li&gt;
&lt;li&gt;Static files &amp;amp; media — S3 + Cloudflare (how &amp;amp; why)&lt;/li&gt;
&lt;li&gt;Database: Postgres, connection pooling &amp;amp; query tuning&lt;/li&gt;
&lt;li&gt;Caching strategy (Redis + patterns)&lt;/li&gt;
&lt;li&gt;Background jobs &amp;amp; throttling (Celery etc.)&lt;/li&gt;
&lt;li&gt;Web concurrency &amp;amp; process sizing (Gunicorn / Uvicorn)&lt;/li&gt;
&lt;li&gt;Cloudflare configuration &amp;amp; edge logic&lt;/li&gt;
&lt;li&gt;Observability &amp;amp; debugging essentials&lt;/li&gt;
&lt;li&gt;Cost control tips&lt;/li&gt;
&lt;li&gt;Rollout plan: 10 → 1000 concurrent users (step-by-step)&lt;/li&gt;
&lt;li&gt;Common pitfalls &amp;amp; how to avoid them&lt;/li&gt;
&lt;li&gt;Recommended resources &amp;amp; docs&lt;/li&gt;
&lt;li&gt;Appendix: Useful config snippets&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  TL;DR — One-page checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Measure realistic flows and determine p95/p99 latencies.&lt;/li&gt;
&lt;li&gt;Offload static and media to S3 and cache them at Cloudflare edge.&lt;/li&gt;
&lt;li&gt;Add a Redis instance and use &lt;code&gt;django-redis&lt;/code&gt; for caches; use a separate Redis for Celery broker if needed.&lt;/li&gt;
&lt;li&gt;Use Postgres + PgBouncer (or your provider's pooling) to avoid connection storms.&lt;/li&gt;
&lt;li&gt;Move slow work to background workers (Celery/RQ/Huey) and scale workers independently.&lt;/li&gt;
&lt;li&gt;Tune Django process concurrency to available CPU/memory.&lt;/li&gt;
&lt;li&gt;Configure Cloudflare rules to bypass API/authenticated routes and cache public assets aggressively.&lt;/li&gt;
&lt;li&gt;Add observability (Sentry + metrics + logs) and run iterative load tests.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Clarifications &amp;amp; assumptions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Concurrent users vs daily active users:&lt;/strong&gt; "1000 concurrent users" means approximately 1000 simultaneous active connections or users at peak. This requires more capacity and different trade-offs than 1000 daily active users. Verify which you mean before provisioning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assumptions for this guide:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Django app hosted on Railway (or similar PaaS).&lt;/li&gt;
&lt;li&gt;Postgres database (Railway or external).&lt;/li&gt;
&lt;li&gt;S3-compatible object storage (AWS S3 recommended).&lt;/li&gt;
&lt;li&gt;Cloudflare as DNS + CDN in front of Railway.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Measure before you optimize
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Optimization without measurements is guesswork. Know your bottlenecks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concrete steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify a realistic user flow and script it (e.g., &lt;code&gt;browse catalog -&amp;gt; open product -&amp;gt; add to cart -&amp;gt; checkout&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Use load-test tools: &lt;code&gt;k6&lt;/code&gt;, &lt;code&gt;Locust&lt;/code&gt;, or &lt;code&gt;hey&lt;/code&gt; to simulate realistic traffic and think about pacing (think time between actions).&lt;/li&gt;
&lt;li&gt;Collect these metrics:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Request rate (RPS)&lt;/li&gt;
&lt;li&gt;p50/p95/p99 latencies for endpoints&lt;/li&gt;
&lt;li&gt;Error rates&lt;/li&gt;
&lt;li&gt;DB queries/sec and top slow queries&lt;/li&gt;
&lt;li&gt;DB CPU and active connections&lt;/li&gt;
&lt;li&gt;Redis hit/miss rate and eviction counts&lt;/li&gt;
&lt;li&gt;Celery queue length and task durations

&lt;ol&gt;
&lt;li&gt;Define SLOs: for example p95 &amp;lt; 300ms, error rate &amp;lt; 0.5%.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Start small, run tests, then increase RPS until you find the bottleneck and address it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Static files &amp;amp; media — S3 + Cloudflare (how &amp;amp; why)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serving static or uploaded files from your web dyno consumes CPU, memory, and bandwidth and increases origin response times. S3 + Cloudflare moves those costs to object storage and the CDN.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best-practices&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compile/build assets with hashed filenames (cache-busting by content hash).&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;Cache-Control: public, max-age=31536000, immutable&lt;/code&gt; for hashed build assets.&lt;/li&gt;
&lt;li&gt;Use presigned uploads so clients upload directly to S3 (web dyno never handles large file bodies).&lt;/li&gt;
&lt;li&gt;Use S3 lifecycle policies to move infrequently accessed objects to cheaper classes (Infrequent Access, Glacier).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Presigned POST example (Django DRF view)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# uploads/views.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.conf&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rest_framework.decorators&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;api_view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;permission_classes&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rest_framework.permissions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;IsAuthenticated&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rest_framework.response&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Response&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;

&lt;span class="nd"&gt;@api_view&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nd"&gt;@permission_classes&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;IsAuthenticated&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;presign_upload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AWS_REGION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uploads/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;presigned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_presigned_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Bucket&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AWS_STORAGE_BUCKET_NAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image/jpeg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;Conditions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image/jpeg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;ExpiresIn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;presigned&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fields&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;presigned&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fields&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security notes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate file types and sizes with S3 conditions and client-side checks.&lt;/li&gt;
&lt;li&gt;Use server-side virus scanning or processing for untrusted uploads if required in your domain.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Database — Postgres + connection pooling + query tuning
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problems to avoid&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large numbers of concurrent DB connections cause memory and CPU strain on the DB server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Connection pooling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use PgBouncer (transaction pooling) in front of Postgres to multiplex many client connections to fewer DB backends. If your code relies on session-level state (e.g., &lt;code&gt;SET&lt;/code&gt; commands), use session pooling but size accordingly.&lt;/li&gt;
&lt;li&gt;Configure Django with &lt;code&gt;CONN_MAX_AGE = 60&lt;/code&gt; (or tuned value) to reuse TCP connections.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Query &amp;amp; index hygiene&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add indexes on frequently-filtered/sorted fields (e.g., &lt;code&gt;vendor_id&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;created_at&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;select_related()&lt;/code&gt; for foreign-key single-object joins and &lt;code&gt;prefetch_related()&lt;/code&gt; for M2M or reverse relationships.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;pg_stat_statements&lt;/code&gt; or your host’s slow-query logging to find top offenders.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sizing guidance&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estimate: (max web concurrency) * (avg DB connections per request) to plan pool sizes.&lt;/li&gt;
&lt;li&gt;Let PgBouncer reduce backend connections, but still monitor &lt;code&gt;pg_stat_activity&lt;/code&gt; to detect connection pressure.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Caching strategy (Redis + patterns)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Redis usages&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Django cache backend (&lt;code&gt;django-redis&lt;/code&gt;) for page fragments and small objects.&lt;/li&gt;
&lt;li&gt;Rate-limiting counters and session caching (if you choose not to use DB-backed sessions).&lt;/li&gt;
&lt;li&gt;Celery broker (or dedicated broker) — for high-volume systems, consider a separate Redis instance for broker vs cache to avoid contention.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example &lt;code&gt;CACHES&lt;/code&gt; config&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;CACHES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;default&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BACKEND&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;django_redis.cache.RedisCache&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LOCATION&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;REDIS_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPTIONS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CLIENT_CLASS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;django_redis.client.DefaultClient&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PARSER_CLASS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;redis.connection.HiredisParser&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cache key design&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use versioned keys for easy invalidation: e.g., &lt;code&gt;menu:vendor:{id}:v{version}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cache only what you can invalidate or can tolerate stale values for. For critical, near-real-time content (order status), prefer short TTLs or event-driven invalidation.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Background jobs &amp;amp; throttling (Celery, RQ, etc.)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What to push to background workers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emails, PDF generation, image processing, payouts, and long webhooks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Minimal Celery example&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# celery.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;__future__&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;absolute_import&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;celery&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Celery&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;DJANGO_SETTINGS_MODULE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;myproject.settings&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Celery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;myproject&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config_from_object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;django.conf:settings&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CELERY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;autodiscover_tasks&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Worker tuning tips&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;task_acks_late = True&lt;/code&gt; for safer retries (ensure idempotency).&lt;/li&gt;
&lt;li&gt;Start with conservative &lt;code&gt;concurrency&lt;/code&gt; (2–4) and scale horizontally by running more worker processes as needed.&lt;/li&gt;
&lt;li&gt;Protect heavy endpoints with rate-limiting using DRF throttling, Cloudflare rate limits, or an API gateway.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Web concurrency &amp;amp; process sizing (Gunicorn / Uvicorn)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Basic rules&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For synchronous Gunicorn workers, a common starting heuristic is &lt;code&gt;workers = 2 * CPU + 1&lt;/code&gt; — then tune downward/upward based on memory and throughput.&lt;/li&gt;
&lt;li&gt;For async needs (WebSockets or many concurrent idle connections), prefer ASGI (&lt;code&gt;uvicorn&lt;/code&gt;) with fewer workers and async event loop (uvloop).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gunicorn (synchronous + threads):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gunicorn myproject.wsgi:application &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--workers&lt;/span&gt; 3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--threads&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timeout&lt;/span&gt; 30 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bind&lt;/span&gt; 0.0.0.0:&lt;span class="nv"&gt;$PORT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uvicorn (ASGI — for WebSockets/async):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvicorn myproject.asgi:application &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; &lt;span class="nv"&gt;$PORT&lt;/span&gt; &lt;span class="nt"&gt;--workers&lt;/span&gt; 1 &lt;span class="nt"&gt;--loop&lt;/span&gt; uvloop &lt;span class="nt"&gt;--ws&lt;/span&gt; websockets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Memory considerations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each worker is a process and consumes memory. On small Railway dynos (e.g., 512MB), prefer 1–2 workers and rely on horizontal scaling instead of packing many workers into a single small instance.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Cloudflare configuration &amp;amp; edge logic
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Caching rules&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use Cloudflare Cache Rules to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bypass cache for paths like &lt;code&gt;/api/*&lt;/code&gt;, &lt;code&gt;/admin/*&lt;/code&gt;, and requests containing Authorization headers or session cookies.&lt;/li&gt;
&lt;li&gt;Cache public assets aggressively using long TTLs and content-hashed filenames.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Edge features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloudflare Workers let you run light logic at the edge (A/B tests, redirects, personalization) without hitting the origin.&lt;/li&gt;
&lt;li&gt;Use Tiered Cache to reduce origin requests for global traffic.&lt;/li&gt;
&lt;li&gt;Use Cloudflare rate-limiting and WAF rules to mitigate abusive traffic.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Observability &amp;amp; debugging essentials
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Minimum stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Error tracking: Sentry for exceptions and performance traces.&lt;/li&gt;
&lt;li&gt;Logs: central log aggregator (Papertrail, LogDNA, or your hosted solution).&lt;/li&gt;
&lt;li&gt;Metrics: track RPS, latency, DB connections, Redis hit rate, worker queue lengths. Use Prometheus/Grafana or a hosted metrics provider.&lt;/li&gt;
&lt;li&gt;Uptime: health endpoints and external monitors (UptimeRobot, Pingdom).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Health check endpoint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Provide a lightweight &lt;code&gt;/health&lt;/code&gt; that checks DB and Redis connectivity and returns a simple JSON 200/500 so load balancers and monitors can check service health.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cost control tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use Cloudflare free tier for DNS and basic CDN functionality — it reduces bandwidth to the origin.&lt;/li&gt;
&lt;li&gt;Use S3 lifecycle policies to archive infrequently accessed media to cheaper storage tiers.&lt;/li&gt;
&lt;li&gt;Right-size Railway services; scale workers only when the queue length or CPU indicates the need.&lt;/li&gt;
&lt;li&gt;Avoid proxying uploads through web dynos and avoid storing blobs in your DB.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Rollout plan: 10 → 1000 concurrent users (step-by-step)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Baseline: Integrate Sentry, basic metrics, and logging. Add &lt;code&gt;/healthz&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Move build assets &amp;amp; static files to S3. Put Cloudflare in front and confirm cache hit rates.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Add Redis and implement fragment/full-page caching for public content.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Switch to presigned uploads for user media.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Enable PgBouncer or provider-managed pooling. Tune &lt;code&gt;CONN_MAX_AGE&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Move slow tasks to Celery/RQ and set worker scaling rules.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Run iterative load tests (k6/Locust). Monitor DB, Redis, and worker metrics.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Harden Cloudflare (cache bypass for API, rate limits, firewall rules).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Optimize top slow queries discovered during tests.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Repeat measurement and optimization cycles.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Common pitfalls &amp;amp; how to avoid them
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Too many DB connections:&lt;/strong&gt; Use PgBouncer; monitor &lt;code&gt;pg_stat_activity&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching authenticated content accidentally:&lt;/strong&gt; Use cache-bypass rules for private routes and Authorization headers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxying uploads through web dyno:&lt;/strong&gt; Use presigned uploads to protect dyno memory and requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ignoring observability:&lt;/strong&gt; Add Sentry and metrics early. You cannot optimize what you do not measure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Underestimating memory per worker:&lt;/strong&gt; Test and monitor memory footprints before scaling worker counts.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Recommended resources &amp;amp; docs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Railway documentation for deploying Django and managing services.&lt;/li&gt;
&lt;li&gt;PostgreSQL and PgBouncer docs for connection pooling best practices.&lt;/li&gt;
&lt;li&gt;Cloudflare docs: Cache Rules, Workers, Tiered Cache, and rate-limiting.&lt;/li&gt;
&lt;li&gt;Boto3 docs for &lt;code&gt;generate_presigned_post&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Django ASGI / Uvicorn documentation for async features and websockets.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Appendix: Useful config snippets
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Django settings (snippets)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# settings.py (excerpt)
&lt;/span&gt;&lt;span class="n"&gt;CONN_MAX_AGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
&lt;span class="n"&gt;CACHES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# django-redis example
&lt;/span&gt;&lt;span class="n"&gt;DEFAULT_FILE_STORAGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;storages.backends.s3boto3.S3Boto3Storage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;AWS_S3_REGION_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AWS_REGION&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;AWS_STORAGE_BUCKET_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AWS_STORAGE_BUCKET_NAME&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Procfile (Railway style)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web: gunicorn myproject.wsgi:application --bind 0.0.0.0:$PORT --workers 3 --threads 2 --timeout 30
worker: celery -A myproject worker --loglevel=info --concurrency=${CELERY_CONCURRENCY:-2}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Celery minimal config&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# celery.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;celery&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Celery&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;DJANGO_SETTINGS_MODULE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;myproject.settings&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Celery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;myproject&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config_from_object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;django.conf:settings&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CELERY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;autodiscover_tasks&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Gunicorn start example&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gunicorn myproject.wsgi:application &lt;span class="nt"&gt;--workers&lt;/span&gt; 3 &lt;span class="nt"&gt;--threads&lt;/span&gt; 2 &lt;span class="nt"&gt;--timeout&lt;/span&gt; 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Scaling to 1k+ concurrent users is iterative: measure realistic flows, remove origin bottlenecks, offload work to caches and background processes, and protect the origin with Cloudflare. With Railway + S3 + Cloudflare, you can build an efficient, cost-effective stack — but success depends on careful DB pooling, cache boundaries, worker sizing, and continuous measurement.&lt;/p&gt;

</description>
      <category>django</category>
      <category>performance</category>
      <category>cloudflarechallenge</category>
      <category>aws</category>
    </item>
    <item>
      <title>The Importance of Learning Data Structures &amp; Algorithms</title>
      <dc:creator>Divine Ikhuoria</dc:creator>
      <pubDate>Fri, 08 Sep 2023 06:43:20 +0000</pubDate>
      <link>https://forem.com/divuzki/the-importance-of-learning-data-structures-algorithms-4cna</link>
      <guid>https://forem.com/divuzki/the-importance-of-learning-data-structures-algorithms-4cna</guid>
      <description>&lt;p&gt;In the ever-evolving field of computer science and software development, one fundamental concept continues to hold its significance - data structures and algorithms. Whether you are a student, a full-stack software developer, or the CEO of a tech startup like &lt;a href="https://www.trayfoods.com/" rel="noopener noreferrer"&gt;TrayFoods Enterprise&lt;/a&gt;, understanding the importance of data structures and algorithms is crucial for success in the world of technology. In this article, we'll explore why learning data structures and algorithms is essential and provide a real-world Python example to illustrate their practical use.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;strong&gt;Efficiency Matters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Efficiency is at the core of computer science and software development. When you write code, you want it to run as fast and as smoothly as possible. Data structures and algorithms play a pivotal role in achieving this efficiency. By learning how to choose the right data structure for a specific task and implement efficient algorithms, you can significantly optimize your code.&lt;/p&gt;

&lt;p&gt;For example, when &lt;a href="https://www.trayfoods.com/" rel="noopener noreferrer"&gt;TrayFoods Enterprise&lt;/a&gt; processes thousands of food orders from students, having efficient data structures and algorithms ensures that orders are handled swiftly, improving user experience and reducing operational costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. &lt;strong&gt;Problem-Solving Skills&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Learning data structures and algorithms is like sharpening your problem-solving skills. These concepts teach you how to break down complex problems into smaller, more manageable parts. By developing the ability to think algorithmically, you become a more effective problem solver, not just in coding but also in everyday life.&lt;/p&gt;

&lt;p&gt;As a student, these problem-solving skills can help you excel in coursework, while as a software developer, they enable you to tackle real-world challenges more effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. &lt;strong&gt;Scalability&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Scalability is a critical concern for any software application, especially for a platform like &lt;a href="https://www.trayfoods.com/" rel="noopener noreferrer"&gt;TrayFoods Enterprise&lt;/a&gt;, which aims to serve a growing user base. Data structures and algorithms allow you to build scalable solutions that can handle increased loads without compromising performance.&lt;/p&gt;

&lt;p&gt;When you implement scalable algorithms and data structures in your software, you're better prepared to adapt to changing user demands and expand your platform's reach.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. &lt;strong&gt;Competitive Advantage&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In today's competitive tech industry, having a solid understanding of data structures and algorithms sets you apart from the competition. Whether you're applying for a job or seeking investors for your startup, your expertise in these areas can be a compelling factor.&lt;/p&gt;

&lt;p&gt;For &lt;a href="https://www.trayfoods.com/" rel="noopener noreferrer"&gt;TrayFoods Enterprise&lt;/a&gt;, having a CEO who comprehends the technical aspects of the platform, including the role of data structures and algorithms, can inspire confidence in both users and stakeholders.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. &lt;strong&gt;Foundation for Advanced Concepts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Data structures and algorithms serve as the foundation for many advanced topics in computer science and software development. If you aspire to work on machine learning, artificial intelligence, or even blockchain technology, a strong grasp of these fundamentals is indispensable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Example: Searching for an Item in a List with Binary Search
&lt;/h2&gt;

&lt;p&gt;Let's explore a real-world Python example to see how data structures and algorithms are used in practice. Suppose you're developing a feature for &lt;a href="https://www.trayfoods.com/" rel="noopener noreferrer"&gt;TrayFoods Enterprise&lt;/a&gt; that allows users to search for food items on the platform. You have a large list of food items, and you want to efficiently find if a particular item is available.&lt;/p&gt;

&lt;p&gt;In this scenario, you can employ a common algorithm called &lt;strong&gt;binary search&lt;/strong&gt; to achieve a more efficient search operation. Binary search is applicable when you have a sorted list, which is a common scenario when dealing with data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;binary_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food_items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food_items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;food_items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;  &lt;span class="c1"&gt;# Item found, return its index
&lt;/span&gt;        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;food_items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="c1"&gt;# Continue to search in the right half
&lt;/span&gt;        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="c1"&gt;# Continue to search in the left half
&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="c1"&gt;# Item not found
&lt;/span&gt;
&lt;span class="c1"&gt;# Example usage:
&lt;/span&gt;&lt;span class="n"&gt;food_items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Burger&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pizza&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sushi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Taco&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pasta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Salad&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;search_item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Taco&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;binary_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food_items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;search_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;search_item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is available at index &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;search_item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is not available on the menu.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this Python code, the &lt;code&gt;binary_search&lt;/code&gt; function efficiently searches for a food item in the sorted &lt;code&gt;food_items&lt;/code&gt; list. This algorithm has a time complexity of O(log n), which means it performs well even for large lists. This is just one example of how understanding algorithms can lead to more efficient and scalable code, which is essential for platforms like &lt;a href="https://www.trayfoods.com/" rel="noopener noreferrer"&gt;TrayFoods Enterprise&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In conclusion, whether you're a student, a full-stack developer, or the CEO of a tech company like &lt;a href="https://www.trayfoods.com/" rel="noopener noreferrer"&gt;TrayFoods Enterprise&lt;/a&gt;, learning data structures and algorithms is paramount. They enhance the efficiency of your code, sharpen your problem-solving skills, enable scalability, provide a competitive advantage, and serve as a foundation for advanced concepts. So, dive into the world of data structures and algorithms, and you'll find that it's a journey well worth taking in your tech career.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Get Started With Node.Js</title>
      <dc:creator>Divine Ikhuoria</dc:creator>
      <pubDate>Tue, 16 Aug 2022 19:06:00 +0000</pubDate>
      <link>https://forem.com/divuzki/get-started-with-nodejs-server-480j</link>
      <guid>https://forem.com/divuzki/get-started-with-nodejs-server-480j</guid>
      <description>&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;: In this article you will learn how to get started with node.js and use http module to create a server&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Node.js
&lt;/h2&gt;

&lt;p&gt;Node.js is an open-source, cross-platform, back-end JavaScript runtime environment that runs on a JavaScript Engine and executes JavaScript code outside a web browser, which was designed to build scalable network applications.&lt;/p&gt;

&lt;p&gt;To access web pages of any web application, you need a web server. The web server will handle all the http requests for the web application e.g IIS is a web server for ASP.NET web applications and Apache is a web server for PHP or Java web applications.&lt;/p&gt;

&lt;p&gt;Node.js provides capabilities to create your own web server which will handle HTTP requests asynchronously. You can use IIS or Apache to run Node.js web application but it is recommended to use Node.js web server&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Download Node.js from the official website &lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;https://nodejs.org/en/download&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When you install node.js &lt;code&gt;node&lt;/code&gt; &lt;code&gt;npm&lt;/code&gt; and &lt;code&gt;npx&lt;/code&gt; will be added to your &lt;a href="https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=&amp;amp;cad=rja&amp;amp;uact=8&amp;amp;ved=2ahUKEwjDk5rLgMz5AhUCGewKHZYHAu8QFnoECAMQAQ&amp;amp;url=https%3A%2F%2Fwww.tutorialspoint.com%2Fnodejs%2Fnodejs_environment_setup.htm&amp;amp;usg=AOvVaw3pllfadOZBlF1liplqothm" rel="noopener noreferrer"&gt;Environment Variable&lt;/a&gt; automatically&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Writing your first Node.js Program
&lt;/h4&gt;

&lt;p&gt;Create a folder then type &lt;code&gt;npm init -y&lt;/code&gt; to create a packages.json where all your dependencies you install will be saved. Node have some already installed dependencies, and &lt;strong&gt;&lt;code&gt;http&lt;/code&gt;&lt;/strong&gt; is part of them.&lt;/p&gt;

&lt;p&gt;In your folder create a file named index.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 1 - Import Node.js core module&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;   &lt;span class="c1"&gt;// 2 - creating server&lt;/span&gt;

    &lt;span class="c1"&gt;//handle incomming requests here..&lt;/span&gt;

&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//3 - listen for any incoming requests&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Node.js web server at port 5000 is running..&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above example, we import the http module using &lt;strong&gt;require()&lt;/strong&gt; function. The http module is a core module of Node.js, so no need to install it using NPM. The next step is to call &lt;strong&gt;createServer()&lt;/strong&gt; method of http and specify callback function with request and response parameter. Finally, call &lt;strong&gt;listen()&lt;/strong&gt; method of server object which was returned from &lt;strong&gt;createServer()&lt;/strong&gt; method with port number, to start listening to incoming requests on port 5000. You can specify any unused port here.&lt;/p&gt;

&lt;p&gt;Run the above web server by writing &lt;code&gt;node server.js&lt;/code&gt; command in command prompt or terminal window and it will display message as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ node server.js
Node.js web server at port 5000 is running...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is how you create a Node.js web server using simple steps.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Check out my github &lt;a href="https://github.com/Divuzki/" rel="noopener noreferrer"&gt;Divuzki&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>divuzki</category>
    </item>
    <item>
      <title>Express Js File Uploading Using express-fileupload</title>
      <dc:creator>Divine Ikhuoria</dc:creator>
      <pubDate>Tue, 16 Aug 2022 17:16:00 +0000</pubDate>
      <link>https://forem.com/divuzki/express-js-file-uploading-using-express-fileupload-42bh</link>
      <guid>https://forem.com/divuzki/express-js-file-uploading-using-express-fileupload-42bh</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Simple express middleware for uploading files.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#### With NPM&lt;/span&gt;
npm i express-fileupload

&lt;span class="c"&gt;#### With Yarn&lt;/span&gt;
yarn add express-fileupload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;When you upload a file, the file will be accessible from &lt;code&gt;req.files&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're uploading a file called &lt;strong&gt;car.jpg&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Your input's name field is &lt;strong&gt;foo&lt;/strong&gt;: &lt;code&gt;&amp;lt;input name="foo" type="file" /&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In your express server request, you can access your uploaded file from &lt;code&gt;req.files.foo&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/upload&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// the uploaded file object&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;req.files.foo&lt;/strong&gt; object will contain the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;req.files.foo.name&lt;/code&gt;: "car.jpg"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;req.files.foo.mv&lt;/code&gt;: A function to move the file elsewhere on your server. Can take a callback or return a promise.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;req.files.foo.mimetype&lt;/code&gt;: The mimetype of your file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;req.files.foo.data&lt;/code&gt;: A buffer representation of your file, returns empty buffer in case useTempFiles option was set to true.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;req.files.foo.tempFilePath&lt;/code&gt;: A path to the temporary file in case useTempFiles option was set to true.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;req.files.foo.truncated&lt;/code&gt;: A boolean that represents if the file is over the size limit&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;req.files.foo.size&lt;/code&gt;: Uploaded size in bytes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;req.files.foo.md5&lt;/code&gt;: MD5 checksum of the uploaded file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Notes about breaking changes with MD5 handling:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before 1.0.0, &lt;code&gt;md5&lt;/code&gt; is an MD5 checksum of the uploaded file.&lt;/li&gt;
&lt;li&gt;From 1.0.0 until 1.1.1, &lt;code&gt;md5&lt;/code&gt; is a function to compute an MD5 hash (&lt;a href="https://github.com/richardgirges/express-fileupload/releases/tag/v1.0.0-alpha.1" rel="noopener noreferrer"&gt;Read about it here.&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;From 1.1.1 onward, &lt;code&gt;md5&lt;/code&gt; is reverted back to MD5 checksum value and also added full MD5 support in case you are using temporary files.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/richardgirges/express-fileupload/tree/master/example" rel="noopener noreferrer"&gt;Example Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/richardgirges/express-fileupload/tree/master/example#basic-file-upload" rel="noopener noreferrer"&gt;Basic File Upload&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/richardgirges/express-fileupload/tree/master/example#multi-file-upload" rel="noopener noreferrer"&gt;Multi-File Upload&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Using Busboy Options
&lt;/h3&gt;

&lt;p&gt;Pass in Busboy options directly to the express-fileupload middleware. &lt;a href="https://github.com/mscdex/busboy#api" rel="noopener noreferrer"&gt;Check out the Busboy documentation here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fileUpload&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using useTempFile Options
&lt;/h3&gt;

&lt;p&gt;Use temp files instead of memory for managing the upload process.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Note that this option available for versions 1.0.0 and newer. &lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fileUpload&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;useTempFiles&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;tempFileDir&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/tmp/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using debug option
&lt;/h3&gt;

&lt;p&gt;You can set &lt;code&gt;debug&lt;/code&gt; option to &lt;code&gt;true&lt;/code&gt; to see some logging about upload process.&lt;br&gt;
In this case middleware uses &lt;code&gt;console.log&lt;/code&gt; and adds &lt;code&gt;Express-file-upload&lt;/code&gt; prefix for outputs.&lt;/p&gt;

&lt;p&gt;It will show you whether the request is invalid and also common events triggered during upload.&lt;br&gt;
That can be really useful for troubleshooting and &lt;strong&gt;&lt;em&gt;we recommend attaching debug output to each issue on Github&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Output example:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Express-file-upload: Temporary file path is /node/express-fileupload/test/temp/tmp-16-1570084843942
Express-file-upload: New upload started testFile-&amp;gt;car.png, bytes:0
Express-file-upload: Uploading testFile-&amp;gt;car.png, bytes:21232...
Express-file-upload: Uploading testFile-&amp;gt;car.png, bytes:86768...
Express-file-upload: Upload timeout testFile-&amp;gt;car.png, bytes:86768
Express-file-upload: Cleaning up temporary file /node/express-fileupload/test/temp/tmp-16-1570084843942...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Description:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Temporary file path is...&lt;/code&gt; says that &lt;code&gt;useTempfiles&lt;/code&gt; was set to true and also shows you temp file name and path.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;New upload started testFile-&amp;gt;car.png&lt;/code&gt; says that new upload started with field &lt;code&gt;testFile&lt;/code&gt; and file name &lt;code&gt;car.png&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Uploading testFile-&amp;gt;car.png, bytes:21232...&lt;/code&gt; shows current progress for each new data chunk.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Upload timeout&lt;/code&gt; means that no data came during &lt;code&gt;uploadTimeout&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Cleaning up temporary file&lt;/code&gt; Here finaly we see cleaning up of the temporary file because of upload timeout reached.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Available Options
&lt;/h3&gt;

&lt;p&gt;Pass in non-Busboy options directly to the middleware. These are express-fileupload specific options.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Acceptable Values&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;createParentPath&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;false&lt;/code&gt; &lt;strong&gt;(default)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;Automatically creates the directory path specified in &lt;code&gt;.mv(filePathName)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uriDecodeFileNames&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;false&lt;/code&gt; &lt;strong&gt;(default)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;Applies uri decoding to file names if set true.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;safeFileNames&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;false&lt;/code&gt; &lt;strong&gt;(default)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;regex&lt;/li&gt;
&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;Strips characters from the upload's filename. You can use custom regex to determine what to strip. If set to &lt;code&gt;true&lt;/code&gt;, non-alphanumeric characters &lt;em&gt;except&lt;/em&gt; dashes and underscores will be stripped. This option is off by default.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Example #1 (strip slashes from file names):&lt;/strong&gt; &lt;code&gt;app.use(fileUpload({ safeFileNames: /\\/g }))&lt;/code&gt;&lt;br&gt;&lt;strong&gt;Example #2:&lt;/strong&gt; &lt;code&gt;app.use(fileUpload({ safeFileNames: true }))&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;preserveExtension&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;false&lt;/code&gt; &lt;strong&gt;(default)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;em&gt;Number&lt;/em&gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;Preserves filename extension when using &lt;code&gt;safeFileNames&lt;/code&gt; option. If set to &lt;code&gt;true&lt;/code&gt;, will default to an extension length of 3. If set to &lt;code&gt;&lt;em&gt;Number&lt;/em&gt;&lt;/code&gt;, this will be the max allowable extension length. If an extension is smaller than the extension length, it remains untouched. If the extension is longer, it is shifted.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Example #1 (true):&lt;/strong&gt;&lt;br&gt;&lt;code&gt;app.use(fileUpload({ safeFileNames: true, preserveExtension: true }));&lt;/code&gt;&lt;br&gt;&lt;em&gt;myFileName.ext&lt;/em&gt; --&amp;gt; &lt;em&gt;myFileName.ext&lt;/em&gt;&lt;br&gt;&lt;br&gt;&lt;strong&gt;Example #2 (max extension length 2, extension shifted):&lt;/strong&gt;&lt;br&gt;&lt;code&gt;app.use(fileUpload({ safeFileNames: true, preserveExtension: 2 }));&lt;/code&gt;&lt;br&gt;&lt;em&gt;myFileName.ext&lt;/em&gt; --&amp;gt; &lt;em&gt;myFileNamee.xt&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;abortOnLimit&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;false&lt;/code&gt; &lt;strong&gt;(default)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;Returns a HTTP 413 when the file is bigger than the size limit if true. Otherwise, it will add a &lt;code&gt;truncated = true&lt;/code&gt; to the resulting file structure.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;responseOnLimit&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;'File size limit has been reached'&lt;/code&gt; &lt;strong&gt;(default)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;em&gt;String&lt;/em&gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;Response which will be send to client if file size limit exceeded when abortOnLimit set to true.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;limitHandler&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;false&lt;/code&gt; &lt;strong&gt;(default)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;function(req, res, next)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;User defined limit handler which will be invoked if the file is bigger than configured limits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;useTempFiles&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;false&lt;/code&gt; &lt;strong&gt;(default)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;By default this module uploads files into RAM. Setting this option to True turns on using temporary files instead of utilising RAM. This avoids memory overflow issues when uploading large files or in case of uploading lots of files at same time.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tempFileDir&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;&lt;li&gt;
&lt;code&gt;String&lt;/code&gt; &lt;strong&gt;(path)&lt;/strong&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;Path to store temporary files.&lt;br&gt;Used along with the &lt;code&gt;useTempFiles&lt;/code&gt; option. By default this module uses 'tmp' folder in the current working directory.&lt;br&gt;You can use trailing slash, but it is not necessary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;parseNested&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;false&lt;/code&gt; &lt;strong&gt;(default)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;By default, req.body and req.files are flattened like this: &lt;code&gt;{'name': 'John', 'hobbies[0]': 'Cinema', 'hobbies[1]': 'Bike'}&lt;/code&gt;&lt;br&gt;&lt;br&gt;When this option is enabled they are parsed in order to be nested like this: &lt;code&gt;{'name': 'John', 'hobbies': ['Cinema', 'Bike']}&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;debug&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;false&lt;/code&gt; &lt;strong&gt;(default)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;Turn on/off upload process logging. Can be useful for troubleshooting.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uploadTimeout&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;60000&lt;/code&gt; &lt;strong&gt;(default)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Integer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;This defines how long to wait for data before aborting. Set to 0 if you want to turn off timeout checks.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;That's all &lt;a href="https://github.com/Divuzki" rel="noopener noreferrer"&gt;Check out my github&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>divuzki</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to setup Node.js environment variables using dotenv</title>
      <dc:creator>Divine Ikhuoria</dc:creator>
      <pubDate>Tue, 16 Aug 2022 17:00:00 +0000</pubDate>
      <link>https://forem.com/divuzki/how-to-setup-nodejs-environment-variables-using-dotenv-54gc</link>
      <guid>https://forem.com/divuzki/how-to-setup-nodejs-environment-variables-using-dotenv-54gc</guid>
      <description>&lt;p&gt;Have you been looking for a way to hide sensitive information without showing it on your client-side?... well look no more&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmotdotla%2Fdotenv%2Fmaster%2Fdotenv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmotdotla%2Fdotenv%2Fmaster%2Fdotenv.png" alt="dotenv" width="200" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Dotenv?
&lt;/h2&gt;

&lt;p&gt;Dotenv is a zero-dependency module that loads environment variables from a &lt;code&gt;.env&lt;/code&gt; file into &lt;a href="https://nodejs.org/docs/latest/api/process.html#process_process_env" rel="noopener noreferrer"&gt;&lt;code&gt;process.env&lt;/code&gt;&lt;/a&gt;. Storing configuration in the environment separate from code is based on The &lt;a href="http://12factor.net/config" rel="noopener noreferrer"&gt;The Twelve-Factor App&lt;/a&gt; methodology.&lt;br&gt;
&lt;a href="https://openbase.com/js/dotenv?utm_source=embedded&amp;amp;utm_medium=badge&amp;amp;utm_campaign=featured-badge&amp;amp;utm_term=js/dotenv" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbadges.openbase.com%2Fjs%2Ffeatured%2Fdotenv.svg%3Ftoken%3DeE0hWPkhC2JGSD4G9hwg5C54EBxjJAyvurGfQsYoKiQ%3D" alt="Featured on Openbase" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;for npm =&amp;gt; &lt;code&gt;npm install --save dotenv&lt;/code&gt;&lt;br&gt;
for yarn =&amp;gt; &lt;code&gt;yarn install dotenv&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Dir
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;index.js&lt;br&gt;
.env&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;where &lt;code&gt;.env&lt;/code&gt; will be where you will keep your sensitive data as variables&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;index.js&lt;/code&gt;&lt;br&gt;
The below script is to initialize the config function into your project&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// for module type&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// for commonjs type&lt;/span&gt;
&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;you can now access your variables through &lt;code&gt;process.env&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;.env&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PORT=5000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;index.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lisen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;That is it! &lt;a href="https://www.github.com/divuzki" rel="noopener noreferrer"&gt;Check out my github&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>divuzki</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
