dkr's bloghttps://log.dkarayiannis.eu/2018-05-27T09:18:20+00:00[repub] The Data Union - A positive step in the wrong direction2018-05-27T09:18:20+00:002018-05-27T09:18:20+00:00dkrtag:log.dkarayiannis.eu,2018-05-27:/a/repub-the-data-union-a-positive-step-in-the-wrong-direction.html<p>Yesterday I published a critique titled <em>The Data Union: A positive step in the wrong direction</em> on local independent media platform Kontrasusta. I am republishing it here now.</p>
<hr>
<p><a href="https://kontrasusta.org/the-data-union-a-positive-step-in-the-wrong-direction/" title="Permalink to A positive step in the wrong direction – Kontra Susta">Original Post URL</a> </p>
<h1 id="a-positive-step-in-the-wrong-direction-kontra-susta">A positive step in the wrong direction – Kontra Susta</h1>
<p>published on May 26, 2018 by dem. </p>
<blockquote>
<p><strong>The Data Union asks for better living conditions inside the walled garden, but they are not daring to imagine an ecosystem without walls.</strong></p>
</blockquote>
<p>Very recently, a new <a href="https://thedataunion.eu/">international union</a> was founded in the Netherlands, with the goal of uniting social media users, and through collective representation put pressure on big Internet companies and state governments. They want to pressure companies such as Google and Facebook to provide more user-friendly terms and conditions, and governments to enact stronger privacy laws.</p>
<p>There’s a lot to like about this initiative. It’s an attempt to bargain collectively in an insufferably individualised neoliberal world. <a href="https://www.reuters.com/article/us-netherlands-tech-data-labour-union/facebook-users-unite-data-labour-union-launches-in-netherlands-idUSKCN1IO2M3">Statements</a> from the board of directors of this union recognise user-generated content as the result of labour, and of users as unpaid workers producing surplus value for the commercial entities that run the websites. Quotes such as “What we want…is to get across the table from Google and Facebook to talk about reasonable compensation, or at least better working conditions” by President of the Advisory Board and Dutch Labour Party Dr. Paul Tang MEP show a refreshingly good understanding of the relationship between users and Internet service providers.</p>
<p>There’s also of course the obvious criticisms, such as their focus on reformist, compromise-driven tripartite model of “State-Capital-Union” negotiations, or its hierarchical, (social-)democratic centralist-type structure. But for me the problem runs deeper. The Data Union is pushing in the wrong direction. Winning concessions from Facebook or Google is not the solution. Doing away with them is.</p>
<p>To fight a sociopolitical structure, you need to understand how it works. Focusing just on Facebook, for ease of exposition, we need to understand this about them: Facebook is a private <strong>walled garden</strong>. A walled garden is a metaphor used in discussions of network services to describe how a provider tries to (a) bring users into their service, and (b) limit their ability to leave that service once they are in.</p>
<p>Before Facebook, there was the Web (now retroactively renamed <em>Web 1.0</em>). On the Web, each user could have a presence by having their own websites, and use tools like email to communicate. The users of course didn’t own the cables that connected their computers with everyone else around the world, but they controlled their online presence to a great extend. To communicate with others, they could simply establish a peer-to-peer relationship, by sending them an email, or visiting their blog. It didn’t matter if user A was on <a href="mailto:user_a%40cytanet.com.cy">user_a@cytanet.com.cy</a> and user B was on <a href="mailto:user_b%40aol.com">user_b@aol.com</a>, their different underlying network service providers were just carriers. Many users were even the network carriers for themselves, managing their own webservers and not relying on a company to do it for them.</p>
<p>With Facebook, a lot of things that were already possible, like chat (email, IRC, Jabber), aggregation of new posts from multiple sources (RSS), and event calendars (iCalendar, vCal), were packed together and integrated for easier use.</p>
<p>As a matter of fact, Facebook early on made use of technologies like Jabber, and RSS to provide their services, and they were to some degree compatible with other servers also running the same technologies. So if you wanted to talk with someone on Facebook, but you didn’t have a Facebook account yourself, you could still do it by using your Jabber account. Or you could get real-time notifications from a Facebook page without having to visit Facebook itself. Being on Facebook meant everything was done from the same interface though, and that drove many people in.</p>
<p>Once a lot of people were in though, Facebook had power, and they used it. For example they cut off chat functionality with the rest of the non-Facebook Web in 2015, by dropping support for Jabber. Now you could only contact people on Facebook and Facebook alone. RSS was also dropped. Any external links posted on Facebook are also disadvantaged: “native content” gets priority, and external links are treated as “potentially malicious” and get hidden away behind an “Are you sure you want to leave Facebook?” warning. That’s the second stage of a walled garden. Locking the gates.</p>
<p>That’s not just something Facebook does because its CEO is evil. This is the fate of centralised network services, where all data storage and processing happens at the servers controlled by one entity, and where the users are at the mercy of that entity. Centralised services are often more convenient than alternatives, but because of their very structure, they are always more restrictive and hierarchical.</p>
<p>The Data Union asks for better living conditions inside the walled garden, but they are not daring to imagine an ecosystem without walls.</p>
<p>Contrary to what neoliberalism wants us to believe, <strong>there is an alternative</strong>. There is a way to have horizontal, non-hierarchical social networks: The <em>Federated Web</em>, or <a href="https://fediverse.party/"><em>The Fediverse</em></a> (federated universe).</p>
<p>Federated network services are services where different entities (running different servers), have the technical ability to communicate with each other and seamlessly share content between them. They do that by using open communication protocols: email for text messages, Jabber/XMPP for real-time chat, RSS/Atom for real-time content delivery, and recently ActivityPub for social interactions (implemented for example by <a href="https://joinmastodon.org/">Mastodon</a>, the software that runs many federated social networks).</p>
<p>In the Federated Web, it doesn’t matter if you run your own server, and few of your friends banded together to collectively run a server jointly used by all of them, and maybe some other common friends use services provided by some organisation that manages their server (eg their university). You can all communicate together, as if you were all on the same website.</p>
<p>The Federated Web radically defuses the power one single service provider could have on the users. It doesn’t prohibit you from contacting people who are not on the same server than you, and you always have the option of leaving one federated node for another one if you start to feel that the administrator of that node is malicious, without losing access to the people with whom you want to stay in touch. Leaving a centralised service like Facebook on the other hand is near-unimaginable for most people, because it means losing contact with anyone who doesn’t follow you in your attempt to climb the walled garden and escape.</p>
<p>The Data Union’s ideas are welcome and they have the best intents. But with their reformist tripartite compromise-seeking, they will not solve the social injustices that are inherent to centralisation.</p>
<p>For technology-user liberation, we should tear down all the walls and built horizontal network relationships that rely on open protocols, and implement the protocols in libre software that anyone can use, modify, and share.</p>My personal XMPP server and some more self-hosting plans2018-03-18T13:38:49+00:002018-03-18T13:38:49+00:00dkrtag:log.dkarayiannis.eu,2018-03-18:/a/my-personal-xmpp-server-and-some-more-self-hosting-plans.html<p>Over the last few days I set up and fine-tuned my own (single-user) self-hosted <a href="https://xmpp.net">XMPP/Jabber</a> server, using <a href="https://prosody.im">Prosody</a>.</p>
<p>The initial process took only 20 minutes, and so far Prosody seems to be very modest in CPU and RAM usage. Some more advanced configuration decisions, like offering services such as a <a href="https://prosody.im/doc/modules/mod_proxy65">SOCKS proxy over HTTP</a> took me a few days to get right, but with the help received from the <a href="https://prosody.im/discuss#chatroom">Prosody XMPP chatroom</a>, I was able to get everything working and pass the <a href="https://github.com/iNPUTmice/ComplianceTester">compliance test</a> supporting all non-deprecated or non-freedom-respecting XMPP extensions (for example, I decided not to support <code>XEP-0357: Push Notifications</code> because it re-centralises what is meant to be a federative ecosystem).</p>
<p>I am tempted to write a full installation tutorial, but there’s no real reason to duplicate effort, because Prosody’s 1st-party documentation was truly enough to get 90% of the process done. So I will probably only document the remaining 10% at some point (which is mostly the issue of reverse-proxying Prosody’s http interface behind Apache httpd in order to get a LetsEncrypt TLS certificate).</p>
<p>If you want to contact me but do not like email for some reason, now you can add JID <code>dkr@tarxjf.info</code> (OTR and OMEMO encryption supported), or join this public chatroom <code>blog@rooms.tarxjf.info</code>. Email remains my preferred means of communication though.</p>
<p>If the server continues to run without problems, I’ll add it in my contact page, and maybe also on the blog’s template under every article, as an alternative to a commenting system (something that I would like to have but I don’t want to be serving Javascript or maintaining an SQL database if I can avoid it). <em>Unique rooms for each post, automatically generated at website compilation time maybe?</em></p>
<hr>
<p>Setting up my own XMPP server was partly motivated by me simply wanting to <em>learn</em> how to do it, but it’s also because as time goes on, I feel more and more concerned about the fragmentation of the Web. With every aspect of the Web being silo-ed away in proprietary platforms, I want to showcase best practices. A federative communications like XMPP is one such best practice: I could just get a JID from a big public server, but by running my own single-user server, I actually put one of the protocol’s advantages in actual use.</p>
<p>Another protocol that caught my attention is <a href="https://activitypub.rocks/">ActivityPub</a>, a recently standardised open social networking protocol, notably implemented by <a href="https://joinmastodon.org/">Mastodon</a>, a decentralised microblogging platform. Now, I’m not interested in joining a social network, not even a self-hosted one. So I’m very interested to see how else could I make use of ActivityPub. A blog commenting system is again the first idea that comes to mind.</p>
<p>Self-hosting my email is also a priority, since my domain name registrar is soon taking away the mail hosting package I am currently using. </p>
<p>And on a smaller scale, I want to soon make the Atom and RSS feeds on my blog and my other minisites more visible and more useful. I also want to finally set up public git repos for <a href="https://tarxjf.info/p/software.html">these projects</a>, and for the HTML templates and CSS used to generate my website.</p>
<p>Down to the plumbing level, I know I should finally start serving my websites on IPv6 in addition to IPv4. </p>"I'm with DEDE: Justice for Adjunct Teaching and Research Scientists at UCY"2018-01-13T19:46:41+00:002018-01-13T19:46:41+00:00dkrtag:log.dkarayiannis.eu,2018-01-13:/a/im-with-dede-justice-for-adjunct-teaching-and-research-scientists-at-ucy.html<p>DEDE, the trade union representing adjunct teaching and research scientists at my home university, <em>University of Cyprus</em> declared a 48-hour strike for January 22nd. This is in response to the University’s bad faith and unwillingness to implement the agreement concluded between the trade union and the Rectorate last June, after almost two years of negotiations between the two.</p>
<p>Quoting excerpts from <a href="http://dede.org.cy/press-release-strike-action-at-the-university-of-cyprus/">their press release</a>:</p>
<blockquote>
<p>DEDE is a pan-Cyprian trade union, representing academic PhD holders employed in irregular working positions. It has many members at the University of Cyprus, who cover a large part of the University’s constant and permanent needs in research and teaching with hourly and fixed term contracts. Our members receive very low wages and in the form of successive, yet interrupted, contracts. Their employment is subject to particularly precarious working conditions, without fundamental employment rights, such as maternity leave, medical coverage or 13th salary, and without academic rights, such as for example the right to be represented in the collegiate bodies of the university.</p>
<p>All attempts aimed at engaging in a democratic dialogue with the University authorities were futile. While our academic status should have been self-evident and acknowledged on the basis of our contribution to the quality work undertaken at the University of Cyprus in recent years, this, unfortunately, has not been the case. The University has refused to discuss core issues pertaining to our status, and failed to understand that precarious work conditions undermine the quality of research and teaching. The University must take action and address the rationalization of its human resources.</p>
</blockquote>
<p>As a student at UCY who has benefited from the underpaid and undervalued expertise of adjunct academic staff, I am proud to stand in solidarity with them, and I fully support their demands.</p>
<p><strong>Victory to DEDE!</strong></p>Website expansion updates2017-11-05T11:57:40+00:002017-11-05T11:57:40+00:00dkrtag:log.dkarayiannis.eu,2017-11-05:/a/website-expansion-updates.html<p>I have been working on fleshing out my website in the last few days. The main site over at tarxjf.info is no longer a placeholder redirecting to my blog. <a href="https://tarxjf.info/a/the-homepage-is-no-longer-a-placeholder.html">I adopted the blog’s theme and template</a> to make work as a more professional landing page. </p>
<p>The plan so far is to move all long-form articles out of this blog and into one or more categories on the main website (I am still not settled on the exact categorisation). This will declutter the blog, which now has a mixture of release announcements, articles, status updates, and actual “bloggy” posts. </p>
<p>Piggybacking on the modifications I made on the template for homepage use, <code>cma-keyboard</code> now has its dedicated <a href="https://software.tarxjf.info/cma-keyboard/">project homepage</a>. A new minor version of the layout should be coming out soon. I also received requests to work on a Cypriot Greek keyboard next, so when that’s ready it will get its own project homepage on the same subdomain. </p>
<p>At some point soon, log.tarxjf.info will become a real bloggy blog, with topical posts, opinion, and short updates only. Academic articles and presentations will go on the main website (or a dedicated subdomain if I can’t make it work there), and software releases will go to dedicated project homepages. Every section will have its own syndication feed. </p>
<p>What I wish to do soon is set up public git repos and share all the modifications I made to the theme and templates. The theme is under the GPL, and there’s a link on the footer of each page if you want to get the source. The Jinja template is in the public domain, but I still want to share it. It’s not done yet simply because I want to self host the git repositories. </p>A GNU/Linux (XKB) layout for Cypriot Maronite Arabic - Version 1.02017-10-01T14:04:03+00:002017-10-01T14:04:03+00:00dkrtag:log.dkarayiannis.eu,2017-10-01:/a/a-gnulinux-xkb-layout-for-cypriot-maronite-arabic-version-10.html<p>A GNU/Linux keyboard layout for CMA (Sanna) is now available, following <a href="/a/a-gnulinux-xkb-layout-for-cypriot-maronite-arabic-design.html">the specifications outlined in a previous post</a>.</p>
<p>This release has been a long time coming, and I have to give credits to the <a href="https://github.com/39aldo39/klfc">klfc</a> project for finally making it possible. Dealing with raw XKB configuration has been nothing but confusing, and klfc abstracts it all away by allowing people to design new keyboard layout in a very straightforward JSON format.</p>
<h1 id="release-v10">Release v1.0</h1>
<p>I am releasing this <em>keyboard layout implementation</em> into the Public Domain, with no rights reserved from my part, using the Creative Commons Zero license. Please note that this copyright waiver applies <em>only</em> to the keyboard layout itself (the files <code>cma.json</code>, <code>xkb/symbols/cma</code>, and <code>xkb/types/cma</code>) — the download package below also contains klfc code (in particular components of the installation script), which is licensed under the <a href="https://github.com/39aldo39/klfc/blob/master/LICENSE.txt">GNU General Public License Version 3</a>, a strong copyleft license.</p>
<h2 id="downloads">Downloads</h2>
<p>The v1.0 release is available as <code>tar.xz</code> and <code>7z</code> compressed archives. Both are widely supported by GNU/Linux systems, users may choose whichever is more convenient for them.</p>
<ul>
<li><a href="/media/cma-keyboard.tar.xz">cma-keyboard.tar.xz</a> (24.1 kB)</li>
<li><a href="/media/cma-keyboard.7z">cma-keyboard.7z</a> (23.2 kB)</li>
</ul>
<h2 id="screenshots">Screenshots</h2>
<ul>
<li><a href="/media/cma-kb-1.png">CMA keyboard appears in Xfce’s keyboard layouts list</a></li>
<li><a href="/media/cma-kb-3.png">Lines from a CMA poem published in kormakitis.net are typed into Xfce’s Mousepad application</a></li>
</ul>
<h2 id="installation">Installation</h2>
<ol>
<li>Extract the contents of the archive in a temporary location</li>
<li>From the command line, navigate to the <code>xkb/</code> folder</li>
<li>Type <code>sudo ./install-system.sh</code> to run the installation script as super-user
(if you don’t use <code>sudo</code>, alternatively use <code>su -c './install-system.sh'</code>)</li>
<li>From your graphical environment’s control panel, go to keyboard settings and add the new keyboard layout to the list of active layouts</li>
</ol>
<h2 id="to-do">TO-DO</h2>
<ul>
<li>Set up a public code repository for <code>cma-keyboard</code></li>
<li>Improve the documentation and the COPYING file</li>
<li>Create an uninstall script</li>
<li>Create a dedicated project homepage</li>
<li>Set up a bug tracker</li>
<li>Get cma-keyboard included upstream so it is available by default on all GNU/Linux desktops</li>
<li>Leverage klfc’s powers and also release an Android keyboard layout</li>
</ul>
<h2 id="contact-me">Contact me</h2>
<p>For questions, bug reports, suggestions, and offers of help, please <a href="/p/contact.html">contact me</a>. Especially please contact me if you understand how XKB accepts new keyboard layouts in their standard distribution. </p>W3C tarnishes whatever legitimacy it still had - EFF resigns2017-09-20T00:56:50+00:002017-09-20T00:56:50+00:00dkrtag:log.dkarayiannis.eu,2017-09-20:/a/w3c-tarnishes-whatever-legitimacy-it-still-had-eff-resigns.html<p>I am signal-boosting the Electronic Frontier Foundation’s correct decision to resign from the World Wide Web Consortium, after the latter abandoned any pretence and uncritically adopted big media’s blackmail proposal for DRM in Web Standards, with summary procedures. </p>
<p>A wave of resignations must follow, as W3C must no longer be considered a viable avenue for political debate on the future of the open web. In particular, it is high time for the Mozilla Foundation to put principles first, and stop tolerating DRM. </p>
<p>The EFF press release: <a href="https://www.eff.org/deeplinks/2017/09/open-letter-w3c-director-ceo-team-and-membership">An open letter to the W3C Director, CEO, team and membership</a></p>Gobby: collaborative editing in a LAN2017-08-12T14:58:24+00:002017-08-12T14:58:24+00:00dkrtag:log.dkarayiannis.eu,2017-08-12:/a/gobby-collaborative-editing-in-a-lan.html<p>I found out about <a href="https://gobby.github.io/">Gobby</a> recently, which is an excellent
replacement for online (web-based) collaborative editors for a lot of use-cases.</p>
<p>In my case, I was editing configuration files which included passwords, and I
didn’t want those files touching the outside network. With Gobby, I could
collaborate with other admins over LAN, with TLS encryption. </p>
<p>The application is multi-platform, released under GPLv2+, has syntax highlighting
via <code>GtkSourceView</code>, a group chat, smart undo functionality, and it’s not just
limited to LAN - it can also be used over the Internet. </p>Computer-facilitated consensus revisited: Votebot2017-07-01T21:42:04+00:002017-07-01T21:42:04+00:00dkrtag:log.dkarayiannis.eu,2017-07-01:/a/computer-facilitated-consensus-revisited-votebot.html<p>As a follow-up to my previous post <a href="/a/some-thoughts-on-consensus-based-online-discussion-forums.html">on the topic</a>, today I found out about <a href="https://github.com/openpolitics/votebot">Votebot</a></p>
<blockquote>
<p>A collaborative democratic platform built on top of GitHub, designed for open policymaking and manifesto writing. </p>
</blockquote>
<p>The GitHub dependency is a show-stopper, but the mechanic behind it is very close to what I imagined as an ideal system. </p>Meaningful diff for LibreOffice files in version control2017-06-07T21:52:24+00:002017-06-07T21:52:24+00:00dkrtag:log.dkarayiannis.eu,2017-06-07:/a/meaningful-diff-for-libreoffice-files-in-version-control.html<p>I came across this tip <a href="https://www.martineve.com/2013/08/18/using-git-in-my-writing-workflow/">on Martin Paul Eve’s blog</a>: </p>
<blockquote>
<p>In any case, the key thing that will make this viable for me is having a way to see the diffs within an OpenOffice (or LibreOffice document), so I want to share how I’ve got that working (I’m using Linux Mint).</p>
<p>As per the gittips wiki, I added the following to ~/.gitconfig</p>
</blockquote>
<div class="highlight"><pre><span></span><code><span class="k">[diff "odf"]</span>
<span class="na">textconv</span><span class="o">=</span><span class="s">odt2txt</span>
</code></pre></div>
<blockquote>
<p>Then, once you’ve initialised the repository in the working directory for your new writing (“git init”), add the following to that repo’s .gitattributes file:</p>
</blockquote>
<div class="highlight"><pre><span></span><code><span class="err">*.ods diff=odf</span>
<span class="err">*.odt diff=odf</span>
<span class="err">*.odp diff=odf</span>
</code></pre></div>
<hr>
<p>Of course, there’s always the option of writing in markdown, and converting to ODF (or HTML, or PDF) only when releasing the text. </p>Some thoughts on consensus-based online discussion forums2017-06-06T23:51:01+00:002017-06-06T23:51:01+00:00dkrtag:log.dkarayiannis.eu,2017-06-06:/a/some-thoughts-on-consensus-based-online-discussion-forums.html<h2 id="introduction">Introduction</h2>
<p>Consensus decision-making is a process that allows group of people coming from very different positions, to develop a proposal they can all agree is beneficial. For me there’s no doubt that such a process is more productive than any voting-based approach. Voting-based approaches have two shortcomings: </p>
<ol>
<li>
<p>They silence minority opinions when the voting is concluded. They might differ on where they set the threshold (“first-past-the-post” vs “90% approval required” for example), but fundamentally the majority is awarded legitimacy to do whatever they wish. </p>
</li>
<li>
<p>They discourage cooperation and innovation. Discrete options are put on vote and people are called to choose one (or order them from most to least liked, under some systems), instead of being used as the starting points of formulating a proposal everyone agrees on.</p>
</li>
</ol>
<p>Voting-based approaches thus fail badly: people who systematically find themselves in the minority side grow alienated. People systematically in the majority are incentivised not to pay attention to dissenting opinions. The result is dysfunctional organisation and, almost always, hostile splits. </p>
<p>This observation, I believe holds true for any kind of organised community, be it “in the real world”, or “online”. Hostile software project forks are one such phenomenon. Recently, one software project, Libreboot, <a href="https://libreboot.org/management.html">committed themselves to one consensus-inspired approach</a> in a bid to secure the good functioning of the project and its surrounding community. </p>
<p>Before I elaborate on my thoughts, I need to also note that communities based around consensus might also want to interact with other communities. When they do that, they <em>federate</em> and might have one or more <em>delegates</em> tasked with interacting with other communities. This is not the same as sending a representative. A <a href="https://en.wikipedia.org/wiki/Delegate_model_of_representation">delegate is only a mouthpiece for the community they come from</a>, and they are not empowered to make decisions in the name of the community. They are tasked with presenting to the outside world what their community agreed upon, and presenting outside suggestions to their community. This is a much stricter commitment than, eg being a member of parliament who holds townhall meetings to gauge public opinion in their constituency, but ultimately reserving the right to act according to their conscience. </p>
<p>With that out of the way, there’s some issues when it comes to implementing consensus-based approaches in an online discussion setting (ie some fort of discussion forum or chat system). Existing software is either making consensus-seeking harder because it is designed in ways that make meaningful discussion harder, or in some cases it is even consciously designed to promote majoritarian voting systems (see poll creation options in forums). The following points are some specific problems that come to mind, and a discussion of possible solutions for each one. </p>
<div class="toc">
<ul>
<li><a href="#introduction">Introduction</a></li>
<li><a href="#a-blockveto-function">A Block/Veto Function</a><ul>
<li><a href="#do-nothing">Do nothing</a></li>
<li><a href="#closedwontfix-or-the-bug-tracker-approach">CLOSED:WONTFIX (or the Bug-tracker approach)</a></li>
<li><a href="#in-line-flagging">In-line Flagging</a></li>
</ul>
</li>
<li><a href="#collaborative-editing">Collaborative Editing</a><ul>
<li><a href="#again-do-nothing">Again, do nothing</a></li>
<li><a href="#real-time-collab">Real-time collab</a></li>
<li><a href="#asynchronous-editing">Asynchronous editing</a></li>
<li><a href="#branches">Branches</a></li>
</ul>
</li>
<li><a href="#handling-inactivity">Handling Inactivity</a><ul>
<li><a href="#do-nothing_1">Do nothing</a></li>
<li><a href="#seen">Seen.</a></li>
<li><a href="#ratify">Ratify</a></li>
<li><a href="#time-sensitivity">Time-sensitivity</a></li>
<li><a href="#quorum">Quorum</a></li>
</ul>
</li>
<li><a href="#who-moderates-the-moderators">Who moderates the moderators?</a></li>
</ul>
</div>
<h2 id="a-blockveto-function">A Block/Veto Function</h2>
<p>Ultimately, what motivates consensus-seeking is the agreement inside the community, that anyone might <em>veto</em> or <em>block</em> an unacceptable proposal. Blocking is not the end-goal though, everyone in the community must want to avoid inaction because of an unresolved disagreement. To avoid that, consensus is sought. </p>
<p>How can you implement a block option in a discussion forum in a way that makes it easily documented?</p>
<h3 id="do-nothing">Do nothing</h3>
<p>And allow the users of the forum write their thoughts as text. It’s up to everyone to understand if that text constitutes a veto, or if there’s still room for discussion. No special documentation is kept. </p>
<h3 id="closedwontfix-or-the-bug-tracker-approach">CLOSED:WONTFIX (or the Bug-tracker approach)</h3>
<p>This is a familiar option in software development. Bug or enhancement reports might be closed with the WONTFIX justification if whoever is responsible for the component the bug report is about does not agree with the proposals suggested. </p>
<p>A Closed bug report might still be commented upon, and potentially by reopened. This is generally compatible with how a veto works in consensus decision-making. It provides a clear and documented event (eg “one person did not agree with this proposal”). It also allows for metrics to be collected (eg “is this member prone to blocking proposals early?”).</p>
<p>But like CLOSED:WONTFIX creates a lot of bad feelings in a software project, so will such an unqualified veto. Where exactly was a strong disagreement? It can again only be clarified with direct text input, which is not encouraging good documentation.</p>
<h3 id="in-line-flagging">In-line Flagging</h3>
<p>A proposal is presented as a structured piece of text. The community can flag any part of the text they disagree with. If the text contains any flagged passages, it’s essentially blocked. </p>
<p>With this, we have good documentation of who vetoed the proposal, and what accepts led them to do it. What needs to be revised is clearly seen. Feelings of frustration and misunderstandings are avoided. </p>
<p>This is the approach Loomio uses to some extend. </p>
<p>This option leads us to the next requirement for a consensus-oriented discussion system: </p>
<h2 id="collaborative-editing">Collaborative Editing</h2>
<p>A proposal presented as text must be rewritten until consensus is reached. But that’s not straight forward. There are a few ways to go about doing this. </p>
<h3 id="again-do-nothing">Again, do nothing</h3>
<p>Act like a typical forum or a mailing list, with posts in a given thread ordered in chronological order. The most recent formulation of the proposal will be found at the bottom and each time a new formulation is posted, expect that the discussion refocuses on the new version. </p>
<p>Experience tells me that this is a great recipe to create a mess, and get little done. Forums and mailing lists suffer from several problems, such as people overlooking new messages and keep replying on previous versions of the proposal, “IM-like” behaviour of short context-less replies, and extensive discussion derailments (going off-topic). </p>
<p>So there needs to be more structure in editing a proposal, even if that system is complemented by a chat system on the side. </p>
<h3 id="real-time-collab">Real-time collab</h3>
<p>There’s several real-time collaborative editing solutions, such as Etherpad. In an application like that, several people can be typing and deleting stuff at the same time, with changes propagating near-instantly. </p>
<p>But what happens when two or more people disagree on the formulation of one specific passage? They usually type and retype over each other, often not even doing so maliciously (the system is <em>near</em>-instantaneous, so it might give the illusion that the other person is done typing even when they are still pressing keys on their end - and of course, people do pause to think too). </p>
<p>In such a real-time system you can’t have any meaningful revision control. Usually what you get is “commits” to the document history every <em>N</em> number of seconds or every specific amount of characters typed or deleted. The stored revisions do not tell a story of how the proposal evolved, they are more like a linear Undo/Redo history.</p>
<h3 id="asynchronous-editing">Asynchronous editing</h3>
<p>Real-time editing is probably not suitable when it comes to decision making. It might be useful in steps prior to it though. So what’s the opposite of real-time? Asynchronicity.</p>
<p>Under this system, people edit a <em>copy</em> of the latest revision of the proposal, making changes in their own time, and nothing is visible until they choose to submit. </p>
<p>This incentivises clarity and transparency, but it creates a new problems:</p>
<ol>
<li>Should a new revision immediately replace the previous one? </li>
<li>What do we do when people are trying to edit the same revision? </li>
<li>What happens when a new revision is submitted while a person is still editing a now-obsolete revision? </li>
</ol>
<p>Wikipedia for the most part allows everyone to replace the current revision, and so do most wikis. There’s two aspects to consider when evaluating Wikipedia’s approach. On the political side of things, that means that any single person has the right to change every single word in a proposal in a single swoop. That could be a breakthrough in finding a consensus (a welcome change of perspective on an issue), or it could be a hostile action. The technical question here is how do you handle more than one person editing the same revision. Wikipedia usually solves it by either placing a lock while a person is editing, or by asking the person to rebase their edits to the new revision before they can submit (with the option of disregarding the new revision). </p>
<p>This gets messy. Like in a forum or a mailing list, people will very often keep bringing old versions back to life, disregarding intermediate revisions. So being asynchronous is not a solution on its own. </p>
<h3 id="branches">Branches</h3>
<p>There’s something that can improve the Wikipedia approach, and that’s again something the software development community knows well. Branching under a revision control means working on a copy <em>but</em> without submitting your changes directly to the official version of the code (or here, <em>text</em>) – in <code>git</code> terms, not committing directly to <code>master</code>. </p>
<p>This way, multiple branches can be worked upon at the same time. Combined with the in-line flagging approach of the previous section (which now act as new branch initiators), that means that each specific idea of a proposal can be reformulated by someone, and then it becomes a matter of <em>merging</em> that self-contained idea back to the <code>master</code> revision. Repeat until there’s no more veto flags left. </p>
<p>This also allows radical changes to the proposal. Someone can create a branch in which they rewrite the entire proposal, and everyone jumps into that to make further changes, discontinuing the old <code>master</code> branch in favour of the new. </p>
<p>There’s no problem with parallel editing by multiple people as long as they are modifying different parts of the text. If approved by the community, the changes can all be merged back to <code>master</code>. Conflicting edits (ie on the same passages) are resolved by further edits, without continuous overwrites, and without committing immediately to the <code>master</code>. (How a solid, unfixable veto is resolved is outside of the scope of the collaborative editor – it’s up to the community to decide if they split up, choose inactivity, or expel a member).</p>
<p>The revision history is meaningful as it has to do with specific disagreements, and not arbitrary time periods like in real-time editing.</p>
<p>So I’m basically describing <code>git</code> at every single step. But the crux here is wrapping <code>git</code> with a UI that suits collaborative writing, and not code. </p>
<h2 id="handling-inactivity">Handling Inactivity</h2>
<p>In a system that incorporates in-line flagging, the subconscious assumption is that people who haven’t disagreed, must agree. If no-one flagged anything on the proposal, then the software understands this as unanimous agreement. </p>
<p>Is that really true in communities? Not always. It’s true that most of the time we spend the least effort – if we don’t disagree, we do nothing. But a lot of misunderstandings are caused because of this assumption. </p>
<p>If there’s a flood of proposals in the system, people might not be able to keep up. Circumstances might keep them away from their computers. Maybe they cannot locate a specific point they disagree so they don’t raise a flag. </p>
<p>Is the opposite assumption the solution? If you introduce a “Ratify” button and require every member of the community to ratify the proposal, what are the new problems you will have to deal with? How can you make sure the discussion forum design doesn’t fall into the trap of the silent consent <em>and</em> the silent disagreement? How do you tell <em>non-blocking</em> disagreement (“I can live with it”) apart from inactivity? </p>
<h3 id="do-nothing_1">Do nothing</h3>
<p>Inactivity is not an “online”-only problem, it’s a problem all consensus-based communities face regardless of modality. The ways they use to resolve or workaround this problem do not have to be codified and implemented in software. </p>
<p>The discussion platform will not facilitate but neither hinder decision-making in this specific aspect. </p>
<h3 id="seen">Seen.</h3>
<p>Maybe you don’t treat lack of feedback as consent, because you understand that people might be away, or somehow missed the proposal, but once they’ve read it, their lack of reaction must mean they agree. </p>
<p>But <em>Seen</em> doesn’t mean <em>Read, and finished thinking about it</em>. </p>
<h3 id="ratify">Ratify</h3>
<p>Everyone must signal approval of the current revision of the proposal. Lack of flags is not automatically treated as unanimous agreement. Merely having seen it doesn’t mean unanimous agreement. </p>
<p>But what if it’s Friday and we are asking if we are going to release this article on the Saturday issue of a publication, and some people aren’t online. You don’t have all the Ratify clicks required. </p>
<p>What happens if people maliciously withhold their Ratify clicks without entering a productive discussion by creating a new revision? </p>
<h3 id="time-sensitivity">Time-sensitivity</h3>
<p>Perhaps some proposal can be marked as time-sensitive, and the software does everything it can to let people know about it in time. </p>
<p>Stick it to the top of the website, email registered users, send an HTML5 notification to the user’s browser, and hope that they are take it seriously. </p>
<p>This is approaching real-life decision-making at least. When there’s an urgent decision to be made, the community tries to notify and get the opinion of everyone. </p>
<h3 id="quorum">Quorum</h3>
<p>Another real-life approach is setting a minimum number of people who can be empowered to make decisions, be it a straight-up number, or a percentage of the community’s population. </p>
<p>In real life that means that a community might start the decision-making process if at least X number of people are present. In software terms, you can skip the “counting ourselves” part and just program the software to treat any un-flagged proposal as accepted if it has X number of Ratify clicks. </p>
<p>An override switch might also be useful. Sometimes you have a quorum, but you think the matter is too serious to leave just to a subset of the community. A “Require Wider Participation” button might allow one person to pause the process and make the forum start notifying members to join the discussion, like the time-sensitivity feature discussed right above. A dedicated button isn’t required (they could just flag the text using the in-line flagging system), but it is a more transparent way to do it. </p>
<h2 id="who-moderates-the-moderators">Who moderates the moderators?</h2>
<p>Finally, when it comes to designing “digital democracy”, we have to consider that she who controls the infrastructure, controls the world. Even if we find a way to implement consensus decision-making in a forum/wiki/git-like software, the person who has access to the settings panel and the database can override everyone else, in ways that wouldn’t be so easy in “real-life” communities.</p>
<p>Giving everyone root access to the server is certainly solution that allows you to say “everyone has equal power”, but is it meaningful? Even in a technical community, not everyone has the skills needed to maintain the whole stack, from server OS upgrades to the forum’s control panel. Maybe not even everyone in the software community which develops the software I describe is empowered even in a meaningful way by just being handed root access to the server. </p>
<p>A more coherent stand is saying that some members of the community are delegated the sysadmin role, and they have to follow the wishes of the community, or be recalled. But software development has shown us that “recalling” your sysadmin doesn’t mean a lot when they have control of the infrastructure. Many hostile software forks included taking pieces of the infrastructure, such as the server and the domain name, with you (eg GNU Nano, recently, before returning back to GNU). This could happen in real-life of course, there’s a meaningful difference in how hard it is to do it. </p>
<p>So, are we again faced with the moral inescapability of the need for federalised network services? Should this system work as some kind of GNU Social instance where everyone keeps a copy of the data on their own server (or client, for added decentralisation but also to lower the bar of technical knowledge required), and every node of this federated network might at any time decide to break ties with another node, without anyone losing access to the data they shared so far, and with the possibility to federate again in the future? Are there ways to meaningful diffuse authority in non-decentralised networks?</p>
<hr>
<p>It’s just a collection of thoughts at the moment, written down because I’d like to revisit them with a fresh pair of eyes at some point in the future. <a href="/p/contact.html">Do drop me a line</a> for any feedback or existing software solutions on any or all concerns raised in the text though. </p>Reviewing the Vikings RYF X200 Laptop2017-05-30T11:20:59+00:002017-05-30T11:20:59+00:00dkrtag:log.dkarayiannis.eu,2017-05-30:/a/reviewing-the-vikings-ryf-x200-laptop.html<p>After spending half a year <a href="life-in-a-tty.html">in the TTY</a>, I upgraded to a <a href="https://libreboot.org">Libreboot</a> Thinkpad X200. It’s a 12” compact laptop and it’s currently the highest spec laptop you can get with a completely free/libre initialisation software (as an alternative to proprietary BIOS). Libreboot goes a long way in allowing you to compute in freedom, since BIOS (and EFI) are the biggest binary blobs a computer comes with (there’s of course proprietary firmware in hard drives too, but a proprietary BIOS has access to everything, and <a href="https://mjg59.dreamwidth.org/48429.html">exploits can be terrifying</a>).</p>
<p>Installing Libreboot on an existing stock Lenovo X200 is possible, but it’s not something you can get done in half an hour and be ready to go. So a lot of people from the community became Libreboot laptop vendors. I’m aware of 4 such vendors existing right now, and I decided to place my order from <a href="https://vikings.net/">Vikings</a>, based in Europe. Vikings came to my attention as a crowdfunding attempt to set up Libreboot-powered servers and become a hosting provider, something that they are still working on. But they began <a href="https://store.vikings.net/libre-friendly-hardware">selling X200 laptops and D16 workstations/servers</a>. </p>
<p>Vikings offer was the most competitive: at less than 550EUR you can get a laptop with a fresh 9-cell battery, 8GB of RAM, a 250GB SSD, and a docking station. </p>
<p>The laptop is in my hands and under use for several days now, and I have to say I’m impressed. For me, battery life is the most important aspect — I could continue living in the TTY if that was the only way to get more than five hours of battery life. But I don’t have to! The Vikings X200 with its fresh 9-cell battery reports 7 hours of battery life under typical load for my needs (brightness at 70~90%, sound and Wifi on, Firefox always open, multimedia playback). In practice, I was away from home for 3 days, and didn’t need to charge. And if I used a second battery with the docking station, I wouldn’t have to charge for 2 or 3 days more. </p>
<p>The SSD that Vikings heavily recommends you choose truly makes a difference. Write speeds are not comparable to magnetic media. Out of precaution though I mounted /tmp and /var/log on <code>tmpfs</code>, to avoid wearing the SSD down prematurely. It’s apparently also suggested to use Ext4 with SSDs, and not my usual XFS. Needless to say, the X200 is a quiet laptop, mainly because it has no movable parts.</p>
<p>The CPU and RAM combination is perhaps dated to those who are used to the latest hardware, considering this is a CPU from 2008, but honestly, if you are not doing 3D rendering, or playing 3D videogames, you don’t notice any slow downs. Other than academic work, I often edit 720p videos, and engage in desktop publishing (which involves a lot of image editing) and the X200 is more than up to task. </p>
<p>Coming to a full-size laptop from using a 10-inch ultraportable takes some time getting used to the weight, but that’s going from 1.1kg to something around 2kg. Of course you can’t complain about the normal-sized keyboard, although Lenovo’s positioning of the Fn key is a well-known rage inducer. I am a fan of the TrackPoint (as an alternative to touchpads) though. People who first encounter the TrackPoint might be surprised, but it’s more convenient and less intrusive. </p>
<p>Some inconveniences I should note is that I had the luck to receive a revision of the X200 where the physical RF Kill Switch only applies to Bluetooth, and not to Wifi as well. The other is a <a href="https://libreboot.org/docs/misc/#finetune-backlight-control-on-intel-gpus">known Libreboot limitation</a> which results to uneven backlight on lower intensity settings, which is something the end user has to fine-tune. If you buy a Libreboot X200 do not think that’s a defective screen, it’s something that software can fix. </p>
<p>As for the experience shopping from Vikings, it has been only positive, and those are not empty words: we had to solve a logistics problem that occurred with my order, and the response was immediate (both <em>quick</em> and <em>direct</em>), multiple solutions were offered, and we had an arrangement within 4 hours of noticing the mistake. That’s a level of after-sales support that I haven’t received from companies that could afford it, and yet an essentially crowdfunded effort like Vikings was able to offer it. </p>
<p>I should also note that Vikings offers the required 2 years warranty even though they are selling a refurbished product. Again, bigger companies than Vikings trick you into agreeing to only 1 year warranty (illegally), and they are selling brand-new products. </p>Cyprus Undergrad Ling Conference - the schedule2017-04-23T19:36:20+00:002017-04-23T19:36:20+00:00dkrtag:log.dkarayiannis.eu,2017-04-23:/a/cyprus-undergrad-ling-conference-the-schedule.html<p>The 1st Cyprus Undergraduate Linguistics Conference is taking place this Wednesday, April 26th. <a href="https://culc.ucy.ac.cy/a/conference-information-and-programme.html">The schedule and all abstracts are now on-line.</a></p>Are sign languages real languages?2017-03-29T09:58:31+00:002017-03-29T09:58:31+00:00dkrtag:log.dkarayiannis.eu,2017-03-29:/a/are-sign-languages-real-languages.html<p>A Greek translation of this short article I wrote was published in <em>Entropia Issue 9: Languages And Education</em>, Fall 2016. </p>
<hr>
<p>The colloquial use of the term ‘<em>language</em>‘ usually excludes sign
languages, reflecting the belief that sign languages are not real
languages, but rather finite communication systems. Nevertheless,
there’s a strong case to be made that sign languages emerge and behave
like (spoken) natural languages do.</p>
<p>There is evidence that there is a critical period for the acquisition of
signed languages, roughly from birth to the onset of puberty, after
which the mastery of the signed language requires non-trivial effort
(Fromkin, et al., 2014<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>), and signers learning it outside that period
are measurably less fluent (Newport, 1990<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>). Moreover, stages of
acquisition appear to be parallel between speakers and signers: for
example children start with babbling and reach the telegraphic stage at
approximately 2 years of age, whether they sign or speak (Fromkin, et
al., 2014).</p>
<p>Similarly to spoken languages, very little input is required for
typically-developing children to acquire a signed language. Far from
requiring explicit instruction, ‘home signs’ arise with little or no
input (Fromkin, et al., 2014). In Deaf communities such ad hoc signs can
develop into full-fledged sign languages and gain native speakers (cf
creole genesis). One such case is the Nicaraguan Sign Language, which
emerged among children without any prior knowledge of a language and
which increased in complexity in the hands of younger children (Boeckx,
2010<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>).</p>
<p>Brain imaging also points towards sign languages being processed similar
to spoken languages. Despite their visual modality, sign languages are
processed in the left hemisphere like spoken languages, and signers with
brain damage in the left hemisphere will face linguistic difficulties
just like speakers would, while damage right hemisphere (where visual
processing tasks take place) wouldn’t impact their signing (Poizner, et
al., 1987<sup id="fnref:4"><a class="footnote-ref" href="#fn:4">4</a></sup>).</p>
<p>Those observations point towards sign languages and spoken languages
being fundamentally the same and therefore equally ‘real’.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:1">
<p>Fromkin, V., Rodman, R., & Hyams, N. (2014). <em>An introduction to
language</em>. Boston, Mass: Wadsworth, Cengage Learning. <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>Newport, Elissa L. (1990). Maturational Constraints on Language
Learning. <em>Cognitive Science, 14.</em> <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p>Boeckx, C. (2010). <em>Language in cognition: Uncovering mental
structures and the rules behind them.</em> Chichester, U.K:
Wiley-Blackwell. <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:4">
<p>Poizner, H., Klima, E. S., & Bellugi, U. (1987). <em>What the hands
reveal about the brain</em>. Cambridge, Mass: MIT Press. <a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>The senses of Cypriot Greek 'μάχουμαι': Initial Thoughts2017-03-29T09:46:39+00:002017-03-29T09:46:39+00:00dkrtag:log.dkarayiannis.eu,2017-03-29:/a/the-senses-of-cypriot-greek-makhoumai-initial-thoughts.html<p>I’m noting this down so I can revisit it when I have time to research this.</p>
<p>In Cypriot Greek, the verb <em><abbr title="/'maxume/, citation form (1st Person Singular, Present Indicative)">μάχουμαι</abbr></em> has at least the following meanings: </p>
<ul>
<li>to put effort into doing something</li>
</ul>
<p>Example: <code>/'maxume na a'kuso 'tambu la'li/</code> (I’m trying to hear what he/she is saying - adapted from <a href="https://www.cyslang.com/dictionary/%CF%83%CE%B1%CF%84%CF%83%CE%AF%CE%BD">here</a>). </p>
<ul>
<li>to annoy, to annoyingly demand</li>
</ul>
<p>Example: <code>/'panda 'maxume su na 'ertis/</code> (I’m always asking you to come - from <a href="http://drprasinada.blogspot.com.cy/2012/08/12-2001.html?showComment=1344769916937#c8027832544161361042">here</a>.
“Stop bothering me” is <code>/'men mu 'maʃese/</code>.</p>
<hr>
<p>What about the following use though? </p>
<blockquote>
<p>A: <code>/'eteʎoses tin erɣasian su/</code>? (Have you finished your essay yet?)</p>
<p>B: <code>/'maxume/</code> (I’m working on it)</p>
</blockquote>
<p>That is clearly not the second meaning, the second meaning requires a recipient (usually a living thing, not exclusively though). It’s very similar to the first meaning, but it also feels a bit different: Meaning 1 takes a subjunctive verb as complement, and this use doesn’t. Also, Meaning 1 emphasises the effort required to complete that task. This use emphasises the ongoing aspect.</p>
<p>I could find one <a href="https://twitter.com/proudcypriot/status/268713694375051266">spontaneous metalinguistic comment online</a>:</p>
<blockquote>
<p>A: If you had a Cypriot/Greek version of this, it would be awesome!</p>
<p>B: <code>/'maxume/</code>, the so-called <em>work in progress</em></p>
</blockquote>
<p>This person glosses <code>/'maxume/</code> as “work in progress”. </p>Cyprus Undergrad Ling Conference - Call for submissions2017-03-08T23:50:24+00:002017-03-08T23:50:24+00:00dkrtag:log.dkarayiannis.eu,2017-03-08:/a/cyprus-undergrad-ling-conference-call-for-submissions.html<p>The 1st Cyprus Undergraduate Linguistics Conference is one of the projects I’m involved at the moment. </p>
<p>We just published our <a href="https://culc.ucy.ac.cy/p/call-for-papers.html">call for papers</a>. This is an one-day conference taking place this April (26th) at the University of Cyprus, completely open to the public. If you have an undergraduate-level research in Linguistics, you are invited to submit your abstract before the end of March. </p>
<p>I will post another blogpost when there is a tentative schedule. </p>Back online!2017-03-05T23:29:21+00:002017-03-05T23:29:21+00:00dkrtag:log.dkarayiannis.eu,2017-03-05:/a/back-online.html<p>After a week or so of downtime, my site is back online. It was a stupid mistake that caused it, but because of work I didn’t have the time to setup the VPS again until now. </p>
<p>Drop me an email if anything looks broken. </p>Thank you for making computing in freedom possible! (I love Free Software Day)2017-02-12T09:02:09+00:002017-02-12T09:02:09+00:00dkrtag:log.dkarayiannis.eu,2017-02-12:/a/thank-you-for-making-computing-in-freedom-possible-i-love-free-software-day.html<p>In less than two days, on February 14th, it’s I Love FS Day, <a href="https://fsfe.org/campaigns/ilovefs/index.en.html">a campaign started by the FSFE</a>. This day is an opportunity to thank everyone who contributes in software projects that make it possible to compute in freedom. Our free operating systems and the applications we use on top of those, come from countless different groups and individuals designing, coding, testing, documenting, and maintaining the Software Commons. It’s easy to lose track of the human effort behind the free software we rely on. </p>
<p>The list of free software contributors I’m grateful to is endless, ranging from massive projects like GNU and OpenBSD to individual developers of special-use utilities, but for this I Love FS Day I want to especially thank the people who keep everything together: the package maintainers, the documentation writers, and the community managers. Our ecosystem wouldn’t succeed in its goals without its dedicated caregivers.</p>
<p>Thank you for contributing to free software, and especially thank you for maintaining a package, writing documentation, or making a software community safe and successful. </p>Life in a TTY2017-01-28T00:00:00+00:002017-05-30T11:23:33+00:00dkrtag:log.dkarayiannis.eu,2017-01-28:/a/life-in-a-tty.html<p>I make no secret of my appreciation of text user interfaces for a lot of tasks (eg <a href="/a/why-text-mode-browsers-still-matter.html">for browsing</a> and for writing). Still, I normally use X and a Terminal <em>Emulator</em> under a graphical Desktop Environment. A lot of the other things I do with a computer are simply not practical without a mouse and some sort of a “canvas” interface. </p>
<p>Recently though, I had to send my laptop for service, and I don’t have it back yet. I still need some sort of a portable computer for my writing though, so I had to unearth my very old, very underpowered netbook from 2009. Underpowered as it is, I kept using it for a long time (mainly because of its long battery life), and only stopped because its touchpad and some keyboard keys broke. But this old machine got a second chance this month. </p>
<p>Now, if the touchpad wasn’t broken, I would probably install some sort of window manager – Openbox is the one I’m most used to. The last time I went GUI-lite I also used Openbox and a full-screen Terminal Emulator. But this time it’s straight to a virtual console, or a TTY. No X Server, no framebuffer device. How hard can it be? </p>
<p>Well, it isn’t hard. So far all the “big things” work. The problems I came across are technological limitations of the virtual console, and not lack of CLI or TUI tools. </p>
<p>So, as a review of the experience…</p>
<h2 id="software">Software</h2>
<p>A lot of the tools I already use, like tmux, elinks, and vim followed me to this TTY experience. Along the way, I discovered some new programs that really impressed me. </p>
<h3 id="tmux">Tmux</h3>
<p>This is essential. <a href="https://tmux.github.io/">Tmux</a> is a <em>terminal multiplexer</em>, which is just like a tiling window manager, but for your console. It allows you to split your console into <em>panes</em> (think of graphical windows), and it can create <em>windows</em> (think of graphical workspaces). Additionally it provides you with a status bar (think of a graphical system tray), and a clipboard mechanism that virtual consoles lack. </p>
<p>I already used tmux on my machine, especially when connecting to remote hosts, but on an X-less computer, tmux becomes your desktop environment. </p>
<p>Tmux can be extended <a href="https://github.com/tmux-plugins/tpm">by plugins</a>. </p>
<h3 id="vim">Vim</h3>
<p>I don’t know if <a href="http://www.vim.org/">Vim</a> requires any introduction. It’s a powerful text editor, it’s very resource efficient, it allows you to do complex text manipulations through intuitive shortcuts, and the Markdown highlighting it offers is very pretty. </p>
<p>I extend my Vim setup with:</p>
<ul>
<li>Spell checking</li>
</ul>
<div class="highlight"><pre><span></span><code><span class="err">let g:spellfile_URL = 'http://ftp.vim.org/vim/runtime/spell'</span>
<span class="err">nn <F7> :setlocal spell! spelllang=en_gb,el<CR></span>
</code></pre></div>
<ul>
<li><a href="http://www.vim.org/scripts/script.php?script%5Fid=1658">Filesystem tree</a></li>
</ul>
<div class="highlight"><pre><span></span><code><span class="err"> map <F10> :NERDTreeToggle<CR></span>
</code></pre></div>
<ul>
<li><a href="http://www.vim.org/scripts/script.php?script_id=4200">XSAMPA to IPA transliteration script</a></li>
</ul>
<div class="highlight"><pre><span></span><code><span class="err">let g:transliterateMode = 'xsampa'</span>
<span class="err">nn <F6> <Plug>TransliterateApply</span>
<span class="err">vmap <F6> <Plug>TransliterateApply</span>
</code></pre></div>
<h3 id="midnight-commander">Midnight Commander</h3>
<p>Again, an introduction is not necessary. <a href="http://midnight-commander.org/">MC</a> is the to-go filemanager for the terminal.</p>
<h3 id="bashmount">Bashmount</h3>
<p>That was an amazing new find for me. Without the automations of a modern GNU/Linux Desktop Environment, handling removable disks can be a bit of a headache. <a href="https://github.com/jamielinux/bashmount">Bashmount</a> makes it very easy to mount and unmount removable disks, and to my surprise, it can also mount LUKS encrypted volumes. I took advantage of this, storing my SSH and GPG keys in an encrypted partition, and symlinking them to <code>~/.ssh</code> and <code>~/.gnupg</code>. </p>
<h3 id="network-manager-cli-and-tui">Network Manager CLI and TUI</h3>
<p>NetworkManager is one of those modern desktop tools that make it easy to connect to new networks without a lot of low-level meddling. Fortunately, nm has a very easy to use terminal interface, as well as a TUI based on ncurses. The TUI is good enough for simple WEP/WPA/WPA2 networks, but for more complicated setups, like PEAP authentication, the CLI was needed. It guides you through configuring a new network though. </p>
<h2 id="review">Review</h2>
<p>My use-case for this setup is very specific. 90% of the time I am writing in <code>vim</code>, 5% of the time I am reading back from other documents, and 5% of the time I am either browsing in <code>elinks</code>, or <code>ssh</code>ing in another machine. I’m not doing anything that really requires a GUI, and I am not even doing everything that is possible under a TTY. The setup is actually covering my needs, except for one thing: <strong>proper Unicode support</strong>. </p>
<p>The virtual console has a hard limitation: its fonts (special fonts, not TrueType or OpenType) cannot contain more than 500 glyphs. As someone who works with multilingual text and special characters, this is frustrating. I can type in IPA in <code>vim</code>, but I cannot display IPA characters. I can display Latin, Greek, and Cyrillic, but CJK seems tricky, or even impossible. </p>
<p>I also miss the comforts of Compose Key and <code>ibus-tables</code>. </p>
<p>As far as I know, all those problems can be solved by switching to a <em>framebuffer</em> device. I might do that, but at that point, I might as well return to <code>X</code> + a fullscreen terminal emulator. </p>A GNU/Linux (XKB) layout for Cypriot Maronite Arabic - design2017-01-16T20:26:52+00:002017-01-16T20:26:52+00:00dkrtag:log.dkarayiannis.eu,2017-01-16:/a/a-gnulinux-xkb-layout-for-cypriot-maronite-arabic-design.html<h1 id="introduction">Introduction</h1>
<p>A keyboard for this script already exists, so I’m not creating something from scratch. It is based on the basic US English QWERTY layout, with the addition of necessary characters from Greek, and Latin letters with diacritics. It was designed by linguist <a href="http://www.ling.cam.ac.uk/spyros/">Spyros Armostis</a> in the context of the revitalisation effort of the recognised minority language <em>Sanna</em>, aka <a href="https://www.ethnologue.com/language/acy">Cypriot Maronite Arabic</a>. The language has an ISO 639-3 code of <a href="http://www-01.sil.org/iso639-3/documentation.asp?id=acy"><code>acy</code></a>, and it has a limited but growing online presence.</p>
<p>I want to implement this keyboard for use by the <a href="https://www.freedesktop.org/wiki/Software/XKeyboardConfig/">X Window System’s xkeyboard-config</a> component, making CMA available on a number of free software operating systems, including GNU/Linux. The goal is for this layout to be included upstream, and therefore become available by default.
This post contains a first proposal of how this keyboard will look like. </p>
<h1 id="keyboard-description">Keyboard description</h1>
<p>This keyboard has 4 levels (initial, Shift, AltGr,Shift-AltGr), and one dead-key (<code>´</code> <em>tonos</em>, the acute accent key from Greek). The 1st and 2nd level contain the letters needed for the standard orthography of the language, and the 3rd and 4th level contain the letters required for an alternative spelling system for the language.</p>
<p>The <em>tonos</em> key should combine with the vowels: Aa, Ee, Ii, Oo, Uu, to give Áá, Éé, Íí, Óó, Úú. Those are, logically, the precomposed acute-accented vowels from the Latin character set, and not Latin letters with the U+0384 GREEK TONOS. Using the precomposed characters will allow <em>Sanna</em> users to use existing fonts with less compatibility problems. <em>tonos</em> in Greek also returns precomposed Greek vowels so there’s symmetry. </p>
<h2 id="differences-between-windows-implementation-and-the-us-keyboard-layout">Differences between Windows implementation and the <code>us</code> keyboard layout</h2>
<ul>
<li><code>qQ</code> → <code>θΘ</code> (Greek <em>theta</em>) - <code>qQ</code> is removed</li>
<li><code>dD</code> → <code>δΔ</code> (Greek <em>delta</em>) - <code>dD</code> moves to 3rd-4th level </li>
<li><code>gG</code> → <code>γΓ</code> (Greek <em>gamma</em>) - <code>gG</code> moves to 3rd-4th level</li>
<li><code>;</code> → <code>´</code> (Greek <em>tonos</em> dead-key) - ; doesn’t appear in the reference implementation or the spec</li>
<li><code>xX</code> → <code>χΧ</code> (Greek <em>khi</em>) - <code>xX</code> moves to 3rd-4th level</li>
</ul>
<h2 id="additions-by-the-windows-implementation-to-the-us-keyboard-layout">Additions by the Windows implementation to the <code>us</code> keyboard layout</h2>
<ul>
<li>The letters <code>şŞ</code> are added as the 3rd-4th levels of <code>s</code>.</li>
<li>The letters <code>ġĠ</code> are added as the 3rd-4th levels of <code>h</code>. According to the spec <code>ġĠ</code> are also obtained by <em>tonos</em>+<code>γΓ</code>.</li>
<li>The letters <code>žŽ</code> are added as the 3rd-4th levels of <code>j</code>.</li>
<li>The letters <code>ċĊ</code> are added as the 3rd-4th levels of <code>c</code>. According to the spec <code>ċĊ</code> are also obtained by <em>tonos</em>+<code>cC</code>, and instead the 3rd and 4th level offers ʿ U+02BF MODIFIER LETTER LEFT HALF RING.</li>
</ul>
<h2 id="differences-between-specification-and-the-actual-reference-implementation">Differences between specification and the actual reference implementation</h2>
<ul>
<li>The reference implementation has <code>d</code> in the 3rd level of <code>δ</code> but <code>D</code> in the 4th level of <code>e</code>. This is obviously unintentional</li>
<li>The capital variant <code>Ŭ</code> doesn’t appear in the Windows implementation. This is obviously unintentional</li>
</ul>
<h2 id="differences-of-the-cma-xkeyboard-proposal-vs-the-windows-implementation">Differences of the cma-xkeyboard proposal vs the Windows implementation</h2>
<ul>
<li>I restore <code>;</code> in the 3rd level of <code>´</code> for ASCII-completeness and to allow users to be able to fully use a computer without needing a secondary QWERTY layout enabled (eg for typing URLs or passwords)</li>
<li>I restore <code>qQ</code> as the 3rd and 4th level of <code>θ</code> for the same reasons</li>
<li>I add the capital <code>Ŭ</code> as the 4th level of <code>u</code>, as it was intended</li>
<li>I move <code>žŽ</code> to the 3rd-4th level of <code>zZ</code> to improve ergonomics</li>
<li>I add the Euro sign as the 3rd level of <code>e</code>. The Euro is one of the currencies users of <em>Sanna</em> use. This is the canonical position in the Greek-US QWERTY</li>
<li>I add the Turkish Lira sign as the 3rd level of <code>t</code>. The Turkish Lira is the other currency users of <em>Sanna</em> use. This is the canonical position in Turkish-Q</li>
<li>I add <code>ʿ</code> as the 3rd level of <code>'</code> so that <code>cC</code> doesn’t need a 5th level</li>
<li>I add, following a suggestion by the original developer of the layout, the Greek <em>ano telia</em> <code>·</code> (U+00B7 MIDDLE DOT) as the 3rd level of Greek <em>telia</em> <code>.</code></li>
</ul>
<p>This makes <code>cma-xkeyboard</code> look as follows:</p>
<div class="highlight"><pre><span></span><code><span class="err">┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━━━┓</span>
<span class="err">│ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + ┃Backspace ┃</span>
<span class="err">│ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = ┃ ┃</span>
<span class="err">┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━━━┫</span>
<span class="err">┃ ┃ Θ q │ W │ Ε │ R │ T │ Y │ U Ŭ │ I │ O │ P │ { │ } ┃Enter ┃</span>
<span class="err">┃Tab ┃ θ Q │ w │ e € │ r │ t ₺ │ y │ u ŭ │ i │ o │ p │ [ │ ] ┃ ┃</span>
<span class="err">┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃</span>
<span class="err">┃Caps ┃ A │ S Ş │ Δ D │ F │ Γ G │ H Ġ │ J │ K │ L │ : │ " │ | ┃ ┃</span>
<span class="err">┃Lock ┃ a │ s ş │ δ d │ f │ γ g │ h ġ │ j │ k │ l │ ´ ; │ ' ʿ │ \ ┃ ┃</span>
<span class="err">┣━━━━━━━━┻━━━━┱┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━━━┫</span>
<span class="err">┃ ┃ Z Ž │ Χ X │ C Ċ │ V │ B │ N │ M │ < │ > · │ ? ┃ ┃</span>
<span class="err">┃Shift ┃ z ž │ χ x │ c ċ │ v │ b │ n │ m │ , │ . · │ / ┃Shift ┃</span>
<span class="err">┣━━━━━━━┳━━━━━┻━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴──┲━━┷━━━━┳┷━━━━━┻┳━━━━━━━┳━━━━━━┫</span>
<span class="err">┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃</span>
<span class="err">┃Ctrl ┃Meta ┃Alt ┃ Space ┃AltGr ┃Meta ┃Menu ┃Ctrl ┃</span>
<span class="err">┗━━━━━━━┻━━━━━━━┻━━━━━━━┹──────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━┛</span>
</code></pre></div>
<p><a href="/media/cma-xkeyboard-layout.svg"><strong>Click here for a vector image version of the layout</strong></a></p>
<p>Keymap explanation:</p>
<ul>
<li>Bottom Left: initial (1st level)</li>
<li>Top Left: Shift (2nd level)</li>
<li>Bottom Right: AltGr (3rd level)</li>
<li>Top Right: Shift-AltGr (4th level) </li>
</ul>
<h2 id="some-concerns">Some concerns</h2>
<ul>
<li><code>ġĠ</code> are only marginally ergonomic. I have no alternative suggestion, other than the <em>tonos</em> dead-key the spec describes</li>
<li>For all its practicality, <em>tonos</em> dead-key with consonants such as <code>ġĠ</code> is inconsistent, its primary use being to modify vowels</li>
</ul>
<p>I have one working implementation of cma-xkeyboard, but I’m working to make it acceptable for inclusion in the upstream project.
I am also considering an ibus-tables implementation, but I haven’t studied how <a href="https://github.com/ibus/ibus">ibus</a> works yet.</p>
<hr>
<p><em>Post updated once to fix typesetting.</em></p>Syntactic Trees for Markdown - Part 1 (identifying the problem)2016-10-28T13:08:27+00:002016-10-28T13:08:27+00:00dkrtag:log.dkarayiannis.eu,2016-10-28:/a/syntactic-trees-for-markdown-part-1-identifying-the-problem.html<p>As a linguistics student with a special interest in syntactic theory, I have to draw a lot of syntactic trees, and often I have to draw them while taking notes on my laptop. I have to say it’s not easy. If I am taking notes in Markdown, which is a very lightweight and speed-efficient markup language, then I don’t have any sort of drawing functionality available. When I try to keep notes in the Swiss-army knife that is LaTeX, I have access to <code>tikz-qtree</code>, a powerful syntax-tree drawing macro. Powerful, and arcane. It’s syntax is hard enough to read/write even without the pressure of time, let alone when you are trying to follow a lecture. </p>
<p>To cut a long rant short, I decided that I need to find a solution to this problem that is in the spirit of Markdown, that is a kind of markup that is speed-efficient, and which looks natural and human-readable even when it’s not converted into a document like HTML+CSS, OpenDocument Text, or a PDF. That’s the goal now. Next, the tools in my disposal: </p>
<ul>
<li>Pandoc Markdown</li>
<li>Python Markdown with standard extensions</li>
<li>Python’s Natural Language Toolkit (NLTK)</li>
<li>LaTeX with <code>tikz-qtree</code></li>
<li><code>phpSyntaxTree</code></li>
</ul>
<p>So, the solution I see is an extension to either Pandoc’s or Python’s Markdown flavour (both implementations support extensions), that takes some easy-to-write, easy-to-understand syntax and unambiguously converts it to the syntax used either by Python NLTK, <code>tikz-qtree</code>, or <code>phpSyntaxTree</code> to draw trees. At “compile” time (eg Markdown to HTML) this syntax is then passed to the relevant program (eg to NLTK), and the generated tree is saved as an image (preferably as an SVG file), and is embedded in the resulting document. </p>
<p>So my first task is to think of a Markdown-like syntax for syntactic tree generation. I already ruled out anything that uses recursive brackets like <code>tikz-qtree</code> and the slightly more readable <code>phpSyntaxTree</code>: </p>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">XP [ZP</span><span class="o">][</span><span class="n">X' [X [tree</span><span class="o">]</span><span class="err">]</span><span class="o">[</span><span class="n">YP</span><span class="o">]</span><span class="err">]]</span><span class="w"></span>
</code></pre></div>
<p>I am thinking of something more like rewrite rules, perhaps fenced in a special kind of code-block: </p>
<div class="highlight"><pre><span></span><code><span class="err">~~~xbar</span>
<span class="err">XP > ZP; X'</span>
<span class="err">X' > X; YP</span>
<span class="err">X > 'tree'</span>
<span class="err">~~~</span>
</code></pre></div>
<p>Resulting in an SVG code like: </p>
<p><svg width="107" height="164" version="1.1" xmlns="http://www.w3.org/2000/svg">
<text style="fill: blue; font-size: 12px;" x="48" y="22">XP</text>
<text style="fill: red; font-size: 12px;" x="15" y="66">ZP</text>
<line style="stroke:rgb(0,0,0);stroke-width:1;" x1="20" y1="49" x2="53" y2="27" />
<text style="fill: blue; font-size: 12px;" x="64" y="66">X’</text>
<line style="stroke:rgb(0,0,0);stroke-width:1;" x1="68" y1="49" x2="53" y2="27" />
<text style="fill: blue; font-size: 12px;" x="49" y="110">X</text>
<line style="stroke:rgb(0,0,0);stroke-width:1;" x1="53" y1="93" x2="68" y2="71" />
<text style="fill: red; font-size: 12px;" x="80" y="110">YP</text>
<line style="stroke:rgb(0,0,0);stroke-width:1;" x1="86" y1="93" x2="68" y2="71" />
<text style="fill: red; font-size: 12px;" x="46" y="154">tree</text>
<line style="stroke:rgb(0,0,0);stroke-width:1;" x1="53" y1="137" x2="53" y2="115" />
</svg></p>
<div class="highlight"><pre><span></span><code><span class="nt"><svg</span> <span class="na">width=</span><span class="s">"107"</span> <span class="na">height=</span><span class="s">"164"</span> <span class="na">version=</span><span class="s">"1.1"</span> <span class="na">xmlns=</span><span class="s">"http://www.w3.org/2000/svg"</span><span class="nt">></span>
<span class="nt"><text</span> <span class="na">style=</span><span class="s">"fill: blue; font-size: 12px;"</span> <span class="na">x=</span><span class="s">"48"</span> <span class="na">y=</span><span class="s">"22"</span><span class="nt">></span>XP<span class="nt"></text></span>
<span class="nt"><text</span> <span class="na">style=</span><span class="s">"fill: red; font-size: 12px;"</span> <span class="na">x=</span><span class="s">"15"</span> <span class="na">y=</span><span class="s">"66"</span><span class="nt">></span>ZP<span class="nt"></text></span>
<span class="nt"><line</span> <span class="na">style=</span><span class="s">"stroke:rgb(0,0,0);stroke-width:1;"</span> <span class="na">x1=</span><span class="s">"20"</span> <span class="na">y1=</span><span class="s">"49"</span> <span class="na">x2=</span><span class="s">"53"</span> <span class="na">y2=</span><span class="s">"27"</span> <span class="nt">/></span>
<span class="nt"><text</span> <span class="na">style=</span><span class="s">"fill: blue; font-size: 12px;"</span> <span class="na">x=</span><span class="s">"64"</span> <span class="na">y=</span><span class="s">"66"</span><span class="nt">></span>X'<span class="nt"></text></span>
<span class="nt"><line</span> <span class="na">style=</span><span class="s">"stroke:rgb(0,0,0);stroke-width:1;"</span> <span class="na">x1=</span><span class="s">"68"</span> <span class="na">y1=</span><span class="s">"49"</span> <span class="na">x2=</span><span class="s">"53"</span> <span class="na">y2=</span><span class="s">"27"</span> <span class="nt">/></span>
<span class="nt"><text</span> <span class="na">style=</span><span class="s">"fill: blue; font-size: 12px;"</span> <span class="na">x=</span><span class="s">"49"</span> <span class="na">y=</span><span class="s">"110"</span><span class="nt">></span>X<span class="nt"></text></span>
<span class="nt"><line</span> <span class="na">style=</span><span class="s">"stroke:rgb(0,0,0);stroke-width:1;"</span> <span class="na">x1=</span><span class="s">"53"</span> <span class="na">y1=</span><span class="s">"93"</span> <span class="na">x2=</span><span class="s">"68"</span> <span class="na">y2=</span><span class="s">"71"</span> <span class="nt">/></span>
<span class="nt"><text</span> <span class="na">style=</span><span class="s">"fill: red; font-size: 12px;"</span> <span class="na">x=</span><span class="s">"80"</span> <span class="na">y=</span><span class="s">"110"</span><span class="nt">></span>YP<span class="nt"></text></span>
<span class="nt"><line</span> <span class="na">style=</span><span class="s">"stroke:rgb(0,0,0);stroke-width:1;"</span> <span class="na">x1=</span><span class="s">"86"</span> <span class="na">y1=</span><span class="s">"93"</span> <span class="na">x2=</span><span class="s">"68"</span> <span class="na">y2=</span><span class="s">"71"</span> <span class="nt">/></span>
<span class="nt"><text</span> <span class="na">style=</span><span class="s">"fill: red; font-size: 12px;"</span> <span class="na">x=</span><span class="s">"46"</span> <span class="na">y=</span><span class="s">"154"</span><span class="nt">></span>tree<span class="nt"></text></span>
<span class="nt"><line</span> <span class="na">style=</span><span class="s">"stroke:rgb(0,0,0);stroke-width:1;"</span> <span class="na">x1=</span><span class="s">"53"</span> <span class="na">y1=</span><span class="s">"137"</span> <span class="na">x2=</span><span class="s">"53"</span> <span class="na">y2=</span><span class="s">"115"</span> <span class="nt">/></span>
<span class="nt"></svg></span>
</code></pre></div>
<p>This SVG code was generated by <code>phpSyntaxTree</code>.</p>
<p>In any case, that’s literally the easiet tree to both draw and read, it’s just the X-bar schema. I should try and see how readable it becomes with real sentences. And then I have to worry about movement. There’s a lot of rewriting ahead. </p>
<p>To be continued. </p>