{"id":1117,"date":"2013-06-29T21:57:55","date_gmt":"2013-06-29T20:57:55","guid":{"rendered":"https:\/\/www.entropywins.wtf\/blog\/?p=1117"},"modified":"2014-03-17T23:34:21","modified_gmt":"2014-03-17T22:34:21","slug":"github-extension-for-mediawiki-and-simplecache-php-library","status":"publish","type":"post","link":"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/","title":{"rendered":"GitHub extension for MediaWiki and SimpleCache PHP library"},"content":{"rendered":"<p><strong>Background<\/strong><\/p>\n<div id=\"pN7RmhDXItdrT10z52+dK7YPKS3O1B0IIL9sfNM3k3w=_13f91f59c00:1cc47b:9100fcad_entryContent\" itemprop=\"description\">\n<p>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 <a href=\"https:\/\/www.mediawiki.org\/wiki\/Extension:Gitweb\" target=\"_blank\">GitWeb<\/a> MediaWiki extension, that would get the contents of files in a git repo via the WMF GitWeb interface.<\/p>\n<p>This worked nicely until recently the WMF decided to use <a href=\"https:\/\/git.wikimedia.org\/\" target=\"_blank\">GitBlit<\/a> (which appears to be less fail then GitWeb) without continuing their GitWeb support. This meant that all the wiki pages that where embedding content pulled from it suddenly broke. After <a href=\"https:\/\/twitter.com\/kghbln\" target=\"_blank\">kgh<\/a>, the SMW wiki overlord, pointed this out to me, I was lazy and preoccupied with other things, so did not do anything on this for a month or so.<\/p>\n<p>I\u2019m currently on a week long holiday in Belgium and yesterday (Friday) evening was hanging out at the local hackerspace <a href=\"http:\/\/0x20.be\" target=\"_blank\">0\u00d720 (whitespace)<\/a>. I figured I really ought to fix the file content embedding issue and thought this would be a quick bit of hacking to make the old GitWeb extension work with GitBlit that would take roughly an hour.<\/p>\n<p>It occurred to me that the new code could also fetch the file contents from <a href=\"https:\/\/github.com\/\" target=\"_blank\">GitHub<\/a>, and that this have some advantages. For one it provides increased stability. Clearly the WMF does not care about the stability of the paths provided by their git browser, so a future upgrade of GitBlit or switch to yet another tool might result in re-occurrence of the problem. Something similar happening for GitHub seems much less likely. Another point for GitHub is that more people use it, thus increasing the number of people this tool is useful for.<\/p>\n<p>I started work on this new GitHub extension by copying the GitWeb files and replacing GitWeb by GitHub. Inevitably I ended up wanting to do something more exciting then that. And lucky me, I saw some room for design improvements to the code.<\/p>\n<p><strong>The technical part<\/strong><\/p>\n<p>Though it certainly is not the most elegant code ever, the old Gitweb extension certainly wins the \u201cnot a lot of code there\u201d badge. Do <a href=\"https:\/\/github.com\/wikimedia\/mediawiki-extensions-Gitweb\/blob\/master\/Gitweb.php#L47\" target=\"_blank\">admire the 30ish lines of code<\/a> that make up the meat of the extension. Not very testable, flexible, extensible or reusable. Though a perfectly valid approach for such a small task. Nevertheless, boring!<\/p>\n<p>The steps I took in refactoring this code to the current state where roughly as follows. Some of my thoughts along the way are between these things: \u201c\u201d.<\/p>\n<ul>\n<li>Move code from anonymous function to a new GitHubParserHook class.<\/li>\n<li>\u201cBah, this caching logic does not belong here\u201d. Injected a Cache implementing object in the constructor.<\/li>\n<li>Created Cache interface.<\/li>\n<li>Created MediaWikiCache implementation that is an adapter around MediaWiki\u2019s BagOStuff.<\/li>\n<li>\u201cActually, this file fetching logic is also its own responsibility\u201d. Also inject a FileFetcher via the constructor.<\/li>\n<li>Created Filefetcher interface.<\/li>\n<li>\u201cThis parser hook class should not know about use of caching at all\u201d. Dropped Cache parameter from the constructor.<\/li>\n<li>Created CachingFileFetcher which takes a FileFetcher and a Cache in its constructor.<\/li>\n<li>\u201cHaving a simple in memory cache as well would be nice. And being able to combine this with a more complex cache such as the MediaWikiCache in a smart way would be awesome. Actually, I ran into this before, and will so again. Better do something neat and reusable in its own component\u201d.<\/li>\n<li>Created SimpleCache repo and move Cache interface and MediaWikiCache implementation there.<\/li>\n<li>Created SimpleInMemoryCache and CombinatoryCache implementations.<\/li>\n<\/ul>\n<p>After that I still needed to to a bunch of work on the setup code, putting in place composer.json and README files, etc. That is not as interesting though, so skipped here.<\/p>\n<p><strong>Wrapping up<\/strong><\/p>\n<p>So now I ended up with this new <a href=\"https:\/\/github.com\/JeroenDeDauw\/GitHub\" target=\"_blank\">GitHub extension<\/a> and a small reusable <a href=\"https:\/\/github.com\/JeroenDeDauw\/SimpleCache\" target=\"_blank\">SimpleCache library<\/a>. Both are at version 0.1, are available on GitHub, have their <a href=\"http:\/\/phpunit.de\/manual\/current\/en\/index.html\" target=\"_blank\">PHPUnit<\/a> tests run on <a href=\"https:\/\/travis-ci.org\/\" target=\"_blank\">TravisCI<\/a> and are on <a href=\"https:\/\/packagist.org\/\" target=\"_blank\">Packagist<\/a>, so can be installed via <a href=\"http:\/\/getcomposer.org\/\" target=\"_blank\">Composer<\/a>.<\/p>\n<p>Though I do not anticipate poking at the GitHub extension much in the future (if at all), the SimpleCache library seems to have good potential for reuse in other projects I\u2019m working on. It\u2019s thus quite possible I\u2019ll be adding in more things there. And of course, you are welcome to do so as well.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Background A few months back I got annoyed at having to maintain some documentation both in README files and on-wiki.&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":[1],"tags":[],"class_list":["post-1117","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>GitHub extension for MediaWiki and SimpleCache PHP library - 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\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GitHub extension for MediaWiki and SimpleCache PHP library - Blog of Jeroen De Dauw\" \/>\n<meta property=\"og:description\" content=\"Background A few months back I got annoyed at having to maintain some documentation both in README files and on-wiki.&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog of Jeroen De Dauw\" \/>\n<meta property=\"article:published_time\" content=\"2013-06-29T20:57:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2014-03-17T22:34:21+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=\"4 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\\\/06\\\/29\\\/github-extension-for-mediawiki-and-simplecache-php-library\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/06\\\/29\\\/github-extension-for-mediawiki-and-simplecache-php-library\\\/\"},\"author\":{\"name\":\"Jeroen\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"headline\":\"GitHub extension for MediaWiki and SimpleCache PHP library\",\"datePublished\":\"2013-06-29T20:57:55+00:00\",\"dateModified\":\"2014-03-17T22:34:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/06\\\/29\\\/github-extension-for-mediawiki-and-simplecache-php-library\\\/\"},\"wordCount\":724,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/06\\\/29\\\/github-extension-for-mediawiki-and-simplecache-php-library\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/06\\\/29\\\/github-extension-for-mediawiki-and-simplecache-php-library\\\/\",\"url\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/06\\\/29\\\/github-extension-for-mediawiki-and-simplecache-php-library\\\/\",\"name\":\"GitHub extension for MediaWiki and SimpleCache PHP library - Blog of Jeroen De Dauw\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#website\"},\"datePublished\":\"2013-06-29T20:57:55+00:00\",\"dateModified\":\"2014-03-17T22:34:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/06\\\/29\\\/github-extension-for-mediawiki-and-simplecache-php-library\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/06\\\/29\\\/github-extension-for-mediawiki-and-simplecache-php-library\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2013\\\/06\\\/29\\\/github-extension-for-mediawiki-and-simplecache-php-library\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GitHub extension for MediaWiki and SimpleCache PHP library\"}]},{\"@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":"GitHub extension for MediaWiki and SimpleCache PHP library - 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\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/","og_locale":"en_US","og_type":"article","og_title":"GitHub extension for MediaWiki and SimpleCache PHP library - Blog of Jeroen De Dauw","og_description":"Background A few months back I got annoyed at having to maintain some documentation both in README files and on-wiki.&hellip;","og_url":"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/","og_site_name":"Blog of Jeroen De Dauw","article_published_time":"2013-06-29T20:57:55+00:00","article_modified_time":"2014-03-17T22:34:21+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":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/#article","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/"},"author":{"name":"Jeroen","@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"headline":"GitHub extension for MediaWiki and SimpleCache PHP library","datePublished":"2013-06-29T20:57:55+00:00","dateModified":"2014-03-17T22:34:21+00:00","mainEntityOfPage":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/"},"wordCount":724,"commentCount":1,"publisher":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/","url":"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/","name":"GitHub extension for MediaWiki and SimpleCache PHP library - Blog of Jeroen De Dauw","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#website"},"datePublished":"2013-06-29T20:57:55+00:00","dateModified":"2014-03-17T22:34:21+00:00","breadcrumb":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.entropywins.wtf\/blog\/"},{"@type":"ListItem","position":2,"name":"GitHub extension for MediaWiki and SimpleCache PHP library"}]},{"@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-i1","jetpack-related-posts":[{"id":1052,"url":"https:\/\/www.entropywins.wtf\/blog\/2011\/01\/01\/new-mediawiki-extension-subpagelist\/","url_meta":{"origin":1117,"position":0},"title":"New MediaWiki extension: SubPageList","author":"Jeroen","date":"2011-01-01","format":false,"excerpt":"During 27c3 someone asked me to install an extension to list subpages onto the hackerspace.be wiki. I picked SubPageList3, as it seemed to most decent one. I did a simple test to see if it was working, and immediately found a namespace bug. So I decided to quickly rewrite it\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"SubPageList extension","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2011\/01\/Splist_1.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":870,"url":"https:\/\/www.entropywins.wtf\/blog\/2010\/07\/08\/maps-and-semantic-maps-0-6-4-released\/","url_meta":{"origin":1117,"position":1},"title":"Maps and Semantic Maps 0.6.4 released","author":"Jeroen","date":"2010-07-08","format":false,"excerpt":"Maps and Semantic Maps 0.6.4 are now available for download. This release contains several new features, amongst which basic KML support for Google Maps, a new OSM service implementation and re-added service links support to the Geographical Coordinates data-type in Semantic Maps. Everyone running 0.6.2 or older is advised to\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"Semantic Maps 0.6.4 dependencies","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/07\/Semantic-Maps-0.6.4-dependencies.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/07\/Semantic-Maps-0.6.4-dependencies.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/07\/Semantic-Maps-0.6.4-dependencies.jpg?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":2101,"url":"https:\/\/www.entropywins.wtf\/blog\/2018\/01\/20\/php-project-template\/","url_meta":{"origin":1117,"position":2},"title":"PHP project template","author":"Jeroen","date":"2018-01-20","format":false,"excerpt":"Want to start a new PHP project? Perhaps yet another library you are creating? Tired of doing the same lame groundwork for the 5th time this month? Want to start a code kata and not lose time on generic setup work? I got just the project for you! Edit: there\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/01\/php.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/01\/php.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/01\/php.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/01\/php.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/01\/php.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":1032,"url":"https:\/\/www.entropywins.wtf\/blog\/2010\/12\/15\/new-mediawiki-extension-push\/","url_meta":{"origin":1117,"position":3},"title":"New MediaWiki extension: Push","author":"Jeroen","date":"2010-12-15","format":false,"excerpt":"I'm happy to announce the release of a new MediaWiki extension I've been working on over the past two weeks. As you've might already have guessed from it's name, Push, it enables you to push content of wiki pages to one or more other MediaWiki installs. The main features are:\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"The tab interface of the Push extension","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/12\/push-tab-interface.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/12\/push-tab-interface.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/12\/push-tab-interface.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/12\/push-tab-interface.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":983,"url":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/27\/hackerspace-wikis\/","url_meta":{"origin":1117,"position":4},"title":"Hackerspace wikis","author":"Jeroen","date":"2010-08-27","format":false,"excerpt":"Today I finished work on an initial version of a script I created to be able to update the Belgian Hackerspace wiki's from my development environment. It took me quite a while to create this, as it's my first bash script, and I had to figure out all the basic\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"Bash the wiki script","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/hackerspaceScript-1024x488.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/hackerspaceScript-1024x488.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/hackerspaceScript-1024x488.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/hackerspaceScript-1024x488.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1069,"url":"https:\/\/www.entropywins.wtf\/blog\/2011\/02\/13\/new-extension-include-wp\/","url_meta":{"origin":1117,"position":5},"title":"New extension: Include WP","author":"Jeroen","date":"2011-02-13","format":false,"excerpt":"Somewhere in the last two weeks I quickly wrote up a small new MediaWiki extension to include content from Wikipedia or some other MediaWiki install into pages on your wiki. It's titled Include WP. The extension does not import anything (so nothing is stored), but rather fetches content from the\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"An included article, initially only showing a limited amount of paragraphs","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2011\/02\/incwp-london-1024x496.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2011\/02\/incwp-london-1024x496.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2011\/02\/incwp-london-1024x496.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2011\/02\/incwp-london-1024x496.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/1117","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=1117"}],"version-history":[{"count":2,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/1117\/revisions"}],"predecessor-version":[{"id":1284,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/1117\/revisions\/1284"}],"wp:attachment":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/media?parent=1117"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/categories?post=1117"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/tags?post=1117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}