Stuff I read last week https://www.snellman.net/lastweek/ Links and short commentary 2020-07-13 https://www.snellman.net/lastweek/page/36 <ul> <li> <div><a id='218-link' href=https://nplusonemag.com/issue-19/essays/chat-wars/>Chat Wars</a></div> <div><p> Great cat and mouse story of a MS Messenger interoperability with AIM. I don't know if the punchline is how AOL finally made a change MS could not emulate (by exploiting a buffer overflow in AIM to do remote code execution to craft a response packet), or how MS bungled up the PR response to that. </p></div> </li> <li> <div><a id='219-link' href=http://moishelettvin.blogspot.com/2006/11/windows-shutdown-crapfest.html>The Windows Shutdown crapfest</a></div> <div><p> Another classic description of early 2k organizational dysfunction of MS. </p></div> </li> <li> <div><a id='220-link' href=https://github.com/frankmcsherry/blog/blob/master/posts/2015-08-15.md>Sorting out graph processing</a></div> <div><p> Random access vs. radix sort. </p></div> </li> <li> <div><a id='222-link' href=https://typesandtimes.net/2020/01/decade-dilemma>How to Periodize History: 2020 and the Decade Dilemma</a></div> <div><p> The Cardinals vs. the Ordinals, on where the boundaries between decades are. What does it say that despite reading so much nitpicking about this around 2000, I never knew that the ISO 8601 definition of decade is the one that's ostensible wrong. </p> </div> </li> </ul> jsnell@iki.fi (Juho Snellman) links Mon, 13 Jul 2020 19:54:14 GMT https://www.snellman.net/lastweek/page/36 2020-06-22 https://www.snellman.net/lastweek/page/35 <ul> <li> <div><a id='210-link' href=https://arxiv.org/abs/1712.09624>Cuckoo++ Hash Tables: High-Performance Hash Tables for Networking Applications</a></div> <div><p>Avoid wasting time on fetching the secondary bucket by maintaining a bloom filter of keys that required falling back to the secondary.</p></div> </li> <li> <div><a id='211-link' href=https://github.com/technicolor-research/cuckoopp>/technicolor-research/cuckoopp</a></div> <div>Source code for the above. One thing I was wondering about when reading the paper was how the bloom lookup was used in practice. Turns out the result is just branched off of. Wonder if there would have been gains in making that branchless.</div> </li> <li> <div><a id='212-link' href=https://www.usenix.org/conference/atc18/presentation/andre>Don't share, Don't lock: Large-scale Software Connection Tracking with Krononat</a></div> <div>The system the above hash table was built for. SDN NAT with some sexy performance numbers.</div> </li> <li> <div><a id='213-link' href=http://www.vldb.org/pvldb/vol8/p353-barber.pdf>Memory-Efficient Hash Joins</a></div> <div><p> A linear probing hash table for batch purposes that can basically get 100% occupancy by having a dense hash-key sorted array as the primary, and a bit-array with popcount tricks to find the index into the dense array. It's not at all obvious to me why this works, it seems like for any reasonable hash code length the bitmap has to be wasting tremendous amounts of memory. Especially considering their bitmap encoding seems wasteful (two bits per possible hashcode, seems like you could get it very close to one bit without any more memory accesses). </p> <p> But the benchmarks claim it works, so... </p> </div> </li> <li> <div><a id='214-link' href=https://google.github.io/flatbuffers/flexbuffers.html>Flexbuffers</a></div> <div><p> Schema-less flatbuffers. The <a href=https://news.ycombinator.com/item?id=23588558>HN thread</a> turned into a delightful pissing match between protobuf implementors. </p> </div> </li> <li> <div><a id='215-link' href=https://www.cockroachlabs.com/blog/vectorized-hash-joiner/>40x faster hash joiner with vectorized execution</a></div> <div><p> Converting a (part of a) row-order query engine to batched column-order. </p></div> </li> <li> <div><a id='216-link' href=http://cidrdb.org/cidr2005/papers/P19.pdf>MonetDB/X100: Hyper-Pipelining Query Execution</a></div> <div><p> This seems to be the patient zero for database engines optimizing for branch mispredicts by batching operations on homogenous data? </p> </div> </li> <li> <div><a id='217-link' href=https://squidfunk.github.io/protobluff/design-rationale/>Protobluff - Design Rationale</a></div> <div><p> Protobuf dom that works entirely in-place on the original input string. </p> </div> </li> </ul> jsnell@iki.fi (Juho Snellman) links Mon, 22 Jun 2020 00:10:48 GMT https://www.snellman.net/lastweek/page/35 2020-06-15 https://www.snellman.net/lastweek/page/34 <ul> <li> <div><a id='204-link' href=https://users.soe.ucsc.edu/~ejw/papers/Smith-Launchpad-TCIAIG-2011.pdf>Launchpad: A Rhythm-Based Level Generator for 2-D Platformers</a></div> <div><p> A level generator for 2-D platformers built on a rhythm-based model of player behavior, derived from an analysis of existing platformer games </p> </div> </li> <li> <div><a id='205-link' href=http://julian.togelius.com/Dahlskog2012Patterns.pdf>Patterns and Procedural Content Generation</a></div> <div><p> Analyzing the Super Mario Bros. levels using a framework of repeating patterns. </p> </div> </li> <li> <div><a id='206-link' href=https://www.youtube.com/watch?v=yy8jQgmhbAU>OOP Is Dead, Long Live Data-oriented Design</a></div> <div><p> Linkbait title, but this was a good data-oriented design walk-through for a non-gaming use case. (I'm still trying to understand what counts as DoD and what doesn't, since it sometimes feels like 90% of it is common sense.) </p> </div> </li> <li> <div><a id='207-link' href=https://github.com/CppCon/CppCon2018/blob/master/Presentations/oop_is_dead_long_live_dataoriented_design/oop_is_dead_long_live_dataoriented_design__stoyan_nikolov__cppcon_2018.pdf>OOP Is Dead, Long Live Data-oriented Design</a></div> <div><p> Slides for the above. </p> </div> </li> <li> <div><a id='208-link' href=https://www.vidarholen.net/contents/blog/?p=878>Zsh and Fish’s simple but clever trick for highlighting missing linefeeds</a></div> <div><p> It's a great feature, and I would never have guessed how it works. </p></div> </li> <li> <div><a id='209-link' href=https://arxiv.org/pdf/1503.07387.pdf>Vectorized VByte Decoding</a></div> <div><p> SIMD-ified parsing of the Google-style MSB-bit-1 varints. Don't think it'll work for one little project I've been doodling around with, due to being optimized for decoding multiple small varints with one call. </p> </div> </li> </ul> jsnell@iki.fi (Juho Snellman) links Mon, 15 Jun 2020 06:12:04 GMT https://www.snellman.net/lastweek/page/34 2018-09-03 https://www.snellman.net/lastweek/page/33 <ul> <li> <div><a id='199-link' href=http://liacs.leidenuniv.nl/~kosterswa/nonodec2012.pdf>On the difficulty of nonograms</a></div> <div><p> An algorithm for computing a difficulty rating for a nonogram. </p> </div> </li> <li> <div><a id='200-link' href=https://webpbn.com/survey/>Survey of Paint-by-Number Puzzle Solvers</a></div> <div><p> A comparison of a bunch of nonogram solvers and the implementation strategies. </p> </div> </li> <li> <div><a id='201-link' href=https://webpbn.com/index.cgi?page=solving.html>Advanced [Nonogram] Solving Techniques</a></div> <div><p> The strategies a human would use for solving Nongrams. </p></div> </li> <li> <div><a id='202-link' href=https://mailman.nanog.org/pipermail/nanog/2018-September/096871.html>Service provider story about tracking down TCP RSTs</a></div> <div><p> A good network debugging story. Why are a couple of content providers / CDNs responding to some customers of an operator with an RST, while other customers of the same operator had no problems? </p> </div> </li> <li> <div><a id='203-link' href=http://www.os2museum.com/wp/the-history-of-a-security-hole/>The History of a Security Hole</a></div> <div><p> Archaeology into an embarrassing looking security issue in OpenBSD (x86-only). How a series of superficially safe looking transformations into a struct definition first created a tiny crack, and then later widened the hole. </p> </div> </li> </ul> jsnell@iki.fi (Juho Snellman) links Mon, 03 Sep 2018 00:03:27 GMT https://www.snellman.net/lastweek/page/33 2018-05-15 https://www.snellman.net/lastweek/page/32 <ul> <li> <div><a id='191-link' href=https://www.cs.vu.nl/~herbertb/download/papers/delta-pointers_eurosys18.pdf>Delta Pointers: Buffer Overflow Checks Without the Checks</a></div> <div><p>A tagged pointer setup for detecting buffer overflows with no branches or extra memory accesses.</p> </div> </li> <li> <div><a id='192-link' href=https://medium.com/@terrycrowley/never-write-your-own-database-736f704c780>Never Write Your Own Database</a></div> <div><p> Actually just the opposite of the title. A lovely story on why sometimes you actually need to write software to build a product, not just snap together some lego blocks. </p> </div> </li> <li> <div><a id='193-link' href=http://useless-factor.blogspot.ch/2011/05/why-not-mmap.html>Why not mmap()?</a></div> <div><p> Mmap is so great! Just do a single system call, and all the IO is hidden behind the scenes. Oh, wait. Turns out that sometimes that transparency isn't what you want at all. (Specifically sometimes you want non-blocking IO. Or as it happens, I found this post while looking for stuff on the MAP_POPULATE | MAP_NONBLOCK combination that Linux used to once support). </p> </div> </li> <li> <div><a id='194-link' href=https://pubby8.wordpress.com/2017/05/08/an-unfinished-draft-of-linearly-probed-robin-hood-hash-tables/>An unfinished draft of linearly-probed Robin Hood hash tables</a></div> <div><p> Robin Hood hash tables with linear probing are just sorted arrays. What a great way to think about it. </p> </div> </li> <li> <div><a id='195-link' href=https://15721.courses.cs.cmu.edu/spring2018/papers/19-hashjoins/schuh-sigmod2016.pdf>An Experimental Comparison of Thirteen Relational Equi-Joins in Main Memory</a></div> <div><p> &gt; <i>This makes it surprisingly hard to answer a very simple question: what is the fastest join algorithm in 2015? In this paper we will try to develop an answer. We start with an end-to-end black box comparison of the most important methods. Afterwards, we inspect the internals of these algorithms in a white box comparison. We derive improved variants of stateof-the-art join algorithms by applying optimizations like softwarewrite combine buffers, various hash table implementations, as well as NUMA-awareness in terms of data placement and scheduling </i> </p> </div> </li> <li> <div><a id='196-link' href=https://en.wikipedia.org/wiki/Zobrist_hashing>Zobrist Hashing</a></div> <div><p> &gt; <i>Zobrist hashing starts by randomly generating bitstrings for each possible element of a board game, i.e. for each combination of a piece and a position (in the game of chess, that's 12 pieces × 64 board positions, or 14 x 64 if a king that may still castle and a pawn that may capture en passant are treated separately). Now any board configuration can be broken up into independent piece/position components, which are mapped to the random bitstrings generated earlier. The final Zobrist hash is computed by combining those bitstrings using bitwise XOR. </i> </p> And obviously the punchline being that given a board state and its hash, recomputing the hash of an output board state is simply xoring the original hash with the bitstrings of the moved piece; once before the move, once after. </div> </li> <li> <div><a id='197-link' href=http://www.genetic-programming.org/hc2009/7-Sipper-Rush/Sipper-Rush-Paper.pdf>GP-Rush: Using Genetic Programming to Evolve Solvers for the Rush Hour Puzzle</a></div> <div><p> Using genetic programming to choose when to use which heuristic for directing a iterative deepening A* search. Though I have to say that the game trees this paper is talking of seem ludicrously small for 2009 (1.5M states). </p> </div> </li> <li> <div><a id='198-link' href=https://baldur.iti.kit.edu/theses/SokobanPortfolio.pdf>Using an Algorithm Portfolio to Solve Sokoban</a></div> <div><p> Running multiple unrelated algorithms for Sokoban solving in parallel, on the assumption that the different algorithms have different blind spots. You get better average and worst cases by giving each of x algorithms 1/x% CPU than run just one with 100%. (Assuming the selection is diverse enough, of course). </p> <p> Also had some ideas about having the different algorithms exchange information, but that seems very complicated and didn't seem to pan out. </p> </div> </li> </ul> jsnell@iki.fi (Juho Snellman) links Tue, 15 May 2018 03:51:09 GMT https://www.snellman.net/lastweek/page/32 2018-04-23 https://www.snellman.net/lastweek/page/31 <ul> <li> <div><a id='187-link' href=https://kimonote.com/@mildbyte/travelling-murderer-problem-planning-a-morrowind-all-faction-speedrun-with-simulated-annealing-part-1-41079/>Travelling murderer problem: planning a Morrowind all-faction speedrun with simulated annealing, part 1</a></div> <div><p> &gt; <i>However, there isn't a Morrowind speedrun category where someone tries to become the head of all factions. For all its critical acclaim and its great story, most of quests in Morrowind are basically fetch-item or kill-this-person and there aren't many quests that require anything else. But planning such a speedrun route could still be extremely interesting for many reasons.</i> </p> <p> Some really neat stuff about treating speedrunning as a search/optimization problem. I was a little bit annoyed by the parts where the story strays from that, and the author instead uses human intuition to e.g. select which set of quests to do or which skills to train. Also, <a href="https://kimonote.com/@mildbyte/travelling-murderer-problem-planning-a-morrowind-all-faction-speedrun-with-simulated-annealing-part-2-43269/">part 2</p2>. </p> </div> </li> <li> <div><a id='188-link' href=https://db.cs.cmu.edu/papers/2018/mod342-wangA.pdf>Building a Bw-Tree Takes More Than Just Buzz Words</a></div> <div><p> Two things you don't see often in CS. Trying to replicate a systems design paper, and publishing a negative result. And also showing just how many crucial details can get left out in a systems description that makes it impossible to actually implement. And when you do implement it and don't get the hoped for performance, what then? Obviously more and more optimizations that the original system probably didn't have. </p> <p>It's kind of interesting to read the <a href="https://news.ycombinator.com/item?id=5521029">original paper's HN comments</a> after this.</p> </div> </li> <li> <div><a id='189-link' href=http://pharr.org/matt/blog/2018/04/22/ispc-volta-first-results.html>The story of ispc (part 5)</a></div> <div><p> &gt; <i>Assuming typical game theory for the jerks, here’s what the thinking would have been: I was a jerk too, and my real goal here was not to actually solve a problem, but was to leverage SIMD either to usurp the people who led parallel programming models in the compiler group or to advance some other nefarious agenda.</i> </p> <p> A personal retrospective on the development of ispc (a compiler for a shader-programming style C dialect for x86-64). What a great story of big-company intrigue and dysfunction. I'm reloading this site daily to check for new installments. </p> <p> <a href='http://pharr.org/matt/blog/2018/04/18/ispc-origins.html'>Part 1</a>, <a href='http://pharr.org/matt/blog/2018/04/19/ispc-volta-is-born.html'>part 2</a> <a href='http://pharr.org/matt/blog/2018/04/20/ispc-volta-going-all-in.html'>part 3</a> <a href='http://pharr.org/matt/blog/2018/04/21/ispc-volta-c-and-spmd.html'>part 4</a> </p> </div> </li> <li> <div><a id='190-link' href=https://www.akamai.com/us/en/multimedia/documents/white-paper/upnproxy-blackhat-proxies-via-nat-injections-white-paper.pdf>UPnProxy: Blackhat Proxies via NAT Injections</a></div> <div><p> Proxying traffic through home Wifi routers that expose UPnP to the internet. (I'd heard of malicious proxying through home routers, but I'd thought they were compromised devices rather than just misconfigured ones). </p> </div> </li> </ul> jsnell@iki.fi (Juho Snellman) links Mon, 23 Apr 2018 20:21:11 GMT https://www.snellman.net/lastweek/page/31 2018-04-16 https://www.snellman.net/lastweek/page/30 <ul> <li> <div><a id='180-link' href=https://blog.trailofbits.com/2018/04/04/vulnerability-modeling-with-binary-ninja/>Vulnerability Modeling with Binary Ninja</a></div> <div><p> The sophistication of modern reverse engineering tools is pretty amazing. </p> </div> </li> <li> <div><a id='181-link' href=https://news.ycombinator.com/item?id=16797637>ChuckMcM on "Weirdstuff Warehouse is closed"</a></div> <div><p> &gt; <i>When a typical Silicon Valley company decides to "sell off their assets" that generally means office chairs, white boards, and the occasional espresso machine. Not test equipment, test fixtures, extra parts, and tools.</i> </p> <p> Using the closure of what was apparently a famous electronics scrap store to reflect on how Silicon Valley changed in the last couple of decades. </p> </div> </li> <li> <div><a id='182-link' href=https://www.usenix.org/system/files/conference/nsdi18/nsdi18-fouladi.pdf>Salsify: Low-Latency Network Video through Tighter Integration between a Video Codec and a Transport Protocol</a></div> <div><p> Expose SACKs directly to the encoder. Always use the latest fully ACKed frame as the keyframe. (Plus other things, but that felt like the interesting insight to me.) </p> </div> </li> <li> <div><a id='183-link' href=https://bluxte.net/musings/2018/04/10/go-good-bad-ugly/>Go: the Good, the Bad and the Ugly</a></div> <div><p> A worthy new entry in the popular "why Go sucks" genre. </p> </div> </li> <li> <div><a id='184-link' href=http://www.chrisfenton.com/dd9-kaypro-edition/>DD9 Kaypro Edition</a></div> <div><p> &gt; <i>I definitely found the answer to my question about why so few graphical Kaypro programs exist. The Kaypro’s graphics are awful – it’s a text-mode machine with graphics bolted on as a box-checking exercise. That being said, the development experience was surprisingly nice and it was a lot of fun to go through the exercise of actually making a functional game for a machine slightly older than me. </i> </p> </div> </li> <li> <div><a id='185-link' href=https://blog.cloudflare.com/neon-is-the-new-black/>NEON is the new black: fast JPEG optimization on ARM servers </a></div> <div><p> On the performance and power efficiency of Xeons vs. Qualcomms server chips on SIMD workloads. My basic assumption on CF's tech blog posts is that they're 90% PR. But this does have hard numbers, and they're pretty surprising ones (specifically the power usage / unit of work numbers. though I wish they had raw power usage as well). </p> </div> </li> <li> <div><a id='186-link' href=https://engineering.riotgames.com/news/taxonomy-tech-debt>A Taxonomy of Tech Debt</a></div> <div><p> &gt; <i>This post will focus on types of tech debt I’ve seen during my time working at Riot, and a model for discussing it that we’re starting to use internally. If you only take away one lesson from this article, I hope you remember the “contagion” metric discussed below.</i> </p> </div> </li> </ul> jsnell@iki.fi (Juho Snellman) links Mon, 16 Apr 2018 16:46:34 GMT https://www.snellman.net/lastweek/page/30 2018-04-09 https://www.snellman.net/lastweek/page/29 <ul> <li> <div><a id='175-link' href=http://www.softwarepreservation.org/projects/LISP/utah/Shebs-Implementing_Primitive_Datatypes-1988.pdf>Implementing Primitive Datatypes for Higher-Level Languages</a></div> <div><p> John Cowan linked to this in a comment on <a href="https://www.snellman.net/blog/archive/2017-09-04-lisp-numbers/">my post on tagged pointers</a>. It's a very comprehensive look at datatype implementations in (mostly) Lisp implementations. </p> <p>(Is this the by the same Stan Shebs who wrote XConq back in the day?) </p></div> </li> <li> <div><a id='176-link' href=https://ratul.org/papers/sigcomm2017-corropt.pdf>Understanding and Mitigating Packet Corruption in Data Center Networks</a></div> <div><p> There's a bunch of different reasons why packets might get corrupted in-flight. This research finds out signals for distinguishing between those cases (+ congestion-induced packet loss) and recommends specific maintenance tasks to fix the problems. </p> </div> </li> <li> <div><a id='177-link' href=https://www.microsoft.com/en-us/research/uploads/prod/2018/03/faster-sigmod18.pdf>Faster: A Concurrent Key-Value Store with In-Place Updates</a></div> <div><p>A design for a key-value store for update-heavy applications.</p> </div> </li> <li> <div><a id='178-link' href=https://tante.cc/2018/04/03/a-critical-reflection-on-gdpr/>A critical reflection on GDPR</a></div> <div><p> A critique of the GDPR as a piece of legislation from somebody who a) appears to be a privacy activist, b) works as a GDPR DPO. </p> </div> </li> <li> <div><a id='179-link' href=https://peteronprogramming.wordpress.com/2018/04/03/interleaving-small-reads-of-multiple-files-why-world-of-tanks-1-0-has-abysmal-loading-times-on-hdds/>Interleaving small reads of multiple files – why World of Tanks 1.0 has abysmal loading times on HDDs</a></div> <div><p> Another story of debugging and mitigating a problem in a closed source program. </p> </div> </li> </ul> jsnell@iki.fi (Juho Snellman) links Mon, 09 Apr 2018 22:34:17 GMT https://www.snellman.net/lastweek/page/29 2018-04-03 https://www.snellman.net/lastweek/page/28 <ul> <li> <div><a id='165-link' href=https://ferd.ca/handling-overload.html>Handling Overload</a></div> <div><p>&gt;<i>This is a long-ish entry posted after multiple discussions were had on the nature of having or not having bounded mailbox in Erlang.</i></p> </div> </li> <li> <div><a id='166-link' href=https://citizenlab.ca/2018/03/bad-traffic-sandvines-packetlogic-devices-deploy-government-spyware-turkey-syria/>Apparent use of Sandvine devices for malicious or dubious ends in two countries </a></div> <div><p> Multi-use software can be used in bad ways. If you sell such software to authoritarian governments (or government-controlled companies), it'd be good to have controls on exactly what they can do. Obviously that doesn't work if the system is arbitrarily scriptable, but few systems are. </p> <p> But what really offends me about this article is just what garbage the Procera traffic rewriting implementation clearly was. </p> </div> </li> <li> <div><a id='167-link' href=https://arxiv.org/abs/1803.03453>Surprising Creativity: Anecdotes from Evolutionary Computation</a></div> <div><p>Just what it says in the title. Stories about genetic algorithms etc. generating unexpected results.</p></div> </li> <li> <div><a id='168-link' href=https://medium.com/@NetflixTechBlog/performance-under-load-3e6fa9a60581>Performance Under Load</a></div> <div><p>Reading through this, I kept thinking that I'd pretty recently read about someone else using TCP congestion control for RPC queue management. And indeed I had, it was <a href=http://www.evanjones.ca/prevent-server-overload.html>this post by Evan Jones</a>. First time this linkblog actually did what I intended it for! ;-)</p> </div> </li> <li> <div><a id='169-link' href=https://www.elie.net/blog/security/taking-down-gooligan-part-1-overview>Taking down Gooligan</a></div> <div><p> The inner workings of an Android OAuth-token stealing botnet. <a href=https://www.elie.net/blog/security/taking-down-gooligan-part-2-inner-working>[part 2]</a> <a href=https://www.elie.net/blog/security/taking-down-gooligan-a-retrospective-analysis-part-3-monetization-and-clean-up>[part 3]</a> </p> </div> </li> <li> <div><a id='170-link' href=https://markusmeister.com/2018/03/20/death-of-the-sampling-theorem/amp/>Death of the sampling theorem?</a></div> <div><p> Not actually the death of the sampling theorem. But an absolutely brutal takedown of some dodgy signal processing research. The punchline: </p> <p> &gt; <i>As so often, one does have to ask: How did these dramatic claims get through peer review? Given the obvious conflict with the Sampling Theorem, weren’t some eyebrows raised in the process? Who reviewed these submissions anyway? <b>Well, I did.</b> For a different journal, where the manuscript ultimately got rejected. </i> </p></div> </li> <li> <div><a id='171-link' href=https://github.com/tomnomnom/gron/>Gron: A command line tool that makes JSON greppable</a></div> <div><p> A tool to transform JSON to a line-based format, where each line is prefixed with a path. And a tool to transform from that format back to JSON. Such a clever idea. </p></div> </li> <li> <div><a id='172-link' href=http://ijdykeman.github.io/ml/2017/10/12/wang-tile-procedural-generation.html>Procedural Worlds from Simple Tiles</a></div> <div><p> Procedural map generation using (cleverly designed) Wang tiles. </p></div> </li> <li> <div><a id='173-link' href=https://blog.powerdns.com/2018/03/22/the-dns-camel-or-the-rise-in-dns-complexit/>"The DNS Camel", or, the rise in DNS complexity</a></div> <div><p>The DNS protocol design is becoming increasingly detached from the practice, leading to increasingly complex and bug-prone features.</p> </div> </li> <li> <div><a id='174-link' href=https://medium.com/@nex3/pubgrub-2fb6470504f>PubGrub: Next-Generation Version Solving</a></div> <div><p> The new version resolution algorithm for Dart's package manager, with special emphasis on error messages. The contrast between this and the recent work for Go package version is pretty interesting. </p></div> </li> </ul> jsnell@iki.fi (Juho Snellman) links Tue, 03 Apr 2018 05:39:50 GMT https://www.snellman.net/lastweek/page/28