<?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>DEV Community: Eugene Egoroff</title>
    <description>The latest articles on DEV Community by Eugene Egoroff (@eegoroff).</description>
    <link>https://dev.to/eegoroff</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4030094%2F7942bd88-88af-4d93-8861-423f5fd56f2f.jpg</url>
      <title>DEV Community: Eugene Egoroff</title>
      <link>https://dev.to/eegoroff</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eegoroff"/>
    <language>en</language>
    <item>
      <title>The screen has two origins, and they never agreed</title>
      <dc:creator>Eugene Egoroff</dc:creator>
      <pubDate>Thu, 30 Jul 2026 11:58:51 +0000</pubDate>
      <link>https://dev.to/eegoroff/the-screen-has-two-origins-and-they-never-agreed-54ge</link>
      <guid>https://dev.to/eegoroff/the-screen-has-two-origins-and-they-never-agreed-54ge</guid>
      <description>&lt;p&gt;Every programmer hits this moment. You draw your first rectangle, nudge it "up" by increasing Y, and it slides down instead. You flip the sign, it works, and you move on. Almost nobody stops to ask why the screen disagrees with every math class they ever took.&lt;/p&gt;

&lt;p&gt;Here is the answer, and it is older than you think.&lt;/p&gt;

&lt;p&gt;In a math class, the origin sits where the axes cross and Y climbs upward. Open almost any graphics API and &lt;code&gt;(0, 0)&lt;/code&gt; is the top-left corner, with Y falling as you move down the screen. Beginners assume someone made a bad call. Nobody did. The screen has carried two different origins for decades, and both are still in use, because they come from two different machines.&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmg6y2kf6vn2uhzo0zxov.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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmg6y2kf6vn2uhzo0zxov.png" alt=" " width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the screen counts from the top-left
&lt;/h2&gt;

&lt;p&gt;The top-left origin is a fossil of the cathode-ray tube. A CRT draws a picture by sweeping an electron beam across the glass one line at a time, starting at the top-left, moving left to right, then dropping to the next line down. That is a raster scan, and video memory was laid out to match it: the first byte is the top-left pixel, the next is the one to its right, and the last is the bottom-right.&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0n2mktctu9mwu92pk66b.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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0n2mktctu9mwu92pk66b.png" alt=" " width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the "first" pixel is top-left, and Y grows downward because that is the direction both the beam and the memory travel. Text terminals inherited the same idea: line 1 is at the top, and the cursor moves down. The convention is not a preference. It is the shape of the hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  The other lineage: math kept its origin
&lt;/h2&gt;

&lt;p&gt;Meanwhile, the mathematical world never gave up the Cartesian origin: bottom-left, Y up. Pen plotters drew like a person doing geometry on graph paper. And the systems built on top of that math kept it. PostScript and PDF place the origin at the lower-left of the page with Y increasing upward. OpenGL's window coordinates put &lt;code&gt;(0, 0)&lt;/code&gt; at the bottom-left.&lt;/p&gt;

&lt;p&gt;The best part: PDF's device space, the actual pixels, flips back to the top-left with Y down. One file format quietly carries both conventions, one for the page and one for the screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  The myth, gently corrected
&lt;/h2&gt;

&lt;p&gt;It is tempting to say early computers used Cartesian coordinates and then everyone switched to top-left. That is not quite what happened. There were two lineages from the start: raster displays, which count from the top-left because that is how they physically scan, and the math and vector world, which counts from the bottom-left. Top-left won for everyday UI and 2D graphics because raster displays won. Bottom-left survived wherever staying aligned with mathematics mattered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why you still feel it
&lt;/h2&gt;

&lt;p&gt;This split is why you flip Y so often without thinking about where the habit came from. Load an image, whose rows run top to bottom, into OpenGL, whose window origin is bottom-left, and the picture is upside down until you flip a texture coordinate. OpenGL and DirectX disagree on which way texture Y runs. A game engine keeps screen space and world space pointing opposite ways and translates between them on every frame. The two origins never merged. Your code just negotiates between them, forever.&lt;/p&gt;

&lt;p&gt;So the next time Y points the "wrong" way, it is not a bug, and it is not a bad decision from 1975. It is a standing disagreement between a cathode-ray tube and a geometry textbook, and your code is the treaty that keeps the peace.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;by Eugene Egoroff · egoroff.me&lt;/em&gt;&lt;/p&gt;

</description>
      <category>history</category>
      <category>graphics</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Most website checkers give everyone ~80/100. So I built an honest security scanner.</title>
      <dc:creator>Eugene Egoroff</dc:creator>
      <pubDate>Wed, 15 Jul 2026 16:15:00 +0000</pubDate>
      <link>https://dev.to/eegoroff/most-website-checkers-give-everyone-80100-so-i-built-an-honest-security-scanner-3p1p</link>
      <guid>https://dev.to/eegoroff/most-website-checkers-give-everyone-80100-so-i-built-an-honest-security-scanner-3p1p</guid>
      <description>&lt;p&gt;I've been building web, SaaS and enterprise systems for 25+ years. Somewhere along the way I got tired of "website checker" tools.&lt;/p&gt;

&lt;p&gt;You know the ones. You paste a URL, wait, and get a friendly ~80 out of 100. Their idea of "security" is a green check next to "HTTPS". And the report is really a funnel — give us your email, book a call with our agency.&lt;/p&gt;

&lt;p&gt;So I built the opposite: &lt;strong&gt;CheckWeb&lt;/strong&gt; — a free website security scan with no sign-up, an honest score, and real CVE detection. Here's what I learned building it.&lt;/p&gt;

&lt;p&gt;Quick definition, because I'll lean on it all the way through: a &lt;strong&gt;CVE&lt;/strong&gt; (Common Vulnerabilities and Exposures) is a publicly catalogued security flaw, filed under an ID like &lt;code&gt;CVE-2024-4439&lt;/code&gt;. If a library on your site carries one, the write-up is public — and usually so is the exploit.&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F47vg3rhafleir6cl7v9w.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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F47vg3rhafleir6cl7v9w.png" alt="CheckWeb report for acme.com — overall score 40/100, Security axis at 12" width="800" height="982"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Aggregate CVE counts lie
&lt;/h2&gt;

&lt;p&gt;The first thing I got wrong: counting CVEs per &lt;em&gt;package&lt;/em&gt; instead of per &lt;em&gt;version&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;jQuery has accumulated 8 CVEs over its lifetime. But if your site runs jQuery 1.8.2, only &lt;strong&gt;5&lt;/strong&gt; of them actually affect that version — the rest were introduced later, or fixed before it.&lt;/p&gt;

&lt;p&gt;Reporting "jQuery 1.8.2 — 8 known CVEs" is technically a lie, and exactly the kind of thing that destroys trust the moment a developer checks. So the scanner cross-references the detected version against the version ranges published by OSV (Open Source Vulnerabilities, Google's open database) and NVD (the US government's National Vulnerability Database) and counts only the CVEs whose affected range actually includes that version — with max severity computed over that same subset.&lt;/p&gt;

&lt;p&gt;A scanner that cries wolf is worthless. Accuracy isn't a nice-to-have here; it's the whole product.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Honesty is a feature, not a liability
&lt;/h2&gt;

&lt;p&gt;Every checker I tried handed almost every site something in the high 70s. It feels good. It says nothing.&lt;/p&gt;

&lt;p&gt;I went the other way: an honest 0–100 score with &lt;strong&gt;hard gates&lt;/strong&gt;. A broken or untrusted certificate caps the overall score at 50, no matter how fast and well-optimized everything else is. No HTTPS at all caps it lower. A blacklisted domain caps it too.&lt;/p&gt;

&lt;p&gt;That means my scores are sometimes ugly. That's the point — a low score is the product's own argument. And if your site is clean, I'll tell you straight instead of inventing problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Passive-only is a hard line
&lt;/h2&gt;

&lt;p&gt;The scanner reads only what your site shows any visitor: response headers, returned HTML, DNS, the TLS certificate, the library versions a page loads. It never probes hidden paths, scans ports, or sends payloads.&lt;/p&gt;

&lt;p&gt;Partly that's a legal line — actively probing someone else's domain isn't something you get to do because you're curious. But it's also trust: I want anyone to scan any site without me doing something I'd have to apologize for. The deeper active checks only make sense on a domain someone has proven they own.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually finds
&lt;/h2&gt;

&lt;p&gt;Outdated JS libraries and CMS versions with known CVEs, missing or weak security headers, TLS and certificate problems, mixed content, insecure cookies, email spoofing gaps (SPF and DMARC — the DNS records that stop strangers sending email as your domain), blacklisting and Safe Browsing flags.&lt;/p&gt;

&lt;p&gt;The most striking find so far: a live site running a WordPress core old enough to carry &lt;strong&gt;158 known CVEs&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stands
&lt;/h2&gt;

&lt;p&gt;Early, free, no revenue. The passive scan stays free forever. Later I plan a paid deep audit + monitoring for people who verify their own domain — that's where the active checks (exposed files, open ports, admin panels) belong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ask
&lt;/h2&gt;

&lt;p&gt;Scan a site you know well: &lt;strong&gt;&lt;a href="https://chkweb.com" rel="noopener noreferrer"&gt;https://chkweb.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then tell me: are the findings accurate? Does the score feel fair? Anything confusing or missing?&lt;/p&gt;

&lt;p&gt;I'd rather hear it's wrong now than after a thousand people trust it. Brutal feedback very welcome.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>security</category>
      <category>webdev</category>
      <category>wordpress</category>
    </item>
  </channel>
</rss>
