<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: DarkPlayer</title><link>https://news.ycombinator.com/user?id=DarkPlayer</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 18 Jun 2026 07:22:08 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=DarkPlayer" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by DarkPlayer in "Abusive AI Web Crawlers: Get Off My Lawn"]]></title><description><![CDATA[
<p>We observed the same behavior. Each request used a different IP address and a random user agent. In our case, most of the IP addresses belonged to Chinese ISPs. They went to great lengths to avoid being blocked, but at the same time used user agents such as Windows 95/98 or IE 5. Fortunately, the combination of the odd user agents and the fact that they still use HTTP/1.1 makes them somewhat easy to identify. So you can use a captcha on more expensive endpoints to block them.</p>
]]></description><pubDate>Wed, 02 Apr 2025 15:24:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=43557728</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=43557728</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43557728</guid></item><item><title><![CDATA[New comment by DarkPlayer in "Software development topics I've changed my mind on"]]></title><description><![CDATA[
<p>> What we should have instead is syntax-aware diffs that can ignore meaningless changes like curly braces moving into another line or lines getting wrapped for reasons.<p>These diffs already exist (at least for some languages) but aren't yet integrated into the standard tools. For example, if you want a command line tool, you can use <a href="https://github.com/Wilfred/difftastic">https://github.com/Wilfred/difftastic</a> or if you are interested in a VS Code extension / GitHub App instead, you can give <a href="https://semanticdiff.com" rel="nofollow">https://semanticdiff.com</a> a try.</p>
]]></description><pubDate>Wed, 05 Feb 2025 16:42:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=42951146</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=42951146</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42951146</guid></item><item><title><![CDATA[New comment by DarkPlayer in "Software development topics I've changed my mind on"]]></title><description><![CDATA[
<p>> However at a minimum formatting changes shouldn’t regularly complicate doing a diff.<p>If the code needs to be reformatted, this should be done in a separate commit. Fortunately, there are now structural/semantic diff tools available for some languages that can help if someone hasn't properly split their formatting and logic changes.</p>
]]></description><pubDate>Wed, 05 Feb 2025 14:42:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=42949115</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=42949115</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42949115</guid></item><item><title><![CDATA[New comment by DarkPlayer in "Types are a basic tool of software design (2018)"]]></title><description><![CDATA[
<p>Difftastic would not solve the issue described by madeofpalk because it still highlights the added comma. You need a diff tool that can distinguish between optional and required syntax. So far I am not aware of any tool that supports this, except the one I am working on (SemanticDiff).</p>
]]></description><pubDate>Fri, 03 Jan 2025 21:27:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=42589655</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=42589655</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42589655</guid></item><item><title><![CDATA[New comment by DarkPlayer in "Mergiraf: a syntax-aware merge driver for Git"]]></title><description><![CDATA[
<p>Our parsers simply return the concrete syntax trees in a JSON format. We do not unify all the different syntax constructs into a common AST if that is what you are looking for. The languages and file formats we support are too diverse for that.<p>The language specific logic does not end with the parsers though. The core of SemanticDiff also contains language specific rules that are picked up by the matching and visualization steps. For example, the HTML module might add a rule that the order of attributes within a tag is irrelevant. So it all comes down to writing a generic rule system that makes it easy to add new languages.</p>
]]></description><pubDate>Sat, 09 Nov 2024 20:01:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=42096528</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=42096528</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42096528</guid></item><item><title><![CDATA[New comment by DarkPlayer in "Mergiraf: a syntax-aware merge driver for Git"]]></title><description><![CDATA[
<p>> - for diffing, the matching of the leaves is what matters the most, for merging the internal nodes are more important,<p>The leaves are the ones that end up being highlighted in the diff, but the inner nodes play an important role as well. We try to preserve as much of the code structure as possible when mapping the nodes. A developer is unlikely to change the structure of the code just for fun. A mapping with a larger number of structural changes is therefore more likely to be incorrect.<p>> - for diffing, it feels more acceptable to restrict the matching to be monotonous on the leaves since it's difficult to visually represent moves if you can detect them. For merging, supporting moves is more interesting as it lets you replay changes on the moved element,<p>We use a pipeline based approach and visualizing the changes is the last step. For some types of changes we don't have a way to visualize them yet (e.g. moves within the same line) and ignore that part of the mapping. We are still trying to get the mapping right though :)<p>We upstreamed a few bug fixes for tree-sitter itself. The grammars were a bit more complicated because we were just using them as a starting point. We patched tree-sitter, added our own annotations to the grammars and restructured them to help our matching algorithm achieve better results and improve performance. In the end there was not much to upstream any more.<p>Using a well tested parsing library, such as Roslyn for C#, and writing some code to integrate it into our existing system aligned more with our goals than tinkering with grammars. Context-sensitive keywords in particular were a constant source of annoyance. The grammar looks correct, but it will fail to parse because of the way the lexer works. You don't want your tool to abort just because someone named their parameter "async".</p>
]]></description><pubDate>Sat, 09 Nov 2024 19:11:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=42096237</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=42096237</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42096237</guid></item><item><title><![CDATA[New comment by DarkPlayer in "Mergiraf: a syntax-aware merge driver for Git"]]></title><description><![CDATA[
<p>I don't think that different algorithms are better for merging or diffing. In both cases, the first step is to match identical nodes, and the quality of the final result depends heavily on this step. The main problem with GumTree is that it is a greedy algorithm. One incorrectly matched node can completely screw up the rest of the matches. A typical example we encountered was adding a decorator to a function in Python. When other functions with the same decorator followed, the algorithm would often map the newly added decorator to an existing decorator, causing all other decorator mappings to be "off-by-one". GumTree has a tendency to come up with more changes than there actually are.<p>We try to really get the diff quality nailed down before going after merges. We don't have merge functionallity in SemanticDiff yet.<p>The main issue we have with tree-sitter is that the grammars are often written from scratch and not based on the upstream grammar definition. Sometimes they only cover the most likely cases which can lead to parsing errors or incorrectly parsed code. When you encounter parsing errors it can be difficult to fix them, because the upstream grammar is structured completely different. To give you an example, try to compare the tree-sitter Go grammar for types [1] with the upstream grammar [2]. It is similar but the way the rules are structured is somewhat inverted.<p>We use separate executables for the parsers (this also helps to secure them using seccomp on Linux), and they all use the same JSON schema for their output. This allows us to write the parser executable in the most appropriate language for the target language. Building all them statically and cross-platform for our VS Code extension isn't easy though ;)<p>[1]: <a href="https://github.com/tree-sitter/tree-sitter-go/blob/master/grammar.js#L289">https://github.com/tree-sitter/tree-sitter-go/blob/master/gr...</a>
[2]: <a href="https://go.dev/ref/spec#Types" rel="nofollow">https://go.dev/ref/spec#Types</a></p>
]]></description><pubDate>Sat, 09 Nov 2024 16:48:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=42095381</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=42095381</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42095381</guid></item><item><title><![CDATA[New comment by DarkPlayer in "Mergiraf: a syntax-aware merge driver for Git"]]></title><description><![CDATA[
<p>Looking at the architecture, they will probably run into some issues. We are doing something similar with SemanticDiff [1] and also started out using tree-sitter grammars for parsing and GumTree for matching. Both choices turned out to be problematic.<p>Tree sitter grammars are primarily written to support syntax highlighting and often use a best effort approach to parsing. This is perfectly fine for syntax highlighting, since the worst that can happen is that a few characters are highlighted incorrectly. However, when diffing or modifying code you really want the code to be parsed according to the upstream grammar, not something that mostly resembles it. We are currently in the process of moving away from tree-sitter and instead using the parsers provided by the languages themselves where possible.<p>GumTree is good at returning a result quickly, but there are quite a few cases where it always returned bad matches for us, no matter how many follow-up papers with improvements we tried to implement. In the end we switched over to a dijkstra based approach that tries to minimize the cost of the mapping, which is more computationally expensive but gives much better results. Difftastic uses a similar approach as well.<p>[1]: <a href="https://semanticdiff.com/" rel="nofollow">https://semanticdiff.com/</a></p>
]]></description><pubDate>Sat, 09 Nov 2024 15:16:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=42094842</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=42094842</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42094842</guid></item><item><title><![CDATA[New comment by DarkPlayer in "How far should a programming language aware diff go?"]]></title><description><![CDATA[
<p>You can find a comparison of the two tools here: <a href="https://semanticdiff.com/blog/semanticdiff-vs-difftastic/" rel="nofollow">https://semanticdiff.com/blog/semanticdiff-vs-difftastic/</a><p>As author of SemanticDiff, I am obviously a bit biased. But Wilfred, the author of difftastic, found the analysis to be "pretty even-handed" [1], so I think it should be somewhat fair.<p>[1]: <a href="https://x.com/_wilfredh/status/1764424652611318146" rel="nofollow">https://x.com/_wilfredh/status/1764424652611318146</a></p>
]]></description><pubDate>Mon, 22 Jul 2024 20:00:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=41039144</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=41039144</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41039144</guid></item><item><title><![CDATA[New comment by DarkPlayer in "How far should a programming language aware diff go?"]]></title><description><![CDATA[
<p>The VS Code extension works offline. The diff calculation is performed on the host where the VS Code GUI is running (makes a difference in case of SSH/Docker/WSL).</p>
]]></description><pubDate>Mon, 22 Jul 2024 19:20:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=41038660</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=41038660</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41038660</guid></item><item><title><![CDATA[New comment by DarkPlayer in "How far should a programming language aware diff go?"]]></title><description><![CDATA[
<p>Hi, author of SemanticDiff here.<p>I'm sorry you didn't have a good experience testing the tool. If it doesn't work / makes things worse than a standard diff, that's definitely considered a bug. It is probably something specific to your code and not a general issue. It would therefore be great if you could open an issue [1] or support ticket [2], ideally with some sample code, so we can take a look. Thanks in advance!<p>[1] <a href="https://github.com/Sysmagine/SemanticDiff/issues">https://github.com/Sysmagine/SemanticDiff/issues</a>
[2] support@semanticdiff.com</p>
]]></description><pubDate>Sat, 20 Jul 2024 20:21:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=41019476</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=41019476</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41019476</guid></item><item><title><![CDATA[How far should a programming language aware diff go?]]></title><description><![CDATA[
<p>Article URL: <a href="https://semanticdiff.com/blog/language-aware-diff-how-far/">https://semanticdiff.com/blog/language-aware-diff-how-far/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=40987674">https://news.ycombinator.com/item?id=40987674</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Wed, 17 Jul 2024 16:36:24 +0000</pubDate><link>https://semanticdiff.com/blog/language-aware-diff-how-far/</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=40987674</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40987674</guid></item><item><title><![CDATA[SemanticDiff 0.9.0: Support for HTML, Vue, Swift and More]]></title><description><![CDATA[
<p>Article URL: <a href="https://semanticdiff.com/blog/semanticdiff-0.9.0/">https://semanticdiff.com/blog/semanticdiff-0.9.0/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=40917931">https://news.ycombinator.com/item?id=40917931</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 09 Jul 2024 16:23:54 +0000</pubDate><link>https://semanticdiff.com/blog/semanticdiff-0.9.0/</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=40917931</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40917931</guid></item><item><title><![CDATA[New comment by DarkPlayer in "Difftastic, a structural diff tool that understands syntax"]]></title><description><![CDATA[
<p>> I am curious if there's been any work on _semantic_ diff tools as well (for when eg the syntax changes but the meaning is the same)<p>We are working on <a href="https://semanticdiff.com/" rel="nofollow">https://semanticdiff.com/</a> which detects basic semantic changes like converting a literal from decimal to hex or reordering keys within JSON objects. It is not a command line utility but a VS Code extension and GitHub App. You can check out <a href="https://semanticdiff.com/blog/semanticdiff-vs-difftastic/" rel="nofollow">https://semanticdiff.com/blog/semanticdiff-vs-difftastic/</a> if you want to learn more about how it works and how it differs from difftastic.</p>
]]></description><pubDate>Thu, 21 Mar 2024 19:12:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=39783065</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=39783065</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39783065</guid></item><item><title><![CDATA[New comment by DarkPlayer in "Large pull requests slow down development"]]></title><description><![CDATA[
<p>There are some tools that can separate actual code changes from reformatting changes. I am working on <a href="https://semanticdiff.com" rel="nofollow noreferrer">https://semanticdiff.com</a>, a VS Code Extension / GitHub App that can help you with this. There is also difftastic if you prefer a CLI based solution. It supports more languages but can detect fewer types of reformatting changes.</p>
]]></description><pubDate>Wed, 22 Nov 2023 02:17:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=38373786</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=38373786</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38373786</guid></item><item><title><![CDATA[New comment by DarkPlayer in "Will LLMs Eclipse the Classic Code Diff Algorithms?"]]></title><description><![CDATA[
<p>I think LLMs will have a hard time replacing traditional diff algorithms. You want your diff to be reliable and predictable. It shouldn't omit relevant changes. This is not really a strength of LLMs.<p>I think a system that parses the code and uses verifiable rules to hide invariant changes would have a much easier time being adopted. I may be biased since I work on SemanticDiff (think difftastic but for VS Code and GitHub) and have implemented such rules myself. There have been several times where I've thought about implementing a new rule, only to find out that some obscure edge case would not be handled correctly. So I don't see how LLMs could handle these cases correctly in the near future.</p>
]]></description><pubDate>Thu, 09 Nov 2023 20:45:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=38211001</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=38211001</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38211001</guid></item><item><title><![CDATA[New comment by DarkPlayer in "I gave commit rights to someone I didn't know (2016)"]]></title><description><![CDATA[
<p>I am working on a GitHub pull request viewer that displays changes using a semantic diff, and therefore has some more advanced whitespace handling behavior than just ignoring leading or trailing whitespace. I tried it with this PR:<p><a href="https://app.semanticdiff.com/django-money/django-money/pull/2/files#djmoney/models/fields.py" rel="nofollow">https://app.semanticdiff.com/django-money/django-money/pull/...</a><p>It doesn't make a huge difference, but it filters out changes like the added line break in "if value: value = str(value)" nicely. I haven't announced the project yet, but maybe someone will find it useful :-)</p>
]]></description><pubDate>Tue, 30 May 2023 18:42:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=36128799</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=36128799</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36128799</guid></item><item><title><![CDATA[New comment by DarkPlayer in "Difftastic: A diff that understands syntax"]]></title><description><![CDATA[
<p>We are working on a code review tool which supports unified diffs with semantic diffing. If that sounds interesting for you, take a look at <a href="https://mergeboard.com" rel="nofollow">https://mergeboard.com</a></p>
]]></description><pubDate>Tue, 29 Mar 2022 18:55:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=30846846</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=30846846</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30846846</guid></item><item><title><![CDATA[Execute Docker Containers as QEMU MicroVMs]]></title><description><![CDATA[
<p>Article URL: <a href="https://mergeboard.com/blog/2-qemu-microvm-docker/">https://mergeboard.com/blog/2-qemu-microvm-docker/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=27530074">https://news.ycombinator.com/item?id=27530074</a></p>
<p>Points: 178</p>
<p># Comments: 63</p>
]]></description><pubDate>Wed, 16 Jun 2021 16:05:21 +0000</pubDate><link>https://mergeboard.com/blog/2-qemu-microvm-docker/</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=27530074</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=27530074</guid></item><item><title><![CDATA[Use a real Windows 7 partition in Virtualbox / KVM / VMware Player under Linux]]></title><description><![CDATA[
<p>Article URL: <a href="http://fds-team.de/cms/articles/2013-12/use-a-real-windows-7-partition-in-virtualbox-kvm-vmware-player-u.html">http://fds-team.de/cms/articles/2013-12/use-a-real-windows-7-partition-in-virtualbox-kvm-vmware-player-u.html</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=6964346">https://news.ycombinator.com/item?id=6964346</a></p>
<p>Points: 63</p>
<p># Comments: 15</p>
]]></description><pubDate>Wed, 25 Dec 2013 21:38:20 +0000</pubDate><link>http://fds-team.de/cms/articles/2013-12/use-a-real-windows-7-partition-in-virtualbox-kvm-vmware-player-u.html</link><dc:creator>DarkPlayer</dc:creator><comments>https://news.ycombinator.com/item?id=6964346</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=6964346</guid></item></channel></rss>