<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: nodamage</title><link>https://news.ycombinator.com/user?id=nodamage</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 26 May 2026 04:43:10 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=nodamage" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by nodamage in "Used La Marzocco machines are coveted by cafe owners and collectors"]]></title><description><![CDATA[
<p>And how exactly are you going to make good coffee if you don't know how to dial in a shot? If you don't know what you're doing your espresso is most likely going to come out sour or bitter. (Under or over extracted. Pulling good espresso is not exactly the most straightforward process.)</p>
]]></description><pubDate>Fri, 24 Apr 2026 23:04:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=47896895</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=47896895</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47896895</guid></item><item><title><![CDATA[New comment by nodamage in "Used La Marzocco machines are coveted by cafe owners and collectors"]]></title><description><![CDATA[
<p>Except it's not so easy to get your hands on one these days. They are constantly out of stock. (IIRC they are basically now hand made by a guy out of the UK).<p>I get the appeal of manual levers to espresso enthusiasts but would strongly dissuade beginners from starting with one. When you are learning to dial in a shot what you want is consistency and reproducibility which is the opposite of what you get with a manual lever.<p>Also it doesn't steam milk so you need to figure out a separate solution for steaming if you want to make a flat white/cappuccino/latte/etc.<p>That's not to say you should dump thousands of dollars into a La Marzocco, but there are plenty of entry level machines in the $300-500 range that would suit a beginner just fine.</p>
]]></description><pubDate>Fri, 24 Apr 2026 09:38:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=47887835</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=47887835</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47887835</guid></item><item><title><![CDATA[New comment by nodamage in "Resistance training load does not determine hypertrophy"]]></title><description><![CDATA[
<p>This seems like an overly cynical take. Is there no value in empirically confirming an assumption? Especially in the exercise world where other long held assumptions ended up being bro-science nonsense?<p>> although inter-personal coefficient of variation is up to 28.3%<p>Why does that matter? Isn't the entire point of this study's design to eliminate the impact of the inherent variability between test subjects?</p>
]]></description><pubDate>Thu, 01 Jan 2026 20:13:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=46457586</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=46457586</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46457586</guid></item><item><title><![CDATA[New comment by nodamage in "Epic celebrates "the end of the Apple Tax" after court win in iOS payments case"]]></title><description><![CDATA[
<p>Not necessarily.<p>For starters, small companies are paying 15%, not 30%.<p>I'm also not sure where a small company can find a payment processor that will only charge 1%. Stripe charges 2.9% plus 30 cents per transaction.<p>If you have a $4.99 in-app purchase that will cost you 44 cents per transaction to use Stripe vs 75 cents to use Apple's IAP.<p>But Stripe does not act as a merchant of record so you are responsible for remitting sales tax yourself. Registering for and remitting sales tax in every jurisdiction where you have nexus adds huge administrative overhead to a small company.<p>If you want to avoid this overhead, Paddle will act as a merchant of record for you, but then you're paying 5% plus 50 cents which adds up to 75 cents on a $4.99 purchase anyway.<p>Linking to external payments also reduces conversion rates (<a href="https://www.revenuecat.com/blog/growth/iap-vs-web-purchases-conversion-test/" rel="nofollow">https://www.revenuecat.com/blog/growth/iap-vs-web-purchases-...</a>) compared to using IAP.<p>Taken all together, depending on their pricing structure, small companies may very well be financially better off sticking with IAP rather than linking to external payments anyway.</p>
]]></description><pubDate>Fri, 12 Dec 2025 20:45:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=46248699</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=46248699</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46248699</guid></item><item><title><![CDATA[New comment by nodamage in "I convinced HP's board to buy Palm and watched them kill it"]]></title><description><![CDATA[
<p>I think the author of the article really misses the point here. While "true multitasking" might be a neat technical feature, it's not something that the end user really cares about or would base a buying decision on, especially if running multiple apps in the background at the same time came at the expense of battery life. Those early versions of iOS employed a lot of tricks to squeeze performance and battery life out of underpowered devices.</p>
]]></description><pubDate>Fri, 13 Jun 2025 19:31:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=44271514</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=44271514</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44271514</guid></item><item><title><![CDATA[New comment by nodamage in "Why LLMs still have problems with OCR"]]></title><description><![CDATA[
<p>I once did something similar with a recipe from a cookbook where the recipe started at the bottom of one page and continued onto the next page. It correctly identified the first few ingredients present in the photo of the first page but then proceeded to hallucinate another half-dozen or so ingredients in order to generate a complete recipe.</p>
]]></description><pubDate>Fri, 07 Feb 2025 22:28:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=42978240</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42978240</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42978240</guid></item><item><title><![CDATA[New comment by nodamage in "Software development topics I've changed my mind on"]]></title><description><![CDATA[
<p>> If I try to do an UPDATE ... SET x = x + 1, that will always increment correctly in SQL. But if read x from an ORM object and write back x + 1, that looks like I'm just writing a constant, right?<p>This is not specific to ORMs... you can run into the same problem without one.<p>> Extra magic: if you've read a class from the db, pass it around, and then modify a field in that class, will that perform a db update: now? later? never?<p>In every ORM I've used you have specific control over when this happens.</p>
]]></description><pubDate>Thu, 06 Feb 2025 18:21:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=42965007</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42965007</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42965007</guid></item><item><title><![CDATA[New comment by nodamage in "Software development topics I've changed my mind on"]]></title><description><![CDATA[
<p>Yes I suspect a lot of the ORM hate comes 1) from people using poorly designed ones or 2) from people working on projects that don't really require the features I mentioned. Like if you are generating reports that just issue a bunch of queries and then dump the results to the screen you probably don't care that much about the lifetime of what you've retrieved. But just because an ORM might not be the right tool for your project doesn't make it a bad tool overall, that would be like saying hammers are bad tools because they can't be used to screw in screws.</p>
]]></description><pubDate>Thu, 06 Feb 2025 06:44:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=42959735</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42959735</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42959735</guid></item><item><title><![CDATA[New comment by nodamage in "Software development topics I've changed my mind on"]]></title><description><![CDATA[
<p>I've never understood the ORM hate because a good ORM will get out of the way and let you write raw SQL when necessary while still offering all of the benefits you get out of an ORM when working with query results:<p>1. Mapping result rows back to objects, especially from joins where you will get back multiple rows per "object" that need to be collated.<p>2. Automatic handling of many-to-many relationships so you don't have to track which ids to add/remove from the join table yourself.<p>3. Identity mapping so if you query for the same object in different parts of your UI you always get the same underlying instance back.<p>4. Unit of work tracking so if you modify two properties of one object and one property of another the correct SQL is issued to only update those three particular columns.<p>5. Object change events so if you fetch a list of objects to display in the UI and some other part of your UI (or a background thread) add/updates/deletes an object, your list is automatically updated.<p>6. And finally in cases where your SQL is dynamic having a query builder is way cleaner than concatenating strings together.<p>For those who are against ORMs I am curious how you deal with these problems instead.</p>
]]></description><pubDate>Wed, 05 Feb 2025 18:43:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=42953164</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42953164</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42953164</guid></item><item><title><![CDATA[New comment by nodamage in "A phishing attack involving g.co, Google's URL shortener"]]></title><description><![CDATA[
<p>For what purpose do they make these calls?</p>
]]></description><pubDate>Fri, 24 Jan 2025 22:54:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=42817731</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42817731</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42817731</guid></item><item><title><![CDATA[New comment by nodamage in "Working with Files Is Hard (2019)"]]></title><description><![CDATA[
<p>> If you keep losing data to power losses or crashes, perhaps fix the cause of that?<p>I keep telling my users to make sure to plug their phones in before the battery dies, but for some reason they keep forgetting...</p>
]]></description><pubDate>Thu, 23 Jan 2025 22:22:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=42808666</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42808666</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42808666</guid></item><item><title><![CDATA[New comment by nodamage in "Working with Files Is Hard (2019)"]]></title><description><![CDATA[
<p>Before becoming too overconfident in SQLite note that Rebello et al. (<a href="https://ramalagappan.github.io/pdfs/papers/cuttlefs.pdf" rel="nofollow">https://ramalagappan.github.io/pdfs/papers/cuttlefs.pdf</a>) tested SQLite (along with Redis, LMDB, LevelDB, and PostgreSQL) using a proxy file system to simulate fsync errors and found that none of them handled all failure conditions safely.<p>In practice I believe I've seen SQLite databases corrupted due to what I suspect are two main causes:<p>1. The device powering off during the middle of a write, and<p>2. The device running out of space during the middle of a write.</p>
]]></description><pubDate>Thu, 23 Jan 2025 19:00:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=42806901</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42806901</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42806901</guid></item><item><title><![CDATA[New comment by nodamage in "Google’s OAuth login doesn’t protect against purchasing a failed startup domain"]]></title><description><![CDATA[
<p>Your quote does not actually contradict my original statement, full reply here: <a href="https://news.ycombinator.com/item?id=42743263">https://news.ycombinator.com/item?id=42743263</a></p>
]]></description><pubDate>Fri, 17 Jan 2025 21:11:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=42743271</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42743271</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42743271</guid></item><item><title><![CDATA[New comment by nodamage in "Google’s OAuth login doesn’t protect against purchasing a failed startup domain"]]></title><description><![CDATA[
<p>I suppose this comes down to the interpretation of the documentation. Note that it only says "a workspace", not "a specific workspace" or "which workspace".<p>1) The "hd" claim tells you that the user is a member of a workspace. If the user is a member of a workspace it tells you the domain name of that workspace.<p>2) The "hd" claim tells you which specific workspace the user is a member of.<p>You are taking interpretation (2) whereas I am taking interpretation (1). I believe interpretation (1) is correct given the next sentence says you can use the "hd" claim to restrict access to only members of certain <i>domains</i>. If interpretation (2) was intended, they could have instead said you can use the "hd" claim to restrict access to only members of a certain <i>workspace</i>.<p>If Google is at fault for anything here it is for writing confusing documentation, however given the totality of the documentation where:<p>a) Google describes public applications as intended for logins from all Google accounts regardless of workspace, and<p>b) Google offers the internal application option for situations where you want to restrict logins to users of a specific workplace,<p>I'm going to stand by my conclusion that the real fault lies with service providers choosing the wrong integration option in the first place and then making invalid assumptions about what information the "hd" claim supplies in the public option.</p>
]]></description><pubDate>Fri, 17 Jan 2025 21:10:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=42743263</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42743263</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42743263</guid></item><item><title><![CDATA[New comment by nodamage in "Google’s OAuth login doesn’t protect against purchasing a failed startup domain"]]></title><description><![CDATA[
<p>> <i>In the case of Google OAuth, it's possible to forego this in order to allow any Google user from any Google workspace to login to your application.</i><p>There are plenty of use cases where this is appropriate. If you wanted to allow users to login to Hacker News with their Google accounts you would use this option because you do not care what workspace they belong to.<p>> <i>Some applications (e.g. Tailscale) take advantage of the public Google OAuth API to provide private internal corporate accounts.</i><p>This is a misuse of the public Google OAuth API. Your first link clearly states: "A public application allows access to users outside of your organization (@your-organization.com). Access can be from consumer accounts, like @gmail.com, or other organizations, like @partner-organization.com." In other words it is intended for scenarios where <i>you want to allow access to users outside your workspace</i>.<p>> <i>Instead, Google instructs you to look at the "hd" parameter, specific to Google, to determine the Google Workspace a given user belongs to for security purposes.</i><p>According to your second link the "hd" parameter only tells you what <i>domain</i> the user belongs to, it does not tell you what <i>workspace</i> the user belongs to.<p>> <i>You can avoid this issue by using a custom Google OIDC IdP configured for internal access only in your applications, rather than using a pre-configured public Google OIDC IdP</i><p>So Google offers an OAuth integration option that actually restricts access to your specific workspace. Choosing to ignore this option and instead integrating with the option designed for public access from all Google accounts, and then calling it a vulnerability when someone can login with an account from another workspace, is frankly, absurd.</p>
]]></description><pubDate>Thu, 16 Jan 2025 17:09:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=42727965</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42727965</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42727965</guid></item><item><title><![CDATA[New comment by nodamage in "Google’s OAuth login doesn’t protect against purchasing a failed startup domain"]]></title><description><![CDATA[
<p>> <i>If I log in using Google oauth, you already know the Google account is active.</i><p>You know there is an active Google account but (for the public OAuth integration option) it can be <i>any</i> Google account from any workspace, or no workspace.<p>"A public application allows access to users outside of your organization (@your-organization.com). Access can be from consumer accounts, like @gmail.com, or other organizations, like @partner-organization.com." [1]<p>> <i>Yes, but that's an additional check, separate from the one you suggested would eliminate the issue:</i><p>If you set up an internal OAuth integration option no separate check is necessary, it will actually restrict access to users of your workspace.<p>"An internal application will only allow access to users from your organization (@your-organization.com)." [1]<p>You can use the SAML integration option as well. [2]<p>[1] <a href="https://support.google.com/cloud/answer/6158849?hl=en#zippy=%2Cpublic-and-internal-applications" rel="nofollow">https://support.google.com/cloud/answer/6158849?hl=en#zippy=...</a><p>[2] <a href="https://support.google.com/a/answer/6357481" rel="nofollow">https://support.google.com/a/answer/6357481</a></p>
]]></description><pubDate>Thu, 16 Jan 2025 16:49:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=42727690</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42727690</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42727690</guid></item><item><title><![CDATA[New comment by nodamage in "Google’s OAuth login doesn’t protect against purchasing a failed startup domain"]]></title><description><![CDATA[
<p>Assuming the above is correct, if you decide to connect Google SSO to your application using option (3), then it is not a vulnerability that a Google account from a different workspace can connect to your application, because <i>the entire point of option (3) is that users with any Google account (regardless of workspace) can connect to your application</i>.<p>If you intended to restrict your application to users of your own workspace then you should have used option (1) or (2).</p>
]]></description><pubDate>Thu, 16 Jan 2025 00:29:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=42719309</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42719309</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42719309</guid></item><item><title><![CDATA[New comment by nodamage in "Google’s OAuth login doesn’t protect against purchasing a failed startup domain"]]></title><description><![CDATA[
<p>> despite Google's docs stating that this is a valid use. :)<p>I don't think Google's docs actually say this. I assume you are referring to the "hd" claim, but that only says:<p>"The domain associated with the Google Workspace or Cloud organization of the user. Provided only if the user belongs to a Google Cloud organization. <i>You must check this claim when restricting access to a resource to only members of certain domains.</i> The absence of this claim indicates that the account does not belong to a Google hosted domain."<p>It does not say you can use this claim to restrict access to members of a certain workspace, only for a certain domain.<p>I think certain service providers might have made the assumption that if a user belongs to a certain domain that also means they belong to a certain workspace, but that is clearly not a valid assumption.<p>I think that Google's public OAuth integration is only intended for use in situations where you want to allow logins from any Google account, regardless of workspace membership, and if you want to restrict logins to Google accounts belonging to a specific workspace, you are supposed to use one of the other integrations.<p>Given all that, I still do not think this is a problem with Google's OAuth implementation. Instead it is a problem with service providers who have incorrectly used the wrong type of Google SSO integration. Or in the case of service providers that offer multiple Google SSO integration options (like Slack), it is a problem with the company for selecting the wrong one.</p>
]]></description><pubDate>Wed, 15 Jan 2025 19:16:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=42715633</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42715633</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42715633</guid></item><item><title><![CDATA[New comment by nodamage in "Google’s OAuth login doesn’t protect against purchasing a failed startup domain"]]></title><description><![CDATA[
<p>Google's public OAuth is intended for situations where you want to allow anyone with a Google account to login to your application, regardless of workspace. Given that, it is not a Google OAuth vulnerability that a user can login to your application using a Google account from a different workspace.<p>If you want to integrate Google SSO into your application <i>and restrict logins to a specific workspace</i>, there are other options you can use that will actually check if the user belongs to that workspace (SAML or internal OAuth).<p>To the extent that service providers are using Google's public OAuth and then trying to read the domain name out of the returned ID token in order to restrict logins a specific Google workspace, they are using Google's public OAuth instance for a situation it was not intended for because domain names do not map 1:1 to workspaces. However that is a vulnerability on the service provider's side, not Google's.<p>To the extent that a service provider offers Google SSO integration via Google's public OAuth but also via workspace restricted options, if a company selects the former instead of the latter then the responsibility for the vulnerability is on the company's side. (Slack, for example, offers both because there are some Slack groups where allowing access from any Google account makes sense, and other groups where you would want to restrict access to Google accounts from a specific workspace.)</p>
]]></description><pubDate>Wed, 15 Jan 2025 17:18:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=42713868</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42713868</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42713868</guid></item><item><title><![CDATA[New comment by nodamage in "Google’s OAuth login doesn’t protect against purchasing a failed startup domain"]]></title><description><![CDATA[
<p>Only if you use the Google public OAuth integration. If you instead use the SAML integration with Slack as described in the link above you don’t have this problem.</p>
]]></description><pubDate>Wed, 15 Jan 2025 15:39:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=42712140</link><dc:creator>nodamage</dc:creator><comments>https://news.ycombinator.com/item?id=42712140</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42712140</guid></item></channel></rss>