{"id":1121,"date":"2013-07-01T21:58:57","date_gmt":"2013-07-01T20:58:57","guid":{"rendered":"https:\/\/www.entropywins.wtf\/blog\/?p=1121"},"modified":"2018-07-31T13:05:04","modified_gmt":"2018-07-31T12:05:04","slug":"resolving-a-merge-conflict-on-gerrit","status":"publish","type":"post","link":"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/","title":{"rendered":"Resolving a merge conflict on gerrit"},"content":{"rendered":"<div id=\"pN7RmhDXItdrT10z52+dK7YPKS3O1B0IIL9sfNM3k3w=_13f9c2058c8:1cc47d:9100fcad_entryContent\">\n<p>In this post I describe the solution I use to a common situation for people using <a href=\"https:\/\/en.wikipedia.org\/wiki\/Gerrit_%28software%29\" target=\"_blank\" rel=\"noopener\">gerrit<\/a>. In other words, pretty much everyone who does <a href=\"https:\/\/www.mediawiki.org\/\" target=\"_blank\" rel=\"noopener\">MediaWiki<\/a> development. I got this question on IRC and decided to write the answer down here, as I expect to get it more in the future, as well as me being unable to find it already on MediaWiki.org.<\/p>\n<p><strong>Context<\/strong>: A commit was made to a git repo and pushed to gerrit for code review. You want to merge it into master.<\/p>\n<p><strong>Problem<\/strong>: Some other commit got merged in after you branched of master, and this commit touches some of the same code. There is thus a conflict that cannot be automatically resolved, preventing you from merging it via gerrit. You know you have this problem when hitting the gerrit \u201crebase\u201d button results in an error message like \u201cThe change could not be rebased due to a path conflict during merge.\u201d<\/p>\n<p><strong>Desired solution<\/strong>: Resolving the conflict and updating the commit on gerrit so it can be merged.<\/p>\n<p><strong>Steps to take<\/strong>:<\/p>\n<ul>\n<li>Make sure you have the latest code from master locally. For instance by doing \u201cgit checkout master; git pull origin master\u201d<\/li>\n<li>Get the commit you want to resolve a conflict for. Typically this is done via <a href=\"https:\/\/www.mediawiki.org\/wiki\/Gerrit\/git-review\" target=\"_blank\" rel=\"noopener\">git review<\/a>. \u201cgit review -d 12345\u2033, where 12345 is the commit number you can see in the commit URL on gerrit.<\/li>\n<li>Start a rebase against master. \u201cgit rebase master\u201d<\/li>\n<li>If you get lucky, git might actually be able to solve the conflict automatically after all. In which case you can skip this step and the next. More typically you\u2019ll get at least one conflict that cannot be resolved and requires your attention to get fixed. You\u2019ll get a list of these conflicts after running the rebase command and can also view them in a more concise form by doing \u201cgit status\u201d.<\/li>\n<li>Fix each of the conflicts using your editor\/IDE.<\/li>\n<li>Add the files in which conflicts occurred using \u201cgit add\u201d. If you are done with this, doing a \u201cgit status\u201d should result in there no longer being a \u201cUnmerged paths\u201d section.<\/li>\n<li>Finish your rebase using \u201cgit rebase \u2013continue\u201d. It is possible git runs into more conflicts, which will require you to repeat the last 3 points and this one until you got rid of them all.<\/li>\n<li>Submit the rebased commit to gerrit. \u201cgit review\u201d<\/li>\n<\/ul>\n<p>In short, this is the typical workflow:<\/p>\n<ul>\n<li>git pull origin master<\/li>\n<li>git review -d 12345<\/li>\n<li>git rebase master<\/li>\n<li><em>\u201cfix conflicts\u201d<\/em><\/li>\n<li>git add *<\/li>\n<li>git rebase \u2013continue<\/li>\n<li>git review<\/li>\n<\/ul>\n<p>Edit: There actually is a <a href=\"https:\/\/www.mediawiki.org\/wiki\/Gerrit\/resolve_conflict\" target=\"_blank\" rel=\"noopener\">page on the same topic<\/a> on MediaWiki.org.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this post I describe the solution I use to a common situation for people using gerrit. In other words,&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[7],"tags":[402,403],"class_list":["post-1121","post","type-post","status-publish","format-standard","hentry","category-programming","tag-gerrit","tag-git"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Resolving a merge conflict on gerrit - Blog of Jeroen De Dauw<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Resolving a merge conflict on gerrit - Blog of Jeroen De Dauw\" \/>\n<meta property=\"og:description\" content=\"In this post I describe the solution I use to a common situation for people using gerrit. In other words,&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog of Jeroen De Dauw\" \/>\n<meta property=\"article:published_time\" content=\"2013-07-01T20:58:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-07-31T12:05:04+00:00\" \/>\n<meta name=\"author\" content=\"Jeroen\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/JeroenDeDauw\" \/>\n<meta name=\"twitter:site\" content=\"@JeroenDeDauw\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeroen\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/07\\\/01\\\/resolving-a-merge-conflict-on-gerrit\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/07\\\/01\\\/resolving-a-merge-conflict-on-gerrit\\\/\"},\"author\":{\"name\":\"Jeroen\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"headline\":\"Resolving a merge conflict on gerrit\",\"datePublished\":\"2013-07-01T20:58:57+00:00\",\"dateModified\":\"2018-07-31T12:05:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/07\\\/01\\\/resolving-a-merge-conflict-on-gerrit\\\/\"},\"wordCount\":439,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"keywords\":[\"Gerrit\",\"Git\"],\"articleSection\":[\"Programming\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/07\\\/01\\\/resolving-a-merge-conflict-on-gerrit\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/07\\\/01\\\/resolving-a-merge-conflict-on-gerrit\\\/\",\"url\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/07\\\/01\\\/resolving-a-merge-conflict-on-gerrit\\\/\",\"name\":\"Resolving a merge conflict on gerrit - Blog of Jeroen De Dauw\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#website\"},\"datePublished\":\"2013-07-01T20:58:57+00:00\",\"dateModified\":\"2018-07-31T12:05:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/07\\\/01\\\/resolving-a-merge-conflict-on-gerrit\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/07\\\/01\\\/resolving-a-merge-conflict-on-gerrit\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/07\\\/01\\\/resolving-a-merge-conflict-on-gerrit\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Resolving a merge conflict on gerrit\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/\",\"name\":\"Entropy Wins\",\"description\":\"A blog on Software Architecture, Design and Craftsmanship\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\",\"name\":\"Jeroen\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g\",\"caption\":\"Jeroen\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/jeroendedauw\\\/\",\"https:\\\/\\\/x.com\\\/https:\\\/\\\/twitter.com\\\/JeroenDeDauw\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Resolving a merge conflict on gerrit - Blog of Jeroen De Dauw","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/","og_locale":"en_US","og_type":"article","og_title":"Resolving a merge conflict on gerrit - Blog of Jeroen De Dauw","og_description":"In this post I describe the solution I use to a common situation for people using gerrit. In other words,&hellip;","og_url":"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/","og_site_name":"Blog of Jeroen De Dauw","article_published_time":"2013-07-01T20:58:57+00:00","article_modified_time":"2018-07-31T12:05:04+00:00","author":"Jeroen","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/JeroenDeDauw","twitter_site":"@JeroenDeDauw","twitter_misc":{"Written by":"Jeroen","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/#article","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/"},"author":{"name":"Jeroen","@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"headline":"Resolving a merge conflict on gerrit","datePublished":"2013-07-01T20:58:57+00:00","dateModified":"2018-07-31T12:05:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/"},"wordCount":439,"commentCount":4,"publisher":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"keywords":["Gerrit","Git"],"articleSection":["Programming"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/","url":"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/","name":"Resolving a merge conflict on gerrit - Blog of Jeroen De Dauw","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#website"},"datePublished":"2013-07-01T20:58:57+00:00","dateModified":"2018-07-31T12:05:04+00:00","breadcrumb":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/01\/resolving-a-merge-conflict-on-gerrit\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.entropywins.wtf\/blog\/"},{"@type":"ListItem","position":2,"name":"Resolving a merge conflict on gerrit"}]},{"@type":"WebSite","@id":"https:\/\/www.entropywins.wtf\/blog\/#website","url":"https:\/\/www.entropywins.wtf\/blog\/","name":"Entropy Wins","description":"A blog on Software Architecture, Design and Craftsmanship","publisher":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.entropywins.wtf\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7","name":"Jeroen","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g","caption":"Jeroen"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g"},"sameAs":["https:\/\/www.linkedin.com\/in\/jeroendedauw\/","https:\/\/x.com\/https:\/\/twitter.com\/JeroenDeDauw"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p74TBF-i5","jetpack-related-posts":[{"id":1172,"url":"https:\/\/www.entropywins.wtf\/blog\/2014\/01\/02\/mediawiki-extensions-to-define-their-mediawiki-compatibility\/","url_meta":{"origin":1121,"position":0},"title":"MediaWiki extensions to define their MediaWiki compatibility","author":"Jeroen","date":"2014-01-02","format":false,"excerpt":"Over the past year support for real dependency management has been gradually added to MediaWiki and selected extensions. This support being based on the Composer software. While extensions have been able to specify their dependencies for a while, such as PHP libraries and other extensions, they where not able to\u2026","rel":"","context":"In \"composer\"","block_context":{"text":"composer","link":"https:\/\/www.entropywins.wtf\/blog\/tag\/composer\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1165,"url":"https:\/\/www.entropywins.wtf\/blog\/2013\/12\/23\/wikibase-datamodel-released\/","url_meta":{"origin":1121,"position":1},"title":"Wikibase DataModel released!","author":"Jeroen","date":"2013-12-23","format":false,"excerpt":"I\u2019m happy to announce the 0.6 release of Wikibase DataModel. This is the first real release of this component. DataModel? Wikibase is the software behind Wikidata.org. At its core, this software is about describing entities. Entities are collections of claims, which can have qualifiers, references and values of various different\u2026","rel":"","context":"In \"Component\"","block_context":{"text":"Component","link":"https:\/\/www.entropywins.wtf\/blog\/tag\/component\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2278,"url":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/14\/bounded-contexts-in-the-wikimedia-fundraising-software\/","url_meta":{"origin":1121,"position":2},"title":"Bounded Contexts in the Wikimedia Fundraising Software","author":"Jeroen","date":"2018-08-14","format":false,"excerpt":"In this follow-up to rewriting the Wikimedia Deutschland fundraising I tell the story of how we reorganized our codebases along the lines of the DDD strategic pattern Bounded Contexts. In 2016 the FUN team at Wikimedia Deutschland rewrote the Wikimedia Deutschland fundraising application. This new codebase uses The Clean Architecture\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"Diagram depicting Clean Architecture + Bounded Contexts","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/Such-Clean-Diagram.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/Such-Clean-Diagram.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/Such-Clean-Diagram.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/Such-Clean-Diagram.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/Such-Clean-Diagram.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":1117,"url":"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/","url_meta":{"origin":1121,"position":3},"title":"GitHub extension for MediaWiki and SimpleCache PHP library","author":"Jeroen","date":"2013-06-29","format":false,"excerpt":"Background A few months back I got annoyed at having to maintain some documentation both in README files and on-wiki. I figured I\u2019d be a lot nicer if I could just embed those README files in the wiki and have their contents rendered. I therefore created the GitWeb MediaWiki extension,\u2026","rel":"","context":"With 1 comment","block_context":{"text":"With 1 comment","link":"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/#comments"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1469,"url":"https:\/\/www.entropywins.wtf\/blog\/2015\/10\/15\/hello-clojure\/","url_meta":{"origin":1121,"position":4},"title":"(Hello Clojure)","author":"Jeroen","date":"2015-10-15","format":false,"excerpt":"A few weeks ago I started learning Clojure. My experience so far has been fantastic. Why Clojure At SoCraTes 2015, I attended a great workshop on Haskell. While this is interesting if you are interested in learning functional programming, I found Haskell to be quite a pain. Not the language\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"lisp-aliens","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2015\/10\/lisp-aliens.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":382,"url":"https:\/\/www.entropywins.wtf\/blog\/2009\/09\/04\/event-based-asynchronous-pattern\/","url_meta":{"origin":1121,"position":5},"title":"Event-based Asynchronous Pattern","author":"Jeroen","date":"2009-09-04","format":false,"excerpt":"While working on .Net download library, I realized I still didn't know how to fire events from the background threads onto the main thread (meaning the thread that started the download by calling Start). I posted query on how to do this in vb.net on several forums, and got some\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/1121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/comments?post=1121"}],"version-history":[{"count":4,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/1121\/revisions"}],"predecessor-version":[{"id":2268,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/1121\/revisions\/2268"}],"wp:attachment":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/media?parent=1121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/categories?post=1121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/tags?post=1121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}