{"id":962,"date":"2010-08-20T19:07:00","date_gmt":"2010-08-20T18:07:00","guid":{"rendered":"https:\/\/www.entropywins.wtf\/blog\/?p=962"},"modified":"2010-08-20T19:07:00","modified_gmt":"2010-08-20T18:07:00","slug":"end-of-google-summer-of-code-2010","status":"publish","type":"post","link":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/","title":{"rendered":"End of Google Summer of Code 2010"},"content":{"rendered":"<p>As <a href=\"http:\/\/code.google.com\/soc\/\">Google Summer of Code<\/a> (GSoC) 2010 has ended, I&#8217;m writing this blog post to outline what I&#8217;ve done during the coding period and what the results are. Thanks go to the <a href=\"http:\/\/wikimediafoundation.org\/\">Wikimedia Foundation<\/a> and Google for providing the opportunity to do this project, <a href=\"http:\/\/identi.ca\/brionv\">Brion Vibber<\/a>, who mentored me, and to all other people who helped me out, especially <a href=\"http:\/\/yaronkoren.com\/\">Yaron Koren<\/a> who I bugged the most \ud83d\ude42<\/p>\n<p><a href=\"https:\/\/code.google.com\/soc\/\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-975 alignright\" title=\"Google Summer of Code 2010\" src=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/2010_NoURL_300x267px.jpg\" alt=\"Google Summer of Code 2010\" width=\"300\" height=\"267\" \/><\/a><\/p>\n<p><strong>What I did during GSoC<\/strong><\/p>\n<p>My <a href=\"http:\/\/www.mediawiki.org\/wiki\/User:Jeroen_De_Dauw\/GSoC2010\/Proposal\">initial proposal<\/a> was to create an <strong>awesome<\/strong> extension management platform for <a href=\"http:\/\/www.mediawiki.org\/wiki\/MediaWiki\">MediaWiki<\/a> that would allow for functionality similar to what you have in the WordPress admin panel. After doing some research I realized this would require significant effort in two areas: configuration and deployment. After looking at some already existing tools such as the <a href=\"http:\/\/www.mediawiki.org\/wiki\/Extension:Configure\">Configure<\/a> extension and the Deployment Framework of Ontoprise, I decided to completely drop the configuration part and concentrate on the deployment work.<\/p>\n<p>I started with porting the filesystem abstraction classes from WordPress, which are needed for doing any upgrade or installation operations that include changes to the codebase. (The current MediaWiki installer can do upgrades, but only to the database.) I created a new extension called <a href=\"http:\/\/www.mediawiki.org\/wiki\/Extension:Deployment\">Deployment<\/a>, where I put in this code, and which was intended as a place to experiment with all the MediaWiki-installation side deployment stuff. As You obviously want this functionality to be part of MediaWiki itself, I wrote it with the idea of moving over the code to MediaWiki core once it was finished. It turned out that doing filesystem upgrades securely is not an easy task though, so after finishing the port, I quitted work on this as I decided to do other functionality first.<\/p>\n<p>I then poked somewhat at the new MediaWiki installer, which is a complete rewrite of the current installer with a lot of new cool stuff and a totally more awesome interface. I made some minor imrpovements there, and split the Installer class, which held core installer functionality, into a more generic Installer class and a CoreInstaller. This allows for creating an ExtensionInstaller that uses the same base code, such as database, filesystem and LocalsSttings manipulation.<\/p>\n<p>After this I started thinking about how to best structure a package repository for MediaWiki and extensions to get updates and new extensions from. I had a look at <a href=\"http:\/\/en.wikipedia.org\/wiki\/PEAR\">PEAR<\/a> and <a href=\"http:\/\/en.wikipedia.org\/wiki\/CPAN\">CPAN<\/a>, as well as <a href=\"http:\/\/en.wikipedia.org\/wiki\/WordPress\">WordPress<\/a>, although I don&#8217;t learn a lot about the later. Apparently their repository code is not freely available \ud83d\ude41 After discussion with <a href=\"http:\/\/identi.ca\/brionv\">Brion<\/a> I decided to just create the repository from scratch, and started working on another extension, titled <a href=\"http:\/\/www.mediawiki.org\/wiki\/Extension:Distribution\">Distribution<\/a>, for this purpose. I merged it together with a rewritten version of the MWReleases extension written by Chad, which already had core update detection functionality.<\/p>\n<p>After the Distribution API&#8217;s where working decently I started work on the Special pages in Distribution that would serve as the equivalent of the WordPress admin panel. As I put of the configuration work, and also the file-system manipulation for the initial version, this came down to simply listing currently installed software, update detection and browsing through extensions available in the repository.<\/p>\n<p>On top of my GSoC project itself, I did quite some other MediaWiki work in &#8220;my free time&#8221;. I released 5 new versions of <a href=\"http:\/\/www.mediawiki.org\/wiki\/Extension:Maps\">Maps<\/a> and <a href=\"http:\/\/www.mediawiki.org\/wiki\/Extension:Semantic_Maps\">Semantic Maps<\/a>, starting with 0.6 and ending at 0.6.5. As I finally got core commit access, I also poked at some other things, such as Special:Version, which now will automatically put all extensions of unknown type in the &#8220;other&#8221; category, and will display this category as the last one. Plus misc minor improvements to a verity of extensions. This all amounts into a little over 550 commits to the MediaWiki SVN repository during the GSoC coding period.<\/p>\n<p><strong>State of the code<\/strong><\/p>\n<p>The Distribution extension has the infrastructure for storing and providing extension and core data via the <a href=\"http:\/\/www.mediawiki.org\/wiki\/API\">MediaWiki API<\/a> basically ready for use. It adds 4 database tables to MediaWiki:<\/p>\n<ul>\n<li>distribution_units: This table stores non-version specific info of &#8216;release units&#8217; . Currently these unit&#8217;s are extensions only &#8211; the reason I went for a more general name is to allow for adding other things such as skins and content packages later on. The info here consist of a name, a URL, a description and a pointer to the &#8220;current version&#8221;.<\/li>\n<li>distribution_unit_versions: Entries in this table contain info about a specific version of a &#8216;release unit&#8217;. The info here consists of a version number, release status (beta, rc, stable, deprecated, &#8230;), release data, authors, description and some installation data.<\/li>\n<li>distribution_mwreleases: This table contains MediaWiki releases. It has been merged in from <a href=\"http:\/\/www.mediawiki.org\/wiki\/Extension:MWReleases\">MWReleases<\/a>, so all credit for it goes to <a href=\"http:\/\/identi.ca\/chadh\">Chad<\/a>.<\/li>\n<li>distribution_packages: This table is not in use yet, and needs some more work. The goal is to be able to install a &#8220;package&#8221; onto your wiki which can contain multiple &#8216;distribution units&#8217;. This would basically be the same as Semantic Bundle is doing now, but a lot easier to set up and maintain.<\/li>\n<\/ul>\n<p>The API modules added are:<\/p>\n<ul>\n<li>ApiQueryExtensions: Returns a list of extensions matching certain search criteria, which can include keywords, tags and authors. Only extensions with a version that has a release state acceptable for your installation are returned.<\/li>\n<li>ApiMWReleases: Gets the current MediaWiki releases. Like this distribution_mwreleases database table, this has been merged in from MWReleases and all credits go to Chad.<\/li>\n<li>ApiUpdates: This API module returns update information for the extensions you give it, and does the same for MediaWiki itself if a core version number is provided. The only info that&#8217;s returned is a version number for each unit or core, if there is an update. Otherwise nothing will be returned for that unit or core.<\/li>\n<\/ul>\n<p>To populate the database with existing extension info I wrote a maintenance script &#8220;getSvnMetadata&#8221;, which goes through a local checkout of the MediaWiki extensions directory and get&#8217;s the names from the extensions. I haven&#8217;t found a good way yet to also get other extension data though.<\/p>\n<p>The Deployment extension contains an abstraction layer for repository interaction and several interfaces that use this. The abstraction layer allows for supporting different kinds of repositories. The only implementation it currently has is for interaction with repositories provided by the Distribution extension.  It&#8217;s also a convenient point to implement caching, as you probably don&#8217;t want to send the requests for available updates every time you view a page on the admin panel, and allows for changes to the format the repository uses without any effects in other parts of Deployment. The interfaces that are finished to some extend are:<\/p>\n<ul>\n<li>Special:Extensions: This page lists all installed extensions and allows you to filter on extension type. It&#8217;s based on the WordPress &#8220;plugins&#8221; page and is currently only an improved version of the extension list in Special:Version. It&#8217;s the only special page added by Deployment that can be viewed by non administrators. When logged in however, every extension has a list of links allowing you do various actions. The extension info is handled by a new class ExtensionInfo, which parses the info of individual extensions in $wgExtensionCredits, and provides a more convenient way to work with it. This allows for adding support for a new, better, extension info format later on. A planned feature for this special page is showing update notifications in each extension row.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/www.mediawiki.org\/wiki\/Extension:Deployment\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-971\" title=\"Special:Extensions shwoing a list of all extensions installed and some filter options\" src=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/special-extensions1.png\" alt=\"Special:Extensions shwoing a list of all extensions installed and some filter options\" width=\"778\" height=\"271\" \/><\/a><\/p>\n<ul>\n<li>Special:Install: This page allows you to search through available extensions in the repository. The interface is based on the &#8220;plugin-install&#8221; page of WordPress and allows for searching extensions based on term, tag or author. After performing a search you get a list of matching extensions showing their name, version, authors, description, link to the documentation, and a link to download them. Later on this download link will be replaced by an &#8220;Install&#8221; one.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/www.mediawiki.org\/wiki\/Extension:Deployment\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-972\" title=\"Special:Install displaying controls to browse extensions in the repository\" src=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/special-install1.png\" alt=\"Special:Install displaying controls to browse extensions in the repository\" width=\"817\" height=\"209\" \/><\/a><\/p>\n<ul>\n<li>Special:Update: This page will inform you of any updates to both core and extensions. It&#8217;s behaves basically identical the WordPress &#8220;update&#8221; page.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/www.mediawiki.org\/wiki\/Extension:Deployment\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-973\" title=\"Special:Update displaying available updates, in this case there are none\" src=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/special-update.png\" alt=\"Special:Update displaying available updates, in this case there are none\" width=\"658\" height=\"214\" \/><\/a><\/p>\n<p>The extension allows you to configure several aspects of the repository interaction:<\/p>\n<ul>\n<li>$wgRepositoryApiLocation: This might be an obvious one, but also a very important one, as it  allows you to use a repository other the the Wikimedia Foundation one on  mediawiki.org, which will be the default.<\/li>\n<li>$wgRepositoryLocation: This is similar to the previous setting, but links to a web interface providing browsing capabilities through the repository, or at least some additional info.<\/li>\n<li>$wgRepositoryPackageStates: This is a list of allow release states. By default these will only be &#8220;stable&#8221; and &#8220;beta&#8221;. Early adopters can also add &#8220;dev&#8221; and &#8220;alpha&#8221;, and there also is &#8220;rc&#8221; and &#8220;deprecated&#8221;.<\/li>\n<\/ul>\n<p><strong>What&#8217;s next?<\/strong><\/p>\n<p>Although some very basic functionality is working, quite some work still needs to be done to get this to the WordPress-<strong>awesomeness<\/strong> level. Let&#8217;s first have a look at Distribution and then Deployment:<\/p>\n<p>The most basic issue with Distribution currently is that there is no script yet that allows collecting all current extension data, which is needed for it to be of any use. I&#8217;m not sure how gathering current data can be properly automated, which is the main reason the script doesn&#8217;t exist yet. Any suggestions here are very welcome! After the initial version it should be possible for extension authors to edit their extensions data, and create new releases. For this we&#8217;ll need some new special pages. The data itself can then be used to populate the extension pages on mediawiki.org, and some new magic words such as &#8220;current MediaWiki version&#8221;, can automate a bunch of stuff. After these things new features can be added, such as the management of packages, and more detailed extension information, including things such as dependencies and compatibility info.<\/p>\n<p>Deployment mainly needs interface work, and will need additions to support any new information provided by the Distirbution repository. A cool feature that could be added is supplying the repository with installation information (obviously optionally), which would allow the developers to get an idea of which versions of MediaWiki core and extensions people are using. After the whole MediaWiki deployment model has been revised and is up and running, it&#8217;s configuration can similarly be reinvented. The interfaces added by Deployment can then be adapted to allow contain extension configuration.<\/p>\n<p><a href=\"https:\/\/secure.wikimedia.org\/wikipedia\/mediawiki\/wiki\/Deployment\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-981\" title=\"Design for the initial MedaWiki deployment system\" src=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/MedaWiki-deployment-initial1.png\" alt=\"Design for the initial MedaWiki deployment system\" width=\"862\" height=\"522\" \/><\/a><\/p>\n<p><strong>GSoC 2011?<\/strong><\/p>\n<p>This was my last GSoC as a student, as I no longer qualify, since I quitted my official studies. If I&#8217;m still doing MediaWiki development next year, which I guess is pretty likely, there is a lot of change I&#8217;ll be signing up as a mentor though \ud83d\ude42 If you are interested in being a student in 2011, you can already put your name on the <a href=\"http:\/\/www.mediawiki.org\/wiki\/Summer_of_Code_2011\">2011 GSoC page<\/a> \ud83d\ude42<\/p>\n<p><strong>Some useful links<\/strong><\/p>\n<ul>\n<li>My <a href=\"https:\/\/www.entropywins.wtf\/blog\/tag\/gsoc-2010\/\">blog posts<\/a> about this project<\/li>\n<li>The <a href=\"http:\/\/www.mediawiki.org\/wiki\/Summer_of_Code_2010\">Wikimedia 2010 GSoC page<\/a> with all GSoC projects<\/li>\n<li><a href=\"http:\/\/www.mediawiki.org\/wiki\/Extension:Distribution\">Distribution<\/a> and <a href=\"http:\/\/www.mediawiki.org\/wiki\/Extension:Deployment\">Deployment<\/a> extensions<\/li>\n<li>My <a href=\"https:\/\/secure.wikimedia.org\/wikipedia\/mediawiki\/wiki\/User:Jeroen_De_Dauw\">MediaWiki.org user page<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>As Google Summer of Code (GSoC) 2010 has ended, I&#8217;m writing this blog post to outline what I&#8217;ve done during&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":[74,78,92,110,115,116,156,181,195,197,215,285],"class_list":["post-962","post","type-post","status-publish","format-standard","hentry","category-programming","tag-deployment","tag-distribution","tag-extension-management","tag-google","tag-gsoc","tag-gsoc-2010","tag-mediawiki","tag-open-source","tag-php","tag-planet-wikimedia","tag-refactoring","tag-wikimedia"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>End of Google Summer of Code 2010 - 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\/2010\/08\/20\/end-of-google-summer-of-code-2010\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"End of Google Summer of Code 2010 - Blog of Jeroen De Dauw\" \/>\n<meta property=\"og:description\" content=\"As Google Summer of Code (GSoC) 2010 has ended, I&#8217;m writing this blog post to outline what I&#8217;ve done during&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog of Jeroen De Dauw\" \/>\n<meta property=\"article:published_time\" content=\"2010-08-20T18:07:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/2010_NoURL_300x267px.jpg\" \/>\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=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2010\\\/08\\\/20\\\/end-of-google-summer-of-code-2010\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2010\\\/08\\\/20\\\/end-of-google-summer-of-code-2010\\\/\"},\"author\":{\"name\":\"Jeroen\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"headline\":\"End of Google Summer of Code 2010\",\"datePublished\":\"2010-08-20T18:07:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2010\\\/08\\\/20\\\/end-of-google-summer-of-code-2010\\\/\"},\"wordCount\":1799,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"image\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2010\\\/08\\\/20\\\/end-of-google-summer-of-code-2010\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/08\\\/2010_NoURL_300x267px.jpg\",\"keywords\":[\"Deployment\",\"Distribution\",\"Extension management\",\"Google\",\"GSoC\",\"GSoC 2010\",\"MediaWiki\",\"Open Source\",\"PHP\",\"Planet Wikimedia\",\"Refactoring\",\"Wikimedia\"],\"articleSection\":[\"Programming\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2010\\\/08\\\/20\\\/end-of-google-summer-of-code-2010\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2010\\\/08\\\/20\\\/end-of-google-summer-of-code-2010\\\/\",\"url\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2010\\\/08\\\/20\\\/end-of-google-summer-of-code-2010\\\/\",\"name\":\"End of Google Summer of Code 2010 - Blog of Jeroen De Dauw\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2010\\\/08\\\/20\\\/end-of-google-summer-of-code-2010\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2010\\\/08\\\/20\\\/end-of-google-summer-of-code-2010\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/08\\\/2010_NoURL_300x267px.jpg\",\"datePublished\":\"2010-08-20T18:07:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2010\\\/08\\\/20\\\/end-of-google-summer-of-code-2010\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2010\\\/08\\\/20\\\/end-of-google-summer-of-code-2010\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2010\\\/08\\\/20\\\/end-of-google-summer-of-code-2010\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/08\\\/2010_NoURL_300x267px.jpg\",\"contentUrl\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/08\\\/2010_NoURL_300x267px.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2010\\\/08\\\/20\\\/end-of-google-summer-of-code-2010\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"End of Google Summer of Code 2010\"}]},{\"@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":"End of Google Summer of Code 2010 - 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\/2010\/08\/20\/end-of-google-summer-of-code-2010\/","og_locale":"en_US","og_type":"article","og_title":"End of Google Summer of Code 2010 - Blog of Jeroen De Dauw","og_description":"As Google Summer of Code (GSoC) 2010 has ended, I&#8217;m writing this blog post to outline what I&#8217;ve done during&hellip;","og_url":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/","og_site_name":"Blog of Jeroen De Dauw","article_published_time":"2010-08-20T18:07:00+00:00","og_image":[{"url":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/2010_NoURL_300x267px.jpg","type":"","width":"","height":""}],"author":"Jeroen","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/JeroenDeDauw","twitter_site":"@JeroenDeDauw","twitter_misc":{"Written by":"Jeroen","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/#article","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/"},"author":{"name":"Jeroen","@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"headline":"End of Google Summer of Code 2010","datePublished":"2010-08-20T18:07:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/"},"wordCount":1799,"commentCount":2,"publisher":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"image":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/#primaryimage"},"thumbnailUrl":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/2010_NoURL_300x267px.jpg","keywords":["Deployment","Distribution","Extension management","Google","GSoC","GSoC 2010","MediaWiki","Open Source","PHP","Planet Wikimedia","Refactoring","Wikimedia"],"articleSection":["Programming"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/","url":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/","name":"End of Google Summer of Code 2010 - Blog of Jeroen De Dauw","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/#primaryimage"},"image":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/#primaryimage"},"thumbnailUrl":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/2010_NoURL_300x267px.jpg","datePublished":"2010-08-20T18:07:00+00:00","breadcrumb":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/#primaryimage","url":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/2010_NoURL_300x267px.jpg","contentUrl":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/2010_NoURL_300x267px.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/20\/end-of-google-summer-of-code-2010\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.entropywins.wtf\/blog\/"},{"@type":"ListItem","position":2,"name":"End of Google Summer of Code 2010"}]},{"@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-fw","jetpack-related-posts":[{"id":941,"url":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/07\/distribution-extension-for-mediawiki\/","url_meta":{"origin":962,"position":0},"title":"Distribution extension for MediaWiki","author":"Jeroen","date":"2010-08-07","format":false,"excerpt":"With only 2 days till the suggested Google Summer of Code 'pencils down' date, and a week longer until the firm one, I'm using my remaining time to get some basic functionality working for my GSoC project. I've started creating a new extension called Distribution that will provide an API\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":[]},{"id":792,"url":"https:\/\/www.entropywins.wtf\/blog\/2010\/04\/26\/google-summer-of-code-2010\/","url_meta":{"origin":962,"position":1},"title":"Google Summer of Code 2010","author":"Jeroen","date":"2010-04-26","format":false,"excerpt":"Like last year, I\u2019ve been accepted for GSoC 2010 \u2013 yay! The Google Summer of Code (GSoC) is an annual program, first held from May to August 2005, in which Google awards stipends to hundreds of students who successfully complete a requested free software \/ open-source coding project during the\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"Google","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/04\/google_logo-300x125.jpg?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":925,"url":"https:\/\/www.entropywins.wtf\/blog\/2010\/07\/22\/mediawiki-deployment-modifying-the-new-installer\/","url_meta":{"origin":962,"position":2},"title":"MediaWiki Deployment: Modifying the new installer","author":"Jeroen","date":"2010-07-22","format":false,"excerpt":"I got a new diagram!!!1!11!! It's based on my previous one, but slightly more elaborate, and a lot less messy, as I now used Dia to create it :) Legend: Striped lines: Existing components where code will be copied from, or based upon. Full lines: Components of the complete deployment\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"MediaWiki deployment diagram","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/07\/MwDeployment-1024x389.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/07\/MwDeployment-1024x389.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/07\/MwDeployment-1024x389.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/07\/MwDeployment-1024x389.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":7,"url":"https:\/\/www.entropywins.wtf\/blog\/2009\/04\/26\/google-summer-of-code-2009\/","url_meta":{"origin":962,"position":3},"title":"Google Summer of Code","author":"Jeroen","date":"2009-04-26","format":false,"excerpt":"I\u2019ve been accepted for GSoC 2009 - yay! This will enable me to work over 2 months on open source while getting payed by Google. For more info about GSoC, check out the official GSoC site. I\u2019ll be working on in my opinion one of the most exciting open source\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"google_logo","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2009\/04\/google_logo-300x125.jpg?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":852,"url":"https:\/\/www.entropywins.wtf\/blog\/2010\/06\/10\/extension-management-platform\/","url_meta":{"origin":962,"position":4},"title":"Extension management platform","author":"Jeroen","date":"2010-06-10","format":false,"excerpt":"After doing a pile of research on how to best create an extension management platform for MediaWiki as my Google Summer of Code project, I realized that a lot of the work that I wanted to do was already done in some form or another, and decided to somewhat augment\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":[]},{"id":957,"url":"https:\/\/www.entropywins.wtf\/blog\/2010\/08\/14\/specialextensions-taking-form\/","url_meta":{"origin":962,"position":5},"title":"Special:Extensions taking form","author":"Jeroen","date":"2010-08-14","format":false,"excerpt":"Just a few quick screenshots of Special:Extensions, on which I've been working today. The first screenshot shows Special:Extensions page displaying a list of all the extensions I have installed on my local wiki: As you can see, you can now filter on extension type with the control right below the\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"Special:Extensions page showing all installed extensions","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/mediawiki-special-extensions.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/mediawiki-special-extensions.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/mediawiki-special-extensions.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/08\/mediawiki-special-extensions.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\/962","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=962"}],"version-history":[{"count":0,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/962\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/media?parent=962"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/categories?post=962"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/tags?post=962"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}