{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Collaboration tools"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*collaborative* work / *collective* work\n",
    "\n",
    "**collaboration tools**\n",
    "\n",
    "Tools shape practice shape tools...\n",
    "\n",
    "Under what conditions do you collaborate?\n",
    "\n",
    "**collective practices**\n",
    "\n",
    "Who is part of the \"collective\"?\n",
    "\n",
    "Who has the power to make decisions?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Protocols in flux\n",
    "\n",
    "* code of conduct\n",
    "* membership guidelines\n",
    "* terms of service\n",
    "* commitment statements\n",
    "* meeting guidelines\n",
    "* collaboration agreements\n",
    "* ...\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tools shape practice shape tools"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](https://www.burg-halle.de/home/446_kliesch/Tools-shapes-practice-shapes-tools-osp.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "        <iframe\n",
       "            width=\"1200\"\n",
       "            height=\"600\"\n",
       "            src=\"https://ecotones.caveat.be/osp.html\"\n",
       "            frameborder=\"0\"\n",
       "            allowfullscreen\n",
       "        ></iframe>\n",
       "        "
      ],
      "text/plain": [
       "<IPython.lib.display.IFrame at 0x7ff8cafc7748>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import IFrame\n",
    "IFrame(\"https://ecotones.caveat.be/osp.html\", 1200, 600)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "OSP's collaboration agreement\n",
    "\n",
    "https://gitlab.constantvzw.org/osp/osp.meta.association/\n",
    "\n",
    "https://ecotones.caveat.be/osp.html"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Versioning\n",
    "\n",
    "> Versioning is a method for dealing with divergence in networked collaborations. While originally developed to track software production, it is implemented in Wikis, etherpads and other digital writing tools. Log files and so-called “diffs” are automatically saved to make the incremental process of shared editing transparent, or at least to machines, since any action can be reversed or repeated at any time; errors or unwanted inputs can be later corrected. Even if the conventional narrative of “versioning” is one of streamlining collaboration and producing consensus, these techniques and technologies do pay attention to difference. \n",
    "\n",
    "https://diversions.constantvzw.org/wiki/index.php?title=Introduction#introduction\n",
    "\n",
    "## Conversation\n",
    "\n",
    "Conversation, discussion, collective decision making, task lists... these are all very useful tools for collaborative work. \n",
    "\n",
    "* Zulip/Rocketchat/Mattermost (free and open source software, but there are many more of this kind of tools, such as Slack/Discord/Microsoft Teams/etc/etc/etc/...)\n",
    "* Git issue tracker\n",
    "* MediaWiki discussion pages\n",
    "* ...\n",
    "\n",
    "## Shared environment\n",
    "\n",
    "* shared file storage\n",
    "* text-editing in real time\n",
    "* terminal sharing in real time\n",
    "* shared server\n",
    "* ...\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true,
    "tags": []
   },
   "source": [
    "## Git \n",
    "\n",
    "![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Git-logo.svg/320px-Git-logo.svg.png)\n",
    "\n",
    "https://git-scm.com/\n",
    "\n",
    "Git is a a collaboration tool mostly used by programmers to work together on code. \n",
    "\n",
    "Git is free and open source software, published under a [GPL 2.0 license](https://opensource.org/licenses/GPL-2.0) which means that it can be used, studies, modified and redistributed under the condition that it is published under the same or similar license. \n",
    "\n",
    "Git is created by Linus Torvalds in 2005 as part of making the Linux kernal. \n",
    "\n",
    "`git != github != gitlab != gitea`\n",
    "\n",
    "You probably have heard of GitHub, a popular implementation of git that is used by many developers to share their code. It was bought by Microsoft in 2018. GitHub is not the same kind of software as git is. GitHub and GitLab and Gitea (the one we use at XPUB) are web interface software projects that allows you to work with git through the browser. Git, on the other hand, is the underlying software that is used by these projects.\n",
    "\n",
    "### Git's collaboration tools\n",
    "\n",
    "Git comes with a whole set of collaboration tools build in, such as:\n",
    "\n",
    "* a versioning system\n",
    "* a logging system\n",
    "* branching system, to allow for multiple parallel development tracks\n",
    "\n",
    "### Issue tracker\n",
    "\n",
    "The web interfaces (GitHub, GitLab and Gitea) add more collaboration tools, such as:\n",
    "\n",
    "* an issue tracker, where code can be discussed\n",
    "\n",
    "`NOTE!` Issue trackers are commonly used to discuss specific (missing) features or bugs of code. There is a common implicit norm that issue trackers are places for technical-only discussions. This is a very limited understanding of what an *issue* could be. How can issue trackers be a place to discuss the implicancies of software? Who is part of these discussions, and (more importantly!) who is not? \n",
    "\n",
    "An interesting example of an attempt to widen the use of issue trackers is the discussion thread that TiTiPi ([The Institute for Technology in the Public Interest](titipi.org/)) opened in the git repository of the Electronic Health Certificates that would become part of the COVID QR code apps: https://github.com/ehn-dcc-development/hcert-spec/discussions/85. Where the first response was:\n",
    "\n",
    "> As this is not a technical issue with the specification, I will move this to the discussion forum.\n",
    "\n",
    "### More tools\n",
    "\n",
    "Some web interfaces push specific collaboration tools, such as:\n",
    "\n",
    "* activity trackers (which grew out into productivity tracking tools on GitHub: [example](https://github.com/ether/etherpad-lite/graphs/contributors) and [another example](https://github.com/JohnMcLear?tab=overview&from=2021-12-01&to=2021-12-31))\n",
    "* email notification systems\n",
    "* ..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## MediaWiki\n",
    "\n",
    "https://www.mediawiki.org/\n",
    "\n",
    "The wiki that we're using for the course runs on the same software as Wikipedia is running on, called *MediaWiki*. There are many more other types of *wiki's*, and each of them are slighly different in terms of interface and how the system works.\n",
    "\n",
    "> Wiki wiki is the first Hawai'ian term I learned on my first visit to the islands. The airport counter agent directed me to take the wiki wiki bus between terminals. I said what? He explained that wiki wiki meant quick. I was to find the quick bus. I did pick up a book about the language before my return home. I learned many things from this but wiki wiki is the word that sticks the most. https://web.archive.org/web/20080315215535/http://c2.com/doc/etymology.html\n",
    "\n",
    "![](https://upload.wikimedia.org/wikipedia/commons/thumb/4/42/HNL_Wiki_Wiki_Bus.jpg/320px-HNL_Wiki_Wiki_Bus.jpg)\n",
    "\n",
    "In 1995 Ward Cunningham described a wiki as [\"the simplest online database that could possibly work\"](https://web.archive.org/web/20080416212802/http://www.wiki.org/wiki.cgi?WhatIsWiki). The wiki was a way to share and collaborate on code and code-related ideas in a casual way. In fact, the wiki followed principles such as the [collective code ownership](https://web.archive.org/web/20080311111547/http://c2.com/cgi/wiki?CollectiveCodeOwnership), or [code stewardship](https://web.archive.org/web/20081205074708/http://c2.com/cgi/wiki?CodeStewardship). \n",
    "\n",
    "More design principles here: https://web.archive.org/web/20080329114249/http://c2.com/cgi/wiki?WikiDesignPrinciples\n",
    "\n",
    "Video recording of Ward Cunningham talking about the wiki: https://en.wikipedia.org/wiki/File:Ward_Cunningham,_Inventor_of_the_Wiki.webm\n",
    "\n",
    "Like Git, also wiki's are collaboration tools. They come with a range of features that shape collaborative work and introduces specific forms of sociality:\n",
    "\n",
    "* versioning system (called *revisions*)\n",
    "* discussion pages\n",
    "* recent changes\n",
    "* user pages\n",
    "* red links\n",
    "* email notifications\n",
    "* ...\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Etherpad\n",
    "\n",
    "Like Git and MediaWiki, also Etherpad comes with different tools to shape collective work:\n",
    "\n",
    "* versioning system (timeline)\n",
    "* chat function\n",
    "* authorship colors\n",
    "* ...\n",
    "\n",
    "Etherpad is based on real-time conflict resolution, for which different algorithms have been used by the Etherpad project: *Operational Transformation* (OT) and *Conflict-free replicated data types* (CRDTs). These are used to follow the order of the changes that are being made, to make sure that Etherpad users are \"on the same state\".\n",
    "\n",
    "Michael wrote about how Etherpad represents changes in the form of changesets, in an essay called *Eventual Consistency* : https://diversions.constantvzw.org/wiki/index.php?title=Eventual_Consistency (recommended reading if you're interested in collaboration systems or reading/writing machines!)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "        <iframe\n",
       "            width=\"1200\"\n",
       "            height=\"600\"\n",
       "            src=\"https://diversions.constantvzw.org/wiki/index.php?title=Eventual_Consistency\"\n",
       "            frameborder=\"0\"\n",
       "            allowfullscreen\n",
       "        ></iframe>\n",
       "        "
      ],
      "text/plain": [
       "<IPython.lib.display.IFrame at 0x7f81a41a2358>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import IFrame\n",
    "IFrame(\"https://diversions.constantvzw.org/wiki/index.php?title=Eventual_Consistency\", 1200, 600)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Collaboration is possible thanks to algorithms that resolve small conflicts about changes made by different people. \n",
    "\n",
    "Person A can type: `hello` <br>\n",
    "Person B can edit is into: `hallo`<br>\n",
    "Person C can make the word bold: **`hallo`**<br>\n",
    "\n",
    "And in order to display these changes on everyone's screen and to stimulate collaboration, such changes are stored as (so called) \"changesets\".\n",
    "\n",
    "https://raw.githubusercontent.com/ether/etherpad-lite/master/doc/easysync/easysync-full-description.pdf\n",
    "\n",
    "> There are 3 operators in this Changeset. There are 3 types of operators: `=`,`-`,`+`. Operators describe different changes on the text beginning at the first Character of the Text.\n",
    "> \n",
    "> The `=` operator doesn't change the text, but it may change the attributes of the text (For example make it bold).\n",
    "> \n",
    "> The `-` operator removes text.\n",
    "> \n",
    "> Finally the `+` Operator adds text with attributes.\n",
    "\n",
    "This is a snippet from the essay, showing some examples of such *changesets*:\n",
    "\n",
    "```\n",
    "Changeset               Interpretation\n",
    "--------------------    --------------------\n",
    "Z:1>3*0+3$thi           insert 3 characters: thi\n",
    "Z:4>2=3*0|1+2$s\\n       keep 3 chars, insert 1 line: s (newline)\n",
    "Z:6>2|1=5*0+2$is        keep 1 line, insert 2 characters: is\n",
    "Z:8>1|1=5=2*0|1+1$\\n    keep 1 line, keep 2 characters, insert (newline) \n",
    "Z:9>2|2=8*0|1+2$a\\n     keep 2 lines, insert 1 line: a (newline)\n",
    "Z:b>2|3=a*0+2$te        keep 3 lines, insert 2 characters: te\n",
    "Z:d>2|3=a=2*0+2$xt      keep 3 lines, keep 2 characters, insert xt\n",
    "Z:f<1|3=a=2-1$          keep 3 lines, keep 2 characters, delete 1 character\n",
    "Z:e>1|3=a=2*0+1$s       keep 3 lines, keep 2 characters, insert 1 character: s\n",
    "```\n",
    "\n",
    "![](https://diversions.constantvzw.org/wiki/images/a/a1/Crdt0006.png)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Jupyter Pi\n",
    "\n",
    ";)\n",
    "\n",
    "https://git.xpub.nl/XPUB/jupyterpi"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## tmux\n",
    "\n",
    "Tmux: a terminal multiplexer\n",
    "\n",
    "Sharing a terminal in real time.\n",
    "\n",
    "https://pzwiki.wdka.nl/mediadesign/Tmux\n",
    "\n",
    "![](https://upload.wikimedia.org/wikipedia/commons/5/50/Tmux.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## API's\n",
    "\n",
    "These 3 collaboration tools also come with an API: \n",
    "\n",
    "* https://pzwiki.wdka.nl/mw-mediadesign/api.php (the XPUB course wiki API)\n",
    "* https://git.xpub.nl/api/swagger (the XPUB Gitea API)\n",
    "* https://hub.xpub.nl/soupboat/pad/api/ (the Soupboat Etherpad API)\n",
    "* https://zulip.xpub.nl/api/ (the XPUB Zulip API)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Some examples of collaborative tools and collective practices made with these tools:\n",
    "\n",
    "* OSP's website, based on GitLab's API and the tool they made, called **Visual Culture**: http://osp.kitchen + http://osp.kitchen/tools/visualculture/\n",
    "* OSP's **Ethertoff** project, using Etherpad + web-to-print techniques + Django, adding \"read\", \"write\", \"print\" modes to a website: http://osp.kitchen/tools/ethertoff/ + http://f-u-t-u-r-e.org/\n",
    "* Luuse's **pad2print**, using Etherpad + web-to-print techniques: https://gitlab.com/Luuse/pad2print\n",
    "* Constant's **etherdump**, to index pads that are made on the Constant Etherpad (made by Michael): https://etherdump.constantvzw.org/\n",
    "* Hackers and Designers collaborative design system based on Zulip, called **ChattyPub**: https://hackersanddesigners.nl/s/Publishing/p/Chattypub\n",
    "* Annemieke van der Hoek (network media alumni) made **Epicpedia** (2008), using the MediaWiki API: https://www.networkcultures.org/_uploads/%237reader_Wikipedia.pdf?page=112 \n",
    "\n",
    "The *Eventual Consistency* essay by Michael introduces Epicpedia: \n",
    "\n",
    "> Inspired by the work of Berthold Brecht and the notion of Epic Theater, Epicpedia presents Wikipedia articles as screenplays, where each edit becomes an utterance performed by a cast of characters (both major and minor) that takes place over a span of time, typically many years. The work uses the API of wikipedia to retrieve for a given article the sequence of revisions, their corresponding user handles, the summary message (that allows editors to describe the nature of their edit), and the timestamp to then produce a differential reading.\n",
    "\n",
    "And there are many more (to come)! :)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
