Sr. Content Developer at Microsoft, working remotely in PA, TechBash conference organizer, former Microsoft MVP, Husband, Dad and Geek.
162238 stories
·
33 followers

1 In 8 Cancer Cases Worldwide Are Due to Infections

1 Share
An estimated 2.3 million cancer cases worldwide in 2024, about one in eight, were attributable to infections, according to a study published in The Lancet Oncology. "This recent Lancet data is a profound reminder that a significant portion of our global cancer burden is fundamentally preventable," said David Greenberg, MD, of Hackensack Meridian Jersey Shore University Medical Center, in a news release. "We have historically siloed infectious diseases and oncology, but they are deeply intertwined. By shifting our focus toward aggressive infection control, we can literally vaccinate and treat our way out of millions of future cancer diagnoses." From a report: The study found that an estimated 2.3 million new cancer cases were attributable to infections globally in 2024, equivalent to 12% of all cancer cases. Of these, the largest number (760,000 cases, or 4%) were caused by H. pylori, followed by HPV (750,000 cases, or 4%), HBV (360,000 cases, or 2%), EBV (260,000 cases, or 1%) and HCV (160,000 cases). More than three quarters of infection-attributable cancers occurred in low- and middle-income countries. Eastern Asian had the largest burden, with 990,000 cases (42% of the global total). Rates were also higher than the global average in sub-Saharan Africa, Central and Eastern Europe and Southeast Asia.

Read more of this story at Slashdot.

Read the whole story
alvinashcraft
4 hours ago
reply
Pennsylvania, USA
Share this story
Delete

Paint.NET 5.2 Beta (build 9771)

1 Share

This beta update fixes several bugs reported in the previous build, and fixes compatibility for some effect plugins.

Changes since 5.2 Beta (build 9762):

  • Fixed tooltips not displaying for the History and Layers windows
  • Fixed compatibility for the Content Aware Fill effect plugin
  • Fixed a bug that was causing the Dynamic Draw effect plugin’s output to have its alpha channel reset to opaque
  • The mouse wheel can now be used to scroll menus other than Effects and Adjustments when they can’t completely fit onto the screen
  • Optimized the performance of the canvas when at zoom levels >100% to use less memory bandwidth. This should reduce power usage on laptops.
  • Wine: Improved text rendering quality and stability by using DWriteCore
  • Wine: UI animations now work

Download and Install

This build is available via the built-in updater as long as you have opted-in to pre-release updates. From within Settings -> Updates, enable “Also check for pre-release (beta) versions of paint.net” and then click on the Check Now button. You can also use the links below to download an offline installer or portable ZIP.

image.png

You can also download the installer here (for any supported CPU and OS), which is also where you can find downloads for offline installers, portable ZIPs, and deployable MSIs.

For the experimental builds for Wine, you can go here to download them.

​



Read the whole story
alvinashcraft
4 hours ago
reply
Pennsylvania, USA
Share this story
Delete

Azure Copilot Troubleshooting Agent is now general available

1 Share
From: MicrosoftAzure
Duration: 2:31
Views: 1,096

Azure Copilot is announcing the general availability of Troubleshooting Agent, a unified, built-in Azure Copilot capability that helps customers investigate and resolve operational issues faster.

Available through both Azure Copilot and Support + Troubleshooting in the Azure portal, Troubleshooting Agent enables you to move from issue detection to resolution faster by bringing together troubleshooting insights, operational context, and recommended actions in a single experience.

Learn more: https://msft.it/6051aYhKF

#Azure #AzureCopilot #TroubleshootingAgent #AgentAI

Read the whole story
alvinashcraft
4 hours ago
reply
Pennsylvania, USA
Share this story
Delete

BONUS Why AI Needs More Than Silicon Valley Moonshots With Salima Bhimani

1 Share

BONUS: Why AI Needs More Than Silicon Valley Moonshots With Salima Bhimani

AI is changing the work of software teams, but Salima Bhimani argues that the bigger question is not only what AI can automate. In this BONUS episode, Salima shares what she learned inside Alphabet's moonshot ecosystem, why breakthrough ideas may be hiding in plain sight, and how more people can become moonshot makers when technology meets lived intelligence.

Invention Starts in Real-World Constraints

"Invention is something that is always happening in relationship to something that's in the world."

 

Salima traces her view of invention back to a family history of migration, adaptation, and rebuilding under constraints. Her roots go from India to East Africa, where her family had to learn new languages, new land, and new ways to survive. That experience shaped a practical view of innovation: invention is not only the work of a lone genius in a lab. It often starts in friction, necessity, and the daily encounter between people and the systems around them.

We May Be Thinking Too Small About Innovation

"We've actually shrunk our ability to see what's out there in the world by limiting who's in the room."

 

Salima respects what Silicon Valley has built, from search to self-driving technology to AI. But her challenge is that the dominant innovation model often starts with a small group defining the problem, building a product, and then deploying it into the world. That can miss the collective intelligence already present in the places where the problems live. For software leaders and agile practitioners, the question becomes sharper: what would change if discovery started earlier, closer to the real ecosystem, with more forms of expertise present before the solution is framed?

AI as Infrastructure, Not the Destination

"The software itself is not just the solution. The software is the catalyst."

 

Salima argues that many organizations are still focused on AI as a tool for optimization: saving seconds, making teams more productive, or automating parts of the work. Those uses matter, but they can keep leaders thinking too narrowly. When AI becomes infrastructure, it becomes part of the platform that unlocks growth, capacity, and new ways to work across a system. In software organizations, that means shifting attention from "what tool should we apply?" to "what outcome could this platform make possible?"

Breakthroughs Come From Asking What the World Needs

"The greatest breakthroughs come from people really sitting down and asking what the world needs or doesn't need."

 

Working around Alphabet's moonshot environment taught Salima that breakthrough ideas are not only born from research labs or visionary founders. The next generation of innovation may come from people asking better ecosystem-level questions: how education changes with AI, how talent changes, how information is consumed, and how the labor market shifts around new infrastructure. The barrier to entry is lower now, which means more people can stand in the place where moonshots are imagined.

Third-Space Moonshots Bring the Lab to the Street

"Technology is not the breakthrough. Technology is a partner that allows us to unlock something in a system."

 

In Invent Now, Salima describes third-space moonshots as the convergence of three forces: technology as a co-partner, complex systems such as health, education, mobility, or energy, and human ingenuity from lived experience. This is not simply adding more people to a workshop. It is a different way of discovery, where an engineer, a scientist, a historian, and a street vendor may each see an opportunity the others would miss. As Vasco framed it, this is about bringing street smarts to the lab, and the lab to street smarts.

Humanity Is the Moonshot

"Humanity is the moonshot, not technology."

 

The Zimbabwe Bush Pump example in Salima's book challenges the usual mental model of moonshots. It may not look like a Silicon Valley breakthrough, but it asks a deeper question: who gets to define what counts as invention, and what kind of impact matters? AI may help us build more, faster, and with lower barriers. But Salima's point is that the real opportunity is not replacing human ingenuity. It is helping more people bring their lived experience into the act of building what their communities, teams, and systems actually need.

Becoming a Moonshot Maker

"It's a book to spar with. It's not a book to just read."

 

Salima does not describe Invent Now as a playbook. She describes it as an invitation to spar with ideas, disagree, and use the book to provoke new thinking. For Scrum Masters, agile coaches, product leaders, and software teams, that invitation is practical: stop treating AI as the whole story, and start using it as one partner in a broader discovery conversation. The biggest opportunities may already be visible to people inside the system. The work is to notice them, bring the right knowledge together, and build from there.

About Salima Bhimani

Dr. Salima Bhimani is the author of Invent Now: The Next Leap in Moonshots and CEO of 10X Responsible Tech. A former Alphabet chief strategist for responsible technology, business, and leaders, she worked across Waymo, Wing, DeepMind, and Google X. Her work focuses on AI, moonshots, and inclusive innovation. LinkedIn

 

You can link with Salima Bhimani on LinkedIn, learn more at salimabhimani.com, and read her book Invent Now: The Next Leap in Moonshots.

 





Download audio: https://traffic.libsyn.com/secure/scrummastertoolbox/20261003_Salima_Bhimani_BONUS.mp3?dest-id=246429
Read the whole story
alvinashcraft
4 hours ago
reply
Pennsylvania, USA
Share this story
Delete

RNR 374 - Building "Dreaming: Language Learning" with React Native

1 Share

Mazen talks with Wojciech Ogrodowczyk of Brains & Beards about building "Dreaming: Language Learning"  with React Native. They share lessons on offline video, mobile performance, native modules, and using AI to investigate bugs and improve code reviews.

Show Notes

  1. Brains & Beards
  2. Jay Meistrich – How to Build the Fastest Apps: Break the Rules | App.js Conf 2026

 

Connect With Us!

 

This episode is brought to you by Infinite Red!

Infinite Red is a premier mobile app consultancy, especially focused on Expo and React Native, located fully remote in the US. We’re a team of 30 with highly experienced mobile app developers and have been doing this for over a decade. We are also one of the first development teams to adopt agentic coding in a way that keeps high quality standards and aren’t afraid to do things the old school way if we need to. If you’re looking for mobile app or React Native or Expo expertise for your next project, hit us up at infinite.red/radio.





Download audio: https://cdn.simplecast.com/media/audio/transcoded/1208ee61-9c16-43c1-bc4c-ca790717f4a8/2de31959-5831-476e-8c89-02a2a32885ef/episodes/audio/group/34e60f63-c385-4d0e-80f9-c0c2798b5278/group-item/2b99ea5e-a120-4845-b8e4-abc780251bda/128_default_tc.mp3?aid=rss_feed&feed=hEI_f9Dx
Read the whole story
alvinashcraft
4 hours ago
reply
Pennsylvania, USA
Share this story
Delete

A Not-So-Simple RSS App in TypeScript

1 Share

Ok, I lie, this demo is also pretty simple, but I wanted to break the pattern of the last few posts and at least pretend this example is a bit more complex. As I try to find excuses to write more TypeScript, I thought a great example of that would be a simple RSS aggregator. You hit the site, tell it the feeds you care about, and it renders a date sorted list of entries.

Because RSS typically can't be parsed in client-side JavaScript (don't know why? ask me below!) so I'd have to make use of a serverless function to proxy the calls (and at the same time, handle turning the XML into JSON).

Now, to be fair, I had built nearly the same thing back in February: Building an RSS Aggregator with Astro . This let me crib a bit of the work already done.

For this one, my stack was:

  • Vite for the build process
  • Alpine on the front end
  • TypeScript, as much as possible
  • Hosting on Netlify to make the serverless function easier to do
  • WebAwesome, which I've used in the previous ones, for the UI

You can test this yourself here: https://ts-rss-vite.netlify.app/. The full source is here: https://github.com/cfjedimaster/typescript-stuff/tree/main/rss-reader-1.

I figure yall have seen a few of these posts already, so let me focus on sharing the interesting stuff.

Run TypeScript Checking

I mentioned in my last post that when Vite would reload, it wasn't running the TypeScript checker. It only did this when a build was run. Enabling this checking while in dev mode took two steps.

First, simply add "strict": true, to tsconfig.json. Funny enough, in years past I can remember removing this when I was trying to get something working in a TypeScript app and I was too lazy to learn or figure it out.

Second, I had to add vite-plugin-checker to the app and modify vite.config.ts.

import { defineConfig } from 'vite';
import checker from 'vite-plugin-checker';

export default defineConfig({
  plugins: [checker({ typescript: true })],
});

This file doesn't exist by default so it was a net new file for the app. As soon as I did that, if I screwed something up on purpose (ahem, I only make mistakes on purpose), I saw errors in my terminal when Vite was running.

The Serverless Function

For the backend, I used the ntl CLI (this is Netlify's CLI tool) to scaffold a function, which helpfully includes a TypeScript option. For the most part, the code here is a simpler version of what I had done for the Astro site, specifically I didn't bother with BLOB caching. Anyway, here's that function:

import Parser from 'rss-parser';
import type { Context } from '@netlify/functions';

type FeedItem = {
  title: string;
  link: string;
  pubDate: string;
  content: string;
  feedTitle: string;
};

export default async (request: Request, context: Context) => {
  if (request.method !== 'POST') {
    return new Response('Method not allowed', {
      status: 405,
      headers: { Allow: 'POST' },
    })
  }

  try {
    const body: unknown = await request.json()
    const parser = new Parser();

    if (
      typeof body !== 'object' ||
      body === null ||
      !('feeds' in body) ||
      !Array.isArray(body.feeds)
    ) {
      return new Response('Request body must include a feeds array', {
        status: 400,
      })
    }
    console.log('Parsing feeds:', body.feeds);

    let reqs: Promise<any>[] = [];
    let items: FeedItem[] = [];

    for(const feed of body.feeds) {
      reqs.push(parser.parseURL(feed.url));
    }

    const results = await Promise.allSettled(reqs);
    for (const result of results) {
        if (result.status === 'fulfilled') {
            const feed = result.value;
            console.log(`Fetched feed: ${feed.title} with ${feed.items.length} items.`);
            let newItems:any[] = [];
            feed.items.forEach(item => {
                /*
                will use content as a grab all for different fields
                for example, netlify had summary, not content
                */
                let content = item.contentSnippet || item.summary || item.content || '';
                newItems.push({
                    title: item.title,
                    link: item.link,
                    content: content,
                    pubDate: item.pubDate,
                    feedTitle: feed.title
                });
            });

            items.push(...newItems);

        } else {
            console.error('Error fetching/parsing feed:', result.reason);
        }
    }

    // now sort items by pubDate descending
    items.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate));

    return new Response(JSON.stringify(items), {
        status: 200,
        headers: {
        "Content-Type": "application/json",
        },
    });

  } catch(e) {
    console.log(e);
    return new Response('Request body must be valid JSON', {
      status: 400,
    })
  }
}

This is all pretty simple but I liked having the ability to create a custom type for my results.

I did run into an error after I created the function - and it's one I've seen twice now. Something in what the Netlify CLI does breaks some dependencies and my app fails to run at all. I passed the error to Claude and what it said was:

The most likely cause is that adding the Netlify function pulled in an older 
typescript that's now being resolved instead of your project's version. This 
usually happens when a netlify/functions package has its own package.json, 
or when netlify-cli or the functions bundler is running an older tsc from a 
different node_modules.

Its suggested fix, npm i -D typescript@latest, was enough to correct it. I definitely won't forget this when it happens again.

What's Next?

This has been so fun, at least for me. I've got my next two ideas ready! (Well, in my head at least. ;)

Read the whole story
alvinashcraft
4 hours ago
reply
Pennsylvania, USA
Share this story
Delete
Next Page of Stories