Dev.to
How to Detect Which Font Is Actually Rendering in a Browser (Not Just the CSS Stack)
getComputedStyle(element).fontFamily returns the CSS declaration: "Hiragino Kaku Gothic ProN", "Yu Gothic", "Noto Sans JP", sans-serif . That's not the font that rendered. It's a priority list. The browser picks the first one that's available and contains a glyph for the character being rendered. For Latin text, this distinction usually doesn't matter — Windows, macOS, and Linux have converged on a small set of common system fonts. For Japanese, it matters enormously. The visual weight, stroke contrast, and letterform style of Hiragino, Yu Gothic, and Noto Sans JP are genuinely different. A site designed on macOS (where Hiragino is the system Japanese font) looks different on Windows (where Yu Gothic is the fallback). Here's how to figure out what's actually rendering, and what I learned building Japanese Font Finder to automate it. Why getComputedStyle Doesn't Answer the Question getComputedStyle(el).fontFamily gives you the cascade result — what the browser received after applying all CSS rules. But it doesn't tell you which entry in the stack was selected. The underlying question is: does this font exist on this system, and does it have a glyph for this specific character? For Japanese, both conditions matter. A font might exist on the system but only cover a subset of kanji (common with CJK fonts that split across multiple files). The browser will use that font for characters it covers, and fall back for others. Canvas-Based Font Detection The classical technique uses a <canvas> element to measure text rendered with each font in the stack: function getFallbackWidth ( canvas , char ) { const ctx = canvas . getContext ( ' 2d ' ); ctx . font = `16px monospace` ; // known-available baseline return ctx . measureText ( char ). width ; } function testFont ( fontName , char ) { const canvas = document . createElement ( ' canvas ' ); const ctx = canvas . getContext ( ' 2d ' ); ctx . font = `16px " ${ fontName } ", monospace` ; return ctx . measureText ( char ). width ; }
SHOTA
2026-06-27 23:17
👁 9
查看原文 →
Product Hunt
Lyto
"One AI agent across your browser, tools, and messages " Discussion | Link
2026-06-27 23:17
👁 4
查看原文 →
The Verge AI
The Guardian’s Kai Wright refuses to buy a new phone
Kai Wright is the co-host of Stateside with Kai and Carter over at the Guardian. But Wright has been bringing his unique insights to listeners for years. He's also hosted Notes From America, The United States of Anxiety, and Indivisible. He's a Peabody Award-winning journalist who has profiled powerful men, explored what it means to […]
Terrence O’Brien
2026-06-27 23:15
👁 10
查看原文 →
The Verge AI
Indie developers got tired of waiting for a new Star Fox, so they’re making their own
Nostalgia remains a powerful force. So much so that, in exploring the echoes of a late-'90s childhood spent skimming the water of Corneria and sneering "cocky little freaks!" in time with a monkey encased in a Gundam suit, I'm simultaneously describing playing Star Fox 64 (Lylat Wars if you're nasty) in 1997 and streaming it […]
Geoffrey Bunting
2026-06-27 22:00
👁 7
查看原文 →
TechCrunch
The fittest founder in the room got cancer. Here’s how he used AI to fight back.
When confronted with cancer, Connor Christou fed everything tied tied to his regime — blood results, scan data, wearable output, journal entries — into Claude.
Connie Loizos
2026-06-27 22:00
👁 7
查看原文 →
Engadget
Engadget review recap: MSI Claw 8 EX AI+, Sony A7R VI, Ray-Ban Meta Optics and more
A roundup of recent reviews published by Engadget.
staff@engadget.com (Billy Steele)
2026-06-27 22:00
👁 6
查看原文 →
HackerNews
Running a software jam in a world of slop
I'm Fox. I'm a 16 year old, and I've been working mostly working on making projects I thought were cool & would do well on the internet over the last year. You can check out my other blog posts if you want to get a sense of what that means: < https://foxmoss.com/blog >. Hack Club noticed these projects and thought I would be well suited to run an event. This was my reaction, I wanted to make something that could encourage the same competition as well the feedback I get from places like HN and ap
foxmoss
2026-06-27 21:36
👁 3
查看原文 →
The Verge AI
Why is Apple asking me to pay more for Big Tech’s AI obsession?
Tim Cook recently said price increases were "unavoidable" and described the company's pricing as "unsustainable." The 16-inch MacBook Pro saw its price go up by $300. The 11-inch iPad Air went from $599 to $749. Even the HomePod Mini got a $30 bump to $129. Cook squarely placed the blame at the feet of the […]
Terrence O’Brien
2026-06-27 21:30
👁 8
查看原文 →
Dev.to
UTC, GMT, and the time zone bugs that keep biting developers
Time zones are one of those topics that look simple until you ship something and a user in another country sees the wrong time. Here are the traps I keep seeing, and how to reason about them in 2026. UTC is not a time zone, and GMT is not UTC UTC (Coordinated Universal Time) is a time standard, not a region. GMT is a time zone that happens to share the same offset as UTC most of the year. For storage and math, always think in UTC. Treat GMT as just another named zone. Rule 1: store timestamps in UTC Store every instant as UTC (or an epoch value). Convert to a local zone only at the edges, when you display to a user. If you store local times, you will eventually lose the offset and never recover the true instant. Rule 2: an offset is not a zone +09:00 tells you the offset right now. It does not tell you the zone, because zones change offset across the year due to daylight saving time. Store the IANA zone name (like America/New_York ), not just the offset. The offset is derived from the zone plus the date. Rule 3: DST is where it hurts The same wall-clock time can happen twice (fall back) or never (spring forward). Scheduling "9am every day" is a zone-aware operation, not an offset-aware one. Libraries like the built-in Intl.DateTimeFormat and Temporal (now widely available) handle this correctly if you give them a zone name. new Intl . DateTimeFormat ( ' en-US ' , { timeZone : ' Asia/Tokyo ' , dateStyle : ' short ' , timeStyle : ' short ' , }). format ( new Date ()); Rule 4: scheduling across teams is an overlap problem For a distributed team, the useful question is not "what time is it there" but "when do our working hours overlap". That is a set-intersection over each person's 9-to-5 expressed in UTC. A tool for the human side When I just need to eyeball overlaps and pick a meeting time without writing code, I use the free tool I built: ZonePlan , a time zone meeting planner and live world clock. If you want the practical playbook for picking meeting times, I wrote
gan liu
2026-06-27 20:49
👁 6
查看原文 →
Dev.to
Why I Stopped Chasing Every Market
One of the biggest realizations I've had over the last year wasn't about software. It was about focus. When I first started building KiwiEngine, I wanted it to power everything. Business software. CRMs. Inventory systems. Scheduling platforms. Accounting tools. SaaS products. If someone could build it, I wanted KiwiEngine to support it. Technically, I still do. But something changed. I realized there is a difference between building software that can solve every problem and trying to solve every problem yourself. Those aren't the same thing. The Architecture Never Changed KiwiEngine is still designed to power business applications. Nothing about the architecture changed. The modules. The APIs. The philosophy. The engine remains general-purpose. What changed was my focus. Build What You Understand I started asking myself a simple question. Who do I actually understand? Not as a developer. As a creator. The answer wasn't accountants. It wasn't HR departments. It wasn't inventory managers. The answer was musicians. Artists. Game developers. Creators. Builders. Those are the people whose problems I experience every day. Those are the workflows I naturally understand. Open Source Changes The Equation One of the beautiful things about open source is that I don't have to build every application. I can build the engine. I can document it. I can share the philosophy. Someone else can build the CRM. Someone else can build the scheduling platform. Someone else can build the accounting software. Meanwhile, I can focus on building the creative tools I genuinely want to use. The Best Proving Ground Today, KiwiEngine's proving ground is becoming: Artist websites EPKs Music production tools Digital storefronts Creative workflows Game development Media platforms Not because they're the only things KiwiEngine can build. Because they're the things I care deeply enough to refine every day. And I think that creates better software than chasing every possible market ever could.
Drew Marshall
2026-06-27 20:46
👁 6
查看原文 →
Dev.to
Network Fingerprinting: Analyzing Default ICMP Structures and Payload Mimicry
Research Context "In advanced network observability, understanding the default behavior of various operating systems is vital for traffic profiling. This article explores the structural differences in ICMP Echo Requests across different OS environments and analyzes how 'Traffic Mimicry' can be used to evaluate the accuracy of Network Intrusion Detection Systems (NIDS)." 1. The Anatomy of an ICMP Signature A standard ICMP Echo Request is not just a simple signal; it carries a specific "fingerprint" based on the operating system that generated it. These fingerprints consist of: Total Packet Size TTL (Time to Live) values Default Payload Content 2. Cross-Platform Discrepancies (Linux vs. Windows) When a system sends a "ping," the default data size ($D$) and the total packet length ($L$) vary significantly between architectures. Feature Linux (Typical) Windows (Typical) Data Size ($D$) 56 Bytes 32 Bytes ICMP Header ($H$) 8 Bytes 8 Bytes Total ICMP Length ($L$) 64 Bytes 40 Bytes Default Payload Timestamp + Data abcdefg... The Linux Signature In most Linux distributions, the ping utility sends 56 bytes of data. When combined with the 8-byte ICMP header, it totals 64 bytes. A key characteristic of Linux ICMP traffic is that the first few bytes of the payload are often occupied by a high-resolution timestamp, used to calculate RTT (Round Trip Time) with microsecond precision. The Windows Signature Windows systems default to a 32-byte data payload. The payload content is static and follows a predictable alphabetical sequence: abcdefghijklmnopqrstuvwabcdefghi. This static nature makes Windows ICMP traffic easily identifiable during deep packet inspection (DPI). 3. The Concept of Traffic Mimicry Traffic Mimicry is a research method used to test the resilience of network filters. By aligning custom communication protocols with the default signatures of a specific OS, researchers can evaluate whether a security appliance is biased toward certain traffic patterns. For example, wh
JM00NJ
2026-06-27 20:46
👁 12
查看原文 →
Reddit r/programming
How to write a faithful MUMPS 76 interpreter and integrated NoSQL database in < 10k lines of C++
submitted by /u/suhcoR [link] [留言]
/u/suhcoR
2026-06-27 20:40
👁 5
查看原文 →
Reddit r/programming
Mojo programming language will become open-source soon.
The main website of the language https://mojolang.org/ displays an announcement bar that says "Mojo will be open source soon! Join us at ModCon '26 for an update." submitted by /u/baldierot [link] [留言]
/u/baldierot
2026-06-27 20:39
👁 6
查看原文 →
Dev.to
From Informatica XML to Snowflake: Why ETL Migration Needs a Governed Delivery Workflow
Legacy ETL modernization is often described as a conversion exercise: Informatica mapping in. Snowflake SQL out. That framing is incomplete. A real migration is not only about translating expressions. It is about preserving transformation intent, identifying what is missing, documenting assumptions, validating target behavior, and ensuring that someone is accountable for decisions before generated artifacts are released. I have been building a prototype called Data Engineering Copilot around that idea. The latest capability starts from an Informatica PowerCenter XML export and produces a governed Snowflake migration delivery packet. The workflow is: Informatica PowerCenter XML ↓ Metadata and Lineage Extraction ↓ Canonical Metadata Model ↓ Snowflake Artifact Generation ↓ Validation and Migration Risk Assessment ↓ Human Review and Approval ↓ Governed Release Package The problem with simple code conversion An Informatica mapping can contain far more than a direct field-to-field relationship. A typical mapping may include: source definitions and target definitions source qualifiers and filters expression transformations reusable transformations lookups constants and default values mapping parameters target load order connector-level lineage update strategy or sequence-generation behavior target fields with no visible incoming connector A generator that only reads source and target columns may produce SQL that looks valid but does not preserve the original delivery intent. That is risky. For example, imagine a target field that has no visible source column. It may still be populated through: a constant such as 'SOURCE_A' a default such as 'XNA' a surrogate-key lookup a runtime parameter a load timestamp a sequence generator a business decision that was never documented in the mapping If the tool silently inserts NULL , the SQL may compile while the migration is functionally wrong. The prototype approach The Data Engineering Copilot prototype accepts two starting points:
Amit Kumar Singh
2026-06-27 20:38
👁 6
查看原文 →
Dev.to
Solving IP Endianness in x64 Assembly: A Single-Pass Algorithm
Research Context When doing low-level network programming in Assembly, you experience firsthand the immense chaos running behind the scenes of operations we solve with a single line in high-level languages (Python, C, etc.). While developing the Nested-ICMP-Communication Analysis project, specifically an Encapsulated ICMP framework, I hit exactly this kind of wall: extracting an IP address from a packet header and printing it to the screen in the correct format. Sounds simple, right? However, when x86 architecture and network protocols are involved, seeing 5.1.168.192 instead of 192.168.1.5 on your terminal is extremely common. So why does this happen, and what kind of algorithm did I develop to overcome this issue during the debugging process? Let's dive into the background. The Endianness Problem in Network Headers When you capture a packet coming over the network and read the source/destination IP address inside the sockaddr_in structure, the data arrives in Network Byte Order (Big-Endian) format. This means the most significant byte is stored at the lowest memory address. However, the x86/x64 processor architectures we use rely on Little-Endian (Host Byte Order). When the processor pulls this 4-byte IP data into a register, the reading direction is effectively reversed for our purposes. The result? A packet that arrives as 192.168.1.5 appears scrambled if we try to naively print it from memory. The inet_ntoa() function in high-level languages handles this conversion in the background. But if you are writing a custom sniffer in pure Assembly, you must do this conversion byte by byte yourself. Debugging Hell: The Problems Encountered While writing this conversion, I encountered a few critical issues that cost me hours in GDB (GNU Debugger): Register Clashes: While separating each octet (byte) of the IP address and converting it to an ASCII character (string), you must use the AX register for division operations (DIV). If you don't carefully manage your remainders
JM00NJ
2026-06-27 20:34
👁 9
查看原文 →
Dev.to
Sharp Money vs Public Money: What Betting Line Movement Data Reveals
The opening kickoff of Super Bowl LVII was still three weeks away when sharp bettors began their work. While casual fans were scrolling through prop bets and debating quarterback matchups on social media, a handful of disciplined bettors with sophisticated models were already identifying the first exploitable edges. Within hours, sportsbooks registered the shift: Kansas City opened at -2.5, but sharp action pushed the line to -3. By game day, it had settled at -2.5 again after public money flooded in on the Chiefs. This seemingly minor dance of numbers contains profound lessons about market efficiency, behavioral psychology, and where consistent value in sports betting actually exists. The difference between sharp money and public money isn't merely a matter of skill—it's a window into how financial markets process information in real time. For researchers, data scientists, and anyone interested in understanding how markets function under uncertainty, betting lines offer a peculiar advantage: instantaneous, objective outcomes. You can know within hours whether your hypothesis was correct. This article explores what line movement data reveals about market inefficiencies, the methodology behind detecting them, and what this teaches us about information asymmetry in competitive markets. The Hidden Market Beneath the Surface Most bettors see a line and make a decision: is this price fair or favorable? But they miss the crucial information happening before they ever see that number. Sportsbooks don't set lines based on game probability—they set them based on where they predict the money will flow. This distinction transforms betting markets into fascinating research subjects. Consider the structure: A sportsbook's primary goal isn't prediction; it's profit through balanced exposure. They're market makers, not forecasters. When sharp bettors arrive first with informational advantages, they move the line. When public money arrives later with no informational advantage but
Edge Lab
2026-06-27 20:31
👁 10
查看原文 →
Dev.to
StatsBomb Open Data Reveals: Late Goals Aren't Random
When the referee checks their watch in the 85th minute, something predictable happens in soccer—but almost nobody is modeling it correctly. I spent three months analyzing 1,085 professional soccer matches using StatsBomb's open data, focusing specifically on goal-scoring patterns in the final 15 minutes of regulation play and stoppage time. What I found challenges the conventional wisdom that late goals are chaotic, random events determined purely by desperation and fortune. Instead, the data revealed a structured pattern that, when properly identified, has produced an 79.3% accuracy rate in backtesting across multiple leagues and seasons. The bookmakers aren't missing this pattern because the pattern doesn't exist—they're missing it because it requires looking at the problem completely differently than traditional sports analytics approaches it. The Setup: Why Late Goals Matter Before diving into methodology, let's establish why this question even matters. Late goals are the most emotionally charged moments in soccer. They're also economically significant. A goal in the 88th minute creates a cascade of outcomes: It flips match results It triggers goal-line drama and potential VAR decisions It creates dramatic shifts in market odds It validates or destroys betting positions The conventional narrative treats late goals as the result of two factors: increased urgency from trailing teams and increased vulnerability from leading teams. This is directionally correct but strategically useless. It's like saying "stock prices move when sentiment changes"—technically true, but not actionable. The real question isn't whether late goals happen more frequently. The real question is: which teams score them, under which specific conditions, with what measurable precursors? Methodology: Building the Dataset I used StatsBomb's open data repository, which contains event-level information from 1,085 professional matches across multiple seasons and competitions. StatsBomb's data inclu
Edge Lab
2026-06-27 20:30
👁 10
查看原文 →
Dev.to
I'm shipping the best work of my career. None of it feels like mine.
A few years back I was a junior dev on a car financing product, and I got handed the deal jacket. A deal jacket is the full picture of a deal. How much the buyer puts down, what the car is worth, the terms, all of it packaged up and sent to a bank so the bank can come back with a yes or a no. The flow I had to build would send that package to one bank, wait about a minute for an answer, check whether the offer that came back was any good, and if it wasn't, send the whole thing to the next bank. A pipeline. Under the hood it was a recursive call with state managed in between, talking to Route One on the other side. It kept breaking. I wrote it, tested it, read the logs, fixed one thing, watched it break somewhere else. Day three, day four, still broken. Then on the fourth day I hit send in Postman one more time, watched the logs roll past, and it just worked. The approval came back clean. I jumped out of my chair. I was loud enough that the whole room looked over, and the two guys who knew what I'd been stuck on for four days were already grinning, because they knew exactly what had just happened. That feeling is the whole reason I'm writing this. Not the code. The feeling. The joy had two parts, and I only saw the second one once it was gone The first part is obvious. It's the problem solving. The thing fought back for four days and then it didn't, and I had beaten it. You chase a bug through the logs, you argue with it, and at some point it gives. That is a real high and every engineer knows it. The second part is quieter. I built that. Me. Back then if I shipped something, even a plain HTML page, it was mine end to end. I had to learn HTML before I could build the page, so the page was proof that I had learned. You could point at the thing and say that came out of my head and my hands, and nobody could take that from you. So the joy was solving the problem, and it was owning what you solved. That second part is the one that broke. Same problem, four years apart Ta
Syed Abdullah Saad
2026-06-27 20:28
👁 5
查看原文 →
Dev.to
StatsBomb Open Data Reveals: Late Goals Aren't Random
The Night Everything Changed It was 87 minutes into a Premier League match. The score was 1-1. The home team had controlled possession for most of the second half, but their shots were consistently blocked or saved. Then something happened that's been happening for decades, yet nobody seems to adequately explain it: a late goal completely shifted the match outcome. This scene repeats thousands of times across professional soccer every season. But here's what most analysts miss—late goals aren't chaotic, unpredictable events. They follow patterns. Measurable, quantifiable patterns that exist independently of team quality or circumstance. Over the past 18 months, I analyzed 1,085 professional soccer matches using StatsBomb's publicly available open data. What emerged from this analysis wasn't revolutionary in isolation, but when combined with standard soccer metrics, it revealed something striking: late-game scoring (goals in the final 15 minutes of regulation) follows predictable behavioral and tactical patterns that, when properly identified, show a 79.3% correlation with specific pre-match and in-match conditions. This isn't about predicting individual goals with certainty. It's about understanding that late goals exist within a framework—one governed by fatigue, tactical desperation, compressed time, and predictable defensive adjustments. And once you see this framework, you can't unsee it. The Data Foundation Before diving into patterns, let me establish what we're working with. StatsBomb's open data includes detailed shot maps, pass completion sequences, player positioning, and event-by-event timelines from top-tier professional matches. When they made portions of this data publicly available, it created an unusual opportunity: examining thousands of matches with granular timing and contextual information. My analysis focused specifically on: 1,085 professional matches across five seasons (2017-2022) Shot events in the final 15 minutes of regulation (minutes 75-
Edge Lab
2026-06-27 20:25
👁 10
查看原文 →
Dev.to
Day 76 of Learning MERN Stack
Hello Dev Community! 👋 It is officially Day 76 of my 100-day full-stack engineering streak! For the past several weeks, I have been heavily immersed in NoSQL databases, using MongoDB documents to back my full-stack clones. Today, I decided to broaden my database engineering skill set by taking a deep dive into Relational Databases (SQL) ! 📊⚡ Stepping out of flexible JSON-like structures and adjusting to rigid, highly optimized tables is an essential step for any well-rounded backend developer. 🧠 What I Learned Today: SQL vs. NoSQL Before writing code, I mapped out the core architectural differences between the two paradigms: Feature NoSQL (e.g., MongoDB) SQL (e.g., MySQL / PostgreSQL) Data Model Flexible, schema-less collections & documents. Strict table-based structures with rows & columns. Relationships Typically nested embedded sub-documents or references. Explicit Relational Mapping via Primary & Foreign Keys. Scaling Horizontally scalable (distributed sharding across nodes). Vertically scalable (requires increasing horsepower on one machine). Transactions Great for high-write, unstructured or dynamic data shapes. Strict ACID compliance, making it excellent for financial or tabular data. 🛠️ Analyzing My First Query Block on Day 76 As showcased in "Screenshot (174).png" , I configured an entire relational lifecycle inside an independent database script: 1. Database Provisioning & Focus Selection I initialized the data cluster safely using standard syntax constraints to ensure execution safety and loaded the working context into the active engine: sql CREATE DATABASE IF NOT EXISTS XYZ_Company; USE XYZ_Company;CREATE TABLE employee_info ( id INT PRIMARY KEY, name VARCHAR(30), SALARY INT );
Ali Hamza
2026-06-27 20:23
👁 8
查看原文 →