AI 资讯
AI Doesn't Think For You, It Thinks Like You
A few weeks ago a Business Manager handed me a 50-page AI-generated technical spec. The document was impressive. The perspective behind it was the problem. I had talked to him a few days earlier about a new internal tool the company needed. We discussed the use case and the requirements in depth. Later on, I discussed those same requirements with my IT team and assigned them the job of making the technical specification. But before my team finished, the Business Manager handed me his own spec. A spec ready to be executed. The document was generated with AI assistance and it was impressive — fifty pages long, detailed feature breakdown, implementation timeline, cost projections. Everything looked professional. The AI had done exactly what it was asked to do. I read the whole document and noticed a problem. Not with the quality of the document but with the perspective that shaped it. The spec called for a manual Excel-based workflow with several manual steps and validations in-between. All seemed clean and manageable, matching the Business Manager's mental model of how that business workflow should work. When I checked the spec my team was working on using the same AI assistance tools, I noticed they had produced something completely different: automated data ingestion, real-time dashboards, API integrations with existing systems. Both specs addressed the same business need. Both were technically sound. Both could be built in roughly the same timeframe. But they were fundamentally different architectures, shaped by fundamentally different perspectives on how work should happen. The Business Manager's version was optimized for control and visibility — he could see every step, every piece of information and approve everything manually at any stage. The technical lead's version optimized for efficiency and scale — minimal manual intervention, automated error handling, designed to handle 10x the current volume without breaking. Neither person was wrong. But the AI amplifi
AI 资讯
One Monorepo, Two Outputs: How I Eliminated Duplicate Starter Templates
Part 2 of the Building create-notils series. In my previous article , I explained why I stopped copy-pasting repositories and started building my own project scaffolding tool. However, one major architectural problem remained: I wanted create-notils to support both of these primary project structures. A standalone Next.js application: my-app/ ├── src/ ├── public/ ├── package.json └── components.json And a Turborepo monorepo: my-app/ ├── apps/ │ └── app/ ├── packages/ │ ├── ui/ │ └── config/ ├── turbo.json └── package.json At first glance, the obvious solution is to maintain two separate templates—one for standalone and one for monorepo. Problem solved, right? Except... it isn't. The Hidden Cost of Multiple Templates Every starter template starts out identical. Then one day, you fix a subtle bug in one template and forget to update the other. A week later, you upgrade Next.js in one repository before getting around to the second. A month later, you improve your UI package and find yourself manually copying files back and forth between folders. Eventually, the templates slowly drift apart. The true cost isn't creating templates; the cost is maintaining them forever. What Actually Changes? When I sat down and compared the two project layouts side by side, surprisingly little was different. The actual application code, UI components, theming, and utility functions were 100% identical. The only real differences were the structural project boundaries: Concern Monorepo Standalone UI Package packages/ui src/components/ui Utilities @notils/ui/lib/utils @/lib/utils Configuration Shared workspace package Local configuration Package Manifests Multiple ( package.json files) Single root manifest Workspace Tooling Present ( turbo.json , workspaces) Removed entirely Everything else was effectively the exact same code. That single observation changed the entire architecture of create-notils . A Different Approach: The Canonical Source of Truth Instead of maintaining two templates, I
AI 资讯
When Does a Prompt Become an Undocumented Program?
When we first decided to bring AI into analysts’ work, the task seemed fairly down-to-earth. The company has several development teams and roughly fifteen analysts. They collect requirements, prepare tasks, describe changes in Confluence, think through testing, and help align future implementation with both business and development. A lot of this work is repetitive, so giving analysts a tool that could prepare first drafts felt like an obvious idea. The problem is that a document in this kind of process almost never stands on its own. The same change exists in Jira, in Confluence, in mockups, in test scenarios, and in technical notes. Sometimes there are also separate instructions for making changes in the codebase. Each artifact has its own purpose, but all of them describe the same future system behavior. If the wording drifts apart, that can go unnoticed for several days, until different people begin working from different versions. A typical case looked roughly like this (the details and names are changed, but the mechanism is real). Jira said that a status field could have three values: draft , active , and archived . Confluence still contained an older table with only two values, while the test scenario also checked for disabled , which had been discussed early on and later rejected. The developer implemented what was written in Jira. The tester opened the scenario and filed a defect because disabled was missing. Only after that did the analyst compare the documents and realize that each of them preserved a different version of the decision. Nothing catastrophic happened. We simply had to go through the documentation again, update the tests, clarify the task, explain to the developer that the code did not need to change, and send the package through review one more time. It’s exactly these “nothing serious” moments that add up to delays, when the same task travels two or three times between an analyst, a developer, and a tester. At some point, it becomes diffi
AI 资讯
How to Apply PCB Design Standards for Better Product Design
Nothing is more frustrating than spending hours, or even days, perfecting a PCB design only to discover it fails during production. The secret to avoiding this is simple: apply PCB design standards from the very beginning. These guidelines act as a blueprint for reliability, manufacturability, and long-term performance, guiding every aspect of your board—from trace widths and spacing to via placement, solder mask, and layer stackups. Following these recommended practices doesn’t just prevent manufacturing errors—you save time, reduce costs, improve quality, and minimize delays. Whether you’re building a prototype or preparing for full-scale production, designing with these rules in mind ensures your PCB performs exactly as intended. Applying these best practices sets the foundation for success in any production scenario. By starting with the right standards, you can avoid costly mistakes before they happen and bring your product to life smoothly. Why PCB Design Standards Matter (More Than You Think) PCB standards are not theoretical rules. They are: • Proven engineering practices • Built from real-world failures • Designed to reduce risk Without them, you are basically designing blindly. With them, you get: • Higher first-pass success rate • Faster manufacturing approval • Reduced rework and cost • Better product reliability Steps to Apply PCB Standards in Your Design Here’s a practical, step-by-step guide to apply PCB design standards effectively: Step 1: Start with the Right Standards (Not All Are Needed) You don’t need to follow everything. You need to follow the right ones. Key standards to consider: • IPC-2221 → General PCB design standard • IPC-7351 → Footprint design guidelines • IPC-A-600 → PCB acceptability • IPC-A-610 → Assembly quality Practical Tip: Start with IPC-2221 + IPC-7351 if you're doing design. Step 2: Apply Standards During Component Placement Most failures start here—not routing. Common Mistakes: • Random component placement • Ignoring signal
AI 资讯
Stop writing a parser per site. Run five and let confidence decide.
For a long time I ran product extraction off a database of custom selector configs. Hundreds of retailers, each with its own set of CSS selectors mapped field by field: price here, title there, image over there. It worked. It was also a treadmill. Every retailer that redesigned its frontend silently broke its config, and the maintenance tax grew with every retailer I added. Hundreds of configs is hundreds of things that can rot without telling you, usually right before someone downstream asks why a brand's prices went null. At some point I stopped feeding it. The scraping platform I ran at my last engagement fed a 20M+ product catalogue at millions of pages a day, and the thing that made that survivable wasn't better per-site config. It was leaning on almost no per-site config at all. The pattern Instead of one careful parser per site, run several cheap generic extractors on every page, in parallel: JSON-LD. A huge share of e-commerce pages ship a schema.org/Product block because Google rewards it. It has name, price, currency, availability, images. It's the closest thing to a public API hiding in the HTML. OpenGraph tags. og:title , og:image , product:price:amount . Lower quality than JSON-LD, but present on sites too lazy for structured data, because everyone wants pretty link previews. Microdata / RDFa. Older sites, still surprisingly common outside the US. Embedded state. __NEXT_DATA__ , window.__INITIAL_STATE__ and friends. A JSON blob the site's own frontend hydrates from. Heuristics. A price-shaped string near a currency symbol inside the main content region. The largest above-the-fold image. The h1 . Dumb, and dumb works more often than you'd think. None of these is reliable alone. OG price tags go stale, JSON-LD sometimes describes the wrong variant, heuristics grab the crossed-out "was" price. The trick is you don't pick an extractor. You pick per field, and you let agreement between sources carry the decision. Confidence merge Each extractor emits candida
开发者
Introduce a memory safe compilation mode inspired by Fil-C
开发者
Apps Marketed to US Troops Are Shipping Chinese and Russian Code
A first-of-its-kind analysis found more than one in eight apps built for US service members carried foreign code—some from firms in nations the Pentagon designates as adversaries.
开发者
Stolen Buttons
AI 资讯
US gas prices hit an average of $4 a gallon again
产品设计
yatta!
A cute little to-do list that celebrates with you Discussion | Link
AI 资讯
AI is more likely than humans to form biases when hiring
The next time you apply for a job, AI may screen your résumé before any human sees it. But there’s good reason to question whether AI will judge you fairly. Researchers already know that LLMs pick up human biases from their training data. New research suggests that LLMs can also develop their own biases from…
AI 资讯
Apple probably won't add Jony Ive to OpenAI trade secret theft suit
AI 资讯
Exploit brokers pay $500k for WordPress RCEs. I found one with GPT5.6 and $25
开发者
Choose your Burden
Hey everyone. Just an update on the Salesforce Certification. I am planning on releasing articles...
开发者
Nolan's Odyssey – A technical analysis by a nitpicky Classics student
开发者
Taking OCaml and Eio for a Spin
AI 资讯
Show HN: GeoChess – open-source geography strategy game
The rules are really simple. Players take turns claiming a country that shares a land border with the current one. You lose if you have no valid moves left. I'd appreciate any feedback. Source code: https://github.com/spider-hand/GeoChess
AI 资讯
EU Exempts Apple Watch and AirPods from Battery Removal Requirements
产品设计
📱 MyZubster Mobile App: Development Guide
Liquid syntax error: Variable '{{% raw %}' was not properly terminated with regexp: /\}\}/
开发者
Why wordpress.org Won't Let You Install Composer Packages From a Plugin
Cross-posted from the Loopress docs Loopress is a toolset to make WordPress reproducible and reviewable via Git . Versioned snippets, Composer without SSH, and more coming... Check Loopress WordPress doesn't have a package manager. If you want a PHP library in your project, be it Guzzle for HTTP calls or a PDF generation library in a snippet, you're either vendoring the code by hand or running Composer somewhere the WordPress admin can't see. We built a feature to fix that: a Composer UI inside the WordPress admin. Search Packagist, install a package, audit it for known vulnerabilities, all without SSH access ( full walkthrough here ). Before shipping it, we asked the wordpress.org plugin review team whether it would be acceptable in the official directory. The answer was no. The rule Here's the relevant line from Guideline 8 of the wordpress.org plugin directory: "Plugins may not send executable code via third-party systems." Installing a PHP package from Packagist is, by definition, downloading executable code from a third party and writing it to disk. It doesn't matter that our plugin never calls the installed code's autoloader itself, that the user has to load it deliberately from their own snippet. The review team was clear: the indirection changes nothing. The mere presence of that capability is enough to trigger the rule, whether or not it's ever used. There's no folder you can hide it in that makes it acceptable, they weren't shy about saying that outright. If you want PHP dependencies in a plugin distributed on wordpress.org, the only accepted path is to vendor them at submission time: ship the code, with a compatible license and readable source, not fetch it dynamically. For us, that meant Composer package management could never live in the same plugin that ships on wordpress.org. Full stop, no clever workaround changes that. What we tried first, and undid Our first move was the obvious one: split into two plugins. A "Core" plugin with snippet sync, distri