<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: marcus_cemes</title><link>https://news.ycombinator.com/user?id=marcus_cemes</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Mon, 13 Apr 2026 08:33:07 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=marcus_cemes" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by marcus_cemes in "Anthropic downgraded cache TTL on March 6th"]]></title><description><![CDATA[
<p>> We need open weights companies now more than ever.<p>If you're objective it to democratize AI, sure. But for those fed up with it and the devastating effects it's having on students, for example, can opt to actively avoid paying for products with AI (I say this as someone who uses it every day, guilty). At some point large companies will see that they're bleeding money for something that most people don't seem to want, and cancel those $100k/mo deals. I've already experienced one AI-developer-turned company crash and burn.<p>Personally, I don't think this LLM-based AI generation will have any significant positive impacts. Time, energy (CO2) and money would have been <i>far</i> better spent elsewhere.</p>
]]></description><pubDate>Sun, 12 Apr 2026 09:29:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=47737647</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=47737647</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47737647</guid></item><item><title><![CDATA[New comment by marcus_cemes in "Claude Sonnet 4.6"]]></title><description><![CDATA[
<p>Being a moderately frequent user of Opus and having spoken to people who use it actively at work for automation, it's a <i>really</i> expensive model to run, I've heard it burn through a company's weekend's credit allocation before Saturday morning, I think using almost an order of magnitude more tokens is a valid consumer concern!<p>I have yet to hear anyone say "Opus is really good value for money, a real good economic choice for us". It seems that we're trying to retrofit every possible task with SOTA AI that is still severely lacking in solid reasoning, reliability/dependability, so we throw more money at the problem (<i>cough</i> Opus) in the hopes that it will surpass that barrier of trust.</p>
]]></description><pubDate>Tue, 17 Feb 2026 21:52:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=47053937</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=47053937</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47053937</guid></item><item><title><![CDATA[New comment by marcus_cemes in "I don't care how well your "AI" works"]]></title><description><![CDATA[
<p>You could make the same argument for any language. It still requires you to think and implement the solution yourself, just at a certain level of abstraction.</p>
]]></description><pubDate>Wed, 26 Nov 2025 16:57:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=46059533</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=46059533</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46059533</guid></item><item><title><![CDATA[New comment by marcus_cemes in "How I fell in love with Erlang"]]></title><description><![CDATA[
<p>Perhaps I was a little harsh, this was a few years back when I was evaluating Elixir for a client, but ended up going back to a TS/Node.js stack instead. While the Phoenix documentation is stellar, I found it difficult to find good resources on best practices. I was probably doing something stupid and ran into internal and difficult to understand exceptions being raised on the Erlang side, from Cowboy if I recall. In another case, I was trying to validate API JSON input, the advice I got was to use Ecto (which I never really groked) or pattern match and fail. In JS, libraries like Zod and Valibot are a dream to work with.<p>The result was a lot of frustration, having been thoroughly impressed by Elixir and Phoenix in the past, knowing that I already knew how to achieve the same goal with Node.js with less code and would be able to justify the choice to a client. It didn't quite feel "there" to pick up and deploy, whereas SvelteKit with tRPC felt very enabling at the time and was easily picked up by others. Perhaps I need another project to try it out again and convince me otherwise. Funnily enough, a year later I replaced a problematic Node.js sever with Phoenix + Nerves running on a RPi Zero (ARM), flawless cross-compilation and deployment.<p>> Ports are not network transparent<p>I stand corrected, thank you for the explanation!</p>
]]></description><pubDate>Tue, 11 Nov 2025 23:19:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=45894266</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=45894266</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45894266</guid></item><item><title><![CDATA[New comment by marcus_cemes in "How I fell in love with Erlang"]]></title><description><![CDATA[
<p>No, they aren't. You have to use BigInt, which will throw an error if you try to serialise it to JSON or combine it with ordinary numbers. If you happen to need to deserialise a 64-bit integer from JSON, which I sadly had to do, you need a custom parser to construct the BigInt from a raw string directly.</p>
]]></description><pubDate>Tue, 11 Nov 2025 19:22:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=45891614</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=45891614</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45891614</guid></item><item><title><![CDATA[New comment by marcus_cemes in "How I fell in love with Erlang"]]></title><description><![CDATA[
<p>This stands to reason. If you need to bridge different languages together like in your case, they need to speak a common tongue. REST/GrahQL/gRPC solve this problem in different ways. There is no technical limitation keeping you from serving HTTP traffic from Erlang/Elixir, but from my own experience it isn't a pleasant experience. JavaScript or Python are dead simple, until you realise that 64-bit integers are not a thing in JS, and need to be handled as strings. Similarly, tuples will give you hell in Python.<p>On the other hand, if you don't need to cross that boundary, the BEAM will very happily talk to itself and let you send messages between processes without having to even think about serialisation or whether you're even on the same machine. After all, everything is just data with no pointers or cyclic references. That's more that can be said for most other languages, and while Python's pickle is pretty close, you can probably even share Erlang's equivalent of file descriptors across servers (haven't tried, correct me if I'm wrong), which is pretty insane when you think about it.<p>> I have found the real value of Erlang to be internally between trusted nodes of my own physical infrastructure as a high-level distributed "brain" or control plane<p>I think this is pretty high praise, considering it's about as old as C and was originally designed for real-time telephone switches.</p>
]]></description><pubDate>Tue, 11 Nov 2025 18:46:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=45891172</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=45891172</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45891172</guid></item><item><title><![CDATA[New comment by marcus_cemes in "The Core of Rust"]]></title><description><![CDATA[
<p>To extend upon this, memory generally has a single owner. When it goes out of scope, it gets freed [1]. The drop() function, which appears analogous to free() in C/C++, is actually just an empty function who's sole purpose is to take ownership and make it go out of scope, which immediately frees the memory [2].<p>> This function is not magic; it is literally defined as: pub fn drop<T>(_x: T) {}<p>This is usually more deterministic than GC languages (no random pauses), but can be less efficient for highly nested data structures. It also makes linked lists impossible without using "unsafe rust", as it doesn't abide by the normal ownership rules.<p>[1]: <a href="https://doc.rust-lang.org/rust-by-example/scope/raii.html" rel="nofollow">https://doc.rust-lang.org/rust-by-example/scope/raii.html</a>
[2]: <a href="https://doc.rust-lang.org/std/mem/fn.drop.html" rel="nofollow">https://doc.rust-lang.org/std/mem/fn.drop.html</a></p>
]]></description><pubDate>Thu, 21 Aug 2025 20:24:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=44977620</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=44977620</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44977620</guid></item><item><title><![CDATA[New comment by marcus_cemes in "Show HN: Bloom – A shadcn like UI library for Elixir and Phoenix"]]></title><description><![CDATA[
<p>Never heard of shadcn or franken-ui, but they look identical, one links to X (Twitter), the other to Mastodon. What's the story there?</p>
]]></description><pubDate>Sat, 04 May 2024 11:09:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=40256694</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=40256694</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40256694</guid></item><item><title><![CDATA[New comment by marcus_cemes in "Show HN: A JavaScript function that looks and behaves like a pipe operator"]]></title><description><![CDATA[
<p>This is clean JavaScript syntax in my opinion and should be what people strive for. It's perfectly readable, it's faster, it does async correctly without any unnecessary computation, can be typed and will have a normal stack trace. Piping is cool when done right, but can introduce complexity fast. Elixir is a good example where it works wonderfully.</p>
]]></description><pubDate>Wed, 27 Sep 2023 14:36:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=37675279</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=37675279</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37675279</guid></item><item><title><![CDATA[New comment by marcus_cemes in "Phoenix Dev Blog – Streams"]]></title><description><![CDATA[
<p>The two are not mutually exclusive, it's probably not an issue with horizontal scaling.</p>
]]></description><pubDate>Sat, 04 Mar 2023 18:12:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=35022999</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=35022999</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=35022999</guid></item><item><title><![CDATA[New comment by marcus_cemes in "Phoenix Dev Blog – Streams"]]></title><description><![CDATA[
<p>I think this is a great use case. From my experience, having everything in one language is a huge plus. You can pull data from the database and just inject it into the view. The closest I've gotten to this in the JS/TS world is a Prisma + tRPC + SvelteKit for E2E type safety, but there's a huge cost in complexity and language server performance and some extra boilerplate.<p>The main limitation is likely offline apps, LiveView requires a persistent connect to the server. I doubt this is something you'll encounter for your use case.</p>
]]></description><pubDate>Sat, 04 Mar 2023 18:07:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=35022961</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=35022961</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=35022961</guid></item><item><title><![CDATA[New comment by marcus_cemes in "Tauri Mobile – Develop Mobile Apps with JavaScript and Rust"]]></title><description><![CDATA[
<p>I decided to use Tauri for the first time for a university project and it was absolutely painless to design a small and useful GUI application to programatically generate schematics for photolithography masks.<p>- Single lightweight binary install and executable (~6 MB), clean uninstall<p>- Automatic updates (digitally signed, uploaded to a small VM)<p>- Integrates nicely with SvelteKit and TailwindCSS<p>- The Rust backend was able to integrate with GTSDK over FFI. The cmake crate made C++ compilation and linking automatic as part of cargo build, provided that a C++ toolchain is available (no problems even on Windows).<p>- No scary toolchain setup with a load of licenses to review and accept (looking at you, Flutter. I'm a student, not a lawyer. Although perhaps this will also be a thing with Tauri + Android?)<p>For a small project, I can't recommend it enough. I wouldn't know where to start with a C# or Qt GUI application, especially if I wanted to make it cross-platform.<p>It'll be interesting to see if it gains any traction in the mobile space. Flutter is great and may be better optimised for certain rendering techniques, such as infinite lists, but sticking with web technologies is a very compelling advantage.</p>
]]></description><pubDate>Wed, 01 Mar 2023 17:37:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=34985406</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=34985406</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34985406</guid></item><item><title><![CDATA[New comment by marcus_cemes in "Ask HN: Is TypeScript worth it?"]]></title><description><![CDATA[
<p>I guess this comes down to personal preference. For me, this is mixing the interface with the implementation. You shouldn't need to know how something works to be able to use it, for me, that's the real overhead. Maybe this works on a small scale, but what if the source code changes?<p>That being said, I do like inspecting the source from time to understand it better, or make up for missing documentation. Sometimes though, with this being JS, I wish that I could unsee the things that I've seen, code that production depends upon, deep within the dependency tree.<p>I agree with the idea of fluency when writing without types, but for me it's not about how fast you can write code. Code for me is a lot of rereading and understanding what the hell you wrote just a few days ago, I find typed code easier to get back into and it's faster to find things that broke in parts of the codebase that you're less familiar with when you change something.</p>
]]></description><pubDate>Fri, 13 Jan 2023 10:45:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=34366112</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=34366112</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34366112</guid></item><item><title><![CDATA[New comment by marcus_cemes in "Tell HN: Rust Is Complex"]]></title><description><![CDATA[
<p>Just for fun, I tried the static variable approach for myself. I have to agree with you, it's really hard. I gave up after half an hour. Rust doesn't seem to like casting references to pointers, which I understand, as I don't think there's a guarantee that they are just pointers. A &T[], for example, is a fat pointer (two words, also encodes the count). I think the correct approach here is either accept runtime overhead, or pass a context to each function as a parameter.<p>I also agree with your other statement. I think Rust tries to abstract a lot of behind into its own type system, such as Box<T> for pointers, whilst keeping it relatively fast. C is definitely the right tool for the job if you want direct memory access, I also think this is a relatively small proportion of people, working on OS, embedded systems or mission critical systems such as flight control/medical equipment.</p>
]]></description><pubDate>Mon, 14 Nov 2022 12:55:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=33593257</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=33593257</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33593257</guid></item><item><title><![CDATA[New comment by marcus_cemes in "Tell HN: Rust Is Complex"]]></title><description><![CDATA[
<p>I don't want to come off dogmatically defending Rust, I code little Rust in comparison to JS, and I've done C and C++ for some embedded systems. C is a very different monster to most other languages, I find people defending C to be just as proud and defensive as Rust programmers.<p>To address some of your complaints: yes, there are a lot of concepts to understand. I like wrappers, I found it crazy that in C, you first declare a mutex_t variable, and then you specifically have to call chMtxObjectInit(*mutex_t mutex) to initialise it [1]. If you forget? UB, kernel panic sometime in the future. I think Mutex::new() is far cleaner, and it's namespaced without arbitrary function prefixes. Binaries are tiny in comparison to JS/Python with deps, they will be larger than C. Compile times aren't that slow and you can't make extra language features happen out of thin air.<p>In C, I've found that it's commonplace to do a lot of clever and mysterious pointer and memory tricks to squeeze out performance and low resource utilisation. In embedded, there's usually a strong inclination to using "global" static variables, even declaring them inside function bodies because it "limits the visibility/scope of the variable". Not declaring a static variable inside a function is what knocked a few points off my Bachelor's robotics project.<p>I personally don't like this. It puts a lot of pressure on the programmer to understand the order of execution, and keep a complex mental model of how the program works. Large memory allocation, such as a cache, can be hidden in just about any function, not just at the top of a file where global variables are usually defined.<p>It sounds like what you're trying to accomplish <i>is</i> inherently unsafe, hence the "preaching", as in it requires the <i>programmer's</i> guarantee that 1) the data is fully initialised before it's accessed and 2) once the data is initialised, it's read-only and can therefore safely be accessed from other threads. C doesn't care, it will let you do a direct pointer access to a static variable with no overhead. Where's the cost? The programmer's mental model. I haven't tried, but I imagine that Rust's unsafe block will allow you to access static variables, just like in C with no overhead, effectively giving your OK to the compiler that you can vouch for the memory safety.<p>Rust solutions: lazy_static crate (safe, runtime cost in checking if initialised on every access), RwLock<Option<T>> (safe, runtime cost to lock and unwrap the option), unsafe (no overhead, memory model cost and potentially harder debugging), extra &T function parameter (code complexity cost, "prop-drilling", cleaner imo). On modern hardware, the runtime cost is absolutely negligeable.<p>Why would you not want to use Rust for a large project? This seems a bit contradictory to me. The safety guarantees in my opinion really pay off when the codebase is large, and it's difficult to construct that memory model, especially with a team working on different parts. Instead, you overload that work to the compiler to check the soundness of your memory access in the entire codebase.<p>If you like C, by all means keep on using it, I enjoyed my forray into C, it's simple and satisfying, but would much prefer Rust, after spending a lot of time tracking down memory corruption. Rust's original design purpose was to reduce memory bugs in large-scale projects, not to replace C/C++ for the fun of it. We usually have a natural inclination to what we know well and have used for a long time. Feel free to correct me if something is wrong.<p>1: <a href="http://www.chibios.org/dokuwiki/doku.php?id=chibios:documentation:books:rt:kernel_mutexes" rel="nofollow">http://www.chibios.org/dokuwiki/doku.php?id=chibios:document...</a></p>
]]></description><pubDate>Mon, 14 Nov 2022 11:40:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=33592684</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=33592684</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33592684</guid></item><item><title><![CDATA[New comment by marcus_cemes in "Carefully exploring Rust as a Python developer"]]></title><description><![CDATA[
<p>This kind of already exists in the form of #[no_panic] [1]?<p>> If the function does panic (or the compiler fails to prove that the function cannot panic), the program fails to compile with a linker error that identifies the function name.<p>1: <a href="https://github.com/dtolnay/no-panic" rel="nofollow">https://github.com/dtolnay/no-panic</a></p>
]]></description><pubDate>Sun, 13 Nov 2022 21:25:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=33587505</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=33587505</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33587505</guid></item><item><title><![CDATA[New comment by marcus_cemes in "Carefully exploring Rust as a Python developer"]]></title><description><![CDATA[
<p>Really hard question to answer simply. They're two languages that are at very opposite ends of the spectrum, yet they can usually both accomplish the same goal. I think the main difference is that Rust is significantly faster and uses less memory in the majority of cases, but also harder to learn and to reason about. Good package manager, tooling, etc, is a nice to have.<p>Python focuses on being simple, interpreted and dynamicaly typed, Rust requires you to specify the exact types of all the things (like C/C++) which allows it to generate really optimal compiled machine code before execution, it has more information to work with. Accessing a struct/"object" field is not a hash table lookup, it's a direct pointer access, as the exact size of things are known at compilation time.<p>If you're writing a script, a tool, a small game, it's simpler to use Python. If you're writing a database engine, a mission-critical piece of code that has to behave predictably without the possibility of random GC pauses, anything that has realtime constraints such as audio, lower-level languages like C, C++ and Rust are a must.<p>A lot of higher-level folk seem to enjoy Rust as well, especially in networking/the web, for whom the speed is worth the additional difficulty and complexity.</p>
]]></description><pubDate>Sun, 13 Nov 2022 21:16:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=33587416</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=33587416</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33587416</guid></item><item><title><![CDATA[New comment by marcus_cemes in "Carefully exploring Rust as a Python developer"]]></title><description><![CDATA[
<p>This is by choice, while it is really convienient to interrupt execution flow by throwing an arbitrary value, it's extremely hard to know whether calling library code can throw, and if yes, what kind of errors, without exceptional documentation.<p>The Result<T,E> type is very explicit, and can be easily ignored, composed or "re-thrown" with the "?" suffix without nested try/catch blocks. Return value based error handling is something Go, Elixir and other more functional languages have also adopted.<p>Panic is there to aleviate the really exceptional circumstances, when the trade-off for possible program termination is worth the much simplified error handling, such as when casting to a smaller integer type in case of overflow, or locking a mutex when it may be in a posioned state (which, funnily enough, can arrive when a panic occurred whilst the mutex was previously locked, i.e. the mutex guard is dropped during a panic).</p>
]]></description><pubDate>Sun, 13 Nov 2022 17:45:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=33585326</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=33585326</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33585326</guid></item><item><title><![CDATA[New comment by marcus_cemes in "Each visit to the page deteriorates the main image"]]></title><description><![CDATA[
<p>Probably more to do with the fact that people are mashing F5 to see the difference.</p>
]]></description><pubDate>Fri, 11 Nov 2022 21:39:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=33567219</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=33567219</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33567219</guid></item><item><title><![CDATA[New comment by marcus_cemes in "An animated introduction to Elixir"]]></title><description><![CDATA[
<p>I've been using WSL, which you can get from the Store now. Works for development and building releases, which then deploy to an Ubuntu VPS.</p>
]]></description><pubDate>Wed, 09 Nov 2022 07:30:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=33528436</link><dc:creator>marcus_cemes</dc:creator><comments>https://news.ycombinator.com/item?id=33528436</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33528436</guid></item></channel></rss>