<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: rmcclellan</title><link>https://news.ycombinator.com/user?id=rmcclellan</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Mon, 06 Jul 2026 23:50:02 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=rmcclellan" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by rmcclellan in "The Design of the Roland Juno Syntheziser's Oscillators"]]></title><description><![CDATA[
<p>Great article!<p>For those interested in an open source design embodying these techniques, I have an open source hardware design here: <a href="https://github.com/russellmcc/dco" rel="nofollow">https://github.com/russellmcc/dco</a> with a blog write-up here: <a href="https://www.russellmcc.com/posts/2013-12-01-DCO.html" rel="nofollow">https://www.russellmcc.com/posts/2013-12-01-DCO.html</a> .<p>Also of relevance is an open source hardware design for the later roland alpha juno digital oscillator design: <a href="https://github.com/russellmcc/alphaosc" rel="nofollow">https://github.com/russellmcc/alphaosc</a> <a href="https://www.russellmcc.com/posts/2019-06-14-Alpha-DCO.html" rel="nofollow">https://www.russellmcc.com/posts/2019-06-14-Alpha-DCO.html</a></p>
]]></description><pubDate>Sun, 10 Jan 2021 16:08:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=25716039</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=25716039</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25716039</guid></item><item><title><![CDATA[New comment by rmcclellan in "Looping Music Seamlessly"]]></title><description><![CDATA[
<p>Awesome project!  As a professional audio developer, I was really blown away that this was the author's first project working with audio.<p>For anyone interested, I'd recommend checking out "The Infinite Jukebox", which has a similar goal, but perhaps a more robust approach: <a href="http://infinitejukebox.playlistmachinery.com" rel="nofollow">http://infinitejukebox.playlistmachinery.com</a><p>If I had to guess at why your approach didn't work well on recorded music, it's probably because most of the time, there is more than a single event happening at a time, so picking out just the highest FFT bin is probably not a very robust "fingerprint" of that part of the music.  The infinite jukebox uses timbral features as the fingerprint, rather than just a single note.</p>
]]></description><pubDate>Mon, 28 Oct 2019 13:36:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=21376828</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=21376828</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=21376828</guid></item><item><title><![CDATA[New comment by rmcclellan in "“Modern” C++ Lamentations"]]></title><description><![CDATA[
<p>Thanks for the clarification.  I guess like all trade-offs, it's context dependent.  I see the advantages of having a realtime usable non-optimized build for debugging.  Since I use modern libraries like Eigen, that option has not been available to me for some time.<p>With "modern" techniques, the performance ceiling is a bit higher - whether that benefit is worth it depends on a lot of factors.</p>
]]></description><pubDate>Fri, 28 Dec 2018 19:09:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=18778742</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=18778742</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=18778742</guid></item><item><title><![CDATA[New comment by rmcclellan in "“Modern” C++ Lamentations"]]></title><description><![CDATA[
<p>Well, you aren’t rebuilding your binary every frame, are you?  I might be missing something.<p>Also, I think build time is super important in most contexts - what I think is less important is runtime speed when you’ve disabled all optimizations.</p>
]]></description><pubDate>Fri, 28 Dec 2018 18:45:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=18778593</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=18778593</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=18778593</guid></item><item><title><![CDATA[New comment by rmcclellan in "“Modern” C++ Lamentations"]]></title><description><![CDATA[
<p>I work using C++17 for high performance applications, and I can relate to a lot of these gripes.  I think it's a fair point that C++ is unreasonably complex as a language, and it's been a serious problem in the community for a long time.<p>One part that really struck me as odd is the focus on non-optimized performance.  To me, this is an important consideration, but not nearly as important as optimized performance.  Using techniques like ranges can definitely slow down debug performance, but much of the time it _dramatically increases_ optimized performance vs. naive techniques.<p>How do ranges speed up optimized builds?  One of the best techniques for very high performance code is separation of specifying the algorithm and scheduling the computation.  What I mean by this is techniques like [eigen](<a href="http://eigen.tuxfamily.org/index.php?title=Main_Page" rel="nofollow">http://eigen.tuxfamily.org/index.php?title=Main_Page</a>) and [halide](<a href="http://halide-lang.org" rel="nofollow">http://halide-lang.org</a>) where you can control _what_ gets done and _how_ it gets done separately.  Being able to modify execution orders like this is critical for ensuring that you're using your single-core parallelism and cache space in an efficient way.  This sort of control is exactly what you get out of range view transformers.</p>
]]></description><pubDate>Fri, 28 Dec 2018 18:15:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=18778389</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=18778389</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=18778389</guid></item><item><title><![CDATA[New comment by rmcclellan in "In the C++ bag of tricks: scoped locks"]]></title><description><![CDATA[
<p>There was a C with Classes.<p><a href="http://www.stroustrup.com/bs_faq.html#invention" rel="nofollow">http://www.stroustrup.com/bs_faq.html#invention</a></p>
]]></description><pubDate>Fri, 07 Feb 2014 21:11:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=7198760</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=7198760</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=7198760</guid></item><item><title><![CDATA[New comment by rmcclellan in "Clojure's core.typed vs Haskell"]]></title><description><![CDATA[
<p>Of course you can do this in Haskell:<p><a href="http://www.haskell.org/ghc/docs/7.6.2/html/libraries/base/Unsafe-Coerce.html#v:unsafeCoerce" rel="nofollow">http://www.haskell.org/ghc/docs/7.6.2/html/libraries/base/Un...</a></p>
]]></description><pubDate>Mon, 30 Sep 2013 14:33:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=6469804</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=6469804</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=6469804</guid></item><item><title><![CDATA[Timeline editor for JavaScript]]></title><description><![CDATA[
<p>Article URL: <a href="http://www.russellmcc.com/timelinejs/">http://www.russellmcc.com/timelinejs/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=5458049">https://news.ycombinator.com/item?id=5458049</a></p>
<p>Points: 3</p>
<p># Comments: 1</p>
]]></description><pubDate>Thu, 28 Mar 2013 22:20:48 +0000</pubDate><link>http://www.russellmcc.com/timelinejs/</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=5458049</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=5458049</guid></item><item><title><![CDATA[Show HN: Sound Effect Generator in HTML5]]></title><description><![CDATA[
<p>Article URL: <a href="http://www.russellmcc.com/soundfxweb/">http://www.russellmcc.com/soundfxweb/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=5346095">https://news.ycombinator.com/item?id=5346095</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 08 Mar 2013 22:17:21 +0000</pubDate><link>http://www.russellmcc.com/soundfxweb/</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=5346095</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=5346095</guid></item><item><title><![CDATA[New comment by rmcclellan in "What happens when you ask people to pick the lowest unique prime number."]]></title><description><![CDATA[
<p>This was done on a much larger scale (without primes) as a lottery game in Sweden called "Limbo" or "LUPI" (lowest unique positive integer).  Several game theorists have analyzed the data with some interesting results:<p><a href="http://swopec.hhs.se/hastef/abs/hastef0671.htm" rel="nofollow">http://swopec.hhs.se/hastef/abs/hastef0671.htm</a><p>Calculating the equillibrium strategy for rational actors is difficult because each player doesn't know how many other players there are.  In the paper above, game theorists calculate it and show that the distributions seen in the lottery match up fairly well to a rational strategy.</p>
]]></description><pubDate>Wed, 20 Jun 2012 00:01:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=4134902</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=4134902</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=4134902</guid></item><item><title><![CDATA[New comment by rmcclellan in "Why multi-armed bandit algorithm is not "better" than A/B testing"]]></title><description><![CDATA[
<p>Multi-armed bandit isn't an algorithm, it's a model of how to view the problem.  Like it or not, the problem web designers face fits the multi-armed bandit model pretty well.  The algorithm called "MAB" in the article is one of many that have been developed for multi-armed bandit problems.  Traditionally, the "MAB" of this article is known as "epsilon-greedy".<p>The point of multi-armed bandit situations is that there is a trade-off to be made between gaining new knowledge and exploiting existing knowledge.  This comes up in your charts - the "MAB"s always have better conversion rates, because they balance between the two modes.  The "A/B testing" always gain more information quickly because they ignore exploitation and only focus on exploration.<p>I should say also that multi-armed bandit algorithms also aren't supposed to be run as a temporary "campaign" - they are "set it and forget it".  In epsilon-greedy, you never stop exploring, even after the campaign is over.  In this way, you don't need to achieve "statistical significance" because you're never taking the risk of choosing one path for all time.  In traditional A/B testing, there's always the risk of picking the wrong choice.<p>You aren't comparing A/B testing to a multi-armed bandit algorithm because <i>both</i> are multi-armed bandit algorithms. You're in a bandit situation either way.  The strategy you were already using for your A/B tests is a different common bandit strategy called "epsilon-first" by wikipedia, and there is a bit of literature on how it compares to epsilon-greedy.<p><a href="http://en.wikipedia.org/wiki/Multi-armed_bandit#Common_bandit_strategies" rel="nofollow">http://en.wikipedia.org/wiki/Multi-armed_bandit#Common_bandi...</a></p>
]]></description><pubDate>Fri, 01 Jun 2012 13:22:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=4053215</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=4053215</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=4053215</guid></item><item><title><![CDATA[New comment by rmcclellan in "What's The Best Language For Safety Critical Software?"]]></title><description><![CDATA[
<p>I find it interesting that there is no mention of using dependently typed languages or proof engines for this application.  Something like Coq, where you write the formal proof of correctness as you write the program, would fit the bill nicely if you really care about safety over ease of implementation.</p>
]]></description><pubDate>Tue, 08 May 2012 14:45:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=3943844</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=3943844</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=3943844</guid></item><item><title><![CDATA[New comment by rmcclellan in "Semicolon: A language of semicolons"]]></title><description><![CDATA[
<p>Seems like a nice companion to Whitespace:<p><a href="http://en.wikipedia.org/wiki/Whitespace_(programming_language)" rel="nofollow">http://en.wikipedia.org/wiki/Whitespace_(programming_languag...</a></p>
]]></description><pubDate>Tue, 17 Apr 2012 18:35:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=3854250</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=3854250</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=3854250</guid></item><item><title><![CDATA[New comment by rmcclellan in "The Best Textbooks on Every Subject"]]></title><description><![CDATA[
<p>I have mixed feelings about this book.  It's how I learned electronics, so I can't knock it too much.  However, sometimes the explanations, which tend to be intuitive rather than logical, can be quite hard to follow for someone who is more methodically-minded.  So, for the nitty-gritty analog stuff in the bipolar transistor chapter of AoE, I much prefer "Design of Analog Integrated Circuits" by Gray and Meyer.  It works for discrete circuits, too, even though integrated is in the name.</p>
]]></description><pubDate>Mon, 26 Mar 2012 01:45:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=3754554</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=3754554</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=3754554</guid></item><item><title><![CDATA[New comment by rmcclellan in "x86 Assembly Primer for C Programmers"]]></title><description><![CDATA[
<p>64 bit x86 is very similar to 32 bit.  The differences are covered in on slides 191-193 in this deck.<p>The biggest difference for me is the difference in the calling convention.  In 32 bit, all arguments generally are placed on the stack for "standard" calls.  In 64 bit, different OSes have different conventions:<p><a href="http://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions" rel="nofollow">http://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_...</a> (note that OS X and linux use the "System V" calling conventions)</p>
]]></description><pubDate>Mon, 26 Mar 2012 00:07:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=3754303</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=3754303</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=3754303</guid></item><item><title><![CDATA[New comment by rmcclellan in "Sorting in C++: 3 times faster than C"]]></title><description><![CDATA[
<p>While I agree that this is totally possible, are there any shipping, non-buggy optimizers that do this?  Sometimes C/C++ seems purposely designed to make the compiler/optimizer's job difficult.</p>
]]></description><pubDate>Sat, 17 Mar 2012 13:25:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=3717010</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=3717010</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=3717010</guid></item><item><title><![CDATA[New comment by rmcclellan in "There is no point to distributing music in 24-bit/192kHz format."]]></title><description><![CDATA[
<p>I'm not sure what you're getting at.<p>As a thought experiment, let's consider a pulse that has been band-limited to 20kHz.  Are you arguing that the analog output of a (filtered, idealized) DAC would look different depending on whether the dac was running at 44.1kHz vs 192kHz?  If so, I don't think many people would agree with you.<p>Any difference in the "timing" of the output wave would have to come from energy that falls above nyquist of the slower sample rate.  So, while I agree with you that the timing would be sharper, this is exactly caused by "higher frequencies", not by some other sort of timing improvement.</p>
]]></description><pubDate>Tue, 06 Mar 2012 00:59:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=3669181</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=3669181</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=3669181</guid></item><item><title><![CDATA[New comment by rmcclellan in "There is no point to distributing music in 24-bit/192kHz format."]]></title><description><![CDATA[
<p>This is completely incorrect, by shannon (<a href="http://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem" rel="nofollow">http://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_samplin...</a>).  The sampling frequency determines the maximum frequency that can be captured, not the temporal resolution.  That said, a transient containing higher frequencies will be <i>sharper</i> than a transient that doesn't, but its onset time resolution will not be determined at all by the sample rate.<p>Said another way, two band limited pulse signals with different onset times, no matter how arbitrarily close, will result in different sampled signals.</p>
]]></description><pubDate>Mon, 05 Mar 2012 23:08:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=3668862</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=3668862</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=3668862</guid></item><item><title><![CDATA[New comment by rmcclellan in "The Day Python Embarassed Imperative Programming"]]></title><description><![CDATA[
<p>I completely agree.  It's hard for beginners to learn that a monad isn't a thing, it's an property that can apply to many different things.  A monad is so general it's hard to have a single intuition about it.<p>I think perhaps another reason why beginners find monads so hard to understand, especially those coming from a math background, is that >>= is a bizarre presentation of monads.  I think, for example, defining a monad as an applicative with a join operation would have been a much better idea - most monads, like Maybe or [], make the most sense to me as "containers" that can be joined.  The bind operator never really made intuitive sense to me when thinking about a monad as a container with a structure.  Plus, to me, m (m a) -> m a is a lot easier to recognize than m a -> (a -> m b) -> m b.<p>This is especially true since applicatives are now becoming a very popular language idiom.  It seems unfair to beginners to make them try to understand applicatives and then make them learn an unrelated typeclass for monads, when mathematically the two are very similar objects.</p>
]]></description><pubDate>Mon, 27 Feb 2012 22:49:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=3641012</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=3641012</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=3641012</guid></item><item><title><![CDATA[New comment by rmcclellan in "Why Python is Important for You"]]></title><description><![CDATA[
<p>Neither solution is great.  Excessive use of return and continue is an incredibly fast way of making code completely incomprehensible.<p>Such complicated control flows should be treated as a major, fundamental problem.  Keeping them in place will cause bugs and prevent future contributors from having confidence that their changes are correct.  The problem of complicated control flow is too deep to be solved with a band-aid like this, although perhaps syntactically it looks a bit nicer.  In fact, this is exactly what people did before the so-called "structured programming adepts" came around, except using gotos instead of continues.  It didn't work so well back then, and it doesn't work so well now.</p>
]]></description><pubDate>Sat, 11 Feb 2012 20:24:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=3580055</link><dc:creator>rmcclellan</dc:creator><comments>https://news.ycombinator.com/item?id=3580055</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=3580055</guid></item></channel></rss>